diff --git a/.gitattributes b/.gitattributes index b3ebfcb8b..e98a36777 100644 --- a/.gitattributes +++ b/.gitattributes @@ -3,3 +3,7 @@ *.command text eol=lf *.ps1 text eol=crlf *.bat text eol=crlf + +# Preserve the byte-exact third-party notice in source and generated delivery trees. +frontends/desktop/public/THIRD_PARTY_NOTICES.txt text eol=lf +frontends/desktop/dist/THIRD_PARTY_NOTICES.txt text eol=lf diff --git a/.github/workflows/desktop-ci.yml b/.github/workflows/desktop-ci.yml new file mode 100644 index 000000000..9706d3f4a --- /dev/null +++ b/.github/workflows/desktop-ci.yml @@ -0,0 +1,168 @@ +name: Desktop 2.0 Quality Gates + +on: + push: + branches: [main] + paths: + - "agentmain.py" + - "llmcore.py" + - "llmcore/**" + - "frontends/conductor.py" + - "frontends/cost_tracker.py" + - "frontends/data_backup.py" + - "frontends/desktop_bridge.py" + - "frontends/desktop_settings.py" + - "frontends/ga_contract_probe.py" + - "frontends/tests/**" + - "frontends/desktop/**" + - ".gitattributes" + - ".github/workflows/desktop-ci.yml" + - ".github/workflows/desktop-release-package.yml" + pull_request: + branches: [main] + paths: + - "agentmain.py" + - "llmcore.py" + - "llmcore/**" + - "frontends/conductor.py" + - "frontends/cost_tracker.py" + - "frontends/data_backup.py" + - "frontends/desktop_bridge.py" + - "frontends/desktop_settings.py" + - "frontends/ga_contract_probe.py" + - "frontends/tests/**" + - "frontends/desktop/**" + - ".gitattributes" + - ".github/workflows/desktop-ci.yml" + - ".github/workflows/desktop-release-package.yml" + workflow_dispatch: + +concurrency: + group: desktop-v2-${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} + cancel-in-progress: true + +permissions: + contents: read + +env: + PYTHONUNBUFFERED: "1" + CARGO_TERM_COLOR: always + +jobs: + distribution-contract: + name: Compiled distribution contract + runs-on: ubuntu-24.04 + timeout-minutes: 10 + steps: + - uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1 + - uses: actions/setup-node@a0853c24544627f65ddf259abe73b1d18a591444 # v5.0.0 + with: + node-version: 22 + - name: Verify tracked React distribution and package metadata + working-directory: frontends/desktop + run: npm run test:dist + - name: Verify packaging helper syntax + run: | + bash -n frontends/desktop/packaging/scripts/macos/install_macos.sh + bash -n frontends/desktop/scripts/post-dmg.sh + python3 -m py_compile frontends/desktop/scripts/gen_ds_store.py + - name: Reject source and local-development leakage + run: | + test -z "$(git ls-files -- \ + 'frontends/desktop/src/**' \ + 'frontends/desktop/public/**' \ + 'frontends/desktop/vite.config.*' \ + 'frontends/desktop/tsconfig*.json' \ + '.agents/**' '.codex/**' '.trellis/**')" + test -z "$(find frontends/desktop/dist -type f \ + \( -name '*.map' -o -name '*.ts' -o -name '*.tsx' -o -name '*.jsx' \) -print)" + ! git grep -nE '^(<<<<<<<|=======|>>>>>>>)' -- .github frontends + + python-contracts: + name: Python ${{ matrix.python-version }} + needs: distribution-contract + runs-on: ubuntu-24.04 + timeout-minutes: 15 + strategy: + fail-fast: false + matrix: + python-version: ["3.10", "3.11", "3.12", "3.13"] + steps: + - uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1 + - uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0 + with: + python-version: ${{ matrix.python-version }} + cache: pip + cache-dependency-path: frontends/tests/requirements.txt + - name: Install Desktop test dependencies + run: python -m pip install -r frontends/tests/requirements.txt + - name: Run bridge, conductor, cost and backup contracts + run: >- + python -m pytest frontends/tests -q + --ignore=frontends/tests/test_release_qualification.py + - name: Run release qualification tooling contracts + if: matrix.python-version == '3.12' + run: python -m pytest frontends/tests/test_release_qualification.py -q + + rust-contracts: + name: Rust ${{ matrix.feature.name }} + needs: distribution-contract + runs-on: ubuntu-24.04 + timeout-minutes: 35 + strategy: + fail-fast: false + matrix: + feature: + - name: production + args: "" + - name: e2e + args: "--features e2e" + steps: + - uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1 + - name: Install Tauri system dependencies + run: >- + sudo apt-get update && sudo apt-get install -y + libwebkit2gtk-4.1-dev libappindicator3-dev librsvg2-dev patchelf + - uses: dtolnay/rust-toolchain@4360b52568e2003a75bf9bc1d59f33a8e3fc893c # stable action snapshot + with: + toolchain: "1.95.0" + components: clippy, rustfmt + - uses: Swatinem/rust-cache@63fed3e2fecf6f7b51dc6f043341b79ef82a9ae7 # v2.9.2 + with: + workspaces: frontends/desktop/src-tauri -> target + - name: Verify Rust formatting + run: cargo fmt --manifest-path frontends/desktop/src-tauri/Cargo.toml --check + - name: Lint Tauri shell + run: cargo clippy --manifest-path frontends/desktop/src-tauri/Cargo.toml --all-targets ${{ matrix.feature.args }} -- -D warnings + - name: Run Tauri shell contracts + run: cargo test --manifest-path frontends/desktop/src-tauri/Cargo.toml ${{ matrix.feature.args }} + + linux-tauri-build: + name: Linux Tauri build smoke + needs: [distribution-contract, python-contracts, rust-contracts] + runs-on: ubuntu-24.04 + timeout-minutes: 45 + steps: + - uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1 + - name: Install Tauri system dependencies + run: >- + sudo apt-get update && sudo apt-get install -y + libwebkit2gtk-4.1-dev libappindicator3-dev librsvg2-dev patchelf + - uses: actions/setup-node@a0853c24544627f65ddf259abe73b1d18a591444 # v5.0.0 + with: + node-version: 22 + - uses: dtolnay/rust-toolchain@4360b52568e2003a75bf9bc1d59f33a8e3fc893c # stable action snapshot + with: + toolchain: "1.95.0" + - uses: Swatinem/rust-cache@63fed3e2fecf6f7b51dc6f043341b79ef82a9ae7 # v2.9.2 + with: + workspaces: frontends/desktop/src-tauri -> target + - name: Install Tauri CLI only + working-directory: frontends/desktop + run: | + npm install --package-lock=false + node -e "const v=require('./node_modules/@tauri-apps/cli/package.json').version; if(v!=='2.11.4') throw new Error('unexpected Tauri CLI '+v)" + test ! -e package-lock.json + - name: Build tracked Desktop 2.0 distribution into the native shell + working-directory: frontends/desktop + run: npm run tauri build -- --no-bundle diff --git a/.github/workflows/desktop-release-package.yml b/.github/workflows/desktop-release-package.yml index 4c320ddb1..90dfdbe49 100644 --- a/.github/workflows/desktop-release-package.yml +++ b/.github/workflows/desktop-release-package.yml @@ -23,34 +23,55 @@ name: Build Desktop Portable Packages - "macos" permissions: - contents: write + contents: read + +env: + NODE_VERSION: "22.23.2" + RUST_TOOLCHAIN: "1.95.0" + PBS_RELEASE: "20260814" + PBS_PYTHON_VERSION: "3.12.14" + MACOS_PACKAGING_PYTHON_VERSION: "3.12.10" + PYTHONDONTWRITEBYTECODE: "1" jobs: # ---------------------------------------------------------------------------- build-windows: name: Windows portable - if: ${{ startsWith(github.ref, 'refs/tags/') || github.event.inputs.target == 'all' || github.event.inputs.target == 'windows' }} - runs-on: windows-latest + if: ${{ (github.event_name == 'push' && startsWith(github.ref, 'refs/tags/desktop-portable-')) || (github.event_name == 'workflow_dispatch' && (github.event.inputs.target == 'all' || github.event.inputs.target == 'windows')) }} + runs-on: windows-2025 + permissions: + contents: read steps: - name: Checkout repository - uses: actions/checkout@v5 + uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1 + with: + persist-credentials: false - name: Set up Node.js - uses: actions/setup-node@v5 + uses: actions/setup-node@a0853c24544627f65ddf259abe73b1d18a591444 # v5.0.0 with: - node-version: 20 + node-version: ${{ env.NODE_VERSION }} - name: Set up Rust - uses: dtolnay/rust-toolchain@stable + uses: dtolnay/rust-toolchain@4360b52568e2003a75bf9bc1d59f33a8e3fc893c # stable action snapshot + with: + toolchain: ${{ env.RUST_TOOLCHAIN }} - name: Cache Rust build - uses: Swatinem/rust-cache@v2 + uses: Swatinem/rust-cache@63fed3e2fecf6f7b51dc6f043341b79ef82a9ae7 # v2.9.2 with: workspaces: frontends/desktop/src-tauri -> target - name: Install desktop dependencies working-directory: frontends/desktop - run: npm install + run: | + npm install --package-lock=false + node -e "const v=require('./node_modules/@tauri-apps/cli/package.json').version; if(v!=='2.11.4') throw new Error('unexpected Tauri CLI '+v)" + test ! -e package-lock.json + + - name: Verify tracked compiled renderer bytes + working-directory: frontends/desktop + run: npm run test:dist - name: Build Windows desktop exe working-directory: frontends/desktop @@ -58,11 +79,23 @@ jobs: - name: Assemble self-contained portable bundle shell: bash - env: - GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} run: | set -euo pipefail + purge_runtime_bytecode() { + local runtime_root="$1" + find "$runtime_root" -type d -name '__pycache__' -prune -exec rm -rf {} + + find "$runtime_root" -type f \( -name '*.pyc' -o -name '*.pyo' \) -delete + if find "$runtime_root" -type d -name '__pycache__' -print -quit | grep -q .; then + echo "Python bytecode cache directory remains in packaged runtime: $runtime_root" >&2 + return 1 + fi + if find "$runtime_root" -type f \( -name '*.pyc' -o -name '*.pyo' \) -print -quit | grep -q .; then + echo "Python bytecode remains in packaged runtime: $runtime_root" >&2 + return 1 + fi + } + EXE_SRC="$(find frontends/desktop/src-tauri/target/release -maxdepth 1 -type f -name 'ga-desktop.exe' | head -n 1)" [[ -n "$EXE_SRC" ]] || { echo "ga-desktop.exe not found" >&2; exit 1; } @@ -73,22 +106,24 @@ jobs: # exe at the top level, named GenericAgent (typical portable form) cp "$EXE_SRC" "$PKG/GenericAgent.exe" cp frontends/desktop/packaging/scripts/windows/install_windows.ps1 "$RUNTIME/install_windows.ps1" + cp frontends/desktop/packaging/scripts/merge_desktop_settings.py "$RUNTIME/merge_desktop_settings.py" # Uninstaller: double-click entry at top level, worker script under runtime/. cp frontends/desktop/packaging/scripts/windows/uninstall.bat "$PKG/uninstall.bat" cp frontends/desktop/packaging/scripts/windows/uninstall_windows.ps1 "$RUNTIME/uninstall_windows.ps1" - # Embedded Python (python-build-standalone, windows x86_64, 3.12 install_only). - # browser_download_url is URL-encoded ('+' -> '%2B'); match loosely with '.*'. - PBS_URL="$(curl -fsSL -H "Authorization: Bearer $GH_TOKEN" https://api.github.com/repos/astral-sh/python-build-standalone/releases/latest \ - | grep -o '"browser_download_url": *"[^"]*"' \ - | grep 'cpython-3\.12\.[0-9].*x86_64-pc-windows-msvc-install_only\.tar\.gz' \ - | head -1 | sed -E 's/.*"(https[^"]+)"/\1/')" - [[ -n "$PBS_URL" ]] || { echo "Could not resolve python-build-standalone download URL" >&2; exit 1; } + # Fixed python-build-standalone Windows x86_64 archive. + PBS_URL="https://github.com/astral-sh/python-build-standalone/releases/download/${PBS_RELEASE}/cpython-${PBS_PYTHON_VERSION}%2B${PBS_RELEASE}-x86_64-pc-windows-msvc-install_only.tar.gz" + PBS_SHA256="7330282b47cd43a66b702d39078d2e5a88e580cee351d82f95045f21f5ee042a" + command -v cygpath >/dev/null 2>&1 || { echo "cygpath not found on Windows runner" >&2; exit 1; } + RUNNER_TEMP_POSIX="$(cygpath -u "$RUNNER_TEMP")" + [[ "$RUNNER_TEMP_POSIX" == /* ]] || { echo "cygpath did not return an absolute POSIX path" >&2; exit 1; } + PBS_ARCHIVE="${RUNNER_TEMP_POSIX}/pbs-windows-x86_64.tar.gz" echo "Python build-standalone: $PBS_URL" - curl -fsSL -o /tmp/pbs.tar.gz "$PBS_URL" - tar -xzf /tmp/pbs.tar.gz -C "$RUNTIME" # extracts a 'python/' dir (python.exe at top) + curl --proto '=https' --tlsv1.2 --fail --location --retry 3 --output "$PBS_ARCHIVE" "$PBS_URL" + printf '%s %s\n' "$PBS_SHA256" "$PBS_ARCHIVE" | sha256sum --check --strict - + tar -xzf "$PBS_ARCHIVE" -C "$RUNTIME" # extracts a 'python/' dir (python.exe at top) PY="$RUNTIME/python/python.exe" - "$PY" --version + PYTHONDONTWRITEBYTECODE=1 "$PY" -c 'import platform, sys; assert sys.version_info[:3] == (3, 12, 14); assert platform.machine().lower() in ("amd64", "x86_64"); print(sys.version)' # App-local UCRT: python-build-standalone links the Universal CRT dynamically # and does NOT bundle it. Win10/11 ship UCRT in-box, but stripped/older images @@ -104,18 +139,36 @@ jobs: test -f "$RUNTIME/python/api-ms-win-crt-runtime-l1-1-0.dll" \ || { echo "UCRT DLLs missing after copy" >&2; exit 1; } - # Offline wheels (native win_amd64 wheels for the embedded python) + # Offline binary-only wheels. requirements.txt pins direct and transitive versions. mkdir -p "$RUNTIME/wheels" - "$PY" -m pip download --dest "$RUNTIME/wheels" \ - "requests>=2.28" "beautifulsoup4>=4.12" "bottle>=0.12" "simple-websocket-server>=0.4" "aiohttp>=3.9" psutil \ - fastapi uvicorn websockets pydantic setuptools wheel + cp frontends/desktop/packaging/python-runtime-requirements.txt "$RUNTIME/wheels/requirements.txt" + PYTHONDONTWRITEBYTECODE=1 "$PY" -m pip download --only-binary=:all: --dest "$RUNTIME/wheels" \ + --requirement "$RUNTIME/wheels/requirements.txt" # Runtime source (project root minus heavy/dev/build dirs) mkdir -p "$RUNTIME/app" tar \ --exclude='./.git' --exclude='./.github' \ + --exclude='./frontends/tests' \ --exclude='./frontends/desktop/src-tauri' \ + --exclude='./frontends/desktop/src' \ + --exclude='./frontends/desktop/public' \ + --exclude='./frontends/desktop/scripts' \ + --exclude='./frontends/desktop/release_qualification' \ + --exclude='./frontends/desktop/tests' \ + --exclude='./frontends/desktop/testing' \ + --exclude='./frontends/desktop/spec' \ --exclude='./frontends/desktop/node_modules' \ + --exclude='./frontends/desktop/dist' \ + --exclude='./frontends/desktop/DESIGN.md' \ + --exclude='./frontends/desktop/package.json' \ + --exclude='./frontends/desktop/package-lock.json' \ + --exclude='./frontends/desktop/.npmrc' \ + --exclude='./frontends/desktop/index.html' \ + --exclude='./frontends/desktop/loading.html' \ + --exclude='./frontends/desktop/setup.html' \ + --exclude='./frontends/desktop/tsconfig*.json' \ + --exclude='./frontends/desktop/vite.config.ts' \ --exclude='./frontends/desktop/packaging' --exclude='./docs' \ --exclude='./assets/demo' --exclude='./assets/images' \ --exclude='./assets/GenericAgent_Technical_Report.pdf' \ @@ -127,9 +180,15 @@ jobs: test -f "$RUNTIME/app/agentmain.py" test -f "$RUNTIME/app/frontends/desktop_bridge.py" test -f "$RUNTIME/app/frontends/desktop/static/index.html" + test ! -e "$RUNTIME/app/frontends/desktop/dist" + test ! -e "$RUNTIME/app/frontends/desktop/src" + test ! -e "$RUNTIME/app/frontends/desktop/public" + test ! -e "$RUNTIME/app/frontends/desktop/package-lock.json" + test ! -e "$RUNTIME/app/frontends/desktop/node_modules" # Drop python debug symbols (.pdb) to slim the package (~80MB) find "$RUNTIME/python" -name '*.pdb' -delete 2>/dev/null || true + purge_runtime_bytecode "$RUNTIME" cat > "$PKG/readme.txt" <<'EOF' ================ 中文 ================ @@ -144,13 +203,14 @@ jobs: 使用 1. 解压到任意目录(路径建议不含特殊字符)。 2. 双击 GenericAgent.exe。 - 3. 首次启动会自动离线准备运行环境(建虚拟环境、装依赖),界面显示进度,完成后进入主界面。 + 3. 首次启动会离线校验并补齐随包 Python 运行时依赖,界面显示进度,完成后进入主界面。 4. 之后启动直接秒进。 说明 - 想真正对话,仍需在程序里配置模型 / API Key。 - 如果 Windows Defender 防火墙拦截 `127.0.0.1` / `localhost` 回环连接,程序可能无法启动或连接本机服务。请允许 `GenericAgent.exe` 和 `runtime\python\python.exe` 通过防火墙,然后重启桌面端。 - - 首次准备完成后不要移动本文件夹;若已移动,删除 runtime\app\.venv 后重新启动即可重建。 + - 本便携版尚未使用 Windows 代码签名证书;SmartScreen 可能显示警告。运行前请用随包发布的 SHA256SUMS-windows.txt 核对 ZIP。 + - 可整体移动本文件夹;重启后会自动刷新路径。若需强制重新准备,请删除 runtime\.prepared 后重启。 - runtime\ 是内置运行环境与源码,正常使用无需改动。 ================ English ================ @@ -165,14 +225,16 @@ jobs: Usage 1. Extract anywhere (a path without special characters is recommended). 2. Double-click GenericAgent.exe. - 3. The first launch prepares the runtime offline (creates a venv, installs deps) with a + 3. The first launch verifies and completes the bundled Python runtime offline with a progress UI, then opens the main window. 4. Subsequent launches start instantly. Notes - To actually chat, configure a model / API key inside the app. - If Windows Defender Firewall blocks the `127.0.0.1` / `localhost` loopback connection, the app may fail to start or reach its local service. Allow `GenericAgent.exe` and `runtime\python\python.exe` through the firewall, then restart the desktop app. - - Do not move this folder after the first setup; if you did, delete runtime\app\.venv and relaunch to rebuild. + - This portable build is not Windows code-signed, so SmartScreen may warn. Verify the ZIP against the published SHA256SUMS-windows.txt before running it. + - You may move the whole folder; relaunching refreshes its saved paths. To force a new + preparation pass, delete runtime\.prepared and relaunch. - runtime\ holds the bundled runtime and source; no need to touch it. EOF sed -i 's/^ //' "$PKG/readme.txt" @@ -192,7 +254,7 @@ jobs: Get-ChildItem artifacts/windows/out | Format-Table Name, Length - name: Upload workflow artifact - uses: actions/upload-artifact@v7 + uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 with: name: GenericAgent-Desktop-Windows-Portable-${{ github.run_number }} path: | @@ -200,71 +262,37 @@ jobs: artifacts/windows/out/SHA256SUMS-windows.txt if-no-files-found: error - - name: Publish into unified Release (tag push only) - if: ${{ startsWith(github.ref, 'refs/tags/') }} - env: - GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} - shell: bash - run: | - set -euo pipefail - TAG_NAME="${{ github.ref_name }}" - TITLE="GenericAgent Desktop ${TAG_NAME}" - cat > "${RUNNER_TEMP:-/tmp}/ga_notes.md" <<'EOF' - GenericAgent Desktop 桌面版 / Desktop - - 无需自行安装 Python、无需联网安装依赖、无需源码;首次启动会自动准备内置运行环境。 - No separate Python install, no internet for dependencies, no source checkout required; the bundled runtime is prepared on first launch. - - ## 安装方法 / Installation - - Windows: 下载 `GenericAgent-Desktop-Windows-Portable.zip`,解压后双击 `GenericAgent.exe` 启动。卸载时先退出应用,再双击包内 `uninstall.bat`,最后删除整个解压目录。 - Download `GenericAgent-Desktop-Windows-Portable.zip`, extract it, then double-click `GenericAgent.exe`. To uninstall, quit the app, double-click `uninstall.bat`, then delete the extracted folder. - - Linux: 下载 `GenericAgent-Desktop-Linux-Portable.tar.gz`,解压后执行 `chmod +x GenericAgent.AppImage`,再运行 `./GenericAgent.AppImage`。卸载时先退出应用,再运行 `./uninstall.sh`,最后删除整个解压目录。 - Download `GenericAgent-Desktop-Linux-Portable.tar.gz`, extract it, run `chmod +x GenericAgent.AppImage`, then launch `./GenericAgent.AppImage`. To uninstall, quit the app, run `./uninstall.sh`, then delete the extracted folder. - - macOS: 下载 `GenericAgent-Desktop-macOS.dmg`,双击打开 DMG,把 `GenericAgent.app` 拖入 `Applications`,之后在“应用程序 / Applications”中启动。若出现“无法验证开发者”等提示,先双击 DMG 内的 `open_anyway.command`,再启动。卸载时先退出应用,再从 Applications 删除 `GenericAgent.app`。 - Download `GenericAgent-Desktop-macOS.dmg`, open it, drag `GenericAgent.app` to `Applications`, then launch it from Applications. If macOS says the developer cannot be verified, double-click `open_anyway.command` inside the DMG first, then launch again. To uninstall, quit the app, then delete `GenericAgent.app` from Applications. - - ## 首次启动 / First launch - 首次启动会自动离线准备运行环境(安装依赖),有进度条,完成后进入主界面;之后启动会更快。 - The first launch prepares the runtime offline (installs deps) with a progress bar, then opens the main window; later launches are faster. - - ## 说明 / Notes - - 想真正对话需在程序内配置模型 / API Key。Configure a model / API key in-app to start chatting. - - Windows Defender 防火墙可能会拦截 `127.0.0.1` / `localhost` 回环连接,导致程序无法启动或连接本机服务;请允许 `GenericAgent.exe` 和随包的 `python.exe` 通过防火墙后重启。Windows Defender Firewall may block the local loopback connection; allow `GenericAgent.exe` and the bundled `python.exe` through the firewall, then restart the app. - - Windows/Linux 为便携包,可整体移动到任意目录后继续使用。Windows/Linux packages are portable and can be moved as a whole folder. - - Windows/Linux 包内附 `readme.txt`(中英)。Windows/Linux packages include a bilingual `readme.txt`. - EOF - # Create the shared release if it does not exist yet (another OS job may win the race). - # Race-safe: the 3 OS jobs share ONE release. Retry create until the release - # actually exists (a simultaneous create from another job can fail), so the - # upload below never races a not-yet-created release. - for _ in $(seq 1 15); do - gh release view "$TAG_NAME" >/dev/null 2>&1 && break - gh release create "$TAG_NAME" --target "${{ github.sha }}" --title "$TITLE" --notes-file "${RUNNER_TEMP:-/tmp}/ga_notes.md" --prerelease 2>/dev/null || true - sleep 3 - done - gh release upload "$TAG_NAME" artifacts/windows/out/* --clobber - # ---------------------------------------------------------------------------- build-linux: name: Linux portable - if: ${{ startsWith(github.ref, 'refs/tags/') || github.event.inputs.target == 'all' || github.event.inputs.target == 'linux' }} - runs-on: ubuntu-24.04 + if: ${{ (github.event_name == 'push' && startsWith(github.ref, 'refs/tags/desktop-portable-')) || (github.event_name == 'workflow_dispatch' && (github.event.inputs.target == 'all' || github.event.inputs.target == 'linux')) }} + runs-on: ubuntu-22.04 + permissions: + contents: read steps: - name: Checkout repository - uses: actions/checkout@v5 + uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1 + with: + persist-credentials: false - name: Set up Node.js - uses: actions/setup-node@v5 + uses: actions/setup-node@a0853c24544627f65ddf259abe73b1d18a591444 # v5.0.0 with: - node-version: 20 + node-version: ${{ env.NODE_VERSION }} - name: Set up Rust - uses: dtolnay/rust-toolchain@stable + uses: dtolnay/rust-toolchain@4360b52568e2003a75bf9bc1d59f33a8e3fc893c # stable action snapshot + with: + toolchain: ${{ env.RUST_TOOLCHAIN }} - name: Cache Rust build - uses: Swatinem/rust-cache@v2 + uses: Swatinem/rust-cache@63fed3e2fecf6f7b51dc6f043341b79ef82a9ae7 # v2.9.2 with: + # Keep registry/git downloads, but never restore binaries built on a newer glibc image. + prefix-key: "v1-rust-release-ubuntu-22.04-glibc-2.35" workspaces: frontends/desktop/src-tauri -> target + cache-targets: "false" + cache-bin: "false" - name: Install Tauri Linux dependencies run: | @@ -274,11 +302,21 @@ jobs: libgtk-3-dev \ libayatana-appindicator3-dev \ librsvg2-dev \ - patchelf + patchelf \ + binutils \ + file \ + xvfb - name: Install desktop dependencies working-directory: frontends/desktop - run: npm install + run: | + npm install --package-lock=false + node -e "const v=require('./node_modules/@tauri-apps/cli/package.json').version; if(v!=='2.11.4') throw new Error('unexpected Tauri CLI '+v)" + test ! -e package-lock.json + + - name: Verify tracked compiled renderer bytes + working-directory: frontends/desktop + run: npm run test:dist - name: Build Linux AppImage working-directory: frontends/desktop @@ -286,10 +324,23 @@ jobs: - name: Assemble self-contained portable bundle shell: bash - env: - GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} run: | set -euo pipefail + + purge_runtime_bytecode() { + local runtime_root="$1" + find "$runtime_root" -type d -name '__pycache__' -prune -exec rm -rf {} + + find "$runtime_root" -type f \( -name '*.pyc' -o -name '*.pyo' \) -delete + if find "$runtime_root" -type d -name '__pycache__' -print -quit | grep -q .; then + echo "Python bytecode cache directory remains in packaged runtime: $runtime_root" >&2 + return 1 + fi + if find "$runtime_root" -type f \( -name '*.pyc' -o -name '*.pyo' \) -print -quit | grep -q .; then + echo "Python bytecode remains in packaged runtime: $runtime_root" >&2 + return 1 + fi + } + APPIMAGE_SRC="$(find frontends/desktop/src-tauri/target/release/bundle/appimage -maxdepth 1 -type f -name '*.AppImage' | head -n 1)" [[ -n "$APPIMAGE_SRC" ]] || { echo "No AppImage found" >&2; exit 1; } @@ -303,35 +354,53 @@ jobs: # Icon for the generated .desktop launcher (Icon= needs a real image file on Linux). cp frontends/desktop/src-tauri/icons/icon.png "$PKG/GenericAgent.png" cp frontends/desktop/packaging/scripts/linux/install_linux.sh "$RUNTIME/install_linux.sh" + cp frontends/desktop/packaging/scripts/merge_desktop_settings.py "$RUNTIME/merge_desktop_settings.py" chmod +x "$RUNTIME/install_linux.sh" # Uninstaller: top-level entry next to the AppImage. cp frontends/desktop/packaging/scripts/linux/uninstall.sh "$PKG/uninstall.sh" chmod +x "$PKG/uninstall.sh" - # Embedded Python (python-build-standalone, linux x86_64, 3.12 install_only). - PBS_URL="$(curl -fsSL -H "Authorization: Bearer $GH_TOKEN" https://api.github.com/repos/astral-sh/python-build-standalone/releases/latest \ - | grep -o '"browser_download_url": *"[^"]*"' \ - | grep 'cpython-3\.12\.[0-9].*x86_64-unknown-linux-gnu-install_only\.tar\.gz' \ - | head -1 | sed -E 's/.*"(https[^"]+)"/\1/')" - [[ -n "$PBS_URL" ]] || { echo "Could not resolve python-build-standalone download URL" >&2; exit 1; } + # Fixed python-build-standalone Linux x86_64 archive. + PBS_URL="https://github.com/astral-sh/python-build-standalone/releases/download/${PBS_RELEASE}/cpython-${PBS_PYTHON_VERSION}%2B${PBS_RELEASE}-x86_64-unknown-linux-gnu-install_only.tar.gz" + PBS_SHA256="3297691ae34f75fed81ac424e040145fccb0bafe8e581cd5cadbddfa1c0766c0" + PBS_ARCHIVE="${RUNNER_TEMP}/pbs-linux-x86_64.tar.gz" echo "Python build-standalone: $PBS_URL" - curl -fsSL -o /tmp/pbs.tar.gz "$PBS_URL" - tar -xzf /tmp/pbs.tar.gz -C "$RUNTIME" # extracts a 'python/' dir + curl --proto '=https' --tlsv1.2 --fail --location --retry 3 --output "$PBS_ARCHIVE" "$PBS_URL" + printf '%s %s\n' "$PBS_SHA256" "$PBS_ARCHIVE" | sha256sum --check --strict - + tar -xzf "$PBS_ARCHIVE" -C "$RUNTIME" # extracts a 'python/' dir PY="$RUNTIME/python/bin/python3" - "$PY" --version + PYTHONDONTWRITEBYTECODE=1 "$PY" -c 'import platform, sys; assert sys.version_info[:3] == (3, 12, 14); assert platform.machine() == "x86_64"; print(sys.version)' - # Offline wheels (native linux wheels for the embedded python) + # Offline binary-only wheels. requirements.txt pins direct and transitive versions. mkdir -p "$RUNTIME/wheels" - "$PY" -m pip download --dest "$RUNTIME/wheels" \ - "requests>=2.28" "beautifulsoup4>=4.12" "bottle>=0.12" "simple-websocket-server>=0.4" "aiohttp>=3.9" psutil \ - fastapi uvicorn websockets pydantic setuptools wheel + cp frontends/desktop/packaging/python-runtime-requirements.txt "$RUNTIME/wheels/requirements.txt" + PYTHONDONTWRITEBYTECODE=1 "$PY" -m pip download --only-binary=:all: --dest "$RUNTIME/wheels" \ + --requirement "$RUNTIME/wheels/requirements.txt" # Runtime source (project root minus heavy/dev/build dirs) mkdir -p "$RUNTIME/app" tar \ --exclude='./.git' --exclude='./.github' \ + --exclude='./frontends/tests' \ --exclude='./frontends/desktop/src-tauri' \ + --exclude='./frontends/desktop/src' \ + --exclude='./frontends/desktop/public' \ + --exclude='./frontends/desktop/scripts' \ + --exclude='./frontends/desktop/release_qualification' \ + --exclude='./frontends/desktop/tests' \ + --exclude='./frontends/desktop/testing' \ + --exclude='./frontends/desktop/spec' \ --exclude='./frontends/desktop/node_modules' \ + --exclude='./frontends/desktop/dist' \ + --exclude='./frontends/desktop/DESIGN.md' \ + --exclude='./frontends/desktop/package.json' \ + --exclude='./frontends/desktop/package-lock.json' \ + --exclude='./frontends/desktop/.npmrc' \ + --exclude='./frontends/desktop/index.html' \ + --exclude='./frontends/desktop/loading.html' \ + --exclude='./frontends/desktop/setup.html' \ + --exclude='./frontends/desktop/tsconfig*.json' \ + --exclude='./frontends/desktop/vite.config.ts' \ --exclude='./frontends/desktop/packaging' --exclude='./docs' \ --exclude='./assets/demo' --exclude='./assets/images' \ --exclude='./assets/GenericAgent_Technical_Report.pdf' \ @@ -343,9 +412,13 @@ jobs: test -f "$RUNTIME/app/agentmain.py" test -f "$RUNTIME/app/frontends/desktop_bridge.py" test -f "$RUNTIME/app/frontends/desktop/static/index.html" + test ! -e "$RUNTIME/app/frontends/desktop/dist" + test ! -e "$RUNTIME/app/frontends/desktop/src" + test ! -e "$RUNTIME/app/frontends/desktop/public" + test ! -e "$RUNTIME/app/frontends/desktop/package-lock.json" + test ! -e "$RUNTIME/app/frontends/desktop/node_modules" - # Drop python debug/cache bits to slim the package - find "$RUNTIME/python" -name '__pycache__' -type d -prune -exec rm -rf {} + 2>/dev/null || true + purge_runtime_bytecode "$RUNTIME" cat > "$PKG/readme.txt" <<'EOF' ================ 中文 ================ @@ -354,7 +427,7 @@ jobs: 无需安装 Python、无需联网装依赖、无需源码仓库——全部已内置。 前置条件 - - Linux x86_64(glibc,常见发行版即可) + - Linux x86_64,glibc 2.35 或更高版本(如 Ubuntu 22.04、Debian 12) - 桌面环境 + FUSE(运行 AppImage 所需;多数发行版自带) 使用 @@ -362,12 +435,12 @@ jobs: 2. 给 AppImage 执行权限并运行: chmod +x GenericAgent.AppImage ./GenericAgent.AppImage - 3. 首次启动会自动离线准备运行环境(建虚拟环境、装依赖),界面显示进度,完成后进入主界面。 + 3. 首次启动会离线校验并补齐随包 Python 运行时依赖,界面显示进度,完成后进入主界面。 4. 之后启动直接秒进。 说明 - 想真正对话,仍需在程序里配置模型 / API Key。 - - 首次准备完成后不要移动本文件夹;若已移动,删除 runtime/app/.venv 后重新启动即可重建。 + - 可整体移动本文件夹;重启后会自动刷新路径。若需强制重新准备,请删除 runtime/.prepared 后重启。 - runtime/ 是内置运行环境与源码,正常使用无需改动。 ================ English ================ @@ -376,7 +449,7 @@ jobs: No Python install, no internet for dependencies, no source checkout — everything is bundled. Requirements - - Linux x86_64 (glibc; common distributions work) + - Linux x86_64 with glibc 2.35 or newer (for example Ubuntu 22.04 or Debian 12) - A desktop environment + FUSE (required to run the AppImage; preinstalled on most distros) Usage @@ -384,13 +457,14 @@ jobs: 2. Make the AppImage executable and run it: chmod +x GenericAgent.AppImage ./GenericAgent.AppImage - 3. The first launch prepares the runtime offline (creates a venv, installs deps) with a + 3. The first launch verifies and completes the bundled Python runtime offline with a progress UI, then opens the main window. 4. Subsequent launches start instantly. Notes - To actually chat, configure a model / API key inside the app. - - Do not move this folder after the first setup; if you did, delete runtime/app/.venv and relaunch to rebuild. + - You may move the whole folder; relaunching refreshes its saved paths. To force a new + preparation pass, delete runtime/.prepared and relaunch. - runtime/ holds the bundled runtime and source; no need to touch it. EOF sed -i 's/^ //' "$PKG/readme.txt" @@ -404,8 +478,63 @@ jobs: head -40 /tmp/pkglist.txt ls -lh artifacts/linux/out + # Exercise the exact archived candidate on the oldest supported builder. + SMOKE_ROOT="${RUNNER_TEMP}/ga-linux-package-smoke" + mkdir -p "$SMOKE_ROOT" + tar -xzf artifacts/linux/out/GenericAgent-Desktop-Linux-Portable.tar.gz -C "$SMOKE_ROOT" + SMOKE_PACKAGE="$SMOKE_ROOT/GenericAgent-Desktop-Linux-Portable" + APPIMAGE_ABS="$(realpath "$SMOKE_PACKAGE/GenericAgent.AppImage")" + APPIMAGE_SCAN="$SMOKE_ROOT/appimage-scan" + mkdir -p "$APPIMAGE_SCAN" + (cd "$APPIMAGE_SCAN" && "$APPIMAGE_ABS" --appimage-extract >/dev/null) + MAX_GLIBC="" + ELF_COUNT=0 + while IFS= read -r -d '' candidate; do + file -b "$candidate" | grep -q '^ELF' || continue + ELF_COUNT=$((ELF_COUNT + 1)) + candidate_max="$(readelf --version-info "$candidate" 2>/dev/null \ + | sed -n 's/.*Name: GLIBC_\([0-9][0-9.]*\).*/\1/p' \ + | sort -V | tail -n 1)" + [[ -n "$candidate_max" ]] || continue + if [[ -z "$MAX_GLIBC" \ + || "$(printf '%s\n%s\n' "$MAX_GLIBC" "$candidate_max" | sort -V | tail -n 1)" == "$candidate_max" ]]; then + MAX_GLIBC="$candidate_max" + fi + done < <(find "$SMOKE_PACKAGE" "$APPIMAGE_SCAN/squashfs-root" -type f -print0) + [[ "$ELF_COUNT" -gt 0 && -n "$MAX_GLIBC" ]] \ + || { echo "No GLIBC symbol versions found in final Linux package ELFs" >&2; exit 1; } + [[ "$(printf '%s\n%s\n' "$MAX_GLIBC" '2.35' | sort -V | tail -n 1)" == "2.35" ]] \ + || { echo "Final package requires GLIBC_$MAX_GLIBC; maximum allowed is GLIBC_2.35" >&2; exit 1; } + echo "Scanned $ELF_COUNT final package ELFs; maximum symbol is GLIBC_$MAX_GLIBC" + APPIMAGE_EXTRACT_AND_RUN=1 WEBKIT_DISABLE_COMPOSITING_MODE=1 \ + xvfb-run -a "$SMOKE_PACKAGE/GenericAgent.AppImage" >"$SMOKE_ROOT/app.log" 2>&1 & + SMOKE_PID=$! + cleanup_smoke() { + kill "$SMOKE_PID" 2>/dev/null || true + wait "$SMOKE_PID" 2>/dev/null || true + } + trap cleanup_smoke EXIT + IDENTITY="" + for _ in $(seq 1 120); do + IDENTITY="$(curl --fail --silent --max-time 1 http://127.0.0.1:14168/services/identity || true)" + [[ -n "$IDENTITY" ]] && break + sleep 1 + done + [[ -n "$IDENTITY" ]] || { cat "$SMOKE_ROOT/app.log" >&2; exit 1; } + EXPECTED_APP_DIR="$SMOKE_PACKAGE/runtime/app/frontends" \ + IDENTITY="$IDENTITY" python3 - <<'PY' + import json, os, pathlib + identity = json.loads(os.environ["IDENTITY"]) + actual = pathlib.Path(identity["app_dir"]).resolve() + expected = pathlib.Path(os.environ["EXPECTED_APP_DIR"]).resolve() + assert actual == expected, (actual, expected) + PY + curl --fail --silent --max-time 3 -X POST http://127.0.0.1:14168/services/bridge/exit >/dev/null + cleanup_smoke + trap - EXIT + - name: Upload workflow artifact - uses: actions/upload-artifact@v7 + uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 with: name: GenericAgent-Desktop-Linux-Portable-${{ github.run_number }} path: | @@ -413,132 +542,146 @@ jobs: artifacts/linux/out/SHA256SUMS-linux.txt if-no-files-found: error - - name: Publish into unified Release (tag push only) - if: ${{ startsWith(github.ref, 'refs/tags/') }} - env: - GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} - shell: bash - run: | - set -euo pipefail - TAG_NAME="${{ github.ref_name }}" - TITLE="GenericAgent Desktop ${TAG_NAME}" - cat > "${RUNNER_TEMP:-/tmp}/ga_notes.md" <<'EOF' - GenericAgent Desktop 桌面版 / Desktop - - 无需自行安装 Python、无需联网安装依赖、无需源码;首次启动会自动准备内置运行环境。 - No separate Python install, no internet for dependencies, no source checkout required; the bundled runtime is prepared on first launch. - - ## 安装方法 / Installation - - Windows: 下载 `GenericAgent-Desktop-Windows-Portable.zip`,解压后双击 `GenericAgent.exe` 启动。卸载时先退出应用,再双击包内 `uninstall.bat`,最后删除整个解压目录。 - Download `GenericAgent-Desktop-Windows-Portable.zip`, extract it, then double-click `GenericAgent.exe`. To uninstall, quit the app, double-click `uninstall.bat`, then delete the extracted folder. - - Linux: 下载 `GenericAgent-Desktop-Linux-Portable.tar.gz`,解压后执行 `chmod +x GenericAgent.AppImage`,再运行 `./GenericAgent.AppImage`。卸载时先退出应用,再运行 `./uninstall.sh`,最后删除整个解压目录。 - Download `GenericAgent-Desktop-Linux-Portable.tar.gz`, extract it, run `chmod +x GenericAgent.AppImage`, then launch `./GenericAgent.AppImage`. To uninstall, quit the app, run `./uninstall.sh`, then delete the extracted folder. - - macOS: 下载 `GenericAgent-Desktop-macOS.dmg`,双击打开 DMG,把 `GenericAgent.app` 拖入 `Applications`,之后在“应用程序 / Applications”中启动。若出现“无法验证开发者”等提示,先双击 DMG 内的 `open_anyway.command`,再启动。卸载时先退出应用,再从 Applications 删除 `GenericAgent.app`。 - Download `GenericAgent-Desktop-macOS.dmg`, open it, drag `GenericAgent.app` to `Applications`, then launch it from Applications. If macOS says the developer cannot be verified, double-click `open_anyway.command` inside the DMG first, then launch again. To uninstall, quit the app, then delete `GenericAgent.app` from Applications. - - ## 首次启动 / First launch - 首次启动会自动离线准备运行环境(安装依赖),有进度条,完成后进入主界面;之后启动会更快。 - The first launch prepares the runtime offline (installs deps) with a progress bar, then opens the main window; later launches are faster. - - ## 说明 / Notes - - 想真正对话需在程序内配置模型 / API Key。Configure a model / API key in-app to start chatting. - - Windows Defender 防火墙可能会拦截 `127.0.0.1` / `localhost` 回环连接,导致程序无法启动或连接本机服务;请允许 `GenericAgent.exe` 和随包的 `python.exe` 通过防火墙后重启。Windows Defender Firewall may block the local loopback connection; allow `GenericAgent.exe` and the bundled `python.exe` through the firewall, then restart the app. - - Windows/Linux 为便携包,可整体移动到任意目录后继续使用。Windows/Linux packages are portable and can be moved as a whole folder. - - Windows/Linux 包内附 `readme.txt`(中英)。Windows/Linux packages include a bilingual `readme.txt`. - EOF - # Race-safe: the 3 OS jobs share ONE release. Retry create until the release - # actually exists (a simultaneous create from another job can fail), so the - # upload below never races a not-yet-created release. - for _ in $(seq 1 15); do - gh release view "$TAG_NAME" >/dev/null 2>&1 && break - gh release create "$TAG_NAME" --target "${{ github.sha }}" --title "$TITLE" --notes-file "${RUNNER_TEMP:-/tmp}/ga_notes.md" --prerelease 2>/dev/null || true - sleep 3 - done - gh release upload "$TAG_NAME" artifacts/linux/out/* --clobber - # ---------------------------------------------------------------------------- build-macos: - name: macOS DMG - if: ${{ startsWith(github.ref, 'refs/tags/') || github.event.inputs.target == 'all' || github.event.inputs.target == 'macos' }} - runs-on: macos-latest + name: macOS arm64 DMG + if: ${{ (github.event_name == 'push' && startsWith(github.ref, 'refs/tags/desktop-portable-')) || (github.event_name == 'workflow_dispatch' && (github.event.inputs.target == 'all' || github.event.inputs.target == 'macos')) }} + runs-on: macos-15 + permissions: + contents: read steps: - name: Checkout repository - uses: actions/checkout@v5 + uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1 + with: + persist-credentials: false - name: Set up Node.js - uses: actions/setup-node@v5 + uses: actions/setup-node@a0853c24544627f65ddf259abe73b1d18a591444 # v5.0.0 with: - node-version: 20 + node-version: ${{ env.NODE_VERSION }} - name: Set up Rust - uses: dtolnay/rust-toolchain@stable + uses: dtolnay/rust-toolchain@4360b52568e2003a75bf9bc1d59f33a8e3fc893c # stable action snapshot + with: + toolchain: ${{ env.RUST_TOOLCHAIN }} - name: Cache Rust build - uses: Swatinem/rust-cache@v2 + uses: Swatinem/rust-cache@63fed3e2fecf6f7b51dc6f043341b79ef82a9ae7 # v2.9.2 with: workspaces: frontends/desktop/src-tauri -> target - name: Install desktop dependencies working-directory: frontends/desktop - run: npm install + run: | + npm install --package-lock=false + node -e "const v=require('./node_modules/@tauri-apps/cli/package.json').version; if(v!=='2.11.4') throw new Error('unexpected Tauri CLI '+v)" + test ! -e package-lock.json + + - name: Set up Python DMG tooling runtime + uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0 + with: + python-version: ${{ env.MACOS_PACKAGING_PYTHON_VERSION }} + + - name: Install Python packaging tools + run: >- + python3 -m pip install --require-hashes --only-binary=:all: + --requirement frontends/desktop/packaging/dmg-build-requirements.txt + + - name: Assert macOS runner architecture + run: test "$(uname -m)" = arm64 + + - name: Verify tracked compiled renderer bytes + working-directory: frontends/desktop + run: npm run test:dist - name: Build macOS .app working-directory: frontends/desktop run: npm run tauri build -- --bundles app - - name: Assemble self-contained portable bundle and DMG app + - name: Assemble self-contained DMG app shell: bash - env: - GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} run: | set -euo pipefail + + purge_runtime_bytecode() { + local runtime_root="$1" + find "$runtime_root" -type d -name '__pycache__' -prune -exec rm -rf {} + + find "$runtime_root" -type f \( -name '*.pyc' -o -name '*.pyo' \) -delete + if find "$runtime_root" -type d -name '__pycache__' -print -quit | grep -q .; then + echo "Python bytecode cache directory remains in packaged runtime: $runtime_root" >&2 + return 1 + fi + if find "$runtime_root" -type f \( -name '*.pyc' -o -name '*.pyo' \) -print -quit | grep -q .; then + echo "Python bytecode remains in packaged runtime: $runtime_root" >&2 + return 1 + fi + } + APP_SRC="$(find frontends/desktop/src-tauri/target/release/bundle/macos -maxdepth 1 -name '*.app' -type d | head -n 1)" [[ -n "$APP_SRC" ]] || { echo "No .app found" >&2; exit 1; } - # Build one runtime/ tree, then reuse it for both macOS deliverables: - # 1) Portable zip: GenericAgent.app + runtime/ + helper scripts. - # 2) Standard DMG: GenericAgent.app with runtime embedded in Contents/Resources/runtime. + # Build one runtime tree and embed it only in the final DMG application. RUNTIME_SRC="artifacts/macos/runtime-src" mkdir -p "$RUNTIME_SRC" cp frontends/desktop/packaging/scripts/macos/install_macos.sh "$RUNTIME_SRC/install_macos.sh" + cp frontends/desktop/packaging/scripts/merge_desktop_settings.py "$RUNTIME_SRC/merge_desktop_settings.py" chmod +x "$RUNTIME_SRC/install_macos.sh" - # Embedded Python (python-build-standalone, macOS, 3.12 install_only; aarch64 preferred). - PBS_URL="$(python3 - <<'PY' - import json, os, urllib.request - api='https://api.github.com/repos/astral-sh/python-build-standalone/releases/latest' - req=urllib.request.Request(api) - token=os.environ.get('GH_TOKEN') - if token: - req.add_header('Authorization', 'Bearer ' + token) - data=json.load(urllib.request.urlopen(req, timeout=60)) - assets=data.get('assets', []) - for arch in ('aarch64-apple-darwin', 'x86_64-apple-darwin'): - for a in assets: - name=a.get('name','') - if 'cpython-3.12' in name and arch in name and name.endswith('install_only.tar.gz') and 'stripped' not in name: - print(a['browser_download_url']); raise SystemExit - raise SystemExit('No suitable python-build-standalone macOS asset found') - PY - )" + # Fixed python-build-standalone macOS arm64 archive. + PBS_URL="https://github.com/astral-sh/python-build-standalone/releases/download/${PBS_RELEASE}/cpython-${PBS_PYTHON_VERSION}%2B${PBS_RELEASE}-aarch64-apple-darwin-install_only.tar.gz" + PBS_SHA256="4572133a5542f306b9bdb155da5800f9e38950cd0a98d469b832ce256fe299ea" + PBS_ARCHIVE="${RUNNER_TEMP}/pbs-macos-aarch64.tar.gz" echo "Python build-standalone: $PBS_URL" - curl -L --fail --retry 3 -o /tmp/pbs-macos.tar.gz "$PBS_URL" - tar -xzf /tmp/pbs-macos.tar.gz -C "$RUNTIME_SRC" # extracts a 'python/' dir + curl --proto '=https' --tlsv1.2 --fail --location --retry 3 --output "$PBS_ARCHIVE" "$PBS_URL" + printf '%s %s\n' "$PBS_SHA256" "$PBS_ARCHIVE" | shasum -a 256 --check - + tar -xzf "$PBS_ARCHIVE" -C "$RUNTIME_SRC" # extracts a 'python/' dir PY="$RUNTIME_SRC/python/bin/python3" - "$PY" --version + PYTHONDONTWRITEBYTECODE=1 "$PY" -c 'import platform, sys; assert sys.version_info[:3] == (3, 12, 14); assert platform.machine() == "arm64"; print(sys.version)' - # Offline wheels + # Offline binary-only wheels. requirements.txt pins direct and transitive versions. mkdir -p "$RUNTIME_SRC/wheels" - "$PY" -m pip download --dest "$RUNTIME_SRC/wheels" \ - "requests>=2.28" "beautifulsoup4>=4.12" "bottle>=0.12" "simple-websocket-server>=0.4" "aiohttp>=3.9" psutil \ - fastapi uvicorn websockets pydantic setuptools wheel + cp frontends/desktop/packaging/python-runtime-requirements.txt "$RUNTIME_SRC/wheels/requirements.txt" + PYTHONDONTWRITEBYTECODE=1 "$PY" -m pip download --only-binary=:all: --dest "$RUNTIME_SRC/wheels" \ + --requirement "$RUNTIME_SRC/wheels/requirements.txt" + + # macOS applications must be immutable at first launch. Install from the downloaded + # wheelhouse before the runtime enters the signed .app, then carry a durable marker. + # The binary-only offline repair path needs neither setuptools nor wheel. Remove any + # copies shipped in the base interpreter; bytecode writes are disabled at runtime too. + PYTHONDONTWRITEBYTECODE=1 "$PY" -m pip install --no-compile --no-index --find-links "$RUNTIME_SRC/wheels" \ + --requirement "$RUNTIME_SRC/wheels/requirements.txt" + PYTHONDONTWRITEBYTECODE=1 "$PY" -m pip uninstall --yes setuptools wheel + PYTHONDONTWRITEBYTECODE=1 "$PY" -m pip check + + PYTHONDONTWRITEBYTECODE=1 "$PY" -c 'import aiohttp, fastapi, importlib.util, pydantic, uvicorn, websockets; assert all(importlib.util.find_spec(name) is None for name in ("setuptools", "wheel", "pkg_resources"))' + purge_runtime_bytecode "$RUNTIME_SRC" + printf 'ok\n' > "$RUNTIME_SRC/.prepared" + test -s "$RUNTIME_SRC/.prepared" # Runtime source (project root minus heavy/dev/build dirs) — bsdtar exclude syntax. mkdir -p "$RUNTIME_SRC/app" tar \ --exclude='.git' --exclude='.github' \ + --exclude='frontends/tests' \ --exclude='frontends/desktop/src-tauri' \ + --exclude='frontends/desktop/src' \ + --exclude='frontends/desktop/public' \ + --exclude='frontends/desktop/scripts' \ + --exclude='frontends/desktop/release_qualification' \ + --exclude='frontends/desktop/tests' \ + --exclude='frontends/desktop/testing' \ + --exclude='frontends/desktop/spec' \ --exclude='frontends/desktop/node_modules' \ + --exclude='frontends/desktop/dist' \ + --exclude='frontends/desktop/DESIGN.md' \ + --exclude='frontends/desktop/package.json' \ + --exclude='frontends/desktop/package-lock.json' \ + --exclude='frontends/desktop/.npmrc' \ + --exclude='frontends/desktop/index.html' \ + --exclude='frontends/desktop/loading.html' \ + --exclude='frontends/desktop/setup.html' \ + --exclude='frontends/desktop/tsconfig*.json' \ + --exclude='frontends/desktop/vite.config.ts' \ --exclude='frontends/desktop/packaging' --exclude='docs' \ --exclude='assets/demo' --exclude='assets/images' \ --exclude='assets/GenericAgent_Technical_Report.pdf' \ @@ -550,172 +693,188 @@ jobs: test -f "$RUNTIME_SRC/app/agentmain.py" test -f "$RUNTIME_SRC/app/frontends/desktop_bridge.py" test -f "$RUNTIME_SRC/app/frontends/desktop/static/index.html" + test ! -e "$RUNTIME_SRC/app/frontends/desktop/dist" + test ! -e "$RUNTIME_SRC/app/frontends/desktop/src" + test ! -e "$RUNTIME_SRC/app/frontends/desktop/public" + test ! -e "$RUNTIME_SRC/app/frontends/desktop/package-lock.json" + test ! -e "$RUNTIME_SRC/app/frontends/desktop/node_modules" - PORTABLE="artifacts/macos/GenericAgent-Desktop-macOS-Portable" DMG_STAGE="artifacts/macos/dmg-stage" DMG_APP="$DMG_STAGE/GenericAgent.app" - mkdir -p "$PORTABLE" "$DMG_STAGE" - - # Portable zip: keep the existing release shape and helper scripts. - ditto "$APP_SRC" "$PORTABLE/GenericAgent.app" - ditto "$RUNTIME_SRC" "$PORTABLE/runtime" - cp frontends/desktop/packaging/scripts/macos/uninstall.command "$PORTABLE/uninstall.command" - chmod +x "$PORTABLE/uninstall.command" - cat > "$PORTABLE/Start GenericAgent.command" <<'EOF' - #!/bin/bash - DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" - xattr -cr "$DIR/GenericAgent.app" 2>/dev/null || true - open "$DIR/GenericAgent.app" - EOF - chmod +x "$PORTABLE/Start GenericAgent.command" - - cat > "$PORTABLE/readme.txt" <<'EOF' - ================ 中文 ================ - GenericAgent Desktop — macOS 便携版(自包含) - - 无需安装 Python、无需联网装依赖、无需源码仓库——全部已内置。 - - 使用 - 推荐:双击 “Start GenericAgent.command” 启动。也可直接双击 GenericAgent.app。 - 请保持目录结构不变:GenericAgent.app 与 runtime/ 必须在同一目录下。 - - 卸载 - 双击 uninstall.command,或退出程序后删除整个便携文件夹。 - - ================ English ================ - GenericAgent Desktop — macOS Portable (self-contained) - - No Python install, no internet for dependencies, no source checkout — everything is bundled. + mkdir -p "$DMG_STAGE" - Usage - Recommended: double-click "Start GenericAgent.command". You can also double-click GenericAgent.app. - Keep the folder layout intact: GenericAgent.app and runtime/ must stay in the same directory. - - Uninstall - Double-click uninstall.command, or quit the app and delete the whole portable folder. - EOF - sed -i '' 's/^ //' "$PORTABLE/readme.txt" - - codesign --force --deep --sign - "$PORTABLE/GenericAgent.app" - codesign --verify --deep --strict "$PORTABLE/GenericAgent.app" || true - - # Standard DMG: GenericAgent.app + Applications alias + first-launch helper/guide. + # Standard DMG: GenericAgent.app + Applications alias. The post-build + # repackager below writes the curated two-icon Finder layout. ditto "$APP_SRC" "$DMG_APP" mkdir -p "$DMG_APP/Contents/Resources" ditto "$RUNTIME_SRC" "$DMG_APP/Contents/Resources/runtime" + test -s "$DMG_APP/Contents/Resources/runtime/.prepared" + DMG_RUNTIME="$DMG_APP/Contents/Resources/runtime" + PYTHONDONTWRITEBYTECODE=1 "$DMG_RUNTIME/python/bin/python3" \ + -c 'import aiohttp, fastapi, pydantic, uvicorn, websockets' + purge_runtime_bytecode "$DMG_RUNTIME" + # Ad-hoc signing only: this is not Developer ID signing or notarization. codesign --force --deep --sign - "$DMG_APP" - codesign --verify --deep --strict "$DMG_APP" || true + codesign --verify --deep --strict "$DMG_APP" ln -s /Applications "$DMG_STAGE/Applications" - cat > "$DMG_STAGE/open_anyway.command" <<'EOF' - #!/bin/bash - set -e - DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" - TARGET="/Applications/GenericAgent.app" - if [[ ! -d "$TARGET" ]]; then - TARGET="$DIR/GenericAgent.app" - fi - xattr -cr "$TARGET" 2>/dev/null || true - osascript -e 'display dialog "GenericAgent 已处理完成。请将 GenericAgent.app 拖入 Applications 后,从 Applications 中启动;如果已经安装,可以直接重新打开。" buttons {"OK"} default button "OK"' >/dev/null 2>&1 || true - EOF - chmod +x "$DMG_STAGE/open_anyway.command" - - cat > "$DMG_STAGE/readme.txt" <<'EOF' - ================ 中文 ================ - GenericAgent Desktop — macOS DMG 安装版 - - 安装 - 1. 双击打开 GenericAgent-Desktop-macOS.dmg。 - 2. 将 GenericAgent.app 拖入 Applications。 - 3. 打开“应用程序 / Applications”,双击 GenericAgent.app 启动。 - - 若出现“无法验证开发者”“Apple 无法检查其是否包含恶意软件”或无法打开: - 1. 回到 DMG 窗口。 - 2. 双击“open_anyway.command”。 - 3. 再从 Applications 中打开 GenericAgent.app。 - 也可以右键 GenericAgent.app,选择“打开”。 - - 卸载 - 先退出 GenericAgent,再从 Applications 删除 GenericAgent.app。 - - ================ English ================ - GenericAgent Desktop — macOS DMG installer - - Installation - 1. Open GenericAgent-Desktop-macOS.dmg. - 2. Drag GenericAgent.app to Applications. - 3. Open Applications and launch GenericAgent.app. - - If macOS says the developer cannot be verified, Apple cannot check it for malicious software, or the app cannot be opened: - 1. Go back to the DMG window. - 2. Double-click "open_anyway.command". - 3. Launch GenericAgent.app from Applications again. - You can also right-click GenericAgent.app and choose Open. - - Uninstall - Quit GenericAgent, then delete GenericAgent.app from Applications. - EOF - sed -i '' 's/^ //' "$DMG_STAGE/readme.txt" - mkdir -p artifacts/macos/out hdiutil create \ -volname "GenericAgent Desktop" \ -srcfolder "$DMG_STAGE" \ -ov \ -format UDZO \ - "artifacts/macos/out/GenericAgent-Desktop-macOS.dmg" - shasum -a 256 "artifacts/macos/out/GenericAgent-Desktop-macOS.dmg" \ - > "artifacts/macos/out/GenericAgent-Desktop-macOS.dmg.sha256" + "artifacts/macos/out/GenericAgent-Desktop-macOS-aarch64.dmg" + + # Restore the intentionally minimal Finder presentation: only the app + # and Applications shortcut, with the established window/icon layout. + bash frontends/desktop/scripts/post-dmg.sh "artifacts/macos/out/GenericAgent-Desktop-macOS-aarch64.dmg" + + ( + cd artifacts/macos/out + shasum -a 256 "GenericAgent-Desktop-macOS-aarch64.dmg" \ + > "GenericAgent-Desktop-macOS-aarch64.dmg.sha256" + ) echo "DMG stage tree:" find "$DMG_STAGE" -maxdepth 2 -print | sort - name: Upload workflow artifact - uses: actions/upload-artifact@v7 + uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 with: - name: GenericAgent-Desktop-macOS-DMG-${{ github.run_number }} - path: artifacts/macos/out/* + name: GenericAgent-Desktop-macOS-aarch64-DMG-${{ github.run_number }} + path: | + artifacts/macos/out/GenericAgent-Desktop-macOS-aarch64.dmg + artifacts/macos/out/GenericAgent-Desktop-macOS-aarch64.dmg.sha256 if-no-files-found: error - - name: Publish into unified Release (tag push only) - if: ${{ startsWith(github.ref, 'refs/tags/') }} + # ---------------------------------------------------------------------------- + publish-release: + name: Publish one atomic prerelease + needs: [build-windows, build-linux, build-macos] + if: ${{ github.event_name == 'push' && startsWith(github.ref, 'refs/tags/desktop-portable-') && needs.build-windows.result == 'success' && needs.build-linux.result == 'success' && needs.build-macos.result == 'success' }} + runs-on: ubuntu-24.04 + permissions: + contents: write + steps: + - name: Download Windows candidate + uses: actions/download-artifact@37930b1c2abaa49bbe596cd826c3c89aef350131 # v7.0.0 + with: + name: GenericAgent-Desktop-Windows-Portable-${{ github.run_number }} + path: ${{ runner.temp }}/release-assets + + - name: Download Linux candidate + uses: actions/download-artifact@37930b1c2abaa49bbe596cd826c3c89aef350131 # v7.0.0 + with: + name: GenericAgent-Desktop-Linux-Portable-${{ github.run_number }} + path: ${{ runner.temp }}/release-assets + + - name: Download macOS arm64 candidate + uses: actions/download-artifact@37930b1c2abaa49bbe596cd826c3c89aef350131 # v7.0.0 + with: + name: GenericAgent-Desktop-macOS-aarch64-DMG-${{ github.run_number }} + path: ${{ runner.temp }}/release-assets + + - name: Validate six assets and publish prerelease env: GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + TAG_NAME: ${{ github.ref_name }} + TARGET_SHA: ${{ github.sha }} shell: bash run: | set -euo pipefail - TAG_NAME="${{ github.ref_name }}" + + ASSET_DIR="${RUNNER_TEMP}/release-assets" + EXPECTED=( + GenericAgent-Desktop-Linux-Portable.tar.gz + GenericAgent-Desktop-Windows-Portable.zip + GenericAgent-Desktop-macOS-aarch64.dmg + GenericAgent-Desktop-macOS-aarch64.dmg.sha256 + SHA256SUMS-linux.txt + SHA256SUMS-windows.txt + ) + + if find "$ASSET_DIR" -mindepth 1 -maxdepth 1 ! -type f -print -quit | grep -q .; then + echo "Release staging contains a non-regular entry" >&2 + find "$ASSET_DIR" -mindepth 1 -maxdepth 1 -print >&2 + exit 1 + fi + mapfile -t ACTUAL < <(find "$ASSET_DIR" -mindepth 1 -maxdepth 1 -type f -printf '%f\n' | LC_ALL=C sort) + if ! diff -u <(printf '%s\n' "${EXPECTED[@]}") <(printf '%s\n' "${ACTUAL[@]}"); then + echo "Release staging must contain exactly the six expected files" >&2 + exit 1 + fi + for filename in "${EXPECTED[@]}"; do + test -s "$ASSET_DIR/$filename" || { echo "Missing or empty release asset: $filename" >&2; exit 1; } + done + + verify_checksum_manifest() { + local manifest="$1" + local payload="$2" + local normalized="${RUNNER_TEMP}/${manifest}.normalized" + tr -d '\r' < "$ASSET_DIR/$manifest" > "$normalized" + awk -v expected="$payload" ' + NF == 2 && $1 ~ /^[0-9a-fA-F]{64}$/ && $2 == expected { valid += 1 } + END { exit !(NR == 1 && valid == 1) } + ' "$normalized" + (cd "$ASSET_DIR" && sha256sum --check --strict "$normalized") + } + verify_checksum_manifest SHA256SUMS-windows.txt GenericAgent-Desktop-Windows-Portable.zip + verify_checksum_manifest SHA256SUMS-linux.txt GenericAgent-Desktop-Linux-Portable.tar.gz + verify_checksum_manifest GenericAgent-Desktop-macOS-aarch64.dmg.sha256 GenericAgent-Desktop-macOS-aarch64.dmg + + [[ "$TAG_NAME" =~ ^desktop-portable-[A-Za-z0-9._-]+$ ]] \ + || { echo "Invalid release tag: $TAG_NAME" >&2; exit 1; } + [[ "$TARGET_SHA" =~ ^[0-9a-f]{40}$ ]] \ + || { echo "Invalid release target SHA" >&2; exit 1; } TITLE="GenericAgent Desktop ${TAG_NAME}" - cat > "${RUNNER_TEMP:-/tmp}/ga_notes.md" <<'EOF' + NOTES_FILE="${RUNNER_TEMP}/ga-release-notes.md" + cat > "$NOTES_FILE" <<'EOF' GenericAgent Desktop 桌面版 / Desktop - 无需自行安装 Python、无需联网安装依赖、无需源码;首次启动会自动准备内置运行环境。 - No separate Python install, no internet for dependencies, no source checkout required; the bundled runtime is prepared on first launch. + 三个平台产物来自同一提交,并在公开发布前统一验证。All three platform artifacts come from one commit and are validated before publication. ## 安装方法 / Installation - - Windows: 下载 `GenericAgent-Desktop-Windows-Portable.zip`,解压后双击 `GenericAgent.exe` 启动。卸载时先退出应用,再双击包内 `uninstall.bat`,最后删除整个解压目录。 - Download `GenericAgent-Desktop-Windows-Portable.zip`, extract it, then double-click `GenericAgent.exe`. To uninstall, quit the app, double-click `uninstall.bat`, then delete the extracted folder. - - Linux: 下载 `GenericAgent-Desktop-Linux-Portable.tar.gz`,解压后执行 `chmod +x GenericAgent.AppImage`,再运行 `./GenericAgent.AppImage`。卸载时先退出应用,再运行 `./uninstall.sh`,最后删除整个解压目录。 - Download `GenericAgent-Desktop-Linux-Portable.tar.gz`, extract it, run `chmod +x GenericAgent.AppImage`, then launch `./GenericAgent.AppImage`. To uninstall, quit the app, run `./uninstall.sh`, then delete the extracted folder. - - macOS: 下载 `GenericAgent-Desktop-macOS.dmg`,双击打开 DMG,把 `GenericAgent.app` 拖入 `Applications`,之后在“应用程序 / Applications”中启动。若出现“无法验证开发者”等提示,先双击 DMG 内的 `open_anyway.command`,再启动。卸载时先退出应用,再从 Applications 删除 `GenericAgent.app`。 - Download `GenericAgent-Desktop-macOS.dmg`, open it, drag `GenericAgent.app` to `Applications`, then launch it from Applications. If macOS says the developer cannot be verified, double-click `open_anyway.command` inside the DMG first, then launch again. To uninstall, quit the app, then delete `GenericAgent.app` from Applications. - - ## 首次启动 / First launch - 首次启动会自动离线准备运行环境(安装依赖),有进度条,完成后进入主界面;之后启动会更快。 - The first launch prepares the runtime offline (installs deps) with a progress bar, then opens the main window; later launches are faster. - - ## 说明 / Notes - - 想真正对话需在程序内配置模型 / API Key。Configure a model / API key in-app to start chatting. - - Windows Defender 防火墙可能会拦截 `127.0.0.1` / `localhost` 回环连接,导致程序无法启动或连接本机服务;请允许 `GenericAgent.exe` 和随包的 `python.exe` 通过防火墙后重启。Windows Defender Firewall may block the local loopback connection; allow `GenericAgent.exe` and the bundled `python.exe` through the firewall, then restart the app. - - Windows/Linux 为便携包,可整体移动到任意目录后继续使用。Windows/Linux packages are portable and can be moved as a whole folder. - - Windows/Linux 包内附 `readme.txt`(中英)。Windows/Linux packages include a bilingual `readme.txt`. + - Windows x64:下载 `GenericAgent-Desktop-Windows-Portable.zip`,解压后双击 `GenericAgent.exe`。卸载时运行 `uninstall.bat`,再删除解压目录。 + Windows x64: extract `GenericAgent-Desktop-Windows-Portable.zip`, then launch `GenericAgent.exe`. Run `uninstall.bat` before deleting the extracted directory. + - Linux x86_64:下载并解压 `GenericAgent-Desktop-Linux-Portable.tar.gz`,执行 `chmod +x GenericAgent.AppImage` 后运行它。卸载时运行 `uninstall.sh`,再删除解压目录。 + Linux x86_64: extract `GenericAgent-Desktop-Linux-Portable.tar.gz`, run `chmod +x GenericAgent.AppImage`, then launch it. Run `uninstall.sh` before deleting the extracted directory. + - macOS Apple silicon (arm64):打开 `GenericAgent-Desktop-macOS-aarch64.dmg`,把 `GenericAgent.app` 拖入 Applications。 + macOS Apple silicon (arm64): open `GenericAgent-Desktop-macOS-aarch64.dmg` and drag `GenericAgent.app` to Applications. + + ## 签名状态 / Signing status + Windows 便携版尚未使用代码签名证书,SmartScreen 可能显示警告;运行前请核对 `SHA256SUMS-windows.txt`。 + The Windows portable build is not code-signed, so SmartScreen may warn; verify `SHA256SUMS-windows.txt` before running it. + + macOS 应用仅使用 ad-hoc 签名,未使用 Apple Developer ID,也未 notarize。首次打开可能需要右键选择“打开”或在“隐私与安全性”中允许。 + The macOS app is ad-hoc signed only. It is neither Developer ID signed nor notarized; first launch may require Open from the context menu or approval in Privacy & Security. + + SHA-256 清单与各产物一同发布。SHA-256 manifests are included with the artifacts. EOF - # Race-safe: the 3 OS jobs share ONE release. Retry create until the release - # actually exists (a simultaneous create from another job can fail), so the - # upload below never races a not-yet-created release. - for _ in $(seq 1 15); do - gh release view "$TAG_NAME" >/dev/null 2>&1 && break - gh release create "$TAG_NAME" --target "${{ github.sha }}" --title "$TITLE" --notes-file "${RUNNER_TEMP:-/tmp}/ga_notes.md" --prerelease 2>/dev/null || true - sleep 3 + sed -i 's/^ //' "$NOTES_FILE" + + if gh release view "$TAG_NAME" >/dev/null 2>&1; then + echo "A release already exists for $TAG_NAME; refusing to overwrite it" >&2 + exit 1 + fi + + ASSETS=() + for filename in "${EXPECTED[@]}"; do + ASSETS+=("$ASSET_DIR/$filename") done - gh release upload "$TAG_NAME" artifacts/macos/out/* --clobber + # Keep the release invisible while all assets upload; only the final edit publishes it. + gh release create "$TAG_NAME" "${ASSETS[@]}" \ + --target "$TARGET_SHA" \ + --title "$TITLE" \ + --notes-file "$NOTES_FILE" \ + --draft \ + --prerelease + + mapfile -t REMOTE_ASSETS < <(gh release view "$TAG_NAME" --json assets --jq '.assets[].name' | LC_ALL=C sort) + diff -u <(printf '%s\n' "${EXPECTED[@]}") <(printf '%s\n' "${REMOTE_ASSETS[@]}") + test "$(gh release view "$TAG_NAME" --json isDraft --jq '.isDraft')" = true + test "$(gh release view "$TAG_NAME" --json isPrerelease --jq '.isPrerelease')" = true + + gh release edit "$TAG_NAME" --draft=false --prerelease + test "$(gh release view "$TAG_NAME" --json isDraft --jq '.isDraft')" = false + test "$(gh release view "$TAG_NAME" --json isPrerelease --jq '.isPrerelease')" = true diff --git a/.gitignore b/.gitignore index 232f07953..19b91d92f 100644 --- a/.gitignore +++ b/.gitignore @@ -9,6 +9,8 @@ venv/ env/ build/ dist/ +!frontends/desktop/dist/ +!frontends/desktop/dist/** *.egg-info/ .streamlit/ diff --git a/frontends/conductor.py b/frontends/conductor.py index 9202ce7dc..cbd205ac0 100644 --- a/frontends/conductor.py +++ b/frontends/conductor.py @@ -9,32 +9,62 @@ from pydantic import BaseModel def _resolve_ga_root() -> str: - """External core dir when launched as the bundle's conductor (design 三). - Prefer GA_ROOT env (set by the desktop bridge), else derive from own location.""" - val = (os.environ.get("GA_ROOT", "") or "").strip() - if val: - root = os.path.abspath(os.path.expanduser(val)) + """Use the external core selected by the package-owned desktop bridge when valid.""" + value = (os.environ.get("GA_ROOT", "") or "").strip() + if value: + root = os.path.abspath(os.path.expanduser(value)) if os.path.exists(os.path.join(root, "agentmain.py")): return root return os.path.dirname(os.path.dirname(os.path.abspath(__file__))) + ROOT = _resolve_ga_root() if ROOT not in sys.path: sys.path.insert(0, ROOT) from agentmain import GenericAgent HOST = "127.0.0.1" -PORT = 8900 +DEFAULT_PORT = 8900 +E2E_CONDUCTOR_PORT_ENV = "GA_DESKTOP_E2E_CONDUCTOR_PORT" +E2E_REPORT_DIR_ENV = "GA_DESKTOP_E2E_REPORT_DIR" + + +def _parse_conductor_port(value: Any) -> int: + raw = str(value).strip() + if not raw.isascii() or not raw.isdigit(): + raise argparse.ArgumentTypeError("conductor port must be an integer between 1 and 65535") + port = int(raw) + if not 1 <= port <= 65535: + raise argparse.ArgumentTypeError("conductor port must be an integer between 1 and 65535") + return port + + +def _default_conductor_port() -> int: + """Keep production on :8900; only the isolated package journey may override it. + + The renderer and production CSP intentionally target :8900. Treating this as a + general runtime setting would make the backend claim configurability the renderer + cannot honor, so the override is gated by the existing package-evidence marker. + """ + if not os.environ.get(E2E_REPORT_DIR_ENV): + return DEFAULT_PORT + raw = os.environ.get(E2E_CONDUCTOR_PORT_ENV) + return DEFAULT_PORT if raw is None else _parse_conductor_port(raw) + + +PORT = _default_conductor_port() HTML_PATH = os.path.join(os.path.dirname(os.path.abspath(__file__)), "conductor.html") parser = argparse.ArgumentParser() parser.add_argument("--host", default=HOST) -parser.add_argument("--port", type=int, default=PORT) +parser.add_argument("--port", type=_parse_conductor_port, default=PORT) parser.add_argument("--key") parser.add_argument("--no-browser", action="store_true") args = parser.parse_args() if args.host not in ("127.0.0.1", "localhost", "::1") and not args.key: parser.error("--key is required for non-loopback listening") +HOST = args.host +PORT = args.port def _settings_doc() -> dict: @@ -63,47 +93,109 @@ def _client_usable(agent: "GenericAgent") -> bool: return hasattr(getattr(agent, "llmclient", None), "backend") -def _fallback_usable_model(agent: "GenericAgent") -> None: - for i, client in enumerate(getattr(agent, "llmclients", []) or []): - if not hasattr(client, "backend"): - continue - agent.llm_no = i - agent.llmclient = client +def _parse_model_no(value: Any) -> Optional[int]: + if value is None or isinstance(value, bool): + return None + try: + return int(value) + except (TypeError, ValueError): + return None + + +def _usable_model(agent: "GenericAgent", no: Optional[int]) -> bool: + clients = getattr(agent, "llmclients", []) or [] + return no is not None and 0 <= no < len(clients) and hasattr(clients[no], "backend") + + +def _activate_model(agent: "GenericAgent", no: int) -> None: + if not _usable_model(agent, no): + raise ValueError(f"llm index out of range or unavailable: {no}") + agent.next_llm(no) + + +def _runtime_model_state(agent: "GenericAgent", configured: Optional[int], reason: Optional[str]) -> dict: + effective = getattr(agent, "llm_no", None) if _client_usable(agent) else None + current = None + if _client_usable(agent): with suppress(Exception): - agent.llmclient.last_tools = '' - return + current = str(agent.llmclient.backend.name) + return {"configured": configured, "effective": effective, + "fallbackReason": reason, "current": current} -def _apply_desktop_model(agent: "GenericAgent") -> None: +def _apply_desktop_model(agent: "GenericAgent") -> dict: """Make the conductor's session reflect the current desktop config before a task: switch to its bound model if one is set, otherwise still refresh sessions from mykey so live key/model edits (e.g. importing keys) take effect without a restart. next_llm() already reloads internally; the no-bound-model branch must reload too, or a conductor started on an empty/stale mykey would never pick up imported keys.""" - no = _conductor_llm_no() - if no is not None: + doc = _settings_doc() + conductor_cfg = doc.get("conductor") if isinstance(doc.get("conductor"), dict) else {} + ui_cfg = doc.get("ui") if isinstance(doc.get("ui"), dict) else {} + raw_configured = conductor_cfg.get("llmNo") + configured = _parse_model_no(raw_configured) + ui_default = _parse_model_no(ui_cfg.get("llmNo")) + + try: + agent.load_llm_sessions() # mtime-guarded; rebuilds only when mykey changed + except Exception as e: + print(f"[conductor] failed to refresh model sessions: {e}", file=sys.stderr) + + clients = getattr(agent, "llmclients", []) or [] + + configured_failed = False + if _usable_model(agent, configured): try: - agent.next_llm(int(no)) + _activate_model(agent, configured) + return _runtime_model_state(agent, configured, None) except Exception as e: - print(f"[conductor] failed to apply conductor model #{no}: {e}", file=sys.stderr) - else: - agent.load_llm_sessions() # mtime-guarded; rebuilds only when mykey changed - if not _client_usable(agent): - print("[conductor] selected model is unavailable; falling back to first usable model", file=sys.stderr) - _fallback_usable_model(agent) + configured_failed = True + print(f"[conductor] configured model #{configured} is unavailable: {e}", file=sys.stderr) + + if _usable_model(agent, ui_default): + if raw_configured is None: + reason = "ui_default" + elif configured_failed: + reason = "configured_unavailable" + elif configured is not None: + reason = "configured_unavailable" if 0 <= configured < len(clients) else "invalid_configured" + else: + reason = "invalid_configured" + try: + _activate_model(agent, ui_default) + return _runtime_model_state(agent, configured, reason) + except Exception as e: + print(f"[conductor] UI default model #{ui_default} is unavailable: {e}", file=sys.stderr) + + for i, client in enumerate(clients): + if hasattr(client, "backend"): + try: + _activate_model(agent, i) + return _runtime_model_state(agent, configured, "first_available") + except Exception: + continue + + print("[conductor] no usable model is available", file=sys.stderr) + return {"configured": configured, "effective": None, + "fallbackReason": "no_models", "current": None} def _select_llm(agent: "GenericAgent", llm: Any) -> bool: if llm is None or str(llm).strip() == "": return False q = str(llm).strip() - if isinstance(llm, int) or q.isdigit(): agent.next_llm(int(q)); return True + if isinstance(llm, int) or q.isdigit(): + agent.load_llm_sessions() + _activate_model(agent, int(q)) + return True q = q.lower(); agent.load_llm_sessions() for i, c in enumerate(agent.llmclients): + if not hasattr(c, "backend"): + continue vals = [] for fn in (lambda: agent.get_llm_name(c), lambda: agent.get_llm_name(c, model=True), lambda: c.backend.name, lambda: c.backend.model): try: vals.append(str(fn()).lower()) except Exception: pass - if any(q in v for v in vals): agent.next_llm(i); return True + if any(q in v for v in vals): _activate_model(agent, i); return True raise ValueError(f"llm not found: {llm}") @@ -362,8 +454,8 @@ def keyinfo_subagent(self, sid: str, msg: str) -> dict: GET /file?path=...\t下载文件 POST /file?name=...\t上传到temp/uploads POST /subagent/{{id}}\tbody: {{"action": "keyinfo", "msg": "..."}}\t注入key_info(agent下轮可见) -POST /subagent/{{id}}\tbody: {{"action": "input", "msg": "..."}}\t对subagent输入下一条指令;指定模型加参数llm(数字/名称) -POST /subagent/{{id}}\tbody: {{"action": "stop"}}\t中断执行但保留(可继续input) +POST /subagent/{{id}}\tbody: {{"action": "input", "msg": "..."}}\t开新一轮任务;指定模型加参数llm(数字/名称) +POST /subagent/{{id}}\tbody: {{"action": "stop"}}\t中断执行但保留(可继续input/reply) GET /chat?last=N\t返回最近N条对话(默认20) GET /subagent\t返回 {{"items": [...]}}\t查看所有subagent状态 GET /subagent/{{id}}?max_len=N\t返回单个subagent详情,reply经清洗后截取尾部max_len字(默认5000)。仅在摘要不够判断时使用 @@ -401,10 +493,56 @@ def __init__(self): self.inbox: "queue.Queue[dict]" = queue.Queue() # 收件箱:唯一对外接口 self.agent: Optional[GenericAgent] = None self.started = False + self._runner_thread: Optional[threading.Thread] = None self.log: list = [] + self._model_lock = threading.RLock() + self._model_state = { + "configured": None, + "effective": None, + "fallbackReason": "no_models", + "current": None, + "running": False, + } + + def model_snapshot(self) -> dict: + with self._model_lock: + return dict(self._model_state) + + def _publish_model_state(self, state: dict, running: bool) -> None: + snapshot = {**state, "running": bool(running)} + with self._model_lock: + self._model_state = snapshot + schedule_broadcast({"type": "model", "model": snapshot}) def notify(self, event: dict): self.inbox.put(event) + def _wait_for_agent_idle(self, timeout: float = 10.0) -> None: + """Queue.join semantics with a bounded runner-health escape hatch.""" + tasks = self.agent.task_queue + deadline = time.monotonic() + timeout + with tasks.all_tasks_done: + while tasks.unfinished_tasks: + if self._runner_thread is not None and not self._runner_thread.is_alive(): + raise RuntimeError("conductor agent runner stopped before task cleanup") + remaining = deadline - time.monotonic() + if remaining <= 0: + raise TimeoutError("conductor agent task cleanup timed out") + tasks.all_tasks_done.wait(min(0.25, remaining)) + + def _record_unavailable_model(self, events: list) -> None: + event_label = ",".join(event.get("type", "") for event in events) or "wake" + item = { + "id": short_id(), + "ts": now_ms(), + "event": event_label, + "turn": None, + "text": "Conductor paused: no usable model profiles are configured; events are deferred.", + } + self.log.append(item) + if len(self.log) > self.LOG_MAX: + self.log.pop(0) + schedule_broadcast({"type": "log", "item": item}) + def _build_prompt(self, events: list) -> str: running, stopped = pool.counts() unread = sum(1 for m in chat_messages if m.get("role") == "user" and not m.get("read")) @@ -460,33 +598,55 @@ def flush(): def _run(self): self.agent.inc_out = True - start_agent_runner(self.agent, "conductor-agent") + self._runner_thread = start_agent_runner(self.agent, "conductor-agent") self.started = True + deferred_events: list = [] while True: # Block until first event arrives first = self.inbox.get() self.inbox.task_done() # Short debounce: collect any additional events that arrived meanwhile time.sleep(0.3) - events = [first] + events = [*deferred_events, first] + deferred_events = [] while not self.inbox.empty(): try: events.append(self.inbox.get_nowait()) self.inbox.task_done() except Exception: break - kind = first.get("type"); others = [e for e in events if e.get("type") != kind]; events = [e for e in events if e.get("type") == kind] or [first] - for e in others: self.inbox.put(e) try: + # GenericAgent publishes the display ``done`` item before its + # runner finishes history persistence and task cleanup. Do not + # mutate the live client until that previous task has reached + # ``task_done``; the queue join is the authoritative idle barrier. + self._wait_for_agent_idle() + # Settings can change while this long-lived process remains healthy. + # Refresh only at the task boundary so an in-flight task keeps its + # client, while the next task observes the newly persisted binding. + model_state = _apply_desktop_model(self.agent) + if model_state.get("effective") is None: + self._publish_model_state(model_state, running=False) + self._record_unavailable_model(events) + deferred_events = events + continue + kind = events[0].get("type") + other_events = [event for event in events if event.get("type") != kind] + events = [event for event in events if event.get("type") == kind] + for event in other_events: + self.inbox.put(event) prompt = self._build_prompt(events) - dq = self.agent.put_task(prompt, source="conductor") - self._drain(dq, events) - except Exception as e: - print(f"Conductor error: {e}") - add_chat(f"⚠ 回复失败:{e}", role="error") + self._publish_model_state(model_state, running=True) + try: + dq = self.agent.put_task(prompt, source="conductor") + self._drain(dq, events) + finally: + self._publish_model_state(model_state, running=False) + except Exception as e: print(f"Conductor error: {e}") def start(self): - self.agent = GenericAgent(); _apply_desktop_model(self.agent) + self.agent = GenericAgent() + self._publish_model_state(_apply_desktop_model(self.agent), running=False) threading.Thread(target=self._run, name="conductor-loop", daemon=True).start() @@ -494,9 +654,6 @@ def start(self): # ---- IM poller: 探测conductor_im_plugins/下各插件,信号变化→唤醒总管 ---- def _resolve_im_dir() -> str: - # 方案三: conductor.py itself is bundle-owned, but IM plugins are user/environment - # integrations. Prefer the external core's plugins when GA_ROOT points at one; fall back - # to the bundle templates/examples when the external core has no plugin directory. external = os.path.join(ROOT, "frontends", "conductor_im_plugins") if os.path.isdir(external): return external @@ -640,12 +797,12 @@ async def websocket(ws: WebSocket): ws_clients.add(ws) try: running = any(s.status == "running" for s in pool.subagents.values()) - await ws.send_json({"type": "hello", "subagents": pool.snapshot(), "chat": chat_messages, "log": conductor.log, "running": running, "llms": conductor.agent.list_llms(), "llm": conductor.agent.llm_no}) + await ws.send_json({"type": "hello", "subagents": pool.snapshot(), "chat": chat_messages, + "log": conductor.log, "running": running, + "model": conductor.model_snapshot(), + "llms": conductor.agent.list_llms(), "llm": conductor.agent.llm_no}) while True: data = await ws.receive_json() - if "llm" in data: - if type(n := data["llm"]) is int and 0 <= n < len(conductor.agent.list_llms()): conductor.agent.next_llm(n) - continue msg = (data.get("msg") or "").strip() if not msg: continue add_chat(msg, role="user", files=data.get("files") or [], images=data.get("images") or []) diff --git a/frontends/cost_tracker.py b/frontends/cost_tracker.py index 744258982..c83ccfe7c 100644 --- a/frontends/cost_tracker.py +++ b/frontends/cost_tracker.py @@ -9,8 +9,9 @@ same `[Cache]` / `[Output]` print lines from `temp/*/stdout.log`. """ from __future__ import annotations -import glob, os, re, threading, time +import glob, json, os, re, threading, time from dataclasses import dataclass, field +from pathlib import Path @dataclass @@ -70,6 +71,247 @@ def current_input_chars(backend) -> int: _INSTALLED = False _SUBAGENT_GLOB = os.path.join("temp", "*", "stdout.log") +# ── Per-call ledger ────────────────────────────────────────────────────────── + +_ledger_path: Path | None = None +_ledger_fd = None +_ledger_lock = threading.RLock() +_ledger_uncompacted_bytes = 0 +_LEDGER_FILENAME = "token_ledger.jsonl" +_LEGACY_HISTORY_FILENAME = "desktop_token_history.json" +_COMPACT_THRESHOLD = 10 * 1024 * 1024 # 10MB + + +def _migrate_legacy_history_unlocked() -> None: + """Seed an empty ledger from the previous aggregate JSON format once.""" + global _ledger_uncompacted_bytes + if _ledger_path is None or _ledger_fd is None: + return + legacy_path = _ledger_path.with_name(_LEGACY_HISTORY_FILENAME) + try: + if _ledger_path.stat().st_size or not legacy_path.is_file(): + return + doc = json.loads(legacy_path.read_text(encoding="utf-8")) + if not isinstance(doc, dict) or not isinstance(doc.get("snap"), dict): + return + metadata: dict[str, dict] = {} + for entry in doc.get("history", []): + if not isinstance(entry, dict): + continue + sid = entry.get("sessionId") or entry.get("id") + if not isinstance(sid, str) or not sid: + continue + key = sid if sid.startswith("GA-") else f"GA-{sid}" + try: + ts = float(entry.get("ts", 0) or 0) + except (TypeError, ValueError): + ts = 0 + if key not in metadata or ts >= metadata[key]["ts"]: + metadata[key] = { + "ts": ts, + "model": entry.get("model") if isinstance(entry.get("model"), str) else "", + "title": entry.get("title") if isinstance(entry.get("title"), str) else "", + } + fallback_ts = legacy_path.stat().st_mtime + for key, totals in doc["snap"].items(): + if not isinstance(key, str) or not key or not isinstance(totals, dict): + continue + try: + values = { + "i": int(totals.get("input", 0) or 0), + "o": int(totals.get("output", 0) or 0), + "cc": int(totals.get("cacheCreate", totals.get("cacheWrite", 0)) or 0), + "cr": int(totals.get("cacheRead", 0) or 0), + } + except (TypeError, ValueError): + continue + meta = metadata.get(key, {}) + line = json.dumps( + {"t": meta.get("ts") or fallback_ts, "k": key, **values, + "m": meta.get("model", ""), "n": meta.get("title", ""), "_migrated": True}, + separators=(",", ":"), + ) + "\n" + _ledger_fd.write(line) + _ledger_uncompacted_bytes += len(line.encode("utf-8")) + _ledger_fd.flush() + except Exception: + return + + +def init_ledger(root: str) -> None: + """Call once at bridge startup to set the ledger file path.""" + global _ledger_path, _ledger_fd, _ledger_uncompacted_bytes + with _ledger_lock: + if _ledger_fd is not None: + try: + _ledger_fd.close() + except Exception: + pass + _ledger_path = Path(root) / "temp" / _LEDGER_FILENAME + _ledger_path.parent.mkdir(parents=True, exist_ok=True) + _ledger_fd = open(_ledger_path, "a", encoding="utf-8") + try: + _ledger_uncompacted_bytes = _ledger_path.stat().st_size + if _ledger_uncompacted_bytes == 0: + _migrate_legacy_history_unlocked() + if _ledger_uncompacted_bytes >= _COMPACT_THRESHOLD: + _compact_ledger() + except OSError: + _ledger_uncompacted_bytes = 0 + + +def _append_ledger(thread_key: str, inp: int, out: int, cc: int, cr: int) -> None: + global _ledger_uncompacted_bytes + # TUI and conductor processes install the in-memory tracker but never call + # init_ledger(). Keep their historical hot path to one lock-free branch: + # no clock lookup, JSON encoding, byte counting, or ledger lock acquisition. + if _ledger_fd is None: + return + line = json.dumps( + {"t": time.time(), "k": thread_key, "i": inp, "o": out, "cc": cc, "cr": cr}, + separators=(",", ":"), + ) + "\n" + with _ledger_lock: + if _ledger_fd is None: + return + try: + _ledger_fd.write(line) + _ledger_fd.flush() + _ledger_uncompacted_bytes += len(line.encode("utf-8")) + if _ledger_uncompacted_bytes >= _COMPACT_THRESHOLD: + _compact_ledger() + except Exception: + pass + + +def _iter_ledger_unlocked(): + if _ledger_path is None or not _ledger_path.is_file(): + return + try: + with open(_ledger_path, "r", encoding="utf-8") as f: + for line in f: + line = line.strip() + if not line: + continue + try: + entry = json.loads(line) + if isinstance(entry, dict): + yield entry + except (json.JSONDecodeError, ValueError): + continue + except OSError: + return + + +def read_ledger() -> list[dict]: + """Read all valid lines from the ledger. Skips corrupted lines.""" + with _ledger_lock: + return list(_iter_ledger_unlocked()) + + +def _aggregate_sessions(entries) -> dict[str, dict]: + sessions: dict[str, dict] = {} + for e in entries: + k = e.get("k", "") + if not isinstance(k, str) or not k: + continue + try: + ts = float(e.get("t", 0) or 0) + inp = int(e.get("i", 0) or 0) + out = int(e.get("o", 0) or 0) + cc = int(e.get("cc", 0) or 0) + cr = int(e.get("cr", 0) or 0) + except (TypeError, ValueError): + continue + if k not in sessions: + sessions[k] = {"input": 0, "output": 0, "cacheCreate": 0, "cacheRead": 0, + "model": "", "title": "", "first_ts": ts, "last_ts": ts} + s = sessions[k] + s["input"] += inp + s["output"] += out + s["cacheCreate"] += cc + s["cacheRead"] += cr + s["first_ts"] = min(s["first_ts"], ts) + s["last_ts"] = max(s["last_ts"], ts) + if isinstance(e.get("m"), str) and e["m"]: + s["model"] = e["m"] + if isinstance(e.get("n"), str) and e["n"]: + s["title"] = e["n"] + return sessions + + +def _format_aggregate(sessions: dict[str, dict]) -> dict: + history = [] + snap = {} + for k, s in sessions.items(): + sid = k.removeprefix("GA-") + history.append({ + "sessionId": sid, + "title": s["title"] or sid, + "input": s["input"], + "output": s["output"], + "cacheCreate": s["cacheCreate"], + "cacheRead": s["cacheRead"], + "model": s["model"], + "ts": s["last_ts"], + }) + snap[k] = { + "input": s["input"], + "output": s["output"], + "cacheCreate": s["cacheCreate"], + "cacheRead": s["cacheRead"], + } + return {"history": history, "snap": snap} + + +def aggregate_ledger() -> dict: + """Aggregate ledger into {history: [...], snap: {...}} for /token-history.""" + with _ledger_lock: + return _format_aggregate(_aggregate_sessions(_iter_ledger_unlocked())) + + +def _compact_ledger() -> None: + """Compact ledger by aggregating into per-session totals and rewriting.""" + if _ledger_path is None: + return + global _ledger_fd, _ledger_uncompacted_bytes + with _ledger_lock: + temp_path = _ledger_path.with_suffix(".jsonl.tmp") + try: + if _ledger_fd is not None: + _ledger_fd.flush() + sessions = _aggregate_sessions(_iter_ledger_unlocked()) + with open(temp_path, "w", encoding="utf-8") as f: + for k, s in sessions.items(): + line = json.dumps( + {"t": s["last_ts"], "k": k, "i": s["input"], "o": s["output"], + "cc": s["cacheCreate"], "cr": s["cacheRead"], "m": s["model"], + "n": s["title"], + "_compacted": True}, + separators=(",", ":"), + ) + f.write(line + "\n") + f.flush() + os.fsync(f.fileno()) + if _ledger_fd is not None: + _ledger_fd.close() + _ledger_fd = None + os.replace(temp_path, _ledger_path) + _ledger_fd = open(_ledger_path, "a", encoding="utf-8") + _ledger_uncompacted_bytes = 0 + except Exception: + try: + temp_path.unlink(missing_ok=True) + except Exception: + pass + if _ledger_fd is None: + try: + _ledger_fd = open(_ledger_path, "a", encoding="utf-8") + except Exception: + pass + + +# ── Core API ───────────────────────────────────────────────────────────────── def scan_subagent_logs(since: float = 0.0, root: str | None = None) -> TokenStats: """Aggregate subagent tokens from `temp//stdout.log` files; pass @@ -135,6 +377,7 @@ def record_patched(usage, api_mode): if usage: t = get(threading.current_thread().name) t.requests += 1 + inp = cc = cr = 0 if api_mode == 'messages': inp = int(usage.get('input_tokens', 0) or 0) cc = int(usage.get('cache_creation_input_tokens', 0) or 0) @@ -144,18 +387,24 @@ def record_patched(usage, api_mode): # output_tokens here; SSE message_start carries a 1-token # placeholder to skip. out = int(usage.get('output_tokens', 0) or 0) - if out > 1: t.output += out; t.last_output = out + if out > 1: + t.output += out; t.last_output = out + _append_ledger(threading.current_thread().name, inp, out, cc, cr) + else: + _append_ledger(threading.current_thread().name, inp, 0, cc, cr) t.last_input = inp + cc + cr elif api_mode == 'chat_completions': cached = int((usage.get('prompt_tokens_details') or {}).get('cached_tokens', 0) or 0) inp = int(usage.get('prompt_tokens', 0) or 0) - cached t.input += inp; t.cache_read += cached t.last_input = inp + cached + _append_ledger(threading.current_thread().name, inp, 0, 0, cached) elif api_mode == 'responses': cached = int((usage.get('input_tokens_details') or {}).get('cached_tokens', 0) or 0) inp = int(usage.get('input_tokens', 0) or 0) - cached t.input += inp; t.cache_read += cached t.last_input = inp + cached + _append_ledger(threading.current_thread().name, inp, 0, 0, cached) except Exception: pass return orig_record(usage, api_mode) llmcore._record_usage = record_patched @@ -168,6 +417,7 @@ def print_patched(*args, **kwargs): t = get(threading.current_thread().name) n = int(m.group(1)) t.output += n; t.last_output = n + _append_ledger(threading.current_thread().name, 0, n, 0, 0) except Exception: pass return orig_print(*args, **kwargs) llmcore.print = print_patched diff --git a/frontends/data_backup.py b/frontends/data_backup.py new file mode 100644 index 000000000..10e83f99b --- /dev/null +++ b/frontends/data_backup.py @@ -0,0 +1,857 @@ +"""Safe, dependency-free import/export helpers for desktop data snapshots.""" +from __future__ import annotations + +import contextlib +import datetime as dt +import errno +import json +import math +import os +import re +import shutil +import stat +import tempfile +import uuid +import zipfile +from pathlib import Path, PurePosixPath +from typing import Any, Callable, Iterable, Iterator + + +BACKUP_SCHEMA = "genericagent.data-backup" +BACKUP_FORMAT_VERSION = 1 +MAX_ARCHIVE_ENTRIES = 100_000 +MAX_ARCHIVE_UNCOMPRESSED_BYTES = 2 * 1024 * 1024 * 1024 + +_DATA_PREFIXES = ( + PurePosixPath("memory"), + PurePosixPath("temp/model_responses"), + PurePosixPath("temp/desktop_sessions"), +) + +_DESKTOP_SESSION_ID_RE = re.compile(r"[A-Za-z0-9][A-Za-z0-9_-]{0,127}") + + +class BackupFormatError(ValueError): + """Raised when a backup cannot be trusted or is not compatible.""" + + +def _is_relative_to(path: PurePosixPath, parent: PurePosixPath) -> bool: + return path == parent or parent in path.parents + + +def _is_native_relative_to(path: Path, parent: Path) -> bool: + try: + path.relative_to(parent) + return True + except ValueError: + return False + + +def _is_link_or_reparse(path: Path) -> bool: + """Recognise POSIX links plus Windows junction/reparse-point indirection.""" + try: + if path.is_symlink(): + return True + is_junction = getattr(path, "is_junction", None) + if callable(is_junction) and is_junction(): + return True + attributes = int(getattr(os.lstat(path), "st_file_attributes", 0) or 0) + reparse_flag = int(getattr(stat, "FILE_ATTRIBUTE_REPARSE_POINT", 0x400)) + return bool(attributes & reparse_flag) + except OSError: + return False + + +def _resolved_directory(value: str | Path, label: str) -> Path: + raw = Path(value).expanduser() + if _is_link_or_reparse(raw): + raise ValueError(f"{label} cannot be a link or reparse point") + try: + resolved = raw.resolve(strict=True) + except OSError as error: + raise ValueError(f"{label} is unavailable") from error + if not resolved.is_dir() or _is_link_or_reparse(resolved): + raise ValueError(f"{label} is unavailable") + return resolved + + +def _assert_contained(path: Path, root: Path, label: str) -> Path: + try: + resolved = path.resolve(strict=True) + except OSError as error: + raise ValueError(f"{label} is unavailable") from error + if not _is_native_relative_to(resolved, root): + raise ValueError(f"{label} escapes its data root") + return resolved + + +def _archive_path(name: str) -> PurePosixPath: + if not name or "\\" in name: + raise BackupFormatError("invalid backup entry path") + if any(part in ("", ".", "..") for part in name.split("/")): + raise BackupFormatError("invalid backup entry path") + path = PurePosixPath(name) + if path.is_absolute() or any(part in ("", ".", "..") for part in path.parts): + raise BackupFormatError("invalid backup entry path") + return path + + +def _is_allowed_data_path(path: PurePosixPath) -> bool: + return any(_is_relative_to(path, prefix) for prefix in _DATA_PREFIXES) + + +def _iter_regular_files(root: Path) -> Iterator[tuple[Path, PurePosixPath]]: + root = root.resolve() + for folder, dirs, files in os.walk(root, followlinks=False): + folder_path = Path(folder) + if _is_link_or_reparse(folder_path): + raise ValueError(f"data folder contains a link or reparse point: {folder_path}") + safe_dirs: list[str] = [] + for name in sorted(dirs): + candidate = folder_path / name + if _is_link_or_reparse(candidate): + raise ValueError(f"data folder contains a link or reparse point: {candidate}") + _assert_contained(candidate, root, "data folder") + safe_dirs.append(name) + dirs[:] = safe_dirs + for name in sorted(files): + source = folder_path / name + if _is_link_or_reparse(source): + raise ValueError(f"data folder contains a link or reparse point: {source}") + if not source.is_file(): + raise ValueError(f"data folder contains an unsupported file: {source}") + _assert_contained(source, root, "data file") + relative = PurePosixPath(source.relative_to(root).as_posix()) + yield source, relative + + +def _source_files(root: Path) -> list[tuple[Path, PurePosixPath]]: + files: list[tuple[Path, PurePosixPath]] = [] + for prefix in _DATA_PREFIXES: + source_root = root.joinpath(*prefix.parts) + if not source_root.exists(): + continue + if _is_link_or_reparse(source_root) or not source_root.is_dir(): + raise ValueError(f"data folder is not a safe directory: {source_root}") + for source, relative in _iter_regular_files(source_root): + files.append((source, prefix / relative)) + return files + + +def _content_counts(paths: list[PurePosixPath]) -> dict[str, int]: + return { + "memory": sum(_is_relative_to(path, _DATA_PREFIXES[0]) for path in paths), + "responses": sum(_is_relative_to(path, _DATA_PREFIXES[1]) for path in paths), + "sessions": sum(_is_relative_to(path, _DATA_PREFIXES[2]) for path in paths), + } + + +def _normalise_source_mode(value: str) -> str: + if value not in ("included", "localRepository"): + raise BackupFormatError("invalid backup source mode") + return value + + +def _manifest(source_mode: str, paths: list[PurePosixPath]) -> dict: + exported_at = dt.datetime.now(dt.timezone.utc).replace(microsecond=0) + return { + "schema": BACKUP_SCHEMA, + "formatVersion": BACKUP_FORMAT_VERSION, + "exportedAt": exported_at.isoformat().replace("+00:00", "Z"), + "sourceMode": _normalise_source_mode(source_mode), + "content": _content_counts(paths), + } + + +def export_data_backup( + ga_root: str, + destination_path: str, + source_mode: str, + *, + forbidden_roots: Iterable[str | Path] = (), +) -> dict: + root = _resolved_directory(ga_root, "current data source") + raw_destination = Path(destination_path).expanduser() + if _is_link_or_reparse(raw_destination): + raise ValueError("backup destination cannot be a link or reparse point") + destination = raw_destination.resolve() + if destination.suffix.lower() != ".zip": + raise ValueError("backup destination must be a zip file") + if not destination.parent.is_dir() or _is_link_or_reparse(destination.parent): + raise ValueError("backup destination folder does not exist") + protected_roots = [root.joinpath(*prefix.parts).resolve() for prefix in _DATA_PREFIXES] + protected_roots.extend(Path(value).expanduser().resolve() for value in forbidden_roots) + if any(_is_native_relative_to(destination, protected) for protected in protected_roots): + raise ValueError("backup destination is inside protected application data") + + files = _source_files(root) + paths = [relative for _, relative in files] + if not paths: + raise BackupFormatError("backup contains no importable data") + manifest = _manifest(source_mode, paths) + manifest_bytes = ( + json.dumps(manifest, ensure_ascii=False, indent=2) + "\n" + ).encode("utf-8") + if len(files) + 1 > MAX_ARCHIVE_ENTRIES: + raise BackupFormatError("backup contains too many files") + total_bytes = len(manifest_bytes) + for source, _relative in files: + _assert_contained(source, root, "data file") + total_bytes += source.stat().st_size + if total_bytes > MAX_ARCHIVE_UNCOMPRESSED_BYTES: + raise BackupFormatError("backup is too large") + + temp_handle = tempfile.NamedTemporaryFile( + prefix=f".{destination.stem}.", + suffix=".tmp", + dir=destination.parent, + delete=False, + ) + temp_path = Path(temp_handle.name) + temp_handle.close() + try: + with zipfile.ZipFile( + temp_path, + "w", + compression=zipfile.ZIP_DEFLATED, + compresslevel=6, + ) as archive: + archive.writestr("manifest.json", manifest_bytes) + for source, relative in files: + if _is_link_or_reparse(source): + raise ValueError(f"data file became a link or reparse point: {source}") + _assert_contained(source, root, "data file") + archive.write(source, relative.as_posix()) + # Validate the bytes that will actually replace the destination. A source + # can change after the preflight stat, and ZipFile only finalises CRCs and + # the central directory when it closes. + with zipfile.ZipFile(temp_path, "r") as archive: + _validated_zip(archive) + os.replace(temp_path, destination) + except Exception: + with contextlib.suppress(OSError): + temp_path.unlink() + raise + + return { + "ok": True, + "path": str(destination), + "formatVersion": BACKUP_FORMAT_VERSION, + "exportedAt": manifest["exportedAt"], + "sourceMode": manifest["sourceMode"], + "content": manifest["content"], + } + + +def _validated_zip(archive: zipfile.ZipFile) -> tuple[dict, list[zipfile.ZipInfo]]: + infos = archive.infolist() + if len(infos) > MAX_ARCHIVE_ENTRIES: + raise BackupFormatError("backup contains too many files") + total_bytes = sum(info.file_size for info in infos) + if total_bytes > MAX_ARCHIVE_UNCOMPRESSED_BYTES: + raise BackupFormatError("backup is too large") + if archive.testzip() is not None: + raise BackupFormatError("backup is corrupt") + + manifest_info: zipfile.ZipInfo | None = None + data_infos: list[zipfile.ZipInfo] = [] + seen_paths: set[str] = set() + for info in infos: + path = _archive_path(info.filename.rstrip("/")) + folded_path = path.as_posix().casefold() + if folded_path in seen_paths: + raise BackupFormatError("backup contains duplicate file paths") + seen_paths.add(folded_path) + unix_mode = (info.external_attr >> 16) & 0o170000 + if unix_mode == stat.S_IFLNK: + raise BackupFormatError("backup contains links") + if path == PurePosixPath("manifest.json"): + if info.is_dir() or manifest_info is not None: + raise BackupFormatError("backup manifest is invalid") + manifest_info = info + continue + if not _is_allowed_data_path(path): + raise BackupFormatError("backup contains unsupported files") + if not info.is_dir(): + data_infos.append(info) + + if manifest_info is None: + raise BackupFormatError("backup manifest is missing") + try: + manifest = json.loads(archive.read(manifest_info).decode("utf-8")) + except Exception as error: + raise BackupFormatError("backup manifest is invalid") from error + if not isinstance(manifest, dict): + raise BackupFormatError("backup manifest is invalid") + if manifest.get("schema") != BACKUP_SCHEMA: + raise BackupFormatError("backup format is not supported") + if manifest.get("formatVersion") != BACKUP_FORMAT_VERSION: + raise BackupFormatError("backup version is not supported") + _normalise_source_mode(str(manifest.get("sourceMode") or "")) + if not isinstance(manifest.get("exportedAt"), str) or not manifest["exportedAt"]: + raise BackupFormatError("backup export time is missing") + + actual_counts = _content_counts([ + _archive_path(info.filename) for info in data_infos + ]) + if not data_infos: + raise BackupFormatError("backup contains no importable data") + if manifest.get("content") != actual_counts: + raise BackupFormatError("backup content summary does not match its files") + return manifest, data_infos + + +def _legacy_inspection(root: Path) -> dict: + files = _source_files(root) + paths = [relative for _, relative in files] + session_items, _sessions_found, _sessions_skipped = _read_source_sessions(root) + counts = _content_counts(paths) + counts["sessions"] = len(session_items) + if not any(counts.values()): + raise BackupFormatError("not a GA data source (no importable data)") + return { + "ok": True, + "sourceType": "legacyFolder", + "formatVersion": None, + "exportedAt": None, + "sourceMode": None, + "content": counts, + } + + +def inspect_import_source(source_path: str) -> dict: + raw_source = Path(source_path).expanduser() + if _is_link_or_reparse(raw_source): + raise BackupFormatError("import source cannot be a link or reparse point") + source = raw_source.resolve() + if source.is_dir() and not _is_link_or_reparse(source): + return _legacy_inspection(source) + if not source.is_file() or source.suffix.lower() != ".zip": + raise BackupFormatError("select a compatible backup or data folder") + try: + with zipfile.ZipFile(source, "r") as archive: + manifest, _ = _validated_zip(archive) + except zipfile.BadZipFile as error: + raise BackupFormatError("backup is corrupt") from error + return { + "ok": True, + "sourceType": "backupZip", + "formatVersion": manifest["formatVersion"], + "exportedAt": manifest["exportedAt"], + "sourceMode": manifest["sourceMode"], + "content": manifest["content"], + } + + +@contextlib.contextmanager +def materialize_import_source(source_path: str) -> Iterator[Path]: + raw_source = Path(source_path).expanduser() + if _is_link_or_reparse(raw_source): + raise BackupFormatError("import source cannot be a link or reparse point") + source = raw_source.resolve() + inspection = inspect_import_source(str(source)) + if inspection["sourceType"] == "legacyFolder": + yield source + return + + with tempfile.TemporaryDirectory(prefix="genericagent-data-import-") as temp_dir: + target_root = _resolved_directory(temp_dir, "import staging") + try: + with zipfile.ZipFile(source, "r") as archive: + _, data_infos = _validated_zip(archive) + for info in data_infos: + relative = _archive_path(info.filename) + target = target_root.joinpath(*relative.parts) + _assert_safe_new_target(target_root, target) + target.parent.mkdir(parents=True, exist_ok=True) + _assert_contained(target.parent, target_root, "import destination") + if target.exists() or _is_link_or_reparse(target): + raise BackupFormatError("backup contains duplicate or unsafe paths") + with archive.open(info, "r") as reader, target.open("wb") as writer: + shutil.copyfileobj(reader, writer) + _assert_contained(target, target_root, "import destination") + except zipfile.BadZipFile as error: + raise BackupFormatError("backup is corrupt") from error + yield target_root + + +def _is_desktop_session_id(value: object) -> bool: + if not isinstance(value, str): + return False + session_id = value + return ( + not session_id.startswith("tui_") + and _DESKTOP_SESSION_ID_RE.fullmatch(session_id) is not None + ) + + +def _finite_timestamp(value: object, default: float) -> float: + if value is None: + return default + if isinstance(value, bool) or not isinstance(value, (int, float)): + raise BackupFormatError("session timestamp is invalid") + timestamp = float(value) + if not math.isfinite(timestamp): + raise BackupFormatError("session timestamp is invalid") + return timestamp + + +def _non_negative_integer(value: object, default: int, label: str) -> int: + if value is None: + return default + if isinstance(value, bool) or not isinstance(value, int) or value < 0: + raise BackupFormatError(f"session {label} is invalid") + return value + + +def _record_list(value: object, default: list[dict], label: str) -> list[dict]: + if value is None: + return list(default) + if not isinstance(value, list) or not all(isinstance(item, dict) for item in value): + raise BackupFormatError(f"session {label} is invalid") + return value + + +def canonical_session_record( + item: object, + *, + default_cwd: str = "", + now: float | None = None, +) -> dict[str, Any]: + """Validate and reduce an imported/persisted Desktop session to its schema.""" + if not isinstance(item, dict): + raise BackupFormatError("session record is invalid") + session_id = item.get("id") + if not _is_desktop_session_id(session_id): + raise BackupFormatError("session id is invalid") + current_time = float(now if now is not None else dt.datetime.now().timestamp()) + title = item.get("title", "New chat") + cwd = item.get("cwd", default_cwd) + plan_path = item.get("plan_path", "") + if not isinstance(title, str) or not isinstance(cwd, str) or not isinstance(plan_path, str): + raise BackupFormatError("session text field is invalid") + messages = _record_list(item.get("messages"), [], "messages") + llm_history_value = item.get("llm_history") + llm_history = None if llm_history_value is None else _record_list( + llm_history_value, [], "llm history" + ) + llm_no_value = item.get("llm_no") + llm_no = None if llm_no_value is None else _non_negative_integer( + llm_no_value, 0, "model index" + ) + pinned = item.get("pinned", False) + untitled = item.get("untitled", True) + if not isinstance(pinned, bool) or not isinstance(untitled, bool): + raise BackupFormatError("session boolean field is invalid") + return { + "id": session_id, + "title": title, + "cwd": cwd, + "created_at": _finite_timestamp(item.get("created_at"), current_time), + "updated_at": _finite_timestamp(item.get("updated_at"), current_time), + "messages": messages, + "msg_seq": _non_negative_integer(item.get("msg_seq"), 0, "message sequence"), + "pinned": pinned, + "untitled": untitled, + "plan_scan_baseline": _non_negative_integer( + item.get("plan_scan_baseline"), 0, "plan baseline" + ), + "plan_path": plan_path, + "llm_no": llm_no, + "llm_history": llm_history, + } + + +def _read_source_sessions(source: Path) -> tuple[list[dict], bool, int]: + """Read supported Desktop session stores without trusting filenames. + + Corrupt/non-Desktop records are skipped. The skipped count is intentionally + record-oriented; an unreadable file counts as one skipped source record. + """ + items: list[dict] = [] + found = False + skipped = 0 + sessions_dir = source / "temp" / "desktop_sessions" + if sessions_dir.exists() and _is_link_or_reparse(sessions_dir): + raise ValueError(f"session source contains a link or reparse point: {sessions_dir}") + if sessions_dir.is_dir(): + for session_file in sorted(sessions_dir.glob("*.json")): + if _is_link_or_reparse(session_file): + raise ValueError( + f"session source contains a link or reparse point: {session_file}" + ) + if not session_file.is_file(): + raise ValueError(f"session source contains an unsupported file: {session_file}") + found = True + try: + raw_item = json.loads(session_file.read_text(encoding="utf-8")) + item = canonical_session_record(raw_item) + except (OSError, UnicodeError, json.JSONDecodeError, ValueError): + skipped += 1 + continue + items.append(item) + + for legacy in ( + source / "temp" / "desktop_sessions.json", + source / "temp" / "desktop_sessions.json.migrated", + ): + if _is_link_or_reparse(legacy): + raise ValueError(f"session source contains a link or reparse point: {legacy}") + if not legacy.is_file(): + continue + found = True + try: + document = json.loads(legacy.read_text(encoding="utf-8")) + except (OSError, UnicodeError, json.JSONDecodeError, ValueError): + skipped += 1 + continue + if not isinstance(document, list): + skipped += 1 + continue + for item in document: + try: + items.append(canonical_session_record(item)) + except ValueError: + skipped += 1 + return items, found, skipped + + +def _existing_session_ids(destination_root: Path) -> set[str]: + ids: set[str] = set() + sessions_dir = destination_root / "temp" / "desktop_sessions" + if _is_link_or_reparse(sessions_dir): + raise ValueError(f"session destination contains a link or reparse point: {sessions_dir}") + if not sessions_dir.is_dir(): + return ids + for session_file in sorted(sessions_dir.glob("*.json")): + if _is_link_or_reparse(session_file): + raise ValueError( + f"session destination contains a link or reparse point: {session_file}" + ) + if not session_file.is_file(): + raise ValueError(f"session destination contains an unsupported file: {session_file}") + if _is_desktop_session_id(session_file.stem): + ids.add(session_file.stem) + try: + item = canonical_session_record( + json.loads(session_file.read_text(encoding="utf-8")) + ) + except (OSError, UnicodeError, json.JSONDecodeError, ValueError): + continue + ids.add(item["id"]) + return ids + + +def _remove_path(path: Path) -> None: + if _is_link_or_reparse(path) or path.is_file(): + path.unlink() + elif path.is_dir(): + shutil.rmtree(path) + + +def _copy_tree_strict(source: Path, destination: Path) -> None: + """Copy a complete tree while refusing links and special files.""" + if _is_link_or_reparse(source) or not source.is_dir(): + raise ValueError(f"cannot safely copy data folder: {source}") + destination.mkdir(parents=True, exist_ok=False) + for item in sorted(source.iterdir(), key=lambda path: path.name): + if _is_link_or_reparse(item): + raise ValueError(f"data folder contains a link or reparse point: {item}") + _assert_contained(item, source, "data item") + target = destination / item.name + if item.is_dir(): + _copy_tree_strict(item, target) + elif item.is_file(): + shutil.copy2(item, target) + else: + raise ValueError(f"data folder contains an unsupported file: {item}") + + +def _prepare_overlay_target(root: Path, relative: PurePosixPath) -> Path: + current = root + for part in relative.parts[:-1]: + current = current / part + if _is_link_or_reparse(current): + raise ValueError(f"memory destination contains a link or reparse point: {current}") + if current.exists() and not current.is_dir(): + _remove_path(current) + current.mkdir(exist_ok=True) + _assert_contained(current, root, "memory destination") + target = root.joinpath(*relative.parts) + if _is_link_or_reparse(target): + raise ValueError(f"memory destination contains a link or reparse point: {target}") + if target.is_dir(): + _remove_path(target) + return target + + +def _assert_safe_new_target(root: Path, target: Path) -> None: + relative = target.relative_to(root) + current = root + for part in relative.parts[:-1]: + current = current / part + if _is_link_or_reparse(current): + raise ValueError(f"data destination contains a link or reparse point: {current}") + if current.exists() and not current.is_dir(): + raise ValueError(f"data destination parent is not a directory: {current}") + if current.exists(): + _assert_contained(current, root, "data destination") + if _is_link_or_reparse(target): + raise ValueError(f"data destination contains a link or reparse point: {target}") + + +def _new_backup_path(destination_root: Path) -> Path: + timestamp = dt.datetime.now().strftime("%Y%m%d_%H%M%S_%f") + backup_parent = destination_root / "temp" + for suffix in range(1000): + tail = "" if suffix == 0 else f"_{suffix}" + candidate = backup_parent / f"memory_import_backup_{timestamp}{tail}" + if not candidate.exists() and not _is_link_or_reparse(candidate): + return candidate + raise OSError("cannot allocate a unique memory backup directory") + + +def _create_memory_backup(destination_root: Path, memory_root: Path) -> Path: + backup_dir = _new_backup_path(destination_root) + backup_parent = backup_dir.parent + if _is_link_or_reparse(backup_parent) or ( + backup_parent.exists() and not backup_parent.is_dir() + ): + raise ValueError("current backup destination is not a safe directory") + backup_parent.mkdir(parents=True, exist_ok=True) + _assert_contained(backup_parent, destination_root, "backup destination") + staging = backup_parent / f".{backup_dir.name}.staging-{uuid.uuid4().hex}" + try: + staging.mkdir() + _copy_tree_strict(memory_root, staging / "memory") + os.replace(staging, backup_dir) + except Exception: + with contextlib.suppress(OSError): + _remove_path(staging) + raise + return backup_dir + + +def _install_file_add_only(staged: Path, target: Path) -> None: + """Install one staged file without ever replacing an existing path.""" + try: + os.link(staged, target, follow_symlinks=False) + except OSError as error: + unsupported_link_errors = { + errno.EINVAL, + errno.EPERM, + errno.EXDEV, + getattr(errno, "ENOTSUP", errno.EINVAL), + getattr(errno, "EOPNOTSUPP", errno.EINVAL), + } + if error.errno not in unsupported_link_errors: + raise + + # Some removable/network filesystems do not implement hard links. + # O_EXCL retains the add-only contract there; a failed copy removes + # only the path this call successfully created. + flags = os.O_WRONLY | os.O_CREAT | os.O_EXCL + flags |= getattr(os, "O_BINARY", 0) + descriptor: int | None = None + created = False + try: + descriptor = os.open(target, flags, stat.S_IMODE(staged.stat().st_mode)) + created = True + with staged.open("rb") as reader, os.fdopen(descriptor, "wb") as writer: + descriptor = None + shutil.copyfileobj(reader, writer) + writer.flush() + os.fsync(writer.fileno()) + except Exception: + if descriptor is not None: + with contextlib.suppress(OSError): + os.close(descriptor) + if created: + with contextlib.suppress(OSError): + target.unlink() + raise + with contextlib.suppress(OSError): + staged.unlink() + + +def merge_data_files( + source_dir: str, + ga_root: str, + *, + existing_session_ids: Iterable[str] | None = None, + session_preparer: Callable[[dict], object] | None = None, +) -> dict[str, Any]: + """Transactionally merge a validated data tree into ``ga_root``. + + ``memory`` is source-wins after a durable full backup, responses and + Desktop sessions are add-only, and any activation error rolls back files + installed by this call. ``session_preparer`` lets the bridge validate and + construct its in-memory Session objects before any destination is changed. + """ + source = _resolved_directory(source_dir, "source data folder") + destination_root = _resolved_directory(ga_root, "current data destination") + if source == destination_root: + raise ValueError("source is the same as current data") + + inspection = _legacy_inspection(source) + source_memory = source.joinpath(*_DATA_PREFIXES[0].parts) + source_responses = source.joinpath(*_DATA_PREFIXES[1].parts) + destination_memory = destination_root.joinpath(*_DATA_PREFIXES[0].parts) + destination_responses = destination_root.joinpath(*_DATA_PREFIXES[1].parts) + has_source_memory = source_memory.is_dir() and not _is_link_or_reparse(source_memory) + + memory_files = list(_iter_regular_files(source_memory)) if has_source_memory else [] + response_files: list[tuple[Path, PurePosixPath, Path]] = [] + responses_skipped = 0 + if source_responses.exists() and _is_link_or_reparse(source_responses): + raise ValueError(f"response source contains a link or reparse point: {source_responses}") + if source_responses.is_dir(): + for item, relative in _iter_regular_files(source_responses): + target = destination_responses.joinpath(*relative.parts) + if target.exists() or _is_link_or_reparse(target): + responses_skipped += 1 + continue + _assert_safe_new_target(destination_root, target) + response_files.append((item, relative, target)) + + source_session_items, sessions_found, sessions_skipped = _read_source_sessions(source) + known_session_ids = _existing_session_ids(destination_root) + if existing_session_ids is not None: + known_session_ids.update( + str(value) for value in existing_session_ids if _is_desktop_session_id(value) + ) + planned_session_ids: set[str] = set() + session_files: list[tuple[str, dict, Path, object]] = [] + for item in source_session_items: + session_id = item.get("id") + if not _is_desktop_session_id(session_id): + sessions_skipped += 1 + continue + session_id = str(session_id) + target = destination_root / "temp" / "desktop_sessions" / f"{session_id}.json" + if ( + session_id in known_session_ids + or session_id in planned_session_ids + or target.exists() + or _is_link_or_reparse(target) + ): + sessions_skipped += 1 + continue + _assert_safe_new_target(destination_root, target) + try: + prepared = session_preparer(item) if session_preparer is not None else item + except Exception: + sessions_skipped += 1 + continue + planned_session_ids.add(session_id) + session_files.append((session_id, item, target, prepared)) + + backup_dir = "" + prepared_sessions = [entry[3] for entry in session_files] + with tempfile.TemporaryDirectory( + prefix=".genericagent-memory-import-", + dir=destination_root, + ) as temp_dir: + staging_root = Path(temp_dir) + if _is_link_or_reparse(staging_root): + raise ValueError("import staging cannot be a link or reparse point") + _assert_contained(staging_root, destination_root, "import staging") + staged_memory = staging_root / "memory" + if has_source_memory: + if _is_link_or_reparse(destination_memory) or ( + destination_memory.exists() and not destination_memory.is_dir() + ): + raise ValueError("current memory destination is not a safe directory") + if destination_memory.is_dir(): + _copy_tree_strict(destination_memory, staged_memory) + else: + staged_memory.mkdir() + for item, relative in memory_files: + target = _prepare_overlay_target(staged_memory, relative) + target.parent.mkdir(parents=True, exist_ok=True) + shutil.copy2(item, target) + + staged_responses: list[tuple[Path, Path]] = [] + for item, relative, target in response_files: + staged = staging_root / "responses" / Path(*relative.parts) + staged.parent.mkdir(parents=True, exist_ok=True) + shutil.copy2(item, staged) + staged_responses.append((staged, target)) + + staged_sessions: list[tuple[Path, Path]] = [] + for session_id, item, target, _prepared in session_files: + staged = staging_root / "sessions" / f"{session_id}.json" + staged.parent.mkdir(parents=True, exist_ok=True) + staged.write_text( + json.dumps(item, ensure_ascii=False, default=str), + encoding="utf-8", + ) + staged_sessions.append((staged, target)) + + memory_nonempty = ( + destination_memory.is_dir() + and next(destination_memory.iterdir(), None) is not None + ) + if has_source_memory and memory_nonempty: + backup_dir = str(_create_memory_backup(destination_root, destination_memory)) + + installed_files: list[Path] = [] + previous_memory = staging_root / "previous-memory" + memory_original_moved = False + memory_activated = False + memory_existed = destination_memory.is_dir() + try: + if has_source_memory: + if memory_existed: + os.replace(destination_memory, previous_memory) + memory_original_moved = True + os.replace(staged_memory, destination_memory) + memory_activated = True + + for staged, target in (*staged_responses, *staged_sessions): + if target.exists() or _is_link_or_reparse(target): + raise OSError(f"data destination changed during import: {target}") + _assert_safe_new_target(destination_root, target) + target.parent.mkdir(parents=True, exist_ok=True) + # Staging shares the destination filesystem. A hard link gives + # POSIX/Windows create-if-absent semantics: unlike replace(), it + # cannot overwrite a response/session created concurrently. + _install_file_add_only(staged, target) + installed_files.append(target) + except Exception as error: + rollback_errors: list[str] = [] + for target in reversed(installed_files): + try: + target.unlink() + except OSError as rollback_error: + rollback_errors.append(str(rollback_error)) + if memory_activated or memory_original_moved: + try: + if destination_memory.exists() or _is_link_or_reparse(destination_memory): + _remove_path(destination_memory) + if memory_original_moved: + os.replace(previous_memory, destination_memory) + except OSError as rollback_error: + rollback_errors.append(str(rollback_error)) + if rollback_errors: + raise OSError( + f"data import failed: {error}; rollback failed: " + + "; ".join(rollback_errors) + ) from error + raise + + result: dict[str, Any] = { + "ok": True, + "memoryCopied": len(memory_files), + "memorySkipped": 0, + "responsesCopied": len(response_files), + "responsesSkipped": responses_skipped, + "sessionsAdded": len(session_files), + "sessionsSkipped": sessions_skipped, + "sessionsFileFound": sessions_found, + "backupDir": backup_dir, + "sourceType": inspection["sourceType"], + } + if session_preparer is not None: + result["_preparedSessions"] = prepared_sessions + return result diff --git a/frontends/desktop/DESIGN.md b/frontends/desktop/DESIGN.md new file mode 100644 index 000000000..8be94dc64 --- /dev/null +++ b/frontends/desktop/DESIGN.md @@ -0,0 +1,100 @@ +# GenericAgent Desktop 2.0 integration boundary + +GenericAgent Desktop 2.0 is a packaged Tauri desktop application with a generated React renderer and +Desktop-specific Python services. The React source is intentionally developed outside this upstream tree; +the generated distribution and all runtime interfaces required to execute it are tracked here. + +## Renderer ownership + +- `frontends/desktop/dist/**` contains the generated Desktop 2.0 HTML, JavaScript, CSS, fonts, and images. +- `frontends/desktop/static/**` is the independent Desktop v1 implementation and remains available unchanged. +- Tauri packages `dist/**`; it does not compile React during an upstream build. +- The public React source, issue tracker, and contribution home is + . +- The exact fork commit and generated-file content manifest are recorded in + `dist/build-provenance.json`. + +Generated files must not be edited by hand. Renderer changes are made and tested in the fork, rebuilt from an +accepted fork `main` commit, and submitted upstream as a refreshed `dist/**` tree with matching provenance. +The manifest identifies the submitted bytes; it is not a claim that later builds are bit-for-bit reproducible. + +The production Tauri configuration loads only the tracked asset origin and applies an explicit Content Security +Policy. React source tooling is absent from the upstream package path, while WebDriver permission remains isolated +to `tauri.e2e.conf.json` and is not granted by the production configuration. + +## Desktop runtime ownership + +Desktop 2.0 uses these repository-owned integration layers: + +- `frontends/desktop_bridge.py`: local HTTP/WebSocket API, model/session/upload/data routes, service control, + identity, and Desktop diagnostics. +- `frontends/conductor.py`: Desktop collaboration and model-routing integration. +- `frontends/cost_tracker.py`: Desktop usage and cost ledger. +- `frontends/data_backup.py`: validated Desktop data export, inspection, and import/merge behavior. +- `frontends/desktop_settings.py`: locked, atomic read/modify/write updates for shared Desktop preferences. +- `frontends/desktop/src-tauri/**`: native bootstrap, permissions, file pickers, runtime/source switching, + process/port recovery, window behavior, and package resource resolution. + +The package-owned bridge remains the executable service boundary. `GA_ROOT` can point it at a compatible +external GenericAgent repository, but does not replace the package-owned bridge or Tauri shell. + +Desktop data import first backs up the complete destination `memory/**` tree, then applies source-wins memory +files. Model responses remain add-only, and Desktop sessions are de-duplicated by session ID. Activation is staged +and rolled back on failure. Import is rejected while a managed session or Desktop extra has unfinished work; users +must also stop any independent TUI, CLI, or automation process before importing because those external processes +are outside the bridge's maintenance gate. The persistent cost ledger is initialized by the Desktop bridge only; +existing TUI and conductor processes retain their previous in-memory accounting hot path. + +Browser-origin requests are accepted only from the production Tauri origins, the fixed development origin, the +explicit E2E origin, or the bridge's own same origin. Native clients without an Origin remain supported, while +cross-site, null, lookalike, wrong-port, preflight, and WebSocket requests are rejected before route handling. +Backup exports cannot be written into any managed data or HTTP-readable directory. + +Managed-service state is based on the bridge-owned live child process, not merely a listener on the configured +port. A foreign conductor on production port `8900` is reported as an external port conflict and is never stopped +or counted as an owned running extra. The alternate conductor port is available only to the isolated package E2E +journey; production renderer and CSP contracts remain fixed to `8900`. + +On macOS, the package runtime uses a stable writable root and is refreshed through a package/build/source marker +with staged atomic activation. A previously shipped versioned runtime is migrated into that stable root. User +configuration, memory, responses, sessions, and token ledger data are preserved; a failed migration or activation +restores the previous runtime and marker. Matching markers keep the hot-start copy untouched. + +## Core runtime boundary + +Desktop 2.0 does not own or modify GenericAgent's Agent/LLM/Harness business runtime. In particular, the +integration does not change `agentmain.py`, LLM execution, Harness/Agent execution, inference, tool-calling, +or memory-scheduling semantics. Desktop bridge and conductor changes translate Desktop requests onto those +existing core contracts. + +## Version and release contract + +Desktop package metadata is `0.2.0` across npm, Cargo, Tauri, and generated provenance. Upstream packages consume +the tracked `dist/**` tree, so an upstream maintainer can build official Windows, Linux, and macOS artifacts +without the React source. A `desktop-portable-*` tag starts three read-only platform builders. One separate +publisher receives write permission only after all three succeed, validates the six expected files and checksums, +creates an invisible draft with all assets, and then exposes that single entry as a prerelease. Manual +`workflow_dispatch` runs produce candidate artifacts only and skip the publisher. + +The Linux builder runs on Ubuntu 22.04, isolates Rust target/bin caches from newer runner ABIs, and rejects any +ELF requiring a GLIBC version newer than 2.35. Windows remains unsigned and documents SmartScreen plus checksum +verification; macOS remains ad-hoc signed and unnotarized. + +The renderer still uses the existing local loopback bridge contract. This integration neither treats that inherited +platform requirement as a new release blocker nor claims to have changed operating-system loopback policy. + +## Validation layers + +- Compiled distribution contract: required entries, asset references, source-map/source leakage, E2E markers, + version consistency, exact provenance manifest, and the `dist` package entry. +- Python contracts: bridge, conductor, model routing, sessions, uploads, cost ledger, `GA_ROOT`, and data backup. +- Rust contracts: formatting, clippy, production and E2E feature tests, and + path/identity/port/diagnostic/bootstrap behavior. +- Native package contract: Linux Tauri build smoke plus the platform release workflow. + +Optional platform release qualification lives under `frontends/desktop/release_qualification/**`. +Its automated evidence gate validates package behavior and cleanup; screenshots and manual visual checklists +remain separate release-owner review material rather than CI pass/fail inputs. + +The richer React unit/browser/native E2E suites remain in the fork and run before its accepted `main` SHA is +used to refresh the generated upstream distribution. diff --git a/frontends/desktop/dist/README.md b/frontends/desktop/dist/README.md new file mode 100644 index 000000000..e1276895c --- /dev/null +++ b/frontends/desktop/dist/README.md @@ -0,0 +1,66 @@ +# GenericAgent React Desktop 2.0 — compiled distribution + +This directory contains generated HTML, JavaScript, CSS, fonts, images, and license notices for the +GenericAgent React Desktop 2.0 renderer. It is build output, not the React development tree. + +## Source and contributions + +The public React source of truth and the place for renderer issues, pull requests, and design feedback is: + +- +- Exact source used for this distribution: + [`21f12f6dfe57ada8572bb21fe6604caac230b1cf`](https://github.com/abraxas914/GenericAgent/commit/21f12f6dfe57ada8572bb21fe6604caac230b1cf) + +Over the two-month React Desktop 2.0 development cycle, [abraxas914](https://github.com/abraxas914) led the new +renderer architecture and UI, Desktop bridge and Tauri integration, startup and recovery surfaces, package +validation, browser/native end-to-end coverage, renderer security hardening, and bundle optimization. Please +open an Issue or pull request in the fork above when proposing React renderer changes so source and generated +output stay synchronized. + +[yiqi-017](https://github.com/yiqi-017) contributed user-facing help and feedback contacts that remain in the +compiled renderer, including the +[`help and feedback` settings work](https://github.com/abraxas914/GenericAgent/commit/5ddf03bb152666637bdfcfa44f1fac3cff5a66b6) +and [`startup recovery` support contacts](https://github.com/abraxas914/GenericAgent/commit/2fb55d944e4444b08cb9ad76c13aef7a5788186b). +He also produced an earlier +[`compiled-only delivery` prototype](https://github.com/abraxas914/GenericAgent/commit/3e7ca6a2b20eefdb3ee335dc0d520c3b6d9d57f8) +that helped establish this upstream packaging boundary. The current generated tree was rebuilt by abraxas914 +from the exact merged source commit recorded above. + +## Third-party software: Semi Design + +This distribution contains code from these nine Semi Design packages, all resolved at version `2.101.0`: + +- `@douyinfe/semi-animation` +- `@douyinfe/semi-animation-react` +- `@douyinfe/semi-animation-styled` +- `@douyinfe/semi-foundation` +- `@douyinfe/semi-icons` +- `@douyinfe/semi-illustrations` +- `@douyinfe/semi-json-viewer-core` +- `@douyinfe/semi-theme-default` +- `@douyinfe/semi-ui` + +- Project: +- Website: +- Copyright (c) 2021 DouyinFE +- License: MIT + +The complete license text and bundled third-party notices are in +[`THIRD_PARTY_NOTICES.txt`](./THIRD_PARTY_NOTICES.txt) in this directory. + +## Repository boundary + +- `frontends/desktop/dist/**` is the generated React Desktop 2.0 renderer used by the packaged Tauri app. +- `frontends/desktop/static/**` remains the independent legacy Desktop v1 implementation; this distribution + neither replaces nor modifies its source files. +- The complete Desktop 2.0 integration also uses the repository's Desktop-specific bridge, conductor, cost + tracking, data-backup, bootstrap, permissions, and Tauri shell code. +- The integration does **not** modify GenericAgent's Agent, LLM, Harness, inference, tool-calling, or memory + scheduling core runtime. +- `build-provenance.json` records the source repository, exact source commit, generated file count, and a + content-manifest SHA-256. This README and the provenance file are excluded from that manifest. The manifest + identifies this exact generated tree; it is not a claim that later builds are bit-for-bit reproducible. + +Upstream maintainers can package the tracked distribution directly without the React source. React changes +should be built and validated in the fork, then submitted here as a refreshed generated tree with updated +provenance and matching Desktop integration contracts. diff --git a/frontends/desktop/dist/THIRD_PARTY_NOTICES.txt b/frontends/desktop/dist/THIRD_PARTY_NOTICES.txt new file mode 100644 index 000000000..c21c5cc79 --- /dev/null +++ b/frontends/desktop/dist/THIRD_PARTY_NOTICES.txt @@ -0,0 +1,83 @@ +MIT License + +Copyright (c) 2021 DouyinFE + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +The code implementation of the external library is referenced by DouyinFe are: + +- animate.css + + The MIT License (MIT) + + Copyright (c) 2020 Daniel Eden + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE. + +- Ant Design + MIT LICENSE + + Copyright (c) 2015-present Ant UED, https://xtech.antfin.com/ + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + "Software"), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +- rc-tree + + MIT LICENSE + + Copyright (c) 2015-present Alipay.com, https://www.alipay.com/ + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/frontends/desktop/dist/assets/Animation-TKQfYYOo.js b/frontends/desktop/dist/assets/Animation-TKQfYYOo.js new file mode 100644 index 000000000..def12695c --- /dev/null +++ b/frontends/desktop/dist/assets/Animation-TKQfYYOo.js @@ -0,0 +1 @@ +import{g as q}from"./tauri-compat-tfiFK9EG.js";var x,P;function Q(){if(P)return x;P=1;var i=4,t=.001,e=1e-7,s=10,n=11,a=1/(n-1),c=typeof Float32Array=="function";function l(u,o){return 1-3*o+3*u}function g(u,o){return 3*o-6*u}function T(u){return 3*u}function r(u,o,f){return((l(o,f)*u+g(o,f))*u+T(o))*u}function h(u,o,f){return 3*l(o,f)*u*u+2*g(o,f)*u+T(o)}function C(u,o,f,p,y){var m,_,F=0;do _=o+(f-o)/2,m=r(_,p,y)-u,m>0?f=_:o=_;while(Math.abs(m)>e&&++F=t?b(v,A,o,p):k===0?A:C(v,S,S+a,o,p)}return function(S){return S===0?0:S===1?1:r(F(S),f,y)}},x}var K=Q();const z=q(K);function B(i,t,e){return Math.min(Math.max(i,t),e)}function W(i){const t=/\(([^)]+)\)/.exec(i);return t?t[1].split(",").map(e=>parseFloat(e)):[]}function V(){let i=arguments.length>0&&arguments[0]!==void 0?arguments[0]:1,t=arguments.length>1&&arguments[1]!==void 0?arguments[1]:.5;const e=B(i,1,10),s=B(t,.1,2);return n=>n===0||n===1?n:-e*Math.pow(2,10*(n-1))*Math.sin((n-1-s/(Math.PI*2)*Math.asin(1/e))*(Math.PI*2)/s)}const N=(()=>{const i=["Quad","Cubic","Quart","Quint","Sine","Expo","Circ","Back","Elastic"],t={In:[[.55,.085,.68,.53],[.55,.055,.675,.19],[.895,.03,.685,.22],[.755,.05,.855,.06],[.47,0,.745,.715],[.95,.05,.795,.035],[.6,.04,.98,.335],[.6,-.28,.735,.045],V],Out:[[.25,.46,.45,.94],[.215,.61,.355,1],[.165,.84,.44,1],[.23,1,.32,1],[.39,.575,.565,1],[.19,1,.22,1],[.075,.82,.165,1],[.175,.885,.32,1.275],(s,n)=>a=>1-V(s,n)(1-a)],InOut:[[.455,.03,.515,.955],[.645,.045,.355,1],[.77,0,.175,1],[.86,0,.07,1],[.445,.05,.55,.95],[1,0,0,1],[.785,.135,.15,.86],[.68,-.55,.265,1.55],(s,n)=>a=>a<.5?V(s,n)(a*2)/2:1-V(s,n)(a*-2+2)/2]},e={linear:[.25,.25,.75,.75]};for(const s of Object.keys(t))t[s].forEach((n,a)=>{e["ease"+s+i[a]]=n});return e})();function D(i){if(typeof i=="function")return i;!i||typeof i!="string"?i="linear":i=i.trim();let t=i.split("(")[0];const e=W(i);let s;return t==="cubic-bezier"||t==="cubicBezier"?z(...e.length?e:N.linear):((!t||typeof t!="string"||typeof t=="string"&&N[t]==null)&&(t="linear"),s=N[t],typeof s=="function"?s(...e):e.length?z(...e):z(...s))}class Z{constructor(){this._eventMap=new Map}on(t,e){return t&&typeof e=="function"&&(this._eventMap.has(t)||this._eventMap.set(t,[]),this._eventMap.get(t).push(e)),this}once(t,e){var s=this;if(t&&typeof e=="function"){const n=function(){e(...arguments),s.off(t,n)};this.on(t,n)}}off(t,e){if(t)if(typeof e=="function"){const s=this._eventMap.get(t);if(Array.isArray(s)&&s.length){let n=-1;for(;(n=s.findIndex(a=>a===e))>-1;)s.splice(n,1)}}else e==null&&this._eventMap.delete(t);return this}emit(t){for(var e=arguments.length,s=new Array(e>1?e-1:0),n=1;na(...s)),!0):!1}}function M(i){return!!(i&&typeof i=="object"&&(i.duration>0||typeof i.easing=="string"||typeof i.easing=="function"))}function H(i,t,e,s,n){for(const a of Object.keys(t)){const c=t[a],l=typeof c=="number"?c:c.val;if(!(typeof c=="object"&&c.done)){if(M(c)&&s&&n&&c.duration){if(c.duration+s<=n||l!==i[a])return!1}else if(typeof e[a]=="number"&&e[a]!==0)return!1;if(i[a]!==l)return!1}}return!0}function E(i){const t={};for(const e in i)Object.prototype.hasOwnProperty.call(i,e)&&(t[e]=typeof i[e]=="number"?i[e]:i[e].val);return t}const I=[0,0];function L(i,t,e,s,n,a,c){const l=-n*(t-s),g=-a*e,T=l+g,r=e+T*i,h=t+r*i;return Math.abs(r)1&&arguments[1]!==void 0?arguments[1]:{};if(M(t)){const s=D(t.easing),n=typeof t.duration=="number"&&t.duration>0?t.duration:1e3;t=Object.assign(Object.assign({},t),{easing:s,duration:n})}let e=Object.assign(Object.assign(Object.assign({},Y),t),{done:!1});if(i&&typeof i=="object"&&"val"in i){if(M(i)){const s=D(i.easing),n=typeof i.duration=="number"&&i.duration>0?i.duration:parseInt(t.duration)||1e3;i=Object.assign(Object.assign({},i),{easing:s,duration:n})}e=Object.assign(Object.assign({},e),i)}else e=Object.assign(Object.assign({},e),{val:i});return e}const w=()=>Date.now(),O=1e3/60;class tt extends Z{constructor(){let t=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{},e=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{};super(),this._props=Object.assign({},t),this._config=Object.assign({},e),this.initStates()}_wrapConfig(t,e){e=e&&typeof e=="object"?e:this._config;const s={};for(const n of Object.keys(t))s[n]=G(t[n],e);return s}initStates(t,e){t=t&&typeof t=="object"?t:this._props,e=e&&typeof e=="object"?e:this._config;const{from:s,to:n}=t;if(this._from={},s)for(const l of Object.keys(s))this._from[l]=typeof s[l]=="object"&&s[l].val?s[l].val:s[l];this._to=this._wrapConfig(n,e),this._delay=parseInt(e.delay)||0;const a=this._from&&E(this._from)||E(this._to),c=J(a);this._currentStyle=Object.assign({},a),this._currentVelocity=Object.assign({},c),this._lastIdealStyle=Object.assign({},a),this._lastIdealVelocity=Object.assign({},c),this.resetPlayStates(),this._frameCount=0,this._prevTime=0}animate(){this._timer==null&&(this._timer=requestAnimationFrame(t=>{const e=w();if(H(this._currentStyle,this._to,this._currentVelocity,this._startedTime||e,e)||this._ended||this._stopped){this._wasAnimating&&!this._ended&&!this._stopped&&(this._timer=setTimeout(()=>{clearTimeout(this._timer),this._timer=null,this._ended=!0,this.emit("rest",this.getCurrentStates())},O)),this.resetPlayStates();return}this._started||(this._started=!0,this.emit("start",this.getCurrentStates())),this._stopped=!1,this._paused=!1,this._wasAnimating=!0,this._startedTime===0&&(this._startedTime=e);const s=e,n=s-this._prevTime;this._prevTime=s,s-this._startedTime=this._startedTime+f&&(d=b,h.done=!0),a[r]=d,l[r]=d}else if(b!=null&&b===this._currentStyle[r])l[r]=b,g[r]=0,a[r]=b,c[r]=0;else{const o=(this._accumulatedTime[r]-Math.floor(this._accumulatedTime[r]/O)*O)/O,f=Math.floor(this._accumulatedTime[r]/O);for(let m=0;m{const n=setInterval(()=>a(Date.now()),1e3);return()=>clearInterval(n)},[]),l.jsx(l.Fragment,{children:R(c-e)})}const D=200;function P({message:e}){const c=e.role==="user",a=e.role==="conductor";return l.jsx("div",{className:`collab-msg collab-msg--${e.role}`,"data-slot":"collab-msg",children:l.jsxs("div",{className:`collab-bubble ${c?"collab-bubble--user":a?"collab-bubble--conductor":"collab-bubble--system"}`,children:[e.images&&e.images.length>0&&l.jsx("div",{className:"collab-msg-images",children:e.images.map((n,s)=>l.jsx("img",{src:n.base64||n.path,alt:n.name,className:"collab-msg-img"},s))}),e.files&&e.files.length>0&&l.jsx("div",{className:"collab-msg-files",children:e.files.map((n,s)=>l.jsx("span",{className:"collab-msg-file-chip",children:n.name},s))}),a||e.role==="system"?l.jsx(w,{content:e.msg}):l.jsx("span",{className:"collab-msg-text",children:e.msg})]})})}function B({since:e}){const{t:c}=N();return l.jsx("div",{className:"collab-msg collab-msg--conductor","data-slot":"collab-typing",children:l.jsxs("div",{className:"collab-thinking-bar",children:[l.jsx("span",{className:"collab-thinking-dot"}),l.jsx("span",{className:"collab-thinking-label",children:c("collab.typing")}),l.jsx("span",{className:"collab-thinking-time",children:l.jsx($,{since:e})})]})})}function I(){const e=i(o=>o.messages),c=i(o=>o.conductorTyping),a=i(o=>o.connectionStatus),{t:n}=N(),{scrollRef:s}=C(),[u,x]=r.useState(1),d=r.useRef(null),p=r.useRef(0);r.useEffect(()=>{(a==="connecting"||e.length===0)&&x(1)},[a,e.length]);const b=D*u,m=Math.max(0,e.length-b),k=e.slice(m),t=m,g=r.useCallback(()=>{const o=s.current;o&&(d.current=o.scrollHeight-o.scrollTop),x(h=>h+1)},[s]);r.useLayoutEffect(()=>{if(d.current==null)return;if(m>=p.current){d.current=null,p.current=m;return}const o=s.current;o&&(o.scrollTop=o.scrollHeight-d.current),d.current=null,p.current=m},[m,s]),r.useEffect(()=>{p.current=m},[m]);const j=[...e].reverse().find(o=>o.role==="user"),y=o=>o>1e12?o:o*1e3,f=r.useRef(Date.now());return j!=null&&j.ts&&(f.current=y(j.ts)),a==="connecting"?l.jsx("div",{className:"collab-messages-area","data-slot":"collab-messages",children:l.jsxs("div",{className:"collab-connecting",children:[l.jsx("span",{className:"collab-connecting-dot"}),l.jsx("span",{children:n("status.connecting")})]})}):e.length===0?l.jsx("div",{className:"collab-messages-area","data-slot":"collab-messages",children:l.jsx("div",{className:"collab-empty",children:l.jsx("p",{children:n("collab.placeholder")})})}):l.jsx("div",{className:"collab-messages-area","data-slot":"collab-messages",ref:s,children:l.jsxs("div",{className:"collab-messages-scroll",children:[t>0&&l.jsxs("button",{type:"button","data-slot":"show-earlier-btn",onClick:g,children:["Show ",t," earlier"]}),k.map((o,h)=>l.jsx(P,{message:o},o.id||m+h)),c&&l.jsx(B,{since:f.current})]})})}function F(){const e=i(t=>t.sendMessage),c=i(t=>t.conductorTyping),a=i(t=>t.connectionStatus),n=i(t=>t.modelConfig),s=i(t=>t.runtimeModel),u=i(t=>t.loadModel),x=i(t=>t.selectModel),d=S(t=>t.defaultModelNo);r.useEffect(()=>{u()},[u]);const p=r.useCallback((t,g)=>{var f,o;const j=(f=g==null?void 0:g.files)==null?void 0:f.map(h=>({name:h.name,path:h.path})),y=(o=g==null?void 0:g.images)==null?void 0:o.map(h=>({name:h.name,path:h.path,base64:h.base64}));e(t,j,y)},[e]),b=r.useCallback(()=>{},[]),m=a!=="ready",k=(n==null?void 0:n.effective)??(n==null?void 0:n.configured)??d;return l.jsx("div",{className:"collab-composer-wrap","data-slot":"collab-composer","data-disabled":m||void 0,children:l.jsx(M,{onSend:p,onStop:b,isGenerating:c,hideStatusStack:!0,modelControl:l.jsx(T,{selectedNo:k,runningNo:s!=null&&s.running?s.effective:null,isRunning:!!(s!=null&&s.running),onSelect:x})})})}const H=[{key:"1",icon:"comment"},{key:"2",icon:"symbol-misc"},{key:"3",icon:"graph"},{key:"4",icon:"edit"}],L=["collab.chipProgress","collab.chipPause","collab.chipSummary"];function O({onChipClick:e}){const{t:c}=N();return l.jsxs("div",{className:"collab-welcome","data-slot":"collab-welcome",children:[l.jsx("h2",{className:"collab-welcome-title",children:c("collab.guideTitle")}),l.jsx("p",{className:"collab-welcome-sub",children:c("collab.guideWhen")}),l.jsx("div",{className:"collab-welcome-steps",children:H.map(a=>l.jsxs("div",{className:"collab-welcome-step",children:[l.jsx("span",{className:"collab-welcome-step-icon",children:l.jsx(v,{name:a.icon,size:"1rem"})}),l.jsxs("span",{className:"collab-welcome-step-text",children:[l.jsx("span",{className:"collab-welcome-step-label",children:c(`collab.guideStep${a.key}t`)}),l.jsx("span",{className:"collab-welcome-step-desc",children:c(`collab.guideStep${a.key}d`)})]})]},a.key))}),l.jsx("div",{className:"collab-welcome-chips",children:L.map(a=>l.jsx("button",{type:"button",className:"collab-welcome-chip",onClick:()=>e(c(a)),children:c(a)},a))})]})}function A(){const e=i(s=>s.workers),c=e.filter(s=>s.status==="running").length,a=e.filter(s=>s.status==="reported").length,n=e.filter(s=>s.status==="failed").length;return l.jsxs("div",{className:"collab-rail","data-slot":"collab-rail",children:[c>0&&l.jsxs("span",{className:"collab-rail-badge collab-rail-badge--running","data-slot":"collab-rail-run",children:[l.jsx("span",{className:"collab-rail-dot collab-rail-dot--running"}),l.jsx("span",{className:"collab-rail-n",children:c}),l.jsx("span",{className:"collab-rail-label",children:"active"})]}),a>0&&l.jsxs("span",{className:"collab-rail-badge collab-rail-badge--done","data-slot":"collab-rail-done",children:[l.jsx("span",{className:"collab-rail-dot collab-rail-dot--done"}),l.jsx("span",{className:"collab-rail-n",children:a}),l.jsx("span",{className:"collab-rail-label",children:"reported"})]}),n>0&&l.jsxs("span",{className:"collab-rail-badge collab-rail-badge--issue","data-slot":"collab-rail-issue",children:[l.jsx("span",{className:"collab-rail-dot collab-rail-dot--issue"}),l.jsx("span",{className:"collab-rail-n",children:n}),l.jsx("span",{className:"collab-rail-label",children:"failed"})]})]})}function G(e){if(!e)return"";const c=e>1e12?e:e*1e3,a=Math.max(0,Math.floor((Date.now()-c)/1e3));if(a<10)return"just now";if(a<60)return`${a}s ago`;const n=Math.floor(a/60);if(n<60)return`${n}m ago`;const s=Math.floor(n/60);return s<24?`${s}h ago`:`${Math.floor(s/24)}d ago`}function z({status:e}){switch(e){case"running":return l.jsx("span",{className:"collab-card-glyph collab-card-glyph--running"});case"reported":return l.jsx("span",{className:"collab-card-glyph collab-card-glyph--done",children:"✓"});case"paused":return l.jsx("span",{className:"collab-card-glyph collab-card-glyph--paused",children:"⏸"});case"failed":return l.jsx("span",{className:"collab-card-glyph collab-card-glyph--failed",children:"!"});case"terminated":return l.jsx("span",{className:"collab-card-glyph collab-card-glyph--terminated",children:"×"})}}function J({worker:e,onClick:c}){const{t:a}=N(),n=i(u=>u.killWorker),s=r.useCallback(u=>{u.preventDefault(),E.confirm({title:a("collab.terminateWorker"),content:a("collab.terminateWorkerConfirm",{name:e.title}),okText:a("collab.terminateWorker"),cancelText:a("common.cancel"),okType:"danger",onOk:async()=>{try{await n(e.id)}catch{W.error({content:a("collab.terminateWorkerFailed")})}}})},[e.id,e.title,n,a]);return l.jsxs("article",{className:`collab-card collab-card--${e.status}`,"data-slot":"collab-card",onClick:()=>c(e),onContextMenu:s,children:[l.jsxs("div",{className:"collab-card-status",children:[l.jsx(z,{status:e.status}),l.jsx("span",{className:"collab-card-status-text",children:e.status}),e.updatedAt&&l.jsx("span",{className:"collab-card-time",children:G(e.updatedAt)})]}),l.jsx("div",{className:"collab-card-title",children:e.title}),l.jsx("div",{className:"collab-card-summary",children:e.summary})]})}function K({worker:e,onClose:c}){return l.jsxs("div",{className:"collab-drawer-wrap","data-slot":"collab-drawer-wrap",children:[l.jsx("div",{className:"collab-drawer-backdrop",onClick:c}),l.jsxs("aside",{className:"collab-drawer","data-slot":"collab-drawer",children:[l.jsxs("div",{className:"collab-drawer-head",children:[l.jsx("span",{className:"collab-drawer-title",children:e.title}),l.jsx("button",{className:"collab-drawer-close",onClick:c,"aria-label":"Close",children:l.jsx("svg",{width:"14",height:"14",viewBox:"0 0 16 16",fill:"none",children:l.jsx("path",{d:"M4 4l8 8M12 4l-8 8",stroke:"currentColor",strokeWidth:"1.5",strokeLinecap:"round"})})})]}),l.jsx("div",{className:"collab-drawer-body",children:e.fullReply?l.jsx(w,{content:e.fullReply}):l.jsx("p",{className:"collab-drawer-empty",children:"No output yet."})})]})]})}function U({collapsed:e,onToggle:c}){const a=i(d=>d.workers),[n,s]=r.useState(null),u=r.useCallback(d=>{s(d)},[]),x=r.useCallback(()=>{s(null)},[]);return l.jsxs(l.Fragment,{children:[l.jsxs("div",{className:`collab-worker-panel ${e?"collab-worker-panel--collapsed":""}`,"data-slot":"collab-worker-panel",children:[l.jsxs("div",{className:"collab-worker-panel-head",children:[!e&&l.jsxs(l.Fragment,{children:[l.jsx("span",{className:"collab-worker-panel-title",children:"Agents"}),l.jsx("span",{className:"collab-worker-panel-count",children:a.length})]}),l.jsx("button",{className:"collab-panel-collapse-btn",onClick:c,"aria-label":e?"Show agents panel":"Hide agents panel",children:l.jsx(v,{name:e?"layout-sidebar-right-off":"layout-sidebar-right",size:"1rem"})})]}),!e&&(a.length>0?l.jsx("div",{className:"collab-worker-list",children:a.map(d=>l.jsx(J,{worker:d,onClick:u},d.id))}):l.jsx("div",{className:"collab-worker-empty",children:"No agents yet"}))]}),n&&l.jsx(K,{worker:n,onClose:x})]})}function Z(){const{t:e}=N(),c=i(b=>b.connectionStatus),a=i(b=>b.messages),n=i(b=>b.connect),s=i(b=>b.sendMessage),[u,x]=r.useState(!0);r.useEffect(()=>{n()},[n]);const d=r.useCallback(b=>{s(b)},[s]);if(c==="offline")return l.jsx("div",{className:"collab-page","data-slot":"collab-page",children:l.jsxs("div",{className:"collab-offline",children:[l.jsx("div",{className:"collab-offline-icon",children:"⚡"}),l.jsx("h3",{children:e("collab.offlineTitle")}),l.jsx("p",{children:e("collab.offlineSub")}),l.jsx("button",{className:"collab-retry-btn",onClick:n,children:e("collab.retry")})]})});const p=c==="ready"&&a.length===0;return l.jsxs("div",{className:"collab-page","data-slot":"collab-page","data-empty":p||void 0,children:[l.jsxs("div",{className:"collab-main",children:[l.jsx(A,{}),l.jsxs("div",{className:"collab-chat-area",children:[p?l.jsx(O,{onChipClick:d}):l.jsx(I,{}),l.jsx(F,{})]})]}),l.jsx(U,{collapsed:!u,onToggle:()=>x(b=>!b)})]})}export{Z as CollabPage}; diff --git a/frontends/desktop/dist/assets/IconFile-CgfQSwGI.js b/frontends/desktop/dist/assets/IconFile-CgfQSwGI.js new file mode 100644 index 000000000..72767cb05 --- /dev/null +++ b/frontends/desktop/dist/assets/IconFile-CgfQSwGI.js @@ -0,0 +1 @@ +import{c as t,b as e}from"./tauri-compat-tfiFK9EG.js";function n(a){return e.createElement("svg",Object.assign({viewBox:"0 0 24 24",fill:"none",xmlns:"http://www.w3.org/2000/svg",width:"1em",height:"1em",focusable:!1,"aria-hidden":!0},a),e.createElement("path",{fillRule:"evenodd",clipRule:"evenodd",d:"M12 2a1 1 0 0 0-1-1H6a2 2 0 0 0-2 2v18c0 1.1.9 2 2 2h12a2 2 0 0 0 2-2V10a1 1 0 0 0-1-1h-5a2 2 0 0 1-2-2V2ZM7 8a1 1 0 0 1 1-1h1a1 1 0 0 1 0 2H8a1 1 0 0 1-1-1Zm0 5a1 1 0 0 1 1-1h8a1 1 0 1 1 0 2H8a1 1 0 0 1-1-1Zm1 4a1 1 0 1 0 0 2h8a1 1 0 1 0 0-2H8Zm11.07-9.5H14.5a1 1 0 0 1-1-1V1.93a.8.8 0 0 1 1.37-.56l4.76 4.76a.8.8 0 0 1-.56 1.37Z",fill:"currentColor"}))}const l=t(n,"file");export{l as I}; diff --git a/frontends/desktop/dist/assets/KaTeX_AMS-Regular-BQhdFMY1.woff2 b/frontends/desktop/dist/assets/KaTeX_AMS-Regular-BQhdFMY1.woff2 new file mode 100644 index 000000000..0acaaff03 Binary files /dev/null and b/frontends/desktop/dist/assets/KaTeX_AMS-Regular-BQhdFMY1.woff2 differ diff --git a/frontends/desktop/dist/assets/KaTeX_AMS-Regular-DMm9YOAa.woff b/frontends/desktop/dist/assets/KaTeX_AMS-Regular-DMm9YOAa.woff new file mode 100644 index 000000000..b804d7b33 Binary files /dev/null and b/frontends/desktop/dist/assets/KaTeX_AMS-Regular-DMm9YOAa.woff differ diff --git a/frontends/desktop/dist/assets/KaTeX_AMS-Regular-DRggAlZN.ttf b/frontends/desktop/dist/assets/KaTeX_AMS-Regular-DRggAlZN.ttf new file mode 100644 index 000000000..c6f9a5e7c Binary files /dev/null and b/frontends/desktop/dist/assets/KaTeX_AMS-Regular-DRggAlZN.ttf differ diff --git a/frontends/desktop/dist/assets/KaTeX_Caligraphic-Bold-ATXxdsX0.ttf b/frontends/desktop/dist/assets/KaTeX_Caligraphic-Bold-ATXxdsX0.ttf new file mode 100644 index 000000000..9ff4a5e04 Binary files /dev/null and b/frontends/desktop/dist/assets/KaTeX_Caligraphic-Bold-ATXxdsX0.ttf differ diff --git a/frontends/desktop/dist/assets/KaTeX_Caligraphic-Bold-BEiXGLvX.woff b/frontends/desktop/dist/assets/KaTeX_Caligraphic-Bold-BEiXGLvX.woff new file mode 100644 index 000000000..9759710d1 Binary files /dev/null and b/frontends/desktop/dist/assets/KaTeX_Caligraphic-Bold-BEiXGLvX.woff differ diff --git a/frontends/desktop/dist/assets/KaTeX_Caligraphic-Bold-Dq_IR9rO.woff2 b/frontends/desktop/dist/assets/KaTeX_Caligraphic-Bold-Dq_IR9rO.woff2 new file mode 100644 index 000000000..f390922ec Binary files /dev/null and b/frontends/desktop/dist/assets/KaTeX_Caligraphic-Bold-Dq_IR9rO.woff2 differ diff --git a/frontends/desktop/dist/assets/KaTeX_Caligraphic-Regular-CTRA-rTL.woff b/frontends/desktop/dist/assets/KaTeX_Caligraphic-Regular-CTRA-rTL.woff new file mode 100644 index 000000000..9bdd534fd Binary files /dev/null and b/frontends/desktop/dist/assets/KaTeX_Caligraphic-Regular-CTRA-rTL.woff differ diff --git a/frontends/desktop/dist/assets/KaTeX_Caligraphic-Regular-Di6jR-x-.woff2 b/frontends/desktop/dist/assets/KaTeX_Caligraphic-Regular-Di6jR-x-.woff2 new file mode 100644 index 000000000..75344a1f9 Binary files /dev/null and b/frontends/desktop/dist/assets/KaTeX_Caligraphic-Regular-Di6jR-x-.woff2 differ diff --git a/frontends/desktop/dist/assets/KaTeX_Caligraphic-Regular-wX97UBjC.ttf b/frontends/desktop/dist/assets/KaTeX_Caligraphic-Regular-wX97UBjC.ttf new file mode 100644 index 000000000..f522294ff Binary files /dev/null and b/frontends/desktop/dist/assets/KaTeX_Caligraphic-Regular-wX97UBjC.ttf differ diff --git a/frontends/desktop/dist/assets/KaTeX_Fraktur-Bold-BdnERNNW.ttf b/frontends/desktop/dist/assets/KaTeX_Fraktur-Bold-BdnERNNW.ttf new file mode 100644 index 000000000..4e98259c3 Binary files /dev/null and b/frontends/desktop/dist/assets/KaTeX_Fraktur-Bold-BdnERNNW.ttf differ diff --git a/frontends/desktop/dist/assets/KaTeX_Fraktur-Bold-BsDP51OF.woff b/frontends/desktop/dist/assets/KaTeX_Fraktur-Bold-BsDP51OF.woff new file mode 100644 index 000000000..e7730f662 Binary files /dev/null and b/frontends/desktop/dist/assets/KaTeX_Fraktur-Bold-BsDP51OF.woff differ diff --git a/frontends/desktop/dist/assets/KaTeX_Fraktur-Bold-CL6g_b3V.woff2 b/frontends/desktop/dist/assets/KaTeX_Fraktur-Bold-CL6g_b3V.woff2 new file mode 100644 index 000000000..395f28bea Binary files /dev/null and b/frontends/desktop/dist/assets/KaTeX_Fraktur-Bold-CL6g_b3V.woff2 differ diff --git a/frontends/desktop/dist/assets/KaTeX_Fraktur-Regular-CB_wures.ttf b/frontends/desktop/dist/assets/KaTeX_Fraktur-Regular-CB_wures.ttf new file mode 100644 index 000000000..b8461b275 Binary files /dev/null and b/frontends/desktop/dist/assets/KaTeX_Fraktur-Regular-CB_wures.ttf differ diff --git a/frontends/desktop/dist/assets/KaTeX_Fraktur-Regular-CTYiF6lA.woff2 b/frontends/desktop/dist/assets/KaTeX_Fraktur-Regular-CTYiF6lA.woff2 new file mode 100644 index 000000000..735f6948d Binary files /dev/null and b/frontends/desktop/dist/assets/KaTeX_Fraktur-Regular-CTYiF6lA.woff2 differ diff --git a/frontends/desktop/dist/assets/KaTeX_Fraktur-Regular-Dxdc4cR9.woff b/frontends/desktop/dist/assets/KaTeX_Fraktur-Regular-Dxdc4cR9.woff new file mode 100644 index 000000000..acab069f9 Binary files /dev/null and b/frontends/desktop/dist/assets/KaTeX_Fraktur-Regular-Dxdc4cR9.woff differ diff --git a/frontends/desktop/dist/assets/KaTeX_Main-Bold-Cx986IdX.woff2 b/frontends/desktop/dist/assets/KaTeX_Main-Bold-Cx986IdX.woff2 new file mode 100644 index 000000000..ab2ad21da Binary files /dev/null and b/frontends/desktop/dist/assets/KaTeX_Main-Bold-Cx986IdX.woff2 differ diff --git a/frontends/desktop/dist/assets/KaTeX_Main-Bold-Jm3AIy58.woff b/frontends/desktop/dist/assets/KaTeX_Main-Bold-Jm3AIy58.woff new file mode 100644 index 000000000..f38136ac1 Binary files /dev/null and b/frontends/desktop/dist/assets/KaTeX_Main-Bold-Jm3AIy58.woff differ diff --git a/frontends/desktop/dist/assets/KaTeX_Main-Bold-waoOVXN0.ttf b/frontends/desktop/dist/assets/KaTeX_Main-Bold-waoOVXN0.ttf new file mode 100644 index 000000000..4060e627d Binary files /dev/null and b/frontends/desktop/dist/assets/KaTeX_Main-Bold-waoOVXN0.ttf differ diff --git a/frontends/desktop/dist/assets/KaTeX_Main-BoldItalic-DxDJ3AOS.woff2 b/frontends/desktop/dist/assets/KaTeX_Main-BoldItalic-DxDJ3AOS.woff2 new file mode 100644 index 000000000..5931794de Binary files /dev/null and b/frontends/desktop/dist/assets/KaTeX_Main-BoldItalic-DxDJ3AOS.woff2 differ diff --git a/frontends/desktop/dist/assets/KaTeX_Main-BoldItalic-DzxPMmG6.ttf b/frontends/desktop/dist/assets/KaTeX_Main-BoldItalic-DzxPMmG6.ttf new file mode 100644 index 000000000..dc007977e Binary files /dev/null and b/frontends/desktop/dist/assets/KaTeX_Main-BoldItalic-DzxPMmG6.ttf differ diff --git a/frontends/desktop/dist/assets/KaTeX_Main-BoldItalic-SpSLRI95.woff b/frontends/desktop/dist/assets/KaTeX_Main-BoldItalic-SpSLRI95.woff new file mode 100644 index 000000000..67807b0bd Binary files /dev/null and b/frontends/desktop/dist/assets/KaTeX_Main-BoldItalic-SpSLRI95.woff differ diff --git a/frontends/desktop/dist/assets/KaTeX_Main-Italic-3WenGoN9.ttf b/frontends/desktop/dist/assets/KaTeX_Main-Italic-3WenGoN9.ttf new file mode 100644 index 000000000..0e9b0f354 Binary files /dev/null and b/frontends/desktop/dist/assets/KaTeX_Main-Italic-3WenGoN9.ttf differ diff --git a/frontends/desktop/dist/assets/KaTeX_Main-Italic-BMLOBm91.woff b/frontends/desktop/dist/assets/KaTeX_Main-Italic-BMLOBm91.woff new file mode 100644 index 000000000..6f43b594b Binary files /dev/null and b/frontends/desktop/dist/assets/KaTeX_Main-Italic-BMLOBm91.woff differ diff --git a/frontends/desktop/dist/assets/KaTeX_Main-Italic-NWA7e6Wa.woff2 b/frontends/desktop/dist/assets/KaTeX_Main-Italic-NWA7e6Wa.woff2 new file mode 100644 index 000000000..b50920e13 Binary files /dev/null and b/frontends/desktop/dist/assets/KaTeX_Main-Italic-NWA7e6Wa.woff2 differ diff --git a/frontends/desktop/dist/assets/KaTeX_Main-Regular-B22Nviop.woff2 b/frontends/desktop/dist/assets/KaTeX_Main-Regular-B22Nviop.woff2 new file mode 100644 index 000000000..eb24a7ba2 Binary files /dev/null and b/frontends/desktop/dist/assets/KaTeX_Main-Regular-B22Nviop.woff2 differ diff --git a/frontends/desktop/dist/assets/KaTeX_Main-Regular-Dr94JaBh.woff b/frontends/desktop/dist/assets/KaTeX_Main-Regular-Dr94JaBh.woff new file mode 100644 index 000000000..21f581296 Binary files /dev/null and b/frontends/desktop/dist/assets/KaTeX_Main-Regular-Dr94JaBh.woff differ diff --git a/frontends/desktop/dist/assets/KaTeX_Main-Regular-ypZvNtVU.ttf b/frontends/desktop/dist/assets/KaTeX_Main-Regular-ypZvNtVU.ttf new file mode 100644 index 000000000..dd45e1ed2 Binary files /dev/null and b/frontends/desktop/dist/assets/KaTeX_Main-Regular-ypZvNtVU.ttf differ diff --git a/frontends/desktop/dist/assets/KaTeX_Math-BoldItalic-B3XSjfu4.ttf b/frontends/desktop/dist/assets/KaTeX_Math-BoldItalic-B3XSjfu4.ttf new file mode 100644 index 000000000..728ce7a1e Binary files /dev/null and b/frontends/desktop/dist/assets/KaTeX_Math-BoldItalic-B3XSjfu4.ttf differ diff --git a/frontends/desktop/dist/assets/KaTeX_Math-BoldItalic-CZnvNsCZ.woff2 b/frontends/desktop/dist/assets/KaTeX_Math-BoldItalic-CZnvNsCZ.woff2 new file mode 100644 index 000000000..29657023a Binary files /dev/null and b/frontends/desktop/dist/assets/KaTeX_Math-BoldItalic-CZnvNsCZ.woff2 differ diff --git a/frontends/desktop/dist/assets/KaTeX_Math-BoldItalic-iY-2wyZ7.woff b/frontends/desktop/dist/assets/KaTeX_Math-BoldItalic-iY-2wyZ7.woff new file mode 100644 index 000000000..0ae390d74 Binary files /dev/null and b/frontends/desktop/dist/assets/KaTeX_Math-BoldItalic-iY-2wyZ7.woff differ diff --git a/frontends/desktop/dist/assets/KaTeX_Math-Italic-DA0__PXp.woff b/frontends/desktop/dist/assets/KaTeX_Math-Italic-DA0__PXp.woff new file mode 100644 index 000000000..eb5159d4c Binary files /dev/null and b/frontends/desktop/dist/assets/KaTeX_Math-Italic-DA0__PXp.woff differ diff --git a/frontends/desktop/dist/assets/KaTeX_Math-Italic-flOr_0UB.ttf b/frontends/desktop/dist/assets/KaTeX_Math-Italic-flOr_0UB.ttf new file mode 100644 index 000000000..70d559b4e Binary files /dev/null and b/frontends/desktop/dist/assets/KaTeX_Math-Italic-flOr_0UB.ttf differ diff --git a/frontends/desktop/dist/assets/KaTeX_Math-Italic-t53AETM-.woff2 b/frontends/desktop/dist/assets/KaTeX_Math-Italic-t53AETM-.woff2 new file mode 100644 index 000000000..215c143fd Binary files /dev/null and b/frontends/desktop/dist/assets/KaTeX_Math-Italic-t53AETM-.woff2 differ diff --git a/frontends/desktop/dist/assets/KaTeX_SansSerif-Bold-CFMepnvq.ttf b/frontends/desktop/dist/assets/KaTeX_SansSerif-Bold-CFMepnvq.ttf new file mode 100644 index 000000000..2f65a8a3a Binary files /dev/null and b/frontends/desktop/dist/assets/KaTeX_SansSerif-Bold-CFMepnvq.ttf differ diff --git a/frontends/desktop/dist/assets/KaTeX_SansSerif-Bold-D1sUS0GD.woff2 b/frontends/desktop/dist/assets/KaTeX_SansSerif-Bold-D1sUS0GD.woff2 new file mode 100644 index 000000000..cfaa3bda5 Binary files /dev/null and b/frontends/desktop/dist/assets/KaTeX_SansSerif-Bold-D1sUS0GD.woff2 differ diff --git a/frontends/desktop/dist/assets/KaTeX_SansSerif-Bold-DbIhKOiC.woff b/frontends/desktop/dist/assets/KaTeX_SansSerif-Bold-DbIhKOiC.woff new file mode 100644 index 000000000..8d47c02d9 Binary files /dev/null and b/frontends/desktop/dist/assets/KaTeX_SansSerif-Bold-DbIhKOiC.woff differ diff --git a/frontends/desktop/dist/assets/KaTeX_SansSerif-Italic-C3H0VqGB.woff2 b/frontends/desktop/dist/assets/KaTeX_SansSerif-Italic-C3H0VqGB.woff2 new file mode 100644 index 000000000..349c06dc6 Binary files /dev/null and b/frontends/desktop/dist/assets/KaTeX_SansSerif-Italic-C3H0VqGB.woff2 differ diff --git a/frontends/desktop/dist/assets/KaTeX_SansSerif-Italic-DN2j7dab.woff b/frontends/desktop/dist/assets/KaTeX_SansSerif-Italic-DN2j7dab.woff new file mode 100644 index 000000000..7e02df963 Binary files /dev/null and b/frontends/desktop/dist/assets/KaTeX_SansSerif-Italic-DN2j7dab.woff differ diff --git a/frontends/desktop/dist/assets/KaTeX_SansSerif-Italic-YYjJ1zSn.ttf b/frontends/desktop/dist/assets/KaTeX_SansSerif-Italic-YYjJ1zSn.ttf new file mode 100644 index 000000000..d5850df98 Binary files /dev/null and b/frontends/desktop/dist/assets/KaTeX_SansSerif-Italic-YYjJ1zSn.ttf differ diff --git a/frontends/desktop/dist/assets/KaTeX_SansSerif-Regular-BNo7hRIc.ttf b/frontends/desktop/dist/assets/KaTeX_SansSerif-Regular-BNo7hRIc.ttf new file mode 100644 index 000000000..537279f6b Binary files /dev/null and b/frontends/desktop/dist/assets/KaTeX_SansSerif-Regular-BNo7hRIc.ttf differ diff --git a/frontends/desktop/dist/assets/KaTeX_SansSerif-Regular-CS6fqUqJ.woff b/frontends/desktop/dist/assets/KaTeX_SansSerif-Regular-CS6fqUqJ.woff new file mode 100644 index 000000000..31b84829b Binary files /dev/null and b/frontends/desktop/dist/assets/KaTeX_SansSerif-Regular-CS6fqUqJ.woff differ diff --git a/frontends/desktop/dist/assets/KaTeX_SansSerif-Regular-DDBCnlJ7.woff2 b/frontends/desktop/dist/assets/KaTeX_SansSerif-Regular-DDBCnlJ7.woff2 new file mode 100644 index 000000000..a90eea85f Binary files /dev/null and b/frontends/desktop/dist/assets/KaTeX_SansSerif-Regular-DDBCnlJ7.woff2 differ diff --git a/frontends/desktop/dist/assets/KaTeX_Script-Regular-C5JkGWo-.ttf b/frontends/desktop/dist/assets/KaTeX_Script-Regular-C5JkGWo-.ttf new file mode 100644 index 000000000..fd679bf37 Binary files /dev/null and b/frontends/desktop/dist/assets/KaTeX_Script-Regular-C5JkGWo-.ttf differ diff --git a/frontends/desktop/dist/assets/KaTeX_Script-Regular-D3wIWfF6.woff2 b/frontends/desktop/dist/assets/KaTeX_Script-Regular-D3wIWfF6.woff2 new file mode 100644 index 000000000..b3048fc11 Binary files /dev/null and b/frontends/desktop/dist/assets/KaTeX_Script-Regular-D3wIWfF6.woff2 differ diff --git a/frontends/desktop/dist/assets/KaTeX_Script-Regular-D5yQViql.woff b/frontends/desktop/dist/assets/KaTeX_Script-Regular-D5yQViql.woff new file mode 100644 index 000000000..0e7da821e Binary files /dev/null and b/frontends/desktop/dist/assets/KaTeX_Script-Regular-D5yQViql.woff differ diff --git a/frontends/desktop/dist/assets/KaTeX_Size1-Regular-C195tn64.woff b/frontends/desktop/dist/assets/KaTeX_Size1-Regular-C195tn64.woff new file mode 100644 index 000000000..7f292d911 Binary files /dev/null and b/frontends/desktop/dist/assets/KaTeX_Size1-Regular-C195tn64.woff differ diff --git a/frontends/desktop/dist/assets/KaTeX_Size1-Regular-Dbsnue_I.ttf b/frontends/desktop/dist/assets/KaTeX_Size1-Regular-Dbsnue_I.ttf new file mode 100644 index 000000000..871fd7d19 Binary files /dev/null and b/frontends/desktop/dist/assets/KaTeX_Size1-Regular-Dbsnue_I.ttf differ diff --git a/frontends/desktop/dist/assets/KaTeX_Size1-Regular-mCD8mA8B.woff2 b/frontends/desktop/dist/assets/KaTeX_Size1-Regular-mCD8mA8B.woff2 new file mode 100644 index 000000000..c5a8462fb Binary files /dev/null and b/frontends/desktop/dist/assets/KaTeX_Size1-Regular-mCD8mA8B.woff2 differ diff --git a/frontends/desktop/dist/assets/KaTeX_Size2-Regular-B7gKUWhC.ttf b/frontends/desktop/dist/assets/KaTeX_Size2-Regular-B7gKUWhC.ttf new file mode 100644 index 000000000..7a212caf9 Binary files /dev/null and b/frontends/desktop/dist/assets/KaTeX_Size2-Regular-B7gKUWhC.ttf differ diff --git a/frontends/desktop/dist/assets/KaTeX_Size2-Regular-Dy4dx90m.woff2 b/frontends/desktop/dist/assets/KaTeX_Size2-Regular-Dy4dx90m.woff2 new file mode 100644 index 000000000..e1bccfe24 Binary files /dev/null and b/frontends/desktop/dist/assets/KaTeX_Size2-Regular-Dy4dx90m.woff2 differ diff --git a/frontends/desktop/dist/assets/KaTeX_Size2-Regular-oD1tc_U0.woff b/frontends/desktop/dist/assets/KaTeX_Size2-Regular-oD1tc_U0.woff new file mode 100644 index 000000000..d241d9be2 Binary files /dev/null and b/frontends/desktop/dist/assets/KaTeX_Size2-Regular-oD1tc_U0.woff differ diff --git a/frontends/desktop/dist/assets/KaTeX_Size3-Regular-CTq5MqoE.woff b/frontends/desktop/dist/assets/KaTeX_Size3-Regular-CTq5MqoE.woff new file mode 100644 index 000000000..e6e9b658d Binary files /dev/null and b/frontends/desktop/dist/assets/KaTeX_Size3-Regular-CTq5MqoE.woff differ diff --git a/frontends/desktop/dist/assets/KaTeX_Size3-Regular-DgpXs0kz.ttf b/frontends/desktop/dist/assets/KaTeX_Size3-Regular-DgpXs0kz.ttf new file mode 100644 index 000000000..00bff3495 Binary files /dev/null and b/frontends/desktop/dist/assets/KaTeX_Size3-Regular-DgpXs0kz.ttf differ diff --git a/frontends/desktop/dist/assets/KaTeX_Size4-Regular-BF-4gkZK.woff b/frontends/desktop/dist/assets/KaTeX_Size4-Regular-BF-4gkZK.woff new file mode 100644 index 000000000..e1ec54576 Binary files /dev/null and b/frontends/desktop/dist/assets/KaTeX_Size4-Regular-BF-4gkZK.woff differ diff --git a/frontends/desktop/dist/assets/KaTeX_Size4-Regular-DWFBv043.ttf b/frontends/desktop/dist/assets/KaTeX_Size4-Regular-DWFBv043.ttf new file mode 100644 index 000000000..74f08921f Binary files /dev/null and b/frontends/desktop/dist/assets/KaTeX_Size4-Regular-DWFBv043.ttf differ diff --git a/frontends/desktop/dist/assets/KaTeX_Size4-Regular-Dl5lxZxV.woff2 b/frontends/desktop/dist/assets/KaTeX_Size4-Regular-Dl5lxZxV.woff2 new file mode 100644 index 000000000..680c13085 Binary files /dev/null and b/frontends/desktop/dist/assets/KaTeX_Size4-Regular-Dl5lxZxV.woff2 differ diff --git a/frontends/desktop/dist/assets/KaTeX_Typewriter-Regular-C0xS9mPB.woff b/frontends/desktop/dist/assets/KaTeX_Typewriter-Regular-C0xS9mPB.woff new file mode 100644 index 000000000..2432419f2 Binary files /dev/null and b/frontends/desktop/dist/assets/KaTeX_Typewriter-Regular-C0xS9mPB.woff differ diff --git a/frontends/desktop/dist/assets/KaTeX_Typewriter-Regular-CO6r4hn1.woff2 b/frontends/desktop/dist/assets/KaTeX_Typewriter-Regular-CO6r4hn1.woff2 new file mode 100644 index 000000000..771f1af70 Binary files /dev/null and b/frontends/desktop/dist/assets/KaTeX_Typewriter-Regular-CO6r4hn1.woff2 differ diff --git a/frontends/desktop/dist/assets/KaTeX_Typewriter-Regular-D3Ib7_Hf.ttf b/frontends/desktop/dist/assets/KaTeX_Typewriter-Regular-D3Ib7_Hf.ttf new file mode 100644 index 000000000..c83252c57 Binary files /dev/null and b/frontends/desktop/dist/assets/KaTeX_Typewriter-Regular-D3Ib7_Hf.ttf differ diff --git a/frontends/desktop/dist/assets/MarkdownPart-Bhe_jloX.js b/frontends/desktop/dist/assets/MarkdownPart-Bhe_jloX.js new file mode 100644 index 000000000..afe611b68 --- /dev/null +++ b/frontends/desktop/dist/assets/MarkdownPart-Bhe_jloX.js @@ -0,0 +1,271 @@ +var an=Object.defineProperty;var nn=(r,e,t)=>e in r?an(r,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):r[e]=t;var nr=(r,e,t)=>nn(r,typeof e!="symbol"?e+"":e,t);import{bs as ir,g as sn,b as a0,aj as U}from"./tauri-compat-tfiFK9EG.js";import{M as ln,r as on,a as un,b as cn,p as hn,S as dn}from"./markdown-preprocess-Bvg4n8KE.js";import{Q as sr,S as mn,U as pn}from"./main-Knf6L_en.js";import"./index-Bpi3BHKj.js";import"./WindowsTitlebar-CrkUa1UM.js";var at={exports:{}},lr;function fn(){return lr||(lr=1,(function(r){var e=typeof window<"u"?window:typeof WorkerGlobalScope<"u"&&self instanceof WorkerGlobalScope?self:{};/** + * Prism: Lightweight, robust, elegant syntax highlighting + * + * @license MIT + * @author Lea Verou + * @namespace + * @public + */var t=(function(a){var n=/(?:^|\s)lang(?:uage)?-([\w-]+)(?=\s|$)/i,s=0,o={},u={manual:a.Prism&&a.Prism.manual,disableWorkerMessageHandler:a.Prism&&a.Prism.disableWorkerMessageHandler,util:{encode:function y(w){return w instanceof h?new h(w.type,y(w.content),w.alias):Array.isArray(w)?w.map(y):w.replace(/&/g,"&").replace(/"u")return null;if(document.currentScript&&document.currentScript.tagName==="SCRIPT")return document.currentScript;try{throw new Error}catch(A){var y=(/at [^(\r\n]*\((.*):[^:]+:[^:]+\)$/i.exec(A.stack)||[])[1];if(y){var w=document.getElementsByTagName("script");for(var k in w)if(w[k].src==y)return w[k]}return null}},isActive:function(y,w,k){for(var A="no-"+w;y;){var T=y.classList;if(T.contains(w))return!0;if(T.contains(A))return!1;y=y.parentElement}return!!k}},languages:{plain:o,plaintext:o,text:o,txt:o,extend:function(y,w){var k=u.util.clone(u.languages[y]);for(var A in w)k[A]=w[A];return k},insertBefore:function(y,w,k,A){A=A||u.languages;var T=A[y],O={};for(var P in T)if(T.hasOwnProperty(P)){if(P==w)for(var B in k)k.hasOwnProperty(B)&&(O[B]=k[B]);k.hasOwnProperty(P)||(O[P]=T[P])}var j=A[y];return A[y]=O,u.languages.DFS(u.languages,function(W,Y){Y===j&&W!=y&&(this[W]=O)}),O},DFS:function y(w,k,A,T){T=T||{};var O=u.util.objId;for(var P in w)if(w.hasOwnProperty(P)){k.call(w,P,w[P],A||P);var B=w[P],j=u.util.type(B);j==="Object"&&!T[O(B)]?(T[O(B)]=!0,y(B,k,null,T)):j==="Array"&&!T[O(B)]&&(T[O(B)]=!0,y(B,k,P,T))}}},plugins:{},highlightAll:function(y,w){u.highlightAllUnder(document,y,w)},highlightAllUnder:function(y,w,k){var A={callback:k,container:y,selector:'code[class*="language-"], [class*="language-"] code, code[class*="lang-"], [class*="lang-"] code'};u.hooks.run("before-highlightall",A),A.elements=Array.prototype.slice.apply(A.container.querySelectorAll(A.selector)),u.hooks.run("before-all-elements-highlight",A);for(var T=0,O;O=A.elements[T++];)u.highlightElement(O,w===!0,A.callback)},highlightElement:function(y,w,k){var A=u.util.getLanguage(y),T=u.languages[A];u.util.setLanguage(y,A);var O=y.parentElement;O&&O.nodeName.toLowerCase()==="pre"&&u.util.setLanguage(O,A);var P=y.textContent,B={element:y,language:A,grammar:T,code:P};function j(Y){B.highlightedCode=Y,u.hooks.run("before-insert",B),B.element.innerHTML=B.highlightedCode,u.hooks.run("after-highlight",B),u.hooks.run("complete",B),k&&k.call(B.element)}if(u.hooks.run("before-sanity-check",B),O=B.element.parentElement,O&&O.nodeName.toLowerCase()==="pre"&&!O.hasAttribute("tabindex")&&O.setAttribute("tabindex","0"),!B.code){u.hooks.run("complete",B),k&&k.call(B.element);return}if(u.hooks.run("before-highlight",B),!B.grammar){j(u.util.encode(B.code));return}if(w&&a.Worker){var W=new Worker(u.filename);W.onmessage=function(Y){j(Y.data)},W.postMessage(JSON.stringify({language:B.language,code:B.code,immediateClose:!0}))}else j(u.highlight(B.code,B.grammar,B.language))},highlight:function(y,w,k){var A={code:y,grammar:w,language:k};if(u.hooks.run("before-tokenize",A),!A.grammar)throw new Error('The language "'+A.language+'" has no grammar.');return A.tokens=u.tokenize(A.code,A.grammar),u.hooks.run("after-tokenize",A),h.stringify(u.util.encode(A.tokens),A.language)},tokenize:function(y,w){var k=w.rest;if(k){for(var A in k)w[A]=k[A];delete w.rest}var T=new g;return S(T,T.head,y),p(y,T,w,T.head,0),D(T)},hooks:{all:{},add:function(y,w){var k=u.hooks.all;k[y]=k[y]||[],k[y].push(w)},run:function(y,w){var k=u.hooks.all[y];if(!(!k||!k.length))for(var A=0,T;T=k[A++];)T(w)}},Token:h};a.Prism=u;function h(y,w,k,A){this.type=y,this.content=w,this.alias=k,this.length=(A||"").length|0}h.stringify=function y(w,k){if(typeof w=="string")return w;if(Array.isArray(w)){var A="";return w.forEach(function(j){A+=y(j,k)}),A}var T={type:w.type,content:y(w.content,k),tag:"span",classes:["token",w.type],attributes:{},language:k},O=w.alias;O&&(Array.isArray(O)?Array.prototype.push.apply(T.classes,O):T.classes.push(O)),u.hooks.run("wrap",T);var P="";for(var B in T.attributes)P+=" "+B+'="'+(T.attributes[B]||"").replace(/"/g,""")+'"';return"<"+T.tag+' class="'+T.classes.join(" ")+'"'+P+">"+T.content+""};function m(y,w,k,A){y.lastIndex=w;var T=y.exec(k);if(T&&A&&T[1]){var O=T[1].length;T.index+=O,T[0]=T[0].slice(O)}return T}function p(y,w,k,A,T,O){for(var P in k)if(!(!k.hasOwnProperty(P)||!k[P])){var B=k[P];B=Array.isArray(B)?B:[B];for(var j=0;j=O.reach);v0+=Q.value.length,Q=Q.next){var h0=Q.value;if(w.length>y.length)return;if(!(h0 instanceof h)){var x0=1,u0;if(b0){if(u0=m(O0,v0,y,j0),!u0||u0.index>=y.length)break;var le=u0.index,w0=u0.index+u0[0].length,S0=v0;for(S0+=Q.value.length;le>=S0;)Q=Q.next,S0+=Q.value.length;if(S0-=Q.value.length,v0=S0,Q.value instanceof h)continue;for(var X0=Q;X0!==w.tail&&(S0O.reach&&(O.reach=ue);var re=Q.prev;oe&&(re=S(w,re,oe),v0+=oe.length),x(w,re,x0);var Te=new h(P,Y?u.tokenize(C0,Y):C0,y0,C0);if(Q=S(w,re,Te),L0&&S(w,Q,L0),x0>1){var V0={cause:P+","+j,reach:ue};p(y,w,k,Q.prev,v0,V0),O&&V0.reach>O.reach&&(O.reach=V0.reach)}}}}}}function g(){var y={value:null,prev:null,next:null},w={value:null,prev:y,next:null};y.next=w,this.head=y,this.tail=w,this.length=0}function S(y,w,k){var A=w.next,T={value:k,prev:w,next:A};return w.next=T,A.prev=T,y.length++,T}function x(y,w,k){for(var A=w.next,T=0;T/,greedy:!0},prolog:{pattern:/<\?[\s\S]+?\?>/,greedy:!0},doctype:{pattern:/"'[\]]|"[^"]*"|'[^']*')+(?:\[(?:[^<"'\]]|"[^"]*"|'[^']*'|<(?!!--)|)*\]\s*)?>/i,greedy:!0,inside:{"internal-subset":{pattern:/(^[^\[]*\[)[\s\S]+(?=\]>$)/,lookbehind:!0,greedy:!0,inside:null},string:{pattern:/"[^"]*"|'[^']*'/,greedy:!0},punctuation:/^$|[[\]]/,"doctype-tag":/^DOCTYPE/i,name:/[^\s<>'"]+/}},cdata:{pattern://i,greedy:!0},tag:{pattern:/<\/?(?!\d)[^\s>\/=$<%]+(?:\s(?:\s*[^\s>\/=]+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))|(?=[\s/>])))+)?\s*\/?>/,greedy:!0,inside:{tag:{pattern:/^<\/?[^\s>\/]+/,inside:{punctuation:/^<\/?/,namespace:/^[^\s>\/:]+:/}},"special-attr":[],"attr-value":{pattern:/=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+)/,inside:{punctuation:[{pattern:/^=/,alias:"attr-equals"},{pattern:/^(\s*)["']|["']$/,lookbehind:!0}]}},punctuation:/\/?>/,"attr-name":{pattern:/[^\s>\/]+/,inside:{namespace:/^[^\s>\/:]+:/}}}},entity:[{pattern:/&[\da-z]{1,8};/i,alias:"named-entity"},/&#x?[\da-f]{1,8};/i]},t.languages.markup.tag.inside["attr-value"].inside.entity=t.languages.markup.entity,t.languages.markup.doctype.inside["internal-subset"].inside=t.languages.markup,t.hooks.add("wrap",function(a){a.type==="entity"&&(a.attributes.title=a.content.replace(/&/,"&"))}),Object.defineProperty(t.languages.markup.tag,"addInlined",{value:function(n,s){var o={};o["language-"+s]={pattern:/(^$)/i,lookbehind:!0,inside:t.languages[s]},o.cdata=/^$/i;var u={"included-cdata":{pattern://i,inside:o}};u["language-"+s]={pattern:/[\s\S]+/,inside:t.languages[s]};var h={};h[n]={pattern:RegExp(/(<__[^>]*>)(?:))*\]\]>|(?!)/.source.replace(/__/g,function(){return n}),"i"),lookbehind:!0,greedy:!0,inside:u},t.languages.insertBefore("markup","cdata",h)}}),Object.defineProperty(t.languages.markup.tag,"addAttribute",{value:function(a,n){t.languages.markup.tag.inside["special-attr"].push({pattern:RegExp(/(^|["'\s])/.source+"(?:"+a+")"+/\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))/.source,"i"),lookbehind:!0,inside:{"attr-name":/^[^\s=]+/,"attr-value":{pattern:/=[\s\S]+/,inside:{value:{pattern:/(^=\s*(["']|(?!["'])))\S[\s\S]*(?=\2$)/,lookbehind:!0,alias:[n,"language-"+n],inside:t.languages[n]},punctuation:[{pattern:/^=/,alias:"attr-equals"},/"|'/]}}}})}}),t.languages.html=t.languages.markup,t.languages.mathml=t.languages.markup,t.languages.svg=t.languages.markup,t.languages.xml=t.languages.extend("markup",{}),t.languages.ssml=t.languages.xml,t.languages.atom=t.languages.xml,t.languages.rss=t.languages.xml,(function(a){var n=/(?:"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"|'(?:\\(?:\r\n|[\s\S])|[^'\\\r\n])*')/;a.languages.css={comment:/\/\*[\s\S]*?\*\//,atrule:{pattern:RegExp("@[\\w-](?:"+/[^;{\s"']|\s+(?!\s)/.source+"|"+n.source+")*?"+/(?:;|(?=\s*\{))/.source),inside:{rule:/^@[\w-]+/,"selector-function-argument":{pattern:/(\bselector\s*\(\s*(?![\s)]))(?:[^()\s]|\s+(?![\s)])|\((?:[^()]|\([^()]*\))*\))+(?=\s*\))/,lookbehind:!0,alias:"selector"},keyword:{pattern:/(^|[^\w-])(?:and|not|only|or)(?![\w-])/,lookbehind:!0}}},url:{pattern:RegExp("\\burl\\((?:"+n.source+"|"+/(?:[^\\\r\n()"']|\\[\s\S])*/.source+")\\)","i"),greedy:!0,inside:{function:/^url/i,punctuation:/^\(|\)$/,string:{pattern:RegExp("^"+n.source+"$"),alias:"url"}}},selector:{pattern:RegExp(`(^|[{}\\s])[^{}\\s](?:[^{};"'\\s]|\\s+(?![\\s{])|`+n.source+")*(?=\\s*\\{)"),lookbehind:!0},string:{pattern:n,greedy:!0},property:{pattern:/(^|[^-\w\xA0-\uFFFF])(?!\s)[-_a-z\xA0-\uFFFF](?:(?!\s)[-\w\xA0-\uFFFF])*(?=\s*:)/i,lookbehind:!0},important:/!important\b/i,function:{pattern:/(^|[^-a-z0-9])[-a-z0-9]+(?=\()/i,lookbehind:!0},punctuation:/[(){};:,]/},a.languages.css.atrule.inside.rest=a.languages.css;var s=a.languages.markup;s&&(s.tag.addInlined("style","css"),s.tag.addAttribute("style","css"))})(t),t.languages.clike={comment:[{pattern:/(^|[^\\])\/\*[\s\S]*?(?:\*\/|$)/,lookbehind:!0,greedy:!0},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0,greedy:!0}],string:{pattern:/(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0},"class-name":{pattern:/(\b(?:class|extends|implements|instanceof|interface|new|trait)\s+|\bcatch\s+\()[\w.\\]+/i,lookbehind:!0,inside:{punctuation:/[.\\]/}},keyword:/\b(?:break|catch|continue|do|else|finally|for|function|if|in|instanceof|new|null|return|throw|try|while)\b/,boolean:/\b(?:false|true)\b/,function:/\b\w+(?=\()/,number:/\b0x[\da-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?/i,operator:/[<>]=?|[!=]=?=?|--?|\+\+?|&&?|\|\|?|[?*/~^%]/,punctuation:/[{}[\];(),.:]/},t.languages.javascript=t.languages.extend("clike",{"class-name":[t.languages.clike["class-name"],{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$A-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\.(?:constructor|prototype))/,lookbehind:!0}],keyword:[{pattern:/((?:^|\})\s*)catch\b/,lookbehind:!0},{pattern:/(^|[^.]|\.\.\.\s*)\b(?:as|assert(?=\s*\{)|async(?=\s*(?:function\b|\(|[$\w\xA0-\uFFFF]|$))|await|break|case|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally(?=\s*(?:\{|$))|for|from(?=\s*(?:['"]|$))|function|(?:get|set)(?=\s*(?:[#\[$\w\xA0-\uFFFF]|$))|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)\b/,lookbehind:!0}],function:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*(?:\.\s*(?:apply|bind|call)\s*)?\()/,number:{pattern:RegExp(/(^|[^\w$])/.source+"(?:"+(/NaN|Infinity/.source+"|"+/0[bB][01]+(?:_[01]+)*n?/.source+"|"+/0[oO][0-7]+(?:_[0-7]+)*n?/.source+"|"+/0[xX][\dA-Fa-f]+(?:_[\dA-Fa-f]+)*n?/.source+"|"+/\d+(?:_\d+)*n/.source+"|"+/(?:\d+(?:_\d+)*(?:\.(?:\d+(?:_\d+)*)?)?|\.\d+(?:_\d+)*)(?:[Ee][+-]?\d+(?:_\d+)*)?/.source)+")"+/(?![\w$])/.source),lookbehind:!0},operator:/--|\+\+|\*\*=?|=>|&&=?|\|\|=?|[!=]==|<<=?|>>>?=?|[-+*/%&|^!=<>]=?|\.{3}|\?\?=?|\?\.?|[~:]/}),t.languages.javascript["class-name"][0].pattern=/(\b(?:class|extends|implements|instanceof|interface|new)\s+)[\w.\\]+/,t.languages.insertBefore("javascript","keyword",{regex:{pattern:RegExp(/((?:^|[^$\w\xA0-\uFFFF."'\])\s]|\b(?:return|yield))\s*)/.source+/\//.source+"(?:"+/(?:\[(?:[^\]\\\r\n]|\\.)*\]|\\.|[^/\\\[\r\n])+\/[dgimyus]{0,7}/.source+"|"+/(?:\[(?:[^[\]\\\r\n]|\\.|\[(?:[^[\]\\\r\n]|\\.|\[(?:[^[\]\\\r\n]|\\.)*\])*\])*\]|\\.|[^/\\\[\r\n])+\/[dgimyus]{0,7}v[dgimyus]{0,7}/.source+")"+/(?=(?:\s|\/\*(?:[^*]|\*(?!\/))*\*\/)*(?:$|[\r\n,.;:})\]]|\/\/))/.source),lookbehind:!0,greedy:!0,inside:{"regex-source":{pattern:/^(\/)[\s\S]+(?=\/[a-z]*$)/,lookbehind:!0,alias:"language-regex",inside:t.languages.regex},"regex-delimiter":/^\/|\/$/,"regex-flags":/^[a-z]+$/}},"function-variable":{pattern:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*[=:]\s*(?:async\s*)?(?:\bfunction\b|(?:\((?:[^()]|\([^()]*\))*\)|(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)\s*=>))/,alias:"function"},parameter:[{pattern:/(function(?:\s+(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)?\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\))/,lookbehind:!0,inside:t.languages.javascript},{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$a-z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*=>)/i,lookbehind:!0,inside:t.languages.javascript},{pattern:/(\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*=>)/,lookbehind:!0,inside:t.languages.javascript},{pattern:/((?:\b|\s|^)(?!(?:as|async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)(?![$\w\xA0-\uFFFF]))(?:(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*\s*)\(\s*|\]\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*\{)/,lookbehind:!0,inside:t.languages.javascript}],constant:/\b[A-Z](?:[A-Z_]|\dx?)*\b/}),t.languages.insertBefore("javascript","string",{hashbang:{pattern:/^#!.*/,greedy:!0,alias:"comment"},"template-string":{pattern:/`(?:\\[\s\S]|\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}|(?!\$\{)[^\\`])*`/,greedy:!0,inside:{"template-punctuation":{pattern:/^`|`$/,alias:"string"},interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}/,lookbehind:!0,inside:{"interpolation-punctuation":{pattern:/^\$\{|\}$/,alias:"punctuation"},rest:t.languages.javascript}},string:/[\s\S]+/}},"string-property":{pattern:/((?:^|[,{])[ \t]*)(["'])(?:\\(?:\r\n|[\s\S])|(?!\2)[^\\\r\n])*\2(?=\s*:)/m,lookbehind:!0,greedy:!0,alias:"property"}}),t.languages.insertBefore("javascript","operator",{"literal-property":{pattern:/((?:^|[,{])[ \t]*)(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*:)/m,lookbehind:!0,alias:"property"}}),t.languages.markup&&(t.languages.markup.tag.addInlined("script","javascript"),t.languages.markup.tag.addAttribute(/on(?:abort|blur|change|click|composition(?:end|start|update)|dblclick|error|focus(?:in|out)?|key(?:down|up)|load|mouse(?:down|enter|leave|move|out|over|up)|reset|resize|scroll|select|slotchange|submit|unload|wheel)/.source,"javascript")),t.languages.js=t.languages.javascript,(function(){if(typeof t>"u"||typeof document>"u")return;Element.prototype.matches||(Element.prototype.matches=Element.prototype.msMatchesSelector||Element.prototype.webkitMatchesSelector);var a="Loading…",n=function(E,M){return"✖ Error "+E+" while fetching file: "+M},s="✖ Error: File does not exist or is empty",o={js:"javascript",py:"python",rb:"ruby",ps1:"powershell",psm1:"powershell",sh:"bash",bat:"batch",h:"c",tex:"latex"},u="data-src-status",h="loading",m="loaded",p="failed",g="pre[data-src]:not(["+u+'="'+m+'"]):not(['+u+'="'+h+'"])';function S(E,M,R){var y=new XMLHttpRequest;y.open("GET",E,!0),y.onreadystatechange=function(){y.readyState==4&&(y.status<400&&y.responseText?M(y.responseText):y.status>=400?R(n(y.status,y.statusText)):R(s))},y.send(null)}function x(E){var M=/^\s*(\d+)\s*(?:(,)\s*(?:(\d+)\s*)?)?$/.exec(E||"");if(M){var R=Number(M[1]),y=M[2],w=M[3];return y?w?[R,Number(w)]:[R,void 0]:[R,R]}}t.hooks.add("before-highlightall",function(E){E.selector+=", "+g}),t.hooks.add("before-sanity-check",function(E){var M=E.element;if(M.matches(g)){E.code="",M.setAttribute(u,h);var R=M.appendChild(document.createElement("CODE"));R.textContent=a;var y=M.getAttribute("data-src"),w=E.language;if(w==="none"){var k=(/\.(\w+)$/.exec(y)||[,"none"])[1];w=o[k]||k}t.util.setLanguage(R,w),t.util.setLanguage(M,w);var A=t.plugins.autoloader;A&&A.loadLanguages(w),S(y,function(T){M.setAttribute(u,m);var O=x(M.getAttribute("data-range"));if(O){var P=T.split(/\r\n?|\n/g),B=O[0],j=O[1]==null?P.length:O[1];B<0&&(B+=P.length),B=Math.max(0,Math.min(B-1,P.length)),j<0&&(j+=P.length),j=Math.max(0,Math.min(j,P.length)),T=P.slice(B,j).join(` +`),M.hasAttribute("data-start")||M.setAttribute("data-start",String(B+1))}R.textContent=T,t.highlightElement(R)},function(T){M.setAttribute(u,p),R.textContent=T})}}),t.plugins.fileHighlight={highlight:function(M){for(var R=(M||document).querySelectorAll(g),y=0,w;w=R[y++];)t.highlightElement(w)}};var D=!1;t.fileHighlight=function(){D||(console.warn("Prism.fileHighlight is deprecated. Use `Prism.plugins.fileHighlight.highlight` instead."),D=!0),t.plugins.fileHighlight.highlight.apply(this,arguments)}})()})(at)),at.exports}var vn=fn();const $e=sn(vn);(function(r){var e=r.util.clone(r.languages.javascript),t=/(?:\s|\/\/.*(?!.)|\/\*(?:[^*]|\*(?!\/))\*\/)/.source,a=/(?:\{(?:\{(?:\{[^{}]*\}|[^{}])*\}|[^{}])*\})/.source,n=/(?:\{*\.{3}(?:[^{}]|)*\})/.source;function s(h,m){return h=h.replace(//g,function(){return t}).replace(//g,function(){return a}).replace(//g,function(){return n}),RegExp(h,m)}n=s(n).source,r.languages.jsx=r.languages.extend("markup",e),r.languages.jsx.tag.pattern=s(/<\/?(?:[\w.:-]+(?:+(?:[\w.:$-]+(?:=(?:"(?:\\[\s\S]|[^\\"])*"|'(?:\\[\s\S]|[^\\'])*'|[^\s{'"/>=]+|))?|))**\/?)?>/.source),r.languages.jsx.tag.inside.tag.pattern=/^<\/?[^\s>\/]*/,r.languages.jsx.tag.inside["attr-value"].pattern=/=(?!\{)(?:"(?:\\[\s\S]|[^\\"])*"|'(?:\\[\s\S]|[^\\'])*'|[^\s'">]+)/,r.languages.jsx.tag.inside.tag.inside["class-name"]=/^[A-Z]\w*(?:\.[A-Z]\w*)*$/,r.languages.jsx.tag.inside.comment=e.comment,r.languages.insertBefore("inside","attr-name",{spread:{pattern:s(//.source),inside:r.languages.jsx}},r.languages.jsx.tag),r.languages.insertBefore("inside","special-attr",{script:{pattern:s(/=/.source),alias:"language-javascript",inside:{"script-punctuation":{pattern:/^=(?=\{)/,alias:"punctuation"},rest:r.languages.jsx}}},r.languages.jsx.tag);var o=function(h){return h?typeof h=="string"?h:typeof h.content=="string"?h.content:h.content.map(o).join(""):""},u=function(h){for(var m=[],p=0;p0&&m[m.length-1].tagName===o(g.content[0].content[1])&&m.pop():g.content[g.content.length-1].content==="/>"||m.push({tagName:o(g.content[0].content[1]),openedBraces:0}):m.length>0&&g.type==="punctuation"&&g.content==="{"?m[m.length-1].openedBraces++:m.length>0&&m[m.length-1].openedBraces>0&&g.type==="punctuation"&&g.content==="}"?m[m.length-1].openedBraces--:S=!0),(S||typeof g=="string")&&m.length>0&&m[m.length-1].openedBraces===0){var x=o(g);p0&&(typeof h[p-1]=="string"||h[p-1].type==="plain-text")&&(x=o(h[p-1])+x,h.splice(p-1,1),p--),h[p]=new r.Token("plain-text",x,null,x)}g.content&&typeof g.content!="string"&&u(g.content)}};r.hooks.add("after-tokenize",function(h){h.language!=="jsx"&&h.language!=="tsx"||u(h.tokens)})})(Prism);(function(r){var e=r.util.clone(r.languages.typescript);r.languages.tsx=r.languages.extend("jsx",e),delete r.languages.tsx.parameter,delete r.languages.tsx["literal-property"];var t=r.languages.tsx.tag;t.pattern=RegExp(/(^|[^\w$]|(?=<\/))/.source+"(?:"+t.pattern.source+")",t.pattern.flags),t.lookbehind=!0})(Prism);Prism.languages.markup={comment:{pattern://,greedy:!0},prolog:{pattern:/<\?[\s\S]+?\?>/,greedy:!0},doctype:{pattern:/"'[\]]|"[^"]*"|'[^']*')+(?:\[(?:[^<"'\]]|"[^"]*"|'[^']*'|<(?!!--)|)*\]\s*)?>/i,greedy:!0,inside:{"internal-subset":{pattern:/(^[^\[]*\[)[\s\S]+(?=\]>$)/,lookbehind:!0,greedy:!0,inside:null},string:{pattern:/"[^"]*"|'[^']*'/,greedy:!0},punctuation:/^$|[[\]]/,"doctype-tag":/^DOCTYPE/i,name:/[^\s<>'"]+/}},cdata:{pattern://i,greedy:!0},tag:{pattern:/<\/?(?!\d)[^\s>\/=$<%]+(?:\s(?:\s*[^\s>\/=]+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))|(?=[\s/>])))+)?\s*\/?>/,greedy:!0,inside:{tag:{pattern:/^<\/?[^\s>\/]+/,inside:{punctuation:/^<\/?/,namespace:/^[^\s>\/:]+:/}},"special-attr":[],"attr-value":{pattern:/=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+)/,inside:{punctuation:[{pattern:/^=/,alias:"attr-equals"},{pattern:/^(\s*)["']|["']$/,lookbehind:!0}]}},punctuation:/\/?>/,"attr-name":{pattern:/[^\s>\/]+/,inside:{namespace:/^[^\s>\/:]+:/}}}},entity:[{pattern:/&[\da-z]{1,8};/i,alias:"named-entity"},/&#x?[\da-f]{1,8};/i]};Prism.languages.markup.tag.inside["attr-value"].inside.entity=Prism.languages.markup.entity;Prism.languages.markup.doctype.inside["internal-subset"].inside=Prism.languages.markup;Prism.hooks.add("wrap",function(r){r.type==="entity"&&(r.attributes.title=r.content.replace(/&/,"&"))});Object.defineProperty(Prism.languages.markup.tag,"addInlined",{value:function(e,t){var a={};a["language-"+t]={pattern:/(^$)/i,lookbehind:!0,inside:Prism.languages[t]},a.cdata=/^$/i;var n={"included-cdata":{pattern://i,inside:a}};n["language-"+t]={pattern:/[\s\S]+/,inside:Prism.languages[t]};var s={};s[e]={pattern:RegExp(/(<__[^>]*>)(?:))*\]\]>|(?!)/.source.replace(/__/g,function(){return e}),"i"),lookbehind:!0,greedy:!0,inside:n},Prism.languages.insertBefore("markup","cdata",s)}});Object.defineProperty(Prism.languages.markup.tag,"addAttribute",{value:function(r,e){Prism.languages.markup.tag.inside["special-attr"].push({pattern:RegExp(/(^|["'\s])/.source+"(?:"+r+")"+/\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))/.source,"i"),lookbehind:!0,inside:{"attr-name":/^[^\s=]+/,"attr-value":{pattern:/=[\s\S]+/,inside:{value:{pattern:/(^=\s*(["']|(?!["'])))\S[\s\S]*(?=\2$)/,lookbehind:!0,alias:[e,"language-"+e],inside:Prism.languages[e]},punctuation:[{pattern:/^=/,alias:"attr-equals"},/"|'/]}}}})}});Prism.languages.html=Prism.languages.markup;Prism.languages.mathml=Prism.languages.markup;Prism.languages.svg=Prism.languages.markup;Prism.languages.xml=Prism.languages.extend("markup",{});Prism.languages.ssml=Prism.languages.xml;Prism.languages.atom=Prism.languages.xml;Prism.languages.rss=Prism.languages.xml;(function(r){var e=/(?:"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"|'(?:\\(?:\r\n|[\s\S])|[^'\\\r\n])*')/;r.languages.css={comment:/\/\*[\s\S]*?\*\//,atrule:{pattern:RegExp("@[\\w-](?:"+/[^;{\s"']|\s+(?!\s)/.source+"|"+e.source+")*?"+/(?:;|(?=\s*\{))/.source),inside:{rule:/^@[\w-]+/,"selector-function-argument":{pattern:/(\bselector\s*\(\s*(?![\s)]))(?:[^()\s]|\s+(?![\s)])|\((?:[^()]|\([^()]*\))*\))+(?=\s*\))/,lookbehind:!0,alias:"selector"},keyword:{pattern:/(^|[^\w-])(?:and|not|only|or)(?![\w-])/,lookbehind:!0}}},url:{pattern:RegExp("\\burl\\((?:"+e.source+"|"+/(?:[^\\\r\n()"']|\\[\s\S])*/.source+")\\)","i"),greedy:!0,inside:{function:/^url/i,punctuation:/^\(|\)$/,string:{pattern:RegExp("^"+e.source+"$"),alias:"url"}}},selector:{pattern:RegExp(`(^|[{}\\s])[^{}\\s](?:[^{};"'\\s]|\\s+(?![\\s{])|`+e.source+")*(?=\\s*\\{)"),lookbehind:!0},string:{pattern:e,greedy:!0},property:{pattern:/(^|[^-\w\xA0-\uFFFF])(?!\s)[-_a-z\xA0-\uFFFF](?:(?!\s)[-\w\xA0-\uFFFF])*(?=\s*:)/i,lookbehind:!0},important:/!important\b/i,function:{pattern:/(^|[^-a-z0-9])[-a-z0-9]+(?=\()/i,lookbehind:!0},punctuation:/[(){};:,]/},r.languages.css.atrule.inside.rest=r.languages.css;var t=r.languages.markup;t&&(t.tag.addInlined("style","css"),t.tag.addAttribute("style","css"))})(Prism);Prism.languages.c=Prism.languages.extend("clike",{comment:{pattern:/\/\/(?:[^\r\n\\]|\\(?:\r\n?|\n|(?![\r\n])))*|\/\*[\s\S]*?(?:\*\/|$)/,greedy:!0},string:{pattern:/"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"/,greedy:!0},"class-name":{pattern:/(\b(?:enum|struct)\s+(?:__attribute__\s*\(\([\s\S]*?\)\)\s*)?)\w+|\b[a-z]\w*_t\b/,lookbehind:!0},keyword:/\b(?:_Alignas|_Alignof|_Atomic|_Bool|_Complex|_Generic|_Imaginary|_Noreturn|_Static_assert|_Thread_local|__attribute__|asm|auto|break|case|char|const|continue|default|do|double|else|enum|extern|float|for|goto|if|inline|int|long|register|return|short|signed|sizeof|static|struct|switch|typedef|typeof|union|unsigned|void|volatile|while)\b/,function:/\b[a-z_]\w*(?=\s*\()/i,number:/(?:\b0x(?:[\da-f]+(?:\.[\da-f]*)?|\.[\da-f]+)(?:p[+-]?\d+)?|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?)[ful]{0,4}/i,operator:/>>=?|<<=?|->|([-+&|:])\1|[?:~]|[-+*/%&|^!=<>]=?/});Prism.languages.insertBefore("c","string",{char:{pattern:/'(?:\\(?:\r\n|[\s\S])|[^'\\\r\n]){0,32}'/,greedy:!0}});Prism.languages.insertBefore("c","string",{macro:{pattern:/(^[\t ]*)#\s*[a-z](?:[^\r\n\\/]|\/(?!\*)|\/\*(?:[^*]|\*(?!\/))*\*\/|\\(?:\r\n|[\s\S]))*/im,lookbehind:!0,greedy:!0,alias:"property",inside:{string:[{pattern:/^(#\s*include\s*)<[^>]+>/,lookbehind:!0},Prism.languages.c.string],char:Prism.languages.c.char,comment:Prism.languages.c.comment,"macro-name":[{pattern:/(^#\s*define\s+)\w+\b(?!\()/i,lookbehind:!0},{pattern:/(^#\s*define\s+)\w+\b(?=\()/i,lookbehind:!0,alias:"function"}],directive:{pattern:/^(#\s*)[a-z]+/,lookbehind:!0,alias:"keyword"},"directive-hash":/^#/,punctuation:/##|\\(?=[\r\n])/,expression:{pattern:/\S[\s\S]*/,inside:Prism.languages.c}}}});Prism.languages.insertBefore("c","function",{constant:/\b(?:EOF|NULL|SEEK_CUR|SEEK_END|SEEK_SET|__DATE__|__FILE__|__LINE__|__TIMESTAMP__|__TIME__|__func__|stderr|stdin|stdout)\b/});delete Prism.languages.c.boolean;(function(r){var e="\\b(?:BASH|BASHOPTS|BASH_ALIASES|BASH_ARGC|BASH_ARGV|BASH_CMDS|BASH_COMPLETION_COMPAT_DIR|BASH_LINENO|BASH_REMATCH|BASH_SOURCE|BASH_VERSINFO|BASH_VERSION|COLORTERM|COLUMNS|COMP_WORDBREAKS|DBUS_SESSION_BUS_ADDRESS|DEFAULTS_PATH|DESKTOP_SESSION|DIRSTACK|DISPLAY|EUID|GDMSESSION|GDM_LANG|GNOME_KEYRING_CONTROL|GNOME_KEYRING_PID|GPG_AGENT_INFO|GROUPS|HISTCONTROL|HISTFILE|HISTFILESIZE|HISTSIZE|HOME|HOSTNAME|HOSTTYPE|IFS|INSTANCE|JOB|LANG|LANGUAGE|LC_ADDRESS|LC_ALL|LC_IDENTIFICATION|LC_MEASUREMENT|LC_MONETARY|LC_NAME|LC_NUMERIC|LC_PAPER|LC_TELEPHONE|LC_TIME|LESSCLOSE|LESSOPEN|LINES|LOGNAME|LS_COLORS|MACHTYPE|MAILCHECK|MANDATORY_PATH|NO_AT_BRIDGE|OLDPWD|OPTERR|OPTIND|ORBIT_SOCKETDIR|OSTYPE|PAPERSIZE|PATH|PIPESTATUS|PPID|PS1|PS2|PS3|PS4|PWD|RANDOM|REPLY|SECONDS|SELINUX_INIT|SESSION|SESSIONTYPE|SESSION_MANAGER|SHELL|SHELLOPTS|SHLVL|SSH_AUTH_SOCK|TERM|UID|UPSTART_EVENTS|UPSTART_INSTANCE|UPSTART_JOB|UPSTART_SESSION|USER|WINDOWID|XAUTHORITY|XDG_CONFIG_DIRS|XDG_CURRENT_DESKTOP|XDG_DATA_DIRS|XDG_GREETER_DATA_DIR|XDG_MENU_PREFIX|XDG_RUNTIME_DIR|XDG_SEAT|XDG_SEAT_PATH|XDG_SESSION_DESKTOP|XDG_SESSION_ID|XDG_SESSION_PATH|XDG_SESSION_TYPE|XDG_VTNR|XMODIFIERS)\\b",t={pattern:/(^(["']?)\w+\2)[ \t]+\S.*/,lookbehind:!0,alias:"punctuation",inside:null},a={bash:t,environment:{pattern:RegExp("\\$"+e),alias:"constant"},variable:[{pattern:/\$?\(\([\s\S]+?\)\)/,greedy:!0,inside:{variable:[{pattern:/(^\$\(\([\s\S]+)\)\)/,lookbehind:!0},/^\$\(\(/],number:/\b0x[\dA-Fa-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[Ee]-?\d+)?/,operator:/--|\+\+|\*\*=?|<<=?|>>=?|&&|\|\||[=!+\-*/%<>^&|]=?|[?~:]/,punctuation:/\(\(?|\)\)?|,|;/}},{pattern:/\$\((?:\([^)]+\)|[^()])+\)|`[^`]+`/,greedy:!0,inside:{variable:/^\$\(|^`|\)$|`$/}},{pattern:/\$\{[^}]+\}/,greedy:!0,inside:{operator:/:[-=?+]?|[!\/]|##?|%%?|\^\^?|,,?/,punctuation:/[\[\]]/,environment:{pattern:RegExp("(\\{)"+e),lookbehind:!0,alias:"constant"}}},/\$(?:\w+|[#?*!@$])/],entity:/\\(?:[abceEfnrtv\\"]|O?[0-7]{1,3}|U[0-9a-fA-F]{8}|u[0-9a-fA-F]{4}|x[0-9a-fA-F]{1,2})/};r.languages.bash={shebang:{pattern:/^#!\s*\/.*/,alias:"important"},comment:{pattern:/(^|[^"{\\$])#.*/,lookbehind:!0},"function-name":[{pattern:/(\bfunction\s+)[\w-]+(?=(?:\s*\(?:\s*\))?\s*\{)/,lookbehind:!0,alias:"function"},{pattern:/\b[\w-]+(?=\s*\(\s*\)\s*\{)/,alias:"function"}],"for-or-select":{pattern:/(\b(?:for|select)\s+)\w+(?=\s+in\s)/,alias:"variable",lookbehind:!0},"assign-left":{pattern:/(^|[\s;|&]|[<>]\()\w+(?:\.\w+)*(?=\+?=)/,inside:{environment:{pattern:RegExp("(^|[\\s;|&]|[<>]\\()"+e),lookbehind:!0,alias:"constant"}},alias:"variable",lookbehind:!0},parameter:{pattern:/(^|\s)-{1,2}(?:\w+:[+-]?)?\w+(?:\.\w+)*(?=[=\s]|$)/,alias:"variable",lookbehind:!0},string:[{pattern:/((?:^|[^<])<<-?\s*)(\w+)\s[\s\S]*?(?:\r?\n|\r)\2/,lookbehind:!0,greedy:!0,inside:a},{pattern:/((?:^|[^<])<<-?\s*)(["'])(\w+)\2\s[\s\S]*?(?:\r?\n|\r)\3/,lookbehind:!0,greedy:!0,inside:{bash:t}},{pattern:/(^|[^\\](?:\\\\)*)"(?:\\[\s\S]|\$\([^)]+\)|\$(?!\()|`[^`]+`|[^"\\`$])*"/,lookbehind:!0,greedy:!0,inside:a},{pattern:/(^|[^$\\])'[^']*'/,lookbehind:!0,greedy:!0},{pattern:/\$'(?:[^'\\]|\\[\s\S])*'/,greedy:!0,inside:{entity:a.entity}}],environment:{pattern:RegExp("\\$?"+e),alias:"constant"},variable:a.variable,function:{pattern:/(^|[\s;|&]|[<>]\()(?:add|apropos|apt|apt-cache|apt-get|aptitude|aspell|automysqlbackup|awk|basename|bash|bc|bconsole|bg|bzip2|cal|cargo|cat|cfdisk|chgrp|chkconfig|chmod|chown|chroot|cksum|clear|cmp|column|comm|composer|cp|cron|crontab|csplit|curl|cut|date|dc|dd|ddrescue|debootstrap|df|diff|diff3|dig|dir|dircolors|dirname|dirs|dmesg|docker|docker-compose|du|egrep|eject|env|ethtool|expand|expect|expr|fdformat|fdisk|fg|fgrep|file|find|fmt|fold|format|free|fsck|ftp|fuser|gawk|git|gparted|grep|groupadd|groupdel|groupmod|groups|grub-mkconfig|gzip|halt|head|hg|history|host|hostname|htop|iconv|id|ifconfig|ifdown|ifup|import|install|ip|java|jobs|join|kill|killall|less|link|ln|locate|logname|logrotate|look|lpc|lpr|lprint|lprintd|lprintq|lprm|ls|lsof|lynx|make|man|mc|mdadm|mkconfig|mkdir|mke2fs|mkfifo|mkfs|mkisofs|mknod|mkswap|mmv|more|most|mount|mtools|mtr|mutt|mv|nano|nc|netstat|nice|nl|node|nohup|notify-send|npm|nslookup|op|open|parted|passwd|paste|pathchk|ping|pkill|pnpm|podman|podman-compose|popd|pr|printcap|printenv|ps|pushd|pv|quota|quotacheck|quotactl|ram|rar|rcp|reboot|remsync|rename|renice|rev|rm|rmdir|rpm|rsync|scp|screen|sdiff|sed|sendmail|seq|service|sftp|sh|shellcheck|shuf|shutdown|sleep|slocate|sort|split|ssh|stat|strace|su|sudo|sum|suspend|swapon|sync|sysctl|tac|tail|tar|tee|time|timeout|top|touch|tr|traceroute|tsort|tty|umount|uname|unexpand|uniq|units|unrar|unshar|unzip|update-grub|uptime|useradd|userdel|usermod|users|uudecode|uuencode|v|vcpkg|vdir|vi|vim|virsh|vmstat|wait|watch|wc|wget|whereis|which|who|whoami|write|xargs|xdg-open|yarn|yes|zenity|zip|zsh|zypper)(?=$|[)\s;|&])/,lookbehind:!0},keyword:{pattern:/(^|[\s;|&]|[<>]\()(?:case|do|done|elif|else|esac|fi|for|function|if|in|select|then|until|while)(?=$|[)\s;|&])/,lookbehind:!0},builtin:{pattern:/(^|[\s;|&]|[<>]\()(?:\.|:|alias|bind|break|builtin|caller|cd|command|continue|declare|echo|enable|eval|exec|exit|export|getopts|hash|help|let|local|logout|mapfile|printf|pwd|read|readarray|readonly|return|set|shift|shopt|source|test|times|trap|type|typeset|ulimit|umask|unalias|unset)(?=$|[)\s;|&])/,lookbehind:!0,alias:"class-name"},boolean:{pattern:/(^|[\s;|&]|[<>]\()(?:false|true)(?=$|[)\s;|&])/,lookbehind:!0},"file-descriptor":{pattern:/\B&\d\b/,alias:"important"},operator:{pattern:/\d?<>|>\||\+=|=[=~]?|!=?|<<[<-]?|[&\d]?>>|\d[<>]&?|[<>][&=]?|&[>&]?|\|[&|]?/,inside:{"file-descriptor":{pattern:/^\d/,alias:"important"}}},punctuation:/\$?\(\(?|\)\)?|\.\.|[{}[\];\\]/,number:{pattern:/(^|\s)(?:[1-9]\d*|0)(?:[.,]\d+)?\b/,lookbehind:!0}},t.inside=r.languages.bash;for(var n=["comment","function-name","for-or-select","assign-left","parameter","string","environment","function","keyword","builtin","boolean","file-descriptor","operator","punctuation","number"],s=a.variable[1].inside,o=0;o|(?:[a-zA-Z\d-]*!)?[\w\-%#;/?:@&=+$.~*'()]+)?/,a="(?:"+t.source+"(?:[ ]+"+e.source+")?|"+e.source+"(?:[ ]+"+t.source+")?)",n=/(?:[^\s\x00-\x08\x0e-\x1f!"#%&'*,\-:>?@[\]`{|}\x7f-\x84\x86-\x9f\ud800-\udfff\ufffe\uffff]|[?:-])(?:[ \t]*(?:(?![#:])|:))*/.source.replace(//g,function(){return/[^\s\x00-\x08\x0e-\x1f,[\]{}\x7f-\x84\x86-\x9f\ud800-\udfff\ufffe\uffff]/.source}),s=/"(?:[^"\\\r\n]|\\.)*"|'(?:[^'\\\r\n]|\\.)*'/.source;function o(u,h){h=(h||"").replace(/m/g,"")+"m";var m=/([:\-,[{]\s*(?:\s<>[ \t]+)?)(?:<>)(?=[ \t]*(?:$|,|\]|\}|(?:[\r\n]\s*)?#))/.source.replace(/<>/g,function(){return a}).replace(/<>/g,function(){return u});return RegExp(m,h)}r.languages.yaml={scalar:{pattern:RegExp(/([\-:]\s*(?:\s<>[ \t]+)?[|>])[ \t]*(?:((?:\r?\n|\r)[ \t]+)\S[^\r\n]*(?:\2[^\r\n]+)*)/.source.replace(/<>/g,function(){return a})),lookbehind:!0,alias:"string"},comment:/#.*/,key:{pattern:RegExp(/((?:^|[:\-,[{\r\n?])[ \t]*(?:<>[ \t]+)?)<>(?=\s*:\s)/.source.replace(/<>/g,function(){return a}).replace(/<>/g,function(){return"(?:"+n+"|"+s+")"})),lookbehind:!0,greedy:!0,alias:"atrule"},directive:{pattern:/(^[ \t]*)%.+/m,lookbehind:!0,alias:"important"},datetime:{pattern:o(/\d{4}-\d\d?-\d\d?(?:[tT]|[ \t]+)\d\d?:\d{2}:\d{2}(?:\.\d*)?(?:[ \t]*(?:Z|[-+]\d\d?(?::\d{2})?))?|\d{4}-\d{2}-\d{2}|\d\d?:\d{2}(?::\d{2}(?:\.\d*)?)?/.source),lookbehind:!0,alias:"number"},boolean:{pattern:o(/false|true/.source,"i"),lookbehind:!0,alias:"important"},null:{pattern:o(/null|~/.source,"i"),lookbehind:!0,alias:"important"},string:{pattern:o(s),lookbehind:!0,greedy:!0},number:{pattern:o(/[+-]?(?:0x[\da-f]+|0o[0-7]+|(?:\d+(?:\.\d*)?|\.\d+)(?:e[+-]?\d+)?|\.inf|\.nan)/.source,"i"),lookbehind:!0},tag:t,important:e,punctuation:/---|[:[\]{}\-,|>?]|\.\.\./},r.languages.yml=r.languages.yaml})(Prism);(function(r){var e=/(?:[\w-]+|'[^'\n\r]*'|"(?:\\.|[^\\"\r\n])*")/.source;function t(a){return a.replace(/__/g,function(){return e})}r.languages.toml={comment:{pattern:/#.*/,greedy:!0},table:{pattern:RegExp(t(/(^[\t ]*\[\s*(?:\[\s*)?)__(?:\s*\.\s*__)*(?=\s*\])/.source),"m"),lookbehind:!0,greedy:!0,alias:"class-name"},key:{pattern:RegExp(t(/(^[\t ]*|[{,]\s*)__(?:\s*\.\s*__)*(?=\s*=)/.source),"m"),lookbehind:!0,greedy:!0,alias:"property"},string:{pattern:/"""(?:\\[\s\S]|[^\\])*?"""|'''[\s\S]*?'''|'[^'\n\r]*'|"(?:\\.|[^\\"\r\n])*"/,greedy:!0},date:[{pattern:/\b\d{4}-\d{2}-\d{2}(?:[T\s]\d{2}:\d{2}:\d{2}(?:\.\d+)?(?:Z|[+-]\d{2}:\d{2})?)?\b/i,alias:"number"},{pattern:/\b\d{2}:\d{2}:\d{2}(?:\.\d+)?\b/,alias:"number"}],number:/(?:\b0(?:x[\da-zA-Z]+(?:_[\da-zA-Z]+)*|o[0-7]+(?:_[0-7]+)*|b[10]+(?:_[10]+)*))\b|[-+]?\b\d+(?:_\d+)*(?:\.\d+(?:_\d+)*)?(?:[eE][+-]?\d+(?:_\d+)*)?\b|[-+]?\b(?:inf|nan)\b/,boolean:/\b(?:false|true)\b/,punctuation:/[.,=[\]{}]/}})(Prism);(function(r){r.languages.diff={coord:[/^(?:\*{3}|-{3}|\+{3}).*$/m,/^@@.*@@$/m,/^\d.*$/m]};var e={"deleted-sign":"-","deleted-arrow":"<","inserted-sign":"+","inserted-arrow":">",unchanged:" ",diff:"!"};Object.keys(e).forEach(function(t){var a=e[t],n=[];/^\w+$/.test(t)||n.push(/\w+/.exec(t)[0]),t==="diff"&&n.push("bold"),r.languages.diff[t]={pattern:RegExp("^(?:["+a+`].*(?:\r +?| +|(?![\\s\\S])))+`,"m"),alias:n,inside:{line:{pattern:/(.)(?=[\s\S]).*(?:\r\n?|\n)?/,lookbehind:!0},prefix:{pattern:/[\s\S]/,alias:/\w+/.exec(t)[0]}}}}),Object.defineProperty(r.languages.diff,"PREFIXES",{value:e})})(Prism);Prism.languages.sql={comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?\*\/|(?:--|\/\/|#).*)/,lookbehind:!0},variable:[{pattern:/@(["'`])(?:\\[\s\S]|(?!\1)[^\\])+\1/,greedy:!0},/@[\w.$]+/],string:{pattern:/(^|[^@\\])("|')(?:\\[\s\S]|(?!\2)[^\\]|\2\2)*\2/,greedy:!0,lookbehind:!0},identifier:{pattern:/(^|[^@\\])`(?:\\[\s\S]|[^`\\]|``)*`/,greedy:!0,lookbehind:!0,inside:{punctuation:/^`|`$/}},function:/\b(?:AVG|COUNT|FIRST|FORMAT|LAST|LCASE|LEN|MAX|MID|MIN|MOD|NOW|ROUND|SUM|UCASE)(?=\s*\()/i,keyword:/\b(?:ACTION|ADD|AFTER|ALGORITHM|ALL|ALTER|ANALYZE|ANY|APPLY|AS|ASC|AUTHORIZATION|AUTO_INCREMENT|BACKUP|BDB|BEGIN|BERKELEYDB|BIGINT|BINARY|BIT|BLOB|BOOL|BOOLEAN|BREAK|BROWSE|BTREE|BULK|BY|CALL|CASCADED?|CASE|CHAIN|CHAR(?:ACTER|SET)?|CHECK(?:POINT)?|CLOSE|CLUSTERED|COALESCE|COLLATE|COLUMNS?|COMMENT|COMMIT(?:TED)?|COMPUTE|CONNECT|CONSISTENT|CONSTRAINT|CONTAINS(?:TABLE)?|CONTINUE|CONVERT|CREATE|CROSS|CURRENT(?:_DATE|_TIME|_TIMESTAMP|_USER)?|CURSOR|CYCLE|DATA(?:BASES?)?|DATE(?:TIME)?|DAY|DBCC|DEALLOCATE|DEC|DECIMAL|DECLARE|DEFAULT|DEFINER|DELAYED|DELETE|DELIMITERS?|DENY|DESC|DESCRIBE|DETERMINISTIC|DISABLE|DISCARD|DISK|DISTINCT|DISTINCTROW|DISTRIBUTED|DO|DOUBLE|DROP|DUMMY|DUMP(?:FILE)?|DUPLICATE|ELSE(?:IF)?|ENABLE|ENCLOSED|END|ENGINE|ENUM|ERRLVL|ERRORS|ESCAPED?|EXCEPT|EXEC(?:UTE)?|EXISTS|EXIT|EXPLAIN|EXTENDED|FETCH|FIELDS|FILE|FILLFACTOR|FIRST|FIXED|FLOAT|FOLLOWING|FOR(?: EACH ROW)?|FORCE|FOREIGN|FREETEXT(?:TABLE)?|FROM|FULL|FUNCTION|GEOMETRY(?:COLLECTION)?|GLOBAL|GOTO|GRANT|GROUP|HANDLER|HASH|HAVING|HOLDLOCK|HOUR|IDENTITY(?:COL|_INSERT)?|IF|IGNORE|IMPORT|INDEX|INFILE|INNER|INNODB|INOUT|INSERT|INT|INTEGER|INTERSECT|INTERVAL|INTO|INVOKER|ISOLATION|ITERATE|JOIN|KEYS?|KILL|LANGUAGE|LAST|LEAVE|LEFT|LEVEL|LIMIT|LINENO|LINES|LINESTRING|LOAD|LOCAL|LOCK|LONG(?:BLOB|TEXT)|LOOP|MATCH(?:ED)?|MEDIUM(?:BLOB|INT|TEXT)|MERGE|MIDDLEINT|MINUTE|MODE|MODIFIES|MODIFY|MONTH|MULTI(?:LINESTRING|POINT|POLYGON)|NATIONAL|NATURAL|NCHAR|NEXT|NO|NONCLUSTERED|NULLIF|NUMERIC|OFF?|OFFSETS?|ON|OPEN(?:DATASOURCE|QUERY|ROWSET)?|OPTIMIZE|OPTION(?:ALLY)?|ORDER|OUT(?:ER|FILE)?|OVER|PARTIAL|PARTITION|PERCENT|PIVOT|PLAN|POINT|POLYGON|PRECEDING|PRECISION|PREPARE|PREV|PRIMARY|PRINT|PRIVILEGES|PROC(?:EDURE)?|PUBLIC|PURGE|QUICK|RAISERROR|READS?|REAL|RECONFIGURE|REFERENCES|RELEASE|RENAME|REPEAT(?:ABLE)?|REPLACE|REPLICATION|REQUIRE|RESIGNAL|RESTORE|RESTRICT|RETURN(?:ING|S)?|REVOKE|RIGHT|ROLLBACK|ROUTINE|ROW(?:COUNT|GUIDCOL|S)?|RTREE|RULE|SAVE(?:POINT)?|SCHEMA|SECOND|SELECT|SERIAL(?:IZABLE)?|SESSION(?:_USER)?|SET(?:USER)?|SHARE|SHOW|SHUTDOWN|SIMPLE|SMALLINT|SNAPSHOT|SOME|SONAME|SQL|START(?:ING)?|STATISTICS|STATUS|STRIPED|SYSTEM_USER|TABLES?|TABLESPACE|TEMP(?:ORARY|TABLE)?|TERMINATED|TEXT(?:SIZE)?|THEN|TIME(?:STAMP)?|TINY(?:BLOB|INT|TEXT)|TOP?|TRAN(?:SACTIONS?)?|TRIGGER|TRUNCATE|TSEQUAL|TYPES?|UNBOUNDED|UNCOMMITTED|UNDEFINED|UNION|UNIQUE|UNLOCK|UNPIVOT|UNSIGNED|UPDATE(?:TEXT)?|USAGE|USE|USER|USING|VALUES?|VAR(?:BINARY|CHAR|CHARACTER|YING)|VIEW|WAITFOR|WARNINGS|WHEN|WHERE|WHILE|WITH(?: ROLLUP|IN)?|WORK|WRITE(?:TEXT)?|YEAR)\b/i,boolean:/\b(?:FALSE|NULL|TRUE)\b/i,number:/\b0x[\da-f]+\b|\b\d+(?:\.\d*)?|\B\.\d+\b/i,operator:/[-+*\/=%^~]|&&?|\|\|?|!=?|<(?:=>?|<|>)?|>[>=]?|\b(?:AND|BETWEEN|DIV|ILIKE|IN|IS|LIKE|NOT|OR|REGEXP|RLIKE|SOUNDS LIKE|XOR)\b/i,punctuation:/[;[\]()`,.]/};var or={},ur;function gn(){return ur||(ur=1,(function(r){for(var e=/\/\*(?:[^*/]|\*(?!\/)|\/(?!\*)|)*\*\//.source,t=0;t<2;t++)e=e.replace(//g,function(){return e});e=e.replace(//g,function(){return/[^\s\S]/.source}),r.languages.rust={comment:[{pattern:RegExp(/(^|[^\\])/.source+e),lookbehind:!0,greedy:!0},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0,greedy:!0}],string:{pattern:/b?"(?:\\[\s\S]|[^\\"])*"|b?r(#*)"(?:[^"]|"(?!\1))*"\1/,greedy:!0},char:{pattern:/b?'(?:\\(?:x[0-7][\da-fA-F]|u\{(?:[\da-fA-F]_*){1,6}\}|.)|[^\\\r\n\t'])'/,greedy:!0},attribute:{pattern:/#!?\[(?:[^\[\]"]|"(?:\\[\s\S]|[^\\"])*")*\]/,greedy:!0,alias:"attr-name",inside:{string:null}},"closure-params":{pattern:/([=(,:]\s*|\bmove\s*)\|[^|]*\||\|[^|]*\|(?=\s*(?:\{|->))/,lookbehind:!0,greedy:!0,inside:{"closure-punctuation":{pattern:/^\||\|$/,alias:"punctuation"},rest:null}},"lifetime-annotation":{pattern:/'\w+/,alias:"symbol"},"fragment-specifier":{pattern:/(\$\w+:)[a-z]+/,lookbehind:!0,alias:"punctuation"},variable:/\$\w+/,"function-definition":{pattern:/(\bfn\s+)\w+/,lookbehind:!0,alias:"function"},"type-definition":{pattern:/(\b(?:enum|struct|trait|type|union)\s+)\w+/,lookbehind:!0,alias:"class-name"},"module-declaration":[{pattern:/(\b(?:crate|mod)\s+)[a-z][a-z_\d]*/,lookbehind:!0,alias:"namespace"},{pattern:/(\b(?:crate|self|super)\s*)::\s*[a-z][a-z_\d]*\b(?:\s*::(?:\s*[a-z][a-z_\d]*\s*::)*)?/,lookbehind:!0,alias:"namespace",inside:{punctuation:/::/}}],keyword:[/\b(?:Self|abstract|as|async|await|become|box|break|const|continue|crate|do|dyn|else|enum|extern|final|fn|for|if|impl|in|let|loop|macro|match|mod|move|mut|override|priv|pub|ref|return|self|static|struct|super|trait|try|type|typeof|union|unsafe|unsized|use|virtual|where|while|yield)\b/,/\b(?:bool|char|f(?:32|64)|[ui](?:8|16|32|64|128|size)|str)\b/],function:/\b[a-z_]\w*(?=\s*(?:::\s*<|\())/,macro:{pattern:/\b\w+!/,alias:"property"},constant:/\b[A-Z_][A-Z_\d]+\b/,"class-name":/\b[A-Z]\w*\b/,namespace:{pattern:/(?:\b[a-z][a-z_\d]*\s*::\s*)*\b[a-z][a-z_\d]*\s*::(?!\s*<)/,inside:{punctuation:/::/}},number:/\b(?:0x[\dA-Fa-f](?:_?[\dA-Fa-f])*|0o[0-7](?:_?[0-7])*|0b[01](?:_?[01])*|(?:(?:\d(?:_?\d)*)?\.)?\d(?:_?\d)*(?:[Ee][+-]?\d+)?)(?:_?(?:f32|f64|[iu](?:8|16|32|64|size)?))?\b/,boolean:/\b(?:false|true)\b/,punctuation:/->|\.\.=|\.{1,3}|::|[{}[\];(),:]/,operator:/[-+*\/%!^]=?|=[=>]?|&[&=]?|\|[|=]?|<>?=?|[@?]/},r.languages.rust["closure-params"].inside.rest=r.languages.rust,r.languages.rust.attribute.inside.string=r.languages.rust.string})(Prism)),or}gn();Prism.languages.go=Prism.languages.extend("clike",{string:{pattern:/(^|[^\\])"(?:\\.|[^"\\\r\n])*"|`[^`]*`/,lookbehind:!0,greedy:!0},keyword:/\b(?:break|case|chan|const|continue|default|defer|else|fallthrough|for|func|go(?:to)?|if|import|interface|map|package|range|return|select|struct|switch|type|var)\b/,boolean:/\b(?:_|false|iota|nil|true)\b/,number:[/\b0(?:b[01_]+|o[0-7_]+)i?\b/i,/\b0x(?:[a-f\d_]+(?:\.[a-f\d_]*)?|\.[a-f\d_]+)(?:p[+-]?\d+(?:_\d+)*)?i?(?!\w)/i,/(?:\b\d[\d_]*(?:\.[\d_]*)?|\B\.\d[\d_]*)(?:e[+-]?[\d_]+)?i?(?!\w)/i],operator:/[*\/%^!=]=?|\+[=+]?|-[=-]?|\|[=|]?|&(?:=|&|\^=?)?|>(?:>=?|=)?|<(?:<=?|=|-)?|:=|\.\.\./,builtin:/\b(?:append|bool|byte|cap|close|complex|complex(?:64|128)|copy|delete|error|float(?:32|64)|u?int(?:8|16|32|64)?|imag|len|make|new|panic|print(?:ln)?|real|recover|rune|string|uintptr)\b/});Prism.languages.insertBefore("go","string",{char:{pattern:/'(?:\\.|[^'\\\r\n]){0,10}'/,greedy:!0}});delete Prism.languages.go["class-name"];var cr={},hr;function bn(){return hr||(hr=1,Prism.languages.python={comment:{pattern:/(^|[^\\])#.*/,lookbehind:!0,greedy:!0},"string-interpolation":{pattern:/(?:f|fr|rf)(?:("""|''')[\s\S]*?\1|("|')(?:\\.|(?!\2)[^\\\r\n])*\2)/i,greedy:!0,inside:{interpolation:{pattern:/((?:^|[^{])(?:\{\{)*)\{(?!\{)(?:[^{}]|\{(?!\{)(?:[^{}]|\{(?!\{)(?:[^{}])+\})+\})+\}/,lookbehind:!0,inside:{"format-spec":{pattern:/(:)[^:(){}]+(?=\}$)/,lookbehind:!0},"conversion-option":{pattern:/![sra](?=[:}]$)/,alias:"punctuation"},rest:null}},string:/[\s\S]+/}},"triple-quoted-string":{pattern:/(?:[rub]|br|rb)?("""|''')[\s\S]*?\1/i,greedy:!0,alias:"string"},string:{pattern:/(?:[rub]|br|rb)?("|')(?:\\.|(?!\1)[^\\\r\n])*\1/i,greedy:!0},function:{pattern:/((?:^|\s)def[ \t]+)[a-zA-Z_]\w*(?=\s*\()/g,lookbehind:!0},"class-name":{pattern:/(\bclass\s+)\w+/i,lookbehind:!0},decorator:{pattern:/(^[\t ]*)@\w+(?:\.\w+)*/m,lookbehind:!0,alias:["annotation","punctuation"],inside:{punctuation:/\./}},keyword:/\b(?:_(?=\s*:)|and|as|assert|async|await|break|case|class|continue|def|del|elif|else|except|exec|finally|for|from|global|if|import|in|is|lambda|match|nonlocal|not|or|pass|print|raise|return|try|while|with|yield)\b/,builtin:/\b(?:__import__|abs|all|any|apply|ascii|basestring|bin|bool|buffer|bytearray|bytes|callable|chr|classmethod|cmp|coerce|compile|complex|delattr|dict|dir|divmod|enumerate|eval|execfile|file|filter|float|format|frozenset|getattr|globals|hasattr|hash|help|hex|id|input|int|intern|isinstance|issubclass|iter|len|list|locals|long|map|max|memoryview|min|next|object|oct|open|ord|pow|property|range|raw_input|reduce|reload|repr|reversed|round|set|setattr|slice|sorted|staticmethod|str|sum|super|tuple|type|unichr|unicode|vars|xrange|zip)\b/,boolean:/\b(?:False|None|True)\b/,number:/\b0(?:b(?:_?[01])+|o(?:_?[0-7])+|x(?:_?[a-f0-9])+)\b|(?:\b\d+(?:_\d+)*(?:\.(?:\d+(?:_\d+)*)?)?|\B\.\d+(?:_\d+)*)(?:e[+-]?\d+(?:_\d+)*)?j?(?!\w)/i,operator:/[-+%=]=?|!=|:=|\*\*?=?|\/\/?=?|<[<=>]?|>[=>]?|[&|^~]/,punctuation:/[{}[\];(),.:]/},Prism.languages.python["string-interpolation"].inside.interpolation.inside.rest=Prism.languages.python,Prism.languages.py=Prism.languages.python),cr}bn();var dr={},mr;function yn(){return mr||(mr=1,(function(r){var e=/\b(?:alignas|alignof|asm|auto|bool|break|case|catch|char|char16_t|char32_t|char8_t|class|co_await|co_return|co_yield|compl|concept|const|const_cast|consteval|constexpr|constinit|continue|decltype|default|delete|do|double|dynamic_cast|else|enum|explicit|export|extern|final|float|for|friend|goto|if|import|inline|int|int16_t|int32_t|int64_t|int8_t|long|module|mutable|namespace|new|noexcept|nullptr|operator|override|private|protected|public|register|reinterpret_cast|requires|return|short|signed|sizeof|static|static_assert|static_cast|struct|switch|template|this|thread_local|throw|try|typedef|typeid|typename|uint16_t|uint32_t|uint64_t|uint8_t|union|unsigned|using|virtual|void|volatile|wchar_t|while)\b/,t=/\b(?!)\w+(?:\s*\.\s*\w+)*\b/.source.replace(//g,function(){return e.source});r.languages.cpp=r.languages.extend("c",{"class-name":[{pattern:RegExp(/(\b(?:class|concept|enum|struct|typename)\s+)(?!)\w+/.source.replace(//g,function(){return e.source})),lookbehind:!0},/\b[A-Z]\w*(?=\s*::\s*\w+\s*\()/,/\b[A-Z_]\w*(?=\s*::\s*~\w+\s*\()/i,/\b\w+(?=\s*<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>\s*::\s*\w+\s*\()/],keyword:e,number:{pattern:/(?:\b0b[01']+|\b0x(?:[\da-f']+(?:\.[\da-f']*)?|\.[\da-f']+)(?:p[+-]?[\d']+)?|(?:\b[\d']+(?:\.[\d']*)?|\B\.[\d']+)(?:e[+-]?[\d']+)?)[ful]{0,4}/i,greedy:!0},operator:/>>=?|<<=?|->|--|\+\+|&&|\|\||[?:~]|<=>|[-+*/%&|^!=<>]=?|\b(?:and|and_eq|bitand|bitor|not|not_eq|or|or_eq|xor|xor_eq)\b/,boolean:/\b(?:false|true)\b/}),r.languages.insertBefore("cpp","string",{module:{pattern:RegExp(/(\b(?:import|module)\s+)/.source+"(?:"+/"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"|<[^<>\r\n]*>/.source+"|"+/(?:\s*:\s*)?|:\s*/.source.replace(//g,function(){return t})+")"),lookbehind:!0,greedy:!0,inside:{string:/^[<"][\s\S]+/,operator:/:/,punctuation:/\./}},"raw-string":{pattern:/R"([^()\\ ]{0,16})\([\s\S]*?\)\1"/,alias:"string",greedy:!0}}),r.languages.insertBefore("cpp","keyword",{"generic-function":{pattern:/\b(?!operator\b)[a-z_]\w*\s*<(?:[^<>]|<[^<>]*>)*>(?=\s*\()/i,inside:{function:/^\w+/,generic:{pattern:/<[\s\S]+/,alias:"class-name",inside:r.languages.cpp}}}}),r.languages.insertBefore("cpp","operator",{"double-colon":{pattern:/::/,alias:"punctuation"}}),r.languages.insertBefore("cpp","class-name",{"base-clause":{pattern:/(\b(?:class|struct)\s+\w+\s*:\s*)[^;{}"'\s]+(?:\s+[^;{}"'\s]+)*(?=\s*[;{])/,lookbehind:!0,greedy:!0,inside:r.languages.extend("cpp",{})}}),r.languages.insertBefore("inside","double-colon",{"class-name":/\b[a-z_]\w*\b(?!\s*::)/i},r.languages.cpp["base-clause"])})(Prism)),dr}yn();var pr={},fr;function xn(){return fr||(fr=1,(function(r){var e=/\b(?:abstract|assert|boolean|break|byte|case|catch|char|class|const|continue|default|do|double|else|enum|exports|extends|final|finally|float|for|goto|if|implements|import|instanceof|int|interface|long|module|native|new|non-sealed|null|open|opens|package|permits|private|protected|provides|public|record(?!\s*[(){}[\]<>=%~.:,;?+\-*/&|^])|requires|return|sealed|short|static|strictfp|super|switch|synchronized|this|throw|throws|to|transient|transitive|try|uses|var|void|volatile|while|with|yield)\b/,t=/(?:[a-z]\w*\s*\.\s*)*(?:[A-Z]\w*\s*\.\s*)*/.source,a={pattern:RegExp(/(^|[^\w.])/.source+t+/[A-Z](?:[\d_A-Z]*[a-z]\w*)?\b/.source),lookbehind:!0,inside:{namespace:{pattern:/^[a-z]\w*(?:\s*\.\s*[a-z]\w*)*(?:\s*\.)?/,inside:{punctuation:/\./}},punctuation:/\./}};r.languages.java=r.languages.extend("clike",{string:{pattern:/(^|[^\\])"(?:\\.|[^"\\\r\n])*"/,lookbehind:!0,greedy:!0},"class-name":[a,{pattern:RegExp(/(^|[^\w.])/.source+t+/[A-Z]\w*(?=\s+\w+\s*[;,=()]|\s*(?:\[[\s,]*\]\s*)?::\s*new\b)/.source),lookbehind:!0,inside:a.inside},{pattern:RegExp(/(\b(?:class|enum|extends|implements|instanceof|interface|new|record|throws)\s+)/.source+t+/[A-Z]\w*\b/.source),lookbehind:!0,inside:a.inside}],keyword:e,function:[r.languages.clike.function,{pattern:/(::\s*)[a-z_]\w*/,lookbehind:!0}],number:/\b0b[01][01_]*L?\b|\b0x(?:\.[\da-f_p+-]+|[\da-f_]+(?:\.[\da-f_p+-]+)?)\b|(?:\b\d[\d_]*(?:\.[\d_]*)?|\B\.\d[\d_]*)(?:e[+-]?\d[\d_]*)?[dfl]?/i,operator:{pattern:/(^|[^.])(?:<<=?|>>>?=?|->|--|\+\+|&&|\|\||::|[?:~]|[-+*/%&|^!=<>]=?)/m,lookbehind:!0},constant:/\b[A-Z][A-Z_\d]+\b/}),r.languages.insertBefore("java","string",{"triple-quoted-string":{pattern:/"""[ \t]*[\r\n](?:(?:"|"")?(?:\\.|[^"\\]))*"""/,greedy:!0,alias:"string"},char:{pattern:/'(?:\\.|[^'\\\r\n]){1,6}'/,greedy:!0}}),r.languages.insertBefore("java","class-name",{annotation:{pattern:/(^|[^.])@\w+(?:\s*\.\s*\w+)*/,lookbehind:!0,alias:"punctuation"},generics:{pattern:/<(?:[\w\s,.?]|&(?!&)|<(?:[\w\s,.?]|&(?!&)|<(?:[\w\s,.?]|&(?!&)|<(?:[\w\s,.?]|&(?!&))*>)*>)*>)*>/,inside:{"class-name":a,keyword:e,punctuation:/[<>(),.:]/,operator:/[?&|]/}},import:[{pattern:RegExp(/(\bimport\s+)/.source+t+/(?:[A-Z]\w*|\*)(?=\s*;)/.source),lookbehind:!0,inside:{namespace:a.inside.namespace,punctuation:/\./,operator:/\*/,"class-name":/\w+/}},{pattern:RegExp(/(\bimport\s+static\s+)/.source+t+/(?:\w+|\*)(?=\s*;)/.source),lookbehind:!0,alias:"static",inside:{namespace:a.inside.namespace,static:/\b\w+$/,punctuation:/\./,operator:/\*/,"class-name":/\w+/}}],namespace:{pattern:RegExp(/(\b(?:exports|import(?:\s+static)?|module|open|opens|package|provides|requires|to|transitive|uses|with)\s+)(?!)[a-z]\w*(?:\.[a-z]\w*)*\.?/.source.replace(//g,function(){return e.source})),lookbehind:!0,inside:{punctuation:/\./}}})})(Prism)),pr}xn();Prism.languages.javascript=Prism.languages.extend("clike",{"class-name":[Prism.languages.clike["class-name"],{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$A-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\.(?:constructor|prototype))/,lookbehind:!0}],keyword:[{pattern:/((?:^|\})\s*)catch\b/,lookbehind:!0},{pattern:/(^|[^.]|\.\.\.\s*)\b(?:as|assert(?=\s*\{)|async(?=\s*(?:function\b|\(|[$\w\xA0-\uFFFF]|$))|await|break|case|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally(?=\s*(?:\{|$))|for|from(?=\s*(?:['"]|$))|function|(?:get|set)(?=\s*(?:[#\[$\w\xA0-\uFFFF]|$))|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)\b/,lookbehind:!0}],function:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*(?:\.\s*(?:apply|bind|call)\s*)?\()/,number:{pattern:RegExp(/(^|[^\w$])/.source+"(?:"+(/NaN|Infinity/.source+"|"+/0[bB][01]+(?:_[01]+)*n?/.source+"|"+/0[oO][0-7]+(?:_[0-7]+)*n?/.source+"|"+/0[xX][\dA-Fa-f]+(?:_[\dA-Fa-f]+)*n?/.source+"|"+/\d+(?:_\d+)*n/.source+"|"+/(?:\d+(?:_\d+)*(?:\.(?:\d+(?:_\d+)*)?)?|\.\d+(?:_\d+)*)(?:[Ee][+-]?\d+(?:_\d+)*)?/.source)+")"+/(?![\w$])/.source),lookbehind:!0},operator:/--|\+\+|\*\*=?|=>|&&=?|\|\|=?|[!=]==|<<=?|>>>?=?|[-+*/%&|^!=<>]=?|\.{3}|\?\?=?|\?\.?|[~:]/});Prism.languages.javascript["class-name"][0].pattern=/(\b(?:class|extends|implements|instanceof|interface|new)\s+)[\w.\\]+/;Prism.languages.insertBefore("javascript","keyword",{regex:{pattern:RegExp(/((?:^|[^$\w\xA0-\uFFFF."'\])\s]|\b(?:return|yield))\s*)/.source+/\//.source+"(?:"+/(?:\[(?:[^\]\\\r\n]|\\.)*\]|\\.|[^/\\\[\r\n])+\/[dgimyus]{0,7}/.source+"|"+/(?:\[(?:[^[\]\\\r\n]|\\.|\[(?:[^[\]\\\r\n]|\\.|\[(?:[^[\]\\\r\n]|\\.)*\])*\])*\]|\\.|[^/\\\[\r\n])+\/[dgimyus]{0,7}v[dgimyus]{0,7}/.source+")"+/(?=(?:\s|\/\*(?:[^*]|\*(?!\/))*\*\/)*(?:$|[\r\n,.;:})\]]|\/\/))/.source),lookbehind:!0,greedy:!0,inside:{"regex-source":{pattern:/^(\/)[\s\S]+(?=\/[a-z]*$)/,lookbehind:!0,alias:"language-regex",inside:Prism.languages.regex},"regex-delimiter":/^\/|\/$/,"regex-flags":/^[a-z]+$/}},"function-variable":{pattern:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*[=:]\s*(?:async\s*)?(?:\bfunction\b|(?:\((?:[^()]|\([^()]*\))*\)|(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)\s*=>))/,alias:"function"},parameter:[{pattern:/(function(?:\s+(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)?\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\))/,lookbehind:!0,inside:Prism.languages.javascript},{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$a-z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*=>)/i,lookbehind:!0,inside:Prism.languages.javascript},{pattern:/(\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*=>)/,lookbehind:!0,inside:Prism.languages.javascript},{pattern:/((?:\b|\s|^)(?!(?:as|async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)(?![$\w\xA0-\uFFFF]))(?:(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*\s*)\(\s*|\]\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*\{)/,lookbehind:!0,inside:Prism.languages.javascript}],constant:/\b[A-Z](?:[A-Z_]|\dx?)*\b/});Prism.languages.insertBefore("javascript","string",{hashbang:{pattern:/^#!.*/,greedy:!0,alias:"comment"},"template-string":{pattern:/`(?:\\[\s\S]|\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}|(?!\$\{)[^\\`])*`/,greedy:!0,inside:{"template-punctuation":{pattern:/^`|`$/,alias:"string"},interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}/,lookbehind:!0,inside:{"interpolation-punctuation":{pattern:/^\$\{|\}$/,alias:"punctuation"},rest:Prism.languages.javascript}},string:/[\s\S]+/}},"string-property":{pattern:/((?:^|[,{])[ \t]*)(["'])(?:\\(?:\r\n|[\s\S])|(?!\2)[^\\\r\n])*\2(?=\s*:)/m,lookbehind:!0,greedy:!0,alias:"property"}});Prism.languages.insertBefore("javascript","operator",{"literal-property":{pattern:/((?:^|[,{])[ \t]*)(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*:)/m,lookbehind:!0,alias:"property"}});Prism.languages.markup&&(Prism.languages.markup.tag.addInlined("script","javascript"),Prism.languages.markup.tag.addAttribute(/on(?:abort|blur|change|click|composition(?:end|start|update)|dblclick|error|focus(?:in|out)?|key(?:down|up)|load|mouse(?:down|enter|leave|move|out|over|up)|reset|resize|scroll|select|slotchange|submit|unload|wheel)/.source,"javascript"));Prism.languages.js=Prism.languages.javascript;var vr={},gr;function wn(){return gr||(gr=1,(function(r){r.languages.typescript=r.languages.extend("javascript",{"class-name":{pattern:/(\b(?:class|extends|implements|instanceof|interface|new|type)\s+)(?!keyof\b)(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?:\s*<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>)?/,lookbehind:!0,greedy:!0,inside:null},builtin:/\b(?:Array|Function|Promise|any|boolean|console|never|number|string|symbol|unknown)\b/}),r.languages.typescript.keyword.push(/\b(?:abstract|declare|is|keyof|readonly|require)\b/,/\b(?:asserts|infer|interface|module|namespace|type)\b(?=\s*(?:[{_$a-zA-Z\xA0-\uFFFF]|$))/,/\btype\b(?=\s*(?:[\{*]|$))/),delete r.languages.typescript.parameter,delete r.languages.typescript["literal-property"];var e=r.languages.extend("typescript",{});delete e["class-name"],r.languages.typescript["class-name"].inside=e,r.languages.insertBefore("typescript","function",{decorator:{pattern:/@[$\w\xA0-\uFFFF]+/,inside:{at:{pattern:/^@/,alias:"operator"},function:/^[\s\S]+/}},"generic-function":{pattern:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*\s*<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>(?=\s*\()/,greedy:!0,inside:{function:/^#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*/,generic:{pattern:/<[\s\S]+/,alias:"class-name",inside:e}}}}),r.languages.ts=r.languages.typescript})(Prism)),vr}wn();(function(r){var e=/(?:\\.|[^\\\n\r]|(?:\n|\r\n?)(?![\r\n]))/.source;function t(p){return p=p.replace(//g,function(){return e}),RegExp(/((?:^|[^\\])(?:\\{2})*)/.source+"(?:"+p+")")}var a=/(?:\\.|``(?:[^`\r\n]|`(?!`))+``|`[^`\r\n]+`|[^\\|\r\n`])+/.source,n=/\|?__(?:\|__)+\|?(?:(?:\n|\r\n?)|(?![\s\S]))/.source.replace(/__/g,function(){return a}),s=/\|?[ \t]*:?-{3,}:?[ \t]*(?:\|[ \t]*:?-{3,}:?[ \t]*)+\|?(?:\n|\r\n?)/.source;r.languages.markdown=r.languages.extend("markup",{}),r.languages.insertBefore("markdown","prolog",{"front-matter-block":{pattern:/(^(?:\s*[\r\n])?)---(?!.)[\s\S]*?[\r\n]---(?!.)/,lookbehind:!0,greedy:!0,inside:{punctuation:/^---|---$/,"front-matter":{pattern:/\S+(?:\s+\S+)*/,alias:["yaml","language-yaml"],inside:r.languages.yaml}}},blockquote:{pattern:/^>(?:[\t ]*>)*/m,alias:"punctuation"},table:{pattern:RegExp("^"+n+s+"(?:"+n+")*","m"),inside:{"table-data-rows":{pattern:RegExp("^("+n+s+")(?:"+n+")*$"),lookbehind:!0,inside:{"table-data":{pattern:RegExp(a),inside:r.languages.markdown},punctuation:/\|/}},"table-line":{pattern:RegExp("^("+n+")"+s+"$"),lookbehind:!0,inside:{punctuation:/\||:?-{3,}:?/}},"table-header-row":{pattern:RegExp("^"+n+"$"),inside:{"table-header":{pattern:RegExp(a),alias:"important",inside:r.languages.markdown},punctuation:/\|/}}}},code:[{pattern:/((?:^|\n)[ \t]*\n|(?:^|\r\n?)[ \t]*\r\n?)(?: {4}|\t).+(?:(?:\n|\r\n?)(?: {4}|\t).+)*/,lookbehind:!0,alias:"keyword"},{pattern:/^```[\s\S]*?^```$/m,greedy:!0,inside:{"code-block":{pattern:/^(```.*(?:\n|\r\n?))[\s\S]+?(?=(?:\n|\r\n?)^```$)/m,lookbehind:!0},"code-language":{pattern:/^(```).+/,lookbehind:!0},punctuation:/```/}}],title:[{pattern:/\S.*(?:\n|\r\n?)(?:==+|--+)(?=[ \t]*$)/m,alias:"important",inside:{punctuation:/==+$|--+$/}},{pattern:/(^\s*)#.+/m,lookbehind:!0,alias:"important",inside:{punctuation:/^#+|#+$/}}],hr:{pattern:/(^\s*)([*-])(?:[\t ]*\2){2,}(?=\s*$)/m,lookbehind:!0,alias:"punctuation"},list:{pattern:/(^\s*)(?:[*+-]|\d+\.)(?=[\t ].)/m,lookbehind:!0,alias:"punctuation"},"url-reference":{pattern:/!?\[[^\]]+\]:[\t ]+(?:\S+|<(?:\\.|[^>\\])+>)(?:[\t ]+(?:"(?:\\.|[^"\\])*"|'(?:\\.|[^'\\])*'|\((?:\\.|[^)\\])*\)))?/,inside:{variable:{pattern:/^(!?\[)[^\]]+/,lookbehind:!0},string:/(?:"(?:\\.|[^"\\])*"|'(?:\\.|[^'\\])*'|\((?:\\.|[^)\\])*\))$/,punctuation:/^[\[\]!:]|[<>]/},alias:"url"},bold:{pattern:t(/\b__(?:(?!_)|_(?:(?!_))+_)+__\b|\*\*(?:(?!\*)|\*(?:(?!\*))+\*)+\*\*/.source),lookbehind:!0,greedy:!0,inside:{content:{pattern:/(^..)[\s\S]+(?=..$)/,lookbehind:!0,inside:{}},punctuation:/\*\*|__/}},italic:{pattern:t(/\b_(?:(?!_)|__(?:(?!_))+__)+_\b|\*(?:(?!\*)|\*\*(?:(?!\*))+\*\*)+\*/.source),lookbehind:!0,greedy:!0,inside:{content:{pattern:/(^.)[\s\S]+(?=.$)/,lookbehind:!0,inside:{}},punctuation:/[*_]/}},strike:{pattern:t(/(~~?)(?:(?!~))+\2/.source),lookbehind:!0,greedy:!0,inside:{content:{pattern:/(^~~?)[\s\S]+(?=\1$)/,lookbehind:!0,inside:{}},punctuation:/~~?/}},"code-snippet":{pattern:/(^|[^\\`])(?:``[^`\r\n]+(?:`[^`\r\n]+)*``(?!`)|`[^`\r\n]+`(?!`))/,lookbehind:!0,greedy:!0,alias:["code","keyword"]},url:{pattern:t(/!?\[(?:(?!\]))+\](?:\([^\s)]+(?:[\t ]+"(?:\\.|[^"\\])*")?\)|[ \t]?\[(?:(?!\]))+\])/.source),lookbehind:!0,greedy:!0,inside:{operator:/^!/,content:{pattern:/(^\[)[^\]]+(?=\])/,lookbehind:!0,inside:{}},variable:{pattern:/(^\][ \t]?\[)[^\]]+(?=\]$)/,lookbehind:!0},url:{pattern:/(^\]\()[^\s)]+/,lookbehind:!0},string:{pattern:/(^[ \t]+)"(?:\\.|[^"\\])*"(?=\)$)/,lookbehind:!0}}}}),["url","bold","italic","strike"].forEach(function(p){["url","bold","italic","strike","code-snippet"].forEach(function(g){p!==g&&(r.languages.markdown[p].inside.content.inside[g]=r.languages.markdown[g])})}),r.hooks.add("after-tokenize",function(p){if(p.language!=="markdown"&&p.language!=="md")return;function g(S){if(!(!S||typeof S=="string"))for(var x=0,D=S.length;x",quot:'"'},h=String.fromCodePoint||String.fromCharCode;function m(p){var g=p.replace(o,"");return g=g.replace(/&(\w{1,8}|#x?[\da-f]{1,8});/gi,function(S,x){if(x=x.toLowerCase(),x[0]==="#"){var D;return x[1]==="x"?D=parseInt(x.slice(2),16):D=Number(x.slice(1)),h(D)}else{var E=u[x];return E||S}}),g}r.languages.md=r.languages.markdown})(Prism);const Sn={py:"python",ts:"typescript",js:"javascript",sh:"bash",shell:"bash",yml:"yaml",html:"markup",xml:"markup",svg:"markup",text:"plaintext",txt:"plaintext"};function kn(r){const e=r.toLowerCase().trim(),t=Sn[e]||e;return $e.languages[t]?t:$e.languages[e]?e:"plaintext"}const An=5e4;function Tn(r){return r.length>An}function En(r,e){const t=$e.languages[e];return t?$e.highlight(r,t,e):Mn(r)}function Mn(r){return r.replace(/&/g,"&").replace(//g,">")}const br=a0.memo(function({language:e,code:t,isStreaming:a}){const n=e?kn(e):"plaintext",s=e||"",o=!a&&n!=="plaintext"&&!Tn(t),u=a0.useRef(null),[h,m]=a0.useState(!1),[p,g]=a0.useState(!1);return a0.useLayoutEffect(()=>{const S=u.current;if(!S)return;const x=()=>m(S.scrollHeight>121);x();const D=new ResizeObserver(x);return D.observe(S),()=>D.disconnect()},[]),U.jsxs("div",{"data-slot":"code-card","data-streaming":a||void 0,children:[U.jsxs("div",{"data-slot":"code-card-header",children:[s&&U.jsx("span",{"data-slot":"code-card-lang",children:s}),U.jsx(zn,{text:t})]}),U.jsx("div",{"data-slot":"code-card-body",ref:u,"data-expanded":p||void 0,children:o?U.jsx("code",{dangerouslySetInnerHTML:{__html:En(t,n)}}):U.jsx("code",{children:t})}),h&&U.jsx("button",{"data-slot":"code-card-expand","aria-expanded":p,"aria-label":p?"Collapse":"Expand",onClick:()=>g(S=>!S),children:U.jsx("svg",{viewBox:"0 0 16 16",fill:"none",children:U.jsx("path",{d:"M4 6l4 4 4-4",stroke:"currentColor",strokeWidth:"1.5",strokeLinecap:"round",strokeLinejoin:"round"})})})]})});function zn({text:r}){const[e,t]=a0.useState(!1),a=a0.useRef(),n=a0.useCallback(()=>{navigator.clipboard.writeText(r).then(()=>{t(!0),a.current&&clearTimeout(a.current),a.current=setTimeout(()=>t(!1),2e3)})},[r]);return typeof navigator>"u"||!navigator.clipboard?null:U.jsx("button",{"data-slot":"code-card-copy",onClick:n,title:e?"Copied":"Copy",children:e?U.jsx("svg",{width:"14",height:"14",viewBox:"0 0 16 16",fill:"none",children:U.jsx("path",{d:"M3 8.5l3 3 7-7",stroke:"currentColor",strokeWidth:"1.5",strokeLinecap:"round",strokeLinejoin:"round"})}):U.jsxs("svg",{width:"14",height:"14",viewBox:"0 0 16 16",fill:"none",children:[U.jsx("rect",{x:"5.5",y:"5.5",width:"7",height:"7",rx:"1",stroke:"currentColor",strokeWidth:"1.2"}),U.jsx("path",{d:"M3.5 10.5v-7a1 1 0 011-1h7",stroke:"currentColor",strokeWidth:"1.2",strokeLinecap:"round"})]})})}function Cn(r){const e=r.split(` +`),t=[];let a=0,n=0;for(const s of e){if(s.startsWith("diff --git")||s.startsWith("index ")||s.startsWith("--- ")||s.startsWith("+++ ")||s.startsWith("new file")||s.startsWith("deleted file")||s.startsWith("similarity index")||s.startsWith("rename from")||s.startsWith("rename to"))continue;const o=s.match(/^@@\s+-(\d+)(?:,\d+)?\s+\+(\d+)(?:,\d+)?\s+@@/);if(o){a=parseInt(o[1],10),n=parseInt(o[2],10),t.push({kind:"header",text:s});continue}if(s.startsWith("+"))t.push({kind:"add",text:s.slice(1),newLine:n++});else if(s.startsWith("-"))t.push({kind:"remove",text:s.slice(1),oldLine:a++});else{const u=s.startsWith(" ")?s.slice(1):s;t.push({kind:"context",text:u,oldLine:a++,newLine:n++})}}return t}const Rn=a0.memo(function({code:e}){const t=a0.useMemo(()=>Cn(e),[e]);return U.jsx("div",{"data-slot":"diff-block",children:t.map((a,n)=>U.jsxs("div",{"data-slot":"diff-line","data-diff-kind":a.kind,children:[a.kind!=="header"&&U.jsxs("span",{"data-slot":"diff-gutter",children:[U.jsx("span",{"data-slot":"diff-line-old",children:a.oldLine??""}),U.jsx("span",{"data-slot":"diff-line-new",children:a.newLine??""})]}),U.jsxs("span",{"data-slot":"diff-content",children:[a.kind==="add"&&U.jsx("span",{"data-slot":"diff-sign",children:"+"}),a.kind==="remove"&&U.jsx("span",{"data-slot":"diff-sign",children:"-"}),a.text]})]},n))})});class F extends Error{constructor(e,t){var a="KaTeX parse error: "+e,n,s,o=t&&t.loc;if(o&&o.start<=o.end){var u=o.lexer.input;n=o.start,s=o.end,n===u.length?a+=" at end of input: ":a+=" at position "+(n+1)+": ";var h=u.slice(n,s).replace(/[^]/g,"$&̲"),m;n>15?m="…"+u.slice(n-15,n):m=u.slice(0,n);var p;s+15r.replace(Fn,"-$1").toLowerCase(),Dn={"&":"&",">":">","<":"<",'"':""","'":"'"},Nn=/[&><"']/g,c0=r=>String(r).replace(Nn,e=>Dn[e]),Pe=r=>r.type==="ordgroup"||r.type==="color"?r.body.length===1?Pe(r.body[0]):r:r.type==="font"?Pe(r.body):r,Bn=new Set(["mathord","textord","atom"]),_0=r=>Bn.has(Pe(r).type),On=r=>{var e=/^[\x00-\x20]*([^\\/#?]*?)(:|�*58|�*3a|&colon)/i.exec(r);return e?e[2]!==":"||!/^[a-zA-Z][a-zA-Z0-9+\-.]*$/.test(e[1])?null:e[1].toLowerCase():"_relative"},xt={displayMode:{type:"boolean",description:"Render math in display mode, which puts the math in display style (so \\int and \\sum are large, for example), and centers the math on the page on its own line.",cli:"-d, --display-mode"},output:{type:{enum:["htmlAndMathml","html","mathml"]},description:"Determines the markup language of the output.",cli:"-F, --format "},leqno:{type:"boolean",description:"Render display math in leqno style (left-justified tags)."},fleqn:{type:"boolean",description:"Render display math flush left."},throwOnError:{type:"boolean",default:!0,cli:"-t, --no-throw-on-error",cliDescription:"Render errors (in the color given by --error-color) instead of throwing a ParseError exception when encountering an error."},errorColor:{type:"string",default:"#cc0000",cli:"-c, --error-color ",cliDescription:"A color string given in the format 'rgb' or 'rrggbb' (no #). This option determines the color of errors rendered by the -t option.",cliProcessor:r=>"#"+r},macros:{type:"object",cli:"-m, --macro ",cliDescription:"Define custom macro of the form '\\foo:expansion' (use multiple -m arguments for multiple macros).",cliDefault:[],cliProcessor:(r,e)=>(e.push(r),e)},minRuleThickness:{type:"number",description:"Specifies a minimum thickness, in ems, for fraction lines, `\\sqrt` top lines, `{array}` vertical lines, `\\hline`, `\\hdashline`, `\\underline`, `\\overline`, and the borders of `\\fbox`, `\\boxed`, and `\\fcolorbox`.",processor:r=>Math.max(0,r),cli:"--min-rule-thickness ",cliProcessor:parseFloat},colorIsTextColor:{type:"boolean",description:"Makes \\color behave like LaTeX's 2-argument \\textcolor, instead of LaTeX's one-argument \\color mode change.",cli:"-b, --color-is-text-color"},strict:{type:[{enum:["warn","ignore","error"]},"boolean","function"],description:"Turn on strict / LaTeX faithfulness mode, which throws an error if the input uses features that are not supported by LaTeX.",cli:"-S, --strict",cliDefault:!1},trust:{type:["boolean","function"],description:"Trust the input, enabling all HTML features such as \\url.",cli:"-T, --trust"},maxSize:{type:"number",default:1/0,description:"If non-zero, all user-specified sizes, e.g. in \\rule{500em}{500em}, will be capped to maxSize ems. Otherwise, elements and spaces can be arbitrarily large",processor:r=>Math.max(0,r),cli:"-s, --max-size ",cliProcessor:parseInt},maxExpand:{type:"number",default:1e3,description:"Limit the number of macro expansions to the specified number, to prevent e.g. infinite macro loops. If set to Infinity, the macro expander will try to fully expand as in LaTeX.",processor:r=>Math.max(0,r),cli:"-e, --max-expand ",cliProcessor:r=>r==="Infinity"?1/0:parseInt(r)},globalGroup:{type:"boolean",cli:!1}};function Ln(r){if(typeof r!="string")return r.enum[0];switch(r){case"boolean":return!1;case"string":return"";case"number":return 0;case"object":return{};default:throw new Error("Unexpected schema type; settings must declare an explicit default.")}}function qn(r){if(r.default!==void 0)return r.default;var e=Array.isArray(r.type)?r.type[0]:r.type;return Ln(e)}function Pn(r,e,t,a){var n=t[e];r[e]=n!==void 0?a.processor?a.processor(n):n:qn(a)}class Pt{constructor(e){e===void 0&&(e={}),this.displayMode=void 0,this.output=void 0,this.leqno=void 0,this.fleqn=void 0,this.throwOnError=void 0,this.errorColor=void 0,this.macros=void 0,this.minRuleThickness=void 0,this.colorIsTextColor=void 0,this.strict=void 0,this.trust=void 0,this.maxSize=void 0,this.maxExpand=void 0,this.globalGroup=void 0,e=e||{};for(var t of Object.keys(xt)){var a=xt[t];a&&Pn(this,t,e,a)}}reportNonstrict(e,t,a){var n=this.strict;if(typeof n=="function"&&(n=n(e,t,a)),!(!n||n==="ignore")){if(n===!0||n==="error")throw new F("LaTeX-incompatible input and strict mode is set to 'error': "+(t+" ["+e+"]"),a);n==="warn"?typeof console<"u"&&console.warn("LaTeX-incompatible input and strict mode is set to 'warn': "+(t+" ["+e+"]")):typeof console<"u"&&console.warn("LaTeX-incompatible input and strict mode is set to "+("unrecognized '"+n+"': "+t+" ["+e+"]"))}}useStrictBehavior(e,t,a){var n=this.strict;if(typeof n=="function")try{n=n(e,t,a)}catch{n="error"}return!n||n==="ignore"?!1:n===!0||n==="error"?!0:n==="warn"?(typeof console<"u"&&console.warn("LaTeX-incompatible input and strict mode is set to 'warn': "+(t+" ["+e+"]")),!1):(typeof console<"u"&&console.warn("LaTeX-incompatible input and strict mode is set to "+("unrecognized '"+n+"': "+t+" ["+e+"]")),!1)}isTrusted(e){if("url"in e&&e.url&&!e.protocol){var t=On(e.url);if(t==null)return!1;e.protocol=t}var a=typeof this.trust=="function"?this.trust(e):this.trust;return!!a}}class W0{constructor(e,t,a){this.id=void 0,this.size=void 0,this.cramped=void 0,this.id=e,this.size=t,this.cramped=a}sup(){return F0[Hn[this.id]]}sub(){return F0[$n[this.id]]}fracNum(){return F0[_n[this.id]]}fracDen(){return F0[Gn[this.id]]}cramp(){return F0[Un[this.id]]}text(){return F0[jn[this.id]]}isTight(){return this.size>=2}}var Ht=0,_e=1,he=2,H0=3,xe=4,M0=5,de=6,p0=7,F0=[new W0(Ht,0,!1),new W0(_e,0,!0),new W0(he,1,!1),new W0(H0,1,!0),new W0(xe,2,!1),new W0(M0,2,!0),new W0(de,3,!1),new W0(p0,3,!0)],Hn=[xe,M0,xe,M0,de,p0,de,p0],$n=[M0,M0,M0,M0,p0,p0,p0,p0],_n=[he,H0,xe,M0,de,p0,de,p0],Gn=[H0,H0,M0,M0,p0,p0,p0,p0],Un=[_e,_e,H0,H0,M0,M0,p0,p0],jn=[Ht,_e,he,H0,he,H0,he,H0],_={DISPLAY:F0[Ht],TEXT:F0[he],SCRIPT:F0[xe],SCRIPTSCRIPT:F0[de]},wt=[{name:"latin",blocks:[[256,591],[768,879]]},{name:"cyrillic",blocks:[[1024,1279]]},{name:"armenian",blocks:[[1328,1423]]},{name:"brahmic",blocks:[[2304,4255]]},{name:"georgian",blocks:[[4256,4351]]},{name:"cjk",blocks:[[12288,12543],[19968,40879],[65280,65376]]},{name:"hangul",blocks:[[44032,55215]]}];function Xn(r){for(var e=0;e=n[0]&&r<=n[1])return t.name}return null}var He=[];wt.forEach(r=>r.blocks.forEach(e=>He.push(...e)));function ia(r){for(var e=0;e=He[e]&&r<=He[e+1])return!0;return!1}var l0=r=>r+" "+r,ce=80,Vn=function(e,t){return"M95,"+(622+e+t)+` +c-2.7,0,-7.17,-2.7,-13.5,-8c-5.8,-5.3,-9.5,-10,-9.5,-14 +c0,-2,0.3,-3.3,1,-4c1.3,-2.7,23.83,-20.7,67.5,-54 +c44.2,-33.3,65.8,-50.3,66.5,-51c1.3,-1.3,3,-2,5,-2c4.7,0,8.7,3.3,12,10 +s173,378,173,378c0.7,0,35.3,-71,104,-213c68.7,-142,137.5,-285,206.5,-429 +c69,-144,104.5,-217.7,106.5,-221 +l`+e/2.075+" -"+e+` +c5.3,-9.3,12,-14,20,-14 +H400000v`+(40+e)+`H845.2724 +s-225.272,467,-225.272,467s-235,486,-235,486c-2.7,4.7,-9,7,-19,7 +c-6,0,-10,-1,-12,-3s-194,-422,-194,-422s-65,47,-65,47z +M`+(834+e)+" "+t+"h400000v"+(40+e)+"h-400000z"},Wn=function(e,t){return"M263,"+(601+e+t)+`c0.7,0,18,39.7,52,119 +c34,79.3,68.167,158.7,102.5,238c34.3,79.3,51.8,119.3,52.5,120 +c340,-704.7,510.7,-1060.3,512,-1067 +l`+e/2.084+" -"+e+` +c4.7,-7.3,11,-11,19,-11 +H40000v`+(40+e)+`H1012.3 +s-271.3,567,-271.3,567c-38.7,80.7,-84,175,-136,283c-52,108,-89.167,185.3,-111.5,232 +c-22.3,46.7,-33.8,70.3,-34.5,71c-4.7,4.7,-12.3,7,-23,7s-12,-1,-12,-1 +s-109,-253,-109,-253c-72.7,-168,-109.3,-252,-110,-252c-10.7,8,-22,16.7,-34,26 +c-22,17.3,-33.3,26,-34,26s-26,-26,-26,-26s76,-59,76,-59s76,-60,76,-60z +M`+(1001+e)+" "+t+"h400000v"+(40+e)+"h-400000z"},Yn=function(e,t){return"M983 "+(10+e+t)+` +l`+e/3.13+" -"+e+` +c4,-6.7,10,-10,18,-10 H400000v`+(40+e)+` +H1013.1s-83.4,268,-264.1,840c-180.7,572,-277,876.3,-289,913c-4.7,4.7,-12.7,7,-24,7 +s-12,0,-12,0c-1.3,-3.3,-3.7,-11.7,-7,-25c-35.3,-125.3,-106.7,-373.3,-214,-744 +c-10,12,-21,25,-33,39s-32,39,-32,39c-6,-5.3,-15,-14,-27,-26s25,-30,25,-30 +c26.7,-32.7,52,-63,76,-91s52,-60,52,-60s208,722,208,722 +c56,-175.3,126.3,-397.3,211,-666c84.7,-268.7,153.8,-488.2,207.5,-658.5 +c53.7,-170.3,84.5,-266.8,92.5,-289.5z +M`+(1001+e)+" "+t+"h400000v"+(40+e)+"h-400000z"},Zn=function(e,t){return"M424,"+(2398+e+t)+` +c-1.3,-0.7,-38.5,-172,-111.5,-514c-73,-342,-109.8,-513.3,-110.5,-514 +c0,-2,-10.7,14.3,-32,49c-4.7,7.3,-9.8,15.7,-15.5,25c-5.7,9.3,-9.8,16,-12.5,20 +s-5,7,-5,7c-4,-3.3,-8.3,-7.7,-13,-13s-13,-13,-13,-13s76,-122,76,-122s77,-121,77,-121 +s209,968,209,968c0,-2,84.7,-361.7,254,-1079c169.3,-717.3,254.7,-1077.7,256,-1081 +l`+e/4.223+" -"+e+`c4,-6.7,10,-10,18,-10 H400000 +v`+(40+e)+`H1014.6 +s-87.3,378.7,-272.6,1166c-185.3,787.3,-279.3,1182.3,-282,1185 +c-2,6,-10,9,-24,9 +c-8,0,-12,-0.7,-12,-2z M`+(1001+e)+" "+t+` +h400000v`+(40+e)+"h-400000z"},Kn=function(e,t){return"M473,"+(2713+e+t)+` +c339.3,-1799.3,509.3,-2700,510,-2702 l`+e/5.298+" -"+e+` +c3.3,-7.3,9.3,-11,18,-11 H400000v`+(40+e)+`H1017.7 +s-90.5,478,-276.2,1466c-185.7,988,-279.5,1483,-281.5,1485c-2,6,-10,9,-24,9 +c-8,0,-12,-0.7,-12,-2c0,-1.3,-5.3,-32,-16,-92c-50.7,-293.3,-119.7,-693.3,-207,-1200 +c0,-1.3,-5.3,8.7,-16,30c-10.7,21.3,-21.3,42.7,-32,64s-16,33,-16,33s-26,-26,-26,-26 +s76,-153,76,-153s77,-151,77,-151c0.7,0.7,35.7,202,105,604c67.3,400.7,102,602.7,104, +606zM`+(1001+e)+" "+t+"h400000v"+(40+e)+"H1017.7z"},Jn=function(e){var t=e/2;return"M400000 "+e+" H0 L"+t+" 0 l65 45 L145 "+(e-80)+" H400000z"},Qn=function(e,t,a){var n=a-54-t-e;return"M702 "+(e+t)+"H400000"+(40+e)+` +H742v`+n+`l-4 4-4 4c-.667.7 -2 1.5-4 2.5s-4.167 1.833-6.5 2.5-5.5 1-9.5 1 +h-12l-28-84c-16.667-52-96.667 -294.333-240-727l-212 -643 -85 170 +c-4-3.333-8.333-7.667-13 -13l-13-13l77-155 77-156c66 199.333 139 419.667 +219 661 l218 661zM702 `+t+"H400000v"+(40+e)+"H742z"},ei=function(e,t,a){t=1e3*t;var n="";switch(e){case"sqrtMain":n=Vn(t,ce);break;case"sqrtSize1":n=Wn(t,ce);break;case"sqrtSize2":n=Yn(t,ce);break;case"sqrtSize3":n=Zn(t,ce);break;case"sqrtSize4":n=Kn(t,ce);break;case"sqrtTall":n=Qn(t,ce,a)}return n},ti=function(e,t){switch(e){case"⎜":return l0("M291 0 H417 V"+t+" H291z");case"∣":return l0("M145 0 H188 V"+t+" H145z");case"∥":return l0("M145 0 H188 V"+t+" H145z")+l0("M367 0 H410 V"+t+" H367z");case"⎟":return l0("M457 0 H583 V"+t+" H457z");case"⎢":return l0("M319 0 H403 V"+t+" H319z");case"⎥":return l0("M263 0 H347 V"+t+" H263z");case"⎪":return l0("M384 0 H504 V"+t+" H384z");case"⏐":return l0("M312 0 H355 V"+t+" H312z");case"‖":return l0("M257 0 H300 V"+t+" H257z")+l0("M478 0 H521 V"+t+" H478z");default:return""}},yr={doubleleftarrow:`M262 157 +l10-10c34-36 62.7-77 86-123 3.3-8 5-13.3 5-16 0-5.3-6.7-8-20-8-7.3 + 0-12.2.5-14.5 1.5-2.3 1-4.8 4.5-7.5 10.5-49.3 97.3-121.7 169.3-217 216-28 + 14-57.3 25-88 33-6.7 2-11 3.8-13 5.5-2 1.7-3 4.2-3 7.5s1 5.8 3 7.5 +c2 1.7 6.3 3.5 13 5.5 68 17.3 128.2 47.8 180.5 91.5 52.3 43.7 93.8 96.2 124.5 + 157.5 9.3 8 15.3 12.3 18 13h6c12-.7 18-4 18-10 0-2-1.7-7-5-15-23.3-46-52-87 +-86-123l-10-10h399738v-40H218c328 0 0 0 0 0l-10-8c-26.7-20-65.7-43-117-69 2.7 +-2 6-3.7 10-5 36.7-16 72.3-37.3 107-64l10-8h399782v-40z +m8 0v40h399730v-40zm0 194v40h399730v-40z`,doublerightarrow:`M399738 392l +-10 10c-34 36-62.7 77-86 123-3.3 8-5 13.3-5 16 0 5.3 6.7 8 20 8 7.3 0 12.2-.5 + 14.5-1.5 2.3-1 4.8-4.5 7.5-10.5 49.3-97.3 121.7-169.3 217-216 28-14 57.3-25 88 +-33 6.7-2 11-3.8 13-5.5 2-1.7 3-4.2 3-7.5s-1-5.8-3-7.5c-2-1.7-6.3-3.5-13-5.5-68 +-17.3-128.2-47.8-180.5-91.5-52.3-43.7-93.8-96.2-124.5-157.5-9.3-8-15.3-12.3-18 +-13h-6c-12 .7-18 4-18 10 0 2 1.7 7 5 15 23.3 46 52 87 86 123l10 10H0v40h399782 +c-328 0 0 0 0 0l10 8c26.7 20 65.7 43 117 69-2.7 2-6 3.7-10 5-36.7 16-72.3 37.3 +-107 64l-10 8H0v40zM0 157v40h399730v-40zm0 194v40h399730v-40z`,leftarrow:`M400000 241H110l3-3c68.7-52.7 113.7-120 + 135-202 4-14.7 6-23 6-25 0-7.3-7-11-21-11-8 0-13.2.8-15.5 2.5-2.3 1.7-4.2 5.8 +-5.5 12.5-1.3 4.7-2.7 10.3-4 17-12 48.7-34.8 92-68.5 130S65.3 228.3 18 247 +c-10 4-16 7.7-18 11 0 8.7 6 14.3 18 17 47.3 18.7 87.8 47 121.5 85S196 441.3 208 + 490c.7 2 1.3 5 2 9s1.2 6.7 1.5 8c.3 1.3 1 3.3 2 6s2.2 4.5 3.5 5.5c1.3 1 3.3 + 1.8 6 2.5s6 1 10 1c14 0 21-3.7 21-11 0-2-2-10.3-6-25-20-79.3-65-146.7-135-202 + l-3-3h399890zM100 241v40h399900v-40z`,leftbrace:`M6 548l-6-6v-35l6-11c56-104 135.3-181.3 238-232 57.3-28.7 117 +-45 179-50h399577v120H403c-43.3 7-81 15-113 26-100.7 33-179.7 91-237 174-2.7 + 5-6 9-10 13-.7 1-7.3 1-20 1H6z`,leftbraceunder:`M0 6l6-6h17c12.688 0 19.313.3 20 1 4 4 7.313 8.3 10 13 + 35.313 51.3 80.813 93.8 136.5 127.5 55.688 33.7 117.188 55.8 184.5 66.5.688 + 0 2 .3 4 1 18.688 2.7 76 4.3 172 5h399450v120H429l-6-1c-124.688-8-235-61.7 +-331-161C60.687 138.7 32.312 99.3 7 54L0 41V6z`,leftgroup:`M400000 80 +H435C64 80 168.3 229.4 21 260c-5.9 1.2-18 0-18 0-2 0-3-1-3-3v-38C76 61 257 0 + 435 0h399565z`,leftgroupunder:`M400000 262 +H435C64 262 168.3 112.6 21 82c-5.9-1.2-18 0-18 0-2 0-3 1-3 3v38c76 158 257 219 + 435 219h399565z`,leftharpoon:`M0 267c.7 5.3 3 10 7 14h399993v-40H93c3.3 +-3.3 10.2-9.5 20.5-18.5s17.8-15.8 22.5-20.5c50.7-52 88-110.3 112-175 4-11.3 5 +-18.3 3-21-1.3-4-7.3-6-18-6-8 0-13 .7-15 2s-4.7 6.7-8 16c-42 98.7-107.3 174.7 +-196 228-6.7 4.7-10.7 8-12 10-1.3 2-2 5.7-2 11zm100-26v40h399900v-40z`,leftharpoonplus:`M0 267c.7 5.3 3 10 7 14h399993v-40H93c3.3-3.3 10.2-9.5 + 20.5-18.5s17.8-15.8 22.5-20.5c50.7-52 88-110.3 112-175 4-11.3 5-18.3 3-21-1.3 +-4-7.3-6-18-6-8 0-13 .7-15 2s-4.7 6.7-8 16c-42 98.7-107.3 174.7-196 228-6.7 4.7 +-10.7 8-12 10-1.3 2-2 5.7-2 11zm100-26v40h399900v-40zM0 435v40h400000v-40z +m0 0v40h400000v-40z`,leftharpoondown:`M7 241c-4 4-6.333 8.667-7 14 0 5.333.667 9 2 11s5.333 + 5.333 12 10c90.667 54 156 130 196 228 3.333 10.667 6.333 16.333 9 17 2 .667 5 + 1 9 1h5c10.667 0 16.667-2 18-6 2-2.667 1-9.667-3-21-32-87.333-82.667-157.667 +-152-211l-3-3h399907v-40zM93 281 H400000 v-40L7 241z`,leftharpoondownplus:`M7 435c-4 4-6.3 8.7-7 14 0 5.3.7 9 2 11s5.3 5.3 12 + 10c90.7 54 156 130 196 228 3.3 10.7 6.3 16.3 9 17 2 .7 5 1 9 1h5c10.7 0 16.7 +-2 18-6 2-2.7 1-9.7-3-21-32-87.3-82.7-157.7-152-211l-3-3h399907v-40H7zm93 0 +v40h399900v-40zM0 241v40h399900v-40zm0 0v40h399900v-40z`,lefthook:`M400000 281 H103s-33-11.2-61-33.5S0 197.3 0 164s14.2-61.2 42.5 +-83.5C70.8 58.2 104 47 142 47 c16.7 0 25 6.7 25 20 0 12-8.7 18.7-26 20-40 3.3 +-68.7 15.7-86 37-10 12-15 25.3-15 40 0 22.7 9.8 40.7 29.5 54 19.7 13.3 43.5 21 + 71.5 23h399859zM103 281v-40h399897v40z`,leftlinesegment:l0("M40 281 V428 H0 V94 H40 V241 H400000 v40z"),leftbracketunder:l0("M0 0 h120 V290 H399995 v120 H0z"),leftbracketover:l0("M0 440 h120 V150 H399995 v-120 H0z"),leftmapsto:l0("M40 281 V448H0V74H40V241H400000v40z"),leftToFrom:`M0 147h400000v40H0zm0 214c68 40 115.7 95.7 143 167h22c15.3 0 23 +-.3 23-1 0-1.3-5.3-13.7-16-37-18-35.3-41.3-69-70-101l-7-8h399905v-40H95l7-8 +c28.7-32 52-65.7 70-101 10.7-23.3 16-35.7 16-37 0-.7-7.7-1-23-1h-22C115.7 265.3 + 68 321 0 361zm0-174v-40h399900v40zm100 154v40h399900v-40z`,longequal:l0("M0 50 h400000 v40H0z m0 194h40000v40H0z"),midbrace:`M200428 334 +c-100.7-8.3-195.3-44-280-108-55.3-42-101.7-93-139-153l-9-14c-2.7 4-5.7 8.7-9 14 +-53.3 86.7-123.7 153-211 199-66.7 36-137.3 56.3-212 62H0V214h199568c178.3-11.7 + 311.7-78.3 403-201 6-8 9.7-12 11-12 .7-.7 6.7-1 18-1s17.3.3 18 1c1.3 0 5 4 11 + 12 44.7 59.3 101.3 106.3 170 141s145.3 54.3 229 60h199572v120z`,midbraceunder:`M199572 214 +c100.7 8.3 195.3 44 280 108 55.3 42 101.7 93 139 153l9 14c2.7-4 5.7-8.7 9-14 + 53.3-86.7 123.7-153 211-199 66.7-36 137.3-56.3 212-62h199568v120H200432c-178.3 + 11.7-311.7 78.3-403 201-6 8-9.7 12-11 12-.7.7-6.7 1-18 1s-17.3-.3-18-1c-1.3 0 +-5-4-11-12-44.7-59.3-101.3-106.3-170-141s-145.3-54.3-229-60H0V214z`,oiintSize1:`M512.6 71.6c272.6 0 320.3 106.8 320.3 178.2 0 70.8-47.7 177.6 +-320.3 177.6S193.1 320.6 193.1 249.8c0-71.4 46.9-178.2 319.5-178.2z +m368.1 178.2c0-86.4-60.9-215.4-368.1-215.4-306.4 0-367.3 129-367.3 215.4 0 85.8 +60.9 214.8 367.3 214.8 307.2 0 368.1-129 368.1-214.8z`,oiintSize2:`M757.8 100.1c384.7 0 451.1 137.6 451.1 230 0 91.3-66.4 228.8 +-451.1 228.8-386.3 0-452.7-137.5-452.7-228.8 0-92.4 66.4-230 452.7-230z +m502.4 230c0-111.2-82.4-277.2-502.4-277.2s-504 166-504 277.2 +c0 110 84 276 504 276s502.4-166 502.4-276z`,oiiintSize1:`M681.4 71.6c408.9 0 480.5 106.8 480.5 178.2 0 70.8-71.6 177.6 +-480.5 177.6S202.1 320.6 202.1 249.8c0-71.4 70.5-178.2 479.3-178.2z +m525.8 178.2c0-86.4-86.8-215.4-525.7-215.4-437.9 0-524.7 129-524.7 215.4 0 +85.8 86.8 214.8 524.7 214.8 438.9 0 525.7-129 525.7-214.8z`,oiiintSize2:`M1021.2 53c603.6 0 707.8 165.8 707.8 277.2 0 110-104.2 275.8 +-707.8 275.8-606 0-710.2-165.8-710.2-275.8C311 218.8 415.2 53 1021.2 53z +m770.4 277.1c0-131.2-126.4-327.6-770.5-327.6S248.4 198.9 248.4 330.1 +c0 130 128.8 326.4 772.7 326.4s770.5-196.4 770.5-326.4z`,rightarrow:`M0 241v40h399891c-47.3 35.3-84 78-110 128 +-16.7 32-27.7 63.7-33 95 0 1.3-.2 2.7-.5 4-.3 1.3-.5 2.3-.5 3 0 7.3 6.7 11 20 + 11 8 0 13.2-.8 15.5-2.5 2.3-1.7 4.2-5.5 5.5-11.5 2-13.3 5.7-27 11-41 14.7-44.7 + 39-84.5 73-119.5s73.7-60.2 119-75.5c6-2 9-5.7 9-11s-3-9-9-11c-45.3-15.3-85 +-40.5-119-75.5s-58.3-74.8-73-119.5c-4.7-14-8.3-27.3-11-40-1.3-6.7-3.2-10.8-5.5 +-12.5-2.3-1.7-7.5-2.5-15.5-2.5-14 0-21 3.7-21 11 0 2 2 10.3 6 25 20.7 83.3 67 + 151.7 139 205zm0 0v40h399900v-40z`,rightbrace:`M400000 542l +-6 6h-17c-12.7 0-19.3-.3-20-1-4-4-7.3-8.3-10-13-35.3-51.3-80.8-93.8-136.5-127.5 +s-117.2-55.8-184.5-66.5c-.7 0-2-.3-4-1-18.7-2.7-76-4.3-172-5H0V214h399571l6 1 +c124.7 8 235 61.7 331 161 31.3 33.3 59.7 72.7 85 118l7 13v35z`,rightbraceunder:`M399994 0l6 6v35l-6 11c-56 104-135.3 181.3-238 232-57.3 + 28.7-117 45-179 50H-300V214h399897c43.3-7 81-15 113-26 100.7-33 179.7-91 237 +-174 2.7-5 6-9 10-13 .7-1 7.3-1 20-1h17z`,rightgroup:`M0 80h399565c371 0 266.7 149.4 414 180 5.9 1.2 18 0 18 0 2 0 + 3-1 3-3v-38c-76-158-257-219-435-219H0z`,rightgroupunder:`M0 262h399565c371 0 266.7-149.4 414-180 5.9-1.2 18 0 18 + 0 2 0 3 1 3 3v38c-76 158-257 219-435 219H0z`,rightharpoon:`M0 241v40h399993c4.7-4.7 7-9.3 7-14 0-9.3 +-3.7-15.3-11-18-92.7-56.7-159-133.7-199-231-3.3-9.3-6-14.7-8-16-2-1.3-7-2-15-2 +-10.7 0-16.7 2-18 6-2 2.7-1 9.7 3 21 15.3 42 36.7 81.8 64 119.5 27.3 37.7 58 + 69.2 92 94.5zm0 0v40h399900v-40z`,rightharpoonplus:`M0 241v40h399993c4.7-4.7 7-9.3 7-14 0-9.3-3.7-15.3-11 +-18-92.7-56.7-159-133.7-199-231-3.3-9.3-6-14.7-8-16-2-1.3-7-2-15-2-10.7 0-16.7 + 2-18 6-2 2.7-1 9.7 3 21 15.3 42 36.7 81.8 64 119.5 27.3 37.7 58 69.2 92 94.5z +m0 0v40h399900v-40z m100 194v40h399900v-40zm0 0v40h399900v-40z`,rightharpoondown:`M399747 511c0 7.3 6.7 11 20 11 8 0 13-.8 15-2.5s4.7-6.8 + 8-15.5c40-94 99.3-166.3 178-217 13.3-8 20.3-12.3 21-13 5.3-3.3 8.5-5.8 9.5 +-7.5 1-1.7 1.5-5.2 1.5-10.5s-2.3-10.3-7-15H0v40h399908c-34 25.3-64.7 57-92 95 +-27.3 38-48.7 77.7-64 119-3.3 8.7-5 14-5 16zM0 241v40h399900v-40z`,rightharpoondownplus:`M399747 705c0 7.3 6.7 11 20 11 8 0 13-.8 + 15-2.5s4.7-6.8 8-15.5c40-94 99.3-166.3 178-217 13.3-8 20.3-12.3 21-13 5.3-3.3 + 8.5-5.8 9.5-7.5 1-1.7 1.5-5.2 1.5-10.5s-2.3-10.3-7-15H0v40h399908c-34 25.3 +-64.7 57-92 95-27.3 38-48.7 77.7-64 119-3.3 8.7-5 14-5 16zM0 435v40h399900v-40z +m0-194v40h400000v-40zm0 0v40h400000v-40z`,righthook:`M399859 241c-764 0 0 0 0 0 40-3.3 68.7-15.7 86-37 10-12 15-25.3 + 15-40 0-22.7-9.8-40.7-29.5-54-19.7-13.3-43.5-21-71.5-23-17.3-1.3-26-8-26-20 0 +-13.3 8.7-20 26-20 38 0 71 11.2 99 33.5 0 0 7 5.6 21 16.7 14 11.2 21 33.5 21 + 66.8s-14 61.2-42 83.5c-28 22.3-61 33.5-99 33.5L0 241z M0 281v-40h399859v40z`,rightlinesegment:l0("M399960 241 V94 h40 V428 h-40 V281 H0 v-40z"),rightbracketunder:l0("M399995 0 h-120 V290 H0 v120 H400000z"),rightbracketover:l0("M399995 440 h-120 V150 H0 v-120 H399995z"),rightToFrom:`M400000 167c-70.7-42-118-97.7-142-167h-23c-15.3 0-23 .3-23 + 1 0 1.3 5.3 13.7 16 37 18 35.3 41.3 69 70 101l7 8H0v40h399905l-7 8c-28.7 32 +-52 65.7-70 101-10.7 23.3-16 35.7-16 37 0 .7 7.7 1 23 1h23c24-69.3 71.3-125 142 +-167z M100 147v40h399900v-40zM0 341v40h399900v-40z`,twoheadleftarrow:`M0 167c68 40 + 115.7 95.7 143 167h22c15.3 0 23-.3 23-1 0-1.3-5.3-13.7-16-37-18-35.3-41.3-69 +-70-101l-7-8h125l9 7c50.7 39.3 85 86 103 140h46c0-4.7-6.3-18.7-19-42-18-35.3 +-40-67.3-66-96l-9-9h399716v-40H284l9-9c26-28.7 48-60.7 66-96 12.7-23.333 19 +-37.333 19-42h-46c-18 54-52.3 100.7-103 140l-9 7H95l7-8c28.7-32 52-65.7 70-101 + 10.7-23.333 16-35.7 16-37 0-.7-7.7-1-23-1h-22C115.7 71.3 68 127 0 167z`,twoheadrightarrow:`M400000 167 +c-68-40-115.7-95.7-143-167h-22c-15.3 0-23 .3-23 1 0 1.3 5.3 13.7 16 37 18 35.3 + 41.3 69 70 101l7 8h-125l-9-7c-50.7-39.3-85-86-103-140h-46c0 4.7 6.3 18.7 19 42 + 18 35.3 40 67.3 66 96l9 9H0v40h399716l-9 9c-26 28.7-48 60.7-66 96-12.7 23.333 +-19 37.333-19 42h46c18-54 52.3-100.7 103-140l9-7h125l-7 8c-28.7 32-52 65.7-70 + 101-10.7 23.333-16 35.7-16 37 0 .7 7.7 1 23 1h22c27.3-71.3 75-127 143-167z`,tilde1:`M200 55.538c-77 0-168 73.953-177 73.953-3 0-7 +-2.175-9-5.437L2 97c-1-2-2-4-2-6 0-4 2-7 5-9l20-12C116 12 171 0 207 0c86 0 + 114 68 191 68 78 0 168-68 177-68 4 0 7 2 9 5l12 19c1 2.175 2 4.35 2 6.525 0 + 4.35-2 7.613-5 9.788l-19 13.05c-92 63.077-116.937 75.308-183 76.128 +-68.267.847-113-73.952-191-73.952z`,tilde2:`M344 55.266c-142 0-300.638 81.316-311.5 86.418 +-8.01 3.762-22.5 10.91-23.5 5.562L1 120c-1-2-1-3-1-4 0-5 3-9 8-10l18.4-9C160.9 + 31.9 283 0 358 0c148 0 188 122 331 122s314-97 326-97c4 0 8 2 10 7l7 21.114 +c1 2.14 1 3.21 1 4.28 0 5.347-3 9.626-7 10.696l-22.3 12.622C852.6 158.372 751 + 181.476 676 181.476c-149 0-189-126.21-332-126.21z`,tilde3:`M786 59C457 59 32 175.242 13 175.242c-6 0-10-3.457 +-11-10.37L.15 138c-1-7 3-12 10-13l19.2-6.4C378.4 40.7 634.3 0 804.3 0c337 0 + 411.8 157 746.8 157 328 0 754-112 773-112 5 0 10 3 11 9l1 14.075c1 8.066-.697 + 16.595-6.697 17.492l-21.052 7.31c-367.9 98.146-609.15 122.696-778.15 122.696 + -338 0-409-156.573-744-156.573z`,tilde4:`M786 58C457 58 32 177.487 13 177.487c-6 0-10-3.345 +-11-10.035L.15 143c-1-7 3-12 10-13l22-6.7C381.2 35 637.15 0 807.15 0c337 0 409 + 177 744 177 328 0 754-127 773-127 5 0 10 3 11 9l1 14.794c1 7.805-3 13.38-9 + 14.495l-20.7 5.574c-366.85 99.79-607.3 139.372-776.3 139.372-338 0-409 + -175.236-744-175.236z`,vec:`M377 20c0-5.333 1.833-10 5.5-14S391 0 397 0c4.667 0 8.667 1.667 12 5 +3.333 2.667 6.667 9 10 19 6.667 24.667 20.333 43.667 41 57 7.333 4.667 11 +10.667 11 18 0 6-1 10-3 12s-6.667 5-14 9c-28.667 14.667-53.667 35.667-75 63 +-1.333 1.333-3.167 3.5-5.5 6.5s-4 4.833-5 5.5c-1 .667-2.5 1.333-4.5 2s-4.333 1 +-7 1c-4.667 0-9.167-1.833-13.5-5.5S337 184 337 178c0-12.667 15.667-32.333 47-59 +H213l-171-1c-8.667-6-13-12.333-13-19 0-4.667 4.333-11.333 13-20h359 +c-16-25.333-24-45-24-59z`,widehat1:`M529 0h5l519 115c5 1 9 5 9 10 0 1-1 2-1 3l-4 22 +c-1 5-5 9-11 9h-2L532 67 19 159h-2c-5 0-9-4-11-9l-5-22c-1-6 2-12 8-13z`,widehat2:`M1181 0h2l1171 176c6 0 10 5 10 11l-2 23c-1 6-5 10 +-11 10h-1L1182 67 15 220h-1c-6 0-10-4-11-10l-2-23c-1-6 4-11 10-11z`,widehat3:`M1181 0h2l1171 236c6 0 10 5 10 11l-2 23c-1 6-5 10 +-11 10h-1L1182 67 15 280h-1c-6 0-10-4-11-10l-2-23c-1-6 4-11 10-11z`,widehat4:`M1181 0h2l1171 296c6 0 10 5 10 11l-2 23c-1 6-5 10 +-11 10h-1L1182 67 15 340h-1c-6 0-10-4-11-10l-2-23c-1-6 4-11 10-11z`,widecheck1:`M529,159h5l519,-115c5,-1,9,-5,9,-10c0,-1,-1,-2,-1,-3l-4,-22c-1, +-5,-5,-9,-11,-9h-2l-512,92l-513,-92h-2c-5,0,-9,4,-11,9l-5,22c-1,6,2,12,8,13z`,widecheck2:`M1181,220h2l1171,-176c6,0,10,-5,10,-11l-2,-23c-1,-6,-5,-10, +-11,-10h-1l-1168,153l-1167,-153h-1c-6,0,-10,4,-11,10l-2,23c-1,6,4,11,10,11z`,widecheck3:`M1181,280h2l1171,-236c6,0,10,-5,10,-11l-2,-23c-1,-6,-5,-10, +-11,-10h-1l-1168,213l-1167,-213h-1c-6,0,-10,4,-11,10l-2,23c-1,6,4,11,10,11z`,widecheck4:`M1181,340h2l1171,-296c6,0,10,-5,10,-11l-2,-23c-1,-6,-5,-10, +-11,-10h-1l-1168,273l-1167,-273h-1c-6,0,-10,4,-11,10l-2,23c-1,6,4,11,10,11z`,baraboveleftarrow:`M400000 620h-399890l3 -3c68.7 -52.7 113.7 -120 135 -202 +c4 -14.7 6 -23 6 -25c0 -7.3 -7 -11 -21 -11c-8 0 -13.2 0.8 -15.5 2.5 +c-2.3 1.7 -4.2 5.8 -5.5 12.5c-1.3 4.7 -2.7 10.3 -4 17c-12 48.7 -34.8 92 -68.5 130 +s-74.2 66.3 -121.5 85c-10 4 -16 7.7 -18 11c0 8.7 6 14.3 18 17c47.3 18.7 87.8 47 +121.5 85s56.5 81.3 68.5 130c0.7 2 1.3 5 2 9s1.2 6.7 1.5 8c0.3 1.3 1 3.3 2 6 +s2.2 4.5 3.5 5.5c1.3 1 3.3 1.8 6 2.5s6 1 10 1c14 0 21 -3.7 21 -11 +c0 -2 -2 -10.3 -6 -25c-20 -79.3 -65 -146.7 -135 -202l-3 -3h399890z +M100 620v40h399900v-40z M0 241v40h399900v-40zM0 241v40h399900v-40z`,rightarrowabovebar:`M0 241v40h399891c-47.3 35.3-84 78-110 128-16.7 32 +-27.7 63.7-33 95 0 1.3-.2 2.7-.5 4-.3 1.3-.5 2.3-.5 3 0 7.3 6.7 11 20 11 8 0 +13.2-.8 15.5-2.5 2.3-1.7 4.2-5.5 5.5-11.5 2-13.3 5.7-27 11-41 14.7-44.7 39 +-84.5 73-119.5s73.7-60.2 119-75.5c6-2 9-5.7 9-11s-3-9-9-11c-45.3-15.3-85-40.5 +-119-75.5s-58.3-74.8-73-119.5c-4.7-14-8.3-27.3-11-40-1.3-6.7-3.2-10.8-5.5 +-12.5-2.3-1.7-7.5-2.5-15.5-2.5-14 0-21 3.7-21 11 0 2 2 10.3 6 25 20.7 83.3 67 +151.7 139 205zm96 379h399894v40H0zm0 0h399904v40H0z`,baraboveshortleftharpoon:`M507,435c-4,4,-6.3,8.7,-7,14c0,5.3,0.7,9,2,11 +c1.3,2,5.3,5.3,12,10c90.7,54,156,130,196,228c3.3,10.7,6.3,16.3,9,17 +c2,0.7,5,1,9,1c0,0,5,0,5,0c10.7,0,16.7,-2,18,-6c2,-2.7,1,-9.7,-3,-21 +c-32,-87.3,-82.7,-157.7,-152,-211c0,0,-3,-3,-3,-3l399351,0l0,-40 +c-398570,0,-399437,0,-399437,0z M593 435 v40 H399500 v-40z +M0 281 v-40 H399908 v40z M0 281 v-40 H399908 v40z`,rightharpoonaboveshortbar:`M0,241 l0,40c399126,0,399993,0,399993,0 +c4.7,-4.7,7,-9.3,7,-14c0,-9.3,-3.7,-15.3,-11,-18c-92.7,-56.7,-159,-133.7,-199, +-231c-3.3,-9.3,-6,-14.7,-8,-16c-2,-1.3,-7,-2,-15,-2c-10.7,0,-16.7,2,-18,6 +c-2,2.7,-1,9.7,3,21c15.3,42,36.7,81.8,64,119.5c27.3,37.7,58,69.2,92,94.5z +M0 241 v40 H399908 v-40z M0 475 v-40 H399500 v40z M0 475 v-40 H399500 v40z`,shortbaraboveleftharpoon:`M7,435c-4,4,-6.3,8.7,-7,14c0,5.3,0.7,9,2,11 +c1.3,2,5.3,5.3,12,10c90.7,54,156,130,196,228c3.3,10.7,6.3,16.3,9,17c2,0.7,5,1,9, +1c0,0,5,0,5,0c10.7,0,16.7,-2,18,-6c2,-2.7,1,-9.7,-3,-21c-32,-87.3,-82.7,-157.7, +-152,-211c0,0,-3,-3,-3,-3l399907,0l0,-40c-399126,0,-399993,0,-399993,0z +M93 435 v40 H400000 v-40z M500 241 v40 H400000 v-40z M500 241 v40 H400000 v-40z`,shortrightharpoonabovebar:`M53,241l0,40c398570,0,399437,0,399437,0 +c4.7,-4.7,7,-9.3,7,-14c0,-9.3,-3.7,-15.3,-11,-18c-92.7,-56.7,-159,-133.7,-199, +-231c-3.3,-9.3,-6,-14.7,-8,-16c-2,-1.3,-7,-2,-15,-2c-10.7,0,-16.7,2,-18,6 +c-2,2.7,-1,9.7,3,21c15.3,42,36.7,81.8,64,119.5c27.3,37.7,58,69.2,92,94.5z +M500 241 v40 H399408 v-40z M500 435 v40 H400000 v-40z`},ri=function(e,t){switch(e){case"lbrack":return"M403 1759 V84 H666 V0 H319 V1759 v"+t+` v1759 v84 h347 v-84 +H403z M403 1759 V0 H319 V1759 v`+t+" v1759 v84 h84z";case"rbrack":return"M347 1759 V0 H0 V84 H263 V1759 v"+t+` v1759 H0 v84 H347z +M347 1759 V0 H263 V1759 v`+t+" v1759 h84z";case"vert":return"M145 15 v585 v"+t+` v585 c2.667,10,9.667,15,21,15 +c10,0,16.667,-5,20,-15 v-585 v`+-t+` v-585 c-2.667,-10,-9.667,-15,-21,-15 +c-10,0,-16.667,5,-20,15z M188 15 H145 v585 v`+t+" v585 h43z";case"doublevert":return"M145 15 v585 v"+t+` v585 c2.667,10,9.667,15,21,15 +c10,0,16.667,-5,20,-15 v-585 v`+-t+` v-585 c-2.667,-10,-9.667,-15,-21,-15 +c-10,0,-16.667,5,-20,15z M188 15 H145 v585 v`+t+` v585 h43z +M367 15 v585 v`+t+` v585 c2.667,10,9.667,15,21,15 +c10,0,16.667,-5,20,-15 v-585 v`+-t+` v-585 c-2.667,-10,-9.667,-15,-21,-15 +c-10,0,-16.667,5,-20,15z M410 15 H367 v585 v`+t+" v585 h43z";case"lfloor":return"M319 602 V0 H403 V602 v"+t+` v1715 h263 v84 H319z +MM319 602 V0 H403 V602 v`+t+" v1715 H319z";case"rfloor":return"M319 602 V0 H403 V602 v"+t+` v1799 H0 v-84 H319z +MM319 602 V0 H403 V602 v`+t+" v1715 H319z";case"lceil":return"M403 1759 V84 H666 V0 H319 V1759 v"+t+` v602 h84z +M403 1759 V0 H319 V1759 v`+t+" v602 h84z";case"rceil":return"M347 1759 V0 H0 V84 H263 V1759 v"+t+` v602 h84z +M347 1759 V0 h-84 V1759 v`+t+" v602 h84z";case"lparen":return`M863,9c0,-2,-2,-5,-6,-9c0,0,-17,0,-17,0c-12.7,0,-19.3,0.3,-20,1 +c-5.3,5.3,-10.3,11,-15,17c-242.7,294.7,-395.3,682,-458,1162c-21.3,163.3,-33.3,349, +-36,557 l0,`+(t+84)+`c0.2,6,0,26,0,60c2,159.3,10,310.7,24,454c53.3,528,210, +949.7,470,1265c4.7,6,9.7,11.7,15,17c0.7,0.7,7,1,19,1c0,0,18,0,18,0c4,-4,6,-7,6,-9 +c0,-2.7,-3.3,-8.7,-10,-18c-135.3,-192.7,-235.5,-414.3,-300.5,-665c-65,-250.7,-102.5, +-544.7,-112.5,-882c-2,-104,-3,-167,-3,-189 +l0,-`+(t+92)+`c0,-162.7,5.7,-314,17,-454c20.7,-272,63.7,-513,129,-723c65.3, +-210,155.3,-396.3,270,-559c6.7,-9.3,10,-15.3,10,-18z`;case"rparen":return`M76,0c-16.7,0,-25,3,-25,9c0,2,2,6.3,6,13c21.3,28.7,42.3,60.3, +63,95c96.7,156.7,172.8,332.5,228.5,527.5c55.7,195,92.8,416.5,111.5,664.5 +c11.3,139.3,17,290.7,17,454c0,28,1.7,43,3.3,45l0,`+(t+9)+` +c-3,4,-3.3,16.7,-3.3,38c0,162,-5.7,313.7,-17,455c-18.7,248,-55.8,469.3,-111.5,664 +c-55.7,194.7,-131.8,370.3,-228.5,527c-20.7,34.7,-41.7,66.3,-63,95c-2,3.3,-4,7,-6,11 +c0,7.3,5.7,11,17,11c0,0,11,0,11,0c9.3,0,14.3,-0.3,15,-1c5.3,-5.3,10.3,-11,15,-17 +c242.7,-294.7,395.3,-681.7,458,-1161c21.3,-164.7,33.3,-350.7,36,-558 +l0,-`+(t+144)+`c-2,-159.3,-10,-310.7,-24,-454c-53.3,-528,-210,-949.7, +-470,-1265c-4.7,-6,-9.7,-11.7,-15,-17c-0.7,-0.7,-6.7,-1,-18,-1z`;default:throw new Error("Unknown stretchy delimiter.")}};function ai(r){return"toText"in r}class fe{constructor(e){this.children=void 0,this.classes=void 0,this.height=void 0,this.depth=void 0,this.maxFontSize=void 0,this.style=void 0,this.children=e,this.classes=[],this.height=0,this.depth=0,this.maxFontSize=0,this.style={}}hasClass(e){return this.classes.includes(e)}toNode(){for(var e=document.createDocumentFragment(),t=0;t{if(ai(e))return e.toText();throw new Error("Expected MathDomNode with toText, got "+e.constructor.name)}).join("")}}var St={pt:1,mm:7227/2540,cm:7227/254,in:72.27,bp:803/800,pc:12,dd:1238/1157,cc:14856/1157,nd:685/642,nc:1370/107,sp:1/65536,px:803/800},ni={ex:!0,em:!0,mu:!0},sa=function(e){return typeof e!="string"&&(e=e.unit),e in St||e in ni||e==="ex"},t0=function(e,t){var a;if(e.unit in St)a=St[e.unit]/t.fontMetrics().ptPerEm/t.sizeMultiplier;else if(e.unit==="mu")a=t.fontMetrics().cssEmPerMu;else{var n;if(t.style.isTight()?n=t.havingStyle(t.style.text()):n=t,e.unit==="ex")a=n.fontMetrics().xHeight;else if(e.unit==="em")a=n.fontMetrics().quad;else throw new F("Invalid unit: '"+e.unit+"'");n!==t&&(a*=n.sizeMultiplier/t.sizeMultiplier)}return Math.min(e.number*a,t.maxSize)},N=function(e){return+e.toFixed(4)+"em"},K0=function(e){return e.filter(t=>t).join(" ")},$t=function(e){var t="";for(var a of Object.keys(e)){var n=e[a];n!==void 0&&(t+=In(a)+":"+n+";")}return t},la=function(e,t,a){if(this.classes=e||[],this.attributes={},this.height=0,this.depth=0,this.maxFontSize=0,this.style=a||{},t){t.style.isTight()&&this.classes.push("mtight");var n=t.getColor();n&&(this.style.color=n)}},oa=function(e){var t=document.createElement(e);t.className=K0(this.classes),Object.assign(t.style,this.style);for(var a of Object.keys(this.attributes))t.setAttribute(a,this.attributes[a]);for(var n=0;n/=\x00-\x1f]/,ua=function(e){var t="<"+e;this.classes.length&&(t+=' class="'+c0(K0(this.classes))+'"');var a=$t(this.style);a&&(t+=' style="'+c0(a)+'"');for(var n of Object.keys(this.attributes)){if(ii.test(n))throw new F("Invalid attribute name '"+n+"'");t+=" "+n+'="'+c0(this.attributes[n])+'"'}t+=">";for(var s=0;s",t};class ve{constructor(e,t,a,n){this.children=void 0,this.attributes=void 0,this.classes=void 0,this.height=void 0,this.depth=void 0,this.width=void 0,this.maxFontSize=void 0,this.style=void 0,this.italic=void 0,la.call(this,e,a,n),this.children=t||[]}setAttribute(e,t){this.attributes[e]=t}hasClass(e){return this.classes.includes(e)}toNode(){return oa.call(this,"span")}toMarkup(){return ua.call(this,"span")}}class je{constructor(e,t,a,n){this.children=void 0,this.attributes=void 0,this.classes=void 0,this.height=void 0,this.depth=void 0,this.maxFontSize=void 0,this.style=void 0,la.call(this,t,n),this.children=a||[],this.setAttribute("href",e)}setAttribute(e,t){this.attributes[e]=t}hasClass(e){return this.classes.includes(e)}toNode(){return oa.call(this,"a")}toMarkup(){return ua.call(this,"a")}}class si{constructor(e,t,a){this.src=void 0,this.alt=void 0,this.classes=void 0,this.height=void 0,this.depth=void 0,this.maxFontSize=void 0,this.style=void 0,this.alt=t,this.src=e,this.classes=["mord"],this.height=0,this.depth=0,this.maxFontSize=0,this.style=a}hasClass(e){return this.classes.includes(e)}toNode(){var e=document.createElement("img");return e.src=this.src,e.alt=this.alt,e.className="mord",Object.assign(e.style,this.style),e}toMarkup(){var e=''+c0(this.alt)+'0&&(t=document.createElement("span"),t.style.marginRight=N(this.italic)),this.classes.length>0&&(t=t||document.createElement("span"),t.className=K0(this.classes)),Object.keys(this.style).length>0&&(t=t||document.createElement("span"),Object.assign(t.style,this.style)),t?(t.appendChild(e),t):e}toMarkup(){var e=!1,t="0&&(a+="margin-right:"+N(this.italic)+";"),a+=$t(this.style),a&&(e=!0,t+=' style="'+c0(a)+'"');var n=c0(this.text);return e?(t+=">",t+=n,t+="",t):n}}class $0{constructor(e,t){this.children=void 0,this.attributes=void 0,this.children=e||[],this.attributes=t||{}}toNode(){var e="http://www.w3.org/2000/svg",t=document.createElementNS(e,"svg");for(var a of Object.keys(this.attributes))t.setAttribute(a,this.attributes[a]);for(var n=0;n':''}}class kt{constructor(e){this.attributes=void 0,this.attributes=e||{}}toNode(){var e="http://www.w3.org/2000/svg",t=document.createElementNS(e,"line");for(var a of Object.keys(this.attributes))t.setAttribute(a,this.attributes[a]);return t}toMarkup(){var e=" but got "+String(r)+".")}var ci=r=>r instanceof ve||r instanceof je||r instanceof fe,I0={"AMS-Regular":{32:[0,0,0,0,.25],65:[0,.68889,0,0,.72222],66:[0,.68889,0,0,.66667],67:[0,.68889,0,0,.72222],68:[0,.68889,0,0,.72222],69:[0,.68889,0,0,.66667],70:[0,.68889,0,0,.61111],71:[0,.68889,0,0,.77778],72:[0,.68889,0,0,.77778],73:[0,.68889,0,0,.38889],74:[.16667,.68889,0,0,.5],75:[0,.68889,0,0,.77778],76:[0,.68889,0,0,.66667],77:[0,.68889,0,0,.94445],78:[0,.68889,0,0,.72222],79:[.16667,.68889,0,0,.77778],80:[0,.68889,0,0,.61111],81:[.16667,.68889,0,0,.77778],82:[0,.68889,0,0,.72222],83:[0,.68889,0,0,.55556],84:[0,.68889,0,0,.66667],85:[0,.68889,0,0,.72222],86:[0,.68889,0,0,.72222],87:[0,.68889,0,0,1],88:[0,.68889,0,0,.72222],89:[0,.68889,0,0,.72222],90:[0,.68889,0,0,.66667],107:[0,.68889,0,0,.55556],160:[0,0,0,0,.25],165:[0,.675,.025,0,.75],174:[.15559,.69224,0,0,.94666],240:[0,.68889,0,0,.55556],295:[0,.68889,0,0,.54028],710:[0,.825,0,0,2.33334],732:[0,.9,0,0,2.33334],770:[0,.825,0,0,2.33334],771:[0,.9,0,0,2.33334],989:[.08167,.58167,0,0,.77778],1008:[0,.43056,.04028,0,.66667],8245:[0,.54986,0,0,.275],8463:[0,.68889,0,0,.54028],8487:[0,.68889,0,0,.72222],8498:[0,.68889,0,0,.55556],8502:[0,.68889,0,0,.66667],8503:[0,.68889,0,0,.44445],8504:[0,.68889,0,0,.66667],8513:[0,.68889,0,0,.63889],8592:[-.03598,.46402,0,0,.5],8594:[-.03598,.46402,0,0,.5],8602:[-.13313,.36687,0,0,1],8603:[-.13313,.36687,0,0,1],8606:[.01354,.52239,0,0,1],8608:[.01354,.52239,0,0,1],8610:[.01354,.52239,0,0,1.11111],8611:[.01354,.52239,0,0,1.11111],8619:[0,.54986,0,0,1],8620:[0,.54986,0,0,1],8621:[-.13313,.37788,0,0,1.38889],8622:[-.13313,.36687,0,0,1],8624:[0,.69224,0,0,.5],8625:[0,.69224,0,0,.5],8630:[0,.43056,0,0,1],8631:[0,.43056,0,0,1],8634:[.08198,.58198,0,0,.77778],8635:[.08198,.58198,0,0,.77778],8638:[.19444,.69224,0,0,.41667],8639:[.19444,.69224,0,0,.41667],8642:[.19444,.69224,0,0,.41667],8643:[.19444,.69224,0,0,.41667],8644:[.1808,.675,0,0,1],8646:[.1808,.675,0,0,1],8647:[.1808,.675,0,0,1],8648:[.19444,.69224,0,0,.83334],8649:[.1808,.675,0,0,1],8650:[.19444,.69224,0,0,.83334],8651:[.01354,.52239,0,0,1],8652:[.01354,.52239,0,0,1],8653:[-.13313,.36687,0,0,1],8654:[-.13313,.36687,0,0,1],8655:[-.13313,.36687,0,0,1],8666:[.13667,.63667,0,0,1],8667:[.13667,.63667,0,0,1],8669:[-.13313,.37788,0,0,1],8672:[-.064,.437,0,0,1.334],8674:[-.064,.437,0,0,1.334],8705:[0,.825,0,0,.5],8708:[0,.68889,0,0,.55556],8709:[.08167,.58167,0,0,.77778],8717:[0,.43056,0,0,.42917],8722:[-.03598,.46402,0,0,.5],8724:[.08198,.69224,0,0,.77778],8726:[.08167,.58167,0,0,.77778],8733:[0,.69224,0,0,.77778],8736:[0,.69224,0,0,.72222],8737:[0,.69224,0,0,.72222],8738:[.03517,.52239,0,0,.72222],8739:[.08167,.58167,0,0,.22222],8740:[.25142,.74111,0,0,.27778],8741:[.08167,.58167,0,0,.38889],8742:[.25142,.74111,0,0,.5],8756:[0,.69224,0,0,.66667],8757:[0,.69224,0,0,.66667],8764:[-.13313,.36687,0,0,.77778],8765:[-.13313,.37788,0,0,.77778],8769:[-.13313,.36687,0,0,.77778],8770:[-.03625,.46375,0,0,.77778],8774:[.30274,.79383,0,0,.77778],8776:[-.01688,.48312,0,0,.77778],8778:[.08167,.58167,0,0,.77778],8782:[.06062,.54986,0,0,.77778],8783:[.06062,.54986,0,0,.77778],8785:[.08198,.58198,0,0,.77778],8786:[.08198,.58198,0,0,.77778],8787:[.08198,.58198,0,0,.77778],8790:[0,.69224,0,0,.77778],8791:[.22958,.72958,0,0,.77778],8796:[.08198,.91667,0,0,.77778],8806:[.25583,.75583,0,0,.77778],8807:[.25583,.75583,0,0,.77778],8808:[.25142,.75726,0,0,.77778],8809:[.25142,.75726,0,0,.77778],8812:[.25583,.75583,0,0,.5],8814:[.20576,.70576,0,0,.77778],8815:[.20576,.70576,0,0,.77778],8816:[.30274,.79383,0,0,.77778],8817:[.30274,.79383,0,0,.77778],8818:[.22958,.72958,0,0,.77778],8819:[.22958,.72958,0,0,.77778],8822:[.1808,.675,0,0,.77778],8823:[.1808,.675,0,0,.77778],8828:[.13667,.63667,0,0,.77778],8829:[.13667,.63667,0,0,.77778],8830:[.22958,.72958,0,0,.77778],8831:[.22958,.72958,0,0,.77778],8832:[.20576,.70576,0,0,.77778],8833:[.20576,.70576,0,0,.77778],8840:[.30274,.79383,0,0,.77778],8841:[.30274,.79383,0,0,.77778],8842:[.13597,.63597,0,0,.77778],8843:[.13597,.63597,0,0,.77778],8847:[.03517,.54986,0,0,.77778],8848:[.03517,.54986,0,0,.77778],8858:[.08198,.58198,0,0,.77778],8859:[.08198,.58198,0,0,.77778],8861:[.08198,.58198,0,0,.77778],8862:[0,.675,0,0,.77778],8863:[0,.675,0,0,.77778],8864:[0,.675,0,0,.77778],8865:[0,.675,0,0,.77778],8872:[0,.69224,0,0,.61111],8873:[0,.69224,0,0,.72222],8874:[0,.69224,0,0,.88889],8876:[0,.68889,0,0,.61111],8877:[0,.68889,0,0,.61111],8878:[0,.68889,0,0,.72222],8879:[0,.68889,0,0,.72222],8882:[.03517,.54986,0,0,.77778],8883:[.03517,.54986,0,0,.77778],8884:[.13667,.63667,0,0,.77778],8885:[.13667,.63667,0,0,.77778],8888:[0,.54986,0,0,1.11111],8890:[.19444,.43056,0,0,.55556],8891:[.19444,.69224,0,0,.61111],8892:[.19444,.69224,0,0,.61111],8901:[0,.54986,0,0,.27778],8903:[.08167,.58167,0,0,.77778],8905:[.08167,.58167,0,0,.77778],8906:[.08167,.58167,0,0,.77778],8907:[0,.69224,0,0,.77778],8908:[0,.69224,0,0,.77778],8909:[-.03598,.46402,0,0,.77778],8910:[0,.54986,0,0,.76042],8911:[0,.54986,0,0,.76042],8912:[.03517,.54986,0,0,.77778],8913:[.03517,.54986,0,0,.77778],8914:[0,.54986,0,0,.66667],8915:[0,.54986,0,0,.66667],8916:[0,.69224,0,0,.66667],8918:[.0391,.5391,0,0,.77778],8919:[.0391,.5391,0,0,.77778],8920:[.03517,.54986,0,0,1.33334],8921:[.03517,.54986,0,0,1.33334],8922:[.38569,.88569,0,0,.77778],8923:[.38569,.88569,0,0,.77778],8926:[.13667,.63667,0,0,.77778],8927:[.13667,.63667,0,0,.77778],8928:[.30274,.79383,0,0,.77778],8929:[.30274,.79383,0,0,.77778],8934:[.23222,.74111,0,0,.77778],8935:[.23222,.74111,0,0,.77778],8936:[.23222,.74111,0,0,.77778],8937:[.23222,.74111,0,0,.77778],8938:[.20576,.70576,0,0,.77778],8939:[.20576,.70576,0,0,.77778],8940:[.30274,.79383,0,0,.77778],8941:[.30274,.79383,0,0,.77778],8994:[.19444,.69224,0,0,.77778],8995:[.19444,.69224,0,0,.77778],9416:[.15559,.69224,0,0,.90222],9484:[0,.69224,0,0,.5],9488:[0,.69224,0,0,.5],9492:[0,.37788,0,0,.5],9496:[0,.37788,0,0,.5],9585:[.19444,.68889,0,0,.88889],9586:[.19444,.74111,0,0,.88889],9632:[0,.675,0,0,.77778],9633:[0,.675,0,0,.77778],9650:[0,.54986,0,0,.72222],9651:[0,.54986,0,0,.72222],9654:[.03517,.54986,0,0,.77778],9660:[0,.54986,0,0,.72222],9661:[0,.54986,0,0,.72222],9664:[.03517,.54986,0,0,.77778],9674:[.11111,.69224,0,0,.66667],9733:[.19444,.69224,0,0,.94445],10003:[0,.69224,0,0,.83334],10016:[0,.69224,0,0,.83334],10731:[.11111,.69224,0,0,.66667],10846:[.19444,.75583,0,0,.61111],10877:[.13667,.63667,0,0,.77778],10878:[.13667,.63667,0,0,.77778],10885:[.25583,.75583,0,0,.77778],10886:[.25583,.75583,0,0,.77778],10887:[.13597,.63597,0,0,.77778],10888:[.13597,.63597,0,0,.77778],10889:[.26167,.75726,0,0,.77778],10890:[.26167,.75726,0,0,.77778],10891:[.48256,.98256,0,0,.77778],10892:[.48256,.98256,0,0,.77778],10901:[.13667,.63667,0,0,.77778],10902:[.13667,.63667,0,0,.77778],10933:[.25142,.75726,0,0,.77778],10934:[.25142,.75726,0,0,.77778],10935:[.26167,.75726,0,0,.77778],10936:[.26167,.75726,0,0,.77778],10937:[.26167,.75726,0,0,.77778],10938:[.26167,.75726,0,0,.77778],10949:[.25583,.75583,0,0,.77778],10950:[.25583,.75583,0,0,.77778],10955:[.28481,.79383,0,0,.77778],10956:[.28481,.79383,0,0,.77778],57350:[.08167,.58167,0,0,.22222],57351:[.08167,.58167,0,0,.38889],57352:[.08167,.58167,0,0,.77778],57353:[0,.43056,.04028,0,.66667],57356:[.25142,.75726,0,0,.77778],57357:[.25142,.75726,0,0,.77778],57358:[.41951,.91951,0,0,.77778],57359:[.30274,.79383,0,0,.77778],57360:[.30274,.79383,0,0,.77778],57361:[.41951,.91951,0,0,.77778],57366:[.25142,.75726,0,0,.77778],57367:[.25142,.75726,0,0,.77778],57368:[.25142,.75726,0,0,.77778],57369:[.25142,.75726,0,0,.77778],57370:[.13597,.63597,0,0,.77778],57371:[.13597,.63597,0,0,.77778]},"Caligraphic-Regular":{32:[0,0,0,0,.25],65:[0,.68333,0,.19445,.79847],66:[0,.68333,.03041,.13889,.65681],67:[0,.68333,.05834,.13889,.52653],68:[0,.68333,.02778,.08334,.77139],69:[0,.68333,.08944,.11111,.52778],70:[0,.68333,.09931,.11111,.71875],71:[.09722,.68333,.0593,.11111,.59487],72:[0,.68333,.00965,.11111,.84452],73:[0,.68333,.07382,0,.54452],74:[.09722,.68333,.18472,.16667,.67778],75:[0,.68333,.01445,.05556,.76195],76:[0,.68333,0,.13889,.68972],77:[0,.68333,0,.13889,1.2009],78:[0,.68333,.14736,.08334,.82049],79:[0,.68333,.02778,.11111,.79611],80:[0,.68333,.08222,.08334,.69556],81:[.09722,.68333,0,.11111,.81667],82:[0,.68333,0,.08334,.8475],83:[0,.68333,.075,.13889,.60556],84:[0,.68333,.25417,0,.54464],85:[0,.68333,.09931,.08334,.62583],86:[0,.68333,.08222,0,.61278],87:[0,.68333,.08222,.08334,.98778],88:[0,.68333,.14643,.13889,.7133],89:[.09722,.68333,.08222,.08334,.66834],90:[0,.68333,.07944,.13889,.72473],160:[0,0,0,0,.25]},"Fraktur-Regular":{32:[0,0,0,0,.25],33:[0,.69141,0,0,.29574],34:[0,.69141,0,0,.21471],38:[0,.69141,0,0,.73786],39:[0,.69141,0,0,.21201],40:[.24982,.74947,0,0,.38865],41:[.24982,.74947,0,0,.38865],42:[0,.62119,0,0,.27764],43:[.08319,.58283,0,0,.75623],44:[0,.10803,0,0,.27764],45:[.08319,.58283,0,0,.75623],46:[0,.10803,0,0,.27764],47:[.24982,.74947,0,0,.50181],48:[0,.47534,0,0,.50181],49:[0,.47534,0,0,.50181],50:[0,.47534,0,0,.50181],51:[.18906,.47534,0,0,.50181],52:[.18906,.47534,0,0,.50181],53:[.18906,.47534,0,0,.50181],54:[0,.69141,0,0,.50181],55:[.18906,.47534,0,0,.50181],56:[0,.69141,0,0,.50181],57:[.18906,.47534,0,0,.50181],58:[0,.47534,0,0,.21606],59:[.12604,.47534,0,0,.21606],61:[-.13099,.36866,0,0,.75623],63:[0,.69141,0,0,.36245],65:[0,.69141,0,0,.7176],66:[0,.69141,0,0,.88397],67:[0,.69141,0,0,.61254],68:[0,.69141,0,0,.83158],69:[0,.69141,0,0,.66278],70:[.12604,.69141,0,0,.61119],71:[0,.69141,0,0,.78539],72:[.06302,.69141,0,0,.7203],73:[0,.69141,0,0,.55448],74:[.12604,.69141,0,0,.55231],75:[0,.69141,0,0,.66845],76:[0,.69141,0,0,.66602],77:[0,.69141,0,0,1.04953],78:[0,.69141,0,0,.83212],79:[0,.69141,0,0,.82699],80:[.18906,.69141,0,0,.82753],81:[.03781,.69141,0,0,.82699],82:[0,.69141,0,0,.82807],83:[0,.69141,0,0,.82861],84:[0,.69141,0,0,.66899],85:[0,.69141,0,0,.64576],86:[0,.69141,0,0,.83131],87:[0,.69141,0,0,1.04602],88:[0,.69141,0,0,.71922],89:[.18906,.69141,0,0,.83293],90:[.12604,.69141,0,0,.60201],91:[.24982,.74947,0,0,.27764],93:[.24982,.74947,0,0,.27764],94:[0,.69141,0,0,.49965],97:[0,.47534,0,0,.50046],98:[0,.69141,0,0,.51315],99:[0,.47534,0,0,.38946],100:[0,.62119,0,0,.49857],101:[0,.47534,0,0,.40053],102:[.18906,.69141,0,0,.32626],103:[.18906,.47534,0,0,.5037],104:[.18906,.69141,0,0,.52126],105:[0,.69141,0,0,.27899],106:[0,.69141,0,0,.28088],107:[0,.69141,0,0,.38946],108:[0,.69141,0,0,.27953],109:[0,.47534,0,0,.76676],110:[0,.47534,0,0,.52666],111:[0,.47534,0,0,.48885],112:[.18906,.52396,0,0,.50046],113:[.18906,.47534,0,0,.48912],114:[0,.47534,0,0,.38919],115:[0,.47534,0,0,.44266],116:[0,.62119,0,0,.33301],117:[0,.47534,0,0,.5172],118:[0,.52396,0,0,.5118],119:[0,.52396,0,0,.77351],120:[.18906,.47534,0,0,.38865],121:[.18906,.47534,0,0,.49884],122:[.18906,.47534,0,0,.39054],160:[0,0,0,0,.25],8216:[0,.69141,0,0,.21471],8217:[0,.69141,0,0,.21471],58112:[0,.62119,0,0,.49749],58113:[0,.62119,0,0,.4983],58114:[.18906,.69141,0,0,.33328],58115:[.18906,.69141,0,0,.32923],58116:[.18906,.47534,0,0,.50343],58117:[0,.69141,0,0,.33301],58118:[0,.62119,0,0,.33409],58119:[0,.47534,0,0,.50073]},"Main-Bold":{32:[0,0,0,0,.25],33:[0,.69444,0,0,.35],34:[0,.69444,0,0,.60278],35:[.19444,.69444,0,0,.95833],36:[.05556,.75,0,0,.575],37:[.05556,.75,0,0,.95833],38:[0,.69444,0,0,.89444],39:[0,.69444,0,0,.31944],40:[.25,.75,0,0,.44722],41:[.25,.75,0,0,.44722],42:[0,.75,0,0,.575],43:[.13333,.63333,0,0,.89444],44:[.19444,.15556,0,0,.31944],45:[0,.44444,0,0,.38333],46:[0,.15556,0,0,.31944],47:[.25,.75,0,0,.575],48:[0,.64444,0,0,.575],49:[0,.64444,0,0,.575],50:[0,.64444,0,0,.575],51:[0,.64444,0,0,.575],52:[0,.64444,0,0,.575],53:[0,.64444,0,0,.575],54:[0,.64444,0,0,.575],55:[0,.64444,0,0,.575],56:[0,.64444,0,0,.575],57:[0,.64444,0,0,.575],58:[0,.44444,0,0,.31944],59:[.19444,.44444,0,0,.31944],60:[.08556,.58556,0,0,.89444],61:[-.10889,.39111,0,0,.89444],62:[.08556,.58556,0,0,.89444],63:[0,.69444,0,0,.54305],64:[0,.69444,0,0,.89444],65:[0,.68611,0,0,.86944],66:[0,.68611,0,0,.81805],67:[0,.68611,0,0,.83055],68:[0,.68611,0,0,.88194],69:[0,.68611,0,0,.75555],70:[0,.68611,0,0,.72361],71:[0,.68611,0,0,.90416],72:[0,.68611,0,0,.9],73:[0,.68611,0,0,.43611],74:[0,.68611,0,0,.59444],75:[0,.68611,0,0,.90138],76:[0,.68611,0,0,.69166],77:[0,.68611,0,0,1.09166],78:[0,.68611,0,0,.9],79:[0,.68611,0,0,.86388],80:[0,.68611,0,0,.78611],81:[.19444,.68611,0,0,.86388],82:[0,.68611,0,0,.8625],83:[0,.68611,0,0,.63889],84:[0,.68611,0,0,.8],85:[0,.68611,0,0,.88472],86:[0,.68611,.01597,0,.86944],87:[0,.68611,.01597,0,1.18888],88:[0,.68611,0,0,.86944],89:[0,.68611,.02875,0,.86944],90:[0,.68611,0,0,.70277],91:[.25,.75,0,0,.31944],92:[.25,.75,0,0,.575],93:[.25,.75,0,0,.31944],94:[0,.69444,0,0,.575],95:[.31,.13444,.03194,0,.575],97:[0,.44444,0,0,.55902],98:[0,.69444,0,0,.63889],99:[0,.44444,0,0,.51111],100:[0,.69444,0,0,.63889],101:[0,.44444,0,0,.52708],102:[0,.69444,.10903,0,.35139],103:[.19444,.44444,.01597,0,.575],104:[0,.69444,0,0,.63889],105:[0,.69444,0,0,.31944],106:[.19444,.69444,0,0,.35139],107:[0,.69444,0,0,.60694],108:[0,.69444,0,0,.31944],109:[0,.44444,0,0,.95833],110:[0,.44444,0,0,.63889],111:[0,.44444,0,0,.575],112:[.19444,.44444,0,0,.63889],113:[.19444,.44444,0,0,.60694],114:[0,.44444,0,0,.47361],115:[0,.44444,0,0,.45361],116:[0,.63492,0,0,.44722],117:[0,.44444,0,0,.63889],118:[0,.44444,.01597,0,.60694],119:[0,.44444,.01597,0,.83055],120:[0,.44444,0,0,.60694],121:[.19444,.44444,.01597,0,.60694],122:[0,.44444,0,0,.51111],123:[.25,.75,0,0,.575],124:[.25,.75,0,0,.31944],125:[.25,.75,0,0,.575],126:[.35,.34444,0,0,.575],160:[0,0,0,0,.25],163:[0,.69444,0,0,.86853],168:[0,.69444,0,0,.575],172:[0,.44444,0,0,.76666],176:[0,.69444,0,0,.86944],177:[.13333,.63333,0,0,.89444],184:[.17014,0,0,0,.51111],198:[0,.68611,0,0,1.04166],215:[.13333,.63333,0,0,.89444],216:[.04861,.73472,0,0,.89444],223:[0,.69444,0,0,.59722],230:[0,.44444,0,0,.83055],247:[.13333,.63333,0,0,.89444],248:[.09722,.54167,0,0,.575],305:[0,.44444,0,0,.31944],338:[0,.68611,0,0,1.16944],339:[0,.44444,0,0,.89444],567:[.19444,.44444,0,0,.35139],710:[0,.69444,0,0,.575],711:[0,.63194,0,0,.575],713:[0,.59611,0,0,.575],714:[0,.69444,0,0,.575],715:[0,.69444,0,0,.575],728:[0,.69444,0,0,.575],729:[0,.69444,0,0,.31944],730:[0,.69444,0,0,.86944],732:[0,.69444,0,0,.575],733:[0,.69444,0,0,.575],915:[0,.68611,0,0,.69166],916:[0,.68611,0,0,.95833],920:[0,.68611,0,0,.89444],923:[0,.68611,0,0,.80555],926:[0,.68611,0,0,.76666],928:[0,.68611,0,0,.9],931:[0,.68611,0,0,.83055],933:[0,.68611,0,0,.89444],934:[0,.68611,0,0,.83055],936:[0,.68611,0,0,.89444],937:[0,.68611,0,0,.83055],8211:[0,.44444,.03194,0,.575],8212:[0,.44444,.03194,0,1.14999],8216:[0,.69444,0,0,.31944],8217:[0,.69444,0,0,.31944],8220:[0,.69444,0,0,.60278],8221:[0,.69444,0,0,.60278],8224:[.19444,.69444,0,0,.51111],8225:[.19444,.69444,0,0,.51111],8242:[0,.55556,0,0,.34444],8407:[0,.72444,.15486,0,.575],8463:[0,.69444,0,0,.66759],8465:[0,.69444,0,0,.83055],8467:[0,.69444,0,0,.47361],8472:[.19444,.44444,0,0,.74027],8476:[0,.69444,0,0,.83055],8501:[0,.69444,0,0,.70277],8592:[-.10889,.39111,0,0,1.14999],8593:[.19444,.69444,0,0,.575],8594:[-.10889,.39111,0,0,1.14999],8595:[.19444,.69444,0,0,.575],8596:[-.10889,.39111,0,0,1.14999],8597:[.25,.75,0,0,.575],8598:[.19444,.69444,0,0,1.14999],8599:[.19444,.69444,0,0,1.14999],8600:[.19444,.69444,0,0,1.14999],8601:[.19444,.69444,0,0,1.14999],8636:[-.10889,.39111,0,0,1.14999],8637:[-.10889,.39111,0,0,1.14999],8640:[-.10889,.39111,0,0,1.14999],8641:[-.10889,.39111,0,0,1.14999],8656:[-.10889,.39111,0,0,1.14999],8657:[.19444,.69444,0,0,.70277],8658:[-.10889,.39111,0,0,1.14999],8659:[.19444,.69444,0,0,.70277],8660:[-.10889,.39111,0,0,1.14999],8661:[.25,.75,0,0,.70277],8704:[0,.69444,0,0,.63889],8706:[0,.69444,.06389,0,.62847],8707:[0,.69444,0,0,.63889],8709:[.05556,.75,0,0,.575],8711:[0,.68611,0,0,.95833],8712:[.08556,.58556,0,0,.76666],8715:[.08556,.58556,0,0,.76666],8722:[.13333,.63333,0,0,.89444],8723:[.13333,.63333,0,0,.89444],8725:[.25,.75,0,0,.575],8726:[.25,.75,0,0,.575],8727:[-.02778,.47222,0,0,.575],8728:[-.02639,.47361,0,0,.575],8729:[-.02639,.47361,0,0,.575],8730:[.18,.82,0,0,.95833],8733:[0,.44444,0,0,.89444],8734:[0,.44444,0,0,1.14999],8736:[0,.69224,0,0,.72222],8739:[.25,.75,0,0,.31944],8741:[.25,.75,0,0,.575],8743:[0,.55556,0,0,.76666],8744:[0,.55556,0,0,.76666],8745:[0,.55556,0,0,.76666],8746:[0,.55556,0,0,.76666],8747:[.19444,.69444,.12778,0,.56875],8764:[-.10889,.39111,0,0,.89444],8768:[.19444,.69444,0,0,.31944],8771:[.00222,.50222,0,0,.89444],8773:[.027,.638,0,0,.894],8776:[.02444,.52444,0,0,.89444],8781:[.00222,.50222,0,0,.89444],8801:[.00222,.50222,0,0,.89444],8804:[.19667,.69667,0,0,.89444],8805:[.19667,.69667,0,0,.89444],8810:[.08556,.58556,0,0,1.14999],8811:[.08556,.58556,0,0,1.14999],8826:[.08556,.58556,0,0,.89444],8827:[.08556,.58556,0,0,.89444],8834:[.08556,.58556,0,0,.89444],8835:[.08556,.58556,0,0,.89444],8838:[.19667,.69667,0,0,.89444],8839:[.19667,.69667,0,0,.89444],8846:[0,.55556,0,0,.76666],8849:[.19667,.69667,0,0,.89444],8850:[.19667,.69667,0,0,.89444],8851:[0,.55556,0,0,.76666],8852:[0,.55556,0,0,.76666],8853:[.13333,.63333,0,0,.89444],8854:[.13333,.63333,0,0,.89444],8855:[.13333,.63333,0,0,.89444],8856:[.13333,.63333,0,0,.89444],8857:[.13333,.63333,0,0,.89444],8866:[0,.69444,0,0,.70277],8867:[0,.69444,0,0,.70277],8868:[0,.69444,0,0,.89444],8869:[0,.69444,0,0,.89444],8900:[-.02639,.47361,0,0,.575],8901:[-.02639,.47361,0,0,.31944],8902:[-.02778,.47222,0,0,.575],8968:[.25,.75,0,0,.51111],8969:[.25,.75,0,0,.51111],8970:[.25,.75,0,0,.51111],8971:[.25,.75,0,0,.51111],8994:[-.13889,.36111,0,0,1.14999],8995:[-.13889,.36111,0,0,1.14999],9651:[.19444,.69444,0,0,1.02222],9657:[-.02778,.47222,0,0,.575],9661:[.19444,.69444,0,0,1.02222],9667:[-.02778,.47222,0,0,.575],9711:[.19444,.69444,0,0,1.14999],9824:[.12963,.69444,0,0,.89444],9825:[.12963,.69444,0,0,.89444],9826:[.12963,.69444,0,0,.89444],9827:[.12963,.69444,0,0,.89444],9837:[0,.75,0,0,.44722],9838:[.19444,.69444,0,0,.44722],9839:[.19444,.69444,0,0,.44722],10216:[.25,.75,0,0,.44722],10217:[.25,.75,0,0,.44722],10815:[0,.68611,0,0,.9],10927:[.19667,.69667,0,0,.89444],10928:[.19667,.69667,0,0,.89444],57376:[.19444,.69444,0,0,0]},"Main-BoldItalic":{32:[0,0,0,0,.25],33:[0,.69444,.11417,0,.38611],34:[0,.69444,.07939,0,.62055],35:[.19444,.69444,.06833,0,.94444],37:[.05556,.75,.12861,0,.94444],38:[0,.69444,.08528,0,.88555],39:[0,.69444,.12945,0,.35555],40:[.25,.75,.15806,0,.47333],41:[.25,.75,.03306,0,.47333],42:[0,.75,.14333,0,.59111],43:[.10333,.60333,.03306,0,.88555],44:[.19444,.14722,0,0,.35555],45:[0,.44444,.02611,0,.41444],46:[0,.14722,0,0,.35555],47:[.25,.75,.15806,0,.59111],48:[0,.64444,.13167,0,.59111],49:[0,.64444,.13167,0,.59111],50:[0,.64444,.13167,0,.59111],51:[0,.64444,.13167,0,.59111],52:[.19444,.64444,.13167,0,.59111],53:[0,.64444,.13167,0,.59111],54:[0,.64444,.13167,0,.59111],55:[.19444,.64444,.13167,0,.59111],56:[0,.64444,.13167,0,.59111],57:[0,.64444,.13167,0,.59111],58:[0,.44444,.06695,0,.35555],59:[.19444,.44444,.06695,0,.35555],61:[-.10889,.39111,.06833,0,.88555],63:[0,.69444,.11472,0,.59111],64:[0,.69444,.09208,0,.88555],65:[0,.68611,0,0,.86555],66:[0,.68611,.0992,0,.81666],67:[0,.68611,.14208,0,.82666],68:[0,.68611,.09062,0,.87555],69:[0,.68611,.11431,0,.75666],70:[0,.68611,.12903,0,.72722],71:[0,.68611,.07347,0,.89527],72:[0,.68611,.17208,0,.8961],73:[0,.68611,.15681,0,.47166],74:[0,.68611,.145,0,.61055],75:[0,.68611,.14208,0,.89499],76:[0,.68611,0,0,.69777],77:[0,.68611,.17208,0,1.07277],78:[0,.68611,.17208,0,.8961],79:[0,.68611,.09062,0,.85499],80:[0,.68611,.0992,0,.78721],81:[.19444,.68611,.09062,0,.85499],82:[0,.68611,.02559,0,.85944],83:[0,.68611,.11264,0,.64999],84:[0,.68611,.12903,0,.7961],85:[0,.68611,.17208,0,.88083],86:[0,.68611,.18625,0,.86555],87:[0,.68611,.18625,0,1.15999],88:[0,.68611,.15681,0,.86555],89:[0,.68611,.19803,0,.86555],90:[0,.68611,.14208,0,.70888],91:[.25,.75,.1875,0,.35611],93:[.25,.75,.09972,0,.35611],94:[0,.69444,.06709,0,.59111],95:[.31,.13444,.09811,0,.59111],97:[0,.44444,.09426,0,.59111],98:[0,.69444,.07861,0,.53222],99:[0,.44444,.05222,0,.53222],100:[0,.69444,.10861,0,.59111],101:[0,.44444,.085,0,.53222],102:[.19444,.69444,.21778,0,.4],103:[.19444,.44444,.105,0,.53222],104:[0,.69444,.09426,0,.59111],105:[0,.69326,.11387,0,.35555],106:[.19444,.69326,.1672,0,.35555],107:[0,.69444,.11111,0,.53222],108:[0,.69444,.10861,0,.29666],109:[0,.44444,.09426,0,.94444],110:[0,.44444,.09426,0,.64999],111:[0,.44444,.07861,0,.59111],112:[.19444,.44444,.07861,0,.59111],113:[.19444,.44444,.105,0,.53222],114:[0,.44444,.11111,0,.50167],115:[0,.44444,.08167,0,.48694],116:[0,.63492,.09639,0,.385],117:[0,.44444,.09426,0,.62055],118:[0,.44444,.11111,0,.53222],119:[0,.44444,.11111,0,.76777],120:[0,.44444,.12583,0,.56055],121:[.19444,.44444,.105,0,.56166],122:[0,.44444,.13889,0,.49055],126:[.35,.34444,.11472,0,.59111],160:[0,0,0,0,.25],168:[0,.69444,.11473,0,.59111],176:[0,.69444,0,0,.94888],184:[.17014,0,0,0,.53222],198:[0,.68611,.11431,0,1.02277],216:[.04861,.73472,.09062,0,.88555],223:[.19444,.69444,.09736,0,.665],230:[0,.44444,.085,0,.82666],248:[.09722,.54167,.09458,0,.59111],305:[0,.44444,.09426,0,.35555],338:[0,.68611,.11431,0,1.14054],339:[0,.44444,.085,0,.82666],567:[.19444,.44444,.04611,0,.385],710:[0,.69444,.06709,0,.59111],711:[0,.63194,.08271,0,.59111],713:[0,.59444,.10444,0,.59111],714:[0,.69444,.08528,0,.59111],715:[0,.69444,0,0,.59111],728:[0,.69444,.10333,0,.59111],729:[0,.69444,.12945,0,.35555],730:[0,.69444,0,0,.94888],732:[0,.69444,.11472,0,.59111],733:[0,.69444,.11472,0,.59111],915:[0,.68611,.12903,0,.69777],916:[0,.68611,0,0,.94444],920:[0,.68611,.09062,0,.88555],923:[0,.68611,0,0,.80666],926:[0,.68611,.15092,0,.76777],928:[0,.68611,.17208,0,.8961],931:[0,.68611,.11431,0,.82666],933:[0,.68611,.10778,0,.88555],934:[0,.68611,.05632,0,.82666],936:[0,.68611,.10778,0,.88555],937:[0,.68611,.0992,0,.82666],8211:[0,.44444,.09811,0,.59111],8212:[0,.44444,.09811,0,1.18221],8216:[0,.69444,.12945,0,.35555],8217:[0,.69444,.12945,0,.35555],8220:[0,.69444,.16772,0,.62055],8221:[0,.69444,.07939,0,.62055]},"Main-Italic":{32:[0,0,0,0,.25],33:[0,.69444,.12417,0,.30667],34:[0,.69444,.06961,0,.51444],35:[.19444,.69444,.06616,0,.81777],37:[.05556,.75,.13639,0,.81777],38:[0,.69444,.09694,0,.76666],39:[0,.69444,.12417,0,.30667],40:[.25,.75,.16194,0,.40889],41:[.25,.75,.03694,0,.40889],42:[0,.75,.14917,0,.51111],43:[.05667,.56167,.03694,0,.76666],44:[.19444,.10556,0,0,.30667],45:[0,.43056,.02826,0,.35778],46:[0,.10556,0,0,.30667],47:[.25,.75,.16194,0,.51111],48:[0,.64444,.13556,0,.51111],49:[0,.64444,.13556,0,.51111],50:[0,.64444,.13556,0,.51111],51:[0,.64444,.13556,0,.51111],52:[.19444,.64444,.13556,0,.51111],53:[0,.64444,.13556,0,.51111],54:[0,.64444,.13556,0,.51111],55:[.19444,.64444,.13556,0,.51111],56:[0,.64444,.13556,0,.51111],57:[0,.64444,.13556,0,.51111],58:[0,.43056,.0582,0,.30667],59:[.19444,.43056,.0582,0,.30667],61:[-.13313,.36687,.06616,0,.76666],63:[0,.69444,.1225,0,.51111],64:[0,.69444,.09597,0,.76666],65:[0,.68333,0,0,.74333],66:[0,.68333,.10257,0,.70389],67:[0,.68333,.14528,0,.71555],68:[0,.68333,.09403,0,.755],69:[0,.68333,.12028,0,.67833],70:[0,.68333,.13305,0,.65277],71:[0,.68333,.08722,0,.77361],72:[0,.68333,.16389,0,.74333],73:[0,.68333,.15806,0,.38555],74:[0,.68333,.14028,0,.525],75:[0,.68333,.14528,0,.76888],76:[0,.68333,0,0,.62722],77:[0,.68333,.16389,0,.89666],78:[0,.68333,.16389,0,.74333],79:[0,.68333,.09403,0,.76666],80:[0,.68333,.10257,0,.67833],81:[.19444,.68333,.09403,0,.76666],82:[0,.68333,.03868,0,.72944],83:[0,.68333,.11972,0,.56222],84:[0,.68333,.13305,0,.71555],85:[0,.68333,.16389,0,.74333],86:[0,.68333,.18361,0,.74333],87:[0,.68333,.18361,0,.99888],88:[0,.68333,.15806,0,.74333],89:[0,.68333,.19383,0,.74333],90:[0,.68333,.14528,0,.61333],91:[.25,.75,.1875,0,.30667],93:[.25,.75,.10528,0,.30667],94:[0,.69444,.06646,0,.51111],95:[.31,.12056,.09208,0,.51111],97:[0,.43056,.07671,0,.51111],98:[0,.69444,.06312,0,.46],99:[0,.43056,.05653,0,.46],100:[0,.69444,.10333,0,.51111],101:[0,.43056,.07514,0,.46],102:[.19444,.69444,.21194,0,.30667],103:[.19444,.43056,.08847,0,.46],104:[0,.69444,.07671,0,.51111],105:[0,.65536,.1019,0,.30667],106:[.19444,.65536,.14467,0,.30667],107:[0,.69444,.10764,0,.46],108:[0,.69444,.10333,0,.25555],109:[0,.43056,.07671,0,.81777],110:[0,.43056,.07671,0,.56222],111:[0,.43056,.06312,0,.51111],112:[.19444,.43056,.06312,0,.51111],113:[.19444,.43056,.08847,0,.46],114:[0,.43056,.10764,0,.42166],115:[0,.43056,.08208,0,.40889],116:[0,.61508,.09486,0,.33222],117:[0,.43056,.07671,0,.53666],118:[0,.43056,.10764,0,.46],119:[0,.43056,.10764,0,.66444],120:[0,.43056,.12042,0,.46389],121:[.19444,.43056,.08847,0,.48555],122:[0,.43056,.12292,0,.40889],126:[.35,.31786,.11585,0,.51111],160:[0,0,0,0,.25],168:[0,.66786,.10474,0,.51111],176:[0,.69444,0,0,.83129],184:[.17014,0,0,0,.46],198:[0,.68333,.12028,0,.88277],216:[.04861,.73194,.09403,0,.76666],223:[.19444,.69444,.10514,0,.53666],230:[0,.43056,.07514,0,.71555],248:[.09722,.52778,.09194,0,.51111],338:[0,.68333,.12028,0,.98499],339:[0,.43056,.07514,0,.71555],710:[0,.69444,.06646,0,.51111],711:[0,.62847,.08295,0,.51111],713:[0,.56167,.10333,0,.51111],714:[0,.69444,.09694,0,.51111],715:[0,.69444,0,0,.51111],728:[0,.69444,.10806,0,.51111],729:[0,.66786,.11752,0,.30667],730:[0,.69444,0,0,.83129],732:[0,.66786,.11585,0,.51111],733:[0,.69444,.1225,0,.51111],915:[0,.68333,.13305,0,.62722],916:[0,.68333,0,0,.81777],920:[0,.68333,.09403,0,.76666],923:[0,.68333,0,0,.69222],926:[0,.68333,.15294,0,.66444],928:[0,.68333,.16389,0,.74333],931:[0,.68333,.12028,0,.71555],933:[0,.68333,.11111,0,.76666],934:[0,.68333,.05986,0,.71555],936:[0,.68333,.11111,0,.76666],937:[0,.68333,.10257,0,.71555],8211:[0,.43056,.09208,0,.51111],8212:[0,.43056,.09208,0,1.02222],8216:[0,.69444,.12417,0,.30667],8217:[0,.69444,.12417,0,.30667],8220:[0,.69444,.1685,0,.51444],8221:[0,.69444,.06961,0,.51444],8463:[0,.68889,0,0,.54028]},"Main-Regular":{32:[0,0,0,0,.25],33:[0,.69444,0,0,.27778],34:[0,.69444,0,0,.5],35:[.19444,.69444,0,0,.83334],36:[.05556,.75,0,0,.5],37:[.05556,.75,0,0,.83334],38:[0,.69444,0,0,.77778],39:[0,.69444,0,0,.27778],40:[.25,.75,0,0,.38889],41:[.25,.75,0,0,.38889],42:[0,.75,0,0,.5],43:[.08333,.58333,0,0,.77778],44:[.19444,.10556,0,0,.27778],45:[0,.43056,0,0,.33333],46:[0,.10556,0,0,.27778],47:[.25,.75,0,0,.5],48:[0,.64444,0,0,.5],49:[0,.64444,0,0,.5],50:[0,.64444,0,0,.5],51:[0,.64444,0,0,.5],52:[0,.64444,0,0,.5],53:[0,.64444,0,0,.5],54:[0,.64444,0,0,.5],55:[0,.64444,0,0,.5],56:[0,.64444,0,0,.5],57:[0,.64444,0,0,.5],58:[0,.43056,0,0,.27778],59:[.19444,.43056,0,0,.27778],60:[.0391,.5391,0,0,.77778],61:[-.13313,.36687,0,0,.77778],62:[.0391,.5391,0,0,.77778],63:[0,.69444,0,0,.47222],64:[0,.69444,0,0,.77778],65:[0,.68333,0,0,.75],66:[0,.68333,0,0,.70834],67:[0,.68333,0,0,.72222],68:[0,.68333,0,0,.76389],69:[0,.68333,0,0,.68056],70:[0,.68333,0,0,.65278],71:[0,.68333,0,0,.78472],72:[0,.68333,0,0,.75],73:[0,.68333,0,0,.36111],74:[0,.68333,0,0,.51389],75:[0,.68333,0,0,.77778],76:[0,.68333,0,0,.625],77:[0,.68333,0,0,.91667],78:[0,.68333,0,0,.75],79:[0,.68333,0,0,.77778],80:[0,.68333,0,0,.68056],81:[.19444,.68333,0,0,.77778],82:[0,.68333,0,0,.73611],83:[0,.68333,0,0,.55556],84:[0,.68333,0,0,.72222],85:[0,.68333,0,0,.75],86:[0,.68333,.01389,0,.75],87:[0,.68333,.01389,0,1.02778],88:[0,.68333,0,0,.75],89:[0,.68333,.025,0,.75],90:[0,.68333,0,0,.61111],91:[.25,.75,0,0,.27778],92:[.25,.75,0,0,.5],93:[.25,.75,0,0,.27778],94:[0,.69444,0,0,.5],95:[.31,.12056,.02778,0,.5],97:[0,.43056,0,0,.5],98:[0,.69444,0,0,.55556],99:[0,.43056,0,0,.44445],100:[0,.69444,0,0,.55556],101:[0,.43056,0,0,.44445],102:[0,.69444,.07778,0,.30556],103:[.19444,.43056,.01389,0,.5],104:[0,.69444,0,0,.55556],105:[0,.66786,0,0,.27778],106:[.19444,.66786,0,0,.30556],107:[0,.69444,0,0,.52778],108:[0,.69444,0,0,.27778],109:[0,.43056,0,0,.83334],110:[0,.43056,0,0,.55556],111:[0,.43056,0,0,.5],112:[.19444,.43056,0,0,.55556],113:[.19444,.43056,0,0,.52778],114:[0,.43056,0,0,.39167],115:[0,.43056,0,0,.39445],116:[0,.61508,0,0,.38889],117:[0,.43056,0,0,.55556],118:[0,.43056,.01389,0,.52778],119:[0,.43056,.01389,0,.72222],120:[0,.43056,0,0,.52778],121:[.19444,.43056,.01389,0,.52778],122:[0,.43056,0,0,.44445],123:[.25,.75,0,0,.5],124:[.25,.75,0,0,.27778],125:[.25,.75,0,0,.5],126:[.35,.31786,0,0,.5],160:[0,0,0,0,.25],163:[0,.69444,0,0,.76909],167:[.19444,.69444,0,0,.44445],168:[0,.66786,0,0,.5],172:[0,.43056,0,0,.66667],176:[0,.69444,0,0,.75],177:[.08333,.58333,0,0,.77778],182:[.19444,.69444,0,0,.61111],184:[.17014,0,0,0,.44445],198:[0,.68333,0,0,.90278],215:[.08333,.58333,0,0,.77778],216:[.04861,.73194,0,0,.77778],223:[0,.69444,0,0,.5],230:[0,.43056,0,0,.72222],247:[.08333,.58333,0,0,.77778],248:[.09722,.52778,0,0,.5],305:[0,.43056,0,0,.27778],338:[0,.68333,0,0,1.01389],339:[0,.43056,0,0,.77778],567:[.19444,.43056,0,0,.30556],710:[0,.69444,0,0,.5],711:[0,.62847,0,0,.5],713:[0,.56778,0,0,.5],714:[0,.69444,0,0,.5],715:[0,.69444,0,0,.5],728:[0,.69444,0,0,.5],729:[0,.66786,0,0,.27778],730:[0,.69444,0,0,.75],732:[0,.66786,0,0,.5],733:[0,.69444,0,0,.5],915:[0,.68333,0,0,.625],916:[0,.68333,0,0,.83334],920:[0,.68333,0,0,.77778],923:[0,.68333,0,0,.69445],926:[0,.68333,0,0,.66667],928:[0,.68333,0,0,.75],931:[0,.68333,0,0,.72222],933:[0,.68333,0,0,.77778],934:[0,.68333,0,0,.72222],936:[0,.68333,0,0,.77778],937:[0,.68333,0,0,.72222],8211:[0,.43056,.02778,0,.5],8212:[0,.43056,.02778,0,1],8216:[0,.69444,0,0,.27778],8217:[0,.69444,0,0,.27778],8220:[0,.69444,0,0,.5],8221:[0,.69444,0,0,.5],8224:[.19444,.69444,0,0,.44445],8225:[.19444,.69444,0,0,.44445],8230:[0,.123,0,0,1.172],8242:[0,.55556,0,0,.275],8407:[0,.71444,.15382,0,.5],8463:[0,.68889,0,0,.54028],8465:[0,.69444,0,0,.72222],8467:[0,.69444,0,.11111,.41667],8472:[.19444,.43056,0,.11111,.63646],8476:[0,.69444,0,0,.72222],8501:[0,.69444,0,0,.61111],8592:[-.13313,.36687,0,0,1],8593:[.19444,.69444,0,0,.5],8594:[-.13313,.36687,0,0,1],8595:[.19444,.69444,0,0,.5],8596:[-.13313,.36687,0,0,1],8597:[.25,.75,0,0,.5],8598:[.19444,.69444,0,0,1],8599:[.19444,.69444,0,0,1],8600:[.19444,.69444,0,0,1],8601:[.19444,.69444,0,0,1],8614:[.011,.511,0,0,1],8617:[.011,.511,0,0,1.126],8618:[.011,.511,0,0,1.126],8636:[-.13313,.36687,0,0,1],8637:[-.13313,.36687,0,0,1],8640:[-.13313,.36687,0,0,1],8641:[-.13313,.36687,0,0,1],8652:[.011,.671,0,0,1],8656:[-.13313,.36687,0,0,1],8657:[.19444,.69444,0,0,.61111],8658:[-.13313,.36687,0,0,1],8659:[.19444,.69444,0,0,.61111],8660:[-.13313,.36687,0,0,1],8661:[.25,.75,0,0,.61111],8704:[0,.69444,0,0,.55556],8706:[0,.69444,.05556,.08334,.5309],8707:[0,.69444,0,0,.55556],8709:[.05556,.75,0,0,.5],8711:[0,.68333,0,0,.83334],8712:[.0391,.5391,0,0,.66667],8715:[.0391,.5391,0,0,.66667],8722:[.08333,.58333,0,0,.77778],8723:[.08333,.58333,0,0,.77778],8725:[.25,.75,0,0,.5],8726:[.25,.75,0,0,.5],8727:[-.03472,.46528,0,0,.5],8728:[-.05555,.44445,0,0,.5],8729:[-.05555,.44445,0,0,.5],8730:[.2,.8,0,0,.83334],8733:[0,.43056,0,0,.77778],8734:[0,.43056,0,0,1],8736:[0,.69224,0,0,.72222],8739:[.25,.75,0,0,.27778],8741:[.25,.75,0,0,.5],8743:[0,.55556,0,0,.66667],8744:[0,.55556,0,0,.66667],8745:[0,.55556,0,0,.66667],8746:[0,.55556,0,0,.66667],8747:[.19444,.69444,.11111,0,.41667],8764:[-.13313,.36687,0,0,.77778],8768:[.19444,.69444,0,0,.27778],8771:[-.03625,.46375,0,0,.77778],8773:[-.022,.589,0,0,.778],8776:[-.01688,.48312,0,0,.77778],8781:[-.03625,.46375,0,0,.77778],8784:[-.133,.673,0,0,.778],8801:[-.03625,.46375,0,0,.77778],8804:[.13597,.63597,0,0,.77778],8805:[.13597,.63597,0,0,.77778],8810:[.0391,.5391,0,0,1],8811:[.0391,.5391,0,0,1],8826:[.0391,.5391,0,0,.77778],8827:[.0391,.5391,0,0,.77778],8834:[.0391,.5391,0,0,.77778],8835:[.0391,.5391,0,0,.77778],8838:[.13597,.63597,0,0,.77778],8839:[.13597,.63597,0,0,.77778],8846:[0,.55556,0,0,.66667],8849:[.13597,.63597,0,0,.77778],8850:[.13597,.63597,0,0,.77778],8851:[0,.55556,0,0,.66667],8852:[0,.55556,0,0,.66667],8853:[.08333,.58333,0,0,.77778],8854:[.08333,.58333,0,0,.77778],8855:[.08333,.58333,0,0,.77778],8856:[.08333,.58333,0,0,.77778],8857:[.08333,.58333,0,0,.77778],8866:[0,.69444,0,0,.61111],8867:[0,.69444,0,0,.61111],8868:[0,.69444,0,0,.77778],8869:[0,.69444,0,0,.77778],8872:[.249,.75,0,0,.867],8900:[-.05555,.44445,0,0,.5],8901:[-.05555,.44445,0,0,.27778],8902:[-.03472,.46528,0,0,.5],8904:[.005,.505,0,0,.9],8942:[.03,.903,0,0,.278],8943:[-.19,.313,0,0,1.172],8945:[-.1,.823,0,0,1.282],8968:[.25,.75,0,0,.44445],8969:[.25,.75,0,0,.44445],8970:[.25,.75,0,0,.44445],8971:[.25,.75,0,0,.44445],8994:[-.14236,.35764,0,0,1],8995:[-.14236,.35764,0,0,1],9136:[.244,.744,0,0,.412],9137:[.244,.745,0,0,.412],9651:[.19444,.69444,0,0,.88889],9657:[-.03472,.46528,0,0,.5],9661:[.19444,.69444,0,0,.88889],9667:[-.03472,.46528,0,0,.5],9711:[.19444,.69444,0,0,1],9824:[.12963,.69444,0,0,.77778],9825:[.12963,.69444,0,0,.77778],9826:[.12963,.69444,0,0,.77778],9827:[.12963,.69444,0,0,.77778],9837:[0,.75,0,0,.38889],9838:[.19444,.69444,0,0,.38889],9839:[.19444,.69444,0,0,.38889],10216:[.25,.75,0,0,.38889],10217:[.25,.75,0,0,.38889],10222:[.244,.744,0,0,.412],10223:[.244,.745,0,0,.412],10229:[.011,.511,0,0,1.609],10230:[.011,.511,0,0,1.638],10231:[.011,.511,0,0,1.859],10232:[.024,.525,0,0,1.609],10233:[.024,.525,0,0,1.638],10234:[.024,.525,0,0,1.858],10236:[.011,.511,0,0,1.638],10815:[0,.68333,0,0,.75],10927:[.13597,.63597,0,0,.77778],10928:[.13597,.63597,0,0,.77778],57376:[.19444,.69444,0,0,0]},"Math-BoldItalic":{32:[0,0,0,0,.25],48:[0,.44444,0,0,.575],49:[0,.44444,0,0,.575],50:[0,.44444,0,0,.575],51:[.19444,.44444,0,0,.575],52:[.19444,.44444,0,0,.575],53:[.19444,.44444,0,0,.575],54:[0,.64444,0,0,.575],55:[.19444,.44444,0,0,.575],56:[0,.64444,0,0,.575],57:[.19444,.44444,0,0,.575],65:[0,.68611,0,0,.86944],66:[0,.68611,.04835,0,.8664],67:[0,.68611,.06979,0,.81694],68:[0,.68611,.03194,0,.93812],69:[0,.68611,.05451,0,.81007],70:[0,.68611,.15972,0,.68889],71:[0,.68611,0,0,.88673],72:[0,.68611,.08229,0,.98229],73:[0,.68611,.07778,0,.51111],74:[0,.68611,.10069,0,.63125],75:[0,.68611,.06979,0,.97118],76:[0,.68611,0,0,.75555],77:[0,.68611,.11424,0,1.14201],78:[0,.68611,.11424,0,.95034],79:[0,.68611,.03194,0,.83666],80:[0,.68611,.15972,0,.72309],81:[.19444,.68611,0,0,.86861],82:[0,.68611,.00421,0,.87235],83:[0,.68611,.05382,0,.69271],84:[0,.68611,.15972,0,.63663],85:[0,.68611,.11424,0,.80027],86:[0,.68611,.25555,0,.67778],87:[0,.68611,.15972,0,1.09305],88:[0,.68611,.07778,0,.94722],89:[0,.68611,.25555,0,.67458],90:[0,.68611,.06979,0,.77257],97:[0,.44444,0,0,.63287],98:[0,.69444,0,0,.52083],99:[0,.44444,0,0,.51342],100:[0,.69444,0,0,.60972],101:[0,.44444,0,0,.55361],102:[.19444,.69444,.11042,0,.56806],103:[.19444,.44444,.03704,0,.5449],104:[0,.69444,0,0,.66759],105:[0,.69326,0,0,.4048],106:[.19444,.69326,.0622,0,.47083],107:[0,.69444,.01852,0,.6037],108:[0,.69444,.0088,0,.34815],109:[0,.44444,0,0,1.0324],110:[0,.44444,0,0,.71296],111:[0,.44444,0,0,.58472],112:[.19444,.44444,0,0,.60092],113:[.19444,.44444,.03704,0,.54213],114:[0,.44444,.03194,0,.5287],115:[0,.44444,0,0,.53125],116:[0,.63492,0,0,.41528],117:[0,.44444,0,0,.68102],118:[0,.44444,.03704,0,.56666],119:[0,.44444,.02778,0,.83148],120:[0,.44444,0,0,.65903],121:[.19444,.44444,.03704,0,.59028],122:[0,.44444,.04213,0,.55509],160:[0,0,0,0,.25],915:[0,.68611,.15972,0,.65694],916:[0,.68611,0,0,.95833],920:[0,.68611,.03194,0,.86722],923:[0,.68611,0,0,.80555],926:[0,.68611,.07458,0,.84125],928:[0,.68611,.08229,0,.98229],931:[0,.68611,.05451,0,.88507],933:[0,.68611,.15972,0,.67083],934:[0,.68611,0,0,.76666],936:[0,.68611,.11653,0,.71402],937:[0,.68611,.04835,0,.8789],945:[0,.44444,0,0,.76064],946:[.19444,.69444,.03403,0,.65972],947:[.19444,.44444,.06389,0,.59003],948:[0,.69444,.03819,0,.52222],949:[0,.44444,0,0,.52882],950:[.19444,.69444,.06215,0,.50833],951:[.19444,.44444,.03704,0,.6],952:[0,.69444,.03194,0,.5618],953:[0,.44444,0,0,.41204],954:[0,.44444,0,0,.66759],955:[0,.69444,0,0,.67083],956:[.19444,.44444,0,0,.70787],957:[0,.44444,.06898,0,.57685],958:[.19444,.69444,.03021,0,.50833],959:[0,.44444,0,0,.58472],960:[0,.44444,.03704,0,.68241],961:[.19444,.44444,0,0,.6118],962:[.09722,.44444,.07917,0,.42361],963:[0,.44444,.03704,0,.68588],964:[0,.44444,.13472,0,.52083],965:[0,.44444,.03704,0,.63055],966:[.19444,.44444,0,0,.74722],967:[.19444,.44444,0,0,.71805],968:[.19444,.69444,.03704,0,.75833],969:[0,.44444,.03704,0,.71782],977:[0,.69444,0,0,.69155],981:[.19444,.69444,0,0,.7125],982:[0,.44444,.03194,0,.975],1009:[.19444,.44444,0,0,.6118],1013:[0,.44444,0,0,.48333],57649:[0,.44444,0,0,.39352],57911:[.19444,.44444,0,0,.43889]},"Math-Italic":{32:[0,0,0,0,.25],48:[0,.43056,0,0,.5],49:[0,.43056,0,0,.5],50:[0,.43056,0,0,.5],51:[.19444,.43056,0,0,.5],52:[.19444,.43056,0,0,.5],53:[.19444,.43056,0,0,.5],54:[0,.64444,0,0,.5],55:[.19444,.43056,0,0,.5],56:[0,.64444,0,0,.5],57:[.19444,.43056,0,0,.5],65:[0,.68333,0,.13889,.75],66:[0,.68333,.05017,.08334,.75851],67:[0,.68333,.07153,.08334,.71472],68:[0,.68333,.02778,.05556,.82792],69:[0,.68333,.05764,.08334,.7382],70:[0,.68333,.13889,.08334,.64306],71:[0,.68333,0,.08334,.78625],72:[0,.68333,.08125,.05556,.83125],73:[0,.68333,.07847,.11111,.43958],74:[0,.68333,.09618,.16667,.55451],75:[0,.68333,.07153,.05556,.84931],76:[0,.68333,0,.02778,.68056],77:[0,.68333,.10903,.08334,.97014],78:[0,.68333,.10903,.08334,.80347],79:[0,.68333,.02778,.08334,.76278],80:[0,.68333,.13889,.08334,.64201],81:[.19444,.68333,0,.08334,.79056],82:[0,.68333,.00773,.08334,.75929],83:[0,.68333,.05764,.08334,.6132],84:[0,.68333,.13889,.08334,.58438],85:[0,.68333,.10903,.02778,.68278],86:[0,.68333,.22222,0,.58333],87:[0,.68333,.13889,0,.94445],88:[0,.68333,.07847,.08334,.82847],89:[0,.68333,.22222,0,.58056],90:[0,.68333,.07153,.08334,.68264],97:[0,.43056,0,0,.52859],98:[0,.69444,0,0,.42917],99:[0,.43056,0,.05556,.43276],100:[0,.69444,0,.16667,.52049],101:[0,.43056,0,.05556,.46563],102:[.19444,.69444,.10764,.16667,.48959],103:[.19444,.43056,.03588,.02778,.47697],104:[0,.69444,0,0,.57616],105:[0,.65952,0,0,.34451],106:[.19444,.65952,.05724,0,.41181],107:[0,.69444,.03148,0,.5206],108:[0,.69444,.01968,.08334,.29838],109:[0,.43056,0,0,.87801],110:[0,.43056,0,0,.60023],111:[0,.43056,0,.05556,.48472],112:[.19444,.43056,0,.08334,.50313],113:[.19444,.43056,.03588,.08334,.44641],114:[0,.43056,.02778,.05556,.45116],115:[0,.43056,0,.05556,.46875],116:[0,.61508,0,.08334,.36111],117:[0,.43056,0,.02778,.57246],118:[0,.43056,.03588,.02778,.48472],119:[0,.43056,.02691,.08334,.71592],120:[0,.43056,0,.02778,.57153],121:[.19444,.43056,.03588,.05556,.49028],122:[0,.43056,.04398,.05556,.46505],160:[0,0,0,0,.25],915:[0,.68333,.13889,.08334,.61528],916:[0,.68333,0,.16667,.83334],920:[0,.68333,.02778,.08334,.76278],923:[0,.68333,0,.16667,.69445],926:[0,.68333,.07569,.08334,.74236],928:[0,.68333,.08125,.05556,.83125],931:[0,.68333,.05764,.08334,.77986],933:[0,.68333,.13889,.05556,.58333],934:[0,.68333,0,.08334,.66667],936:[0,.68333,.11,.05556,.61222],937:[0,.68333,.05017,.08334,.7724],945:[0,.43056,.0037,.02778,.6397],946:[.19444,.69444,.05278,.08334,.56563],947:[.19444,.43056,.05556,0,.51773],948:[0,.69444,.03785,.05556,.44444],949:[0,.43056,0,.08334,.46632],950:[.19444,.69444,.07378,.08334,.4375],951:[.19444,.43056,.03588,.05556,.49653],952:[0,.69444,.02778,.08334,.46944],953:[0,.43056,0,.05556,.35394],954:[0,.43056,0,0,.57616],955:[0,.69444,0,0,.58334],956:[.19444,.43056,0,.02778,.60255],957:[0,.43056,.06366,.02778,.49398],958:[.19444,.69444,.04601,.11111,.4375],959:[0,.43056,0,.05556,.48472],960:[0,.43056,.03588,0,.57003],961:[.19444,.43056,0,.08334,.51702],962:[.09722,.43056,.07986,.08334,.36285],963:[0,.43056,.03588,0,.57141],964:[0,.43056,.1132,.02778,.43715],965:[0,.43056,.03588,.02778,.54028],966:[.19444,.43056,0,.08334,.65417],967:[.19444,.43056,0,.05556,.62569],968:[.19444,.69444,.03588,.11111,.65139],969:[0,.43056,.03588,0,.62245],977:[0,.69444,0,.08334,.59144],981:[.19444,.69444,0,.08334,.59583],982:[0,.43056,.02778,0,.82813],1009:[.19444,.43056,0,.08334,.51702],1013:[0,.43056,0,.05556,.4059],57649:[0,.43056,0,.02778,.32246],57911:[.19444,.43056,0,.08334,.38403]},"SansSerif-Bold":{32:[0,0,0,0,.25],33:[0,.69444,0,0,.36667],34:[0,.69444,0,0,.55834],35:[.19444,.69444,0,0,.91667],36:[.05556,.75,0,0,.55],37:[.05556,.75,0,0,1.02912],38:[0,.69444,0,0,.83056],39:[0,.69444,0,0,.30556],40:[.25,.75,0,0,.42778],41:[.25,.75,0,0,.42778],42:[0,.75,0,0,.55],43:[.11667,.61667,0,0,.85556],44:[.10556,.13056,0,0,.30556],45:[0,.45833,0,0,.36667],46:[0,.13056,0,0,.30556],47:[.25,.75,0,0,.55],48:[0,.69444,0,0,.55],49:[0,.69444,0,0,.55],50:[0,.69444,0,0,.55],51:[0,.69444,0,0,.55],52:[0,.69444,0,0,.55],53:[0,.69444,0,0,.55],54:[0,.69444,0,0,.55],55:[0,.69444,0,0,.55],56:[0,.69444,0,0,.55],57:[0,.69444,0,0,.55],58:[0,.45833,0,0,.30556],59:[.10556,.45833,0,0,.30556],61:[-.09375,.40625,0,0,.85556],63:[0,.69444,0,0,.51945],64:[0,.69444,0,0,.73334],65:[0,.69444,0,0,.73334],66:[0,.69444,0,0,.73334],67:[0,.69444,0,0,.70278],68:[0,.69444,0,0,.79445],69:[0,.69444,0,0,.64167],70:[0,.69444,0,0,.61111],71:[0,.69444,0,0,.73334],72:[0,.69444,0,0,.79445],73:[0,.69444,0,0,.33056],74:[0,.69444,0,0,.51945],75:[0,.69444,0,0,.76389],76:[0,.69444,0,0,.58056],77:[0,.69444,0,0,.97778],78:[0,.69444,0,0,.79445],79:[0,.69444,0,0,.79445],80:[0,.69444,0,0,.70278],81:[.10556,.69444,0,0,.79445],82:[0,.69444,0,0,.70278],83:[0,.69444,0,0,.61111],84:[0,.69444,0,0,.73334],85:[0,.69444,0,0,.76389],86:[0,.69444,.01528,0,.73334],87:[0,.69444,.01528,0,1.03889],88:[0,.69444,0,0,.73334],89:[0,.69444,.0275,0,.73334],90:[0,.69444,0,0,.67223],91:[.25,.75,0,0,.34306],93:[.25,.75,0,0,.34306],94:[0,.69444,0,0,.55],95:[.35,.10833,.03056,0,.55],97:[0,.45833,0,0,.525],98:[0,.69444,0,0,.56111],99:[0,.45833,0,0,.48889],100:[0,.69444,0,0,.56111],101:[0,.45833,0,0,.51111],102:[0,.69444,.07639,0,.33611],103:[.19444,.45833,.01528,0,.55],104:[0,.69444,0,0,.56111],105:[0,.69444,0,0,.25556],106:[.19444,.69444,0,0,.28611],107:[0,.69444,0,0,.53056],108:[0,.69444,0,0,.25556],109:[0,.45833,0,0,.86667],110:[0,.45833,0,0,.56111],111:[0,.45833,0,0,.55],112:[.19444,.45833,0,0,.56111],113:[.19444,.45833,0,0,.56111],114:[0,.45833,.01528,0,.37222],115:[0,.45833,0,0,.42167],116:[0,.58929,0,0,.40417],117:[0,.45833,0,0,.56111],118:[0,.45833,.01528,0,.5],119:[0,.45833,.01528,0,.74445],120:[0,.45833,0,0,.5],121:[.19444,.45833,.01528,0,.5],122:[0,.45833,0,0,.47639],126:[.35,.34444,0,0,.55],160:[0,0,0,0,.25],168:[0,.69444,0,0,.55],176:[0,.69444,0,0,.73334],180:[0,.69444,0,0,.55],184:[.17014,0,0,0,.48889],305:[0,.45833,0,0,.25556],567:[.19444,.45833,0,0,.28611],710:[0,.69444,0,0,.55],711:[0,.63542,0,0,.55],713:[0,.63778,0,0,.55],728:[0,.69444,0,0,.55],729:[0,.69444,0,0,.30556],730:[0,.69444,0,0,.73334],732:[0,.69444,0,0,.55],733:[0,.69444,0,0,.55],915:[0,.69444,0,0,.58056],916:[0,.69444,0,0,.91667],920:[0,.69444,0,0,.85556],923:[0,.69444,0,0,.67223],926:[0,.69444,0,0,.73334],928:[0,.69444,0,0,.79445],931:[0,.69444,0,0,.79445],933:[0,.69444,0,0,.85556],934:[0,.69444,0,0,.79445],936:[0,.69444,0,0,.85556],937:[0,.69444,0,0,.79445],8211:[0,.45833,.03056,0,.55],8212:[0,.45833,.03056,0,1.10001],8216:[0,.69444,0,0,.30556],8217:[0,.69444,0,0,.30556],8220:[0,.69444,0,0,.55834],8221:[0,.69444,0,0,.55834]},"SansSerif-Italic":{32:[0,0,0,0,.25],33:[0,.69444,.05733,0,.31945],34:[0,.69444,.00316,0,.5],35:[.19444,.69444,.05087,0,.83334],36:[.05556,.75,.11156,0,.5],37:[.05556,.75,.03126,0,.83334],38:[0,.69444,.03058,0,.75834],39:[0,.69444,.07816,0,.27778],40:[.25,.75,.13164,0,.38889],41:[.25,.75,.02536,0,.38889],42:[0,.75,.11775,0,.5],43:[.08333,.58333,.02536,0,.77778],44:[.125,.08333,0,0,.27778],45:[0,.44444,.01946,0,.33333],46:[0,.08333,0,0,.27778],47:[.25,.75,.13164,0,.5],48:[0,.65556,.11156,0,.5],49:[0,.65556,.11156,0,.5],50:[0,.65556,.11156,0,.5],51:[0,.65556,.11156,0,.5],52:[0,.65556,.11156,0,.5],53:[0,.65556,.11156,0,.5],54:[0,.65556,.11156,0,.5],55:[0,.65556,.11156,0,.5],56:[0,.65556,.11156,0,.5],57:[0,.65556,.11156,0,.5],58:[0,.44444,.02502,0,.27778],59:[.125,.44444,.02502,0,.27778],61:[-.13,.37,.05087,0,.77778],63:[0,.69444,.11809,0,.47222],64:[0,.69444,.07555,0,.66667],65:[0,.69444,0,0,.66667],66:[0,.69444,.08293,0,.66667],67:[0,.69444,.11983,0,.63889],68:[0,.69444,.07555,0,.72223],69:[0,.69444,.11983,0,.59722],70:[0,.69444,.13372,0,.56945],71:[0,.69444,.11983,0,.66667],72:[0,.69444,.08094,0,.70834],73:[0,.69444,.13372,0,.27778],74:[0,.69444,.08094,0,.47222],75:[0,.69444,.11983,0,.69445],76:[0,.69444,0,0,.54167],77:[0,.69444,.08094,0,.875],78:[0,.69444,.08094,0,.70834],79:[0,.69444,.07555,0,.73611],80:[0,.69444,.08293,0,.63889],81:[.125,.69444,.07555,0,.73611],82:[0,.69444,.08293,0,.64584],83:[0,.69444,.09205,0,.55556],84:[0,.69444,.13372,0,.68056],85:[0,.69444,.08094,0,.6875],86:[0,.69444,.1615,0,.66667],87:[0,.69444,.1615,0,.94445],88:[0,.69444,.13372,0,.66667],89:[0,.69444,.17261,0,.66667],90:[0,.69444,.11983,0,.61111],91:[.25,.75,.15942,0,.28889],93:[.25,.75,.08719,0,.28889],94:[0,.69444,.0799,0,.5],95:[.35,.09444,.08616,0,.5],97:[0,.44444,.00981,0,.48056],98:[0,.69444,.03057,0,.51667],99:[0,.44444,.08336,0,.44445],100:[0,.69444,.09483,0,.51667],101:[0,.44444,.06778,0,.44445],102:[0,.69444,.21705,0,.30556],103:[.19444,.44444,.10836,0,.5],104:[0,.69444,.01778,0,.51667],105:[0,.67937,.09718,0,.23889],106:[.19444,.67937,.09162,0,.26667],107:[0,.69444,.08336,0,.48889],108:[0,.69444,.09483,0,.23889],109:[0,.44444,.01778,0,.79445],110:[0,.44444,.01778,0,.51667],111:[0,.44444,.06613,0,.5],112:[.19444,.44444,.0389,0,.51667],113:[.19444,.44444,.04169,0,.51667],114:[0,.44444,.10836,0,.34167],115:[0,.44444,.0778,0,.38333],116:[0,.57143,.07225,0,.36111],117:[0,.44444,.04169,0,.51667],118:[0,.44444,.10836,0,.46111],119:[0,.44444,.10836,0,.68334],120:[0,.44444,.09169,0,.46111],121:[.19444,.44444,.10836,0,.46111],122:[0,.44444,.08752,0,.43472],126:[.35,.32659,.08826,0,.5],160:[0,0,0,0,.25],168:[0,.67937,.06385,0,.5],176:[0,.69444,0,0,.73752],184:[.17014,0,0,0,.44445],305:[0,.44444,.04169,0,.23889],567:[.19444,.44444,.04169,0,.26667],710:[0,.69444,.0799,0,.5],711:[0,.63194,.08432,0,.5],713:[0,.60889,.08776,0,.5],714:[0,.69444,.09205,0,.5],715:[0,.69444,0,0,.5],728:[0,.69444,.09483,0,.5],729:[0,.67937,.07774,0,.27778],730:[0,.69444,0,0,.73752],732:[0,.67659,.08826,0,.5],733:[0,.69444,.09205,0,.5],915:[0,.69444,.13372,0,.54167],916:[0,.69444,0,0,.83334],920:[0,.69444,.07555,0,.77778],923:[0,.69444,0,0,.61111],926:[0,.69444,.12816,0,.66667],928:[0,.69444,.08094,0,.70834],931:[0,.69444,.11983,0,.72222],933:[0,.69444,.09031,0,.77778],934:[0,.69444,.04603,0,.72222],936:[0,.69444,.09031,0,.77778],937:[0,.69444,.08293,0,.72222],8211:[0,.44444,.08616,0,.5],8212:[0,.44444,.08616,0,1],8216:[0,.69444,.07816,0,.27778],8217:[0,.69444,.07816,0,.27778],8220:[0,.69444,.14205,0,.5],8221:[0,.69444,.00316,0,.5]},"SansSerif-Regular":{32:[0,0,0,0,.25],33:[0,.69444,0,0,.31945],34:[0,.69444,0,0,.5],35:[.19444,.69444,0,0,.83334],36:[.05556,.75,0,0,.5],37:[.05556,.75,0,0,.83334],38:[0,.69444,0,0,.75834],39:[0,.69444,0,0,.27778],40:[.25,.75,0,0,.38889],41:[.25,.75,0,0,.38889],42:[0,.75,0,0,.5],43:[.08333,.58333,0,0,.77778],44:[.125,.08333,0,0,.27778],45:[0,.44444,0,0,.33333],46:[0,.08333,0,0,.27778],47:[.25,.75,0,0,.5],48:[0,.65556,0,0,.5],49:[0,.65556,0,0,.5],50:[0,.65556,0,0,.5],51:[0,.65556,0,0,.5],52:[0,.65556,0,0,.5],53:[0,.65556,0,0,.5],54:[0,.65556,0,0,.5],55:[0,.65556,0,0,.5],56:[0,.65556,0,0,.5],57:[0,.65556,0,0,.5],58:[0,.44444,0,0,.27778],59:[.125,.44444,0,0,.27778],61:[-.13,.37,0,0,.77778],63:[0,.69444,0,0,.47222],64:[0,.69444,0,0,.66667],65:[0,.69444,0,0,.66667],66:[0,.69444,0,0,.66667],67:[0,.69444,0,0,.63889],68:[0,.69444,0,0,.72223],69:[0,.69444,0,0,.59722],70:[0,.69444,0,0,.56945],71:[0,.69444,0,0,.66667],72:[0,.69444,0,0,.70834],73:[0,.69444,0,0,.27778],74:[0,.69444,0,0,.47222],75:[0,.69444,0,0,.69445],76:[0,.69444,0,0,.54167],77:[0,.69444,0,0,.875],78:[0,.69444,0,0,.70834],79:[0,.69444,0,0,.73611],80:[0,.69444,0,0,.63889],81:[.125,.69444,0,0,.73611],82:[0,.69444,0,0,.64584],83:[0,.69444,0,0,.55556],84:[0,.69444,0,0,.68056],85:[0,.69444,0,0,.6875],86:[0,.69444,.01389,0,.66667],87:[0,.69444,.01389,0,.94445],88:[0,.69444,0,0,.66667],89:[0,.69444,.025,0,.66667],90:[0,.69444,0,0,.61111],91:[.25,.75,0,0,.28889],93:[.25,.75,0,0,.28889],94:[0,.69444,0,0,.5],95:[.35,.09444,.02778,0,.5],97:[0,.44444,0,0,.48056],98:[0,.69444,0,0,.51667],99:[0,.44444,0,0,.44445],100:[0,.69444,0,0,.51667],101:[0,.44444,0,0,.44445],102:[0,.69444,.06944,0,.30556],103:[.19444,.44444,.01389,0,.5],104:[0,.69444,0,0,.51667],105:[0,.67937,0,0,.23889],106:[.19444,.67937,0,0,.26667],107:[0,.69444,0,0,.48889],108:[0,.69444,0,0,.23889],109:[0,.44444,0,0,.79445],110:[0,.44444,0,0,.51667],111:[0,.44444,0,0,.5],112:[.19444,.44444,0,0,.51667],113:[.19444,.44444,0,0,.51667],114:[0,.44444,.01389,0,.34167],115:[0,.44444,0,0,.38333],116:[0,.57143,0,0,.36111],117:[0,.44444,0,0,.51667],118:[0,.44444,.01389,0,.46111],119:[0,.44444,.01389,0,.68334],120:[0,.44444,0,0,.46111],121:[.19444,.44444,.01389,0,.46111],122:[0,.44444,0,0,.43472],126:[.35,.32659,0,0,.5],160:[0,0,0,0,.25],168:[0,.67937,0,0,.5],176:[0,.69444,0,0,.66667],184:[.17014,0,0,0,.44445],305:[0,.44444,0,0,.23889],567:[.19444,.44444,0,0,.26667],710:[0,.69444,0,0,.5],711:[0,.63194,0,0,.5],713:[0,.60889,0,0,.5],714:[0,.69444,0,0,.5],715:[0,.69444,0,0,.5],728:[0,.69444,0,0,.5],729:[0,.67937,0,0,.27778],730:[0,.69444,0,0,.66667],732:[0,.67659,0,0,.5],733:[0,.69444,0,0,.5],915:[0,.69444,0,0,.54167],916:[0,.69444,0,0,.83334],920:[0,.69444,0,0,.77778],923:[0,.69444,0,0,.61111],926:[0,.69444,0,0,.66667],928:[0,.69444,0,0,.70834],931:[0,.69444,0,0,.72222],933:[0,.69444,0,0,.77778],934:[0,.69444,0,0,.72222],936:[0,.69444,0,0,.77778],937:[0,.69444,0,0,.72222],8211:[0,.44444,.02778,0,.5],8212:[0,.44444,.02778,0,1],8216:[0,.69444,0,0,.27778],8217:[0,.69444,0,0,.27778],8220:[0,.69444,0,0,.5],8221:[0,.69444,0,0,.5]},"Script-Regular":{32:[0,0,0,0,.25],65:[0,.7,.22925,0,.80253],66:[0,.7,.04087,0,.90757],67:[0,.7,.1689,0,.66619],68:[0,.7,.09371,0,.77443],69:[0,.7,.18583,0,.56162],70:[0,.7,.13634,0,.89544],71:[0,.7,.17322,0,.60961],72:[0,.7,.29694,0,.96919],73:[0,.7,.19189,0,.80907],74:[.27778,.7,.19189,0,1.05159],75:[0,.7,.31259,0,.91364],76:[0,.7,.19189,0,.87373],77:[0,.7,.15981,0,1.08031],78:[0,.7,.3525,0,.9015],79:[0,.7,.08078,0,.73787],80:[0,.7,.08078,0,1.01262],81:[0,.7,.03305,0,.88282],82:[0,.7,.06259,0,.85],83:[0,.7,.19189,0,.86767],84:[0,.7,.29087,0,.74697],85:[0,.7,.25815,0,.79996],86:[0,.7,.27523,0,.62204],87:[0,.7,.27523,0,.80532],88:[0,.7,.26006,0,.94445],89:[0,.7,.2939,0,.70961],90:[0,.7,.24037,0,.8212],160:[0,0,0,0,.25]},"Size1-Regular":{32:[0,0,0,0,.25],40:[.35001,.85,0,0,.45834],41:[.35001,.85,0,0,.45834],47:[.35001,.85,0,0,.57778],91:[.35001,.85,0,0,.41667],92:[.35001,.85,0,0,.57778],93:[.35001,.85,0,0,.41667],123:[.35001,.85,0,0,.58334],125:[.35001,.85,0,0,.58334],160:[0,0,0,0,.25],710:[0,.72222,0,0,.55556],732:[0,.72222,0,0,.55556],770:[0,.72222,0,0,.55556],771:[0,.72222,0,0,.55556],8214:[-99e-5,.601,0,0,.77778],8593:[1e-5,.6,0,0,.66667],8595:[1e-5,.6,0,0,.66667],8657:[1e-5,.6,0,0,.77778],8659:[1e-5,.6,0,0,.77778],8719:[.25001,.75,0,0,.94445],8720:[.25001,.75,0,0,.94445],8721:[.25001,.75,0,0,1.05556],8730:[.35001,.85,0,0,1],8739:[-.00599,.606,0,0,.33333],8741:[-.00599,.606,0,0,.55556],8747:[.30612,.805,.19445,0,.47222],8748:[.306,.805,.19445,0,.47222],8749:[.306,.805,.19445,0,.47222],8750:[.30612,.805,.19445,0,.47222],8896:[.25001,.75,0,0,.83334],8897:[.25001,.75,0,0,.83334],8898:[.25001,.75,0,0,.83334],8899:[.25001,.75,0,0,.83334],8968:[.35001,.85,0,0,.47222],8969:[.35001,.85,0,0,.47222],8970:[.35001,.85,0,0,.47222],8971:[.35001,.85,0,0,.47222],9168:[-99e-5,.601,0,0,.66667],10216:[.35001,.85,0,0,.47222],10217:[.35001,.85,0,0,.47222],10752:[.25001,.75,0,0,1.11111],10753:[.25001,.75,0,0,1.11111],10754:[.25001,.75,0,0,1.11111],10756:[.25001,.75,0,0,.83334],10758:[.25001,.75,0,0,.83334]},"Size2-Regular":{32:[0,0,0,0,.25],40:[.65002,1.15,0,0,.59722],41:[.65002,1.15,0,0,.59722],47:[.65002,1.15,0,0,.81111],91:[.65002,1.15,0,0,.47222],92:[.65002,1.15,0,0,.81111],93:[.65002,1.15,0,0,.47222],123:[.65002,1.15,0,0,.66667],125:[.65002,1.15,0,0,.66667],160:[0,0,0,0,.25],710:[0,.75,0,0,1],732:[0,.75,0,0,1],770:[0,.75,0,0,1],771:[0,.75,0,0,1],8719:[.55001,1.05,0,0,1.27778],8720:[.55001,1.05,0,0,1.27778],8721:[.55001,1.05,0,0,1.44445],8730:[.65002,1.15,0,0,1],8747:[.86225,1.36,.44445,0,.55556],8748:[.862,1.36,.44445,0,.55556],8749:[.862,1.36,.44445,0,.55556],8750:[.86225,1.36,.44445,0,.55556],8896:[.55001,1.05,0,0,1.11111],8897:[.55001,1.05,0,0,1.11111],8898:[.55001,1.05,0,0,1.11111],8899:[.55001,1.05,0,0,1.11111],8968:[.65002,1.15,0,0,.52778],8969:[.65002,1.15,0,0,.52778],8970:[.65002,1.15,0,0,.52778],8971:[.65002,1.15,0,0,.52778],10216:[.65002,1.15,0,0,.61111],10217:[.65002,1.15,0,0,.61111],10752:[.55001,1.05,0,0,1.51112],10753:[.55001,1.05,0,0,1.51112],10754:[.55001,1.05,0,0,1.51112],10756:[.55001,1.05,0,0,1.11111],10758:[.55001,1.05,0,0,1.11111]},"Size3-Regular":{32:[0,0,0,0,.25],40:[.95003,1.45,0,0,.73611],41:[.95003,1.45,0,0,.73611],47:[.95003,1.45,0,0,1.04445],91:[.95003,1.45,0,0,.52778],92:[.95003,1.45,0,0,1.04445],93:[.95003,1.45,0,0,.52778],123:[.95003,1.45,0,0,.75],125:[.95003,1.45,0,0,.75],160:[0,0,0,0,.25],710:[0,.75,0,0,1.44445],732:[0,.75,0,0,1.44445],770:[0,.75,0,0,1.44445],771:[0,.75,0,0,1.44445],8730:[.95003,1.45,0,0,1],8968:[.95003,1.45,0,0,.58334],8969:[.95003,1.45,0,0,.58334],8970:[.95003,1.45,0,0,.58334],8971:[.95003,1.45,0,0,.58334],10216:[.95003,1.45,0,0,.75],10217:[.95003,1.45,0,0,.75]},"Size4-Regular":{32:[0,0,0,0,.25],40:[1.25003,1.75,0,0,.79167],41:[1.25003,1.75,0,0,.79167],47:[1.25003,1.75,0,0,1.27778],91:[1.25003,1.75,0,0,.58334],92:[1.25003,1.75,0,0,1.27778],93:[1.25003,1.75,0,0,.58334],123:[1.25003,1.75,0,0,.80556],125:[1.25003,1.75,0,0,.80556],160:[0,0,0,0,.25],710:[0,.825,0,0,1.8889],732:[0,.825,0,0,1.8889],770:[0,.825,0,0,1.8889],771:[0,.825,0,0,1.8889],8730:[1.25003,1.75,0,0,1],8968:[1.25003,1.75,0,0,.63889],8969:[1.25003,1.75,0,0,.63889],8970:[1.25003,1.75,0,0,.63889],8971:[1.25003,1.75,0,0,.63889],9115:[.64502,1.155,0,0,.875],9116:[1e-5,.6,0,0,.875],9117:[.64502,1.155,0,0,.875],9118:[.64502,1.155,0,0,.875],9119:[1e-5,.6,0,0,.875],9120:[.64502,1.155,0,0,.875],9121:[.64502,1.155,0,0,.66667],9122:[-99e-5,.601,0,0,.66667],9123:[.64502,1.155,0,0,.66667],9124:[.64502,1.155,0,0,.66667],9125:[-99e-5,.601,0,0,.66667],9126:[.64502,1.155,0,0,.66667],9127:[1e-5,.9,0,0,.88889],9128:[.65002,1.15,0,0,.88889],9129:[.90001,0,0,0,.88889],9130:[0,.3,0,0,.88889],9131:[1e-5,.9,0,0,.88889],9132:[.65002,1.15,0,0,.88889],9133:[.90001,0,0,0,.88889],9143:[.88502,.915,0,0,1.05556],10216:[1.25003,1.75,0,0,.80556],10217:[1.25003,1.75,0,0,.80556],57344:[-.00499,.605,0,0,1.05556],57345:[-.00499,.605,0,0,1.05556],57680:[0,.12,0,0,.45],57681:[0,.12,0,0,.45],57682:[0,.12,0,0,.45],57683:[0,.12,0,0,.45]},"Typewriter-Regular":{32:[0,0,0,0,.525],33:[0,.61111,0,0,.525],34:[0,.61111,0,0,.525],35:[0,.61111,0,0,.525],36:[.08333,.69444,0,0,.525],37:[.08333,.69444,0,0,.525],38:[0,.61111,0,0,.525],39:[0,.61111,0,0,.525],40:[.08333,.69444,0,0,.525],41:[.08333,.69444,0,0,.525],42:[0,.52083,0,0,.525],43:[-.08056,.53055,0,0,.525],44:[.13889,.125,0,0,.525],45:[-.08056,.53055,0,0,.525],46:[0,.125,0,0,.525],47:[.08333,.69444,0,0,.525],48:[0,.61111,0,0,.525],49:[0,.61111,0,0,.525],50:[0,.61111,0,0,.525],51:[0,.61111,0,0,.525],52:[0,.61111,0,0,.525],53:[0,.61111,0,0,.525],54:[0,.61111,0,0,.525],55:[0,.61111,0,0,.525],56:[0,.61111,0,0,.525],57:[0,.61111,0,0,.525],58:[0,.43056,0,0,.525],59:[.13889,.43056,0,0,.525],60:[-.05556,.55556,0,0,.525],61:[-.19549,.41562,0,0,.525],62:[-.05556,.55556,0,0,.525],63:[0,.61111,0,0,.525],64:[0,.61111,0,0,.525],65:[0,.61111,0,0,.525],66:[0,.61111,0,0,.525],67:[0,.61111,0,0,.525],68:[0,.61111,0,0,.525],69:[0,.61111,0,0,.525],70:[0,.61111,0,0,.525],71:[0,.61111,0,0,.525],72:[0,.61111,0,0,.525],73:[0,.61111,0,0,.525],74:[0,.61111,0,0,.525],75:[0,.61111,0,0,.525],76:[0,.61111,0,0,.525],77:[0,.61111,0,0,.525],78:[0,.61111,0,0,.525],79:[0,.61111,0,0,.525],80:[0,.61111,0,0,.525],81:[.13889,.61111,0,0,.525],82:[0,.61111,0,0,.525],83:[0,.61111,0,0,.525],84:[0,.61111,0,0,.525],85:[0,.61111,0,0,.525],86:[0,.61111,0,0,.525],87:[0,.61111,0,0,.525],88:[0,.61111,0,0,.525],89:[0,.61111,0,0,.525],90:[0,.61111,0,0,.525],91:[.08333,.69444,0,0,.525],92:[.08333,.69444,0,0,.525],93:[.08333,.69444,0,0,.525],94:[0,.61111,0,0,.525],95:[.09514,0,0,0,.525],96:[0,.61111,0,0,.525],97:[0,.43056,0,0,.525],98:[0,.61111,0,0,.525],99:[0,.43056,0,0,.525],100:[0,.61111,0,0,.525],101:[0,.43056,0,0,.525],102:[0,.61111,0,0,.525],103:[.22222,.43056,0,0,.525],104:[0,.61111,0,0,.525],105:[0,.61111,0,0,.525],106:[.22222,.61111,0,0,.525],107:[0,.61111,0,0,.525],108:[0,.61111,0,0,.525],109:[0,.43056,0,0,.525],110:[0,.43056,0,0,.525],111:[0,.43056,0,0,.525],112:[.22222,.43056,0,0,.525],113:[.22222,.43056,0,0,.525],114:[0,.43056,0,0,.525],115:[0,.43056,0,0,.525],116:[0,.55358,0,0,.525],117:[0,.43056,0,0,.525],118:[0,.43056,0,0,.525],119:[0,.43056,0,0,.525],120:[0,.43056,0,0,.525],121:[.22222,.43056,0,0,.525],122:[0,.43056,0,0,.525],123:[.08333,.69444,0,0,.525],124:[.08333,.69444,0,0,.525],125:[.08333,.69444,0,0,.525],126:[0,.61111,0,0,.525],127:[0,.61111,0,0,.525],160:[0,0,0,0,.525],176:[0,.61111,0,0,.525],184:[.19445,0,0,0,.525],305:[0,.43056,0,0,.525],567:[.22222,.43056,0,0,.525],711:[0,.56597,0,0,.525],713:[0,.56555,0,0,.525],714:[0,.61111,0,0,.525],715:[0,.61111,0,0,.525],728:[0,.61111,0,0,.525],730:[0,.61111,0,0,.525],770:[0,.61111,0,0,.525],771:[0,.61111,0,0,.525],776:[0,.61111,0,0,.525],915:[0,.61111,0,0,.525],916:[0,.61111,0,0,.525],920:[0,.61111,0,0,.525],923:[0,.61111,0,0,.525],926:[0,.61111,0,0,.525],928:[0,.61111,0,0,.525],931:[0,.61111,0,0,.525],933:[0,.61111,0,0,.525],934:[0,.61111,0,0,.525],936:[0,.61111,0,0,.525],937:[0,.61111,0,0,.525],8216:[0,.61111,0,0,.525],8217:[0,.61111,0,0,.525],8242:[0,.61111,0,0,.525],9251:[.11111,.21944,0,0,.525]}},Re={slant:[.25,.25,.25],space:[0,0,0],stretch:[0,0,0],shrink:[0,0,0],xHeight:[.431,.431,.431],quad:[1,1.171,1.472],extraSpace:[0,0,0],num1:[.677,.732,.925],num2:[.394,.384,.387],num3:[.444,.471,.504],denom1:[.686,.752,1.025],denom2:[.345,.344,.532],sup1:[.413,.503,.504],sup2:[.363,.431,.404],sup3:[.289,.286,.294],sub1:[.15,.143,.2],sub2:[.247,.286,.4],supDrop:[.386,.353,.494],subDrop:[.05,.071,.1],delim1:[2.39,1.7,1.98],delim2:[1.01,1.157,1.42],axisHeight:[.25,.25,.25],defaultRuleThickness:[.04,.049,.049],bigOpSpacing1:[.111,.111,.111],bigOpSpacing2:[.166,.166,.166],bigOpSpacing3:[.2,.2,.2],bigOpSpacing4:[.6,.611,.611],bigOpSpacing5:[.1,.143,.143],sqrtRuleThickness:[.04,.04,.04],ptPerEm:[10,10,10],doubleRuleSep:[.2,.2,.2],arrayRuleWidth:[.04,.04,.04],fboxsep:[.3,.3,.3],fboxrule:[.04,.04,.04]},xr={Å:"A",Ð:"D",Þ:"o",å:"a",ð:"d",þ:"o",А:"A",Б:"B",В:"B",Г:"F",Д:"A",Е:"E",Ж:"K",З:"3",И:"N",Й:"N",К:"K",Л:"N",М:"M",Н:"H",О:"O",П:"N",Р:"P",С:"C",Т:"T",У:"y",Ф:"O",Х:"X",Ц:"U",Ч:"h",Ш:"W",Щ:"W",Ъ:"B",Ы:"X",Ь:"B",Э:"3",Ю:"X",Я:"R",а:"a",б:"b",в:"a",г:"r",д:"y",е:"e",ж:"m",з:"e",и:"n",й:"n",к:"n",л:"n",м:"m",н:"n",о:"o",п:"n",р:"p",с:"c",т:"o",у:"y",ф:"b",х:"x",ц:"n",ч:"n",ш:"w",щ:"w",ъ:"a",ы:"m",ь:"a",э:"e",ю:"m",я:"r"};function hi(r,e){I0[r]=e}function _t(r,e,t){if(!I0[e])throw new Error("Font metrics not found for font: "+e+".");var a=r.charCodeAt(0),n=I0[e][a];if(!n&&r[0]in xr&&(a=xr[r[0]].charCodeAt(0),n=I0[e][a]),!n&&t==="text"&&ia(a)&&(n=I0[e][77]),n)return{depth:n[0],height:n[1],italic:n[2],skew:n[3],width:n[4]}}var nt={};function di(r){var e;if(r>=5?e=0:r>=3?e=1:e=2,!nt[e]){var t=nt[e]={cssEmPerMu:Re.quad[e]/18};for(var a in Re)Re.hasOwnProperty(a)&&(t[a]=Re[a][e])}return nt[e]}var K={math:{},text:{}};function i(r,e,t,a,n,s){K[r][n]={font:e,group:t,replace:a},s&&a&&(K[r][a]=K[r][n])}var l="math",z="text",c="main",f="ams",J="accent-token",q="bin",f0="close",ge="inner",H="mathord",s0="op-token",T0="open",Ae="punct",v="rel",G0="spacing",b="textord";i(l,c,v,"≡","\\equiv",!0);i(l,c,v,"≺","\\prec",!0);i(l,c,v,"≻","\\succ",!0);i(l,c,v,"∼","\\sim",!0);i(l,c,v,"⊥","\\perp");i(l,c,v,"⪯","\\preceq",!0);i(l,c,v,"⪰","\\succeq",!0);i(l,c,v,"≃","\\simeq",!0);i(l,c,v,"∣","\\mid",!0);i(l,c,v,"≪","\\ll",!0);i(l,c,v,"≫","\\gg",!0);i(l,c,v,"≍","\\asymp",!0);i(l,c,v,"∥","\\parallel");i(l,c,v,"⋈","\\bowtie",!0);i(l,c,v,"⌣","\\smile",!0);i(l,c,v,"⊑","\\sqsubseteq",!0);i(l,c,v,"⊒","\\sqsupseteq",!0);i(l,c,v,"≐","\\doteq",!0);i(l,c,v,"⌢","\\frown",!0);i(l,c,v,"∋","\\ni",!0);i(l,c,v,"∝","\\propto",!0);i(l,c,v,"⊢","\\vdash",!0);i(l,c,v,"⊣","\\dashv",!0);i(l,c,v,"∋","\\owns");i(l,c,Ae,".","\\ldotp");i(l,c,Ae,"⋅","\\cdotp");i(l,c,Ae,"⋅","·");i(z,c,b,"⋅","·");i(l,c,b,"#","\\#");i(z,c,b,"#","\\#");i(l,c,b,"&","\\&");i(z,c,b,"&","\\&");i(l,c,b,"ℵ","\\aleph",!0);i(l,c,b,"∀","\\forall",!0);i(l,c,b,"ℏ","\\hbar",!0);i(l,c,b,"∃","\\exists",!0);i(l,c,b,"∇","\\nabla",!0);i(l,c,b,"♭","\\flat",!0);i(l,c,b,"ℓ","\\ell",!0);i(l,c,b,"♮","\\natural",!0);i(l,c,b,"♣","\\clubsuit",!0);i(l,c,b,"℘","\\wp",!0);i(l,c,b,"♯","\\sharp",!0);i(l,c,b,"♢","\\diamondsuit",!0);i(l,c,b,"ℜ","\\Re",!0);i(l,c,b,"♡","\\heartsuit",!0);i(l,c,b,"ℑ","\\Im",!0);i(l,c,b,"♠","\\spadesuit",!0);i(l,c,b,"§","\\S",!0);i(z,c,b,"§","\\S");i(l,c,b,"¶","\\P",!0);i(z,c,b,"¶","\\P");i(l,c,b,"†","\\dag");i(z,c,b,"†","\\dag");i(z,c,b,"†","\\textdagger");i(l,c,b,"‡","\\ddag");i(z,c,b,"‡","\\ddag");i(z,c,b,"‡","\\textdaggerdbl");i(l,c,f0,"⎱","\\rmoustache",!0);i(l,c,T0,"⎰","\\lmoustache",!0);i(l,c,f0,"⟯","\\rgroup",!0);i(l,c,T0,"⟮","\\lgroup",!0);i(l,c,q,"∓","\\mp",!0);i(l,c,q,"⊖","\\ominus",!0);i(l,c,q,"⊎","\\uplus",!0);i(l,c,q,"⊓","\\sqcap",!0);i(l,c,q,"∗","\\ast");i(l,c,q,"⊔","\\sqcup",!0);i(l,c,q,"◯","\\bigcirc",!0);i(l,c,q,"∙","\\bullet",!0);i(l,c,q,"‡","\\ddagger");i(l,c,q,"≀","\\wr",!0);i(l,c,q,"⨿","\\amalg");i(l,c,q,"&","\\And");i(l,c,v,"⟵","\\longleftarrow",!0);i(l,c,v,"⇐","\\Leftarrow",!0);i(l,c,v,"⟸","\\Longleftarrow",!0);i(l,c,v,"⟶","\\longrightarrow",!0);i(l,c,v,"⇒","\\Rightarrow",!0);i(l,c,v,"⟹","\\Longrightarrow",!0);i(l,c,v,"↔","\\leftrightarrow",!0);i(l,c,v,"⟷","\\longleftrightarrow",!0);i(l,c,v,"⇔","\\Leftrightarrow",!0);i(l,c,v,"⟺","\\Longleftrightarrow",!0);i(l,c,v,"↦","\\mapsto",!0);i(l,c,v,"⟼","\\longmapsto",!0);i(l,c,v,"↗","\\nearrow",!0);i(l,c,v,"↩","\\hookleftarrow",!0);i(l,c,v,"↪","\\hookrightarrow",!0);i(l,c,v,"↘","\\searrow",!0);i(l,c,v,"↼","\\leftharpoonup",!0);i(l,c,v,"⇀","\\rightharpoonup",!0);i(l,c,v,"↙","\\swarrow",!0);i(l,c,v,"↽","\\leftharpoondown",!0);i(l,c,v,"⇁","\\rightharpoondown",!0);i(l,c,v,"↖","\\nwarrow",!0);i(l,c,v,"⇌","\\rightleftharpoons",!0);i(l,f,v,"≮","\\nless",!0);i(l,f,v,"","\\@nleqslant");i(l,f,v,"","\\@nleqq");i(l,f,v,"⪇","\\lneq",!0);i(l,f,v,"≨","\\lneqq",!0);i(l,f,v,"","\\@lvertneqq");i(l,f,v,"⋦","\\lnsim",!0);i(l,f,v,"⪉","\\lnapprox",!0);i(l,f,v,"⊀","\\nprec",!0);i(l,f,v,"⋠","\\npreceq",!0);i(l,f,v,"⋨","\\precnsim",!0);i(l,f,v,"⪹","\\precnapprox",!0);i(l,f,v,"≁","\\nsim",!0);i(l,f,v,"","\\@nshortmid");i(l,f,v,"∤","\\nmid",!0);i(l,f,v,"⊬","\\nvdash",!0);i(l,f,v,"⊭","\\nvDash",!0);i(l,f,v,"⋪","\\ntriangleleft");i(l,f,v,"⋬","\\ntrianglelefteq",!0);i(l,f,v,"⊊","\\subsetneq",!0);i(l,f,v,"","\\@varsubsetneq");i(l,f,v,"⫋","\\subsetneqq",!0);i(l,f,v,"","\\@varsubsetneqq");i(l,f,v,"≯","\\ngtr",!0);i(l,f,v,"","\\@ngeqslant");i(l,f,v,"","\\@ngeqq");i(l,f,v,"⪈","\\gneq",!0);i(l,f,v,"≩","\\gneqq",!0);i(l,f,v,"","\\@gvertneqq");i(l,f,v,"⋧","\\gnsim",!0);i(l,f,v,"⪊","\\gnapprox",!0);i(l,f,v,"⊁","\\nsucc",!0);i(l,f,v,"⋡","\\nsucceq",!0);i(l,f,v,"⋩","\\succnsim",!0);i(l,f,v,"⪺","\\succnapprox",!0);i(l,f,v,"≆","\\ncong",!0);i(l,f,v,"","\\@nshortparallel");i(l,f,v,"∦","\\nparallel",!0);i(l,f,v,"⊯","\\nVDash",!0);i(l,f,v,"⋫","\\ntriangleright");i(l,f,v,"⋭","\\ntrianglerighteq",!0);i(l,f,v,"","\\@nsupseteqq");i(l,f,v,"⊋","\\supsetneq",!0);i(l,f,v,"","\\@varsupsetneq");i(l,f,v,"⫌","\\supsetneqq",!0);i(l,f,v,"","\\@varsupsetneqq");i(l,f,v,"⊮","\\nVdash",!0);i(l,f,v,"⪵","\\precneqq",!0);i(l,f,v,"⪶","\\succneqq",!0);i(l,f,v,"","\\@nsubseteqq");i(l,f,q,"⊴","\\unlhd");i(l,f,q,"⊵","\\unrhd");i(l,f,v,"↚","\\nleftarrow",!0);i(l,f,v,"↛","\\nrightarrow",!0);i(l,f,v,"⇍","\\nLeftarrow",!0);i(l,f,v,"⇏","\\nRightarrow",!0);i(l,f,v,"↮","\\nleftrightarrow",!0);i(l,f,v,"⇎","\\nLeftrightarrow",!0);i(l,f,v,"△","\\vartriangle");i(l,f,b,"ℏ","\\hslash");i(l,f,b,"▽","\\triangledown");i(l,f,b,"◊","\\lozenge");i(l,f,b,"Ⓢ","\\circledS");i(l,f,b,"®","\\circledR");i(z,f,b,"®","\\circledR");i(l,f,b,"∡","\\measuredangle",!0);i(l,f,b,"∄","\\nexists");i(l,f,b,"℧","\\mho");i(l,f,b,"Ⅎ","\\Finv",!0);i(l,f,b,"⅁","\\Game",!0);i(l,f,b,"‵","\\backprime");i(l,f,b,"▲","\\blacktriangle");i(l,f,b,"▼","\\blacktriangledown");i(l,f,b,"■","\\blacksquare");i(l,f,b,"⧫","\\blacklozenge");i(l,f,b,"★","\\bigstar");i(l,f,b,"∢","\\sphericalangle",!0);i(l,f,b,"∁","\\complement",!0);i(l,f,b,"ð","\\eth",!0);i(z,c,b,"ð","ð");i(l,f,b,"╱","\\diagup");i(l,f,b,"╲","\\diagdown");i(l,f,b,"□","\\square");i(l,f,b,"□","\\Box");i(l,f,b,"◊","\\Diamond");i(l,f,b,"¥","\\yen",!0);i(z,f,b,"¥","\\yen",!0);i(l,f,b,"✓","\\checkmark",!0);i(z,f,b,"✓","\\checkmark");i(l,f,b,"ℶ","\\beth",!0);i(l,f,b,"ℸ","\\daleth",!0);i(l,f,b,"ℷ","\\gimel",!0);i(l,f,b,"ϝ","\\digamma",!0);i(l,f,b,"ϰ","\\varkappa");i(l,f,T0,"┌","\\@ulcorner",!0);i(l,f,f0,"┐","\\@urcorner",!0);i(l,f,T0,"└","\\@llcorner",!0);i(l,f,f0,"┘","\\@lrcorner",!0);i(l,f,v,"≦","\\leqq",!0);i(l,f,v,"⩽","\\leqslant",!0);i(l,f,v,"⪕","\\eqslantless",!0);i(l,f,v,"≲","\\lesssim",!0);i(l,f,v,"⪅","\\lessapprox",!0);i(l,f,v,"≊","\\approxeq",!0);i(l,f,q,"⋖","\\lessdot");i(l,f,v,"⋘","\\lll",!0);i(l,f,v,"≶","\\lessgtr",!0);i(l,f,v,"⋚","\\lesseqgtr",!0);i(l,f,v,"⪋","\\lesseqqgtr",!0);i(l,f,v,"≑","\\doteqdot");i(l,f,v,"≓","\\risingdotseq",!0);i(l,f,v,"≒","\\fallingdotseq",!0);i(l,f,v,"∽","\\backsim",!0);i(l,f,v,"⋍","\\backsimeq",!0);i(l,f,v,"⫅","\\subseteqq",!0);i(l,f,v,"⋐","\\Subset",!0);i(l,f,v,"⊏","\\sqsubset",!0);i(l,f,v,"≼","\\preccurlyeq",!0);i(l,f,v,"⋞","\\curlyeqprec",!0);i(l,f,v,"≾","\\precsim",!0);i(l,f,v,"⪷","\\precapprox",!0);i(l,f,v,"⊲","\\vartriangleleft");i(l,f,v,"⊴","\\trianglelefteq");i(l,f,v,"⊨","\\vDash",!0);i(l,f,v,"⊪","\\Vvdash",!0);i(l,f,v,"⌣","\\smallsmile");i(l,f,v,"⌢","\\smallfrown");i(l,f,v,"≏","\\bumpeq",!0);i(l,f,v,"≎","\\Bumpeq",!0);i(l,f,v,"≧","\\geqq",!0);i(l,f,v,"⩾","\\geqslant",!0);i(l,f,v,"⪖","\\eqslantgtr",!0);i(l,f,v,"≳","\\gtrsim",!0);i(l,f,v,"⪆","\\gtrapprox",!0);i(l,f,q,"⋗","\\gtrdot");i(l,f,v,"⋙","\\ggg",!0);i(l,f,v,"≷","\\gtrless",!0);i(l,f,v,"⋛","\\gtreqless",!0);i(l,f,v,"⪌","\\gtreqqless",!0);i(l,f,v,"≖","\\eqcirc",!0);i(l,f,v,"≗","\\circeq",!0);i(l,f,v,"≜","\\triangleq",!0);i(l,f,v,"∼","\\thicksim");i(l,f,v,"≈","\\thickapprox");i(l,f,v,"⫆","\\supseteqq",!0);i(l,f,v,"⋑","\\Supset",!0);i(l,f,v,"⊐","\\sqsupset",!0);i(l,f,v,"≽","\\succcurlyeq",!0);i(l,f,v,"⋟","\\curlyeqsucc",!0);i(l,f,v,"≿","\\succsim",!0);i(l,f,v,"⪸","\\succapprox",!0);i(l,f,v,"⊳","\\vartriangleright");i(l,f,v,"⊵","\\trianglerighteq");i(l,f,v,"⊩","\\Vdash",!0);i(l,f,v,"∣","\\shortmid");i(l,f,v,"∥","\\shortparallel");i(l,f,v,"≬","\\between",!0);i(l,f,v,"⋔","\\pitchfork",!0);i(l,f,v,"∝","\\varpropto");i(l,f,v,"◀","\\blacktriangleleft");i(l,f,v,"∴","\\therefore",!0);i(l,f,v,"∍","\\backepsilon");i(l,f,v,"▶","\\blacktriangleright");i(l,f,v,"∵","\\because",!0);i(l,f,v,"⋘","\\llless");i(l,f,v,"⋙","\\gggtr");i(l,f,q,"⊲","\\lhd");i(l,f,q,"⊳","\\rhd");i(l,f,v,"≂","\\eqsim",!0);i(l,c,v,"⋈","\\Join");i(l,f,v,"≑","\\Doteq",!0);i(l,f,q,"∔","\\dotplus",!0);i(l,f,q,"∖","\\smallsetminus");i(l,f,q,"⋒","\\Cap",!0);i(l,f,q,"⋓","\\Cup",!0);i(l,f,q,"⩞","\\doublebarwedge",!0);i(l,f,q,"⊟","\\boxminus",!0);i(l,f,q,"⊞","\\boxplus",!0);i(l,f,q,"⋇","\\divideontimes",!0);i(l,f,q,"⋉","\\ltimes",!0);i(l,f,q,"⋊","\\rtimes",!0);i(l,f,q,"⋋","\\leftthreetimes",!0);i(l,f,q,"⋌","\\rightthreetimes",!0);i(l,f,q,"⋏","\\curlywedge",!0);i(l,f,q,"⋎","\\curlyvee",!0);i(l,f,q,"⊝","\\circleddash",!0);i(l,f,q,"⊛","\\circledast",!0);i(l,f,q,"⋅","\\centerdot");i(l,f,q,"⊺","\\intercal",!0);i(l,f,q,"⋒","\\doublecap");i(l,f,q,"⋓","\\doublecup");i(l,f,q,"⊠","\\boxtimes",!0);i(l,f,v,"⇢","\\dashrightarrow",!0);i(l,f,v,"⇠","\\dashleftarrow",!0);i(l,f,v,"⇇","\\leftleftarrows",!0);i(l,f,v,"⇆","\\leftrightarrows",!0);i(l,f,v,"⇚","\\Lleftarrow",!0);i(l,f,v,"↞","\\twoheadleftarrow",!0);i(l,f,v,"↢","\\leftarrowtail",!0);i(l,f,v,"↫","\\looparrowleft",!0);i(l,f,v,"⇋","\\leftrightharpoons",!0);i(l,f,v,"↶","\\curvearrowleft",!0);i(l,f,v,"↺","\\circlearrowleft",!0);i(l,f,v,"↰","\\Lsh",!0);i(l,f,v,"⇈","\\upuparrows",!0);i(l,f,v,"↿","\\upharpoonleft",!0);i(l,f,v,"⇃","\\downharpoonleft",!0);i(l,c,v,"⊶","\\origof",!0);i(l,c,v,"⊷","\\imageof",!0);i(l,f,v,"⊸","\\multimap",!0);i(l,f,v,"↭","\\leftrightsquigarrow",!0);i(l,f,v,"⇉","\\rightrightarrows",!0);i(l,f,v,"⇄","\\rightleftarrows",!0);i(l,f,v,"↠","\\twoheadrightarrow",!0);i(l,f,v,"↣","\\rightarrowtail",!0);i(l,f,v,"↬","\\looparrowright",!0);i(l,f,v,"↷","\\curvearrowright",!0);i(l,f,v,"↻","\\circlearrowright",!0);i(l,f,v,"↱","\\Rsh",!0);i(l,f,v,"⇊","\\downdownarrows",!0);i(l,f,v,"↾","\\upharpoonright",!0);i(l,f,v,"⇂","\\downharpoonright",!0);i(l,f,v,"⇝","\\rightsquigarrow",!0);i(l,f,v,"⇝","\\leadsto");i(l,f,v,"⇛","\\Rrightarrow",!0);i(l,f,v,"↾","\\restriction");i(l,c,b,"‘","`");i(l,c,b,"$","\\$");i(z,c,b,"$","\\$");i(z,c,b,"$","\\textdollar");i(l,c,b,"%","\\%");i(z,c,b,"%","\\%");i(l,c,b,"_","\\_");i(z,c,b,"_","\\_");i(z,c,b,"_","\\textunderscore");i(l,c,b,"∠","\\angle",!0);i(l,c,b,"∞","\\infty",!0);i(l,c,b,"′","\\prime");i(l,c,b,"△","\\triangle");i(l,c,b,"Γ","\\Gamma",!0);i(l,c,b,"Δ","\\Delta",!0);i(l,c,b,"Θ","\\Theta",!0);i(l,c,b,"Λ","\\Lambda",!0);i(l,c,b,"Ξ","\\Xi",!0);i(l,c,b,"Π","\\Pi",!0);i(l,c,b,"Σ","\\Sigma",!0);i(l,c,b,"Υ","\\Upsilon",!0);i(l,c,b,"Φ","\\Phi",!0);i(l,c,b,"Ψ","\\Psi",!0);i(l,c,b,"Ω","\\Omega",!0);i(l,c,b,"A","Α");i(l,c,b,"B","Β");i(l,c,b,"E","Ε");i(l,c,b,"Z","Ζ");i(l,c,b,"H","Η");i(l,c,b,"I","Ι");i(l,c,b,"K","Κ");i(l,c,b,"M","Μ");i(l,c,b,"N","Ν");i(l,c,b,"O","Ο");i(l,c,b,"P","Ρ");i(l,c,b,"T","Τ");i(l,c,b,"X","Χ");i(l,c,b,"¬","\\neg",!0);i(l,c,b,"¬","\\lnot");i(l,c,b,"⊤","\\top");i(l,c,b,"⊥","\\bot");i(l,c,b,"∅","\\emptyset");i(l,f,b,"∅","\\varnothing");i(l,c,H,"α","\\alpha",!0);i(l,c,H,"β","\\beta",!0);i(l,c,H,"γ","\\gamma",!0);i(l,c,H,"δ","\\delta",!0);i(l,c,H,"ϵ","\\epsilon",!0);i(l,c,H,"ζ","\\zeta",!0);i(l,c,H,"η","\\eta",!0);i(l,c,H,"θ","\\theta",!0);i(l,c,H,"ι","\\iota",!0);i(l,c,H,"κ","\\kappa",!0);i(l,c,H,"λ","\\lambda",!0);i(l,c,H,"μ","\\mu",!0);i(l,c,H,"ν","\\nu",!0);i(l,c,H,"ξ","\\xi",!0);i(l,c,H,"ο","\\omicron",!0);i(l,c,H,"π","\\pi",!0);i(l,c,H,"ρ","\\rho",!0);i(l,c,H,"σ","\\sigma",!0);i(l,c,H,"τ","\\tau",!0);i(l,c,H,"υ","\\upsilon",!0);i(l,c,H,"ϕ","\\phi",!0);i(l,c,H,"χ","\\chi",!0);i(l,c,H,"ψ","\\psi",!0);i(l,c,H,"ω","\\omega",!0);i(l,c,H,"ε","\\varepsilon",!0);i(l,c,H,"ϑ","\\vartheta",!0);i(l,c,H,"ϖ","\\varpi",!0);i(l,c,H,"ϱ","\\varrho",!0);i(l,c,H,"ς","\\varsigma",!0);i(l,c,H,"φ","\\varphi",!0);i(l,c,q,"∗","*",!0);i(l,c,q,"+","+");i(l,c,q,"−","-",!0);i(l,c,q,"⋅","\\cdot",!0);i(l,c,q,"∘","\\circ",!0);i(l,c,q,"÷","\\div",!0);i(l,c,q,"±","\\pm",!0);i(l,c,q,"×","\\times",!0);i(l,c,q,"∩","\\cap",!0);i(l,c,q,"∪","\\cup",!0);i(l,c,q,"∖","\\setminus",!0);i(l,c,q,"∧","\\land");i(l,c,q,"∨","\\lor");i(l,c,q,"∧","\\wedge",!0);i(l,c,q,"∨","\\vee",!0);i(l,c,b,"√","\\surd");i(l,c,T0,"⟨","\\langle",!0);i(l,c,T0,"∣","\\lvert");i(l,c,T0,"∥","\\lVert");i(l,c,f0,"?","?");i(l,c,f0,"!","!");i(l,c,f0,"⟩","\\rangle",!0);i(l,c,f0,"∣","\\rvert");i(l,c,f0,"∥","\\rVert");i(l,c,v,"=","=");i(l,c,v,":",":");i(l,c,v,"≈","\\approx",!0);i(l,c,v,"≅","\\cong",!0);i(l,c,v,"≥","\\ge");i(l,c,v,"≥","\\geq",!0);i(l,c,v,"←","\\gets");i(l,c,v,">","\\gt",!0);i(l,c,v,"∈","\\in",!0);i(l,c,v,"","\\@not");i(l,c,v,"⊂","\\subset",!0);i(l,c,v,"⊃","\\supset",!0);i(l,c,v,"⊆","\\subseteq",!0);i(l,c,v,"⊇","\\supseteq",!0);i(l,f,v,"⊈","\\nsubseteq",!0);i(l,f,v,"⊉","\\nsupseteq",!0);i(l,c,v,"⊨","\\models");i(l,c,v,"←","\\leftarrow",!0);i(l,c,v,"≤","\\le");i(l,c,v,"≤","\\leq",!0);i(l,c,v,"<","\\lt",!0);i(l,c,v,"→","\\rightarrow",!0);i(l,c,v,"→","\\to");i(l,f,v,"≱","\\ngeq",!0);i(l,f,v,"≰","\\nleq",!0);i(l,c,G0," ","\\ ");i(l,c,G0," ","\\space");i(l,c,G0," ","\\nobreakspace");i(z,c,G0," ","\\ ");i(z,c,G0," "," ");i(z,c,G0," ","\\space");i(z,c,G0," ","\\nobreakspace");i(l,c,G0,"","\\nobreak");i(l,c,G0,"","\\allowbreak");i(l,c,Ae,",",",");i(l,c,Ae,";",";");i(l,f,q,"⊼","\\barwedge",!0);i(l,f,q,"⊻","\\veebar",!0);i(l,c,q,"⊙","\\odot",!0);i(l,c,q,"⊕","\\oplus",!0);i(l,c,q,"⊗","\\otimes",!0);i(l,c,b,"∂","\\partial",!0);i(l,c,q,"⊘","\\oslash",!0);i(l,f,q,"⊚","\\circledcirc",!0);i(l,f,q,"⊡","\\boxdot",!0);i(l,c,q,"△","\\bigtriangleup");i(l,c,q,"▽","\\bigtriangledown");i(l,c,q,"†","\\dagger");i(l,c,q,"⋄","\\diamond");i(l,c,q,"⋆","\\star");i(l,c,q,"◃","\\triangleleft");i(l,c,q,"▹","\\triangleright");i(l,c,T0,"{","\\{");i(z,c,b,"{","\\{");i(z,c,b,"{","\\textbraceleft");i(l,c,f0,"}","\\}");i(z,c,b,"}","\\}");i(z,c,b,"}","\\textbraceright");i(l,c,T0,"{","\\lbrace");i(l,c,f0,"}","\\rbrace");i(l,c,T0,"[","\\lbrack",!0);i(z,c,b,"[","\\lbrack",!0);i(l,c,f0,"]","\\rbrack",!0);i(z,c,b,"]","\\rbrack",!0);i(l,c,T0,"(","\\lparen",!0);i(l,c,f0,")","\\rparen",!0);i(z,c,b,"<","\\textless",!0);i(z,c,b,">","\\textgreater",!0);i(l,c,T0,"⌊","\\lfloor",!0);i(l,c,f0,"⌋","\\rfloor",!0);i(l,c,T0,"⌈","\\lceil",!0);i(l,c,f0,"⌉","\\rceil",!0);i(l,c,b,"\\","\\backslash");i(l,c,b,"∣","|");i(l,c,b,"∣","\\vert");i(z,c,b,"|","\\textbar",!0);i(l,c,b,"∥","\\|");i(l,c,b,"∥","\\Vert");i(z,c,b,"∥","\\textbardbl");i(z,c,b,"~","\\textasciitilde");i(z,c,b,"\\","\\textbackslash");i(z,c,b,"^","\\textasciicircum");i(l,c,v,"↑","\\uparrow",!0);i(l,c,v,"⇑","\\Uparrow",!0);i(l,c,v,"↓","\\downarrow",!0);i(l,c,v,"⇓","\\Downarrow",!0);i(l,c,v,"↕","\\updownarrow",!0);i(l,c,v,"⇕","\\Updownarrow",!0);i(l,c,s0,"∐","\\coprod");i(l,c,s0,"⋁","\\bigvee");i(l,c,s0,"⋀","\\bigwedge");i(l,c,s0,"⨄","\\biguplus");i(l,c,s0,"⋂","\\bigcap");i(l,c,s0,"⋃","\\bigcup");i(l,c,s0,"∫","\\int");i(l,c,s0,"∫","\\intop");i(l,c,s0,"∬","\\iint");i(l,c,s0,"∭","\\iiint");i(l,c,s0,"∏","\\prod");i(l,c,s0,"∑","\\sum");i(l,c,s0,"⨂","\\bigotimes");i(l,c,s0,"⨁","\\bigoplus");i(l,c,s0,"⨀","\\bigodot");i(l,c,s0,"∮","\\oint");i(l,c,s0,"∯","\\oiint");i(l,c,s0,"∰","\\oiiint");i(l,c,s0,"⨆","\\bigsqcup");i(l,c,s0,"∫","\\smallint");i(z,c,ge,"…","\\textellipsis");i(l,c,ge,"…","\\mathellipsis");i(z,c,ge,"…","\\ldots",!0);i(l,c,ge,"…","\\ldots",!0);i(l,c,ge,"⋯","\\@cdots",!0);i(l,c,ge,"⋱","\\ddots",!0);i(l,c,b,"⋮","\\varvdots");i(z,c,b,"⋮","\\varvdots");i(l,c,J,"ˊ","\\acute");i(l,c,J,"ˋ","\\grave");i(l,c,J,"¨","\\ddot");i(l,c,J,"~","\\tilde");i(l,c,J,"ˉ","\\bar");i(l,c,J,"˘","\\breve");i(l,c,J,"ˇ","\\check");i(l,c,J,"^","\\hat");i(l,c,J,"⃗","\\vec");i(l,c,J,"˙","\\dot");i(l,c,J,"˚","\\mathring");i(l,c,H,"","\\@imath");i(l,c,H,"","\\@jmath");i(l,c,b,"ı","ı");i(l,c,b,"ȷ","ȷ");i(z,c,b,"ı","\\i",!0);i(z,c,b,"ȷ","\\j",!0);i(z,c,b,"ß","\\ss",!0);i(z,c,b,"æ","\\ae",!0);i(z,c,b,"œ","\\oe",!0);i(z,c,b,"ø","\\o",!0);i(z,c,b,"Æ","\\AE",!0);i(z,c,b,"Œ","\\OE",!0);i(z,c,b,"Ø","\\O",!0);i(z,c,J,"ˊ","\\'");i(z,c,J,"ˋ","\\`");i(z,c,J,"ˆ","\\^");i(z,c,J,"˜","\\~");i(z,c,J,"ˉ","\\=");i(z,c,J,"˘","\\u");i(z,c,J,"˙","\\.");i(z,c,J,"¸","\\c");i(z,c,J,"˚","\\r");i(z,c,J,"ˇ","\\v");i(z,c,J,"¨",'\\"');i(z,c,J,"˝","\\H");i(z,c,J,"◯","\\textcircled");var ca={"--":!0,"---":!0,"``":!0,"''":!0};i(z,c,b,"–","--",!0);i(z,c,b,"–","\\textendash");i(z,c,b,"—","---",!0);i(z,c,b,"—","\\textemdash");i(z,c,b,"‘","`",!0);i(z,c,b,"‘","\\textquoteleft");i(z,c,b,"’","'",!0);i(z,c,b,"’","\\textquoteright");i(z,c,b,"“","``",!0);i(z,c,b,"“","\\textquotedblleft");i(z,c,b,"”","''",!0);i(z,c,b,"”","\\textquotedblright");i(l,c,b,"°","\\degree",!0);i(z,c,b,"°","\\degree");i(z,c,b,"°","\\textdegree",!0);i(l,c,b,"£","\\pounds");i(l,c,b,"£","\\mathsterling",!0);i(z,c,b,"£","\\pounds");i(z,c,b,"£","\\textsterling",!0);i(l,f,b,"✠","\\maltese");i(z,f,b,"✠","\\maltese");var wr='0123456789/@."';for(var it=0;it{var e=r.charCodeAt(0),t=r.charCodeAt(1),a=(e-55296)*1024+(t-56320)+65536;if(119808<=a&&a<120484){var n=Math.floor((a-119808)/26);return Fr[n]}else if(120782<=a&&a<=120831){var s=Math.floor((a-120782)/10);return pi[s]}else{if(a===120485||a===120486)return Fr[0];if(120486{if(K0(r.classes)!==K0(e.classes)||r.skew!==e.skew||r.maxFontSize!==e.maxFontSize||r.italic!==0&&r.hasClass("mathnormal"))return!1;if(r.classes.length===1){var t=r.classes[0];if(t==="mbin"||t==="mord")return!1}for(var a of Object.keys(r.style))if(r.style[a]!==e.style[a])return!1;for(var n of Object.keys(e.style))if(r.style[n]!==e.style[n])return!1;return!0},ha=r=>{for(var e=0;et&&(t=o.height),o.depth>a&&(a=o.depth),o.maxFontSize>n&&(n=o.maxFontSize)}e.height=t,e.depth=a,e.maxFontSize=n},C=function(e,t,a,n){var s=new ve(e,t,a,n);return Ut(s),s},Q0=(r,e,t,a)=>new ve(r,e,t,a),me=function(e,t,a){var n=C([e],[],t);return n.height=Math.max(a||t.fontMetrics().defaultRuleThickness,t.minRuleThickness),n.style.borderBottomWidth=N(n.height),n.maxFontSize=1,n},bi=function(e,t,a,n){var s=new je(e,t,a,n);return Ut(s),s},U0=function(e){var t=new fe(e);return Ut(t),t},pe=function(e,t){return e instanceof fe?C([],[e],t):e},yi=function(e){if(e.positionType==="individualShift"){for(var t=e.children,a=[t[0]],n=-t[0].shift-t[0].elem.depth,s=n,o=1;o{var t=C(["mspace"],[],e),a=t0(r,e);return t.style.marginRight=N(a),t},De=(r,e,t)=>{var a,n;switch(r){case"amsrm":a="AMS";break;case"textrm":a="Main";break;case"textsf":a="SansSerif";break;case"texttt":a="Typewriter";break;default:a=r}return e==="textbf"&&t==="textit"?n="BoldItalic":e==="textbf"?n="Bold":t==="textit"?n="Italic":n="Regular",a+"-"+n},Ct={mathbf:{variant:"bold",fontName:"Main-Bold"},mathrm:{variant:"normal",fontName:"Main-Regular"},textit:{variant:"italic",fontName:"Main-Italic"},mathit:{variant:"italic",fontName:"Main-Italic"},mathnormal:{variant:"italic",fontName:"Math-Italic"},mathsfit:{variant:"sans-serif-italic",fontName:"SansSerif-Italic"},mathbb:{variant:"double-struck",fontName:"AMS-Regular"},mathcal:{variant:"script",fontName:"Caligraphic-Regular"},mathfrak:{variant:"fraktur",fontName:"Fraktur-Regular"},mathscr:{variant:"script",fontName:"Script-Regular"},mathsf:{variant:"sans-serif",fontName:"SansSerif-Regular"},mathtt:{variant:"monospace",fontName:"Typewriter-Regular"}},ma={vec:["vec",.471,.714],oiintSize1:["oiintSize1",.957,.499],oiintSize2:["oiintSize2",1.472,.659],oiiintSize1:["oiiintSize1",1.304,.499],oiiintSize2:["oiiintSize2",1.98,.659]},pa=function(e,t){var[a,n,s]=ma[e],o=new J0(a),u=new $0([o],{width:N(n),height:N(s),style:"width:"+N(n),viewBox:"0 0 "+1e3*n+" "+1e3*s,preserveAspectRatio:"xMinYMin"}),h=Q0(["overlay"],[u],t);return h.height=s,h.style.height=N(s),h.style.width=N(n),h},e0={number:3,unit:"mu"},ne={number:4,unit:"mu"},q0={number:5,unit:"mu"},xi={mord:{mop:e0,mbin:ne,mrel:q0,minner:e0},mop:{mord:e0,mop:e0,mrel:q0,minner:e0},mbin:{mord:ne,mop:ne,mopen:ne,minner:ne},mrel:{mord:q0,mop:q0,mopen:q0,minner:q0},mopen:{},mclose:{mop:e0,mbin:ne,mrel:q0,minner:e0},mpunct:{mord:e0,mop:e0,mrel:q0,mopen:e0,mclose:e0,mpunct:e0,minner:e0},minner:{mord:e0,mop:e0,mbin:ne,mrel:q0,mopen:e0,mpunct:e0,minner:e0}},wi={mord:{mop:e0},mop:{mord:e0,mop:e0},mbin:{},mrel:{},mopen:{},mclose:{mop:e0},mpunct:{},minner:{mop:e0}},fa={},we={},Se={};function L(r){for(var{type:e,names:t,htmlBuilder:a,mathmlBuilder:n}=r,s=0;s{var M=E.classes[0],R=D.classes[0];M==="mbin"&&ki.has(R)?E.classes[0]="mord":R==="mbin"&&Si.has(M)&&(D.classes[0]="mord")},{node:g},S,x),Rt(s,(D,E)=>{var M,R,y=It(E),w=It(D),k=y&&w?D.hasClass("mtight")?(M=wi[y])==null?void 0:M[w]:(R=xi[y])==null?void 0:R[w]:null;if(k)return da(k,m)},{node:g},S,x),s},Rt=function(e,t,a,n,s){n&&e.push(n);for(var o=0;oS=>{e.splice(g+1,0,S),o++})(o)}n&&e.pop()},va=function(e){return e instanceof fe||e instanceof je||e instanceof ve&&e.hasClass("enclosing")?e:null},Ft=function(e,t){var a=va(e);if(a){var n=a.children;if(n.length){if(t==="right")return Ft(n[n.length-1],"right");if(t==="left")return Ft(n[0],"left")}}return e},It=function(e,t){if(!e)return null;t&&(e=Ft(e,t));var a=e.classes[0];return Ti[a]||null},ke=function(e,t){var a=["nulldelimiter"].concat(e.baseSizingClasses());return C(t.concat(a))},V=function(e,t,a){if(!e)return C();if(we[e.type]){var n=we[e.type](e,t);if(a&&t.size!==a.size){n=C(t.sizingClasses(a),[n],t);var s=t.sizeMultiplier/a.sizeMultiplier;n.height*=s,n.depth*=s}return n}else throw new F("Got group of unknown type: '"+e.type+"'")};function Ne(r,e){var t=C(["base"],r,e),a=C(["strut"]);return a.style.height=N(t.height+t.depth),t.depth&&(a.style.verticalAlign=N(-t.depth)),t.children.unshift(a),t}function Dt(r,e){var t=null;r.length===1&&r[0].type==="tag"&&(t=r[0].tag,r=r[0].body);var a=o0(r,e,"root"),n;a.length===2&&a[1].hasClass("tag")&&(n=a.pop());for(var s=[],o=[],u=0;u0&&(s.push(Ne(o,e)),o=[]),s.push(a[u]));o.length>0&&s.push(Ne(o,e));var m;t?(m=Ne(o0(t,e,!0),e),m.classes=["tag"],s.push(m)):n&&s.push(n);var p=C(["katex-html"],s);if(p.setAttribute("aria-hidden","true"),m){var g=m.children[0];g.style.height=N(p.height+p.depth),p.depth&&(g.style.verticalAlign=N(-p.depth))}return p}function ga(r){return new fe(r)}class I{constructor(e,t,a){this.type=void 0,this.attributes=void 0,this.children=void 0,this.classes=void 0,this.type=e,this.attributes={},this.children=t||[],this.classes=a||[]}setAttribute(e,t){this.attributes[e]=t}getAttribute(e){return this.attributes[e]}toNode(){var e=document.createElementNS("http://www.w3.org/1998/Math/MathML",this.type);for(var t in this.attributes)Object.prototype.hasOwnProperty.call(this.attributes,t)&&e.setAttribute(t,this.attributes[t]);this.classes.length>0&&(e.className=K0(this.classes));for(var a=0;a0&&(e+=' class ="'+c0(K0(this.classes))+'"'),e+=">";for(var a=0;a",e}toText(){return this.children.map(e=>e.toText()).join("")}}class i0{constructor(e){this.text=void 0,this.text=e}toNode(){return document.createTextNode(this.text)}toMarkup(){return c0(this.toText())}toText(){return this.text}}class ba{constructor(e){this.width=void 0,this.character=void 0,this.width=e,e>=.05555&&e<=.05556?this.character=" ":e>=.1666&&e<=.1667?this.character=" ":e>=.2222&&e<=.2223?this.character=" ":e>=.2777&&e<=.2778?this.character="  ":e>=-.05556&&e<=-.05555?this.character=" ⁣":e>=-.1667&&e<=-.1666?this.character=" ⁣":e>=-.2223&&e<=-.2222?this.character=" ⁣":e>=-.2778&&e<=-.2777?this.character=" ⁣":this.character=null}toNode(){if(this.character)return document.createTextNode(this.character);var e=document.createElementNS("http://www.w3.org/1998/Math/MathML","mspace");return e.setAttribute("width",N(this.width)),e}toMarkup(){return this.character?""+this.character+"":''}toText(){return this.character?this.character:" "}}var Ei=new Set(["\\imath","\\jmath"]),Mi=new Set(["mrow","mtable"]),z0=function(e,t,a){return K[t][e]&&K[t][e].replace&&e.charCodeAt(0)!==55349&&!(ca.hasOwnProperty(e)&&a&&(a.fontFamily&&a.fontFamily.slice(4,6)==="tt"||a.font&&a.font.slice(4,6)==="tt"))&&(e=K[t][e].replace),new i0(e)},jt=function(e){return e.length===1?e[0]:new I("mrow",e)},zi={mathit:"italic",boldsymbol:r=>r.type==="textord"?"bold":"bold-italic",mathbf:"bold",mathbb:"double-struck",mathsfit:"sans-serif-italic",mathfrak:"fraktur",mathscr:"script",mathcal:"script",mathsf:"sans-serif",mathtt:"monospace"},Xt=(r,e)=>{if(r.mode==="text"){if(e.fontFamily==="texttt")return"monospace";if(e.fontFamily==="textsf")return e.fontShape==="textit"&&e.fontWeight==="textbf"?"sans-serif-bold-italic":e.fontShape==="textit"?"sans-serif-italic":e.fontWeight==="textbf"?"bold-sans-serif":"sans-serif";if(e.fontShape==="textit"&&e.fontWeight==="textbf")return"bold-italic";if(e.fontShape==="textit")return"italic";if(e.fontWeight==="textbf")return"bold"}var t=e.font;if(!t||t==="mathnormal")return null;var a=r.mode,n=zi[t];if(n)return typeof n=="function"?n(r):n;var s=r.text;if(Ei.has(s))return null;if(K[a][s]){var o=K[a][s].replace;o&&(s=o)}var u=Ct[t].fontName;return _t(s,u,a)?Ct[t].variant:null};function ut(r){if(!r)return!1;if(r.type==="mi"&&r.children.length===1){var e=r.children[0];return e instanceof i0&&e.text==="."}else if(r.type==="mo"&&r.children.length===1&&r.getAttribute("separator")==="true"&&r.getAttribute("lspace")==="0em"&&r.getAttribute("rspace")==="0em"){var t=r.children[0];return t instanceof i0&&t.text===","}else return!1}var E0=function(e,t,a){if(e.length===1){var n=Z(e[0],t);return a&&n instanceof I&&n.type==="mo"&&(n.setAttribute("lspace","0em"),n.setAttribute("rspace","0em")),[n]}for(var s=[],o,u=0;u=1&&(o.type==="mn"||ut(o))){var m=h.children[0];m instanceof I&&m.type==="mn"&&(m.children=[...o.children,...m.children],s.pop())}else if(o.type==="mi"&&o.children.length===1){var p=o.children[0];if(p instanceof i0&&p.text==="̸"&&(h.type==="mo"||h.type==="mi"||h.type==="mn")){var g=h.children[0];g instanceof i0&&g.text.length>0&&(g.text=g.text.slice(0,1)+"̸"+g.text.slice(1),s.pop())}}}s.push(h),o=h}return s},ee=function(e,t,a){return jt(E0(e,t,a))},Z=function(e,t){if(!e)return new I("mrow");if(Se[e.type])return Se[e.type](e,t);throw new F("Got group of unknown type: '"+e.type+"'")};function Ir(r,e,t,a,n){var s=E0(r,t),o;s.length===1&&s[0]instanceof I&&Mi.has(s[0].type)?o=s[0]:o=new I("mrow",s);var u=new I("annotation",[new i0(e)]);u.setAttribute("encoding","application/x-tex");var h=new I("semantics",[o,u]),m=new I("math",[h]);m.setAttribute("xmlns","http://www.w3.org/1998/Math/MathML"),a&&m.setAttribute("display","block");var p=n?"katex":"katex-mathml";return C([p],[m])}var Ci=[[1,1,1],[2,1,1],[3,1,1],[4,2,1],[5,2,1],[6,3,1],[7,4,2],[8,6,3],[9,7,6],[10,8,7],[11,10,9]],Dr=[.5,.6,.7,.8,.9,1,1.2,1.44,1.728,2.074,2.488],Nr=function(e,t){return t.size<2?e:Ci[e-1][t.size-1]};class P0{constructor(e){this.style=void 0,this.color=void 0,this.size=void 0,this.textSize=void 0,this.phantom=void 0,this.font=void 0,this.fontFamily=void 0,this.fontWeight=void 0,this.fontShape=void 0,this.sizeMultiplier=void 0,this.maxSize=void 0,this.minRuleThickness=void 0,this._fontMetrics=void 0,this.style=e.style,this.color=e.color,this.size=e.size||P0.BASESIZE,this.textSize=e.textSize||this.size,this.phantom=!!e.phantom,this.font=e.font||"",this.fontFamily=e.fontFamily||"",this.fontWeight=e.fontWeight||"",this.fontShape=e.fontShape||"",this.sizeMultiplier=Dr[this.size-1],this.maxSize=e.maxSize,this.minRuleThickness=e.minRuleThickness,this._fontMetrics=void 0}extend(e){var t={style:this.style,size:this.size,textSize:this.textSize,color:this.color,phantom:this.phantom,font:this.font,fontFamily:this.fontFamily,fontWeight:this.fontWeight,fontShape:this.fontShape,maxSize:this.maxSize,minRuleThickness:this.minRuleThickness};return Object.assign(t,e),new P0(t)}havingStyle(e){return this.style===e?this:this.extend({style:e,size:Nr(this.textSize,e)})}havingCrampedStyle(){return this.havingStyle(this.style.cramp())}havingSize(e){return this.size===e&&this.textSize===e?this:this.extend({style:this.style.text(),size:e,textSize:e,sizeMultiplier:Dr[e-1]})}havingBaseStyle(e){e=e||this.style.text();var t=Nr(P0.BASESIZE,e);return this.size===t&&this.textSize===P0.BASESIZE&&this.style===e?this:this.extend({style:e,size:t})}havingBaseSizing(){var e;switch(this.style.id){case 4:case 5:e=3;break;case 6:case 7:e=1;break;default:e=6}return this.extend({style:this.style.text(),size:e})}withColor(e){return this.extend({color:e})}withPhantom(){return this.extend({phantom:!0})}withFont(e){return this.extend({font:e})}withTextFontFamily(e){return this.extend({fontFamily:e,font:""})}withTextFontWeight(e){return this.extend({fontWeight:e,font:""})}withTextFontShape(e){return this.extend({fontShape:e,font:""})}sizingClasses(e){return e.size!==this.size?["sizing","reset-size"+e.size,"size"+this.size]:[]}baseSizingClasses(){return this.size!==P0.BASESIZE?["sizing","reset-size"+this.size,"size"+P0.BASESIZE]:[]}fontMetrics(){return this._fontMetrics||(this._fontMetrics=di(this.size)),this._fontMetrics}getColor(){return this.phantom?"transparent":this.color}}P0.BASESIZE=6;var ya=function(e){return new P0({style:e.displayMode?_.DISPLAY:_.TEXT,maxSize:e.maxSize,minRuleThickness:e.minRuleThickness})},xa=function(e,t){if(t.displayMode){var a=["katex-display"];t.leqno&&a.push("leqno"),t.fleqn&&a.push("fleqn"),e=C(a,[e])}return e},Ri=function(e,t,a){var n=ya(a),s;if(a.output==="mathml")return Ir(e,t,n,a.displayMode,!0);if(a.output==="html"){var o=Dt(e,n);s=C(["katex"],[o])}else{var u=Ir(e,t,n,a.displayMode,!1),h=Dt(e,n);s=C(["katex"],[u,h])}return xa(s,a)},Fi=function(e,t,a){var n=ya(a),s=Dt(e,n),o=C(["katex"],[s]);return xa(o,a)},Ii={widehat:"^",widecheck:"ˇ",widetilde:"~",utilde:"~",overleftarrow:"←",underleftarrow:"←",xleftarrow:"←",overrightarrow:"→",underrightarrow:"→",xrightarrow:"→",underbrace:"⏟",overbrace:"⏞",underbracket:"⎵",overbracket:"⎴",overgroup:"⏠",undergroup:"⏡",overleftrightarrow:"↔",underleftrightarrow:"↔",xleftrightarrow:"↔",Overrightarrow:"⇒",xRightarrow:"⇒",overleftharpoon:"↼",xleftharpoonup:"↼",overrightharpoon:"⇀",xrightharpoonup:"⇀",xLeftarrow:"⇐",xLeftrightarrow:"⇔",xhookleftarrow:"↩",xhookrightarrow:"↪",xmapsto:"↦",xrightharpoondown:"⇁",xleftharpoondown:"↽",xrightleftharpoons:"⇌",xleftrightharpoons:"⇋",xtwoheadleftarrow:"↞",xtwoheadrightarrow:"↠",xlongequal:"=",xtofrom:"⇄",xrightleftarrows:"⇄",xrightequilibrium:"⇌",xleftequilibrium:"⇋","\\cdrightarrow":"→","\\cdleftarrow":"←","\\cdlongequal":"="},We=function(e){var t=new I("mo",[new i0(Ii[e.replace(/^\\/,"")])]);return t.setAttribute("stretchy","true"),t},Di={overrightarrow:[["rightarrow"],.888,522,"xMaxYMin"],overleftarrow:[["leftarrow"],.888,522,"xMinYMin"],underrightarrow:[["rightarrow"],.888,522,"xMaxYMin"],underleftarrow:[["leftarrow"],.888,522,"xMinYMin"],xrightarrow:[["rightarrow"],1.469,522,"xMaxYMin"],"\\cdrightarrow":[["rightarrow"],3,522,"xMaxYMin"],xleftarrow:[["leftarrow"],1.469,522,"xMinYMin"],"\\cdleftarrow":[["leftarrow"],3,522,"xMinYMin"],Overrightarrow:[["doublerightarrow"],.888,560,"xMaxYMin"],xRightarrow:[["doublerightarrow"],1.526,560,"xMaxYMin"],xLeftarrow:[["doubleleftarrow"],1.526,560,"xMinYMin"],overleftharpoon:[["leftharpoon"],.888,522,"xMinYMin"],xleftharpoonup:[["leftharpoon"],.888,522,"xMinYMin"],xleftharpoondown:[["leftharpoondown"],.888,522,"xMinYMin"],overrightharpoon:[["rightharpoon"],.888,522,"xMaxYMin"],xrightharpoonup:[["rightharpoon"],.888,522,"xMaxYMin"],xrightharpoondown:[["rightharpoondown"],.888,522,"xMaxYMin"],xlongequal:[["longequal"],.888,334,"xMinYMin"],"\\cdlongequal":[["longequal"],3,334,"xMinYMin"],xtwoheadleftarrow:[["twoheadleftarrow"],.888,334,"xMinYMin"],xtwoheadrightarrow:[["twoheadrightarrow"],.888,334,"xMaxYMin"],overleftrightarrow:[["leftarrow","rightarrow"],.888,522],overbrace:[["leftbrace","midbrace","rightbrace"],1.6,548],underbrace:[["leftbraceunder","midbraceunder","rightbraceunder"],1.6,548],underleftrightarrow:[["leftarrow","rightarrow"],.888,522],xleftrightarrow:[["leftarrow","rightarrow"],1.75,522],xLeftrightarrow:[["doubleleftarrow","doublerightarrow"],1.75,560],xrightleftharpoons:[["leftharpoondownplus","rightharpoonplus"],1.75,716],xleftrightharpoons:[["leftharpoonplus","rightharpoondownplus"],1.75,716],xhookleftarrow:[["leftarrow","righthook"],1.08,522],xhookrightarrow:[["lefthook","rightarrow"],1.08,522],overlinesegment:[["leftlinesegment","rightlinesegment"],.888,522],underlinesegment:[["leftlinesegment","rightlinesegment"],.888,522],overbracket:[["leftbracketover","rightbracketover"],1.6,440],underbracket:[["leftbracketunder","rightbracketunder"],1.6,410],overgroup:[["leftgroup","rightgroup"],.888,342],undergroup:[["leftgroupunder","rightgroupunder"],.888,342],xmapsto:[["leftmapsto","rightarrow"],1.5,522],xtofrom:[["leftToFrom","rightToFrom"],1.75,528],xrightleftarrows:[["baraboveleftarrow","rightarrowabovebar"],1.75,901],xrightequilibrium:[["baraboveshortleftharpoon","rightharpoonaboveshortbar"],1.75,716],xleftequilibrium:[["shortbaraboveleftharpoon","shortrightharpoonabovebar"],1.75,716]},Ni=new Set(["widehat","widecheck","widetilde","utilde"]),Ye=function(e,t){function a(){var u=4e5,h=e.label.slice(1);if(Ni.has(h)&&"base"in e){var m=e.base.type==="ordgroup"?e.base.body.length:1,p,g,S;if(m>5)h==="widehat"||h==="widecheck"?(p=420,u=2364,S=.42,g=h+"4"):(p=312,u=2340,S=.34,g="tilde4");else{var x=[1,1,2,2,3,3][m];h==="widehat"||h==="widecheck"?(u=[0,1062,2364,2364,2364][x],p=[0,239,300,360,420][x],S=[0,.24,.3,.3,.36,.42][x],g=h+x):(u=[0,600,1033,2339,2340][x],p=[0,260,286,306,312][x],S=[0,.26,.286,.3,.306,.34][x],g="tilde"+x)}var D=new J0(g),E=new $0([D],{width:"100%",height:N(S),viewBox:"0 0 "+u+" "+p,preserveAspectRatio:"none"});return{span:Q0([],[E],t),minWidth:0,height:S}}else{var M=[],R=Di[h];if(!R)throw new Error('No SVG data for "'+h+'".');var[y,w,k]=R,A=k/1e3,T=y.length,O,P;if(T===1){if(R.length!==4)throw new Error('Expected 4-tuple for single-path SVG data "'+h+'".');O=["hide-tail"],P=[R[3]]}else if(T===2)O=["halfarrow-left","halfarrow-right"],P=["xMinYMin","xMaxYMin"];else if(T===3)O=["brace-left","brace-center","brace-right"],P=["xMinYMin","xMidYMin","xMaxYMin"];else throw new Error(`Correct katexImagesData or update code here to support + `+T+" children.");for(var B=0;B0&&(n.style.minWidth=N(s)),n},Bi=function(e,t,a,n,s){var o,u=e.height+e.depth+a+n;if(/fbox|color|angl/.test(t)){if(o=C(["stretchy",t],[],s),t==="fbox"){var h=s.color&&s.getColor();h&&(o.style.borderColor=h)}}else{var m=[];/^[bx]cancel$/.test(t)&&m.push(new kt({x1:"0",y1:"0",x2:"100%",y2:"100%","stroke-width":"0.046em"})),/^x?cancel$/.test(t)&&m.push(new kt({x1:"0",y1:"100%",x2:"100%",y2:"0","stroke-width":"0.046em"}));var p=new $0(m,{width:"100%",height:N(u)});o=Q0([],[p],s)}return o.height=u,o.style.height=N(u),o},Oi={bin:1,close:1,inner:1,open:1,punct:1,rel:1},Li={"accent-token":1,mathord:1,"op-token":1,spacing:1,textord:1};function qi(r){return r in Oi}function G(r,e){if(!r||r.type!==e)throw new Error("Expected node of type "+e+", but got "+(r?"node of type "+r.type:String(r)));return r}function Ze(r){var e=Ke(r);if(!e)throw new Error("Expected node of symbol group type, but got "+(r?"node of type "+r.type:String(r)));return e}function Ke(r){return r&&(r.type==="atom"||Li.hasOwnProperty(r.type))?r:null}var wa=r=>{if(r instanceof A0)return r;if(ci(r)&&r.children.length===1)return wa(r.children[0])},Sa=(r,e)=>{var t,a,n;r&&r.type==="supsub"?(a=G(r.base,"accent"),t=a.base,r.base=t,n=ui(V(r,e)),r.base=a):(a=G(r,"accent"),t=a.base);var s=V(t,e.havingCrampedStyle()),o=a.isShifty&&_0(t),u=0;if(o){var h,m;u=(h=(m=wa(s))==null?void 0:m.skew)!=null?h:0}var p=a.label==="\\c",g=p?s.height+s.depth:Math.min(s.height,e.fontMetrics().xHeight),S;if(a.isStretchy)S=Ye(a,e),S=X({positionType:"firstBaseline",children:[{type:"elem",elem:s},{type:"elem",elem:S,wrapperClasses:["svg-align"],wrapperStyle:u>0?{width:"calc(100% - "+N(2*u)+")",marginLeft:N(2*u)}:void 0}]});else{var x,D;a.label==="\\vec"?(x=pa("vec",e),D=ma.vec[1]):(x=Ve({type:"textord",mode:a.mode,text:a.label},e),x=oi(x),x.italic=0,D=x.width,p&&(g+=x.depth)),S=C(["accent-body"],[x]);var E=a.label==="\\textcircled";E&&(S.classes.push("accent-full"),g=s.height);var M=u;E||(M-=D/2),S.style.left=N(M),a.label==="\\textcircled"&&(S.style.top=".2em"),S=X({positionType:"firstBaseline",children:[{type:"elem",elem:s},{type:"kern",size:-g},{type:"elem",elem:S}]})}var R=C(["mord","accent"],[S],e);return n?(n.children[0]=R,n.height=Math.max(R.height,n.height),n.classes[0]="mord",n):R},Pi=(r,e)=>{var t=r.isStretchy?We(r.label):new I("mo",[z0(r.label,r.mode)]),a=new I("mover",[Z(r.base,e),t]);return a.setAttribute("accent","true"),a},Hi=new RegExp(["\\acute","\\grave","\\ddot","\\tilde","\\bar","\\breve","\\check","\\hat","\\vec","\\dot","\\mathring"].map(r=>"\\"+r).join("|"));L({type:"accent",names:["\\acute","\\grave","\\ddot","\\tilde","\\bar","\\breve","\\check","\\hat","\\vec","\\dot","\\mathring","\\widecheck","\\widehat","\\widetilde","\\overrightarrow","\\overleftarrow","\\Overrightarrow","\\overleftrightarrow","\\overgroup","\\overlinesegment","\\overleftharpoon","\\overrightharpoon"],numArgs:1,handler:(r,e)=>{var t=Ue(e[0]),a=!Hi.test(r.funcName),n=!a||r.funcName==="\\widehat"||r.funcName==="\\widetilde"||r.funcName==="\\widecheck";return{type:"accent",mode:r.parser.mode,label:r.funcName,isStretchy:a,isShifty:n,base:t}},htmlBuilder:Sa,mathmlBuilder:Pi});L({type:"accent",names:["\\'","\\`","\\^","\\~","\\=","\\u","\\.",'\\"',"\\c","\\r","\\H","\\v","\\textcircled"],numArgs:1,allowedInText:!0,allowedInMath:!0,argTypes:["primitive"],handler:(r,e)=>{var t=e[0],a=r.parser.mode;return a==="math"&&(r.parser.settings.reportNonstrict("mathVsTextAccents","LaTeX's accent "+r.funcName+" works only in text mode"),a="text"),{type:"accent",mode:a,label:r.funcName,isStretchy:!1,isShifty:!0,base:t}}});L({type:"accentUnder",names:["\\underleftarrow","\\underrightarrow","\\underleftrightarrow","\\undergroup","\\underlinesegment","\\utilde"],numArgs:1,handler:(r,e)=>{var{parser:t,funcName:a}=r,n=e[0];return{type:"accentUnder",mode:t.mode,label:a,base:n}},htmlBuilder:(r,e)=>{var t=V(r.base,e),a=Ye(r,e),n=r.label==="\\utilde"?.12:0,s=X({positionType:"top",positionData:t.height,children:[{type:"elem",elem:a,wrapperClasses:["svg-align"]},{type:"kern",size:n},{type:"elem",elem:t}]});return C(["mord","accentunder"],[s],e)},mathmlBuilder:(r,e)=>{var t=We(r.label),a=new I("munder",[Z(r.base,e),t]);return a.setAttribute("accentunder","true"),a}});var Be=r=>{var e=new I("mpadded",r?[r]:[]);return e.setAttribute("width","+0.6em"),e.setAttribute("lspace","0.3em"),e};L({type:"xArrow",names:["\\xleftarrow","\\xrightarrow","\\xLeftarrow","\\xRightarrow","\\xleftrightarrow","\\xLeftrightarrow","\\xhookleftarrow","\\xhookrightarrow","\\xmapsto","\\xrightharpoondown","\\xrightharpoonup","\\xleftharpoondown","\\xleftharpoonup","\\xrightleftharpoons","\\xleftrightharpoons","\\xlongequal","\\xtwoheadrightarrow","\\xtwoheadleftarrow","\\xtofrom","\\xrightleftarrows","\\xrightequilibrium","\\xleftequilibrium","\\\\cdrightarrow","\\\\cdleftarrow","\\\\cdlongequal"],numArgs:1,numOptionalArgs:1,handler(r,e,t){var{parser:a,funcName:n}=r;return{type:"xArrow",mode:a.mode,label:n,body:e[0],below:t[0]}},htmlBuilder(r,e){var t=e.style,a=e.havingStyle(t.sup()),n=pe(V(r.body,a,e),e),s=r.label.slice(0,2)==="\\x"?"x":"cd";n.classes.push(s+"-arrow-pad");var o;r.below&&(a=e.havingStyle(t.sub()),o=pe(V(r.below,a,e),e),o.classes.push(s+"-arrow-pad"));var u=Ye(r,e),h=-e.fontMetrics().axisHeight+.5*u.height,m=-e.fontMetrics().axisHeight-.5*u.height-.111;(n.depth>.25||r.label==="\\xleftequilibrium")&&(m-=n.depth);var p;if(o){var g=-e.fontMetrics().axisHeight+o.height+.5*u.height+.111;p=X({positionType:"individualShift",children:[{type:"elem",elem:n,shift:m},{type:"elem",elem:u,shift:h,wrapperClasses:["svg-align"]},{type:"elem",elem:o,shift:g}]})}else p=X({positionType:"individualShift",children:[{type:"elem",elem:n,shift:m},{type:"elem",elem:u,shift:h,wrapperClasses:["svg-align"]}]});return C(["mrel","x-arrow"],[p],e)},mathmlBuilder(r,e){var t=We(r.label);t.setAttribute("minsize",r.label.charAt(0)==="x"?"1.75em":"3.0em");var a;if(r.body){var n=Be(Z(r.body,e));if(r.below){var s=Be(Z(r.below,e));a=new I("munderover",[t,s,n])}else a=new I("mover",[t,n])}else if(r.below){var o=Be(Z(r.below,e));a=new I("munder",[t,o])}else a=Be(),a=new I("mover",[t,a]);return a}});function $i(r,e){var t=o0(r.body,e,!0);return C([r.mclass],t,e)}function _i(r,e){var t,a=E0(r.body,e);return r.mclass==="minner"?t=new I("mpadded",a):r.mclass==="mord"?r.isCharacterBox?(t=a[0],t.type="mi"):t=new I("mi",a):(r.isCharacterBox?(t=a[0],t.type="mo"):t=new I("mo",a),r.mclass==="mbin"?(t.attributes.lspace="0.22em",t.attributes.rspace="0.22em"):r.mclass==="mpunct"?(t.attributes.lspace="0em",t.attributes.rspace="0.17em"):(r.mclass==="mopen"||r.mclass==="mclose")&&(t.attributes.lspace="0em",t.attributes.rspace="0em")),t}L({type:"mclass",names:["\\mathord","\\mathbin","\\mathrel","\\mathopen","\\mathclose","\\mathpunct","\\mathinner"],numArgs:1,primitive:!0,handler(r,e){var{parser:t,funcName:a}=r,n=e[0];return{type:"mclass",mode:t.mode,mclass:"m"+a.slice(5),body:n0(n),isCharacterBox:_0(n)}},htmlBuilder:$i,mathmlBuilder:_i});var Je=r=>{var e=r.type==="ordgroup"&&r.body.length?r.body[0]:r;return e.type==="atom"&&(e.family==="bin"||e.family==="rel")?"m"+e.family:"mord"};L({type:"mclass",names:["\\@binrel"],numArgs:2,handler(r,e){var{parser:t}=r;return{type:"mclass",mode:t.mode,mclass:Je(e[0]),body:n0(e[1]),isCharacterBox:_0(e[1])}}});L({type:"mclass",names:["\\stackrel","\\overset","\\underset"],numArgs:2,handler(r,e){var{parser:t,funcName:a}=r,n=e[1],s=e[0],o;a!=="\\stackrel"?o=Je(n):o="mrel";var u={type:"op",mode:n.mode,limits:!0,alwaysHandleSupSub:!0,parentIsSupSub:!1,symbol:!1,suppressBaseShift:a!=="\\stackrel",body:n0(n)},h=a==="\\underset"?{type:"supsub",mode:s.mode,base:u,sub:s}:{type:"supsub",mode:s.mode,base:u,sup:s};return{type:"mclass",mode:t.mode,mclass:o,body:[h],isCharacterBox:_0(h)}}});L({type:"pmb",names:["\\pmb"],numArgs:1,allowedInText:!0,handler(r,e){var{parser:t}=r;return{type:"pmb",mode:t.mode,mclass:Je(e[0]),body:n0(e[0])}},htmlBuilder(r,e){var t=o0(r.body,e,!0),a=C([r.mclass],t,e);return a.style.textShadow="0.02em 0.01em 0.04px",a},mathmlBuilder(r,e){var t=E0(r.body,e),a=new I("mstyle",t);return a.setAttribute("style","text-shadow: 0.02em 0.01em 0.04px"),a}});var Gi={">":"\\\\cdrightarrow","<":"\\\\cdleftarrow","=":"\\\\cdlongequal",A:"\\uparrow",V:"\\downarrow","|":"\\Vert",".":"no arrow"},Br=()=>({type:"styling",body:[],mode:"math",style:"display",resetFont:!0}),Or=r=>r.type==="textord"&&r.text==="@",Ui=(r,e)=>(r.type==="mathord"||r.type==="atom")&&r.text===e;function ji(r,e,t){var a=Gi[r];switch(a){case"\\\\cdrightarrow":case"\\\\cdleftarrow":return t.callFunction(a,[e[0]],[e[1]]);case"\\uparrow":case"\\downarrow":{var n=t.callFunction("\\\\cdleft",[e[0]],[]),s={type:"atom",text:a,mode:"math",family:"rel"},o=t.callFunction("\\Big",[s],[]),u=t.callFunction("\\\\cdright",[e[1]],[]),h={type:"ordgroup",mode:"math",body:[n,o,u]};return t.callFunction("\\\\cdparent",[h],[])}case"\\\\cdlongequal":return t.callFunction("\\\\cdlongequal",[],[]);case"\\Vert":{var m={type:"textord",text:"\\Vert",mode:"math"};return t.callFunction("\\Big",[m],[])}default:return{type:"textord",text:" ",mode:"math"}}}function Xi(r){var e=[];for(r.gullet.beginGroup(),r.gullet.macros.set("\\cr","\\\\\\relax"),r.gullet.beginGroup();;){e.push(r.parseExpression(!1,"\\\\")),r.gullet.endGroup(),r.gullet.beginGroup();var t=r.fetch().text;if(t==="&"||t==="\\\\")r.consume();else if(t==="\\end"){e[e.length-1].length===0&&e.pop();break}else throw new F("Expected \\\\ or \\cr or \\end",r.nextToken)}for(var a=[],n=[a],s=0;sAV".includes(m))for(var g=0;g<2;g++){for(var S=!0,x=h+1;xAV=|." after @',o[h]);var D=ji(m,p,r),E={type:"styling",body:[D],mode:"math",style:"display",resetFont:!0};a.push(E),u=Br()}s%2===0?a.push(u):a.shift(),a=[],n.push(a)}r.gullet.endGroup(),r.gullet.endGroup();var M=new Array(n[0].length).fill({type:"align",align:"c",pregap:.25,postgap:.25});return{type:"array",mode:"math",body:n,arraystretch:1,addJot:!0,rowGaps:[null],cols:M,colSeparationType:"CD",hLinesBeforeRow:new Array(n.length+1).fill([])}}L({type:"cdlabel",names:["\\\\cdleft","\\\\cdright"],numArgs:1,handler(r,e){var{parser:t,funcName:a}=r;return{type:"cdlabel",mode:t.mode,side:a.slice(4),label:e[0]}},htmlBuilder(r,e){var t=e.havingStyle(e.style.sup()),a=pe(V(r.label,t,e),e);return a.classes.push("cd-label-"+r.side),a.style.bottom=N(.8-a.depth),a.height=0,a.depth=0,a},mathmlBuilder(r,e){var t=new I("mrow",[Z(r.label,e)]);return t=new I("mpadded",[t]),t.setAttribute("width","0"),r.side==="left"&&t.setAttribute("lspace","-1width"),t.setAttribute("voffset","0.7em"),t=new I("mstyle",[t]),t.setAttribute("displaystyle","false"),t.setAttribute("scriptlevel","1"),t}});L({type:"cdlabelparent",names:["\\\\cdparent"],numArgs:1,handler(r,e){var{parser:t}=r;return{type:"cdlabelparent",mode:t.mode,fragment:e[0]}},htmlBuilder(r,e){var t=pe(V(r.fragment,e),e);return t.classes.push("cd-vert-arrow"),t},mathmlBuilder(r,e){return new I("mrow",[Z(r.fragment,e)])}});L({type:"textord",names:["\\@char"],numArgs:1,allowedInText:!0,handler(r,e){for(var{parser:t}=r,a=G(e[0],"ordgroup"),n=a.body,s="",o=0;o=1114111)throw new F("\\@char with invalid code point "+s);return h<=65535?m=String.fromCharCode(h):(h-=65536,m=String.fromCharCode((h>>10)+55296,(h&1023)+56320)),{type:"textord",mode:t.mode,text:m}}});var Vi=(r,e)=>{var t=o0(r.body,e.withColor(r.color),!1);return U0(t)},Wi=(r,e)=>{var t=E0(r.body,e.withColor(r.color)),a=new I("mstyle",t);return a.setAttribute("mathcolor",r.color),a};L({type:"color",names:["\\textcolor"],numArgs:2,allowedInText:!0,argTypes:["color","original"],handler(r,e){var{parser:t}=r,a=G(e[0],"color-token").color,n=e[1];return{type:"color",mode:t.mode,color:a,body:n0(n)}},htmlBuilder:Vi,mathmlBuilder:Wi});L({type:"color",names:["\\color"],numArgs:1,allowedInText:!0,argTypes:["color"],handler(r,e){var{parser:t,breakOnTokenText:a}=r,n=G(e[0],"color-token").color;t.gullet.macros.set("\\current@color",n);var s=t.parseExpression(!0,a);return{type:"color",mode:t.mode,color:n,body:s}}});L({type:"cr",names:["\\\\"],numArgs:0,numOptionalArgs:0,allowedInText:!0,handler(r,e,t){var{parser:a}=r,n=a.gullet.future().text==="["?a.parseSizeGroup(!0):null,s=!a.settings.displayMode||!a.settings.useStrictBehavior("newLineInDisplayMode","In LaTeX, \\\\ or \\newline does nothing in display mode");return{type:"cr",mode:a.mode,newLine:s,size:n&&G(n,"size").value}},htmlBuilder(r,e){var t=C(["mspace"],[],e);return r.newLine&&(t.classes.push("newline"),r.size&&(t.style.marginTop=N(t0(r.size,e)))),t},mathmlBuilder(r,e){var t=new I("mspace");return r.newLine&&(t.setAttribute("linebreak","newline"),r.size&&t.setAttribute("height",N(t0(r.size,e)))),t}});var Nt={"\\global":"\\global","\\long":"\\\\globallong","\\\\globallong":"\\\\globallong","\\def":"\\gdef","\\gdef":"\\gdef","\\edef":"\\xdef","\\xdef":"\\xdef","\\let":"\\\\globallet","\\futurelet":"\\\\globalfuture"},ka=r=>{var e=r.text;if(/^(?:[\\{}$&#^_]|EOF)$/.test(e))throw new F("Expected a control sequence",r);return e},Yi=r=>{var e=r.gullet.popToken();return e.text==="="&&(e=r.gullet.popToken(),e.text===" "&&(e=r.gullet.popToken())),e},Aa=(r,e,t,a)=>{var n=r.gullet.macros.get(t.text);n==null&&(t.noexpand=!0,n={tokens:[t],numArgs:0,unexpandable:!r.gullet.isExpandable(t.text)}),r.gullet.macros.set(e,n,a)};L({type:"internal",names:["\\global","\\long","\\\\globallong"],numArgs:0,allowedInText:!0,handler(r){var{parser:e,funcName:t}=r;e.consumeSpaces();var a=e.fetch();if(Nt[a.text])return(t==="\\global"||t==="\\\\globallong")&&(a.text=Nt[a.text]),G(e.parseFunction(),"internal");throw new F("Invalid token after macro prefix",a)}});L({type:"internal",names:["\\def","\\gdef","\\edef","\\xdef"],numArgs:0,allowedInText:!0,primitive:!0,handler(r){var{parser:e,funcName:t}=r,a=e.gullet.popToken(),n=a.text;if(/^(?:[\\{}$&#^_]|EOF)$/.test(n))throw new F("Expected a control sequence",a);for(var s=0,o,u=[[]];e.gullet.future().text!=="{";)if(a=e.gullet.popToken(),a.text==="#"){if(e.gullet.future().text==="{"){o=e.gullet.future(),u[s].push("{");break}if(a=e.gullet.popToken(),!/^[1-9]$/.test(a.text))throw new F('Invalid argument number "'+a.text+'"');if(parseInt(a.text)!==s+1)throw new F('Argument number "'+a.text+'" out of order');s++,u.push([])}else{if(a.text==="EOF")throw new F("Expected a macro definition");u[s].push(a.text)}var{tokens:h}=e.gullet.consumeArg();return o&&h.unshift(o),(t==="\\edef"||t==="\\xdef")&&(h=e.gullet.expandTokens(h),h.reverse()),e.gullet.macros.set(n,{tokens:h,numArgs:s,delimiters:u},t===Nt[t]),{type:"internal",mode:e.mode}}});L({type:"internal",names:["\\let","\\\\globallet"],numArgs:0,allowedInText:!0,primitive:!0,handler(r){var{parser:e,funcName:t}=r,a=ka(e.gullet.popToken());e.gullet.consumeSpaces();var n=Yi(e);return Aa(e,a,n,t==="\\\\globallet"),{type:"internal",mode:e.mode}}});L({type:"internal",names:["\\futurelet","\\\\globalfuture"],numArgs:0,allowedInText:!0,primitive:!0,handler(r){var{parser:e,funcName:t}=r,a=ka(e.gullet.popToken()),n=e.gullet.popToken(),s=e.gullet.popToken();return Aa(e,a,s,t==="\\\\globalfuture"),e.gullet.pushToken(s),e.gullet.pushToken(n),{type:"internal",mode:e.mode}}});var be=function(e,t,a){var n=K.math[e]&&K.math[e].replace,s=_t(n||e,t,a);if(!s)throw new Error("Unsupported symbol "+e+" and font size "+t+".");return s},Vt=function(e,t,a,n){var s=a.havingBaseStyle(t),o=C(n.concat(s.sizingClasses(a)),[e],a),u=s.sizeMultiplier/a.sizeMultiplier;return o.height*=u,o.depth*=u,o.maxFontSize=s.sizeMultiplier,o},Ta=function(e,t,a){var n=t.havingBaseStyle(a),s=(1-t.sizeMultiplier/n.sizeMultiplier)*t.fontMetrics().axisHeight;e.classes.push("delimcenter"),e.style.top=N(s),e.height-=s,e.depth+=s},Zi=function(e,t,a,n,s,o){var u=m0(e,"Main-Regular",s,n),h=Vt(u,t,n,o);return Ta(h,n,t),h},Ki=function(e,t,a,n){return m0(e,"Size"+t+"-Regular",a,n)},Ea=function(e,t,a,n,s,o){var u=Ki(e,t,s,n),h=Vt(C(["delimsizing","size"+t],[u],n),_.TEXT,n,o);return a&&Ta(h,n,_.TEXT),h},ct=function(e,t,a){var n;t==="Size1-Regular"?n="delim-size1":n="delim-size4";var s=C(["delimsizinginner",n],[C([],[m0(e,t,a)])]);return{type:"elem",elem:s}},ht=function(e,t,a){var n=I0["Size4-Regular"][e.charCodeAt(0)]?I0["Size4-Regular"][e.charCodeAt(0)][4]:I0["Size1-Regular"][e.charCodeAt(0)][4],s=new J0("inner",ti(e,Math.round(1e3*t))),o=new $0([s],{width:N(n),height:N(t),style:"width:"+N(n),viewBox:"0 0 "+1e3*n+" "+Math.round(1e3*t),preserveAspectRatio:"xMinYMin"}),u=Q0([],[o],a);return u.height=t,u.style.height=N(t),u.style.width=N(n),{type:"elem",elem:u}},Bt=.008,Oe={type:"kern",size:-1*Bt},Ji=new Set(["|","\\lvert","\\rvert","\\vert"]),Qi=new Set(["\\|","\\lVert","\\rVert","\\Vert"]),Ma=function(e,t,a,n,s,o){var u,h,m,p,g="",S=0;u=m=p=e,h=null;var x="Size1-Regular";e==="\\uparrow"?m=p="⏐":e==="\\Uparrow"?m=p="‖":e==="\\downarrow"?u=m="⏐":e==="\\Downarrow"?u=m="‖":e==="\\updownarrow"?(u="\\uparrow",m="⏐",p="\\downarrow"):e==="\\Updownarrow"?(u="\\Uparrow",m="‖",p="\\Downarrow"):Ji.has(e)?(m="∣",g="vert",S=333):Qi.has(e)?(m="∥",g="doublevert",S=556):e==="["||e==="\\lbrack"?(u="⎡",m="⎢",p="⎣",x="Size4-Regular",g="lbrack",S=667):e==="]"||e==="\\rbrack"?(u="⎤",m="⎥",p="⎦",x="Size4-Regular",g="rbrack",S=667):e==="\\lfloor"||e==="⌊"?(m=u="⎢",p="⎣",x="Size4-Regular",g="lfloor",S=667):e==="\\lceil"||e==="⌈"?(u="⎡",m=p="⎢",x="Size4-Regular",g="lceil",S=667):e==="\\rfloor"||e==="⌋"?(m=u="⎥",p="⎦",x="Size4-Regular",g="rfloor",S=667):e==="\\rceil"||e==="⌉"?(u="⎤",m=p="⎥",x="Size4-Regular",g="rceil",S=667):e==="("||e==="\\lparen"?(u="⎛",m="⎜",p="⎝",x="Size4-Regular",g="lparen",S=875):e===")"||e==="\\rparen"?(u="⎞",m="⎟",p="⎠",x="Size4-Regular",g="rparen",S=875):e==="\\{"||e==="\\lbrace"?(u="⎧",h="⎨",p="⎩",m="⎪",x="Size4-Regular"):e==="\\}"||e==="\\rbrace"?(u="⎫",h="⎬",p="⎭",m="⎪",x="Size4-Regular"):e==="\\lgroup"||e==="⟮"?(u="⎧",p="⎩",m="⎪",x="Size4-Regular"):e==="\\rgroup"||e==="⟯"?(u="⎫",p="⎭",m="⎪",x="Size4-Regular"):e==="\\lmoustache"||e==="⎰"?(u="⎧",p="⎭",m="⎪",x="Size4-Regular"):(e==="\\rmoustache"||e==="⎱")&&(u="⎫",p="⎩",m="⎪",x="Size4-Regular");var D=be(u,x,s),E=D.height+D.depth,M=be(m,x,s),R=M.height+M.depth,y=be(p,x,s),w=y.height+y.depth,k=0,A=1;if(h!==null){var T=be(h,x,s);k=T.height+T.depth,A=2}var O=E+w+k,P=Math.max(0,Math.ceil((t-O)/(A*R))),B=O+P*A*R,j=n.fontMetrics().axisHeight;a&&(j*=n.sizeMultiplier);var W=B/2-j,Y=[];if(g.length>0){var j0=B-E-w,b0=Math.round(B*1e3),y0=ri(g,Math.round(j0*1e3)),R0=new J0(g,y0),O0=N(S/1e3),Q=N(b0/1e3),v0=new $0([R0],{width:O0,height:Q,viewBox:"0 0 "+S+" "+b0}),h0=Q0([],[v0],n);h0.height=b0/1e3,h0.style.width=O0,h0.style.height=Q,Y.push({type:"elem",elem:h0})}else{if(Y.push(ct(p,x,s)),Y.push(Oe),h===null){var x0=B-E-w+2*Bt;Y.push(ht(m,x0,n))}else{var u0=(B-E-w-k)/2+2*Bt;Y.push(ht(m,u0,n)),Y.push(Oe),Y.push(ct(h,x,s)),Y.push(Oe),Y.push(ht(m,u0,n))}Y.push(Oe),Y.push(ct(u,x,s))}var w0=n.havingBaseStyle(_.TEXT),S0=X({positionType:"bottom",positionData:W,children:Y});return Vt(C(["delimsizing","mult"],[S0],w0),_.TEXT,n,o)},dt=80,mt=.08,pt=function(e,t,a,n,s){var o=ei(e,n,a),u=new J0(e,o),h=new $0([u],{width:"400em",height:N(t),viewBox:"0 0 400000 "+a,preserveAspectRatio:"xMinYMin slice"});return Q0(["hide-tail"],[h],s)},es=function(e,t){var a=t.havingBaseSizing(),n=Ia("\\surd",e*a.sizeMultiplier,Fa,a),s=a.sizeMultiplier,o=Math.max(0,t.minRuleThickness-t.fontMetrics().sqrtRuleThickness),u,h,m,p,g;return n.type==="small"?(p=1e3+1e3*o+dt,e<1?s=1:e<1.4&&(s=.7),h=(1+o+mt)/s,m=(1+o)/s,u=pt("sqrtMain",h,p,o,t),u.style.minWidth="0.853em",g=.833/s):n.type==="large"?(p=(1e3+dt)*ye[n.size],m=(ye[n.size]+o)/s,h=(ye[n.size]+o+mt)/s,u=pt("sqrtSize"+n.size,h,p,o,t),u.style.minWidth="1.02em",g=1/s):(h=e+o+mt,m=e+o,p=Math.floor(1e3*e+o)+dt,u=pt("sqrtTall",h,p,o,t),u.style.minWidth="0.742em",g=1.056),u.height=m,u.style.height=N(h),{span:u,advanceWidth:g,ruleWidth:(t.fontMetrics().sqrtRuleThickness+o)*s}},za=new Set(["(","\\lparen",")","\\rparen","[","\\lbrack","]","\\rbrack","\\{","\\lbrace","\\}","\\rbrace","\\lfloor","\\rfloor","⌊","⌋","\\lceil","\\rceil","⌈","⌉","\\surd"]),ts=new Set(["\\uparrow","\\downarrow","\\updownarrow","\\Uparrow","\\Downarrow","\\Updownarrow","|","\\|","\\vert","\\Vert","\\lvert","\\rvert","\\lVert","\\rVert","\\lgroup","\\rgroup","⟮","⟯","\\lmoustache","\\rmoustache","⎰","⎱"]),Ca=new Set(["<",">","\\langle","\\rangle","/","\\backslash","\\lt","\\gt"]),ye=[0,1.2,1.8,2.4,3],Ra=function(e,t,a,n,s){if(e==="<"||e==="\\lt"||e==="⟨"?e="\\langle":(e===">"||e==="\\gt"||e==="⟩")&&(e="\\rangle"),za.has(e)||Ca.has(e))return Ea(e,t,!1,a,n,s);if(ts.has(e))return Ma(e,ye[t],!1,a,n,s);throw new F("Illegal delimiter: '"+e+"'")},rs=[{type:"small",style:_.SCRIPTSCRIPT},{type:"small",style:_.SCRIPT},{type:"small",style:_.TEXT},{type:"large",size:1},{type:"large",size:2},{type:"large",size:3},{type:"large",size:4}],as=[{type:"small",style:_.SCRIPTSCRIPT},{type:"small",style:_.SCRIPT},{type:"small",style:_.TEXT},{type:"stack"}],Fa=[{type:"small",style:_.SCRIPTSCRIPT},{type:"small",style:_.SCRIPT},{type:"small",style:_.TEXT},{type:"large",size:1},{type:"large",size:2},{type:"large",size:3},{type:"large",size:4},{type:"stack"}],ns=function(e){if(e.type==="small")return"Main-Regular";if(e.type==="large")return"Size"+e.size+"-Regular";if(e.type==="stack")return"Size4-Regular";var t=e.type;throw new Error("Add support for delim type '"+t+"' here.")},Ia=function(e,t,a,n){for(var s=Math.min(2,3-n.style.size),o=s;ot)return u}return a[a.length-1]},Ot=function(e,t,a,n,s,o){e==="<"||e==="\\lt"||e==="⟨"?e="\\langle":(e===">"||e==="\\gt"||e==="⟩")&&(e="\\rangle");var u;Ca.has(e)?u=rs:za.has(e)?u=Fa:u=as;var h=Ia(e,t,u,n);return h.type==="small"?Zi(e,h.style,a,n,s,o):h.type==="large"?Ea(e,h.size,a,n,s,o):Ma(e,t,a,n,s,o)},ft=function(e,t,a,n,s,o){var u=n.fontMetrics().axisHeight*n.sizeMultiplier,h=901,m=5/n.fontMetrics().ptPerEm,p=Math.max(t-u,a+u),g=Math.max(p/500*h,2*p-m);return Ot(e,g,!0,n,s,o)},Lr={"\\bigl":{mclass:"mopen",size:1},"\\Bigl":{mclass:"mopen",size:2},"\\biggl":{mclass:"mopen",size:3},"\\Biggl":{mclass:"mopen",size:4},"\\bigr":{mclass:"mclose",size:1},"\\Bigr":{mclass:"mclose",size:2},"\\biggr":{mclass:"mclose",size:3},"\\Biggr":{mclass:"mclose",size:4},"\\bigm":{mclass:"mrel",size:1},"\\Bigm":{mclass:"mrel",size:2},"\\biggm":{mclass:"mrel",size:3},"\\Biggm":{mclass:"mrel",size:4},"\\big":{mclass:"mord",size:1},"\\Big":{mclass:"mord",size:2},"\\bigg":{mclass:"mord",size:3},"\\Bigg":{mclass:"mord",size:4}},is=new Set(["(","\\lparen",")","\\rparen","[","\\lbrack","]","\\rbrack","\\{","\\lbrace","\\}","\\rbrace","\\lfloor","\\rfloor","⌊","⌋","\\lceil","\\rceil","⌈","⌉","<",">","\\langle","⟨","\\rangle","⟩","\\lt","\\gt","\\lvert","\\rvert","\\lVert","\\rVert","\\lgroup","\\rgroup","⟮","⟯","\\lmoustache","\\rmoustache","⎰","⎱","/","\\backslash","|","\\vert","\\|","\\Vert","\\uparrow","\\Uparrow","\\downarrow","\\Downarrow","\\updownarrow","\\Updownarrow","."]);function qr(r){return"isMiddle"in r}function Qe(r,e){var t=Ke(r);if(t&&is.has(t.text))return t;throw t?new F("Invalid delimiter '"+t.text+"' after '"+e.funcName+"'",r):new F("Invalid delimiter type '"+r.type+"'",r)}L({type:"delimsizing",names:["\\bigl","\\Bigl","\\biggl","\\Biggl","\\bigr","\\Bigr","\\biggr","\\Biggr","\\bigm","\\Bigm","\\biggm","\\Biggm","\\big","\\Big","\\bigg","\\Bigg"],numArgs:1,argTypes:["primitive"],handler:(r,e)=>{var t=Qe(e[0],r);return{type:"delimsizing",mode:r.parser.mode,size:Lr[r.funcName].size,mclass:Lr[r.funcName].mclass,delim:t.text}},htmlBuilder:(r,e)=>r.delim==="."?C([r.mclass]):Ra(r.delim,r.size,e,r.mode,[r.mclass]),mathmlBuilder:r=>{var e=[];r.delim!=="."&&e.push(z0(r.delim,r.mode));var t=new I("mo",e);r.mclass==="mopen"||r.mclass==="mclose"?t.setAttribute("fence","true"):t.setAttribute("fence","false"),t.setAttribute("stretchy","true");var a=N(ye[r.size]);return t.setAttribute("minsize",a),t.setAttribute("maxsize",a),t}});function Pr(r){if(!r.body)throw new Error("Bug: The leftright ParseNode wasn't fully parsed.")}L({type:"leftright-right",names:["\\right"],numArgs:1,primitive:!0,handler:(r,e)=>{var t=r.parser.gullet.macros.get("\\current@color");if(t&&typeof t!="string")throw new F("\\current@color set to non-string in \\right");return{type:"leftright-right",mode:r.parser.mode,delim:Qe(e[0],r).text,color:t}}});L({type:"leftright",names:["\\left"],numArgs:1,primitive:!0,handler:(r,e)=>{var t=Qe(e[0],r),a=r.parser;++a.leftrightDepth;var n=a.parseExpression(!1);--a.leftrightDepth,a.expect("\\right",!1);var s=G(a.parseFunction(),"leftright-right");return{type:"leftright",mode:a.mode,body:n,left:t.text,right:s.delim,rightColor:s.color}},htmlBuilder:(r,e)=>{Pr(r);for(var t=o0(r.body,e,!0,["mopen","mclose"]),a=0,n=0,s=!1,o=0;o{Pr(r);var t=E0(r.body,e);if(r.left!=="."){var a=new I("mo",[z0(r.left,r.mode)]);a.setAttribute("fence","true"),t.unshift(a)}if(r.right!=="."){var n=new I("mo",[z0(r.right,r.mode)]);n.setAttribute("fence","true"),r.rightColor&&n.setAttribute("mathcolor",r.rightColor),t.push(n)}return jt(t)}});L({type:"middle",names:["\\middle"],numArgs:1,primitive:!0,handler:(r,e)=>{var t=Qe(e[0],r);if(!r.parser.leftrightDepth)throw new F("\\middle without preceding \\left",t);return{type:"middle",mode:r.parser.mode,delim:t.text}},htmlBuilder:(r,e)=>{var t;return r.delim==="."?t=ke(e,[]):(t=Ra(r.delim,1,e,r.mode,[]),t.isMiddle={delim:r.delim,options:e}),t},mathmlBuilder:(r,e)=>{var t=r.delim==="\\vert"||r.delim==="|"?z0("|","text"):z0(r.delim,r.mode),a=new I("mo",[t]);return a.setAttribute("fence","true"),a.setAttribute("lspace","0.05em"),a.setAttribute("rspace","0.05em"),a}});var ss=(r,e)=>{var t=pe(V(r.body,e),e),a=r.label.slice(1),n=e.sizeMultiplier,s,o,u=_0(r.body);if(a==="sout")s=C(["stretchy","sout"]),s.height=e.fontMetrics().defaultRuleThickness/n,o=-.5*e.fontMetrics().xHeight;else if(a==="phase"){var h=t0({number:.6,unit:"pt"},e),m=t0({number:.35,unit:"ex"},e),p=e.havingBaseSizing();n=n/p.sizeMultiplier;var g=t.height+t.depth+h+m;t.style.paddingLeft=N(g/2+h);var S=Math.floor(1e3*g*n),x=Jn(S),D=new $0([new J0("phase",x)],{width:"400em",height:N(S/1e3),viewBox:"0 0 400000 "+S,preserveAspectRatio:"xMinYMin slice"});s=Q0(["hide-tail"],[D],e),s.style.height=N(g),o=t.depth+h+m}else{/cancel/.test(a)?u||t.classes.push("cancel-pad"):a==="angl"?t.classes.push("anglpad"):t.classes.push("boxpad");var E,M,R=0;/box/.test(a)?(R=Math.max(e.fontMetrics().fboxrule,e.minRuleThickness),E=e.fontMetrics().fboxsep+(a==="colorbox"?0:R),M=E):a==="angl"?(R=Math.max(e.fontMetrics().defaultRuleThickness,e.minRuleThickness),E=4*R,M=Math.max(0,.25-t.depth)):(E=u?.2:0,M=E),s=Bi(t,a,E,M,e),/fbox|boxed|fcolorbox/.test(a)?(s.style.borderStyle="solid",s.style.borderWidth=N(R)):a==="angl"&&R!==.049&&(s.style.borderTopWidth=N(R),s.style.borderRightWidth=N(R)),o=t.depth+M,r.backgroundColor&&(s.style.backgroundColor=r.backgroundColor,r.borderColor&&(s.style.borderColor=r.borderColor))}var y;if(r.backgroundColor)y=X({positionType:"individualShift",children:[{type:"elem",elem:s,shift:o},{type:"elem",elem:t,shift:0}]});else{var w=/cancel|phase/.test(a)?["svg-align"]:[];y=X({positionType:"individualShift",children:[{type:"elem",elem:t,shift:0},{type:"elem",elem:s,shift:o,wrapperClasses:w}]})}return/cancel/.test(a)&&(y.height=t.height,y.depth=t.depth),/cancel/.test(a)&&!u?C(["mord","cancel-lap"],[y],e):C(["mord"],[y],e)},ls=(r,e)=>{var t,a=new I(r.label.includes("colorbox")?"mpadded":"menclose",[Z(r.body,e)]);switch(r.label){case"\\cancel":a.setAttribute("notation","updiagonalstrike");break;case"\\bcancel":a.setAttribute("notation","downdiagonalstrike");break;case"\\phase":a.setAttribute("notation","phasorangle");break;case"\\sout":a.setAttribute("notation","horizontalstrike");break;case"\\fbox":a.setAttribute("notation","box");break;case"\\angl":a.setAttribute("notation","actuarial");break;case"\\fcolorbox":case"\\colorbox":if(t=e.fontMetrics().fboxsep*e.fontMetrics().ptPerEm,a.setAttribute("width","+"+2*t+"pt"),a.setAttribute("height","+"+2*t+"pt"),a.setAttribute("lspace",t+"pt"),a.setAttribute("voffset",t+"pt"),r.label==="\\fcolorbox"){var n=Math.max(e.fontMetrics().fboxrule,e.minRuleThickness);a.setAttribute("style","border: "+N(n)+" solid "+r.borderColor)}break;case"\\xcancel":a.setAttribute("notation","updiagonalstrike downdiagonalstrike");break}return r.backgroundColor&&a.setAttribute("mathbackground",r.backgroundColor),a};L({type:"enclose",names:["\\colorbox"],numArgs:2,allowedInText:!0,argTypes:["color","hbox"],handler(r,e,t){var{parser:a,funcName:n}=r,s=G(e[0],"color-token").color,o=e[1];return{type:"enclose",mode:a.mode,label:n,backgroundColor:s,body:o}},htmlBuilder:ss,mathmlBuilder:ls});L({type:"enclose",names:["\\fcolorbox"],numArgs:3,allowedInText:!0,argTypes:["color","color","hbox"],handler(r,e,t){var{parser:a,funcName:n}=r,s=G(e[0],"color-token").color,o=G(e[1],"color-token").color,u=e[2];return{type:"enclose",mode:a.mode,label:n,backgroundColor:o,borderColor:s,body:u}}});L({type:"enclose",names:["\\fbox"],numArgs:1,argTypes:["hbox"],allowedInText:!0,handler(r,e){var{parser:t}=r;return{type:"enclose",mode:t.mode,label:"\\fbox",body:e[0]}}});L({type:"enclose",names:["\\cancel","\\bcancel","\\xcancel","\\phase"],numArgs:1,handler(r,e){var{parser:t,funcName:a}=r,n=e[0];return{type:"enclose",mode:t.mode,label:a,body:n}}});L({type:"enclose",names:["\\sout"],numArgs:1,allowedInText:!0,handler(r,e){var{parser:t,funcName:a}=r;t.mode==="math"&&t.settings.reportNonstrict("mathVsSout","LaTeX's \\sout works only in text mode");var n=e[0];return{type:"enclose",mode:t.mode,label:a,body:n}}});L({type:"enclose",names:["\\angl"],numArgs:1,argTypes:["hbox"],allowedInText:!1,handler(r,e){var{parser:t}=r;return{type:"enclose",mode:t.mode,label:"\\angl",body:e[0]}}});var Da={};function D0(r){for(var{type:e,names:t,props:a,handler:n,htmlBuilder:s,mathmlBuilder:o}=r,u={type:e,numArgs:a.numArgs||0,allowedInText:!1,numOptionalArgs:0,handler:n},h=0;h{var e=r.parser.settings;if(!e.displayMode)throw new F("{"+r.envName+"} can be used only in display mode.")},os=new Set(["gather","gather*"]);function Wt(r){if(!r.includes("ed"))return!r.includes("*")}function te(r,e,t){var{hskipBeforeAndAfter:a,addJot:n,cols:s,arraystretch:o,colSeparationType:u,autoTag:h,singleRow:m,emptySingleRow:p,maxNumCols:g,leqno:S}=e;if(r.gullet.beginGroup(),m||r.gullet.macros.set("\\cr","\\\\\\relax"),!o){var x=r.gullet.expandMacroAsText("\\arraystretch");if(x==null)o=1;else if(o=parseFloat(x),!o||o<0)throw new F("Invalid \\arraystretch: "+x)}r.gullet.beginGroup();var D=[],E=[D],M=[],R=[],y=h!=null?[]:void 0;function w(){h&&r.gullet.macros.set("\\@eqnsw","1",!0)}function k(){y&&(r.gullet.macros.get("\\df@tag")?(y.push(r.subparse([new k0("\\df@tag")])),r.gullet.macros.set("\\df@tag",void 0,!0)):y.push(!!h&&r.gullet.macros.get("\\@eqnsw")==="1"))}for(w(),R.push(Hr(r));;){var A=r.parseExpression(!1,m?"\\end":"\\\\");r.gullet.endGroup(),r.gullet.beginGroup();var T={type:"ordgroup",mode:r.mode,body:A};t&&(T={type:"styling",mode:r.mode,style:t,resetFont:!0,body:[T]}),D.push(T);var O=r.fetch().text;if(O==="&"){if(g&&D.length===g){if(m||u)throw new F("Too many tab characters: &",r.nextToken);r.settings.reportNonstrict("textEnv","Too few columns specified in the {array} column argument.")}r.consume()}else if(O==="\\end"){k(),D.length===1&&T.type==="styling"&&T.body.length===1&&T.body[0].type==="ordgroup"&&T.body[0].body.length===0&&(E.length>1||!p)&&E.pop(),R.length0&&(w+=.25),m.push({pos:w,isDashed:ze[Ce]})}for(k(o[0]),a=0;a0&&(W+=y,Oze))for(a=0;a=u)){var L0=void 0;if(n>0||e.hskipBeforeAndAfter){var ue,re;L0=(ue=(re=w0)==null?void 0:re.pregap)!=null?ue:S,L0!==0&&(y0=C(["arraycolsep"],[]),y0.style.width=N(L0),b0.push(y0))}var Te=[];for(a=0;a0){for(var Qa=me("hline",t,p),en=me("hdashline",t,p),rt=[{type:"elem",elem:Me,shift:0}];m.length>0;){var rr=m.pop(),ar=rr.pos-Y;rr.isDashed?rt.push({type:"elem",elem:en,shift:ar}):rt.push({type:"elem",elem:Qa,shift:ar})}Me=X({positionType:"individualShift",children:rt})}if(O0.length===0)return C(["mord"],[Me],t);var tn=X({positionType:"individualShift",children:O0}),rn=C(["tag"],[tn],t);return U0([Me,rn])},us={c:"center ",l:"left ",r:"right "},B0=function(e,t){for(var a=[],n=new I("mtd",[],["mtr-glue"]),s=new I("mtd",[],["mml-eqn-num"]),o=0;o0){var D=e.cols,E="",M=!1,R=0,y=D.length;D[0].type==="separator"&&(S+="top ",R=1),D[D.length-1].type==="separator"&&(S+="bottom ",y-=1);for(var w=R;w0?"left ":"",S+=B[B.length-1].length>0?"right ":"";for(var j=1;j0&&S&&(E=1),a[x]={type:"align",align:D,pregap:E,postgap:0}}return s.colSeparationType=S?"align":"alignat",s};D0({type:"array",names:["array","darray"],props:{numArgs:1},handler(r,e){var t=Ke(e[0]),a=t?[e[0]]:G(e[0],"ordgroup").body,n=a.map(function(o){var u=Ze(o),h=u.text;if("lcr".includes(h))return{type:"align",align:h};if(h==="|")return{type:"separator",separator:"|"};if(h===":")return{type:"separator",separator:":"};throw new F("Unknown column alignment: "+h,o)}),s={cols:n,hskipBeforeAndAfter:!0,maxNumCols:n.length};return te(r.parser,s,Yt(r.envName))},htmlBuilder:N0,mathmlBuilder:B0});D0({type:"array",names:["matrix","pmatrix","bmatrix","Bmatrix","vmatrix","Vmatrix","matrix*","pmatrix*","bmatrix*","Bmatrix*","vmatrix*","Vmatrix*"],props:{numArgs:0},handler(r){var e={matrix:null,pmatrix:["(",")"],bmatrix:["[","]"],Bmatrix:["\\{","\\}"],vmatrix:["|","|"],Vmatrix:["\\Vert","\\Vert"]}[r.envName.replace("*","")],t="c",a={hskipBeforeAndAfter:!1,cols:[{type:"align",align:t}]};if(r.envName.charAt(r.envName.length-1)==="*"){var n=r.parser;if(n.consumeSpaces(),n.fetch().text==="["){if(n.consume(),n.consumeSpaces(),t=n.fetch().text,!"lcr".includes(t))throw new F("Expected l or c or r",n.nextToken);n.consume(),n.consumeSpaces(),n.expect("]"),n.consume(),a.cols=[{type:"align",align:t}]}}var s=te(r.parser,a,Yt(r.envName)),o=Math.max(0,...s.body.map(u=>u.length));return s.cols=new Array(o).fill({type:"align",align:t}),e?{type:"leftright",mode:r.mode,body:[s],left:e[0],right:e[1],rightColor:void 0}:s},htmlBuilder:N0,mathmlBuilder:B0});D0({type:"array",names:["smallmatrix"],props:{numArgs:0},handler(r){var e={arraystretch:.5},t=te(r.parser,e,"script");return t.colSeparationType="small",t},htmlBuilder:N0,mathmlBuilder:B0});D0({type:"array",names:["subarray"],props:{numArgs:1},handler(r,e){var t=Ke(e[0]),a=t?[e[0]]:G(e[0],"ordgroup").body,n=a.map(function(u){var h=Ze(u),m=h.text;if("lc".includes(m))return{type:"align",align:m};throw new F("Unknown column alignment: "+m,u)});if(n.length>1)throw new F("{subarray} can contain only one column");var s={cols:n,hskipBeforeAndAfter:!1,arraystretch:.5},o=te(r.parser,s,"script");if(o.body.length>0&&o.body[0].length>1)throw new F("{subarray} can contain only one column");return o},htmlBuilder:N0,mathmlBuilder:B0});D0({type:"array",names:["cases","dcases","rcases","drcases"],props:{numArgs:0},handler(r){var e={arraystretch:1.2,cols:[{type:"align",align:"l",pregap:0,postgap:1},{type:"align",align:"l",pregap:0,postgap:0}]},t=te(r.parser,e,Yt(r.envName));return{type:"leftright",mode:r.mode,body:[t],left:r.envName.includes("r")?".":"\\{",right:r.envName.includes("r")?"\\}":".",rightColor:void 0}},htmlBuilder:N0,mathmlBuilder:B0});D0({type:"array",names:["align","align*","aligned","split"],props:{numArgs:0},handler:Ba,htmlBuilder:N0,mathmlBuilder:B0});D0({type:"array",names:["gathered","gather","gather*"],props:{numArgs:0},handler(r){os.has(r.envName)&&et(r);var e={cols:[{type:"align",align:"c"}],addJot:!0,colSeparationType:"gather",autoTag:Wt(r.envName),emptySingleRow:!0,leqno:r.parser.settings.leqno};return te(r.parser,e,"display")},htmlBuilder:N0,mathmlBuilder:B0});D0({type:"array",names:["alignat","alignat*","alignedat"],props:{numArgs:1},handler:Ba,htmlBuilder:N0,mathmlBuilder:B0});D0({type:"array",names:["equation","equation*"],props:{numArgs:0},handler(r){et(r);var e={autoTag:Wt(r.envName),emptySingleRow:!0,singleRow:!0,maxNumCols:1,leqno:r.parser.settings.leqno};return te(r.parser,e,"display")},htmlBuilder:N0,mathmlBuilder:B0});D0({type:"array",names:["CD"],props:{numArgs:0},handler(r){return et(r),Xi(r.parser)},htmlBuilder:N0,mathmlBuilder:B0});d("\\nonumber","\\gdef\\@eqnsw{0}");d("\\notag","\\nonumber");L({type:"text",names:["\\hline","\\hdashline"],numArgs:0,allowedInText:!0,allowedInMath:!0,handler(r,e){throw new F(r.funcName+" valid only within array environment")}});var $r=Da;L({type:"environment",names:["\\begin","\\end"],numArgs:1,argTypes:["text"],handler(r,e){var{parser:t,funcName:a}=r,n=e[0];if(n.type!=="ordgroup")throw new F("Invalid environment name",n);for(var s="",o=0;o{var t=r.font,a=e.withFont(t);return V(r.body,a)},hs=(r,e)=>{var t=r.font,a=e.withFont(t);return Z(r.body,a)},_r={"\\Bbb":"\\mathbb","\\bold":"\\mathbf","\\frak":"\\mathfrak"};L({type:"font",names:["\\mathrm","\\mathit","\\mathbf","\\mathnormal","\\mathsfit","\\mathbb","\\mathcal","\\mathfrak","\\mathscr","\\mathsf","\\mathtt","\\Bbb","\\bold","\\frak"],numArgs:1,allowedInArgument:!0,handler:(r,e)=>{var{parser:t,funcName:a}=r,n=Ue(e[0]),s=a in _r?_r[a]:a;return{type:"font",mode:t.mode,font:s.slice(1),body:n}},htmlBuilder:cs,mathmlBuilder:hs});L({type:"mclass",names:["\\boldsymbol","\\bm"],numArgs:1,handler:(r,e)=>{var{parser:t}=r,a=e[0];return{type:"mclass",mode:t.mode,mclass:Je(a),body:[{type:"font",mode:t.mode,font:"boldsymbol",body:a}],isCharacterBox:_0(a)}}});L({type:"font",names:["\\rm","\\sf","\\tt","\\bf","\\it","\\cal"],numArgs:0,allowedInText:!0,handler:(r,e)=>{var{parser:t,funcName:a,breakOnTokenText:n}=r,{mode:s}=t,o=t.parseExpression(!0,n);return{type:"font",mode:s,font:"math"+a.slice(1),body:{type:"ordgroup",mode:t.mode,body:o}}}});var ds=(r,e)=>{var t=e.style,a=t.fracNum(),n=t.fracDen(),s;s=e.havingStyle(a);var o=V(r.numer,s,e);if(r.continued){var u=8.5/e.fontMetrics().ptPerEm,h=3.5/e.fontMetrics().ptPerEm;o.height=o.height0?D=3*S:D=7*S,E=e.fontMetrics().denom1):(g>0?(x=e.fontMetrics().num2,D=S):(x=e.fontMetrics().num3,D=3*S),E=e.fontMetrics().denom2);var M;if(p){var y=e.fontMetrics().axisHeight;x-o.depth-(y+.5*g){var t=new I("mfrac",[Z(r.numer,e),Z(r.denom,e)]);if(!r.hasBarLine)t.setAttribute("linethickness","0px");else if(r.barSize){var a=t0(r.barSize,e);t.setAttribute("linethickness",N(a))}if(r.leftDelim!=null||r.rightDelim!=null){var n=[];if(r.leftDelim!=null){var s=new I("mo",[new i0(r.leftDelim.replace("\\",""))]);s.setAttribute("fence","true"),n.push(s)}if(n.push(t),r.rightDelim!=null){var o=new I("mo",[new i0(r.rightDelim.replace("\\",""))]);o.setAttribute("fence","true"),n.push(o)}return jt(n)}return t},Oa=(r,e)=>{if(!e)return r;var t={type:"styling",mode:r.mode,style:e,body:[r]};return t};L({type:"genfrac",names:["\\cfrac","\\dfrac","\\frac","\\tfrac","\\dbinom","\\binom","\\tbinom","\\\\atopfrac","\\\\bracefrac","\\\\brackfrac"],numArgs:2,allowedInArgument:!0,handler:(r,e)=>{var{parser:t,funcName:a}=r,n=e[0],s=e[1],o,u=null,h=null;switch(a){case"\\cfrac":case"\\dfrac":case"\\frac":case"\\tfrac":o=!0;break;case"\\\\atopfrac":o=!1;break;case"\\dbinom":case"\\binom":case"\\tbinom":o=!1,u="(",h=")";break;case"\\\\bracefrac":o=!1,u="\\{",h="\\}";break;case"\\\\brackfrac":o=!1,u="[",h="]";break;default:throw new Error("Unrecognized genfrac command")}var m=a==="\\cfrac",p=null;return m||a.startsWith("\\d")?p="display":a.startsWith("\\t")&&(p="text"),Oa({type:"genfrac",mode:t.mode,numer:n,denom:s,continued:m,hasBarLine:o,leftDelim:u,rightDelim:h,barSize:null},p)},htmlBuilder:ds,mathmlBuilder:ms});L({type:"infix",names:["\\over","\\choose","\\atop","\\brace","\\brack"],numArgs:0,infix:!0,handler(r){var{parser:e,funcName:t,token:a}=r,n;switch(t){case"\\over":n="\\frac";break;case"\\choose":n="\\binom";break;case"\\atop":n="\\\\atopfrac";break;case"\\brace":n="\\\\bracefrac";break;case"\\brack":n="\\\\brackfrac";break;default:throw new Error("Unrecognized infix genfrac command")}return{type:"infix",mode:e.mode,replaceWith:n,token:a}}});var Gr=["display","text","script","scriptscript"],Ur=function(e){var t=null;return e.length>0&&(t=e,t=t==="."?null:t),t};L({type:"genfrac",names:["\\genfrac"],numArgs:6,allowedInArgument:!0,argTypes:["math","math","size","text","math","math"],handler(r,e){var{parser:t}=r,a=e[4],n=e[5],s=Ue(e[0]),o=s.type==="atom"&&s.family==="open"?Ur(s.text):null,u=Ue(e[1]),h=u.type==="atom"&&u.family==="close"?Ur(u.text):null,m=G(e[2],"size"),p,g=null;m.isBlank?p=!0:(g=m.value,p=g.number>0);var S=null,x=e[3];if(x.type==="ordgroup"){if(x.body.length>0){var D=G(x.body[0],"textord");S=Gr[Number(D.text)]}}else x=G(x,"textord"),S=Gr[Number(x.text)];return Oa({type:"genfrac",mode:t.mode,numer:a,denom:n,continued:!1,hasBarLine:p,barSize:g,leftDelim:o,rightDelim:h},S)}});L({type:"infix",names:["\\above"],numArgs:1,argTypes:["size"],infix:!0,handler(r,e){var{parser:t,funcName:a,token:n}=r;return{type:"infix",mode:t.mode,replaceWith:"\\\\abovefrac",size:G(e[0],"size").value,token:n}}});L({type:"genfrac",names:["\\\\abovefrac"],numArgs:3,argTypes:["math","size","math"],handler:(r,e)=>{var{parser:t,funcName:a}=r,n=e[0],s=G(e[1],"infix").size;if(!s)throw new Error("\\\\abovefrac expected size, but got "+String(s));var o=e[2],u=s.number>0;return{type:"genfrac",mode:t.mode,numer:n,denom:o,continued:!1,hasBarLine:u,barSize:s,leftDelim:null,rightDelim:null}}});var La=(r,e)=>{var t=e.style,a,n;r.type==="supsub"?(a=r.sup?V(r.sup,e.havingStyle(t.sup()),e):V(r.sub,e.havingStyle(t.sub()),e),n=G(r.base,"horizBrace")):n=G(r,"horizBrace");var s=V(n.base,e.havingBaseStyle(_.DISPLAY)),o=Ye(n,e),u;if(n.isOver?u=X({positionType:"firstBaseline",children:[{type:"elem",elem:s},{type:"kern",size:.1},{type:"elem",elem:o,wrapperClasses:["svg-align"]}]}):u=X({positionType:"bottom",positionData:s.depth+.1+o.height,children:[{type:"elem",elem:o,wrapperClasses:["svg-align"]},{type:"kern",size:.1},{type:"elem",elem:s}]}),a){var h=C(["minner",n.isOver?"mover":"munder"],[u],e);n.isOver?u=X({positionType:"firstBaseline",children:[{type:"elem",elem:h},{type:"kern",size:.2},{type:"elem",elem:a}]}):u=X({positionType:"bottom",positionData:h.depth+.2+a.height+a.depth,children:[{type:"elem",elem:a},{type:"kern",size:.2},{type:"elem",elem:h}]})}return C(["minner",n.isOver?"mover":"munder"],[u],e)},ps=(r,e)=>{var t=We(r.label);return new I(r.isOver?"mover":"munder",[Z(r.base,e),t])};L({type:"horizBrace",names:["\\overbrace","\\underbrace","\\overbracket","\\underbracket"],numArgs:1,handler(r,e){var{parser:t,funcName:a}=r;return{type:"horizBrace",mode:t.mode,label:a,isOver:a.includes("\\over"),base:e[0]}},htmlBuilder:La,mathmlBuilder:ps});L({type:"href",names:["\\href"],numArgs:2,argTypes:["url","original"],allowedInText:!0,handler:(r,e)=>{var{parser:t}=r,a=e[1],n=G(e[0],"url").url;return t.settings.isTrusted({command:"\\href",url:n})?{type:"href",mode:t.mode,href:n,body:n0(a)}:t.formatUnsupportedCmd("\\href")},htmlBuilder:(r,e)=>{var t=o0(r.body,e,!1);return bi(r.href,[],t,e)},mathmlBuilder:(r,e)=>{var t=ee(r.body,e);return t instanceof I||(t=new I("mrow",[t])),t.setAttribute("href",r.href),t}});L({type:"href",names:["\\url"],numArgs:1,argTypes:["url"],allowedInText:!0,handler:(r,e)=>{var{parser:t}=r,a=G(e[0],"url").url;if(!t.settings.isTrusted({command:"\\url",url:a}))return t.formatUnsupportedCmd("\\url");for(var n=[],s=0;s{var{parser:t,funcName:a,token:n}=r,s=G(e[0],"raw").string,o=e[1];t.settings.strict&&t.settings.reportNonstrict("htmlExtension","HTML extension is disabled on strict mode");var u,h={};switch(a){case"\\htmlClass":h.class=s,u={command:"\\htmlClass",class:s};break;case"\\htmlId":h.id=s,u={command:"\\htmlId",id:s};break;case"\\htmlStyle":h.style=s,u={command:"\\htmlStyle",style:s};break;case"\\htmlData":{for(var m=s.split(","),p=0;p{var t=o0(r.body,e,!1),a=["enclosing"];r.attributes.class&&a.push(...r.attributes.class.trim().split(/\s+/));var n=C(a,t,e);for(var s in r.attributes)s!=="class"&&r.attributes.hasOwnProperty(s)&&n.setAttribute(s,r.attributes[s]);return n},mathmlBuilder:(r,e)=>ee(r.body,e)});L({type:"htmlmathml",names:["\\html@mathml"],numArgs:2,allowedInArgument:!0,allowedInText:!0,handler:(r,e)=>{var{parser:t}=r;return{type:"htmlmathml",mode:t.mode,html:n0(e[0]),mathml:n0(e[1])}},htmlBuilder:(r,e)=>{var t=o0(r.html,e,!1);return U0(t)},mathmlBuilder:(r,e)=>ee(r.mathml,e)});var vt=function(e){if(/^[-+]? *(\d+(\.\d*)?|\.\d+)$/.test(e))return{number:+e,unit:"bp"};var t=/([-+]?) *(\d+(?:\.\d*)?|\.\d+) *([a-z]{2})/.exec(e);if(!t)throw new F("Invalid size: '"+e+"' in \\includegraphics");var a={number:+(t[1]+t[2]),unit:t[3]};if(!sa(a))throw new F("Invalid unit: '"+a.unit+"' in \\includegraphics.");return a};L({type:"includegraphics",names:["\\includegraphics"],numArgs:1,numOptionalArgs:1,argTypes:["raw","url"],allowedInText:!1,handler:(r,e,t)=>{var{parser:a}=r,n={number:0,unit:"em"},s={number:.9,unit:"em"},o={number:0,unit:"em"},u="";if(t[0])for(var h=G(t[0],"raw").string,m=h.split(","),p=0;p{var t=t0(r.height,e),a=0;r.totalheight.number>0&&(a=t0(r.totalheight,e)-t);var n=0;r.width.number>0&&(n=t0(r.width,e));var s={height:N(t+a)};n>0&&(s.width=N(n)),a>0&&(s.verticalAlign=N(-a));var o=new si(r.src,r.alt,s);return o.height=t,o.depth=a,o},mathmlBuilder:(r,e)=>{var t=new I("mglyph",[]);t.setAttribute("alt",r.alt);var a=t0(r.height,e),n=0;if(r.totalheight.number>0&&(n=t0(r.totalheight,e)-a,t.setAttribute("valign",N(-n))),t.setAttribute("height",N(a+n)),r.width.number>0){var s=t0(r.width,e);t.setAttribute("width",N(s))}return t.setAttribute("src",r.src),t}});L({type:"kern",names:["\\kern","\\mkern","\\hskip","\\mskip"],numArgs:1,argTypes:["size"],primitive:!0,allowedInText:!0,handler(r,e){var{parser:t,funcName:a}=r,n=G(e[0],"size");if(t.settings.strict){var s=a[1]==="m",o=n.value.unit==="mu";s?(o||t.settings.reportNonstrict("mathVsTextUnits","LaTeX's "+a+" supports only mu units, "+("not "+n.value.unit+" units")),t.mode!=="math"&&t.settings.reportNonstrict("mathVsTextUnits","LaTeX's "+a+" works only in math mode")):o&&t.settings.reportNonstrict("mathVsTextUnits","LaTeX's "+a+" doesn't support mu units")}return{type:"kern",mode:t.mode,dimension:n.value}},htmlBuilder(r,e){return da(r.dimension,e)},mathmlBuilder(r,e){var t=t0(r.dimension,e);return new ba(t)}});L({type:"lap",names:["\\mathllap","\\mathrlap","\\mathclap"],numArgs:1,allowedInText:!0,handler:(r,e)=>{var{parser:t,funcName:a}=r,n=e[0];return{type:"lap",mode:t.mode,alignment:a.slice(5),body:n}},htmlBuilder:(r,e)=>{var t;r.alignment==="clap"?(t=C([],[V(r.body,e)]),t=C(["inner"],[t],e)):t=C(["inner"],[V(r.body,e)]);var a=C(["fix"],[]),n=C([r.alignment],[t,a],e),s=C(["strut"]);return s.style.height=N(n.height+n.depth),n.depth&&(s.style.verticalAlign=N(-n.depth)),n.children.unshift(s),n=C(["thinbox"],[n],e),C(["mord","vbox"],[n],e)},mathmlBuilder:(r,e)=>{var t=new I("mpadded",[Z(r.body,e)]);if(r.alignment!=="rlap"){var a=r.alignment==="llap"?"-1":"-0.5";t.setAttribute("lspace",a+"width")}return t.setAttribute("width","0px"),t}});L({type:"styling",names:["\\(","$"],numArgs:0,allowedInText:!0,allowedInMath:!1,handler(r,e){var{funcName:t,parser:a}=r,n=a.mode;a.switchMode("math");var s=t==="\\("?"\\)":"$",o=a.parseExpression(!1,s);return a.expect(s),a.switchMode(n),{type:"styling",mode:a.mode,style:"text",resetFont:!0,body:o}}});L({type:"text",names:["\\)","\\]"],numArgs:0,allowedInText:!0,allowedInMath:!1,handler(r,e){throw new F("Mismatched "+r.funcName)}});var jr=(r,e)=>{switch(e.style.size){case _.DISPLAY.size:return r.display;case _.TEXT.size:return r.text;case _.SCRIPT.size:return r.script;case _.SCRIPTSCRIPT.size:return r.scriptscript;default:return r.text}};L({type:"mathchoice",names:["\\mathchoice"],numArgs:4,primitive:!0,handler:(r,e)=>{var{parser:t}=r;return{type:"mathchoice",mode:t.mode,display:n0(e[0]),text:n0(e[1]),script:n0(e[2]),scriptscript:n0(e[3])}},htmlBuilder:(r,e)=>{var t=jr(r,e),a=o0(t,e,!1);return U0(a)},mathmlBuilder:(r,e)=>{var t=jr(r,e);return ee(t,e)}});var qa=(r,e,t,a,n,s,o)=>{r=C([],[r]);var u=t&&_0(t),h,m;if(e){var p=V(e,a.havingStyle(n.sup()),a);m={elem:p,kern:Math.max(a.fontMetrics().bigOpSpacing1,a.fontMetrics().bigOpSpacing3-p.depth)}}if(t){var g=V(t,a.havingStyle(n.sub()),a);h={elem:g,kern:Math.max(a.fontMetrics().bigOpSpacing2,a.fontMetrics().bigOpSpacing4-g.height)}}var S;if(m&&h){var x=a.fontMetrics().bigOpSpacing5+h.elem.height+h.elem.depth+h.kern+r.depth+o;S=X({positionType:"bottom",positionData:x,children:[{type:"kern",size:a.fontMetrics().bigOpSpacing5},{type:"elem",elem:h.elem,marginLeft:N(-s)},{type:"kern",size:h.kern},{type:"elem",elem:r},{type:"kern",size:m.kern},{type:"elem",elem:m.elem,marginLeft:N(s)},{type:"kern",size:a.fontMetrics().bigOpSpacing5}]})}else if(h){var D=r.height-o;S=X({positionType:"top",positionData:D,children:[{type:"kern",size:a.fontMetrics().bigOpSpacing5},{type:"elem",elem:h.elem,marginLeft:N(-s)},{type:"kern",size:h.kern},{type:"elem",elem:r}]})}else if(m){var E=r.depth+o;S=X({positionType:"bottom",positionData:E,children:[{type:"elem",elem:r},{type:"kern",size:m.kern},{type:"elem",elem:m.elem,marginLeft:N(s)},{type:"kern",size:a.fontMetrics().bigOpSpacing5}]})}else return r;var M=[S];if(h&&s!==0&&!u){var R=C(["mspace"],[],a);R.style.marginRight=N(s),M.unshift(R)}return C(["mop","op-limits"],M,a)},Pa=new Set(["\\smallint"]),Ha=(r,e)=>{var t,a,n=!1,s;r.type==="supsub"?(t=r.sup,a=r.sub,s=G(r.base,"op"),n=!0):s=G(r,"op");var o=e.style,u=!1;o.size===_.DISPLAY.size&&s.symbol&&!Pa.has(s.name)&&(u=!0);var h,m;if(s.symbol){var p=u?"Size2-Regular":"Size1-Regular",g="";if((s.name==="\\oiint"||s.name==="\\oiiint")&&(g=s.name.slice(1),s.name=g==="oiint"?"\\iint":"\\iiint"),h=m0(s.name,p,"math",e,["mop","op-symbol",u?"large-op":"small-op"]),m=h.italic,g.length>0){var S=pa(g+"Size"+(u?"2":"1"),e);h=X({positionType:"individualShift",children:[{type:"elem",elem:h,shift:0},{type:"elem",elem:S,shift:u?.08:0}]}),s.name="\\"+g,h.classes.unshift("mop"),h.italic=m}}else if(s.body){var x=o0(s.body,e,!0);x.length===1&&x[0]instanceof A0?(h=x[0],h.classes[0]="mop"):h=C(["mop"],x,e)}else{for(var D=[],E=1;E{var t;if(r.symbol)t=new I("mo",[z0(r.name,r.mode)]),Pa.has(r.name)&&t.setAttribute("largeop","false");else if(r.body)t=new I("mo",E0(r.body,e));else{t=new I("mi",[new i0(r.name.slice(1))]);var a=new I("mo",[z0("⁡","text")]);r.parentIsSupSub?t=new I("mrow",[t,a]):t=ga([t,a])}return t},vs={"∏":"\\prod","∐":"\\coprod","∑":"\\sum","⋀":"\\bigwedge","⋁":"\\bigvee","⋂":"\\bigcap","⋃":"\\bigcup","⨀":"\\bigodot","⨁":"\\bigoplus","⨂":"\\bigotimes","⨄":"\\biguplus","⨆":"\\bigsqcup"};L({type:"op",names:["\\coprod","\\bigvee","\\bigwedge","\\biguplus","\\bigcap","\\bigcup","\\intop","\\prod","\\sum","\\bigotimes","\\bigoplus","\\bigodot","\\bigsqcup","\\smallint","∏","∐","∑","⋀","⋁","⋂","⋃","⨀","⨁","⨂","⨄","⨆"],numArgs:0,handler:(r,e)=>{var{parser:t,funcName:a}=r,n=a;return n.length===1&&(n=vs[n]),{type:"op",mode:t.mode,limits:!0,parentIsSupSub:!1,symbol:!0,name:n}},htmlBuilder:Ha,mathmlBuilder:fs});L({type:"op",names:["\\mathop"],numArgs:1,primitive:!0,handler:(r,e)=>{var{parser:t}=r,a=e[0];return{type:"op",mode:t.mode,limits:!1,parentIsSupSub:!1,symbol:!1,body:n0(a)}}});var gs={"∫":"\\int","∬":"\\iint","∭":"\\iiint","∮":"\\oint","∯":"\\oiint","∰":"\\oiiint"};L({type:"op",names:["\\arcsin","\\arccos","\\arctan","\\arctg","\\arcctg","\\arg","\\ch","\\cos","\\cosec","\\cosh","\\cot","\\cotg","\\coth","\\csc","\\ctg","\\cth","\\deg","\\dim","\\exp","\\hom","\\ker","\\lg","\\ln","\\log","\\sec","\\sin","\\sinh","\\sh","\\tan","\\tanh","\\tg","\\th"],numArgs:0,handler(r){var{parser:e,funcName:t}=r;return{type:"op",mode:e.mode,limits:!1,parentIsSupSub:!1,symbol:!1,name:t}}});L({type:"op",names:["\\det","\\gcd","\\inf","\\lim","\\max","\\min","\\Pr","\\sup"],numArgs:0,handler(r){var{parser:e,funcName:t}=r;return{type:"op",mode:e.mode,limits:!0,parentIsSupSub:!1,symbol:!1,name:t}}});L({type:"op",names:["\\int","\\iint","\\iiint","\\oint","\\oiint","\\oiiint","∫","∬","∭","∮","∯","∰"],numArgs:0,allowedInArgument:!0,handler(r){var{parser:e,funcName:t}=r,a=t;return a.length===1&&(a=gs[a]),{type:"op",mode:e.mode,limits:!1,parentIsSupSub:!1,symbol:!0,name:a}}});var $a=(r,e)=>{var t,a,n=!1,s;r.type==="supsub"?(t=r.sup,a=r.sub,s=G(r.base,"operatorname"),n=!0):s=G(r,"operatorname");var o;if(s.body.length>0){for(var u=s.body.map(g=>{var S="text"in g?g.text:void 0;return typeof S=="string"?{type:"textord",mode:g.mode,text:S}:g}),h=o0(u,e.withFont("mathrm"),!0),m=0;m{for(var t=E0(r.body,e.withFont("mathrm")),a=!0,n=0;np.toText()).join("");t=[new i0(u)]}var h=new I("mi",t);h.setAttribute("mathvariant","normal");var m=new I("mo",[z0("⁡","text")]);return r.parentIsSupSub?new I("mrow",[h,m]):ga([h,m])};L({type:"operatorname",names:["\\operatorname@","\\operatornamewithlimits"],numArgs:1,handler:(r,e)=>{var{parser:t,funcName:a}=r,n=e[0];return{type:"operatorname",mode:t.mode,body:n0(n),alwaysHandleSupSub:a==="\\operatornamewithlimits",limits:!1,parentIsSupSub:!1}},htmlBuilder:$a,mathmlBuilder:bs});d("\\operatorname","\\@ifstar\\operatornamewithlimits\\operatorname@");se({type:"ordgroup",htmlBuilder(r,e){return r.semisimple?U0(o0(r.body,e,!1)):C(["mord"],o0(r.body,e,!0),e)},mathmlBuilder(r,e){return ee(r.body,e,!0)}});L({type:"overline",names:["\\overline"],numArgs:1,handler(r,e){var{parser:t}=r,a=e[0];return{type:"overline",mode:t.mode,body:a}},htmlBuilder(r,e){var t=V(r.body,e.havingCrampedStyle()),a=me("overline-line",e),n=e.fontMetrics().defaultRuleThickness,s=X({positionType:"firstBaseline",children:[{type:"elem",elem:t},{type:"kern",size:3*n},{type:"elem",elem:a},{type:"kern",size:n}]});return C(["mord","overline"],[s],e)},mathmlBuilder(r,e){var t=new I("mo",[new i0("‾")]);t.setAttribute("stretchy","true");var a=new I("mover",[Z(r.body,e),t]);return a.setAttribute("accent","true"),a}});L({type:"phantom",names:["\\phantom"],numArgs:1,allowedInText:!0,handler:(r,e)=>{var{parser:t}=r,a=e[0];return{type:"phantom",mode:t.mode,body:n0(a)}},htmlBuilder:(r,e)=>{var t=o0(r.body,e.withPhantom(),!1);return U0(t)},mathmlBuilder:(r,e)=>{var t=E0(r.body,e);return new I("mphantom",t)}});d("\\hphantom","\\smash{\\phantom{#1}}");L({type:"vphantom",names:["\\vphantom"],numArgs:1,allowedInText:!0,handler:(r,e)=>{var{parser:t}=r,a=e[0];return{type:"vphantom",mode:t.mode,body:a}},htmlBuilder:(r,e)=>{var t=C(["inner"],[V(r.body,e.withPhantom())]),a=C(["fix"],[]);return C(["mord","rlap"],[t,a],e)},mathmlBuilder:(r,e)=>{var t=E0(n0(r.body),e),a=new I("mphantom",t),n=new I("mpadded",[a]);return n.setAttribute("width","0px"),n}});L({type:"raisebox",names:["\\raisebox"],numArgs:2,argTypes:["size","hbox"],allowedInText:!0,handler(r,e){var{parser:t}=r,a=G(e[0],"size").value,n=e[1];return{type:"raisebox",mode:t.mode,dy:a,body:n}},htmlBuilder(r,e){var t=V(r.body,e),a=t0(r.dy,e);return X({positionType:"shift",positionData:-a,children:[{type:"elem",elem:t}]})},mathmlBuilder(r,e){var t=new I("mpadded",[Z(r.body,e)]),a=r.dy.number+r.dy.unit;return t.setAttribute("voffset",a),t}});L({type:"internal",names:["\\relax"],numArgs:0,allowedInText:!0,allowedInArgument:!0,handler(r){var{parser:e}=r;return{type:"internal",mode:e.mode}}});L({type:"rule",names:["\\rule"],numArgs:2,numOptionalArgs:1,allowedInText:!0,allowedInMath:!0,argTypes:["size","size","size"],handler(r,e,t){var{parser:a}=r,n=t[0],s=G(e[0],"size"),o=G(e[1],"size");return{type:"rule",mode:a.mode,shift:n&&G(n,"size").value,width:s.value,height:o.value}},htmlBuilder(r,e){var t=C(["mord","rule"],[],e),a=t0(r.width,e),n=t0(r.height,e),s=r.shift?t0(r.shift,e):0;return t.style.borderRightWidth=N(a),t.style.borderTopWidth=N(n),t.style.bottom=N(s),t.width=a,t.height=n+s,t.depth=-s,t.maxFontSize=n*1.125*e.sizeMultiplier,t},mathmlBuilder(r,e){var t=t0(r.width,e),a=t0(r.height,e),n=r.shift?t0(r.shift,e):0,s=e.color&&e.getColor()||"black",o=new I("mspace");o.setAttribute("mathbackground",s),o.setAttribute("width",N(t)),o.setAttribute("height",N(a));var u=new I("mpadded",[o]);return n>=0?u.setAttribute("height",N(n)):(u.setAttribute("height",N(n)),u.setAttribute("depth",N(-n))),u.setAttribute("voffset",N(n)),u}});function _a(r,e,t){for(var a=o0(r,e,!1),n=e.sizeMultiplier/t.sizeMultiplier,s=0;s{var t=e.havingSize(r.size);return _a(r.body,t,e)};L({type:"sizing",names:Xr,numArgs:0,allowedInText:!0,handler:(r,e)=>{var{breakOnTokenText:t,funcName:a,parser:n}=r,s=n.parseExpression(!1,t);return{type:"sizing",mode:n.mode,size:Xr.indexOf(a)+1,body:s}},htmlBuilder:ys,mathmlBuilder:(r,e)=>{var t=e.havingSize(r.size),a=E0(r.body,t),n=new I("mstyle",a);return n.setAttribute("mathsize",N(t.sizeMultiplier)),n}});L({type:"smash",names:["\\smash"],numArgs:1,numOptionalArgs:1,allowedInText:!0,handler:(r,e,t)=>{var{parser:a}=r,n=!1,s=!1,o=t[0]&&G(t[0],"ordgroup");if(o)for(var u,h=0;h{var t=C([],[V(r.body,e)]);if(!r.smashHeight&&!r.smashDepth)return t;if(r.smashHeight&&(t.height=0),r.smashDepth&&(t.depth=0),r.smashHeight&&r.smashDepth)return C(["mord","smash"],[t],e);if(t.children)for(var a=0;a{var t=new I("mpadded",[Z(r.body,e)]);return r.smashHeight&&t.setAttribute("height","0px"),r.smashDepth&&t.setAttribute("depth","0px"),t}});L({type:"sqrt",names:["\\sqrt"],numArgs:1,numOptionalArgs:1,handler(r,e,t){var{parser:a}=r,n=t[0],s=e[0];return{type:"sqrt",mode:a.mode,body:s,index:n}},htmlBuilder(r,e){var t=V(r.body,e.havingCrampedStyle());t.height===0&&(t.height=e.fontMetrics().xHeight),t=pe(t,e);var a=e.fontMetrics(),n=a.defaultRuleThickness,s=n;e.style.id<_.TEXT.id&&(s=e.fontMetrics().xHeight);var o=n+s/4,u=t.height+t.depth+o+n,{span:h,ruleWidth:m,advanceWidth:p}=es(u,e),g=h.height-m;g>t.height+t.depth+o&&(o=(o+g-t.height-t.depth)/2);var S=h.height-t.height-o-m;t.style.paddingLeft=N(p);var x=X({positionType:"firstBaseline",children:[{type:"elem",elem:t,wrapperClasses:["svg-align"]},{type:"kern",size:-(t.height+S)},{type:"elem",elem:h},{type:"kern",size:m}]});if(r.index){var D=e.havingStyle(_.SCRIPTSCRIPT),E=V(r.index,D,e),M=.6*(x.height-x.depth),R=X({positionType:"shift",positionData:-M,children:[{type:"elem",elem:E}]}),y=C(["root"],[R]);return C(["mord","sqrt"],[y,x],e)}else return C(["mord","sqrt"],[x],e)},mathmlBuilder(r,e){var{body:t,index:a}=r;return a?new I("mroot",[Z(t,e),Z(a,e)]):new I("msqrt",[Z(t,e)])}});var Lt={display:_.DISPLAY,text:_.TEXT,script:_.SCRIPT,scriptscript:_.SCRIPTSCRIPT};function xs(r){return r in Lt}L({type:"styling",names:["\\displaystyle","\\textstyle","\\scriptstyle","\\scriptscriptstyle"],numArgs:0,allowedInText:!0,primitive:!0,handler(r,e){var{breakOnTokenText:t,funcName:a,parser:n}=r,s=n.parseExpression(!0,t),o=a.slice(1,a.length-5);if(!xs(o))throw new Error("Unknown style: "+o);return{type:"styling",mode:n.mode,style:o,body:s}},htmlBuilder(r,e){var t=Lt[r.style],a=e.havingStyle(t);return r.resetFont&&(a=a.withFont("")),_a(r.body,a,e)},mathmlBuilder(r,e){var t=Lt[r.style],a=e.havingStyle(t);r.resetFont&&(a=a.withFont(""));var n=E0(r.body,a),s=new I("mstyle",n),o={display:["0","true"],text:["0","false"],script:["1","false"],scriptscript:["2","false"]},u=o[r.style];return s.setAttribute("scriptlevel",u[0]),s.setAttribute("displaystyle",u[1]),s}});var ws=function(e,t){var a=e.base;if(a)if(a.type==="op"){var n=a.limits&&(t.style.size===_.DISPLAY.size||a.alwaysHandleSupSub);return n?Ha:null}else if(a.type==="operatorname"){var s=a.alwaysHandleSupSub&&(t.style.size===_.DISPLAY.size||a.limits);return s?$a:null}else{if(a.type==="accent")return _0(a.base)?Sa:null;if(a.type==="horizBrace"){var o=!e.sub;return o===a.isOver?La:null}else return null}else return null};se({type:"supsub",htmlBuilder(r,e){var t=ws(r,e);if(t)return t(r,e);var{base:a,sup:n,sub:s}=r,o=V(a,e),u,h,m=e.fontMetrics(),p=0,g=0,S=a&&_0(a);if(n){var x=e.havingStyle(e.style.sup());u=V(n,x,e),S||(p=o.height-x.fontMetrics().supDrop*x.sizeMultiplier/e.sizeMultiplier)}if(s){var D=e.havingStyle(e.style.sub());h=V(s,D,e),S||(g=o.depth+D.fontMetrics().subDrop*D.sizeMultiplier/e.sizeMultiplier)}var E;e.style===_.DISPLAY?E=m.sup1:e.style.cramped?E=m.sup3:E=m.sup2;var M=e.sizeMultiplier,R=N(.5/m.ptPerEm/M),y=null;if(h){var w=r.base&&r.base.type==="op"&&r.base.name&&(r.base.name==="\\oiint"||r.base.name==="\\oiiint");if(o instanceof A0||w){var k;y=N(-((k=o.italic)!=null?k:0))}}var A;if(u&&h){p=Math.max(p,E,u.depth+.25*m.xHeight),g=Math.max(g,m.sub2);var T=m.defaultRuleThickness,O=4*T;if(p-u.depth-(h.height-g)0&&(p+=P,g-=P)}var B=[{type:"elem",elem:h,shift:g,marginRight:R,marginLeft:y},{type:"elem",elem:u,shift:-p,marginRight:R}];A=X({positionType:"individualShift",children:B})}else if(h){g=Math.max(g,m.sub1,h.height-.8*m.xHeight);var j=[{type:"elem",elem:h,marginLeft:y,marginRight:R}];A=X({positionType:"shift",positionData:g,children:j})}else if(u)p=Math.max(p,E,u.depth+.25*m.xHeight),A=X({positionType:"shift",positionData:-p,children:[{type:"elem",elem:u,marginRight:R}]});else throw new Error("supsub must have either sup or sub.");var W=It(o,"right")||"mord";return C([W],[o,C(["msupsub"],[A])],e)},mathmlBuilder(r,e){var t=!1,a,n;r.base&&r.base.type==="horizBrace"&&(n=!!r.sup,n===r.base.isOver&&(t=!0,a=r.base.isOver)),r.base&&(r.base.type==="op"||r.base.type==="operatorname")&&(r.base.parentIsSupSub=!0);var s=[Z(r.base,e)];r.sub&&s.push(Z(r.sub,e)),r.sup&&s.push(Z(r.sup,e));var o;if(t)o=a?"mover":"munder";else if(r.sub)if(r.sup){var m=r.base;m&&m.type==="op"&&m.limits&&e.style===_.DISPLAY||m&&m.type==="operatorname"&&m.alwaysHandleSupSub&&(e.style===_.DISPLAY||m.limits)?o="munderover":o="msubsup"}else{var h=r.base;h&&h.type==="op"&&h.limits&&(e.style===_.DISPLAY||h.alwaysHandleSupSub)||h&&h.type==="operatorname"&&h.alwaysHandleSupSub&&(h.limits||e.style===_.DISPLAY)?o="munder":o="msub"}else{var u=r.base;u&&u.type==="op"&&u.limits&&(e.style===_.DISPLAY||u.alwaysHandleSupSub)||u&&u.type==="operatorname"&&u.alwaysHandleSupSub&&(u.limits||e.style===_.DISPLAY)?o="mover":o="msup"}return new I(o,s)}});se({type:"atom",htmlBuilder(r,e){return Gt(r.text,r.mode,e,["m"+r.family])},mathmlBuilder(r,e){var t=new I("mo",[z0(r.text,r.mode)]);if(r.family==="bin"){var a=Xt(r,e);a==="bold-italic"&&t.setAttribute("mathvariant",a)}else r.family==="punct"?t.setAttribute("separator","true"):(r.family==="open"||r.family==="close")&&t.setAttribute("stretchy","false");return t}});var Ga={mi:"italic",mn:"normal",mtext:"normal"};se({type:"mathord",htmlBuilder(r,e){return Ve(r,e)},mathmlBuilder(r,e){var t=new I("mi",[z0(r.text,r.mode,e)]),a=Xt(r,e)||"italic";return a!==Ga[t.type]&&t.setAttribute("mathvariant",a),t}});se({type:"textord",htmlBuilder(r,e){return Ve(r,e)},mathmlBuilder(r,e){var t=z0(r.text,r.mode,e),a=Xt(r,e)||"normal",n;return r.mode==="text"?n=new I("mtext",[t]):/[0-9]/.test(r.text)?n=new I("mn",[t]):r.text==="\\prime"?n=new I("mo",[t]):n=new I("mi",[t]),a!==Ga[n.type]&&n.setAttribute("mathvariant",a),n}});var gt={"\\nobreak":"nobreak","\\allowbreak":"allowbreak"},bt={" ":{},"\\ ":{},"~":{className:"nobreak"},"\\space":{},"\\nobreakspace":{className:"nobreak"}};se({type:"spacing",htmlBuilder(r,e){if(bt.hasOwnProperty(r.text)){var t=bt[r.text].className||"";if(r.mode==="text"){var a=Ve(r,e);return a.classes.push(t),a}else return C(["mspace",t],[Gt(r.text,r.mode,e)],e)}else{if(gt.hasOwnProperty(r.text))return C(["mspace",gt[r.text]],[],e);throw new F('Unknown type of space "'+r.text+'"')}},mathmlBuilder(r,e){var t;if(bt.hasOwnProperty(r.text))t=new I("mtext",[new i0(" ")]);else{if(gt.hasOwnProperty(r.text))return new I("mspace");throw new F('Unknown type of space "'+r.text+'"')}return t}});var Vr=()=>{var r=new I("mtd",[]);return r.setAttribute("width","50%"),r};se({type:"tag",mathmlBuilder(r,e){var t=new I("mtable",[new I("mtr",[Vr(),new I("mtd",[ee(r.body,e)]),Vr(),new I("mtd",[ee(r.tag,e)])])]);return t.setAttribute("width","100%"),t}});var Wr={"\\text":void 0,"\\textrm":"textrm","\\textsf":"textsf","\\texttt":"texttt","\\textnormal":"textrm"},Yr={"\\textbf":"textbf","\\textmd":"textmd"},Ss={"\\textit":"textit","\\textup":"textup"},Zr=(r,e)=>{var t=r.font;if(t){if(Wr[t])return e.withTextFontFamily(Wr[t]);if(Yr[t])return e.withTextFontWeight(Yr[t]);if(t==="\\emph")return e.fontShape==="textit"?e.withTextFontShape("textup"):e.withTextFontShape("textit")}else return e;return e.withTextFontShape(Ss[t])};L({type:"text",names:["\\text","\\textrm","\\textsf","\\texttt","\\textnormal","\\textbf","\\textmd","\\textit","\\textup","\\emph"],numArgs:1,argTypes:["text"],allowedInArgument:!0,allowedInText:!0,handler(r,e){var{parser:t,funcName:a}=r,n=e[0];return{type:"text",mode:t.mode,body:n0(n),font:a}},htmlBuilder(r,e){var t=Zr(r,e),a=o0(r.body,t,!0);return C(["mord","text"],a,t)},mathmlBuilder(r,e){var t=Zr(r,e);return ee(r.body,t)}});L({type:"underline",names:["\\underline"],numArgs:1,allowedInText:!0,handler(r,e){var{parser:t}=r;return{type:"underline",mode:t.mode,body:e[0]}},htmlBuilder(r,e){var t=V(r.body,e),a=me("underline-line",e),n=e.fontMetrics().defaultRuleThickness,s=X({positionType:"top",positionData:t.height,children:[{type:"kern",size:n},{type:"elem",elem:a},{type:"kern",size:3*n},{type:"elem",elem:t}]});return C(["mord","underline"],[s],e)},mathmlBuilder(r,e){var t=new I("mo",[new i0("‾")]);t.setAttribute("stretchy","true");var a=new I("munder",[Z(r.body,e),t]);return a.setAttribute("accentunder","true"),a}});L({type:"vcenter",names:["\\vcenter"],numArgs:1,argTypes:["original"],allowedInText:!1,handler(r,e){var{parser:t}=r;return{type:"vcenter",mode:t.mode,body:e[0]}},htmlBuilder(r,e){var t=V(r.body,e),a=e.fontMetrics().axisHeight,n=.5*(t.height-a-(t.depth+a));return X({positionType:"shift",positionData:n,children:[{type:"elem",elem:t}]})},mathmlBuilder(r,e){var t=new I("mpadded",[Z(r.body,e)],["vcenter"]);return new I("mrow",[t])}});L({type:"verb",names:["\\verb"],numArgs:0,allowedInText:!0,handler(r,e,t){throw new F("\\verb ended by end of line instead of matching delimiter")},htmlBuilder(r,e){for(var t=Kr(r),a=[],n=e.havingStyle(e.style.text()),s=0;sr.body.replace(/ /g,r.star?"␣":" "),Z0=fa,Ua=`[ \r + ]`,ks="\\\\[a-zA-Z@]+",As="\\\\[^\uD800-\uDFFF]",Ts="("+ks+")"+Ua+"*",Es=`\\\\( +|[ \r ]+ +?)[ \r ]*`,qt="[̀-ͯ]",Ms=new RegExp(qt+"+$"),zs="("+Ua+"+)|"+(Es+"|")+"([!-\\[\\]-‧‪-퟿豈-￿]"+(qt+"*")+"|[\uD800-\uDBFF][\uDC00-\uDFFF]"+(qt+"*")+"|\\\\verb\\*([^]).*?\\4|\\\\verb([^*a-zA-Z]).*?\\5"+("|"+Ts)+("|"+As+")");class Jr{constructor(e,t){this.input=void 0,this.settings=void 0,this.tokenRegex=void 0,this.catcodes=void 0,this.input=e,this.settings=t,this.tokenRegex=new RegExp(zs,"g"),this.catcodes={"%":14,"~":13}}setCatcode(e,t){this.catcodes[e]=t}lex(){var e=this.input,t=this.tokenRegex.lastIndex;if(t===e.length)return new k0("EOF",new g0(this,t,t));var a=this.tokenRegex.exec(e);if(a===null||a.index!==t)throw new F("Unexpected character: '"+e[t]+"'",new k0(e[t],new g0(this,t,t+1)));var n=a[6]||a[3]||(a[2]?"\\ ":" ");if(this.catcodes[n]===14){var s=e.indexOf(` +`,this.tokenRegex.lastIndex);return s===-1?(this.tokenRegex.lastIndex=e.length,this.settings.reportNonstrict("commentAtEnd","% comment has no terminating newline; LaTeX would fail because of commenting the end of math mode (e.g. $)")):this.tokenRegex.lastIndex=s+1,this.lex()}return new k0(n,new g0(this,t,this.tokenRegex.lastIndex))}}class Cs{constructor(e,t){e===void 0&&(e={}),t===void 0&&(t={}),this.current=void 0,this.builtins=void 0,this.undefStack=void 0,this.current=t,this.builtins=e,this.undefStack=[]}beginGroup(){this.undefStack.push({})}endGroup(){if(this.undefStack.length===0)throw new F("Unbalanced namespace destruction: attempt to pop global namespace; please report this as a bug");var e=this.undefStack.pop();for(var t in e)e.hasOwnProperty(t)&&(e[t]==null?delete this.current[t]:this.current[t]=e[t])}endGroups(){for(;this.undefStack.length>0;)this.endGroup()}has(e){return this.current.hasOwnProperty(e)||this.builtins.hasOwnProperty(e)}get(e){return this.current.hasOwnProperty(e)?this.current[e]:this.builtins[e]}set(e,t,a){if(a===void 0&&(a=!1),a){for(var n=0;n0&&(this.undefStack[this.undefStack.length-1][e]=t)}else{var s=this.undefStack[this.undefStack.length-1];s&&!s.hasOwnProperty(e)&&(s[e]=this.current[e])}t==null?delete this.current[e]:this.current[e]=t}}var Rs=Na;d("\\noexpand",function(r){var e=r.popToken();return r.isExpandable(e.text)&&(e.noexpand=!0,e.treatAsRelax=!0),{tokens:[e],numArgs:0}});d("\\expandafter",function(r){var e=r.popToken();return r.expandOnce(!0),{tokens:[e],numArgs:0}});d("\\@firstoftwo",function(r){var e=r.consumeArgs(2);return{tokens:e[0],numArgs:0}});d("\\@secondoftwo",function(r){var e=r.consumeArgs(2);return{tokens:e[1],numArgs:0}});d("\\@ifnextchar",function(r){var e=r.consumeArgs(3);r.consumeSpaces();var t=r.future();return e[0].length===1&&e[0][0].text===t.text?{tokens:e[1],numArgs:0}:{tokens:e[2],numArgs:0}});d("\\@ifstar","\\@ifnextchar *{\\@firstoftwo{#1}}");d("\\TextOrMath",function(r){var e=r.consumeArgs(2);return r.mode==="text"?{tokens:e[0],numArgs:0}:{tokens:e[1],numArgs:0}});var Qr={0:0,1:1,2:2,3:3,4:4,5:5,6:6,7:7,8:8,9:9,a:10,A:10,b:11,B:11,c:12,C:12,d:13,D:13,e:14,E:14,f:15,F:15};d("\\char",function(r){var e=r.popToken(),t,a=0;if(e.text==="'")t=8,e=r.popToken();else if(e.text==='"')t=16,e=r.popToken();else if(e.text==="`")if(e=r.popToken(),e.text[0]==="\\")a=e.text.charCodeAt(1);else{if(e.text==="EOF")throw new F("\\char` missing argument");a=e.text.charCodeAt(0)}else t=10;if(t){if(a=Qr[e.text],a==null||a>=t)throw new F("Invalid base-"+t+" digit "+e.text);for(var n;(n=Qr[r.future().text])!=null&&n{var n=r.consumeArg().tokens;if(n.length!==1)throw new F("\\newcommand's first argument must be a macro name");var s=n[0].text,o=r.isDefined(s);if(o&&!e)throw new F("\\newcommand{"+s+"} attempting to redefine "+(s+"; use \\renewcommand"));if(!o&&!t)throw new F("\\renewcommand{"+s+"} when command "+s+" does not yet exist; use \\newcommand");var u=0;if(n=r.consumeArg().tokens,n.length===1&&n[0].text==="["){for(var h="",m=r.expandNextToken();m.text!=="]"&&m.text!=="EOF";)h+=m.text,m=r.expandNextToken();if(!h.match(/^\s*[0-9]+\s*$/))throw new F("Invalid number of arguments: "+h);u=parseInt(h),n=r.consumeArg().tokens}return o&&a||r.macros.set(s,{tokens:n,numArgs:u}),""};d("\\newcommand",r=>Zt(r,!1,!0,!1));d("\\renewcommand",r=>Zt(r,!0,!1,!1));d("\\providecommand",r=>Zt(r,!0,!0,!0));d("\\message",r=>{var e=r.consumeArgs(1)[0];return console.log(e.reverse().map(t=>t.text).join("")),""});d("\\errmessage",r=>{var e=r.consumeArgs(1)[0];return console.error(e.reverse().map(t=>t.text).join("")),""});d("\\show",r=>{var e=r.popToken(),t=e.text;return console.log(e,r.macros.get(t),Z0[t],K.math[t],K.text[t]),""});d("\\bgroup","{");d("\\egroup","}");d("~","\\nobreakspace");d("\\lq","`");d("\\rq","'");d("\\aa","\\r a");d("\\AA","\\r A");d("\\textcopyright","\\html@mathml{\\textcircled{c}}{\\char`©}");d("\\copyright","\\TextOrMath{\\textcopyright}{\\text{\\textcopyright}}");d("\\textregistered","\\html@mathml{\\textcircled{\\scriptsize R}}{\\char`®}");d("ℬ","\\mathscr{B}");d("ℰ","\\mathscr{E}");d("ℱ","\\mathscr{F}");d("ℋ","\\mathscr{H}");d("ℐ","\\mathscr{I}");d("ℒ","\\mathscr{L}");d("ℳ","\\mathscr{M}");d("ℛ","\\mathscr{R}");d("ℭ","\\mathfrak{C}");d("ℌ","\\mathfrak{H}");d("ℨ","\\mathfrak{Z}");d("\\Bbbk","\\Bbb{k}");d("\\llap","\\mathllap{\\textrm{#1}}");d("\\rlap","\\mathrlap{\\textrm{#1}}");d("\\clap","\\mathclap{\\textrm{#1}}");d("\\mathstrut","\\vphantom{(}");d("\\underbar","\\underline{\\text{#1}}");d("\\not",'\\html@mathml{\\mathrel{\\mathrlap\\@not}\\nobreak}{\\char"338}');d("\\neq","\\html@mathml{\\mathrel{\\not=}}{\\mathrel{\\char`≠}}");d("\\ne","\\neq");d("≠","\\neq");d("\\notin","\\html@mathml{\\mathrel{{\\in}\\mathllap{/\\mskip1mu}}}{\\mathrel{\\char`∉}}");d("∉","\\notin");d("≘","\\html@mathml{\\mathrel{=\\kern{-1em}\\raisebox{0.4em}{$\\scriptsize\\frown$}}}{\\mathrel{\\char`≘}}");d("≙","\\html@mathml{\\stackrel{\\tiny\\wedge}{=}}{\\mathrel{\\char`≘}}");d("≚","\\html@mathml{\\stackrel{\\tiny\\vee}{=}}{\\mathrel{\\char`≚}}");d("≛","\\html@mathml{\\stackrel{\\scriptsize\\star}{=}}{\\mathrel{\\char`≛}}");d("≝","\\html@mathml{\\stackrel{\\tiny\\mathrm{def}}{=}}{\\mathrel{\\char`≝}}");d("≞","\\html@mathml{\\stackrel{\\tiny\\mathrm{m}}{=}}{\\mathrel{\\char`≞}}");d("≟","\\html@mathml{\\stackrel{\\tiny?}{=}}{\\mathrel{\\char`≟}}");d("⟂","\\perp");d("‼","\\mathclose{!\\mkern-0.8mu!}");d("∌","\\notni");d("⌜","\\ulcorner");d("⌝","\\urcorner");d("⌞","\\llcorner");d("⌟","\\lrcorner");d("©","\\copyright");d("®","\\textregistered");d("\\ulcorner",'\\html@mathml{\\@ulcorner}{\\mathop{\\char"231c}}');d("\\urcorner",'\\html@mathml{\\@urcorner}{\\mathop{\\char"231d}}');d("\\llcorner",'\\html@mathml{\\@llcorner}{\\mathop{\\char"231e}}');d("\\lrcorner",'\\html@mathml{\\@lrcorner}{\\mathop{\\char"231f}}');d("\\vdots","{\\varvdots\\rule{0pt}{15pt}}");d("⋮","\\vdots");d("\\varGamma","\\mathit{\\Gamma}");d("\\varDelta","\\mathit{\\Delta}");d("\\varTheta","\\mathit{\\Theta}");d("\\varLambda","\\mathit{\\Lambda}");d("\\varXi","\\mathit{\\Xi}");d("\\varPi","\\mathit{\\Pi}");d("\\varSigma","\\mathit{\\Sigma}");d("\\varUpsilon","\\mathit{\\Upsilon}");d("\\varPhi","\\mathit{\\Phi}");d("\\varPsi","\\mathit{\\Psi}");d("\\varOmega","\\mathit{\\Omega}");d("\\substack","\\begin{subarray}{c}#1\\end{subarray}");d("\\colon","\\nobreak\\mskip2mu\\mathpunct{}\\mathchoice{\\mkern-3mu}{\\mkern-3mu}{}{}{:}\\mskip6mu\\relax");d("\\boxed","\\fbox{$\\displaystyle{#1}$}");d("\\iff","\\DOTSB\\;\\Longleftrightarrow\\;");d("\\implies","\\DOTSB\\;\\Longrightarrow\\;");d("\\impliedby","\\DOTSB\\;\\Longleftarrow\\;");d("\\dddot","{\\overset{\\raisebox{-0.1ex}{\\normalsize ...}}{#1}}");d("\\ddddot","{\\overset{\\raisebox{-0.1ex}{\\normalsize ....}}{#1}}");var ea={",":"\\dotsc","\\not":"\\dotsb","+":"\\dotsb","=":"\\dotsb","<":"\\dotsb",">":"\\dotsb","-":"\\dotsb","*":"\\dotsb",":":"\\dotsb","\\DOTSB":"\\dotsb","\\coprod":"\\dotsb","\\bigvee":"\\dotsb","\\bigwedge":"\\dotsb","\\biguplus":"\\dotsb","\\bigcap":"\\dotsb","\\bigcup":"\\dotsb","\\prod":"\\dotsb","\\sum":"\\dotsb","\\bigotimes":"\\dotsb","\\bigoplus":"\\dotsb","\\bigodot":"\\dotsb","\\bigsqcup":"\\dotsb","\\And":"\\dotsb","\\longrightarrow":"\\dotsb","\\Longrightarrow":"\\dotsb","\\longleftarrow":"\\dotsb","\\Longleftarrow":"\\dotsb","\\longleftrightarrow":"\\dotsb","\\Longleftrightarrow":"\\dotsb","\\mapsto":"\\dotsb","\\longmapsto":"\\dotsb","\\hookrightarrow":"\\dotsb","\\doteq":"\\dotsb","\\mathbin":"\\dotsb","\\mathrel":"\\dotsb","\\relbar":"\\dotsb","\\Relbar":"\\dotsb","\\xrightarrow":"\\dotsb","\\xleftarrow":"\\dotsb","\\DOTSI":"\\dotsi","\\int":"\\dotsi","\\oint":"\\dotsi","\\iint":"\\dotsi","\\iiint":"\\dotsi","\\iiiint":"\\dotsi","\\idotsint":"\\dotsi","\\DOTSX":"\\dotsx"},Fs=new Set(["bin","rel"]);d("\\dots",function(r){var e="\\dotso",t=r.expandAfterFuture().text;return t in ea?e=ea[t]:(t.slice(0,4)==="\\not"||t in K.math&&Fs.has(K.math[t].group))&&(e="\\dotsb"),e});var Kt={")":!0,"]":!0,"\\rbrack":!0,"\\}":!0,"\\rbrace":!0,"\\rangle":!0,"\\rceil":!0,"\\rfloor":!0,"\\rgroup":!0,"\\rmoustache":!0,"\\right":!0,"\\bigr":!0,"\\biggr":!0,"\\Bigr":!0,"\\Biggr":!0,$:!0,";":!0,".":!0,",":!0};d("\\dotso",function(r){var e=r.future().text;return e in Kt?"\\ldots\\,":"\\ldots"});d("\\dotsc",function(r){var e=r.future().text;return e in Kt&&e!==","?"\\ldots\\,":"\\ldots"});d("\\cdots",function(r){var e=r.future().text;return e in Kt?"\\@cdots\\,":"\\@cdots"});d("\\dotsb","\\cdots");d("\\dotsm","\\cdots");d("\\dotsi","\\!\\cdots");d("\\dotsx","\\ldots\\,");d("\\DOTSI","\\relax");d("\\DOTSB","\\relax");d("\\DOTSX","\\relax");d("\\tmspace","\\TextOrMath{\\kern#1#3}{\\mskip#1#2}\\relax");d("\\,","\\tmspace+{3mu}{.1667em}");d("\\thinspace","\\,");d("\\>","\\mskip{4mu}");d("\\:","\\tmspace+{4mu}{.2222em}");d("\\medspace","\\:");d("\\;","\\tmspace+{5mu}{.2777em}");d("\\thickspace","\\;");d("\\!","\\tmspace-{3mu}{.1667em}");d("\\negthinspace","\\!");d("\\negmedspace","\\tmspace-{4mu}{.2222em}");d("\\negthickspace","\\tmspace-{5mu}{.277em}");d("\\enspace","\\kern.5em ");d("\\enskip","\\hskip.5em\\relax");d("\\quad","\\hskip1em\\relax");d("\\qquad","\\hskip2em\\relax");d("\\tag","\\@ifstar\\tag@literal\\tag@paren");d("\\tag@paren","\\tag@literal{({#1})}");d("\\tag@literal",r=>{if(r.macros.get("\\df@tag"))throw new F("Multiple \\tag");return"\\gdef\\df@tag{\\text{#1}}"});d("\\bmod","\\mathchoice{\\mskip1mu}{\\mskip1mu}{\\mskip5mu}{\\mskip5mu}\\mathbin{\\rm mod}\\mathchoice{\\mskip1mu}{\\mskip1mu}{\\mskip5mu}{\\mskip5mu}");d("\\pod","\\allowbreak\\mathchoice{\\mkern18mu}{\\mkern8mu}{\\mkern8mu}{\\mkern8mu}(#1)");d("\\pmod","\\pod{{\\rm mod}\\mkern6mu#1}");d("\\mod","\\allowbreak\\mathchoice{\\mkern18mu}{\\mkern12mu}{\\mkern12mu}{\\mkern12mu}{\\rm mod}\\,\\,#1");d("\\newline","\\\\\\relax");d("\\TeX","\\textrm{\\html@mathml{T\\kern-.1667em\\raisebox{-.5ex}{E}\\kern-.125emX}{TeX}}");var ja=N(I0["Main-Regular"][84][1]-.7*I0["Main-Regular"][65][1]);d("\\LaTeX","\\textrm{\\html@mathml{"+("L\\kern-.36em\\raisebox{"+ja+"}{\\scriptstyle A}")+"\\kern-.15em\\TeX}{LaTeX}}");d("\\KaTeX","\\textrm{\\html@mathml{"+("K\\kern-.17em\\raisebox{"+ja+"}{\\scriptstyle A}")+"\\kern-.15em\\TeX}{KaTeX}}");d("\\hspace","\\@ifstar\\@hspacer\\@hspace");d("\\@hspace","\\hskip #1\\relax");d("\\@hspacer","\\rule{0pt}{0pt}\\hskip #1\\relax");d("\\ordinarycolon",":");d("\\vcentcolon","\\mathrel{\\mathop\\ordinarycolon}");d("\\dblcolon",'\\html@mathml{\\mathrel{\\vcentcolon\\mathrel{\\mkern-.9mu}\\vcentcolon}}{\\mathop{\\char"2237}}');d("\\coloneqq",'\\html@mathml{\\mathrel{\\vcentcolon\\mathrel{\\mkern-1.2mu}=}}{\\mathop{\\char"2254}}');d("\\Coloneqq",'\\html@mathml{\\mathrel{\\dblcolon\\mathrel{\\mkern-1.2mu}=}}{\\mathop{\\char"2237\\char"3d}}');d("\\coloneq",'\\html@mathml{\\mathrel{\\vcentcolon\\mathrel{\\mkern-1.2mu}\\mathrel{-}}}{\\mathop{\\char"3a\\char"2212}}');d("\\Coloneq",'\\html@mathml{\\mathrel{\\dblcolon\\mathrel{\\mkern-1.2mu}\\mathrel{-}}}{\\mathop{\\char"2237\\char"2212}}');d("\\eqqcolon",'\\html@mathml{\\mathrel{=\\mathrel{\\mkern-1.2mu}\\vcentcolon}}{\\mathop{\\char"2255}}');d("\\Eqqcolon",'\\html@mathml{\\mathrel{=\\mathrel{\\mkern-1.2mu}\\dblcolon}}{\\mathop{\\char"3d\\char"2237}}');d("\\eqcolon",'\\html@mathml{\\mathrel{\\mathrel{-}\\mathrel{\\mkern-1.2mu}\\vcentcolon}}{\\mathop{\\char"2239}}');d("\\Eqcolon",'\\html@mathml{\\mathrel{\\mathrel{-}\\mathrel{\\mkern-1.2mu}\\dblcolon}}{\\mathop{\\char"2212\\char"2237}}');d("\\colonapprox",'\\html@mathml{\\mathrel{\\vcentcolon\\mathrel{\\mkern-1.2mu}\\approx}}{\\mathop{\\char"3a\\char"2248}}');d("\\Colonapprox",'\\html@mathml{\\mathrel{\\dblcolon\\mathrel{\\mkern-1.2mu}\\approx}}{\\mathop{\\char"2237\\char"2248}}');d("\\colonsim",'\\html@mathml{\\mathrel{\\vcentcolon\\mathrel{\\mkern-1.2mu}\\sim}}{\\mathop{\\char"3a\\char"223c}}');d("\\Colonsim",'\\html@mathml{\\mathrel{\\dblcolon\\mathrel{\\mkern-1.2mu}\\sim}}{\\mathop{\\char"2237\\char"223c}}');d("∷","\\dblcolon");d("∹","\\eqcolon");d("≔","\\coloneqq");d("≕","\\eqqcolon");d("⩴","\\Coloneqq");d("\\ratio","\\vcentcolon");d("\\coloncolon","\\dblcolon");d("\\colonequals","\\coloneqq");d("\\coloncolonequals","\\Coloneqq");d("\\equalscolon","\\eqqcolon");d("\\equalscoloncolon","\\Eqqcolon");d("\\colonminus","\\coloneq");d("\\coloncolonminus","\\Coloneq");d("\\minuscolon","\\eqcolon");d("\\minuscoloncolon","\\Eqcolon");d("\\coloncolonapprox","\\Colonapprox");d("\\coloncolonsim","\\Colonsim");d("\\simcolon","\\mathrel{\\sim\\mathrel{\\mkern-1.2mu}\\vcentcolon}");d("\\simcoloncolon","\\mathrel{\\sim\\mathrel{\\mkern-1.2mu}\\dblcolon}");d("\\approxcolon","\\mathrel{\\approx\\mathrel{\\mkern-1.2mu}\\vcentcolon}");d("\\approxcoloncolon","\\mathrel{\\approx\\mathrel{\\mkern-1.2mu}\\dblcolon}");d("\\notni","\\html@mathml{\\not\\ni}{\\mathrel{\\char`∌}}");d("\\limsup","\\DOTSB\\operatorname*{lim\\,sup}");d("\\liminf","\\DOTSB\\operatorname*{lim\\,inf}");d("\\injlim","\\DOTSB\\operatorname*{inj\\,lim}");d("\\projlim","\\DOTSB\\operatorname*{proj\\,lim}");d("\\varlimsup","\\DOTSB\\operatorname*{\\overline{lim}}");d("\\varliminf","\\DOTSB\\operatorname*{\\underline{lim}}");d("\\varinjlim","\\DOTSB\\operatorname*{\\underrightarrow{lim}}");d("\\varprojlim","\\DOTSB\\operatorname*{\\underleftarrow{lim}}");d("\\gvertneqq","\\html@mathml{\\@gvertneqq}{≩}");d("\\lvertneqq","\\html@mathml{\\@lvertneqq}{≨}");d("\\ngeqq","\\html@mathml{\\@ngeqq}{≱}");d("\\ngeqslant","\\html@mathml{\\@ngeqslant}{≱}");d("\\nleqq","\\html@mathml{\\@nleqq}{≰}");d("\\nleqslant","\\html@mathml{\\@nleqslant}{≰}");d("\\nshortmid","\\html@mathml{\\@nshortmid}{∤}");d("\\nshortparallel","\\html@mathml{\\@nshortparallel}{∦}");d("\\nsubseteqq","\\html@mathml{\\@nsubseteqq}{⊈}");d("\\nsupseteqq","\\html@mathml{\\@nsupseteqq}{⊉}");d("\\varsubsetneq","\\html@mathml{\\@varsubsetneq}{⊊}");d("\\varsubsetneqq","\\html@mathml{\\@varsubsetneqq}{⫋}");d("\\varsupsetneq","\\html@mathml{\\@varsupsetneq}{⊋}");d("\\varsupsetneqq","\\html@mathml{\\@varsupsetneqq}{⫌}");d("\\imath","\\html@mathml{\\@imath}{ı}");d("\\jmath","\\html@mathml{\\@jmath}{ȷ}");d("\\llbracket","\\html@mathml{\\mathopen{[\\mkern-3.2mu[}}{\\mathopen{\\char`⟦}}");d("\\rrbracket","\\html@mathml{\\mathclose{]\\mkern-3.2mu]}}{\\mathclose{\\char`⟧}}");d("⟦","\\llbracket");d("⟧","\\rrbracket");d("\\lBrace","\\html@mathml{\\mathopen{\\{\\mkern-3.2mu[}}{\\mathopen{\\char`⦃}}");d("\\rBrace","\\html@mathml{\\mathclose{]\\mkern-3.2mu\\}}}{\\mathclose{\\char`⦄}}");d("⦃","\\lBrace");d("⦄","\\rBrace");d("\\minuso","\\mathbin{\\html@mathml{{\\mathrlap{\\mathchoice{\\kern{0.145em}}{\\kern{0.145em}}{\\kern{0.1015em}}{\\kern{0.0725em}}\\circ}{-}}}{\\char`⦵}}");d("⦵","\\minuso");d("\\darr","\\downarrow");d("\\dArr","\\Downarrow");d("\\Darr","\\Downarrow");d("\\lang","\\langle");d("\\rang","\\rangle");d("\\uarr","\\uparrow");d("\\uArr","\\Uparrow");d("\\Uarr","\\Uparrow");d("\\N","\\mathbb{N}");d("\\R","\\mathbb{R}");d("\\Z","\\mathbb{Z}");d("\\alef","\\aleph");d("\\alefsym","\\aleph");d("\\Alpha","\\mathrm{A}");d("\\Beta","\\mathrm{B}");d("\\bull","\\bullet");d("\\Chi","\\mathrm{X}");d("\\clubs","\\clubsuit");d("\\cnums","\\mathbb{C}");d("\\Complex","\\mathbb{C}");d("\\Dagger","\\ddagger");d("\\diamonds","\\diamondsuit");d("\\empty","\\emptyset");d("\\Epsilon","\\mathrm{E}");d("\\Eta","\\mathrm{H}");d("\\exist","\\exists");d("\\harr","\\leftrightarrow");d("\\hArr","\\Leftrightarrow");d("\\Harr","\\Leftrightarrow");d("\\hearts","\\heartsuit");d("\\image","\\Im");d("\\infin","\\infty");d("\\Iota","\\mathrm{I}");d("\\isin","\\in");d("\\Kappa","\\mathrm{K}");d("\\larr","\\leftarrow");d("\\lArr","\\Leftarrow");d("\\Larr","\\Leftarrow");d("\\lrarr","\\leftrightarrow");d("\\lrArr","\\Leftrightarrow");d("\\Lrarr","\\Leftrightarrow");d("\\Mu","\\mathrm{M}");d("\\natnums","\\mathbb{N}");d("\\Nu","\\mathrm{N}");d("\\Omicron","\\mathrm{O}");d("\\plusmn","\\pm");d("\\rarr","\\rightarrow");d("\\rArr","\\Rightarrow");d("\\Rarr","\\Rightarrow");d("\\real","\\Re");d("\\reals","\\mathbb{R}");d("\\Reals","\\mathbb{R}");d("\\Rho","\\mathrm{P}");d("\\sdot","\\cdot");d("\\sect","\\S");d("\\spades","\\spadesuit");d("\\sub","\\subset");d("\\sube","\\subseteq");d("\\supe","\\supseteq");d("\\Tau","\\mathrm{T}");d("\\thetasym","\\vartheta");d("\\weierp","\\wp");d("\\Zeta","\\mathrm{Z}");d("\\argmin","\\DOTSB\\operatorname*{arg\\,min}");d("\\argmax","\\DOTSB\\operatorname*{arg\\,max}");d("\\plim","\\DOTSB\\mathop{\\operatorname{plim}}\\limits");d("\\bra","\\mathinner{\\langle{#1}|}");d("\\ket","\\mathinner{|{#1}\\rangle}");d("\\braket","\\mathinner{\\langle{#1}\\rangle}");d("\\Bra","\\left\\langle#1\\right|");d("\\Ket","\\left|#1\\right\\rangle");var Xa=r=>e=>{var t=e.consumeArg().tokens,a=e.consumeArg().tokens,n=e.consumeArg().tokens,s=e.consumeArg().tokens,o=e.macros.get("|"),u=e.macros.get("\\|");e.macros.beginGroup();var h=g=>S=>{r&&(S.macros.set("|",o),n.length&&S.macros.set("\\|",u));var x=g;if(!g&&n.length){var D=S.future();D.text==="|"&&(S.popToken(),x=!0)}return{tokens:x?n:a,numArgs:0}};e.macros.set("|",h(!1)),n.length&&e.macros.set("\\|",h(!0));var m=e.consumeArg().tokens,p=e.expandTokens([...s,...m,...t]);return e.macros.endGroup(),{tokens:p.reverse(),numArgs:0}};d("\\bra@ket",Xa(!1));d("\\bra@set",Xa(!0));d("\\Braket","\\bra@ket{\\left\\langle}{\\,\\middle\\vert\\,}{\\,\\middle\\vert\\,}{\\right\\rangle}");d("\\Set","\\bra@set{\\left\\{\\:}{\\;\\middle\\vert\\;}{\\;\\middle\\Vert\\;}{\\:\\right\\}}");d("\\set","\\bra@set{\\{\\,}{\\mid}{}{\\,\\}}");d("\\angln","{\\angl n}");d("\\blue","\\textcolor{##6495ed}{#1}");d("\\orange","\\textcolor{##ffa500}{#1}");d("\\pink","\\textcolor{##ff00af}{#1}");d("\\red","\\textcolor{##df0030}{#1}");d("\\green","\\textcolor{##28ae7b}{#1}");d("\\gray","\\textcolor{gray}{#1}");d("\\purple","\\textcolor{##9d38bd}{#1}");d("\\blueA","\\textcolor{##ccfaff}{#1}");d("\\blueB","\\textcolor{##80f6ff}{#1}");d("\\blueC","\\textcolor{##63d9ea}{#1}");d("\\blueD","\\textcolor{##11accd}{#1}");d("\\blueE","\\textcolor{##0c7f99}{#1}");d("\\tealA","\\textcolor{##94fff5}{#1}");d("\\tealB","\\textcolor{##26edd5}{#1}");d("\\tealC","\\textcolor{##01d1c1}{#1}");d("\\tealD","\\textcolor{##01a995}{#1}");d("\\tealE","\\textcolor{##208170}{#1}");d("\\greenA","\\textcolor{##b6ffb0}{#1}");d("\\greenB","\\textcolor{##8af281}{#1}");d("\\greenC","\\textcolor{##74cf70}{#1}");d("\\greenD","\\textcolor{##1fab54}{#1}");d("\\greenE","\\textcolor{##0d923f}{#1}");d("\\goldA","\\textcolor{##ffd0a9}{#1}");d("\\goldB","\\textcolor{##ffbb71}{#1}");d("\\goldC","\\textcolor{##ff9c39}{#1}");d("\\goldD","\\textcolor{##e07d10}{#1}");d("\\goldE","\\textcolor{##a75a05}{#1}");d("\\redA","\\textcolor{##fca9a9}{#1}");d("\\redB","\\textcolor{##ff8482}{#1}");d("\\redC","\\textcolor{##f9685d}{#1}");d("\\redD","\\textcolor{##e84d39}{#1}");d("\\redE","\\textcolor{##bc2612}{#1}");d("\\maroonA","\\textcolor{##ffbde0}{#1}");d("\\maroonB","\\textcolor{##ff92c6}{#1}");d("\\maroonC","\\textcolor{##ed5fa6}{#1}");d("\\maroonD","\\textcolor{##ca337c}{#1}");d("\\maroonE","\\textcolor{##9e034e}{#1}");d("\\purpleA","\\textcolor{##ddd7ff}{#1}");d("\\purpleB","\\textcolor{##c6b9fc}{#1}");d("\\purpleC","\\textcolor{##aa87ff}{#1}");d("\\purpleD","\\textcolor{##7854ab}{#1}");d("\\purpleE","\\textcolor{##543b78}{#1}");d("\\mintA","\\textcolor{##f5f9e8}{#1}");d("\\mintB","\\textcolor{##edf2df}{#1}");d("\\mintC","\\textcolor{##e0e5cc}{#1}");d("\\grayA","\\textcolor{##f6f7f7}{#1}");d("\\grayB","\\textcolor{##f0f1f2}{#1}");d("\\grayC","\\textcolor{##e3e5e6}{#1}");d("\\grayD","\\textcolor{##d6d8da}{#1}");d("\\grayE","\\textcolor{##babec2}{#1}");d("\\grayF","\\textcolor{##888d93}{#1}");d("\\grayG","\\textcolor{##626569}{#1}");d("\\grayH","\\textcolor{##3b3e40}{#1}");d("\\grayI","\\textcolor{##21242c}{#1}");d("\\kaBlue","\\textcolor{##314453}{#1}");d("\\kaGreen","\\textcolor{##71B307}{#1}");var Va={"^":!0,_:!0,"\\limits":!0,"\\nolimits":!0};class Is{constructor(e,t,a){this.settings=void 0,this.expansionCount=void 0,this.lexer=void 0,this.macros=void 0,this.stack=void 0,this.mode=void 0,this.settings=t,this.expansionCount=0,this.feed(e),this.macros=new Cs(Rs,t.macros),this.mode=a,this.stack=[]}feed(e){this.lexer=new Jr(e,this.settings)}switchMode(e){this.mode=e}beginGroup(){this.macros.beginGroup()}endGroup(){this.macros.endGroup()}endGroups(){this.macros.endGroups()}future(){return this.stack.length===0&&this.pushToken(this.lexer.lex()),this.stack[this.stack.length-1]}popToken(){return this.future(),this.stack.pop()}pushToken(e){this.stack.push(e)}pushTokens(e){this.stack.push(...e)}scanArgument(e){var t,a,n;if(e){if(this.consumeSpaces(),this.future().text!=="[")return null;t=this.popToken(),{tokens:n,end:a}=this.consumeArg(["]"])}else({tokens:n,start:t,end:a}=this.consumeArg());return this.pushToken(new k0("EOF",a.loc)),this.pushTokens(n),new k0("",g0.range(t,a))}consumeSpaces(){for(;;){var e=this.future();if(e.text===" ")this.stack.pop();else break}}consumeArg(e){var t=[],a=e&&e.length>0;a||this.consumeSpaces();var n=this.future(),s,o=0,u=0;do{if(s=this.popToken(),t.push(s),s.text==="{")++o;else if(s.text==="}"){if(--o,o===-1)throw new F("Extra }",s)}else if(s.text==="EOF")throw new F("Unexpected end of input in a macro argument, expected '"+(e&&a?e[u]:"}")+"'",s);if(e&&a)if((o===0||o===1&&e[u]==="{")&&s.text===e[u]){if(++u,u===e.length){t.splice(-u,u);break}}else u=0}while(o!==0||a);return n.text==="{"&&t[t.length-1].text==="}"&&(t.pop(),t.shift()),t.reverse(),{tokens:t,start:n,end:s}}consumeArgs(e,t){if(t){if(t.length!==e+1)throw new F("The length of delimiters doesn't match the number of args!");for(var a=t[0],n=0;nthis.settings.maxExpand)throw new F("Too many expansions: infinite loop or need to increase maxExpand setting")}expandOnce(e){var t=this.popToken(),a=t.text,n=t.noexpand?null:this._getExpansion(a);if(n==null||e&&n.unexpandable){if(e&&n==null&&a[0]==="\\"&&!this.isDefined(a))throw new F("Undefined control sequence: "+a);return this.pushToken(t),!1}this.countExpansion(1);var s=n.tokens,o=this.consumeArgs(n.numArgs,n.delimiters);if(n.numArgs){s=s.slice();for(var u=s.length-1;u>=0;--u){var h=s[u];if(h.text==="#"){if(u===0)throw new F("Incomplete placeholder at end of macro body",h);if(h=s[--u],h.text==="#")s.splice(u+1,1);else if(/^[1-9]$/.test(h.text))s.splice(u,2,...o[+h.text-1]);else throw new F("Not a valid argument number",h)}}}return this.pushTokens(s),s.length}expandAfterFuture(){return this.expandOnce(),this.future()}expandNextToken(){for(;;)if(this.expandOnce()===!1){var e=this.stack.pop();return e.treatAsRelax&&(e.text="\\relax"),e}}expandMacro(e){return this.macros.has(e)?this.expandTokens([new k0(e)]):void 0}expandTokens(e){var t=[],a=this.stack.length;for(this.pushTokens(e);this.stack.length>a;)if(this.expandOnce(!0)===!1){var n=this.stack.pop();n.treatAsRelax&&(n.noexpand=!1,n.treatAsRelax=!1),t.push(n)}return this.countExpansion(t.length),t}expandMacroAsText(e){var t=this.expandMacro(e);return t&&t.map(a=>a.text).join("")}_getExpansion(e){var t=this.macros.get(e);if(t==null)return t;if(e.length===1){var a=this.lexer.catcodes[e];if(a!=null&&a!==13)return}var n=typeof t=="function"?t(this):t;if(typeof n=="string"){var s=0;if(n.includes("#"))for(var o=n.replace(/##/g,"");o.includes("#"+(s+1));)++s;for(var u=new Jr(n,this.settings),h=[],m=u.lex();m.text!=="EOF";)h.push(m),m=u.lex();h.reverse();var p={tokens:h,numArgs:s};return p}return n}isDefined(e){return this.macros.has(e)||Z0.hasOwnProperty(e)||K.math.hasOwnProperty(e)||K.text.hasOwnProperty(e)||Va.hasOwnProperty(e)}isExpandable(e){var t=this.macros.get(e);return t!=null?typeof t=="string"||typeof t=="function"||!t.unexpandable:Z0.hasOwnProperty(e)&&!Z0[e].primitive}}var ta=/^[₊₋₌₍₎₀₁₂₃₄₅₆₇₈₉ₐₑₕᵢⱼₖₗₘₙₒₚᵣₛₜᵤᵥₓᵦᵧᵨᵩᵪ]/,Le=Object.freeze({"₊":"+","₋":"-","₌":"=","₍":"(","₎":")","₀":"0","₁":"1","₂":"2","₃":"3","₄":"4","₅":"5","₆":"6","₇":"7","₈":"8","₉":"9","ₐ":"a","ₑ":"e","ₕ":"h","ᵢ":"i","ⱼ":"j","ₖ":"k","ₗ":"l","ₘ":"m","ₙ":"n","ₒ":"o","ₚ":"p","ᵣ":"r","ₛ":"s","ₜ":"t","ᵤ":"u","ᵥ":"v","ₓ":"x","ᵦ":"β","ᵧ":"γ","ᵨ":"ρ","ᵩ":"ϕ","ᵪ":"χ","⁺":"+","⁻":"-","⁼":"=","⁽":"(","⁾":")","⁰":"0","¹":"1","²":"2","³":"3","⁴":"4","⁵":"5","⁶":"6","⁷":"7","⁸":"8","⁹":"9","ᴬ":"A","ᴮ":"B","ᴰ":"D","ᴱ":"E","ᴳ":"G","ᴴ":"H","ᴵ":"I","ᴶ":"J","ᴷ":"K","ᴸ":"L","ᴹ":"M","ᴺ":"N","ᴼ":"O","ᴾ":"P","ᴿ":"R","ᵀ":"T","ᵁ":"U","ⱽ":"V","ᵂ":"W","ᵃ":"a","ᵇ":"b","ᶜ":"c","ᵈ":"d","ᵉ":"e","ᶠ":"f","ᵍ":"g",ʰ:"h","ⁱ":"i",ʲ:"j","ᵏ":"k",ˡ:"l","ᵐ":"m",ⁿ:"n","ᵒ":"o","ᵖ":"p",ʳ:"r",ˢ:"s","ᵗ":"t","ᵘ":"u","ᵛ":"v",ʷ:"w",ˣ:"x",ʸ:"y","ᶻ":"z","ᵝ":"β","ᵞ":"γ","ᵟ":"δ","ᵠ":"ϕ","ᵡ":"χ","ᶿ":"θ"}),yt={"́":{text:"\\'",math:"\\acute"},"̀":{text:"\\`",math:"\\grave"},"̈":{text:'\\"',math:"\\ddot"},"̃":{text:"\\~",math:"\\tilde"},"̄":{text:"\\=",math:"\\bar"},"̆":{text:"\\u",math:"\\breve"},"̌":{text:"\\v",math:"\\check"},"̂":{text:"\\^",math:"\\hat"},"̇":{text:"\\.",math:"\\dot"},"̊":{text:"\\r",math:"\\mathring"},"̋":{text:"\\H"},"̧":{text:"\\c"}},ra={á:"á",à:"à",ä:"ä",ǟ:"ǟ",ã:"ã",ā:"ā",ă:"ă",ắ:"ắ",ằ:"ằ",ẵ:"ẵ",ǎ:"ǎ",â:"â",ấ:"ấ",ầ:"ầ",ẫ:"ẫ",ȧ:"ȧ",ǡ:"ǡ",å:"å",ǻ:"ǻ",ḃ:"ḃ",ć:"ć",ḉ:"ḉ",č:"č",ĉ:"ĉ",ċ:"ċ",ç:"ç",ď:"ď",ḋ:"ḋ",ḑ:"ḑ",é:"é",è:"è",ë:"ë",ẽ:"ẽ",ē:"ē",ḗ:"ḗ",ḕ:"ḕ",ĕ:"ĕ",ḝ:"ḝ",ě:"ě",ê:"ê",ế:"ế",ề:"ề",ễ:"ễ",ė:"ė",ȩ:"ȩ",ḟ:"ḟ",ǵ:"ǵ",ḡ:"ḡ",ğ:"ğ",ǧ:"ǧ",ĝ:"ĝ",ġ:"ġ",ģ:"ģ",ḧ:"ḧ",ȟ:"ȟ",ĥ:"ĥ",ḣ:"ḣ",ḩ:"ḩ",í:"í",ì:"ì",ï:"ï",ḯ:"ḯ",ĩ:"ĩ",ī:"ī",ĭ:"ĭ",ǐ:"ǐ",î:"î",ǰ:"ǰ",ĵ:"ĵ",ḱ:"ḱ",ǩ:"ǩ",ķ:"ķ",ĺ:"ĺ",ľ:"ľ",ļ:"ļ",ḿ:"ḿ",ṁ:"ṁ",ń:"ń",ǹ:"ǹ",ñ:"ñ",ň:"ň",ṅ:"ṅ",ņ:"ņ",ó:"ó",ò:"ò",ö:"ö",ȫ:"ȫ",õ:"õ",ṍ:"ṍ",ṏ:"ṏ",ȭ:"ȭ",ō:"ō",ṓ:"ṓ",ṑ:"ṑ",ŏ:"ŏ",ǒ:"ǒ",ô:"ô",ố:"ố",ồ:"ồ",ỗ:"ỗ",ȯ:"ȯ",ȱ:"ȱ",ő:"ő",ṕ:"ṕ",ṗ:"ṗ",ŕ:"ŕ",ř:"ř",ṙ:"ṙ",ŗ:"ŗ",ś:"ś",ṥ:"ṥ",š:"š",ṧ:"ṧ",ŝ:"ŝ",ṡ:"ṡ",ş:"ş",ẗ:"ẗ",ť:"ť",ṫ:"ṫ",ţ:"ţ",ú:"ú",ù:"ù",ü:"ü",ǘ:"ǘ",ǜ:"ǜ",ǖ:"ǖ",ǚ:"ǚ",ũ:"ũ",ṹ:"ṹ",ū:"ū",ṻ:"ṻ",ŭ:"ŭ",ǔ:"ǔ",û:"û",ů:"ů",ű:"ű",ṽ:"ṽ",ẃ:"ẃ",ẁ:"ẁ",ẅ:"ẅ",ŵ:"ŵ",ẇ:"ẇ",ẘ:"ẘ",ẍ:"ẍ",ẋ:"ẋ",ý:"ý",ỳ:"ỳ",ÿ:"ÿ",ỹ:"ỹ",ȳ:"ȳ",ŷ:"ŷ",ẏ:"ẏ",ẙ:"ẙ",ź:"ź",ž:"ž",ẑ:"ẑ",ż:"ż",Á:"Á",À:"À",Ä:"Ä",Ǟ:"Ǟ",Ã:"Ã",Ā:"Ā",Ă:"Ă",Ắ:"Ắ",Ằ:"Ằ",Ẵ:"Ẵ",Ǎ:"Ǎ",Â:"Â",Ấ:"Ấ",Ầ:"Ầ",Ẫ:"Ẫ",Ȧ:"Ȧ",Ǡ:"Ǡ",Å:"Å",Ǻ:"Ǻ",Ḃ:"Ḃ",Ć:"Ć",Ḉ:"Ḉ",Č:"Č",Ĉ:"Ĉ",Ċ:"Ċ",Ç:"Ç",Ď:"Ď",Ḋ:"Ḋ",Ḑ:"Ḑ",É:"É",È:"È",Ë:"Ë",Ẽ:"Ẽ",Ē:"Ē",Ḗ:"Ḗ",Ḕ:"Ḕ",Ĕ:"Ĕ",Ḝ:"Ḝ",Ě:"Ě",Ê:"Ê",Ế:"Ế",Ề:"Ề",Ễ:"Ễ",Ė:"Ė",Ȩ:"Ȩ",Ḟ:"Ḟ",Ǵ:"Ǵ",Ḡ:"Ḡ",Ğ:"Ğ",Ǧ:"Ǧ",Ĝ:"Ĝ",Ġ:"Ġ",Ģ:"Ģ",Ḧ:"Ḧ",Ȟ:"Ȟ",Ĥ:"Ĥ",Ḣ:"Ḣ",Ḩ:"Ḩ",Í:"Í",Ì:"Ì",Ï:"Ï",Ḯ:"Ḯ",Ĩ:"Ĩ",Ī:"Ī",Ĭ:"Ĭ",Ǐ:"Ǐ",Î:"Î",İ:"İ",Ĵ:"Ĵ",Ḱ:"Ḱ",Ǩ:"Ǩ",Ķ:"Ķ",Ĺ:"Ĺ",Ľ:"Ľ",Ļ:"Ļ",Ḿ:"Ḿ",Ṁ:"Ṁ",Ń:"Ń",Ǹ:"Ǹ",Ñ:"Ñ",Ň:"Ň",Ṅ:"Ṅ",Ņ:"Ņ",Ó:"Ó",Ò:"Ò",Ö:"Ö",Ȫ:"Ȫ",Õ:"Õ",Ṍ:"Ṍ",Ṏ:"Ṏ",Ȭ:"Ȭ",Ō:"Ō",Ṓ:"Ṓ",Ṑ:"Ṑ",Ŏ:"Ŏ",Ǒ:"Ǒ",Ô:"Ô",Ố:"Ố",Ồ:"Ồ",Ỗ:"Ỗ",Ȯ:"Ȯ",Ȱ:"Ȱ",Ő:"Ő",Ṕ:"Ṕ",Ṗ:"Ṗ",Ŕ:"Ŕ",Ř:"Ř",Ṙ:"Ṙ",Ŗ:"Ŗ",Ś:"Ś",Ṥ:"Ṥ",Š:"Š",Ṧ:"Ṧ",Ŝ:"Ŝ",Ṡ:"Ṡ",Ş:"Ş",Ť:"Ť",Ṫ:"Ṫ",Ţ:"Ţ",Ú:"Ú",Ù:"Ù",Ü:"Ü",Ǘ:"Ǘ",Ǜ:"Ǜ",Ǖ:"Ǖ",Ǚ:"Ǚ",Ũ:"Ũ",Ṹ:"Ṹ",Ū:"Ū",Ṻ:"Ṻ",Ŭ:"Ŭ",Ǔ:"Ǔ",Û:"Û",Ů:"Ů",Ű:"Ű",Ṽ:"Ṽ",Ẃ:"Ẃ",Ẁ:"Ẁ",Ẅ:"Ẅ",Ŵ:"Ŵ",Ẇ:"Ẇ",Ẍ:"Ẍ",Ẋ:"Ẋ",Ý:"Ý",Ỳ:"Ỳ",Ÿ:"Ÿ",Ỹ:"Ỹ",Ȳ:"Ȳ",Ŷ:"Ŷ",Ẏ:"Ẏ",Ź:"Ź",Ž:"Ž",Ẑ:"Ẑ",Ż:"Ż",ά:"ά",ὰ:"ὰ",ᾱ:"ᾱ",ᾰ:"ᾰ",έ:"έ",ὲ:"ὲ",ή:"ή",ὴ:"ὴ",ί:"ί",ὶ:"ὶ",ϊ:"ϊ",ΐ:"ΐ",ῒ:"ῒ",ῑ:"ῑ",ῐ:"ῐ",ό:"ό",ὸ:"ὸ",ύ:"ύ",ὺ:"ὺ",ϋ:"ϋ",ΰ:"ΰ",ῢ:"ῢ",ῡ:"ῡ",ῠ:"ῠ",ώ:"ώ",ὼ:"ὼ",Ύ:"Ύ",Ὺ:"Ὺ",Ϋ:"Ϋ",Ῡ:"Ῡ",Ῠ:"Ῠ",Ώ:"Ώ",Ὼ:"Ὼ"};class tt{constructor(e,t){this.mode=void 0,this.gullet=void 0,this.settings=void 0,this.leftrightDepth=void 0,this.nextToken=void 0,this.mode="math",this.gullet=new Is(e,t,this.mode),this.settings=t,this.leftrightDepth=0,this.nextToken=null}expect(e,t){if(t===void 0&&(t=!0),this.fetch().text!==e)throw new F("Expected '"+e+"', got '"+this.fetch().text+"'",this.fetch());t&&this.consume()}consume(){this.nextToken=null}fetch(){return this.nextToken==null&&(this.nextToken=this.gullet.expandNextToken()),this.nextToken}switchMode(e){this.mode=e,this.gullet.switchMode(e)}parse(){this.settings.globalGroup||this.gullet.beginGroup(),this.settings.colorIsTextColor&&this.gullet.macros.set("\\color","\\textcolor");try{var e=this.parseExpression(!1);return this.expect("EOF"),this.settings.globalGroup||this.gullet.endGroup(),e}finally{this.gullet.endGroups()}}subparse(e){var t=this.nextToken;this.consume(),this.gullet.pushToken(new k0("}")),this.gullet.pushTokens(e);var a=this.parseExpression(!1);return this.expect("}"),this.nextToken=t,a}parseExpression(e,t){for(var a=[];;){this.mode==="math"&&this.consumeSpaces();var n=this.fetch();if(tt.endOfExpression.has(n.text)||t&&n.text===t||e&&Z0[n.text]&&Z0[n.text].infix)break;var s=this.parseAtom(t);if(s){if(s.type==="internal")continue}else break;a.push(s)}return this.mode==="text"&&this.formLigatures(a),this.handleInfixNodes(a)}handleInfixNodes(e){for(var t=-1,a,n=0;n=128)this.settings.strict&&(ia(t.charCodeAt(0))?this.mode==="math"&&this.settings.reportNonstrict("unicodeTextInMathMode",'Unicode text character "'+t[0]+'" used in math mode',e):this.settings.reportNonstrict("unknownSymbol",'Unrecognized Unicode character "'+t[0]+'"'+(" ("+t.charCodeAt(0)+")"),e)),o={type:"textord",mode:"text",loc:g0.range(e),text:t};else return null;if(this.consume(),s)for(var p=0;p=qs){const a=this.map.keys().next().value;a!==void 0&&this.map.delete(a)}this.map.set(e,t)}get size(){return this.map.size}}const qe=new Ps;function Hs(r,e){return`d\0${e}`}function $s(r,e,t={}){const a=Hs(e,r),n=qe.get(a);if(n!==void 0)return n;const{errorColor:s="var(--semi-color-text-2)",macros:o}=t;let u;try{return u=aa.renderToString(r,{displayMode:e,throwOnError:!0,macros:o,trust:sr}),qe.set(a,u),u}catch{}try{return u=aa.renderToString(r,{displayMode:e,throwOnError:!1,strict:"ignore",errorColor:s,macros:o,trust:sr}),qe.set(a,u),u}catch{}return u=`${_s(r)}`,qe.set(a,u),u}function _s(r){return r.replace(/&/g,"&").replace(//g,">").replace(/"/g,""")}const Gs=a0.memo(function({expr:e}){const t=$s(e,!0);return U.jsx("div",{"data-slot":"math-display",dangerouslySetInnerHTML:{__html:t}})}),na=200,Us=a0.memo(function({text:e}){const t=a0.useMemo(()=>{const a=e.split(` +`),n=[];for(let s=0;sU.jsx("pre",{style:{contentVisibility:"auto",containIntrinsicSize:"0 400px",margin:0,whiteSpace:"pre-wrap",wordBreak:"break-word",fontFamily:"var(--font-mono, monospace)",fontSize:"var(--font-size-code, 13px)",lineHeight:1.5},children:a},n))})}),js=500,Xs=30,Vs=33,Ws=5e3;function Ys(r,e){const[t,a]=a0.useState(r),n=a0.useRef(r),s=a0.useRef(0),o=a0.useRef(null),u=a0.useRef(r);return u.current=r,a0.useEffect(()=>{if(!e){o.current!==null&&(cancelAnimationFrame(o.current),o.current=null),n.current=r,a(r);return}if(!r.startsWith(n.current)){n.current=r,a(r);return}if(r.length-n.current.length>Ws){n.current=r,a(r);return}function h(){o.current=null;const m=performance.now();if(m-s.current{o.current!==null&&(cancelAnimationFrame(o.current),o.current=null)}},[r,e]),e?t:r}const Zs={macros:{"\\vline":"\\vert","\\R":"\\mathbb{R}","\\N":"\\mathbb{N}","\\Z":"\\mathbb{Z}","\\Q":"\\mathbb{Q}","\\C":"\\mathbb{C}","\\norm":"\\left\\lVert #1 \\right\\rVert","\\abs":"\\left\\lvert #1 \\right\\rvert"},...pn,errorColor:"var(--semi-color-text-2)"},Ks=15e4;function Js(r){return{...dn,pre({children:e}){return U.jsx(U.Fragment,{children:e})},code({className:e,children:t}){const a=/language-(\w+)/.exec(e||""),n=String(t).replace(/\n$/,"");return a?a[1]==="math"?U.jsx(Gs,{expr:n}):a[1]==="diff"?U.jsx(Rn,{code:n}):U.jsx(br,{language:a[1],code:n,isStreaming:r}):n.includes(` +`)?U.jsx(br,{code:n,isStreaming:r}):U.jsx("code",{className:e,children:t})},table({children:e}){return U.jsx("div",{"data-slot":"md-table-wrap",children:U.jsx("table",{children:e})})}}}const i1=a0.memo(function({content:e,isStreaming:t=!1}){const a=a0.useMemo(()=>Js(t),[t]),n=Ys(e,t),s=a0.useDeferredValue(n);return s.length>Ks?U.jsx("div",{"data-slot":"aui_markdown-part",children:U.jsx(Us,{text:s})}):U.jsx("div",{"data-slot":"aui_markdown-part",children:U.jsx(ln,{remarkPlugins:[un,cn],rehypePlugins:[[on,Zs]],components:a,urlTransform:mn,children:hn(s)})})});export{i1 as MarkdownPart}; diff --git a/frontends/desktop/dist/assets/MarkdownPart-Cp90Gu77.css b/frontends/desktop/dist/assets/MarkdownPart-Cp90Gu77.css new file mode 100644 index 000000000..f25ebff27 --- /dev/null +++ b/frontends/desktop/dist/assets/MarkdownPart-Cp90Gu77.css @@ -0,0 +1 @@ +[data-slot=code-card]{position:relative;margin:.5rem 0;border-radius:.375rem;border:1px solid var(--semi-color-border);background:var(--semi-color-fill-0);overflow:hidden}[data-slot=code-card-header]{display:flex;align-items:center;justify-content:space-between;padding:.25rem .5rem;border-bottom:1px solid var(--semi-color-border);background:color-mix(in srgb,var(--semi-color-fill-0) 60%,var(--semi-color-bg-0));min-height:1.5rem}[data-slot=code-card-lang]{font-size:.6875rem;font-family:SF Mono,Cascadia Code,Fira Code,monospace;color:var(--semi-color-text-2);text-transform:lowercase}[data-slot=code-card-copy]{display:flex;align-items:center;justify-content:center;width:1.5rem;height:1.5rem;border:none;border-radius:.25rem;background:transparent;color:var(--semi-color-text-2);cursor:pointer;opacity:.55;transition:opacity .12s,background .12s}[data-slot=code-card-copy]:hover{opacity:1;background:var(--semi-color-fill-1)}[data-slot=code-card-body]{position:relative;padding:.625rem .75rem;overflow-x:auto;overflow-y:auto;max-height:7.5rem;font-family:SF Mono,Cascadia Code,Fira Code,monospace;font-size:.7rem;line-height:1.6;color:var(--semi-color-text-0);white-space:pre;-moz-tab-size:2;tab-size:2}[data-slot=code-card-body][data-expanded]{max-height:40dvh}[data-slot=code-card-expand]{position:absolute;inset-inline:0;bottom:0;display:flex;height:1.75rem;cursor:pointer;align-items:flex-end;justify-content:center;padding-bottom:.25rem;border:none;background:linear-gradient(to top,var(--semi-color-fill-0),transparent);color:var(--ui-text-tertiary);transition:color .12s ease-out}[data-slot=code-card-expand]:hover{color:var(--foreground)}[data-slot=code-card-expand] svg{width:.875rem;height:.875rem;transition:transform .15s ease-out}[data-slot=code-card-body][data-expanded]+[data-slot=code-card-expand]{background:none}[data-slot=code-card-body][data-expanded]+[data-slot=code-card-expand] svg{transform:rotate(180deg)}[data-slot=code-card-body] code{font-family:inherit;font-size:inherit;background:none!important;padding:0;display:block}[data-slot=code-card][data-streaming]{animation:code-card-glow 1.8s ease-in-out infinite alternate;border-color:color-mix(in srgb,var(--semi-color-primary) 24%,var(--semi-color-border))}[data-slot=code-card][data-streaming] [data-slot=code-card-body]{mask-image:linear-gradient(to bottom,#000,#000 calc(100% - 1.5rem),#00000080);-webkit-mask-image:linear-gradient(to bottom,black 0%,black calc(100% - 1.5rem),rgba(0,0,0,.5) 100%)}@keyframes code-card-glow{0%{box-shadow:0 0 0 .5px color-mix(in srgb,var(--semi-color-primary) 10%,transparent)}to{box-shadow:0 0 0 .5px color-mix(in srgb,var(--semi-color-primary) 10%,transparent),0 .5rem 1.5rem color-mix(in srgb,var(--semi-color-primary) 6%,transparent)}}:root{--code-keyword: #d73a49;--code-string: #032f62;--code-comment: #6a737d;--code-function: #6f42c1;--code-number: #005cc5;--code-operator: #d73a49;--code-class-name: #6f42c1;--code-punctuation: #24292e;--code-property: #005cc5;--code-builtin: #e36209;--code-attr-name: #6f42c1;--code-attr-value: #032f62;--code-tag: #22863a;--code-selector: #22863a;--code-inserted: #22863a;--code-deleted: #d73a49}[data-appearance=dark]{--code-keyword: #ff7b72;--code-string: #a5d6ff;--code-comment: #8b949e;--code-function: #d2a8ff;--code-number: #79c0ff;--code-operator: #ff7b72;--code-class-name: #f0c674;--code-punctuation: #c9d1d9;--code-property: #79c0ff;--code-builtin: #ffa657;--code-attr-name: #d2a8ff;--code-attr-value: #a5d6ff;--code-tag: #7ee787;--code-selector: #7ee787;--code-inserted: #7ee787;--code-deleted: #ff7b72}.token.keyword,.token.control,.token.directive,.token.important{color:var(--code-keyword)}.token.string,.token.template-string,.token.url{color:var(--code-string)}.token.comment,.token.prolog,.token.doctype,.token.cdata{color:var(--code-comment);font-style:italic}.token.function{color:var(--code-function)}.token.number,.token.boolean{color:var(--code-number)}.token.operator,.token.entity{color:var(--code-operator)}.token.class-name,.token.maybe-class-name{color:var(--code-class-name)}.token.punctuation{color:var(--code-punctuation)}.token.property,.token.constant,.token.variable{color:var(--code-property)}.token.builtin,.token.symbol{color:var(--code-builtin)}.token.attr-name{color:var(--code-attr-name)}.token.attr-value{color:var(--code-attr-value)}.token.tag{color:var(--code-tag)}.token.selector{color:var(--code-selector)}.token.inserted{color:var(--code-inserted)}.token.deleted{color:var(--code-deleted);text-decoration:line-through}.token.italic{font-style:italic}.token.bold{font-weight:700}[data-slot=diff-block]{margin:.5rem 0;border-radius:.375rem;border:1px solid var(--semi-color-border);overflow-x:auto;overscroll-behavior-x:contain;font-family:SF Mono,Cascadia Code,Fira Code,monospace;font-size:var(--font-size-code, 13px);line-height:1.375rem}[data-slot=diff-line]{display:flex;padding:0 .5rem;min-height:1.375rem;line-height:1.375rem;border-left:2px solid transparent}[data-diff-kind=add]{background:color-mix(in srgb,var(--semi-color-success, #00b42a) 10%,transparent);border-left:2px solid var(--semi-color-success, #00b42a)}[data-diff-kind=remove]{background:color-mix(in srgb,var(--semi-color-danger, #f53f3f) 10%,transparent);border-left:2px solid var(--semi-color-danger, #f53f3f)}[data-diff-kind=context]{border-left:2px solid transparent}[data-diff-kind=header]{background:var(--semi-color-fill-0);font-style:italic;color:var(--semi-color-text-2);padding:.25rem .5rem}[data-slot=diff-gutter]{display:flex;gap:.25rem;min-width:4rem;-webkit-user-select:none;user-select:none;color:var(--semi-color-text-3);font-size:.6875rem;justify-content:flex-end;padding-right:.5rem;border-right:1px solid var(--semi-color-border)}[data-slot=diff-line-old],[data-slot=diff-line-new]{min-width:1.5rem;text-align:right}[data-slot=diff-content]{flex:1;white-space:pre-wrap;word-break:break-all;padding-left:.5rem}[data-slot=diff-sign]{display:inline-block;width:1ch;-webkit-user-select:none;user-select:none} diff --git a/frontends/desktop/dist/assets/ServicesPage-Cbm5nbW7.css b/frontends/desktop/dist/assets/ServicesPage-Cbm5nbW7.css new file mode 100644 index 000000000..a5496d0b6 --- /dev/null +++ b/frontends/desktop/dist/assets/ServicesPage-Cbm5nbW7.css @@ -0,0 +1 @@ +.semi-input-textarea-wrapper{box-sizing:border-box;display:inline-block;position:relative;width:100%;border:1px transparent solid;border-radius:var(--semi-border-radius-small);vertical-align:bottom;background-color:var(--semi-color-fill-0);transition:background-color var(--semi-transition_duration-none) var(--semi-transition_function-easeIn) var(--semi-transition_delay-none),border var(--semi-transition_duration-none) var(--semi-transition_function-easeIn) var(--semi-transition_delay-none)}.semi-input-textarea-wrapper-resizeX{display:inline-block;width:fit-content;max-width:100%}.semi-input-textarea-wrapper:hover{background-color:var(--semi-color-fill-1)}.semi-input-textarea-wrapper-focus{background-color:var(--semi-color-fill-0);border:1px var(--semi-color-focus-border) solid}.semi-input-textarea-wrapper-focus:hover,.semi-input-textarea-wrapper-focus:active{background-color:var(--semi-color-fill-0)}.semi-input-textarea-wrapper:active{background-color:var(--semi-color-fill-2)}.semi-input-textarea-wrapper .semi-input-clearbtn{position:absolute;top:0;min-width:24px;color:var(--semi-color-text-2);right:4px;height:32px;display:flex;align-items:center;justify-content:center}.semi-input-textarea-wrapper .semi-input-clearbtn>svg{pointer-events:none}.semi-input-textarea-wrapper .semi-input-clearbtn:hover{cursor:pointer}.semi-input-textarea-wrapper .semi-input-clearbtn:hover .semi-icon{color:var(--semi-color-primary-hover)}.semi-input-textarea-wrapper .semi-input-clearbtn-hidden{visibility:hidden}.semi-input-textarea-wrapper-disabled,.semi-input-textarea-wrapper-readonly{cursor:not-allowed;color:var(--semi-color-disabled-text);background-color:var(--semi-color-disabled-fill)}.semi-input-textarea-wrapper-disabled:hover,.semi-input-textarea-wrapper-readonly:hover{background-color:var(--semi-color-disabled-fill)}.semi-input-textarea-wrapper-disabled::placeholder,.semi-input-textarea-wrapper-readonly::placeholder{color:var(--semi-color-disabled-text)}.semi-input-textarea-wrapper-readonly{cursor:text}.semi-input-textarea-wrapper-error{background-color:var(--semi-color-danger-light-default);border-color:var(--semi-color-danger-light-default)}.semi-input-textarea-wrapper-error:hover{background-color:var(--semi-color-danger-light-hover);border-color:var(--semi-color-danger-light-hover)}.semi-input-textarea-wrapper-error.semi-input-textarea-wrapper-focus{background-color:var(--semi-color-danger-light-default);border-color:var(--semi-color-danger)}.semi-input-textarea-wrapper-error:active{background-color:var(--semi-color-danger-light-active);border-color:var(--semi-color-danger)}.semi-input-textarea-wrapper-warning{background-color:var(--semi-color-warning-light-default);border-color:var(--semi-color-warning-light-default)}.semi-input-textarea-wrapper-warning:hover{background-color:var(--semi-color-warning-light-hover);border-color:var(--semi-color-warning-light-hover)}.semi-input-textarea-wrapper-warning.semi-input-textarea-wrapper-focus{background-color:var(--semi-color-warning-light-default);border-color:var(--semi-color-warning)}.semi-input-textarea-wrapper-warning:active{background-color:var(--semi-color-warning-light-active);border-color:var(--semi-color-warning)}.semi-input-textarea{position:relative;resize:none;padding:5px 12px;box-shadow:none;font-size:14px;line-height:20px;font-family:Inter,-apple-system,BlinkMacSystemFont,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Segoe UI,Helvetica Neue,Helvetica,Arial,sans-serif;background-color:transparent;border:0 solid transparent;vertical-align:bottom;width:100%;outline:none;cursor:text;box-sizing:border-box;color:var(--semi-color-text-0)}.semi-input-textarea:hover{border-color:transparent}.semi-input-textarea::placeholder{color:var(--semi-color-text-2)}.semi-input-textarea-showClear{padding-right:36px}.semi-input-textarea-disabled,.semi-input-textarea-readonly{cursor:not-allowed;color:var(--semi-color-disabled-text);background-color:transparent}.semi-input-textarea-disabled:hover,.semi-input-textarea-readonly:hover{background-color:transparent}.semi-input-textarea-disabled::placeholder,.semi-input-textarea-readonly::placeholder{color:var(--semi-color-disabled-text)}.semi-input-textarea-readonly{cursor:text}.semi-input-textarea-autosize{overflow:hidden;resize:none}.semi-input-textarea-counter{font-size:12px;line-height:16px;font-family:Inter,-apple-system,BlinkMacSystemFont,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Segoe UI,Helvetica Neue,Helvetica,Arial,sans-serif;display:flex;flex-direction:column;justify-content:center;padding:3px 12px 5px;min-height:24px;text-align:right;color:var(--semi-color-text-2)}.semi-input-textarea-counter-exceed{color:var(--semi-color-danger)}.semi-input-textarea-borderless:not(:focus-within):not(:hover){background-color:transparent;border-color:transparent}.semi-input-textarea-borderless:focus-within:not(:active){background-color:transparent}.semi-input-textarea-borderless.semi-input-textarea-wrapper-error:not(:focus-within){border-color:var(--semi-color-danger)}.semi-input-textarea-borderless.semi-input-textarea-wrapper-warning:not(:focus-within){border-color:var(--semi-color-warning)}.semi-input-textarea-borderless.semi-input-textarea-wrapper-error .semi-input-textarea-counter{color:var(--semi-color-danger)}.semi-input-textarea-borderless.semi-input-textarea-wrapper-warning .semi-input-textarea-counter{color:var(--semi-color-warning)}.semi-input-textarea-wrapper-withLineNumber{display:flex;padding:0;align-items:flex-start}.semi-input-textarea-wrapper-withLineNumber.semi-input-textarea-wrapper-resizeX{display:inline-flex;width:fit-content;max-width:100%}.semi-input-textarea-wrapper-withLineNumber.semi-input-textarea-wrapper-resizeX .semi-input-textarea-content{flex:0 0 auto}.semi-input-textarea-wrapper-withLineNumber .semi-input-textarea-lineNumber{flex-shrink:0;padding:5px 12px;background-color:var(--semi-color-fill-1);border-right:1px solid var(--semi-color-border);color:var(--semi-color-text-2);font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-size:inherit;line-height:1.5;text-align:right;-webkit-user-select:none;user-select:none;min-width:36px;border-radius:var(--semi-border-radius-small) 0 0 var(--semi-border-radius-small);overflow-y:auto;overflow-x:hidden;scrollbar-width:none;-ms-overflow-style:none}.semi-input-textarea-wrapper-withLineNumber .semi-input-textarea-lineNumber::-webkit-scrollbar{display:none}.semi-input-textarea-wrapper-withLineNumber .semi-input-textarea-content{display:flex;flex:1;min-width:0}.semi-input-textarea-wrapper-withLineNumber .semi-input-textarea-lineNumber-item{display:flex;align-items:flex-start;justify-content:flex-end;box-sizing:border-box}.semi-input-textarea-wrapper-withLineNumber .semi-input-textarea{border-radius:0 var(--semi-border-radius-small) var(--semi-border-radius-small) 0;line-height:1.5;flex:1}.semi-rtl .semi-input-wrapper,.semi-portal-rtl .semi-input-wrapper{direction:rtl}.semi-rtl .semi-input-wrapper__with-prefix .semi-input,.semi-portal-rtl .semi-input-wrapper__with-prefix .semi-input{padding-left:auto;padding-right:0}.semi-rtl .semi-input-wrapper__with-suffix .semi-input,.semi-portal-rtl .semi-input-wrapper__with-suffix .semi-input{padding-right:auto;padding-left:0}.semi-rtl .semi-input,.semi-portal-rtl .semi-input{padding-left:12px;padding-right:12px}.semi-rtl .semi-input-clearbtn+.semi-rtl .semi-input-suffix+.semi-input-suffix-text,.semi-rtl .semi-input-clearbtn+.semi-portal-rtl .semi-input-suffix+.semi-input-suffix-text,.semi-portal-rtl .semi-input-clearbtn+.semi-rtl .semi-input-suffix+.semi-input-suffix-text,.semi-portal-rtl .semi-input-clearbtn+.semi-portal-rtl .semi-input-suffix+.semi-input-suffix-text{margin-left:auto;margin-right:0}.semi-rtl .semi-input-clearbtn+.semi-rtl .semi-input-suffix+.semi-input-suffix-icon,.semi-rtl .semi-input-clearbtn+.semi-portal-rtl .semi-input-suffix+.semi-input-suffix-icon,.semi-portal-rtl .semi-input-clearbtn+.semi-rtl .semi-input-suffix+.semi-input-suffix-icon,.semi-portal-rtl .semi-input-clearbtn+.semi-portal-rtl .semi-input-suffix+.semi-input-suffix-icon{margin-left:auto;margin-right:0}.semi-rtl .semi-input-append,.semi-portal-rtl .semi-input-append{border-left:0;border-right:1px transparent solid}.semi-rtl .semi-input-prepend,.semi-portal-rtl .semi-input-prepend{border-right:0;border-left:1px transparent solid}.semi-rtl .semi-input-group .semi-select:not(:last-child):after,.semi-rtl .semi-input-group .semi-cascader:not(:last-child):after,.semi-rtl .semi-input-group .semi-tree-select:not(:last-child):after,.semi-rtl .semi-input-group>.semi-input-wrapper:not(:last-child):after,.semi-portal-rtl .semi-input-group .semi-select:not(:last-child):after,.semi-portal-rtl .semi-input-group .semi-cascader:not(:last-child):after,.semi-portal-rtl .semi-input-group .semi-tree-select:not(:last-child):after,.semi-portal-rtl .semi-input-group>.semi-input-wrapper:not(:last-child):after{right:auto;left:-1px}.semi-rtl .semi-input-group .semi-input-number:not(:last-child):after,.semi-portal-rtl .semi-input-group .semi-input-number:not(:last-child):after{right:auto;left:-1px}.semi-rtl .semi-input-textarea-wrapper,.semi-portal-rtl .semi-input-textarea-wrapper{direction:rtl}.semi-rtl .semi-input-textarea-counter,.semi-portal-rtl .semi-input-textarea-counter{text-align:left}.semi-rtl .semi-input-textarea-showClear,.semi-portal-rtl .semi-input-textarea-showClear{padding-right:0;padding-left:36px}.ga-services-page{padding:16px 12px;height:100%;width:100%;overflow-y:auto}.ga-services-loading{display:flex;align-items:center;justify-content:center;gap:8px;padding:48px 0}.ga-services-loading--col{flex-direction:column;gap:6px}.ga-bridge-hint{font-size:12px;color:var(--semi-color-text-2);background:var(--semi-color-fill-0);padding:4px 10px;border-radius:4px;margin-top:4px}.ga-channel-list{display:flex;flex-direction:column;gap:8px;padding:4px 0 12px;width:100%}.ga-channel-card{display:flex;align-items:center;justify-content:space-between;padding:12px 16px;border-radius:8px;background:var(--dt-card);border:1px solid var(--ui-stroke-tertiary);transition:border-color .15s}.ga-channel-card:hover{border-color:var(--ui-stroke-secondary)}.ga-channel-card-info{display:flex;align-items:center;gap:6px}.ga-channel-icon{width:18px;height:18px;flex-shrink:0}.ga-channel-card-name{font-weight:500;margin-right:8px}.ga-channel-card-actions{display:flex;align-items:center;gap:4px}.ga-status-panel{padding:4px 0 12px}.ga-service-identity{display:inline-flex;min-width:0;flex-direction:column;gap:2px;padding:2px 0}.ga-service-identity-name{color:var(--semi-color-text-0);font-weight:600;line-height:20px}.ga-service-identity-summary{color:var(--semi-color-text-2);font-size:12px;line-height:18px;white-space:normal}.ga-offline-banner{display:flex;align-items:center;gap:6px;padding:6px 12px;margin-bottom:8px;border-radius:6px;background:var(--semi-color-warning-light-default);color:var(--semi-color-warning);font-size:12px;line-height:1.4}.ga-offline-banner>span{flex:1}.ga-status-actions{display:flex;gap:4px;align-items:center}.ga-log-dialog .semi-modal-content{padding-left:24px;padding-right:0;max-height:85vh;display:flex;flex-direction:column}.ga-log-dialog .semi-modal-header{padding-right:24px;flex-shrink:0}.ga-log-dialog .semi-modal-body{padding:0 24px 0 0;flex:1;min-height:0} diff --git a/frontends/desktop/dist/assets/ServicesPage-DrjRw530.js b/frontends/desktop/dist/assets/ServicesPage-DrjRw530.js new file mode 100644 index 000000000..6f74a094b --- /dev/null +++ b/frontends/desktop/dist/assets/ServicesPage-DrjRw530.js @@ -0,0 +1,4 @@ +import{c as se,b as u,ax as Le,f as Ee,h as S,_ as K,i as oe,R as v,k as Te,ay as re,l as D,n as le,V as Oe,az as X,P as f,aj as i,ab as Me}from"./tauri-compat-tfiFK9EG.js";import{T as He,a as Ve,b as ce}from"./index-DwVcZP0M.js";import{_ as he,t as Fe,c as Pe,I as Ie,a as $e,u as Be,b as q,d as z,M as fe,e as xe,i as be,f as Y,E as ye,T as ee,g as Ae,h as de}from"./main-Knf6L_en.js";import{B as _,c as Q,I as Ke}from"./index-Bpi3BHKj.js";import{S as G}from"./index-D_sWIqse.js";import{I as ve}from"./IconFile-CgfQSwGI.js";import"./WindowsTitlebar-CrkUa1UM.js";function We(s){return u.createElement("svg",Object.assign({viewBox:"0 0 24 24",fill:"none",xmlns:"http://www.w3.org/2000/svg",width:"1em",height:"1em",focusable:!1,"aria-hidden":!0},s),u.createElement("path",{d:"M5 2.9a1 1 0 0 1 1.57-.82l13.23 9.1a1 1 0 0 1 0 1.64l-13.23 9.1A1 1 0 0 1 5 21.1V2.9Z",fill:"currentColor"}))}const we=se(We,"play");function Ue(s){return u.createElement("svg",Object.assign({viewBox:"0 0 24 24",fill:"none",xmlns:"http://www.w3.org/2000/svg",width:"1em",height:"1em",focusable:!1,"aria-hidden":!0},s),u.createElement("path",{fillRule:"evenodd",clipRule:"evenodd",d:"M8 5.07c-.8.47-1.8.46-2.6 0l-.24-.15a1.4 1.4 0 0 0-1.82.29c-.64.82-1.16 1.73-1.55 2.7a1.4 1.4 0 0 0 .66 1.71l.24.14a2.57 2.57 0 0 1 0 4.48l-.24.14a1.4 1.4 0 0 0-.66 1.72 11.1 11.1 0 0 0 1.55 2.69 1.4 1.4 0 0 0 1.82.3l.25-.15a2.57 2.57 0 0 1 3.88 2.24v.28c-.01.7.46 1.33 1.16 1.43a11 11 0 0 0 3.1 0 1.4 1.4 0 0 0 1.17-1.43v-.28a2.57 2.57 0 0 1 3.87-2.24l.25.14c.6.36 1.38.26 1.82-.29.64-.82 1.16-1.73 1.55-2.7a1.4 1.4 0 0 0-.66-1.71l-.24-.14a2.57 2.57 0 0 1 0-4.48l.24-.14a1.4 1.4 0 0 0 .66-1.72 11.08 11.08 0 0 0-1.55-2.69 1.4 1.4 0 0 0-1.82-.3l-.25.15a2.57 2.57 0 0 1-3.88-2.24v-.28c.01-.7-.46-1.33-1.16-1.43a10.99 10.99 0 0 0-3.1 0c-.7.1-1.17.72-1.17 1.43v.28C9.3 3.75 8.8 4.61 8 5.07Zm6 10.4a4 4 0 1 0-4-6.93 4 4 0 0 0 4 6.92Z",fill:"currentColor"}))}const De=se(Ue,"setting");function qe(s){return u.createElement("svg",Object.assign({viewBox:"0 0 24 24",fill:"none",xmlns:"http://www.w3.org/2000/svg",width:"1em",height:"1em",focusable:!1,"aria-hidden":!0},s),u.createElement("path",{d:"M3 6a3 3 0 0 1 3-3h12a3 3 0 0 1 3 3v12a3 3 0 0 1-3 3H6a3 3 0 0 1-3-3V6Z",fill:"currentColor"}))}const Se=se(qe,"stop");let R=null;const ue={"min-height":"0","max-height":"none",height:"0",visibility:"hidden",overflow:"hidden",position:"absolute","z-index":"-1000",top:"0",right:"0"},ge=s=>{Object.keys(ue).forEach(e=>{s.style.setProperty(e,ue[e],"important")})},pe=(s,e)=>{const t=s.scrollHeight;return e.sizingStyle.boxSizing==="border-box"?t+e.borderSize:t-e.paddingSize};function Ze(s,e){let t=arguments.length>2&&arguments[2]!==void 0?arguments[2]:1,n=arguments.length>3&&arguments[3]!==void 0?arguments[3]:1/0;R||(R=document.createElement("textarea"),R.setAttribute("tab-index","-1"),R.setAttribute("aria-hidden","true"),ge(R)),R.parentNode===null&&document.body.appendChild(R);const{paddingSize:a,borderSize:o,sizingStyle:r}=s,{boxSizing:l}=r;Object.keys(r).forEach(x=>{R.style[x]=r[x]}),ge(R),R.value=e;let c=pe(R,s);R.value="x";const g=pe(R,s)-a-o;let m=g*t;l==="border-box"&&(m=m+a+o),c=Math.max(m,c);let w=g*n;return l==="border-box"&&(w=w+a+o),c=Math.min(w,c),c}const Xe=["borderBottomWidth","borderLeftWidth","borderRightWidth","borderTopWidth","boxSizing","fontFamily","fontSize","fontStyle","fontWeight","letterSpacing","lineHeight","paddingBottom","paddingLeft","paddingRight","paddingTop","tabSize","textIndent","textRendering","textTransform","width"],Ye=s=>{const e=window.getComputedStyle(s);if(e===null)return null;const t=Le(e,Xe),{boxSizing:n}=t;if(n==="")return null;const a=parseFloat(t.paddingBottom)+parseFloat(t.paddingTop),o=parseFloat(t.borderBottomWidth)+parseFloat(t.borderTopWidth);return{sizingStyle:t,paddingSize:a,borderSize:o}};class ne extends Ee{static get textAreaDefaultAdapter(){return{notifyChange:S,setValue:S,toggleFocusing:S,toggleHovering:S,notifyFocus:S,notifyBlur:S,notifyKeyDown:S,notifyEnterPress:S}}constructor(e){super(Object.assign(Object.assign({},ne.textAreaDefaultAdapter),e)),this.compositionEnter=!1,this._changeValue=(t,n)=>{this._isControlledComponent()?this._adapter.notifyChange(t,n):(this._adapter.setValue(t),this._adapter.notifyChange(t,n))},this.getNextValue=t=>{const{maxLength:n,minLength:a,getValueLength:o}=this._adapter.getProps();return K(o)?n?this.handleVisibleMaxLength(t):(a&&this.handleVisibleMinLength(t),t):t},this.handleCompositionStart=t=>{this.compositionEnter=!0,this._adapter.notifyCompositionStart(t)},this.handleCompositionEnd=t=>{const{composition:n}=this._adapter.getProps(),a=t.target.value;if(this.compositionEnter=!1,this._adapter.notifyCompositionEnd(t),n){const c=this.getNextValue(a);this._changeValue(c,t);return}const{getValueLength:o,maxLength:r,minLength:l}=this.getProps();if(K(o)){if(r){const c=this.handleVisibleMaxLength(a);c!==a&&this._changeValue(c,t)}l&&this.handleVisibleMinLength(a)}},this.handleCompositionUpdate=t=>{this._adapter.notifyCompositionUpdate(t)},this.resizeTextarea=()=>{var t;const{height:n}=this.getStates(),{rows:a,autosize:o}=this.getProps(),r=this._adapter.getRef(),l=Ye(r);if(!l)return;const[c,g]=o!==null&&typeof o=="object"?[(t=o==null?void 0:o.minRows)!==null&&t!==void 0?t:a,o==null?void 0:o.maxRows]:[a],m=Ze(l,r.value||r.placeholder||"x",c,g);if(n!==m){this._adapter.notifyHeightUpdate(m),r.style.height=`${m}px`;return}}}destroy(){}handleValueChange(e){this._adapter.setValue(e)}handleChange(e,t){const{composition:n}=this._adapter.getProps();let a=e;if(n&&this.compositionEnter){this._adapter.setValue(a);return}this.compositionEnter||(a=this.getNextValue(a)),this._changeValue(a,t)}handleVisibleMinLength(e){const{minLength:t,getValueLength:n}=this._adapter.getProps(),{minLength:a}=this._adapter.getStates();if(he(t)&&t>=0&&K(n)&&oe(e)){const o=n(e);if(o=0&&oe(e)){if(K(n)){if(n(e)>t)return console.warn("[Semi TextArea] The input character is truncated because the input length exceeds the maximum length limit"),this.handleTruncateValue(e,t)}else if(e.length>t)return console.warn("[Semi TextArea] The input character is truncated because the input length exceeds the maximum length limit"),e.slice(0,t);return e}}handleTruncateValue(e,t){const{getValueLength:n}=this._adapter.getProps();return Fe({value:e,maxLength:t,getValueLength:n})}handleFocus(e){const{value:t}=this.getStates();this._adapter.toggleFocusing(!0),this._adapter.notifyFocus(t,e)}handleBlur(e){const{value:t}=this.getStates(),{maxLength:n}=this.getProps();let a=t;n&&(a=this.handleVisibleMaxLength(t),a!==t&&(this._isControlledComponent()||this._adapter.setValue(a),this._adapter.notifyChange(a,e))),this._adapter.toggleFocusing(!1),this._adapter.notifyBlur(a,e)}handleKeyDown(e){const{disabledEnterStartNewLine:t}=this.getProps();t&&e.key==="Enter"&&!e.shiftKey&&e.preventDefault(),this._adapter.notifyKeyDown(e),e.keyCode===13&&this._adapter.notifyPressEnter(e)}handleMouseEnter(e){this._adapter.toggleHovering(!0)}handleMouseLeave(e){this._adapter.toggleHovering(!1)}isAllowClear(){const{value:e,isFocus:t,isHover:n}=this._adapter.getStates(),{showClear:a,disabled:o,readonly:r}=this._adapter.getProps();return e&&a&&!o&&(t||n)&&!r}handleClear(e){const{isFocus:t}=this.getStates();this._isControlledComponent("value")?this._adapter.setState({isFocus:!1}):this._adapter.setState({value:"",isFocus:!1}),t&&this._adapter.notifyBlur("",e),this._adapter.notifyChange("",e),this._adapter.notifyClear(e),this.stopPropagation(e)}handleClick(e){const{disabled:t,readonly:n}=this._adapter.getProps(),{isFocus:a}=this._adapter.getStates();t||n||a||this._adapter.isEventTarget(e)&&(this._adapter.focusInput(),this._adapter.toggleFocusing(!0))}handleCounterClick(e){const{disabled:t,readonly:n}=this._adapter.getProps(),{isFocus:a}=this._adapter.getStates();t||n||a||(this._adapter.focusInput(),this._adapter.toggleFocusing(!0))}}var Qe=function(s,e){var t={};for(var n in s)Object.prototype.hasOwnProperty.call(s,n)&&e.indexOf(n)<0&&(t[n]=s[n]);if(s!=null&&typeof Object.getOwnPropertySymbols=="function")for(var a=0,n=Object.getOwnPropertySymbols(s);a{var a,o;if(this.props.autosize)return;const r=n&&n[0],l=r&&r.contentRect;if(!l)return;const c=l.width,g=l.height;if(!this.nativeResizeObservedOnce){this.nativeResizeObservedOnce=!0,this.lastNativeSize={width:c,height:g};return}const m=this.lastNativeSize;m&&m.width===c&&m.height===g||(this.lastNativeSize={width:c,height:g},(o=(a=this.props).onResize)===null||o===void 0||o.call(a,{height:g,width:c}))},this.handleClear=n=>{this.foundation.handleClear(n)},this.handleClick=n=>{this.foundation.handleClick(n)},this.handleCounterClick=n=>{this.foundation.handleCounterClick(n)},this.setRef=n=>{this.libRef.current=n;const{forwardRef:a}=this.props;typeof a=="function"?a(n):a&&typeof a=="object"&&(a.current=n)},this.handleTextAreaScroll=n=>{const{showLineNumber:a}=this.props;a&&this.lineNumberRef.current&&requestAnimationFrame(()=>{const o=this.lineNumberRef.current;o&&(o.scrollTop=n.target.scrollTop)})},this.getTextareaLineHeightPx=n=>{const a=window.getComputedStyle(n),o=a.lineHeight,r=parseFloat(a.fontSize)||14;if(!o||o==="normal")return r*1.5;const l=parseFloat(o);return Number.isFinite(l)&&l>0?l:r*1.5},this.calculateWrappedLines=(n,a)=>{if(!n)return 1;const o=window.getComputedStyle(a),l=document.createElement("canvas").getContext("2d");if(!l)return 1;const c=o.fontSize,g=o.fontFamily;l.font=`${c} ${g}`;const m=parseFloat(o.paddingLeft)||0,w=parseFloat(o.paddingRight)||0,x=a.clientWidth-m-w;if(x<=0)return 1;const C=l.measureText(n).width,k=Math.ceil(C/x);return Math.max(1,k)};const t="value"in e?e.value:e.defaultValue;this.state={value:t,isFocus:!1,isHover:!1,height:0,minLength:e.minLength,cachedValue:e.value,textareaWidth:0,textareaHeight:0},this.focusing=!1,this.foundation=new ne(this.adapter),this.lineNumberResizeObserver=null,this.libRef=v.createRef(),this.lineNumberRef=v.createRef(),this.throttledResizeTextarea=re(this.foundation.resizeTextarea,10),this.throttledNotifyNativeResize=re(this.handleNativeResize,10),this.nativeResizeObservedOnce=!1,this.lastNativeSize=null}get adapter(){return Object.assign(Object.assign({},super.adapter),{setValue:e=>this.setState({value:e},()=>{this.props.autosize&&this.foundation.resizeTextarea()}),getRef:()=>this.libRef.current,toggleFocusing:e=>this.setState({isFocus:e}),toggleHovering:e=>this.setState({isHover:e}),notifyChange:(e,t)=>{this.props.onChange(e,t)},notifyClear:e=>this.props.onClear(e),notifyBlur:(e,t)=>this.props.onBlur(t),notifyFocus:(e,t)=>this.props.onFocus(t),notifyKeyDown:e=>{this.props.onKeyDown(e)},notifyHeightUpdate:e=>{this.setState({height:e}),this.props.onResize({height:e})},notifyPressEnter:e=>{this.props.onEnterPress&&this.props.onEnterPress(e)},notifyCompositionStart:e=>this.props.onCompositionStart(e),notifyCompositionEnd:e=>this.props.onCompositionEnd(e),notifyCompositionUpdate:e=>this.props.onCompositionUpdate(e),setMinLength:e=>this.setState({minLength:e}),focusInput:()=>{const e=this.libRef&&this.libRef.current;e&&e.focus()},isEventTarget:e=>e&&e.target===e.currentTarget})}static getDerivedStateFromProps(e,t){const n={};return e.value!==t.cachedValue&&(n.value=e.value,n.cachedValue=e.value),n}componentDidMount(){if(this.props.showLineNumber&&this.libRef.current&&typeof globalThis.ResizeObserver<"u"){const e=this.libRef.current;this.setState({textareaWidth:e.clientWidth,textareaHeight:e.clientHeight}),this.lineNumberResizeObserver=new globalThis.ResizeObserver(t=>{for(const n of t){const a=n.contentRect.width,o=n.contentRect.height;this.setState({textareaWidth:a,textareaHeight:o})}}),this.lineNumberResizeObserver.observe(e)}}componentWillUnmount(){var e,t,n,a;this.throttledResizeTextarea&&((t=(e=this.throttledResizeTextarea)===null||e===void 0?void 0:e.cancel)===null||t===void 0||t.call(e),this.throttledResizeTextarea=null),this.throttledNotifyNativeResize&&((a=(n=this.throttledNotifyNativeResize)===null||n===void 0?void 0:n.cancel)===null||a===void 0||a.call(n),this.throttledNotifyNativeResize=null),this.lineNumberResizeObserver&&(this.lineNumberResizeObserver.disconnect(),this.lineNumberResizeObserver=null)}componentDidUpdate(e,t){if((this.props.value!==e.value||this.props.placeholder!==e.placeholder)&&this.props.autosize&&this.foundation.resizeTextarea(),this.props.showLineNumber!==e.showLineNumber)if(this.props.showLineNumber&&this.libRef.current&&typeof globalThis.ResizeObserver<"u"){const n=this.libRef.current;this.setState({textareaWidth:n.clientWidth,textareaHeight:n.clientHeight}),this.lineNumberResizeObserver||(this.lineNumberResizeObserver=new globalThis.ResizeObserver(a=>{for(const o of a){const r=o.contentRect.width,l=o.contentRect.height;this.setState({textareaWidth:r,textareaHeight:l})}})),this.lineNumberResizeObserver.observe(n)}else this.lineNumberResizeObserver&&(this.lineNumberResizeObserver.disconnect(),this.lineNumberResizeObserver=null)}renderClearBtn(){const{showClear:e}=this.props,t=this.foundation.isAllowClear(),n=D(`${y}-clearbtn`,{[`${y}-clearbtn-hidden`]:!t});return e?v.createElement("div",{className:n,onClick:this.handleClear},v.createElement(Ie,null)):null}renderCounter(){let e,t,n,a;const{showCounter:o,maxCount:r,getValueLength:l}=this.props;if(o||r){const{value:c}=this.state;t=c?K(l)?l(c):c.length:0,n=r||null,a=D(`${y}-textarea-counter`,{[`${y}-textarea-counter-exceed`]:t>n}),e=v.createElement("div",{className:a,onClick:this.handleCounterClick},t,n?"/":null,n)}else e=null;return e}renderLineNumbers(){const{showLineNumber:e,lineNumberStart:t=1,lineNumberClassName:n,lineNumberStyle:a}=this.props;if(!e)return null;const{value:o,textareaWidth:r,textareaHeight:l}=this.state,c=this.libRef.current,g=o?o.split(` +`):[""],m=D(`${y}-textarea-lineNumber`,n),w=c?this.getTextareaLineHeightPx(c):21,x=Object.assign(Object.assign({},a||{}),{height:l?`${l}px`:void 0,maxHeight:l?`${l}px`:void 0});return v.createElement("div",{ref:this.lineNumberRef,className:m,style:x},g.map((E,C)=>{const k=c?this.calculateWrappedLines(E,c):1;return v.createElement("div",{key:C,className:`${y}-textarea-lineNumber-item`,style:{minHeight:`${k*w}px`,lineHeight:`${w}px`}},t+C)}))}render(){const e=this.props,{autosize:t,placeholder:n,onEnterPress:a,onResize:o,resize:r,disabled:l,readonly:c,className:g,showCounter:m,validateStatus:w,maxCount:x,defaultValue:E,style:C,textareaStyle:k,forwardRef:T,getValueLength:H,maxLength:p,minLength:N,showClear:O,borderless:L,autoFocus:I,showLineNumber:h,lineNumberStart:d,lineNumberClassName:b,lineNumberStyle:M,composition:U}=e,$=Qe(e,["autosize","placeholder","onEnterPress","onResize","resize","disabled","readonly","className","showCounter","validateStatus","maxCount","defaultValue","style","textareaStyle","forwardRef","getValueLength","maxLength","minLength","showClear","borderless","autoFocus","showLineNumber","lineNumberStart","lineNumberClassName","lineNumberStyle","composition"]),{isFocus:Z,value:B,minLength:F}=this.state,A=!le(r),je=!t&&A&&["horizontal","both","inline"].includes(r),Re=!t&&A&&["vertical","both","block"].includes(r),_e=D(g,`${y}-textarea-wrapper`,{[`${y}-textarea-borderless`]:L,[`${y}-textarea-wrapper-disabled`]:l,[`${y}-textarea-wrapper-readonly`]:c,[`${y}-textarea-wrapper-${w}`]:!!w,[`${y}-textarea-wrapper-focus`]:Z,[`${y}-textarea-wrapper-withLineNumber`]:h,[`${y}-textarea-wrapper-resizeX`]:je,[`${y}-textarea-wrapper-resizeY`]:Re}),ke=D(`${y}-textarea`,{[`${y}-textarea-disabled`]:l,[`${y}-textarea-readonly`]:c,[`${y}-textarea-autosize`]:$e(t)?le(t==null?void 0:t.maxRows):t,[`${y}-textarea-showClear`]:O}),J=Object.assign({},k||{});t?J.resize="none":A&&(J.resize=r);const ie=!t&&A&&r&&r!=="none",V=Object.assign(Object.assign({},Oe($,"insetLabel","insetLabelId","getValueLength","onClear","showClear","disabledEnterStartNewLine","composition")),{style:J,autoFocus:I||this.props.autofocus,className:ke,disabled:l,readOnly:c,placeholder:n||null,onChange:j=>this.foundation.handleChange(j.target.value,j),onFocus:j=>this.foundation.handleFocus(j),onBlur:j=>this.foundation.handleBlur(j.nativeEvent),onKeyDown:j=>this.foundation.handleKeyDown(j),onScroll:this.handleTextAreaScroll,value:B??"",onCompositionStart:this.foundation.handleCompositionStart,onCompositionEnd:this.foundation.handleCompositionEnd,onCompositionUpdate:this.foundation.handleCompositionUpdate});return K(H)||(V.maxLength=p),F&&(V.minLength=F),v.createElement("div",{className:_e,style:C,onMouseEnter:j=>this.foundation.handleMouseEnter(j),onMouseLeave:j=>this.foundation.handleMouseLeave(j),onClick:j=>this.handleClick(j)},this.renderLineNumbers(),h?v.createElement("div",{className:`${y}-textarea-content`},t?v.createElement(X,{onResize:this.throttledResizeTextarea},v.createElement("textarea",Object.assign({},V,{ref:this.setRef}))):ie?v.createElement(X,{onResize:this.throttledNotifyNativeResize},v.createElement("textarea",Object.assign({},V,{ref:this.setRef}))):v.createElement("textarea",Object.assign({},V,{ref:this.setRef}))):t?v.createElement(X,{onResize:this.throttledResizeTextarea},v.createElement("textarea",Object.assign({},V,{ref:this.setRef}))):ie?v.createElement(X,{onResize:this.throttledNotifyNativeResize},v.createElement("textarea",Object.assign({},V,{ref:this.setRef}))):v.createElement("textarea",Object.assign({},V,{ref:this.setRef})),this.renderClearBtn(),this.renderCounter())}}ae.propTypes={autosize:f.oneOfType([f.bool,f.object]),borderless:f.bool,placeholder:f.string,value:f.string,rows:f.number,cols:f.number,maxCount:f.number,onEnterPress:f.func,validateStatus:f.string,className:f.string,style:f.object,textareaStyle:f.object,showClear:f.bool,onClear:f.func,onResize:f.func,onCompositionStart:f.func,onCompositionEnd:f.func,onCompositionUpdate:f.func,getValueLength:f.func,disabledEnterStartNewLine:f.bool,composition:f.bool,showLineNumber:f.bool,lineNumberStart:f.number,lineNumberClassName:f.string,lineNumberStyle:f.object,resize:f.oneOf(["none","both","horizontal","vertical","block","inline"])};ae.defaultProps={autosize:!1,borderless:!1,rows:4,cols:20,showCounter:!1,showClear:!1,onEnterPress:S,onChange:S,onBlur:S,onFocus:S,onKeyDown:S,onResize:S,onClear:S,onCompositionStart:S,onCompositionEnd:S,onCompositionUpdate:S,composition:!1,showLineNumber:!1,lineNumberStart:1};const Ge=v.forwardRef((s,e)=>v.createElement(ae,Object.assign({},s,{forwardRef:e})));function Je({lines:s,emptyLabel:e="No logs",className:t}){const n=u.useRef(null),a=u.useRef(!0),[o,r]=u.useState(!1);u.useEffect(()=>{const g=n.current;g&&a.current&&(g.scrollTop=g.scrollHeight)},[s]);const l=u.useCallback(g=>{const m=g.currentTarget;a.current=m.scrollHeight-m.scrollTop-m.clientHeight<24},[]),c=u.useCallback(()=>{s!=null&&s.length&&navigator.clipboard.writeText(s.join(` +`)).then(()=>{r(!0),setTimeout(()=>r(!1),1500)})},[s]);return i.jsxs("div",{className:`ga-log-tail ${t??""}`,children:[i.jsx("button",{type:"button",className:`ga-log-tail-copy ${o?"copied":""}`,onClick:c,title:"Copy",children:o?"✓":"⎘"}),i.jsx("div",{ref:n,className:"ga-log-tail-scroll",onScroll:l,children:s===null?i.jsx("p",{className:"ga-log-tail-empty",children:"…"}):s.length===0?i.jsx("p",{className:"ga-log-tail-empty",children:e}):i.jsx("pre",{className:"ga-log-tail-pre",children:s.map((g,m)=>i.jsxs("span",{className:g.startsWith("=====")?"ga-log-separator":void 0,children:[g,` +`]},m))})})]})}function Ce(s,e){Be.getState().notify({kind:e,message:s})}function W(s){Ce(s,"error")}function P(s){Ce(s,"success")}const et=3e3;function ze({serviceId:s,onClose:e}){const{t}=q(),n=z(c=>c.fetchLogs),[a,o]=u.useState(null),r=u.useRef(null),l=u.useCallback(async()=>{if(!s)return;const c=await n(s);o(c)},[s,n]);return u.useEffect(()=>(s&&(o(null),l(),r.current=setInterval(l,et)),()=>{r.current&&(clearInterval(r.current),r.current=null)}),[s,l]),i.jsx(fe,{title:t("modal.channelLogs"),visible:s!==null,onCancel:e,footer:null,width:870,centered:!0,closeOnEsc:!0,className:"ga-log-dialog",children:a===null?i.jsx("div",{className:"ga-services-loading",style:{padding:24},children:i.jsx(G,{})}):i.jsx(Je,{lines:a,emptyLabel:t("ch.logEmpty"),className:"ga-log-modal-body"})})}function tt({visible:s,onClose:e}){const{t}=q(),n=z(x=>x.fetchMykey),a=z(x=>x.saveMykey),o=z(x=>x.mykeyContent),r=z(x=>x.mykeyLoading),[l,c]=u.useState(""),[g,m]=u.useState(!1);u.useEffect(()=>{s&&n()},[s,n]),u.useEffect(()=>{c(o)},[o]);const w=async()=>{m(!0);const x=await a(l);m(!1),x?(P(t("sys.configSaved")),e()):W(t("err.mykeyExport"))};return i.jsx(fe,{title:t("modal.mykeyConfig"),visible:s,onCancel:e,width:870,centered:!0,closeOnEsc:!0,className:"ga-settings-dialog",footer:i.jsxs("div",{style:{display:"flex",gap:8,justifyContent:"flex-end",padding:"8px 0"},children:[i.jsx(_,{onClick:e,children:t("common.cancel")}),i.jsx(_,{type:"primary",loading:g,onClick:w,children:t("common.save")})]}),children:r?i.jsx("div",{className:"ga-services-loading",children:i.jsx(G,{})}):i.jsx(Ge,{value:l,onChange:x=>c(x),autosize:{minRows:16,maxRows:30},style:{fontFamily:"var(--font-mono)",fontSize:13}})})}const st="data:image/svg+xml,%3csvg%20role='img'%20viewBox='0%200%2024%2024'%20xmlns='http://www.w3.org/2000/svg'%3e%3ctitle%3eTencent%20QQ%3c/title%3e%3cpath%20d='M21.395%2015.035a40%2040%200%200%200-.803-2.264l-1.079-2.695c.001-.032.014-.562.014-.836C19.526%204.632%2017.351%200%2012%200S4.474%204.632%204.474%209.241c0%20.274.013.804.014.836l-1.08%202.695a39%2039%200%200%200-.802%202.264c-1.021%203.283-.69%204.643-.438%204.673.54.065%202.103-2.472%202.103-2.472%200%201.469.756%203.387%202.394%204.771-.612.188-1.363.479-1.845.835-.434.32-.379.646-.301.778.343.578%205.883.369%207.482.189%201.6.18%207.14.389%207.483-.189.078-.132.132-.458-.301-.778-.483-.356-1.233-.646-1.846-.836%201.637-1.384%202.393-3.302%202.393-4.771%200%200%201.563%202.537%202.103%202.472.251-.03.581-1.39-.438-4.673'/%3e%3c/svg%3e",nt="data:image/svg+xml,%3csvg%20role='img'%20viewBox='0%200%2024%2024'%20xmlns='http://www.w3.org/2000/svg'%3e%3ctitle%3eWeChat%3c/title%3e%3cpath%20d='M8.691%202.188C3.891%202.188%200%205.476%200%209.53c0%202.212%201.17%204.203%203.002%205.55a.59.59%200%200%201%20.213.665l-.39%201.48c-.019.07-.048.141-.048.213%200%20.163.13.295.29.295a.326.326%200%200%200%20.167-.054l1.903-1.114a.864.864%200%200%201%20.717-.098%2010.16%2010.16%200%200%200%202.837.403c.276%200%20.543-.027.811-.05-.857-2.578.157-4.972%201.932-6.446%201.703-1.415%203.882-1.98%205.853-1.838-.576-3.583-4.196-6.348-8.596-6.348zM5.785%205.991c.642%200%201.162.529%201.162%201.18a1.17%201.17%200%200%201-1.162%201.178A1.17%201.17%200%200%201%204.623%207.17c0-.651.52-1.18%201.162-1.18zm5.813%200c.642%200%201.162.529%201.162%201.18a1.17%201.17%200%200%201-1.162%201.178%201.17%201.17%200%200%201-1.162-1.178c0-.651.52-1.18%201.162-1.18zm5.34%202.867c-1.797-.052-3.746.512-5.28%201.786-1.72%201.428-2.687%203.72-1.78%206.22.942%202.453%203.666%204.229%206.884%204.229.826%200%201.622-.12%202.361-.336a.722.722%200%200%201%20.598.082l1.584.926a.272.272%200%200%200%20.14.047c.134%200%20.24-.111.24-.247%200-.06-.023-.12-.038-.177l-.327-1.233a.582.582%200%200%201-.023-.156.49.49%200%200%201%20.201-.398C23.024%2018.48%2024%2016.82%2024%2014.98c0-3.21-2.931-5.837-6.656-6.088V8.89c-.135-.01-.27-.027-.407-.03zm-2.53%203.274c.535%200%20.969.44.969.982a.976.976%200%200%201-.969.983.976.976%200%200%201-.969-.983c0-.542.434-.982.97-.982zm4.844%200c.535%200%20.969.44.969.982a.976.976%200%200%201-.969.983.976.976%200%200%201-.969-.983c0-.542.434-.982.969-.982z'/%3e%3c/svg%3e",at="data:image/svg+xml,%3csvg%20width='46'%20height='46'%20fill='none'%20xmlns='http://www.w3.org/2000/svg'%3e%3cg%20clip-path='url(%23clip0_338_13245)'%3e%3cpath%20d='M39.743%200H6.257A6.257%206.257%200%200%200%200%206.257v33.487A6.257%206.257%200%200%200%206.257%2046h33.487A6.257%206.257%200%200%200%2046%2039.743V6.257A6.257%206.257%200%200%200%2039.743%200'%20fill='%23fff'/%3e%3cmask%20id='mask0_338_13245'%20style='mask-type:luminance'%20maskUnits='userSpaceOnUse'%20x='5'%20y='8'%20width='36'%20height='30'%3e%3cpath%20d='M40.514%208.373H5.484v29.262h35.03z'%20fill='%23fff'/%3e%3c/mask%3e%3cg%20mask='url(%23mask0_338_13245)'%3e%3cpath%20d='M28.856%2031.647a.483.483%200%200%200%20.06.738%206.2%206.2%200%200%201%201.911%203.725%202.02%202.02%200%201%200%202.16-2.54%206.2%206.2%200%200%201-3.448-1.922.483.483%200%200%200-.683-.001'%20fill='%23fb6500'/%3e%3c/g%3e%3cmask%20id='mask1_338_13245'%20style='mask-type:luminance'%20maskUnits='userSpaceOnUse'%20x='5'%20y='8'%20width='36'%20height='30'%3e%3cpath%20d='M40.514%208.373H5.484v29.262h35.03z'%20fill='%23fff'/%3e%3c/mask%3e%3cg%20mask='url(%23mask1_338_13245)'%3e%3cpath%20d='M37.057%2028.448a2%202%200%200%200-.58%201.215%206.2%206.2%200%200%201-1.918%203.454.484.484%200%201%200%20.738.616%206.2%206.2%200%200%201%203.725-1.91%202.02%202.02%200%201%200-1.96-3.376z'%20fill='%230082ef'/%3e%3c/g%3e%3cpath%20d='M31.366%2022.75a2.02%202.02%200%200%200%201.215%203.435%206.2%206.2%200%200%201%203.454%201.918.483.483%200%200%200%20.829-.27.48.48%200%200%200-.212-.468%206.2%206.2%200%200%201-1.911-3.726%202.02%202.02%200%200%200-3.375-.889'%20fill='%232dbc00'/%3e%3cmask%20id='mask2_338_13245'%20style='mask-type:luminance'%20maskUnits='userSpaceOnUse'%20x='5'%20y='8'%20width='36'%20height='30'%3e%3cpath%20d='M40.514%208.373H5.484v29.262h35.03z'%20fill='%23fff'/%3e%3c/mask%3e%3cg%20mask='url(%23mask2_338_13245)'%3e%3cpath%20d='m30.374%2025.907-.037.037a6.2%206.2%200%200%201-3.78%201.978%202.007%202.007%200%200%200-.895%203.374%202.02%202.02%200%200%200%203.435-1.216%206.2%206.2%200%200%201%201.923-3.453.484.484%200%200%200-.646-.72'%20fill='%23fc0'/%3e%3c/g%3e%3cmask%20id='mask3_338_13245'%20style='mask-type:luminance'%20maskUnits='userSpaceOnUse'%20x='5'%20y='8'%20width='36'%20height='30'%3e%3cpath%20d='M40.514%208.373H5.484v29.262h35.03z'%20fill='%23fff'/%3e%3c/mask%3e%3cg%20mask='url(%23mask3_338_13245)'%3e%3cpath%20d='M18.17%208.471c-3.624.4-6.908%201.948-9.266%204.367-.938.956-1.7%202.032-2.262%203.182a11.08%2011.08%200%200%200%20.78%2011.188c.64.968%201.693%202.178%202.654%203.037l-.435%203.423-.048.145c-.012.042-.012.09-.018.133l-.012.108.012.11a1.1%201.1%200%200%200%201.657.852h.018l.067-.049%201.04-.52%203.102-1.56a16%2016%200%200%200%204.537.623c1.897.004%203.78-.323%205.564-.968a2.014%202.014%200%200%201-1.373-2.11%2013.7%2013.7%200%200%201-5.721.568l-.309-.042a14%2014%200%200%201-2.056-.43%201.4%201.4%200%200%200-1.1.116l-.085.042-2.552%201.5-.109.066c-.06.036-.09.048-.12.048a.176.176%200%200%201-.164-.181l.097-.393.115-.43.181-.707.212-.787a1.07%201.07%200%200%200-.387-1.19%2011.2%2011.2%200%200%201-2.577-2.686%208.73%208.73%200%200%201-.629-8.818c.46-.92%201.065-1.773%201.815-2.54%201.935-1.997%204.657-3.267%207.669-3.593a14.3%2014.3%200%200%201%203.132%200c2.994.344%205.704%201.633%207.627%203.617a10%2010%200%200%201%201.796%202.551%208.7%208.7%200%200%201%20.901%203.84c0%20.14-.012.279-.018.412a2.015%202.015%200%200%201%202.48.29l.09.109a11%2011%200%200%200-1.1-5.733%2012.3%2012.3%200%200%200-2.238-3.182%2015.18%2015.18%200%200%200-9.229-4.397%2017%2017%200%200%200-3.739-.01'%20fill='%230082ef'/%3e%3c/g%3e%3c/g%3e%3cdefs%3e%3cclipPath%20id='clip0_338_13245'%3e%3cpath%20fill='%23fff'%20d='M0%200h46v46H0z'/%3e%3c/clipPath%3e%3c/defs%3e%3c/svg%3e",it="data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='64%2064%20896%20896'%20fill='%233089F2'%3e%3cpath%20d='M573.7%20252.5C422.5%20197.4%20201.3%2096.7%20201.3%2096.7c-15.7-4.1-17.9%2011.1-17.9%2011.1-5%2061.1%2033.6%20160.5%2053.6%20182.8%2019.9%2022.3%20319.1%20113.7%20319.1%20113.7S326%20357.9%20270.5%20341.9c-55.6-16-37.9%2017.8-37.9%2017.8%2011.4%2061.7%2064.9%20131.8%20107.2%20138.4%2042.2%206.6%20220.1%204%20220.1%204s-35.5%204.1-93.2%2011.9c-42.7%205.8-97%2012.5-111.1%2017.8-33.1%2012.5%2024%2062.6%2024%2062.6%2084.7%2076.8%20129.7%2050.5%20129.7%2050.5%2033.3-10.7%2061.4-18.5%2085.2-24.2L565%20743.1h84.6L603%20928l205.3-271.9H700.8l22.3-38.7c.3.5.4.8.4.8S799.8%20496.1%20829%20433.8l.6-1h-.1c5-10.8%208.6-19.7%2010-25.8%2017-71.3-114.5-99.4-265.8-154.5z'%20/%3e%3c/svg%3e",ot="data:image/svg+xml,%3csvg%20role='img'%20viewBox='0%200%2024%2024'%20xmlns='http://www.w3.org/2000/svg'%3e%3ctitle%3eTelegram%3c/title%3e%3cpath%20d='M11.944%200A12%2012%200%200%200%200%2012a12%2012%200%200%200%2012%2012%2012%2012%200%200%200%2012-12A12%2012%200%200%200%2012%200a12%2012%200%200%200-.056%200zm4.962%207.224c.1-.002.321.023.465.14a.506.506%200%200%201%20.171.325c.016.093.036.306.02.472-.18%201.898-.962%206.502-1.36%208.627-.168.9-.499%201.201-.82%201.23-.696.065-1.225-.46-1.9-.902-1.056-.693-1.653-1.124-2.678-1.8-1.185-.78-.417-1.21.258-1.91.177-.184%203.247-2.977%203.307-3.23.007-.032.014-.15-.056-.212s-.174-.041-.249-.024c-.106.024-1.793%201.14-5.061%203.345-.48.33-.913.49-1.302.48-.428-.008-1.252-.241-1.865-.44-.752-.245-1.349-.374-1.297-.789.027-.216.325-.437.893-.663%203.498-1.524%205.83-2.529%206.998-3.014%203.332-1.386%204.025-1.627%204.476-1.635z'/%3e%3c/svg%3e",rt="data:image/svg+xml,%3csvg%20role='img'%20viewBox='0%200%2024%2024'%20xmlns='http://www.w3.org/2000/svg'%3e%3ctitle%3eDiscord%3c/title%3e%3cpath%20d='M20.317%204.3698a19.7913%2019.7913%200%2000-4.8851-1.5152.0741.0741%200%2000-.0785.0371c-.211.3753-.4447.8648-.6083%201.2495-1.8447-.2762-3.68-.2762-5.4868%200-.1636-.3933-.4058-.8742-.6177-1.2495a.077.077%200%2000-.0785-.037%2019.7363%2019.7363%200%2000-4.8852%201.515.0699.0699%200%2000-.0321.0277C.5334%209.0458-.319%2013.5799.0992%2018.0578a.0824.0824%200%2000.0312.0561c2.0528%201.5076%204.0413%202.4228%205.9929%203.0294a.0777.0777%200%2000.0842-.0276c.4616-.6304.8731-1.2952%201.226-1.9942a.076.076%200%2000-.0416-.1057c-.6528-.2476-1.2743-.5495-1.8722-.8923a.077.077%200%2001-.0076-.1277c.1258-.0943.2517-.1923.3718-.2914a.0743.0743%200%2001.0776-.0105c3.9278%201.7933%208.18%201.7933%2012.0614%200a.0739.0739%200%2001.0785.0095c.1202.099.246.1981.3728.2924a.077.077%200%2001-.0066.1276%2012.2986%2012.2986%200%2001-1.873.8914.0766.0766%200%2000-.0407.1067c.3604.698.7719%201.3628%201.225%201.9932a.076.076%200%2000.0842.0286c1.961-.6067%203.9495-1.5219%206.0023-3.0294a.077.077%200%2000.0313-.0552c.5004-5.177-.8382-9.6739-3.5485-13.6604a.061.061%200%2000-.0312-.0286zM8.02%2015.3312c-1.1825%200-2.1569-1.0857-2.1569-2.419%200-1.3332.9555-2.4189%202.157-2.4189%201.2108%200%202.1757%201.0952%202.1568%202.419%200%201.3332-.9555%202.4189-2.1569%202.4189zm7.9748%200c-1.1825%200-2.1569-1.0857-2.1569-2.419%200-1.3332.9554-2.4189%202.1569-2.4189%201.2108%200%202.1757%201.0952%202.1568%202.419%200%201.3332-.946%202.4189-2.1568%202.4189Z'/%3e%3c/svg%3e",lt="/assets/feishu-9hxxyz3-.svg",te={"frontends/qqapp.py":{label:"ch.qq",icon:st},"frontends/wechatapp.py":{label:"ch.wechat",icon:nt},"frontends/wecomapp.py":{label:"ch.wecom",icon:at},"frontends/dingtalkapp.py":{label:"ch.dingtalk",icon:it},"frontends/tgapp.py":{label:"ch.telegram",icon:ot},"frontends/dcapp.py":{label:"ch.discord",icon:rt},"frontends/fsapp.py":{label:"ch.lark",icon:lt}},ct=Object.fromEntries(Object.entries(te).map(([s,e])=>[s,e.label])),me=new Set(Object.keys(ct));function Ne(s){return me.has(s.id)||me.has(s.name)}function ht(){const{t:s}=q(),e=xe(),t=z(p=>p.services),n=z(p=>p.loading),a=z(p=>p.startService),o=z(p=>p.stopService),[r,l]=u.useState(new Set),[c,g]=u.useState(null),[m,w]=u.useState(!1),[x,E]=u.useState(!1),C=t.filter(Ne),k=u.useCallback(async()=>{E(!0);try{await be()}catch{W(s("err.bridge"))}finally{E(!1)}},[s]),T=u.useCallback(async p=>{l(N=>new Set([...N,p.id]));try{p.running?await o(p.id)?P(s("sys.channelStopped")):W(s("err.channelStop")):await a(p.id)?P(s("sys.channelStarted")):W(s("err.channelStart"))}finally{l(N=>{const O=new Set(N);return O.delete(p.id),O})}},[a,o,s]),H=e!=="ready";return H&&C.length===0?i.jsxs("div",{className:"ga-services-loading ga-services-loading--col",children:[i.jsx(Q,{style:{color:"var(--semi-color-warning)",fontSize:24}}),i.jsx("span",{children:s("bridge.notRunning")}),Y()?i.jsx(_,{"data-testid":"bridge-restart",loading:x,onClick:k,theme:"light",type:"primary",children:s("bridge.restart")}):i.jsx("code",{className:"ga-bridge-hint",children:s("bridge.notRunningHint")})]}):n&&C.length===0?i.jsxs("div",{className:"ga-services-loading",children:[i.jsx(G,{size:"large"}),i.jsx("span",{children:s("ch.loading")})]}):!H&&C.length===0?i.jsx(ye,{description:s("ch.empty")}):i.jsxs("div",{className:"ga-channel-list",children:[H&&i.jsxs("div",{className:"ga-offline-banner",children:[i.jsx(Q,{size:"small"}),i.jsx("span",{children:s("bridge.staleData")}),Y()&&i.jsx(_,{"data-testid":"bridge-restart",size:"small",loading:x,onClick:k,theme:"light",children:s("bridge.restart")})]}),C.map(p=>{const N=te[p.id]||te[p.name],O=(N==null?void 0:N.label)||"",L=O?s(O):p.name,I=N==null?void 0:N.icon,h=r.has(p.id);return i.jsxs("div",{className:"ga-channel-card",children:[i.jsxs("div",{className:"ga-channel-card-info",children:[I&&i.jsx("img",{src:I,alt:"",className:"ga-channel-icon"}),i.jsx("span",{className:"ga-channel-card-name",children:L}),i.jsx(ee,{size:"small",color:p.running?"green":"grey",type:"ghost",children:p.running?s("st.online"):s("st.offline")}),p.lastError&&i.jsx(ee,{size:"small",color:"red",type:"ghost",children:p.lastError})]}),i.jsxs("div",{className:"ga-channel-card-actions",children:[i.jsx(_,{size:"small",icon:p.running?i.jsx(Se,{}):i.jsx(we,{}),loading:h,disabled:H,onClick:()=>T(p),type:p.running?"danger":"primary",theme:"light",children:p.running?s("act.stop"):s("act.start")}),i.jsx(_,{size:"small",icon:i.jsx(ve,{}),theme:"borderless",onClick:()=>g(p.id),children:s("act.logs")}),i.jsx(_,{size:"small",icon:i.jsx(De,{}),theme:"borderless",onClick:()=>w(!0),children:s("act.configure")})]})]},p.id)}),i.jsx(ze,{serviceId:c,onClose:()=>g(null)}),i.jsx(tt,{visible:m,onClose:()=>w(!1)})]})}const dt={__bridge__:{labelKey:"proc.bridge",summaryKey:"proc.bridgeSummary",tipKey:"proc.bridgeTip"},"frontends/conductor.py":{labelKey:"proc.conductor",summaryKey:"proc.conductorSummary",tipKey:"proc.conductorTip"},"reflect/scheduler.py":{labelKey:"proc.scheduler",summaryKey:"proc.schedulerSummary",tipKey:"proc.schedulerTip"}};function ut(){const{t:s}=q(),e=xe(),t=z(h=>h.services),n=z(h=>h.loading),a=z(h=>h.startService),o=z(h=>h.stopService),r=z(h=>h.exitBridge),l=z(h=>h.restartService),[c,g]=u.useState(new Set),[m,w]=u.useState(null),[x,E]=u.useState(!1),C=t.filter(h=>!Ne(h)),k=u.useCallback(async()=>{E(!0);try{await be()}catch{W(s("err.bridge"))}finally{E(!1)}},[s]),T=u.useCallback(async(h,d)=>{g(b=>new Set([...b,h]));try{await d()||W(s("err.channelStop"))}finally{g(b=>{const M=new Set(b);return M.delete(h),M})}},[s]),H=u.useCallback(h=>T(h.id,async()=>{const d=await a(h.id);return d&&P(s("sys.channelStarted")),d}),[a,s,T]),p=u.useCallback(h=>T(h.id,async()=>{if(!h.managed){const b=await r();return b&&P(s("sys.bridgeDisconnecting")),b}const d=await o(h.id);return d&&P(s("sys.channelStopped")),d}),[r,o,s,T]),N=u.useCallback(h=>T(h.id,async()=>{const d=await l(h.id);return d&&P(s("sys.channelStarted")),d}),[l,s,T]),O=h=>{const{status:d,errorKey:b,warningKey:M,lastError:U,lastWarning:$}=h,Z={running:{color:"green",text:s("st.running")},offline:{color:"grey",text:s("st.stopped")},error:{color:"red",text:s("st.abnormal")},warning:{color:"amber",text:s("st.warning")}},B=Z[d]??Z.offline,F=b?s(b):M?s(M):U||$||"",A=d==="error"||d==="running"&&M;return i.jsxs("span",{style:{display:"inline-flex",alignItems:"center",gap:6},children:[i.jsx(ee,{size:"small",color:B.color,type:"light",children:B.text}),A&&F&&i.jsx("span",{title:U||$||"",style:{fontSize:11,color:d==="error"?"var(--semi-color-danger)":"var(--semi-color-warning)",maxWidth:200,overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap"},children:F.length>50?F.slice(0,50)+"…":F})]})},L=e!=="ready",I=[{title:s("svc.colName"),dataIndex:"name",key:"name",render:(h,d)=>{const b=dt[d.id],M=s(b?b.labelKey:"proc.runtimeComponent"),U=s(b?b.summaryKey:"proc.runtimeComponentSummary"),$=s(b?b.tipKey:"proc.runtimeComponentTip");return i.jsx(Me,{content:$,position:"topLeft",children:i.jsxs("span",{className:"ga-service-identity",children:[i.jsx("span",{className:"ga-service-identity-name",children:M}),i.jsx("span",{className:"ga-service-identity-summary",children:U})]})})}},{title:s("svc.colStatus"),dataIndex:"status",key:"status",width:220,render:(h,d)=>O(d)},{title:s("svc.colPid"),dataIndex:"pid",key:"pid",width:80,render:(h,d)=>i.jsx("span",{style:{fontFamily:"var(--font-mono)",fontSize:12},children:d.pid??"—"})},{title:s("svc.colMemory"),dataIndex:"memMb",key:"memMb",width:100,render:(h,d)=>i.jsx("span",{style:{fontFamily:"var(--font-mono)",fontSize:12},children:d.memMb!=null?d.memMb.toFixed(1):"—"})},{title:s("svc.colCpu"),dataIndex:"cpuPct",key:"cpuPct",width:90,render:(h,d)=>i.jsx("span",{style:{fontFamily:"var(--font-mono)",fontSize:12},children:d.cpuPct!=null?d.cpuPct.toFixed(1):"—"})},{title:s("svc.colActions"),key:"actions",width:200,render:(h,d)=>{const b=c.has(d.id);return i.jsxs("div",{className:"ga-status-actions",children:[d.running?i.jsxs(i.Fragment,{children:[d.managed&&i.jsx(_,{size:"small",icon:i.jsx(Ae,{}),theme:"borderless",loading:b,disabled:L,onClick:()=>N(d),children:s("act.restart")}),i.jsx(_,{size:"small",icon:d.managed?i.jsx(Se,{}):i.jsx(Ke,{}),theme:"borderless",type:"danger",loading:b,disabled:L,onClick:()=>p(d),children:d.managed?s("act.stop"):s("act.disconnect")})]}):d.managed&&i.jsx(_,{size:"small",icon:i.jsx(we,{}),theme:"borderless",type:"primary",loading:b,disabled:L,onClick:()=>H(d),children:s("act.start")}),i.jsx(_,{size:"small",icon:i.jsx(ve,{}),theme:"borderless",onClick:()=>w(d.id),children:s("act.logs")})]})}}];return L&&C.length===0?i.jsxs("div",{className:"ga-services-loading ga-services-loading--col",children:[i.jsx(Q,{style:{color:"var(--semi-color-warning)",fontSize:24}}),i.jsx("span",{children:s("bridge.notRunning")}),Y()?i.jsx(_,{"data-testid":"bridge-restart",loading:x,onClick:k,theme:"light",type:"primary",children:s("bridge.restart")}):i.jsx("code",{className:"ga-bridge-hint",children:s("bridge.notRunningHint")})]}):n&&C.length===0?i.jsx("div",{className:"ga-services-loading",children:i.jsx(G,{size:"large"})}):!L&&C.length===0?i.jsx(ye,{description:s("svc.empty")}):i.jsxs("div",{className:"ga-status-panel",children:[L&&i.jsxs("div",{className:"ga-offline-banner",children:[i.jsx(Q,{size:"small"}),i.jsx("span",{children:s("bridge.staleData")}),Y()&&i.jsx(_,{"data-testid":"bridge-restart",size:"small",loading:x,onClick:k,theme:"light",children:s("bridge.restart")})]}),i.jsx(He,{columns:I,dataSource:C,rowKey:"id",pagination:!1,size:"small",bordered:!1}),i.jsx(ze,{serviceId:m,onClose:()=>w(null)})]})}function vt(){const{t:s}=q(),e=z(a=>a.fetchServices),t=de(a=>a.servicesTab),n=de(a=>a.setServicesTab);return u.useEffect(()=>{e()},[e]),i.jsx("div",{className:"ga-services-page",children:i.jsxs(Ve,{type:"line",activeKey:t,onChange:n,children:[i.jsx(ce,{tab:s("nav.channels"),itemKey:"channels",children:i.jsx(ht,{})}),i.jsx(ce,{tab:s("nav.status"),itemKey:"status",children:i.jsx(ut,{})})]})})}export{vt as ServicesPage}; diff --git a/frontends/desktop/dist/assets/SummaryPart-D48OOFSQ.js b/frontends/desktop/dist/assets/SummaryPart-D48OOFSQ.js new file mode 100644 index 000000000..d6c64685d --- /dev/null +++ b/frontends/desktop/dist/assets/SummaryPart-D48OOFSQ.js @@ -0,0 +1 @@ +import{b as s,aj as r}from"./tauri-compat-tfiFK9EG.js";import{M as o,S as m,r as t,a as e,b as n,p}from"./markdown-preprocess-Bvg4n8KE.js";import{S as i,U as c}from"./main-Knf6L_en.js";import"./index-Bpi3BHKj.js";import"./WindowsTitlebar-CrkUa1UM.js";const u={...c},O=s.memo(function({content:a}){return r.jsx("div",{"data-slot":"summary-block",children:r.jsx(o,{remarkPlugins:[e,n],rehypePlugins:[[t,u]],components:m,urlTransform:i,children:p(a)})})});export{O as SummaryPart}; diff --git a/frontends/desktop/dist/assets/TokenPage-C6-RA6yj.js b/frontends/desktop/dist/assets/TokenPage-C6-RA6yj.js new file mode 100644 index 000000000..95d478df9 --- /dev/null +++ b/frontends/desktop/dist/assets/TokenPage-C6-RA6yj.js @@ -0,0 +1,2 @@ +import{aA as F,aB as L,aC as ee,aD as ze,aE as Xe,aF as wt,aG as Vr,c as Dt,b as J,aH as Br,aI as Gr,B,d as Yi,e as Li,x as $i,aJ as Hi,g as ia,aK as Ui,_ as st,f as He,ae as Be,w as qi,i as Wi,aL as De,N as oe,j as ji,R as b,k as Ue,l as Y,P as p,q as We,h as Q,aM as Vi,aN as Bi,M as K,aO as Gi,aP as zi,ay as Xi,X as zr,T as Zi,O as Xr,s as Qi,aQ as Ki,ax as Ji,aj as A}from"./tauri-compat-tfiFK9EG.js";import{_ as es,c as M,V as ts,i as Sn,d as ns,e as Et,I as Zr,f as as,r as rs,g as rt,h as Un,j as Qn,k as is,l as ss,T as os,a as us,b as Ta}from"./index-DwVcZP0M.js";import{s as Qr,a as Kr,F as gt,I as ls,j as cs,k as ds,B as Jr,C as fs,l as hs,m as wa,b as lt,n as ps,T as ms,E as ei,g as gs}from"./main-Knf6L_en.js";import{a as pt,B as yt}from"./index-Bpi3BHKj.js";import{A as vs}from"./Animation-TKQfYYOo.js";import{B as Da}from"./index-DpGuh58E.js";import{S as ys}from"./index-D_sWIqse.js";import"./WindowsTitlebar-CrkUa1UM.js";function Le(s,e){F(2,arguments);var t=L(s),n=ee(e);if(isNaN(n))return new Date(NaN);if(!n)return t;var a=t.getDate(),i=new Date(t.getTime());i.setMonth(t.getMonth()+n+1,0);var r=i.getDate();return a>=r?i:(t.setFullYear(i.getFullYear(),i.getMonth(),a),t)}function Ts(s,e){F(2,arguments);var t=L(s).getTime(),n=ee(e);return new Date(t+n)}function ti(s){var e=new Date(Date.UTC(s.getFullYear(),s.getMonth(),s.getDate(),s.getHours(),s.getMinutes(),s.getSeconds(),s.getMilliseconds()));return e.setUTCFullYear(s.getFullYear()),s.getTime()-e.getTime()}function Kn(s){F(1,arguments);var e=L(s);return e.setHours(0,0,0,0),e}function xn(s,e){F(2,arguments);var t=ee(e);return Le(s,t*12)}var sa=6e4,oa=36e5,ws=1e3;function ua(s,e){F(2,arguments);var t=Kn(s),n=Kn(e);return t.getTime()===n.getTime()}function Jn(s){return F(1,arguments),s instanceof Date||ze(s)==="object"&&Object.prototype.toString.call(s)==="[object Date]"}function Ce(s){if(F(1,arguments),!Jn(s)&&typeof s!="number")return!1;var e=L(s);return!isNaN(Number(e))}function je(s,e){F(2,arguments);var t=L(s),n=L(e),a=t.getFullYear()-n.getFullYear(),i=t.getMonth()-n.getMonth();return a*12+i}function Ds(s,e){F(2,arguments);var t=L(s),n=L(e);return t.getFullYear()-n.getFullYear()}function bs(s){F(1,arguments);var e=L(s);return e.setDate(1),e.setHours(0,0,0,0),e}function ni(s,e){F(2,arguments);var t=ee(e);return Ts(s,-t)}var _s=864e5;function Cs(s){F(1,arguments);var e=L(s),t=e.getTime();e.setUTCMonth(0,1),e.setUTCHours(0,0,0,0);var n=e.getTime(),a=t-n;return Math.floor(a/_s)+1}function ot(s){F(1,arguments);var e=1,t=L(s),n=t.getUTCDay(),a=(n=a.getTime()?t+1:e.getTime()>=r.getTime()?t:t-1}function Is(s){F(1,arguments);var e=ai(s),t=new Date(0);t.setUTCFullYear(e,0,4),t.setUTCHours(0,0,0,0);var n=ot(t);return n}var Rs=6048e5;function ri(s){F(1,arguments);var e=L(s),t=ot(e).getTime()-Is(e).getTime();return Math.round(t/Rs)+1}function la(s,e){var t,n,a,i,r,u,o,l;F(1,arguments);var c=L(s),d=c.getUTCFullYear(),f=wt(),h=ee((t=(n=(a=(i=e==null?void 0:e.firstWeekContainsDate)!==null&&i!==void 0?i:e==null||(r=e.locale)===null||r===void 0||(u=r.options)===null||u===void 0?void 0:u.firstWeekContainsDate)!==null&&a!==void 0?a:f.firstWeekContainsDate)!==null&&n!==void 0?n:(o=f.locale)===null||o===void 0||(l=o.options)===null||l===void 0?void 0:l.firstWeekContainsDate)!==null&&t!==void 0?t:1);if(!(h>=1&&h<=7))throw new RangeError("firstWeekContainsDate must be between 1 and 7 inclusively");var v=new Date(0);v.setUTCFullYear(d+1,0,h),v.setUTCHours(0,0,0,0);var w=Xe(v,e),m=new Date(0);m.setUTCFullYear(d,0,h),m.setUTCHours(0,0,0,0);var g=Xe(m,e);return c.getTime()>=w.getTime()?d+1:c.getTime()>=g.getTime()?d:d-1}function Ps(s,e){var t,n,a,i,r,u,o,l;F(1,arguments);var c=wt(),d=ee((t=(n=(a=(i=e==null?void 0:e.firstWeekContainsDate)!==null&&i!==void 0?i:e==null||(r=e.locale)===null||r===void 0||(u=r.options)===null||u===void 0?void 0:u.firstWeekContainsDate)!==null&&a!==void 0?a:c.firstWeekContainsDate)!==null&&n!==void 0?n:(o=c.locale)===null||o===void 0||(l=o.options)===null||l===void 0?void 0:l.firstWeekContainsDate)!==null&&t!==void 0?t:1),f=la(s,e),h=new Date(0);h.setUTCFullYear(f,0,d),h.setUTCHours(0,0,0,0);var v=Xe(h,e);return v}var Es=6048e5;function ii(s,e){F(1,arguments);var t=L(s),n=Xe(t,e).getTime()-Ps(t,e).getTime();return Math.round(n/Es)+1}function z(s,e){for(var t=s<0?"-":"",n=Math.abs(s).toString();n.length0?n:1-n;return z(t==="yy"?a%100:a,t.length)},M:function(e,t){var n=e.getUTCMonth();return t==="M"?String(n+1):z(n+1,2)},d:function(e,t){return z(e.getUTCDate(),t.length)},a:function(e,t){var n=e.getUTCHours()/12>=1?"pm":"am";switch(t){case"a":case"aa":return n.toUpperCase();case"aaa":return n;case"aaaaa":return n[0];case"aaaa":default:return n==="am"?"a.m.":"p.m."}},h:function(e,t){return z(e.getUTCHours()%12||12,t.length)},H:function(e,t){return z(e.getUTCHours(),t.length)},m:function(e,t){return z(e.getUTCMinutes(),t.length)},s:function(e,t){return z(e.getUTCSeconds(),t.length)},S:function(e,t){var n=t.length,a=e.getUTCMilliseconds(),i=Math.floor(a*Math.pow(10,n-3));return z(i,t.length)}},Je={midnight:"midnight",noon:"noon",morning:"morning",afternoon:"afternoon",evening:"evening",night:"night"},Os={G:function(e,t,n){var a=e.getUTCFullYear()>0?1:0;switch(t){case"G":case"GG":case"GGG":return n.era(a,{width:"abbreviated"});case"GGGGG":return n.era(a,{width:"narrow"});case"GGGG":default:return n.era(a,{width:"wide"})}},y:function(e,t,n){if(t==="yo"){var a=e.getUTCFullYear(),i=a>0?a:1-a;return n.ordinalNumber(i,{unit:"year"})}return Fe.y(e,t)},Y:function(e,t,n,a){var i=la(e,a),r=i>0?i:1-i;if(t==="YY"){var u=r%100;return z(u,2)}return t==="Yo"?n.ordinalNumber(r,{unit:"year"}):z(r,t.length)},R:function(e,t){var n=ai(e);return z(n,t.length)},u:function(e,t){var n=e.getUTCFullYear();return z(n,t.length)},Q:function(e,t,n){var a=Math.ceil((e.getUTCMonth()+1)/3);switch(t){case"Q":return String(a);case"QQ":return z(a,2);case"Qo":return n.ordinalNumber(a,{unit:"quarter"});case"QQQ":return n.quarter(a,{width:"abbreviated",context:"formatting"});case"QQQQQ":return n.quarter(a,{width:"narrow",context:"formatting"});case"QQQQ":default:return n.quarter(a,{width:"wide",context:"formatting"})}},q:function(e,t,n){var a=Math.ceil((e.getUTCMonth()+1)/3);switch(t){case"q":return String(a);case"qq":return z(a,2);case"qo":return n.ordinalNumber(a,{unit:"quarter"});case"qqq":return n.quarter(a,{width:"abbreviated",context:"standalone"});case"qqqqq":return n.quarter(a,{width:"narrow",context:"standalone"});case"qqqq":default:return n.quarter(a,{width:"wide",context:"standalone"})}},M:function(e,t,n){var a=e.getUTCMonth();switch(t){case"M":case"MM":return Fe.M(e,t);case"Mo":return n.ordinalNumber(a+1,{unit:"month"});case"MMM":return n.month(a,{width:"abbreviated",context:"formatting"});case"MMMMM":return n.month(a,{width:"narrow",context:"formatting"});case"MMMM":default:return n.month(a,{width:"wide",context:"formatting"})}},L:function(e,t,n){var a=e.getUTCMonth();switch(t){case"L":return String(a+1);case"LL":return z(a+1,2);case"Lo":return n.ordinalNumber(a+1,{unit:"month"});case"LLL":return n.month(a,{width:"abbreviated",context:"standalone"});case"LLLLL":return n.month(a,{width:"narrow",context:"standalone"});case"LLLL":default:return n.month(a,{width:"wide",context:"standalone"})}},w:function(e,t,n,a){var i=ii(e,a);return t==="wo"?n.ordinalNumber(i,{unit:"week"}):z(i,t.length)},I:function(e,t,n){var a=ri(e);return t==="Io"?n.ordinalNumber(a,{unit:"week"}):z(a,t.length)},d:function(e,t,n){return t==="do"?n.ordinalNumber(e.getUTCDate(),{unit:"date"}):Fe.d(e,t)},D:function(e,t,n){var a=Cs(e);return t==="Do"?n.ordinalNumber(a,{unit:"dayOfYear"}):z(a,t.length)},E:function(e,t,n){var a=e.getUTCDay();switch(t){case"E":case"EE":case"EEE":return n.day(a,{width:"abbreviated",context:"formatting"});case"EEEEE":return n.day(a,{width:"narrow",context:"formatting"});case"EEEEEE":return n.day(a,{width:"short",context:"formatting"});case"EEEE":default:return n.day(a,{width:"wide",context:"formatting"})}},e:function(e,t,n,a){var i=e.getUTCDay(),r=(i-a.weekStartsOn+8)%7||7;switch(t){case"e":return String(r);case"ee":return z(r,2);case"eo":return n.ordinalNumber(r,{unit:"day"});case"eee":return n.day(i,{width:"abbreviated",context:"formatting"});case"eeeee":return n.day(i,{width:"narrow",context:"formatting"});case"eeeeee":return n.day(i,{width:"short",context:"formatting"});case"eeee":default:return n.day(i,{width:"wide",context:"formatting"})}},c:function(e,t,n,a){var i=e.getUTCDay(),r=(i-a.weekStartsOn+8)%7||7;switch(t){case"c":return String(r);case"cc":return z(r,t.length);case"co":return n.ordinalNumber(r,{unit:"day"});case"ccc":return n.day(i,{width:"abbreviated",context:"standalone"});case"ccccc":return n.day(i,{width:"narrow",context:"standalone"});case"cccccc":return n.day(i,{width:"short",context:"standalone"});case"cccc":default:return n.day(i,{width:"wide",context:"standalone"})}},i:function(e,t,n){var a=e.getUTCDay(),i=a===0?7:a;switch(t){case"i":return String(i);case"ii":return z(i,t.length);case"io":return n.ordinalNumber(i,{unit:"day"});case"iii":return n.day(a,{width:"abbreviated",context:"formatting"});case"iiiii":return n.day(a,{width:"narrow",context:"formatting"});case"iiiiii":return n.day(a,{width:"short",context:"formatting"});case"iiii":default:return n.day(a,{width:"wide",context:"formatting"})}},a:function(e,t,n){var a=e.getUTCHours(),i=a/12>=1?"pm":"am";switch(t){case"a":case"aa":return n.dayPeriod(i,{width:"abbreviated",context:"formatting"});case"aaa":return n.dayPeriod(i,{width:"abbreviated",context:"formatting"}).toLowerCase();case"aaaaa":return n.dayPeriod(i,{width:"narrow",context:"formatting"});case"aaaa":default:return n.dayPeriod(i,{width:"wide",context:"formatting"})}},b:function(e,t,n){var a=e.getUTCHours(),i;switch(a===12?i=Je.noon:a===0?i=Je.midnight:i=a/12>=1?"pm":"am",t){case"b":case"bb":return n.dayPeriod(i,{width:"abbreviated",context:"formatting"});case"bbb":return n.dayPeriod(i,{width:"abbreviated",context:"formatting"}).toLowerCase();case"bbbbb":return n.dayPeriod(i,{width:"narrow",context:"formatting"});case"bbbb":default:return n.dayPeriod(i,{width:"wide",context:"formatting"})}},B:function(e,t,n){var a=e.getUTCHours(),i;switch(a>=17?i=Je.evening:a>=12?i=Je.afternoon:a>=4?i=Je.morning:i=Je.night,t){case"B":case"BB":case"BBB":return n.dayPeriod(i,{width:"abbreviated",context:"formatting"});case"BBBBB":return n.dayPeriod(i,{width:"narrow",context:"formatting"});case"BBBB":default:return n.dayPeriod(i,{width:"wide",context:"formatting"})}},h:function(e,t,n){if(t==="ho"){var a=e.getUTCHours()%12;return a===0&&(a=12),n.ordinalNumber(a,{unit:"hour"})}return Fe.h(e,t)},H:function(e,t,n){return t==="Ho"?n.ordinalNumber(e.getUTCHours(),{unit:"hour"}):Fe.H(e,t)},K:function(e,t,n){var a=e.getUTCHours()%12;return t==="Ko"?n.ordinalNumber(a,{unit:"hour"}):z(a,t.length)},k:function(e,t,n){var a=e.getUTCHours();return a===0&&(a=24),t==="ko"?n.ordinalNumber(a,{unit:"hour"}):z(a,t.length)},m:function(e,t,n){return t==="mo"?n.ordinalNumber(e.getUTCMinutes(),{unit:"minute"}):Fe.m(e,t)},s:function(e,t,n){return t==="so"?n.ordinalNumber(e.getUTCSeconds(),{unit:"second"}):Fe.s(e,t)},S:function(e,t){return Fe.S(e,t)},X:function(e,t,n,a){var i=a._originalDate||e,r=i.getTimezoneOffset();if(r===0)return"Z";switch(t){case"X":return _a(r);case"XXXX":case"XX":return Ve(r);case"XXXXX":case"XXX":default:return Ve(r,":")}},x:function(e,t,n,a){var i=a._originalDate||e,r=i.getTimezoneOffset();switch(t){case"x":return _a(r);case"xxxx":case"xx":return Ve(r);case"xxxxx":case"xxx":default:return Ve(r,":")}},O:function(e,t,n,a){var i=a._originalDate||e,r=i.getTimezoneOffset();switch(t){case"O":case"OO":case"OOO":return"GMT"+ba(r,":");case"OOOO":default:return"GMT"+Ve(r,":")}},z:function(e,t,n,a){var i=a._originalDate||e,r=i.getTimezoneOffset();switch(t){case"z":case"zz":case"zzz":return"GMT"+ba(r,":");case"zzzz":default:return"GMT"+Ve(r,":")}},t:function(e,t,n,a){var i=a._originalDate||e,r=Math.floor(i.getTime()/1e3);return z(r,t.length)},T:function(e,t,n,a){var i=a._originalDate||e,r=i.getTime();return z(r,t.length)}};function ba(s,e){var t=s>0?"-":"+",n=Math.abs(s),a=Math.floor(n/60),i=n%60;if(i===0)return t+String(a);var r=e;return t+String(a)+r+z(i,2)}function _a(s,e){if(s%60===0){var t=s>0?"-":"+";return t+z(Math.abs(s)/60,2)}return Ve(s,e)}function Ve(s,e){var t=e||"",n=s>0?"-":"+",a=Math.abs(s),i=z(Math.floor(a/60),2),r=z(a%60,2);return n+i+t+r}var Ca=function(e,t){switch(e){case"P":return t.date({width:"short"});case"PP":return t.date({width:"medium"});case"PPP":return t.date({width:"long"});case"PPPP":default:return t.date({width:"full"})}},si=function(e,t){switch(e){case"p":return t.time({width:"short"});case"pp":return t.time({width:"medium"});case"ppp":return t.time({width:"long"});case"pppp":default:return t.time({width:"full"})}},Ss=function(e,t){var n=e.match(/(P+)(p+)?/)||[],a=n[1],i=n[2];if(!i)return Ca(e,t);var r;switch(a){case"P":r=t.dateTime({width:"short"});break;case"PP":r=t.dateTime({width:"medium"});break;case"PPP":r=t.dateTime({width:"long"});break;case"PPPP":default:r=t.dateTime({width:"full"});break}return r.replace("{{date}}",Ca(a,t)).replace("{{time}}",si(i,t))},ea={p:si,P:Ss},xs=["D","DD"],Ms=["YY","YYYY"];function oi(s){return xs.indexOf(s)!==-1}function ui(s){return Ms.indexOf(s)!==-1}function Mn(s,e,t){if(s==="YYYY")throw new RangeError("Use `yyyy` instead of `YYYY` (in `".concat(e,"`) for formatting years to the input `").concat(t,"`; see: https://github.com/date-fns/date-fns/blob/master/docs/unicodeTokens.md"));if(s==="YY")throw new RangeError("Use `yy` instead of `YY` (in `".concat(e,"`) for formatting years to the input `").concat(t,"`; see: https://github.com/date-fns/date-fns/blob/master/docs/unicodeTokens.md"));if(s==="D")throw new RangeError("Use `d` instead of `D` (in `".concat(e,"`) for formatting days of the month to the input `").concat(t,"`; see: https://github.com/date-fns/date-fns/blob/master/docs/unicodeTokens.md"));if(s==="DD")throw new RangeError("Use `dd` instead of `DD` (in `".concat(e,"`) for formatting days of the month to the input `").concat(t,"`; see: https://github.com/date-fns/date-fns/blob/master/docs/unicodeTokens.md"))}var ks=/[yYQqMLwIdDecihHKkms]o|(\w)\1*|''|'(''|[^'])+('|$)|./g,Ns=/P+p+|P+|p+|''|'(''|[^'])+('|$)|./g,As=/^'([^]*?)'?$/,Fs=/''/g,Ys=/[a-zA-Z]/;function X(s,e,t){var n,a,i,r,u,o,l,c,d,f,h,v,w,m,g,T,y,D;F(2,arguments);var _=String(e),I=wt(),x=(n=(a=t==null?void 0:t.locale)!==null&&a!==void 0?a:I.locale)!==null&&n!==void 0?n:Vr,R=ee((i=(r=(u=(o=t==null?void 0:t.firstWeekContainsDate)!==null&&o!==void 0?o:t==null||(l=t.locale)===null||l===void 0||(c=l.options)===null||c===void 0?void 0:c.firstWeekContainsDate)!==null&&u!==void 0?u:I.firstWeekContainsDate)!==null&&r!==void 0?r:(d=I.locale)===null||d===void 0||(f=d.options)===null||f===void 0?void 0:f.firstWeekContainsDate)!==null&&i!==void 0?i:1);if(!(R>=1&&R<=7))throw new RangeError("firstWeekContainsDate must be between 1 and 7 inclusively");var C=ee((h=(v=(w=(m=t==null?void 0:t.weekStartsOn)!==null&&m!==void 0?m:t==null||(g=t.locale)===null||g===void 0||(T=g.options)===null||T===void 0?void 0:T.weekStartsOn)!==null&&w!==void 0?w:I.weekStartsOn)!==null&&v!==void 0?v:(y=I.locale)===null||y===void 0||(D=y.options)===null||D===void 0?void 0:D.weekStartsOn)!==null&&h!==void 0?h:0);if(!(C>=0&&C<=6))throw new RangeError("weekStartsOn must be between 0 and 6 inclusively");if(!x.localize)throw new RangeError("locale must contain localize property");if(!x.formatLong)throw new RangeError("locale must contain formatLong property");var E=L(s);if(!Ce(E))throw new RangeError("Invalid time value");var O=ti(E),k=ni(E,O),U={firstWeekContainsDate:R,weekStartsOn:C,locale:x,_originalDate:E},se=_.match(Ns).map(function(G){var Z=G[0];if(Z==="p"||Z==="P"){var ce=ea[Z];return ce(G,x.formatLong)}return G}).join("").match(ks).map(function(G){if(G==="''")return"'";var Z=G[0];if(Z==="'")return Ls(G);var ce=Os[Z];if(ce)return!(t!=null&&t.useAdditionalWeekYearTokens)&&ui(G)&&Mn(G,e,String(s)),!(t!=null&&t.useAdditionalDayOfYearTokens)&&oi(G)&&Mn(G,e,String(s)),ce(k,G,x.localize,U);if(Z.match(Ys))throw new RangeError("Format string contains an unescaped latin alphabet character `"+Z+"`");return G}).join("");return se}function Ls(s){var e=s.match(As);return e?e[1].replace(Fs,"'"):s}function $s(s,e){if(s==null)throw new TypeError("assign requires that input parameter not be null or undefined");for(var t in e)Object.prototype.hasOwnProperty.call(e,t)&&(s[t]=e[t]);return s}function li(s){F(1,arguments);var e=L(s),t=e.getFullYear(),n=e.getMonth(),a=new Date(0);return a.setFullYear(t,n+1,0),a.setHours(0,0,0,0),a.getDate()}function Hs(s){F(1,arguments);var e=L(s),t=e.getMonth();return e.setFullYear(e.getFullYear(),t+1,0),e.setHours(0,0,0,0),e}function Us(s,e){F(2,arguments);var t=L(s),n=L(e);return t.getTime()>n.getTime()}function ci(s,e){F(2,arguments);var t=L(s),n=L(e);return t.getTime()s.length)&&(e=s.length);for(var t=0,n=Array(e);t=s.length?{done:!0}:{done:!1,value:s[n++]}},e:function(l){throw l},f:a}}throw new TypeError(`Invalid attempt to iterate non-iterable instance. +In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}var i,r=!0,u=!1;return{s:function(){t=t.call(s)},n:function(){var l=t.next();return r=l.done,l},e:function(l){u=!0,i=l},f:function(){try{r||t.return==null||t.return()}finally{if(u)throw i}}}}function q(s,e){if(typeof e!="function"&&e!==null)throw new TypeError("Super expression must either be null or a function");s.prototype=Object.create(e&&e.prototype,{constructor:{value:s,writable:!0,configurable:!0}}),Object.defineProperty(s,"prototype",{writable:!1}),e&&es(s,e)}function Nn(s){return Nn=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)},Nn(s)}function di(){try{var s=!Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){}))}catch{}return(di=function(){return!!s})()}function Ws(s,e){if(e&&(ze(e)=="object"||typeof e=="function"))return e;if(e!==void 0)throw new TypeError("Derived constructors may only return object or undefined");return M(s)}function W(s){var e=di();return function(){var t,n=Nn(s);if(e){var a=Nn(this).constructor;t=Reflect.construct(n,arguments,a)}else t=n.apply(this,arguments);return Ws(this,t)}}function $(s,e){if(!(s instanceof e))throw new TypeError("Cannot call a class as a function")}function js(s,e){if(ze(s)!="object"||!s)return s;var t=s[Symbol.toPrimitive];if(t!==void 0){var n=t.call(s,e);if(ze(n)!="object")return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return(e==="string"?String:Number)(s)}function fi(s){var e=js(s,"string");return ze(e)=="symbol"?e:e+""}function Vs(s,e){for(var t=0;t0,n=t?e:1-e,a;if(n<=50)a=s||100;else{var i=n+50,r=Math.floor(i/100)*100,u=s>=i%100;a=s+r-(u?100:0)}return t?a:1-a}function gi(s){return s%400===0||s%4===0&&s%100!==0}var Zs=(function(s){q(t,s);var e=W(t);function t(){var n;$(this,t);for(var a=arguments.length,i=new Array(a),r=0;r0}},{key:"set",value:function(a,i,r){var u=a.getUTCFullYear();if(r.isTwoDigitYear){var o=mi(r.year,u);return a.setUTCFullYear(o,0,1),a.setUTCHours(0,0,0,0),a}var l=!("era"in i)||i.era===1?r.year:1-r.year;return a.setUTCFullYear(l,0,1),a.setUTCHours(0,0,0,0),a}}]),t})(j),Qs=(function(s){q(t,s);var e=W(t);function t(){var n;$(this,t);for(var a=arguments.length,i=new Array(a),r=0;r0}},{key:"set",value:function(a,i,r,u){var o=la(a,u);if(r.isTwoDigitYear){var l=mi(r.year,o);return a.setUTCFullYear(l,0,u.firstWeekContainsDate),a.setUTCHours(0,0,0,0),Xe(a,u)}var c=!("era"in i)||i.era===1?r.year:1-r.year;return a.setUTCFullYear(c,0,u.firstWeekContainsDate),a.setUTCHours(0,0,0,0),Xe(a,u)}}]),t})(j),Ks=(function(s){q(t,s);var e=W(t);function t(){var n;$(this,t);for(var a=arguments.length,i=new Array(a),r=0;r=1&&i<=4}},{key:"set",value:function(a,i,r){return a.setUTCMonth((r-1)*3,1),a.setUTCHours(0,0,0,0),a}}]),t})(j),to=(function(s){q(t,s);var e=W(t);function t(){var n;$(this,t);for(var a=arguments.length,i=new Array(a),r=0;r=1&&i<=4}},{key:"set",value:function(a,i,r){return a.setUTCMonth((r-1)*3,1),a.setUTCHours(0,0,0,0),a}}]),t})(j),no=(function(s){q(t,s);var e=W(t);function t(){var n;$(this,t);for(var a=arguments.length,i=new Array(a),r=0;r=0&&i<=11}},{key:"set",value:function(a,i,r){return a.setUTCMonth(r,1),a.setUTCHours(0,0,0,0),a}}]),t})(j),ao=(function(s){q(t,s);var e=W(t);function t(){var n;$(this,t);for(var a=arguments.length,i=new Array(a),r=0;r=0&&i<=11}},{key:"set",value:function(a,i,r){return a.setUTCMonth(r,1),a.setUTCHours(0,0,0,0),a}}]),t})(j);function ro(s,e,t){F(2,arguments);var n=L(s),a=ee(e),i=ii(n,t)-a;return n.setUTCDate(n.getUTCDate()-i*7),n}var io=(function(s){q(t,s);var e=W(t);function t(){var n;$(this,t);for(var a=arguments.length,i=new Array(a),r=0;r=1&&i<=53}},{key:"set",value:function(a,i,r,u){return Xe(ro(a,r,u),u)}}]),t})(j);function so(s,e){F(2,arguments);var t=L(s),n=ee(e),a=ri(t)-n;return t.setUTCDate(t.getUTCDate()-a*7),t}var oo=(function(s){q(t,s);var e=W(t);function t(){var n;$(this,t);for(var a=arguments.length,i=new Array(a),r=0;r=1&&i<=53}},{key:"set",value:function(a,i,r){return ot(so(a,r))}}]),t})(j),uo=[31,28,31,30,31,30,31,31,30,31,30,31],lo=[31,29,31,30,31,30,31,31,30,31,30,31],co=(function(s){q(t,s);var e=W(t);function t(){var n;$(this,t);for(var a=arguments.length,i=new Array(a),r=0;r=1&&i<=lo[o]:i>=1&&i<=uo[o]}},{key:"set",value:function(a,i,r){return a.setUTCDate(r),a.setUTCHours(0,0,0,0),a}}]),t})(j),fo=(function(s){q(t,s);var e=W(t);function t(){var n;$(this,t);for(var a=arguments.length,i=new Array(a),r=0;r=1&&i<=366:i>=1&&i<=365}},{key:"set",value:function(a,i,r){return a.setUTCMonth(0,r),a.setUTCHours(0,0,0,0),a}}]),t})(j);function da(s,e,t){var n,a,i,r,u,o,l,c;F(2,arguments);var d=wt(),f=ee((n=(a=(i=(r=t==null?void 0:t.weekStartsOn)!==null&&r!==void 0?r:t==null||(u=t.locale)===null||u===void 0||(o=u.options)===null||o===void 0?void 0:o.weekStartsOn)!==null&&i!==void 0?i:d.weekStartsOn)!==null&&a!==void 0?a:(l=d.locale)===null||l===void 0||(c=l.options)===null||c===void 0?void 0:c.weekStartsOn)!==null&&n!==void 0?n:0);if(!(f>=0&&f<=6))throw new RangeError("weekStartsOn must be between 0 and 6 inclusively");var h=L(s),v=ee(e),w=h.getUTCDay(),m=v%7,g=(m+7)%7,T=(g=0&&i<=6}},{key:"set",value:function(a,i,r,u){return a=da(a,r,u),a.setUTCHours(0,0,0,0),a}}]),t})(j),po=(function(s){q(t,s);var e=W(t);function t(){var n;$(this,t);for(var a=arguments.length,i=new Array(a),r=0;r=0&&i<=6}},{key:"set",value:function(a,i,r,u){return a=da(a,r,u),a.setUTCHours(0,0,0,0),a}}]),t})(j),mo=(function(s){q(t,s);var e=W(t);function t(){var n;$(this,t);for(var a=arguments.length,i=new Array(a),r=0;r=0&&i<=6}},{key:"set",value:function(a,i,r,u){return a=da(a,r,u),a.setUTCHours(0,0,0,0),a}}]),t})(j);function go(s,e){F(2,arguments);var t=ee(e);t%7===0&&(t=t-7);var n=1,a=L(s),i=a.getUTCDay(),r=t%7,u=(r+7)%7,o=(u=1&&i<=7}},{key:"set",value:function(a,i,r){return a=go(a,r),a.setUTCHours(0,0,0,0),a}}]),t})(j),yo=(function(s){q(t,s);var e=W(t);function t(){var n;$(this,t);for(var a=arguments.length,i=new Array(a),r=0;r=1&&i<=12}},{key:"set",value:function(a,i,r){var u=a.getUTCHours()>=12;return u&&r<12?a.setUTCHours(r+12,0,0,0):!u&&r===12?a.setUTCHours(0,0,0,0):a.setUTCHours(r,0,0,0),a}}]),t})(j),bo=(function(s){q(t,s);var e=W(t);function t(){var n;$(this,t);for(var a=arguments.length,i=new Array(a),r=0;r=0&&i<=23}},{key:"set",value:function(a,i,r){return a.setUTCHours(r,0,0,0),a}}]),t})(j),_o=(function(s){q(t,s);var e=W(t);function t(){var n;$(this,t);for(var a=arguments.length,i=new Array(a),r=0;r=0&&i<=11}},{key:"set",value:function(a,i,r){var u=a.getUTCHours()>=12;return u&&r<12?a.setUTCHours(r+12,0,0,0):a.setUTCHours(r,0,0,0),a}}]),t})(j),Co=(function(s){q(t,s);var e=W(t);function t(){var n;$(this,t);for(var a=arguments.length,i=new Array(a),r=0;r=1&&i<=24}},{key:"set",value:function(a,i,r){var u=r<=24?r%24:r;return a.setUTCHours(u,0,0,0),a}}]),t})(j),Io=(function(s){q(t,s);var e=W(t);function t(){var n;$(this,t);for(var a=arguments.length,i=new Array(a),r=0;r=0&&i<=59}},{key:"set",value:function(a,i,r){return a.setUTCMinutes(r,0,0),a}}]),t})(j),Ro=(function(s){q(t,s);var e=W(t);function t(){var n;$(this,t);for(var a=arguments.length,i=new Array(a),r=0;r=0&&i<=59}},{key:"set",value:function(a,i,r){return a.setUTCSeconds(r,0),a}}]),t})(j),Po=(function(s){q(t,s);var e=W(t);function t(){var n;$(this,t);for(var a=arguments.length,i=new Array(a),r=0;r=1&&E<=7))throw new RangeError("firstWeekContainsDate must be between 1 and 7 inclusively");var O=ee((v=(w=(m=(g=n==null?void 0:n.weekStartsOn)!==null&&g!==void 0?g:n==null||(T=n.locale)===null||T===void 0||(y=T.options)===null||y===void 0?void 0:y.weekStartsOn)!==null&&m!==void 0?m:R.weekStartsOn)!==null&&w!==void 0?w:(D=R.locale)===null||D===void 0||(_=D.options)===null||_===void 0?void 0:_.weekStartsOn)!==null&&v!==void 0?v:0);if(!(O>=0&&O<=6))throw new RangeError("weekStartsOn must be between 0 and 6 inclusively");if(x==="")return I===""?L(t):new Date(NaN);var k={firstWeekContainsDate:E,weekStartsOn:O,locale:C},U=[new zs],se=x.match(No).map(function(te){var V=te[0];if(V in ea){var fe=ea[V];return fe(te,C.formatLong)}return te}).join("").match(ko),G=[],Z=Ra(se),ce;try{var me=function(){var V=ce.value;!(n!=null&&n.useAdditionalWeekYearTokens)&&ui(V)&&Mn(V,x,s),!(n!=null&&n.useAdditionalDayOfYearTokens)&&oi(V)&&Mn(V,x,s);var fe=V[0],Me=Mo[fe];if(Me){var Ct=Me.incompatibleTokens;if(Array.isArray(Ct)){var It=G.find(function(Rt){return Ct.includes(Rt.token)||Rt.token===fe});if(It)throw new RangeError("The format string mustn't contain `".concat(It.fullToken,"` and `").concat(V,"` at the same time"))}else if(Me.incompatibleTokens==="*"&&G.length>0)throw new RangeError("The format string mustn't contain `".concat(V,"` and any other token at the same time"));G.push({token:fe,fullToken:V});var ct=Me.run(I,V,C.match,k);if(!ct)return{v:new Date(NaN)};U.push(ct.setter),I=ct.rest}else{if(fe.match(Lo))throw new RangeError("Format string contains an unescaped latin alphabet character `"+fe+"`");if(V==="''"?V="'":fe==="'"&&(V=Ho(V)),I.indexOf(V)===0)I=I.slice(V.length);else return{v:new Date(NaN)}}};for(Z.s();!(ce=Z.n()).done;){var he=me();if(ze(he)==="object")return he.v}}catch(te){Z.e(te)}finally{Z.f()}if(I.length>0&&Yo.test(I))return new Date(NaN);var qe=U.map(function(te){return te.priority}).sort(function(te,V){return V-te}).filter(function(te,V,fe){return fe.indexOf(te)===V}).map(function(te){return U.filter(function(V){return V.priority===te}).sort(function(V,fe){return fe.subPriority-V.subPriority})}).map(function(te){return te[0]}),Ie=L(t);if(isNaN(Ie.getTime()))return new Date(NaN);var ge=ni(Ie,ti(Ie)),xe={},Re=Ra(qe),Ke;try{for(Re.s();!(Ke=Re.n()).done;){var _t=Ke.value;if(!_t.validate(ge,k))return new Date(NaN);var Pe=_t.set(ge,xe,k);Array.isArray(Pe)?(ge=Pe[0],$s(xe,Pe[1])):ge=Pe}}catch(te){Re.e(te)}finally{Re.f()}return ge}function Ho(s){return s.match(Ao)[1].replace(Fo,"'")}function Pa(s){F(1,arguments);var e=L(s);return e.setMilliseconds(0),e}function Ea(s,e){F(2,arguments);var t=Pa(s),n=Pa(e);return t.getTime()===n.getTime()}function Uo(s,e){F(2,arguments);var t=L(s).getTime(),n=L(e.start).getTime(),a=L(e.end).getTime();if(!(n<=a))throw new RangeError("Invalid interval");return t>=n&&t<=a}function be(s,e){var t;F(1,arguments);var n=ee((t=void 0)!==null&&t!==void 0?t:2);if(n!==2&&n!==1&&n!==0)throw new RangeError("additionalDigits must be 0, 1 or 2");if(!(typeof s=="string"||Object.prototype.toString.call(s)==="[object String]"))return new Date(NaN);var a=Vo(s),i;if(a.date){var r=Bo(a.date,n);i=Go(r.restDateString,r.year)}if(!i||isNaN(i.getTime()))return new Date(NaN);var u=i.getTime(),o=0,l;if(a.time&&(o=zo(a.time),isNaN(o)))return new Date(NaN);if(a.timezone){if(l=Xo(a.timezone),isNaN(l))return new Date(NaN)}else{var c=new Date(u+o),d=new Date(0);return d.setFullYear(c.getUTCFullYear(),c.getUTCMonth(),c.getUTCDate()),d.setHours(c.getUTCHours(),c.getUTCMinutes(),c.getUTCSeconds(),c.getUTCMilliseconds()),d}return new Date(u+o+l)}var Ot={dateTimeDelimiter:/[T ]/,timeZoneDelimiter:/[Z ]/i,timezone:/([Z+-].*)$/},qo=/^-?(?:(\d{3})|(\d{2})(?:-?(\d{2}))?|W(\d{2})(?:-?(\d{1}))?|)$/,Wo=/^(\d{2}(?:[.,]\d*)?)(?::?(\d{2}(?:[.,]\d*)?))?(?::?(\d{2}(?:[.,]\d*)?))?$/,jo=/^([+-])(\d{2})(?::?(\d{2}))?$/;function Vo(s){var e={},t=s.split(Ot.dateTimeDelimiter),n;if(t.length>2)return e;if(/:/.test(t[0])?n=t[0]:(e.date=t[0],n=t[1],Ot.timeZoneDelimiter.test(e.date)&&(e.date=s.split(Ot.timeZoneDelimiter)[0],n=s.substr(e.date.length,s.length))),n){var a=Ot.timezone.exec(n);a?(e.time=n.replace(a[1],""),e.timezone=a[1]):e.time=n}return e}function Bo(s,e){var t=new RegExp("^(?:(\\d{4}|[+-]\\d{"+(4+e)+"})|(\\d{2}|[+-]\\d{"+(2+e)+"})$)"),n=s.match(t);if(!n)return{year:NaN,restDateString:""};var a=n[1]?parseInt(n[1]):null,i=n[2]?parseInt(n[2]):null;return{year:i===null?a:i*100,restDateString:s.slice((n[1]||n[2]).length)}}function Go(s,e){if(e===null)return new Date(NaN);var t=s.match(qo);if(!t)return new Date(NaN);var n=!!t[4],a=dt(t[1]),i=dt(t[2])-1,r=dt(t[3]),u=dt(t[4]),o=dt(t[5])-1;if(n)return eu(e,u,o)?Zo(e,u,o):new Date(NaN);var l=new Date(0);return!Ko(e,i,r)||!Jo(e,a)?new Date(NaN):(l.setUTCFullYear(e,i,Math.max(a,r)),l)}function dt(s){return s?parseInt(s):1}function zo(s){var e=s.match(Wo);if(!e)return NaN;var t=qn(e[1]),n=qn(e[2]),a=qn(e[3]);return tu(t,n,a)?t*oa+n*sa+a*1e3:NaN}function qn(s){return s&&parseFloat(s.replace(",","."))||0}function Xo(s){if(s==="Z")return 0;var e=s.match(jo);if(!e)return 0;var t=e[1]==="+"?-1:1,n=parseInt(e[2]),a=e[3]&&parseInt(e[3])||0;return nu(n,a)?t*(n*oa+a*sa):NaN}function Zo(s,e,t){var n=new Date(0);n.setUTCFullYear(s,0,4);var a=n.getUTCDay()||7,i=(e-1)*7+t+1-a;return n.setUTCDate(n.getUTCDate()+i),n}var Qo=[31,null,31,30,31,30,31,31,30,31,30,31];function vi(s){return s%400===0||s%4===0&&s%100!==0}function Ko(s,e,t){return e>=0&&e<=11&&t>=1&&t<=(Qo[e]||(vi(s)?29:28))}function Jo(s,e){return e>=1&&e<=(vi(s)?366:365)}function eu(s,e,t){return e>=1&&e<=53&&t>=0&&t<=6}function tu(s,e,t){return s===24?e===0&&t===0:t>=0&&t<60&&e>=0&&e<60&&s>=0&&s<25}function nu(s,e){return e>=0&&e<=59}function Ge(s,e){F(2,arguments);var t=L(s),n=ee(e),a=t.getFullYear(),i=t.getDate(),r=new Date(0);r.setFullYear(a,n,15),r.setHours(0,0,0,0);var u=li(r);return t.setMonth(n,Math.min(i,u)),t}function yi(s,e){if(F(2,arguments),ze(e)!=="object"||e===null)throw new RangeError("values parameter must be an object");var t=L(s);return isNaN(t.getTime())?new Date(NaN):(e.year!=null&&t.setFullYear(e.year),e.month!=null&&(t=Ge(t,e.month)),e.date!=null&&t.setDate(ee(e.date)),e.hours!=null&&t.setHours(ee(e.hours)),e.minutes!=null&&t.setMinutes(ee(e.minutes)),e.seconds!=null&&t.setSeconds(ee(e.seconds)),e.milliseconds!=null&&t.setMilliseconds(ee(e.milliseconds)),t)}function ta(s,e){F(2,arguments);var t=L(s),n=ee(e);return isNaN(t.getTime())?new Date(NaN):(t.setFullYear(n),t)}function au(s,e){F(2,arguments);var t=ee(e);return Le(s,-t)}function ru(s,e){F(2,arguments);var t=ee(e);return xn(s,-t)}function iu(s){return J.createElement("svg",Object.assign({viewBox:"0 0 24 24",fill:"none",xmlns:"http://www.w3.org/2000/svg",width:"1em",height:"1em",focusable:!1,"aria-hidden":!0},s),J.createElement("path",{fillRule:"evenodd",clipRule:"evenodd",d:"M4 20V8h16v12H4ZM2 4c0-1.1.9-2 2-2h16a2 2 0 0 1 2 2v16a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V4Zm4 6.5c0-.28.22-.5.5-.5h2c.28 0 .5.22.5.5v2a.5.5 0 0 1-.5.5h-2a.5.5 0 0 1-.5-.5v-2Zm.5 4.5a.5.5 0 0 0-.5.5v2c0 .28.22.5.5.5h2a.5.5 0 0 0 .5-.5v-2a.5.5 0 0 0-.5-.5h-2Zm4-4.5c0-.28.22-.5.5-.5h2c.28 0 .5.22.5.5v2a.5.5 0 0 1-.5.5h-2a.5.5 0 0 1-.5-.5v-2ZM11 15a.5.5 0 0 0-.5.5v2c0 .28.22.5.5.5h2a.5.5 0 0 0 .5-.5v-2a.5.5 0 0 0-.5-.5h-2Zm4-4.5c0-.28.22-.5.5-.5h2c.28 0 .5.22.5.5v2a.5.5 0 0 1-.5.5h-2a.5.5 0 0 1-.5-.5v-2Zm.5 4.5a.5.5 0 0 0-.5.5v2c0 .28.22.5.5.5h2a.5.5 0 0 0 .5-.5v-2a.5.5 0 0 0-.5-.5h-2Z",fill:"currentColor"}))}const Ti=Dt(iu,"calendar");function su(s){return J.createElement("svg",Object.assign({viewBox:"0 0 24 24",fill:"none",xmlns:"http://www.w3.org/2000/svg",width:"1em",height:"1em",focusable:!1,"aria-hidden":!0},s),J.createElement("path",{d:"M2 5v14a3 3 0 0 0 3 3h7.1a7.02 7.02 0 0 1-1.43-2H6a2 2 0 0 1-2-2V8a1 1 0 0 1 1-1h14a1 1 0 0 1 1 1v2.67c.75.36 1.43.85 2 1.43V5a3 3 0 0 0-3-3H5a3 3 0 0 0-3 3Z",fill:"currentColor"}),J.createElement("path",{d:"M16 10h1c-.54 0-1.06.06-1.57.18A1 1 0 0 1 16 10Z",fill:"currentColor"}),J.createElement("path",{d:"M13.5 10.94a1 1 0 0 0-1-.94h-1a1 1 0 0 0-1 1v1a1 1 0 0 0 .77.97 7.03 7.03 0 0 1 2.23-2.03Z",fill:"currentColor"}),J.createElement("path",{d:"M7 10a1 1 0 0 0-1 1v1a1 1 0 0 0 1 1h1a1 1 0 0 0 1-1v-1a1 1 0 0 0-1-1H7Z",fill:"currentColor"}),J.createElement("path",{d:"M6 16a1 1 0 0 1 1-1h1a1 1 0 0 1 1 1v1a1 1 0 0 1-1 1H7a1 1 0 0 1-1-1v-1Z",fill:"currentColor"}),J.createElement("path",{fillRule:"evenodd",clipRule:"evenodd",d:"M22 17a5 5 0 1 1-10 0 5 5 0 0 1 10 0Zm-4-2a1 1 0 1 0-2 0v2c0 .27.1.52.3.7l1.5 1.5a1 1 0 0 0 1.4-1.4L18 16.58V15Z",fill:"currentColor"}))}const ou=Dt(su,"calendar_clock");function uu(s){return J.createElement("svg",Object.assign({viewBox:"0 0 24 24",fill:"none",xmlns:"http://www.w3.org/2000/svg",width:"1em",height:"1em",focusable:!1,"aria-hidden":!0},s),J.createElement("path",{fillRule:"evenodd",clipRule:"evenodd",d:"M12 23a11 11 0 1 0 0-22 11 11 0 0 0 0 22Zm1.5-16.5v4.88l3.56 3.56a1.5 1.5 0 0 1-2.12 2.12l-4-4A1.5 1.5 0 0 1 10.5 12V6.5a1.5 1.5 0 0 1 3 0Z",fill:"currentColor"}))}const lu=Dt(uu,"clock");function cu(s){return J.createElement("svg",Object.assign({viewBox:"0 0 24 24",fill:"none",xmlns:"http://www.w3.org/2000/svg",width:"1em",height:"1em",focusable:!1,"aria-hidden":!0},s),J.createElement("path",{fillRule:"evenodd",clipRule:"evenodd",d:"M12.62 4.4c.5.53.5 1.38 0 1.91L7.14 12l5.48 5.69c.5.53.5 1.38 0 1.91-.51.53-1.33.53-1.84 0l-6.4-6.64a1.4 1.4 0 0 1 0-1.92l6.4-6.64c.5-.53 1.33-.53 1.84 0Z",fill:"currentColor"}),J.createElement("path",{fillRule:"evenodd",clipRule:"evenodd",d:"M19.62 4.4c.5.53.5 1.38 0 1.91L14.14 12l5.48 5.69c.5.53.5 1.38 0 1.91-.51.53-1.34.53-1.84 0l-6.4-6.64a1.4 1.4 0 0 1 0-1.92l6.4-6.64c.5-.53 1.33-.53 1.84 0Z",fill:"currentColor"}))}const du=Dt(cu,"double_chevron_left");function fu(s){return J.createElement("svg",Object.assign({viewBox:"0 0 24 24",fill:"none",xmlns:"http://www.w3.org/2000/svg",width:"1em",height:"1em",focusable:!1,"aria-hidden":!0},s),J.createElement("path",{fillRule:"evenodd",clipRule:"evenodd",d:"M4.38 4.4c.51-.53 1.34-.53 1.84 0l6.4 6.64c.5.53.5 1.39 0 1.92l-6.4 6.64c-.5.53-1.33.53-1.84 0a1.4 1.4 0 0 1 0-1.91L9.86 12 4.38 6.31a1.4 1.4 0 0 1 0-1.91Z",fill:"currentColor"}),J.createElement("path",{fillRule:"evenodd",clipRule:"evenodd",d:"M11.38 4.4c.51-.53 1.33-.53 1.84 0l6.4 6.64c.5.53.5 1.39 0 1.92l-6.4 6.64c-.5.53-1.33.53-1.84 0a1.4 1.4 0 0 1 0-1.91L16.86 12l-5.48-5.69a1.4 1.4 0 0 1 0-1.91Z",fill:"currentColor"}))}const hu=Dt(fu,"double_chevron_right"),pu={DAY_TODAY:`${B}-datepicker-day-today`,DAY_IN_RANGE:`${B}-datepicker-day-inrange`,DAY_HOVER:`${B}-datepicker-day-inhover`,DAY_SELECTED:`${B}-datepicker-day-selected`,DAY_SELECTED_START:`${B}-datepicker-day-selected-start`,DAY_SELECTED_END:`${B}-datepicker-day-selected-end`,DAY_DISABLED:`${B}-datepicker-day-disabled`,DAY_HOVER_DAY:`${B}-datepicker-day-hoverday`,DAY_HOVER_DAY_OFFSET:`${B}-datepicker-day-hoverday-offset`,DAY_IN_OFFSET_RANGE:`${B}-datepicker-day-inoffsetrange`,DAY_SELECTED_RANGE_HOVER:`${B}-datepicker-day-selectedrange-hover`,DAY_OFFSET_RANGE_START:`${B}-datepicker-day-offsetrange-start`,DAY_OFFSET_RANGE_END:`${B}-datepicker-day-offsetrange-end`,DAY_SELECTED_START_AFTER_HOVER:`${B}-datepicker-day-selected-start-afterhover`,DAY_SELECTED_END_BEFORE_HOVER:`${B}-datepicker-day-selected-end-beforehover`,DAY_HOVER_DAY_BEFORE_RANGE:`${B}-datepicker-day-hoverday-beforerange`,DAY_HOVER_DAY_AFTER_RANGE:`${B}-datepicker-day-hoverday-afterrange`,DAY_HOVER_DAY_IN_RANGE:`${B}-datepicker-day-hoverday-inrange`,DAY_HOVER_DAY_AROUND_SINGLE_SELECTED:`${B}-datepicker-day-hoverday-around-singleselected`},N=Object.assign({PREFIX:`${B}-datepicker`,NAVIGATION:`${B}-datepicker-navigation`,PANEL_YAM:`${B}-datepicker-panel-yam`,MONTH:`${B}-datepicker-month`,WEEKDAY:`${B}-datepicker-weekday`,WEEKS:`${B}-datepicker-weeks`,WEEK:`${B}-datepicker-week`,DAY:`${B}-datepicker-day`},pu),mu={FORMAT_FULL_DATE:"yyyy-MM-dd",FORMAT_TIME_PICKER:"HH:mm:ss",FORMAT_DATE_TIME:"yyyy-MM-dd HH:mm:ss",FORMAT_YEAR_MONTH:"yyyy-MM"},P=Object.assign({DEFAULT_SEPARATOR_MULTIPLE:",",DEFAULT_SEPARATOR_RANGE:" ~ ",SIZE_SET:["small","default","large"],TYPE_SET:["date","dateRange","year","month","monthRange","dateTime","dateTimeRange"],PRESET_POSITION_SET:["left","right","top","bottom"],DENSITY_SET:["default","compact"],PANEL_TYPE_LEFT:"left",PANEL_TYPE_RIGHT:"right",STATUS:ts,POSITION_SET:Gr.POSITION_SET,POSITION_INLINE_INPUT:"leftTopOver"},mu),ut={WEEK_START_ON:0,WEEK_HEIGHT:36,SPACING:Br.SPACING,SPACING_INSET_INPUT:1};var Wn,Oa;function gu(){if(Oa)return Wn;Oa=1;var s=Yi(),e=Li(),t="[object Date]";function n(a){return e(a)&&s(a)==t}return Wn=n,Wn}var jn,Sa;function vu(){if(Sa)return jn;Sa=1;var s=gu(),e=$i(),t=Hi(),n=t&&t.isDate,a=n?e(n):s;return jn=a,jn}var yu=vu();const xa=ia(yu);var Tu=Ui();const Tt=ia(Tu);function Ne(s){return typeof s=="string"}function Ma(s,e){const t=Ne(s)?be(s):s,n=Ne(e)?be(e):e;return Us(t,n)}function it(s,e){const t=Ne(s)?be(s):s,n=Ne(e)?be(e):e;return ci(t,n)}function et(s,e){let{start:t,end:n}=e;const a=Ne(s)?be(s):s,i=Ne(t)?be(t):t,r=Ne(n)?be(n):n;return ci(i,r)&&Uo(a,{start:i,end:r})&&!kn(a,i)&&!kn(a,r)}function Ye(s,e){const t=Ne(s)?be(s):s,n=Ne(e)?be(e):e;return ua(t,n)}function _e(s){return s&&Object.prototype.toString.call(s)==="[object Date]"&&!isNaN(s)}function wu(s){return typeof s=="number"||Object.prototype.toString.call(s)==="[object Number]"}function na(s){return wu(s)&&_e(new Date(s))}const wi={date:P.FORMAT_FULL_DATE,dateTime:P.FORMAT_DATE_TIME,dateRange:P.FORMAT_FULL_DATE,dateTimeRange:P.FORMAT_DATE_TIME,month:P.FORMAT_YEAR_MONTH,monthRange:P.FORMAT_YEAR_MONTH},Du=s=>wi;function $e(s){return s&&wi[s]}const bu=(s,e)=>{const t=new Date().getFullYear();let n=typeof s=="number"?s:t-100,a=typeof e=="number"?e:t+100;return an+r)},St=(s,e)=>{if(!e)return"";const t=new Date(e),n=st(s)?s(t):t;return X(new Date(n),P.FORMAT_FULL_DATE)};function ka(s,e){const t=new Date().getFullYear(),n=new Date().getMonth(),a=e.right||n+2,i=s.right||(a<=12?t:t+1);return{year:{left:s.left||t,right:i},month:{left:e.left||n+1,right:a<=12?a:1}}}var xt={exports:{}},Mt={exports:{}},Vn={exports:{}},Na;function re(){return Na||(Na=1,(function(s){function e(t){return t&&t.__esModule?t:{default:t}}s.exports=e,s.exports.__esModule=!0,s.exports.default=s.exports})(Vn)),Vn.exports}var kt={exports:{}},Nt={exports:{}},Bn={exports:{}},Aa;function Di(){return Aa||(Aa=1,(function(s){function e(t){"@babel/helpers - typeof";return s.exports=e=typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?function(n){return typeof n}:function(n){return n&&typeof Symbol=="function"&&n.constructor===Symbol&&n!==Symbol.prototype?"symbol":typeof n},s.exports.__esModule=!0,s.exports.default=s.exports,e(t)}s.exports=e,s.exports.__esModule=!0,s.exports.default=s.exports})(Bn)),Bn.exports}var At={exports:{}},Fa;function pe(){return Fa||(Fa=1,(function(s,e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=t;function t(n,a){if(a.length1?"s":"")+" required, but only "+a.length+" present")}s.exports=e.default})(At,At.exports)),At.exports}var Ya;function _u(){return Ya||(Ya=1,(function(s,e){var t=re().default;Object.defineProperty(e,"__esModule",{value:!0}),e.default=i;var n=t(Di()),a=t(pe());function i(r){return(0,a.default)(1,arguments),r instanceof Date||(0,n.default)(r)==="object"&&Object.prototype.toString.call(r)==="[object Date]"}s.exports=e.default})(Nt,Nt.exports)),Nt.exports}var Ft={exports:{}},La;function Se(){return La||(La=1,(function(s,e){var t=re().default;Object.defineProperty(e,"__esModule",{value:!0}),e.default=i;var n=t(Di()),a=t(pe());function i(r){(0,a.default)(1,arguments);var u=Object.prototype.toString.call(r);return r instanceof Date||(0,n.default)(r)==="object"&&u==="[object Date]"?new Date(r.getTime()):typeof r=="number"||u==="[object Number]"?new Date(r):((typeof r=="string"||u==="[object String]")&&typeof console<"u"&&(console.warn("Starting with v2.0.0-beta.1 date-fns doesn't accept strings as date arguments. Please use `parseISO` to parse strings. See: https://github.com/date-fns/date-fns/blob/master/docs/upgradeGuide.md#string-arguments"),console.warn(new Error().stack)),new Date(NaN))}s.exports=e.default})(Ft,Ft.exports)),Ft.exports}var $a;function Cu(){return $a||($a=1,(function(s,e){var t=re().default;Object.defineProperty(e,"__esModule",{value:!0}),e.default=r;var n=t(_u()),a=t(Se()),i=t(pe());function r(u){if((0,i.default)(1,arguments),!(0,n.default)(u)&&typeof u!="number")return!1;var o=(0,a.default)(u);return!isNaN(Number(o))}s.exports=e.default})(kt,kt.exports)),kt.exports}var Yt={exports:{}},Lt={exports:{}},$t={exports:{}},Ha;function Qe(){return Ha||(Ha=1,(function(s,e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=t;function t(n){if(n===null||n===!0||n===!1)return NaN;var a=Number(n);return isNaN(a)?a:a<0?Math.ceil(a):Math.floor(a)}s.exports=e.default})($t,$t.exports)),$t.exports}var Ua;function Iu(){return Ua||(Ua=1,(function(s,e){var t=re().default;Object.defineProperty(e,"__esModule",{value:!0}),e.default=r;var n=t(Qe()),a=t(Se()),i=t(pe());function r(u,o){(0,i.default)(2,arguments);var l=(0,a.default)(u).getTime(),c=(0,n.default)(o);return new Date(l+c)}s.exports=e.default})(Lt,Lt.exports)),Lt.exports}var qa;function Ru(){return qa||(qa=1,(function(s,e){var t=re().default;Object.defineProperty(e,"__esModule",{value:!0}),e.default=r;var n=t(Iu()),a=t(pe()),i=t(Qe());function r(u,o){(0,a.default)(2,arguments);var l=(0,i.default)(o);return(0,n.default)(u,-l)}s.exports=e.default})(Yt,Yt.exports)),Yt.exports}var Ht={exports:{}},Ut={exports:{}},Wa;function Pu(){return Wa||(Wa=1,(function(s,e){var t=re().default;Object.defineProperty(e,"__esModule",{value:!0}),e.default=r;var n=t(Se()),a=t(pe()),i=864e5;function r(u){(0,a.default)(1,arguments);var o=(0,n.default)(u),l=o.getTime();o.setUTCMonth(0,1),o.setUTCHours(0,0,0,0);var c=o.getTime(),d=l-c;return Math.floor(d/i)+1}s.exports=e.default})(Ut,Ut.exports)),Ut.exports}var qt={exports:{}},Wt={exports:{}},ja;function fa(){return ja||(ja=1,(function(s,e){var t=re().default;Object.defineProperty(e,"__esModule",{value:!0}),e.default=i;var n=t(Se()),a=t(pe());function i(r){(0,a.default)(1,arguments);var u=1,o=(0,n.default)(r),l=o.getUTCDay(),c=(l=d.getTime()?l+1:o.getTime()>=h.getTime()?l:l-1}s.exports=e.default})(Vt,Vt.exports)),Vt.exports}var Ba;function Eu(){return Ba||(Ba=1,(function(s,e){var t=re().default;Object.defineProperty(e,"__esModule",{value:!0}),e.default=r;var n=t(bi()),a=t(fa()),i=t(pe());function r(u){(0,i.default)(1,arguments);var o=(0,n.default)(u),l=new Date(0);l.setUTCFullYear(o,0,4),l.setUTCHours(0,0,0,0);var c=(0,a.default)(l);return c}s.exports=e.default})(jt,jt.exports)),jt.exports}var Ga;function Ou(){return Ga||(Ga=1,(function(s,e){var t=re().default;Object.defineProperty(e,"__esModule",{value:!0}),e.default=o;var n=t(Se()),a=t(fa()),i=t(Eu()),r=t(pe()),u=6048e5;function o(l){(0,r.default)(1,arguments);var c=(0,n.default)(l),d=(0,a.default)(c).getTime()-(0,i.default)(c).getTime();return Math.round(d/u)+1}s.exports=e.default})(qt,qt.exports)),qt.exports}var Bt={exports:{}},Gt={exports:{}},ft={},za;function Yn(){if(za)return ft;za=1,Object.defineProperty(ft,"__esModule",{value:!0}),ft.getDefaultOptions=e,ft.setDefaultOptions=t;var s={};function e(){return s}function t(n){s=n}return ft}var Xa;function ha(){return Xa||(Xa=1,(function(s,e){var t=re().default;Object.defineProperty(e,"__esModule",{value:!0}),e.default=u;var n=t(Se()),a=t(pe()),i=t(Qe()),r=Yn();function u(o,l){var c,d,f,h,v,w,m,g;(0,a.default)(1,arguments);var T=(0,r.getDefaultOptions)(),y=(0,i.default)((c=(d=(f=(h=l==null?void 0:l.weekStartsOn)!==null&&h!==void 0?h:l==null||(v=l.locale)===null||v===void 0||(w=v.options)===null||w===void 0?void 0:w.weekStartsOn)!==null&&f!==void 0?f:T.weekStartsOn)!==null&&d!==void 0?d:(m=T.locale)===null||m===void 0||(g=m.options)===null||g===void 0?void 0:g.weekStartsOn)!==null&&c!==void 0?c:0);if(!(y>=0&&y<=6))throw new RangeError("weekStartsOn must be between 0 and 6 inclusively");var D=(0,n.default)(o),_=D.getUTCDay(),I=(_=1&&I<=7))throw new RangeError("firstWeekContainsDate must be between 1 and 7 inclusively");var x=new Date(0);x.setUTCFullYear(D+1,0,I),x.setUTCHours(0,0,0,0);var R=(0,i.default)(x,c),C=new Date(0);C.setUTCFullYear(D,0,I),C.setUTCHours(0,0,0,0);var E=(0,i.default)(C,c);return y.getTime()>=R.getTime()?D+1:y.getTime()>=E.getTime()?D:D-1}s.exports=e.default})(Xt,Xt.exports)),Xt.exports}var Qa;function Su(){return Qa||(Qa=1,(function(s,e){var t=re().default;Object.defineProperty(e,"__esModule",{value:!0}),e.default=o;var n=t(_i()),a=t(pe()),i=t(ha()),r=t(Qe()),u=Yn();function o(l,c){var d,f,h,v,w,m,g,T;(0,a.default)(1,arguments);var y=(0,u.getDefaultOptions)(),D=(0,r.default)((d=(f=(h=(v=c==null?void 0:c.firstWeekContainsDate)!==null&&v!==void 0?v:c==null||(w=c.locale)===null||w===void 0||(m=w.options)===null||m===void 0?void 0:m.firstWeekContainsDate)!==null&&h!==void 0?h:y.firstWeekContainsDate)!==null&&f!==void 0?f:(g=y.locale)===null||g===void 0||(T=g.options)===null||T===void 0?void 0:T.firstWeekContainsDate)!==null&&d!==void 0?d:1),_=(0,n.default)(l,c),I=new Date(0);I.setUTCFullYear(_,0,D),I.setUTCHours(0,0,0,0);var x=(0,i.default)(I,c);return x}s.exports=e.default})(zt,zt.exports)),zt.exports}var Ka;function xu(){return Ka||(Ka=1,(function(s,e){var t=re().default;Object.defineProperty(e,"__esModule",{value:!0}),e.default=o;var n=t(Se()),a=t(ha()),i=t(Su()),r=t(pe()),u=6048e5;function o(l,c){(0,r.default)(1,arguments);var d=(0,n.default)(l),f=(0,a.default)(d,c).getTime()-(0,i.default)(d,c).getTime();return Math.round(f/u)+1}s.exports=e.default})(Bt,Bt.exports)),Bt.exports}var Zt={exports:{}},Ja;function Ci(){return Ja||(Ja=1,(function(s,e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=t;function t(n,a){for(var i=n<0?"-":"",r=Math.abs(n).toString();r.length0?l:1-l;return(0,n.default)(o==="yy"?c%100:c,o.length)},M:function(u,o){var l=u.getUTCMonth();return o==="M"?String(l+1):(0,n.default)(l+1,2)},d:function(u,o){return(0,n.default)(u.getUTCDate(),o.length)},a:function(u,o){var l=u.getUTCHours()/12>=1?"pm":"am";switch(o){case"a":case"aa":return l.toUpperCase();case"aaa":return l;case"aaaaa":return l[0];case"aaaa":default:return l==="am"?"a.m.":"p.m."}},h:function(u,o){return(0,n.default)(u.getUTCHours()%12||12,o.length)},H:function(u,o){return(0,n.default)(u.getUTCHours(),o.length)},m:function(u,o){return(0,n.default)(u.getUTCMinutes(),o.length)},s:function(u,o){return(0,n.default)(u.getUTCSeconds(),o.length)},S:function(u,o){var l=o.length,c=u.getUTCMilliseconds(),d=Math.floor(c*Math.pow(10,l-3));return(0,n.default)(d,o.length)}},i=a;e.default=i,s.exports=e.default})(Qt,Qt.exports)),Qt.exports}var tr;function ku(){return tr||(tr=1,(function(s,e){var t=re().default;Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var n=t(Pu()),a=t(Ou()),i=t(bi()),r=t(xu()),u=t(_i()),o=t(Ci()),l=t(Mu()),c={midnight:"midnight",noon:"noon",morning:"morning",afternoon:"afternoon",evening:"evening",night:"night"},d={G:function(g,T,y){var D=g.getUTCFullYear()>0?1:0;switch(T){case"G":case"GG":case"GGG":return y.era(D,{width:"abbreviated"});case"GGGGG":return y.era(D,{width:"narrow"});case"GGGG":default:return y.era(D,{width:"wide"})}},y:function(g,T,y){if(T==="yo"){var D=g.getUTCFullYear(),_=D>0?D:1-D;return y.ordinalNumber(_,{unit:"year"})}return l.default.y(g,T)},Y:function(g,T,y,D){var _=(0,u.default)(g,D),I=_>0?_:1-_;if(T==="YY"){var x=I%100;return(0,o.default)(x,2)}return T==="Yo"?y.ordinalNumber(I,{unit:"year"}):(0,o.default)(I,T.length)},R:function(g,T){var y=(0,i.default)(g);return(0,o.default)(y,T.length)},u:function(g,T){var y=g.getUTCFullYear();return(0,o.default)(y,T.length)},Q:function(g,T,y){var D=Math.ceil((g.getUTCMonth()+1)/3);switch(T){case"Q":return String(D);case"QQ":return(0,o.default)(D,2);case"Qo":return y.ordinalNumber(D,{unit:"quarter"});case"QQQ":return y.quarter(D,{width:"abbreviated",context:"formatting"});case"QQQQQ":return y.quarter(D,{width:"narrow",context:"formatting"});case"QQQQ":default:return y.quarter(D,{width:"wide",context:"formatting"})}},q:function(g,T,y){var D=Math.ceil((g.getUTCMonth()+1)/3);switch(T){case"q":return String(D);case"qq":return(0,o.default)(D,2);case"qo":return y.ordinalNumber(D,{unit:"quarter"});case"qqq":return y.quarter(D,{width:"abbreviated",context:"standalone"});case"qqqqq":return y.quarter(D,{width:"narrow",context:"standalone"});case"qqqq":default:return y.quarter(D,{width:"wide",context:"standalone"})}},M:function(g,T,y){var D=g.getUTCMonth();switch(T){case"M":case"MM":return l.default.M(g,T);case"Mo":return y.ordinalNumber(D+1,{unit:"month"});case"MMM":return y.month(D,{width:"abbreviated",context:"formatting"});case"MMMMM":return y.month(D,{width:"narrow",context:"formatting"});case"MMMM":default:return y.month(D,{width:"wide",context:"formatting"})}},L:function(g,T,y){var D=g.getUTCMonth();switch(T){case"L":return String(D+1);case"LL":return(0,o.default)(D+1,2);case"Lo":return y.ordinalNumber(D+1,{unit:"month"});case"LLL":return y.month(D,{width:"abbreviated",context:"standalone"});case"LLLLL":return y.month(D,{width:"narrow",context:"standalone"});case"LLLL":default:return y.month(D,{width:"wide",context:"standalone"})}},w:function(g,T,y,D){var _=(0,r.default)(g,D);return T==="wo"?y.ordinalNumber(_,{unit:"week"}):(0,o.default)(_,T.length)},I:function(g,T,y){var D=(0,a.default)(g);return T==="Io"?y.ordinalNumber(D,{unit:"week"}):(0,o.default)(D,T.length)},d:function(g,T,y){return T==="do"?y.ordinalNumber(g.getUTCDate(),{unit:"date"}):l.default.d(g,T)},D:function(g,T,y){var D=(0,n.default)(g);return T==="Do"?y.ordinalNumber(D,{unit:"dayOfYear"}):(0,o.default)(D,T.length)},E:function(g,T,y){var D=g.getUTCDay();switch(T){case"E":case"EE":case"EEE":return y.day(D,{width:"abbreviated",context:"formatting"});case"EEEEE":return y.day(D,{width:"narrow",context:"formatting"});case"EEEEEE":return y.day(D,{width:"short",context:"formatting"});case"EEEE":default:return y.day(D,{width:"wide",context:"formatting"})}},e:function(g,T,y,D){var _=g.getUTCDay(),I=(_-D.weekStartsOn+8)%7||7;switch(T){case"e":return String(I);case"ee":return(0,o.default)(I,2);case"eo":return y.ordinalNumber(I,{unit:"day"});case"eee":return y.day(_,{width:"abbreviated",context:"formatting"});case"eeeee":return y.day(_,{width:"narrow",context:"formatting"});case"eeeeee":return y.day(_,{width:"short",context:"formatting"});case"eeee":default:return y.day(_,{width:"wide",context:"formatting"})}},c:function(g,T,y,D){var _=g.getUTCDay(),I=(_-D.weekStartsOn+8)%7||7;switch(T){case"c":return String(I);case"cc":return(0,o.default)(I,T.length);case"co":return y.ordinalNumber(I,{unit:"day"});case"ccc":return y.day(_,{width:"abbreviated",context:"standalone"});case"ccccc":return y.day(_,{width:"narrow",context:"standalone"});case"cccccc":return y.day(_,{width:"short",context:"standalone"});case"cccc":default:return y.day(_,{width:"wide",context:"standalone"})}},i:function(g,T,y){var D=g.getUTCDay(),_=D===0?7:D;switch(T){case"i":return String(_);case"ii":return(0,o.default)(_,T.length);case"io":return y.ordinalNumber(_,{unit:"day"});case"iii":return y.day(D,{width:"abbreviated",context:"formatting"});case"iiiii":return y.day(D,{width:"narrow",context:"formatting"});case"iiiiii":return y.day(D,{width:"short",context:"formatting"});case"iiii":default:return y.day(D,{width:"wide",context:"formatting"})}},a:function(g,T,y){var D=g.getUTCHours(),_=D/12>=1?"pm":"am";switch(T){case"a":case"aa":return y.dayPeriod(_,{width:"abbreviated",context:"formatting"});case"aaa":return y.dayPeriod(_,{width:"abbreviated",context:"formatting"}).toLowerCase();case"aaaaa":return y.dayPeriod(_,{width:"narrow",context:"formatting"});case"aaaa":default:return y.dayPeriod(_,{width:"wide",context:"formatting"})}},b:function(g,T,y){var D=g.getUTCHours(),_;switch(D===12?_=c.noon:D===0?_=c.midnight:_=D/12>=1?"pm":"am",T){case"b":case"bb":return y.dayPeriod(_,{width:"abbreviated",context:"formatting"});case"bbb":return y.dayPeriod(_,{width:"abbreviated",context:"formatting"}).toLowerCase();case"bbbbb":return y.dayPeriod(_,{width:"narrow",context:"formatting"});case"bbbb":default:return y.dayPeriod(_,{width:"wide",context:"formatting"})}},B:function(g,T,y){var D=g.getUTCHours(),_;switch(D>=17?_=c.evening:D>=12?_=c.afternoon:D>=4?_=c.morning:_=c.night,T){case"B":case"BB":case"BBB":return y.dayPeriod(_,{width:"abbreviated",context:"formatting"});case"BBBBB":return y.dayPeriod(_,{width:"narrow",context:"formatting"});case"BBBB":default:return y.dayPeriod(_,{width:"wide",context:"formatting"})}},h:function(g,T,y){if(T==="ho"){var D=g.getUTCHours()%12;return D===0&&(D=12),y.ordinalNumber(D,{unit:"hour"})}return l.default.h(g,T)},H:function(g,T,y){return T==="Ho"?y.ordinalNumber(g.getUTCHours(),{unit:"hour"}):l.default.H(g,T)},K:function(g,T,y){var D=g.getUTCHours()%12;return T==="Ko"?y.ordinalNumber(D,{unit:"hour"}):(0,o.default)(D,T.length)},k:function(g,T,y){var D=g.getUTCHours();return D===0&&(D=24),T==="ko"?y.ordinalNumber(D,{unit:"hour"}):(0,o.default)(D,T.length)},m:function(g,T,y){return T==="mo"?y.ordinalNumber(g.getUTCMinutes(),{unit:"minute"}):l.default.m(g,T)},s:function(g,T,y){return T==="so"?y.ordinalNumber(g.getUTCSeconds(),{unit:"second"}):l.default.s(g,T)},S:function(g,T){return l.default.S(g,T)},X:function(g,T,y,D){var _=D._originalDate||g,I=_.getTimezoneOffset();if(I===0)return"Z";switch(T){case"X":return h(I);case"XXXX":case"XX":return v(I);case"XXXXX":case"XXX":default:return v(I,":")}},x:function(g,T,y,D){var _=D._originalDate||g,I=_.getTimezoneOffset();switch(T){case"x":return h(I);case"xxxx":case"xx":return v(I);case"xxxxx":case"xxx":default:return v(I,":")}},O:function(g,T,y,D){var _=D._originalDate||g,I=_.getTimezoneOffset();switch(T){case"O":case"OO":case"OOO":return"GMT"+f(I,":");case"OOOO":default:return"GMT"+v(I,":")}},z:function(g,T,y,D){var _=D._originalDate||g,I=_.getTimezoneOffset();switch(T){case"z":case"zz":case"zzz":return"GMT"+f(I,":");case"zzzz":default:return"GMT"+v(I,":")}},t:function(g,T,y,D){var _=D._originalDate||g,I=Math.floor(_.getTime()/1e3);return(0,o.default)(I,T.length)},T:function(g,T,y,D){var _=D._originalDate||g,I=_.getTime();return(0,o.default)(I,T.length)}};function f(m,g){var T=m>0?"-":"+",y=Math.abs(m),D=Math.floor(y/60),_=y%60;if(_===0)return T+String(D);var I=g;return T+String(D)+I+(0,o.default)(_,2)}function h(m,g){if(m%60===0){var T=m>0?"-":"+";return T+(0,o.default)(Math.abs(m)/60,2)}return v(m,g)}function v(m,g){var T=g||"",y=m>0?"-":"+",D=Math.abs(m),_=(0,o.default)(Math.floor(D/60),2),I=(0,o.default)(D%60,2);return y+_+T+I}var w=d;e.default=w,s.exports=e.default})(Ht,Ht.exports)),Ht.exports}var Kt={exports:{}},nr;function Nu(){return nr||(nr=1,(function(s,e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var t=function(o,l){switch(o){case"P":return l.date({width:"short"});case"PP":return l.date({width:"medium"});case"PPP":return l.date({width:"long"});case"PPPP":default:return l.date({width:"full"})}},n=function(o,l){switch(o){case"p":return l.time({width:"short"});case"pp":return l.time({width:"medium"});case"ppp":return l.time({width:"long"});case"pppp":default:return l.time({width:"full"})}},a=function(o,l){var c=o.match(/(P+)(p+)?/)||[],d=c[1],f=c[2];if(!f)return t(o,l);var h;switch(d){case"P":h=l.dateTime({width:"short"});break;case"PP":h=l.dateTime({width:"medium"});break;case"PPP":h=l.dateTime({width:"long"});break;case"PPPP":default:h=l.dateTime({width:"full"});break}return h.replace("{{date}}",t(d,l)).replace("{{time}}",n(f,l))},i={p:n,P:a},r=i;e.default=r,s.exports=e.default})(Kt,Kt.exports)),Kt.exports}var Jt={exports:{}},ar;function Ii(){return ar||(ar=1,(function(s,e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=t;function t(n){var a=new Date(Date.UTC(n.getFullYear(),n.getMonth(),n.getDate(),n.getHours(),n.getMinutes(),n.getSeconds(),n.getMilliseconds()));return a.setUTCFullYear(n.getFullYear()),n.getTime()-a.getTime()}s.exports=e.default})(Jt,Jt.exports)),Jt.exports}var tt={},rr;function Au(){if(rr)return tt;rr=1,Object.defineProperty(tt,"__esModule",{value:!0}),tt.isProtectedDayOfYearToken=t,tt.isProtectedWeekYearToken=n,tt.throwProtectedError=a;var s=["D","DD"],e=["YY","YYYY"];function t(i){return s.indexOf(i)!==-1}function n(i){return e.indexOf(i)!==-1}function a(i,r,u){if(i==="YYYY")throw new RangeError("Use `yyyy` instead of `YYYY` (in `".concat(r,"`) for formatting years to the input `").concat(u,"`; see: https://github.com/date-fns/date-fns/blob/master/docs/unicodeTokens.md"));if(i==="YY")throw new RangeError("Use `yy` instead of `YY` (in `".concat(r,"`) for formatting years to the input `").concat(u,"`; see: https://github.com/date-fns/date-fns/blob/master/docs/unicodeTokens.md"));if(i==="D")throw new RangeError("Use `d` instead of `D` (in `".concat(r,"`) for formatting days of the month to the input `").concat(u,"`; see: https://github.com/date-fns/date-fns/blob/master/docs/unicodeTokens.md"));if(i==="DD")throw new RangeError("Use `dd` instead of `DD` (in `".concat(r,"`) for formatting days of the month to the input `").concat(u,"`; see: https://github.com/date-fns/date-fns/blob/master/docs/unicodeTokens.md"))}return tt}var en={exports:{}},tn={exports:{}},nn={exports:{}},ir;function Fu(){return ir||(ir=1,(function(s,e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var t={lessThanXSeconds:{one:"less than a second",other:"less than {{count}} seconds"},xSeconds:{one:"1 second",other:"{{count}} seconds"},halfAMinute:"half a minute",lessThanXMinutes:{one:"less than a minute",other:"less than {{count}} minutes"},xMinutes:{one:"1 minute",other:"{{count}} minutes"},aboutXHours:{one:"about 1 hour",other:"about {{count}} hours"},xHours:{one:"1 hour",other:"{{count}} hours"},xDays:{one:"1 day",other:"{{count}} days"},aboutXWeeks:{one:"about 1 week",other:"about {{count}} weeks"},xWeeks:{one:"1 week",other:"{{count}} weeks"},aboutXMonths:{one:"about 1 month",other:"about {{count}} months"},xMonths:{one:"1 month",other:"{{count}} months"},aboutXYears:{one:"about 1 year",other:"about {{count}} years"},xYears:{one:"1 year",other:"{{count}} years"},overXYears:{one:"over 1 year",other:"over {{count}} years"},almostXYears:{one:"almost 1 year",other:"almost {{count}} years"}},n=function(r,u,o){var l,c=t[r];return typeof c=="string"?l=c:u===1?l=c.one:l=c.other.replace("{{count}}",u.toString()),o!=null&&o.addSuffix?o.comparison&&o.comparison>0?"in "+l:l+" ago":l},a=n;e.default=a,s.exports=e.default})(nn,nn.exports)),nn.exports}var an={exports:{}},rn={exports:{}},sr;function Yu(){return sr||(sr=1,(function(s,e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=t;function t(n){return function(){var a=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{},i=a.width?String(a.width):n.defaultWidth,r=n.formats[i]||n.formats[n.defaultWidth];return r}}s.exports=e.default})(rn,rn.exports)),rn.exports}var or;function Lu(){return or||(or=1,(function(s,e){var t=re().default;Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var n=t(Yu()),a={full:"EEEE, MMMM do, y",long:"MMMM do, y",medium:"MMM d, y",short:"MM/dd/yyyy"},i={full:"h:mm:ss a zzzz",long:"h:mm:ss a z",medium:"h:mm:ss a",short:"h:mm a"},r={full:"{{date}} 'at' {{time}}",long:"{{date}} 'at' {{time}}",medium:"{{date}}, {{time}}",short:"{{date}}, {{time}}"},u={date:(0,n.default)({formats:a,defaultWidth:"full"}),time:(0,n.default)({formats:i,defaultWidth:"full"}),dateTime:(0,n.default)({formats:r,defaultWidth:"full"})},o=u;e.default=o,s.exports=e.default})(an,an.exports)),an.exports}var sn={exports:{}},ur;function $u(){return ur||(ur=1,(function(s,e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var t={lastWeek:"'last' eeee 'at' p",yesterday:"'yesterday at' p",today:"'today at' p",tomorrow:"'tomorrow at' p",nextWeek:"eeee 'at' p",other:"P"},n=function(r,u,o,l){return t[r]},a=n;e.default=a,s.exports=e.default})(sn,sn.exports)),sn.exports}var on={exports:{}},un={exports:{}},lr;function Hu(){return lr||(lr=1,(function(s,e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=t;function t(n){return function(a,i){var r=i!=null&&i.context?String(i.context):"standalone",u;if(r==="formatting"&&n.formattingValues){var o=n.defaultFormattingWidth||n.defaultWidth,l=i!=null&&i.width?String(i.width):o;u=n.formattingValues[l]||n.formattingValues[o]}else{var c=n.defaultWidth,d=i!=null&&i.width?String(i.width):n.defaultWidth;u=n.values[d]||n.values[c]}var f=n.argumentCallback?n.argumentCallback(a):a;return u[f]}}s.exports=e.default})(un,un.exports)),un.exports}var cr;function Uu(){return cr||(cr=1,(function(s,e){var t=re().default;Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var n=t(Hu()),a={narrow:["B","A"],abbreviated:["BC","AD"],wide:["Before Christ","Anno Domini"]},i={narrow:["1","2","3","4"],abbreviated:["Q1","Q2","Q3","Q4"],wide:["1st quarter","2nd quarter","3rd quarter","4th quarter"]},r={narrow:["J","F","M","A","M","J","J","A","S","O","N","D"],abbreviated:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],wide:["January","February","March","April","May","June","July","August","September","October","November","December"]},u={narrow:["S","M","T","W","T","F","S"],short:["Su","Mo","Tu","We","Th","Fr","Sa"],abbreviated:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],wide:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"]},o={narrow:{am:"a",pm:"p",midnight:"mi",noon:"n",morning:"morning",afternoon:"afternoon",evening:"evening",night:"night"},abbreviated:{am:"AM",pm:"PM",midnight:"midnight",noon:"noon",morning:"morning",afternoon:"afternoon",evening:"evening",night:"night"},wide:{am:"a.m.",pm:"p.m.",midnight:"midnight",noon:"noon",morning:"morning",afternoon:"afternoon",evening:"evening",night:"night"}},l={narrow:{am:"a",pm:"p",midnight:"mi",noon:"n",morning:"in the morning",afternoon:"in the afternoon",evening:"in the evening",night:"at night"},abbreviated:{am:"AM",pm:"PM",midnight:"midnight",noon:"noon",morning:"in the morning",afternoon:"in the afternoon",evening:"in the evening",night:"at night"},wide:{am:"a.m.",pm:"p.m.",midnight:"midnight",noon:"noon",morning:"in the morning",afternoon:"in the afternoon",evening:"in the evening",night:"at night"}},c=function(v,w){var m=Number(v),g=m%100;if(g>20||g<10)switch(g%10){case 1:return m+"st";case 2:return m+"nd";case 3:return m+"rd"}return m+"th"},d={ordinalNumber:c,era:(0,n.default)({values:a,defaultWidth:"wide"}),quarter:(0,n.default)({values:i,defaultWidth:"wide",argumentCallback:function(v){return v-1}}),month:(0,n.default)({values:r,defaultWidth:"wide"}),day:(0,n.default)({values:u,defaultWidth:"wide"}),dayPeriod:(0,n.default)({values:o,defaultWidth:"wide",formattingValues:l,defaultFormattingWidth:"wide"})},f=d;e.default=f,s.exports=e.default})(on,on.exports)),on.exports}var ln={exports:{}},cn={exports:{}},dr;function qu(){return dr||(dr=1,(function(s,e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=t;function t(i){return function(r){var u=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{},o=u.width,l=o&&i.matchPatterns[o]||i.matchPatterns[i.defaultMatchWidth],c=r.match(l);if(!c)return null;var d=c[0],f=o&&i.parsePatterns[o]||i.parsePatterns[i.defaultParseWidth],h=Array.isArray(f)?a(f,function(m){return m.test(d)}):n(f,function(m){return m.test(d)}),v;v=i.valueCallback?i.valueCallback(h):h,v=u.valueCallback?u.valueCallback(v):v;var w=r.slice(d.length);return{value:v,rest:w}}}function n(i,r){for(var u in i)if(i.hasOwnProperty(u)&&r(i[u]))return u}function a(i,r){for(var u=0;u1&&arguments[1]!==void 0?arguments[1]:{},r=a.match(n.matchPattern);if(!r)return null;var u=r[0],o=a.match(n.parsePattern);if(!o)return null;var l=n.valueCallback?n.valueCallback(o[0]):o[0];l=i.valueCallback?i.valueCallback(l):l;var c=a.slice(u.length);return{value:l,rest:c}}}s.exports=e.default})(dn,dn.exports)),dn.exports}var hr;function ju(){return hr||(hr=1,(function(s,e){var t=re().default;Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var n=t(qu()),a=t(Wu()),i=/^(\d+)(th|st|nd|rd)?/i,r=/\d+/i,u={narrow:/^(b|a)/i,abbreviated:/^(b\.?\s?c\.?|b\.?\s?c\.?\s?e\.?|a\.?\s?d\.?|c\.?\s?e\.?)/i,wide:/^(before christ|before common era|anno domini|common era)/i},o={any:[/^b/i,/^(a|c)/i]},l={narrow:/^[1234]/i,abbreviated:/^q[1234]/i,wide:/^[1234](th|st|nd|rd)? quarter/i},c={any:[/1/i,/2/i,/3/i,/4/i]},d={narrow:/^[jfmasond]/i,abbreviated:/^(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)/i,wide:/^(january|february|march|april|may|june|july|august|september|october|november|december)/i},f={narrow:[/^j/i,/^f/i,/^m/i,/^a/i,/^m/i,/^j/i,/^j/i,/^a/i,/^s/i,/^o/i,/^n/i,/^d/i],any:[/^ja/i,/^f/i,/^mar/i,/^ap/i,/^may/i,/^jun/i,/^jul/i,/^au/i,/^s/i,/^o/i,/^n/i,/^d/i]},h={narrow:/^[smtwf]/i,short:/^(su|mo|tu|we|th|fr|sa)/i,abbreviated:/^(sun|mon|tue|wed|thu|fri|sat)/i,wide:/^(sunday|monday|tuesday|wednesday|thursday|friday|saturday)/i},v={narrow:[/^s/i,/^m/i,/^t/i,/^w/i,/^t/i,/^f/i,/^s/i],any:[/^su/i,/^m/i,/^tu/i,/^w/i,/^th/i,/^f/i,/^sa/i]},w={narrow:/^(a|p|mi|n|(in the|at) (morning|afternoon|evening|night))/i,any:/^([ap]\.?\s?m\.?|midnight|noon|(in the|at) (morning|afternoon|evening|night))/i},m={any:{am:/^a/i,pm:/^p/i,midnight:/^mi/i,noon:/^no/i,morning:/morning/i,afternoon:/afternoon/i,evening:/evening/i,night:/night/i}},g={ordinalNumber:(0,a.default)({matchPattern:i,parsePattern:r,valueCallback:function(D){return parseInt(D,10)}}),era:(0,n.default)({matchPatterns:u,defaultMatchWidth:"wide",parsePatterns:o,defaultParseWidth:"any"}),quarter:(0,n.default)({matchPatterns:l,defaultMatchWidth:"wide",parsePatterns:c,defaultParseWidth:"any",valueCallback:function(D){return D+1}}),month:(0,n.default)({matchPatterns:d,defaultMatchWidth:"wide",parsePatterns:f,defaultParseWidth:"any"}),day:(0,n.default)({matchPatterns:h,defaultMatchWidth:"wide",parsePatterns:v,defaultParseWidth:"any"}),dayPeriod:(0,n.default)({matchPatterns:w,defaultMatchWidth:"any",parsePatterns:m,defaultParseWidth:"any"})},T=g;e.default=T,s.exports=e.default})(ln,ln.exports)),ln.exports}var pr;function Vu(){return pr||(pr=1,(function(s,e){var t=re().default;Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var n=t(Fu()),a=t(Lu()),i=t($u()),r=t(Uu()),u=t(ju()),o={code:"en-US",formatDistance:n.default,formatLong:a.default,formatRelative:i.default,localize:r.default,match:u.default,options:{weekStartsOn:0,firstWeekContainsDate:1}},l=o;e.default=l,s.exports=e.default})(tn,tn.exports)),tn.exports}var mr;function Bu(){return mr||(mr=1,(function(s,e){var t=re().default;Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var n=t(Vu()),a=n.default;e.default=a,s.exports=e.default})(en,en.exports)),en.exports}var gr;function Gu(){return gr||(gr=1,(function(s,e){var t=re().default;Object.defineProperty(e,"__esModule",{value:!0}),e.default=y;var n=t(Cu()),a=t(Ru()),i=t(Se()),r=t(ku()),u=t(Nu()),o=t(Ii()),l=Au(),c=t(Qe()),d=t(pe()),f=Yn(),h=t(Bu()),v=/[yYQqMLwIdDecihHKkms]o|(\w)\1*|''|'(''|[^'])+('|$)|./g,w=/P+p+|P+|p+|''|'(''|[^'])+('|$)|./g,m=/^'([^]*?)'?$/,g=/''/g,T=/[a-zA-Z]/;function y(_,I,x){var R,C,E,O,k,U,se,G,Z,ce,me,he,qe,Ie,ge,xe,Re,Ke;(0,d.default)(2,arguments);var _t=String(I),Pe=(0,f.getDefaultOptions)(),te=(R=(C=x==null?void 0:x.locale)!==null&&C!==void 0?C:Pe.locale)!==null&&R!==void 0?R:h.default,V=(0,c.default)((E=(O=(k=(U=x==null?void 0:x.firstWeekContainsDate)!==null&&U!==void 0?U:x==null||(se=x.locale)===null||se===void 0||(G=se.options)===null||G===void 0?void 0:G.firstWeekContainsDate)!==null&&k!==void 0?k:Pe.firstWeekContainsDate)!==null&&O!==void 0?O:(Z=Pe.locale)===null||Z===void 0||(ce=Z.options)===null||ce===void 0?void 0:ce.firstWeekContainsDate)!==null&&E!==void 0?E:1);if(!(V>=1&&V<=7))throw new RangeError("firstWeekContainsDate must be between 1 and 7 inclusively");var fe=(0,c.default)((me=(he=(qe=(Ie=x==null?void 0:x.weekStartsOn)!==null&&Ie!==void 0?Ie:x==null||(ge=x.locale)===null||ge===void 0||(xe=ge.options)===null||xe===void 0?void 0:xe.weekStartsOn)!==null&&qe!==void 0?qe:Pe.weekStartsOn)!==null&&he!==void 0?he:(Re=Pe.locale)===null||Re===void 0||(Ke=Re.options)===null||Ke===void 0?void 0:Ke.weekStartsOn)!==null&&me!==void 0?me:0);if(!(fe>=0&&fe<=6))throw new RangeError("weekStartsOn must be between 0 and 6 inclusively");if(!te.localize)throw new RangeError("locale must contain localize property");if(!te.formatLong)throw new RangeError("locale must contain formatLong property");var Me=(0,i.default)(_);if(!(0,n.default)(Me))throw new RangeError("Invalid time value");var Ct=(0,o.default)(Me),It=(0,a.default)(Me,Ct),ct={firstWeekContainsDate:V,weekStartsOn:fe,locale:te,_originalDate:Me},Rt=_t.match(w).map(function(Te){var Ae=Te[0];if(Ae==="p"||Ae==="P"){var Pt=u.default[Ae];return Pt(Te,te.formatLong)}return Te}).join("").match(v).map(function(Te){if(Te==="''")return"'";var Ae=Te[0];if(Ae==="'")return D(Te);var Pt=r.default[Ae];if(Pt)return!(x!=null&&x.useAdditionalWeekYearTokens)&&(0,l.isProtectedWeekYearToken)(Te)&&(0,l.throwProtectedError)(Te,I,String(_)),!(x!=null&&x.useAdditionalDayOfYearTokens)&&(0,l.isProtectedDayOfYearToken)(Te)&&(0,l.throwProtectedError)(Te,I,String(_)),Pt(It,Te,te.localize,ct);if(Ae.match(T))throw new RangeError("Format string contains an unescaped latin alphabet character `"+Ae+"`");return Te}).join("");return Rt}function D(_){var I=_.match(m);return I?I[1].replace(g,"'"):_}s.exports=e.default})(Mt,Mt.exports)),Mt.exports}var fn={exports:{}},hn={exports:{}},vr;function zu(){return vr||(vr=1,(function(s,e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=t;function t(r,u,o){var l=i(r,o.timeZone,o.locale);return l.formatToParts?n(l,u):a(l,u)}function n(r,u){for(var o=r.formatToParts(u),l=o.length-1;l>=0;--l)if(o[l].type==="timeZoneName")return o[l].value}function a(r,u){var o=r.format(u).replace(/\u200E/g,""),l=/ [\w-+ ]+$/.exec(o);return l?l[0].substr(1):""}function i(r,u,o){if(o&&!o.code)throw new Error("date-fns-tz error: Please set a language code on the locale object imported from date-fns, e.g. `locale.code = 'en-US'`");return new Intl.DateTimeFormat(o?[o.code,"en-US"]:void 0,{timeZone:u,timeZoneName:r})}s.exports=e.default})(hn,hn.exports)),hn.exports}var pn={exports:{}},mn={exports:{}},yr;function Xu(){return yr||(yr=1,(function(s,e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=t;function t(o,l){var c=u(l);return c.formatToParts?a(c,o):i(c,o)}var n={year:0,month:1,day:2,hour:3,minute:4,second:5};function a(o,l){try{for(var c=o.formatToParts(l),d=[],f=0;f=0&&(d[h]=parseInt(c[f].value,10))}return d}catch(v){if(v instanceof RangeError)return[NaN];throw v}}function i(o,l){var c=o.format(l).replace(/\u200E/g,""),d=/(\d+)\/(\d+)\/(\d+),? (\d+):(\d+):(\d+)/.exec(c);return[d[3],d[1],d[2],d[4],d[5],d[6]]}var r={};function u(o){if(!r[o]){var l=new Intl.DateTimeFormat("en-US",{hour12:!1,timeZone:"America/New_York",year:"numeric",month:"numeric",day:"2-digit",hour:"2-digit",minute:"2-digit",second:"2-digit"}).format(new Date("2014-06-25T04:00:00.123Z")),c=l==="06/25/2014, 00:00:00"||l==="‎06‎/‎25‎/‎2014‎ ‎00‎:‎00‎:‎00";r[o]=c?new Intl.DateTimeFormat("en-US",{hour12:!1,timeZone:o,year:"numeric",month:"numeric",day:"2-digit",hour:"2-digit",minute:"2-digit",second:"2-digit"}):new Intl.DateTimeFormat("en-US",{hourCycle:"h23",timeZone:o,year:"numeric",month:"numeric",day:"2-digit",hour:"2-digit",minute:"2-digit",second:"2-digit"})}return r[o]}s.exports=e.default})(mn,mn.exports)),mn.exports}var gn={exports:{}},Tr;function Ri(){return Tr||(Tr=1,(function(s,e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=t;function t(n,a,i,r,u,o,l){var c=new Date(0);return c.setUTCFullYear(n,a,i),c.setUTCHours(r,u,o,l),c}s.exports=e.default})(gn,gn.exports)),gn.exports}var wr;function bt(){return wr||(wr=1,(function(s,e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=o;var t=a(Xu()),n=a(Ri());function a(w){return w&&w.__esModule?w:{default:w}}var i=36e5,r=6e4,u={timezoneZ:/^(Z)$/,timezoneHH:/^([+-]\d{2})$/,timezoneHHMM:/^([+-]\d{2}):?(\d{2})$/};function o(w,m,g){var T,y;if(!w||(T=u.timezoneZ.exec(w),T))return 0;var D;if(T=u.timezoneHH.exec(w),T)return D=parseInt(T[1],10),f(D)?-(D*i):NaN;if(T=u.timezoneHHMM.exec(w),T){D=parseInt(T[1],10);var _=parseInt(T[2],10);return f(D,_)?(y=Math.abs(D)*i+_*r,D>0?-y:y):NaN}if(v(w)){m=new Date(m||Date.now());var I=g?m:l(m),x=c(I,w),R=g?x:d(m,x,w);return-R}return NaN}function l(w){return(0,n.default)(w.getFullYear(),w.getMonth(),w.getDate(),w.getHours(),w.getMinutes(),w.getSeconds(),w.getMilliseconds())}function c(w,m){var g=(0,t.default)(w,m),T=(0,n.default)(g[0],g[1]-1,g[2],g[3]%24,g[4],g[5],0).getTime(),y=w.getTime(),D=y%1e3;return y-=D>=0?D:1e3+D,T-y}function d(w,m,g){var T=w.getTime(),y=T-m,D=c(new Date(y),g);if(m===D)return m;y-=D-m;var _=c(new Date(y),g);return D===_?D:Math.max(D,_)}function f(w,m){return-23<=w&&w<=23&&(m==null||0<=m&&m<=59)}var h={};function v(w){if(h[w])return!0;try{return new Intl.DateTimeFormat(void 0,{timeZone:w}),h[w]=!0,!0}catch{return!1}}s.exports=e.default})(pn,pn.exports)),pn.exports}var Dr;function Zu(){return Dr||(Dr=1,(function(s,e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var t=a(zu()),n=a(bt());function a(h){return h&&h.__esModule?h:{default:h}}var i=60*1e3,r={X:function(h,v,w,m){var g=u(m.timeZone,m._originalDate||h);if(g===0)return"Z";switch(v){case"X":return c(g);case"XXXX":case"XX":return l(g);case"XXXXX":case"XXX":default:return l(g,":")}},x:function(h,v,w,m){var g=u(m.timeZone,m._originalDate||h);switch(v){case"x":return c(g);case"xxxx":case"xx":return l(g);case"xxxxx":case"xxx":default:return l(g,":")}},O:function(h,v,w,m){var g=u(m.timeZone,m._originalDate||h);switch(v){case"O":case"OO":case"OOO":return"GMT"+d(g,":");case"OOOO":default:return"GMT"+l(g,":")}},z:function(h,v,w,m){var g=m._originalDate||h;switch(v){case"z":case"zz":case"zzz":return(0,t.default)("short",g,m);case"zzzz":default:return(0,t.default)("long",g,m)}}};function u(h,v){var w=h?(0,n.default)(h,v,!0)/i:v.getTimezoneOffset();if(Number.isNaN(w))throw new RangeError("Invalid time zone specified: "+h);return w}function o(h,v){for(var w=h<0?"-":"",m=Math.abs(h).toString();m.length0?"-":"+",g=Math.abs(h),T=o(Math.floor(g/60),2),y=o(Math.floor(g%60),2);return m+T+w+y}function c(h,v){if(h%60===0){var w=h>0?"-":"+";return w+o(Math.abs(h)/60,2)}return l(h,v)}function d(h,v){var w=h>0?"-":"+",m=Math.abs(h),g=Math.floor(m/60),T=m%60;if(T===0)return w+String(g);var y=v;return w+String(g)+y+o(T,2)}var f=r;e.default=f,s.exports=e.default})(fn,fn.exports)),fn.exports}var vn={exports:{}},yn={exports:{}},br;function Pi(){return br||(br=1,(function(s,e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var t=/(Z|[+-]\d{2}(?::?\d{2})?| UTC| [a-zA-Z]+\/[a-zA-Z_]+(?:\/[a-zA-Z_]+)?)$/,n=t;e.default=n,s.exports=e.default})(yn,yn.exports)),yn.exports}var _r;function Ln(){return _r||(_r=1,(function(s,e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=d;var t=r(Qe()),n=r(Ii()),a=r(bt()),i=r(Pi());function r(R){return R&&R.__esModule?R:{default:R}}var u=36e5,o=6e4,l=2,c={dateTimePattern:/^([0-9W+-]+)(T| )(.*)/,datePattern:/^([0-9W+-]+)(.*)/,YY:/^(\d{2})$/,YYY:[/^([+-]\d{2})$/,/^([+-]\d{3})$/,/^([+-]\d{4})$/],YYYY:/^(\d{4})/,YYYYY:[/^([+-]\d{4})/,/^([+-]\d{5})/,/^([+-]\d{6})/],MM:/^-(\d{2})$/,DDD:/^-?(\d{3})$/,MMDD:/^-?(\d{2})-?(\d{2})$/,Www:/^-?W(\d{2})$/,WwwD:/^-?W(\d{2})-?(\d{1})$/,HH:/^(\d{2}([.,]\d*)?)$/,HHMM:/^(\d{2}):?(\d{2}([.,]\d*)?)$/,HHMMSS:/^(\d{2}):?(\d{2}):?(\d{2}([.,]\d*)?)$/,timeZone:i.default};function d(R,C){if(arguments.length<1)throw new TypeError("1 argument required, but only "+arguments.length+" present");if(R===null)return new Date(NaN);var E=C||{},O=E.additionalDigits==null?l:(0,t.default)(E.additionalDigits);if(O!==2&&O!==1&&O!==0)throw new RangeError("additionalDigits must be 0, 1 or 2");if(R instanceof Date||typeof R=="object"&&Object.prototype.toString.call(R)==="[object Date]")return new Date(R.getTime());if(typeof R=="number"||Object.prototype.toString.call(R)==="[object Number]")return new Date(R);if(!(typeof R=="string"||Object.prototype.toString.call(R)==="[object String]"))return new Date(NaN);var k=f(R),U=h(k.date,O),se=U.year,G=U.restDateString,Z=v(G,se);if(isNaN(Z))return new Date(NaN);if(Z){var ce=Z.getTime(),me=0,he;if(k.time&&(me=w(k.time),isNaN(me)))return new Date(NaN);if(k.timeZone||E.timeZone){if(he=(0,a.default)(k.timeZone||E.timeZone,new Date(ce+me)),isNaN(he))return new Date(NaN)}else he=(0,n.default)(new Date(ce+me)),he=(0,n.default)(new Date(ce+me+he));return new Date(ce+me+he)}else return new Date(NaN)}function f(R){var C={},E=c.dateTimePattern.exec(R),O;if(E?(C.date=E[1],O=E[3]):(E=c.datePattern.exec(R),E?(C.date=E[1],O=E[2]):(C.date=null,O=R)),O){var k=c.timeZone.exec(O);k?(C.time=O.replace(k[1],""),C.timeZone=k[1].trim()):C.time=O}return C}function h(R,C){var E=c.YYY[C],O=c.YYYYY[C],k;if(k=c.YYYY.exec(R)||O.exec(R),k){var U=k[1];return{year:parseInt(U,10),restDateString:R.slice(U.length)}}if(k=c.YY.exec(R)||E.exec(R),k){var se=k[1];return{year:parseInt(se,10)*100,restDateString:R.slice(se.length)}}return{year:null}}function v(R,C){if(C===null)return null;var E,O,k,U;if(R.length===0)return O=new Date(0),O.setUTCFullYear(C),O;if(E=c.MM.exec(R),E)return O=new Date(0),k=parseInt(E[1],10)-1,D(C,k)?(O.setUTCFullYear(C,k),O):new Date(NaN);if(E=c.DDD.exec(R),E){O=new Date(0);var se=parseInt(E[1],10);return _(C,se)?(O.setUTCFullYear(C,0,se),O):new Date(NaN)}if(E=c.MMDD.exec(R),E){O=new Date(0),k=parseInt(E[1],10)-1;var G=parseInt(E[2],10);return D(C,k,G)?(O.setUTCFullYear(C,k,G),O):new Date(NaN)}if(E=c.Www.exec(R),E)return U=parseInt(E[1],10)-1,I(C,U)?m(C,U):new Date(NaN);if(E=c.WwwD.exec(R),E){U=parseInt(E[1],10)-1;var Z=parseInt(E[2],10)-1;return I(C,U,Z)?m(C,U,Z):new Date(NaN)}return null}function w(R){var C,E,O;if(C=c.HH.exec(R),C)return E=parseFloat(C[1].replace(",",".")),x(E)?E%24*u:NaN;if(C=c.HHMM.exec(R),C)return E=parseInt(C[1],10),O=parseFloat(C[2].replace(",",".")),x(E,O)?E%24*u+O*o:NaN;if(C=c.HHMMSS.exec(R),C){E=parseInt(C[1],10),O=parseInt(C[2],10);var k=parseFloat(C[3].replace(",","."));return x(E,O,k)?E%24*u+O*o+k*1e3:NaN}return null}function m(R,C,E){C=C||0,E=E||0;var O=new Date(0);O.setUTCFullYear(R,0,4);var k=O.getUTCDay()||7,U=C*7+E+1-k;return O.setUTCDate(O.getUTCDate()+U),O}var g=[31,28,31,30,31,30,31,31,30,31,30,31],T=[31,29,31,30,31,30,31,31,30,31,30,31];function y(R){return R%400===0||R%4===0&&R%100!==0}function D(R,C,E){if(C<0||C>11)return!1;if(E!=null){if(E<1)return!1;var O=y(R);if(O&&E>T[C]||!O&&E>g[C])return!1}return!0}function _(R,C){if(C<1)return!1;var E=y(R);return!(E&&C>366||!E&&C>365)}function I(R,C,E){return!(C<0||C>52||E!=null&&(E<0||E>6))}function x(R,C,E){return!(R!=null&&(R<0||R>=25)||C!=null&&(C<0||C>=60)||E!=null&&(E<0||E>=60))}s.exports=e.default})(vn,vn.exports)),vn.exports}var Cr;function Ei(){return Cr||(Cr=1,(function(s,e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=u;var t=i(Gu()),n=i(Zu()),a=i(Ln());function i(o){return o&&o.__esModule?o:{default:o}}var r=/([xXOz]+)|''|'(''|[^'])+('|$)/g;function u(o,l,c){var d=String(l),f=c||{},h=d.match(r);if(h){var v=(0,a.default)(o,f);d=h.reduce(function(w,m){if(m[0]==="'")return w;var g=w.indexOf(m),T=w[g-1]==="'",y=w.replace(m,"'"+n.default[m[0]](v,m,null,f)+"'");return T?y.substring(0,g-1)+y.substring(g+1):y},d)}return(0,t.default)(o,d,f)}s.exports=e.default})(xt,xt.exports)),xt.exports}var Tn={exports:{}},wn={exports:{}},Dn={exports:{}},Ir;function Qu(){return Ir||(Ir=1,(function(s,e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=t;function t(n,a){if(n==null)throw new TypeError("assign requires that input parameter not be null or undefined");for(var i in a)Object.prototype.hasOwnProperty.call(a,i)&&(n[i]=a[i]);return n}s.exports=e.default})(Dn,Dn.exports)),Dn.exports}var Rr;function Oi(){return Rr||(Rr=1,(function(s,e){var t=re().default;Object.defineProperty(e,"__esModule",{value:!0}),e.default=a;var n=t(Qu());function a(i){return(0,n.default)({},i)}s.exports=e.default})(wn,wn.exports)),wn.exports}var bn={exports:{}},Pr;function Si(){return Pr||(Pr=1,(function(s,e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=i;var t=a(bt()),n=a(Ln());function a(r){return r&&r.__esModule?r:{default:r}}function i(r,u,o){var l=(0,n.default)(r,o),c=(0,t.default)(u,l,!0),d=new Date(l.getTime()-c),f=new Date(0);return f.setFullYear(d.getUTCFullYear(),d.getUTCMonth(),d.getUTCDate()),f.setHours(d.getUTCHours(),d.getUTCMinutes(),d.getUTCSeconds(),d.getUTCMilliseconds()),f}s.exports=e.default})(bn,bn.exports)),bn.exports}var Er;function Ku(){return Er||(Er=1,(function(s,e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=r;var t=i(Oi()),n=i(Ei()),a=i(Si());function i(u){return u&&u.__esModule?u:{default:u}}function r(u,o,l,c){var d=(0,t.default)(c);return d.timeZone=o,(0,n.default)((0,a.default)(u,o),l,d)}s.exports=e.default})(Tn,Tn.exports)),Tn.exports}var _n={exports:{}},Or;function Ju(){return Or||(Or=1,(function(s,e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=a;var t=n(bt());function n(i){return i&&i.__esModule?i:{default:i}}function a(i,r){return-(0,t.default)(i,r)}s.exports=e.default})(_n,_n.exports)),_n.exports}var Cn={exports:{}},Sr;function el(){return Sr||(Sr=1,(function(s,e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=o;var t=u(Oi()),n=u(Ln()),a=u(Pi()),i=u(bt()),r=u(Ri());function u(l){return l&&l.__esModule?l:{default:l}}function o(l,c,d){if(typeof l=="string"&&!l.match(a.default)){var f=(0,t.default)(d);return f.timeZone=c,(0,n.default)(l,f)}var h=(0,n.default)(l,d),v=(0,r.default)(h.getFullYear(),h.getMonth(),h.getDate(),h.getHours(),h.getMinutes(),h.getSeconds(),h.getMilliseconds()).getTime(),w=(0,i.default)(c,new Date(v));return new Date(v+w)}s.exports=e.default})(Cn,Cn.exports)),Cn.exports}var Gn,xr;function tl(){return xr||(xr=1,Gn={format:Ei(),formatInTimeZone:Ku(),getTimezoneOffset:Ju(),toDate:Ln(),utcToZonedTime:Si(),zonedTimeToUtc:el()}),Gn}var xi=tl();const nl=[[-11,["Pacific/Midway"]],[-10,["Pacific/Honolulu"]],[-9.5,["Pacific/Marquesas"]],[-9,["Pacific/Gambier"]],[-8,["Pacific/Pitcairn"]],[-7,["America/Phoenix"]],[-6,["America/Tegucigalpa"]],[-5,["America/Bogota"]],[-4,["America/Puerto_Rico"]],[-3.5,["America/St_Johns"]],[-3,["America/Montevideo"]],[-2,["Atlantic/South_Georgia"]],[-1,["Atlantic/Cape_Verde"]],[0,["Africa/Accra"]],[1,["Africa/Bangui"]],[2,["Africa/Cairo"]],[3,["Asia/Bahrain","Indian/Antananarivo"]],[3.5,["Asia/Tehran"]],[4,["Asia/Dubai","Asia/Muscat"]],[4.5,["Asia/Kabul"]],[5,["Asia/Samarkand","Asia/Karachi"]],[5.5,["Asia/Kolkata"]],[5.75,["Asia/Kathmandu"]],[6,["Asia/Dhaka"]],[6.5,["Asia/Rangoon","Asia/Rangoon"]],[7,["Asia/Jakarta","Asia/Phnom_Penh","Asia/Bangkok"]],[8,["Asia/Shanghai","Asia/Singapore"]],[8.75,["Australia/Eucla"]],[9,["Asia/Tokyo","Asia/Seoul","Asia/Pyongyang"]],[9.5,["Australia/Darwin"]],[10,["Pacific/Guam"]],[10.5,["Australia/Adelaide"]],[11,["Pacific/Guadalcanal"]],[12,["Pacific/Funafuti"]],[13,["Pacific/Enderbury"]],[13.75,["Pacific/Chatham"]],[14,["Pacific/Kiritimati"]]],Mr={0:"Etc/GMT",1:"Etc/GMT-1",2:"Etc/GMT-2",3:"Etc/GMT-3",4:"Etc/GMT-4",5:"Etc/GMT-5",6:"Etc/GMT-6",7:"Etc/GMT-7",8:"Etc/GMT-8",9:"Etc/GMT-9",10:"Etc/GMT-10",11:"Etc/GMT-11",12:"Etc/GMT-12",13:"Etc/GMT-13",14:"Etc/GMT-14","-1":"Etc/GMT+1","-2":"Etc/GMT+2","-3":"Etc/GMT+3","-4":"Etc/GMT+4","-5":"Etc/GMT+5","-6":"Etc/GMT+6","-7":"Etc/GMT+7","-8":"Etc/GMT+8","-9":"Etc/GMT+9","-10":"Etc/GMT+10","-11":"Etc/GMT+11","-12":"Etc/GMT+12"},al=/([\-\+]{1})(\d{2})\:(\d{2})/,Mi=s=>{let e=null;if(typeof s=="string"){if(e=s.match(al),!e)return s;const t=parseInt(e[1]+1,10),n=parseInt(e[2],10),a=parseInt(e[3],10);s=t*(n+a/60)}if(typeof s=="number"){if(s in Mr){const n=Mr[s];if(rl(n))return n}const t=nl.find(n=>n[0]===s);return t&&t[1][0]}},kr={};function rl(s){if(kr[s])return!0;try{return new Intl.DateTimeFormat(void 0,{timeZone:s}),kr[s]=!0,!0}catch{return!1}}const il=(s,e,t)=>xi.utcToZonedTime(s,Mi(e),t),aa=(s,e,t)=>xi.zonedTimeToUtc(s,Mi(e),t);function ne(s,e,t,n){let a=null;if(s){e&&(t=t||new Date,a=$o(s,e,t,{locale:n})),Ce(a)||(a=be(s)),Ce(a)||(a=new Date(Date.parse(s)));const i=Ce(a)&&String(a.getFullYear()).length>4;(!Ce(a)||i)&&(a=null)}return a}function Pn(s){const{format:e,type:t}=s,n=/([yMd]{0,4}[^a-z\s]*[yMd]{0,4}[^a-z\s]*[yMd]{0,4})/i,a=/([yMd]{0,4}[^a-z\s]*[yMd]{0,4}[^a-z\s]*[yMd]{0,4}) (H{0,2}[^a-z\s]*m{0,2}[^a-z\s]*s{0,2})/i,i=$e(t);let r;switch(t){case"dateTime":case"dateTimeRange":const u=a.exec(e);r=u&&u[1]&&u[2]?`${u[1]} ${u[2]}`:i;break;case"date":case"month":case"monthRange":case"dateRange":default:const o=n.exec(e);r=o&&o[1]||i;break}return r}function ra(s){const{inputValue:t="",rangeSeparator:n,type:a}=s;let i,r,u,o;const l={monthLeft:{dateInput:"",timeInput:""},monthRight:{dateInput:"",timeInput:""}};switch(a){case"date":case"month":case"monthRange":l.monthLeft.dateInput=t;break;case"dateRange":[i="",u=""]=t.split(n),l.monthLeft.dateInput=i,l.monthRight.dateInput=u;break;case"dateTime":[i="",r=""]=t.split(" "),l.monthLeft.dateInput=i,l.monthLeft.timeInput=r;break;case"dateTimeRange":const[c="",d=""]=t.split(n);[i="",r=""]=c.split(" "),[u="",o=""]=d.split(" "),l.monthLeft.dateInput=i,l.monthLeft.timeInput=r,l.monthRight.dateInput=u,l.monthRight.timeInput=o;break}return l}function En(s){return["string","number"].includes(typeof s)&&s!==""}class sl extends He{constructor(e){super(Object.assign({},e)),this.clearRangeInputFocus=()=>{const{type:t}=this._adapter.getProps(),{rangeInputFocus:n}=this._adapter.getStates();t==="dateTimeRange"&&n&&this._adapter.setRangeInputFocus(!1)},this._isRangeType=()=>{const t=this._adapter.getProp("type");return/range/i.test(t)},this._isRangeValueComplete=t=>{let n=!1;return Array.isArray(t)&&(n=!t.some(a=>Be(a))),n}}init(){const e=this.getProp("timeZone");this._isControlledComponent()?this.initFromProps({timeZone:e,value:this.getProp("value")}):this._isInProps("defaultValue")&&this.initFromProps({timeZone:e,value:this.getProp("defaultValue")}),this.initPanelOpenStatus(this.getProp("defaultOpen"))}initFromProps(e){let{value:t,timeZone:n,prevTimeZone:a}=e;const i=(Array.isArray(t)?[...t]:(t||t===0)&&[t])||[],r=this.parseWithTimezone(i,n,a);this._adapter.updatePrevTimezone(a),this.clearInputValue(),this._adapter.updateValue(r),this.resetCachedSelectedValue(r),this.initRangeInputFocus(r),this._adapter.needConfirm()&&this._adapter.updateCachedSelectedValue(r)}initRangeInputFocus(e){const{triggerRender:t}=this.getProps();this._isRangeType()&&st(t)&&e.length===0&&this._adapter.setRangeInputFocus("rangeStart")}parseWithTimezone(e,t,n){const a=[];if(Array.isArray(e)&&e.length)for(const i of e){let r=(i||i===0)&&this._parseValue(i);r?(En(n)&&(r=aa(r,n)),a.push(En(t)?il(r,t):r)):qi(!0,`[Semi DatePicker] value cannot be parsed, value: ${String(i)}`)}return a}_isMultiple(){return!!this.getProp("multiple")}_parseValue(e){const t=this._adapter.getProp("dateFnsLocale");let n;if(!e&&e!==0)return new Date;if(_e(e))n=e;else if(Wi(e))n=ne(e,this.getProp("format"),void 0,t);else if(na(e))n=new Date(e);else throw new TypeError("defaultValue should be valid Date object/timestamp or string");return n}destroy(){this._adapter.togglePanel(!1),this._adapter.unregisterClickOutSide()}initPanelOpenStatus(e){(this.getProp("open")||e)&&!this.getProp("disabled")?(this._adapter.togglePanel(!0),this._adapter.registerClickOutSide()):(this._adapter.togglePanel(!1),this._adapter.unregisterClickOutSide())}openPanel(){this.getProp("disabled")||(this._isControlledComponent("open")||this.open(),this._adapter.notifyOpenChange(!0))}clearInsetInputValue(){const{insetInput:e}=this._adapter.getProps();e&&this._adapter.updateInsetInputValue(null)}resetCachedSelectedValue(e){const{value:t,cachedSelectedValue:n}=this._adapter.getStates(),a=Array.isArray(e)?e:t;De(a,n)||this._adapter.updateCachedSelectedValue(a)}closePanel(){this._isControlledComponent("open")?this.resetInnerSelectedStates():this.close(),this._adapter.notifyOpenChange(!1)}open(){this._adapter.togglePanel(!0),this._adapter.registerClickOutSide()}close(){this._adapter.togglePanel(!1),this.resetInnerSelectedStates(),this._adapter.unregisterClickOutSide()}focus(e){if(this._isRangeType()){const t=e??"rangeStart";this._adapter.setRangeInputFocus(t)}else this._adapter.setInputFocus()}blur(){this._isRangeType()?this._adapter.setRangeInputBlur():this._adapter.setInputBlur()}resetInnerSelectedStates(){setTimeout(()=>{const{value:e,cachedSelectedValue:t}=this._adapter.getStates();De(e,t)||this.resetCachedSelectedValue(e)},0),this.resetFocus(),this.clearInputValue()}resetFocus(e){this._adapter.setRangeInputFocus(!1),this._adapter.notifyBlur(e)}isCachedSelectedValueValid(e){const t=e||this._adapter.getState("cachedSelectedValue"),{type:n}=this._adapter.getProps();let a=!0;switch(!0){case n==="dateRange":case n==="dateTimeRange":this._isRangeValueComplete(t)||(a=!1);break;default:const i=t==null?void 0:t.filter(r=>r);Array.isArray(i)&&i.length||(a=!1);break}return a}clearInputValue(){this._adapter.updateInputValue(null),this._adapter.updateInsetInputValue(null)}handleInputChange(e,t){const n=this._isMultiple()?this.parseMultipleInput(e):this.parseInput(e),{value:a}=this.getStates();if(this._updateCachedSelectedValueFromInput(e),n&&n.length||e===""){if(oe(t,Qr.CLEARBTN_CLICKED_EVENT_FLAG)&&this._isControlledComponent("value")){this._notifyChange(n);return}this._updateValueAndInput(n,e==="",e);const i=this._getChangedDates(n);this._someDateDisabled(i,n)||De(n,a)||this._notifyChange(n)}else this._adapter.updateInputValue(e)}handleInsetInputChange(e){const{insetInputStr:t,format:n,insetInputValue:a}=e,i=this._isMultiple(),r=i?this.parseMultipleInput(t,n):this.parseInput(t,n),{value:u}=this.getStates();if(this._updateCachedSelectedValueFromInput(t),r&&r.length){const o=this._getChangedDates(r);if(!this._someDateDisabled(o,r)){De(r,u)||(!this._isControlledComponent()&&!this._adapter.needConfirm()&&this._adapter.updateValue(r),this._notifyChange(r));const l=i?this.formatMultipleDates(r):this.formatDates(r);this._adapter.updateInputValue(l)}}this._adapter.updateInsetInputValue(a)}_updateCachedSelectedValueFromInput(e){const t=this.getLooseDateFromInput(e),n=this._getChangedDates(t);this._someDateDisabled(n,t)||this.resetCachedSelectedValue(t)}handleInputBlur(){}handleRangeEndTabPress(e){this._adapter.setRangeInputFocus(!1)}handleInputFocus(e,t){const n=this._adapter.getState("rangeInputFocus");t&&this._adapter.setRangeInputFocus(t),(!t||!["rangeStart","rangeEnd"].includes(n))&&this._adapter.notifyFocus(e,t)}handleSetRangeFocus(e){this._adapter.setRangeInputFocus(e)}handleInputClear(e){this._adapter.notifyClear(e)}handleRangeInputClear(e){const t=[];this._isControlledComponent("value")||(this._updateValueAndInput(t,!0,""),this._adapter.updateInsetInputValue(null),this.resetCachedSelectedValue(t)),this._notifyChange(t),this._adapter.setRangeInputFocus(!1),this._adapter.notifyClear(e)}handleRangeInputBlur(e,t){}handleInputComplete(){let e=arguments.length>0&&arguments[0]!==void 0?arguments[0]:"",t=e?this._isMultiple()?this.parseMultipleInput(e,",",!0):this.parseInput(e):[];if(t=t&&t.length?t:this.getState("value"),!t||!t.length){const i=new Date;this._isRangeType()?t=[i,i]:t=[i]}this._updateValueAndInput(t);const{value:n}=this.getStates(),a=this._getChangedDates(t);!this._someDateDisabled(a,t)&&!De(t,n)&&this._notifyChange(t)}parseInput(){let e=arguments.length>0&&arguments[0]!==void 0?arguments[0]:"",t=arguments.length>1?arguments[1]:void 0,n=[];const{dateFnsLocale:a,rangeSeparator:i}=this.getProps();if(e&&e.length){const r=this.getProp("type"),u=t||this.getProp("format")||$e(r);let o,l;const c=new Date;switch(r){case"date":case"dateTime":case"month":o=e?ne(e,u,c,a):"",l=o&&Ce(o)&&this.localeFormat(o,u),o&&l===e&&(n=[o]);break;case"dateRange":case"dateTimeRange":case"monthRange":const d=i,f=e.split(d);o=f&&f.reduce((h,v)=>{const w=v&&ne(v,u,c,a);return w&&h.push(w),h},[]),l=o&&o.map(h=>h&&Ce(h)&&this.localeFormat(h,u)).join(d),o&&l===e&&(o.sort((h,v)=>h.getTime()-v.getTime()),n=o);break}}return n}getLooseDateFromInput(e){return this._isMultiple()?this.parseMultipleInputLoose(e):this.parseInputLoose(e)}parseInputLoose(){let e=arguments.length>0&&arguments[0]!==void 0?arguments[0]:"",t=[];const{dateFnsLocale:n,rangeSeparator:a,type:i,format:r}=this.getProps();if(e&&e.length){const u=r||$e(i);let o,l;const c=new Date;switch(i){case"date":case"dateTime":case"month":const d=ne(e,u,c,n);_e(d)?(l=this.localeFormat(d,u),l===e&&(o=d)):o=null,t=[o];break;case"dateRange":case"dateTimeRange":const f=a,h=e.split(f);o=h&&h.reduce((v,w)=>{let m=null;const g=ne(w,u,c,n);return _e(g)&&(l=this.localeFormat(g,u),l===w&&(m=g)),v.push(m),v},[]),Array.isArray(o)&&o.every(v=>Ce(v))&&o.sort((v,w)=>v.getTime()-w.getTime()),t=o;break}}return t}parseMultipleInputLoose(){let e=arguments.length>0&&arguments[0]!==void 0?arguments[0]:"",t=arguments.length>1&&arguments[1]!==void 0?arguments[1]:P.DEFAULT_SEPARATOR_MULTIPLE,n=arguments.length>2&&arguments[2]!==void 0?arguments[2]:!1;const a=this.getProp("max"),i=e.split(t),r=[];for(const u of i){let o=u&&this.parseInputLoose(u);if(o=Array.isArray(o)?o:o&&[o],o&&o.length)n?!r.filter(l=>!!o.find(c=>Ea(l,c)))&&r.push(...o):r.push(...o);else return[];if(a&&a>0&&r.length>a)return[]}return r}parseMultipleInput(){let e=arguments.length>0&&arguments[0]!==void 0?arguments[0]:"",t=arguments.length>1&&arguments[1]!==void 0?arguments[1]:P.DEFAULT_SEPARATOR_MULTIPLE,n=arguments.length>2&&arguments[2]!==void 0?arguments[2]:!1;const a=this.getProp("max"),i=e.split(t),r=[];for(const u of i){let o=u&&this.parseInput(u);if(o=Array.isArray(o)?o:o&&[o],o&&o.length)n?!r.filter(l=>!!o.find(c=>Ea(l,c)))&&r.push(...o):r.push(...o);else return[];if(a&&a>0&&r.length>a)return[]}return r}formatDates(){let e=arguments.length>0&&arguments[0]!==void 0?arguments[0]:[],t=arguments.length>1?arguments[1]:void 0,n="";const a=this.getProp("rangeSeparator");if(Array.isArray(e)&&e.length){const i=this.getProp("type"),r=t||this.getProp("format")||$e(i);switch(i){case"date":case"dateTime":case"month":n=this.localeFormat(e[0],r);break;case"dateRange":case"dateTimeRange":case"monthRange":const u=!Be(e[0]),o=!Be(e[1]);u&&o?n=`${this.localeFormat(e[0],r)}${a}${this.localeFormat(e[1],r)}`:u?n=`${this.localeFormat(e[0],r)}${a}`:o&&(n=`${a}${this.localeFormat(e[1],r)}`);break}}return n}formatMultipleDates(){let e=arguments.length>0&&arguments[0]!==void 0?arguments[0]:[],t=arguments.length>1&&arguments[1]!==void 0?arguments[1]:P.DEFAULT_SEPARATOR_MULTIPLE,n=arguments.length>2?arguments[2]:void 0;const a=[];if(Array.isArray(e)&&e.length)switch(this.getProp("type")){case"date":case"dateTime":case"month":e.forEach(r=>a.push(this.formatDates([r],n)));break;case"dateRange":case"dateTimeRange":case"monthRange":for(let r=0;r0&&arguments[0]!==void 0?arguments[0]:{};const{currentMonth:t,currentYear:n}=e,{type:a}=this.getProps();if(a==="month"){const i=new Date(n.left,t.left-1);this.handleSelectedChange([i])}else{const i=new Date(n.left,t.left-1),r=new Date(n.right,t.right-1);this.handleSelectedChange([i,r])}}handleConfirm(){const{cachedSelectedValue:e,value:t}=this._adapter.getStates(),n=this._isRangeValueComplete(e),a=n?e:t;if(this._adapter.needConfirm()&&!this._isControlledComponent()&&this._adapter.updateValue(a),this.closePanel(),n){const{notifyValue:i,notifyDate:r}=this.disposeCallbackArgs(e);this._adapter.notifyConfirm(r,i)}}handleCancel(){this.closePanel();const e=this.getState("value"),{notifyValue:t,notifyDate:n}=this.disposeCallbackArgs(e);this._adapter.notifyCancel(n,t)}handlePresetClick(e,t){const{type:n,timeZone:a}=this.getProps(),i=this.getState("prevTimezone"),r=typeof e.start=="function"?e.start():e.start,u=typeof e.end=="function"?e.end():e.end;let o;switch(n){case"month":case"dateTime":case"date":o=this.parseWithTimezone([r],a,i),this.handleSelectedChange(o);break;case"dateTimeRange":case"dateRange":o=this.parseWithTimezone([r,u],a,i),this.handleSelectedChange(o,{needCheckFocusRecord:!1});break}this._adapter.notifyPresetsClick(e,t)}disposeCallbackArgs(e){let t=Array.isArray(e)?e:e&&[e]||[];const n=this.getProp("timeZone");En(n)&&(t=t.map(o=>aa(o,n)));const a=this.getProp("type"),i=this.getProp("format")||$e(a);let r,u;switch(a){case"date":case"dateTime":case"month":this._isMultiple()?(r=t.map(o=>o&&this.localeFormat(o,i)),u=[...t]):(r=t[0]&&this.localeFormat(t[0],i),[u]=t);break;case"dateRange":case"dateTimeRange":case"monthRange":r=t.map(o=>o&&this.localeFormat(o,i)),u=[...t];break}return{notifyValue:r,notifyDate:u}}_notifyChange(e){if(this._isRangeType()&&!this._isRangeValueComplete(e))return;const{onChangeWithDateFirst:t}=this.getProps(),{notifyValue:n,notifyDate:a}=this.disposeCallbackArgs(e);t?this._adapter.notifyChange(a,n):this._adapter.notifyChange(n,a)}_getChangedDates(e){const t=this._adapter.getProp("type"),{cachedSelectedValue:n}=this._adapter.getStates(),a=[];switch(t){case"dateRange":case"dateTimeRange":const[i,r]=n,[u,o]=e;kn(u,i)||a.push(u),kn(o,r)||a.push(o);break;default:const l=new Set;n.forEach(c=>l.add(Jn(c)&&c.valueOf()));for(const c of e)l.has(Jn(c)&&c.valueOf())||a.push(c)}return a}_someDateDisabled(e,t){const{rangeInputFocus:n}=this.getStates(),a={rangeStart:"",rangeEnd:"",rangeInputFocus:n};if(this._isRangeType()&&Array.isArray(t)){if(Ce(t[0])){const r=X(t[0],"yyyy-MM-dd");a.rangeStart=r}if(Ce(t[1])){const r=X(t[1],"yyyy-MM-dd");a.rangeEnd=r}}let i=!1;for(const r of e)if(!Be(r)){const u=this._isRangeType()&&Ce(r)?Kn(r):r;if(this.disabledDisposeDate(u,a)){i=!0;break}}return i}localeFormat(e,t){const n=this._adapter.getProp("dateFnsLocale");return X(e,t,{locale:n})}disposeDateFn(e,t){const{notifyDate:n}=this.disposeCallbackArgs(t),a=Array.isArray(t),i=Array.isArray(n);let r;a===i?r=n:r=a?[n]:n[0];for(var u=arguments.length,o=new Array(u>2?u-2:0),l=2;l1?n-1:0),i=1;i1?n-1:0),i=1;i{this.handleInputFocus(e,"rangeStart")},0):st(n)&&this._adapter.setRangeInputFocus("rangeStart"),this.openPanel()):this.openPanel())}handlePanelVisibleChange(e){e?(this._adapter.setInsetInputFocus(),setTimeout(()=>{this._adapter.setTriggerDisabled(!0)},0)):this._adapter.setTriggerDisabled(!1)}}function nt(s,e){let{groupInnerSeparator:t=P.DEFAULT_SEPARATOR_RANGE,groupSize:n=1,groupSeparator:a=P.DEFAULT_SEPARATOR_MULTIPLE}=arguments.length>2&&arguments[2]!==void 0?arguments[2]:{},i=arguments.length>3?arguments[3]:void 0,r="";if((n<=0||typeof n!="number")&&(n=1),Array.isArray(s)&&s.length){const u=[],{length:o}=s;for(let l=0;ll.map(c=>c?X(c,e,{locale:i}):"").join(t)).join(a)}return r}function ki(s){const{defaultPickerValue:e,format:t,dateFnsLocale:n}=s;let a=Array.isArray(e)?e[0]:e,i=Array.isArray(e)?e[1]:void 0;switch(!0){case _e(a):break;case na(a):a=new Date(a);break;case typeof a=="string":a=ne(a,t,void 0,n);break;default:a=new Date;break}switch(!0){case _e(i):break;case na(i):i=new Date(i);break;case typeof i=="string":i=ne(i,t,void 0,n);break;default:i=Le(a,1);break}return{nowDate:a,nextDate:i}}const Nr="Enter",ol="Tab";class ul extends He{constructor(e){super(Object.assign({},e))}init(){}destroy(){}handleClick(e){this._adapter.notifyClick(e)}handleChange(e,t){this._adapter.notifyChange(e,t)}handleInputComplete(e){e.key===Nr&&this._adapter.notifyEnter(e.target.value)}handleInputClear(e){this._adapter.notifyClear(e)}handleRangeInputClear(e){this.stopPropagation(e),this._adapter.notifyRangeInputClear(e)}handleRangeInputEnterPress(e,t){e.key===Nr&&this._adapter.notifyEnter(t)}handleRangeInputEndKeyPress(e){e.key===ol&&this._adapter.notifyTabPress(e)}handleRangeInputFocus(e,t){this._adapter.notifyRangeInputFocus(e,t)}formatShowText(e,t){const{type:n,dateFnsLocale:a,format:i,rangeSeparator:r}=this._adapter.getProps(),u=t||i||$e(n);let o="";switch(n){case"date":o=nt(e,u,void 0,a);break;case"dateRange":o=nt(e,u,{groupSize:2,groupInnerSeparator:r},a);break;case"dateTime":o=nt(e,u,void 0,a);break;case"dateTimeRange":o=nt(e,u,{groupSize:2,groupInnerSeparator:r},a);break;case"month":o=nt(e,u,void 0,a);break;case"monthRange":o=nt(e,u,{groupSize:2,groupInnerSeparator:r},a);break}return o}handleInsetInputChange(e){const{value:t,valuePath:n,insetInputValue:a}=e,{format:i,type:r,rangeSeparator:u}=this._adapter.getProps(),o=Pn({type:r,format:i}),l=ji(Sn(a),n,t),c=this.concatInsetInputValue({insetInputValue:l}),d=ra({inputValue:c,type:r,rangeSeparator:u}),f=this._autoFillTimeToInsetInputValue({insetInputValue:d,valuePath:n,format:o}),h=this.concatInsetInputValue({insetInputValue:f});this._adapter.notifyInsetInputChange({insetInputValue:f,format:o,insetInputStr:h})}_autoFillTimeToInsetInputValue(e){const{valuePath:t,insetInputValue:n,format:a}=e,{type:i,defaultPickerValue:r,dateFnsLocale:u}=this._adapter.getProps(),o=Sn(n),{nowDate:l,nextDate:c}=ki({defaultPickerValue:r,format:a,dateFnsLocale:u});if(i.includes("Time")){let d="";const f=oe(a.split(" "),"0",P.FORMAT_FULL_DATE),h=oe(a.split(" "),"1",P.FORMAT_TIME_PICKER);switch(t){case"monthLeft.dateInput":const v=o.monthLeft.dateInput;if(!o.monthLeft.timeInput&&v.length===f.length){const m=ne(o.monthLeft.dateInput,f);_e(m)&&(d=X(l,h),o.monthLeft.timeInput=d)}break;case"monthRight.dateInput":const w=o.monthRight.dateInput;if(!o.monthRight.timeInput&&w.length===f.length){const m=ne(w,f);_e(m)&&(d=X(c,h),o.monthRight.timeInput=d)}break}}return o}getInsetInputPlaceholder(){const{type:e,format:t,rangeSeparator:n}=this._adapter.getProps(),a=Pn({type:e,format:t});let i,r;switch(e){case"date":case"month":case"dateRange":i=a;break;case"dateTime":case"dateTimeRange":[i,r]=a.split(" ");break;case"monthRange":i=a+n+a;break}return{datePlaceholder:i,timePlaceholder:r}}getInsetInputValue(e){let{value:t,insetInputValue:n}=e;const{type:a,rangeSeparator:i,format:r}=this._adapter.getProps();let u="";if(Kr(n))u=this.concatInsetInputValue({insetInputValue:n});else{const l=Pn({format:r,type:a});u=this.formatShowText(t,l)}return ra({inputValue:u,type:a,rangeSeparator:i})}concatInsetDateAndTime(e){let{date:t,time:n}=e;return`${t} ${n}`}concatInsetDateRange(e){let{rangeStart:t,rangeEnd:n}=e;const{rangeSeparator:a}=this._adapter.getProps();return`${t}${a}${n}`}concatInsetInputValue(e){let{insetInputValue:t}=e;const{type:n}=this._adapter.getProps();let a="";switch(n){case"date":case"month":case"monthRange":a=t.monthLeft.dateInput;break;case"dateRange":a=this.concatInsetDateRange({rangeStart:t.monthLeft.dateInput,rangeEnd:t.monthRight.dateInput});break;case"dateTime":a=this.concatInsetDateAndTime({date:t.monthLeft.dateInput,time:t.monthLeft.timeInput});break;case"dateTimeRange":const i=this.concatInsetDateAndTime({date:t.monthLeft.dateInput,time:t.monthLeft.timeInput}),r=this.concatInsetDateAndTime({date:t.monthRight.dateInput,time:t.monthRight.timeInput});a=this.concatInsetDateRange({rangeStart:i,rangeEnd:r});break}return a}}function Ar(s){const{insetInputValue:e,valuePath:t,onFocus:n,onChange:a,placeholder:i,forwardRef:r}=s,u=oe(e,t);return b.createElement(gt,{value:u,onChange:(o,l)=>{a({value:o,event:l,insetInputValue:e,valuePath:t})},onFocus:n,placeholder:i,ref:r})}function Fr(s){const{insetInputValue:e,valuePath:t,type:n,onFocus:a,onChange:i,placeholder:r,disabled:u}=s;if(!n.includes("Time"))return null;const l=oe(e,t);return b.createElement(gt,{value:l,onChange:(c,d)=>{i({value:c,event:d,insetInputValue:e,valuePath:t})},onFocus:a,placeholder:r,disabled:u})}var ll=function(s,e){var t={};for(var n in s)Object.prototype.hasOwnProperty.call(s,n)&&e.indexOf(n)<0&&(t[n]=s[n]);if(s!=null&&typeof Object.getOwnPropertySymbols=="function")for(var a=0,n=Object.getOwnPropertySymbols(s);athis.foundation.handleChange(t,n),this.handleEnterPress=t=>this.foundation.handleInputComplete(t),this.handleInputClear=t=>this.foundation.handleInputClear(t),this.handleRangeInputChange=(t,n,a)=>{const i=this.getRangeInputValue(t,n);this.foundation.handleChange(i,a)},this.handleRangeInputClear=t=>{this.foundation.handleRangeInputClear(t)},this.handleRangeInputEnterPress=(t,n,a)=>{const i=this.getRangeInputValue(n,a);this.foundation.handleRangeInputEnterPress(t,i)},this.handleRangeInputEndKeyPress=t=>{this.foundation.handleRangeInputEndKeyPress(t)},this.handleRangeInputFocus=(t,n)=>{this.foundation.handleRangeInputFocus(t,n)},this.handleRangeStartFocus=t=>{this.handleRangeInputFocus(t,"rangeStart")},this.handleInsetInputChange=t=>{this.foundation.handleInsetInputChange(t)},this.getRangeInputValue=(t,n)=>{const{rangeSeparator:a}=this.props;return`${t}${a}${n}`},this.foundation=new ul(this.adapter)}get adapter(){var e=this;return Object.assign(Object.assign({},super.adapter),{updateIsFocusing:t=>this.setState({isFocusing:t}),notifyClick:function(){return e.props.onClick(...arguments)},notifyChange:function(){return e.props.onChange(...arguments)},notifyEnter:function(){return e.props.onEnterPress(...arguments)},notifyBlur:function(){return e.props.onBlur(...arguments)},notifyClear:function(){return e.props.onClear(...arguments)},notifyFocus:function(){return e.props.onFocus(...arguments)},notifyRangeInputClear:function(){return e.props.onRangeClear(...arguments)},notifyRangeInputFocus:function(){return e.props.onFocus(...arguments)},notifyTabPress:function(){return e.props.onRangeEndTabPress(...arguments)},notifyInsetInputChange:t=>this.props.onInsetInputChange(t)})}componentDidMount(){this.foundation.init()}componentWillUnmount(){this.foundation.destroy()}formatText(e){return e&&e.length?this.foundation.formatShowText(e):""}renderRangePrefix(){const{prefix:e,insetLabel:t,prefixCls:n,disabled:a,rangeInputFocus:i}=this.props,r=e||t;return r?b.createElement("div",{className:`${n}-range-input-prefix`,onClick:u=>!a&&!i&&this.handleRangeStartFocus(u),"x-semi-prop":"prefix,insetLabel"},r):null}renderRangeSeparator(e,t){const{disabled:n,rangeSeparator:a,rangeSeparatorNode:i}=this.props,r=Y({[`${N.PREFIX}-range-input-separator`]:!0,[`${N.PREFIX}-range-input-separator-active`]:(e||t)&&!n});return b.createElement("span",{onClick:u=>!n&&this.handleRangeStartFocus(u),className:r},i??a)}renderRangeClearBtn(e,t){const{showClear:n,prefixCls:a,disabled:i,clearIcon:r,showClearIgnoreDisabled:u}=this.props;return(e||t)&&n&&!(i&&!u)?b.createElement("div",{role:"button",tabIndex:0,"aria-label":"Clear range input value",className:`${a}-range-input-clearbtn`,onMouseDown:c=>this.handleRangeInputClear(c)},r||b.createElement(ls,{"aria-hidden":!0})):null}renderRangeSuffix(e){const{prefixCls:t,disabled:n,rangeInputFocus:a}=this.props;return e?b.createElement("div",{className:`${t}-range-input-suffix`,onClick:r=>!n&&!a&&this.handleRangeStartFocus(r)},e):null}renderRangeInput(e){const{placeholder:t,inputStyle:n,disabled:a,inputReadOnly:i,autofocus:r,size:u,text:o,suffix:l,inputCls:c,rangeInputStartRef:d,rangeInputEndRef:f,rangeInputFocus:h,prefixCls:v,rangeSeparator:w,borderless:m}=e,[g,T=""]=o.split(w)||[],y=u==="large"?"default":"small",D=Array.isArray(t)?t:[t,t],[_,I]=D,x=Y(`${v}-range-input-wrapper-start`,`${v}-range-input-wrapper`,{[`${v}-range-input-wrapper-active`]:h==="rangeStart"&&!a,[`${v}-range-input-wrapper-start-with-prefix`]:this.props.prefix||this.props.insetLabel,[`${v}-borderless`]:m}),R=Y(`${v}-range-input-wrapper-end`,`${v}-range-input-wrapper`,{[`${v}-range-input-wrapper-active`]:h==="rangeEnd"&&!a,[`${v}-borderless`]:m});return b.createElement(b.Fragment,null,this.renderRangePrefix(),b.createElement("div",{onClick:C=>!a&&this.handleRangeInputFocus(C,"rangeStart"),className:`${c} ${x}`},b.createElement(gt,{borderless:m,size:y,style:n,disabled:a,readonly:i,placeholder:_,value:g,onChange:(C,E)=>this.handleRangeInputChange(C,T,E),onEnterPress:C=>this.handleRangeInputEnterPress(C,g,T),onFocus:C=>this.handleRangeInputFocus(C,"rangeStart"),autoFocus:r,ref:d})),this.renderRangeSeparator(g,T),b.createElement("div",{className:`${c} ${R}`,onClick:C=>!a&&this.handleRangeInputFocus(C,"rangeEnd")},b.createElement(gt,{borderless:m,size:y,style:n,disabled:a,readonly:i,placeholder:I,value:T,onChange:(C,E)=>this.handleRangeInputChange(g,C,E),onEnterPress:C=>this.handleRangeInputEnterPress(C,g,T),onFocus:C=>this.handleRangeInputFocus(C,"rangeEnd"),onKeyDown:this.handleRangeInputEndKeyPress,ref:f})),this.renderRangeClearBtn(g,T),this.renderRangeSuffix(l))}isRenderMultipleInputs(){const{type:e}=this.props;return e.includes("Range")&&e!=="monthRange"}renderInputInset(){const{type:e,handleInsetDateFocus:t,handleInsetTimeFocus:n,value:a,insetInputValue:i,prefixCls:r,rangeInputStartRef:u,rangeInputEndRef:o,density:l,insetInput:c}=this.props,d=this.foundation.getInsetInputValue({value:a,insetInputValue:i}),{dateStart:f,dateEnd:h,timeStart:v,timeEnd:w}=oe(c,"placeholder",{}),{datePlaceholder:m,timePlaceholder:g}=this.foundation.getInsetInputPlaceholder(),T=`${r}-inset-input-wrapper`,y=`${r}-inset-input-separator`;return b.createElement("div",{className:T,"x-type":e},b.createElement(Ar,{forwardRef:u,insetInputValue:d,placeholder:f??m,valuePath:"monthLeft.dateInput",onChange:this.handleInsetInputChange,onFocus:D=>t(D,"rangeStart")}),b.createElement(Fr,{disabled:!d.monthLeft.dateInput,insetInputValue:d,placeholder:v??g,type:e,valuePath:"monthLeft.timeInput",onChange:this.handleInsetInputChange,onFocus:n}),this.isRenderMultipleInputs()&&b.createElement(b.Fragment,null,b.createElement("div",{className:y},l==="compact"?null:"-"),b.createElement(Ar,{forwardRef:o,insetInputValue:d,placeholder:h??m,valuePath:"monthRight.dateInput",onChange:this.handleInsetInputChange,onFocus:D=>t(D,"rangeEnd")}),b.createElement(Fr,{disabled:!d.monthRight.dateInput,insetInputValue:d,placeholder:w??g,type:e,valuePath:"monthRight.timeInput",onChange:this.handleInsetInputChange,onFocus:n})))}renderTriggerInput(){const e=this.props,{placeholder:t,type:n,value:a,inputValue:i,inputStyle:r,disabled:u,showClear:o,inputReadOnly:l,insetLabel:c,validateStatus:d,block:f,prefixCls:h,multiple:v,dateFnsLocale:w,onBlur:m,onClear:g,onFocus:T,prefix:y,autofocus:D,size:_,inputRef:I,rangeInputStartRef:x,rangeInputEndRef:R,onRangeClear:C,onRangeBlur:E,onRangeEndTabPress:O,rangeInputFocus:k,rangeSeparator:U,insetInput:se,insetInputValue:G,defaultPickerValue:Z,showClearIgnoreDisabled:ce}=e,me=ll(e,["placeholder","type","value","inputValue","inputStyle","disabled","showClear","inputReadOnly","insetLabel","validateStatus","block","prefixCls","multiple","dateFnsLocale","onBlur","onClear","onFocus","prefix","autofocus","size","inputRef","rangeInputStartRef","rangeInputEndRef","onRangeClear","onRangeBlur","onRangeEndTabPress","rangeInputFocus","rangeSeparator","insetInput","insetInputValue","defaultPickerValue","showClearIgnoreDisabled"]),he=b.createElement(Ti,{"aria-hidden":!0}),qe=b.createElement(ou,{"aria-hidden":!0}),Ie=n.includes("Time")?qe:he;let ge="";Be(i)?a&&(ge=this.formatText(a)):ge=i;const xe=Y({[`${h}-input-readonly`]:l,[`${h}-monthRange-input`]:n==="monthRange"}),Re=Object.assign(Object.assign({},this.props),{text:ge,suffix:Ie,inputCls:xe});return this.isRenderMultipleInputs()?this.renderRangeInput(Re):b.createElement(gt,Object.assign({},me,{ref:I,insetLabel:c,disabled:u,showClearIgnoreDisabled:ce,readonly:l,className:xe,style:r,hideSuffix:o,placeholder:n==="monthRange"&&Array.isArray(t)?t[0]+U+t[1]:t,onEnterPress:this.handleEnterPress,onChange:this.handleChange,onClear:this.handleInputClear,suffix:Ie,showClear:o,value:ge,validateStatus:d,prefix:y,autoFocus:D,size:_,onBlur:m,onFocus:T}))}render(){const{insetInput:e}=this.props;return e?this.renderInputInset():this.renderTriggerInput()}}Fn.propTypes={borderless:p.bool,onClick:p.func,onChange:p.func,onEnterPress:p.func,onBlur:p.func,onClear:p.func,onFocus:p.func,value:p.array,disabled:p.bool,type:p.oneOf(P.TYPE_SET),showClear:p.bool,format:p.string,inputStyle:p.object,inputReadOnly:p.bool,insetLabel:p.node,validateStatus:p.string,prefix:p.node,prefixCls:p.string,dateFnsLocale:p.object.isRequired,placeholder:p.oneOfType([p.string,p.array]),rangeInputFocus:p.oneOfType([p.string,p.bool]),rangeInputStartRef:p.object,rangeInputEndRef:p.object,rangeSeparator:p.string,rangeSeparatorNode:p.node,insetInput:p.oneOfType([p.bool,p.object]),insetInputValue:p.object,defaultPickerValue:p.oneOfType([p.string,p.number,p.object,p.array])};Fn.defaultProps={borderless:!1,showClear:!0,onClick:We,onChange:We,onEnterPress:We,onBlur:We,onClear:We,onFocus:We,type:"date",inputStyle:{},inputReadOnly:!1,prefixCls:N.PREFIX,rangeSeparator:P.DEFAULT_SEPARATOR_RANGE};function Ni(){let s=arguments.length>0&&arguments[0]!==void 0?arguments[0]:"",e=arguments.length>1&&arguments[1]!==void 0?arguments[1]:"",t=arguments.length>2&&arguments[2]!==void 0?arguments[2]:"",n="";const a=typeof e=="number"&&e<10?`0${e}`:e.toString(),i=typeof t=="number"&&t<10?`0${t}`:t.toString();return n=`${String(s)}-${a}-${i}`,n}function cl(s){let e=arguments.length>1&&arguments[1]!==void 0?arguments[1]:0;const t={dayNumber:"",dateNumberFull:"",fullDate:""},n=li(s),a=X(s,"yyyy"),i=X(s,"MM"),r=Hs(s),u=bs(s),o=Number(X(u,"e",{weekStartsOn:e})),l=[];let c=[];for(let d=1;d{const t=cl(s,e);return{monthText:X(s,"yyyy-MM"),weeks:t,month:s}},Yr={month:je,year:Ds},fl={prevMonth:au,nextMonth:Le,prevYear:ru,nextYear:xn};class hl extends He{constructor(e){super(Object.assign({},e)),this.newBiMonthPanelDate=[this.getState("monthLeft").pickerDate,this.getState("monthRight").pickerDate]}init(){const e=this.getProp("defaultValue");this.initDefaultPickerValue(),this.updateSelectedFromProps(e)}initDefaultPickerValue(){const e=ne(this.getProp("defaultPickerValue"));e&&_e(e)&&(this._updatePanelDetail(P.PANEL_TYPE_LEFT,{pickerDate:e}),this._updatePanelDetail(P.PANEL_TYPE_RIGHT,{pickerDate:Le(e,1)}))}updateSelectedFromProps(e){let t=arguments.length>1&&arguments[1]!==void 0?arguments[1]:!0;const n=this.getProp("type"),{selected:a,rangeStart:i,rangeEnd:r}=this.getStates();if(e&&(e!=null&&e.length))switch(n){case"date":this._initDatePickerFromValue(e,t);break;case"dateRange":this._initDateRangePickerFromValue(e);break;case"dateTime":this._initDateTimePickerFromValue(e);break;case"dateTimeRange":this._initDateTimeRangePickerFormValue(e);break}else(Array.isArray(e)&&!e.length||!e)&&(ns(a)&&a.size&&this._adapter.updateDaySelected(new Set),i&&this._adapter.setRangeStart(""),r&&this._adapter.setRangeEnd(""))}calcDisabledTime(e){const{disabledTime:t,type:n}=this.getProps();if(typeof t=="function"&&e&&["dateTime","dateTimeRange"].includes(n)){const{rangeStart:a,rangeEnd:i,monthLeft:r}=this.getStates(),u=[];n==="dateTimeRange"?(a&&u.push(a),a&&i&&u.push(i)):r&&r.showDate&&u.push(r.showDate);const o=u.map(c=>c instanceof Date?c:be(c)),l=n==="dateTimeRange"?o:o[0];return t(l,e)}}_initDatePickerFromValue(e){let t=arguments.length>1&&arguments[1]!==void 0?arguments[1]:!0;const{monthLeft:n}=this._adapter.getStates(),a=Object.assign({},n);this._adapter.updateMonthOnLeft(a);const i=new Set,r=this._isMultiple();r?e.forEach(u=>{u&&i.add(X(u,P.FORMAT_FULL_DATE))}):e[0]&&i.add(X(e[0],P.FORMAT_FULL_DATE)),t?r?!(e!=null&&e.some(o=>o&&je(o,n.pickerDate)===0))&&this.handleShowDateAndTime(P.PANEL_TYPE_LEFT,e[0]||a.pickerDate):this.handleShowDateAndTime(P.PANEL_TYPE_LEFT,e[0]||a.pickerDate):this.handleShowDateAndTime(P.PANEL_TYPE_LEFT,a.pickerDate),this._adapter.updateDaySelected(i)}_initDateRangePickerFromValue(e){let t=arguments.length>1&&arguments[1]!==void 0?arguments[1]:!1;const n=this.getState("monthLeft"),a=this.getState("monthRight"),i=this._autoAdjustMonth(Object.assign(Object.assign({},n),{pickerDate:e[0]||n.pickerDate}),Object.assign(Object.assign({},a),{pickerDate:e[1]||a.pickerDate}));if(Array.isArray(e)&&e.filter(c=>c).length>1)this.handleShowDateAndTime(P.PANEL_TYPE_LEFT,i.monthLeft.pickerDate),this.handleShowDateAndTime(P.PANEL_TYPE_RIGHT,i.monthRight.pickerDate);else{const c=e.find(d=>d);if(c){const d=Math.abs(je(c,n.pickerDate))>0,f=Math.abs(je(c,a.pickerDate))>0;d&&f&&(this.handleShowDateAndTime(P.PANEL_TYPE_LEFT,i.monthLeft.pickerDate),this.handleShowDateAndTime(P.PANEL_TYPE_RIGHT,i.monthRight.pickerDate))}}const u=t?P.FORMAT_DATE_TIME:P.FORMAT_FULL_DATE;let o=e[0]&&X(e[0],u),l=e[1]&&X(e[1],u);this._isNeedSwap(o,l)&&([o,l]=[l,o]),this._adapter.setRangeStart(o),this._adapter.setRangeEnd(l),this._adapter.setHoverDay(l)}_initDateTimePickerFromValue(e){this._initDatePickerFromValue(e)}_initDateTimeRangePickerFormValue(e){this._initDateRangePickerFromValue(e,!0)}destroy(){}handleSyncChangeMonths(e){const{panelType:t,target:n}=e,{type:a}=this._adapter.getProps(),{monthLeft:i,monthRight:r}=this._adapter.getStates();this.isRangeType(a)&&(t==="right"&&je(n,i.pickerDate)===0?this.handleYearOrMonthChange("prevMonth","left",1,!0):t==="left"&&je(r.pickerDate,n)===0&&this.handleYearOrMonthChange("nextMonth","right",1,!0))}getTargetChangeDate(e){const{panelType:t,switchType:n}=e,{monthRight:a,monthLeft:i}=this._adapter.getStates(),r=t==="left"?i.pickerDate:a.pickerDate;let u;switch(n){case"prevMonth":u=Le(r,-1);break;case"nextMonth":u=Le(r,1);break;case"prevYear":u=xn(r,-1);break;case"nextYear":u=xn(r,1);break}return u}toMonth(e,t){const{type:n}=this._adapter.getProps(),a=this._getDiff("month",t,e);this.handleYearOrMonthChange(a<0?"prevMonth":"nextMonth",e,Math.abs(a),!1),this.isRangeType(n)&&this.handleSyncChangeMonths({panelType:e,target:t})}toYear(e,t){const n=this._getDiff("year",t,e);this.handleYearOrMonthChange(n<0?"prevYear":"nextYear",e,Math.abs(n),!1)}toYearMonth(e,t){this.toYear(e,t),this.toMonth(e,t)}isRangeType(e){const{type:t}=this.getProps(),n=e||t;return typeof n=="string"&&/range/i.test(n)}handleSwitchMonthOrYear(e,t){const{type:n,syncSwitchMonth:a}=this.getProps(),i=this.isRangeType(n);if(i&&a)this.handleYearOrMonthChange(e,"left",1,!0),this.handleYearOrMonthChange(e,"right",1,!0);else if(this.handleYearOrMonthChange(e,t),i){const r=this.getTargetChangeDate({panelType:t,switchType:e});this.handleSyncChangeMonths({panelType:t,target:r})}}prevMonth(e){this.handleSwitchMonthOrYear("prevMonth",e)}nextMonth(e){this.handleSwitchMonthOrYear("nextMonth",e)}prevYear(e){this.handleSwitchMonthOrYear("prevYear",e)}nextYear(e){this.handleSwitchMonthOrYear("nextYear",e)}_getDiff(e,t,n){const a=this._getPanelDetail(n);return Yr[e]&&Yr[e](t,a.pickerDate)}_getPanelDetail(e){return e===P.PANEL_TYPE_RIGHT?this.getState("monthRight"):this.getState("monthLeft")}localeFormat(e,t){const n=this._adapter.getProp("dateFnsLocale");return X(e,t,{locale:n})}disposeCallbackArgs(e){let t=Array.isArray(e)?e:e&&[e]||[];const n=this.getProp("timeZone");En(n)&&(t=t.map(o=>aa(o,n)));const a=this.getProp("type"),i=this.getProp("format")||$e(a);let r,u;switch(a){case"date":case"dateTime":case"month":this._isMultiple()?(r=t.map(o=>o&&this.localeFormat(o,i)),u=[...t]):(r=t[0]&&this.localeFormat(t[0],i),[u]=t);break;case"dateRange":case"dateTimeRange":r=t.map(o=>o&&this.localeFormat(o,i)),u=[...t];break}return{notifyValue:r,notifyDate:u}}handleYearOrMonthChange(e){let t=arguments.length>1&&arguments[1]!==void 0?arguments[1]:P.PANEL_TYPE_LEFT,n=arguments.length>2&&arguments[2]!==void 0?arguments[2]:1,a=arguments.length>3&&arguments[3]!==void 0?arguments[3]:!1;const{autoSwitchDate:i,type:r}=this.getProps(),{monthLeft:u,monthRight:o}=this.getStates(),l=this.isRangeType(r),c=l&&t===P.PANEL_TYPE_LEFT,d=this._getPanelDetail(t),{pickerDate:f}=d,h=fl[e],v=h(f,n),w=t===P.PANEL_TYPE_LEFT&&!De(v,u.pickerDate)||t===P.PANEL_TYPE_RIGHT&&!De(v,o.pickerDate);if(this._updatePanelDetail(t,{pickerDate:v}),w)if(l){if(c?this.newBiMonthPanelDate[0]=v:this.newBiMonthPanelDate[1]=v,!(c&&a)){const{notifyValue:m,notifyDate:g}=this.disposeCallbackArgs(this.newBiMonthPanelDate);this._adapter.notifyPanelChange(g,m)}}else{const{notifyValue:m,notifyDate:g}=this.disposeCallbackArgs(v);this._adapter.notifyPanelChange(g,m)}i&&this.updateDateAfterChangeYM(e,v)}updateDateAfterChangeYM(e,t){const{multiple:n,disabledDate:a,type:i}=this.getProps(),{selected:r,rangeStart:u,rangeEnd:o,monthLeft:l}=this.getStates(),c=["dateRange","dateTimeRange"].includes(e),d={closePanel:!1};if(!n&&!c&&r.size){const f=Array.from(r)[0],h=new Date(f),v=t.getFullYear(),w=t.getMonth();let m=yi(h,{year:v,month:w});if(i==="dateTime"&&(m=this._mergeDateAndTime(m,l.pickerDate)),a(m,{rangeStart:u,rangeEnd:o}))return;this._adapter.notifySelectedChange([m],d)}}_isMultiple(){return!!this.getProp("multiple")&&this.getProp("type")==="date"}_isRange(){}handleDayClick(e,t){const n=this.getProp("type");switch(!0){case(n==="date"||n==="dateTime"):this.handleDateSelected(e,t);break;case(n==="dateRange"||n==="dateTimeRange"):this.handleRangeSelected(e);break}}handleDateSelected(e,t){const{max:n,type:a,isControlledComponent:i,dateFnsLocale:r}=this.getProps(),u=this._isMultiple(),{selected:o}=this.getStates(),l=this._getPanelDetail(t),c=new Set(u?[...o]:[]),{fullDate:d}=e,f=l.pickerDate,h=d;u?c.has(h)?c.delete(h):n&&c.size===n?this._adapter.notifyMaxLimit():c.add(h):c.add(h);const v=[...c].map(w=>a==="dateTime"?this._mergeDateAndTime(w,f):ne(w,P.FORMAT_FULL_DATE,void 0,r));this.handleShowDateAndTime(t,f),i||this._adapter.updateDaySelected(c),this._adapter.notifySelectedChange(v)}handleShowDateAndTime(e,t,n){const a=n||t;this._updatePanelDetail(e,{showDate:a,pickerDate:t})}_mergeDateAndTime(e,t){const n=this._adapter.getProp("dateFnsLocale"),a=X(_e(e)?e:ne(e,P.FORMAT_FULL_DATE,void 0,n),P.FORMAT_FULL_DATE),i=X(_e(t)?t:ne(t,P.FORMAT_TIME_PICKER,void 0,n),P.FORMAT_TIME_PICKER),r=this.getValidTimeFormat();return ne(`${a} ${i}`,r,void 0,n)}handleRangeSelected(e){let{rangeStart:t,rangeEnd:n}=this.getStates();const{startDateOffset:a,endDateOffset:i,type:r,dateFnsLocale:u,rangeInputFocus:o,triggerRender:l}=this._adapter.getProps(),{fullDate:c}=e;let d=!1,f=!1;const h=(a||i)&&r==="dateRange";h?(t=St(a,c),n=St(i,c)):o==="rangeEnd"?(n=c,t&&n&&it(n,t.trim().split(/\s+/)[0])&&(t=null,d=!0)):(o==="rangeStart"||!o)&&(t=c,t&&n&&it(n.trim().split(/\s+/)[0],t)&&(n=null,f=!0)),/range/i.test(r)&&(h?(this._adapter.setRangeStart(t),this._adapter.setRangeEnd(n)):o==="rangeEnd"?(this._adapter.setRangeEnd(n),d&&this._adapter.setRangeStart(t),(!this._adapter.isAnotherPanelHasOpened("rangeEnd")||!t)&&this._adapter.setRangeInputFocus("rangeStart")):(o==="rangeStart"||!o)&&(this._adapter.setRangeStart(t),f&&this._adapter.setRangeEnd(n),(!this._adapter.isAnotherPanelHasOpened("rangeStart")||!n)&&this._adapter.setRangeInputFocus("rangeEnd")));const w=this.getValidDateFormat();if(t||n){const[m,g]=[ne(t,w,void 0,u),ne(n,w,void 0,u)];let T=[m,g];if(r==="dateTimeRange"){const D=this.getState("monthLeft").pickerDate,_=this.getState("monthRight").pickerDate,I=t?this._mergeDateAndTime(t,D):null,x=n?this._mergeDateAndTime(n,_):null;ua(m,g)&&it(x,I)?T=[I,I]:T=[I,x]}const y=!(r==="dateRange"&&h);this._adapter.notifySelectedChange(T,{needCheckFocusRecord:y})}}_isNeedSwap(e,t){return e&&t&&it(t,e)}handleDayHover(){let e=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{fullDate:""};const{fullDate:t}=e,{startDateOffset:n,endDateOffset:a,type:i}=this.getProps();if(this._adapter.setHoverDay(t),(n||a)&&i==="dateRange"){const r=St(n,t),u=St(a,t);this._adapter.setOffsetRangeStart(r),this._adapter.setOffsetRangeEnd(u)}}_autoAdjustMonth(e,t){let n=e,a=t;const i=je(e.pickerDate,t.pickerDate);return i>0?(n=Object.assign({},t),a=Object.assign({},e)):i===0&&(n=e,a=Object.assign(Object.assign({},t),{pickerDate:Le(t.pickerDate,1)})),{monthLeft:n,monthRight:a}}getValidTimeFormat(){const e=this.getProp("format")||P.FORMAT_TIME_PICKER,t=[];return(Et(e,"h")||Et(e,"H"))&&t.push("HH"),Et(e,"m")&&t.push("mm"),Et(e,"s")&&t.push("ss"),t.join(":")}getValidDateFormat(){return this.getProp("format")||Du(this.getProp("type"))}handleTimeChange(e,t){const{rangeEnd:n,rangeStart:a}=this.getStates(),i=this.getProp("dateFnsLocale"),r=e.timeStampValue,u=this.getProp("type"),o=this._getPanelDetail(t),{showDate:l}=o,c=new Date(r),d=this.getValidDateFormat(),f=t===P.PANEL_TYPE_RIGHT?n:a;let h,v,w;if(u==="dateTimeRange"&&f){const I=ne(f,d,void 0,i);h=I.getFullYear(),v=I.getMonth(),w=I.getDate()}else h=l.getFullYear(),v=l.getMonth(),w=l.getDate();const m=c.getHours(),g=c.getMinutes(),T=c.getSeconds(),y=c.getMilliseconds(),D=[h,v,w,m,g,T,y],_=new Date(...D);if(u==="dateTimeRange")this.handleShowDateAndTime(t,_,l),this._updateTimeInDateRange(t,_);else{const I=Ni(h,v+1,w);this.handleDateSelected({fullDate:I,fullValidDate:_},t),this.handleShowDateAndTime(t,_),this._adapter.notifySelectedChange([_])}}_updateTimeInDateRange(e,t){const{isControlledComponent:n,dateFnsLocale:a}=this.getProps();let i=this.getState("rangeStart"),r=this.getState("rangeEnd");const u=this.getValidDateFormat();if(i&&r){let o=ne(i,u,void 0,a),l=ne(r,u,void 0,a);e===P.PANEL_TYPE_RIGHT?(l=this._mergeDateAndTime(t,t),r=X(l,P.FORMAT_DATE_TIME),this._isNeedSwap(i,r)&&([i,r]=[r,i],[o,l]=[l,o]),n||this._adapter.setRangeEnd(r)):(o=this._mergeDateAndTime(t,t),i=X(o,P.FORMAT_DATE_TIME),this._isNeedSwap(i,r)&&([i,r]=[r,i],[o,l]=[l,o]),n||this._adapter.setRangeStart(i)),this._adapter.notifySelectedChange([o,l])}}_updatePanelDetail(e,t){const{monthLeft:n,monthRight:a}=this.getStates();e===P.PANEL_TYPE_RIGHT?this._adapter.updateMonthOnRight(Object.assign(Object.assign({},a),t)):this._adapter.updateMonthOnLeft(Object.assign(Object.assign({},n),t))}showYearPicker(e){this._updatePanelDetail(e,{isTimePickerOpen:!1,isYearPickerOpen:!0})}showTimePicker(e,t){this.getProp("disabledTimePicker")||this._updatePanelDetail(e,{isTimePickerOpen:!0,isYearPickerOpen:!1})}showDatePanel(e){this._updatePanelDetail(e,{isTimePickerOpen:!1,isYearPickerOpen:!1})}getYAMOpenType(){const{monthLeft:e,monthRight:t}=this._adapter.getStates(),n=e.isYearPickerOpen,a=t.isYearPickerOpen;return n&&a?"both":n?"left":a?"right":"none"}}const Lr=N.NAVIGATION;class pa extends J.PureComponent{constructor(e){super(e),this.navRef=b.createRef()}render(){const{forwardRef:e,monthText:t,onMonthClick:n,onNextMonth:a,onPrevMonth:i,onPrevYear:r,onNextYear:u,density:o,shouldBimonthSwitch:l,panelType:c}=this.props,d="borderless",f=o==="compact"?"default":"large",h=!0,v=o==="compact"?"small":"default",w=c===P.PANEL_TYPE_LEFT,m=c===P.PANEL_TYPE_RIGHT,g=l&&w,T=l&&m,y={},D={};T&&(y.visibility="hidden"),g&&(D.visibility="hidden");const _=e||this.navRef;return b.createElement("div",{className:Lr,ref:_},b.createElement(pt,{key:"double-chevron-left","aria-label":"Previous year",icon:b.createElement(du,{"aria-hidden":!0,size:f}),size:v,theme:d,noHorizontalPadding:h,onClick:r,style:y}),b.createElement(pt,{key:"chevron-left","aria-label":"Previous month",icon:b.createElement(Zr,{"aria-hidden":!0,size:f}),size:v,onClick:i,theme:d,noHorizontalPadding:h,style:y}),b.createElement("div",{className:`${Lr}-month`},b.createElement(yt,{onClick:n,theme:d,size:v},b.createElement("span",null,t))),b.createElement(pt,{key:"chevron-right","aria-label":"Next month",icon:b.createElement(as,{"aria-hidden":!0,size:f}),size:v,onClick:a,theme:d,noHorizontalPadding:h,style:D}),b.createElement(pt,{key:"double-chevron-right","aria-label":"Next year",icon:b.createElement(hu,{"aria-hidden":!0,size:f}),size:v,theme:d,noHorizontalPadding:h,onClick:u,style:D}))}}pa.propTypes={monthText:p.string,density:p.string,onMonthClick:p.func,onNextMonth:p.func,onPrevMonth:p.func,onNextYear:p.func,onPrevYear:p.func,navPrev:p.node,navNext:p.node,shouldBimonthSwitch:p.bool,panelType:p.oneOf([P.PANEL_TYPE_LEFT,P.PANEL_TYPE_RIGHT])};pa.defaultProps={monthText:"",onMonthClick:Q,onNextMonth:Q,onPrevMonth:Q,onNextYear:Q,onPrevYear:Q};const pl=s=>{let{weekStartsOn:e=0}=s;const t=["Sun","Mon","Tue","Wed","Thu","Fri","Sat"];for(let n=0;n{this._adapter.notifyWeeksRowNumChange(i.length)})}}updateWeekDays(){const e=this._adapter.getProp("weekStartsOn"),t=pl({weekStartsOn:e});this._adapter.setWeekDays(t)}destroy(){}handleClick(e){this._adapter.notifyDayClick(e)}handleHover(e){this._adapter.notifyDayHover(e)}}const gl=N.PREFIX;class ma extends Ue{constructor(e){super(e),this.state={weekdays:[],month:{weeks:[],monthText:""},todayText:"",weeksRowNum:e.weeksRowNum},this.monthRef=b.createRef()}get adapter(){return Object.assign(Object.assign({},super.adapter),{updateToday:e=>this.setState({todayText:e}),setWeekDays:e=>this.setState({weekdays:e}),setWeeksRowNum:(e,t)=>this.setState({weeksRowNum:e},t),updateMonthTable:e=>this.setState({month:e}),notifyDayClick:e=>this.props.onDayClick(e),notifyDayHover:e=>this.props.onDayHover(e),notifyWeeksRowNumChange:e=>this.props.onWeeksRowNumChange(e)})}componentDidMount(){this.foundation=new ml(this.adapter),this.foundation.init()}componentWillUnmount(){this.foundation.destroy()}componentDidUpdate(e,t){e.month!==this.props.month&&this.foundation.getMonthTable()}getSingleDayStatus(e){const{rangeInputFocus:t}=this.props,{fullDate:n,todayText:a,selected:i,disabledDate:r,rangeStart:u,rangeEnd:o}=e,l={rangeStart:u,rangeEnd:o,rangeInputFocus:t},c=n===a,d=i.has(n);let f=r&&r(be(n),l);return!f&&this.props.rangeInputFocus==="rangeStart"&&o&&this.props.focusRecordsRef&&this.props.focusRecordsRef.current.rangeEnd&&(f=Ma(n,o.trim().split(/\s+/)[0])),!f&&this.props.rangeInputFocus==="rangeEnd"&&u&&this.props.focusRecordsRef&&this.props.focusRecordsRef.current.rangeStart&&(f=it(n,u.trim().split(/\s+/)[0])),{isToday:c,isSelected:d,isDisabled:f}}getDateRangeStatus(e){const{rangeStart:t,rangeEnd:n,fullDate:a,hoverDay:i,offsetRangeStart:r,offsetRangeEnd:u,rangeInputFocus:o}=e,l=!!(t||n),c=!!(t&&n),d=r||u;if(!l)return{};const f=Ye(i,a);let h,v,w,m,g;t&&(w=Ye(a,t),o==="rangeEnd"&&(h=et(a,{start:t,end:i}))),n&&(m=Ye(a,n),o==="rangeStart"&&(v=et(a,{start:i,end:n}))),!c&&l&&(g=f);let T;d||(T=h||v||f);let y,D,_,I,x,R;return c&&(y=et(a,{start:t,end:n}),d||(D=w&&Ma(t,i),_=m&&it(n,i),I=f&&o==="rangeStart",x=f&&o==="rangeEnd",R=f&&et(i,{start:t,end:n}))),{isHoverDay:f,isSelectedStart:w,isSelectedEnd:m,isInRange:y,isHover:T,isSelectedStartAfterHover:D,isSelectedEndBeforeHover:_,isHoverDayInRange:R,isHoverDayInStartSelection:I,isHoverDayInEndSelection:x,isHoverDayAroundOneSelected:g}}getOffsetDateStatus(e){const{offsetRangeStart:t,offsetRangeEnd:n,rangeStart:a,rangeEnd:i,fullDate:r,hoverDay:u}=e;if(!(t||n))return{};const l=et(r,{start:a,end:i}),c=Ye(u,r),d=a&&Ye(r,a),f=i&&Ye(r,i),h=!!(a&&i),v=Ye(r,t),w=Ye(r,n),m=c;let g,T;return h&&(g=l&&c),!!(t&&n)&&(T=d||et(r,{start:t,end:n})||f),{isOffsetRangeStart:v,isOffsetRangeEnd:w,isHoverInOffsetRange:g,isHoverDayOffset:m,isInOffsetRange:T}}getDayStatus(e,t){const{fullDate:n}=e,{hoverDay:a,rangeStart:i,rangeEnd:r,todayText:u,offsetRangeStart:o,offsetRangeEnd:l,disabledDate:c,selected:d,rangeInputFocus:f}=t,h=this.getSingleDayStatus({fullDate:n,todayText:u,hoverDay:a,selected:d,disabledDate:c,rangeStart:i,rangeEnd:r}),v=this.getDateRangeStatus(Object.assign({fullDate:n,rangeStart:i,rangeEnd:r,hoverDay:a,offsetRangeStart:o,offsetRangeEnd:l,rangeInputFocus:f},h)),w=this.getOffsetDateStatus(Object.assign(Object.assign({offsetRangeStart:o,offsetRangeEnd:l,rangeStart:i,rangeEnd:r,fullDate:n,hoverDay:a},h),v));return Object.assign(Object.assign(Object.assign({},h),v),w)}renderDayOfWeek(){const{locale:e}=this.props,t=Y(N.WEEKDAY),n=Y(`${gl}-weekday-item`),{weekdays:a}=this.state,i=a.map(r=>e.weeks[r]);return b.createElement("div",{role:"row",className:t},i.map((r,u)=>b.createElement("div",{role:"columnheader",key:r+u,className:n},r)))}renderWeeks(){const{month:e}=this.state,{weeks:t}=e,{weeksRowNum:n}=this.props;let a={};n&&(a={height:n*ut.WEEK_HEIGHT});const i=Y(N.WEEKS);return b.createElement("div",{className:i,style:a},t.map((r,u)=>this.renderWeek(r,u)))}renderWeek(e,t){const n=N.WEEK;return b.createElement("div",{role:"row",className:n,key:t},e.map((a,i)=>this.renderDay(a,i)))}renderDay(e,t){const{todayText:n}=this.state,{renderFullDate:a,renderDate:i}=this.props,{fullDate:r,dayNumber:u}=e;if(!r)return b.createElement("div",{role:"gridcell",tabIndex:-1,key:u+t,className:N.DAY},b.createElement("span",null));const o=this.getDayStatus(e,Object.assign({todayText:n},this.props)),l=Y(N.DAY,{[N.DAY_TODAY]:o.isToday,[N.DAY_IN_RANGE]:o.isInRange,[N.DAY_HOVER]:o.isHover,[N.DAY_SELECTED]:o.isSelected,[N.DAY_SELECTED_START]:o.isSelectedStart,[N.DAY_SELECTED_END]:o.isSelectedEnd,[N.DAY_DISABLED]:o.isDisabled,[N.DAY_HOVER_DAY]:o.isHoverDayOffset,[N.DAY_IN_OFFSET_RANGE]:o.isInOffsetRange,[N.DAY_SELECTED_RANGE_HOVER]:o.isHoverInOffsetRange,[N.DAY_OFFSET_RANGE_START]:o.isOffsetRangeStart,[N.DAY_OFFSET_RANGE_END]:o.isOffsetRangeEnd,[N.DAY_SELECTED_START_AFTER_HOVER]:o.isSelectedStartAfterHover,[N.DAY_SELECTED_END_BEFORE_HOVER]:o.isSelectedEndBeforeHover,[N.DAY_HOVER_DAY_BEFORE_RANGE]:o.isHoverDayInStartSelection,[N.DAY_HOVER_DAY_AFTER_RANGE]:o.isHoverDayInEndSelection,[N.DAY_HOVER_DAY_AROUND_SINGLE_SELECTED]:o.isHoverDayAroundOneSelected}),c=Y({[`${N.DAY}-main`]:!0}),d=[u,r,o],f=st(a);return b.createElement("div",{role:"gridcell",tabIndex:o.isDisabled?-1:0,"aria-disabled":o.isDisabled,"aria-selected":o.isSelected,"aria-label":r,className:f?N.DAY:l,title:r,key:u+t,onClick:h=>!o.isDisabled&&this.foundation.handleClick(e),onMouseEnter:()=>this.foundation.handleHover(e),onMouseLeave:()=>this.foundation.handleHover()},f?a(...d):b.createElement("div",{className:c},st(i)?i(u,r):b.createElement("span",null,u)))}render(){const{forwardRef:e,multiple:t}=this.props,n=this.renderDayOfWeek(),a=this.renderWeeks(),i=Y(N.MONTH),r=e||this.monthRef;return b.createElement("div",{role:"grid","aria-multiselectable":t,ref:r,className:i},n,a)}}ma.propTypes={month:p.object,selected:p.object,rangeStart:p.string,rangeEnd:p.string,offsetRangeStart:p.string,offsetRangeEnd:p.string,onDayClick:p.func,onDayHover:p.func,weekStartsOn:p.number,disabledDate:p.func,weeksRowNum:p.number,onWeeksRowNumChange:p.func,renderDate:p.func,renderFullDate:p.func,hoverDay:p.string,startDateOffset:p.func,endDateOffset:p.func,rangeInputFocus:p.oneOfType([p.string,p.bool]),focusRecordsRef:p.object,multiple:p.bool};ma.defaultProps={month:new Date,selected:new Set,rangeStart:"",rangeEnd:"",onDayClick:Q,onDayHover:Q,onWeeksRowNumChange:Q,weekStartsOn:ut.WEEK_START_ON,disabledDate:Tt,weeksRowNum:0};const $r="time",vl="timeRange",at={DEFAULT_TYPE:$r,SIZE:Qr.SIZE,DEFAULT_FORMAT:"HH:mm:ss",DEFAULT_FORMAT_A:"a h:mm:ss",DEFAULT_POSITION:{[$r]:"bottomLeft",[vl]:"bottomLeft"}},ye={PREFIX:`${B}-scrolllist`,SELECTED:`${B}-scrolllist-item-selected`},yl={MODE:["normal","wheel"]},In={DEFAULT_ITEM_HEIGHT:36,DEFAULT_SCROLL_DURATION:120};var zn,Hr;function Tl(){if(Hr)return zn;Hr=1;var s=Vi(),e=Bi(),t=rs(),n=9007199254740991,a=4294967295,i=Math.min;function r(u,o){if(u=t(u),u<1||u>n)return[];var l=a,c=i(u,a);o=e(o),u-=a;for(var d=s(c,o);++l-1&&Array.isArray(a)&&a.length&&K(t)){const i=e%a.length,r=a[i],u=t.children[e];this._adapter.setSelectedNode(u),this._adapter.notifySelectItem(Object.assign(Object.assign({},r),{value:r.value,type:n,index:i}))}}selectNode(e,t){const{type:n,list:a}=this.getProps();if(K(e)&&K(t)){const r=rt(t.children,c=>c===e)%a.length,o=rt(t.children,c=>c===this._cachedSelectedNode)%a.length,l=a[r];this._adapter.setSelectedNode(e),this._adapter.scrollToCenter(e),this._cachedSelectedNode!==e&&(this._cachedSelectedNode=e,o!==r&&this._adapter.notifySelectItem(Object.assign(Object.assign({},l),{value:l.value,type:n,index:r})))}}shouldAppend(e,t){let n=arguments.length>2&&arguments[2]!==void 0?arguments[2]:2;const a="li";if(K(e)&&K(t)){const i=e.querySelectorAll(a),r=i[i.length-1],{list:u}=this.getProps();if(r){const o=t.getBoundingClientRect(),l=r.getBoundingClientRect(),c=l.height*u.length;if(c<=0)return 0;let d=l.top,f=0;for(;d<=o.top+o.height*n;)f+=1,d+=c;return f}}return!1}shouldPrepend(e,t){let n=arguments.length>2&&arguments[2]!==void 0?arguments[2]:2;const a="li";if(K(e)&&K(t)){const r=e.querySelectorAll(a)[0],{list:u}=this.getProps();if(r){const o=t.getBoundingClientRect(),l=r.getBoundingClientRect(),c=l.height*u.length;if(c<=0)return 0;let d=l.top,f=0;for(;d+l.height>=o.top-o.height*n;)f+=1,d-=c;return f}}return 0}initWheelList(e,t,n){const{list:a}=this.getProps();if(K(t)&&K(e)&&a&&a.length){const i=e.children;Un(i,0,a.length);const r=this.shouldPrepend(e,t),u=this.shouldAppend(e,t);this._adapter.setState({prependCount:r,appendCount:u},n)}}adjustInfiniteList(e,t,n){const{list:a}=this.getProps(),i="li";if(K(t)&&K(e)&&a&&a.length){const r=e.querySelectorAll(i),u=r.length,o=1,l=this.shouldPrepend(e,t,o),c=this.shouldAppend(e,t,o);if(l)for(let d=0;d{const f=l.getBoundingClientRect().top,h=Math.abs(f-a);h{if(f===a||f.contains(a))return o=h,u>0&&(l=h%u),!0});return l>-1&&(c=r[l]),{targetNode:d,targetIndex:o,indexInList:l,infoInList:c}}return null}}const bl=(s,e,t)=>{const n=new vs({from:{scrollTop:s.scrollTop},to:{scrollTop:e}},{duration:t});return n.on("frame",a=>{let{scrollTop:i}=a;s.scrollTop=i}),n},qr=1e3/60,Wr=/^\s*$/,On="wheel";class ke extends Ue{constructor(){var e;let t=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{};super(t),e=this,this._cacheNode=(n,a)=>n&&a&&Object.prototype.hasOwnProperty.call(this,n)&&(this[n]=a),this._cacheSelectedNode=n=>this._cacheNode("selectedNode",n),this._cacheWillSelectNode=n=>this._cacheNode("willSelectNode",n),this._cacheListNode=n=>this._cacheNode("list",n),this._cacheSelectorNode=n=>this._cacheNode("selector",n),this._cacheWrapperNode=n=>this._cacheNode("wrapper",n),this._isFirst=n=>{const{list:a}=this;if(K(n)&&K(a)){const i=a.children;return rt(i,n)===0}return!1},this._isLast=n=>{const{list:a}=this;if(K(n)&&K(a)){const{children:i}=a;return rt(i,n)===i.length-1}return!1},this.indexIsSame=(n,a)=>{const{list:i}=this.props;if(i.length)return n%i.length===a%i.length},this.isDisabledIndex=n=>{const{list:a}=this.props;if(Array.isArray(a)&&a.length&&n>-1){const i=a.length,r=n%i;return this.isDisabledData(a[r])}return!1},this.isDisabledNode=n=>{const a=this.list;if(K(n)&&K(a)){const i=rt(a.children,r=>r===n);return this.isDisabledIndex(i)}return!1},this.isDisabledData=n=>n&&typeof n=="object"&&n.disabled,this.isWheelMode=()=>this.props.mode===On,this.addClassToNode=function(n){let a=arguments.length>1&&arguments[1]!==void 0?arguments[1]:ye.SELECTED;const{list:i}=e;if(n=n||e.selectedNode,K(n)&&K(i)){const{children:r}=i,u=new RegExp(`\\s*${a}\\s*`,"g");is(r,o=>{o.className=o.className&&o.className.replace(u," "),Wr.test(o.className)&&(o.className="")}),n.className&&!Wr.test(n.className)?n.className+=` ${a}`:n.className=a}},this.getIndexByNode=n=>rt(this.list.children,n),this.getNodeByIndex=n=>n>-1?Qn(this.list.children,(i,r)=>r===n):Qn(this.list.children,i=>!this.isDisabledNode(i)),this.scrollToIndex=(n,a)=>{a=typeof a=="number"?a:In.DEFAULT_SCROLL_DURATION,n=n??this.props.selectedIndex,this.scrollToNode(this.selectedNode,a)},this.scrollToNode=(n,a)=>{const{wrapper:i}=this,r=i.offsetHeight,u=this.getItmHeight(n),o=(n.offsetTop||this.list.children.length*u/2)-(r-u)/2;this.scrollToPos(o,a)},this.scrollToPos=function(n){let a=arguments.length>1&&arguments[1]!==void 0?arguments[1]:In.DEFAULT_SCROLL_DURATION;const{wrapper:i}=e;if(a&&e.props.motion)if(e.scrollAnimation&&(e.scrollAnimation.destroy(),e.scrolling=!1),i.scrollTop===n){if(e.isWheelMode()){const r=e.foundation.getNearestNodeInfo(e.list,e.selector);e.addClassToNode(r.nearestNode)}}else e.scrollAnimation=bl(i,n,a),e.scrollAnimation.on("rest",()=>{if(e.isWheelMode()){const r=e.foundation.getNearestNodeInfo(e.list,e.selector);e.addClassToNode(r.nearestNode)}}),e.scrollAnimation.start();else i.scrollTop=n},this.scrollToSelectItem=n=>{const{nearestNode:a}=this.foundation.getNearestNodeInfo(this.list,this.selector);this.props.cycled&&this.throttledAdjustList(n,a),this.debouncedSelect(n,a)},this.scrollToCenter=(n,a,i)=>{if(n=n||this.selectedNode,a=a||this.wrapper,K(n)&&K(a)){const r=a.getBoundingClientRect(),u=n.getBoundingClientRect(),o=a.scrollTop+(u.top-(r.top+r.height/2-u.height/2));this.scrollToPos(o,typeof i=="number"?i:In.DEFAULT_SCROLL_DURATION)}},this.clickToSelectItem=n=>{n&&n.nativeEvent&&n.nativeEvent.stopImmediatePropagation();const{targetNode:a,infoInList:i}=this.foundation.getTargetNode(n,this.list);a&&i&&!i.disabled&&this.debouncedSelect(null,a)},this.getItmHeight=n=>n&&n.offsetHeight||In.DEFAULT_ITEM_HEIGHT,this.renderItemList=function(){let n=arguments.length>0&&arguments[0]!==void 0?arguments[0]:"";const{selectedIndex:a,mode:i,transform:r,list:u}=e.props;return u.map((o,l)=>{const{transform:c}=o,d=typeof c=="function"?c:r,f=a===l,h=Y({[`${ye.PREFIX}-item-sel`]:f&&i!==On,[`${ye.PREFIX}-item-disabled`]:!!o.disabled});let v="";f&&typeof d=="function"?v=d(o.value,o.text):v=o.text==null?o.value:o.text;const w={};return!e.isWheelMode()&&!o.disabled&&(w.onClick=()=>e.foundation.selectIndex(l,e.list)),b.createElement("li",Object.assign({key:n+l},w,{className:h,role:"option","aria-disabled":o.disabled}),v)})},this.renderNormalList=()=>{const{list:n,className:a,style:i}=this.props,r=this.renderItemList(),u=Y(`${ye.PREFIX}-item`,a);return b.createElement("div",{style:i,className:u,ref:this._cacheWrapperNode},b.createElement("ul",{role:"listbox","aria-multiselectable":!1,"aria-label":this.props["aria-label"],ref:this._cacheListNode},r))},this.renderInfiniteList=()=>{const{list:n,cycled:a,className:i,style:r}=this.props,{prependCount:u,appendCount:o}=this.state,l=Ur(u).reduce((g,T)=>{const y=this.renderItemList(`pre_${T}_`);return g.unshift(...y),g},[]),c=Ur(o).reduce((g,T)=>{const y=this.renderItemList(`app_${T}_`);return g.push(...y),g},[]),d=this.renderItemList(),f=Y(`${ye.PREFIX}-list-outer`,{[`${ye.PREFIX}-list-outer-nocycle`]:!a}),h=Y(`${ye.PREFIX}-item-wheel`,i),v=Y(`${ye.PREFIX}-selector`),w=Y(`${ye.PREFIX}-shade`,`${ye.PREFIX}-shade-pre`),m=Y(`${ye.PREFIX}-shade`,`${ye.PREFIX}-shade-post`);return b.createElement("div",{className:h,style:r},b.createElement("div",{className:w}),b.createElement("div",{className:v,ref:this._cacheSelectorNode}),b.createElement("div",{className:m}),b.createElement("div",{className:f,ref:this._cacheWrapperNode,onScroll:this.scrollToSelectItem},b.createElement("ul",{role:"listbox","aria-label":this.props["aria-label"],"aria-multiselectable":!1,ref:this._cacheListNode,onClick:this.clickToSelectItem},l,d,c)))},this.state={prependCount:0,appendCount:0},this.selectedNode=null,this.willSelectNode=null,this.list=null,this.wrapper=null,this.selector=null,this.scrollAnimation=null,this.foundation=new Dl(this.adapter),this.throttledAdjustList=Xi((n,a)=>{this.foundation.adjustInfiniteList(this.list,this.wrapper,a)},qr),this.debouncedSelect=cs((n,a)=>{this._cacheSelectedNode(a),this.foundation.selectNode(a,this.list)},qr*2)}get adapter(){var e=this;return Object.assign(Object.assign({},super.adapter),{setState:(t,n)=>this.setState(Object.assign({},t),n),setPrependCount:t=>this.setState({prependCount:t}),setAppendCount:t=>this.setState({appendCount:t}),isDisabledIndex:this.isDisabledIndex,setSelectedNode:t=>this._cacheWillSelectNode(t),notifySelectItem:function(){return e.props.onSelect(...arguments)},scrollToCenter:this.scrollToCenter})}componentWillUnmount(){this.props.cycled&&(this.throttledAdjustList.cancel(),this.debouncedSelect.cancel())}componentDidMount(){this.foundation.init();const{mode:e,cycled:t,selectedIndex:n,list:a}=this.props,i=this.getNodeByIndex(typeof n=="number"&&n>-1?n:0);this._cacheSelectedNode(i),this._cacheWillSelectNode(i),e===On&&t?this.foundation.initWheelList(this.list,this.wrapper,()=>{this.scrollToNode(i,0)}):this.scrollToNode(i,0)}componentDidUpdate(e){const{selectedIndex:t}=this.props;if(e.selectedIndex!==t){const n=this.getIndexByNode(this.willSelectNode);if(!this.indexIsSame(n,t)){const a=this.getNodeByOffset(this.selectedNode,t-e.selectedIndex,this.list);this._cacheWillSelectNode(a)}this._cacheSelectedNode(this.willSelectNode),this.scrollToIndex(t)}}getNodeByOffset(e,t,n){const{list:a}=this.props;if(K(e)&&K(n)&&typeof t=="number"&&Array.isArray(a)&&a.length){t=t%a.length;let r=this.getIndexByNode(e)+t;for(;r<0;)r+=a.length;if(t)return this.getNodeByIndex(r)}return e}render(){return this.isWheelMode()?this.renderInfiniteList():this.renderNormalList()}}ke.propTypes={mode:p.oneOf(yl.MODE),cycled:p.bool,list:p.array,selectedIndex:p.number,onSelect:p.func,transform:p.func,className:p.string,style:p.object,motion:p.oneOfType([p.func,p.bool]),type:p.oneOfType([p.string,p.number])};ke.defaultProps={selectedIndex:0,motion:!0,list:[],onSelect:Q,cycled:!1,mode:On};class _l extends He{}var Cl=function(s,e){var t={};for(var n in s)Object.prototype.hasOwnProperty.call(s,n)&&e.indexOf(n)<0&&(t[n]=s[n]);if(s!=null&&typeof Object.getOwnPropertySymbols=="function")for(var a=0,n=Object.getOwnPropertySymbols(s);a{let t=`${s}`;s<10&&(t=`0${s}`);let n=!1;return e&&e.indexOf(s)>=0&&(n=!0),{value:t,disabled:n}};function Zn(s,e,t){let n=arguments.length>3&&arguments[3]!==void 0?arguments[3]:1;const a=[];for(let i=0;ia<12).map(a=>a===0?12:a):n=n.map(a=>a===12?12:a-12)),n}getValidFormat(e){let t=Be(e)?this.getProp("format"):e;return t=this.getDefaultFormatIfNeed(),t=typeof t=="string"?t:at.DEFAULT_FORMAT,t}getDisplayDateFromTimeStamp(e){let t;return e&&(t=new Date(e)),!e||!_e(t)?this.createDateDefault():t}createDateDefault(){const e=new Date;return new Date(e.getFullYear(),e.getMonth(),e.getDate())}}class ga extends Ue{constructor(e){super(e),this.cacheRefCurrent=(t,n)=>{t&&typeof t=="string"&&this.adapter.setCache(t,n)},this.reselect=()=>{["ampm","hour","minute","second"].forEach(n=>{const a=this.adapter.getCache(n);a&&a.scrollToIndex&&a.scrollToIndex()})},this.onItemChange=t=>{let{type:n,value:a,disabled:i}=t,{onChange:r,use12Hours:u,isAM:o,format:l,timeStampValue:c}=this.props;const d=this.foundation.getDisplayDateFromTimeStamp(c);if(n==="hour")u?o?d.setHours(Number(a)%12):d.setHours(Number(a)%12+12):d.setHours(Number(a));else if(n==="minute")d.setMinutes(Number(a));else if(n==="ampm"){const f=a.toUpperCase();u&&(f==="PM"&&(o=!1,d.getHours()<12&&d.setHours(d.getHours()%12+12)),f==="AM"&&(o=!0,d.getHours()>=12&&d.setHours(d.getHours()-12)))}else d.setSeconds(Number(a));r&&r({isAM:o,value:X(d,l&&l.replace(/(\s+)A/g,"$1a")),timeStampValue:Number(d)})},this.onEnterSelectPanel=t=>{const{onCurrentSelectPanelChange:n}=this.props;n(t)},this.getDisplayDateFromTimeStamp=t=>this.foundation.getDisplayDateFromTimeStamp(t),this.foundation=new Il(this.adapter),this.state=Object.assign({},this.foundation.initData())}componentDidUpdate(e,t){(e.timeStampValue!==this.props.timeStampValue||e.format!==this.props.format||e.hideDisabledOptions!==this.props.hideDisabledOptions||e.use12Hours!==this.props.use12Hours||e.hourStep!==this.props.hourStep||e.minuteStep!==this.props.minuteStep||e.secondStep!==this.props.secondStep||e.disabledHours!==this.props.disabledHours||e.disabledMinutes!==this.props.disabledMinutes||e.disabledSeconds!==this.props.disabledSeconds)&&this.setState(Object.assign({},this.foundation.initData()))}componentWillUnmount(){}componentDidMount(){}renderHourSelect(e,t){const{prefixCls:n,disabledHours:a,use12Hours:i,scrollItemProps:r}=this.props,{showHour:u,hourOptions:o}=this.state;if(!u)return null;const l=a();let c,d;i?(c=[12].concat(o.filter(v=>v<12&&v>0)),d=e%12||12):(c=o,d=e);const f=v=>v+t.hour,h=`${n}-list-hour`;return b.createElement(ke,Object.assign({ref:v=>this.cacheRefCurrent("hour",v),mode:"normal",transform:f,className:h,list:c.map(v=>Xn(v,l)),selectedIndex:c.indexOf(d),type:"hour",onSelect:this.onItemChange},r))}renderMinuteSelect(e,t){const{prefixCls:n,disabledMinutes:a,timeStampValue:i,scrollItemProps:r}=this.props,{showMinute:u,minuteOptions:o}=this.state;if(!u)return null;const l=new Date(i),c=a&&a(l.getHours()),d=`${n}-list-minute`,f=h=>h+t.minute;return b.createElement(ke,Object.assign({ref:h=>this.cacheRefCurrent("minute",h),mode:"normal",transform:f,list:o.map(h=>Xn(h,c)),selectedIndex:o.indexOf(e),type:"minute",onSelect:this.onItemChange,className:d},r))}renderSecondSelect(e,t){const{prefixCls:n,disabledSeconds:a,timeStampValue:i,scrollItemProps:r}=this.props,{showSecond:u,secondOptions:o}=this.state;if(!u)return null;const l=new Date(i),c=a&&a(l.getHours(),l.getMinutes()),d=`${n}-list-second`,f=h=>String(h)+t.second;return b.createElement(ke,Object.assign({ref:h=>this.cacheRefCurrent("second",h),mode:"normal",transform:f,list:o.map(h=>Xn(h,c)),selectedIndex:o.indexOf(e),className:d,type:"second",onSelect:this.onItemChange},r))}renderAMPMSelect(e,t){const{prefixCls:n,use12Hours:a,isAM:i,scrollItemProps:r}=this.props;if(!a)return null;const u=[{value:"AM",text:e.AM||"上午"},{value:"PM",text:e.PM||"下午"}],o=i?0:1,l=`${n}-list-ampm`;return b.createElement(ke,Object.assign({ref:c=>this.cacheRefCurrent("ampm",c),mode:"normal",className:l,list:u,selectedIndex:o,type:"ampm",onSelect:this.onItemChange},r))}render(){const{timeStampValue:e,panelHeader:t,panelFooter:n}=this.props,a=this.getDisplayDateFromTimeStamp(e);return b.createElement(zr,{componentName:"TimePicker"},(i,r)=>b.createElement($n,{header:t,footer:n,"x-semi-header-alias":"panelHeader","x-semi-footer-alias":"panelFooter"},this.renderAMPMSelect(i,r),this.renderHourSelect(a.getHours(),i),this.renderMinuteSelect(a.getMinutes(),i),this.renderSecondSelect(a.getSeconds(),i)))}}ga.propTypes={format:p.string,defaultOpenValue:p.object,prefixCls:p.string,onChange:p.func,showHour:p.bool,showMinute:p.bool,showSecond:p.bool,disabledHours:p.func,disabledMinutes:p.func,disabledSeconds:p.func,hideDisabledOptions:p.bool,onCurrentSelectPanelChange:p.func,use12Hours:p.bool,isAM:p.bool,timeStampValue:p.any,scrollItemProps:p.object};ga.defaultProps={disabledHours:Q,disabledMinutes:Q,disabledSeconds:Q,format:at.DEFAULT_FORMAT};class Rl extends He{constructor(e){super(Object.assign({},e))}init(){}destroy(){}selectYear(e,t){const{currentYear:n,currentMonth:a}=this.getStates(),{type:i}=this.getProps(),r=P.PANEL_TYPE_LEFT,u=P.PANEL_TYPE_RIGHT,o=Sn(n);if(o[t]=e.value,i==="monthRange"){const l=o[r]===o[u]&&a[r]>a[u];t===r&&e.value>o[u]||t===r&&l?o[u]=e.value+1:t===u&&l&&(o[r]=e.value-1)}this._adapter.setCurrentYear(o,()=>this.autoSelectMonth(e,t,o)),this._adapter.notifySelectYear(o)}selectMonth(e,t){const{currentMonth:n,currentYear:a}=this.getStates(),{type:i}=this.getProps(),r=P.PANEL_TYPE_LEFT,u=P.PANEL_TYPE_RIGHT,o=Sn(n);o[t]=e.month,i==="monthRange"&&t===r&&a[r]===a[u]&&e.month>o[u]&&(o[u]=e.month),this._adapter.setCurrentMonth(o),this._adapter.notifySelectMonth(o)}autoSelectMonth(e,t,n){const{disabledDate:a,locale:i}=this._adapter.getProps(),{months:r,currentMonth:u}=this._adapter.getStates(),o=t===P.PANEL_TYPE_LEFT?"right":"left",l=ta(Date.now(),e.year),c=a(Ge(l,u[t]-1)),d=a(Ge(ta(Date.now(),n[o]),u[o]-1));if(!c&&!d)return;let f=n,h=u;if(c){const v=r.findIndex(m=>{let{month:g}=m;return g===u[t]});let w;w=r.slice(v).find(m=>{let{month:g}=m;return!a(Ge(l,g-1))}),w||(w=r.slice(0,v).find(m=>{let{month:g}=m;return!a(Ge(l,g-1))})),w&&!d?h[t]=w.month:w&&d&&(f={left:e.year,right:e.year},h={left:w.month,right:w.month})}else!c&&d&&(f={left:e.year,right:e.year},h={left:u[t],right:u[t]});this._adapter.setCurrentYearAndMonth(f,h),this._adapter.notifySelectYearAndMonth(f,h)}backToMain(){this._adapter.notifyBackToMain()}}const jr=`${B}-datepicker`;class Hn extends Ue{constructor(e){super(e),this.selectYear=(r,u)=>{this.foundation.selectYear(r,u)},this.selectMonth=(r,u)=>{this.foundation.selectMonth(r,u)},this.reselect=()=>{["yearRef","monthRef"].forEach(u=>{const o=this[u];o&&o.current&&o.current.scrollToIndex&&o.current.scrollToIndex()})},this.backToMain=r=>{r.nativeEvent.stopImmediatePropagation(),this.foundation.backToMain()};let{currentYear:t,currentMonth:n}=e;const{year:a,month:i}=ka(t,n);this.state={years:bu(e.startYear,e.endYear).map(r=>({value:r,year:r})),months:Array(12).fill(0).map((r,u)=>({value:u+1,month:u+1})),currentYear:a,currentMonth:i},this.yearRef=b.createRef(),this.monthRef=b.createRef(),this.foundation=new Rl(this.adapter)}get adapter(){return Object.assign(Object.assign({},super.adapter),{setCurrentYear:(e,t)=>this.setState({currentYear:e},t),setCurrentMonth:e=>this.setState({currentMonth:e}),setCurrentYearAndMonth:(e,t)=>this.setState({currentYear:e,currentMonth:t}),notifySelectYear:e=>this.props.onSelect({currentMonth:this.state.currentMonth,currentYear:e}),notifySelectMonth:e=>this.props.onSelect({currentYear:this.state.currentYear,currentMonth:e}),notifySelectYearAndMonth:(e,t)=>this.props.onSelect({currentYear:e,currentMonth:t}),notifyBackToMain:()=>this.props.onBackToMain()})}static getDerivedStateFromProps(e,t){const n={},{year:a,month:i}=ka(e.currentYear,e.currentMonth);return De(e.currentYear,t.currentYear)||(n.currentYear=a),De(e.currentMonth,t.currentMonth)||(n.currentMonth=i),n}renderColYear(e){const{years:t,currentYear:n,currentMonth:a,months:i}=this.state,{disabledDate:r,localeCode:u,yearCycled:o,yearAndMonthOpts:l}=this.props,c=Ge(Date.now(),a[e]-1),d=P.PANEL_TYPE_LEFT,f=P.PANEL_TYPE_RIGHT,h=m=>e===f&&n[d]?n[d]>m:!1,v=t.map(m=>{let{value:g,year:T}=m;const y=i.every(_=>{let{month:I}=_;return r(yi(c,{year:T,month:I-1}))}),D=h(T);return{year:T,value:g,disabled:y||D}});let w=m=>m;return(u==="zh-CN"||u==="zh-TW")&&(w=m=>`${m}年`),b.createElement(ke,Object.assign({ref:this.yearRef,cycled:o,list:v,transform:w,selectedIndex:t.findIndex(m=>m.value===n[e]),type:"year",onSelect:m=>this.selectYear(m,e),mode:"normal"},l))}renderColMonth(e){const{months:t,currentMonth:n,currentYear:a}=this.state,{locale:i,localeCode:r,monthCycled:u,disabledDate:o,yearAndMonthOpts:l}=this.props;let c=m=>m;const d=ta(Date.now(),a[e]),f=P.PANEL_TYPE_LEFT,h=P.PANEL_TYPE_RIGHT;(r==="zh-CN"||r==="zh-TW")&&(c=m=>`${m}月`);const v=t.map(m=>{let{value:g,month:T}=m;const y=e===h&&n[f]&&a[f]===a[h]&&n[f]>T;return{month:T,disabled:o(Ge(d,T-1))||y,value:i.fullMonths[g]}}),w=v.findIndex(m=>m.month===n[e]);return b.createElement(ke,Object.assign({ref:this.monthRef,cycled:u,list:v,transform:c,selectedIndex:w,type:"month",onSelect:m=>this.selectMonth(m,e),mode:"normal"},l))}renderPanel(e){return b.createElement(b.Fragment,null,b.createElement($n,null,this.renderColYear(e),this.renderColMonth(e)))}render(){const{locale:e,noBackBtn:t,density:n,presetPosition:a,renderQuickControls:i,renderDateInput:r,type:u}=this.props,o=`${jr}-yearmonth-header`,l=`${jr}-yearmonth-body`,c=e.selectDate,d=n==="compact"?"default":"large",f=n==="compact"?"small":"default",h=P.PANEL_TYPE_LEFT,v=P.PANEL_TYPE_RIGHT;let w=null;return u==="month"?w=this.renderPanel(h):w=b.createElement("div",{className:l},this.renderPanel(h),this.renderPanel(v)),b.createElement(b.Fragment,null,t?null:b.createElement("div",{className:o},b.createElement(pt,{noHorizontalPadding:!1,icon:b.createElement(Zr,{"aria-hidden":!0,size:d}),size:f,onClick:this.backToMain},b.createElement("span",null,c))),a?b.createElement("div",{style:{display:"flex"}},a==="left"&&u!=="monthRange"&&i,b.createElement("div",null,r,w),a==="right"&&u!=="monthRange"&&i):b.createElement(b.Fragment,null,r,w))}}Hn.propTypes={currentYear:p.object,currentMonth:p.object,onSelect:p.func,locale:p.object,localeCode:p.string,monthCycled:p.bool,yearCycled:p.bool,noBackBtn:p.bool,disabledDate:p.func,density:p.string,presetPosition:p.oneOf(P.PRESET_POSITION_SET),renderQuickControls:p.node,renderDateInput:p.node,type:p.oneOf(P.TYPE_SET),startYear:p.number,endYear:p.number};Hn.defaultProps={disabledDate:Tt,monthCycled:!1,yearCycled:!1,noBackBtn:!1,onSelect:Q,type:"month"};const we=N.PREFIX;class va extends Ue{constructor(e){super(e),this.cacheRefCurrent=(u,o)=>{typeof u=="string"&&u.length&&this.adapter.setCache(u,o)},this.leftIsYearOrTime=u=>{const{monthLeft:o}=u||this.state;return!!(o&&(o.isTimePickerOpen||o.isYearPickerOpen))},this.rightIsYearOrTime=u=>{const{monthRight:o}=u||this.state;return!!(o&&(o.isTimePickerOpen||o.isYearPickerOpen))},this.calcScrollListHeight=()=>{const u=this.adapter.getCache(`wrap-${P.PANEL_TYPE_LEFT}`),o=this.adapter.getCache(`wrap-${P.PANEL_TYPE_RIGHT}`),l=this.adapter.getCache(`switch-${P.PANEL_TYPE_LEFT}`),c=this.adapter.getCache(`switch-${P.PANEL_TYPE_RIGHT}`),d=u&&u.getBoundingClientRect(),f=o&&o.getBoundingClientRect();let h=d&&d.height||0,v=f&&f.height||0;return l&&(h+=l.getBoundingClientRect().height),c&&(v+=c.getBoundingClientRect().height),Math.max(h,v)},this.handleWeeksRowNumChange=(u,o)=>{const l=o===P.PANEL_TYPE_RIGHT,c=o===P.PANEL_TYPE_RIGHT,d=this.leftIsYearOrTime()&&this.rightIsYearOrTime();if(this.foundation.isRangeType()&&!d){const f={weeksRowNum:u,currentPanelHeight:this.calcScrollListHeight()};this.setState(f,()=>{(this.leftIsYearOrTime()&&c||this.rightIsYearOrTime()&&l)&&this.reselect()})}},this.reselect=()=>{[`timepicker-${P.PANEL_TYPE_LEFT}`,`timepicker-${P.PANEL_TYPE_RIGHT}`,`yam-${P.PANEL_TYPE_LEFT}`,`yam-${P.PANEL_TYPE_RIGHT}`].forEach(o=>{const l=this.adapter.getCache(o);l&&typeof l.reselect=="function"&&l.reselect()})},this.getYAMOpenType=()=>this.foundation.getYAMOpenType();const t=e.format||$e(e.type),{nowDate:n,nextDate:a}=ki({defaultPickerValue:e.defaultPickerValue,format:t,dateFnsLocale:e.dateFnsLocale}),i={selected:new Set},r={monthLeft:{pickerDate:n,showDate:n,isTimePickerOpen:!1,isYearPickerOpen:!1},monthRight:{pickerDate:a,showDate:a,isTimePickerOpen:!1,isYearPickerOpen:!1},maxWeekNum:0,hoverDay:"",rangeStart:e.rangeStart,rangeEnd:"",currentPanelHeight:0,offsetRangeStart:"",offsetRangeEnd:""};this.state=Object.assign(Object.assign({},i),r),this.foundation=new hl(this.adapter)}get dateAdapter(){return{updateDaySelected:e=>this.setState({selected:e})}}get rangeAdapter(){return{setRangeStart:e=>this.setState({rangeStart:e}),setRangeEnd:e=>this.setState({rangeEnd:e}),setHoverDay:e=>this.setState({hoverDay:e}),setWeeksHeight:e=>this.setState({maxWeekNum:e}),setOffsetRangeStart:e=>this.setState({offsetRangeStart:e}),setOffsetRangeEnd:e=>this.setState({offsetRangeEnd:e})}}get adapter(){return Object.assign(Object.assign(Object.assign(Object.assign({},super.adapter),this.dateAdapter),this.rangeAdapter),{updateMonthOnLeft:e=>this.setState({monthLeft:e}),updateMonthOnRight:e=>this.setState({monthRight:e}),notifySelectedChange:(e,t)=>this.props.onChange(e,t),notifyMaxLimit:e=>this.props.onMaxSelect(e),notifyPanelChange:(e,t)=>this.props.onPanelChange(e,t),setRangeInputFocus:e=>this.props.setRangeInputFocus(e),isAnotherPanelHasOpened:e=>this.props.isAnotherPanelHasOpened(e)})}componentDidMount(){super.componentDidMount()}componentDidUpdate(e,t){const{defaultValue:n,defaultPickerValue:a}=this.props;if(e.defaultValue!==n&&this.foundation.updateSelectedFromProps(n),e.defaultPickerValue!==a&&this.foundation.initDefaultPickerValue(),this.foundation.isRangeType()){const r=this.leftIsYearOrTime(t)&&this.rightIsYearOrTime(t),u=this.leftIsYearOrTime(t)&&!this.rightIsYearOrTime(t)||!this.leftIsYearOrTime(t)&&this.rightIsYearOrTime(t),o=this.leftIsYearOrTime()&&this.rightIsYearOrTime(),l=this.leftIsYearOrTime()&&!this.rightIsYearOrTime()||!this.leftIsYearOrTime()&&this.rightIsYearOrTime();u&&o?this.setState({currentPanelHeight:this.calcScrollListHeight()},this.reselect):r&&l&&this.reselect()}}renderPanel(e,t){let n=Y(`${we}-month-grid-${t}`);const{monthLeft:a,monthRight:i,currentPanelHeight:r}=this.state,{insetInput:u}=this.props,o=t===P.PANEL_TYPE_RIGHT?i:a,{isTimePickerOpen:l,isYearPickerOpen:c}=o,d=this.renderMonth(e,t),f=c?b.createElement("div",{className:`${we}-yam`},this.renderYearAndMonth(t,o)):null,h=l?b.createElement("div",{className:`${we}-tpk`},this.renderTimePicker(t,o)):null,v={},w=this.adapter.getCache(`wrap-${P.PANEL_TYPE_LEFT}`),m=this.adapter.getCache(`wrap-${P.PANEL_TYPE_RIGHT}`),g=t===P.PANEL_TYPE_RIGHT?m:w;this.foundation.isRangeType()?((c||l)&&(v.minWidth=g.getBoundingClientRect().width),this.leftIsYearOrTime()&&this.rightIsYearOrTime()&&!u&&(v.minHeight=r||this.calcScrollListHeight())):this.props.type!=="year"&&this.props.type!=="month"&&(l||c)&&(n=Y(n,`${we}-yam-showing`));const y=!(c||l)?"date":c?"year":"time";return b.createElement("div",{className:n,key:t,style:v,"x-open-type":y},f,h,this.foundation.isRangeType()?d:c||l?null:d,this.renderSwitch(t))}showYearPicker(e,t){t.nativeEvent.stopImmediatePropagation(),this.foundation.showYearPicker(e)}renderMonth(e,t){const{selected:n,rangeStart:a,rangeEnd:i,hoverDay:r,maxWeekNum:u,offsetRangeStart:o,offsetRangeEnd:l}=this.state,{weekStartsOn:c,disabledDate:d,locale:f,localeCode:h,renderDate:v,renderFullDate:w,startDateOffset:m,endDateOffset:g,density:T,rangeInputFocus:y,syncSwitchMonth:D,multiple:_}=this.props;let I="";if(e){const O=e?X(e,"yyyy"):"",k=e?X(e,"L"):"",U=f.months[k];I=f.monthText.replace("${year}",O).replace("${month}",U)}let x={};const R=t===P.PANEL_TYPE_RIGHT?this.state.monthRight:this.state.monthLeft,C=this.foundation.isRangeType(),E=C&&D;return C&&R&&(R.isYearPickerOpen||R.isTimePickerOpen)&&(x={visibility:"hidden",position:"absolute",pointerEvents:"none"}),b.createElement("div",{ref:O=>this.cacheRefCurrent(`wrap-${t}`,O),style:x},b.createElement(pa,{forwardRef:O=>this.cacheRefCurrent(`nav-${t}`,O),monthText:I,density:T,onMonthClick:O=>this.showYearPicker(t,O),onPrevMonth:()=>this.foundation.prevMonth(t),onNextMonth:()=>this.foundation.nextMonth(t),onNextYear:()=>this.foundation.nextYear(t),onPrevYear:()=>this.foundation.prevYear(t),shouldBimonthSwitch:E,panelType:t}),b.createElement(ma,{locale:f,localeCode:h,forwardRef:O=>this.cacheRefCurrent(`month-${t}`,O),disabledDate:d,weekStartsOn:c,month:e,selected:n,rangeStart:a,rangeEnd:i,rangeInputFocus:y,offsetRangeStart:o,offsetRangeEnd:l,hoverDay:r,weeksRowNum:u,renderDate:v,renderFullDate:w,onDayClick:O=>this.foundation.handleDayClick(O,t),onDayHover:O=>this.foundation.handleDayHover(O,t),onWeeksRowNumChange:O=>this.handleWeeksRowNumChange(O,t),startDateOffset:m,endDateOffset:g,focusRecordsRef:this.props.focusRecordsRef,multiple:_}))}renderTimePicker(e,t){const{type:n,locale:a,format:i,hideDisabledOptions:r,timePickerOpts:u,dateFnsLocale:o}=this.props,{pickerDate:l}=t,c=Y(`${we}-time`),d=Object.assign(Object.assign({},u),{hideDisabledOptions:r}),f=this.foundation.calcDisabledTime(e);f&&["disabledHours","disabledMinutes","disabledSeconds"].forEach(y=>{f[y]&&(d[y]=f[y])});const{rangeStart:h,rangeEnd:v}=this.state,w=this.foundation.getValidDateFormat();let m,g;n==="dateTimeRange"&&h&&v&&ua(m=ne(h,w,void 0,o),g=ne(v,w,void 0,o))&&(e===P.PANEL_TYPE_RIGHT?h&&(d.startDate=m):v&&(d.endDate=g));const T=a.selectTime;return b.createElement("div",{className:c},b.createElement(ga,Object.assign({ref:y=>this.cacheRefCurrent(`timepicker-${e}`,y),panelHeader:T,format:i||P.FORMAT_TIME_PICKER,timeStampValue:l,onChange:y=>this.foundation.handleTimeChange(y,e)},d)))}renderYearAndMonth(e,t){const{pickerDate:n}=t,{locale:a,localeCode:i,density:r,yearAndMonthOpts:u,startYear:o,endYear:l}=this.props,c=n.getFullYear(),d=n.getMonth()+1;return b.createElement(Hn,{ref:f=>this.cacheRefCurrent(`yam-${e}`,f),locale:a,localeCode:i,currentYear:{left:c,right:0},currentMonth:{left:d,right:0},onSelect:f=>this.foundation.toYearMonth(e,new Date(f.currentYear.left,f.currentMonth.left-1)),onBackToMain:()=>{this.foundation.showDatePanel(e);const f=this.adapter.getCache(`wrap-${e}`);f&&(f.style.height="auto")},density:r,yearAndMonthOpts:u,startYear:o,endYear:l})}renderSwitch(e){const{rangeStart:t,rangeEnd:n,monthLeft:a,monthRight:i}=this.state,{type:r,locale:u,disabledTimePicker:o,density:l,dateFnsLocale:c,insetInput:d}=this.props;if(!r.includes("Time")||d)return null;let f,h;const{FORMAT_SWITCH_DATE:v}=u.localeFormatToken,w=this.foundation.getValidTimeFormat(),m=this.foundation.getValidDateFormat();e===P.PANEL_TYPE_LEFT?(f=a,h=t?X(ne(t,m,void 0,c),v):""):(f=i,h=n?X(ne(n,m,void 0,c),v):"");const{isTimePickerOpen:g,showDate:T}=f,y=T?X(T,v):"",D=T?X(T,w):"",_=["default"].includes(l),I=Y(`${we}-switch`),x=Y({[`${we}-switch-date`]:!0,[`${we}-switch-date-active`]:!g}),R=Y({[`${we}-switch-time`]:!0,[`${we}-switch-time-disabled`]:o,[`${we}-switch-date-active`]:g}),C=Y(`${we}-switch-text`);return b.createElement("div",{className:I,ref:E=>this.adapter.setCache(`switch-${e}`,E)},b.createElement("div",{role:"button","aria-label":"Switch to date panel",className:x,onClick:E=>this.foundation.showDatePanel(e)},_&&b.createElement(Ti,{"aria-hidden":!0}),b.createElement("span",{className:C},h||y)),b.createElement("div",{role:"button","aria-label":"Switch to time panel",className:R,onClick:E=>this.foundation.showTimePicker(e,!0)},_&&b.createElement(lu,{"aria-hidden":!0}),b.createElement("span",{className:C},D)))}render(){const{monthLeft:e,monthRight:t}=this.state,{type:n,insetInput:a,presetPosition:i,renderQuickControls:r,renderDateInput:u}=this.props,o=Y({[`${we}-month-grid`]:!0}),l=P.PANEL_TYPE_LEFT,c=P.PANEL_TYPE_RIGHT;let d=null;n==="date"||n==="dateTime"?d=this.renderPanel(e.pickerDate,l):n==="dateRange"||n==="dateTimeRange"?d=[this.renderPanel(e.pickerDate,l),this.renderPanel(t.pickerDate,c)]:(n==="year"||n==="month")&&(d="year month");const f=this.getYAMOpenType();return b.createElement("div",{style:{display:"flex"}},i==="left"&&r,b.createElement("div",null,u,b.createElement("div",{className:o,"x-type":n,"x-panel-yearandmonth-open-type":f,"x-insetinput":a?"true":"false","x-preset-position":r===null?"null":i,ref:h=>this.cacheRefCurrent("monthGrid",h)},d)),i==="right"&&r)}}va.propTypes={type:p.oneOf(P.TYPE_SET),defaultValue:p.array,defaultPickerValue:p.oneOfType([p.string,p.number,p.object,p.array]),multiple:p.bool,max:p.number,weekStartsOn:p.number,disabledDate:p.func,disabledTime:p.func,disabledTimePicker:p.bool,hideDisabledOptions:p.bool,navPrev:p.node,navNext:p.node,onMaxSelect:p.func,timePickerOpts:p.object,isControlledComponent:p.bool,rangeStart:p.oneOfType([p.string]),rangeInputFocus:p.oneOfType([p.bool,p.string]),locale:p.object,localeCode:p.string,format:p.string,renderDate:p.func,renderFullDate:p.func,startDateOffset:p.func,endDateOffset:p.func,autoSwitchDate:p.bool,density:p.string,dateFnsLocale:p.object.isRequired,timeZone:p.oneOfType([p.string,p.number]),syncSwitchMonth:p.bool,onPanelChange:p.func,focusRecordsRef:p.object,triggerRender:p.func,presetPosition:p.oneOf(P.PRESET_POSITION_SET),renderQuickControls:p.node,renderDateInput:p.node};va.defaultProps={type:"date",rangeStart:"",multiple:!1,weekStartsOn:ut.WEEK_START_ON,disabledDate:Tt,onMaxSelect:Q,locale:{}};const ve=N.PREFIX,{Text:Pl}=Zi;class ya extends J.PureComponent{render(){const{presets:e,onPresetClick:t,type:n,presetPosition:a,insetInput:i,locale:r}=this.props,u=n==="dateRange"||n==="dateTimeRange",o=a==="top"||a==="bottom",l=n==="month",c=o&&u,d=o&&l,f=Y(`${ve}-quick-control`,{[`${ve}-quick-control-${n}`]:n,[`${ve}-quick-control-${a}`]:!0}),h=Y({[`${ve}-quick-control-header`]:!0}),v=Y({[`${ve}-quick-control-${a}-content-wrapper`]:!0}),w=Y({[`${ve}-quick-control-${a}-content`]:!c&&!d,[`${ve}-quick-control-${a}-range-content`]:c,[`${ve}-quick-control-${a}-month-content`]:d}),m=Y({[`${ve}-quick-control-${a}-content-item`]:!c&&!d,[`${ve}-quick-control-${a}-range-content-item`]:c,[`${ve}-quick-control-${a}-month-content-item`]:d}),g=Y({[`${ve}-quick-control-${a}-content-item-ellipsis`]:!c&&!d,[`${ve}-quick-control-${a}-range-content-item-ellipsis`]:c,[`${ve}-quick-control-${a}-month-content-item-ellipsis`]:d});return e.length?b.createElement("div",{className:f,"x-insetinput":i?"true":"false"},!o&&b.createElement("div",{className:h},r.presets),b.createElement("div",{className:v},b.createElement("div",{className:w},e.map((T,y)=>{const D=typeof T=="function"?T():T;return b.createElement(yt,{size:"small",type:"primary",onClick:_=>t(D,_),key:y},b.createElement("div",{className:m},b.createElement(Pl,{ellipsis:{showTooltip:!0},className:g},D.text)))})))):null}}ya.propTypes={presets:p.array,presetPosition:p.oneOf(P.PRESET_POSITION_SET),onPresetClick:p.func,type:p.string,insetInput:p.oneOfType([p.bool,p.object]),locale:p.object};ya.defaultProps={presets:[],presetPosition:"bottom",onPresetClick:We};function El(){let s=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{};const{prefixCls:e,locale:t,onCancelClick:n,onConfirmClick:a,disabledConfirm:i}=s,r=Y(`${e}-footer`);return b.createElement("div",{className:r},b.createElement(yt,{theme:"borderless",onClick:n},oe(t,"footer.cancel","")),b.createElement(yt,{theme:"solid",onClick:a,disabled:i},oe(t,"footer.confirm","")))}var Ol=function(s,e){var t={};for(var n in s)Object.prototype.hasOwnProperty.call(s,n)&&e.indexOf(n)<0&&(t[n]=s[n]);if(s!=null&&typeof Object.getOwnPropertySymbols=="function")for(var a=0,n=Object.getOwnPropertySymbols(s);athis.triggerElRef.current=n,this.handleSelectedChange=(n,a)=>this.foundation.handleSelectedChange(n,a),this.handleYMSelectedChange=n=>this.foundation.handleYMSelectedChange(n),this.disabledDisposeDate=function(n){for(var a=arguments.length,i=new Array(a>1?a-1:0),r=1;r1?a-1:0),r=1;rthis.foundation.openPanel(),this.handleInputChange=function(){return t.foundation.handleInputChange(...arguments)},this.handleInsetInputChange=n=>this.foundation.handleInsetInputChange(n),this.handleInputComplete=n=>this.foundation.handleInputComplete(n),this.handleInputBlur=n=>this.foundation.handleInputBlur(oe(n,"nativeEvent.target.value"),n),this.handleInputFocus=function(){return t.foundation.handleInputFocus(...arguments)},this.handleInputClear=n=>this.foundation.handleInputClear(n),this.handleTriggerWrapperClick=n=>this.foundation.handleTriggerWrapperClick(n),this.handleSetRangeFocus=n=>this.foundation.handleSetRangeFocus(n),this.handleRangeInputBlur=(n,a)=>this.foundation.handleRangeInputBlur(n,a),this.handleRangeInputClear=n=>this.foundation.handleRangeInputClear(n),this.handleRangeEndTabPress=n=>this.foundation.handleRangeEndTabPress(n),this.isAnotherPanelHasOpened=n=>n==="rangeStart"?this.focusRecordsRef.current.rangeEnd:this.focusRecordsRef.current.rangeStart,this.handleInsetDateFocus=(n,a)=>{const i=oe(this,"monthGrid.current.foundation");i&&(i.showDatePanel(P.PANEL_TYPE_LEFT),i.showDatePanel(P.PANEL_TYPE_RIGHT)),this.handleInputFocus(n,a)},this.handleInsetTimeFocus=()=>{const n=oe(this,"monthGrid.current.foundation");n&&(n.showTimePicker(P.PANEL_TYPE_LEFT),n.showTimePicker(P.PANEL_TYPE_RIGHT))},this.handlePanelVisibleChange=n=>{this.foundation.handlePanelVisibleChange(n)},this.handleConfirm=n=>this.foundation.handleConfirm(),this.handleCancel=n=>this.foundation.handleCancel(),this.renderFooter=(n,a)=>{var i;if(this.adapter.needConfirm()){const{cachedSelectedValue:r}=this.state,u=/range/i.test((i=this.props.type)!==null&&i!==void 0?i:""),o=Array.isArray(r)&&(r.length===0||r.length===2&&r.every(c=>c!=null)),l=u?!o:!1;return b.createElement(El,Object.assign({},this.props,{locale:n,localeCode:a,onConfirmClick:this.handleConfirm,onCancelClick:this.handleCancel,disabledConfirm:l}))}return null},this.renderPanel=(n,a,i)=>{const{dropdownClassName:r,dropdownStyle:u,density:o,topSlot:l,bottomSlot:c,presetPosition:d,type:f,leftSlot:h,rightSlot:v}=this.props,w=Y(N.PREFIX,{[N.PANEL_YAM]:this.adapter.typeIsYearOrMonth(),[`${N.PREFIX}-compact`]:o==="compact"},r);return b.createElement("div",{ref:this.panelRef,className:w,style:u,"x-type":f},b.createElement("div",{className:`${N.PREFIX}-container`},h&&b.createElement("div",{className:`${N.PREFIX}-leftSlot`,"x-semi-prop":"leftSlot"},h),b.createElement("div",null,l&&b.createElement("div",{className:`${N.PREFIX}-topSlot`,"x-semi-prop":"topSlot"},l),d==="top"&&f!=="monthRange"&&this.renderQuickControls(),this.adapter.typeIsYearOrMonth()?this.renderYearMonthPanel(n,a):this.renderMonthGrid(n,a,i),d==="bottom"&&f!=="monthRange"&&this.renderQuickControls(),c&&b.createElement("div",{className:`${N.PREFIX}-bottomSlot`,"x-semi-prop":"bottomSlot"},c)),v&&b.createElement("div",{className:`${N.PREFIX}-rightSlot`,"x-semi-prop":"rightSlot"},v)),this.renderFooter(n,a))},this.renderYearMonthPanel=(n,a)=>{const{density:i,presetPosition:r,yearAndMonthOpts:u,type:o,startYear:l,endYear:c}=this.props,d=this.state.value[0],f={left:0,right:0},h={left:0,right:0};if(xa(d)&&(f.left=d.getFullYear(),h.left=d.getMonth()+1),o==="monthRange"){const v=this.state.value[1];xa(v)&&(f.right=v.getFullYear(),h.right=v.getMonth()+1)}return b.createElement(Hn,{locale:n,localeCode:a,disabledDate:this.disabledDisposeDate,noBackBtn:!0,monthCycled:!0,onSelect:this.handleYMSelectedChange,currentYear:f,currentMonth:h,density:i,presetPosition:r,renderQuickControls:this.renderQuickControls(),renderDateInput:this.renderDateInput(),type:o,yearAndMonthOpts:u,startYear:l,endYear:c})},this.wrapPopover=n=>{const{panelShow:a}=this.state,{direction:i}=this.context,r=i==="rtl"?"bottomRight":"bottomLeft",{motion:u,zIndex:o,position:l=r,getPopupContainer:c,locale:d,localeCode:f,dateFnsLocale:h,stopPropagation:v,autoAdjustOverflow:w,spacing:m,dropdownMargin:g}=this.props;return b.createElement(Ki,{getPopupContainer:c,autoAdjustOverflow:w,zIndex:o,motion:u,margin:g,content:this.renderPanel(d,f,h),trigger:"custom",position:l,visible:a,stopPropagation:v,spacing:m,onVisibleChange:this.handlePanelVisibleChange},n)},this.state={panelShow:e.open||e.defaultOpen,isRange:!1,inputValue:null,value:[],cachedSelectedValue:[],prevTimeZone:null,rangeInputFocus:void 0,autofocus:e.autoFocus||this.isRangeType(e.type,e.triggerRender)&&(e.open||e.defaultOpen),insetInputValue:null,triggerDisabled:void 0},this.triggerElRef=b.createRef(),this.panelRef=b.createRef(),this.monthGrid=b.createRef(),this.inputRef=b.createRef(),this.rangeInputStartRef=b.createRef(),this.rangeInputEndRef=b.createRef(),this.focusRecordsRef=b.createRef(),this.focusRecordsRef.current={rangeStart:!1,rangeEnd:!1},this.foundation=new sl(this.adapter)}get adapter(){var e=this;return Object.assign(Object.assign({},super.adapter),{togglePanel:(t,n)=>{this.setState({panelShow:t},n),t||(this.focusRecordsRef.current.rangeEnd=!1,this.focusRecordsRef.current.rangeStart=!1)},registerClickOutSide:()=>{this.clickOutSideHandler&&(this.adapter.unregisterClickOutSide(),this.clickOutSideHandler=null),this.clickOutSideHandler=t=>{const n=this.triggerElRef&&this.triggerElRef.current,a=this.panelRef&&this.panelRef.current,i=t.target,r=t.composedPath&&t.composedPath()||[i];!(n&&n.contains(i))&&!(a&&a.contains(i))&&!(r.includes(n)||r.includes(a))&&(this.props.onClickOutSide(t),this.adapter.needConfirm()||this.foundation.closePanel())},document.addEventListener("mousedown",this.clickOutSideHandler)},unregisterClickOutSide:()=>{document.removeEventListener("mousedown",this.clickOutSideHandler)},notifyBlur:function(){return e.props.onBlur(...arguments)},notifyFocus:function(){return e.props.onFocus(...arguments)},notifyClear:function(){return e.props.onClear(...arguments)},notifyChange:function(){return e.props.onChange(...arguments)},notifyCancel:function(){return e.props.onCancel(...arguments)},notifyConfirm:function(){return e.props.onConfirm(...arguments)},notifyOpenChange:function(){return e.props.onOpenChange(...arguments)},notifyPresetsClick:function(){return e.props.onPresetClick(...arguments)},updateValue:t=>this.setState({value:t}),updatePrevTimezone:t=>this.setState({prevTimeZone:t}),updateCachedSelectedValue:t=>{let n=t;t&&!Array.isArray(t)&&(n=[...t]),this.setState({cachedSelectedValue:n})},updateInputValue:t=>{this.setState({inputValue:t})},updateInsetInputValue:t=>{const{insetInput:n}=this.props;n&&!De(t,this.state.insetInputValue)&&this.setState({insetInputValue:t})},needConfirm:()=>["dateTime","dateTimeRange"].includes(this.props.type)&&this.props.needConfirm===!0,typeIsYearOrMonth:()=>["month","year","monthRange"].includes(this.props.type),setRangeInputFocus:t=>{const{preventScroll:n}=this.props;switch(t!==this.state.rangeInputFocus&&this.setState({rangeInputFocus:t}),t){case"rangeStart":const a=oe(this,"rangeInputStartRef.current");a&&a.focus({preventScroll:n}),setTimeout(()=>{this.focusRecordsRef.current.rangeStart=!0},0);break;case"rangeEnd":const i=oe(this,"rangeInputEndRef.current");i&&i.focus({preventScroll:n}),setTimeout(()=>{this.focusRecordsRef.current.rangeEnd=!0},0);break;default:return}},couldPanelClosed:()=>this.focusRecordsRef.current.rangeStart&&this.focusRecordsRef.current.rangeEnd,isEventTarget:t=>t&&t.target===t.currentTarget,setInsetInputFocus:()=>{const{preventScroll:t}=this.props,{rangeInputFocus:n}=this.state;switch(n){case"rangeEnd":if(document.activeElement!==this.rangeInputEndRef.current){const a=oe(this,"rangeInputEndRef.current");a&&a.focus({preventScroll:t})}break;case"rangeStart":default:if(document.activeElement!==this.rangeInputStartRef.current){const a=oe(this,"rangeInputStartRef.current");a&&a.focus({preventScroll:t})}break}},setInputFocus:()=>{const{preventScroll:t}=this.props,n=oe(this,"inputRef.current");n&&n.focus({preventScroll:t})},setInputBlur:()=>{const t=oe(this,"inputRef.current");t&&t.blur()},setRangeInputBlur:()=>{const{rangeInputFocus:t}=this.state;if(t==="rangeStart"){const n=oe(this,"rangeInputStartRef.current");n&&n.blur()}else if(t==="rangeEnd"){const n=oe(this,"rangeInputEndRef.current");n&&n.blur()}this.adapter.setRangeInputFocus(!1)},setTriggerDisabled:t=>{this.setState({triggerDisabled:t})}})}isRangeType(e,t){return/range/i.test(e)&&!st(t)}componentDidUpdate(e){De(e.value,this.props.value)?this.props.timeZone!==e.timeZone&&this.foundation.initFromProps({value:this.state.value,timeZone:this.props.timeZone,prevTimeZone:e.timeZone}):this.foundation.initFromProps(Object.assign({},this.props)),e.open!==this.props.open&&(this.foundation.initPanelOpenStatus(),this.props.open||this.foundation.clearRangeInputFocus())}componentDidMount(){this._mounted=!0,super.componentDidMount()}componentWillUnmount(){this._mounted=!1,super.componentWillUnmount()}open(){this.foundation.open()}close(){this.foundation.close()}focus(e){this.foundation.focus(e)}blur(){this.foundation.blur()}renderMonthGrid(e,t,n){const{type:a,multiple:i,max:r,weekStartsOn:u,timePickerOpts:o,defaultPickerValue:l,format:c,hideDisabledOptions:d,disabledTimePicker:f,renderDate:h,renderFullDate:v,startDateOffset:w,endDateOffset:m,autoSwitchDate:g,density:T,syncSwitchMonth:y,onPanelChange:D,timeZone:_,triggerRender:I,insetInput:x,presetPosition:R,yearAndMonthOpts:C,startYear:E,endYear:O}=this.props,{cachedSelectedValue:k,rangeInputFocus:U}=this.state,se=k;return b.createElement(va,{ref:this.monthGrid,locale:e,localeCode:t,dateFnsLocale:n,weekStartsOn:u,type:a,multiple:i,max:r,format:c,disabledDate:this.disabledDisposeDate,hideDisabledOptions:d,disabledTimePicker:f,disabledTime:this.disabledDisposeTime,defaultValue:se,defaultPickerValue:l,timePickerOpts:o,isControlledComponent:!this.adapter.needConfirm()&&this.isControlled("value"),onChange:this.handleSelectedChange,renderDate:h,renderFullDate:v,startDateOffset:w,endDateOffset:m,autoSwitchDate:g,density:T,rangeInputFocus:U,setRangeInputFocus:this.handleSetRangeFocus,isAnotherPanelHasOpened:this.isAnotherPanelHasOpened,syncSwitchMonth:y,onPanelChange:D,timeZone:_,focusRecordsRef:this.focusRecordsRef,triggerRender:I,insetInput:x,presetPosition:R,renderQuickControls:this.renderQuickControls(),renderDateInput:this.renderDateInput(),yearAndMonthOpts:C,startYear:E,endYear:O})}renderQuickControls(){const{presets:e,type:t,presetPosition:n,insetInput:a,locale:i}=this.props;return b.createElement(ya,{type:t,presets:e,insetInput:a,presetPosition:n,onPresetClick:(r,u)=>this.foundation.handlePresetClick(r,u),locale:i})}renderDateInput(){const{insetInput:e,dateFnsLocale:t,density:n,type:a,format:i,rangeSeparator:r,rangeSeparatorNode:u,defaultPickerValue:o}=this.props,{insetInputValue:l,value:c}=this.state,d={dateFnsLocale:t,format:i,insetInputValue:l,rangeSeparator:r,rangeSeparatorNode:u,type:a,value:c,handleInsetDateFocus:this.handleInsetDateFocus,handleInsetTimeFocus:this.handleInsetTimeFocus,onInsetInputChange:this.handleInsetInputChange,rangeInputStartRef:this.rangeInputStartRef,rangeInputEndRef:this.rangeInputEndRef,density:n,defaultPickerValue:o};return e?b.createElement(Fn,Object.assign({},d,{insetInput:e})):null}renderInner(e){const{clearIcon:t,type:n,format:a,multiple:i,disabled:r,showClear:u,insetLabel:o,insetLabelId:l,placeholder:c,validateStatus:d,inputStyle:f,prefix:h,locale:v,dateFnsLocale:w,triggerRender:m,size:g,inputReadOnly:T,rangeSeparator:y,rangeSeparatorNode:D,insetInput:_,defaultPickerValue:I,borderless:x}=this.props,{value:R,inputValue:C,rangeInputFocus:E,triggerDisabled:O}=this.state,k=this.isRangeType(n,m),U=r||_&&O,se=Y(`${N.PREFIX}-input`,{[`${N.PREFIX}-range-input`]:k,[`${N.PREFIX}-range-input-${g}`]:k&&g,[`${N.PREFIX}-range-input-active`]:k&&E&&!U,[`${N.PREFIX}-range-input-disabled`]:k&&U,[`${N.PREFIX}-range-input-${d}`]:k&&d,[`${N.PREFIX}-borderless`]:x}),G=c||v.placeholder[n],Z=Object.assign(Object.assign({},e),{showClearIgnoreDisabled:!!_,placeholder:G,clearIcon:t,disabled:U,inputValue:C,value:R,defaultPickerValue:I,onChange:this.handleInputChange,onEnterPress:this.handleInputComplete,block:!0,inputStyle:f,showClear:u,insetLabel:o,insetLabelId:l,type:n,format:a,multiple:i,validateStatus:d,inputReadOnly:T||!!_,onBlur:this.handleInputBlur,onFocus:this.handleInputFocus,onClear:this.handleInputClear,prefix:h,size:g,autofocus:this.state.autofocus,dateFnsLocale:w,rangeInputFocus:E,rangeSeparator:y,rangeSeparatorNode:D,onRangeBlur:this.handleRangeInputBlur,onRangeClear:this.handleRangeInputClear,onRangeEndTabPress:this.handleRangeEndTabPress,rangeInputStartRef:_?null:this.rangeInputStartRef,rangeInputEndRef:_?null:this.rangeInputEndRef,inputRef:this.inputRef});return b.createElement("div",{role:"combobox","aria-label":Array.isArray(R)&&R.length?"Change date":"Choose date","aria-disabled":r,onClick:this.handleTriggerWrapperClick,className:se},typeof m=="function"?b.createElement(ss,Object.assign({},Z,{triggerRender:m,componentName:"DatePicker",componentProps:Object.assign({},this.props)})):b.createElement(Fn,Object.assign({},Z)))}render(){const e=this.props,{style:t,className:n,prefixCls:a,type:i}=e,r=Ol(e,["style","className","prefixCls","type"]),u=Object.assign({style:t,className:Y(n,{[a]:!0}),ref:this.setTriggerRef,"aria-invalid":this.props["aria-invalid"],"aria-errormessage":this.props["aria-errormessage"],"aria-labelledby":this.props["aria-labelledby"],"aria-describedby":this.props["aria-describedby"],"aria-required":this.props["aria-required"]},this.getDataAttr(r)),o=[];i.toLowerCase().includes("range")||o.push("borderless");const l=this.renderInner(Ji(this.props,o)),c=this.wrapPopover(l);return b.createElement("div",Object.assign({},u),c)}};Ze.contextType=Xr;Ze.propTypes={"aria-describedby":p.string,"aria-errormessage":p.string,"aria-invalid":p.bool,"aria-labelledby":p.string,"aria-required":p.bool,borderless:p.bool,type:p.oneOf(P.TYPE_SET),size:p.oneOf(P.SIZE_SET),clearIcon:p.node,density:p.oneOf(P.DENSITY_SET),defaultValue:p.oneOfType([p.string,p.number,p.object,p.array]),value:p.oneOfType([p.string,p.number,p.object,p.array]),defaultPickerValue:p.oneOfType([p.string,p.number,p.object,p.array]),disabledTime:p.func,disabledTimePicker:p.bool,hideDisabledOptions:p.bool,format:p.string,disabled:p.bool,multiple:p.bool,max:p.number,placeholder:p.oneOfType([p.string,p.array]),presets:p.array,presetPosition:p.oneOf(P.PRESET_POSITION_SET),onChange:p.func,onChangeWithDateFirst:p.bool,weekStartsOn:p.number,disabledDate:p.func,timePickerOpts:p.object,showClear:p.bool,onOpenChange:p.func,open:p.bool,defaultOpen:p.bool,motion:p.oneOfType([p.bool,p.func,p.object]),className:p.string,prefixCls:p.string,prefix:p.node,insetLabel:p.node,insetLabelId:p.string,zIndex:p.number,position:p.oneOf(Gr.POSITION_SET),getPopupContainer:p.func,onCancel:p.func,onConfirm:p.func,needConfirm:p.bool,inputStyle:p.object,timeZone:p.oneOfType([p.string,p.number]),triggerRender:p.func,stopPropagation:p.oneOfType([p.bool,p.string]),autoAdjustOverflow:p.bool,onBlur:p.func,onFocus:p.func,onClear:p.func,style:p.object,autoFocus:p.bool,inputReadOnly:p.bool,validateStatus:p.oneOf(P.STATUS),renderDate:p.func,renderFullDate:p.func,spacing:p.oneOfType([p.number,p.object]),startDateOffset:p.func,endDateOffset:p.func,autoSwitchDate:p.bool,dropdownClassName:p.string,dropdownStyle:p.object,dropdownMargin:p.oneOfType([p.number,p.object]),topSlot:p.node,bottomSlot:p.node,dateFnsLocale:p.object,syncSwitchMonth:p.bool,onPanelChange:p.func,rangeSeparator:p.string,rangeSeparatorNode:p.node,preventScroll:p.bool,yearAndMonthOpts:p.object,onClickOutSide:p.func};Ze.__SemiComponentName__="DatePicker";Ze.defaultProps=Qi(Ze.__SemiComponentName__,{onChangeWithDateFirst:!0,borderless:!1,autoAdjustOverflow:!0,stopPropagation:!0,motion:!0,prefixCls:N.PREFIX,presetPosition:"bottom",zIndex:Br.DEFAULT_Z_INDEX,type:"date",size:"default",density:"default",multiple:!1,defaultOpen:!1,disabledHours:Q,disabledMinutes:Q,disabledSeconds:Q,hideDisabledOptions:!1,onBlur:Q,onFocus:Q,onClear:Q,onCancel:Q,onConfirm:Q,onChange:Q,onOpenChange:Q,onPanelChange:Q,onPresetClick:Q,weekStartsOn:ut.WEEK_START_ON,disabledDate:Tt,disabledTime:Tt,inputReadOnly:!1,spacing:ut.SPACING,autoSwitchDate:!0,syncSwitchMonth:!1,rangeSeparator:P.DEFAULT_SEPARATOR_RANGE,insetInput:!1,onClickOutSide:Q});const Sl=ds(b.forwardRef((s,e)=>{const t=Object.assign({},s),{type:n,format:a,rangeSeparator:i}=t;return typeof a=="string"&&a&&(/[Hhms]+/.test(a)||(n==="dateTime"?t.type="date":n==="dateTimeRange"&&(t.type="dateRange"))),i&&typeof i=="string"&&(t.rangeSeparator=` ${i.trim()} `),t.insetInput&&(t.position||(t.position=P.POSITION_INLINE_INPUT),t.position.includes("Over")&&!t.spacing&&(t.spacing=ut.SPACING_INSET_INPUT)),b.createElement(Xr.Consumer,null,r=>{let{timeZone:u}=r;return b.createElement(zr,{componentName:"DatePicker"},(o,l,c)=>b.createElement(Ze,Object.assign({timeZone:u,localeCode:l,locale:o,dateFnsLocale:c},t,{ref:e})))})}),Ze);function mt(){return{totalInput:0,totalOutput:0,totalCacheWrite:0,totalCacheRead:0}}async function xl(){const s=await fetch(`${Jr}/token-history`);if(!s.ok)throw new Error(`HTTP ${s.status}`);const e=await s.json(),n=(e.history??[]).map(o=>{const l=Number(o.ts??0);return{id:String(o.sessionId??o.id??""),title:String(o.title??""),input:Number(o.input??0),output:Number(o.output??0),cacheWrite:Number(o.cacheCreate??o.cacheWrite??0),cacheRead:Number(o.cacheRead??0),model:String(o.model??""),ts:l<1e12?l*1e3:l,deleted:o.deleted}}),a=e.snap??{},i=Object.values(a).reduce((o,l)=>({totalInput:o.totalInput+(l.input??0),totalOutput:o.totalOutput+(l.output??0),totalCacheWrite:o.totalCacheWrite+(l.cacheCreate??l.cacheWrite??0),totalCacheRead:o.totalCacheRead+(l.cacheRead??0)}),mt()),r=e.conductorLast,u=r?{totalInput:r.input??0,totalOutput:r.output??0,totalCacheWrite:r.cacheCreate??0,totalCacheRead:r.cacheRead??0}:void 0;return{history:n,snap:i,conductorSnapshot:u}}async function Ml(){const s=await fetch(`${fs}/token-stats`);if(!s.ok)throw new Error(`HTTP ${s.status}`);return(await s.json()).records??[]}async function kl(){const s=await fetch(`${Jr}/token-stats`);if(!s.ok)throw new Error(`HTTP ${s.status}`);return(await s.json()).records??[]}const Nl=15e3;let ht=null;const de=hs((s,e)=>(wa("token.snapshot",t=>{const n=t;n.snap&&s({snapshot:n.snap}),n.history&&s({history:n.history,loading:!1})}),wa("token.changed",t=>{const n=t;n.entry&&s(a=>({history:[...a.history,n.entry],snapshot:{totalInput:a.snapshot.totalInput+n.entry.input,totalOutput:a.snapshot.totalOutput+n.entry.output,totalCacheWrite:a.snapshot.totalCacheWrite+n.entry.cacheWrite,totalCacheRead:a.snapshot.totalCacheRead+n.entry.cacheRead}}))}),{history:[],snapshot:mt(),loading:!0,error:null,conductorHistory:[],conductorSnapshot:mt(),conductorLoading:!1,conductorOffline:!1,dateRange:[null,null],async fetchHistory(){s({loading:!0,error:null});try{const t=await xl();s({history:t.history,snapshot:t.snap,loading:!1}),t.conductorSnapshot&&s({conductorSnapshot:t.conductorSnapshot})}catch(t){s({loading:!1,error:t.message})}},async fetchConductorHistory(){s({conductorLoading:!0});try{const n=(await Ml()).map((i,r)=>({id:`cond-${r}`,title:i.thread||`Conductor ${r+1}`,input:i.input,output:i.output,cacheWrite:i.cacheCreate,cacheRead:i.cacheRead,model:i.model,ts:Date.now()})),a=n.reduce((i,r)=>({totalInput:i.totalInput+r.input,totalOutput:i.totalOutput+r.output,totalCacheWrite:i.totalCacheWrite+r.cacheWrite,totalCacheRead:i.totalCacheRead+r.cacheRead}),mt());s({conductorHistory:n,conductorSnapshot:a,conductorLoading:!1,conductorOffline:!1})}catch{s({conductorLoading:!1,conductorOffline:!0})}},async fetchLiveStats(){try{const n=(await kl()).reduce((a,i)=>({totalInput:a.totalInput+i.input,totalOutput:a.totalOutput+i.output,totalCacheWrite:a.totalCacheWrite+i.cacheCreate,totalCacheRead:a.totalCacheRead+i.cacheRead}),mt());s({snapshot:n})}catch{}},startPolling(){ht||(ht=setInterval(()=>{e().fetchHistory()},Nl))},stopPolling(){ht&&(clearInterval(ht),ht=null)},setDateRange(t){s({dateRange:t})},resetFilters(){s({dateRange:[null,null]})}}));function vt(s){return s>=1e6?`${(s/1e6).toFixed(1)}M`:s>=1e3?`${(s/1e3).toFixed(1)}K`:String(s)}function Rn(s){return s>=1e6?`${(s/1e6).toFixed(2)}M`:s>=1e3?`${(s/1e3).toFixed(1)}K`:String(s)}function Ai({snapshot:s,history:e,cards:t}){const{t:n}=lt(),a=de(m=>m.snapshot),i=de(m=>m.history),r=de(m=>m.dateRange),u=s??a,o=e??i,l=J.useMemo(()=>{const[m,g]=r;if(!s&&(m||g)){const y=o.filter(R=>{const C=R.ts<1e12?R.ts*1e3:R.ts;return!(m&&Cg.getTime())}),D=y.reduce((R,C)=>R+C.input,0),_=y.reduce((R,C)=>R+C.output,0),I=y.reduce((R,C)=>R+C.cacheWrite,0),x=y.reduce((R,C)=>R+C.cacheRead,0);return{totalInput:D,totalOutput:_,totalCacheWrite:I,totalCacheRead:x}}return u},[o,u,r,s]),c=J.useMemo(()=>{const m=new Date;m.setHours(0,0,0,0);const g=m.getTime();return o.filter(T=>(T.ts<1e12?T.ts*1e3:T.ts)>=g).reduce((T,y)=>T+y.input+y.output,0)},[o]),d=l.totalInput+l.totalOutput,f=l.totalInput+l.totalCacheWrite+l.totalCacheRead,h=f>0?(l.totalCacheRead/f*100).toFixed(1):"0",v=[{labelKey:"tok.total",value:vt(d)},{labelKey:"tok.cost",value:`${h}%`},{labelKey:"tok.today",value:vt(c)}],w=t??v;return A.jsx("div",{className:"ga-token-stats",children:w.map(m=>A.jsxs("div",{className:"ga-token-stat-card","data-testid":`token-stat-${m.labelKey}`,children:[A.jsx("div",{className:"ga-token-stat-label",children:n(m.labelKey)}),A.jsx("div",{className:"ga-token-stat-value","data-testid":`token-stat-value-${m.labelKey}`,children:m.value})]},m.labelKey))})}function Al(s,e){const t=new Map;for(const n of s){const a=n.id,i=t.get(a);if(i)i.input+=n.input,i.output+=n.output,i.cacheWrite+=n.cacheWrite,i.cacheRead+=n.cacheRead,n.ts>i.ts&&(i.ts=n.ts),n.deleted&&(i.deleted=!0);else{const r=e.get(n.id);t.set(a,{id:n.id,title:r||n.title||n.id,input:n.input,output:n.output,cacheWrite:n.cacheWrite,cacheRead:n.cacheRead,model:n.model,ts:n.ts,deleted:n.deleted})}}return[...t.values()]}function Fi({dataSource:s,loading:e}){const{t}=lt(),n=de(f=>f.history),a=de(f=>f.loading),i=de(f=>f.dateRange),r=ps(f=>f.sessions),u=s??n,o=e??a,l=J.useMemo(()=>{const f=new Map;for(const h of r)h.title&&f.set(h.id,h.title);return f},[r]),c=J.useMemo(()=>{let f=u;if(!s){const[v,w]=i;(v||w)&&(f=f.filter(m=>{const g=m.ts<1e12?m.ts*1e3:m.ts;return!(v&&gw.getTime())}))}const h=Al(f,l);return h.sort((v,w)=>w.ts-v.ts),h},[u,i,s,l]),d=[{title:t("tok.colSession"),dataIndex:"title",key:"title",render:(f,h)=>A.jsxs("span",{style:{display:"flex",alignItems:"center",gap:6},children:[A.jsx("span",{children:h.title||h.id}),h.deleted&&A.jsx(ms,{size:"small",color:"orange",type:"ghost",children:t("tok.deleted")})]})},{title:t("tok.colIn"),dataIndex:"input",key:"input",width:100,sorter:(f,h)=>((f==null?void 0:f.input)??0)-((h==null?void 0:h.input)??0),render:(f,h)=>A.jsx("span",{className:"ga-token-mono",children:Rn(h.input)})},{title:t("tok.colOut"),dataIndex:"output",key:"output",width:100,sorter:(f,h)=>((f==null?void 0:f.output)??0)-((h==null?void 0:h.output)??0),render:(f,h)=>A.jsx("span",{className:"ga-token-mono",children:Rn(h.output)})},{title:t("tok.colCacheW"),dataIndex:"cacheWrite",key:"cacheWrite",width:110,sorter:(f,h)=>((f==null?void 0:f.cacheWrite)??0)-((h==null?void 0:h.cacheWrite)??0),render:(f,h)=>A.jsx("span",{className:"ga-token-mono",children:Rn(h.cacheWrite)})},{title:t("tok.colCache"),dataIndex:"cacheRead",key:"cacheRead",width:110,sorter:(f,h)=>((f==null?void 0:f.cacheRead)??0)-((h==null?void 0:h.cacheRead)??0),render:(f,h)=>A.jsx("span",{className:"ga-token-mono",children:Rn(h.cacheRead)})},{title:t("tok.cost"),key:"cacheRate",width:100,render:(f,h)=>{const v=h.input+h.cacheWrite+h.cacheRead,w=v>0?(h.cacheRead/v*100).toFixed(1):"0";return A.jsxs("span",{className:"ga-token-mono",children:[w,"%"]})}}];return!o&&c.length===0?A.jsx(ei,{description:t("tok.noData"),style:{marginTop:32}}):A.jsx(os,{columns:d,dataSource:c,rowKey:"id",loading:o,pagination:{pageSize:15,showTotal:!0},size:"small",bordered:!1})}function Fl(){const{t:s}=lt(),e=de(a=>a.dateRange),t=de(a=>a.setDateRange),n=de(a=>a.resetFilters);return A.jsxs("div",{className:"ga-token-filter",children:[A.jsx(Sl,{type:"dateTimeRange",value:e[0]&&e[1]?[e[0],e[1]]:void 0,onChange:a=>{Array.isArray(a)&&a.length===2?t([a[0]?new Date(a[0]):null,a[1]?new Date(a[1]):null]):t([null,null])},placeholder:[s("tok.from"),s("tok.to")],density:"compact",style:{width:340}}),A.jsx(yt,{size:"small",icon:A.jsx(gs,{}),theme:"borderless",onClick:n,children:s("tok.reset")})]})}function Yl(){const{t:s}=lt(),e=de(n=>n.conductorHistory),t=de(n=>n.conductorLoading);return!t&&e.length===0?A.jsx(ei,{description:s("tok.noData"),style:{marginTop:32}}):t?A.jsx("div",{className:"ga-token-loading",children:A.jsx(ys,{})}):A.jsx(Fi,{dataSource:e,loading:!1})}function Ll(){const{t:s}=lt(),e=de(i=>i.fetchConductorHistory),t=de(i=>i.conductorOffline),n=de(i=>i.conductorSnapshot);J.useEffect(()=>{e()},[e]);const a=J.useMemo(()=>{const i=n.totalInput+n.totalOutput;return[{labelKey:"tok.condTotal",value:vt(i)},{labelKey:"tok.colIn",value:vt(n.totalInput)},{labelKey:"tok.colOut",value:vt(n.totalOutput)}]},[n]);return A.jsxs("div",{className:"ga-token-content",children:[A.jsx(Da,{type:"info",description:s("tok.condTip"),style:{marginBottom:12}}),t?A.jsx(Da,{type:"warning",description:s("tok.condOffline")}):A.jsxs(A.Fragment,{children:[A.jsx(Ai,{cards:a}),A.jsx(Yl,{})]})]})}function zl(){const{t:s}=lt(),e=de(a=>a.fetchHistory),t=de(a=>a.startPolling),n=de(a=>a.stopPolling);return J.useEffect(()=>(e(),t(),()=>n()),[e,t,n]),A.jsxs("div",{className:"ga-token-page",children:[A.jsxs(us,{type:"line",defaultActiveKey:"chat",children:[A.jsx(Ta,{tab:s("tok.tabAll"),itemKey:"chat",children:A.jsxs("div",{className:"ga-token-content",children:[A.jsx(Ai,{}),A.jsx(Fl,{}),A.jsx(Fi,{})]})}),A.jsx(Ta,{tab:s("tok.tabConductor"),itemKey:"conductor",children:A.jsx(Ll,{})})]}),A.jsx("div",{className:"ga-token-disclaimer",children:s("tok.disclaimer")})]})}export{zl as TokenPage}; diff --git a/frontends/desktop/dist/assets/TokenPage-DwLDOw_j.css b/frontends/desktop/dist/assets/TokenPage-DwLDOw_j.css new file mode 100644 index 000000000..7a68d9948 --- /dev/null +++ b/frontends/desktop/dist/assets/TokenPage-DwLDOw_j.css @@ -0,0 +1 @@ +.semi-scrolllist{width:100%;height:100%;background:var(--semi-color-bg-3);box-shadow:0 0 1px #0000004d,0 4px 14px #0000001a;border-radius:var(--semi-border-radius-medium);overflow:hidden;font-size:14px;line-height:20px;font-family:Inter,-apple-system,BlinkMacSystemFont,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Segoe UI,Helvetica Neue,Helvetica,Arial,sans-serif;-webkit-user-select:none;user-select:none;display:flex;flex-direction:column}.semi-scrolllist-header{text-align:center;padding:0 16px;background:transparent}.semi-scrolllist-header-title{padding:16px 0;font-weight:600;color:var(--semi-color-text-0);font-size:14px;line-height:20px;font-family:Inter,-apple-system,BlinkMacSystemFont,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Segoe UI,Helvetica Neue,Helvetica,Arial,sans-serif}.semi-scrolllist-body{display:flex;height:300px;padding:0 16px;overflow:hidden}.semi-scrolllist-body .semi-scrolllist-item-wheel .semi-scrolllist-list-outer-nocycle>ul:before,.semi-scrolllist-body .semi-scrolllist-item>ul:before{content:"";display:block;width:100%;height:132px}.semi-scrolllist-body .semi-scrolllist-item{position:relative;flex:1;overflow-x:hidden;overflow-y:auto}.semi-scrolllist-body .semi-scrolllist-item:not(:last-child){border-right:1px solid var(--semi-color-border)}.semi-scrolllist-body .semi-scrolllist-item>ul,.semi-scrolllist-body .semi-scrolllist-item-wheel .semi-scrolllist-list-outer>ul{box-sizing:border-box;width:100%;margin:0;padding:0 0 132px;list-style:none}.semi-scrolllist-body .semi-scrolllist-item>ul>li,.semi-scrolllist-body .semi-scrolllist-item-wheel .semi-scrolllist-list-outer>ul>li{list-style:none;height:36px;box-sizing:border-box;color:var(--semi-color-text-0);text-align:center;display:flex;align-items:center;justify-content:center;cursor:pointer;background-color:transparent;transition:background-color var(--semi-transition_duration-none) var(--semi-transition_function-easeOut) 0ms}.semi-scrolllist-body .semi-scrolllist-item>ul>li.semi-scrolllist-item-sel,.semi-scrolllist-body .semi-scrolllist-item-wheel .semi-scrolllist-list-outer>ul>li.semi-scrolllist-item-sel{background:var(--semi-color-primary-light-default);color:var(--semi-color-text-0)}.semi-scrolllist-body .semi-scrolllist-item>ul>li.semi-scrolllist-item-sel>svg,.semi-scrolllist-body .semi-scrolllist-item-wheel .semi-scrolllist-list-outer>ul>li.semi-scrolllist-item-sel>svg{color:var(--semi-color-text-2);width:16px;height:16px;margin-right:12px}.semi-scrolllist-body .semi-scrolllist-item>ul>li:not(.disabled):not(.semi-scrolllist-item-disabled):not(.semi-scrolllist-item-sel):not(.semi-scrolllist-item-selected),.semi-scrolllist-body .semi-scrolllist-item-wheel .semi-scrolllist-list-outer>ul>li:not(.disabled):not(.semi-scrolllist-item-disabled):not(.semi-scrolllist-item-sel):not(.semi-scrolllist-item-selected){cursor:pointer}.semi-scrolllist-body .semi-scrolllist-item>ul>li:not(.disabled):not(.semi-scrolllist-item-disabled):not(.semi-scrolllist-item-sel):not(.semi-scrolllist-item-selected):hover,.semi-scrolllist-body .semi-scrolllist-item-wheel .semi-scrolllist-list-outer>ul>li:not(.disabled):not(.semi-scrolllist-item-disabled):not(.semi-scrolllist-item-sel):not(.semi-scrolllist-item-selected):hover{background-color:var(--semi-color-fill-1)}.semi-scrolllist-body .semi-scrolllist-item>ul>li:not(.disabled):not(.semi-scrolllist-item-disabled):not(.semi-scrolllist-item-sel):not(.semi-scrolllist-item-selected):active,.semi-scrolllist-body .semi-scrolllist-item-wheel .semi-scrolllist-list-outer>ul>li:not(.disabled):not(.semi-scrolllist-item-disabled):not(.semi-scrolllist-item-sel):not(.semi-scrolllist-item-selected):active{background-color:var(--semi-color-fill-2)}.semi-scrolllist-body .semi-scrolllist-item>ul>li.semi-scrolllist-item-disabled,.semi-scrolllist-body .semi-scrolllist-item-wheel .semi-scrolllist-list-outer>ul>li.semi-scrolllist-item-disabled{color:var(--semi-color-disabled-text);cursor:not-allowed}.semi-scrolllist-body .semi-scrolllist-item-wheel{position:relative;flex:1;overflow:hidden}.semi-scrolllist-body .semi-scrolllist-item-wheel:not(:last-child){border-right:1px solid var(--semi-color-border)}.semi-scrolllist-body .semi-scrolllist-item-wheel .semi-scrolllist-item-selected{font-weight:600;color:var(--semi-color-primary)!important}.semi-scrolllist-body .semi-scrolllist-item-wheel .semi-scrolllist-list-outer{overflow-x:hidden;overflow-y:auto;height:100%;width:100%;padding-right:18px}.semi-scrolllist-body .semi-scrolllist-item-wheel .semi-scrolllist-shade{width:100%;height:50%;pointer-events:none;position:absolute}.semi-scrolllist-body .semi-scrolllist-item-wheel .semi-scrolllist-shade-pre{top:0;margin-top:-19px;background:var(--semi-color-bg-3);opacity:.5}.semi-scrolllist-body .semi-scrolllist-item-wheel .semi-scrolllist-shade-post{top:50%;margin-top:19px;background:var(--semi-color-bg-3);opacity:.5}.semi-scrolllist-body .semi-scrolllist-item-wheel .semi-scrolllist-selector{pointer-events:none;position:absolute;top:50%;border-top:1px solid var(--semi-color-border);border-bottom:1px solid var(--semi-color-border);height:36px;width:100%;transform:translateY(-50%)}.semi-scrolllist .semi-scrolllist-footer{border-top:1px solid var(--semi-color-border);padding:10px}.semi-scrolllist .semi-scrolllist-line{background:var(--semi-color-border);height:1px}.semi-rtl .semi-scrolllist,.semi-portal-rtl .semi-scrolllist{direction:rtl}.semi-rtl .semi-scrolllist-body .semi-scrolllist-item:not(:last-child),.semi-portal-rtl .semi-scrolllist-body .semi-scrolllist-item:not(:last-child){border-right:0;border-left:1px solid var(--semi-color-border)}.semi-rtl .semi-scrolllist-body .semi-scrolllist-item>ul>li.semi-scrolllist-item-sel>svg,.semi-rtl .semi-scrolllist-body .semi-scrolllist-item-wheel .semi-scrolllist-list-outer>ul>li.semi-scrolllist-item-sel>svg,.semi-portal-rtl .semi-scrolllist-body .semi-scrolllist-item>ul>li.semi-scrolllist-item-sel>svg,.semi-portal-rtl .semi-scrolllist-body .semi-scrolllist-item-wheel .semi-scrolllist-list-outer>ul>li.semi-scrolllist-item-sel>svg{margin-right:0;margin-left:12px}.semi-rtl .semi-scrolllist-body .semi-scrolllist-item-wheel:not(:last-child),.semi-portal-rtl .semi-scrolllist-body .semi-scrolllist-item-wheel:not(:last-child){border-right:0;border-left:1px solid var(--semi-color-border)}.semi-rtl .semi-scrolllist-body .semi-scrolllist-item-wheel .semi-scrolllist-list-outer,.semi-portal-rtl .semi-scrolllist-body .semi-scrolllist-item-wheel .semi-scrolllist-list-outer{padding-right:0;padding-left:18px}.semi-datepicker{box-sizing:border-box;display:inline-block}.semi-datepicker-container{display:flex}.semi-datepicker .semi-scrolllist-body .semi-scrolllist-item{-ms-overflow-style:none;scrollbar-width:none}.semi-datepicker .semi-scrolllist-body .semi-scrolllist-item::-webkit-scrollbar{display:none;width:0;height:0}.semi-datepicker .semi-scrolllist-body .semi-scrolllist-list-outer{-ms-overflow-style:none;scrollbar-width:none}.semi-datepicker .semi-scrolllist-body .semi-scrolllist-list-outer::-webkit-scrollbar{display:none;width:0;height:0}.semi-datepicker-month-grid{-webkit-user-select:none;user-select:none;display:flex}.semi-datepicker-month-grid-left,.semi-datepicker-month-grid-right{position:relative;padding:0;display:inline-flex;flex-direction:column;justify-content:flex-start}.semi-datepicker-month-grid[x-type=date] .semi-datepicker-yam,.semi-datepicker-month-grid[x-type=dateRange] .semi-datepicker-yam{height:100%}.semi-datepicker-month-grid[x-type=dateTime] .semi-datepicker-yam,.semi-datepicker-month-grid[x-type=dateTimeRange] .semi-datepicker-yam{height:calc(100% - 54px)}.semi-datepicker-month-grid .semi-datepicker-yam-showing{min-height:378px;min-width:284px}.semi-datepicker-month-grid[x-type=date] .semi-datepicker-yam-showing{min-height:325px}.semi-datepicker-month-grid[x-insetinput=true] .semi-datepicker-month-grid-left[x-open-type=year],.semi-datepicker-month-grid[x-insetinput=true] .semi-datepicker-month-grid-right[x-open-type=year],.semi-datepicker-month-grid[x-insetinput=true] .semi-datepicker-month-grid-left[x-open-type=time],.semi-datepicker-month-grid[x-insetinput=true] .semi-datepicker-month-grid-right[x-open-type=time]{min-height:317px}.semi-datepicker-month-grid[x-insetinput=true] .semi-datepicker-navigation{padding-top:8px;padding-bottom:8px}.semi-datepicker-month-grid[x-insetinput=true] .semi-datepicker-tpk{min-height:100%}.semi-datepicker-month-grid[x-insetinput=true][x-type=dateTime] .semi-datepicker-yam,.semi-datepicker-month-grid[x-insetinput=true][x-type=dateTimeRange] .semi-datepicker-yam{height:100%}.semi-datepicker-month-grid[x-preset-position=left][x-insetinput=false] .semi-datepicker-month,.semi-datepicker-month-grid[x-preset-position=right][x-insetinput=false] .semi-datepicker-month{height:253px}.semi-datepicker-month-grid .semi-datepicker-yearmonth-header{background:var(--semi-color-bg-3);padding:12px 16px;border-bottom:1px solid var(--semi-color-border);border-radius:var(--semi-border-radius-medium) var(--semi-border-radius-medium) 0 0;display:flex;align-items:center}.semi-datepicker-month-grid .semi-scrolllist{background:var(--semi-color-bg-3);position:relative;box-shadow:none;height:auto;width:100%;height:100%;overflow:hidden;flex:1}.semi-datepicker-month-grid .semi-scrolllist-header,.semi-datepicker-month-grid .semi-scrolllist-body{box-sizing:border-box;width:100%}.semi-datepicker-month-grid .semi-scrolllist-header{border-bottom:1px solid var(--semi-color-border);padding:16px}.semi-datepicker-month-grid .semi-scrolllist-body{height:100%;overflow:hidden;padding:0;flex:1}.semi-datepicker-month-grid .semi-scrolllist-line{display:none}.semi-datepicker-month-grid .semi-scrolllist-header-title{padding:0;font-size:14px;line-height:20px;font-family:Inter,-apple-system,BlinkMacSystemFont,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Segoe UI,Helvetica Neue,Helvetica,Arial,sans-serif;min-height:24px;line-height:24px}.semi-datepicker-month-grid[x-panel-yearandmonth-open-type=left] .semi-datepicker-weeks,.semi-datepicker-month-grid[x-panel-yearandmonth-open-type=right] .semi-datepicker-weeks{min-height:216px}.semi-datepicker-panel-yam{max-width:484px}.semi-datepicker-panel-yam[x-type=monthRange]{max-width:584px}.semi-datepicker-panel-yam .semi-datepicker-yearmonth-body{display:flex}.semi-datepicker-panel-yam .semi-datepicker-yearmonth-body .semi-scrolllist:nth-child(2){border-left:1px solid var(--semi-color-border)}.semi-datepicker-panel-yam .semi-scrolllist{box-shadow:none;height:266px}.semi-datepicker-panel-yam .semi-scrolllist-list-outer>ul>li{min-width:64px}.semi-datepicker-panel-yam .semi-scrolllist-item>ul>li{min-width:82px}.semi-datepicker-panel-yam .semi-scrolllist-body{padding:0;overflow:hidden}.semi-datepicker-panel-yam .semi-scrolllist-body .semi-scrolllist-item-wheel:not(#neverExistElement){border:none}.semi-datepicker-footer{padding-top:10px;padding-right:8px;padding-bottom:10px;text-align:right;background-color:var(--semi-color-fill-0)}.semi-datepicker-footer .semi-button:first-of-type{margin-right:12px}.semi-datepicker-footer .semi-button:nth-of-type(2){margin-right:8px}.semi-datepicker-yam{position:absolute;top:0;width:100%;display:flex;flex-direction:column;box-sizing:border-box}.semi-datepicker-tpk{position:absolute;top:0;height:calc(100% - 54px);width:100%;display:flex;flex-direction:column}.semi-datepicker-tpk .semi-datepicker-time{height:100%}.semi-datepicker-navigation{display:flex;align-items:center;box-sizing:content-box;height:32px;padding:12px 16px}.semi-datepicker-navigation-left,.semi-datepicker-navigation-right{width:32px;height:32px;display:flex;justify-content:center;align-items:center}.semi-datepicker-navigation .semi-button{color:var(--semi-color-text-2);min-width:32px}.semi-datepicker-navigation-month{font-size:16px;line-height:22px;font-family:Inter,-apple-system,BlinkMacSystemFont,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Segoe UI,Helvetica Neue,Helvetica,Arial,sans-serif;flex-grow:1;text-align:center;font-weight:600;color:var(--semi-color-text-0)}.semi-datepicker-navigation-month .semi-button{color:var(--semi-color-text-0)}.semi-datepicker-month{width:252px;box-sizing:content-box;padding:0 16px 16px}.semi-datepicker-weekday{font-size:12px;line-height:16px;font-family:Inter,-apple-system,BlinkMacSystemFont,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Segoe UI,Helvetica Neue,Helvetica,Arial,sans-serif;font-weight:600;color:var(--semi-color-text-2);border-bottom:1px solid var(--semi-color-border)}.semi-datepicker-weekday-item{width:36px;height:36px;line-height:36px;text-align:center;display:inline-block}.semi-datepicker-weeks{color:var(--semi-color-text-0)}.semi-datepicker-week{display:flex;align-items:center}.semi-datepicker-day{box-sizing:border-box;display:inline-block;width:36px;height:36px;display:flex;justify-content:center;align-items:center;cursor:pointer}.semi-datepicker-day-main{display:flex;justify-content:center;align-items:center;width:32px;height:32px;margin:0 auto;box-sizing:border-box;border-radius:var(--semi-border-radius-small)}.semi-datepicker-day-main:hover{background-color:var(--semi-color-fill-0)}.semi-datepicker-day-main:active{background-color:var(--semi-color-fill-1)}.semi-datepicker-day-today .semi-datepicker-day-main{color:var(--semi-color-primary);background-color:var(--semi-color-fill-0);font-weight:600}.semi-datepicker-day-today.semi-datepicker-day-disabled .semi-datepicker-day-main{color:var(--semi-color-primary-disabled)}.semi-datepicker-day-inrange .semi-datepicker-day-main,.semi-datepicker-day-inhover .semi-datepicker-day-main,.semi-datepicker-day-inoffsetrange .semi-datepicker-day-main,.semi-datepicker-day-hoverday .semi-datepicker-day-main,.semi-datepicker-day-selectedrange-hover .semi-datepicker-day-main,.semi-datepicker-day-hoverday-around-singleselected .semi-datepicker-day-main{border-radius:0;margin-left:0;margin-right:0;width:36px}.semi-datepicker-day-selected .semi-datepicker-day-main,.semi-datepicker-day-selected-start.semi-datepicker-day-selected-end .semi-datepicker-day-main,.semi-datepicker-day-offsetrange-start.semi-datepicker-day-offsetrange-end .semi-datepicker-day-main{border-radius:var(--semi-border-radius-small)}.semi-datepicker-day-offsetrange-start .semi-datepicker-day-main{border-radius:var(--semi-border-radius-small) 0 0 var(--semi-border-radius-small)}.semi-datepicker-day-offsetrange-end .semi-datepicker-day-main{border-radius:0 var(--semi-border-radius-small) var(--semi-border-radius-small) 0}.semi-datepicker-day-hoverday-beforerange .semi-datepicker-day-main{border-radius:var(--semi-border-radius-small) 0 0 var(--semi-border-radius-small)}.semi-datepicker-day-hoverday-afterrange .semi-datepicker-day-main{border-radius:0 var(--semi-border-radius-small) var(--semi-border-radius-small) 0}.semi-datepicker-day-selected-start .semi-datepicker-day-main,.semi-datepicker-day-offsetrange-start .semi-datepicker-day-main{width:34px;margin-left:2px;margin-right:0;border-radius:var(--semi-border-radius-small) 0 0 var(--semi-border-radius-small)}.semi-datepicker-day-selected-end .semi-datepicker-day-main,.semi-datepicker-day-offsetrange-end .semi-datepicker-day-main{width:34px;margin-right:2px;margin-left:0;border-radius:0 var(--semi-border-radius-small) var(--semi-border-radius-small) 0}.semi-datepicker-day-hoverday-inrange .semi-datepicker-day-main{border-radius:0}.semi-datepicker-day-inoffsetrange .semi-datepicker-day-main,.semi-datepicker-day-offsetrange-start .semi-datepicker-day-main,.semi-datepicker-day-offsetrange-end .semi-datepicker-day-main{background-color:var(--semi-color-fill-0)}.semi-datepicker-day-hoverday .semi-datepicker-day-main,.semi-datepicker-day-hoverday-offset .semi-datepicker-day-main{background-color:var(--semi-color-fill-1)}.semi-datepicker-day-inrange .semi-datepicker-day-main,.semi-datepicker-day-inhover .semi-datepicker-day-main{background-color:var(--semi-color-primary-light-default)}.semi-datepicker-day-hoverday-inrange .semi-datepicker-day-main,.semi-datepicker-day-hoverday-beforerange .semi-datepicker-day-main,.semi-datepicker-day-hoverday-afterrange .semi-datepicker-day-main,.semi-datepicker-day-hoverday-around-singleselected .semi-datepicker-day-main{background-color:var(--semi-color-primary-light-active)}.semi-datepicker-day-selected .semi-datepicker-day-main,.semi-datepicker-day-selected-start .semi-datepicker-day-main,.semi-datepicker-day-selected-end .semi-datepicker-day-main{background-color:var(--semi-color-primary);color:var(--semi-color-white)}.semi-datepicker-day-selected .semi-datepicker-day-main:hover,.semi-datepicker-day-selected-start .semi-datepicker-day-main:hover,.semi-datepicker-day-selected-end .semi-datepicker-day-main:hover{background-color:var(--semi-color-primary)}.semi-datepicker-day-selectedrange-hover .semi-datepicker-day-main{background-color:var(--semi-color-primary-light-hover)}.semi-datepicker-day-selected-start-afterhover .semi-datepicker-day-main,.semi-datepicker-day-selected-end-beforehover .semi-datepicker-day-main{border:1px solid var(--semi-color-primary-active)}.semi-datepicker-day-disabled{cursor:not-allowed;color:var(--semi-color-disabled-text)}.semi-datepicker-day-disabled .semi-datepicker-day-main:hover,.semi-datepicker-day-disabled .semi-datepicker-day-main:active{background-color:transparent}.semi-datepicker-day-disabled.semi-datepicker-day-selected .semi-datepicker-day-main,.semi-datepicker-day-disabled.semi-datepicker-day-selected-start .semi-datepicker-day-main,.semi-datepicker-day-disabled.semi-datepicker-day-selected-end .semi-datepicker-day-main,.semi-datepicker-day-disabled.semi-datepicker-day-inhover .semi-datepicker-day-main,.semi-datepicker-day-disabled.semi-datepicker-day-inrange .semi-datepicker-day-main,.semi-datepicker-day-disabled.semi-datepicker-day-inoffsetrange .semi-datepicker-day-main,.semi-datepicker-day-disabled.semi-datepicker-day-hoverday .semi-datepicker-day-main,.semi-datepicker-day-disabled.semi-datepicker-day-hoverday-offset .semi-datepicker-day-main,.semi-datepicker-day-disabled.semi-datepicker-day-offsetrange-start .semi-datepicker-day-main,.semi-datepicker-day-disabled.semi-datepicker-day-offsetrange-end .semi-datepicker-day-main,.semi-datepicker-day-disabled.semi-datepicker-day-selectedrange-hover .semi-datepicker-day-main{background-color:var(--semi-color-disabled-fill);color:var(--semi-color-disabled-text)}.semi-datepicker-switch{text-align:center;display:flex;border-top:1px solid var(--semi-color-border);margin-top:auto}.semi-datepicker-switch-date,.semi-datepicker-switch-time{width:50%;cursor:pointer;padding-top:16px;padding-bottom:16px;display:flex;justify-content:center;align-items:center;color:var(--semi-color-text-2)}.semi-datepicker-switch-date:not(.semi-datepicker-switch-time-disabled):hover,.semi-datepicker-switch-time:not(.semi-datepicker-switch-time-disabled):hover{background-color:var(--semi-color-fill-0)}.semi-datepicker-switch-date-active,.semi-datepicker-switch-time-active{color:var(--semi-color-text-0);font-weight:600;cursor:auto}.semi-datepicker-switch-date-active:hover,.semi-datepicker-switch-time-active:hover{background-color:inherit}.semi-datepicker-switch-date-disabled,.semi-datepicker-switch-time-disabled{cursor:not-allowed}.semi-datepicker-switch-text{padding-left:8px}.semi-datepicker-time .semi-jumperlist{box-shadow:none;border-radius:0}.semi-datepicker-quick-control{box-sizing:border-box;background-color:transparent}.semi-datepicker-quick-control-header{padding:18px 12px 0;font-weight:600}.semi-datepicker-quick-control-left{border-right:1px solid var(--semi-color-border)}.semi-datepicker-quick-control-right{border-left:1px solid var(--semi-color-border)}.semi-datepicker-quick-control-top{border-bottom:1px solid var(--semi-color-border)}.semi-datepicker-quick-control-bottom{border-top:1px solid var(--semi-color-border)}.semi-datepicker-quick-control-left-content-wrapper,.semi-datepicker-quick-control-right-content-wrapper{max-width:200px;margin-top:14px;overflow-y:auto}.semi-datepicker-quick-control-top-content-wrapper,.semi-datepicker-quick-control-bottom-content-wrapper{overflow-y:auto;max-height:100px}.semi-datepicker-quick-control-left-content,.semi-datepicker-quick-control-right-content{box-sizing:border-box;display:grid;align-content:flex-start;grid-gap:8px;grid-template-columns:repeat(2,minmax(76.5px,84px));padding:0 12px 12px}.semi-datepicker-quick-control-left-content-item,.semi-datepicker-quick-control-right-content-item{max-width:84px}.semi-datepicker-quick-control-left-content-item-ellipsis,.semi-datepicker-quick-control-right-content-item-ellipsis{width:68px;color:var(--semi-color-primary)}.semi-datepicker-quick-control-top-content,.semi-datepicker-quick-control-bottom-content{display:grid;grid-gap:8px;grid-template-columns:repeat(3,minmax(70.924px,75.924px));align-content:flex-start;padding:8px 20px}.semi-datepicker-quick-control-top-content-item,.semi-datepicker-quick-control-bottom-content-item{max-width:75.924px}.semi-datepicker-quick-control-top-content-item-ellipsis,.semi-datepicker-quick-control-bottom-content-item-ellipsis{width:59.924px;color:var(--semi-color-primary)}.semi-datepicker-quick-control-top-range-content,.semi-datepicker-quick-control-bottom-range-content{box-sizing:border-box;display:grid;align-content:flex-start;grid-template-columns:repeat(5,minmax(96.2px,99.2px));grid-gap:8px;padding:8px 20px}.semi-datepicker-quick-control-top-range-content-item,.semi-datepicker-quick-control-bottom-range-content-item{max-width:99.2px}.semi-datepicker-quick-control-top-range-content-item-ellipsis,.semi-datepicker-quick-control-bottom-range-content-item-ellipsis{width:83.2px;color:var(--semi-color-primary)}.semi-datepicker-quick-control-top-month-content,.semi-datepicker-quick-control-bottom-month-content{box-sizing:border-box;display:grid;grid-template-columns:repeat(2,minmax(51px,58.5px));grid-gap:8px;align-content:flex-start;padding:8px 20px}.semi-datepicker-quick-control-top-month-content-item,.semi-datepicker-quick-control-bottom-month-content-item{max-width:58.5px}.semi-datepicker-quick-control-top-month-content-item-ellipsis,.semi-datepicker-quick-control-bottom-month-content-item-ellipsis{max-width:42.5px;color:var(--semi-color-primary)}.semi-datepicker-quick-control-month{max-width:284px}.semi-datepicker-quick-control-month[x-insetinput=true] .semi-datepicker-quick-control-right-content-wrapper,.semi-datepicker-quick-control-month[x-insetinput=true] .semi-datepicker-quick-control-left-content-wrapper{max-height:258px}.semi-datepicker-quick-control-month .semi-datepicker-quick-control-right-content-wrapper,.semi-datepicker-quick-control-month .semi-datepicker-quick-control-left-content-wrapper{max-height:214px}.semi-datepicker-quick-control-date{max-width:284px}.semi-datepicker-quick-control-date[x-insetinput=true] .semi-datepicker-quick-control-right-content-wrapper,.semi-datepicker-quick-control-date[x-insetinput=true] .semi-datepicker-quick-control-left-content-wrapper{max-height:309px}.semi-datepicker-quick-control-date .semi-datepicker-quick-control-right-content-wrapper,.semi-datepicker-quick-control-date .semi-datepicker-quick-control-left-content-wrapper{max-height:273px}.semi-datepicker-quick-control-dateTime{max-width:284px}.semi-datepicker-quick-control-dateTime[x-insetinput=true] .semi-datepicker-quick-control-right-content-wrapper,.semi-datepicker-quick-control-dateTime[x-insetinput=true] .semi-datepicker-quick-control-left-content-wrapper{max-height:309px}.semi-datepicker-quick-control-dateTime .semi-datepicker-quick-control-right-content-wrapper,.semi-datepicker-quick-control-dateTime .semi-datepicker-quick-control-left-content-wrapper{max-height:326px}.semi-datepicker-quick-control-dateRange{max-width:568px}.semi-datepicker-quick-control-dateRange[x-insetinput=true] .semi-datepicker-quick-control-right-content-wrapper,.semi-datepicker-quick-control-dateRange[x-insetinput=true] .semi-datepicker-quick-control-left-content-wrapper{max-height:309px}.semi-datepicker-quick-control-dateRange .semi-datepicker-quick-control-right-content-wrapper,.semi-datepicker-quick-control-dateRange .semi-datepicker-quick-control-left-content-wrapper{max-height:273px}.semi-datepicker-quick-control-dateTimeRange{max-width:568px}.semi-datepicker-quick-control-dateTimeRange[x-insetinput=true] .semi-datepicker-quick-control-right-content-wrapper,.semi-datepicker-quick-control-dateTimeRange[x-insetinput=true] .semi-datepicker-quick-control-left-content-wrapper{max-height:309px}.semi-datepicker-quick-control-dateTimeRange .semi-datepicker-quick-control-right-content-wrapper,.semi-datepicker-quick-control-dateTimeRange .semi-datepicker-quick-control-left-content-wrapper{max-height:326px}.semi-datepicker-topSlot{border-bottom:1px solid var(--semi-color-border)}.semi-datepicker-leftSlot{border-right:1px solid var(--semi-color-border)}.semi-datepicker-rightSlot{border-left:1px solid var(--semi-color-border)}.semi-datepicker-bottomSlot{border-top:1px solid var(--semi-color-border)}.semi-datepicker .semi-popover-trigger{width:100%}.semi-datepicker .semi-popover-trigger .semi-input-wrapper{font-size:13px}.semi-datepicker .semi-popover-trigger .semi-input-suffix{color:var(--semi-color-primary)}.semi-datepicker .semi-datepicker-input-readonly{cursor:pointer}.semi-datepicker-inset-input-wrapper{display:flex;flex-wrap:nowrap;justify-content:space-between;box-sizing:border-box;column-gap:8px;padding:12px 16px 0;width:284px}.semi-datepicker-inset-input-wrapper[x-type=dateRange],.semi-datepicker-inset-input-wrapper[x-type=dateTimeRange]{width:568px}.semi-datepicker-inset-input-wrapper[x-type=month]{width:165px}.semi-datepicker-inset-input-wrapper[x-type=monthRange]{width:331px}.semi-datepicker-inset-input-wrapper .semi-input-wrapper{flex:1;flex-shrink:0}.semi-datepicker-inset-input-separator{flex-grow:0;flex-shrink:0;height:32px;line-height:32px;padding:0 4px;color:var(--semi-color-text-3)}.semi-datepicker-range-input{display:flex;align-items:center;box-sizing:border-box;border-radius:var(--semi-border-radius-small);height:32px;color:var(--semi-color-text-2);background-color:var(--semi-color-fill-0);border:0px solid transparent}.semi-datepicker-range-input:hover,.semi-datepicker-range-input:active{border-color:transparent}.semi-datepicker-range-input:focus-within{border-color:transparent}.semi-datepicker-range-input .semi-datepicker-monthRange-input{background-color:transparent}.semi-datepicker-range-input-wrapper{box-sizing:border-box;background-color:transparent;padding:0 8px;height:100%;width:100%;border:1px solid transparent;border-radius:var(--semi-border-radius-small);display:flex;align-items:center}.semi-datepicker-range-input-wrapper .semi-input-wrapper{background-color:transparent;height:fit-content;border:none}.semi-datepicker-range-input-wrapper .semi-input-wrapper:active:not(#neverExistElement){background-color:transparent}.semi-datepicker-range-input-wrapper .semi-input-wrapper:hover:not(#neverExistElement){background-color:transparent}.semi-datepicker-range-input-wrapper-focus{border-color:transparent;background-color:var(--semi-color-fill-1);border-radius:var(--semi-border-radius-small);transition:background-color .16s ease-in-out}.semi-datepicker-range-input-wrapper-focus~.semi-datepicker-range-input-clearbtn{display:flex}.semi-datepicker-range-input-wrapper-focus~.semi-datepicker-range-input-clearbtn~.semi-datepicker-range-input-suffix{display:none}.semi-datepicker-range-input-wrapper .semi-input{padding:2px 4px}.semi-datepicker-range-input-wrapper-icon{flex-shrink:0}.semi-datepicker-range-input-wrapper:hover{background-color:var(--semi-color-fill-1)}.semi-datepicker-range-input-wrapper-start{border-top-right-radius:0;border-bottom-right-radius:0}.semi-datepicker-range-input-wrapper-start-with-prefix,.semi-datepicker-range-input-wrapper-end{border-radius:0}.semi-datepicker-range-input-wrapper-active{border-color:var(--semi-color-focus-border);background-color:var(--semi-color-fill-1)}.semi-datepicker-range-input-separator{display:flex;align-items:center}.semi-datepicker-range-input-separator-active{color:var(--semi-color-text-0)}.semi-datepicker-range-input-small{height:24px}.semi-datepicker-range-input-large{height:40px}.semi-datepicker-range-input-large .semi-input-default{font-size:16px}.semi-datepicker-range-input:hover .semi-datepicker-range-input-clearbtn{display:flex;cursor:pointer}.semi-datepicker-range-input:hover .semi-datepicker-range-input-clearbtn~.semi-datepicker-range-input-suffix{display:none}.semi-datepicker-range-input:hover .semi-datepicker-range-input-clearbtn:hover{color:var(--semi-color-primary-hover)}.semi-datepicker-range-input-disabled{cursor:not-allowed;color:var(--semi-color-disabled-text);background-color:var(--semi-color-disabled-fill)}.semi-datepicker-range-input-disabled .semi-datepicker-range-input-wrapper:hover{background-color:transparent}.semi-datepicker-range-input-disabled:hover{background-color:var(--semi-color-disabled-fill)}.semi-datepicker-range-input-disabled .semi-datepicker-range-input-prefix,.semi-datepicker-range-input-disabled .semi-datepicker-range-input-suffix,.semi-datepicker-range-input-disabled .semi-datepicker-range-input-clearbtn{color:var(--semi-color-disabled-text)}.semi-datepicker-range-input-warning{background-color:var(--semi-color-warning-light-default)}.semi-datepicker-range-input-warning .semi-datepicker-range-input-wrapper:hover{background-color:var(--semi-color-warning-light-hover)}.semi-datepicker-range-input-warning .semi-datepicker-range-input-wrapper-active{border-color:var(--semi-color-warning);background-color:var(--semi-color-warning-light-hover)}.semi-datepicker-range-input-error{background-color:var(--semi-color-danger-light-default)}.semi-datepicker-range-input-error .semi-datepicker-range-input-wrapper:hover{background-color:var(--semi-color-danger-light-hover)}.semi-datepicker-range-input-error .semi-datepicker-range-input-wrapper-active{border-color:var(--semi-color-danger);background-color:var(--semi-color-danger-light-hover)}.semi-datepicker-range-input .semi-datepicker-range-input-clearbtn{display:none}.semi-datepicker-range-input-prefix,.semi-datepicker-range-input-suffix,.semi-datepicker-range-input-clearbtn{display:flex;align-items:center;justify-content:center;font-weight:600;font-size:14px;line-height:20px;font-family:Inter,-apple-system,BlinkMacSystemFont,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Segoe UI,Helvetica Neue,Helvetica,Arial,sans-serif;white-space:nowrap;color:var(--semi-color-text-2)}.semi-datepicker-range-input-prefix{padding-left:12px;padding-right:8px}.semi-datepicker-range-input-suffix{padding-left:8px;padding-right:12px}.semi-datepicker-range-input-suffix-hidden{display:none}.semi-datepicker-range-input-clearbtn{padding-left:8px;padding-right:12px}.semi-datepicker-compact{font-size:12px;line-height:16px;font-family:Inter,-apple-system,BlinkMacSystemFont,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Segoe UI,Helvetica Neue,Helvetica,Arial,sans-serif;line-height:20px;display:inline-block;max-width:calc(100vw - 32px)}.semi-datepicker-compact:not(.semi-datepicker-compact-insetInput){width:max-content}.semi-datepicker-compact .semi-datepicker-container,.semi-datepicker-compact .semi-datepicker-month-grid{width:max-content}.semi-datepicker-compact .semi-datepicker-month-grid .semi-datepicker-month-grid-left,.semi-datepicker-compact .semi-datepicker-month-grid .semi-datepicker-month-grid-right{min-width:216px;max-width:calc(100vw - 32px)}.semi-datepicker-compact .semi-datepicker-month-grid .semi-datepicker-month{margin-left:auto;margin-right:auto}.semi-datepicker-compact .semi-datepicker-month-grid[x-type=dateTime] .semi-datepicker-yam,.semi-datepicker-compact .semi-datepicker-month-grid[x-type=dateTimeRange] .semi-datepicker-yam{height:calc(100% - 32px)}.semi-datepicker-compact .semi-datepicker-month-grid .semi-datepicker-yam{position:relative;width:100%;max-width:100%;max-height:256px;overflow-x:auto;overflow-y:hidden}.semi-datepicker-compact .semi-datepicker-month-grid[x-type=dateRange] .semi-datepicker-month-grid-left,.semi-datepicker-compact .semi-datepicker-month-grid[x-type=dateTimeRange] .semi-datepicker-month-grid-left{border-right:1px solid var(--semi-color-border)}.semi-datepicker-compact .semi-datepicker-month-grid .semi-datepicker-yam-showing{min-height:288px;min-width:216px}.semi-datepicker-compact .semi-datepicker-month-grid[x-type=date] .semi-datepicker-yam-showing{min-height:256px}.semi-datepicker-compact .semi-datepicker-month-grid[x-preset-position=left][x-insetinput=false] .semi-datepicker-month,.semi-datepicker-compact .semi-datepicker-month-grid[x-preset-position=right][x-insetinput=false] .semi-datepicker-month{height:220px}.semi-datepicker-compact .semi-datepicker-month-grid .semi-datepicker-yearmonth-header{box-sizing:border-box;height:48px;padding:12px;width:100%;max-width:100%}.semi-datepicker-compact .semi-datepicker-month-grid .semi-datepicker-yearmonth-header button,.semi-datepicker-compact .semi-datepicker-month-grid .semi-datepicker-yearmonth-header .semi-button{width:100%;max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.semi-datepicker-compact .semi-datepicker-month-grid .semi-datepicker-yearmonth-body{display:flex}.semi-datepicker-compact .semi-datepicker-month-grid .semi-datepicker-yearmonth-body .semi-scrolllist:nth-child(2){border:1px solid var(--semi-color-border)}.semi-datepicker-compact .semi-datepicker-month-grid .semi-scrolllist{font-size:12px;line-height:16px;font-family:Inter,-apple-system,BlinkMacSystemFont,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Segoe UI,Helvetica Neue,Helvetica,Arial,sans-serif;line-height:20px}.semi-datepicker-compact .semi-datepicker-month-grid .semi-scrolllist-header{display:none}.semi-datepicker-compact .semi-datepicker-month-grid .semi-scrolllist-list-outer>ul>li{height:32px}.semi-datepicker-compact .semi-datepicker-month-grid .semi-scrolllist-item-wheel{border-right:0}.semi-datepicker-compact .semi-datepicker-month-grid .semi-scrolllist-item-wheel .semi-scrolllist-selector{height:32px}.semi-datepicker-compact .semi-datepicker-month-grid .semi-scrolllist-item-wheel .semi-scrolllist-shade-pre{margin-top:-17px}.semi-datepicker-compact .semi-datepicker-month-grid .semi-scrolllist-item-wheel .semi-scrolllist-shade-post{margin-top:17px}.semi-datepicker-compact .semi-datepicker-month-grid[x-panel-yearandmonth-open-type=left] .semi-datepicker-weeks,.semi-datepicker-compact .semi-datepicker-month-grid[x-panel-yearandmonth-open-type=right] .semi-datepicker-weeks{min-height:168px}.semi-datepicker-compact .semi-datepicker-month-grid[x-insetinput=true] .semi-datepicker-month-grid-left[x-open-type=year],.semi-datepicker-compact .semi-datepicker-month-grid[x-insetinput=true] .semi-datepicker-month-grid-right[x-open-type=year],.semi-datepicker-compact .semi-datepicker-month-grid[x-insetinput=true] .semi-datepicker-month-grid-left[x-open-type=time],.semi-datepicker-compact .semi-datepicker-month-grid[x-insetinput=true] .semi-datepicker-month-grid-right[x-open-type=time],.semi-datepicker-compact .semi-datepicker-month-grid[x-insetinput=true] .semi-datepicker-yam-showing{min-height:256px}.semi-datepicker-compact .semi-datepicker-month-grid[x-insetinput=true] .semi-datepicker-tpk{min-height:100%}.semi-datepicker-compact .semi-datepicker-month-grid[x-insetinput=true][x-type=dateTime] .semi-datepicker-yam,.semi-datepicker-compact .semi-datepicker-month-grid[x-insetinput=true][x-type=dateTimeRange] .semi-datepicker-yam{height:100%}.semi-datepicker-compact.semi-datepicker-panel-yam .semi-scrolllist{font-size:12px;line-height:16px;font-family:Inter,-apple-system,BlinkMacSystemFont,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Segoe UI,Helvetica Neue,Helvetica,Arial,sans-serif;line-height:20px}.semi-datepicker-compact .semi-datepicker-tpk{height:calc(100% - 32px)}.semi-datepicker-compact .semi-datepicker-navigation{box-sizing:border-box;height:24px;padding:12px 12px 0;width:100%;max-width:100%}.semi-datepicker-compact .semi-datepicker-navigation-left,.semi-datepicker-compact .semi-datepicker-navigation-right{width:24px;height:24px}.semi-datepicker-compact .semi-datepicker-navigation .semi-button{min-width:24px;min-height:24px}.semi-datepicker-compact .semi-datepicker-navigation-month{min-width:0;overflow:hidden}.semi-datepicker-compact .semi-datepicker-navigation-month .semi-button{font-size:12px;line-height:16px;font-family:Inter,-apple-system,BlinkMacSystemFont,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Segoe UI,Helvetica Neue,Helvetica,Arial,sans-serif;line-height:20px;max-width:100%}.semi-datepicker-compact .semi-datepicker-navigation-month .semi-button>span{display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.semi-datepicker-compact .semi-datepicker-month{width:216px;padding:0}.semi-datepicker-compact .semi-datepicker-weeks{padding:6px 10px 10px}.semi-datepicker-compact .semi-datepicker-weekday{box-sizing:border-box;height:36px;padding-left:10px;padding-right:10px;padding-bottom:8px;border-bottom:1px solid var(--semi-color-border)}.semi-datepicker-compact .semi-datepicker-weekday-item{width:28px;height:28px;line-height:28px}.semi-datepicker-compact .semi-datepicker-day{width:28px;height:28px}.semi-datepicker-compact .semi-datepicker-day-main{width:24px;height:24px}.semi-datepicker-compact .semi-datepicker-day-inrange .semi-datepicker-day-main,.semi-datepicker-compact .semi-datepicker-day-inhover .semi-datepicker-day-main,.semi-datepicker-compact .semi-datepicker-day-inoffsetrange .semi-datepicker-day-main,.semi-datepicker-compact .semi-datepicker-day-hoverday .semi-datepicker-day-main,.semi-datepicker-compact .semi-datepicker-day-selectedrange-hover .semi-datepicker-day-main{width:28px}.semi-datepicker-compact .semi-datepicker-day-selected-start.semi-datepicker-day-selected-end .semi-datepicker-day-main,.semi-datepicker-compact .semi-datepicker-day-offsetrange-start.semi-datepicker-day-offsetrange-end .semi-datepicker-day-main{border-radius:4px}.semi-datepicker-compact .semi-datepicker-day-offsetrange-start .semi-datepicker-day-main{border-radius:4px 0 0 4px}.semi-datepicker-compact .semi-datepicker-day-offsetrange-end .semi-datepicker-day-main{border-radius:0 4px 4px 0}.semi-datepicker-compact .semi-datepicker-day-hoverday-beforerange .semi-datepicker-day-main{border-radius:4px 0 0 4px}.semi-datepicker-compact .semi-datepicker-day-hoverday-afterrange .semi-datepicker-day-main{border-radius:0 4px 4px 0}.semi-datepicker-compact .semi-datepicker-day-selected-start .semi-datepicker-day-main,.semi-datepicker-compact .semi-datepicker-day-offsetrange-start .semi-datepicker-day-main{width:34px;margin-left:2px;margin-right:0;border-radius:4px 0 0 4px}.semi-datepicker-compact .semi-datepicker-day-selected-end .semi-datepicker-day-main,.semi-datepicker-compact .semi-datepicker-day-offsetrange-end .semi-datepicker-day-main{width:34px;margin-right:2px;margin-left:0;border-radius:0 4px 4px 0}.semi-datepicker-compact .semi-datepicker-switch{box-sizing:border-box;height:32px}.semi-datepicker-compact .semi-datepicker-switch-date,.semi-datepicker-compact .semi-datepicker-switch-time{padding-top:6px;padding-bottom:6px}.semi-datepicker-compact .semi-datepicker-switch-date{border-right:1px solid var(--semi-color-border)}.semi-datepicker-compact .semi-datepicker-switch-text{padding-left:0}.semi-datepicker-compact .semi-datepicker-quick-control-header{padding:16px 12px 0;font-weight:600}.semi-datepicker-compact .semi-datepicker-quick-control-left-content-wrapper,.semi-datepicker-compact .semi-datepicker-quick-control-right-content-wrapper{margin-top:12px}.semi-datepicker-compact .semi-datepicker-quick-control-left-content,.semi-datepicker-compact .semi-datepicker-quick-control-right-content{box-sizing:border-box;display:grid;align-content:flex-start;grid-gap:8px;grid-template-columns:repeat(2,minmax(76.5px,84px));padding:0 12px 12px}.semi-datepicker-compact .semi-datepicker-quick-control-left-content-item,.semi-datepicker-compact .semi-datepicker-quick-control-right-content-item{max-width:84px}.semi-datepicker-compact .semi-datepicker-quick-control-left-content-item-ellipsis,.semi-datepicker-compact .semi-datepicker-quick-control-right-content-item-ellipsis{width:68px;font-size:12px;color:var(--semi-color-primary)}.semi-datepicker-compact .semi-datepicker-quick-control-top-content,.semi-datepicker-compact .semi-datepicker-quick-control-bottom-content{box-sizing:border-box;display:grid;grid-gap:8px;grid-template-columns:repeat(3,minmax(54.94px,59.94px));align-content:flex-start;padding:8px 10px}.semi-datepicker-compact .semi-datepicker-quick-control-top-content-item,.semi-datepicker-compact .semi-datepicker-quick-control-bottom-content-item{max-width:59.94px}.semi-datepicker-compact .semi-datepicker-quick-control-top-content-item-ellipsis,.semi-datepicker-compact .semi-datepicker-quick-control-bottom-content-item-ellipsis{width:43.94px;font-size:12px;color:var(--semi-color-primary)}.semi-datepicker-compact .semi-datepicker-quick-control-top-range-content,.semi-datepicker-compact .semi-datepicker-quick-control-bottom-range-content{display:grid;grid-template-columns:repeat(5,minmax(73px,76px));grid-gap:8px;align-content:flex-start;padding:8px 10px}.semi-datepicker-compact .semi-datepicker-quick-control-top-range-content-item,.semi-datepicker-compact .semi-datepicker-quick-control-bottom-range-content-item{max-width:76px}.semi-datepicker-compact .semi-datepicker-quick-control-top-range-content-item-ellipsis,.semi-datepicker-compact .semi-datepicker-quick-control-bottom-range-content-item-ellipsis{width:60px;font-size:12px;color:var(--semi-color-primary)}.semi-datepicker-compact .semi-datepicker-quick-control-top-month-content,.semi-datepicker-compact .semi-datepicker-quick-control-bottom-month-content{display:grid;grid-template-columns:repeat(2,minmax(61px,68.5px));grid-gap:8px;align-content:flex-start;padding:8px 10px}.semi-datepicker-compact .semi-datepicker-quick-control-top-month-content-item,.semi-datepicker-compact .semi-datepicker-quick-control-bottom-month-content-item{max-width:68.5px}.semi-datepicker-compact .semi-datepicker-quick-control-top-month-content-item-ellipsis,.semi-datepicker-compact .semi-datepicker-quick-control-bottom-month-content-item-ellipsis{max-width:52.5px;font-size:12px;color:var(--semi-color-primary)}.semi-datepicker-compact .semi-datepicker-quick-control-month{min-width:216px;width:max-content;max-width:calc(100vw - 32px)}.semi-datepicker-compact .semi-datepicker-quick-control-month[x-insetinput=true] .semi-datepicker-quick-control-right-content-wrapper,.semi-datepicker-compact .semi-datepicker-quick-control-month[x-insetinput=true] .semi-datepicker-quick-control-left-content-wrapper{max-height:254px}.semi-datepicker-compact .semi-datepicker-quick-control-month .semi-datepicker-quick-control-right-content-wrapper,.semi-datepicker-compact .semi-datepicker-quick-control-month .semi-datepicker-quick-control-left-content-wrapper{max-height:218px}.semi-datepicker-compact .semi-datepicker-quick-control-date{min-width:216px;width:max-content;max-width:calc(100vw - 32px)}.semi-datepicker-compact .semi-datepicker-quick-control-date[x-insetinput=true] .semi-datepicker-quick-control-right-content-wrapper,.semi-datepicker-compact .semi-datepicker-quick-control-date[x-insetinput=true] .semi-datepicker-quick-control-left-content-wrapper{max-height:248px}.semi-datepicker-compact .semi-datepicker-quick-control-date .semi-datepicker-quick-control-right-content-wrapper,.semi-datepicker-compact .semi-datepicker-quick-control-date .semi-datepicker-quick-control-left-content-wrapper{max-height:208px}.semi-datepicker-compact .semi-datepicker-quick-control-dateTime{min-width:216px;width:max-content;max-width:calc(100vw - 32px)}.semi-datepicker-compact .semi-datepicker-quick-control-dateTime[x-insetinput=true] .semi-datepicker-quick-control-right-content-wrapper,.semi-datepicker-compact .semi-datepicker-quick-control-dateTime[x-insetinput=true] .semi-datepicker-quick-control-left-content-wrapper{max-height:248px}.semi-datepicker-compact .semi-datepicker-quick-control-dateTime .semi-datepicker-quick-control-right-content-wrapper,.semi-datepicker-compact .semi-datepicker-quick-control-dateTime .semi-datepicker-quick-control-left-content-wrapper{max-height:240px}.semi-datepicker-compact .semi-datepicker-quick-control-dateRange{min-width:min(432px,calc(100vw - 32px));width:max-content;max-width:calc(100vw - 32px)}.semi-datepicker-compact .semi-datepicker-quick-control-dateRange[x-insetinput=true] .semi-datepicker-quick-control-right-content-wrapper,.semi-datepicker-compact .semi-datepicker-quick-control-dateRange[x-insetinput=true] .semi-datepicker-quick-control-left-content-wrapper{max-height:248px}.semi-datepicker-compact .semi-datepicker-quick-control-dateRange .semi-datepicker-quick-control-right-content-wrapper,.semi-datepicker-compact .semi-datepicker-quick-control-dateRange .semi-datepicker-quick-control-left-content-wrapper{max-height:208px}.semi-datepicker-compact .semi-datepicker-quick-control-dateTimeRange{min-width:min(432px,calc(100vw - 32px));width:max-content;max-width:calc(100vw - 32px)}.semi-datepicker-compact .semi-datepicker-quick-control-dateTimeRange[x-insetinput=true] .semi-datepicker-quick-control-right-content-wrapper,.semi-datepicker-compact .semi-datepicker-quick-control-dateTimeRange[x-insetinput=true] .semi-datepicker-quick-control-left-content-wrapper{max-height:248px}.semi-datepicker-compact .semi-datepicker-quick-control-dateTimeRange .semi-datepicker-quick-control-right-content-wrapper,.semi-datepicker-compact .semi-datepicker-quick-control-dateTimeRange .semi-datepicker-quick-control-left-content-wrapper{max-height:240px}.semi-datepicker-compact .semi-datepicker-footer{padding-top:10px;padding-right:8px;padding-bottom:10px}.semi-datepicker-compact .semi-datepicker-inset-input-wrapper{column-gap:4px;padding:8px 8px 0;width:216px}.semi-datepicker-compact .semi-datepicker-inset-input-wrapper[x-type=dateRange],.semi-datepicker-compact .semi-datepicker-inset-input-wrapper[x-type=dateTimeRange]{width:432px;padding-top:0}.semi-datepicker-compact .semi-datepicker-inset-input-wrapper[x-type=dateRange] .semi-input-wrapper,.semi-datepicker-compact .semi-datepicker-inset-input-wrapper[x-type=dateTimeRange] .semi-input-wrapper{margin-top:8px}.semi-datepicker-compact .semi-datepicker-inset-input-wrapper[x-type=month]{width:195px}.semi-datepicker-compact .semi-datepicker-inset-input-wrapper .semi-input-wrapper{height:28px;box-sizing:border-box}.semi-datepicker-compact .semi-datepicker-inset-input-wrapper .semi-input-wrapper .semi-input{font-size:12px;line-height:26px;height:26px;vertical-align:top}.semi-datepicker-compact .semi-datepicker-inset-input-separator{border-left:1px solid var(--semi-color-border);transform:translate(50%);height:auto}.semi-popover-wrapper[x-placement^=top] .semi-datepicker .semi-datepicker-weeks,.semi-popover-wrapper[x-placement=leftTop] .semi-datepicker .semi-datepicker-weeks,.semi-popover-wrapper[x-placement=rightTop] .semi-datepicker .semi-datepicker-weeks,.semi-popover-wrapper[x-placement*=BottomOver] .semi-datepicker .semi-datepicker-weeks{min-height:216px}.semi-popover-wrapper[x-placement^=top] .semi-datepicker-compact .semi-datepicker-weeks,.semi-popover-wrapper[x-placement=leftTop] .semi-datepicker-compact .semi-datepicker-weeks,.semi-popover-wrapper[x-placement=rightTop] .semi-datepicker-compact .semi-datepicker-weeks,.semi-popover-wrapper[x-placement*=BottomOver] .semi-datepicker-compact .semi-datepicker-weeks{min-height:168px}.semi-datepicker-borderless:not(:focus-within):not(:hover){background-color:transparent;border-color:transparent}.semi-datepicker-borderless:not(:focus-within):not(:hover) .semi-input-suffix,.semi-datepicker-borderless:not(:focus-within):not(:hover) .semi-datepicker-range-input-suffix{opacity:0}.semi-datepicker-borderless:focus-within:not(:active){background-color:transparent}.semi-datepicker-borderless.semi-datepicker-range-input-error .semi-datepicker-range-input-wrapper-active{border-color:transparent}.semi-datepicker-borderless.semi-datepicker-range-input-error:hover{background-color:var(--semi-color-danger-light-default)}.semi-datepicker-borderless.semi-datepicker-range-input-error:focus-within{background-color:var(--semi-color-danger-light-default)}.semi-datepicker-borderless.semi-datepicker-range-input-error:not(:focus-within){border-width:1px;border-color:var(--semi-color-danger)}.semi-datepicker-borderless.semi-datepicker-range-input-error:focus-within{border-width:1px;border-color:var(--semi-color-danger)}.semi-datepicker-borderless.semi-datepicker-range-input-warning .semi-datepicker-range-input-wrapper-active{border-color:transparent}.semi-datepicker-borderless.semi-datepicker-range-input-warning:hover{background-color:var(--semi-color-warning-light-default)}.semi-datepicker-borderless.semi-datepicker-range-input-warning:focus-within{background-color:var(--semi-color-warning-light-default)}.semi-datepicker-borderless.semi-datepicker-range-input-warning:not(:focus-within){border-width:1px;border-color:var(--semi-color-warning)}.semi-datepicker-borderless.semi-datepicker-range-input-warning:focus-within{border-width:1px;border-color:var(--semi-color-warning)}.semi-rtl .semi-datepicker,.semi-portal-rtl .semi-datepicker{direction:rtl}.semi-rtl .semi-datepicker-footer,.semi-portal-rtl .semi-datepicker-footer{padding-right:0;padding-left:8px;text-align:left}.semi-rtl .semi-datepicker-footer .semi-button:first-of-type,.semi-portal-rtl .semi-datepicker-footer .semi-button:first-of-type{margin-left:0;margin-right:0}.semi-rtl .semi-datepicker-footer .semi-button:nth-of-type(2),.semi-portal-rtl .semi-datepicker-footer .semi-button:nth-of-type(2){margin-right:12px;margin-left:0}.semi-rtl .semi-datepicker-day-offsetrange-start .semi-datepicker-day-main,.semi-portal-rtl .semi-datepicker-day-offsetrange-start .semi-datepicker-day-main{border-radius:0 var(--semi-border-radius-small) var(--semi-border-radius-small) 0}.semi-rtl .semi-datepicker-day-offsetrange-end .semi-datepicker-day-main,.semi-portal-rtl .semi-datepicker-day-offsetrange-end .semi-datepicker-day-main{border-radius:var(--semi-border-radius-small) 0 0 var(--semi-border-radius-small)}.semi-rtl .semi-datepicker-day-selected-start .semi-datepicker-day-main,.semi-rtl .semi-datepicker-day-hoverday-before-selectedrange .semi-datepicker-day-main,.semi-rtl .semi-datepicker-day-offsetrange-start .semi-datepicker-day-main,.semi-portal-rtl .semi-datepicker-day-selected-start .semi-datepicker-day-main,.semi-portal-rtl .semi-datepicker-day-hoverday-before-selectedrange .semi-datepicker-day-main,.semi-portal-rtl .semi-datepicker-day-offsetrange-start .semi-datepicker-day-main{margin-right:2px;margin-left:auto;border-radius:0 var(--semi-border-radius-small) var(--semi-border-radius-small) 0}.semi-rtl .semi-datepicker-day-selected-end .semi-datepicker-day-main,.semi-rtl .semi-datepicker-day-hoverday-after-selectedrange .semi-datepicker-day-main,.semi-rtl .semi-datepicker-day-offsetrange-end .semi-datepicker-day-main,.semi-portal-rtl .semi-datepicker-day-selected-end .semi-datepicker-day-main,.semi-portal-rtl .semi-datepicker-day-hoverday-after-selectedrange .semi-datepicker-day-main,.semi-portal-rtl .semi-datepicker-day-offsetrange-end .semi-datepicker-day-main{margin-left:2px;margin-right:auto;border-radius:var(--semi-border-radius-small) 0 0 var(--semi-border-radius-small)}.semi-rtl .semi-datepicker-switch-text,.semi-portal-rtl .semi-datepicker-switch-text{padding-left:0;padding-right:8px}.semi-rtl .semi-datepicker-navigation .semi-icon-chevron_left,.semi-rtl .semi-datepicker-navigation .semi-icon-chevron_right,.semi-rtl .semi-datepicker-navigation .semi-icon-double_chevron_left,.semi-rtl .semi-datepicker-navigation .semi-icon-double_chevron_right,.semi-rtl .semi-datepicker-yam .semi-icon-chevron_left,.semi-rtl .semi-datepicker-yam .semi-icon-chevron_right,.semi-rtl .semi-datepicker-yam .semi-icon-double_chevron_left,.semi-rtl .semi-datepicker-yam .semi-icon-double_chevron_right,.semi-portal-rtl .semi-datepicker-navigation .semi-icon-chevron_left,.semi-portal-rtl .semi-datepicker-navigation .semi-icon-chevron_right,.semi-portal-rtl .semi-datepicker-navigation .semi-icon-double_chevron_left,.semi-portal-rtl .semi-datepicker-navigation .semi-icon-double_chevron_right,.semi-portal-rtl .semi-datepicker-yam .semi-icon-chevron_left,.semi-portal-rtl .semi-datepicker-yam .semi-icon-chevron_right,.semi-portal-rtl .semi-datepicker-yam .semi-icon-double_chevron_left,.semi-portal-rtl .semi-datepicker-yam .semi-icon-double_chevron_right{transform:scaleX(-1)}.semi-rtl .semi-datepicker-range-input-prefix,.semi-portal-rtl .semi-datepicker-range-input-prefix{padding-left:8px;padding-right:12px}.semi-rtl .semi-datepicker-range-input-suffix,.semi-portal-rtl .semi-datepicker-range-input-suffix{padding-left:12px;padding-right:8px}.semi-rtl .semi-datepicker-range-input-suffix-hidden,.semi-portal-rtl .semi-datepicker-range-input-suffix-hidden{display:none}.semi-rtl .semi-datepicker-range-input-clearbtn,.semi-portal-rtl .semi-datepicker-range-input-clearbtn{padding-left:12px;padding-right:8px}.semi-rtl .semi-datepicker-compact .semi-datepicker-month-grid[x-type=dateRange] .semi-datepicker-month-grid-left,.semi-rtl .semi-datepicker-compact .semi-datepicker-month-grid[x-type=dateTimeRange] .semi-datepicker-month-grid-left,.semi-portal-rtl .semi-datepicker-compact .semi-datepicker-month-grid[x-type=dateRange] .semi-datepicker-month-grid-left,.semi-portal-rtl .semi-datepicker-compact .semi-datepicker-month-grid[x-type=dateTimeRange] .semi-datepicker-month-grid-left{border-left:1px solid var(--semi-color-border);border-right:0}.semi-rtl .semi-datepicker-compact .semi-datepicker-month-grid .semi-scrolllist-item-wheel,.semi-portal-rtl .semi-datepicker-compact .semi-datepicker-month-grid .semi-scrolllist-item-wheel{border-left:0;border-right:0}.semi-rtl .semi-datepicker-compact .semi-datepicker-day-offsetrange-start .semi-datepicker-day-main,.semi-portal-rtl .semi-datepicker-compact .semi-datepicker-day-offsetrange-start .semi-datepicker-day-main{border-radius:0 4px 4px 0}.semi-rtl .semi-datepicker-compact .semi-datepicker-day-offsetrange-end .semi-datepicker-day-main,.semi-portal-rtl .semi-datepicker-compact .semi-datepicker-day-offsetrange-end .semi-datepicker-day-main{border-radius:4px 0 0 4px}.semi-rtl .semi-datepicker-compact .semi-datepicker-day-selected-start .semi-datepicker-day-main,.semi-portal-rtl .semi-datepicker-compact .semi-datepicker-day-selected-start .semi-datepicker-day-main{margin-left:0;margin-right:2px;border-radius:0 4px 4px 0}.semi-rtl .semi-datepicker-compact .semi-datepicker-day-selected-end .semi-datepicker-day-main,.semi-portal-rtl .semi-datepicker-compact .semi-datepicker-day-selected-end .semi-datepicker-day-main{margin-right:0;margin-left:2px;border-radius:4px 0 0 4px}.semi-rtl .semi-datepicker-compact .semi-datepicker-switch-date,.semi-portal-rtl .semi-datepicker-compact .semi-datepicker-switch-date{border-left:1px solid var(--semi-color-border);border-right:0}.semi-rtl .semi-datepicker-compact .semi-datepicker-switch-text,.semi-portal-rtl .semi-datepicker-compact .semi-datepicker-switch-text{padding-left:auto;padding-right:0}.semi-rtl .semi-datepicker-compact .semi-datepicker-footer,.semi-portal-rtl .semi-datepicker-compact .semi-datepicker-footer{padding-left:8px;padding-right:auto}.semi-rtl .semi-datepicker-compact .semi-datepicker-inset-input-separator,.semi-portal-rtl .semi-datepicker-compact .semi-datepicker-inset-input-separator{border-right:1px solid var(--semi-color-border);border-left:0;transform:translate(-50%)}.ga-token-page{padding:16px 24px;width:100%;height:100%;overflow-y:auto}.ga-token-content{display:flex;flex-direction:column;gap:16px;padding:12px 0}.ga-token-stats{display:flex;gap:12px}.ga-token-stat-card{flex:1;padding:16px 20px;border-radius:8px;background:var(--dt-card);border:1px solid var(--ui-stroke-tertiary)}.ga-token-stat-label{font-size:12px;color:var(--ui-text-tertiary);margin-bottom:4px}.ga-token-stat-value{font-size:24px;font-weight:600;font-family:var(--font-mono)}.ga-token-filter{display:flex;align-items:center;gap:8px}.ga-token-mono{font-family:var(--font-mono);font-size:13px}.ga-token-loading{display:flex;align-items:center;justify-content:center;padding:48px 0}.ga-token-disclaimer{padding:12px 0;font-size:12px;color:var(--ui-text-quaternary);text-align:center} diff --git a/frontends/desktop/dist/assets/WindowsTitlebar-CrkUa1UM.js b/frontends/desktop/dist/assets/WindowsTitlebar-CrkUa1UM.js new file mode 100644 index 000000000..422fa1354 --- /dev/null +++ b/frontends/desktop/dist/assets/WindowsTitlebar-CrkUa1UM.js @@ -0,0 +1 @@ +import{aj as t}from"./tauri-compat-tfiFK9EG.js";function d(){var n,e,o;const i=(o=(e=(n=window.__TAURI__)==null?void 0:n.window)==null?void 0:e.getCurrentWindow)==null?void 0:o.call(e);return i?t.jsxs("div",{className:"ga-win-controls","data-no-drag":!0,children:[t.jsx("button",{type:"button",className:"ga-win-btn",onClick:()=>i.minimize(),"aria-label":"Minimize",children:t.jsx("svg",{width:"10",height:"1",viewBox:"0 0 10 1",children:t.jsx("rect",{fill:"currentColor",width:"10",height:"1"})})}),t.jsx("button",{type:"button",className:"ga-win-btn",onClick:()=>i.toggleMaximize(),"aria-label":"Maximize",children:t.jsx("svg",{width:"10",height:"10",viewBox:"0 0 10 10",fill:"none",children:t.jsx("rect",{x:"0.5",y:"0.5",width:"9",height:"9",stroke:"currentColor",strokeWidth:"1"})})}),t.jsx("button",{type:"button",className:"ga-win-btn ga-win-btn--close",onClick:()=>i.close(),"aria-label":"Close",children:t.jsx("svg",{width:"10",height:"10",viewBox:"0 0 10 10",children:t.jsx("path",{d:"M1 1l8 8M9 1l-8 8",stroke:"currentColor",strokeWidth:"1.2"})})})]}):null}function c(){const i=n=>{var o,r,s,a,l;n.button!==0||n.target.closest("button, a, input, [data-no-drag]")||(n.preventDefault(),(l=(a=(s=(r=(o=window.__TAURI__)==null?void 0:o.window)==null?void 0:r.getCurrentWindow)==null?void 0:s.call(r))==null?void 0:a.startDragging)==null||l.call(a))};return t.jsx("div",{className:"ga-win-titlebar","data-testid":"windows-titlebar",onMouseDown:i,children:t.jsx(d,{})})}export{c as W}; diff --git a/frontends/desktop/dist/assets/WindowsTitlebar-U0YG9JNA.css b/frontends/desktop/dist/assets/WindowsTitlebar-U0YG9JNA.css new file mode 100644 index 000000000..c2e359d94 --- /dev/null +++ b/frontends/desktop/dist/assets/WindowsTitlebar-U0YG9JNA.css @@ -0,0 +1 @@ +:root[data-platform=windows]{--ga-titlebar-height: 32px}.ga-win-titlebar{height:32px;flex-shrink:0;width:100%;background:#0a0a0a;display:flex;justify-content:flex-end;align-items:stretch;-webkit-user-select:none;user-select:none}.ga-win-controls{display:flex;height:100%}.ga-win-btn{width:46px;height:100%;border:none;background:transparent;color:#d1d1d1;display:flex;align-items:center;justify-content:center;cursor:pointer;transition:background .1s}.ga-win-btn:hover{background:#2e2e2e;color:#fff}.ga-win-btn--close:hover{background:#c42b1c;color:#fff} diff --git a/frontends/desktop/dist/assets/codicon-DjkITdqj.ttf b/frontends/desktop/dist/assets/codicon-DjkITdqj.ttf new file mode 100644 index 000000000..938db2679 Binary files /dev/null and b/frontends/desktop/dist/assets/codicon-DjkITdqj.ttf differ diff --git a/frontends/desktop/dist/assets/feishu-9hxxyz3-.svg b/frontends/desktop/dist/assets/feishu-9hxxyz3-.svg new file mode 100644 index 000000000..7afdb94f9 --- /dev/null +++ b/frontends/desktop/dist/assets/feishu-9hxxyz3-.svg @@ -0,0 +1,12 @@ + + + + + \ No newline at end of file diff --git a/frontends/desktop/dist/assets/ga-logo.svg b/frontends/desktop/dist/assets/ga-logo.svg new file mode 100644 index 000000000..a4d456c14 --- /dev/null +++ b/frontends/desktop/dist/assets/ga-logo.svg @@ -0,0 +1,58 @@ + + GenericAgent + + + diff --git a/frontends/desktop/dist/assets/index-Bpi3BHKj.js b/frontends/desktop/dist/assets/index-Bpi3BHKj.js new file mode 100644 index 000000000..4d62016b2 --- /dev/null +++ b/frontends/desktop/dist/assets/index-Bpi3BHKj.js @@ -0,0 +1 @@ +import{c as I,b as a,B as R,V as F,l as j,R as i,q as $,P as n,aw as Z,h as N,s as D}from"./tauri-compat-tfiFK9EG.js";function U(){let t=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{};const{prefix:o="",length:s=7}=t,e="0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIGKLMNOPQRSTUVWXYZ",l=e.length;let g="";for(let m=0;mo&&(e=t.slice(0,o));return e.reverse()}return["rgba(233,69,255)","rgba(166,71,255)","rgba(107,97,255)","rgba(46,140,255)"]}var X=function(t,o){var s={};for(var e in t)Object.prototype.hasOwnProperty.call(t,e)&&o.indexOf(e)<0&&(s[e]=t[e]);if(t!=null&&typeof Object.getOwnPropertySymbols=="function")for(var l=0,e=Object.getOwnPropertySymbols(t);lp&&d.stopPropagation()},O),s))}};E.defaultProps={disabled:!1,size:"default",type:"primary",theme:"light",block:!1,htmlType:"button",onMouseDown:$,onClick:$,onMouseEnter:$,onMouseLeave:$,colorful:!1,prefixCls:B.PREFIX};E.propTypes={children:n.node,disabled:n.bool,prefixCls:n.string,style:n.object,size:n.oneOf(J),type:n.oneOf(te),block:n.bool,onClick:n.func,onMouseDown:n.func,circle:n.bool,loading:n.bool,htmlType:n.oneOf(ee),theme:n.oneOf(w.themes),className:n.string,onMouseEnter:n.func,onMouseLeave:n.func,"aria-label":n.string,contentClassName:n.string};var ne=function(t,o){var s={};for(var e in t)Object.prototype.hasOwnProperty.call(t,e)&&o.indexOf(e)<0&&(s[e]=t[e]);if(t!=null&&typeof Object.getOwnPropertySymbols=="function")for(var l=0,e=Object.getOwnPropertySymbols(t);l0&&arguments[0]!==void 0?arguments[0]:{};super(o)}render(){const o=Object.assign({},this.props),s=!!o.icon,e=!!o.loading,l=!!o.disabled;return s||e&&!l?i.createElement(x,Object.assign({},o)):i.createElement(E,Object.assign({},o))}}v.__SemiComponentName__="Button";v.propTypes=Object.assign(Object.assign({},E.propTypes),x.propTypes);v.defaultProps=D(v.__SemiComponentName__);v.elementType="Button";export{v as B,re as I,x as a,ie as b,se as c}; diff --git a/frontends/desktop/dist/assets/index-ClU1uQYs.css b/frontends/desktop/dist/assets/index-ClU1uQYs.css new file mode 100644 index 000000000..10c714bf1 --- /dev/null +++ b/frontends/desktop/dist/assets/index-ClU1uQYs.css @@ -0,0 +1 @@ +.semi-banner{padding:12px}.semi-banner-content-wrapper{display:flex;flex-direction:row}.semi-banner-description{margin:0}.semi-banner .semi-banner-content-wrapper .semi-banner-content{display:flex;flex:1}.semi-banner-in-container{border-radius:var(--semi-border-radius-small)}.semi-banner-in-container .semi-banner-content-wrapper .semi-banner-content-body{flex:1}.semi-banner-in-container .semi-banner-content-wrapper .semi-banner-content-body .semi-banner-title+.semi-banner-description{margin-top:2px}.semi-banner-full .semi-banner-content-wrapper .semi-banner-content{justify-content:center}.semi-banner-full .semi-banner-content-wrapper .semi-banner-icon,.semi-banner-full .semi-banner-content-wrapper .semi-banner-content-body{display:flex;align-items:center}.semi-banner-close{margin-left:12px;height:24px;width:24px}.semi-banner-extra{margin-top:8px}.semi-banner-icon{display:flex;margin-right:12px}.semi-banner-info{background-color:var(--semi-color-info-light-default);color:var(--semi-color-info)}.semi-banner-info.semi-banner-bordered{border:1px solid var(--semi-color-info)}.semi-banner-warning{background-color:var(--semi-color-warning-light-default);color:var(--semi-color-warning)}.semi-banner-warning.semi-banner-bordered{border:1px solid var(--semi-color-warning)}.semi-banner-success{background-color:var(--semi-color-success-light-default);color:var(--semi-color-success)}.semi-banner-success.semi-banner-bordered{border:1px solid var(--semi-color-success)}.semi-banner-danger{background-color:var(--semi-color-danger-light-default);color:var(--semi-color-danger)}.semi-banner-danger.semi-banner-bordered{border:1px solid var(--semi-color-danger)}.semi-rtl .semi-banner,.semi-portal-rtl .semi-banner{direction:rtl}.semi-rtl .semi-banner-close,.semi-portal-rtl .semi-banner-close{margin-left:0;margin-right:12px;height:24px;width:24px}.semi-rtl .semi-banner-icon,.semi-portal-rtl .semi-banner-icon{margin-right:0;margin-left:12px} diff --git a/frontends/desktop/dist/assets/index-D0pGtk0y.css b/frontends/desktop/dist/assets/index-D0pGtk0y.css new file mode 100644 index 000000000..66b05e045 --- /dev/null +++ b/frontends/desktop/dist/assets/index-D0pGtk0y.css @@ -0,0 +1 @@ +.semi-button-split{display:inline-block}.semi-button-split .semi-button{border-radius:0;margin-right:1px}.semi-button-split .semi-button-first{border-top-left-radius:var(--semi-border-radius-small);border-bottom-left-radius:var(--semi-border-radius-small)}.semi-button-split .semi-button-last{border-top-right-radius:var(--semi-border-radius-small);border-bottom-right-radius:var(--semi-border-radius-small);margin-right:unset}.semi-button-split:hover .semi-button-borderless:active{background-color:var(--semi-color-fill-1)}.semi-button{--semi-button-colorful-multiple-fill-0: rgba(var(--semi-ai-general-5-3));--semi-button-colorful-multiple-fill-1: rgba(var(--semi-ai-general-5-2));--semi-button-colorful-multiple-fill-2: rgba(var(--semi-ai-general-5-1));--semi-button-colorful-multiple-fill-3: rgba(var(--semi-ai-general-5-0));--semi-button-colorful-disabled-fill: var(--semi-color-disabled-text);--semi-button-colorful-fill-primary: var(--semi-color-ai-purple);--semi-button-colorful-fill-secondary: var(--semi-color-text-0)}.semi-button{box-shadow:none;height:32px;display:inline-flex;align-items:center;justify-content:center;cursor:pointer;-webkit-user-select:none;user-select:none;border:0 transparent solid;border-radius:var(--semi-border-radius-small);padding:6px 12px;font-size:14px;line-height:20px;font-weight:600;outline:none;vertical-align:middle;white-space:nowrap}.semi-button.semi-button-primary:focus-visible,.semi-button.semi-button-secondary:focus-visible,.semi-button.semi-button-tertiary:focus-visible,.semi-button.semi-button-warning:focus-visible,.semi-button.semi-button-danger:focus-visible{outline:2px solid var(--semi-color-primary-light-active)}.semi-button-content{display:flex;align-items:center}.semi-button-danger{background-color:var(--semi-color-danger);color:rgba(var(--semi-white),1);transition:background-color var(--semi-transition_duration-none) var(--semi-transition_function-easeIn) var(--semi-transition_delay-none),border var(--semi-transition_duration-none) var(--semi-transition_function-easeIn) var(--semi-transition_delay-none);transform:scale(var(--semi-transform_scale-none))}.semi-button-danger-disabled{background-color:var(--semi-color-disabled-bg)}.semi-button-danger-disabled.semi-button-outline{background-color:transparent;border:1px solid var(--semi-color-border)}.semi-button-danger-disabled.semi-button-light{background-color:var(--semi-color-fill-0)}.semi-button-danger:hover{background-color:var(--semi-color-danger-hover)}.semi-button-danger:active{background-color:var(--semi-color-danger-active)}.semi-button-danger.semi-button-outline{background-color:transparent;border:1px solid var(--semi-color-danger)}.semi-button-danger.semi-button-light,.semi-button-danger.semi-button-outline,.semi-button-danger.semi-button-borderless{color:var(--semi-color-danger)}.semi-button-danger:not(.semi-button-borderless):not(.semi-button-light):focus-visible{outline:2px solid var(--semi-color-danger-light-active)}.semi-button-warning{background-color:var(--semi-color-warning);color:rgba(var(--semi-white),1);transition:background-color var(--semi-transition_duration-none) var(--semi-transition_function-easeIn) var(--semi-transition_delay-none),border var(--semi-transition_duration-none) var(--semi-transition_function-easeIn) var(--semi-transition_delay-none);transform:scale(var(--semi-transform_scale-none))}.semi-button-warning-disabled{background-color:var(--semi-color-disabled-bg)}.semi-button-warning-disabled.semi-button-outline{background-color:transparent;border:1px solid var(--semi-color-border)}.semi-button-warning-disabled.semi-button-light{background-color:var(--semi-color-fill-0)}.semi-button-warning:hover{background-color:var(--semi-color-warning-hover)}.semi-button-warning:active{background-color:var(--semi-color-warning-active)}.semi-button-warning.semi-button-outline{background-color:transparent;border:1px solid var(--semi-color-warning)}.semi-button-warning.semi-button-light,.semi-button-warning.semi-button-outline,.semi-button-warning.semi-button-borderless{color:var(--semi-color-warning)}.semi-button-warning:not(.semi-button-borderless):not(.semi-button-light):focus-visible{outline:2px solid var(--semi-color-warning-light-active)}.semi-button-tertiary{background-color:var(--semi-color-tertiary);color:rgba(var(--semi-white),1);transition:background-color var(--semi-transition_duration-none) var(--semi-transition_function-easeIn) var(--semi-transition_delay-none),border var(--semi-transition_duration-none) var(--semi-transition_function-easeIn) var(--semi-transition_delay-none);transform:scale(var(--semi-transform_scale-none))}.semi-button-tertiary.semi-button-colorful.semi-button-solid{background:var(--semi-ai-general-0)}.semi-button-tertiary.semi-button-colorful.semi-button-solid:hover{background:var(--semi-ai-general-1)}.semi-button-tertiary.semi-button-colorful.semi-button-solid:active{background:var(--semi-ai-general-2)}.semi-button-tertiary.semi-button-colorful.semi-button-solid .semi-button-content-right,.semi-button-tertiary.semi-button-colorful.semi-button-solid .semi-button-content:not(:has(>.semi-button-content-right)){background:var(--semi-color-ai-general);-webkit-background-clip:text;background-clip:text;color:transparent}.semi-button-tertiary-disabled{background-color:var(--semi-color-disabled-bg)}.semi-button-tertiary-disabled.semi-button-outline{background-color:transparent;border:1px solid var(--semi-color-border)}.semi-button-tertiary-disabled.semi-button-light{background-color:var(--semi-color-fill-0)}.semi-button-tertiary:hover{background-color:var(--semi-color-tertiary-hover)}.semi-button-tertiary:active{background-color:var(--semi-color-tertiary-active)}.semi-button-tertiary.semi-button-outline{background-color:transparent;border:1px solid var(--semi-color-border)}.semi-button-tertiary.semi-button-light,.semi-button-tertiary.semi-button-outline,.semi-button-tertiary.semi-button-borderless{color:var(--semi-color-text-1)}.semi-button-primary{background-color:var(--semi-color-primary);color:rgba(var(--semi-white),1);transition:background-color var(--semi-transition_duration-none) var(--semi-transition_function-easeIn) var(--semi-transition_delay-none),border var(--semi-transition_duration-none) var(--semi-transition_function-easeIn) var(--semi-transition_delay-none);transform:scale(var(--semi-transform_scale-none))}.semi-button-primary.semi-button-colorful.semi-button-solid{background:var(--semi-color-ai-general)}.semi-button-primary.semi-button-colorful.semi-button-solid:not(.semi-button-borderless):not(.semi-button-light):not(.semi-button-outline):hover{background:var(--semi-color-ai-general-hover)}.semi-button-primary.semi-button-colorful.semi-button-solid:not(.semi-button-borderless):not(.semi-button-light):not(.semi-button-outline):active{background:var(--semi-color-ai-general-active)}.semi-button-primary.semi-button-colorful.semi-button-light .semi-button-content-right,.semi-button-primary.semi-button-colorful.semi-button-light .semi-button-content:not(:has(>.semi-button-content-right)){background:var(--semi-color-ai-general);-webkit-background-clip:text;background-clip:text;color:transparent}.semi-button-primary.semi-button-colorful.semi-button-outline{color:var(--semi-color-ai-purple);border-color:var(--semi-color-ai-purple)}.semi-button-primary.semi-button-colorful.semi-button-borderless .semi-button-content-right,.semi-button-primary.semi-button-colorful.semi-button-borderless .semi-button-content:not(:has(>.semi-button-content-right)){background:var(--semi-color-ai-general);-webkit-background-clip:text;background-clip:text;color:transparent}.semi-button-primary-disabled{background-color:var(--semi-color-disabled-bg)}.semi-button-primary-disabled.semi-button-light{background:var(--semi-color-fill-0)}.semi-button-primary-disabled.semi-button-outline{background-color:transparent;border:1px solid var(--semi-color-border)}.semi-button-primary:not(.semi-button-borderless):not(.semi-button-light):not(.semi-button-outline):hover{background-color:var(--semi-color-primary-hover)}.semi-button-primary.semi-button-outline{background-color:transparent;border:1px solid var(--semi-color-border)}.semi-button-primary:not(.semi-button-borderless):not(.semi-button-light):not(.semi-button-outline):active{background-color:var(--semi-color-primary-active)}.semi-button-primary.semi-button-light,.semi-button-primary.semi-button-outline,.semi-button-primary.semi-button-borderless{color:var(--semi-color-primary)}.semi-button-secondary{background-color:var(--semi-color-secondary);outline-color:var(--semi-color-secondary);color:rgba(var(--semi-white),1);transition:background-color var(--semi-transition_duration-none) var(--semi-transition_function-easeIn) var(--semi-transition_delay-none),border var(--semi-transition_duration-none) var(--semi-transition_function-easeIn) var(--semi-transition_delay-none);transform:scale(var(--semi-transform_scale-none))}.semi-button-secondary-disabled{background-color:var(--semi-color-disabled-bg)}.semi-button-secondary-disabled.semi-button-outline{background-color:transparent;border:1px solid var(--semi-color-border)}.semi-button-secondary-disabled.semi-button-light{background-color:var(--semi-color-fill-0)}.semi-button-secondary.semi-button-outline{background-color:transparent;border:1px solid var(--semi-color-border)}.semi-button-secondary:hover{background-color:var(--semi-color-secondary-hover)}.semi-button-secondary:active{background-color:var(--semi-color-secondary-active)}.semi-button-secondary.semi-button-light,.semi-button-secondary.semi-button-outline,.semi-button-secondary.semi-button-borderless{color:var(--semi-color-secondary)}.semi-button-disabled{color:var(--semi-color-disabled-text);cursor:not-allowed}.semi-button-disabled:not(.semi-button-borderless):not(.semi-button-light):not(.semi-button-outline):hover{color:var(--semi-color-disabled-text)}.semi-button-disabled.semi-button-light,.semi-button-disabled.semi-button-borderless,.semi-button-disabled.semi-button-outline{color:var(--semi-color-disabled-text)}.semi-button-borderless{background-color:transparent;border:0 transparent solid;transition:background-color var(--semi-transition_duration-none) var(--semi-transition_function-easeIn) var(--semi-transition_delay-none);transform:scale(var(--semi-transform_scale-none))}.semi-button-borderless:not(.semi-button-disabled):hover{background-color:var(--semi-color-fill-0);border:0 transparent solid}.semi-button-borderless:not(.semi-button-disabled):active{background-color:var(--semi-color-fill-1);border:0 transparent solid}.semi-button-outline{background-color:transparent}.semi-button-outline:not(.semi-button-disabled):hover{background-color:var(--semi-color-fill-0)}.semi-button-outline:not(.semi-button-disabled):active{background-color:var(--semi-color-fill-1)}.semi-button-light{background-color:var(--semi-color-fill-0);border:0 transparent solid;transition:background-color var(--semi-transition_duration-none) var(--semi-transition_function-easeIn) var(--semi-transition_delay-none),border var(--semi-transition_duration-none) var(--semi-transition_function-easeIn) var(--semi-transition_delay-none);transform:scale(var(--semi-transform_scale-none))}.semi-button-light:not(.semi-button-disabled):hover{background-color:var(--semi-color-fill-1);border:0 transparent solid}.semi-button-light:not(.semi-button-disabled):active{background-color:var(--semi-color-fill-2);border:0 transparent solid}.semi-button-size-small{height:24px;padding:2px 12px;font-size:14px;line-height:20px;font-weight:600}.semi-button-size-large{height:40px;padding:10px 16px;font-size:14px;line-height:20px;font-weight:600}.semi-button-block{width:100%}.semi-button-group{display:flex;flex-wrap:wrap}.semi-button-group>.semi-button{margin:0;padding-left:0;padding-right:0;border-radius:0}.semi-button-group>.semi-button .semi-button-content{padding-left:12px;padding-right:12px}.semi-button-group>.semi-button-size-large .semi-button-content{padding-left:16px;padding-right:16px}.semi-button-group>.semi-button-size-small .semi-button-content{padding-left:12px;padding-right:12px}.semi-button-group>.semi-button.semi-button-with-icon-only{padding-left:0;padding-right:0}.semi-button-group>.semi-button.semi-button-with-icon-only .semi-button-content{padding-left:8px;padding-right:8px}.semi-button-group>.semi-button.semi-button-with-icon-only.semi-button-size-small .semi-button-content{padding-left:4px;padding-right:4px}.semi-button-group>.semi-button.semi-button-with-icon-only.semi-button-size-large .semi-button-content{padding-left:12px;padding-right:12px}.semi-button-group>.semi-button:first-child{border-top-left-radius:var(--semi-border-radius-small);border-bottom-left-radius:var(--semi-border-radius-small)}.semi-button-group>.semi-button:last-child{border-top-right-radius:var(--semi-border-radius-small);border-bottom-right-radius:var(--semi-border-radius-small)}.semi-button-group>.semi-button-outline:not(:last-child){border-right-color:transparent;margin-right:-1px}.semi-button-group-line{display:inline-flex;align-items:center;background-color:var(--semi-color-border)}.semi-button-group-line-primary{background-color:var(--semi-color-primary)}.semi-button-group-line-secondary{background-color:var(--semi-color-secondary)}.semi-button-group-line-tertiary{background-color:var(--semi-color-tertiary)}.semi-button-group-line-warning{background-color:var(--semi-color-warning)}.semi-button-group-line-danger{background-color:var(--semi-color-danger)}.semi-button-group-line-disabled{background-color:var(--semi-color-disabled-bg)}.semi-button-group-line-light{background-color:var(--semi-color-fill-0)}.semi-button-group-line-borderless{background-color:transparent}.semi-button-group-line:before{display:block;content:"";width:1px;height:20px;background-color:var(--semi-color-border)}@keyframes semi-animation-rotate{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.semi-button.semi-button-with-icon{display:inline-flex;align-items:center}.semi-button.semi-button-with-icon .semi-button-content{display:flex;align-items:center;justify-content:center}.semi-button.semi-button-loading{pointer-events:none;cursor:not-allowed}.semi-button.semi-button-loading .semi-button-content>svg,.semi-button.semi-button-loading .semi-button-content-loading-icon{width:16px;height:16px;animation:.6s linear infinite semi-animation-rotate;animation-fill-mode:forwards}.semi-button.semi-button-with-icon-only{padding:8px;height:32px;width:32px;justify-content:center;align-items:center}.semi-button.semi-button-with-icon-only.semi-button-size-small{padding:4px;height:24px;width:24px}.semi-button.semi-button-with-icon-only.semi-button-size-large{padding:12px;height:40px;width:40px}.semi-button-content-left{margin-right:8px;display:flex;align-items:center}.semi-button-content-right{margin-left:8px;display:flex;align-items:center}.semi-rtl .semi-button,.semi-portal-rtl .semi-button{direction:rtl;padding-left:12px;padding-right:12px}.semi-rtl .semi-button-size-small,.semi-portal-rtl .semi-button-size-small{padding-left:12px;padding-right:12px}.semi-rtl .semi-button-size-large,.semi-portal-rtl .semi-button-size-large{padding-left:16px;padding-right:16px}.semi-rtl .semi-button-group,.semi-portal-rtl .semi-button-group{direction:rtl}.semi-rtl .semi-button-group>.semi-button,.semi-portal-rtl .semi-button-group>.semi-button{padding-left:0;padding-right:0}.semi-rtl .semi-button-group>.semi-button .semi-button-content,.semi-portal-rtl .semi-button-group>.semi-button .semi-button-content{padding-left:12px;padding-right:12px}.semi-rtl .semi-button-group>.semi-button-size-large .semi-button-content,.semi-portal-rtl .semi-button-group>.semi-button-size-large .semi-button-content{padding-left:16px;padding-right:16px}.semi-rtl .semi-button-group>.semi-button-size-small .semi-button-content,.semi-portal-rtl .semi-button-group>.semi-button-size-small .semi-button-content{padding-left:12px;padding-right:12px}.semi-rtl .semi-button-group>.semi-button.semi-button-with-icon-only,.semi-portal-rtl .semi-button-group>.semi-button.semi-button-with-icon-only{padding-left:0;padding-right:0}.semi-rtl .semi-button-group>.semi-button.semi-button-with-icon-only .semi-button-content,.semi-portal-rtl .semi-button-group>.semi-button.semi-button-with-icon-only .semi-button-content{padding-left:8px;padding-right:8px}.semi-rtl .semi-button-group>.semi-button.semi-button-with-icon-only.semi-button-size-small .semi-button-content,.semi-portal-rtl .semi-button-group>.semi-button.semi-button-with-icon-only.semi-button-size-small .semi-button-content{padding-left:4px;padding-right:4px}.semi-rtl .semi-button-group>.semi-button.semi-button-with-icon-only.semi-button-size-large .semi-button-content,.semi-portal-rtl .semi-button-group>.semi-button.semi-button-with-icon-only.semi-button-size-large .semi-button-content{padding-left:12px;padding-right:12px}.semi-rtl .semi-button-group>.semi-button:first-child,.semi-portal-rtl .semi-button-group>.semi-button:first-child{border-top-left-radius:0;border-bottom-left-radius:0;border-top-right-radius:var(--semi-border-radius-small);border-bottom-right-radius:var(--semi-border-radius-small)}.semi-rtl .semi-button-group>.semi-button:not(:last-child) .semi-button-content,.semi-portal-rtl .semi-button-group>.semi-button:not(:last-child) .semi-button-content{border-left:1px var(--semi-color-border) solid;border-right:0}.semi-rtl .semi-button-group>.semi-button:last-child,.semi-portal-rtl .semi-button-group>.semi-button:last-child{border-top-right-radius:0;border-bottom-right-radius:0;border-top-left-radius:var(--semi-border-radius-small);border-bottom-left-radius:var(--semi-border-radius-small)}.semi-rtl .semi-button.semi-button-with-icon-only,.semi-portal-rtl .semi-button.semi-button-with-icon-only{padding-left:8px;padding-right:8px}.semi-rtl .semi-button.semi-button-with-icon-only.semi-button-size-small,.semi-portal-rtl .semi-button.semi-button-with-icon-only.semi-button-size-small{padding-left:4px;padding-right:4px}.semi-rtl .semi-button.semi-button-with-icon-only.semi-button-size-large,.semi-portal-rtl .semi-button.semi-button-with-icon-only.semi-button-size-large{padding-left:12px;padding-right:12px}.semi-rtl .semi-button-content-left,.semi-portal-rtl .semi-button-content-left{margin-left:8px;margin-right:0}.semi-rtl .semi-button-content-right,.semi-portal-rtl .semi-button-content-right{margin-right:8px;margin-left:0} diff --git a/frontends/desktop/dist/assets/index-D_sWIqse.js b/frontends/desktop/dist/assets/index-D_sWIqse.js new file mode 100644 index 000000000..4fd007a52 --- /dev/null +++ b/frontends/desktop/dist/assets/index-D_sWIqse.js @@ -0,0 +1 @@ +import{B as f,f as y,k as h,R as l,aw as S,l as _,P as a,s as b}from"./tauri-compat-tfiFK9EG.js";const O=`${f}-spin`,E={PREFIX:O},P={SIZE:["small","middle","large"]};class d extends y{static get spinDefaultAdapter(){return{getProp:()=>{},setLoading:e=>{}}}constructor(e){super(Object.assign(Object.assign({},d.spinDefaultAdapter),e))}updateLoadingIfNeedDelay(){const{spinning:e,delay:n}=this._adapter.getProps(),{delay:t}=this._adapter.getStates();if(t){const s=this;this._timer=setTimeout(()=>{s._adapter.setState({loading:e,delay:0})},n)}}destroy(){this._timer&&(clearTimeout(this._timer),this._timer=null)}}var j=function(i,e){var n={};for(var t in i)Object.prototype.hasOwnProperty.call(i,t)&&e.indexOf(t)<0&&(n[t]=i[t]);if(i!=null&&typeof Object.getOwnPropertySymbols=="function")for(var s=0,t=Object.getOwnPropertySymbols(i);s{this.setState({loading:e})}})}componentWillUnmount(){this.foundation.destroy()}renderSpin(){const{indicator:e,tip:n}=this.props,{loading:t}=this.state;return t?l.createElement("div",{className:`${r}-wrapper`},e?l.createElement("div",{className:`${r}-animate`,"x-semi-prop":"indicator"},e):l.createElement(S,null),n?l.createElement("div",{"x-semi-prop":"tip"},n):null):null}render(){this.foundation.updateLoadingIfNeedDelay();const e=this.props,{children:n,style:t,wrapperClassName:s,childStyle:c,size:p}=e,m=j(e,["children","style","wrapperClassName","childStyle","size"]),{loading:u}=this.state,g=_(r,s,{[`${r}-${p}`]:p,[`${r}-block`]:n,[`${r}-hidden`]:!u});return l.createElement("div",Object.assign({className:g,style:t},this.getDataAttr(m)),this.renderSpin(),l.createElement("div",{className:`${r}-children`,style:c,"x-semi-prop":"children"},n))}}o.propTypes={size:a.oneOf(P.SIZE),spinning:a.bool,children:a.node,indicator:a.node,delay:a.number,tip:a.node,wrapperClassName:a.string,childStyle:a.object,style:a.object};o.__SemiComponentName__="Spin";o.defaultProps=b(o.__SemiComponentName__,{size:"middle",spinning:!0,children:null,indicator:null,delay:0});export{o as S}; diff --git a/frontends/desktop/dist/assets/index-DkG9Cu-r.css b/frontends/desktop/dist/assets/index-DkG9Cu-r.css new file mode 100644 index 000000000..3ad08f340 --- /dev/null +++ b/frontends/desktop/dist/assets/index-DkG9Cu-r.css @@ -0,0 +1 @@ +.semi-spin{position:relative;display:inline-block;width:20px;height:20px}@keyframes semi-animation-rotate{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.semi-spin-wrapper{text-align:center;position:absolute;width:100%;transform:translateY(-50%);top:50%;color:var(--semi-color-primary)}.semi-spin-wrapper>svg{display:inline;animation:.6s linear infinite semi-animation-rotate;animation-fill-mode:forwards;vertical-align:top;width:20px;height:20px}.semi-spin-animate{display:inline-flex;animation:1.6s linear infinite semi-animation-rotate;animation-fill-mode:forwards}.semi-spin-children{opacity:.5;-webkit-user-select:none;user-select:none}.semi-spin-block{display:block}.semi-spin-block:after{content:"";position:absolute;top:0;left:0;width:100%;height:100%;z-index:1}.semi-spin-block .semi-spin-wrapper{display:block}.semi-spin-block.semi-spin{height:auto;width:auto}.semi-spin-hidden:after{content:none}.semi-spin-hidden>.semi-spin-children{opacity:1;-webkit-user-select:auto;user-select:auto}.semi-spin-small{width:14px;height:14px}.semi-spin-small>.semi-spin-wrapper svg{width:14px;height:14px}.semi-spin-middle{width:20px;height:20px}.semi-spin-middle>.semi-spin-wrapper svg{width:20px;height:20px}.semi-spin-large{width:32px;height:32px}.semi-spin-large>.semi-spin-wrapper svg{width:32px;height:32px}.semi-spin-container{overflow:hidden}.semi-rtl .semi-spin,.semi-portal-rtl .semi-spin,.semi-rtl .semi-spin-container,.semi-portal-rtl .semi-spin-container{direction:rtl} diff --git a/frontends/desktop/dist/assets/index-DpGuh58E.js b/frontends/desktop/dist/assets/index-DpGuh58E.js new file mode 100644 index 000000000..3b72b9a9d --- /dev/null +++ b/frontends/desktop/dist/assets/index-DpGuh58E.js @@ -0,0 +1 @@ +import{B as g,f as y,k as E,w as C,R as t,l as m,T as u,U as $,S as v,P as o}from"./tauri-compat-tfiFK9EG.js";import{a as I,I as N,b as x,c as B}from"./index-Bpi3BHKj.js";const P={PREFIX:`${g}-banner`},w={TYPE:["info","success","danger","warning"]};class l extends y{constructor(e){super(Object.assign(Object.assign({},l.defaultAdapter),e))}removeBanner(e){this._adapter.notifyClose(e),this._adapter.setVisible()}}const n=P.PREFIX,T=w.TYPE;class h extends E{constructor(e){super(e),this.remove=s=>{s&&s.stopPropagation(),this.foundation.removeBanner(s)},this.state={visible:!0},C("target"in this.props,"[Semi Banner] 'target' has been deprecated, please write JSX directly instead.")}get adapter(){return Object.assign(Object.assign({},super.adapter),{setVisible:()=>{this.setState({visible:!1})},notifyClose:e=>{const{onClose:s}=this.props;s(e)}})}componentDidMount(){this.foundation=new l(this.adapter),this.foundation.init()}componentWillUnmount(){this.foundation.destroy()}renderCloser(){const{closeIcon:e}=this.props;return e===null?e:t.createElement(I,{className:`${n}-close`,onClick:this.remove,icon:e||t.createElement(N,{"x-semi-prop":"closeIcon","aria-hidden":!0}),theme:"borderless",size:"small",type:"tertiary","aria-label":"Close"})}renderIcon(){const{type:e,icon:s}=this.props;let a={warning:t.createElement(B,{size:"large","aria-label":"warning"}),success:t.createElement(v,{size:"large","aria-label":"success"}),info:t.createElement(x,{size:"large","aria-label":"info"}),danger:t.createElement($,{size:"large","aria-label":"danger"})}[e];const r=m({[`${n}-icon`]:!0});return typeof s<"u"&&(a=s),a?t.createElement("div",{className:r,"x-semi-prop":"icon"},a):null}render(){const{children:e,type:s,className:c,style:a,bordered:r,title:p,description:d,fullMode:i}=this.props,{visible:b}=this.state,f=m(n,c,{[`${n}-${s}`]:s,[`${n}-full`]:i,[`${n}-in-container`]:!i,[`${n}-bordered`]:!i&&r});return b?t.createElement("div",Object.assign({className:f,style:a,role:"alert"},this.getDataAttr(this.props)),t.createElement("div",{className:`${n}-content-wrapper`},t.createElement("div",{className:`${n}-content`},this.renderIcon(),t.createElement("div",{className:`${n}-content-body`},p?t.createElement(u.Title,{heading:5,className:`${n}-title`,component:"div","x-semi-prop":"title"},p):null,d?t.createElement(u.Paragraph,{className:`${n}-description`,component:"div","x-semi-prop":"description"},d):null)),this.renderCloser()),e?t.createElement("div",{className:`${n}-extra`,"x-semi-prop":"children"},e):null):null}}h.propTypes={fullMode:o.bool,type:o.oneOf(T),title:o.node,description:o.node,icon:o.node,closeIcon:o.node,children:o.node,style:o.object,className:o.string,onClose:o.func,bordered:o.bool};h.defaultProps={onClose:()=>{},type:"info",fullMode:!0};export{h as B}; diff --git a/frontends/desktop/dist/assets/index-DwVcZP0M.js b/frontends/desktop/dist/assets/index-DwVcZP0M.js new file mode 100644 index 000000000..faa636ff0 --- /dev/null +++ b/frontends/desktop/dist/assets/index-DwVcZP0M.js @@ -0,0 +1,4 @@ +import{g as te,C as _t,c as Oe,b as L,R as b,P as a,B as X,f as ge,i as Ce,l as M,au as qt,aR as va,ad as Ca,aS as Gt,aT as Qo,aU as Jo,K as ei,L as _a,D as Oa,aV as ti,aW as Ra,aX as Ea,aY as ni,v as xa,y as Ta,N as x,aZ as Ps,n as ft,w as $e,a_ as Yt,h as H,k as he,o as jt,aL as re,a$ as Ia,b0 as As,a as Pa,u as si,b1 as Aa,b2 as Da,b3 as ri,G as oi,b4 as Na,b5 as Ds,t as ii,b6 as Ns,b7 as ai,b8 as ka,b9 as li,M as La,_ as ue,az as Pt,s as ks,a0 as Ma,V as ye,J as je,p as Et,E as ja,ae as Xt,aQ as yt,X as Ee,aa as za,ba as Fa,bb as Ka,bc as $a,bd as Ba,m as hr,O as Ls,aH as ci,ag as Ms,be as Ha,bf as Wa,bg as le,bh as Ua,x as di,A as Va,bi as Zt,ax as Ne,bj as qa,bk as we,ab as ui,Y as hi,j as Ae,bl as Ga,bm as Ya,d as Xa,e as Za,aJ as Qa,bn as Ja,H as el,bo as St,bp as pr,bq as zt,br as tl}from"./tauri-compat-tfiFK9EG.js";import{_ as gt,r as nl,o as pi,p as sl,q as rl,v as ol,w as il,x as fi,y as al,T as mt,z as gi,F as fr,I as ll,A as cl,D as gr,G as Fe,R as dl,a as Re,j as ul}from"./main-Knf6L_en.js";import{S as mi}from"./index-D_sWIqse.js";import{B as Ft,I as hl}from"./index-Bpi3BHKj.js";const pl=["default","error","warning","success"];var fl=_t();const gl=te(fl);function mr(i){if(i===void 0)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return i}function _s(i,e){return _s=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(t,n){return t.__proto__=n,t},_s(i,e)}function ml(i){return L.createElement("svg",Object.assign({viewBox:"0 0 24 24",fill:"none",xmlns:"http://www.w3.org/2000/svg",width:"1em",height:"1em",focusable:!1,"aria-hidden":!0},i),L.createElement("path",{d:"m17.55 15.66-4.8 5.48a1 1 0 0 1-1.5 0l-4.8-5.48A1 1 0 0 1 7.2 14h9.6a1 1 0 0 1 .75 1.66Z",fill:"currentColor"}))}const bl=Oe(ml,"caretdown");function yl(i){return L.createElement("svg",Object.assign({viewBox:"0 0 24 24",fill:"none",xmlns:"http://www.w3.org/2000/svg",width:"1em",height:"1em",focusable:!1,"aria-hidden":!0},i),L.createElement("path",{d:"m6.45 8.34 4.8-5.48a1 1 0 0 1 1.5 0l4.8 5.48A1 1 0 0 1 16.8 10H7.2a1 1 0 0 1-.75-1.66Z",fill:"currentColor"}))}const Sl=Oe(yl,"caretup");function wl(i){return L.createElement("svg",Object.assign({viewBox:"0 0 24 24",fill:"none",xmlns:"http://www.w3.org/2000/svg",width:"1em",height:"1em",focusable:!1,"aria-hidden":!0},i),L.createElement("path",{d:"M5 12.5c0-.83.67-1.5 1.5-1.5h11a1.5 1.5 0 0 1 0 3h-11A1.5 1.5 0 0 1 5 12.5Z",fill:"currentColor"}))}const vl=Oe(wl,"checkbox_indeterminate");function Cl(i){return L.createElement("svg",Object.assign({viewBox:"0 0 24 24",fill:"none",xmlns:"http://www.w3.org/2000/svg",width:"1em",height:"1em",focusable:!1,"aria-hidden":!0},i),L.createElement("path",{fillRule:"evenodd",clipRule:"evenodd",d:"M17.41 7.3c.66.51.78 1.45.28 2.11l-6.5 8.5a1.5 1.5 0 0 1-2.37.01l-3.5-4.5a1.5 1.5 0 1 1 2.36-1.84L10 14.54l5.32-6.95a1.5 1.5 0 0 1 2.1-.28Z",fill:"currentColor"}))}const _l=Oe(Cl,"checkbox_tick");function Ol(i){return L.createElement("svg",Object.assign({viewBox:"0 0 24 24",fill:"none",xmlns:"http://www.w3.org/2000/svg",width:"1em",height:"1em",focusable:!1,"aria-hidden":!0},i),L.createElement("path",{fillRule:"evenodd",clipRule:"evenodd",d:"M16.28 4.24a1.5 1.5 0 0 1 0 2.12l-5.66 5.66 5.66 5.65a1.5 1.5 0 1 1-2.12 2.13l-6.72-6.72a1.5 1.5 0 0 1 0-2.12l6.72-6.72a1.5 1.5 0 0 1 2.12 0Z",fill:"currentColor"}))}const bi=Oe(Ol,"chevron_left");function Rl(i){return L.createElement("svg",Object.assign({viewBox:"0 0 24 24",fill:"none",xmlns:"http://www.w3.org/2000/svg",width:"1em",height:"1em",focusable:!1,"aria-hidden":!0},i),L.createElement("path",{fillRule:"evenodd",clipRule:"evenodd",d:"M7.44 19.8a1.5 1.5 0 0 1 0-2.13l5.66-5.65-5.66-5.66a1.5 1.5 0 1 1 2.12-2.12l6.72 6.72a1.5 1.5 0 0 1 0 2.12L9.56 19.8a1.5 1.5 0 0 1-2.12 0Z",fill:"currentColor"}))}const js=Oe(Rl,"chevron_right");function El(i){return L.createElement("svg",Object.assign({viewBox:"0 0 24 24",fill:"none",xmlns:"http://www.w3.org/2000/svg",width:"1em",height:"1em",focusable:!1,"aria-hidden":!0},i),L.createElement("path",{fillRule:"evenodd",clipRule:"evenodd",d:"M1.1 2.58A1 1 0 0 1 2 2h20a1 1 0 0 1 .76 1.65l-8.2 9.18V21a1 1 0 0 1-1.44.9l-3.07-2a1 1 0 0 1-.55-.9v-6.17L1.24 3.65a1 1 0 0 1-.15-1.07Z",fill:"currentColor"}))}const xl=Oe(El,"filter");function Tl(i){return L.createElement("svg",Object.assign({viewBox:"0 0 24 24",fill:"none",xmlns:"http://www.w3.org/2000/svg",width:"1em",height:"1em",focusable:!1,"aria-hidden":!0},i),L.createElement("path",{fillRule:"evenodd",clipRule:"evenodd",d:"M10.5 2a8.5 8.5 0 1 0 4.86 15.48l4.08 4.08a1.5 1.5 0 1 0 2.12-2.12l-4.08-4.08A8.5 8.5 0 0 0 10.5 2ZM5 10.5a5.5 5.5 0 1 1 11 0 5.5 5.5 0 0 1-11 0Z",fill:"currentColor"}))}const Il=Oe(Tl,"search");function Pl(i){return L.createElement("svg",Object.assign({viewBox:"0 0 24 24",fill:"none",xmlns:"http://www.w3.org/2000/svg",width:"1em",height:"1em",focusable:!1,"aria-hidden":!0},i),L.createElement("path",{d:"m20.56 9.66-7.8 8.97a1 1 0 0 1-1.51 0L3.44 9.66A1 1 0 0 1 4.19 8h15.62a1 1 0 0 1 .75 1.66Z",fill:"currentColor"}))}const Al=Oe(Pl,"tree_triangle_down");function Dl(i){return L.createElement("svg",Object.assign({viewBox:"0 0 24 24",fill:"none",xmlns:"http://www.w3.org/2000/svg",width:"1em",height:"1em",focusable:!1,"aria-hidden":!0},i),L.createElement("path",{d:"m9.66 3.44 8.97 7.8a1 1 0 0 1 0 1.51l-8.97 7.81A1 1 0 0 1 8 19.81V4.19a1 1 0 0 1 1.66-.75Z",fill:"currentColor"}))}const Nl=Oe(Dl,"tree_triangle_right");var kl=function(i,e){var t={};for(var n in i)Object.prototype.hasOwnProperty.call(i,n)&&e.indexOf(n)<0&&(t[n]=i[n]);if(i!=null&&typeof Object.getOwnPropertySymbols=="function")for(var s=0,n=Object.getOwnPropertySymbols(i);si.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g,"\\$&");class jl extends ge{constructor(e){super(Object.assign({},e)),this.findAll=t=>{let{autoEscape:n=!0,caseSensitive:s=!1,searchWords:r,sourceString:o}=t;Ce(r)&&(r=[r]);const l=this.findChunks({autoEscape:n,caseSensitive:s,searchWords:r,sourceString:o}),c=this.combineChunks({chunks:l});return this.fillInChunks({chunksToHighlight:c,totalLength:o?o.length:0})},this.findChunks=t=>{let{autoEscape:n,caseSensitive:s,searchWords:r,sourceString:o}=t;return r.map(l=>typeof l=="string"?{text:l}:l).filter(l=>l.text).reduce((l,c)=>{let d=c.text;n&&(d=Ml(d));const u=new RegExp(d,s?"g":"gi");let h;for(;h=u.exec(o);){const g=h.index,m=u.lastIndex;m>g&&l.push({highlight:!0,start:g,end:m,className:c.className,style:c.style}),h.index===u.lastIndex&&u.lastIndex++}return l},[])},this.combineChunks=t=>{let{chunks:n}=t;return n.sort((s,r)=>s.start-r.start).reduce((s,r)=>{if(s.length===0)return[r];{const o=s.pop();if(r.start<=o.end){const l=Math.max(o.end,r.end);s.push({highlight:!0,start:o.start,end:l,className:o.className||r.className,style:Object.assign(Object.assign({},o.style),r.style)})}else s.push(o,r);return s}},[])},this.fillInChunks=t=>{let{chunksToHighlight:n,totalLength:s}=t;const r=[],o=(l,c,d,u,h)=>{c-l>0&&r.push({start:l,end:c,highlight:d,className:u,style:h})};if(n.length===0)o(0,s,!1);else{let l=0;n.forEach(c=>{o(l,c.start,!1),o(c.start,c.end,!0,c.className,c.style),l=c.end}),o(l,s,!1)}return r}}}const zl=Ll.PREFIX;class zs extends L.PureComponent{constructor(){super(...arguments),this.getHighLightTextHTML=e=>{let{sourceString:t="",searchWords:n=[],option:s={autoEscape:!0,caseSensitive:!1}}=e;const r=new jl().findAll(Object.assign({sourceString:t,searchWords:n},s)),o=s.highlightTag||"mark",l=s.highlightClassName||"",c=s.highlightStyle||{};return r.map((d,u)=>{const{end:h,start:g,highlight:m,style:y,className:p}=d,f=t.substr(g,h-g);return m?b.createElement(o,{style:Object.assign(Object.assign({},c),y),className:`${l} ${p||""}`.trim(),key:f+u},f):f})}}render(){const{searchWords:e,sourceString:t,component:n,highlightClassName:s,highlightStyle:r,caseSensitive:o,autoEscape:l}=this.props,c=M({[`${zl}-tag`]:!0},s),d={highlightTag:n,highlightClassName:c,highlightStyle:r,caseSensitive:o,autoEscape:l};return this.getHighLightTextHTML({sourceString:t,searchWords:e,option:d})}}zs.propTypes={style:a.object,className:a.string,autoEscape:a.bool,caseSensitive:a.bool,sourceString:a.string,searchWords:a.arrayOf(a.string),highlightStyle:a.object,highlightClassName:a.string,component:a.string};zs.defaultProps={component:"mark",autoEscape:!0,caseSensitive:!1,sourceString:""};const Fl={PREFIX:`${X}-space`},ze={ALIGN_SET:["start","end","center","baseline"],SPACING_LOOSE:"loose",SPACING_MEDIUM:"medium",SPACING_TIGHT:"tight"},Kl="Symbol(react.fragment)",Os=i=>{let e=[];return b.Children.forEach(i,t=>{t!=null&&(Array.isArray(t)?e=e.concat(Os(t)):L.isValidElement(t)&&t.type&&t.type.toString()===Kl&&t.props?e=e.concat(Os(t.props.children)):e.push(t))}),e},be=Fl.PREFIX;class Qt extends L.PureComponent{render(){const{children:e=null,style:t,className:n,spacing:s,wrap:r,align:o,vertical:l}=this.props,c=r&&l?!1:r,d=Object.assign({},t);let u="",h="";Ce(s)?(u=s,h=s):gt(s)?(d.rowGap=s,d.columnGap=s):gl(s)&&(Ce(s[0])?u=s[0]:gt(s[0])&&(d.columnGap=`${s[0]}px`),Ce(s[1])?h=s[1]:gt(s[1])&&(d.rowGap=`${s[1]}px`));const g=M(be,n,{[`${be}-align-${o}`]:o,[`${be}-vertical`]:l,[`${be}-horizontal`]:!l,[`${be}-wrap`]:c,[`${be}-tight-horizontal`]:u===ze.SPACING_TIGHT,[`${be}-tight-vertical`]:h===ze.SPACING_TIGHT,[`${be}-medium-horizontal`]:u===ze.SPACING_MEDIUM,[`${be}-medium-vertical`]:h===ze.SPACING_MEDIUM,[`${be}-loose-horizontal`]:u===ze.SPACING_LOOSE,[`${be}-loose-vertical`]:h===ze.SPACING_LOOSE}),m=Os(e),y=qt(this.props);return b.createElement("div",Object.assign({},y,{className:g,style:d,"x-semi-prop":"children"}),m)}}Qt.propTypes={wrap:a.bool,align:a.oneOf(ze.ALIGN_SET),vertical:a.bool,spacing:a.oneOfType([a.string,a.number,a.array]),children:a.node,style:a.object,className:a.string};Qt.defaultProps={vertical:!1,wrap:!1,spacing:"tight",align:"center"};var $l=va();const Pe=te($l);var yn,br;function Bl(){if(br)return yn;br=1;var i=Ca(),e=1/0,t=17976931348623157e292;function n(s){if(!s)return s===0?s:0;if(s=i(s),s===e||s===-e){var r=s<0?-1:1;return r*t}return s===s?s:0}return yn=n,yn}var Sn,yr;function Jt(){if(yr)return Sn;yr=1;var i=Bl();function e(t){var n=i(t),s=n%1;return n===n?s?n-s:n:0}return Sn=e,Sn}var wn,Sr;function Hl(){if(Sr)return wn;Sr=1;var i=pi(),e=Gt(),t=Qo(),n=Jt(),s=nl(),r=Math.max;function o(l,c,d,u){l=e(l)?l:s(l),d=d&&!u?n(d):0;var h=l.length;return d<0&&(d=r(h+d,0)),t(l)?d<=h&&l.indexOf(c,d)>-1:!!h&&i(l,c,d)>-1}return wn=o,wn}var Wl=Hl();const Kt=te(Wl);var vn,wr;function Ul(){if(wr)return vn;wr=1;var i=sl(),e=Jo(),t=ei(),n=_a(),s=t(function(r,o){return n(r)?i(r,e(o,1,n,!0)):[]});return vn=s,vn}var Vl=Ul();const vr=te(Vl);var Cn,Cr;function ql(){if(Cr)return Cn;Cr=1;var i=Oa();function e(t,n,s){for(var r=-1,o=t.length;++rt}return _n=i,_n}var On,Or;function Yl(){if(Or)return On;Or=1;var i=ql(),e=Gl(),t=ti();function n(s){return s&&s.length?i(s,t,e):void 0}return On=n,On}Yl();var Rn,Rr;function Xl(){if(Rr)return Rn;Rr=1;var i=Ra(),e=Ea(),t=ni(),n=1/0,s=i&&1/t(new i([,-0]))[1]==n?function(r){return new i(r)}:e;return Rn=s,Rn}var En,Er;function Zl(){if(Er)return En;Er=1;var i=xa(),e=rl(),t=ol(),n=Ta(),s=Xl(),r=ni(),o=200;function l(c,d,u){var h=-1,g=e,m=c.length,y=!0,p=[],f=p;if(u)y=!1,g=t;else if(m>=o){var S=d?null:s(c);if(S)return r(S);y=!1,g=n,f=new i}else f=d?[]:p;e:for(;++h{const d=o?o[s]:i,u=o?tc(c.pos,l):"0";if(o){const h=x(o,n,null),g={data:Object.assign({},o),ind:l,pos:u,key:h!==null?h:u,parentPos:c.node?c.pos:null,level:Number(c.level)+1};e(g)}d&&d.forEach((h,g)=>{r(h,g,{node:o,pos:u,level:c?Number(c.level)+1:-1})})};r(null)}function rc(i,e){const t={},n={},s={},r={posEntities:t,keyEntities:n,valueEntities:s},o=x(e,"value","value");return sc(i,l=>{const{pos:c,key:d,parentPos:u}=l,h=Object.assign({},l),g=x(h,`data.${o}`,null);g!==null&&(s[g]=d),t[c]=h,n[d]=h,h.parent=t[u],h.parent&&(h.parent.children=h.parent.children||[],h.parent.children.push(h))},e),r}function Si(i,e){let t=arguments.length>2&&arguments[2]!==void 0?arguments[2]:!0;const n=[],s=r=>{if(!r)return;const{children:o}=r;nc(o)&&o.forEach(c=>{n.push(c.key),s(e[c.key])})};return i.forEach(r=>{t&&n.push(r),s(e[r])}),n}function oc(i,e){let t=arguments.length>2&&arguments[2]!==void 0?arguments[2]:[];const n=[];return i&&i.forEach(s=>{const r=e[s];r&&r.children&&r.children.forEach(o=>{(!t.length||!t.includes(o.key))&&n.push(o.key)})}),n}function wi(i,e){let t=arguments.length>2&&arguments[2]!==void 0?arguments[2]:!0;const n=[];return i.forEach(r=>{e[r]&&e[r].parent&&n.push(e[r].parent.key)}),oc(ec(n),e,t?[]:i)}function vi(i,e){let t=arguments.length>2&&arguments[2]!==void 0?arguments[2]:!0;const n=[],s=r=>{r.parent&&(n.push(r.parent.key),s(r.parent))};return i.forEach(r=>{e[r]&&s(e[r]),t&&n.push(r)}),n}function Tr(i,e,t,n){const s=Si([i],e,!0),r=e[i];t=new Set([...t,i]);const o=l=>{if(!l.parent)return;const{key:c}=l;if(wi([c],e).every(h=>t.has(h))){const h=l.parent;t.add(h.key),o(h)}else{const h=vi([c],e,!1);n=new Set([...n,...h])}};return o(r),{checkedKeys:new Set([...t,...s]),halfCheckedKeys:n}}function Ir(i,e,t,n){const s=Si([i],e,!0),r=e[i];s.forEach(l=>{t.has(l)&&t.delete(l),n.has(l)&&n.delete(l)});const o=l=>{const c=l.parent;if(!c||!t.has(c.key)&&!n.has(c.key))return;const{key:d}=l,h=wi([d],e).some(m=>t.has(m)||n.has(m)),g=vi([d],e,!1);h?g.forEach(m=>{t.has(m)&&(t.delete(m),n.add(m))}):(t.has(c.key)&&t.delete(c.key),n.has(c.key)&&n.delete(c.key),o(c))};return r&&o(r),{checkedKeys:t,halfCheckedKeys:n}}const At={PREFIX:`${X}-checkbox`,INPUT:`${X}-checkbox-input`,WRAPPER:""},ic={PREFIX:`${X}-checkboxGroup`},ve={DIRECTION_SET:["horizontal","vertical"],TYPE_DEFAULT:"default",TYPE_CARD:"card",TYPE_PURECARD:"pureCard",DEFAULT_DIRECTION:"vertical"};class ac extends ge{constructor(e){super(Object.assign({},e)),this.clickState=!1,this.handleFocusVisible=t=>{const{target:n}=t;try{if(this.clickState){this.clickState=!1;return}n.matches(":focus-visible")&&this._adapter.setFocusVisible(!0)}catch{$e(!0,"Warning: [Semi Checkbox] The current browser does not support the focus-visible")}},this.handleBlur=()=>{this.clickState=!1,this._adapter.setFocusVisible(!1)}}init(){const{children:e,extra:t,extraId:n,addonId:s}=this.getProps();e&&!s&&this._adapter.setAddonId(),t&&!n&&this._adapter.setExtraId()}notifyChange(e,t){const n=this._adapter.generateEvent(e,t);this._adapter.notifyChange(n)}handleChange(e){if(this.getProp("disabled"))return;if((e==null?void 0:e.type)==="click"&&(this.clickState=!0),this._adapter.focusCheckboxEntity(),this._adapter.getIsInGroup()){this._adapter.getGroupDisabled()||this.handleChangeInGroup(e);return}const r=!this.getState("checked");this._isControlledComponent("checked")?this.notifyChange(r,e):(this.setChecked(r),this.notifyChange(r,e))}handleChangeInGroup(e){const{value:t}=this.getProps(),r=!this._adapter.getGroupValue().includes(t),o=this._adapter.generateEvent(r,e);this._adapter.notifyChange(o),this._adapter.notifyGroupChange(o)}handleEnterPress(e){Yt(e)&&this.handleChange(e)}setChecked(e){this._adapter.setNativeControlChecked(e)}destroy(){}}const Fs=b.createContext({});class en extends L.PureComponent{blur(){this.inputEntity.blur()}focus(){const{preventScroll:e}=this.props;this.inputEntity.focus({preventScroll:e})}render(){const{indeterminate:e,checked:t,disabled:n,prefixCls:s,name:r,isPureCardType:o,addonId:l,extraId:c,focusInner:d,onInputFocus:u,onInputBlur:h}=this.props,g=s||At.PREFIX,m=M({[`${g}-inner`]:!0,[`${g}-inner-checked`]:!!t,[`${g}-inner-pureCardType`]:o},At.WRAPPER),y=M({[`${g}-inner-display`]:!0,[`${g}-focus`]:d,[`${g}-focus-border`]:d&&!t}),p=t?b.createElement(_l,null):e?b.createElement(vl,null):null,f={type:"checkbox","aria-label":this.props["aria-label"],"aria-disabled":n,"aria-checked":t,"aria-labelledby":l,"aria-describedby":c||this.props["aria-describedby"],"aria-invalid":this.props["aria-invalid"],"aria-errormessage":this.props["aria-errormessage"],"aria-required":this.props["aria-required"],className:At.INPUT,onChange:H,checked:t,disabled:n,onFocus:u,onBlur:h};return r&&(f.name=r),b.createElement("span",{className:m},b.createElement("input",Object.assign({},f,{ref:S=>{this.inputEntity=S}})),b.createElement("span",{className:y},p))}}en.contextType=Fs;en.propTypes={"aria-describedby":a.string,"aria-errormessage":a.string,"aria-invalid":a.bool,"aria-labelledby":a.string,"aria-required":a.bool,checked:a.bool,disabled:a.bool,onChange:a.func,children:a.node,grouped:a.bool,value:a.any,isPureCardType:a.bool,addonId:a.string,extraId:a.string,focusInner:a.bool,onInputFocus:a.func,onInputBlur:a.func,preventScroll:a.bool};en.defaultProps={onChange:H};class xe extends he{get adapter(){return Object.assign(Object.assign({},super.adapter),{setNativeControlChecked:e=>{this.setState({checked:e})},notifyChange:e=>{const{onChange:t}=this.props;t&&t(e)},generateEvent:(e,t)=>{const{props:n}=this;return{target:Object.assign(Object.assign({},n),{checked:e}),stopPropagation:()=>{t.stopPropagation()},preventDefault:()=>{t.preventDefault()},nativeEvent:{stopImmediatePropagation:()=>{t.nativeEvent&&typeof t.nativeEvent.stopImmediatePropagation=="function"&&t.nativeEvent.stopImmediatePropagation()}}}},getIsInGroup:()=>this.isInGroup(),getGroupValue:()=>this.context&&this.context.checkboxGroup.value||[],notifyGroupChange:e=>{this.context.checkboxGroup.onChange(e)},getGroupDisabled:()=>this.context&&this.context.checkboxGroup.disabled,setAddonId:()=>{this.setState({addonId:jt({prefix:"addon"})})},setExtraId:()=>{this.setState({extraId:jt({prefix:"extra"})})},setFocusVisible:e=>{this.setState({focusVisible:e})},focusCheckboxEntity:()=>{this.focus()}})}constructor(e){super(e),this.handleChange=n=>this.foundation.handleChange(n),this.handleEnterPress=n=>this.foundation.handleEnterPress(n),this.handleFocusVisible=n=>{this.foundation.handleFocusVisible(n)},this.handleBlur=n=>{this.foundation.handleBlur()};const t=!1;this.state={checked:e.checked||e.defaultChecked||t,addonId:e.addonId,extraId:e.extraId,focusVisible:!1},this.checkboxEntity=null,this.foundation=new ac(this.adapter)}componentDidUpdate(e){this.props.checked!==e.checked&&(ft(this.props.checked)?this.foundation.setChecked(!1):il(this.props.checked)&&this.foundation.setChecked(this.props.checked))}isInGroup(){return!!(this.context&&this.context.checkboxGroup&&"value"in this.props)}focus(){this.checkboxEntity&&this.checkboxEntity.focus()}blur(){this.checkboxEntity&&this.checkboxEntity.blur()}render(){const{disabled:e,style:t,prefixCls:n,className:s,indeterminate:r,children:o,onMouseEnter:l,onMouseLeave:c,extra:d,value:u,role:h,tabIndex:g,id:m,type:y}=this.props,{checked:p,addonId:f,extraId:S,focusVisible:v}=this.state,w={checked:p,disabled:e},_=this.isInGroup();if(_){if(this.context.checkboxGroup.value){const K=(this.context.checkboxGroup.value||[]).includes(u);w.checked=K}this.context.checkboxGroup.disabled&&(w.disabled=this.context.checkboxGroup.disabled||this.props.disabled);const{isCardType:A,isPureCardType:F}=this.context.checkboxGroup;w.isCardType=A,w.isPureCardType=F,w.name=this.context.checkboxGroup.name}else w.isPureCardType=y===ve.TYPE_PURECARD,w.isCardType=y===ve.TYPE_CARD||w.isPureCardType;const O=n||At.PREFIX,I=w.isCardType||w.isPureCardType,E=M(O,{[`${O}-disabled`]:w.disabled,[`${O}-indeterminate`]:r,[`${O}-checked`]:w.checked,[`${O}-unChecked`]:!w.checked,[`${O}-cardType`]:w.isCardType,[`${O}-cardType_disabled`]:w.disabled&&w.isCardType,[`${O}-cardType_enable`]:!(w.disabled&&w.isCardType),[`${O}-cardType_checked`]:w.isCardType&&w.checked&&!w.disabled,[`${O}-cardType_checked_disabled`]:w.isCardType&&w.checked&&w.disabled,[s]:!!s,[`${O}-focus`]:v&&I}),k=M(`${O}-extra`,{[`${O}-cardType_extra_noChildren`]:w.isCardType&&!o});_&&this.context.checkboxGroup.name;const N=this.props["x-semi-children-alias"]||"children",P=()=>!o&&!d?null:b.createElement("div",{className:`${O}-content`},o?b.createElement("span",{id:f,className:`${O}-addon`,"x-semi-prop":N},o):null,d?b.createElement("div",{id:S,className:k,"x-semi-prop":"extra"},d):null);return b.createElement("span",Object.assign({role:h,tabIndex:g,style:t,className:E,id:m,onMouseEnter:l,onMouseLeave:c,onClick:this.handleChange,onKeyPress:this.handleEnterPress,"aria-labelledby":this.props["aria-labelledby"]},this.getDataAttr(this.props)),b.createElement(en,Object.assign({},this.props,w,{addonId:o&&f,extraId:d&&S,isPureCardType:w.isPureCardType,ref:A=>{this.checkboxEntity=A},focusInner:v&&!I,onInputFocus:this.handleFocusVisible,onInputBlur:this.handleBlur})),P())}}xe.contextType=Fs;xe.propTypes={"aria-describedby":a.string,"aria-errormessage":a.string,"aria-invalid":a.bool,"aria-labelledby":a.string,"aria-required":a.bool,checked:a.bool,defaultChecked:a.bool,disabled:a.bool,indeterminate:a.bool,onChange:a.func,value:a.any,style:a.object,className:a.string,prefixCls:a.string,onMouseEnter:a.func,onMouseLeave:a.func,extra:a.node,index:a.number,"aria-label":a.string,tabIndex:a.number,preventScroll:a.bool,type:a.string};xe.defaultProps={defaultChecked:!1,indeterminate:!1,onChange:H,onMouseEnter:H,onMouseLeave:H,type:"default"};xe.elementType="Checkbox";class Ks extends ge{static get checkboxGroupDefaultAdapter(){return{}}constructor(e){super(Object.assign(Object.assign({},Ks.checkboxGroupDefaultAdapter),e))}init(){const{defaultValue:e,value:t}=this.getProps();typeof e<"u"&&!Array.isArray(e)&&$e(!0,"Warning: [Semi CheckboxGroup] defaultValue should be an Array"),typeof t<"u"&&!Array.isArray(t)&&$e(!0,"Warning: [Semi CheckboxGroup] value should be an Array")}notifyChange(e){this._adapter.notifyChange(e)}handleChange(e){const t=this.getState("value");let n=[];Array.isArray(t)||(n=[t]),e.target.checked?n=[...t,e.target.value]:n=t.filter((r,o)=>r!==e.target.value),"value"in this.getProps()?this.notifyChange(n):(this._adapter.updateGroupValue(n),this.notifyChange(n))}getFormatName(){return this.getProp("name")||"default"}handlePropValueChange(e){Array.isArray(e)?this._adapter.updateGroupValue(e):(typeof e>"u"&&this._adapter.updateGroupValue([]),$e(!0,"Warning: [Semi CheckboxGroup] value should be an Array"))}destroy(){}}class $s extends he{get adapter(){return Object.assign(Object.assign({},super.adapter),{updateGroupValue:e=>{this.setState({value:e})},notifyChange:e=>{this.props.onChange&&this.props.onChange(e)}})}constructor(e){super(e),this.state={value:e.value||e.defaultValue},this.foundation=new Ks(this.adapter),this.onChange=this.onChange.bind(this)}componentDidMount(){this.foundation.init()}componentDidUpdate(e){re(e.value,this.props.value)||this.foundation.handlePropValueChange(this.props.value)}componentWillUnmount(){this.foundation.destroy()}onChange(e){this.foundation.handleChange(e)}render(){const{children:e,options:t,prefixCls:n,direction:s,className:r,id:o,style:l,type:c,disabled:d}=this.props,u=c===ve.TYPE_PURECARD,h=c===ve.TYPE_CARD||u,g=n||ic.PREFIX,m=M({[g]:!0,[`${g}-wrapper`]:!0,[`${g}-${s}`]:s,[`${g}-${s}-cardType`]:s&&h,[`${g}-${s}-pureCardType`]:s&&u},r),y=this.state.value.slice();let p;return t?p=(t||[]).map((f,S)=>typeof f=="string"?b.createElement(xe,{role:"listitem",key:S,disabled:this.props.disabled,value:f,prefixCls:n},f):b.createElement(xe,{role:"listitem",key:S,disabled:f.disabled||this.props.disabled,value:f.value,prefixCls:n,extra:f.extra,className:f.className,style:f.style,onChange:f.onChange},f.label)):e&&(p=b.Children.toArray(e).map((f,S)=>b.cloneElement(f,{key:S,role:"listitem"}))),b.createElement("div",Object.assign({id:o,role:"list","aria-label":this.props["aria-label"],className:m,style:l,"aria-labelledby":this.props["aria-labelledby"],"aria-describedby":this.props["aria-describedby"]},this.getDataAttr(this.props)),b.createElement(Fs.Provider,{value:{checkboxGroup:{onChange:this.onChange,value:y,disabled:this.props.disabled,name:this.foundation.getFormatName(),isCardType:h,isPureCardType:u}}},p))}}$s.propTypes={"aria-describedby":a.string,"aria-errormessage":a.string,"aria-invalid":a.bool,"aria-labelledby":a.string,"aria-required":a.bool,defaultValue:a.array,disabled:a.bool,name:a.string,options:a.array,value:a.array,onChange:a.func,children:a.node,prefixCls:a.string,direction:a.oneOf(ve.DIRECTION_SET),className:a.string,type:a.oneOf([ve.TYPE_DEFAULT,ve.TYPE_CARD,ve.TYPE_PURECARD]),style:a.object};$s.defaultProps={disabled:!1,onChange:()=>{},type:ve.TYPE_DEFAULT,defaultValue:[],direction:ve.DEFAULT_DIRECTION};class lc extends xe{}lc.Group=$s;function Rs(){return Rs=Object.assign?Object.assign.bind():function(i){for(var e=1;e=e?i.call(null):s.id=requestAnimationFrame(n)}var s={id:requestAnimationFrame(n)};return s}var Tn=-1;function Nr(i){if(i===void 0&&(i=!1),Tn===-1||i){var e=document.createElement("div"),t=e.style;t.width="50px",t.height="50px",t.overflow="scroll",document.body.appendChild(e),Tn=e.offsetWidth-e.clientWidth,document.body.removeChild(e)}return Tn}var Ve=null;function kr(i){if(i===void 0&&(i=!1),Ve===null||i){var e=document.createElement("div"),t=e.style;t.width="50px",t.height="50px",t.overflow="scroll",t.direction="rtl";var n=document.createElement("div"),s=n.style;return s.width="100px",s.height="100px",e.appendChild(n),document.body.appendChild(e),e.scrollLeft>0?Ve="positive-descending":(e.scrollLeft=1,e.scrollLeft===0?Ve="negative":Ve="positive-ascending"),document.body.removeChild(e),Ve}return Ve}var fc=150,gc=function(e,t){return e};function Ci(i){var e,t=i.getItemOffset,n=i.getEstimatedTotalSize,s=i.getItemSize,r=i.getOffsetForIndexAndAlignment,o=i.getStartIndexForOffset,l=i.getStopIndexForStartIndex,c=i.initInstanceProps,d=i.shouldResetStyleCacheOnItemSizeChange,u=i.validateProps;return e=(function(h){cc(g,h);function g(y){var p;return p=h.call(this,y)||this,p._instanceProps=c(p.props,mr(p)),p._outerRef=void 0,p._resetIsScrollingTimeoutId=null,p.state={instance:mr(p),isScrolling:!1,scrollDirection:"forward",scrollOffset:typeof p.props.initialScrollOffset=="number"?p.props.initialScrollOffset:0,scrollUpdateWasRequested:!1},p._callOnItemsRendered=void 0,p._callOnItemsRendered=Ke(function(f,S,v,w){return p.props.onItemsRendered({overscanStartIndex:f,overscanStopIndex:S,visibleStartIndex:v,visibleStopIndex:w})}),p._callOnScroll=void 0,p._callOnScroll=Ke(function(f,S,v){return p.props.onScroll({scrollDirection:f,scrollOffset:S,scrollUpdateWasRequested:v})}),p._getItemStyle=void 0,p._getItemStyle=function(f){var S=p.props,v=S.direction,w=S.itemSize,_=S.layout,O=p._getItemStyleCache(d&&w,d&&_,d&&v),I;if(O.hasOwnProperty(f))I=O[f];else{var E=t(p.props,f,p._instanceProps),k=s(p.props,f,p._instanceProps),N=v==="horizontal"||_==="horizontal",P=v==="rtl",A=N?E:0;O[f]=I={position:"absolute",left:P?void 0:A,right:P?A:void 0,top:N?0:E,height:N?"100%":k,width:N?k:"100%"}}return I},p._getItemStyleCache=void 0,p._getItemStyleCache=Ke(function(f,S,v){return{}}),p._onScrollHorizontal=function(f){var S=f.currentTarget,v=S.clientWidth,w=S.scrollLeft,_=S.scrollWidth;p.setState(function(O){if(O.scrollOffset===w)return null;var I=p.props.direction,E=w;if(I==="rtl")switch(kr()){case"negative":E=-w;break;case"positive-descending":E=_-v-w;break}return E=Math.max(0,Math.min(E,_-v)),{isScrolling:!0,scrollDirection:O.scrollOffsetI.clientWidth?Nr():0:O=I.scrollHeight>I.clientHeight?Nr():0}this.scrollTo(r(this.props,p,f,_,this._instanceProps,O))},m.componentDidMount=function(){var p=this.props,f=p.direction,S=p.initialScrollOffset,v=p.layout;if(typeof S=="number"&&this._outerRef!=null){var w=this._outerRef;f==="horizontal"||v==="horizontal"?w.scrollLeft=S:w.scrollTop=S}this._callPropsCallbacks()},m.componentDidUpdate=function(){var p=this.props,f=p.direction,S=p.layout,v=this.state,w=v.scrollOffset,_=v.scrollUpdateWasRequested;if(_&&this._outerRef!=null){var O=this._outerRef;if(f==="horizontal"||S==="horizontal")if(f==="rtl")switch(kr()){case"negative":O.scrollLeft=-w;break;case"positive-ascending":O.scrollLeft=w;break;default:var I=O.clientWidth,E=O.scrollWidth;O.scrollLeft=E-I-w;break}else O.scrollLeft=w;else O.scrollTop=w}this._callPropsCallbacks()},m.componentWillUnmount=function(){this._resetIsScrollingTimeoutId!==null&&Dr(this._resetIsScrollingTimeoutId)},m.render=function(){var p=this.props,f=p.children,S=p.className,v=p.direction,w=p.height,_=p.innerRef,O=p.innerElementType,I=p.innerTagName,E=p.itemCount,k=p.itemData,N=p.itemKey,P=N===void 0?gc:N,A=p.layout,F=p.outerElementType,K=p.outerTagName,z=p.style,q=p.useIsScrolling,V=p.width,W=this.state.isScrolling,G=v==="horizontal"||A==="horizontal",se=G?this._onScrollHorizontal:this._onScrollVertical,Q=this._getRangeToRender(),pe=Q[0],oe=Q[1],de=[];if(E>0)for(var ie=pe;ie<=oe;ie++)de.push(L.createElement(f,{data:k,key:P(ie,k),index:ie,isScrolling:q?W:void 0,style:this._getItemStyle(ie)}));var Ot=n(this.props,this._instanceProps);return L.createElement(F||K||"div",{className:S,onScroll:se,ref:this._outerRefSetter,style:Rs({position:"relative",height:w,width:V,overflow:"auto",WebkitOverflowScrolling:"touch",willChange:"transform",direction:v},z)},L.createElement(O||I||"div",{children:de,ref:_,style:{height:G?"100%":Ot,pointerEvents:W?"none":void 0,width:G?Ot:"100%"}}))},m._callPropsCallbacks=function(){if(typeof this.props.onItemsRendered=="function"){var p=this.props.itemCount;if(p>0){var f=this._getRangeToRender(),S=f[0],v=f[1],w=f[2],_=f[3];this._callOnItemsRendered(S,v,w,_)}}if(typeof this.props.onScroll=="function"){var O=this.state,I=O.scrollDirection,E=O.scrollOffset,k=O.scrollUpdateWasRequested;this._callOnScroll(I,E,k)}},m._getRangeToRender=function(){var p=this.props,f=p.itemCount,S=p.overscanCount,v=this.state,w=v.isScrolling,_=v.scrollDirection,O=v.scrollOffset;if(f===0)return[0,0,0,0];var I=o(this.props,O,this._instanceProps),E=l(this.props,I,O,this._instanceProps),k=!w||_==="backward"?Math.max(1,S):1,N=!w||_==="forward"?Math.max(1,S):1;return[Math.max(0,I-k),Math.max(0,Math.min(f-1,E+N)),I,E]},g})(L.PureComponent),e.defaultProps={direction:"ltr",itemData:void 0,layout:"vertical",overscanCount:2,useIsScrolling:!1},e}var mc=function(e,t){e.children,e.direction,e.height,e.layout,e.innerTagName,e.outerTagName,e.width,t.instance},bc=50,Ge=function(e,t,n){var s=e,r=s.itemSize,o=n.itemMetadataMap,l=n.lastMeasuredIndex;if(t>l){var c=0;if(l>=0){var d=o[l];c=d.offset+d.size}for(var u=l+1;u<=t;u++){var h=r(u);o[u]={offset:c,size:h},c+=h}n.lastMeasuredIndex=t}return o[t]},yc=function(e,t,n){var s=t.itemMetadataMap,r=t.lastMeasuredIndex,o=r>0?s[r].offset:0;return o>=n?_i(e,t,r,0,n):Sc(e,t,Math.max(0,r),n)},_i=function(e,t,n,s,r){for(;s<=n;){var o=s+Math.floor((n-s)/2),l=Ge(e,o,t).offset;if(l===r)return o;lr&&(n=o-1)}return s>0?s-1:0},Sc=function(e,t,n,s){for(var r=e.itemCount,o=1;n=n&&(o=n-1),o>=0){var c=s[o];l=c.offset+c.size}var d=n-o-1,u=d*r;return l+u},wc=Ci({getItemOffset:function(e,t,n){return Ge(e,t,n).offset},getItemSize:function(e,t,n){return n.itemMetadataMap[t].size},getEstimatedTotalSize:Lr,getOffsetForIndexAndAlignment:function(e,t,n,s,r,o){var l=e.direction,c=e.height,d=e.layout,u=e.width,h=l==="horizontal"||d==="horizontal",g=h?u:c,m=Ge(e,t,r),y=Lr(e,r),p=Math.max(0,Math.min(y-g,m.offset)),f=Math.max(0,m.offset-g+m.size+o);switch(n==="smart"&&(s>=f-g&&s<=p+g?n="auto":n="center"),n){case"start":return p;case"end":return f;case"center":return Math.round(f+(p-f)/2);case"auto":default:return s>=f&&s<=p?s:s=S-y&&s<=f+y?n="auto":n="center"),n){case"start":return f;case"end":return S;case"center":{var v=Math.round(S+(f-S)/2);return vp+Math.floor(y/2)?p:v}case"auto":default:return s>=S&&s<=f?s:s-1?c[d?r[u]:u]:void 0}}return Wn=n,Wn}var Un,Xr;function ud(){if(Xr)return Un;Xr=1;var i=dd(),e=zi(),t=i(e);return Un=t,Un}var hd=ud();const We=te(hd);var Vn,Zr;function pd(){if(Zr)return Vn;Zr=1;var i=ai(),e=Ns(),t=Jt();function n(s,r,o){var l=s==null?0:s.length;return l?(o&&typeof o!="number"&&e(s,r,o)?(r=0,o=l):(r=r==null?0:t(r),o=o===void 0?l:t(o)),i(s,r,o)):[]}return Vn=n,Vn}var fd=pd();const gd=te(fd);var md=ka();const bd=te(md),yd={PREFIX:X+"-overflow-list"},Qr={COLLAPSE:"collapse",SCROLL:"scroll"},Jr={START:"start",END:"end"},Sd={GROW:1},Be={BOUNDARY_SET:Object.values(Jr),POSITION_SET:["vertical","horizontal"],MODE_SET:Object.values(Qr),MODE_MAP:Qr,BOUNDARY_MAP:Jr,OVERFLOW_DIR:Sd},eo={MINIMUM_HTML_ELEMENT_WIDTH:4};class Us extends b.PureComponent{componentDidMount(){const{items:e}=this.props;this.cachedKeys=Object.keys(e);const{root:t,threshold:n,rootMargin:s,option:r,onIntersect:o}=this.props;this.observer=new IntersectionObserver(o,Object.assign({root:t,threshold:n,rootMargin:s},r)),this.observeElement()}componentDidUpdate(){const{items:e}=this.props,t=Object.keys(e);re(this.cachedKeys,t)||(this.observeElement(!0),this.cachedKeys=t)}componentWillUnmount(){this.observer&&(this.observer.disconnect(),this.observer=null)}observeElement(){let e=arguments.length>0&&arguments[0]!==void 0?arguments[0]:!1;const{items:t}=this.props;if(li(t)){this.observer.disconnect();return}e&&this.observer.disconnect(),Object.keys(t).forEach(n=>{const s=t[n];s&&La(s)&&this.observer.observe(s)})}render(){const{children:e}=this.props;return e}}Us.propTypes={onIntersect:a.func,option:a.object,root:a.any,threshold:a.number,rootMargin:a.string,items:a.object};Us.defaultProps={onIntersect:()=>{},threshold:.75,rootMargin:"0px",option:{},items:{}};const wd=Be.BOUNDARY_MAP;class vd extends ge{constructor(e){super(Object.assign({},e)),this.previousY=void 0,this.isScrollMode=()=>{const{renderMode:t}=this.getProps();return t==="scroll"},this.getReversedItems=()=>{const{items:t}=this.getProps();return $t(t).reverse()}}getOverflowItem(){const{items:e}=this.getProps(),{visibleState:t,overflow:n,scrollOverflow:s}=this.getStates();if(!this.isScrollMode())return n;if(!t||t.size===0)return Array.isArray(s)&&s.length===2?s:[[],[]];const r=e.map(d=>{let{key:u}=d;return!!t.get(u)}),o=r.indexOf(!0),l=r.lastIndexOf(!0);if(o<0||l<0)return Array.isArray(s)&&s.length===2?s:[[],[]];const c=[];return c[0]=o>=0?e.slice(0,o):[],c[1]=l>=0?e.slice(l+1,e.length):e.slice(),c}_syncScrollOverflowCache(e){if(!this.isScrollMode())return;const{items:t}=this.getProps(),n=t.map(l=>{let{key:c}=l;return!!e.get(c)}),s=n.indexOf(!0),r=n.lastIndexOf(!0);if(s<0||r<0){this._adapter.updateStates({isScrollOverflowCalculating:!0});return}const o=[];o[0]=s>=0?t.slice(0,s):[],o[1]=r>=0?t.slice(r+1,t.length):t.slice(),this._adapter.updateStates({scrollOverflow:o,isScrollOverflowCalculating:!1})}handleIntersect(e){const t=$t(this.getState("visibleState")),n={};e.forEach(c=>{const d=x(c,"target.dataset.scrollkey"),u=c.isIntersecting;n[d]=c,t.set(d,u)});let s=!1;for(const c of t.values())if(c){s=!0;break}const r=s,[o]=e,l=o.boundingClientRect.y;if(!r&&this.previousY!==void 0&&l!==this.previousY){this.previousY=l;return}this.previousY=l,this._adapter.updateVisibleState(t),this._syncScrollOverflowCache(t),this._adapter.notifyIntersect(n)}handleCollapseOverflow(){const{minVisibleItems:e,collapseFrom:t}=this.getProps(),{overflowWidth:n,containerWidth:s,pivot:r,overflowStatus:o}=this.getStates(),{items:l,onOverflow:c}=this.getProps();let d=n,u=0,h=!1;for(const g of this._adapter.getItemSizeMap().values()){if(d+=g,d>s){h=!0;break}if(u===l.length-1){this._adapter.updateStates({overflowStatus:"normal",pivot:l.length-1,visible:l,overflow:[]});break}u++}if(h){const g=Math.max(e,u),m=t===wd.START,y=m?this.getReversedItems().slice(0,g).reverse():l.slice(0,g),p=m?this.getReversedItems().slice(g).reverse():l.slice(g);this._adapter.updateStates({overflowStatus:"overflowed",pivot:g,visible:y,overflow:p}),r!==g&&c(p);return}}}const at=yd.PREFIX,qn=Be.BOUNDARY_MAP,to=Be.OVERFLOW_DIR,qe=Be.MODE_MAP;class Qe extends he{constructor(e){var t;super(e),t=this,this.scroller=null,this.spacer=null,this.isScrollMode=()=>{const{renderMode:n}=this.props;return n===qe.SCROLL},this.resize=function(){let n=arguments.length>0&&arguments[0]!==void 0?arguments[0]:[];var s;const r=(s=n[0])===null||s===void 0?void 0:s.target.clientWidth;t.setState({containerWidth:r,overflowStatus:"calculating"})},this.reintersect=n=>{this.foundation.handleIntersect(n)},this.mergeRef=(n,s,r)=>{this.itemRefs[r]=s,typeof n=="function"?n(s):typeof n=="object"&&n&&"current"in n&&(n.current=s)},this.renderOverflow=()=>{const n=this.foundation.getOverflowItem();return this.props.overflowRenderer(n)},this.getItemKey=(n,s)=>{const{itemKey:r}=this.props;return ue(r)?r(n):x(n,r||"key",s)},this.renderItemList=()=>{const{className:n,wrapperClassName:s,wrapperStyle:r,style:o,visibleItemRenderer:l,renderMode:c,collapseFrom:d}=this.props,{visible:u,overflowStatus:h}=this.state;let g=this.renderOverflow();if(!this.isScrollMode()&&(Array.isArray(g)&&(g=b.createElement(b.Fragment,null,g)),b.isValidElement(g))){const p=b.cloneElement(g);g=b.createElement(Pt,{onResize:f=>{let[S]=f;this.setState({overflowWidth:S.target.clientWidth,overflowStatus:"calculating"})}},b.createElement("div",{className:`${at}-overflow`},p))}const m=c===qe.SCROLL?(()=>{const p=[b.createElement("div",{className:M(s,`${at}-scroll-wrapper`),ref:f=>{this.scroller=f},style:Object.assign({},r),key:`${at}-scroll-wrapper`},u.map(l).map(f=>{const{forwardRef:S,key:v}=f;return b.cloneElement(f,{ref:w=>this.mergeRef(S,w,v),"data-scrollkey":`${v}`,key:v})}))];return this.props.overflowRenderDirection==="both"?(p.unshift(g[0]),p.push(g[1])):this.props.overflowRenderDirection==="start"?(p.unshift(g[1]),p.unshift(g[0])):(p.push(g[0]),p.push(g[1])),p})():[d===qn.START?g:null,u.map((p,f)=>{const S=this.getItemKey(p,f),v=l(p,f),w=b.cloneElement(v);return b.createElement(Pt,{key:S??f,onResize:_=>{let[O]=_;return this.onItemResize(O,p,f)}},b.createElement("div",{key:S??f,className:`${at}-item`},w))}),d===qn.END?g:null];return b.createElement("div",{className:M(`${at}`,n),style:Object.assign(Object.assign({},o),c===qe.COLLAPSE?{maxWidth:"100%",visibility:h==="calculating"&&this.state.pivot<0?"hidden":"visible"}:null)},...m)},this.onItemResize=(n,s,r)=>{const o=this.getItemKey(s,r),l=this.itemSizeMap.get(o);l?l!==n.target.clientWidth&&(this.itemSizeMap.set(o,n.target.clientWidth),this.setState({overflowStatus:"calculating"})):this.itemSizeMap.set(o,n.target.clientWidth);const{maxCount:c}=this.state;this.itemSizeMap.size===c&&this.setState({overflowStatus:"calculating"})},this.state={direction:to.GROW,lastOverflowCount:0,overflow:[],visible:[],containerWidth:0,visibleState:new Map,itemSizeMap:new Map,overflowStatus:"calculating",pivot:-1,overflowWidth:0,maxCount:0,scrollOverflow:[[],[]],isScrollOverflowCalculating:!0},this.foundation=new vd(this.adapter),this.previousWidths=new Map,this.itemRefs={},this.itemSizeMap=new Map}static getDerivedStateFromProps(e,t){const{prevProps:n}=t,s={};s.prevProps=e;const r=l=>!n&&l in e||n&&!re(n[l],e[l]),o=r("items");if(o||r("style")){if(s.direction=to.GROW,s.lastOverflowCount=0,s.maxCount=0,s.isScrollOverflowCalculating=!0,o&&e.renderMode===qe.SCROLL&&Array.isArray(t.scrollOverflow)){const l=(m,y)=>{const{itemKey:p}=e;return ue(p)?p(m):x(m,p||"key",y)},c=e.items||[],d=new Map;c.forEach((m,y)=>{d.set(l(m,y),m)});const u=function(){return(arguments.length>0&&arguments[0]!==void 0?arguments[0]:[]).map((y,p)=>d.get(l(y,p))).filter(Boolean)},[h,g]=t.scrollOverflow;s.scrollOverflow=[u(h),u(g)]}if(e.renderMode===qe.SCROLL)s.visible=e.items,s.overflow=[];else{let l=e.items.length;Math.floor(t.containerWidth/eo.MINIMUM_HTML_ELEMENT_WIDTH)!==0&&(l=Math.min(l,Math.floor(t.containerWidth/eo.MINIMUM_HTML_ELEMENT_WIDTH)));const c=e.collapseFrom===qn.START,d=c?$t(e.items).reverse().slice(0,l):e.items.slice(0,l),u=c?$t(e.items).reverse().slice(l):e.items.slice(l);s.visible=d,s.overflow=u,s.maxCount=l}s.overflowStatus="calculating"}return s}get adapter(){return Object.assign(Object.assign({},super.adapter),{updateVisibleState:e=>{this.setState({visibleState:e},()=>{var t,n;(n=(t=this.props).onVisibleStateChange)===null||n===void 0||n.call(t,e)})},updateStates:e=>{this.setState(Object.assign({},e))},notifyIntersect:e=>{this.props.onIntersect&&this.props.onIntersect(e)},getItemSizeMap:()=>this.itemSizeMap})}componentDidUpdate(e,t){const n=e.items.map((d,u)=>this.getItemKey(d,u)),s=this.props.items.map((d,u)=>this.getItemKey(d,u));re(n,s)||(this.itemRefs={},this.itemSizeMap=new Map,this.setState({visibleState:new Map,isScrollOverflowCalculating:!0}));const{overflow:r,containerWidth:o,visible:l,overflowStatus:c}=this.state;this.isScrollMode()||c!=="calculating"||this.foundation.handleCollapseOverflow()}render(){const e=this.renderItemList(),{renderMode:t}=this.props;return t===qe.SCROLL?b.createElement(Us,{onIntersect:this.reintersect,root:this.scroller,threshold:this.props.threshold,items:this.itemRefs},e):b.createElement(Pt,{onResize:this.resize},e)}}Qe.__SemiComponentName__="OverflowList";Qe.defaultProps=ks(Qe.__SemiComponentName__,{collapseFrom:"end",minVisibleItems:0,overflowRenderer:()=>null,renderMode:"collapse",threshold:.75,visibleItemRenderer:()=>null,onOverflow:()=>null,overflowRenderDirection:"both"});Qe.propTypes={className:a.string,collapseFrom:a.oneOf(Be.BOUNDARY_SET),direction:a.oneOf(Be.POSITION_SET),items:a.array,minVisibleItems:a.number,onIntersect:a.func,onOverflow:a.func,overflowRenderer:a.func,renderMode:a.oneOf(Be.MODE_SET),style:a.object,threshold:a.number,visibleItemRenderer:a.func,wrapperClassName:a.string,wrapperStyle:a.object,collapseMask:a.object,overflowRenderDirection:a.string};const Cd={PREFIX:`${X}-page`},Vs={PAGE_SHOW_MAX:7,DEFAULT_PAGE_SIZE:10,PAGE_SIZE_OPTION:[10,20,40,100],REST_PAGE_MAX_SIZE:1e6};class _d extends ge{constructor(e){super(Object.assign({},e))}init(){const{currentPage:e,total:t,pageSize:n}=this.getStates();this._updateDisabled({currentPage:e,total:t,pageSize:n}),this._updatePageList({currentPage:e,total:t,pageSize:n}),this._registerEventHandler()}destroy(){this._unregisterEventHandler()}_registerEventHandler(){this._adapter.registerKeyDownHandler(this.handleKeyDown)}_unregisterEventHandler(){this._adapter.unregisterKeyDownHandler(this.handleKeyDown)}_updateDisabled(e){const{currentPage:t,total:n,pageSize:s}=e,r=this._getTotalPageNumber(n,s);let o=!1,l=!1;t===1?(o=!0,l=r<2):t===r&&(o=!1,l=!0);const{prevDisabled:c,nextDisabled:d}=this.getStates();(o!==c||l!==d)&&this._adapter.setDisabled(o,l)}goPage(e){if(e==="...")return;const{pageSize:t,currentPage:n}=this.getStates(),s=this._isInProps("currentPage");e!==n&&(s?(this._adapter.notifyPageChange(e),this._adapter.notifyChange(e,t)):(this.updatePage(e),this._adapter.notifyPageChange(e),this._adapter.notifyChange(e,t)))}updatePage(){let e=arguments.length>0&&arguments[0]!==void 0?arguments[0]:1,t=arguments.length>1?arguments[1]:void 0,n=arguments.length>2?arguments[2]:void 0;(t===null||typeof t>"u")&&(t=this.getState("total")),(n===null||typeof n>"u")&&(n=this.getState("pageSize")),this._updateDisabled({currentPage:e,total:t,pageSize:n}),this._updatePageList({currentPage:e,total:t,pageSize:n}),t!==this.getState("total")&&this._adapter.updateTotal(t),e!==this.getState("currentPage")&&this._adapter.setCurrentPage(e),n!==this.getState("pageSize")&&this._adapter.updatePageSize(n)}updateAllPageNumbers(e,t){const{size:n,hoverShowPageSelect:s,disabled:r}=this.getProps();if(!(n!=="small"||!s||r)){const o=Array.from({length:Math.ceil(e/t)},(l,c)=>c+1);this._adapter.updateAllPageNumbers(o)}}goPrev(){const{currentPage:e}=this.getStates();e>1&&this.goPage(e-1)}goNext(){const{currentPage:e,total:t,pageSize:n}=this.getStates(),s=this._getTotalPageNumber(t,n);e<=s-1&&this.goPage(e+1)}_updatePageList(e){const{currentPage:t,total:n,pageSize:s}=e;let r=[],o=[],l=[];const c=this._getTotalPageNumber(n,s),{PAGE_SHOW_MAX:d,REST_PAGE_MAX_SIZE:u}=Vs;if(c<=d)r=Array.from({length:c},(h,g)=>g+1),o=[],l=[];else switch(!0){case t<4:r=[1,2,3,4,"...",c-1,c],l=Array.from({length:Math.min(c-6,u)},(m,y)=>y+5),o=[];break;case t===4:r=[1,2,3,4,5,"...",c],l=Array.from({length:Math.min(c-6,u)},(m,y)=>y+6),o=[];break;case(4t+(y-1));r=[1].concat("...",h,"...",c),l=Array.from({length:Math.min(c-t-2,u)},(m,y)=>t+y+2),o=Array.from({length:Math.min(t-3,u)},(m,y)=>y+2);break;case(t-3<=t&&t<=c):const g=Array.from({length:5},(m,y)=>c-(4-y));r=[1,"..."].concat(g),l=[],o=Array.from({length:Math.min(g[0]-2,u)},(m,y)=>y+2);break}this._adapter.setPageList({pageList:r,restLeftPageList:o,restRightPageList:l})}changePageSize(e){const{pageSize:t}=this.getStates();this._adapter.updatePageSize(e),this._adapter.notifyPageSizeChange(e);const{total:n,currentPage:s}=this.getStates(),{preventPageChangeOnPageSizeChange:r}=this.getProps();let o=s;if(!r){const l=(s-1)*t+1;o=Math.ceil(l/e)}this.updatePage(o,n,e),s!==o&&this._adapter.notifyPageChange(o),this._adapter.notifyChange(o,e)}handleKeyDown(){}pageSizeInOpts(){const{pageSizeOpts:e}=this.getProps(),{pageSize:t}=this.getStates(),n=[...e];if(n.indexOf(t)===-1){const s=n.findIndex(r=>r>t);n.splice(s,0,t)}return n}handleQuickJumpNumberChange(e){this._adapter.updateQuickJumpPage(e)}_handleQuickJump(e){let t=Number(e);const{pageSize:n,total:s}=this.getStates(),r=this._getTotalPageNumber(s,n);Number.isNaN(t)||(t>r&&(t=r),t<=0&&(t=1),this._adapter.updateQuickJumpPage(""),this.goPage(t))}handleQuickJumpBlur(){const{quickJumpPage:e}=this.getStates();(typeof e=="string"&&e||typeof e=="number")&&this._handleQuickJump(e)}handleQuickJumpEnterPress(e){this._handleQuickJump(e)}_getTotalPageNumber(e,t){return Math.ceil(e/t)}}const qs={PREFIX:`${X}-select`,PREFIX_OPTION:`${X}-select-option`,PREFIX_GROUP:`${X}-select-group`},_e={SIZE_SET:["small","large","default"],POSITION_SET:Ma.POSITION_SET,STATUS:pl,SEARCH_POSITION_TRIGGER:"trigger",SEARCH_POSITION_DROPDOWN:"dropdown"},Fi={LIST_HEIGHT:270};var no=function(i,e){var t={};for(var n in i)Object.prototype.hasOwnProperty.call(i,n)&&e.indexOf(n)<0&&(t[n]=i[n]);if(i!=null&&typeof Object.getOwnPropertySymbols=="function")for(var s=0,n=Object.getOwnPropertySymbols(i);sn?o[1]:o[1].value)}catch{t=[]}break;case(s&&!e.size):t=[];break;case(!s&&!!e.size):try{t=n?[...e][0][1]:[...e][0][1].value}catch{}break;case(!s&&!e.size):break}const r=this._adapter.getOptionsFromChildren();this._update(t,r)}handleValueChange(e){const{allowCreate:t,autoClearSearchValue:n,remote:s}=this.getProps(),{inputValue:r}=this.getStates();let o;t&&this._isControlledComponent()?(o=this.getState("options"),o.forEach(l=>l._show=!0)):o=this._adapter.getOptionsFromChildren(),this._adapter.rePositionDropdown(),this._isFilterable()&&!n&&r&&!s&&(o=this._filterOption(o,r)),this._update(e,o)}_update(e,t){let n;this._isMultiple()?(n=this._updateMultiple(e,t),this.updateOverflowItemCount(n.size)):n=this._updateSingle(e,t),this._adapter.updateSelection(n),this.updateOptionsActiveStatus(n,t)}_updateSingle(e,t){const n=new Map,{onChangeWithObject:s}=this.getProps(),r=s&&typeof e<"u"?e.value:e,o=t.filter(c=>c.value===r),l=!o.length&&typeof r<"u"&&r!==null;if(o.length){const c=o[0],d=Object.assign({},c);n.set(d.label,d)}else if(l){let c={value:e,label:e,_notExist:!0,_scrollIndex:-1};s&&(c=Object.assign(Object.assign({},e),{_notExist:!0,_scrollIndex:-1})),n.set(c.label,c)}return n}_updateMultiple(e,t){const n=this.getState("selections");let s=[];const r=Array.isArray(e);this.checkMultipleProps(),n.size&&(s=[...n].map(d=>d[1]));const o=new Map;let l=e;const{onChangeWithObject:c}=this.getProps();return c&&r&&(l=e.map(d=>d.value)),r&&l.length&&l.forEach((d,u)=>{const h=t.findIndex(g=>g.value===d);if(h!==-1)o.set(t[h].label,t[h]);else{const g=s.findIndex(m=>m.value===d);if(g!==-1){const m=s[g];if(c){const y=Object.assign({},e[u]);re(y,m)?o.set(m.label,m):o.set(y.label,y)}else o.set(m.label,m)}else{let m={value:d,label:d,_notExist:!0};c&&(m=Object.assign(Object.assign({},e[u]),{_notExist:!0})),o.set(m.label,Object.assign(Object.assign({},m),{_scrollIndex:-1}))}}}),o}_isMultiple(){return this.getProp("multiple")}_isDisabled(){return this.getProp("disabled")}_isFilterable(){return!!this.getProp("filter")}handleClick(e){const{clickToHide:t}=this.getProps(),{isOpen:n}=this.getStates();this._isDisabled()||(n?n&&t?this.close({event:e}):n&&!t&&this.focusInput():(this.open(),this._notifyFocus(e)))}open(e,t){const n=this._isFilterable(),s=t||this.getState("options");if(n){const o=this._filterOption(s,"").filter(l=>!l._inputCreateOnly);this._adapter.updateOptions(o),this.toggle2SearchInput(!0)}else this._adapter.updateFocusState(!0);this._adapter.openMenu(()=>{const{searchPosition:r,autoFocus:o}=this.getProps();o&&r===_e.SEARCH_POSITION_DROPDOWN&&this._adapter.focusDropdownInput()}),this._setDropdownWidth(),this._adapter.notifyDropdownVisibleChange(!0),this.bindKeyBoardEvent(),this._adapter.registerClickOutsideHandler(r=>{this.close({event:r}),this._notifyBlur(r),this._adapter.updateFocusState(!1)})}toggle2SearchInput(e){e?this._adapter.toggleInputShow(e,()=>this.focusInput()):this._adapter.toggleInputShow(e,()=>{})}close(e){const{event:t,closeCb:n,notToggleInput:s}=e||{},{isFocus:r}=this.getStates();this._adapter.closeMenu(),this._adapter.notifyDropdownVisibleChange(!1),this._adapter.setIsFocusInContainer(!1),r&&this._focusTrigger(),this._adapter.unregisterClickOutsideHandler();const o=this._isFilterable();o&&!s&&this.toggle2SearchInput(!1),this._adapter.once("popoverClose",()=>{o&&this.clearInput(t),n&&n()})}onSelect(e,t,n){if(this._isDisabled())return;e._inputCreateOnly&&this._adapter.notifyCreate(e),this._isMultiple()?this._handleMultipleSelect(e,n):this._handleSingleSelect(e,n),this._adapter.updateFocusIndex(t)}_handleSingleSelect(e,t){var{value:n,label:s}=e,r=no(e,["value","label"]);const o=new Map().set(s,Object.assign({value:n,label:s},r));this._notifySelect(n,Object.assign({value:n,label:s},r));const l=this._isFilterable();this._isControlledComponent()?this.close({event:t,notToggleInput:!0,closeCb:()=>{this._notifyChange(o),l&&this.toggle2SearchInput(!1)}}):(this._adapter.updateSelection(o),this._notifyChange(o),this.close({event:t,closeCb:()=>{this.updateOptionsActiveStatus(o)}}))}_handleMultipleSelect(e,t){var{value:n,label:s}=e,r=no(e,["value","label"]);const o=this._adapter.getMaxLimit(),l=this._adapter.getSelections(),{autoClearSearchValue:c}=this.getProps();if(l.has(s))this._notifyDeselect(n,Object.assign({value:n,label:s},r)),l.delete(s);else if(o&&l.size>=o){this._adapter.notifyMaxLimit(Object.assign({value:n,label:s},ye(r,"_scrollIndex")));return}else this._notifySelect(n,Object.assign({value:n,label:s},r)),l.set(s,Object.assign({value:n,label:s},r));if(this._isControlledComponent())this._notifyChange(l),this._isFilterable()&&(c&&this.clearInput(t),this.focusInput());else{this._adapter.updateSelection(l),this.updateOverflowItemCount(l.size),this._adapter.rePositionDropdown();let{options:d}=this.getStates();this._isFilterable()&&(c&&(this.clearInput(t),d=this._filterOption(d,"")),this.focusInput()),this.updateOptionsActiveStatus(l,d),this._notifyChange(l)}}clearSelected(){const e=new Map;this._isControlledComponent()?(this._notifyChange(e),this._adapter.notifyClear()):(this._adapter.updateSelection(e),this.updateOptionsActiveStatus(e),this._notifyChange(e),this._adapter.notifyClear());const{isOpen:t}=this.getStates();t&&this._adapter.rePositionDropdown()}updateOptionsActiveStatus(e){let t=arguments.length>1&&arguments[1]!==void 0?arguments[1]:this.getState("options");const{allowCreate:n}=this.getProps(),s=t.map(r=>(e.has(r.label)?(r._selected=!0,n&&delete r._inputCreateOnly):(r._inputCreateOnly&&(r._show=!1),r._selected=!1),r));this._adapter.updateOptions(s)}removeTag(e){const t=this._adapter.getSelections();t.delete(e.label),this._isControlledComponent()?(this._notifyDeselect(e.value,e),this._notifyChange(t)):(this._notifyDeselect(e.value,e),this._adapter.updateSelection(t),this.updateOverflowItemCount(t.size),this.updateOptionsActiveStatus(t),this._adapter.rePositionDropdown(),this._notifyChange(t))}clearInput(e){const{inputValue:t}=this.getStates();if(t!==""){this._adapter.updateInputValue(""),this._adapter.notifySearch("",e);const{options:n}=this.getStates(),{remote:s}=this.getProps();let r=n;s||(r=this._filterOption(n,"")),this._adapter.updateOptions(r)}}focusInput(){this._adapter.focusInput(),this._adapter.updateFocusState(!0),this._adapter.setIsFocusInContainer(!1)}handleInputChange(e,t){this._adapter.updateInputValue(e);const{options:n,isOpen:s}=this.getStates(),{allowCreate:r,remote:o}=this.getProps();let l=n;o||(l=this._filterOption(n,e)),l=this._createOptionByInput(r,l,e),this._adapter.updateOptions(l),this._adapter.notifySearch(e,t),this._isMultiple()&&this._adapter.rePositionDropdown()}_filterOption(e,t){const n=this.getProp("filter");if(n){if(typeof n=="boolean"&&n){const s=t.toLowerCase();return e.map(r=>{const o=r.label.toString().toLowerCase(),l=r._parentGroup&&r._parentGroup.label,c=o.includes(s),d=Ce(l)&&l.toLowerCase().includes(s);return c||d?r._show=!0:r._show=!1,r})}else if(typeof n=="function")return e.map(s=>(n(t,s)?s._show=!0:s._show=!1,s))}else return e}_createOptionByInput(e,t,n){if(e)if(n){const s={_show:!0,_selected:!1,value:n,label:n,_inputCreateOnly:!0};let r=-1,o=-1;t.forEach((l,c)=>{!l._show&&!l._inputCreateOnly||(l.label===n&&(o=c),l._inputCreateOnly&&(r=c,l.value=n,l.label=n,l._show=!0))}),r===-1&&o===-1&&t.push(s),o!==-1&&(t=t.filter(l=>!l._inputCreateOnly))}else t=t.filter(s=>!s._inputCreateOnly);return t}bindKeyBoardEvent(){this._keydownHandler=e=>{this._handleKeyDown(e)},this._adapter.registerKeyDown(this._keydownHandler)}unBindKeyBoardEvent(){this._keydownHandler&&this._adapter.unregisterKeyDown()}_handleKeyDown(e){const t=e.keyCode,{loading:n,filter:s,multiple:r,disabled:o}=this.getProps(),{isOpen:l}=this.getStates();if(!(n||o))switch(t){case je.UP:e.preventDefault(),this._handleArrowKeyDown(-1);break;case je.DOWN:e.preventDefault(),this._handleArrowKeyDown(1);break;case je.BACKSPACE:this._handleBackspaceKeyDown();break;case je.ENTER:Et(e),this._handleEnterKeyDown(e);break;case je.ESC:l&&this.close({event:e}),s&&!r&&this._focusTrigger();break;case je.TAB:this._handleTabKeyDown(e);break}}handleContainerKeyDown(e){const t=e.keyCode,{isOpen:n}=this.getStates();switch(t){case je.TAB:n&&this._handleTabKeyDown(e);break}}_getEnableFocusIndex(e){const{focusIndex:t,options:n}=this.getStates(),s=n.filter(l=>l._show),r=s.length;let o=t+e;if(o<0&&(o=r-1),o>=r&&(o=0),e>0){let l=-1;for(let c=0;c=o));c++);o=l}else{let l=s.length;for(let c=r-1;c>=0&&(!s[c].disabled&&(l=c),!(l<=o));c--);o=l}this._adapter.updateFocusIndex(o),this._adapter.updateScrollTop(o)}_handleArrowKeyDown(e){const{isOpen:t}=this.getStates();t?this._getEnableFocusIndex(e):this.open()}_handleTabKeyDown(e){const{isOpen:t}=this.getStates();if(this._adapter.updateFocusState(!1),t){const n=this._adapter.getContainer(),s=this._adapter.getFocusableElements(n);s.length>0?e.shiftKey?this._handlePanelOpenShiftTabKeyDown(s,e):this._handlePanelOpenTabKeyDown(s,e):(this.close({event:e}),this._notifyBlur(e))}else this._notifyBlur(e)}_handlePanelOpenTabKeyDown(e,t){const n=this._adapter.getActiveElement();this._adapter.getIsFocusInContainer()?n===e[e.length-1]&&(this._focusTrigger(),this.close({event:t}),Et(t)):(e[0].focus(),this._adapter.setIsFocusInContainer(!0),Et(t))}_handlePanelOpenShiftTabKeyDown(e,t){const n=this._adapter.getActiveElement();this._adapter.getIsFocusInContainer()?n===e[0]&&(this._focusTrigger(),this._adapter.setIsFocusInContainer(!1),Et(t)):(this.close({event:t}),this._notifyBlur(t))}_handleEnterKeyDown(e){const{isOpen:t,options:n,focusIndex:s}=this.getStates();if(!t)this.open();else if(s!==-1){const r=n.filter(l=>l._show),{length:o}=r;if(o<=s)return;if(r&&o){const l=r[s];if(l.disabled)return;this.onSelect(l,s,e)}}else this.close({event:e})}_handleBackspaceKeyDown(){if(this._isMultiple()){const e=this._adapter.getSelections(),{inputValue:t}=this.getStates(),n=e.size;if(n&&!t){const s=[...e.keys()];let r=n-1,o=s[r],l=e.get(o),c=!1;if(l.disabled&&r===0)return;for(;l.disabled&&r!==0;)r=r-1,o=s[r],l=e.get(o),r==0&&l.disabled&&(c=!0);c||this.removeTag(l)}}}_notifyChange(e){const{onChangeWithObject:t}=this.getProps(),n=this.getState("selections");let s;const r=[...e.values()],o=this._isMultiple();if(this._diffSelections(e,n,o))switch(!0){case t:this._notifyChangeWithObject(e);break;case(!t&&!o):s=r.length?r[0].value:void 0,this._adapter.notifyChange(s);break;case(!t&&o):s=r.length?r.map(c=>c.value):[],this._adapter.notifyChange(s);break}}_removeInternalKey(e){let t=Object.assign({},e);return delete t._parentGroup,delete t._show,delete t._selected,delete t._scrollIndex,delete t._keyInJsx,"_keyInOptionList"in t&&(t.key=t._keyInOptionList,delete t._keyInOptionList),t}_notifySelect(e,t){const n=this._removeInternalKey(t);this._adapter.notifySelect(e,n)}_notifyDeselect(e,t){const n=this._removeInternalKey(t);this._adapter.notifyDeselect(e,n)}_diffSelections(e,t,n){let s=!0,r=!0;if(!n){const o=[...e.values()],l=[...t.values()],c=o[0]?o[0].value:o[0],d=l[0]?l[0].value:l[0];r=!re(c,d);const u=o[0]?o[0].label:o[0],h=l[0]?l[0].label:l[0];s=!re(u,h)}return r||s}_notifyChangeWithObject(e){this.getState("selections");const t=[];for(const n of e.entries()){let s=Object.assign({label:n[0]},n[1]);s=this._removeInternalKey(s),t.push(s)}this._isMultiple()?this._adapter.notifyChange(t):this._adapter.notifyChange(t[0])}_notifyBlur(e){this._adapter.notifyBlur(e)}_notifyFocus(e){this._adapter.notifyFocus(e)}handleMouseEnter(e){this._adapter.updateHovering(!0),this._adapter.notifyMouseEnter(e)}handleMouseLeave(e){this._adapter.updateHovering(!1),this._adapter.notifyMouseLeave(e)}handleClearClick(e){const{filter:t,searchPosition:n}=this.getProps();t&&n===_e.SEARCH_POSITION_TRIGGER&&this.clearInput(e),this.focus(void 0,!1),this.clearSelected(),e.stopPropagation()}handleKeyPress(e){e&&e.key===ja&&this.handleClick(e)}handleClearBtnEnterPress(e){Yt(e)&&this.handleClearClick(e)}handleOptionMouseEnter(e){this._adapter.updateFocusIndex(e)}handleListScroll(e){this._adapter.notifyListScroll(e)}handleTriggerFocus(e){this.bindKeyBoardEvent(),this._adapter.setIsFocusInContainer(!1)}handleTriggerBlur(e){const{filter:t,autoFocus:n}=this.getProps(),{isOpen:s,isFocus:r}=this.getStates();r&&!s&&(this._notifyBlur(e),this._adapter.updateFocusState(!1))}handleInputBlur(e){const{filter:t,autoFocus:n}=this.getProps(),{showInput:s,isOpen:r}=this.getStates(),o=this._isMultiple();t&&!o&&(s||n)&&!r&&this.toggle2SearchInput(!1)}selectAll(){const{options:e}=this.getStates(),{onChangeWithObject:t}=this.getProps();let n=[];if(!this._isMultiple()){console.warn(`[Semi Select]: It seems that you have called the selectAll method in the single-selection Select. + Please note that this is not a legal way to use it`);return}t?n=e:n=e.map(r=>r.value),this.handleValueChange(n),this._adapter.notifyChange(n)}checkMultipleProps(e){if(this._isMultiple()){const t=e||this.getProps(),{defaultValue:n,value:s}=t,r=s||n;!Xt(r)&&!Array.isArray(r)&&$e(!0,"[Semi Select] defaultValue/value should be array type in multiple mode")}}updateScrollTop(){this._adapter.updateScrollTop()}updateOverflowItemCount(e,t){const{maxTagCount:n,ellipsisTrigger:s}=this.getProps();s&&(t?this._adapter.updateOverflowItemCount(t):typeof n=="number"&&(e-n>0?this._adapter.updateOverflowItemCount(e-n):this._adapter.updateOverflowItemCount(0)))}updateIsFullTags(){const{isFullTags:e}=this.getStates();e||this._adapter.setState({isFullTags:!0})}handlePopoverClose(){this._adapter.emit("popoverClose")}handleSlotMouseEnter(){this._adapter.updateFocusIndex(-1)}}const lt=al.PREFIX,Ki=gi.TAG_SIZE,Rd=gi.AVATAR_SHAPE;class Ht extends L.PureComponent{renderNTag(e,t){const{size:n,showPopover:s,popoverProps:r,onPlusNMouseEnter:o}=this.props;let l=b.createElement(mt,{closable:!1,size:n,color:"grey",style:{backgroundColor:"transparent"},key:"_+n",onMouseEnter:o},"+",e);return s&&(l=b.createElement(yt,Object.assign({showArrow:!0,content:t,trigger:"hover",position:"top",autoAdjustOverflow:!0,className:`${lt}-rest-group-popover`},r,{key:"_+n_Popover"}),l)),l}renderMergeTags(e){const{maxTagCount:t,tagList:n,restCount:s}=this.props,r=s||n.length-t;let o=e;const l=e.slice(0,t),c=e.slice(t);let d=null;return r>0&&(d=this.renderNTag(r,c),l.push(d),o=l),o}renderAllTags(){const{tagList:e,size:t,mode:n,avatarShape:s,onTagClose:r}=this.props;return e.map(l=>{if(n==="custom")return l;const c=Object.assign({},l);return c.size||(c.size=t),c.avatarShape||(c.avatarShape=s),c.tagKey||(typeof c.children=="string"||typeof c.children=="number"?c.tagKey=c.children:c.tagKey=Math.random()),b.createElement(mt,Object.assign({},c,{key:c.tagKey,onClose:(d,u,h)=>{c.onClose&&c.onClose(d,u,h),r&&r(d,u,h)}}))})}render(){const{style:e,className:t,maxTagCount:n,size:s}=this.props,r=M({[`${lt}-group`]:!0,[`${lt}-group-max`]:n,[`${lt}-group-small`]:s==="small",[`${lt}-group-large`]:s==="large"},t),o=this.renderAllTags(),l=typeof n>"u"?o:this.renderMergeTags(o);return b.createElement("div",{style:e,className:r},l)}}Ht.defaultProps={style:{},className:"",size:Ki[0],avatarShape:"square",onTagClose:()=>{},onPlusNMouseEnter:()=>{}};Ht.propTypes={children:a.node,style:a.object,className:a.string,maxTagCount:a.number,restCount:a.number,tagList:a.array,size:a.oneOf(Ki),mode:a.string,onTagClose:a.func,showPopover:a.bool,popoverProps:a.object,avatarShape:a.oneOf(Rd)};var Ed=function(i,e){var t={};for(var n in i)Object.prototype.hasOwnProperty.call(i,n)&&e.indexOf(n)<0&&(t[n]=i[n]);if(i!=null&&typeof Object.getOwnPropertySymbols=="function")for(var s=0,n=Object.getOwnPropertySymbols(i);s{const s=i.props;if(!i||!s)return null;const r=Object.assign(Object.assign({value:s.value,label:s.label||s.children||s.value,_show:!0,_selected:!1,_scrollIndex:t},s),{_parentGroup:e});return r._keyInJsx=n||i.key,r},xd=i=>{let e=[],t=[];const n={label:"",children:[],_show:!1};let s=b.Children.toArray(i);s=s.filter(l=>l&&l.props);let r="",o=-1;return s.forEach(l=>{if(l.type.isSelectOption){r="option",o++;const c=so(l,void 0,o);n.children.push(c),t.push(c)}else if(l.type.isSelectOptionGroup){r="group";let c=l.props,{children:d}=c,u=Ed(c,["children"]);u.key=l.key;let h=[];Array.isArray(d)?h=d.map(y=>y.key):h.push(d.key),d=b.Children.toArray(d);const g=d.map((y,p)=>{let f=y.key;return h[p]===null&&(f=l.key+""+y.key),o++,so(y,u,o,f)}),m=Object.assign(Object.assign({},l.props),{children:g,key:l.key});e.push(m),t=t.concat(g)}else $e(!0,"[Semi Select] The children of `Select` should be `Select.Option` or `Select.OptionGroup`")}),r==="option"&&(e=[n]),{optionGroups:e,options:t}},Td=i=>{let{index:e,data:t,style:n}=i;const{visibleOptions:s,renderOption:r}=t,o=s[e];return r(o,e,n)};var ro=function(i,e){var t={};for(var n in i)Object.prototype.hasOwnProperty.call(i,n)&&e.indexOf(n)<0&&(t[n]=i[n]);if(i!=null&&typeof Object.getOwnPropertySymbols=="function")for(var s=0,n=Object.getOwnPropertySymbols(i);sb.createElement("div",{className:_,"x-semi-prop":"emptyContent"},c||E.emptyText));if(typeof f=="function"){const E=M(g,{[`${p}-custom`]:!0,[`${p}-custom-selected`]:r});return f(Object.assign({disabled:n,focused:u,selected:r,style:m,label:o,value:s,inputValue:S,onMouseEnter:k=>y(k),onClick:k=>this.onClick(Object.assign({value:s,label:o,children:t},w),k),className:E},w))}const I={searchWords:[S],sourceString:t,highlightClassName:`${p}-keyword`};return b.createElement("div",Object.assign({className:_,onClick:E=>{this.onClick(Object.assign({value:s,label:o,children:t},w),E)},onMouseEnter:E=>y&&y(E),role:"option",id:v,"aria-selected":r?"true":"false","aria-disabled":n?"true":"false",style:m},qt(w)),h?b.createElement("div",{className:O},b.createElement(za,null)):null,Ce(t)?b.createElement("div",{className:`${p}-text`},this.renderOptionContent({children:t,config:I,inputValue:S,prefixCls:p})):t)}};He.isSelectOption=!0;He.propTypes={children:a.node,disabled:a.bool,value:a.oneOfType([a.string,a.number]),selected:a.bool,label:a.node,empty:a.bool,emptyContent:a.node,onSelect:a.func,focused:a.bool,showTick:a.bool,className:a.string,style:a.object,onMouseEnter:a.func,prefixCls:a.string,renderOptionItem:a.func,inputValue:a.string};He.defaultProps={prefixCls:qs.PREFIX_OPTION};var Id=function(i,e){var t={};for(var n in i)Object.prototype.hasOwnProperty.call(i,n)&&e.indexOf(n)<0&&(t[n]=i[n]);if(i!=null&&typeof Object.getOwnPropertySymbols=="function")for(var s=0,n=Object.getOwnPropertySymbols(i);sthis.optionContainerEl={current:t},this.handleInputChange=(t,n)=>this.foundation.handleInputChange(t,n),this.getTagItem=(t,n,s)=>{const{size:r,disabled:o}=this.props,l=t[0],{value:c}=t[1],d=t[1].disabled||o,u=(y,p)=>{p&&typeof p.preventDefault=="function"&&p.preventDefault(),this.foundation.removeTag({label:l,value:c})},{content:h,isRenderInTag:g}=s(t[1],{index:n,disabled:d,onClose:u}),m={disabled:d,closable:!d,onClose:u};return g?b.createElement(mt,Object.assign({},m,{color:"white",size:r||"large",key:c,tabIndex:-1}),h):b.createElement(L.Fragment,{key:c},h)},this.state={isOpen:!1,isFocus:!1,options:[],selections:new Map,dropdownMinWidth:null,optionKey:Dd,inputValue:"",showInput:!1,focusIndex:e.defaultActiveFirstOption?0:-1,keyboardEventSet:{},optionGroups:[],isHovering:!1,isFocusInContainer:!1,isFullTags:!1,overflowItemCount:0},this.selectOptionListID="",this.selectID="",this.virtualizeListRef=b.createRef(),this.inputRef=b.createRef(),this.dropdownInputRef=b.createRef(),this.triggerRef=b.createRef(),this.optionsRef=b.createRef(),this.optionContainerEl=b.createRef(),this.clickOutsideHandler=null,this.onSelect=this.onSelect.bind(this),this.onClear=this.onClear.bind(this),this.onMouseEnter=this.onMouseEnter.bind(this),this.onMouseLeave=this.onMouseLeave.bind(this),this.renderOption=this.renderOption.bind(this),this.onKeyPress=this.onKeyPress.bind(this),this.eventManager=new Fa,this.foundation=new Od(this.adapter)}get adapter(){var e=this;const t={registerKeyDown:r=>{const o={onKeyDown:r};this.setState({keyboardEventSet:o})},unregisterKeyDown:()=>{this.setState({keyboardEventSet:{}})},updateFocusIndex:r=>{this.setState({focusIndex:r})},scrollToFocusOption:()=>{}},n={updateInputValue:r=>{this.setState({inputValue:r})},toggleInputShow:(r,o)=>{this.setState({showInput:r},()=>{o()})},focusInput:()=>{const{preventScroll:r}=this.props;this.inputRef&&this.inputRef.current&&this.inputRef.current.focus({preventScroll:r})},focusDropdownInput:()=>{const{preventScroll:r}=this.props;this.dropdownInputRef&&this.dropdownInputRef.current&&this.dropdownInputRef.current.focus({preventScroll:r})}},s={notifyMaxLimit:r=>this.props.onExceed(r),getMaxLimit:()=>this.props.max,registerClickOutsideHandler:r=>{const o=l=>{const c=this.triggerRef&&this.triggerRef.current,d=this.optionContainerEl&&this.optionContainerEl.current,u=l.target,h=l.composedPath&&l.composedPath()||[u];!(d&&d.contains(u))&&!(c&&c.contains(u))&&!(h.includes(c)||h.includes(d))&&r(l)};this.clickOutsideHandler=o,document.addEventListener("mousedown",o,!1)},unregisterClickOutsideHandler:()=>{this.clickOutsideHandler&&(document.removeEventListener("mousedown",this.clickOutsideHandler,!1),this.clickOutsideHandler=null)},rePositionDropdown:()=>{let{optionKey:r}=this.state;r=r+1,this.setState({optionKey:r})},notifyDeselect:(r,o)=>{delete o._parentGroup,this.props.onDeselect(r,o)}};return Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({},super.adapter),t),n),s),{on:(r,o)=>this.eventManager.on(r,o),off:r=>this.eventManager.off(r),once:(r,o)=>this.eventManager.once(r,o),emit:r=>this.eventManager.emit(r),getOptionsFromChildren:function(){let r=arguments.length>0&&arguments[0]!==void 0?arguments[0]:e.props.children,o=[],l=[];const{optionList:c}=e.props;if(c&&c.length)l=c.map((d,u)=>Object.assign({_show:!0,_selected:!1,_scrollIndex:u},d)),o[0]={children:l,label:""};else{const d=xd(r);o=d.optionGroups,l=d.options}return e.setState({optionGroups:o}),l},updateOptions:r=>{this.setState({options:r})},openMenu:r=>{this.setState({isOpen:!0},()=>{r==null||r()})},closeMenu:()=>{this.setState({isOpen:!1})},getTriggerWidth:()=>{const r=this.triggerRef.current;return r&&r.getBoundingClientRect().width},setOptionWrapperWidth:r=>{this.setState({dropdownMinWidth:r})},updateSelection:r=>{this.setState({selections:r})},getSelections:()=>new Map(this.state.selections),notifyChange:r=>{this.props.onChange(r)},notifySelect:(r,o)=>{delete o._parentGroup,this.props.onSelect(r,o)},notifyDropdownVisibleChange:r=>{this.props.onDropdownVisibleChange(r)},notifySearch:(r,o)=>{this.props.onSearch(r,o)},notifyCreate:r=>{this.props.onCreate(r)},notifyMouseEnter:r=>{this.props.onMouseEnter(r)},notifyMouseLeave:r=>{this.props.onMouseLeave(r)},notifyFocus:r=>{this.props.onFocus(r)},notifyBlur:r=>{this.props.onBlur(r)},notifyClear:()=>{this.props.onClear()},notifyListScroll:r=>{this.props.onListScroll(r)},updateHovering:r=>{this.setState({isHovering:r})},updateFocusState:r=>{this.setState({isFocus:r})},updateOverflowItemCount:r=>{this.setState({overflowItemCount:r})},focusTrigger:()=>{try{const{preventScroll:r}=this.props;this.triggerRef.current.focus({preventScroll:r})}catch{}},getContainer:()=>this.optionContainerEl&&this.optionContainerEl.current,getFocusableElements:r=>$a(r),getActiveElement:()=>Ka(),setIsFocusInContainer:r=>{this.setState({isFocusInContainer:r})},getIsFocusInContainer:()=>this.state.isFocusInContainer,updateScrollTop:r=>{let o;"renderOptionItem"in this.props?(o=`.${$}-option-custom-selected`,r!==void 0&&(o=`.${$}-option-custom:nth-child(${r+1})`)):(o=`.${$}-option-selected`,r!==void 0&&(o=`.${$}-option:nth-child(${r+1})`));let l=document.querySelector(`#${$}-${this.selectOptionListID} ${o}`);if(Array.isArray(l)&&(l=l[0]),l){const c=l.parentNode;c.scrollTop=l.offsetTop-c.offsetTop-c.clientHeight/2+l.clientHeight/2}}})}componentDidMount(){this.foundation.init(),this.selectOptionListID=jt(),this.selectID=this.props.id||jt()}componentWillUnmount(){this.foundation.destroy()}componentDidUpdate(e,t){const n=b.Children.toArray(e.children).map(o=>o.key),s=b.Children.toArray(this.props.children).map(o=>o.key);let r=!1;(!re(n,s)||!re(e.optionList,this.props.optionList))&&(r=!0,this.foundation.handleOptionListChange()),(!re(this.props.value,e.value)||r)&&("value"in this.props?this.foundation.handleValueChange(this.props.value):this.foundation.handleOptionListChangeHadDefaultValue())}renderTriggerInput(){const{size:e,multiple:t,disabled:n,inputProps:s,filter:r}=this.props,o=x(s,"className"),l=M(`${$}-input`,{[`${$}-input-single`]:!t,[`${$}-input-multiple`]:t},o),{inputValue:c,focusIndex:d}=this.state,u=Object.assign({value:c,disabled:n,className:l,onChange:this.handleInputChange},s);let h={};return t&&(h={width:c?`${c.length*16}px`:"2px"},u.style=h),b.createElement(fr,Object.assign({ref:this.inputRef,size:e,"aria-activedescendant":d!==-1?`${this.selectID}-option-${d}`:"",onFocus:g=>{t&&r&&this.setState({isFocus:!0}),g.stopPropagation()},onBlur:g=>this.foundation.handleInputBlur(g)},u))}renderDropdownInput(){const{size:e,multiple:t,disabled:n,inputProps:s,filter:r,searchPosition:o,searchPlaceholder:l}=this.props,{inputValue:c,focusIndex:d}=this.state,u=M(`${$}-dropdown-search-wrapper`,{}),h=x(s,"className"),g=M(`${$}-dropdown-input`,{[`${$}-dropdown-input-single`]:!t,[`${$}-dropdown-input-multiple`]:t},h),m=Object.assign(Object.assign({value:c,disabled:n,className:g,onChange:this.handleInputChange,placeholder:l,showClear:!0},s),{onKeyDown:y=>this.foundation._handleKeyDown(y)});return b.createElement("div",{className:u},b.createElement(fr,Object.assign({ref:this.dropdownInputRef,prefix:b.createElement(Il,null),"aria-activedescendant":d!==-1?`${this.selectID}-option-${d}`:""},m)))}close(){this.foundation.close()}open(){this.foundation.open()}clearInput(){this.foundation.clearInput()}selectAll(){this.foundation.selectAll()}deselectAll(){this.foundation.clearSelected()}focus(){this.foundation.focus()}rePosition(){let{optionKey:e}=this.state;e=e+1,this.setState({optionKey:e})}onSelect(e,t,n){this.foundation.onSelect(e,t,n)}onClear(e){e.nativeEvent.stopImmediatePropagation(),this.foundation.handleClearClick(e)}search(e,t){this.handleInputChange(e,t)}renderEmpty(){return b.createElement(He,{empty:!0,emptyContent:this.props.emptyContent})}renderLoading(){const e=`${$}-loading-wrapper`;return b.createElement("div",{className:e},b.createElement(mi,null))}renderOption(e,t,n){const{focusIndex:s,inputValue:r}=this.state,{renderOptionItem:o}=this.props;let l;const c=t===s;let d=n||{};return e.style&&(d=Object.assign(Object.assign({},d),e.style)),e._inputCreateOnly?l=this.renderCreateOption(e,c,t,n):("key"in e&&(e._keyInOptionList=e.key),l=b.createElement(He,Object.assign({showTick:!0},e,{selected:e._selected,onSelect:(u,h)=>this.onSelect(u,t,h),focused:c,onMouseEnter:()=>this.onOptionHover(t),style:d,key:e._keyInOptionList||e._keyInJsx||e.label+e.value+t,renderOptionItem:o,inputValue:r,semiOptionId:`${this.selectID}-option-${t}`}),e.label)),l}renderCreateOption(e,t,n,s){const{renderCreateItem:r}=this.props;if(typeof r>"u")return b.createElement(He,Object.assign({key:e.key||e.label+e.value,onSelect:(c,d)=>this.onSelect(c,n,d),onMouseEnter:()=>this.onOptionHover(n),showTick:!0},e,{focused:t,style:s}),b.createElement(Ee,{componentName:"Select"},c=>b.createElement(b.Fragment,null,b.createElement("span",{className:`${$}-create-tips`},c.createText),e.value)));const o=r(e.value,t,s);return b.createElement("div",{role:"button","aria-label":"Use the input box to create an optional item",onClick:l=>this.onSelect(e,n,l),key:e.key||e.label},o)}onOptionHover(e){this.foundation.handleOptionMouseEnter(e)}renderWithGroup(e){const t=[],n=new Map;return e.forEach((s,r)=>{const o=s._parentGroup,l=this.renderOption(s,r);if(o&&!n.has(o.label)){const c=typeof o.label=="string"||typeof o.label=="number"?o.label:o.key,d=b.createElement(nn,Object.assign({},o,{key:c}));n.set(o.label,!0),t.push(d)}t.push(l)}),t}renderVirtualizeList(e){const{virtualize:t}=this.props,{direction:n}=this.context,{height:s,width:r,itemSize:o}=t;return b.createElement(Oi,{ref:this.virtualizeListRef,height:s||Fi.LIST_HEIGHT,itemCount:e.length,itemSize:o,itemData:{visibleOptions:e,renderOption:this.renderOption},width:r||"100%",style:{direction:n}},Td)}renderOptions(e){const{dropdownMinWidth:t,options:n,selections:s}=this.state,{maxHeight:r,dropdownClassName:o,dropdownStyle:l,outerTopSlot:c,innerTopSlot:d,outerBottomSlot:u,innerBottomSlot:h,loading:g,virtualize:m,multiple:y,emptyContent:p,searchPosition:f,filter:S}=this.props,v=n.filter(E=>E._show);let w=this.renderWithGroup(v);m&&(w=this.renderVirtualizeList(v));const _=Object.assign({minWidth:t},l),O=M({[`${$}-option-list`]:!0,[`${$}-option-list-chosen`]:s.size}),I=!n.length||!n.some(E=>E._show);return b.createElement("div",{id:`${$}-${this.selectOptionListID}`,className:M({[`${$}-option-list-wrapper`]:!(I&&p===null)},o),style:_,ref:this.setOptionContainerEl,onKeyDown:E=>this.foundation.handleContainerKeyDown(E)},c?b.createElement("div",{className:`${$}-option-list-outer-top-slot`,onMouseEnter:()=>this.foundation.handleSlotMouseEnter()},c):null,f===_e.SEARCH_POSITION_DROPDOWN&&S?this.renderDropdownInput():null,b.createElement("div",{style:{maxHeight:`${r}px`},className:O,role:"listbox","aria-multiselectable":y,onScroll:E=>this.foundation.handleListScroll(E)},d?b.createElement("div",{className:`${$}-option-list-inner-top-slot`,onMouseEnter:()=>this.foundation.handleSlotMouseEnter()},d):null,g?this.renderLoading():I?this.renderEmpty():w,h?b.createElement("div",{className:`${$}-option-list-inner-bottom-slot`,onMouseEnter:()=>this.foundation.handleSlotMouseEnter()},h):null),u?b.createElement("div",{className:`${$}-option-list-outer-bottom-slot`,onMouseEnter:()=>this.foundation.handleSlotMouseEnter()},u):null)}renderSingleSelection(e,t){let{renderSelectedItem:n,searchPosition:s}=this.props;const{placeholder:r}=this.props,{showInput:o,inputValue:l}=this.state;let c="";const d=[...e];if(typeof n>"u"&&(n=m=>m.label),d.length){const m=d[0][1];c=n(m)}const u=s===_e.SEARCH_POSITION_TRIGGER,h=M({[`${$}-selection-text`]:!0,[`${$}-selection-placeholder`]:!c&&c!==0,[`${$}-selection-text-hide`]:l&&o&&u,[`${$}-selection-text-inactive`]:!l&&o&&u}),g=`${$}-content-wrapper`;return b.createElement(b.Fragment,null,b.createElement("div",{className:g},b.createElement("span",{className:h,"x-semi-prop":"placeholder"},c||c===0?c:r),t&&o&&u?this.renderTriggerInput():null))}renderTag(e,t,n){const{size:s,disabled:r}=this.props;let{renderSelectedItem:o}=this.props;const l=e[0],{value:c}=e[1],d=e[1].disabled||r,u=(p,f)=>{f&&typeof f.preventDefault=="function"&&f.preventDefault(),this.foundation.removeTag({label:l,value:c})};typeof o>"u"&&(o=p=>({isRenderInTag:!0,content:p.label}));const{content:h,isRenderInTag:g}=o(e[1],{index:t,disabled:d,onClose:u}),m={disabled:d,closable:!d,onClose:u},y=n&&!ue(this.props.renderSelectedItem)?b.createElement(Ba,{size:"small",ellipsis:{rows:1,showTooltip:{type:"popover",opts:{style:{width:"auto",fontSize:12}}}}},h):h;return g?b.createElement(mt,Object.assign({},m,{color:"white",size:s||"large",key:c,style:{maxWidth:"100%"}}),y):b.createElement(L.Fragment,{key:c},y)}renderNTag(e,t){const{size:n,showRestTagsPopover:s,restTagsPopoverProps:r}=this.props;let o=b.createElement(mt,{closable:!1,size:n||"large",color:"grey",className:`${$}-content-wrapper-collapse-tag`,key:`_+${e}`,style:{marginRight:0,flexShrink:0}},"+",e);return s&&(o=b.createElement(yt,Object.assign({showArrow:!0,content:b.createElement(Qt,{spacing:2,wrap:!0,style:{maxWidth:"400px"}},t.map((l,c)=>this.renderTag(l,c))),trigger:"hover",position:"top",autoAdjustOverflow:!0},r,{key:`_+${e}_Popover`}),o)),o}renderOverflow(e,t){return e.length&&e[0]?this.renderTag(e[0],t,!0):null}handleOverflow(e){const{overflowItemCount:t,selections:n}=this.state,{maxTagCount:s}=this.props,r=n.size-s>0?n.size-s+e.length-1:e.length-1;t!==r&&this.foundation.updateOverflowItemCount(n.size,r)}renderCollapsedTags(e,t){const{overflowItemCount:n}=this.state,s=typeof t=="number"?e.slice(0,t):e;return b.createElement("div",{className:`${$}-content-wrapper-collapse`},b.createElement(Qe,{items:s,itemKey:r=>{var o;return(o=r==null?void 0:r[1])===null||o===void 0?void 0:o.value},overflowRenderer:r=>this.renderOverflow(r,t-1),onOverflow:r=>this.handleOverflow(r),visibleItemRenderer:(r,o)=>this.renderTag(r,o)}),n>0&&this.renderNTag(n,e.slice(e.length-n)))}renderOneLineTags(e,t){let{renderSelectedItem:n}=this.props;const{showRestTagsPopover:s,restTagsPopoverProps:r,maxTagCount:o}=this.props,{isFullTags:l}=this.state;let c;if(typeof n>"u"&&(n=d=>({isRenderInTag:!0,content:d.label})),s){const u=(l?e:e.slice(0,o)).map((h,g)=>this.getTagItem(h,g,n));c=b.createElement(Ht,{tagList:u,maxTagCount:t,restCount:l?void 0:e.length-o,size:"large",mode:"custom",showPopover:s,popoverProps:r,onPlusNMouseEnter:()=>{this.foundation.updateIsFullTags()}})}else{const u=e.slice(0,o).map((h,g)=>this.getTagItem(h,g,n));c=b.createElement(Ht,{tagList:u,maxTagCount:t,restCount:e.length-o,size:"large",mode:"custom"})}return c}renderMultipleSelection(e,t){let{renderSelectedItem:n,searchPosition:s}=this.props;const{placeholder:r,maxTagCount:o,expandRestTagsOnClick:l,ellipsisTrigger:c}=this.props,{inputValue:d,isOpen:u}=this.state,h=[...e];typeof n>"u"&&(n=_=>({isRenderInTag:!0,content:_.label}));const g=M({[`${$}-content-wrapper`]:!0,[`${$}-content-wrapper-one-line`]:o&&!u,[`${$}-content-wrapper-empty`]:!h.length}),m=M({[`${$}-selection-text`]:!0,[`${$}-selection-placeholder`]:!h.length,[`${$}-selection-text-hide`]:h&&h.length}),y=r&&!d?b.createElement("span",{className:m},r):null,p=h.length>o?o:void 0,f=!o,S=c?this.renderCollapsedTags(h,p):this.renderOneLineTags(h,p),v=f||l&&u?h.map((_,O)=>this.renderTag(_,O)):S,w=t&&s===_e.SEARCH_POSITION_TRIGGER;return b.createElement(b.Fragment,null,b.createElement("div",{className:g},h&&h.length?v:y,w?this.renderTriggerInput():null))}onMouseEnter(e){this.foundation.handleMouseEnter(e)}onMouseLeave(e){this.foundation.handleMouseLeave(e)}onKeyPress(e){this.foundation.handleKeyPress(e)}handlePopoverVisibleChange(e){const{virtualize:t}=this.props,{selections:n}=this.state;if(e)if(t){let s=-1;if(n.forEach(r=>{const o=x(r,"_scrollIndex");gt(o)&&o>=0&&(s=s!==-1&&sthis.foundation.removeTag(Q),onClear:this.onClear,disabled:t,triggerRender:p,placeholder:y,componentName:"Select",componentProps:Object.assign({},this.props)}):[b.createElement(L.Fragment,{key:"prefix"},g||m?this.renderPrefix():null),b.createElement(L.Fragment,{key:"selection"},b.createElement("div",{className:M(`${$}-selection`)},n?this.renderMultipleSelection(_,K):this.renderSingleSelection(_,K))),b.createElement(L.Fragment,{key:"suffix"},h?this.renderSuffix():null),b.createElement(L.Fragment,{key:"clearicon"},q?b.createElement("div",{className:M(`${$}-clear`),onClick:this.onClear},W):V)],se=t||K&&P||K&&n?-1:0;return b.createElement("div",Object.assign({role:"combobox","aria-disabled":t,"aria-expanded":O,"aria-controls":`${$}-${this.selectOptionListID}`,"aria-haspopup":"listbox","aria-label":_.size?"selected":"","aria-invalid":this.props["aria-invalid"],"aria-errormessage":this.props["aria-errormessage"],"aria-labelledby":this.props["aria-labelledby"],"aria-describedby":this.props["aria-describedby"],"aria-required":this.props["aria-required"],className:z,ref:Q=>{this.triggerRef.current=Q},onClick:Q=>this.foundation.handleClick(Q),style:r,id:this.selectID,tabIndex:se,"aria-activedescendant":A!==-1?`${this.selectID}-option-${A}`:"",onMouseEnter:this.onMouseEnter,onMouseLeave:this.onMouseLeave,onFocus:Q=>this.foundation.handleTriggerFocus(Q),onBlur:Q=>this.foundation.handleTriggerBlur(Q),onKeyPress:this.onKeyPress},I,this.getDataAttr(w)),G)}render(){const{direction:e}=this.context,t=e==="rtl"?"bottomRight":"bottomLeft",{children:n,position:s=t,zIndex:r,getPopupContainer:o,motion:l,autoAdjustOverflow:c,mouseLeaveDelay:d,mouseEnterDelay:u,spacing:h,stopPropagation:g,dropdownMargin:m,rePosKey:y}=this.props,{isOpen:p,optionKey:f}=this.state,S=this.renderSelection(),v=y!==void 0?`${f}-${y}`:f;return b.createElement(yt,{getPopupContainer:o,motion:l,margin:m,autoAdjustOverflow:c,mouseLeaveDelay:d,mouseEnterDelay:u,zIndex:r,ref:this.optionsRef,content:()=>this.renderOptions(n),visible:p,trigger:"custom",rePosKey:v,position:s,spacing:h,stopPropagation:g,disableArrowKeyDown:!0,onVisibleChange:w=>this.handlePopoverVisibleChange(w),afterClose:()=>this.foundation.handlePopoverClose()},S)}}Te.contextType=Ls;Te.Option=He;Te.OptGroup=nn;Te.propTypes={"aria-describedby":a.string,"aria-errormessage":a.string,"aria-invalid":a.bool,"aria-labelledby":a.string,"aria-required":a.bool,autoFocus:a.bool,autoClearSearchValue:a.bool,borderless:a.bool,children:a.node,clearIcon:a.node,defaultValue:a.oneOfType([a.string,a.number,a.array,a.object]),ellipsisTrigger:a.bool,value:a.oneOfType([a.string,a.number,a.array,a.object]),placeholder:a.node,onChange:a.func,multiple:a.bool,filter:a.oneOfType([a.func,a.bool]),max:a.number,maxTagCount:a.number,maxHeight:a.oneOfType([a.string,a.number]),style:a.object,className:a.string,size:a.oneOf(_e.SIZE_SET),disabled:a.bool,emptyContent:a.node,expandRestTagsOnClick:a.bool,onDropdownVisibleChange:a.func,zIndex:a.number,position:a.oneOf(_e.POSITION_SET),onSearch:a.func,getPopupContainer:a.func,dropdownClassName:a.string,dropdownStyle:a.object,dropdownMargin:a.oneOfType([a.number,a.object]),outerTopSlot:a.node,innerTopSlot:a.node,inputProps:a.object,outerBottomSlot:a.node,innerBottomSlot:a.node,optionList:a.array,dropdownMatchSelectWidth:a.bool,loading:a.bool,defaultOpen:a.bool,validateStatus:a.oneOf(_e.STATUS),defaultActiveFirstOption:a.bool,triggerRender:a.func,stopPropagation:a.bool,searchPosition:a.string,motion:a.bool,onChangeWithObject:a.bool,suffix:a.node,prefix:a.node,insetLabel:a.node,insetLabelId:a.string,showClear:a.bool,showArrow:a.bool,renderSelectedItem:a.func,allowCreate:a.bool,renderCreateItem:a.func,onMouseEnter:a.func,onMouseLeave:a.func,clickToHide:a.bool,onExceed:a.func,onCreate:a.func,remote:a.bool,onDeselect:a.func,onSelect:a.func,autoAdjustOverflow:a.bool,mouseEnterDelay:a.number,mouseLeaveDelay:a.number,spacing:a.oneOfType([a.number,a.object]),rePosKey:a.oneOfType([a.string,a.number]),onBlur:a.func,onFocus:a.func,onClear:a.func,virtualize:a.object,renderOptionItem:a.func,onListScroll:a.func,arrowIcon:a.node,preventScroll:a.bool};Te.__SemiComponentName__="Select";Te.defaultProps=ks(Te.__SemiComponentName__,{stopPropagation:!0,motion:!0,borderless:!1,zIndex:ci.DEFAULT_Z_INDEX,filter:!1,multiple:!1,disabled:!1,defaultOpen:!1,allowCreate:!1,placeholder:"",onDropdownVisibleChange:H,onChangeWithObject:!1,onChange:H,onSearch:H,onMouseEnter:H,onMouseLeave:H,onDeselect:H,onSelect:H,onCreate:H,onExceed:H,onFocus:H,onBlur:H,onClear:H,onListScroll:H,maxHeight:Fi.LIST_HEIGHT,dropdownMatchSelectWidth:!0,defaultActiveFirstOption:!0,showArrow:!0,showClear:!1,searchPosition:_e.SEARCH_POSITION_TRIGGER,remote:!1,autoAdjustOverflow:!0,autoClearSearchValue:!0,arrowIcon:b.createElement(Ms,{"aria-label":""}),showRestTagsPopover:!1,restTagsPopoverProps:{},expandRestTagsOnClick:!1,ellipsisTrigger:!1});var oo=function(i,e){var t={};for(var n in i)Object.prototype.hasOwnProperty.call(i,n)&&e.indexOf(n)<0&&(t[n]=i[n]);if(i!=null&&typeof Object.getOwnPropertySymbols=="function")for(var s=0,n=Object.getOwnPropertySymbols(i);so+1):[]},this.foundation=new _d(this.adapter),this.renderDefaultPage=this.renderDefaultPage.bind(this),this.renderSmallPage=this.renderSmallPage.bind(this),$e(!!(e.showSizeChanger&&e.hideOnSinglePage),"[Semi Pagination] You should not use showSizeChanger and hideOnSinglePage in ths same time. At this time, hideOnSinglePage no longer takes effect, otherwise there may be a problem that the switch entry disappears")}get adapter(){return Object.assign(Object.assign({},super.adapter),{setPageList:e=>{const{pageList:t,restLeftPageList:n,restRightPageList:s}=e;this.setState({pageList:t,restLeftPageList:n,restRightPageList:s})},setDisabled:(e,t)=>{this.setState({prevDisabled:e,nextDisabled:t})},updateTotal:e=>this.setState({total:e}),updatePageSize:e=>this.setState({pageSize:e}),updateQuickJumpPage:e=>this.setState({quickJumpPage:e}),updateAllPageNumbers:e=>this.setState({allPageNumbers:e}),setCurrentPage:e=>{this.setState({currentPage:e})},registerKeyDownHandler:e=>{document.addEventListener("keydown",e)},unregisterKeyDownHandler:e=>{document.removeEventListener("keydown",e)},notifyPageChange:e=>{this.props.onPageChange(e)},notifyPageSizeChange:e=>{this.props.onPageSizeChange(e)},notifyChange:(e,t)=>{this.props.onChange(e,t)}})}componentDidMount(){this.foundation.init()}componentWillUnmount(){this.foundation.destroy()}componentDidUpdate(e){const t={currentPage:this.props.currentPage,total:this.props.total,pageSize:this.props.pageSize};let n=!1,s=!1;e.currentPage!==this.props.currentPage&&(n=!0),e.total!==this.props.total&&(n=!0,s=!0),e.pageSize!==this.props.pageSize&&(n=!0,s=!0),n&&this.foundation.updatePage(t.currentPage,t.total,t.pageSize),s&&this.foundation.updateAllPageNumbers(t.total,t.pageSize)}renderPrevBtn(){const{prevText:e,disabled:t}=this.props,{prevDisabled:n}=this.state,s=n||t,r=M({[`${Z}-item`]:!0,[`${Z}-prev`]:!0,[`${Z}-item-disabled`]:s});return b.createElement("li",{role:"button","aria-disabled":!!s,"aria-label":"Previous",onClick:o=>!s&&this.foundation.goPrev(o),className:r,"x-semi-prop":"prevText"},e||b.createElement(bi,{size:"large"}))}renderNextBtn(){const{nextText:e,disabled:t}=this.props,{nextDisabled:n}=this.state,s=n||t,r=M({[`${Z}-item`]:!0,[`${Z}-item-disabled`]:s,[`${Z}-next`]:!0});return b.createElement("li",{role:"button","aria-disabled":!!s,"aria-label":"Next",onClick:o=>!s&&this.foundation.goNext(o),className:r,"x-semi-prop":"nextText"},e||b.createElement(js,{size:"large"}))}renderPageSizeSwitch(e){const{direction:t}=this.context,n=t==="rtl"?"bottomRight":"bottomLeft",{showSizeChanger:s,popoverPosition:r=n,disabled:o,popoverZIndex:l}=this.props,{pageSize:c}=this.state,d=M(`${Z}-switch`);if(!s)return null;const u=this.foundation.pageSizeInOpts(),h=e.pageSize,g=u.map(m=>b.createElement(Nd,{value:m,key:m},b.createElement("span",null,h.replace("${pageSize}",m.toString()))));return b.createElement("div",{className:d},b.createElement(Te,{"aria-label":"Page size selector",disabled:o,onChange:m=>this.foundation.changePageSize(m),value:c,key:c+h,position:r||"bottomRight",clickToHide:!0,zIndex:l,dropdownClassName:`${Z}-select-dropdown`},g))}renderQuickJump(e){const{showQuickJumper:t,disabled:n}=this.props,{quickJumpPage:s,total:r,pageSize:o}=this.state;if(!t)return null;const c=this.foundation._getTotalPageNumber(r,o)===1||n,d=M({[`${Z}-quickjump`]:!0,[`${Z}-quickjump-disabled`]:c});return b.createElement("div",{className:d},b.createElement("span",null,e.jumpTo),b.createElement(cl,{value:s,className:`${Z}-quickjump-input-number`,hideButtons:!0,disabled:c,onBlur:u=>this.foundation.handleQuickJumpBlur(),onEnterPress:u=>this.foundation.handleQuickJumpEnterPress(u.target.value),onChange:u=>this.foundation.handleQuickJumpNumberChange(u)}),b.createElement("span",null,e.page))}renderPageList(){const{pageList:e,currentPage:t,restLeftPageList:n,restRightPageList:s}=this.state,{popoverPosition:r,popoverZIndex:o,disabled:l}=this.props;return e.map((c,d)=>{const u=M(`${Z}-item`,{[`${Z}-item-active`]:t===c,[`${Z}-item-all-disabled`]:l,[`${Z}-item-all-disabled-active`]:t===c&&l}),h=b.createElement("li",{key:`${c}${d}`,onClick:()=>!l&&this.foundation.goPage(c,d),className:u,"aria-label":c==="..."?"More":`Page ${c}`,"aria-current":t===c?"page":!1},c);if(c==="..."&&!l){let g;return d<3?g=n:g=s,b.createElement(yt,{rePosKey:this.props.currentPage,trigger:"hover",content:this.renderRestPageList(g),key:`${c}${d}`,position:r,zIndex:o},h)}return h})}renderRestPageList(e){const{direction:t}=this.context,n=M(`${Z}-rest-item`),s=e.length,r=c=>{const{index:d,style:u}=c,h=e[d];return b.createElement("div",{role:"listitem",key:`${h}${d}`,className:n,onClick:()=>this.foundation.goPage(h,d),style:u,"aria-label":`${h}`},h)},o=32,l=s>=5?o*5:o*s;return b.createElement(Oi,{className:`${Z}-rest-list`,itemData:e,itemSize:o,width:78,itemCount:s,height:l,style:{direction:t}},r)}renderSmallPageSelect(e){const t=this.state.allPageNumbers,n=this.renderRestPageList(t);return b.createElement(yt,{content:n},e)}renderSmallPage(e){const t=this.props,{className:n,style:s,hideOnSinglePage:r,hoverShowPageSelect:o,showSizeChanger:l,disabled:c}=t,d=oo(t,["className","style","hideOnSinglePage","hoverShowPageSelect","showSizeChanger","disabled"]),u=M(`${Z}-small`,Z,n,{[`${Z}-disabled`]:c}),{currentPage:h,total:g,pageSize:m}=this.state,y=Math.ceil(g/m);if(y<2&&r&&!l)return null;const p=M({[`${Z}-item`]:!0,[`${Z}-item-small`]:!0,[`${Z}-item-all-disabled`]:c}),f=b.createElement("div",{className:p},h,"/",y," ");return b.createElement("div",Object.assign({className:u,style:s},this.getDataAttr(d)),this.renderPrevBtn(),o&&!c?this.renderSmallPageSelect(f):f,this.renderNextBtn(),this.renderQuickJump(e))}renderDefaultPage(e){const{total:t,pageSize:n}=this.state,s=this.props,{showTotal:r,className:o,style:l,hideOnSinglePage:c,showSizeChanger:d,disabled:u}=s,h=oo(s,["showTotal","className","style","hideOnSinglePage","showSizeChanger","disabled"]),g=M(o,`${Z}`,{[`${Z}-disabled`]:u}),m=`${Z}-total`;if(Math.ceil(t/n)<2&&c&&!d)return null;const p=Math.ceil(t/n),f=e.total.replace("${total}",p.toString());return b.createElement("ul",Object.assign({className:g,style:l},this.getDataAttr(h)),r?b.createElement("span",{className:m},f):null,this.renderPrevBtn(),this.renderPageList(),this.renderNextBtn(),this.renderPageSizeSwitch(e),this.renderQuickJump(e))}render(){const{size:e}=this.props;return b.createElement(Ee,{componentName:"Pagination"},t=>e==="small"?this.renderSmallPage(t):this.renderDefaultPage(t))}}sn.contextType=Ls;sn.propTypes={total:a.number,showTotal:a.bool,pageSize:a.number,pageSizeOpts:a.array,size:a.string,currentPage:a.number,defaultCurrentPage:a.number,onPageChange:a.func,onPageSizeChange:a.func,onChange:a.func,prevText:a.node,nextText:a.node,showSizeChanger:a.bool,popoverZIndex:a.number,popoverPosition:a.string,style:a.object,className:a.string,hideOnSinglePage:a.bool,hoverShowPageSelect:a.bool,showQuickJumper:a.bool,disabled:a.bool,preventPageChangeOnPageSizeChange:a.bool};sn.defaultProps={total:1,popoverZIndex:ci.DEFAULT_Z_INDEX,showTotal:!1,pageSize:null,pageSizeOpts:Vs.PAGE_SIZE_OPTION,defaultCurrentPage:1,size:"default",onPageChange:H,onPageSizeChange:H,onChange:H,showSizeChanger:!1,className:"",hideOnSinglePage:!1,showQuickJumper:!1,disabled:!1,preventPageChangeOnPageSizeChange:!1};var Gn,io;function kd(){if(io)return Gn;io=1;var i=Jo(),e=1/0;function t(n){var s=n==null?0:n.length;return s?i(n,e):[]}return Gn=t,Gn}var Ld=kd();const Md=te(Ld);var Yn,ao;function jd(){if(ao)return Yn;ao=1;var i=Ds();function e(t,n){var s;return i(t,function(r,o,l){return s=n(r,o,l),!s}),!!s}return Yn=e,Yn}var Xn,lo;function zd(){if(lo)return Xn;lo=1;var i=Ha(),e=nt(),t=jd(),n=_t(),s=Ns();function r(o,l,c){var d=n(o)?i:t;return c&&s(o,l,c)&&(l=void 0),d(o,e(l,3))}return Xn=r,Xn}var Fd=zd();const Nt=te(Fd);var Zn,co;function Kd(){if(co)return Zn;co=1;var i=Ds();function e(t,n){var s=[];return i(t,function(r,o,l){n(r,o,l)&&s.push(r)}),s}return Zn=e,Zn}var Qn,uo;function $d(){if(uo)return Qn;uo=1;var i=Wa(),e=Kd(),t=nt(),n=_t();function s(r,o){var l=n(r)?i:e;return l(r,t(o,3))}return Qn=s,Qn}var Bd=$d();const Je=te(Bd);var Jn,ho;function Hd(){if(ho)return Jn;ho=1;var i=As();function e(t,n,s){s=typeof s=="function"?s:void 0;var r=s?s(t,n):void 0;return r===void 0?i(t,n,void 0,s):!!r}return Jn=e,Jn}var Wd=Hd();const Ud=te(Wd),ce={PREFIX:`${X}-table`},B={SIZE_SMALL:"small",SIZE_MIDDLE:"middle",SIZES:["small","default","middle"],LAYOUTS:["","auto","fixed"],PAGINATION_POSITIONS:["bottom","top","both"],SORT_DIRECTIONS:["ascend","descend"],FIXED_SET:[!1,!0,"left","right"],ALIGNS:["left","right","center"],DEFAULT_KEY_COLUMN_SELECTION:"column-selection",DEFAULT_KEY_COLUMN_EXPAND:"column-expand",DEFAULT_KEY_COLUMN_TITLE:"column-title",DEFAULT_KEY_COLUMN_SORTER:"column-sorter",DEFAULT_KEY_COLUMN_FILTER:"column-filter",DEFAULT_KEY_COLUMN_SCROLLBAR:"column-scrollbar",DEFAULT_COMPONENTS:{body:{cell:"td"}},EXPAND_RELATED_PROPS:["expandedRowRender","dataSource","hideExpandedColumn","childrenRecordName","rowExpandable"]},st=1,Gs=0,$i=16,Bi=16,Hi=12,Wi=12,Ui=8,Vi=8,Ys=20,po=Ys+st+Gs+$i+Bi,Vd=$i+Bi+st,fo=Ys+st+Gs+Hi+Wi,qd=Hi+Wi+st,go=Ys+st+Gs+Vi+Ui,Gd=Ui+Vi+st,ne={DEFAULT_PAGE_SIZE:10,DEFAULT_WIDTH_COLUMN_EXPAND:60,DEFAULT_WIDTH_COLUMN_SELECTION:60,DEFAULT_INDENT_WIDTH:20,DEFAULT_CELL_PADDING_LEFT:16,DEFAULT_CELL_PADDING_RIGHT:16,DEFAULT_CELL_BORDER_WIDTH_LEFT:1,DEFAULT_CELL_BORDER_WIDTH_RIGHT:1,DEFAULT_VIRTUALIZED_SECTION_ROW_HEIGHT:po,DEFAULT_VIRTUALIZED_ROW_HEIGHT:po,DEFAULT_VIRTUALIZED_ROW_MIN_HEIGHT:Vd,DEFAULT_VIRTUALIZED_SECTION_ROW_MIDDLE_HEIGHT:fo,DEFAULT_VIRTUALIZED_ROW_MIDDLE_HEIGHT:fo,DEFAULT_VIRTUALIZED_ROW_MIDDLE_MIN_HEIGHT:qd,DEFAULT_VIRTUALIZED_SECTION_ROW_SMALL_HEIGHT:go,DEFAULT_VIRTUALIZED_ROW_SMALL_HEIGHT:go,DEFAULT_VIRTUALIZED_ROW_SMALL_MIN_HEIGHT:Gd};class qi{constructor(e){this._prefix=e}_isEmpty(e){return e==null||e===""}_baseLog(){let e=arguments.length>0&&arguments[0]!==void 0?arguments[0]:"log";if(typeof console[e]=="function"){for(var t=arguments.length,n=new Array(t>1?t-1:0),s=1;s{if(t=x(i,n),t!=null)return!1}),t}function et(){let i=arguments.length>0&&arguments[0]!==void 0?arguments[0]:[],e=arguments.length>1&&arguments[1]!==void 0?arguments[1]:0,t=arguments.length>2?arguments[2]:void 0;e=e<0||typeof e!="number"?0:e,t=t>i.length||typeof t!="number"?i.length:t;let n=0;return le(i,(s,r)=>{r>=e&&r2&&arguments[2]!==void 0?arguments[2]:["key"];const n=Je(i,r=>r.fixed===!0||r.fixed==="left"),s=Ze(n,r=>t.every(o=>r[o]!=null&&r[o]===e[o]));return n.length>0&&s===n.length-1}function xs(i,e){let t=arguments.length>2&&arguments[2]!==void 0?arguments[2]:["key"];const n=Je(i,r=>r.fixed==="right"),s=Ze(n,r=>t.every(o=>r[o]!=null&&r[o]===e[o]));return n.length>0&&s===0}function kt(i){return["left",!0].includes(x(i,"fixed"))}function Lt(i){return["right"].includes(x(i,"fixed"))}function Xd(i){return[B.DEFAULT_KEY_COLUMN_EXPAND,B.DEFAULT_KEY_COLUMN_SCROLLBAR,B.DEFAULT_KEY_COLUMN_SELECTION].includes(i)}function Gi(i){return x(i,"key")===B.DEFAULT_KEY_COLUMN_EXPAND}function Zd(i){return x(i,"key")===B.DEFAULT_KEY_COLUMN_SCROLLBAR}function Qd(i){return x(i,"key")===B.DEFAULT_KEY_COLUMN_SELECTION}function Xs(i){let e=arguments.length>1&&arguments[1]!==void 0?arguments[1]:[B.DEFAULT_KEY_COLUMN_SCROLLBAR];return Je(i,t=>!e.includes(t.key))}function De(i,e){return e===void 0&&(e="key"),typeof e=="function"?e(i):x(i,e)}function es(i,e){return e!=null&&Kt(i,e)}function Jd(i,e){return e!==null&&i.has(e)}function eu(i,e){return e!==null&&i.has(e)}function bo(i,e,t){return t===void 0&&(t="key"),We(i,n=>e!=null&&e!==""&&De(n,t)===e)}function tu(i,e){return e===void 0&&(e="children"),x(i,e)}function Yi(){let i=arguments.length>0&&arguments[0]!==void 0?arguments[0]:"",e=arguments.length>1?arguments[1]:void 0;return e===void 0&&(e="__expanded_row"),i+e}function nu(){let i=arguments.length>0&&arguments[0]!==void 0?arguments[0]:"",e=arguments.length>1&&arguments[1]!==void 0?arguments[1]:!1;const t={};return i==="small"?(t.height=e?ne.DEFAULT_VIRTUALIZED_SECTION_ROW_SMALL_HEIGHT:ne.DEFAULT_VIRTUALIZED_ROW_SMALL_HEIGHT,t.minHeight=ne.DEFAULT_VIRTUALIZED_ROW_SMALL_MIN_HEIGHT):i==="middle"?(t.height=e?ne.DEFAULT_VIRTUALIZED_SECTION_ROW_MIDDLE_HEIGHT:ne.DEFAULT_VIRTUALIZED_ROW_MIDDLE_HEIGHT,t.minHeight=ne.DEFAULT_VIRTUALIZED_ROW_MIDDLE_MIN_HEIGHT):(t.height=e?ne.DEFAULT_VIRTUALIZED_SECTION_ROW_HEIGHT:ne.DEFAULT_VIRTUALIZED_ROW_HEIGHT,t.minHeight=ne.DEFAULT_VIRTUALIZED_ROW_MIN_HEIGHT),t}function Ye(i){let e=arguments.length>1&&arguments[1]!==void 0?arguments[1]:"children";const t=[];if(Array.isArray(i)&&i.length)for(const n of i)Array.isArray(n[e])&&n[e].length?t.push(...Ye(n[e],e)):(ou(n),t.push(n));return t}function Wt(i){let e=arguments.length>1&&arguments[1]!==void 0?arguments[1]:"children",t=arguments.length>2&&arguments[2]!==void 0?arguments[2]:0;const n=[];return le(i,(s,r)=>{if(s.key==null){const o=s.dataIndex||r;s.key=`${t}-${o}`}Array.isArray(s[e])&&s[e].length&&n.push(...s[e])}),n.length&&Wt(n,e,t+1),i}function Xi(i){let e=arguments.length>1&&arguments[1]!==void 0?arguments[1]:0,t=arguments.length>2&&arguments[2]!==void 0?arguments[2]:"children",n=arguments.length>3&&arguments[3]!==void 0?arguments[3]:0;const s=[];return Array.isArray(i)&&i.length&&n<=e&&i.forEach(r=>{const o=r[t];Array.isArray(o)&&o.length&&n2&&arguments[2]!==void 0?arguments[2]:"children",n;return le(i,s=>{if(s&&s.key!=null&&!n&&s.key===e.key&&(n=s),s&&Array.isArray(s[t])&&!n&&(n=Mt(s[t],e,t)),n)return!1}),n}function su(i){const{expandedRowRender:e,dataSource:t,hideExpandedColumn:n,childrenRecordName:s,rowExpandable:r}=i,o=typeof e=="function";return n&&o||!o&&t.some(l=>{const c=x(l,s);return!!(Array.isArray(c)&&c.length||r(l))})}function Zi(i){let e=arguments.length>1&&arguments[1]!==void 0?arguments[1]:[],t;const n=e.findIndex(s=>i.dataIndex===s.dataIndex?(t=Object.assign(Object.assign({},s),i),!0):!1);return n>-1?e.splice(n,1,t):e.push(t),[...e]}function ru(i,e){const t=[...e];for(const n of i)if(!Xt(n.width)){const s=n.key,r=Ze(t,o=>o.key===s);r!==-1&&(t[r].width=x(n,"width"))}return t}function Qi(i){let{dataSource:e,getCheckboxProps:t,childrenRecordName:n,rowKey:s}=i;const r=[];if(Array.isArray(e)&&e.length&&typeof t=="function")for(const o of e){const l=t(o),c=typeof s=="function"?s(o):x(o,s);l&&l.disabled&&r.push(c);const d=x(o,n);if(Array.isArray(d)&&d.length){const u=Qi({dataSource:d,getCheckboxProps:t});r.push(...u)}}return r}function ou(i){if(typeof i=="object"&&i!==null){const{filters:e,sorter:t,dataIndex:n,onFilter:s}=i,r=new qi("[@douyinfe/semi-ui Table]");(Array.isArray(e)||ue(s)||ue(t))&&Xt(n)&&r.warn("The column with sorter or filter must pass the 'dataIndex' prop")}}function iu(i){let{dataSource:e,childrenRecordName:t="children"}=i,n=!1;if(Array.isArray(e))for(const s of e){const r=x(s,t);if(Array.isArray(r)&&r.length){n=!0;break}}return n}function Ji(i,e){if(e==="rtl")switch(i){case"left":return"right";case"right":return"left";default:return i}return i}function au(i,e){if(e==="rtl")switch(i){case"left":return"flex-end";case"right":return"flex-start";default:return i}else switch(i){case"left":return"flex-start";case"right":return"flex-end";default:return i}}function Zs(i){return i===!0||x(i,"showTitle",!0)}class lu{constructor(e){this._state=Object.assign({},e),this._listeners=[]}subscribe(e){return this._listeners.push(e),()=>{const n=this._listeners.indexOf(e);n>-1&&this._listeners.splice(n,1)}}setState(e){Object.assign(this._state,Object.assign({},e));for(const t of this._listeners)typeof t=="function"&&t(this._state)}getState(){return this._state}}var cu=Ua();const wt=te(cu);var ts,yo;function du(){if(yo)return ts;yo=1;function i(e,t,n,s){for(var r=n-1,o=e.length;++r-1;)p!==c&&o.call(p,f,1),o.call(c,f,1);return c}return ns=l,ns}var ss,wo;function hu(){if(wo)return ss;wo=1;var i=uu();function e(t,n){return t&&t.length&&n&&n.length?i(t,n):t}return ss=e,ss}var rs,vo;function pu(){if(vo)return rs;vo=1;var i=ei(),e=hu(),t=i(e);return rs=t,rs}var fu=pu();const gu=te(fu);function mu(i){return new Set(i)}function bu(i,e){if(i===e&&(e=mu(e)),Pe(i)&&i.size&&Pe(e)&&e.size){for(const t of e)i.has(t)&&i.delete(t);return i}return i}function Co(i,e){if(i!==null&&i.length&&e!==null&&e.length){const t=new Set(i),n=new Set(e),s=bu(t,n);return Array.from(s)}return i}function yu(i){let e=arguments.length>1&&arguments[1]!==void 0?arguments[1]:"ascend";switch(e){case"descend":return(t,n)=>{const s=Number(i(t,n,e));return s!==0?-s:s};case"ascend":default:return(t,n)=>i(t,n,e)}}class vt extends ge{static initColumnsFilteredValueAndSorterOrder(e){return e.forEach(t=>{vt.initFilteredValue(t),vt.initSorterOrder(t)}),e}static initFilteredValue(e){const{defaultFilteredValue:t,filteredValue:n}=e;ft(n)&&(Array.isArray(t)&&t.length?e.filteredValue=t:e.filteredValue=[])}static initSorterOrder(e){const{defaultSortOrder:t,sortOrder:n,sorter:s}=e;s&&ft(n)&&(ft(t)?e.sortOrder=!1:e.sortOrder=t)}constructor(e){super(Object.assign({},e)),this.setPage=(s,r)=>{s=s||this._adapter.getCurrentPage();const o=this.getState("pagination"),{dataSource:l,pagination:c,disabledRowKeys:d,allRowKeys:u}=this.getCurrentPageData(null,Object.assign(Object.assign({},o),{currentPage:s,pageSize:r}));!this._pagerIsControlled()&&s>0&&(this._adapter.setDisabledRowKeys(d),this._adapter.setAllRowKeys(u),this._adapter.setPagination(c),this._adapter.setDataSource(l)),this._notifyChange(c,void 0,void 0,{changeType:"pagination"})},this.setCachedFilteredSortedDataSource=s=>{this._adapter.setCachedFilteredSortedDataSource(s);const r=this.getAllRowKeys(s);this._adapter.setCachedFilteredSortedRowKeys(r)},this.handleMouseDown=s=>{var r,o;this.mouseDownTarget={targetName:(r=s.target)===null||r===void 0?void 0:r.tagName,className:(o=s.target)===null||o===void 0?void 0:o.className}},this.isSortOrderValid=s=>B.SORT_DIRECTIONS.includes(s)||s===!1;const t=this._adapter.getHandleColumns(),n=this._adapter.getMergePagination();this.mouseDownTarget=null,this.memoizedWithFnsColumns=Ke(t,re),this.memoizedFilterColumns=Ke(Xs),this.memoizedFlattenFnsColumns=Ke(Ye),this.memoizedPagination=Ke(n,re)}init(){const e=[...this.getProp("dataSource")],{queries:t}=this._adapter.getStates(),n=this.getFilteredSortedDataSource(e,t),s=this.getAllDisabledRowKeys(n),r=this.getCurrentPageData(n);this.setAdapterPageData(r),this.initExpandedRowKeys(r),this.initSelectedRowKeys(r),this.setCachedFilteredSortedDataSource(n),this.setAllDisabledRowKeys(s)}initExpandedRowKeys(){let{groups:e}=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{};const{defaultExpandAllRows:t,defaultExpandedRowKeys:n=[],expandedRowKeys:s=[],dataSource:r=[],expandAllRows:o,defaultExpandAllGroupRows:l,expandAllGroupRows:c}=this.getProps(),d=[];t||o?this._addNoDuplicatedItemsToArr(d,this.getAllRowKeys(r),e&&wt(e)&&e.size?Array.from(e.keys()):[]):l||c?this._addNoDuplicatedItemsToArr(d,s,e&&wt(e)&&e.size?Array.from(e.keys()):[]):Array.isArray(n)&&n.length?this._addNoDuplicatedItemsToArr(d,n):Array.isArray(s)&&s.length&&this._addNoDuplicatedItemsToArr(d,s),this._adapter.setExpandedRowKeys(d)}initSelectedRowKeys(e){let{disabledRowKeys:t}=e;const n=this.getProp("rowSelection"),s=[];if(n){const r=x(n,"selectedRowKeys"),o=x(n,"defaultSelectedRowKeys");Array.isArray(r)?this._addNoDuplicatedItemsToArr(s,r):Array.isArray(o)&&this._addNoDuplicatedItemsToArr(s,o),Array.isArray(t)&&t.length&&gu(s,...t),this._adapter.setSelectedRowKeys(s)}}getFilteredSortedDataSource(e,t){const n=this.filterDataSource(e,t.filter(r=>{const o=r.filteredValue?r.filteredValue:r.defaultFilteredValue;return ue(r.onFilter)&&Array.isArray(o)&&o.length}));return this.sortDataSource(n,t.filter(r=>r&&ue(r.sorter)))}getCurrentPageData(e,t,n){const s=this._adapter.getCachedFilteredSortedDataSource();e=e??[...s],t=t??(this.getState("pagination")&&Object.assign({},this.getState("pagination"))),n=n??[...this.getState("queries")];let r;if(this.getProp("groupBy")!=null){const{groups:d,dataSource:u}=this.groupDataSource(e);e=u,r=d}t=this.normalizePagination(t,e),e=this.limitPageDataSource(e,t);const o=this.getAllDisabledRowKeys(e),l=this.getAllRowKeys(e);return{dataSource:e,groups:r,pagination:t,disabledRowKeys:o,allRowKeys:l,queries:n}}groupDataSource(e,t){t=t??this.getProp("groupBy");const n=new Map,s=[];return t!=null&&le(e,(r,o)=>{const l=typeof t=="function"?t(r):x(r,t);if(l!=null&&l!==""){const c=this.getRecordKey(r);let d=n.get(l);Pe(d)?d.add(c):(d=new Set([c]),n.set(l,d))}}),n&&n.size?n.forEach((r,o)=>{Pe(r)&&r.forEach(l=>{s.push(this._getRecord(l))})}):s.push(...e),{groups:n,dataSource:s}}sortDataSource(e,t){return le(t,n=>{const{sorter:s,sortOrder:r,defaultSortOrder:o,sortChildrenRecord:l}=n,c=this.isSortOrderValid(r)?r:o;if(ue(s)&&c&&B.SORT_DIRECTIONS.includes(c)){if(l){const d=this.getProp("childrenRecordName");e=e&&e.map(u=>{const h=this._getRecordChildren(u);return Array.isArray(h)&&h.length?Object.assign(Object.assign({},u),{[d]:this.sortDataSource(h,[n])}):u})}return e.sort(yu(s,c)),!1}}),e}filterDataSource(e,t){let n=null,s=!1;const r=this.getProp("childrenRecordName");return le(t,o=>{const{onFilter:l,filteredValue:c,filterChildrenRecord:d,defaultFilteredValue:u}=o,h=Array.isArray(c)?c:u;typeof l=="function"&&Array.isArray(h)&&h.length&&(s=!0,n===null?n=new Map:(e=Array.from(n&&n.values()),n=new Map),le(e,g=>{le(h,m=>{const y=x(g,r),p=this.getRecordKey(g);let f;if(Array.isArray(y)&&y.length&&d&&(f=this.filterDataSource(y,[o])),Array.isArray(f)&&f.length){if(p!=null){const S=x(n.get(p),r,[]);n.set(p,Object.assign(Object.assign({},g),{[r]:f.reduce((v,w)=>(v.find(_=>this.getRecordKey(_)===this.getRecordKey(w))==null&&v.push(w),v),[...S])}))}}else l(m,g)&&n.set(p,g)})}))}),s&&(e=Array.from(n&&n.values())),e}limitPageDataSource(e,t){e=e??this.getProp("dataSource"),t=t??this.getState("pagination");let n=e;const s=x(t,"currentPage");if(this.getProp("pagination")!==!1&&s&&e&&t&&!this._pagerIsControlled()){const{pageSize:r=ne.DEFAULT_PAGE_SIZE}=t,o=(s-1)*r,l=s*r;n=gd(e,o,l)}return n}normalizePagination(e,t){e=e??this._getPagination(),t=t??this._getDataSource();const n=this.getProp("pagination");if(e&&(e=typeof e=="object"?Object.assign({},e):{},e=Zt({total:t&&t.length||0,pageSize:ne.DEFAULT_PAGE_SIZE,currentPage:x(n,"defaultCurrentPage",1),position:B.PAGINATION_POSITIONS[0]},e),!this._pagerIsControlled())){const s=x(n,"total",t.length),{currentPage:r,pageSize:o}=e,l=Math.ceil(s/o);e.total=s,r>l&&(e.currentPage=1)}return e}setAdapterPageData(){let e=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{};const{pagination:t,dataSource:n,disabledRowKeys:s,allRowKeys:r,groups:o}=e;this._adapter.setDisabledRowKeys(s),this._adapter.setAllRowKeys(r),this._adapter.setPagination(t),this._adapter.setGroups(o),this._adapter.setDataSource(n)}destroy(){}setAllDisabledRowKeys(e){this._adapter.setAllDisabledRowKeys(e)}handleClick(e){}handleMouseEnter(e){}handleMouseLeave(e){}stopPropagation(e){this._adapter.stopPropagation(e)}_addNoDuplicatedItemsToArr(){let e=arguments.length>0&&arguments[0]!==void 0?arguments[0]:[];for(var t=arguments.length,n=new Array(t>1?t-1:0),s=1;se!=null&&e!==""&&this.getRecordKey(t)===e)}_getRecordChildren(e){return x(e,this.getProp("childrenRecordName"))}_getPagination(){return this.getState("pagination")||{}}_getAllFilters(e){e=e||this.getState("queries");const t=[];return le(e,n=>{Array.isArray(n.filteredValue)&&(n.filteredValue.length||this._filterIsControlled(n.dataIndex))&&t.push(n)}),t}_getAllSorters(e){return e=e||this.getState("queries"),Je(e,t=>t.sorter&&t.sortOrder)}_filterQueries(e,t){let n=arguments.length>2&&arguments[2]!==void 0?arguments[2]:["dataIndex"];t=t??this.getState("queries");const s=[],r=[];return le(t,(o,l)=>{Nt(n,d=>d&&e[d]!=null&&e[d]===o[d])&&(s.push(o),r.push(l))}),{filteredQueries:s,filteredIndexes:r}}_mergeToQueries(e,t){let n=arguments.length>2&&arguments[2]!==void 0?arguments[2]:["dataIndex"];t=t??this.getState("queries"),t=[...t],e=Object.assign({},e);const{filteredQueries:s,filteredIndexes:r}=this._filterQueries(e,t,n);return le(s,(o,l)=>{t[r[l]]=Object.assign({},e)}),t}getRecordKey(e){if(!e)return;const t=this.getProp("rowKey");return typeof t=="function"?t(e):x(e,t)}isEmpty(e){return e=e??this.getProp("dataSource"),!(Array.isArray(e)&&e.length>0)}buildKeyEntities(e){e=e??this._getDataSource();const t=this.getProp("childrenRecordName"),n=this.getProp("rowKey"),s=l=>l.map(c=>{const d=typeof n=="function"?n(c):x(c,n),u=x(c,t),h=Object.assign({key:d},c);return Array.isArray(u)&&u.length&&(h.children=s(u)),h}),r=s(e),{keyEntities:o}=rc(r,{key:"key",children:"children"});return o}calcCheckedKeysForSelect(e,t,n,s){const r=this._adapter.getKeyEntities(),o=String(e);return!r||!r[o]?(t?n.add(o):n.delete(o),{checkedKeys:n,halfCheckedKeys:s}):t?Tr(o,r,n,s):Ir(o,r,n,s)}handleSelectRow(e,t,n){if(this.stopPropagation(n),typeof t=="boolean"&&e!=null){const s=this._adapter.getCheckRelation(),r=this._getSelectedRowKeys(),o=[...this._adapter.getHalfCheckedRowKeys()||[]];let l=-1;const c=this.getSelectedRows(null,[e])[0];let d;if(s==="related"){this._adapter.getKeyEntities();const u=new Set(r.map(f=>String(f))),h=new Set(o.map(f=>String(f))),{checkedKeys:g,halfCheckedKeys:m}=this.calcCheckedKeysForSelect(String(e),t,u,h),y=[...g],p=[...m];d=this.getSelectedRows(null,y),this._adapter.setHalfCheckedRowKeys(p),this._selectionIsControlled()||this._adapter.setSelectedRowKeys(y),this._adapter.notifySelect(c,t,d,n),this._adapter.notifySelectionChange(y,d)}else(l=r.indexOf(e))>-1&&t===!1?(r.splice(l,1),d=this.getSelectedRows(null,r),this._selectionIsControlled()||this._adapter.setSelectedRowKeys(r),this._adapter.notifySelect(c,t,d,n),this._adapter.notifySelectionChange(r,d)):r.indexOf(e)===-1&&t===!0&&(r.push(e),d=this.getSelectedRows(null,r),this._selectionIsControlled()||this._adapter.setSelectedRowKeys(r),this._adapter.notifySelect(c,t,d,n),this._adapter.notifySelectionChange(r,d))}}handleSelectAllRow(e,t){if(this.stopPropagation(t),typeof e=="boolean"){const n=this._adapter.getCheckRelation(),s=this._getSelectedRowKeys();let r=[...s];const o=this._getSelectedRowKeysSet();let l=[...this._adapter.getCachedFilteredSortedRowKeys()];const c=this._adapter.getAllDisabledRowKeys(),d=this._adapter.getAllDisabledRowKeysSet();let u;if(n==="related"){const h=this._adapter.getKeyEntities(),g=[...this._adapter.getHalfCheckedRowKeys()||[]];let m=new Set(r.map(v=>String(v))),y=new Set(g.map(v=>String(v)));if(e){const v=l.filter(w=>!d.has(w));for(const w of v){const _=String(w);if(!m.has(_)&&h&&h[_]){const O=Tr(_,h,m,y);m=O.checkedKeys,y=O.halfCheckedKeys}}u=v}else{const v=[...m];for(const w of v)if(h&&h[w]){const _=Ir(w,h,m,y);m=_.checkedKeys,y=_.halfCheckedKeys}u=[...s]}r=[...m];const p=[...y],f=this.getSelectedRows(null,u||[]),S=this.getSelectedRows(null,r||[]);this._adapter.setHalfCheckedRowKeys(p),this._selectionIsControlled()||this._adapter.setSelectedRowKeys(r),this._adapter.notifySelectAll(e,S,f,t),this._adapter.notifySelectionChange(r,S)}else{if(e){for(const m of l)!d.has(m)&&!o.has(m)&&r.push(m);l=Co(l,[...c,...s]),u=[...l]}else r=Co(r,l),u=[...s];const h=this.getSelectedRows(null,u||[]),g=this.getSelectedRows(null,r||[]);this._selectionIsControlled()||this._adapter.setSelectedRowKeys(r),this._adapter.notifySelectAll(e,g,h,t),this._adapter.notifySelectionChange(r,g)}}}getSelectedRows(e,t,n){e=e??this._getDataSource(),t=t??this._getSelectedRowKeys(),Pe(n)||(n=new Set(t));const s=this.getProp("childrenRecordName"),r=[];if(Pe(n)&&n.size&&Array.isArray(e)&&e.length&&(r.push(...e.filter(o=>n.has(this.getRecordKey(o)))),r.lengtht.has(n)).length)}handleRowExpanded(e,t,n){this.stopPropagation(n);const s=[...this.getState("expandedRowKeys")],r=s.indexOf(t),o=typeof t=="string"||typeof t=="number";o&&e&&r===-1?s.push(t):o&&!e&&r>-1&&s.splice(r,1),this._rowExpansionIsControlled()||this._adapter.setExpandedRowKeys(s);const l=this.getSelectedRows(null,s);let c=this.getSelectedRows(null,[t])[0];const d=this._getGroups();if(d){d.has(t)&&(c={groupKey:t});for(let u=0,h=s.length;ur!=null&&!t.has(r));if(s&&s.length){for(const r of s)if(r!=null&&!e.has(r))return!1;return!0}else return n.length&&n.every(o=>e.has(o))||!1}allIsNotSelected(e,t){for(const n of t)if(n!=null&&Array.isArray(e)&&e.includes(n))return!0;return!1}formatPaginationInfo(){let e=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{},t=arguments.length>1&&arguments[1]!==void 0?arguments[1]:"",n="";const s=x(this.getProp("pagination"),"formatPageText"),{total:r,pageSize:o,currentPage:l}=e,c=Math.min((l-1)*o+1,r),d=Math.min(l*o,r);return(s||s!==!1&&t&&r>0)&&(n=typeof s=="function"?s({currentStart:c,currentEnd:d,total:r}):t.replace("${currentStart}",c).replace("${currentEnd}",d).replace("${total}",r)),n}toggleShowFilter(e,t){let n=this.getQuery(e);const s=t;n=Object.assign(Object.assign({},n),{filterDropdownVisible:s}),this._filterShowIsControlled(),this._adapter.notifyFilterDropdownVisibleChange(s,e)}handleFilterSelect(e){let t=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{},n=this.getQuery(e),s=[...this._adapter.getState("queries")];const{filteredValue:r}=t;n=Object.assign(Object.assign({},n),{filteredValue:r}),s=Zi(n,s);const o=this._mergeToQueries(n,null),l=this._getAllFilters(o);this._filterIsControlled(e)||(this._adapter.setQueries(s),this.handleClickFilterOrSorter(s)),this._notifyChange(null,l,void 0,{changeType:"filter"})}handleSort(){let e=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{},t=arguments.length>2&&arguments[2]!==void 0?arguments[2]:!1;var n,s,r,o;if(t){if(this.mouseDownTarget&&((n=this.mouseDownTarget)===null||n===void 0?void 0:n.targetName)==="SPAN"&&(!((o=(r=(s=this.mouseDownTarget)===null||s===void 0?void 0:s.className)===null||r===void 0?void 0:r.includes)===null||o===void 0)&&o.call(r,"react-resizable-handle")))return;this.mouseDownTarget=null}const{dataIndex:l}=e;let c=this.getState("queries"),d=null;c=[...c],le(c,(u,h,g)=>{if(u.sorter){const m=Object.assign({},u),y=x(m,"sortOrder"),p=x(m,"defaultSortOrder",!1);let f=this.isSortOrderValid(y)?y:p;l&&l===m.dataIndex?f===B.SORT_DIRECTIONS[0]?f=B.SORT_DIRECTIONS[1]:f===B.SORT_DIRECTIONS[1]?f=!1:f=B.SORT_DIRECTIONS[0]:f=!1,g[h]=Object.assign(Object.assign({},m),{sortOrder:f}),l===m.dataIndex&&(d=g[h])}}),this._sorterIsControlled(l)||(this._adapter.setQueries(c),this.handleClickFilterOrSorter(c)),this._notifyChange(null,null,d,{changeType:"sorter"})}handleClickFilterOrSorter(e){const t=[...this.getProp("dataSource")],n=this.getFilteredSortedDataSource(t,e),s=this.getAllDisabledRowKeys(n);this.setCachedFilteredSortedDataSource(n),this.setAllDisabledRowKeys(s);const r=this.getCurrentPageData(n);this.setAdapterPageData(r)}getQuery(e,t){if(t=t||this.getState("queries"),e!=null)return We(t,n=>n.dataIndex===e)}getCellWidths(e,t,n){return this._adapter.getCellWidths(e,t,n)}setHeadWidths(e,t){return this._adapter.setHeadWidths(e,t)}getHeadWidths(e){return this._adapter.getHeadWidths(e)}mergedRowExpandable(e){return this._adapter.mergedRowExpandable(e)}setBodyHasScrollbar(e){this._adapter.setBodyHasScrollbar(e)}}const ea={align:a.oneOf(B.ALIGNS),className:a.string,colSpan:a.number,dataIndex:a.string,defaultSortOrder:a.oneOf(B.SORT_DIRECTIONS),filterChildrenRecord:a.bool,filterDropdownProps:a.object,filterDropdown:a.node,filterDropdownVisible:a.bool,filterIcon:a.func,filterMultiple:a.bool,filteredValue:a.arrayOf(a.any),filters:a.array,fixed:a.oneOf(B.FIXED_SET),onCell:a.func,onFilter:a.func,onFilterDropdownVisibleChange:a.func,onHeaderCell:a.func,onSorterChange:a.func,render:a.func,renderFilterDropdownItem:a.func,sortChildrenRecord:a.bool,sortDirections:a.arrayOf(a.string),sortOrder:a.oneOfType([a.bool,a.string]),sorter:a.oneOfType([a.bool,a.func]),title:a.oneOfType([a.func,a.node]),useFullRender:a.bool,width:a.oneOfType([a.number,a.string]),showSortTip:a.bool};class rn extends b.PureComponent{constructor(){let e=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{};super(e)}render(){return null}}rn.propTypes=Object.assign({},ea);rn.elementType="Column";function Ut(i){if(i){const e=[];return b.Children.forEach(i,t=>{if(b.isValidElement(t)&&(t.type===rn||x(t,"type.elementType")==="Column")){const n=ye(t.props,["children"]);Array.isArray(t.props.children)&&t.props.children.length&&(n.children=Ut(t.props.children)),e.push(Object.assign({key:t.key},n))}}),e}return[]}const ke=b.createContext({headWidths:[],setHeadWidths:H,handleRowExpanded:H}),Su=i=>{let{children:e,anyColumnFixed:t,flattenedColumns:n,tableWidth:s,headWidths:r,setHeadWidths:o,getHeadWidths:l,getCellWidths:c,handleRowExpanded:d,renderExpandIcon:u,renderSelection:h,getVirtualizedListRef:g,setBodyHasScrollbar:m,direction:y,handleRowSelection:p,headerStyle:f,rowSpanHover:S}=i;const v=L.useMemo(()=>({anyColumnFixed:t,flattenedColumns:n,renderExpandIcon:u,renderSelection:h,setHeadWidths:o,getHeadWidths:l,getCellWidths:c,headWidths:r,tableWidth:s,handleRowExpanded:d,getVirtualizedListRef:g,setBodyHasScrollbar:m,direction:y,handleRowSelection:p,headerStyle:f,rowSpanHover:S}),[t,n,u,h,o,l,c,r,s,d,g,m,y,p,f,S]);return b.createElement(ke.Provider,{value:v},e)};class wu extends ge{handleChange(e){const t=e.target.checked;this._adapter.notifyChange(t,e)}}class Vt extends he{get adapter(){var e=this;return Object.assign(Object.assign({},super.adapter),{notifyChange:function(){return e.props.onChange(...arguments)}})}constructor(e){super(e),this.handleChange=t=>this.foundation.handleChange(t),this.foundation=new wu(this.adapter)}render(){const{selected:e,getCheckboxProps:t,indeterminate:n,disabled:s,prefixCls:r,className:o}=this.props,l=this.props["aria-label"];let c={onChange:this.handleChange,disabled:s,indeterminate:n,checked:e};typeof t=="function"&&(c=Object.assign(Object.assign({},c),t()));const d=M(`${r}-selection-wrap`,{[`${r}-selection-disabled`]:s},o);return b.createElement("span",{className:d},b.createElement(xe,Object.assign({"aria-label":l},c)))}}Vt.propTypes={columnTitle:a.string,getCheckboxProps:a.func,type:a.string,onChange:a.func,selected:a.bool,disabled:a.bool,indeterminate:a.bool,prefixCls:a.string,className:a.string,"aria-label":a.string};Vt.defaultProps={disabled:!1,onChange:H,prefixCls:ce.PREFIX};class Qs extends L.PureComponent{render(){const{pagination:e,prefixCls:t,info:n,renderPagination:s}=this.props,r=x(e,"total"),o=s&&ue(s)?s(e):null;return b.createElement("div",{className:`${t}-pagination-outer`},L.isValidElement(o)?o:b.createElement(b.Fragment,null,b.createElement("span",{className:`${t}-pagination-info`},n),b.createElement("span",{className:`${t}-pagination-wrapper`},r>0?b.createElement(sn,Object.assign({},e,{key:x(e,"pageSize","pagination")})):null)))}}Qs.propTypes={style:a.object,prefixCls:a.string,pagination:a.object,info:a.oneOfType([a.string,a.node]),renderPagination:a.func};Qs.defaultProps={prefixCls:ce.PREFIX};var vu=function(i,e){var t={};for(var n in i)Object.prototype.hasOwnProperty.call(i,n)&&e.indexOf(n)<0&&(t[n]=i[n]);if(i!=null&&typeof Object.getOwnPropertySymbols=="function")for(var s=0,n=Object.getOwnPropertySymbols(i);s1&&arguments[1]!==void 0?arguments[1]:null,t=arguments.length>2&&arguments[2]!==void 0?arguments[2]:0,n=arguments.length>3?arguments[3]:void 0;const{filterMultiple:s=!0,filters:r=[],filteredValue:o=[],filterDropdownVisible:l,onSelect:c=H,onFilterDropdownVisibleChange:d=H,trigger:u="click",position:h="bottom",renderFilterDropdown:g,renderFilterDropdownItem:m,filterConfirmMode:y="immediate",tempFilteredValue:p,setTempFilteredValue:f,confirm:S,clear:v,close:w,reset:_}=i??{},O=y==="confirm"?p??[]:o,I=Ne(i,["tempFilteredValue","setTempFilteredValue","confirm","clear","close","filters"]),E=typeof g=="function"?g(I):b.createElement(Fe.Menu,null,Array.isArray(r)&&r.map((A,F)=>{const K=Q=>{const pe=Q&&Q.nativeEvent;if(pe&&(pe.stopImmediatePropagation(),pe.stopPropagation(),pe.preventDefault()),y==="confirm"){let de=[...p??[...o]];de.includes(A.value);const ie=de.indexOf(A.value);ie>-1?de.splice(ie,1):s?de.push(A.value):de=[A.value],f==null||f(de)}else{let oe=[...o];const de=oe.includes(A.value),ie=oe.indexOf(A.value);return ie>-1?oe.splice(ie,1):s?oe.push(A.value):oe=[A.value],c({value:A.value,filteredValue:oe,included:!de,domEvent:pe})}},z=O.includes(A.value),{text:q}=A,{value:V}=A,W=`${t}_${F}`,G=typeof m=="function"?m({onChange:K,filterMultiple:s,value:V,text:q,checked:z,filteredValue:O,level:t}):null;let se=G&&b.isValidElement(G)?b.cloneElement(G,{key:W}):b.createElement(Fe.Item,{key:W,onClick:K},s?b.createElement(xe,{checked:z},q):b.createElement(dl,{checked:z},q));if(Array.isArray(A.children)&&A.children.length){const Q=Object.assign(Object.assign({},i),{filters:A.children,trigger:"hover",position:"right"});delete Q.filterDropdownVisible,se=ta(Q,se,t+1,n)}return se}),y==="confirm"&&t===0&&b.createElement("div",{style:{padding:"8px 12px",borderTop:"1px solid var(--semi-color-border)",display:"flex",justifyContent:"flex-end"}},b.createElement(Qt,null,b.createElement(Ft,{size:"small",onClick:()=>_==null?void 0:_()},(n==null?void 0:n.resetFilter)||"Reset"),b.createElement(Ft,{size:"small",theme:"solid",onClick:()=>S==null?void 0:S({closeDropdown:!0})},(n==null?void 0:n.confirmFilter)||"OK")))),{filterDropdownVisible:k}=i,N=vu(i,["filterDropdownVisible"]),P=Object.assign(Object.assign({},N),{trigger:u,position:h,render:E,onVisibleChange:A=>d(A)});return l!=null&&(P.visible=l),b.createElement(Fe,Object.assign({},P,{key:`Dropdown_level_${t}`,className:`${ce.PREFIX}-column-filter-dropdown`}),e)}function Cu(){let i=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{};const{prefixCls:e=ce.PREFIX,filteredValue:t,filterIcon:n="filter",filterDropdownProps:s,onSelect:r,filterDropdownVisible:o,renderFilterDropdown:l,onFilterDropdownVisibleChange:c,filterConfirmMode:d="immediate"}=i;let{filterDropdown:u=null}=i;const h=typeof o<"u",m=!h&&(typeof l=="function"||d==="confirm"),[y,p]=L.useState(t),[f,S]=L.useState(t),v=m?!1:o,[w,_]=L.useState(v);L.useEffect(()=>{typeof o<"u"&&_(o)},[o]),L.useEffect(()=>{p(t)},[t]);const O=function(){let z=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{};const q=(z==null?void 0:z.filteredValue)||y;re(q,t)||r({filteredValue:q}),z.closeDropdown&&_(!1)},I=function(){let z=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{};p([]),r({filteredValue:[]}),z.closeDropdown&&_(!1)},E=()=>{_(!1)},k=()=>{p(f)},N=z=>{m&&_(z),z&&d==="confirm"&&(S(t),p(t)),c(z)},P={tempFilteredValue:y,setTempFilteredValue:p,confirm:O,clear:I,close:E,reset:k,filters:i.filters},A=M(`${e}-column-filter`,{on:Array.isArray(t)&&t.length});let F;typeof n=="function"?F=n(Array.isArray(t)&&t.length>0):L.isValidElement(n)?F=n:F=b.createElement("div",{className:A},"​",b.createElement(xl,{role:"button","aria-label":"Filter data with this column","aria-haspopup":"listbox",tabIndex:-1,size:"default"}));const K=Object.assign(Object.assign(Object.assign(Object.assign({},i),s),P),{filterDropdownVisible:h?o:w,onFilterDropdownVisibleChange:N});return b.createElement(Ee,{componentName:"Table"},z=>b.isValidElement(u)?u:ta(K,F,0,z))}var os,_o;function _u(){if(_o)return os;_o=1;var i=qa(),e=4;function t(n){return i(n,e)}return os=t,os}var Ou=_u();const Ru=te(Ou);let is,as;const Oo={position:"absolute",top:"-9999px",width:"50px",height:"50px"};function Eu(){let i=arguments.length>0&&arguments[0]!==void 0?arguments[0]:"vertical";if(typeof document>"u"||typeof window>"u")return 0;const e=i==="vertical";if(e&&is)return is;if(!e&&as)return as;const t=document.createElement("div");Object.keys(Oo).forEach(s=>{t.style[s]=Oo[s]}),e?t.style.overflowY="scroll":t.style.overflowX="scroll",document.body.appendChild(t);let n=0;return e?(n=t.offsetWidth-t.clientWidth,is=n):(n=t.offsetHeight-t.clientHeight,as=n),document.body.removeChild(t),n}function na(i){return typeof i=="number"?i-ne.DEFAULT_CELL_PADDING_LEFT-ne.DEFAULT_CELL_PADDING_RIGHT-ne.DEFAULT_CELL_BORDER_WIDTH_LEFT-ne.DEFAULT_CELL_BORDER_WIDTH_RIGHT-Eu("vertical"):void 0}function Ro(i,e){return Zt({},{table:"table",header:{outer:"table",wrapper:"thead",row:"tr",cell:"th"},body:e?{outer:"div",wrapper:"div",row:"div",cell:"div",colgroup:{wrapper:"div",col:"div"}}:{outer:"table",wrapper:"tbody",row:"tr",cell:"td",colgroup:{wrapper:"colgroup",col:"col"}},footer:{wrapper:"tfoot",row:"tr",cell:"td"}},i)}const bt=new qi("[@douyinfe/semi-ui Table]");function Ts(){let i=arguments.length>0&&arguments[0]!==void 0?arguments[0]:[],e=arguments.length>1&&arguments[1]!==void 0?arguments[1]:[],t=arguments.length>2&&arguments[2]!==void 0?arguments[2]:null,n=arguments.length>3&&arguments[3]!==void 0?arguments[3]:!0;const s=[],r=n?we:Ru;return Bt(e,o=>{o=Object.assign({},o);const l=mo(o,t),c=l!=null&&We(i,d=>mo(d,t)===l);c?s.push(r(Object.assign(Object.assign({},c),o))):s.push(r(o))}),s}function sa(i){switch(i){case B.SORT_DIRECTIONS[0]:return B.SORT_DIRECTIONS[1];case B.SORT_DIRECTIONS[1]:return"cancelSort";default:return B.SORT_DIRECTIONS[0]}}class Js extends L.PureComponent{render(){const{prefixCls:e,onClick:t,sortOrder:n,style:s,title:r,sortIcon:o,showTooltip:l}=this.props,c="default",d=M(`${e}-column-sorter-up`,{on:n===B.SORT_DIRECTIONS[0]}),u=M(`${e}-column-sorter-down`,{on:n===B.SORT_DIRECTIONS[1]}),h={"aria-label":`Current sort order is ${n?`${n}ing`:"none"}`,"aria-roledescription":"Sort data with this column"},g=()=>{if(typeof o=="function")return o({sortOrder:n});{const m=b.createElement("div",{style:s,className:`${e}-column-sorter`},b.createElement("span",{className:`${d}`},b.createElement(Sl,{size:c})),b.createElement("span",{className:`${u}`},b.createElement(bl,{size:c})));if(l){let y=sa(n);return b.createElement(Ee,{componentName:"Table"},(p,f)=>b.createElement(ui,{content:p[y]},m))}return m}};return b.createElement("div",Object.assign({role:"button"},h,{tabIndex:-1,className:`${e}-column-sorter-wrapper`,onClick:t,onKeyPress:m=>Yt(m)&&t(m)}),r,g())}}Js.propTypes={className:a.string,style:a.object,onClick:a.func,prefixCls:a.string,sortOrder:a.oneOfType([a.string,a.bool]),sortIcon:a.func,showTooltip:a.bool};Js.defaultProps={prefixCls:ce.PREFIX,onClick:H,sortOrder:!1,showTooltip:!1};function xu(i){const{expanded:e,componentType:t="expand",onClick:n=H,onMouseEnter:s=H,onMouseLeave:r=H,expandIcon:o,prefixCls:l=ce.PREFIX,motion:c=!0}=i;let d;b.isValidElement(o)?d=o:typeof o=="function"?d=o(e):t==="tree"?d=e&&!c?b.createElement(Al,{size:"small"}):b.createElement(Nl,{size:"small"}):d=e&&!c?b.createElement(Ms,null):b.createElement(js,null);const u=L.useCallback(h=>{typeof n=="function"&&n(!e,h)},[e]);if(c){const h=d;d=b.createElement(hi,{animationState:e?"enter":"leave",startClassName:`${ce.PREFIX}-expandedIcon-${e?"show":"hide"}`},g=>{let{animationClassName:m}=g;return b.cloneElement(h,{className:(h.props.className||"")+" "+m})})}return b.createElement("span",{role:"button","aria-label":"Expand this row",tabIndex:-1,onClick:u,onMouseEnter:s,onMouseLeave:r,className:`${l}-expand-icon`,onKeyPress:h=>Yt(h)&&u(h)},d)}class on extends b.PureComponent{render(){const{columns:e,className:t,style:n,prefixCls:s,components:r}=this.props,o=x(r,"colgroup.wrapper","colgroup"),l=x(r,"colgroup.col","col"),c=Ye(e).map((u,h)=>{const g={};return u.width&&(g.width=u.width,g.minWidth=g.width),b.createElement(l,{className:M(`${s}-col`,u.className),key:u.key||u.dataIndex||h,style:g})}),d=M(`${s}-colgroup`,t);return b.createElement(o,{className:d,style:n},c)}}on.propTypes={columns:a.array,prefixCls:a.string,className:a.string,style:a.object,components:a.object};on.defaultProps={columns:[],prefixCls:ce.PREFIX};var Tu=function(i,e){var t={};for(var n in i)Object.prototype.hasOwnProperty.call(i,n)&&e.indexOf(n)<0&&(t[n]=i[n]);if(i!=null&&typeof Object.getOwnPropertySymbols=="function")for(var s=0,n=Object.getOwnPropertySymbols(i);s{if(this.headerNode=t,t&&this.context.setHeadWidths){const{prefixCls:n,row:s,index:r}=this.props,o=`.${n}-row-head`,l=t&&t.querySelectorAll&&t.querySelectorAll(o);this.context.setHeadWidths(Bt(l,(c,d)=>{let u=x(s,[d,"column","width"]);const h=x(s,[d,"column","key"]);return typeof u!="number"&&(u=c&&c.getBoundingClientRect().width||0),{width:u,key:h}}),r)}},this.headerNode=null}componentDidUpdate(e){e.columns!==this.props.columns&&this.headerNode&&this.cacheRef(this.headerNode)}render(){const{components:e,row:t,prefixCls:n,onHeaderRow:s,index:r,style:o,columns:l}=this.props,{getCellWidths:c,direction:d,headerStyle:u}=this.context,h=d==="rtl",g=Xi(l,r),m=c(g),y=x(e,"header.row","tr"),p=x(e,"header.cell","th"),f=s(l,r)||{};Ae(f,"className",M(x(f,"className"),`${n}-row`));const S=Bt(t,(v,w)=>{const{column:_}=v,O=Tu(v,["column"]),I=typeof _.onHeaderCell=="function"?_.onHeaderCell(_,w,r):{};let E=Object.assign(Object.assign({},u),I.style);if(_.align){const V=Ji(_.align,d);E=Object.assign(Object.assign({},E),{textAlign:V}),I.className=M(I.className,_.className,{[`${n}-align-${V}`]:!!V})}let k,N,P,A;if(h?(k=Lt(_),N=kt(_),P=xs(g,_),A=Es(g,_)):(k=kt(_),N=Lt(_),P=Es(g,_),A=xs(g,_)),I.className=M(`${n}-row-head`,_.className,I.className,{[`${n}-cell-fixed-left`]:k,[`${n}-cell-fixed-left-last`]:P,[`${n}-cell-fixed-right`]:N,[`${n}-cell-fixed-right-first`]:A,[`${n}-row-head-ellipsis`]:_.ellipsis,[`${n}-row-head-clickSort`]:_.clickToSort}),m.length&&g.length){const V=Ze(g,W=>W&&W.key!=null&&W.key===_.key);if(V>-1){if(kt(_)){const W=h?"right":"left";E=Object.assign(Object.assign({},E),{position:"sticky",[W]:et(m,0,V)})}else if(Lt(_)){const W=h?"left":"right";E=Object.assign(Object.assign({},E),{position:"sticky",[W]:et(m,V+1)})}}}Object.assign(O,{resize:_.resize});const F=ye(Object.assign(Object.assign({},O),I),["colStart","colEnd","hasSubColumns","parents","level"]),{rowSpan:K,colSpan:z}=F;if(K===0||z===0)return null;if(typeof _.clickToSort=="function")if(F.onClick){const V=F.onClick;F.onClick=W=>{V(W),_.clickToSort(W)}}else F.onClick=_.clickToSort;if(typeof _.mouseDown=="function")if(F.onMouseDown){const V=F.onMouseDown;F.onMouseDown=W=>{V(W),_.mouseDown(W)}}else F.onMouseDown=_.mouseDown;const q=b.createElement(p,Object.assign({role:"columnheader","aria-colindex":w+1},F,{style:E,key:_.key||_.dataIndex||w}));if(typeof _.clickToSort=="function"&&_.showSortTip===!0){let V=sa(_.sortOrder);return b.createElement(Ee,{componentName:"Table",key:_.key||_.dataIndex||w},(W,G)=>b.createElement(ui,{content:W[V]},q))}return q});return b.createElement(y,Object.assign({role:"row","aria-rowindex":r+1},f,{style:o,ref:this.cacheRef}),S)}}an.contextType=ke;an.propTypes={components:a.object,row:a.array,prefixCls:a.string,onHeaderRow:a.func,index:a.oneOfType([a.string,a.number]),style:a.object,columns:a.array,fixed:a.oneOfType([a.bool,a.string]),selectedRowKeysSet:a.instanceOf(Set).isRequired};an.defaultProps={onHeaderRow:H,prefixCls:ce.PREFIX,columns:[],components:{header:{wrapper:"thead",row:"tr",cell:"th"}}};function Iu(i){const e=[];function t(s,r){let o=arguments.length>2&&arguments[2]!==void 0?arguments[2]:[],l=arguments.length>3&&arguments[3]!==void 0?arguments[3]:0,c=arguments.length>4&&arguments[4]!==void 0?arguments[4]:0;e[l]=e[l]||[];let d=r;return s.map(h=>{const g={key:h.key,className:h.className||"",children:ue(h.title)?h.title():h.title,column:h,colStart:d,level:c,parents:o};let m=1;const y=h.children;y&&y.length>0&&(m=t(y,d,[...o,g],l+1,c+1).reduce((S,v)=>S+v,0),g.hasSubColumns=!0),"colSpan"in h&&({colSpan:m}=h),"rowSpan"in h&&(g.rowSpan=h.rowSpan),h.key===B.DEFAULT_KEY_COLUMN_SCROLLBAR&&(g["x-type"]=B.DEFAULT_KEY_COLUMN_SCROLLBAR),g.colSpan=m,g.colEnd=g.colStart+m-1,e[l].push(g),d+=m;const p=h==null?void 0:h.ellipsis;return Zs(p)&&typeof g.children=="string"&&(g.title=g.children),m})}t(i,0);const n=e.length;for(let s=0;s{!("rowSpan"in r)&&!r.hasSubColumns&&(r.rowSpan=n-s)});return e}class er extends he{get adapter(){return Object.assign({},super.adapter)}render(){const{components:e,columns:t,prefixCls:n,fixed:s,onHeaderRow:r,forwardedRef:o,selectedRowKeysSet:l}=this.props,c=Iu(t),d=e.header.wrapper;return b.createElement(d,{className:`${n}-thead`,ref:o},c.map((u,h)=>b.createElement(an,{prefixCls:n,key:h,index:h,fixed:s,columns:t,row:u,components:e,onHeaderRow:r,selectedRowKeysSet:l})))}}er.propTypes={components:a.any,columns:a.array,columnManager:a.object,prefixCls:a.string,onHeaderRow:a.func,onDidUpdate:a.func,fixed:a.oneOfType([a.bool,a.string]),selectedRowKeysSet:a.instanceOf(Set).isRequired};er.defaultProps={columns:[],prefixCls:ce.PREFIX,onHeaderRow:H,onDidUpdate:H,components:{header:{wrapper:"thead",row:"tr",cell:"th"}}};const ra=b.forwardRef((i,e)=>b.createElement(er,Object.assign({},i,{forwardedRef:e})));class tr extends b.PureComponent{constructor(){let e=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{selectedRowKeysSet:new Set};super(e)}render(){const{scroll:e,prefixCls:t,fixed:n,forwardedRef:s,handleBodyScroll:r,columns:o,components:l,onDidUpdate:c,showHeader:d,tableLayout:u,bodyHasScrollBar:h,sticky:g}=this.props,m=x(l,"header.outer","table"),y=x(e,"x"),p={},f={};y&&!n&&(f.width=y),h&&(p.overflowY="scroll");const S=b.createElement(on,{columns:o,prefixCls:t}),v=b.createElement(ra,Object.assign({},this.props,{columns:o,components:l,onDidUpdate:c})),w=M(`${t}-header`,{[`${t}-header-sticky`]:g,[`${t}-header-hidden`]:!d}),_=x(g,"top",0);return typeof _=="number"&&(p.top=_),b.createElement("div",{key:"headTable",style:p,className:w,ref:s,onScroll:r},b.createElement(m,{style:f,className:M(t,{[`${t}-fixed`]:u==="fixed"})},S,v))}}tr.propTypes={tableLayout:a.string,bodyHasScrollBar:a.bool,columns:a.array,components:a.object,dataSource:a.array,fixed:a.oneOfType([a.bool,a.string]),handleBodyScroll:a.func,prefixCls:a.string,forwardedRef:a.oneOfType([a.object,a.func]),scroll:a.shape({x:a.oneOfType([a.number,a.string,a.bool]),y:a.oneOfType([a.number,a.string])}),selectedRowKeysSet:a.instanceOf(Set).isRequired,showHeader:a.bool,onDidUpdate:a.func,onHeaderRow:a.func};tr.defaultProps={handleBodyScroll:H};const Pu=b.forwardRef((i,e)=>b.createElement(tr,Object.assign({},i,{forwardedRef:e})));var ls,Eo;function Au(){if(Eo)return ls;Eo=1;var i=ji(),e=i("length");return ls=e,ls}var cs,xo;function nr(){if(xo)return cs;xo=1;var i="\\ud800-\\udfff",e="\\u0300-\\u036f",t="\\ufe20-\\ufe2f",n="\\u20d0-\\u20ff",s=e+t+n,r="\\ufe0e\\ufe0f",o="\\u200d",l=RegExp("["+o+i+s+r+"]");function c(d){return l.test(d)}return cs=c,cs}var ds,To;function Du(){if(To)return ds;To=1;var i="\\ud800-\\udfff",e="\\u0300-\\u036f",t="\\ufe20-\\ufe2f",n="\\u20d0-\\u20ff",s=e+t+n,r="\\ufe0e\\ufe0f",o="["+i+"]",l="["+s+"]",c="\\ud83c[\\udffb-\\udfff]",d="(?:"+l+"|"+c+")",u="[^"+i+"]",h="(?:\\ud83c[\\udde6-\\uddff]){2}",g="[\\ud800-\\udbff][\\udc00-\\udfff]",m="\\u200d",y=d+"?",p="["+r+"]?",f="(?:"+m+"(?:"+[u,h,g].join("|")+")"+p+y+")*",S=p+y+f,v="(?:"+[u+l+"?",l,h,g,o].join("|")+")",w=RegExp(c+"(?="+c+")|"+v+S,"g");function _(O){for(var I=w.lastIndex=0;w.test(O);)++I;return I}return ds=_,ds}var us,Io;function Nu(){if(Io)return us;Io=1;var i=Au(),e=nr(),t=Du();function n(s){return e(s)?t(s):i(s)}return us=n,us}var hs,Po;function ku(){if(Po)return hs;Po=1;var i=Ga(),e=Ya(),t=Gt(),n=Qo(),s=Nu(),r="[object Map]",o="[object Set]";function l(c){if(c==null)return 0;if(t(c))return n(c)?s(c):c.length;var d=e(c);return d==r||d==o?c.size:i(c).length}return hs=l,hs}var Lu=ku();const xt=te(Lu);var ps,Ao;function Mu(){if(Ao)return ps;Ao=1;var i=fi(),e=nt(),t=Jt(),n=Math.max,s=Math.min;function r(o,l,c){var d=o==null?0:o.length;if(!d)return-1;var u=d-1;return c!==void 0&&(u=t(c),u=c<0?n(d+u,0):s(u,d-1)),i(o,e(l,3),u,!0)}return ps=r,ps}var ju=Mu();const zu=te(ju);class Fu extends ge{init(){this.initVirtualizedData(),this.initExpandBtnShouldInRow()}destroy(){this.unobserveBodyResize()}initVirtualizedData(e){this._adapter.setVirtualizedData(this.flattenData(this.getProp("dataSource")),e)}initExpandBtnShouldInRow(e){const t=this.getProps(),n=su(t);this._adapter.setCachedExpandBtnShouldInRow(n),!Re(e)&&!e&&(e=B.EXPAND_RELATED_PROPS.map(r=>x(t,r,void 0))),this._adapter.setCachedExpandRelatedProps(e)}flattenData(){let e=arguments.length>0&&arguments[0]!==void 0?arguments[0]:[],t=arguments.length>1&&arguments[1]!==void 0?arguments[1]:0,n=arguments.length>2&&arguments[2]!==void 0?arguments[2]:[],s=arguments.length>3&&arguments[3]!==void 0?arguments[3]:[];const r=[],{rowKey:o,childrenRecordName:l,expandedRowRender:c,expandedRowKeys:d,groups:u}=this.getProps();return t===0&&wt(u)?u.forEach((h,g)=>{const m=e.findIndex(y=>h.has(De(y,o)));if(m>-1){const y=zu(e,f=>h.has(De(f,o))),p=Kt(d,g);r.push({key:g,level:t,sectionRow:!0,group:h,groupKey:g,expanded:p}),p&&r.push(...this.flattenData(e.slice(m,y+1),t+1,[...n],[...s]))}}):e.forEach((h,g)=>{const m=De(h,o),y=tu(h,l);t&&s.push(m);const p={key:m,record:h,level:t,parentKeys:[...n],childrenKeys:[...s]};r.push(p);const f=[];Kt(d,m)&&(Array.isArray(y)&&y.length?f.push(...this.flattenData(y,t+1,[...p.parentKeys],[...p.childrenKeys])):c&&f.push({key:Yi(m),level:t,expandedRow:!0,record:h}),r.push(...f))}),r}observeBodyResize(e){const{scroll:t}=this.getProps();if(x(t,"y"))return this._adapter.observeBodyResize(e)}unobserveBodyResize(){return this._adapter.unobserveBodyResize()}}var fs,Do;function Ku(){if(Do)return fs;Do=1;function i(){return!0}return fs=i,fs}var $u=Ku();const Bu=te($u);function Hu(i,e){if(i===e)return!0;if(!i||!e)return!1;const t=Object.keys(i),n=Object.keys(e),s=t.length;if(n.length!==s)return!1;for(let r=0;rthis.ref=t,this.handleClick=t=>{this.foundation.handleClick(t);const n=this.adapter.getCache("customCellProps");n&&typeof n.onClick=="function"&&n.onClick(t)},this.ref=L.createRef(),this.foundation=new Uu(this.adapter)}shouldComponentUpdate(e){const t=this.props,{column:n,expandIcon:s}=t,r=Qd(n),{shouldCellUpdate:o}=n;if(typeof o=="function")return o(e,t);const l=Gi(n)||s;if((r||l)&&!re(e,this.props))return!0;{const c=["selected","expanded","expandIcon","disabled"],d=ye(t,c),u=ye(e,c);if(!re(u,d))return!0}return!1}componentDidUpdate(){this.props.onDidUpdate(this.ref)}getTdProps(){const{record:e,index:t,column:n={},fixedLeft:s,fixedRight:r,width:o,height:l}=this.props;let c={},d={};const{direction:u}=this.context,h=u==="rtl";if(s||typeof s=="number"?Ae(c,h?"style.right":"style.left",typeof s=="number"?s:0):(r||typeof r=="number")&&Ae(c,h?"style.left":"style.right",typeof r=="number"?r:0),o!=null&&Ae(c,"style.width",o),l!=null&&Ae(c,"style.height",l),n.onCell){d=n.onCell(e,t),this.adapter.setCache("customCellProps",Object.assign({},d)),c=Object.assign(Object.assign({},c),ye(d,["style","className","onClick"]));const y=x(d,"style")||{};c.style=Object.assign(Object.assign({},c.style),y)}if(n.align){const y=Ji(n.align,u),p=au(n.align,u);c.style=Object.assign(Object.assign({},c.style),{textAlign:y,justifyContent:p})}return{tdProps:c,customCellProps:d}}renderText(e){const{record:t,indentSize:n,prefixCls:s,indent:r,index:o,expandIcon:l,renderExpandIcon:c,column:d={},hovered:u}=this.props,{dataIndex:h,render:g,useFullRender:m}=d;let y,p,f;typeof h=="number"?y=x(t,h):!h||h.length===0?y=t:y=x(t,h);const S=r&&n?b.createElement("span",{style:{paddingLeft:`${n*r}px`},className:`${s}-row-indent indent-level-${r}`}):null,v=typeof c=="function"?c(t):l;if(g){const w={expandIcon:v,isHovering:u};if(m){const{renderSelection:_}=this.context,O=typeof _=="function"?_(t):null;Object.assign(w,{selection:O,indentText:S})}y=g(y,t,o,w),No(y)&&(e=y.props?Zt(e,y.props):e,p=e.colSpan,f=e.rowSpan,y=y.children)}return{text:y,indentText:S,rowSpan:f,colSpan:p,realExpandIcon:v,tdProps:e}}renderInner(e,t,n){const{prefixCls:s,isSection:r,expandIcon:o,column:l={}}=this.props,{tableWidth:c,anyColumnFixed:d}=this.context,{useFullRender:u}=l;let h=null;return u?h=e:h=[b.createElement(L.Fragment,{key:"indentText"},t),b.createElement(L.Fragment,{key:"expandIcon"},o?n:null),b.createElement(L.Fragment,{key:"text"},e)],r&&(h=b.createElement("div",{className:M(`${s}-section-inner`),style:{width:d?na(c):void 0}},h)),h}render(){const{prefixCls:e,column:t={},component:n,fixedLeft:s,fixedRight:r,lastFixedLeft:o,firstFixedRight:l,colIndex:c}=this.props,{direction:d}=this.context,u=d==="rtl",{className:h,ellipsis:g}=t,m=s||typeof s=="number",y=r||typeof r=="number",{tdProps:p,customCellProps:f}=this.getTdProps(),S=this.renderText(p);let{text:v}=S;const{indentText:w,rowSpan:_,colSpan:O,realExpandIcon:I,tdProps:E}=S;let k;if(Zs(g)&&typeof v=="string"&&(k=v),_===0||O===0)return null;No(v)&&(v=null);const P=this.renderInner(v,w,I);let A,F,K,z;u?(A=y,F=l,K=m,z=o):(A=m,F=o,K=y,z=l);const q=M(h,`${e}-row-cell`,x(f,"className"),{[`${e}-cell-fixed-left`]:A,[`${e}-cell-fixed-left-last`]:F,[`${e}-cell-fixed-right`]:K,[`${e}-cell-fixed-right-first`]:z,[`${e}-row-cell-ellipsis`]:g});return b.createElement(n,Object.assign({role:"gridcell","aria-colindex":c+1,className:q,onClick:this.handleClick,title:k},E,{ref:this.setRef}),P)}}Ct.contextType=ke;Ct.defaultProps={indent:0,indentSize:ne.DEFAULT_INDENT_WIDTH,onClick:H,prefixCls:ce.PREFIX,component:"td",onDidUpdate:H,column:{}};Ct.propTypes={record:a.object,prefixCls:a.string,index:a.number,fixedLeft:a.oneOfType([a.bool,a.number]),lastFixedLeft:a.bool,fixedRight:a.oneOfType([a.bool,a.number]),firstFixedRight:a.bool,indent:a.number,indentSize:a.number,column:a.object,expandIcon:a.any,renderExpandIcon:a.func,hideExpandedColumn:a.bool,component:a.any,onClick:a.func,onDidUpdate:a.func,isSection:a.bool,width:a.oneOfType([a.string,a.number]),height:a.oneOfType([a.string,a.number]),selected:a.bool,expanded:a.bool,colIndex:a.number,hovered:a.bool};var ko=function(i,e){var t={};for(var n in i)Object.prototype.hasOwnProperty.call(i,n)&&e.indexOf(n)<0&&(t[n]=i[n]);if(i!=null&&typeof Object.getOwnPropertySymbols=="function")for(var s=0,n=Object.getOwnPropertySymbols(i);s{const{renderExpandIcon:n}=this.props;return n(t,!0)},this.handleMouseEnter=t=>{this.foundation.handleMouseEnter(t);const n=this.adapter.getCache("customRowProps");typeof(n==null?void 0:n.onMouseEnter)=="function"&&n.onMouseEnter(t)},this.handleMouseLeave=t=>{this.foundation.handleMouseLeave(t);const n=this.adapter.getCache("customRowProps");typeof(n==null?void 0:n.onMouseLeave)=="function"&&n.onMouseLeave(t)},this.handleClick=t=>{this.foundation.handleClick(t);const n=this.adapter.getCache("customRowProps");n&&typeof n.onClick=="function"&&n.onClick(t);const{handleRowSelection:s}=this.context,{rowKey:r,selected:o,disabled:l,record:c}=this.props;typeof s=="function"&&!l&&s(r,!o,t)},this.foundation=new Wu(this.adapter)}componentDidMount(){const{onRow:e,index:t,record:n,disabled:s,selected:r}=this.props;if(typeof this.adapter.getCache("customRowProps")>"u"){const l=e(n,t,{disabled:s,selected:r})||{},{className:c,style:d}=l,u=ko(l,["className","style"]);this.adapter.setCache("customRowProps",Object.assign({},u))}}shouldComponentUpdate(e){const t=["cellWidths"];return!Hu(ye(e,t),ye(this.props,t))||!re(Ne(e,t),Ne(this.props,t))}renderCells(){const{columns:e,record:t,index:n,prefixCls:s,fixed:r,components:o,expandableRow:l,level:c,expandIcon:d,rowExpandable:u,isSection:h,expandedRow:g,virtualized:m,indentSize:y,hideExpandedColumn:p,cellWidths:f,selected:S,expanded:v,disabled:w,onDidUpdate:_,hovered:O}=this.props,I=x(o,"body.cell",B.DEFAULT_COMPONENTS.body.cell),E=[],k=u(t);let N=0;return le(e,(P,A)=>{const F=x(P,"key"),K={};if(r!=="right"&&(Xd(F)&&N++,l&&A===N&&(K.renderExpandIcon=this.renderExpandIcon,(p||h)&&(K.expandIcon=d??!0)),c!=null&&A===N&&(K.indent=c,!l&&p&&(d!==!1||!(typeof d=="boolean")&&d!==null)&&(K.indent=c+1))),Gi(P)&&!k)E.push(b.createElement(Ct,{key:A,colIndex:A,isSection:h}));else if(!Zd(P)){const z={};I!==B.DEFAULT_COMPONENTS.body.cell&&m&&!g&&(z.width=x(f,A)),E.push(b.createElement(Ct,Object.assign({colIndex:A},K,z,{hideExpandedColumn:p,indentSize:y,isSection:h,prefixCls:`${s}`,column:P,key:A,index:n,record:t,component:I,fixedLeft:kt(P)&&et(f,0,A),lastFixedLeft:Es(e,P),fixedRight:Lt(P)&&et(f,A+1),firstFixedRight:xs(e,P),selected:S,expanded:v,disabled:w,onDidUpdate:_,hovered:O})))}}),E}render(){const{style:e}=this.props,{components:t,prefixCls:n,selected:s,disabled:r,onRow:o,index:l,className:c,replaceClassName:d,record:u,hovered:h,expanded:g,displayNone:m,expandableRow:y,level:p,expandedRow:f,isSection:S,rowKey:v}=this.props,w=t.body.row,_=o(u,l,{disabled:r,selected:s})||{},{className:O,style:I}=_,E=ko(_,["className","style"]);this.adapter.setCache("customRowProps",Object.assign({},E));const k=Object.assign(Object.assign({},e),I),N=typeof d=="string"&&d.length?M(d,O):M(c,`${n}-row`,{[`${n}-row-selected`]:s,[`${n}-row-expanded`]:g,[`${n}-row-hovered`]:h,[`${n}-row-hidden`]:m},O),P={};return typeof l=="number"&&(P["aria-rowindex"]=l+1),y&&(P["aria-expanded"]=g),(g||f)&&(P["aria-level"]=2),typeof p=="number"&&(P["aria-level"]=p+1),S&&(P["aria-level"]=1),b.createElement(w,Object.assign({role:"row"},P,E,{style:k,className:N,"data-row-key":v,onMouseEnter:this.handleMouseEnter,onMouseLeave:this.handleMouseLeave,onClick:this.handleClick}),this.renderCells())}}rt.propTypes=oa;rt.contextType=ke;rt.defaultProps={columns:[],rowExpandable:Bu,components:{body:{row:"tr",cell:"td"}},prefixCls:ce.PREFIX,onRow:H,onRowClick:H,onRowDoubleClick:H,onRowMouseEnter:H,onRowMouseLeave:H,onHover:H,onDidUpdate:H,visible:!0,hovered:!1,selected:!1,disabled:!1};var Vu=function(i,e){var t={};for(var n in i)Object.prototype.hasOwnProperty.call(i,n)&&e.indexOf(n)<0&&(t[n]=i[n]);if(i!=null&&typeof Object.getOwnPropertySymbols=="function")for(var s=0,n=Object.getOwnPropertySymbols(i);s({props:O,children:b.createElement("div",{className:M(`${n}-expand-inner`),style:{width:S?na(f):void 0}},_)})},I)],k=M(s,`${n}-row-expand`),N=v(E);return b.createElement(rt,{style:h,components:u,className:k,expandedRow:!0,renderExpandIcon:l,rowKey:`${e.key}-expanded-row`,columns:E,store:d,virtualized:g,indentSize:m,cellWidths:N,displayNone:p})}}ln.contextType=ke;ln.propTypes={cellWidths:a.array.isRequired,className:a.string,columns:a.array,components:a.object,defaultExpandAllRows:a.bool,defaultExpandedRowKeys:a.array,expandIcon:a.oneOfType([a.object,a.node,a.func]),expandRowByClick:a.bool,expanded:a.bool,expandedRowKeys:a.array,expandedRowRender:a.func,indentSize:a.number,index:a.oneOfType([a.string,a.number]),onExpand:a.func,onExpandedRowsChange:a.func,prefixCls:a.string,record:a.object,renderExpandIcon:a.func,store:a.object,style:a.object,virtualized:a.oneOfType([a.bool,a.object])};ln.defaultProps={record:{},prefixCls:ce.PREFIX};var qu=function(i,e){var t={};for(var n in i)Object.prototype.hasOwnProperty.call(i,n)&&e.indexOf(n)<0&&(t[n]=i[n]);if(i!=null&&typeof Object.getOwnPropertySymbols=="function")for(var s=0,n=Object.getOwnPropertySymbols(i);s{typeof s=="function"&&n&&s(!o,r,c),typeof l.onClick=="function"&&l.onClick(c)}})},this.collectGroupedData=()=>{const{data:t,group:n,rowKey:s}=this.props;return Array.isArray(t)&&t.length&&Pe(n)?t.filter(r=>{const o=typeof s=="function"?s(r):x(r,s);return o!=null&&o!==""&&n.has(o)}):[]},this.renderExpandIcon=t=>{const{renderExpandIcon:n,groupKey:s}=this.props;return typeof n=="function"?n(t,!1,s):null}}isInnerColumnKey(e){return e!=null?[B.DEFAULT_KEY_COLUMN_EXPAND,B.DEFAULT_KEY_COLUMN_SELECTION].includes(e):!1}render(){const{record:e,columns:t=[],prefixCls:n,className:s,expanded:r,renderGroupSection:o,components:l,index:c,store:d,group:u,groupKey:h,virtualized:g,style:m}=this.props,y={};let p={},f=null;const S=typeof o=="function"?o(h,[...u]):null;if(L.isValidElement(S))f=S;else if(S&&Object.prototype.toString.call(S)==="[object Object]"){const I=S,{children:E}=I,k=qu(I,["children"]);f=E,p=Object.assign({},k)}y.colSpan=Xs(t).length;const v=[Object.assign({render:()=>({props:y,children:f})},p)],w=M(s,`${n}-row-section`,{on:r}),{getCellWidths:_}=this.context,O=_(v,null,!0);return b.createElement(rt,{components:l,virtualized:g,index:c,onRow:this.onRow,expanded:r,expandIcon:!0,isSection:!0,record:e,replaceClassName:w,expandableRow:!0,renderExpandIcon:this.renderExpandIcon,rowKey:h,columns:v,store:d,style:m,cellWidths:O})}}cn.contextType=ke;cn.propTypes=ia;cn.defaultProps={prefixCls:ce.PREFIX,components:{body:{row:"tr",cell:"td"}}};var Lo=function(i,e){var t={};for(var n in i)Object.prototype.hasOwnProperty.call(i,n)&&e.indexOf(n)<0&&(t[n]=i[n]);if(i!=null&&typeof Object.getOwnPropertySymbols=="function")for(var s=0,n=Object.getOwnPropertySymbols(i);s{const{store:c}=this.props,{rowSpanHover:d}=this.context;if(c){const u=o?l:null;x(c.getState(),"hoveredRowKey")!==u&&c.setState({hoveredRowKey:u})}if(d){const u=String(l);if(o){const h=this.getHoveredRowKeysFromDOM(u);this.updateRowHoverClass(h)}else this.updateRowHoverClass([])}},this.updateRowHoverClass=o=>{var l;const c=this.ref.current;if(!c){this.hoveredRowKeySet.clear();return}const d=((l=c.closest)===null||l===void 0?void 0:l.call(c,`.${this.props.prefixCls}-wrapper`))||c,u=new Set(o);for(const h of this.hoveredRowKeySet)u.has(h)||d.querySelectorAll(`tr[data-row-key="${this.cssEscape(h)}"]`).forEach(m=>m.classList.remove(`${this.props.prefixCls}-row-hovered`));for(const h of u)this.hoveredRowKeySet.has(h)||d.querySelectorAll(`tr[data-row-key="${this.cssEscape(h)}"]`).forEach(m=>m.classList.add(`${this.props.prefixCls}-row-hovered`));this.hoveredRowKeySet=u},this.getHoveredRowKeysFromDOM=o=>{var l;const c=new Set;c.add(o);const d=this.ref.current,u=(l=d==null?void 0:d.querySelector(".semi-table-tbody"))!==null&&l!==void 0?l:d;if(!u)return Array.from(c);const h=u.querySelector(`tr[data-row-key="${this.cssEscape(o)}"]`);if(!h)return Array.from(c);const g=Array.from(u.querySelectorAll("tr[data-row-key]")),m=g.indexOf(h);return m===-1||g.forEach((y,p)=>{y.querySelectorAll("td[rowspan]").forEach(S=>{const v=parseInt(S.getAttribute("rowspan")||"1",10);if(v>1){const w=p+v-1;if(m>=p&&m<=w)for(let _=p;_<=w&&_{const l=globalThis.CSS;return l&&typeof l.escape=="function"?l.escape(o):o.replace(/\\/g,"\\\\").replace(/"/g,'\\"')},this.forwardRef=o=>{const{forwardedRef:l}=this.props;this.ref.current=o,this.foundation.observeBodyResize(o),typeof l=="function"?l(o):l&&typeof l=="object"&&(l.current=o)},this.setListRef=o=>{this.listRef.current=o;const{getVirtualizedListRef:l}=this.context;l&&(this.props.virtualized?l(this.listRef):console.warn("getVirtualizedListRef only works with virtualized. See https://semi.design/en-US/show/table for more information."))},this.itemSize=o=>{const{virtualized:l,size:c}=this.props,{virtualizedData:d}=this.state,u=x(d,o),h=nu(c,u.sectionRow),g=x(l,"itemSize",h.height);let m=g;return typeof g=="function"&&(m=g(o,{expandedRow:x(u,"expandedRow",!1),sectionRow:x(u,"sectionRow",!1)})),mx(l,[o,"key"],o),this.handleRowClick=(o,l,c)=>{const{handleRowExpanded:d}=this.context;d(!c,o,l)},this.handleVirtualizedScroll=function(){let o=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{};const l=x(n.props.virtualized,"onScroll");typeof l=="function"&&l(o)},this.handleVirtualizedBodyScroll=o=>{const{handleBodyScroll:l}=this.props,c=x(o,"nativeEvent.target.scrollLeft"),d=x(o,"nativeEvent.target.scrollTop");d===this.state.cache.virtualizedScrollTop&&this.handleVirtualizedScroll({horizontalScrolling:!0}),this.state.cache.virtualizedScrollLeft=c,this.state.cache.virtualizedScrollTop=d,typeof l=="function"&&l(o)},this.getVirtualizedRowWidth=()=>{const{getCellWidths:o}=this.context,{columns:l}=this.props,c=o(l);return et(c,0,xt(l))},this.renderVirtualizedRow=o=>{const{index:l,style:c}=o,{virtualizedData:d,cachedExpandBtnShouldInRow:u}=this.state,{flattenedColumns:h}=this.context,g=x(d,[l],{}),{key:m,parentKeys:y,expandedRow:p,sectionRow:f}=g,S=Lo(g,["key","parentKeys","expandedRow","sectionRow"]),v=this.getVirtualizedRowWidth(),w=u,_=Object.assign(Object.assign(Object.assign(Object.assign({},this.props),{style:Object.assign(Object.assign({},c),{width:v})}),S),{columns:h,index:l,expandBtnShouldInRow:w});return f?this.renderSectionRow(_):p?this.renderExpandedRow(_):this.renderBaseRow(_)},this.renderTbody=b.forwardRef(function(){let o=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{},l=arguments.length>1?arguments[1]:void 0;return b.createElement("div",Object.assign({},o,{onScroll:function(){o.onScroll&&o.onScroll(...arguments)},className:M(o.className,`${n.props.prefixCls}-tbody`),style:Object.assign({},o.style),ref:l}))}),this.renderOuter=b.forwardRef((o,l)=>{const{children:c}=o,d=Lo(o,["children"]),{handleWheel:u,prefixCls:h,emptySlot:g,dataSource:m}=this.props,y=this.getVirtualizedRowWidth(),p=M(`${h}`,`${h}-fixed`);return b.createElement("div",Object.assign({},d,{ref:l,onWheel:function(){u&&u(...arguments),d.onWheel&&d.onWheel(...arguments)},onScroll:function(){n.handleVirtualizedBodyScroll(...arguments),d.onScroll&&d.onScroll(...arguments)}}),b.createElement("div",{style:{width:y},className:p},c),xt(m)===0&&g)}),this.onItemsRendered=o=>{this.state.cache.virtualizedScrollLeft&&this.ref.current&&(this.ref.current.scrollLeft=this.state.cache.virtualizedScrollLeft)},this.renderVirtualizedBody=o=>{const{scroll:l,prefixCls:c,virtualized:d,columns:u}=this.props,{virtualizedData:h}=this.state,{getCellWidths:g}=this.context,m=g(u);if(!xt(m))return null;const y=x(l,"y"),p=typeof y=="number",f=p?y:600;p||bt.warn('You have to specific "scroll.y" which must be a number for table virtualization!');const S={width:"100%",height:h!=null&&h.length?f:null,overflowX:"auto",overflowY:"auto"},v=M(`${c}-body`);return b.createElement(wc,Object.assign({},typeof d=="object"?d:{},{initialScrollOffset:this.state.cache.virtualizedScrollTop,onScroll:this.handleVirtualizedScroll,onItemsRendered:this.onItemsRendered,ref:this.setListRef,className:v,outerRef:this.forwardRef,height:h!=null&&h.length?f:0,width:S.width,itemData:h,itemSize:this.itemSize,itemCount:h.length,itemKey:this.itemKey,innerElementType:this.renderTbody,outerElementType:this.renderOuter,style:Object.assign(Object.assign({},S),{direction:o}),direction:o}),this.renderVirtualizedRow)},this.renderSectionRow=function(){let o=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{groupKey:void 0};const{dataSource:l,rowKey:c,group:d,groupKey:u,index:h}=o,g=Object.keys(ia),m=Ne(o,g),{handleRowExpanded:y}=n.context;return b.createElement(cn,Object.assign({},m,{record:{groupKey:u,records:[...d].map(p=>bo(l,p,c))},index:h,onExpand:y,data:l,key:u||h}))},this.renderExpandedRow=function(){let o=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{renderExpandIcon:()=>null};const{style:l,components:c,renderExpandIcon:d,expandedRowRender:u,record:h,columns:g,expanded:m,index:y,rowKey:p,virtualized:f,displayNone:S}=o;let v=De(h,p);v==null&&(v=y);const{flattenedColumns:w,getCellWidths:_}=n.context;return w!==n.flattenedColumns&&(n.flattenedColumns=w,n.cellWidths=_(w)),b.createElement(ln,{style:l,components:c,renderExpandIcon:d,expandedRowRender:u,record:h,columns:g,expanded:m,index:y,virtualized:f,key:Yi(v),cellWidths:n.cellWidths,displayNone:S})},this.renderGroupedRows=()=>{const{groups:o,dataSource:l,rowKey:c,expandedRowKeys:d,keepDOM:u}=this.props,{flattenedColumns:h}=this.context,g=new Map,m=[];o!=null&&Array.isArray(l)&&l.length&&l.forEach(p=>{const f=De(p,c);o.forEach((S,v)=>{if(S.has(f))return g.has(v)||g.set(v,new Set([])),g.get(v).add(f),!1})});let y=-1;return g.forEach((p,f)=>{const S=es(d,f);if(m.push(this.renderSectionRow(Object.assign(Object.assign({},this.props),{columns:h,index:++y,group:p,groupKey:f,expanded:S}))),S||u){const v=[];p.forEach(w=>{const _=bo(l,w,c);_!=null&&v.push(_)}),m.push(this.renderBodyRows(v,void 0,[],!S))}}),m},this.renderBody=o=>{const{scroll:l,prefixCls:c,columns:d,components:u,fixed:h,handleWheel:g,headerRef:m,handleBodyScroll:y,anyColumnFixed:p,showHeader:f,emptySlot:S,includeHeader:v,dataSource:w,onScroll:_,groups:O,expandedRowRender:I,tableLayout:E}=this.props,k=x(l,"x"),N=x(l,"y"),P={},A={},F=x(u,"body.outer","table"),K=x(u,"body.wrapper")||"tbody";N&&(P.maxHeight=N),k&&(A.width=k),p&&xt(w)&&(P.overflow="auto",P.WebkitTransform="translate3d (0, 0, 0)");const z=b.createElement(on,{components:x(u,"body"),columns:d,prefixCls:c}),q=`${c}-body`,V=b.createElement("div",{key:"bodyTable",className:q,style:P,ref:this.forwardRef,onMouseLeave:()=>{this.context.rowSpanHover&&this.updateRowHoverClass([])},onWheel:g,onScroll:y},b.createElement(F,{role:wt(O)||ue(I)||iu({dataSource:w})?"treegrid":"grid","aria-rowcount":w&&w.length,"aria-colcount":d&&d.length,style:A,className:M(c,{[`${c}-fixed`]:E==="fixed"})},z,v&&f?b.createElement(ra,Object.assign({},this.props,{ref:m,components:u,columns:d})):null,b.createElement(K,{className:`${c}-tbody`,onScroll:_},wt(O)?this.renderGroupedRows():this.renderBodyRows(w))),S);return h&&d.length?b.createElement("div",{key:"bodyTable",className:`${c}-body-outer`},V):V},this.ref=b.createRef(),this.state={virtualizedData:[],cache:{virtualizedScrollTop:null,virtualizedScrollLeft:null},cachedExpandBtnShouldInRow:null,cachedExpandRelatedProps:[],hoveredRowKey:null},this.listRef=b.createRef();const{flattenedColumns:s,getCellWidths:r}=t;this.foundation=new Fu(this.adapter),this.flattenedColumns=s,this.cellWidths=r(s),this.observer=null,this.hoveredRowKeySet=new Set}componentDidMount(){const{store:e}=this.props;e&&(this.unsubscribe=e.subscribe(t=>{const{hoveredRowKey:n}=t;n!==this.state.hoveredRowKey&&this.setState({hoveredRowKey:n})}))}componentWillUnmount(){this.unsubscribe&&(this.unsubscribe(),this.unsubscribe=null)}get adapter(){return Object.assign(Object.assign({},super.adapter),{setVirtualizedData:(e,t)=>this.setState({virtualizedData:e},t),setCachedExpandBtnShouldInRow:e=>this.setState({cachedExpandBtnShouldInRow:e}),setCachedExpandRelatedProps:e=>this.setState({cachedExpandRelatedProps:e}),observeBodyResize:e=>{const{setBodyHasScrollbar:t}=this.context,n=()=>{const s=()=>{const{offsetWidth:o,clientWidth:l}=e,c=l{const e=this.ref.current;this.observer&&(this.observer.unobserve(e),this.observer=null)}})}componentDidUpdate(e,t){const{virtualized:n,dataSource:s,expandedRowKeys:r,columns:o,scroll:l}=this.props;n&&(e.dataSource!==s||e.expandedRowKeys!==r||e.columns!==o)&&this.foundation.initVirtualizedData();const d=B.EXPAND_RELATED_PROPS.map(g=>x(this.props,g,void 0));re(d,t.cachedExpandRelatedProps)||this.foundation.initExpandBtnShouldInRow(d);const u=x(l,"y"),h=this.ref.current;u&&u!==x(e,"scroll.y")&&this.foundation.observeBodyResize(h)}renderBaseRow(){let e=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{};const{rowKey:t,columns:n,expandedRowKeys:s,rowExpandable:r,record:o,index:l,level:c,expandBtnShouldInRow:d,selectedRowKeysSet:u,disabledRowKeysSet:h,expandRowByClick:g}=e,m=Object.keys(oa),y=Ne(e,m);let p=De(o,t);p==null&&(p=l);const f=es(s,p),S=r&&r(o),v={level:void 0,expanded:f};(S||d)&&(v.level=c,v.expandableRow=S,g&&(v.onRowClick=this.handleRowClick));const w={selected:Jd(u,p),disabled:eu(h,p)},{getCellWidths:_}=this.context,O=_(n,null,!0),{hoveredRowKey:I}=this.state,E=I===p;return b.createElement(rt,Object.assign({},y,v,w,{key:p,rowKey:p,cellWidths:O,hovered:E,onHover:this.onRowHover}))}renderBodyRows(){let e=arguments.length>0&&arguments[0]!==void 0?arguments[0]:[],t=arguments.length>1&&arguments[1]!==void 0?arguments[1]:0,n=arguments.length>2&&arguments[2]!==void 0?arguments[2]:[],s=arguments.length>3&&arguments[3]!==void 0?arguments[3]:!1;const{rowKey:r,expandedRowRender:o,expandedRowKeys:l,childrenRecordName:c,rowExpandable:d,keepDOM:u}=this.props,h=typeof o=="function",g=this.state.cachedExpandBtnShouldInRow,{flattenedColumns:m}=this.context;return le(e,(y,p)=>{let f=De(y,r);f==null&&(f=p);const S=x(y,c),v=!!(Array.isArray(S)&&S.length);n.push(this.renderBaseRow(Object.assign(Object.assign({},this.props),{columns:m,expandBtnShouldInRow:g,displayNone:s,record:y,key:f,level:t,index:p})));const w=es(l,f),_=w||u;if(h&&d&&d(y)&&_){const O=this.renderExpandedRow(Object.assign(Object.assign({},this.props),{columns:m,level:t,index:p,record:y,expanded:w,displayNone:s||!w}));Ps(O)||n.push(O)}if(v&&_){const O=this.renderBodyRows(S,t+1,[],s||!w);n.push(...O)}}),n}render(){const{virtualized:e}=this.props,{direction:t}=this.context;return e?this.renderVirtualizedBody(t):this.renderBody(t)}}sr.contextType=ke;sr.propTypes={anyColumnFixed:a.bool,childrenRecordName:a.string,columns:a.array,components:a.object,dataSource:a.array,disabledRowKeysSet:a.instanceOf(Set).isRequired,emptySlot:a.node,expandRowByClick:a.bool,expandedRowKeys:a.array,expandedRowRender:a.func,fixed:a.oneOfType([a.string,a.bool]),forwardedRef:a.oneOfType([a.object,a.func]),groups:a.instanceOf(Map),handleBodyScroll:a.func,handleWheel:a.func,headerRef:a.oneOfType([a.object,a.func]),includeHeader:a.bool,onScroll:a.func,prefixCls:a.string,renderExpandIcon:a.func,rowExpandable:a.func,rowKey:a.oneOfType([a.string,a.bool,a.func]),scroll:a.object,selectedRowKeysSet:a.instanceOf(Set).isRequired,showHeader:a.bool,size:a.string,store:a.object,virtualized:a.oneOfType([a.bool,a.object])};const Gu=b.forwardRef(function(e,t){return b.createElement(sr,Object.assign({},e,{forwardedRef:t}))});var Yu=function(i,e){var t={};for(var n in i)Object.prototype.hasOwnProperty.call(i,n)&&e.indexOf(n)<0&&(t[n]=i[n]);if(i!=null&&typeof Object.getOwnPropertySymbols=="function")for(var s=0,n=Object.getOwnPropertySymbols(i);s{const{scroll:t={}}=this.props;!!x(t,"y")?this.bodyWrapRef.current&&(this.bodyWrapRef.current.scrollTop=0):this.wrapRef.current&&this.wrapRef.current.scrollIntoView({behavior:"smooth",block:"start"})},setSelectedRowKeys:t=>{this.setState({rowSelection:Object.assign(Object.assign({},this.state.rowSelection),{selectedRowKeys:[...t],selectedRowKeysSet:new Set(t)})})},setDisabledRowKeys:t=>{this.setState({disabledRowKeys:t,disabledRowKeysSet:new Set(t)})},setCurrentPage:t=>{const{pagination:n}=this.state;typeof n=="object"?this.setState({pagination:Object.assign(Object.assign({},n),{currentPage:t})}):this.setState({pagination:{currentPage:t}})},setPagination:t=>this.setState({pagination:t}),setGroups:t=>this.setState({groups:t}),setDataSource:t=>this.setState({dataSource:t}),setExpandedRowKeys:t=>this.setState({expandedRowKeys:[...t]}),setQuery:function(){let t=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{},n=[...e.state.queries];n=Zi(t,n),e.setState({queries:n})},setQueries:t=>this.setState({queries:t}),setFlattenData:t=>this.setState({flattenData:t}),setAllRowKeys:t=>this.setState({allRowKeys:t}),setHoveredRowKey:t=>{this.store.setState({hoveredRowKey:t})},setHoveredRowKeys:t=>{this.store.setState({hoveredRowKeys:t})},setCachedFilteredSortedDataSource:t=>{this.cachedFilteredSortedDataSource=t},setCachedFilteredSortedRowKeys:t=>{this.cachedFilteredSortedRowKeys=t,this.cachedFilteredSortedRowKeysSet=new Set(t)},setAllDisabledRowKeys:t=>{const n=new Set(t);this.setState({allDisabledRowKeys:t,allDisabledRowKeysSet:n})},getCurrentPage:()=>x(this.state,"pagination.currentPage",1),getCurrentPageSize:()=>x(this.state,"pagination.pageSize",ne.DEFAULT_PAGE_SIZE),getCachedFilteredSortedDataSource:()=>this.cachedFilteredSortedDataSource,getCachedFilteredSortedRowKeys:()=>this.cachedFilteredSortedRowKeys,getCachedFilteredSortedRowKeysSet:()=>this.cachedFilteredSortedRowKeysSet,getAllDisabledRowKeys:()=>this.state.allDisabledRowKeys,getAllDisabledRowKeysSet:()=>this.state.allDisabledRowKeysSet,getHalfCheckedRowKeys:()=>this.state.halfCheckedRowKeys||[],getHalfCheckedRowKeysSet:()=>this.state.halfCheckedRowKeysSet||new Set,setHalfCheckedRowKeys:t=>{this.setState({halfCheckedRowKeys:t,halfCheckedRowKeysSet:new Set(t)})},getKeyEntities:()=>this.state.keyEntities||{},setKeyEntities:t=>{this.setState({keyEntities:t})},getCheckRelation:()=>{const{rowSelection:t}=this.state;return t&&typeof t=="object"?x(t,"checkRelation","unRelated"):"unRelated"},notifyFilterDropdownVisibleChange:(t,n)=>this._invokeColumnFn(n,"onFilterDropdownVisibleChange",t),notifyChange:function(){return e.props.onChange(...arguments)},notifyExpand:function(){return e.props.onExpand(...arguments)},notifyExpandedRowsChange:function(){return e.props.onExpandedRowsChange(...arguments)},notifySelect:function(){for(var t=arguments.length,n=new Array(t),s=0;sNt(this.getColumns(t||this.props.columns,this.props.children),n=>!!n.fixed),useFixedHeader:()=>{const{scroll:t,sticky:n}=this.props;return!!(x(t,"y")||n)},getTableLayout:()=>{let t=!1;const{flattenColumns:n}=this.state;return Array.isArray(n)&&(t=n.some(s=>!!s.ellipsis||!!s.fixed)),this.adapter.useFixedHeader()&&(t=!0),t?"fixed":"auto"},setHeadWidths:function(t){let n=arguments.length>1&&arguments[1]!==void 0?arguments[1]:0;Yd(e.state.headWidths[n],t)||e.setState(s=>{const r=[...s.headWidths];return r[n]=[...t],{headWidths:r}})},getHeadWidths:function(){let t=arguments.length>0&&arguments[0]!==void 0?arguments[0]:0;return e.state.headWidths.length&&typeof t=="number"?(e.state.headWidths[t]||[]).map(s=>s.width):[]},getCellWidths:function(t){let n=arguments.length>1&&arguments[1]!==void 0?arguments[1]:null,s=arguments.length>2&&arguments[2]!==void 0?arguments[2]:!1;return Array.isArray(t)&&t.length&&(n=n==null&&e.state.headWidths.length?Md(e.state.headWidths):[],Array.isArray(n)&&n.length)?t.reduce((r,o)=>{const l=o.key===B.DEFAULT_KEY_COLUMN_SCROLLBAR&&s?null:We(n,c=>c&&c.key!=null&&c.key===o.key);return l&&r.push(l.width),r},[]):[]},mergedRowExpandable:t=>{const{expandedRowRender:n,childrenRecordName:s,rowExpandable:r}=this.props,o=x(t,s),l=typeof n=="function",c=typeof r=="function",d=Array.isArray(o)&&o.length,u=c&&r(t);return(l||d)&&(!c||u)||!(l||d)&&u},isAnyColumnUseFullRender:t=>Nt(t,n=>!!n.useFullRender),getNormalizeColumns:()=>this.normalizeColumns,getHandleColumns:()=>this.handleColumns,getMergePagination:()=>this.mergePagination,setBodyHasScrollbar:t=>{t!==this.state.bodyHasScrollBar&&this.setState({bodyHasScrollBar:t})},stopPropagation(t){t&&typeof t=="object"&&(typeof t.stopPropagation=="function"&&t.stopPropagation(),t.nativeEvent&&typeof t.nativeEvent.stopPropagation=="function"?t.nativeEvent.stopPropagation():typeof t.stopImmediatePropagation=="function"&&t.stopImmediatePropagation())}})}constructor(e,t){var n;super(e),n=this,this._warnIfNoKey=()=>{(this.props.rowSelection||this.props.expandedRowRender)&&Nt(this.props.dataSource,u=>this.foundation.getRecordKey(u)==null)&&bt.error('You must specify a key for each element in the dataSource or use "rowKey" to specify an attribute name as the primary key!')},this._invokeRowSelection=function(u){const h=x(n.state,["rowSelection",u]);if(typeof h=="function"){for(var g=arguments.length,m=new Array(g>1?g-1:0),y=1;y2?g-2:0),y=2;y{this.headerWrapRef.current=u},this.getCurrentPageData=()=>{const u=this.foundation.getCurrentPageData(),h=["dataSource","groups"].reduce((g,m)=>(u[m]&&(g[m]=u[m]),g),{});return we(h)},this.getColumns=(u,h)=>!Array.isArray(u)||!u||!u.length?Ut(h):u,this.getCellWidths=function(){return n.foundation.getCellWidths(...arguments)},this.setHeadWidths=function(){return n.foundation.setHeadWidths(...arguments)},this.getHeadWidths=function(){return n.foundation.getHeadWidths(...arguments)},this.mergedRowExpandable=function(){return n.foundation.mergedRowExpandable(...arguments)},this.setBodyHasScrollbar=function(){return n.foundation.setBodyHasScrollbar(...arguments)},this.handleWheel=u=>{const{scroll:h={}}=this.props;if(window.navigator.userAgent.match(/Trident\/7\./)&&h.y){u.preventDefault();const g=u.deltaY,{target:m}=u,y=this.bodyWrapRef.current;let p=0;this.lastScrollTop?p=this.lastScrollTop+g:p=g,y&&m!==y&&(y.scrollTop=p)}},this.handleBodyScrollLeft=u=>{if(u.currentTarget!==u.target)return;const{target:h}=u,g=this.headerWrapRef.current,m=this.bodyWrapRef.current;h.scrollLeft!==this.lastScrollLeft&&(h===m&&g?g.scrollLeft=h.scrollLeft:h===g&&m&&(m.scrollLeft=h.scrollLeft),this.setScrollPositionClassName()),this.lastScrollLeft=h.scrollLeft},this.handleWindowResize=()=>{this.syncTableWidth(),this.setScrollPositionClassName()},this.handleBodyScrollTop=u=>{const{target:h}=u;if(u.currentTarget!==h)return;const{scroll:g={}}=this.props,m=this.headerWrapRef.current,y=this.bodyWrapRef.current;if(h.scrollTop!==this.lastScrollTop&&g.y&&h!==m){const{scrollTop:p}=h;y&&h!==y&&(y.scrollTop=p)}this.lastScrollTop=h.scrollTop},this.handleBodyScroll=u=>{this.handleBodyScrollLeft(u),this.handleBodyScrollTop(u)},this.setScrollPosition=u=>{const{prefixCls:h}=this.props,g=[`${h}-scroll-position-both`,`${h}-scroll-position-middle`,`${h}-scroll-position-left`,`${h}-scroll-position-right`];this.position=u,this.scrollPosition=u;const m=this.wrapRef.current;if(m&&m.nodeType)if(u==="both"){const y=[`${h}-scroll-position-left`,`${h}-scroll-position-right`];m.classList.remove(...vr(g,y)),m.classList.add(...y)}else{const y=[`${h}-scroll-position-${u}`];m.classList.remove(...vr(g,y)),m.classList.add(...y)}},this.setScrollPositionClassName=()=>{const u=this.bodyWrapRef.current;if(u&&u.children&&u.children.length){const h=u.scrollLeft===0,g=Math.abs(u.scrollLeft)+1>=u.children[0].getBoundingClientRect().width-u.getBoundingClientRect().width;h&&g?this.setScrollPosition("both"):h?this.setScrollPosition("left"):g?this.setScrollPosition("right"):this.scrollPosition!=="middle"&&this.setScrollPosition("middle")}},this.syncTableWidth=()=>{var u;const h=(u=this.rootWrapRef)===null||u===void 0?void 0:u.current;if(!h)return;const g=h.getBoundingClientRect().width,m=this.state.tableWidth;typeof m=="number"&&Math.abs(m-g)<.5||this.setState({tableWidth:g})},this.observeTableWrapperResize=()=>{const u=this.rootWrapRef.current;if(!u)return;this.resizeObserver&&(this.resizeObserver.disconnect(),this.resizeObserver=null);const h=x(window,"ResizeObserver");h&&(this.resizeObserver=new h(g=>{const m=()=>{this.syncTableWidth(),this.setScrollPositionClassName()};typeof window.requestAnimationFrame=="function"?window.requestAnimationFrame(m):window.setTimeout(m,0)}),this.resizeObserver.observe(u))},this.needSyncTableWidth=()=>this.adapter.isAnyColumnFixed()||this.props.showHeader&&this.adapter.useFixedHeader(),this.bindWindowResize=()=>{this.hasBindWindowResize||this.debouncedWindowResize&&(window.addEventListener("resize",this.debouncedWindowResize),this.hasBindWindowResize=!0)},this.unbindWindowResize=()=>{this.hasBindWindowResize&&(this.debouncedWindowResize&&window.removeEventListener("resize",this.debouncedWindowResize),this.hasBindWindowResize=!1)},this.syncResizeListeners=()=>{if(this.needSyncTableWidth()){const h=this.hasBindWindowResize;this.bindWindowResize(),this.resizeObserver||this.observeTableWrapperResize(),h||this.handleWindowResize()}else this.unbindWindowResize(),this.resizeObserver&&(this.resizeObserver.disconnect(),this.resizeObserver=null)},this.renderSelection=function(){let u=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{},h=arguments.length>1&&arguments[1]!==void 0?arguments[1]:!1,g=arguments.length>2?arguments[2]:void 0;const{rowSelection:m,allDisabledRowKeysSet:y,halfCheckedRowKeysSet:p,keyEntities:f}=n.state;if(m&&typeof m=="object"){const{selectedRowKeys:S=[],selectedRowKeysSet:v=new Set,getCheckboxProps:w,disabled:_,renderCell:O,checkRelation:I="unRelated"}=m,E=n.cachedFilteredSortedRowKeys,k=n.cachedFilteredSortedRowKeysSet,N=n.foundation.allIsSelected(v,y,E),A=n.foundation.hasRowSelected(S,k)&&!N;if(h){const F=x(m,"key",B.DEFAULT_KEY_COLUMN_SELECTION),K=b.createElement(Vt,{"aria-label":`${N?"Deselect":"Select"} all rows`,disabled:_,key:F,selected:N,indeterminate:A,onChange:(q,V)=>{n.toggleSelectAllRow(q,V)}}),z=(q,V)=>n.toggleSelectAllRow(q,V);return ue(O)?O({selected:N,record:u,originNode:K,inHeader:h,disabled:_,indeterminate:A,selectAll:z}):K}else{const F=n.foundation.getRecordKey(u),K=v.has(F),z=I==="related"&&p&&p.has(F),q=()=>typeof w=="function"?w(u):{},V=b.createElement(Vt,{"aria-label":`${K?"Deselect":"Select"} this row`,getCheckboxProps:q,selected:K,indeterminate:z,onChange:(G,se)=>n.toggleSelectRow(G,F,se)}),W=(G,se)=>n.toggleSelectRow(G,F,se);return ue(O)?O({selected:K,record:u,index:g,originNode:V,inHeader:!1,disabled:_,indeterminate:z,selectRow:W}):V}}return null},this.renderRowSelectionCallback=function(u){let h=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{},g=arguments.length>2?arguments[2]:void 0;return n.renderSelection(h,!1,g)},this.renderTitleSelectionCallback=()=>this.renderSelection(void 0,!0),this.normalizeSelectionColumn=function(){let u=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{};const{rowSelection:h,prefixCls:g}=u;let m={};if(h){const y=["selectedRowKeys","selectedRowKeysSet"];m={key:B.DEFAULT_KEY_COLUMN_SELECTION},Re(h)&&(m=Object.assign(Object.assign({},m),ye(h,y))),m.className=M(m.className,`${g}-column-selection`),m.title=n.renderTitleSelectionCallback,m.render=n.renderRowSelectionCallback}return m},this.normalizeScrollbarColumn=function(){let u=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{};const{scrollbarWidth:h=0}=u;return{key:B.DEFAULT_KEY_COLUMN_SCROLLBAR,width:h,fixed:"right"}},this.renderExpandIcon=function(){let u=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{},h=arguments.length>1&&arguments[1]!==void 0?arguments[1]:!1,g=arguments.length>2&&arguments[2]!==void 0?arguments[2]:null;const{expandedRowKeys:m}=n.state,{expandIcon:y}=n.props,p=typeof g=="string"||typeof g=="number"?g:n.foundation.getRecordKey(u);return b.createElement(xu,{key:p,componentType:h?"tree":"expand",expanded:Kt(m,p),expandIcon:y,onClick:(f,S)=>n.handleRowExpanded(f,p,S)})},this.handleRowExpanded=function(){return n.foundation.handleRowExpanded(...arguments)},this.normalizeExpandColumn=function(){let u=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{},h=null;const{prefixCls:g,expandCellFixed:m,expandIcon:y}=u;return h={fixed:m,key:B.DEFAULT_KEY_COLUMN_EXPAND},h.className=M(h.className,`${g}-column-expand`),h.render=y!==!1?function(){let p=arguments.length>1?arguments[1]:void 0;return n.adapter.mergedRowExpandable(p)?n.renderExpandIcon(p):null}:()=>null,h},this.addFnsInColumn=function(){let u=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{};const{prefixCls:h}=n.props;if(u&&(u.sorter||u.filters||u.onFilter||u.useFullRender)){let g=typeof u.sorter=="function"||u.sorter===!0,m=Array.isArray(u.filters)&&u.filters.length||L.isValidElement(u.filterDropdown)||typeof u.renderFilterDropdown=="function",y=!1;const f=!("sortOrder"in u)&&u.showSortTip===!0,{dataIndex:S,title:v,useFullRender:w}=u,_=g&&!m&&!w,O=n.foundation.getQuery(S),I={},E=[];w&&(I.selection=n.renderSelection(null,!0));const k=x(O,"sortOrder"),N=x(O,"defaultSortOrder",!1),P=n.foundation.isSortOrderValid(k)?k:N,A=Zs(u.ellipsis),F=typeof v!="function"&&b.createElement("span",{className:`${h}-row-head-title`,key:B.DEFAULT_KEY_COLUMN_TITLE,title:A&&typeof v=="string"?v:void 0},v);if(g){const W=b.createElement(Js,{key:B.DEFAULT_KEY_COLUMN_SORTER,sortOrder:P,sortIcon:u.sortIcon,onClick:w||m?G=>n.foundation.handleSort(u,G):null,title:F,showTooltip:!_&&f});w&&(I.sorter=W),y=!0,E.push(W)}else E.push(F);const K=x(O,"filteredValue"),z=x(O,"defaultFilteredValue"),q=K||z;if(m){const W=b.createElement(Cu,Object.assign({key:B.DEFAULT_KEY_COLUMN_FILTER},ye(O,"children"),{filteredValue:q,onFilterDropdownVisibleChange:G=>n.foundation.toggleShowFilter(S,G),onSelect:G=>n.foundation.handleFilterSelect(S,G)}));w&&(I.filter=W),y=!0,E.push(W)}const V=typeof v=="function"?()=>v(I):y?b.createElement("div",{className:`${h}-operate-wrapper`},E):E;u=Object.assign(Object.assign({},u),{title:V}),_&&(u.clickToSort=W=>{n.foundation.handleSort(u,W,!0)},u.mouseDown=n.foundation.handleMouseDown,u.sortOrder=P,u.showSortTip=f)}return u},this.toggleSelectRow=(u,h,g)=>{this.foundation.handleSelectRow(h,u,g)},this.handleRowClickSelection=(u,h,g)=>{const{rowSelection:m}=this.state;if(x(m,"clickRow",!1)&&m){const p=x(m,"disabled",!1),f=x(m,"getCheckboxProps");if(p)return;const S=this.cachedFilteredSortedDataSource.find(v=>this.foundation.getRecordKey(v)===u);if(S&&typeof f=="function"&&f(S).disabled)return;this.foundation.handleSelectRow(u,h,g)}},this.toggleSelectAllRow=(u,h)=>{this.foundation.handleSelectAllRow(u,h)},this.renderPagination=(u,h)=>{if(!u)return null;const g=this.foundation.memoizedPagination(u);return b.createElement(Ee,{componentName:"Table"},m=>{const y=this.foundation.formatPaginationInfo(g,m.pageText);return b.createElement(Qs,{info:y,pagination:g,renderPagination:h})})},this.renderTitle=function(){let u=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{},{title:h}=u;const{prefixCls:g,dataSource:m}=u;return typeof h=="function"&&(h=h(m)),L.isValidElement(h)||typeof h=="string"?b.createElement("div",{className:`${g}-title`,"x-semi-prop":"title"},h):null},this.renderEmpty=function(){let u=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{};const{prefixCls:h,empty:g,dataSource:m}=u,y=`${h}-placeholder`;return n.foundation.isEmpty(m)?b.createElement(Ee,{componentName:"Table",key:"emptyText"},(f,S)=>b.createElement("div",{className:y},b.createElement("div",{className:`${h}-empty`,"x-semi-prop":"empty"},g||f.emptyText))):null},this.renderFooter=function(){let u=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{},{footer:h}=u;const{prefixCls:g,dataSource:m}=u;return typeof h=="function"&&(h=h(m)),L.isValidElement(h)||typeof h=="string"?b.createElement("div",{className:`${g}-footer`,key:"footer","x-semi-prop":"footer"},h):null},this.renderMainTable=u=>{const h=this.adapter.useFixedHeader(),g=this.renderEmpty(u);return[this.renderTable(Object.assign(Object.assign({},u),{fixed:!1,useFixedHeader:h,headerRef:this._cacheHeaderRef,bodyRef:this.bodyWrapRef,includeHeader:!h,emptySlot:g})),this.renderFooter(u)]},this.renderTable=u=>{const{columns:h,filteredColumns:g,fixed:m,useFixedHeader:y,scroll:p,prefixCls:f,anyColumnFixed:S,includeHeader:v,showHeader:w,components:_,headerRef:O,bodyRef:I,onHeaderRow:E,rowSelection:k,dataSource:N,bodyHasScrollBar:P,disabledRowKeysSet:A,sticky:F}=u,K=x(k,"selectedRowKeysSet",new Set),z=this.adapter.getTableLayout(),q=m||y?b.createElement(Pu,{key:"head",tableLayout:z,ref:O,columns:g,prefixCls:f,fixed:m,handleBodyScroll:this.handleBodyScrollLeft,components:_,scroll:p,showHeader:w,selectedRowKeysSet:K,onHeaderRow:E,dataSource:N,bodyHasScrollBar:P,sticky:F}):null,V=b.createElement(Gu,Object.assign({},ye(u,["rowSelection","headWidths"]),{key:"body",ref:I,columns:g,fixed:m,prefixCls:f,handleWheel:this.handleWheel,handleBodyScroll:this.handleBodyScroll,anyColumnFixed:S,tableLayout:z,includeHeader:v,showHeader:w,scroll:p,components:_,store:this.store,selectedRowKeysSet:K,disabledRowKeysSet:A}));return[q,V]},this.handleColumns=(u,h)=>{const{hideExpandedColumn:g,scroll:m,prefixCls:y,expandCellFixed:p,expandIcon:f,rowSelection:S}=this.props,v="children";let w=we(h);const _=function(){let O=arguments.length>0&&arguments[0]!==void 0?arguments[0]:[];Array.isArray(O)&&O.length&&le(O,(I,E,k)=>{const N=n.addFnsInColumn(I),P=I[v];if(Array.isArray(P)&&P.length){const A=[...P];_(A),N[v]=A}k[E]=N})};if(_(w),!g){const O=this.normalizeExpandColumn({prefixCls:y,expandCellFixed:p,expandIcon:f}),I=Ze(w,E=>E.key===B.DEFAULT_KEY_COLUMN_EXPAND);O&&(I>-1?w[I]=Object.assign(Object.assign({},O),w[I]):O.fixed==="right"?w=[...w,O]:w=[O,...w])}if(S&&!x(S,"hidden")){const O=Ze(w,E=>E.key===B.DEFAULT_KEY_COLUMN_SELECTION),I=this.normalizeSelectionColumn({rowSelection:S,prefixCls:y});O>-1?w[O]=Object.assign(Object.assign({},I),w[O]):I.fixed==="right"?w=[...w,I]:w=[I,...w]}return Wt(w),w},this.normalizeColumns=(u,h)=>we(this.getColumns(u,h)),this.mergePagination=u=>{const h=u==null?void 0:u.onChange,{scroll:g}=this.props;return x(g,"scrollToFirstRowOnChange")?Object.assign(Object.assign({},u),{onChange:(f,S)=>{this.foundation.setPage(f,S),typeof h=="function"&&h(f,S)}}):Object.assign({onChange:this.foundation.setPage},u)},this.foundation=new vt(this.adapter);const s=this.getColumns(e.columns,e.children),r=Ye(s),o=vt.initColumnsFilteredValueAndSorterOrder(we(r)),l=this.foundation.getFilteredSortedDataSource(this.props.dataSource,o),c=bd(this.props.pagination)?this.props.pagination:{},d=this.foundation.getCurrentPageData(l,c,o);this.state={cachedColumns:s,cachedChildren:e.children,flattenColumns:r,components:Ro(e.components,e.virtualized),queries:o,dataSource:d.dataSource,flattenData:[],expandedRowKeys:[...e.expandedRowKeys||[],...e.defaultExpandedRowKeys||[]],rowSelection:e.rowSelection?Re(e.rowSelection)?Object.assign({},e.rowSelection):{}:null,pagination:d.pagination,groups:null,allRowKeys:[],disabledRowKeys:[],disabledRowKeysSet:new Set,allDisabledRowKeys:[],allDisabledRowKeysSet:new Set,headWidths:[],bodyHasScrollBar:!1,prePropRowSelection:void 0,prePagination:void 0,halfCheckedRowKeys:[],halfCheckedRowKeysSet:new Set,keyEntities:{}},this.rootWrapRef=L.createRef(),this.wrapRef=L.createRef(),this.bodyWrapRef=L.createRef(),this.headerWrapRef=L.createRef(),this.store=new lu({hoveredRowKey:null,hoveredRowKeys:[]}),this.debouncedWindowResize=ul(this.handleWindowResize,150),this.cachedFilteredSortedDataSource=[],this.cachedFilteredSortedRowKeys=[],this.cachedFilteredSortedRowKeysSet=new Set,this.resizeObserver=null,this.hasBindWindowResize=!1}static getDerivedStateFromProps(e,t){const n={},{rowSelection:s,dataSource:r,childrenRecordName:o,rowKey:l,pagination:c}=e;if(e.columns&&e.children&&bt.warn("columns should not given by object and children at the same time"),e.columns&&e.columns!==t.cachedColumns){const d=Ye(e.columns);n.flattenColumns=d,n.queries=Ts(t.queries,d,null,!1),n.cachedColumns=e.columns,n.cachedChildren=null}else if(e.children&&e.children!==t.cachedChildren){const d=Ut(e.children),u=Ye(d),h=Ts(t.queries,u,null,!1);n.flattenColumns=u,n.queries=[...h],n.cachedColumns=[...d],n.cachedChildren=e.children}if(s!==t.prePropRowSelection){let d={};Re(t.rowSelection)&&(d=Object.assign(Object.assign({},d),t.rowSelection)),Re(s)&&(d=Object.assign(Object.assign({},d),s));const u=x(s,"selectedRowKeys"),h=x(s,"getCheckboxProps");if(u&&Array.isArray(u)&&(d.selectedRowKeysSet=new Set(u)),ue(h)){const g=Qi({dataSource:r,getCheckboxProps:h,childrenRecordName:o,rowKey:l}),m=new Set(g);n.disabledRowKeys=g,n.disabledRowKeysSet=m,n.allDisabledRowKeys=g,n.allDisabledRowKeysSet=m}n.rowSelection=d,n.prePropRowSelection=s}if(c!==t.prePagination){let d={};Re(t.pagination)&&(d=Object.assign(Object.assign({},d),t.pagination)),Re(c)&&(d=Object.assign(Object.assign({},d),c)),n.pagination=d,n.prePagination=c}return n}componentDidMount(){super.componentDidMount(),this.setScrollPosition("left");const{dataSource:e,childrenRecordName:t}=this.props;if(x(this.state.rowSelection,"checkRelation","unRelated")==="related"&&e&&e.length){const s=this.foundation.buildKeyEntities(e);this.adapter.setKeyEntities(s)}typeof window<"u"&&typeof window.requestAnimationFrame=="function"?window.requestAnimationFrame(()=>this.setScrollPositionClassName()):setTimeout(()=>this.setScrollPositionClassName(),0),this.syncResizeListeners()}componentDidUpdate(e,t){const{dataSource:n,expandedRowKeys:s,expandAllRows:r,expandAllGroupRows:o,virtualized:l,components:c,pagination:d}=this.props,{pagination:u,queries:h,cachedColumns:g,cachedChildren:m,groups:y}=this.state,p={};this._warnIfNoKey(),Array.isArray(s)&&s!==e.expandedRowKeys&&this.setState({expandedRowKeys:s}),(c!==e.components||l!==e.virtualized)&&this.setState({components:Ro(c,l)}),(r!==e.expandAllRows||o!==e.expandAllGroupRows)&&this.foundation.initExpandedRowKeys({groups:y});const f=x(this.props.rowSelection,"getCheckboxProps"),S=x(e.rowSelection,"getCheckboxProps");if(n!==e.dataSource||h!==t.queries||f!==S){const v=[...n],w=this.foundation.getFilteredSortedDataSource(v,h),_=this.foundation.getAllDisabledRowKeys(w);if(this.foundation.setCachedFilteredSortedDataSource(w),this.foundation.setAllDisabledRowKeys(_),p.dataSource=w,x(this.state.rowSelection,"checkRelation","unRelated")==="related"){const I=this.foundation.buildKeyEntities(v);this.adapter.setKeyEntities(I)}this.props.groupBy&&(p.groups=null)}if(n!==e.dataSource&&(p.pagination=Re(u)?Object.assign(Object.assign({},u),{currentPage:Re(d)&&d.currentPage?d.currentPage:1}):u),Object.keys(p).length){const{pagination:v=null,queries:w=null,dataSource:_=null}=p,O=this.foundation.getCurrentPageData(_,v,w);this.adapter.setAllRowKeys(O.allRowKeys),this.adapter.setDisabledRowKeys(O.disabledRowKeys),"dataSource"in p&&((this.props.defaultExpandAllRows&&O.groups&&O.groups.size||this.props.expandAllRows||this.props.expandAllGroupRows)&&this.foundation.initExpandedRowKeys(O),p.pagination=O.pagination);const I=Object.keys(p);for(const E of I)this.setState({[E]:O[E]})}this.syncResizeListeners()}componentWillUnmount(){super.componentWillUnmount(),this.unbindWindowResize(),this.debouncedWindowResize&&(this.debouncedWindowResize.cancel(),this.debouncedWindowResize=null),this.resizeObserver&&(this.resizeObserver.disconnect(),this.resizeObserver=null)}render(){let e=this.props,{scroll:t,prefixCls:n,className:s,style:r={},bordered:o,id:l,pagination:c,virtualized:d,size:u,renderPagination:h,getVirtualizedListRef:g,loading:m,hideExpandedColumn:y,rowSelection:p}=e,f=Yu(e,["scroll","prefixCls","className","style","bordered","id","pagination","virtualized","size","renderPagination","getVirtualizedListRef","loading","hideExpandedColumn","rowSelection"]),{rowSelection:S,expandedRowKeys:v,headWidths:w,tableWidth:_,pagination:O,dataSource:I,queries:E,cachedColumns:k,bodyHasScrollBar:N}=this.state;r=Object.assign({},r);let P;if(this.adapter.isAnyColumnUseFullRender(E))P=this.handleColumns(E,k);else{const oe=p&&!x(p,"hidden");P=this.foundation.memoizedWithFnsColumns(E,k,oe,y,N)}const A=this.foundation.memoizedFilterColumns(P),F=this.foundation.memoizedFlattenFnsColumns(P),K=this.adapter.isAnyColumnFixed(P),z=Object.assign(Object.assign(Object.assign({},f),this.state),{virtualized:d,scroll:t,prefixCls:n,size:u,hideExpandedColumn:y,columns:P,anyColumnFixed:K,rowExpandable:this.mergedRowExpandable,pagination:O,dataSource:I,rowSelection:S,expandedRowKeys:v,renderExpandIcon:this.renderExpandIcon,filteredColumns:A}),q=x(t,"x"),V=x(t,"y");d&&typeof r.width!="number"&&(r.width=q);const W=M({[`${n}-${B.SIZE_SMALL}`]:u===B.SIZE_SMALL,[`${n}-${B.SIZE_MIDDLE}`]:u===B.SIZE_MIDDLE,[`${n}-virtualized`]:!!d,[`${n}-bordered`]:o,[`${n}-fixed-header`]:!!V,[`${n}-scroll-position-left`]:["both","left"].includes(this.position),[`${n}-scroll-position-right`]:["both","right"].includes(this.position)}),G=O&&c?this.renderPagination(O,h):null,se=x(c,"position","bottom"),Q=Object.assign(Object.assign({},this.context),{headWidths:w,tableWidth:_,anyColumnFixed:K,flattenedColumns:F,renderExpandIcon:this.renderExpandIcon,renderSelection:this.renderSelection,setHeadWidths:this.setHeadWidths,getHeadWidths:this.getHeadWidths,getCellWidths:this.getCellWidths,handleRowExpanded:this.handleRowExpanded,getVirtualizedListRef:g,setBodyHasScrollbar:this.setBodyHasScrollbar,handleRowSelection:this.handleRowClickSelection,headerStyle:z.headerStyle,rowSpanHover:z.rowSpanHover}),pe=this.getDataAttr(f);return b.createElement("div",Object.assign({ref:this.rootWrapRef,className:M(s,`${n}-wrapper`,`${n}-wrapper-${z.direction}`),"data-column-fixed":K,style:r,id:l},pe),b.createElement(Su,Object.assign({},Q,{direction:z.direction}),b.createElement(mi,{spinning:m,size:"large"},b.createElement("div",{ref:this.wrapRef,className:W},b.createElement(b.Fragment,{key:"pagination-top"},["top","both"].includes(se)?G:null),this.renderTitle({title:z.title,dataSource:z.dataSource,prefixCls:z.prefixCls}),b.createElement("div",{className:`${n}-container`},this.renderMainTable(Object.assign({},z))),b.createElement(b.Fragment,{key:"pagination-bottom"},["bottom","both"].includes(se)?G:null)))))}};ot.contextType=ke;ot.propTypes={className:a.string,style:a.object,prefixCls:a.string,components:a.any,bordered:a.bool,loading:a.bool,size:a.oneOf(B.SIZES),tableLayout:a.oneOf(B.LAYOUTS),columns:a.arrayOf(a.shape(ea)),hideExpandedColumn:a.bool,id:a.string,expandIcon:a.oneOfType([a.bool,a.func,a.node]),expandCellFixed:a.oneOf(B.FIXED_SET),title:a.oneOfType([a.string,a.node,a.func]),onHeaderRow:a.func,showHeader:a.bool,indentSize:a.number,rowKey:a.oneOfType([a.func,a.string,a.number]),onRow:a.func,onExpandedRowsChange:a.func,onExpand:a.func,rowExpandable:a.func,expandedRowRender:a.func,expandedRowKeys:a.array,defaultExpandAllRows:a.bool,expandAllRows:a.bool,defaultExpandAllGroupRows:a.bool,expandAllGroupRows:a.bool,defaultExpandedRowKeys:a.array,pagination:a.oneOfType([a.object,a.bool]),renderPagination:a.func,footer:a.oneOfType([a.func,a.string,a.node]),empty:a.node,dataSource:a.array,childrenRecordName:a.string,rowSelection:a.oneOfType([a.object,a.bool]),onChange:a.func,scroll:a.shape({x:a.oneOfType([a.number,a.string,a.bool]),y:a.oneOfType([a.number,a.string])}),groupBy:a.oneOfType([a.string,a.number,a.func]),headerStyle:a.object,renderGroupSection:a.oneOfType([a.func]),onGroupedRow:a.func,clickGroupedRowToExpand:a.bool,virtualized:a.oneOfType([a.object,a.bool]),dropdownPrefixCls:a.string,expandRowByClick:a.bool,getVirtualizedListRef:a.func,rowSpanHover:a.bool};ot.defaultProps={tableLayout:"",dataSource:[],prefixCls:ce.PREFIX,rowSelection:null,className:"",childrenRecordName:"children",size:"default",loading:!1,bordered:!1,expandCellFixed:!1,hideExpandedColumn:!0,showHeader:!0,indentSize:ne.DEFAULT_INDENT_WIDTH,onChange:H,pagination:!0,rowKey:"key",defaultExpandedRowKeys:[],defaultExpandAllRows:!1,defaultExpandAllGroupRows:!1,expandAllRows:!1,expandAllGroupRows:!1,onFilterDropdownVisibleChange:H,onExpand:H,onExpandedRowsChange:H,expandRowByClick:!1};var gs,Mo;function Xu(){if(Mo)return gs;Mo=1;var i=ai();function e(t,n,s){var r=t.length;return s=s===void 0?r:s,!n&&s>=r?t:i(t,n,s)}return gs=e,gs}var ms,jo;function Zu(){if(jo)return ms;jo=1;var i=Xa(),e=Za(),t="[object RegExp]";function n(s){return e(s)&&i(s)==t}return ms=n,ms}var bs,zo;function Qu(){if(zo)return bs;zo=1;var i=Zu(),e=di(),t=Qa(),n=t&&t.isRegExp,s=n?e(n):i;return bs=s,bs}var ys,Fo;function Ju(){if(Fo)return ys;Fo=1;function i(e){return e.split("")}return ys=i,ys}var Ss,Ko;function eh(){if(Ko)return Ss;Ko=1;var i="\\ud800-\\udfff",e="\\u0300-\\u036f",t="\\ufe20-\\ufe2f",n="\\u20d0-\\u20ff",s=e+t+n,r="\\ufe0e\\ufe0f",o="["+i+"]",l="["+s+"]",c="\\ud83c[\\udffb-\\udfff]",d="(?:"+l+"|"+c+")",u="[^"+i+"]",h="(?:\\ud83c[\\udde6-\\uddff]){2}",g="[\\ud800-\\udbff][\\udc00-\\udfff]",m="\\u200d",y=d+"?",p="["+r+"]?",f="(?:"+m+"(?:"+[u,h,g].join("|")+")"+p+y+")*",S=p+y+f,v="(?:"+[u+l+"?",l,h,g,o].join("|")+")",w=RegExp(c+"(?="+c+")|"+v+S,"g");function _(O){return O.match(w)||[]}return Ss=_,Ss}var ws,$o;function th(){if($o)return ws;$o=1;var i=Ju(),e=nr(),t=eh();function n(s){return e(s)?t(s):i(s)}return ws=n,ws}var vs,Bo;function nh(){if(Bo)return vs;Bo=1;var i=Ja(),e=Xu(),t=nr(),n=Ns(),s=Qu(),r=th(),o=el(),l=4294967295;function c(d,u,h){return h&&typeof h!="number"&&n(d,u,h)&&(u=h=void 0),h=h===void 0?l:h>>>0,h?(d=o(d),d&&(typeof u=="string"||u!=null&&!s(u))&&(u=i(u),!u&&t(d))?e(r(d),0,h):d.split(u,h)):[]}return vs=c,vs}var sh=nh();const aa=te(sh);function rh(i){const e=aa(i,/\s+/);for(var t=arguments.length,n=new Array(t>1?t-1:0),s=1;s!e.includes(o));return M(i,...r)}function oh(i){const e=aa(i,/\s+/);for(var t=arguments.length,n=new Array(t>1?t-1:0),s=1;s{const o=e.indexOf(r);o>-1&&e.splice(o,1)}),M(...e)}var ct={exports:{}},dt={},ut={exports:{}},Tt={exports:{}},Ho;function ih(){if(Ho)return Tt.exports;Ho=1;function i(t){var n,s,r="";if(typeof t=="string"||typeof t=="number")r+=t;else if(typeof t=="object")if(Array.isArray(t)){var o=t.length;for(n=0;n{for(var T in R)t(C,T,{get:R[T],enumerable:!0})},c=(C,R,T,D)=>{if(R&&typeof R=="object"||typeof R=="function")for(let j of s(R))!o.call(C,j)&&j!==T&&t(C,j,{get:()=>R[j],enumerable:!(D=n(R,j))||D.enumerable});return C},d=(C,R,T)=>(T=C!=null?e(r(C)):{},c(!C||!C.__esModule?t(T,"default",{value:C,enumerable:!0}):T,C)),u=C=>c(t({},"__esModule",{value:!0}),C),h={};l(h,{DraggableCore:()=>Le,default:()=>Rt}),Cs=u(h);var g=d(St()),m=d(zt()),y=d(pr()),p=ih();function f(C,R){for(let T=0,D=C.length;T"u")return"";const D=(T=(R=window.document)==null?void 0:R.documentElement)==null?void 0:T.style;if(!D||C in D)return"";for(let j=0;jR===T.identifier)||C.changedTouches&&f(C.changedTouches,T=>R===T.identifier)}function ie(C){if(C.targetTouches&&C.targetTouches[0])return C.targetTouches[0].identifier;if(C.changedTouches&&C.changedTouches[0])return C.changedTouches[0].identifier}function Ot(){return typeof __webpack_nonce__<"u"?__webpack_nonce__:void 0}function ha(C,R){if(!C)return;let T=C.getElementById("react-draggable-style-el");if(!T){T=C.createElement("style"),T.type="text/css",T.id="react-draggable-style-el";const D=R??Ot();D&&T.setAttribute("nonce",D),T.innerHTML=`.react-draggable-transparent-selection *::-moz-selection {all: inherit;} +`,T.innerHTML+=`.react-draggable-transparent-selection *::selection {all: inherit;} +`,C.getElementsByTagName("head")[0].appendChild(T)}C.body&&pa(C.body,"react-draggable-transparent-selection")}function or(C){window.requestAnimationFrame?window.requestAnimationFrame(()=>{ir(C)}):ir(C)}function ir(C){if(C)try{C.body&&fa(C.body,"react-draggable-transparent-selection");const R=C.selection;if(R)R.empty();else{const T=(C.defaultView||window).getSelection();T&&T.type!=="Caret"&&T.removeAllRanges()}}catch{}}function pa(C,R){C.classList?C.classList.add(R):C.className.match(new RegExp(`(?:^|\\s)${R}(?!\\S)`))||(C.className+=` ${R}`)}function fa(C,R){C.classList?C.classList.remove(R):C.className=C.className.replace(new RegExp(`(?:^|\\s)${R}(?!\\S)`,"g"),"")}function ga(C,R,T){if(!C.props.bounds)return[R,T];let{bounds:D}=C.props;D=typeof D=="string"?D:ya(D);const j=fn(C);if(typeof D=="string"){const{ownerDocument:J}=j,Y=J.defaultView;if(!Y)throw new Error("Cannot resolve the owner window of the draggable node.");let ee;if(D==="parent"?ee=j.parentNode:ee=j.getRootNode().querySelector(D),!(ee instanceof Y.HTMLElement))throw new Error('Bounds selector "'+D+'" could not find an element.');const fe=ee,Me=Y.getComputedStyle(j),Ue=Y.getComputedStyle(fe);D={left:-j.offsetLeft+w(Ue.paddingLeft)+w(Me.marginLeft),top:-j.offsetTop+w(Ue.paddingTop)+w(Me.marginTop),right:G(fe)-V(j)-j.offsetLeft+w(Ue.paddingRight)-w(Me.marginRight),bottom:W(fe)-q(j)-j.offsetTop+w(Ue.paddingBottom)-w(Me.marginBottom)}}return v(D.right)&&(R=Math.min(R,D.right)),v(D.bottom)&&(T=Math.min(T,D.bottom)),v(D.left)&&(R=Math.max(R,D.left)),v(D.top)&&(T=Math.max(T,D.top)),[R,T]}function ar(C,R,T){const D=Math.round(R/C[0])*C[0],j=Math.round(T/C[1])*C[1];return[D,j]}function ma(C){return C.props.axis==="both"||C.props.axis==="x"}function ba(C){return C.props.axis==="both"||C.props.axis==="y"}function un(C,R,T){const D=typeof R=="number"?de(C,R):null;if(typeof R=="number"&&!D)return null;const j=fn(T),J=T.props.offsetParent||j.offsetParent||j.ownerDocument.body;return se(D||C,J,T.props.scale)}function hn(C,R,T){const D=!v(C.lastX),j=fn(C);return D?{node:j,deltaX:0,deltaY:0,lastX:R,lastY:T,x:R,y:T}:{node:j,deltaX:R-C.lastX,deltaY:T-C.lastY,lastX:C.lastX,lastY:C.lastY,x:R,y:T}}function pn(C,R){const T=C.props.scale;return{node:R.node,x:C.state.x+R.deltaX/T,y:C.state.y+R.deltaY/T,deltaX:R.deltaX/T,deltaY:R.deltaY/T,lastX:C.state.x,lastY:C.state.y}}function ya(C){return{left:C.left,top:C.top,right:C.right,bottom:C.bottom}}function fn(C){const R=C.findDOMNode();if(!R)throw new Error(": Unmounted during event!");return R}var gn=d(St()),ae=d(zt()),Sa=d(pr());function Se(...C){i.DRAGGABLE_DEBUG&&console.log(...C)}var me={touch:{start:"touchstart",move:"touchmove",stop:"touchend"},mouse:{start:"mousedown",move:"mousemove",stop:"mouseup"}},Ie=me.mouse,Le=class extends gn.Component{constructor(){super(...arguments),this.dragging=!1,this.lastX=NaN,this.lastY=NaN,this.touchIdentifier=null,this.mounted=!1,this.handleDragStart=C=>{if(this.props.onMouseDown(C),!this.props.allowAnyClick&&(typeof C.button=="number"&&C.button!==0||C.ctrlKey))return!1;const R=this.findDOMNode();if(!R||!R.ownerDocument||!R.ownerDocument.body)throw new Error(" not mounted on DragStart!");const{ownerDocument:T}=R;if(this.props.disabled||!(C.target instanceof T.defaultView.Node)||this.props.handle&&!F(C.target,this.props.handle,R)||this.props.cancel&&F(C.target,this.props.cancel,R))return;C.type==="touchstart"&&!this.props.allowMobileScroll&&C.preventDefault();const D=ie(C);this.touchIdentifier=D;const j=un(C,D,this);if(j==null)return;const{x:J,y:Y}=j,ee=hn(this,J,Y);Se("DraggableCore: handleDragStart: %j",ee),Se("calling",this.props.onStart),!(this.props.onStart(C,ee)===!1||this.mounted===!1)&&(this.props.enableUserSelectHack&&ha(T,this.props.nonce),this.dragging=!0,this.lastX=J,this.lastY=Y,K(T,Ie.move,this.handleDrag),K(T,Ie.stop,this.handleDragStop))},this.handleDrag=C=>{const R=un(C,this.touchIdentifier,this);if(R==null)return;let{x:T,y:D}=R;if(Array.isArray(this.props.grid)){let Y=T-this.lastX,ee=D-this.lastY;if([Y,ee]=ar(this.props.grid,Y,ee),!Y&&!ee)return;T=this.lastX+Y,D=this.lastY+ee}const j=hn(this,T,D);if(Se("DraggableCore: handleDrag: %j",j),this.props.onDrag(C,j)===!1||this.mounted===!1){try{this.handleDragStop(new MouseEvent("mouseup"))}catch{const Y=document.createEvent("MouseEvents");Y.initMouseEvent("mouseup",!0,!0,window,0,0,0,0,0,!1,!1,!1,!1,0,null),this.handleDragStop(Y)}return}this.lastX=T,this.lastY=D},this.handleDragStop=C=>{if(!this.dragging)return;const R=un(C,this.touchIdentifier,this);if(R==null)return;let{x:T,y:D}=R;if(Array.isArray(this.props.grid)){let ee=T-this.lastX||0,fe=D-this.lastY||0;[ee,fe]=ar(this.props.grid,ee,fe),T=this.lastX+ee,D=this.lastY+fe}const j=hn(this,T,D);if(this.props.onStop(C,j)===!1||this.mounted===!1)return!1;const Y=this.findDOMNode();Y&&this.props.enableUserSelectHack&&or(Y.ownerDocument),Se("DraggableCore: handleDragStop: %j",j),this.dragging=!1,this.lastX=NaN,this.lastY=NaN,Y&&(Se("DraggableCore: Removing handlers"),z(Y.ownerDocument,Ie.move,this.handleDrag),z(Y.ownerDocument,Ie.stop,this.handleDragStop))},this.onMouseDown=C=>(Ie=me.mouse,this.handleDragStart(C)),this.onMouseUp=C=>(Ie=me.mouse,this.handleDragStop(C)),this.onTouchStart=C=>(Ie=me.touch,this.handleDragStart(C)),this.onTouchEnd=C=>(Ie=me.touch,this.handleDragStop(C))}componentDidMount(){this.mounted=!0;const C=this.findDOMNode();C&&K(C,me.touch.start,this.onTouchStart,{passive:!1})}componentWillUnmount(){this.mounted=!1;const C=this.findDOMNode();if(C){const{ownerDocument:R}=C;z(R,me.mouse.move,this.handleDrag),z(R,me.touch.move,this.handleDrag),z(R,me.mouse.stop,this.handleDragStop),z(R,me.touch.stop,this.handleDragStop),z(C,me.touch.start,this.onTouchStart,{passive:!1}),this.props.enableUserSelectHack&&or(R)}}findDOMNode(){var C;if((C=this.props)!=null&&C.nodeRef)return this.props.nodeRef.current;const R=Sa.default;return typeof R.findDOMNode=="function"?R.findDOMNode(this):(Se("react-draggable: ReactDOM.findDOMNode is not available in React 19+. You must provide a nodeRef prop. See: https://github.com/react-grid-layout/react-draggable#noderef"),null)}render(){return gn.cloneElement(gn.Children.only(this.props.children),{onMouseDown:this.onMouseDown,onMouseUp:this.onMouseUp,onTouchEnd:this.onTouchEnd})}};Le.displayName="DraggableCore",Le.propTypes={allowAnyClick:ae.default.bool,allowMobileScroll:ae.default.bool,children:ae.default.node.isRequired,disabled:ae.default.bool,enableUserSelectHack:ae.default.bool,offsetParent:function(C,R){if(C[R]&&C[R].nodeType!==1)throw new Error("Draggable's offsetParent must be a DOM Node.")},grid:ae.default.arrayOf(ae.default.number),handle:ae.default.string,cancel:ae.default.string,nodeRef:ae.default.object,nonce:ae.default.string,onStart:ae.default.func,onDrag:ae.default.func,onStop:ae.default.func,onMouseDown:ae.default.func,scale:ae.default.number,className:_,style:_,transform:_},Le.defaultProps={allowAnyClick:!1,allowMobileScroll:!1,disabled:!1,enableUserSelectHack:!0,onStart:function(){},onDrag:function(){},onStop:function(){},onMouseDown:function(){},scale:1};var Rt=class extends g.Component{constructor(C){super(C),this.onDragStart=(R,T)=>{if(Se("Draggable: onDragStart: %j",T),this.props.onStart(R,pn(this,T))===!1)return!1;this.setState({dragging:!0,dragged:!0})},this.onDrag=(R,T)=>{if(!this.state.dragging)return!1;Se("Draggable: onDrag: %j",T);const D=pn(this,T),j={x:D.x,y:D.y,slackX:0,slackY:0};if(this.props.bounds){const{x:Y,y:ee}=j;j.x+=this.state.slackX,j.y+=this.state.slackY;const[fe,Me]=ga(this,j.x,j.y);j.x=fe,j.y=Me,j.slackX=this.state.slackX+(Y-j.x),j.slackY=this.state.slackY+(ee-j.y),D.x=j.x,D.y=j.y,D.deltaX=j.x-this.state.x,D.deltaY=j.y-this.state.y}if(this.props.onDrag(R,D)===!1)return!1;this.setState(j)},this.onDragStop=(R,T)=>{if(!this.state.dragging||this.props.onStop(R,pn(this,T))===!1)return!1;Se("Draggable: onDragStop: %j",T);const j={dragging:!1,slackX:0,slackY:0};if(!!this.props.position){const{x:Y,y:ee}=this.props.position;j.x=Y,j.y=ee}this.setState(j)},this.state={dragging:!1,dragged:!1,x:C.position?C.position.x:C.defaultPosition.x,y:C.position?C.position.y:C.defaultPosition.y,prevPropsPosition:{...C.position},slackX:0,slackY:0,isElementSVG:!1},C.position&&!(C.onDrag||C.onStop)&&console.warn("A `position` was applied to this , without drag handlers. This will make this component effectively undraggable. Please attach `onDrag` or `onStop` handlers so you can adjust the `position` of this element.")}static getDerivedStateFromProps({position:C},{prevPropsPosition:R}){return C&&(!R||C.x!==R.x||C.y!==R.y)?(Se("Draggable: getDerivedStateFromProps %j",{position:C,prevPropsPosition:R}),{x:C.x,y:C.y,prevPropsPosition:{...C}}):null}componentDidMount(){typeof window.SVGElement<"u"&&this.findDOMNode()instanceof window.SVGElement&&this.setState({isElementSVG:!0})}componentWillUnmount(){this.state.dragging&&this.setState({dragging:!1})}findDOMNode(){var C;if((C=this.props)!=null&&C.nodeRef)return this.props.nodeRef.current;const R=y.default;return typeof R.findDOMNode=="function"?R.findDOMNode(this):null}render(){const{axis:C,bounds:R,children:T,defaultPosition:D,defaultClassName:j,defaultClassNameDragging:J,defaultClassNameDragged:Y,position:ee,positionOffset:fe,scale:Me,...Ue}=this.props;let mn={},lr=null;const cr=!!!ee||this.state.dragging,dr=ee||D,ur={x:ma(this)&&cr?this.state.x:dr.x,y:ba(this)&&cr?this.state.y:dr.y};this.state.isElementSVG?lr=pe(ur,fe):mn=Q(ur,fe);const bn=g.Children.only(T),wa=(0,p.clsx)(bn.props.className||"",j,{[J]:this.state.dragging,[Y]:this.state.dragged});return g.createElement(Le,{...Ue,onStart:this.onDragStart,onDrag:this.onDrag,onStop:this.onDragStop},g.cloneElement(bn,{className:wa,style:{...bn.props.style,...mn},transform:lr}))}};return Rt.displayName="Draggable",Rt.propTypes={...Le.propTypes,axis:m.default.oneOf(["both","x","y","none"]),bounds:m.default.oneOfType([m.default.shape({left:m.default.number,right:m.default.number,top:m.default.number,bottom:m.default.number}),m.default.string,m.default.oneOf([!1])]),defaultClassName:m.default.string,defaultClassNameDragging:m.default.string,defaultClassNameDragged:m.default.string,defaultPosition:m.default.shape({x:m.default.number,y:m.default.number}),positionOffset:m.default.shape({x:m.default.oneOfType([m.default.number,m.default.string]),y:m.default.oneOfType([m.default.number,m.default.string])}),position:m.default.shape({x:m.default.number,y:m.default.number}),className:_,style:_,transform:_},Rt.defaultProps={...Le.defaultProps,axis:"both",bounds:!1,defaultClassName:"react-draggable",defaultClassNameDragging:"react-draggable-dragging",defaultClassNameDragged:"react-draggable-dragged",defaultPosition:{x:0,y:0},scale:1},Cs}var Uo;function la(){if(Uo)return ut.exports;Uo=1;const i=ah(),e=i.DraggableCore,t=i.default||i;return ut.exports=t,ut.exports.default=t,ut.exports.DraggableCore=e,ut.exports}var It={},Vo;function lh(){if(Vo)return It;Vo=1,It.__esModule=!0,It.cloneElement=l;var i=e(St());function e(c){return c&&c.__esModule?c:{default:c}}function t(c,d){var u=Object.keys(c);if(Object.getOwnPropertySymbols){var h=Object.getOwnPropertySymbols(c);d&&(h=h.filter(function(g){return Object.getOwnPropertyDescriptor(c,g).enumerable})),u.push.apply(u,h)}return u}function n(c){for(var d=1;dMath.abs(F*P)?f=p/P:p=f*P}const O=p,I=f;let E=this.slack||[0,0],k=E[0],N=E[1];return p+=k,f+=N,v&&(p=Math.max(v[0],p),f=Math.max(v[1],f)),w&&(p=Math.min(w[0],p),f=Math.min(w[1],f)),this.slack=[k+(O-p),N+(I-f)],[p,f]}resizeHandler(p,f){return(S,v)=>{var w,_,O,I;let E=v.node,k=v.deltaX,N=v.deltaY;p==="onResizeStart"&&this.resetData();const P=(this.props.axis==="both"||this.props.axis==="x")&&f!=="n"&&f!=="s",A=(this.props.axis==="both"||this.props.axis==="y")&&f!=="e"&&f!=="w";if(!P&&!A)return;const F=f[0],K=f[f.length-1],z=E.getBoundingClientRect();if(this.lastHandleRect!=null){if(K==="w"){const ie=z.left-this.lastHandleRect.left;k+=ie}if(F==="n"){const ie=z.top-this.lastHandleRect.top;N+=ie}}this.lastHandleRect=z,K==="w"&&(k=-k),F==="n"&&(N=-N);const q=(w=(_=this.lastSize)==null?void 0:_.width)!=null?w:this.props.width,V=(O=(I=this.lastSize)==null?void 0:I.height)!=null?O:this.props.height;let W=q+(P?k/this.props.transformScale:0),G=V+(A?N/this.props.transformScale:0);var se=this.runConstraints(W,G);if(W=se[0],G=se[1],p==="onResizeStop"&&this.lastSize){var Q=this.lastSize;W=Q.width,G=Q.height}const pe=W!==q||G!==V;p!=="onResizeStop"&&(this.lastSize={width:W,height:G});const oe=typeof this.props[p]=="function"?this.props[p]:null;oe&&!(p==="onResize"&&!pe)&&(S.persist==null||S.persist(),oe(S,{node:E,size:{width:W,height:G},handle:f})),p==="onResizeStop"&&this.resetData()}}renderResizeHandle(p,f){const S=this.props.handle;if(!S)return i.createElement("span",{className:"react-resizable-handle react-resizable-handle-"+p,ref:f});if(typeof S=="function")return S(p,f);const v=typeof S.type=="string",w=d({ref:f},v?{}:{handleAxis:p});return i.cloneElement(S,w)}render(){const p=this.props,f=p.children,S=p.className,v=p.draggableOpts;p.width,p.height,p.handle,p.handleSize,p.lockAspectRatio,p.axis,p.minConstraints,p.maxConstraints,p.onResize,p.onResizeStop,p.onResizeStart;const w=p.resizeHandles;p.transformScale;const _=l(p,s);return(0,t.cloneElement)(f,d(d({},_),{},{className:(S?S+" ":"")+"react-resizable",children:[...i.Children.toArray(f.props.children),...w.map(O=>{var I;const E=(I=this.handleRefs[O])!=null?I:this.handleRefs[O]=i.createRef();return i.createElement(e.DraggableCore,o({},v,{nodeRef:E,key:"resizableHandle-"+O,onStop:this.resizeHandler("onResizeStop",O),onStart:this.resizeHandler("onResizeStart",O),onDrag:this.resizeHandler("onResize",O)}),this.renderResizeHandle(O,E))})]}))}};return dt.default=m,m.propTypes=n.resizableProps,m.defaultProps={axis:"both",handleSize:[20,20],lockAspectRatio:!1,minConstraints:[20,20],maxConstraints:[1/0,1/0],resizeHandles:["se"],transformScale:1},dt}var pt={},Yo;function ch(){if(Yo)return pt;Yo=1,pt.__esModule=!0,pt.default=void 0;var i=o(St()),e=r(zt()),t=r(da()),n=ca();const s=["handle","handleSize","onResize","onResizeStart","onResizeStop","draggableOpts","minConstraints","maxConstraints","lockAspectRatio","axis","width","height","resizeHandles","style","transformScale"];function r(p){return p&&p.__esModule?p:{default:p}}function o(p,f){if(typeof WeakMap=="function")var S=new WeakMap,v=new WeakMap;return(o=function(w,_){if(!_&&w&&w.__esModule)return w;var O,I,E={__proto__:null,default:w};if(w===null||typeof w!="object"&&typeof w!="function")return E;if(O=_?v:S){if(O.has(w))return O.get(w);O.set(w,E)}for(const k in w)k!=="default"&&{}.hasOwnProperty.call(w,k)&&((I=(O=Object.defineProperty)&&Object.getOwnPropertyDescriptor(w,k))&&(I.get||I.set)?O(E,k,I):E[k]=w[k]);return E})(p,f)}function l(){return l=Object.assign?Object.assign.bind():function(p){for(var f=1;f{const v=S.size;this.props.onResize?(f.persist==null||f.persist(),this.setState(v,()=>this.props.onResize&&this.props.onResize(f,S))):this.setState(v)}}static getDerivedStateFromProps(f,S){return S.propsWidth!==f.width||S.propsHeight!==f.height?{width:f.width,height:f.height,propsWidth:f.width,propsHeight:f.height}:null}render(){const f=this.props,S=f.handle,v=f.handleSize;f.onResize;const w=f.onResizeStart,_=f.onResizeStop,O=f.draggableOpts,I=f.minConstraints,E=f.maxConstraints,k=f.lockAspectRatio,N=f.axis;f.width,f.height;const P=f.resizeHandles,A=f.style,F=f.transformScale,K=m(f,s);return i.createElement(t.default,{axis:N,draggableOpts:O,handle:S,handleSize:v,height:this.state.height,lockAspectRatio:k,maxConstraints:E,minConstraints:I,onResizeStart:w,onResize:this.onResize,onResizeStop:_,resizeHandles:P,transformScale:F,width:this.state.width},i.createElement("div",l({},K,{style:d(d({},A),{},{width:this.state.width+"px",height:this.state.height+"px"})})))}};return pt.default=y,y.propTypes=d(d({},n.resizableProps),{},{children:e.default.element}),pt}var Xo;function dh(){return Xo||(Xo=1,ct.exports=function(){throw new Error("Don't instantiate Resizable directly! Use require('react-resizable').Resizable")},ct.exports.Resizable=da().default,ct.exports.ResizableBox=ch().default),ct.exports}var uh=dh(),hh=function(i,e){var t={};for(var n in i)Object.prototype.hasOwnProperty.call(i,n)&&e.indexOf(n)<0&&(t[n]=i[n]);if(i!=null&&typeof Object.getOwnPropertySymbols=="function")for(var s=0,n=Object.getOwnPropertySymbols(i);sb.createElement(b.Fragment,{key:u},d)),b.createElement(uh.Resizable,{width:r,height:0,onResize:t,onResizeStart:n,onResizeStop:s,draggableOpts:{enableUserSelectHack:!1},axis:"x"},b.createElement("th",Object.assign({},l),c))}}var fh=function(i,e){var t={};for(var n in i)Object.prototype.hasOwnProperty.call(i,n)&&e.indexOf(n)<0&&(t[n]=i[n]);if(i!=null&&typeof Object.getOwnPropertySymbols=="function")for(var s=0,n=Object.getOwnPropertySymbols(i);s0&&arguments[0]!==void 0?arguments[0]:{},e=arguments.length>1?arguments[1]:void 0;const{components:t,columns:n,resizable:s}=i,r=fh(i,["components","columns","resizable"]),o="children",l=x(s,"onResize",H),c=x(s,"onResizeStart",H),d=x(s,"onResizeStop",H),u=Array.isArray(n)&&n.length?n:Ut(i.children),h=Wt(we(u),o),g=Wt(we(u),o);typeof i.expandedRowRender=="function"&&!i.hideExpandedColumn&&!We(h,E=>E.key===B.DEFAULT_KEY_COLUMN_EXPAND)&&g.unshift({key:B.DEFAULT_KEY_COLUMN_EXPAND,width:ne.DEFAULT_WIDTH_COLUMN_EXPAND}),i.rowSelection&&!x(i.rowSelection,"hidden")&&!We(h,E=>E.key===B.DEFAULT_KEY_COLUMN_SELECTION)&&g.unshift({width:x(i,"rowSelection.width",ne.DEFAULT_WIDTH_COLUMN_SELECTION),key:B.DEFAULT_KEY_COLUMN_SELECTION});const[m,y]=L.useState(g);L.useEffect(()=>{const E=ru(m,g);y(Ts(m,E))},[n,i.expandedRowRender,i.hideExpandedColumn,i.rowSelection]);const p=L.useMemo(()=>Zt({header:{cell:ph}},t),[t]),f=x(s,"handlerClassName","resizing"),S=E=>(k,N)=>{let{size:P}=N;const A=we(m),F=Mt(A,E,o);let K=Object.assign(Object.assign({},F),{width:P.width});const z=l(K)||{};K=Object.assign(Object.assign({},K),z),Object.assign(F,K),y(A)},v=E=>k=>{if(typeof window<"u"){const K=window.getSelection();K&&K.removeAllRanges()}const N=we(m),P=Mt(N,E,o);let A=Object.assign(Object.assign({},P),{className:rh(P.className,f)});const F=c(A)||{};A=Object.assign(Object.assign({},A),F),Object.assign(P,A),y(N)},w=E=>k=>{const N=we(m),P=Mt(N,E,o);let A=Object.assign(Object.assign({},P),{className:oh(P.className,f)});const F=d(A)||{};A=Object.assign(Object.assign({},A),F),Object.assign(P,A),y(N)},_=function(E,k){let N=arguments.length>3?arguments[3]:void 0;return Object.assign(Object.assign({},E),{onHeaderCell:P=>Object.assign(Object.assign({},N),{width:P.width,onResize:S(P),onResizeStart:v(P),onResizeStop:w(P)})})},O=function(){let E=arguments.length>0&&arguments[0]!==void 0?arguments[0]:[],k=arguments.length>1&&arguments[1]!==void 0?arguments[1]:0;return Array.isArray(E)&&E.length?E.map((N,P)=>{var A,F;const K=(F=(A=N.onHeaderCell)===null||A===void 0?void 0:A.call(N,N,P,k))!==null&&F!==void 0?F:{};Object.assign(N,_(N,P,k,K));const z=N[o];return Array.isArray(z)&&z.length&&(N[o]=O(z,k+1)),N}):[]},I=L.useMemo(()=>O(m),[m]);return b.createElement(ot,Object.assign({},r,{columns:I,components:p,ref:e}))},mh=b.forwardRef(gh);class it extends b.PureComponent{constructor(e){super(e),this.getCurrentPageData=()=>this.tableRef.current&&this.tableRef.current.getCurrentPageData(),this.tableRef=b.createRef()}render(){var e;const t=this.props,n=(e=this.props.direction)!==null&&e!==void 0?e:this.context.direction;return t.resizable?b.createElement(mh,Object.assign({},t,{ref:this.tableRef,direction:n})):b.createElement(ot,Object.assign({},t,{ref:this.tableRef,direction:n}))}}it.Column=rn;it.DEFAULT_KEY_COLUMN_SELECTION=B.DEFAULT_KEY_COLUMN_SELECTION;it.DEFAULT_KEY_COLUMN_EXPAND=B.DEFAULT_KEY_COLUMN_EXPAND;it.propTypes=Object.assign(Object.assign({},ot.propTypes),{resizable:a.oneOfType([a.bool,a.object])});it.defaultProps={hideExpandedColumn:!0};it.contextType=Ls;const U={TABS:`${X}-tabs`,TABS_BAR:`${X}-tabs-bar`,TABS_BAR_LINE:`${X}-tabs-bar-line`,TABS_BAR_CARD:`${X}-tabs-bar-card`,TABS_BAR_BUTTON:`${X}-tabs-bar-button`,TABS_BAR_SLASH:`${X}-tabs-bar-slash`,TABS_BAR_EXTRA:`${X}-tabs-bar-extra`,TABS_TAB:`${X}-tabs-tab`,TABS_TAB_ACTIVE:`${X}-tabs-tab-active`,TABS_TAB_DISABLED:`${X}-tabs-tab-disabled`,TABS_CONTENT:`${X}-tabs-content`,TABS_PANE:`${X}-tabs-pane`,TABS_PANE_INACTIVE:`${X}-tabs-pane-inactive`,TABS_PANE_ACTIVE:`${X}-tabs-pane-active`,TABS_PANE_MOTION_OVERLAY:`${X}-tabs-pane-motion-overlay`,TABS_PANE_ANIMATE_LEFT_SHOW:`${X}-tabs-pane-animate-leftShow`,TABS_PANE_ANIMATE_RIGHT_SHOW:`${X}-tabs-pane-animate-rightShow`,TABS_PANE_ANIMATE_TOP_SHOW:`${X}-tabs-pane-animate-topShow`,TABS_PANE_ANIMATE_BOTTOM_SHOW:`${X}-tabs-pane-animate-bottomShow`},Xe={TYPE_MAP:["line","card","button","slash"],SIZE:["small","medium","large"],POSITION_MAP:["top","left"]};class bh extends ge{constructor(e){super(Object.assign({},e)),this.destroy=H,this.handlePrevent=t=>{t.stopPropagation(),t.preventDefault()},this.handleKeyDown=(t,n,s)=>{const{preventScroll:r}=this.getProps(),o=[...t.target.parentNode.childNodes].filter(l=>x(l,"attributes.data-tabkey.value","").includes("semiTab")&&x(l,"attributes.aria-disabled.value","")!=="true");switch(t.key){case"ArrowLeft":case"ArrowRight":case"ArrowUp":case"ArrowDown":this.determineOrientation(t,o);break;case"Backspace":case"Delete":this.handleDeleteKeyDown(t,o,n,s);break;case"Enter":case" ":this.handleTabClick(n,t),this.handlePrevent(t);break;case"Home":o[0].focus({preventScroll:r}),this.handlePrevent(t);break;case"End":o[o.length-1].focus({preventScroll:r}),this.handlePrevent(t);break}}}init(){this._adapter.collectPane()}_notifyChange(e){const{activeKey:t}=this.getStates();t!==e&&this._adapter.notifyChange(e)}handleTabClick(e,t){this._isInProps("activeKey")?this._notifyChange(e):(this._notifyChange(e),this.handleNewActiveKey(e)),this._adapter.notifyTabClick(e,t)}handleNewActiveKey(e){const{activeKey:t}=this.getStates();t!==e&&this._adapter.setNewActiveKey(e)}getDefaultActiveKey(){let e;const t=this.getProps();return"activeKey"in t?e=t.activeKey:"defaultActiveKey"in t?e=t.defaultActiveKey:e=this._adapter.getDefaultActiveKeyFromChildren(),e}handleTabListChange(){this._adapter.collectPane()}handleTabPanesChange(){this._adapter.collectPane(),this._adapter.collectActiveKey()}handleTabDelete(e){this._adapter.notifyTabDelete(e)}determineOrientation(e,t){const{tabPosition:n}=this.getProps();n==="left"?(e.key==="ArrowUp"||e.key==="ArrowDown")&&(this.switchTabOnArrowPress(e,t),this.handlePrevent(e)):(e.key==="ArrowLeft"||e.key==="ArrowRight")&&(this.switchTabOnArrowPress(e,t),this.handlePrevent(e))}handleDeleteKeyDown(e,t,n,s){const{preventScroll:r}=this.getProps();if(s){this.handleTabDelete(n);const o=t.indexOf(e.target);t.length!==1&&t[o+1>=t.length?o-1:o+1].focus({preventScroll:r})}}switchTabOnArrowPress(e,t){const{preventScroll:n}=this.getProps(),s=t.indexOf(e.target),r={ArrowLeft:-1,ArrowUp:-1,ArrowRight:1,ArrowDown:1};r[e.key]&&s!==void 0&&(t[s+r[e.key]]?t[s+r[e.key]].focus({preventScroll:n}):e.key==="ArrowLeft"||e.key==="ArrowUp"?t[t.length-1].focus({preventScroll:n}):(e.key==="ArrowRight"||e.key=="ArrowDown")&&t[0].focus({preventScroll:n}))}}var yh=function(i,e){var t={};for(var n in i)Object.prototype.hasOwnProperty.call(i,n)&&e.indexOf(n)<0&&(t[n]=i[n]);if(i!=null&&typeof Object.getOwnPropertySymbols=="function")for(var s=0,n=Object.getOwnPropertySymbols(i);s{const{tab:t,size:n,type:s,icon:r,selected:o,closable:l,disabled:c,itemKey:d,deleteTabItem:u,tabPosition:h,handleKeyDown:g,onClick:m}=i,y=yh(i,["tab","size","type","icon","selected","closable","disabled","itemKey","deleteTabItem","tabPosition","handleKeyDown","onClick"]),p=L.useMemo(()=>l?b.createElement(hl,{"aria-label":"Close",role:"button",className:`${U.TABS_TAB}-icon-close`,onClick:O=>u(d,O)}):null,[s,l,u,d]),f=L.useCallback(O=>b.createElement("span",{className:`${U.TABS_BAR}-icon`},O),[]),S=L.useCallback(O=>{g&&g(O,d,l)},[g,d,l]),v=L.useCallback(O=>{!c&&m&&m(d,O)},[d,c,m]),w=r?f(r):null,_=M(U.TABS_TAB,`${U.TABS_TAB}-${s}`,`${U.TABS_TAB}-${h}`,`${U.TABS_TAB}-single`,{[U.TABS_TAB_ACTIVE]:o,[U.TABS_TAB_DISABLED]:c,[`${U.TABS_TAB}-small`]:n==="small",[`${U.TABS_TAB}-medium`]:n==="medium"});return b.createElement("div",Object.assign({role:"tab",id:`semiTab${d}`,"data-tabkey":`semiTab${d}`,"aria-controls":`semiTabPanel${d}`,"aria-disabled":c?"true":"false","aria-selected":o?"true":"false",tabIndex:o?0:-1,onKeyDown:S,onClick:v,className:_},y,{ref:e}),w,t,p)},rr=L.forwardRef(Sh);rr.elementType="Tabs.TabItem";var wh=function(i,e){var t={};for(var n in i)Object.prototype.hasOwnProperty.call(i,n)&&e.indexOf(n)<0&&(t[n]=i[n]);if(i!=null&&typeof Object.getOwnPropertySymbols=="function")for(var s=0,n=Object.getOwnPropertySymbols(i);s{const{collapsible:n}=this.props;return n==="auto"?this.state.shouldCollapse:n||!1},this.checkOverflow=()=>{if(this.props.collapsible!=="auto"||this.state.shouldCollapse)return;const n=this.tabBarRef.current;if(!n)return;const s=this.isTabsWrapped(n)||n.scrollWidth>n.clientWidth+1;s!==this.state.shouldCollapse&&this.setState({shouldCollapse:s})},this.isTabsWrapped=n=>{var s;if(this.props.tabPosition==="left")return!1;const r=Array.from(n.querySelectorAll(`.${U.TABS_TAB}`));if(r.length<=1)return!1;const o=(s=r[0])===null||s===void 0?void 0:s.offsetTop;return typeof o!="number"?!1:r.some(l=>l.offsetTop!==o)},this.handleResize=()=>{this.props.collapsible==="auto"&&this.checkOverflow()},this.handleItemClick=(n,s)=>{this.props.onTabClick(n,s)},this.handleKeyDown=(n,s,r)=>{this.props.handleKeyDown(n,s,r)},this.renderTabItem=n=>{const{size:s,type:r,deleteTabItem:o,handleKeyDown:l,tabPosition:c}=this.props,d=this._isActive(n.itemKey);return b.createElement(rr,Object.assign({},Ne(n,["disabled","icon","itemKey","tab","closable"]),{key:this._getBarItemKeyByItemKey(n.itemKey),selected:d,size:s,type:r,tabPosition:c,handleKeyDown:l,deleteTabItem:o,onClick:this.handleItemClick}))},this.scrollTabItemIntoViewByKey=function(n){let s=arguments.length>1&&arguments[1]!==void 0?arguments[1]:"nearest",r=arguments.length>2?arguments[2]:void 0;const o=document.querySelector(`[data-uuid="${t.state.uuid}"] .${U.TABS_TAB}[data-scrollkey="${n}"]`);o==null||o.scrollIntoView({behavior:r||"smooth",block:s,inline:s})},this.scrollActiveTabItemIntoView=(n,s)=>{const r=this._getBarItemKeyByItemKey(this.props.activeKey);this.scrollTabItemIntoViewByKey(r,n,s)},this.renderTabComponents=n=>n.map(s=>this.renderTabItem(s)),this.handleArrowClick=(n,s)=>{const r=s==="start"?n.pop():n.shift();if(!r)return;const o=this._getBarItemKeyByItemKey(r.itemKey);this.scrollTabItemIntoViewByKey(o)},this.renderCollapse=(n,s,r)=>{var o;const l=M({[`${U.TABS_BAR}-arrow-${r}`]:r,[`${U.TABS_BAR}-arrow`]:!0});if(li(n))return b.createElement("div",{role:"presentation",className:l},b.createElement(Ft,{disabled:!0,icon:s,theme:"borderless"}));const{dropdownClassName:c,dropdownStyle:d,showRestInDropdown:u,dropdownProps:h}=this.props,{rePosKey:g}=this.state,m=!n.length,y=b.createElement(Fe.Menu,null,n.map(v=>{const{icon:w,tab:_,itemKey:O}=v,I=w?this.renderIcon(v.icon):null;return b.createElement(Fe.Item,{key:O,onClick:E=>this.handleItemClick(O,E),active:this._isActive(O)},I,_)})),p=b.createElement("div",{role:"presentation",className:l,onClick:v=>this.handleArrowClick(n,r)},b.createElement(Ft,{disabled:m,icon:s,theme:"borderless"})),f=M(c,{[`${U.TABS_BAR}-dropdown`]:!0}),S=(o=h==null?void 0:h[r])!==null&&o!==void 0?o:{};return b.createElement(b.Fragment,null,u?b.createElement(Fe,Object.assign({className:f,clickToHide:!0,clickTriggerToHide:!0,key:`${g}-${r}`,position:r==="start"?"bottomLeft":"bottomRight",render:m?null:y,showTick:!0,style:d,trigger:"hover",disableFocusListener:!0},S),p):p)},this.renderOverflow=n=>n.map((s,r)=>{const o=r===0?"start":"end",l=r===0?b.createElement(bi,null):b.createElement(js,null),c=this.renderCollapse(s,l,o);return this.props.renderArrow?this.props.renderArrow(s,o,()=>this.handleArrowClick(s,o),c):c}),this.renderCollapsedTab=()=>{const{list:n}=this.props,s=n.map(r=>{const{itemKey:o}=r;return Object.assign({key:this._getBarItemKeyByItemKey(o),active:this._isActive(o)},r)});return b.createElement(Qe,{items:s,overflowRenderDirection:this.props.arrowPosition,wrapperStyle:this.props.visibleTabsStyle,overflowRenderer:this.renderOverflow,renderMode:"scroll",className:`${U.TABS_BAR}-overflow-list`,visibleItemRenderer:this.renderTabItem,onVisibleStateChange:r=>{var o,l;const c=new Map;if(r.forEach((d,u)=>{c.set(this._getItemKeyByBarItemKey(u),d)}),this.isFirstShowInViewport&&Array.from(c.values()).some(u=>u)&&(this.scrollActiveTabItemIntoView("nearest","auto"),this.isFirstShowInViewport=!1),this.props.collapsible==="auto"&&Array.from(c.values()).some(u=>u)){const u=Array.from(c.values()).some(h=>!h);u!==this.state.shouldCollapse&&this.setState({shouldCollapse:u})}(l=(o=this.props).onVisibleTabsChange)===null||l===void 0||l.call(o,c)}})},this.renderWithMoreTrigger=()=>{const{list:n,more:s}=this.props;let r=[],o=b.createElement("div",{className:M({[`${U.TABS_BAR}-more-trigger`]:!0,[`${U.TABS_BAR}-more-trigger-${this.props.type}`]:!0})},b.createElement(Ee,{componentName:"Tabs"},(c,d)=>b.createElement("div",{className:`${U.TABS_BAR}-more-trigger-content`},b.createElement("div",null,c.more),b.createElement(Ms,{className:`${U.TABS_BAR}-more-trigger-content-icon`})))),l;if(typeof s=="number")l=n.length-Math.min(s,n.length),r=n.slice(0,l).map(c=>this.renderTabItem(c));else if(typeof s=="object")l=n.length-Math.min(s.count,n.length),r=n.slice(0,l).map(c=>this.renderTabItem(c)),s.render&&(o=s.render());else if(s!==void 0)throw new Error("[Semi Tabs]: invalid tab props format: more");return b.createElement(b.Fragment,null,r,this.renderMoreDropdown(n.slice(l),s==null?void 0:s.dropdownProps,o))},this.renderMoreDropdown=(n,s,r)=>b.createElement(Fe,Object.assign({trigger:"hover",showTick:!0,position:"bottomLeft",className:`${U.TABS_BAR}-more-dropdown-${this.props.type}`,clickToHide:!0,menu:n.map(o=>({node:"item",name:o.tab,icon:o.icon,onClick:l=>this.props.onTabClick(o.itemKey,l),active:this.props.activeKey===o.itemKey}))},s),r),this._isActive=n=>n===this.props.activeKey,this._getBarItemKeyByItemKey=n=>`${n}-bar`,this._getItemKeyByBarItemKey=n=>n.replace(/-bar$/,""),this.state={endInd:e.list.length,rePosKey:0,startInd:0,uuid:"",currentVisibleItems:[],shouldCollapse:!1},this.isFirstShowInViewport=!0,this.tabBarRef=L.createRef()}componentDidMount(){this.setState({uuid:tl()}),this.props.collapsible==="auto"&&requestAnimationFrame(()=>this.checkOverflow())}componentDidUpdate(e){e.activeKey!==this.props.activeKey&&this.getEffectiveCollapsible()&&this.scrollActiveTabItemIntoView(),this.props.collapsible==="auto"&&e.list!==this.props.list&&this.checkOverflow()}renderIcon(e){return b.createElement("span",null,e)}renderExtra(){const{tabBarExtraContent:e,type:t,size:n}=this.props,s={float:"right"},r=e&&e.props?e.props.style:{},o=M(U.TABS_BAR_EXTRA,{[`${U.TABS_BAR}-${t}-extra`]:t,[`${U.TABS_BAR}-${t}-extra-${n}`]:n});if(e){const l=Object.assign(Object.assign({},s),r);return b.createElement("div",{className:o,style:l,"x-semi-prop":"tabBarExtraContent"},e)}return null}render(){const e=this.props,{type:t,style:n,className:s,list:r,tabPosition:o,more:l,collapsible:c}=e,d=wh(e,["type","style","className","list","tabPosition","more","collapsible"]),u=this.getEffectiveCollapsible(),h=M(s,{[U.TABS_BAR]:!0,[U.TABS_BAR_LINE]:t==="line",[U.TABS_BAR_CARD]:t==="card",[U.TABS_BAR_BUTTON]:t==="button",[U.TABS_BAR_SLASH]:t==="slash",[`${U.TABS_BAR}-${o}`]:o,[`${U.TABS_BAR}-collapse`]:u}),g=this.renderExtra(),m=u?this.renderCollapsedTab():l?this.renderWithMoreTrigger():this.renderTabComponents(r),y=b.createElement("div",Object.assign({role:"tablist","aria-orientation":o==="left"?"vertical":"horizontal",className:h,style:n},qt(d),{"data-uuid":this.state.uuid,ref:this.tabBarRef}),m,g);return c==="auto"?b.createElement(Pt,{onResize:this.handleResize},y):y}}Is.propTypes={activeKey:a.string,className:a.string,collapsible:a.oneOfType([a.bool,a.oneOf(["auto"])]),list:a.array,onTabClick:a.func,size:a.oneOf(Xe.SIZE),style:a.object,tabBarExtraContent:a.node,tabPosition:a.oneOf(Xe.POSITION_MAP),type:a.oneOf(Xe.TYPE_MAP),closable:a.bool,deleteTabItem:a.func,more:a.oneOfType([a.number,a.object])};const ua=b.createContext({});var vh=function(i,e){var t={};for(var n in i)Object.prototype.hasOwnProperty.call(i,n)&&e.indexOf(n)<0&&(t[n]=i[n]);if(i!=null&&typeof Object.getOwnPropertySymbols=="function")for(var s=0,n=Object.getOwnPropertySymbols(i);s{if(t!==null&&e!==null&&Array.isArray(n)&&n.length){const r=n.findIndex(c=>c.itemKey===e),o=n.findIndex(c=>c.itemKey===t),l=n.findIndex(c=>c.itemKey===s);return r===o?l>r:o{const{itemKey:e}=this.props,{activeKey:t,lazyRender:n}=this.context,s=t===e;return this._active=this._active||s,n?this._active:!0}}render(){const{tabPaneMotion:e,tabPosition:t,prevActiveKey:n}=this.context,s=this.props,{className:r,style:o,children:l,itemKey:c,tabIndex:d}=s,u=vh(s,["className","style","children","itemKey","tabIndex"]),h=this.context.activeKey===c,g=M(r,{[U.TABS_PANE_INACTIVE]:!h,[U.TABS_PANE_ACTIVE]:h,[U.TABS_PANE]:!0}),m=this.shouldRender(),y=(()=>{const S=this.getDirection(this.context.activeKey,c,this.context.panes,n);return t==="top"?S?U.TABS_PANE_ANIMATE_RIGHT_SHOW:U.TABS_PANE_ANIMATE_LEFT_SHOW:S?U.TABS_PANE_ANIMATE_BOTTOM_SHOW:U.TABS_PANE_ANIMATE_TOP_SHOW})(),p=!this.context.panes.find(S=>S.itemKey===n),f=e&&h&&!p&&!this.context.forceDisableMotion;return b.createElement("div",Object.assign({ref:this.ref,role:"tabpanel",id:`semiTabPanel${c}`,"aria-labelledby":`semiTab${c}`,className:g,style:o,"aria-hidden":h?"false":"true",tabIndex:d||0},qt(u),{"x-semi-prop":"children"}),b.createElement(hi,{motion:f,animationState:h?"enter":"leave",startClassName:y},S=>{let{animationClassName:v,animationEventsNeedBind:w}=S;return b.createElement("div",Object.assign({className:M(U.TABS_PANE_MOTION_OVERLAY,v),"x-semi-prop":"children"},w),m?l:null)}))}}dn.isTabPane=!0;dn.contextType=ua;dn.propTypes={className:a.string,style:a.object,children:a.node,disabled:a.bool,itemKey:a.string,tab:a.node,icon:a.node,closable:a.bool};var Ch=function(i,e){var t={};for(var n in i)Object.prototype.hasOwnProperty.call(i,n)&&e.indexOf(n)<0&&(t[n]=i[n]);if(i!=null&&typeof Object.getOwnPropertySymbols=="function")for(var s=0,n=Object.getOwnPropertySymbols(i);s{this.contentRef={current:t}},this.getPanes=()=>{const{tabList:t,children:n}=this.props;return Array.isArray(t)&&t.length?t:b.Children.map(n,s=>{if(s){const{tab:r,icon:o,disabled:l,itemKey:c,closable:d}=s.props;return{tab:r,icon:o,disabled:l,itemKey:c,closable:d}}})},this.onTabClick=(t,n)=>{this.foundation.handleTabClick(t,n)},this.rePosChildren=(t,n)=>{const s=[],r=b.Children.toArray(t);return t.length&&(s.push(...r.filter(o=>o.props&&o.props.itemKey===n)),s.push(...r.filter(o=>o.props&&o.props.itemKey!==n))),s},this.getActiveItem=()=>{const{activeKey:t}=this.state,{children:n,tabList:s}=this.props;return s||!Array.isArray(n)?n:b.Children.toArray(n).filter(r=>L.isValidElement(r)&&r.type&&r.type.isTabPane?r.props.itemKey===t:!0)},this.deleteTabItem=(t,n)=>{n.stopPropagation(),this.foundation.handleTabDelete(t)},this.foundation=new bh(this.adapter),this.state={activeKey:this.foundation.getDefaultActiveKey(),panes:this.getPanes(),prevActiveKey:null,forceDisableMotion:!1},this.contentRef=L.createRef(),this.contentHeight="auto"}get adapter(){return Object.assign(Object.assign({},super.adapter),{collectPane:()=>{const e=this.getPanes();this.setState({panes:e})},collectActiveKey:()=>{const{tabList:e,children:t,activeKey:n}=this.props;if(typeof n<"u")return;const{activeKey:s}=this.state,r=this.getPanes();r.findIndex(o=>o.itemKey===s)===-1&&(r.length>0?this.setState({activeKey:r[0].itemKey}):this.setState({activeKey:""}))},notifyTabClick:(e,t)=>{this.props.onTabClick(e,t)},notifyChange:e=>{this.props.onChange(e)},setNewActiveKey:e=>{this.setState({activeKey:e})},getDefaultActiveKeyFromChildren:()=>{const{tabList:e,children:t}=this.props;let n="";return(e||b.Children.toArray(t).map(r=>L.isValidElement(r)?r.props:null)).forEach(r=>{r&&!n&&!r.disabled&&(n=r.itemKey)}),n},notifyTabDelete:e=>{this.props.onTabClose&&this.props.onTabClose(e)}})}static getDerivedStateFromProps(e,t){const n={};return!Xt(e.activeKey)&&e.activeKey!==t.activeKey&&(t.prevActiveKey=t.activeKey,n.activeKey=e.activeKey),n}componentDidUpdate(e,t){const n=b.Children.toArray(e.children).map(o=>Ne(L.isValidElement(o)?o.props:null,Zo)),s=b.Children.toArray(this.props.children).map(o=>Ne(L.isValidElement(o)?o.props:null,Zo)),r=this.props.tabList||e.tabList;if(re(this.props.tabList,e.tabList)||this.foundation.handleTabListChange(),t.activeKey!==this.state.activeKey&&t.activeKey!==this.state.prevActiveKey&&this.setState({prevActiveKey:t.activeKey}),e.activeKey!==this.props.activeKey){const o=(()=>{const l=new Set(n.map(c=>c.itemKey));return s.map(c=>c.itemKey).filter(c=>!l.has(c))})();this.setState({forceDisableMotion:o.includes(this.props.activeKey)})}!re(n,s)&&!r&&this.foundation.handleTabPanesChange()}render(){const e=this.props,{children:t,className:n,collapsible:s,contentStyle:r,keepDOM:o,lazyRender:l,renderTabBar:c,showRestInDropdown:d,size:u,style:h,tabBarClassName:g,tabBarExtraContent:m,tabBarStyle:y,tabPaneMotion:p,tabPosition:f,type:S,more:v,onVisibleTabsChange:w,visibleTabsStyle:_,arrowPosition:O,renderArrow:I,dropdownProps:E}=e,k=Ch(e,["children","className","collapsible","contentStyle","keepDOM","lazyRender","renderTabBar","showRestInDropdown","size","style","tabBarClassName","tabBarExtraContent","tabBarStyle","tabPaneMotion","tabPosition","type","more","onVisibleTabsChange","visibleTabsStyle","arrowPosition","renderArrow","dropdownProps"]),{panes:N,activeKey:P}=this.state,A=M(n,{[U.TABS]:!0,[`${U.TABS}-${f}`]:f}),F=M({[U.TABS_CONTENT]:!0,[`${U.TABS_CONTENT}-${f}`]:f}),K={activeKey:P,className:g,collapsible:s,list:N,onTabClick:this.onTabClick,showRestInDropdown:d,size:u,style:y,tabBarExtraContent:m,tabPosition:f,type:S,deleteTabItem:this.deleteTabItem,handleKeyDown:this.foundation.handleKeyDown,more:v,onVisibleTabsChange:w,visibleTabsStyle:_,arrowPosition:O,renderArrow:I,dropdownProps:E},z=c?c(K,Is):b.createElement(Is,Object.assign({},K)),q=o?t:this.getActiveItem();return b.createElement("div",Object.assign({className:A,style:h},this.getDataAttr(k)),z,b.createElement(ua.Provider,{value:{activeKey:P,lazyRender:l,panes:N,tabPaneMotion:p,tabPosition:f,prevActiveKey:this.state.prevActiveKey,forceDisableMotion:this.state.forceDisableMotion}},b.createElement("div",{ref:this.setContentRef,className:F,style:Object.assign({},r)},q)))}}tt.TabPane=dn;tt.TabItem=rr;tt.propTypes={activeKey:a.string,className:a.string,collapsible:a.oneOfType([a.bool,a.oneOf(["auto"])]),contentStyle:a.oneOfType([a.object]),defaultActiveKey:a.string,keepDOM:a.bool,lazyRender:a.bool,onChange:a.func,onTabClick:a.func,renderTabBar:a.func,showRestInDropdown:a.bool,size:a.oneOf(Xe.SIZE),style:a.object,tabBarClassName:a.string,tabBarExtraContent:a.node,tabBarStyle:a.object,tabList:a.array,tabPaneMotion:a.bool,tabPosition:a.oneOf(Xe.POSITION_MAP),type:a.oneOf(Xe.TYPE_MAP),onTabClose:a.func,preventScroll:a.bool,more:a.oneOfType([a.number,a.object]),arrowPosition:a.string,renderArrow:a.func,dropdownProps:a.object};tt.__SemiComponentName__="Tabs";tt.defaultProps=ks(tt.__SemiComponentName__,{children:[],collapsible:!1,keepDOM:!0,lazyRender:!1,onChange:()=>{},onTabClick:()=>{},size:"large",tabPaneMotion:!0,tabPosition:"top",type:"line",onTabClose:()=>{},showRestInDropdown:!0,arrowPosition:"both"});export{bi as I,it as T,pl as V,_s as _,tt as a,dn as b,mr as c,Pe as d,Kt as e,js as f,Ze as g,gd as h,$t as i,We as j,Bt as k,yi as l,Jt as r}; diff --git a/frontends/desktop/dist/assets/index-gTPS8Hpa.css b/frontends/desktop/dist/assets/index-gTPS8Hpa.css new file mode 100644 index 000000000..be54af90e --- /dev/null +++ b/frontends/desktop/dist/assets/index-gTPS8Hpa.css @@ -0,0 +1 @@ +.semi-highlight-tag{color:var(--semi-color-highlight);background-color:var(--semi-color-highlight-bg);font-weight:600}.semi-space{display:inline-flex}.semi-space-vertical{flex-direction:column}.semi-space-horizontal{flex-direction:row}.semi-space-align-center{align-items:center}.semi-space-align-end{align-items:flex-end}.semi-space-align-start{align-items:flex-start}.semi-space-align-baseline{align-items:baseline}.semi-space-wrap{flex-wrap:wrap}.semi-space-tight-horizontal{column-gap:8px}.semi-space-tight-vertical{row-gap:8px}.semi-space-medium-horizontal{column-gap:16px}.semi-space-medium-vertical{row-gap:16px}.semi-space-loose-horizontal{column-gap:24px}.semi-space-loose-vertical{row-gap:24px}.semi-rtl .semi-space,.semi-portal-rtl .semi-space{direction:rtl}.semi-checkbox{box-sizing:border-box;position:relative;display:flex;align-items:flex-start;font-size:14px;line-height:20px;font-family:Inter,-apple-system,BlinkMacSystemFont,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Segoe UI,Helvetica Neue,Helvetica,Arial,sans-serif;cursor:pointer;transition:background-color var(--semi-transition_duration-none) var(--semi-transition_function-easeIn) var(--semi-transition_delay-none),border var(--semi-transition_duration-none) var(--semi-transition_function-easeIn) var(--semi-transition_delay-none);transform:scale(var(--semi-transform_scale-none));column-gap:8px}.semi-checkbox input[type=checkbox]{position:absolute;left:0;top:0;width:100%;height:100%;margin:0;opacity:0}.semi-checkbox-content{flex:1;display:flex;flex-direction:column;row-gap:4px}.semi-checkbox-addon{display:flex;flex:1;align-items:center;color:var(--semi-color-text-0);line-height:20px;-webkit-user-select:none;user-select:none}.semi-checkbox:hover .semi-checkbox-inner-display{background:var(--semi-color-fill-0);box-shadow:inset 0 0 0 1px var(--semi-color-focus-border)}.semi-checkbox:hover .semi-checkbox-inner-checked .semi-checkbox-inner-display{background:var(--semi-color-primary-hover);box-shadow:none}.semi-checkbox:active .semi-checkbox-inner-checked .semi-checkbox-inner-display{background:var(--semi-color-primary-active);box-shadow:none}.semi-checkbox.semi-checkbox-disabled:hover .semi-checkbox-inner-display,.semi-checkbox.semi-checkbox-disabled:active .semi-checkbox-inner-display{background:var(--semi-color-disabled-fill);box-shadow:inset 0 0 0 1px var(--semi-color-border)}.semi-checkbox.semi-checkbox-disabled:hover .semi-checkbox-inner-checked .semi-checkbox-inner-display,.semi-checkbox.semi-checkbox-disabled:active .semi-checkbox-inner-checked .semi-checkbox-inner-display{color:var(--semi-color-white);background:var(--semi-color-primary-disabled);box-shadow:none}.semi-checkbox-inner{position:relative;display:flex;align-items:center;width:16px;height:20px;-webkit-user-select:none;user-select:none;cursor:pointer}.semi-checkbox-inner-display{box-sizing:border-box;position:relative;width:16px;height:16px;margin:0;background:transparent;transition:background-color var(--semi-transition_duration-none) var(--semi-transition_function-easeIn) var(--semi-transition_delay-none),border var(--semi-transition_duration-none) var(--semi-transition_function-easeIn) var(--semi-transition_delay-none);box-shadow:inset 0 0 0 1px var(--semi-color-text-3);border-radius:var(--semi-border-radius-extra-small)}.semi-checkbox-inner-display .semi-icon{font-size:16px}.semi-checkbox-inner-checked .semi-checkbox-inner-display{background:var(--semi-color-primary);color:var(--semi-color-white);box-shadow:inset 0 0 0 1px var(--semi-color-primary);border-radius:var(--semi-border-radius-extra-small)}.semi-checkbox-inner-checked>.semi-checkbox-addon{color:var(--semi-color-text-0)}.semi-checkbox:hover .semi-checkbox-inner-display{background:var(--semi-color-fill-0)}.semi-checkbox:hover.semi-checkbox-indeterminate .semi-checkbox-inner-display{background:var(--semi-color-primary-hover);box-shadow:none;color:var(--semi-color-white)}.semi-checkbox:hover .semi-checkbox-inner-checked .semi-checkbox-inner-display{background:var(--semi-color-primary-hover);border-color:var(--semi-color-primary-hover);color:var(--semi-color-white)}.semi-checkbox:hover.semi-checkbox-cardType.semi-checkbox-unChecked.semi-checkbox-cardType_enable .semi-checkbox-inner-display{background:var(--semi-color-white)}.semi-checkbox:active .semi-checkbox-inner-display{background:var(--semi-color-fill-1)}.semi-checkbox:active.semi-checkbox-indeterminate .semi-checkbox-inner-display{background:var(--semi-color-primary-active);border-color:var(--semi-color-primary-active);color:var(--semi-color-white);box-shadow:none}.semi-checkbox:active .semi-checkbox-inner-checked .semi-checkbox-inner-display{background:var(--semi-color-primary-active);border-color:var(--semi-color-primary-active);color:var(--semi-color-white)}.semi-checkbox:active.semi-checkbox-cardType.semi-checkbox-unChecked.semi-checkbox-cardType_enable .semi-checkbox-inner-display{background:var(--semi-color-white)}.semi-checkbox-cardType{flex-wrap:nowrap;align-items:flex-start;border-radius:3px;padding:12px 16px;background:transparent;border:1px solid transparent}.semi-checkbox-cardType .semi-checkbox-inner{position:relative;flex-shrink:0}.semi-checkbox-cardType .semi-checkbox-inner-display{background:var(--semi-color-white)}.semi-checkbox-cardType .semi-checkbox-inner-pureCardType{opacity:0;width:0}.semi-checkbox-cardType .semi-checkbox-addon{font-weight:600;font-size:14px;line-height:20px;color:var(--semi-color-text-0)}.semi-checkbox-cardType .semi-checkbox-extra{font-weight:400;font-size:14px;line-height:20px;color:var(--semi-color-text-2)}.semi-checkbox-cardType .semi-checkbox-extra.semi-checkbox-cardType_extra_noChildren{margin-top:0}.semi-checkbox-cardType:hover{background:var(--semi-color-fill-0)}.semi-checkbox-cardType:active{background:var(--semi-color-fill-1)}.semi-checkbox-cardType_checked{background:var(--semi-color-primary-light-default);border:1px solid var(--semi-color-primary)}.semi-checkbox-cardType_checked:hover{background:var(--semi-color-primary-light-default);border-color:var(--semi-color-primary-hover)}.semi-checkbox-cardType_checked:hover .semi-checkbox-inner-checked .semi-checkbox-inner-display{box-shadow:none}.semi-checkbox-cardType_checked:active{background:var(--semi-color-primary-light-default);border-color:var(--semi-color-primary-active)}.semi-checkbox-cardType_disabled:active,.semi-checkbox-cardType_disabled:hover{background:transparent}.semi-checkbox-cardType_checked_disabled.semi-checkbox-cardType{background:var(--semi-color-primary-light-default);border:1px solid var(--semi-color-primary-disabled)}.semi-checkbox-cardType_checked_disabled.semi-checkbox-cardType:hover .semi-checkbox-inner-checked .semi-checkbox-inner-display{box-shadow:none}.semi-checkbox-indeterminate .semi-checkbox-inner-display,.semi-checkbox-checked .semi-checkbox-inner-display{background:var(--semi-color-primary);color:var(--semi-color-white);box-shadow:inset 0 0 0 1px var(--semi-color-primary);border-radius:var(--semi-border-radius-extra-small)}.semi-checkbox-indeterminate .semi-checkbox-inner-display:hover,.semi-checkbox-checked .semi-checkbox-inner-display:hover{background:var(--semi-color-primary-hover);border-color:var(--semi-color-primary-hover);color:var(--semi-color-white)}.semi-checkbox-indeterminate .semi-checkbox-inner-display:active,.semi-checkbox-checked .semi-checkbox-inner-display:active{background:var(--semi-color-primary-active);border-color:var(--semi-color-primary-active);color:var(--semi-color-white)}.semi-checkbox-indeterminate .semi-checkbox-inner-addon,.semi-checkbox-checked .semi-checkbox-inner-addon{color:var(--semi-color-text-0)}.semi-checkbox-disabled,.semi-checkbox-disabled .semi-checkbox-inner{cursor:not-allowed}.semi-checkbox-disabled .semi-checkbox-inner-display{color:var(--semi-color-white);background:var(--semi-color-disabled-fill);box-shadow:inset 0 0 0 1px var(--semi-color-border)}.semi-checkbox-disabled .semi-checkbox-inner-display:hover{color:var(--semi-color-white);background:transparent}.semi-checkbox-disabled .semi-checkbox-inner-checked{color:var(--semi-color-white)}.semi-checkbox-disabled .semi-checkbox-inner-checked .semi-checkbox-inner-display{opacity:.75;background:var(--semi-color-primary-disabled);box-shadow:inset 0 0 0 1px var(--semi-color-primary-disabled)}.semi-checkbox-disabled .semi-checkbox-inner-checked .semi-checkbox-inner-display:hover{color:var(--semi-color-white);background:var(--semi-color-primary-disabled)}.semi-checkbox-disabled .semi-checkbox-addon,.semi-checkbox-disabled .semi-checkbox-extra{color:var(--semi-color-disabled-text)}.semi-checkbox.semi-checkbox-disabled.semi-checkbox-indeterminate .semi-checkbox-inner-display{opacity:.75;background:var(--semi-color-primary-disabled);box-shadow:inset 0 0 0 1px var(--semi-color-primary-disabled);color:var(--semi-color-white)}.semi-checkbox-extra{flex-shrink:0;flex-grow:1;flex-basis:100%;box-sizing:border-box;color:var(--semi-color-text-2)}.semi-checkbox-focus{outline:2px solid var(--semi-color-primary-light-active)}.semi-checkbox-focus-border{box-shadow:inset 0 0 0 1px var(--semi-color-focus-border)}.semi-checkboxGroup{font-size:14px;line-height:20px;font-family:Inter,-apple-system,BlinkMacSystemFont,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Segoe UI,Helvetica Neue,Helvetica,Arial,sans-serif;line-height:14px}.semi-checkboxGroup .semi-checkbox.semi-checkbox-vertical{margin-bottom:16px}.semi-checkboxGroup-horizontal{display:flex;flex-wrap:wrap;gap:16px}.semi-checkboxGroup-horizontal .semi-checkbox{display:inline-flex}.semi-checkboxGroup-vertical{display:flex;flex-direction:column;row-gap:12px}.semi-checkboxGroup-vertical-cardType{row-gap:16px}.semi-checkboxGroup-vertical-pureCardType .semi-checkbox{column-gap:0}.semi-rtl .semi-checkbox,.semi-portal-rtl .semi-checkbox{direction:rtl}.semi-rtl .semi-checkbox input[type=checkbox],.semi-portal-rtl .semi-checkbox input[type=checkbox]{left:auto;right:0}.semi-rtl .semi-checkboxGroup,.semi-portal-rtl .semi-checkboxGroup{direction:rtl}.semi-overflow-list{display:flex;flex-wrap:nowrap;min-width:0}.semi-overflow-list-spacer{flex-shrink:1;width:1px}.semi-overflow-list-scroll-wrapper{display:flex;flex:1;flex-wrap:nowrap;overflow-x:scroll}.semi-rtl .semi-overflow-list,.semi-portal-rtl .semi-overflow-list{direction:rtl}.semi-page{display:flex;list-style:none;padding:0;align-items:center;font-family:Inter,-apple-system,BlinkMacSystemFont,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Segoe UI,Helvetica Neue,Helvetica,Arial,sans-serif;margin-block-start:0;margin-block-end:0}.semi-page-small{font-size:14px;line-height:20px;font-family:Inter,-apple-system,BlinkMacSystemFont,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Segoe UI,Helvetica Neue,Helvetica,Arial,sans-serif;font-weight:400;color:var(--semi-color-text-2);padding:0}.semi-page-disabled{cursor:not-allowed}.semi-page-disabled .semi-page-total{color:var(--semi-color-disabled-text)}.semi-page-item{font-size:14px;line-height:20px;font-family:Inter,-apple-system,BlinkMacSystemFont,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Segoe UI,Helvetica Neue,Helvetica,Arial,sans-serif;min-width:32px;border:0px solid transparent;cursor:pointer;-webkit-user-select:none;user-select:none;height:32px;margin-left:4px;margin-right:4px;font-weight:400;color:var(--semi-color-text-0);border-radius:var(--semi-border-radius-small);text-align:center;line-height:32px;display:flex;align-items:center;justify-content:center;transition:background-color var(--semi-transition_duration-none) var(--semi-transition_function-easeIn) var(--semi-transition_delay-none),color var(--semi-transition_duration-none) var(--semi-transition_function-easeIn) var(--semi-transition_delay-none);transform:scale(var(--semi-transform_scale-none))}.semi-page-item:hover{border-color:transparent;background-color:var(--semi-color-fill-0);color:var(--semi-color-text-0)}.semi-page-item-rest-opening{background-color:var(--semi-color-fill-0);color:var(--semi-color-text-0)}.semi-page-item:active{border-color:transparent;background-color:var(--semi-color-fill-1);color:var(--semi-color-text-0)}.semi-page-item-active{border-color:transparent;color:var(--semi-color-primary);font-weight:600;background-color:var(--semi-color-primary-light-default)}.semi-page-item-active:hover{border-color:transparent;color:var(--semi-color-primary);background-color:var(--semi-color-primary-light-default)}.semi-page-item-disabled{border-color:transparent;color:var(--semi-color-disabled-text);background-color:transparent;cursor:not-allowed}.semi-page-item-disabled:hover{background-color:transparent}.semi-page-item-small{min-width:44px;margin:0}.semi-page-item-all-disabled{border-color:transparent;color:var(--semi-color-disabled-text);background-color:transparent;cursor:not-allowed}.semi-page-item-all-disabled:hover{background-color:transparent;color:var(--semi-color-disabled-text)}.semi-page-item-all-disabled-active{background-color:var(--semi-color-disabled-fill);font-weight:600}.semi-page-item-all-disabled-active:hover{background-color:var(--semi-color-disabled-fill)}.semi-page-total{font-size:14px;line-height:20px;font-family:Inter,-apple-system,BlinkMacSystemFont,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Segoe UI,Helvetica Neue,Helvetica,Arial,sans-serif;color:var(--semi-color-text-2)}.semi-page-prev,.semi-page-next{color:var(--semi-color-tertiary);cursor:pointer}.semi-page-prev.semi-page-item-disabled,.semi-page-next.semi-page-item-disabled{color:var(--semi-color-disabled-text);cursor:not-allowed}.semi-page-quickjump{margin-left:24px;font-size:14px;line-height:20px;font-family:Inter,-apple-system,BlinkMacSystemFont,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Segoe UI,Helvetica Neue,Helvetica,Arial,sans-serif;display:flex;justify-content:center;align-items:center;flex-shrink:0;color:var(--semi-color-text-0)}.semi-page-quickjump-input-number{max-width:50px;margin-left:4px;margin-right:4px}.semi-page-quickjump-disabled{color:var(--semi-color-disabled-text)}.semi-page .semi-select,.semi-select-dropdown{-webkit-user-select:none;user-select:none}.semi-page-rest-list{padding-top:4px;padding-bottom:4px}.semi-page-rest-list>div{position:relative}.semi-page-rest-item{height:32px;line-height:32px;display:flex;justify-content:center;box-sizing:border-box;cursor:pointer}.semi-page-rest-item:hover{background-color:var(--semi-color-fill-0)}.semi-page-rest-item:active{background-color:var(--semi-color-fill-1)}.semi-rtl .semi-page,.semi-portal-rtl .semi-page{direction:rtl}.semi-rtl .semi-page-item,.semi-portal-rtl .semi-page-item{margin-right:4px;margin-left:4px}.semi-rtl .semi-page-prev,.semi-rtl .semi-page-next,.semi-portal-rtl .semi-page-prev,.semi-portal-rtl .semi-page-next{transform:scaleX(-1)}.semi-select-option{font-size:14px;line-height:20px;font-family:Inter,-apple-system,BlinkMacSystemFont,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Segoe UI,Helvetica Neue,Helvetica,Arial,sans-serif;word-break:break-all;padding:8px 12px;color:var(--semi-color-text-0);border-radius:0;position:relative;display:flex;flex-wrap:nowrap;align-items:center;cursor:pointer;box-sizing:border-box;transition:background-color var(--semi-transition_duration-none) var(--semi-transition_function-easeIn) var(--semi-transition_delay-none)}.semi-select-option-icon{width:12px;color:transparent;margin-right:8px;display:flex;justify-content:center;align-content:center}.semi-select-option-text{display:flex;flex-wrap:wrap;white-space:pre}.semi-select-option-keyword{color:var(--semi-color-primary);background-color:inherit;font-weight:600}.semi-select-option:active{background-color:var(--semi-color-fill-1)}.semi-select-option-empty{cursor:not-allowed;color:var(--semi-color-disabled-text);justify-content:center}.semi-select-option-empty:hover,.semi-select-option-empty:active{background-color:inherit}.semi-select-option-disabled{color:var(--semi-color-disabled-text);cursor:not-allowed}.semi-select-option-disabled:hover{background-color:var(--semi-color-fill-0)}.semi-select-option-selected{font-weight:600;background:transparent}.semi-select-option-selected .semi-select-option-icon{color:var(--semi-color-text-2)}.semi-select-option-focused{background-color:var(--semi-color-fill-0)}.semi-select{box-sizing:border-box;border-radius:var(--semi-border-radius-small);border:1px solid transparent;height:32px;font-weight:400;background-color:var(--semi-color-fill-0);display:inline-flex;vertical-align:middle;position:relative;outline:none;cursor:pointer;transition:background-color var(--semi-transition_duration-none) var(--semi-transition_function-easeIn) var(--semi-transition_delay-none),border var(--semi-transition_duration-none) var(--semi-transition_function-easeIn) var(--semi-transition_delay-none);transform:scale(var(--semi-transform_scale-none));max-height:300px;overflow-y:auto}.semi-select:hover{background-color:var(--semi-color-fill-1);border:1px solid transparent}.semi-select:focus{border:1px solid var(--semi-color-focus-border);background-color:var(--semi-color-fill-0);outline:0}.semi-select:active{background-color:var(--semi-color-fill-2)}.semi-select-small{height:24px;line-height:24px}.semi-select-large{min-height:40px;line-height:40px}.semi-select-large .semi-select-selection{font-size:16px;line-height:22px;font-family:Inter,-apple-system,BlinkMacSystemFont,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Segoe UI,Helvetica Neue,Helvetica,Arial,sans-serif}.semi-select-open,.semi-select-focus{border:1px solid var(--semi-color-focus-border);outline:0}.semi-select-open:hover,.semi-select-focus:hover{background-color:var(--semi-color-fill-0);border:1px solid var(--semi-color-focus-border)}.semi-select-open:active,.semi-select-focus:active{background-color:var(--semi-color-fill-2);border:1px solid var(--semi-color-focus-border)}.semi-select-warning{background-color:var(--semi-color-warning-light-default);border-color:var(--semi-color-warning-light-default)}.semi-select-warning:hover{background-color:var(--semi-color-warning-light-hover);border-color:var(--semi-color-warning-light-hover)}.semi-select-warning:focus{background-color:var(--semi-color-warning-light-default);border-color:var(--semi-color-warning)}.semi-select-warning:active{background-color:var(--semi-color-warning-light-active);border-color:var(--semi-color-warning-light-active)}.semi-select-error{background-color:var(--semi-color-danger-light-default);border-color:var(--semi-color-danger-light-default)}.semi-select-error:hover{background-color:var(--semi-color-danger-light-hover);border-color:var(--semi-color-danger-light-hover)}.semi-select-error:focus{background-color:var(--semi-color-danger-light-default);border-color:var(--semi-color-danger)}.semi-select-error:active{background-color:var(--semi-color-danger-light-active);border-color:var(--semi-color-danger-light-active)}.semi-select-disabled{cursor:not-allowed;background-color:var(--semi-color-disabled-fill)}.semi-select-disabled:hover{background-color:var(--semi-color-disabled-fill)}.semi-select-disabled:focus{border:1px solid transparent;background-color:var(--semi-color-disabled-fill)}.semi-select-disabled .semi-select-selection,.semi-select-disabled .semi-select-selection-placeholder{color:var(--semi-color-disabled-text);cursor:not-allowed}.semi-select-disabled .semi-select-arrow,.semi-select-disabled .semi-select-prefix,.semi-select-disabled .semi-select-suffix{color:var(--semi-color-disabled-text)}.semi-select-disabled .semi-tag{color:var(--semi-color-disabled-text);background-color:transparent}.semi-select-selection{font-size:14px;line-height:20px;font-family:Inter,-apple-system,BlinkMacSystemFont,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Segoe UI,Helvetica Neue,Helvetica,Arial,sans-serif;height:100%;display:flex;align-items:center;flex-grow:1;overflow:hidden;margin-left:12px;cursor:pointer;color:var(--semi-color-text-0)}.semi-select-selection-text{width:100%;overflow:hidden;text-overflow:ellipsis}.semi-select-selection-text-inactive{display:flex;opacity:.4}.semi-select-selection-text-hide{display:none}.semi-select-selection-placeholder{color:var(--semi-color-text-2)}.semi-select-selection .semi-tag{margin-top:1px;margin-right:4px;margin-bottom:1px}.semi-select-selection .semi-tag:nth-of-type(1){margin-left:0}.semi-select-selection .semi-tag-group{height:inherit}.semi-select-selection .semi-tag-group .semi-tag{margin-top:1px;margin-right:4px;margin-bottom:1px}.semi-select-content-wrapper{white-space:nowrap;overflow:hidden;display:flex;align-items:center;height:100%}.semi-select-content-wrapper-collapse{display:inline-flex;flex-shrink:0;width:100%}.semi-select-content-wrapper-collapse .semi-overflow-list-overflow{max-width:100%;min-width:50px}.semi-select-content-wrapper-collapse>.semi-select-content-wrapper-collapse-tag{background-color:transparent}.semi-select-content-wrapper-collapse>.semi-select-content-wrapper-collapse-N{background-color:transparent;padding:4px;color:var(--semi-color-text-0);font-size:12px}.semi-select-multiple{height:auto}.semi-select-multiple .semi-select-selection{margin-left:4px}.semi-select-multiple .semi-select-content-wrapper{width:100%;min-height:30px;flex-wrap:wrap}.semi-select-multiple .semi-select-content-wrapper-empty{margin-left:8px}.semi-select-multiple .semi-select-content-wrapper .semi-tag-group{display:flex;align-items:center}.semi-select-multiple .semi-select-content-wrapper-one-line{flex-wrap:nowrap}.semi-select-multiple .semi-select-content-wrapper-one-line .semi-tag-group{flex-wrap:nowrap;justify-content:flex-start;overflow:hidden;flex-shrink:0}.semi-select-multiple .semi-select-inline-label-wrapper{flex-shrink:0}.semi-select-multiple.semi-select-large .semi-select-content-wrapper{min-height:38px}.semi-select-multiple.semi-select-small .semi-select-content-wrapper{min-height:22px}.semi-select-arrow{display:flex;align-items:center;justify-content:center;width:32px;color:var(--semi-color-text-2);flex-shrink:0;transform:rotate(var(--semi-transform-rotate-none))}.semi-select-arrow-empty{display:flex;width:12px}.semi-select-prefix,.semi-select-suffix{display:flex;justify-content:center;align-items:center}.semi-select-prefix-text,.semi-select-suffix-text{margin:0 12px;color:var(--semi-color-text-2);font-size:14px;line-height:20px;font-family:Inter,-apple-system,BlinkMacSystemFont,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Segoe UI,Helvetica Neue,Helvetica,Arial,sans-serif;font-weight:600}.semi-select-prefix-icon,.semi-select-suffix-icon{color:var(--semi-color-text-2);margin:0 8px}.semi-select-suffix{display:flex;justify-content:center;align-items:center}.semi-select-clear{display:flex;justify-content:center;align-items:center;width:32px;color:var(--semi-color-text-2);flex-shrink:0}.semi-select-clear:hover{color:var(--semi-color-primary)}.semi-select-inset-label-wrapper{display:inline}.semi-select-inset-label{margin:0 12px;font-weight:600;font-size:14px;line-height:20px;font-family:Inter,-apple-system,BlinkMacSystemFont,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Segoe UI,Helvetica Neue,Helvetica,Arial,sans-serif;color:var(--semi-color-text-2);flex-shrink:0;white-space:nowrap}.semi-select-create-tips{color:var(--semi-color-text-2);margin-right:4px}.semi-select-with-prefix .semi-select-selection{margin-left:0}.semi-select-single.semi-select-filterable .semi-select-content-wrapper{flex-grow:1;height:100%;overflow:hidden;position:relative}.semi-select-single.semi-select-filterable .semi-input-wrapper{position:absolute;top:0;left:0;height:100%;width:100%;border:none;background-color:transparent}.semi-select-single.semi-select-filterable .semi-input-wrapper-focus{border:none}.semi-select-single.semi-select-filterable .semi-input{padding-left:0;padding-right:0;height:100%}.semi-select-multiple.semi-select-filterable .semi-select-content-wrapper{flex-grow:1;height:100%;overflow:hidden;position:relative}.semi-select-multiple.semi-select-filterable .semi-select-content-wrapper:not(.semi-select-content-wrapper-empty) .semi-input-wrapper{height:24px;line-height:24px}.semi-select-multiple.semi-select-filterable .semi-select-content-wrapper:not(.semi-select-content-wrapper-empty) .semi-input-wrapper .semi-input-default{height:24px}.semi-select-multiple.semi-select-filterable .semi-select-content-wrapper-empty .semi-input-wrapper{position:absolute;top:0;left:0;height:100%}.semi-select-multiple.semi-select-filterable .semi-select-content-wrapper-empty .semi-input-wrapper .semi-input-default{height:100%}.semi-select-multiple.semi-select-filterable .semi-input-wrapper{height:100%;width:100%;border:none;background-color:transparent}.semi-select-multiple.semi-select-filterable .semi-input-wrapper-focus{border:none}.semi-select-multiple.semi-select-filterable .semi-input{padding-left:0;padding-right:0}.semi-select-multiple.semi-select-filterable.semi-select-large .semi-select-content-wrapper:not(.semi-select-content-wrapper-empty) .semi-input-wrapper-large{height:24px;line-height:24px}.semi-select-multiple.semi-select-filterable.semi-select-large .semi-select-content-wrapper:not(.semi-select-content-wrapper-empty) .semi-input-wrapper-large .semi-input-large{height:24px}.semi-select-multiple.semi-select-filterable.semi-select-small .semi-select-content-wrapper:not(.semi-select-content-wrapper-empty) .semi-input-wrapper{height:20px;line-height:20px}.semi-select-multiple.semi-select-filterable.semi-select-small .semi-select-content-wrapper:not(.semi-select-content-wrapper-empty) .semi-input-wrapper .semi-input-small{height:20px}.semi-select-option-list-wrapper{padding:4px 0}.semi-select-option-list{overflow-x:hidden;overflow-y:auto}.semi-select-option-list-chosen .semi-select-option-icon{display:flex}.semi-select-group{color:var(--semi-color-text-2);margin-top:4px;padding:12px 16px 4px 32px;font-size:12px;line-height:16px;font-family:Inter,-apple-system,BlinkMacSystemFont,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Segoe UI,Helvetica Neue,Helvetica,Arial,sans-serif;cursor:default}.semi-select-group:not(:nth-of-type(1)){border-top:1px solid var(--semi-color-border)}.semi-select-loading-wrapper{padding:8px 16px;cursor:not-allowed;height:20px;box-sizing:content-box}.semi-select-borderless:not(:focus-within):not(:hover){background-color:transparent;border-color:transparent}.semi-select-borderless:not(:focus-within):not(:hover) .semi-select-arrow{opacity:0}.semi-select-borderless:focus-within:not(:active){background-color:transparent}.semi-select-borderless.semi-select-error:not(:focus-within){border-color:var(--semi-color-danger)}.semi-select-borderless.semi-select-warning:not(:focus-within){border-color:var(--semi-color-warning)}.semi-select-borderless.semi-select-error:focus-within{border-color:var(--semi-color-danger)}.semi-select-borderless.semi-select-warning:focus-within{border-color:var(--semi-color-warning)}.semi-select-dropdown-search-wrapper{padding:8px 12px;border-bottom:1px solid transparent}.semi-rtl .semi-select,.semi-portal-rtl .semi-select{direction:rtl}.semi-rtl .semi-select-selection,.semi-portal-rtl .semi-select-selection{margin-left:0;margin-right:12px}.semi-rtl .semi-select-selection .semi-tag:nth-of-type(1),.semi-portal-rtl .semi-select-selection .semi-tag:nth-of-type(1){margin-right:0}.semi-rtl .semi-select-selection .semi-tag-group .semi-tag,.semi-portal-rtl .semi-select-selection .semi-tag-group .semi-tag{margin-left:4px;margin-right:0}.semi-rtl .semi-select-multiple .semi-select-selection,.semi-portal-rtl .semi-select-multiple .semi-select-selection{margin-left:0;margin-right:4px}.semi-rtl .semi-select-multiple .semi-select-content-wrapper-empty,.semi-portal-rtl .semi-select-multiple .semi-select-content-wrapper-empty{margin-left:0;margin-right:8px}.semi-rtl .semi-select-create-tips,.semi-portal-rtl .semi-select-create-tips{margin-right:0;margin-left:4px}.semi-rtl .semi-select-with-prefix .semi-select-selection,.semi-portal-rtl .semi-select-with-prefix .semi-select-selection{margin-left:auto;margin-right:0}.semi-rtl .semi-select-single.semi-select-filterable .semi-input-wrapper,.semi-portal-rtl .semi-select-single.semi-select-filterable .semi-input-wrapper,.semi-rtl .semi-select-multiple.semi-select-filterable .semi-select-content-wrapper-empty .semi-input-wrapper,.semi-portal-rtl .semi-select-multiple.semi-select-filterable .semi-select-content-wrapper-empty .semi-input-wrapper{left:auto;right:0}.semi-rtl .semi-select-group,.semi-portal-rtl .semi-select-group{padding-left:32px;padding-right:16px}.semi-rtl .semi-select-option-icon,.semi-portal-rtl .semi-select-option-icon{margin-right:0;margin-left:8px}.semi-table-panel-operation{background-color:var(--semi-color-primary);padding:8px 16px;display:flex;justify-content:space-between;color:var(--semi-color-text-2)}.semi-table-panel-operation-right,.semi-table-panel-operation-left{display:flex;justify-content:space-between}.semi-table-panel-operation-selected{color:var(--semi-color-primary-light-active)}.semi-table-pagination-info{font-size:14px;line-height:20px;font-family:Inter,-apple-system,BlinkMacSystemFont,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Segoe UI,Helvetica Neue,Helvetica,Arial,sans-serif;font-weight:400}.semi-table-pagination-outer{display:flex;justify-content:space-between;align-items:center}.semi-table{width:100%;text-align:left;border-collapse:separate;border-spacing:0;font-size:inherit;display:table}.semi-table-wrapper{zoom:1;position:relative;clear:both;box-sizing:border-box;margin:0;padding:0;font-size:14px;line-height:20px;font-family:Inter,-apple-system,BlinkMacSystemFont,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Segoe UI,Helvetica Neue,Helvetica,Arial,sans-serif;color:var(--semi-color-text-0);width:100%}.semi-table-wrapper[data-column-fixed=true]{z-index:1}.semi-table-wrapper-ltr,.semi-table-wrapper-ltr .semi-spin{direction:ltr}.semi-table-middle .semi-table-tbody>.semi-table-row>.semi-table-row-cell{padding-top:12px;padding-bottom:12px}.semi-table-small .semi-table-tbody>.semi-table-row>.semi-table-row-cell{padding-top:8px;padding-bottom:8px}.semi-table-title{position:relative;padding:16px 0}.semi-table-container{position:relative}.semi-table-header{overflow:hidden;scrollbar-base-color:transparent}.semi-table-header::-webkit-scrollbar{background-color:transparent;border-bottom:2px solid var(--semi-color-border)}.semi-table-header-sticky{position:sticky;z-index:102}.semi-table-header-sticky .semi-table-thead>.semi-table-row>.semi-table-row-head{background-color:var(--semi-color-bg-1)}.semi-table-header-hidden{height:0}.semi-table-align-center .semi-table-operate-wrapper{justify-content:center}.semi-table-align-right .semi-table-operate-wrapper{justify-content:flex-end}.semi-table-operate-wrapper{display:flex;justify-content:flex-start}.semi-table-body{overflow:auto;width:100%;box-sizing:border-box}.semi-table-colgroup{display:table-column-group}.semi-table-colgroup .semi-table-col{display:table-column}.semi-table-colgroup .semi-table-column-expand,.semi-table-colgroup .semi-table-column-selection{width:48px}.semi-table-thead>.semi-table-row>.semi-table-row-head{background-color:var(--semi-color-bg-1);color:var(--semi-color-text-2);font-weight:600;text-align:left;border-bottom:2px solid var(--semi-color-border);padding:8px 16px;vertical-align:middle;overflow-wrap:break-word;position:relative;transition:background-color var(--semi-transition_duration-none) linear}.semi-table-thead>.semi-table-row>.semi-table-row-head.semi-table-row-head-clickSort{cursor:pointer}.semi-table-thead>.semi-table-row>.semi-table-row-head.semi-table-row-head-clickSort:hover{background-image:linear-gradient(0deg,var(--semi-color-fill-0),var(--semi-color-fill-0));background-color:var(--semi-color-bg-0)}.semi-table-thead>.semi-table-row>.semi-table-row-head.semi-table-cell-fixed-left,.semi-table-thead>.semi-table-row>.semi-table-row-head.semi-table-cell-fixed-right{z-index:101;position:sticky;background-color:var(--semi-color-bg-1)}.semi-table-thead>.semi-table-row>.semi-table-row-head.semi-table-cell-fixed-left-last{border-right:1px solid var(--semi-color-border);box-shadow:3px 0 0 0 var(--semi-color-shadow)}.semi-table-thead>.semi-table-row>.semi-table-row-head.semi-table-cell-fixed-left-last.resizing{border-right:2px solid var(--semi-color-primary)}.semi-table-thead>.semi-table-row>.semi-table-row-head.semi-table-cell-fixed-left-last.resizing .react-resizable-handle:hover{background-color:unset}.semi-table-thead>.semi-table-row>.semi-table-row-head.semi-table-cell-fixed-right-first{border-left:1px solid var(--semi-color-border);box-shadow:-3px 0 0 0 var(--semi-color-shadow)}.semi-table-thead>.semi-table-row>.semi-table-row-head.semi-table-cell-fixed-right-first.resizing{border-right:2px solid var(--semi-color-primary)}.semi-table-thead>.semi-table-row>.semi-table-row-head.semi-table-cell-fixed-right-first.resizing .react-resizable-handle:hover{background-color:unset}.semi-table-thead>.semi-table-row>.semi-table-row-head.semi-table-cell-fixed-right-first[x-type=column-scrollbar]{box-shadow:none;border-left:transparent}.semi-table-thead>.semi-table-row>.semi-table-row-head.semi-table-column-selection{text-align:center}.semi-table-thead>.semi-table-row>.semi-table-row-head[colspan]:not([colspan="1"]){text-align:center}.semi-table-thead>.semi-table-row>.semi-table-row-head .semi-table-header-column{display:inline-flex;align-items:center}.semi-table-thead>.semi-table-row>.semi-table-row-head-ellipsis{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.semi-table-thead>.semi-table-row>.semi-table-row-head-ellipsis .semi-table-row-head-title{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.semi-table-thead>.semi-table-row .react-resizable{position:relative;background-clip:padding-box}.semi-table-thead>.semi-table-row .resizing{border-right:2px solid var(--semi-color-primary)}.semi-table-thead>.semi-table-row .resizing .react-resizable-handle:hover{background-color:unset}.semi-table-thead>.semi-table-row .react-resizable-handle{position:absolute;width:9px;height:calc(100% - 8px);background-color:var(--semi-color-border);bottom:4px;right:-1px;cursor:col-resize;z-index:0}.semi-table-thead>.semi-table-row .react-resizable-handle:hover{background-color:var(--semi-color-primary)}.semi-table-tbody{display:table-row-group}.semi-table-tbody>.semi-table-row{display:table-row;background-color:var(--semi-color-bg-1)}.semi-table-tbody>.semi-table-row.semi-table-row-hovered>.semi-table-row-cell{background-image:linear-gradient(0deg,var(--semi-color-fill-0),var(--semi-color-fill-0));background-color:var(--semi-color-bg-0)}.semi-table-tbody>.semi-table-row.semi-table-row-hovered>.semi-table-row-cell.semi-table-cell-fixed-left,.semi-table-tbody>.semi-table-row.semi-table-row-hovered>.semi-table-row-cell.semi-table-cell-fixed-right{background-image:linear-gradient(0deg,var(--semi-color-fill-0),var(--semi-color-fill-0));background-color:var(--semi-color-bg-1)}.semi-table-tbody>.semi-table-row:hover>.semi-table-row-cell{background-image:linear-gradient(0deg,var(--semi-color-fill-0),var(--semi-color-fill-0));background-color:var(--semi-color-bg-0)}.semi-table-tbody>.semi-table-row:hover>.semi-table-row-cell.semi-table-cell-fixed-left,.semi-table-tbody>.semi-table-row:hover>.semi-table-row-cell.semi-table-cell-fixed-right{background-image:linear-gradient(0deg,var(--semi-color-fill-0),var(--semi-color-fill-0));background-color:var(--semi-color-bg-1)}.semi-table-tbody>.semi-table-row>.semi-table-row-cell{display:table-cell;overflow-wrap:break-word;border-left:none;border-right:none;border-bottom:1px solid var(--semi-color-border);padding:16px;box-sizing:border-box;position:relative;vertical-align:middle}.semi-table-tbody>.semi-table-row>.semi-table-row-cell.resizing{border-right:2px solid var(--semi-color-primary)}.semi-table-tbody>.semi-table-row>.semi-table-row-cell-ellipsis{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.semi-table-tbody>.semi-table-row.semi-table-row-expand>.semi-table-row-cell{background-color:var(--semi-color-fill-0)}.semi-table-tbody>.semi-table-row.semi-table-row-hidden{display:none}.semi-table-tbody>.semi-table-row>.semi-table-cell-fixed-left,.semi-table-tbody>.semi-table-row>.semi-table-cell-fixed-right{z-index:101;position:sticky;background-color:var(--semi-color-bg-1)}.semi-table-tbody>.semi-table-row>.semi-table-cell-fixed-left-last{border-right:1px solid var(--semi-color-border);box-shadow:3px 0 0 0 var(--semi-color-shadow)}.semi-table-tbody>.semi-table-row>.semi-table-cell-fixed-right-first{border-left:1px solid var(--semi-color-border);box-shadow:-3px 0 0 0 var(--semi-color-shadow)}.semi-table-tbody>.semi-table-row>.semi-table-cell-fixed>*{transition:background-color var(--semi-transition_duration-none) var(--semi-transition_function-easeOut) 0ms}.semi-table-tbody>.semi-table-row>*{transition:background-color var(--semi-transition_duration-none) var(--semi-transition_function-easeOut) 0ms}.semi-table-tbody>.semi-table-row-section{display:table-row}.semi-table-tbody>.semi-table-row-section>.semi-table-row-cell{background-color:rgba(var(--semi-grey-0),1);border-bottom:1px solid var(--semi-color-border)}.semi-table-tbody>.semi-table-row-section>.semi-table-row-cell:not(.semi-table-column-selection){padding:10px 16px}.semi-table-tbody>.semi-table-row-section .semi-table-section-inner{display:inline-flex;align-items:center}.semi-table-virtualized .semi-table-tbody{display:block}.semi-table-virtualized .semi-table-tbody>.semi-table-row{display:flex}.semi-table-virtualized .semi-table-tbody>.semi-table-row>.semi-table-row-cell{word-wrap:unset;word-break:unset;white-space:nowrap;display:inline-flex;align-items:center;overflow:hidden}.semi-table-virtualized .semi-table-tbody>.semi-table-row-section>.semi-table-row-cell{padding-top:16px;padding-bottom:16px;display:flex}.semi-table-virtualized .semi-table-tbody>.semi-table-row-expand>.semi-table-row-cell{padding:0;overflow:unset}.semi-table-footer{background-color:var(--semi-color-fill-0);padding:16px;margin:0;position:relative}.semi-table .semi-table-selection-wrap{display:inline-flex;vertical-align:bottom}.semi-table .semi-table-selection-disabled{cursor:not-allowed}.semi-table .semi-table-selection-disabled>.semi-checkbox{pointer-events:none}.semi-table .semi-table-column-hidden{display:none}.semi-table .semi-table-column-selection{text-align:center}.semi-table .semi-table-column-selection .semi-checkbox-inner-display .semi-icon{left:0;top:0}.semi-table .semi-table-column-expand .semi-table-expand-icon{transform:translateY(2px)}.semi-table .semi-table-column-expand .semi-table-expand-icon:last-child{margin-right:0}.semi-table .semi-table-column-sorter{display:inline-block;width:16px;height:16px;vertical-align:middle;text-align:center}.semi-table .semi-table-column-sorter-wrapper{display:flex;gap:4px;align-items:center;cursor:pointer;overflow:hidden}.semi-table .semi-table-column-sorter-up,.semi-table .semi-table-column-sorter-down{height:0;display:block;color:var(--semi-color-text-2)}.semi-table .semi-table-column-sorter-up:hover .anticon,.semi-table .semi-table-column-sorter-down:hover .anticon{color:var(--semi-color-text-2)}.semi-table .semi-table-column-sorter-up svg,.semi-table .semi-table-column-sorter-down svg{width:16px;height:16px}.semi-table .semi-table-column-sorter-up.on .semi-icon-caretup,.semi-table .semi-table-column-sorter-up.on .semi-icon-caretdown,.semi-table .semi-table-column-sorter-down.on .semi-icon-caretup,.semi-table .semi-table-column-sorter-down.on .semi-icon-caretdown{color:var(--semi-color-primary)}.semi-table .semi-table-column-filter{margin-left:4px;display:inline-flex;cursor:pointer;color:var(--semi-color-text-2);align-items:center}.semi-table .semi-table-column-filter svg{width:16px;height:16px}.semi-table .semi-table-column-filter.on{color:var(--semi-color-primary)}.semi-table-bordered>.semi-table-title{padding-left:16px;padding-right:16px;border-top:1px solid var(--semi-color-border);border-right:1px solid var(--semi-color-border);border-left:1px solid var(--semi-color-border)}.semi-table-bordered>.semi-table-container{border:1px solid var(--semi-color-border);border-right:0;border-bottom:0}:where(.semi-table-bordered)>.semi-table-container>.semi-table-header::-webkit-scrollbar{border-right:1px solid var(--semi-color-border)}:where(.semi-table-bordered)>.semi-table-container>.semi-table-footer{border-left:1px solid var(--semi-color-border);border-right:1px solid var(--semi-color-border);border-bottom:1px solid var(--semi-color-border)}.semi-table-bordered:not(.semi-table-scroll-position-right)>.semi-table-container:after{content:"";position:absolute;top:0;right:0;bottom:0;width:1px;background-color:var(--semi-color-border);display:block;z-index:103;pointer-events:none}.semi-table-bordered:not(.semi-table-scroll-position-right)>.semi-table-container>.semi-table-header{box-shadow:inset -1px 0 0 0 var(--semi-color-border)}:where(.semi-table-bordered>.semi-table-container)>.semi-table-body>.semi-table-placeholder{border-right:1px solid var(--semi-color-border)}:where(.semi-table-bordered>.semi-table-container>.semi-table-body)>.semi-table>.semi-table-thead>.semi-table-row>.semi-table-row-head .react-resizable-handle{background-color:transparent}:where(.semi-table-bordered>.semi-table-container>.semi-table-body)>.semi-table>.semi-table-thead>.semi-table-row>.semi-table-row-head,:where(.semi-table-bordered>.semi-table-container>.semi-table-body)>.semi-table>.semi-table-tbody>.semi-table-row>.semi-table-row-cell{border-right:1px solid var(--semi-color-border)}:where(.semi-table-bordered>.semi-table-container>.semi-table-header)>.semi-table>.semi-table-thead>.semi-table-row>.semi-table-row-head{border-right:1px solid var(--semi-color-border)}:where(.semi-table-bordered>.semi-table-container>.semi-table-header)>.semi-table>.semi-table-thead>.semi-table-row>.semi-table-row-head .react-resizable-handle{background-color:transparent}.semi-table-placeholder{position:sticky;left:0;z-index:1;box-sizing:border-box;padding:16px 12px;color:var(--semi-color-text-2);font-size:14px;text-align:center;background:transparent;border-bottom:1px solid var(--semi-color-border)}.semi-table-fixed{table-layout:fixed;min-width:100%}.semi-table-fixed>.semi-table-tbody>.semi-table-row-expand>.semi-table-row-cell>.semi-table-expand-inner,.semi-table-fixed>.semi-table-tbody>.semi-table-row-section>.semi-table-row-cell>.semi-table-section-inner{position:sticky;overflow:auto;left:0;margin-left:-16px;margin-right:-16px;padding-left:16px;padding-right:16px;height:100%;display:flex;align-items:center}.semi-table-fixed-header table{table-layout:fixed}.semi-table-scroll-position-left .semi-table-tbody>.semi-table-row>.semi-table-cell-fixed-left-last,.semi-table-scroll-position-left .semi-table-thead>.semi-table-row>.semi-table-cell-fixed-left-last{box-shadow:none}.semi-table-scroll-position-right .semi-table-tbody>.semi-table-row>.semi-table-cell-fixed-right-first,.semi-table-scroll-position-right .semi-table-thead>.semi-table-row>.semi-table-cell-fixed-right-first{box-shadow:none}.semi-table-pagination-outer{color:var(--semi-color-text-2);min-height:60px}.semi-table-expand-icon{color:var(--semi-color-text-2);cursor:pointer;display:inline-flex;align-items:center;-webkit-user-select:none;user-select:none;background:transparent;position:relative;margin-right:8px}.semi-table-expand-icon-cell{display:inline-flex;align-items:center;justify-content:center}.semi-table-expand-icon .semi-table-expandedIcon-show{transition:transform .15s cubic-bezier(.62,.05,.36,.95);transform:rotate(90deg)}.semi-table-expand-icon .semi-table-expandedIcon-hide{transition:transform .15s cubic-bezier(.62,.05,.36,.95);transform:rotate(0)}.semi-table-column-filter-dropdown .semi-dropdown-menu{max-height:290px;overflow-y:auto}.semi-table-wrapper-rtl .semi-table{direction:rtl;text-align:right}.semi-table-wrapper-rtl .semi-table-align-left .semi-table-operate-wrapper{justify-content:flex-end}.semi-table-wrapper-rtl .semi-table-align-right .semi-table-operate-wrapper{justify-content:flex-start}.semi-table-wrapper-rtl .semi-table-thead>.semi-table-row>.semi-table-row-head{text-align:right}.semi-table-wrapper-rtl .semi-table-thead>.semi-table-row>.semi-table-row-head.semi-table-cell-fixed-left-last{border-right:0;border-left:1px solid var(--semi-color-border)}.semi-table-wrapper-rtl .semi-table-thead>.semi-table-row>.semi-table-row-head.semi-table-cell-fixed-left-last.resizing{border-left:2px solid var(--semi-color-primary)}.semi-table-wrapper-rtl .semi-table-thead>.semi-table-row>.semi-table-row-head.semi-table-cell-fixed-right-first{border-left:0;border-right:1px solid var(--semi-color-border)}.semi-table-wrapper-rtl .semi-table-thead>.semi-table-row>.semi-table-row-head.semi-table-cell-fixed-right-first.resizing{border-left:2px solid var(--semi-color-primary)}.semi-table-wrapper-rtl .semi-table-thead>.semi-table-row>.semi-table-row-head.semi-table-cell-fixed-right-first[x-type=column-scrollbar]{box-shadow:none;border-right:transparent}.semi-table-wrapper-rtl .semi-table-thead>.semi-table-row .resizing{border-left:2px solid var(--semi-color-primary)}.semi-table-wrapper-rtl .semi-table-thead>.semi-table-row .react-resizable-handle{right:auto;left:-1px}.semi-table-wrapper-rtl .semi-table-tbody{display:table-row-group}.semi-table-wrapper-rtl .semi-table-tbody>.semi-table-row>.semi-table-row-cell.resizing{border-right:0;border-left:2px solid var(--semi-color-primary)}.semi-table-wrapper-rtl .semi-table-tbody>.semi-table-row>.semi-table-cell-fixed-left-last{border-right:0;border-left:1px solid var(--semi-color-border)}.semi-table-wrapper-rtl .semi-table-tbody>.semi-table-row>.semi-table-cell-fixed-right-first{border-left:0;border-right:1px solid var(--semi-color-border)}.semi-table-wrapper-rtl .semi-table .semi-table-column-selection .semi-checkbox-inner-display .semi-icon{left:auto;right:0}.semi-table-wrapper-rtl .semi-table .semi-table-column-expand .semi-table-expand-icon{transform:scaleX(-1) translateY(2px)}.semi-table-wrapper-rtl .semi-table .semi-table-column-expand .semi-table-expand-icon:last-child{margin-right:auto;margin-left:0}.semi-table-wrapper-rtl .semi-table .semi-table-column-sorter,.semi-table-wrapper-rtl .semi-table .semi-table-column-filter{margin-left:0;margin-right:4px}.semi-table-wrapper-rtl .semi-table-bordered .semi-table-container{border-left:0;border-right:1px solid var(--semi-color-border)}.semi-table-wrapper-rtl .semi-table-bordered .semi-table-thead>.semi-table-row>.semi-table-row-head,.semi-table-wrapper-rtl .semi-table-bordered .semi-table-tbody>.semi-table-row>.semi-table-row-cell{border-right:0;border-left:1px solid var(--semi-color-border)}.semi-table-wrapper-rtl .semi-table-bordered .semi-table-placeholder{border-left:1px solid var(--semi-color-border);border-right:0}.semi-table-wrapper-rtl .semi-table-bordered .semi-table-header::-webkit-scrollbar{border-right:0;border-left:1px solid var(--semi-color-border)}.semi-table-wrapper-rtl .semi-table-bordered:not(.semi-table-scroll-position-left)>.semi-table-container:after{content:"";position:absolute;top:0;left:0;bottom:0;width:1px;background-color:var(--semi-color-border);display:block;z-index:103;pointer-events:none}.semi-table-wrapper-rtl .semi-table-fixed>.semi-table-tbody>.semi-table-row-expand>.semi-table-row-cell>.semi-table-expand-inner,.semi-table-wrapper-rtl .semi-table-fixed>.semi-table-tbody>.semi-table-row-section>.semi-table-row-cell>.semi-table-section-inner{left:auto;right:0;margin-right:-16px;margin-left:-16px;padding-right:16px;padding-left:16px}.semi-table-wrapper-rtl .semi-table-scroll-position-left .semi-table-tbody>.semi-table-row>.semi-table-cell-fixed-left-last,.semi-table-wrapper-rtl .semi-table-scroll-position-left .semi-table-thead>.semi-table-row>.semi-table-cell-fixed-left-last{box-shadow:3px 0 0 0 var(--semi-color-shadow)}.semi-table-wrapper-rtl .semi-table-scroll-position-left .semi-table-tbody>.semi-table-row>.semi-table-cell-fixed-right-first,.semi-table-wrapper-rtl .semi-table-scroll-position-left .semi-table-thead>.semi-table-row>.semi-table-cell-fixed-right-first{box-shadow:none}.semi-table-wrapper-rtl .semi-table-scroll-position-right .semi-table-tbody>.semi-table-row>.semi-table-cell-fixed-left-last,.semi-table-wrapper-rtl .semi-table-scroll-position-right .semi-table-thead>.semi-table-row>.semi-table-cell-fixed-left-last{box-shadow:none}.semi-table-wrapper-rtl .semi-table-scroll-position-right .semi-table-tbody>.semi-table-row>.semi-table-cell-fixed-right-first,.semi-table-wrapper-rtl .semi-table-scroll-position-right .semi-table-thead>.semi-table-row>.semi-table-cell-fixed-right-first{box-shadow:-3px 0 0 0 var(--semi-color-shadow)}.semi-table-wrapper-rtl .semi-table-expand-icon{margin-right:auto;margin-left:8px;transform:scaleX(-1) translateY(2px)}.semi-table-wrapper-rtl .semi-spin{direction:rtl}.semi-tabs{box-sizing:border-box;position:relative}.semi-tabs-left{display:flex;flex-direction:row}.semi-tabs-bar{position:relative;white-space:nowrap;outline:none}.semi-tabs-bar-left{display:flex;flex-direction:column}.semi-tabs-bar-extra{padding:0 5px}.semi-tabs-bar-more-trigger{display:inline-block;cursor:pointer;color:var(--semi-color-text-2)}.semi-tabs-bar-more-trigger-content{display:flex;align-content:center}.semi-tabs-bar-more-trigger-content-icon:not(:not(.semi-tabs-bar-more-trigger-content-icon)){margin:0 8px;flex-shrink:0;display:flex;align-items:center}.semi-tabs-bar-more-trigger-line{padding:16px 4px 14px}.semi-tabs-bar-more-trigger-card,.semi-tabs-bar-more-trigger-button{padding:8px 12px}.semi-tabs-bar .semi-tabs-tab{font-size:14px;line-height:20px;font-family:Inter,-apple-system,BlinkMacSystemFont,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Segoe UI,Helvetica Neue,Helvetica,Arial,sans-serif;cursor:pointer;box-sizing:border-box;position:relative;display:block;float:left;font-weight:400;color:var(--semi-color-text-2);-webkit-user-select:none;user-select:none}.semi-tabs-bar .semi-tabs-tab .semi-icon:not(.semi-icon-checkbox_tick,.semi-icon-radio,.semi-icon-checkbox_indeterminate){position:relative;margin-right:8px;top:3px;color:var(--semi-color-text-2);transition:color var(--semi-transition_duration-none) var(--semi-transition_function-easeIn) var(--semi-transition_delay-none)}.semi-tabs-bar .semi-tabs-tab .semi-icon.semi-tabs-tab-icon-close{margin-right:0;font-size:14px;color:var(--semi-color-text-2);margin-left:10px;cursor:pointer}.semi-tabs-bar .semi-tabs-tab:hover{color:var(--semi-color-text-0)}.semi-tabs-bar .semi-tabs-tab:hover .semi-icon:not(.semi-icon-checkbox_tick,.semi-icon-radio,.semi-icon-checkbox_indeterminate){color:var(--semi-color-text-0)}.semi-tabs-bar .semi-tabs-tab:active{color:var(--semi-color-text-0)}.semi-tabs-bar .semi-tabs-tab:active .semi-icon:not(.semi-icon-checkbox_tick,.semi-icon-radio,.semi-icon-checkbox_indeterminate){color:var(--semi-color-text-0)}.semi-tabs-bar .semi-tabs-tab-active,.semi-tabs-bar .semi-tabs-tab-active:hover{cursor:default;font-weight:600;color:var(--semi-color-text-0)}.semi-tabs-bar .semi-tabs-tab-active .semi-icon:not(.semi-icon-checkbox_tick,.semi-icon-radio,.semi-icon-checkbox_indeterminate),.semi-tabs-bar .semi-tabs-tab-active:hover .semi-icon:not(.semi-icon-checkbox_tick,.semi-icon-radio,.semi-icon-checkbox_indeterminate){color:var(--semi-color-primary)}.semi-tabs-bar .semi-tabs-tab-active .semi-icon.semi-tabs-tab-icon-close,.semi-tabs-bar .semi-tabs-tab-active:hover .semi-icon.semi-tabs-tab-icon-close{color:var(--semi-color-text-2)}.semi-tabs-bar .semi-tabs-tab-active .semi-icon.semi-tabs-tab-icon-close:hover{color:var(--semi-color-text-1)}.semi-tabs-bar .semi-tabs-tab-disabled{cursor:not-allowed;color:var(--semi-color-disabled-text)}.semi-tabs-bar .semi-tabs-tab-disabled:hover{color:var(--semi-color-disabled-text);border-bottom:none}.semi-tabs-tab-single.semi-tabs-tab{font-size:14px;line-height:20px;font-family:Inter,-apple-system,BlinkMacSystemFont,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Segoe UI,Helvetica Neue,Helvetica,Arial,sans-serif;cursor:pointer;box-sizing:border-box;position:relative;display:inline-block;font-weight:400;color:var(--semi-color-text-2);-webkit-user-select:none;user-select:none}.semi-tabs-tab-single.semi-tabs-tab .semi-icon:not(.semi-icon-checkbox_tick,.semi-icon-radio,.semi-icon-checkbox_indeterminate){position:relative;margin-right:8px;top:3px;color:var(--semi-color-text-2);transition:color var(--semi-transition_duration-none) var(--semi-transition_function-easeIn) var(--semi-transition_delay-none)}.semi-tabs-tab-single.semi-tabs-tab .semi-icon.semi-tabs-tab-icon-close{margin-right:0;font-size:14px;color:var(--semi-color-text-2);margin-left:10px;cursor:pointer}.semi-tabs-tab-single.semi-tabs-tab .semi-icon.semi-tabs-tab-icon-close.semi-icon-close:hover,.semi-tabs-tab-single.semi-tabs-tab:hover{color:var(--semi-color-text-0)}.semi-tabs-tab-single.semi-tabs-tab:hover .semi-icon:not(.semi-icon-checkbox_tick,.semi-icon-radio,.semi-icon-checkbox_indeterminate){color:var(--semi-color-text-0)}.semi-tabs-tab-single.semi-tabs-tab:hover .semi-icon.semi-tabs-tab-icon-close{color:var(--semi-color-text-2)}.semi-tabs-tab-single.semi-tabs-tab:active{color:var(--semi-color-text-0)}.semi-tabs-tab-single.semi-tabs-tab:active .semi-icon:not(.semi-icon-checkbox_tick,.semi-icon-radio,.semi-icon-checkbox_indeterminate){color:var(--semi-color-text-0)}.semi-tabs-tab-single.semi-tabs-tab:active .semi-icon.semi-tabs-tab-icon-close{color:var(--semi-color-text-2)}.semi-tabs-tab-single.semi-tabs-tab-active,.semi-tabs-tab-single.semi-tabs-tab-active:hover{cursor:default;font-weight:600;color:var(--semi-color-text-0)}.semi-tabs-tab-single.semi-tabs-tab-active .semi-icon:not(.semi-icon-checkbox_tick,.semi-icon-radio,.semi-icon-checkbox_indeterminate),.semi-tabs-tab-single.semi-tabs-tab-active:hover .semi-icon:not(.semi-icon-checkbox_tick,.semi-icon-radio,.semi-icon-checkbox_indeterminate){color:var(--semi-color-primary)}.semi-tabs-tab-single.semi-tabs-tab-active .semi-icon.semi-tabs-tab-icon-close,.semi-tabs-tab-single.semi-tabs-tab-active:hover .semi-icon.semi-tabs-tab-icon-close{color:var(--semi-color-text-2)}.semi-tabs-tab-single.semi-tabs-tab-active .semi-icon.semi-tabs-tab-icon-close:hover{color:var(--semi-color-text-1)}.semi-tabs-tab-single.semi-tabs-tab-disabled{cursor:not-allowed;color:var(--semi-color-disabled-text)}.semi-tabs-tab-single.semi-tabs-tab-disabled:hover{color:var(--semi-color-disabled-text);border-bottom:none}.semi-tabs-bar-collapse,.semi-tabs-bar-collapse .semi-tabs-bar-overflow-list{display:flex;align-items:center}.semi-tabs-bar-collapse .semi-overflow-list{flex:1}.semi-tabs-bar-collapse .semi-overflow-list .semi-overflow-list-scroll-wrapper{-ms-overflow-style:none;scrollbar-width:none}.semi-tabs-bar-collapse .semi-overflow-list .semi-overflow-list-scroll-wrapper::-webkit-scrollbar{display:none;width:0;height:0}.semi-tabs-bar-collapse .semi-overflow-list .semi-overflow-list-scroll-wrapper:focus-visible{outline:2px solid var(--semi-color-primary-light-active);outline-offset:-2px}.semi-tabs-bar-collapse .semi-overflow-list>.semi-button-disabled{color:var(--semi-color-disabled-text);background-color:transparent}.semi-tabs-bar-collapse .semi-overflow-list>.semi-button-disabled:hover{color:var(--semi-color-disabled-text);background-color:transparent}.semi-tabs-bar-collapse .semi-tabs-bar-arrow-start{margin-right:4px}.semi-tabs-bar-collapse .semi-tabs-bar-arrow-start>.semi-button[aria-disabled=false]{color:var(--semi-color-primary);padding:8px;border:0px solid transparent;background-color:transparent}.semi-tabs-bar-collapse .semi-tabs-bar-arrow-start>.semi-button[aria-disabled=false]:hover{background-color:var(--semi-color-fill-0);color:var(--semi-color-primary);border-color:transparent}.semi-tabs-bar-collapse .semi-tabs-bar-arrow-start>.semi-button[aria-disabled=false]:active{background-color:var(--semi-color-fill-1);color:var(--semi-color-primary);border-color:transparent}.semi-tabs-bar-collapse .semi-tabs-bar-arrow-end{margin-left:4px}.semi-tabs-bar-collapse .semi-tabs-bar-arrow-end>.semi-button[aria-disabled=false]{color:var(--semi-color-primary);padding:8px;border:0px solid transparent;background-color:transparent}.semi-tabs-bar-collapse .semi-tabs-bar-arrow-end>.semi-button[aria-disabled=false]:hover{background-color:var(--semi-color-fill-0);color:var(--semi-color-primary);border-color:transparent}.semi-tabs-bar-collapse .semi-tabs-bar-arrow-end>.semi-button[aria-disabled=false]:active{background-color:var(--semi-color-fill-1);color:var(--semi-color-primary);border-color:transparent}.semi-tabs-bar-dropdown{max-height:300px;overflow-y:auto}.semi-tabs-bar:after{content:"";height:0;display:block;clear:both}.semi-tabs-bar-line.semi-tabs-bar-top{border-bottom:1px solid var(--semi-color-border);transition:color var(--semi-transition_duration-none) var(--semi-transition_function-easeIn) var(--semi-transition_delay-none);transform:scale(var(--semi-transform_scale-none))}.semi-tabs-bar-line.semi-tabs-bar-top .semi-tabs-tab{padding:16px 4px 14px;transition:border-bottom-color var(--semi-transition_duration-none) var(--semi-transition_function-easeIn) var(--semi-transition_delay-none),color var(--semi-transition_duration-none) var(--semi-transition_function-easeIn) var(--semi-transition_delay-none);border-bottom:2px solid transparent}.semi-tabs-bar-line.semi-tabs-bar-top .semi-tabs-tab:nth-of-type(1){padding-left:0}.semi-tabs-bar-line.semi-tabs-bar-top .semi-tabs-tab:hover{border-bottom:2px solid var(--semi-color-fill-0)}.semi-tabs-bar-line.semi-tabs-bar-top .semi-tabs-tab:focus-visible{outline:2px solid var(--semi-color-primary-light-active);outline-offset:-1px}.semi-tabs-bar-line.semi-tabs-bar-top .semi-tabs-tab:active{border-bottom:2px solid var(--semi-color-fill-1)}.semi-tabs-bar-line.semi-tabs-bar-top .semi-tabs-tab:not(:last-of-type){margin-right:24px}.semi-tabs-bar-line.semi-tabs-bar-top .semi-tabs-tab-small{padding:8px 4px 6px}.semi-tabs-bar-line.semi-tabs-bar-top .semi-tabs-tab-medium{padding:12px 4px 10px}.semi-tabs-bar-line.semi-tabs-bar-top .semi-tabs-tab-active,.semi-tabs-bar-line.semi-tabs-bar-top .semi-tabs-tab-active:hover{border-bottom:2px solid var(--semi-color-primary)}.semi-tabs-bar-line.semi-tabs-bar-left{border-right:1px solid var(--semi-color-border)}.semi-tabs-bar-line.semi-tabs-bar-left .semi-tabs-tab{padding:12px;border-left:2px solid transparent;transition:background-color var(--semi-transition_duration-none) var(--semi-transition_function-easeIn) var(--semi-transition_delay-none),color var(--semi-transition_duration-none) var(--semi-transition_function-easeIn) var(--semi-transition_delay-none)}.semi-tabs-bar-line.semi-tabs-bar-left .semi-tabs-tab:hover{border-left:2px solid var(--semi-color-fill-0);background-color:var(--semi-color-fill-0)}.semi-tabs-bar-line.semi-tabs-bar-left .semi-tabs-tab:focus-visible{outline:2px solid var(--semi-color-primary-light-active);outline-offset:-2px}.semi-tabs-bar-line.semi-tabs-bar-left .semi-tabs-tab:active{border-left:2px solid var(--semi-color-fill-1);background-color:var(--semi-color-fill-1)}.semi-tabs-bar-line.semi-tabs-bar-left .semi-tabs-tab-small{padding:6px}.semi-tabs-bar-line.semi-tabs-bar-left .semi-tabs-tab-medium{padding:10px}.semi-tabs-bar-line.semi-tabs-bar-left .semi-tabs-tab-active{background-color:var(--semi-color-primary-light-default)}.semi-tabs-bar-line.semi-tabs-bar-left .semi-tabs-tab-active,.semi-tabs-bar-line.semi-tabs-bar-left .semi-tabs-tab-active:hover{border-left:2px solid var(--semi-color-primary);background-color:var(--semi-color-primary-light-default)}.semi-tabs-bar-line .semi-tabs-bar-extra{height:50px;line-height:50px}.semi-tabs-bar-line .semi-tabs-bar-line-extra-small{height:36px;line-height:36px}.semi-tabs-bar-card.semi-tabs-bar-top:before{position:absolute;right:0;left:0;bottom:0;border-bottom:1px solid var(--semi-color-border);content:""}.semi-tabs-bar-card.semi-tabs-bar-top .semi-tabs-tab{border:1px solid transparent;border-bottom:none;border-radius:var(--semi-border-radius-small) var(--semi-border-radius-small) 0 0}.semi-tabs-bar-card.semi-tabs-bar-top .semi-tabs-tab:hover{border-bottom:none}.semi-tabs-bar-card.semi-tabs-bar-top .semi-tabs-tab:not(:last-of-type){margin-right:8px}.semi-tabs-bar-card.semi-tabs-bar-top .semi-tabs-tab-active,.semi-tabs-bar-card.semi-tabs-bar-top .semi-tabs-tab-active:hover{padding:8px 12px 7px;border:1px solid var(--semi-color-border);border-bottom:1px solid var(--semi-color-bg-1);background:transparent}.semi-tabs-bar-card.semi-tabs-bar-left{border-right:1px solid var(--semi-color-border)}.semi-tabs-bar-card.semi-tabs-bar-left .semi-tabs-tab{border:1px solid transparent;border-right:none;border-radius:var(--semi-border-radius-small) 0 0 var(--semi-border-radius-small)}.semi-tabs-bar-card.semi-tabs-bar-left .semi-tabs-tab:hover{border-right:none}.semi-tabs-bar-card.semi-tabs-bar-left .semi-tabs-tab:not(:last-of-type){margin-bottom:8px}.semi-tabs-bar-card.semi-tabs-bar-left .semi-tabs-tab-active:after{content:" ";width:1px;position:absolute;right:-1px;top:0;bottom:0;background:var(--semi-color-bg-1)}.semi-tabs-bar-card.semi-tabs-bar-left .semi-tabs-tab-active,.semi-tabs-bar-card.semi-tabs-bar-left .semi-tabs-tab-active:hover{padding:8px 12px;border:1px solid var(--semi-color-border);border-right:none;background:transparent}.semi-tabs-bar-card .semi-tabs-tab{padding:8px 12px;transition:background-color var(--semi-transition_duration-none) var(--semi-transition_function-easeIn) var(--semi-transition_delay-none),color var(--semi-transition_duration-none) var(--semi-transition_function-easeIn) var(--semi-transition_delay-none);transform:scale(var(--semi-transform_scale-none))}.semi-tabs-bar-card .semi-tabs-tab:hover{background:var(--semi-color-fill-0)}.semi-tabs-bar-card .semi-tabs-tab:focus-visible{outline:2px solid var(--semi-color-primary-light-active);outline-offset:-2px}.semi-tabs-bar-card .semi-tabs-tab:active{background:var(--semi-color-fill-1)}.semi-tabs-bar-button{border:none}.semi-tabs-bar-button.semi-tabs-bar-left .semi-tabs-tab:not(:last-of-type){margin-bottom:8px}.semi-tabs-bar-button.semi-tabs-bar-top .semi-tabs-tab:not(:last-of-type){margin-right:8px}.semi-tabs-bar-button .semi-tabs-tab{padding:8px 12px;border-radius:var(--semi-border-radius-small);color:var(--semi-color-text-2);border:none;transition:background-color var(--semi-transition_duration-none) var(--semi-transition_function-easeIn) var(--semi-transition_delay-none),color var(--semi-transition_duration-none) var(--semi-transition_function-easeIn) var(--semi-transition_delay-none);transform:scale(var(--semi-transform_scale-none))}.semi-tabs-bar-button .semi-tabs-tab:hover{border:none;background-color:var(--semi-color-fill-0)}.semi-tabs-bar-button .semi-tabs-tab:focus-visible{outline:2px solid var(--semi-color-primary-light-active);outline-offset:-2px}.semi-tabs-bar-button .semi-tabs-tab:active{background-color:var(--semi-color-fill-1)}.semi-tabs-bar-button .semi-tabs-tab-active,.semi-tabs-bar-button .semi-tabs-tab-active:hover{color:var(--semi-color-primary);border:none;background-color:var(--semi-color-primary-light-default)}.semi-tabs-bar-slash .semi-tabs-tab{padding:12px 0}.semi-tabs-bar-slash .semi-tabs-tab:nth-of-type(1){padding-left:0}.semi-tabs-bar-slash .semi-tabs-tab:not(:last-of-type){margin-right:16px}.semi-tabs-bar-slash .semi-tabs-tab:not(:last-of-type):after{content:"";margin-left:16px;display:inline-block;height:14px;width:8px;margin-top:3px;margin-bottom:3px;vertical-align:bottom;background:linear-gradient(to bottom right,transparent 0%,transparent calc(50% - 1px),var(--semi-color-text-2) 50%,transparent calc(50% + 1px),transparent 100%)}.semi-tabs-content{width:100%;padding:5px 0}.semi-tabs-content-left{height:100%;padding:0 5px}.semi-tabs-pane{width:100%;overflow:hidden;color:var(--semi-color-text-0)}.semi-tabs-pane:focus-visible{outline:2px solid var(--semi-color-primary-light-active)}.semi-tabs-pane-inactive,.semi-tabs-content-no-animated .semi-tabs-pane-inactive{display:none}@keyframes semi-tabs-panel-keyframe-leftShow{0%{transform:translate(60px);opacity:0}to{transform:translate(0);opacity:1}}@keyframes semi-tabs-panel-keyframe-rightShow{0%{transform:translate(-60px);opacity:0}to{transform:translate(0);opacity:1}}@keyframes semi-tabs-panel-keyframe-topShow{0%{transform:translateY(60px);opacity:0}to{transform:translateY(0);opacity:1}}@keyframes semi-tabs-panel-keyframe-bottomShow{0%{transform:translateY(-60px);opacity:0}to{transform:translateY(0);opacity:1}}.semi-tabs-pane-animate-leftShow{animation:.2s semi-tabs-panel-keyframe-leftShow ease-in-out 0s;animation-fill-mode:forwards}.semi-tabs-pane-animate-rightShow{animation:.2s semi-tabs-panel-keyframe-rightShow ease-in-out 0s;animation-fill-mode:forwards}.semi-tabs-pane-animate-topShow{animation:.2s semi-tabs-panel-keyframe-topShow ease-in-out 0s;animation-fill-mode:forwards}.semi-tabs-pane-animate-bottomShow{animation:.2s semi-tabs-panel-keyframe-bottomShow ease-in-out 0s;animation-fill-mode:forwards}.semi-tabs-tab-line.semi-tabs-tab-top.semi-tabs-tab{font-size:14px;padding:16px 4px 14px;transition:border-bottom-color var(--semi-transition_duration-none) var(--semi-transition_function-easeIn) var(--semi-transition_delay-none),color var(--semi-transition_duration-none) var(--semi-transition_function-easeIn) var(--semi-transition_delay-none);border-bottom:2px solid transparent}.semi-tabs-tab-line.semi-tabs-tab-top.semi-tabs-tab:nth-of-type(1){padding-left:0}.semi-tabs-tab-line.semi-tabs-tab-top.semi-tabs-tab:hover{border-bottom:2px solid var(--semi-color-fill-0)}.semi-tabs-tab-line.semi-tabs-tab-top.semi-tabs-tab:focus-visible{outline:2px solid var(--semi-color-primary-light-active);outline-offset:-1px}.semi-tabs-tab-line.semi-tabs-tab-top.semi-tabs-tab:active{border-bottom:2px solid var(--semi-color-fill-1)}.semi-tabs-tab-line.semi-tabs-tab-top.semi-tabs-tab-small{font-size:14px;padding:8px 4px 6px}.semi-tabs-tab-line.semi-tabs-tab-top.semi-tabs-tab-medium{font-size:14px;padding:12px 4px 10px}.semi-tabs-tab-line.semi-tabs-tab-top.semi-tabs-tab-active,.semi-tabs-tab-line.semi-tabs-tab-top.semi-tabs-tab-active:hover{border-bottom:2px solid var(--semi-color-primary)}.semi-tabs-tab-line.semi-tabs-tab-left.semi-tabs-tab{padding:12px;border-left:2px solid transparent;transition:background-color var(--semi-transition_duration-none) var(--semi-transition_function-easeIn) var(--semi-transition_delay-none),color var(--semi-transition_duration-none) var(--semi-transition_function-easeIn) var(--semi-transition_delay-none)}.semi-tabs-tab-line.semi-tabs-tab-left.semi-tabs-tab:hover{border-left:2px solid var(--semi-color-fill-0);background-color:var(--semi-color-fill-0)}.semi-tabs-tab-line.semi-tabs-tab-left.semi-tabs-tab:focus-visible{outline:2px solid var(--semi-color-primary-light-active);outline-offset:-2px}.semi-tabs-tab-line.semi-tabs-tab-left.semi-tabs-tab:active{border-left:2px solid var(--semi-color-fill-1);background-color:var(--semi-color-fill-1)}.semi-tabs-tab-line.semi-tabs-tab-left.semi-tabs-tab-small{padding:6px}.semi-tabs-tab-line.semi-tabs-tab-left.semi-tabs-tab-medium{padding:10px}.semi-tabs-tab-line.semi-tabs-tab-left.semi-tabs-tab-active{background-color:var(--semi-color-primary-light-default)}.semi-tabs-tab-line.semi-tabs-tab-left.semi-tabs-tab-active,.semi-tabs-tab-line.semi-tabs-tab-left.semi-tabs-tab-active:hover{border-left:2px solid var(--semi-color-primary);background-color:var(--semi-color-primary-light-default)}.semi-tabs-tab-card.semi-tabs-tab-top.semi-tabs-tab{border:1px solid transparent;border-bottom:none;border-radius:var(--semi-border-radius-small) var(--semi-border-radius-small) 0 0}.semi-tabs-tab-card.semi-tabs-tab-top.semi-tabs-tab:hover{border-bottom:none}.semi-tabs-tab-card.semi-tabs-tab-top.semi-tabs-tab-active,.semi-tabs-tab-card.semi-tabs-tab-top.semi-tabs-tab-active:hover{padding:8px 12px 7px;border:1px solid var(--semi-color-border);border-bottom:1px solid var(--semi-color-bg-1);background:transparent}.semi-tabs-tab-card.semi-tabs-tab-left.semi-tabs-tab{border:1px solid transparent;border-right:none;border-radius:var(--semi-border-radius-small) 0 0 var(--semi-border-radius-small)}.semi-tabs-tab-card.semi-tabs-tab-left.semi-tabs-tab:hover{border-right:none}.semi-tabs-tab-card.semi-tabs-tab-left.semi-tabs-tab-active:after{content:" ";width:1px;position:absolute;right:-1px;top:0;bottom:0;background:var(--semi-color-bg-1)}.semi-tabs-tab-card.semi-tabs-tab-left.semi-tabs-tab-active,.semi-tabs-tab-card.semi-tabs-tab-left.semi-tabs-tab-active:hover{padding:8px 12px;border:1px solid var(--semi-color-border);border-right:none;background:transparent}.semi-tabs-tab-card.semi-tabs-tab{padding:8px 12px;transition:background-color var(--semi-transition_duration-none) var(--semi-transition_function-easeIn) var(--semi-transition_delay-none),color var(--semi-transition_duration-none) var(--semi-transition_function-easeIn) var(--semi-transition_delay-none);transform:scale(var(--semi-transform_scale-none))}.semi-tabs-tab-card.semi-tabs-tab:hover{background:var(--semi-color-fill-0)}.semi-tabs-tab-card.semi-tabs-tab:focus-visible{outline:2px solid var(--semi-color-primary-light-active);outline-offset:-2px}.semi-tabs-tab-card.semi-tabs-tab:active{background:var(--semi-color-fill-1)}.semi-tabs-tab-button{border:none}.semi-tabs-tab-button.semi-tabs-tab{padding:8px 12px;border-radius:var(--semi-border-radius-small);color:var(--semi-color-text-2);border:none;transition:background-color var(--semi-transition_duration-none) var(--semi-transition_function-easeIn) var(--semi-transition_delay-none),color var(--semi-transition_duration-none) var(--semi-transition_function-easeIn) var(--semi-transition_delay-none);transform:scale(var(--semi-transform_scale-none))}.semi-tabs-tab-button.semi-tabs-tab:hover{border:none;background-color:var(--semi-color-fill-0)}.semi-tabs-tab-button.semi-tabs-tab:focus-visible{outline:2px solid var(--semi-color-primary-light-active);outline-offset:-2px}.semi-tabs-tab-button.semi-tabs-tab:active{background-color:var(--semi-color-fill-1)}.semi-tabs-tab-button.semi-tabs-tab-active,.semi-tabs-tab-button.semi-tabs-tab-active:hover{color:var(--semi-color-primary);border:none;background-color:var(--semi-color-primary-light-default)}.semi-rtl .semi-tabs,.semi-portal-rtl .semi-tabs{direction:rtl}.semi-rtl .semi-tabs-bar .semi-tabs-tab,.semi-portal-rtl .semi-tabs-bar .semi-tabs-tab{float:right}.semi-rtl .semi-tabs-bar .semi-tabs-tab .semi-icon,.semi-portal-rtl .semi-tabs-bar .semi-tabs-tab .semi-icon{margin-right:0;margin-left:8px}.semi-rtl .semi-tabs-bar-collapse .semi-tabs-bar-arrow-start,.semi-portal-rtl .semi-tabs-bar-collapse .semi-tabs-bar-arrow-start{margin-right:0;margin-left:4px}.semi-rtl .semi-tabs-bar-collapse .semi-tabs-bar-arrow-end,.semi-portal-rtl .semi-tabs-bar-collapse .semi-tabs-bar-arrow-end{margin-left:0;margin-right:4px}.semi-rtl .semi-tabs-bar-collapse .semi-icon-chevron_right,.semi-rtl .semi-tabs-bar-collapse .semi-icon-chevron_left,.semi-portal-rtl .semi-tabs-bar-collapse .semi-icon-chevron_right,.semi-portal-rtl .semi-tabs-bar-collapse .semi-icon-chevron_left{transform:scaleX(-1)}.semi-rtl .semi-tabs-bar-line.semi-tabs-bar-top .semi-tabs-tab:not(:last-of-type),.semi-portal-rtl .semi-tabs-bar-line.semi-tabs-bar-top .semi-tabs-tab:not(:last-of-type){margin-right:0;margin-left:24px}.semi-rtl .semi-tabs-bar-line.semi-tabs-bar-left,.semi-portal-rtl .semi-tabs-bar-line.semi-tabs-bar-left{border-right:0;border-left:1px solid var(--semi-color-border)}.semi-rtl .semi-tabs-bar-line.semi-tabs-bar-left .semi-tabs-tab,.semi-portal-rtl .semi-tabs-bar-line.semi-tabs-bar-left .semi-tabs-tab{border-left:0;border-right:2px solid transparent}.semi-rtl .semi-tabs-bar-line.semi-tabs-bar-left .semi-tabs-tab:hover,.semi-portal-rtl .semi-tabs-bar-line.semi-tabs-bar-left .semi-tabs-tab:hover{border-left:0;border-right:2px solid var(--semi-color-fill-0)}.semi-rtl .semi-tabs-bar-line.semi-tabs-bar-left .semi-tabs-tab:active,.semi-portal-rtl .semi-tabs-bar-line.semi-tabs-bar-left .semi-tabs-tab:active{border-left:0;border-right:2px solid var(--semi-color-fill-1)}.semi-rtl .semi-tabs-bar-line.semi-tabs-bar-left .semi-tabs-tab-active,.semi-rtl .semi-tabs-bar-line.semi-tabs-bar-left .semi-tabs-tab-active:hover,.semi-portal-rtl .semi-tabs-bar-line.semi-tabs-bar-left .semi-tabs-tab-active,.semi-portal-rtl .semi-tabs-bar-line.semi-tabs-bar-left .semi-tabs-tab-active:hover{border-left:0;border-right:2px solid var(--semi-color-primary)}.semi-rtl .semi-tabs-bar-card.semi-tabs-bar-top .semi-tabs-tab:not(:last-of-type),.semi-portal-rtl .semi-tabs-bar-card.semi-tabs-bar-top .semi-tabs-tab:not(:last-of-type){margin-left:0;margin-right:8px}.semi-rtl .semi-tabs-bar-card.semi-tabs-bar-left,.semi-portal-rtl .semi-tabs-bar-card.semi-tabs-bar-left{border-right:0;border-left:1px solid var(--semi-color-border)}.semi-rtl .semi-tabs-bar-card.semi-tabs-bar-left .semi-tabs-tab,.semi-portal-rtl .semi-tabs-bar-card.semi-tabs-bar-left .semi-tabs-tab{border:1px solid transparent;border-left:none}.semi-rtl .semi-tabs-bar-card.semi-tabs-bar-left .semi-tabs-tab:hover,.semi-portal-rtl .semi-tabs-bar-card.semi-tabs-bar-left .semi-tabs-tab:hover{border-left:none}.semi-rtl .semi-tabs-bar-card.semi-tabs-bar-left .semi-tabs-tab-active:after,.semi-portal-rtl .semi-tabs-bar-card.semi-tabs-bar-left .semi-tabs-tab-active:after{right:auto;left:-1px}.semi-rtl .semi-tabs-bar-button.semi-tabs-bar-top .semi-tabs-tab:not(:last-of-type),.semi-portal-rtl .semi-tabs-bar-button.semi-tabs-bar-top .semi-tabs-tab:not(:last-of-type){margin-right:auto;margin-left:8px} diff --git a/frontends/desktop/dist/assets/loading-6Qy4iUUr.css b/frontends/desktop/dist/assets/loading-6Qy4iUUr.css new file mode 100644 index 000000000..43c2b57bb --- /dev/null +++ b/frontends/desktop/dist/assets/loading-6Qy4iUUr.css @@ -0,0 +1 @@ +.semi-progress{display:flex;align-items:center}.semi-progress-track{background-color:var(--semi-color-fill-0);border-radius:var(--semi-border-radius-small)}.semi-progress-horizontal{height:4px;margin-top:4px;margin-bottom:4px}.semi-progress-horizontal.semi-progress-large{height:6px}.semi-progress-horizontal .semi-progress-track{height:100%;width:100%}.semi-progress-horizontal .semi-progress-track-inner{height:100%;background-color:var(--semi-color-success);border-radius:var(--semi-border-radius-small);transition:width .3s;transition-timing-function:cubic-bezier(.62,.05,.36,.95)}.semi-progress-horizontal .semi-progress-line-text{min-width:45px;font-weight:600;margin-left:16px;color:var(--semi-color-text-0)}.semi-progress-vertical{width:4px;display:inline-flex;height:100%;margin-left:4px;margin-right:4px;flex-direction:column}.semi-progress-vertical.semi-progress-large{width:6px}.semi-progress-vertical .semi-progress-track{height:100%;width:100%}.semi-progress-vertical .semi-progress-track-inner{background-color:var(--semi-color-success);border-radius:var(--semi-border-radius-small);width:100%;transition:height .3s;transition-timing-function:cubic-bezier(.62,.05,.36,.95)}.semi-progress-vertical .semi-progress-line-text{font-weight:600;margin-top:8px}.semi-progress-circle{position:relative;display:inline-block}.semi-progress-circle-ring{display:block}.semi-progress-circle-ring-track{stroke:var(--semi-color-fill-0)}.semi-progress-circle-ring-inner{transition:stroke-dashoffset .3s;transition-timing-function:cubic-bezier(.62,.05,.36,.95);transform:rotate(-90deg);transform-origin:50% 50%;stroke:var(--semi-color-success)}.semi-progress-circle-text{position:absolute;top:50%;left:50%;width:100%;text-align:center;transform:translate(-50%,-50%);-webkit-user-select:none;user-select:none;color:var(--semi-color-mode-minor-text)}.semi-rtl .semi-progress,.semi-portal-rtl .semi-progress{direction:rtl}.semi-rtl .semi-progress-horizontal .semi-progress-line-text,.semi-portal-rtl .semi-progress-horizontal .semi-progress-line-text{margin-left:0;margin-right:16px}.semi-rtl .semi-progress-circle-ring-inner,.semi-portal-rtl .semi-progress-circle-ring-inner{transform:rotate(-90deg);transform-origin:50% 50%}.semi-rtl .semi-progress-circle-text,.semi-portal-rtl .semi-progress-circle-text{left:auto;right:50%;transform:translate(50%,-50%)}:root{font-family:-apple-system,BlinkMacSystemFont,SF Pro Text,Segoe UI,Microsoft YaHei UI,Helvetica Neue,sans-serif;background:var(--semi-color-bg-0);color:var(--semi-color-text-0)}*{box-sizing:border-box}html,body,#loading-root{width:100%;height:100%;margin:0}body{overflow:hidden;background:var(--semi-color-bg-0)}.ga-bootstrap-shell{height:100%;display:flex;flex-direction:column}.ga-bootstrap-app{flex:1;min-height:0;display:flex;align-items:center;justify-content:center;padding:28px;background:radial-gradient(circle at 50% 18%,color-mix(in srgb,var(--semi-color-primary) 8%,transparent),transparent 42%),var(--semi-color-bg-0);color:var(--semi-color-text-0)}.ga-bootstrap-screen{width:min(100%,380px);text-align:center}.ga-bootstrap-loading{display:flex;flex-direction:column;align-items:center;gap:18px}.ga-bootstrap-title.semi-typography{margin:0;color:var(--semi-color-text-0)}.ga-bootstrap-description.semi-typography{margin:8px auto 22px;max-width:340px;line-height:1.65}.ga-bootstrap-progress-bar{margin-top:4px}.ga-bootstrap-stages{display:grid;gap:2px;margin:18px 0 0;padding:0;list-style:none;text-align:left}.ga-bootstrap-stages li{display:flex;align-items:center;gap:10px;min-height:30px;padding:4px 8px;border-radius:var(--semi-border-radius-small);color:var(--semi-color-text-2)}.ga-bootstrap-stages li[data-state=running]{background:var(--semi-color-primary-light-default);color:var(--semi-color-primary)}.ga-bootstrap-stages li[data-state=done]{color:var(--semi-color-success)}.ga-bootstrap-stages li[data-state=failed]{background:var(--semi-color-danger-light-default);color:var(--semi-color-danger)}.ga-bootstrap-stage-dot{width:14px;height:14px;border:2px solid var(--semi-color-border);border-radius:50%;flex:0 0 auto}.ga-bootstrap-log{margin-top:18px;text-align:left;border-top:1px solid var(--semi-color-border)}.ga-bootstrap-log .semi-collapse-header{padding-inline:4px;color:var(--semi-color-text-2)}.ga-bootstrap-log pre{max-height:150px;margin:0;padding:12px;overflow:auto;border:1px solid var(--semi-color-border);border-radius:var(--semi-border-radius-medium);background:var(--semi-color-fill-0);color:var(--semi-color-text-1);font:11px/1.55 ui-monospace,SFMono-Regular,Consolas,monospace;white-space:pre-wrap;overflow-wrap:anywhere;-webkit-user-select:text;user-select:text}.ga-bootstrap-ready{display:flex;flex-direction:column;align-items:center;gap:10px}.ga-bootstrap-ready-icon{margin-bottom:4px;color:var(--semi-color-success)} diff --git a/frontends/desktop/dist/assets/loading-VXGdS4iv.js b/frontends/desktop/dist/assets/loading-VXGdS4iv.js new file mode 100644 index 000000000..37bd778ba --- /dev/null +++ b/frontends/desktop/dist/assets/loading-VXGdS4iv.js @@ -0,0 +1,2 @@ +import{c as ie,b as v,B as oe,l as A,R as x,au as Y,P as l,an as le,aj as o,T as j,ap as K,S as te,U as ce,ak as pe,at as de,aq as ue,as as ge,ar as he}from"./tauri-compat-tfiFK9EG.js";import{S as fe}from"./index-D_sWIqse.js";import{A as me}from"./Animation-TKQfYYOo.js";import{W as be}from"./WindowsTitlebar-CrkUa1UM.js";function ye(e){return v.createElement("svg",Object.assign({viewBox:"0 0 24 24",fill:"none",xmlns:"http://www.w3.org/2000/svg",width:"1em",height:"1em",focusable:!1,"aria-hidden":!0},e),v.createElement("g",{clipPath:"url(#clip_loading)"},v.createElement("path",{fillRule:"evenodd",clipRule:"evenodd",d:"M12 0c.66 0 1.2.54 1.2 1.2v5.2a1.2 1.2 0 0 1-2.4 0V1.2c0-.66.54-1.2 1.2-1.2Zm7.05 2.3c.54.38.66 1.13.27 1.67l-3.06 4.2a1.2 1.2 0 0 1-1.94-1.4l3.06-4.21a1.2 1.2 0 0 1 1.67-.27Zm-14.1 0a1.2 1.2 0 0 1 1.67.26l3.06 4.2a1.2 1.2 0 1 1-1.94 1.41l-3.06-4.2a1.2 1.2 0 0 1 .27-1.68Zm-4.36 6c.2-.64.88-.98 1.5-.78l4.95 1.6a1.2 1.2 0 0 1-.74 2.3L1.36 9.8a1.2 1.2 0 0 1-.77-1.5Zm22.82 0c.2.62-.14 1.3-.77 1.5l-4.94 1.61a1.2 1.2 0 0 1-.74-2.28l4.94-1.6c.63-.21 1.3.13 1.51.76Zm-15.6 5.06c.21.63-.13 1.3-.77 1.51l-4.94 1.6a1.2 1.2 0 0 1-.74-2.27l4.94-1.61c.63-.2 1.31.14 1.52.77Zm8.37 0c.21-.63.89-.98 1.52-.77l4.94 1.6a1.2 1.2 0 0 1-.74 2.29l-4.94-1.6a1.2 1.2 0 0 1-.78-1.52Zm-6.77 2.2c.54.39.66 1.14.27 1.68l-3.06 4.2a1.2 1.2 0 1 1-1.94-1.4l3.06-4.21a1.2 1.2 0 0 1 1.67-.27Zm5.18 0a1.2 1.2 0 0 1 1.67.27l3.06 4.2a1.2 1.2 0 0 1-1.94 1.41l-3.06-4.2a1.2 1.2 0 0 1 .27-1.68ZM12 16.4c.66 0 1.2.54 1.2 1.2v5.2a1.2 1.2 0 0 1-2.4 0v-5.2c0-.66.54-1.2 1.2-1.2Z",fill:"currentColor"})),v.createElement("defs",null,v.createElement("clipPath",{id:"clip_loading"},v.createElement("rect",{width:24,height:24,fill:"currentColor"}))))}const Se=ie(ye,"loading"),ve={PREFIX:`${oe}-progress`},m={types:["line","circle"],DEFAULT_TYPE:"line",STROKE_DEFAULT:"var(--semi-color-success)",strokeLineCap:["square","round"],DEFAULT_LINECAP:"round",sizes:["default","small","large"],DEFAULT_SIZE:"default",directions:["vertical","horizontal"],DEFAULT_DIRECTION:"horizontal"};function ke(e,r,t){try{const n=xe(e,r,t);if(n.length!==0)return n}catch{return}}function xe(e,r,t){if(e.sort((s,i)=>s.percent-i.percent),e[0].percent>r)return m.STROKE_DEFAULT;const n=e[e.length-1];if(n.percenti.percent)continue;const a=e[s-1];return t?Ee({startColor:F(a.color),endColor:F(i.color),size:i.percent-a.percent-1},r-a.percent-1):F(a.color)}}function Ee(e,r){const{startColor:t,endColor:n,size:s}=e,i=t.split(""),a=n.split(""),c=[parseInt(`${i[1]}${i[2]}`,16),parseInt(`${a[1]}${a[2]}`,16)],h=[parseInt(`${i[3]}${i[4]}`,16),parseInt(`${a[3]}${a[4]}`,16)],d=[parseInt(`${i[5]}${i[6]}`,16),parseInt(`${a[5]}${a[6]}`,16)],p=[parseInt(`${i[7]}${i[8]}`,16),parseInt(`${a[7]}${a[8]}`,16)],u=(c[0]-c[1])/(s+1),D=(h[0]-h[1])/(s+1),O=(d[0]-d[1])/(s+1),R=(p[0]-p[1])/(s+1);function $(g){const k=Math.round(c[0]-u*(g+1)).toString(16),_=Math.round(h[0]-D*(g+1)).toString(16),G=Math.round(d[0]-O*(g+1)).toString(16),w=`${N(k)}${N(_)}${N(G)}`,b=Math.floor(R*(g+1)+p[1]).toString(16);return S.Hex(`#${w}`,b)}function N(g){return g.length===1?`0${g}`:g.length===0?"00":g}if(typeof r>"u"){const g=[t];for(let k=0;kt+t).join("")),`#${e}${r||"ff"}`)},SemiDesignToken(e){if(typeof window>"u")return;const r=getComputedStyle(document.body).getPropertyValue(`--semi-${e}`);if(r==="")return;const t=`rgba(${r}, 1)`;return S.RgbA(t)},HslA(e){const r=C.hslA.exec(e),t=parseInt(r[2]),n=parseInt(r[3])/100,s=parseInt(r[4])/100,i=r[5],a=(1-Math.abs(2*s-1))*n,c=a*(1-Math.abs(t/60%2-1)),h=s-a/2;let d=0,p=0,u=0;return 0<=t&&t<60?(d=a,p=c,u=0):60<=t&&t<120?(d=c,p=a,u=0):120<=t&&t<180?(d=0,p=a,u=c):180<=t&&t<240?(d=0,p=c,u=a):240<=t&&t<300?(d=c,p=0,u=a):300<=t&&t<360&&(d=a,p=0,u=c),d=Math.round((d+h)*255).toString(16),p=Math.round((p+h)*255).toString(16),u=Math.round((u+h)*255).toString(16),S.utils.pAL(d,p,u,i)},RgbA(e){const r=C.rgbA.exec(e),t=parseInt(r[2],10).toString(16),n=parseInt(r[3],10).toString(16),s=parseInt(r[4],10).toString(16),i=r[5];return S.utils.pAL(t,n,s,i)},utils:{pAL(e,r,t,n){return e.length==1&&(e="0"+e),r.length==1&&(r="0"+r),t.length==1&&(t="0"+t),typeof n<"u"?(n=Math.round(parseInt(n)*255).toString(16),n.length==1&&(n="0"+n),"#"+e+r+t+n):"#"+e+r+t}}},C={hex:/^#([0-9a-fA-F]{3}|[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$/,hslA:/(hsl)a?\(\s*?(\d+),?\s*?(\d+)%,?\s*?(\d+)%,?\s*?\/?(\s*?[\d.]+)?\s*?\)/,rgbA:/(rgb)a?\(\s*?(\d+),?\s*?(\d+),?\s*?(\d+),?\s*?\/?(\s*?[\d.]+)?\s*?\)/,semiDesignTokens:/(\w+)?-?(\w+)-?(\d)?/},V={ALONG:["black","white"],SEQUENCE:["amber","blue","cyan","green","grey","indigo","light-blue","light-green","lime","orange","pink","purple","red","teal","violet","yellow"]};var X=function(e,r){var t={};for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&r.indexOf(n)<0&&(t[n]=e[n]);if(e!=null&&typeof Object.getOwnPropertySymbols=="function")for(var s=0,n=Object.getOwnPropertySymbols(e);s{if(this._mounted===!1)return;const n=parseInt(t.value);this.setState({percentNumber:n})}),this.animation.on("rest",()=>{this._mounted!==!1&&this.setState({percentNumber:this.props.percent})}),this.animation.start()}}componentWillUnmount(){this.animation&&this.animation.destroy(),this._mounted=!1}renderCircleProgress(){const r=this.props,{strokeLinecap:t,style:n,className:s,strokeWidth:i,format:a,size:c,stroke:h,strokeGradient:d,showInfo:p,percent:u,orbitStroke:D,id:O}=r,R=X(r,["strokeLinecap","style","className","strokeWidth","format","size","stroke","strokeGradient","showInfo","percent","orbitStroke","id"]),$=this.props["aria-label"],N=this.props["aria-labelledby"],g=this.props["aria-valuetext"],{percentNumber:k}=this.state,_={wrapper:A(`${y}-circle`,s),svg:A(`${y}-circle-ring`),circle:A(`${y}-circle-ring-inner`),track:A(`${y}-circle-ring-track`)},G=this.calcPercent(u),w=this.calcPercent(k);let b;this.props.width?b=this.props.width:c===m.DEFAULT_SIZE?b=72:b=24;const q=this.selectStroke(h,u,d),L=b/2,U=b/2,Z=(b-i)/2,W=Z*2*Math.PI,se=(1-G/100)*W,B=`${W} ${W}`,ae=a(w);return x.createElement("div",Object.assign({id:O,className:_.wrapper,style:n,role:"progressbar","aria-valuemin":0,"aria-valuemax":100,"aria-valuenow":w,"aria-labelledby":N,"aria-label":$,"aria-valuetext":g},Y(R)),x.createElement("svg",{key:c,className:_.svg,height:b,width:b,"aria-hidden":!0},x.createElement("circle",{className:_.track,strokeDashoffset:0,strokeWidth:i,strokeDasharray:B,strokeLinecap:t,fill:"transparent",style:{stroke:D},r:Z,cx:U,cy:L,"aria-hidden":!0}),x.createElement("circle",{className:_.circle,strokeDashoffset:se,strokeWidth:i,strokeDasharray:B,strokeLinecap:t,fill:"transparent",style:{stroke:q},r:Z,cx:U,cy:L,"aria-hidden":!0})),p&&c!=="small"?x.createElement("span",{className:`${y}-circle-text`},ae):null)}calcPercent(r){let t;return r>100?t=100:r<0?t=0:t=r,t}selectStroke(r,t,n){if(typeof r=="string")return r;const s=ke(r,t,n);return typeof s<"u"?s:null}renderLineProgress(){const r=this.props,{className:t,style:n,stroke:s,strokeGradient:i,direction:a,format:c,showInfo:h,size:d,percent:p,orbitStroke:u,id:D}=r,O=X(r,["className","style","stroke","strokeGradient","direction","format","showInfo","size","percent","orbitStroke","id"]),R=this.props["aria-label"],$=this.props["aria-labelledby"],N=this.props["aria-valuetext"],{percentNumber:g}=this.state,k=A(y,t,{[`${y}-horizontal`]:a===m.DEFAULT_DIRECTION,[`${y}-vertical`]:a!==m.DEFAULT_DIRECTION,[`${y}-large`]:d==="large"}),_=A({[`${y}-track`]:!0}),G=A(`${y}-track-inner`),w=this.calcPercent(p),b=this.calcPercent(g),L={background:this.selectStroke(s,p,i)};a===m.DEFAULT_DIRECTION?L.width=`${w}%`:L.height=`${w}%`;const U=c(b);return x.createElement("div",Object.assign({id:D,className:k,style:n,role:"progressbar","aria-valuemin":0,"aria-valuemax":100,"aria-valuenow":w,"aria-labelledby":$,"aria-label":R,"aria-valuetext":N},Y(O)),x.createElement("div",{className:_,style:u?{backgroundColor:u}:{},"aria-hidden":!0},x.createElement("div",{className:G,style:L,"aria-hidden":!0})),h?x.createElement("div",{className:`${y}-line-text`},U):null)}render(){const{type:r}=this.props;return r==="line"?this.renderLineProgress():this.renderCircleProgress()}}H.propTypes={"aria-label":l.string,"aria-labelledby":l.string,"aria-valuetext":l.string,className:l.string,direction:l.oneOf(m.directions),format:l.oneOfType([l.func,l.node]),id:l.string,motion:l.oneOfType([l.bool,l.func,l.object]),orbitStroke:l.string,percent:l.number,scale:l.number,showInfo:l.bool,size:l.oneOf(m.sizes),stroke:l.oneOfType([l.string,l.arrayOf(l.shape({percent:l.number,color:l.string}))]),strokeGradient:l.bool,strokeLinecap:l.oneOf(m.strokeLineCap),strokeWidth:l.number,style:l.object,type:l.oneOf(m.types),width:l.number};H.defaultProps={className:"",direction:m.DEFAULT_DIRECTION,format:e=>`${e}%`,motion:!0,percent:0,showInfo:!1,size:m.DEFAULT_SIZE,strokeGradient:!1,strokeLinecap:m.DEFAULT_LINECAP,strokeWidth:4,style:{},type:m.DEFAULT_TYPE};const Q=["validate","python","dependencies","service","ui"],_e={buildId:"",platform:"",projectDir:"",pythonPath:"",portState:"unknown",bridgeIdentity:null,recentLogs:[]},we={seq:-1,route:"loading",mode:"cold_start",phase:"idle",stage:null,stages:[],logs:[],failure:null,diagnostics:_e,overallPct:0};function Ie(e){return e.phase==="ready"?"ready":e.mode==="prepare"||e.phase==="preparing"?"progress":"loading"}function Te(e){if(e.mode!=="prepare"&&e.phase!=="preparing")return[];const r=e.stage?Q.indexOf(e.stage):-1;return Q.map((t,n)=>{let s="pending";return e.phase==="failed"&&t===e.stage?s="failed":e.phase==="ready"||r>n?s="done":r===n&&(s="running"),{key:t,state:s,pct:e.progress}})}function Ne(e,r){if(r.type!=="snapshot"||r.snapshot.seq<=e.seq)return e;const t=r.snapshot;return{seq:t.seq,route:Ie(t),mode:t.mode,phase:t.phase,stage:t.stage,stages:Te(t),logs:t.diagnostics.recentLogs,failure:t.failure,diagnostics:t.diagnostics,overallPct:t.progress}}let I=null,T=null,P=0,Ae=0;const $e={start:"validate",venv:"python",deps:"dependencies",done:"service",starting:"service"};function Le(e,r,t){const n=Number.isFinite(r)?Math.max(0,Math.min(100,r)):0;return{seq:e,mode:"prepare",phase:n>=100?"ready":"preparing",stage:$e[t]??"dependencies",progress:n,failure:null,diagnostics:{buildId:"",platform:navigator.platform||"",projectDir:"",pythonPath:"",portState:"unknown",bridgeIdentity:null,recentLogs:[]}}}function Ce(e,r){const t=window,n=t.__GA_LEGACY_PROGRESS__??[];t.__GA_LEGACY_PROGRESS__=n;const s=t.gaProgress,i=(c,h)=>{r===P&&e({type:"snapshot",snapshot:Le(++Ae,c,String(h||""))})},a=n.splice(0,n.length);return t.gaProgress=i,a.forEach(({pct:c,key:h})=>i(c,h)),()=>{t.gaProgress===i&&(s?t.gaProgress=s:delete t.gaProgress)}}function z(e,r){const t=r==="preparing";return{seq:e,mode:t?"prepare":"cold_start",phase:r,stage:t?"dependencies":r==="starting_service"?"service":null,progress:r==="ready"?100:t?55:15,failure:null,diagnostics:{buildId:"development",platform:navigator.platform||"web",projectDir:"",pythonPath:"",portState:"unknown",bridgeIdentity:null,recentLogs:t?["Installing runtime components…"]:[]}}}function Pe(e){const r=[setTimeout(()=>e({type:"snapshot",snapshot:z(1,"resolving")}),300),setTimeout(()=>e({type:"snapshot",snapshot:z(2,"preparing")}),900),setTimeout(()=>e({type:"snapshot",snapshot:z(3,"starting_service")}),1800),setTimeout(()=>e({type:"snapshot",snapshot:z(4,"ready")}),2600)];I=()=>r.forEach(clearTimeout)}async function je(e){var s,i;const r=++P;T==null||T(),T=Ce(e,r);const t=window.__TAURI__;if(!((s=t==null?void 0:t.core)!=null&&s.invoke)){Pe(e);return}let n;if((i=t.event)!=null&&i.listen)try{n=await t.event.listen("bootstrap",a=>{r===P&&e({type:"snapshot",snapshot:a.payload})})}catch(a){console.warn("[bootstrap] event subscription unavailable; using legacy progress updates",a)}if(r!==P){n==null||n();return}n&&(I==null||I(),I=n);try{const a=await t.core.invoke("get_bootstrap_snapshot");r===P&&e({type:"snapshot",snapshot:a})}catch(a){if(!le(a,"get_bootstrap_snapshot"))throw a}}function De(){P+=1,I&&(I(),I=null),T==null||T(),T=null}const f=(navigator.language||"").toLowerCase().startsWith("zh"),re={starting:f?"正在启动 GenericAgent":"Starting GenericAgent",resuming:f?"正在恢复 GenericAgent":"Resuming GenericAgent",preparing:f?"正在准备本地运行环境":"Preparing the local runtime",preparingDetail:f?"首次启动可能需要几分钟,完成后会自动打开主界面。":"The first launch may take a few minutes. The main window will open automatically.",stage_validate:f?"检查本地文件":"Checking local files",stage_python:f?"准备 Python 环境":"Preparing Python environment",stage_dependencies:f?"安装运行组件":"Installing runtime components",stage_service:f?"启动后台服务":"Starting background service",stage_ui:f?"打开主界面":"Opening the main window",ready:f?"准备完成":"Ready",readyDetail:f?"正在进入主界面…":"Opening the main window…",logTitle:f?"启动详情":"Startup details",stagesLabel:f?"启动阶段":"Startup stages"};function E(e){return re[e]}function Oe(e,r){return re[e]??r}function Re({mode:e}){return o.jsxs("section",{className:"ga-bootstrap-screen ga-bootstrap-loading","aria-live":"polite",children:[o.jsx(fe,{size:"large"}),o.jsx(j.Title,{heading:5,className:"ga-bootstrap-title",children:E(e==="hot_start"?"resuming":"starting")})]})}function Ge({state:e}){return e==="done"?o.jsx(te,{"aria-hidden":"true"}):e==="failed"?o.jsx(ce,{"aria-hidden":"true"}):e==="running"?o.jsx(Se,{spin:!0,"aria-hidden":"true"}):o.jsx("span",{className:"ga-bootstrap-stage-dot","aria-hidden":"true"})}function Fe({stages:e,overallPct:r,logs:t}){return o.jsxs("section",{className:"ga-bootstrap-screen ga-bootstrap-progress","aria-live":"polite",children:[o.jsx(j.Title,{heading:5,className:"ga-bootstrap-title",children:E("preparing")}),o.jsx(j.Paragraph,{type:"tertiary",className:"ga-bootstrap-description",children:E("preparingDetail")}),o.jsx(H,{"aria-label":E("preparing"),percent:Math.max(0,Math.min(100,r)),showInfo:!0,stroke:"var(--semi-color-primary)",className:"ga-bootstrap-progress-bar"}),o.jsx("ul",{className:"ga-bootstrap-stages","aria-label":E("stagesLabel"),children:e.map(n=>o.jsxs("li",{"data-state":n.state,children:[o.jsx(Ge,{state:n.state}),o.jsx(j.Text,{type:n.state==="pending"?"tertiary":void 0,children:Oe(`stage_${n.key}`,n.key)})]},n.key))}),t.length>0&&o.jsx(K,{className:"ga-bootstrap-log",accordion:!0,children:o.jsx(K.Panel,{itemKey:"startup-log",header:E("logTitle"),children:o.jsx("pre",{children:t.slice(-20).join(` +`)})})})]})}function Me(){return o.jsxs("section",{className:"ga-bootstrap-screen ga-bootstrap-ready","aria-live":"polite",children:[o.jsx(te,{size:"extra-large",className:"ga-bootstrap-ready-icon","aria-hidden":"true"}),o.jsx(j.Title,{heading:5,className:"ga-bootstrap-title",children:E("ready")}),o.jsx(j.Text,{type:"tertiary",children:E("readyDetail")})]})}function Ue(){const[e,r]=v.useReducer(Ne,we);v.useEffect(()=>(je(r).catch(n=>{console.error("[bootstrap] failed to subscribe to startup state",n)}),()=>De()),[]);let t;switch(e.route){case"loading":t=o.jsx(Re,{mode:e.mode});break;case"progress":t=o.jsx(Fe,{stages:e.stages,overallPct:e.overallPct,logs:e.logs});break;case"ready":t=o.jsx(Me,{});break}return o.jsxs("div",{className:"ga-bootstrap-shell",children:[pe&&o.jsx(be,{}),o.jsx("main",{className:"ga-bootstrap-app","data-route":e.route,children:t})]})}function ne(e){e.matches?(document.documentElement.dataset.appearance="dark",document.body.setAttribute("theme-mode","dark")):(document.documentElement.dataset.appearance="light",document.body.removeAttribute("theme-mode"))}const M=window.matchMedia("(prefers-color-scheme: dark)");ne(M);var ee;(ee=M.addEventListener)==null||ee.call(M,"change",()=>ne(M));const J=document.getElementById("loading-root");J&&de.createRoot(J).render(o.jsx(v.StrictMode,{children:o.jsx(ue,{locale:f?ge:he,children:o.jsx(Ue,{})})})); diff --git a/frontends/desktop/dist/assets/main-Knf6L_en.js b/frontends/desktop/dist/assets/main-Knf6L_en.js new file mode 100644 index 000000000..907286dc6 --- /dev/null +++ b/frontends/desktop/dist/assets/main-Knf6L_en.js @@ -0,0 +1,33 @@ +const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/MarkdownPart-Bhe_jloX.js","assets/tauri-compat-tfiFK9EG.js","assets/tauri-compat-BTcpEvqB.css","assets/markdown-preprocess-Bvg4n8KE.js","assets/markdown-preprocess-Cp579UoJ.css","assets/index-Bpi3BHKj.js","assets/index-D0pGtk0y.css","assets/WindowsTitlebar-CrkUa1UM.js","assets/WindowsTitlebar-U0YG9JNA.css","assets/MarkdownPart-Cp90Gu77.css","assets/SummaryPart-D48OOFSQ.js","assets/ServicesPage-DrjRw530.js","assets/index-DwVcZP0M.js","assets/index-D_sWIqse.js","assets/index-DkG9Cu-r.css","assets/index-gTPS8Hpa.css","assets/IconFile-CgfQSwGI.js","assets/ServicesPage-Cbm5nbW7.css","assets/TokenPage-C6-RA6yj.js","assets/Animation-TKQfYYOo.js","assets/index-DpGuh58E.js","assets/index-ClU1uQYs.css","assets/TokenPage-DwLDOw_j.css","assets/CollabPage-bnm43hIR.js","assets/CollabPage-CG38jm3S.css"])))=>i.map(i=>d[i]); +var _i=Object.defineProperty;var Mi=(n,e,t)=>e in n?_i(n,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):n[e]=t;var xt=(n,e,t)=>Mi(n,typeof e!="symbol"?e+"":e,t);import{g as We,r as Li,a as Ii,c as fe,b as a,d as $s,e as As,B as Te,_ as Be,f as ge,h as $,i as De,j as Ti,E as Ri,R as g,k as de,l as I,m as Ge,n as Fs,P as h,w as zs,o as jo,p as Je,q as rn,s as ln,t as No,u as Ni,v as Di,x as $i,y as Ai,z as Fi,A as zi,C as Bi,D as Ui,F as Vi,G as Ki,H as Bs,I as Wi,T as Do,J as sn,K as Hi,L as Zi,M as qi,N as Pt,O as Us,Q as Vs,S as Ks,U as Ws,V as Gi,W as Hs,X as Zs,Y as Eo,Z as Qi,$ as Yi,a0 as Xi,a1 as Ji,a2 as ea,a3 as ta,a4 as na,a5 as oa,a6 as ra,a7 as sa,a8 as ia,a9 as aa,aa as Go,ab as $e,ac as la,ad as ca,ae as Jt,af as da,ag as ua,ah as Oo,ai as me,aj as i,ak as pa,al as ha,am as ma,an as fa,ao as Qo,ap as dt,aq as ga,ar as ya,as as ba,at as va}from"./tauri-compat-tfiFK9EG.js";import{I as cn,a as qs,b as Gs,c as Qs,B as ie}from"./index-Bpi3BHKj.js";import{W as xa}from"./WindowsTitlebar-CrkUa1UM.js";const wa="modulepreload",Ca=function(n){return"/"+n},Yo={},Gt=function(e,t,o){let r=Promise.resolve();if(t&&t.length>0){let l=function(p){return Promise.all(p.map(d=>Promise.resolve(d).then(m=>({status:"fulfilled",value:m}),m=>({status:"rejected",reason:m}))))};document.getElementsByTagName("link");const c=document.querySelector("meta[property=csp-nonce]"),u=(c==null?void 0:c.nonce)||(c==null?void 0:c.getAttribute("nonce"));r=l(t.map(p=>{if(p=Ca(p),p in Yo)return;Yo[p]=!0;const d=p.endsWith(".css"),m=d?'[rel="stylesheet"]':"";if(document.querySelector(`link[href="${p}"]${m}`))return;const f=document.createElement("link");if(f.rel=d?"stylesheet":wa,d||(f.as="script"),f.crossOrigin="",f.href=p,u&&f.setAttribute("nonce",u),document.head.appendChild(f),d)return new Promise((b,y)=>{f.addEventListener("load",b),f.addEventListener("error",()=>y(new Error(`Unable to preload CSS for ${p}`)))})}))}function s(l){const c=new Event("vite:preloadError",{cancelable:!0});if(c.payload=l,window.dispatchEvent(c),!c.defaultPrevented)throw l}return r.then(l=>{for(const c of l||[])c.status==="rejected"&&s(c.reason);return e().catch(s)})};function Xo(n,e){const t=e,o=new URL(t);if(o.protocol!=="http:"&&o.protocol!=="https:")throw new Error(`Service endpoint must use HTTP(S): ${t}`);return o.toString().replace(/\/+$/,"")}function Jo(n){const e=new URL(n);return e.protocol=e.protocol==="https:"?"wss:":"ws:",e.pathname=`${e.pathname.replace(/\/+$/,"")}/ws`,e.toString().replace(/\/$/,"")}function Sa(n){const e=Xo(n.VITE_BRIDGE_BASE,"http://127.0.0.1:14168"),t=Xo(n.VITE_CONDUCTOR_BASE,"http://127.0.0.1:8900");return{bridgeBase:e,conductorBase:t,wsUrl:Jo(e),conductorWsUrl:Jo(t)}}const dn=Sa({VITE_BRIDGE_BASE:void 0,VITE_CONDUCTOR_BASE:void 0}),ee=dn.bridgeBase,ka=dn.conductorBase,ja=dn.wsUrl,Ea=dn.conductorWsUrl,Oa=1e3,Pa=3e4;let ke=null,Po=0,kn=null;const jt=new Map;let _o="offline";const Mo=new Set;let er=!1;const _a=new Set;function jn(n){n!==_o&&(_o=n,n==="ready"&&(er||(er=!0,_a.forEach(e=>e()))),Mo.forEach(e=>e(n)))}function tr(){return _o}function Ys(n){return Mo.add(n),()=>{Mo.delete(n)}}function Xs(){if(!(ke&&(ke.readyState===WebSocket.OPEN||ke.readyState===WebSocket.CONNECTING))){jn("connecting");try{ke=new WebSocket(ja)}catch{nr();return}ke.onopen=()=>{Po=0,jn("ready")},ke.onmessage=n=>{try{const e=JSON.parse(n.data),t=e.type;if(!t)return;const o=jt.get(t);o&&o.forEach(r=>r(e))}catch{}},ke.onclose=()=>{ke=null,jn("connecting"),nr()},ke.onerror=()=>{ke==null||ke.close()}}}function nr(){if(kn)return;const n=Math.min(Oa*2**Po,Pa);Po++,kn=setTimeout(()=>{kn=null,Xs()},n)}function Ve(n,e){return jt.has(n)||jt.set(n,new Set),jt.get(n).add(e),Xs(),()=>{var t;(t=jt.get(n))==null||t.delete(e)}}let or=[];const Ma=new Set;let rr=!1;function La(){for(const n of Ma)n()}function En(n){or=[...or.slice(-39),n],La()}function Ia(){rr||(rr=!0,Ve("session-state",n=>{const e=n;if(!e.sessionId||!e.status)return;const t=e.status==="running"?"Turn started":e.status==="idle"?"Turn complete":e.status==="error"?"Turn error":`Session ${e.status}`;En(t)}),Ve("service.changed",n=>{const e=n;if(!e.service)return;const t=e.service.name??e.service.id??"service",o=e.service.status??"unknown";En(`${t}: ${o}`)}),Ve("token.changed",n=>{const e=n;!e.session_id||!e.total_output||En(`Token update: +${e.total_output} output`)}))}Ia();const Js=new Set(["http:","https:"]),Ta=new Set(["\\href","\\url"]),Ra=/^data:image\/(?:avif|gif|jpeg|png|webp);base64,[a-z0-9+/]+={0,2}$/i,Na=/^(?:\/|\.\/)?assets\//,Da=/%(?:2e|2f|5c)/i,ei=/[\u0000-\u001f\u007f]/;function $o(n){const e=n.trim();if(!/^https?:\/\//i.test(e)||ei.test(e))return null;try{const t=new URL(e);return Js.has(t.protocol)?t.href:null}catch{return null}}function $a(n){if(!Na.test(n)||n.startsWith("//")||n.includes("\\")||Da.test(n))return null;try{const e=new URL(n,"https://genericagent.invalid/");return e.origin==="https://genericagent.invalid"&&e.pathname.startsWith("/assets/")?n:null}catch{return null}}function Aa(n){const e=n.trim();if(!e||ei.test(e))return null;if(Ra.test(e))return e;if(/^blob:/i.test(e))try{return new URL(e).protocol==="blob:"?e:null}catch{return null}if(/^asset:/i.test(e))try{const t=new URL(e);return t.protocol==="asset:"&&(t.hostname===""||t.hostname==="localhost")&&!t.username&&!t.password?e:null}catch{return null}if(/^https?:\/\/asset\.localhost(?:\/|$)/i.test(e))try{const t=new URL(e);return t.hostname==="asset.localhost"&&Js.has(t.protocol)?t.href:null}catch{return null}return $a(e)}const Sm=(n,e,t)=>{if(e==="href")return $o(n)??void 0;if(e==="src"&&t.tagName==="img")return Aa(n)??void 0};function Fa(n){return!Ta.has(n.command)||!("url"in n)?!1:$o(n.url)!==null}const km={strict:"ignore",trust:Fa};function za(n,e){const t=n.target;if(!(t instanceof Element))return;const o=t.closest("[href]");if(!o)return;const r=$o(o.getAttribute("href")??"");if(!r){n.preventDefault();return}const s=new URL(r);if(!(!e||s.origin===location.origin)){n.preventDefault();try{Promise.resolve(e(r)).catch(l=>{console.error("[external-link] opener failed:",l)})}catch(l){console.error("[external-link] opener failed:",l)}}}var Ba=Li();const Lo=We(Ba);var Ua=Ii();const jm=We(Ua);function Va(n){return a.createElement("svg",Object.assign({viewBox:"0 0 24 24",fill:"none",xmlns:"http://www.w3.org/2000/svg",width:"1em",height:"1em",focusable:!1,"aria-hidden":!0},n),a.createElement("path",{fillRule:"evenodd",clipRule:"evenodd",d:"M7.7 2.8a1 1 0 0 1 0 1.4l-3 3a1 1 0 0 1-1.4 0L1.8 5.7a1 1 0 0 1 1.4-1.4l.8.79 2.3-2.3a1 1 0 0 1 1.4 0Z",fill:"currentColor"}),a.createElement("path",{fillRule:"evenodd",clipRule:"evenodd",d:"M7.7 9.8a1 1 0 0 1 0 1.4l-3 3a1 1 0 0 1-1.4 0l-1.5-1.5a1 1 0 1 1 1.4-1.4l.8.79 2.3-2.3a1 1 0 0 1 1.4 0Z",fill:"currentColor"}),a.createElement("path",{fillRule:"evenodd",clipRule:"evenodd",d:"M7.7 16.8a1 1 0 0 1 0 1.4l-3 3a1 1 0 0 1-1.4 0l-1.5-1.5a1 1 0 1 1 1.4-1.4l.8.79 2.3-2.3a1 1 0 0 1 1.4 0Z",fill:"currentColor"}),a.createElement("path",{fillRule:"evenodd",clipRule:"evenodd",d:"M9.5 12a1 1 0 0 1 1-1h11a1 1 0 1 1 0 2h-11a1 1 0 0 1-1-1Z",fill:"currentColor"}),a.createElement("path",{fillRule:"evenodd",clipRule:"evenodd",d:"M9.5 19a1 1 0 0 1 1-1h11a1 1 0 1 1 0 2h-11a1 1 0 0 1-1-1Z",fill:"currentColor"}),a.createElement("path",{fillRule:"evenodd",clipRule:"evenodd",d:"M9.5 5a1 1 0 0 1 1-1h11a1 1 0 1 1 0 2h-11a1 1 0 0 1-1-1Z",fill:"currentColor"}))}const Ka=fe(Va,"checklist_stroked");function Wa(n){return a.createElement("svg",Object.assign({viewBox:"0 0 24 24",fill:"none",xmlns:"http://www.w3.org/2000/svg",width:"1em",height:"1em",focusable:!1,"aria-hidden":!0},n),a.createElement("path",{fillRule:"evenodd",clipRule:"evenodd",d:"M12 23a11 11 0 1 0 0-22 11 11 0 0 0 0 22Zm5.04-6.14a1.5 1.5 0 0 1-2.13.04l-2.87-2.78L9.26 17A1.5 1.5 0 0 1 7.1 14.9l2.78-2.87L7 9.26A1.5 1.5 0 1 1 9.1 7.1l2.87 2.78L14.74 7A1.5 1.5 0 0 1 16.9 9.1l-2.78 2.87L17 14.74c.6.58.61 1.53.04 2.12Z",fill:"currentColor"}))}const Ha=fe(Wa,"clear");function Za(n){return a.createElement("svg",Object.assign({viewBox:"0 0 24 24",fill:"none",xmlns:"http://www.w3.org/2000/svg",width:"1em",height:"1em",focusable:!1,"aria-hidden":!0},n),a.createElement("path",{fillRule:"evenodd",clipRule:"evenodd",d:"M21 2a1 1 0 0 1 1 1v6a1 1 0 1 1-2 0V5.41l-9.3 9.3a1 1 0 0 1-1.4-1.42L18.58 4H15a1 1 0 1 1 0-2h6ZM2 5a1 1 0 0 1 1-1h8a1 1 0 1 1 0 2H4v14h14v-7a1 1 0 1 1 2 0v8a1 1 0 0 1-1 1H3a1 1 0 0 1-1-1V5Z",fill:"currentColor"}))}const qa=fe(Za,"external_open_stroked");function Ga(n){return a.createElement("svg",Object.assign({viewBox:"0 0 24 24",fill:"none",xmlns:"http://www.w3.org/2000/svg",width:"1em",height:"1em",focusable:!1,"aria-hidden":!0},n),a.createElement("path",{fillRule:"evenodd",clipRule:"evenodd",d:"M21.7 3.7a1 1 0 0 0-1.4-1.4L17.3 5.26A11.59 11.59 0 0 0 12 4C5 4 1 10 1 12c0 1.18 1.38 3.73 3.94 5.64L2.3 20.3a1 1 0 1 0 1.42 1.42l18-18ZM7.84 14.77l1.46-1.47a3 3 0 0 1 4-4l1.47-1.46a5 5 0 0 0-6.93 6.93Z",fill:"currentColor"}),a.createElement("path",{d:"M12 20c-1.22 0-2.35-.18-3.38-.5l2.57-2.57a5 5 0 0 0 5.75-5.75l3.56-3.56C22.13 9.27 23 11.07 23 12c0 2-4 8-11 8Z",fill:"currentColor"}))}const Qa=fe(Ga,"eye_closed_solid");function Ya(n){return a.createElement("svg",Object.assign({viewBox:"0 0 24 24",fill:"none",xmlns:"http://www.w3.org/2000/svg",width:"1em",height:"1em",focusable:!1,"aria-hidden":!0},n),a.createElement("path",{fillRule:"evenodd",clipRule:"evenodd",d:"M12 4C5 4 1 10 1 12s4 8 11 8 11-6 11-8-4-8-11-8Zm5 8a5 5 0 1 1-10 0 5 5 0 0 1 10 0Zm-5 3a3 3 0 1 0 0-6 3 3 0 0 0 0 6Z",fill:"currentColor"}))}const Xa=fe(Ya,"eye_opened");function Ja(n){return a.createElement("svg",Object.assign({viewBox:"0 0 24 24",fill:"none",xmlns:"http://www.w3.org/2000/svg",width:"1em",height:"1em",focusable:!1,"aria-hidden":!0},n),a.createElement("path",{d:"M8 1c2.5 0 3.19.3 4.15.68L13 2c1.5.5 3 1 5 1 .89 0 1.78-.2 2.5-.42.7-.22 1.5.3 1.5 1.04v10.76c0 .38-.21.73-.56.87l-.3.12c-.78.28-1.96.63-3.14.63-2 0-3.5-.5-5-1-.31-.1-.58-.2-.84-.3-.98-.39-1.79-.7-4.16-.7-1.27 0-3.27.3-4 .5V21a1 1 0 0 1-.84.99h-.04a1 1 0 0 1-.24 0h-.04A1 1 0 0 1 2 21V3.58c0-.36.2-.69.51-.85C3.57 2.18 6.08 1 8 1Zm0 2c-.61 0-1.46.2-2.38.54-.6.22-1.17.47-1.62.68v8.37l.46-.13C5.36 12.21 6.54 12 8 12c1.27 0 2.2.08 3 .24.8.17 1.39.4 1.88.59l.75.27c1.5.5 2.73.9 4.37.9.68 0 1.4-.17 2-.36V4.78c-.61.13-1.3.22-2 .22-2.36 0-4.13-.6-5.63-1.1l-.95-.35c-.5-.2-.76-.3-1.17-.39a8.82 8.82 0 0 0-1.46-.15L8 3Z",fill:"currentColor"}))}const el=fe(Ja,"flag_stroked");function tl(n){return a.createElement("svg",Object.assign({viewBox:"0 0 24 24",fill:"none",xmlns:"http://www.w3.org/2000/svg",width:"1em",height:"1em",focusable:!1,"aria-hidden":!0},n),a.createElement("path",{d:"M9 7a2 2 0 1 0 0-4 2 2 0 0 0 0 4Z",fill:"currentColor"}),a.createElement("path",{d:"M9 14a2 2 0 1 0 0-4 2 2 0 0 0 0 4Z",fill:"currentColor"}),a.createElement("path",{d:"M11 19a2 2 0 1 1-4 0 2 2 0 0 1 4 0Z",fill:"currentColor"}),a.createElement("path",{d:"M15 7a2 2 0 1 0 0-4 2 2 0 0 0 0 4Z",fill:"currentColor"}),a.createElement("path",{d:"M17 12a2 2 0 1 1-4 0 2 2 0 0 1 4 0Z",fill:"currentColor"}),a.createElement("path",{d:"M15 21a2 2 0 1 0 0-4 2 2 0 0 0 0 4Z",fill:"currentColor"}))}const nl=fe(tl,"handle");function ol(n){return a.createElement("svg",Object.assign({viewBox:"0 0 24 24",fill:"none",xmlns:"http://www.w3.org/2000/svg",width:"1em",height:"1em",focusable:!1,"aria-hidden":!0},n),a.createElement("path",{fillRule:"evenodd",clipRule:"evenodd",d:"M12 23a11 11 0 1 0 0-22 11 11 0 0 0 0 22Zm-.17-8.4c-.86 0-1.3-.53-1.3-1.23 0-1.05.53-1.72 1.74-2.64l.06-.05c.83-.62 1.4-1.06 1.4-1.85 0-.9-.83-1.4-1.76-1.4-.76 0-1.34.28-1.8.87-.33.34-.6.53-1.05.53C8.38 8.83 8 8.3 8 7.7c0-.6.34-1.22.88-1.68A5.15 5.15 0 0 1 12.28 5c2.71 0 4.62 1.34 4.62 3.64 0 1.68-1 2.5-2.2 3.31-.8.59-1.17.93-1.48 1.62-.33.6-.58 1.04-1.4 1.04Zm-.02 4.17c-.94 0-1.71-.6-1.71-1.54 0-.94.77-1.55 1.7-1.55.95 0 1.7.6 1.7 1.55 0 .93-.75 1.54-1.7 1.54Z",fill:"currentColor"}))}const rl=fe(ol,"help_circle");function sl(n){return a.createElement("svg",Object.assign({viewBox:"0 0 24 24",fill:"none",xmlns:"http://www.w3.org/2000/svg",width:"1em",height:"1em",focusable:!1,"aria-hidden":!0},n),a.createElement("path",{fillRule:"evenodd",clipRule:"evenodd",d:"M4.22 4.22a10.97 10.97 0 0 1 15.56 0l-.7.7.7-.7a10.97 10.97 0 0 1 0 15.56 10.97 10.97 0 0 1-15.56 0l.7-.7-.7.7a10.97 10.97 0 0 1 0-15.56ZM12 3a8.97 8.97 0 0 0-9 9 8.97 8.97 0 0 0 9 9 8.97 8.97 0 0 0 9-9 8.97 8.97 0 0 0-9-9Z",fill:"currentColor"}),a.createElement("path",{fillRule:"evenodd",clipRule:"evenodd",d:"M8 9.31a4 4 0 1 1 5 3.88v1.12a1 1 0 1 1-2 0v-2a1 1 0 0 1 1-1 2 2 0 1 0-2-2 1 1 0 0 1-2 0Z",fill:"currentColor"}),a.createElement("path",{fillRule:"evenodd",clipRule:"evenodd",d:"M12 18.81a1.25 1.25 0 1 0 0-2.5 1.25 1.25 0 0 0 0 2.5Z",fill:"currentColor"}))}const il=fe(sl,"help_circle_stroked");function al(n){return a.createElement("svg",Object.assign({viewBox:"0 0 24 24",fill:"none",xmlns:"http://www.w3.org/2000/svg",width:"1em",height:"1em",focusable:!1,"aria-hidden":!0},n),a.createElement("path",{fillRule:"evenodd",clipRule:"evenodd",d:"M10.1 10.58c.06 0 .1.05.1.12l-1.1 6.36 7.02-7.11h-3.07a.1.1 0 0 1-.1-.15l3.5-6.8H9.71l-3.5 7.58h3.88ZM8.3 1.29A.5.5 0 0 1 8.76 1H18.9c.37 0 .61.4.44.73l-3.18 6.22h3.55a.5.5 0 0 1 .36.85L7.18 21.87a.5.5 0 0 1-.85-.44l1.51-8.85H3.88a.5.5 0 0 1-.46-.71L8.3 1.29Z",fill:"currentColor"}))}const ll=fe(al,"lightning_stroked");function cl(n){return a.createElement("svg",Object.assign({viewBox:"0 0 24 24",fill:"none",xmlns:"http://www.w3.org/2000/svg",width:"1em",height:"1em",focusable:!1,"aria-hidden":!0},n),a.createElement("circle",{cx:12,cy:12,r:5,fill:"currentColor"}))}const dl=fe(cl,"radio");function ul(n){return a.createElement("svg",Object.assign({viewBox:"0 0 24 24",fill:"none",xmlns:"http://www.w3.org/2000/svg",width:"1em",height:"1em",focusable:!1,"aria-hidden":!0},n),a.createElement("path",{fillRule:"evenodd",clipRule:"evenodd",d:"M4.5 12a7.5 7.5 0 0 1 13.8-4.07l-2-.4a1.5 1.5 0 0 0-.6 2.94l5 1c.76.15 1.51-.3 1.74-1.04l1.5-5a1.5 1.5 0 1 0-2.88-.86l-.43 1.45A10.49 10.49 0 0 0 1.5 12a10.5 10.5 0 0 0 20.4 3.5 1.5 1.5 0 1 0-2.83-1A7.5 7.5 0 0 1 4.5 12Z",fill:"currentColor"}))}const pl=fe(ul,"refresh");function hl(n){return a.createElement("svg",Object.assign({viewBox:"0 0 24 24",fill:"none",xmlns:"http://www.w3.org/2000/svg",width:"1em",height:"1em",focusable:!1,"aria-hidden":!0},n),a.createElement("path",{fillRule:"evenodd",clipRule:"evenodd",d:"M16 10a6 6 0 1 1-12 0 6 6 0 0 1 12 0Zm-1.1 6.32a8 8 0 1 1 1.41-1.41l5.4 5.38a1 1 0 0 1-1.42 1.42l-5.38-5.39Z",fill:"currentColor"}))}const ti=fe(hl,"search_stroked");function ml(n){return a.createElement("svg",Object.assign({viewBox:"0 0 24 24",fill:"none",xmlns:"http://www.w3.org/2000/svg",width:"1em",height:"1em",focusable:!1,"aria-hidden":!0},n),a.createElement("path",{fillRule:"evenodd",clipRule:"evenodd",d:"M14 5.5a3.5 3.5 0 1 1 1 2.45l-5.13 3.11a3.5 3.5 0 0 1 .03 1.79l5.22 3.08A3.49 3.49 0 0 1 21 18.5a3.5 3.5 0 1 1-6.9-.85l-5.22-3.08A3.49 3.49 0 0 1 3 12a3.5 3.5 0 0 1 5.8-2.63l5.27-3.19A3.51 3.51 0 0 1 14 5.5ZM17.5 4a1.5 1.5 0 1 0 0 3 1.5 1.5 0 0 0 0-3Zm-11 6.5a1.5 1.5 0 1 0 0 3 1.5 1.5 0 0 0 0-3Zm9.5 8a1.5 1.5 0 1 1 3 0 1.5 1.5 0 0 1-3 0Z",fill:"currentColor"}))}const fl=fe(ml,"share_stroked");function gl(n){return a.createElement("svg",Object.assign({viewBox:"0 0 24 24",fill:"none",xmlns:"http://www.w3.org/2000/svg",width:"1em",height:"1em",focusable:!1,"aria-hidden":!0},n),a.createElement("path",{d:"m3 4.13 9-1.63 9 1.63v5.39c0 5.66-3.62 10.69-9 12.48-5.37-1.8-9-6.82-9-12.49V4.13Z",stroke:"currentColor",strokeWidth:2,strokeLinejoin:"round"}),a.createElement("path",{d:"M11.97 7.47v8",stroke:"currentColor",strokeWidth:2,strokeLinecap:"round",strokeLinejoin:"round"}),a.createElement("path",{d:"M7.97 11.47h8",stroke:"currentColor",strokeWidth:2,strokeLinecap:"round",strokeLinejoin:"round"}))}const yl=fe(gl,"shield_stroked");var On,sr;function ni(){if(sr)return On;sr=1;var n=$s(),e=As(),t="[object Number]";function o(r){return typeof r=="number"||e(r)&&n(r)==t}return On=o,On}var bl=ni();const Io=We(bl),oi={PREFIX:`${Te}-input`},Qt={SIZE:["small","large","default"],DEFAULT_SIZE:"default",STATUS:["default","error","warning","success"],CLEARBTN_CLICKED_EVENT_FLAG:"__fromClearBtn",MODE:["password"]},vl={};function xl(n){const{value:e,maxLength:t,getValueLength:o}=n;if(Be(o)){let r=0,s=e.length;for(;rt?s=l:r=l+1}return e.slice(0,r)}else return e.slice(0,t)}class Ao extends ge{static get inputDefaultAdapter(){return{notifyChange:$,setValue:$}}constructor(e){super(Object.assign(Object.assign({},Ao.inputDefaultAdapter),e)),this.compositionEnter=!1,this.getNextValue=t=>{const{maxLength:o,minLength:r,getValueLength:s}=this._adapter.getProps();return Be(s)?o?this.handleVisibleMaxLength(t):(r&&this.handleVisibleMinLength(t),t):t},this.changeInput=(t,o)=>{this._isControlledComponent()?this._adapter.notifyChange(t,o):(this._adapter.setValue(t),this._adapter.notifyChange(t,o))},this.handleCompositionStart=t=>{this.compositionEnter=!0,this._adapter.notifyCompositionStart(t)},this.handleCompositionEnd=t=>{const{composition:o}=this._adapter.getProps(),r=t.target.value;if(this.compositionEnter=!1,this._adapter.notifyCompositionEnd(t),o){const u=this.getNextValue(r);this.changeInput(u,t);return}const{getValueLength:s,maxLength:l,minLength:c}=this.getProps();if(Be(s)){if(l){const u=this.handleVisibleMaxLength(r);u!==r&&this.changeInput(u,t)}c&&this.handleVisibleMinLength(r)}},this.handleCompositionUpdate=t=>{this._adapter.notifyCompositionUpdate(t)}}destroy(){this._timer&&(clearTimeout(this._timer),this._timer=null)}setDisable(){}setValue(e){this._adapter.setValue(e)}handleChange(e,t){const{composition:o}=this._adapter.getProps();let r=e;if(o&&this.compositionEnter){this._adapter.setValue(r);return}this.compositionEnter||(r=this.getNextValue(r)),this.changeInput(r,t)}handleVisibleMinLength(e){const{minLength:t,getValueLength:o}=this._adapter.getProps(),{minLength:r}=this._adapter.getStates();if(Io(t)&&t>=0&&Be(o)&&De(e)){const s=o(e);if(s=0&&Be(o)&&De(e)&&o(e)>t?(console.warn("[Semi Input] The input character is truncated because the input length exceeds the maximum length limit"),this.handleTruncateValue(e,t)):e}handleTruncateValue(e,t){const{getValueLength:o}=this._adapter.getProps();return xl({value:e,maxLength:t,getValueLength:o})}handleClear(e){let t=e;const o="";this._isControlledComponent("value")?this._adapter.setState({isFocus:!1}):this._adapter.setState({value:"",isFocus:!1}),(!t||typeof t!="object")&&(t={}),Ti(t,Qt.CLEARBTN_CLICKED_EVENT_FLAG,!0),this._adapter.notifyChange(o,t),this._adapter.notifyClear(t),t&&this.stopPropagation(t)}handleClick(e){const{disabled:t}=this._adapter.getProps(),{isFocus:o}=this._adapter.getStates();t||o||this._adapter.isEventTarget(e)&&(this._adapter.focusInput(),this._adapter.toggleFocusing(!0))}handleModeChange(e){e==="password"?this._adapter.setEyeClosed(!0):this._adapter.setEyeClosed(!1)}handleClickEye(e){const t=this._adapter.getState("eyeClosed");this._adapter.focusInput(),this._adapter.toggleFocusing(!0),this._adapter.setEyeClosed(!t)}handleInputType(e){const t=this._adapter.getProp("mode"),o=this._adapter.getState("eyeClosed");return t==="password"?o?"password":"text":e}handleMouseDown(e){e.preventDefault()}handleMouseUp(e){e.preventDefault()}handleBlur(e){const{value:t}=this.getStates();this._adapter.toggleFocusing(!1),this._adapter.notifyBlur(t,e)}handleFocus(e){const{value:t}=this.getStates();this._adapter.toggleFocusing(!0),this._adapter.notifyFocus(t,e)}handleInput(e){this._adapter.notifyInput(e)}handleKeyDown(e){this._adapter.notifyKeyDown(e)}handleKeyUp(e){this._adapter.notifyKeyUp(e)}handleKeyPress(e){this._adapter.notifyKeyPress(e),e.key===Ri&&this._adapter.notifyEnterPress(e)}isAllowClear(){const{value:e,isFocus:t,isHovering:o}=this._adapter.getStates(),{showClear:r,disabled:s,showClearIgnoreDisabled:l}=this._adapter.getProps();return e&&r&&(!s||l)&&(t||o)}handleClickPrefixOrSuffix(e){const{disabled:t}=this._adapter.getProps(),{isFocus:o}=this._adapter.getStates();!t&&!o&&(this._adapter.focusInput(),this._adapter.toggleFocusing(!0))}handlePreventMouseDown(e){e&&Be(e.preventDefault)&&e.preventDefault()}handleModeEnterPress(e){["Enter"," "].includes(e==null?void 0:e.key)&&(this.handlePreventMouseDown(e),this.handleClickEye(e))}}var wl=function(n,e){var t={};for(var o in n)Object.prototype.hasOwnProperty.call(n,o)&&e.indexOf(o)<0&&(t[o]=n[o]);if(n!=null&&typeof Object.getOwnPropertySymbols=="function")for(var r=0,o=Object.getOwnPropertySymbols(n);r{this.foundation.handleClear(o)},this.handleClick=o=>{this.foundation.handleClick(o)},this.handleMouseOver=o=>{this.setState({isHovering:!0})},this.handleMouseLeave=o=>{this.setState({isHovering:!1})},this.handleModeChange=o=>{this.foundation.handleModeChange(o)},this.handleClickEye=o=>{this.foundation.handleClickEye(o)},this.handleMouseDown=o=>{this.foundation.handleMouseDown(o)},this.handleMouseUp=o=>{this.foundation.handleMouseUp(o)},this.handleModeEnterPress=o=>{this.foundation.handleModeEnterPress(o)},this.handleClickPrefixOrSuffix=o=>{this.foundation.handleClickPrefixOrSuffix(o)},this.handlePreventMouseDown=o=>{this.foundation.handlePreventMouseDown(o)};const t="value"in e?e.value:e.defaultValue;this.state={value:t,cachedValue:e.value,disabled:!1,props:{},isFocus:!1,isHovering:!1,eyeClosed:e.mode==="password",minLength:e.minLength},this.inputRef=g.createRef(),this.prefixRef=g.createRef(),this.suffixRef=g.createRef(),this.foundation=new Ao(this.adapter)}get adapter(){return Object.assign(Object.assign({},super.adapter),{setValue:e=>this.setState({value:e}),setEyeClosed:e=>this.setState({eyeClosed:e}),toggleFocusing:e=>{this.setState({isFocus:e})},focusInput:()=>{const{preventScroll:e}=this.props,t=this.inputRef&&this.inputRef.current;t&&t.focus({preventScroll:e})},toggleHovering:e=>this.setState({isHovering:e}),getIfFocusing:()=>this.state.isFocus,notifyChange:(e,t)=>this.props.onChange(e,t),notifyBlur:(e,t)=>this.props.onBlur(t),notifyFocus:(e,t)=>this.props.onFocus(t),notifyInput:e=>this.props.onInput(e),notifyKeyPress:e=>this.props.onKeyPress(e),notifyKeyDown:e=>this.props.onKeyDown(e),notifyKeyUp:e=>this.props.onKeyUp(e),notifyEnterPress:e=>this.props.onEnterPress(e),notifyClear:e=>this.props.onClear(e),notifyCompositionStart:e=>this.props.onCompositionStart(e),notifyCompositionEnd:e=>this.props.onCompositionEnd(e),notifyCompositionUpdate:e=>this.props.onCompositionUpdate(e),setMinLength:e=>this.setState({minLength:e}),isEventTarget:e=>e&&e.target===e.currentTarget})}static getDerivedStateFromProps(e,t){const o={};return e.value!==t.cachedValue&&(o.value=e.value,o.cachedValue=e.value),o}componentDidUpdate(e){const{mode:t}=this.props;e.mode!==t&&this.handleModeChange(t)}componentDidMount(){const{disabled:e,autoFocus:t,preventScroll:o}=this.props;!e&&(t||this.props.autofocus)&&this.inputRef.current.focus({preventScroll:o})}renderPrepend(){const{addonBefore:e}=this.props;if(e){const t=I({[`${U}-prepend`]:!0,[`${U}-prepend-text`]:e&&De(e),[`${U}-prepend-icon`]:Ge(e)});return g.createElement("div",{className:t,"x-semi-prop":"addonBefore"},e)}return null}renderAppend(){const{addonAfter:e}=this.props;if(e){const t=I({[`${U}-append`]:!0,[`${U}-append-text`]:e&&De(e),[`${U}-append-icon`]:Ge(e)});return g.createElement("div",{className:t,"x-semi-prop":"addonAfter"},e)}return null}renderClearBtn(){const e=I(`${U}-clearbtn`),{clearIcon:t}=this.props;return this.foundation.isAllowClear()?g.createElement("div",{className:e,onMouseDown:this.handleClear},t||g.createElement(Ha,null)):null}renderModeBtn(){const{eyeClosed:e}=this.state,{mode:t,disabled:o}=this.props,r=I(`${U}-modebtn`),s=e?g.createElement(Qa,null):g.createElement(Xa,null),l=t==="password"&&!o,c=e?"Show password":"Hidden password";return l?g.createElement("div",{role:"button",tabIndex:0,"aria-label":c,className:r,onClick:this.handleClickEye,onMouseDown:this.handleMouseDown,onMouseUp:this.handleMouseUp,onKeyPress:this.handleModeEnterPress},s):null}renderPrefix(){const{prefix:e,insetLabel:t,insetLabelId:o}=this.props,r=e||t;if(!r)return null;const s=I({[`${U}-prefix`]:!0,[`${U}-inset-label`]:t,[`${U}-prefix-text`]:r&&De(r),[`${U}-prefix-icon`]:Ge(r)});return g.createElement("div",{className:s,onMouseDown:this.handlePreventMouseDown,onClick:this.handleClickPrefixOrSuffix,id:o,"x-semi-prop":"prefix,insetLabel"},r)}renderSuffix(e){const{suffix:t,hideSuffix:o}=this.props;if(!t)return null;const r=I({[`${U}-suffix`]:!0,[`${U}-suffix-text`]:t&&De(t),[`${U}-suffix-icon`]:Ge(t),[`${U}-suffix-hidden`]:e&&!!o});return g.createElement("div",{className:r,onMouseDown:this.handlePreventMouseDown,onClick:this.handleClickPrefixOrSuffix,"x-semi-prop":"suffix"},t)}getInputRef(){const{forwardRef:e}=this.props;if(!Fs(e)){if(typeof e=="function")return t=>{e(t),this.inputRef={current:t}};if(Object.prototype.toString.call(e)==="[object Object]")return this.inputRef=e,e}return this.inputRef}render(){const e=this.props,{addonAfter:t,addonBefore:o,autoFocus:r,clearIcon:s,className:l,disabled:c,defaultValue:u,placeholder:p,prefix:d,mode:m,insetLabel:f,insetLabelId:b,validateStatus:y,type:S,readonly:w,size:C,suffix:k,style:_,showClear:x,onEnterPress:j,onClear:v,hideSuffix:O,inputStyle:E,forwardRef:D,maxLength:P,getValueLength:R,preventScroll:L,borderless:z,showClearIgnoreDisabled:W,onlyBorder:A,composition:M}=e,Z=wl(e,["addonAfter","addonBefore","autoFocus","clearIcon","className","disabled","defaultValue","placeholder","prefix","mode","insetLabel","insetLabelId","validateStatus","type","readonly","size","suffix","style","showClear","onEnterPress","onClear","hideSuffix","inputStyle","forwardRef","maxLength","getValueLength","preventScroll","borderless","showClearIgnoreDisabled","onlyBorder","composition"]),{value:ue,isFocus:we,minLength:T}=this.state,F=this.foundation.isAllowClear(),Q=Ge(k),se=this.getInputRef(),te=`${U}-wrapper`,Ce=I(te,l,{[`${U}-wrapper__with-prefix`]:d||f,[`${U}-wrapper__with-suffix`]:k,[`${U}-wrapper__with-suffix-hidden`]:F&&!!O,[`${U}-wrapper__with-suffix-icon`]:Q,[`${U}-wrapper__with-append`]:o,[`${U}-wrapper__with-prepend`]:t,[`${U}-wrapper__with-append-only`]:o&&!t,[`${U}-wrapper__with-prepend-only`]:!o&&t,[`${te}-readonly`]:w,[`${te}-disabled`]:c,[`${te}-warning`]:y==="warning",[`${te}-error`]:y==="error",[`${te}-focus`]:we,[`${te}-clearable`]:x,[`${te}-modebtn`]:m==="password",[`${te}-hidden`]:S==="hidden",[`${te}-${C}`]:C,[`${U}-borderless`]:z,[`${U}-only_border`]:A!=null}),pe=I(U,{[`${U}-${C}`]:C,[`${U}-disabled`]:c,[`${U}-sibling-clearbtn`]:this.foundation.isAllowClear(),[`${U}-sibling-modebtn`]:m==="password"}),vt=ue??"",nt=Object.assign(Object.assign({},Z),{style:E,className:pe,disabled:c,readOnly:w,type:this.foundation.handleInputType(S),placeholder:p,onInput:B=>this.foundation.handleInput(B),onChange:B=>this.foundation.handleChange(B.target.value,B),onFocus:B=>this.foundation.handleFocus(B),onBlur:B=>this.foundation.handleBlur(B),onKeyUp:B=>this.foundation.handleKeyUp(B),onKeyDown:B=>this.foundation.handleKeyDown(B),onKeyPress:B=>this.foundation.handleKeyPress(B),onCompositionStart:this.foundation.handleCompositionStart,onCompositionEnd:this.foundation.handleCompositionEnd,onCompositionUpdate:this.foundation.handleCompositionUpdate,value:vt});Be(R)||(nt.maxLength=P),T&&(nt.minLength=T),y==="error"&&(nt["aria-invalid"]="true");let N=Object.assign({},_);return A!==void 0&&(N=Object.assign({borderWidth:A},_)),g.createElement("div",{className:Ce,style:N,onMouseEnter:B=>this.handleMouseOver(B),onMouseLeave:B=>this.handleMouseLeave(B),onClick:B=>this.handleClick(B)},this.renderPrepend(),this.renderPrefix(),g.createElement("input",Object.assign({},nt,{ref:se})),this.renderClearBtn(),this.renderSuffix(F),this.renderModeBtn(),this.renderAppend())}}Fo.propTypes={"aria-label":h.string,"aria-labelledby":h.string,"aria-invalid":h.bool,"aria-errormessage":h.string,"aria-describedby":h.string,"aria-required":h.bool,addonBefore:h.node,addonAfter:h.node,clearIcon:h.node,prefix:h.node,suffix:h.node,mode:h.oneOf(kl),value:h.any,defaultValue:h.any,disabled:h.bool,readonly:h.bool,autoFocus:h.bool,type:h.string,showClear:h.bool,hideSuffix:h.bool,placeholder:h.any,size:h.oneOf(Cl),className:h.string,style:h.object,validateStatus:h.oneOf(Sl),onClear:h.func,onChange:h.func,onBlur:h.func,onFocus:h.func,onInput:h.func,onKeyDown:h.func,onKeyUp:h.func,onKeyPress:h.func,onEnterPress:h.func,onCompositionStart:h.func,onCompositionEnd:h.func,onCompositionUpdate:h.func,insetLabel:h.node,insetLabelId:h.string,inputStyle:h.object,getValueLength:h.func,preventScroll:h.bool,borderless:h.bool,composition:h.bool};Fo.defaultProps={addonBefore:"",addonAfter:"",prefix:"",suffix:"",readonly:!1,type:"text",showClear:!1,hideSuffix:!1,placeholder:"",size:"default",className:"",onClear:$,onChange:$,onBlur:$,onFocus:$,onInput:$,onKeyDown:$,onKeyUp:$,onKeyPress:$,onEnterPress:$,onCompositionStart:$,onCompositionEnd:$,onCompositionUpdate:$,validateStatus:"default",borderless:!1,composition:!1};const ut=g.forwardRef((n,e)=>g.createElement(Fo,Object.assign({},n,{forwardRef:e}))),jl={PREFIX:`${Te}-avatar`},un={SHAPE:["circle","square"],SIZE:["extra-extra-small","extra-small","small","default","medium","large","extra-large"],COLOR:["grey","red","pink","purple","violet","indigo","blue","light-blue","cyan","teal","green","light-green","lime","yellow","amber","orange","white"]};class El extends ge{constructor(e){super(Object.assign({},e)),this.handleFocusVisible=t=>{const{target:o}=t;try{o.matches(":focus-visible")&&this._adapter.setFocusVisible(!0)}catch{zs(!0,"Warning: [Semi Avatar] The current browser does not support the focus-visible")}},this.handleBlur=()=>{this._adapter.setFocusVisible(!1)},this.changeScale=()=>{const{gap:t}=this.getProps(),o=this._adapter.getAvatarNode(),r=o==null?void 0:o.firstChild,[s,l]=[(o==null?void 0:o.offsetWidth)||0,(r==null?void 0:r.offsetWidth)||0];if(s!==0&&l!==0&&t*2l?1:(s-t*2)/l;this._adapter.setScale(c)}}}init(){const{children:e}=this.getProps();typeof e=="string"&&this.changeScale()}destroy(){}handleImgLoadError(){const{onError:e}=this.getProps();(e?e():void 0)!==!1&&this._adapter.notifyImgState(!1)}handleEnter(e){this._adapter.notifyEnter(e)}handleLeave(e){this._adapter.notifyLeave(e)}}const Ol=n=>{let{gradientStart:e,gradientEnd:t}=n;const o=jo();return g.createElement("svg",{xmlns:"http://www.w3.org/2000/svg",width:"51",height:"52",viewBox:"0 0 51 52",fill:"none"},g.createElement("g",{filter:"url(#filter0_d_6_2)"},g.createElement("path",{d:"M40.4918 46.5592C44.6795 43.176 46.261 34.1333 47.5301 25.6141C49.5854 11.8168 39.6662 1 25.8097 1C11.2857 1 3 11.4279 3 25.3518C3 33.7866 6.29361 43.8947 10.4602 46.5592C12.5868 47.9192 12.5868 47.9051 25.8097 47.9192C38.3651 47.9282 38.5352 48.14 40.4918 46.5592Z",fill:`url(#${o})`})),g.createElement("defs",null,g.createElement("filter",{id:"filter0_d_6_2",x:"0.789215",y:"0.447304",width:"49.2216",height:"51.3549",filterUnits:"userSpaceOnUse",colorInterpolationFilters:"sRGB"},g.createElement("feFlood",{floodOpacity:"0",result:"BackgroundImageFix"}),g.createElement("feColorMatrix",{in:"SourceAlpha",type:"matrix",values:"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0",result:"hardAlpha"}),g.createElement("feOffset",{dy:"1.65809"}),g.createElement("feGaussianBlur",{stdDeviation:"1.10539"}),g.createElement("feColorMatrix",{type:"matrix",values:"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.3 0"}),g.createElement("feBlend",{mode:"normal",in2:"BackgroundImageFix",result:"effect1_dropShadow_6_2"}),g.createElement("feBlend",{mode:"normal",in:"SourceGraphic",in2:"effect1_dropShadow_6_2",result:"shape"})),g.createElement("linearGradient",{id:o,x1:"17.671",y1:"31.7392",x2:"17.671",y2:"47.9333",gradientUnits:"userSpaceOnUse"},g.createElement("stop",{stopColor:e}),g.createElement("stop",{offset:"1",stopColor:t}))))};var Pl=function(n,e){var t={};for(var o in n)Object.prototype.hasOwnProperty.call(n,o)&&e.indexOf(o)<0&&(t[o]=n[o]);if(n!=null&&typeof Object.getOwnPropertySymbols=="function")for(var r=0,o=Object.getOwnPropertySymbols(n);r{this.foundation.handleFocusVisible(t)},this.handleBlur=t=>{this.foundation.handleBlur()},this.getContent=()=>{const{children:t,onClick:o,imgAttr:r,src:s,srcSet:l,alt:c}=this.props,{isImgExist:u}=this.state;let p=t;const d=o!==rn,m=s&&u,f={tabIndex:0,onKeyDown:this.handleKeyDown,onFocus:this.handleFocusVisible,onBlur:this.handleBlur};if(m){const b=d?`clickable Avatar: ${c}`:c,y=Object.assign(Object.assign({src:s,srcSet:l,onError:this.handleError},r),{className:I({[`${V}-no-focus-visible`]:d})}),S=d?Object.assign(Object.assign({},y),f):y;p=g.createElement("img",Object.assign({alt:b},S))}else if(typeof t=="string"){const b=c??t,S={role:"img","aria-label":d?`clickable Avatar: ${b}`:b,className:I(`${V}-label`,{[`${V}-no-focus-visible`]:d})},w=d?Object.assign(Object.assign({},S),f):S,C={transform:`scale(${this.state.scale})`};p=g.createElement("span",{className:`${V}-content`,style:C},g.createElement("span",Object.assign({},w,{"x-semi-prop":"children"}),t))}return p},this.renderBottomSlot=()=>{var t,o;if(!this.props.bottomSlot)return null;if(this.props.bottomSlot.render)return this.props.bottomSlot.render();const r=(t=this.props.bottomSlot.render)!==null&&t!==void 0?t:()=>{var s;const l={};return this.props.bottomSlot.bgColor&&(l.backgroundColor=this.props.bottomSlot.bgColor),this.props.bottomSlot.textColor&&(l.color=this.props.bottomSlot.textColor),g.createElement("span",{style:l,className:I(`${V}-bottom_slot-shape_${this.props.bottomSlot.shape}`,`${V}-bottom_slot-shape_${this.props.bottomSlot.shape}-${this.props.size}`,(s=this.props.bottomSlot.className)!==null&&s!==void 0?s:"")},this.props.bottomSlot.text)};return g.createElement("div",{className:I([`${V}-bottom_slot`]),style:(o=this.props.bottomSlot.style)!==null&&o!==void 0?o:{}},r())},this.renderTopSlot=()=>{var t,o,r,s;if(!this.props.topSlot)return null;if(this.props.topSlot.render)return this.props.topSlot.render();const l={};return this.props.topSlot.textColor&&(l.color=this.props.topSlot.textColor),g.createElement("div",{style:(t=this.props.topSlot.style)!==null&&t!==void 0?t:{},className:I([`${V}-top_slot-wrapper`,(o=this.props.topSlot.className)!==null&&o!==void 0?o:"",{[`${V}-animated`]:this.props.contentMotion}])},g.createElement("div",{className:I([`${V}-top_slot-bg`,`${V}-top_slot-bg-${this.props.size}`])},g.createElement("div",{className:I([`${V}-top_slot-bg-svg`,`${V}-top_slot-bg-svg-${this.props.size}`])},g.createElement(Ol,{gradientStart:(r=this.props.topSlot.gradientStart)!==null&&r!==void 0?r:"var(--semi-color-primary)",gradientEnd:(s=this.props.topSlot.gradientEnd)!==null&&s!==void 0?s:"var(--semi-color-primary)"}))),g.createElement("div",{className:I([`${V}-top_slot`])},g.createElement("div",{style:l,className:I([`${V}-top_slot-content`,`${V}-top_slot-content-${this.props.size}`])},this.props.topSlot.text)))},this.state={isImgExist:!0,hoverContent:"",focusVisible:!1,scale:1},this.onEnter=this.onEnter.bind(this),this.onLeave=this.onLeave.bind(this),this.handleError=this.handleError.bind(this),this.handleKeyDown=this.handleKeyDown.bind(this),this.getContent=this.getContent.bind(this),this.avatarRef=g.createRef()}get adapter(){return Object.assign(Object.assign({},super.adapter),{notifyImgState:e=>{this.setState({isImgExist:e})},notifyEnter:e=>{const{hoverMask:t}=this.props,o=t;this.setState({hoverContent:o},()=>{const{onMouseEnter:r}=this.props;r&&r(e)})},notifyLeave:e=>{this.setState({hoverContent:""},()=>{const{onMouseLeave:t}=this.props;t&&t(e)})},setFocusVisible:e=>{this.setState({focusVisible:e})},setScale:e=>{this.setState({scale:e})},getAvatarNode:()=>{var e;return(e=this.avatarRef)===null||e===void 0?void 0:e.current}})}componentDidMount(){this.foundation=new El(this.adapter),this.foundation.init()}componentDidUpdate(e){if(this.props.src&&this.props.src!==e.src){const t=new Image(0,0);t.src=this.props.src,t.onload=()=>{this.setState({isImgExist:!0})},t.onerror=()=>{this.setState({isImgExist:!1})},t.onabort=()=>{this.setState({isImgExist:!1})}}typeof this.props.children=="string"&&this.props.children!==e.children&&this.foundation.changeScale()}componentWillUnmount(){this.foundation.destroy()}onEnter(e){this.foundation.handleEnter(e)}onLeave(e){this.foundation.handleLeave(e)}handleError(){this.foundation.handleImgLoadError()}handleKeyDown(e){const{onClick:t}=this.props;switch(e.key){case"Enter":t(e),Je(e);break;case"Escape":e.target.blur();break}}render(){var e;const t=this.props,{shape:o,children:r,size:s,color:l,className:c,hoverMask:u,onClick:p,imgAttr:d,src:m,srcSet:f,style:b,alt:y,gap:S,bottomSlot:w,topSlot:C,border:k,contentMotion:_}=t,x=Pl(t,["shape","children","size","color","className","hoverMask","onClick","imgAttr","src","srcSet","style","alt","gap","bottomSlot","topSlot","border","contentMotion"]),{isImgExist:j,hoverContent:v,focusVisible:O}=this.state;let E={};un.SIZE.includes(s)||(E={width:s,height:s}),E=Object.assign(Object.assign({},E),b);const D=w||C||k,P={onClick:p,onMouseEnter:this.onEnter,onMouseLeave:this.onLeave},R=m&&j,L=I(V,{[`${V}-${o}`]:o,[`${V}-${s}`]:s,[`${V}-${l}`]:l&&!R,[`${V}-img`]:R,[`${V}-focus`]:O,[`${V}-animated`]:_},c),z=v?g.createElement("div",{className:`${V}-hover`,"x-semi-prop":"hoverContent"},v):null;let W=g.createElement("span",Object.assign({},x,{style:D?{}:E,className:L},D?{}:P,{role:"listitem",ref:this.avatarRef}),this.getContent(),z);if(k){const A={};typeof k=="object"&&(k!=null&&k.color)&&(A.borderColor=k==null?void 0:k.color),W=g.createElement("div",{style:Object.assign({position:"relative"},E)},W,g.createElement("span",{style:A,className:I([`${V}-additionalBorder`,`${V}-additionalBorder-${s}`,{[`${V}-${o}`]:o}])}),typeof this.props.border=="object"&&this.props.border.motion&&g.createElement("span",{style:A,className:I([`${V}-additionalBorder`,`${V}-additionalBorder-${s}`,{[`${V}-${o}`]:o,[`${V}-additionalBorder-animated`]:typeof this.props.border=="object"&&((e=this.props.border)===null||e===void 0?void 0:e.motion)}])}))}return D?g.createElement("span",Object.assign({className:I([`${V}-wrapper`]),style:E},P),W,C&&["extra-small","small","default","medium","large","extra-large"].includes(s)&&o==="circle"&&this.renderTopSlot(),w&&["extra-small","small","default","medium","large","extra-large"].includes(s)&&this.renderBottomSlot()):W}}ht.__SemiComponentName__="Avatar";ht.defaultProps=ln(ht.__SemiComponentName__,{size:"medium",color:"grey",shape:"circle",gap:3,onClick:rn,onMouseEnter:rn,onMouseLeave:rn});ht.propTypes={children:h.node,color:h.oneOf(Ll),shape:h.oneOf(Ml),size:h.oneOf(_l),hoverMask:h.node,className:h.string,style:h.object,gap:h.number,imgAttr:h.object,src:h.string,srcSet:h.string,alt:h.string,onError:h.func,onClick:h.func,onMouseEnter:h.func,onMouseLeave:h.func,bottomSlot:h.shape({render:h.func,shape:h.oneOf(["circle","square"]),text:h.node,bgColor:h.string,textColor:h.string,className:h.string,style:h.object}),topSlot:h.shape({render:h.func,gradientStart:h.string,gradientEnd:h.string,text:h.node,textColor:h.string,className:h.string,style:h.object}),border:h.oneOfType([h.shape({color:h.string,motion:h.bool}),h.bool]),contentMotion:h.bool};ht.elementType="Avatar";var Pn,ir;function Il(){if(ir)return Pn;ir=1;function n(e,t,o,r){for(var s=e.length,l=o+(r?1:-1);r?l--:++l-1}return Rn=e,Rn}var Nn,hr;function Fl(){if(hr)return Nn;hr=1;function n(e,t,o){for(var r=-1,s=e==null?0:e.length;++r=l&&(b=s,y=!1,p=new n(p));e:for(;++fthis.close(z,o,t)},g.createElement(cn,{size:"small"})):null,R=De(o),L=I(`${le}-content`,`${le}-content-${R?"ellipsis":"center"}`);return g.createElement("div",Object.assign({"aria-label":this.props["aria-label"]||R?`${l?"Closable ":""}Tag: ${o}`:""},D),w?g.createElement("div",{className:`${le}-prefix-icon`},w):null,b?this.renderAvatar():null,g.createElement("div",{className:L},o),C?g.createElement("div",{className:`${le}-suffix-icon`},C):null,P)}}Ae.defaultProps={size:si[0],color:ri[0],closable:!1,type:ii[0],onClose:()=>{},onClick:()=>{},onMouseEnter:()=>{},style:{},className:"",shape:"square",avatarShape:"square",prefixIcon:null,suffixIcon:null,colorful:!1,gradient:!1};Ae.propTypes={children:h.node,tagKey:h.oneOfType([h.string,h.number]),size:h.oneOf(si),color:h.oneOf(ri),type:h.oneOf(ii),closable:h.bool,visible:h.bool,onClose:h.func,onClick:h.func,prefixIcon:h.node,suffixIcon:h.node,style:h.object,className:h.string,avatarSrc:h.string,colorful:h.bool,gradient:h.bool,avatarShape:h.oneOf(Hl),"aria-label":h.string};$l();var An,gr;function Zl(){if(gr)return An;gr=1;var n=Fi();function e(t,o){return t==null?!0:n(t,o)}return An=e,An}Zl();var Fn,yr;function ql(){if(yr)return Fn;yr=1;var n=No(),e=zi(),t=Bi(),o=Ui(),r=Vi(),s=Ki(),l=Bs();function c(u){return t(u)?n(u,s):o(u)?[u]:e(r(l(u)))}return Fn=c,Fn}ql();var zn,br;function Gl(){if(br)return zn;br=1;var n=Object.prototype,e=n.hasOwnProperty;function t(o,r){return o!=null&&e.call(o,r)}return zn=t,zn}var Bn,vr;function Ql(){if(vr)return Bn;vr=1;var n=Gl(),e=Wi();function t(o,r){return o!=null&&e(o,r,n)}return Bn=t,Bn}Ql();function Yl(n,e){return n&&(typeof n=="function"||typeof n=="object")&&e&&(typeof e=="function"||typeof e=="object")&&Object.entries(e).forEach(t=>{let[o,r]=t;n[o]=r}),n}const Xl={PREFIX:`${Te}-empty`};var Jl=function(n,e){var t={};for(var o in n)Object.prototype.hasOwnProperty.call(n,o)&&e.indexOf(o)<0&&(t[o]=n[o]);if(n!=null&&typeof Object.getOwnPropertySymbols=="function")for(var r=0,o=Object.getOwnPropertySymbols(n);r{for(const o of t)o.type==="attributes"&&o.attributeName==="theme-mode"&&this.updateMode()},this.updateMode=()=>{const t=this.body.getAttribute("theme-mode");t!==this.state.mode&&this.setState({mode:t})},this.state={mode:null}}componentDidMount(){if(this.props.darkModeImage){this.body=window.document.body,this.updateMode();const e={attributes:!0,childList:!1,subtree:!1};this.observer=new MutationObserver(this.observe),this.observer.observe(this.body,e)}}componentWillUnmount(){this.observer&&this.observer.disconnect()}render(){const e=this.props,{className:t,image:o,description:r,style:s,title:l,imageStyle:c,children:u,layout:p,darkModeImage:d}=e,m=Jl(e,["className","image","description","style","title","imageStyle","children","layout","darkModeImage"]),f=typeof r=="string"?r:"empty",b=this.state.mode==="dark"&&d?d:o;let y=null;typeof b=="string"?y=g.createElement("img",{alt:f,src:b}):b&&"id"in b?y=g.createElement("svg",{"aria-hidden":"true"},g.createElement("use",{xlinkHref:`#${b.id}`})):y=b;const S=I(t,Ze,{[`${Ze}-${p}`]:p}),w=y?{heading:4}:{heading:6,style:{fontWeight:400}};return g.createElement("div",Object.assign({className:S,style:s},this.getDataAttr(m)),g.createElement("div",{className:`${Ze}-image`,style:c,"x-semi-prop":"image,darkModeImage"},y),g.createElement("div",{className:`${Ze}-content`},l?g.createElement(Do.Title,Object.assign({},w,{className:`${Ze}-title`,"x-semi-prop":"title"}),l):null,r?g.createElement("div",{className:`${Ze}-description`,"x-semi-prop":"description"},r):null,u?g.createElement("div",{className:`${Ze}-footer`,"x-semi-prop":"children"},u):null))}}ai.defaultProps={layout:"vertical"};const K={DIALOG:`${Te}-modal`},xr={SIZE:["small","medium","large","full-width"],directions:["ltr","rtl"]};function ec(n){return n!==null&&typeof n=="object"}function wr(n){return ec(n)&&typeof n.then=="function"}class tc extends ge{constructor(e){super(Object.assign({},e)),this._debouncedOk=Lo(t=>{this._invokeOk(t)},100,{leading:!0,trailing:!1}),this._debouncedCancel=Lo(t=>{this._invokeCancel(t)},100,{leading:!0,trailing:!1}),this._lastCancelTarget=null,this._lastOkTarget=null,this.toggleDisplayNone=(t,o)=>{this._adapter.toggleDisplayNone(t,o)}}destroy(){this._debouncedOk.cancel(),this._debouncedCancel.cancel(),this.afterHide()}handleCancel(e){var t,o;const r=(o=(t=e==null?void 0:e.currentTarget)!==null&&t!==void 0?t:e==null?void 0:e.target)!==null&&o!==void 0?o:null;r!==this._lastCancelTarget&&this._debouncedCancel.cancel(),this._lastCancelTarget=r,this._debouncedCancel(e)}handleOk(e){var t,o;const r=(o=(t=e==null?void 0:e.currentTarget)!==null&&t!==void 0?t:e==null?void 0:e.target)!==null&&o!==void 0?o:null;r!==this._lastOkTarget&&this._debouncedOk.cancel(),this._lastOkTarget=r,this._debouncedOk(e)}_invokeCancel(e){var t;const o=this._adapter.notifyCancel(e);wr(o)&&(this._adapter.setState({onCancelReturnPromiseStatus:"pending"}),(t=o==null?void 0:o.then(()=>{this._adapter.setState({onCancelReturnPromiseStatus:"fulfilled"})}))===null||t===void 0||t.catch(r=>{throw this._adapter.setState({onCancelReturnPromiseStatus:"rejected"}),r}))}_invokeOk(e){var t;const o=this._adapter.notifyOk(e);wr(o)&&(this._adapter.setState({onOKReturnPromiseStatus:"pending"}),(t=o==null?void 0:o.then(()=>{this._adapter.setState({onOKReturnPromiseStatus:"fulfilled"})}))===null||t===void 0||t.catch(r=>{throw this._adapter.setState({onOKReturnPromiseStatus:"rejected"}),r}))}beforeShow(){this._adapter.disabledBodyScroll()}afterHide(){this._adapter.enabledBodyScroll(),this._adapter.notifyClose()}enabledBodyScroll(){this._adapter.enabledBodyScroll()}}class zo extends ge{constructor(e){super(Object.assign(Object.assign({},zo.defaultAdapter),e)),this.handleKeyDown=t=>{const{closeOnEsc:o}=this.getProps();if(o&&t.keyCode===sn.ESC){t.stopPropagation(),this.close(t);return}}}destroy(){this.handleKeyDownEventListenerUnmount(),this.modalDialogBlur(),this.prevFocusElementReFocus()}handleDialogMouseDown(){this._adapter.notifyDialogMouseDown()}handleMaskMouseUp(){this._adapter.notifyDialogMouseUp()}handleKeyDownEventListenerMount(){this._adapter.addKeyDownEventListener()}handleKeyDownEventListenerUnmount(){this._adapter.removeKeyDownEventListener()}getMouseState(){this._adapter.getMouseState()}handleMaskClick(e){const{dialogMouseDown:t}=this.getStates();e.target===e.currentTarget&&!t&&this.close(e)}close(e){this._adapter.notifyClose(e)}modalDialogFocus(){this._adapter.modalDialogFocus()}modalDialogBlur(){this._adapter.modalDialogBlur()}prevFocusElementReFocus(){this._adapter.prevFocusElementReFocus()}}var Un,Cr;function nc(){if(Cr)return Un;Cr=1;var n=zl(),e=Hi(),t=Zi(),o=e(function(r,s){return t(r)?n(r,s):[]});return Un=o,Un}var oc=nc();const rc=We(oc);class Ue{constructor(e,t){var o;this.addFocusRedirectListener=r=>(this.focusRedirectListenerList.push(r),()=>this.removeFocusRedirectListener(r)),this.removeFocusRedirectListener=r=>{this.focusRedirectListenerList=rc(this.focusRedirectListenerList,r)},this.destroy=()=>{var r;(r=this.container)===null||r===void 0||r.removeEventListener("keydown",this.onKeyPress)},this.shouldFocusRedirect=r=>{if(!this.enable)return!1;for(const s of this.focusRedirectListenerList)if(!s(r))return!1;return!0},this.focusElement=(r,s)=>{const{preventScroll:l}=this.options;r==null||r.focus({preventScroll:l}),s.preventDefault()},this.onKeyPress=r=>{if(r&&r.key==="Tab"){const s=Ue.getFocusableElements(this.container);s.length&&(r.shiftKey?this.handleContainerShiftTabKeyDown(s,r):this.handleContainerTabKeyDown(s,r))}},this.handleContainerTabKeyDown=(r,s)=>{const l=Ue.getActiveElement(),c=r[r.length-1]===l,u=r[0];c&&this.shouldFocusRedirect(u)&&this.focusElement(u,s)},this.handleContainerShiftTabKeyDown=(r,s)=>{const l=Ue.getActiveElement(),c=r[0]===l,u=r[r.length-1];c&&this.shouldFocusRedirect(u)&&this.focusElement(u,s)},Object.freeze(t),this.container=e,this.options=t,this.enable=(o=t==null?void 0:t.enable)!==null&&o!==void 0?o:!0,this.focusRedirectListenerList=t!=null&&t.onFocusRedirectListener?Array.isArray(t.onFocusRedirectListener)?[...t.onFocusRedirectListener]:[t.onFocusRedirectListener]:[],this.container.addEventListener("keydown",this.onKeyPress)}get enable(){return this._enable}set enable(e){this._enable=e}static getFocusableElements(e){if(!qi(e))return[];const o=["input:not([disabled]):not([tabindex='-1'])","textarea:not([disabled]):not([tabindex='-1'])","button:not([disabled]):not([tabindex='-1'])","a[href]:not([tabindex='-1'])","select:not([disabled]):not([tabindex='-1'])","area[href]:not([tabindex='-1'])","iframe:not([tabindex='-1'])","object:not([tabindex='-1'])","*[tabindex]:not([tabindex='-1'])","*[contenteditable]:not([tabindex='-1'])"].join(",");return Array.from(e.querySelectorAll(o))}static getActiveElement(){return document?document.activeElement:null}}var Vn=function(n,e){var t={};for(var o in n)Object.prototype.hasOwnProperty.call(n,o)&&e.indexOf(o)<0&&(t[o]=n[o]);if(n!=null&&typeof Object.getOwnPropertySymbols=="function")for(var r=0,o=Object.getOwnPropertySymbols(n);r{this.foundation.handleKeyDown(t)},this.onDialogMouseDown=()=>{this.foundation.handleDialogMouseDown()},this.onMaskMouseUp=()=>{this.foundation.handleMaskMouseUp()},this.onMaskClick=t=>{this.foundation.handleMaskClick(t)},this.close=t=>{this.foundation.close(t)},this.getMaskElement=()=>{const t=Vn(this.props,[]),{mask:o,maskClassName:r}=t;if(o){const s=I(`${K.DIALOG}-mask`,{});return g.createElement("div",Object.assign({key:"mask"},this.props.maskExtraProps,{className:I(s,r),style:t.maskStyle}))}return null},this.renderCloseBtn=()=>{const{closable:t,closeIcon:o}=this.props;let r;if(t){const s=o||g.createElement(cn,{"x-semi-prop":"closeIcon"});r=g.createElement(qs,{"aria-label":"close",className:`${K.DIALOG}-close`,key:"close-btn",onClick:this.close,type:"tertiary",icon:s,theme:"borderless",size:"small"})}return r},this.renderIcon=()=>{const{icon:t}=this.props;return t?g.createElement("span",{className:`${K.DIALOG}-icon-wrapper`,"x-semi-prop":"icon"},t):null},this.renderHeader=()=>{if("header"in this.props)return this.props.header;const{title:t}=this.props,o=this.renderCloseBtn(),r=this.renderIcon();return t==null?null:g.createElement("div",{className:`${K.DIALOG}-header`},r,g.createElement(Do.Title,{heading:5,className:`${K.DIALOG}-title`,id:`${K.DIALOG}-title`,"x-semi-prop":"title"},t),o)},this.renderBody=()=>{const{bodyStyle:t,children:o,title:r}=this.props,s=I(`${K.DIALOG}-body`,{[`${K.DIALOG}-withIcon`]:this.props.icon}),l=this.renderCloseBtn(),c=this.renderIcon();return r!=null||"header"in this.props?g.createElement("div",{className:s,id:`${K.DIALOG}-body`,style:t,"x-semi-prop":"children"},o):g.createElement("div",{className:`${K.DIALOG}-body-wrapper`},c,g.createElement("div",{className:s,style:t,"x-semi-prop":"children"},o),l)},this.getDialogElement=()=>{const t=Vn(this.props,[]),o={},r=I(`${K.DIALOG}`,{[`${K.DIALOG}-centered`]:t.centered,[`${K.DIALOG}-${t.size}`]:t.size});t.width&&(o.width=t.width),t.height&&(o.height=t.height),t.isFullScreen&&(o.width="100%",o.height="100%",o.margin="unset");const s=this.renderBody(),l=this.renderHeader(),c=t.footer?g.createElement("div",{className:`${K.DIALOG}-footer`,"x-semi-prop":"footer"},t.footer):null,u=g.createElement("div",{role:"dialog",ref:this.modalDialogRef,"aria-modal":"true","aria-labelledby":`${K.DIALOG}-title`,"aria-describedby":`${K.DIALOG}-body`,onAnimationEnd:t.onAnimationEnd,className:I([`${K.DIALOG}-content`,t.contentClassName,{[`${K.DIALOG}-content-fullScreen`]:t.isFullScreen,[`${K.DIALOG}-content-height-set`]:t.height||Pt(t.style,"height")}])},l,s,c);return g.createElement("div",{key:"dialog-element",className:r,onMouseDown:this.onDialogMouseDown,style:Object.assign(Object.assign({},t.style),o),id:this.dialogId},t!=null&&t.modalRender?t==null?void 0:t.modalRender(u):u)},this.state={dialogMouseDown:!1,prevFocusElement:Ue.getActiveElement()},this.foundation=new zo(this.adapter),this.dialogId=`dialog-${sc++}`,this.modalDialogRef=g.createRef()}get adapter(){return Object.assign(Object.assign({},super.adapter),{notifyClose:e=>{this.props.onClose(e)},notifyDialogMouseDown:()=>{this.setState({dialogMouseDown:!0})},notifyDialogMouseUp:()=>{this.state.dialogMouseDown&&(this.timeoutId=setTimeout(()=>{this.setState({dialogMouseDown:!1})},0))},addKeyDownEventListener:()=>{this.props.closeOnEsc&&document.addEventListener("keydown",this.foundation.handleKeyDown)},removeKeyDownEventListener:()=>{this.props.closeOnEsc&&document.removeEventListener("keydown",this.foundation.handleKeyDown)},getMouseState:()=>this.state.dialogMouseDown,modalDialogFocus:()=>{var e,t,o;const{preventScroll:r}=this.props;let s;if(this.modalDialogRef){const l=Ue.getActiveElement();s=this.modalDialogRef.current.contains(l),(e=this.focusTrapHandle)===null||e===void 0||e.destroy(),this.focusTrapHandle=new Ue(this.modalDialogRef.current,{preventScroll:r})}s||(o=(t=this.modalDialogRef)===null||t===void 0?void 0:t.current)===null||o===void 0||o.focus({preventScroll:r})},modalDialogBlur:()=>{var e,t;(e=this.modalDialogRef)===null||e===void 0||e.current.blur(),(t=this.focusTrapHandle)===null||t===void 0||t.destroy()},prevFocusElementReFocus:()=>{const{prevFocusElement:e}=this.state,{preventScroll:t}=this.props,o=Pt(e,"focus");Be(o)&&e.focus({preventScroll:t})}})}componentDidMount(){var e;this.foundation.handleKeyDownEventListenerMount(),this.foundation.modalDialogFocus();const t=Ue.getFocusableElements(this.modalDialogRef.current);this.modalDialogRef.current.contains(document.activeElement)||(e=t[0])===null||e===void 0||e.focus()}componentWillUnmount(){clearTimeout(this.timeoutId),this.foundation.destroy()}render(){var e;const t=this.props,{maskClosable:o,className:r,getPopupContainer:s,maskFixed:l,getContainerContext:c}=t,u=Vn(t,["maskClosable","className","getPopupContainer","maskFixed","getContainerContext"]),{direction:p}=this.context,d=I(r,{[`${K.DIALOG}-popup`]:s&&s()!==((e=globalThis==null?void 0:globalThis.document)===null||e===void 0?void 0:e.body)&&!l,[`${K.DIALOG}-fixed`]:l,[`${K.DIALOG}-rtl`]:p==="rtl"}),m=c(),f=this.getDataAttr(u),b=g.createElement("div",Object.assign({className:d},f),this.getMaskElement(),g.createElement("div",Object.assign({role:"none",className:I({[`${K.DIALOG}-wrap`]:!0,[`${K.DIALOG}-wrap-center`]:this.props.centered}),onClick:o?this.onMaskClick:null,onMouseUp:o?this.onMaskMouseUp:null},this.props.contentExtraProps),this.getDialogElement()));return m&&m.Provider?g.createElement(m.Provider,{value:m.value},b):b}}hn.contextType=Us;hn.propTypes={close:h.func,getContainerContext:h.func,contentClassName:h.string,maskClassName:h.string,onAnimationEnd:h.func,preventScroll:h.bool};hn.defaultProps={close:$,getContainerContext:$,contentClassName:"",maskClassName:""};var ic=function(n,e){var t={};for(var o in n)Object.prototype.hasOwnProperty.call(n,o)&&e.indexOf(o)<0&&(t[o]=n[o]);if(n!=null&&typeof Object.getOwnPropertySymbols=="function")for(var r=0,o=Object.getOwnPropertySymbols(n);r{const[e,t]=a.useState(!0),[o,r]=a.useState(),[s,l]=a.useState(),{direction:c}=n,{title:u,content:p,icon:d,type:m,onCancel:f,onOk:b,className:y}=n,S=ic(n,["title","content","icon","type","onCancel","onOk","className"]),w=a.useCallback(E=>{const D=b&&b(E);D&&D.then?(r(!0),D.then(function(){t(!1),r(!1)},P=>{r(!1)})):t(!1)},[b]),C=a.useCallback(E=>{const D=f&&f(E);D&&D.then?(l(!0),D.then(function(){t(!1),l(!1)},P=>{l(!1)})):t(!1)},[f]),k=`${K.DIALOG}-confirm`,_=I(y,k,{[`${k}-rtl`]:c==="rtl"}),x=I(`${K.DIALOG}-${m}`),j=Ge(d)?g.cloneElement(d,{className:`${k}-icon ${x}-icon`,size:"extra-large"}):d,v=u==null?null:g.createElement("span",{className:`${k}-title-text`},u),O=I(`${k}-content`,{[`${k}-content-withIcon`]:n.icon});return g.createElement(re,Object.assign({className:_,title:v,confirmLoading:o,cancelLoading:s,onOk:w,onCancel:C,icon:j,visible:e},S),g.createElement("div",{className:O,"x-semi-prop":"content"},p))};function Yt(n){const e=document.createElement("div");document.body.appendChild(e);let t=Object.assign({},n);const o=()=>{Hs(e),e.parentNode&&e.parentNode.removeChild(e);for(let c=0;c{u==null||u(),o()},motion:n.motion})),e)}function s(){t=Object.assign(Object.assign({},t),{visible:!1}),r(t)}function l(c){t=Object.assign(Object.assign({},t),c),r(t)}return r(t),Qe.push(s),{destroy:s,update:l}}function ci(n){return Object.assign({type:"info",icon:g.createElement(Gs,null)},n)}function di(n){return Object.assign({type:"success",icon:g.createElement(Ks,null)},n)}function ui(n){return Object.assign({type:"warning",icon:g.createElement(Qs,null)},n)}function pi(n){return Object.assign({type:"error",icon:g.createElement(Ws,null),okButtonProps:Object.assign({type:"danger"},n.okButtonProps)},Gi(n,["okButtonProps"]))}function hi(n){return Object.assign({type:"confirm",icon:g.createElement(rl,null)},n)}var ac=function(n,e){var t={};for(var o in n)Object.prototype.hasOwnProperty.call(n,o)&&e.indexOf(o)<0&&(t[o]=n[o]);if(n!=null&&typeof Object.getOwnPropertySymbols=="function")for(var r=0,o=Object.getOwnPropertySymbols(n);r{var{afterClose:t,config:o}=n;ac(n,["afterClose","config"]);const[r,s]=g.useState(o);g.useImperativeHandle(e,()=>({destroy:()=>{s(c=>Object.assign(Object.assign({},c),{visible:!1}))},update:c=>{s(u=>Object.assign(Object.assign({},u),c))}}));const l=()=>{var c;(c=o==null?void 0:o.afterClose)===null||c===void 0||c.call(o),t()};return g.createElement(li,Object.assign({},r,{afterClose:l}))},cc=g.forwardRef(lc);let Sr=0;function dc(){const[n,e]=g.useState([]);function t(o){return e(r=>[...r,o]),()=>{e(r=>r.filter(s=>s!==o))}}return[n,t]}function uc(){const[n,e]=dc();function t(o){return function(s){Sr+=1;const l=g.createRef();let c;const u=g.createElement(cc,{key:`semi-modal-${Sr}`,config:o(s),ref:l,afterClose:()=>{c()}});return c=e(u),{destroy:()=>{l.current&&l.current.destroy()},update:p=>{l.current&&l.current.update(p)}}}}return[{info:t(ci),success:t(di),error:t(pi),warning:t(ui),confirm:t(hi)},g.createElement(g.Fragment,null,n)]}var pc=function(n,e){var t={};for(var o in n)Object.prototype.hasOwnProperty.call(n,o)&&e.indexOf(o)<0&&(t[o]=n[o]);if(n!=null&&typeof Object.getOwnPropertySymbols=="function")for(var r=0,o=Object.getOwnPropertySymbols(n);r{this.foundation.handleCancel(t)},this.handleOk=t=>{this.foundation.handleOk(t)},this.updateState=()=>{const{visible:t}=this.props;this.foundation.toggleDisplayNone(!t)},this.renderFooter=()=>{const{okText:t,okType:o,cancelText:r,confirmLoading:s,cancelLoading:l,hasCancel:c,footerFill:u}=this.props,p=d=>{var m;return c?g.createElement(ie,Object.assign({"aria-label":"cancel",onClick:this.handleCancel,loading:l===void 0?this.state.onCancelReturnPromiseStatus==="pending":l,type:"tertiary",block:u,autoFocus:!0},this.props.cancelButtonProps,{style:Object.assign(Object.assign({},u?{marginLeft:"unset"}:{}),(m=this.props.cancelButtonProps)===null||m===void 0?void 0:m.style),"x-semi-children-alias":"cancelText"}),r||d.cancel):null};return g.createElement(Zs,{componentName:"Modal"},(d,m)=>g.createElement("div",{className:I({[`${K.DIALOG}-footerfill`]:u})},p(d),g.createElement(ie,Object.assign({"aria-label":"confirm",type:o,theme:"solid",block:u,loading:s===void 0?this.state.onOKReturnPromiseStatus==="pending":s,onClick:this.handleOk},this.props.okButtonProps,{"x-semi-children-alias":"okText"}),t||d.confirm)))},this.renderDialog=()=>{var t;let o=this.props,{footer:r,className:s,motion:l,maskStyle:c,keepDOM:u,style:p,zIndex:d,getPopupContainer:m,visible:f,modalContentClass:b}=o,y=pc(o,["footer","className","motion","maskStyle","keepDOM","style","zIndex","getPopupContainer","visible","modalContentClass"]),S=p;const w=c,C="footer"in this.props?r:this.renderFooter();let k={zIndex:d};m&&m()!==((t=globalThis==null?void 0:globalThis.document)===null||t===void 0?void 0:t.body)&&(k={zIndex:d,position:"static"});const _=I(s,{[`${K.DIALOG}-displayNone`]:u&&this.state.displayNone}),x=this.props.visible||this.props.keepDOM&&(!this.props.lazyRender||this._haveRendered)||this.props.motion&&!this.state.displayNone;return x&&(this._haveRendered=!0),g.createElement(Eo,{motion:this.props.motion,animationState:f?"enter":"leave",startClassName:f?`${K.DIALOG}-content-animate-show`:`${K.DIALOG}-content-animate-hide`,onAnimationEnd:()=>{this.updateState()}},j=>{let{animationClassName:v,animationEventsNeedBind:O}=j;return g.createElement(Eo,{motion:this.props.motion,animationState:f?"enter":"leave",startClassName:f?`${K.DIALOG}-mask-animate-show`:`${K.DIALOG}-mask-animate-hide`,onAnimationEnd:()=>{this.updateState()}},E=>{let{animationClassName:D,animationEventsNeedBind:P}=E;return x?g.createElement(Qi,{style:k,getPopupContainer:m}," ",g.createElement(hn,Object.assign({},y,{contentExtraProps:O,maskExtraProps:P,isFullScreen:this.state.isFullScreen,contentClassName:`${v} ${b}`,maskClassName:D,className:_,getPopupContainer:m,maskStyle:w,style:S,ref:this.modalRef,footer:C,onClose:this.handleCancel}))):g.createElement(g.Fragment,null)})})},this.state={displayNone:!e.visible,isFullScreen:e.fullScreen},this.foundation=new tc(this.adapter),this.modalRef=g.createRef(),this.scrollBarWidth=0,this.originBodyWidth="100%"}get adapter(){return Object.assign(Object.assign({},super.adapter),{getProps:()=>this.props,disabledBodyScroll:()=>{var e;const{getPopupContainer:t}=this.props;this.bodyOverflow=document.body.style.overflow||"",(!t||t()===((e=globalThis==null?void 0:globalThis.document)===null||e===void 0?void 0:e.body))&&this.bodyOverflow!=="hidden"&&(document.body.style.overflow="hidden",document.body.style.width=`calc(${this.originBodyWidth||"100%"} - ${this.scrollBarWidth}px)`)},enabledBodyScroll:()=>{var e;const{getPopupContainer:t}=this.props;(!t||t()===((e=globalThis==null?void 0:globalThis.document)===null||e===void 0?void 0:e.body))&&this.bodyOverflow!==null&&this.bodyOverflow!=="hidden"&&(document.body.style.overflow=this.bodyOverflow,document.body.style.width=this.originBodyWidth)},notifyCancel:e=>this.props.onCancel(e),notifyOk:e=>this.props.onOk(e),notifyClose:()=>{this.props.afterClose()},toggleDisplayNone:(e,t)=>{e!==this.state.displayNone&&this.setState({displayNone:e},t||$)},notifyFullScreen:e=>{e!==this.state.isFullScreen&&this.setState({isFullScreen:e})}})}static getDerivedStateFromProps(e,t){const o={};return e.fullScreen!==t.isFullScreen&&(o.isFullScreen=e.fullScreen),e.visible&&t.displayNone&&(o.displayNone=!1),o}componentDidMount(){this.scrollBarWidth=Yi(),this.originBodyWidth=document.body.style.width,this.props.visible&&this.foundation.beforeShow()}componentDidUpdate(e,t,o){!e.visible&&this.props.visible&&this.foundation.beforeShow(),!t.displayNone&&this.state.displayNone&&this.foundation.afterHide()}componentWillUnmount(){this.props.visible?this.foundation.destroy():this.foundation.enabledBodyScroll()}render(){const{visible:e,keepDOM:t,lazyRender:o}=this.props;return this.renderDialog()}}re.propTypes={mask:h.bool,closable:h.bool,centered:h.bool,visible:h.bool,width:h.oneOfType([h.string,h.number]),height:h.oneOfType([h.string,h.number]),confirmLoading:h.bool,cancelLoading:h.bool,okText:h.string,okType:h.string,cancelText:h.string,maskClosable:h.bool,onCancel:h.func,onOk:h.func,modalRender:h.func,afterClose:h.func,okButtonProps:h.object,cancelButtonProps:h.object,style:h.object,className:h.string,maskStyle:h.object,bodyStyle:h.object,zIndex:h.number,title:h.node,icon:h.node,header:h.node,footer:h.node,hasCancel:h.bool,motion:h.bool,children:h.node,getPopupContainer:h.func,getContainerContext:h.func,maskFixed:h.bool,closeIcon:h.node,closeOnEsc:h.bool,size:h.oneOf(xr.SIZE),keepDOM:h.bool,lazyRender:h.bool,direction:h.oneOf(xr.directions),fullScreen:h.bool,footerFill:h.bool};re.__SemiComponentName__="Modal";re.defaultProps=ln(re.__SemiComponentName__,{zIndex:1e3,motion:!0,mask:!0,centered:!1,closable:!0,visible:!1,okType:"primary",maskClosable:!0,hasCancel:!0,onCancel:$,onOk:$,afterClose:$,maskFixed:!1,closeOnEsc:!0,size:"small",keepDOM:!1,lazyRender:!0,fullScreen:!1});re.useModal=uc;re.info=function(n){return Yt(ci(n))};re.success=function(n){return Yt(di(n))};re.error=function(n){return Yt(pi(n))};re.warning=function(n){return Yt(ui(n))};re.confirm=function(n){return Yt(hi(n))};re.destroyAll=function(){for(let e=0,t=Qe.length;eo.ariaDisabled==="false"):null}setFocusToFirstMenuItem(e){const t=this.getMenuItemNodes(e);t&&Ji(t)}setFocusToLastMenuItem(e){const t=this.getMenuItemNodes(e);t&&ea(t)}handleKeyDown(e){var t,o;const r=(o=(t=e.target)===null||t===void 0?void 0:t.attributes["data-popupid"])===null||o===void 0?void 0:o.value,{visible:s}=this._adapter.getStates();switch(e.key){case" ":case"Enter":e.target.click();break;case"ArrowDown":this.setFocusToFirstMenuItem(r),s&&Je(e);break;case"ArrowUp":this.setFocusToLastMenuItem(r),s&&Je(e);break}}}class mc extends ge{constructor(){super(...arguments),this.menuItemNodes=null,this.firstChars=[]}handleEscape(e){this._adapter.getContext("trigger")==="custom"&&(e&&ta(document.querySelectorAll("[data-popupid]"),e.id)).focus()}setFocusByFirstCharacter(e,t){const o=na(this.menuItemNodes,e,this.firstChars,t);o>=0&&oa(this.menuItemNodes,this.menuItemNodes[o])}onMenuKeydown(e){const t=ra(e.target,"tooltip");this.menuItemNodes||(this.menuItemNodes=[...e.target.parentNode.getElementsByTagName("li")].filter(r=>r.ariaDisabled!=="true")),this.firstChars.length===0&&this.menuItemNodes.forEach(r=>{var s;this.firstChars.push((s=r.textContent.trim()[0])===null||s===void 0?void 0:s.toLowerCase())});const o=this.menuItemNodes.find(r=>r.tabIndex===0);switch(e.key){case" ":case"Enter":e.target.click();break;case"Escape":this.handleEscape(t);break;case"ArrowUp":aa(this.menuItemNodes,o),Je(e);break;case"ArrowDown":ia(this.menuItemNodes,o),Je(e);break;default:sa(e.key)&&this.setFocusByFirstCharacter(o,e.key);break}}}const mt=g.createContext({level:0});var fc=function(n,e){var t={};for(var o in n)Object.prototype.hasOwnProperty.call(n,o)&&e.indexOf(o)<0&&(t[o]=n[o]);if(n!=null&&typeof Object.getOwnPropertySymbols=="function")for(var r=0,o=Object.getOwnPropertySymbols(n);rthis.foundation.onMenuKeydown(l)}),t)}}Bo.propTypes={children:h.node,className:h.string,style:h.object};Bo.contextType=mt;const qe=Xt.PREFIX;class fn extends de{render(){const{children:e,disabled:t,className:o,forwardRef:r,style:s,type:l,active:c,icon:u,onKeyDown:p,showTick:d,hover:m,innerRef:f}=this.props,{showTick:b}=this.context,y=b??d,S=I(o,{[`${qe}-item`]:!0,[`${qe}-item-disabled`]:t,[`${qe}-item-hover`]:m,[`${qe}-item-withTick`]:y,[`${qe}-item-${l}`]:l,[`${qe}-item-active`]:c}),w={};t||["onClick","onMouseEnter","onMouseLeave","onContextMenu"].forEach(_=>{this.context.level!==1&&_==="onClick"?w.onMouseDown=j=>{var v,O;j.button===0&&((O=(v=this.props)[_])===null||O===void 0||O.call(v,j))}:w[_]=this.props[_]});let C=null;switch(!0){case(y&&c):C=g.createElement(Go,null);break;case(y&&!c):C=g.createElement(Go,{style:{color:"transparent"}});break;default:C=null;break}let k=null;return u&&(k=g.createElement("div",{className:`${qe}-item-icon`},u)),g.createElement("li",Object.assign({role:"menuitem",tabIndex:-1,"aria-disabled":t},w,{onKeyDown:p,ref:_=>{r(_),typeof f=="function"?f(_):f&&typeof f=="object"&&(f.current=_)},className:S,style:s},this.getDataAttr(this.props)),C,k,e)}}fn.propTypes={children:h.oneOfType([h.string,h.node]),name:h.string,disabled:h.bool,selected:h.bool,onClick:h.func,onMouseEnter:h.func,onMouseLeave:h.func,onContextMenu:h.func,className:h.string,style:h.object,forwardRef:h.func,type:h.oneOf(mn.ITEM_TYPE),active:h.bool,icon:h.node};fn.contextType=mt;fn.defaultProps={disabled:!1,divided:!1,selected:!1,onMouseEnter:$,onMouseLeave:$,forwardRef:$};const mi=g.forwardRef((n,e)=>g.createElement(fn,Object.assign({},n,{innerRef:e})));mi.elementType="Dropdown.Item";const yc=Xt.PREFIX,bc=function(){let n=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{};const{style:e,className:t}=n;return g.createElement("div",{className:I(`${yc}-divider`,t),style:e})},jr=Xt.PREFIX;class Uo extends a.PureComponent{render(){const{className:e,style:t,children:o}=this.props,{showTick:r}=this.context,s=I({[`${jr}-title`]:!0,[`${jr}-title-withTick`]:r},e);return g.createElement("div",{className:s,style:t},o)}}Uo.propTypes={children:h.node,className:h.string,style:h.object};Uo.contextType=mt;var Kn=function(n,e){var t={};for(var o in n)Object.prototype.hasOwnProperty.call(n,o)&&e.indexOf(o)<0&&(t[o]=n[o]);if(n!=null&&typeof Object.getOwnPropertySymbols=="function")for(var r=0,o=Object.getOwnPropertySymbols(n);rthis.foundation.handleVisibleChange(t),this.state={popVisible:e.visible},this.foundation=new hc(this.adapter),this.tooltipRef=g.createRef()}get adapter(){return Object.assign(Object.assign({},super.adapter),{setPopVisible:e=>this.setState({popVisible:e}),notifyVisibleChange:e=>{var t,o;return(o=(t=this.props).onVisibleChange)===null||o===void 0?void 0:o.call(t,e)},getPopupId:()=>this.tooltipRef.current.getPopupId()})}renderContent(){const{render:e,menu:t,contentClassName:o,style:r,showTick:s,prefixCls:l,trigger:c}=this.props,u=I(l,o),{level:p=0}=this.context,d={showTick:s,level:p+1,trigger:c};let m=null;return g.isValidElement(e)?m=e:Array.isArray(t)&&(m=this.renderMenu()),g.createElement(mt.Provider,{value:d},g.createElement("div",{className:u,style:r},g.createElement("div",{className:`${l}-content`,"x-semi-prop":"render"},m)))}renderMenu(){const{menu:e}=this.props,t=e.map((o,r)=>{switch(o.node){case"title":{const{name:s,node:l}=o,c=Kn(o,["name","node"]);return g.createElement(ae.Title,Object.assign({},c,{key:l+s+r}),s)}case"item":{const{node:s,name:l}=o,c=Kn(o,["node","name"]);return g.createElement(ae.Item,Object.assign({},c,{key:s+l+r}),l)}case"divider":return g.createElement(ae.Divider,{key:o.node+r});default:return null}});return g.createElement(ae.Menu,null,t)}renderPopCard(){const{render:e,contentClassName:t,style:o,showTick:r,prefixCls:s}=this.props,l=I(s,t),{level:c=0}=this.context,u={showTick:r,level:c+1};return g.createElement(mt.Provider,{value:u},g.createElement("div",{className:l,style:o},g.createElement("div",{className:`${s}-content`},e)))}render(){const e=this.props,{children:t,position:o,trigger:r,onVisibleChange:s,zIndex:l,className:c,motion:u,margin:p,style:d,prefixCls:m}=e,f=Kn(e,["children","position","trigger","onVisibleChange","zIndex","className","motion","margin","style","prefixCls"]);let{spacing:b}=this.props;const{level:y}=this.context,{popVisible:S}=this.state,w=this.renderContent();return y>0?b=typeof b=="number"?b:kr.NESTED_SPACING:(b===null||typeof b>"u")&&(b=kr.SPACING),g.createElement($e,Object.assign({zIndex:l,motion:u,margin:p,content:w,className:c,prefixCls:m,spacing:b,position:o,trigger:r,onVisibleChange:this.handleVisibleChange,showArrow:!1,returnFocusOnClose:!0,ref:this.tooltipRef},f),g.isValidElement(t)?g.cloneElement(t,{className:I(Pt(t,"props.className"),{[`${m}-showing`]:S}),"aria-haspopup":!0,"aria-expanded":S,onKeyDown:C=>{this.foundation.handleKeyDown(C);const k=Pt(t,"props.onKeyDown");k&&k(C)}}):t)}}ae.Menu=Bo;ae.Item=mi;ae.Divider=bc;ae.Title=Uo;ae.contextType=mt;ae.propTypes={children:h.node,contentClassName:h.oneOfType([h.string,h.array]),className:h.string,getPopupContainer:h.func,margin:h.oneOfType([h.number,h.object]),mouseEnterDelay:h.number,mouseLeaveDelay:h.number,menu:h.array,motion:h.oneOfType([h.bool,h.func,h.object]),onVisibleChange:h.func,prefixCls:h.string,position:h.oneOf(vc),rePosKey:h.oneOfType([h.string,h.number]),render:h.node,spacing:h.oneOfType([h.number,h.object]),showTick:h.bool,style:h.object,trigger:h.oneOf(xc),visible:h.bool,zIndex:h.number};ae.__SemiComponentName__="Dropdown";ae.defaultProps=ln(ae.__SemiComponentName__,{onVisibleChange:$,prefixCls:Xt.PREFIX,zIndex:la.DEFAULT_Z_INDEX,motion:!0,trigger:"hover",position:"bottom",mouseLeaveDelay:mn.DEFAULT_LEAVE_DELAY,showTick:!1,closeOnEsc:!0,onEscKeyDown:$});var Wn,Er;function wc(){if(Er)return Wn;Er=1;var n=ni();function e(t){return n(t)&&t!=+t}return Wn=e,Wn}var Cc=wc();const Sc=We(Cc),kc=(n,e)=>{const{isNaN:t}=Number;return t(n)&&t(e)};var jc=Bs();const Re=We(jc);var Ec=ca();const rt=We(Ec),Oc=Object.assign({},oi),Ye=Object.assign(Object.assign({},vl),{DEFAULT_STEP:1,DEFAULT_SHIFT_STEP:10,DEFAULT_PRESS_TIMEOUT:250,DEFAULT_PRESS_INTERVAL:0,MOUSE_BUTTON_LEFT:0}),Pc=Object.assign({},Qt);function _c(n,e){const t=(n.toString().split(".")[1]||"").length,o=(e.toString().split(".")[1]||"").length,r=Math.pow(10,Math.max(t,o));return Math.round(n*r+e*r)/r}function Or(n,e){return _c(n,-e)}class Mc extends ge{constructor(){super(...arguments),this._decimalPointSymbol=void 0,this._currencySymbol=""}init(){this._isCurrency()&&this._setCurrencySymbol(),this._setInitValue()}destroy(){this._unregisterInterval(),this._unregisterTimer(),this._adapter.unregisterGlobalEvent("mouseup")}isControlled(){return this._isControlledComponent("value")}_isCurrency(){const{currency:e}=this.getProps();return e===!0||typeof e=="string"&&e.trim()!==""}_getFinalCurrency(){const{currency:e}=this.getProps();return e===!0?this.getProp("defaultCurrency"):e}_doInput(){let e=arguments.length>0&&arguments[0]!==void 0?arguments[0]:"",t=arguments.length>1&&arguments[1]!==void 0?arguments[1]:null,o=arguments.length>2&&arguments[2]!==void 0?arguments[2]:null,r=e,s=e,l=!0;const c=this.isControlled();typeof e!="number"&&(s=this.doParse(e,!1),l=!isNaN(s)),l&&(r=s,c||this._adapter.setNumber(s)),c||this._adapter.setValue(e,o),this.getProp("keepFocus")&&this._adapter.setFocusing(!0,()=>{this._adapter.setClickUpOrDown(!0)}),this.notifyChange(r,t)}_registerInterval(e){const t=this.getProp("pressInterval")||Ye.DEFAULT_PRESS_INTERVAL;this._intervalHasRegistered=!0,this._interval=setInterval(()=>{typeof e=="function"&&this._intervalHasRegistered&&e()},t)}_unregisterInterval(){this._interval&&(this._intervalHasRegistered=!1,clearInterval(this._interval),this._interval=null)}_registerTimer(e){const t=this.getProp("pressTimeout")||Ye.DEFAULT_PRESS_TIMEOUT;this._timerHasRegistered=!0,this._timer=setTimeout(()=>{this._timerHasRegistered&&typeof e=="function"&&e()},t)}_unregisterTimer(){this._timer&&(this._timerHasRegistered=!1,clearTimeout(this._timer),this._timer=null)}_setCurrencySymbol(){const{localeCode:e,currencyDisplay:t}=this.getProps(),o=new Intl.NumberFormat(e,{style:"currency",currency:this._getFinalCurrency()||this.getCurrencyByLocaleCode(),currencyDisplay:t}).formatToParts(1234.5);for(const r of o)r.type==="decimal"&&(this._decimalPointSymbol=r.value),r.type==="currency"&&(this._currencySymbol=r.value)}handleInputFocus(e){const t=this.getState("value");if(t!==""&&this._isScientificNotation()&&!this._isCurrency()){const o=Re(t);if(/e/i.test(o)&&/^[+-]?(?:\d+(?:\.\d*)?|\.\d+)[eE][+-]?\d+$/.test(o.trim())){const s=this.doParse(o,!1,!1,!1);if(this.isValidNumber(s)){const l=this.doFormat(s,!0,!1);this._adapter.setValue(l)}}}this._adapter.recordCursorPosition(),this._adapter.setFocusing(!0,null),this._adapter.setClickUpOrDown(!1),this._adapter.notifyFocus(e)}handleInputChange(e,t){const o=this.doParse(e,!0,!0,!0),r=this.doParse(e,!1,!1,!1),s=this.afterParser(e);this._adapter.recordCursorPosition();let l,c=r,u=e;if(e==="")this.isControlled()||(c=null);else if(this.isValidNumber(r)&&this.isValidNumber(o))l=r,u=this.doFormat(r,!1);else{if(typeof r=="number"&&!isNaN(r)){u=this.doFormat(r,!1);const p=s.lastIndexOf("."),d=s.length-1-p,m=this._getPrecLen(r);if(m){if(m-1?s.slice(p):"";u+=f}c=r}else u=this.doFormat(s,!1);l=this.isControlled()?u:s}!this.isControlled()&&(c===null||typeof c=="number"&&!isNaN(c))&&this._adapter.setNumber(c),this._adapter.setValue(this.isControlled()&&!this._isCurrency()?u:this.doFormat(s,!1),()=>{this._adapter.restoreCursor()}),this.notifyChange(l,t)}handleInputKeyDown(e){const t=e.keyCode;if(t===sn.UP||t===sn.DOWN){this._adapter.setClickUpOrDown(!0),this._adapter.recordCursorPosition();const o=t===sn.UP?this.add(null,e):this.minus(null,e);this._doInput(o,e,()=>{this._adapter.restoreCursor()}),e.preventDefault()}this._adapter.notifyKeyDown(e)}handleInputBlur(e){const t=Re(this.getState("value"));let o=this.getState("number");if(o!=null||t!=null&&t!==""){const r=this.doParse(t,!1,!0,!0);let s=!1,l=!1,c,u;if(this.isValidNumber(r)&&o!==r&&(c=r,this.isControlled()||(o=c),s=!0),!this.isValidNumber(r)){const d=parseFloat(t);if(isNaN(d)){if(typeof o=="number"&&!isNaN(o)){const m=this.fetchMinOrMax(o);m!==o&&(c=m,this.isControlled()||(o=c),s=!0)}}else{const m=this.fetchMinOrMax(d);m!==o&&(c=m,this.isControlled()||(o=c),s=!0)}}const p=this.doFormat(o,!0,!0);if(p!==t&&(u=p,l=!0),l||s){const d=u??c;u!=null&&this._adapter.setValue(u),c!=null&&(this._isControlledComponent("value")||this._adapter.setNumber(c)),this.notifyChange(d,e)}}this._adapter.setFocusing(!1),this._adapter.notifyBlur(e)}handleInputMouseEnter(e){this._adapter.setHovering(!0)}handleInputMouseLeave(e){this._adapter.setHovering(!1)}handleInputMouseMove(e){this._adapter.setHovering(!0)}handleMouseUp(e){this._unregisterInterval(),this._unregisterTimer(),this._adapter.unregisterGlobalEvent("mouseup")}handleUpClick(e){const{readonly:t}=this.getProps();!this._isMouseButtonLeft(e)||t||(this._adapter.setClickUpOrDown(!0),e&&(this._persistEvent(e),e.stopPropagation(),this._preventDefault(e)),this.upClick(e),this._registerTimer(()=>{this._registerInterval(()=>{this.upClick(e)})}))}handleDownClick(e){const{readonly:t}=this.getProps();!this._isMouseButtonLeft(e)||t||(this._adapter.setClickUpOrDown(!0),e&&(this._persistEvent(e),e.stopPropagation(),this._preventDefault(e)),this.downClick(e),this._registerTimer(()=>{this._registerInterval(()=>{this.downClick(e)})}))}_isMouseButtonLeft(e){return Pt(e,"button")===Ye.MOUSE_BUTTON_LEFT}_preventDefault(e){const t=this._adapter.getProp("keepFocus"),o=this._adapter.getProp("innerButtons");(t||o)&&e.preventDefault()}handleMouseLeave(e){this._adapter.registerGlobalEvent("mouseup",()=>{this.handleMouseUp(e)})}upClick(e){const t=this.add(null,e);this._doInput(t,e),this._adapter.notifyUpClick(t,e)}downClick(e){const t=this.minus(null,e);this._doInput(t,e),this._adapter.notifyDownClick(t,e)}_setInitValue(){const{defaultValue:e,value:t}=this.getProps(),o=this._isControlledComponent("value")?t:e;let r=o;typeof o=="number"&&!this._isCurrency()?r=this.doFormat(o):this._isCurrency()||(r=Re(o));const s=this.doParse(r,!1,!0,!0);let l=null;typeof s=="number"&&!isNaN(s)&&(l=s);const c=typeof l=="number"?this.doFormat(l,!0,!0):"";this._adapter.setNumber(l),this._adapter.setValue(c),De(c)&&c!==String(o??"")&&this.notifyChange(c,null)}add(e,t){const r=t&&t.shiftKey?this.getProp("shiftStep"):this.getProp("step");e=e==null?r:Number(e);const s=Math.abs(rt(e)),l=this.getState("number");let c=this.toNumber(l)||0;const u=this.getProp("min"),p=this.getProp("max"),d=this._getPrecLen(u),m=this._getPrecLen(p),f=this._getPrecLen(c),b=this._getPrecLen(e),y=Math.pow(10,Math.max(d,m,f,b));return e<0?Math.abs(Or(u,c))>=s&&(c=Math.round(c*y+e*y)/y):e>0&&Math.abs(Or(p,c))>=s&&(c=Math.round(c*y+e*y)/y),typeof u=="number"&&u>c&&(c=u),typeof p=="number"&&p=1?t:15}return 15}_toScientificNotation(e){const t=this._getScientificNotationThreshold(),o=Math.abs(e),r=String(o),s=/e/i.test(r),l=r.replace(/[.\-+eE]/g,"").replace(/^0+/,"");if((s||l.length>=t)&&o!==0){const c=Math.max(0,Math.min(100,Math.floor(t)-1));return e.toExponential(c).replace(/(\.\d*?)0+e/,"$1e").replace(/\.e/,"e")}return String(e)}doFormat(){let e=arguments.length>0&&arguments[0]!==void 0?arguments[0]:0,t=arguments.length>1&&arguments[1]!==void 0?arguments[1]:!0,o=arguments.length>2&&arguments[2]!==void 0?arguments[2]:!1;const{formatter:r}=this.getProps();let s;if(this._isCurrency()&&o?s=this.formatCurrency(e):t?s=this._adjustPrec(e):s=Re(e),this._isScientificNotation()&&o&&!this._isCurrency()){const l=typeof e=="number"?e:parseFloat(s);!isNaN(l)&&isFinite(l)&&(s=this._toScientificNotation(l))}return typeof r=="function"&&(s=r(s)),s}fetchMinOrMax(e){const{min:t,max:o}=this.getProps();return eo?o:e}parseInternationalCurrency(e){let t=e.replace(this._currencySymbol,"").replace(new RegExp(`[^\\d${this._decimalPointSymbol}\\-]`,"g"),"");return this._decimalPointSymbol&&this._decimalPointSymbol!=="."&&(t=t.replace(this._decimalPointSymbol,".")),parseFloat(t)}doParse(e){let t=arguments.length>1&&arguments[1]!==void 0?arguments[1]:!0,o=arguments.length>2&&arguments[2]!==void 0?arguments[2]:!1,r=arguments.length>3&&arguments[3]!==void 0?arguments[3]:!1;if(this._isCurrency()&&typeof e=="string"&&(e=this.parseInternationalCurrency(e)),typeof e=="number")return r&&(e=this.fetchMinOrMax(e)),o&&(e=this._adjustPrec(e)),rt(e);const s=this.getProp("parser");if(typeof s=="function"){const l=s(e);e=typeof l=="number"?Re(l):l}if(typeof e=="string"&&/^[+-]?(?:\d+(?:\.\d*)?|\.\d+)[eE][+-]?\d+$/.test(e.trim())){const l=parseFloat(e.trim());if(!isNaN(l))return r?this.fetchMinOrMax(l):o?rt(this._adjustPrec(l)):l}if(t&&typeof e=="string"){const l=e.indexOf(".")===-1||e.indexOf(".")>-1&&(e==="0"||e.lastIndexOf("0")u===".").length<2;if(!l||!c)return NaN}return o&&(e=this._adjustPrec(e)),typeof e=="string"&&e.length?r?this.fetchMinOrMax(rt(e)):rt(e):NaN}afterParser(e){const t=this.getProp("parser");return Re(typeof e=="string"&&typeof t=="function"?t(e):e)}toNumber(e){let t=arguments.length>1&&arguments[1]!==void 0?arguments[1]:!0;if(typeof e=="number")return e;if(typeof e=="string"){const{parser:o}=this.getProps();if(this._isCurrency()&&(e=this.parseInternationalCurrency(e)),typeof o=="function"){const r=o(e);e=typeof r=="number"?Re(r):r}t&&(e=this._adjustPrec(e))}return rt(e)}isValidNumber(e){let t=arguments.length>1&&arguments[1]!==void 0?arguments[1]:!0;if(typeof e=="number"&&!isNaN(e)){const{min:o,max:r,precision:s}=this.getProps(),l=this._getPrecLen(e),c=t?typeof s=="number"&&l<=s||typeof s!="number":!0;if(e>=o&&e<=r&&c)return!0}return!1}isValidString(e){if(typeof e=="string"&&e.length){const t=this.doParse(e);return this.isValidNumber(t)}return!1}notifyChange(e,t){if(e==null||e==="")this._adapter.notifyChange("",t);else{const o=this.toNumber(e,!0);typeof o=="number"&&!isNaN(o)?(this._adapter.notifyChange(o,t),this.notifyNumberChange(o,t)):this._adapter.notifyChange(this.afterParser(e),t)}}notifyNumberChange(e,t){const{number:o}=this.getStates();this.isValidNumber(e)&&e!==o&&this._adapter.notifyNumberChange(e,t)}updateStates(e,t){this._adapter.updateStates(e,t)}getCurrencyByLocaleCode(){const{localeCode:e}=this.getProps(),t={"zh-CN":"CNY","zh-HK":"HKD","zh-TW":"TWD","ja-JP":"JPY","ko-KR":"KRW","th-TH":"THB","vi-VN":"VND","ms-MY":"MYR","id-ID":"IDR","hi-IN":"INR","ar-SA":"SAR","en-GB":"GBP","de-DE":"EUR","fr-FR":"EUR","it-IT":"EUR","es-ES":"EUR","pt-PT":"EUR","ru-RU":"RUB","en-US":"USD","en-CA":"CAD","es-MX":"MXN","pt-BR":"BRL","es-AR":"ARS","en-AU":"AUD","en-NZ":"NZD","en-ZA":"ZAR","ar-EG":"EGP"};if(t[e])return t[e];const o=e.split("-")[0],r={en:"USD",zh:"CNY",es:"EUR",fr:"EUR",de:"EUR",it:"EUR",ja:"JPY",ko:"KRW",ru:"RUB",ar:"SAR"};return r[o]?r[o]:"USD"}}var Lc=function(n,e){var t={};for(var o in n)Object.prototype.hasOwnProperty.call(n,o)&&e.indexOf(o)<0&&(t[o]=n[o]);if(n!=null&&typeof Object.getOwnPropertySymbols=="function")for(var r=0,o=Object.getOwnPropertySymbols(n);rthis.setState({value:t},o),setNumber:(t,o)=>this.setState({number:t},o),setFocusing:(t,o)=>this.setState({focusing:t},o),setHovering:t=>this.setState({hovering:t}),notifyChange:function(){return e.props.onChange(...arguments)},notifyNumberChange:function(){return e.props.onNumberChange(...arguments)},notifyBlur:t=>this.props.onBlur(t),notifyFocus:t=>this.props.onFocus(t),notifyUpClick:(t,o)=>this.props.onUpClick(t,o),notifyDownClick:(t,o)=>this.props.onDownClick(t,o),notifyKeyDown:t=>this.props.onKeyDown(t),registerGlobalEvent:(t,o)=>{t&&typeof o=="function"&&(this.adapter.unregisterGlobalEvent(t),this.adapter.setCache(t,o),document.addEventListener(t,o))},unregisterGlobalEvent:t=>{if(t){const o=this.adapter.getCache(t);document.removeEventListener(t,o),this.adapter.setCache(t,null)}},getInputCharacter:t=>this.inputNode.value[t],recordCursorPosition:()=>{try{this.inputNode&&(this.cursorStart=this.inputNode.selectionStart,this.cursorEnd=this.inputNode.selectionEnd,this.currentValue=this.inputNode.value,this.cursorBefore=this.inputNode.value.substring(0,this.cursorStart),this.cursorAfter=this.inputNode.value.substring(this.cursorEnd))}catch(t){console.warn(t)}},restoreByAfter:t=>{if(Jt(t))return!1;const o=this.inputNode.value,r=o.lastIndexOf(t);return r===-1?!1:r+t.length===o.length?(this.adapter.fixCaret(r,r),!0):!1},restoreCursor:function(){let t=arguments.length>0&&arguments[0]!==void 0?arguments[0]:e.cursorAfter;return Jt(t)?!1:Array.prototype.some.call(t,(o,r)=>{const s=t.substring(r);return e.adapter.restoreByAfter(s)})},fixCaret:(t,o)=>{if(!(t===void 0||o===void 0||!this.inputNode||!this.inputNode.value))try{const r=this.inputNode.selectionStart,s=this.inputNode.selectionEnd;(t!==r||o!==s)&&this.inputNode.setSelectionRange(t,o)}catch{}},setClickUpOrDown:t=>{this.clickUpOrDown=t},updateStates:(t,o)=>{this.setState(t,o)}})}constructor(e){super(e),this.setInputRef=o=>{const{forwardedRef:r}=this.props;this.inputNode=o,r&&typeof r=="object"?r.current=o:typeof r=="function"&&r(o)},this.handleInputFocus=o=>this.foundation.handleInputFocus(o),this.handleInputChange=(o,r)=>this.foundation.handleInputChange(o,r),this.handleInputBlur=o=>this.foundation.handleInputBlur(o),this.handleInputKeyDown=o=>this.foundation.handleInputKeyDown(o),this.handleInputMouseEnter=o=>this.foundation.handleInputMouseEnter(o),this.handleInputMouseLeave=o=>this.foundation.handleInputMouseLeave(o),this.handleInputMouseMove=o=>this.foundation.handleInputMouseMove(o),this.handleUpClick=o=>this.foundation.handleUpClick(o),this.handleDownClick=o=>this.foundation.handleDownClick(o),this.handleMouseUp=o=>this.foundation.handleMouseUp(o),this.handleMouseLeave=o=>this.foundation.handleMouseLeave(o),this.renderButtons=()=>{const{prefixCls:o,disabled:r,innerButtons:s,max:l,min:c}=this.props,{hovering:u,focusing:p,number:d}=this.state,m=r||d===l,f=r||d===c,b=I(`${o}-number-suffix-btns`,{[`${o}-number-suffix-btns-inner`]:s,[`${o}-number-suffix-btns-inner-hover`]:s&&u&&!p}),y=I(`${o}-number-button`,`${o}-number-button-up`,{[`${o}-number-button-up-disabled`]:r,[`${o}-number-button-up-not-allowed`]:m}),S=I(`${o}-number-button`,`${o}-number-button-down`,{[`${o}-number-button-down-disabled`]:r,[`${o}-number-button-down-not-allowed`]:f});return g.createElement("div",{className:b},g.createElement("span",{className:y,onMouseDown:m?$:this.handleUpClick,onMouseUp:this.handleMouseUp,onMouseLeave:this.handleMouseLeave},g.createElement(da,{size:"extra-small"})),g.createElement("span",{className:S,onMouseDown:f?$:this.handleDownClick,onMouseUp:this.handleMouseUp,onMouseLeave:this.handleMouseLeave},g.createElement(ua,{size:"extra-small"})))},this.renderSuffix=()=>{const{innerButtons:o,suffix:r}=this.props,{hovering:s,focusing:l}=this.state;return o&&(s||l)?this.renderButtons():r},this.foundation=new Mc(this.adapter),this.inputNode=null,this.clickUpOrDown=!1;const t=this._getInitState(e);this.state={value:t.value,number:t.number,focusing:!!e.autofocus||!1,hovering:!1}}_getInitState(e){const t=this.isControlled("value")?e.value:e.defaultValue;if(Jt(t)||t==="")return{value:"",number:null};if(e.currency===!0||typeof e.currency=="string"&&e.currency.trim()!==""){if(typeof t=="number"){const l=this.foundation.doParse(t,!1,!0,!0);return this.foundation.isValidNumber(l)?{value:this.foundation.doFormat(l,!0,!1),number:l}:{value:"",number:null}}return{value:String(t),number:null}}let r=t;typeof t=="number"&&(r=this.foundation.doFormat(t));const s=this.foundation.doParse(r,!1,!0,!0);return this.foundation.isValidNumber(s)?{value:this.foundation.doFormat(s,!0,!0),number:s}:{value:"",number:null}}componentDidUpdate(e){const{value:t,preventScroll:o}=this.props,{focusing:r}=this.state;let s;if(t!==e.value&&!kc(t,e.value)){if(Jt(t)||t==="")s="",this.foundation.updateStates({value:s,number:null});else{let l=t;typeof t=="number"&&(l=this.foundation.doFormat(t));const c=this.foundation.doParse(l,!1,!0,!0),u=typeof t=="number"?t:this.foundation.doParse(l,!1,!1,!1);if(r)if(this.foundation.isValidNumber(c)&&c!==this.state.number){const p={number:c};this.clickUpOrDown&&(p.value=this.foundation.doFormat(p.number,!0),s=p.value),this.foundation.updateStates(p,()=>this.adapter.restoreCursor())}else Sc(u)?this.foundation.updateStates({value:l}):(s=this.foundation.doFormat(u,!1),this.foundation.updateStates({value:s}));else this.foundation.isValidNumber(c)?(s=this.foundation.doFormat(c,!0,!0),this.foundation.updateStates({number:c,value:s})):(s="",this.foundation.updateStates({number:null,value:s}))}if(s&&De(s)&&s!==String(this.props.value))if(this.foundation._isCurrency()){const l=this.foundation.doParse(s),c=typeof this.props.value=="string"?this.foundation.doParse(this.props.value):this.props.value;l!==c&&this.foundation.notifyChange(s,null)}else this.foundation.notifyChange(s,null)}this.clickUpOrDown&&this.props.keepFocus&&this.state.focusing&&document.activeElement!==this.inputNode&&this.inputNode.focus({preventScroll:o})}render(){const e=this.props,{disabled:t,className:o,prefixCls:r,min:s,max:l,step:c,shiftStep:u,precision:p,formatter:d,parser:m,forwardedRef:f,onUpClick:b,onDownClick:y,pressInterval:S,pressTimeout:w,suffix:C,size:k,hideButtons:_,innerButtons:x,style:j,onNumberChange:v,keepFocus:O,defaultValue:E,defaultCurrency:D,currency:P,currencyDisplay:R,minimumFractionDigits:L,maximumFractionDigits:z,showCurrencySymbol:W,localeCode:A}=e,M=Lc(e,["disabled","className","prefixCls","min","max","step","shiftStep","precision","formatter","parser","forwardedRef","onUpClick","onDownClick","pressInterval","pressTimeout","suffix","size","hideButtons","innerButtons","style","onNumberChange","keepFocus","defaultValue","defaultCurrency","currency","currencyDisplay","minimumFractionDigits","maximumFractionDigits","showCurrencySymbol","localeCode"]),{value:Z,number:ue}=this.state,we=I(o,`${r}-number`,{[`${r}-number-size-${k}`]:k}),T=this.renderButtons(),F={"aria-disabled":t,step:c};return ue&&(F["aria-valuenow"]=ue),l!==1/0&&(F["aria-valuemax"]=l),s!==-1/0&&(F["aria-valuemin"]=s),g.createElement("div",{className:we,style:j,onMouseMove:se=>this.handleInputMouseMove(se),onMouseEnter:se=>this.handleInputMouseEnter(se),onMouseLeave:se=>this.handleInputMouseLeave(se)},g.createElement(ut,Object.assign({role:"spinbutton"},F,M,{size:k,disabled:t,ref:this.setInputRef,value:Z,onFocus:this.handleInputFocus,onChange:this.handleInputChange,onBlur:this.handleInputBlur,onKeyDown:this.handleInputKeyDown,suffix:this.renderSuffix()})),_||x?null:T)}}an.propTypes={"aria-label":h.string,"aria-labelledby":h.string,"aria-invalid":h.bool,"aria-errormessage":h.string,"aria-describedby":h.string,"aria-required":h.bool,autofocus:h.bool,clearIcon:h.node,className:h.string,defaultValue:h.oneOfType([h.number,h.string]),disabled:h.bool,formatter:h.func,forwardedRef:h.any,hideButtons:h.bool,innerButtons:h.bool,insetLabel:h.node,insetLabelId:h.string,keepFocus:h.bool,max:h.number,min:h.number,parser:h.func,precision:h.number,prefixCls:h.string,pressInterval:h.number,pressTimeout:h.number,preventScroll:h.bool,shiftStep:h.number,showCurrencySymbol:h.bool,step:h.number,style:h.object,suffix:h.any,value:h.oneOfType([h.number,h.string]),scientificNotation:h.oneOfType([h.bool,h.object]),onBlur:h.func,onChange:h.func,onDownClick:h.func,onKeyDown:h.func,onNumberChange:h.func,onUpClick:h.func};an.defaultProps={forwardedRef:$,innerButtons:!1,keepFocus:!1,max:1/0,min:-1/0,prefixCls:Oc.PREFIX,pressInterval:Ye.DEFAULT_PRESS_TIMEOUT,pressTimeout:Ye.DEFAULT_PRESS_TIMEOUT,shiftStep:Ye.DEFAULT_SHIFT_STEP,showCurrencySymbol:!0,size:Pc.DEFAULT_SIZE,step:Ye.DEFAULT_STEP,onBlur:$,onChange:$,onDownClick:$,onFocus:$,onKeyDown:$,onNumberChange:$,onUpClick:$};const Hn=Yl(g.forwardRef(function(e,t){return g.createElement(Zs,{componentName:"InputNumber"},(o,r,s,l)=>g.createElement(an,Object.assign({localeCode:r,defaultCurrency:l},e,{forwardedRef:t})))}),an),fi={PREFIX:`${Te}-radio`},Ic={PREFIX:`${Te}-radioGroup`},oe={DIRECTION_SET:["horizontal","vertical"],DEFAULT_DIRECTION:"horizontal",MODE:["advanced",""],TYPE_DEFAULT:"default",TYPE_BUTTON:"button",TYPE_CARD:"card",TYPE_PURECARD:"pureCard",BUTTON_SIZE:["middle","small","large"]};class Tc extends ge{constructor(e){super(Object.assign({},e))}init(){const e=this._getDisplayValue();this._setValue(e)}_getDisplayValue(){const{value:e,defaultValue:t}=this.getProps();let o;return"value"in this.getProps()?o=e:"defaultValue"in this.getProps()&&(o=t),o}handleChange(e){const t=this.getProp("mode"),o=this.getState("value"),{checked:r,value:s}=e.target,l=this._adapter.isInProps("value"),c=Object.assign(Object.assign({},e),{target:Object.assign(Object.assign({},e.target),{value:s})});t==="advanced"&&!r&&(c.target.value=void 0),l||(t==="advanced"&&!r?this._setValue(void 0):this._setValue(s)),(t==="advanced"||o!==s)&&this._adapter.notifyChange(c)}handlePropValueChange(e){this._setValue(e)}_setValue(e){this._adapter.setValue(e)}destroy(){}}const Vo=g.createContext(null);class Rc extends ge{constructor(){super(...arguments),this.handleFocusVisible=e=>{const{target:t}=e;try{t.matches(":focus-visible")&&this._adapter.setFocusVisible(!0)}catch{zs(!0,"Warning: [Semi Radio] The current browser does not support the focus-visible")}},this.handleBlur=()=>{this._adapter.setFocusVisible(!1)}}init(){const{children:e,extra:t,extraId:o,addonId:r}=this._adapter.getProps();e&&!r&&this._adapter.setAddonId(),t&&!o&&this._adapter.setExtraId()}setHover(e){this._adapter.setHover(e)}setChecked(e){this._adapter.setChecked(e)}}class Nc extends ge{constructor(e){super(Object.assign({},e))}init(){const e=this._adapter.getProp("checked"),t=this._adapter.getProp("defaultChecked");this.setChecked(e||t)}setChecked(e){this._adapter.setNativeControlChecked(e)}getChecked(){return this._adapter.getProp("checked")}handleChange(e){const t="checked"in this.getProps(),{checked:o}=e.target,r=()=>{e.stopPropagation()},s=()=>{e.preventDefault()},l={target:Object.assign(Object.assign({},this.getProps()),{checked:o}),stopPropagation:r,preventDefault:s};t?this._adapter.notifyChange(l):(this.setChecked(o),this._adapter.notifyChange(l))}destroy(){}}class gn extends de{constructor(e){super(e),this.state={checked:!1},this.foundation=new Nc(this.adapter),this.onChange=this.onChange.bind(this)}get adapter(){return Object.assign(Object.assign({},super.adapter),{setNativeControlChecked:e=>{this.setState({checked:e})},notifyChange:e=>{this.props.onChange(e)}})}componentDidMount(){this.foundation.init()}componentDidUpdate(e){e.checked!==this.props.checked&&this.foundation.setChecked(this.props.checked)}componentWillUnmount(){this.foundation.destroy()}blur(){this.inputEntity.blur()}focus(){const{preventScroll:e}=this.props;this.inputEntity.focus({preventScroll:e})}onChange(e){this.foundation.handleChange(e)}render(){const{disabled:e,mode:t,autoFocus:o,name:r,isButtonRadio:s,isPureCardRadioGroup:l,addonId:c,extraId:u,"aria-label":p,focusInner:d,onInputFocus:m,onInputBlur:f}=this.props,{checked:b}=this.state,y=this.props.prefixCls||fi.PREFIX,S=I({[`${y}-inner`]:!0,[`${y}-inner-checked`]:!!b,[`${y}-inner-buttonRadio`]:s,[`${y}-inner-pureCardRadio`]:l}),w=I({[`${y}-focus`]:d,[`${y}-focus-border`]:d&&!b,[`${y}-inner-display`]:!s});return g.createElement("span",{className:S},g.createElement("input",{ref:C=>{this.inputEntity=C},autoFocus:o,type:t==="advanced"?"checkbox":"radio",checked:!!b,disabled:e,onChange:this.onChange,name:r,"aria-label":p,"aria-labelledby":c,"aria-describedby":u,onFocus:m,onBlur:f}),g.createElement("span",{className:w},b?g.createElement(dl,null):null))}}gn.contextType=Vo;gn.propTypes={checked:h.bool,disabled:h.bool,isButtonRadio:h.bool,onChange:h.func,mode:h.oneOf(["advanced",""]),"aria-label":h.string,focusInner:h.bool,onInputFocus:h.func,onInputBlur:h.func,preventScroll:h.bool};gn.defaultProps={onChange:$,isButtonRadio:!1};var Dc=function(n,e){var t={};for(var o in n)Object.prototype.hasOwnProperty.call(n,o)&&e.indexOf(o)<0&&(t[o]=n[o]);if(n!=null&&typeof Object.getOwnPropertySymbols=="function")for(var r=0,o=Object.getOwnPropertySymbols(n);r{const{onChange:o}=this.props;if(this.isInGroup()){const{radioGroup:r}=this.context;r.onChange&&r.onChange(t)}!("checked"in this.props)&&this.foundation.setChecked(t.target.checked),o&&o(t)},this.handleMouseEnter=t=>{this.props.onMouseEnter(t),this.foundation.setHover(!0)},this.handleMouseLeave=t=>{this.props.onMouseLeave(t),this.foundation.setHover(!1)},this.handleFocusVisible=t=>{this.foundation.handleFocusVisible(t)},this.handleBlur=t=>{this.foundation.handleBlur()},this.state={hover:!1,addonId:e.addonId,extraId:e.extraId,checked:e.checked||e.defaultChecked||!1},this.foundation=new Rc(this.adapter),this.radioEntity=null}componentDidUpdate(e){this.props.checked!==e.checked&&(Fs(this.props.checked)?this.foundation.setChecked(!1):Vl(this.props.checked)&&this.foundation.setChecked(this.props.checked))}get adapter(){return Object.assign(Object.assign({},super.adapter),{setHover:e=>{this.setState({hover:e})},setAddonId:()=>{this.setState({addonId:jo({prefix:"addon"})})},setChecked:e=>{this.setState({checked:e})},setExtraId:()=>{this.setState({extraId:jo({prefix:"extra"})})},setFocusVisible:e=>{this.setState({focusVisible:e})}})}isInGroup(){return this.context&&this.context.radioGroup}focus(){this.radioEntity.focus()}blur(){this.radioEntity.blur()}render(){const e=this.props,{addonClassName:t,addonStyle:o,disabled:r,style:s,className:l,prefixCls:c,displayMode:u,children:p,extra:d,mode:m,type:f,value:b,name:y}=e,S=Dc(e,["addonClassName","addonStyle","disabled","style","className","prefixCls","displayMode","children","extra","mode","type","value","name"]);let w,C,k,_,x,j,v,O,E;const{hover:D,addonId:P,extraId:R,focusVisible:L,checked:z}=this.state,W={checked:z,disabled:r};this.isInGroup()?(w=this.context.radioGroup.value===b,C=r||this.context.radioGroup.disabled,k=this.context.mode,_=this.context.radioGroup.isButtonRadio,x=this.context.radioGroup.isCardRadio,j=this.context.radioGroup.isPureCardRadio,O=this.context.radioGroup.buttonSize,E=c||this.context.radioGroup.prefixCls,W.checked=w,W.disabled=C):(w=z,C=r,k=m,v=f==="button",E=c,_=f===oe.TYPE_BUTTON,j=f===oe.TYPE_PURECARD,x=f===oe.TYPE_CARD||j);const A=typeof _>"u"?v:_,M=E||fi.PREFIX,Z=x||j||A,ue=I(M,{[`${M}-disabled`]:C,[`${M}-checked`]:w,[`${M}-${u}`]:!!u,[`${M}-buttonRadioComponent`]:v,[`${M}-buttonRadioGroup`]:_,[`${M}-buttonRadioGroup-${O}`]:_&&O,[`${M}-cardRadioGroup`]:x,[`${M}-cardRadioGroup_disabled`]:C&&x,[`${M}-cardRadioGroup_checked`]:x&&w&&!C,[`${M}-cardRadioGroup_checked_disabled`]:x&&w&&C,[`${M}-cardRadioGroup_hover`]:x&&!w&&D&&!C,[l]:!!l,[`${M}-focus`]:L&&(x||j)}),we=this.isInGroup()&&this.context.radioGroup.name,T=I({[`${M}-addon`]:!A,[`${M}-addon-buttonRadio`]:A,[`${M}-addon-buttonRadio-checked`]:A&&w,[`${M}-addon-buttonRadio-disabled`]:A&&C,[`${M}-addon-buttonRadio-hover`]:A&&!w&&!C&&D,[`${M}-addon-buttonRadio-${O}`]:A&&O,[`${M}-focus`]:L&&A},t),F=()=>!p&&!d?null:g.createElement("div",{className:I([`${M}-content`,{[`${M}-isCardRadioGroup_content`]:x}])},p?g.createElement("span",{className:T,style:o,id:P,"x-semi-prop":"children"},p):null,d&&!A?g.createElement("div",{className:`${M}-extra`,id:R,"x-semi-prop":"extra"},d):null);return g.createElement("label",Object.assign({style:s,className:ue,onMouseEnter:this.handleMouseEnter,onMouseLeave:this.handleMouseLeave},this.getDataAttr(S)),g.createElement(gn,Object.assign({},this.props,W,{mode:k,name:y??we,isButtonRadio:A,isPureCardRadioGroup:j,onChange:this.onChange,ref:Q=>{this.radioEntity=Q},addonId:p&&P,extraId:d&&R,focusInner:L&&!Z,onInputFocus:this.handleFocusVisible,onInputBlur:this.handleBlur})),F())}}et.contextType=Vo;et.propTypes={autoFocus:h.bool,checked:h.bool,defaultChecked:h.bool,value:h.any,style:h.object,className:h.string,disabled:h.bool,prefixCls:h.string,displayMode:h.oneOf(["vertical",""]),onChange:h.func,onMouseEnter:h.func,onMouseLeave:h.func,mode:h.oneOf(oe.MODE),extra:h.node,addonStyle:h.object,addonClassName:h.string,type:h.oneOf([oe.TYPE_DEFAULT,oe.TYPE_BUTTON,oe.TYPE_CARD,oe.TYPE_PURECARD]),"aria-label":h.string,preventScroll:h.bool};et.defaultProps={autoFocus:!1,defaultChecked:!1,value:void 0,style:void 0,onMouseEnter:$,onMouseLeave:$,mode:"",type:"default"};et.elementType="Radio";var $c=function(n,e){var t={};for(var o in n)Object.prototype.hasOwnProperty.call(n,o)&&e.indexOf(o)<0&&(t[o]=n[o]);if(n!=null&&typeof Object.getOwnPropertySymbols=="function")for(var r=0,o=Object.getOwnPropertySymbols(n);r{this.foundation.handleChange(t)},this.getFormatName=()=>this.props.name||"default",this.state={value:e.value||e.defaultValue},this.foundation=new Tc(this.adapter)}componentDidMount(){this.foundation.init()}componentDidUpdate(e){typeof e.value=="number"&&isNaN(e.value)&&typeof this.props.value=="number"&&isNaN(this.props.value)||e.value!==this.props.value&&this.foundation.handlePropValueChange(this.props.value)}componentWillUnmount(){this.foundation.destroy()}get adapter(){return Object.assign(Object.assign({},super.adapter),{setValue:e=>{this.setState({value:e})},getProps:()=>this.props,isInProps:e=>e in this.props,notifyChange:e=>{this.props.onChange&&this.props.onChange(e)}})}render(){const e=this.props,{children:t,options:o,mode:r,prefixCls:s,className:l,style:c,direction:u,type:p,buttonSize:d,id:m}=e,f=$c(e,["children","options","mode","prefixCls","className","style","direction","type","buttonSize","id"]),b=p===oe.TYPE_BUTTON,y=p===oe.TYPE_PURECARD,S=p===oe.TYPE_CARD||y,w=p===oe.TYPE_DEFAULT,C=s||Ic.PREFIX,k=I(l,{[C]:!0,[`${C}-wrapper`]:!0,[`${C}-${u}`]:u&&!b,[`${C}-${u}-default`]:u&&w,[`${C}-${u}-card`]:u&&S,[`${C}-buttonRadio`]:b}),_=this.state.value;let x;return o?x=(o||[]).map((j,v)=>typeof j=="string"?g.createElement(et,{key:v,disabled:this.props.disabled,value:j},j):g.createElement(et,{key:v,disabled:j.disabled||this.props.disabled,value:j.value,extra:j.extra,className:j.className,style:j.style,addonId:j.addonId,addonStyle:j.addonStyle,addonClassName:j.addonClassName,extraId:j.extraId},j.label)):t&&(x=g.Children.map(t,(j,v)=>g.isValidElement(j)?g.cloneElement(j,{key:v}):null)),g.createElement("div",Object.assign({className:k,style:c,id:m,"aria-label":this.props["aria-label"],"aria-invalid":this.props["aria-invalid"],"aria-errormessage":this.props["aria-errormessage"],"aria-labelledby":this.props["aria-labelledby"],"aria-describedby":this.props["aria-describedby"],"aria-required":this.props["aria-required"]},this.getDataAttr(f)),g.createElement(Vo.Provider,{value:{radioGroup:{onChange:this.onChange,value:_,disabled:this.props.disabled,name:this.getFormatName(),isButtonRadio:b,isCardRadio:S,isPureCardRadio:y,buttonSize:d,prefixCls:s},mode:r}},x))}}Ke.propTypes={defaultValue:h.any,disabled:h.bool,name:h.string,options:h.array,buttonSize:h.oneOf(oe.BUTTON_SIZE),type:h.oneOf([oe.TYPE_DEFAULT,oe.TYPE_BUTTON,oe.TYPE_CARD,oe.TYPE_PURECARD]),value:h.any,onChange:h.func,children:h.node,prefixCls:h.string,className:h.string,style:h.object,direction:h.oneOf(oe.DIRECTION_SET),mode:h.oneOf(oe.MODE),"aria-label":h.string,"aria-describedby":h.string,"aria-errormessage":h.string,"aria-invalid":h.bool,"aria-labelledby":h.string,"aria-required":h.bool,id:h.string};Ke.defaultProps={disabled:!1,onChange:$,direction:oe.DEFAULT_DIRECTION,mode:"",type:oe.TYPE_DEFAULT,buttonSize:"middle"};class Me extends et{}Me.Group=Ke;class Ko extends ge{constructor(e){super(Object.assign(Object.assign({},Ko.defaultAdapter),e)),this.handleMouseInSideChange=t=>{this._adapter.handleMouseInSideChange(t)},this.getInputWrapperRect=()=>this._adapter.getInputWrapperRect()}hasToast(e){return this._adapter.getState("list").map(o=>{let{id:r}=o;return r}).includes(e)}addToast(e){const t=this._adapter.getState("list");t.push(e),this._adapter.updateToast(t,[],[])}updateToast(e,t){let o=this._adapter.getState("list");o=o.map(s=>s.id===e?Object.assign(Object.assign({},s),t):s);const r=o.filter(s=>s.id===e);this._adapter.updateToast(o,[],r)}removeToast(e){let t=this._adapter.getState("list");const o=[];t=t.filter(r=>r.id===e?(o.push(r),!1):!0),this._adapter.updateToast(t,o,[])}destroyAll(){const e=this._adapter.getState("list");e.length>0&&this._adapter.updateToast([],e,[])}}const Pr=`${Te}-toast`,ct={PREFIX:Pr,WRAPPER:`${Pr}-wrapper`},Ot={types:["warning","success","info","error","default"],themes:["normal","light"],directions:["ltr","rtl"]},Ac={duration:3};class Wo extends ge{constructor(e){super(Object.assign(Object.assign({},Wo.defaultAdapter),e)),this._timer=null,this._id=null}init(){this.startCloseTimer_(),this._id=this._adapter.getProp("id")}destroy(){this.clearCloseTimer_()}startCloseTimer_(){const e=this._adapter.getProp("duration");e&&Io(e)&&(this._timer=setTimeout(()=>{this.close()},e*1e3))}close(e){e&&e.stopPropagation(),this._adapter.notifyWrapperToRemove(this._id),this._adapter.notifyClose()}clearCloseTimer_(){this._timer&&(clearTimeout(this._timer),this._timer=null)}restartCloseTimer(){this.clearCloseTimer_(),this.startCloseTimer_()}}const Pe=ct.PREFIX;let tt=class extends de{constructor(e){super(e),this.toastEle=g.createRef(),this.clearCloseTimer=()=>{this.foundation.clearCloseTimer_()},this.startCloseTimer=()=>{this.foundation.startCloseTimer_()},this.restartCloseTimer=()=>{this.foundation.restartCloseTimer()},this.state={},this.foundation=new Wo(this.adapter)}get adapter(){return Object.assign(Object.assign({},super.adapter),{notifyWrapperToRemove:e=>{this.props.close(e)},notifyClose:()=>{this.props.onClose()}})}componentDidMount(){this.foundation.init()}componentWillUnmount(){this.foundation.destroy()}close(e){this.foundation.close(e)}renderIcon(){const{type:e,icon:t}=this.props,r={warning:g.createElement(Qs,null),success:g.createElement(Ks,null),info:g.createElement(Gs,null),error:g.createElement(Ws,null)}[e],s="large",l=I(`${Pe}-icon`,`${Pe}-icon-${e}`);return t?Ge(t)?g.cloneElement(t,{size:s,className:`${Pe}-icon`}):t:e&&r?g.cloneElement(r,{size:s,className:l}):null}render(){const{content:e,type:t,theme:o,showClose:r,textMaxWidth:s,className:l,style:c}=this.props,u=this.props.direction||this.context.direction,p=I(Pe,l,{[`${Pe}-${t}`]:!0,[`${Pe}-${o}`]:o==="light",[`${Pe}-rtl`]:u==="rtl"}),d={};d.maxWidth=s;const m="borderless",f="small",b=this.props.positionInList?this.props.positionInList.length-this.props.positionInList.index-1:0,y=g.createElement("div",{ref:this.toastEle,role:"alert","aria-label":`${t||"default"} type`,className:p,style:Object.assign(Object.assign({},c),{transform:`translate3d(0,0,${b*-10}px)`}),onMouseEnter:this.clearCloseTimer,onMouseLeave:this.startCloseTimer,onAnimationStart:this.props.onAnimationStart,onAnimationEnd:this.props.onAnimationEnd},g.createElement("div",{className:`${Pe}-content`},this.renderIcon(),g.createElement("span",{className:`${Pe}-content-text`,style:d,"x-semi-prop":"content"},e),r&&g.createElement("div",{className:`${Pe}-close-button`},g.createElement(qs,{onClick:S=>this.close(S),type:"tertiary",icon:g.createElement(cn,{"x-semi-prop":"icon"}),theme:m,size:f}))));if(this.props.stack){const S=this.props.stackExpanded&&this.toastEle.current&&getComputedStyle(this.toastEle.current).height||0;return g.createElement("div",{className:`${Pe}-zero-height-wrapper`,style:{height:S}},y)}else return y}};tt.contextType=Us;tt.propTypes={onClose:h.func,content:h.node,close:h.func,duration:h.number,theme:h.oneOf(Ot.themes),type:h.oneOf(Ot.types),textMaxWidth:h.oneOfType([h.string,h.number]),style:h.object,className:h.string,showClose:h.bool,stack:h.bool,stackExpanded:h.bool,icon:h.node,direction:h.oneOf(Ot.directions)};tt.__SemiComponentName__="Toast";tt.defaultProps=ln(tt.__SemiComponentName__,{onClose:$,content:"",close:$,duration:Ac.duration,textMaxWidth:450,showClose:!0,stack:!1,stackExpanded:!1,theme:"normal"});var Fc=function(n,e){var t={};for(var o in n)Object.prototype.hasOwnProperty.call(n,o)&&e.indexOf(o)<0&&(t[o]=n[o]);if(n!=null&&typeof Object.getOwnPropertySymbols=="function")for(var r=0,o=Object.getOwnPropertySymbols(n);r{var{afterClose:t}=n,o=Fc(n,["afterClose"]);const[r,s]=a.useState(!0),l=()=>{s(!1)};return g.useImperativeHandle(e,()=>({close:()=>{s(!1)}})),a.useEffect(()=>{r||t(o.id)},[r]),r?g.createElement(tt,Object.assign({},o,{close:l})):null},Bc=g.forwardRef(zc),wt={motion:!0,zIndex:1010,duration:3};function Uc(){const[n,e]=g.useState([]);function t(o,r){return e(s=>[{element:o,config:r},...s]),s=>{e(l=>l.filter(c=>{let{config:u}=c;return u.id!==s}))}}return[n,t]}function Vc(){const[n,e]=Uc(),t=a.useRef(new Map),o=s=>{const l=Oo("semi_toast_"),c=Object.assign(Object.assign({},s),{id:l});let u;const p=g.createElement(Bc,Object.assign({},c,{key:l,afterClose:d=>u(d),ref:d=>{var m;t.current.set(l,{close:(m=d==null?void 0:d.close)!==null&&m!==void 0?m:$})}}));return u=e(p,Object.assign({},c)),l},r=s=>{var l;const{close:c}=(l=t.current.get(s))!==null&&l!==void 0?l:{};c==null||c()};return[{success:s=>o(Object.assign(Object.assign(Object.assign({},wt),s),{type:"success"})),info:s=>o(Object.assign(Object.assign(Object.assign({},wt),s),{type:"info"})),error:s=>o(Object.assign(Object.assign(Object.assign({},wt),s),{type:"error"})),warning:s=>o(Object.assign(Object.assign(Object.assign({},wt),s),{type:"warning"})),open:s=>o(Object.assign(Object.assign(Object.assign({},wt),s),{type:"default"})),close:s=>r(s)},g.createElement(g.Fragment,null,Array.isArray(n)&&n.length?g.createElement(g.Fragment,null,n.map(s=>s.element)):null)]}const Kc=()=>{var n;return n=class J extends de{constructor(t){super(t),this.stack=!1,this.innerWrapperRef=g.createRef(),this.handleMouseEnter=o=>{this.stack&&this.foundation.handleMouseInSideChange(!0)},this.handleMouseLeave=o=>{var r;this.stack&&(!((r=this.foundation.getInputWrapperRect())===null||r===void 0)&&r.height)&&this.foundation.handleMouseInSideChange(!1)},this.state={list:[],removedItems:[],updatedItems:[],mouseInSide:!1},this.foundation=new Ko(this.adapter)}get adapter(){return Object.assign(Object.assign({},super.adapter),{updateToast:(t,o,r)=>{this.setState({list:t,removedItems:o,updatedItems:r})},handleMouseInSideChange:t=>{this.setState({mouseInSide:t})},getInputWrapperRect:()=>{var t;return(t=this.innerWrapperRef.current)===null||t===void 0?void 0:t.getBoundingClientRect()}})}static create(t){var o,r,s;const l=(o=t.id)!==null&&o!==void 0?o:Oo("toast"),c=((s=(r=me===null||me===void 0?void 0:me.config)===null||r===void 0?void 0:r.overrideDefaultProps)===null||s===void 0?void 0:s.Toast)||{},u=Object.assign(Object.assign(Object.assign({},J.defaultOpts),c),t);if(J.ref){const p=document.querySelector(`#${this.wrapperId}`);["top","left","bottom","right"].map(d=>{d in u&&(p.style[d]=typeof u[d]=="number"?`${u[d]}px`:u[d])}),!!u.stack!==J.ref.stack&&(J.ref.stack=!!u.stack),J.ref.has(l)?J.ref.update(l,Object.assign(Object.assign({},u),{id:l})):J.ref.add(Object.assign(Object.assign({},u),{id:l}))}else{const p=document.createElement("div");this.wrapperId||(this.wrapperId=Oo("toast-wrapper").slice(0,26)),p.className=ct.WRAPPER,p.id=this.wrapperId,p.style.zIndex=String(typeof t.zIndex=="number"?t.zIndex:u.zIndex),["top","left","bottom","right"].map(d=>{if(d in u){const m=u[d];p.style[d]=typeof m=="number"?`${m}px`:m}}),u.getPopupContainer?u.getPopupContainer().appendChild(p):document.body.appendChild(p),Vs(g.createElement(J,{ref:d=>{d&&(J.ref=d,d.add(Object.assign(Object.assign({},u),{id:l})),d.stack=!!u.stack)}}),p)}return l}static close(t){J.ref&&J.ref.remove(t)}static destroyAll(){var t;if(J.ref){J.ref.destroyAll();const o=document.querySelector(`#${this.wrapperId}`);o&&(Hs(o),(t=o.parentNode)===null||t===void 0||t.removeChild(o)),J.ref=null,this.wrapperId=null}}static getWrapperId(){return this.wrapperId}static info(t){var o,r;typeof t=="string"&&(t={content:t});const s=((r=(o=me===null||me===void 0?void 0:me.config)===null||o===void 0?void 0:o.overrideDefaultProps)===null||r===void 0?void 0:r.Toast)||{};return this.create(Object.assign(Object.assign(Object.assign(Object.assign({},J.defaultOpts),s),t),{type:"info"}))}static warning(t){var o,r;typeof t=="string"&&(t={content:t});const s=((r=(o=me===null||me===void 0?void 0:me.config)===null||o===void 0?void 0:o.overrideDefaultProps)===null||r===void 0?void 0:r.Toast)||{};return this.create(Object.assign(Object.assign(Object.assign(Object.assign({},J.defaultOpts),s),t),{type:"warning"}))}static error(t){var o,r;typeof t=="string"&&(t={content:t});const s=((r=(o=me===null||me===void 0?void 0:me.config)===null||o===void 0?void 0:o.overrideDefaultProps)===null||r===void 0?void 0:r.Toast)||{};return this.create(Object.assign(Object.assign(Object.assign(Object.assign({},J.defaultOpts),s),t),{type:"error"}))}static success(t){var o,r;typeof t=="string"&&(t={content:t});const s=((r=(o=me===null||me===void 0?void 0:me.config)===null||o===void 0?void 0:o.overrideDefaultProps)===null||r===void 0?void 0:r.Toast)||{};return this.create(Object.assign(Object.assign(Object.assign(Object.assign({},J.defaultOpts),s),t),{type:"success"}))}static config(t){["top","left","bottom","right"].forEach(o=>{o in t&&(J.defaultOpts[o]=t[o])}),typeof t.theme=="string"&&Ot.themes.includes(t.theme)&&(J.defaultOpts.theme=t.theme),typeof t.zIndex=="number"&&(J.defaultOpts.zIndex=t.zIndex),typeof t.duration=="number"&&(J.defaultOpts.duration=t.duration),typeof t.getPopupContainer=="function"&&(J.defaultOpts.getPopupContainer=t.getPopupContainer)}has(t){return this.foundation.hasToast(t)}add(t){return this.foundation.addToast(t)}update(t,o){return this.foundation.updateToast(t,o)}remove(t){return this.foundation.removeToast(t)}destroyAll(){return this.foundation.destroyAll()}render(){let{list:t}=this.state;const{removedItems:o,updatedItems:r}=this.state;t=Array.from(new Set([...t,...o]));const s=r.map(c=>{let{id:u}=c;return u}),l=c=>{var u;!((u=c==null?void 0:c.foundation)===null||u===void 0)&&u._id&&s.includes(c.foundation._id)&&c.foundation.restartCloseTimer()};return g.createElement(g.Fragment,null,g.createElement("div",{className:I({[`${ct.PREFIX}-innerWrapper`]:!0,[`${ct.PREFIX}-innerWrapper-hover`]:this.state.mouseInSide}),ref:this.innerWrapperRef,onMouseEnter:this.handleMouseEnter,onMouseLeave:this.handleMouseLeave},t.map((c,u)=>{const p=o.find(m=>m.id===c.id)!==void 0,d=p?"leave":"enter";return g.createElement(Eo,{key:c.id,motion:c.motion,animationState:d,startClassName:p?`${ct.PREFIX}-animation-hide`:`${ct.PREFIX}-animation-show`,onAnimationEnd:m=>{d==="leave"&&this.setState(f=>{var b;return!((b=f.removedItems)===null||b===void 0)&&b.some(y=>y.id===c.id)?Object.assign(Object.assign({},f),{removedItems:f.removedItems.filter(y=>y.id!==c.id)}):null})}},m=>{let{animationClassName:f,animationEventsNeedBind:b,isAnimating:y}=m;return g.createElement(tt,Object.assign({},c,{stack:this.stack,stackExpanded:this.state.mouseInSide,positionInList:{length:t.length,index:u},className:I({[c.className]:!!c.className,[f]:!0})},b,{style:Object.assign({},c.style),close:S=>this.remove(S),ref:l}))})})))}},n.defaultOpts={motion:!0,zIndex:1010,content:""},n.propTypes={content:h.node,duration:h.number,onClose:h.func,icon:h.node,direction:h.oneOf(Ot.directions),stack:h.bool},n.defaultProps={},n};class Wc{static create(e){const t=Kc();return t.useToast=Vc,e&&t.config(e),t}}const G=Wc.create(),Zn=n=>n==="vertical"?["bottom","top"]:["right","left"],ft=(n,e)=>n.endsWith("px")?Number(n.replace("px","")):n.endsWith("%")?Number(n.replace("%",""))/100*e:typeof n>"u"?n:Number(n),en=function(n,e,t,o){let r=arguments.length>4&&arguments[4]!==void 0?arguments[4]:0;e=e??"0%",t=t??"100%";const s=ft(e,o),l=ft(t,o);return nl},qn=(n,e,t,o,r)=>{e=e??"0%",t=t??"100%";const s=ft(e,o),l=ft(t,o);return nl?l:n},_r=(n,e)=>{if(e==="horizontal"){const t=parseFloat(n.paddingLeft),o=parseFloat(n.paddingRight),r=parseFloat(n.borderLeftWidth),s=parseFloat(n.borderRightWidth);return t+o+r+s}else{const t=parseFloat(n.paddingTop),o=parseFloat(n.paddingBottom),r=parseFloat(n.borderTopWidth),s=parseFloat(n.borderBottomWidth);return t+o+r+s}};class Hc extends ge{constructor(e){super(Object.assign({},e))}init(){this._adapter.registerEvents()}destroy(){this._adapter.unregisterEvents()}}class Zc extends ge{constructor(e){super(Object.assign({},e))}init(){}destroy(){}}class qc extends ge{constructor(e){super(Object.assign({},e)),this.registerEvents=()=>{this._adapter.registerEvents(this.type)},this.unregisterEvents=()=>{this._adapter.unregisterEvents(this.type)},this.onResizeStart=(t,o,r)=>{this.type=r;let{clientX:s,clientY:l}=o,c=this._adapter.getItem(t),u=this._adapter.getItem(t+1),p,d;const m=this.window.getComputedStyle(c),f=this.window.getComputedStyle(u);p=_r(m,this.direction)+this.itemMinusMap.get(t),d=_r(f,this.direction)+this.itemMinusMap.get(t+1);let b=(this.direction==="horizontal"?c.offsetWidth:c.offsetHeight)+this.itemMinusMap.get(t),y=(this.direction==="horizontal"?u.offsetWidth:u.offsetHeight)+this.itemMinusMap.get(t+1);const S=this.getStates();this.setState({isResizing:!0,originalPosition:{x:s,y:l,lastItemSize:b,nextItemSize:y,lastOffset:p,nextOffset:d},backgroundStyle:Object.assign(Object.assign({},S.backgroundStyle),{cursor:this.window.getComputedStyle(o.target).cursor||"auto"}),curHandler:t}),this.registerEvents();let w=this._adapter.getItemStart(t),C=this._adapter.getItemStart(t+1),[k,_]=Zn(this.direction);w&&w(o,k),C&&C(o,_)},this.onMouseMove=t=>{this.onResizing(t)},this.onTouchMove=t=>{t.preventDefault(),this.onResizing(t)},this.onResizing=t=>{const o=this.getStates();if(!o.isResizing)return;const{curHandler:r,originalPosition:s}=o;let{x:l,y:c,lastItemSize:u,nextItemSize:p,lastOffset:d,nextOffset:m}=s,{clientX:f,clientY:b}=this.type==="mouse"?t:t.targetTouches[0];const y=this.getProps(),{direction:S}=y;let w=this._adapter.getItem(r),C=this._adapter.getItem(r+1),k=this.groupSize,_=S==="horizontal"?f-l:b-c,x=u+_,j=p-_,v=en(x,this._adapter.getItemMin(r),this._adapter.getItemMax(r),k,d),O=en(j,this._adapter.getItemMin(r+1),this._adapter.getItemMax(r+1),k,m);v&&(x=qn(x,this._adapter.getItemMin(r),this._adapter.getItemMax(r),k,d),j=u+p-x),O&&(j=qn(j,this._adapter.getItemMin(r+1),this._adapter.getItemMax(r+1),k,m),x=u+p-j);let E=this.itemPercentMap.get(r),D=this.itemPercentMap.get(r+1),P=x/k*100,R=E+D-P;this.itemPercentMap.set(r,P),this.itemPercentMap.set(r+1,R),S==="horizontal"?(w.style.width=`calc(${P}% - ${this.itemMinusMap.get(r)}px)`,C.style.width=`calc(${R}% - ${this.itemMinusMap.get(r+1)}px)`):S==="vertical"&&(w.style.height=`calc(${P}% - ${this.itemMinusMap.get(r)}px)`,C.style.height=`calc(${R}% - ${this.itemMinusMap.get(r+1)}px)`);let L=this._adapter.getItemChange(r),z=this._adapter.getItemChange(r+1),[W,A]=Zn(this.direction);L&&L({width:w.offsetWidth,height:w.offsetHeight},t,W),z&&z({width:C.offsetWidth,height:C.offsetHeight},t,A)},this.onResizeEnd=t=>{const{curHandler:o}=this.getStates();let r=this._adapter.getItem(o),s=this._adapter.getItem(o+1),l=this._adapter.getItemEnd(o),c=this._adapter.getItemEnd(o+1),[u,p]=Zn(this.direction);l&&l({width:r.offsetWidth,height:r.offsetHeight},t,u),c&&c({width:s.offsetWidth,height:s.offsetHeight},t,p),this.setState({isResizing:!1,curHandler:null}),this.unregisterEvents()},this.initSpace=()=>{const t=this.getProps(),{direction:o}=t;let r=new Array(this._adapter.getHandlerCount()).fill(0),s=this.groupSize;this.totalMinus=0;for(let d=0;dS&&console.warn("[Semi ResizableItem]: min size bigger than max size");let w=this._adapter.getItemDefaultSize(d);if(w){let C;if(typeof w=="string"){if(w.endsWith("%"))C=parseFloat(w.slice(0,-1)),this.itemPercentMap.set(d,C);else if(w.endsWith("px"))C=parseFloat(w.slice(0,-2))/s*100,this.itemPercentMap.set(d,C);else if(/^-?\d+(\.\d+)?$/.test(w)){c.set(d,parseFloat(w)),u+=parseFloat(w);continue}}else if(typeof w=="number"){c.set(d,w),u+=w;continue}l+=C,o==="horizontal"?m.style.width=`calc(${C}% - ${this.itemMinusMap.get(d)}px)`:m.style.height=`calc(${C}% - ${this.itemMinusMap.get(d)}px)`,CS&&console.warn("[Semi ResizableGroup]: item size bigger than max size")}else c.set(d,1),u+=1}let p=100-l;l>100&&(console.warn("[Semi ResizableGroup]: total Size bigger than 100%"),p=10),c.forEach((d,m)=>{const f=this._adapter.getItem(m),b=d/u*p;this.itemPercentMap.set(m,b),o==="horizontal"?f.style.width=`calc(${b}% - ${this.itemMinusMap.get(m)}px)`:f.style.height=`calc(${b}% - ${this.itemMinusMap.get(m)}px)`})},this.ensureConstraint=Lo(()=>{const{direction:t}=this.getProps(),o=this._adapter.getItemCount();let r=!0;for(let s=0;s{const{notifyResizeStart:o}=this.context;o(this.handlerIndex,t,"mouse")},this.onTouchStart=t=>{const{notifyResizeStart:o}=this.context;o(this.handlerIndex,t.targetTouches[0],"touch")},this.getHandler=()=>this.handlerRef.current,this.state={},this.handlerRef=a.createRef(),this.foundation=new Hc(this.adapter),this.handlerIndex=-1}componentDidMount(){this.foundation.init(),this.handlerIndex===-1&&(this.handlerIndex=this.context.registerHandler(this.handlerRef))}componentDidUpdate(e){}componentWillUnmount(){this.foundation.destroy()}get adapter(){return Object.assign(Object.assign({},super.adapter),{registerEvents:()=>{this.handlerRef.current.addEventListener("mousedown",this.onMouseDown),this.handlerRef.current.addEventListener("touchstart",this.onTouchStart)},unregisterEvents:()=>{this.handlerRef.current.removeEventListener("mousedown",this.onMouseDown),this.handlerRef.current.removeEventListener("touchstart",this.onTouchStart)}})}render(){const{style:e,className:t,children:o}=this.props,{direction:r}=this.context;return g.createElement("div",{className:I(t,Mr+"-handler",Mr+"-handler-"+r),style:e,ref:this.handlerRef},o??g.createElement(nl,{size:"inherit",style:{rotate:this.context.direction==="horizontal"?"0deg":"90deg"}}))}}bn.propTypes={children:h.node,direction:h.string,onResizeStart:h.func,className:h.string,disabled:h.bool,style:h.object};bn.defaultProps={};bn.contextType=yn;var Qc=function(n,e){var t={};for(var o in n)Object.prototype.hasOwnProperty.call(n,o)&&e.indexOf(o)<0&&(t[o]=n[o]);if(n!=null&&typeof Object.getOwnPropertySymbols=="function")for(var r=0,o=Object.getOwnPropertySymbols(n);r0&&arguments[0]!==void 0?arguments[0]:"mouse";t.window&&(o==="mouse"?(t.window.addEventListener("mousemove",t.foundation.onMouseMove),t.window.addEventListener("mouseup",t.foundation.onResizeEnd),t.window.addEventListener("mouseleave",t.foundation.onResizeEnd)):(t.window.addEventListener("touchmove",t.foundation.onTouchMove,{passive:!1}),t.window.addEventListener("touchend",t.foundation.onResizeEnd),t.window.addEventListener("touchcancel",t.foundation.onResizeEnd)))},this.unregisterEvent=function(){let o=arguments.length>0&&arguments[0]!==void 0?arguments[0]:"mouse";t.window&&(o==="mouse"?(t.window.removeEventListener("mousemove",t.foundation.onMouseMove),t.window.removeEventListener("mouseup",t.foundation.onResizeEnd),t.window.removeEventListener("mouseleave",t.foundation.onResizeEnd)):(t.window.removeEventListener("touchmove",t.foundation.onTouchMove,{passive:!1}),t.window.removeEventListener("touchend",t.foundation.onResizeEnd),t.window.removeEventListener("touchcancel",t.foundation.onResizeEnd)))},this.registerItem=(o,r,s,l,c,u,p)=>{if(Array.from(this.itemRefs.values()).some(m=>m===o))return-1;let d=this.itemRefs.size;return this.itemRefs.set(d,o),this.itemMinMap.set(d,r),this.itemMaxMap.set(d,s),this.itemDefaultSizeList.set(d,l),this.itemResizeStart.set(d,c),this.itemResizing.set(d,u),this.itemResizeEnd.set(d,p),d},this.registerHandler=o=>{if(Array.from(this.handlerRefs.values()).some(s=>s===o))return-1;let r=this.handlerRefs.size;return this.handlerRefs.set(r,o),r},this.getGroupSize=()=>this.groupSize,this.groupRef=a.createRef(),this.foundation=new qc(this.adapter),this.state={isResizing:!1,originalPosition:{x:0,y:0,lastItemSize:0,nextItemSize:0,lastOffset:0,nextOffset:0},backgroundStyle:{cursor:"auto"},curHandler:null,contextValue:{direction:e.direction,registerItem:this.registerItem,registerHandler:this.registerHandler,notifyResizeStart:this.foundation.onResizeStart,getGroupSize:this.getGroupSize}}}componentDidMount(){this.foundation.init(),window.addEventListener("resize",this.foundation.ensureConstraint)}componentDidUpdate(e){this.props.direction!==e.direction&&(this.setState(t=>Object.assign(Object.assign({},t),{contextValue:Object.assign(Object.assign({},t.contextValue),{direction:this.props.direction})})),this.foundation.direction=this.props.direction)}componentWillUnmount(){this.foundation.destroy(),window.removeEventListener("resize",this.foundation.ensureConstraint)}get adapter(){return Object.assign(Object.assign({},super.adapter),{getGroupRef:()=>this.groupRef.current,getItem:e=>this.itemRefs.get(e).current,getItemCount:()=>this.itemRefs.size,getHandler:e=>this.handlerRefs.get(e).current,getHandlerCount:()=>this.handlerRefs.size,getItemMin:e=>this.itemMinMap.get(e),getItemMax:e=>this.itemMaxMap.get(e),getItemChange:e=>this.itemResizing.get(e),getItemEnd:e=>this.itemResizeEnd.get(e),getItemStart:e=>this.itemResizeStart.get(e),getItemDefaultSize:e=>this.itemDefaultSizeList.get(e),registerEvents:this.registerEvent,unregisterEvents:this.unregisterEvent})}get window(){var e;return(e=this.groupRef.current.ownerDocument.defaultView)!==null&&e!==void 0?e:null}render(){const e=this.props,{children:t,direction:o,className:r}=e,s=Qc(e,["children","direction","className"]);return g.createElement(yn.Provider,{value:this.state.contextValue},g.createElement("div",Object.assign({style:{flexDirection:o==="vertical"?"column":"row"},ref:this.groupRef,className:I(r,Lr+"-group")},s),this.state.isResizing&&g.createElement("div",{style:this.state.backgroundStyle,className:I(r,Lr+"-background")}),t))}}vn.propTypes={};vn.defaultProps={direction:"horizontal"};vn.contextType=yn;var Yc=Object.defineProperty,Ir=Object.getOwnPropertySymbols,Xc=Object.prototype.hasOwnProperty,Jc=Object.prototype.propertyIsEnumerable,Tr=(n,e,t)=>e in n?Yc(n,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):n[e]=t,ed=(n,e)=>{for(var t in e||(e={}))Xc.call(e,t)&&Tr(n,t,e[t]);if(Ir)for(var t of Ir(e))Jc.call(e,t)&&Tr(n,t,e[t]);return n};function td(n){return a.createElement("svg",ed({width:200,height:200,viewBox:"0 0 200 200",fill:"none",xmlns:"http://www.w3.org/2000/svg",focusable:!1,"aria-hidden":!0},n),a.createElement("path",{d:"M74.7 78.6c20.78-6.32 57.55-12.26 71.81-9.86 4.21.7 8.12 1.98 11.36 3.42-.51-1.69-.95-3.5-1.38-5.3l-.04-.18c-1.03-4.27-2.05-8.44-3.95-10.55-4.8-5.32.67-10.12.67-10.12l.93-10.53c13.02 4.82 21.65 14.92 27 25.08 4.57 8.67 6.75 17.37 7.25 22.89 1.06 12-8.18 18.86-19.2 18.86-9.74 0-18.36-1.64-24.81-3.1.64 2.18 5.44 19.18 7.53 32.66l-46.15.58-7.58-14.68-4.66-12.26c-19.46 7.46-50.77 19.02-64.9 18.44-10.35-.42-15.68-15.68-17.44-28.7a71.55 71.55 0 0 1-.67-9.4c0-5.64.3-12.18 2.22-17.89.74-2.21 1.73-4.3 3.04-6.17a18.1 18.1 0 0 1 4.6-4.59c0 4-1.02 13.54 2.8 14.12 5.06.78 10.4-9.08 13.85-7.06 3.87 2.27-1.65 16.34-1.33 17.2.27.7.53 1.4.76 2.07a48.99 48.99 0 0 1 2.25 8.55C46.59 87.56 60 83.06 74.69 78.6Z",fill:"#C6CACD"}),a.createElement("path",{d:"M181.1 60.56c4.57 8.67 6.75 17.37 7.25 22.89 1.06 12-8.18 18.86-19.2 18.86-9.74 0-18.36-1.64-24.81-3.1m36.77-38.65c-5.36-10.16-13.99-20.26-27-25.08l-.94 10.53s-5.46 4.8-.67 10.12c1.9 2.11 2.92 6.28 3.95 10.55m24.66-6.12c-6-.37-18.32.8-24.66 6.12m0 0c1.57 6.53 3.15 13.3 7.91 13.3 7.2 0-3.6-8.84-17.85-11.24-14.25-2.4-51.03 3.54-71.82 9.86-20.78 6.32-39.04 12.71-42.77 19.1-3.63 6.23 13.24 10.92 4.49-14.17m0 0c-.23-.67-.49-1.36-.76-2.08-.32-.85 5.2-14.92 1.33-17.19-3.45-2.02-8.8 7.84-13.85 7.06-3.82-.58-2.8-10.12-2.8-14.12a18.1 18.1 0 0 0-4.6 4.6M36.4 83.52c-7.27 1.58-21.92 8.1-25.27 11.73m0 0a71.55 71.55 0 0 1-.67-9.41c0-5.64.3-12.18 2.22-17.89m-1.55 27.3c1.76 13 7.09 28.27 17.45 28.7 14.12.57 45.43-10.99 64.89-18.45l4.66 12.26 7.58 14.68 46.15-.58c-2.09-13.48-6.89-30.48-7.53-32.67M15.73 61.8c-.98 3-1.08 5.5.19 7.8m-.2-7.8a24.08 24.08 0 0 0-3.03 6.16m0 0a5.43 5.43 0 0 0 1.25 4.22m130.4 27.02c-.9-3.08-3.12-9.95-4.76-12.76",stroke:"#1C1F23"}),a.createElement("path",{fillRule:"evenodd",clipRule:"evenodd",d:"m156.89 15.66-2.04 27.96 2.57 28.1c-7.51-3.07-13.32-4.34-27.25-3.36-11.94.83-31.75 3.95-46.23 7.62-16.66 4.27-37.81 11.64-45.21 15.9-.77-4.64-2.92-10.15-2.92-10.15-.07-.7 2.63-8.32 2.73-13.06.08-3.08-.91-4.45-2.33-4.75a3.47 3.47 0 0 0-2.05.35c-.63.32-.86.48-1.38.84-1.34.98-2.38 2.02-3.95 3.34a17.14 17.14 0 0 1-3.04 2.17 4.6 4.6 0 0 1-2.89.63c-.63-.1-1.21-.47-1.71-1.58l-.07-.89c-.5-5.79-2.7-20.12-2.7-34.91 0-7.74 1.61-10.04 2.7-11.59l.13-.18c3.85-5.53 13.67-6.75 23.12-6.96 2.5-.14 5.2-.2 8.1-.17l.11.15H53.15l-.52.07 18.32 25.49-3.62 14.08 10.2 15.98-2.84-16.49 10-11.99-3.5-27.7s8.78-.5 19.47-1.77c10.69-1.28 18.47-1.9 29.42-1.83 1.64.01 3.4.1 5.23.22 9.64.65 18.55 2.56 21.46 4.4l.13.09h-.01Z",fill:"var(--semi-color-primary)",fillOpacity:.2}),a.createElement("path",{d:"M143 27.91a1.38 1.38 0 0 1 1.77-.85c.5.17.98.41 1.44.71a1.38 1.38 0 0 1-1.53 2.31c-.26-.17-.53-.3-.82-.4a1.38 1.38 0 0 1-.85-1.77Z",fill:"var(--semi-color-primary)"}),a.createElement("path",{d:"M140.65 28.12c.21.74-.21 1.5-.95 1.71-.36.1-.73.23-1.11.37a1.38 1.38 0 1 1-.95-2.6c.43-.16.87-.3 1.3-.43.74-.2 1.5.22 1.71.95Z",fill:"var(--semi-color-primary)"}),a.createElement("path",{d:"M134.74 30.4c.37.67.14 1.51-.53 1.89l-1.07.62a1.38 1.38 0 1 1-1.41-2.38l1.12-.65a1.38 1.38 0 0 1 1.89.52Z",fill:"var(--semi-color-primary)"}),a.createElement("path",{d:"M97.86 31.43h.76a1.38 1.38 0 1 1-.06 2.77h-.52a6.7 6.7 0 0 0-.57.1 1.38 1.38 0 1 1-.64-2.68c.33-.08.64-.14.94-.18l.09-.01Z",fill:"var(--semi-color-primary)"}),a.createElement("path",{d:"M147.78 31.75c.73-.23 1.5.19 1.72.92.13.42.25.88.35 1.35a1.38 1.38 0 0 1-2.7.58c-.1-.4-.19-.78-.3-1.13-.22-.73.2-1.5.93-1.72Z",fill:"var(--semi-color-primary)"}),a.createElement("path",{d:"M102.27 33.13c.19-.75.94-1.2 1.68-1.01.45.11.89.23 1.3.37a1.38 1.38 0 0 1-.84 2.63c-.36-.11-.73-.22-1.13-.32a1.38 1.38 0 0 1-1-1.67Z",fill:"var(--semi-color-primary)"}),a.createElement("path",{d:"M129.3 33.68c.42.64.25 1.5-.4 1.92l-.52.34-.53.36a1.38 1.38 0 0 1-1.53-2.31l.32-.21.21-.14.3-.2.23-.15c.64-.42 1.5-.25 1.92.39Z",fill:"var(--semi-color-primary)"}),a.createElement("path",{d:"M108.25 35.22c.36-.67 1.2-.92 1.88-.55a246.5 246.5 0 0 1 1.11.61 1.38 1.38 0 0 1-1.33 2.43l-.5-.28h-.01l-.6-.34a1.38 1.38 0 0 1-.55-1.87Z",fill:"var(--semi-color-primary)"}),a.createElement("path",{d:"M92.83 35.77c.76-.01 1.4.6 1.4 1.36.01.16.03.34.07.54a1.38 1.38 0 1 1-2.7.58 5.62 5.62 0 0 1-.13-1.07c-.01-.76.6-1.4 1.36-1.4Z",fill:"var(--semi-color-primary)"}),a.createElement("path",{d:"M124 37.2c.31.7 0 1.51-.7 1.82a6.07 6.07 0 0 1-1.44.45 1.38 1.38 0 1 1-.67-2.68l.58-.16c.1-.03.24-.07.42-.15.7-.3 1.51.02 1.82.72Z",fill:"var(--semi-color-primary)"}),a.createElement("path",{d:"M113.9 38.14c.15-.75.89-1.22 1.63-1.07.35.08.72.14 1.1.17a1.38 1.38 0 0 1-.26 2.76c-.49-.05-.96-.12-1.41-.22a1.38 1.38 0 0 1-1.07-1.64Z",fill:"var(--semi-color-primary)"}),a.createElement("path",{d:"M148.98 37.95c.76-.01 1.4.6 1.4 1.36a38.45 38.45 0 0 1 0 1.42 1.38 1.38 0 0 1-2.77-.08 24.28 24.28 0 0 0 0-1.3c0-.76.6-1.39 1.37-1.4Z",fill:"var(--semi-color-primary)"}),a.createElement("path",{d:"M148.6 44.88c.75.16 1.22.9 1.06 1.65-.1.47-.22.94-.34 1.41a1.38 1.38 0 1 1-2.68-.7c.12-.43.22-.87.31-1.3.17-.75.9-1.22 1.65-1.06Z",fill:"var(--semi-color-primary)"}),a.createElement("path",{d:"M146.69 51.6c.7.31 1 1.13.7 1.83-.2.44-.41.88-.63 1.31a1.38 1.38 0 0 1-2.48-1.24c.2-.4.4-.8.58-1.2.31-.7 1.13-1.01 1.83-.7Z",fill:"var(--semi-color-primary)"}),a.createElement("path",{d:"M41.67 55.45c.07.76-.5 1.44-1.25 1.5-.43.04-.86.1-1.26.19a1.38 1.38 0 0 1-.54-2.72c.5-.1 1.02-.17 1.55-.22.76-.07 1.43.5 1.5 1.25Z",fill:"var(--semi-color-primary)"}),a.createElement("path",{d:"M44.58 55.78c.22-.73 1-1.15 1.72-.93l.74.23a1.38 1.38 0 1 1-.9 2.62l-.62-.2a1.38 1.38 0 0 1-.94-1.72Z",fill:"var(--semi-color-primary)"}),a.createElement("path",{d:"M91.9 56.9c.05.76-.52 1.41-1.29 1.46-.44.03-.89.07-1.32.12a1.38 1.38 0 0 1-.31-2.75c.48-.05.96-.1 1.45-.13.77-.05 1.42.53 1.47 1.3Z",fill:"var(--semi-color-primary)"}),a.createElement("path",{d:"M94.72 56.95c.07-.76.74-1.33 1.5-1.26l1.43.14a1.38 1.38 0 1 1-.32 2.75c-.45-.05-.9-.1-1.35-.13a1.38 1.38 0 0 1-1.26-1.5Z",fill:"var(--semi-color-primary)"}),a.createElement("path",{d:"M101.64 57.83c.16-.75.9-1.22 1.64-1.07l1.39.3a1.38 1.38 0 1 1-.62 2.7l-1.34-.29a1.38 1.38 0 0 1-1.07-1.64Z",fill:"var(--semi-color-primary)"}),a.createElement("path",{d:"M34.85 57.26c.48.6.39 1.46-.2 1.94-.33.27-.63.55-.9.84a1.38 1.38 0 0 1-2.03-1.89c.36-.39.76-.76 1.18-1.1.6-.48 1.46-.39 1.95.2Z",fill:"var(--semi-color-primary)"}),a.createElement("path",{d:"M85 57.9c.29.71-.06 1.51-.78 1.8a15.8 15.8 0 0 0-1.26.54 1.38 1.38 0 1 1-1.15-2.52 74.1 74.1 0 0 1 1.4-.6c.71-.28 1.52.07 1.8.78Z",fill:"var(--semi-color-primary)"}),a.createElement("path",{d:"M143.4 57.76c.61.47.72 1.34.26 1.94-.3.4-.62.78-.94 1.15a1.38 1.38 0 0 1-2.09-1.81 24 24 0 0 0 .84-1.03c.47-.6 1.33-.71 1.94-.25Z",fill:"var(--semi-color-primary)"}),a.createElement("path",{d:"M108.43 59.46c.22-.74.99-1.15 1.72-.93l1.35.4a1.38 1.38 0 1 1-.82 2.65l-1.32-.4a1.38 1.38 0 0 1-.93-1.72Z",fill:"var(--semi-color-primary)"}),a.createElement("path",{d:"M115.08 61.58a1.38 1.38 0 0 1 1.77-.83l1.32.5a1.38 1.38 0 0 1-.97 2.58l-1.3-.48a1.38 1.38 0 0 1-.82-1.77Z",fill:"var(--semi-color-primary)"}),a.createElement("path",{d:"M138.67 62.89c.42.64.25 1.5-.4 1.92-.41.27-.85.54-1.29.78a1.38 1.38 0 0 1-1.32-2.43c.37-.2.73-.43 1.1-.66.63-.42 1.49-.25 1.91.39Z",fill:"var(--semi-color-primary)"}),a.createElement("path",{d:"M30.5 62.78c.77.07 1.33.74 1.26 1.5l-.03.59.01.75-1.6 1.4a1.38 1.38 0 0 1-1.16-1.32l-.02-.83c0-.28.02-.56.04-.84.07-.76.75-1.32 1.5-1.25Z",fill:"var(--semi-color-primary)"}),a.createElement("path",{d:"M121.6 64.07c.3-.7 1.1-1.04 1.8-.75a135.68 135.68 0 0 1 1.26.52 1.38 1.38 0 1 1-.97 2.59 19.62 19.62 0 0 1-1.35-.55c-.7-.3-1.04-1.1-.74-1.81Z",fill:"var(--semi-color-primary)"}),a.createElement("path",{d:"M72.11 64.94c.48.6.4 1.47-.2 1.95-.38.3-.74.61-1.09.92A1.38 1.38 0 1 1 69 65.73c.37-.33.76-.66 1.17-.99.59-.48 1.46-.4 1.94.2Z",fill:"var(--semi-color-primary)"}),a.createElement("path",{d:"M132.4 65.92c.09.76-.46 1.44-1.22 1.53-.5.05-1.02.08-1.53.09a1.38 1.38 0 1 1-.02-2.77c.42 0 .84-.03 1.25-.07.76-.09 1.44.46 1.53 1.22Z",fill:"var(--semi-color-primary)"}),a.createElement("path",{d:"M66.66 69.9c.57.52.6 1.4.09 1.96l-.73.8-.02.02-.16.18-.08.09a1.38 1.38 0 0 1-2.05-1.86l.25-.28.75-.82c.51-.56 1.39-.6 1.95-.09Z",fill:"var(--semi-color-primary)"}),a.createElement("path",{d:"M61.6 75.28c.45.61.31 1.48-.3 1.93-.44.31-.88.61-1.36.89a1.38 1.38 0 1 1-1.4-2.4c.4-.22.77-.46 1.12-.73a1.38 1.38 0 0 1 1.94.3Z",fill:"var(--semi-color-primary)"}),a.createElement("path",{d:"M37.67 75.97c.42.19.86.36 1.35.53a1.38 1.38 0 0 1-.89 2.62c-.56-.19-1.1-.4-1.6-.63l.72-2.63c.14.01.28.05.42.11Z",fill:"var(--semi-color-primary)"}),a.createElement("path",{d:"M55.05 78.57c.12.75-.4 1.46-1.15 1.58-.5.08-1 .15-1.54.2a1.38 1.38 0 0 1-.28-2.75c.49-.05.95-.11 1.39-.18.75-.12 1.46.4 1.58 1.15Z",fill:"var(--semi-color-primary)"}),a.createElement("path",{d:"M43.4 78.87c.06-.76.73-1.33 1.49-1.27a38.43 38.43 0 0 0 1.5.1 1.38 1.38 0 1 1-.12 2.76 62.94 62.94 0 0 1-1.6-.1 1.38 1.38 0 0 1-1.27-1.5Z",fill:"var(--semi-color-primary)"}),a.createElement("g",{clipPath:"url(#clip_failure_dark_46_27)"},a.createElement("path",{fillRule:"evenodd",clipRule:"evenodd",d:"M30.9 46.87a13.45 13.45 0 0 1 9.37-16.53 13.45 13.45 0 0 1 16.52 9.39c2.64 9.56-4.77 29.27-5.14 29.9a.75.75 0 0 1-.99.27c-.64-.34-17.11-13.47-19.76-23.03Zm14.36 1.54a6.1 6.1 0 0 1-3.25-11.75 6.1 6.1 0 0 1 3.25 11.75Z",fill:"var(--semi-color-primary)"})),a.createElement("path",{d:"M102.31 100.69c-2.8 1.55-5.63 2.85-9.36 4.58l1.48 3.92c2.14-.96 6.16-6.03 7.88-8.5Z",fill:"#1C1F23"}),a.createElement("path",{fillRule:"evenodd",clipRule:"evenodd",d:"M121 63.04c8.85 2.1 12.43-6.5 13.12-8.77.68-2.27-5.6-11.86-8-11.2-.13.05-.3.09-.47.13l-.18.05-1.37.37c-3.64 1.03-9.93 3.2-10.98 7.63-1.3 5.46 2.4 10.49 7.88 11.79Z",fill:"#1C1F23"}),a.createElement("path",{d:"M134.5 64.73c-.43.47-1.2.74-2.33.73a12.7 12.7 0 0 1-4.06-.86 31.25 31.25 0 0 1-9.94-6.22c-3.25-2.97-5.97-5.8-7.59-8.42-1.61-2.61-2.05-4.89-.98-6.84a3.7 3.7 0 0 1 2.11-1.86 4.53 4.53 0 0 1 2.9.15c2.16.76 4.57 2.83 6.48 6.01 3.4 5.64 6.89 8.24 9.7 10.33.49.36.95.7 1.38 1.04a7.3 7.3 0 0 1 2.61 3.48c.34 1.1.16 1.97-.28 2.46Z",fill:"#C6CACD",stroke:"#1C1F23"}),a.createElement("mask",{id:"mask_failure_dark_130_527","mask-type":"alpha",maskUnits:"userSpaceOnUse",x:101,y:47,width:30,height:22},a.createElement("path",{d:"M130.53 62.1c-.5-3.3-9.52-14.75-16.08-15.03l-12.68 4.52 6.47 14.16 17.25 3.07c1.84-1.14 5.43-4.07 5.04-6.72Z",fill:"#C4C4C4"})),a.createElement("g",{mask:"url(#mask_failure_dark_130_527)"},a.createElement("path",{d:"M127.2 63.62a9.74 9.74 0 0 1-13.76.5 9.74 9.74 0 0 1-.32-13.78 9.74 9.74 0 0 1 13.77-.49 9.74 9.74 0 0 1 .32 13.77Z",fill:"#C6CACD",stroke:"#1C1F23"}),a.createElement("path",{fillRule:"evenodd",clipRule:"evenodd",d:"m116.79 47.35-.02.37c2.86.5 8.57 2.59 8.58 6.87 0 5.36-7.44 9.34-14.47 3.46-.34-.28-.66-.53-.95-.74a10.09 10.09 0 0 0 3.17 7.17 10.24 10.24 0 0 0 14.47-.52 10.24 10.24 0 0 0-.34-14.47 10.16 10.16 0 0 0-10.44-2.14Z",fill:"#1C1F23"}),a.createElement("path",{d:"M119.34 55a.79.79 0 1 0-1.1-1.12.79.79 0 0 0 1.1 1.12Z",fill:"#1C1F23"}),a.createElement("path",{fillRule:"evenodd",clipRule:"evenodd",d:"M119.98 50.72c.21-.09.45.01.54.22a7.86 7.86 0 0 0 1.84 2.65.41.41 0 0 1-.55.62 8.67 8.67 0 0 1-2.05-2.95.41.41 0 0 1 .22-.54Z",fill:"#1C1F23"}),a.createElement("path",{d:"M114.85 52.4a.79.79 0 1 0-1.1-1.11.79.79 0 0 0 1.1 1.12Z",fill:"#1C1F23"}),a.createElement("mask",{id:"path-15-inside-1",fill:"white"},a.createElement("ellipse",{rx:2.97818,ry:2.97818,transform:"matrix(0.727696 0.6859 -0.685903 0.727693 128.435 60.0508)"})),a.createElement("ellipse",{rx:2.97818,ry:2.97818,transform:"matrix(0.727696 0.6859 -0.685903 0.727693 128.435 60.0508)",fill:"#C6CACD"}),a.createElement("path",{d:"m128.42 60.04.01-.01a.03.03 0 0 1 .02 0l-4.12 4.37a5.98 5.98 0 0 0 8.45-.25l-4.36-4.11Zm.03 0v.02l-4.37-4.11a5.98 5.98 0 0 0 .25 8.45l4.12-4.37Zm0 .03h-.03l4.12-4.37a5.98 5.98 0 0 0-8.46.25l4.37 4.12Zm-.03 0v-.03l4.37 4.11a5.98 5.98 0 0 0-.25-8.45l-4.12 4.37Z",fill:"#1C1F23",mask:"url(#path-15-inside-1)"})),a.createElement("path",{d:"M145.63 40.19c1.37-2.75 12.75 2.35 16.14 6.78 3.38 4.43 1.48 10.74-1.9 9.68-6.69-2.12-7.56-6.7-7.94-9.48-1.2-1.85-7.67-4.24-6.3-6.98Z",fill:"#C6CACD",stroke:"#1C1F23"}),a.createElement("path",{d:"m158.95 41.56 6.64 2.52 1.66 12.47-8.3 1.98-3.47-12.03 3.47-4.94Z",fill:"#C6CACD"}),a.createElement("path",{d:"M167.3 151.94c5.19 1.66 23.35 35.57 19.05 35.57-13.86 0-34.5.53-71.42.53-15.63 0-17.9-5.16-11.79-22.08a353.23 353.23 0 0 1 6.14-15.76l32.5 1.26c-.43 1.53-.91 3.07-1.38 4.4a26.82 26.82 0 0 1 8.73-1.47c5.27 0 7.04 1.4 11.77 0 2.13-.62 4.8-2.97 6.4-2.45Z",fill:"#C6CACD"}),a.createElement("path",{d:"M140.4 155.87c.47-1.34.95-2.88 1.38-4.4l-32.5-1.27a353.23 353.23 0 0 0-6.14 15.76c-6.1 16.92-3.84 22.08 11.79 22.08 36.93 0 57.56-.53 71.42-.53 4.3 0-13.86-33.91-19.06-35.57-1.6-.52-4.26 1.83-6.4 2.45-4.72 1.4-6.5 0-11.76 0-3.08 0-6.06.55-8.72 1.48Zm0 0a26.67 26.67 0 0 1-4.44 8.38c-1.7 2.22-3.99 4.43-5.43 4.33-1.44-.1-1.42-3.18 0-5.66 1.97-3.44 6.45-5.87 9.88-7.05Z",stroke:"#1C1F23"}),a.createElement("path",{d:"M149.25 131.7s3.36 19.46-12.34 21.04c-11.53 1.15-40.77-4.55-53.76-7.79 4.72 12.82 9.61 39.86 7 42.16-3.33 2.93-47.55 1.76-55.96 0-8.42-1.75 13.82-11.46 15.45-14.66 2.99-5.84-5.48-21.18-5.75-45.45-.27-24.27 18.18-24.86 34.47-21.64 13.02 2.57 41.63 18.33 52.56 26.86l18.33-.52Z",fill:"#C6CACD",stroke:"#1C1F23"}),a.createElement("path",{d:"M141.5 153.87c-3.11 2.55-27.72 5-35.58 3.53l2.75-6.8c20.23 2.85 28.08 3.34 33.46 1.16l-.63 2.11Z",fill:"#1C1F23"}),a.createElement("path",{d:"M126.02 142.7c-3.1-2.99-5-7.5-4.16-12.35",stroke:"#1C1F23"}),a.createElement("path",{fillRule:"evenodd",clipRule:"evenodd",d:"M130.6 95.65c-9.03-10.98-18.97-19.74-25.5-24.56l1.63-2.22c6.7 4.95 16.81 13.86 26 25.02 9.18 11.16 17.54 24.67 20.59 38.83l-2.7.59c-2.91-13.56-10.97-26.67-20.02-37.66Z",fill:"#1C1F23"}),a.createElement("path",{d:"m149.12 107.09-16.36 13.2 22.27 17.8 8.87-19.19c-.14-3.93-2.34-5.34-5.83-4.66l-3.12-2.5c.08-3.5-2.18-5.64-5.83-4.65Z",fill:"#6B7075"}),a.createElement("path",{d:"m148.24 128.62 9.45-14.34-2.91-2.33-10.94 13.07 4.4 3.6Z",stroke:"#1C1F23"}),a.createElement("path",{fillRule:"evenodd",clipRule:"evenodd",d:"M143.67 127.98a6.93 6.93 0 1 1-10.82-8.66 6.93 6.93 0 0 1 10.82 8.66Zm12.28 9.82a6.93 6.93 0 1 1-10.82-8.65 6.93 6.93 0 0 1 10.82 8.65Z",fill:"#1C1F23"}),a.createElement("path",{fillRule:"evenodd",clipRule:"evenodd",d:"m133.43 123.46 9.21-1.8.32 1.61-9.2 1.81-.33-1.62Z",fill:"#C6CACD"}),a.createElement("path",{fillRule:"evenodd",clipRule:"evenodd",d:"m145.5 133.11 9.21-1.8.32 1.62-9.2 1.8-.33-1.62Z",fill:"#C6CACD"}),a.createElement("defs",null,a.createElement("clipPath",{id:"clip_failure_dark_46_27"},a.createElement("rect",{width:44.4004,height:44.4627,fill:"white",transform:"matrix(0.963965 -0.266028 0.266198 0.963918 18.4214 34.6221)"}))))}var nd=td,od=Object.defineProperty,Rr=Object.getOwnPropertySymbols,rd=Object.prototype.hasOwnProperty,sd=Object.prototype.propertyIsEnumerable,Nr=(n,e,t)=>e in n?od(n,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):n[e]=t,id=(n,e)=>{for(var t in e||(e={}))rd.call(e,t)&&Nr(n,t,e[t]);if(Rr)for(var t of Rr(e))sd.call(e,t)&&Nr(n,t,e[t]);return n};function ad(n){return a.createElement("svg",id({width:200,height:200,viewBox:"0 0 200 200",fill:"none",xmlns:"http://www.w3.org/2000/svg",focusable:!1,"aria-hidden":!0},n),a.createElement("rect",{width:200,height:200,fill:"transparent"}),a.createElement("path",{d:"M74.7 78.6c20.78-6.32 57.55-12.26 71.81-9.86 4.21.7 8.12 1.98 11.36 3.42-.51-1.69-.95-3.5-1.38-5.3l-.04-.18c-1.03-4.27-2.05-8.44-3.95-10.55-4.8-5.32.67-10.12.67-10.12l.93-10.53c13.02 4.82 21.65 14.92 27 25.08 4.57 8.67 6.75 17.37 7.25 22.89 1.06 12-8.18 18.86-19.2 18.86-9.74 0-18.36-1.64-24.81-3.1.64 2.18 5.44 19.18 7.53 32.66l-46.15.58-7.58-14.68-4.66-12.26c-19.46 7.46-50.77 19.02-64.9 18.44-10.35-.42-15.68-15.68-17.44-28.7a71.55 71.55 0 0 1-.67-9.4c0-5.64.3-12.18 2.22-17.89.74-2.21 1.73-4.3 3.04-6.17a18.1 18.1 0 0 1 4.6-4.59c0 4-1.02 13.54 2.8 14.12 5.06.78 10.4-9.08 13.85-7.06 3.87 2.27-1.65 16.34-1.33 17.2.27.7.53 1.4.76 2.07a48.99 48.99 0 0 1 2.25 8.55C46.59 87.56 60 83.06 74.69 78.6Z",fill:"white"}),a.createElement("path",{d:"M181.1 60.56c4.57 8.67 6.75 17.37 7.25 22.89 1.06 12-8.18 18.86-19.2 18.86-9.74 0-18.36-1.64-24.81-3.1m36.77-38.65c-5.36-10.16-13.99-20.26-27-25.08l-.94 10.53s-5.46 4.8-.67 10.12c1.9 2.11 2.92 6.28 3.95 10.55m24.66-6.12c-6-.37-18.32.8-24.66 6.12m0 0c1.57 6.53 3.15 13.3 7.91 13.3 7.2 0-3.6-8.84-17.85-11.24-14.25-2.4-51.03 3.54-71.82 9.86-20.78 6.32-39.04 12.71-42.77 19.1-3.63 6.23 13.24 10.92 4.49-14.17m0 0c-.23-.67-.49-1.36-.76-2.08-.32-.85 5.2-14.92 1.33-17.19-3.45-2.02-8.8 7.84-13.85 7.06-3.82-.58-2.8-10.12-2.8-14.12a18.1 18.1 0 0 0-4.6 4.6M36.4 83.52c-7.27 1.58-21.92 8.1-25.27 11.73m0 0a71.55 71.55 0 0 1-.67-9.41c0-5.64.3-12.18 2.22-17.89m-1.55 27.3c1.76 13 7.09 28.27 17.45 28.7 14.12.57 45.43-10.99 64.89-18.45l4.66 12.26 7.58 14.68 46.15-.58c-2.09-13.48-6.89-30.48-7.53-32.67M15.73 61.8c-.98 3-1.08 5.5.19 7.8m-.2-7.8a24.08 24.08 0 0 0-3.03 6.16m0 0a5.43 5.43 0 0 0 1.25 4.22m130.4 27.02c-.9-3.08-3.12-9.95-4.76-12.76",stroke:"#515151"}),a.createElement("path",{fillRule:"evenodd",clipRule:"evenodd",d:"m156.89 15.66-2.04 27.96 2.57 28.1c-7.51-3.07-13.32-4.34-27.25-3.36-11.94.83-31.75 3.95-46.23 7.62-16.66 4.27-37.81 11.64-45.21 15.9-.77-4.64-2.92-10.15-2.92-10.15-.07-.7 2.63-8.32 2.73-13.06.08-3.08-.91-4.45-2.33-4.75a3.47 3.47 0 0 0-2.05.35c-.63.32-.86.48-1.38.84-1.34.98-2.38 2.02-3.95 3.34a17.14 17.14 0 0 1-3.04 2.17 4.6 4.6 0 0 1-2.89.63c-.63-.1-1.21-.47-1.71-1.58l-.07-.89c-.5-5.79-2.7-20.12-2.7-34.91 0-7.74 1.61-10.04 2.7-11.59l.13-.18c3.85-5.53 13.67-6.75 23.12-6.96 2.5-.14 5.2-.2 8.1-.17l.11.15H53.15l-.52.07 18.32 25.49-3.62 14.08 10.2 15.98-2.84-16.49 10-11.99-3.5-27.7s8.78-.5 19.47-1.77c10.69-1.28 18.47-1.9 29.42-1.83 1.64.01 3.4.1 5.23.22 9.64.65 18.55 2.56 21.46 4.4l.13.09h-.01Z",fill:"var(--semi-color-primary-light-default)"}),a.createElement("path",{d:"M143 27.91a1.38 1.38 0 0 1 1.77-.85c.5.18.98.41 1.44.71a1.38 1.38 0 0 1-1.53 2.31c-.26-.17-.53-.3-.82-.4a1.38 1.38 0 0 1-.85-1.77Z",fill:"var(--semi-color-primary)"}),a.createElement("path",{d:"M140.65 28.12c.21.74-.21 1.5-.95 1.72-.36.1-.73.22-1.11.36a1.38 1.38 0 1 1-.95-2.6c.43-.16.87-.3 1.3-.43.74-.2 1.5.22 1.71.95Z",fill:"var(--semi-color-primary)"}),a.createElement("path",{d:"M134.74 30.4c.37.67.14 1.51-.53 1.89l-1.07.62a1.38 1.38 0 1 1-1.41-2.38l1.12-.65a1.38 1.38 0 0 1 1.89.52Z",fill:"var(--semi-color-primary)"}),a.createElement("path",{d:"M97.86 31.43h.76a1.38 1.38 0 1 1-.06 2.77h-.52a6.7 6.7 0 0 0-.57.1 1.38 1.38 0 0 1-.64-2.68c.33-.08.64-.14.94-.18l.09-.01Z",fill:"var(--semi-color-primary)"}),a.createElement("path",{d:"M147.78 31.75c.73-.23 1.5.19 1.72.92.13.43.25.88.35 1.35a1.38 1.38 0 0 1-2.7.58c-.1-.4-.19-.78-.3-1.13-.22-.73.2-1.5.93-1.72Z",fill:"var(--semi-color-primary)"}),a.createElement("path",{d:"M102.27 33.13c.19-.75.94-1.2 1.68-1.01.45.11.89.23 1.3.37a1.38 1.38 0 0 1-.84 2.63c-.36-.11-.73-.22-1.13-.32a1.38 1.38 0 0 1-1-1.67Z",fill:"var(--semi-color-primary)"}),a.createElement("path",{d:"M129.3 33.68c.42.64.25 1.5-.4 1.92l-.52.34-.53.36a1.38 1.38 0 0 1-1.53-2.31l.32-.21.21-.14.3-.2.23-.15c.64-.42 1.5-.25 1.92.39Z",fill:"var(--semi-color-primary)"}),a.createElement("path",{d:"M108.25 35.22c.36-.67 1.2-.92 1.88-.55a246.5 246.5 0 0 1 1.11.61 1.38 1.38 0 0 1-1.33 2.43l-.5-.28h-.01l-.6-.34a1.38 1.38 0 0 1-.55-1.87Z",fill:"var(--semi-color-primary)"}),a.createElement("path",{d:"M92.83 35.77c.76-.01 1.4.6 1.4 1.36.01.16.03.34.07.55a1.38 1.38 0 1 1-2.7.58 5.62 5.62 0 0 1-.13-1.08c-.01-.76.6-1.4 1.36-1.4Z",fill:"var(--semi-color-primary)"}),a.createElement("path",{d:"M124 37.2c.31.7 0 1.51-.7 1.82a6.07 6.07 0 0 1-1.44.45 1.38 1.38 0 1 1-.67-2.68l.58-.16c.1-.03.24-.07.42-.15.7-.3 1.51.02 1.82.72Z",fill:"var(--semi-color-primary)"}),a.createElement("path",{d:"M113.9 38.14c.15-.75.89-1.22 1.63-1.06.35.07.72.13 1.1.16a1.38 1.38 0 0 1-.26 2.76c-.49-.05-.96-.12-1.41-.22a1.38 1.38 0 0 1-1.07-1.64Z",fill:"var(--semi-color-primary)"}),a.createElement("path",{d:"M148.98 37.95c.76-.01 1.4.6 1.4 1.36a38.45 38.45 0 0 1 0 1.42 1.38 1.38 0 0 1-2.77-.08 24.28 24.28 0 0 0 0-1.3c0-.76.6-1.39 1.37-1.4Z",fill:"var(--semi-color-primary)"}),a.createElement("path",{d:"M148.6 44.88c.75.16 1.22.9 1.06 1.65-.1.47-.22.94-.34 1.41a1.38 1.38 0 1 1-2.68-.7c.12-.43.22-.87.31-1.3.17-.75.9-1.22 1.65-1.06Z",fill:"var(--semi-color-primary)"}),a.createElement("path",{d:"M146.69 51.6c.7.31 1 1.13.7 1.83-.2.44-.41.88-.63 1.31a1.38 1.38 0 0 1-2.48-1.24c.2-.4.4-.8.58-1.2.31-.7 1.13-1.01 1.83-.7Z",fill:"var(--semi-color-primary)"}),a.createElement("path",{d:"M41.67 55.45c.07.77-.5 1.44-1.25 1.5-.43.04-.86.1-1.26.19a1.38 1.38 0 1 1-.54-2.72c.5-.1 1.02-.17 1.55-.22.76-.07 1.43.5 1.5 1.25Z",fill:"var(--semi-color-primary)"}),a.createElement("path",{d:"M44.58 55.78c.22-.73 1-1.15 1.72-.93l.74.23a1.38 1.38 0 1 1-.9 2.62l-.62-.2a1.38 1.38 0 0 1-.94-1.72Z",fill:"var(--semi-color-primary)"}),a.createElement("path",{d:"M91.9 56.9c.05.76-.52 1.42-1.29 1.47-.44.02-.89.06-1.32.11a1.38 1.38 0 0 1-.31-2.75c.48-.05.96-.1 1.45-.13.77-.05 1.42.53 1.47 1.3Z",fill:"var(--semi-color-primary)"}),a.createElement("path",{d:"M94.72 56.95c.07-.76.74-1.33 1.5-1.26l1.43.14a1.38 1.38 0 0 1-.32 2.75c-.45-.05-.9-.1-1.35-.13a1.38 1.38 0 0 1-1.26-1.5Z",fill:"var(--semi-color-primary)"}),a.createElement("path",{d:"M101.64 57.83c.16-.75.9-1.22 1.64-1.07l1.39.31a1.38 1.38 0 1 1-.62 2.7l-1.34-.3a1.38 1.38 0 0 1-1.07-1.64Z",fill:"var(--semi-color-primary)"}),a.createElement("path",{d:"M34.85 57.26c.48.6.39 1.46-.2 1.94-.33.27-.63.55-.9.84a1.38 1.38 0 0 1-2.03-1.89c.36-.39.76-.75 1.18-1.1.6-.48 1.46-.39 1.95.2Z",fill:"var(--semi-color-primary)"}),a.createElement("path",{d:"M85 57.9c.29.71-.06 1.51-.78 1.8a15.8 15.8 0 0 0-1.26.54 1.38 1.38 0 1 1-1.15-2.52 71.64 71.64 0 0 1 1.4-.6c.71-.28 1.52.07 1.8.78Z",fill:"var(--semi-color-primary)"}),a.createElement("path",{d:"M143.4 57.76c.61.47.72 1.34.26 1.95-.3.39-.62.77-.94 1.14a1.38 1.38 0 0 1-2.09-1.81 24 24 0 0 0 .84-1.03c.47-.6 1.33-.71 1.94-.25Z",fill:"var(--semi-color-primary)"}),a.createElement("path",{d:"M108.43 59.46c.22-.74.99-1.15 1.72-.93l1.35.41a1.38 1.38 0 1 1-.82 2.64l-1.32-.4a1.38 1.38 0 0 1-.93-1.72Z",fill:"var(--semi-color-primary)"}),a.createElement("path",{d:"M115.08 61.58a1.38 1.38 0 0 1 1.77-.82l1.32.48a1.38 1.38 0 0 1-.97 2.6c-.43-.17-.87-.33-1.3-.48a1.38 1.38 0 0 1-.82-1.78Z",fill:"var(--semi-color-primary)"}),a.createElement("path",{d:"M138.67 62.89c.42.64.25 1.5-.4 1.92-.41.27-.85.54-1.29.78a1.38 1.38 0 0 1-1.32-2.43c.37-.2.73-.43 1.1-.66.63-.42 1.49-.25 1.91.39Z",fill:"var(--semi-color-primary)"}),a.createElement("path",{d:"M30.5 62.78c.77.07 1.33.74 1.26 1.5l-.03.59.01.75-1.6 1.4a1.38 1.38 0 0 1-1.16-1.32l-.02-.83c0-.28.02-.56.04-.84.07-.76.75-1.32 1.5-1.25Z",fill:"var(--semi-color-primary)"}),a.createElement("path",{d:"M121.6 64.07c.3-.7 1.1-1.04 1.8-.75a146.8 146.8 0 0 1 1.26.52 1.38 1.38 0 1 1-.97 2.59 19.62 19.62 0 0 1-1.35-.55c-.7-.3-1.04-1.1-.74-1.81Z",fill:"var(--semi-color-primary)"}),a.createElement("path",{d:"M72.11 64.94c.48.6.4 1.47-.2 1.95-.38.3-.74.62-1.09.92A1.38 1.38 0 1 1 69 65.73c.37-.33.76-.66 1.17-.99.59-.48 1.46-.39 1.94.2Z",fill:"var(--semi-color-primary)"}),a.createElement("path",{d:"M132.4 65.92c.09.76-.46 1.44-1.22 1.53-.5.05-1.02.08-1.53.09a1.38 1.38 0 1 1-.02-2.77c.42 0 .84-.03 1.25-.07.76-.09 1.44.46 1.53 1.22Z",fill:"var(--semi-color-primary)"}),a.createElement("path",{d:"M66.66 69.9c.57.52.6 1.4.09 1.96l-.73.8-.02.02-.16.18-.08.09a1.38 1.38 0 0 1-2.05-1.86l.25-.28.75-.82c.51-.56 1.39-.6 1.95-.09Z",fill:"var(--semi-color-primary)"}),a.createElement("path",{d:"M61.6 75.28c.45.61.31 1.48-.3 1.93-.44.31-.88.61-1.36.89a1.38 1.38 0 1 1-1.4-2.4c.4-.22.77-.46 1.12-.72a1.38 1.38 0 0 1 1.94.3Z",fill:"var(--semi-color-primary)"}),a.createElement("path",{d:"M37.67 75.97c.42.19.86.37 1.35.53a1.38 1.38 0 0 1-.89 2.62c-.56-.19-1.1-.4-1.6-.63l.72-2.63c.14.01.28.05.42.11Z",fill:"var(--semi-color-primary)"}),a.createElement("path",{d:"M55.05 78.57c.12.75-.4 1.46-1.15 1.58-.5.08-1 .15-1.54.2a1.38 1.38 0 1 1-.28-2.75c.49-.05.95-.11 1.39-.18.75-.12 1.46.4 1.58 1.15Z",fill:"var(--semi-color-primary)"}),a.createElement("path",{d:"M43.4 78.87c.06-.76.73-1.33 1.49-1.27a38.43 38.43 0 0 0 1.5.1 1.38 1.38 0 1 1-.12 2.76 62.94 62.94 0 0 1-1.6-.1 1.38 1.38 0 0 1-1.27-1.49Z",fill:"var(--semi-color-primary)"}),a.createElement("g",{clipPath:"url(#clip_failure_96_39_65)"},a.createElement("path",{fillRule:"evenodd",clipRule:"evenodd",d:"M30.9 46.87a13.45 13.45 0 0 1 9.37-16.53 13.46 13.46 0 0 1 16.52 9.39c2.64 9.56-4.76 29.27-5.14 29.9a.75.75 0 0 1-.99.27c-.64-.34-17.11-13.47-19.76-23.03Zm14.36 1.54a6.1 6.1 0 0 1-3.25-11.75 6.1 6.1 0 0 1 3.25 11.75Z",fill:"var(--semi-color-primary)"})),a.createElement("path",{d:"M102.31 100.69c-2.8 1.55-5.63 2.85-9.36 4.58l1.48 3.92c2.14-.96 6.16-6.03 7.88-8.5Z",fill:"#515151"}),a.createElement("path",{fillRule:"evenodd",clipRule:"evenodd",d:"M121 63.04c8.85 2.1 12.43-6.5 13.12-8.77.68-2.27-5.6-11.86-8-11.2l-.42.12-.23.06c-3.1.82-11.15 2.94-12.35 8-1.3 5.46 2.4 10.49 7.88 11.79Z",fill:"#515151"}),a.createElement("path",{d:"M134.5 64.73c-.43.47-1.2.74-2.33.73a12.7 12.7 0 0 1-4.06-.86 31.25 31.25 0 0 1-9.94-6.22c-3.25-2.97-5.97-5.8-7.59-8.42-1.61-2.61-2.05-4.88-.98-6.84a3.7 3.7 0 0 1 2.11-1.86 4.53 4.53 0 0 1 2.9.15c2.16.76 4.57 2.83 6.48 6.02 3.4 5.63 6.89 8.23 9.7 10.33.49.35.95.7 1.38 1.03a7.29 7.29 0 0 1 2.61 3.48c.34 1.1.16 1.97-.28 2.46Z",fill:"white",stroke:"#515151"}),a.createElement("mask",{id:"mask_failure_130_526","mask-type":"alpha",maskUnits:"userSpaceOnUse",x:98,y:44,width:36,height:27},a.createElement("path",{d:"M130.53 62.1c-.5-3.3-9.52-14.75-16.08-15.03l-12.68 4.52 6.47 14.16 17.25 3.07c1.84-1.14 5.43-4.07 5.04-6.72Z",fill:"#C4C4C4"})),a.createElement("g",{mask:"url(#mask_failure_130_526)"},a.createElement("path",{d:"M127.2 63.62a9.74 9.74 0 0 1-13.76.5 9.74 9.74 0 0 1-.32-13.77 9.74 9.74 0 0 1 13.77-.5 9.74 9.74 0 0 1 .32 13.77Z",fill:"white",stroke:"#515151"}),a.createElement("path",{fillRule:"evenodd",clipRule:"evenodd",d:"m116.79 47.35-.02.37c2.86.5 8.57 2.59 8.58 6.87 0 5.36-7.44 9.34-14.47 3.46-.34-.28-.66-.53-.95-.74a10.09 10.09 0 0 0 3.17 7.17 10.24 10.24 0 0 0 14.47-.52 10.24 10.24 0 0 0-.34-14.47 10.16 10.16 0 0 0-10.44-2.14Z",fill:"#515151"}),a.createElement("path",{d:"M119.34 55a.79.79 0 1 0-1.1-1.12.79.79 0 0 0 1.1 1.12Z",fill:"#515151"}),a.createElement("path",{fillRule:"evenodd",clipRule:"evenodd",d:"M119.98 50.72c.21-.09.45.01.54.22a7.87 7.87 0 0 0 1.84 2.65.41.41 0 1 1-.55.62 8.67 8.67 0 0 1-2.05-2.95.41.41 0 0 1 .22-.54Z",fill:"#515151"}),a.createElement("path",{d:"M114.85 52.4a.79.79 0 1 0-1.1-1.1.79.79 0 0 0 1.1 1.1Z",fill:"#515151"}),a.createElement("mask",{id:"path-18-inside-1",fill:"white"},a.createElement("ellipse",{rx:2.97818,ry:2.97818,transform:"matrix(0.727696 0.6859 -0.685903 0.727693 128.435 60.0508)"})),a.createElement("ellipse",{rx:2.97818,ry:2.97818,transform:"matrix(0.727696 0.6859 -0.685903 0.727693 128.435 60.0508)",fill:"white"}),a.createElement("path",{d:"m128.42 60.04.01-.01a.03.03 0 0 1 .02 0l-4.12 4.37a5.98 5.98 0 0 0 8.45-.25l-4.36-4.11Zm.03 0v.02l-4.37-4.11a5.98 5.98 0 0 0 .25 8.45l4.12-4.37Zm0 .03h-.01a.03.03 0 0 1-.02 0l4.12-4.37a5.98 5.98 0 0 0-8.46.25l4.37 4.12Zm-.03 0v-.03l4.37 4.11a5.98 5.98 0 0 0-.25-8.45l-4.12 4.37Z",fill:"#515151",mask:"url(#path-18-inside-1)"})),a.createElement("path",{d:"M145.63 40.19c1.37-2.75 12.75 2.35 16.14 6.78 3.38 4.43 1.48 10.74-1.9 9.68-6.69-2.12-7.56-6.7-7.94-9.48-1.2-1.85-7.67-4.24-6.3-6.98Z",fill:"white",stroke:"#515151"}),a.createElement("path",{d:"m158.95 41.56 6.64 2.52 1.66 12.47-8.3 1.98-3.47-12.03 3.47-4.94Z",fill:"white"}),a.createElement("path",{d:"M167.3 151.94c5.19 1.66 23.35 35.57 19.05 35.57-13.86 0-34.5.53-71.42.53-15.63 0-17.9-5.16-11.79-22.08a353.23 353.23 0 0 1 6.14-15.76l32.5 1.26c-.43 1.53-.91 3.07-1.38 4.4a26.82 26.82 0 0 1 8.73-1.47c5.27 0 7.04 1.4 11.77 0 2.13-.62 4.8-2.97 6.4-2.45Z",fill:"white",className:""}),a.createElement("path",{d:"M140.4 155.87c.47-1.34.95-2.88 1.38-4.4l-32.5-1.27a353.23 353.23 0 0 0-6.14 15.76c-6.1 16.92-3.84 22.08 11.79 22.08 36.93 0 57.56-.53 71.42-.53 4.3 0-13.86-33.91-19.06-35.57-1.6-.52-4.26 1.83-6.4 2.45-4.72 1.4-6.5 0-11.76 0-3.08 0-6.06.55-8.72 1.48Zm0 0a26.67 26.67 0 0 1-4.44 8.38c-1.7 2.22-3.99 4.43-5.43 4.33-1.44-.1-1.42-3.18 0-5.66 1.97-3.44 6.45-5.87 9.88-7.05Z",stroke:"#1C1F23",className:""}),a.createElement("path",{d:"M149.25 131.7s3.36 19.46-12.34 21.04c-11.53 1.15-40.77-4.55-53.76-7.79 4.72 12.82 9.61 39.86 7 42.16-3.33 2.93-47.55 1.76-55.96 0-8.42-1.75 13.82-11.46 15.45-14.66 2.99-5.84-5.48-21.18-5.75-45.45-.27-24.27 18.18-24.86 34.47-21.64 13.02 2.57 41.63 18.33 52.56 26.86l18.33-.52Z",fill:"white",stroke:"#515151"}),a.createElement("path",{d:"M141.5 153.87c-3.11 2.55-27.72 5-35.58 3.53l2.75-6.8c20.23 2.85 28.08 3.34 33.46 1.16l-.63 2.11Z",fill:"#515151",className:"__web-inspector-hide-shortcut__"}),a.createElement("path",{d:"M141.5 153.87c-3.11 2.55-27.72 5-35.58 3.53l2.75-6.8c20.23 2.85 28.08 3.34 33.46 1.16l-.63 2.11Z",fill:"#515151"}),a.createElement("path",{d:"M126.02 142.7c-3.1-2.99-4.99-7.5-4.16-12.35",stroke:"#515151"}),a.createElement("path",{fillRule:"evenodd",clipRule:"evenodd",d:"M130.6 95.65c-9.03-10.98-18.97-19.74-25.5-24.56l1.63-2.22c6.7 4.95 16.81 13.86 26 25.02 9.18 11.16 17.54 24.67 20.59 38.83l-2.7.59c-2.91-13.56-10.97-26.67-20.02-37.66Z",fill:"#515151"}),a.createElement("path",{d:"m149.12 107.09-16.36 13.2 22.27 17.8 8.87-19.19c-.14-3.93-2.34-5.34-5.83-4.66l-3.12-2.5c.08-3.5-2.18-5.64-5.83-4.65Z",fill:"#E6E8EA"}),a.createElement("path",{d:"m148.24 128.62 9.45-14.34-2.91-2.33-10.94 13.07 4.4 3.6Z",stroke:"#515151"}),a.createElement("path",{fillRule:"evenodd",clipRule:"evenodd",d:"M143.67 127.98a6.93 6.93 0 1 1-10.82-8.65 6.93 6.93 0 0 1 10.82 8.65Zm12.28 9.82a6.93 6.93 0 1 1-10.82-8.66 6.93 6.93 0 0 1 10.82 8.66Z",fill:"#515151"}),a.createElement("path",{fillRule:"evenodd",clipRule:"evenodd",d:"m133.43 123.46 9.21-1.8.32 1.61-9.2 1.81-.33-1.62Z",fill:"white"}),a.createElement("path",{fillRule:"evenodd",clipRule:"evenodd",d:"m145.5 133.11 9.21-1.8.32 1.62-9.2 1.8-.33-1.62Z",fill:"white"}),a.createElement("defs",null,a.createElement("clipPath",{id:"clip_failure_96_39_65"},a.createElement("rect",{width:44.4004,height:44.4627,transform:"matrix(0.963965 -0.266028 0.266198 0.963918 18.4214 34.6221)",fill:"white"}))))}var ld=ad;const Dr=n=>{let e;const t=new Set,o=(p,d)=>{const m=typeof p=="function"?p(e):p;if(!Object.is(m,e)){const f=e;e=d??(typeof m!="object"||m===null)?m:Object.assign({},e,m),t.forEach(b=>b(e,f))}},r=()=>e,c={setState:o,getState:r,getInitialState:()=>u,subscribe:p=>(t.add(p),()=>t.delete(p))},u=e=n(o,r,c);return c},cd=(n=>n?Dr(n):Dr),dd=n=>n;function ud(n,e=dd){const t=g.useSyncExternalStore(n.subscribe,g.useCallback(()=>e(n.getState()),[n,e]),g.useCallback(()=>e(n.getInitialState()),[n,e]));return g.useDebugValue(t),t}const $r=n=>{const e=cd(n),t=o=>ud(e,o);return Object.assign(t,e),t},gt=(n=>n?$r(n):$r);function pd(){var n,e;return((e=(n=window.__TAURI__)==null?void 0:n.core)==null?void 0:e.invoke)||null}const hd=ee;async function Oe(n,e){const t=await fetch(`${hd}${n}`,{headers:{"Content-Type":"application/json"},...e});if(!t.ok){const o=await t.text().catch(()=>"");let r=`${t.status} ${t.statusText}`;try{const s=JSON.parse(o);r=s.error||s.message||r}catch{}throw new Error(r)}return t.json()}function be(){return window.ga||null}function xe(){return!!be()}async function md(){if(xe())try{return(await be().getConfig()).config}catch{}try{return(await Oe("/config")).config}catch{return{lang:localStorage.getItem("ga_lang")||"zh",theme:"light",appearance:localStorage.getItem("ga_appearance")||"light",plain:!1,fontSize:parseInt(localStorage.getItem("ga_font_size")||"14",10),llmNo:0}}}async function fd(n){if(xe())try{await be().saveConfig({config:n});return}catch{}try{await Oe("/config",{method:"POST",body:JSON.stringify({config:n})})}catch{}}async function gd(){if(xe())try{return(await be().getModelProfiles()).profiles||[]}catch{}try{return(await Oe("/model-profiles")).profiles||[]}catch{return[]}}async function yd(n){if(xe())try{return(await be().rpc("model-profiles/get",{id:n})).profile||null}catch{}try{return(await Oe(`/model-profiles/${n}`)).profile||null}catch{return null}}async function bd(n){return xe()?(await be().rpc("model-profiles/add",n)).profiles:(await Oe("/model-profiles",{method:"POST",body:JSON.stringify(n)})).profiles}async function vd(n,e){return xe()?(await be().rpc("model-profiles/edit",{id:n,...e})).profiles:(await Oe(`/model-profiles/${n}`,{method:"PUT",body:JSON.stringify(e)})).profiles}async function xd(n){return xe()?(await be().rpc("model-profiles/delete",{id:n})).profiles:(await Oe(`/model-profiles/${n}`,{method:"DELETE"})).profiles}async function wd(n){return xe()?(await be().rpc("model-profiles/mixin-add",{id:n})).profiles:(await Oe(`/model-profiles/${n}/mixin`,{method:"POST",body:"{}"})).profiles}async function Cd(n){return xe()?(await be().rpc("model-profiles/mixin-remove",{id:n})).profiles:(await Oe(`/model-profiles/${n}/mixin`,{method:"DELETE"})).profiles}async function Ar(n){return xe()?(await be().rpc("model-profiles/mixin-reorder",{members:n})).profiles:(await Oe("/model-profiles/mixin/order",{method:"PUT",body:JSON.stringify({members:n})})).profiles}async function Sd(){if(xe())try{return(await be().getMykeyContent()).content}catch{}try{return(await Oe("/services/mykey")).content||""}catch{return""}}async function kd(n){if(xe()){await be().saveMykeyContent(n);return}await Oe("/services/mykey",{method:"POST",body:JSON.stringify({content:n})})}async function _e(n,e){if(xe())return be().tauriInvoke(n,e);const t=pd();if(t)return t(n,e);throw new Error("Tauri IPC not available")}const Et={lang:"ga_lang",theme:"ga_theme",appearance:"ga_appearance",fontSize:"ga_font_size",llmNo:"ga_llm_no"};function jd(n){try{localStorage.setItem(Et.lang,n.lang),localStorage.setItem(Et.appearance,n.appearance),localStorage.setItem(Et.fontSize,String(n.chatFontSize)),localStorage.setItem(Et.llmNo,String(n.defaultModelNo))}catch{}}function Gn(n,e){const t=document.documentElement;t.dataset.appearance=n,delete t.dataset.plain,t.dataset.chatFont=String(e),t.style.setProperty("--chat-font",e+"px"),n==="dark"?document.body.setAttribute("theme-mode","dark"):document.body.removeAttribute("theme-mode")}function Ed(){const n=document.documentElement;return{appearance:n.dataset.appearance==="dark"?"dark":"light",chatFontSize:parseInt(n.dataset.chatFont||"14",10)||14,lang:n.lang==="en"?"en":"zh",defaultModelNo:parseInt(localStorage.getItem(Et.llmNo)||"0",10)}}const H=gt((n,e)=>({visible:!1,modelProfiles:[],liveModel:null,...Ed(),open:()=>n({visible:!0}),close:()=>n({visible:!1}),setAppearance:t=>{n({appearance:t}),Gn(t,e().chatFontSize),e().persist()},setChatFontSize:t=>{const o=Math.max(10,Math.min(20,t));n({chatFontSize:o}),Gn(e().appearance,o),e().persist()},setLang:t=>{n({lang:t}),document.documentElement.lang=t==="en"?"en":"zh-CN",e().persist()},setModelProfiles:t=>n({modelProfiles:t}),setDefaultModel:t=>{e().modelProfiles[t]&&(n({defaultModelNo:t}),e().persist())},setLiveModel:t=>n({liveModel:t}),loadFromBridge:async()=>{try{const[t,o]=await Promise.all([md(),gd()]);n({appearance:t.appearance==="dark"?"dark":"light",chatFontSize:t.fontSize||14,lang:t.lang==="en"?"en":"zh",defaultModelNo:t.llmNo||0,modelProfiles:o});const r=e();Gn(r.appearance,r.chatFontSize)}catch{}},persist:async()=>{const t=e();jd(t);try{await fd({lang:t.lang,theme:"1",appearance:t.appearance,plain:!1,fontSize:t.chatFontSize,llmNo:t.defaultModelNo})}catch{}}})),Od={robot:"","symbol-misc":"",comment:"",files:"",graph:"",search:"",add:"","kebab-vertical":"",grabber:"","arrow-left":"","chevron-right":"","settings-gear":"","server-process":"",link:"","layout-sidebar-left":"","layout-sidebar-left-off":"","circle-filled":"","layout-sidebar-right":"","layout-sidebar-right-off":"",pin:"",pinned:"",edit:"",trash:""};function Ee({name:n,size:e,className:t}){const o=Od[n];return i.jsx("span",{className:`codicon${t?" "+t:""}`,style:{fontSize:e,display:"inline-block",lineHeight:1},"aria-hidden":"true",children:o??"?"})}const Ie=gt(n=>({activePage:"chat",sidebarCollapsed:!1,servicesTab:"channels",setPage:e=>n({activePage:e}),setServicesTab:e=>n({servicesTab:e}),toggleSidebar:()=>n(e=>({sidebarCollapsed:!e.sidebarCollapsed}))}));typeof window<"u"&&window.addEventListener("ga:go-page",(n=>{Ie.getState().setPage(n.detail.page)}));function Fr(n,e="completed"){const t={id:String(n.id),role:n.role,content:n.content||"",status:n.status??e,createdAt:n.createdAt??n.ts};return Array.isArray(n.turn_segs)&&(t.turn_segs=n.turn_segs),Array.isArray(n.images)&&n.images.length>0&&(t.images=n.images),Array.isArray(n.files)&&n.files.length>0&&(t.files=n.files),t}async function Pd(){return(await(await fetch(`${ee}/session/new`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({cwd:"",mcp_servers:[]})})).json()).sessionId}async function _d(n,e,t){const r=await(await fetch(`${ee}/upload`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({name:e,dataUrl:t,sid:n})})).json();if(!r.ok)throw new Error(r.error||"upload failed");return r.path}async function Md(n,e){const o=await(await fetch(`${ee}/upload`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({name:n,dataUrl:e,sid:"_files"})})).json();if(!o.ok)throw new Error(o.error||"upload failed");return o.path}async function Ld(n,e,t,o){var u;const r=(t||[]).map(p=>({name:p.name,path:p.path,size:p.size})),s=[];for(const p of o||[])if(p.path&&!p.path.startsWith("data:")&&p.path!==p.name)s.push({name:p.name,path:p.path});else{const m=p.base64||((u=p.path)!=null&&u.startsWith("data:")?p.path:void 0);if(m){const f=await _d(n,p.name,m);s.push({name:p.name,path:f})}}return(await(await fetch(`${ee}/session/${n}/prompt`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({sessionId:n,prompt:e,display:e,files:r,imageMetas:s})})).json()).userMessageId}async function Qn(n,e,t=50){const o=new URLSearchParams({limit:String(t)}),s=await(await fetch(`${ee}/session/${n}/messages?${o}`)).json();return{messages:(s.messages||[]).map(l=>Fr(l)),partial:s.partial?Fr(s.partial,"in_progress"):void 0,status:s.status,plan:s.plan,model:s.model}}async function Id(n){await fetch(`${ee}/session/${n}/cancel`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({sessionId:n})})}async function zr(n,e){return(await fetch(`${ee}/session/${n}/model`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({llmNo:e})})).json()}async function Yn(){return((await(await fetch(`${ee}/sessions`)).json()).sessions||[]).filter(o=>!o.id.startsWith("tui_"))}async function Td(n){await fetch(`${ee}/session/${n}`,{method:"DELETE"})}async function Rd(n,e){await fetch(`${ee}/session/${n}`,{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify({title:e})})}async function Nd(n,e){await fetch(`${ee}/session/${n}`,{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify({pinned:e})})}const Ct="__partial__",Dd=1e3;let St=null,st=null,tn=null;const je=new Map,X=gt((n,e)=>{function t(p,d,m){const f=p.filter(S=>S.id!==Ct),b=f.filter(S=>String(S.id).startsWith("local-"));let y=f.filter(S=>!String(S.id).startsWith("local-"));for(const S of d){if(y.some(C=>C.id===S.id))continue;const w=b.findIndex(C=>C.role===S.role&&C.content===S.content);w>=0&&b.splice(w,1),y.push(S)}return y=[...y,...b],y.sort((S,w)=>(S.createdAt??0)-(w.createdAt??0)),m&&y.push({...m,id:Ct,status:"in_progress"}),y}function o(p){for(let d=p.length-1;d>=0;d--)if(p[d].role==="user"&&p[d].createdAt)return p[d].createdAt;return Date.now()}function r(p,d){je.set(p,d);const{activeSessionId:m}=e();p===m&&n({turnStartedAt:d})}function s(p){je.delete(p);const{activeSessionId:d}=e();p===d&&n({turnStartedAt:null})}function l(){if(st=null,!St)return;const p=St;St=null;const{messages:d}=e(),m=d.filter(f=>f.id!==Ct);n({messages:[...m,p]})}function c(){u(),tn=setInterval(()=>{const{activeSessionId:p,status:d}=e();if(!p||d!=="running"){u();return}Qn(p).then(m=>{if(n(f=>({messages:t(f.messages,m.messages,m.partial),status:m.status,turnStartedAt:m.status==="running"?f.turnStartedAt:null})),m.model&&(H.getState().setLiveModel(m.model),m.model.llmNo!=null&&m.status!=="running"&&n({sessionModelNo:m.model.llmNo})),m.status!=="running"){s(p),u();const{pendingQueue:f,status:b}=e();if(b==="idle"&&f.length>0){const[y,...S]=f;n({pendingQueue:S}),e().sendMessage(y.text,y.opts)}}}).catch(()=>{})},Dd)}function u(){tn!==null&&(clearInterval(tn),tn=null)}return Ve("partial-update",p=>{const d=p,{activeSessionId:m}=e();!d.sessionId||d.sessionId!==m||(St={id:Ct,role:"assistant",content:d.content||"",status:"in_progress",turn_segs:d.turn_segs},st===null&&(st=requestAnimationFrame(l)))}),Ve("session-state",p=>{const d=p;d.sessionId&&d.status&&n(f=>{const b=new Set(f.runningSessions);return d.status==="running"?b.add(d.sessionId):b.delete(d.sessionId),{runningSessions:b}});const{activeSessionId:m}=e();d.sessionId&&d.sessionId===m&&(d.status==="running"?(je.has(d.sessionId)?n({turnStartedAt:je.get(d.sessionId)}):r(d.sessionId,Date.now()),n({status:"running"}),c()):(d.status==="idle"||d.status==="error"||d.status==="cancelled")&&(u(),st!==null&&(cancelAnimationFrame(st),st=null),St=null,s(d.sessionId),n({status:"idle"}),Qn(m).then(f=>{n(S=>({messages:t(S.messages.filter(w=>w.id!==Ct),f.messages,void 0)})),f.model&&(H.getState().setLiveModel(f.model),f.model.llmNo!=null&&n({sessionModelNo:f.model.llmNo}));const{pendingQueue:b,status:y}=e();if(y==="idle"&&b.length>0){const[S,...w]=b;n({pendingQueue:w}),e().sendMessage(S.text,S.opts)}}).catch(()=>{}))),d.sessionId&&d.sessionId!==m&&(d.status==="idle"||d.status==="error"||d.status==="cancelled"?je.delete(d.sessionId):d.status==="running"&&!je.has(d.sessionId)&&je.set(d.sessionId,Date.now())),(d.status==="idle"||d.status==="error")&&Yn().then(f=>n({sessions:f})).catch(()=>{})}),Yn().then(p=>n({sessions:p})).catch(()=>{}),{activeSessionId:null,messages:[],status:"idle",sessions:[],runningSessions:new Set,turnStartedAt:null,pendingQueue:[],sessionModelNo:null,async newSession(){n({activeSessionId:null,messages:[],status:"idle",turnStartedAt:null,pendingQueue:[],sessionModelNo:null})},async sendMessage(p,d){var C;let{activeSessionId:m,status:f}=e();if(!m){m=await Pd(),n({activeSessionId:m}),e().loadSessions();const k=e().sessionModelNo;k!=null&&zr(m,k).catch(()=>{})}if(f==="running"){n(k=>({pendingQueue:[...k.pendingQueue,{text:p,opts:d}]}));return}const b=Date.now(),y=(C=d==null?void 0:d.images)==null?void 0:C.map(k=>({name:k.name,path:k.base64||k.path||k.name})),S=d==null?void 0:d.files,w={id:`local-${b}`,role:"user",content:p,status:"completed",createdAt:b,images:y,files:S};n(k=>({messages:[...k.messages,w],status:"running"})),r(m,b),c(),await Ld(m,p,d==null?void 0:d.files,d==null?void 0:d.images)},cancelQueued(p){n(d=>({pendingQueue:d.pendingQueue.filter((m,f)=>f!==p)}))},async cancel(){const{activeSessionId:p}=e();p&&await Id(p)},setActiveSession(p){u();const d=p?je.get(p)??null:null;n({activeSessionId:p,messages:[],status:"idle",turnStartedAt:d,pendingQueue:[],sessionModelNo:null}),p&&Qn(p).then(m=>{const f=t([],m.messages,m.partial);if(n({messages:f,status:m.status}),m.model&&(H.getState().setLiveModel(m.model),m.model.llmNo!=null&&n({sessionModelNo:m.model.llmNo})),m.status==="running"){if(je.has(p))n({turnStartedAt:je.get(p)});else{const b=o(m.messages);r(p,b)}c()}else je.delete(p),n({turnStartedAt:null})}).catch(()=>{})},async loadSessions(){try{const p=await Yn();n({sessions:p})}catch{}},async deleteSession(p){const{activeSessionId:d}=e();d===p&&n({activeSessionId:null,messages:[],status:"idle",turnStartedAt:null}),je.delete(p),n(m=>({sessions:m.sessions.filter(f=>f.id!==p)}));try{await Td(p)}catch{}},async renameSession(p,d){n(m=>({sessions:m.sessions.map(f=>f.id===p?{...f,title:d,untitled:!1}:f)}));try{await Rd(p,d)}catch{}},async pinSession(p,d){n(m=>({sessions:m.sessions.map(f=>f.id===p?{...f,pinned:d}:f)}));try{await Nd(p,d)}catch{}},async selectSessionModel(p){const{activeSessionId:d}=e(),m=e().sessionModelNo;if(n({sessionModelNo:p}),!!d)try{const f=await zr(d,p);f.model&&(H.getState().setLiveModel(f.model),f.model.llmNo!=null&&n({sessionModelNo:f.model.llmNo}))}catch{n({sessionModelNo:m})}}}});Ys(n=>{n==="ready"&&X.getState().loadSessions()});const $d={"app.title":"GenericAgent","brand.sub":"","nav.chat":"新建会话","nav.services":"运行状态","nav.channels":"消息通道","nav.status":"运行状态","nav.collab":"指挥家","nav.token":"用量","foot.settings":"配置","foot.runtimeManagement":"运行时管理","foot.ver":"GenericAgent","chat.startTitle":"开始对话","chat.startSub":"直接输入,或点预设功能一键启动","chat.inputPlaceholder":"输入消息…","preset.butler.t":"指挥家","preset.butler.d":"复杂任务自动拆解,只需查看进度和简报","preset.plan.t":"计划模式","preset.plan.d":"加载 Plan SOP,按探索→规划→执行→验证流程","preset.goal.t":"目标模式","preset.goal.d":"设定目标,自主完成","preset.autonomous.t":"自主行动","preset.autonomous.d":"按 SOP 规划/执行任务,产出报告(reflect/autonomous.py 同源)","preset.hive.t":"集群协作","preset.hive.d":"多 worker 协同攻坚","preset.review.t":"深度复核","preset.review.d":"挑刺式质量把关","preset.findwork.t":"找点事做","preset.findwork.d":"分析当前情况,推荐一批让你感兴趣的 TODO","preset.mine.t":"我的·周报","preset.mine.d":"自定义:抓本周提交并写周报","preset.add.t":"自定义","preset.add.d":"任意一句话存为功能","composer.placeholder":"今天帮你做些什么?","composer.placeholder.new.0":"今天帮你做些什么?@ 引用文件;/ 调用预设技能","composer.placeholder.new.1":"交给我一个任务","composer.placeholder.new.2":"有什么想法?","composer.placeholder.new.3":"描述你的需求","composer.placeholder.new.4":"今天解决什么?","composer.placeholder.new.5":"随便问","composer.placeholder.new.6":"从目标开始","composer.placeholder.followUp.0":"继续补充…","composer.placeholder.followUp.1":"添加更多上下文","composer.placeholder.followUp.2":"细化你的请求","composer.placeholder.followUp.3":"接下来做什么?","composer.placeholder.followUp.4":"继续推进","composer.placeholder.reconnecting":"重新连接中…","search.placeholder":"搜索会话…","search.noResults":"无匹配会话","conv.new":"新对话","section.sessions":"会话","ctx.pin":"置顶","ctx.unpin":"取消置顶","ctx.rename":"重命名","ctx.del":"删除","common.close":"关闭","common.more":"更多","common.optional":"选填","common.save":"保存","common.cancel":"取消","common.confirm":"确认","common.edit":"编辑","common.delete":"删除","common.done":"完成","modal.preset":"预设功能","modal.addModel":"添加模型","modal.editModel":"编辑模型","modal.settings":"配置","modal.features":"功能","modal.customPreset":"自定义预设","modal.editCustomPreset":"编辑任务","customPreset.titlePh":"标题,例如「写周报」","customPreset.promptPh":"Prompt 内容,发送时会作为消息提交","customPreset.empty":"标题和 Prompt 不能为空","customPreset.removeTitle":"删除","customPreset.editTitle":"编辑","builtinPreset.restoreBtn":"恢复默认预设","set.appearance":"外观","set.plainUi":"素色","set.fontSize":"聊天字号","set.lang":"语言","set.model":"模型配置","set.addModel":"添加模型","set.features":"功能","set.importMykey":"导入已有密钥配置","set.exportMykey":"导出当前模型配置","set.serviceManager":"运行状态","shortcut.askConfirm":"是否在桌面创建 GenericAgent 快捷方式?","appearance.light":"浅色","appearance.dark":"深色","set.noModels":"暂无模型,点击下方添加","set.current":"当前","lang.zh":"简体中文","lang.en":"English","model.name":"备注名","model.namePh":"选填,方便自己辨认","model.apikey":"API Key","model.apikeyPh":"请输入 API Key","model.apikeyKeep":"留空则保持原 Key 不变","model.apibase":"API URL","model.apibasePh":"请输入 API URL","model.protocol":"模型协议","model.protocolPick":"请选择…","model.protocolOai":"OpenAI 兼容 (chat/completions)","model.protocolClaude":"Anthropic (Claude /v1/messages)","model.stream":"响应方式","model.streamOn":"流式","model.streamOff":"非流式","model.model":"模型 ID","model.modelPh":"请输入模型唯一标识","model.modelHint":"须与服务商文档中的 model 字段完全一致","model.retries":"重试次数","model.connTimeout":"连接超时 (s)","model.readTimeout":"读取超时 (s)","model.save":"保存","model.auto":"自动选择","model.menuLabel":"选择模型","model.aggregation":"默认组","model.aggregationShort":"默认组","model.aggregationDesc":"按顺序尝试,失败自动切换到下一个","model.configurationHelp":"模型配置说明","model.configurationTip":"设置新会话默认使用的模型;也可以在会话输入框中临时切换","model.aggregationTip":"默认组会按列表顺序尝试模型;当前模型不可用时自动切换到下一项","model.emptyMixin":"尚未加入模型","model.addToMixin":"加入默认组","model.inMixin":"已在默认组","model.removeFromMixin":"移出默认组","model.alreadyInMixin":"已在默认组中","model.dragReorder":"拖拽调整顺序","model.routeProvider":"服务商接入","model.routeCustom":"自定义接入","model.selectProvider":"选择服务商","model.providerLocked":"由服务商预设,不可更改","model.advanced":"高级配置","model.getKey":"获取 API Key →","pq.title":"快速接入官方模型","pq.sub":"填好 API Key 即可使用","pq.toggle":"展开 / 收起","pq.deepseekDesc":"深度求索 · DeepSeek 开放平台","pq.qwenDesc":"阿里云百炼 · 通义大模型","pq.doubaoDesc":"火山引擎 · 火山方舟平台","pq.minimaxDesc":"MiniMax · 开放平台","pq.zhipuDesc":"智谱 AI · GLM 开放平台","pq.kimiDesc":"月之暗面 · Moonshot 平台","pq.stepfunDesc":"阶跃星辰 · Step 开放平台","guide.step1":"点击下方链接,登录后创建并复制 API Key","guide.step2":"把 Key 粘贴到下方「API Key」输入框","guide.step3":"点击保存,即可在模型列表中选用","guide.prefillTip":"已为你预填 API 地址、协议与模型,可按需修改","guide.getKey":"获取 {name} 的 API Key","guide.copy":"复制链接","guide.copied":"链接已复制","err.modelSave":"保存失败","err.modelRequired":"请填写模型、API Key 和 API 地址","err.modelDelete":"删除失败","err.modelDeleteLast":"至少保留一个模型","err.mixinFailed":"操作失败","confirm.modelDelete":"确定删除该模型配置?","page.services.title":"运行状态","page.services.sub":"查看消息通道及本地运行环境中各组件的状态、日志与控制项","svc.colName":"运行组件","svc.colStatus":"状态","svc.colPid":"PID","svc.colMemory":"内存 (MB)","svc.colCpu":"CPU (%)","svc.colActions":"操作","svc.empty":"暂无运行组件","page.channels.title":"消息通道","page.channels.sub":"管理消息通道,查看启停状态与日志","page.status.title":"运行状态","page.status.sub":"查看本地运行环境中各组件的状态、日志与控制项","page.collab.title":"指挥家","page.collab.sub":"交代目标,自动拆活与跟进","collab.progressTitle":"分工进度","collab.progressEmpty":"还没有任务在执行。告诉指挥家你的目标后,这里会显示拆分后的处理进度。","collab.placeholder":"请对指挥家描述你想完成的目标","collab.guideTitle":"把要完成的事告诉指挥家","collab.guideWhen":"适合需要多步处理、要花一些时间才能完成的目标。日常聊天和快问快答,请用左侧「聊天」。","collab.guideStep1t":"描述目标","collab.guideStep1d":"在聊天框里写下你想做的事,发给指挥家","collab.guideStep2t":"自动拆解","collab.guideStep2d":"指挥家自动拆解、分配任务,实时监督和调度","collab.guideStep3t":"交付摘要","collab.guideStep3d":"指挥家根据执行状态,呈上任务简报","collab.guideStep4t":"随时调整","collab.guideStep4d":"随时补充要求或细节,指挥家都会处理","collab.chipProgress":"现在进展如何?","collab.chipPause":"先暂停当前任务","collab.chipSummary":"总结一下目前的结果","collab.showProgressTitle":"查看分工进度","collab.statRunning":"进行中","collab.statDone":"已完成","collab.plusMenu":"更多操作","collab.switchMode":"切换模式","collab.typing":"指挥家正在处理","collab.offline":"暂时无法连接指挥家服务,请稍后重试。","collab.offlineTitle":"指挥家离线","collab.offlineSub":"指挥家服务暂时不可用,请检查连接后重试。","collab.retry":"重试","collab.terminateWorker":"终止任务","collab.terminateWorkerConfirm":"要终止“{name}”吗?该执行者当前尚未回报的进度可能会丢失。","collab.terminateWorkerFailed":"终止任务失败","collab.reconnect":"连接断开,正在重连… 已保留上次任务进度。","collab.reconnectIn":"{n} 秒后重试","collab.stRunning":"执行中","collab.stReported":"已回报","collab.stPaused":"已暂停","collab.stFailed":"遇到问题","collab.stTerminated":"已终止","collab.summaryRunning":"正在处理中…","collab.summaryWait":"等待回报","collab.taskFallback":"任务 {n}","collab.timeJust":"刚刚","collab.timeSec":"{n} 秒前","collab.timeMin":"{n} 分钟前","collab.timeHr":"{n} 小时前","collab.timeDay":"{n} 天前","page.token.title":"用量","page.token.sub":"每会话与累计用量及缓存率","status.connecting":"正在连接…","status.ready":"服务在线","status.running":"处理中","status.disconnected":"服务离线","status.stopped":"已停止","status.idle":"待命","conv.emptyList":"暂无会话,点「+ 新对话」开始","conv.defaultTitle":"新对话","err.bridge":"服务未响应","err.newSession":"新建会话失败","err.poll":"轮询失败","err.stop":"停止失败","err.interruptTimeout":"等待上一轮停止超时,请稍后再试","sys.interruptPrev.hint":"已停止上一轮,正在处理新消息","chat.interrupting":"正在停止上一轮…","chat.sessionLoading":"正在加载会话…","sys.stopRequested":"已请求停止","slash.help":`可用命令: +/new 新会话 /clear 清屏 /stop 停止 /settings 设置`,"slash.unknown":"未知命令","upload.hint":"上传文件:选择 / 拖拽 / 粘贴","upload.button":"上传文件","upload.tooLarge":"文件过大或数量超限","upload.empty":"跳过空文件","upload.failed":"上传失败","err.charLimit":"已达字数上限({n}),发送时将自动截断","err.charLimitReached":"已达字数上限({n})","err.numMax":"不能超过 {n}","file.openFailed":"无法打开文件","file.kindGeneric":"文件","file.kindDoc":"文档","file.kindSheet":"表格","file.kindSlide":"幻灯片","file.kindCode":"代码","file.kindArchive":"压缩包","file.kindAudio":"音频","file.kindVideo":"视频","upload.removeTitle":"移除","upload.dropHint":"松开以上传文件","lightbox.closeTitle":"关闭","fold.thinking":"思考","fold.tool":"工具调用","fold.toolResult":"工具结果","fold.llm":"LLM Running","fold.turn":"第 {n} 轮","plan.header":"计划 ({done}/{total})","plan.complete":"✓ 计划完成 ({n}/{n})","plan.running":"计划执行中","plan.completeTitle":"计划完成","plan.placeholder":"计划模式已激活","plan.waiting":"等待写入 {path} …","plan.overflow":"还有 {n} 项","plan.current":"当前","plan.collapse":"收起","plan.expand":"展开","plan.details":"详情","plan.capsuleRunning":"运行中","plan.capsuleComplete":"已完成","timing.elapsed":"已运行 {t}","chip.plan":"Plan","chip.auto":"Auto","ch.wechat":"微信","ch.wecom":"企业微信","ch.lark":"飞书","ch.dingtalk":"钉钉","ch.qq":"QQ","ch.telegram":"Telegram","ch.discord":"Discord","ch.loading":"加载中…","ch.empty":"未发现 IM 进程脚本","ch.logEmpty":"暂无日志","err.channelLoad":"加载失败","err.channelStart":"启动失败","err.channelStop":"停止失败","err.mykeyImport":"导入模型配置失败","err.mykeyExport":"导出模型配置失败","err.channelNotConfigured":"请先在密钥配置中完成该平台设置","sys.channelStarted":"已启动","sys.channelStopped":"已停止","sys.bridgeDisconnecting":"正在断开本地连接","modal.channelLogs":"进程日志","modal.mykeyConfig":"密钥配置","sys.configSaved":"配置已保存","sys.mykeyImported":"模型配置已导入","sys.mykeyExported":"模型配置已导出","st.starting":"启动中…","st.stopping":"停止中…","st.online":"在线","st.offline":"离线","st.error":"错误","st.running":"运行中","st.stopped":"已停止","st.abnormal":"异常","st.warning":"警告","err.portBusy":"端口被占用,已自动重连","err.conductorCrash":"内部线程异常退出","err.missingModule":"缺少依赖模块","err.connRefused":"连接被拒绝,将自动重试","err.timeout":"连接超时","err.apiKeyInvalid":"API Key 无效或已过期","err.modelNotFound":"模型不存在或不可用","err.rateLimit":"请求频率超限,请稍后重试","err.quotaExceeded":"额度不足","err.processCrash":"后台进程异常退出","act.configure":"配置","act.logs":"日志","act.restart":"重启","act.stop":"停止","act.start":"启动","act.disconnect":"断开","act.copy":"复制","act.copied":"已复制","act.copyTex":"TeX","act.send":"发送","proc.imbotWechat":"imbot · 微信","proc.imbotDing":"imbot · 钉钉","proc.bridge":"本地连接","proc.bridgeSummary":"连接桌面应用与本地运行环境","proc.bridgeTip":"保持桌面应用与本地运行环境通信","proc.scheduler":"定时任务","proc.schedulerSummary":"按计划自动执行任务","proc.schedulerTip":"在设定时间自动触发并执行任务","proc.conductor":"指挥家","proc.conductorSummary":"异步处理多步骤任务","proc.conductorTip":"通过异步对话拆解任务、分派执行,并持续跟进进度","proc.runtimeComponent":"运行组件","proc.runtimeComponentSummary":"本地运行环境中持续工作的组件","proc.runtimeComponentTip":"查看该组件的状态、日志与控制项","cm.scheduling":"调度中","cm.running":"执行中","cm.idleSt":"空闲","cm.master":"已派 3 子任务","cm.w1":"子任务:抓取数据","cm.w2":"子任务:复核结果","cm.sub":"等待派单","tok.total":"累计","tok.cost":"缓存率","tok.today":"今日","tok.tabAll":"会话","tok.tabConductor":"指挥家","tok.condTotal":"指挥家累计","tok.condCurrent":"指挥家本次","tok.condTip":"指挥家消耗不计入会话累计","tok.condOffline":"指挥家服务离线","tok.disclaimer":"不同 API 网站的计费价格可能会有差异,请以实际网站为准。","tok.colSession":"会话","tok.colIn":"输入","tok.colOut":"输出","tok.colCacheW":"缓存写入","tok.colCache":"缓存读取","tok.colCost":"成本","tok.from":"从","tok.to":"到","tok.reset":"重置","tok.noData":"暂无记录","tok.deleted":"此会话已删除","tok.pricingUnknown":"⚠ 此模型计费规则尚未明确,按默认估算","tok.priceInput":"输入: $","tok.priceOutput":"输出: $","tok.priceCacheW":"缓存写入: $","tok.priceCacheR":"缓存读取: $","presetPrompt.goal":"进入 Goal 模式:读 L3 goal mode SOP,自主达成我接下来描述的目标。","presetPrompt.plan":"进入 Plan 模式:先读 memory/plan_sop.md,按其中「探索→规划→执行→验证」流程,等我接下来描述要做的任务。","presetPrompt.autonomous":"🤖 进入自主行动模式:阅读 memory/autonomous_operation_sop.md,按 SOP 选取或规划任务,独立执行并产出报告。","presetPrompt.hive":"启动 Goal Hive 模式:按 hive SOP 拉起多个 worker 协同完成我接下来的目标。","presetPrompt.review":"进入监察者模式:对刚才的产出严格挑刺、逐项复核并报告问题。","presetPrompt.findwork":"按照自主行动的规划部分,充分分析我的情况,给我生成一批 TODO,务必让我感兴趣。","presetPrompt.mine":"抓取本周的 git 提交并写一份周报。","ask.banner":"应用正在等待你的回答","ask.replyHint":"在下方输入框回复","ask.placeholderOpen":"在此输入你的回答… (Enter 发送)","session.rename":"重命名","session.pin":"置顶","session.unpin":"取消置顶","session.delete":"删除","session.deleteConfirm":"确定删除这个会话吗?","bridge.connected":"已连接","bridge.connecting":"连接中","bridge.offline":"离线","bridge.offlineHint":"本地连接暂时不可用,请检查连接模式或稍后刷新界面","bridge.staleData":"本地连接已断开,正在显示上次状态","bridge.notRunning":"本地连接尚未建立","bridge.notRunningHint":"请从桌面版打开此页面以管理本地连接","bridge.inferenceReady":"推理就绪","bridge.inferenceConnecting":"推理连接中","bridge.inferenceError":"推理异常","bridge.inferenceOffline":"推理离线","bridge.restart":"重新连接","bridge.refresh":"刷新界面","bridge.openServices":"查看运行状态","bridge.recentActivity":"最近活动","bridge.viewAllLogs":"查看全部日志","bridge.logLineCount":"共 {count} 行","bridge.noActivity":"暂无活动记录","conductor.openPage":"打开指挥家 →","data.title":"数据维护","data.sectionHelp":"数据维护说明","data.sectionTip":"在这里导入或导出密钥配置、记忆与会话;记忆与会话备份默认不包含密钥配置","data.importKey":"导入密钥配置","data.importKeyTip":"从本地配置文件读取模型密钥与接口地址,并替换当前密钥配置","data.importKeyBtn":"导入","data.importKeySuccess":"密钥配置已导入","data.importKeyError":"导入失败","data.exportKey":"导出密钥配置","data.exportKeyTip":"将当前模型密钥与接口地址单独保存为配置文件;文件包含敏感信息,请妥善保管","data.exportKeyBtn":"导出","data.exportKeySuccess":"已导出","data.exportKeyError":"导出失败","data.importData":"导入记忆与会话","data.importDataTip":"导入前会完整备份当前记忆;来源中的同名记忆会覆盖当前版本,回复记录与会话只添加新项,密钥配置不受影响","data.importDataBtn":"选择来源","data.importing":"正在读取…","data.importDataSuccess":"导入完成 — 写入 {memory} 个记忆文件,新增 {responses} 个回复记录和 {sessions} 个会话","data.importDataError":"导入失败","data.importDataInvalid":"无法读取此备份或数据文件夹","data.importSourceTitle":"选择导入来源","data.importSourceDescription":"可以直接导入本应用生成的备份文件,也可以从旧数据文件夹迁移。","data.importBackupBtn":"选择备份文件","data.importFolderBtn":"选择旧数据文件夹","data.importBackupPickerTitle":"选择数据备份","data.importFolderPickerTitle":"选择旧数据文件夹","data.importConfirmTitle":"导入这些数据?","data.importConfirmBtn":"导入","data.importExportedAt":"备份时间","data.importSource":"数据来源","data.importContents":"包含内容","data.importContentsValue":"{memory} 个记忆文件、{sessions} 个会话、{responses} 个回复记录","data.importMergeNotice":"导入开始前会完整备份当前记忆。来源中的同名记忆会覆盖当前版本;回复记录和会话只添加新项,重复项保留当前数据。","data.importLegacySource":"旧数据文件夹","data.maintenanceBlocked":"请先停止所有运行中的会话和受管理服务,再导入或导出数据。当前会话状态:{sessions};运行服务:{services}。","data.maintenanceBlockedServer":"数据操作未开始:仍有 {sessions} 个会话或 {services} 个受管理服务在运行。请停止后重试。","data.externalProcessWarning":"导入前还应停止使用同一数据文件夹的其他 GenericAgent 命令行、终端进程和自动化;桌面应用无法暂停这些外部进程。","data.importResultTitle":"导入完成","data.importResultMemory":"记忆文件","data.importResultMemoryValue":"已写入 {count} 个(同名文件以来源为准)","data.importResultResponses":"回复记录","data.importResultSessions":"会话","data.importResultAddSkipValue":"新增 {added} 个,跳过 {skipped} 个重复项","data.importResultBackup":"导入前备份","data.importResultNoBackup":"本次无需创建导入前记忆备份","data.importRestoreHint":"如需恢复,请先停止会话、受管理服务及使用同一数据文件夹的外部进程,再从以上目录恢复 memory 文件夹。","data.importNoRestoreNeeded":"本次没有需要预先备份的记忆变更。回复记录和会话仍按只新增规则处理。","data.exportData":"导出记忆与会话","data.exportDataTip":"将当前记忆和历史会话创建为一份备份快照;不会移动或删除原数据,也不包含密钥配置","data.exportDataBtn":"导出","data.exporting":"正在导出…","data.exportDataConfirmTitle":"导出记忆与会话?","data.exportDataConfirmMessage":"导出文件将包含记忆和历史会话,请妥善保管。密钥配置不会包含在内。","data.exportDataConfirmBtn":"选择保存位置","data.exportDataPickerTitle":"保存数据备份","data.exportDataSuccessTitle":"导出完成","data.exportDataSuccessMessage":"备份已保存到:","data.exportDataReveal":"在 Finder 中显示","data.exportDataError":"导出失败","data.exportDataRevealError":"无法在 Finder 中显示此文件","connection.title":"连接模式","connection.sectionHelp":"连接模式说明","connection.sectionTip":"连接模式决定本桌面应用从哪里运行;切换不会复制、移动或合并两边的数据","connection.description":"选择本桌面应用从哪里运行:使用本桌面应用内置的运行环境,或连接你已有的本地仓库。切换后,记忆与会话也会随所选位置切换。","connection.included":"内置运行环境","connection.includedDescription":"使用本桌面应用内置的运行环境,无需另选仓库,开箱即用并支持离线使用","connection.includedTip":"这套运行环境随桌面应用安装,不需要你准备其他仓库;切换到这里后,将使用内置环境中的记忆与会话","connection.local":"本地仓库","connection.localDescription":"连接你在使用桌面版之前已经拥有的本地仓库,继续使用其中的记忆与会话","connection.localTip":"桌面应用会直接连接你选择的本地仓库,不会把仓库复制、移动或合并到内置运行环境","connection.current":"当前使用","connection.currentRepository":"当前仓库","connection.pendingRepository":"将连接到","connection.chooseRepository":"选择本地仓库","connection.changeRepository":"重新选择","connection.repositoryPickerTitle":"选择本地仓库","connection.repositoryValidated":"仓库可用,应用后生效","connection.pendingNotice":"所选模式尚未应用","connection.runningTaskBlock":"请等待当前任务完成后再切换连接模式","connection.apply":"应用并连接","connection.applying":"正在连接…","connection.includedSuccess":"正在使用内置运行环境","connection.localSuccess":"正在使用所选本地仓库","connection.status":"运行状态","connection.statusTip":"显示当前所选运行环境是否可用;详细页面可查看运行组件、日志和控制项","connection.statusReady":"运行正常","connection.statusConnecting":"正在连接","connection.statusUnavailable":"暂时不可用","connection.viewStatus":"查看运行状态","connection.errorInvalid":"无效仓库 — 缺少必要文件","connection.errorIncompatible":"此仓库与当前桌面版不兼容","connection.errorTimeout":"连接超时 — 请检查仓库是否完整","connection.errorGeneric":"无法完成连接,请稍后重试","helpFeedback.title":"帮助与反馈","helpFeedback.communityTitle":"加入官方社群","helpFeedback.communityDescription":"前往项目主页查看最新的官方社群二维码。","helpFeedback.communityAction":"查看社群二维码","helpFeedback.tutorialTitle":"阅读官方教程","helpFeedback.tutorialDescription":"从安装、配置到日常使用,跟随教程逐步了解。","helpFeedback.tutorialAction":"打开官方教程","helpFeedback.maintainersTitle":"联系桌面版维护者","helpFeedback.maintainersDescription":"桌面版使用中遇到问题或有建议,可添加微信联系:","helpFeedback.copy":"复制","helpFeedback.copySuccess":"微信号已复制","helpFeedback.copyError":"复制失败,请手动复制微信号"},Ad={"app.title":"GenericAgent","brand.sub":"","nav.chat":"New Session","nav.services":"Runtime status","nav.channels":"Message channels","nav.status":"Runtime status","nav.collab":"Conductor","nav.token":"Usage","foot.settings":"Settings","foot.runtimeManagement":"Runtime management","foot.ver":"GenericAgent","chat.startTitle":"Start a conversation","chat.startSub":"Type a message, or pick a preset","chat.inputPlaceholder":"Type a message…","preset.butler.t":"Conductor","preset.butler.d":"Auto-decompose complex tasks; just check progress and briefings","preset.plan.t":"Plan mode","preset.plan.d":"Load Plan SOP — explore→plan→execute→verify","preset.goal.t":"Goal mode","preset.goal.d":"Set a goal, run autonomously","preset.autonomous.t":"Autonomous mode","preset.autonomous.d":"Plan/execute tasks per SOP and produce reports (same as reflect/autonomous.py)","preset.hive.t":"Hive","preset.hive.d":"Multi-worker collaboration","preset.review.t":"Deep review","preset.review.d":"Strict quality check","preset.findwork.t":"Find me work","preset.findwork.d":"Analyze my context and suggest a batch of interesting TODOs","preset.mine.t":"My · Weekly","preset.mine.d":"Custom: weekly report from commits","preset.add.t":"Custom","preset.add.d":"Save any prompt as a function","composer.placeholder":"What are we building?","composer.placeholder.new.0":"What are we building? @ mention files · / invoke skills","composer.placeholder.new.1":"Give me a task","composer.placeholder.new.2":"What's on your mind?","composer.placeholder.new.3":"Describe what you need","composer.placeholder.new.4":"What should we tackle?","composer.placeholder.new.5":"Ask anything","composer.placeholder.new.6":"Start with a goal","composer.placeholder.followUp.0":"Send a follow-up","composer.placeholder.followUp.1":"Add more context","composer.placeholder.followUp.2":"Refine the request","composer.placeholder.followUp.3":"What's next?","composer.placeholder.followUp.4":"Keep it going","composer.placeholder.reconnecting":"Reconnecting…","search.placeholder":"Search chats…","search.noResults":"No matching chats","conv.new":"New chat","section.sessions":"Sessions","ctx.pin":"Pin","ctx.unpin":"Unpin","ctx.rename":"Rename","ctx.del":"Delete","common.close":"Close","common.more":"More","common.optional":"Optional","common.save":"Save","common.cancel":"Cancel","common.confirm":"Confirm","common.edit":"Edit","common.delete":"Delete","common.done":"Done","modal.preset":"Presets","modal.addModel":"Add model","modal.editModel":"Edit model","modal.settings":"Settings","modal.features":"Features","modal.customPreset":"Custom preset","modal.editCustomPreset":"Edit task","customPreset.titlePh":'Title, e.g. "Weekly report"',"customPreset.promptPh":"Prompt body — sent as the message when clicked","customPreset.empty":"Title and Prompt cannot be empty","customPreset.removeTitle":"Delete","customPreset.editTitle":"Edit","builtinPreset.restoreBtn":"Restore defaults","set.appearance":"Appearance","set.plainUi":"Plain","set.fontSize":"Chat font size","set.lang":"Language","set.model":"Model configuration","set.addModel":"Add model","set.features":"Features","set.importMykey":"Import key configuration","set.exportMykey":"Export current model config","set.serviceManager":"Runtime status","shortcut.askConfirm":"Create a desktop shortcut for GenericAgent?","appearance.light":"Light","appearance.dark":"Dark","set.noModels":"No models yet — add one below","set.current":"Active","lang.zh":"简体中文","lang.en":"English","model.name":"Alias","model.namePh":"Optional, for your own reference","model.apikey":"API Key","model.apikeyPh":"Enter API Key","model.apikeyKeep":"Leave blank to keep the current key","model.apibase":"API URL","model.apibasePh":"Enter API URL","model.protocol":"Protocol","model.protocolPick":"Select…","model.protocolOai":"OpenAI-compatible (chat/completions)","model.protocolClaude":"Anthropic (Claude /v1/messages)","model.stream":"Response","model.streamOn":"Stream","model.streamOff":"Non-stream","model.model":"Model ID","model.modelPh":"Enter model identifier","model.modelHint":"Must match the model field in your provider docs exactly","model.retries":"Retries","model.connTimeout":"Connect (s)","model.readTimeout":"Read (s)","model.save":"Save","model.auto":"Auto","model.menuLabel":"Select model","model.aggregation":"Default group","model.aggregationShort":"Default","model.aggregationDesc":"Tries in order, switches to the next on failure","model.configurationHelp":"About model configuration","model.configurationTip":"Set the default model for new sessions; you can still switch models from the composer for an individual session","model.aggregationTip":"The default group tries models in list order and automatically moves to the next when one is unavailable","model.emptyMixin":"No models added yet","model.addToMixin":"Add to default group","model.inMixin":"In default group","model.removeFromMixin":"Remove from group","model.alreadyInMixin":"Already in the group","model.dragReorder":"Drag to reorder","model.routeProvider":"Provider","model.routeCustom":"Custom","model.selectProvider":"Select provider","model.providerLocked":"Set by provider preset (read-only)","model.advanced":"Advanced","model.getKey":"Get API Key →","pq.title":"Quick connect a model","pq.sub":"Add your API key to get started","pq.toggle":"Expand / collapse","pq.deepseekDesc":"DeepSeek · Open Platform","pq.qwenDesc":"Alibaba Cloud Bailian · Qwen","pq.doubaoDesc":"Volcengine · Ark Platform","pq.minimaxDesc":"MiniMax · Open Platform","pq.zhipuDesc":"Zhipu AI · GLM Platform","pq.kimiDesc":"Moonshot AI · Developer Platform","pq.stepfunDesc":"StepFun · Open Platform","guide.step1":"Open the link, sign in, then create & copy your API key","guide.step2":'Paste the key into the "API Key" field below',"guide.step3":"Click Save — then pick it from the model list","guide.prefillTip":"API base, protocol and model are pre-filled — edit if needed","guide.getKey":"Get your {name} API key","guide.copy":"Copy link","guide.copied":"Link copied","err.modelSave":"Save failed","err.modelRequired":"Model, API Key and base URL are required","err.modelDelete":"Delete failed","err.modelDeleteLast":"At least one model is required","err.mixinFailed":"Operation failed","confirm.modelDelete":"Delete this model profile?","page.services.title":"Runtime status","page.services.sub":"View message channels and the status, logs, and controls for components in the local environment","svc.colName":"Runtime component","svc.colStatus":"Status","svc.colPid":"PID","svc.colMemory":"Memory (MB)","svc.colCpu":"CPU (%)","svc.colActions":"Actions","svc.empty":"No runtime components","page.channels.title":"Message channels","page.channels.sub":"Manage message channels and view their status and logs","page.status.title":"Runtime status","page.status.sub":"View status, logs, and controls for components in the local environment","page.collab.title":"Conductor","page.collab.sub":"Describe a goal — split, delegate, and follow up","collab.progressTitle":"Progress","collab.progressEmpty":"No tasks running yet. After you describe a goal to Conductor, split tasks will appear here.","collab.placeholder":"Describe the goal you want to accomplish","collab.guideTitle":"Tell Conductor what you want done","collab.guideWhen":"Best for multi-step goals that take a while. For everyday chat and quick questions, use Chat in the sidebar.","collab.guideStep1t":"Describe your goal","collab.guideStep1d":"Write what you want done in the chat box and send it to Conductor","collab.guideStep2t":"Auto breakdown","collab.guideStep2d":"Conductor breaks down, assigns, monitors, and coordinates","collab.guideStep3t":"Summary","collab.guideStep3d":"Conductor delivers a briefing based on execution status","collab.guideStep4t":"Adjust anytime","collab.guideStep4d":"Add requirements or details anytime — Conductor handles them","collab.chipProgress":"How is it going?","collab.chipPause":"Pause current tasks","collab.chipSummary":"Summarize progress so far","collab.showProgressTitle":"View task progress","collab.statRunning":"Running","collab.statDone":"Done","collab.plusMenu":"More actions","collab.switchMode":"Switch mode","collab.typing":"Conductor is working","collab.offline":"The Conductor service is temporarily unavailable. Try again shortly.","collab.offlineTitle":"Conductor Offline","collab.offlineSub":"Conductor is temporarily unavailable. Check your connection and try again.","collab.retry":"Retry","collab.terminateWorker":"Terminate task","collab.terminateWorkerConfirm":"Terminate “{name}”? Current progress from this worker may be lost.","collab.terminateWorkerFailed":"Failed to terminate the task","collab.reconnect":"Disconnected — reconnecting… Your last progress is kept.","collab.reconnectIn":"Retry in {n}s","collab.stRunning":"Running","collab.stReported":"Reported","collab.stPaused":"Paused","collab.stFailed":"Issue","collab.stTerminated":"Ended","collab.summaryRunning":"Working…","collab.summaryWait":"Awaiting report","collab.taskFallback":"Task {n}","collab.timeJust":"just now","collab.timeSec":"{n}s ago","collab.timeMin":"{n}m ago","collab.timeHr":"{n}h ago","collab.timeDay":"{n}d ago","page.token.title":"Usage","page.token.sub":"Per-session and total usage & cache rate","status.connecting":"Connecting…","status.ready":"Service online","status.running":"Working…","status.disconnected":"Service offline","status.stopped":"Stopped","status.idle":"Standby","conv.emptyList":'No chats yet — click "+ New chat"',"conv.defaultTitle":"New chat","err.bridge":"Service not responding","err.newSession":"Failed to create session","err.poll":"Polling failed","err.stop":"Stop failed","err.interruptTimeout":"Timed out waiting for the previous reply to stop — try again","sys.interruptPrev.hint":"Previous reply stopped — processing new message","chat.interrupting":"Stopping previous reply…","chat.sessionLoading":"Loading conversation…","sys.stopRequested":"Stop requested","slash.help":`Commands: +/new new chat /clear clear /stop stop /settings settings`,"slash.unknown":"Unknown command","upload.hint":"Upload file: pick / drag / paste","upload.button":"Upload file","upload.tooLarge":"File too large or limit reached","upload.empty":"Skipped empty file","upload.failed":"Upload failed","err.charLimit":"Character limit reached ({n}), text will be truncated on send","err.charLimitReached":"Character limit reached ({n})","err.numMax":"Cannot exceed {n}","file.openFailed":"Cannot open file","file.kindGeneric":"File","file.kindDoc":"Document","file.kindSheet":"Spreadsheet","file.kindSlide":"Slides","file.kindCode":"Code","file.kindArchive":"Archive","file.kindAudio":"Audio","file.kindVideo":"Video","upload.removeTitle":"Remove","upload.dropHint":"Drop to upload files","lightbox.closeTitle":"Close","fold.thinking":"Thinking","fold.tool":"Tool call","fold.toolResult":"Tool result","fold.llm":"LLM Running","fold.turn":"Turn {n}","plan.header":"Plan ({done}/{total})","plan.complete":"✓ Plan complete ({n}/{n})","plan.running":"Running plan","plan.completeTitle":"Plan complete","plan.placeholder":"Plan mode activated","plan.waiting":"waiting for {path} …","plan.overflow":"+{n} more","plan.current":"Now","plan.collapse":"Collapse","plan.expand":"Expand","plan.details":"Details","plan.capsuleRunning":"Running","plan.capsuleComplete":"Done","timing.elapsed":"Elapsed {t}","chip.plan":"Plan","chip.auto":"Auto","ch.wechat":"WeChat","ch.wecom":"WeCom","ch.lark":"Lark","ch.dingtalk":"DingTalk","ch.qq":"QQ","ch.telegram":"Telegram","ch.discord":"Discord","ch.loading":"Loading…","ch.empty":"No IM process scripts found","ch.logEmpty":"No log output yet","err.channelLoad":"Failed to load","err.channelStart":"Start failed","err.channelStop":"Stop failed","err.mykeyImport":"Failed to import model config","err.mykeyExport":"Failed to export model config","err.channelNotConfigured":"Complete this platform setup in Key configuration first","sys.channelStarted":"Started","sys.channelStopped":"Stopped","sys.bridgeDisconnecting":"Disconnecting from the local runtime","modal.channelLogs":"Process logs","modal.mykeyConfig":"Key configuration","sys.configSaved":"Configuration saved","sys.mykeyImported":"Model config imported","sys.mykeyExported":"Model config exported","st.starting":"Starting…","st.stopping":"Stopping…","st.online":"Online","st.offline":"Offline","st.error":"Error","st.running":"Running","st.stopped":"Stopped","st.abnormal":"Error","st.warning":"Warning","err.portBusy":"Port was busy, reconnected","err.conductorCrash":"Internal thread crashed","err.missingModule":"Missing module","err.connRefused":"Connection refused, retrying","err.timeout":"Connection timed out","err.apiKeyInvalid":"API key invalid or expired","err.modelNotFound":"Model not found or unavailable","err.rateLimit":"Rate limited, try again later","err.quotaExceeded":"Quota exceeded","err.processCrash":"Background process crashed","act.configure":"Configure","act.logs":"Logs","act.restart":"Restart","act.stop":"Stop","act.start":"Start","act.disconnect":"Disconnect","act.copy":"Copy","act.copied":"Copied","act.copyTex":"TeX","act.send":"Send","proc.imbotWechat":"imbot · WeChat","proc.imbotDing":"imbot · DingTalk","proc.bridge":"Local connection","proc.bridgeSummary":"Connects the desktop app to the local runtime","proc.bridgeTip":"Keeps the desktop app and local runtime communicating","proc.scheduler":"Scheduled tasks","proc.schedulerSummary":"Runs tasks on schedule","proc.schedulerTip":"Triggers and runs tasks at configured times","proc.conductor":"Conductor","proc.conductorSummary":"Handles multi-step work asynchronously","proc.conductorTip":"Uses async conversations to break down, delegate, and follow through on tasks","proc.runtimeComponent":"Runtime component","proc.runtimeComponentSummary":"A component that runs in the local environment","proc.runtimeComponentTip":"View this component’s status, logs, and controls","cm.scheduling":"Scheduling","cm.running":"Running","cm.idleSt":"Idle","cm.master":"Dispatched 3 subtasks","cm.w1":"Subtask: fetch data","cm.w2":"Subtask: review results","cm.sub":"Waiting for tasks","tok.total":"Total","tok.cost":"Cache rate","tok.today":"Today","tok.tabAll":"Chat","tok.tabConductor":"Conductor","tok.condTotal":"Conductor Total","tok.condCurrent":"Conductor Current","tok.condTip":"Conductor usage is not included in chat totals","tok.condOffline":"Service offline","tok.disclaimer":"Pricing may vary by API provider. Please refer to the actual website.","tok.colSession":"Session","tok.colIn":"Input","tok.colOut":"Output","tok.colCacheW":"Cache write","tok.colCache":"Cache read","tok.colCost":"Cost","tok.from":"From","tok.to":"To","tok.reset":"Reset","tok.noData":"No records","tok.deleted":"Session deleted","tok.pricingUnknown":"⚠ Pricing not confirmed, using defaults","tok.priceInput":"Input: $","tok.priceOutput":"Output: $","tok.priceCacheW":"Cache write: $","tok.priceCacheR":"Cache read: $","presetPrompt.goal":"Enter Goal mode: read the L3 goal-mode SOP and autonomously achieve the goal I describe next.","presetPrompt.plan":"Enter Plan mode: first read memory/plan_sop.md, follow its explore→plan→execute→verify flow, and wait for the task I describe next.","presetPrompt.autonomous":"🤖 Enter autonomous mode: read memory/autonomous_operation_sop.md, follow the SOP to pick or plan a task, execute independently, and produce a report.","presetPrompt.hive":"Start Goal Hive mode: per the hive SOP, spawn multiple workers to collaboratively achieve the goal I describe next.","presetPrompt.review":"Enter reviewer mode: strictly scrutinize the previous output, review item by item and report issues.","presetPrompt.findwork":"Following the autonomous planning section, analyze my situation thoroughly and generate a batch of TODOs that genuinely interest me.","presetPrompt.mine":"Collect this week's git commits and write a weekly report.","ask.banner":"The app is waiting for your answer","ask.replyHint":"Reply in the input below","ask.placeholderOpen":"Type your answer here… (Enter to send)","session.rename":"Rename","session.pin":"Pin","session.unpin":"Unpin","session.delete":"Delete","session.deleteConfirm":"Delete this session?","bridge.connected":"Connected","bridge.connecting":"Connecting","bridge.offline":"Offline","bridge.offlineHint":"The local connection is temporarily unavailable. Check Connection mode or refresh the interface shortly.","bridge.staleData":"Local connection lost — showing the last known state","bridge.notRunning":"Local connection has not been established","bridge.notRunningHint":"Open this page in the desktop app to manage the local connection","bridge.inferenceReady":"Inference ready","bridge.inferenceConnecting":"Connecting","bridge.inferenceError":"Inference error","bridge.inferenceOffline":"Inference offline","bridge.restart":"Reconnect","bridge.refresh":"Refresh interface","bridge.openServices":"View runtime status","bridge.recentActivity":"RECENT ACTIVITY","bridge.viewAllLogs":"View all logs","bridge.logLineCount":"{count} lines","bridge.noActivity":"No recent activity","conductor.openPage":"Open Conductor →","data.title":"Data management","data.sectionHelp":"About data management","data.sectionTip":"Import or export key configuration, memory, and sessions here; memory and session backups do not include key configuration by default","data.importKey":"Import key config","data.importKeyTip":"Read model keys and endpoints from a local config file and replace the current key configuration","data.importKeyBtn":"Import","data.importKeySuccess":"Key config imported","data.importKeyError":"Import failed","data.exportKey":"Export key config","data.exportKeyTip":"Save current model keys and endpoints as a separate config file; the file contains sensitive information, so store it securely","data.exportKeyBtn":"Export","data.exportKeySuccess":"Exported","data.exportKeyError":"Export failed","data.importData":"Import memory and sessions","data.importDataTip":"The current memory is fully backed up first; source memory overwrites same-name files, while response records and sessions are add-only. Key configuration is unchanged","data.importDataBtn":"Choose source","data.importing":"Reading…","data.importDataSuccess":"Import complete — {memory} memory files written, {responses} response records and {sessions} sessions added","data.importDataError":"Import failed","data.importDataInvalid":"This backup or data folder could not be read","data.importSourceTitle":"Choose an import source","data.importSourceDescription":"Import a backup created by this app, or migrate from an older data folder.","data.importBackupBtn":"Choose backup file","data.importFolderBtn":"Choose older data folder","data.importBackupPickerTitle":"Choose a data backup","data.importFolderPickerTitle":"Choose an older data folder","data.importConfirmTitle":"Import this data?","data.importConfirmBtn":"Import","data.importExportedAt":"Backup time","data.importSource":"Data source","data.importContents":"Contents","data.importContentsValue":"{memory} memory files, {sessions} sessions, {responses} response records","data.importMergeNotice":"Current memory is fully backed up before import. Source memory overwrites same-name files; response records and sessions are add-only, so current duplicates are kept.","data.importLegacySource":"Older data folder","data.maintenanceBlocked":"Stop every running session and managed service before importing or exporting data. Session state: {sessions}; running services: {services}.","data.maintenanceBlockedServer":"The data operation did not start: {sessions} sessions or {services} managed services are still running. Stop them and try again.","data.externalProcessWarning":"Before importing, also stop other GenericAgent command-line or terminal processes and automations that use the same data folder. The desktop app cannot pause those external processes.","data.importResultTitle":"Import complete","data.importResultMemory":"Memory files","data.importResultMemoryValue":"{count} written (source wins for same-name files)","data.importResultResponses":"Response records","data.importResultSessions":"Sessions","data.importResultAddSkipValue":"{added} added, {skipped} duplicates skipped","data.importResultBackup":"Pre-import backup","data.importResultNoBackup":"No pre-import memory backup was required","data.importRestoreHint":"To restore, first stop sessions, managed services, and external processes using this data folder, then restore the memory folder from the directory above.","data.importNoRestoreNeeded":"This import had no memory change that required a prior backup. Response records and sessions still followed the add-only rule.","data.exportData":"Export memory and sessions","data.exportDataTip":"Create a backup snapshot of current memory and session history; original data stays in place and key configuration is not included","data.exportDataBtn":"Export","data.exporting":"Exporting…","data.exportDataConfirmTitle":"Export memory and sessions?","data.exportDataConfirmMessage":"The export contains memory and session history. Store it securely. Key configuration is not included.","data.exportDataConfirmBtn":"Choose save location","data.exportDataPickerTitle":"Save data backup","data.exportDataSuccessTitle":"Export complete","data.exportDataSuccessMessage":"Your backup was saved to:","data.exportDataReveal":"Show in Finder","data.exportDataError":"Export failed","data.exportDataRevealError":"This file could not be shown in Finder","connection.title":"Connection mode","connection.sectionHelp":"About connection mode","connection.sectionTip":"Connection mode decides where this desktop app runs from; switching does not copy, move, or merge data between the two locations","connection.description":"Choose where this desktop app runs from: the environment installed with the desktop app or a local repository you already own. Memory and sessions follow the selected location.","connection.included":"Included environment","connection.includedDescription":"Use the environment included with this desktop app, with no repository selection required and offline use supported","connection.includedTip":"This environment is installed with the desktop app, so you do not need to prepare another repository; selecting it uses the memory and sessions stored in the included environment","connection.local":"Local repository","connection.localDescription":"Connect a local repository you already owned before using the desktop app and continue with its memory and sessions","connection.localTip":"The desktop app connects directly to the selected local repository and does not copy, move, or merge it into the included environment","connection.current":"Current","connection.currentRepository":"Current repository","connection.pendingRepository":"Will connect to","connection.chooseRepository":"Choose local repository","connection.changeRepository":"Choose again","connection.repositoryPickerTitle":"Choose a local repository","connection.repositoryValidated":"Repository is available — apply to use it","connection.pendingNotice":"The selected mode has not been applied","connection.runningTaskBlock":"Wait for the current task to finish before switching connection mode","connection.apply":"Apply and connect","connection.applying":"Connecting…","connection.includedSuccess":"Using the included environment","connection.localSuccess":"Using the selected local repository","connection.status":"Runtime status","connection.statusTip":"Shows whether the selected environment is available; open the detailed page to view its components, logs, and controls","connection.statusReady":"Running normally","connection.statusConnecting":"Connecting","connection.statusUnavailable":"Temporarily unavailable","connection.viewStatus":"View runtime status","connection.errorInvalid":"Invalid repository — required files are missing","connection.errorIncompatible":"This repository is incompatible with the current desktop app","connection.errorTimeout":"Connection timed out — check that the repository is complete","connection.errorGeneric":"Could not connect. Try again shortly.","helpFeedback.title":"Help & Feedback","helpFeedback.communityTitle":"Join the official community","helpFeedback.communityDescription":"Visit the project page for the latest official community QR code.","helpFeedback.communityAction":"View community QR code","helpFeedback.tutorialTitle":"Read the official tutorial","helpFeedback.tutorialDescription":"Follow the tutorial from installation and setup through everyday use.","helpFeedback.tutorialAction":"Open official tutorial","helpFeedback.maintainersTitle":"Contact the desktop maintainers","helpFeedback.maintainersDescription":"If you run into an issue or have a suggestion while using the desktop app, contact us on WeChat:","helpFeedback.copy":"Copy","helpFeedback.copySuccess":"WeChat ID copied","helpFeedback.copyError":"Copy failed. Please copy the WeChat ID manually."},Br={zh:$d,en:Ad};function Fd(n,e,t){let r=(Br[n]||Br.zh)[e]??e;if(t)for(const[s,l]of Object.entries(t))r=r.replaceAll(`{${s}}`,String(l));return r}function ce(){const n=H(e=>e.lang);return a.useMemo(()=>({lang:n,t:(e,t)=>Fd(n,e,t)}),[n])}function zd({label:n,count:e,open:t,onToggle:o,onAction:r,defaultOpen:s=!0}){const[l,c]=a.useState(s),u=t??l;function p(){const m=!u;c(m),o==null||o(m)}function d(m){m.stopPropagation(),r==null||r()}return i.jsxs("div",{className:"ga-section-header",onClick:p,children:[i.jsx("span",{className:"ga-section-dot"}),i.jsx("span",{className:"ga-section-label",children:n}),i.jsx("span",{className:"ga-section-count",children:e}),i.jsx("span",{className:`ga-section-chevron${u?" open":""}`,children:i.jsx(Ee,{name:"chevron-right",size:"0.625rem"})}),r&&i.jsx("button",{type:"button",className:"ga-section-action",onClick:d,children:i.jsx(Ee,{name:"add",size:"0.75rem"})})]})}function Bd(n){if(!n)return"";const e=typeof n=="number"?n*1e3:new Date(n).getTime(),t=Date.now()-e,o=Math.floor(t/6e4);if(o<1)return"now";if(o<60)return`${o}m`;const r=Math.floor(o/60);return r<24?`${r}h`:`${Math.floor(r/24)}d`}function Ud({session:n,isActive:e,isWorking:t,onClick:o}){const{t:r}=ce(),s=X(v=>v.renameSession),l=X(v=>v.deleteSession),c=X(v=>v.pinSession),[u,p]=a.useState(!1),[d,m]=a.useState(!1),[f,b]=a.useState(""),y=a.useRef(null);a.useEffect(()=>{var v,O;d&&((v=y.current)==null||v.focus(),(O=y.current)==null||O.select())},[d]);const S=a.useCallback(()=>{b(n.title||""),m(!0),p(!1)},[n.title]),w=a.useCallback(()=>{const v=f.trim();v&&v!==n.title&&s(n.id,v),m(!1)},[f,n.id,n.title,s]),C=a.useCallback(()=>{m(!1)},[]),k=a.useCallback(v=>{v.nativeEvent.isComposing||v.keyCode===229||(v.key==="Enter"?(v.preventDefault(),w()):v.key==="Escape"&&(v.preventDefault(),C()))},[w,C]),_=a.useCallback(()=>{p(!1),setTimeout(()=>c(n.id,!n.pinned),0)},[n.id,n.pinned,c]),x=a.useCallback(()=>{p(!1),setTimeout(()=>{re.confirm({title:r("session.delete"),content:r("session.deleteConfirm"),okType:"danger",onOk:()=>l(n.id)})},0)},[n.id,l,r]),j=i.jsxs(ae.Menu,{className:"ga-session-menu",children:[i.jsxs(ae.Item,{onClick:S,children:[i.jsx(Ee,{name:"edit",size:"0.875rem"}),i.jsx("span",{children:r("session.rename")})]}),i.jsxs(ae.Item,{onClick:_,children:[i.jsx(Ee,{name:"pin",size:"0.875rem"}),i.jsx("span",{children:n.pinned?r("session.unpin"):r("session.pin")})]}),i.jsxs(ae.Item,{type:"danger",onClick:x,children:[i.jsx(Ee,{name:"trash",size:"0.875rem"}),i.jsx("span",{children:r("session.delete")})]})]});return i.jsxs("div",{className:`ga-session-item${e?" active":""}`,onClick:d||u?void 0:o,children:[i.jsxs("span",{className:"ga-session-content",children:[i.jsx("span",{className:`ga-status-dot${t?" working":""}`}),d?i.jsx("input",{ref:y,className:"ga-session-rename-input",value:f,onChange:v=>b(v.target.value),onKeyDown:k,onBlur:w,onClick:v=>v.stopPropagation()}):i.jsx("span",{className:"ga-session-title",children:n.title||"Untitled"})]}),!d&&i.jsxs(i.Fragment,{children:[n.pinned&&i.jsx("span",{className:"ga-session-pin-icon",children:i.jsx(Ee,{name:"pinned",size:"0.875rem"})}),i.jsx("span",{className:"ga-session-age",children:Bd(n.updatedAt)}),i.jsx("span",{className:`ga-session-actions${u?" menu-open":""}`,onClick:v=>v.stopPropagation(),onMouseDown:v=>v.stopPropagation(),children:i.jsx(ae,{trigger:"click",position:"bottomRight",visible:u,onVisibleChange:p,render:j,children:i.jsx("button",{type:"button",className:"ga-session-actions-btn",onClick:v=>v.stopPropagation(),"aria-label":"Session actions",children:i.jsx(Ee,{name:"kebab-vertical",size:"0.875rem"})})})})]})]})}function Vd(n){const e=Ys(n),t=Ve("bridge-ready",()=>n());return()=>{t(),e()}}function Zo(){return a.useSyncExternalStore(Vd,tr,tr)}async function Kd(){const n=await fetch(`${ee}/services/conductor/model`);if(!n.ok)throw new Error(`HTTP ${n.status}`);return(await n.json()).model}async function Wd(n){const e=await fetch(`${ee}/services/conductor/model`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({llmNo:n})});if(!e.ok)throw new Error(`HTTP ${e.status}`);return(await e.json()).model}async function Hd(){const n=await fetch(`${ee}/services/panel`);if(!n.ok)throw new Error(`HTTP ${n.status}`);return(await n.json()).services??[]}async function Zd(n){const e=await fetch(`${ee}/services/start`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({id:n})});if(!e.ok)throw new Error(`HTTP ${e.status}`);const t=await e.json();return{ok:t.ok??!0,service:t.service}}async function qd(n){const e=await fetch(`${ee}/services/stop`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({id:n})});if(!e.ok)throw new Error(`HTTP ${e.status}`);const t=await e.json();return{ok:t.ok??!0,service:t.service}}async function gi(n,e=200){const t=await fetch(`${ee}/services/logs?id=${encodeURIComponent(n)}&tail=${e}`);if(!t.ok)throw new Error(`HTTP ${t.status}`);return(await t.json()).lines??[]}async function Gd(){const n=await fetch(`${ee}/services/mykey`);if(!n.ok)throw new Error(`HTTP ${n.status}`);return(await n.json()).content??""}async function Qd(n){const e=await fetch(`${ee}/services/mykey`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({content:n})});if(!e.ok)throw new Error(`HTTP ${e.status}`);return(await e.json()).ok??!1}async function Yd(){const n=await fetch(`${ee}/services/bridge/exit`,{method:"POST"});if(!n.ok)throw new Error(`HTTP ${n.status}`);return(await n.json()).ok??!1}const Xd=1200,Jd=3e4,eu=5;function tu(n,e){return n==="running"?"running":n==="failed"?"failed":n==="aborted"?"terminated":n==="stopped"&&e.trim()?"reported":"paused"}let nu=0;const Xn=new Map;function Ur(n){const e=String(n.id??"");Xn.has(e)||Xn.set(e,++nu);const t=tu(String(n.status??""),String(n.reply??""));let o=String(n.prompt??"").replace(/^[\s请帮我麻烦]+/u,"").trim();o?(o=(o.split(/[\n。!?.!?]/)[0]||"").trim(),o.length>18&&(o=o.slice(0,18)+"…")):o=`Task #${Xn.get(e)}`;const r=String(n.reply??"").replace(/\s+/g," ").trim(),s=r?r.length>80?r.slice(0,80)+"…":r:t==="running"?"Working…":"Waiting…";return{id:e,title:o,status:t,summary:s,fullReply:String(n.reply??""),updatedAt:n.updated_at}}let Le=null,it=0,Ne=null,at=0,lt=!1;const yi=gt((n,e)=>{function t(){if(Ne&&clearTimeout(Ne),!lt&&at>=eu){n({connectionStatus:"offline"});return}const r=Math.min(Jd,Xd*Math.pow(2,Math.max(0,at-1)));n({connectionStatus:"connecting"}),Ne=setTimeout(()=>e().connect(),r)}function o(r,s){if(s===it)if(r.type==="hello"){const l=(r.chat||[]).map(u=>({id:String(u.id??""),role:u.role||"system",msg:String(u.msg??""),ts:u.ts,read:u.read,files:u.files||[],images:u.images||[]})),c=(r.subagents||[]).map(Ur);n({messages:l,workers:c,conductorTyping:!!r.running,runtimeModel:r.model??null})}else if(r.type==="subagents"){const l=(r.items||[]).map(Ur);n({workers:l})}else if(r.type==="chat"){const l=r.item,c={id:String(l.id??""),role:l.role||"system",msg:String(l.msg??""),ts:l.ts,read:l.read,files:l.files||[],images:l.images||[]};n(u=>{if(c.id&&u.messages.some(d=>d.id===c.id))return u;if(c.role==="user"){const d=c.msg.replace(/\[(Image|File)\s+#\d+\]\s*/g,"").trim();for(let m=u.messages.length-1;m>=0;m--){const f=u.messages[m];if(f._local&&f.role==="user"&&(f.msg.replace(/\[(Image|File)\s+#\d+\]\s*/g,"").trim()===d||f.msg===c.msg)){const y=[...u.messages];return y[m]={...y[m],id:c.id||y[m].id,ts:c.ts??y[m].ts,_local:!1},{messages:y}}}}const p=c.role==="conductor"?!1:u.conductorTyping;return{messages:[...u.messages,c],conductorTyping:p}})}else r.type==="model"&&n({runtimeModel:r.model})}return{connectionStatus:"offline",messages:[],workers:[],conductorTyping:!1,modelConfig:null,runtimeModel:null,connect(){if(Le&&(Le.readyState===WebSocket.OPEN||Le.readyState===WebSocket.CONNECTING))return;Ne&&(clearTimeout(Ne),Ne=null);const r=++it;n({connectionStatus:"connecting"});let s;try{s=new WebSocket(Ea)}catch{at++,t();return}Le=s,s.onopen=()=>{r===it&&(lt=!0,at=0,n({connectionStatus:"ready"}),e().loadModel())},s.onclose=()=>{r===it&&(n({connectionStatus:lt?"connecting":"offline"}),lt||at++,t())},s.onerror=()=>{},s.onmessage=l=>{if(r===it)try{o(JSON.parse(l.data),r)}catch{}}},disconnect(){if(it++,Ne&&(clearTimeout(Ne),Ne=null),Le){const r=Le;Le=null,r.onopen=r.onclose=r.onerror=r.onmessage=null;try{r.close()}catch{}}at=0,lt=!1,n({connectionStatus:"offline",messages:[],workers:[],conductorTyping:!1,runtimeModel:null})},sendMessage(r,s,l){if(!Le||Le.readyState!==WebSocket.OPEN)return;const c={msg:r};s&&s.length>0&&(c.files=s),l&&l.length>0&&(c.images=l),Le.send(JSON.stringify(c));const u={id:`local-${Date.now()}`,role:"user",msg:r,ts:Date.now()/1e3,files:s,images:l,_local:!0};n(p=>({messages:[...p.messages,u],conductorTyping:!0}))},async killWorker(r){const s=await fetch(`${ka}/subagent/${r}`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({action:"kill"})});if(!s.ok)throw new Error(`Failed to terminate worker (${s.status})`)},async loadModel(){try{n({modelConfig:await Kd()})}catch{}},async selectModel(r){const s=e().modelConfig;n({modelConfig:{configured:r,effective:r,fallbackReason:null}});try{n({modelConfig:await Wd(r)})}catch{n({modelConfig:s})}}}});yi.getState().connect();function ou({className:n,...e}){return i.jsx("div",{className:`ga-log-view ${n??""}`,"data-selectable-text":"true",...e})}function Vr({tone:n}){const e={good:"var(--ui-accent, #0053fd)",warn:"#f59e0b",bad:"#cf2d56",muted:"color-mix(in srgb, var(--ui-text-tertiary) 40%, transparent)"};return i.jsx("span",{"aria-hidden":"true",className:n==="warn"?"ga-statusbar-dot--pulse":void 0,style:{display:"inline-block",width:"6px",height:"6px",borderRadius:"50%",background:e[n],flexShrink:0}})}function ru(){return i.jsxs("svg",{width:"12",height:"12",viewBox:"0 0 16 16",fill:"none",children:[i.jsx("path",{d:"M13.5 2.5v4h-4",stroke:"currentColor",strokeWidth:"1.3",strokeLinecap:"round",strokeLinejoin:"round"}),i.jsx("path",{d:"M2.5 8a5.5 5.5 0 0 1 9.3-3.95L13.5 6.5",stroke:"currentColor",strokeWidth:"1.3",strokeLinecap:"round",strokeLinejoin:"round"}),i.jsx("path",{d:"M2.5 13.5v-4h4",stroke:"currentColor",strokeWidth:"1.3",strokeLinecap:"round",strokeLinejoin:"round"}),i.jsx("path",{d:"M13.5 8a5.5 5.5 0 0 1-9.3 3.95L2.5 9.5",stroke:"currentColor",strokeWidth:"1.3",strokeLinecap:"round",strokeLinejoin:"round"})]})}function su(){return i.jsxs("svg",{width:"12",height:"12",viewBox:"0 0 16 16",fill:"none",children:[i.jsx("rect",{x:"2",y:"2",width:"5",height:"5",rx:"0.5",stroke:"currentColor",strokeWidth:"1.3"}),i.jsx("rect",{x:"9",y:"2",width:"5",height:"5",rx:"0.5",stroke:"currentColor",strokeWidth:"1.3"}),i.jsx("rect",{x:"2",y:"9",width:"5",height:"5",rx:"0.5",stroke:"currentColor",strokeWidth:"1.3"}),i.jsx("rect",{x:"9",y:"9",width:"5",height:"5",rx:"0.5",stroke:"currentColor",strokeWidth:"1.3"})]})}const Kr=[{id:"__bridge__",labelKey:"proc.bridge"},{id:"frontends/conductor.py",labelKey:"proc.conductor"},{id:"reflect/scheduler.py",labelKey:"proc.scheduler"}],Wr=12,iu=3e3;function au({onClose:n}){const{t:e}=ce(),t=Zo(),o=yi(x=>x.connectionStatus),r=Ie(x=>x.setPage),s=a.useRef(null),l=a.useRef(null),[c,u]=a.useState(Kr[0].id),[p,d]=a.useState(null),[m,f]=a.useState(0),b=a.useCallback(async x=>{try{const j=await gi(x,200);f(j.length),d(j.slice(-Wr))}catch{d([]),f(0)}},[]);a.useEffect(()=>(d(null),b(c),l.current=setInterval(()=>b(c),iu),()=>{l.current&&(clearInterval(l.current),l.current=null)}),[c,b]),a.useEffect(()=>{function x(v){var E;const O=(E=s.current)==null?void 0:E.parentElement;O&&!O.contains(v.target)&&n()}function j(v){v.key==="Escape"&&n()}return document.addEventListener("mousedown",x),document.addEventListener("keydown",j),()=>{document.removeEventListener("mousedown",x),document.removeEventListener("keydown",j)}},[n]);const y=t==="ready"?"good":t==="connecting"?"warn":"bad",S=o==="ready"?"good":o==="connecting"?"warn":o==="error"?"bad":"muted",w=e(t==="ready"?"bridge.connected":t==="connecting"?"bridge.connecting":"bridge.offline"),C=e(o==="ready"?"bridge.inferenceReady":o==="connecting"?"bridge.inferenceConnecting":o==="error"?"bridge.inferenceError":"bridge.inferenceOffline"),k=()=>{n(),Ie.getState().setServicesTab("status"),r("services")},_=m>Wr;return i.jsxs("div",{ref:s,id:"ga-runtime-management-panel",className:"ga-bridge-panel","data-slot":"bridge-panel",role:"dialog","aria-label":e("foot.runtimeManagement"),children:[i.jsxs("div",{className:"ga-bridge-panel-header",children:[i.jsxs("div",{className:"ga-bridge-panel-status-rows",children:[i.jsxs("span",{className:"ga-bridge-panel-row ga-bridge-panel-row--primary",children:[i.jsx(Vr,{tone:y}),w]}),i.jsxs("span",{className:"ga-bridge-panel-row ga-bridge-panel-row--secondary",children:[i.jsx(Vr,{tone:S}),C]})]}),i.jsxs("div",{className:"ga-bridge-panel-actions",children:[i.jsx("button",{className:"ga-bridge-panel-action-btn",onClick:()=>{n(),window.location.reload()},title:e("bridge.refresh"),children:i.jsx(ru,{})}),i.jsx("button",{className:"ga-bridge-panel-action-btn",onClick:k,title:e("bridge.openServices"),children:i.jsx(su,{})})]})]}),i.jsxs("div",{className:"ga-bridge-panel-section",children:[i.jsx("div",{className:"ga-bridge-panel-tabs",children:Kr.map(x=>i.jsx("button",{className:`ga-bridge-panel-tab ${c===x.id?"active":""}`,onClick:()=>u(x.id),children:e(x.labelKey)},x.id))}),p===null?i.jsx("div",{className:"ga-bridge-panel-log-empty",children:"…"}):p.length===0?i.jsx("div",{className:"ga-bridge-panel-log-empty",children:e("bridge.noActivity")}):i.jsx(ou,{className:"ga-bridge-panel-log",children:p.join(` +`)}),i.jsxs("div",{className:"ga-bridge-panel-section-foot",children:[_&&i.jsx("span",{className:"ga-bridge-panel-truncated",children:e("bridge.logLineCount",{count:m})}),i.jsxs("button",{className:"ga-bridge-panel-link-btn",onClick:k,children:[e("bridge.viewAllLogs")," →"]})]})]})]})}const lu=[{key:"services",icon:"symbol-misc",textKey:"nav.services"},{key:"collab",icon:"robot",textKey:"nav.collab"},{key:"token",icon:"graph",textKey:"nav.token"}];function cu(){const{activePage:n,setPage:e}=Ie(),t=H(E=>E.open),o=X(E=>E.newSession),r=X(E=>E.sessions),s=X(E=>E.activeSessionId),l=X(E=>E.setActiveSession),c=X(E=>E.runningSessions),{t:u}=ce(),[p,d]=a.useState(!0),[m,f]=a.useState(""),[b,y]=a.useState(!1),[S,w]=a.useState(!1),C=a.useCallback(()=>y(!1),[]),k=a.useCallback(()=>{C(),t()},[C,t]),_=a.useCallback(()=>{w(!1),y(E=>!E)},[]),x=[...r].sort((E,D)=>{if(E.pinned&&!D.pinned)return-1;if(!E.pinned&&D.pinned)return 1;const P=Number(E.updatedAt||E.createdAt||0);return Number(D.updatedAt||D.createdAt||0)-P}),j=m.trim()?x.filter(E=>E.title.toLowerCase().includes(m.trim().toLowerCase())):x;function v(){o(),e("chat")}function O(E){l(E),e("chat")}return i.jsxs("div",{className:"ga-left-sidebar",children:[i.jsxs("nav",{className:"ga-nav-rail","aria-label":"Main navigation",children:[i.jsxs("button",{type:"button",className:"ga-nav-btn",onClick:v,"aria-label":u("nav.chat"),children:[i.jsx("span",{className:"ga-nav-icon",children:i.jsx(Ee,{name:"comment",size:"1rem"})}),i.jsx("span",{className:"ga-nav-label",children:u("nav.chat")})]}),lu.map(E=>i.jsxs("button",{type:"button",className:`ga-nav-btn${n===E.key?" active":""}`,onClick:()=>e(E.key),"aria-label":u(E.textKey),"aria-current":n===E.key?"page":void 0,children:[i.jsx("span",{className:"ga-nav-icon",children:i.jsx(Ee,{name:E.icon,size:"1rem"})}),i.jsx("span",{className:"ga-nav-label",children:u(E.textKey)})]},E.key))]}),i.jsx("div",{className:"ga-sidebar-search",children:i.jsx(ut,{prefix:i.jsx(ti,{style:{fontSize:14}}),placeholder:u("search.placeholder"),size:"small",value:m,onChange:f})}),!m&&i.jsx(zd,{label:u("section.sessions"),count:r.length,open:p,onToggle:d,onAction:v}),i.jsx("div",{className:"ga-session-section",children:(m||p)&&(j.length===0?i.jsx("div",{className:"ga-session-empty",children:i.jsx("p",{children:u(m?"search.noResults":"conv.emptyList")})}):i.jsx("div",{className:"ga-session-list",children:j.map(E=>i.jsx(Ud,{session:E,isActive:E.id===s,isWorking:c.has(E.id),onClick:()=>O(E.id)},E.id))}))}),i.jsxs("div",{className:"ga-sidebar-footer",children:[i.jsx($e,{content:u("foot.settings"),position:"top",clickToHide:!0,children:i.jsx("button",{type:"button",className:"ga-sidebar-footer-btn",onClick:k,"aria-label":u("foot.settings"),children:i.jsx(Ee,{name:"settings-gear",size:"1rem"})})}),i.jsxs("div",{className:"ga-sidebar-footer-anchor",children:[i.jsx($e,{content:u("foot.runtimeManagement"),position:"top",visible:S&&!b,onVisibleChange:w,children:i.jsx("button",{type:"button",className:"ga-sidebar-footer-btn",onClick:_,"aria-label":u("foot.runtimeManagement"),"aria-expanded":b,"aria-haspopup":"dialog","aria-controls":"ga-runtime-management-panel",children:i.jsx(Ee,{name:"server-process",size:"1rem"})})}),b&&i.jsx(au,{onClose:C})]})]})]})}const du=24;function uu(){const n=a.useRef(null),[e,t]=a.useState(!0),o=a.useRef(!0),r=a.useRef(0),s=a.useCallback(()=>{const u=n.current;if(!u)return;const p=u.scrollHeight-u.scrollTop-u.clientHeight{const p=n.current;p&&(u==="instant"?p.scrollTop=p.scrollHeight:pu(p,p.scrollHeight-p.clientHeight,170),o.current=!0,t(!0))},[]),c=a.useCallback(()=>{o.current=!1},[]);return a.useEffect(()=>{const u=n.current;if(!u)return;const p=()=>s(),d=new MutationObserver(()=>{o.current&&(cancelAnimationFrame(r.current),r.current=requestAnimationFrame(()=>{u.scrollTop=u.scrollHeight}))});return u.addEventListener("scroll",p,{passive:!0}),d.observe(u,{childList:!0,subtree:!0,characterData:!0}),()=>{u.removeEventListener("scroll",p),d.disconnect(),cancelAnimationFrame(r.current)}},[s]),{scrollRef:n,isAtBottom:e,scrollToBottom:l,stopScroll:c}}function pu(n,e,t){const o=n.scrollTop,r=e-o,s=performance.now();function l(c){const u=c-s,p=Math.min(u/t,1),d=1-Math.pow(1-p,3);n.scrollTop=o+r*d,p<1&&requestAnimationFrame(l)}requestAnimationFrame(l)}function hu(n,e,t,o){a.useEffect(()=>{const r=n.current;if(!r||!o)return;t(),r.scrollTop=r.scrollHeight;let s=0,l=r.scrollHeight,c=0;function u(){if(r){if(c++,r.scrollHeight===l?s++:(s=0,l=r.scrollHeight,r.scrollTop=r.scrollHeight),s>=5||c>=90){e("instant");return}requestAnimationFrame(u)}}requestAnimationFrame(u)},[o,n,e,t])}function mu({children:n}){return i.jsx("div",{"data-slot":"aui_thread-content",children:n})}function yt(n){const e=/^[ \t]*(`{3,})([^\n`]*)[ \t]*$/.exec(n??"");return e?{ticks:e[1].length,tag:e[2]}:null}function bi(n,e){if(/^🛠️ Tool:/.test(n))return!0;if(!(e!=null&&e.forToolResult)){const t=yt(n);if(t&&t.ticks>=5&&t.tag==="")return!0}return!!(/^\*\*LLM Running \(Turn \d+\)/.test(n)||/^/i.test(n))}function xn(n,e,t){for(let o=e;o=0)return null}else{r=e+1,s=n.length;for(let l=e+1;l=0?null:{body:n.slice(o,r).join(` +`),nextLine:r,inFlight:!0}}function yu(n){return n.replace(/^\s*\**LLM Running \(Turn \d+\) \.\.\.\**\s*/i,"")}function bu(n,e){const t=String(n||"").split(` +`),o=[];let r=0,s=0;const l=c=>{c<=r||(o.push(t.slice(r,c).join(` +`)),r=c)};for(;s0)return t.join(` +`);try{const o=JSON.parse(n);if(o!=null&&o.question)return String(o.question)}catch{}return n.trim()}function To(n){const e=[];let t=yu(n);const o=[];t=t.replace(/([\s\S]*?)<\/thinking>/gi,(u,p)=>(o.push(p),` +§§THINK:${o.length-1}§§ +`));const r=[];t=t.replace(/([\s\S]*?)<\/summary>/gi,(u,p)=>(r.push(p),` +§§SUMMARY:${r.length-1}§§ +`));const s=[],l=[];t=bu(t,{onTool(u,p,d){return s.push({name:u,body:p,inFlight:d==null?void 0:d.inFlight}),` +§§TOOL:${s.length-1}§§ +`},onResult(u,p){return l.push({body:u,inFlight:p==null?void 0:p.inFlight}),` +§§RESULT:${l.length-1}§§ +`}}),t=t.replace(/[\s\S]*?<\/function_calls>/gi,u=>(s.push({name:"function_call",body:u}),` +§§TOOL:${s.length-1}§§ +`)),t=t.replace(/[\s\S]*?<\/function_results>/gi,u=>(l.push({body:u}),` +§§RESULT:${l.length-1}§§ +`));const c=t.split(/\n?(§§(?:THINK|TOOL|RESULT|SUMMARY):\d+§§)\n?/);for(const u of c){const p=/^§§THINK:(\d+)§§$/.exec(u);if(p){e.push({type:"thinking",content:o[Number(p[1])]});continue}const d=/^§§TOOL:(\d+)§§$/.exec(u);if(d){const y=s[Number(d[1])];if(y.name==="ask_user"){const S=vu(y.body),w=xu(y.body);e.push({type:"approval",content:w,candidates:S})}else e.push({type:"tool",content:y.body,label:y.name,inFlight:y.inFlight});continue}const m=/^§§RESULT:(\d+)§§$/.exec(u);if(m){const y=l[Number(m[1])];e.push({type:"result",content:y.body,inFlight:y.inFlight});continue}const f=/^§§SUMMARY:(\d+)§§$/.exec(u);if(f){e.push({type:"summary",content:r[Number(f[1])]});continue}const b=u.trim();b&&e.push({type:"prose",content:b})}return e}function Hr(n){return n.map((e,t)=>{const o=To(e),r=o.reduce((s,l)=>s+l.content.length,0);return{index:t,segments:o,weight:r}})}function wu(n){const e=[];let t=0;for(;t{s.stopPropagation(),navigator.clipboard.writeText(n).then(()=>{t(!0),o.current&&clearTimeout(o.current),o.current=setTimeout(()=>t(!1),2e3)})},[n]);return typeof navigator>"u"||!navigator.clipboard?null:i.jsx("button",{"data-slot":"user-bubble-copy",onClick:r,title:e?"Copied":"Copy",children:e?i.jsx("svg",{width:"14",height:"14",viewBox:"0 0 16 16",fill:"none",children:i.jsx("path",{d:"M3 8.5l3 3 7-7",stroke:"currentColor",strokeWidth:"1.5",strokeLinecap:"round",strokeLinejoin:"round"})}):i.jsxs("svg",{width:"14",height:"14",viewBox:"0 0 16 16",fill:"none",children:[i.jsx("rect",{x:"5.5",y:"5.5",width:"7",height:"7",rx:"1",stroke:"currentColor",strokeWidth:"1.2"}),i.jsx("path",{d:"M3.5 10.5v-7a1 1 0 011-1h7",stroke:"currentColor",strokeWidth:"1.2",strokeLinecap:"round"})]})})}const wi=a.memo(function({content:e,msgId:t,images:o,files:r}){const s=a.useRef(null),[l,c]=a.useState(!1),[u,p]=a.useState(!1),d=a.useRef(!1);if(d.current=u,a.useLayoutEffect(()=>{const f=s.current;if(!f)return;const b=new ResizeObserver(()=>{d.current||c(f.scrollHeight>f.clientHeight+2)});return b.observe(f),()=>b.disconnect()},[]),!e&&(!o||o.length===0)&&(!r||r.length===0))return null;const m=Cu(e);return i.jsxs(i.Fragment,{children:[o&&o.length>0&&i.jsx("div",{"data-slot":"user-images",children:o.map((f,b)=>i.jsx("img",{"data-slot":"user-image-thumb",src:f.path.startsWith("data:")?f.path:`${ee}/upload/raw?path=${encodeURIComponent(f.path)}`,alt:f.name},b))}),r&&r.length>0&&i.jsx("div",{"data-slot":"user-files",children:r.map((f,b)=>i.jsxs("div",{"data-slot":"user-file-chip",children:[i.jsx("span",{"data-slot":"user-file-icon",children:ku(f.name)}),i.jsx("span",{"data-slot":"user-file-name",children:f.name}),f.size!=null&&f.size>0&&i.jsx("span",{"data-slot":"user-file-size",children:Su(f.size)})]},b))}),i.jsx("div",{"data-slot":"aui_user-message-root",id:t?`msg-${t}`:void 0,"data-msg-id":t||void 0,"data-role":"user",children:i.jsxs("div",{"data-slot":"user-bubble","data-clamped":l||void 0,"data-expanded":u||void 0,children:[i.jsx(ju,{text:e}),i.jsx("div",{ref:s,"data-slot":"user-bubble-text",children:m?i.jsxs(i.Fragment,{children:[i.jsxs("span",{className:"skill-chip",children:["/",m.id]}),m.rest&&i.jsxs(i.Fragment,{children:[" ",m.rest]})]}):e}),l&&i.jsx("button",{"data-slot":"user-bubble-expand","aria-expanded":u,"aria-label":u?"Collapse":"Expand",onClick:()=>p(f=>!f),children:i.jsx("svg",{viewBox:"0 0 16 16",fill:"none",children:i.jsx("path",{d:"M4 6l4 4 4-4",stroke:"currentColor",strokeWidth:"1.5",strokeLinecap:"round",strokeLinejoin:"round"})})})]})})]})}),Eu=a.memo(function({content:e,isStreaming:t}){const[o,r]=a.useState(null),s=a.useRef(null),l=o!==null?o:t,c=a.useCallback(()=>{r(u=>u===null?!t:!u)},[t]);return a.useEffect(()=>{t&&l&&s.current&&(s.current.scrollTop=s.current.scrollHeight)},[e,t,l]),e.trim()?i.jsxs("details",{"data-slot":"aui_thinking-disclosure",open:l,onToggle:c,children:[i.jsx("summary",{"data-slot":"thinking-summary",children:i.jsx("span",{className:t?"thinking-shimmer":"",children:"Thinking"})}),i.jsx("div",{ref:s,"data-slot":"thinking-body","data-streaming":t||void 0,children:e})]}):null}),kt=new Set,Zr=2048;function Ci(n,e,t){a.useEffect(()=>{if(!(!t||!n.current||kt.has(e))){if(kt.size>=Zr){const o=Array.from(kt).slice(0,Zr/2);for(const r of o)kt.delete(r)}kt.add(e),n.current.animate([{opacity:0,transform:"translateY(0.375rem)"},{opacity:1,transform:"translateY(0)"}],{duration:180,easing:"cubic-bezier(0.16, 1, 0.3, 1)",fill:"both"})}},[])}const Jn=new Map;function qr(n){const e=Math.floor(n/1e3);return e<60?`${e}s`:`${Math.floor(e/60)}m ${e%60}s`}function Ou(n,e){const[,t]=a.useState(0),o=a.useRef(null);a.useEffect(()=>{let s=Jn.get(n);return e&&!s&&(s={start:Date.now()},Jn.set(n,s)),!e&&s&&!s.end&&(s.end=Date.now()),e&&!o.current&&(o.current=setInterval(()=>t(l=>l+1),1e3)),()=>{!e&&o.current&&(clearInterval(o.current),o.current=null)}},[n,e]),a.useEffect(()=>()=>{o.current&&clearInterval(o.current)},[]);const r=Jn.get(n);if(!r)return{elapsed:null,duration:null};if(e){const s=Date.now()-r.start;return{elapsed:qr(s),duration:null}}if(r.end){const s=r.end-r.start;return s<1e3?{elapsed:null,duration:null}:{elapsed:null,duration:qr(s)}}return{elapsed:null,duration:null}}const Pu=a.memo(function({name:e,content:t,inFlight:o,segmentKey:r="",isStreaming:s=!1}){const[l,c]=a.useState(!1),u=a.useRef(null);Ci(u,r,s);const{elapsed:p,duration:d}=Ou(r,o);return i.jsxs("div",{ref:u,"data-slot":"tool-block","data-tool-row":!0,"data-status":o?"running":"success",children:[i.jsxs("div",{"data-slot":"tool-header",onClick:()=>c(!l),children:[o&&i.jsx("span",{"data-slot":"tool-glyph",children:i.jsx("span",{"data-slot":"tool-spinner"})}),i.jsx("span",{"data-slot":"tool-title",children:e}),o&&i.jsx("span",{"data-slot":"tool-dots",children:"…"}),p&&i.jsx("span",{"data-slot":"tool-duration",children:p}),d&&i.jsx("span",{"data-slot":"tool-duration",children:d})]}),l&&t&&i.jsx("pre",{"data-slot":"tool-body",children:t})]})}),_u=a.memo(function({content:e,inFlight:t,segmentKey:o="",isStreaming:r=!1}){const[s,l]=a.useState(!1),c=e.length>200,u=a.useRef(null);return Ci(u,o,r),i.jsxs("div",{ref:u,"data-slot":"tool-block","data-tool-row":!0,"data-status":t?"running":"success",children:[i.jsxs("div",{"data-slot":"tool-header",onClick:()=>c&&l(!s),children:[i.jsx("span",{"data-slot":"tool-title",children:t?"Output…":"Output"}),c&&!s&&i.jsxs("span",{"data-slot":"tool-duration",children:[e.length," chars"]})]}),(s||!c)&&i.jsx("pre",{"data-slot":"tool-body",children:e})]})});function Gr(n){return n<26?String.fromCharCode(65+n):null}function Mu({question:n,answer:e}){return i.jsxs("div",{"data-slot":"approval-card","data-settled":!0,children:[i.jsx("div",{"data-slot":"approval-question",children:n}),i.jsx("div",{"data-slot":"approval-settled",children:e||i.jsx("em",{children:"Skipped"})})]})}const Lu=a.memo(function({question:e,candidates:t}){const o=X(L=>L.sendMessage),[r,s]=a.useState(null),[l,c]=a.useState(""),[u,p]=a.useState(!1),[d,m]=a.useState(!1),[f,b]=a.useState(null),y=a.useRef(null),S=a.useRef(null),w=r??(l.trim()||null),C=t.length>0,k=a.useCallback(L=>{s(L),c("")},[]),_=a.useCallback(async L=>{u||d||(p(!0),await o(L),b(L),m(!0),p(!1))},[u,d,o]),x=a.useCallback(async()=>{u||d||(p(!0),await o(""),b(null),m(!0),p(!1))},[u,d,o]),j=a.useCallback(()=>{w!==null&&_(w)},[w,_]),v=a.useCallback(()=>{s(null)},[]),O=a.useCallback(L=>{c(L.target.value),s(null)},[]),E=a.useCallback(L=>{if(!(L.nativeEvent.isComposing||L.keyCode===229)&&L.key==="Enter"&&!L.shiftKey){L.preventDefault();const z=l.trim();z&&_(z)}},[l,_]);if(a.useEffect(()=>{if(d||u)return;function L(z){var M;if(z.metaKey||z.ctrlKey||z.altKey||z.defaultPrevented)return;const W=document.activeElement;if(W){const Z=W.tagName.toLowerCase();if(Z==="input"||Z==="textarea"||W.isContentEditable)return}const A=z.key.toLowerCase();if(A.length===1&&A>="a"&&A<="z"){const Z=A.charCodeAt(0)-97;Zwindow.removeEventListener("keydown",L)},[d,u,t,r,l,k,_]),d)return i.jsx(Mu,{question:e,answer:f});const D=t.length,P=Gr(D),R=l.trim().length>0&&r===null;return i.jsxs("div",{"data-slot":"approval-card",ref:S,"data-submitting":u||void 0,children:[i.jsx("div",{"data-slot":"approval-question",children:e}),C?i.jsxs("div",{"data-slot":"approval-options",children:[t.map((L,z)=>{const W=Gr(z),A=r===L;return i.jsxs("button",{"data-slot":"approval-option-row","data-selected":A||void 0,disabled:u,onClick:()=>k(L),type:"button",children:[W&&i.jsx("kbd",{"data-slot":"approval-badge","data-active":A||void 0,children:W}),i.jsx("span",{children:L})]},z)}),i.jsxs("div",{"data-slot":"approval-other",children:[P&&i.jsx("kbd",{"data-slot":"approval-badge","data-active":R||void 0,children:P}),i.jsx("textarea",{ref:y,"data-slot":"approval-other-input",placeholder:"Other…",value:l,onChange:O,onFocus:v,onKeyDown:E,disabled:u,rows:1})]})]}):i.jsx("div",{"data-slot":"approval-options",children:i.jsx("textarea",{ref:y,"data-slot":"approval-other-input","data-fullwidth":!0,placeholder:"Type your response…",value:l,onChange:O,onKeyDown:E,disabled:u,rows:1})}),i.jsxs("div",{"data-slot":"approval-actions",children:[i.jsx("button",{type:"button","data-slot":"approval-skip-btn",disabled:u,onClick:x,children:"Skip"}),i.jsxs("button",{type:"button","data-slot":"approval-confirm-btn",disabled:u||w===null,onClick:j,children:[u?i.jsx("span",{"data-slot":"approval-spinner"}):null,"Continue"]})]})]})});function Si(n){const e=Math.floor(n/1e3);return e<60?`${e}s`:`${Math.floor(e/60)}m ${e%60}s`}const Iu=a.memo(function(){const[e,t]=a.useState(0),o=a.useRef(Date.now());return a.useEffect(()=>{const r=setInterval(()=>t(Date.now()-o.current),1e3);return()=>clearInterval(r)},[]),i.jsxs("div",{"data-slot":"stream-indicator",children:[i.jsx("span",{"data-slot":"dither-square"}),i.jsx("span",{"data-slot":"indicator-timer",children:Si(e)})]})}),Tu=a.memo(function({contentLength:e}){const[t,o]=a.useState(!1),[r,s]=a.useState(0),l=a.useRef(e),c=a.useRef(Date.now()),u=a.useRef(null);return a.useEffect(()=>{e!==l.current&&(l.current=e,c.current=Date.now(),u.current=null,o(!1),s(0))},[e]),a.useEffect(()=>{const p=setInterval(()=>{Date.now()-c.current>=2e3&&(u.current||(u.current=c.current+2e3),o(!0),s(Date.now()-u.current))},500);return()=>clearInterval(p)},[]),t?i.jsxs("div",{"data-slot":"stream-indicator","data-stall":!0,children:[i.jsx("span",{"data-slot":"dither-square"}),i.jsxs("span",{"data-slot":"indicator-timer",children:["+",Si(r)]})]}):null}),Ru=a.lazy(async()=>({default:(await Gt(()=>import("./MarkdownPart-Bhe_jloX.js"),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9]))).MarkdownPart})),Nu=a.lazy(async()=>({default:(await Gt(()=>import("./SummaryPart-D48OOFSQ.js"),__vite__mapDeps([10,1,2,3,4,5,6,7,8]))).SummaryPart})),Du=a.memo(function({segments:e,isStreaming:t,messageId:o=""}){if(e.length===0&&t)return i.jsx("div",{"data-slot":"aui_assistant-message-content",children:i.jsx(Iu,{})});if(e.length===0)return null;const r=t?e:e.map(c=>c.inFlight?{...c,inFlight:!1}:c),s=r.reduce((c,u)=>c+u.content.length,0),l=r.some(c=>c.type==="approval");return i.jsxs("div",{"data-slot":"aui_assistant-message-content",children:[r.map((c,u)=>{const p=`${o}-${u}`;switch(c.type){case"prose":return i.jsx(a.Suspense,{fallback:i.jsx("span",{"data-slot":"aui_markdown-loading","aria-busy":"true"}),children:i.jsx(Ru,{content:c.content,isStreaming:t&&u===r.length-1})},u);case"thinking":return i.jsx(Eu,{content:c.content,isStreaming:!!c.inFlight||t},u);case"tool":return i.jsx(Pu,{name:c.label||"tool",content:c.content,inFlight:!!c.inFlight,segmentKey:p,isStreaming:t},u);case"result":return i.jsx(_u,{content:c.content,inFlight:!!c.inFlight,segmentKey:p,isStreaming:t},u);case"summary":return i.jsx(a.Suspense,{fallback:i.jsx("span",{"data-slot":"aui_summary-loading","aria-busy":"true"}),children:i.jsx(Nu,{content:c.content})},u);case"approval":return i.jsx(Lu,{question:c.content,candidates:c.candidates||[]},u);default:return null}}),t&&!l&&i.jsx(Tu,{contentLength:s})]})}),$u=a.memo(function({getMessageText:e}){const[t,o]=a.useState(!1),r=a.useRef(),s=a.useCallback(()=>{const l=e();l&&navigator.clipboard.writeText(l).then(()=>{o(!0),r.current&&clearTimeout(r.current),r.current=setTimeout(()=>o(!1),2e3)})},[e]);return typeof navigator>"u"||!navigator.clipboard?null:i.jsx("div",{"data-slot":"assistant-action-bar",children:i.jsx("button",{"data-slot":"action-bar-btn",onClick:s,title:t?"Copied":"Copy",children:t?i.jsx("svg",{width:"14",height:"14",viewBox:"0 0 16 16",fill:"none",children:i.jsx("path",{d:"M3 8.5l3 3 7-7",stroke:"currentColor",strokeWidth:"1.5",strokeLinecap:"round",strokeLinejoin:"round"})}):i.jsxs("svg",{width:"14",height:"14",viewBox:"0 0 16 16",fill:"none",children:[i.jsx("rect",{x:"5.5",y:"5.5",width:"7",height:"7",rx:"1",stroke:"currentColor",strokeWidth:"1.2"}),i.jsx("path",{d:"M3.5 10.5v-7a1 1 0 011-1h7",stroke:"currentColor",strokeWidth:"1.2",strokeLinecap:"round"})]})})})}),Au=a.memo(function({message:e,isStreaming:t}){const o=a.useMemo(()=>{const l=e.turn_segs;return l&&l.length>0?l.flatMap(c=>To(c)):To(e.content)},[e.content,e.turn_segs]),r=a.useRef(o);r.current=o;const s=a.useCallback(()=>{const l=r.current,c=[];for(const u of l)(u.type==="prose"||u.type==="summary")&&c.push(u.content);return c.join(` + +`)},[]);return i.jsxs("div",{"data-slot":"aui_assistant-message-root","data-role":"assistant","data-streaming":t||void 0,children:[i.jsx(Du,{segments:o,isStreaming:t,messageId:String(e.id)}),i.jsx($u,{getMessageText:s})]})}),Fu=a.memo(function({userMsg:e,assistantMsg:t,isStreaming:o}){return i.jsxs("div",{"data-slot":"aui_turn-pair",children:[i.jsx(wi,{content:e.content,msgId:e.id,images:e.images,files:e.files}),i.jsx(Au,{message:t,isStreaming:o})]})}),zu=[{pattern:/invalid.?api.?key|api.?key.?invalid|Incorrect API key/i,key:"err.apiKeyInvalid"},{pattern:/model.*not found|does not exist|model_not_found/i,key:"err.modelNotFound"},{pattern:/rate.?limit|429|Too Many Requests/i,key:"err.rateLimit"},{pattern:/quota|insufficient.?funds|balance|billing/i,key:"err.quotaExceeded"},{pattern:/timed?\s*out|TimeoutError/i,key:"err.timeout"},{pattern:/Connection\s*refused|ConnectionRefusedError/i,key:"err.connRefused"},{pattern:/errno 48|address already in use/i,key:"err.portBusy"},{pattern:/Traceback|Exception.*thread|exit code \d+/i,key:"err.processCrash"}];function Bu(n,e){if(!n)return"";for(const t of zu)if(t.pattern.test(n))return e(t.key);return n.length<=80?n:n.slice(0,77)+"…"}const Uu=a.memo(function({error:e,msgId:t}){const{t:o}=ce(),r=Bu(e,o);return i.jsx("div",{className:"ga-inline-error",role:"alert",id:`msg-${t}`,children:i.jsx("span",{className:"ga-inline-error-text",children:r})})}),Vu=300;function Ku(n){return n.kind==="turn"?n.turns.reduce((e,t)=>e+t.segments.length,0):1}const Wu=a.memo(function({messages:e,isRunning:t,budgetMultiplier:o,onShowEarlier:r,scrollRef:s}){const l=a.useMemo(()=>wu(e),[e]),c=a.useRef(null),u=a.useMemo(()=>{if(!isFinite(o))return 0;const f=Vu*o;let b=0;for(let y=l.length-1;y>=0;y--)if(b+=Ku(l[y]),b>f)return y+1;return 0},[l,o]),p=a.useMemo(()=>l.slice(u),[l,u]),d=u;a.useLayoutEffect(()=>{c.current!==null&&(s!=null&&s.current)&&(s.current.scrollTop=s.current.scrollHeight-c.current,c.current=null)});const m=()=>{const f=s==null?void 0:s.current;f&&(c.current=f.scrollHeight-f.scrollTop),r()};return e.length===0?i.jsx("div",{"data-slot":"thread-empty",children:i.jsx("p",{children:"Send a message to begin."})}):i.jsxs(i.Fragment,{children:[d>0&&i.jsxs("button",{"data-slot":"show-earlier-btn",onClick:m,children:["Show ",d," earlier messages"]}),p.map((f,b)=>{const y=u+b;return f.kind==="turn"?i.jsx(Fu,{userMsg:f.userMsg,assistantMsg:f.assistantMsg,isStreaming:t&&y===l.length-1},f.assistantMsg.id):f.msg.role==="user"?i.jsx("div",{"data-slot":"aui_turn-pair",children:i.jsx(wi,{content:f.msg.content,msgId:f.msg.id,images:f.msg.images,files:f.msg.files})},f.msg.id):f.msg.role==="error"?i.jsx(Uu,{error:f.msg.content,msgId:f.msg.id},f.msg.id):i.jsx("div",{"data-slot":"standalone-message","data-status":f.msg.status,children:f.msg.content},f.msg.id)})]})}),Qr=3,Yr=40,Hu=170,Xr=12;function Jr(n){const e=n.replace(/\s+/g," ").trim();return e.length<=Yr?e:e.slice(0,Yr)+"…"}function Zu(n){return 1-Math.pow(1-n,3)}let eo=0;function qu(n,e,t){cancelAnimationFrame(eo);const o=n.scrollTop,r=e-o;if(Math.abs(r)<1)return;const s=performance.now();function l(c){const u=c-s,p=Math.min(u/t,1);n.scrollTop=o+r*Zu(p),p<1&&(eo=requestAnimationFrame(l))}eo=requestAnimationFrame(l)}const Gu=a.memo(function({messages:e,stopScroll:t,onJumpToCollapsed:o}){const r=a.useMemo(()=>e.filter(y=>y.role==="user").map(y=>({id:y.id,content:y.content})),[e]),[s,l]=a.useState(null),[c,u]=a.useState(!1),p=a.useRef(null),d=a.useRef(0),m=a.useCallback(()=>{p.current&&(clearTimeout(p.current),p.current=null),u(!0)},[]),f=a.useCallback(()=>{p.current=setTimeout(()=>{u(!1),p.current=null},150)},[]);a.useEffect(()=>{if(r.length0&&(k=r[0].id),k&&l(k)}function w(){d.current||(d.current=requestAnimationFrame(S))}return y.addEventListener("scroll",w,{passive:!0}),S(),()=>{y.removeEventListener("scroll",w),cancelAnimationFrame(d.current)}},[r]);const b=a.useCallback(y=>{const S=document.querySelector('[data-slot="aui_thread-viewport"]'),w=document.getElementById(`msg-${y}`);if(!w){o(y);return}if(!S)return;t();const _=(w.closest('[data-slot="aui_turn-pair"]')||w).offsetTop-Xr;qu(S,_,Hu)},[t,o]);return r.lengthi.jsx("button",{"data-slot":"rail-panel-item","data-active":y.id===s||void 0,onClick:()=>b(y.id),children:Jr(y.content)},y.id))}),i.jsx("div",{"data-slot":"rail-marks",children:r.map(y=>i.jsx("button",{"data-slot":"rail-mark","data-active":y.id===s||void 0,"aria-label":Jr(y.content),onClick:()=>b(y.id),children:i.jsx("span",{"data-slot":"rail-mark-line"})},y.id))})]})})});function Qu(){const{messages:n,status:e,activeSessionId:t}=X(),{scrollRef:o,isAtBottom:r,scrollToBottom:s,stopScroll:l}=uu(),[c,u]=a.useState(1),p=a.useRef(null);hu(o,s,l,t),a.useEffect(()=>{u(1),p.current=null},[t]),a.useEffect(()=>{if(!p.current)return;const b=p.current,y=requestAnimationFrame(()=>{const S=document.getElementById(`msg-${b}`);if(S){p.current=null;const w=o.current;if(w){const k=S.closest('[data-slot="aui_turn-pair"]')||S;w.scrollTop=k.offsetTop-12}}});return()=>cancelAnimationFrame(y)},[c,o]);const d=a.useCallback(()=>{u(1/0)},[]),m=a.useCallback(b=>{p.current=b,d()},[d]),f=a.useCallback(()=>{o.current,u(b=>b+1)},[o]);return i.jsxs("div",{"data-slot":"thread-root",children:[i.jsx("div",{ref:o,"data-slot":"aui_thread-viewport","data-following":r,children:i.jsxs(mu,{children:[i.jsx(Wu,{messages:n,isRunning:e==="running",budgetMultiplier:c,onShowEarlier:f,scrollRef:o}),i.jsx("div",{"data-slot":"aui_composer-clearance"})]})}),i.jsx(Gu,{messages:n,stopScroll:l,onJumpToCollapsed:m}),!r&&i.jsx("button",{"data-slot":"scroll-to-bottom",onClick:()=>s("smooth"),children:i.jsx("svg",{width:"14",height:"14",viewBox:"0 0 16 16",fill:"none",children:i.jsx("path",{d:"M8 3v10m0 0l-3.5-3.5M8 13l3.5-3.5",stroke:"currentColor",strokeWidth:"1.5",strokeLinecap:"round",strokeLinejoin:"round"})})})]})}function Ro(n){let e="";for(const t of n.childNodes)if(t.nodeType===Node.TEXT_NODE)e+=t.textContent||"";else if(t instanceof HTMLElement)if(t.dataset.refText)e+=t.dataset.refText;else if(t.tagName==="BR")e+=` +`;else{const o=Ro(t);o&&(e+=` +`+o)}return e}function Yu(n){const e=Array.from(n.childNodes);for(const t of e)if(t instanceof HTMLElement){if(t.dataset.refText||t.tagName==="BR")continue;if(t.tagName==="DIV"||t.tagName==="P"){const o=document.createElement("br");for(n.insertBefore(o,t);t.firstChild;)n.insertBefore(t.firstChild,t);n.removeChild(t)}}n.normalize()}function ki(n){const e=document.createRange();e.selectNodeContents(n),e.collapse(!1);const t=window.getSelection();t&&(t.removeAllRanges(),t.addRange(e))}function es(n,e){n.focus();const t=window.getSelection();if(!t||t.rangeCount===0){n.appendChild(e);return}const o=t.getRangeAt(0);o.deleteContents(),o.insertNode(e),o.setStartAfter(e),o.collapse(!0),t.removeAllRanges(),t.addRange(o)}function Xu(n,e){n.textContent=e,ki(n)}function Ju(n,e,t){const o=document.createElement("span");return o.contentEditable="false",o.dataset.refText=`@${n}:\`${e}\``,o.dataset.refKind=n,o.className="ref-chip",o.innerHTML=`${r0(n)}${o0(t||e)}`,o}function e0(n,e,t,o){const r=Ju(e,t,o);es(n,r);const s=document.createTextNode(" ");es(n,s)}function t0(n,e){const t=document.createElement("span");return t.contentEditable="false",t.dataset.refText=e,t.dataset.skillId=n,t.className="skill-chip",t.textContent=`/${n}`,t}function n0(n,e,t){n.textContent="";const o=t0(e,t);n.appendChild(o);const r=document.createTextNode(" ");n.appendChild(r),ki(n)}function o0(n){return n.replace(/&/g,"&").replace(//g,">").replace(/"/g,""")}function r0(n){switch(n){case"file":return'';case"url":return'';case"image":return'';default:return''}}const s0=a.forwardRef(function({placeholder:e,disabled:t,onInput:o,onKeyDown:r,onSlashTrigger:s,onSlashDismiss:l,onAtTrigger:c,onAtDismiss:u,onPasteFiles:p},d){const m=a.useRef(null),f=a.useRef(!1),b=a.useRef("");a.useImperativeHandle(d,()=>({focus(){var x;(x=m.current)==null||x.focus()},clear(){m.current&&(m.current.textContent="",b.current="")},getText(){return m.current?Ro(m.current):""},setText(x){m.current&&(Xu(m.current,x),b.current=x,o(x))},insertChip(x,j,v){m.current&&(m.current.focus(),e0(m.current,x,j,v),y())},setSkillChip(x,j){m.current&&(n0(m.current,x,j),y())},getElement(){return m.current}}));const y=a.useCallback(()=>{if(!m.current)return;const x=Ro(m.current);b.current=x,o(x);const j=x.trimStart();j.startsWith("/")&&!j.includes(` +`)?s==null||s(j.slice(1)):l==null||l();const v=x.match(/@([^\s@]*)$/);v?c==null||c(v[1]):u==null||u()},[o,s,l,c,u]),S=a.useCallback(()=>{f.current||(m.current&&Yu(m.current),y())},[y]),w=a.useCallback(()=>{f.current=!0},[]),C=a.useCallback(()=>{f.current=!1,S()},[S]),k=a.useCallback(x=>{f.current||x.nativeEvent.isComposing||x.keyCode===229||r(x)},[r]),_=a.useCallback(x=>{var E;const j=(E=x.clipboardData)==null?void 0:E.items;if(!j)return;const v=[];for(const D of Array.from(j))if(D.type.startsWith("image/")&&D.type!=="image/svg+xml"){const P=D.getAsFile();P&&v.push(P)}if(v.length>0){x.preventDefault(),p==null||p(v);return}const O=x.clipboardData.getData("text/plain");O&&(x.preventDefault(),document.execCommand("insertText",!1,O))},[p]);return a.useEffect(()=>{const x=m.current;if(!x)return;const j=new ResizeObserver(v=>{var E,D,P;const O=((P=(D=(E=v[0])==null?void 0:E.borderBoxSize)==null?void 0:D[0])==null?void 0:P.blockSize)??x.offsetHeight;x.style.setProperty("--editor-scroll-height",`${O}px`)});return j.observe(x),()=>j.disconnect()},[]),i.jsx("div",{ref:m,"data-slot":"composer-rich-input",contentEditable:!t,role:"textbox","aria-multiline":"true","aria-placeholder":e,"data-placeholder":e,suppressContentEditableWarning:!0,onInput:S,onKeyDown:k,onCompositionStart:w,onCompositionEnd:C,onPaste:_})});function i0(){try{const n=localStorage.getItem("ga_custom_presets");return n?JSON.parse(n):[]}catch{return[]}}function a0({visible:n,query:e,onSelect:t,onClose:o}){const r=H(m=>m.lang),[s,l]=a.useState(0),c=a.useRef(null),u=i0(),p=[...Xe,...u],d=e?p.filter(m=>m.id.startsWith(e.toLowerCase())||m.title.toLowerCase().includes(e.toLowerCase())):p;return a.useEffect(()=>{l(0)},[e]),a.useEffect(()=>{if(!n)return;function m(f){f.key==="ArrowDown"?(f.preventDefault(),l(b=>Math.min(b+1,d.length-1))):f.key==="ArrowUp"?(f.preventDefault(),l(b=>Math.max(b-1,0))):f.key==="Enter"?(f.preventDefault(),d[s]&&t(d[s].id,d[s].prompt)):f.key==="Escape"&&(f.preventDefault(),o())}return document.addEventListener("keydown",m,!0),()=>document.removeEventListener("keydown",m,!0)},[n,s,d,t,o]),a.useEffect(()=>{if(!c.current)return;const m=c.current.querySelector("[data-focused]");m==null||m.scrollIntoView({block:"nearest"})},[s]),!n||d.length===0?null:i.jsx("div",{ref:c,"data-slot":"completion-drawer",children:d.map((m,f)=>i.jsx("button",{"data-slot":"completion-item","data-focused":f===s?"":void 0,onClick:()=>t(m.id,m.prompt),onMouseEnter:()=>l(f),children:i.jsxs("span",{"data-slot":"completion-info",children:[i.jsxs("span",{"data-slot":"completion-title",children:["/",m.id]}),i.jsx("span",{"data-slot":"completion-desc",children:m.desc[r]||m.desc.en})]})},m.id))})}const l0=[{id:"file",label:"file"},{id:"url",label:"url"},{id:"image",label:"image"}];function c0({visible:n,query:e,onConfirm:t,onClose:o}){const r=a.useRef(null),[s,l]=a.useState("file"),[c,u]=a.useState("");a.useEffect(()=>{n&&(u(e),l("file"),setTimeout(()=>{var d;return(d=r.current)==null?void 0:d.focus()},0))},[n,e]),a.useEffect(()=>{if(!n)return;function d(m){m.key==="Escape"&&(m.preventDefault(),m.stopPropagation(),o())}return document.addEventListener("keydown",d,!0),()=>document.removeEventListener("keydown",d,!0)},[n,o]);const p=a.useCallback(d=>{d.preventDefault();const m=c.trim();m&&t(s,m)},[s,c,t]);return n?i.jsx("div",{"data-slot":"at-ref-popover",children:i.jsxs("form",{onSubmit:p,"data-slot":"at-ref-form",children:[i.jsx("div",{"data-slot":"at-ref-kinds",children:l0.map(d=>i.jsx("button",{type:"button","data-slot":"at-ref-kind-btn","data-active":d.id===s?"":void 0,onClick:()=>l(d.id),title:d.label,children:i.jsx(d0,{kind:d.id})},d.id))}),i.jsx("input",{ref:r,"data-slot":"at-ref-input",type:"text",value:c,onChange:d=>u(d.target.value),placeholder:s==="url"?"https://...":"path/to/file"}),i.jsx("button",{type:"submit","data-slot":"at-ref-confirm",disabled:!c.trim(),children:"↵"})]})}):null}function d0({kind:n}){switch(n){case"file":return i.jsxs("svg",{width:"12",height:"12",viewBox:"0 0 16 16",fill:"none",children:[i.jsx("path",{d:"M4 2h5l4 4v8a1 1 0 0 1-1 1H4a1 1 0 0 1-1-1V3a1 1 0 0 1 1-1z",stroke:"currentColor",strokeWidth:"1.2"}),i.jsx("path",{d:"M9 2v4h4",stroke:"currentColor",strokeWidth:"1.2"})]});case"url":return i.jsx("svg",{width:"12",height:"12",viewBox:"0 0 16 16",fill:"none",children:i.jsx("path",{d:"M6.5 9.5l3-3M7 11l-1.5 1.5a2.12 2.12 0 1 1-3-3L4 8m5-3l1.5-1.5a2.12 2.12 0 1 1 3 3L12 8",stroke:"currentColor",strokeWidth:"1.2",strokeLinecap:"round"})});case"image":return i.jsxs("svg",{width:"12",height:"12",viewBox:"0 0 16 16",fill:"none",children:[i.jsx("rect",{x:"2",y:"2",width:"12",height:"12",rx:"1",stroke:"currentColor",strokeWidth:"1.2"}),i.jsx("circle",{cx:"5.5",cy:"5.5",r:"1",fill:"currentColor"}),i.jsx("path",{d:"M2 11l3-3 2 2 3-3 4 4",stroke:"currentColor",strokeWidth:"1.2",strokeLinecap:"round"})]});default:return null}}const ts={title:{zh:"附加",en:"Attach"},file:{zh:"文件…",en:"File…"},image:{zh:"图片…",en:"Image…"},paste:{zh:"粘贴图片",en:"Paste image"},hint:{zh:"提示:输入 @ 以内联引用文件",en:"Tip: type @ to reference files inline"}};function u0({onUploadFile:n,onUploadImage:e,onPasteImage:t}){const[o,r]=a.useState(!1),s=a.useRef(null),l=a.useRef(null),c=H(m=>m.lang),u=m=>ts[m][c]||ts[m].en,p=a.useCallback(()=>r(m=>!m),[]);a.useEffect(()=>{if(!o)return;function m(b){s.current&&!s.current.contains(b.target)&&l.current&&!l.current.contains(b.target)&&r(!1)}function f(b){b.key==="Escape"&&r(!1)}return document.addEventListener("mousedown",m),document.addEventListener("keydown",f),()=>{document.removeEventListener("mousedown",m),document.removeEventListener("keydown",f)}},[o]);const d=a.useCallback(m=>()=>{m(),r(!1)},[]);return i.jsxs("div",{"data-slot":"context-menu-wrap",children:[i.jsx("button",{ref:l,"data-slot":"composer-attach-btn",onClick:p,"aria-label":u("title"),title:u("title"),children:i.jsx(p0,{})}),o&&i.jsxs("div",{ref:s,"data-slot":"context-menu",children:[i.jsx("div",{"data-slot":"context-menu-title",children:u("title")}),i.jsxs("button",{"data-slot":"context-menu-item",onClick:d(n),children:[i.jsx("span",{"data-slot":"context-menu-icon",children:i.jsx(h0,{})}),i.jsx("span",{"data-slot":"context-menu-label",children:u("file")})]}),i.jsxs("button",{"data-slot":"context-menu-item",onClick:d(e),children:[i.jsx("span",{"data-slot":"context-menu-icon",children:i.jsx(m0,{})}),i.jsx("span",{"data-slot":"context-menu-label",children:u("image")})]}),i.jsxs("button",{"data-slot":"context-menu-item",onClick:d(t),children:[i.jsx("span",{"data-slot":"context-menu-icon",children:i.jsx(f0,{})}),i.jsx("span",{"data-slot":"context-menu-label",children:u("paste")})]}),i.jsx("div",{"data-slot":"context-menu-hint",children:u("hint")})]})]})}function p0(){return i.jsx("svg",{width:"16",height:"16",viewBox:"0 0 16 16",fill:"none",children:i.jsx("path",{d:"M8 3v10M3 8h10",stroke:"currentColor",strokeWidth:"1.5",strokeLinecap:"round"})})}function h0(){return i.jsxs("svg",{width:"14",height:"14",viewBox:"0 0 16 16",fill:"none",children:[i.jsx("path",{d:"M4 2h5l4 4v8a1 1 0 0 1-1 1H4a1 1 0 0 1-1-1V3a1 1 0 0 1 1-1z",stroke:"currentColor",strokeWidth:"1.2"}),i.jsx("path",{d:"M9 2v4h4",stroke:"currentColor",strokeWidth:"1.2"})]})}function m0(){return i.jsxs("svg",{width:"14",height:"14",viewBox:"0 0 16 16",fill:"none",children:[i.jsx("rect",{x:"2",y:"2",width:"12",height:"12",rx:"1",stroke:"currentColor",strokeWidth:"1.2"}),i.jsx("circle",{cx:"5.5",cy:"5.5",r:"1",fill:"currentColor"}),i.jsx("path",{d:"M2 11l3-3 2 2 3-3 4 4",stroke:"currentColor",strokeWidth:"1.2",strokeLinecap:"round"})]})}function f0(){return i.jsxs("svg",{width:"14",height:"14",viewBox:"0 0 16 16",fill:"none",children:[i.jsx("rect",{x:"3",y:"2",width:"10",height:"12",rx:"1",stroke:"currentColor",strokeWidth:"1.2"}),i.jsx("path",{d:"M6 2V1.5A.5.5 0 0 1 6.5 1h3a.5.5 0 0 1 .5.5V2",stroke:"currentColor",strokeWidth:"1.2"})]})}var g0="OpenAI";function Mt(n){"@babel/helpers - typeof";return Mt=typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?function(e){return typeof e}:function(e){return e&&typeof Symbol=="function"&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},Mt(n)}var y0=["size","style"];function ns(n,e){var t=Object.keys(n);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(n);e&&(o=o.filter(function(r){return Object.getOwnPropertyDescriptor(n,r).enumerable})),t.push.apply(t,o)}return t}function to(n){for(var e=1;e=0)&&Object.prototype.propertyIsEnumerable.call(n,o)&&(t[o]=n[o])}return t}function C0(n,e){if(n==null)return{};var t={},o=Object.keys(n),r,s;for(s=0;s=0)&&(t[r]=n[r]);return t}var S0=a.memo(function(n){var e=n.size,t=e===void 0?"1em":e,o=n.style,r=w0(n,y0);return i.jsxs("svg",to(to({fill:"currentColor",fillRule:"evenodd",height:t,style:to({flex:"none",lineHeight:1},o),viewBox:"0 0 24 24",width:t,xmlns:"http://www.w3.org/2000/svg"},r),{},{children:[i.jsx("title",{children:g0}),i.jsx("path",{d:"M9.205 8.658v-2.26c0-.19.072-.333.238-.428l4.543-2.616c.619-.357 1.356-.523 2.117-.523 2.854 0 4.662 2.212 4.662 4.566 0 .167 0 .357-.024.547l-4.71-2.759a.797.797 0 00-.856 0l-5.97 3.473zm10.609 8.8V12.06c0-.333-.143-.57-.429-.737l-5.97-3.473 1.95-1.118a.433.433 0 01.476 0l4.543 2.617c1.309.76 2.189 2.378 2.189 3.948 0 1.808-1.07 3.473-2.76 4.163zM7.802 12.703l-1.95-1.142c-.167-.095-.239-.238-.239-.428V5.899c0-2.545 1.95-4.472 4.591-4.472 1 0 1.927.333 2.712.928L8.23 5.067c-.285.166-.428.404-.428.737v6.898zM12 15.128l-2.795-1.57v-3.33L12 8.658l2.795 1.57v3.33L12 15.128zm1.796 7.23c-1 0-1.927-.332-2.712-.927l4.686-2.712c.285-.166.428-.404.428-.737v-6.898l1.974 1.142c.167.095.238.238.238.428v5.233c0 2.545-1.974 4.472-4.614 4.472zm-5.637-5.303l-4.544-2.617c-1.308-.761-2.188-2.378-2.188-3.948A4.482 4.482 0 014.21 6.327v5.423c0 .333.143.571.428.738l5.947 3.449-1.95 1.118a.432.432 0 01-.476 0zm-.262 3.9c-2.688 0-4.662-2.021-4.662-4.519 0-.19.024-.38.047-.57l4.686 2.71c.286.167.571.167.856 0l5.97-3.448v2.26c0 .19-.07.333-.237.428l-4.543 2.616c-.619.357-1.356.523-2.117.523zm5.899 2.83a5.947 5.947 0 005.827-4.756C22.287 18.339 24 15.84 24 13.296c0-1.665-.713-3.282-1.998-4.448.119-.5.19-.999.19-1.498 0-3.401-2.759-5.947-5.946-5.947-.642 0-1.26.095-1.88.31A5.962 5.962 0 0010.205 0a5.947 5.947 0 00-5.827 4.757C1.713 5.447 0 7.945 0 10.49c0 1.666.713 3.283 1.998 4.448-.119.5-.19 1-.19 1.499 0 3.401 2.759 5.946 5.946 5.946.642 0 1.26-.095 1.88-.309a5.96 5.96 0 004.162 1.713z"})]}))}),k0="Anthropic";function Lt(n){"@babel/helpers - typeof";return Lt=typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?function(e){return typeof e}:function(e){return e&&typeof Symbol=="function"&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},Lt(n)}var j0=["size","style"];function os(n,e){var t=Object.keys(n);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(n);e&&(o=o.filter(function(r){return Object.getOwnPropertyDescriptor(n,r).enumerable})),t.push.apply(t,o)}return t}function no(n){for(var e=1;e=0)&&Object.prototype.propertyIsEnumerable.call(n,o)&&(t[o]=n[o])}return t}function M0(n,e){if(n==null)return{};var t={},o=Object.keys(n),r,s;for(s=0;s=0)&&(t[r]=n[r]);return t}var L0=a.memo(function(n){var e=n.size,t=e===void 0?"1em":e,o=n.style,r=_0(n,j0);return i.jsxs("svg",no(no({fill:"currentColor",fillRule:"evenodd",height:t,style:no({flex:"none",lineHeight:1},o),viewBox:"0 0 24 24",width:t,xmlns:"http://www.w3.org/2000/svg"},r),{},{children:[i.jsx("title",{children:k0}),i.jsx("path",{d:"M13.827 3.52h3.603L24 20h-3.603l-6.57-16.48zm-7.258 0h3.767L16.906 20h-3.674l-1.343-3.461H5.017l-1.344 3.46H0L6.57 3.522zm4.132 9.959L8.453 7.687 6.205 13.48H10.7z"})]}))}),I0="DeepSeek";function It(n){"@babel/helpers - typeof";return It=typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?function(e){return typeof e}:function(e){return e&&typeof Symbol=="function"&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},It(n)}var T0=["size","style"];function rs(n,e){var t=Object.keys(n);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(n);e&&(o=o.filter(function(r){return Object.getOwnPropertyDescriptor(n,r).enumerable})),t.push.apply(t,o)}return t}function oo(n){for(var e=1;e=0)&&Object.prototype.propertyIsEnumerable.call(n,o)&&(t[o]=n[o])}return t}function A0(n,e){if(n==null)return{};var t={},o=Object.keys(n),r,s;for(s=0;s=0)&&(t[r]=n[r]);return t}var F0=a.memo(function(n){var e=n.size,t=e===void 0?"1em":e,o=n.style,r=$0(n,T0);return i.jsxs("svg",oo(oo({fill:"currentColor",fillRule:"evenodd",height:t,style:oo({flex:"none",lineHeight:1},o),viewBox:"0 0 24 24",width:t,xmlns:"http://www.w3.org/2000/svg"},r),{},{children:[i.jsx("title",{children:I0}),i.jsx("path",{d:"M23.748 4.482c-.254-.124-.364.113-.512.234-.051.039-.094.09-.137.136-.372.397-.806.657-1.373.626-.829-.046-1.537.214-2.163.848-.133-.782-.575-1.248-1.247-1.548-.352-.156-.708-.311-.955-.65-.172-.241-.219-.51-.305-.774-.055-.16-.11-.323-.293-.35-.2-.031-.278.136-.356.276-.313.572-.434 1.202-.422 1.84.027 1.436.633 2.58 1.838 3.393.137.093.172.187.129.323-.082.28-.18.552-.266.833-.055.179-.137.217-.329.14a5.526 5.526 0 01-1.736-1.18c-.857-.828-1.631-1.742-2.597-2.458a11.365 11.365 0 00-.689-.471c-.985-.957.13-1.743.388-1.836.27-.098.093-.432-.779-.428-.872.004-1.67.295-2.687.684a3.055 3.055 0 01-.465.137 9.597 9.597 0 00-2.883-.102c-1.885.21-3.39 1.102-4.497 2.623C.082 8.606-.231 10.684.152 12.85c.403 2.284 1.569 4.175 3.36 5.653 1.858 1.533 3.997 2.284 6.438 2.14 1.482-.085 3.133-.284 4.994-1.86.47.234.962.327 1.78.397.63.059 1.236-.03 1.705-.128.735-.156.684-.837.419-.961-2.155-1.004-1.682-.595-2.113-.926 1.096-1.296 2.746-2.642 3.392-7.003.05-.347.007-.565 0-.845-.004-.17.035-.237.23-.256a4.173 4.173 0 001.545-.475c1.396-.763 1.96-2.015 2.093-3.517.02-.23-.004-.467-.247-.588zM11.581 18c-2.089-1.642-3.102-2.183-3.52-2.16-.392.024-.321.471-.235.763.09.288.207.486.371.739.114.167.192.416-.113.603-.673.416-1.842-.14-1.897-.167-1.361-.802-2.5-1.86-3.301-3.307-.774-1.393-1.224-2.887-1.298-4.482-.02-.386.093-.522.477-.592a4.696 4.696 0 011.529-.039c2.132.312 3.946 1.265 5.468 2.774.868.86 1.525 1.887 2.202 2.891.72 1.066 1.494 2.082 2.48 2.914.348.292.625.514.891.677-.802.09-2.14.11-3.054-.614zm1-6.44a.306.306 0 01.415-.287.302.302 0 01.2.288.306.306 0 01-.31.307.303.303 0 01-.304-.308zm3.11 1.596c-.2.081-.399.151-.59.16a1.245 1.245 0 01-.798-.254c-.274-.23-.47-.358-.552-.758a1.73 1.73 0 01.016-.588c.07-.327-.008-.537-.239-.727-.187-.156-.426-.199-.688-.199a.559.559 0 01-.254-.078c-.11-.054-.2-.19-.114-.358.028-.054.16-.186.192-.21.356-.202.767-.136 1.146.016.352.144.618.408 1.001.782.391.451.462.576.685.914.176.265.336.537.445.848.067.195-.019.354-.25.452z"})]}))}),z0="Qwen";function Tt(n){"@babel/helpers - typeof";return Tt=typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?function(e){return typeof e}:function(e){return e&&typeof Symbol=="function"&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},Tt(n)}var B0=["size","style"];function ss(n,e){var t=Object.keys(n);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(n);e&&(o=o.filter(function(r){return Object.getOwnPropertyDescriptor(n,r).enumerable})),t.push.apply(t,o)}return t}function ro(n){for(var e=1;e=0)&&Object.prototype.propertyIsEnumerable.call(n,o)&&(t[o]=n[o])}return t}function H0(n,e){if(n==null)return{};var t={},o=Object.keys(n),r,s;for(s=0;s=0)&&(t[r]=n[r]);return t}var Z0=a.memo(function(n){var e=n.size,t=e===void 0?"1em":e,o=n.style,r=W0(n,B0);return i.jsxs("svg",ro(ro({fill:"currentColor",fillRule:"evenodd",height:t,style:ro({flex:"none",lineHeight:1},o),viewBox:"0 0 24 24",width:t,xmlns:"http://www.w3.org/2000/svg"},r),{},{children:[i.jsx("title",{children:z0}),i.jsx("path",{d:"M12.604 1.34c.393.69.784 1.382 1.174 2.075a.18.18 0 00.157.091h5.552c.174 0 .322.11.446.327l1.454 2.57c.19.337.24.478.024.837-.26.43-.513.864-.76 1.3l-.367.658c-.106.196-.223.28-.04.512l2.652 4.637c.172.301.111.494-.043.77-.437.785-.882 1.564-1.335 2.34-.159.272-.352.375-.68.37-.777-.016-1.552-.01-2.327.016a.099.099 0 00-.081.05 575.097 575.097 0 01-2.705 4.74c-.169.293-.38.363-.725.364-.997.003-2.002.004-3.017.002a.537.537 0 01-.465-.271l-1.335-2.323a.09.09 0 00-.083-.049H4.982c-.285.03-.553-.001-.805-.092l-1.603-2.77a.543.543 0 01-.002-.54l1.207-2.12a.198.198 0 000-.197 550.951 550.951 0 01-1.875-3.272l-.79-1.395c-.16-.31-.173-.496.095-.965.465-.813.927-1.625 1.387-2.436.132-.234.304-.334.584-.335a338.3 338.3 0 012.589-.001.124.124 0 00.107-.063l2.806-4.895a.488.488 0 01.422-.246c.524-.001 1.053 0 1.583-.006L11.704 1c.341-.003.724.032.9.34zm-3.432.403a.06.06 0 00-.052.03L6.254 6.788a.157.157 0 01-.135.078H3.253c-.056 0-.07.025-.041.074l5.81 10.156c.025.042.013.062-.034.063l-2.795.015a.218.218 0 00-.2.116l-1.32 2.31c-.044.078-.021.118.068.118l5.716.008c.046 0 .08.02.104.061l1.403 2.454c.046.081.092.082.139 0l5.006-8.76.783-1.382a.055.055 0 01.096 0l1.424 2.53a.122.122 0 00.107.062l2.763-.02a.04.04 0 00.035-.02.041.041 0 000-.04l-2.9-5.086a.108.108 0 010-.113l.293-.507 1.12-1.977c.024-.041.012-.062-.035-.062H9.2c-.059 0-.073-.026-.043-.077l1.434-2.505a.107.107 0 000-.114L9.225 1.774a.06.06 0 00-.053-.031zm6.29 8.02c.046 0 .058.02.034.06l-.832 1.465-2.613 4.585a.056.056 0 01-.05.029.058.058 0 01-.05-.029L8.498 9.841c-.02-.034-.01-.052.028-.054l.216-.012 6.722-.012z"})]}))}),q0="Google";function Rt(n){"@babel/helpers - typeof";return Rt=typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?function(e){return typeof e}:function(e){return e&&typeof Symbol=="function"&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},Rt(n)}var G0=["size","style"];function is(n,e){var t=Object.keys(n);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(n);e&&(o=o.filter(function(r){return Object.getOwnPropertyDescriptor(n,r).enumerable})),t.push.apply(t,o)}return t}function so(n){for(var e=1;e=0)&&Object.prototype.propertyIsEnumerable.call(n,o)&&(t[o]=n[o])}return t}function e1(n,e){if(n==null)return{};var t={},o=Object.keys(n),r,s;for(s=0;s=0)&&(t[r]=n[r]);return t}var t1=a.memo(function(n){var e=n.size,t=e===void 0?"1em":e,o=n.style,r=J0(n,G0);return i.jsxs("svg",so(so({fill:"currentColor",fillRule:"evenodd",height:t,style:so({flex:"none",lineHeight:1},o),viewBox:"0 0 24 24",width:t,xmlns:"http://www.w3.org/2000/svg"},r),{},{children:[i.jsx("title",{children:q0}),i.jsx("path",{d:"M23 12.245c0-.905-.075-1.565-.236-2.25h-10.54v4.083h6.186c-.124 1.014-.797 2.542-2.294 3.569l-.021.136 3.332 2.53.23.022C21.779 18.417 23 15.593 23 12.245z"}),i.jsx("path",{d:"M12.225 23c3.03 0 5.574-.978 7.433-2.665l-3.542-2.688c-.948.648-2.22 1.1-3.891 1.1a6.745 6.745 0 01-6.386-4.572l-.132.011-3.465 2.628-.045.124C4.043 20.531 7.835 23 12.225 23z"}),i.jsx("path",{d:"M5.84 14.175A6.65 6.65 0 015.463 12c0-.758.138-1.491.361-2.175l-.006-.147-3.508-2.67-.115.054A10.831 10.831 0 001 12c0 1.772.436 3.447 1.197 4.938l3.642-2.763z"}),i.jsx("path",{d:"M12.225 5.253c2.108 0 3.529.892 4.34 1.638l3.167-3.031C17.787 2.088 15.255 1 12.225 1 7.834 1 4.043 3.469 2.197 7.062l3.63 2.763a6.77 6.77 0 016.398-4.572z"})]}))}),n1="Meta";function Nt(n){"@babel/helpers - typeof";return Nt=typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?function(e){return typeof e}:function(e){return e&&typeof Symbol=="function"&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},Nt(n)}var o1=["size","style"];function as(n,e){var t=Object.keys(n);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(n);e&&(o=o.filter(function(r){return Object.getOwnPropertyDescriptor(n,r).enumerable})),t.push.apply(t,o)}return t}function io(n){for(var e=1;e=0)&&Object.prototype.propertyIsEnumerable.call(n,o)&&(t[o]=n[o])}return t}function l1(n,e){if(n==null)return{};var t={},o=Object.keys(n),r,s;for(s=0;s=0)&&(t[r]=n[r]);return t}var c1=a.memo(function(n){var e=n.size,t=e===void 0?"1em":e,o=n.style,r=a1(n,o1);return i.jsxs("svg",io(io({fill:"currentColor",fillRule:"evenodd",height:t,style:io({flex:"none",lineHeight:1},o),viewBox:"0 0 24 24",width:t,xmlns:"http://www.w3.org/2000/svg"},r),{},{children:[i.jsx("title",{children:n1}),i.jsx("path",{d:"M6.897 4c1.915 0 3.516.932 5.43 3.376l.282-.373c.19-.246.383-.484.58-.71l.313-.35C14.588 4.788 15.792 4 17.225 4c1.273 0 2.469.557 3.491 1.516l.218.213c1.73 1.765 2.917 4.71 3.053 8.026l.011.392.002.25c0 1.501-.28 2.759-.818 3.7l-.14.23-.108.153c-.301.42-.664.758-1.086 1.009l-.265.142-.087.04a3.493 3.493 0 01-.302.118 4.117 4.117 0 01-1.33.208c-.524 0-.996-.067-1.438-.215-.614-.204-1.163-.56-1.726-1.116l-.227-.235c-.753-.812-1.534-1.976-2.493-3.586l-1.43-2.41-.544-.895-1.766 3.13-.343.592C7.597 19.156 6.227 20 4.356 20c-1.21 0-2.205-.42-2.936-1.182l-.168-.184c-.484-.573-.837-1.311-1.043-2.189l-.067-.32a8.69 8.69 0 01-.136-1.288L0 14.468c.002-.745.06-1.49.174-2.23l.1-.573c.298-1.53.828-2.958 1.536-4.157l.209-.34c1.177-1.83 2.789-3.053 4.615-3.16L6.897 4zm-.033 2.615l-.201.01c-.83.083-1.606.673-2.252 1.577l-.138.199-.01.018c-.67 1.017-1.185 2.378-1.456 3.845l-.004.022a12.591 12.591 0 00-.207 2.254l.002.188c.004.18.017.36.04.54l.043.291c.092.503.257.908.486 1.208l.117.137c.303.323.698.492 1.17.492 1.1 0 1.796-.676 3.696-3.641l2.175-3.4.454-.701-.139-.198C9.11 7.3 8.084 6.616 6.864 6.616zm10.196-.552l-.176.007c-.635.048-1.223.359-1.82.933l-.196.198c-.439.462-.887 1.064-1.367 1.807l.266.398c.18.274.362.56.55.858l.293.475 1.396 2.335.695 1.114c.583.926 1.03 1.6 1.408 2.082l.213.262c.282.326.529.54.777.673l.102.05c.227.1.457.138.718.138.176.002.35-.023.518-.073.338-.104.61-.32.813-.637l.095-.163.077-.162c.194-.459.29-1.06.29-1.785l-.006-.449c-.08-2.871-.938-5.372-2.2-6.798l-.176-.189c-.67-.683-1.444-1.074-2.27-1.074z"})]}))}),d1="Mistral";function Dt(n){"@babel/helpers - typeof";return Dt=typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?function(e){return typeof e}:function(e){return e&&typeof Symbol=="function"&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},Dt(n)}var u1=["size","style"];function ls(n,e){var t=Object.keys(n);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(n);e&&(o=o.filter(function(r){return Object.getOwnPropertyDescriptor(n,r).enumerable})),t.push.apply(t,o)}return t}function ao(n){for(var e=1;e=0)&&Object.prototype.propertyIsEnumerable.call(n,o)&&(t[o]=n[o])}return t}function g1(n,e){if(n==null)return{};var t={},o=Object.keys(n),r,s;for(s=0;s=0)&&(t[r]=n[r]);return t}var y1=a.memo(function(n){var e=n.size,t=e===void 0?"1em":e,o=n.style,r=f1(n,u1);return i.jsxs("svg",ao(ao({fill:"currentColor",fillRule:"evenodd",height:t,style:ao({flex:"none",lineHeight:1},o),viewBox:"0 0 24 24",width:t,xmlns:"http://www.w3.org/2000/svg"},r),{},{children:[i.jsx("title",{children:d1}),i.jsx("path",{clipRule:"evenodd",d:"M3.428 3.4h3.429v3.428h3.429v3.429h-.002 3.431V6.828h3.427V3.4h3.43v13.714H24v3.429H13.714v-3.428h-3.428v-3.429h-3.43v3.428h3.43v3.429H0v-3.429h3.428V3.4zm10.286 13.715h3.428v-3.429h-3.427v3.429z"})]}))}),b1="MoonshotAI";function $t(n){"@babel/helpers - typeof";return $t=typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?function(e){return typeof e}:function(e){return e&&typeof Symbol=="function"&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},$t(n)}var v1=["size","style"];function cs(n,e){var t=Object.keys(n);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(n);e&&(o=o.filter(function(r){return Object.getOwnPropertyDescriptor(n,r).enumerable})),t.push.apply(t,o)}return t}function lo(n){for(var e=1;e=0)&&Object.prototype.propertyIsEnumerable.call(n,o)&&(t[o]=n[o])}return t}function k1(n,e){if(n==null)return{};var t={},o=Object.keys(n),r,s;for(s=0;s=0)&&(t[r]=n[r]);return t}var j1=a.memo(function(n){var e=n.size,t=e===void 0?"1em":e,o=n.style,r=S1(n,v1);return i.jsxs("svg",lo(lo({fill:"currentColor",fillRule:"evenodd",height:t,style:lo({flex:"none",lineHeight:1},o),viewBox:"0 0 24 24",width:t,xmlns:"http://www.w3.org/2000/svg"},r),{},{children:[i.jsx("title",{children:b1}),i.jsx("path",{d:"M1.052 16.916l9.539 2.552a21.007 21.007 0 00.06 2.033l5.956 1.593a11.997 11.997 0 01-5.586.865l-.18-.016-.044-.004-.084-.009-.094-.01a11.605 11.605 0 01-.157-.02l-.107-.014-.11-.016a11.962 11.962 0 01-.32-.051l-.042-.008-.075-.013-.107-.02-.07-.015-.093-.019-.075-.016-.095-.02-.097-.023-.094-.022-.068-.017-.088-.022-.09-.024-.095-.025-.082-.023-.109-.03-.062-.02-.084-.025-.093-.028-.105-.034-.058-.019-.08-.026-.09-.031-.066-.024a6.293 6.293 0 01-.044-.015l-.068-.025-.101-.037-.057-.022-.08-.03-.087-.035-.088-.035-.079-.032-.095-.04-.063-.028-.063-.027a5.655 5.655 0 01-.041-.018l-.066-.03-.103-.047-.052-.024-.096-.046-.062-.03-.084-.04-.086-.044-.093-.047-.052-.027-.103-.055-.057-.03-.058-.032a6.49 6.49 0 01-.046-.026l-.094-.053-.06-.034-.051-.03-.072-.041-.082-.05-.093-.056-.052-.032-.084-.053-.061-.039-.079-.05-.07-.047-.053-.035a7.785 7.785 0 01-.054-.036l-.044-.03-.044-.03a6.066 6.066 0 01-.04-.028l-.057-.04-.076-.054-.069-.05-.074-.054-.056-.042-.076-.057-.076-.059-.086-.067-.045-.035-.064-.052-.074-.06-.089-.073-.046-.039-.046-.039a7.516 7.516 0 01-.043-.037l-.045-.04-.061-.053-.07-.062-.068-.06-.062-.058-.067-.062-.053-.05-.088-.084a13.28 13.28 0 01-.099-.097l-.029-.028-.041-.042-.069-.07-.05-.051-.05-.053a6.457 6.457 0 01-.168-.179l-.08-.088-.062-.07-.071-.08-.042-.049-.053-.062-.058-.068-.046-.056a7.175 7.175 0 01-.027-.033l-.045-.055-.066-.082-.041-.052-.05-.064-.02-.025a11.99 11.99 0 01-1.44-2.402zm-1.02-5.794l11.353 3.037a20.468 20.468 0 00-.469 2.011l10.817 2.894a12.076 12.076 0 01-1.845 2.005L.657 15.923l-.016-.046-.035-.104a11.965 11.965 0 01-.05-.153l-.007-.023a11.896 11.896 0 01-.207-.741l-.03-.126-.018-.08-.021-.097-.018-.081-.018-.09-.017-.084-.018-.094c-.026-.141-.05-.283-.071-.426l-.017-.118-.011-.083-.013-.102a12.01 12.01 0 01-.019-.161l-.005-.047a12.12 12.12 0 01-.034-2.145zm1.593-5.15l11.948 3.196c-.368.605-.705 1.231-1.01 1.875l11.295 3.022c-.142.82-.368 1.612-.668 2.365l-11.55-3.09L.124 10.26l.015-.1.008-.049.01-.067.015-.087.018-.098c.026-.148.056-.295.088-.442l.028-.124.02-.085.024-.097c.022-.09.045-.18.07-.268l.028-.102.023-.083.03-.1.025-.082.03-.096.026-.082.031-.095a11.896 11.896 0 011.01-2.232zm4.442-4.4L17.352 4.59a20.77 20.77 0 00-1.688 1.721l7.823 2.093c.267.852.442 1.744.513 2.665L2.106 5.213l.045-.065.027-.04.04-.055.046-.065.055-.076.054-.072.064-.086.05-.065.057-.073.055-.07.06-.074.055-.069.065-.077.054-.066.066-.077.053-.06.072-.082.053-.06.067-.074.054-.058.073-.078.058-.06.063-.067.168-.17.1-.098.059-.056.076-.071a12.084 12.084 0 012.272-1.677zM12.017 0h.097l.082.001.069.001.054.002.068.002.046.001.076.003.047.002.06.003.054.002.087.005.105.007.144.011.088.007.044.004.077.008.082.008.047.005.102.012.05.006.108.014.081.01.042.006.065.01.207.032.07.012.065.011.14.026.092.018.11.022.046.01.075.016.041.01L14.7.3l.042.01.065.015.049.012.071.017.096.024.112.03.113.03.113.032.05.015.07.02.078.024.073.023.05.016.05.016.076.025.099.033.102.036.048.017.064.023.093.034.11.041.116.045.1.04.047.02.06.024.041.018.063.026.04.018.057.025.11.048.1.046.074.035.075.036.06.028.092.046.091.045.102.052.053.028.049.026.046.024.06.033.041.022.052.029.088.05.106.06.087.051.057.034.053.032.096.059.088.055.098.062.036.024.064.041.084.056.04.027.062.042.062.043.023.017c.054.037.108.075.161.114l.083.06.065.048.056.043.086.065.082.064.04.03.05.041.086.069.079.065.085.071c.712.6 1.353 1.283 1.909 2.031L7.222.994l.062-.027.065-.028.081-.034.086-.035c.113-.045.227-.09.341-.131l.096-.035.093-.033.084-.03.096-.031c.087-.03.176-.058.264-.085l.091-.027.086-.025.102-.03.085-.023.1-.026L9.04.37l.09-.023.091-.022.095-.022.09-.02.098-.021.091-.02.095-.018.092-.018.1-.018.091-.016.098-.017.092-.014.097-.015.092-.013.102-.013.091-.012.105-.012.09-.01.105-.01c.093-.01.186-.018.28-.024l.106-.008.09-.005.11-.006.093-.004.1-.004.097-.002.099-.002.197-.002z"})]}))}),E1="Volcengine";function At(n){"@babel/helpers - typeof";return At=typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?function(e){return typeof e}:function(e){return e&&typeof Symbol=="function"&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},At(n)}var O1=["size","style"];function ds(n,e){var t=Object.keys(n);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(n);e&&(o=o.filter(function(r){return Object.getOwnPropertyDescriptor(n,r).enumerable})),t.push.apply(t,o)}return t}function co(n){for(var e=1;e=0)&&Object.prototype.propertyIsEnumerable.call(n,o)&&(t[o]=n[o])}return t}function I1(n,e){if(n==null)return{};var t={},o=Object.keys(n),r,s;for(s=0;s=0)&&(t[r]=n[r]);return t}var T1=a.memo(function(n){var e=n.size,t=e===void 0?"1em":e,o=n.style,r=L1(n,O1);return i.jsxs("svg",co(co({fill:"currentColor",fillRule:"evenodd",height:t,style:co({flex:"none",lineHeight:1},o),viewBox:"0 0 24 24",width:t,xmlns:"http://www.w3.org/2000/svg"},r),{},{children:[i.jsx("title",{children:E1}),i.jsx("path",{d:"M7.29 5.36L3.148 21.737a.215.215 0 00.203.261h8.29a.214.214 0 00.215-.261L7.7 5.359a.214.214 0 00-.41 0z",fillOpacity:".5"}),i.jsx("path",{clipRule:"evenodd",d:"M4.553 16.18l-1.406 5.558a.214.214 0 00.203.261h2.42-4.551a.214.214 0 01-.214-.26l2.275-8.961a.214.214 0 01.409 0l.864 3.402z"}),i.jsx("path",{d:"M14.44.15a.214.214 0 00-.41 0L8.366 21.739a.214.214 0 00.214.261H19.9a.214.214 0 00.215-.261L14.44.151z",fillOpacity:".5"}),i.jsx("path",{clipRule:"evenodd",d:"M16.694 22h3.207a.215.215 0 00.214-.262l-1.839-6.993 1.164-4.592a.214.214 0 01.411 0l2.951 11.586a.214.214 0 01-.214.261h-5.894z"}),i.jsx("path",{d:"M10.278 7.741L6.685 21.736a.214.214 0 00.214.264h7.17a.216.216 0 00.214-.166.216.216 0 000-.098L10.687 7.742a.214.214 0 00-.409 0z"})]}))}),R1="Minimax";function Ft(n){"@babel/helpers - typeof";return Ft=typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?function(e){return typeof e}:function(e){return e&&typeof Symbol=="function"&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},Ft(n)}var N1=["size","style"];function us(n,e){var t=Object.keys(n);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(n);e&&(o=o.filter(function(r){return Object.getOwnPropertyDescriptor(n,r).enumerable})),t.push.apply(t,o)}return t}function uo(n){for(var e=1;e=0)&&Object.prototype.propertyIsEnumerable.call(n,o)&&(t[o]=n[o])}return t}function z1(n,e){if(n==null)return{};var t={},o=Object.keys(n),r,s;for(s=0;s=0)&&(t[r]=n[r]);return t}var B1=a.memo(function(n){var e=n.size,t=e===void 0?"1em":e,o=n.style,r=F1(n,N1);return i.jsxs("svg",uo(uo({fill:"currentColor",fillRule:"evenodd",height:t,style:uo({flex:"none",lineHeight:1},o),viewBox:"0 0 24 24",width:t,xmlns:"http://www.w3.org/2000/svg"},r),{},{children:[i.jsx("title",{children:R1}),i.jsx("path",{d:"M16.278 2c1.156 0 2.093.927 2.093 2.07v12.501a.74.74 0 00.744.709.74.74 0 00.743-.709V9.099a2.06 2.06 0 012.071-2.049A2.06 2.06 0 0124 9.1v6.561a.649.649 0 01-.652.645.649.649 0 01-.653-.645V9.1a.762.762 0 00-.766-.758.762.762 0 00-.766.758v7.472a2.037 2.037 0 01-2.048 2.026 2.037 2.037 0 01-2.048-2.026v-12.5a.785.785 0 00-.788-.753.785.785 0 00-.789.752l-.001 15.904A2.037 2.037 0 0113.441 22a2.037 2.037 0 01-2.048-2.026V18.04c0-.356.292-.645.652-.645.36 0 .652.289.652.645v1.934c0 .263.142.506.372.638.23.131.514.131.744 0a.734.734 0 00.372-.638V4.07c0-1.143.937-2.07 2.093-2.07zm-5.674 0c1.156 0 2.093.927 2.093 2.07v11.523a.648.648 0 01-.652.645.648.648 0 01-.652-.645V4.07a.785.785 0 00-.789-.78.785.785 0 00-.789.78v14.013a2.06 2.06 0 01-2.07 2.048 2.06 2.06 0 01-2.071-2.048V9.1a.762.762 0 00-.766-.758.762.762 0 00-.766.758v3.8a2.06 2.06 0 01-2.071 2.049A2.06 2.06 0 010 12.9v-1.378c0-.357.292-.646.652-.646.36 0 .653.29.653.646V12.9c0 .418.343.757.766.757s.766-.339.766-.757V9.099a2.06 2.06 0 012.07-2.048 2.06 2.06 0 012.071 2.048v8.984c0 .419.343.758.767.758.423 0 .766-.339.766-.758V4.07c0-1.143.937-2.07 2.093-2.07z"})]}))}),U1="Zhipu";function zt(n){"@babel/helpers - typeof";return zt=typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?function(e){return typeof e}:function(e){return e&&typeof Symbol=="function"&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},zt(n)}var V1=["size","style"];function ps(n,e){var t=Object.keys(n);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(n);e&&(o=o.filter(function(r){return Object.getOwnPropertyDescriptor(n,r).enumerable})),t.push.apply(t,o)}return t}function po(n){for(var e=1;e=0)&&Object.prototype.propertyIsEnumerable.call(n,o)&&(t[o]=n[o])}return t}function q1(n,e){if(n==null)return{};var t={},o=Object.keys(n),r,s;for(s=0;s=0)&&(t[r]=n[r]);return t}var G1=a.memo(function(n){var e=n.size,t=e===void 0?"1em":e,o=n.style,r=Z1(n,V1);return i.jsxs("svg",po(po({fill:"currentColor",fillRule:"evenodd",height:t,style:po({flex:"none",lineHeight:1},o),viewBox:"0 0 24 24",width:t,xmlns:"http://www.w3.org/2000/svg"},r),{},{children:[i.jsx("title",{children:U1}),i.jsx("path",{d:"M11.991 23.503a.24.24 0 00-.244.248.24.24 0 00.244.249.24.24 0 00.245-.249.24.24 0 00-.22-.247l-.025-.001zM9.671 5.365a1.697 1.697 0 011.099 2.132l-.071.172-.016.04-.018.054c-.07.16-.104.32-.104.498-.035.71.47 1.279 1.186 1.314h.366c1.309.053 2.338 1.173 2.286 2.523-.052 1.332-1.152 2.38-2.478 2.327h-.174c-.715.018-1.274.64-1.239 1.368 0 .124.018.23.053.337.209.373.54.658.96.8.75.23 1.517-.125 1.9-.782l.018-.035c.402-.64 1.17-.96 1.92-.711.854.284 1.378 1.226 1.099 2.167a1.661 1.661 0 01-2.077 1.102 1.711 1.711 0 01-.907-.711l-.017-.035c-.2-.323-.463-.58-.851-.711l-.056-.018a1.646 1.646 0 00-1.954.746 1.66 1.66 0 01-1.065.764 1.677 1.677 0 01-1.989-1.279c-.209-.906.332-1.83 1.257-2.043a1.51 1.51 0 01.296-.035h.018c.68-.071 1.151-.622 1.116-1.333a1.307 1.307 0 00-.227-.693 2.515 2.515 0 01-.366-1.403 2.39 2.39 0 01.366-1.208c.14-.195.21-.444.227-.693.018-.71-.506-1.261-1.186-1.332l-.07-.018a1.43 1.43 0 01-.299-.07l-.05-.019a1.7 1.7 0 01-1.047-2.114 1.68 1.68 0 012.094-1.101zm-5.575 10.11c.26-.264.639-.367.994-.27.355.096.633.379.728.74.095.362-.007.748-.267 1.013-.402.41-1.053.41-1.455 0a1.062 1.062 0 010-1.482zm14.845-.294c.359-.09.738.024.992.297.254.274.344.665.237 1.025-.107.36-.396.634-.756.718-.551.128-1.1-.22-1.23-.781a1.05 1.05 0 01.757-1.26zm-.064-4.39c.314.32.49.753.49 1.206 0 .452-.176.886-.49 1.206-.315.32-.74.5-1.185.5-.444 0-.87-.18-1.184-.5a1.727 1.727 0 010-2.412 1.654 1.654 0 012.369 0zm-11.243.163c.364.484.447 1.128.218 1.691a1.665 1.665 0 01-2.188.923c-.855-.36-1.26-1.358-.907-2.228a1.68 1.68 0 011.33-1.038c.593-.08 1.183.169 1.547.652zm11.545-4.221c.368 0 .708.2.892.524.184.324.184.724 0 1.048a1.026 1.026 0 01-.892.524c-.568 0-1.03-.47-1.03-1.048 0-.579.462-1.048 1.03-1.048zm-14.358 0c.368 0 .707.2.891.524.184.324.184.724 0 1.048a1.026 1.026 0 01-.891.524c-.569 0-1.03-.47-1.03-1.048 0-.579.461-1.048 1.03-1.048zm10.031-1.475c.925 0 1.675.764 1.675 1.706s-.75 1.705-1.675 1.705-1.674-.763-1.674-1.705c0-.942.75-1.706 1.674-1.706zm-2.626-.684c.362-.082.653-.356.761-.718a1.062 1.062 0 00-.238-1.028 1.017 1.017 0 00-.996-.294c-.547.14-.881.7-.752 1.257.13.558.675.907 1.225.783zm0 16.876c.359-.087.644-.36.75-.72a1.062 1.062 0 00-.237-1.019 1.018 1.018 0 00-.985-.301 1.037 1.037 0 00-.762.717c-.108.361-.017.754.239 1.028.245.263.606.377.953.305l.043-.01zM17.19 3.5a.631.631 0 00.628-.64c0-.355-.279-.64-.628-.64a.631.631 0 00-.628.64c0 .355.28.64.628.64zm-10.38 0a.631.631 0 00.628-.64c0-.355-.28-.64-.628-.64a.631.631 0 00-.628.64c0 .355.279.64.628.64zm-5.182 7.852a.631.631 0 00-.628.64c0 .354.28.639.628.639a.63.63 0 00.627-.606l.001-.034a.62.62 0 00-.628-.64zm5.182 9.13a.631.631 0 00-.628.64c0 .355.279.64.628.64a.631.631 0 00.628-.64c0-.355-.28-.64-.628-.64zm10.38.018a.631.631 0 00-.628.64c0 .355.28.64.628.64a.631.631 0 00.628-.64c0-.355-.279-.64-.628-.64zm5.182-9.148a.631.631 0 00-.628.64c0 .354.279.639.628.639a.631.631 0 00.628-.64c0-.355-.28-.64-.628-.64zm-.384-4.992a.24.24 0 00.244-.249.24.24 0 00-.244-.249.24.24 0 00-.244.249c0 .142.122.249.244.249zM11.991.497a.24.24 0 00.245-.248A.24.24 0 0011.99 0a.24.24 0 00-.244.249c0 .133.108.236.223.247l.021.001zM2.011 6.36a.24.24 0 00.245-.249.24.24 0 00-.244-.249.24.24 0 00-.244.249.24.24 0 00.244.249zm0 11.263a.24.24 0 00-.243.248.24.24 0 00.244.249.24.24 0 00.244-.249.252.252 0 00-.244-.248zm19.995-.018a.24.24 0 00-.245.248.24.24 0 00.245.25.24.24 0 00.244-.25.252.252 0 00-.244-.248z"})]}))}),Q1="StepFun";function Bt(n){"@babel/helpers - typeof";return Bt=typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?function(e){return typeof e}:function(e){return e&&typeof Symbol=="function"&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},Bt(n)}var Y1=["size","style"];function hs(n,e){var t=Object.keys(n);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(n);e&&(o=o.filter(function(r){return Object.getOwnPropertyDescriptor(n,r).enumerable})),t.push.apply(t,o)}return t}function ho(n){for(var e=1;e=0)&&Object.prototype.propertyIsEnumerable.call(n,o)&&(t[o]=n[o])}return t}function np(n,e){if(n==null)return{};var t={},o=Object.keys(n),r,s;for(s=0;s=0)&&(t[r]=n[r]);return t}var op=a.memo(function(n){var e=n.size,t=e===void 0?"1em":e,o=n.style,r=tp(n,Y1);return i.jsxs("svg",ho(ho({fill:"currentColor",fillRule:"evenodd",height:t,style:ho({flex:"none",lineHeight:1},o),viewBox:"0 0 24 24",width:t,xmlns:"http://www.w3.org/2000/svg"},r),{},{children:[i.jsx("title",{children:Q1}),i.jsx("path",{d:"M12 0C5.372 0 0 5.372 0 12s5.372 12 12 12 12-5.372 12-12S18.628 0 12 0zM8.762 19.614H4.376v-4.386h4.386v4.386zm5.423 0H9.798v-4.386h4.387v4.386zm0-5.42H9.798V9.81h4.387v4.386zm0-5.418H9.798V4.39h4.387v4.386zm5.422-.004h-4.386V4.386h4.386v4.386z"})]}))}),rp="Kimi";function Ut(n){"@babel/helpers - typeof";return Ut=typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?function(e){return typeof e}:function(e){return e&&typeof Symbol=="function"&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},Ut(n)}var sp=["size","style"];function ms(n,e){var t=Object.keys(n);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(n);e&&(o=o.filter(function(r){return Object.getOwnPropertyDescriptor(n,r).enumerable})),t.push.apply(t,o)}return t}function mo(n){for(var e=1;e=0)&&Object.prototype.propertyIsEnumerable.call(n,o)&&(t[o]=n[o])}return t}function dp(n,e){if(n==null)return{};var t={},o=Object.keys(n),r,s;for(s=0;s=0)&&(t[r]=n[r]);return t}var up=a.memo(function(n){var e=n.size,t=e===void 0?"1em":e,o=n.style,r=cp(n,sp);return i.jsxs("svg",mo(mo({fill:"currentColor",fillRule:"evenodd",height:t,style:mo({flex:"none",lineHeight:1},o),viewBox:"0 0 24 24",width:t,xmlns:"http://www.w3.org/2000/svg"},r),{},{children:[i.jsx("title",{children:rp}),i.jsx("path",{d:"M21.846 0a1.923 1.923 0 110 3.846H20.15a.226.226 0 01-.227-.226V1.923C19.923.861 20.784 0 21.846 0z"}),i.jsx("path",{d:"M11.065 11.199l7.257-7.2c.137-.136.06-.41-.116-.41H14.3a.164.164 0 00-.117.051l-7.82 7.756c-.122.12-.302.013-.302-.179V3.82c0-.127-.083-.23-.185-.23H3.186c-.103 0-.186.103-.186.23V19.77c0 .128.083.23.186.23h2.69c.103 0 .186-.102.186-.23v-3.25c0-.069.025-.135.069-.178l2.424-2.406a.158.158 0 01.205-.023l6.484 4.772a7.677 7.677 0 003.453 1.283c.108.012.2-.095.2-.23v-3.06c0-.117-.07-.212-.164-.227a5.028 5.028 0 01-2.027-.807l-5.613-4.064c-.117-.078-.132-.279-.028-.381z"})]}))}),pp="OpenRouter";function Vt(n){"@babel/helpers - typeof";return Vt=typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?function(e){return typeof e}:function(e){return e&&typeof Symbol=="function"&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},Vt(n)}var hp=["size","style"];function fs(n,e){var t=Object.keys(n);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(n);e&&(o=o.filter(function(r){return Object.getOwnPropertyDescriptor(n,r).enumerable})),t.push.apply(t,o)}return t}function fo(n){for(var e=1;e=0)&&Object.prototype.propertyIsEnumerable.call(n,o)&&(t[o]=n[o])}return t}function bp(n,e){if(n==null)return{};var t={},o=Object.keys(n),r,s;for(s=0;s=0)&&(t[r]=n[r]);return t}var vp=a.memo(function(n){var e=n.size,t=e===void 0?"1em":e,o=n.style,r=yp(n,hp);return i.jsxs("svg",fo(fo({fill:"currentColor",fillRule:"evenodd",height:t,style:fo({flex:"none",lineHeight:1},o),viewBox:"0 0 24 24",width:t,xmlns:"http://www.w3.org/2000/svg"},r),{},{children:[i.jsx("title",{children:pp}),i.jsx("path",{d:"M18.654 3.87a5.087 5.087 0 110 10.174L23.7 19.09c.64.641.187 1.737-.72 1.737H8.48a8.479 8.479 0 010-16.958h10.175zM8.479 7.26a5.087 5.087 0 100 10.176 5.087 5.087 0 000-10.175z"})]}))}),xp="Groq";function Kt(n){"@babel/helpers - typeof";return Kt=typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?function(e){return typeof e}:function(e){return e&&typeof Symbol=="function"&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},Kt(n)}var wp=["size","style"];function gs(n,e){var t=Object.keys(n);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(n);e&&(o=o.filter(function(r){return Object.getOwnPropertyDescriptor(n,r).enumerable})),t.push.apply(t,o)}return t}function go(n){for(var e=1;e=0)&&Object.prototype.propertyIsEnumerable.call(n,o)&&(t[o]=n[o])}return t}function Ep(n,e){if(n==null)return{};var t={},o=Object.keys(n),r,s;for(s=0;s=0)&&(t[r]=n[r]);return t}var Op=a.memo(function(n){var e=n.size,t=e===void 0?"1em":e,o=n.style,r=jp(n,wp);return i.jsxs("svg",go(go({fill:"currentColor",fillRule:"evenodd",height:t,style:go({flex:"none",lineHeight:1},o),viewBox:"0 0 24 24",width:t,xmlns:"http://www.w3.org/2000/svg"},r),{},{children:[i.jsx("title",{children:xp}),i.jsx("path",{d:"M12.036 2c-3.853-.035-7 3-7.036 6.781-.035 3.782 3.055 6.872 6.908 6.907h2.42v-2.566h-2.292c-2.407.028-4.38-1.866-4.408-4.23-.029-2.362 1.901-4.298 4.308-4.326h.1c2.407 0 4.358 1.915 4.365 4.278v6.305c0 2.342-1.944 4.25-4.323 4.279a4.375 4.375 0 01-3.033-1.252l-1.851 1.818A7 7 0 0012.029 22h.092c3.803-.056 6.858-3.083 6.879-6.816v-6.5C18.907 4.963 15.817 2 12.036 2z"})]}))}),Pp="Cohere";function Wt(n){"@babel/helpers - typeof";return Wt=typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?function(e){return typeof e}:function(e){return e&&typeof Symbol=="function"&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},Wt(n)}var _p=["size","style"];function ys(n,e){var t=Object.keys(n);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(n);e&&(o=o.filter(function(r){return Object.getOwnPropertyDescriptor(n,r).enumerable})),t.push.apply(t,o)}return t}function yo(n){for(var e=1;e=0)&&Object.prototype.propertyIsEnumerable.call(n,o)&&(t[o]=n[o])}return t}function Rp(n,e){if(n==null)return{};var t={},o=Object.keys(n),r,s;for(s=0;s=0)&&(t[r]=n[r]);return t}var Np=a.memo(function(n){var e=n.size,t=e===void 0?"1em":e,o=n.style,r=Tp(n,_p);return i.jsxs("svg",yo(yo({fill:"currentColor",fillRule:"evenodd",height:t,style:yo({flex:"none",lineHeight:1},o),viewBox:"0 0 24 24",width:t,xmlns:"http://www.w3.org/2000/svg"},r),{},{children:[i.jsx("title",{children:Pp}),i.jsx("path",{clipRule:"evenodd",d:"M8.128 14.099c.592 0 1.77-.033 3.398-.703 1.897-.781 5.672-2.2 8.395-3.656 1.905-1.018 2.74-2.366 2.74-4.18A4.56 4.56 0 0018.1 1H7.549A6.55 6.55 0 001 7.55c0 3.617 2.745 6.549 7.128 6.549z"}),i.jsx("path",{clipRule:"evenodd",d:"M9.912 18.61a4.387 4.387 0 012.705-4.052l3.323-1.38c3.361-1.394 7.06 1.076 7.06 4.715a5.104 5.104 0 01-5.105 5.104l-3.597-.001a4.386 4.386 0 01-4.386-4.387z"}),i.jsx("path",{d:"M4.776 14.962A3.775 3.775 0 001 18.738v.489a3.776 3.776 0 007.551 0v-.49a3.775 3.775 0 00-3.775-3.775z"})]}))}),Dp="Grok";function Ht(n){"@babel/helpers - typeof";return Ht=typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?function(e){return typeof e}:function(e){return e&&typeof Symbol=="function"&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},Ht(n)}var $p=["size","style"];function bs(n,e){var t=Object.keys(n);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(n);e&&(o=o.filter(function(r){return Object.getOwnPropertyDescriptor(n,r).enumerable})),t.push.apply(t,o)}return t}function bo(n){for(var e=1;e=0)&&Object.prototype.propertyIsEnumerable.call(n,o)&&(t[o]=n[o])}return t}function Up(n,e){if(n==null)return{};var t={},o=Object.keys(n),r,s;for(s=0;s=0)&&(t[r]=n[r]);return t}var Vp=a.memo(function(n){var e=n.size,t=e===void 0?"1em":e,o=n.style,r=Bp(n,$p);return i.jsxs("svg",bo(bo({fill:"currentColor",fillRule:"evenodd",height:t,style:bo({flex:"none",lineHeight:1},o),viewBox:"0 0 24 24",width:t,xmlns:"http://www.w3.org/2000/svg"},r),{},{children:[i.jsx("title",{children:Dp}),i.jsx("path",{d:"M6.469 8.776L16.512 23h-4.464L2.005 8.776H6.47zm-.004 7.9l2.233 3.164L6.467 23H2l4.465-6.324zM22 2.582V23h-3.659V7.764L22 2.582zM22 1l-9.952 14.095-2.233-3.163L17.533 1H22z"})]}))}),Kp="Baichuan";function Zt(n){"@babel/helpers - typeof";return Zt=typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?function(e){return typeof e}:function(e){return e&&typeof Symbol=="function"&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},Zt(n)}var Wp=["size","style"];function vs(n,e){var t=Object.keys(n);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(n);e&&(o=o.filter(function(r){return Object.getOwnPropertyDescriptor(n,r).enumerable})),t.push.apply(t,o)}return t}function vo(n){for(var e=1;e=0)&&Object.prototype.propertyIsEnumerable.call(n,o)&&(t[o]=n[o])}return t}function Qp(n,e){if(n==null)return{};var t={},o=Object.keys(n),r,s;for(s=0;s=0)&&(t[r]=n[r]);return t}var Yp=a.memo(function(n){var e=n.size,t=e===void 0?"1em":e,o=n.style,r=Gp(n,Wp);return i.jsxs("svg",vo(vo({fill:"currentColor",fillRule:"evenodd",height:t,style:vo({flex:"none",lineHeight:1},o),viewBox:"0 0 24 24",width:t,xmlns:"http://www.w3.org/2000/svg"},r),{},{children:[i.jsx("title",{children:Kp}),i.jsx("path",{d:"M7.333 2h-3.2l-2 4.333V17.8L0 22h5.2l2.028-4.2L7.333 2zm7.334 0h-5.2v20h5.2V2zM16.8 7.733H22V22h-5.2V7.733zM22 2h-5.2v4.133H22V2z"})]}))}),Xp="ByteDance";function qt(n){"@babel/helpers - typeof";return qt=typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?function(e){return typeof e}:function(e){return e&&typeof Symbol=="function"&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},qt(n)}var Jp=["size","style"];function xs(n,e){var t=Object.keys(n);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(n);e&&(o=o.filter(function(r){return Object.getOwnPropertyDescriptor(n,r).enumerable})),t.push.apply(t,o)}return t}function xo(n){for(var e=1;e=0)&&Object.prototype.propertyIsEnumerable.call(n,o)&&(t[o]=n[o])}return t}function rh(n,e){if(n==null)return{};var t={},o=Object.keys(n),r,s;for(s=0;s=0)&&(t[r]=n[r]);return t}var sh=a.memo(function(n){var e=n.size,t=e===void 0?"1em":e,o=n.style,r=oh(n,Jp);return i.jsxs("svg",xo(xo({fill:"currentColor",fillRule:"evenodd",height:t,style:xo({flex:"none",lineHeight:1},o),viewBox:"0 0 24 24",width:t,xmlns:"http://www.w3.org/2000/svg"},r),{},{children:[i.jsx("title",{children:Xp}),i.jsx("path",{d:"M14.944 18.587l-1.704-.445V10.01l1.824-.462c1-.254 1.84-.461 1.88-.453.032 0 .056 2.235.056 4.972v4.973l-.176-.008c-.104 0-.952-.207-1.88-.446z"}),i.jsx("path",{d:"M7 16.542c0-2.736.024-4.98.064-4.98.032-.008.872.2 1.88.454l1.816.461-.016 4.05-.024 4.049-1.632.422c-.896.23-1.736.445-1.856.469L7 21.523v-4.98z"}),i.jsx("path",{d:"M19.24 12.477c0-9.03.008-9.515.144-9.475.072.024.784.207 1.576.406.792.207 1.576.405 1.744.445l.296.08-.016 8.56-.024 8.568-1.624.414c-.888.23-1.728.437-1.856.47l-.24.055v-9.523z"}),i.jsx("path",{d:"M1 12.509c0-4.678.024-8.505.064-8.505.032 0 .872.207 1.872.454l1.824.461v7.582c0 4.16-.016 7.574-.032 7.574-.024 0-.872.215-1.88.47L1 21.013v-8.505z"})]}))});const ih={openai:{key:"openai",displayName:"OpenAI",color:"#10A37F",Component:S0},anthropic:{key:"anthropic",displayName:"Claude",color:"#D97706",Component:L0},deepseek:{key:"deepseek",displayName:"DeepSeek",color:"#4D6BFE",Component:F0},qwen:{key:"qwen",displayName:"Qwen",color:"#615CED",Component:Z0},google:{key:"google",displayName:"Google",color:"#4285F4",Component:t1},meta:{key:"meta",displayName:"Meta",color:"#0081FB",Component:c1},mistral:{key:"mistral",displayName:"Mistral",color:"#FF7000",Component:y1},moonshot:{key:"moonshot",displayName:"Moonshot",color:"#7C3AED",Component:j1},doubao:{key:"doubao",displayName:"火山引擎",color:"#006EFF",Component:T1},minimax:{key:"minimax",displayName:"MiniMax",color:"#F23F5D",Component:B1},zhipu:{key:"zhipu",displayName:"Zhipu",color:"#3859FF",Component:G1},stepfun:{key:"stepfun",displayName:"StepFun",color:"#005AFF",Component:op},kimi:{key:"kimi",displayName:"Kimi",color:"#000000",Component:up},openrouter:{key:"openrouter",displayName:"OpenRouter",color:"#6366F1",Component:vp},groq:{key:"groq",displayName:"Groq",color:"#F55036",Component:Op},cohere:{key:"cohere",displayName:"Cohere",color:"#39594D",Component:Np},xai:{key:"xai",displayName:"xAI",color:"#000000",Component:Vp},baichuan:{key:"baichuan",displayName:"Baichuan",color:"#4A90E2",Component:Yp},bytedance:{key:"bytedance",displayName:"ByteDance",color:"#006EFF",Component:sh}};function ji(n){return ih[n]}function Cn(n){const e=(n||"").toLowerCase(),t=e.lastIndexOf("/"),o=t>=0?e.slice(t+1):e;return o.startsWith("claude")||e.includes("anthropic")?"anthropic":o.startsWith("gpt")||o.startsWith("o1")||o.startsWith("o3")||o.startsWith("o4")?"openai":e.includes("deepseek")?"deepseek":o.startsWith("qwen")?"qwen":o.startsWith("moonshot")?"moonshot":o.startsWith("glm")?"zhipu":o.startsWith("step-")?"stepfun":o.startsWith("doubao")?"doubao":o.startsWith("minimax")||o.startsWith("abab")?"minimax":e.includes("gemini")?"google":o.startsWith("llama")||e.includes("meta-llama")?"meta":o.startsWith("mistral")||o.startsWith("mixtral")||o.startsWith("codestral")?"mistral":o.startsWith("command")?"cohere":o.startsWith("grok")?"xai":o.startsWith("baichuan")?"baichuan":o.startsWith("kimi")?"kimi":null}const wo={deepseek:"#4D6BFE",dashscope:"#615CED",qwen:"#615CED",openai:"#10A37F",anthropic:"#D97706",openrouter:"#6366F1",google:"#4285F4",moonshot:"#7C3AED",kimi:"#7C3AED",doubao:"#006EFF",minimax:"#F23F5D",zhipu:"#3859FF",stepfun:"#005AFF"};function Ei(n,e){const t=(n||"").toLowerCase();for(const[r,s]of Object.entries(wo))if(t.includes(r))return s;const o=Cn(e||"");return o&&wo[o]?wo[o]:"var(--semi-color-text-3, #8f959e)"}function ah(n,e){const t=(n||"").toLowerCase();if(t.includes("deepseek"))return"DEEPSEEK";if(t.includes("dashscope")||t.includes("qwen"))return"QWEN";if(t.includes("anthropic"))return"ANTHROPIC";if(t.includes("openai"))return"OPENAI";if(t.includes("openrouter"))return"OPENROUTER";if(t.includes("google"))return"GOOGLE";if(t.includes("moonshot"))return"KIMI";if(t.includes("volces")||t.includes("volcengine"))return"DOUBAO";if(t.includes("minimax"))return"MINIMAX";if(t.includes("bigmodel")||t.includes("zhipu"))return"ZHIPU";if(t.includes("stepfun"))return"STEPFUN";const o=Cn(e||"");return o?o.toUpperCase():"OTHER"}function lh(n){const e=String(n||""),t=e.indexOf("/");return(t>=0?e.slice(t+1):e).trim()}function pt(n){const e=n.model||"",t=e.lastIndexOf("/");return t>=0?e.slice(t+1):e||lh(n.name)}function ch(n,e,t,o){const r=n[e],s=r?pt(r):"";if(t==null||t===e)return s;const l=n[t];return l?`${pt(l)} → ${s}`:s}function ws({apibase:n,model:e,size:t=14}){const o=Cn(e||"")||dh(n),r=o?ji(o):void 0;if(r!=null&&r.Component){const s=r.Component;return i.jsx(s,{size:t})}return i.jsx("span",{"data-slot":"provider-dot",style:{background:Ei(n,e)}})}function dh(n){const e=(n||"").toLowerCase();return e.includes("deepseek")?"deepseek":e.includes("dashscope")||e.includes("qwen")?"qwen":e.includes("anthropic")?"anthropic":e.includes("openai")?"openai":e.includes("openrouter")?"openrouter":e.includes("google")?"google":e.includes("moonshot")?"moonshot":e.includes("volces")||e.includes("volcengine")?"doubao":e.includes("minimax")?"minimax":e.includes("bigmodel")||e.includes("zhipu")?"zhipu":e.includes("stepfun")?"stepfun":null}function uh(n){const e=[],t=new Map;return n.forEach((o,r)=>{if(o.kind==="mixin"){e.push({profile:o,idx:r});return}const s=ah(o.apibase,o.model);t.has(s)||t.set(s,{provider:s,color:Ei(o.apibase,o.model),items:[]}),t.get(s).items.push({profile:o,idx:r})}),{groups:Array.from(t.values()),mixins:e}}function ph({selectedNo:n,runningNo:e,isRunning:t,onSelect:o}={}){const[r,s]=a.useState(!1),[l,c]=a.useState(""),[u,p]=a.useState(null),[d,m]=a.useState(!1),f=a.useRef(null),b=a.useRef(null),y=a.useRef(null),S=a.useRef(null),{lang:w,t:C}=ce(),k=H(T=>T.modelProfiles),_=H(T=>T.defaultModelNo),x=H(T=>T.liveModel),j=X(T=>T.sessionModelNo),v=X(T=>T.status),O=X(T=>T.selectSessionModel),E=n??j??_,D=e!==void 0?e:x==null?void 0:x.runningLlmNo,P=t??v==="running",R=k.length===0,L=k[E],z=a.useMemo(()=>L?P&&D!=null&&D!==E?ch(k,E,D):L.kind==="mixin"?C("model.aggregationShort"):pt(L):C("model.menuLabel"),[L,P,k,D,E,C]),{groups:W,mixins:A}=a.useMemo(()=>uh(k),[k]),M=a.useMemo(()=>{if(!l.trim())return W;const T=l.toLowerCase();return W.map(F=>({...F,items:F.items.filter(({profile:Q})=>pt(Q).toLowerCase().includes(T)||(Q.model||"").toLowerCase().includes(T)||F.provider.toLowerCase().includes(T))})).filter(F=>F.items.length>0)},[W,l]),Z=a.useCallback(()=>{s(T=>(T||c(""),!T))},[]),ue=a.useCallback(T=>{o?o(T):O(T),s(!1)},[o,O]);a.useEffect(()=>{r&&S.current&&S.current.focus()},[r]),a.useEffect(()=>{var Q;const T=(Q=y.current)==null?void 0:Q.closest('[data-slot="composer-toolbar"]');if(!T)return;const F=new ResizeObserver(se=>{var Ce,pe;const te=((pe=(Ce=se[0])==null?void 0:Ce.contentRect)==null?void 0:pe.width)??T.offsetWidth;m(te<320)});return F.observe(T),()=>F.disconnect()},[]),a.useEffect(()=>{if(!r)return;function T(Q){f.current&&!f.current.contains(Q.target)&&b.current&&!b.current.contains(Q.target)&&s(!1)}function F(Q){Q.key==="Escape"&&s(!1)}return document.addEventListener("mousedown",T),document.addEventListener("keydown",F),()=>{document.removeEventListener("mousedown",T),document.removeEventListener("keydown",F)}},[r]),a.useEffect(()=>{function T(F){if((F.metaKey||F.ctrlKey)&&F.key>="1"&&F.key<="9"){const Q=parseInt(F.key)-1;Qdocument.removeEventListener("keydown",T)},[k,O]);const we=a.useCallback(()=>{s(!1),H.getState().open()},[]);return i.jsxs("div",{ref:y,"data-slot":"model-selector",children:[i.jsx("button",{ref:b,"data-slot":"model-chip","data-loading":R?"":void 0,"data-open":r?"":void 0,onClick:Z,title:L?L.kind==="mixin"?C("model.aggregation"):`${L.model}${L.apibase?" @ "+L.apibase:""}`:C("model.menuLabel"),children:R?i.jsx("span",{"data-slot":"model-chip-spinner",children:i.jsx("span",{})}):i.jsxs(i.Fragment,{children:[!d&&i.jsx("span",{"data-slot":"model-chip-label",children:z}),i.jsx("span",{"data-slot":"model-chip-caret","data-open":r?"":void 0,children:i.jsx(Cs,{})})]})}),r&&!R&&i.jsxs("div",{ref:f,"data-slot":"model-menu",children:[i.jsxs("div",{"data-slot":"model-menu-search",children:[i.jsx(hh,{}),i.jsx("input",{ref:S,type:"text",placeholder:C("model.menuLabel"),value:l,onChange:T=>c(T.target.value),"data-slot":"model-menu-search-input"})]}),i.jsxs("div",{"data-slot":"model-menu-body",children:[M.map(T=>{var F,Q;return i.jsxs("div",{"data-slot":"model-menu-section",children:[i.jsxs("div",{"data-slot":"model-menu-section-header",children:[i.jsx(ws,{apibase:((F=T.items[0])==null?void 0:F.profile.apibase)||"",model:(Q=T.items[0])==null?void 0:Q.profile.model}),T.provider]}),T.items.map(({profile:se,idx:te})=>i.jsxs("button",{"data-slot":"model-menu-item","data-active":te===E?"":void 0,onClick:()=>ue(te),title:`${se.model}${se.apibase?" @ "+se.apibase:""}`,children:[te===E&&i.jsx("span",{"data-slot":"model-check",children:"✓"}),i.jsx("span",{"data-slot":"model-menu-name",children:pt(se)})]},se.id))]},T.provider)}),A.length>0&&i.jsxs("div",{"data-slot":"model-menu-section",children:[i.jsx("div",{"data-slot":"model-menu-section-header",children:C("model.aggregationShort").toUpperCase()}),A.map(({profile:T,idx:F})=>{var te;const Q=u===F,se=((te=T.name)==null?void 0:te.trim())||C("model.aggregationShort");return i.jsxs("div",{"data-slot":"model-menu-group",children:[i.jsxs("button",{"data-slot":"model-menu-item","data-active":F===E?"":void 0,onClick:()=>ue(F),title:C("model.aggregationDesc"),children:[F===E&&i.jsx("span",{"data-slot":"model-check",children:"✓"}),i.jsx("span",{"data-slot":"model-menu-name",children:se}),T.members&&T.members.length>0&&i.jsx("span",{"data-slot":"mixin-caret","data-expanded":Q?"":void 0,onClick:Ce=>{Ce.stopPropagation(),p(Q?null:F)},children:i.jsx(Cs,{})})]}),Q&&T.members&&i.jsxs("div",{"data-slot":"mixin-members",children:[T.members.map(Ce=>{const pe=k.find(vt=>vt.name===Ce);return i.jsxs("div",{"data-slot":"mixin-member",children:[i.jsx(ws,{apibase:(pe==null?void 0:pe.apibase)||"",model:pe==null?void 0:pe.model,size:12}),i.jsx("span",{"data-slot":"model-menu-name",children:pe?pt(pe):String(Ce)})]},Ce)}),T.members.length===0&&i.jsx("div",{"data-slot":"mixin-member",style:{opacity:.5},children:C("model.emptyMixin")})]})]},T.id)})]}),M.length===0&&A.length===0&&i.jsx("div",{"data-slot":"model-menu-empty",children:C("set.noModels")})]}),i.jsx("div",{"data-slot":"model-menu-footer",children:i.jsx("button",{"data-slot":"model-menu-action",onClick:we,children:w==="zh"?"编辑模型…":"Edit models…"})})]})]})}function Cs(){return i.jsx("svg",{width:"10",height:"10",viewBox:"0 0 10 10",fill:"currentColor","aria-hidden":"true",children:i.jsx("path",{d:"M2.5 3.5L5 6.5L7.5 3.5",stroke:"currentColor",strokeWidth:"1.2",strokeLinecap:"round",strokeLinejoin:"round",fill:"none"})})}function hh(){return i.jsx("svg",{width:"12",height:"12",viewBox:"0 0 16 16",fill:"none","aria-hidden":"true","data-slot":"model-menu-search-icon",children:i.jsx("path",{d:"M7 12A5 5 0 107 2a5 5 0 000 10zM14 14l-3.5-3.5",stroke:"currentColor",strokeWidth:"1.5",strokeLinecap:"round",strokeLinejoin:"round"})})}const mh={pdf:{char:"📄",color:"#E53E3E"},doc:{char:"📝",color:"#2B6CB0"},docx:{char:"📝",color:"#2B6CB0"},xls:{char:"📊",color:"#276749"},xlsx:{char:"📊",color:"#276749"},csv:{char:"📊",color:"#276749"},zip:{char:"📦",color:"#744210"},rar:{char:"📦",color:"#744210"},py:{char:"🐍",color:"#3182CE"},js:{char:"⚡",color:"#D69E2E"},ts:{char:"⚡",color:"#3182CE"},md:{char:"📋",color:"#4A5568"},txt:{char:"📋",color:"#4A5568"},json:{char:"{ }",color:"#6366F1"}};function fh(n){var t;const e=((t=n.split(".").pop())==null?void 0:t.toLowerCase())||"";return mh[e]||{char:"📎",color:"var(--semi-color-text-3, #8f959e)"}}function gh(n){return!n||n<0?"":n<1024?n+" B":n<1048576?(n/1024).toFixed(1)+" KB":(n/1048576).toFixed(1)+" MB"}function yh(n){try{return new URL(n).hostname}catch{return n.slice(0,30)}}function bh({files:n,onRemove:e,onRetry:t}){const o=a.useCallback(s=>l=>{l.stopPropagation(),e(s)},[e]),r=a.useCallback(s=>l=>{l.stopPropagation(),t==null||t(s)},[t]);return n.length===0?null:i.jsx("div",{"data-slot":"attachment-strip","data-has-items":"",children:n.map(s=>{if(s.type==="image"&&s.preview)return i.jsxs("div",{"data-slot":"attachment-thumb","data-status":s.status,children:[i.jsx("img",{src:s.preview,alt:s.name}),s.status==="uploading"&&i.jsx("span",{"data-slot":"attachment-spinner"}),s.status==="error"&&i.jsx("button",{"data-slot":"attachment-error-badge",onClick:r(s.id),title:s.errorMsg||"Error",children:"!"}),s.status!=="uploading"&&i.jsx("button",{"data-slot":"attachment-remove",onClick:o(s.id),"aria-label":"Remove",children:"×"})]},s.id);if(s.type==="url")return i.jsxs("div",{"data-slot":"attachment-file-chip","data-status":s.status,children:[i.jsx("span",{"data-slot":"attachment-file-icon",children:"🔗"}),i.jsx("span",{"data-slot":"attachment-file-meta",children:i.jsx("span",{"data-slot":"attachment-file-name",children:s.url?yh(s.url):s.name})}),i.jsx("button",{"data-slot":"attachment-remove",onClick:o(s.id),"aria-label":"Remove",children:"×"})]},s.id);const l=fh(s.name);return i.jsxs("div",{"data-slot":"attachment-file-chip","data-status":s.status,children:[s.status==="uploading"?i.jsx("span",{"data-slot":"attachment-spinner"}):s.status==="error"?i.jsx("button",{"data-slot":"attachment-error-badge",onClick:r(s.id),title:s.errorMsg||"Error",children:"!"}):i.jsx("span",{"data-slot":"attachment-file-icon",style:{color:l.color},children:l.char}),i.jsxs("span",{"data-slot":"attachment-file-meta",children:[i.jsx("span",{"data-slot":"attachment-file-name",children:s.name}),s.status==="error"&&s.errorMsg&&i.jsx("span",{"data-slot":"attachment-file-error",children:s.errorMsg}),s.status!=="error"&&s.size>0&&i.jsx("span",{"data-slot":"attachment-file-size",children:gh(s.size)})]}),s.status!=="uploading"&&i.jsx("button",{"data-slot":"attachment-remove",onClick:o(s.id),"aria-label":"Remove",children:"×"})]},s.id)})})}const vh="ga_custom_presets";function xh(){try{const n=localStorage.getItem(vh);return n?JSON.parse(n):[]}catch{return[]}}const Ss={hint:{zh:"提示:输入 / 以内联调用技能",en:"Tip: type / to invoke a skill inline"}};function wh({onSelect:n}){const[e,t]=a.useState(!1),[o,r]=a.useState(-1),s=a.useRef(null),l=a.useRef(null),c=H(f=>f.lang),u=xh(),p=[...Xe,...u],d=a.useCallback(()=>{t(f=>!f),r(-1)},[]),m=a.useCallback((f,b)=>{n(f,b),t(!1)},[n]);return a.useEffect(()=>{if(!e)return;function f(y){s.current&&!s.current.contains(y.target)&&l.current&&!l.current.contains(y.target)&&t(!1)}function b(y){if(y.key==="Escape"){t(!1);return}y.key==="ArrowDown"&&(y.preventDefault(),r(S=>Math.min(S+1,p.length-1))),y.key==="ArrowUp"&&(y.preventDefault(),r(S=>Math.max(S-1,0))),y.key==="Enter"&&o>=0&&o{document.removeEventListener("mousedown",f),document.removeEventListener("keydown",b)}},[e,o,p,m]),i.jsxs("div",{"data-slot":"skill-wrap",children:[i.jsx("button",{ref:l,"data-slot":"skill-trigger",onClick:d,"aria-label":"Presets",title:"Prompt presets",children:i.jsx(Ch,{})}),e&&i.jsxs("div",{ref:s,"data-slot":"skill-panel",children:[i.jsxs("div",{"data-slot":"skill-section",children:[i.jsx("div",{"data-slot":"skill-section-title",children:"Presets"}),Xe.map((f,b)=>i.jsx("button",{"data-slot":"skill-item","data-focused":o===b?"":void 0,onClick:()=>m(f.id,f.prompt),onMouseEnter:()=>r(b),children:i.jsxs("span",{"data-slot":"skill-info",children:[i.jsx("span",{"data-slot":"skill-name",children:f.title}),i.jsx("span",{"data-slot":"skill-desc",children:f.desc[c]||f.desc.en})]})},f.id))]}),u.length>0&&i.jsxs("div",{"data-slot":"skill-section",children:[i.jsx("div",{"data-slot":"skill-section-title",children:"Custom"}),u.map((f,b)=>i.jsx("button",{"data-slot":"skill-item","data-focused":o===Xe.length+b?"":void 0,onClick:()=>m(f.id,f.prompt),onMouseEnter:()=>r(Xe.length+b),children:i.jsxs("span",{"data-slot":"skill-info",children:[i.jsx("span",{"data-slot":"skill-name",children:f.title}),i.jsx("span",{"data-slot":"skill-desc",children:f.desc[c]||f.desc.en})]})},f.id))]}),i.jsx("div",{"data-slot":"skill-panel-hint",children:Ss.hint[c]||Ss.hint.en})]})]})}function Ch(){return i.jsx("svg",{width:"16",height:"16",viewBox:"0 0 256 256",fill:"currentColor","aria-hidden":"true",children:i.jsx("path",{d:"M215.79 118.17a8 8 0 0 0-5-5.66L153.18 90.9l14.66-73.33a8 8 0 0 0-13.69-7l-112 120a8 8 0 0 0 3 13.05l57.63 21.61-14.62 73.12a8 8 0 0 0 13.69 7l112-120a8 8 0 0 0 1.94-7.18Z"})})}function Sh(n,e,t=!1){return t?"disabled":n&&e?"queue":n?"stop":e?"send":"disabled"}function kh({state:n,onSend:e,onStop:t,onQueue:o}){const r=a.useCallback(()=>{switch(n){case"send":e();break;case"stop":t();break;case"queue":o==null||o();break}},[n,e,t,o]);a.useEffect(()=>{if(n!=="stop")return;function l(c){c.key==="Escape"&&(c.preventDefault(),t())}return document.addEventListener("keydown",l),()=>document.removeEventListener("keydown",l)},[n,t]);const s=n==="stop"?"Stop generating":n==="queue"?"Queue message":"Send message";return i.jsxs("button",{"data-slot":"composer-cta","data-state":n,onClick:r,disabled:n==="disabled","aria-label":s,title:s,children:[n==="stop"&&i.jsx(Eh,{}),n==="queue"&&i.jsx(Oh,{}),(n==="send"||n==="disabled")&&i.jsx(jh,{})]})}function jh(){return i.jsx("svg",{width:"16",height:"16",viewBox:"0 0 16 16",fill:"none",children:i.jsx("path",{d:"M8 14V2m0 0L3 7m5-5l5 5",stroke:"currentColor",strokeWidth:"1.5",strokeLinecap:"round",strokeLinejoin:"round"})})}function Eh(){return i.jsx("svg",{width:"14",height:"14",viewBox:"0 0 16 16",fill:"none",children:i.jsx("rect",{x:"3",y:"3",width:"10",height:"10",rx:"2",fill:"currentColor"})})}function Oh(){return i.jsx("svg",{width:"16",height:"16",viewBox:"0 0 16 16",fill:"none",children:i.jsx("path",{d:"M3 4h10M3 8h10M3 12h10",stroke:"currentColor",strokeWidth:"1.5",strokeLinecap:"round"})})}const ks={thinking:{zh:"思考中…",en:"Thinking…"},queued:{zh:"排队中",en:"Queued"}};function Ph(){const n=X(s=>s.status==="running"),e=X(s=>s.pendingQueue),t=X(s=>s.cancelQueued),o=H(s=>s.lang);if(!n&&e.length===0)return null;const r=s=>ks[s][o]||ks[s].en;return i.jsxs("div",{"data-slot":"composer-status-stack",children:[n&&i.jsxs("div",{"data-slot":"status-running",children:[i.jsx("span",{"data-slot":"status-dot"}),i.jsx("span",{"data-slot":"status-label",children:r("thinking")})]}),e.map((s,l)=>i.jsxs("div",{"data-slot":"status-queued",children:[i.jsxs("span",{"data-slot":"status-queue-num",children:["#",l+1]}),i.jsxs("span",{"data-slot":"status-queue-text",children:[s.text.slice(0,40),s.text.length>40?"…":""]}),i.jsx("button",{"data-slot":"status-queue-cancel",onClick:()=>t(l),"aria-label":"Cancel",children:i.jsx("svg",{width:"10",height:"10",viewBox:"0 0 16 16",fill:"none",children:i.jsx("path",{d:"M4 4l8 8M12 4l-8 8",stroke:"currentColor",strokeWidth:"1.5",strokeLinecap:"round"})})})]},l))]})}const js=7,_h=5;function Es(n){return Math.floor(Math.random()*n)}function Mh(){const{t:n}=ce(),e=X(s=>s.activeSessionId),t=X(s=>s.messages.length>0),o=a.useRef({sessionId:null,index:Es(js),wasNew:!0});return{text:a.useMemo(()=>{const s=o.current;if(s.sessionId!==e){const c=!t,p=Es(c?js:_h);return o.current={sessionId:e,index:p,wasNew:c},n(`composer.placeholder.${c?"new":"followUp"}.${p}`)}const l=s.wasNew?"new":"followUp";return n(`composer.placeholder.${l}.${s.index}`)},[e,t,n])}}let Lh=0;function Ih({onSend:n,onStop:e,isGenerating:t,editorRef:o,hideStatusStack:r,modelControl:s}){const l=a.useRef(null),c=o??l,u=a.useRef(null),p=a.useRef(null),d=a.useRef(null),{text:m}=Mh(),[f,b]=a.useState(""),[y,S]=a.useState([]),[w,C]=a.useState(!1),[k,_]=a.useState(null),[x,j]=a.useState(null);a.useEffect(()=>{const N=u.current;if(!N)return;const B=new ResizeObserver(ne=>{var he,ye,ve;const q=((ve=(ye=(he=ne[0])==null?void 0:he.borderBoxSize)==null?void 0:ye[0])==null?void 0:ve.blockSize)??N.offsetHeight;document.documentElement.style.setProperty("--composer-measured-height",`${q}px`)});return B.observe(N),()=>B.disconnect()},[]);const v=a.useCallback(N=>{const ne=[];for(const q of Array.from(N)){const he=`att-${++Lh}`,ye=q.type.startsWith("image/")&&q.type!=="image/svg+xml",ve=q.size>52428800;if(ye&&!ve){const Se=new FileReader;Se.onload=Y=>{S(Fe=>Fe.map(ze=>{var ot;return ze.id===he?{...ze,preview:(ot=Y.target)==null?void 0:ot.result,status:"ready"}:ze}))},Se.readAsDataURL(q)}else if(!ye&&!ve){const Se=new FileReader;Se.onload=async Y=>{var Fe;try{const ze=(Fe=Y.target)==null?void 0:Fe.result,ot=await Md(q.name,ze);S(Sn=>Sn.map(He=>He.id===he?{...He,path:ot,status:"ready",errorMsg:void 0}:He))}catch(ze){const ot=ze instanceof Error?ze.message:"upload failed";S(Sn=>Sn.map(He=>He.id===he?{...He,status:"error",errorMsg:ot}:He))}},Se.onerror=()=>{S(Y=>Y.map(Fe=>Fe.id===he?{...Fe,status:"error",errorMsg:"read failed"}:Fe))},Se.readAsDataURL(q)}ne.push({id:he,name:q.name,size:q.size,type:ye?"image":"file",status:ve?"error":"uploading",errorMsg:ve?"File too large (max 50 MB)":void 0,path:q.path||q.name})}S(q=>[...q,...ne])},[]),O=a.useCallback(()=>{var Se;const N=f.trim();if(!N&&y.length===0)return;const B=y.filter(Y=>Y.type==="image"&&Y.status==="ready"),ne=y.filter(Y=>Y.type==="image"&&Y.status==="uploading"),q=y.filter(Y=>Y.type==="file"&&Y.status==="uploading"),he=y.filter(Y=>Y.status==="error");if(ne.length>0||q.length>0||he.length>0)return;const ye={},ve=y.filter(Y=>Y.type==="file");ve.length>0&&(ye.files=ve.map(Y=>({name:Y.name,path:Y.path||Y.name,size:Y.size}))),B.length>0&&(ye.images=B.map(Y=>({name:Y.name,path:Y.path||Y.name,base64:Y.preview}))),n(N||"",Object.keys(ye).length>0?ye:void 0),(Se=c.current)==null||Se.clear(),b(""),S([])},[f,y,n]),E=a.useCallback(N=>{N.key==="Enter"&&!N.shiftKey&&(N.preventDefault(),O())},[O]),D=a.useCallback(N=>{b(N)},[]),P=a.useCallback(N=>{_(N)},[]),R=a.useCallback(()=>{_(null)},[]),L=a.useCallback((N,B)=>{var ne,q;(ne=c.current)==null||ne.setSkillChip(N,B),(q=c.current)==null||q.focus(),_(null)},[]),z=a.useCallback(N=>{j(N)},[]),W=a.useCallback(()=>{j(null)},[]),A=a.useCallback((N,B)=>{var he,ye,ve,Se;const ne=((he=c.current)==null?void 0:he.getText())||"",q=ne.lastIndexOf("@");q>=0&&((ye=c.current)==null||ye.setText(ne.slice(0,q))),(ve=c.current)==null||ve.insertChip(N,B),(Se=c.current)==null||Se.focus(),j(null)},[]),M=a.useCallback(N=>{v(N)},[v]),Z=a.useCallback(N=>{S(B=>B.filter(ne=>ne.id!==N))},[]),ue=a.useCallback((N,B)=>{var ne,q;(ne=c.current)==null||ne.setSkillChip(N,B),(q=c.current)==null||q.focus()},[]),we=a.useCallback(()=>{var N;(N=p.current)==null||N.click()},[]),T=a.useCallback(()=>{var N;(N=d.current)==null||N.click()},[]),F=a.useCallback(async()=>{try{const N=await navigator.clipboard.read();for(const B of N){const ne=B.types.find(q=>q.startsWith("image/"));if(ne){const q=await B.getType(ne),he=new File([q],"clipboard-image.png",{type:ne});v([he]);return}}}catch{}},[v]),Q=a.useCallback(N=>{N.target.files&&N.target.files.length>0&&v(N.target.files),N.target.value=""},[v]),se=a.useCallback(N=>{N.preventDefault(),C(!0)},[]),te=a.useCallback(N=>{N.preventDefault(),C(!1)},[]),Ce=a.useCallback(N=>{N.preventDefault(),C(!1),N.dataTransfer.files.length>0&&v(N.dataTransfer.files)},[v]),pe=f.trim().length>0||y.length>0,vt=y.some(N=>N.status==="uploading"),nt=Sh(t,pe,vt);return i.jsxs("div",{ref:u,"data-slot":"composer-root",onDragOver:se,onDragLeave:te,onDrop:Ce,children:[w&&i.jsx("div",{"data-slot":"composer-drop-overlay",children:"Drop files here"}),i.jsxs("div",{"data-slot":"composer-surface",children:[!r&&i.jsx(Ph,{}),i.jsx(bh,{files:y,onRemove:Z}),i.jsx(a0,{visible:k!==null,query:k||"",onSelect:L,onClose:R}),i.jsx(c0,{visible:x!==null,query:x||"",onConfirm:A,onClose:W}),i.jsx("div",{"data-slot":"composer-input-row",children:i.jsx(s0,{ref:c,placeholder:m,disabled:!1,onInput:D,onKeyDown:E,onSlashTrigger:P,onSlashDismiss:R,onAtTrigger:z,onAtDismiss:W,onPasteFiles:M})}),i.jsxs("div",{"data-slot":"composer-toolbar",children:[i.jsxs("div",{"data-slot":"composer-toolbar-left",children:[i.jsx(u0,{onUploadFile:we,onUploadImage:T,onPasteImage:F}),i.jsx(wh,{onSelect:ue})]}),i.jsxs("div",{"data-slot":"composer-toolbar-right",children:[s===void 0?i.jsx(ph,{}):s,i.jsx(kh,{state:nt,onSend:O,onStop:e,onQueue:O})]})]})]}),i.jsx("input",{ref:p,type:"file",multiple:!0,style:{display:"none"},onChange:Q}),i.jsx("input",{ref:d,type:"file",multiple:!0,accept:"image/*",style:{display:"none"},onChange:Q})]})}const Th="data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%201099.5%20105'%20width='1099.5'%20height='105'%20fill='%23000000'%3e%3cg%20transform='translate(-5.6%2088.5)'%3e%3cpath%20d='M62.70%200L20.40%200Q16.40%200%2013-2Q9.60-4%207.60-7.40Q5.60-10.80%205.60-14.80L5.60-14.80L5.60-57.20Q5.60-61.30%207.60-64.65Q9.60-68%2013-70Q16.40-72%2020.40-72L20.40-72L62.70-72Q66.80-72%2070.15-70Q73.50-68%2075.55-64.65Q77.60-61.30%2077.60-57.20L77.60-57.20L77.60-50.40L61.90-50.40L61.90-56.40L21.10-56.40L21.10-15.60L61.90-15.60L61.90-26.40L46.30-26.40L46.30-42L77.60-42L77.60-14.80Q77.60-10.80%2075.55-7.40Q73.50-4%2070.15-2Q66.80%200%2062.70%200L62.70%200ZM161.30%200L94.80%200L94.80-72L161.30-72L161.30-56.40L110.50-56.40L110.50-43.80L151.40-43.80L151.40-28.20L110.50-28.20L110.50-15.60L161.30-15.60L161.30%200ZM192.70%200L177.20%200L177.20-72L193.20-72L233.50-24L233.50-72L249.20-72L249.20%200L233.20%200L192.70-48.20L192.70%200ZM333.10%200L266.60%200L266.60-72L333.10-72L333.10-56.40L282.30-56.40L282.30-43.80L323.20-43.80L323.20-28.20L282.30-28.20L282.30-15.60L333.10-15.60L333.10%200ZM420.90%200L404.90%200L385.00-23.60L364.50-23.60L364.50%200L349.00%200L349.00-71.90L406.10-71.90Q410.20-71.90%20413.55-69.90Q416.90-67.90%20418.95-64.50Q421.00-61.10%20421.00-57.10L421.00-57.10L421.00-38.50Q421.00-34.50%20418.95-31.10Q416.90-27.70%20413.55-25.70Q410.20-23.70%20406.10-23.70L406.10-23.70L405.30-23.70L420.90-5.30L420.90%200ZM364.50-56.40L364.50-39.30L405.30-39.30L405.30-56.40L364.50-56.40ZM450.30%200L435.00%200L435.00-72L450.30-72L450.30%200ZM536.70%200L479.70%200Q475.60%200%20472.25-2Q468.90-4%20466.90-7.35Q464.90-10.70%20464.90-14.80L464.90-14.80L464.90-57.20Q464.90-61.30%20466.90-64.65Q468.90-68%20472.25-70Q475.60-72%20479.70-72L479.70-72L536.70-72L536.70-56.40L483.70-56.40Q482.10-56.40%20481.25-55.60Q480.40-54.80%20480.40-53.10L480.40-53.10L480.40-18.90Q480.40-17.30%20481.25-16.45Q482.10-15.60%20483.70-15.60L483.70-15.60L536.70-15.60L536.70%200ZM607%200L591.50%200L591.50-57.20Q591.50-61.30%20593.50-64.65Q595.50-68%20598.90-70Q602.30-72%20606.30-72L606.30-72L648.60-72Q652.70-72%20656.05-70Q659.40-68%20661.45-64.65Q663.50-61.30%20663.50-57.20L663.50-57.20L663.50%200L647.80%200L647.80-23.20L607-23.20L607%200ZM607-56.40L607-38.80L647.80-38.80L647.80-56.40L607-56.40ZM738.00%200L695.70%200Q691.70%200%20688.30-2Q684.90-4%20682.90-7.40Q680.90-10.80%20680.90-14.80L680.90-14.80L680.90-57.20Q680.90-61.30%20682.90-64.65Q684.90-68%20688.30-70Q691.70-72%20695.70-72L695.70-72L738.00-72Q742.10-72%20745.45-70Q748.80-68%20750.85-64.65Q752.90-61.30%20752.90-57.20L752.90-57.20L752.90-50.40L737.20-50.40L737.20-56.40L696.40-56.40L696.40-15.60L737.20-15.60L737.20-26.40L721.60-26.40L721.60-42L752.90-42L752.90-14.80Q752.90-10.80%20750.85-7.40Q748.80-4%20745.45-2Q742.10%200%20738.00%200L738.00%200ZM836.60%200L770.10%200L770.10-72L836.60-72L836.60-56.40L785.80-56.40L785.80-43.80L826.70-43.80L826.70-28.20L785.80-28.20L785.80-15.60L836.60-15.60L836.60%200ZM868.00%200L852.50%200L852.50-72L868.50-72L908.80-24L908.80-72L924.50-72L924.50%200L908.50%200L868.00-48.20L868.00%200ZM981.90%200L966.30%200L966.30-56.40L938.10-56.40L938.10-72L1010.10-72L1010.10-56.40L981.90-56.40L981.90%200Z'%3e%3c/path%3e%3crect%20x='1050.1'%20y='-88.5'%20width='55'%20height='105'%3e%3c/rect%3e%3c/g%3e%3c/svg%3e",Rh="data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%201099.5%20105'%20width='1099.5'%20height='105'%20fill='%23FFFFFF'%3e%3cg%20transform='translate(-5.6%2088.5)'%3e%3cpath%20d='M62.70%200L20.40%200Q16.40%200%2013-2Q9.60-4%207.60-7.40Q5.60-10.80%205.60-14.80L5.60-14.80L5.60-57.20Q5.60-61.30%207.60-64.65Q9.60-68%2013-70Q16.40-72%2020.40-72L20.40-72L62.70-72Q66.80-72%2070.15-70Q73.50-68%2075.55-64.65Q77.60-61.30%2077.60-57.20L77.60-57.20L77.60-50.40L61.90-50.40L61.90-56.40L21.10-56.40L21.10-15.60L61.90-15.60L61.90-26.40L46.30-26.40L46.30-42L77.60-42L77.60-14.80Q77.60-10.80%2075.55-7.40Q73.50-4%2070.15-2Q66.80%200%2062.70%200L62.70%200ZM161.30%200L94.80%200L94.80-72L161.30-72L161.30-56.40L110.50-56.40L110.50-43.80L151.40-43.80L151.40-28.20L110.50-28.20L110.50-15.60L161.30-15.60L161.30%200ZM192.70%200L177.20%200L177.20-72L193.20-72L233.50-24L233.50-72L249.20-72L249.20%200L233.20%200L192.70-48.20L192.70%200ZM333.10%200L266.60%200L266.60-72L333.10-72L333.10-56.40L282.30-56.40L282.30-43.80L323.20-43.80L323.20-28.20L282.30-28.20L282.30-15.60L333.10-15.60L333.10%200ZM420.90%200L404.90%200L385.00-23.60L364.50-23.60L364.50%200L349.00%200L349.00-71.90L406.10-71.90Q410.20-71.90%20413.55-69.90Q416.90-67.90%20418.95-64.50Q421.00-61.10%20421.00-57.10L421.00-57.10L421.00-38.50Q421.00-34.50%20418.95-31.10Q416.90-27.70%20413.55-25.70Q410.20-23.70%20406.10-23.70L406.10-23.70L405.30-23.70L420.90-5.30L420.90%200ZM364.50-56.40L364.50-39.30L405.30-39.30L405.30-56.40L364.50-56.40ZM450.30%200L435.00%200L435.00-72L450.30-72L450.30%200ZM536.70%200L479.70%200Q475.60%200%20472.25-2Q468.90-4%20466.90-7.35Q464.90-10.70%20464.90-14.80L464.90-14.80L464.90-57.20Q464.90-61.30%20466.90-64.65Q468.90-68%20472.25-70Q475.60-72%20479.70-72L479.70-72L536.70-72L536.70-56.40L483.70-56.40Q482.10-56.40%20481.25-55.60Q480.40-54.80%20480.40-53.10L480.40-53.10L480.40-18.90Q480.40-17.30%20481.25-16.45Q482.10-15.60%20483.70-15.60L483.70-15.60L536.70-15.60L536.70%200ZM607%200L591.50%200L591.50-57.20Q591.50-61.30%20593.50-64.65Q595.50-68%20598.90-70Q602.30-72%20606.30-72L606.30-72L648.60-72Q652.70-72%20656.05-70Q659.40-68%20661.45-64.65Q663.50-61.30%20663.50-57.20L663.50-57.20L663.50%200L647.80%200L647.80-23.20L607-23.20L607%200ZM607-56.40L607-38.80L647.80-38.80L647.80-56.40L607-56.40ZM738.00%200L695.70%200Q691.70%200%20688.30-2Q684.90-4%20682.90-7.40Q680.90-10.80%20680.90-14.80L680.90-14.80L680.90-57.20Q680.90-61.30%20682.90-64.65Q684.90-68%20688.30-70Q691.70-72%20695.70-72L695.70-72L738.00-72Q742.10-72%20745.45-70Q748.80-68%20750.85-64.65Q752.90-61.30%20752.90-57.20L752.90-57.20L752.90-50.40L737.20-50.40L737.20-56.40L696.40-56.40L696.40-15.60L737.20-15.60L737.20-26.40L721.60-26.40L721.60-42L752.90-42L752.90-14.80Q752.90-10.80%20750.85-7.40Q748.80-4%20745.45-2Q742.10%200%20738.00%200L738.00%200ZM836.60%200L770.10%200L770.10-72L836.60-72L836.60-56.40L785.80-56.40L785.80-43.80L826.70-43.80L826.70-28.20L785.80-28.20L785.80-15.60L836.60-15.60L836.60%200ZM868.00%200L852.50%200L852.50-72L868.50-72L908.80-24L908.80-72L924.50-72L924.50%200L908.50%200L868.00-48.20L868.00%200ZM981.90%200L966.30%200L966.30-56.40L938.10-56.40L938.10-72L1010.10-72L1010.10-56.40L981.90-56.40L981.90%200Z'%3e%3c/path%3e%3crect%20x='1050.1'%20y='-88.5'%20width='55'%20height='105'%3e%3c/rect%3e%3c/g%3e%3c/svg%3e",Nh={plan:i.jsx(Ka,{size:"small"}),goal:i.jsx(el,{size:"small"}),autonomous:i.jsx(ll,{size:"small"}),hive:i.jsx(fl,{size:"small"}),review:i.jsx(yl,{size:"small"}),findwork:i.jsx(ti,{size:"small"})};function Dh({onPresetClick:n}){const{t:e}=ce();return i.jsxs("div",{"data-slot":"empty-state-root",children:[i.jsxs("div",{"data-slot":"empty-state-wordmark",children:[i.jsx("img",{src:Th,alt:"GenericAgent",className:"empty-state-wordmark-light"}),i.jsx("img",{src:Rh,alt:"",className:"empty-state-wordmark-dark","aria-hidden":"true"})]}),i.jsx("div",{"data-slot":"empty-state-presets",children:Xe.map(t=>i.jsxs("button",{type:"button",className:"empty-state-preset-btn",onClick:()=>n(t),children:[i.jsx("span",{className:"empty-state-preset-icon",children:Nh[t.id]}),i.jsx("span",{children:e(`preset.${t.id}.t`)||t.title})]},t.id))})]})}function $h(){const{t:n}=ce(),e=Zo(),t=X(m=>m.status),o=X(m=>m.messages),r=X(m=>m.sendMessage),s=X(m=>m.cancel),l=a.useRef(null),c=a.useCallback((m,f)=>{(m||f)&&r(m,f)},[r]),u=a.useCallback(m=>{var f,b;(f=l.current)==null||f.setSkillChip(m.id,m.prompt),(b=l.current)==null||b.focus()},[]),p=o.length===0&&t==="idle",d=p&&e!=="ready";return i.jsxs("div",{className:"chat-view-root","data-empty":p||void 0,children:[d?i.jsx("div",{className:"ga-chat-offline",children:i.jsx("span",{children:n(e==="connecting"?"bridge.connecting":"bridge.offline")})}):p?i.jsx(Dh,{onPresetClick:u}):i.jsx(Qu,{}),i.jsx(Ih,{onSend:c,onStop:s,isGenerating:t==="running",editorRef:l})]})}const Ah=a.lazy(async()=>({default:(await Gt(()=>import("./ServicesPage-DrjRw530.js"),__vite__mapDeps([11,1,2,12,13,14,5,6,15,16,7,8,17]))).ServicesPage})),Fh=a.lazy(async()=>({default:(await Gt(()=>import("./TokenPage-C6-RA6yj.js"),__vite__mapDeps([18,1,2,12,13,14,5,6,15,19,20,21,7,8,22]))).TokenPage})),zh=a.lazy(async()=>({default:(await Gt(()=>import("./CollabPage-bnm43hIR.js"),__vite__mapDeps([23,1,2,0,3,4,5,6,7,8,9,24]))).CollabPage}));function Co({children:n}){return i.jsx(a.Suspense,{fallback:i.jsx("span",{"data-slot":"deferred-page-loading","aria-busy":"true"}),children:n})}function Os(){const n=Ie(e=>e.activePage);return n==="chat"?i.jsx("div",{className:"ga-main-area ga-main-chat",children:i.jsx($h,{})}):n==="services"?i.jsx("div",{className:"ga-main-area ga-main-full",children:i.jsx(Co,{children:i.jsx(Ah,{})})}):n==="token"?i.jsx("div",{className:"ga-main-area ga-main-full",children:i.jsx(Co,{children:i.jsx(Fh,{})})}):n==="collab"?i.jsx("div",{className:"ga-main-area ga-main-chat",children:i.jsx(Co,{children:i.jsx(zh,{})})}):i.jsx("div",{className:"ga-main-area"})}function Bh(){const n=Ie(t=>t.sidebarCollapsed),e=Ie(t=>t.toggleSidebar);return a.useEffect(()=>{function t(o){(o.metaKey||o.ctrlKey)&&o.key==="b"&&(o.preventDefault(),e())}return window.addEventListener("keydown",t),()=>window.removeEventListener("keydown",t)},[e]),i.jsx("div",{className:"ga-titlebar-controls",children:i.jsx("button",{type:"button",className:"ga-titlebar-btn",onClick:e,title:n?"显示侧边栏":"隐藏侧边栏","aria-label":n?"显示侧边栏":"隐藏侧边栏",children:i.jsx(Ee,{name:n?"layout-sidebar-left-off":"layout-sidebar-left",size:"16px"})})})}function Uh(){const n=a.useRef(!1),{t:e}=ce();return a.useEffect(()=>{var o,r;if(n.current||(n.current=!0,document.documentElement.dataset.platform==="macos"))return;const t=(r=(o=window.__TAURI__)==null?void 0:o.core)==null?void 0:r.invoke;t&&(async()=>{try{if(!await t("shortcut_should_ask"))return;re.confirm({title:e("common.confirm"),content:e("shortcut.askConfirm"),onOk:()=>t("shortcut_decide",{create:!0}),onCancel:()=>t("shortcut_decide",{create:!1})})}catch{}})()},[e]),null}function Vh(){return a.useCallback(n=>{var s,l,c,u;if(!ha||n.button!==0||n.target.closest("button, a, input, [data-no-drag]"))return;const t=n.currentTarget.getBoundingClientRect();if(n.clientY-t.top>38)return;n.preventDefault();const r=window.__TAURI__;(u=(c=(l=(s=r==null?void 0:r.window)==null?void 0:s.getCurrentWindow)==null?void 0:l.call(s))==null?void 0:c.startDragging)==null||u.call(c)},[])}function Kh(){const n=Ie(t=>t.sidebarCollapsed),e=Vh();return i.jsxs("div",{className:"ga-app-layout",onMouseDown:e,children:[pa&&i.jsx(xa,{}),i.jsx(Bh,{}),i.jsx("div",{className:"ga-app-body",children:n?i.jsx("div",{className:"ga-body-collapsed",children:i.jsx(Os,{})}):i.jsxs(vn,{direction:"horizontal",children:[i.jsx(_t,{defaultSize:"260px",min:"200px",max:"340px",className:"ga-sidebar-item",children:i.jsx(cu,{})}),i.jsx(bn,{}),i.jsx(_t,{className:"ga-main-item",children:i.jsx(Os,{})})]})}),i.jsx(Uh,{})]})}const Ps=4;let Wh=0;const _s=gt((n,e)=>({items:[],notify(t){const o=`notif-${++Wh}-${Date.now()}`,r={...t,id:o,createdAt:Date.now()};n(s=>{const l=s.items.find(u=>u.message===r.message&&u.kind===r.kind);if(l)return{items:s.items.map(u=>u.id===l.id?{...r,id:l.id}:u)};const c=[...s.items,r];return{items:c.length>Ps?c.slice(-Ps):c}}),t.kind==="info"||t.kind==="success"?setTimeout(()=>e().dismiss(o),5e3):(t.kind==="error"||t.kind==="warning")&&setTimeout(()=>e().dismiss(o),8e3)},dismiss(t){n(o=>({items:o.items.filter(r=>r.id!==t)}))},clear(){n({items:[]})}}));function Ms({item:n,onDismiss:e}){const t=n.kind==="error"||n.kind==="warning";return i.jsxs("div",{className:`ga-notification ga-notification--${n.kind}`,role:"alert",children:[i.jsxs("div",{className:"ga-notification-body",children:[n.title&&i.jsx("div",{className:"ga-notification-title",children:n.title}),i.jsx("div",{className:"ga-notification-message",children:n.message}),n.action&&i.jsx("button",{className:"ga-notification-action",onClick:n.action.onClick,children:n.action.label})]}),t&&i.jsx("button",{className:"ga-notification-dismiss",onClick:e,"aria-label":"close",children:i.jsx(cn,{size:"small"})})]})}function Hh(){const n=_s(s=>s.items),e=_s(s=>s.dismiss),t=a.useRef(null);if(a.useEffect(()=>{if(!t.current){const s=document.createElement("div");s.id="ga-notification-portal",document.body.appendChild(s),t.current=s}return()=>{t.current&&(document.body.removeChild(t.current),t.current=null)}},[]),!t.current||n.length===0)return null;const o=n.filter(s=>s.kind==="error"||s.kind==="warning"),r=n.filter(s=>s.kind==="info"||s.kind==="success");return ma.createPortal(i.jsxs(i.Fragment,{children:[o.length>0&&i.jsx("div",{className:"ga-notification-stack ga-notification-stack--top",children:o.map(s=>i.jsx(Ms,{item:s,onDismiss:()=>e(s.id)},s.id))}),r.length>0&&i.jsx("div",{className:"ga-notification-stack ga-notification-stack--bottom",children:r.map(s=>i.jsx(Ms,{item:s,onDismiss:()=>e(s.id)},s.id))})]}),t.current)}function bt({children:n,tip:e,tipLabel:t}){return i.jsxs("div",{className:"ga-set-sec-heading",children:[i.jsx("h2",{className:"ga-set-sec-t",children:n}),e&&i.jsx($e,{content:e,position:"topLeft",children:i.jsx("span",{className:"ga-settings-section-help",tabIndex:0,"aria-label":[t,e].filter(Boolean).join(":"),children:i.jsx(il,{size:"small","aria-hidden":"true"})})})]})}function Zh(){const{t:n}=ce(),e=H(o=>o.appearance),t=H(o=>o.setAppearance);return i.jsxs("div",{className:"ga-set-block",children:[i.jsx(bt,{children:n("set.appearance")}),i.jsxs(Ke,{type:"button",value:e,onChange:o=>t(o.target.value),children:[i.jsx(Me,{value:"light",children:n("appearance.light")}),i.jsx(Me,{value:"dark",children:n("appearance.dark")})]})]})}function qh(){const{t:n}=ce(),e=H(o=>o.lang),t=H(o=>o.setLang);return i.jsxs("div",{className:"ga-set-block",children:[i.jsx(bt,{children:n("set.lang")}),i.jsxs(Ke,{type:"button",value:e,onChange:o=>t(o.target.value),children:[i.jsx(Me,{value:"zh",children:n("lang.zh")}),i.jsx(Me,{value:"en",children:n("lang.en")})]})]})}function Ls({model:n,size:e=16}){const t=Cn(n),o=t?ji(t):void 0;if(!(o!=null&&o.Component))return null;const r=o.Component;return i.jsx(r,{size:e})}function So(n){const e=n.model||"",t=e.lastIndexOf("/");if(e)return t>=0?e.slice(t+1):e;const o=(n.name||"").trim(),r=o.indexOf("/");return(r>=0?o.slice(r+1):o)||"(unnamed)"}function Gh({onAdd:n,onEdit:e}){const{t}=ce(),o=H(x=>x.modelProfiles),r=H(x=>x.defaultModelNo),s=H(x=>x.setDefaultModel),l=H(x=>x.setModelProfiles),[c,u]=a.useState(!0),p=o.find(x=>x.kind==="mixin"),d=o.filter(x=>x.kind!=="mixin"),m=p?o.indexOf(p):-1,f=a.useCallback(x=>{s(x)},[s]),b=a.useCallback((x,j)=>{re.confirm({title:t("common.delete"),content:`${t("common.delete")} "${j}"?`,okText:t("common.delete"),cancelText:t("common.cancel"),okType:"danger",onOk:async()=>{try{const v=await xd(x);l(v),G.success({content:t("common.delete")})}catch{G.error({content:t("err.modelDelete")})}}})},[l,t]),y=a.useCallback(x=>{e(x)},[e]),S=a.useCallback(()=>{n()},[n]),w=a.useCallback(async x=>{try{const j=await wd(x);l(j)}catch{G.error({content:t("err.mixinFailed")})}},[l,t]),C=a.useCallback(async x=>{try{const j=await Cd(x);l(j)}catch{G.error({content:t("err.mixinFailed")})}},[l,t]),k=a.useCallback(async x=>{if(!(p!=null&&p.members))return;const j=[...p.members],v=j.indexOf(x);if(!(v<=0)){[j[v-1],j[v]]=[j[v],j[v-1]];try{const O=await Ar(j);l(O)}catch{G.error({content:t("err.mixinFailed")})}}},[p,l,t]),_=a.useCallback(async x=>{if(!(p!=null&&p.members))return;const j=[...p.members],v=j.indexOf(x);if(!(v<0||v>=j.length-1)){[j[v],j[v+1]]=[j[v+1],j[v]];try{const O=await Ar(j);l(O)}catch{G.error({content:t("err.mixinFailed")})}}},[p,l,t]);return i.jsxs("div",{className:"ga-set-block",children:[i.jsx(bt,{tip:t("model.configurationTip"),tipLabel:t("model.configurationHelp"),children:t("set.model")}),p&&i.jsxs("div",{className:"ga-mixin-group",children:[i.jsxs("div",{className:`ga-mixin-head${m===r?" ga-mixin-head--active":""}`,onClick:()=>f(m),children:[i.jsx("button",{type:"button",className:"ga-mixin-toggle",onClick:x=>{x.stopPropagation(),u(j=>!j)},"aria-label":"toggle",children:i.jsx(Qh,{expanded:c})}),i.jsx($e,{content:t("model.aggregationTip"),position:"topLeft",children:i.jsx("span",{className:"ga-mixin-label",tabIndex:0,"aria-label":`${t("model.aggregation")}:${t("model.aggregationTip")}`,children:t("model.aggregation")})}),m===r&&i.jsx(Ae,{color:"green",size:"small",children:t("set.current")})]}),c&&i.jsxs("div",{className:"ga-mixin-body",children:[!p.members||p.members.length===0?i.jsx("div",{className:"ga-mixin-empty",children:t("model.emptyMixin")}):i.jsx("div",{className:"ga-mixin-members",children:p.members.map((x,j)=>{const v=d.find(E=>E.name===x),O=v?So(v):x;return i.jsxs("div",{className:"ga-mixin-member",children:[i.jsx("span",{className:"ga-mixin-member-rank",children:j+1}),i.jsx(Ls,{model:(v==null?void 0:v.model)||"",size:14}),i.jsx("span",{className:"ga-mixin-member-name",children:O}),i.jsxs("span",{className:"ga-mixin-member-actions",children:[i.jsx("button",{type:"button",className:"ga-icon-btn",disabled:j===0,onClick:()=>k(x),title:"↑",children:"↑"}),i.jsx("button",{type:"button",className:"ga-icon-btn",disabled:j===p.members.length-1,onClick:()=>_(x),title:"↓",children:"↓"}),i.jsx("button",{type:"button",className:"ga-icon-btn ga-icon-btn--danger",onClick:()=>v&&C(v.id),title:t("model.removeFromMixin"),children:"×"})]})]},x)})}),i.jsx("div",{className:"ga-mixin-hint",children:t("model.aggregationDesc")})]})]}),i.jsxs("div",{className:"ga-model-list",children:[d.length===0&&i.jsx("div",{className:"ga-model-empty",children:t("set.noModels")}),d.map(x=>{const j=o.indexOf(x),v=j===r;return i.jsxs("div",{className:`ga-model-item${v?" ga-model-item--selected":""}`,onClick:()=>f(j),children:[i.jsxs("div",{className:"ga-model-row-content",children:[i.jsx(Ls,{model:x.model||""}),i.jsx("span",{className:"ga-model-name",children:So(x)}),v&&i.jsx(Ae,{color:"green",size:"small",children:t("set.current")}),x.inMixin&&i.jsx(Ae,{size:"small",children:t("model.inMixin")})]}),i.jsxs("span",{className:"ga-model-actions",children:[p&&!x.inMixin&&i.jsx(ie,{size:"small",type:"tertiary",theme:"borderless",onClick:O=>{O.stopPropagation(),w(x.id)},children:"+"}),i.jsx(ie,{size:"small",type:"tertiary",theme:"borderless",onClick:O=>{O.stopPropagation(),y(x.id)},children:t("common.edit")}),i.jsx(ie,{size:"small",type:"danger",theme:"borderless",onClick:O=>{O.stopPropagation(),b(x.id,So(x))},children:t("common.delete")})]})]},x.id)})]}),i.jsxs(ie,{type:"tertiary",onClick:S,className:"ga-add-model-btn",children:["+ ",t("set.addModel")]})]})}function Qh({expanded:n}){return i.jsx("svg",{width:"12",height:"12",viewBox:"0 0 12 12",fill:"currentColor",style:{transform:n?"rotate(90deg)":"rotate(0deg)",transition:"transform 0.15s"},children:i.jsx("path",{d:"M4.5 2.5L8 6L4.5 9.5",stroke:"currentColor",strokeWidth:"1.5",strokeLinecap:"round",strokeLinejoin:"round",fill:"none"})})}class Oi extends Error{constructor(t,o){super(t);xt(this,"code");xt(this,"runningSessions");xt(this,"runningExtras");this.name="DataBackupError",this.code=typeof o.code=="string"?o.code:null,this.runningSessions=Array.isArray(o.runningSessions)?o.runningSessions.filter(r=>typeof r=="string"):[],this.runningExtras=Array.isArray(o.runningExtras)?o.runningExtras.filter(r=>typeof r=="string"):[]}}async function qo(n,e){const t=await fetch(`${ee}${n}`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(e)}),o=await t.json().catch(()=>({}));if(!t.ok){const r=typeof(o==null?void 0:o.error)=="string"?o.error:`HTTP ${t.status}`;throw new Oi(r,o)}return o}async function Yh(){try{return(await fetch(`${ee}/memory/import/inspect`,{method:"HEAD"})).status!==404}catch{return!1}}function Xh(n,e=new Date){const t={year:e.getFullYear(),month:String(e.getMonth()+1).padStart(2,"0"),day:String(e.getDate()).padStart(2,"0"),hour:String(e.getHours()).padStart(2,"0"),minute:String(e.getMinutes()).padStart(2,"0"),second:String(e.getSeconds()).padStart(2,"0")},o=`${t.year}-${t.month}-${t.day}-${t.hour}${t.minute}${t.second}`;return`GenericAgent-${n==="zh"?"数据备份":"data-backup"}-${o}.zip`}function Jh(n){return qo("/memory/import/inspect",{sourcePath:n})}function em(n){return qo("/memory/import",{sourcePath:n})}function tm(n,e){return qo("/memory/export",{destinationPath:n,sourceMode:e})}const Is=gt((n,e)=>(Ve("services.snapshot",t=>{const o=t;o.services&&n({services:o.services,loading:!1,error:null})}),Ve("service.changed",t=>{const o=t;o.service&&n(r=>({services:r.services.map(s=>s.id===o.service.id?o.service:s)}))}),{services:[],loading:!0,error:null,mykeyContent:"",mykeyLoading:!1,async fetchServices(){e().services.length===0&&n({loading:!0}),n({error:null});try{const t=await Hd();n({services:t,loading:!1})}catch(t){n({loading:!1,error:t.message})}},async startService(t){try{const{ok:o,service:r}=await Zd(t);return r&&n(s=>({services:s.services.map(l=>l.id===r.id?r:l)})),o}catch{return!1}},async stopService(t){try{const{ok:o,service:r}=await qd(t);return r&&n(s=>({services:s.services.map(l=>l.id===r.id?r:l)})),o}catch{return!1}},async exitBridge(){try{return await Yd()}catch{return!1}},async restartService(t){return await e().stopService(t)?(await new Promise(r=>setTimeout(r,500)),e().startService(t)):!1},async fetchLogs(t,o=200){try{return await gi(t,o)}catch{return[]}},async fetchMykey(){n({mykeyLoading:!0});try{const t=await Gd();n({mykeyContent:t,mykeyLoading:!1})}catch{n({mykeyLoading:!1})}},async saveMykey(t){try{const o=await Qd(t);return o&&n({mykeyContent:t}),o}catch{return!1}}}));function Pi(){return typeof window.__TAURI__<"u"}async function Om(){var e,t;const n=(t=(e=window.__TAURI__)==null?void 0:e.core)==null?void 0:t.invoke;if(!n)throw new Error("Not in Tauri environment");await n("start_bridge")}const ko=Pi();function nn({label:n,tip:e,btnText:t,onClick:o,disabled:r}){return i.jsxs("div",{className:"ga-data-row",children:[i.jsx("div",{className:"ga-data-row-info",children:i.jsx($e,{content:e,children:i.jsx("span",{className:"ga-data-row-label",tabIndex:0,children:n})})}),i.jsx(ie,{className:"ga-data-action",size:"small",type:"tertiary",onClick:o,disabled:r,children:t})]})}function nm(n,e){if(!n)return"—";const t=new Date(n);return Number.isNaN(t.getTime())?"—":new Intl.DateTimeFormat(e==="zh"?"zh-CN":"en-US",{dateStyle:"medium",timeStyle:"short"}).format(t)}function om(){const{lang:n,t:e}=ce(),[t,o]=a.useState(!1),[r,s]=a.useState(!1),[l,c]=a.useState(!1),[u,p]=a.useState(null),[d,m]=a.useState(null),[f,b]=a.useState(!1),y=X(P=>{const R=new Set(P.runningSessions);return P.sessions.forEach(L=>{L.status==="running"&&R.add(L.id)}),P.status==="running"&&R.add(P.activeSessionId||"__active_session__"),R.size}),w=Is(P=>P.services).filter(P=>P.managed&&P.running),C=y>0||w.length>0;a.useEffect(()=>{if(!ko)return;let P=!0;return Yh().then(R=>{P&&b(R)}),Is.getState().fetchServices(),()=>{P=!1}},[]);const k=a.useCallback(()=>e("data.maintenanceBlocked",{sessions:y,services:w.length}),[w.length,y,e]),_=a.useCallback((P,R)=>{if(P instanceof Oi&&P.code==="maintenance_conflict"){G.error({content:e("data.maintenanceBlockedServer",{sessions:P.runningSessions.length,services:P.runningExtras.length})});return}G.error({content:e(R)})},[e]),x=a.useCallback(()=>{const P=document.createElement("input");P.type="file",P.accept=".py,text/plain",P.onchange=async()=>{var R;try{const L=(R=P.files)==null?void 0:R[0];if(!L)return;const z=await L.text();await kd(z),await H.getState().loadFromBridge(),G.success({content:e("data.importKeySuccess")})}catch(L){console.error("[DataSection] import key config failed:",L),G.error({content:e("data.importKeyError")})}},P.click()},[e]),j=a.useCallback(async()=>{try{const P=await Sd();if(ko)try{await _e("export_mykey",{content:P})&&G.success({content:e("data.exportKeySuccess")})}catch{Ts(P,"mykey.py"),G.success({content:e("data.exportKeySuccess")})}else Ts(P,"mykey.py"),G.success({content:e("data.exportKeySuccess")})}catch(P){console.error("[DataSection] export key config failed:",P),G.error({content:e("data.exportKeyError")})}},[e]),v=a.useCallback((P,R)=>{const L=R.sourceType==="legacyFolder"?e("data.importLegacySource"):R.sourceMode==="localRepository"?e("connection.local"):e("connection.included"),{memory:z,responses:W,sessions:A}=R.content;re.confirm({title:e("data.importConfirmTitle"),content:i.jsxs("div",{className:"ga-data-confirm-summary",children:[R.sourceType==="backupZip"&&i.jsxs("div",{children:[i.jsx("span",{children:e("data.importExportedAt")}),i.jsx("strong",{children:nm(R.exportedAt,n)})]}),i.jsxs("div",{children:[i.jsx("span",{children:e("data.importSource")}),i.jsx("strong",{children:L})]}),i.jsxs("div",{children:[i.jsx("span",{children:e("data.importContents")}),i.jsx("strong",{children:e("data.importContentsValue",{memory:z,sessions:A,responses:W})})]}),i.jsx("p",{children:e("data.importMergeNotice")})]}),okText:e("data.importConfirmBtn"),cancelText:e("common.cancel"),onOk:async()=>{o(!0);try{const M=await em(P);G.success({content:e("data.importDataSuccess",{memory:M.memoryCopied||0,responses:M.responsesCopied||0,sessions:M.sessionsAdded||0})}),await X.getState().loadSessions(),m(M)}catch(M){console.error("[DataSection] import data failed:",M),_(M,"data.importDataError")}finally{o(!1)}}})},[n,_,e]),O=a.useCallback(async P=>{if(c(!1),C){G.warning({content:k()});return}try{const R=P==="backup"?await _e("pick_data_backup_file",{title:e("data.importBackupPickerTitle")}):await _e("pick_directory",{title:e("data.importFolderPickerTitle")});if(!R)return;o(!0);const L=await Jh(R);o(!1),v(R,L)}catch(R){o(!1),console.error("[DataSection] inspect import source failed:",R),G.error({content:e("data.importDataInvalid")})}},[v,C,k,e]),E=a.useCallback(()=>{if(C){G.warning({content:k()});return}re.confirm({title:e("data.exportDataConfirmTitle"),content:e("data.exportDataConfirmMessage"),okText:e("data.exportDataConfirmBtn"),cancelText:e("common.cancel"),onOk:async()=>{try{const P=await _e("pick_data_export_path",{defaultName:Xh(n),title:e("data.exportDataPickerTitle")});if(!P)return;s(!0);const R=await _e("get_ga_source",{}),L=await tm(P,R?"localRepository":"included");window.setTimeout(()=>p(L.path),0)}catch(P){console.error("[DataSection] export data failed:",P),_(P,"data.exportDataError")}finally{s(!1)}}})},[n,C,k,_,e]),D=a.useCallback(async()=>{if(u)try{await _e("reveal_in_file_manager",{path:u}),p(null)}catch(P){console.error("[DataSection] reveal export failed:",P),G.error({content:e("data.exportDataRevealError")})}},[u,e]);return i.jsxs("div",{className:"ga-set-block","data-testid":"data-maintenance-section",children:[i.jsx(bt,{tip:e("data.sectionTip"),tipLabel:e("data.sectionHelp"),children:e("data.title")}),i.jsx(nn,{label:e("data.importKey"),tip:e("data.importKeyTip"),btnText:e("data.importKeyBtn"),onClick:x}),i.jsx(nn,{label:e("data.exportKey"),tip:e("data.exportKeyTip"),btnText:e("data.exportKeyBtn"),onClick:j}),ko&&f&&i.jsxs(i.Fragment,{children:[i.jsx(nn,{label:e("data.importData"),tip:e("data.importDataTip"),btnText:e(t?"data.importing":"data.importDataBtn"),onClick:()=>c(!0),disabled:t||r||C}),i.jsx(nn,{label:e("data.exportData"),tip:e("data.exportDataTip"),btnText:e(r?"data.exporting":"data.exportDataBtn"),onClick:E,disabled:t||r||C}),C&&i.jsx("p",{className:"ga-data-maintenance-note",role:"status",children:k()}),i.jsx("p",{className:"ga-data-maintenance-note",children:e("data.externalProcessWarning")})]}),i.jsx(re,{visible:l,title:e("data.importSourceTitle"),width:520,onCancel:()=>c(!1),footer:i.jsxs("div",{className:"ga-data-source-actions",children:[i.jsx(ie,{onClick:()=>c(!1),children:e("common.cancel")}),i.jsx(ie,{disabled:C,onClick:()=>O("folder"),children:e("data.importFolderBtn")}),i.jsx(ie,{disabled:C,type:"primary",onClick:()=>O("backup"),children:e("data.importBackupBtn")})]}),children:i.jsx("p",{className:"ga-data-source-description",children:e("data.importSourceDescription")})}),i.jsx(re,{visible:!!d,title:e("data.importResultTitle"),width:620,onCancel:()=>m(null),footer:i.jsx(ie,{type:"primary",onClick:()=>m(null),children:e("common.done")}),children:d&&i.jsxs("div",{className:"ga-data-confirm-summary",children:[i.jsxs("div",{children:[i.jsx("span",{children:e("data.importResultMemory")}),i.jsx("strong",{children:e("data.importResultMemoryValue",{count:d.memoryCopied||0})})]}),i.jsxs("div",{children:[i.jsx("span",{children:e("data.importResultResponses")}),i.jsx("strong",{children:e("data.importResultAddSkipValue",{added:d.responsesCopied||0,skipped:d.responsesSkipped||0})})]}),i.jsxs("div",{children:[i.jsx("span",{children:e("data.importResultSessions")}),i.jsx("strong",{children:e("data.importResultAddSkipValue",{added:d.sessionsAdded||0,skipped:d.sessionsSkipped||0})})]}),i.jsxs("div",{children:[i.jsx("span",{children:e("data.importResultBackup")}),d.backupDir?i.jsx("code",{className:"ga-data-export-path ga-data-export-path--inline",children:d.backupDir}):i.jsx("strong",{children:e("data.importResultNoBackup")})]}),i.jsx("p",{children:d.backupDir?e("data.importRestoreHint"):e("data.importNoRestoreNeeded")})]})}),i.jsxs(re,{visible:!!u,title:e("data.exportDataSuccessTitle"),width:560,onCancel:()=>p(null),footer:i.jsxs("div",{className:"ga-data-source-actions",children:[i.jsx(ie,{onClick:()=>p(null),children:e("common.done")}),i.jsx(ie,{type:"primary",onClick:D,children:e("data.exportDataReveal")})]}),children:[i.jsx("p",{children:e("data.exportDataSuccessMessage")}),u&&i.jsx("code",{className:"ga-data-export-path",children:u})]})]})}function Ts(n,e){const t=new Blob([n],{type:"text/plain"}),o=URL.createObjectURL(t),r=document.createElement("a");r.href=o,r.download=e,r.click(),URL.revokeObjectURL(o)}const Rs=Pi();function Ns(n,e){return n.includes("agentmain.py")?e("connection.errorInvalid"):n.includes("not compatible")||n.includes("compatibility probe")?e("connection.errorIncompatible"):n.includes("20s")||n.includes("ready")?e("connection.errorTimeout"):e("connection.errorGeneric")}function rm(){const{t:n}=ce(),e=H(M=>M.visible),t=X(M=>M.runningSessions),o=Zo(),r=Ie(M=>M.setPage),s=Ie(M=>M.setServicesTab),[l,c]=a.useState("included"),[u,p]=a.useState(""),[d,m]=a.useState("included"),[f,b]=a.useState(""),[y,S]=a.useState(!0),[w,C]=a.useState(!1),[k,_]=a.useState(!1),x=a.useCallback(async()=>{if(Rs){S(!0);try{const M=await _e("get_ga_source",{}),Z=M?"localRepository":"included";c(Z),p(M||""),m(Z),b(M||"")}catch(M){console.error("[ConnectionMode] load current mode failed:",M)}finally{S(!1)}}},[]);a.useEffect(()=>{e&&x()},[x,e]);const j=a.useCallback(async()=>{C(!0);try{const M=await _e("pick_directory",{title:n("connection.repositoryPickerTitle")});if(!M)return;let Z,ue=!1;try{Z=await _e("validate_ga_source",{dir:M})}catch(we){if(!fa(we,"validate_ga_source"))throw we;Z=M,ue=!0}b(Z),m("localRepository"),ue||G.success({content:n("connection.repositoryValidated")})}catch(M){console.error("[ConnectionMode] validate repository failed:",M);const Z=Qo(M);Z.includes("Tauri IPC")||G.error({content:Ns(Z,n)})}finally{C(!1)}},[n]),v=a.useCallback(M=>{if(M==="included"){m("included");return}if(f){m("localRepository");return}j()},[j,f]),O=l!==d||d==="localRepository"&&f!==u,E=d==="localRepository"&&(l!=="localRepository"||f!==u),D=d==="localRepository"?f:u,P=t.size>0,R=y||w||k||!O||P,L=a.useCallback(async()=>{if(!R){_(!0);try{d==="localRepository"?await _e("set_ga_source",{dir:f}):await _e("clear_ga_source",{}),await Promise.allSettled([X.getState().loadSessions(),H.getState().loadFromBridge()]);const M=d==="localRepository"?f:"";c(d),p(M),G.success({content:n(d==="localRepository"?"connection.localSuccess":"connection.includedSuccess")})}catch(M){console.error("[ConnectionMode] apply failed:",M),G.error({content:Ns(Qo(M),n)})}finally{_(!1)}}},[R,d,f,n]),z=a.useCallback(()=>{s("status"),r("services"),H.getState().close()},[r,s]),W=a.useMemo(()=>o==="ready"?"connection.statusReady":o==="connecting"?"connection.statusConnecting":"connection.statusUnavailable",[o]),A=o==="ready"?"on":o==="connecting"?"switching":"unavailable";return Rs?i.jsxs("div",{className:"ga-set-block ga-connection-section","data-testid":"connection-mode-section",children:[i.jsx(bt,{tip:n("connection.sectionTip"),tipLabel:n("connection.sectionHelp"),children:n("connection.title")}),i.jsx("p",{className:"ga-connection-description",children:n("connection.description")}),i.jsxs(Ke,{"aria-label":n("connection.title"),name:"desktop-connection-mode",type:"pureCard",value:d,disabled:y||k,onChange:M=>v(M.target.value),className:"ga-connection-mode-grid",children:[i.jsx(Me,{value:"included",className:"ga-connection-mode-card",extra:n("connection.includedDescription"),children:i.jsx($e,{content:n("connection.includedTip"),position:"topLeft",children:i.jsxs("span",{className:"ga-connection-card-title",tabIndex:0,"aria-label":`${n("connection.included")}:${n("connection.includedTip")}`,children:[n("connection.included"),l==="included"&&i.jsx(Ae,{size:"small",color:"green",children:n("connection.current")})]})})}),i.jsx(Me,{value:"localRepository",className:"ga-connection-mode-card",extra:n("connection.localDescription"),children:i.jsx($e,{content:n("connection.localTip"),position:"topLeft",children:i.jsxs("span",{className:"ga-connection-card-title",tabIndex:0,"aria-label":`${n("connection.local")}:${n("connection.localTip")}`,children:[n("connection.local"),l==="localRepository"&&i.jsx(Ae,{size:"small",color:"green",children:n("connection.current")})]})})})]}),(d==="localRepository"||l==="localRepository")&&i.jsxs("div",{className:"ga-connection-repository-detail",children:[i.jsxs("div",{className:"ga-connection-repository-header",children:[i.jsx("span",{children:n(E?"connection.pendingRepository":"connection.currentRepository")}),i.jsx(ie,{size:"small",type:"tertiary",loading:w,disabled:k,onClick:j,children:n(f?"connection.changeRepository":"connection.chooseRepository")})]}),D&&i.jsx("code",{className:"ga-connection-path",children:D})]}),i.jsxs("div",{className:"ga-connection-apply-row",children:[i.jsx("div",{className:"ga-connection-apply-note",role:"status",children:P?n("connection.runningTaskBlock"):O?n("connection.pendingNotice"):""}),i.jsx(ie,{type:"primary",loading:k,disabled:R,onClick:L,children:n(k?"connection.applying":"connection.apply")})]}),i.jsxs("div",{className:"ga-connection-status-row",children:[i.jsxs("div",{className:"ga-connection-status-copy",children:[i.jsx("span",{className:`ga-source-dot ga-source-dot--${A}`}),i.jsx($e,{content:n("connection.statusTip"),position:"topLeft",children:i.jsx("span",{className:"ga-connection-status-label",tabIndex:0,"aria-label":`${n("connection.status")}:${n("connection.statusTip")}`,children:n("connection.status")})}),i.jsx("strong",{children:n(W)})]}),i.jsx(ie,{size:"small",type:"tertiary",onClick:z,children:n("connection.viewStatus")})]})]}):null}const sm="https://github.com/lsdefine/GenericAgent#-社区与支持",im="https://datawhalechina.github.io/hello-generic-agent/",am=["RoundSquisheen","_Ashes_in_the_Snow_","pax1123581321"];async function lm(n,e=t=>navigator.clipboard.writeText(t)){await e(n)}function cm(){return i.jsx("svg",{"aria-hidden":"true",className:"ga-help-feedback-wechat-icon",viewBox:"0 0 24 24",xmlns:"http://www.w3.org/2000/svg",children:i.jsx("path",{d:"M8.691 2.188C3.891 2.188 0 5.476 0 9.53c0 2.212 1.17 4.203 3.002 5.55a.59.59 0 0 1 .213.665l-.39 1.48c-.019.07-.048.141-.048.213 0 .163.13.295.29.295a.326.326 0 0 0 .167-.054l1.903-1.114a.864.864 0 0 1 .717-.098 10.16 10.16 0 0 0 2.837.403c.276 0 .543-.027.811-.05-.857-2.578.157-4.972 1.932-6.446 1.703-1.415 3.882-1.98 5.853-1.838-.576-3.583-4.196-6.348-8.596-6.348zM5.785 5.991c.642 0 1.162.529 1.162 1.18a1.17 1.17 0 0 1-1.162 1.178A1.17 1.17 0 0 1 4.623 7.17c0-.651.52-1.18 1.162-1.18zm5.813 0c.642 0 1.162.529 1.162 1.18a1.17 1.17 0 0 1-1.162 1.178 1.17 1.17 0 0 1-1.162-1.178c0-.651.52-1.18 1.162-1.18zm5.34 2.867c-1.797-.052-3.746.512-5.28 1.786-1.72 1.428-2.687 3.72-1.78 6.22.942 2.453 3.666 4.229 6.884 4.229.826 0 1.622-.12 2.361-.336a.722.722 0 0 1 .598.082l1.584.926a.272.272 0 0 0 .14.047c.134 0 .24-.111.24-.247 0-.06-.023-.12-.038-.177l-.327-1.233a.582.582 0 0 1-.023-.156.49.49 0 0 1 .201-.398C23.024 18.48 24 16.82 24 14.98c0-3.21-2.931-5.837-6.656-6.088V8.89c-.135-.01-.27-.027-.407-.03zm-2.53 3.274c.535 0 .969.44.969.982a.976.976 0 0 1-.969.983.976.976 0 0 1-.969-.983c0-.542.434-.982.97-.982zm4.844 0c.535 0 .969.44.969.982a.976.976 0 0 1-.969.983.976.976 0 0 1-.969-.983c0-.542.434-.982.969-.982z"})})}function Ds({description:n,href:e,label:t}){return i.jsxs("div",{className:"ga-help-feedback-resource",children:[i.jsx("p",{children:n}),i.jsxs("a",{className:"ga-help-feedback-link",href:e,target:"_blank",rel:"noopener noreferrer",children:[i.jsx("span",{children:t}),i.jsx(qa,{size:"small","aria-hidden":"true"})]})]})}function dm(){const{t:n}=ce(),e=a.useCallback(async t=>{try{await lm(t),G.success({content:n("helpFeedback.copySuccess")})}catch{G.error({content:n("helpFeedback.copyError")})}},[n]);return i.jsxs("section",{className:"ga-set-block ga-help-feedback-section","data-testid":"help-feedback-section",children:[i.jsx(bt,{children:n("helpFeedback.title")}),i.jsxs(dt,{className:"ga-help-feedback-collapse",defaultActiveKey:[],children:[i.jsx(dt.Panel,{itemKey:"community",header:n("helpFeedback.communityTitle"),children:i.jsx(Ds,{description:n("helpFeedback.communityDescription"),href:sm,label:n("helpFeedback.communityAction")})}),i.jsx(dt.Panel,{itemKey:"tutorial",header:n("helpFeedback.tutorialTitle"),children:i.jsx(Ds,{description:n("helpFeedback.tutorialDescription"),href:im,label:n("helpFeedback.tutorialAction")})}),i.jsxs(dt.Panel,{itemKey:"maintainers",header:n("helpFeedback.maintainersTitle"),children:[i.jsx("p",{className:"ga-help-feedback-description",children:n("helpFeedback.maintainersDescription")}),i.jsx("div",{className:"ga-help-feedback-list",children:am.map(t=>i.jsxs("div",{className:"ga-help-feedback-row",children:[i.jsxs("div",{className:"ga-help-feedback-contact",children:[i.jsx(cm,{}),i.jsx("code",{className:"ga-help-feedback-id",children:t})]}),i.jsx(ie,{size:"small",type:"tertiary",onClick:()=>e(t),children:n("helpFeedback.copy")})]},t))})]})]})]})}const um=[{key:"deepseek",label:"DeepSeek",descKey:"pq.deepseekDesc",protocol:"oai",apibase:"https://api.deepseek.com/v1",defaultModel:"deepseek-v4-pro",defaultName:"DeepSeek",keyUrl:"https://platform.deepseek.com/api_keys",color:"#4D6BFE",iconPath:"M23.748 4.482c-.254-.124-.364.113-.512.234-.051.039-.094.09-.137.136-.372.397-.806.657-1.373.626-.829-.046-1.537.214-2.163.848-.133-.782-.575-1.248-1.247-1.548-.352-.156-.708-.311-.955-.65-.172-.241-.219-.51-.305-.774-.055-.16-.11-.323-.293-.35-.2-.031-.278.136-.356.276-.313.572-.434 1.202-.422 1.84.027 1.436.633 2.58 1.838 3.393.137.093.172.187.129.323-.082.28-.18.552-.266.833-.055.179-.137.217-.329.14a5.526 5.526 0 01-1.736-1.18c-.857-.828-1.631-1.742-2.597-2.458a11.365 11.365 0 00-.689-.471c-.985-.957.13-1.743.388-1.836.27-.098.093-.432-.779-.428-.872.004-1.67.295-2.687.684a3.055 3.055 0 01-.465.137 9.597 9.597 0 00-2.883-.102c-1.885.21-3.39 1.102-4.497 2.623C.082 8.606-.231 10.684.152 12.85c.403 2.284 1.569 4.175 3.36 5.653 1.858 1.533 3.997 2.284 6.438 2.14 1.482-.085 3.133-.284 4.994-1.86.47.234.962.327 1.78.397.63.059 1.236-.03 1.705-.128.735-.156.684-.837.419-.961-2.155-1.004-1.682-.595-2.113-.926 1.096-1.296 2.746-2.642 3.392-7.003.05-.347.007-.565 0-.845-.004-.17.035-.237.23-.256a4.173 4.173 0 001.545-.475c1.396-.763 1.96-2.015 2.093-3.517.02-.23-.004-.467-.247-.588zM11.581 18c-2.089-1.642-3.102-2.183-3.52-2.16-.392.024-.321.471-.235.763.09.288.207.486.371.739.114.167.192.416-.113.603-.673.416-1.842-.14-1.897-.167-1.361-.802-2.5-1.86-3.301-3.307-.774-1.393-1.224-2.887-1.298-4.482-.02-.386.093-.522.477-.592a4.696 4.696 0 011.529-.039c2.132.312 3.946 1.265 5.468 2.774.868.86 1.525 1.887 2.202 2.891.72 1.066 1.494 2.082 2.48 2.914.348.292.625.514.891.677-.802.09-2.14.11-3.054-.614zm1-6.44a.306.306 0 01.415-.287.302.302 0 01.2.288.306.306 0 01-.31.307.303.303 0 01-.304-.308zm3.11 1.596c-.2.081-.399.151-.59.16a1.245 1.245 0 01-.798-.254c-.274-.23-.47-.358-.552-.758a1.73 1.73 0 01.016-.588c.07-.327-.008-.537-.239-.727-.187-.156-.426-.199-.688-.199a.559.559 0 01-.254-.078c-.11-.054-.2-.19-.114-.358.028-.054.16-.186.192-.21.356-.202.767-.136 1.146.016.352.144.618.408 1.001.782.391.451.462.576.685.914.176.265.336.537.445.848.067.195-.019.354-.25.452z"},{key:"qwen",label:"通义千问",descKey:"pq.qwenDesc",protocol:"oai",apibase:"https://dashscope.aliyuncs.com/compatible-mode/v1",defaultModel:"qwen3.7-max",defaultName:"通义千问",keyUrl:"https://bailian.console.aliyun.com/?apiKey=1",color:"#615CED",iconPath:"M12.604 1.34c.393.69.784 1.382 1.174 2.075a.18.18 0 00.157.091h5.552c.174 0 .322.11.446.327l1.454 2.57c.19.337.24.478.024.837-.26.43-.513.864-.76 1.3l-.367.658c-.106.196-.223.28-.04.512l2.652 4.637c.172.301.111.494-.043.77-.437.785-.882 1.564-1.335 2.34-.159.272-.352.375-.68.37-.777-.016-1.552-.01-2.327.016a.099.099 0 00-.081.05 575.097 575.097 0 01-2.705 4.74c-.169.293-.38.363-.725.364-.997.003-2.002.004-3.017.002a.537.537 0 01-.465-.271l-1.335-2.323a.09.09 0 00-.083-.049H4.982c-.285.03-.553-.001-.805-.092l-1.603-2.77a.543.543 0 01-.002-.54l1.207-2.12a.198.198 0 000-.197 550.951 550.951 0 01-1.875-3.272l-.79-1.395c-.16-.31-.173-.496.095-.965.465-.813.927-1.625 1.387-2.436.132-.234.304-.334.584-.335a338.3 338.3 0 012.589-.001.124.124 0 00.107-.063l2.806-4.895a.488.488 0 01.422-.246c.524-.001 1.053 0 1.583-.006L11.704 1c.341-.003.724.032.9.34zm-3.432.403a.06.06 0 00-.052.03L6.254 6.788a.157.157 0 01-.135.078H3.253c-.056 0-.07.025-.041.074l5.81 10.156c.025.042.013.062-.034.063l-2.795.015a.218.218 0 00-.2.116l-1.32 2.31c-.044.078-.021.118.068.118l5.716.008c.046 0 .08.02.104.061l1.403 2.454c.046.081.092.082.139 0l5.006-8.76.783-1.382a.055.055 0 01.096 0l1.424 2.53a.122.122 0 00.107.062l2.763-.02a.04.04 0 00.035-.02.041.041 0 000-.04l-2.9-5.086a.108.108 0 010-.113l.293-.507 1.12-1.977c.024-.041.012-.062-.035-.062H9.2c-.059 0-.073-.026-.043-.077l1.434-2.505a.107.107 0 000-.114L9.225 1.774a.06.06 0 00-.053-.031zm6.29 8.02c.046 0 .058.02.034.06l-.832 1.465-2.613 4.585a.056.056 0 01-.05.029.058.058 0 01-.05-.029L8.498 9.841c-.02-.034-.01-.052.028-.054l.216-.012 6.722-.012z"},{key:"doubao",label:"火山方舟",descKey:"pq.doubaoDesc",protocol:"oai",apibase:"https://ark.cn-beijing.volces.com/api/v3",defaultModel:"doubao-seed-2.1-pro",defaultName:"火山方舟",keyUrl:"https://console.volcengine.com/ark/region:ark+cn-beijing/apiKey",color:"#006EFF",iconPath:["M10.278 7.741L6.685 21.736a.214.214 0 00.214.264h7.17a.216.216 0 00.214-.166.216.216 0 000-.098L10.687 7.742a.214.214 0 00-.409 0z","M4.553 16.18l-1.406 5.558a.214.214 0 00.203.261h2.42-4.551a.214.214 0 01-.214-.26l2.275-8.961a.214.214 0 01.409 0l.864 3.402z","M16.694 22h3.207a.215.215 0 00.214-.262l-1.839-6.993 1.164-4.592a.214.214 0 01.411 0l2.951 11.586a.214.214 0 01-.214.261h-5.894z"]},{key:"minimax",label:"MiniMax",descKey:"pq.minimaxDesc",protocol:"oai",apibase:"https://api.minimax.chat/v1",defaultModel:"MiniMax-M3",defaultName:"MiniMax",keyUrl:"https://platform.minimaxi.com/user-center/basic-information/interface-key",color:"#F23F5D",iconPath:"M16.278 2c1.156 0 2.093.927 2.093 2.07v12.501a.74.74 0 00.744.709.74.74 0 00.743-.709V9.099a2.06 2.06 0 012.071-2.049A2.06 2.06 0 0124 9.1v6.561a.649.649 0 01-.652.645.649.649 0 01-.653-.645V9.1a.762.762 0 00-.766-.758.762.762 0 00-.766.758v7.472a2.037 2.037 0 01-2.048 2.026 2.037 2.037 0 01-2.048-2.026v-12.5a.785.785 0 00-.788-.753.785.785 0 00-.789.752l-.001 15.904A2.037 2.037 0 0113.441 22a2.037 2.037 0 01-2.048-2.026V18.04c0-.356.292-.645.652-.645.36 0 .652.289.652.645v1.934c0 .263.142.506.372.638.23.131.514.131.744 0a.734.734 0 00.372-.638V4.07c0-1.143.937-2.07 2.093-2.07zm-5.674 0c1.156 0 2.093.927 2.093 2.07v11.523a.648.648 0 01-.652.645.648.648 0 01-.652-.645V4.07a.785.785 0 00-.789-.78.785.785 0 00-.789.78v14.013a2.06 2.06 0 01-2.07 2.048 2.06 2.06 0 01-2.071-2.048V9.1a.762.762 0 00-.766-.758.762.762 0 00-.766.758v3.8a2.06 2.06 0 01-2.071 2.049A2.06 2.06 0 010 12.9v-1.378c0-.357.292-.646.652-.646.36 0 .653.29.653.646V12.9c0 .418.343.757.766.757s.766-.339.766-.757V9.099a2.06 2.06 0 012.07-2.048 2.06 2.06 0 012.071 2.048v8.984c0 .419.343.758.767.758.423 0 .766-.339.766-.758V4.07c0-1.143.937-2.07 2.093-2.07z"},{key:"zhipu",label:"智谱 GLM",descKey:"pq.zhipuDesc",protocol:"oai",apibase:"https://open.bigmodel.cn/api/paas/v4",defaultModel:"glm-5.2",defaultName:"智谱 GLM",keyUrl:"https://open.bigmodel.cn/usercenter/apikeys",color:"#3859FF",iconPath:"M11.991 23.503a.24.24 0 00-.244.248.24.24 0 00.244.249.24.24 0 00.245-.249.24.24 0 00-.22-.247l-.025-.001zM9.671 5.365a1.697 1.697 0 011.099 2.132l-.071.172-.016.04-.018.054c-.07.16-.104.32-.104.498-.035.71.47 1.279 1.186 1.314h.366c1.309.053 2.338 1.173 2.286 2.523-.052 1.332-1.152 2.38-2.478 2.327h-.174c-.715.018-1.274.64-1.239 1.368 0 .124.018.23.053.337.209.373.54.658.96.8.75.23 1.517-.125 1.9-.782l.018-.035c.402-.64 1.17-.96 1.92-.711.854.284 1.378 1.226 1.099 2.167a1.661 1.661 0 01-2.077 1.102 1.711 1.711 0 01-.907-.711l-.017-.035c-.2-.323-.463-.58-.851-.711l-.056-.018a1.646 1.646 0 00-1.954.746 1.66 1.66 0 01-1.065.764 1.677 1.677 0 01-1.989-1.279c-.209-.906.332-1.83 1.257-2.043a1.51 1.51 0 01.296-.035h.018c.68-.071 1.151-.622 1.116-1.333a1.307 1.307 0 00-.227-.693 2.515 2.515 0 01-.366-1.403 2.39 2.39 0 01.366-1.208c.14-.195.21-.444.227-.693.018-.71-.506-1.261-1.186-1.332l-.07-.018a1.43 1.43 0 01-.299-.07l-.05-.019a1.7 1.7 0 01-1.047-2.114 1.68 1.68 0 012.094-1.101zm-5.575 10.11c.26-.264.639-.367.994-.27.355.096.633.379.728.74.095.362-.007.748-.267 1.013-.402.41-1.053.41-1.455 0a1.062 1.062 0 010-1.482zm14.845-.294c.359-.09.738.024.992.297.254.274.344.665.237 1.025-.107.36-.396.634-.756.718-.551.128-1.1-.22-1.23-.781a1.05 1.05 0 01.757-1.26zm-.064-4.39c.314.32.49.753.49 1.206 0 .452-.176.886-.49 1.206-.315.32-.74.5-1.185.5-.444 0-.87-.18-1.184-.5a1.727 1.727 0 010-2.412 1.654 1.654 0 012.369 0zm-11.243.163c.364.484.447 1.128.218 1.691a1.665 1.665 0 01-2.188.923c-.855-.36-1.26-1.358-.907-2.228a1.68 1.68 0 011.33-1.038c.593-.08 1.183.169 1.547.652zm11.545-4.221c.368 0 .708.2.892.524.184.324.184.724 0 1.048a1.026 1.026 0 01-.892.524c-.568 0-1.03-.47-1.03-1.048 0-.579.462-1.048 1.03-1.048zm-14.358 0c.368 0 .707.2.891.524.184.324.184.724 0 1.048a1.026 1.026 0 01-.891.524c-.569 0-1.03-.47-1.03-1.048 0-.579.461-1.048 1.03-1.048zm10.031-1.475c.925 0 1.675.764 1.675 1.706s-.75 1.705-1.675 1.705-1.674-.763-1.674-1.705c0-.942.75-1.706 1.674-1.706zm-2.626-.684c.362-.082.653-.356.761-.718a1.062 1.062 0 00-.238-1.028 1.017 1.017 0 00-.996-.294c-.547.14-.881.7-.752 1.257.13.558.675.907 1.225.783zm0 16.876c.359-.087.644-.36.75-.72a1.062 1.062 0 00-.237-1.019 1.018 1.018 0 00-.985-.301 1.037 1.037 0 00-.762.717c-.108.361-.017.754.239 1.028.245.263.606.377.953.305l.043-.01zM17.19 3.5a.631.631 0 00.628-.64c0-.355-.279-.64-.628-.64a.631.631 0 00-.628.64c0 .355.28.64.628.64zm-10.38 0a.631.631 0 00.628-.64c0-.355-.28-.64-.628-.64a.631.631 0 00-.628.64c0 .355.279.64.628.64zm-5.182 7.852a.631.631 0 00-.628.64c0 .354.28.639.628.639a.63.63 0 00.627-.606l.001-.034a.62.62 0 00-.628-.64zm5.182 9.13a.631.631 0 00-.628.64c0 .355.279.64.628.64a.631.631 0 00.628-.64c0-.355-.28-.64-.628-.64zm10.38.018a.631.631 0 00-.628.64c0 .355.28.64.628.64a.631.631 0 00.628-.64c0-.355-.279-.64-.628-.64zm5.182-9.148a.631.631 0 00-.628.64c0 .354.279.639.628.639a.631.631 0 00.628-.64c0-.355-.28-.64-.628-.64zm-.384-4.992a.24.24 0 00.244-.249.24.24 0 00-.244-.249.24.24 0 00-.244.249c0 .142.122.249.244.249zM11.991.497a.24.24 0 00.245-.248A.24.24 0 0011.99 0a.24.24 0 00-.244.249c0 .133.108.236.223.247l.021.001zM2.011 6.36a.24.24 0 00.245-.249.24.24 0 00-.244-.249.24.24 0 00-.244.249.24.24 0 00.244.249zm0 11.263a.24.24 0 00-.243.248.24.24 0 00.244.249.24.24 0 00.244-.249.252.252 0 00-.244-.248zm19.995-.018a.24.24 0 00-.245.248.24.24 0 00.245.25.24.24 0 00.244-.25.252.252 0 00-.244-.248z"},{key:"kimi",label:"Kimi",descKey:"pq.kimiDesc",protocol:"oai",apibase:"https://api.moonshot.cn/v1",defaultModel:"kimi-k2.7-code",defaultName:"Kimi",keyUrl:"https://platform.moonshot.cn/console/api-keys",color:"#000000",iconPath:["M21.846 0a1.923 1.923 0 110 3.846H20.15a.226.226 0 01-.227-.226V1.923C19.923.861 20.784 0 21.846 0z","M11.065 11.199l7.257-7.2c.137-.136.06-.41-.116-.41H14.3a.164.164 0 00-.117.051l-7.82 7.756c-.122.12-.302.013-.302-.179V3.82c0-.127-.083-.23-.185-.23H3.186c-.103 0-.186.103-.186.23V19.77c0 .128.083.23.186.23h2.69c.103 0 .186-.102.186-.23v-3.25c0-.069.025-.135.069-.178l2.424-2.406a.158.158 0 01.205-.023l6.484 4.772a7.677 7.677 0 003.453 1.283c.108.012.2-.095.2-.23v-3.06c0-.117-.07-.212-.164-.227a5.028 5.028 0 01-2.027-.807l-5.613-4.064c-.117-.078-.132-.279-.028-.381z"]},{key:"stepfun",label:"阶跃星辰",descKey:"pq.stepfunDesc",protocol:"oai",apibase:"https://api.stepfun.com/v1",defaultModel:"step-3.7-flash",defaultName:"阶跃星辰",keyUrl:"https://platform.stepfun.com/interface-key",color:"#005AFF",iconPath:"M22.012 0h1.032v.927H24v.968h-.956V3.78h-1.032V1.896h-1.878v-.97h1.878V0zM2.6 12.371V1.87h.969v10.502h-.97zm10.423.66h10.95v.918h-6.208v9.579h-4.742V13.03zM5.629 3.333v12.356H0v4.51h10.386V8L20.859 8l-.003-4.668-15.227.001z"}];function pm({preset:n,onClick:e}){const{t}=ce();return i.jsxs("button",{type:"button",className:"ga-provider-card",onClick:e,style:{"--provider-color":n.color},children:[i.jsx("svg",{className:"ga-provider-card-icon",width:"20",height:"20",viewBox:"0 0 24 24",fill:n.color,fillRule:"evenodd",xmlns:"http://www.w3.org/2000/svg",children:Array.isArray(n.iconPath)?n.iconPath.map((o,r)=>i.jsx("path",{d:o},r)):i.jsx("path",{d:n.iconPath})}),i.jsxs("span",{className:"ga-provider-card-body",children:[i.jsx("span",{className:"ga-provider-card-label",children:n.label}),i.jsx("span",{className:"ga-provider-card-desc",children:t(n.descKey)})]}),i.jsx("span",{className:"ga-provider-card-caret",children:"›"})]})}const on={model:"",apikey:"",apibase:"",name:"",protocol:"oai",stream:!0,max_retries:5,connect_timeout:15,read_timeout:300};function hm({editingId:n,onDone:e}){const t=H(v=>v.setModelProfiles),{t:o}=ce(),[r,s]=a.useState("choose"),[l,c]=a.useState(null),[u,p]=a.useState(null),[d,m]=a.useState(on),[f,b]=a.useState(!1),[y,S]=a.useState(!1),w=n!=null;a.useEffect(()=>{w?(s("form"),c("custom"),p(null),S(!0),yd(n).then(v=>{v&&m({model:v.model||"",apikey:v.apikey||"",apibase:v.apibase||"",name:v.name||"",protocol:v.protocol||"oai",stream:v.stream!==!1,max_retries:v.max_retries??5,connect_timeout:v.connect_timeout??15,read_timeout:v.read_timeout??300}),S(!1)})):(m(on),s("choose"),c(null),p(null),b(!1),S(!1))},[n,w]);const C=a.useCallback(v=>{p(v),c("provider"),m({...on,model:v.defaultModel,apibase:v.apibase,name:v.defaultName,protocol:v.protocol}),s("form")},[]),k=a.useCallback(()=>{c("custom"),p(null),m(on),s("form")},[]),_=a.useCallback(()=>{s("choose"),c(null),p(null)},[]),x=async()=>{if(!d.model.trim()||!d.apibase.trim()){G.warning({content:o("model.model")+" / "+o("model.apibase")+" required"});return}if(!d.apikey.trim()){G.warning({content:o("model.apikey")+" required"});return}try{const v={model:d.model.trim(),apibase:d.apibase.trim(),name:d.name.trim()||void 0,protocol:d.protocol,stream:d.stream,max_retries:d.max_retries,connect_timeout:d.connect_timeout,read_timeout:d.read_timeout};d.apikey.trim()&&(v.apikey=d.apikey.trim());let O;w?O=await vd(n,v):O=await bd(v),t(O),G.success({content:o(w?"model.save":"set.addModel")}),e()}catch{G.error({content:"Error"})}},j=l==="provider"&&u!=null;return y?i.jsx("div",{style:{padding:24,textAlign:"center",color:"var(--semi-color-text-2)"},children:"Loading…"}):r==="choose"?i.jsxs("div",{children:[i.jsxs("button",{type:"button",className:"ga-form-back",onClick:e,children:["← ",o("common.cancel")]}),i.jsxs("div",{className:"ga-route-picker",children:[i.jsx("button",{type:"button",className:"ga-route-btn ga-route-btn--active",onClick:()=>{},children:o("model.routeProvider")}),i.jsx("button",{type:"button",className:"ga-route-btn",onClick:k,children:o("model.routeCustom")})]}),i.jsx("div",{className:"ga-provider-list",children:um.map(v=>i.jsx(pm,{preset:v,onClick:()=>C(v)},v.key))})]}):i.jsxs("div",{className:"ga-form",children:[!w&&i.jsxs("button",{type:"button",className:"ga-form-back",onClick:_,children:["← ",o("model.selectProvider")]}),w&&i.jsxs("button",{type:"button",className:"ga-form-back",onClick:e,children:["← ",o("common.cancel")]}),i.jsxs("div",{className:"ga-form-field",children:[i.jsx("label",{className:"ga-form-label",children:o("model.name")}),i.jsx(ut,{value:d.name,onChange:v=>m(O=>({...O,name:v})),placeholder:o("model.namePh"),maxLength:50})]}),i.jsxs("div",{className:"ga-form-field",children:[i.jsxs("label",{className:"ga-form-label",children:[o("model.model")," ",i.jsx("span",{className:"ga-form-req",children:"*"})]}),i.jsx(ut,{value:d.model,onChange:v=>m(O=>({...O,model:v})),placeholder:o("model.modelPh"),maxLength:50})]}),i.jsxs("div",{className:"ga-form-field",children:[i.jsxs("label",{className:"ga-form-label",children:[o("model.protocol")," ",i.jsx("span",{className:"ga-form-req",children:"*"})]}),i.jsxs(Ke,{value:d.protocol,onChange:v=>m(O=>({...O,protocol:v.target.value})),disabled:j,children:[i.jsx(Me,{value:"oai",children:o("model.protocolOai")}),i.jsx(Me,{value:"claude",children:o("model.protocolClaude")})]}),j&&i.jsx("span",{className:"ga-form-locked-hint",children:o("model.providerLocked")})]}),i.jsxs("div",{className:"ga-form-field",children:[i.jsxs("label",{className:"ga-form-label",children:[o("model.apibase")," ",i.jsx("span",{className:"ga-form-req",children:"*"})]}),i.jsx(ut,{value:d.apibase,onChange:v=>m(O=>({...O,apibase:v})),placeholder:o("model.apibasePh"),maxLength:200,disabled:j}),j&&i.jsx("span",{className:"ga-form-locked-hint",children:o("model.providerLocked")})]}),i.jsxs("div",{className:"ga-form-field",children:[i.jsxs("label",{className:"ga-form-label",children:[o("model.apikey")," ",!w&&i.jsx("span",{className:"ga-form-req",children:"*"}),j&&u&&i.jsx("a",{className:"ga-form-key-link",href:u.keyUrl,target:"_blank",rel:"noopener noreferrer",children:o("model.getKey")})]}),i.jsx(ut,{mode:"password",value:d.apikey,onChange:v=>m(O=>({...O,apikey:v})),placeholder:o("model.apikeyPh"),maxLength:200})]}),i.jsxs("div",{className:"ga-form-field",children:[i.jsx("label",{className:"ga-form-label",children:o("model.stream")}),i.jsxs(Ke,{value:d.stream,onChange:v=>m(O=>({...O,stream:v.target.value})),children:[i.jsx(Me,{value:!0,children:o("model.streamOn")}),i.jsx(Me,{value:!1,children:o("model.streamOff")})]})]}),i.jsxs("button",{type:"button",className:"ga-form-advanced-toggle","data-expanded":f||void 0,onClick:()=>b(v=>!v),children:[i.jsx("svg",{width:"10",height:"10",viewBox:"0 0 10 10",fill:"currentColor",children:i.jsx("path",{d:"M3 1.5L7 5L3 8.5",stroke:"currentColor",strokeWidth:"1.2",strokeLinecap:"round",strokeLinejoin:"round",fill:"none"})}),o("model.advanced")]}),f&&i.jsx("div",{className:"ga-form-advanced-body",children:i.jsxs("div",{className:"ga-form-row",children:[i.jsxs("div",{className:"ga-form-field",children:[i.jsx("label",{className:"ga-form-label",children:o("model.retries")}),i.jsx(Hn,{value:d.max_retries,onChange:v=>m(O=>({...O,max_retries:v})),min:1,max:20,style:{width:"100%"}})]}),i.jsxs("div",{className:"ga-form-field",children:[i.jsx("label",{className:"ga-form-label",children:o("model.connTimeout")}),i.jsx(Hn,{value:d.connect_timeout,onChange:v=>m(O=>({...O,connect_timeout:v})),min:1,max:300,suffix:"s",style:{width:"100%"}})]}),i.jsxs("div",{className:"ga-form-field",children:[i.jsx("label",{className:"ga-form-label",children:o("model.readTimeout")}),i.jsx(Hn,{value:d.read_timeout,onChange:v=>m(O=>({...O,read_timeout:v})),min:5,max:3600,suffix:"s",style:{width:"100%"}})]})]})}),i.jsx("div",{style:{marginTop:8,display:"flex",justifyContent:"flex-end"},children:i.jsx(ie,{type:"primary",onClick:x,children:o("model.save")})})]})}function mm(){const{visible:n,open:e,close:t,loadFromBridge:o}=H(),{t:r}=ce(),[s,l]=a.useState("main"),[c,u]=a.useState(null);a.useEffect(()=>{const b=()=>{o(),e()},y=()=>t();return window.addEventListener("ga:open-settings",b),window.addEventListener("ga:close-settings",y),()=>{window.removeEventListener("ga:open-settings",b),window.removeEventListener("ga:close-settings",y)}},[e,t,o]),a.useEffect(()=>{n||(l("main"),u(null))},[n]);const p=a.useCallback(()=>{u(null),l("addModel")},[]),d=a.useCallback(b=>{u(b),l("addModel")},[]),m=a.useCallback(()=>{l("main"),u(null)},[]),f=s==="main"?r("modal.settings"):c!=null?r("modal.editModel"):r("modal.addModel");return i.jsx(re,{visible:n,onCancel:t,title:f,footer:null,width:870,centered:!0,closeOnEsc:!0,className:"ga-settings-dialog",children:s==="main"?i.jsxs(i.Fragment,{children:[i.jsx(Zh,{}),i.jsx(qh,{}),i.jsx(Gh,{onAdd:p,onEdit:d}),i.jsx(om,{}),i.jsx(rm,{}),i.jsx(dm,{})]}):i.jsx(hm,{editingId:c,onDone:m})})}const fm={zh:ba,en:ya};function gm(){const n=H(t=>t.lang),e=H(t=>t.loadFromBridge);return a.useEffect(()=>{e()},[e]),i.jsxs(ga,{locale:fm[n],children:[i.jsx(Kh,{}),i.jsx(mm,{}),i.jsx(Hh,{})]})}document.documentElement.dataset.appearance==="dark"&&document.body.setAttribute("theme-mode","dark");document.addEventListener("click",n=>{var t;const e=(t=window.__TAURI__)==null?void 0:t.opener;za(n,typeof(e==null?void 0:e.openUrl)=="function"?o=>e.openUrl(o):void 0)});setTimeout(()=>{document.body.classList.remove("no-transition")},0);class ym extends g.Component{constructor(){super(...arguments);xt(this,"state",{error:null})}static getDerivedStateFromError(t){return{error:t}}componentDidCatch(t,o){console.error("[RootErrorBoundary] React crashed:",t,o.componentStack)}render(){if(this.state.error){const t=(navigator.language||"").toLowerCase().startsWith("zh"),o=this.state.error;return i.jsxs("main",{className:"ga-root-error",role:"alert",children:[i.jsx(ai,{className:"ga-root-error-result",image:i.jsx(ld,{}),darkModeImage:i.jsx(nd,{}),title:t?"界面遇到问题":"Something went wrong",description:t?"GenericAgent 的界面未能继续运行。你的会话和记忆不会受到影响。":"The GenericAgent interface could not continue. Your sessions and memory are safe.",children:i.jsx(ie,{type:"primary",theme:"solid",icon:i.jsx(pl,{}),onClick:()=>window.location.reload(),children:t?"重新加载":"Reload"})}),i.jsx(dt,{className:"ga-root-error-details",accordion:!0,children:i.jsxs(dt.Panel,{itemKey:"technical-details",header:t?"技术详情":"Technical details",children:[i.jsx(Do.Paragraph,{type:"tertiary",children:t?"复制以下信息可帮助排查问题。":"Copy the information below to help troubleshoot the issue."}),i.jsx("pre",{tabIndex:0,children:[o.message,o.stack].filter(Boolean).join(` + +`)})]})})]})}return this.props.children}}async function bm(){const n=document.getElementById("app");va.createRoot(n).render(i.jsx(ym,{children:i.jsx(gm,{})}))}bm();export{Hn as A,ee as B,ka as C,Re as D,ai as E,ut as F,ae as G,yi as H,Ha as I,uu as J,H as K,Ih as L,re as M,ph as N,Ee as O,G as P,Fa as Q,et as R,Sm as S,Ae as T,km as U,Aa as V,$o as W,Io as _,jm as a,ce as b,oi as c,Is as d,Zo as e,Pi as f,pl as g,Ie as h,Om as i,Lo as j,Yl as k,gt as l,Ve as m,X as n,Nl as o,zl as p,Al as q,$l as r,Qt as s,xl as t,_s as u,Fl as v,Vl as w,Il as x,Kl as y,pn as z}; diff --git a/frontends/desktop/dist/assets/main-uLcKKTNv.css b/frontends/desktop/dist/assets/main-uLcKKTNv.css new file mode 100644 index 000000000..a260aacd0 --- /dev/null +++ b/frontends/desktop/dist/assets/main-uLcKKTNv.css @@ -0,0 +1 @@ +*{box-sizing:border-box;margin:0;padding:0}.no-transition,.no-transition *,.no-transition *:before,.no-transition *:after{transition:none!important;animation:none!important}::-webkit-scrollbar{width:6px;height:6px}::-webkit-scrollbar-track{background:transparent}::-webkit-scrollbar-thumb{background:var(--semi-color-fill-2);border-radius:3px}::-webkit-scrollbar-thumb:hover{background:var(--semi-color-fill-1)}@font-face{font-family:codicon;src:url(/assets/codicon-DjkITdqj.ttf) format("truetype");font-weight:400;font-style:normal}.codicon{font-family:codicon;font-weight:400;font-style:normal;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}:root{--font-sans: -apple-system, BlinkMacSystemFont, "SF Pro Text", system-ui, "Segoe UI", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", sans-serif;--font-mono: "JetBrains Mono", ui-monospace, SFMono-Regular, Menlo, Monaco, monospace;--foreground: hsl(0 0% 8%);--background: hsl(0 0% 100%);--ui-text-secondary: hsl(0 0% 30%);--ui-text-tertiary: hsl(0 0% 48%);--ui-text-quaternary: hsl(0 0% 60%);--ui-icon-nav: hsl(0 0% 24%);--ui-icon-nav-active: hsl(0 0% 8%);--theme-primary: hsl(220 80% 50%);--ui-row-hover-background: hsl(0 0% 95%);--ui-row-active-background: hsl(0 0% 92%);--ui-control-hover-background: hsl(0 0% 95%);--ui-control-active-background: hsl(0 0% 90%);--ui-sidebar-surface-background: hsl(0 0% 100%);--ui-stroke-tertiary: hsl(0 0% 88%);--sidebar-edge-border: hsl(0 0% 86%);--ui-accent: hsl(220 80% 50%);--chrome-action-hover: hsl(0 0% 93%);--dt-card: hsl(0 0% 100%);--dt-background: hsl(0 0% 97%);--ui-chat-surface-background: hsl(0 0% 100%);--ui-chat-bubble-background: hsl(0 0% 96%);--ui-stroke-secondary: hsl(0 0% 78%);--ui-tooltip-surface: #17181b;--ui-tooltip-text: #fff}[data-appearance=dark]{--foreground: hsl(0 0% 95%);--background: hsl(240 3% 7.5%);--ui-text-secondary: hsl(0 0% 78%);--ui-text-tertiary: hsl(0 0% 60%);--ui-text-quaternary: hsl(0 0% 48%);--ui-icon-nav: hsl(0 0% 72%);--ui-icon-nav-active: hsl(0 0% 95%);--theme-primary: hsl(220 80% 68%);--ui-row-hover-background: hsl(220 3% 15%);--ui-row-active-background: hsl(220 3% 18%);--ui-control-hover-background: hsl(220 3% 16%);--ui-control-active-background: hsl(220 3% 22%);--ui-sidebar-surface-background: hsl(210 3% 12%);--ui-stroke-tertiary: hsl(220 3% 22%);--sidebar-edge-border: hsl(220 3% 20%);--ui-accent: hsl(220 80% 68%);--chrome-action-hover: hsl(220 3% 18%);--dt-card: hsl(220 3% 14%);--dt-background: hsl(240 3% 7.5%);--ui-chat-surface-background: hsl(240 3% 7.5%);--ui-chat-bubble-background: hsl(220 3% 14%);--ui-stroke-secondary: hsl(220 3% 32%)}html,body,#app{height:100%;width:100%;overflow:hidden;font-family:var(--font-sans)}body{background:var(--background);color:var(--foreground);-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.semi-tooltip-wrapper{padding:5px 8px;background-color:var(--ui-tooltip-surface);color:var(--ui-tooltip-text);font-family:var(--font-sans);font-size:12px;line-height:18px}.semi-tooltip-wrapper .semi-tooltip-icon-arrow{color:var(--ui-tooltip-surface)}button,input,select,textarea{font-family:inherit;font-size:inherit;font-weight:inherit;line-height:inherit;color:inherit}[data-appearance=dark] body{color-scheme:dark}[data-slot=model-chip-label],[data-slot=model-menu-name],.ga-model-name,.ga-mixin-member-name{font-family:var(--font-mono)}.ga-root-error{width:min(100%,620px);min-height:100%;margin:0 auto;padding:48px 32px;overflow:auto;color:var(--semi-color-text-0)}.ga-root-error-result.semi-empty{padding:32px 0 18px}.ga-root-error-details{margin-top:18px;border-top:1px solid var(--semi-color-border)}.ga-root-error-details .semi-collapse-header{padding-inline:4px;color:var(--semi-color-text-2)}.ga-root-error-details .semi-typography{margin-top:0}.ga-root-error-details pre{max-height:280px;margin:0;padding:14px;overflow:auto;border:1px solid var(--semi-color-border);border-radius:var(--semi-border-radius-medium);outline:none;background:var(--semi-color-fill-0);color:var(--semi-color-text-1);font:12px/1.55 var(--font-mono);white-space:pre-wrap;overflow-wrap:anywhere;-webkit-user-select:text;user-select:text}.ga-root-error-details pre:focus-visible{border-color:var(--semi-color-primary);box-shadow:0 0 0 2px var(--semi-color-primary-light-default)}@keyframes semi-input-active{0%{transform:scale(1)}to{transform:scale(.97)}}@keyframes semi-input-inactive{0%{transform:scale(.97)}to{transform:scale(1)}}.semi-input{transition:background-color var(--semi-transition_duration-none) var(--semi-transition_function-easeIn) var(--semi-transition_delay-none),border var(--semi-transition_duration-none) var(--semi-transition_function-easeIn) var(--semi-transition_delay-none);transform:scale(var(--semi-transform_scale-none))}.semi-input-wrapper{display:inline-block;position:relative;vertical-align:middle;box-shadow:none;font-size:14px;line-height:20px;font-family:Inter,-apple-system,BlinkMacSystemFont,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Segoe UI,Helvetica Neue,Helvetica,Arial,sans-serif;background-color:var(--semi-color-fill-0);border:1px transparent solid;border-radius:var(--semi-border-radius-small);width:100%;outline:none;cursor:text;box-sizing:border-box;color:var(--semi-color-text-0);transition:background-color var(--semi-transition_duration-none) var(--semi-transition_function-easeIn) var(--semi-transition_delay-none),border var(--semi-transition_duration-none) var(--semi-transition_function-easeIn) var(--semi-transition_delay-none);transform:scale(var(--semi-transform_scale-none))}.semi-input-wrapper-default{height:32px;font-size:14px;line-height:20px;font-family:Inter,-apple-system,BlinkMacSystemFont,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Segoe UI,Helvetica Neue,Helvetica,Arial,sans-serif;line-height:30px}.semi-input-wrapper-small{height:24px;font-size:14px;line-height:20px;font-family:Inter,-apple-system,BlinkMacSystemFont,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Segoe UI,Helvetica Neue,Helvetica,Arial,sans-serif;line-height:22px}.semi-input-wrapper-large{height:40px;font-size:16px;line-height:22px;font-family:Inter,-apple-system,BlinkMacSystemFont,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Segoe UI,Helvetica Neue,Helvetica,Arial,sans-serif;line-height:38px}.semi-input-wrapper:hover{background-color:var(--semi-color-fill-1);border-color:transparent}.semi-input-wrapper-focus{background-color:var(--semi-color-fill-0);border:var(--semi-color-focus-border) solid 1px}.semi-input-wrapper-focus:hover{background-color:var(--semi-color-fill-0);border-color:var(--semi-color-focus-border)}.semi-input-wrapper-focus:active{background-color:var(--semi-color-fill-2);border-color:var(--semi-color-focus-border)}.semi-input-wrapper.semi-input-readonly{cursor:default}.semi-input-wrapper-error{background-color:var(--semi-color-danger-light-default);border-color:var(--semi-color-danger-light-default)}.semi-input-wrapper-error:hover{background-color:var(--semi-color-danger-light-hover);border-color:var(--semi-color-danger-light-hover)}.semi-input-wrapper-error.semi-input-wrapper-focus{background-color:var(--semi-color-danger-light-default);border-color:var(--semi-color-danger)}.semi-input-wrapper-error:active{background-color:var(--semi-color-danger-light-active);border-color:var(--semi-color-danger)}.semi-input-wrapper-warning{background-color:var(--semi-color-warning-light-default);border-color:var(--semi-color-warning-light-default)}.semi-input-wrapper-warning:hover{background-color:var(--semi-color-warning-light-hover);border-color:var(--semi-color-warning-light-hover)}.semi-input-wrapper-warning.semi-input-wrapper-focus{background-color:var(--semi-color-warning-light-default);border-color:var(--semi-color-warning)}.semi-input-wrapper-warning:active{background-color:var(--semi-color-warning-light-active);border-color:var(--semi-color-warning)}.semi-input-wrapper__with-prefix{display:inline-flex;align-items:center}.semi-input-wrapper__with-prefix .semi-input{padding-left:0}.semi-input-wrapper__with-suffix{display:inline-flex;align-items:center}.semi-input-wrapper__with-suffix .semi-input{padding-right:0}.semi-input-wrapper-clearable,.semi-input-wrapper-modebtn{display:inline-flex;align-items:center}.semi-input-wrapper-hidden{border:none}.semi-input-wrapper .semi-icon{color:var(--semi-color-text-2)}.semi-input-wrapper .semi-input-clearbtn,.semi-input-wrapper .semi-input-modebtn{color:var(--semi-color-primary-hover)}.semi-input-wrapper .semi-input-clearbtn>svg,.semi-input-wrapper .semi-input-modebtn>svg{pointer-events:none}.semi-input-wrapper .semi-input-clearbtn:hover,.semi-input-wrapper .semi-input-modebtn:hover{cursor:pointer}.semi-input-wrapper .semi-input-clearbtn:hover .semi-icon,.semi-input-wrapper .semi-input-modebtn:hover .semi-icon{color:var(--semi-color-primary-hover)}.semi-input-wrapper .semi-input-clearbtn:focus-visible,.semi-input-wrapper .semi-input-modebtn:focus-visible{border-radius:var(--semi-border-radius-small);outline:2px solid var(--semi-color-primary-light-active);outline-offset:-1px}.semi-input-wrapper__with-suffix-icon.semi-input-wrapper-clearable:not(.semi-input-wrapper__with-suffix-hidden) .semi-input-clearbtn{min-width:24px;justify-content:flex-end}.semi-input-wrapper-modebtn.semi-input-wrapper-clearable .semi-input-clearbtn{min-width:16px;justify-content:center}.semi-input-wrapper.semi-input-wrapper__with-append-only .semi-input{border-radius:0 var(--semi-border-radius-small) var(--semi-border-radius-small) 0}.semi-input-wrapper.semi-input-wrapper__with-append-only .semi-input:not(:last-child){border-right-style:none;border-radius:0}.semi-input-wrapper.semi-input-wrapper__with-prepend-only .semi-input{border-radius:var(--semi-border-radius-small) 0 0 var(--semi-border-radius-small)}.semi-input-wrapper.semi-input-wrapper__with-prepend-only .semi-input:not(:last-child){border-right-style:none}.semi-input-wrapper.semi-input-wrapper__with-prepend,.semi-input-wrapper.semi-input-wrapper__with-append{display:inline-flex;align-items:center;background-color:transparent}.semi-input-wrapper.semi-input-wrapper__with-prepend:hover,.semi-input-wrapper.semi-input-wrapper__with-append:hover{background-color:transparent}.semi-input-wrapper.semi-input-wrapper__with-prepend.semi-input-wrapper-focus,.semi-input-wrapper.semi-input-wrapper__with-append.semi-input-wrapper-focus{border:1px transparent solid;background-color:transparent}.semi-input-wrapper.semi-input-wrapper__with-prepend .semi-input,.semi-input-wrapper.semi-input-wrapper__with-append .semi-input{background-color:var(--semi-color-fill-0);border:1px transparent solid}.semi-input-wrapper.semi-input-wrapper__with-prepend .semi-input:hover,.semi-input-wrapper.semi-input-wrapper__with-append .semi-input:hover{background-color:var(--semi-color-fill-1)}.semi-input-wrapper.semi-input-wrapper__with-prepend .semi-input:hover+.semi-input-clearbtn,.semi-input-wrapper.semi-input-wrapper__with-prepend .semi-input:hover~.semi-input-modebtn,.semi-input-wrapper.semi-input-wrapper__with-append .semi-input:hover+.semi-input-clearbtn,.semi-input-wrapper.semi-input-wrapper__with-append .semi-input:hover~.semi-input-modebtn{background-color:var(--semi-color-fill-1)}.semi-input-wrapper.semi-input-wrapper__with-prepend .semi-input:focus,.semi-input-wrapper.semi-input-wrapper__with-append .semi-input:focus{border:1px var(--semi-color-focus-border) solid;background-color:var(--semi-color-fill-0)}.semi-input-wrapper.semi-input-wrapper__with-prepend .semi-input:focus.semi-input-sibling-clearbtn,.semi-input-wrapper.semi-input-wrapper__with-prepend .semi-input:focus.semi-input-sibling-modebtn,.semi-input-wrapper.semi-input-wrapper__with-append .semi-input:focus.semi-input-sibling-clearbtn,.semi-input-wrapper.semi-input-wrapper__with-append .semi-input:focus.semi-input-sibling-modebtn{border-right-style:none}.semi-input-wrapper.semi-input-wrapper__with-prepend .semi-input:focus.semi-input-sibling-modebtn+.semi-input-clearbtn,.semi-input-wrapper.semi-input-wrapper__with-append .semi-input:focus.semi-input-sibling-modebtn+.semi-input-clearbtn{border-right-style:none}.semi-input-wrapper.semi-input-wrapper__with-prepend .semi-input:focus+.semi-input-clearbtn,.semi-input-wrapper.semi-input-wrapper__with-prepend .semi-input:focus~.semi-input-modebtn,.semi-input-wrapper.semi-input-wrapper__with-append .semi-input:focus+.semi-input-clearbtn,.semi-input-wrapper.semi-input-wrapper__with-append .semi-input:focus~.semi-input-modebtn{box-sizing:border-box;background-color:var(--semi-color-fill-0)}.semi-input-wrapper.semi-input-wrapper__with-prepend .semi-input:focus+.semi-input-clearbtn,.semi-input-wrapper.semi-input-wrapper__with-append .semi-input:focus+.semi-input-clearbtn{border:1px var(--semi-color-focus-border) solid;border-radius:0 var(--semi-border-radius-small) var(--semi-border-radius-small) 0;border-left-style:none}.semi-input-wrapper.semi-input-wrapper__with-prepend .semi-input:focus+.semi-input-clearbtn:not(:last-child),.semi-input-wrapper.semi-input-wrapper__with-append .semi-input:focus+.semi-input-clearbtn:not(:last-child){border-radius:0}.semi-input-wrapper.semi-input-wrapper__with-prepend .semi-input:focus~.semi-input-modebtn,.semi-input-wrapper.semi-input-wrapper__with-append .semi-input:focus~.semi-input-modebtn{border:1px var(--semi-color-focus-border) solid;border-radius:0 var(--semi-border-radius-small) var(--semi-border-radius-small) 0;border-left-style:none}.semi-input-wrapper.semi-input-wrapper__with-prepend .semi-input:focus~.semi-input-modebtn:not(:last-child),.semi-input-wrapper.semi-input-wrapper__with-append .semi-input:focus~.semi-input-modebtn:not(:last-child){border-radius:0}.semi-input-wrapper.semi-input-wrapper__with-prepend .semi-input:active,.semi-input-wrapper.semi-input-wrapper__with-append .semi-input:active{background-color:var(--semi-color-fill-2)}.semi-input-wrapper.semi-input-wrapper__with-prepend .semi-input:active+.semi-input-clearbtn,.semi-input-wrapper.semi-input-wrapper__with-prepend .semi-input:active~.semi-input-modebtn,.semi-input-wrapper.semi-input-wrapper__with-append .semi-input:active+.semi-input-clearbtn,.semi-input-wrapper.semi-input-wrapper__with-append .semi-input:active~.semi-input-modebtn{background-color:var(--semi-color-fill-2)}.semi-input-wrapper.semi-input-wrapper__with-prepend .semi-input-clearbtn,.semi-input-wrapper.semi-input-wrapper__with-prepend .semi-input-modebtn,.semi-input-wrapper.semi-input-wrapper__with-prepend .semi-input-clearbtn:hover,.semi-input-wrapper.semi-input-wrapper__with-prepend .semi-input-modebtn:hover,.semi-input-wrapper.semi-input-wrapper__with-append .semi-input-clearbtn,.semi-input-wrapper.semi-input-wrapper__with-append .semi-input-modebtn,.semi-input-wrapper.semi-input-wrapper__with-append .semi-input-clearbtn:hover,.semi-input-wrapper.semi-input-wrapper__with-append .semi-input-modebtn:hover{background-color:var(--semi-color-fill-0)}.semi-input-wrapper.semi-input-wrapper__with-prepend .semi-input-clearbtn:last-child,.semi-input-wrapper.semi-input-wrapper__with-prepend .semi-input-modebtn:last-child,.semi-input-wrapper.semi-input-wrapper__with-prepend .semi-input-clearbtn:hover:last-child,.semi-input-wrapper.semi-input-wrapper__with-prepend .semi-input-modebtn:hover:last-child,.semi-input-wrapper.semi-input-wrapper__with-append .semi-input-clearbtn:last-child,.semi-input-wrapper.semi-input-wrapper__with-append .semi-input-modebtn:last-child,.semi-input-wrapper.semi-input-wrapper__with-append .semi-input-clearbtn:hover:last-child,.semi-input-wrapper.semi-input-wrapper__with-append .semi-input-modebtn:hover:last-child{border-radius:0 var(--semi-border-radius-small) var(--semi-border-radius-small) 0}.semi-input-wrapper.semi-input-wrapper__with-prepend.semi-input-wrapper-error,.semi-input-wrapper.semi-input-wrapper__with-append.semi-input-wrapper-error{border-color:transparent}.semi-input-wrapper.semi-input-wrapper__with-prepend.semi-input-wrapper-error .semi-input,.semi-input-wrapper.semi-input-wrapper__with-append.semi-input-wrapper-error .semi-input{background-color:var(--semi-color-danger-light-default);border-color:var(--semi-color-danger-light-default)}.semi-input-wrapper.semi-input-wrapper__with-prepend.semi-input-wrapper-error .semi-input:hover,.semi-input-wrapper.semi-input-wrapper__with-append.semi-input-wrapper-error .semi-input:hover{background-color:var(--semi-color-danger-light-hover);border-color:var(--semi-color-danger-light-hover)}.semi-input-wrapper.semi-input-wrapper__with-prepend.semi-input-wrapper-error .semi-input:hover+.semi-input-clearbtn,.semi-input-wrapper.semi-input-wrapper__with-prepend.semi-input-wrapper-error .semi-input:hover+.semi-input-modebtn,.semi-input-wrapper.semi-input-wrapper__with-append.semi-input-wrapper-error .semi-input:hover+.semi-input-clearbtn,.semi-input-wrapper.semi-input-wrapper__with-append.semi-input-wrapper-error .semi-input:hover+.semi-input-modebtn{background-color:var(--semi-color-danger-light-hover)}.semi-input-wrapper.semi-input-wrapper__with-prepend.semi-input-wrapper-error .semi-input:focus,.semi-input-wrapper.semi-input-wrapper__with-append.semi-input-wrapper-error .semi-input:focus{background-color:var(--semi-color-danger-light-default);border-color:var(--semi-color-danger)}.semi-input-wrapper.semi-input-wrapper__with-prepend.semi-input-wrapper-error .semi-input:focus+.semi-input-clearbtn,.semi-input-wrapper.semi-input-wrapper__with-prepend.semi-input-wrapper-error .semi-input:focus+.semi-input-modebtn,.semi-input-wrapper.semi-input-wrapper__with-append.semi-input-wrapper-error .semi-input:focus+.semi-input-clearbtn,.semi-input-wrapper.semi-input-wrapper__with-append.semi-input-wrapper-error .semi-input:focus+.semi-input-modebtn{background-color:var(--semi-color-danger-light-default);border-color:var(--semi-color-danger)}.semi-input-wrapper.semi-input-wrapper__with-prepend.semi-input-wrapper-error .semi-input:active,.semi-input-wrapper.semi-input-wrapper__with-append.semi-input-wrapper-error .semi-input:active{background-color:var(--semi-color-danger-light-active)}.semi-input-wrapper.semi-input-wrapper__with-prepend.semi-input-wrapper-error .semi-input:active+.semi-input-clearbtn,.semi-input-wrapper.semi-input-wrapper__with-prepend.semi-input-wrapper-error .semi-input:active+.semi-input-modebtn,.semi-input-wrapper.semi-input-wrapper__with-append.semi-input-wrapper-error .semi-input:active+.semi-input-clearbtn,.semi-input-wrapper.semi-input-wrapper__with-append.semi-input-wrapper-error .semi-input:active+.semi-input-modebtn{background-color:var(--semi-color-danger-light-active);border-color:var(--semi-color-danger)}.semi-input-wrapper.semi-input-wrapper__with-prepend.semi-input-wrapper-error .semi-input-clearbtn,.semi-input-wrapper.semi-input-wrapper__with-prepend.semi-input-wrapper-error .semi-input-modebtn,.semi-input-wrapper.semi-input-wrapper__with-prepend.semi-input-wrapper-error .semi-input-clearbtn:hover,.semi-input-wrapper.semi-input-wrapper__with-prepend.semi-input-wrapper-error .semi-input-modebtn:hover,.semi-input-wrapper.semi-input-wrapper__with-append.semi-input-wrapper-error .semi-input-clearbtn,.semi-input-wrapper.semi-input-wrapper__with-append.semi-input-wrapper-error .semi-input-modebtn,.semi-input-wrapper.semi-input-wrapper__with-append.semi-input-wrapper-error .semi-input-clearbtn:hover,.semi-input-wrapper.semi-input-wrapper__with-append.semi-input-wrapper-error .semi-input-modebtn:hover{background-color:var(--semi-color-danger-light-default)}.semi-input-wrapper.semi-input-wrapper__with-prepend.semi-input-wrapper-error .semi-input-clearbtn:last-child,.semi-input-wrapper.semi-input-wrapper__with-prepend.semi-input-wrapper-error .semi-input-modebtn:last-child,.semi-input-wrapper.semi-input-wrapper__with-prepend.semi-input-wrapper-error .semi-input-clearbtn:hover:last-child,.semi-input-wrapper.semi-input-wrapper__with-prepend.semi-input-wrapper-error .semi-input-modebtn:hover:last-child,.semi-input-wrapper.semi-input-wrapper__with-append.semi-input-wrapper-error .semi-input-clearbtn:last-child,.semi-input-wrapper.semi-input-wrapper__with-append.semi-input-wrapper-error .semi-input-modebtn:last-child,.semi-input-wrapper.semi-input-wrapper__with-append.semi-input-wrapper-error .semi-input-clearbtn:hover:last-child,.semi-input-wrapper.semi-input-wrapper__with-append.semi-input-wrapper-error .semi-input-modebtn:hover:last-child{border-radius:0 var(--semi-border-radius-small) var(--semi-border-radius-small) 0}.semi-input-wrapper.semi-input-wrapper__with-prepend.semi-input-wrapper-warning,.semi-input-wrapper.semi-input-wrapper__with-append.semi-input-wrapper-warning{border-color:transparent}.semi-input-wrapper.semi-input-wrapper__with-prepend.semi-input-wrapper-warning .semi-input,.semi-input-wrapper.semi-input-wrapper__with-append.semi-input-wrapper-warning .semi-input{background-color:var(--semi-color-warning-light-default);border-color:var(--semi-color-warning-light-default)}.semi-input-wrapper.semi-input-wrapper__with-prepend.semi-input-wrapper-warning .semi-input:hover,.semi-input-wrapper.semi-input-wrapper__with-append.semi-input-wrapper-warning .semi-input:hover{background-color:var(--semi-color-warning-light-hover);border-color:var(--semi-color-warning-light-hover)}.semi-input-wrapper.semi-input-wrapper__with-prepend.semi-input-wrapper-warning .semi-input:hover+.semi-input-clearbtn,.semi-input-wrapper.semi-input-wrapper__with-prepend.semi-input-wrapper-warning .semi-input:hover+.semi-input-modebtn,.semi-input-wrapper.semi-input-wrapper__with-append.semi-input-wrapper-warning .semi-input:hover+.semi-input-clearbtn,.semi-input-wrapper.semi-input-wrapper__with-append.semi-input-wrapper-warning .semi-input:hover+.semi-input-modebtn{background-color:var(--semi-color-warning-light-hover)}.semi-input-wrapper.semi-input-wrapper__with-prepend.semi-input-wrapper-warning .semi-input:focus,.semi-input-wrapper.semi-input-wrapper__with-append.semi-input-wrapper-warning .semi-input:focus{background-color:var(--semi-color-warning-light-default);border-color:var(--semi-color-warning)}.semi-input-wrapper.semi-input-wrapper__with-prepend.semi-input-wrapper-warning .semi-input:focus+.semi-input-clearbtn,.semi-input-wrapper.semi-input-wrapper__with-prepend.semi-input-wrapper-warning .semi-input:focus+.semi-input-modebtn,.semi-input-wrapper.semi-input-wrapper__with-append.semi-input-wrapper-warning .semi-input:focus+.semi-input-clearbtn,.semi-input-wrapper.semi-input-wrapper__with-append.semi-input-wrapper-warning .semi-input:focus+.semi-input-modebtn{background-color:var(--semi-color-warning-light-default);border-color:var(--semi-color-warning)}.semi-input-wrapper.semi-input-wrapper__with-prepend.semi-input-wrapper-warning .semi-input:active,.semi-input-wrapper.semi-input-wrapper__with-append.semi-input-wrapper-warning .semi-input:active{background-color:var(--semi-color-warning-light-active)}.semi-input-wrapper.semi-input-wrapper__with-prepend.semi-input-wrapper-warning .semi-input:active+.semi-input-clearbtn,.semi-input-wrapper.semi-input-wrapper__with-prepend.semi-input-wrapper-warning .semi-input:active+.semi-input-modebtn,.semi-input-wrapper.semi-input-wrapper__with-append.semi-input-wrapper-warning .semi-input:active+.semi-input-clearbtn,.semi-input-wrapper.semi-input-wrapper__with-append.semi-input-wrapper-warning .semi-input:active+.semi-input-modebtn{background-color:var(--semi-color-warning-light-active);border-color:var(--semi-color-warning)}.semi-input-wrapper.semi-input-wrapper__with-prepend.semi-input-wrapper-warning .semi-input-clearbtn,.semi-input-wrapper.semi-input-wrapper__with-prepend.semi-input-wrapper-warning .semi-input-modebtn,.semi-input-wrapper.semi-input-wrapper__with-prepend.semi-input-wrapper-warning .semi-input-clearbtn:hover,.semi-input-wrapper.semi-input-wrapper__with-prepend.semi-input-wrapper-warning .semi-input-modebtn:hover,.semi-input-wrapper.semi-input-wrapper__with-append.semi-input-wrapper-warning .semi-input-clearbtn,.semi-input-wrapper.semi-input-wrapper__with-append.semi-input-wrapper-warning .semi-input-modebtn,.semi-input-wrapper.semi-input-wrapper__with-append.semi-input-wrapper-warning .semi-input-clearbtn:hover,.semi-input-wrapper.semi-input-wrapper__with-append.semi-input-wrapper-warning .semi-input-modebtn:hover{background-color:var(--semi-color-warning-light-default)}.semi-input-wrapper.semi-input-wrapper__with-prepend.semi-input-wrapper-warning .semi-input-clearbtn:last-child,.semi-input-wrapper.semi-input-wrapper__with-prepend.semi-input-wrapper-warning .semi-input-modebtn:last-child,.semi-input-wrapper.semi-input-wrapper__with-prepend.semi-input-wrapper-warning .semi-input-clearbtn:hover:last-child,.semi-input-wrapper.semi-input-wrapper__with-prepend.semi-input-wrapper-warning .semi-input-modebtn:hover:last-child,.semi-input-wrapper.semi-input-wrapper__with-append.semi-input-wrapper-warning .semi-input-clearbtn:last-child,.semi-input-wrapper.semi-input-wrapper__with-append.semi-input-wrapper-warning .semi-input-modebtn:last-child,.semi-input-wrapper.semi-input-wrapper__with-append.semi-input-wrapper-warning .semi-input-clearbtn:hover:last-child,.semi-input-wrapper.semi-input-wrapper__with-append.semi-input-wrapper-warning .semi-input-modebtn:hover:last-child{border-radius:0 var(--semi-border-radius-small) var(--semi-border-radius-small) 0}.semi-input-wrapper-disabled{cursor:not-allowed;color:var(--semi-color-disabled-text);background-color:var(--semi-color-disabled-fill);-webkit-text-fill-color:var(--semi-color-disabled-text)}.semi-input-wrapper-disabled:hover{background-color:var(--semi-color-disabled-fill)}.semi-input-wrapper-disabled .semi-input-append,.semi-input-wrapper-disabled .semi-input-prepend,.semi-input-wrapper-disabled .semi-input-suffix,.semi-input-wrapper-disabled .semi-input-prefix,.semi-input-wrapper-disabled .semi-icon{color:var(--semi-color-disabled-text)}.semi-input{border:none;outline:none;width:100%;color:inherit;padding-left:12px;padding-right:12px;background-color:transparent;box-sizing:border-box}.semi-input:placeholder-shown{text-overflow:ellipsis}.semi-input[type=password]::-ms-reveal,.semi-input[type=password]::-ms-clear{display:none}.semi-input[type=search]::-webkit-search-cancel-button{display:none}.semi-input::placeholder{color:var(--semi-color-text-2)}.semi-input-large{height:38px;font-size:16px;line-height:22px;font-family:Inter,-apple-system,BlinkMacSystemFont,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Segoe UI,Helvetica Neue,Helvetica,Arial,sans-serif;line-height:38px}.semi-input-small{height:22px;font-size:14px;line-height:20px;font-family:Inter,-apple-system,BlinkMacSystemFont,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Segoe UI,Helvetica Neue,Helvetica,Arial,sans-serif;line-height:22px}.semi-input-default{height:30px;font-size:14px;line-height:20px;font-family:Inter,-apple-system,BlinkMacSystemFont,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Segoe UI,Helvetica Neue,Helvetica,Arial,sans-serif;line-height:30px}.semi-input-disabled{cursor:not-allowed;color:inherit}.semi-input-inset-label{margin:0 12px;font-weight:600;color:var(--semi-color-text-2);flex-shrink:0;white-space:nowrap}.semi-input-prefix,.semi-input-suffix{display:flex;justify-content:center;align-items:center}.semi-input-prefix-text,.semi-input-suffix-text{margin:0 12px;color:var(--semi-color-text-2);font-weight:600;white-space:nowrap}.semi-input-prefix-icon,.semi-input-suffix-icon{color:var(--semi-color-text-2);margin:0 8px}.semi-input-suffix{display:flex;justify-content:center;align-items:center}.semi-input-clearbtn,.semi-input-modebtn{display:flex;align-items:center;height:100%;justify-content:center;min-width:32px}.semi-input-clearbtn+.semi-input-suffix+.semi-input-suffix-text{margin-left:0}.semi-input-clearbtn+.semi-input-suffix+.semi-input-suffix-icon{margin-left:0}.semi-input-suffix-hidden{display:none}.semi-input-prepend,.semi-input-append{height:100%;display:flex;align-items:center;background-color:var(--semi-color-fill-0);color:var(--semi-color-text-2);font-size:14px;line-height:20px;font-family:Inter,-apple-system,BlinkMacSystemFont,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Segoe UI,Helvetica Neue,Helvetica,Arial,sans-serif;flex-shrink:0}.semi-input-prepend-icon,.semi-input-prepend-text,.semi-input-append-icon,.semi-input-append-text{padding:0 12px}.semi-input-append{border-radius:0 var(--semi-border-radius-small) var(--semi-border-radius-small) 0;border-left:1px transparent solid}.semi-input-prepend{border-radius:var(--semi-border-radius-small) 0 0 var(--semi-border-radius-small);border-right:1px transparent solid}.semi-input-disabled::placeholder{color:var(--semi-color-disabled-text)}.semi-input-group{display:inline-flex;align-items:center;align-content:center;flex-wrap:wrap}.semi-input-group .semi-select,.semi-input-group .semi-tagInput,.semi-input-group .semi-cascader,.semi-input-group .semi-tree-select,.semi-input-group>.semi-input-wrapper{border-radius:0}.semi-input-group .semi-select:first-child,.semi-input-group .semi-tagInput:first-child,.semi-input-group .semi-cascader:first-child,.semi-input-group .semi-tree-select:first-child,.semi-input-group>.semi-input-wrapper:first-child{border-radius:var(--semi-border-radius-small) 0 0 var(--semi-border-radius-small)}.semi-input-group .semi-select:last-child,.semi-input-group .semi-tagInput:last-child,.semi-input-group .semi-cascader:last-child,.semi-input-group .semi-tree-select:last-child,.semi-input-group>.semi-input-wrapper:last-child{border-radius:0 var(--semi-border-radius-small) var(--semi-border-radius-small) 0}.semi-input-group .semi-select:not(:last-child),.semi-input-group .semi-tagInput:not(:last-child),.semi-input-group .semi-cascader:not(:last-child),.semi-input-group .semi-tree-select:not(:last-child),.semi-input-group>.semi-input-wrapper:not(:last-child){position:relative}.semi-input-group .semi-select:not(:last-child):after,.semi-input-group .semi-tagInput:not(:last-child):after,.semi-input-group .semi-cascader:not(:last-child):after,.semi-input-group .semi-tree-select:not(:last-child):after,.semi-input-group>.semi-input-wrapper:not(:last-child):after{content:"";background-color:var(--semi-color-border);width:1px;position:absolute;right:-1px;top:1px;bottom:1px}.semi-input-group .semi-select{overflow-y:visible}.semi-input-group .semi-input-number .semi-input-wrapper,.semi-input-group .semi-input-number .semi-datepicker-range-input,.semi-input-group .semi-datepicker .semi-input-wrapper,.semi-input-group .semi-datepicker .semi-datepicker-range-input,.semi-input-group .semi-timepicker .semi-input-wrapper,.semi-input-group .semi-timepicker .semi-datepicker-range-input,.semi-input-group .semi-autocomplete .semi-input-wrapper,.semi-input-group .semi-autocomplete .semi-datepicker-range-input{border-radius:0}.semi-input-group .semi-input-number:first-child .semi-input-wrapper,.semi-input-group .semi-input-number:first-child .semi-datepicker-range-input,.semi-input-group .semi-datepicker:first-child .semi-input-wrapper,.semi-input-group .semi-datepicker:first-child .semi-datepicker-range-input,.semi-input-group .semi-timepicker:first-child .semi-input-wrapper,.semi-input-group .semi-timepicker:first-child .semi-datepicker-range-input,.semi-input-group .semi-autocomplete:first-child .semi-input-wrapper,.semi-input-group .semi-autocomplete:first-child .semi-datepicker-range-input{border-radius:var(--semi-border-radius-small) 0 0 var(--semi-border-radius-small)}.semi-input-group .semi-input-number:last-child .semi-input-wrapper,.semi-input-group .semi-input-number:last-child .semi-datepicker-range-input,.semi-input-group .semi-datepicker:last-child .semi-input-wrapper,.semi-input-group .semi-datepicker:last-child .semi-datepicker-range-input,.semi-input-group .semi-timepicker:last-child .semi-input-wrapper,.semi-input-group .semi-timepicker:last-child .semi-datepicker-range-input,.semi-input-group .semi-autocomplete:last-child .semi-input-wrapper,.semi-input-group .semi-autocomplete:last-child .semi-datepicker-range-input{border-radius:0 var(--semi-border-radius-small) var(--semi-border-radius-small) 0}.semi-input-group .semi-input-number:not(:last-child),.semi-input-group .semi-datepicker:not(:last-child),.semi-input-group .semi-timepicker:not(:last-child),.semi-input-group .semi-autocomplete:not(:last-child){position:relative}.semi-input-group .semi-input-number:not(:last-child):after,.semi-input-group .semi-datepicker:not(:last-child):after,.semi-input-group .semi-timepicker:not(:last-child):after,.semi-input-group .semi-autocomplete:not(:last-child):after{content:"";background-color:var(--semi-color-border);width:1px;position:absolute;right:-1px;top:1px;bottom:1px}.semi-input-group-wrapper-with-top-label{margin-top:16px;margin-bottom:16px}.semi-input-group-wrapper-with-top-label .semi-input-group{display:flex}.semi-input-group-wrapper-with-top-label .semi-input-group .semi-form-field{margin-top:0;margin-bottom:0}.semi-input-only_border,.semi-input-only_border:hover{background:transparent;border-color:var(--semi-color-border)}.semi-input-only_border:focus-within{background:transparent}.semi-input-borderless:not(:focus-within):not(:hover){background-color:transparent;border-color:transparent}.semi-input-borderless:focus-within:not(:active){background-color:transparent}.semi-input-borderless.semi-input-wrapper-error:not(:focus-within){border-color:var(--semi-color-danger)}.semi-input-borderless.semi-input-wrapper-warning:not(:focus-within){border-color:var(--semi-color-warning)}.semi-rtl .semi-input-wrapper,.semi-portal-rtl .semi-input-wrapper{direction:rtl}.semi-rtl .semi-input-wrapper__with-prefix .semi-input,.semi-portal-rtl .semi-input-wrapper__with-prefix .semi-input{padding-left:auto;padding-right:0}.semi-rtl .semi-input-wrapper__with-suffix .semi-input,.semi-portal-rtl .semi-input-wrapper__with-suffix .semi-input{padding-right:auto;padding-left:0}.semi-rtl .semi-input,.semi-portal-rtl .semi-input{padding-left:12px;padding-right:12px}.semi-rtl .semi-input-clearbtn+.semi-rtl .semi-input-suffix+.semi-input-suffix-text,.semi-rtl .semi-input-clearbtn+.semi-portal-rtl .semi-input-suffix+.semi-input-suffix-text,.semi-portal-rtl .semi-input-clearbtn+.semi-rtl .semi-input-suffix+.semi-input-suffix-text,.semi-portal-rtl .semi-input-clearbtn+.semi-portal-rtl .semi-input-suffix+.semi-input-suffix-text{margin-left:auto;margin-right:0}.semi-rtl .semi-input-clearbtn+.semi-rtl .semi-input-suffix+.semi-input-suffix-icon,.semi-rtl .semi-input-clearbtn+.semi-portal-rtl .semi-input-suffix+.semi-input-suffix-icon,.semi-portal-rtl .semi-input-clearbtn+.semi-rtl .semi-input-suffix+.semi-input-suffix-icon,.semi-portal-rtl .semi-input-clearbtn+.semi-portal-rtl .semi-input-suffix+.semi-input-suffix-icon{margin-left:auto;margin-right:0}.semi-rtl .semi-input-append,.semi-portal-rtl .semi-input-append{border-left:0;border-right:1px transparent solid}.semi-rtl .semi-input-prepend,.semi-portal-rtl .semi-input-prepend{border-right:0;border-left:1px transparent solid}.semi-rtl .semi-input-group .semi-select:not(:last-child):after,.semi-rtl .semi-input-group .semi-cascader:not(:last-child):after,.semi-rtl .semi-input-group .semi-tree-select:not(:last-child):after,.semi-rtl .semi-input-group>.semi-input-wrapper:not(:last-child):after,.semi-portal-rtl .semi-input-group .semi-select:not(:last-child):after,.semi-portal-rtl .semi-input-group .semi-cascader:not(:last-child):after,.semi-portal-rtl .semi-input-group .semi-tree-select:not(:last-child):after,.semi-portal-rtl .semi-input-group>.semi-input-wrapper:not(:last-child):after{right:auto;left:-1px}.semi-rtl .semi-input-group .semi-input-number:not(:last-child):after,.semi-portal-rtl .semi-input-group .semi-input-number:not(:last-child):after{right:auto;left:-1px}.semi-rtl .semi-input-textarea-wrapper,.semi-portal-rtl .semi-input-textarea-wrapper{direction:rtl}.semi-rtl .semi-input-textarea-counter,.semi-portal-rtl .semi-input-textarea-counter{text-align:left}.semi-rtl .semi-input-textarea-showClear,.semi-portal-rtl .semi-input-textarea-showClear{padding-right:0;padding-left:36px}.semi-avatar{position:relative;display:inline-flex;overflow:hidden;align-items:center;justify-content:center;white-space:nowrap;text-align:center;vertical-align:middle}.semi-avatar:focus-visible{outline:2px solid var(--semi-color-primary-light-active)}.semi-avatar-focus{outline:2px solid var(--semi-color-primary-light-active)}.semi-avatar-no-focus-visible:focus-visible{outline:none}.semi-avatar .semi-avatar-label{display:flex;align-items:center;font-size:14px;line-height:20px;font-family:Inter,-apple-system,BlinkMacSystemFont,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Segoe UI,Helvetica Neue,Helvetica,Arial,sans-serif;font-weight:600}.semi-avatar-content{-webkit-user-select:none;user-select:none}.semi-avatar-extra-extra-small{width:20px;height:20px;border-radius:3px}.semi-avatar-extra-extra-small .semi-avatar-content{transform-origin:center;transform:scale(.8)}.semi-avatar-extra-extra-small .semi-avatar-label{font-size:10px;line-height:15px}.semi-avatar-extra-small{width:24px;height:24px;border-radius:3px}.semi-avatar-extra-small .semi-avatar-content{transform-origin:center;transform:scale(.8)}.semi-avatar-extra-small .semi-avatar-label{font-size:10px;line-height:15px}.semi-avatar-small{width:32px;height:32px;border-radius:3px}.semi-avatar-small .semi-avatar-label{font-size:12px;line-height:16px;font-family:Inter,-apple-system,BlinkMacSystemFont,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Segoe UI,Helvetica Neue,Helvetica,Arial,sans-serif}.semi-avatar-default{width:40px;height:40px;border-radius:3px}.semi-avatar-default .semi-avatar-label{font-size:18px;line-height:24px;font-family:Inter,-apple-system,BlinkMacSystemFont,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Segoe UI,Helvetica Neue,Helvetica,Arial,sans-serif}.semi-avatar-medium{width:48px;height:48px;border-radius:3px}.semi-avatar-medium .semi-avatar-label{font-size:20px;line-height:28px;font-family:Inter,-apple-system,BlinkMacSystemFont,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Segoe UI,Helvetica Neue,Helvetica,Arial,sans-serif}.semi-avatar-large{width:72px;height:72px;border-radius:6px}.semi-avatar-large .semi-avatar-label{font-size:32px;line-height:44px;font-family:Inter,-apple-system,BlinkMacSystemFont,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Segoe UI,Helvetica Neue,Helvetica,Arial,sans-serif}.semi-avatar-extra-large{width:128px;height:128px;border-radius:12px}.semi-avatar-extra-large .semi-avatar-label{font-size:64px;line-height:77px}.semi-avatar-circle{border-radius:var(--semi-border-radius-circle)}.semi-avatar-image{background-color:transparent}.semi-avatar>img{display:block;width:100%;height:100%;object-fit:cover}.semi-avatar-hover{position:absolute;left:0;top:0;width:100%;height:100%}.semi-avatar:hover{cursor:pointer}.semi-avatar-wrapper{position:relative;display:inline-flex;flex-direction:column;align-items:center;width:fit-content}.semi-avatar-wrapper .semi-avatar-top_slot-bg{position:absolute;display:flex;justify-content:center;border-radius:50%;overflow:hidden}.semi-avatar-wrapper .semi-avatar-top_slot-bg-small{width:32px;height:32px}.semi-avatar-wrapper .semi-avatar-top_slot-bg-default{width:40px;height:40px}.semi-avatar-wrapper .semi-avatar-top_slot-bg-medium{width:48px;height:48px}.semi-avatar-wrapper .semi-avatar-top_slot-bg-large{width:72px;height:72px}.semi-avatar-wrapper .semi-avatar-top_slot-bg-extra-large{width:128px;height:128px}.semi-avatar-wrapper .semi-avatar-top_slot-bg-svg{position:absolute}.semi-avatar-wrapper .semi-avatar-top_slot-bg-svg-small{top:-28px;scale:.4}.semi-avatar-wrapper .semi-avatar-top_slot-bg-svg-default{top:-32px;scale:.7}.semi-avatar-wrapper .semi-avatar-top_slot-bg-svg-medium{top:-30px;scale:.8}.semi-avatar-wrapper .semi-avatar-top_slot-bg-svg-large{top:-30px;scale:1.1}.semi-avatar-wrapper .semi-avatar-top_slot-bg-svg-extra-large{top:-32px;scale:1.4}.semi-avatar-wrapper .semi-avatar-top_slot-wrapper{position:absolute;display:flex;justify-content:center}.semi-avatar-wrapper .semi-avatar-top_slot-wrapper .semi-avatar-top_slot{color:var(--semi-color-bg-0);font-weight:600}.semi-avatar-wrapper .semi-avatar-top_slot-wrapper .semi-avatar-top_slot-content{-webkit-user-select:none;user-select:none;position:relative;line-height:normal}.semi-avatar-wrapper .semi-avatar-top_slot-wrapper .semi-avatar-top_slot-content-small{font-size:5px;margin-top:0}.semi-avatar-wrapper .semi-avatar-top_slot-wrapper .semi-avatar-top_slot-content-default{font-size:6px;margin-top:-2px}.semi-avatar-wrapper .semi-avatar-top_slot-wrapper .semi-avatar-top_slot-content-medium{font-size:8px;margin-top:0}.semi-avatar-wrapper .semi-avatar-top_slot-wrapper .semi-avatar-top_slot-content-large{font-size:14px;margin-top:0}.semi-avatar-wrapper .semi-avatar-top_slot-wrapper .semi-avatar-top_slot-content-extra-large{font-size:16px;margin-top:0}.semi-avatar-wrapper .semi-avatar-bottom_slot{color:var(--semi-color-bg-0);position:absolute;cursor:pointer;bottom:3.5px;transform:translateY(50%);-webkit-user-select:none;user-select:none}.semi-avatar-wrapper .semi-avatar-bottom_slot-shape_circle{display:flex;justify-content:center;align-items:center;background:var(--semi-color-primary);border-radius:var(--semi-border-radius-circle);line-height:normal}.semi-avatar-wrapper .semi-avatar-bottom_slot-shape_circle-extra-small,.semi-avatar-wrapper .semi-avatar-bottom_slot-shape_circle-small{width:12px;height:12px;font-size:5px}.semi-avatar-wrapper .semi-avatar-bottom_slot-shape_circle-default{width:16px;height:16px;font-size:12px}.semi-avatar-wrapper .semi-avatar-bottom_slot-shape_circle-medium{width:18px;height:18px;font-size:12px}.semi-avatar-wrapper .semi-avatar-bottom_slot-shape_circle-large{width:28px;height:28px;font-size:12px}.semi-avatar-wrapper .semi-avatar-bottom_slot-shape_circle-extra-large{width:28px;height:28px;font-size:14px}.semi-avatar-wrapper .semi-avatar-bottom_slot-shape_square{display:flex;justify-content:center;align-items:center;background:var(--semi-color-primary);border-radius:4px;padding:1px 4px;font-weight:600;border-style:solid;border-color:var(--semi-color-bg-0)}.semi-avatar-wrapper .semi-avatar-bottom_slot-shape_square-extra_small,.semi-avatar-wrapper .semi-avatar-bottom_slot-shape_square-small{font-size:5px;border-width:2px}.semi-avatar-wrapper .semi-avatar-bottom_slot-shape_square-default,.semi-avatar-wrapper .semi-avatar-bottom_slot-shape_square-medium,.semi-avatar-wrapper .semi-avatar-bottom_slot-shape_square-large{font-size:12px;border-width:2px}.semi-avatar-wrapper .semi-avatar-bottom_slot-shape_square-extra-large{font-size:14px;border-width:2px}.semi-avatar-group{display:inline-block}.semi-avatar-group .semi-avatar{box-sizing:border-box}.semi-avatar-group .semi-avatar:first-child{margin-left:0}.semi-avatar-group .semi-avatar-extra-large{border:3px var(--semi-color-bg-1) solid;margin-left:-32px}.semi-avatar-group .semi-avatar-large{border:3px var(--semi-color-bg-1) solid;margin-left:-18px}.semi-avatar-group .semi-avatar-medium,.semi-avatar-group .semi-avatar-default,.semi-avatar-group .semi-avatar-small{border:2px var(--semi-color-bg-1) solid;margin-left:-12px}.semi-avatar-group .semi-avatar-extra-small{border:1px var(--semi-color-bg-1) solid;margin-left:-10px}.semi-avatar-group .semi-avatar-extra-extra-small{border:1px var(--semi-color-bg-1) solid;margin-left:-4px}.semi-avatar-group .semi-avatar-item-start-0{z-index:100}.semi-avatar-group .semi-avatar-item-end-0{z-index:80}.semi-avatar-group .semi-avatar-item-start-1{z-index:99}.semi-avatar-group .semi-avatar-item-end-1{z-index:81}.semi-avatar-group .semi-avatar-item-start-2{z-index:98}.semi-avatar-group .semi-avatar-item-end-2{z-index:82}.semi-avatar-group .semi-avatar-item-start-3{z-index:97}.semi-avatar-group .semi-avatar-item-end-3{z-index:83}.semi-avatar-group .semi-avatar-item-start-4{z-index:96}.semi-avatar-group .semi-avatar-item-end-4{z-index:84}.semi-avatar-group .semi-avatar-item-start-5{z-index:95}.semi-avatar-group .semi-avatar-item-end-5{z-index:85}.semi-avatar-group .semi-avatar-item-start-6{z-index:94}.semi-avatar-group .semi-avatar-item-end-6{z-index:86}.semi-avatar-group .semi-avatar-item-start-7{z-index:93}.semi-avatar-group .semi-avatar-item-end-7{z-index:87}.semi-avatar-group .semi-avatar-item-start-8{z-index:92}.semi-avatar-group .semi-avatar-item-end-8{z-index:88}.semi-avatar-group .semi-avatar-item-start-9{z-index:91}.semi-avatar-group .semi-avatar-item-end-9{z-index:89}.semi-avatar-group .semi-avatar-item-start-10,.semi-avatar-group .semi-avatar-item-end-10{z-index:90}.semi-avatar-group .semi-avatar-item-start-11{z-index:89}.semi-avatar-group .semi-avatar-item-end-11{z-index:91}.semi-avatar-group .semi-avatar-item-start-12{z-index:88}.semi-avatar-group .semi-avatar-item-end-12{z-index:92}.semi-avatar-group .semi-avatar-item-start-13{z-index:87}.semi-avatar-group .semi-avatar-item-end-13{z-index:93}.semi-avatar-group .semi-avatar-item-start-14{z-index:86}.semi-avatar-group .semi-avatar-item-end-14{z-index:94}.semi-avatar-group .semi-avatar-item-start-15{z-index:85}.semi-avatar-group .semi-avatar-item-end-15{z-index:95}.semi-avatar-group .semi-avatar-item-start-16{z-index:84}.semi-avatar-group .semi-avatar-item-end-16{z-index:96}.semi-avatar-group .semi-avatar-item-start-17{z-index:83}.semi-avatar-group .semi-avatar-item-end-17{z-index:97}.semi-avatar-group .semi-avatar-item-start-18{z-index:82}.semi-avatar-group .semi-avatar-item-end-18{z-index:98}.semi-avatar-group .semi-avatar-item-start-19{z-index:81}.semi-avatar-group .semi-avatar-item-end-19{z-index:99}.semi-avatar-group .semi-avatar-item-start-20{z-index:80}.semi-avatar-group .semi-avatar-item-end-20{z-index:100}.semi-avatar-group .semi-avatar-item-more{background-color:rgba(var(--semi-grey-5),1)}.semi-avatar-amber{background-color:rgba(var(--semi-amber-3),1);color:rgba(var(--semi-white),1)}.semi-avatar-blue{background-color:rgba(var(--semi-blue-3),1);color:rgba(var(--semi-white),1)}.semi-avatar-cyan{background-color:rgba(var(--semi-cyan-3),1);color:rgba(var(--semi-white),1)}.semi-avatar-green{background-color:rgba(var(--semi-green-3),1);color:rgba(var(--semi-white),1)}.semi-avatar-grey{background-color:rgba(var(--semi-grey-3),1);color:rgba(var(--semi-white),1)}.semi-avatar-indigo{background-color:rgba(var(--semi-indigo-3),1);color:rgba(var(--semi-white),1)}.semi-avatar-light-blue{background-color:rgba(var(--semi-light-blue-3),1);color:rgba(var(--semi-white),1)}.semi-avatar-light-green{background-color:rgba(var(--semi-light-green-3),1);color:rgba(var(--semi-white),1)}.semi-avatar-lime{background-color:rgba(var(--semi-lime-3),1);color:rgba(var(--semi-white),1)}.semi-avatar-orange{background-color:rgba(var(--semi-orange-3),1);color:rgba(var(--semi-white),1)}.semi-avatar-pink{background-color:rgba(var(--semi-pink-3),1);color:rgba(var(--semi-white),1)}.semi-avatar-purple{background-color:rgba(var(--semi-purple-3),1);color:rgba(var(--semi-white),1)}.semi-avatar-red{background-color:rgba(var(--semi-red-3),1);color:rgba(var(--semi-white),1)}.semi-avatar-teal{background-color:rgba(var(--semi-teal-3),1);color:rgba(var(--semi-white),1)}.semi-avatar-violet{background-color:rgba(var(--semi-violet-3),1);color:rgba(var(--semi-white),1)}.semi-avatar-yellow{background-color:rgba(var(--semi-yellow-3),1);color:rgba(var(--semi-white),1)}.semi-avatar-additionalBorder{border-style:solid;border-color:var(--semi-color-primary);display:inline-block;box-sizing:border-box;position:absolute;border-width:1.5px;top:-3.5px;left:-3.5px}.semi-avatar-additionalBorder-extra-extra-small{width:27px;height:27px}.semi-avatar-additionalBorder-extra-small{width:31px;height:31px}.semi-avatar-additionalBorder-small{width:39px;height:39px}.semi-avatar-additionalBorder-default{width:47px;height:47px}.semi-avatar-additionalBorder-medium{width:55px;height:55px}.semi-avatar-additionalBorder-large{width:79px;height:79px}.semi-avatar-additionalBorder-extra-large{width:135px;height:135px}.semi-avatar-square.semi-avatar-additionalBorder-extra_extra_small,.semi-avatar-square.semi-avatar-additionalBorder-extra_small,.semi-avatar-square.semi-avatar-additionalBorder-small,.semi-avatar-square.semi-avatar-additionalBorder-default,.semi-avatar-square.semi-avatar-additionalBorder-medium{border-radius:3px}.semi-avatar-square.semi-avatar-additionalBorder-large{border-radius:6px}.semi-avatar-additionalBorder-circle{border-radius:var(--semi-border-radius-circle)}.semi-avatar-additionalBorder-animated{animation:.8s linear infinite semi-avatar-additionalBorder}.semi-avatar-animated{animation:1s linear infinite semi-avatar-content}@keyframes semi-avatar-additionalBorder{0%{opacity:1;transform:scale(1)}to{border-width:0;opacity:0;transform:scale(1.15)}}@keyframes semi-avatar-content{0%{transform:scale(1)}50%{transform:scale(.9)}to{transform:scale(1)}}.semi-rtl .semi-avatar,.semi-portal-rtl .semi-avatar{direction:rtl}.semi-rtl .semi-avatar-extra-extra-small .semi-avatar-content,.semi-portal-rtl .semi-avatar-extra-extra-small .semi-avatar-content,.semi-rtl .semi-avatar-extra-small .semi-avatar-content,.semi-portal-rtl .semi-avatar-extra-small .semi-avatar-content{transform:scale(.8)}.semi-rtl .semi-avatar-hover,.semi-portal-rtl .semi-avatar-hover{left:auto;right:0}.semi-rtl .semi-avatar-group,.semi-portal-rtl .semi-avatar-group{direction:rtl}.semi-rtl .semi-avatar-group .semi-avatar:first-child,.semi-portal-rtl .semi-avatar-group .semi-avatar:first-child{margin-left:auto;margin-right:0}.semi-rtl .semi-avatar-group .semi-avatar-extra-large,.semi-portal-rtl .semi-avatar-group .semi-avatar-extra-large{margin-left:auto;margin-right:-32px}.semi-rtl .semi-avatar-group .semi-avatar-large,.semi-portal-rtl .semi-avatar-group .semi-avatar-large{margin-left:auto;margin-right:-18px}.semi-rtl .semi-avatar-group .semi-avatar-medium,.semi-rtl .semi-avatar-group .semi-avatar-small,.semi-portal-rtl .semi-avatar-group .semi-avatar-medium,.semi-portal-rtl .semi-avatar-group .semi-avatar-small{margin-left:auto;margin-right:-12px}.semi-rtl .semi-avatar-group .semi-avatar-extra-small,.semi-portal-rtl .semi-avatar-group .semi-avatar-extra-small{margin-left:auto;margin-right:-10px}.semi-rtl .semi-avatar-group .semi-avatar-extra-extra-small,.semi-portal-rtl .semi-avatar-group .semi-avatar-extra-extra-small{margin-left:auto;margin-right:-4px}.semi-tag{box-sizing:border-box;border-radius:var(--semi-border-radius-small);background-color:transparent;position:relative;-webkit-user-select:none;user-select:none;overflow:hidden;white-space:nowrap;vertical-align:bottom;display:flex;justify-content:center;align-items:center;display:inline-flex}.semi-tag-default,.semi-tag-small{font-size:12px;line-height:16px;font-family:Inter,-apple-system,BlinkMacSystemFont,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Segoe UI,Helvetica Neue,Helvetica,Arial,sans-serif;height:20px;padding:2px 8px}.semi-tag-default:focus-visible,.semi-tag-small:focus-visible{outline:2px solid var(--semi-color-primary-light-active)}.semi-tag-square{border-radius:var(--semi-border-radius-small)}.semi-tag-circle{border-radius:var(--semi-border-radius-full)}.semi-tag-large{font-size:12px;line-height:16px;font-family:Inter,-apple-system,BlinkMacSystemFont,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Segoe UI,Helvetica Neue,Helvetica,Arial,sans-serif;padding:4px 8px;height:24px}.semi-tag-large:focus-visible{outline:2px solid var(--semi-color-primary-light-active)}.semi-tag-invisible{display:none}.semi-tag-prefix-icon{display:flex;padding-right:4px}.semi-tag-suffix-icon{display:flex;padding-left:4px}.semi-tag-content{flex:1}.semi-tag-content-ellipsis{overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.semi-tag-content-center{display:flex;justify-content:center;align-items:center;height:100%;min-width:0}.semi-tag-close{display:flex;justify-content:center;align-items:center;color:var(--semi-color-text-2);padding-left:4px;cursor:pointer}.semi-tag-close:hover{color:var(--semi-color-text-1)}.semi-tag-close:active{color:var(--semi-color-text-0)}.semi-tag-closable{padding:4px 4px 4px 8px}.semi-tag-avatar-square .semi-avatar,.semi-tag-avatar-circle .semi-avatar{margin-right:4px}.semi-tag-avatar-square{padding:0 4px 0 0}.semi-tag-avatar-square .semi-avatar>img{background-color:var(--semi-color-default)}.semi-tag-avatar-circle{padding:2px 4px 2px 2px}.semi-tag-avatar-square.semi-tag-default .semi-avatar,.semi-tag-avatar-square.semi-tag-small .semi-avatar{width:20px;height:20px}.semi-tag-avatar-square.semi-tag-large .semi-avatar{width:24px;height:24px}.semi-tag-avatar-circle.semi-tag-small,.semi-tag-avatar-circle.semi-tag-default{border-radius:11px}.semi-tag-avatar-circle.semi-tag-small .semi-avatar,.semi-tag-avatar-circle.semi-tag-default .semi-avatar{width:16px;height:16px}.semi-tag-avatar-circle.semi-tag-large{border-radius:13px}.semi-tag-avatar-circle.semi-tag-large .semi-avatar{width:20px;height:20px}.semi-tag-colorful{font-weight:600}.semi-tag-colorful.semi-tag-solid{background:var(--semi-color-ai-purple);color:var(--semi-color-white)}.semi-tag-colorful.semi-tag-solid.semi-tag-gradient{background:var(--semi-color-ai-general)}.semi-tag-colorful.semi-tag-light{background:rgba(var(--semi-ai-purple-0),1);color:var(--semi-color-ai-purple)}.semi-tag-colorful.semi-tag-light.semi-tag-gradient{background:var(--semi-ai-general-0)}.semi-tag-colorful.semi-tag-light.semi-tag-gradient .semi-tag-prefix-icon svg stop:nth-child(1){stop-color:rgba(var(--semi-ai-general-5-0),1)}.semi-tag-colorful.semi-tag-light.semi-tag-gradient .semi-tag-prefix-icon svg stop:nth-child(2){stop-color:rgba(var(--semi-ai-general-5-1),1)}.semi-tag-colorful.semi-tag-light.semi-tag-gradient .semi-tag-prefix-icon svg stop:nth-child(3){stop-color:rgba(var(--semi-ai-general-5-2),1)}.semi-tag-colorful.semi-tag-light.semi-tag-gradient .semi-tag-prefix-icon svg stop:nth-child(4){stop-color:rgba(var(--semi-ai-general-5-3),1)}.semi-tag-colorful.semi-tag-light.semi-tag-gradient .semi-tag-content{background:var(--semi-color-ai-general);-webkit-background-clip:text;background-clip:text;color:transparent}.semi-tag-colorful.semi-tag-ghost{background:var(--semi-color-white);color:var(--semi-color-ai-purple);border-color:var(--semi-color-ai-general)}.semi-tag-colorful.semi-tag-ghost.semi-tag-gradient{border:none}.semi-tag-colorful.semi-tag-ghost.semi-tag-gradient .semi-tag-prefix-icon svg stop:nth-child(1){stop-color:rgba(var(--semi-ai-general-5-0),1)}.semi-tag-colorful.semi-tag-ghost.semi-tag-gradient .semi-tag-prefix-icon svg stop:nth-child(2){stop-color:rgba(var(--semi-ai-general-5-1),1)}.semi-tag-colorful.semi-tag-ghost.semi-tag-gradient .semi-tag-prefix-icon svg stop:nth-child(3){stop-color:rgba(var(--semi-ai-general-5-2),1)}.semi-tag-colorful.semi-tag-ghost.semi-tag-gradient .semi-tag-prefix-icon svg stop:nth-child(4){stop-color:rgba(var(--semi-ai-general-5-3),1)}.semi-tag-colorful.semi-tag-ghost.semi-tag-gradient.semi-tag-circle:before{border-radius:var(--semi-border-radius-full)}.semi-tag-colorful.semi-tag-ghost.semi-tag-gradient:before{content:"";position:absolute;top:0;right:0;bottom:0;left:0;border-radius:var(--semi-border-radius-small);padding:1px;background:var(--semi-color-ai-general);-webkit-mask:linear-gradient(var(--semi-color-white) 0 0) content-box,linear-gradient(var(--semi-color-white) 0 0);mask:linear-gradient(var(--semi-color-white) 0 0) content-box,linear-gradient(var(--semi-color-white) 0 0);-webkit-mask-composite:xor;mask-composite:exclude;pointer-events:none}.semi-tag-colorful.semi-tag-ghost.semi-tag-gradient .semi-tag-content{background:var(--semi-color-ai-general);-webkit-background-clip:text;background-clip:text;color:transparent}.semi-tag-group{display:block;height:auto}.semi-tag-group .semi-tag{margin-bottom:0;margin-right:8px}.semi-tag-group-max.semi-tag-group-small{height:22px}.semi-tag-group-max.semi-tag-group-large{height:26px}.semi-tag-rest-group-popover .semi-tag{margin-right:8px;margin-bottom:0}.semi-tag-rest-group-popover .semi-tag:last-of-type{margin-right:0}.semi-tag-amber-ghost{background-color:transparent;border:1px solid rgba(var(--semi-amber-4),1);color:rgba(var(--semi-amber-5),1)}.semi-tag-amber-solid{background-color:rgba(var(--semi-amber-5),1);color:rgba(var(--semi-white),1)}.semi-tag-amber-light{background-color:rgba(var(--semi-amber-5),.15);color:rgba(var(--semi-amber-8),1)}.semi-tag-blue-ghost{background-color:transparent;border:1px solid rgba(var(--semi-blue-4),1);color:rgba(var(--semi-blue-5),1)}.semi-tag-blue-solid{background-color:rgba(var(--semi-blue-5),1);color:rgba(var(--semi-white),1)}.semi-tag-blue-light{background-color:rgba(var(--semi-blue-5),.15);color:rgba(var(--semi-blue-8),1)}.semi-tag-cyan-ghost{background-color:transparent;border:1px solid rgba(var(--semi-cyan-4),1);color:rgba(var(--semi-cyan-5),1)}.semi-tag-cyan-solid{background-color:rgba(var(--semi-cyan-5),1);color:rgba(var(--semi-white),1)}.semi-tag-cyan-light{background-color:rgba(var(--semi-cyan-5),.15);color:rgba(var(--semi-cyan-8),1)}.semi-tag-green-ghost{background-color:transparent;border:1px solid rgba(var(--semi-green-4),1);color:rgba(var(--semi-green-5),1)}.semi-tag-green-solid{background-color:rgba(var(--semi-green-5),1);color:rgba(var(--semi-white),1)}.semi-tag-green-light{background-color:rgba(var(--semi-green-5),.15);color:rgba(var(--semi-green-8),1)}.semi-tag-grey-ghost{background-color:transparent;border:1px solid rgba(var(--semi-grey-4),1);color:rgba(var(--semi-grey-5),1)}.semi-tag-grey-solid{background-color:rgba(var(--semi-grey-5),1);color:rgba(var(--semi-white),1)}.semi-tag-grey-light{background-color:rgba(var(--semi-grey-5),.15);color:rgba(var(--semi-grey-8),1)}.semi-tag-indigo-ghost{background-color:transparent;border:1px solid rgba(var(--semi-indigo-4),1);color:rgba(var(--semi-indigo-5),1)}.semi-tag-indigo-solid{background-color:rgba(var(--semi-indigo-5),1);color:rgba(var(--semi-white),1)}.semi-tag-indigo-light{background-color:rgba(var(--semi-indigo-5),.15);color:rgba(var(--semi-indigo-8),1)}.semi-tag-light-blue-ghost{background-color:transparent;border:1px solid rgba(var(--semi-light-blue-4),1);color:rgba(var(--semi-light-blue-5),1)}.semi-tag-light-blue-solid{background-color:rgba(var(--semi-light-blue-5),1);color:rgba(var(--semi-white),1)}.semi-tag-light-blue-light{background-color:rgba(var(--semi-light-blue-5),.15);color:rgba(var(--semi-light-blue-8),1)}.semi-tag-light-green-ghost{background-color:transparent;border:1px solid rgba(var(--semi-light-green-4),1);color:rgba(var(--semi-light-green-5),1)}.semi-tag-light-green-solid{background-color:rgba(var(--semi-light-green-5),1);color:rgba(var(--semi-white),1)}.semi-tag-light-green-light{background-color:rgba(var(--semi-light-green-5),.15);color:rgba(var(--semi-light-green-8),1)}.semi-tag-lime-ghost{background-color:transparent;border:1px solid rgba(var(--semi-lime-4),1);color:rgba(var(--semi-lime-5),1)}.semi-tag-lime-solid{background-color:rgba(var(--semi-lime-5),1);color:rgba(var(--semi-white),1)}.semi-tag-lime-light{background-color:rgba(var(--semi-lime-5),.15);color:rgba(var(--semi-lime-8),1)}.semi-tag-orange-ghost{background-color:transparent;border:1px solid rgba(var(--semi-orange-4),1);color:rgba(var(--semi-orange-5),1)}.semi-tag-orange-solid{background-color:rgba(var(--semi-orange-5),1);color:rgba(var(--semi-white),1)}.semi-tag-orange-light{background-color:rgba(var(--semi-orange-5),.15);color:rgba(var(--semi-orange-8),1)}.semi-tag-pink-ghost{background-color:transparent;border:1px solid rgba(var(--semi-pink-4),1);color:rgba(var(--semi-pink-5),1)}.semi-tag-pink-solid{background-color:rgba(var(--semi-pink-5),1);color:rgba(var(--semi-white),1)}.semi-tag-pink-light{background-color:rgba(var(--semi-pink-5),.15);color:rgba(var(--semi-pink-8),1)}.semi-tag-purple-ghost{background-color:transparent;border:1px solid rgba(var(--semi-purple-4),1);color:rgba(var(--semi-purple-5),1)}.semi-tag-purple-solid{background-color:rgba(var(--semi-purple-5),1);color:rgba(var(--semi-white),1)}.semi-tag-purple-light{background-color:rgba(var(--semi-purple-5),.15);color:rgba(var(--semi-purple-8),1)}.semi-tag-red-ghost{background-color:transparent;border:1px solid rgba(var(--semi-red-4),1);color:rgba(var(--semi-red-5),1)}.semi-tag-red-solid{background-color:rgba(var(--semi-red-5),1);color:rgba(var(--semi-white),1)}.semi-tag-red-light{background-color:rgba(var(--semi-red-5),.15);color:rgba(var(--semi-red-8),1)}.semi-tag-teal-ghost{background-color:transparent;border:1px solid rgba(var(--semi-teal-4),1);color:rgba(var(--semi-teal-5),1)}.semi-tag-teal-solid{background-color:rgba(var(--semi-teal-5),1);color:rgba(var(--semi-white),1)}.semi-tag-teal-light{background-color:rgba(var(--semi-teal-5),.15);color:rgba(var(--semi-teal-8),1)}.semi-tag-violet-ghost{background-color:transparent;border:1px solid rgba(var(--semi-violet-4),1);color:rgba(var(--semi-violet-5),1)}.semi-tag-violet-solid{background-color:rgba(var(--semi-violet-5),1);color:rgba(var(--semi-white),1)}.semi-tag-violet-light{background-color:rgba(var(--semi-violet-5),.15);color:rgba(var(--semi-violet-8),1)}.semi-tag-yellow-ghost{background-color:transparent;border:1px solid rgba(var(--semi-yellow-4),1);color:rgba(var(--semi-yellow-5),1)}.semi-tag-yellow-solid{background-color:rgba(var(--semi-yellow-5),1);color:rgba(var(--semi-white),1)}.semi-tag-yellow-light{background-color:rgba(var(--semi-yellow-5),.15);color:rgba(var(--semi-yellow-8),1)}.semi-tag-white-ghost,.semi-tag-white-solid,.semi-tag-white-light{background-color:var(--semi-color-bg-4);border:1px solid rgba(var(--semi-grey-2),.7);color:var(--semi-color-text-0)}.semi-tag-white-ghost .semi-tag-close,.semi-tag-white-light .semi-tag-close,.semi-tag-white-solid .semi-tag-close{color:var(--semi-color-text-2)}.semi-tag-avatar-square,.semi-tag-avatar-circle{background-color:var(--semi-color-bg-4);border:1px solid var(--semi-color-border);color:var(--semi-color-text-0)}.semi-tag-split{display:inline-flex;align-items:center}.semi-tag-split .semi-tag{border-radius:0;margin-right:1px}.semi-tag-split .semi-tag-first{border-top-left-radius:var(--semi-border-radius-small);border-bottom-left-radius:var(--semi-border-radius-small)}.semi-tag-split .semi-tag-last{border-top-right-radius:var(--semi-border-radius-small);border-bottom-right-radius:var(--semi-border-radius-small);margin-right:unset}.semi-tag-split .semi-tag-circle.semi-tag-first{border-top-left-radius:var(--semi-border-radius-full);border-bottom-left-radius:var(--semi-border-radius-full)}.semi-tag-split .semi-tag-circle.semi-tag-last{border-top-right-radius:var(--semi-border-radius-full);border-bottom-right-radius:var(--semi-border-radius-full)}.semi-rtl .semi-tag,.semi-portal-rtl .semi-tag{direction:rtl}.semi-rtl .semi-tag-close,.semi-portal-rtl .semi-tag-close{padding-left:auto;padding-right:4px}.semi-rtl .semi-tag-closable,.semi-portal-rtl .semi-tag-closable{padding:4px 8px 4px 4px}.semi-rtl .semi-tag-avatar-square .semi-avatar,.semi-rtl .semi-tag-avatar-circle .semi-avatar,.semi-portal-rtl .semi-tag-avatar-square .semi-avatar,.semi-portal-rtl .semi-tag-avatar-circle .semi-avatar{margin-right:auto;margin-left:4px}.semi-rtl .semi-tag-avatar-square,.semi-portal-rtl .semi-tag-avatar-square{padding-right:auto;padding-left:4px}.semi-rtl .semi-tag-avatar-circle,.semi-portal-rtl .semi-tag-avatar-circle{padding:2px 2px 2px 4px}.semi-rtl .semi-tag-group,.semi-portal-rtl .semi-tag-group{direction:rtl}.semi-rtl .semi-tag-group .semi-tag,.semi-portal-rtl .semi-tag-group .semi-tag{margin-right:auto;margin-left:8px}.semi-rtl .semi-tag-rest-group-popover,.semi-portal-rtl .semi-tag-rest-group-popover{direction:rtl}.semi-rtl .semi-tag-rest-group-popover .semi-tag,.semi-portal-rtl .semi-tag-rest-group-popover .semi-tag{margin-right:0;margin-left:8px}.semi-rtl .semi-tag-rest-group-popover .semi-tag:last-of-type,.semi-portal-rtl .semi-tag-rest-group-popover .semi-tag:last-of-type{margin-right:auto;margin-left:0}.semi-empty{display:flex}.semi-empty-image{display:flex;justify-content:center;-webkit-user-select:none;user-select:none;-webkit-user-drag:none;pointer-events:none}.semi-empty-vertical{align-items:center;flex-direction:column}.semi-empty-vertical .semi-empty-content{margin-top:24px}.semi-empty-vertical .semi-empty-title,.semi-empty-vertical .semi-empty-description{text-align:center}.semi-empty-horizontal .semi-empty-content{margin-left:32px}.semi-empty-title.semi-typography{display:block;font-weight:600}.semi-empty-title+.semi-empty-description{margin-top:16px}.semi-empty-description{color:var(--semi-color-text-1)}.semi-empty-footer{margin-top:24px}.semi-rtl .semi-empty,.semi-portal-rtl .semi-empty{direction:rtl}.semi-rtl .semi-empty-horizontal .semi-empty-content,.semi-portal-rtl .semi-empty-horizontal .semi-empty-content{margin-left:auto;margin-right:32px}.semi-modal{font-size:14px;line-height:20px;font-family:Inter,-apple-system,BlinkMacSystemFont,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Segoe UI,Helvetica Neue,Helvetica,Arial,sans-serif;position:relative;margin:80px auto;color:var(--semi-color-text-0)}.semi-modal-mask{position:fixed;top:0;right:0;left:0;bottom:0;background-color:var(--semi-color-overlay-bg);-webkit-backdrop-filter:none;backdrop-filter:none;height:100%;z-index:1000}.semi-modal-mask-hidden{display:none}.semi-modal-icon-wrapper{display:inline-flex;margin-right:12px;width:24px}.semi-modal-wrap{position:fixed;overflow:auto;top:0;right:0;bottom:0;left:0;z-index:1000;-webkit-overflow-scrolling:touch;outline:0}.semi-modal-wrap-center{display:flex;align-items:flex-start}.semi-modal-title{display:inline-flex;align-items:flex-start;justify-content:flex-start;width:100%;margin:0}.semi-modal-content{position:relative;display:flex;height:max-content;width:100%;box-sizing:border-box;flex-direction:column;background-color:var(--semi-color-bg-2);-webkit-backdrop-filter:none;backdrop-filter:none;border:1px solid var(--semi-color-border);border-radius:var(--semi-border-radius-large);padding:0 24px;background-clip:padding-box;overflow:hidden;box-shadow:var(--semi-shadow-elevated)}.semi-modal-footerfill{display:flex}.semi-modal-content-height-set{height:100%}.semi-modal-content-fullScreen{border-radius:0;border:none;height:100%;top:0}.semi-modal-header{display:flex;align-items:flex-start;margin:24px 0;padding:0;font-size:14px;font-weight:600;background-color:transparent;color:var(--semi-color-text-0);border-bottom:0 solid transparent}.semi-modal-body-wrapper{display:flex;align-items:flex-start;margin:24px 0}.semi-modal-body{flex:1 1 auto;margin:0;padding:0}.semi-modal-withIcon{margin-left:36px}.semi-modal-footer{margin:24px 0;padding:0;text-align:right;border-radius:0 0 5px 5px;border-top:0 solid transparent;background-color:transparent}.semi-modal-footer .semi-button{margin-left:12px;margin-right:0}.semi-modal-confirm .semi-modal-header{margin-bottom:8px}.semi-modal-confirm-icon-wrapper{display:inline-flex;margin-right:12px;width:24px}.semi-modal-confirm-icon{display:inline-flex;color:var(--semi-color-primary)}.semi-modal-info-icon{color:var(--semi-color-info)}.semi-modal-success-icon{color:var(--semi-color-success)}.semi-modal-error-icon{color:var(--semi-color-danger)}.semi-modal-warning-icon{color:var(--semi-color-warning)}.semi-modal-small{width:448px}.semi-modal-medium{width:684px}.semi-modal-large{width:920px}.semi-modal-full-width{width:calc(100vw - 64px)}.semi-modal-centered{margin:auto}.semi-modal-popup .semi-modal-mask,.semi-modal-popup .semi-modal-wrap{position:absolute;overflow:hidden}.semi-modal-fixed .semi-modal-mask,.semi-modal-fixed .semi-modal-wrap{position:fixed;overflow:hidden}.semi-modal-displayNone{display:none}.semi-modal-content-animate-show{animation:.12s semi-modal-content-keyframe-show cubic-bezier(.215,.61,.355,1) 0ms forwards;animation-fill-mode:forwards}.semi-modal-content-animate-hide{animation:.12s semi-modal-content-keyframe-hide cubic-bezier(.215,.61,.355,1) 0ms forwards;animation-fill-mode:forwards}.semi-modal-mask-animate-show{animation:90ms semi-modal-mask-keyframe-show cubic-bezier(.215,.61,.355,1) 0ms forwards;animation-fill-mode:forwards}.semi-modal-mask-animate-hide{animation:90ms semi-modal-mask-keyframe-hide cubic-bezier(.215,.61,.355,1) 0ms forwards;animation-fill-mode:forwards}@keyframes semi-modal-content-keyframe-show{0%{opacity:0;transform:scale(.7)}to{opacity:1;transform:scale(1)}}@keyframes semi-modal-content-keyframe-hide{0%{opacity:1;transform:scale(1)}to{opacity:0;transform:scale(.7)}}@keyframes semi-modal-mask-keyframe-show{0%{opacity:0}to{opacity:1}}@keyframes semi-modal-mask-keyframe-hide{0%{opacity:1}to{opacity:0}}.semi-modal-rtl{direction:rtl}.semi-modal-rtl .semi-modal-icon-wrapper,.semi-modal-confirm-rtl .semi-modal-icon-wrapper{margin-right:0;margin-left:12px}.semi-modal-rtl .semi-modal-withIcon,.semi-modal-confirm-rtl .semi-modal-withIcon{margin-left:0;margin-right:36px}.semi-modal-rtl .semi-modal-footer,.semi-modal-confirm-rtl .semi-modal-footer{text-align:left}.semi-modal-rtl .semi-modal-footer .semi-button,.semi-modal-confirm-rtl .semi-modal-footer .semi-button{margin-left:0;margin-right:12px}.semi-modal-confirm-rtl{direction:rtl}.semi-modal-confirm .semi-modal-confirm-rtl .semi-button{margin-left:0;margin-right:12px}.semi-dropdown{font-size:14px;line-height:20px;font-family:Inter,-apple-system,BlinkMacSystemFont,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Segoe UI,Helvetica Neue,Helvetica,Arial,sans-serif}.semi-dropdown-wrapper{overflow-y:auto;box-shadow:var(--semi-shadow-elevated);position:relative;z-index:1050;border-radius:var(--semi-border-radius-medium);background:var(--semi-color-bg-3);-webkit-backdrop-filter:none;backdrop-filter:none;opacity:0}.semi-dropdown-wrapper-show{opacity:1}.semi-dropdown-trigger{display:inline-block}.semi-dropdown-menu{list-style:none;padding:4px 0;margin:0}.semi-dropdown-title{color:var(--semi-color-text-2);padding:8px 16px 4px;font-size:12px;line-height:16px;font-family:Inter,-apple-system,BlinkMacSystemFont,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Segoe UI,Helvetica Neue,Helvetica,Arial,sans-serif;cursor:default}.semi-dropdown-title-withTick{padding-left:31px}.semi-dropdown-item{padding:8px 16px;color:var(--semi-color-text-0);max-width:280px;display:flex;align-items:center;transition:background-color var(--semi-transition_duration-none) var(--semi-transition_function-easeOut) 0ms;border-radius:0}.semi-dropdown-item-hover{background-color:var(--semi-color-fill-0)}.semi-dropdown-item:not(.semi-dropdown-item-active):hover{background-color:var(--semi-color-fill-0);cursor:pointer}.semi-dropdown-item:not(.semi-dropdown-item-active):active{background-color:var(--semi-color-fill-1)}.semi-dropdown-item:focus-visible{background-color:var(--semi-color-fill-0);outline:0}.semi-dropdown-item-icon{display:inline-flex;align-items:center;margin-right:8px}.semi-dropdown-item-danger{color:var(--semi-color-danger)}.semi-dropdown-item-secondary{color:var(--semi-color-secondary)}.semi-dropdown-item-warning{color:var(--semi-color-warning)}.semi-dropdown-item-tertiary{color:var(--semi-color-tertiary)}.semi-dropdown-item-primary{color:var(--semi-color-primary)}.semi-dropdown-item-withTick{padding-left:12px}.semi-dropdown-item>.semi-icon{flex-shrink:0;margin-right:9px;font-size:12px}.semi-dropdown-item-active{font-weight:600}.semi-dropdown-item.semi-dropdown-item-disabled{color:var(--semi-color-disabled-text);cursor:not-allowed}.semi-dropdown-item.semi-dropdown-item-disabled:hover,.semi-dropdown-item.semi-dropdown-item-disabled:active{cursor:not-allowed;background-color:transparent}.semi-dropdown-divider{display:block;height:1px;width:100%;min-width:100%;clear:both;background:var(--semi-color-border);margin:4px 0}.semi-rtl .semi-dropdown-wrapper,.semi-portal-rtl .semi-dropdown-wrapper{direction:rtl}.semi-rtl .semi-dropdown-title-withTick,.semi-portal-rtl .semi-dropdown-title-withTick{padding-left:0;padding-right:31px}.semi-rtl .semi-dropdown-item-withTick,.semi-portal-rtl .semi-dropdown-item-withTick{padding-left:auto;padding-right:12px}.semi-rtl .semi-dropdown-item>.semi-icon,.semi-portal-rtl .semi-dropdown-item>.semi-icon{margin-right:0;margin-left:9px}.semi-input-number{display:inline-flex;align-items:center;box-sizing:border-box;transition:background-color var(--semi-transition_duration-none) var(--semi-transition_function-easeIn) var(--semi-transition_delay-none),border var(--semi-transition_duration-none) var(--semi-transition_function-easeIn) var(--semi-transition_delay-none);transform:scale(var(--semi-transform_scale-none))}.semi-input-number-suffix-btns{display:inline-flex;flex-direction:column;margin-left:4px;border:1px solid var(--semi-color-border);border-radius:var(--semi-border-radius-small);background-color:var(--semi-color-bg-2);box-sizing:border-box}.semi-input-number-suffix-btns>.semi-input-number-button{height:50%;width:14px;padding:0;margin:0;display:inline-flex;align-items:center;justify-content:center;-webkit-user-select:none;user-select:none;border-radius:0;color:var(--semi-color-text-2)}.semi-input-number-suffix-btns>.semi-input-number-button-up:not(.semi-input-number-button-up-not-allowed):hover,.semi-input-number-suffix-btns>.semi-input-number-button-down:not(.semi-input-number-button-down-not-allowed):hover{cursor:pointer;background-color:var(--semi-color-fill-0)}.semi-input-number-suffix-btns>.semi-input-number-button-up:not(.semi-input-number-button-up-not-allowed):active,.semi-input-number-suffix-btns>.semi-input-number-button-down:not(.semi-input-number-button-down-not-allowed):active{cursor:pointer;background-color:var(--semi-color-fill-1)}.semi-input-number-suffix-btns>.semi-input-number-button-up.semi-input-number-button-up-disabled,.semi-input-number-suffix-btns>.semi-input-number-button-down.semi-input-number-button-down-disabled{background-color:var(--semi-color-disabled-fill);color:var(--semi-color-disabled-text)}.semi-input-number-suffix-btns>.semi-input-number-button-up.semi-input-number-button-up-not-allowed,.semi-input-number-suffix-btns>.semi-input-number-button-down.semi-input-number-button-down-not-allowed{cursor:not-allowed}.semi-input-number-suffix-btns-inner-hover{border-color:var(--semi-color-fill-2)}.semi-input-number-suffix-btns-inner{margin-left:8px;border-radius:var(--semi-border-radius-small);overflow:hidden}.semi-input-number .semi-input-clearbtn+.semi-input-suffix{margin-left:-4px}.semi-input-number .semi-input-clearbtn+.semi-input-suffix .semi-input-number-suffix-btns-inner{margin-left:0}.semi-input-number-size-default .semi-input-number-suffix-btns{height:32px}.semi-input-number-size-default .semi-input-number-suffix-btns-inner{height:30px}.semi-input-number-size-large .semi-input-number-suffix-btns{height:40px}.semi-input-number-size-large .semi-input-number-suffix-btns-inner{height:38px}.semi-input-number-size-small .semi-input-number-suffix-btns{height:24px}.semi-input-number-size-small .semi-input-number-suffix-btns-inner{height:22px}.semi-input-number:not(:focus-within):not(:hover) .semi-input-borderless+.semi-input-number-suffix-btns{opacity:0}.semi-rtl .semi-input-number,.semi-portal-rtl .semi-input-number{direction:rtl}.semi-rtl .semi-input-number-suffix-btns,.semi-portal-rtl .semi-input-number-suffix-btns{margin-left:auto;margin-right:4px}.semi-rtl .semi-input-number-suffix-btns-inner,.semi-portal-rtl .semi-input-number-suffix-btns-inner{margin-left:auto;margin-right:8px}.semi-rtl .semi-input-number .semi-input-clearbtn+.semi-input-suffix,.semi-portal-rtl .semi-input-number .semi-input-clearbtn+.semi-input-suffix{margin-left:auto;margin-right:-4px}.semi-rtl .semi-input-number .semi-input-clearbtn+.semi-input-suffix .semi-input-number-suffix-btns-inner,.semi-portal-rtl .semi-input-number .semi-input-clearbtn+.semi-input-suffix .semi-input-number-suffix-btns-inner{margin-left:auto;margin-right:0}.semi-radio{box-sizing:border-box;font-size:14px;line-height:20px;font-family:Inter,-apple-system,BlinkMacSystemFont,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Segoe UI,Helvetica Neue,Helvetica,Arial,sans-serif;position:relative;display:inline-flex;column-gap:8px;transition:background-color var(--semi-transition_duration-none) var(--semi-transition_function-easeIn) var(--semi-transition_delay-none),border var(--semi-transition_duration-none) var(--semi-transition_function-easeIn) var(--semi-transition_delay-none);min-height:20px;min-width:16px;cursor:pointer;vertical-align:bottom;text-align:left}.semi-radio.semi-radio-vertical{display:block}.semi-radio input[type=checkbox],.semi-radio input[type=radio]{position:absolute;left:0;top:0;opacity:0;width:100%;height:100%;margin:0;cursor:pointer}.semi-radio:hover .semi-radio-inner-display{background:var(--semi-color-fill-0);border:solid 1px var(--semi-color-focus-border)}.semi-radio:hover.semi-radio-cardRadioGroup .semi-radio-inner-display{background:var(--semi-color-white)}.semi-radio:hover .semi-radio-inner-checked .semi-radio-inner-display{background:var(--semi-color-primary-hover);border-color:var(--semi-color-primary-hover)}.semi-radio:active.semi-radio-cardRadioGroup .semi-radio-inner-display{background:var(--semi-color-white)}.semi-radio:active .semi-radio-inner-checked .semi-radio-inner-display{background:var(--semi-color-primary-active);border-color:var(--semi-color-primary-active)}.semi-radio-buttonRadioComponent{padding:4px;background:var(--semi-color-fill-0);border-radius:var(--semi-border-radius-small)}.semi-radio-buttonRadioGroup{position:relative;padding:4px;border-radius:var(--semi-border-radius-small);line-height:16px}.semi-radio-buttonRadioGroup:not(:last-child){padding-right:0}.semi-radio-buttonRadioGroup-small{padding:2px 4px;line-height:16px}.semi-radio-buttonRadioGroup-large{padding:4px;line-height:20px}.semi-radio-cardRadioGroup{flex-wrap:nowrap;border-radius:var(--semi-border-radius-small);padding:12px 16px;background:transparent;border:1px solid transparent;transition:background-color var(--semi-transition_duration-none) var(--semi-transition_function-easeIn) var(--semi-transition_delay-none),border var(--semi-transition_duration-none) var(--semi-transition_function-easeIn) var(--semi-transition_delay-none)}.semi-radio-cardRadioGroup .semi-radio-inner{flex-shrink:0}.semi-radio-cardRadioGroup .semi-radio-inner-display{background:var(--semi-color-white)}.semi-radio-cardRadioGroup .semi-radio-addon{font-weight:600;font-size:14px;line-height:20px;color:var(--semi-color-text-0)}.semi-radio-cardRadioGroup .semi-radio-extra{font-weight:400;font-size:14px;line-height:20px;color:var(--semi-color-text-2);padding-left:0}.semi-radio-cardRadioGroup:active{background:var(--semi-color-fill-1)}.semi-radio-cardRadioGroup_checked{background:var(--semi-color-primary-light-default);border:1px solid var(--semi-color-primary)}.semi-radio-cardRadioGroup_checked:hover{border:1px solid var(--semi-color-primary-hover)}.semi-radio-cardRadioGroup_checked:hover .semi-radio-inner-checked .semi-radio-inner-display{border-color:var(--semi-color-primary-hover)}.semi-radio-cardRadioGroup_checked:active{background:var(--semi-color-primary-light-default);border:1px solid var(--semi-color-primary-active)}.semi-radio-cardRadioGroup_checked:active .semi-radio-inner-checked .semi-radio-inner-display{border-color:var(--semi-color-primary-active)}.semi-radio-cardRadioGroup_checked:active .semi-radio-inner-checked:hover .semi-radio-inner-display{background:var(--semi-color-primary-active)}.semi-radio-cardRadioGroup_hover{background:var(--semi-color-fill-0)}.semi-radio-cardRadioGroup_disabled:active{background:transparent}.semi-radio-cardRadioGroup_checked_disabled.semi-radio-cardRadioGroup{background:var(--semi-color-primary-light-default);border:1px solid var(--semi-color-primary-disabled)}.semi-radio-cardRadioGroup_checked_disabled.semi-radio-cardRadioGroup .semi-radio-inner-checked .semi-radio-inner-display,.semi-radio-cardRadioGroup_checked_disabled.semi-radio-cardRadioGroup:hover .semi-radio-inner-checked .semi-radio-inner-display{border-color:var(--semi-color-primary-disabled)}.semi-radio.semi-radio-disabled:hover .semi-radio-inner-display,.semi-radio.semi-radio-disabled:active .semi-radio-inner-display{background:var(--semi-color-disabled-fill);border:solid 1px var(--semi-color-border)}.semi-radio.semi-radio-disabled:hover .semi-radio-inner-checked .semi-radio-inner-display,.semi-radio.semi-radio-disabled:active .semi-radio-inner-checked .semi-radio-inner-display{color:rgba(var(--semi-white),1);background:var(--semi-color-primary-disabled);border-color:var(--semi-color-primary-disabled)}.semi-radio-inner{display:inline-flex;margin-top:2px;position:relative;width:16px;height:16px;vertical-align:sub;-webkit-user-select:none;user-select:none}.semi-radio-inner-display{display:inline-flex;align-items:center;justify-content:center;box-sizing:border-box;width:16px;height:16px;border:solid 1px var(--semi-color-text-3);border-radius:16px;background:transparent;transition:background-color var(--semi-transition_duration-none) var(--semi-transition_function-easeIn) var(--semi-transition_delay-none),border var(--semi-transition_duration-none) var(--semi-transition_function-easeIn) var(--semi-transition_delay-none)}.semi-radio-inner-display .semi-icon{width:100%;height:100%;font-size:14px}.semi-radio-content{display:flex;flex-direction:column;row-gap:4px}.semi-radio:hover .semi-radio-inner-display{background:var(--semi-color-fill-0)}.semi-radio:active .semi-radio-inner-display{background:var(--semi-color-fill-1)}.semi-radio-addon{-webkit-user-select:none;user-select:none;color:var(--semi-color-text-0);display:inline-flex;align-items:center}.semi-radio-addon-buttonRadio{text-align:center;border-radius:var(--semi-border-radius-small);font-weight:600;color:var(--semi-color-text-1);font-size:12px;padding:4px 16px;transition:background-color var(--semi-transition_duration-none) var(--semi-transition_function-easeIn) var(--semi-transition_delay-none),border var(--semi-transition_duration-none) var(--semi-transition_function-easeIn) var(--semi-transition_delay-none)}.semi-radio-addon-buttonRadio-hover{font-weight:600;background:var(--semi-color-fill-1)}.semi-radio-addon-buttonRadio-checked{font-weight:600;background:var(--semi-color-bg-3);color:var(--semi-color-primary)}.semi-radio-addon-buttonRadio-disabled{cursor:not-allowed;color:var(--semi-color-disabled-text)}.semi-radio-addon-buttonRadio-small{font-size:12px;padding:2px 16px}.semi-radio-addon-buttonRadio-large{font-size:14px;padding:6px 24px}.semi-radio .semi-radio-inner-checked:hover .semi-radio-inner-display{background:var(--semi-color-primary-hover)}.semi-radio .semi-radio-inner-checked:active .semi-radio-inner-display{background:var(--semi-color-primary-active)}.semi-radio .semi-radio-inner-checked .semi-radio-inner-display{border:solid 1px var(--semi-color-primary);background:var(--semi-color-primary);color:rgba(var(--semi-white),1);border-radius:16px}.semi-radio .semi-radio-inner-checked>.semi-radio-addon{color:var(--semi-color-text-0)}.semi-radio .semi-radio-inner-buttonRadio,.semi-radio .semi-radio-inner-pureCardRadio{position:absolute;top:0;left:0;width:100%;height:100%;margin-top:0;z-index:-1;opacity:0}.semi-radio-disabled,.semi-radio-disabled:hover,.semi-radio-disabled .semi-radio-inner{cursor:not-allowed}.semi-radio-disabled .semi-radio-inner-display{opacity:.75;background:var(--semi-color-disabled-fill);border-color:var(--semi-color-border)}.semi-radio-disabled .semi-radio-inner-display:hover{background:transparent}.semi-radio-disabled .semi-radio-inner-checked .semi-radio-inner-display,.semi-radio-disabled .semi-radio-inner-checked .semi-radio-inner-display:hover{color:rgba(var(--semi-white),1);background:var(--semi-color-primary-disabled);border-color:var(--semi-color-primary-disabled)}.semi-radio-disabled .semi-radio-addon,.semi-radio-disabled .semi-radio-extra{color:var(--semi-color-disabled-text)}.semi-radio-extra{color:var(--semi-color-text-2);box-sizing:border-box}.semi-radio-focus{outline:2px solid var(--semi-color-primary-light-active)}.semi-radio-focus-border{border:solid 1px var(--semi-color-focus-border)}.semi-radioGroup{font-size:14px;line-height:20px;font-family:Inter,-apple-system,BlinkMacSystemFont,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Segoe UI,Helvetica Neue,Helvetica,Arial,sans-serif}.semi-radioGroup-vertical{display:flex;flex-direction:column;row-gap:12px}.semi-radioGroup-vertical-default .semi-radio,.semi-radioGroup-vertical-card .semi-radio{display:flex}.semi-radioGroup-horizontal{display:inline-flex;flex-wrap:wrap;vertical-align:bottom;gap:16px}.semi-radioGroup-buttonRadio{display:inline-block;background:var(--semi-color-fill-0);border-radius:var(--semi-border-radius-small);vertical-align:middle}.semi-rtl .semi-radio,.semi-portal-rtl .semi-radio{direction:rtl}.semi-rtl .semi-radio input[type=checkbox],.semi-rtl .semi-radio input[type=radio],.semi-portal-rtl .semi-radio input[type=checkbox],.semi-portal-rtl .semi-radio input[type=radio]{left:auto;right:0}.semi-rtl .semi-radio-buttonRadioGroup:not(:last-child),.semi-portal-rtl .semi-radio-buttonRadioGroup:not(:last-child){padding-left:0}.semi-rtl .semi-radioGroup,.semi-portal-rtl .semi-radioGroup{direction:rtl}.semi-toast{pointer-events:none}.semi-toast-wrapper{position:fixed;height:0;top:0;width:100%;display:flex;justify-content:center;z-index:1010}.semi-toast-wrapper .semi-toast-innerWrapper{width:fit-content;height:fit-content;text-align:center}.semi-toast-wrapper .semi-toast-innerWrapper-hover .semi-toast-zero-height-wrapper{perspective:unset;perspective-origin:center center}.semi-toast-zero-height-wrapper{transition:all .3s cubic-bezier(.22,.57,.02,1.2);perspective-origin:center 280px;perspective:280px;height:0;overflow:visible}.semi-toast-content{pointer-events:all;box-shadow:var(--semi-shadow-elevated);font-size:14px;line-height:20px;font-family:Inter,-apple-system,BlinkMacSystemFont,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Segoe UI,Helvetica Neue,Helvetica,Arial,sans-serif;background-color:var(--semi-color-bg-3);border-radius:var(--semi-border-radius-medium);padding:12px 8px;display:inline-flex;align-items:flex-start;justify-content:center;margin:12px;font-weight:600;color:var(--semi-color-text-0)}.semi-toast-content .semi-toast-close-button{margin-top:-2px;height:20px}.semi-toast-content .semi-toast-content-text{margin-left:12px;margin-right:12px;text-align:left;word-wrap:break-word;overflow-wrap:break-word}.semi-toast-light.semi-toast-warning .semi-toast-content{background-color:var(--semi-color-warning-light-default);border:1px solid var(--semi-color-warning)}.semi-toast-light.semi-toast-warning .semi-toast-icon-warning{color:var(--semi-color-warning)}.semi-toast-light.semi-toast-success .semi-toast-content{background-color:var(--semi-color-success-light-default);border:1px solid var(--semi-color-success)}.semi-toast-light.semi-toast-success .semi-toast-icon-success{color:var(--semi-color-success)}.semi-toast-light.semi-toast-info .semi-toast-content{background-color:var(--semi-color-info-light-default);border:1px solid var(--semi-color-info)}.semi-toast-light.semi-toast-info .semi-toast-icon-info{color:var(--semi-color-info)}.semi-toast-light.semi-toast-error .semi-toast-content{background-color:var(--semi-color-danger-light-default);border:1px solid var(--semi-color-danger)}.semi-toast-light.semi-toast-error .semi-toast-icon-error{color:var(--semi-color-danger)}.semi-toast .semi-toast-icon-warning{color:var(--semi-color-warning)}.semi-toast .semi-toast-icon-success{color:var(--semi-color-success)}.semi-toast .semi-toast-icon-info{color:var(--semi-color-info)}.semi-toast .semi-toast-icon-error{color:var(--semi-color-danger)}.semi-toast-animation-show{animation:.3s semi-toast-keyframe-toast-show cubic-bezier(.22,.57,.02,1.2) 0s;animation-fill-mode:forwards}.semi-toast-animation-hide{animation:.3s semi-toast-keyframe-toast-hide cubic-bezier(.22,.57,.02,1.2) 0s;animation-fill-mode:forwards}@keyframes semi-toast-keyframe-toast-show{0%{opacity:0;transform:translateY(-100%)}to{opacity:1}}@keyframes semi-toast-keyframe-toast-hide{0%{opacity:1}to{opacity:0;transform:translateY(-100%)}}.semi-toast-rtl{direction:rtl}.semi-toast-rtl .semi-toast-content .semi-toast-content-text{text-align:right;margin-left:12px;margin-right:12px}.semi-resizable-resizable{position:relative;box-sizing:border-box;flex-shrink:0}.semi-resizable-resizableHandler{position:absolute;-webkit-user-select:none;user-select:none;z-index:10}.semi-resizable-resizableHandler-top{width:100%;height:10px;left:0;cursor:row-resize;top:-5px}.semi-resizable-resizableHandler-right{width:10px;height:100%;top:0;cursor:col-resize;left:auto;right:-5px}.semi-resizable-resizableHandler-bottom{width:100%;height:10px;left:0;cursor:row-resize;top:auto;bottom:-5px}.semi-resizable-resizableHandler-left{width:10px;height:100%;top:0;cursor:col-resize;left:-5px}.semi-resizable-resizableHandler-topRight{width:20px;height:20px;position:absolute;right:-10px;top:-10px;cursor:ne-resize}.semi-resizable-resizableHandler-bottomRight{width:20px;height:20px;position:absolute;right:-10px;bottom:-10px;cursor:se-resize}.semi-resizable-resizableHandler-bottomLeft{width:20px;height:20px;position:absolute;left:-10px;bottom:-10px;cursor:sw-resize}.semi-resizable-resizableHandler-topLeft{width:20px;height:20px;position:absolute;left:-10px;top:-10px;cursor:nw-resize}.semi-resizable-group{display:flex;position:relative;box-sizing:border-box;height:100%;width:100%}.semi-resizable-item{position:relative;box-sizing:border-box;flex-shrink:0}.semi-resizable-handler{-webkit-user-select:none;user-select:none;z-index:10;display:flex;align-items:center;justify-content:center;background-color:var(--semi-color-fill-0);opacity:1}.semi-resizable-handler-vertical{width:100%;height:10px;flex-shrink:0;cursor:row-resize}.semi-resizable-handler-horizontal{height:100%;width:10px;flex-shrink:0;cursor:col-resize}.semi-resizable-background{height:100%;width:100%;top:0;right:0;bottom:0;left:0;z-index:20;opacity:0;position:fixed}.ga-log-tail{position:relative;height:100%;min-height:0}.ga-log-tail-copy{position:absolute;top:6px;right:8px;z-index:2;padding:2px 5px;border:none;border-radius:4px;background:var(--semi-color-fill-0, rgba(0, 0, 0, .04));color:var(--ui-text-tertiary);font-size:.75rem;cursor:pointer;opacity:.05;transition:opacity .15s}.ga-log-tail:hover .ga-log-tail-copy,.ga-log-tail-copy:focus-visible{opacity:1}.ga-log-tail-copy.copied{opacity:1;color:var(--ui-accent, #0053fd)}.ga-log-tail-scroll{height:100%;min-height:0;overflow-y:auto;scrollbar-width:thin;scrollbar-gutter:stable}.ga-log-tail-pre{margin:0;padding:8px 10px;font-family:var(--font-mono);font-size:.6875rem;line-height:1.5;white-space:pre-wrap;word-break:break-all;color:var(--semi-color-text-1);-webkit-user-select:text;user-select:text}.ga-log-tail-empty{margin:0;padding:8px 10px;font-family:var(--font-mono);font-size:.6875rem;line-height:1.5;color:var(--ui-text-quaternary)}.ga-log-separator{display:block;margin-top:4px;color:var(--ui-text-tertiary)}.ga-log-view{overflow:auto;border-radius:8px;border:1px solid var(--ui-stroke-tertiary, rgba(0, 0, 0, .06));padding:6px 10px;font-family:var(--font-mono);font-size:.6875rem;line-height:1.5;white-space:pre-wrap;word-break:break-all;color:var(--ui-text-tertiary);scrollbar-width:thin;-webkit-user-select:text;user-select:text}.ga-log-modal-body,.ga-log-modal-body .ga-log-tail-scroll{max-height:calc(85vh - 80px)}[data-slot=approval-card]{border:1px solid color-mix(in srgb,var(--semi-color-primary, #3370ff) 20%,transparent);border-radius:.5rem;padding:.625rem .75rem;background:var(--semi-color-bg-0, #fff)}[data-slot=approval-card][data-settled]{opacity:.6;pointer-events:none}[data-slot=approval-card][data-submitting]{pointer-events:none}[data-slot=approval-question]{font-size:var(--conversation-text-font-size, .875rem);line-height:1.5;color:var(--semi-color-text-0);white-space:pre-wrap;word-break:break-word;margin-bottom:.5rem}[data-slot=approval-options]{display:flex;flex-direction:column;gap:.25rem}[data-slot=approval-option-row]{display:flex;align-items:center;gap:.5rem;padding:.375rem .5rem;border-radius:.25rem;border:none;background:transparent;cursor:pointer;text-align:left;font-size:var(--conversation-text-font-size, .875rem);color:var(--semi-color-text-0);transition:background .12s ease-out;overflow-wrap:anywhere}[data-slot=approval-option-row]:hover,[data-slot=approval-option-row][data-selected]{background:var(--semi-color-fill-0)}[data-slot=approval-option-row]:disabled{cursor:default;opacity:.7}[data-slot=approval-badge]{display:inline-flex;align-items:center;justify-content:center;min-width:1.125rem;height:.75rem;padding:.125rem .25rem;font-size:.6875rem;font-family:inherit;font-weight:600;line-height:1;border-radius:.1875rem;border:1px solid var(--semi-color-border);background:var(--semi-color-bg-0, #fff);color:var(--semi-color-text-2);flex-shrink:0;transition:background .12s,border-color .12s,color .12s}[data-slot=approval-badge][data-active]{background:var(--semi-color-primary, #3370ff);border-color:var(--semi-color-primary, #3370ff);color:#fff}[data-slot=approval-other]{display:flex;align-items:flex-start;gap:.5rem;padding:.375rem .5rem;border-radius:.25rem}[data-slot=approval-other]>[data-slot=approval-badge]{margin-top:.25rem}[data-slot=approval-other-input]{flex:1;field-sizing:content;min-height:1.5em;max-height:10rem;padding:.25rem .375rem;font-size:var(--conversation-text-font-size, .875rem);font-family:inherit;line-height:1.5;color:var(--semi-color-text-0);background:var(--semi-color-fill-0);border:1px solid var(--semi-color-border);border-radius:.25rem;resize:none;overflow-y:auto;transition:border-color .12s}[data-slot=approval-other-input]:focus{outline:none;border-color:var(--semi-color-primary, #3370ff)}[data-slot=approval-other-input][data-fullwidth]{width:100%}[data-slot=approval-other-input]:disabled{opacity:.7;cursor:default}[data-slot=approval-actions]{display:flex;justify-content:flex-end;align-items:center;gap:.5rem;margin-top:.5rem}[data-slot=approval-skip-btn]{padding:.25rem .625rem;font-size:.75rem;font-weight:500;color:var(--semi-color-text-2);background:transparent;border:none;border-radius:.25rem;cursor:pointer;transition:color .12s,background .12s}[data-slot=approval-skip-btn]:hover{color:var(--semi-color-text-0);background:var(--semi-color-fill-0)}[data-slot=approval-skip-btn]:disabled{cursor:default;opacity:.5}[data-slot=approval-confirm-btn]{display:inline-flex;align-items:center;gap:.375rem;padding:.25rem .75rem;font-size:.75rem;font-weight:500;color:#fff;background:var(--semi-color-primary, #3370ff);border:none;border-radius:.25rem;cursor:pointer;transition:opacity .12s,background .12s}[data-slot=approval-confirm-btn]:hover:not(:disabled){opacity:.85}[data-slot=approval-confirm-btn]:disabled{cursor:default;opacity:.45}[data-slot=approval-spinner]{display:inline-block;width:.75rem;height:.75rem;border:2px solid rgba(255,255,255,.3);border-top-color:#fff;border-radius:50%;animation:approval-spin .6s linear infinite}@keyframes approval-spin{to{transform:rotate(360deg)}}[data-slot=approval-settled]{margin-top:.25rem;font-size:var(--conversation-caption-font-size, .8125rem);color:var(--semi-color-text-2)}[data-slot=approval-settled] em{font-style:italic;color:var(--semi-color-text-3)}[data-slot=assistant-action-bar]{display:flex;align-items:center;justify-content:flex-end;min-height:1.5rem;gap:.25rem;padding-right:var(--message-text-indent);padding-left:var(--message-text-indent);opacity:0;pointer-events:none;transition:opacity .12s ease-out}[data-slot=aui_assistant-message-root]:hover [data-slot=assistant-action-bar],[data-slot=aui_assistant-message-root]:focus-within [data-slot=assistant-action-bar]{opacity:1;pointer-events:auto}[data-slot=action-bar-btn]{display:grid;width:1.5rem;height:1.5rem;place-items:center;border:none;border-radius:.25rem;background:none;color:var(--semi-color-text-2);cursor:pointer;transition:color .1s,background .1s}[data-slot=action-bar-btn]:hover{background:var(--semi-color-fill-1);color:var(--semi-color-text-0)}[data-slot=user-turn-rail]{position:absolute;right:0;top:50%;transform:translateY(-50%);z-index:100;pointer-events:none}[data-slot=rail-hitarea]{position:relative;display:flex;align-items:center;justify-content:flex-end;padding:.5rem;pointer-events:auto}[data-slot=user-turn-rail][data-expanded] [data-slot=rail-hitarea]:before{content:"";position:absolute;top:0;bottom:0;right:0;left:-260px;pointer-events:auto}[data-slot=rail-marks]{display:flex;flex-direction:column;align-items:flex-end;gap:.25rem}[data-slot=user-turn-rail][data-expanded] [data-slot=rail-marks]{visibility:hidden}[data-slot=rail-mark]{width:2.5rem;height:.5rem;display:flex;align-items:center;justify-content:flex-end;border:none;padding:0;margin:0;background:transparent;cursor:pointer}[data-slot=rail-mark-line]{width:1rem;height:2px;border-radius:999px;background:var(--semi-color-fill-2);transition:background-color .12s ease}[data-slot=rail-mark][data-active] [data-slot=rail-mark-line]{background:var(--semi-color-text-0)}[data-slot=rail-panel]{position:absolute;right:calc(100% - .5rem);top:50%;transform:translateY(-50%);display:flex;flex-direction:column;gap:1px;max-width:240px;min-width:140px;padding:.25rem;border-radius:.5rem;background:var(--semi-color-bg-3, #2a2a2a);box-shadow:0 2px 12px #00000026;opacity:0;pointer-events:none;transition:opacity .12s ease}[data-slot=user-turn-rail][data-expanded] [data-slot=rail-panel]{opacity:1;pointer-events:auto}[data-slot=rail-panel-item]{display:block;width:100%;padding:.3rem .5rem;border:none;border-radius:.25rem;background:transparent;color:var(--semi-color-text-2);font-size:.75rem;line-height:1.4;text-align:left;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;cursor:pointer;transition:background-color .1s ease}[data-slot=rail-panel-item]:hover,[data-slot=rail-panel-item][data-active]{background:var(--semi-color-fill-1);color:var(--semi-color-text-0)}[data-slot=rail-mark]:focus-visible [data-slot=rail-mark-line]{box-shadow:0 0 0 2px var(--semi-color-primary-light-default, rgba(0, 100, 250, .2))}[data-slot=rail-mark]:focus-visible{outline:none}@media(max-width:900px){[data-slot=user-turn-rail]{display:none}}:root{--conversation-text-font-size: .8125rem;--conversation-tool-font-size: .6875rem;--conversation-caption-font-size: .75rem;--conversation-line-height: 1.125rem;--conversation-caption-line-height: 1rem;--conversation-turn-gap: .375rem;--turn-block-gap: .75rem;--tool-row-gap: .375rem;--paragraph-gap: .7rem;--sticky-human-top: .23rem;--message-text-indent: .75rem;--dt-line-height: 1.5;--human-msg-line-height: 1.3;--composer-width: 780px;--thread-last-message-clearance: calc(var(--composer-measured-height, 62px) + 2rem)}[data-slot=thread-root]{position:relative;display:grid;grid-template-rows:minmax(0,1fr);height:100%;min-height:0;max-width:100%;overflow:clip;contain:layout style}[data-slot=aui_thread-viewport]{width:100%;height:100%;overflow-x:hidden;overflow-y:auto;overscroll-behavior-y:contain;overflow-anchor:none}[data-slot=aui_thread-viewport][data-following=false]{overflow-anchor:auto}[data-slot=aui_thread-content]{max-width:var(--composer-width);width:100%;min-width:0;margin-inline:auto;padding-inline:1.5rem;padding-top:1.5rem;display:flex;flex-direction:column;gap:1.25rem}[data-slot=aui_composer-clearance]{height:var(--thread-last-message-clearance);flex-shrink:0}[data-slot=thread-empty]{display:flex;align-items:center;justify-content:center;min-height:40vh;color:var(--semi-color-text-2);font-size:var(--conversation-text-font-size)}[data-slot=aui_turn-pair]{position:relative;display:flex;flex-direction:column;gap:var(--conversation-turn-gap);min-width:0;padding-bottom:var(--conversation-turn-gap)}[data-slot=aui_user-message-root]{position:sticky;top:var(--sticky-human-top);z-index:40;display:flex;flex-direction:column;align-items:stretch;min-width:0;overflow:visible;padding-bottom:0;padding-top:0;background:transparent}[data-slot=user-bubble]{position:relative;display:flex;width:100%;min-width:0;max-width:100%;flex-direction:column;gap:.375rem;overflow:visible;border-radius:2px;border:1px solid var(--ui-stroke-tertiary);background:var(--ui-chat-bubble-background);padding:.5rem .75rem;font-size:var(--conversation-text-font-size);line-height:var(--human-msg-line-height);text-align:left}[data-slot=user-bubble]:hover{border-color:var(--ui-stroke-secondary)}[data-slot=user-bubble-text]{white-space:pre-wrap;word-break:break-word;max-height:calc(4 * var(--human-msg-line-height) * var(--conversation-text-font-size) + .15rem);overflow:hidden}[data-slot=user-bubble][data-clamped] [data-slot=user-bubble-text]{-webkit-mask-image:linear-gradient(to bottom,#000 55%,transparent);mask-image:linear-gradient(to bottom,#000 55%,transparent)}[data-slot=user-bubble][data-expanded] [data-slot=user-bubble-text]{max-height:40dvh;overflow-y:auto;-webkit-mask-image:none;mask-image:none}[data-slot=user-bubble-expand]{position:absolute;inset-inline:0;bottom:0;display:flex;height:1.75rem;cursor:pointer;align-items:flex-end;justify-content:center;padding-bottom:.25rem;border:none;background:linear-gradient(to top,var(--ui-chat-bubble-background),transparent);color:var(--ui-text-tertiary);transition:color .12s ease-out}[data-slot=user-bubble-expand]:hover{color:var(--foreground)}[data-slot=user-bubble-expand] svg{width:.875rem;height:.875rem;transition:transform .15s ease-out}[data-slot=user-bubble][data-expanded] [data-slot=user-bubble-expand]{background:none}[data-slot=user-bubble][data-expanded] [data-slot=user-bubble-expand] svg{transform:rotate(180deg)}[data-slot=user-bubble-copy]{position:absolute;top:.25rem;right:.25rem;display:grid;width:2rem;height:2rem;place-items:center;border:none;border-radius:.375rem;background:var(--ui-chat-bubble-background);color:var(--ui-text-tertiary);cursor:pointer;opacity:0;pointer-events:none;transition:opacity .12s ease-out,color .1s,background .1s}[data-slot=user-bubble]:hover [data-slot=user-bubble-copy],[data-slot=user-bubble]:focus-within [data-slot=user-bubble-copy]{opacity:1;pointer-events:auto}[data-slot=user-bubble-copy]:hover{background:var(--ui-control-hover-background);color:var(--foreground)}[data-slot=user-images]{display:flex;flex-wrap:wrap;gap:.5rem;padding:0 .75rem;margin-bottom:.375rem}[data-slot=user-image-thumb]{max-width:12rem;max-height:8rem;border-radius:.375rem;border:1px solid var(--ui-stroke-tertiary);object-fit:cover}[data-slot=user-files]{display:flex;flex-wrap:wrap;gap:.375rem;padding:0 .75rem;margin-bottom:.375rem}[data-slot=user-file-chip]{display:inline-flex;align-items:center;gap:.25rem;padding:.2rem .5rem;border-radius:.25rem;background:var(--ui-bg-secondary, hsl(0 0% 95%));border:1px solid var(--ui-stroke-tertiary, hsl(0 0% 88%));font-size:var(--conversation-caption-font-size);line-height:var(--conversation-caption-line-height);color:var(--ui-text-secondary, hsl(0 0% 40%));max-width:14rem}[data-slot=user-file-icon]{flex-shrink:0;font-size:.7rem;opacity:.7}[data-slot=user-file-name]{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}[data-slot=user-file-size]{flex-shrink:0;opacity:.6;font-size:.625rem}[data-slot=aui_assistant-message-root]{display:flex;flex-direction:column;gap:0;width:100%;min-width:0;max-width:100%;align-self:flex-start;overflow:hidden}[data-slot=aui_assistant-message-content]{padding-left:var(--message-text-indent);font-size:var(--conversation-text-font-size);line-height:var(--dt-line-height);color:var(--semi-color-text-0);display:flex;flex-direction:column;gap:var(--turn-block-gap);min-width:0;max-width:100%;overflow:hidden;overflow-wrap:anywhere}[data-slot=aui_thinking-disclosure]{border:1px solid var(--semi-color-border);border-radius:.375rem;opacity:.67;transition:opacity .12s ease-out}[data-slot=aui_thinking-disclosure]:hover,[data-slot=aui_thinking-disclosure]:focus-within{opacity:1}[data-slot=thinking-summary]{padding:.375rem .625rem;font-size:var(--conversation-tool-font-size);line-height:var(--conversation-line-height);color:var(--semi-color-text-2);cursor:pointer;-webkit-user-select:none;user-select:none;list-style:none}[data-slot=thinking-body]{padding:0 .625rem .5rem;font-size:var(--conversation-tool-font-size);line-height:1.5;color:var(--semi-color-text-2);white-space:pre-wrap;word-break:break-word;max-height:10rem;overflow-y:auto}[data-slot=thinking-body][data-streaming]{mask-image:linear-gradient(to bottom,transparent 0%,black 28%,black 100%);-webkit-mask-image:linear-gradient(to bottom,transparent 0%,black 28%,black 100%)}.thinking-shimmer{animation:thinking-shimmer-anim 2s ease-in-out infinite}@keyframes thinking-shimmer-anim{0%,to{opacity:.55}50%{opacity:1}}[data-slot=tool-block]{display:grid;gap:var(--tool-row-gap);min-width:0;max-width:100%;overflow:hidden;opacity:.67;transition:opacity .12s ease-out}[data-slot=tool-block]:hover,[data-slot=tool-block]:focus-within{opacity:1}[data-slot=tool-header]{display:flex;align-items:center;gap:.375rem;cursor:pointer}[data-slot=tool-glyph]{display:grid;width:.875rem;height:.875rem;place-items:center;flex-shrink:0;align-self:center}[data-slot=tool-spinner]{width:.625rem;height:.625rem;border:1.5px solid var(--semi-color-border);border-top-color:var(--semi-color-primary);border-radius:50%;animation:thread-spin .7s linear infinite}@keyframes thread-spin{to{transform:rotate(360deg)}}[data-slot=tool-block][data-status=success] [data-slot=tool-glyph]{color:#16a34ad9}[data-slot=tool-title]{font-size:var(--conversation-tool-font-size);font-weight:500;line-height:var(--conversation-line-height);color:var(--semi-color-text-2);font-family:SF Mono,Cascadia Code,Fira Code,monospace}[data-slot=tool-duration]{flex-shrink:0;font-size:.625rem;font-variant-numeric:tabular-nums;color:var(--semi-color-text-3)}[data-slot=tool-dots]{animation:thread-pulse 1.2s ease-in-out infinite}@keyframes thread-pulse{0%,to{opacity:.4}50%{opacity:1}}[data-slot=tool-body]{margin:0;font-size:.7rem;line-height:1.5;font-family:SF Mono,Cascadia Code,Fira Code,monospace;background:var(--semi-color-fill-0);padding:.5rem .625rem;border-radius:.3125rem;border:1px solid var(--semi-color-border);overflow-x:auto;overscroll-behavior-x:contain;white-space:pre-wrap;word-break:break-all;max-height:7.5rem;overflow-y:auto;color:var(--semi-color-text-1)}[data-slot=summary-block]{font-size:var(--conversation-text-font-size);line-height:var(--dt-line-height);color:var(--semi-color-text-1, var(--ui-text-secondary));padding:.5rem .75rem;margin:.25rem 0;border-radius:4px;background:color-mix(in srgb,var(--theme-primary) 6%,transparent);width:fit-content}[data-slot=standalone-message]{padding:.5rem .75rem;font-size:var(--conversation-tool-font-size);line-height:1.25rem;color:var(--semi-color-text-2);background:var(--semi-color-fill-0);border-radius:.375rem}[data-slot=standalone-message][data-status=failed]{color:var(--semi-color-danger);background:var(--semi-color-danger-light-default)}[data-slot=scroll-to-bottom]{position:absolute;bottom:calc(var(--thread-last-message-clearance) + .625rem);left:50%;transform:translate(-50%);width:2rem;height:2rem;border-radius:50%;border:1px solid var(--semi-color-border);background:var(--semi-color-bg-0, #fff);box-shadow:0 2px 8px #0000000f;display:flex;align-items:center;justify-content:center;cursor:pointer;color:var(--semi-color-text-0);z-index:50;transition:box-shadow .12s}[data-slot=scroll-to-bottom]:hover{box-shadow:0 4px 12px #0000001a}[data-slot=aui_markdown-part]{min-width:0;max-width:100%;overflow-wrap:anywhere}[data-slot=aui_markdown-part] p{margin:0}[data-slot=aui_markdown-part] p+p{margin-top:var(--paragraph-gap)}[data-slot=aui_markdown-part] h1{font-size:1rem;line-height:1.4;letter-spacing:-.01em;margin:1rem 0 .5rem;font-weight:600}[data-slot=aui_markdown-part] h2{font-size:.9375rem;line-height:1.4;letter-spacing:-.01em;margin:.875rem 0 .375rem;font-weight:600}[data-slot=aui_markdown-part] h3{font-size:.875rem;line-height:1.4;margin:.75rem 0 .25rem;font-weight:600}[data-slot=aui_markdown-part] h4{font-size:var(--conversation-text-font-size);line-height:1.4;margin:.5rem 0 .25rem;font-weight:600}[data-slot=aui_markdown-part] h1:first-child,[data-slot=aui_markdown-part] h2:first-child,[data-slot=aui_markdown-part] h3:first-child,[data-slot=aui_markdown-part] h4:first-child{margin-top:0}[data-slot=aui_markdown-part] ul,[data-slot=aui_markdown-part] ol{margin:.375rem 0;padding-left:1.25rem}[data-slot=aui_markdown-part] li{margin:.2rem 0}[data-slot=aui_markdown-part] li+li{margin-top:.25rem}[data-slot=aui_markdown-part] code{font-family:SF Mono,Cascadia Code,Fira Code,monospace;font-size:.92em;background:var(--semi-color-fill-0);padding:.1em .3em;border-radius:.25rem}[data-slot=aui_markdown-part] pre{margin:.5rem 0;padding:.625rem .75rem;font-size:.7rem;line-height:1.5;border-radius:.375rem;border:1px solid var(--semi-color-border);background:var(--semi-color-fill-0);overflow-x:auto}[data-slot=aui_markdown-part] pre code{background:transparent;padding:0;font-size:inherit}[data-slot=aui_markdown-part] blockquote{margin:.5rem 0;padding-left:.75rem;border-left:3px solid var(--semi-color-border);color:var(--semi-color-text-2)}[data-slot=md-table-wrap]{margin:.5rem 0;max-width:100%;overflow-x:auto;border-radius:.375rem;border:1px solid var(--semi-color-border)}[data-slot=md-table-wrap] table{margin:0;width:100%;min-width:12rem;border-collapse:collapse;font-size:var(--conversation-text-font-size);line-height:var(--dt-line-height)}[data-slot=md-table-wrap] thead{background:color-mix(in srgb,var(--semi-color-fill-0) 50%,transparent)}[data-slot=md-table-wrap] th{padding:.375rem .625rem;text-align:left;font-size:.75rem;font-weight:500;color:var(--semi-color-text-2);white-space:nowrap}[data-slot=md-table-wrap] td{padding:.375rem .625rem;font-size:var(--conversation-text-font-size);line-height:1.5;vertical-align:top;color:var(--semi-color-text-0)}[data-slot=md-table-wrap] tr{border-bottom:1px solid var(--semi-color-border)}[data-slot=md-table-wrap] tr:last-child{border-bottom:none}[data-slot=aui_markdown-part] strong{font-weight:600}[data-slot=aui_markdown-part] hr{border:none;border-top:1px solid var(--semi-color-border);margin:.75rem 0}[data-slot=show-earlier-btn]{display:flex;align-items:center;justify-content:center;padding:.5rem;margin:.5rem 0;font-size:.75rem;color:var(--semi-color-text-2);background:var(--semi-color-fill-0);border:1px solid var(--semi-color-border);border-radius:.375rem;cursor:pointer;transition:background .12s,color .12s;width:100%}[data-slot=show-earlier-btn]:hover{background:var(--semi-color-fill-1);color:var(--semi-color-text-0)}[data-slot=stream-indicator]{display:flex;align-items:center;gap:.5rem;padding:.25rem 0;color:var(--semi-color-text-3);font-size:var(--conversation-tool-font-size)}[data-slot=stream-indicator][data-stall]{margin-top:.375rem}[data-slot=dither-square]{display:inline-block;width:.75rem;height:.75rem;border-radius:2px;background:repeating-conic-gradient(currentColor 0% 25%,transparent 0% 50%) 0 0 / .125rem .125rem;opacity:.7;animation:indicator-pulse 1.2s ease-in-out infinite}[data-slot=indicator-timer]{font-variant-numeric:tabular-nums;font-size:.6875rem;color:var(--semi-color-text-3)}@keyframes indicator-pulse{0%,to{opacity:.4}50%{opacity:.9}}.ga-inline-error{padding:6px 12px;margin:4px 0;color:var(--semi-color-danger);font-size:var(--conversation-caption-font-size);line-height:var(--conversation-caption-line-height);opacity:.85}.ga-inline-error-text{white-space:pre-wrap;word-break:break-word}:root{--composer-width: 48.75rem;--composer-control-size: 1.75rem;--composer-surface-pad-x: .75rem;--composer-surface-pad-y: .5rem;--composer-input-min-height: 1.625rem;--composer-input-max-height: 9.375rem;--composer-fallback-height: 2.75rem;--composer-measured-height: 62px}[data-slot=composer-root]{position:absolute;bottom:0;left:50%;transform:translate(-50%);z-index:30;width:min(var(--composer-width),calc(100% - 2rem));padding-top:.5rem;padding-bottom:1rem}[data-slot=composer-root]:before{content:"";position:absolute;top:.5rem;right:0;bottom:0;left:0;background:var(--background);border-radius:var(--composer-border-radius, 1rem) var(--composer-border-radius, 1rem) 0 0;z-index:-1}[data-slot=composer-surface]{display:flex;flex-direction:column;gap:0;padding:var(--composer-surface-pad-y) var(--composer-surface-pad-x);border-radius:.75rem;border:1px solid var(--semi-color-border, #e0e0e0);background:color-mix(in srgb,var(--semi-color-bg-0, #fff) 85%,transparent);backdrop-filter:blur(.75rem) saturate(1.12);-webkit-backdrop-filter:blur(.75rem) saturate(1.12);box-shadow:0 2px 12px #0000000a;transition:border-color .15s}[data-slot=composer-surface]:focus-within{border-color:var(--semi-color-primary, #3370ff);box-shadow:0 0 0 2px color-mix(in srgb,var(--semi-color-primary, #3370ff) 15%,transparent)}[data-slot=composer-input-row]{display:flex;align-items:flex-end}[data-slot=composer-rich-input]{flex:1;min-height:var(--composer-input-min-height);max-height:var(--composer-input-max-height);padding:.375rem .25rem;border:none;background:transparent;font-size:.8125rem;line-height:1.5;color:var(--semi-color-text-0, #1c1f23);outline:none;font-family:inherit;overflow-y:auto;white-space:pre-wrap;word-wrap:break-word}[data-slot=composer-rich-input]:empty:before{content:attr(data-placeholder);color:var(--ui-text-secondary);pointer-events:none}[data-slot=composer-rich-input][contenteditable=false]{opacity:.5;cursor:default}.ref-chip{display:inline-flex;align-items:center;gap:2px;padding:1px 6px;border-radius:4px;background:color-mix(in srgb,var(--semi-color-primary, #3370ff) 10%,transparent);color:var(--semi-color-primary, #3370ff);font-size:.6875rem;vertical-align:baseline;-webkit-user-select:none;user-select:none;cursor:default;line-height:1.4}.ref-chip-icon{display:inline-flex;align-items:center}.ref-chip-label{max-width:10rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.skill-chip{display:inline-flex;align-items:center;padding:.1rem .4rem;border-radius:4px;background:#3b82f61f;color:#3b82f6;font-family:var(--font-mono, ui-monospace, monospace);font-size:.82em;font-weight:500;line-height:1.4;white-space:nowrap;-webkit-user-select:none;user-select:none;vertical-align:baseline}[data-slot=at-ref-popover]{position:relative;width:100%;margin-bottom:.25rem;animation:skillSlideUp .12s ease-out}[data-slot=at-ref-form]{display:flex;align-items:center;gap:.25rem;padding:.375rem .5rem;background:var(--semi-color-bg-0, #fff);border:1px solid var(--semi-color-border, #e0e0e0);border-radius:.5rem;box-shadow:0 4px 20px #00000014}[data-slot=at-ref-kinds]{display:flex;gap:2px}[data-slot=at-ref-kind-btn]{width:1.5rem;height:1.5rem;border:none;border-radius:.25rem;background:transparent;font-size:.75rem;cursor:pointer;display:grid;place-items:center;transition:background .1s}[data-slot=at-ref-kind-btn]:hover{background:var(--semi-color-fill-0, #f5f5f5)}[data-slot=at-ref-kind-btn][data-active]{background:color-mix(in srgb,var(--semi-color-primary, #3370ff) 12%,transparent)}[data-slot=at-ref-input]{flex:1;border:none;outline:none;background:transparent;font-size:.75rem;color:var(--semi-color-text-0, #1c1f23);font-family:monospace;min-width:0}[data-slot=at-ref-input]::placeholder{color:var(--semi-color-text-3, #8f959e)}[data-slot=at-ref-confirm]{width:1.5rem;height:1.5rem;border:none;border-radius:.25rem;background:var(--semi-color-text-0, #1c1f23);color:var(--semi-color-bg-0, #fff);font-size:.75rem;cursor:pointer;display:grid;place-items:center;transition:opacity .1s}[data-slot=at-ref-confirm]:disabled{opacity:.2;cursor:default}[data-slot=composer-toolbar]{display:flex;align-items:center;justify-content:space-between;padding-top:.25rem;border-top:1px solid color-mix(in srgb,var(--semi-color-border, #e0e0e0) 50%,transparent);margin-top:.25rem}[data-slot=composer-toolbar-left],[data-slot=composer-toolbar-right]{display:flex;align-items:center;gap:.25rem}[data-slot=composer-attach-btn]{width:var(--composer-control-size);height:var(--composer-control-size);border-radius:.375rem;border:none;background:transparent;color:var(--semi-color-text-2, #4e5969);display:grid;place-items:center;cursor:pointer;transition:background .12s,color .12s}[data-slot=composer-attach-btn]:hover{background:var(--semi-color-fill-0, #f5f5f5);color:var(--semi-color-text-0, #1c1f23)}[data-slot=composer-cta]{width:var(--composer-control-size);height:var(--composer-control-size);border-radius:50%;border:none;display:grid;place-items:center;cursor:pointer;transition:opacity .12s,background .12s,border-color .12s;background:var(--semi-color-text-0, #1c1f23);color:var(--semi-color-bg-0, #fff)}[data-slot=composer-cta]:disabled{opacity:.2;cursor:default}[data-slot=composer-cta]:not(:disabled):hover{opacity:.8}[data-slot=composer-cta][data-state=stop]{background:var(--semi-color-bg-0, #fff);color:var(--semi-color-text-0, #1c1f23);border:1px solid var(--semi-color-border, #e0e0e0)}[data-slot=composer-cta][data-state=stop]:hover{background:var(--semi-color-fill-0, #f5f5f5);opacity:1}[data-slot=composer-cta][data-state=queue]{background:var(--semi-color-primary, #3370ff);color:#fff}[data-slot=composer-status-stack]{display:flex;flex-wrap:wrap;gap:.25rem;padding:0 .25rem .25rem}[data-slot=status-running]{display:inline-flex;align-items:center;gap:.375rem;padding:.2rem .5rem;border-radius:1rem;background:color-mix(in srgb,var(--semi-color-primary, #3370ff) 8%,transparent);font-size:.6875rem;color:var(--semi-color-primary, #3370ff);-webkit-user-select:none;user-select:none}[data-slot=status-dot]{width:6px;height:6px;border-radius:50%;background:var(--semi-color-primary, #3370ff);animation:statusPulse 1.2s ease-in-out infinite}@keyframes statusPulse{0%,to{opacity:1}50%{opacity:.3}}[data-slot=status-queued]{display:inline-flex;align-items:center;gap:.25rem;padding:.2rem .375rem;border-radius:1rem;background:var(--semi-color-fill-0, #f5f5f5);font-size:.6875rem;color:var(--semi-color-text-1, #1c1f23);-webkit-user-select:none;user-select:none}[data-slot=status-queue-num]{font-weight:600;color:var(--semi-color-text-2, #4e5969);font-size:.625rem}[data-slot=status-queue-text]{max-width:8rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}[data-slot=status-queue-cancel]{width:1rem;height:1rem;border:none;border-radius:50%;background:transparent;color:var(--semi-color-text-3, #8f959e);display:grid;place-items:center;cursor:pointer;transition:background .1s,color .1s}[data-slot=status-queue-cancel]:hover{background:#0000000f;color:var(--semi-color-text-0, #1c1f23)}[data-slot=composer-drop-overlay]{position:absolute;top:0;right:0;bottom:0;left:0;z-index:100;display:grid;place-items:center;background:color-mix(in srgb,var(--semi-color-primary, #3370ff) 10%,transparent);border:2px dashed var(--semi-color-primary, #3370ff);border-radius:.75rem;color:var(--semi-color-primary, #3370ff);font-size:.8125rem;font-weight:500;pointer-events:none}[data-slot=model-selector]{position:relative}[data-slot=model-chip]{display:flex;align-items:center;gap:.25rem;height:var(--composer-control-size);padding:0 .5rem;border:none;border-radius:.375rem;background:transparent;color:var(--semi-color-text-2, #4e5969);font-size:.75rem;font-weight:400;cursor:pointer;transition:background .12s,color .12s;white-space:nowrap;max-width:10rem}[data-slot=model-chip]:hover,[data-slot=model-chip][data-open]{background:color-mix(in srgb,var(--semi-color-text-0, #1c1f23) 5%,transparent);color:var(--semi-color-text-0, #1c1f23)}[data-slot=model-chip][data-loading]{padding:0 .375rem}[data-slot=model-chip-label]{overflow:hidden;text-overflow:ellipsis;max-width:12rem}[data-slot=model-chip-caret]{display:inline-flex;opacity:.4;transition:transform .15s}[data-slot=model-chip-caret] svg{width:8px;height:8px}[data-slot=model-chip-caret][data-open]{transform:rotate(180deg)}[data-slot=model-chip-spinner]{display:inline-flex;gap:2px;align-items:center;height:10px}[data-slot=model-chip-spinner]:before,[data-slot=model-chip-spinner]:after,[data-slot=model-chip-spinner] span{content:"";display:block;width:3px;height:3px;border-radius:50%;background:currentColor;opacity:.4;animation:dotPulse 1s ease-in-out infinite}[data-slot=model-chip-spinner]:after{animation-delay:.2s}[data-slot=model-chip-spinner] span{animation-delay:.4s}@keyframes dotPulse{0%,80%,to{opacity:.25;transform:scale(.8)}40%{opacity:.8;transform:scale(1)}}[data-slot=provider-dot]{width:6px;height:6px;border-radius:50%;flex-shrink:0}[data-slot=model-menu]{position:absolute;bottom:calc(100% + 8px);right:0;width:16rem;max-height:24rem;display:flex;flex-direction:column;background:color-mix(in srgb,var(--semi-color-bg-0, #fff) 92%,transparent);backdrop-filter:blur(14px) saturate(1.15);-webkit-backdrop-filter:blur(14px) saturate(1.15);border:1px solid color-mix(in srgb,var(--semi-color-border, #e0e0e0) 50%,transparent);border-radius:.5rem;box-shadow:0 4px 24px #00000014,0 0 0 .5px #00000005;z-index:60;animation:skillSlideUp .12s ease-out;overflow:hidden}[data-slot=model-menu-search]{display:flex;align-items:center;gap:.375rem;padding:.5rem .625rem;border-bottom:1px solid color-mix(in srgb,var(--semi-color-border, #e0e0e0) 50%,transparent)}[data-slot=model-menu-search-icon]{flex-shrink:0;color:var(--semi-color-text-3, #8f959e)}[data-slot=model-menu-search-input]{flex:1;border:none;outline:none;background:transparent;font-size:.75rem;color:var(--semi-color-text-0, #1c1f23);min-width:0}[data-slot=model-menu-search-input]::placeholder{color:var(--semi-color-text-3, #8f959e)}[data-slot=model-menu-body]{flex:1;overflow-y:auto;padding:.25rem}[data-slot=model-menu-section]{padding-top:.25rem}[data-slot=model-menu-section]+[data-slot=model-menu-section]{border-top:1px solid color-mix(in srgb,var(--semi-color-border, #e0e0e0) 40%,transparent);margin-top:.25rem;padding-top:.375rem}[data-slot=model-menu-section-header]{display:flex;align-items:center;gap:.375rem;padding:.25rem .5rem;font-size:.5625rem;font-weight:600;color:var(--semi-color-text-3, #8f959e);letter-spacing:.05em;-webkit-user-select:none;user-select:none}[data-slot=model-menu-item]{display:flex;align-items:center;gap:.375rem;width:100%;padding:.375rem .5rem;border:none;border-radius:.25rem;background:transparent;color:var(--semi-color-text-0, #1c1f23);font-size:.75rem;cursor:pointer;text-align:left;transition:background .1s}[data-slot=model-menu-item]:hover{background:var(--semi-color-fill-0, #f5f5f5)}[data-slot=model-menu-item][data-active]{color:var(--semi-color-text-0, #1c1f23);font-weight:500}[data-slot=model-menu-name]{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}[data-slot=model-check]{font-size:.625rem;color:var(--semi-color-primary, #3370ff);flex-shrink:0;width:.75rem}[data-slot=mixin-caret]{display:inline-flex;padding:2px;border-radius:2px;transition:transform .15s;color:var(--semi-color-text-3, #8f959e)}[data-slot=mixin-caret]:hover{background:var(--semi-color-fill-1, #eee)}[data-slot=mixin-caret][data-expanded]{transform:rotate(180deg)}[data-slot=mixin-members]{padding-left:1.25rem}[data-slot=mixin-member]{display:flex;align-items:center;gap:.375rem;padding:.25rem .5rem;font-size:.6875rem;color:var(--semi-color-text-2, #4e5969)}[data-slot=model-menu-empty]{padding:1rem .5rem;text-align:center;font-size:.75rem;color:var(--semi-color-text-3, #8f959e)}[data-slot=model-menu-footer]{display:flex;border-top:1px solid color-mix(in srgb,var(--semi-color-border, #e0e0e0) 50%,transparent);padding:.25rem}[data-slot=model-menu-action]{flex:1;padding:.375rem .5rem;border:none;border-radius:.25rem;background:transparent;color:var(--semi-color-text-2, #4e5969);font-size:.6875rem;cursor:pointer;text-align:center;transition:background .1s,color .1s}[data-slot=model-menu-action]:hover{background:var(--semi-color-fill-0, #f5f5f5);color:var(--semi-color-text-0, #1c1f23)}[data-slot=attachment-strip]{display:flex;flex-wrap:wrap;gap:.375rem;padding-bottom:.375rem;animation:attachReveal .2s ease-out}@keyframes attachReveal{0%{opacity:0;max-height:0}to{opacity:1;max-height:200px}}[data-slot=attachment-thumb]{position:relative;width:3.5rem;height:3.5rem;border-radius:.375rem;overflow:hidden;border:1px solid var(--semi-color-border, #e0e0e0)}[data-slot=attachment-thumb] img{width:100%;height:100%;object-fit:cover}[data-slot=attachment-file-chip]{display:flex;align-items:center;gap:.375rem;padding:.25rem .5rem;border-radius:.375rem;border:1px solid var(--semi-color-border, #e0e0e0);background:var(--semi-color-fill-0, #f9f9f9);max-width:12rem}[data-slot=attachment-file-icon]{font-size:1rem;flex-shrink:0}[data-slot=attachment-file-meta]{display:flex;flex-direction:column;overflow:hidden;min-width:0}[data-slot=attachment-file-name]{font-size:.6875rem;color:var(--semi-color-text-0, #1c1f23);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}[data-slot=attachment-file-size]{font-size:.625rem;color:var(--semi-color-text-3, #8f959e)}[data-slot=attachment-remove]{flex-shrink:0;width:1rem;height:1rem;border-radius:50%;border:none;background:var(--semi-color-fill-1, #eee);color:var(--semi-color-text-2, #4e5969);font-size:.625rem;line-height:1;cursor:pointer;display:grid;place-items:center;transition:background .1s}[data-slot=attachment-thumb] [data-slot=attachment-remove]{position:absolute;top:2px;right:2px;background:#00000080;color:#fff}[data-slot=attachment-remove]:hover{background:var(--semi-color-danger, #f53f3f);color:#fff}[data-slot=attachment-spinner]{width:12px;height:12px;border:1.5px solid var(--semi-color-border, #e0e0e0);border-top-color:var(--semi-color-primary, #3370ff);border-radius:50%;animation:chipSpin .6s linear infinite;flex-shrink:0}[data-slot=attachment-error-badge]{width:1rem;height:1rem;border-radius:50%;border:none;background:var(--semi-color-danger, #f53f3f);color:#fff;font-size:.625rem;font-weight:700;line-height:1;cursor:pointer;display:grid;place-items:center;flex-shrink:0}[data-slot=attachment-file-chip][data-status=error],[data-slot=attachment-thumb][data-status=error]{border-color:var(--semi-color-danger, #f53f3f)}[data-slot=attachment-file-error]{font-size:.5625rem;color:var(--semi-color-danger, #f53f3f)}[data-slot=skill-wrap]{position:relative}[data-slot=skill-trigger]{width:var(--composer-control-size);height:var(--composer-control-size);border-radius:.375rem;border:none;background:transparent;color:var(--semi-color-text-2, #4e5969);display:grid;place-items:center;cursor:pointer;transition:background .12s,color .12s}[data-slot=skill-trigger]:hover{background:var(--semi-color-fill-0, #f5f5f5);color:var(--semi-color-primary, #3370ff)}[data-slot=skill-panel]{position:absolute;bottom:calc(100% + 6px);left:0;min-width:11rem;max-height:24rem;overflow-y:auto;background:var(--semi-color-bg-0, #fff);border:1px solid var(--semi-color-border, #e0e0e0);border-radius:.5rem;box-shadow:0 4px 16px #00000014;padding:.25rem;z-index:60;animation:skillSlideUp .12s ease-out}@keyframes skillSlideUp{0%{opacity:0;transform:translateY(4px)}to{opacity:1;transform:translateY(0)}}[data-slot=skill-section]{padding:.125rem 0}[data-slot=skill-section]+[data-slot=skill-section]{border-top:1px solid color-mix(in srgb,var(--semi-color-border, #e0e0e0) 50%,transparent);margin-top:.25rem;padding-top:.25rem}[data-slot=skill-section-title]{font-size:.625rem;font-weight:600;color:var(--semi-color-text-3, #8f959e);text-transform:uppercase;letter-spacing:.03em;padding:.25rem .5rem .125rem}[data-slot=skill-item]{display:flex;align-items:center;gap:.5rem;width:100%;padding:.375rem .5rem;border:none;border-radius:.25rem;background:transparent;color:var(--semi-color-text-0, #1c1f23);font-size:.75rem;cursor:pointer;text-align:left;transition:background .1s}[data-slot=skill-item]:hover,[data-slot=skill-item][data-focused]{background:var(--semi-color-fill-0, #f5f5f5)}[data-slot=skill-info]{display:flex;align-items:baseline;gap:.5rem;min-width:0}[data-slot=skill-name]{font-size:.75rem;font-weight:500;color:var(--semi-color-text-0, #1c1f23);flex-shrink:0}[data-slot=skill-desc]{font-size:.6875rem;color:var(--semi-color-text-2, #4e5969);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}[data-slot=skill-panel-hint]{padding:.25rem .5rem;font-size:.6875rem;color:var(--semi-color-text-2, #4e5969);border-top:1px solid color-mix(in srgb,var(--semi-color-border, #e0e0e0) 50%,transparent);margin-top:.25rem;-webkit-user-select:none;user-select:none}[data-slot=completion-drawer]{position:relative;width:100%;max-height:16rem;overflow-y:auto;background:var(--semi-color-bg-0, #fff);border:1px solid var(--semi-color-border, #e0e0e0);border-radius:.5rem;box-shadow:0 4px 20px #00000014;padding:.25rem;margin-bottom:.25rem;animation:skillSlideUp .12s ease-out}[data-slot=completion-item]{display:flex;align-items:center;gap:.5rem;width:100%;padding:.375rem .5rem;border:none;border-radius:.25rem;background:transparent;cursor:pointer;text-align:left;transition:background .1s}[data-slot=completion-item]:hover,[data-slot=completion-item][data-focused]{background:var(--semi-color-fill-0, #f5f5f5)}[data-slot=completion-icon]{font-size:1rem;flex-shrink:0;width:1.25rem;text-align:center}[data-slot=completion-info]{display:flex;flex-direction:column;gap:1px;min-width:0}[data-slot=completion-title]{font-size:.75rem;font-weight:500;color:var(--semi-color-text-0, #1c1f23);font-family:monospace}[data-slot=completion-badge]{display:inline-block;margin-left:.375rem;font-size:.5625rem;font-family:sans-serif;font-weight:400;color:var(--semi-color-text-3, #8f959e);background:var(--semi-color-fill-0, #f5f5f5);padding:0 4px;border-radius:3px;vertical-align:middle}[data-slot=completion-desc]{font-size:.6875rem;color:var(--semi-color-text-3, #8f959e);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}[data-slot=context-menu-wrap]{position:relative}[data-slot=context-menu]{position:absolute;bottom:calc(100% + 6px);left:0;min-width:11rem;background:var(--semi-color-bg-0, #fff);border:1px solid var(--semi-color-border, #e0e0e0);border-radius:.5rem;box-shadow:0 4px 16px #00000014;padding:.25rem;z-index:60;animation:skillSlideUp .12s ease-out}[data-slot=context-menu-title]{padding:.25rem .5rem .125rem;font-size:.625rem;font-weight:600;color:var(--semi-color-text-3, #8f959e);text-transform:uppercase;letter-spacing:.03em;-webkit-user-select:none;user-select:none}[data-slot=context-menu-item]{display:flex;align-items:center;gap:.5rem;width:100%;padding:.375rem .5rem;border:none;border-radius:.25rem;background:transparent;color:var(--semi-color-text-0, #1c1f23);font-size:.75rem;cursor:pointer;text-align:left;transition:background .1s}[data-slot=context-menu-item]:hover{background:var(--semi-color-fill-0, #f5f5f5)}[data-slot=context-menu-icon]{display:inline-flex;align-items:center;color:var(--semi-color-text-2, #4e5969)}[data-slot=context-menu-label]{flex:1}[data-slot=context-menu-separator]{display:block;height:1px;margin:.25rem .5rem;background:var(--semi-color-border, #e0e0e0)}[data-slot=context-menu-hint]{padding:.25rem .5rem;font-size:.6875rem;color:var(--semi-color-text-2, #4e5969);border-top:1px solid color-mix(in srgb,var(--semi-color-border, #e0e0e0) 50%,transparent);margin-top:.25rem;-webkit-user-select:none;user-select:none}[data-slot=empty-state-root]{display:flex;flex-direction:column;align-items:flex-start;padding-bottom:1rem;gap:1.25rem}[data-slot=empty-state-wordmark]{display:flex;align-items:center;padding-left:1px}[data-slot=empty-state-wordmark] img{height:4rem;width:auto}.empty-state-wordmark-dark,[data-appearance=dark] .empty-state-wordmark-light{display:none}[data-appearance=dark] .empty-state-wordmark-dark{display:block}[data-slot=empty-state-presets]{display:flex;flex-wrap:wrap;align-items:center;justify-content:flex-start;gap:.5rem}.empty-state-preset-btn{display:inline-flex;align-items:center;gap:6px;padding:.375rem .625rem;border:1px solid var(--semi-color-border);border-radius:6px;background:none;color:var(--ui-text-secondary);font-size:.8125rem;font-weight:500;line-height:1;cursor:pointer;-webkit-user-select:none;user-select:none;transition:background .15s,box-shadow .15s}.empty-state-preset-btn:hover{background:color-mix(in srgb,var(--semi-color-primary) 4%,transparent);box-shadow:0 1px 4px color-mix(in srgb,var(--semi-color-primary) 12%,transparent)}.empty-state-preset-btn:active{background:color-mix(in srgb,var(--semi-color-primary) 8%,transparent)}.empty-state-preset-icon{display:flex;align-items:center;color:var(--foreground)}.chat-view-root[data-empty]{display:flex;flex-direction:column;align-items:center;justify-content:center}.chat-view-root[data-empty] [data-slot=empty-state-root]{width:min(var(--composer-width, 48.75rem),calc(100% - 2rem))}.chat-view-root[data-empty] [data-slot=composer-root]{position:relative;bottom:auto;left:auto;transform:none;width:min(var(--composer-width, 48.75rem),calc(100% - 2rem))}.chat-view-root[data-empty] [data-slot=composer-root]:before{display:none}.chat-view-root[data-empty] [data-slot=composer-surface]{border-color:var(--semi-color-primary)!important;box-shadow:0 0 20px color-mix(in srgb,var(--semi-color-primary) 12%,transparent),0 0 50px -4px color-mix(in srgb,var(--semi-color-primary) 8%,transparent)!important}.chat-view-root{position:relative;width:100%;height:100%;min-height:0;overflow:hidden}.ga-chat-offline{display:flex;align-items:center;justify-content:center;height:100%;color:var(--semi-color-text-2);font-size:14px}.ga-app-layout{position:relative;width:100vw;height:100vh;overflow:hidden;display:flex;flex-direction:column}:root{--ga-sidebar-top-padding: 36px}:root[data-platform=macos]{--ga-titlebar-height: 38px;--ga-titlebar-controls-left: 72px;--ga-titlebar-controls-top: 6px;--ga-sidebar-top-padding: 36px}:root[data-platform=windows]{--ga-sidebar-top-padding: 8px}:root[data-platform=windows] .ga-titlebar-controls{left:8px;top:2px}.ga-titlebar-controls{position:absolute;top:var(--ga-titlebar-controls-top, 8px);left:12px;z-index:999;display:flex;align-items:center;gap:2px}:root[data-platform=macos] .ga-titlebar-controls{left:var(--ga-titlebar-controls-left, 72px)}.ga-titlebar-btn{display:flex;align-items:center;justify-content:center;width:28px;height:28px;border:none;border-radius:6px;background:none;color:var(--ui-text-tertiary);cursor:pointer;transition:color .1s,background .1s;-webkit-app-region:no-drag}.ga-titlebar-btn:hover{background:var(--ui-control-hover-background);color:var(--foreground)}.ga-app-body{flex:1;min-height:0;overflow:hidden}.ga-app-body .semi-resizable-group{height:100%}.ga-body-collapsed{height:100%;display:flex;flex-direction:column;background:var(--background)}.ga-sidebar-item{display:flex;flex-direction:column;border-right:1px solid var(--semi-color-border);background:var(--ui-sidebar-surface-background)}.ga-left-sidebar{display:flex;flex-direction:column;height:100%;padding:var(--ga-sidebar-top-padding, 36px) 0 0}.ga-sidebar-brand{flex-shrink:0;padding:8px 10px 12px;display:flex;flex-direction:column;gap:2px}.ga-brand-title{font-size:13px;font-weight:600;color:var(--semi-color-text-0)}.ga-brand-sub{font-size:10px;color:var(--semi-color-text-2)}.ga-nav-rail{flex-shrink:0;display:flex;flex-direction:column;gap:1px;padding:0 10px}.ga-nav-btn{display:flex;align-items:center;width:100%;gap:8px;height:28px;padding:0 8px;border:1px solid transparent;border-radius:6px;background:none;color:var(--ui-text-secondary);font-size:.8125rem;font-weight:500;line-height:1;text-align:left;cursor:pointer;transition:color .1s ease-out,background .1s ease-out;-webkit-app-region:no-drag}.ga-nav-label{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.ga-nav-icon{flex-shrink:0;color:var(--ui-icon-nav)}.ga-nav-btn:hover{background:var(--ui-control-hover-background);color:var(--foreground);transition:none}.ga-nav-btn:hover .ga-nav-icon{color:var(--ui-icon-nav-active)}.ga-nav-btn.active{background:var(--ui-control-active-background);border-color:var(--ui-stroke-tertiary);color:var(--foreground);box-shadow:none}.ga-nav-btn.active .ga-nav-icon{color:var(--ui-icon-nav-active)}.ga-sidebar-search{flex-shrink:0;padding:4px 10px}.ga-sidebar-search .semi-input-wrapper{border-radius:6px;border-color:transparent;background:var(--ui-control-hover-background);height:24px;font-size:.75rem}.ga-sidebar-search .semi-input-wrapper:hover{border-color:transparent;background:var(--ui-row-hover-background)}.ga-sidebar-search .semi-input-wrapper-focus{border-color:var(--ui-accent);background:transparent}.ga-sidebar-search .semi-input{font-size:.75rem}.ga-sidebar-search .semi-input-prefix{opacity:.5}.ga-session-section{flex:1;min-height:0;overflow-y:auto;padding:4px 10px;display:flex;flex-direction:column;gap:1px}.ga-session-section::-webkit-scrollbar{width:4px}.ga-session-section::-webkit-scrollbar-track{margin:8px 0}.ga-session-section::-webkit-scrollbar-thumb{background:transparent;border-radius:2px}.ga-session-section:hover::-webkit-scrollbar-thumb{background:var(--semi-color-fill-2)}.ga-session-section:hover::-webkit-scrollbar-thumb:hover{background:var(--semi-color-fill-1)}.ga-session-empty{flex:1;display:flex;align-items:center;justify-content:center;color:var(--semi-color-text-3);font-size:12px}.ga-session-list{display:flex;flex-direction:column;gap:1px}.ga-session-item{position:relative;display:flex;align-items:center;width:100%;min-height:26px;padding:0;border:none;border-radius:6px;background:none;cursor:pointer;text-align:left;transition:background .1s ease-out}.ga-session-item:hover{background:var(--ui-row-hover-background)}.ga-session-item.active{background:var(--ui-row-active-background)}.ga-session-content{display:flex;align-items:center;gap:6px;padding:2px 8px;min-width:0;flex:1;transition:padding-right .1s ease-out}.ga-session-item:hover .ga-session-content{padding-right:48px}.ga-status-dot{width:4px;height:4px;border-radius:50%;background:var(--ui-text-quaternary);flex-shrink:0}.ga-status-dot.working{width:6px;height:6px;background:var(--ui-accent);position:relative}.ga-status-dot.working:after{content:"";position:absolute;top:0;right:0;bottom:0;left:0;border-radius:50%;background:var(--ui-accent);animation:ga-ping 1.5s cubic-bezier(0,0,.2,1) infinite}@keyframes ga-ping{75%,to{transform:scale(2);opacity:0}}.ga-session-title{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:.8125rem;color:var(--ui-text-secondary);line-height:1.4}.ga-session-item:hover .ga-session-title,.ga-session-item.active .ga-session-title{color:var(--foreground)}.ga-session-age{position:absolute;right:24px;top:50%;transform:translateY(-50%);font-size:.625rem;color:var(--ui-text-tertiary);opacity:0;transition:opacity .15s;pointer-events:none}.ga-session-item:hover .ga-session-age{opacity:1}.ga-session-actions{position:absolute;right:4px;top:50%;transform:translateY(-50%);display:flex;align-items:center;justify-content:center;opacity:0;transition:opacity .1s}.ga-session-item:hover .ga-session-actions,.ga-session-actions.menu-open{opacity:1}.ga-session-actions-btn{display:flex;align-items:center;justify-content:center;width:18px;height:18px;border:none;border-radius:3px;background:none;color:var(--ui-text-tertiary);cursor:pointer;transition:color .1s,background .1s}.ga-session-actions-btn:hover{background:var(--ui-control-active-background);color:var(--foreground)}.ga-session-rename-input{flex:1;min-width:0;height:20px;padding:0 4px;border:1px solid var(--ui-accent);border-radius:4px;background:var(--semi-color-bg-0);color:var(--foreground);font-size:.8125rem;font-family:inherit;outline:none}.ga-session-pin-icon{position:absolute;right:8px;top:50%;transform:translateY(-50%);display:flex;align-items:center;color:var(--ui-text-quaternary);opacity:1;transition:opacity .1s;pointer-events:none}.ga-session-item:hover .ga-session-pin-icon{opacity:0}.ga-session-menu.semi-dropdown-menu{min-width:140px;padding:4px}.ga-session-menu .semi-dropdown-item{display:flex;align-items:center;gap:8px;height:28px;padding:0 8px;border-radius:4px;font-size:.8125rem;font-weight:400;color:var(--ui-text-secondary)}.ga-session-menu .semi-dropdown-item:hover{background:var(--ui-control-hover-background);color:var(--foreground)}.ga-session-menu .semi-dropdown-item-danger{color:var(--semi-color-danger)}.ga-session-menu .semi-dropdown-item-danger:hover{color:var(--semi-color-danger);background:var(--ui-control-hover-background)}.ga-section-header{display:flex;align-items:center;gap:4px;padding:6px 8px 4px;border:none;background:none;cursor:pointer;width:100%}.ga-section-dot{width:8px;height:8px;border-radius:1px;background:var(--theme-primary);flex-shrink:0}.ga-section-label{font-size:.64rem;font-weight:600;text-transform:uppercase;letter-spacing:.16em;color:var(--theme-primary);line-height:1}.ga-section-count{font-size:.6875rem;font-weight:500;color:var(--ui-text-quaternary);line-height:1}.ga-section-chevron{color:var(--ui-text-tertiary);opacity:0;transition:opacity .15s,transform .15s;display:flex;align-items:center}.ga-section-header:hover .ga-section-chevron{opacity:1}.ga-section-chevron.open{transform:rotate(90deg)}.ga-section-action{margin-left:auto;display:flex;align-items:center;justify-content:center;width:18px;height:18px;border:none;border-radius:4px;background:none;color:var(--ui-text-tertiary);cursor:pointer;opacity:0;transition:opacity .15s,background .1s}.ga-section-header:hover .ga-section-action{opacity:1}.ga-section-action:hover{background:var(--ui-control-hover-background);color:var(--foreground)}.ga-sidebar-footer{flex-shrink:0;padding:4px 10px 6px;border-top:1px solid transparent;display:flex;align-items:center;gap:2px}.ga-sidebar-footer-btn{display:flex;align-items:center;justify-content:center;width:28px;height:28px;border:none;background:none;color:var(--semi-color-text-1);cursor:pointer;padding:0;border-radius:4px}.ga-sidebar-footer-btn:hover{background:var(--semi-color-fill-0)}.ga-sidebar-footer-btn:focus-visible{outline:2px solid var(--semi-color-primary-light-active);outline-offset:1px}.ga-sidebar-footer-anchor{position:relative;display:flex}.ga-main-item{display:flex;flex-direction:column;min-height:0;background:var(--background)}.ga-main-area{flex:1;min-height:0;display:flex;align-items:center;justify-content:center;padding:24px}.ga-main-area.ga-main-chat{padding:0;align-items:stretch}.ga-main-area.ga-main-full{padding:0;align-items:stretch;justify-content:stretch}:root[data-platform=macos] .ga-body-collapsed .ga-main-area.ga-main-full{padding-top:var(--ga-titlebar-height, 38px)}.ga-main-placeholder{text-align:center;color:var(--semi-color-text-2)}.ga-main-placeholder h2{margin:0 0 8px;font-size:20px;color:var(--semi-color-text-0)}.ga-main-placeholder p{margin:4px 0;font-size:14px}.ga-placeholder-hint{margin-top:16px!important;font-size:12px!important;color:var(--semi-color-text-3)!important;font-style:italic}.ga-app-body .semi-resizable-handler{width:2px;background:transparent;transition:background .15s}.ga-app-body .semi-resizable-handler:hover{background:var(--semi-color-primary)}.ga-app-body .semi-resizable-handler .semi-icon{display:none}.ga-statusbar{height:20px;display:flex;justify-content:space-between;align-items:stretch;gap:8px;border-top:1px solid var(--ui-stroke-tertiary);background:var(--ui-sidebar-surface-background);padding:0 4px;color:var(--ui-text-tertiary);flex-shrink:0;-webkit-app-region:no-drag}.ga-statusbar-group{display:flex;min-width:0;align-items:stretch;gap:2px}.ga-statusbar-item{display:inline-flex;align-items:center;height:100%;gap:4px;padding:0 6px;font-size:.6875rem;color:inherit;border:none;border-radius:0;background:none;text-decoration:none;cursor:default;transition:color .1s,background .1s}.ga-statusbar-item.action,.ga-statusbar-item.menu,.ga-statusbar-item.link{cursor:pointer}.ga-statusbar-item.action:hover,.ga-statusbar-item.menu:hover,.ga-statusbar-item.link:hover{color:var(--foreground);background:var(--chrome-action-hover)}.ga-statusbar-item.disabled{opacity:.45;cursor:default}.ga-statusbar-item.disabled:hover{color:inherit;background:none}.ga-statusbar-label{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.ga-statusbar-detail{color:var(--ui-text-quaternary)}.ga-statusbar-icon{display:flex;align-items:center;flex-shrink:0}.ga-statusbar-spinner{animation:ga-spin 1s linear infinite}@keyframes ga-spin{to{transform:rotate(360deg)}}.ga-statusbar-dot--pulse{animation:ga-dot-pulse 1.2s ease-in-out infinite}@keyframes ga-dot-pulse{0%,to{opacity:1}50%{opacity:.35}}.ga-statusbar-menu-anchor{position:relative}.ga-bridge-panel{position:absolute;bottom:calc(100% + 6px);left:0;min-width:20rem;background:var(--semi-color-bg-0, #fff);border:1px solid var(--ui-stroke-secondary);border-radius:.5rem;box-shadow:0 4px 16px #00000014;-webkit-backdrop-filter:blur(12px) saturate(1.08);backdrop-filter:blur(12px) saturate(1.08);z-index:200;animation:ga-panel-slide-up .12s ease-out;font-size:.875rem}@keyframes ga-panel-slide-up{0%{opacity:0;transform:translateY(4px)}to{opacity:1;transform:translateY(0)}}.ga-bridge-panel-header{display:flex;align-items:center;justify-content:space-between;gap:.75rem;padding:.375rem .625rem}.ga-bridge-panel-status-rows{display:flex;flex-direction:column;gap:.25rem;min-width:0;font-size:.7rem;line-height:1}.ga-bridge-panel-row{display:flex;align-items:center;gap:.375rem}.ga-bridge-panel-row--primary{font-weight:500;color:var(--foreground)}.ga-bridge-panel-row--secondary{color:var(--ui-text-tertiary)}.ga-bridge-panel-actions{display:flex;align-items:center;gap:2px;flex-shrink:0}.ga-bridge-panel-action-btn{width:1.5rem;height:1.5rem;border:none;border-radius:4px;background:transparent;color:var(--ui-text-tertiary);display:grid;place-items:center;cursor:pointer;transition:background .1s,color .1s}.ga-bridge-panel-action-btn:hover{background:var(--chrome-action-hover);color:var(--foreground)}.ga-bridge-panel-section{border-top:1px solid color-mix(in srgb,var(--semi-color-border, #e0e0e0) 50%,transparent);padding:.375rem .625rem}.ga-panel-section-label{font-size:.62rem;font-weight:600;text-transform:uppercase;letter-spacing:.14em;color:color-mix(in srgb,var(--ui-text-tertiary) 80%,transparent);margin-bottom:.25rem;-webkit-user-select:none;user-select:none}.ga-bridge-panel-list{list-style:none;display:flex;flex-direction:column;gap:.25rem;margin-top:.375rem}.ga-bridge-panel-list-item{display:flex;align-items:center;justify-content:space-between;gap:.5rem;font-size:.75rem}.ga-bridge-panel-svc-name{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;text-transform:capitalize;color:var(--foreground)}.ga-bridge-panel-svc-state{display:flex;align-items:center;gap:.375rem;font-size:.66rem;color:var(--ui-text-tertiary);flex-shrink:0}.ga-bridge-panel-svc-err{color:#ef4444;font-weight:700;font-size:.625rem}.ga-bridge-panel-section-head{display:flex;align-items:center;justify-content:space-between;gap:.5rem}.ga-bridge-panel-link-btn{border:none;background:none;color:var(--ui-text-tertiary);font-size:.625rem;font-weight:500;cursor:pointer;padding:0;white-space:nowrap;transition:color .1s}.ga-bridge-panel-link-btn:hover{color:var(--foreground)}.ga-bridge-panel-log{margin-top:.25rem;max-height:8rem;border:none;padding:0}.ga-bridge-panel-tabs{display:flex;gap:2px;margin-bottom:.375rem}.ga-bridge-panel-tab{border:none;background:none;padding:.125rem .375rem;font-size:.625rem;font-weight:500;color:var(--ui-text-tertiary);border-radius:3px;cursor:pointer;transition:color .1s,background .1s}.ga-bridge-panel-tab:hover{color:var(--foreground);background:var(--chrome-action-hover)}.ga-bridge-panel-tab.active{color:var(--foreground);background:color-mix(in srgb,var(--ui-accent) 12%,transparent)}.ga-bridge-panel-section-foot{display:flex;align-items:center;justify-content:space-between;margin-top:.25rem;min-height:1rem}.ga-bridge-panel-truncated{font-size:.585rem;color:var(--ui-text-quaternary)}.ga-bridge-panel-log-empty{margin-top:.25rem;font-size:.6875rem;color:var(--ui-text-quaternary);font-style:italic}.ga-conductor-panel-stats{display:flex;align-items:center;gap:.25rem;flex-shrink:0}.ga-conductor-stat{display:inline-flex;align-items:center;justify-content:center;min-width:1rem;height:1rem;padding:0 .25rem;border-radius:.5rem;font-size:.6rem;font-weight:700;line-height:1}.ga-conductor-stat--run{background:color-mix(in srgb,var(--ui-accent, #0053fd) 12%,transparent);color:var(--ui-accent, #0053fd)}.ga-conductor-stat--done{background:color-mix(in srgb,#10b981 12%,transparent);color:#059669}.ga-conductor-stat--fail{background:color-mix(in srgb,#ef4444 12%,transparent);color:#dc2626}.ga-notification-stack{position:fixed;z-index:200;display:flex;flex-direction:column;gap:8px;pointer-events:none;max-width:360px}.ga-notification-stack--top{top:48px;left:50%;transform:translate(-50%)}.ga-notification-stack--bottom{bottom:24px;right:24px}.ga-notification{pointer-events:auto;display:flex;align-items:flex-start;gap:8px;padding:10px 14px;border-radius:8px;background:var(--semi-color-bg-3);box-shadow:var(--semi-shadow-elevated);font-size:13px;line-height:1.4;animation:notif-slide-in .2s ease-out}.ga-notification--error{border-left:3px solid var(--semi-color-danger)}.ga-notification--warning{border-left:3px solid var(--semi-color-warning)}.ga-notification--success{border-left:3px solid var(--semi-color-success)}.ga-notification--info{border-left:3px solid var(--semi-color-primary)}.ga-notification-body{flex:1;min-width:0}.ga-notification-title{font-weight:600;margin-bottom:2px}.ga-notification-message{color:var(--semi-color-text-1);word-break:break-word}.ga-notification-action{margin-top:6px;padding:2px 8px;border:1px solid var(--semi-color-border);border-radius:4px;background:transparent;color:var(--semi-color-primary);font-size:12px;cursor:pointer}.ga-notification-action:hover{background:var(--semi-color-fill-0)}.ga-notification-dismiss{flex-shrink:0;display:flex;align-items:center;justify-content:center;width:20px;height:20px;border:none;background:transparent;color:var(--semi-color-text-2);cursor:pointer;border-radius:4px}.ga-notification-dismiss:hover{background:var(--semi-color-fill-1)}@keyframes notif-slide-in{0%{opacity:0;transform:translateY(-8px)}to{opacity:1;transform:translateY(0)}}.ga-settings-dialog .semi-modal-content{padding-left:24px;padding-right:0;max-height:85vh;display:flex;flex-direction:column}.ga-settings-dialog .semi-modal-header{padding-right:24px;flex-shrink:0}.ga-settings-dialog .semi-modal-body{padding:8px 24px 8px 0;overflow-y:auto;flex:1;min-height:0}.ga-set-block{padding:16px 0;border-bottom:1px solid var(--semi-color-border, #e8e8e8)}.ga-set-block:last-child{border-bottom:none}.ga-set-sec-heading{display:flex;align-items:center;gap:6px;margin:0 0 12px}.ga-set-sec-t{margin:0;font-size:16px;line-height:24px;font-weight:600;color:var(--semi-color-text-0, #1c1f23)}.ga-settings-section-help{display:inline-flex;align-items:center;justify-content:center;color:var(--semi-color-text-2, #646a73);cursor:help}.ga-settings-section-help:focus-visible,.ga-mixin-label:focus-visible,.ga-connection-card-title:focus-visible,.ga-connection-status-label:focus-visible{border-radius:2px;outline:2px solid var(--semi-color-primary-light-active, #94bfff);outline-offset:2px}.ga-font-slider-row{display:flex;align-items:center;gap:12px}.ga-font-value{font-size:13px;color:var(--semi-color-text-2, #646a73);min-width:36px;text-align:right}.ga-mixin-group{margin-bottom:12px;border:1px solid var(--semi-color-border, #e8e8e8);border-radius:8px;overflow:hidden}.ga-mixin-head{display:flex;align-items:center;gap:8px;padding:8px 10px;cursor:pointer;transition:background .15s}.ga-mixin-head:hover{background:var(--semi-color-fill-0, #f5f5f5)}.ga-mixin-head--active{background:var(--semi-color-primary-light-default, #e8f3ff)}.ga-mixin-toggle{display:flex;align-items:center;justify-content:center;width:20px;height:20px;border:none;background:none;padding:0;cursor:pointer;color:var(--semi-color-text-2, #646a73);border-radius:4px}.ga-mixin-toggle:hover{background:var(--semi-color-fill-1, #eee)}.ga-mixin-label{font-size:14px;font-weight:500;flex:1;cursor:help}.ga-mixin-body{border-top:1px solid var(--semi-color-border, #e8e8e8);padding:6px 0}.ga-mixin-empty{padding:8px 16px;font-size:12px;color:var(--semi-color-text-2, #646a73)}.ga-mixin-members{display:flex;flex-direction:column}.ga-mixin-member{display:flex;align-items:center;gap:8px;padding:4px 12px;font-size:13px}.ga-mixin-member:hover .ga-mixin-member-actions{opacity:1}.ga-mixin-member-rank{width:18px;height:18px;display:flex;align-items:center;justify-content:center;border-radius:4px;background:var(--semi-color-fill-0, #f5f5f5);font-size:11px;font-weight:600;color:var(--semi-color-text-2, #646a73);flex-shrink:0}.ga-mixin-member-name{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.ga-mixin-member-actions{display:flex;gap:2px;opacity:0;transition:opacity .15s}.ga-icon-btn{display:flex;align-items:center;justify-content:center;width:22px;height:22px;border:none;background:none;border-radius:4px;cursor:pointer;font-size:13px;color:var(--semi-color-text-2, #646a73)}.ga-icon-btn:hover:not(:disabled){background:var(--semi-color-fill-1, #eee);color:var(--semi-color-text-0, #1c1f23)}.ga-icon-btn:disabled{opacity:.3;cursor:default}.ga-icon-btn--danger:hover:not(:disabled){background:var(--semi-color-danger-light-default, #fee);color:var(--semi-color-danger, #f93920)}.ga-mixin-hint{padding:4px 16px;font-size:11px;color:var(--semi-color-text-3, #8f959e)}.ga-model-list{display:flex;flex-direction:column;gap:2px;margin-bottom:8px}.ga-model-item{display:flex;align-items:center;justify-content:space-between;padding:6px 8px;border-radius:6px;cursor:pointer;transition:background .15s}.ga-model-item:hover{background:var(--semi-color-fill-0, #f5f5f5)}.ga-model-item--selected{background:var(--semi-color-primary-light-default, #e8f3ff)}.ga-model-row-content{display:flex;align-items:center;gap:8px;min-width:0}.ga-model-name{font-size:14px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.ga-model-actions{display:flex;gap:2px;flex-shrink:0;opacity:0;transition:opacity .15s}.ga-model-item:hover .ga-model-actions{opacity:1}.ga-model-empty{padding:12px 8px;font-size:13px;color:var(--semi-color-text-2, #646a73);text-align:center}.ga-add-model-btn{margin-top:4px}.ga-data-row{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:8px 0}.ga-data-row-info{flex:1;min-width:0}.ga-data-row-label{font-size:14px;font-weight:500;color:var(--semi-color-text-0, #1c1f23);cursor:help;border-radius:2px}.ga-data-row-label:focus-visible{outline:2px solid var(--semi-color-primary-light-active, #94bfff);outline-offset:2px}.ga-data-action.semi-button{font-size:13px;font-weight:500}.ga-data-divider{height:1px;background:var(--semi-color-border, #e8e8e8);margin:8px 0}.ga-data-confirm-summary{display:flex;flex-direction:column;gap:10px}.ga-data-confirm-summary>div{display:grid;grid-template-columns:88px minmax(0,1fr);align-items:start;gap:12px;font-size:13px}.ga-data-confirm-summary span{color:var(--semi-color-text-2, #646a73)}.ga-data-confirm-summary strong{overflow-wrap:anywhere;font-weight:500}.ga-data-confirm-summary p,.ga-data-source-description,.ga-data-maintenance-note{margin:4px 0 0;color:var(--semi-color-text-2, #646a73);font-size:13px;line-height:1.6}.ga-data-maintenance-note[role=status]{color:var(--semi-color-warning, #d99200)}.ga-data-source-actions{display:flex;justify-content:flex-end;flex-wrap:wrap;gap:8px}.ga-data-export-path{display:block;width:100%;margin-top:10px;padding:10px 12px;border-radius:6px;background:var(--semi-color-fill-0, #f5f5f5);font-family:var(--font-mono, ui-monospace, SFMono-Regular, monospace);font-size:12px;line-height:1.5;white-space:normal;overflow-wrap:anywhere;word-break:break-word;box-sizing:border-box}.ga-data-export-path--inline{margin-top:0}.ga-source-dot{width:6px;height:6px;border-radius:50%;flex-shrink:0}.ga-source-dot--on{background:#10b981}.ga-source-dot--switching{background:var(--semi-color-primary, #3370ff);animation:ga-source-pulse 1.2s ease-in-out infinite}.ga-source-dot--unavailable{background:var(--semi-color-text-3, #8f959e)}@keyframes ga-source-pulse{0%,to{opacity:1;transform:scale(1)}50%{opacity:.4;transform:scale(.85)}}.ga-connection-description{margin:0 0 12px;color:var(--semi-color-text-2, #646a73);font-size:14px;line-height:1.6}.ga-connection-mode-grid.semi-radioGroup{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));width:100%;gap:12px}.ga-connection-mode-card.semi-radio{width:100%;min-width:0;margin:0;box-sizing:border-box}.ga-connection-card-title{display:inline-flex;align-items:center;flex-wrap:wrap;gap:8px;cursor:help}.ga-connection-repository-detail{margin-top:12px;padding:10px 12px;border:1px solid var(--semi-color-border, #e8e8e8);border-radius:8px;background:var(--semi-color-fill-0, #f7f8fa)}.ga-connection-repository-header{display:flex;align-items:center;justify-content:space-between;gap:12px;color:var(--semi-color-text-1, #35383e);font-size:12px;font-weight:500}.ga-connection-path{display:block;width:100%;margin-top:8px;color:var(--semi-color-text-2, #646a73);font-family:var(--font-mono, ui-monospace, SFMono-Regular, monospace);font-size:12px;line-height:1.5;white-space:normal;overflow-wrap:anywhere;word-break:break-word;box-sizing:border-box}.ga-connection-apply-row{display:flex;align-items:center;justify-content:flex-end;margin-top:12px;gap:8px}.ga-connection-apply-note{flex:1;color:var(--semi-color-warning, #d46b08);font-size:12px;line-height:1.5}.ga-connection-status-row{display:flex;align-items:center;justify-content:space-between;gap:12px;margin-top:12px;padding-top:12px;border-top:1px solid var(--semi-color-border, #e8e8e8)}.ga-connection-status-copy{display:flex;align-items:center;flex-wrap:wrap;gap:8px;min-width:0;color:var(--semi-color-text-2, #646a73);font-size:12px}.ga-connection-status-copy strong{color:var(--semi-color-text-0, #1c1f23);font-weight:500}.ga-connection-status-label{cursor:help}@media(max-width:700px){.ga-connection-mode-grid.semi-radioGroup{grid-template-columns:minmax(0,1fr)}.ga-connection-status-row,.ga-connection-repository-header{align-items:flex-start;flex-direction:column}}.ga-form{display:flex;flex-direction:column;gap:16px}.ga-form-field{display:flex;flex-direction:column;gap:4px}.ga-form-label{font-size:13px;font-weight:500;color:var(--semi-color-text-0, #1c1f23)}.ga-form-req{color:var(--semi-color-danger, #f93920);margin-left:2px}.ga-route-picker{display:flex;gap:8px;margin-bottom:16px}.ga-route-btn{flex:1;padding:10px 12px;border:1px solid var(--semi-color-border, #e0e0e0);border-radius:8px;background:var(--semi-color-bg-0, #fff);font-size:13px;font-weight:500;cursor:pointer;text-align:center;transition:border-color .12s,background .12s}.ga-route-btn:hover{border-color:var(--semi-color-primary, #3370ff);background:color-mix(in srgb,var(--semi-color-primary, #3370ff) 4%,transparent)}.ga-route-btn--active{border-color:var(--semi-color-primary, #3370ff);background:color-mix(in srgb,var(--semi-color-primary, #3370ff) 8%,transparent);color:var(--semi-color-primary, #3370ff)}.ga-provider-list{display:flex;flex-direction:column;gap:8px;margin-top:8px}.ga-provider-card{display:flex;align-items:center;gap:10px;padding:12px 14px;border:1px solid var(--semi-color-border, #e0e0e0);border-radius:8px;background:var(--semi-color-bg-0, #fff);cursor:pointer;transition:border-color .12s,box-shadow .12s;width:100%;text-align:left}.ga-provider-card:hover{border-color:var(--provider-color, var(--semi-color-primary));box-shadow:0 2px 8px color-mix(in srgb,var(--provider-color, #3370ff) 12%,transparent)}.ga-provider-card-icon{flex-shrink:0}.ga-provider-card-body{flex:1;display:flex;flex-direction:column;gap:2px;min-width:0}.ga-provider-card-label{font-size:13px;font-weight:600;color:var(--semi-color-text-0, #1c1f23)}.ga-provider-card-desc{font-size:11px;color:var(--semi-color-text-2, #4e5969)}.ga-provider-card-caret{font-size:16px;color:var(--semi-color-text-3, #8f959e);flex-shrink:0}.ga-form-row{display:flex;gap:12px}.ga-form-row>.ga-form-field{flex:1;min-width:0}.ga-form-advanced-toggle{display:flex;align-items:center;gap:4px;padding:0;border:none;background:none;font-size:12px;color:var(--semi-color-text-2, #4e5969);cursor:pointer;margin-top:4px}.ga-form-advanced-toggle:hover{color:var(--semi-color-text-0, #1c1f23)}.ga-form-advanced-toggle svg{transition:transform .15s}.ga-form-advanced-toggle[data-expanded] svg{transform:rotate(90deg)}.ga-form-advanced-body{margin-top:12px}.ga-form-back{display:inline-flex;align-items:center;gap:4px;padding:0;border:none;background:none;font-size:12px;color:var(--semi-color-text-2, #4e5969);cursor:pointer;margin-bottom:12px}.ga-form-back:hover{color:var(--semi-color-primary, #3370ff)}.ga-form-key-link{font-size:11px;color:var(--semi-color-primary, #3370ff);text-decoration:none;margin-left:8px;font-weight:400}.ga-form-key-link:hover{text-decoration:underline}.ga-form-locked-hint{font-size:11px;color:var(--semi-color-text-3, #8f959e);margin-top:2px}.ga-help-feedback-section .ga-set-sec-heading{margin-bottom:6px}.ga-help-feedback-collapse .semi-collapse-header{margin:0;padding:10px 0}.ga-help-feedback-collapse .semi-collapse-content{padding:2px 0 12px}.ga-help-feedback-resource{display:flex;flex-direction:column;align-items:flex-start;gap:8px}.ga-help-feedback-resource p{color:var(--semi-color-text-2, #646a73);font-size:14px;line-height:1.6}.ga-help-feedback-link{display:inline-flex;align-items:center;gap:4px;color:var(--semi-color-link, #3370ff);font-size:13px;font-weight:500;line-height:20px;text-decoration:none}.ga-help-feedback-link:hover{color:var(--semi-color-link-hover, #1c53c7);text-decoration:underline}.ga-help-feedback-link:focus-visible{border-radius:2px;outline:2px solid var(--semi-color-primary-light-active, #94bfff);outline-offset:2px}.ga-help-feedback-description{margin:0 0 8px;color:var(--semi-color-text-2, #646a73);font-size:14px;line-height:1.6;overflow-wrap:anywhere}.ga-help-feedback-list{display:flex;flex-direction:column;gap:6px}.ga-help-feedback-row{display:flex;align-items:center;justify-content:space-between;gap:12px;min-width:0;padding:6px 8px;border-radius:6px;background:var(--semi-color-fill-0, #f5f5f5)}.ga-help-feedback-contact{display:flex;align-items:center;gap:8px;min-width:0}.ga-help-feedback-wechat-icon{width:18px;height:18px;flex-shrink:0;fill:#07c160}.ga-help-feedback-id{min-width:0;color:var(--semi-color-text-0, #1c1f23);font-family:var(--font-mono, ui-monospace, SFMono-Regular, monospace);font-size:14px;overflow-wrap:anywhere}.ga-help-feedback-row .semi-button{flex-shrink:0} diff --git a/frontends/desktop/dist/assets/markdown-preprocess-Bvg4n8KE.js b/frontends/desktop/dist/assets/markdown-preprocess-Bvg4n8KE.js new file mode 100644 index 000000000..7c6a432ec --- /dev/null +++ b/frontends/desktop/dist/assets/markdown-preprocess-Bvg4n8KE.js @@ -0,0 +1,295 @@ +import{g as ml,aj as jt}from"./tauri-compat-tfiFK9EG.js";import{V as To,W as Co}from"./main-Knf6L_en.js";function br(e){return!e||typeof e!="object"?"":"position"in e||"type"in e?Ci(e.position):"start"in e||"end"in e?Ci(e):"line"in e||"column"in e?p0(e):""}function p0(e){return zi(e&&e.line)+":"+zi(e&&e.column)}function Ci(e){return p0(e&&e.start)+"-"+p0(e&&e.end)}function zi(e){return e&&typeof e=="number"?e:1}class Be extends Error{constructor(t,r,n){super(),typeof r=="string"&&(n=r,r=void 0);let i="",a={},l=!1;if(r&&("line"in r&&"column"in r?a={place:r}:"start"in r&&"end"in r?a={place:r}:"type"in r?a={ancestors:[r],place:r.position}:a={...r}),typeof t=="string"?i=t:!a.cause&&t&&(l=!0,i=t.message,a.cause=t),!a.ruleId&&!a.source&&typeof n=="string"){const o=n.indexOf(":");o===-1?a.ruleId=n:(a.source=n.slice(0,o),a.ruleId=n.slice(o+1))}if(!a.place&&a.ancestors&&a.ancestors){const o=a.ancestors[a.ancestors.length-1];o&&(a.place=o.position)}const s=a.place&&"start"in a.place?a.place.start:a.place;this.ancestors=a.ancestors||void 0,this.cause=a.cause||void 0,this.column=s?s.column:void 0,this.fatal=void 0,this.file="",this.message=i,this.line=s?s.line:void 0,this.name=br(a.place)||"1:1",this.place=a.place||void 0,this.reason=this.message,this.ruleId=a.ruleId||void 0,this.source=a.source||void 0,this.stack=l&&a.cause&&typeof a.cause.stack=="string"?a.cause.stack:"",this.actual=void 0,this.expected=void 0,this.note=void 0,this.url=void 0}}Be.prototype.file="";Be.prototype.name="";Be.prototype.reason="";Be.prototype.message="";Be.prototype.stack="";Be.prototype.column=void 0;Be.prototype.line=void 0;Be.prototype.ancestors=void 0;Be.prototype.cause=void 0;Be.prototype.fatal=void 0;Be.prototype.place=void 0;Be.prototype.ruleId=void 0;Be.prototype.source=void 0;const at={basename:zo,dirname:Mo,extname:Eo,join:Io,sep:"/"};function zo(e,t){if(t!==void 0&&typeof t!="string")throw new TypeError('"ext" argument must be a string');Mr(e);let r=0,n=-1,i=e.length,a;if(t===void 0||t.length===0||t.length>e.length){for(;i--;)if(e.codePointAt(i)===47){if(a){r=i+1;break}}else n<0&&(a=!0,n=i+1);return n<0?"":e.slice(r,n)}if(t===e)return"";let l=-1,s=t.length-1;for(;i--;)if(e.codePointAt(i)===47){if(a){r=i+1;break}}else l<0&&(a=!0,l=i+1),s>-1&&(e.codePointAt(i)===t.codePointAt(s--)?s<0&&(n=i):(s=-1,n=l));return r===n?n=l:n<0&&(n=e.length),e.slice(r,n)}function Mo(e){if(Mr(e),e.length===0)return".";let t=-1,r=e.length,n;for(;--r;)if(e.codePointAt(r)===47){if(n){t=r;break}}else n||(n=!0);return t<0?e.codePointAt(0)===47?"/":".":t===1&&e.codePointAt(0)===47?"//":e.slice(0,t)}function Eo(e){Mr(e);let t=e.length,r=-1,n=0,i=-1,a=0,l;for(;t--;){const s=e.codePointAt(t);if(s===47){if(l){n=t+1;break}continue}r<0&&(l=!0,r=t+1),s===46?i<0?i=t:a!==1&&(a=1):i>-1&&(a=-1)}return i<0||r<0||a===0||a===1&&i===r-1&&i===n+1?"":e.slice(i,r)}function Io(...e){let t=-1,r;for(;++t0&&e.codePointAt(e.length-1)===47&&(r+="/"),t?"/"+r:r}function Bo(e,t){let r="",n=0,i=-1,a=0,l=-1,s,o;for(;++l<=e.length;){if(l2){if(o=r.lastIndexOf("/"),o!==r.length-1){o<0?(r="",n=0):(r=r.slice(0,o),n=r.length-1-r.lastIndexOf("/")),i=l,a=0;continue}}else if(r.length>0){r="",n=0,i=l,a=0;continue}}t&&(r=r.length>0?r+"/..":"..",n=2)}else r.length>0?r+="/"+e.slice(i+1,l):r=e.slice(i+1,l),n=l-i-1;i=l,a=0}else s===46&&a>-1?a++:a=-1}return r}function Mr(e){if(typeof e!="string")throw new TypeError("Path must be a string. Received "+JSON.stringify(e))}const Fo={cwd:Ro};function Ro(){return"/"}function d0(e){return!!(e!==null&&typeof e=="object"&&"href"in e&&e.href&&"protocol"in e&&e.protocol&&e.auth===void 0)}function Lo(e){if(typeof e=="string")e=new URL(e);else if(!d0(e)){const t=new TypeError('The "path" argument must be of type string or an instance of URL. Received `'+e+"`");throw t.code="ERR_INVALID_ARG_TYPE",t}if(e.protocol!=="file:"){const t=new TypeError("The URL must be of scheme file");throw t.code="ERR_INVALID_URL_SCHEME",t}return No(e)}function No(e){if(e.hostname!==""){const n=new TypeError('File URL host must be "localhost" or empty on darwin');throw n.code="ERR_INVALID_FILE_URL_HOST",n}const t=e.pathname;let r=-1;for(;++r4&&r.slice(0,4)==="data"&&Wo.test(t)){if(t.charAt(4)==="-"){const a=t.slice(5).replace(Bi,Yo);n="data"+a.charAt(0).toUpperCase()+a.slice(1)}else{const a=t.slice(4);if(!Bi.test(a)){let l=a.replace(Go,Xo);l.charAt(0)!=="-"&&(l="-"+l),t="data"+l}}i=_0}return new i(n,t)}function Xo(e){return"-"+e.toLowerCase()}function Yo(e){return e.charAt(1).toUpperCase()}const kl=pl([dl,Uo,yl,bl,xl],"html"),pn=pl([dl,Vo,yl,bl,xl],"svg");function Fi(e){const t=String(e||"").trim();return t?t.split(/[ \t\n\r\f]+/g):[]}function Ko(e){return e.join(" ").trim()}var Kt={},On,Ri;function Zo(){if(Ri)return On;Ri=1;var e=/\/\*[^*]*\*+([^/*][^*]*\*+)*\//g,t=/\n/g,r=/^\s*/,n=/^(\*?[-#/*\\\w]+(\[[0-9a-z_-]+\])?)\s*/,i=/^:\s*/,a=/^((?:'(?:\\'|.)*?'|"(?:\\"|.)*?"|\([^)]*?\)|[^};])+)/,l=/^[;\s]*/,s=/^\s+|\s+$/g,o=` +`,u="/",h="*",m="",d="comment",p="declaration";function y(C,A){if(typeof C!="string")throw new TypeError("First argument must be a string");if(!C)return[];A=A||{};var z=1,I=1;function q(Y){var H=Y.match(t);H&&(z+=H.length);var ae=Y.lastIndexOf(o);I=~ae?Y.length-ae:I+Y.length}function O(){var Y={line:z,column:I};return function(H){return H.position=new M(Y),U(),H}}function M(Y){this.start=Y,this.end={line:z,column:I},this.source=A.source}M.prototype.content=C;function G(Y){var H=new Error(A.source+":"+z+":"+I+": "+Y);if(H.reason=Y,H.filename=A.source,H.line=z,H.column=I,H.source=C,!A.silent)throw H}function X(Y){var H=Y.exec(C);if(H){var ae=H[0];return q(ae),C=C.slice(ae.length),H}}function U(){X(r)}function E(Y){var H;for(Y=Y||[];H=V();)H!==!1&&Y.push(H);return Y}function V(){var Y=O();if(!(u!=C.charAt(0)||h!=C.charAt(1))){for(var H=2;m!=C.charAt(H)&&(h!=C.charAt(H)||u!=C.charAt(H+1));)++H;if(H+=2,m===C.charAt(H-1))return G("End of comment missing");var ae=C.slice(2,H-2);return I+=2,q(ae),C=C.slice(H),I+=2,Y({type:d,comment:ae})}}function $(){var Y=O(),H=X(n);if(H){if(V(),!X(i))return G("property missing ':'");var ae=X(a),pe=Y({type:p,property:w(H[0].replace(e,m)),value:ae?w(ae[0].replace(e,m)):m});return X(l),pe}}function se(){var Y=[];E(Y);for(var H;H=$();)H!==!1&&(Y.push(H),E(Y));return Y}return U(),se()}function w(C){return C?C.replace(s,m):m}return On=y,On}var Li;function Qo(){if(Li)return Kt;Li=1;var e=Kt&&Kt.__importDefault||function(n){return n&&n.__esModule?n:{default:n}};Object.defineProperty(Kt,"__esModule",{value:!0}),Kt.default=r;const t=e(Zo());function r(n,i){let a=null;if(!n||typeof n!="string")return a;const l=(0,t.default)(n),s=typeof i=="function";return l.forEach(o=>{if(o.type!=="declaration")return;const{property:u,value:h}=o;s?i(u,h,o):h&&(a=a||{},a[u]=h)}),a}return Kt}var pr={},Ni;function Jo(){if(Ni)return pr;Ni=1,Object.defineProperty(pr,"__esModule",{value:!0}),pr.camelCase=void 0;var e=/^--[a-zA-Z0-9_-]+$/,t=/-([a-z])/g,r=/^[^-]+$/,n=/^-(webkit|moz|ms|o|khtml)-/,i=/^-(ms)-/,a=function(u){return!u||r.test(u)||e.test(u)},l=function(u,h){return h.toUpperCase()},s=function(u,h){return"".concat(h,"-")},o=function(u,h){return h===void 0&&(h={}),a(u)?u:(u=u.toLowerCase(),h.reactCompat?u=u.replace(i,s):u=u.replace(n,s),u.replace(t,l))};return pr.camelCase=o,pr}var dr,Pi;function eu(){if(Pi)return dr;Pi=1;var e=dr&&dr.__importDefault||function(i){return i&&i.__esModule?i:{default:i}},t=e(Qo()),r=Jo();function n(i,a){var l={};return!i||typeof i!="string"||(0,t.default)(i,function(s,o){s&&o&&(l[(0,r.camelCase)(s,a)]=o)}),l}return n.default=n,dr=n,dr}var tu=eu();const ru=ml(tu),nu=/[ \t\n\f\r]/g;function iu(e){return typeof e=="object"?e.type==="text"?Oi(e.value):!1:Oi(e)}function Oi(e){return e.replace(nu,"")===""}const Sl=Al("end"),G0=Al("start");function Al(e){return t;function t(r){const n=r&&r.position&&r.position[e]||{};if(typeof n.line=="number"&&n.line>0&&typeof n.column=="number"&&n.column>0)return{line:n.line,column:n.column,offset:typeof n.offset=="number"&&n.offset>-1?n.offset:void 0}}}function au(e){const t=G0(e),r=Sl(e);if(t&&r)return{start:t,end:r}}function qi(e,t){const r=String(e);if(typeof t!="string")throw new TypeError("Expected character");let n=0,i=r.indexOf(t);for(;i!==-1;)n++,i=r.indexOf(t,i+t.length);return n}const Hi=document.createElement("i");function W0(e){const t="&"+e+";";Hi.innerHTML=t;const r=Hi.textContent;return r.charCodeAt(r.length-1)===59&&e!=="semi"||r===t?!1:r}const Ne=Dt(/[A-Za-z]/),Ie=Dt(/[\dA-Za-z]/),lu=Dt(/[#-'*+\--9=?A-Z^-~]/);function rn(e){return e!==null&&(e<32||e===127)}const y0=Dt(/\d/),su=Dt(/[\dA-Fa-f]/),ou=Dt(/[!-/:-@[-`{-~]/);function K(e){return e!==null&&e<-2}function me(e){return e!==null&&(e<0||e===32)}function le(e){return e===-2||e===-1||e===32}const dn=Dt(new RegExp("\\p{P}|\\p{S}","u")),Ut=Dt(/\s/);function Dt(e){return t;function t(r){return r!==null&&r>-1&&e.test(String.fromCharCode(r))}}function ie(e,t,r,n){const i=n?n-1:Number.POSITIVE_INFINITY;let a=0;return l;function l(o){return le(o)?(e.enter(r),s(o)):t(o)}function s(o){return le(o)&&a++i?0:i+t:t=t>i?i:t,r=r>0?r:0,n.length<1e4)l=Array.from(n),l.unshift(t,r),e.splice(...l);else for(r&&e.splice(t,r);a0?(Ge(e,e.length,0,t),e):t}function er(e){if(e===null||me(e)||Ut(e))return 1;if(dn(e))return 2}function gn(e,t,r){const n=[];let i=-1;for(;++i1&&e[r][1].end.offset-e[r][1].start.offset>1?2:1;const m={...e[n][1].end},d={...e[r][1].start};ji(m,-o),ji(d,o),l={type:o>1?"strongSequence":"emphasisSequence",start:m,end:{...e[n][1].end}},s={type:o>1?"strongSequence":"emphasisSequence",start:{...e[r][1].start},end:d},a={type:o>1?"strongText":"emphasisText",start:{...e[n][1].end},end:{...e[r][1].start}},i={type:o>1?"strong":"emphasis",start:{...l.start},end:{...s.end}},e[n][1].end={...l.start},e[r][1].start={...s.end},u=[],e[n][1].end.offset-e[n][1].start.offset&&(u=Qe(u,[["enter",e[n][1],t],["exit",e[n][1],t]])),u=Qe(u,[["enter",i,t],["enter",l,t],["exit",l,t],["enter",a,t]]),u=Qe(u,gn(t.parser.constructs.insideSpan.null,e.slice(n+1,r),t)),u=Qe(u,[["exit",a,t],["enter",s,t],["exit",s,t],["exit",i,t]]),e[r][1].end.offset-e[r][1].start.offset?(h=2,u=Qe(u,[["enter",e[r][1],t],["exit",e[r][1],t]])):h=0,Ge(e,n-1,r-n+3,u),r=n+u.length-h-2;break}}for(r=-1;++r0&&le(M)?ie(e,z,"linePrefix",a+1)(M):z(M)}function z(M){return M===null||K(M)?e.check($i,w,q)(M):(e.enter("codeFlowValue"),I(M))}function I(M){return M===null||K(M)?(e.exit("codeFlowValue"),z(M)):(e.consume(M),I)}function q(M){return e.exit("codeFenced"),t(M)}function O(M,G,X){let U=0;return E;function E(H){return M.enter("lineEnding"),M.consume(H),M.exit("lineEnding"),V}function V(H){return M.enter("codeFencedFence"),le(H)?ie(M,$,"linePrefix",n.parser.constructs.disable.null.includes("codeIndented")?void 0:4)(H):$(H)}function $(H){return H===s?(M.enter("codeFencedFenceSequence"),se(H)):X(H)}function se(H){return H===s?(U++,M.consume(H),se):U>=l?(M.exit("codeFencedFenceSequence"),le(H)?ie(M,Y,"whitespace")(H):Y(H)):X(H)}function Y(H){return H===null||K(H)?(M.exit("codeFencedFence"),G(H)):X(H)}}}function xu(e,t,r){const n=this;return i;function i(l){return l===null?r(l):(e.enter("lineEnding"),e.consume(l),e.exit("lineEnding"),a)}function a(l){return n.parser.lazy[n.now().line]?r(l):t(l)}}const qn={name:"codeIndented",tokenize:ku},wu={partial:!0,tokenize:Su};function ku(e,t,r){const n=this;return i;function i(u){return e.enter("codeIndented"),ie(e,a,"linePrefix",5)(u)}function a(u){const h=n.events[n.events.length-1];return h&&h[1].type==="linePrefix"&&h[2].sliceSerialize(h[1],!0).length>=4?l(u):r(u)}function l(u){return u===null?o(u):K(u)?e.attempt(wu,l,o)(u):(e.enter("codeFlowValue"),s(u))}function s(u){return u===null||K(u)?(e.exit("codeFlowValue"),l(u)):(e.consume(u),s)}function o(u){return e.exit("codeIndented"),t(u)}}function Su(e,t,r){const n=this;return i;function i(l){return n.parser.lazy[n.now().line]?r(l):K(l)?(e.enter("lineEnding"),e.consume(l),e.exit("lineEnding"),i):ie(e,a,"linePrefix",5)(l)}function a(l){const s=n.events[n.events.length-1];return s&&s[1].type==="linePrefix"&&s[2].sliceSerialize(s[1],!0).length>=4?t(l):K(l)?i(l):r(l)}}const Au={name:"codeText",previous:Cu,resolve:Tu,tokenize:zu};function Tu(e){let t=e.length-4,r=3,n,i;if((e[r][1].type==="lineEnding"||e[r][1].type==="space")&&(e[t][1].type==="lineEnding"||e[t][1].type==="space")){for(n=r;++n=this.left.length+this.right.length)throw new RangeError("Cannot access index `"+t+"` in a splice buffer of size `"+(this.left.length+this.right.length)+"`");return tthis.left.length?this.right.slice(this.right.length-n+this.left.length,this.right.length-t+this.left.length).reverse():this.left.slice(t).concat(this.right.slice(this.right.length-n+this.left.length).reverse())}splice(t,r,n){const i=r||0;this.setCursor(Math.trunc(t));const a=this.right.splice(this.right.length-i,Number.POSITIVE_INFINITY);return n&&gr(this.left,n),a.reverse()}pop(){return this.setCursor(Number.POSITIVE_INFINITY),this.left.pop()}push(t){this.setCursor(Number.POSITIVE_INFINITY),this.left.push(t)}pushMany(t){this.setCursor(Number.POSITIVE_INFINITY),gr(this.left,t)}unshift(t){this.setCursor(0),this.right.push(t)}unshiftMany(t){this.setCursor(0),gr(this.right,t.reverse())}setCursor(t){if(!(t===this.left.length||t>this.left.length&&this.right.length===0||t<0&&this.left.length===0))if(t=4?t(l):e.interrupt(n.parser.constructs.flow,r,t)(l)}}function El(e,t,r,n,i,a,l,s,o){const u=o||Number.POSITIVE_INFINITY;let h=0;return m;function m(A){return A===60?(e.enter(n),e.enter(i),e.enter(a),e.consume(A),e.exit(a),d):A===null||A===32||A===41||rn(A)?r(A):(e.enter(n),e.enter(l),e.enter(s),e.enter("chunkString",{contentType:"string"}),w(A))}function d(A){return A===62?(e.enter(a),e.consume(A),e.exit(a),e.exit(i),e.exit(n),t):(e.enter(s),e.enter("chunkString",{contentType:"string"}),p(A))}function p(A){return A===62?(e.exit("chunkString"),e.exit(s),d(A)):A===null||A===60||K(A)?r(A):(e.consume(A),A===92?y:p)}function y(A){return A===60||A===62||A===92?(e.consume(A),p):p(A)}function w(A){return!h&&(A===null||A===41||me(A))?(e.exit("chunkString"),e.exit(s),e.exit(l),e.exit(n),t(A)):h999||p===null||p===91||p===93&&!o||p===94&&!s&&"_hiddenFootnoteSupport"in l.parser.constructs?r(p):p===93?(e.exit(a),e.enter(i),e.consume(p),e.exit(i),e.exit(n),t):K(p)?(e.enter("lineEnding"),e.consume(p),e.exit("lineEnding"),h):(e.enter("chunkString",{contentType:"string"}),m(p))}function m(p){return p===null||p===91||p===93||K(p)||s++>999?(e.exit("chunkString"),h(p)):(e.consume(p),o||(o=!le(p)),p===92?d:m)}function d(p){return p===91||p===92||p===93?(e.consume(p),s++,m):m(p)}}function Dl(e,t,r,n,i,a){let l;return s;function s(d){return d===34||d===39||d===40?(e.enter(n),e.enter(i),e.consume(d),e.exit(i),l=d===40?41:d,o):r(d)}function o(d){return d===l?(e.enter(i),e.consume(d),e.exit(i),e.exit(n),t):(e.enter(a),u(d))}function u(d){return d===l?(e.exit(a),o(l)):d===null?r(d):K(d)?(e.enter("lineEnding"),e.consume(d),e.exit("lineEnding"),ie(e,u,"linePrefix")):(e.enter("chunkString",{contentType:"string"}),h(d))}function h(d){return d===l||d===null||K(d)?(e.exit("chunkString"),u(d)):(e.consume(d),d===92?m:h)}function m(d){return d===l||d===92?(e.consume(d),h):h(d)}}function xr(e,t){let r;return n;function n(i){return K(i)?(e.enter("lineEnding"),e.consume(i),e.exit("lineEnding"),r=!0,n):le(i)?ie(e,n,r?"linePrefix":"lineSuffix")(i):t(i)}}function nt(e){return e.replace(/[\t\n\r ]+/g," ").replace(/^ | $/g,"").toLowerCase().toUpperCase()}const Lu={name:"definition",tokenize:Pu},Nu={partial:!0,tokenize:Ou};function Pu(e,t,r){const n=this;let i;return a;function a(p){return e.enter("definition"),l(p)}function l(p){return Il.call(n,e,s,r,"definitionLabel","definitionLabelMarker","definitionLabelString")(p)}function s(p){return i=nt(n.sliceSerialize(n.events[n.events.length-1][1]).slice(1,-1)),p===58?(e.enter("definitionMarker"),e.consume(p),e.exit("definitionMarker"),o):r(p)}function o(p){return me(p)?xr(e,u)(p):u(p)}function u(p){return El(e,h,r,"definitionDestination","definitionDestinationLiteral","definitionDestinationLiteralMarker","definitionDestinationRaw","definitionDestinationString")(p)}function h(p){return e.attempt(Nu,m,m)(p)}function m(p){return le(p)?ie(e,d,"whitespace")(p):d(p)}function d(p){return p===null||K(p)?(e.exit("definition"),n.parser.defined.push(i),t(p)):r(p)}}function Ou(e,t,r){return n;function n(s){return me(s)?xr(e,i)(s):r(s)}function i(s){return Dl(e,a,r,"definitionTitle","definitionTitleMarker","definitionTitleString")(s)}function a(s){return le(s)?ie(e,l,"whitespace")(s):l(s)}function l(s){return s===null||K(s)?t(s):r(s)}}const qu={name:"hardBreakEscape",tokenize:Hu};function Hu(e,t,r){return n;function n(a){return e.enter("hardBreakEscape"),e.consume(a),i}function i(a){return K(a)?(e.exit("hardBreakEscape"),t(a)):r(a)}}const ju={name:"headingAtx",resolve:$u,tokenize:Uu};function $u(e,t){let r=e.length-2,n=3,i,a;return e[n][1].type==="whitespace"&&(n+=2),r-2>n&&e[r][1].type==="whitespace"&&(r-=2),e[r][1].type==="atxHeadingSequence"&&(n===r-1||r-4>n&&e[r-2][1].type==="whitespace")&&(r-=n+1===r?2:4),r>n&&(i={type:"atxHeadingText",start:e[n][1].start,end:e[r][1].end},a={type:"chunkText",start:e[n][1].start,end:e[r][1].end,contentType:"text"},Ge(e,n,r-n+1,[["enter",i,t],["enter",a,t],["exit",a,t],["exit",i,t]])),e}function Uu(e,t,r){let n=0;return i;function i(h){return e.enter("atxHeading"),a(h)}function a(h){return e.enter("atxHeadingSequence"),l(h)}function l(h){return h===35&&n++<6?(e.consume(h),l):h===null||me(h)?(e.exit("atxHeadingSequence"),s(h)):r(h)}function s(h){return h===35?(e.enter("atxHeadingSequence"),o(h)):h===null||K(h)?(e.exit("atxHeading"),t(h)):le(h)?ie(e,s,"whitespace")(h):(e.enter("atxHeadingText"),u(h))}function o(h){return h===35?(e.consume(h),o):(e.exit("atxHeadingSequence"),s(h))}function u(h){return h===null||h===35||me(h)?(e.exit("atxHeadingText"),s(h)):(e.consume(h),u)}}const Vu=["address","article","aside","base","basefont","blockquote","body","caption","center","col","colgroup","dd","details","dialog","dir","div","dl","dt","fieldset","figcaption","figure","footer","form","frame","frameset","h1","h2","h3","h4","h5","h6","head","header","hr","html","iframe","legend","li","link","main","menu","menuitem","nav","noframes","ol","optgroup","option","p","param","search","section","summary","table","tbody","td","tfoot","th","thead","title","tr","track","ul"],Vi=["pre","script","style","textarea"],_u={concrete:!0,name:"htmlFlow",resolveTo:Xu,tokenize:Yu},Gu={partial:!0,tokenize:Zu},Wu={partial:!0,tokenize:Ku};function Xu(e){let t=e.length;for(;t--&&!(e[t][0]==="enter"&&e[t][1].type==="htmlFlow"););return t>1&&e[t-2][1].type==="linePrefix"&&(e[t][1].start=e[t-2][1].start,e[t+1][1].start=e[t-2][1].start,e.splice(t-2,2)),e}function Yu(e,t,r){const n=this;let i,a,l,s,o;return u;function u(S){return h(S)}function h(S){return e.enter("htmlFlow"),e.enter("htmlFlowData"),e.consume(S),m}function m(S){return S===33?(e.consume(S),d):S===47?(e.consume(S),a=!0,w):S===63?(e.consume(S),i=3,n.interrupt?t:k):Ne(S)?(e.consume(S),l=String.fromCharCode(S),C):r(S)}function d(S){return S===45?(e.consume(S),i=2,p):S===91?(e.consume(S),i=5,s=0,y):Ne(S)?(e.consume(S),i=4,n.interrupt?t:k):r(S)}function p(S){return S===45?(e.consume(S),n.interrupt?t:k):r(S)}function y(S){const Ee="CDATA[";return S===Ee.charCodeAt(s++)?(e.consume(S),s===Ee.length?n.interrupt?t:$:y):r(S)}function w(S){return Ne(S)?(e.consume(S),l=String.fromCharCode(S),C):r(S)}function C(S){if(S===null||S===47||S===62||me(S)){const Ee=S===47,it=l.toLowerCase();return!Ee&&!a&&Vi.includes(it)?(i=1,n.interrupt?t(S):$(S)):Vu.includes(l.toLowerCase())?(i=6,Ee?(e.consume(S),A):n.interrupt?t(S):$(S)):(i=7,n.interrupt&&!n.parser.lazy[n.now().line]?r(S):a?z(S):I(S))}return S===45||Ie(S)?(e.consume(S),l+=String.fromCharCode(S),C):r(S)}function A(S){return S===62?(e.consume(S),n.interrupt?t:$):r(S)}function z(S){return le(S)?(e.consume(S),z):E(S)}function I(S){return S===47?(e.consume(S),E):S===58||S===95||Ne(S)?(e.consume(S),q):le(S)?(e.consume(S),I):E(S)}function q(S){return S===45||S===46||S===58||S===95||Ie(S)?(e.consume(S),q):O(S)}function O(S){return S===61?(e.consume(S),M):le(S)?(e.consume(S),O):I(S)}function M(S){return S===null||S===60||S===61||S===62||S===96?r(S):S===34||S===39?(e.consume(S),o=S,G):le(S)?(e.consume(S),M):X(S)}function G(S){return S===o?(e.consume(S),o=null,U):S===null||K(S)?r(S):(e.consume(S),G)}function X(S){return S===null||S===34||S===39||S===47||S===60||S===61||S===62||S===96||me(S)?O(S):(e.consume(S),X)}function U(S){return S===47||S===62||le(S)?I(S):r(S)}function E(S){return S===62?(e.consume(S),V):r(S)}function V(S){return S===null||K(S)?$(S):le(S)?(e.consume(S),V):r(S)}function $(S){return S===45&&i===2?(e.consume(S),ae):S===60&&i===1?(e.consume(S),pe):S===62&&i===4?(e.consume(S),xe):S===63&&i===3?(e.consume(S),k):S===93&&i===5?(e.consume(S),$e):K(S)&&(i===6||i===7)?(e.exit("htmlFlowData"),e.check(Gu,Fe,se)(S)):S===null||K(S)?(e.exit("htmlFlowData"),se(S)):(e.consume(S),$)}function se(S){return e.check(Wu,Y,Fe)(S)}function Y(S){return e.enter("lineEnding"),e.consume(S),e.exit("lineEnding"),H}function H(S){return S===null||K(S)?se(S):(e.enter("htmlFlowData"),$(S))}function ae(S){return S===45?(e.consume(S),k):$(S)}function pe(S){return S===47?(e.consume(S),l="",Me):$(S)}function Me(S){if(S===62){const Ee=l.toLowerCase();return Vi.includes(Ee)?(e.consume(S),xe):$(S)}return Ne(S)&&l.length<8?(e.consume(S),l+=String.fromCharCode(S),Me):$(S)}function $e(S){return S===93?(e.consume(S),k):$(S)}function k(S){return S===62?(e.consume(S),xe):S===45&&i===2?(e.consume(S),k):$(S)}function xe(S){return S===null||K(S)?(e.exit("htmlFlowData"),Fe(S)):(e.consume(S),xe)}function Fe(S){return e.exit("htmlFlow"),t(S)}}function Ku(e,t,r){const n=this;return i;function i(l){return K(l)?(e.enter("lineEnding"),e.consume(l),e.exit("lineEnding"),a):r(l)}function a(l){return n.parser.lazy[n.now().line]?r(l):t(l)}}function Zu(e,t,r){return n;function n(i){return e.enter("lineEnding"),e.consume(i),e.exit("lineEnding"),e.attempt(Ir,t,r)}}const Qu={name:"htmlText",tokenize:Ju};function Ju(e,t,r){const n=this;let i,a,l;return s;function s(k){return e.enter("htmlText"),e.enter("htmlTextData"),e.consume(k),o}function o(k){return k===33?(e.consume(k),u):k===47?(e.consume(k),O):k===63?(e.consume(k),I):Ne(k)?(e.consume(k),X):r(k)}function u(k){return k===45?(e.consume(k),h):k===91?(e.consume(k),a=0,y):Ne(k)?(e.consume(k),z):r(k)}function h(k){return k===45?(e.consume(k),p):r(k)}function m(k){return k===null?r(k):k===45?(e.consume(k),d):K(k)?(l=m,pe(k)):(e.consume(k),m)}function d(k){return k===45?(e.consume(k),p):m(k)}function p(k){return k===62?ae(k):k===45?d(k):m(k)}function y(k){const xe="CDATA[";return k===xe.charCodeAt(a++)?(e.consume(k),a===xe.length?w:y):r(k)}function w(k){return k===null?r(k):k===93?(e.consume(k),C):K(k)?(l=w,pe(k)):(e.consume(k),w)}function C(k){return k===93?(e.consume(k),A):w(k)}function A(k){return k===62?ae(k):k===93?(e.consume(k),A):w(k)}function z(k){return k===null||k===62?ae(k):K(k)?(l=z,pe(k)):(e.consume(k),z)}function I(k){return k===null?r(k):k===63?(e.consume(k),q):K(k)?(l=I,pe(k)):(e.consume(k),I)}function q(k){return k===62?ae(k):I(k)}function O(k){return Ne(k)?(e.consume(k),M):r(k)}function M(k){return k===45||Ie(k)?(e.consume(k),M):G(k)}function G(k){return K(k)?(l=G,pe(k)):le(k)?(e.consume(k),G):ae(k)}function X(k){return k===45||Ie(k)?(e.consume(k),X):k===47||k===62||me(k)?U(k):r(k)}function U(k){return k===47?(e.consume(k),ae):k===58||k===95||Ne(k)?(e.consume(k),E):K(k)?(l=U,pe(k)):le(k)?(e.consume(k),U):ae(k)}function E(k){return k===45||k===46||k===58||k===95||Ie(k)?(e.consume(k),E):V(k)}function V(k){return k===61?(e.consume(k),$):K(k)?(l=V,pe(k)):le(k)?(e.consume(k),V):U(k)}function $(k){return k===null||k===60||k===61||k===62||k===96?r(k):k===34||k===39?(e.consume(k),i=k,se):K(k)?(l=$,pe(k)):le(k)?(e.consume(k),$):(e.consume(k),Y)}function se(k){return k===i?(e.consume(k),i=void 0,H):k===null?r(k):K(k)?(l=se,pe(k)):(e.consume(k),se)}function Y(k){return k===null||k===34||k===39||k===60||k===61||k===96?r(k):k===47||k===62||me(k)?U(k):(e.consume(k),Y)}function H(k){return k===47||k===62||me(k)?U(k):r(k)}function ae(k){return k===62?(e.consume(k),e.exit("htmlTextData"),e.exit("htmlText"),t):r(k)}function pe(k){return e.exit("htmlTextData"),e.enter("lineEnding"),e.consume(k),e.exit("lineEnding"),Me}function Me(k){return le(k)?ie(e,$e,"linePrefix",n.parser.constructs.disable.null.includes("codeIndented")?void 0:4)(k):$e(k)}function $e(k){return e.enter("htmlTextData"),l(k)}}const X0={name:"labelEnd",resolveAll:n1,resolveTo:i1,tokenize:a1},e1={tokenize:l1},t1={tokenize:s1},r1={tokenize:o1};function n1(e){let t=-1;const r=[];for(;++t=3&&(u===null||K(u))?(e.exit("thematicBreak"),t(u)):r(u)}function o(u){return u===i?(e.consume(u),n++,o):(e.exit("thematicBreakSequence"),le(u)?ie(e,s,"whitespace")(u):s(u))}}const qe={continuation:{tokenize:y1},exit:x1,name:"list",tokenize:v1},d1={partial:!0,tokenize:w1},g1={partial:!0,tokenize:b1};function v1(e,t,r){const n=this,i=n.events[n.events.length-1];let a=i&&i[1].type==="linePrefix"?i[2].sliceSerialize(i[1],!0).length:0,l=0;return s;function s(p){const y=n.containerState.type||(p===42||p===43||p===45?"listUnordered":"listOrdered");if(y==="listUnordered"?!n.containerState.marker||p===n.containerState.marker:y0(p)){if(n.containerState.type||(n.containerState.type=y,e.enter(y,{_container:!0})),y==="listUnordered")return e.enter("listItemPrefix"),p===42||p===45?e.check(Jr,r,u)(p):u(p);if(!n.interrupt||p===49)return e.enter("listItemPrefix"),e.enter("listItemValue"),o(p)}return r(p)}function o(p){return y0(p)&&++l<10?(e.consume(p),o):(!n.interrupt||l<2)&&(n.containerState.marker?p===n.containerState.marker:p===41||p===46)?(e.exit("listItemValue"),u(p)):r(p)}function u(p){return e.enter("listItemMarker"),e.consume(p),e.exit("listItemMarker"),n.containerState.marker=n.containerState.marker||p,e.check(Ir,n.interrupt?r:h,e.attempt(d1,d,m))}function h(p){return n.containerState.initialBlankLine=!0,a++,d(p)}function m(p){return le(p)?(e.enter("listItemPrefixWhitespace"),e.consume(p),e.exit("listItemPrefixWhitespace"),d):r(p)}function d(p){return n.containerState.size=a+n.sliceSerialize(e.exit("listItemPrefix"),!0).length,t(p)}}function y1(e,t,r){const n=this;return n.containerState._closeFlow=void 0,e.check(Ir,i,a);function i(s){return n.containerState.furtherBlankLines=n.containerState.furtherBlankLines||n.containerState.initialBlankLine,ie(e,t,"listItemIndent",n.containerState.size+1)(s)}function a(s){return n.containerState.furtherBlankLines||!le(s)?(n.containerState.furtherBlankLines=void 0,n.containerState.initialBlankLine=void 0,l(s)):(n.containerState.furtherBlankLines=void 0,n.containerState.initialBlankLine=void 0,e.attempt(g1,t,l)(s))}function l(s){return n.containerState._closeFlow=!0,n.interrupt=void 0,ie(e,e.attempt(qe,t,r),"linePrefix",n.parser.constructs.disable.null.includes("codeIndented")?void 0:4)(s)}}function b1(e,t,r){const n=this;return ie(e,i,"listItemIndent",n.containerState.size+1);function i(a){const l=n.events[n.events.length-1];return l&&l[1].type==="listItemIndent"&&l[2].sliceSerialize(l[1],!0).length===n.containerState.size?t(a):r(a)}}function x1(e){e.exit(this.containerState.type)}function w1(e,t,r){const n=this;return ie(e,i,"listItemPrefixWhitespace",n.parser.constructs.disable.null.includes("codeIndented")?void 0:5);function i(a){const l=n.events[n.events.length-1];return!le(a)&&l&&l[1].type==="listItemPrefixWhitespace"?t(a):r(a)}}const _i={name:"setextUnderline",resolveTo:k1,tokenize:S1};function k1(e,t){let r=e.length,n,i,a;for(;r--;)if(e[r][0]==="enter"){if(e[r][1].type==="content"){n=r;break}e[r][1].type==="paragraph"&&(i=r)}else e[r][1].type==="content"&&e.splice(r,1),!a&&e[r][1].type==="definition"&&(a=r);const l={type:"setextHeading",start:{...e[n][1].start},end:{...e[e.length-1][1].end}};return e[i][1].type="setextHeadingText",a?(e.splice(i,0,["enter",l,t]),e.splice(a+1,0,["exit",e[n][1],t]),e[n][1].end={...e[a][1].end}):e[n][1]=l,e.push(["exit",l,t]),e}function S1(e,t,r){const n=this;let i;return a;function a(u){let h=n.events.length,m;for(;h--;)if(n.events[h][1].type!=="lineEnding"&&n.events[h][1].type!=="linePrefix"&&n.events[h][1].type!=="content"){m=n.events[h][1].type==="paragraph";break}return!n.parser.lazy[n.now().line]&&(n.interrupt||m)?(e.enter("setextHeadingLine"),i=u,l(u)):r(u)}function l(u){return e.enter("setextHeadingLineSequence"),s(u)}function s(u){return u===i?(e.consume(u),s):(e.exit("setextHeadingLineSequence"),le(u)?ie(e,o,"lineSuffix")(u):o(u))}function o(u){return u===null||K(u)?(e.exit("setextHeadingLine"),t(u)):r(u)}}const Gi={}.hasOwnProperty;function Bl(e){const t={};let r=-1;for(;++r13&&r<32||r>126&&r<160||r>55295&&r<57344||r>64975&&r<65008||(r&65535)===65535||(r&65535)===65534||r>1114111?"�":String.fromCodePoint(r)}function ar(e){const t=[];let r=-1,n=0,i=0;for(;++r55295&&a<57344){const s=e.charCodeAt(r+1);a<56320&&s>56319&&s<57344?(l=String.fromCharCode(a,s),i=1):l="�"}else l=String.fromCharCode(a);l&&(t.push(e.slice(n,r),encodeURIComponent(l)),n=r+i+1,l=""),i&&(r+=i,i=0)}return t.join("")+e.slice(n)}const M1={tokenize:E1};function E1(e){const t=e.attempt(this.parser.constructs.contentInitial,n,i);let r;return t;function n(s){if(s===null){e.consume(s);return}return e.enter("lineEnding"),e.consume(s),e.exit("lineEnding"),ie(e,t,"linePrefix")}function i(s){return e.enter("paragraph"),a(s)}function a(s){const o=e.enter("chunkText",{contentType:"text",previous:r});return r&&(r.next=o),r=o,l(s)}function l(s){if(s===null){e.exit("chunkText"),e.exit("paragraph"),e.consume(s);return}return K(s)?(e.consume(s),e.exit("chunkText"),a):(e.consume(s),l)}}const I1={tokenize:D1},Xi={tokenize:B1};function D1(e){const t=this,r=[];let n=0,i,a,l;return s;function s(I){if(nl))return;const G=t.events.length;let X=G,U,E;for(;X--;)if(t.events[X][0]==="exit"&&t.events[X][1].type==="chunkFlow"){if(U){E=t.events[X][1].end;break}U=!0}for(A(n),M=G;MI;){const O=r[q];t.containerState=O[1],O[0].exit.call(t,e)}r.length=I}function z(){i.write([null]),a=void 0,i=void 0,t.containerState._closeFlow=void 0}}function B1(e,t,r){return ie(e,e.attempt(this.parser.constructs.document,t,r),"linePrefix",this.parser.constructs.disable.null.includes("codeIndented")?void 0:4)}const F1={tokenize:R1};function R1(e){const t=this,r=e.attempt(Ir,n,e.attempt(this.parser.constructs.flowInitial,i,ie(e,e.attempt(this.parser.constructs.flow,i,e.attempt(Iu,i)),"linePrefix")));return r;function n(a){if(a===null){e.consume(a);return}return e.enter("lineEndingBlank"),e.consume(a),e.exit("lineEndingBlank"),t.currentConstruct=void 0,r}function i(a){if(a===null){e.consume(a);return}return e.enter("lineEnding"),e.consume(a),e.exit("lineEnding"),t.currentConstruct=void 0,r}}const L1={resolveAll:Nl()},N1=Ll("string"),P1=Ll("text");function Ll(e){return{resolveAll:Nl(e==="text"?O1:void 0),tokenize:t};function t(r){const n=this,i=this.parser.constructs[e],a=r.attempt(i,l,s);return l;function l(h){return u(h)?a(h):s(h)}function s(h){if(h===null){r.consume(h);return}return r.enter("data"),r.consume(h),o}function o(h){return u(h)?(r.exit("data"),a(h)):(r.consume(h),o)}function u(h){if(h===null)return!0;const m=i[h];let d=-1;if(m)for(;++d-1){const s=l[0];typeof s=="string"?l[0]=s.slice(n):l.shift()}a>0&&l.push(e[i].slice(0,a))}return l}function Z1(e,t){let r=-1;const n=[];let i;for(;++r0){const rt=Q.tokenStack[Q.tokenStack.length-1];(rt[1]||Ki).call(Q,void 0,rt[0])}for(j.position={start:St(D.length>0?D[0][1].start:{line:1,column:1,offset:0}),end:St(D.length>0?D[D.length-2][1].end:{line:1,column:1,offset:0})},ce=-1;++ce0&&(n.className=["language-"+i[0]]);let a={type:"element",tagName:"code",properties:n,children:[{type:"text",value:r}]};return t.meta&&(a.data={meta:t.meta}),e.patch(t,a),a=e.applyData(t,a),a={type:"element",tagName:"pre",properties:{},children:[a]},e.patch(t,a),a}function hc(e,t){const r={type:"element",tagName:"del",properties:{},children:e.all(t)};return e.patch(t,r),e.applyData(t,r)}function mc(e,t){const r={type:"element",tagName:"em",properties:{},children:e.all(t)};return e.patch(t,r),e.applyData(t,r)}function fc(e,t){const r=typeof e.options.clobberPrefix=="string"?e.options.clobberPrefix:"user-content-",n=String(t.identifier).toUpperCase(),i=ar(n.toLowerCase()),a=e.footnoteOrder.indexOf(n);let l,s=e.footnoteCounts.get(n);s===void 0?(s=0,e.footnoteOrder.push(n),l=e.footnoteOrder.length):l=a+1,s+=1,e.footnoteCounts.set(n,s);const o={type:"element",tagName:"a",properties:{href:"#"+r+"fn-"+i,id:r+"fnref-"+i+(s>1?"-"+s:""),dataFootnoteRef:!0,ariaDescribedBy:["footnote-label"]},children:[{type:"text",value:String(l)}]};e.patch(t,o);const u={type:"element",tagName:"sup",properties:{},children:[o]};return e.patch(t,u),e.applyData(t,u)}function pc(e,t){const r={type:"element",tagName:"h"+t.depth,properties:{},children:e.all(t)};return e.patch(t,r),e.applyData(t,r)}function dc(e,t){if(e.options.allowDangerousHtml){const r={type:"raw",value:t.value};return e.patch(t,r),e.applyData(t,r)}}function ql(e,t){const r=t.referenceType;let n="]";if(r==="collapsed"?n+="[]":r==="full"&&(n+="["+(t.label||t.identifier)+"]"),t.type==="imageReference")return[{type:"text",value:"!["+t.alt+n}];const i=e.all(t),a=i[0];a&&a.type==="text"?a.value="["+a.value:i.unshift({type:"text",value:"["});const l=i[i.length-1];return l&&l.type==="text"?l.value+=n:i.push({type:"text",value:n}),i}function gc(e,t){const r=String(t.identifier).toUpperCase(),n=e.definitionById.get(r);if(!n)return ql(e,t);const i={src:ar(n.url||""),alt:t.alt};n.title!==null&&n.title!==void 0&&(i.title=n.title);const a={type:"element",tagName:"img",properties:i,children:[]};return e.patch(t,a),e.applyData(t,a)}function vc(e,t){const r={src:ar(t.url)};t.alt!==null&&t.alt!==void 0&&(r.alt=t.alt),t.title!==null&&t.title!==void 0&&(r.title=t.title);const n={type:"element",tagName:"img",properties:r,children:[]};return e.patch(t,n),e.applyData(t,n)}function yc(e,t){const r={type:"text",value:t.value.replace(/\r?\n|\r/g," ")};e.patch(t,r);const n={type:"element",tagName:"code",properties:{},children:[r]};return e.patch(t,n),e.applyData(t,n)}function bc(e,t){const r=String(t.identifier).toUpperCase(),n=e.definitionById.get(r);if(!n)return ql(e,t);const i={href:ar(n.url||"")};n.title!==null&&n.title!==void 0&&(i.title=n.title);const a={type:"element",tagName:"a",properties:i,children:e.all(t)};return e.patch(t,a),e.applyData(t,a)}function xc(e,t){const r={href:ar(t.url)};t.title!==null&&t.title!==void 0&&(r.title=t.title);const n={type:"element",tagName:"a",properties:r,children:e.all(t)};return e.patch(t,n),e.applyData(t,n)}function wc(e,t,r){const n=e.all(t),i=r?kc(r):Hl(t),a={},l=[];if(typeof t.checked=="boolean"){const h=n[0];let m;h&&h.type==="element"&&h.tagName==="p"?m=h:(m={type:"element",tagName:"p",properties:{},children:[]},n.unshift(m)),m.children.length>0&&m.children.unshift({type:"text",value:" "}),m.children.unshift({type:"element",tagName:"input",properties:{type:"checkbox",checked:t.checked,disabled:!0},children:[]}),a.className=["task-list-item"]}let s=-1;for(;++s1}function Sc(e,t){const r={},n=e.all(t);let i=-1;for(typeof t.start=="number"&&t.start!==1&&(r.start=t.start);++i0){const l={type:"element",tagName:"tbody",properties:{},children:e.wrap(r,!0)},s=G0(t.children[1]),o=Sl(t.children[t.children.length-1]);s&&o&&(l.position={start:s,end:o}),i.push(l)}const a={type:"element",tagName:"table",properties:{},children:e.wrap(i,!0)};return e.patch(t,a),e.applyData(t,a)}function Mc(e,t,r){const n=r?r.children:void 0,a=(n?n.indexOf(t):1)===0?"th":"td",l=r&&r.type==="table"?r.align:void 0,s=l?l.length:t.children.length;let o=-1;const u=[];for(;++o0,!0),n[0]),i=n.index+n[0].length,n=r.exec(t);return a.push(Ji(t.slice(i),i>0,!1)),a.join("")}function Ji(e,t,r){let n=0,i=e.length;if(t){let a=e.codePointAt(n);for(;a===Zi||a===Qi;)n++,a=e.codePointAt(n)}if(r){let a=e.codePointAt(i-1);for(;a===Zi||a===Qi;)i--,a=e.codePointAt(i-1)}return i>n?e.slice(n,i):""}function Dc(e,t){const r={type:"text",value:Ic(String(t.value))};return e.patch(t,r),e.applyData(t,r)}function Bc(e,t){const r={type:"element",tagName:"hr",properties:{},children:[]};return e.patch(t,r),e.applyData(t,r)}const Fc={blockquote:oc,break:uc,code:cc,delete:hc,emphasis:mc,footnoteReference:fc,heading:pc,html:dc,imageReference:gc,image:vc,inlineCode:yc,linkReference:bc,link:xc,listItem:wc,list:Sc,paragraph:Ac,root:Tc,strong:Cc,table:zc,tableCell:Ec,tableRow:Mc,text:Dc,thematicBreak:Bc,toml:jr,yaml:jr,definition:jr,footnoteDefinition:jr};function jr(){}const jl=-1,vn=0,wr=1,nn=2,K0=3,Z0=4,Q0=5,J0=6,$l=7,Ul=8,Vl=typeof self=="object"?self:globalThis,ea=(e,t)=>{switch(e){case"Function":case"SharedWorker":case"Worker":case"eval":case"setInterval":case"setTimeout":throw new TypeError("unable to deserialize "+e)}return new Vl[e](t)},Rc=(e,t)=>{const r=(i,a)=>(e.set(a,i),i),n=i=>{if(e.has(i))return e.get(i);const[a,l]=t[i];switch(a){case vn:case jl:return r(l,i);case wr:{const s=r([],i);for(const o of l)s.push(n(o));return s}case nn:{const s=r({},i);for(const[o,u]of l)s[n(o)]=n(u);return s}case K0:return r(new Date(l),i);case Z0:{const{source:s,flags:o}=l;return r(new RegExp(s,o),i)}case Q0:{const s=r(new Map,i);for(const[o,u]of l)s.set(n(o),n(u));return s}case J0:{const s=r(new Set,i);for(const o of l)s.add(n(o));return s}case $l:{const{name:s,message:o}=l;return r(typeof Vl[s]=="function"?ea(s,o):new Error(o),i)}case Ul:return r(BigInt(l),i);case"BigInt":return r(Object(BigInt(l)),i);case"ArrayBuffer":return r(new Uint8Array(l).buffer,l);case"DataView":{const{buffer:s}=new Uint8Array(l);return r(new DataView(s),l)}}return r(ea(a,l),i)};return n},ta=e=>Rc(new Map,e)(0),qt="",{toString:Lc}={},{keys:Nc}=Object,vr=e=>{const t=typeof e;if(t!=="object"||!e)return[vn,t];const r=Lc.call(e).slice(8,-1);switch(r){case"Array":return[wr,qt];case"Object":return[nn,qt];case"Date":return[K0,qt];case"RegExp":return[Z0,qt];case"Map":return[Q0,qt];case"Set":return[J0,qt];case"DataView":return[wr,r]}return r.includes("Array")?[wr,r]:e instanceof Error?[$l,e.name||"Error"]:[nn,r]},$r=([e,t])=>e===vn&&(t==="function"||t==="symbol"),Pc=(e,t,r,n)=>{const i=(l,s)=>{const o=n.push(l)-1;return r.set(s,o),o},a=l=>{if(r.has(l))return r.get(l);let[s,o]=vr(l);switch(s){case vn:{let h=l;switch(o){case"bigint":s=Ul,h=l.toString();break;case"function":case"symbol":if(e)throw new TypeError("unable to serialize "+o);h=null;break;case"undefined":return i([jl],l)}return i([s,h],l)}case wr:{if(o){let d=l;return o==="DataView"?d=new Uint8Array(l.buffer):o==="ArrayBuffer"&&(d=new Uint8Array(l)),i([o,[...d]],l)}const h=[],m=i([s,h],l);for(const d of l)h.push(a(d));return m}case nn:{if(o)switch(o){case"BigInt":return i([o,l.toString()],l);case"Boolean":case"Number":case"String":return i([o,l.valueOf()],l)}if(t&&"toJSON"in l)return a(l.toJSON());const h=[],m=i([s,h],l);for(const d of Nc(l))(e||!$r(vr(l[d])))&&h.push([a(d),a(l[d])]);return m}case K0:return i([s,isNaN(l.getTime())?qt:l.toISOString()],l);case Z0:{const{source:h,flags:m}=l;return i([s,{source:h,flags:m}],l)}case Q0:{const h=[],m=i([s,h],l);for(const[d,p]of l)(e||!($r(vr(d))||$r(vr(p))))&&h.push([a(d),a(p)]);return m}case J0:{const h=[],m=i([s,h],l);for(const d of l)(e||!$r(vr(d)))&&h.push(a(d));return m}}const{message:u}=l;return i([s,{name:o,message:u}],l)};return a},ra=(e,{json:t,lossy:r}={})=>{const n=[];return Pc(!(t||r),!!t,new Map,n)(e),n},an=typeof structuredClone=="function"?(e,t)=>t&&("json"in t||"lossy"in t)?ta(ra(e,t)):structuredClone(e):(e,t)=>ta(ra(e,t));function Oc(e,t){const r=[{type:"text",value:"↩"}];return t>1&&r.push({type:"element",tagName:"sup",properties:{},children:[{type:"text",value:String(t)}]}),r}function qc(e,t){return"Back to reference "+(e+1)+(t>1?"-"+t:"")}function Hc(e){const t=typeof e.options.clobberPrefix=="string"?e.options.clobberPrefix:"user-content-",r=e.options.footnoteBackContent||Oc,n=e.options.footnoteBackLabel||qc,i=e.options.footnoteLabel||"Footnotes",a=e.options.footnoteLabelTagName||"h2",l=e.options.footnoteLabelProperties||{className:["sr-only"]},s=[];let o=-1;for(;++o0&&y.push({type:"text",value:" "});let z=typeof r=="string"?r:r(o,p);typeof z=="string"&&(z={type:"text",value:z}),y.push({type:"element",tagName:"a",properties:{href:"#"+t+"fnref-"+d+(p>1?"-"+p:""),dataFootnoteBackref:"",ariaLabel:typeof n=="string"?n:n(o,p),className:["data-footnote-backref"]},children:Array.isArray(z)?z:[z]})}const C=h[h.length-1];if(C&&C.type==="element"&&C.tagName==="p"){const z=C.children[C.children.length-1];z&&z.type==="text"?z.value+=" ":C.children.push({type:"text",value:" "}),C.children.push(...y)}else h.push(...y);const A={type:"element",tagName:"li",properties:{id:t+"fn-"+d},children:e.wrap(h,!0)};e.patch(u,A),s.push(A)}if(s.length!==0)return{type:"element",tagName:"section",properties:{dataFootnotes:!0,className:["footnotes"]},children:[{type:"element",tagName:a,properties:{...an(l),id:"footnote-label"},children:[{type:"text",value:i}]},{type:"text",value:` +`},{type:"element",tagName:"ol",properties:{},children:e.wrap(s,!0)},{type:"text",value:` +`}]}}const Dr=(function(e){if(e==null)return Vc;if(typeof e=="function")return yn(e);if(typeof e=="object")return Array.isArray(e)?jc(e):$c(e);if(typeof e=="string")return Uc(e);throw new Error("Expected function, string, or object as test")});function jc(e){const t=[];let r=-1;for(;++r":""))+")"})}return d;function d(){let p=_l,y,w,C;if((!t||a(o,u,h[h.length-1]||void 0))&&(p=Wc(r(o,h)),p[0]===x0))return p;if("children"in o&&o.children){const A=o;if(A.children&&p[0]!==Gl)for(w=(n?A.children.length:-1)+l,C=h.concat(A);w>-1&&w0&&r.push({type:"text",value:` +`}),r}function na(e){let t=0,r=e.charCodeAt(t);for(;r===9||r===32;)t++,r=e.charCodeAt(t);return e.slice(t)}function ia(e,t){const r=Yc(e,t),n=r.one(e,void 0),i=Hc(r),a=Array.isArray(n)?{type:"root",children:n}:n||{type:"root",children:[]};return i&&a.children.push({type:"text",value:` +`},i),a}function eh(e,t){return e&&"run"in e?async function(r,n){const i=ia(r,{file:n,...t});await e.run(i,n)}:function(r,n){return ia(r,{file:n,...e||t})}}function aa(e){if(e)throw e}var jn,la;function th(){if(la)return jn;la=1;var e=Object.prototype.hasOwnProperty,t=Object.prototype.toString,r=Object.defineProperty,n=Object.getOwnPropertyDescriptor,i=function(u){return typeof Array.isArray=="function"?Array.isArray(u):t.call(u)==="[object Array]"},a=function(u){if(!u||t.call(u)!=="[object Object]")return!1;var h=e.call(u,"constructor"),m=u.constructor&&u.constructor.prototype&&e.call(u.constructor.prototype,"isPrototypeOf");if(u.constructor&&!h&&!m)return!1;var d;for(d in u);return typeof d>"u"||e.call(u,d)},l=function(u,h){r&&h.name==="__proto__"?r(u,h.name,{enumerable:!0,configurable:!0,value:h.newValue,writable:!0}):u[h.name]=h.newValue},s=function(u,h){if(h==="__proto__")if(e.call(u,h)){if(n)return n(u,h).value}else return;return u[h]};return jn=function o(){var u,h,m,d,p,y,w=arguments[0],C=1,A=arguments.length,z=!1;for(typeof w=="boolean"&&(z=w,w=arguments[1]||{},C=2),(w==null||typeof w!="object"&&typeof w!="function")&&(w={});Cl.length;let o;s&&l.push(i);try{o=e.apply(this,l)}catch(u){const h=u;if(s&&r)throw h;return i(h)}s||(o&&o.then&&typeof o.then=="function"?o.then(a,i):o instanceof Error?i(o):a(o))}function i(l,...s){r||(r=!0,t(l,...s))}function a(l){i(null,l)}}const ah=(function(e){const n=this.constructor.prototype,i=n[e],a=function(){return i.apply(a,arguments)};return Object.setPrototypeOf(a,n),a}),lh={}.hasOwnProperty;class ri extends ah{constructor(){super("copy"),this.Compiler=void 0,this.Parser=void 0,this.attachers=[],this.compiler=void 0,this.freezeIndex=-1,this.frozen=void 0,this.namespace={},this.parser=void 0,this.transformers=nh()}copy(){const t=new ri;let r=-1;for(;++r0){let[p,...y]=h;const w=n[d][1];k0(w)&&k0(p)&&(p=$n(!0,w,p)),n[d]=[u,p,...y]}}}}const sh=new ri().freeze();function Un(e,t){if(typeof t!="function")throw new TypeError("Cannot `"+e+"` without `parser`")}function Vn(e,t){if(typeof t!="function")throw new TypeError("Cannot `"+e+"` without `compiler`")}function _n(e,t){if(t)throw new Error("Cannot call `"+e+"` on a frozen processor.\nCreate a new processor first, by calling it: use `processor()` instead of `processor`.")}function sa(e){if(!k0(e)||typeof e.type!="string")throw new TypeError("Expected node, got `"+e+"`")}function oa(e,t,r){if(!r)throw new Error("`"+e+"` finished async. Use `"+t+"` instead")}function Ur(e){return oh(e)?e:new fl(e)}function oh(e){return!!(e&&typeof e=="object"&&"message"in e&&"messages"in e)}function uh(e){return typeof e=="string"||ch(e)}function ch(e){return!!(e&&typeof e=="object"&&"byteLength"in e&&"byteOffset"in e)}function hh(e){if(typeof e!="string")throw new TypeError("Expected a string");return e.replace(/[|\\{}()[\]^$+*?.]/g,"\\$&").replace(/-/g,"\\x2d")}function mh(e,t,r){const i=Dr((r||{}).ignore||[]),a=fh(t);let l=-1;for(;++l0?{type:"text",value:M}:void 0),M===!1?d.lastIndex=q+1:(y!==q&&z.push({type:"text",value:u.value.slice(y,q)}),Array.isArray(M)?z.push(...M):M&&z.push(M),y=q+I[0].length,A=!0),!d.global)break;I=d.exec(u.value)}return A?(y?\]}]+$/.exec(e);if(!t)return[e,void 0];e=e.slice(0,t.index);let r=t[0],n=r.indexOf(")");const i=qi(e,"(");let a=qi(e,")");for(;n!==-1&&i>a;)e+=r.slice(0,n+1),r=r.slice(n+1),n=r.indexOf(")"),a++;return[e,r]}function Wl(e,t){const r=e.input.charCodeAt(e.index-1);return(e.index===0||Ut(r)||dn(r))&&(!t||r!==47)}Xl.peek=Nh;function Mh(){this.buffer()}function Eh(e){this.enter({type:"footnoteReference",identifier:"",label:""},e)}function Ih(){this.buffer()}function Dh(e){this.enter({type:"footnoteDefinition",identifier:"",label:"",children:[]},e)}function Bh(e){const t=this.resume(),r=this.stack[this.stack.length-1];r.type,r.identifier=nt(this.sliceSerialize(e)).toLowerCase(),r.label=t}function Fh(e){this.exit(e)}function Rh(e){const t=this.resume(),r=this.stack[this.stack.length-1];r.type,r.identifier=nt(this.sliceSerialize(e)).toLowerCase(),r.label=t}function Lh(e){this.exit(e)}function Nh(){return"["}function Xl(e,t,r,n){const i=r.createTracker(n);let a=i.move("[^");const l=r.enter("footnoteReference"),s=r.enter("reference");return a+=i.move(r.safe(r.associationId(e),{after:"]",before:a})),s(),l(),a+=i.move("]"),a}function Ph(){return{enter:{gfmFootnoteCallString:Mh,gfmFootnoteCall:Eh,gfmFootnoteDefinitionLabelString:Ih,gfmFootnoteDefinition:Dh},exit:{gfmFootnoteCallString:Bh,gfmFootnoteCall:Fh,gfmFootnoteDefinitionLabelString:Rh,gfmFootnoteDefinition:Lh}}}function Oh(e){let t=!1;return e&&e.firstLineBlank&&(t=!0),{handlers:{footnoteDefinition:r,footnoteReference:Xl},unsafe:[{character:"[",inConstruct:["label","phrasing","reference"]}]};function r(n,i,a,l){const s=a.createTracker(l);let o=s.move("[^");const u=a.enter("footnoteDefinition"),h=a.enter("label");return o+=s.move(a.safe(a.associationId(n),{before:o,after:"]"})),h(),o+=s.move("]:"),n.children&&n.children.length>0&&(s.shift(4),o+=s.move((t?` +`:" ")+a.indentLines(a.containerFlow(n,s.current()),t?Yl:qh))),u(),o}}function qh(e,t,r){return t===0?e:Yl(e,t,r)}function Yl(e,t,r){return(r?"":" ")+e}const Hh=["autolink","destinationLiteral","destinationRaw","reference","titleQuote","titleApostrophe"];Kl.peek=_h;function jh(){return{canContainEols:["delete"],enter:{strikethrough:Uh},exit:{strikethrough:Vh}}}function $h(){return{unsafe:[{character:"~",inConstruct:"phrasing",notInConstruct:Hh}],handlers:{delete:Kl}}}function Uh(e){this.enter({type:"delete",children:[]},e)}function Vh(e){this.exit(e)}function Kl(e,t,r,n){const i=r.createTracker(n),a=r.enter("strikethrough");let l=i.move("~~");return l+=r.containerPhrasing(e,{...i.current(),before:l,after:"~"}),l+=i.move("~~"),a(),l}function _h(){return"~"}function Gh(e){return e.length}function Wh(e,t){const r=t||{},n=(r.align||[]).concat(),i=r.stringLength||Gh,a=[],l=[],s=[],o=[];let u=0,h=-1;for(;++hu&&(u=e[h].length);++Ao[A])&&(o[A]=I)}w.push(z)}l[h]=w,s[h]=C}let m=-1;if(typeof n=="object"&&"length"in n)for(;++mo[m]&&(o[m]=z),p[m]=z),d[m]=I}l.splice(1,0,d),s.splice(1,0,p),h=-1;const y=[];for(;++h "),a.shift(2);const l=r.indentLines(r.containerFlow(e,a.current()),Kh);return i(),l}function Kh(e,t,r){return">"+(r?"":" ")+e}function Zh(e,t){return ca(e,t.inConstruct,!0)&&!ca(e,t.notInConstruct,!1)}function ca(e,t,r){if(typeof t=="string"&&(t=[t]),!t||t.length===0)return r;let n=-1;for(;++nl&&(l=a):a=1,i=n+t.length,n=r.indexOf(t,i);return l}function Qh(e,t){return!!(t.options.fences===!1&&e.value&&!e.lang&&/[^ \r\n]/.test(e.value)&&!/^[\t ]*(?:[\r\n]|$)|(?:^|[\r\n])[\t ]*$/.test(e.value))}function Jh(e){const t=e.options.fence||"`";if(t!=="`"&&t!=="~")throw new Error("Cannot serialize code with `"+t+"` for `options.fence`, expected `` ` `` or `~`");return t}function e4(e,t,r,n){const i=Jh(r),a=e.value||"",l=i==="`"?"GraveAccent":"Tilde";if(Qh(e,r)){const m=r.enter("codeIndented"),d=r.indentLines(a,t4);return m(),d}const s=r.createTracker(n),o=i.repeat(Math.max(Zl(a,i)+1,3)),u=r.enter("codeFenced");let h=s.move(o);if(e.lang){const m=r.enter(`codeFencedLang${l}`);h+=s.move(r.safe(e.lang,{before:h,after:" ",encode:["`"],...s.current()})),m()}if(e.lang&&e.meta){const m=r.enter(`codeFencedMeta${l}`);h+=s.move(" "),h+=s.move(r.safe(e.meta,{before:h,after:` +`,encode:["`"],...s.current()})),m()}return h+=s.move(` +`),a&&(h+=s.move(a+` +`)),h+=s.move(o),u(),h}function t4(e,t,r){return(r?"":" ")+e}function ni(e){const t=e.options.quote||'"';if(t!=='"'&&t!=="'")throw new Error("Cannot serialize title with `"+t+"` for `options.quote`, expected `\"`, or `'`");return t}function r4(e,t,r,n){const i=ni(r),a=i==='"'?"Quote":"Apostrophe",l=r.enter("definition");let s=r.enter("label");const o=r.createTracker(n);let u=o.move("[");return u+=o.move(r.safe(r.associationId(e),{before:u,after:"]",...o.current()})),u+=o.move("]: "),s(),!e.url||/[\0- \u007F]/.test(e.url)?(s=r.enter("destinationLiteral"),u+=o.move("<"),u+=o.move(r.safe(e.url,{before:u,after:">",...o.current()})),u+=o.move(">")):(s=r.enter("destinationRaw"),u+=o.move(r.safe(e.url,{before:u,after:e.title?" ":` +`,...o.current()}))),s(),e.title&&(s=r.enter(`title${a}`),u+=o.move(" "+i),u+=o.move(r.safe(e.title,{before:u,after:i,...o.current()})),u+=o.move(i),s()),l(),u}function n4(e){const t=e.options.emphasis||"*";if(t!=="*"&&t!=="_")throw new Error("Cannot serialize emphasis with `"+t+"` for `options.emphasis`, expected `*`, or `_`");return t}function Ar(e){return"&#x"+e.toString(16).toUpperCase()+";"}function ln(e,t,r){const n=er(e),i=er(t);return n===void 0?i===void 0?r==="_"?{inside:!0,outside:!0}:{inside:!1,outside:!1}:i===1?{inside:!0,outside:!0}:{inside:!1,outside:!0}:n===1?i===void 0?{inside:!1,outside:!1}:i===1?{inside:!0,outside:!0}:{inside:!1,outside:!1}:i===void 0?{inside:!1,outside:!1}:i===1?{inside:!0,outside:!1}:{inside:!1,outside:!1}}Ql.peek=i4;function Ql(e,t,r,n){const i=n4(r),a=r.enter("emphasis"),l=r.createTracker(n),s=l.move(i);let o=l.move(r.containerPhrasing(e,{after:i,before:s,...l.current()}));const u=o.charCodeAt(0),h=ln(n.before.charCodeAt(n.before.length-1),u,i);h.inside&&(o=Ar(u)+o.slice(1));const m=o.charCodeAt(o.length-1),d=ln(n.after.charCodeAt(0),m,i);d.inside&&(o=o.slice(0,-1)+Ar(m));const p=l.move(i);return a(),r.attentionEncodeSurroundingInfo={after:d.outside,before:h.outside},s+o+p}function i4(e,t,r){return r.options.emphasis||"*"}function a4(e,t){let r=!1;return ti(e,function(n){if("value"in n&&/\r?\n|\r/.test(n.value)||n.type==="break")return r=!0,x0}),!!((!e.depth||e.depth<3)&&Y0(e)&&(t.options.setext||r))}function l4(e,t,r,n){const i=Math.max(Math.min(6,e.depth||1),1),a=r.createTracker(n);if(a4(e,r)){const h=r.enter("headingSetext"),m=r.enter("phrasing"),d=r.containerPhrasing(e,{...a.current(),before:` +`,after:` +`});return m(),h(),d+` +`+(i===1?"=":"-").repeat(d.length-(Math.max(d.lastIndexOf("\r"),d.lastIndexOf(` +`))+1))}const l="#".repeat(i),s=r.enter("headingAtx"),o=r.enter("phrasing");a.move(l+" ");let u=r.containerPhrasing(e,{before:"# ",after:` +`,...a.current()});return/^[\t ]/.test(u)&&(u=Ar(u.charCodeAt(0))+u.slice(1)),u=u?l+" "+u:l,r.options.closeAtx&&(u+=" "+l),o(),s(),u}Jl.peek=s4;function Jl(e){return e.value||""}function s4(){return"<"}es.peek=o4;function es(e,t,r,n){const i=ni(r),a=i==='"'?"Quote":"Apostrophe",l=r.enter("image");let s=r.enter("label");const o=r.createTracker(n);let u=o.move("![");return u+=o.move(r.safe(e.alt,{before:u,after:"]",...o.current()})),u+=o.move("]("),s(),!e.url&&e.title||/[\0- \u007F]/.test(e.url)?(s=r.enter("destinationLiteral"),u+=o.move("<"),u+=o.move(r.safe(e.url,{before:u,after:">",...o.current()})),u+=o.move(">")):(s=r.enter("destinationRaw"),u+=o.move(r.safe(e.url,{before:u,after:e.title?" ":")",...o.current()}))),s(),e.title&&(s=r.enter(`title${a}`),u+=o.move(" "+i),u+=o.move(r.safe(e.title,{before:u,after:i,...o.current()})),u+=o.move(i),s()),u+=o.move(")"),l(),u}function o4(){return"!"}ts.peek=u4;function ts(e,t,r,n){const i=e.referenceType,a=r.enter("imageReference");let l=r.enter("label");const s=r.createTracker(n);let o=s.move("![");const u=r.safe(e.alt,{before:o,after:"]",...s.current()});o+=s.move(u+"]["),l();const h=r.stack;r.stack=[],l=r.enter("reference");const m=r.safe(r.associationId(e),{before:o,after:"]",...s.current()});return l(),r.stack=h,a(),i==="full"||!u||u!==m?o+=s.move(m+"]"):i==="shortcut"?o=o.slice(0,-1):o+=s.move("]"),o}function u4(){return"!"}rs.peek=c4;function rs(e,t,r){let n=e.value||"",i="`",a=-1;for(;new RegExp("(^|[^`])"+i+"([^`]|$)").test(n);)i+="`";for(/[^ \r\n]/.test(n)&&(/^[ \r\n]/.test(n)&&/[ \r\n]$/.test(n)||/^`|`$/.test(n))&&(n=" "+n+" ");++a\u007F]/.test(e.url))}is.peek=h4;function is(e,t,r,n){const i=ni(r),a=i==='"'?"Quote":"Apostrophe",l=r.createTracker(n);let s,o;if(ns(e,r)){const h=r.stack;r.stack=[],s=r.enter("autolink");let m=l.move("<");return m+=l.move(r.containerPhrasing(e,{before:m,after:">",...l.current()})),m+=l.move(">"),s(),r.stack=h,m}s=r.enter("link"),o=r.enter("label");let u=l.move("[");return u+=l.move(r.containerPhrasing(e,{before:u,after:"](",...l.current()})),u+=l.move("]("),o(),!e.url&&e.title||/[\0- \u007F]/.test(e.url)?(o=r.enter("destinationLiteral"),u+=l.move("<"),u+=l.move(r.safe(e.url,{before:u,after:">",...l.current()})),u+=l.move(">")):(o=r.enter("destinationRaw"),u+=l.move(r.safe(e.url,{before:u,after:e.title?" ":")",...l.current()}))),o(),e.title&&(o=r.enter(`title${a}`),u+=l.move(" "+i),u+=l.move(r.safe(e.title,{before:u,after:i,...l.current()})),u+=l.move(i),o()),u+=l.move(")"),s(),u}function h4(e,t,r){return ns(e,r)?"<":"["}as.peek=m4;function as(e,t,r,n){const i=e.referenceType,a=r.enter("linkReference");let l=r.enter("label");const s=r.createTracker(n);let o=s.move("[");const u=r.containerPhrasing(e,{before:o,after:"]",...s.current()});o+=s.move(u+"]["),l();const h=r.stack;r.stack=[],l=r.enter("reference");const m=r.safe(r.associationId(e),{before:o,after:"]",...s.current()});return l(),r.stack=h,a(),i==="full"||!u||u!==m?o+=s.move(m+"]"):i==="shortcut"?o=o.slice(0,-1):o+=s.move("]"),o}function m4(){return"["}function ii(e){const t=e.options.bullet||"*";if(t!=="*"&&t!=="+"&&t!=="-")throw new Error("Cannot serialize items with `"+t+"` for `options.bullet`, expected `*`, `+`, or `-`");return t}function f4(e){const t=ii(e),r=e.options.bulletOther;if(!r)return t==="*"?"-":"*";if(r!=="*"&&r!=="+"&&r!=="-")throw new Error("Cannot serialize items with `"+r+"` for `options.bulletOther`, expected `*`, `+`, or `-`");if(r===t)throw new Error("Expected `bullet` (`"+t+"`) and `bulletOther` (`"+r+"`) to be different");return r}function p4(e){const t=e.options.bulletOrdered||".";if(t!=="."&&t!==")")throw new Error("Cannot serialize items with `"+t+"` for `options.bulletOrdered`, expected `.` or `)`");return t}function ls(e){const t=e.options.rule||"*";if(t!=="*"&&t!=="-"&&t!=="_")throw new Error("Cannot serialize rules with `"+t+"` for `options.rule`, expected `*`, `-`, or `_`");return t}function d4(e,t,r,n){const i=r.enter("list"),a=r.bulletCurrent;let l=e.ordered?p4(r):ii(r);const s=e.ordered?l==="."?")":".":f4(r);let o=t&&r.bulletLastUsed?l===r.bulletLastUsed:!1;if(!e.ordered){const h=e.children?e.children[0]:void 0;if((l==="*"||l==="-")&&h&&(!h.children||!h.children[0])&&r.stack[r.stack.length-1]==="list"&&r.stack[r.stack.length-2]==="listItem"&&r.stack[r.stack.length-3]==="list"&&r.stack[r.stack.length-4]==="listItem"&&r.indexStack[r.indexStack.length-1]===0&&r.indexStack[r.indexStack.length-2]===0&&r.indexStack[r.indexStack.length-3]===0&&(o=!0),ls(r)===l&&h){let m=-1;for(;++m-1?t.start:1)+(r.options.incrementListMarker===!1?0:t.children.indexOf(e))+a);let l=a.length+1;(i==="tab"||i==="mixed"&&(t&&t.type==="list"&&t.spread||e.spread))&&(l=Math.ceil(l/4)*4);const s=r.createTracker(n);s.move(a+" ".repeat(l-a.length)),s.shift(l);const o=r.enter("listItem"),u=r.indentLines(r.containerFlow(e,s.current()),h);return o(),u;function h(m,d,p){return d?(p?"":" ".repeat(l))+m:(p?a:a+" ".repeat(l-a.length))+m}}function y4(e,t,r,n){const i=r.enter("paragraph"),a=r.enter("phrasing"),l=r.containerPhrasing(e,n);return a(),i(),l}const b4=Dr(["break","delete","emphasis","footnote","footnoteReference","image","imageReference","inlineCode","inlineMath","link","linkReference","mdxJsxTextElement","mdxTextExpression","strong","text","textDirective"]);function x4(e,t,r,n){return(e.children.some(function(l){return b4(l)})?r.containerPhrasing:r.containerFlow).call(r,e,n)}function w4(e){const t=e.options.strong||"*";if(t!=="*"&&t!=="_")throw new Error("Cannot serialize strong with `"+t+"` for `options.strong`, expected `*`, or `_`");return t}ss.peek=k4;function ss(e,t,r,n){const i=w4(r),a=r.enter("strong"),l=r.createTracker(n),s=l.move(i+i);let o=l.move(r.containerPhrasing(e,{after:i,before:s,...l.current()}));const u=o.charCodeAt(0),h=ln(n.before.charCodeAt(n.before.length-1),u,i);h.inside&&(o=Ar(u)+o.slice(1));const m=o.charCodeAt(o.length-1),d=ln(n.after.charCodeAt(0),m,i);d.inside&&(o=o.slice(0,-1)+Ar(m));const p=l.move(i+i);return a(),r.attentionEncodeSurroundingInfo={after:d.outside,before:h.outside},s+o+p}function k4(e,t,r){return r.options.strong||"*"}function S4(e,t,r,n){return r.safe(e.value,n)}function A4(e){const t=e.options.ruleRepetition||3;if(t<3)throw new Error("Cannot serialize rules with repetition `"+t+"` for `options.ruleRepetition`, expected `3` or more");return t}function T4(e,t,r){const n=(ls(r)+(r.options.ruleSpaces?" ":"")).repeat(A4(r));return r.options.ruleSpaces?n.slice(0,-1):n}const os={blockquote:Yh,break:ha,code:e4,definition:r4,emphasis:Ql,hardBreak:ha,heading:l4,html:Jl,image:es,imageReference:ts,inlineCode:rs,link:is,linkReference:as,list:d4,listItem:v4,paragraph:y4,root:x4,strong:ss,text:S4,thematicBreak:T4};function C4(){return{enter:{table:z4,tableData:ma,tableHeader:ma,tableRow:E4},exit:{codeText:I4,table:M4,tableData:Yn,tableHeader:Yn,tableRow:Yn}}}function z4(e){const t=e._align;this.enter({type:"table",align:t.map(function(r){return r==="none"?null:r}),children:[]},e),this.data.inTable=!0}function M4(e){this.exit(e),this.data.inTable=void 0}function E4(e){this.enter({type:"tableRow",children:[]},e)}function Yn(e){this.exit(e)}function ma(e){this.enter({type:"tableCell",children:[]},e)}function I4(e){let t=this.resume();this.data.inTable&&(t=t.replace(/\\([\\|])/g,D4));const r=this.stack[this.stack.length-1];r.type,r.value=t,this.exit(e)}function D4(e,t){return t==="|"?t:e}function B4(e){const t=e||{},r=t.tableCellPadding,n=t.tablePipeAlign,i=t.stringLength,a=r?" ":"|";return{unsafe:[{character:"\r",inConstruct:"tableCell"},{character:` +`,inConstruct:"tableCell"},{atBreak:!0,character:"|",after:"[ :-]"},{character:"|",inConstruct:"tableCell"},{atBreak:!0,character:":",after:"-"},{atBreak:!0,character:"-",after:"[:|-]"}],handlers:{inlineCode:d,table:l,tableCell:o,tableRow:s}};function l(p,y,w,C){return u(h(p,w,C),p.align)}function s(p,y,w,C){const A=m(p,w,C),z=u([A]);return z.slice(0,z.indexOf(` +`))}function o(p,y,w,C){const A=w.enter("tableCell"),z=w.enter("phrasing"),I=w.containerPhrasing(p,{...C,before:a,after:a});return z(),A(),I}function u(p,y){return Wh(p,{align:y,alignDelimiters:n,padding:r,stringLength:i})}function h(p,y,w){const C=p.children;let A=-1;const z=[],I=y.enter("table");for(;++A0&&!r&&(e[e.length-1][1]._gfmAutolinkLiteralWalkedInto=!0),r}const K4={tokenize:im,partial:!0};function Z4(){return{document:{91:{name:"gfmFootnoteDefinition",tokenize:tm,continuation:{tokenize:rm},exit:nm}},text:{91:{name:"gfmFootnoteCall",tokenize:em},93:{name:"gfmPotentialFootnoteCall",add:"after",tokenize:Q4,resolveTo:J4}}}}function Q4(e,t,r){const n=this;let i=n.events.length;const a=n.parser.gfmFootnotes||(n.parser.gfmFootnotes=[]);let l;for(;i--;){const o=n.events[i][1];if(o.type==="labelImage"){l=o;break}if(o.type==="gfmFootnoteCall"||o.type==="labelLink"||o.type==="label"||o.type==="image"||o.type==="link")break}return s;function s(o){if(!l||!l._balanced)return r(o);const u=nt(n.sliceSerialize({start:l.end,end:n.now()}));return u.codePointAt(0)!==94||!a.includes(u.slice(1))?r(o):(e.enter("gfmFootnoteCallLabelMarker"),e.consume(o),e.exit("gfmFootnoteCallLabelMarker"),t(o))}}function J4(e,t){let r=e.length;for(;r--;)if(e[r][1].type==="labelImage"&&e[r][0]==="enter"){e[r][1];break}e[r+1][1].type="data",e[r+3][1].type="gfmFootnoteCallLabelMarker";const n={type:"gfmFootnoteCall",start:Object.assign({},e[r+3][1].start),end:Object.assign({},e[e.length-1][1].end)},i={type:"gfmFootnoteCallMarker",start:Object.assign({},e[r+3][1].end),end:Object.assign({},e[r+3][1].end)};i.end.column++,i.end.offset++,i.end._bufferIndex++;const a={type:"gfmFootnoteCallString",start:Object.assign({},i.end),end:Object.assign({},e[e.length-1][1].start)},l={type:"chunkString",contentType:"string",start:Object.assign({},a.start),end:Object.assign({},a.end)},s=[e[r+1],e[r+2],["enter",n,t],e[r+3],e[r+4],["enter",i,t],["exit",i,t],["enter",a,t],["enter",l,t],["exit",l,t],["exit",a,t],e[e.length-2],e[e.length-1],["exit",n,t]];return e.splice(r,e.length-r+1,...s),e}function em(e,t,r){const n=this,i=n.parser.gfmFootnotes||(n.parser.gfmFootnotes=[]);let a=0,l;return s;function s(m){return e.enter("gfmFootnoteCall"),e.enter("gfmFootnoteCallLabelMarker"),e.consume(m),e.exit("gfmFootnoteCallLabelMarker"),o}function o(m){return m!==94?r(m):(e.enter("gfmFootnoteCallMarker"),e.consume(m),e.exit("gfmFootnoteCallMarker"),e.enter("gfmFootnoteCallString"),e.enter("chunkString").contentType="string",u)}function u(m){if(a>999||m===93&&!l||m===null||m===91||me(m))return r(m);if(m===93){e.exit("chunkString");const d=e.exit("gfmFootnoteCallString");return i.includes(nt(n.sliceSerialize(d)))?(e.enter("gfmFootnoteCallLabelMarker"),e.consume(m),e.exit("gfmFootnoteCallLabelMarker"),e.exit("gfmFootnoteCall"),t):r(m)}return me(m)||(l=!0),a++,e.consume(m),m===92?h:u}function h(m){return m===91||m===92||m===93?(e.consume(m),a++,u):u(m)}}function tm(e,t,r){const n=this,i=n.parser.gfmFootnotes||(n.parser.gfmFootnotes=[]);let a,l=0,s;return o;function o(y){return e.enter("gfmFootnoteDefinition")._container=!0,e.enter("gfmFootnoteDefinitionLabel"),e.enter("gfmFootnoteDefinitionLabelMarker"),e.consume(y),e.exit("gfmFootnoteDefinitionLabelMarker"),u}function u(y){return y===94?(e.enter("gfmFootnoteDefinitionMarker"),e.consume(y),e.exit("gfmFootnoteDefinitionMarker"),e.enter("gfmFootnoteDefinitionLabelString"),e.enter("chunkString").contentType="string",h):r(y)}function h(y){if(l>999||y===93&&!s||y===null||y===91||me(y))return r(y);if(y===93){e.exit("chunkString");const w=e.exit("gfmFootnoteDefinitionLabelString");return a=nt(n.sliceSerialize(w)),e.enter("gfmFootnoteDefinitionLabelMarker"),e.consume(y),e.exit("gfmFootnoteDefinitionLabelMarker"),e.exit("gfmFootnoteDefinitionLabel"),d}return me(y)||(s=!0),l++,e.consume(y),y===92?m:h}function m(y){return y===91||y===92||y===93?(e.consume(y),l++,h):h(y)}function d(y){return y===58?(e.enter("definitionMarker"),e.consume(y),e.exit("definitionMarker"),i.includes(a)||i.push(a),ie(e,p,"gfmFootnoteDefinitionWhitespace")):r(y)}function p(y){return t(y)}}function rm(e,t,r){return e.check(Ir,t,e.attempt(K4,t,r))}function nm(e){e.exit("gfmFootnoteDefinition")}function im(e,t,r){const n=this;return ie(e,i,"gfmFootnoteDefinitionIndent",5);function i(a){const l=n.events[n.events.length-1];return l&&l[1].type==="gfmFootnoteDefinitionIndent"&&l[2].sliceSerialize(l[1],!0).length===4?t(a):r(a)}}function am(e){let r=(e||{}).singleTilde;const n={name:"strikethrough",tokenize:a,resolveAll:i};return r==null&&(r=!0),{text:{126:n},insideSpan:{null:[n]},attentionMarkers:{null:[126]}};function i(l,s){let o=-1;for(;++o1?o(y):(l.consume(y),m++,p);if(m<2&&!r)return o(y);const C=l.exit("strikethroughSequenceTemporary"),A=er(y);return C._open=!A||A===2&&!!w,C._close=!w||w===2&&!!A,s(y)}}}class lm{constructor(){this.map=[]}add(t,r,n){sm(this,t,r,n)}consume(t){if(this.map.sort(function(a,l){return a[0]-l[0]}),this.map.length===0)return;let r=this.map.length;const n=[];for(;r>0;)r-=1,n.push(t.slice(this.map[r][0]+this.map[r][1]),this.map[r][2]),t.length=this.map[r][0];n.push(t.slice()),t.length=0;let i=n.pop();for(;i;){for(const a of i)t.push(a);i=n.pop()}this.map.length=0}}function sm(e,t,r,n){let i=0;if(!(r===0&&n.length===0)){for(;i-1;){const Y=n.events[V][1].type;if(Y==="lineEnding"||Y==="linePrefix")V--;else break}const $=V>-1?n.events[V][1].type:null,se=$==="tableHead"||$==="tableRow"?M:o;return se===M&&n.parser.lazy[n.now().line]?r(E):se(E)}function o(E){return e.enter("tableHead"),e.enter("tableRow"),u(E)}function u(E){return E===124||(l=!0,a+=1),h(E)}function h(E){return E===null?r(E):K(E)?a>1?(a=0,n.interrupt=!0,e.exit("tableRow"),e.enter("lineEnding"),e.consume(E),e.exit("lineEnding"),p):r(E):le(E)?ie(e,h,"whitespace")(E):(a+=1,l&&(l=!1,i+=1),E===124?(e.enter("tableCellDivider"),e.consume(E),e.exit("tableCellDivider"),l=!0,h):(e.enter("data"),m(E)))}function m(E){return E===null||E===124||me(E)?(e.exit("data"),h(E)):(e.consume(E),E===92?d:m)}function d(E){return E===92||E===124?(e.consume(E),m):m(E)}function p(E){return n.interrupt=!1,n.parser.lazy[n.now().line]?r(E):(e.enter("tableDelimiterRow"),l=!1,le(E)?ie(e,y,"linePrefix",n.parser.constructs.disable.null.includes("codeIndented")?void 0:4)(E):y(E))}function y(E){return E===45||E===58?C(E):E===124?(l=!0,e.enter("tableCellDivider"),e.consume(E),e.exit("tableCellDivider"),w):O(E)}function w(E){return le(E)?ie(e,C,"whitespace")(E):C(E)}function C(E){return E===58?(a+=1,l=!0,e.enter("tableDelimiterMarker"),e.consume(E),e.exit("tableDelimiterMarker"),A):E===45?(a+=1,A(E)):E===null||K(E)?q(E):O(E)}function A(E){return E===45?(e.enter("tableDelimiterFiller"),z(E)):O(E)}function z(E){return E===45?(e.consume(E),z):E===58?(l=!0,e.exit("tableDelimiterFiller"),e.enter("tableDelimiterMarker"),e.consume(E),e.exit("tableDelimiterMarker"),I):(e.exit("tableDelimiterFiller"),I(E))}function I(E){return le(E)?ie(e,q,"whitespace")(E):q(E)}function q(E){return E===124?y(E):E===null||K(E)?!l||i!==a?O(E):(e.exit("tableDelimiterRow"),e.exit("tableHead"),t(E)):O(E)}function O(E){return r(E)}function M(E){return e.enter("tableRow"),G(E)}function G(E){return E===124?(e.enter("tableCellDivider"),e.consume(E),e.exit("tableCellDivider"),G):E===null||K(E)?(e.exit("tableRow"),t(E)):le(E)?ie(e,G,"whitespace")(E):(e.enter("data"),X(E))}function X(E){return E===null||E===124||me(E)?(e.exit("data"),G(E)):(e.consume(E),E===92?U:X)}function U(E){return E===92||E===124?(e.consume(E),X):X(E)}}function hm(e,t){let r=-1,n=!0,i=0,a=[0,0,0,0],l=[0,0,0,0],s=!1,o=0,u,h,m;const d=new lm;for(;++rr[2]+1){const y=r[2]+1,w=r[3]-r[2]-1;e.add(y,w,[])}}e.add(r[3]+1,0,[["exit",m,t]])}return i!==void 0&&(a.end=Object.assign({},Qt(t.events,i)),e.add(i,0,[["exit",a,t]]),a=void 0),a}function pa(e,t,r,n,i){const a=[],l=Qt(t.events,r);i&&(i.end=Object.assign({},l),a.push(["exit",i,t])),n.end=Object.assign({},l),a.push(["exit",n,t]),e.add(r+1,0,a)}function Qt(e,t){const r=e[t],n=r[0]==="enter"?"start":"end";return r[1][n]}const mm={name:"tasklistCheck",tokenize:pm};function fm(){return{text:{91:mm}}}function pm(e,t,r){const n=this;return i;function i(o){return n.previous!==null||!n._gfmTasklistFirstContentOfListItem?r(o):(e.enter("taskListCheck"),e.enter("taskListCheckMarker"),e.consume(o),e.exit("taskListCheckMarker"),a)}function a(o){return me(o)?(e.enter("taskListCheckValueUnchecked"),e.consume(o),e.exit("taskListCheckValueUnchecked"),l):o===88||o===120?(e.enter("taskListCheckValueChecked"),e.consume(o),e.exit("taskListCheckValueChecked"),l):r(o)}function l(o){return o===93?(e.enter("taskListCheckMarker"),e.consume(o),e.exit("taskListCheckMarker"),e.exit("taskListCheck"),s):r(o)}function s(o){return K(o)?t(o):le(o)?e.check({tokenize:dm},t,r)(o):r(o)}}function dm(e,t,r){return ie(e,n,"whitespace");function n(i){return i===null?r(i):t(i)}}function gm(e){return Bl([j4(),Z4(),am(e),um(),fm()])}const vm={};function U5(e){const t=this,r=e||vm,n=t.data(),i=n.micromarkExtensions||(n.micromarkExtensions=[]),a=n.fromMarkdownExtensions||(n.fromMarkdownExtensions=[]),l=n.toMarkdownExtensions||(n.toMarkdownExtensions=[]);i.push(gm(r)),a.push(P4()),l.push(O4(r))}const li={}.hasOwnProperty,ym=new Map,bm=/[A-Z]/g,xm=new Set(["table","tbody","thead","tfoot","tr"]),wm=new Set(["td","th"]),vs="https://github.com/syntax-tree/hast-util-to-jsx-runtime";function km(e,t){if(!t||t.Fragment===void 0)throw new TypeError("Expected `Fragment` in options");const r=t.filePath||void 0;let n;if(t.development){if(typeof t.jsxDEV!="function")throw new TypeError("Expected `jsxDEV` in options when `development: true`");n=Im(r,t.jsxDEV)}else{if(typeof t.jsx!="function")throw new TypeError("Expected `jsx` in production options");if(typeof t.jsxs!="function")throw new TypeError("Expected `jsxs` in production options");n=Em(r,t.jsx,t.jsxs)}const i={Fragment:t.Fragment,ancestors:[],components:t.components||{},create:n,elementAttributeNameCase:t.elementAttributeNameCase||"react",evaluater:t.createEvaluater?t.createEvaluater():void 0,filePath:r,ignoreInvalidStyle:t.ignoreInvalidStyle||!1,passKeys:t.passKeys!==!1,passNode:t.passNode||!1,schema:t.space==="svg"?pn:kl,stylePropertyNameCase:t.stylePropertyNameCase||"dom",tableCellAlignToStyle:t.tableCellAlignToStyle!==!1},a=ys(i,e,void 0);return a&&typeof a!="string"?a:i.create(e,i.Fragment,{children:a||void 0},void 0)}function ys(e,t,r){if(t.type==="element")return Sm(e,t,r);if(t.type==="mdxFlowExpression"||t.type==="mdxTextExpression")return Am(e,t);if(t.type==="mdxJsxFlowElement"||t.type==="mdxJsxTextElement")return Cm(e,t,r);if(t.type==="mdxjsEsm")return Tm(e,t);if(t.type==="root")return zm(e,t,r);if(t.type==="text")return Mm(e,t)}function Sm(e,t,r){const n=e.schema;let i=n;t.tagName.toLowerCase()==="svg"&&n.space==="html"&&(i=pn,e.schema=i),e.ancestors.push(t);const a=xs(e,t.tagName,!1),l=Dm(e,t);let s=oi(e,t);return xm.has(t.tagName)&&(s=s.filter(function(o){return typeof o=="string"?!iu(o):!0})),bs(e,l,a,t),si(l,s),e.ancestors.pop(),e.schema=n,e.create(t,a,l,r)}function Am(e,t){if(t.data&&t.data.estree&&e.evaluater){const n=t.data.estree.body[0];return n.type,e.evaluater.evaluateExpression(n.expression)}Tr(e,t.position)}function Tm(e,t){if(t.data&&t.data.estree&&e.evaluater)return e.evaluater.evaluateProgram(t.data.estree);Tr(e,t.position)}function Cm(e,t,r){const n=e.schema;let i=n;t.name==="svg"&&n.space==="html"&&(i=pn,e.schema=i),e.ancestors.push(t);const a=t.name===null?e.Fragment:xs(e,t.name,!0),l=Bm(e,t),s=oi(e,t);return bs(e,l,a,t),si(l,s),e.ancestors.pop(),e.schema=n,e.create(t,a,l,r)}function zm(e,t,r){const n={};return si(n,oi(e,t)),e.create(t,e.Fragment,n,r)}function Mm(e,t){return t.value}function bs(e,t,r,n){typeof r!="string"&&r!==e.Fragment&&e.passNode&&(t.node=n)}function si(e,t){if(t.length>0){const r=t.length>1?t:t[0];r&&(e.children=r)}}function Em(e,t,r){return n;function n(i,a,l,s){const u=Array.isArray(l.children)?r:t;return s?u(a,l,s):u(a,l)}}function Im(e,t){return r;function r(n,i,a,l){const s=Array.isArray(a.children),o=G0(n);return t(i,a,l,s,{columnNumber:o?o.column-1:void 0,fileName:e,lineNumber:o?o.line:void 0},void 0)}}function Dm(e,t){const r={};let n,i;for(i in t.properties)if(i!=="children"&&li.call(t.properties,i)){const a=Fm(e,i,t.properties[i]);if(a){const[l,s]=a;e.tableCellAlignToStyle&&l==="align"&&typeof s=="string"&&wm.has(t.tagName)?n=s:r[l]=s}}if(n){const a=r.style||(r.style={});a[e.stylePropertyNameCase==="css"?"text-align":"textAlign"]=n}return r}function Bm(e,t){const r={};for(const n of t.attributes)if(n.type==="mdxJsxExpressionAttribute")if(n.data&&n.data.estree&&e.evaluater){const a=n.data.estree.body[0];a.type;const l=a.expression;l.type;const s=l.properties[0];s.type,Object.assign(r,e.evaluater.evaluateExpression(s.argument))}else Tr(e,t.position);else{const i=n.name;let a;if(n.value&&typeof n.value=="object")if(n.value.data&&n.value.data.estree&&e.evaluater){const s=n.value.data.estree.body[0];s.type,a=e.evaluater.evaluateExpression(s.expression)}else Tr(e,t.position);else a=n.value===null?!0:n.value;r[i]=a}return r}function oi(e,t){const r=[];let n=-1;const i=e.passKeys?new Map:ym;for(;++ni||r!==-1&&t>r||n!==-1&&t>n||qm.test(e.slice(0,t))?e:""}function _m(){return{enter:{mathFlow:e,mathFlowFenceMeta:t,mathText:a},exit:{mathFlow:i,mathFlowFence:n,mathFlowFenceMeta:r,mathFlowValue:s,mathText:l,mathTextData:s}};function e(o){const u={type:"element",tagName:"code",properties:{className:["language-math","math-display"]},children:[]};this.enter({type:"math",meta:null,value:"",data:{hName:"pre",hChildren:[u]}},o)}function t(){this.buffer()}function r(){const o=this.resume(),u=this.stack[this.stack.length-1];u.type,u.meta=o}function n(){this.data.mathFlowInside||(this.buffer(),this.data.mathFlowInside=!0)}function i(o){const u=this.resume().replace(/^(\r?\n|\r)|(\r?\n|\r)$/g,""),h=this.stack[this.stack.length-1];h.type,this.exit(o),h.value=u;const m=h.data.hChildren[0];m.type,m.tagName,m.children.push({type:"text",value:u}),this.data.mathFlowInside=void 0}function a(o){this.enter({type:"inlineMath",value:"",data:{hName:"code",hProperties:{className:["language-math","math-inline"]},hChildren:[]}},o),this.buffer()}function l(o){const u=this.resume(),h=this.stack[this.stack.length-1];h.type,this.exit(o),h.value=u,h.data.hChildren.push({type:"text",value:u})}function s(o){this.config.enter.data.call(this,o),this.config.exit.data.call(this,o)}}function Gm(e){let t=(e||{}).singleDollarTextMath;return t==null&&(t=!0),n.peek=i,{unsafe:[{character:"\r",inConstruct:"mathFlowMeta"},{character:` +`,inConstruct:"mathFlowMeta"},{character:"$",after:t?void 0:"\\$",inConstruct:"phrasing"},{character:"$",inConstruct:"mathFlowMeta"},{atBreak:!0,character:"$",after:"\\$"}],handlers:{math:r,inlineMath:n}};function r(a,l,s,o){const u=a.value||"",h=s.createTracker(o),m="$".repeat(Math.max(Zl(u,"$")+1,2)),d=s.enter("mathFlow");let p=h.move(m);if(a.meta){const y=s.enter("mathFlowMeta");p+=h.move(s.safe(a.meta,{after:` +`,before:p,encode:["$"],...h.current()})),y()}return p+=h.move(` +`),u&&(p+=h.move(u+` +`)),p+=h.move(m),d(),p}function n(a,l,s){let o=a.value||"",u=1;for(t||u++;new RegExp("(^|[^$])"+"\\$".repeat(u)+"([^$]|$)").test(o);)u++;const h="$".repeat(u);/[^ \r\n]/.test(o)&&(/^[ \r\n]/.test(o)&&/[ \r\n]$/.test(o)||/^\$|\$$/.test(o))&&(o=" "+o+" ");let m=-1;for(;++mu&&(u=h):h&&(u!==void 0&&u>-1&&o.push(` +`.repeat(u)||" "),u=-1,o.push(h))}return o.join("")}function Ts(e,t,r){return e.type==="element"?Tf(e,t,r):e.type==="text"?r.whitespace==="normal"?Cs(e,r):Cf(e):[]}function Tf(e,t,r){const n=zs(e,r),i=e.children||[];let a=-1,l=[];if(Sf(e))return l;let s,o;for(T0(e)||Ta(e)&&wa(t,e,Ta)?o=` +`:kf(e)?(s=2,o=2):As(e)&&(s=1,o=1);++a15?u="…"+s.slice(i-15,i):u=s.slice(0,i);var h;a+15e.replace(Df,"-$1").toLowerCase(),Ff={"&":"&",">":">","<":"<",'"':""","'":"'"},Rf=/[&><"']/g,De=e=>String(e).replace(Rf,t=>Ff[t]),en=e=>e.type==="ordgroup"||e.type==="color"?e.body.length===1?en(e.body[0]):e:e.type==="font"?en(e.body):e,Lf=new Set(["mathord","textord","atom"]),xt=e=>Lf.has(en(e).type),Nf=e=>{var t=/^[\x00-\x20]*([^\\/#?]*?)(:|�*58|�*3a|&colon)/i.exec(e);return t?t[2]!==":"||!/^[a-zA-Z][a-zA-Z0-9+\-.]*$/.test(t[1])?null:t[1].toLowerCase():"_relative"},C0={displayMode:{type:"boolean",description:"Render math in display mode, which puts the math in display style (so \\int and \\sum are large, for example), and centers the math on the page on its own line.",cli:"-d, --display-mode"},output:{type:{enum:["htmlAndMathml","html","mathml"]},description:"Determines the markup language of the output.",cli:"-F, --format "},leqno:{type:"boolean",description:"Render display math in leqno style (left-justified tags)."},fleqn:{type:"boolean",description:"Render display math flush left."},throwOnError:{type:"boolean",default:!0,cli:"-t, --no-throw-on-error",cliDescription:"Render errors (in the color given by --error-color) instead of throwing a ParseError exception when encountering an error."},errorColor:{type:"string",default:"#cc0000",cli:"-c, --error-color ",cliDescription:"A color string given in the format 'rgb' or 'rrggbb' (no #). This option determines the color of errors rendered by the -t option.",cliProcessor:e=>"#"+e},macros:{type:"object",cli:"-m, --macro ",cliDescription:"Define custom macro of the form '\\foo:expansion' (use multiple -m arguments for multiple macros).",cliDefault:[],cliProcessor:(e,t)=>(t.push(e),t)},minRuleThickness:{type:"number",description:"Specifies a minimum thickness, in ems, for fraction lines, `\\sqrt` top lines, `{array}` vertical lines, `\\hline`, `\\hdashline`, `\\underline`, `\\overline`, and the borders of `\\fbox`, `\\boxed`, and `\\fcolorbox`.",processor:e=>Math.max(0,e),cli:"--min-rule-thickness ",cliProcessor:parseFloat},colorIsTextColor:{type:"boolean",description:"Makes \\color behave like LaTeX's 2-argument \\textcolor, instead of LaTeX's one-argument \\color mode change.",cli:"-b, --color-is-text-color"},strict:{type:[{enum:["warn","ignore","error"]},"boolean","function"],description:"Turn on strict / LaTeX faithfulness mode, which throws an error if the input uses features that are not supported by LaTeX.",cli:"-S, --strict",cliDefault:!1},trust:{type:["boolean","function"],description:"Trust the input, enabling all HTML features such as \\url.",cli:"-T, --trust"},maxSize:{type:"number",default:1/0,description:"If non-zero, all user-specified sizes, e.g. in \\rule{500em}{500em}, will be capped to maxSize ems. Otherwise, elements and spaces can be arbitrarily large",processor:e=>Math.max(0,e),cli:"-s, --max-size ",cliProcessor:parseInt},maxExpand:{type:"number",default:1e3,description:"Limit the number of macro expansions to the specified number, to prevent e.g. infinite macro loops. If set to Infinity, the macro expander will try to fully expand as in LaTeX.",processor:e=>Math.max(0,e),cli:"-e, --max-expand ",cliProcessor:e=>e==="Infinity"?1/0:parseInt(e)},globalGroup:{type:"boolean",cli:!1}};function Pf(e){if(typeof e!="string")return e.enum[0];switch(e){case"boolean":return!1;case"string":return"";case"number":return 0;case"object":return{};default:throw new Error("Unexpected schema type; settings must declare an explicit default.")}}function Of(e){if(e.default!==void 0)return e.default;var t=Array.isArray(e.type)?e.type[0]:e.type;return Pf(t)}function qf(e,t,r,n){var i=r[t];e[t]=i!==void 0?n.processor?n.processor(i):i:Of(n)}class ci{constructor(t){t===void 0&&(t={}),this.displayMode=void 0,this.output=void 0,this.leqno=void 0,this.fleqn=void 0,this.throwOnError=void 0,this.errorColor=void 0,this.macros=void 0,this.minRuleThickness=void 0,this.colorIsTextColor=void 0,this.strict=void 0,this.trust=void 0,this.maxSize=void 0,this.maxExpand=void 0,this.globalGroup=void 0,t=t||{};for(var r of Object.keys(C0)){var n=C0[r];n&&qf(this,r,t,n)}}reportNonstrict(t,r,n){var i=this.strict;if(typeof i=="function"&&(i=i(t,r,n)),!(!i||i==="ignore")){if(i===!0||i==="error")throw new L("LaTeX-incompatible input and strict mode is set to 'error': "+(r+" ["+t+"]"),n);i==="warn"?typeof console<"u"&&console.warn("LaTeX-incompatible input and strict mode is set to 'warn': "+(r+" ["+t+"]")):typeof console<"u"&&console.warn("LaTeX-incompatible input and strict mode is set to "+("unrecognized '"+i+"': "+r+" ["+t+"]"))}}useStrictBehavior(t,r,n){var i=this.strict;if(typeof i=="function")try{i=i(t,r,n)}catch{i="error"}return!i||i==="ignore"?!1:i===!0||i==="error"?!0:i==="warn"?(typeof console<"u"&&console.warn("LaTeX-incompatible input and strict mode is set to 'warn': "+(r+" ["+t+"]")),!1):(typeof console<"u"&&console.warn("LaTeX-incompatible input and strict mode is set to "+("unrecognized '"+i+"': "+r+" ["+t+"]")),!1)}isTrusted(t){if("url"in t&&t.url&&!t.protocol){var r=Nf(t.url);if(r==null)return!1;t.protocol=r}var n=typeof this.trust=="function"?this.trust(t):this.trust;return!!n}}class At{constructor(t,r,n){this.id=void 0,this.size=void 0,this.cramped=void 0,this.id=t,this.size=r,this.cramped=n}sup(){return lt[Hf[this.id]]}sub(){return lt[jf[this.id]]}fracNum(){return lt[$f[this.id]]}fracDen(){return lt[Uf[this.id]]}cramp(){return lt[Vf[this.id]]}text(){return lt[_f[this.id]]}isTight(){return this.size>=2}}var hi=0,sn=1,Jt=2,vt=3,Cr=4,Je=5,tr=6,Pe=7,lt=[new At(hi,0,!1),new At(sn,0,!0),new At(Jt,1,!1),new At(vt,1,!0),new At(Cr,2,!1),new At(Je,2,!0),new At(tr,3,!1),new At(Pe,3,!0)],Hf=[Cr,Je,Cr,Je,tr,Pe,tr,Pe],jf=[Je,Je,Je,Je,Pe,Pe,Pe,Pe],$f=[Jt,vt,Cr,Je,tr,Pe,tr,Pe],Uf=[vt,vt,Je,Je,Pe,Pe,Pe,Pe],Vf=[sn,sn,vt,vt,Je,Je,Pe,Pe],_f=[hi,sn,Jt,vt,Jt,vt,Jt,vt],te={DISPLAY:lt[hi],TEXT:lt[Jt],SCRIPT:lt[Cr],SCRIPTSCRIPT:lt[tr]},z0=[{name:"latin",blocks:[[256,591],[768,879]]},{name:"cyrillic",blocks:[[1024,1279]]},{name:"armenian",blocks:[[1328,1423]]},{name:"brahmic",blocks:[[2304,4255]]},{name:"georgian",blocks:[[4256,4351]]},{name:"cjk",blocks:[[12288,12543],[19968,40879],[65280,65376]]},{name:"hangul",blocks:[[44032,55215]]}];function Gf(e){for(var t=0;t=i[0]&&e<=i[1])return r.name}return null}var tn=[];z0.forEach(e=>e.blocks.forEach(t=>tn.push(...t)));function Ms(e){for(var t=0;t=tn[t]&&e<=tn[t+1])return!0;return!1}var Ce=e=>e+" "+e,Zt=80,Wf=function(t,r){return"M95,"+(622+t+r)+` +c-2.7,0,-7.17,-2.7,-13.5,-8c-5.8,-5.3,-9.5,-10,-9.5,-14 +c0,-2,0.3,-3.3,1,-4c1.3,-2.7,23.83,-20.7,67.5,-54 +c44.2,-33.3,65.8,-50.3,66.5,-51c1.3,-1.3,3,-2,5,-2c4.7,0,8.7,3.3,12,10 +s173,378,173,378c0.7,0,35.3,-71,104,-213c68.7,-142,137.5,-285,206.5,-429 +c69,-144,104.5,-217.7,106.5,-221 +l`+t/2.075+" -"+t+` +c5.3,-9.3,12,-14,20,-14 +H400000v`+(40+t)+`H845.2724 +s-225.272,467,-225.272,467s-235,486,-235,486c-2.7,4.7,-9,7,-19,7 +c-6,0,-10,-1,-12,-3s-194,-422,-194,-422s-65,47,-65,47z +M`+(834+t)+" "+r+"h400000v"+(40+t)+"h-400000z"},Xf=function(t,r){return"M263,"+(601+t+r)+`c0.7,0,18,39.7,52,119 +c34,79.3,68.167,158.7,102.5,238c34.3,79.3,51.8,119.3,52.5,120 +c340,-704.7,510.7,-1060.3,512,-1067 +l`+t/2.084+" -"+t+` +c4.7,-7.3,11,-11,19,-11 +H40000v`+(40+t)+`H1012.3 +s-271.3,567,-271.3,567c-38.7,80.7,-84,175,-136,283c-52,108,-89.167,185.3,-111.5,232 +c-22.3,46.7,-33.8,70.3,-34.5,71c-4.7,4.7,-12.3,7,-23,7s-12,-1,-12,-1 +s-109,-253,-109,-253c-72.7,-168,-109.3,-252,-110,-252c-10.7,8,-22,16.7,-34,26 +c-22,17.3,-33.3,26,-34,26s-26,-26,-26,-26s76,-59,76,-59s76,-60,76,-60z +M`+(1001+t)+" "+r+"h400000v"+(40+t)+"h-400000z"},Yf=function(t,r){return"M983 "+(10+t+r)+` +l`+t/3.13+" -"+t+` +c4,-6.7,10,-10,18,-10 H400000v`+(40+t)+` +H1013.1s-83.4,268,-264.1,840c-180.7,572,-277,876.3,-289,913c-4.7,4.7,-12.7,7,-24,7 +s-12,0,-12,0c-1.3,-3.3,-3.7,-11.7,-7,-25c-35.3,-125.3,-106.7,-373.3,-214,-744 +c-10,12,-21,25,-33,39s-32,39,-32,39c-6,-5.3,-15,-14,-27,-26s25,-30,25,-30 +c26.7,-32.7,52,-63,76,-91s52,-60,52,-60s208,722,208,722 +c56,-175.3,126.3,-397.3,211,-666c84.7,-268.7,153.8,-488.2,207.5,-658.5 +c53.7,-170.3,84.5,-266.8,92.5,-289.5z +M`+(1001+t)+" "+r+"h400000v"+(40+t)+"h-400000z"},Kf=function(t,r){return"M424,"+(2398+t+r)+` +c-1.3,-0.7,-38.5,-172,-111.5,-514c-73,-342,-109.8,-513.3,-110.5,-514 +c0,-2,-10.7,14.3,-32,49c-4.7,7.3,-9.8,15.7,-15.5,25c-5.7,9.3,-9.8,16,-12.5,20 +s-5,7,-5,7c-4,-3.3,-8.3,-7.7,-13,-13s-13,-13,-13,-13s76,-122,76,-122s77,-121,77,-121 +s209,968,209,968c0,-2,84.7,-361.7,254,-1079c169.3,-717.3,254.7,-1077.7,256,-1081 +l`+t/4.223+" -"+t+`c4,-6.7,10,-10,18,-10 H400000 +v`+(40+t)+`H1014.6 +s-87.3,378.7,-272.6,1166c-185.3,787.3,-279.3,1182.3,-282,1185 +c-2,6,-10,9,-24,9 +c-8,0,-12,-0.7,-12,-2z M`+(1001+t)+" "+r+` +h400000v`+(40+t)+"h-400000z"},Zf=function(t,r){return"M473,"+(2713+t+r)+` +c339.3,-1799.3,509.3,-2700,510,-2702 l`+t/5.298+" -"+t+` +c3.3,-7.3,9.3,-11,18,-11 H400000v`+(40+t)+`H1017.7 +s-90.5,478,-276.2,1466c-185.7,988,-279.5,1483,-281.5,1485c-2,6,-10,9,-24,9 +c-8,0,-12,-0.7,-12,-2c0,-1.3,-5.3,-32,-16,-92c-50.7,-293.3,-119.7,-693.3,-207,-1200 +c0,-1.3,-5.3,8.7,-16,30c-10.7,21.3,-21.3,42.7,-32,64s-16,33,-16,33s-26,-26,-26,-26 +s76,-153,76,-153s77,-151,77,-151c0.7,0.7,35.7,202,105,604c67.3,400.7,102,602.7,104, +606zM`+(1001+t)+" "+r+"h400000v"+(40+t)+"H1017.7z"},Qf=function(t){var r=t/2;return"M400000 "+t+" H0 L"+r+" 0 l65 45 L145 "+(t-80)+" H400000z"},Jf=function(t,r,n){var i=n-54-r-t;return"M702 "+(t+r)+"H400000"+(40+t)+` +H742v`+i+`l-4 4-4 4c-.667.7 -2 1.5-4 2.5s-4.167 1.833-6.5 2.5-5.5 1-9.5 1 +h-12l-28-84c-16.667-52-96.667 -294.333-240-727l-212 -643 -85 170 +c-4-3.333-8.333-7.667-13 -13l-13-13l77-155 77-156c66 199.333 139 419.667 +219 661 l218 661zM702 `+r+"H400000v"+(40+t)+"H742z"},e2=function(t,r,n){r=1e3*r;var i="";switch(t){case"sqrtMain":i=Wf(r,Zt);break;case"sqrtSize1":i=Xf(r,Zt);break;case"sqrtSize2":i=Yf(r,Zt);break;case"sqrtSize3":i=Kf(r,Zt);break;case"sqrtSize4":i=Zf(r,Zt);break;case"sqrtTall":i=Jf(r,Zt,n)}return i},t2=function(t,r){switch(t){case"⎜":return Ce("M291 0 H417 V"+r+" H291z");case"∣":return Ce("M145 0 H188 V"+r+" H145z");case"∥":return Ce("M145 0 H188 V"+r+" H145z")+Ce("M367 0 H410 V"+r+" H367z");case"⎟":return Ce("M457 0 H583 V"+r+" H457z");case"⎢":return Ce("M319 0 H403 V"+r+" H319z");case"⎥":return Ce("M263 0 H347 V"+r+" H263z");case"⎪":return Ce("M384 0 H504 V"+r+" H384z");case"⏐":return Ce("M312 0 H355 V"+r+" H312z");case"‖":return Ce("M257 0 H300 V"+r+" H257z")+Ce("M478 0 H521 V"+r+" H478z");default:return""}},Ca={doubleleftarrow:`M262 157 +l10-10c34-36 62.7-77 86-123 3.3-8 5-13.3 5-16 0-5.3-6.7-8-20-8-7.3 + 0-12.2.5-14.5 1.5-2.3 1-4.8 4.5-7.5 10.5-49.3 97.3-121.7 169.3-217 216-28 + 14-57.3 25-88 33-6.7 2-11 3.8-13 5.5-2 1.7-3 4.2-3 7.5s1 5.8 3 7.5 +c2 1.7 6.3 3.5 13 5.5 68 17.3 128.2 47.8 180.5 91.5 52.3 43.7 93.8 96.2 124.5 + 157.5 9.3 8 15.3 12.3 18 13h6c12-.7 18-4 18-10 0-2-1.7-7-5-15-23.3-46-52-87 +-86-123l-10-10h399738v-40H218c328 0 0 0 0 0l-10-8c-26.7-20-65.7-43-117-69 2.7 +-2 6-3.7 10-5 36.7-16 72.3-37.3 107-64l10-8h399782v-40z +m8 0v40h399730v-40zm0 194v40h399730v-40z`,doublerightarrow:`M399738 392l +-10 10c-34 36-62.7 77-86 123-3.3 8-5 13.3-5 16 0 5.3 6.7 8 20 8 7.3 0 12.2-.5 + 14.5-1.5 2.3-1 4.8-4.5 7.5-10.5 49.3-97.3 121.7-169.3 217-216 28-14 57.3-25 88 +-33 6.7-2 11-3.8 13-5.5 2-1.7 3-4.2 3-7.5s-1-5.8-3-7.5c-2-1.7-6.3-3.5-13-5.5-68 +-17.3-128.2-47.8-180.5-91.5-52.3-43.7-93.8-96.2-124.5-157.5-9.3-8-15.3-12.3-18 +-13h-6c-12 .7-18 4-18 10 0 2 1.7 7 5 15 23.3 46 52 87 86 123l10 10H0v40h399782 +c-328 0 0 0 0 0l10 8c26.7 20 65.7 43 117 69-2.7 2-6 3.7-10 5-36.7 16-72.3 37.3 +-107 64l-10 8H0v40zM0 157v40h399730v-40zm0 194v40h399730v-40z`,leftarrow:`M400000 241H110l3-3c68.7-52.7 113.7-120 + 135-202 4-14.7 6-23 6-25 0-7.3-7-11-21-11-8 0-13.2.8-15.5 2.5-2.3 1.7-4.2 5.8 +-5.5 12.5-1.3 4.7-2.7 10.3-4 17-12 48.7-34.8 92-68.5 130S65.3 228.3 18 247 +c-10 4-16 7.7-18 11 0 8.7 6 14.3 18 17 47.3 18.7 87.8 47 121.5 85S196 441.3 208 + 490c.7 2 1.3 5 2 9s1.2 6.7 1.5 8c.3 1.3 1 3.3 2 6s2.2 4.5 3.5 5.5c1.3 1 3.3 + 1.8 6 2.5s6 1 10 1c14 0 21-3.7 21-11 0-2-2-10.3-6-25-20-79.3-65-146.7-135-202 + l-3-3h399890zM100 241v40h399900v-40z`,leftbrace:`M6 548l-6-6v-35l6-11c56-104 135.3-181.3 238-232 57.3-28.7 117 +-45 179-50h399577v120H403c-43.3 7-81 15-113 26-100.7 33-179.7 91-237 174-2.7 + 5-6 9-10 13-.7 1-7.3 1-20 1H6z`,leftbraceunder:`M0 6l6-6h17c12.688 0 19.313.3 20 1 4 4 7.313 8.3 10 13 + 35.313 51.3 80.813 93.8 136.5 127.5 55.688 33.7 117.188 55.8 184.5 66.5.688 + 0 2 .3 4 1 18.688 2.7 76 4.3 172 5h399450v120H429l-6-1c-124.688-8-235-61.7 +-331-161C60.687 138.7 32.312 99.3 7 54L0 41V6z`,leftgroup:`M400000 80 +H435C64 80 168.3 229.4 21 260c-5.9 1.2-18 0-18 0-2 0-3-1-3-3v-38C76 61 257 0 + 435 0h399565z`,leftgroupunder:`M400000 262 +H435C64 262 168.3 112.6 21 82c-5.9-1.2-18 0-18 0-2 0-3 1-3 3v38c76 158 257 219 + 435 219h399565z`,leftharpoon:`M0 267c.7 5.3 3 10 7 14h399993v-40H93c3.3 +-3.3 10.2-9.5 20.5-18.5s17.8-15.8 22.5-20.5c50.7-52 88-110.3 112-175 4-11.3 5 +-18.3 3-21-1.3-4-7.3-6-18-6-8 0-13 .7-15 2s-4.7 6.7-8 16c-42 98.7-107.3 174.7 +-196 228-6.7 4.7-10.7 8-12 10-1.3 2-2 5.7-2 11zm100-26v40h399900v-40z`,leftharpoonplus:`M0 267c.7 5.3 3 10 7 14h399993v-40H93c3.3-3.3 10.2-9.5 + 20.5-18.5s17.8-15.8 22.5-20.5c50.7-52 88-110.3 112-175 4-11.3 5-18.3 3-21-1.3 +-4-7.3-6-18-6-8 0-13 .7-15 2s-4.7 6.7-8 16c-42 98.7-107.3 174.7-196 228-6.7 4.7 +-10.7 8-12 10-1.3 2-2 5.7-2 11zm100-26v40h399900v-40zM0 435v40h400000v-40z +m0 0v40h400000v-40z`,leftharpoondown:`M7 241c-4 4-6.333 8.667-7 14 0 5.333.667 9 2 11s5.333 + 5.333 12 10c90.667 54 156 130 196 228 3.333 10.667 6.333 16.333 9 17 2 .667 5 + 1 9 1h5c10.667 0 16.667-2 18-6 2-2.667 1-9.667-3-21-32-87.333-82.667-157.667 +-152-211l-3-3h399907v-40zM93 281 H400000 v-40L7 241z`,leftharpoondownplus:`M7 435c-4 4-6.3 8.7-7 14 0 5.3.7 9 2 11s5.3 5.3 12 + 10c90.7 54 156 130 196 228 3.3 10.7 6.3 16.3 9 17 2 .7 5 1 9 1h5c10.7 0 16.7 +-2 18-6 2-2.7 1-9.7-3-21-32-87.3-82.7-157.7-152-211l-3-3h399907v-40H7zm93 0 +v40h399900v-40zM0 241v40h399900v-40zm0 0v40h399900v-40z`,lefthook:`M400000 281 H103s-33-11.2-61-33.5S0 197.3 0 164s14.2-61.2 42.5 +-83.5C70.8 58.2 104 47 142 47 c16.7 0 25 6.7 25 20 0 12-8.7 18.7-26 20-40 3.3 +-68.7 15.7-86 37-10 12-15 25.3-15 40 0 22.7 9.8 40.7 29.5 54 19.7 13.3 43.5 21 + 71.5 23h399859zM103 281v-40h399897v40z`,leftlinesegment:Ce("M40 281 V428 H0 V94 H40 V241 H400000 v40z"),leftbracketunder:Ce("M0 0 h120 V290 H399995 v120 H0z"),leftbracketover:Ce("M0 440 h120 V150 H399995 v-120 H0z"),leftmapsto:Ce("M40 281 V448H0V74H40V241H400000v40z"),leftToFrom:`M0 147h400000v40H0zm0 214c68 40 115.7 95.7 143 167h22c15.3 0 23 +-.3 23-1 0-1.3-5.3-13.7-16-37-18-35.3-41.3-69-70-101l-7-8h399905v-40H95l7-8 +c28.7-32 52-65.7 70-101 10.7-23.3 16-35.7 16-37 0-.7-7.7-1-23-1h-22C115.7 265.3 + 68 321 0 361zm0-174v-40h399900v40zm100 154v40h399900v-40z`,longequal:Ce("M0 50 h400000 v40H0z m0 194h40000v40H0z"),midbrace:`M200428 334 +c-100.7-8.3-195.3-44-280-108-55.3-42-101.7-93-139-153l-9-14c-2.7 4-5.7 8.7-9 14 +-53.3 86.7-123.7 153-211 199-66.7 36-137.3 56.3-212 62H0V214h199568c178.3-11.7 + 311.7-78.3 403-201 6-8 9.7-12 11-12 .7-.7 6.7-1 18-1s17.3.3 18 1c1.3 0 5 4 11 + 12 44.7 59.3 101.3 106.3 170 141s145.3 54.3 229 60h199572v120z`,midbraceunder:`M199572 214 +c100.7 8.3 195.3 44 280 108 55.3 42 101.7 93 139 153l9 14c2.7-4 5.7-8.7 9-14 + 53.3-86.7 123.7-153 211-199 66.7-36 137.3-56.3 212-62h199568v120H200432c-178.3 + 11.7-311.7 78.3-403 201-6 8-9.7 12-11 12-.7.7-6.7 1-18 1s-17.3-.3-18-1c-1.3 0 +-5-4-11-12-44.7-59.3-101.3-106.3-170-141s-145.3-54.3-229-60H0V214z`,oiintSize1:`M512.6 71.6c272.6 0 320.3 106.8 320.3 178.2 0 70.8-47.7 177.6 +-320.3 177.6S193.1 320.6 193.1 249.8c0-71.4 46.9-178.2 319.5-178.2z +m368.1 178.2c0-86.4-60.9-215.4-368.1-215.4-306.4 0-367.3 129-367.3 215.4 0 85.8 +60.9 214.8 367.3 214.8 307.2 0 368.1-129 368.1-214.8z`,oiintSize2:`M757.8 100.1c384.7 0 451.1 137.6 451.1 230 0 91.3-66.4 228.8 +-451.1 228.8-386.3 0-452.7-137.5-452.7-228.8 0-92.4 66.4-230 452.7-230z +m502.4 230c0-111.2-82.4-277.2-502.4-277.2s-504 166-504 277.2 +c0 110 84 276 504 276s502.4-166 502.4-276z`,oiiintSize1:`M681.4 71.6c408.9 0 480.5 106.8 480.5 178.2 0 70.8-71.6 177.6 +-480.5 177.6S202.1 320.6 202.1 249.8c0-71.4 70.5-178.2 479.3-178.2z +m525.8 178.2c0-86.4-86.8-215.4-525.7-215.4-437.9 0-524.7 129-524.7 215.4 0 +85.8 86.8 214.8 524.7 214.8 438.9 0 525.7-129 525.7-214.8z`,oiiintSize2:`M1021.2 53c603.6 0 707.8 165.8 707.8 277.2 0 110-104.2 275.8 +-707.8 275.8-606 0-710.2-165.8-710.2-275.8C311 218.8 415.2 53 1021.2 53z +m770.4 277.1c0-131.2-126.4-327.6-770.5-327.6S248.4 198.9 248.4 330.1 +c0 130 128.8 326.4 772.7 326.4s770.5-196.4 770.5-326.4z`,rightarrow:`M0 241v40h399891c-47.3 35.3-84 78-110 128 +-16.7 32-27.7 63.7-33 95 0 1.3-.2 2.7-.5 4-.3 1.3-.5 2.3-.5 3 0 7.3 6.7 11 20 + 11 8 0 13.2-.8 15.5-2.5 2.3-1.7 4.2-5.5 5.5-11.5 2-13.3 5.7-27 11-41 14.7-44.7 + 39-84.5 73-119.5s73.7-60.2 119-75.5c6-2 9-5.7 9-11s-3-9-9-11c-45.3-15.3-85 +-40.5-119-75.5s-58.3-74.8-73-119.5c-4.7-14-8.3-27.3-11-40-1.3-6.7-3.2-10.8-5.5 +-12.5-2.3-1.7-7.5-2.5-15.5-2.5-14 0-21 3.7-21 11 0 2 2 10.3 6 25 20.7 83.3 67 + 151.7 139 205zm0 0v40h399900v-40z`,rightbrace:`M400000 542l +-6 6h-17c-12.7 0-19.3-.3-20-1-4-4-7.3-8.3-10-13-35.3-51.3-80.8-93.8-136.5-127.5 +s-117.2-55.8-184.5-66.5c-.7 0-2-.3-4-1-18.7-2.7-76-4.3-172-5H0V214h399571l6 1 +c124.7 8 235 61.7 331 161 31.3 33.3 59.7 72.7 85 118l7 13v35z`,rightbraceunder:`M399994 0l6 6v35l-6 11c-56 104-135.3 181.3-238 232-57.3 + 28.7-117 45-179 50H-300V214h399897c43.3-7 81-15 113-26 100.7-33 179.7-91 237 +-174 2.7-5 6-9 10-13 .7-1 7.3-1 20-1h17z`,rightgroup:`M0 80h399565c371 0 266.7 149.4 414 180 5.9 1.2 18 0 18 0 2 0 + 3-1 3-3v-38c-76-158-257-219-435-219H0z`,rightgroupunder:`M0 262h399565c371 0 266.7-149.4 414-180 5.9-1.2 18 0 18 + 0 2 0 3 1 3 3v38c-76 158-257 219-435 219H0z`,rightharpoon:`M0 241v40h399993c4.7-4.7 7-9.3 7-14 0-9.3 +-3.7-15.3-11-18-92.7-56.7-159-133.7-199-231-3.3-9.3-6-14.7-8-16-2-1.3-7-2-15-2 +-10.7 0-16.7 2-18 6-2 2.7-1 9.7 3 21 15.3 42 36.7 81.8 64 119.5 27.3 37.7 58 + 69.2 92 94.5zm0 0v40h399900v-40z`,rightharpoonplus:`M0 241v40h399993c4.7-4.7 7-9.3 7-14 0-9.3-3.7-15.3-11 +-18-92.7-56.7-159-133.7-199-231-3.3-9.3-6-14.7-8-16-2-1.3-7-2-15-2-10.7 0-16.7 + 2-18 6-2 2.7-1 9.7 3 21 15.3 42 36.7 81.8 64 119.5 27.3 37.7 58 69.2 92 94.5z +m0 0v40h399900v-40z m100 194v40h399900v-40zm0 0v40h399900v-40z`,rightharpoondown:`M399747 511c0 7.3 6.7 11 20 11 8 0 13-.8 15-2.5s4.7-6.8 + 8-15.5c40-94 99.3-166.3 178-217 13.3-8 20.3-12.3 21-13 5.3-3.3 8.5-5.8 9.5 +-7.5 1-1.7 1.5-5.2 1.5-10.5s-2.3-10.3-7-15H0v40h399908c-34 25.3-64.7 57-92 95 +-27.3 38-48.7 77.7-64 119-3.3 8.7-5 14-5 16zM0 241v40h399900v-40z`,rightharpoondownplus:`M399747 705c0 7.3 6.7 11 20 11 8 0 13-.8 + 15-2.5s4.7-6.8 8-15.5c40-94 99.3-166.3 178-217 13.3-8 20.3-12.3 21-13 5.3-3.3 + 8.5-5.8 9.5-7.5 1-1.7 1.5-5.2 1.5-10.5s-2.3-10.3-7-15H0v40h399908c-34 25.3 +-64.7 57-92 95-27.3 38-48.7 77.7-64 119-3.3 8.7-5 14-5 16zM0 435v40h399900v-40z +m0-194v40h400000v-40zm0 0v40h400000v-40z`,righthook:`M399859 241c-764 0 0 0 0 0 40-3.3 68.7-15.7 86-37 10-12 15-25.3 + 15-40 0-22.7-9.8-40.7-29.5-54-19.7-13.3-43.5-21-71.5-23-17.3-1.3-26-8-26-20 0 +-13.3 8.7-20 26-20 38 0 71 11.2 99 33.5 0 0 7 5.6 21 16.7 14 11.2 21 33.5 21 + 66.8s-14 61.2-42 83.5c-28 22.3-61 33.5-99 33.5L0 241z M0 281v-40h399859v40z`,rightlinesegment:Ce("M399960 241 V94 h40 V428 h-40 V281 H0 v-40z"),rightbracketunder:Ce("M399995 0 h-120 V290 H0 v120 H400000z"),rightbracketover:Ce("M399995 440 h-120 V150 H0 v-120 H399995z"),rightToFrom:`M400000 167c-70.7-42-118-97.7-142-167h-23c-15.3 0-23 .3-23 + 1 0 1.3 5.3 13.7 16 37 18 35.3 41.3 69 70 101l7 8H0v40h399905l-7 8c-28.7 32 +-52 65.7-70 101-10.7 23.3-16 35.7-16 37 0 .7 7.7 1 23 1h23c24-69.3 71.3-125 142 +-167z M100 147v40h399900v-40zM0 341v40h399900v-40z`,twoheadleftarrow:`M0 167c68 40 + 115.7 95.7 143 167h22c15.3 0 23-.3 23-1 0-1.3-5.3-13.7-16-37-18-35.3-41.3-69 +-70-101l-7-8h125l9 7c50.7 39.3 85 86 103 140h46c0-4.7-6.3-18.7-19-42-18-35.3 +-40-67.3-66-96l-9-9h399716v-40H284l9-9c26-28.7 48-60.7 66-96 12.7-23.333 19 +-37.333 19-42h-46c-18 54-52.3 100.7-103 140l-9 7H95l7-8c28.7-32 52-65.7 70-101 + 10.7-23.333 16-35.7 16-37 0-.7-7.7-1-23-1h-22C115.7 71.3 68 127 0 167z`,twoheadrightarrow:`M400000 167 +c-68-40-115.7-95.7-143-167h-22c-15.3 0-23 .3-23 1 0 1.3 5.3 13.7 16 37 18 35.3 + 41.3 69 70 101l7 8h-125l-9-7c-50.7-39.3-85-86-103-140h-46c0 4.7 6.3 18.7 19 42 + 18 35.3 40 67.3 66 96l9 9H0v40h399716l-9 9c-26 28.7-48 60.7-66 96-12.7 23.333 +-19 37.333-19 42h46c18-54 52.3-100.7 103-140l9-7h125l-7 8c-28.7 32-52 65.7-70 + 101-10.7 23.333-16 35.7-16 37 0 .7 7.7 1 23 1h22c27.3-71.3 75-127 143-167z`,tilde1:`M200 55.538c-77 0-168 73.953-177 73.953-3 0-7 +-2.175-9-5.437L2 97c-1-2-2-4-2-6 0-4 2-7 5-9l20-12C116 12 171 0 207 0c86 0 + 114 68 191 68 78 0 168-68 177-68 4 0 7 2 9 5l12 19c1 2.175 2 4.35 2 6.525 0 + 4.35-2 7.613-5 9.788l-19 13.05c-92 63.077-116.937 75.308-183 76.128 +-68.267.847-113-73.952-191-73.952z`,tilde2:`M344 55.266c-142 0-300.638 81.316-311.5 86.418 +-8.01 3.762-22.5 10.91-23.5 5.562L1 120c-1-2-1-3-1-4 0-5 3-9 8-10l18.4-9C160.9 + 31.9 283 0 358 0c148 0 188 122 331 122s314-97 326-97c4 0 8 2 10 7l7 21.114 +c1 2.14 1 3.21 1 4.28 0 5.347-3 9.626-7 10.696l-22.3 12.622C852.6 158.372 751 + 181.476 676 181.476c-149 0-189-126.21-332-126.21z`,tilde3:`M786 59C457 59 32 175.242 13 175.242c-6 0-10-3.457 +-11-10.37L.15 138c-1-7 3-12 10-13l19.2-6.4C378.4 40.7 634.3 0 804.3 0c337 0 + 411.8 157 746.8 157 328 0 754-112 773-112 5 0 10 3 11 9l1 14.075c1 8.066-.697 + 16.595-6.697 17.492l-21.052 7.31c-367.9 98.146-609.15 122.696-778.15 122.696 + -338 0-409-156.573-744-156.573z`,tilde4:`M786 58C457 58 32 177.487 13 177.487c-6 0-10-3.345 +-11-10.035L.15 143c-1-7 3-12 10-13l22-6.7C381.2 35 637.15 0 807.15 0c337 0 409 + 177 744 177 328 0 754-127 773-127 5 0 10 3 11 9l1 14.794c1 7.805-3 13.38-9 + 14.495l-20.7 5.574c-366.85 99.79-607.3 139.372-776.3 139.372-338 0-409 + -175.236-744-175.236z`,vec:`M377 20c0-5.333 1.833-10 5.5-14S391 0 397 0c4.667 0 8.667 1.667 12 5 +3.333 2.667 6.667 9 10 19 6.667 24.667 20.333 43.667 41 57 7.333 4.667 11 +10.667 11 18 0 6-1 10-3 12s-6.667 5-14 9c-28.667 14.667-53.667 35.667-75 63 +-1.333 1.333-3.167 3.5-5.5 6.5s-4 4.833-5 5.5c-1 .667-2.5 1.333-4.5 2s-4.333 1 +-7 1c-4.667 0-9.167-1.833-13.5-5.5S337 184 337 178c0-12.667 15.667-32.333 47-59 +H213l-171-1c-8.667-6-13-12.333-13-19 0-4.667 4.333-11.333 13-20h359 +c-16-25.333-24-45-24-59z`,widehat1:`M529 0h5l519 115c5 1 9 5 9 10 0 1-1 2-1 3l-4 22 +c-1 5-5 9-11 9h-2L532 67 19 159h-2c-5 0-9-4-11-9l-5-22c-1-6 2-12 8-13z`,widehat2:`M1181 0h2l1171 176c6 0 10 5 10 11l-2 23c-1 6-5 10 +-11 10h-1L1182 67 15 220h-1c-6 0-10-4-11-10l-2-23c-1-6 4-11 10-11z`,widehat3:`M1181 0h2l1171 236c6 0 10 5 10 11l-2 23c-1 6-5 10 +-11 10h-1L1182 67 15 280h-1c-6 0-10-4-11-10l-2-23c-1-6 4-11 10-11z`,widehat4:`M1181 0h2l1171 296c6 0 10 5 10 11l-2 23c-1 6-5 10 +-11 10h-1L1182 67 15 340h-1c-6 0-10-4-11-10l-2-23c-1-6 4-11 10-11z`,widecheck1:`M529,159h5l519,-115c5,-1,9,-5,9,-10c0,-1,-1,-2,-1,-3l-4,-22c-1, +-5,-5,-9,-11,-9h-2l-512,92l-513,-92h-2c-5,0,-9,4,-11,9l-5,22c-1,6,2,12,8,13z`,widecheck2:`M1181,220h2l1171,-176c6,0,10,-5,10,-11l-2,-23c-1,-6,-5,-10, +-11,-10h-1l-1168,153l-1167,-153h-1c-6,0,-10,4,-11,10l-2,23c-1,6,4,11,10,11z`,widecheck3:`M1181,280h2l1171,-236c6,0,10,-5,10,-11l-2,-23c-1,-6,-5,-10, +-11,-10h-1l-1168,213l-1167,-213h-1c-6,0,-10,4,-11,10l-2,23c-1,6,4,11,10,11z`,widecheck4:`M1181,340h2l1171,-296c6,0,10,-5,10,-11l-2,-23c-1,-6,-5,-10, +-11,-10h-1l-1168,273l-1167,-273h-1c-6,0,-10,4,-11,10l-2,23c-1,6,4,11,10,11z`,baraboveleftarrow:`M400000 620h-399890l3 -3c68.7 -52.7 113.7 -120 135 -202 +c4 -14.7 6 -23 6 -25c0 -7.3 -7 -11 -21 -11c-8 0 -13.2 0.8 -15.5 2.5 +c-2.3 1.7 -4.2 5.8 -5.5 12.5c-1.3 4.7 -2.7 10.3 -4 17c-12 48.7 -34.8 92 -68.5 130 +s-74.2 66.3 -121.5 85c-10 4 -16 7.7 -18 11c0 8.7 6 14.3 18 17c47.3 18.7 87.8 47 +121.5 85s56.5 81.3 68.5 130c0.7 2 1.3 5 2 9s1.2 6.7 1.5 8c0.3 1.3 1 3.3 2 6 +s2.2 4.5 3.5 5.5c1.3 1 3.3 1.8 6 2.5s6 1 10 1c14 0 21 -3.7 21 -11 +c0 -2 -2 -10.3 -6 -25c-20 -79.3 -65 -146.7 -135 -202l-3 -3h399890z +M100 620v40h399900v-40z M0 241v40h399900v-40zM0 241v40h399900v-40z`,rightarrowabovebar:`M0 241v40h399891c-47.3 35.3-84 78-110 128-16.7 32 +-27.7 63.7-33 95 0 1.3-.2 2.7-.5 4-.3 1.3-.5 2.3-.5 3 0 7.3 6.7 11 20 11 8 0 +13.2-.8 15.5-2.5 2.3-1.7 4.2-5.5 5.5-11.5 2-13.3 5.7-27 11-41 14.7-44.7 39 +-84.5 73-119.5s73.7-60.2 119-75.5c6-2 9-5.7 9-11s-3-9-9-11c-45.3-15.3-85-40.5 +-119-75.5s-58.3-74.8-73-119.5c-4.7-14-8.3-27.3-11-40-1.3-6.7-3.2-10.8-5.5 +-12.5-2.3-1.7-7.5-2.5-15.5-2.5-14 0-21 3.7-21 11 0 2 2 10.3 6 25 20.7 83.3 67 +151.7 139 205zm96 379h399894v40H0zm0 0h399904v40H0z`,baraboveshortleftharpoon:`M507,435c-4,4,-6.3,8.7,-7,14c0,5.3,0.7,9,2,11 +c1.3,2,5.3,5.3,12,10c90.7,54,156,130,196,228c3.3,10.7,6.3,16.3,9,17 +c2,0.7,5,1,9,1c0,0,5,0,5,0c10.7,0,16.7,-2,18,-6c2,-2.7,1,-9.7,-3,-21 +c-32,-87.3,-82.7,-157.7,-152,-211c0,0,-3,-3,-3,-3l399351,0l0,-40 +c-398570,0,-399437,0,-399437,0z M593 435 v40 H399500 v-40z +M0 281 v-40 H399908 v40z M0 281 v-40 H399908 v40z`,rightharpoonaboveshortbar:`M0,241 l0,40c399126,0,399993,0,399993,0 +c4.7,-4.7,7,-9.3,7,-14c0,-9.3,-3.7,-15.3,-11,-18c-92.7,-56.7,-159,-133.7,-199, +-231c-3.3,-9.3,-6,-14.7,-8,-16c-2,-1.3,-7,-2,-15,-2c-10.7,0,-16.7,2,-18,6 +c-2,2.7,-1,9.7,3,21c15.3,42,36.7,81.8,64,119.5c27.3,37.7,58,69.2,92,94.5z +M0 241 v40 H399908 v-40z M0 475 v-40 H399500 v40z M0 475 v-40 H399500 v40z`,shortbaraboveleftharpoon:`M7,435c-4,4,-6.3,8.7,-7,14c0,5.3,0.7,9,2,11 +c1.3,2,5.3,5.3,12,10c90.7,54,156,130,196,228c3.3,10.7,6.3,16.3,9,17c2,0.7,5,1,9, +1c0,0,5,0,5,0c10.7,0,16.7,-2,18,-6c2,-2.7,1,-9.7,-3,-21c-32,-87.3,-82.7,-157.7, +-152,-211c0,0,-3,-3,-3,-3l399907,0l0,-40c-399126,0,-399993,0,-399993,0z +M93 435 v40 H400000 v-40z M500 241 v40 H400000 v-40z M500 241 v40 H400000 v-40z`,shortrightharpoonabovebar:`M53,241l0,40c398570,0,399437,0,399437,0 +c4.7,-4.7,7,-9.3,7,-14c0,-9.3,-3.7,-15.3,-11,-18c-92.7,-56.7,-159,-133.7,-199, +-231c-3.3,-9.3,-6,-14.7,-8,-16c-2,-1.3,-7,-2,-15,-2c-10.7,0,-16.7,2,-18,6 +c-2,2.7,-1,9.7,3,21c15.3,42,36.7,81.8,64,119.5c27.3,37.7,58,69.2,92,94.5z +M500 241 v40 H399408 v-40z M500 435 v40 H400000 v-40z`},r2=function(t,r){switch(t){case"lbrack":return"M403 1759 V84 H666 V0 H319 V1759 v"+r+` v1759 v84 h347 v-84 +H403z M403 1759 V0 H319 V1759 v`+r+" v1759 v84 h84z";case"rbrack":return"M347 1759 V0 H0 V84 H263 V1759 v"+r+` v1759 H0 v84 H347z +M347 1759 V0 H263 V1759 v`+r+" v1759 h84z";case"vert":return"M145 15 v585 v"+r+` v585 c2.667,10,9.667,15,21,15 +c10,0,16.667,-5,20,-15 v-585 v`+-r+` v-585 c-2.667,-10,-9.667,-15,-21,-15 +c-10,0,-16.667,5,-20,15z M188 15 H145 v585 v`+r+" v585 h43z";case"doublevert":return"M145 15 v585 v"+r+` v585 c2.667,10,9.667,15,21,15 +c10,0,16.667,-5,20,-15 v-585 v`+-r+` v-585 c-2.667,-10,-9.667,-15,-21,-15 +c-10,0,-16.667,5,-20,15z M188 15 H145 v585 v`+r+` v585 h43z +M367 15 v585 v`+r+` v585 c2.667,10,9.667,15,21,15 +c10,0,16.667,-5,20,-15 v-585 v`+-r+` v-585 c-2.667,-10,-9.667,-15,-21,-15 +c-10,0,-16.667,5,-20,15z M410 15 H367 v585 v`+r+" v585 h43z";case"lfloor":return"M319 602 V0 H403 V602 v"+r+` v1715 h263 v84 H319z +MM319 602 V0 H403 V602 v`+r+" v1715 H319z";case"rfloor":return"M319 602 V0 H403 V602 v"+r+` v1799 H0 v-84 H319z +MM319 602 V0 H403 V602 v`+r+" v1715 H319z";case"lceil":return"M403 1759 V84 H666 V0 H319 V1759 v"+r+` v602 h84z +M403 1759 V0 H319 V1759 v`+r+" v602 h84z";case"rceil":return"M347 1759 V0 H0 V84 H263 V1759 v"+r+` v602 h84z +M347 1759 V0 h-84 V1759 v`+r+" v602 h84z";case"lparen":return`M863,9c0,-2,-2,-5,-6,-9c0,0,-17,0,-17,0c-12.7,0,-19.3,0.3,-20,1 +c-5.3,5.3,-10.3,11,-15,17c-242.7,294.7,-395.3,682,-458,1162c-21.3,163.3,-33.3,349, +-36,557 l0,`+(r+84)+`c0.2,6,0,26,0,60c2,159.3,10,310.7,24,454c53.3,528,210, +949.7,470,1265c4.7,6,9.7,11.7,15,17c0.7,0.7,7,1,19,1c0,0,18,0,18,0c4,-4,6,-7,6,-9 +c0,-2.7,-3.3,-8.7,-10,-18c-135.3,-192.7,-235.5,-414.3,-300.5,-665c-65,-250.7,-102.5, +-544.7,-112.5,-882c-2,-104,-3,-167,-3,-189 +l0,-`+(r+92)+`c0,-162.7,5.7,-314,17,-454c20.7,-272,63.7,-513,129,-723c65.3, +-210,155.3,-396.3,270,-559c6.7,-9.3,10,-15.3,10,-18z`;case"rparen":return`M76,0c-16.7,0,-25,3,-25,9c0,2,2,6.3,6,13c21.3,28.7,42.3,60.3, +63,95c96.7,156.7,172.8,332.5,228.5,527.5c55.7,195,92.8,416.5,111.5,664.5 +c11.3,139.3,17,290.7,17,454c0,28,1.7,43,3.3,45l0,`+(r+9)+` +c-3,4,-3.3,16.7,-3.3,38c0,162,-5.7,313.7,-17,455c-18.7,248,-55.8,469.3,-111.5,664 +c-55.7,194.7,-131.8,370.3,-228.5,527c-20.7,34.7,-41.7,66.3,-63,95c-2,3.3,-4,7,-6,11 +c0,7.3,5.7,11,17,11c0,0,11,0,11,0c9.3,0,14.3,-0.3,15,-1c5.3,-5.3,10.3,-11,15,-17 +c242.7,-294.7,395.3,-681.7,458,-1161c21.3,-164.7,33.3,-350.7,36,-558 +l0,-`+(r+144)+`c-2,-159.3,-10,-310.7,-24,-454c-53.3,-528,-210,-949.7, +-470,-1265c-4.7,-6,-9.7,-11.7,-15,-17c-0.7,-0.7,-6.7,-1,-18,-1z`;default:throw new Error("Unknown stretchy delimiter.")}};function n2(e){return"toText"in e}class lr{constructor(t){this.children=void 0,this.classes=void 0,this.height=void 0,this.depth=void 0,this.maxFontSize=void 0,this.style=void 0,this.children=t,this.classes=[],this.height=0,this.depth=0,this.maxFontSize=0,this.style={}}hasClass(t){return this.classes.includes(t)}toNode(){for(var t=document.createDocumentFragment(),r=0;r{if(n2(t))return t.toText();throw new Error("Expected MathDomNode with toText, got "+t.constructor.name)}).join("")}}var M0={pt:1,mm:7227/2540,cm:7227/254,in:72.27,bp:803/800,pc:12,dd:1238/1157,cc:14856/1157,nd:685/642,nc:1370/107,sp:1/65536,px:803/800},i2={ex:!0,em:!0,mu:!0},Es=function(t){return typeof t!="string"&&(t=t.unit),t in M0||t in i2||t==="ex"},ye=function(t,r){var n;if(t.unit in M0)n=M0[t.unit]/r.fontMetrics().ptPerEm/r.sizeMultiplier;else if(t.unit==="mu")n=r.fontMetrics().cssEmPerMu;else{var i;if(r.style.isTight()?i=r.havingStyle(r.style.text()):i=r,t.unit==="ex")n=i.fontMetrics().xHeight;else if(t.unit==="em")n=i.fontMetrics().quad;else throw new L("Invalid unit: '"+t.unit+"'");i!==r&&(n*=i.sizeMultiplier/r.sizeMultiplier)}return Math.min(t.number*n,r.maxSize)},P=function(t){return+t.toFixed(4)+"em"},zt=function(t){return t.filter(r=>r).join(" ")},mi=function(t){var r="";for(var n of Object.keys(t)){var i=t[n];i!==void 0&&(r+=Bf(n)+":"+i+";")}return r},Is=function(t,r,n){if(this.classes=t||[],this.attributes={},this.height=0,this.depth=0,this.maxFontSize=0,this.style=n||{},r){r.style.isTight()&&this.classes.push("mtight");var i=r.getColor();i&&(this.style.color=i)}},Ds=function(t){var r=document.createElement(t);r.className=zt(this.classes),Object.assign(r.style,this.style);for(var n of Object.keys(this.attributes))r.setAttribute(n,this.attributes[n]);for(var i=0;i/=\x00-\x1f]/,Bs=function(t){var r="<"+t;this.classes.length&&(r+=' class="'+De(zt(this.classes))+'"');var n=mi(this.style);n&&(r+=' style="'+De(n)+'"');for(var i of Object.keys(this.attributes)){if(a2.test(i))throw new L("Invalid attribute name '"+i+"'");r+=" "+i+'="'+De(this.attributes[i])+'"'}r+=">";for(var a=0;a",r};class sr{constructor(t,r,n,i){this.children=void 0,this.attributes=void 0,this.classes=void 0,this.height=void 0,this.depth=void 0,this.width=void 0,this.maxFontSize=void 0,this.style=void 0,this.italic=void 0,Is.call(this,t,n,i),this.children=r||[]}setAttribute(t,r){this.attributes[t]=r}hasClass(t){return this.classes.includes(t)}toNode(){return Ds.call(this,"span")}toMarkup(){return Bs.call(this,"span")}}class bn{constructor(t,r,n,i){this.children=void 0,this.attributes=void 0,this.classes=void 0,this.height=void 0,this.depth=void 0,this.maxFontSize=void 0,this.style=void 0,Is.call(this,r,i),this.children=n||[],this.setAttribute("href",t)}setAttribute(t,r){this.attributes[t]=r}hasClass(t){return this.classes.includes(t)}toNode(){return Ds.call(this,"a")}toMarkup(){return Bs.call(this,"a")}}class l2{constructor(t,r,n){this.src=void 0,this.alt=void 0,this.classes=void 0,this.height=void 0,this.depth=void 0,this.maxFontSize=void 0,this.style=void 0,this.alt=r,this.src=t,this.classes=["mord"],this.height=0,this.depth=0,this.maxFontSize=0,this.style=n}hasClass(t){return this.classes.includes(t)}toNode(){var t=document.createElement("img");return t.src=this.src,t.alt=this.alt,t.className="mord",Object.assign(t.style,this.style),t}toMarkup(){var t=''+De(this.alt)+'0&&(r=document.createElement("span"),r.style.marginRight=P(this.italic)),this.classes.length>0&&(r=r||document.createElement("span"),r.className=zt(this.classes)),Object.keys(this.style).length>0&&(r=r||document.createElement("span"),Object.assign(r.style,this.style)),r?(r.appendChild(t),r):t}toMarkup(){var t=!1,r="0&&(n+="margin-right:"+P(this.italic)+";"),n+=mi(this.style),n&&(t=!0,r+=' style="'+De(n)+'"');var i=De(this.text);return t?(r+=">",r+=i,r+="",r):i}}class yt{constructor(t,r){this.children=void 0,this.attributes=void 0,this.children=t||[],this.attributes=r||{}}toNode(){var t="http://www.w3.org/2000/svg",r=document.createElementNS(t,"svg");for(var n of Object.keys(this.attributes))r.setAttribute(n,this.attributes[n]);for(var i=0;i':''}}class E0{constructor(t){this.attributes=void 0,this.attributes=t||{}}toNode(){var t="http://www.w3.org/2000/svg",r=document.createElementNS(t,"line");for(var n of Object.keys(this.attributes))r.setAttribute(n,this.attributes[n]);return r}toMarkup(){var t=" but got "+String(e)+".")}var c2=e=>e instanceof sr||e instanceof bn||e instanceof lr,st={"AMS-Regular":{32:[0,0,0,0,.25],65:[0,.68889,0,0,.72222],66:[0,.68889,0,0,.66667],67:[0,.68889,0,0,.72222],68:[0,.68889,0,0,.72222],69:[0,.68889,0,0,.66667],70:[0,.68889,0,0,.61111],71:[0,.68889,0,0,.77778],72:[0,.68889,0,0,.77778],73:[0,.68889,0,0,.38889],74:[.16667,.68889,0,0,.5],75:[0,.68889,0,0,.77778],76:[0,.68889,0,0,.66667],77:[0,.68889,0,0,.94445],78:[0,.68889,0,0,.72222],79:[.16667,.68889,0,0,.77778],80:[0,.68889,0,0,.61111],81:[.16667,.68889,0,0,.77778],82:[0,.68889,0,0,.72222],83:[0,.68889,0,0,.55556],84:[0,.68889,0,0,.66667],85:[0,.68889,0,0,.72222],86:[0,.68889,0,0,.72222],87:[0,.68889,0,0,1],88:[0,.68889,0,0,.72222],89:[0,.68889,0,0,.72222],90:[0,.68889,0,0,.66667],107:[0,.68889,0,0,.55556],160:[0,0,0,0,.25],165:[0,.675,.025,0,.75],174:[.15559,.69224,0,0,.94666],240:[0,.68889,0,0,.55556],295:[0,.68889,0,0,.54028],710:[0,.825,0,0,2.33334],732:[0,.9,0,0,2.33334],770:[0,.825,0,0,2.33334],771:[0,.9,0,0,2.33334],989:[.08167,.58167,0,0,.77778],1008:[0,.43056,.04028,0,.66667],8245:[0,.54986,0,0,.275],8463:[0,.68889,0,0,.54028],8487:[0,.68889,0,0,.72222],8498:[0,.68889,0,0,.55556],8502:[0,.68889,0,0,.66667],8503:[0,.68889,0,0,.44445],8504:[0,.68889,0,0,.66667],8513:[0,.68889,0,0,.63889],8592:[-.03598,.46402,0,0,.5],8594:[-.03598,.46402,0,0,.5],8602:[-.13313,.36687,0,0,1],8603:[-.13313,.36687,0,0,1],8606:[.01354,.52239,0,0,1],8608:[.01354,.52239,0,0,1],8610:[.01354,.52239,0,0,1.11111],8611:[.01354,.52239,0,0,1.11111],8619:[0,.54986,0,0,1],8620:[0,.54986,0,0,1],8621:[-.13313,.37788,0,0,1.38889],8622:[-.13313,.36687,0,0,1],8624:[0,.69224,0,0,.5],8625:[0,.69224,0,0,.5],8630:[0,.43056,0,0,1],8631:[0,.43056,0,0,1],8634:[.08198,.58198,0,0,.77778],8635:[.08198,.58198,0,0,.77778],8638:[.19444,.69224,0,0,.41667],8639:[.19444,.69224,0,0,.41667],8642:[.19444,.69224,0,0,.41667],8643:[.19444,.69224,0,0,.41667],8644:[.1808,.675,0,0,1],8646:[.1808,.675,0,0,1],8647:[.1808,.675,0,0,1],8648:[.19444,.69224,0,0,.83334],8649:[.1808,.675,0,0,1],8650:[.19444,.69224,0,0,.83334],8651:[.01354,.52239,0,0,1],8652:[.01354,.52239,0,0,1],8653:[-.13313,.36687,0,0,1],8654:[-.13313,.36687,0,0,1],8655:[-.13313,.36687,0,0,1],8666:[.13667,.63667,0,0,1],8667:[.13667,.63667,0,0,1],8669:[-.13313,.37788,0,0,1],8672:[-.064,.437,0,0,1.334],8674:[-.064,.437,0,0,1.334],8705:[0,.825,0,0,.5],8708:[0,.68889,0,0,.55556],8709:[.08167,.58167,0,0,.77778],8717:[0,.43056,0,0,.42917],8722:[-.03598,.46402,0,0,.5],8724:[.08198,.69224,0,0,.77778],8726:[.08167,.58167,0,0,.77778],8733:[0,.69224,0,0,.77778],8736:[0,.69224,0,0,.72222],8737:[0,.69224,0,0,.72222],8738:[.03517,.52239,0,0,.72222],8739:[.08167,.58167,0,0,.22222],8740:[.25142,.74111,0,0,.27778],8741:[.08167,.58167,0,0,.38889],8742:[.25142,.74111,0,0,.5],8756:[0,.69224,0,0,.66667],8757:[0,.69224,0,0,.66667],8764:[-.13313,.36687,0,0,.77778],8765:[-.13313,.37788,0,0,.77778],8769:[-.13313,.36687,0,0,.77778],8770:[-.03625,.46375,0,0,.77778],8774:[.30274,.79383,0,0,.77778],8776:[-.01688,.48312,0,0,.77778],8778:[.08167,.58167,0,0,.77778],8782:[.06062,.54986,0,0,.77778],8783:[.06062,.54986,0,0,.77778],8785:[.08198,.58198,0,0,.77778],8786:[.08198,.58198,0,0,.77778],8787:[.08198,.58198,0,0,.77778],8790:[0,.69224,0,0,.77778],8791:[.22958,.72958,0,0,.77778],8796:[.08198,.91667,0,0,.77778],8806:[.25583,.75583,0,0,.77778],8807:[.25583,.75583,0,0,.77778],8808:[.25142,.75726,0,0,.77778],8809:[.25142,.75726,0,0,.77778],8812:[.25583,.75583,0,0,.5],8814:[.20576,.70576,0,0,.77778],8815:[.20576,.70576,0,0,.77778],8816:[.30274,.79383,0,0,.77778],8817:[.30274,.79383,0,0,.77778],8818:[.22958,.72958,0,0,.77778],8819:[.22958,.72958,0,0,.77778],8822:[.1808,.675,0,0,.77778],8823:[.1808,.675,0,0,.77778],8828:[.13667,.63667,0,0,.77778],8829:[.13667,.63667,0,0,.77778],8830:[.22958,.72958,0,0,.77778],8831:[.22958,.72958,0,0,.77778],8832:[.20576,.70576,0,0,.77778],8833:[.20576,.70576,0,0,.77778],8840:[.30274,.79383,0,0,.77778],8841:[.30274,.79383,0,0,.77778],8842:[.13597,.63597,0,0,.77778],8843:[.13597,.63597,0,0,.77778],8847:[.03517,.54986,0,0,.77778],8848:[.03517,.54986,0,0,.77778],8858:[.08198,.58198,0,0,.77778],8859:[.08198,.58198,0,0,.77778],8861:[.08198,.58198,0,0,.77778],8862:[0,.675,0,0,.77778],8863:[0,.675,0,0,.77778],8864:[0,.675,0,0,.77778],8865:[0,.675,0,0,.77778],8872:[0,.69224,0,0,.61111],8873:[0,.69224,0,0,.72222],8874:[0,.69224,0,0,.88889],8876:[0,.68889,0,0,.61111],8877:[0,.68889,0,0,.61111],8878:[0,.68889,0,0,.72222],8879:[0,.68889,0,0,.72222],8882:[.03517,.54986,0,0,.77778],8883:[.03517,.54986,0,0,.77778],8884:[.13667,.63667,0,0,.77778],8885:[.13667,.63667,0,0,.77778],8888:[0,.54986,0,0,1.11111],8890:[.19444,.43056,0,0,.55556],8891:[.19444,.69224,0,0,.61111],8892:[.19444,.69224,0,0,.61111],8901:[0,.54986,0,0,.27778],8903:[.08167,.58167,0,0,.77778],8905:[.08167,.58167,0,0,.77778],8906:[.08167,.58167,0,0,.77778],8907:[0,.69224,0,0,.77778],8908:[0,.69224,0,0,.77778],8909:[-.03598,.46402,0,0,.77778],8910:[0,.54986,0,0,.76042],8911:[0,.54986,0,0,.76042],8912:[.03517,.54986,0,0,.77778],8913:[.03517,.54986,0,0,.77778],8914:[0,.54986,0,0,.66667],8915:[0,.54986,0,0,.66667],8916:[0,.69224,0,0,.66667],8918:[.0391,.5391,0,0,.77778],8919:[.0391,.5391,0,0,.77778],8920:[.03517,.54986,0,0,1.33334],8921:[.03517,.54986,0,0,1.33334],8922:[.38569,.88569,0,0,.77778],8923:[.38569,.88569,0,0,.77778],8926:[.13667,.63667,0,0,.77778],8927:[.13667,.63667,0,0,.77778],8928:[.30274,.79383,0,0,.77778],8929:[.30274,.79383,0,0,.77778],8934:[.23222,.74111,0,0,.77778],8935:[.23222,.74111,0,0,.77778],8936:[.23222,.74111,0,0,.77778],8937:[.23222,.74111,0,0,.77778],8938:[.20576,.70576,0,0,.77778],8939:[.20576,.70576,0,0,.77778],8940:[.30274,.79383,0,0,.77778],8941:[.30274,.79383,0,0,.77778],8994:[.19444,.69224,0,0,.77778],8995:[.19444,.69224,0,0,.77778],9416:[.15559,.69224,0,0,.90222],9484:[0,.69224,0,0,.5],9488:[0,.69224,0,0,.5],9492:[0,.37788,0,0,.5],9496:[0,.37788,0,0,.5],9585:[.19444,.68889,0,0,.88889],9586:[.19444,.74111,0,0,.88889],9632:[0,.675,0,0,.77778],9633:[0,.675,0,0,.77778],9650:[0,.54986,0,0,.72222],9651:[0,.54986,0,0,.72222],9654:[.03517,.54986,0,0,.77778],9660:[0,.54986,0,0,.72222],9661:[0,.54986,0,0,.72222],9664:[.03517,.54986,0,0,.77778],9674:[.11111,.69224,0,0,.66667],9733:[.19444,.69224,0,0,.94445],10003:[0,.69224,0,0,.83334],10016:[0,.69224,0,0,.83334],10731:[.11111,.69224,0,0,.66667],10846:[.19444,.75583,0,0,.61111],10877:[.13667,.63667,0,0,.77778],10878:[.13667,.63667,0,0,.77778],10885:[.25583,.75583,0,0,.77778],10886:[.25583,.75583,0,0,.77778],10887:[.13597,.63597,0,0,.77778],10888:[.13597,.63597,0,0,.77778],10889:[.26167,.75726,0,0,.77778],10890:[.26167,.75726,0,0,.77778],10891:[.48256,.98256,0,0,.77778],10892:[.48256,.98256,0,0,.77778],10901:[.13667,.63667,0,0,.77778],10902:[.13667,.63667,0,0,.77778],10933:[.25142,.75726,0,0,.77778],10934:[.25142,.75726,0,0,.77778],10935:[.26167,.75726,0,0,.77778],10936:[.26167,.75726,0,0,.77778],10937:[.26167,.75726,0,0,.77778],10938:[.26167,.75726,0,0,.77778],10949:[.25583,.75583,0,0,.77778],10950:[.25583,.75583,0,0,.77778],10955:[.28481,.79383,0,0,.77778],10956:[.28481,.79383,0,0,.77778],57350:[.08167,.58167,0,0,.22222],57351:[.08167,.58167,0,0,.38889],57352:[.08167,.58167,0,0,.77778],57353:[0,.43056,.04028,0,.66667],57356:[.25142,.75726,0,0,.77778],57357:[.25142,.75726,0,0,.77778],57358:[.41951,.91951,0,0,.77778],57359:[.30274,.79383,0,0,.77778],57360:[.30274,.79383,0,0,.77778],57361:[.41951,.91951,0,0,.77778],57366:[.25142,.75726,0,0,.77778],57367:[.25142,.75726,0,0,.77778],57368:[.25142,.75726,0,0,.77778],57369:[.25142,.75726,0,0,.77778],57370:[.13597,.63597,0,0,.77778],57371:[.13597,.63597,0,0,.77778]},"Caligraphic-Regular":{32:[0,0,0,0,.25],65:[0,.68333,0,.19445,.79847],66:[0,.68333,.03041,.13889,.65681],67:[0,.68333,.05834,.13889,.52653],68:[0,.68333,.02778,.08334,.77139],69:[0,.68333,.08944,.11111,.52778],70:[0,.68333,.09931,.11111,.71875],71:[.09722,.68333,.0593,.11111,.59487],72:[0,.68333,.00965,.11111,.84452],73:[0,.68333,.07382,0,.54452],74:[.09722,.68333,.18472,.16667,.67778],75:[0,.68333,.01445,.05556,.76195],76:[0,.68333,0,.13889,.68972],77:[0,.68333,0,.13889,1.2009],78:[0,.68333,.14736,.08334,.82049],79:[0,.68333,.02778,.11111,.79611],80:[0,.68333,.08222,.08334,.69556],81:[.09722,.68333,0,.11111,.81667],82:[0,.68333,0,.08334,.8475],83:[0,.68333,.075,.13889,.60556],84:[0,.68333,.25417,0,.54464],85:[0,.68333,.09931,.08334,.62583],86:[0,.68333,.08222,0,.61278],87:[0,.68333,.08222,.08334,.98778],88:[0,.68333,.14643,.13889,.7133],89:[.09722,.68333,.08222,.08334,.66834],90:[0,.68333,.07944,.13889,.72473],160:[0,0,0,0,.25]},"Fraktur-Regular":{32:[0,0,0,0,.25],33:[0,.69141,0,0,.29574],34:[0,.69141,0,0,.21471],38:[0,.69141,0,0,.73786],39:[0,.69141,0,0,.21201],40:[.24982,.74947,0,0,.38865],41:[.24982,.74947,0,0,.38865],42:[0,.62119,0,0,.27764],43:[.08319,.58283,0,0,.75623],44:[0,.10803,0,0,.27764],45:[.08319,.58283,0,0,.75623],46:[0,.10803,0,0,.27764],47:[.24982,.74947,0,0,.50181],48:[0,.47534,0,0,.50181],49:[0,.47534,0,0,.50181],50:[0,.47534,0,0,.50181],51:[.18906,.47534,0,0,.50181],52:[.18906,.47534,0,0,.50181],53:[.18906,.47534,0,0,.50181],54:[0,.69141,0,0,.50181],55:[.18906,.47534,0,0,.50181],56:[0,.69141,0,0,.50181],57:[.18906,.47534,0,0,.50181],58:[0,.47534,0,0,.21606],59:[.12604,.47534,0,0,.21606],61:[-.13099,.36866,0,0,.75623],63:[0,.69141,0,0,.36245],65:[0,.69141,0,0,.7176],66:[0,.69141,0,0,.88397],67:[0,.69141,0,0,.61254],68:[0,.69141,0,0,.83158],69:[0,.69141,0,0,.66278],70:[.12604,.69141,0,0,.61119],71:[0,.69141,0,0,.78539],72:[.06302,.69141,0,0,.7203],73:[0,.69141,0,0,.55448],74:[.12604,.69141,0,0,.55231],75:[0,.69141,0,0,.66845],76:[0,.69141,0,0,.66602],77:[0,.69141,0,0,1.04953],78:[0,.69141,0,0,.83212],79:[0,.69141,0,0,.82699],80:[.18906,.69141,0,0,.82753],81:[.03781,.69141,0,0,.82699],82:[0,.69141,0,0,.82807],83:[0,.69141,0,0,.82861],84:[0,.69141,0,0,.66899],85:[0,.69141,0,0,.64576],86:[0,.69141,0,0,.83131],87:[0,.69141,0,0,1.04602],88:[0,.69141,0,0,.71922],89:[.18906,.69141,0,0,.83293],90:[.12604,.69141,0,0,.60201],91:[.24982,.74947,0,0,.27764],93:[.24982,.74947,0,0,.27764],94:[0,.69141,0,0,.49965],97:[0,.47534,0,0,.50046],98:[0,.69141,0,0,.51315],99:[0,.47534,0,0,.38946],100:[0,.62119,0,0,.49857],101:[0,.47534,0,0,.40053],102:[.18906,.69141,0,0,.32626],103:[.18906,.47534,0,0,.5037],104:[.18906,.69141,0,0,.52126],105:[0,.69141,0,0,.27899],106:[0,.69141,0,0,.28088],107:[0,.69141,0,0,.38946],108:[0,.69141,0,0,.27953],109:[0,.47534,0,0,.76676],110:[0,.47534,0,0,.52666],111:[0,.47534,0,0,.48885],112:[.18906,.52396,0,0,.50046],113:[.18906,.47534,0,0,.48912],114:[0,.47534,0,0,.38919],115:[0,.47534,0,0,.44266],116:[0,.62119,0,0,.33301],117:[0,.47534,0,0,.5172],118:[0,.52396,0,0,.5118],119:[0,.52396,0,0,.77351],120:[.18906,.47534,0,0,.38865],121:[.18906,.47534,0,0,.49884],122:[.18906,.47534,0,0,.39054],160:[0,0,0,0,.25],8216:[0,.69141,0,0,.21471],8217:[0,.69141,0,0,.21471],58112:[0,.62119,0,0,.49749],58113:[0,.62119,0,0,.4983],58114:[.18906,.69141,0,0,.33328],58115:[.18906,.69141,0,0,.32923],58116:[.18906,.47534,0,0,.50343],58117:[0,.69141,0,0,.33301],58118:[0,.62119,0,0,.33409],58119:[0,.47534,0,0,.50073]},"Main-Bold":{32:[0,0,0,0,.25],33:[0,.69444,0,0,.35],34:[0,.69444,0,0,.60278],35:[.19444,.69444,0,0,.95833],36:[.05556,.75,0,0,.575],37:[.05556,.75,0,0,.95833],38:[0,.69444,0,0,.89444],39:[0,.69444,0,0,.31944],40:[.25,.75,0,0,.44722],41:[.25,.75,0,0,.44722],42:[0,.75,0,0,.575],43:[.13333,.63333,0,0,.89444],44:[.19444,.15556,0,0,.31944],45:[0,.44444,0,0,.38333],46:[0,.15556,0,0,.31944],47:[.25,.75,0,0,.575],48:[0,.64444,0,0,.575],49:[0,.64444,0,0,.575],50:[0,.64444,0,0,.575],51:[0,.64444,0,0,.575],52:[0,.64444,0,0,.575],53:[0,.64444,0,0,.575],54:[0,.64444,0,0,.575],55:[0,.64444,0,0,.575],56:[0,.64444,0,0,.575],57:[0,.64444,0,0,.575],58:[0,.44444,0,0,.31944],59:[.19444,.44444,0,0,.31944],60:[.08556,.58556,0,0,.89444],61:[-.10889,.39111,0,0,.89444],62:[.08556,.58556,0,0,.89444],63:[0,.69444,0,0,.54305],64:[0,.69444,0,0,.89444],65:[0,.68611,0,0,.86944],66:[0,.68611,0,0,.81805],67:[0,.68611,0,0,.83055],68:[0,.68611,0,0,.88194],69:[0,.68611,0,0,.75555],70:[0,.68611,0,0,.72361],71:[0,.68611,0,0,.90416],72:[0,.68611,0,0,.9],73:[0,.68611,0,0,.43611],74:[0,.68611,0,0,.59444],75:[0,.68611,0,0,.90138],76:[0,.68611,0,0,.69166],77:[0,.68611,0,0,1.09166],78:[0,.68611,0,0,.9],79:[0,.68611,0,0,.86388],80:[0,.68611,0,0,.78611],81:[.19444,.68611,0,0,.86388],82:[0,.68611,0,0,.8625],83:[0,.68611,0,0,.63889],84:[0,.68611,0,0,.8],85:[0,.68611,0,0,.88472],86:[0,.68611,.01597,0,.86944],87:[0,.68611,.01597,0,1.18888],88:[0,.68611,0,0,.86944],89:[0,.68611,.02875,0,.86944],90:[0,.68611,0,0,.70277],91:[.25,.75,0,0,.31944],92:[.25,.75,0,0,.575],93:[.25,.75,0,0,.31944],94:[0,.69444,0,0,.575],95:[.31,.13444,.03194,0,.575],97:[0,.44444,0,0,.55902],98:[0,.69444,0,0,.63889],99:[0,.44444,0,0,.51111],100:[0,.69444,0,0,.63889],101:[0,.44444,0,0,.52708],102:[0,.69444,.10903,0,.35139],103:[.19444,.44444,.01597,0,.575],104:[0,.69444,0,0,.63889],105:[0,.69444,0,0,.31944],106:[.19444,.69444,0,0,.35139],107:[0,.69444,0,0,.60694],108:[0,.69444,0,0,.31944],109:[0,.44444,0,0,.95833],110:[0,.44444,0,0,.63889],111:[0,.44444,0,0,.575],112:[.19444,.44444,0,0,.63889],113:[.19444,.44444,0,0,.60694],114:[0,.44444,0,0,.47361],115:[0,.44444,0,0,.45361],116:[0,.63492,0,0,.44722],117:[0,.44444,0,0,.63889],118:[0,.44444,.01597,0,.60694],119:[0,.44444,.01597,0,.83055],120:[0,.44444,0,0,.60694],121:[.19444,.44444,.01597,0,.60694],122:[0,.44444,0,0,.51111],123:[.25,.75,0,0,.575],124:[.25,.75,0,0,.31944],125:[.25,.75,0,0,.575],126:[.35,.34444,0,0,.575],160:[0,0,0,0,.25],163:[0,.69444,0,0,.86853],168:[0,.69444,0,0,.575],172:[0,.44444,0,0,.76666],176:[0,.69444,0,0,.86944],177:[.13333,.63333,0,0,.89444],184:[.17014,0,0,0,.51111],198:[0,.68611,0,0,1.04166],215:[.13333,.63333,0,0,.89444],216:[.04861,.73472,0,0,.89444],223:[0,.69444,0,0,.59722],230:[0,.44444,0,0,.83055],247:[.13333,.63333,0,0,.89444],248:[.09722,.54167,0,0,.575],305:[0,.44444,0,0,.31944],338:[0,.68611,0,0,1.16944],339:[0,.44444,0,0,.89444],567:[.19444,.44444,0,0,.35139],710:[0,.69444,0,0,.575],711:[0,.63194,0,0,.575],713:[0,.59611,0,0,.575],714:[0,.69444,0,0,.575],715:[0,.69444,0,0,.575],728:[0,.69444,0,0,.575],729:[0,.69444,0,0,.31944],730:[0,.69444,0,0,.86944],732:[0,.69444,0,0,.575],733:[0,.69444,0,0,.575],915:[0,.68611,0,0,.69166],916:[0,.68611,0,0,.95833],920:[0,.68611,0,0,.89444],923:[0,.68611,0,0,.80555],926:[0,.68611,0,0,.76666],928:[0,.68611,0,0,.9],931:[0,.68611,0,0,.83055],933:[0,.68611,0,0,.89444],934:[0,.68611,0,0,.83055],936:[0,.68611,0,0,.89444],937:[0,.68611,0,0,.83055],8211:[0,.44444,.03194,0,.575],8212:[0,.44444,.03194,0,1.14999],8216:[0,.69444,0,0,.31944],8217:[0,.69444,0,0,.31944],8220:[0,.69444,0,0,.60278],8221:[0,.69444,0,0,.60278],8224:[.19444,.69444,0,0,.51111],8225:[.19444,.69444,0,0,.51111],8242:[0,.55556,0,0,.34444],8407:[0,.72444,.15486,0,.575],8463:[0,.69444,0,0,.66759],8465:[0,.69444,0,0,.83055],8467:[0,.69444,0,0,.47361],8472:[.19444,.44444,0,0,.74027],8476:[0,.69444,0,0,.83055],8501:[0,.69444,0,0,.70277],8592:[-.10889,.39111,0,0,1.14999],8593:[.19444,.69444,0,0,.575],8594:[-.10889,.39111,0,0,1.14999],8595:[.19444,.69444,0,0,.575],8596:[-.10889,.39111,0,0,1.14999],8597:[.25,.75,0,0,.575],8598:[.19444,.69444,0,0,1.14999],8599:[.19444,.69444,0,0,1.14999],8600:[.19444,.69444,0,0,1.14999],8601:[.19444,.69444,0,0,1.14999],8636:[-.10889,.39111,0,0,1.14999],8637:[-.10889,.39111,0,0,1.14999],8640:[-.10889,.39111,0,0,1.14999],8641:[-.10889,.39111,0,0,1.14999],8656:[-.10889,.39111,0,0,1.14999],8657:[.19444,.69444,0,0,.70277],8658:[-.10889,.39111,0,0,1.14999],8659:[.19444,.69444,0,0,.70277],8660:[-.10889,.39111,0,0,1.14999],8661:[.25,.75,0,0,.70277],8704:[0,.69444,0,0,.63889],8706:[0,.69444,.06389,0,.62847],8707:[0,.69444,0,0,.63889],8709:[.05556,.75,0,0,.575],8711:[0,.68611,0,0,.95833],8712:[.08556,.58556,0,0,.76666],8715:[.08556,.58556,0,0,.76666],8722:[.13333,.63333,0,0,.89444],8723:[.13333,.63333,0,0,.89444],8725:[.25,.75,0,0,.575],8726:[.25,.75,0,0,.575],8727:[-.02778,.47222,0,0,.575],8728:[-.02639,.47361,0,0,.575],8729:[-.02639,.47361,0,0,.575],8730:[.18,.82,0,0,.95833],8733:[0,.44444,0,0,.89444],8734:[0,.44444,0,0,1.14999],8736:[0,.69224,0,0,.72222],8739:[.25,.75,0,0,.31944],8741:[.25,.75,0,0,.575],8743:[0,.55556,0,0,.76666],8744:[0,.55556,0,0,.76666],8745:[0,.55556,0,0,.76666],8746:[0,.55556,0,0,.76666],8747:[.19444,.69444,.12778,0,.56875],8764:[-.10889,.39111,0,0,.89444],8768:[.19444,.69444,0,0,.31944],8771:[.00222,.50222,0,0,.89444],8773:[.027,.638,0,0,.894],8776:[.02444,.52444,0,0,.89444],8781:[.00222,.50222,0,0,.89444],8801:[.00222,.50222,0,0,.89444],8804:[.19667,.69667,0,0,.89444],8805:[.19667,.69667,0,0,.89444],8810:[.08556,.58556,0,0,1.14999],8811:[.08556,.58556,0,0,1.14999],8826:[.08556,.58556,0,0,.89444],8827:[.08556,.58556,0,0,.89444],8834:[.08556,.58556,0,0,.89444],8835:[.08556,.58556,0,0,.89444],8838:[.19667,.69667,0,0,.89444],8839:[.19667,.69667,0,0,.89444],8846:[0,.55556,0,0,.76666],8849:[.19667,.69667,0,0,.89444],8850:[.19667,.69667,0,0,.89444],8851:[0,.55556,0,0,.76666],8852:[0,.55556,0,0,.76666],8853:[.13333,.63333,0,0,.89444],8854:[.13333,.63333,0,0,.89444],8855:[.13333,.63333,0,0,.89444],8856:[.13333,.63333,0,0,.89444],8857:[.13333,.63333,0,0,.89444],8866:[0,.69444,0,0,.70277],8867:[0,.69444,0,0,.70277],8868:[0,.69444,0,0,.89444],8869:[0,.69444,0,0,.89444],8900:[-.02639,.47361,0,0,.575],8901:[-.02639,.47361,0,0,.31944],8902:[-.02778,.47222,0,0,.575],8968:[.25,.75,0,0,.51111],8969:[.25,.75,0,0,.51111],8970:[.25,.75,0,0,.51111],8971:[.25,.75,0,0,.51111],8994:[-.13889,.36111,0,0,1.14999],8995:[-.13889,.36111,0,0,1.14999],9651:[.19444,.69444,0,0,1.02222],9657:[-.02778,.47222,0,0,.575],9661:[.19444,.69444,0,0,1.02222],9667:[-.02778,.47222,0,0,.575],9711:[.19444,.69444,0,0,1.14999],9824:[.12963,.69444,0,0,.89444],9825:[.12963,.69444,0,0,.89444],9826:[.12963,.69444,0,0,.89444],9827:[.12963,.69444,0,0,.89444],9837:[0,.75,0,0,.44722],9838:[.19444,.69444,0,0,.44722],9839:[.19444,.69444,0,0,.44722],10216:[.25,.75,0,0,.44722],10217:[.25,.75,0,0,.44722],10815:[0,.68611,0,0,.9],10927:[.19667,.69667,0,0,.89444],10928:[.19667,.69667,0,0,.89444],57376:[.19444,.69444,0,0,0]},"Main-BoldItalic":{32:[0,0,0,0,.25],33:[0,.69444,.11417,0,.38611],34:[0,.69444,.07939,0,.62055],35:[.19444,.69444,.06833,0,.94444],37:[.05556,.75,.12861,0,.94444],38:[0,.69444,.08528,0,.88555],39:[0,.69444,.12945,0,.35555],40:[.25,.75,.15806,0,.47333],41:[.25,.75,.03306,0,.47333],42:[0,.75,.14333,0,.59111],43:[.10333,.60333,.03306,0,.88555],44:[.19444,.14722,0,0,.35555],45:[0,.44444,.02611,0,.41444],46:[0,.14722,0,0,.35555],47:[.25,.75,.15806,0,.59111],48:[0,.64444,.13167,0,.59111],49:[0,.64444,.13167,0,.59111],50:[0,.64444,.13167,0,.59111],51:[0,.64444,.13167,0,.59111],52:[.19444,.64444,.13167,0,.59111],53:[0,.64444,.13167,0,.59111],54:[0,.64444,.13167,0,.59111],55:[.19444,.64444,.13167,0,.59111],56:[0,.64444,.13167,0,.59111],57:[0,.64444,.13167,0,.59111],58:[0,.44444,.06695,0,.35555],59:[.19444,.44444,.06695,0,.35555],61:[-.10889,.39111,.06833,0,.88555],63:[0,.69444,.11472,0,.59111],64:[0,.69444,.09208,0,.88555],65:[0,.68611,0,0,.86555],66:[0,.68611,.0992,0,.81666],67:[0,.68611,.14208,0,.82666],68:[0,.68611,.09062,0,.87555],69:[0,.68611,.11431,0,.75666],70:[0,.68611,.12903,0,.72722],71:[0,.68611,.07347,0,.89527],72:[0,.68611,.17208,0,.8961],73:[0,.68611,.15681,0,.47166],74:[0,.68611,.145,0,.61055],75:[0,.68611,.14208,0,.89499],76:[0,.68611,0,0,.69777],77:[0,.68611,.17208,0,1.07277],78:[0,.68611,.17208,0,.8961],79:[0,.68611,.09062,0,.85499],80:[0,.68611,.0992,0,.78721],81:[.19444,.68611,.09062,0,.85499],82:[0,.68611,.02559,0,.85944],83:[0,.68611,.11264,0,.64999],84:[0,.68611,.12903,0,.7961],85:[0,.68611,.17208,0,.88083],86:[0,.68611,.18625,0,.86555],87:[0,.68611,.18625,0,1.15999],88:[0,.68611,.15681,0,.86555],89:[0,.68611,.19803,0,.86555],90:[0,.68611,.14208,0,.70888],91:[.25,.75,.1875,0,.35611],93:[.25,.75,.09972,0,.35611],94:[0,.69444,.06709,0,.59111],95:[.31,.13444,.09811,0,.59111],97:[0,.44444,.09426,0,.59111],98:[0,.69444,.07861,0,.53222],99:[0,.44444,.05222,0,.53222],100:[0,.69444,.10861,0,.59111],101:[0,.44444,.085,0,.53222],102:[.19444,.69444,.21778,0,.4],103:[.19444,.44444,.105,0,.53222],104:[0,.69444,.09426,0,.59111],105:[0,.69326,.11387,0,.35555],106:[.19444,.69326,.1672,0,.35555],107:[0,.69444,.11111,0,.53222],108:[0,.69444,.10861,0,.29666],109:[0,.44444,.09426,0,.94444],110:[0,.44444,.09426,0,.64999],111:[0,.44444,.07861,0,.59111],112:[.19444,.44444,.07861,0,.59111],113:[.19444,.44444,.105,0,.53222],114:[0,.44444,.11111,0,.50167],115:[0,.44444,.08167,0,.48694],116:[0,.63492,.09639,0,.385],117:[0,.44444,.09426,0,.62055],118:[0,.44444,.11111,0,.53222],119:[0,.44444,.11111,0,.76777],120:[0,.44444,.12583,0,.56055],121:[.19444,.44444,.105,0,.56166],122:[0,.44444,.13889,0,.49055],126:[.35,.34444,.11472,0,.59111],160:[0,0,0,0,.25],168:[0,.69444,.11473,0,.59111],176:[0,.69444,0,0,.94888],184:[.17014,0,0,0,.53222],198:[0,.68611,.11431,0,1.02277],216:[.04861,.73472,.09062,0,.88555],223:[.19444,.69444,.09736,0,.665],230:[0,.44444,.085,0,.82666],248:[.09722,.54167,.09458,0,.59111],305:[0,.44444,.09426,0,.35555],338:[0,.68611,.11431,0,1.14054],339:[0,.44444,.085,0,.82666],567:[.19444,.44444,.04611,0,.385],710:[0,.69444,.06709,0,.59111],711:[0,.63194,.08271,0,.59111],713:[0,.59444,.10444,0,.59111],714:[0,.69444,.08528,0,.59111],715:[0,.69444,0,0,.59111],728:[0,.69444,.10333,0,.59111],729:[0,.69444,.12945,0,.35555],730:[0,.69444,0,0,.94888],732:[0,.69444,.11472,0,.59111],733:[0,.69444,.11472,0,.59111],915:[0,.68611,.12903,0,.69777],916:[0,.68611,0,0,.94444],920:[0,.68611,.09062,0,.88555],923:[0,.68611,0,0,.80666],926:[0,.68611,.15092,0,.76777],928:[0,.68611,.17208,0,.8961],931:[0,.68611,.11431,0,.82666],933:[0,.68611,.10778,0,.88555],934:[0,.68611,.05632,0,.82666],936:[0,.68611,.10778,0,.88555],937:[0,.68611,.0992,0,.82666],8211:[0,.44444,.09811,0,.59111],8212:[0,.44444,.09811,0,1.18221],8216:[0,.69444,.12945,0,.35555],8217:[0,.69444,.12945,0,.35555],8220:[0,.69444,.16772,0,.62055],8221:[0,.69444,.07939,0,.62055]},"Main-Italic":{32:[0,0,0,0,.25],33:[0,.69444,.12417,0,.30667],34:[0,.69444,.06961,0,.51444],35:[.19444,.69444,.06616,0,.81777],37:[.05556,.75,.13639,0,.81777],38:[0,.69444,.09694,0,.76666],39:[0,.69444,.12417,0,.30667],40:[.25,.75,.16194,0,.40889],41:[.25,.75,.03694,0,.40889],42:[0,.75,.14917,0,.51111],43:[.05667,.56167,.03694,0,.76666],44:[.19444,.10556,0,0,.30667],45:[0,.43056,.02826,0,.35778],46:[0,.10556,0,0,.30667],47:[.25,.75,.16194,0,.51111],48:[0,.64444,.13556,0,.51111],49:[0,.64444,.13556,0,.51111],50:[0,.64444,.13556,0,.51111],51:[0,.64444,.13556,0,.51111],52:[.19444,.64444,.13556,0,.51111],53:[0,.64444,.13556,0,.51111],54:[0,.64444,.13556,0,.51111],55:[.19444,.64444,.13556,0,.51111],56:[0,.64444,.13556,0,.51111],57:[0,.64444,.13556,0,.51111],58:[0,.43056,.0582,0,.30667],59:[.19444,.43056,.0582,0,.30667],61:[-.13313,.36687,.06616,0,.76666],63:[0,.69444,.1225,0,.51111],64:[0,.69444,.09597,0,.76666],65:[0,.68333,0,0,.74333],66:[0,.68333,.10257,0,.70389],67:[0,.68333,.14528,0,.71555],68:[0,.68333,.09403,0,.755],69:[0,.68333,.12028,0,.67833],70:[0,.68333,.13305,0,.65277],71:[0,.68333,.08722,0,.77361],72:[0,.68333,.16389,0,.74333],73:[0,.68333,.15806,0,.38555],74:[0,.68333,.14028,0,.525],75:[0,.68333,.14528,0,.76888],76:[0,.68333,0,0,.62722],77:[0,.68333,.16389,0,.89666],78:[0,.68333,.16389,0,.74333],79:[0,.68333,.09403,0,.76666],80:[0,.68333,.10257,0,.67833],81:[.19444,.68333,.09403,0,.76666],82:[0,.68333,.03868,0,.72944],83:[0,.68333,.11972,0,.56222],84:[0,.68333,.13305,0,.71555],85:[0,.68333,.16389,0,.74333],86:[0,.68333,.18361,0,.74333],87:[0,.68333,.18361,0,.99888],88:[0,.68333,.15806,0,.74333],89:[0,.68333,.19383,0,.74333],90:[0,.68333,.14528,0,.61333],91:[.25,.75,.1875,0,.30667],93:[.25,.75,.10528,0,.30667],94:[0,.69444,.06646,0,.51111],95:[.31,.12056,.09208,0,.51111],97:[0,.43056,.07671,0,.51111],98:[0,.69444,.06312,0,.46],99:[0,.43056,.05653,0,.46],100:[0,.69444,.10333,0,.51111],101:[0,.43056,.07514,0,.46],102:[.19444,.69444,.21194,0,.30667],103:[.19444,.43056,.08847,0,.46],104:[0,.69444,.07671,0,.51111],105:[0,.65536,.1019,0,.30667],106:[.19444,.65536,.14467,0,.30667],107:[0,.69444,.10764,0,.46],108:[0,.69444,.10333,0,.25555],109:[0,.43056,.07671,0,.81777],110:[0,.43056,.07671,0,.56222],111:[0,.43056,.06312,0,.51111],112:[.19444,.43056,.06312,0,.51111],113:[.19444,.43056,.08847,0,.46],114:[0,.43056,.10764,0,.42166],115:[0,.43056,.08208,0,.40889],116:[0,.61508,.09486,0,.33222],117:[0,.43056,.07671,0,.53666],118:[0,.43056,.10764,0,.46],119:[0,.43056,.10764,0,.66444],120:[0,.43056,.12042,0,.46389],121:[.19444,.43056,.08847,0,.48555],122:[0,.43056,.12292,0,.40889],126:[.35,.31786,.11585,0,.51111],160:[0,0,0,0,.25],168:[0,.66786,.10474,0,.51111],176:[0,.69444,0,0,.83129],184:[.17014,0,0,0,.46],198:[0,.68333,.12028,0,.88277],216:[.04861,.73194,.09403,0,.76666],223:[.19444,.69444,.10514,0,.53666],230:[0,.43056,.07514,0,.71555],248:[.09722,.52778,.09194,0,.51111],338:[0,.68333,.12028,0,.98499],339:[0,.43056,.07514,0,.71555],710:[0,.69444,.06646,0,.51111],711:[0,.62847,.08295,0,.51111],713:[0,.56167,.10333,0,.51111],714:[0,.69444,.09694,0,.51111],715:[0,.69444,0,0,.51111],728:[0,.69444,.10806,0,.51111],729:[0,.66786,.11752,0,.30667],730:[0,.69444,0,0,.83129],732:[0,.66786,.11585,0,.51111],733:[0,.69444,.1225,0,.51111],915:[0,.68333,.13305,0,.62722],916:[0,.68333,0,0,.81777],920:[0,.68333,.09403,0,.76666],923:[0,.68333,0,0,.69222],926:[0,.68333,.15294,0,.66444],928:[0,.68333,.16389,0,.74333],931:[0,.68333,.12028,0,.71555],933:[0,.68333,.11111,0,.76666],934:[0,.68333,.05986,0,.71555],936:[0,.68333,.11111,0,.76666],937:[0,.68333,.10257,0,.71555],8211:[0,.43056,.09208,0,.51111],8212:[0,.43056,.09208,0,1.02222],8216:[0,.69444,.12417,0,.30667],8217:[0,.69444,.12417,0,.30667],8220:[0,.69444,.1685,0,.51444],8221:[0,.69444,.06961,0,.51444],8463:[0,.68889,0,0,.54028]},"Main-Regular":{32:[0,0,0,0,.25],33:[0,.69444,0,0,.27778],34:[0,.69444,0,0,.5],35:[.19444,.69444,0,0,.83334],36:[.05556,.75,0,0,.5],37:[.05556,.75,0,0,.83334],38:[0,.69444,0,0,.77778],39:[0,.69444,0,0,.27778],40:[.25,.75,0,0,.38889],41:[.25,.75,0,0,.38889],42:[0,.75,0,0,.5],43:[.08333,.58333,0,0,.77778],44:[.19444,.10556,0,0,.27778],45:[0,.43056,0,0,.33333],46:[0,.10556,0,0,.27778],47:[.25,.75,0,0,.5],48:[0,.64444,0,0,.5],49:[0,.64444,0,0,.5],50:[0,.64444,0,0,.5],51:[0,.64444,0,0,.5],52:[0,.64444,0,0,.5],53:[0,.64444,0,0,.5],54:[0,.64444,0,0,.5],55:[0,.64444,0,0,.5],56:[0,.64444,0,0,.5],57:[0,.64444,0,0,.5],58:[0,.43056,0,0,.27778],59:[.19444,.43056,0,0,.27778],60:[.0391,.5391,0,0,.77778],61:[-.13313,.36687,0,0,.77778],62:[.0391,.5391,0,0,.77778],63:[0,.69444,0,0,.47222],64:[0,.69444,0,0,.77778],65:[0,.68333,0,0,.75],66:[0,.68333,0,0,.70834],67:[0,.68333,0,0,.72222],68:[0,.68333,0,0,.76389],69:[0,.68333,0,0,.68056],70:[0,.68333,0,0,.65278],71:[0,.68333,0,0,.78472],72:[0,.68333,0,0,.75],73:[0,.68333,0,0,.36111],74:[0,.68333,0,0,.51389],75:[0,.68333,0,0,.77778],76:[0,.68333,0,0,.625],77:[0,.68333,0,0,.91667],78:[0,.68333,0,0,.75],79:[0,.68333,0,0,.77778],80:[0,.68333,0,0,.68056],81:[.19444,.68333,0,0,.77778],82:[0,.68333,0,0,.73611],83:[0,.68333,0,0,.55556],84:[0,.68333,0,0,.72222],85:[0,.68333,0,0,.75],86:[0,.68333,.01389,0,.75],87:[0,.68333,.01389,0,1.02778],88:[0,.68333,0,0,.75],89:[0,.68333,.025,0,.75],90:[0,.68333,0,0,.61111],91:[.25,.75,0,0,.27778],92:[.25,.75,0,0,.5],93:[.25,.75,0,0,.27778],94:[0,.69444,0,0,.5],95:[.31,.12056,.02778,0,.5],97:[0,.43056,0,0,.5],98:[0,.69444,0,0,.55556],99:[0,.43056,0,0,.44445],100:[0,.69444,0,0,.55556],101:[0,.43056,0,0,.44445],102:[0,.69444,.07778,0,.30556],103:[.19444,.43056,.01389,0,.5],104:[0,.69444,0,0,.55556],105:[0,.66786,0,0,.27778],106:[.19444,.66786,0,0,.30556],107:[0,.69444,0,0,.52778],108:[0,.69444,0,0,.27778],109:[0,.43056,0,0,.83334],110:[0,.43056,0,0,.55556],111:[0,.43056,0,0,.5],112:[.19444,.43056,0,0,.55556],113:[.19444,.43056,0,0,.52778],114:[0,.43056,0,0,.39167],115:[0,.43056,0,0,.39445],116:[0,.61508,0,0,.38889],117:[0,.43056,0,0,.55556],118:[0,.43056,.01389,0,.52778],119:[0,.43056,.01389,0,.72222],120:[0,.43056,0,0,.52778],121:[.19444,.43056,.01389,0,.52778],122:[0,.43056,0,0,.44445],123:[.25,.75,0,0,.5],124:[.25,.75,0,0,.27778],125:[.25,.75,0,0,.5],126:[.35,.31786,0,0,.5],160:[0,0,0,0,.25],163:[0,.69444,0,0,.76909],167:[.19444,.69444,0,0,.44445],168:[0,.66786,0,0,.5],172:[0,.43056,0,0,.66667],176:[0,.69444,0,0,.75],177:[.08333,.58333,0,0,.77778],182:[.19444,.69444,0,0,.61111],184:[.17014,0,0,0,.44445],198:[0,.68333,0,0,.90278],215:[.08333,.58333,0,0,.77778],216:[.04861,.73194,0,0,.77778],223:[0,.69444,0,0,.5],230:[0,.43056,0,0,.72222],247:[.08333,.58333,0,0,.77778],248:[.09722,.52778,0,0,.5],305:[0,.43056,0,0,.27778],338:[0,.68333,0,0,1.01389],339:[0,.43056,0,0,.77778],567:[.19444,.43056,0,0,.30556],710:[0,.69444,0,0,.5],711:[0,.62847,0,0,.5],713:[0,.56778,0,0,.5],714:[0,.69444,0,0,.5],715:[0,.69444,0,0,.5],728:[0,.69444,0,0,.5],729:[0,.66786,0,0,.27778],730:[0,.69444,0,0,.75],732:[0,.66786,0,0,.5],733:[0,.69444,0,0,.5],915:[0,.68333,0,0,.625],916:[0,.68333,0,0,.83334],920:[0,.68333,0,0,.77778],923:[0,.68333,0,0,.69445],926:[0,.68333,0,0,.66667],928:[0,.68333,0,0,.75],931:[0,.68333,0,0,.72222],933:[0,.68333,0,0,.77778],934:[0,.68333,0,0,.72222],936:[0,.68333,0,0,.77778],937:[0,.68333,0,0,.72222],8211:[0,.43056,.02778,0,.5],8212:[0,.43056,.02778,0,1],8216:[0,.69444,0,0,.27778],8217:[0,.69444,0,0,.27778],8220:[0,.69444,0,0,.5],8221:[0,.69444,0,0,.5],8224:[.19444,.69444,0,0,.44445],8225:[.19444,.69444,0,0,.44445],8230:[0,.123,0,0,1.172],8242:[0,.55556,0,0,.275],8407:[0,.71444,.15382,0,.5],8463:[0,.68889,0,0,.54028],8465:[0,.69444,0,0,.72222],8467:[0,.69444,0,.11111,.41667],8472:[.19444,.43056,0,.11111,.63646],8476:[0,.69444,0,0,.72222],8501:[0,.69444,0,0,.61111],8592:[-.13313,.36687,0,0,1],8593:[.19444,.69444,0,0,.5],8594:[-.13313,.36687,0,0,1],8595:[.19444,.69444,0,0,.5],8596:[-.13313,.36687,0,0,1],8597:[.25,.75,0,0,.5],8598:[.19444,.69444,0,0,1],8599:[.19444,.69444,0,0,1],8600:[.19444,.69444,0,0,1],8601:[.19444,.69444,0,0,1],8614:[.011,.511,0,0,1],8617:[.011,.511,0,0,1.126],8618:[.011,.511,0,0,1.126],8636:[-.13313,.36687,0,0,1],8637:[-.13313,.36687,0,0,1],8640:[-.13313,.36687,0,0,1],8641:[-.13313,.36687,0,0,1],8652:[.011,.671,0,0,1],8656:[-.13313,.36687,0,0,1],8657:[.19444,.69444,0,0,.61111],8658:[-.13313,.36687,0,0,1],8659:[.19444,.69444,0,0,.61111],8660:[-.13313,.36687,0,0,1],8661:[.25,.75,0,0,.61111],8704:[0,.69444,0,0,.55556],8706:[0,.69444,.05556,.08334,.5309],8707:[0,.69444,0,0,.55556],8709:[.05556,.75,0,0,.5],8711:[0,.68333,0,0,.83334],8712:[.0391,.5391,0,0,.66667],8715:[.0391,.5391,0,0,.66667],8722:[.08333,.58333,0,0,.77778],8723:[.08333,.58333,0,0,.77778],8725:[.25,.75,0,0,.5],8726:[.25,.75,0,0,.5],8727:[-.03472,.46528,0,0,.5],8728:[-.05555,.44445,0,0,.5],8729:[-.05555,.44445,0,0,.5],8730:[.2,.8,0,0,.83334],8733:[0,.43056,0,0,.77778],8734:[0,.43056,0,0,1],8736:[0,.69224,0,0,.72222],8739:[.25,.75,0,0,.27778],8741:[.25,.75,0,0,.5],8743:[0,.55556,0,0,.66667],8744:[0,.55556,0,0,.66667],8745:[0,.55556,0,0,.66667],8746:[0,.55556,0,0,.66667],8747:[.19444,.69444,.11111,0,.41667],8764:[-.13313,.36687,0,0,.77778],8768:[.19444,.69444,0,0,.27778],8771:[-.03625,.46375,0,0,.77778],8773:[-.022,.589,0,0,.778],8776:[-.01688,.48312,0,0,.77778],8781:[-.03625,.46375,0,0,.77778],8784:[-.133,.673,0,0,.778],8801:[-.03625,.46375,0,0,.77778],8804:[.13597,.63597,0,0,.77778],8805:[.13597,.63597,0,0,.77778],8810:[.0391,.5391,0,0,1],8811:[.0391,.5391,0,0,1],8826:[.0391,.5391,0,0,.77778],8827:[.0391,.5391,0,0,.77778],8834:[.0391,.5391,0,0,.77778],8835:[.0391,.5391,0,0,.77778],8838:[.13597,.63597,0,0,.77778],8839:[.13597,.63597,0,0,.77778],8846:[0,.55556,0,0,.66667],8849:[.13597,.63597,0,0,.77778],8850:[.13597,.63597,0,0,.77778],8851:[0,.55556,0,0,.66667],8852:[0,.55556,0,0,.66667],8853:[.08333,.58333,0,0,.77778],8854:[.08333,.58333,0,0,.77778],8855:[.08333,.58333,0,0,.77778],8856:[.08333,.58333,0,0,.77778],8857:[.08333,.58333,0,0,.77778],8866:[0,.69444,0,0,.61111],8867:[0,.69444,0,0,.61111],8868:[0,.69444,0,0,.77778],8869:[0,.69444,0,0,.77778],8872:[.249,.75,0,0,.867],8900:[-.05555,.44445,0,0,.5],8901:[-.05555,.44445,0,0,.27778],8902:[-.03472,.46528,0,0,.5],8904:[.005,.505,0,0,.9],8942:[.03,.903,0,0,.278],8943:[-.19,.313,0,0,1.172],8945:[-.1,.823,0,0,1.282],8968:[.25,.75,0,0,.44445],8969:[.25,.75,0,0,.44445],8970:[.25,.75,0,0,.44445],8971:[.25,.75,0,0,.44445],8994:[-.14236,.35764,0,0,1],8995:[-.14236,.35764,0,0,1],9136:[.244,.744,0,0,.412],9137:[.244,.745,0,0,.412],9651:[.19444,.69444,0,0,.88889],9657:[-.03472,.46528,0,0,.5],9661:[.19444,.69444,0,0,.88889],9667:[-.03472,.46528,0,0,.5],9711:[.19444,.69444,0,0,1],9824:[.12963,.69444,0,0,.77778],9825:[.12963,.69444,0,0,.77778],9826:[.12963,.69444,0,0,.77778],9827:[.12963,.69444,0,0,.77778],9837:[0,.75,0,0,.38889],9838:[.19444,.69444,0,0,.38889],9839:[.19444,.69444,0,0,.38889],10216:[.25,.75,0,0,.38889],10217:[.25,.75,0,0,.38889],10222:[.244,.744,0,0,.412],10223:[.244,.745,0,0,.412],10229:[.011,.511,0,0,1.609],10230:[.011,.511,0,0,1.638],10231:[.011,.511,0,0,1.859],10232:[.024,.525,0,0,1.609],10233:[.024,.525,0,0,1.638],10234:[.024,.525,0,0,1.858],10236:[.011,.511,0,0,1.638],10815:[0,.68333,0,0,.75],10927:[.13597,.63597,0,0,.77778],10928:[.13597,.63597,0,0,.77778],57376:[.19444,.69444,0,0,0]},"Math-BoldItalic":{32:[0,0,0,0,.25],48:[0,.44444,0,0,.575],49:[0,.44444,0,0,.575],50:[0,.44444,0,0,.575],51:[.19444,.44444,0,0,.575],52:[.19444,.44444,0,0,.575],53:[.19444,.44444,0,0,.575],54:[0,.64444,0,0,.575],55:[.19444,.44444,0,0,.575],56:[0,.64444,0,0,.575],57:[.19444,.44444,0,0,.575],65:[0,.68611,0,0,.86944],66:[0,.68611,.04835,0,.8664],67:[0,.68611,.06979,0,.81694],68:[0,.68611,.03194,0,.93812],69:[0,.68611,.05451,0,.81007],70:[0,.68611,.15972,0,.68889],71:[0,.68611,0,0,.88673],72:[0,.68611,.08229,0,.98229],73:[0,.68611,.07778,0,.51111],74:[0,.68611,.10069,0,.63125],75:[0,.68611,.06979,0,.97118],76:[0,.68611,0,0,.75555],77:[0,.68611,.11424,0,1.14201],78:[0,.68611,.11424,0,.95034],79:[0,.68611,.03194,0,.83666],80:[0,.68611,.15972,0,.72309],81:[.19444,.68611,0,0,.86861],82:[0,.68611,.00421,0,.87235],83:[0,.68611,.05382,0,.69271],84:[0,.68611,.15972,0,.63663],85:[0,.68611,.11424,0,.80027],86:[0,.68611,.25555,0,.67778],87:[0,.68611,.15972,0,1.09305],88:[0,.68611,.07778,0,.94722],89:[0,.68611,.25555,0,.67458],90:[0,.68611,.06979,0,.77257],97:[0,.44444,0,0,.63287],98:[0,.69444,0,0,.52083],99:[0,.44444,0,0,.51342],100:[0,.69444,0,0,.60972],101:[0,.44444,0,0,.55361],102:[.19444,.69444,.11042,0,.56806],103:[.19444,.44444,.03704,0,.5449],104:[0,.69444,0,0,.66759],105:[0,.69326,0,0,.4048],106:[.19444,.69326,.0622,0,.47083],107:[0,.69444,.01852,0,.6037],108:[0,.69444,.0088,0,.34815],109:[0,.44444,0,0,1.0324],110:[0,.44444,0,0,.71296],111:[0,.44444,0,0,.58472],112:[.19444,.44444,0,0,.60092],113:[.19444,.44444,.03704,0,.54213],114:[0,.44444,.03194,0,.5287],115:[0,.44444,0,0,.53125],116:[0,.63492,0,0,.41528],117:[0,.44444,0,0,.68102],118:[0,.44444,.03704,0,.56666],119:[0,.44444,.02778,0,.83148],120:[0,.44444,0,0,.65903],121:[.19444,.44444,.03704,0,.59028],122:[0,.44444,.04213,0,.55509],160:[0,0,0,0,.25],915:[0,.68611,.15972,0,.65694],916:[0,.68611,0,0,.95833],920:[0,.68611,.03194,0,.86722],923:[0,.68611,0,0,.80555],926:[0,.68611,.07458,0,.84125],928:[0,.68611,.08229,0,.98229],931:[0,.68611,.05451,0,.88507],933:[0,.68611,.15972,0,.67083],934:[0,.68611,0,0,.76666],936:[0,.68611,.11653,0,.71402],937:[0,.68611,.04835,0,.8789],945:[0,.44444,0,0,.76064],946:[.19444,.69444,.03403,0,.65972],947:[.19444,.44444,.06389,0,.59003],948:[0,.69444,.03819,0,.52222],949:[0,.44444,0,0,.52882],950:[.19444,.69444,.06215,0,.50833],951:[.19444,.44444,.03704,0,.6],952:[0,.69444,.03194,0,.5618],953:[0,.44444,0,0,.41204],954:[0,.44444,0,0,.66759],955:[0,.69444,0,0,.67083],956:[.19444,.44444,0,0,.70787],957:[0,.44444,.06898,0,.57685],958:[.19444,.69444,.03021,0,.50833],959:[0,.44444,0,0,.58472],960:[0,.44444,.03704,0,.68241],961:[.19444,.44444,0,0,.6118],962:[.09722,.44444,.07917,0,.42361],963:[0,.44444,.03704,0,.68588],964:[0,.44444,.13472,0,.52083],965:[0,.44444,.03704,0,.63055],966:[.19444,.44444,0,0,.74722],967:[.19444,.44444,0,0,.71805],968:[.19444,.69444,.03704,0,.75833],969:[0,.44444,.03704,0,.71782],977:[0,.69444,0,0,.69155],981:[.19444,.69444,0,0,.7125],982:[0,.44444,.03194,0,.975],1009:[.19444,.44444,0,0,.6118],1013:[0,.44444,0,0,.48333],57649:[0,.44444,0,0,.39352],57911:[.19444,.44444,0,0,.43889]},"Math-Italic":{32:[0,0,0,0,.25],48:[0,.43056,0,0,.5],49:[0,.43056,0,0,.5],50:[0,.43056,0,0,.5],51:[.19444,.43056,0,0,.5],52:[.19444,.43056,0,0,.5],53:[.19444,.43056,0,0,.5],54:[0,.64444,0,0,.5],55:[.19444,.43056,0,0,.5],56:[0,.64444,0,0,.5],57:[.19444,.43056,0,0,.5],65:[0,.68333,0,.13889,.75],66:[0,.68333,.05017,.08334,.75851],67:[0,.68333,.07153,.08334,.71472],68:[0,.68333,.02778,.05556,.82792],69:[0,.68333,.05764,.08334,.7382],70:[0,.68333,.13889,.08334,.64306],71:[0,.68333,0,.08334,.78625],72:[0,.68333,.08125,.05556,.83125],73:[0,.68333,.07847,.11111,.43958],74:[0,.68333,.09618,.16667,.55451],75:[0,.68333,.07153,.05556,.84931],76:[0,.68333,0,.02778,.68056],77:[0,.68333,.10903,.08334,.97014],78:[0,.68333,.10903,.08334,.80347],79:[0,.68333,.02778,.08334,.76278],80:[0,.68333,.13889,.08334,.64201],81:[.19444,.68333,0,.08334,.79056],82:[0,.68333,.00773,.08334,.75929],83:[0,.68333,.05764,.08334,.6132],84:[0,.68333,.13889,.08334,.58438],85:[0,.68333,.10903,.02778,.68278],86:[0,.68333,.22222,0,.58333],87:[0,.68333,.13889,0,.94445],88:[0,.68333,.07847,.08334,.82847],89:[0,.68333,.22222,0,.58056],90:[0,.68333,.07153,.08334,.68264],97:[0,.43056,0,0,.52859],98:[0,.69444,0,0,.42917],99:[0,.43056,0,.05556,.43276],100:[0,.69444,0,.16667,.52049],101:[0,.43056,0,.05556,.46563],102:[.19444,.69444,.10764,.16667,.48959],103:[.19444,.43056,.03588,.02778,.47697],104:[0,.69444,0,0,.57616],105:[0,.65952,0,0,.34451],106:[.19444,.65952,.05724,0,.41181],107:[0,.69444,.03148,0,.5206],108:[0,.69444,.01968,.08334,.29838],109:[0,.43056,0,0,.87801],110:[0,.43056,0,0,.60023],111:[0,.43056,0,.05556,.48472],112:[.19444,.43056,0,.08334,.50313],113:[.19444,.43056,.03588,.08334,.44641],114:[0,.43056,.02778,.05556,.45116],115:[0,.43056,0,.05556,.46875],116:[0,.61508,0,.08334,.36111],117:[0,.43056,0,.02778,.57246],118:[0,.43056,.03588,.02778,.48472],119:[0,.43056,.02691,.08334,.71592],120:[0,.43056,0,.02778,.57153],121:[.19444,.43056,.03588,.05556,.49028],122:[0,.43056,.04398,.05556,.46505],160:[0,0,0,0,.25],915:[0,.68333,.13889,.08334,.61528],916:[0,.68333,0,.16667,.83334],920:[0,.68333,.02778,.08334,.76278],923:[0,.68333,0,.16667,.69445],926:[0,.68333,.07569,.08334,.74236],928:[0,.68333,.08125,.05556,.83125],931:[0,.68333,.05764,.08334,.77986],933:[0,.68333,.13889,.05556,.58333],934:[0,.68333,0,.08334,.66667],936:[0,.68333,.11,.05556,.61222],937:[0,.68333,.05017,.08334,.7724],945:[0,.43056,.0037,.02778,.6397],946:[.19444,.69444,.05278,.08334,.56563],947:[.19444,.43056,.05556,0,.51773],948:[0,.69444,.03785,.05556,.44444],949:[0,.43056,0,.08334,.46632],950:[.19444,.69444,.07378,.08334,.4375],951:[.19444,.43056,.03588,.05556,.49653],952:[0,.69444,.02778,.08334,.46944],953:[0,.43056,0,.05556,.35394],954:[0,.43056,0,0,.57616],955:[0,.69444,0,0,.58334],956:[.19444,.43056,0,.02778,.60255],957:[0,.43056,.06366,.02778,.49398],958:[.19444,.69444,.04601,.11111,.4375],959:[0,.43056,0,.05556,.48472],960:[0,.43056,.03588,0,.57003],961:[.19444,.43056,0,.08334,.51702],962:[.09722,.43056,.07986,.08334,.36285],963:[0,.43056,.03588,0,.57141],964:[0,.43056,.1132,.02778,.43715],965:[0,.43056,.03588,.02778,.54028],966:[.19444,.43056,0,.08334,.65417],967:[.19444,.43056,0,.05556,.62569],968:[.19444,.69444,.03588,.11111,.65139],969:[0,.43056,.03588,0,.62245],977:[0,.69444,0,.08334,.59144],981:[.19444,.69444,0,.08334,.59583],982:[0,.43056,.02778,0,.82813],1009:[.19444,.43056,0,.08334,.51702],1013:[0,.43056,0,.05556,.4059],57649:[0,.43056,0,.02778,.32246],57911:[.19444,.43056,0,.08334,.38403]},"SansSerif-Bold":{32:[0,0,0,0,.25],33:[0,.69444,0,0,.36667],34:[0,.69444,0,0,.55834],35:[.19444,.69444,0,0,.91667],36:[.05556,.75,0,0,.55],37:[.05556,.75,0,0,1.02912],38:[0,.69444,0,0,.83056],39:[0,.69444,0,0,.30556],40:[.25,.75,0,0,.42778],41:[.25,.75,0,0,.42778],42:[0,.75,0,0,.55],43:[.11667,.61667,0,0,.85556],44:[.10556,.13056,0,0,.30556],45:[0,.45833,0,0,.36667],46:[0,.13056,0,0,.30556],47:[.25,.75,0,0,.55],48:[0,.69444,0,0,.55],49:[0,.69444,0,0,.55],50:[0,.69444,0,0,.55],51:[0,.69444,0,0,.55],52:[0,.69444,0,0,.55],53:[0,.69444,0,0,.55],54:[0,.69444,0,0,.55],55:[0,.69444,0,0,.55],56:[0,.69444,0,0,.55],57:[0,.69444,0,0,.55],58:[0,.45833,0,0,.30556],59:[.10556,.45833,0,0,.30556],61:[-.09375,.40625,0,0,.85556],63:[0,.69444,0,0,.51945],64:[0,.69444,0,0,.73334],65:[0,.69444,0,0,.73334],66:[0,.69444,0,0,.73334],67:[0,.69444,0,0,.70278],68:[0,.69444,0,0,.79445],69:[0,.69444,0,0,.64167],70:[0,.69444,0,0,.61111],71:[0,.69444,0,0,.73334],72:[0,.69444,0,0,.79445],73:[0,.69444,0,0,.33056],74:[0,.69444,0,0,.51945],75:[0,.69444,0,0,.76389],76:[0,.69444,0,0,.58056],77:[0,.69444,0,0,.97778],78:[0,.69444,0,0,.79445],79:[0,.69444,0,0,.79445],80:[0,.69444,0,0,.70278],81:[.10556,.69444,0,0,.79445],82:[0,.69444,0,0,.70278],83:[0,.69444,0,0,.61111],84:[0,.69444,0,0,.73334],85:[0,.69444,0,0,.76389],86:[0,.69444,.01528,0,.73334],87:[0,.69444,.01528,0,1.03889],88:[0,.69444,0,0,.73334],89:[0,.69444,.0275,0,.73334],90:[0,.69444,0,0,.67223],91:[.25,.75,0,0,.34306],93:[.25,.75,0,0,.34306],94:[0,.69444,0,0,.55],95:[.35,.10833,.03056,0,.55],97:[0,.45833,0,0,.525],98:[0,.69444,0,0,.56111],99:[0,.45833,0,0,.48889],100:[0,.69444,0,0,.56111],101:[0,.45833,0,0,.51111],102:[0,.69444,.07639,0,.33611],103:[.19444,.45833,.01528,0,.55],104:[0,.69444,0,0,.56111],105:[0,.69444,0,0,.25556],106:[.19444,.69444,0,0,.28611],107:[0,.69444,0,0,.53056],108:[0,.69444,0,0,.25556],109:[0,.45833,0,0,.86667],110:[0,.45833,0,0,.56111],111:[0,.45833,0,0,.55],112:[.19444,.45833,0,0,.56111],113:[.19444,.45833,0,0,.56111],114:[0,.45833,.01528,0,.37222],115:[0,.45833,0,0,.42167],116:[0,.58929,0,0,.40417],117:[0,.45833,0,0,.56111],118:[0,.45833,.01528,0,.5],119:[0,.45833,.01528,0,.74445],120:[0,.45833,0,0,.5],121:[.19444,.45833,.01528,0,.5],122:[0,.45833,0,0,.47639],126:[.35,.34444,0,0,.55],160:[0,0,0,0,.25],168:[0,.69444,0,0,.55],176:[0,.69444,0,0,.73334],180:[0,.69444,0,0,.55],184:[.17014,0,0,0,.48889],305:[0,.45833,0,0,.25556],567:[.19444,.45833,0,0,.28611],710:[0,.69444,0,0,.55],711:[0,.63542,0,0,.55],713:[0,.63778,0,0,.55],728:[0,.69444,0,0,.55],729:[0,.69444,0,0,.30556],730:[0,.69444,0,0,.73334],732:[0,.69444,0,0,.55],733:[0,.69444,0,0,.55],915:[0,.69444,0,0,.58056],916:[0,.69444,0,0,.91667],920:[0,.69444,0,0,.85556],923:[0,.69444,0,0,.67223],926:[0,.69444,0,0,.73334],928:[0,.69444,0,0,.79445],931:[0,.69444,0,0,.79445],933:[0,.69444,0,0,.85556],934:[0,.69444,0,0,.79445],936:[0,.69444,0,0,.85556],937:[0,.69444,0,0,.79445],8211:[0,.45833,.03056,0,.55],8212:[0,.45833,.03056,0,1.10001],8216:[0,.69444,0,0,.30556],8217:[0,.69444,0,0,.30556],8220:[0,.69444,0,0,.55834],8221:[0,.69444,0,0,.55834]},"SansSerif-Italic":{32:[0,0,0,0,.25],33:[0,.69444,.05733,0,.31945],34:[0,.69444,.00316,0,.5],35:[.19444,.69444,.05087,0,.83334],36:[.05556,.75,.11156,0,.5],37:[.05556,.75,.03126,0,.83334],38:[0,.69444,.03058,0,.75834],39:[0,.69444,.07816,0,.27778],40:[.25,.75,.13164,0,.38889],41:[.25,.75,.02536,0,.38889],42:[0,.75,.11775,0,.5],43:[.08333,.58333,.02536,0,.77778],44:[.125,.08333,0,0,.27778],45:[0,.44444,.01946,0,.33333],46:[0,.08333,0,0,.27778],47:[.25,.75,.13164,0,.5],48:[0,.65556,.11156,0,.5],49:[0,.65556,.11156,0,.5],50:[0,.65556,.11156,0,.5],51:[0,.65556,.11156,0,.5],52:[0,.65556,.11156,0,.5],53:[0,.65556,.11156,0,.5],54:[0,.65556,.11156,0,.5],55:[0,.65556,.11156,0,.5],56:[0,.65556,.11156,0,.5],57:[0,.65556,.11156,0,.5],58:[0,.44444,.02502,0,.27778],59:[.125,.44444,.02502,0,.27778],61:[-.13,.37,.05087,0,.77778],63:[0,.69444,.11809,0,.47222],64:[0,.69444,.07555,0,.66667],65:[0,.69444,0,0,.66667],66:[0,.69444,.08293,0,.66667],67:[0,.69444,.11983,0,.63889],68:[0,.69444,.07555,0,.72223],69:[0,.69444,.11983,0,.59722],70:[0,.69444,.13372,0,.56945],71:[0,.69444,.11983,0,.66667],72:[0,.69444,.08094,0,.70834],73:[0,.69444,.13372,0,.27778],74:[0,.69444,.08094,0,.47222],75:[0,.69444,.11983,0,.69445],76:[0,.69444,0,0,.54167],77:[0,.69444,.08094,0,.875],78:[0,.69444,.08094,0,.70834],79:[0,.69444,.07555,0,.73611],80:[0,.69444,.08293,0,.63889],81:[.125,.69444,.07555,0,.73611],82:[0,.69444,.08293,0,.64584],83:[0,.69444,.09205,0,.55556],84:[0,.69444,.13372,0,.68056],85:[0,.69444,.08094,0,.6875],86:[0,.69444,.1615,0,.66667],87:[0,.69444,.1615,0,.94445],88:[0,.69444,.13372,0,.66667],89:[0,.69444,.17261,0,.66667],90:[0,.69444,.11983,0,.61111],91:[.25,.75,.15942,0,.28889],93:[.25,.75,.08719,0,.28889],94:[0,.69444,.0799,0,.5],95:[.35,.09444,.08616,0,.5],97:[0,.44444,.00981,0,.48056],98:[0,.69444,.03057,0,.51667],99:[0,.44444,.08336,0,.44445],100:[0,.69444,.09483,0,.51667],101:[0,.44444,.06778,0,.44445],102:[0,.69444,.21705,0,.30556],103:[.19444,.44444,.10836,0,.5],104:[0,.69444,.01778,0,.51667],105:[0,.67937,.09718,0,.23889],106:[.19444,.67937,.09162,0,.26667],107:[0,.69444,.08336,0,.48889],108:[0,.69444,.09483,0,.23889],109:[0,.44444,.01778,0,.79445],110:[0,.44444,.01778,0,.51667],111:[0,.44444,.06613,0,.5],112:[.19444,.44444,.0389,0,.51667],113:[.19444,.44444,.04169,0,.51667],114:[0,.44444,.10836,0,.34167],115:[0,.44444,.0778,0,.38333],116:[0,.57143,.07225,0,.36111],117:[0,.44444,.04169,0,.51667],118:[0,.44444,.10836,0,.46111],119:[0,.44444,.10836,0,.68334],120:[0,.44444,.09169,0,.46111],121:[.19444,.44444,.10836,0,.46111],122:[0,.44444,.08752,0,.43472],126:[.35,.32659,.08826,0,.5],160:[0,0,0,0,.25],168:[0,.67937,.06385,0,.5],176:[0,.69444,0,0,.73752],184:[.17014,0,0,0,.44445],305:[0,.44444,.04169,0,.23889],567:[.19444,.44444,.04169,0,.26667],710:[0,.69444,.0799,0,.5],711:[0,.63194,.08432,0,.5],713:[0,.60889,.08776,0,.5],714:[0,.69444,.09205,0,.5],715:[0,.69444,0,0,.5],728:[0,.69444,.09483,0,.5],729:[0,.67937,.07774,0,.27778],730:[0,.69444,0,0,.73752],732:[0,.67659,.08826,0,.5],733:[0,.69444,.09205,0,.5],915:[0,.69444,.13372,0,.54167],916:[0,.69444,0,0,.83334],920:[0,.69444,.07555,0,.77778],923:[0,.69444,0,0,.61111],926:[0,.69444,.12816,0,.66667],928:[0,.69444,.08094,0,.70834],931:[0,.69444,.11983,0,.72222],933:[0,.69444,.09031,0,.77778],934:[0,.69444,.04603,0,.72222],936:[0,.69444,.09031,0,.77778],937:[0,.69444,.08293,0,.72222],8211:[0,.44444,.08616,0,.5],8212:[0,.44444,.08616,0,1],8216:[0,.69444,.07816,0,.27778],8217:[0,.69444,.07816,0,.27778],8220:[0,.69444,.14205,0,.5],8221:[0,.69444,.00316,0,.5]},"SansSerif-Regular":{32:[0,0,0,0,.25],33:[0,.69444,0,0,.31945],34:[0,.69444,0,0,.5],35:[.19444,.69444,0,0,.83334],36:[.05556,.75,0,0,.5],37:[.05556,.75,0,0,.83334],38:[0,.69444,0,0,.75834],39:[0,.69444,0,0,.27778],40:[.25,.75,0,0,.38889],41:[.25,.75,0,0,.38889],42:[0,.75,0,0,.5],43:[.08333,.58333,0,0,.77778],44:[.125,.08333,0,0,.27778],45:[0,.44444,0,0,.33333],46:[0,.08333,0,0,.27778],47:[.25,.75,0,0,.5],48:[0,.65556,0,0,.5],49:[0,.65556,0,0,.5],50:[0,.65556,0,0,.5],51:[0,.65556,0,0,.5],52:[0,.65556,0,0,.5],53:[0,.65556,0,0,.5],54:[0,.65556,0,0,.5],55:[0,.65556,0,0,.5],56:[0,.65556,0,0,.5],57:[0,.65556,0,0,.5],58:[0,.44444,0,0,.27778],59:[.125,.44444,0,0,.27778],61:[-.13,.37,0,0,.77778],63:[0,.69444,0,0,.47222],64:[0,.69444,0,0,.66667],65:[0,.69444,0,0,.66667],66:[0,.69444,0,0,.66667],67:[0,.69444,0,0,.63889],68:[0,.69444,0,0,.72223],69:[0,.69444,0,0,.59722],70:[0,.69444,0,0,.56945],71:[0,.69444,0,0,.66667],72:[0,.69444,0,0,.70834],73:[0,.69444,0,0,.27778],74:[0,.69444,0,0,.47222],75:[0,.69444,0,0,.69445],76:[0,.69444,0,0,.54167],77:[0,.69444,0,0,.875],78:[0,.69444,0,0,.70834],79:[0,.69444,0,0,.73611],80:[0,.69444,0,0,.63889],81:[.125,.69444,0,0,.73611],82:[0,.69444,0,0,.64584],83:[0,.69444,0,0,.55556],84:[0,.69444,0,0,.68056],85:[0,.69444,0,0,.6875],86:[0,.69444,.01389,0,.66667],87:[0,.69444,.01389,0,.94445],88:[0,.69444,0,0,.66667],89:[0,.69444,.025,0,.66667],90:[0,.69444,0,0,.61111],91:[.25,.75,0,0,.28889],93:[.25,.75,0,0,.28889],94:[0,.69444,0,0,.5],95:[.35,.09444,.02778,0,.5],97:[0,.44444,0,0,.48056],98:[0,.69444,0,0,.51667],99:[0,.44444,0,0,.44445],100:[0,.69444,0,0,.51667],101:[0,.44444,0,0,.44445],102:[0,.69444,.06944,0,.30556],103:[.19444,.44444,.01389,0,.5],104:[0,.69444,0,0,.51667],105:[0,.67937,0,0,.23889],106:[.19444,.67937,0,0,.26667],107:[0,.69444,0,0,.48889],108:[0,.69444,0,0,.23889],109:[0,.44444,0,0,.79445],110:[0,.44444,0,0,.51667],111:[0,.44444,0,0,.5],112:[.19444,.44444,0,0,.51667],113:[.19444,.44444,0,0,.51667],114:[0,.44444,.01389,0,.34167],115:[0,.44444,0,0,.38333],116:[0,.57143,0,0,.36111],117:[0,.44444,0,0,.51667],118:[0,.44444,.01389,0,.46111],119:[0,.44444,.01389,0,.68334],120:[0,.44444,0,0,.46111],121:[.19444,.44444,.01389,0,.46111],122:[0,.44444,0,0,.43472],126:[.35,.32659,0,0,.5],160:[0,0,0,0,.25],168:[0,.67937,0,0,.5],176:[0,.69444,0,0,.66667],184:[.17014,0,0,0,.44445],305:[0,.44444,0,0,.23889],567:[.19444,.44444,0,0,.26667],710:[0,.69444,0,0,.5],711:[0,.63194,0,0,.5],713:[0,.60889,0,0,.5],714:[0,.69444,0,0,.5],715:[0,.69444,0,0,.5],728:[0,.69444,0,0,.5],729:[0,.67937,0,0,.27778],730:[0,.69444,0,0,.66667],732:[0,.67659,0,0,.5],733:[0,.69444,0,0,.5],915:[0,.69444,0,0,.54167],916:[0,.69444,0,0,.83334],920:[0,.69444,0,0,.77778],923:[0,.69444,0,0,.61111],926:[0,.69444,0,0,.66667],928:[0,.69444,0,0,.70834],931:[0,.69444,0,0,.72222],933:[0,.69444,0,0,.77778],934:[0,.69444,0,0,.72222],936:[0,.69444,0,0,.77778],937:[0,.69444,0,0,.72222],8211:[0,.44444,.02778,0,.5],8212:[0,.44444,.02778,0,1],8216:[0,.69444,0,0,.27778],8217:[0,.69444,0,0,.27778],8220:[0,.69444,0,0,.5],8221:[0,.69444,0,0,.5]},"Script-Regular":{32:[0,0,0,0,.25],65:[0,.7,.22925,0,.80253],66:[0,.7,.04087,0,.90757],67:[0,.7,.1689,0,.66619],68:[0,.7,.09371,0,.77443],69:[0,.7,.18583,0,.56162],70:[0,.7,.13634,0,.89544],71:[0,.7,.17322,0,.60961],72:[0,.7,.29694,0,.96919],73:[0,.7,.19189,0,.80907],74:[.27778,.7,.19189,0,1.05159],75:[0,.7,.31259,0,.91364],76:[0,.7,.19189,0,.87373],77:[0,.7,.15981,0,1.08031],78:[0,.7,.3525,0,.9015],79:[0,.7,.08078,0,.73787],80:[0,.7,.08078,0,1.01262],81:[0,.7,.03305,0,.88282],82:[0,.7,.06259,0,.85],83:[0,.7,.19189,0,.86767],84:[0,.7,.29087,0,.74697],85:[0,.7,.25815,0,.79996],86:[0,.7,.27523,0,.62204],87:[0,.7,.27523,0,.80532],88:[0,.7,.26006,0,.94445],89:[0,.7,.2939,0,.70961],90:[0,.7,.24037,0,.8212],160:[0,0,0,0,.25]},"Size1-Regular":{32:[0,0,0,0,.25],40:[.35001,.85,0,0,.45834],41:[.35001,.85,0,0,.45834],47:[.35001,.85,0,0,.57778],91:[.35001,.85,0,0,.41667],92:[.35001,.85,0,0,.57778],93:[.35001,.85,0,0,.41667],123:[.35001,.85,0,0,.58334],125:[.35001,.85,0,0,.58334],160:[0,0,0,0,.25],710:[0,.72222,0,0,.55556],732:[0,.72222,0,0,.55556],770:[0,.72222,0,0,.55556],771:[0,.72222,0,0,.55556],8214:[-99e-5,.601,0,0,.77778],8593:[1e-5,.6,0,0,.66667],8595:[1e-5,.6,0,0,.66667],8657:[1e-5,.6,0,0,.77778],8659:[1e-5,.6,0,0,.77778],8719:[.25001,.75,0,0,.94445],8720:[.25001,.75,0,0,.94445],8721:[.25001,.75,0,0,1.05556],8730:[.35001,.85,0,0,1],8739:[-.00599,.606,0,0,.33333],8741:[-.00599,.606,0,0,.55556],8747:[.30612,.805,.19445,0,.47222],8748:[.306,.805,.19445,0,.47222],8749:[.306,.805,.19445,0,.47222],8750:[.30612,.805,.19445,0,.47222],8896:[.25001,.75,0,0,.83334],8897:[.25001,.75,0,0,.83334],8898:[.25001,.75,0,0,.83334],8899:[.25001,.75,0,0,.83334],8968:[.35001,.85,0,0,.47222],8969:[.35001,.85,0,0,.47222],8970:[.35001,.85,0,0,.47222],8971:[.35001,.85,0,0,.47222],9168:[-99e-5,.601,0,0,.66667],10216:[.35001,.85,0,0,.47222],10217:[.35001,.85,0,0,.47222],10752:[.25001,.75,0,0,1.11111],10753:[.25001,.75,0,0,1.11111],10754:[.25001,.75,0,0,1.11111],10756:[.25001,.75,0,0,.83334],10758:[.25001,.75,0,0,.83334]},"Size2-Regular":{32:[0,0,0,0,.25],40:[.65002,1.15,0,0,.59722],41:[.65002,1.15,0,0,.59722],47:[.65002,1.15,0,0,.81111],91:[.65002,1.15,0,0,.47222],92:[.65002,1.15,0,0,.81111],93:[.65002,1.15,0,0,.47222],123:[.65002,1.15,0,0,.66667],125:[.65002,1.15,0,0,.66667],160:[0,0,0,0,.25],710:[0,.75,0,0,1],732:[0,.75,0,0,1],770:[0,.75,0,0,1],771:[0,.75,0,0,1],8719:[.55001,1.05,0,0,1.27778],8720:[.55001,1.05,0,0,1.27778],8721:[.55001,1.05,0,0,1.44445],8730:[.65002,1.15,0,0,1],8747:[.86225,1.36,.44445,0,.55556],8748:[.862,1.36,.44445,0,.55556],8749:[.862,1.36,.44445,0,.55556],8750:[.86225,1.36,.44445,0,.55556],8896:[.55001,1.05,0,0,1.11111],8897:[.55001,1.05,0,0,1.11111],8898:[.55001,1.05,0,0,1.11111],8899:[.55001,1.05,0,0,1.11111],8968:[.65002,1.15,0,0,.52778],8969:[.65002,1.15,0,0,.52778],8970:[.65002,1.15,0,0,.52778],8971:[.65002,1.15,0,0,.52778],10216:[.65002,1.15,0,0,.61111],10217:[.65002,1.15,0,0,.61111],10752:[.55001,1.05,0,0,1.51112],10753:[.55001,1.05,0,0,1.51112],10754:[.55001,1.05,0,0,1.51112],10756:[.55001,1.05,0,0,1.11111],10758:[.55001,1.05,0,0,1.11111]},"Size3-Regular":{32:[0,0,0,0,.25],40:[.95003,1.45,0,0,.73611],41:[.95003,1.45,0,0,.73611],47:[.95003,1.45,0,0,1.04445],91:[.95003,1.45,0,0,.52778],92:[.95003,1.45,0,0,1.04445],93:[.95003,1.45,0,0,.52778],123:[.95003,1.45,0,0,.75],125:[.95003,1.45,0,0,.75],160:[0,0,0,0,.25],710:[0,.75,0,0,1.44445],732:[0,.75,0,0,1.44445],770:[0,.75,0,0,1.44445],771:[0,.75,0,0,1.44445],8730:[.95003,1.45,0,0,1],8968:[.95003,1.45,0,0,.58334],8969:[.95003,1.45,0,0,.58334],8970:[.95003,1.45,0,0,.58334],8971:[.95003,1.45,0,0,.58334],10216:[.95003,1.45,0,0,.75],10217:[.95003,1.45,0,0,.75]},"Size4-Regular":{32:[0,0,0,0,.25],40:[1.25003,1.75,0,0,.79167],41:[1.25003,1.75,0,0,.79167],47:[1.25003,1.75,0,0,1.27778],91:[1.25003,1.75,0,0,.58334],92:[1.25003,1.75,0,0,1.27778],93:[1.25003,1.75,0,0,.58334],123:[1.25003,1.75,0,0,.80556],125:[1.25003,1.75,0,0,.80556],160:[0,0,0,0,.25],710:[0,.825,0,0,1.8889],732:[0,.825,0,0,1.8889],770:[0,.825,0,0,1.8889],771:[0,.825,0,0,1.8889],8730:[1.25003,1.75,0,0,1],8968:[1.25003,1.75,0,0,.63889],8969:[1.25003,1.75,0,0,.63889],8970:[1.25003,1.75,0,0,.63889],8971:[1.25003,1.75,0,0,.63889],9115:[.64502,1.155,0,0,.875],9116:[1e-5,.6,0,0,.875],9117:[.64502,1.155,0,0,.875],9118:[.64502,1.155,0,0,.875],9119:[1e-5,.6,0,0,.875],9120:[.64502,1.155,0,0,.875],9121:[.64502,1.155,0,0,.66667],9122:[-99e-5,.601,0,0,.66667],9123:[.64502,1.155,0,0,.66667],9124:[.64502,1.155,0,0,.66667],9125:[-99e-5,.601,0,0,.66667],9126:[.64502,1.155,0,0,.66667],9127:[1e-5,.9,0,0,.88889],9128:[.65002,1.15,0,0,.88889],9129:[.90001,0,0,0,.88889],9130:[0,.3,0,0,.88889],9131:[1e-5,.9,0,0,.88889],9132:[.65002,1.15,0,0,.88889],9133:[.90001,0,0,0,.88889],9143:[.88502,.915,0,0,1.05556],10216:[1.25003,1.75,0,0,.80556],10217:[1.25003,1.75,0,0,.80556],57344:[-.00499,.605,0,0,1.05556],57345:[-.00499,.605,0,0,1.05556],57680:[0,.12,0,0,.45],57681:[0,.12,0,0,.45],57682:[0,.12,0,0,.45],57683:[0,.12,0,0,.45]},"Typewriter-Regular":{32:[0,0,0,0,.525],33:[0,.61111,0,0,.525],34:[0,.61111,0,0,.525],35:[0,.61111,0,0,.525],36:[.08333,.69444,0,0,.525],37:[.08333,.69444,0,0,.525],38:[0,.61111,0,0,.525],39:[0,.61111,0,0,.525],40:[.08333,.69444,0,0,.525],41:[.08333,.69444,0,0,.525],42:[0,.52083,0,0,.525],43:[-.08056,.53055,0,0,.525],44:[.13889,.125,0,0,.525],45:[-.08056,.53055,0,0,.525],46:[0,.125,0,0,.525],47:[.08333,.69444,0,0,.525],48:[0,.61111,0,0,.525],49:[0,.61111,0,0,.525],50:[0,.61111,0,0,.525],51:[0,.61111,0,0,.525],52:[0,.61111,0,0,.525],53:[0,.61111,0,0,.525],54:[0,.61111,0,0,.525],55:[0,.61111,0,0,.525],56:[0,.61111,0,0,.525],57:[0,.61111,0,0,.525],58:[0,.43056,0,0,.525],59:[.13889,.43056,0,0,.525],60:[-.05556,.55556,0,0,.525],61:[-.19549,.41562,0,0,.525],62:[-.05556,.55556,0,0,.525],63:[0,.61111,0,0,.525],64:[0,.61111,0,0,.525],65:[0,.61111,0,0,.525],66:[0,.61111,0,0,.525],67:[0,.61111,0,0,.525],68:[0,.61111,0,0,.525],69:[0,.61111,0,0,.525],70:[0,.61111,0,0,.525],71:[0,.61111,0,0,.525],72:[0,.61111,0,0,.525],73:[0,.61111,0,0,.525],74:[0,.61111,0,0,.525],75:[0,.61111,0,0,.525],76:[0,.61111,0,0,.525],77:[0,.61111,0,0,.525],78:[0,.61111,0,0,.525],79:[0,.61111,0,0,.525],80:[0,.61111,0,0,.525],81:[.13889,.61111,0,0,.525],82:[0,.61111,0,0,.525],83:[0,.61111,0,0,.525],84:[0,.61111,0,0,.525],85:[0,.61111,0,0,.525],86:[0,.61111,0,0,.525],87:[0,.61111,0,0,.525],88:[0,.61111,0,0,.525],89:[0,.61111,0,0,.525],90:[0,.61111,0,0,.525],91:[.08333,.69444,0,0,.525],92:[.08333,.69444,0,0,.525],93:[.08333,.69444,0,0,.525],94:[0,.61111,0,0,.525],95:[.09514,0,0,0,.525],96:[0,.61111,0,0,.525],97:[0,.43056,0,0,.525],98:[0,.61111,0,0,.525],99:[0,.43056,0,0,.525],100:[0,.61111,0,0,.525],101:[0,.43056,0,0,.525],102:[0,.61111,0,0,.525],103:[.22222,.43056,0,0,.525],104:[0,.61111,0,0,.525],105:[0,.61111,0,0,.525],106:[.22222,.61111,0,0,.525],107:[0,.61111,0,0,.525],108:[0,.61111,0,0,.525],109:[0,.43056,0,0,.525],110:[0,.43056,0,0,.525],111:[0,.43056,0,0,.525],112:[.22222,.43056,0,0,.525],113:[.22222,.43056,0,0,.525],114:[0,.43056,0,0,.525],115:[0,.43056,0,0,.525],116:[0,.55358,0,0,.525],117:[0,.43056,0,0,.525],118:[0,.43056,0,0,.525],119:[0,.43056,0,0,.525],120:[0,.43056,0,0,.525],121:[.22222,.43056,0,0,.525],122:[0,.43056,0,0,.525],123:[.08333,.69444,0,0,.525],124:[.08333,.69444,0,0,.525],125:[.08333,.69444,0,0,.525],126:[0,.61111,0,0,.525],127:[0,.61111,0,0,.525],160:[0,0,0,0,.525],176:[0,.61111,0,0,.525],184:[.19445,0,0,0,.525],305:[0,.43056,0,0,.525],567:[.22222,.43056,0,0,.525],711:[0,.56597,0,0,.525],713:[0,.56555,0,0,.525],714:[0,.61111,0,0,.525],715:[0,.61111,0,0,.525],728:[0,.61111,0,0,.525],730:[0,.61111,0,0,.525],770:[0,.61111,0,0,.525],771:[0,.61111,0,0,.525],776:[0,.61111,0,0,.525],915:[0,.61111,0,0,.525],916:[0,.61111,0,0,.525],920:[0,.61111,0,0,.525],923:[0,.61111,0,0,.525],926:[0,.61111,0,0,.525],928:[0,.61111,0,0,.525],931:[0,.61111,0,0,.525],933:[0,.61111,0,0,.525],934:[0,.61111,0,0,.525],936:[0,.61111,0,0,.525],937:[0,.61111,0,0,.525],8216:[0,.61111,0,0,.525],8217:[0,.61111,0,0,.525],8242:[0,.61111,0,0,.525],9251:[.11111,.21944,0,0,.525]}},_r={slant:[.25,.25,.25],space:[0,0,0],stretch:[0,0,0],shrink:[0,0,0],xHeight:[.431,.431,.431],quad:[1,1.171,1.472],extraSpace:[0,0,0],num1:[.677,.732,.925],num2:[.394,.384,.387],num3:[.444,.471,.504],denom1:[.686,.752,1.025],denom2:[.345,.344,.532],sup1:[.413,.503,.504],sup2:[.363,.431,.404],sup3:[.289,.286,.294],sub1:[.15,.143,.2],sub2:[.247,.286,.4],supDrop:[.386,.353,.494],subDrop:[.05,.071,.1],delim1:[2.39,1.7,1.98],delim2:[1.01,1.157,1.42],axisHeight:[.25,.25,.25],defaultRuleThickness:[.04,.049,.049],bigOpSpacing1:[.111,.111,.111],bigOpSpacing2:[.166,.166,.166],bigOpSpacing3:[.2,.2,.2],bigOpSpacing4:[.6,.611,.611],bigOpSpacing5:[.1,.143,.143],sqrtRuleThickness:[.04,.04,.04],ptPerEm:[10,10,10],doubleRuleSep:[.2,.2,.2],arrayRuleWidth:[.04,.04,.04],fboxsep:[.3,.3,.3],fboxrule:[.04,.04,.04]},za={Å:"A",Ð:"D",Þ:"o",å:"a",ð:"d",þ:"o",А:"A",Б:"B",В:"B",Г:"F",Д:"A",Е:"E",Ж:"K",З:"3",И:"N",Й:"N",К:"K",Л:"N",М:"M",Н:"H",О:"O",П:"N",Р:"P",С:"C",Т:"T",У:"y",Ф:"O",Х:"X",Ц:"U",Ч:"h",Ш:"W",Щ:"W",Ъ:"B",Ы:"X",Ь:"B",Э:"3",Ю:"X",Я:"R",а:"a",б:"b",в:"a",г:"r",д:"y",е:"e",ж:"m",з:"e",и:"n",й:"n",к:"n",л:"n",м:"m",н:"n",о:"o",п:"n",р:"p",с:"c",т:"o",у:"y",ф:"b",х:"x",ц:"n",ч:"n",ш:"w",щ:"w",ъ:"a",ы:"m",ь:"a",э:"e",ю:"m",я:"r"};function h2(e,t){st[e]=t}function fi(e,t,r){if(!st[t])throw new Error("Font metrics not found for font: "+t+".");var n=e.charCodeAt(0),i=st[t][n];if(!i&&e[0]in za&&(n=za[e[0]].charCodeAt(0),i=st[t][n]),!i&&r==="text"&&Ms(n)&&(i=st[t][77]),i)return{depth:i[0],height:i[1],italic:i[2],skew:i[3],width:i[4]}}var Qn={};function m2(e){var t;if(e>=5?t=0:e>=3?t=1:t=2,!Qn[t]){var r=Qn[t]={cssEmPerMu:_r.quad[t]/18};for(var n in _r)_r.hasOwnProperty(n)&&(r[n]=_r[n][t])}return Qn[t]}var de={math:{},text:{}};function c(e,t,r,n,i,a){de[e][i]={font:t,group:r,replace:n},a&&n&&(de[e][n]=de[e][i])}var f="math",B="text",g="main",b="ams",ge="accent-token",W="bin",Oe="close",or="inner",Z="mathord",Ae="op-token",Ye="open",Br="punct",x="rel",wt="spacing",T="textord";c(f,g,x,"≡","\\equiv",!0);c(f,g,x,"≺","\\prec",!0);c(f,g,x,"≻","\\succ",!0);c(f,g,x,"∼","\\sim",!0);c(f,g,x,"⊥","\\perp");c(f,g,x,"⪯","\\preceq",!0);c(f,g,x,"⪰","\\succeq",!0);c(f,g,x,"≃","\\simeq",!0);c(f,g,x,"∣","\\mid",!0);c(f,g,x,"≪","\\ll",!0);c(f,g,x,"≫","\\gg",!0);c(f,g,x,"≍","\\asymp",!0);c(f,g,x,"∥","\\parallel");c(f,g,x,"⋈","\\bowtie",!0);c(f,g,x,"⌣","\\smile",!0);c(f,g,x,"⊑","\\sqsubseteq",!0);c(f,g,x,"⊒","\\sqsupseteq",!0);c(f,g,x,"≐","\\doteq",!0);c(f,g,x,"⌢","\\frown",!0);c(f,g,x,"∋","\\ni",!0);c(f,g,x,"∝","\\propto",!0);c(f,g,x,"⊢","\\vdash",!0);c(f,g,x,"⊣","\\dashv",!0);c(f,g,x,"∋","\\owns");c(f,g,Br,".","\\ldotp");c(f,g,Br,"⋅","\\cdotp");c(f,g,Br,"⋅","·");c(B,g,T,"⋅","·");c(f,g,T,"#","\\#");c(B,g,T,"#","\\#");c(f,g,T,"&","\\&");c(B,g,T,"&","\\&");c(f,g,T,"ℵ","\\aleph",!0);c(f,g,T,"∀","\\forall",!0);c(f,g,T,"ℏ","\\hbar",!0);c(f,g,T,"∃","\\exists",!0);c(f,g,T,"∇","\\nabla",!0);c(f,g,T,"♭","\\flat",!0);c(f,g,T,"ℓ","\\ell",!0);c(f,g,T,"♮","\\natural",!0);c(f,g,T,"♣","\\clubsuit",!0);c(f,g,T,"℘","\\wp",!0);c(f,g,T,"♯","\\sharp",!0);c(f,g,T,"♢","\\diamondsuit",!0);c(f,g,T,"ℜ","\\Re",!0);c(f,g,T,"♡","\\heartsuit",!0);c(f,g,T,"ℑ","\\Im",!0);c(f,g,T,"♠","\\spadesuit",!0);c(f,g,T,"§","\\S",!0);c(B,g,T,"§","\\S");c(f,g,T,"¶","\\P",!0);c(B,g,T,"¶","\\P");c(f,g,T,"†","\\dag");c(B,g,T,"†","\\dag");c(B,g,T,"†","\\textdagger");c(f,g,T,"‡","\\ddag");c(B,g,T,"‡","\\ddag");c(B,g,T,"‡","\\textdaggerdbl");c(f,g,Oe,"⎱","\\rmoustache",!0);c(f,g,Ye,"⎰","\\lmoustache",!0);c(f,g,Oe,"⟯","\\rgroup",!0);c(f,g,Ye,"⟮","\\lgroup",!0);c(f,g,W,"∓","\\mp",!0);c(f,g,W,"⊖","\\ominus",!0);c(f,g,W,"⊎","\\uplus",!0);c(f,g,W,"⊓","\\sqcap",!0);c(f,g,W,"∗","\\ast");c(f,g,W,"⊔","\\sqcup",!0);c(f,g,W,"◯","\\bigcirc",!0);c(f,g,W,"∙","\\bullet",!0);c(f,g,W,"‡","\\ddagger");c(f,g,W,"≀","\\wr",!0);c(f,g,W,"⨿","\\amalg");c(f,g,W,"&","\\And");c(f,g,x,"⟵","\\longleftarrow",!0);c(f,g,x,"⇐","\\Leftarrow",!0);c(f,g,x,"⟸","\\Longleftarrow",!0);c(f,g,x,"⟶","\\longrightarrow",!0);c(f,g,x,"⇒","\\Rightarrow",!0);c(f,g,x,"⟹","\\Longrightarrow",!0);c(f,g,x,"↔","\\leftrightarrow",!0);c(f,g,x,"⟷","\\longleftrightarrow",!0);c(f,g,x,"⇔","\\Leftrightarrow",!0);c(f,g,x,"⟺","\\Longleftrightarrow",!0);c(f,g,x,"↦","\\mapsto",!0);c(f,g,x,"⟼","\\longmapsto",!0);c(f,g,x,"↗","\\nearrow",!0);c(f,g,x,"↩","\\hookleftarrow",!0);c(f,g,x,"↪","\\hookrightarrow",!0);c(f,g,x,"↘","\\searrow",!0);c(f,g,x,"↼","\\leftharpoonup",!0);c(f,g,x,"⇀","\\rightharpoonup",!0);c(f,g,x,"↙","\\swarrow",!0);c(f,g,x,"↽","\\leftharpoondown",!0);c(f,g,x,"⇁","\\rightharpoondown",!0);c(f,g,x,"↖","\\nwarrow",!0);c(f,g,x,"⇌","\\rightleftharpoons",!0);c(f,b,x,"≮","\\nless",!0);c(f,b,x,"","\\@nleqslant");c(f,b,x,"","\\@nleqq");c(f,b,x,"⪇","\\lneq",!0);c(f,b,x,"≨","\\lneqq",!0);c(f,b,x,"","\\@lvertneqq");c(f,b,x,"⋦","\\lnsim",!0);c(f,b,x,"⪉","\\lnapprox",!0);c(f,b,x,"⊀","\\nprec",!0);c(f,b,x,"⋠","\\npreceq",!0);c(f,b,x,"⋨","\\precnsim",!0);c(f,b,x,"⪹","\\precnapprox",!0);c(f,b,x,"≁","\\nsim",!0);c(f,b,x,"","\\@nshortmid");c(f,b,x,"∤","\\nmid",!0);c(f,b,x,"⊬","\\nvdash",!0);c(f,b,x,"⊭","\\nvDash",!0);c(f,b,x,"⋪","\\ntriangleleft");c(f,b,x,"⋬","\\ntrianglelefteq",!0);c(f,b,x,"⊊","\\subsetneq",!0);c(f,b,x,"","\\@varsubsetneq");c(f,b,x,"⫋","\\subsetneqq",!0);c(f,b,x,"","\\@varsubsetneqq");c(f,b,x,"≯","\\ngtr",!0);c(f,b,x,"","\\@ngeqslant");c(f,b,x,"","\\@ngeqq");c(f,b,x,"⪈","\\gneq",!0);c(f,b,x,"≩","\\gneqq",!0);c(f,b,x,"","\\@gvertneqq");c(f,b,x,"⋧","\\gnsim",!0);c(f,b,x,"⪊","\\gnapprox",!0);c(f,b,x,"⊁","\\nsucc",!0);c(f,b,x,"⋡","\\nsucceq",!0);c(f,b,x,"⋩","\\succnsim",!0);c(f,b,x,"⪺","\\succnapprox",!0);c(f,b,x,"≆","\\ncong",!0);c(f,b,x,"","\\@nshortparallel");c(f,b,x,"∦","\\nparallel",!0);c(f,b,x,"⊯","\\nVDash",!0);c(f,b,x,"⋫","\\ntriangleright");c(f,b,x,"⋭","\\ntrianglerighteq",!0);c(f,b,x,"","\\@nsupseteqq");c(f,b,x,"⊋","\\supsetneq",!0);c(f,b,x,"","\\@varsupsetneq");c(f,b,x,"⫌","\\supsetneqq",!0);c(f,b,x,"","\\@varsupsetneqq");c(f,b,x,"⊮","\\nVdash",!0);c(f,b,x,"⪵","\\precneqq",!0);c(f,b,x,"⪶","\\succneqq",!0);c(f,b,x,"","\\@nsubseteqq");c(f,b,W,"⊴","\\unlhd");c(f,b,W,"⊵","\\unrhd");c(f,b,x,"↚","\\nleftarrow",!0);c(f,b,x,"↛","\\nrightarrow",!0);c(f,b,x,"⇍","\\nLeftarrow",!0);c(f,b,x,"⇏","\\nRightarrow",!0);c(f,b,x,"↮","\\nleftrightarrow",!0);c(f,b,x,"⇎","\\nLeftrightarrow",!0);c(f,b,x,"△","\\vartriangle");c(f,b,T,"ℏ","\\hslash");c(f,b,T,"▽","\\triangledown");c(f,b,T,"◊","\\lozenge");c(f,b,T,"Ⓢ","\\circledS");c(f,b,T,"®","\\circledR");c(B,b,T,"®","\\circledR");c(f,b,T,"∡","\\measuredangle",!0);c(f,b,T,"∄","\\nexists");c(f,b,T,"℧","\\mho");c(f,b,T,"Ⅎ","\\Finv",!0);c(f,b,T,"⅁","\\Game",!0);c(f,b,T,"‵","\\backprime");c(f,b,T,"▲","\\blacktriangle");c(f,b,T,"▼","\\blacktriangledown");c(f,b,T,"■","\\blacksquare");c(f,b,T,"⧫","\\blacklozenge");c(f,b,T,"★","\\bigstar");c(f,b,T,"∢","\\sphericalangle",!0);c(f,b,T,"∁","\\complement",!0);c(f,b,T,"ð","\\eth",!0);c(B,g,T,"ð","ð");c(f,b,T,"╱","\\diagup");c(f,b,T,"╲","\\diagdown");c(f,b,T,"□","\\square");c(f,b,T,"□","\\Box");c(f,b,T,"◊","\\Diamond");c(f,b,T,"¥","\\yen",!0);c(B,b,T,"¥","\\yen",!0);c(f,b,T,"✓","\\checkmark",!0);c(B,b,T,"✓","\\checkmark");c(f,b,T,"ℶ","\\beth",!0);c(f,b,T,"ℸ","\\daleth",!0);c(f,b,T,"ℷ","\\gimel",!0);c(f,b,T,"ϝ","\\digamma",!0);c(f,b,T,"ϰ","\\varkappa");c(f,b,Ye,"┌","\\@ulcorner",!0);c(f,b,Oe,"┐","\\@urcorner",!0);c(f,b,Ye,"└","\\@llcorner",!0);c(f,b,Oe,"┘","\\@lrcorner",!0);c(f,b,x,"≦","\\leqq",!0);c(f,b,x,"⩽","\\leqslant",!0);c(f,b,x,"⪕","\\eqslantless",!0);c(f,b,x,"≲","\\lesssim",!0);c(f,b,x,"⪅","\\lessapprox",!0);c(f,b,x,"≊","\\approxeq",!0);c(f,b,W,"⋖","\\lessdot");c(f,b,x,"⋘","\\lll",!0);c(f,b,x,"≶","\\lessgtr",!0);c(f,b,x,"⋚","\\lesseqgtr",!0);c(f,b,x,"⪋","\\lesseqqgtr",!0);c(f,b,x,"≑","\\doteqdot");c(f,b,x,"≓","\\risingdotseq",!0);c(f,b,x,"≒","\\fallingdotseq",!0);c(f,b,x,"∽","\\backsim",!0);c(f,b,x,"⋍","\\backsimeq",!0);c(f,b,x,"⫅","\\subseteqq",!0);c(f,b,x,"⋐","\\Subset",!0);c(f,b,x,"⊏","\\sqsubset",!0);c(f,b,x,"≼","\\preccurlyeq",!0);c(f,b,x,"⋞","\\curlyeqprec",!0);c(f,b,x,"≾","\\precsim",!0);c(f,b,x,"⪷","\\precapprox",!0);c(f,b,x,"⊲","\\vartriangleleft");c(f,b,x,"⊴","\\trianglelefteq");c(f,b,x,"⊨","\\vDash",!0);c(f,b,x,"⊪","\\Vvdash",!0);c(f,b,x,"⌣","\\smallsmile");c(f,b,x,"⌢","\\smallfrown");c(f,b,x,"≏","\\bumpeq",!0);c(f,b,x,"≎","\\Bumpeq",!0);c(f,b,x,"≧","\\geqq",!0);c(f,b,x,"⩾","\\geqslant",!0);c(f,b,x,"⪖","\\eqslantgtr",!0);c(f,b,x,"≳","\\gtrsim",!0);c(f,b,x,"⪆","\\gtrapprox",!0);c(f,b,W,"⋗","\\gtrdot");c(f,b,x,"⋙","\\ggg",!0);c(f,b,x,"≷","\\gtrless",!0);c(f,b,x,"⋛","\\gtreqless",!0);c(f,b,x,"⪌","\\gtreqqless",!0);c(f,b,x,"≖","\\eqcirc",!0);c(f,b,x,"≗","\\circeq",!0);c(f,b,x,"≜","\\triangleq",!0);c(f,b,x,"∼","\\thicksim");c(f,b,x,"≈","\\thickapprox");c(f,b,x,"⫆","\\supseteqq",!0);c(f,b,x,"⋑","\\Supset",!0);c(f,b,x,"⊐","\\sqsupset",!0);c(f,b,x,"≽","\\succcurlyeq",!0);c(f,b,x,"⋟","\\curlyeqsucc",!0);c(f,b,x,"≿","\\succsim",!0);c(f,b,x,"⪸","\\succapprox",!0);c(f,b,x,"⊳","\\vartriangleright");c(f,b,x,"⊵","\\trianglerighteq");c(f,b,x,"⊩","\\Vdash",!0);c(f,b,x,"∣","\\shortmid");c(f,b,x,"∥","\\shortparallel");c(f,b,x,"≬","\\between",!0);c(f,b,x,"⋔","\\pitchfork",!0);c(f,b,x,"∝","\\varpropto");c(f,b,x,"◀","\\blacktriangleleft");c(f,b,x,"∴","\\therefore",!0);c(f,b,x,"∍","\\backepsilon");c(f,b,x,"▶","\\blacktriangleright");c(f,b,x,"∵","\\because",!0);c(f,b,x,"⋘","\\llless");c(f,b,x,"⋙","\\gggtr");c(f,b,W,"⊲","\\lhd");c(f,b,W,"⊳","\\rhd");c(f,b,x,"≂","\\eqsim",!0);c(f,g,x,"⋈","\\Join");c(f,b,x,"≑","\\Doteq",!0);c(f,b,W,"∔","\\dotplus",!0);c(f,b,W,"∖","\\smallsetminus");c(f,b,W,"⋒","\\Cap",!0);c(f,b,W,"⋓","\\Cup",!0);c(f,b,W,"⩞","\\doublebarwedge",!0);c(f,b,W,"⊟","\\boxminus",!0);c(f,b,W,"⊞","\\boxplus",!0);c(f,b,W,"⋇","\\divideontimes",!0);c(f,b,W,"⋉","\\ltimes",!0);c(f,b,W,"⋊","\\rtimes",!0);c(f,b,W,"⋋","\\leftthreetimes",!0);c(f,b,W,"⋌","\\rightthreetimes",!0);c(f,b,W,"⋏","\\curlywedge",!0);c(f,b,W,"⋎","\\curlyvee",!0);c(f,b,W,"⊝","\\circleddash",!0);c(f,b,W,"⊛","\\circledast",!0);c(f,b,W,"⋅","\\centerdot");c(f,b,W,"⊺","\\intercal",!0);c(f,b,W,"⋒","\\doublecap");c(f,b,W,"⋓","\\doublecup");c(f,b,W,"⊠","\\boxtimes",!0);c(f,b,x,"⇢","\\dashrightarrow",!0);c(f,b,x,"⇠","\\dashleftarrow",!0);c(f,b,x,"⇇","\\leftleftarrows",!0);c(f,b,x,"⇆","\\leftrightarrows",!0);c(f,b,x,"⇚","\\Lleftarrow",!0);c(f,b,x,"↞","\\twoheadleftarrow",!0);c(f,b,x,"↢","\\leftarrowtail",!0);c(f,b,x,"↫","\\looparrowleft",!0);c(f,b,x,"⇋","\\leftrightharpoons",!0);c(f,b,x,"↶","\\curvearrowleft",!0);c(f,b,x,"↺","\\circlearrowleft",!0);c(f,b,x,"↰","\\Lsh",!0);c(f,b,x,"⇈","\\upuparrows",!0);c(f,b,x,"↿","\\upharpoonleft",!0);c(f,b,x,"⇃","\\downharpoonleft",!0);c(f,g,x,"⊶","\\origof",!0);c(f,g,x,"⊷","\\imageof",!0);c(f,b,x,"⊸","\\multimap",!0);c(f,b,x,"↭","\\leftrightsquigarrow",!0);c(f,b,x,"⇉","\\rightrightarrows",!0);c(f,b,x,"⇄","\\rightleftarrows",!0);c(f,b,x,"↠","\\twoheadrightarrow",!0);c(f,b,x,"↣","\\rightarrowtail",!0);c(f,b,x,"↬","\\looparrowright",!0);c(f,b,x,"↷","\\curvearrowright",!0);c(f,b,x,"↻","\\circlearrowright",!0);c(f,b,x,"↱","\\Rsh",!0);c(f,b,x,"⇊","\\downdownarrows",!0);c(f,b,x,"↾","\\upharpoonright",!0);c(f,b,x,"⇂","\\downharpoonright",!0);c(f,b,x,"⇝","\\rightsquigarrow",!0);c(f,b,x,"⇝","\\leadsto");c(f,b,x,"⇛","\\Rrightarrow",!0);c(f,b,x,"↾","\\restriction");c(f,g,T,"‘","`");c(f,g,T,"$","\\$");c(B,g,T,"$","\\$");c(B,g,T,"$","\\textdollar");c(f,g,T,"%","\\%");c(B,g,T,"%","\\%");c(f,g,T,"_","\\_");c(B,g,T,"_","\\_");c(B,g,T,"_","\\textunderscore");c(f,g,T,"∠","\\angle",!0);c(f,g,T,"∞","\\infty",!0);c(f,g,T,"′","\\prime");c(f,g,T,"△","\\triangle");c(f,g,T,"Γ","\\Gamma",!0);c(f,g,T,"Δ","\\Delta",!0);c(f,g,T,"Θ","\\Theta",!0);c(f,g,T,"Λ","\\Lambda",!0);c(f,g,T,"Ξ","\\Xi",!0);c(f,g,T,"Π","\\Pi",!0);c(f,g,T,"Σ","\\Sigma",!0);c(f,g,T,"Υ","\\Upsilon",!0);c(f,g,T,"Φ","\\Phi",!0);c(f,g,T,"Ψ","\\Psi",!0);c(f,g,T,"Ω","\\Omega",!0);c(f,g,T,"A","Α");c(f,g,T,"B","Β");c(f,g,T,"E","Ε");c(f,g,T,"Z","Ζ");c(f,g,T,"H","Η");c(f,g,T,"I","Ι");c(f,g,T,"K","Κ");c(f,g,T,"M","Μ");c(f,g,T,"N","Ν");c(f,g,T,"O","Ο");c(f,g,T,"P","Ρ");c(f,g,T,"T","Τ");c(f,g,T,"X","Χ");c(f,g,T,"¬","\\neg",!0);c(f,g,T,"¬","\\lnot");c(f,g,T,"⊤","\\top");c(f,g,T,"⊥","\\bot");c(f,g,T,"∅","\\emptyset");c(f,b,T,"∅","\\varnothing");c(f,g,Z,"α","\\alpha",!0);c(f,g,Z,"β","\\beta",!0);c(f,g,Z,"γ","\\gamma",!0);c(f,g,Z,"δ","\\delta",!0);c(f,g,Z,"ϵ","\\epsilon",!0);c(f,g,Z,"ζ","\\zeta",!0);c(f,g,Z,"η","\\eta",!0);c(f,g,Z,"θ","\\theta",!0);c(f,g,Z,"ι","\\iota",!0);c(f,g,Z,"κ","\\kappa",!0);c(f,g,Z,"λ","\\lambda",!0);c(f,g,Z,"μ","\\mu",!0);c(f,g,Z,"ν","\\nu",!0);c(f,g,Z,"ξ","\\xi",!0);c(f,g,Z,"ο","\\omicron",!0);c(f,g,Z,"π","\\pi",!0);c(f,g,Z,"ρ","\\rho",!0);c(f,g,Z,"σ","\\sigma",!0);c(f,g,Z,"τ","\\tau",!0);c(f,g,Z,"υ","\\upsilon",!0);c(f,g,Z,"ϕ","\\phi",!0);c(f,g,Z,"χ","\\chi",!0);c(f,g,Z,"ψ","\\psi",!0);c(f,g,Z,"ω","\\omega",!0);c(f,g,Z,"ε","\\varepsilon",!0);c(f,g,Z,"ϑ","\\vartheta",!0);c(f,g,Z,"ϖ","\\varpi",!0);c(f,g,Z,"ϱ","\\varrho",!0);c(f,g,Z,"ς","\\varsigma",!0);c(f,g,Z,"φ","\\varphi",!0);c(f,g,W,"∗","*",!0);c(f,g,W,"+","+");c(f,g,W,"−","-",!0);c(f,g,W,"⋅","\\cdot",!0);c(f,g,W,"∘","\\circ",!0);c(f,g,W,"÷","\\div",!0);c(f,g,W,"±","\\pm",!0);c(f,g,W,"×","\\times",!0);c(f,g,W,"∩","\\cap",!0);c(f,g,W,"∪","\\cup",!0);c(f,g,W,"∖","\\setminus",!0);c(f,g,W,"∧","\\land");c(f,g,W,"∨","\\lor");c(f,g,W,"∧","\\wedge",!0);c(f,g,W,"∨","\\vee",!0);c(f,g,T,"√","\\surd");c(f,g,Ye,"⟨","\\langle",!0);c(f,g,Ye,"∣","\\lvert");c(f,g,Ye,"∥","\\lVert");c(f,g,Oe,"?","?");c(f,g,Oe,"!","!");c(f,g,Oe,"⟩","\\rangle",!0);c(f,g,Oe,"∣","\\rvert");c(f,g,Oe,"∥","\\rVert");c(f,g,x,"=","=");c(f,g,x,":",":");c(f,g,x,"≈","\\approx",!0);c(f,g,x,"≅","\\cong",!0);c(f,g,x,"≥","\\ge");c(f,g,x,"≥","\\geq",!0);c(f,g,x,"←","\\gets");c(f,g,x,">","\\gt",!0);c(f,g,x,"∈","\\in",!0);c(f,g,x,"","\\@not");c(f,g,x,"⊂","\\subset",!0);c(f,g,x,"⊃","\\supset",!0);c(f,g,x,"⊆","\\subseteq",!0);c(f,g,x,"⊇","\\supseteq",!0);c(f,b,x,"⊈","\\nsubseteq",!0);c(f,b,x,"⊉","\\nsupseteq",!0);c(f,g,x,"⊨","\\models");c(f,g,x,"←","\\leftarrow",!0);c(f,g,x,"≤","\\le");c(f,g,x,"≤","\\leq",!0);c(f,g,x,"<","\\lt",!0);c(f,g,x,"→","\\rightarrow",!0);c(f,g,x,"→","\\to");c(f,b,x,"≱","\\ngeq",!0);c(f,b,x,"≰","\\nleq",!0);c(f,g,wt," ","\\ ");c(f,g,wt," ","\\space");c(f,g,wt," ","\\nobreakspace");c(B,g,wt," ","\\ ");c(B,g,wt," "," ");c(B,g,wt," ","\\space");c(B,g,wt," ","\\nobreakspace");c(f,g,wt,"","\\nobreak");c(f,g,wt,"","\\allowbreak");c(f,g,Br,",",",");c(f,g,Br,";",";");c(f,b,W,"⊼","\\barwedge",!0);c(f,b,W,"⊻","\\veebar",!0);c(f,g,W,"⊙","\\odot",!0);c(f,g,W,"⊕","\\oplus",!0);c(f,g,W,"⊗","\\otimes",!0);c(f,g,T,"∂","\\partial",!0);c(f,g,W,"⊘","\\oslash",!0);c(f,b,W,"⊚","\\circledcirc",!0);c(f,b,W,"⊡","\\boxdot",!0);c(f,g,W,"△","\\bigtriangleup");c(f,g,W,"▽","\\bigtriangledown");c(f,g,W,"†","\\dagger");c(f,g,W,"⋄","\\diamond");c(f,g,W,"⋆","\\star");c(f,g,W,"◃","\\triangleleft");c(f,g,W,"▹","\\triangleright");c(f,g,Ye,"{","\\{");c(B,g,T,"{","\\{");c(B,g,T,"{","\\textbraceleft");c(f,g,Oe,"}","\\}");c(B,g,T,"}","\\}");c(B,g,T,"}","\\textbraceright");c(f,g,Ye,"{","\\lbrace");c(f,g,Oe,"}","\\rbrace");c(f,g,Ye,"[","\\lbrack",!0);c(B,g,T,"[","\\lbrack",!0);c(f,g,Oe,"]","\\rbrack",!0);c(B,g,T,"]","\\rbrack",!0);c(f,g,Ye,"(","\\lparen",!0);c(f,g,Oe,")","\\rparen",!0);c(B,g,T,"<","\\textless",!0);c(B,g,T,">","\\textgreater",!0);c(f,g,Ye,"⌊","\\lfloor",!0);c(f,g,Oe,"⌋","\\rfloor",!0);c(f,g,Ye,"⌈","\\lceil",!0);c(f,g,Oe,"⌉","\\rceil",!0);c(f,g,T,"\\","\\backslash");c(f,g,T,"∣","|");c(f,g,T,"∣","\\vert");c(B,g,T,"|","\\textbar",!0);c(f,g,T,"∥","\\|");c(f,g,T,"∥","\\Vert");c(B,g,T,"∥","\\textbardbl");c(B,g,T,"~","\\textasciitilde");c(B,g,T,"\\","\\textbackslash");c(B,g,T,"^","\\textasciicircum");c(f,g,x,"↑","\\uparrow",!0);c(f,g,x,"⇑","\\Uparrow",!0);c(f,g,x,"↓","\\downarrow",!0);c(f,g,x,"⇓","\\Downarrow",!0);c(f,g,x,"↕","\\updownarrow",!0);c(f,g,x,"⇕","\\Updownarrow",!0);c(f,g,Ae,"∐","\\coprod");c(f,g,Ae,"⋁","\\bigvee");c(f,g,Ae,"⋀","\\bigwedge");c(f,g,Ae,"⨄","\\biguplus");c(f,g,Ae,"⋂","\\bigcap");c(f,g,Ae,"⋃","\\bigcup");c(f,g,Ae,"∫","\\int");c(f,g,Ae,"∫","\\intop");c(f,g,Ae,"∬","\\iint");c(f,g,Ae,"∭","\\iiint");c(f,g,Ae,"∏","\\prod");c(f,g,Ae,"∑","\\sum");c(f,g,Ae,"⨂","\\bigotimes");c(f,g,Ae,"⨁","\\bigoplus");c(f,g,Ae,"⨀","\\bigodot");c(f,g,Ae,"∮","\\oint");c(f,g,Ae,"∯","\\oiint");c(f,g,Ae,"∰","\\oiiint");c(f,g,Ae,"⨆","\\bigsqcup");c(f,g,Ae,"∫","\\smallint");c(B,g,or,"…","\\textellipsis");c(f,g,or,"…","\\mathellipsis");c(B,g,or,"…","\\ldots",!0);c(f,g,or,"…","\\ldots",!0);c(f,g,or,"⋯","\\@cdots",!0);c(f,g,or,"⋱","\\ddots",!0);c(f,g,T,"⋮","\\varvdots");c(B,g,T,"⋮","\\varvdots");c(f,g,ge,"ˊ","\\acute");c(f,g,ge,"ˋ","\\grave");c(f,g,ge,"¨","\\ddot");c(f,g,ge,"~","\\tilde");c(f,g,ge,"ˉ","\\bar");c(f,g,ge,"˘","\\breve");c(f,g,ge,"ˇ","\\check");c(f,g,ge,"^","\\hat");c(f,g,ge,"⃗","\\vec");c(f,g,ge,"˙","\\dot");c(f,g,ge,"˚","\\mathring");c(f,g,Z,"","\\@imath");c(f,g,Z,"","\\@jmath");c(f,g,T,"ı","ı");c(f,g,T,"ȷ","ȷ");c(B,g,T,"ı","\\i",!0);c(B,g,T,"ȷ","\\j",!0);c(B,g,T,"ß","\\ss",!0);c(B,g,T,"æ","\\ae",!0);c(B,g,T,"œ","\\oe",!0);c(B,g,T,"ø","\\o",!0);c(B,g,T,"Æ","\\AE",!0);c(B,g,T,"Œ","\\OE",!0);c(B,g,T,"Ø","\\O",!0);c(B,g,ge,"ˊ","\\'");c(B,g,ge,"ˋ","\\`");c(B,g,ge,"ˆ","\\^");c(B,g,ge,"˜","\\~");c(B,g,ge,"ˉ","\\=");c(B,g,ge,"˘","\\u");c(B,g,ge,"˙","\\.");c(B,g,ge,"¸","\\c");c(B,g,ge,"˚","\\r");c(B,g,ge,"ˇ","\\v");c(B,g,ge,"¨",'\\"');c(B,g,ge,"˝","\\H");c(B,g,ge,"◯","\\textcircled");var Fs={"--":!0,"---":!0,"``":!0,"''":!0};c(B,g,T,"–","--",!0);c(B,g,T,"–","\\textendash");c(B,g,T,"—","---",!0);c(B,g,T,"—","\\textemdash");c(B,g,T,"‘","`",!0);c(B,g,T,"‘","\\textquoteleft");c(B,g,T,"’","'",!0);c(B,g,T,"’","\\textquoteright");c(B,g,T,"“","``",!0);c(B,g,T,"“","\\textquotedblleft");c(B,g,T,"”","''",!0);c(B,g,T,"”","\\textquotedblright");c(f,g,T,"°","\\degree",!0);c(B,g,T,"°","\\degree");c(B,g,T,"°","\\textdegree",!0);c(f,g,T,"£","\\pounds");c(f,g,T,"£","\\mathsterling",!0);c(B,g,T,"£","\\pounds");c(B,g,T,"£","\\textsterling",!0);c(f,b,T,"✠","\\maltese");c(B,b,T,"✠","\\maltese");var Ma='0123456789/@."';for(var Jn=0;Jn{var t=e.charCodeAt(0),r=e.charCodeAt(1),n=(t-55296)*1024+(r-56320)+65536;if(119808<=n&&n<120484){var i=Math.floor((n-119808)/26);return Oa[i]}else if(120782<=n&&n<=120831){var a=Math.floor((n-120782)/10);return p2[a]}else{if(n===120485||n===120486)return Oa[0];if(120486{if(zt(e.classes)!==zt(t.classes)||e.skew!==t.skew||e.maxFontSize!==t.maxFontSize||e.italic!==0&&e.hasClass("mathnormal"))return!1;if(e.classes.length===1){var r=e.classes[0];if(r==="mbin"||r==="mord")return!1}for(var n of Object.keys(e.style))if(e.style[n]!==t.style[n])return!1;for(var i of Object.keys(t.style))if(e.style[i]!==t.style[i])return!1;return!0},Rs=e=>{for(var t=0;tr&&(r=l.height),l.depth>n&&(n=l.depth),l.maxFontSize>i&&(i=l.maxFontSize)}t.height=r,t.depth=n,t.maxFontSize=i},F=function(t,r,n,i){var a=new sr(t,r,n,i);return di(a),a},Et=(e,t,r,n)=>new sr(e,t,r,n),rr=function(t,r,n){var i=F([t],[],r);return i.height=Math.max(n||r.fontMetrics().defaultRuleThickness,r.minRuleThickness),i.style.borderBottomWidth=P(i.height),i.maxFontSize=1,i},y2=function(t,r,n,i){var a=new bn(t,r,n,i);return di(a),a},kt=function(t){var r=new lr(t);return di(r),r},nr=function(t,r){return t instanceof lr?F([],[t],r):t},b2=function(t){if(t.positionType==="individualShift"){for(var r=t.children,n=[r[0]],i=-r[0].shift-r[0].elem.depth,a=i,l=1;l{var r=F(["mspace"],[],t),n=ye(e,t);return r.style.marginRight=P(n),r},Xr=(e,t,r)=>{var n,i;switch(e){case"amsrm":n="AMS";break;case"textrm":n="Main";break;case"textsf":n="SansSerif";break;case"texttt":n="Typewriter";break;default:n=e}return t==="textbf"&&r==="textit"?i="BoldItalic":t==="textbf"?i="Bold":r==="textit"?i="Italic":i="Regular",n+"-"+i},L0={mathbf:{variant:"bold",fontName:"Main-Bold"},mathrm:{variant:"normal",fontName:"Main-Regular"},textit:{variant:"italic",fontName:"Main-Italic"},mathit:{variant:"italic",fontName:"Main-Italic"},mathnormal:{variant:"italic",fontName:"Math-Italic"},mathsfit:{variant:"sans-serif-italic",fontName:"SansSerif-Italic"},mathbb:{variant:"double-struck",fontName:"AMS-Regular"},mathcal:{variant:"script",fontName:"Caligraphic-Regular"},mathfrak:{variant:"fraktur",fontName:"Fraktur-Regular"},mathscr:{variant:"script",fontName:"Script-Regular"},mathsf:{variant:"sans-serif",fontName:"SansSerif-Regular"},mathtt:{variant:"monospace",fontName:"Typewriter-Regular"}},Ns={vec:["vec",.471,.714],oiintSize1:["oiintSize1",.957,.499],oiintSize2:["oiintSize2",1.472,.659],oiiintSize1:["oiiintSize1",1.304,.499],oiiintSize2:["oiiintSize2",1.98,.659]},Ps=function(t,r){var[n,i,a]=Ns[t],l=new Mt(n),s=new yt([l],{width:P(i),height:P(a),style:"width:"+P(i),viewBox:"0 0 "+1e3*i+" "+1e3*a,preserveAspectRatio:"xMinYMin"}),o=Et(["overlay"],[s],r);return o.height=a,o.style.height=P(a),o.style.width=P(i),o},ve={number:3,unit:"mu"},Ot={number:4,unit:"mu"},dt={number:5,unit:"mu"},x2={mord:{mop:ve,mbin:Ot,mrel:dt,minner:ve},mop:{mord:ve,mop:ve,mrel:dt,minner:ve},mbin:{mord:Ot,mop:Ot,mopen:Ot,minner:Ot},mrel:{mord:dt,mop:dt,mopen:dt,minner:dt},mopen:{},mclose:{mop:ve,mbin:Ot,mrel:dt,minner:ve},mpunct:{mord:ve,mop:ve,mrel:dt,mopen:ve,mclose:ve,mpunct:ve,minner:ve},minner:{mord:ve,mop:ve,mbin:Ot,mrel:dt,mopen:ve,mpunct:ve,minner:ve}},w2={mord:{mop:ve},mop:{mord:ve,mop:ve},mbin:{},mrel:{},mopen:{},mclose:{mop:ve},mpunct:{},minner:{mop:ve}},Os={},un={},cn={};function _(e){for(var{type:t,names:r,props:n,handler:i,htmlBuilder:a,mathmlBuilder:l}=e,s={type:t,numArgs:n.numArgs,argTypes:n.argTypes,allowedInArgument:!!n.allowedInArgument,allowedInText:!!n.allowedInText,allowedInMath:n.allowedInMath===void 0?!0:n.allowedInMath,numOptionalArgs:n.numOptionalArgs||0,infix:!!n.infix,primitive:!!n.primitive,handler:i},o=0;o{var C=w.classes[0],A=y.classes[0];C==="mbin"&&S2.has(A)?w.classes[0]="mord":A==="mbin"&&k2.has(C)&&(y.classes[0]="mord")},{node:m},d,p),N0(a,(y,w)=>{var C,A,z=O0(w),I=O0(y),q=z&&I?y.hasClass("mtight")?(C=w2[z])==null?void 0:C[I]:(A=x2[z])==null?void 0:A[I]:null;if(q)return Ls(q,u)},{node:m},d,p),a},N0=function(t,r,n,i,a){i&&t.push(i);for(var l=0;ld=>{t.splice(m+1,0,d),l++})(l)}i&&t.pop()},qs=function(t){return t instanceof lr||t instanceof bn||t instanceof sr&&t.hasClass("enclosing")?t:null},P0=function(t,r){var n=qs(t);if(n){var i=n.children;if(i.length){if(r==="right")return P0(i[i.length-1],"right");if(r==="left")return P0(i[0],"left")}}return t},O0=function(t,r){if(!t)return null;r&&(t=P0(t,r));var n=t.classes[0];return T2[n]||null},zr=function(t,r){var n=["nulldelimiter"].concat(t.baseSizingClasses());return F(r.concat(n))},ue=function(t,r,n){if(!t)return F();if(un[t.type]){var i=un[t.type](t,r);if(n&&r.size!==n.size){i=F(r.sizingClasses(n),[i],r);var a=r.sizeMultiplier/n.sizeMultiplier;i.height*=a,i.depth*=a}return i}else throw new L("Got group of unknown type: '"+t.type+"'")};function Yr(e,t){var r=F(["base"],e,t),n=F(["strut"]);return n.style.height=P(r.height+r.depth),r.depth&&(n.style.verticalAlign=P(-r.depth)),r.children.unshift(n),r}function q0(e,t){var r=null;e.length===1&&e[0].type==="tag"&&(r=e[0].tag,e=e[0].body);var n=ze(e,t,"root"),i;n.length===2&&n[1].hasClass("tag")&&(i=n.pop());for(var a=[],l=[],s=0;s0&&(a.push(Yr(l,t)),l=[]),a.push(n[s]));l.length>0&&a.push(Yr(l,t));var u;r?(u=Yr(ze(r,t,!0),t),u.classes=["tag"],a.push(u)):i&&a.push(i);var h=F(["katex-html"],a);if(h.setAttribute("aria-hidden","true"),u){var m=u.children[0];m.style.height=P(h.height+h.depth),h.depth&&(m.style.verticalAlign=P(-h.depth))}return h}function Hs(e){return new lr(e)}class N{constructor(t,r,n){this.type=void 0,this.attributes=void 0,this.children=void 0,this.classes=void 0,this.type=t,this.attributes={},this.children=r||[],this.classes=n||[]}setAttribute(t,r){this.attributes[t]=r}getAttribute(t){return this.attributes[t]}toNode(){var t=document.createElementNS("http://www.w3.org/1998/Math/MathML",this.type);for(var r in this.attributes)Object.prototype.hasOwnProperty.call(this.attributes,r)&&t.setAttribute(r,this.attributes[r]);this.classes.length>0&&(t.className=zt(this.classes));for(var n=0;n0&&(t+=' class ="'+De(zt(this.classes))+'"'),t+=">";for(var n=0;n",t}toText(){return this.children.map(t=>t.toText()).join("")}}class Se{constructor(t){this.text=void 0,this.text=t}toNode(){return document.createTextNode(this.text)}toMarkup(){return De(this.toText())}toText(){return this.text}}class js{constructor(t){this.width=void 0,this.character=void 0,this.width=t,t>=.05555&&t<=.05556?this.character=" ":t>=.1666&&t<=.1667?this.character=" ":t>=.2222&&t<=.2223?this.character=" ":t>=.2777&&t<=.2778?this.character="  ":t>=-.05556&&t<=-.05555?this.character=" ⁣":t>=-.1667&&t<=-.1666?this.character=" ⁣":t>=-.2223&&t<=-.2222?this.character=" ⁣":t>=-.2778&&t<=-.2777?this.character=" ⁣":this.character=null}toNode(){if(this.character)return document.createTextNode(this.character);var t=document.createElementNS("http://www.w3.org/1998/Math/MathML","mspace");return t.setAttribute("width",P(this.width)),t}toMarkup(){return this.character?""+this.character+"":''}toText(){return this.character?this.character:" "}}var C2=new Set(["\\imath","\\jmath"]),z2=new Set(["mrow","mtable"]),et=function(t,r,n){return de[r][t]&&de[r][t].replace&&t.charCodeAt(0)!==55349&&!(Fs.hasOwnProperty(t)&&n&&(n.fontFamily&&n.fontFamily.slice(4,6)==="tt"||n.font&&n.font.slice(4,6)==="tt"))&&(t=de[r][t].replace),new Se(t)},gi=function(t){return t.length===1?t[0]:new N("mrow",t)},M2={mathit:"italic",boldsymbol:e=>e.type==="textord"?"bold":"bold-italic",mathbf:"bold",mathbb:"double-struck",mathsfit:"sans-serif-italic",mathfrak:"fraktur",mathscr:"script",mathcal:"script",mathsf:"sans-serif",mathtt:"monospace"},vi=(e,t)=>{if(e.mode==="text"){if(t.fontFamily==="texttt")return"monospace";if(t.fontFamily==="textsf")return t.fontShape==="textit"&&t.fontWeight==="textbf"?"sans-serif-bold-italic":t.fontShape==="textit"?"sans-serif-italic":t.fontWeight==="textbf"?"bold-sans-serif":"sans-serif";if(t.fontShape==="textit"&&t.fontWeight==="textbf")return"bold-italic";if(t.fontShape==="textit")return"italic";if(t.fontWeight==="textbf")return"bold"}var r=t.font;if(!r||r==="mathnormal")return null;var n=e.mode,i=M2[r];if(i)return typeof i=="function"?i(e):i;var a=e.text;if(C2.has(a))return null;if(de[n][a]){var l=de[n][a].replace;l&&(a=l)}var s=L0[r].fontName;return fi(a,s,n)?L0[r].variant:null};function n0(e){if(!e)return!1;if(e.type==="mi"&&e.children.length===1){var t=e.children[0];return t instanceof Se&&t.text==="."}else if(e.type==="mo"&&e.children.length===1&&e.getAttribute("separator")==="true"&&e.getAttribute("lspace")==="0em"&&e.getAttribute("rspace")==="0em"){var r=e.children[0];return r instanceof Se&&r.text===","}else return!1}var Ke=function(t,r,n){if(t.length===1){var i=fe(t[0],r);return n&&i instanceof N&&i.type==="mo"&&(i.setAttribute("lspace","0em"),i.setAttribute("rspace","0em")),[i]}for(var a=[],l,s=0;s=1&&(l.type==="mn"||n0(l))){var u=o.children[0];u instanceof N&&u.type==="mn"&&(u.children=[...l.children,...u.children],a.pop())}else if(l.type==="mi"&&l.children.length===1){var h=l.children[0];if(h instanceof Se&&h.text==="̸"&&(o.type==="mo"||o.type==="mi"||o.type==="mn")){var m=o.children[0];m instanceof Se&&m.text.length>0&&(m.text=m.text.slice(0,1)+"̸"+m.text.slice(1),a.pop())}}}a.push(o),l=o}return a},It=function(t,r,n){return gi(Ke(t,r,n))},fe=function(t,r){if(!t)return new N("mrow");if(cn[t.type])return cn[t.type](t,r);throw new L("Got group of unknown type: '"+t.type+"'")};function qa(e,t,r,n,i){var a=Ke(e,r),l;a.length===1&&a[0]instanceof N&&z2.has(a[0].type)?l=a[0]:l=new N("mrow",a);var s=new N("annotation",[new Se(t)]);s.setAttribute("encoding","application/x-tex");var o=new N("semantics",[l,s]),u=new N("math",[o]);u.setAttribute("xmlns","http://www.w3.org/1998/Math/MathML"),n&&u.setAttribute("display","block");var h=i?"katex":"katex-mathml";return F([h],[u])}var E2=[[1,1,1],[2,1,1],[3,1,1],[4,2,1],[5,2,1],[6,3,1],[7,4,2],[8,6,3],[9,7,6],[10,8,7],[11,10,9]],Ha=[.5,.6,.7,.8,.9,1,1.2,1.44,1.728,2.074,2.488],ja=function(t,r){return r.size<2?t:E2[t-1][r.size-1]};class gt{constructor(t){this.style=void 0,this.color=void 0,this.size=void 0,this.textSize=void 0,this.phantom=void 0,this.font=void 0,this.fontFamily=void 0,this.fontWeight=void 0,this.fontShape=void 0,this.sizeMultiplier=void 0,this.maxSize=void 0,this.minRuleThickness=void 0,this._fontMetrics=void 0,this.style=t.style,this.color=t.color,this.size=t.size||gt.BASESIZE,this.textSize=t.textSize||this.size,this.phantom=!!t.phantom,this.font=t.font||"",this.fontFamily=t.fontFamily||"",this.fontWeight=t.fontWeight||"",this.fontShape=t.fontShape||"",this.sizeMultiplier=Ha[this.size-1],this.maxSize=t.maxSize,this.minRuleThickness=t.minRuleThickness,this._fontMetrics=void 0}extend(t){var r={style:this.style,size:this.size,textSize:this.textSize,color:this.color,phantom:this.phantom,font:this.font,fontFamily:this.fontFamily,fontWeight:this.fontWeight,fontShape:this.fontShape,maxSize:this.maxSize,minRuleThickness:this.minRuleThickness};return Object.assign(r,t),new gt(r)}havingStyle(t){return this.style===t?this:this.extend({style:t,size:ja(this.textSize,t)})}havingCrampedStyle(){return this.havingStyle(this.style.cramp())}havingSize(t){return this.size===t&&this.textSize===t?this:this.extend({style:this.style.text(),size:t,textSize:t,sizeMultiplier:Ha[t-1]})}havingBaseStyle(t){t=t||this.style.text();var r=ja(gt.BASESIZE,t);return this.size===r&&this.textSize===gt.BASESIZE&&this.style===t?this:this.extend({style:t,size:r})}havingBaseSizing(){var t;switch(this.style.id){case 4:case 5:t=3;break;case 6:case 7:t=1;break;default:t=6}return this.extend({style:this.style.text(),size:t})}withColor(t){return this.extend({color:t})}withPhantom(){return this.extend({phantom:!0})}withFont(t){return this.extend({font:t})}withTextFontFamily(t){return this.extend({fontFamily:t,font:""})}withTextFontWeight(t){return this.extend({fontWeight:t,font:""})}withTextFontShape(t){return this.extend({fontShape:t,font:""})}sizingClasses(t){return t.size!==this.size?["sizing","reset-size"+t.size,"size"+this.size]:[]}baseSizingClasses(){return this.size!==gt.BASESIZE?["sizing","reset-size"+this.size,"size"+gt.BASESIZE]:[]}fontMetrics(){return this._fontMetrics||(this._fontMetrics=m2(this.size)),this._fontMetrics}getColor(){return this.phantom?"transparent":this.color}}gt.BASESIZE=6;var $s=function(t){return new gt({style:t.displayMode?te.DISPLAY:te.TEXT,maxSize:t.maxSize,minRuleThickness:t.minRuleThickness})},Us=function(t,r){if(r.displayMode){var n=["katex-display"];r.leqno&&n.push("leqno"),r.fleqn&&n.push("fleqn"),t=F(n,[t])}return t},I2=function(t,r,n){var i=$s(n),a;if(n.output==="mathml")return qa(t,r,i,n.displayMode,!0);if(n.output==="html"){var l=q0(t,i);a=F(["katex"],[l])}else{var s=qa(t,r,i,n.displayMode,!1),o=q0(t,i);a=F(["katex"],[s,o])}return Us(a,n)},D2=function(t,r,n){var i=$s(n),a=q0(t,i),l=F(["katex"],[a]);return Us(l,n)},B2={widehat:"^",widecheck:"ˇ",widetilde:"~",utilde:"~",overleftarrow:"←",underleftarrow:"←",xleftarrow:"←",overrightarrow:"→",underrightarrow:"→",xrightarrow:"→",underbrace:"⏟",overbrace:"⏞",underbracket:"⎵",overbracket:"⎴",overgroup:"⏠",undergroup:"⏡",overleftrightarrow:"↔",underleftrightarrow:"↔",xleftrightarrow:"↔",Overrightarrow:"⇒",xRightarrow:"⇒",overleftharpoon:"↼",xleftharpoonup:"↼",overrightharpoon:"⇀",xrightharpoonup:"⇀",xLeftarrow:"⇐",xLeftrightarrow:"⇔",xhookleftarrow:"↩",xhookrightarrow:"↪",xmapsto:"↦",xrightharpoondown:"⇁",xleftharpoondown:"↽",xrightleftharpoons:"⇌",xleftrightharpoons:"⇋",xtwoheadleftarrow:"↞",xtwoheadrightarrow:"↠",xlongequal:"=",xtofrom:"⇄",xrightleftarrows:"⇄",xrightequilibrium:"⇌",xleftequilibrium:"⇋","\\cdrightarrow":"→","\\cdleftarrow":"←","\\cdlongequal":"="},kn=function(t){var r=new N("mo",[new Se(B2[t.replace(/^\\/,"")])]);return r.setAttribute("stretchy","true"),r},F2={overrightarrow:[["rightarrow"],.888,522,"xMaxYMin"],overleftarrow:[["leftarrow"],.888,522,"xMinYMin"],underrightarrow:[["rightarrow"],.888,522,"xMaxYMin"],underleftarrow:[["leftarrow"],.888,522,"xMinYMin"],xrightarrow:[["rightarrow"],1.469,522,"xMaxYMin"],"\\cdrightarrow":[["rightarrow"],3,522,"xMaxYMin"],xleftarrow:[["leftarrow"],1.469,522,"xMinYMin"],"\\cdleftarrow":[["leftarrow"],3,522,"xMinYMin"],Overrightarrow:[["doublerightarrow"],.888,560,"xMaxYMin"],xRightarrow:[["doublerightarrow"],1.526,560,"xMaxYMin"],xLeftarrow:[["doubleleftarrow"],1.526,560,"xMinYMin"],overleftharpoon:[["leftharpoon"],.888,522,"xMinYMin"],xleftharpoonup:[["leftharpoon"],.888,522,"xMinYMin"],xleftharpoondown:[["leftharpoondown"],.888,522,"xMinYMin"],overrightharpoon:[["rightharpoon"],.888,522,"xMaxYMin"],xrightharpoonup:[["rightharpoon"],.888,522,"xMaxYMin"],xrightharpoondown:[["rightharpoondown"],.888,522,"xMaxYMin"],xlongequal:[["longequal"],.888,334,"xMinYMin"],"\\cdlongequal":[["longequal"],3,334,"xMinYMin"],xtwoheadleftarrow:[["twoheadleftarrow"],.888,334,"xMinYMin"],xtwoheadrightarrow:[["twoheadrightarrow"],.888,334,"xMaxYMin"],overleftrightarrow:[["leftarrow","rightarrow"],.888,522],overbrace:[["leftbrace","midbrace","rightbrace"],1.6,548],underbrace:[["leftbraceunder","midbraceunder","rightbraceunder"],1.6,548],underleftrightarrow:[["leftarrow","rightarrow"],.888,522],xleftrightarrow:[["leftarrow","rightarrow"],1.75,522],xLeftrightarrow:[["doubleleftarrow","doublerightarrow"],1.75,560],xrightleftharpoons:[["leftharpoondownplus","rightharpoonplus"],1.75,716],xleftrightharpoons:[["leftharpoonplus","rightharpoondownplus"],1.75,716],xhookleftarrow:[["leftarrow","righthook"],1.08,522],xhookrightarrow:[["lefthook","rightarrow"],1.08,522],overlinesegment:[["leftlinesegment","rightlinesegment"],.888,522],underlinesegment:[["leftlinesegment","rightlinesegment"],.888,522],overbracket:[["leftbracketover","rightbracketover"],1.6,440],underbracket:[["leftbracketunder","rightbracketunder"],1.6,410],overgroup:[["leftgroup","rightgroup"],.888,342],undergroup:[["leftgroupunder","rightgroupunder"],.888,342],xmapsto:[["leftmapsto","rightarrow"],1.5,522],xtofrom:[["leftToFrom","rightToFrom"],1.75,528],xrightleftarrows:[["baraboveleftarrow","rightarrowabovebar"],1.75,901],xrightequilibrium:[["baraboveshortleftharpoon","rightharpoonaboveshortbar"],1.75,716],xleftequilibrium:[["shortbaraboveleftharpoon","shortrightharpoonabovebar"],1.75,716]},R2=new Set(["widehat","widecheck","widetilde","utilde"]),Sn=function(t,r){function n(){var s=4e5,o=t.label.slice(1);if(R2.has(o)&&"base"in t){var u=t.base.type==="ordgroup"?t.base.body.length:1,h,m,d;if(u>5)o==="widehat"||o==="widecheck"?(h=420,s=2364,d=.42,m=o+"4"):(h=312,s=2340,d=.34,m="tilde4");else{var p=[1,1,2,2,3,3][u];o==="widehat"||o==="widecheck"?(s=[0,1062,2364,2364,2364][p],h=[0,239,300,360,420][p],d=[0,.24,.3,.3,.36,.42][p],m=o+p):(s=[0,600,1033,2339,2340][p],h=[0,260,286,306,312][p],d=[0,.26,.286,.3,.306,.34][p],m="tilde"+p)}var y=new Mt(m),w=new yt([y],{width:"100%",height:P(d),viewBox:"0 0 "+s+" "+h,preserveAspectRatio:"none"});return{span:Et([],[w],r),minWidth:0,height:d}}else{var C=[],A=F2[o];if(!A)throw new Error('No SVG data for "'+o+'".');var[z,I,q]=A,O=q/1e3,M=z.length,G,X;if(M===1){if(A.length!==4)throw new Error('Expected 4-tuple for single-path SVG data "'+o+'".');G=["hide-tail"],X=[A[3]]}else if(M===2)G=["halfarrow-left","halfarrow-right"],X=["xMinYMin","xMaxYMin"];else if(M===3)G=["brace-left","brace-center","brace-right"],X=["xMinYMin","xMidYMin","xMaxYMin"];else throw new Error(`Correct katexImagesData or update code here to support + `+M+" children.");for(var U=0;U0&&(i.style.minWidth=P(a)),i},L2=function(t,r,n,i,a){var l,s=t.height+t.depth+n+i;if(/fbox|color|angl/.test(r)){if(l=F(["stretchy",r],[],a),r==="fbox"){var o=a.color&&a.getColor();o&&(l.style.borderColor=o)}}else{var u=[];/^[bx]cancel$/.test(r)&&u.push(new E0({x1:"0",y1:"0",x2:"100%",y2:"100%","stroke-width":"0.046em"})),/^x?cancel$/.test(r)&&u.push(new E0({x1:"0",y1:"100%",x2:"100%",y2:"0","stroke-width":"0.046em"}));var h=new yt(u,{width:"100%",height:P(s)});l=Et([],[h],a)}return l.height=s,l.style.height=P(s),l},N2={bin:1,close:1,inner:1,open:1,punct:1,rel:1},P2={"accent-token":1,mathord:1,"op-token":1,spacing:1,textord:1};function O2(e){return e in N2}function re(e,t){if(!e||e.type!==t)throw new Error("Expected node of type "+t+", but got "+(e?"node of type "+e.type:String(e)));return e}function An(e){var t=Tn(e);if(!t)throw new Error("Expected node of symbol group type, but got "+(e?"node of type "+e.type:String(e)));return t}function Tn(e){return e&&(e.type==="atom"||P2.hasOwnProperty(e.type))?e:null}var Vs=e=>{if(e instanceof Xe)return e;if(c2(e)&&e.children.length===1)return Vs(e.children[0])},yi=(e,t)=>{var r,n,i;e&&e.type==="supsub"?(n=re(e.base,"accent"),r=n.base,e.base=r,i=u2(ue(e,t)),e.base=n):(n=re(e,"accent"),r=n.base);var a=ue(r,t.havingCrampedStyle()),l=n.isShifty&&xt(r),s=0;if(l){var o,u;s=(o=(u=Vs(a))==null?void 0:u.skew)!=null?o:0}var h=n.label==="\\c",m=h?a.height+a.depth:Math.min(a.height,t.fontMetrics().xHeight),d;if(n.isStretchy)d=Sn(n,t),d=oe({positionType:"firstBaseline",children:[{type:"elem",elem:a},{type:"elem",elem:d,wrapperClasses:["svg-align"],wrapperStyle:s>0?{width:"calc(100% - "+P(2*s)+")",marginLeft:P(2*s)}:void 0}]});else{var p,y;n.label==="\\vec"?(p=Ps("vec",t),y=Ns.vec[1]):(p=wn({mode:n.mode,text:n.label},t,"textord"),p=o2(p),p.italic=0,y=p.width,h&&(m+=p.depth)),d=F(["accent-body"],[p]);var w=n.label==="\\textcircled";w&&(d.classes.push("accent-full"),m=a.height);var C=s;w||(C-=y/2),d.style.left=P(C),n.label==="\\textcircled"&&(d.style.top=".2em"),d=oe({positionType:"firstBaseline",children:[{type:"elem",elem:a},{type:"kern",size:-m},{type:"elem",elem:d}]})}var A=F(["mord","accent"],[d],t);return i?(i.children[0]=A,i.height=Math.max(A.height,i.height),i.classes[0]="mord",i):A},_s=(e,t)=>{var r=e.isStretchy?kn(e.label):new N("mo",[et(e.label,e.mode)]),n=new N("mover",[fe(e.base,t),r]);return n.setAttribute("accent","true"),n},q2=new RegExp(["\\acute","\\grave","\\ddot","\\tilde","\\bar","\\breve","\\check","\\hat","\\vec","\\dot","\\mathring"].map(e=>"\\"+e).join("|"));_({type:"accent",names:["\\acute","\\grave","\\ddot","\\tilde","\\bar","\\breve","\\check","\\hat","\\vec","\\dot","\\mathring","\\widecheck","\\widehat","\\widetilde","\\overrightarrow","\\overleftarrow","\\Overrightarrow","\\overleftrightarrow","\\overgroup","\\overlinesegment","\\overleftharpoon","\\overrightharpoon"],props:{numArgs:1},handler:(e,t)=>{var r=hn(t[0]),n=!q2.test(e.funcName),i=!n||e.funcName==="\\widehat"||e.funcName==="\\widetilde"||e.funcName==="\\widecheck";return{type:"accent",mode:e.parser.mode,label:e.funcName,isStretchy:n,isShifty:i,base:r}},htmlBuilder:yi,mathmlBuilder:_s});_({type:"accent",names:["\\'","\\`","\\^","\\~","\\=","\\u","\\.",'\\"',"\\c","\\r","\\H","\\v","\\textcircled"],props:{numArgs:1,allowedInText:!0,allowedInMath:!0,argTypes:["primitive"]},handler:(e,t)=>{var r=t[0],n=e.parser.mode;return n==="math"&&(e.parser.settings.reportNonstrict("mathVsTextAccents","LaTeX's accent "+e.funcName+" works only in text mode"),n="text"),{type:"accent",mode:n,label:e.funcName,isStretchy:!1,isShifty:!0,base:r}},htmlBuilder:yi,mathmlBuilder:_s});_({type:"accentUnder",names:["\\underleftarrow","\\underrightarrow","\\underleftrightarrow","\\undergroup","\\underlinesegment","\\utilde"],props:{numArgs:1},handler:(e,t)=>{var{parser:r,funcName:n}=e,i=t[0];return{type:"accentUnder",mode:r.mode,label:n,base:i}},htmlBuilder:(e,t)=>{var r=ue(e.base,t),n=Sn(e,t),i=e.label==="\\utilde"?.12:0,a=oe({positionType:"top",positionData:r.height,children:[{type:"elem",elem:n,wrapperClasses:["svg-align"]},{type:"kern",size:i},{type:"elem",elem:r}]});return F(["mord","accentunder"],[a],t)},mathmlBuilder:(e,t)=>{var r=kn(e.label),n=new N("munder",[fe(e.base,t),r]);return n.setAttribute("accentunder","true"),n}});var Kr=e=>{var t=new N("mpadded",e?[e]:[]);return t.setAttribute("width","+0.6em"),t.setAttribute("lspace","0.3em"),t};_({type:"xArrow",names:["\\xleftarrow","\\xrightarrow","\\xLeftarrow","\\xRightarrow","\\xleftrightarrow","\\xLeftrightarrow","\\xhookleftarrow","\\xhookrightarrow","\\xmapsto","\\xrightharpoondown","\\xrightharpoonup","\\xleftharpoondown","\\xleftharpoonup","\\xrightleftharpoons","\\xleftrightharpoons","\\xlongequal","\\xtwoheadrightarrow","\\xtwoheadleftarrow","\\xtofrom","\\xrightleftarrows","\\xrightequilibrium","\\xleftequilibrium","\\\\cdrightarrow","\\\\cdleftarrow","\\\\cdlongequal"],props:{numArgs:1,numOptionalArgs:1},handler(e,t,r){var{parser:n,funcName:i}=e;return{type:"xArrow",mode:n.mode,label:i,body:t[0],below:r[0]}},htmlBuilder(e,t){var r=t.style,n=t.havingStyle(r.sup()),i=nr(ue(e.body,n,t),t),a=e.label.slice(0,2)==="\\x"?"x":"cd";i.classes.push(a+"-arrow-pad");var l;e.below&&(n=t.havingStyle(r.sub()),l=nr(ue(e.below,n,t),t),l.classes.push(a+"-arrow-pad"));var s=Sn(e,t),o=-t.fontMetrics().axisHeight+.5*s.height,u=-t.fontMetrics().axisHeight-.5*s.height-.111;(i.depth>.25||e.label==="\\xleftequilibrium")&&(u-=i.depth);var h;if(l){var m=-t.fontMetrics().axisHeight+l.height+.5*s.height+.111;h=oe({positionType:"individualShift",children:[{type:"elem",elem:i,shift:u},{type:"elem",elem:s,shift:o,wrapperClasses:["svg-align"]},{type:"elem",elem:l,shift:m}]})}else h=oe({positionType:"individualShift",children:[{type:"elem",elem:i,shift:u},{type:"elem",elem:s,shift:o,wrapperClasses:["svg-align"]}]});return F(["mrel","x-arrow"],[h],t)},mathmlBuilder(e,t){var r=kn(e.label);r.setAttribute("minsize",e.label.charAt(0)==="x"?"1.75em":"3.0em");var n;if(e.body){var i=Kr(fe(e.body,t));if(e.below){var a=Kr(fe(e.below,t));n=new N("munderover",[r,a,i])}else n=new N("mover",[r,i])}else if(e.below){var l=Kr(fe(e.below,t));n=new N("munder",[r,l])}else n=Kr(),n=new N("mover",[r,n]);return n}});function Gs(e,t){var r=ze(e.body,t,!0);return F([e.mclass],r,t)}function Ws(e,t){var r,n=Ke(e.body,t);return e.mclass==="minner"?r=new N("mpadded",n):e.mclass==="mord"?e.isCharacterBox?(r=n[0],r.type="mi"):r=new N("mi",n):(e.isCharacterBox?(r=n[0],r.type="mo"):r=new N("mo",n),e.mclass==="mbin"?(r.attributes.lspace="0.22em",r.attributes.rspace="0.22em"):e.mclass==="mpunct"?(r.attributes.lspace="0em",r.attributes.rspace="0.17em"):e.mclass==="mopen"||e.mclass==="mclose"?(r.attributes.lspace="0em",r.attributes.rspace="0em"):e.mclass==="minner"&&(r.attributes.lspace="0.0556em",r.attributes.width="+0.1111em")),r}_({type:"mclass",names:["\\mathord","\\mathbin","\\mathrel","\\mathopen","\\mathclose","\\mathpunct","\\mathinner"],props:{numArgs:1,primitive:!0},handler(e,t){var{parser:r,funcName:n}=e,i=t[0];return{type:"mclass",mode:r.mode,mclass:"m"+n.slice(5),body:ke(i),isCharacterBox:xt(i)}},htmlBuilder:Gs,mathmlBuilder:Ws});var Cn=e=>{var t=e.type==="ordgroup"&&e.body.length?e.body[0]:e;return t.type==="atom"&&(t.family==="bin"||t.family==="rel")?"m"+t.family:"mord"};_({type:"mclass",names:["\\@binrel"],props:{numArgs:2},handler(e,t){var{parser:r}=e;return{type:"mclass",mode:r.mode,mclass:Cn(t[0]),body:ke(t[1]),isCharacterBox:xt(t[1])}}});_({type:"mclass",names:["\\stackrel","\\overset","\\underset"],props:{numArgs:2},handler(e,t){var{parser:r,funcName:n}=e,i=t[1],a=t[0],l;n!=="\\stackrel"?l=Cn(i):l="mrel";var s={type:"op",mode:i.mode,limits:!0,alwaysHandleSupSub:!0,parentIsSupSub:!1,symbol:!1,suppressBaseShift:n!=="\\stackrel",body:ke(i)},o={type:"supsub",mode:a.mode,base:s,sup:n==="\\underset"?null:a,sub:n==="\\underset"?a:null};return{type:"mclass",mode:r.mode,mclass:l,body:[o],isCharacterBox:xt(o)}},htmlBuilder:Gs,mathmlBuilder:Ws});_({type:"pmb",names:["\\pmb"],props:{numArgs:1,allowedInText:!0},handler(e,t){var{parser:r}=e;return{type:"pmb",mode:r.mode,mclass:Cn(t[0]),body:ke(t[0])}},htmlBuilder(e,t){var r=ze(e.body,t,!0),n=F([e.mclass],r,t);return n.style.textShadow="0.02em 0.01em 0.04px",n},mathmlBuilder(e,t){var r=Ke(e.body,t),n=new N("mstyle",r);return n.setAttribute("style","text-shadow: 0.02em 0.01em 0.04px"),n}});var H2={">":"\\\\cdrightarrow","<":"\\\\cdleftarrow","=":"\\\\cdlongequal",A:"\\uparrow",V:"\\downarrow","|":"\\Vert",".":"no arrow"},$a=()=>({type:"styling",body:[],mode:"math",style:"display",resetFont:!0}),Ua=e=>e.type==="textord"&&e.text==="@",j2=(e,t)=>(e.type==="mathord"||e.type==="atom")&&e.text===t;function $2(e,t,r){var n=H2[e];switch(n){case"\\\\cdrightarrow":case"\\\\cdleftarrow":return r.callFunction(n,[t[0]],[t[1]]);case"\\uparrow":case"\\downarrow":{var i=r.callFunction("\\\\cdleft",[t[0]],[]),a={type:"atom",text:n,mode:"math",family:"rel"},l=r.callFunction("\\Big",[a],[]),s=r.callFunction("\\\\cdright",[t[1]],[]),o={type:"ordgroup",mode:"math",body:[i,l,s]};return r.callFunction("\\\\cdparent",[o],[])}case"\\\\cdlongequal":return r.callFunction("\\\\cdlongequal",[],[]);case"\\Vert":{var u={type:"textord",text:"\\Vert",mode:"math"};return r.callFunction("\\Big",[u],[])}default:return{type:"textord",text:" ",mode:"math"}}}function U2(e){var t=[];for(e.gullet.beginGroup(),e.gullet.macros.set("\\cr","\\\\\\relax"),e.gullet.beginGroup();;){t.push(e.parseExpression(!1,"\\\\")),e.gullet.endGroup(),e.gullet.beginGroup();var r=e.fetch().text;if(r==="&"||r==="\\\\")e.consume();else if(r==="\\end"){t[t.length-1].length===0&&t.pop();break}else throw new L("Expected \\\\ or \\cr or \\end",e.nextToken)}for(var n=[],i=[n],a=0;aAV".includes(u))for(var m=0;m<2;m++){for(var d=!0,p=o+1;pAV=|." after @',l[o]);var y=$2(u,h,e),w={type:"styling",body:[y],mode:"math",style:"display",resetFont:!0};n.push(w),s=$a()}a%2===0?n.push(s):n.shift(),n=[],i.push(n)}e.gullet.endGroup(),e.gullet.endGroup();var C=new Array(i[0].length).fill({type:"align",align:"c",pregap:.25,postgap:.25});return{type:"array",mode:"math",body:i,arraystretch:1,addJot:!0,rowGaps:[null],cols:C,colSeparationType:"CD",hLinesBeforeRow:new Array(i.length+1).fill([])}}_({type:"cdlabel",names:["\\\\cdleft","\\\\cdright"],props:{numArgs:1},handler(e,t){var{parser:r,funcName:n}=e;return{type:"cdlabel",mode:r.mode,side:n.slice(4),label:t[0]}},htmlBuilder(e,t){var r=t.havingStyle(t.style.sup()),n=nr(ue(e.label,r,t),t);return n.classes.push("cd-label-"+e.side),n.style.bottom=P(.8-n.depth),n.height=0,n.depth=0,n},mathmlBuilder(e,t){var r=new N("mrow",[fe(e.label,t)]);return r=new N("mpadded",[r]),r.setAttribute("width","0"),e.side==="left"&&r.setAttribute("lspace","-1width"),r.setAttribute("voffset","0.7em"),r=new N("mstyle",[r]),r.setAttribute("displaystyle","false"),r.setAttribute("scriptlevel","1"),r}});_({type:"cdlabelparent",names:["\\\\cdparent"],props:{numArgs:1},handler(e,t){var{parser:r}=e;return{type:"cdlabelparent",mode:r.mode,fragment:t[0]}},htmlBuilder(e,t){var r=nr(ue(e.fragment,t),t);return r.classes.push("cd-vert-arrow"),r},mathmlBuilder(e,t){return new N("mrow",[fe(e.fragment,t)])}});_({type:"textord",names:["\\@char"],props:{numArgs:1,allowedInText:!0},handler(e,t){for(var{parser:r}=e,n=re(t[0],"ordgroup"),i=n.body,a="",l=0;l=1114111)throw new L("\\@char with invalid code point "+a);return o<=65535?u=String.fromCharCode(o):(o-=65536,u=String.fromCharCode((o>>10)+55296,(o&1023)+56320)),{type:"textord",mode:r.mode,text:u}}});var Xs=(e,t)=>{var r=ze(e.body,t.withColor(e.color),!1);return kt(r)},Ys=(e,t)=>{var r=Ke(e.body,t.withColor(e.color)),n=new N("mstyle",r);return n.setAttribute("mathcolor",e.color),n};_({type:"color",names:["\\textcolor"],props:{numArgs:2,allowedInText:!0,argTypes:["color","original"]},handler(e,t){var{parser:r}=e,n=re(t[0],"color-token").color,i=t[1];return{type:"color",mode:r.mode,color:n,body:ke(i)}},htmlBuilder:Xs,mathmlBuilder:Ys});_({type:"color",names:["\\color"],props:{numArgs:1,allowedInText:!0,argTypes:["color"]},handler(e,t){var{parser:r,breakOnTokenText:n}=e,i=re(t[0],"color-token").color;r.gullet.macros.set("\\current@color",i);var a=r.parseExpression(!0,n);return{type:"color",mode:r.mode,color:i,body:a}},htmlBuilder:Xs,mathmlBuilder:Ys});_({type:"cr",names:["\\\\"],props:{numArgs:0,numOptionalArgs:0,allowedInText:!0},handler(e,t,r){var{parser:n}=e,i=n.gullet.future().text==="["?n.parseSizeGroup(!0):null,a=!n.settings.displayMode||!n.settings.useStrictBehavior("newLineInDisplayMode","In LaTeX, \\\\ or \\newline does nothing in display mode");return{type:"cr",mode:n.mode,newLine:a,size:i&&re(i,"size").value}},htmlBuilder(e,t){var r=F(["mspace"],[],t);return e.newLine&&(r.classes.push("newline"),e.size&&(r.style.marginTop=P(ye(e.size,t)))),r},mathmlBuilder(e,t){var r=new N("mspace");return e.newLine&&(r.setAttribute("linebreak","newline"),e.size&&r.setAttribute("height",P(ye(e.size,t)))),r}});var H0={"\\global":"\\global","\\long":"\\\\globallong","\\\\globallong":"\\\\globallong","\\def":"\\gdef","\\gdef":"\\gdef","\\edef":"\\xdef","\\xdef":"\\xdef","\\let":"\\\\globallet","\\futurelet":"\\\\globalfuture"},Ks=e=>{var t=e.text;if(/^(?:[\\{}$&#^_]|EOF)$/.test(t))throw new L("Expected a control sequence",e);return t},V2=e=>{var t=e.gullet.popToken();return t.text==="="&&(t=e.gullet.popToken(),t.text===" "&&(t=e.gullet.popToken())),t},Zs=(e,t,r,n)=>{var i=e.gullet.macros.get(r.text);i==null&&(r.noexpand=!0,i={tokens:[r],numArgs:0,unexpandable:!e.gullet.isExpandable(r.text)}),e.gullet.macros.set(t,i,n)};_({type:"internal",names:["\\global","\\long","\\\\globallong"],props:{numArgs:0,allowedInText:!0},handler(e){var{parser:t,funcName:r}=e;t.consumeSpaces();var n=t.fetch();if(H0[n.text])return(r==="\\global"||r==="\\\\globallong")&&(n.text=H0[n.text]),re(t.parseFunction(),"internal");throw new L("Invalid token after macro prefix",n)}});_({type:"internal",names:["\\def","\\gdef","\\edef","\\xdef"],props:{numArgs:0,allowedInText:!0,primitive:!0},handler(e){var{parser:t,funcName:r}=e,n=t.gullet.popToken(),i=n.text;if(/^(?:[\\{}$&#^_]|EOF)$/.test(i))throw new L("Expected a control sequence",n);for(var a=0,l,s=[[]];t.gullet.future().text!=="{";)if(n=t.gullet.popToken(),n.text==="#"){if(t.gullet.future().text==="{"){l=t.gullet.future(),s[a].push("{");break}if(n=t.gullet.popToken(),!/^[1-9]$/.test(n.text))throw new L('Invalid argument number "'+n.text+'"');if(parseInt(n.text)!==a+1)throw new L('Argument number "'+n.text+'" out of order');a++,s.push([])}else{if(n.text==="EOF")throw new L("Expected a macro definition");s[a].push(n.text)}var{tokens:o}=t.gullet.consumeArg();return l&&o.unshift(l),(r==="\\edef"||r==="\\xdef")&&(o=t.gullet.expandTokens(o),o.reverse()),t.gullet.macros.set(i,{tokens:o,numArgs:a,delimiters:s},r===H0[r]),{type:"internal",mode:t.mode}}});_({type:"internal",names:["\\let","\\\\globallet"],props:{numArgs:0,allowedInText:!0,primitive:!0},handler(e){var{parser:t,funcName:r}=e,n=Ks(t.gullet.popToken());t.gullet.consumeSpaces();var i=V2(t);return Zs(t,n,i,r==="\\\\globallet"),{type:"internal",mode:t.mode}}});_({type:"internal",names:["\\futurelet","\\\\globalfuture"],props:{numArgs:0,allowedInText:!0,primitive:!0},handler(e){var{parser:t,funcName:r}=e,n=Ks(t.gullet.popToken()),i=t.gullet.popToken(),a=t.gullet.popToken();return Zs(t,n,a,r==="\\\\globalfuture"),t.gullet.pushToken(a),t.gullet.pushToken(i),{type:"internal",mode:t.mode}}});var yr=function(t,r,n){var i=de.math[t]&&de.math[t].replace,a=fi(i||t,r,n);if(!a)throw new Error("Unsupported symbol "+t+" and font size "+r+".");return a},bi=function(t,r,n,i){var a=n.havingBaseStyle(r),l=F(i.concat(a.sizingClasses(n)),[t],n),s=a.sizeMultiplier/n.sizeMultiplier;return l.height*=s,l.depth*=s,l.maxFontSize=a.sizeMultiplier,l},Qs=function(t,r,n){var i=r.havingBaseStyle(n),a=(1-r.sizeMultiplier/i.sizeMultiplier)*r.fontMetrics().axisHeight;t.classes.push("delimcenter"),t.style.top=P(a),t.height-=a,t.depth+=a},_2=function(t,r,n,i,a,l){var s=Le(t,"Main-Regular",a,i),o=bi(s,r,i,l);return Qs(o,i,r),o},G2=function(t,r,n,i){return Le(t,"Size"+r+"-Regular",n,i)},Js=function(t,r,n,i,a,l){var s=G2(t,r,a,i),o=bi(F(["delimsizing","size"+r],[s],i),te.TEXT,i,l);return n&&Qs(o,i,te.TEXT),o},i0=function(t,r,n){var i;r==="Size1-Regular"?i="delim-size1":i="delim-size4";var a=F(["delimsizinginner",i],[F([],[Le(t,r,n)])]);return{type:"elem",elem:a}},a0=function(t,r,n){var i=st["Size4-Regular"][t.charCodeAt(0)]?st["Size4-Regular"][t.charCodeAt(0)][4]:st["Size1-Regular"][t.charCodeAt(0)][4],a=new Mt("inner",t2(t,Math.round(1e3*r))),l=new yt([a],{width:P(i),height:P(r),style:"width:"+P(i),viewBox:"0 0 "+1e3*i+" "+Math.round(1e3*r),preserveAspectRatio:"xMinYMin"}),s=Et([],[l],n);return s.height=r,s.style.height=P(r),s.style.width=P(i),{type:"elem",elem:s}},j0=.008,Zr={type:"kern",size:-1*j0},W2=new Set(["|","\\lvert","\\rvert","\\vert"]),X2=new Set(["\\|","\\lVert","\\rVert","\\Vert"]),eo=function(t,r,n,i,a,l){var s,o,u,h,m="",d=0;s=u=h=t,o=null;var p="Size1-Regular";t==="\\uparrow"?u=h="⏐":t==="\\Uparrow"?u=h="‖":t==="\\downarrow"?s=u="⏐":t==="\\Downarrow"?s=u="‖":t==="\\updownarrow"?(s="\\uparrow",u="⏐",h="\\downarrow"):t==="\\Updownarrow"?(s="\\Uparrow",u="‖",h="\\Downarrow"):W2.has(t)?(u="∣",m="vert",d=333):X2.has(t)?(u="∥",m="doublevert",d=556):t==="["||t==="\\lbrack"?(s="⎡",u="⎢",h="⎣",p="Size4-Regular",m="lbrack",d=667):t==="]"||t==="\\rbrack"?(s="⎤",u="⎥",h="⎦",p="Size4-Regular",m="rbrack",d=667):t==="\\lfloor"||t==="⌊"?(u=s="⎢",h="⎣",p="Size4-Regular",m="lfloor",d=667):t==="\\lceil"||t==="⌈"?(s="⎡",u=h="⎢",p="Size4-Regular",m="lceil",d=667):t==="\\rfloor"||t==="⌋"?(u=s="⎥",h="⎦",p="Size4-Regular",m="rfloor",d=667):t==="\\rceil"||t==="⌉"?(s="⎤",u=h="⎥",p="Size4-Regular",m="rceil",d=667):t==="("||t==="\\lparen"?(s="⎛",u="⎜",h="⎝",p="Size4-Regular",m="lparen",d=875):t===")"||t==="\\rparen"?(s="⎞",u="⎟",h="⎠",p="Size4-Regular",m="rparen",d=875):t==="\\{"||t==="\\lbrace"?(s="⎧",o="⎨",h="⎩",u="⎪",p="Size4-Regular"):t==="\\}"||t==="\\rbrace"?(s="⎫",o="⎬",h="⎭",u="⎪",p="Size4-Regular"):t==="\\lgroup"||t==="⟮"?(s="⎧",h="⎩",u="⎪",p="Size4-Regular"):t==="\\rgroup"||t==="⟯"?(s="⎫",h="⎭",u="⎪",p="Size4-Regular"):t==="\\lmoustache"||t==="⎰"?(s="⎧",h="⎭",u="⎪",p="Size4-Regular"):(t==="\\rmoustache"||t==="⎱")&&(s="⎫",h="⎩",u="⎪",p="Size4-Regular");var y=yr(s,p,a),w=y.height+y.depth,C=yr(u,p,a),A=C.height+C.depth,z=yr(h,p,a),I=z.height+z.depth,q=0,O=1;if(o!==null){var M=yr(o,p,a);q=M.height+M.depth,O=2}var G=w+I+q,X=Math.max(0,Math.ceil((r-G)/(O*A))),U=G+X*O*A,E=i.fontMetrics().axisHeight;n&&(E*=i.sizeMultiplier);var V=U/2-E,$=[];if(m.length>0){var se=U-w-I,Y=Math.round(U*1e3),H=r2(m,Math.round(se*1e3)),ae=new Mt(m,H),pe=P(d/1e3),Me=P(Y/1e3),$e=new yt([ae],{width:pe,height:Me,viewBox:"0 0 "+d+" "+Y}),k=Et([],[$e],i);k.height=Y/1e3,k.style.width=pe,k.style.height=Me,$.push({type:"elem",elem:k})}else{if($.push(i0(h,p,a)),$.push(Zr),o===null){var xe=U-w-I+2*j0;$.push(a0(u,xe,i))}else{var Fe=(U-w-I-q)/2+2*j0;$.push(a0(u,Fe,i)),$.push(Zr),$.push(i0(o,p,a)),$.push(Zr),$.push(a0(u,Fe,i))}$.push(Zr),$.push(i0(s,p,a))}var S=i.havingBaseStyle(te.TEXT),Ee=oe({positionType:"bottom",positionData:V,children:$});return bi(F(["delimsizing","mult"],[Ee],S),te.TEXT,i,l)},l0=80,s0=.08,o0=function(t,r,n,i,a){var l=e2(t,i,n),s=new Mt(t,l),o=new yt([s],{width:"400em",height:P(r),viewBox:"0 0 400000 "+n,preserveAspectRatio:"xMinYMin slice"});return Et(["hide-tail"],[o],a)},Y2=function(t,r){var n=r.havingBaseSizing(),i=ao("\\surd",t*n.sizeMultiplier,io,n),a=n.sizeMultiplier,l=Math.max(0,r.minRuleThickness-r.fontMetrics().sqrtRuleThickness),s,o,u,h,m;return i.type==="small"?(h=1e3+1e3*l+l0,t<1?a=1:t<1.4&&(a=.7),o=(1+l+s0)/a,u=(1+l)/a,s=o0("sqrtMain",o,h,l,r),s.style.minWidth="0.853em",m=.833/a):i.type==="large"?(h=(1e3+l0)*kr[i.size],u=(kr[i.size]+l)/a,o=(kr[i.size]+l+s0)/a,s=o0("sqrtSize"+i.size,o,h,l,r),s.style.minWidth="1.02em",m=1/a):(o=t+l+s0,u=t+l,h=Math.floor(1e3*t+l)+l0,s=o0("sqrtTall",o,h,l,r),s.style.minWidth="0.742em",m=1.056),s.height=u,s.style.height=P(o),{span:s,advanceWidth:m,ruleWidth:(r.fontMetrics().sqrtRuleThickness+l)*a}},to=new Set(["(","\\lparen",")","\\rparen","[","\\lbrack","]","\\rbrack","\\{","\\lbrace","\\}","\\rbrace","\\lfloor","\\rfloor","⌊","⌋","\\lceil","\\rceil","⌈","⌉","\\surd"]),K2=new Set(["\\uparrow","\\downarrow","\\updownarrow","\\Uparrow","\\Downarrow","\\Updownarrow","|","\\|","\\vert","\\Vert","\\lvert","\\rvert","\\lVert","\\rVert","\\lgroup","\\rgroup","⟮","⟯","\\lmoustache","\\rmoustache","⎰","⎱"]),ro=new Set(["<",">","\\langle","\\rangle","/","\\backslash","\\lt","\\gt"]),kr=[0,1.2,1.8,2.4,3],no=function(t,r,n,i,a){if(t==="<"||t==="\\lt"||t==="⟨"?t="\\langle":(t===">"||t==="\\gt"||t==="⟩")&&(t="\\rangle"),to.has(t)||ro.has(t))return Js(t,r,!1,n,i,a);if(K2.has(t))return eo(t,kr[r],!1,n,i,a);throw new L("Illegal delimiter: '"+t+"'")},Z2=[{type:"small",style:te.SCRIPTSCRIPT},{type:"small",style:te.SCRIPT},{type:"small",style:te.TEXT},{type:"large",size:1},{type:"large",size:2},{type:"large",size:3},{type:"large",size:4}],Q2=[{type:"small",style:te.SCRIPTSCRIPT},{type:"small",style:te.SCRIPT},{type:"small",style:te.TEXT},{type:"stack"}],io=[{type:"small",style:te.SCRIPTSCRIPT},{type:"small",style:te.SCRIPT},{type:"small",style:te.TEXT},{type:"large",size:1},{type:"large",size:2},{type:"large",size:3},{type:"large",size:4},{type:"stack"}],J2=function(t){if(t.type==="small")return"Main-Regular";if(t.type==="large")return"Size"+t.size+"-Regular";if(t.type==="stack")return"Size4-Regular";var r=t.type;throw new Error("Add support for delim type '"+r+"' here.")},ao=function(t,r,n,i){for(var a=Math.min(2,3-i.style.size),l=a;lr)return s}return n[n.length-1]},$0=function(t,r,n,i,a,l){t==="<"||t==="\\lt"||t==="⟨"?t="\\langle":(t===">"||t==="\\gt"||t==="⟩")&&(t="\\rangle");var s;ro.has(t)?s=Z2:to.has(t)?s=io:s=Q2;var o=ao(t,r,s,i);return o.type==="small"?_2(t,o.style,n,i,a,l):o.type==="large"?Js(t,o.size,n,i,a,l):eo(t,r,n,i,a,l)},u0=function(t,r,n,i,a,l){var s=i.fontMetrics().axisHeight*i.sizeMultiplier,o=901,u=5/i.fontMetrics().ptPerEm,h=Math.max(r-s,n+s),m=Math.max(h/500*o,2*h-u);return $0(t,m,!0,i,a,l)},Va={"\\bigl":{mclass:"mopen",size:1},"\\Bigl":{mclass:"mopen",size:2},"\\biggl":{mclass:"mopen",size:3},"\\Biggl":{mclass:"mopen",size:4},"\\bigr":{mclass:"mclose",size:1},"\\Bigr":{mclass:"mclose",size:2},"\\biggr":{mclass:"mclose",size:3},"\\Biggr":{mclass:"mclose",size:4},"\\bigm":{mclass:"mrel",size:1},"\\Bigm":{mclass:"mrel",size:2},"\\biggm":{mclass:"mrel",size:3},"\\Biggm":{mclass:"mrel",size:4},"\\big":{mclass:"mord",size:1},"\\Big":{mclass:"mord",size:2},"\\bigg":{mclass:"mord",size:3},"\\Bigg":{mclass:"mord",size:4}},e5=new Set(["(","\\lparen",")","\\rparen","[","\\lbrack","]","\\rbrack","\\{","\\lbrace","\\}","\\rbrace","\\lfloor","\\rfloor","⌊","⌋","\\lceil","\\rceil","⌈","⌉","<",">","\\langle","⟨","\\rangle","⟩","\\lt","\\gt","\\lvert","\\rvert","\\lVert","\\rVert","\\lgroup","\\rgroup","⟮","⟯","\\lmoustache","\\rmoustache","⎰","⎱","/","\\backslash","|","\\vert","\\|","\\Vert","\\uparrow","\\Uparrow","\\downarrow","\\Downarrow","\\updownarrow","\\Updownarrow","."]);function _a(e){return"isMiddle"in e}function zn(e,t){var r=Tn(e);if(r&&e5.has(r.text))return r;throw r?new L("Invalid delimiter '"+r.text+"' after '"+t.funcName+"'",e):new L("Invalid delimiter type '"+e.type+"'",e)}_({type:"delimsizing",names:["\\bigl","\\Bigl","\\biggl","\\Biggl","\\bigr","\\Bigr","\\biggr","\\Biggr","\\bigm","\\Bigm","\\biggm","\\Biggm","\\big","\\Big","\\bigg","\\Bigg"],props:{numArgs:1,argTypes:["primitive"]},handler:(e,t)=>{var r=zn(t[0],e);return{type:"delimsizing",mode:e.parser.mode,size:Va[e.funcName].size,mclass:Va[e.funcName].mclass,delim:r.text}},htmlBuilder:(e,t)=>e.delim==="."?F([e.mclass]):no(e.delim,e.size,t,e.mode,[e.mclass]),mathmlBuilder:e=>{var t=[];e.delim!=="."&&t.push(et(e.delim,e.mode));var r=new N("mo",t);e.mclass==="mopen"||e.mclass==="mclose"?r.setAttribute("fence","true"):r.setAttribute("fence","false"),r.setAttribute("stretchy","true");var n=P(kr[e.size]);return r.setAttribute("minsize",n),r.setAttribute("maxsize",n),r}});function Ga(e){if(!e.body)throw new Error("Bug: The leftright ParseNode wasn't fully parsed.")}_({type:"leftright-right",names:["\\right"],props:{numArgs:1,primitive:!0},handler:(e,t)=>{var r=e.parser.gullet.macros.get("\\current@color");if(r&&typeof r!="string")throw new L("\\current@color set to non-string in \\right");return{type:"leftright-right",mode:e.parser.mode,delim:zn(t[0],e).text,color:r}}});_({type:"leftright",names:["\\left"],props:{numArgs:1,primitive:!0},handler:(e,t)=>{var r=zn(t[0],e),n=e.parser;++n.leftrightDepth;var i=n.parseExpression(!1);--n.leftrightDepth,n.expect("\\right",!1);var a=re(n.parseFunction(),"leftright-right");return{type:"leftright",mode:n.mode,body:i,left:r.text,right:a.delim,rightColor:a.color}},htmlBuilder:(e,t)=>{Ga(e);for(var r=ze(e.body,t,!0,["mopen","mclose"]),n=0,i=0,a=!1,l=0;l{Ga(e);var r=Ke(e.body,t);if(e.left!=="."){var n=new N("mo",[et(e.left,e.mode)]);n.setAttribute("fence","true"),r.unshift(n)}if(e.right!=="."){var i=new N("mo",[et(e.right,e.mode)]);i.setAttribute("fence","true"),e.rightColor&&i.setAttribute("mathcolor",e.rightColor),r.push(i)}return gi(r)}});_({type:"middle",names:["\\middle"],props:{numArgs:1,primitive:!0},handler:(e,t)=>{var r=zn(t[0],e);if(!e.parser.leftrightDepth)throw new L("\\middle without preceding \\left",r);return{type:"middle",mode:e.parser.mode,delim:r.text}},htmlBuilder:(e,t)=>{var r;return e.delim==="."?r=zr(t,[]):(r=no(e.delim,1,t,e.mode,[]),r.isMiddle={delim:e.delim,options:t}),r},mathmlBuilder:(e,t)=>{var r=e.delim==="\\vert"||e.delim==="|"?et("|","text"):et(e.delim,e.mode),n=new N("mo",[r]);return n.setAttribute("fence","true"),n.setAttribute("lspace","0.05em"),n.setAttribute("rspace","0.05em"),n}});var Mn=(e,t)=>{var r=nr(ue(e.body,t),t),n=e.label.slice(1),i=t.sizeMultiplier,a,l,s=xt(e.body);if(n==="sout")a=F(["stretchy","sout"]),a.height=t.fontMetrics().defaultRuleThickness/i,l=-.5*t.fontMetrics().xHeight;else if(n==="phase"){var o=ye({number:.6,unit:"pt"},t),u=ye({number:.35,unit:"ex"},t),h=t.havingBaseSizing();i=i/h.sizeMultiplier;var m=r.height+r.depth+o+u;r.style.paddingLeft=P(m/2+o);var d=Math.floor(1e3*m*i),p=Qf(d),y=new yt([new Mt("phase",p)],{width:"400em",height:P(d/1e3),viewBox:"0 0 400000 "+d,preserveAspectRatio:"xMinYMin slice"});a=Et(["hide-tail"],[y],t),a.style.height=P(m),l=r.depth+o+u}else{/cancel/.test(n)?s||r.classes.push("cancel-pad"):n==="angl"?r.classes.push("anglpad"):r.classes.push("boxpad");var w,C,A=0;/box/.test(n)?(A=Math.max(t.fontMetrics().fboxrule,t.minRuleThickness),w=t.fontMetrics().fboxsep+(n==="colorbox"?0:A),C=w):n==="angl"?(A=Math.max(t.fontMetrics().defaultRuleThickness,t.minRuleThickness),w=4*A,C=Math.max(0,.25-r.depth)):(w=s?.2:0,C=w),a=L2(r,n,w,C,t),/fbox|boxed|fcolorbox/.test(n)?(a.style.borderStyle="solid",a.style.borderWidth=P(A)):n==="angl"&&A!==.049&&(a.style.borderTopWidth=P(A),a.style.borderRightWidth=P(A)),l=r.depth+C,e.backgroundColor&&(a.style.backgroundColor=e.backgroundColor,e.borderColor&&(a.style.borderColor=e.borderColor))}var z;if(e.backgroundColor)z=oe({positionType:"individualShift",children:[{type:"elem",elem:a,shift:l},{type:"elem",elem:r,shift:0}]});else{var I=/cancel|phase/.test(n)?["svg-align"]:[];z=oe({positionType:"individualShift",children:[{type:"elem",elem:r,shift:0},{type:"elem",elem:a,shift:l,wrapperClasses:I}]})}return/cancel/.test(n)&&(z.height=r.height,z.depth=r.depth),/cancel/.test(n)&&!s?F(["mord","cancel-lap"],[z],t):F(["mord"],[z],t)},En=(e,t)=>{var r,n=new N(e.label.includes("colorbox")?"mpadded":"menclose",[fe(e.body,t)]);switch(e.label){case"\\cancel":n.setAttribute("notation","updiagonalstrike");break;case"\\bcancel":n.setAttribute("notation","downdiagonalstrike");break;case"\\phase":n.setAttribute("notation","phasorangle");break;case"\\sout":n.setAttribute("notation","horizontalstrike");break;case"\\fbox":n.setAttribute("notation","box");break;case"\\angl":n.setAttribute("notation","actuarial");break;case"\\fcolorbox":case"\\colorbox":if(r=t.fontMetrics().fboxsep*t.fontMetrics().ptPerEm,n.setAttribute("width","+"+2*r+"pt"),n.setAttribute("height","+"+2*r+"pt"),n.setAttribute("lspace",r+"pt"),n.setAttribute("voffset",r+"pt"),e.label==="\\fcolorbox"){var i=Math.max(t.fontMetrics().fboxrule,t.minRuleThickness);n.setAttribute("style","border: "+P(i)+" solid "+e.borderColor)}break;case"\\xcancel":n.setAttribute("notation","updiagonalstrike downdiagonalstrike");break}return e.backgroundColor&&n.setAttribute("mathbackground",e.backgroundColor),n};_({type:"enclose",names:["\\colorbox"],props:{numArgs:2,allowedInText:!0,argTypes:["color","hbox"]},handler(e,t,r){var{parser:n,funcName:i}=e,a=re(t[0],"color-token").color,l=t[1];return{type:"enclose",mode:n.mode,label:i,backgroundColor:a,body:l}},htmlBuilder:Mn,mathmlBuilder:En});_({type:"enclose",names:["\\fcolorbox"],props:{numArgs:3,allowedInText:!0,argTypes:["color","color","hbox"]},handler(e,t,r){var{parser:n,funcName:i}=e,a=re(t[0],"color-token").color,l=re(t[1],"color-token").color,s=t[2];return{type:"enclose",mode:n.mode,label:i,backgroundColor:l,borderColor:a,body:s}},htmlBuilder:Mn,mathmlBuilder:En});_({type:"enclose",names:["\\fbox"],props:{numArgs:1,argTypes:["hbox"],allowedInText:!0},handler(e,t){var{parser:r}=e;return{type:"enclose",mode:r.mode,label:"\\fbox",body:t[0]}}});_({type:"enclose",names:["\\cancel","\\bcancel","\\xcancel","\\phase"],props:{numArgs:1},handler(e,t){var{parser:r,funcName:n}=e,i=t[0];return{type:"enclose",mode:r.mode,label:n,body:i}},htmlBuilder:Mn,mathmlBuilder:En});_({type:"enclose",names:["\\sout"],props:{numArgs:1,allowedInText:!0},handler(e,t){var{parser:r,funcName:n}=e;r.mode==="math"&&r.settings.reportNonstrict("mathVsSout","LaTeX's \\sout works only in text mode");var i=t[0];return{type:"enclose",mode:r.mode,label:n,body:i}},htmlBuilder:Mn,mathmlBuilder:En});_({type:"enclose",names:["\\angl"],props:{numArgs:1,argTypes:["hbox"],allowedInText:!1},handler(e,t){var{parser:r}=e;return{type:"enclose",mode:r.mode,label:"\\angl",body:t[0]}}});var lo={};function ut(e){for(var{type:t,names:r,props:n,handler:i,htmlBuilder:a,mathmlBuilder:l}=e,s={type:t,numArgs:n.numArgs||0,allowedInText:!1,numOptionalArgs:0,handler:i},o=0;o{var t=e.parser.settings;if(!t.displayMode)throw new L("{"+e.envName+"} can be used only in display mode.")},t5=new Set(["gather","gather*"]);function xi(e){if(!e.includes("ed"))return!e.includes("*")}function Bt(e,t,r){var{hskipBeforeAndAfter:n,addJot:i,cols:a,arraystretch:l,colSeparationType:s,autoTag:o,singleRow:u,emptySingleRow:h,maxNumCols:m,leqno:d}=t;if(e.gullet.beginGroup(),u||e.gullet.macros.set("\\cr","\\\\\\relax"),!l){var p=e.gullet.expandMacroAsText("\\arraystretch");if(p==null)l=1;else if(l=parseFloat(p),!l||l<0)throw new L("Invalid \\arraystretch: "+p)}e.gullet.beginGroup();var y=[],w=[y],C=[],A=[],z=o!=null?[]:void 0;function I(){o&&e.gullet.macros.set("\\@eqnsw","1",!0)}function q(){z&&(e.gullet.macros.get("\\df@tag")?(z.push(e.subparse([new We("\\df@tag")])),e.gullet.macros.set("\\df@tag",void 0,!0)):z.push(!!o&&e.gullet.macros.get("\\@eqnsw")==="1"))}for(I(),A.push(Wa(e));;){var O=e.parseExpression(!1,u?"\\end":"\\\\");e.gullet.endGroup(),e.gullet.beginGroup();var M={type:"ordgroup",mode:e.mode,body:O};r&&(M={type:"styling",mode:e.mode,style:r,resetFont:!0,body:[M]}),y.push(M);var G=e.fetch().text;if(G==="&"){if(m&&y.length===m){if(u||s)throw new L("Too many tab characters: &",e.nextToken);e.settings.reportNonstrict("textEnv","Too few columns specified in the {array} column argument.")}e.consume()}else if(G==="\\end"){q(),y.length===1&&M.type==="styling"&&M.body.length===1&&M.body[0].type==="ordgroup"&&M.body[0].body.length===0&&(w.length>1||!h)&&w.pop(),A.length0&&(I+=.25),u.push({pos:I,isDashed:Q[ne]})}for(q(l[0]),n=0;n0&&(V+=z,GQ))for(n=0;n=s)){var Ue=void 0;if(i>0||t.hskipBeforeAndAfter){var mt,Ft;Ue=(mt=(Ft=S)==null?void 0:Ft.pregap)!=null?mt:d,Ue!==0&&(H=F(["arraycolsep"],[]),H.style.width=P(Ue),Y.push(H))}var Rr=[];for(n=0;n0){for(var Bn=rr("hline",r,h),Fn=rr("hdashline",r,h),hr=[{type:"elem",elem:Rt,shift:0}];u.length>0;){var qr=u.pop(),Hr=qr.pos-$;qr.isDashed?hr.push({type:"elem",elem:Fn,shift:Hr}):hr.push({type:"elem",elem:Bn,shift:Hr})}Rt=oe({positionType:"individualShift",children:hr})}if(pe.length===0)return F(["mord"],[Rt],r);var D=oe({positionType:"individualShift",children:pe}),j=F(["tag"],[D],r);return kt([Rt,j])},r5={c:"center ",l:"left ",r:"right "},ht=function(t,r){for(var n=[],i=new N("mtd",[],["mtr-glue"]),a=new N("mtd",[],["mml-eqn-num"]),l=0;l0){var y=t.cols,w="",C=!1,A=0,z=y.length;y[0].type==="separator"&&(d+="top ",A=1),y[y.length-1].type==="separator"&&(d+="bottom ",z-=1);for(var I=A;I0?"left ":"",d+=U[U.length-1].length>0?"right ":"";for(var E=1;E0&&p&&(C=1),n[y]={type:"align",align:w,pregap:C,postgap:0}}return l.colSeparationType=p?"align":"alignat",l};ut({type:"array",names:["array","darray"],props:{numArgs:1},handler(e,t){var r=Tn(t[0]),n=r?[t[0]]:re(t[0],"ordgroup").body,i=n.map(function(l){var s=An(l),o=s.text;if("lcr".includes(o))return{type:"align",align:o};if(o==="|")return{type:"separator",separator:"|"};if(o===":")return{type:"separator",separator:":"};throw new L("Unknown column alignment: "+o,l)}),a={cols:i,hskipBeforeAndAfter:!0,maxNumCols:i.length};return Bt(e.parser,a,wi(e.envName))},htmlBuilder:ct,mathmlBuilder:ht});ut({type:"array",names:["matrix","pmatrix","bmatrix","Bmatrix","vmatrix","Vmatrix","matrix*","pmatrix*","bmatrix*","Bmatrix*","vmatrix*","Vmatrix*"],props:{numArgs:0},handler(e){var t={matrix:null,pmatrix:["(",")"],bmatrix:["[","]"],Bmatrix:["\\{","\\}"],vmatrix:["|","|"],Vmatrix:["\\Vert","\\Vert"]}[e.envName.replace("*","")],r="c",n={hskipBeforeAndAfter:!1,cols:[{type:"align",align:r}]};if(e.envName.charAt(e.envName.length-1)==="*"){var i=e.parser;if(i.consumeSpaces(),i.fetch().text==="["){if(i.consume(),i.consumeSpaces(),r=i.fetch().text,!"lcr".includes(r))throw new L("Expected l or c or r",i.nextToken);i.consume(),i.consumeSpaces(),i.expect("]"),i.consume(),n.cols=[{type:"align",align:r}]}}var a=Bt(e.parser,n,wi(e.envName)),l=Math.max(0,...a.body.map(s=>s.length));return a.cols=new Array(l).fill({type:"align",align:r}),t?{type:"leftright",mode:e.mode,body:[a],left:t[0],right:t[1],rightColor:void 0}:a},htmlBuilder:ct,mathmlBuilder:ht});ut({type:"array",names:["smallmatrix"],props:{numArgs:0},handler(e){var t={arraystretch:.5},r=Bt(e.parser,t,"script");return r.colSeparationType="small",r},htmlBuilder:ct,mathmlBuilder:ht});ut({type:"array",names:["subarray"],props:{numArgs:1},handler(e,t){var r=Tn(t[0]),n=r?[t[0]]:re(t[0],"ordgroup").body,i=n.map(function(s){var o=An(s),u=o.text;if("lc".includes(u))return{type:"align",align:u};throw new L("Unknown column alignment: "+u,s)});if(i.length>1)throw new L("{subarray} can contain only one column");var a={cols:i,hskipBeforeAndAfter:!1,arraystretch:.5},l=Bt(e.parser,a,"script");if(l.body.length>0&&l.body[0].length>1)throw new L("{subarray} can contain only one column");return l},htmlBuilder:ct,mathmlBuilder:ht});ut({type:"array",names:["cases","dcases","rcases","drcases"],props:{numArgs:0},handler(e){var t={arraystretch:1.2,cols:[{type:"align",align:"l",pregap:0,postgap:1},{type:"align",align:"l",pregap:0,postgap:0}]},r=Bt(e.parser,t,wi(e.envName));return{type:"leftright",mode:e.mode,body:[r],left:e.envName.includes("r")?".":"\\{",right:e.envName.includes("r")?"\\}":".",rightColor:void 0}},htmlBuilder:ct,mathmlBuilder:ht});ut({type:"array",names:["align","align*","aligned","split"],props:{numArgs:0},handler:oo,htmlBuilder:ct,mathmlBuilder:ht});ut({type:"array",names:["gathered","gather","gather*"],props:{numArgs:0},handler(e){t5.has(e.envName)&&In(e);var t={cols:[{type:"align",align:"c"}],addJot:!0,colSeparationType:"gather",autoTag:xi(e.envName),emptySingleRow:!0,leqno:e.parser.settings.leqno};return Bt(e.parser,t,"display")},htmlBuilder:ct,mathmlBuilder:ht});ut({type:"array",names:["alignat","alignat*","alignedat"],props:{numArgs:1},handler:oo,htmlBuilder:ct,mathmlBuilder:ht});ut({type:"array",names:["equation","equation*"],props:{numArgs:0},handler(e){In(e);var t={autoTag:xi(e.envName),emptySingleRow:!0,singleRow:!0,maxNumCols:1,leqno:e.parser.settings.leqno};return Bt(e.parser,t,"display")},htmlBuilder:ct,mathmlBuilder:ht});ut({type:"array",names:["CD"],props:{numArgs:0},handler(e){return In(e),U2(e.parser)},htmlBuilder:ct,mathmlBuilder:ht});v("\\nonumber","\\gdef\\@eqnsw{0}");v("\\notag","\\nonumber");_({type:"text",names:["\\hline","\\hdashline"],props:{numArgs:0,allowedInText:!0,allowedInMath:!0},handler(e,t){throw new L(e.funcName+" valid only within array environment")}});var Xa=lo;_({type:"environment",names:["\\begin","\\end"],props:{numArgs:1,argTypes:["text"]},handler(e,t){var{parser:r,funcName:n}=e,i=t[0];if(i.type!=="ordgroup")throw new L("Invalid environment name",i);for(var a="",l=0;l{var r=e.font,n=t.withFont(r);return ue(e.body,n)},co=(e,t)=>{var r=e.font,n=t.withFont(r);return fe(e.body,n)},Ya={"\\Bbb":"\\mathbb","\\bold":"\\mathbf","\\frak":"\\mathfrak"};_({type:"font",names:["\\mathrm","\\mathit","\\mathbf","\\mathnormal","\\mathsfit","\\mathbb","\\mathcal","\\mathfrak","\\mathscr","\\mathsf","\\mathtt","\\Bbb","\\bold","\\frak"],props:{numArgs:1,allowedInArgument:!0},handler:(e,t)=>{var{parser:r,funcName:n}=e,i=hn(t[0]),a=n;return a in Ya&&(a=Ya[a]),{type:"font",mode:r.mode,font:a.slice(1),body:i}},htmlBuilder:uo,mathmlBuilder:co});_({type:"mclass",names:["\\boldsymbol","\\bm"],props:{numArgs:1},handler:(e,t)=>{var{parser:r}=e,n=t[0];return{type:"mclass",mode:r.mode,mclass:Cn(n),body:[{type:"font",mode:r.mode,font:"boldsymbol",body:n}],isCharacterBox:xt(n)}}});_({type:"font",names:["\\rm","\\sf","\\tt","\\bf","\\it","\\cal"],props:{numArgs:0,allowedInText:!0},handler:(e,t)=>{var{parser:r,funcName:n,breakOnTokenText:i}=e,{mode:a}=r,l=r.parseExpression(!0,i);return{type:"font",mode:a,font:"math"+n.slice(1),body:{type:"ordgroup",mode:r.mode,body:l}}},htmlBuilder:uo,mathmlBuilder:co});var n5=(e,t)=>{var r=t.style,n=r.fracNum(),i=r.fracDen(),a;a=t.havingStyle(n);var l=ue(e.numer,a,t);if(e.continued){var s=8.5/t.fontMetrics().ptPerEm,o=3.5/t.fontMetrics().ptPerEm;l.height=l.height0?y=3*d:y=7*d,w=t.fontMetrics().denom1):(m>0?(p=t.fontMetrics().num2,y=d):(p=t.fontMetrics().num3,y=3*d),w=t.fontMetrics().denom2);var C;if(h){var z=t.fontMetrics().axisHeight;p-l.depth-(z+.5*m){var r=new N("mfrac",[fe(e.numer,t),fe(e.denom,t)]);if(!e.hasBarLine)r.setAttribute("linethickness","0px");else if(e.barSize){var n=ye(e.barSize,t);r.setAttribute("linethickness",P(n))}if(e.leftDelim!=null||e.rightDelim!=null){var i=[];if(e.leftDelim!=null){var a=new N("mo",[new Se(e.leftDelim.replace("\\",""))]);a.setAttribute("fence","true"),i.push(a)}if(i.push(r),e.rightDelim!=null){var l=new N("mo",[new Se(e.rightDelim.replace("\\",""))]);l.setAttribute("fence","true"),i.push(l)}return gi(i)}return r},ho=(e,t)=>{if(!t)return e;var r={type:"styling",mode:e.mode,style:t,body:[e]};return r};_({type:"genfrac",names:["\\cfrac","\\dfrac","\\frac","\\tfrac","\\dbinom","\\binom","\\tbinom","\\\\atopfrac","\\\\bracefrac","\\\\brackfrac"],props:{numArgs:2,allowedInArgument:!0},handler:(e,t)=>{var{parser:r,funcName:n}=e,i=t[0],a=t[1],l,s=null,o=null;switch(n){case"\\cfrac":case"\\dfrac":case"\\frac":case"\\tfrac":l=!0;break;case"\\\\atopfrac":l=!1;break;case"\\dbinom":case"\\binom":case"\\tbinom":l=!1,s="(",o=")";break;case"\\\\bracefrac":l=!1,s="\\{",o="\\}";break;case"\\\\brackfrac":l=!1,s="[",o="]";break;default:throw new Error("Unrecognized genfrac command")}var u=n==="\\cfrac",h=null;return u||n.startsWith("\\d")?h="display":n.startsWith("\\t")&&(h="text"),ho({type:"genfrac",mode:r.mode,numer:i,denom:a,continued:u,hasBarLine:l,leftDelim:s,rightDelim:o,barSize:null},h)},htmlBuilder:n5,mathmlBuilder:i5});_({type:"infix",names:["\\over","\\choose","\\atop","\\brace","\\brack"],props:{numArgs:0,infix:!0},handler(e){var{parser:t,funcName:r,token:n}=e,i;switch(r){case"\\over":i="\\frac";break;case"\\choose":i="\\binom";break;case"\\atop":i="\\\\atopfrac";break;case"\\brace":i="\\\\bracefrac";break;case"\\brack":i="\\\\brackfrac";break;default:throw new Error("Unrecognized infix genfrac command")}return{type:"infix",mode:t.mode,replaceWith:i,token:n}}});var Ka=["display","text","script","scriptscript"],Za=function(t){var r=null;return t.length>0&&(r=t,r=r==="."?null:r),r};_({type:"genfrac",names:["\\genfrac"],props:{numArgs:6,allowedInArgument:!0,argTypes:["math","math","size","text","math","math"]},handler(e,t){var{parser:r}=e,n=t[4],i=t[5],a=hn(t[0]),l=a.type==="atom"&&a.family==="open"?Za(a.text):null,s=hn(t[1]),o=s.type==="atom"&&s.family==="close"?Za(s.text):null,u=re(t[2],"size"),h,m=null;u.isBlank?h=!0:(m=u.value,h=m.number>0);var d=null,p=t[3];if(p.type==="ordgroup"){if(p.body.length>0){var y=re(p.body[0],"textord");d=Ka[Number(y.text)]}}else p=re(p,"textord"),d=Ka[Number(p.text)];return ho({type:"genfrac",mode:r.mode,numer:n,denom:i,continued:!1,hasBarLine:h,barSize:m,leftDelim:l,rightDelim:o},d)}});_({type:"infix",names:["\\above"],props:{numArgs:1,argTypes:["size"],infix:!0},handler(e,t){var{parser:r,funcName:n,token:i}=e;return{type:"infix",mode:r.mode,replaceWith:"\\\\abovefrac",size:re(t[0],"size").value,token:i}}});_({type:"genfrac",names:["\\\\abovefrac"],props:{numArgs:3,argTypes:["math","size","math"]},handler:(e,t)=>{var{parser:r,funcName:n}=e,i=t[0],a=re(t[1],"infix").size;if(!a)throw new Error("\\\\abovefrac expected size, but got "+String(a));var l=t[2],s=a.number>0;return{type:"genfrac",mode:r.mode,numer:i,denom:l,continued:!1,hasBarLine:s,barSize:a,leftDelim:null,rightDelim:null}}});var mo=(e,t)=>{var r=t.style,n,i;e.type==="supsub"?(n=e.sup?ue(e.sup,t.havingStyle(r.sup()),t):ue(e.sub,t.havingStyle(r.sub()),t),i=re(e.base,"horizBrace")):i=re(e,"horizBrace");var a=ue(i.base,t.havingBaseStyle(te.DISPLAY)),l=Sn(i,t),s;if(i.isOver?s=oe({positionType:"firstBaseline",children:[{type:"elem",elem:a},{type:"kern",size:.1},{type:"elem",elem:l,wrapperClasses:["svg-align"]}]}):s=oe({positionType:"bottom",positionData:a.depth+.1+l.height,children:[{type:"elem",elem:l,wrapperClasses:["svg-align"]},{type:"kern",size:.1},{type:"elem",elem:a}]}),n){var o=F(["minner",i.isOver?"mover":"munder"],[s],t);i.isOver?s=oe({positionType:"firstBaseline",children:[{type:"elem",elem:o},{type:"kern",size:.2},{type:"elem",elem:n}]}):s=oe({positionType:"bottom",positionData:o.depth+.2+n.height+n.depth,children:[{type:"elem",elem:n},{type:"kern",size:.2},{type:"elem",elem:o}]})}return F(["minner",i.isOver?"mover":"munder"],[s],t)},a5=(e,t)=>{var r=kn(e.label);return new N(e.isOver?"mover":"munder",[fe(e.base,t),r])};_({type:"horizBrace",names:["\\overbrace","\\underbrace","\\overbracket","\\underbracket"],props:{numArgs:1},handler(e,t){var{parser:r,funcName:n}=e;return{type:"horizBrace",mode:r.mode,label:n,isOver:n.includes("\\over"),base:t[0]}},htmlBuilder:mo,mathmlBuilder:a5});_({type:"href",names:["\\href"],props:{numArgs:2,argTypes:["url","original"],allowedInText:!0},handler:(e,t)=>{var{parser:r}=e,n=t[1],i=re(t[0],"url").url;return r.settings.isTrusted({command:"\\href",url:i})?{type:"href",mode:r.mode,href:i,body:ke(n)}:r.formatUnsupportedCmd("\\href")},htmlBuilder:(e,t)=>{var r=ze(e.body,t,!1);return y2(e.href,[],r,t)},mathmlBuilder:(e,t)=>{var r=It(e.body,t);return r instanceof N||(r=new N("mrow",[r])),r.setAttribute("href",e.href),r}});_({type:"href",names:["\\url"],props:{numArgs:1,argTypes:["url"],allowedInText:!0},handler:(e,t)=>{var{parser:r}=e,n=re(t[0],"url").url;if(!r.settings.isTrusted({command:"\\url",url:n}))return r.formatUnsupportedCmd("\\url");for(var i=[],a=0;a{var{parser:r,funcName:n,token:i}=e,a=re(t[0],"raw").string,l=t[1];r.settings.strict&&r.settings.reportNonstrict("htmlExtension","HTML extension is disabled on strict mode");var s,o={};switch(n){case"\\htmlClass":o.class=a,s={command:"\\htmlClass",class:a};break;case"\\htmlId":o.id=a,s={command:"\\htmlId",id:a};break;case"\\htmlStyle":o.style=a,s={command:"\\htmlStyle",style:a};break;case"\\htmlData":{for(var u=a.split(","),h=0;h{var r=ze(e.body,t,!1),n=["enclosing"];e.attributes.class&&n.push(...e.attributes.class.trim().split(/\s+/));var i=F(n,r,t);for(var a in e.attributes)a!=="class"&&e.attributes.hasOwnProperty(a)&&i.setAttribute(a,e.attributes[a]);return i},mathmlBuilder:(e,t)=>It(e.body,t)});_({type:"htmlmathml",names:["\\html@mathml"],props:{numArgs:2,allowedInArgument:!0,allowedInText:!0},handler:(e,t)=>{var{parser:r}=e;return{type:"htmlmathml",mode:r.mode,html:ke(t[0]),mathml:ke(t[1])}},htmlBuilder:(e,t)=>{var r=ze(e.html,t,!1);return kt(r)},mathmlBuilder:(e,t)=>It(e.mathml,t)});var c0=function(t){if(/^[-+]? *(\d+(\.\d*)?|\.\d+)$/.test(t))return{number:+t,unit:"bp"};var r=/([-+]?) *(\d+(?:\.\d*)?|\.\d+) *([a-z]{2})/.exec(t);if(!r)throw new L("Invalid size: '"+t+"' in \\includegraphics");var n={number:+(r[1]+r[2]),unit:r[3]};if(!Es(n))throw new L("Invalid unit: '"+n.unit+"' in \\includegraphics.");return n};_({type:"includegraphics",names:["\\includegraphics"],props:{numArgs:1,numOptionalArgs:1,argTypes:["raw","url"],allowedInText:!1},handler:(e,t,r)=>{var{parser:n}=e,i={number:0,unit:"em"},a={number:.9,unit:"em"},l={number:0,unit:"em"},s="";if(r[0])for(var o=re(r[0],"raw").string,u=o.split(","),h=0;h{var r=ye(e.height,t),n=0;e.totalheight.number>0&&(n=ye(e.totalheight,t)-r);var i=0;e.width.number>0&&(i=ye(e.width,t));var a={height:P(r+n)};i>0&&(a.width=P(i)),n>0&&(a.verticalAlign=P(-n));var l=new l2(e.src,e.alt,a);return l.height=r,l.depth=n,l},mathmlBuilder:(e,t)=>{var r=new N("mglyph",[]);r.setAttribute("alt",e.alt);var n=ye(e.height,t),i=0;if(e.totalheight.number>0&&(i=ye(e.totalheight,t)-n,r.setAttribute("valign",P(-i))),r.setAttribute("height",P(n+i)),e.width.number>0){var a=ye(e.width,t);r.setAttribute("width",P(a))}return r.setAttribute("src",e.src),r}});_({type:"kern",names:["\\kern","\\mkern","\\hskip","\\mskip"],props:{numArgs:1,argTypes:["size"],primitive:!0,allowedInText:!0},handler(e,t){var{parser:r,funcName:n}=e,i=re(t[0],"size");if(r.settings.strict){var a=n[1]==="m",l=i.value.unit==="mu";a?(l||r.settings.reportNonstrict("mathVsTextUnits","LaTeX's "+n+" supports only mu units, "+("not "+i.value.unit+" units")),r.mode!=="math"&&r.settings.reportNonstrict("mathVsTextUnits","LaTeX's "+n+" works only in math mode")):l&&r.settings.reportNonstrict("mathVsTextUnits","LaTeX's "+n+" doesn't support mu units")}return{type:"kern",mode:r.mode,dimension:i.value}},htmlBuilder(e,t){return Ls(e.dimension,t)},mathmlBuilder(e,t){var r=ye(e.dimension,t);return new js(r)}});_({type:"lap",names:["\\mathllap","\\mathrlap","\\mathclap"],props:{numArgs:1,allowedInText:!0},handler:(e,t)=>{var{parser:r,funcName:n}=e,i=t[0];return{type:"lap",mode:r.mode,alignment:n.slice(5),body:i}},htmlBuilder:(e,t)=>{var r;e.alignment==="clap"?(r=F([],[ue(e.body,t)]),r=F(["inner"],[r],t)):r=F(["inner"],[ue(e.body,t)]);var n=F(["fix"],[]),i=F([e.alignment],[r,n],t),a=F(["strut"]);return a.style.height=P(i.height+i.depth),i.depth&&(a.style.verticalAlign=P(-i.depth)),i.children.unshift(a),i=F(["thinbox"],[i],t),F(["mord","vbox"],[i],t)},mathmlBuilder:(e,t)=>{var r=new N("mpadded",[fe(e.body,t)]);if(e.alignment!=="rlap"){var n=e.alignment==="llap"?"-1":"-0.5";r.setAttribute("lspace",n+"width")}return r.setAttribute("width","0px"),r}});_({type:"styling",names:["\\(","$"],props:{numArgs:0,allowedInText:!0,allowedInMath:!1},handler(e,t){var{funcName:r,parser:n}=e,i=n.mode;n.switchMode("math");var a=r==="\\("?"\\)":"$",l=n.parseExpression(!1,a);return n.expect(a),n.switchMode(i),{type:"styling",mode:n.mode,style:"text",resetFont:!0,body:l}}});_({type:"text",names:["\\)","\\]"],props:{numArgs:0,allowedInText:!0,allowedInMath:!1},handler(e,t){throw new L("Mismatched "+e.funcName)}});var Qa=(e,t)=>{switch(t.style.size){case te.DISPLAY.size:return e.display;case te.TEXT.size:return e.text;case te.SCRIPT.size:return e.script;case te.SCRIPTSCRIPT.size:return e.scriptscript;default:return e.text}};_({type:"mathchoice",names:["\\mathchoice"],props:{numArgs:4,primitive:!0},handler:(e,t)=>{var{parser:r}=e;return{type:"mathchoice",mode:r.mode,display:ke(t[0]),text:ke(t[1]),script:ke(t[2]),scriptscript:ke(t[3])}},htmlBuilder:(e,t)=>{var r=Qa(e,t),n=ze(r,t,!1);return kt(n)},mathmlBuilder:(e,t)=>{var r=Qa(e,t);return It(r,t)}});var fo=(e,t,r,n,i,a,l)=>{e=F([],[e]);var s=r&&xt(r),o,u;if(t){var h=ue(t,n.havingStyle(i.sup()),n);u={elem:h,kern:Math.max(n.fontMetrics().bigOpSpacing1,n.fontMetrics().bigOpSpacing3-h.depth)}}if(r){var m=ue(r,n.havingStyle(i.sub()),n);o={elem:m,kern:Math.max(n.fontMetrics().bigOpSpacing2,n.fontMetrics().bigOpSpacing4-m.height)}}var d;if(u&&o){var p=n.fontMetrics().bigOpSpacing5+o.elem.height+o.elem.depth+o.kern+e.depth+l;d=oe({positionType:"bottom",positionData:p,children:[{type:"kern",size:n.fontMetrics().bigOpSpacing5},{type:"elem",elem:o.elem,marginLeft:P(-a)},{type:"kern",size:o.kern},{type:"elem",elem:e},{type:"kern",size:u.kern},{type:"elem",elem:u.elem,marginLeft:P(a)},{type:"kern",size:n.fontMetrics().bigOpSpacing5}]})}else if(o){var y=e.height-l;d=oe({positionType:"top",positionData:y,children:[{type:"kern",size:n.fontMetrics().bigOpSpacing5},{type:"elem",elem:o.elem,marginLeft:P(-a)},{type:"kern",size:o.kern},{type:"elem",elem:e}]})}else if(u){var w=e.depth+l;d=oe({positionType:"bottom",positionData:w,children:[{type:"elem",elem:e},{type:"kern",size:u.kern},{type:"elem",elem:u.elem,marginLeft:P(a)},{type:"kern",size:n.fontMetrics().bigOpSpacing5}]})}else return e;var C=[d];if(o&&a!==0&&!s){var A=F(["mspace"],[],n);A.style.marginRight=P(a),C.unshift(A)}return F(["mop","op-limits"],C,n)},po=new Set(["\\smallint"]),ur=(e,t)=>{var r,n,i=!1,a;e.type==="supsub"?(r=e.sup,n=e.sub,a=re(e.base,"op"),i=!0):a=re(e,"op");var l=t.style,s=!1;l.size===te.DISPLAY.size&&a.symbol&&!po.has(a.name)&&(s=!0);var o,u;if(a.symbol){var h=s?"Size2-Regular":"Size1-Regular",m="";if((a.name==="\\oiint"||a.name==="\\oiiint")&&(m=a.name.slice(1),a.name=m==="oiint"?"\\iint":"\\iiint"),o=Le(a.name,h,"math",t,["mop","op-symbol",s?"large-op":"small-op"]),u=o.italic,m.length>0){var d=Ps(m+"Size"+(s?"2":"1"),t);o=oe({positionType:"individualShift",children:[{type:"elem",elem:o,shift:0},{type:"elem",elem:d,shift:s?.08:0}]}),a.name="\\"+m,o.classes.unshift("mop"),o.italic=u}}else if(a.body){var p=ze(a.body,t,!0);p.length===1&&p[0]instanceof Xe?(o=p[0],o.classes[0]="mop"):o=F(["mop"],p,t)}else{for(var y=[],w=1;w{var r;if(e.symbol)r=new N("mo",[et(e.name,e.mode)]),po.has(e.name)&&r.setAttribute("largeop","false");else if(e.body)r=new N("mo",Ke(e.body,t));else{r=new N("mi",[new Se(e.name.slice(1))]);var n=new N("mo",[et("⁡","text")]);e.parentIsSupSub?r=new N("mrow",[r,n]):r=Hs([r,n])}return r},l5={"∏":"\\prod","∐":"\\coprod","∑":"\\sum","⋀":"\\bigwedge","⋁":"\\bigvee","⋂":"\\bigcap","⋃":"\\bigcup","⨀":"\\bigodot","⨁":"\\bigoplus","⨂":"\\bigotimes","⨄":"\\biguplus","⨆":"\\bigsqcup"};_({type:"op",names:["\\coprod","\\bigvee","\\bigwedge","\\biguplus","\\bigcap","\\bigcup","\\intop","\\prod","\\sum","\\bigotimes","\\bigoplus","\\bigodot","\\bigsqcup","\\smallint","∏","∐","∑","⋀","⋁","⋂","⋃","⨀","⨁","⨂","⨄","⨆"],props:{numArgs:0},handler:(e,t)=>{var{parser:r,funcName:n}=e,i=n;return i.length===1&&(i=l5[i]),{type:"op",mode:r.mode,limits:!0,parentIsSupSub:!1,symbol:!0,name:i}},htmlBuilder:ur,mathmlBuilder:Fr});_({type:"op",names:["\\mathop"],props:{numArgs:1,primitive:!0},handler:(e,t)=>{var{parser:r}=e,n=t[0];return{type:"op",mode:r.mode,limits:!1,parentIsSupSub:!1,symbol:!1,body:ke(n)}},htmlBuilder:ur,mathmlBuilder:Fr});var s5={"∫":"\\int","∬":"\\iint","∭":"\\iiint","∮":"\\oint","∯":"\\oiint","∰":"\\oiiint"};_({type:"op",names:["\\arcsin","\\arccos","\\arctan","\\arctg","\\arcctg","\\arg","\\ch","\\cos","\\cosec","\\cosh","\\cot","\\cotg","\\coth","\\csc","\\ctg","\\cth","\\deg","\\dim","\\exp","\\hom","\\ker","\\lg","\\ln","\\log","\\sec","\\sin","\\sinh","\\sh","\\tan","\\tanh","\\tg","\\th"],props:{numArgs:0},handler(e){var{parser:t,funcName:r}=e;return{type:"op",mode:t.mode,limits:!1,parentIsSupSub:!1,symbol:!1,name:r}},htmlBuilder:ur,mathmlBuilder:Fr});_({type:"op",names:["\\det","\\gcd","\\inf","\\lim","\\max","\\min","\\Pr","\\sup"],props:{numArgs:0},handler(e){var{parser:t,funcName:r}=e;return{type:"op",mode:t.mode,limits:!0,parentIsSupSub:!1,symbol:!1,name:r}},htmlBuilder:ur,mathmlBuilder:Fr});_({type:"op",names:["\\int","\\iint","\\iiint","\\oint","\\oiint","\\oiiint","∫","∬","∭","∮","∯","∰"],props:{numArgs:0,allowedInArgument:!0},handler(e){var{parser:t,funcName:r}=e,n=r;return n.length===1&&(n=s5[n]),{type:"op",mode:t.mode,limits:!1,parentIsSupSub:!1,symbol:!0,name:n}},htmlBuilder:ur,mathmlBuilder:Fr});var go=(e,t)=>{var r,n,i=!1,a;e.type==="supsub"?(r=e.sup,n=e.sub,a=re(e.base,"operatorname"),i=!0):a=re(e,"operatorname");var l;if(a.body.length>0){for(var s=a.body.map(m=>{var d="text"in m?m.text:void 0;return typeof d=="string"?{type:"textord",mode:m.mode,text:d}:m}),o=ze(s,t.withFont("mathrm"),!0),u=0;u{for(var r=Ke(e.body,t.withFont("mathrm")),n=!0,i=0;ih.toText()).join("");r=[new Se(s)]}var o=new N("mi",r);o.setAttribute("mathvariant","normal");var u=new N("mo",[et("⁡","text")]);return e.parentIsSupSub?new N("mrow",[o,u]):Hs([o,u])};_({type:"operatorname",names:["\\operatorname@","\\operatornamewithlimits"],props:{numArgs:1},handler:(e,t)=>{var{parser:r,funcName:n}=e,i=t[0];return{type:"operatorname",mode:r.mode,body:ke(i),alwaysHandleSupSub:n==="\\operatornamewithlimits",limits:!1,parentIsSupSub:!1}},htmlBuilder:go,mathmlBuilder:o5});v("\\operatorname","\\@ifstar\\operatornamewithlimits\\operatorname@");Gt({type:"ordgroup",htmlBuilder(e,t){return e.semisimple?kt(ze(e.body,t,!1)):F(["mord"],ze(e.body,t,!0),t)},mathmlBuilder(e,t){return It(e.body,t,!0)}});_({type:"overline",names:["\\overline"],props:{numArgs:1},handler(e,t){var{parser:r}=e,n=t[0];return{type:"overline",mode:r.mode,body:n}},htmlBuilder(e,t){var r=ue(e.body,t.havingCrampedStyle()),n=rr("overline-line",t),i=t.fontMetrics().defaultRuleThickness,a=oe({positionType:"firstBaseline",children:[{type:"elem",elem:r},{type:"kern",size:3*i},{type:"elem",elem:n},{type:"kern",size:i}]});return F(["mord","overline"],[a],t)},mathmlBuilder(e,t){var r=new N("mo",[new Se("‾")]);r.setAttribute("stretchy","true");var n=new N("mover",[fe(e.body,t),r]);return n.setAttribute("accent","true"),n}});_({type:"phantom",names:["\\phantom"],props:{numArgs:1,allowedInText:!0},handler:(e,t)=>{var{parser:r}=e,n=t[0];return{type:"phantom",mode:r.mode,body:ke(n)}},htmlBuilder:(e,t)=>{var r=ze(e.body,t.withPhantom(),!1);return kt(r)},mathmlBuilder:(e,t)=>{var r=Ke(e.body,t);return new N("mphantom",r)}});v("\\hphantom","\\smash{\\phantom{#1}}");_({type:"vphantom",names:["\\vphantom"],props:{numArgs:1,allowedInText:!0},handler:(e,t)=>{var{parser:r}=e,n=t[0];return{type:"vphantom",mode:r.mode,body:n}},htmlBuilder:(e,t)=>{var r=F(["inner"],[ue(e.body,t.withPhantom())]),n=F(["fix"],[]);return F(["mord","rlap"],[r,n],t)},mathmlBuilder:(e,t)=>{var r=Ke(ke(e.body),t),n=new N("mphantom",r),i=new N("mpadded",[n]);return i.setAttribute("width","0px"),i}});_({type:"raisebox",names:["\\raisebox"],props:{numArgs:2,argTypes:["size","hbox"],allowedInText:!0},handler(e,t){var{parser:r}=e,n=re(t[0],"size").value,i=t[1];return{type:"raisebox",mode:r.mode,dy:n,body:i}},htmlBuilder(e,t){var r=ue(e.body,t),n=ye(e.dy,t);return oe({positionType:"shift",positionData:-n,children:[{type:"elem",elem:r}]})},mathmlBuilder(e,t){var r=new N("mpadded",[fe(e.body,t)]),n=e.dy.number+e.dy.unit;return r.setAttribute("voffset",n),r}});_({type:"internal",names:["\\relax"],props:{numArgs:0,allowedInText:!0,allowedInArgument:!0},handler(e){var{parser:t}=e;return{type:"internal",mode:t.mode}}});_({type:"rule",names:["\\rule"],props:{numArgs:2,numOptionalArgs:1,allowedInText:!0,allowedInMath:!0,argTypes:["size","size","size"]},handler(e,t,r){var{parser:n}=e,i=r[0],a=re(t[0],"size"),l=re(t[1],"size");return{type:"rule",mode:n.mode,shift:i&&re(i,"size").value,width:a.value,height:l.value}},htmlBuilder(e,t){var r=F(["mord","rule"],[],t),n=ye(e.width,t),i=ye(e.height,t),a=e.shift?ye(e.shift,t):0;return r.style.borderRightWidth=P(n),r.style.borderTopWidth=P(i),r.style.bottom=P(a),r.width=n,r.height=i+a,r.depth=-a,r.maxFontSize=i*1.125*t.sizeMultiplier,r},mathmlBuilder(e,t){var r=ye(e.width,t),n=ye(e.height,t),i=e.shift?ye(e.shift,t):0,a=t.color&&t.getColor()||"black",l=new N("mspace");l.setAttribute("mathbackground",a),l.setAttribute("width",P(r)),l.setAttribute("height",P(n));var s=new N("mpadded",[l]);return i>=0?s.setAttribute("height",P(i)):(s.setAttribute("height",P(i)),s.setAttribute("depth",P(-i))),s.setAttribute("voffset",P(i)),s}});function vo(e,t,r){for(var n=ze(e,t,!1),i=t.sizeMultiplier/r.sizeMultiplier,a=0;a{var r=t.havingSize(e.size);return vo(e.body,r,t)};_({type:"sizing",names:Ja,props:{numArgs:0,allowedInText:!0},handler:(e,t)=>{var{breakOnTokenText:r,funcName:n,parser:i}=e,a=i.parseExpression(!1,r);return{type:"sizing",mode:i.mode,size:Ja.indexOf(n)+1,body:a}},htmlBuilder:u5,mathmlBuilder:(e,t)=>{var r=t.havingSize(e.size),n=Ke(e.body,r),i=new N("mstyle",n);return i.setAttribute("mathsize",P(r.sizeMultiplier)),i}});_({type:"smash",names:["\\smash"],props:{numArgs:1,numOptionalArgs:1,allowedInText:!0},handler:(e,t,r)=>{var{parser:n}=e,i=!1,a=!1,l=r[0]&&re(r[0],"ordgroup");if(l)for(var s,o=0;o{var r=F([],[ue(e.body,t)]);if(!e.smashHeight&&!e.smashDepth)return r;if(e.smashHeight&&(r.height=0),e.smashDepth&&(r.depth=0),e.smashHeight&&e.smashDepth)return F(["mord","smash"],[r],t);if(r.children)for(var n=0;n{var r=new N("mpadded",[fe(e.body,t)]);return e.smashHeight&&r.setAttribute("height","0px"),e.smashDepth&&r.setAttribute("depth","0px"),r}});_({type:"sqrt",names:["\\sqrt"],props:{numArgs:1,numOptionalArgs:1},handler(e,t,r){var{parser:n}=e,i=r[0],a=t[0];return{type:"sqrt",mode:n.mode,body:a,index:i}},htmlBuilder(e,t){var r=ue(e.body,t.havingCrampedStyle());r.height===0&&(r.height=t.fontMetrics().xHeight),r=nr(r,t);var n=t.fontMetrics(),i=n.defaultRuleThickness,a=i;t.style.idr.height+r.depth+l&&(l=(l+m-r.height-r.depth)/2);var d=o.height-r.height-l-u;r.style.paddingLeft=P(h);var p=oe({positionType:"firstBaseline",children:[{type:"elem",elem:r,wrapperClasses:["svg-align"]},{type:"kern",size:-(r.height+d)},{type:"elem",elem:o},{type:"kern",size:u}]});if(e.index){var y=t.havingStyle(te.SCRIPTSCRIPT),w=ue(e.index,y,t),C=.6*(p.height-p.depth),A=oe({positionType:"shift",positionData:-C,children:[{type:"elem",elem:w}]}),z=F(["root"],[A]);return F(["mord","sqrt"],[z,p],t)}else return F(["mord","sqrt"],[p],t)},mathmlBuilder(e,t){var{body:r,index:n}=e;return n?new N("mroot",[fe(r,t),fe(n,t)]):new N("msqrt",[fe(r,t)])}});var U0={display:te.DISPLAY,text:te.TEXT,script:te.SCRIPT,scriptscript:te.SCRIPTSCRIPT};function c5(e){return e in U0}_({type:"styling",names:["\\displaystyle","\\textstyle","\\scriptstyle","\\scriptscriptstyle"],props:{numArgs:0,allowedInText:!0,primitive:!0},handler(e,t){var{breakOnTokenText:r,funcName:n,parser:i}=e,a=i.parseExpression(!0,r),l=n.slice(1,n.length-5);if(!c5(l))throw new Error("Unknown style: "+l);return{type:"styling",mode:i.mode,style:l,body:a}},htmlBuilder(e,t){var r=U0[e.style],n=t.havingStyle(r);return e.resetFont&&(n=n.withFont("")),vo(e.body,n,t)},mathmlBuilder(e,t){var r=U0[e.style],n=t.havingStyle(r);e.resetFont&&(n=n.withFont(""));var i=Ke(e.body,n),a=new N("mstyle",i),l={display:["0","true"],text:["0","false"],script:["1","false"],scriptscript:["2","false"]},s=l[e.style];return a.setAttribute("scriptlevel",s[0]),a.setAttribute("displaystyle",s[1]),a}});var h5=function(t,r){var n=t.base;if(n)if(n.type==="op"){var i=n.limits&&(r.style.size===te.DISPLAY.size||n.alwaysHandleSupSub);return i?ur:null}else if(n.type==="operatorname"){var a=n.alwaysHandleSupSub&&(r.style.size===te.DISPLAY.size||n.limits);return a?go:null}else{if(n.type==="accent")return xt(n.base)?yi:null;if(n.type==="horizBrace"){var l=!t.sub;return l===n.isOver?mo:null}else return null}else return null};Gt({type:"supsub",htmlBuilder(e,t){var r=h5(e,t);if(r)return r(e,t);var{base:n,sup:i,sub:a}=e,l=ue(n,t),s,o,u=t.fontMetrics(),h=0,m=0,d=n&&xt(n);if(i){var p=t.havingStyle(t.style.sup());s=ue(i,p,t),d||(h=l.height-p.fontMetrics().supDrop*p.sizeMultiplier/t.sizeMultiplier)}if(a){var y=t.havingStyle(t.style.sub());o=ue(a,y,t),d||(m=l.depth+y.fontMetrics().subDrop*y.sizeMultiplier/t.sizeMultiplier)}var w;t.style===te.DISPLAY?w=u.sup1:t.style.cramped?w=u.sup3:w=u.sup2;var C=t.sizeMultiplier,A=P(.5/u.ptPerEm/C),z=null;if(o){var I=e.base&&e.base.type==="op"&&e.base.name&&(e.base.name==="\\oiint"||e.base.name==="\\oiiint");if(l instanceof Xe||I){var q;z=P(-((q=l.italic)!=null?q:0))}}var O;if(s&&o){h=Math.max(h,w,s.depth+.25*u.xHeight),m=Math.max(m,u.sub2);var M=u.defaultRuleThickness,G=4*M;if(h-s.depth-(o.height-m)0&&(h+=X,m-=X)}var U=[{type:"elem",elem:o,shift:m,marginRight:A,marginLeft:z},{type:"elem",elem:s,shift:-h,marginRight:A}];O=oe({positionType:"individualShift",children:U})}else if(o){m=Math.max(m,u.sub1,o.height-.8*u.xHeight);var E=[{type:"elem",elem:o,marginLeft:z,marginRight:A}];O=oe({positionType:"shift",positionData:m,children:E})}else if(s)h=Math.max(h,w,s.depth+.25*u.xHeight),O=oe({positionType:"shift",positionData:-h,children:[{type:"elem",elem:s,marginRight:A}]});else throw new Error("supsub must have either sup or sub.");var V=O0(l,"right")||"mord";return F([V],[l,F(["msupsub"],[O])],t)},mathmlBuilder(e,t){var r=!1,n,i;e.base&&e.base.type==="horizBrace"&&(i=!!e.sup,i===e.base.isOver&&(r=!0,n=e.base.isOver)),e.base&&(e.base.type==="op"||e.base.type==="operatorname")&&(e.base.parentIsSupSub=!0);var a=[fe(e.base,t)];e.sub&&a.push(fe(e.sub,t)),e.sup&&a.push(fe(e.sup,t));var l;if(r)l=n?"mover":"munder";else if(e.sub)if(e.sup){var u=e.base;u&&u.type==="op"&&u.limits&&t.style===te.DISPLAY||u&&u.type==="operatorname"&&u.alwaysHandleSupSub&&(t.style===te.DISPLAY||u.limits)?l="munderover":l="msubsup"}else{var o=e.base;o&&o.type==="op"&&o.limits&&(t.style===te.DISPLAY||o.alwaysHandleSupSub)||o&&o.type==="operatorname"&&o.alwaysHandleSupSub&&(o.limits||t.style===te.DISPLAY)?l="munder":l="msub"}else{var s=e.base;s&&s.type==="op"&&s.limits&&(t.style===te.DISPLAY||s.alwaysHandleSupSub)||s&&s.type==="operatorname"&&s.alwaysHandleSupSub&&(s.limits||t.style===te.DISPLAY)?l="mover":l="msup"}return new N(l,a)}});Gt({type:"atom",htmlBuilder(e,t){return pi(e.text,e.mode,t,["m"+e.family])},mathmlBuilder(e,t){var r=new N("mo",[et(e.text,e.mode)]);if(e.family==="bin"){var n=vi(e,t);n==="bold-italic"&&r.setAttribute("mathvariant",n)}else e.family==="punct"?r.setAttribute("separator","true"):(e.family==="open"||e.family==="close")&&r.setAttribute("stretchy","false");return r}});var yo={mi:"italic",mn:"normal",mtext:"normal"};Gt({type:"mathord",htmlBuilder(e,t){return wn(e,t,"mathord")},mathmlBuilder(e,t){var r=new N("mi",[et(e.text,e.mode,t)]),n=vi(e,t)||"italic";return n!==yo[r.type]&&r.setAttribute("mathvariant",n),r}});Gt({type:"textord",htmlBuilder(e,t){return wn(e,t,"textord")},mathmlBuilder(e,t){var r=et(e.text,e.mode,t),n=vi(e,t)||"normal",i;return e.mode==="text"?i=new N("mtext",[r]):/[0-9]/.test(e.text)?i=new N("mn",[r]):e.text==="\\prime"?i=new N("mo",[r]):i=new N("mi",[r]),n!==yo[i.type]&&i.setAttribute("mathvariant",n),i}});var h0={"\\nobreak":"nobreak","\\allowbreak":"allowbreak"},m0={" ":{},"\\ ":{},"~":{className:"nobreak"},"\\space":{},"\\nobreakspace":{className:"nobreak"}};Gt({type:"spacing",htmlBuilder(e,t){if(m0.hasOwnProperty(e.text)){var r=m0[e.text].className||"";if(e.mode==="text"){var n=wn(e,t,"textord");return n.classes.push(r),n}else return F(["mspace",r],[pi(e.text,e.mode,t)],t)}else{if(h0.hasOwnProperty(e.text))return F(["mspace",h0[e.text]],[],t);throw new L('Unknown type of space "'+e.text+'"')}},mathmlBuilder(e,t){var r;if(m0.hasOwnProperty(e.text))r=new N("mtext",[new Se(" ")]);else{if(h0.hasOwnProperty(e.text))return new N("mspace");throw new L('Unknown type of space "'+e.text+'"')}return r}});var el=()=>{var e=new N("mtd",[]);return e.setAttribute("width","50%"),e};Gt({type:"tag",mathmlBuilder(e,t){var r=new N("mtable",[new N("mtr",[el(),new N("mtd",[It(e.body,t)]),el(),new N("mtd",[It(e.tag,t)])])]);return r.setAttribute("width","100%"),r}});var tl={"\\text":void 0,"\\textrm":"textrm","\\textsf":"textsf","\\texttt":"texttt","\\textnormal":"textrm"},rl={"\\textbf":"textbf","\\textmd":"textmd"},m5={"\\textit":"textit","\\textup":"textup"},nl=(e,t)=>{var r=e.font;if(r){if(tl[r])return t.withTextFontFamily(tl[r]);if(rl[r])return t.withTextFontWeight(rl[r]);if(r==="\\emph")return t.fontShape==="textit"?t.withTextFontShape("textup"):t.withTextFontShape("textit")}else return t;return t.withTextFontShape(m5[r])};_({type:"text",names:["\\text","\\textrm","\\textsf","\\texttt","\\textnormal","\\textbf","\\textmd","\\textit","\\textup","\\emph"],props:{numArgs:1,argTypes:["text"],allowedInArgument:!0,allowedInText:!0},handler(e,t){var{parser:r,funcName:n}=e,i=t[0];return{type:"text",mode:r.mode,body:ke(i),font:n}},htmlBuilder(e,t){var r=nl(e,t),n=ze(e.body,r,!0);return F(["mord","text"],n,r)},mathmlBuilder(e,t){var r=nl(e,t);return It(e.body,r)}});_({type:"underline",names:["\\underline"],props:{numArgs:1,allowedInText:!0},handler(e,t){var{parser:r}=e;return{type:"underline",mode:r.mode,body:t[0]}},htmlBuilder(e,t){var r=ue(e.body,t),n=rr("underline-line",t),i=t.fontMetrics().defaultRuleThickness,a=oe({positionType:"top",positionData:r.height,children:[{type:"kern",size:i},{type:"elem",elem:n},{type:"kern",size:3*i},{type:"elem",elem:r}]});return F(["mord","underline"],[a],t)},mathmlBuilder(e,t){var r=new N("mo",[new Se("‾")]);r.setAttribute("stretchy","true");var n=new N("munder",[fe(e.body,t),r]);return n.setAttribute("accentunder","true"),n}});_({type:"vcenter",names:["\\vcenter"],props:{numArgs:1,argTypes:["original"],allowedInText:!1},handler(e,t){var{parser:r}=e;return{type:"vcenter",mode:r.mode,body:t[0]}},htmlBuilder(e,t){var r=ue(e.body,t),n=t.fontMetrics().axisHeight,i=.5*(r.height-n-(r.depth+n));return oe({positionType:"shift",positionData:i,children:[{type:"elem",elem:r}]})},mathmlBuilder(e,t){var r=new N("mpadded",[fe(e.body,t)],["vcenter"]);return new N("mrow",[r])}});_({type:"verb",names:["\\verb"],props:{numArgs:0,allowedInText:!0},handler(e,t,r){throw new L("\\verb ended by end of line instead of matching delimiter")},htmlBuilder(e,t){for(var r=il(e),n=[],i=t.havingStyle(t.style.text()),a=0;ae.body.replace(/ /g,e.star?"␣":" "),Ct=Os,bo=`[ \r + ]`,f5="\\\\[a-zA-Z@]+",p5="\\\\[^\uD800-\uDFFF]",d5="("+f5+")"+bo+"*",g5=`\\\\( +|[ \r ]+ +?)[ \r ]*`,V0="[̀-ͯ]",v5=new RegExp(V0+"+$"),y5="("+bo+"+)|"+(g5+"|")+"([!-\\[\\]-‧‪-퟿豈-￿]"+(V0+"*")+"|[\uD800-\uDBFF][\uDC00-\uDFFF]"+(V0+"*")+"|\\\\verb\\*([^]).*?\\4|\\\\verb([^*a-zA-Z]).*?\\5"+("|"+d5)+("|"+p5+")");class al{constructor(t,r){this.input=void 0,this.settings=void 0,this.tokenRegex=void 0,this.catcodes=void 0,this.input=t,this.settings=r,this.tokenRegex=new RegExp(y5,"g"),this.catcodes={"%":14,"~":13}}setCatcode(t,r){this.catcodes[t]=r}lex(){var t=this.input,r=this.tokenRegex.lastIndex;if(r===t.length)return new We("EOF",new He(this,r,r));var n=this.tokenRegex.exec(t);if(n===null||n.index!==r)throw new L("Unexpected character: '"+t[r]+"'",new We(t[r],new He(this,r,r+1)));var i=n[6]||n[3]||(n[2]?"\\ ":" ");if(this.catcodes[i]===14){var a=t.indexOf(` +`,this.tokenRegex.lastIndex);return a===-1?(this.tokenRegex.lastIndex=t.length,this.settings.reportNonstrict("commentAtEnd","% comment has no terminating newline; LaTeX would fail because of commenting the end of math mode (e.g. $)")):this.tokenRegex.lastIndex=a+1,this.lex()}return new We(i,new He(this,r,this.tokenRegex.lastIndex))}}class b5{constructor(t,r){t===void 0&&(t={}),r===void 0&&(r={}),this.current=void 0,this.builtins=void 0,this.undefStack=void 0,this.current=r,this.builtins=t,this.undefStack=[]}beginGroup(){this.undefStack.push({})}endGroup(){if(this.undefStack.length===0)throw new L("Unbalanced namespace destruction: attempt to pop global namespace; please report this as a bug");var t=this.undefStack.pop();for(var r in t)t.hasOwnProperty(r)&&(t[r]==null?delete this.current[r]:this.current[r]=t[r])}endGroups(){for(;this.undefStack.length>0;)this.endGroup()}has(t){return this.current.hasOwnProperty(t)||this.builtins.hasOwnProperty(t)}get(t){return this.current.hasOwnProperty(t)?this.current[t]:this.builtins[t]}set(t,r,n){if(n===void 0&&(n=!1),n){for(var i=0;i0&&(this.undefStack[this.undefStack.length-1][t]=r)}else{var a=this.undefStack[this.undefStack.length-1];a&&!a.hasOwnProperty(t)&&(a[t]=this.current[t])}r==null?delete this.current[t]:this.current[t]=r}}var x5=so;v("\\noexpand",function(e){var t=e.popToken();return e.isExpandable(t.text)&&(t.noexpand=!0,t.treatAsRelax=!0),{tokens:[t],numArgs:0}});v("\\expandafter",function(e){var t=e.popToken();return e.expandOnce(!0),{tokens:[t],numArgs:0}});v("\\@firstoftwo",function(e){var t=e.consumeArgs(2);return{tokens:t[0],numArgs:0}});v("\\@secondoftwo",function(e){var t=e.consumeArgs(2);return{tokens:t[1],numArgs:0}});v("\\@ifnextchar",function(e){var t=e.consumeArgs(3);e.consumeSpaces();var r=e.future();return t[0].length===1&&t[0][0].text===r.text?{tokens:t[1],numArgs:0}:{tokens:t[2],numArgs:0}});v("\\@ifstar","\\@ifnextchar *{\\@firstoftwo{#1}}");v("\\TextOrMath",function(e){var t=e.consumeArgs(2);return e.mode==="text"?{tokens:t[0],numArgs:0}:{tokens:t[1],numArgs:0}});var ll={0:0,1:1,2:2,3:3,4:4,5:5,6:6,7:7,8:8,9:9,a:10,A:10,b:11,B:11,c:12,C:12,d:13,D:13,e:14,E:14,f:15,F:15};v("\\char",function(e){var t=e.popToken(),r,n=0;if(t.text==="'")r=8,t=e.popToken();else if(t.text==='"')r=16,t=e.popToken();else if(t.text==="`")if(t=e.popToken(),t.text[0]==="\\")n=t.text.charCodeAt(1);else{if(t.text==="EOF")throw new L("\\char` missing argument");n=t.text.charCodeAt(0)}else r=10;if(r){if(n=ll[t.text],n==null||n>=r)throw new L("Invalid base-"+r+" digit "+t.text);for(var i;(i=ll[e.future().text])!=null&&i{var i=e.consumeArg().tokens;if(i.length!==1)throw new L("\\newcommand's first argument must be a macro name");var a=i[0].text,l=e.isDefined(a);if(l&&!t)throw new L("\\newcommand{"+a+"} attempting to redefine "+(a+"; use \\renewcommand"));if(!l&&!r)throw new L("\\renewcommand{"+a+"} when command "+a+" does not yet exist; use \\newcommand");var s=0;if(i=e.consumeArg().tokens,i.length===1&&i[0].text==="["){for(var o="",u=e.expandNextToken();u.text!=="]"&&u.text!=="EOF";)o+=u.text,u=e.expandNextToken();if(!o.match(/^\s*[0-9]+\s*$/))throw new L("Invalid number of arguments: "+o);s=parseInt(o),i=e.consumeArg().tokens}return l&&n||e.macros.set(a,{tokens:i,numArgs:s}),""};v("\\newcommand",e=>ki(e,!1,!0,!1));v("\\renewcommand",e=>ki(e,!0,!1,!1));v("\\providecommand",e=>ki(e,!0,!0,!0));v("\\message",e=>{var t=e.consumeArgs(1)[0];return console.log(t.reverse().map(r=>r.text).join("")),""});v("\\errmessage",e=>{var t=e.consumeArgs(1)[0];return console.error(t.reverse().map(r=>r.text).join("")),""});v("\\show",e=>{var t=e.popToken(),r=t.text;return console.log(t,e.macros.get(r),Ct[r],de.math[r],de.text[r]),""});v("\\bgroup","{");v("\\egroup","}");v("~","\\nobreakspace");v("\\lq","`");v("\\rq","'");v("\\aa","\\r a");v("\\AA","\\r A");v("\\textcopyright","\\html@mathml{\\textcircled{c}}{\\char`©}");v("\\copyright","\\TextOrMath{\\textcopyright}{\\text{\\textcopyright}}");v("\\textregistered","\\html@mathml{\\textcircled{\\scriptsize R}}{\\char`®}");v("ℬ","\\mathscr{B}");v("ℰ","\\mathscr{E}");v("ℱ","\\mathscr{F}");v("ℋ","\\mathscr{H}");v("ℐ","\\mathscr{I}");v("ℒ","\\mathscr{L}");v("ℳ","\\mathscr{M}");v("ℛ","\\mathscr{R}");v("ℭ","\\mathfrak{C}");v("ℌ","\\mathfrak{H}");v("ℨ","\\mathfrak{Z}");v("\\Bbbk","\\Bbb{k}");v("\\llap","\\mathllap{\\textrm{#1}}");v("\\rlap","\\mathrlap{\\textrm{#1}}");v("\\clap","\\mathclap{\\textrm{#1}}");v("\\mathstrut","\\vphantom{(}");v("\\underbar","\\underline{\\text{#1}}");v("\\not",'\\html@mathml{\\mathrel{\\mathrlap\\@not}\\nobreak}{\\char"338}');v("\\neq","\\html@mathml{\\mathrel{\\not=}}{\\mathrel{\\char`≠}}");v("\\ne","\\neq");v("≠","\\neq");v("\\notin","\\html@mathml{\\mathrel{{\\in}\\mathllap{/\\mskip1mu}}}{\\mathrel{\\char`∉}}");v("∉","\\notin");v("≘","\\html@mathml{\\mathrel{=\\kern{-1em}\\raisebox{0.4em}{$\\scriptsize\\frown$}}}{\\mathrel{\\char`≘}}");v("≙","\\html@mathml{\\stackrel{\\tiny\\wedge}{=}}{\\mathrel{\\char`≘}}");v("≚","\\html@mathml{\\stackrel{\\tiny\\vee}{=}}{\\mathrel{\\char`≚}}");v("≛","\\html@mathml{\\stackrel{\\scriptsize\\star}{=}}{\\mathrel{\\char`≛}}");v("≝","\\html@mathml{\\stackrel{\\tiny\\mathrm{def}}{=}}{\\mathrel{\\char`≝}}");v("≞","\\html@mathml{\\stackrel{\\tiny\\mathrm{m}}{=}}{\\mathrel{\\char`≞}}");v("≟","\\html@mathml{\\stackrel{\\tiny?}{=}}{\\mathrel{\\char`≟}}");v("⟂","\\perp");v("‼","\\mathclose{!\\mkern-0.8mu!}");v("∌","\\notni");v("⌜","\\ulcorner");v("⌝","\\urcorner");v("⌞","\\llcorner");v("⌟","\\lrcorner");v("©","\\copyright");v("®","\\textregistered");v("\\ulcorner",'\\html@mathml{\\@ulcorner}{\\mathop{\\char"231c}}');v("\\urcorner",'\\html@mathml{\\@urcorner}{\\mathop{\\char"231d}}');v("\\llcorner",'\\html@mathml{\\@llcorner}{\\mathop{\\char"231e}}');v("\\lrcorner",'\\html@mathml{\\@lrcorner}{\\mathop{\\char"231f}}');v("\\vdots","{\\varvdots\\rule{0pt}{15pt}}");v("⋮","\\vdots");v("\\varGamma","\\mathit{\\Gamma}");v("\\varDelta","\\mathit{\\Delta}");v("\\varTheta","\\mathit{\\Theta}");v("\\varLambda","\\mathit{\\Lambda}");v("\\varXi","\\mathit{\\Xi}");v("\\varPi","\\mathit{\\Pi}");v("\\varSigma","\\mathit{\\Sigma}");v("\\varUpsilon","\\mathit{\\Upsilon}");v("\\varPhi","\\mathit{\\Phi}");v("\\varPsi","\\mathit{\\Psi}");v("\\varOmega","\\mathit{\\Omega}");v("\\substack","\\begin{subarray}{c}#1\\end{subarray}");v("\\colon","\\nobreak\\mskip2mu\\mathpunct{}\\mathchoice{\\mkern-3mu}{\\mkern-3mu}{}{}{:}\\mskip6mu\\relax");v("\\boxed","\\fbox{$\\displaystyle{#1}$}");v("\\iff","\\DOTSB\\;\\Longleftrightarrow\\;");v("\\implies","\\DOTSB\\;\\Longrightarrow\\;");v("\\impliedby","\\DOTSB\\;\\Longleftarrow\\;");v("\\dddot","{\\overset{\\raisebox{-0.1ex}{\\normalsize ...}}{#1}}");v("\\ddddot","{\\overset{\\raisebox{-0.1ex}{\\normalsize ....}}{#1}}");var sl={",":"\\dotsc","\\not":"\\dotsb","+":"\\dotsb","=":"\\dotsb","<":"\\dotsb",">":"\\dotsb","-":"\\dotsb","*":"\\dotsb",":":"\\dotsb","\\DOTSB":"\\dotsb","\\coprod":"\\dotsb","\\bigvee":"\\dotsb","\\bigwedge":"\\dotsb","\\biguplus":"\\dotsb","\\bigcap":"\\dotsb","\\bigcup":"\\dotsb","\\prod":"\\dotsb","\\sum":"\\dotsb","\\bigotimes":"\\dotsb","\\bigoplus":"\\dotsb","\\bigodot":"\\dotsb","\\bigsqcup":"\\dotsb","\\And":"\\dotsb","\\longrightarrow":"\\dotsb","\\Longrightarrow":"\\dotsb","\\longleftarrow":"\\dotsb","\\Longleftarrow":"\\dotsb","\\longleftrightarrow":"\\dotsb","\\Longleftrightarrow":"\\dotsb","\\mapsto":"\\dotsb","\\longmapsto":"\\dotsb","\\hookrightarrow":"\\dotsb","\\doteq":"\\dotsb","\\mathbin":"\\dotsb","\\mathrel":"\\dotsb","\\relbar":"\\dotsb","\\Relbar":"\\dotsb","\\xrightarrow":"\\dotsb","\\xleftarrow":"\\dotsb","\\DOTSI":"\\dotsi","\\int":"\\dotsi","\\oint":"\\dotsi","\\iint":"\\dotsi","\\iiint":"\\dotsi","\\iiiint":"\\dotsi","\\idotsint":"\\dotsi","\\DOTSX":"\\dotsx"},w5=new Set(["bin","rel"]);v("\\dots",function(e){var t="\\dotso",r=e.expandAfterFuture().text;return r in sl?t=sl[r]:(r.slice(0,4)==="\\not"||r in de.math&&w5.has(de.math[r].group))&&(t="\\dotsb"),t});var Si={")":!0,"]":!0,"\\rbrack":!0,"\\}":!0,"\\rbrace":!0,"\\rangle":!0,"\\rceil":!0,"\\rfloor":!0,"\\rgroup":!0,"\\rmoustache":!0,"\\right":!0,"\\bigr":!0,"\\biggr":!0,"\\Bigr":!0,"\\Biggr":!0,$:!0,";":!0,".":!0,",":!0};v("\\dotso",function(e){var t=e.future().text;return t in Si?"\\ldots\\,":"\\ldots"});v("\\dotsc",function(e){var t=e.future().text;return t in Si&&t!==","?"\\ldots\\,":"\\ldots"});v("\\cdots",function(e){var t=e.future().text;return t in Si?"\\@cdots\\,":"\\@cdots"});v("\\dotsb","\\cdots");v("\\dotsm","\\cdots");v("\\dotsi","\\!\\cdots");v("\\dotsx","\\ldots\\,");v("\\DOTSI","\\relax");v("\\DOTSB","\\relax");v("\\DOTSX","\\relax");v("\\tmspace","\\TextOrMath{\\kern#1#3}{\\mskip#1#2}\\relax");v("\\,","\\tmspace+{3mu}{.1667em}");v("\\thinspace","\\,");v("\\>","\\mskip{4mu}");v("\\:","\\tmspace+{4mu}{.2222em}");v("\\medspace","\\:");v("\\;","\\tmspace+{5mu}{.2777em}");v("\\thickspace","\\;");v("\\!","\\tmspace-{3mu}{.1667em}");v("\\negthinspace","\\!");v("\\negmedspace","\\tmspace-{4mu}{.2222em}");v("\\negthickspace","\\tmspace-{5mu}{.277em}");v("\\enspace","\\kern.5em ");v("\\enskip","\\hskip.5em\\relax");v("\\quad","\\hskip1em\\relax");v("\\qquad","\\hskip2em\\relax");v("\\tag","\\@ifstar\\tag@literal\\tag@paren");v("\\tag@paren","\\tag@literal{({#1})}");v("\\tag@literal",e=>{if(e.macros.get("\\df@tag"))throw new L("Multiple \\tag");return"\\gdef\\df@tag{\\text{#1}}"});v("\\bmod","\\mathchoice{\\mskip1mu}{\\mskip1mu}{\\mskip5mu}{\\mskip5mu}\\mathbin{\\rm mod}\\mathchoice{\\mskip1mu}{\\mskip1mu}{\\mskip5mu}{\\mskip5mu}");v("\\pod","\\allowbreak\\mathchoice{\\mkern18mu}{\\mkern8mu}{\\mkern8mu}{\\mkern8mu}(#1)");v("\\pmod","\\pod{{\\rm mod}\\mkern6mu#1}");v("\\mod","\\allowbreak\\mathchoice{\\mkern18mu}{\\mkern12mu}{\\mkern12mu}{\\mkern12mu}{\\rm mod}\\,\\,#1");v("\\newline","\\\\\\relax");v("\\TeX","\\textrm{\\html@mathml{T\\kern-.1667em\\raisebox{-.5ex}{E}\\kern-.125emX}{TeX}}");var xo=P(st["Main-Regular"][84][1]-.7*st["Main-Regular"][65][1]);v("\\LaTeX","\\textrm{\\html@mathml{"+("L\\kern-.36em\\raisebox{"+xo+"}{\\scriptstyle A}")+"\\kern-.15em\\TeX}{LaTeX}}");v("\\KaTeX","\\textrm{\\html@mathml{"+("K\\kern-.17em\\raisebox{"+xo+"}{\\scriptstyle A}")+"\\kern-.15em\\TeX}{KaTeX}}");v("\\hspace","\\@ifstar\\@hspacer\\@hspace");v("\\@hspace","\\hskip #1\\relax");v("\\@hspacer","\\rule{0pt}{0pt}\\hskip #1\\relax");v("\\ordinarycolon",":");v("\\vcentcolon","\\mathrel{\\mathop\\ordinarycolon}");v("\\dblcolon",'\\html@mathml{\\mathrel{\\vcentcolon\\mathrel{\\mkern-.9mu}\\vcentcolon}}{\\mathop{\\char"2237}}');v("\\coloneqq",'\\html@mathml{\\mathrel{\\vcentcolon\\mathrel{\\mkern-1.2mu}=}}{\\mathop{\\char"2254}}');v("\\Coloneqq",'\\html@mathml{\\mathrel{\\dblcolon\\mathrel{\\mkern-1.2mu}=}}{\\mathop{\\char"2237\\char"3d}}');v("\\coloneq",'\\html@mathml{\\mathrel{\\vcentcolon\\mathrel{\\mkern-1.2mu}\\mathrel{-}}}{\\mathop{\\char"3a\\char"2212}}');v("\\Coloneq",'\\html@mathml{\\mathrel{\\dblcolon\\mathrel{\\mkern-1.2mu}\\mathrel{-}}}{\\mathop{\\char"2237\\char"2212}}');v("\\eqqcolon",'\\html@mathml{\\mathrel{=\\mathrel{\\mkern-1.2mu}\\vcentcolon}}{\\mathop{\\char"2255}}');v("\\Eqqcolon",'\\html@mathml{\\mathrel{=\\mathrel{\\mkern-1.2mu}\\dblcolon}}{\\mathop{\\char"3d\\char"2237}}');v("\\eqcolon",'\\html@mathml{\\mathrel{\\mathrel{-}\\mathrel{\\mkern-1.2mu}\\vcentcolon}}{\\mathop{\\char"2239}}');v("\\Eqcolon",'\\html@mathml{\\mathrel{\\mathrel{-}\\mathrel{\\mkern-1.2mu}\\dblcolon}}{\\mathop{\\char"2212\\char"2237}}');v("\\colonapprox",'\\html@mathml{\\mathrel{\\vcentcolon\\mathrel{\\mkern-1.2mu}\\approx}}{\\mathop{\\char"3a\\char"2248}}');v("\\Colonapprox",'\\html@mathml{\\mathrel{\\dblcolon\\mathrel{\\mkern-1.2mu}\\approx}}{\\mathop{\\char"2237\\char"2248}}');v("\\colonsim",'\\html@mathml{\\mathrel{\\vcentcolon\\mathrel{\\mkern-1.2mu}\\sim}}{\\mathop{\\char"3a\\char"223c}}');v("\\Colonsim",'\\html@mathml{\\mathrel{\\dblcolon\\mathrel{\\mkern-1.2mu}\\sim}}{\\mathop{\\char"2237\\char"223c}}');v("∷","\\dblcolon");v("∹","\\eqcolon");v("≔","\\coloneqq");v("≕","\\eqqcolon");v("⩴","\\Coloneqq");v("\\ratio","\\vcentcolon");v("\\coloncolon","\\dblcolon");v("\\colonequals","\\coloneqq");v("\\coloncolonequals","\\Coloneqq");v("\\equalscolon","\\eqqcolon");v("\\equalscoloncolon","\\Eqqcolon");v("\\colonminus","\\coloneq");v("\\coloncolonminus","\\Coloneq");v("\\minuscolon","\\eqcolon");v("\\minuscoloncolon","\\Eqcolon");v("\\coloncolonapprox","\\Colonapprox");v("\\coloncolonsim","\\Colonsim");v("\\simcolon","\\mathrel{\\sim\\mathrel{\\mkern-1.2mu}\\vcentcolon}");v("\\simcoloncolon","\\mathrel{\\sim\\mathrel{\\mkern-1.2mu}\\dblcolon}");v("\\approxcolon","\\mathrel{\\approx\\mathrel{\\mkern-1.2mu}\\vcentcolon}");v("\\approxcoloncolon","\\mathrel{\\approx\\mathrel{\\mkern-1.2mu}\\dblcolon}");v("\\notni","\\html@mathml{\\not\\ni}{\\mathrel{\\char`∌}}");v("\\limsup","\\DOTSB\\operatorname*{lim\\,sup}");v("\\liminf","\\DOTSB\\operatorname*{lim\\,inf}");v("\\injlim","\\DOTSB\\operatorname*{inj\\,lim}");v("\\projlim","\\DOTSB\\operatorname*{proj\\,lim}");v("\\varlimsup","\\DOTSB\\operatorname*{\\overline{lim}}");v("\\varliminf","\\DOTSB\\operatorname*{\\underline{lim}}");v("\\varinjlim","\\DOTSB\\operatorname*{\\underrightarrow{lim}}");v("\\varprojlim","\\DOTSB\\operatorname*{\\underleftarrow{lim}}");v("\\gvertneqq","\\html@mathml{\\@gvertneqq}{≩}");v("\\lvertneqq","\\html@mathml{\\@lvertneqq}{≨}");v("\\ngeqq","\\html@mathml{\\@ngeqq}{≱}");v("\\ngeqslant","\\html@mathml{\\@ngeqslant}{≱}");v("\\nleqq","\\html@mathml{\\@nleqq}{≰}");v("\\nleqslant","\\html@mathml{\\@nleqslant}{≰}");v("\\nshortmid","\\html@mathml{\\@nshortmid}{∤}");v("\\nshortparallel","\\html@mathml{\\@nshortparallel}{∦}");v("\\nsubseteqq","\\html@mathml{\\@nsubseteqq}{⊈}");v("\\nsupseteqq","\\html@mathml{\\@nsupseteqq}{⊉}");v("\\varsubsetneq","\\html@mathml{\\@varsubsetneq}{⊊}");v("\\varsubsetneqq","\\html@mathml{\\@varsubsetneqq}{⫋}");v("\\varsupsetneq","\\html@mathml{\\@varsupsetneq}{⊋}");v("\\varsupsetneqq","\\html@mathml{\\@varsupsetneqq}{⫌}");v("\\imath","\\html@mathml{\\@imath}{ı}");v("\\jmath","\\html@mathml{\\@jmath}{ȷ}");v("\\llbracket","\\html@mathml{\\mathopen{[\\mkern-3.2mu[}}{\\mathopen{\\char`⟦}}");v("\\rrbracket","\\html@mathml{\\mathclose{]\\mkern-3.2mu]}}{\\mathclose{\\char`⟧}}");v("⟦","\\llbracket");v("⟧","\\rrbracket");v("\\lBrace","\\html@mathml{\\mathopen{\\{\\mkern-3.2mu[}}{\\mathopen{\\char`⦃}}");v("\\rBrace","\\html@mathml{\\mathclose{]\\mkern-3.2mu\\}}}{\\mathclose{\\char`⦄}}");v("⦃","\\lBrace");v("⦄","\\rBrace");v("\\minuso","\\mathbin{\\html@mathml{{\\mathrlap{\\mathchoice{\\kern{0.145em}}{\\kern{0.145em}}{\\kern{0.1015em}}{\\kern{0.0725em}}\\circ}{-}}}{\\char`⦵}}");v("⦵","\\minuso");v("\\darr","\\downarrow");v("\\dArr","\\Downarrow");v("\\Darr","\\Downarrow");v("\\lang","\\langle");v("\\rang","\\rangle");v("\\uarr","\\uparrow");v("\\uArr","\\Uparrow");v("\\Uarr","\\Uparrow");v("\\N","\\mathbb{N}");v("\\R","\\mathbb{R}");v("\\Z","\\mathbb{Z}");v("\\alef","\\aleph");v("\\alefsym","\\aleph");v("\\Alpha","\\mathrm{A}");v("\\Beta","\\mathrm{B}");v("\\bull","\\bullet");v("\\Chi","\\mathrm{X}");v("\\clubs","\\clubsuit");v("\\cnums","\\mathbb{C}");v("\\Complex","\\mathbb{C}");v("\\Dagger","\\ddagger");v("\\diamonds","\\diamondsuit");v("\\empty","\\emptyset");v("\\Epsilon","\\mathrm{E}");v("\\Eta","\\mathrm{H}");v("\\exist","\\exists");v("\\harr","\\leftrightarrow");v("\\hArr","\\Leftrightarrow");v("\\Harr","\\Leftrightarrow");v("\\hearts","\\heartsuit");v("\\image","\\Im");v("\\infin","\\infty");v("\\Iota","\\mathrm{I}");v("\\isin","\\in");v("\\Kappa","\\mathrm{K}");v("\\larr","\\leftarrow");v("\\lArr","\\Leftarrow");v("\\Larr","\\Leftarrow");v("\\lrarr","\\leftrightarrow");v("\\lrArr","\\Leftrightarrow");v("\\Lrarr","\\Leftrightarrow");v("\\Mu","\\mathrm{M}");v("\\natnums","\\mathbb{N}");v("\\Nu","\\mathrm{N}");v("\\Omicron","\\mathrm{O}");v("\\plusmn","\\pm");v("\\rarr","\\rightarrow");v("\\rArr","\\Rightarrow");v("\\Rarr","\\Rightarrow");v("\\real","\\Re");v("\\reals","\\mathbb{R}");v("\\Reals","\\mathbb{R}");v("\\Rho","\\mathrm{P}");v("\\sdot","\\cdot");v("\\sect","\\S");v("\\spades","\\spadesuit");v("\\sub","\\subset");v("\\sube","\\subseteq");v("\\supe","\\supseteq");v("\\Tau","\\mathrm{T}");v("\\thetasym","\\vartheta");v("\\weierp","\\wp");v("\\Zeta","\\mathrm{Z}");v("\\argmin","\\DOTSB\\operatorname*{arg\\,min}");v("\\argmax","\\DOTSB\\operatorname*{arg\\,max}");v("\\plim","\\DOTSB\\mathop{\\operatorname{plim}}\\limits");v("\\bra","\\mathinner{\\langle{#1}|}");v("\\ket","\\mathinner{|{#1}\\rangle}");v("\\braket","\\mathinner{\\langle{#1}\\rangle}");v("\\Bra","\\left\\langle#1\\right|");v("\\Ket","\\left|#1\\right\\rangle");var wo=e=>t=>{var r=t.consumeArg().tokens,n=t.consumeArg().tokens,i=t.consumeArg().tokens,a=t.consumeArg().tokens,l=t.macros.get("|"),s=t.macros.get("\\|");t.macros.beginGroup();var o=m=>d=>{e&&(d.macros.set("|",l),i.length&&d.macros.set("\\|",s));var p=m;if(!m&&i.length){var y=d.future();y.text==="|"&&(d.popToken(),p=!0)}return{tokens:p?i:n,numArgs:0}};t.macros.set("|",o(!1)),i.length&&t.macros.set("\\|",o(!0));var u=t.consumeArg().tokens,h=t.expandTokens([...a,...u,...r]);return t.macros.endGroup(),{tokens:h.reverse(),numArgs:0}};v("\\bra@ket",wo(!1));v("\\bra@set",wo(!0));v("\\Braket","\\bra@ket{\\left\\langle}{\\,\\middle\\vert\\,}{\\,\\middle\\vert\\,}{\\right\\rangle}");v("\\Set","\\bra@set{\\left\\{\\:}{\\;\\middle\\vert\\;}{\\;\\middle\\Vert\\;}{\\:\\right\\}}");v("\\set","\\bra@set{\\{\\,}{\\mid}{}{\\,\\}}");v("\\angln","{\\angl n}");v("\\blue","\\textcolor{##6495ed}{#1}");v("\\orange","\\textcolor{##ffa500}{#1}");v("\\pink","\\textcolor{##ff00af}{#1}");v("\\red","\\textcolor{##df0030}{#1}");v("\\green","\\textcolor{##28ae7b}{#1}");v("\\gray","\\textcolor{gray}{#1}");v("\\purple","\\textcolor{##9d38bd}{#1}");v("\\blueA","\\textcolor{##ccfaff}{#1}");v("\\blueB","\\textcolor{##80f6ff}{#1}");v("\\blueC","\\textcolor{##63d9ea}{#1}");v("\\blueD","\\textcolor{##11accd}{#1}");v("\\blueE","\\textcolor{##0c7f99}{#1}");v("\\tealA","\\textcolor{##94fff5}{#1}");v("\\tealB","\\textcolor{##26edd5}{#1}");v("\\tealC","\\textcolor{##01d1c1}{#1}");v("\\tealD","\\textcolor{##01a995}{#1}");v("\\tealE","\\textcolor{##208170}{#1}");v("\\greenA","\\textcolor{##b6ffb0}{#1}");v("\\greenB","\\textcolor{##8af281}{#1}");v("\\greenC","\\textcolor{##74cf70}{#1}");v("\\greenD","\\textcolor{##1fab54}{#1}");v("\\greenE","\\textcolor{##0d923f}{#1}");v("\\goldA","\\textcolor{##ffd0a9}{#1}");v("\\goldB","\\textcolor{##ffbb71}{#1}");v("\\goldC","\\textcolor{##ff9c39}{#1}");v("\\goldD","\\textcolor{##e07d10}{#1}");v("\\goldE","\\textcolor{##a75a05}{#1}");v("\\redA","\\textcolor{##fca9a9}{#1}");v("\\redB","\\textcolor{##ff8482}{#1}");v("\\redC","\\textcolor{##f9685d}{#1}");v("\\redD","\\textcolor{##e84d39}{#1}");v("\\redE","\\textcolor{##bc2612}{#1}");v("\\maroonA","\\textcolor{##ffbde0}{#1}");v("\\maroonB","\\textcolor{##ff92c6}{#1}");v("\\maroonC","\\textcolor{##ed5fa6}{#1}");v("\\maroonD","\\textcolor{##ca337c}{#1}");v("\\maroonE","\\textcolor{##9e034e}{#1}");v("\\purpleA","\\textcolor{##ddd7ff}{#1}");v("\\purpleB","\\textcolor{##c6b9fc}{#1}");v("\\purpleC","\\textcolor{##aa87ff}{#1}");v("\\purpleD","\\textcolor{##7854ab}{#1}");v("\\purpleE","\\textcolor{##543b78}{#1}");v("\\mintA","\\textcolor{##f5f9e8}{#1}");v("\\mintB","\\textcolor{##edf2df}{#1}");v("\\mintC","\\textcolor{##e0e5cc}{#1}");v("\\grayA","\\textcolor{##f6f7f7}{#1}");v("\\grayB","\\textcolor{##f0f1f2}{#1}");v("\\grayC","\\textcolor{##e3e5e6}{#1}");v("\\grayD","\\textcolor{##d6d8da}{#1}");v("\\grayE","\\textcolor{##babec2}{#1}");v("\\grayF","\\textcolor{##888d93}{#1}");v("\\grayG","\\textcolor{##626569}{#1}");v("\\grayH","\\textcolor{##3b3e40}{#1}");v("\\grayI","\\textcolor{##21242c}{#1}");v("\\kaBlue","\\textcolor{##314453}{#1}");v("\\kaGreen","\\textcolor{##71B307}{#1}");var ko={"^":!0,_:!0,"\\limits":!0,"\\nolimits":!0};class k5{constructor(t,r,n){this.settings=void 0,this.expansionCount=void 0,this.lexer=void 0,this.macros=void 0,this.stack=void 0,this.mode=void 0,this.settings=r,this.expansionCount=0,this.feed(t),this.macros=new b5(x5,r.macros),this.mode=n,this.stack=[]}feed(t){this.lexer=new al(t,this.settings)}switchMode(t){this.mode=t}beginGroup(){this.macros.beginGroup()}endGroup(){this.macros.endGroup()}endGroups(){this.macros.endGroups()}future(){return this.stack.length===0&&this.pushToken(this.lexer.lex()),this.stack[this.stack.length-1]}popToken(){return this.future(),this.stack.pop()}pushToken(t){this.stack.push(t)}pushTokens(t){this.stack.push(...t)}scanArgument(t){var r,n,i;if(t){if(this.consumeSpaces(),this.future().text!=="[")return null;r=this.popToken(),{tokens:i,end:n}=this.consumeArg(["]"])}else({tokens:i,start:r,end:n}=this.consumeArg());return this.pushToken(new We("EOF",n.loc)),this.pushTokens(i),new We("",He.range(r,n))}consumeSpaces(){for(;;){var t=this.future();if(t.text===" ")this.stack.pop();else break}}consumeArg(t){var r=[],n=t&&t.length>0;n||this.consumeSpaces();var i=this.future(),a,l=0,s=0;do{if(a=this.popToken(),r.push(a),a.text==="{")++l;else if(a.text==="}"){if(--l,l===-1)throw new L("Extra }",a)}else if(a.text==="EOF")throw new L("Unexpected end of input in a macro argument, expected '"+(t&&n?t[s]:"}")+"'",a);if(t&&n)if((l===0||l===1&&t[s]==="{")&&a.text===t[s]){if(++s,s===t.length){r.splice(-s,s);break}}else s=0}while(l!==0||n);return i.text==="{"&&r[r.length-1].text==="}"&&(r.pop(),r.shift()),r.reverse(),{tokens:r,start:i,end:a}}consumeArgs(t,r){if(r){if(r.length!==t+1)throw new L("The length of delimiters doesn't match the number of args!");for(var n=r[0],i=0;ithis.settings.maxExpand)throw new L("Too many expansions: infinite loop or need to increase maxExpand setting")}expandOnce(t){var r=this.popToken(),n=r.text,i=r.noexpand?null:this._getExpansion(n);if(i==null||t&&i.unexpandable){if(t&&i==null&&n[0]==="\\"&&!this.isDefined(n))throw new L("Undefined control sequence: "+n);return this.pushToken(r),!1}this.countExpansion(1);var a=i.tokens,l=this.consumeArgs(i.numArgs,i.delimiters);if(i.numArgs){a=a.slice();for(var s=a.length-1;s>=0;--s){var o=a[s];if(o.text==="#"){if(s===0)throw new L("Incomplete placeholder at end of macro body",o);if(o=a[--s],o.text==="#")a.splice(s+1,1);else if(/^[1-9]$/.test(o.text))a.splice(s,2,...l[+o.text-1]);else throw new L("Not a valid argument number",o)}}}return this.pushTokens(a),a.length}expandAfterFuture(){return this.expandOnce(),this.future()}expandNextToken(){for(;;)if(this.expandOnce()===!1){var t=this.stack.pop();return t.treatAsRelax&&(t.text="\\relax"),t}}expandMacro(t){return this.macros.has(t)?this.expandTokens([new We(t)]):void 0}expandTokens(t){var r=[],n=this.stack.length;for(this.pushTokens(t);this.stack.length>n;)if(this.expandOnce(!0)===!1){var i=this.stack.pop();i.treatAsRelax&&(i.noexpand=!1,i.treatAsRelax=!1),r.push(i)}return this.countExpansion(r.length),r}expandMacroAsText(t){var r=this.expandMacro(t);return r&&r.map(n=>n.text).join("")}_getExpansion(t){var r=this.macros.get(t);if(r==null)return r;if(t.length===1){var n=this.lexer.catcodes[t];if(n!=null&&n!==13)return}var i=typeof r=="function"?r(this):r;if(typeof i=="string"){var a=0;if(i.includes("#"))for(var l=i.replace(/##/g,"");l.includes("#"+(a+1));)++a;for(var s=new al(i,this.settings),o=[],u=s.lex();u.text!=="EOF";)o.push(u),u=s.lex();o.reverse();var h={tokens:o,numArgs:a};return h}return i}isDefined(t){return this.macros.has(t)||Ct.hasOwnProperty(t)||de.math.hasOwnProperty(t)||de.text.hasOwnProperty(t)||ko.hasOwnProperty(t)}isExpandable(t){var r=this.macros.get(t);return r!=null?typeof r=="string"||typeof r=="function"||!r.unexpandable:Ct.hasOwnProperty(t)&&!Ct[t].primitive}}var ol=/^[₊₋₌₍₎₀₁₂₃₄₅₆₇₈₉ₐₑₕᵢⱼₖₗₘₙₒₚᵣₛₜᵤᵥₓᵦᵧᵨᵩᵪ]/,Qr=Object.freeze({"₊":"+","₋":"-","₌":"=","₍":"(","₎":")","₀":"0","₁":"1","₂":"2","₃":"3","₄":"4","₅":"5","₆":"6","₇":"7","₈":"8","₉":"9","ₐ":"a","ₑ":"e","ₕ":"h","ᵢ":"i","ⱼ":"j","ₖ":"k","ₗ":"l","ₘ":"m","ₙ":"n","ₒ":"o","ₚ":"p","ᵣ":"r","ₛ":"s","ₜ":"t","ᵤ":"u","ᵥ":"v","ₓ":"x","ᵦ":"β","ᵧ":"γ","ᵨ":"ρ","ᵩ":"ϕ","ᵪ":"χ","⁺":"+","⁻":"-","⁼":"=","⁽":"(","⁾":")","⁰":"0","¹":"1","²":"2","³":"3","⁴":"4","⁵":"5","⁶":"6","⁷":"7","⁸":"8","⁹":"9","ᴬ":"A","ᴮ":"B","ᴰ":"D","ᴱ":"E","ᴳ":"G","ᴴ":"H","ᴵ":"I","ᴶ":"J","ᴷ":"K","ᴸ":"L","ᴹ":"M","ᴺ":"N","ᴼ":"O","ᴾ":"P","ᴿ":"R","ᵀ":"T","ᵁ":"U","ⱽ":"V","ᵂ":"W","ᵃ":"a","ᵇ":"b","ᶜ":"c","ᵈ":"d","ᵉ":"e","ᶠ":"f","ᵍ":"g",ʰ:"h","ⁱ":"i",ʲ:"j","ᵏ":"k",ˡ:"l","ᵐ":"m",ⁿ:"n","ᵒ":"o","ᵖ":"p",ʳ:"r",ˢ:"s","ᵗ":"t","ᵘ":"u","ᵛ":"v",ʷ:"w",ˣ:"x",ʸ:"y","ᶻ":"z","ᵝ":"β","ᵞ":"γ","ᵟ":"δ","ᵠ":"ϕ","ᵡ":"χ","ᶿ":"θ"}),f0={"́":{text:"\\'",math:"\\acute"},"̀":{text:"\\`",math:"\\grave"},"̈":{text:'\\"',math:"\\ddot"},"̃":{text:"\\~",math:"\\tilde"},"̄":{text:"\\=",math:"\\bar"},"̆":{text:"\\u",math:"\\breve"},"̌":{text:"\\v",math:"\\check"},"̂":{text:"\\^",math:"\\hat"},"̇":{text:"\\.",math:"\\dot"},"̊":{text:"\\r",math:"\\mathring"},"̋":{text:"\\H"},"̧":{text:"\\c"}},ul={á:"á",à:"à",ä:"ä",ǟ:"ǟ",ã:"ã",ā:"ā",ă:"ă",ắ:"ắ",ằ:"ằ",ẵ:"ẵ",ǎ:"ǎ",â:"â",ấ:"ấ",ầ:"ầ",ẫ:"ẫ",ȧ:"ȧ",ǡ:"ǡ",å:"å",ǻ:"ǻ",ḃ:"ḃ",ć:"ć",ḉ:"ḉ",č:"č",ĉ:"ĉ",ċ:"ċ",ç:"ç",ď:"ď",ḋ:"ḋ",ḑ:"ḑ",é:"é",è:"è",ë:"ë",ẽ:"ẽ",ē:"ē",ḗ:"ḗ",ḕ:"ḕ",ĕ:"ĕ",ḝ:"ḝ",ě:"ě",ê:"ê",ế:"ế",ề:"ề",ễ:"ễ",ė:"ė",ȩ:"ȩ",ḟ:"ḟ",ǵ:"ǵ",ḡ:"ḡ",ğ:"ğ",ǧ:"ǧ",ĝ:"ĝ",ġ:"ġ",ģ:"ģ",ḧ:"ḧ",ȟ:"ȟ",ĥ:"ĥ",ḣ:"ḣ",ḩ:"ḩ",í:"í",ì:"ì",ï:"ï",ḯ:"ḯ",ĩ:"ĩ",ī:"ī",ĭ:"ĭ",ǐ:"ǐ",î:"î",ǰ:"ǰ",ĵ:"ĵ",ḱ:"ḱ",ǩ:"ǩ",ķ:"ķ",ĺ:"ĺ",ľ:"ľ",ļ:"ļ",ḿ:"ḿ",ṁ:"ṁ",ń:"ń",ǹ:"ǹ",ñ:"ñ",ň:"ň",ṅ:"ṅ",ņ:"ņ",ó:"ó",ò:"ò",ö:"ö",ȫ:"ȫ",õ:"õ",ṍ:"ṍ",ṏ:"ṏ",ȭ:"ȭ",ō:"ō",ṓ:"ṓ",ṑ:"ṑ",ŏ:"ŏ",ǒ:"ǒ",ô:"ô",ố:"ố",ồ:"ồ",ỗ:"ỗ",ȯ:"ȯ",ȱ:"ȱ",ő:"ő",ṕ:"ṕ",ṗ:"ṗ",ŕ:"ŕ",ř:"ř",ṙ:"ṙ",ŗ:"ŗ",ś:"ś",ṥ:"ṥ",š:"š",ṧ:"ṧ",ŝ:"ŝ",ṡ:"ṡ",ş:"ş",ẗ:"ẗ",ť:"ť",ṫ:"ṫ",ţ:"ţ",ú:"ú",ù:"ù",ü:"ü",ǘ:"ǘ",ǜ:"ǜ",ǖ:"ǖ",ǚ:"ǚ",ũ:"ũ",ṹ:"ṹ",ū:"ū",ṻ:"ṻ",ŭ:"ŭ",ǔ:"ǔ",û:"û",ů:"ů",ű:"ű",ṽ:"ṽ",ẃ:"ẃ",ẁ:"ẁ",ẅ:"ẅ",ŵ:"ŵ",ẇ:"ẇ",ẘ:"ẘ",ẍ:"ẍ",ẋ:"ẋ",ý:"ý",ỳ:"ỳ",ÿ:"ÿ",ỹ:"ỹ",ȳ:"ȳ",ŷ:"ŷ",ẏ:"ẏ",ẙ:"ẙ",ź:"ź",ž:"ž",ẑ:"ẑ",ż:"ż",Á:"Á",À:"À",Ä:"Ä",Ǟ:"Ǟ",Ã:"Ã",Ā:"Ā",Ă:"Ă",Ắ:"Ắ",Ằ:"Ằ",Ẵ:"Ẵ",Ǎ:"Ǎ",Â:"Â",Ấ:"Ấ",Ầ:"Ầ",Ẫ:"Ẫ",Ȧ:"Ȧ",Ǡ:"Ǡ",Å:"Å",Ǻ:"Ǻ",Ḃ:"Ḃ",Ć:"Ć",Ḉ:"Ḉ",Č:"Č",Ĉ:"Ĉ",Ċ:"Ċ",Ç:"Ç",Ď:"Ď",Ḋ:"Ḋ",Ḑ:"Ḑ",É:"É",È:"È",Ë:"Ë",Ẽ:"Ẽ",Ē:"Ē",Ḗ:"Ḗ",Ḕ:"Ḕ",Ĕ:"Ĕ",Ḝ:"Ḝ",Ě:"Ě",Ê:"Ê",Ế:"Ế",Ề:"Ề",Ễ:"Ễ",Ė:"Ė",Ȩ:"Ȩ",Ḟ:"Ḟ",Ǵ:"Ǵ",Ḡ:"Ḡ",Ğ:"Ğ",Ǧ:"Ǧ",Ĝ:"Ĝ",Ġ:"Ġ",Ģ:"Ģ",Ḧ:"Ḧ",Ȟ:"Ȟ",Ĥ:"Ĥ",Ḣ:"Ḣ",Ḩ:"Ḩ",Í:"Í",Ì:"Ì",Ï:"Ï",Ḯ:"Ḯ",Ĩ:"Ĩ",Ī:"Ī",Ĭ:"Ĭ",Ǐ:"Ǐ",Î:"Î",İ:"İ",Ĵ:"Ĵ",Ḱ:"Ḱ",Ǩ:"Ǩ",Ķ:"Ķ",Ĺ:"Ĺ",Ľ:"Ľ",Ļ:"Ļ",Ḿ:"Ḿ",Ṁ:"Ṁ",Ń:"Ń",Ǹ:"Ǹ",Ñ:"Ñ",Ň:"Ň",Ṅ:"Ṅ",Ņ:"Ņ",Ó:"Ó",Ò:"Ò",Ö:"Ö",Ȫ:"Ȫ",Õ:"Õ",Ṍ:"Ṍ",Ṏ:"Ṏ",Ȭ:"Ȭ",Ō:"Ō",Ṓ:"Ṓ",Ṑ:"Ṑ",Ŏ:"Ŏ",Ǒ:"Ǒ",Ô:"Ô",Ố:"Ố",Ồ:"Ồ",Ỗ:"Ỗ",Ȯ:"Ȯ",Ȱ:"Ȱ",Ő:"Ő",Ṕ:"Ṕ",Ṗ:"Ṗ",Ŕ:"Ŕ",Ř:"Ř",Ṙ:"Ṙ",Ŗ:"Ŗ",Ś:"Ś",Ṥ:"Ṥ",Š:"Š",Ṧ:"Ṧ",Ŝ:"Ŝ",Ṡ:"Ṡ",Ş:"Ş",Ť:"Ť",Ṫ:"Ṫ",Ţ:"Ţ",Ú:"Ú",Ù:"Ù",Ü:"Ü",Ǘ:"Ǘ",Ǜ:"Ǜ",Ǖ:"Ǖ",Ǚ:"Ǚ",Ũ:"Ũ",Ṹ:"Ṹ",Ū:"Ū",Ṻ:"Ṻ",Ŭ:"Ŭ",Ǔ:"Ǔ",Û:"Û",Ů:"Ů",Ű:"Ű",Ṽ:"Ṽ",Ẃ:"Ẃ",Ẁ:"Ẁ",Ẅ:"Ẅ",Ŵ:"Ŵ",Ẇ:"Ẇ",Ẍ:"Ẍ",Ẋ:"Ẋ",Ý:"Ý",Ỳ:"Ỳ",Ÿ:"Ÿ",Ỹ:"Ỹ",Ȳ:"Ȳ",Ŷ:"Ŷ",Ẏ:"Ẏ",Ź:"Ź",Ž:"Ž",Ẑ:"Ẑ",Ż:"Ż",ά:"ά",ὰ:"ὰ",ᾱ:"ᾱ",ᾰ:"ᾰ",έ:"έ",ὲ:"ὲ",ή:"ή",ὴ:"ὴ",ί:"ί",ὶ:"ὶ",ϊ:"ϊ",ΐ:"ΐ",ῒ:"ῒ",ῑ:"ῑ",ῐ:"ῐ",ό:"ό",ὸ:"ὸ",ύ:"ύ",ὺ:"ὺ",ϋ:"ϋ",ΰ:"ΰ",ῢ:"ῢ",ῡ:"ῡ",ῠ:"ῠ",ώ:"ώ",ὼ:"ὼ",Ύ:"Ύ",Ὺ:"Ὺ",Ϋ:"Ϋ",Ῡ:"Ῡ",Ῠ:"Ῠ",Ώ:"Ώ",Ὼ:"Ὼ"};class Dn{constructor(t,r){this.mode=void 0,this.gullet=void 0,this.settings=void 0,this.leftrightDepth=void 0,this.nextToken=void 0,this.mode="math",this.gullet=new k5(t,r,this.mode),this.settings=r,this.leftrightDepth=0,this.nextToken=null}expect(t,r){if(r===void 0&&(r=!0),this.fetch().text!==t)throw new L("Expected '"+t+"', got '"+this.fetch().text+"'",this.fetch());r&&this.consume()}consume(){this.nextToken=null}fetch(){return this.nextToken==null&&(this.nextToken=this.gullet.expandNextToken()),this.nextToken}switchMode(t){this.mode=t,this.gullet.switchMode(t)}parse(){this.settings.globalGroup||this.gullet.beginGroup(),this.settings.colorIsTextColor&&this.gullet.macros.set("\\color","\\textcolor");try{var t=this.parseExpression(!1);return this.expect("EOF"),this.settings.globalGroup||this.gullet.endGroup(),t}finally{this.gullet.endGroups()}}subparse(t){var r=this.nextToken;this.consume(),this.gullet.pushToken(new We("}")),this.gullet.pushTokens(t);var n=this.parseExpression(!1);return this.expect("}"),this.nextToken=r,n}parseExpression(t,r){for(var n=[];;){this.mode==="math"&&this.consumeSpaces();var i=this.fetch();if(Dn.endOfExpression.has(i.text)||r&&i.text===r||t&&Ct[i.text]&&Ct[i.text].infix)break;var a=this.parseAtom(r);if(a){if(a.type==="internal")continue}else break;n.push(a)}return this.mode==="text"&&this.formLigatures(n),this.handleInfixNodes(n)}handleInfixNodes(t){for(var r=-1,n,i=0;i=128)this.settings.strict&&(Ms(r.charCodeAt(0))?this.mode==="math"&&this.settings.reportNonstrict("unicodeTextInMathMode",'Unicode text character "'+r[0]+'" used in math mode',t):this.settings.reportNonstrict("unknownSymbol",'Unrecognized Unicode character "'+r[0]+'"'+(" ("+r.charCodeAt(0)+")"),t)),l={type:"textord",mode:"text",loc:He.range(t),text:r};else return null;if(this.consume(),a)for(var h=0;h=o&&p[1]===u&&p[3].trim()===""){m=d;break}}if(m!==-1)r.push([h,m]),n=m+1;else{const p=l[3].trim().split(/\s+/,1)[0]||"",y=fn(p)!==null,w=n+1C.trim()!=="");if(y&&w){r.push([h,t.length-1]);break}n++}}function i(l){return r.some(([s,o])=>l>=s&&l<=o)}return t.map((l,s)=>{if(i(s))return l;let o=l.replace(/`{3,}/g,"");return o=o.replace(/``\s*``/g,""),o=o.replace(/``(?=[.,;:!?\s]|$)/g,""),o}).join(` +`)}function P5(e){const t=e.split(` +`),r=[];let n=0;for(;n=o&&d[1]===a&&d[3].trim()===""){h=m;break}}if(h!==-1){const m=t.slice(n+1,h);if(!m.some(C=>C.trim()!=="")){n=h+1;continue}const p=u.split(/\s+/,1)[0]||"";if(p.toLowerCase()==="math"){r.push(`${a}\`\`\`math`);for(const C of m)r.push(C);r.push(`${a}\`\`\``),n=h+1;continue}if(u&&hl(u)){for(const C of m)r.push(C);n=h+1;continue}const y=u?fn(p):null,w=y||"";r.push(`${a}\`\`\`${w}`);for(const C of m)r.push(C);r.push(`${a}\`\`\``),n=h+1}else{const m=t.slice(n+1);if(!m.some(w=>w.trim()!=="")){n++;continue}const p=u.split(/\s+/,1)[0]||"",y=fn(p);if(y||p.toLowerCase()==="math"){const w=p.toLowerCase()==="math"?"math":y;r.push(`${a}\`\`\`${w}`);for(const C of m)r.push(C)}else if(u&&hl(u))for(const w of m)r.push(w);else{r.push(`${a}\`\`\``);for(const w of m)r.push(w)}break}}return r.join(` +`)}function O5(e){return e.replace(/(^|\n)[ \t]*(?:`{3,}|~{3,})[^\n]*\n[ \t]*\n?[ \t]*(?:`{3,}|~{3,})[ \t]*(?=\n|$)/g,"$1")}function q5(e){return e.replace(B5,"$1\\$")}function H5(e){let t=e;return t=t.replace(R5,(r,n)=>`$$${n}$$`),t=t.replace(F5,(r,n)=>`$${n}$`),t}function X5(e){const t=N5(e),r=P5(t);return O5(r).split(I5).map((i,a)=>a%2===1||!i.trim()?i:i.split(D5).map((l,s)=>s%2===1?l:H5(q5(l))).join("")).join("")}export{V5 as M,W5 as S,U5 as a,_5 as b,X5 as p,G5 as r}; diff --git a/frontends/desktop/dist/assets/markdown-preprocess-Cp579UoJ.css b/frontends/desktop/dist/assets/markdown-preprocess-Cp579UoJ.css new file mode 100644 index 000000000..08c8a35d0 --- /dev/null +++ b/frontends/desktop/dist/assets/markdown-preprocess-Cp579UoJ.css @@ -0,0 +1 @@ +@font-face{font-display:block;font-family:KaTeX_AMS;font-style:normal;font-weight:400;src:url(/assets/KaTeX_AMS-Regular-BQhdFMY1.woff2) format("woff2"),url(/assets/KaTeX_AMS-Regular-DMm9YOAa.woff) format("woff"),url(/assets/KaTeX_AMS-Regular-DRggAlZN.ttf) format("truetype")}@font-face{font-display:block;font-family:KaTeX_Caligraphic;font-style:normal;font-weight:700;src:url(/assets/KaTeX_Caligraphic-Bold-Dq_IR9rO.woff2) format("woff2"),url(/assets/KaTeX_Caligraphic-Bold-BEiXGLvX.woff) format("woff"),url(/assets/KaTeX_Caligraphic-Bold-ATXxdsX0.ttf) format("truetype")}@font-face{font-display:block;font-family:KaTeX_Caligraphic;font-style:normal;font-weight:400;src:url(/assets/KaTeX_Caligraphic-Regular-Di6jR-x-.woff2) format("woff2"),url(/assets/KaTeX_Caligraphic-Regular-CTRA-rTL.woff) format("woff"),url(/assets/KaTeX_Caligraphic-Regular-wX97UBjC.ttf) format("truetype")}@font-face{font-display:block;font-family:KaTeX_Fraktur;font-style:normal;font-weight:700;src:url(/assets/KaTeX_Fraktur-Bold-CL6g_b3V.woff2) format("woff2"),url(/assets/KaTeX_Fraktur-Bold-BsDP51OF.woff) format("woff"),url(/assets/KaTeX_Fraktur-Bold-BdnERNNW.ttf) format("truetype")}@font-face{font-display:block;font-family:KaTeX_Fraktur;font-style:normal;font-weight:400;src:url(/assets/KaTeX_Fraktur-Regular-CTYiF6lA.woff2) format("woff2"),url(/assets/KaTeX_Fraktur-Regular-Dxdc4cR9.woff) format("woff"),url(/assets/KaTeX_Fraktur-Regular-CB_wures.ttf) format("truetype")}@font-face{font-display:block;font-family:KaTeX_Main;font-style:normal;font-weight:700;src:url(/assets/KaTeX_Main-Bold-Cx986IdX.woff2) format("woff2"),url(/assets/KaTeX_Main-Bold-Jm3AIy58.woff) format("woff"),url(/assets/KaTeX_Main-Bold-waoOVXN0.ttf) format("truetype")}@font-face{font-display:block;font-family:KaTeX_Main;font-style:italic;font-weight:700;src:url(/assets/KaTeX_Main-BoldItalic-DxDJ3AOS.woff2) format("woff2"),url(/assets/KaTeX_Main-BoldItalic-SpSLRI95.woff) format("woff"),url(/assets/KaTeX_Main-BoldItalic-DzxPMmG6.ttf) format("truetype")}@font-face{font-display:block;font-family:KaTeX_Main;font-style:italic;font-weight:400;src:url(/assets/KaTeX_Main-Italic-NWA7e6Wa.woff2) format("woff2"),url(/assets/KaTeX_Main-Italic-BMLOBm91.woff) format("woff"),url(/assets/KaTeX_Main-Italic-3WenGoN9.ttf) format("truetype")}@font-face{font-display:block;font-family:KaTeX_Main;font-style:normal;font-weight:400;src:url(/assets/KaTeX_Main-Regular-B22Nviop.woff2) format("woff2"),url(/assets/KaTeX_Main-Regular-Dr94JaBh.woff) format("woff"),url(/assets/KaTeX_Main-Regular-ypZvNtVU.ttf) format("truetype")}@font-face{font-display:block;font-family:KaTeX_Math;font-style:italic;font-weight:700;src:url(/assets/KaTeX_Math-BoldItalic-CZnvNsCZ.woff2) format("woff2"),url(/assets/KaTeX_Math-BoldItalic-iY-2wyZ7.woff) format("woff"),url(/assets/KaTeX_Math-BoldItalic-B3XSjfu4.ttf) format("truetype")}@font-face{font-display:block;font-family:KaTeX_Math;font-style:italic;font-weight:400;src:url(/assets/KaTeX_Math-Italic-t53AETM-.woff2) format("woff2"),url(/assets/KaTeX_Math-Italic-DA0__PXp.woff) format("woff"),url(/assets/KaTeX_Math-Italic-flOr_0UB.ttf) format("truetype")}@font-face{font-display:block;font-family:KaTeX_SansSerif;font-style:normal;font-weight:700;src:url(/assets/KaTeX_SansSerif-Bold-D1sUS0GD.woff2) format("woff2"),url(/assets/KaTeX_SansSerif-Bold-DbIhKOiC.woff) format("woff"),url(/assets/KaTeX_SansSerif-Bold-CFMepnvq.ttf) format("truetype")}@font-face{font-display:block;font-family:KaTeX_SansSerif;font-style:italic;font-weight:400;src:url(/assets/KaTeX_SansSerif-Italic-C3H0VqGB.woff2) format("woff2"),url(/assets/KaTeX_SansSerif-Italic-DN2j7dab.woff) format("woff"),url(/assets/KaTeX_SansSerif-Italic-YYjJ1zSn.ttf) format("truetype")}@font-face{font-display:block;font-family:KaTeX_SansSerif;font-style:normal;font-weight:400;src:url(/assets/KaTeX_SansSerif-Regular-DDBCnlJ7.woff2) format("woff2"),url(/assets/KaTeX_SansSerif-Regular-CS6fqUqJ.woff) format("woff"),url(/assets/KaTeX_SansSerif-Regular-BNo7hRIc.ttf) format("truetype")}@font-face{font-display:block;font-family:KaTeX_Script;font-style:normal;font-weight:400;src:url(/assets/KaTeX_Script-Regular-D3wIWfF6.woff2) format("woff2"),url(/assets/KaTeX_Script-Regular-D5yQViql.woff) format("woff"),url(/assets/KaTeX_Script-Regular-C5JkGWo-.ttf) format("truetype")}@font-face{font-display:block;font-family:KaTeX_Size1;font-style:normal;font-weight:400;src:url(/assets/KaTeX_Size1-Regular-mCD8mA8B.woff2) format("woff2"),url(/assets/KaTeX_Size1-Regular-C195tn64.woff) format("woff"),url(/assets/KaTeX_Size1-Regular-Dbsnue_I.ttf) format("truetype")}@font-face{font-display:block;font-family:KaTeX_Size2;font-style:normal;font-weight:400;src:url(/assets/KaTeX_Size2-Regular-Dy4dx90m.woff2) format("woff2"),url(/assets/KaTeX_Size2-Regular-oD1tc_U0.woff) format("woff"),url(/assets/KaTeX_Size2-Regular-B7gKUWhC.ttf) format("truetype")}@font-face{font-display:block;font-family:KaTeX_Size3;font-style:normal;font-weight:400;src:url(data:font/woff2;base64,d09GMgABAAAAAA4oAA4AAAAAHbQAAA3TAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAABmAAgRQIDgmcDBEICo1oijYBNgIkA14LMgAEIAWJAAeBHAyBHBvbGiMRdnO0IkRRkiYDgr9KsJ1NUAf2kILNxgUmgqIgq1P89vcbIcmsQbRps3vCcXdYOKSWEPEKgZgQkprQQsxIXUgq0DqpGKmIvrgkeVGtEQD9DzAO29fM9jYhxZEsL2FeURH2JN4MIcTdO049NCVdxQ/w9NrSYFEBKTDKpLKfNkCGDc1RwjZLQcm3vqJ2UW9Xfa3tgAHz6ivp6vgC2yD4/6352ndnN0X0TL7seypkjZlMsjmZnf0Mm5Q+JykRWQBKCVCVPbARPXWyQtb5VgLB6Biq7/Uixcj2WGqdI8tGSgkuRG+t910GKP2D7AQH0DB9FMDW/obJZ8giFI3Wg8Cvevz0M+5m0rTh7XDBlvo9Y4vm13EXmfttwI4mBo1EG15fxJhUiCLbiiyCf/ZA6MFAhg3pGIZGdGIVjtPn6UcMk9A/UUr9PhoNsCENw1APAq0gpH73e+M+0ueyHbabc3vkbcdtzcf/fiy+NxQEjf9ud/ELBHAXJ0nk4z+MXH2Ev/kWyV4k7SkvpPc9Qr38F6RPWnM9cN6DJ0AdD1BhtgABtmoRoFCvPsBAumNm6soZG2Gk5GyVTo2sJncSyp0jQTYoR6WDvTwaaEcHsxHfvuWhHA3a6bN7twRKtcGok6NsCi7jYRrM2jExsUFMxMQYuJbMhuWNOumEJy9hi29Dmg5zMp/A5+hhPG19j1vBrq8JTLr8ki5VLPmG/PynJHVul440bxg5xuymHUFPBshC+nA9I1FmwbRBTNHAcik3Oae0cxKoI3MOriM42UrPe51nsaGxJ+WfXubAsP84aabUlQSJ1IiE0iPETLUU4CATgfXSCSpuRFRmCGbO+wSpAnzaeaCYW1VNEysRtuXCEL1kUFUbbtMv3Tilt/1c11jt3Q5bbMa84cpWipp8Elw3MZhOHsOlwwVUQM3lAR35JiFQbaYCRnMF2lxAWoOg2gyoIV4PouX8HytNIfLhqpJtXB4vjiViUI8IJ7bkC4ikkQvKksnOTKICwnqWSZ9YS5f0WCxmpgjbIq7EJcM4aI2nmhLNY2JIUgOjXZFWBHb+x5oh6cwb0Tv1ackHdKi0I9OO2wE9aogIOn540CCCziyhN+IaejtgAONKznHlHyutPrHGwCx9S6B8kfS4Mfi4Eyv7OU730bT1SCBjt834cXsf43zVjPUqqJjgrjeGnBxSG4aYAKFuVbeCfkDIjAqMb6yLNIbCuvXhMH2/+k2vkNpkORhR59N1CkzoOENvneIosjYmuTxlhUzaGEJQ/iWqx4dmwpmKjrwTiTGTCVozNAYqk/zXOndWxuWSmJkQpJw3pK5KX6QrLt5LATMqpmPAQhkhK6PUjzHUn7E0gHE0kPE0iKkolgkUx9SZmVAdDgpffdyJKg3k7VmzYGCwVXGz/tXmkOIp+vcWs+EMuhhvN0h9uhfzWJziBQmCREGSIFmQIkgVpAnSBRmC//6hkLZwaVhwxlrJSOdqlFtOYxlau9F2QN5Y98xmIAsiM1HVp2VFX+DHHGg6Ecjh3vmqtidX3qHI2qycTk/iwxSt5UzTmEP92ZBnEWTk4Mx8Mpl78ZDokxg/KWb+Q0QkvdKVmq3TMW+RXEgrsziSAfNXFMhDc60N5N9jQzjfO0kBKpUZl0ZmwJ41j/B9Hz6wmRaJB84niNmQrzp9eSlQCDDzazGDdVi3P36VZQ+Jy4f9UBNp+3zTjqI4abaFAm+GShVaXlsGdF3FYzZcDI6cori4kMxUECl9IjJZpzkvitAoxKue+90pDMvcKRxLl53TmOKCmV/xRolNKSqqUxc6LStOETmFOiLZZptlZepcKiAzteG8PEdpnQpbOMNcMsR4RR2Bs0cKFEvSmIjAFcnarqwUL4lDhHmnVkwu1IwshbiCcgvOheZuYyOteufZZwlcTlLgnZ3o/WcYdzZHW/WGaqaVfmTZ1aWCceJjkbZqsfbkOtcFlUZM/jy+hXHDbaUobWqqXaeWobbLO99yG5N3U4wxco0rQGGcOLASFMXeJoham8M+/x6O2WywK2l4HGbq1CoUyC/IZikQhdq3SiuNrvAEj0AVu9x2x3lp/xWzahaxidezFVtdcb5uEnzyl0ZmYiuKI0exvCd4Xc9CV1KB0db00z92wDPde0kukbvZIWN6jUWFTmPIC/Y4UPCm8UfDTFZpZNon1qLFTkBhxzB+FjQRA2Q/YRJT8pQigslMaUpFyAG8TMlXigiqmAZX4xgijKjRlGpLE0GdplRfCaJo0JQaSxNBk6ZmMzcya0FmrcisDdn0Q3HI2sWSppYigmlM1XT/kLQZSNpMJG0WkjYbSZuDpM1F0uYhFc1HxU4m1QJjDK6iL0S5uSj5rgXc3RejEigtcRBtqYPQsiTskmO5vosV+q4VGIKbOkDg0jtRrq+Em1YloaTFar3EGr1EUC8R0kus1Uus00usL97ABr2BjXoDm/QGNhuWtMVBKOwg/i78lT7hBsAvDmwHc/ao3vmUbBmhjeYySZNWvGkfZAgISDSaDo1SVpzGDsAEkF8B+gEapViUoZgUWXcRIGFZNm6gWbAKk0bp0k1MHG9fLYtV4iS2SmLEQFARzRcnf9PUS0LVn05/J9MiRRBU3v2IrvW974v4N00L7ZMk0wXP1409CHo/an8zTRHD3eSJ6m8D4YMkZNl3M79sqeuAsr/m3f+8/yl7A50aiAEJgeBeMWzu7ui9UfUBCe2TIqZIoOd/3/udRBOQidQZUERzb2/VwZN1H/Sju82ew2H2Wfr6qvfVf3hqwDvAIpkQVFy4B9Pe9e4/XvPeceu7h3dvO56iJPf0+A6cqA2ip18ER+iFgggiuOkvj24bby0N9j2UHIkgqIt+sVgfodC4YghLSMjSZbH0VR/6dMDrYJeKHilKTemt6v6kvzvn3/RrdWtr0GoN/xL+Sex/cPYLUpepx9cz/D46UPU5KXgAQa+NDps1v6J3xP1i2HtaDB0M9aX2deA7SYff//+gUCovMmIK/qfsFcOk+4Y5ZN97XlG6zebqtMbKgeRFi51vnxTQYBUik2rS/Cn6PC8ADR8FGxsRPB82dzfND90gIcshOcYUkfjherBz53odpm6TP8txlwOZ71xmfHHOvq053qFF/MRlS3jP0ELudrf2OeN8DHvp6ZceLe8qKYvWz/7yp0u4dKPfli3CYq0O13Ih71mylJ80tOi10On8wi+F4+LWgDPeJ30msSQt9/vkmHq9/Lvo2b461mP801v3W4xTcs6CbvF9UDdrSt+A8OUbpSh55qAUFXWznBBfdeJ8a4d7ugT5tvxUza3h9m4H7ptTqiG4z0g5dc0X29OcGlhpGFMpQo9ytTS+NViZpNdvU4kWx+LKxNY10kQ1yqGXrhe4/1nvP7E+nd5A92TtaRplbHSqoIdOqtRWti+fkB5/n1+/VvCmz12pG1kpQWsfi1ftlBobm0bpngs16CHkbIwdLnParxtTV3QYRlfJ0KFskH7pdN/YDn+yRuSd7sNH3aO0DYPggk6uWuXrfOc+fa3VTxFVvKaNxHsiHmsXyCLIE5yuOeN3/Jdf8HBL/5M6shjyhxHx9BjB1O0+4NLOnjLLSxwO7ukN4jMbOIcD879KLSi6Pk61Oqm2377n8079PXEEQ7cy7OKEC9nbpet118fxweTafpt69x/Bt8UqGzNQt7aelpc44dn5cqhwf71+qKp/Zf/+a0zcizOUWpl/iBcSXip0pplkatCchoH5c5aUM8I7/dWxAej8WicPL1URFZ9BDJelUwEwTkGqUhgSlydVes95YdXvhh9Gfz/aeFWvgVb4tuLbcv4+wLdutVZv/cUonwBD/6eDlE0aSiKK/uoH3+J1wDE/jMVqY2ysGufN84oIXB0sPzy8ollX/LegY74DgJXJR57sn+VGza0x3DnuIgABFM15LmajjjsNlYj+JEZGbuRYcAMOWxFkPN2w6Wd46xo4gVWQR/X4lyI/R6K/YK0110GzudPRW7Y+UOBGTfNNzHeYT0fiH0taunBpq9HEW8OKSaBGj21L0MqenEmNRWBAWDWAk4CpNoEZJ2tTaPFgbQYj8HxtFilErs3BTRwT8uO1NXQaWfIotchmPkAF5mMBAliEmZiOGVgCG9LgRzpscMAOOwowlT3JhusdazXGSC/hxR3UlmWVwWHpOIKheqONvjyhSiTHIkVUco5bnji8m//zL7PKaT1Vl5I6UE609f+gkr6MZKVyKc7zJRmCahLsdlyA5fdQkRSan9LgnnLEyGSkaKJCJog0wAgvepWBt80+1yKln1bMVtCljfNWDueKLsWwaEbBSfSPTEmVRsUcYYMnEjcjeyCZzBXK9E9BYBXLKjOSpUDR+nEV3TFSUdQaz+ot98QxgXwx0GQ+EEUAKB2qZPkQQ0GqFD8UPFMqyaCHM24BZmSGic9EYMagKizOw9Hz50DMrDLrqqLkTAhplMictiCAx5S3BIUQdeJeLnBy2CNtMfz6cV4u8XKoFZQesbf9YZiIERiHjaNodDW6LgcirX/mPnJIkBGDUpTBhSa0EIr38D5hCIszhCM8URGBqImoWjpvpt1ebu/v3Gl3qJfMnNM+9V+kiRFyROTPHQWOcs1dNW94/ukKMPZBvDi55i5CttdeJz84DLngLqjcdwEZ87bFFR8CIG35OAkDVN6VRDZ7aq67NteYqZ2lpT8oYB2CytoBd6VuAx4WgiAsnuj3WohG+LugzXiQRDeM3XYXlULv4dp5VFYC) format("woff2"),url(/assets/KaTeX_Size3-Regular-CTq5MqoE.woff) format("woff"),url(/assets/KaTeX_Size3-Regular-DgpXs0kz.ttf) format("truetype")}@font-face{font-display:block;font-family:KaTeX_Size4;font-style:normal;font-weight:400;src:url(/assets/KaTeX_Size4-Regular-Dl5lxZxV.woff2) format("woff2"),url(/assets/KaTeX_Size4-Regular-BF-4gkZK.woff) format("woff"),url(/assets/KaTeX_Size4-Regular-DWFBv043.ttf) format("truetype")}@font-face{font-display:block;font-family:KaTeX_Typewriter;font-style:normal;font-weight:400;src:url(/assets/KaTeX_Typewriter-Regular-CO6r4hn1.woff2) format("woff2"),url(/assets/KaTeX_Typewriter-Regular-C0xS9mPB.woff) format("woff"),url(/assets/KaTeX_Typewriter-Regular-D3Ib7_Hf.ttf) format("truetype")}.katex{font: 1.21em KaTeX_Main,Times New Roman,serif;line-height:1.2;position:relative;text-indent:0;text-rendering:auto}.katex *{-ms-high-contrast-adjust:none!important;border-color:currentColor}.katex .katex-version:after{content:"0.17.0"}.katex .katex-mathml{border:0;-webkit-clip-path:inset(50%);clip-path:inset(50%);height:1px;overflow:hidden;padding:0;position:absolute;width:1px}.katex .katex-html>.newline{display:block}.katex .base{position:relative;white-space:nowrap;width:-webkit-min-content;width:-moz-min-content;width:min-content}.katex .base,.katex .strut{display:inline-block}.katex .textbf{font-weight:700}.katex .textit{font-style:italic}.katex .textrm{font-family:KaTeX_Main}.katex .textsf{font-family:KaTeX_SansSerif}.katex .texttt{font-family:KaTeX_Typewriter}.katex .mathnormal{font-family:KaTeX_Math;font-style:italic}.katex .mathit{font-family:KaTeX_Main;font-style:italic}.katex .mathrm{font-style:normal}.katex .mathbf{font-family:KaTeX_Main;font-weight:700}.katex .boldsymbol{font-family:KaTeX_Math;font-style:italic;font-weight:700}.katex .amsrm,.katex .mathbb,.katex .textbb{font-family:KaTeX_AMS}.katex .mathcal{font-family:KaTeX_Caligraphic}.katex .mathfrak,.katex .textfrak{font-family:KaTeX_Fraktur}.katex .mathboldfrak,.katex .textboldfrak{font-family:KaTeX_Fraktur;font-weight:700}.katex .mathtt{font-family:KaTeX_Typewriter}.katex .mathscr,.katex .textscr{font-family:KaTeX_Script}.katex .mathsf,.katex .textsf{font-family:KaTeX_SansSerif}.katex .mathboldsf,.katex .textboldsf{font-family:KaTeX_SansSerif;font-weight:700}.katex .mathitsf,.katex .mathsfit,.katex .textitsf{font-family:KaTeX_SansSerif;font-style:italic}.katex .mainrm{font-family:KaTeX_Main;font-style:normal}.katex .vlist-t{border-collapse:collapse;display:inline-table;table-layout:fixed}.katex .vlist-r{display:table-row}.katex .vlist{display:table-cell;position:relative;vertical-align:bottom}.katex .vlist>span{display:block;height:0;position:relative}.katex .vlist>span>span{display:inline-block}.katex .vlist>span>.pstrut{overflow:hidden;width:0}.katex .vlist-t2{margin-right:-2px}.katex .vlist-s{display:table-cell;font-size:1px;min-width:2px;vertical-align:bottom;width:2px}.katex .vbox{align-items:baseline;display:inline-flex;flex-direction:column}.katex .hbox{width:100%}.katex .hbox,.katex .thinbox{display:inline-flex;flex-direction:row}.katex .thinbox{max-width:0;width:0}.katex .msupsub{text-align:left}.katex .mfrac>span>span{text-align:center}.katex .mfrac .frac-line{border-bottom-style:solid;display:inline-block;width:100%}.katex .hdashline,.katex .hline,.katex .mfrac .frac-line,.katex .overline .overline-line,.katex .rule,.katex .underline .underline-line{min-height:1px}.katex .mspace{display:inline-block}.katex .smash{display:inline;line-height:0}.katex .clap,.katex .llap,.katex .rlap{position:relative;width:0}.katex .clap>.inner,.katex .llap>.inner,.katex .rlap>.inner{position:absolute}.katex .clap>.fix,.katex .llap>.fix,.katex .rlap>.fix{display:inline-block}.katex .llap>.inner{right:0}.katex .clap>.inner,.katex .rlap>.inner{left:0}.katex .clap>.inner>span{margin-left:-50%;margin-right:50%}.katex .rule{border:0 solid;display:inline-block;position:relative}.katex .hline,.katex .overline .overline-line,.katex .underline .underline-line{border-bottom-style:solid;display:inline-block;width:100%}.katex .hdashline{border-bottom-style:dashed;display:inline-block;width:100%}.katex .sqrt>.root{margin-left:.2777777778em;margin-right:-.5555555556em}.katex .fontsize-ensurer.reset-size1.size1,.katex .sizing.reset-size1.size1{font-size:1em}.katex .fontsize-ensurer.reset-size1.size2,.katex .sizing.reset-size1.size2{font-size:1.2em}.katex .fontsize-ensurer.reset-size1.size3,.katex .sizing.reset-size1.size3{font-size:1.4em}.katex .fontsize-ensurer.reset-size1.size4,.katex .sizing.reset-size1.size4{font-size:1.6em}.katex .fontsize-ensurer.reset-size1.size5,.katex .sizing.reset-size1.size5{font-size:1.8em}.katex .fontsize-ensurer.reset-size1.size6,.katex .sizing.reset-size1.size6{font-size:2em}.katex .fontsize-ensurer.reset-size1.size7,.katex .sizing.reset-size1.size7{font-size:2.4em}.katex .fontsize-ensurer.reset-size1.size8,.katex .sizing.reset-size1.size8{font-size:2.88em}.katex .fontsize-ensurer.reset-size1.size9,.katex .sizing.reset-size1.size9{font-size:3.456em}.katex .fontsize-ensurer.reset-size1.size10,.katex .sizing.reset-size1.size10{font-size:4.148em}.katex .fontsize-ensurer.reset-size1.size11,.katex .sizing.reset-size1.size11{font-size:4.976em}.katex .fontsize-ensurer.reset-size2.size1,.katex .sizing.reset-size2.size1{font-size:.8333333333em}.katex .fontsize-ensurer.reset-size2.size2,.katex .sizing.reset-size2.size2{font-size:1em}.katex .fontsize-ensurer.reset-size2.size3,.katex .sizing.reset-size2.size3{font-size:1.1666666667em}.katex .fontsize-ensurer.reset-size2.size4,.katex .sizing.reset-size2.size4{font-size:1.3333333333em}.katex .fontsize-ensurer.reset-size2.size5,.katex .sizing.reset-size2.size5{font-size:1.5em}.katex .fontsize-ensurer.reset-size2.size6,.katex .sizing.reset-size2.size6{font-size:1.6666666667em}.katex .fontsize-ensurer.reset-size2.size7,.katex .sizing.reset-size2.size7{font-size:2em}.katex .fontsize-ensurer.reset-size2.size8,.katex .sizing.reset-size2.size8{font-size:2.4em}.katex .fontsize-ensurer.reset-size2.size9,.katex .sizing.reset-size2.size9{font-size:2.88em}.katex .fontsize-ensurer.reset-size2.size10,.katex .sizing.reset-size2.size10{font-size:3.4566666667em}.katex .fontsize-ensurer.reset-size2.size11,.katex .sizing.reset-size2.size11{font-size:4.1466666667em}.katex .fontsize-ensurer.reset-size3.size1,.katex .sizing.reset-size3.size1{font-size:.7142857143em}.katex .fontsize-ensurer.reset-size3.size2,.katex .sizing.reset-size3.size2{font-size:.8571428571em}.katex .fontsize-ensurer.reset-size3.size3,.katex .sizing.reset-size3.size3{font-size:1em}.katex .fontsize-ensurer.reset-size3.size4,.katex .sizing.reset-size3.size4{font-size:1.1428571429em}.katex .fontsize-ensurer.reset-size3.size5,.katex .sizing.reset-size3.size5{font-size:1.2857142857em}.katex .fontsize-ensurer.reset-size3.size6,.katex .sizing.reset-size3.size6{font-size:1.4285714286em}.katex .fontsize-ensurer.reset-size3.size7,.katex .sizing.reset-size3.size7{font-size:1.7142857143em}.katex .fontsize-ensurer.reset-size3.size8,.katex .sizing.reset-size3.size8{font-size:2.0571428571em}.katex .fontsize-ensurer.reset-size3.size9,.katex .sizing.reset-size3.size9{font-size:2.4685714286em}.katex .fontsize-ensurer.reset-size3.size10,.katex .sizing.reset-size3.size10{font-size:2.9628571429em}.katex .fontsize-ensurer.reset-size3.size11,.katex .sizing.reset-size3.size11{font-size:3.5542857143em}.katex .fontsize-ensurer.reset-size4.size1,.katex .sizing.reset-size4.size1{font-size:.625em}.katex .fontsize-ensurer.reset-size4.size2,.katex .sizing.reset-size4.size2{font-size:.75em}.katex .fontsize-ensurer.reset-size4.size3,.katex .sizing.reset-size4.size3{font-size:.875em}.katex .fontsize-ensurer.reset-size4.size4,.katex .sizing.reset-size4.size4{font-size:1em}.katex .fontsize-ensurer.reset-size4.size5,.katex .sizing.reset-size4.size5{font-size:1.125em}.katex .fontsize-ensurer.reset-size4.size6,.katex .sizing.reset-size4.size6{font-size:1.25em}.katex .fontsize-ensurer.reset-size4.size7,.katex .sizing.reset-size4.size7{font-size:1.5em}.katex .fontsize-ensurer.reset-size4.size8,.katex .sizing.reset-size4.size8{font-size:1.8em}.katex .fontsize-ensurer.reset-size4.size9,.katex .sizing.reset-size4.size9{font-size:2.16em}.katex .fontsize-ensurer.reset-size4.size10,.katex .sizing.reset-size4.size10{font-size:2.5925em}.katex .fontsize-ensurer.reset-size4.size11,.katex .sizing.reset-size4.size11{font-size:3.11em}.katex .fontsize-ensurer.reset-size5.size1,.katex .sizing.reset-size5.size1{font-size:.5555555556em}.katex .fontsize-ensurer.reset-size5.size2,.katex .sizing.reset-size5.size2{font-size:.6666666667em}.katex .fontsize-ensurer.reset-size5.size3,.katex .sizing.reset-size5.size3{font-size:.7777777778em}.katex .fontsize-ensurer.reset-size5.size4,.katex .sizing.reset-size5.size4{font-size:.8888888889em}.katex .fontsize-ensurer.reset-size5.size5,.katex .sizing.reset-size5.size5{font-size:1em}.katex .fontsize-ensurer.reset-size5.size6,.katex .sizing.reset-size5.size6{font-size:1.1111111111em}.katex .fontsize-ensurer.reset-size5.size7,.katex .sizing.reset-size5.size7{font-size:1.3333333333em}.katex .fontsize-ensurer.reset-size5.size8,.katex .sizing.reset-size5.size8{font-size:1.6em}.katex .fontsize-ensurer.reset-size5.size9,.katex .sizing.reset-size5.size9{font-size:1.92em}.katex .fontsize-ensurer.reset-size5.size10,.katex .sizing.reset-size5.size10{font-size:2.3044444444em}.katex .fontsize-ensurer.reset-size5.size11,.katex .sizing.reset-size5.size11{font-size:2.7644444444em}.katex .fontsize-ensurer.reset-size6.size1,.katex .sizing.reset-size6.size1{font-size:.5em}.katex .fontsize-ensurer.reset-size6.size2,.katex .sizing.reset-size6.size2{font-size:.6em}.katex .fontsize-ensurer.reset-size6.size3,.katex .sizing.reset-size6.size3{font-size:.7em}.katex .fontsize-ensurer.reset-size6.size4,.katex .sizing.reset-size6.size4{font-size:.8em}.katex .fontsize-ensurer.reset-size6.size5,.katex .sizing.reset-size6.size5{font-size:.9em}.katex .fontsize-ensurer.reset-size6.size6,.katex .sizing.reset-size6.size6{font-size:1em}.katex .fontsize-ensurer.reset-size6.size7,.katex .sizing.reset-size6.size7{font-size:1.2em}.katex .fontsize-ensurer.reset-size6.size8,.katex .sizing.reset-size6.size8{font-size:1.44em}.katex .fontsize-ensurer.reset-size6.size9,.katex .sizing.reset-size6.size9{font-size:1.728em}.katex .fontsize-ensurer.reset-size6.size10,.katex .sizing.reset-size6.size10{font-size:2.074em}.katex .fontsize-ensurer.reset-size6.size11,.katex .sizing.reset-size6.size11{font-size:2.488em}.katex .fontsize-ensurer.reset-size7.size1,.katex .sizing.reset-size7.size1{font-size:.4166666667em}.katex .fontsize-ensurer.reset-size7.size2,.katex .sizing.reset-size7.size2{font-size:.5em}.katex .fontsize-ensurer.reset-size7.size3,.katex .sizing.reset-size7.size3{font-size:.5833333333em}.katex .fontsize-ensurer.reset-size7.size4,.katex .sizing.reset-size7.size4{font-size:.6666666667em}.katex .fontsize-ensurer.reset-size7.size5,.katex .sizing.reset-size7.size5{font-size:.75em}.katex .fontsize-ensurer.reset-size7.size6,.katex .sizing.reset-size7.size6{font-size:.8333333333em}.katex .fontsize-ensurer.reset-size7.size7,.katex .sizing.reset-size7.size7{font-size:1em}.katex .fontsize-ensurer.reset-size7.size8,.katex .sizing.reset-size7.size8{font-size:1.2em}.katex .fontsize-ensurer.reset-size7.size9,.katex .sizing.reset-size7.size9{font-size:1.44em}.katex .fontsize-ensurer.reset-size7.size10,.katex .sizing.reset-size7.size10{font-size:1.7283333333em}.katex .fontsize-ensurer.reset-size7.size11,.katex .sizing.reset-size7.size11{font-size:2.0733333333em}.katex .fontsize-ensurer.reset-size8.size1,.katex .sizing.reset-size8.size1{font-size:.3472222222em}.katex .fontsize-ensurer.reset-size8.size2,.katex .sizing.reset-size8.size2{font-size:.4166666667em}.katex .fontsize-ensurer.reset-size8.size3,.katex .sizing.reset-size8.size3{font-size:.4861111111em}.katex .fontsize-ensurer.reset-size8.size4,.katex .sizing.reset-size8.size4{font-size:.5555555556em}.katex .fontsize-ensurer.reset-size8.size5,.katex .sizing.reset-size8.size5{font-size:.625em}.katex .fontsize-ensurer.reset-size8.size6,.katex .sizing.reset-size8.size6{font-size:.6944444444em}.katex .fontsize-ensurer.reset-size8.size7,.katex .sizing.reset-size8.size7{font-size:.8333333333em}.katex .fontsize-ensurer.reset-size8.size8,.katex .sizing.reset-size8.size8{font-size:1em}.katex .fontsize-ensurer.reset-size8.size9,.katex .sizing.reset-size8.size9{font-size:1.2em}.katex .fontsize-ensurer.reset-size8.size10,.katex .sizing.reset-size8.size10{font-size:1.4402777778em}.katex .fontsize-ensurer.reset-size8.size11,.katex .sizing.reset-size8.size11{font-size:1.7277777778em}.katex .fontsize-ensurer.reset-size9.size1,.katex .sizing.reset-size9.size1{font-size:.2893518519em}.katex .fontsize-ensurer.reset-size9.size2,.katex .sizing.reset-size9.size2{font-size:.3472222222em}.katex .fontsize-ensurer.reset-size9.size3,.katex .sizing.reset-size9.size3{font-size:.4050925926em}.katex .fontsize-ensurer.reset-size9.size4,.katex .sizing.reset-size9.size4{font-size:.462962963em}.katex .fontsize-ensurer.reset-size9.size5,.katex .sizing.reset-size9.size5{font-size:.5208333333em}.katex .fontsize-ensurer.reset-size9.size6,.katex .sizing.reset-size9.size6{font-size:.5787037037em}.katex .fontsize-ensurer.reset-size9.size7,.katex .sizing.reset-size9.size7{font-size:.6944444444em}.katex .fontsize-ensurer.reset-size9.size8,.katex .sizing.reset-size9.size8{font-size:.8333333333em}.katex .fontsize-ensurer.reset-size9.size9,.katex .sizing.reset-size9.size9{font-size:1em}.katex .fontsize-ensurer.reset-size9.size10,.katex .sizing.reset-size9.size10{font-size:1.2002314815em}.katex .fontsize-ensurer.reset-size9.size11,.katex .sizing.reset-size9.size11{font-size:1.4398148148em}.katex .fontsize-ensurer.reset-size10.size1,.katex .sizing.reset-size10.size1{font-size:.2410800386em}.katex .fontsize-ensurer.reset-size10.size2,.katex .sizing.reset-size10.size2{font-size:.2892960463em}.katex .fontsize-ensurer.reset-size10.size3,.katex .sizing.reset-size10.size3{font-size:.337512054em}.katex .fontsize-ensurer.reset-size10.size4,.katex .sizing.reset-size10.size4{font-size:.3857280617em}.katex .fontsize-ensurer.reset-size10.size5,.katex .sizing.reset-size10.size5{font-size:.4339440694em}.katex .fontsize-ensurer.reset-size10.size6,.katex .sizing.reset-size10.size6{font-size:.4821600771em}.katex .fontsize-ensurer.reset-size10.size7,.katex .sizing.reset-size10.size7{font-size:.5785920926em}.katex .fontsize-ensurer.reset-size10.size8,.katex .sizing.reset-size10.size8{font-size:.6943105111em}.katex .fontsize-ensurer.reset-size10.size9,.katex .sizing.reset-size10.size9{font-size:.8331726133em}.katex .fontsize-ensurer.reset-size10.size10,.katex .sizing.reset-size10.size10{font-size:1em}.katex .fontsize-ensurer.reset-size10.size11,.katex .sizing.reset-size10.size11{font-size:1.1996142719em}.katex .fontsize-ensurer.reset-size11.size1,.katex .sizing.reset-size11.size1{font-size:.2009646302em}.katex .fontsize-ensurer.reset-size11.size2,.katex .sizing.reset-size11.size2{font-size:.2411575563em}.katex .fontsize-ensurer.reset-size11.size3,.katex .sizing.reset-size11.size3{font-size:.2813504823em}.katex .fontsize-ensurer.reset-size11.size4,.katex .sizing.reset-size11.size4{font-size:.3215434084em}.katex .fontsize-ensurer.reset-size11.size5,.katex .sizing.reset-size11.size5{font-size:.3617363344em}.katex .fontsize-ensurer.reset-size11.size6,.katex .sizing.reset-size11.size6{font-size:.4019292605em}.katex .fontsize-ensurer.reset-size11.size7,.katex .sizing.reset-size11.size7{font-size:.4823151125em}.katex .fontsize-ensurer.reset-size11.size8,.katex .sizing.reset-size11.size8{font-size:.578778135em}.katex .fontsize-ensurer.reset-size11.size9,.katex .sizing.reset-size11.size9{font-size:.6945337621em}.katex .fontsize-ensurer.reset-size11.size10,.katex .sizing.reset-size11.size10{font-size:.8336012862em}.katex .fontsize-ensurer.reset-size11.size11,.katex .sizing.reset-size11.size11{font-size:1em}.katex .delimsizing.size1{font-family:KaTeX_Size1}.katex .delimsizing.size2{font-family:KaTeX_Size2}.katex .delimsizing.size3{font-family:KaTeX_Size3}.katex .delimsizing.size4{font-family:KaTeX_Size4}.katex .delimsizing.mult .delim-size1>span{font-family:KaTeX_Size1}.katex .delimsizing.mult .delim-size4>span{font-family:KaTeX_Size4}.katex .nulldelimiter{display:inline-block;width:.12em}.katex .delimcenter,.katex .op-symbol{position:relative}.katex .op-symbol.small-op{font-family:KaTeX_Size1}.katex .op-symbol.large-op{font-family:KaTeX_Size2}.katex .accent>.vlist-t,.katex .op-limits>.vlist-t{text-align:center}.katex .accent .accent-body{position:relative}.katex .accent .accent-body:not(.accent-full){width:0}.katex .overlay{display:block}.katex .mtable .vertical-separator{display:inline-block;min-width:1px}.katex .mtable .arraycolsep{display:inline-block}.katex .mtable .col-align-c>.vlist-t{text-align:center}.katex .mtable .col-align-l>.vlist-t{text-align:left}.katex .mtable .col-align-r>.vlist-t{text-align:right}.katex .svg-align{text-align:left}.katex svg{fill:currentColor;stroke:currentColor;display:block;height:inherit;position:absolute;width:100%}.katex svg path{stroke:none}.katex svg{fill-rule:nonzero;fill-opacity:1;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1}.katex img{border-style:none;max-height:none;max-width:none;min-height:0;min-width:0}.katex .stretchy{display:block;overflow:hidden;position:relative;width:100%}.katex .stretchy:after,.katex .stretchy:before{content:""}.katex .hide-tail{overflow:hidden;position:relative;width:100%}.katex .halfarrow-left{left:0;overflow:hidden;position:absolute;width:50.2%}.katex .halfarrow-right{overflow:hidden;position:absolute;right:0;width:50.2%}.katex .brace-left{left:0;overflow:hidden;position:absolute;width:25.1%}.katex .brace-center{left:25%;overflow:hidden;position:absolute;width:50%}.katex .brace-right{overflow:hidden;position:absolute;right:0;width:25.1%}.katex .x-arrow-pad{padding:0 .5em}.katex .cd-arrow-pad{padding:0 .55556em 0 .27778em}.katex .mover,.katex .munder,.katex .x-arrow{text-align:center}.katex .boxpad{padding:0 .3em}.katex .fbox,.katex .fcolorbox{border:.04em solid;box-sizing:border-box}.katex .cancel-pad{padding:0 .2em}.katex .cancel-lap{margin-left:-.2em;margin-right:-.2em}.katex .sout{border-bottom-style:solid;border-bottom-width:.08em}.katex .angl{border-right:.049em solid;border-top:.049em solid;box-sizing:border-box;margin-right:.03889em}.katex .anglpad{padding:0 .03889em}.katex .eqn-num:before{content:"(" counter(katexEqnNo) ")";counter-increment:katexEqnNo}.katex .mml-eqn-num:before{content:"(" counter(mmlEqnNo) ")";counter-increment:mmlEqnNo}.katex .mtr-glue{width:50%}.katex .cd-vert-arrow{display:inline-block;position:relative}.katex .cd-label-left{display:inline-block;position:absolute;right:calc(50% + .3em);text-align:left}.katex .cd-label-right{display:inline-block;left:calc(50% + .3em);position:absolute;text-align:right}.katex-display{display:block;margin:1em 0;text-align:center}.katex-display>.katex{display:block;text-align:center;white-space:nowrap}.katex-display>.katex>.katex-html{display:block;position:relative}.katex-display>.katex>.katex-html>.tag{position:absolute;right:0}.katex-display.leqno>.katex>.katex-html>.tag{left:0;right:auto}.katex-display.fleqn>.katex{padding-left:2em;text-align:left}body{counter-reset:katexEqnNo mmlEqnNo} diff --git a/frontends/desktop/dist/assets/setup-BtYdaXRD.js b/frontends/desktop/dist/assets/setup-BtYdaXRD.js new file mode 100644 index 000000000..e5be292c3 --- /dev/null +++ b/frontends/desktop/dist/assets/setup-BtYdaXRD.js @@ -0,0 +1,2 @@ +import{c as te,b as c,an as G,ao as oe,aj as r,T as f,ap as I,av as re,at as ne,aq as ae,as as ie,ar as ce}from"./tauri-compat-tfiFK9EG.js";import{B as F}from"./index-DpGuh58E.js";import{B as L}from"./index-Bpi3BHKj.js";import{I as se}from"./IconFile-CgfQSwGI.js";function le(t){return c.createElement("svg",Object.assign({viewBox:"0 0 24 24",fill:"none",xmlns:"http://www.w3.org/2000/svg",width:"1em",height:"1em",focusable:!1,"aria-hidden":!0},t),c.createElement("path",{fillRule:"evenodd",clipRule:"evenodd",d:"M2 5a3 3 0 0 1 3-3h3.3a2 2 0 0 1 1.25.44l1.13.9a3 3 0 0 0 1.87.66H18c2 0 3 2 3 4H7.53A2 2 0 0 0 5.6 9.48L2.57 20.76C2.21 20.26 2 19.66 2 19V5Zm20.17 5H9.5a2 2 0 0 0-1.92 1.44l-2.7 9.28A1 1 0 0 0 5.82 22H18.5a2 2 0 0 0 1.92-1.44l2.7-9.28a1 1 0 0 0-.95-1.28Z",fill:"currentColor"}))}const pe=te(le,"folder_open");function C(){return window.__TAURI__}function de(t,e){return Number.isFinite(e.seq)?e.seq>t:!0}function O(t,e,n,i="prepare_failed"){const u=e==null?"":oe(e);return{seq:n,mode:"cold_start",phase:"failed",stage:null,progress:0,failure:{code:u?i:"unknown",detail:u},diagnostics:{buildId:"",platform:navigator.platform||"",projectDir:t[1]||"",pythonPath:t[0]||"",portState:"unknown",bridgeIdentity:null,recentLogs:[]}}}async function ue(t,e=0){const n=await t("get_config").catch(()=>["",""]);try{return{config:n,mode:"snapshot",snapshot:await t("get_bootstrap_snapshot")}}catch(i){if(!G(i,"get_bootstrap_snapshot"))throw i;const u=await t("get_prepare_error").catch(()=>null);return{config:n,mode:"legacy",snapshot:O(n,u,e)}}}async function he(t,e,n){if(n==="snapshot")try{return await t("retry_bootstrap",e),{mode:"snapshot"}}catch(i){if(!G(i,"retry_bootstrap"))return{mode:"snapshot",error:i}}try{return await t("start_bridge_with_config",e),{mode:"legacy"}}catch(i){return{mode:"legacy",error:i}}}async function ye(t,e,n){const i=await t("pick_directory",{title:n});if(!i)return null;const u=await t("discover_python_for_project",{projectDir:i,currentPython:e||null}).catch(()=>e);return{projectDir:i,pythonPath:u||""}}async function ge(t,e){return t("pick_python_interpreter",{title:e})}const H={config_unresolved:{zh:{title:"未找到应用文件",description:"请选择应用文件夹后继续。"},en:{title:"Application files not found",description:"Choose the application folder to continue."}},prepare_failed:{zh:{title:"运行环境尚未准备完成",description:"请检查所选应用文件夹和 Python 环境,然后继续启动。"},en:{title:"Environment setup is incomplete",description:"Check the application folder and Python environment, then continue startup."}},spawn_failed:{zh:{title:"本地连接未能启动",description:"请选择可用的应用文件夹和 Python 环境后继续。"},en:{title:"Local connection could not start",description:"Choose a usable application folder and Python environment to continue."}},bridge_shutdown_refused:{zh:{title:"本地连接暂时无法安全重启",description:"请等待当前操作完成后重试。"},en:{title:"Local connection cannot restart safely",description:"Wait for the current operation to finish, then retry."}},port_conflict:{zh:{title:"本地连接被占用",description:"另一个应用正在使用本地连接。关闭相关应用后继续启动。"},en:{title:"Local connection is in use",description:"Another app is using the local connection. Close it, then continue startup."}},service_timeout:{zh:{title:"本地连接启动时间过长",description:"请检查所选位置;诊断信息中包含最近的启动记录。"},en:{title:"Local connection is taking too long",description:"Check the selected locations. Diagnostics contain the latest startup records."}},service_exited:{zh:{title:"本地连接意外停止",description:"诊断信息中包含停止状态和最近的启动记录。"},en:{title:"Local connection stopped unexpectedly",description:"Diagnostics contain the stop status and latest startup records."}},ui_navigation_failed:{zh:{title:"主界面未能打开",description:"本地连接已经就绪,但界面加载失败。诊断信息中包含详细原因。"},en:{title:"Main window could not open",description:"The local connection is ready, but the interface failed to load. Diagnostics contain details."}},unknown:{zh:{title:"启动尚未完成",description:"请检查所选位置;需要协助时可复制诊断信息。"},en:{title:"Startup is not complete",description:"Check the selected locations. Copy diagnostics if you need support."}}},fe={zh:{pageTitle:"完成启动设置",intro:"选择应用运行所需的位置。你的记忆、会话和设置不会受到影响。",projectLabel:"应用文件夹",projectHint:"选择此前用于运行桌面版的应用文件夹。",projectPickerTitle:"选择应用文件夹",chooseProject:"选择文件夹",changeProject:"重新选择",projectEmpty:"尚未选择应用文件夹",pythonLabel:"Python 环境",pythonHint:"应用会自动选择可用环境;如有需要,可以重新选择。",pythonPickerTitle:"选择 Python 环境",choosePython:"选择环境",changePython:"重新选择",pythonEmpty:"选择应用文件夹后自动识别",pickerError:"无法打开或读取所选位置,请查看诊断信息。",retry:"继续启动",retrying:"正在启动…",diagnostics:"诊断信息",copy:"复制诊断信息",copied:"已复制,可发送给技术支持。",selectCopy:"请手动复制已选中的诊断信息。",privacy:"诊断信息包含本机路径和错误日志,不包含 API Key、会话或记忆内容。",helpFeedback:"帮助与反馈",contact:"如果仍无法完成启动,可添加微信联系:"},en:{pageTitle:"Complete startup setup",intro:"Choose the locations the app needs to run. Your memory, sessions, and settings will not be affected.",projectLabel:"Application folder",projectHint:"Choose the application folder previously used to run the desktop app.",projectPickerTitle:"Choose the application folder",chooseProject:"Choose folder",changeProject:"Choose again",projectEmpty:"No application folder selected",pythonLabel:"Python environment",pythonHint:"The app selects an available environment automatically. You can choose another if needed.",pythonPickerTitle:"Choose a Python environment",choosePython:"Choose environment",changePython:"Choose again",pythonEmpty:"Detected after you choose the application folder",pickerError:"The selected location could not be opened or read. Check diagnostics for details.",retry:"Continue startup",retrying:"Starting…",diagnostics:"Diagnostic details",copy:"Copy diagnostics",copied:"Copied. You can send it to technical support.",selectCopy:"Copy the selected diagnostics manually.",privacy:"Diagnostics contain local paths and error logs. They do not contain API keys, sessions, or memory content.",helpFeedback:"Help & Feedback",contact:"If you still cannot complete startup, contact us on WeChat:"}};function V(){return(navigator.language||"").toLowerCase().startsWith("zh")?"zh":"en"}function me(t){return fe[t]}function je(t,e){const n=t&&t in H?t:"unknown";return H[n][e]}function be(t){var u,l;const e=t==null?void 0:t.diagnostics,n=Array.isArray(e==null?void 0:e.recentLogs)?e.recentLogs:[];let i="";try{i=sessionStorage.getItem("ga-setup-fallback-reason")||""}catch{i=""}return["GenericAgent Desktop startup diagnostics",`time: ${new Date().toISOString()}`,`setup_guard_reason: ${i}`,`build_id: ${(e==null?void 0:e.buildId)||""}`,`platform: ${(e==null?void 0:e.platform)||""}`,`mode: ${(t==null?void 0:t.mode)||""}`,`phase: ${(t==null?void 0:t.phase)||""}`,`failure_code: ${((u=t==null?void 0:t.failure)==null?void 0:u.code)||""}`,`project_dir: ${(e==null?void 0:e.projectDir)||""}`,`python_path: ${(e==null?void 0:e.pythonPath)||""}`,`port_state: ${(e==null?void 0:e.portState)||"unknown"}`,`bridge_identity: ${(e==null?void 0:e.bridgeIdentity)||""}`,`error: ${((l=t==null?void 0:t.failure)==null?void 0:l.detail)||""}`,"recent_logs:",...n].join(` +`)}const B={projectDir:"",pythonPath:""};function q({label:t,hint:e,value:n,emptyText:i,buttonText:u,buttonLabel:l,loading:k,disabled:m,icon:j,onChoose:P}){return r.jsxs("section",{className:"ga-setup-location","aria-label":t,children:[r.jsxs("div",{className:"ga-setup-location-header",children:[r.jsx(f.Text,{strong:!0,children:t}),r.jsx(L,{size:"small",type:"tertiary",theme:"light",icon:j,loading:k,disabled:m,"aria-label":l,onClick:P,children:u})]}),r.jsx("div",{className:`ga-setup-path${n?"":" ga-setup-path--empty"}`,role:"textbox","aria-readonly":"true","aria-label":t,tabIndex:0,children:n?r.jsx("code",{children:n}):r.jsx("span",{children:i})}),r.jsx(f.Paragraph,{type:"tertiary",size:"small",className:"ga-setup-location-hint",children:e})]})}function S(t,e){return{seq:e,mode:"cold_start",phase:"failed",stage:null,progress:0,failure:{code:"unknown",detail:String(t)},diagnostics:{buildId:"",platform:navigator.platform||"",projectDir:"",pythonPath:"",portState:"unknown",bridgeIdentity:null,recentLogs:[]}}}function Pe(){var M;const t=V(),e=me(t),n=c.useRef(B),[i,u]=c.useState(B),[l,k]=c.useState(null),[m,j]=c.useState(!1),[P,N]=c.useState(!1),[T,z]=c.useState(!1),[R,b]=c.useState(""),[W,E]=c.useState(""),g=c.useRef(-1),w=c.useRef(null),D=c.useRef("snapshot"),h=c.useCallback(o=>{n.current=o,u(o)},[]),y=c.useCallback(o=>{var d,s,_,v;const a=w.current;if(!de(g.current,o))return;g.current=Number.isFinite(o.seq)?o.seq:g.current+1,w.current=o,k(o),o.phase==="failed"&&j(!1);const p={};(d=o.diagnostics)!=null&&d.projectDir&&(!n.current.projectDir||((s=a==null?void 0:a.diagnostics)==null?void 0:s.projectDir)===n.current.projectDir)&&(p.projectDir=o.diagnostics.projectDir),(_=o.diagnostics)!=null&&_.pythonPath&&(!n.current.pythonPath||((v=a==null?void 0:a.diagnostics)==null?void 0:v.pythonPath)===n.current.pythonPath)&&(p.pythonPath=o.diagnostics.pythonPath),Object.keys(p).length&&h({...n.current,...p})},[h]);c.useEffect(()=>{var o;(o=window.__GA_SETUP_MARK_READY__)==null||o.call(window)},[]),c.useEffect(()=>{const o=C();if(!(o!=null&&o.core.invoke)){y(S("Tauri bootstrap API is unavailable",0));return}let a=!0,p;return(async()=>{var v;if((v=o.event)!=null&&v.listen)try{const x=await o.event.listen("bootstrap",ee=>{a&&y(ee.payload)});if(!a){x();return}p=x}catch(x){console.warn("[setup] bootstrap events unavailable; using command compatibility mode",x)}const d=await ue(o.core.invoke,g.current+1);if(!a)return;D.current=d.mode;const s=d.config,_={pythonPath:(s==null?void 0:s[0])||"",projectDir:(s==null?void 0:s[1])||""};h({pythonPath:n.current.pythonPath||_.pythonPath,projectDir:n.current.projectDir||_.projectDir}),y(d.snapshot)})().catch(d=>{a&&y(S(d,g.current+1))}),()=>{a=!1,p==null||p()}},[h,y]);const $=c.useMemo(()=>{var o;return je((o=l==null?void 0:l.failure)==null?void 0:o.code,t)},[t,(M=l==null?void 0:l.failure)==null?void 0:M.code]),A=c.useMemo(()=>be(l),[l]),Z=c.useCallback(async()=>{const o=C();if(!(o!=null&&o.core.invoke)){b(e.pickerError);return}N(!0),b("");try{const a=await ye(o.core.invoke,n.current.pythonPath,e.projectPickerTitle);a&&h(a)}catch(a){console.error("[setup] application folder selection failed",a),b(e.pickerError)}finally{N(!1)}},[h,e]),J=c.useCallback(async()=>{const o=C();if(!(o!=null&&o.core.invoke)){b(e.pickerError);return}z(!0),b("");try{const a=await ge(o.core.invoke,e.pythonPickerTitle);a&&h({...n.current,pythonPath:a})}catch(a){console.error("[setup] Python environment selection failed",a),b(e.pickerError)}finally{z(!1)}},[h,e]),Q=c.useCallback(async()=>{const o=n.current.projectDir.trim(),a=n.current.pythonPath.trim();if(h({projectDir:o,pythonPath:a}),E(""),!o){const s=w.current??S("",g.current+1);y({...s,seq:g.current+1,phase:"failed",failure:{code:"config_unresolved",detail:""}});return}j(!0);const p=C();if(!(p!=null&&p.core.invoke)){y(S("Tauri bootstrap API is unavailable",g.current+1)),j(!1);return}const d=await he(p.core.invoke,{pythonPath:a,projectDir:o},D.current);if(D.current=d.mode,d.error){if(d.mode==="legacy")y(O([a,o],d.error,g.current+1,"spawn_failed"));else{const s=await p.core.invoke("get_bootstrap_snapshot").catch(()=>w.current);s&&y(s)}j(!1)}},[h,y]),X=c.useCallback(async()=>{var o;try{if(!((o=navigator.clipboard)!=null&&o.writeText))throw new Error("clipboard unavailable");await navigator.clipboard.writeText(A),E(e.copied)}catch{const p=document.getElementById("diagnostics");if(p){const d=document.createRange();d.selectNodeContents(p);const s=window.getSelection();s==null||s.removeAllRanges(),s==null||s.addRange(d),p.focus()}E(e.selectCopy)}},[e,A]);return r.jsx("main",{className:"ga-setup-page",children:r.jsxs("section",{className:"ga-setup-panel","aria-labelledby":"ga-setup-title",children:[r.jsxs("header",{className:"ga-setup-header",children:[r.jsx(f.Title,{id:"ga-setup-title",heading:3,children:e.pageTitle}),r.jsx(f.Paragraph,{type:"tertiary",children:e.intro})]}),(l==null?void 0:l.failure)&&r.jsx(F,{className:"ga-setup-banner",type:"danger",fullMode:!1,bordered:!0,title:$.title,description:$.description,closeIcon:null}),l&&!l.failure&&m&&r.jsx(F,{className:"ga-setup-banner",type:"info",fullMode:!1,bordered:!0,title:e.retrying,description:l.stage||l.phase,closeIcon:null}),r.jsxs("div",{className:"ga-setup-form",children:[r.jsx(q,{label:e.projectLabel,hint:e.projectHint,value:i.projectDir,emptyText:e.projectEmpty,buttonText:i.projectDir?e.changeProject:e.chooseProject,buttonLabel:e.projectPickerTitle,loading:P,disabled:m||T,icon:r.jsx(pe,{}),onChoose:()=>void Z()}),r.jsx(q,{label:e.pythonLabel,hint:e.pythonHint,value:i.pythonPath,emptyText:e.pythonEmpty,buttonText:i.pythonPath?e.changePython:e.choosePython,buttonLabel:e.pythonPickerTitle,loading:T,disabled:m||P,icon:r.jsx(se,{}),onChoose:()=>void J()}),R&&r.jsx(f.Text,{className:"ga-setup-picker-status",type:"danger",size:"small",role:"status",children:R}),r.jsx(L,{type:"primary",theme:"solid",block:!0,loading:m,disabled:P||T,className:"ga-setup-retry",onClick:()=>void Q(),children:m?e.retrying:e.retry})]}),r.jsxs(I,{className:"ga-setup-diagnostics",accordion:!0,children:[r.jsxs(I.Panel,{itemKey:"diagnostics",header:e.diagnostics,children:[r.jsxs("div",{className:"ga-setup-diagnostics-actions",children:[r.jsx(L,{size:"small",theme:"light",icon:r.jsx(re,{}),onClick:()=>void X(),children:e.copy}),r.jsx(f.Text,{type:"tertiary",size:"small","aria-live":"polite",children:W})]}),r.jsx("pre",{id:"diagnostics",tabIndex:0,children:A}),r.jsx(f.Paragraph,{type:"tertiary",size:"small",className:"ga-setup-privacy",children:e.privacy})]}),r.jsxs(I.Panel,{itemKey:"help-feedback",header:e.helpFeedback,children:[r.jsx(f.Paragraph,{type:"tertiary",size:"small",className:"ga-setup-contact-copy",children:e.contact}),r.jsxs("div",{className:"ga-setup-contact-ids",children:[r.jsx("code",{children:"RoundSquisheen"}),r.jsx("code",{children:"_Ashes_in_the_Snow_"})]})]})]})]})})}function U(t){t.matches?(document.documentElement.dataset.appearance="dark",document.body.setAttribute("theme-mode","dark")):(document.documentElement.dataset.appearance="light",document.body.removeAttribute("theme-mode"))}var Y,K;try{const t=window.matchMedia("(prefers-color-scheme: dark)");U(t),(Y=t.addEventListener)==null||Y.call(t,"change",()=>U(t));const e=document.getElementById("setup-root");if(!e)throw new Error("Setup root is missing");ne.createRoot(e).render(r.jsx(c.StrictMode,{children:r.jsx(ae,{locale:V()==="zh"?ie:ce,children:r.jsx(Pe,{})})}))}catch(t){console.error("[setup] failed to mount recovery UI",t),(K=window.__GA_SETUP_FALLBACK__)==null||K.call(window,"setup_mount_failed")} diff --git a/frontends/desktop/dist/assets/setup-D74O8rBf.css b/frontends/desktop/dist/assets/setup-D74O8rBf.css new file mode 100644 index 000000000..094c906e5 --- /dev/null +++ b/frontends/desktop/dist/assets/setup-D74O8rBf.css @@ -0,0 +1 @@ +:root{font-family:-apple-system,BlinkMacSystemFont,SF Pro Text,Segoe UI,Microsoft YaHei UI,Helvetica Neue,sans-serif;background:var(--semi-color-bg-0);color:var(--semi-color-text-0)}*{box-sizing:border-box}html,body,#setup-root{width:100%;min-height:100%;margin:0}body{background:var(--semi-color-bg-0)}.ga-setup-page{min-height:100vh;display:flex;justify-content:center;padding:34px 40px 28px;background:radial-gradient(circle at 50% 0,color-mix(in srgb,var(--semi-color-primary) 7%,transparent),transparent 34%),var(--semi-color-bg-0)}.ga-setup-panel{width:min(100%,500px)}.ga-setup-header .semi-typography{margin:0}.ga-setup-header .semi-typography-paragraph{margin-top:8px;line-height:1.6}.ga-setup-banner{margin:20px 0;border-radius:var(--semi-border-radius-medium)}.ga-setup-form{margin-top:20px}.ga-setup-location{margin-bottom:18px}.ga-setup-location-header{display:flex;align-items:center;justify-content:space-between;gap:12px;margin-bottom:7px}.ga-setup-path{width:100%;min-height:42px;padding:10px 12px;border:1px solid var(--semi-color-border);border-radius:var(--semi-border-radius-medium);outline:none;background:var(--semi-color-fill-0);color:var(--semi-color-text-0);white-space:normal;overflow-wrap:anywhere;word-break:break-word;-webkit-user-select:text;user-select:text}.ga-setup-path:focus-visible{border-color:var(--semi-color-primary);box-shadow:0 0 0 2px var(--semi-color-primary-light-default)}.ga-setup-path code{font:13px/1.55 ui-monospace,SFMono-Regular,Consolas,monospace}.ga-setup-path--empty{color:var(--semi-color-text-2);font-size:13px}.ga-setup-location-hint.semi-typography{margin:6px 0 0;line-height:1.45}.ga-setup-picker-status{display:block;margin:-4px 0 12px}.ga-setup-retry{margin-top:2px}.ga-setup-diagnostics{margin-top:20px;border-top:1px solid var(--semi-color-border)}.ga-setup-diagnostics .semi-collapse-header{padding-inline:4px;color:var(--semi-color-text-2)}.ga-setup-diagnostics-actions{display:flex;align-items:center;gap:10px;margin-bottom:10px}.ga-setup-diagnostics pre{max-height:200px;margin:0;padding:12px;overflow:auto;border:1px solid var(--semi-color-border);border-radius:var(--semi-border-radius-medium);outline:none;background:var(--semi-color-fill-0);color:var(--semi-color-text-1);font:11px/1.55 ui-monospace,SFMono-Regular,Consolas,monospace;white-space:pre-wrap;overflow-wrap:anywhere;-webkit-user-select:text;user-select:text}.ga-setup-diagnostics pre:focus-visible{border-color:var(--semi-color-primary);box-shadow:0 0 0 2px var(--semi-color-primary-light-default)}.ga-setup-privacy.semi-typography{margin:9px 0 0;line-height:1.45}.ga-setup-contact-copy.semi-typography{margin:0 0 10px;line-height:1.5}.ga-setup-contact-ids{display:flex;flex-wrap:wrap;gap:8px}.ga-setup-contact-ids code{padding:6px 9px;border-radius:var(--semi-border-radius-medium);background:var(--semi-color-fill-0);color:var(--semi-color-text-0);font:12px/1.4 ui-monospace,SFMono-Regular,Consolas,monospace;overflow-wrap:anywhere;-webkit-user-select:text;user-select:text} diff --git a/frontends/desktop/dist/assets/tauri-compat-BTcpEvqB.css b/frontends/desktop/dist/assets/tauri-compat-BTcpEvqB.css new file mode 100644 index 000000000..9329dbdf2 --- /dev/null +++ b/frontends/desktop/dist/assets/tauri-compat-BTcpEvqB.css @@ -0,0 +1 @@ +.semi-portal-inner{position:absolute;background-color:#0000;min-width:max-content}.semi-ai-chat-dialogue{display:flex;flex-direction:column;height:100%}.semi-ai-chat-dialogue-list{flex:1 1;position:relative;overflow-y:scroll}.semi-ai-chat-dialogue-list-scroll-hidden::-webkit-scrollbar{display:none}.semi-ai-chat-dialogue-wrapper{box-sizing:border-box;display:flex;flex-direction:row;align-items:center;width:100%;flex-wrap:nowrap;padding:8px 16px;margin-top:2px;column-gap:16px}.semi-ai-chat-dialogue-wrapper-selected{background-color:var(--semi-color-fill-0);border-radius:16px}.semi-ai-chat-dialogue-wrapper .semi-ai-chat-dialogue-container{flex:1 1 auto;display:flex;flex-direction:row;column-gap:12px}.semi-ai-chat-dialogue-wrapper .semi-ai-chat-dialogue-container-right{flex-direction:row-reverse}.semi-ai-chat-dialogue-wrapper .semi-ai-chat-dialogue-container-right .semi-ai-chat-dialogue-inner{align-items:flex-end}.semi-ai-chat-dialogue-wrapper .semi-ai-chat-dialogue-container-right .semi-ai-chat-dialogue-content-no-bubble,.semi-ai-chat-dialogue-wrapper .semi-ai-chat-dialogue-container-right .semi-ai-chat-dialogue-content-user,.semi-ai-chat-dialogue-wrapper .semi-ai-chat-dialogue-container-right .semi-ai-chat-dialogue-content-custom-renderer{margin-left:auto}.semi-ai-chat-dialogue-wrapper .semi-ai-chat-dialogue-container-right .semi-ai-chat-dialogue-content-inner{text-align:right}.semi-ai-chat-dialogue-wrapper .semi-ai-chat-dialogue-container-right .semi-ai-chat-dialogue-content-inner .semi-markdownRender{text-align:left}.semi-ai-chat-dialogue-wrapper:hover .semi-ai-chat-dialogue-action:not(.semi-ai-chat-dialogue-action-hidden){visibility:visible}.semi-ai-chat-dialogue-backBottom{position:relative;z-index:1}.semi-ai-chat-dialogue-backBottom-button{width:42px;height:42px;border-radius:50%}.semi-ai-chat-dialogue-backBottom .semi-button{position:absolute;bottom:10px;left:50%;transform:translate(-50%);display:flex;justify-content:center;align-items:center}.semi-ai-chat-dialogue-title{line-height:20px;font-size:16px;font-weight:400}.semi-ai-chat-dialogue-inner{width:100%;display:flex;flex-direction:column}.semi-ai-chat-dialogue-avatar{flex-shrink:0;width:24px;height:24px}.semi-ai-chat-dialogue-avatar-hidden{visibility:hidden}.semi-ai-chat-dialogue-content{max-width:100%;font-size:14px}.semi-ai-chat-dialogue-content pre{background-color:#0000}.semi-ai-chat-dialogue-content-editing{width:100%}.semi-ai-chat-dialogue-content-wrapper{display:flex;align-items:end}.semi-ai-chat-dialogue-content-inner{margin-left:auto;width:100%}.semi-ai-chat-dialogue-content-failed{color:var(--semi-color-danger);margin-right:8px}.semi-ai-chat-dialogue-content-user{display:flex}.semi-ai-chat-dialogue-content-user:hover .semi-ai-chat-dialogue-content-icon-reference{padding:0 8px;cursor:pointer;display:flex;justify-content:center;align-items:center}.semi-ai-chat-dialogue-content-bubble,.semi-ai-chat-dialogue-content-userBubble{margin-top:8px;padding:12px 16px;border-radius:var(--semi-border-radius-large);background-color:var(--semi-color-fill-0);max-width:100%;box-sizing:border-box;width:fit-content}.semi-ai-chat-dialogue-content-no-bubble{margin-top:8px;width:fit-content}.semi-ai-chat-dialogue-content-loading{display:flex;align-items:center;margin-top:8px}.semi-ai-chat-dialogue-content-loading>span:nth-child(1){animation-delay:-.2s;background-color:#5338ff}.semi-ai-chat-dialogue-content-loading>span:nth-child(2){animation-delay:-.1s;background-color:#b030f0}.semi-ai-chat-dialogue-content-loading>span:nth-child(3){animation-delay:0ms;background-color:#e72dff}.semi-ai-chat-dialogue-content-loading-item{border-radius:var(--semi-border-radius-circle);height:3px;width:3px;margin:1px;overflow:visible;position:relative;animation:semi-ai-chat-dialogue-loading-bounce 1s infinite ease}.semi-ai-chat-dialogue-content-loading-text{margin-left:8px;color:var(--semi-color-text-3);font-size:14px}.semi-ai-chat-dialogue-content-icon-reference{display:none}.semi-ai-chat-dialogue-content-img{margin-top:8px;border-radius:var(--semi-border-radius-medium)}.semi-ai-chat-dialogue-content-img img{width:256px;height:256px;object-fit:cover}.semi-ai-chat-dialogue-content-img-list{display:inline-flex;flex-direction:column;margin-right:4px}.semi-ai-chat-dialogue-content-img-list img{width:128px;height:128px;object-fit:cover}.semi-ai-chat-dialogue-content-img-last{margin-right:0}.semi-ai-chat-dialogue-content-file{display:inline-flex;flex-direction:row;align-items:center;height:36px;width:224px;column-gap:8px;padding:8px;margin-top:8px;margin-right:8px;border-radius:var(--semi-border-radius-medium);background:var(--semi-color-fill-0);text-decoration:none;vertical-align:top}.semi-ai-chat-dialogue-content-file:hover .semi-ai-chat-dialogue-content-icon-reference{flex-shrink:0;padding:0 8px;cursor:pointer;display:flex;justify-content:center;align-items:center;margin-left:auto;color:var(--semi-color-text-0)}.semi-ai-chat-dialogue-content-file:hover .semi-ai-chat-dialogue-content-file-title-ellipsis{max-width:140px}.semi-ai-chat-dialogue-content-file-last{margin-right:0}.semi-ai-chat-dialogue-content-file-icon{color:var(--semi-color-white)}.semi-ai-chat-dialogue-content-file-icon-wrapper{width:36px;height:36px;border-radius:var(--semi-border-radius-extra-small);flex-shrink:0;display:flex;justify-content:center;align-items:center}.semi-ai-chat-dialogue-content-file-icon-code{background-color:rgba(var(--semi-teal-4),1)}.semi-ai-chat-dialogue-content-file-icon-word{background-color:rgba(var(--semi-blue-4),1)}.semi-ai-chat-dialogue-content-file-icon-pdf{background-color:rgba(var(--semi-red-4),1)}.semi-ai-chat-dialogue-content-file-icon-excel{background-color:rgba(var(--semi-green-4),1)}.semi-ai-chat-dialogue-content-file-icon-video{background-color:rgba(var(--semi-purple-4),1)}.semi-ai-chat-dialogue-content-file-icon-image .semi-ai-chat-dialogue-content-file-icon{background-size:cover;background-position:center;width:36px;height:36px}.semi-ai-chat-dialogue-content-file-icon-default{background-color:rgba(var(--semi-grey-4),1)}.semi-ai-chat-dialogue-content-file-info{display:flex;flex-direction:column;text-align:left;flex-shrink:1}.semi-ai-chat-dialogue-content-file-title{font-size:16px;color:var(--semi-color-text-0);max-width:180px;white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.semi-ai-chat-dialogue-content-file-metadata{font-size:14px;color:var(--semi-color-text-2)}.semi-ai-chat-dialogue-content-file-type{text-transform:uppercase}.semi-ai-chat-dialogue-content-tool-call{display:flex;color:var(--semi-color-text-2);padding:6px 8px;background-color:var(--semi-color-fill-0);border-radius:var(--semi-border-radius-medium);width:fit-content;align-items:center;justify-content:center;column-gap:4px;margin-top:8px}.semi-ai-chat-dialogue-content-custom-renderer{margin-top:8px;width:fit-content}.semi-ai-chat-dialogue-action{margin-top:8px;visibility:hidden}.semi-ai-chat-dialogue-action-btn{width:24px;height:24px}.semi-ai-chat-dialogue-action-icon-flip{transform:scaleY(-1)}.semi-ai-chat-dialogue-action-show{visibility:visible}.semi-ai-chat-dialogue-action.semi-ai-chat-dialogue-action-hidden,.semi-ai-chat-dialogue-action:hover.semi-ai-chat-dialogue-action-hidden{visibility:hidden}.semi-ai-chat-dialogue-action-dropdown li{color:var(--semi-color-danger)}.semi-ai-chat-dialogue-action-dropdown .semi-icon{font-size:16px}.semi-ai-chat-dialogue-reasoning{width:100%}.semi-ai-chat-dialogue-reasoning-wrapper{width:100%;margin-top:8px;cursor:pointer;border:1px solid var(--semi-color-border);border-radius:var(--semi-border-radius-large)}.semi-ai-chat-dialogue-reasoning-header{box-sizing:border-box;display:flex;flex-direction:row;align-items:center;justify-content:center;padding:16px}.semi-ai-chat-dialogue-reasoning-header-prefix,.semi-ai-chat-dialogue-reasoning-header-suffix{width:20px;height:20px;display:flex;justify-content:center;align-items:center}.semi-ai-chat-dialogue-reasoning-header-title{flex:1 1 auto;line-height:22px;font-weight:600}.semi-ai-chat-dialogue-reasoning-content{padding:12px 16px;border-top:1px solid var(--semi-color-border)}.semi-ai-chat-dialogue-step{display:inline-flex;flex-direction:row;align-items:center;line-height:20px;padding:6px 12px;border:1px solid var(--semi-color-border);border-radius:var(--semi-border-radius-medium);margin-top:12px;font-size:14px}.semi-ai-chat-dialogue-step .semi-ai-chat-dialogue-content-loading{margin-top:0}.semi-ai-chat-dialogue-step-completed{color:var(--semi-color-success)}.semi-ai-chat-dialogue-step-summary{display:inline-block;width:fit-content;cursor:pointer}.semi-ai-chat-dialogue-step-prefix{width:20px;height:20px;color:var(--semi-color-text-1);display:flex;justify-content:center;align-items:center;margin-right:6px}.semi-ai-chat-dialogue-step-suffix{width:20px;height:20px;display:flex;justify-content:center;align-items:center;color:var(--semi-color-text-1);margin-left:8px}.semi-ai-chat-dialogue-step-panel{display:flex;gap:12px}.semi-ai-chat-dialogue-step-line{width:1px;background-color:var(--semi-color-border);margin-left:20px}.semi-ai-chat-dialogue-step-action{line-height:20px;margin-top:12px;font-size:14px}.semi-ai-chat-dialogue-step-action-summary{margin-bottom:4px}.semi-ai-chat-dialogue-step-action-desc{display:inline-flex;color:var(--semi-color-text-2);padding:6px 8px;background-color:var(--semi-color-fill-0);border-radius:var(--semi-border-radius-medium);width:fit-content;align-items:center;justify-content:center;column-gap:4px}.semi-ai-chat-dialogue-step-wrapper>.semi-ai-chat-dialogue-step:first-child{margin-top:4px}.semi-ai-chat-dialogue-annotation{width:100%}.semi-ai-chat-dialogue-annotation-wrapper{width:fit-content;margin-top:8px;flex:1 1 auto;border:1px solid var(--semi-color-border);border-radius:var(--semi-border-radius-medium);padding:8px 12px}.semi-ai-chat-dialogue-annotation-wrapper:hover{background-color:var(--semi-color-fill-0)}.semi-ai-chat-dialogue-annotation-content{display:flex;flex-direction:row;align-items:center;justify-content:center;column-gap:8px;font-size:14px;color:var(--semi-color-text-2);cursor:pointer}.semi-ai-chat-dialogue-annotation-content .semi-avatar-group{display:flex}.semi-ai-chat-dialogue-annotation-content-logo{width:16px;height:16px;display:flex}.semi-ai-chat-dialogue-annotation-content-logo-renderMore{width:16px;height:16px}.semi-ai-chat-dialogue-annotation-content-icon{display:flex;justify-content:center;align-items:center}.semi-ai-chat-dialogue-references{display:flex;flex-wrap:wrap;font-size:12px;line-height:16px;color:var(--semi-color-text-2);margin-top:8px;column-gap:4px;row-gap:4px}.semi-ai-chat-dialogue-references .semi-ai-chat-dialogue-reference{display:flex;padding:8px 12px;box-sizing:border-box;width:fit-content;max-width:200px;flex-shrink:1;align-items:center;column-gap:8px;background-color:var(--semi-color-fill-0);border-radius:var(--semi-border-radius-medium);margin-left:auto}.semi-ai-chat-dialogue-references .semi-ai-chat-dialogue-reference-content{display:flex;align-items:center;flex-grow:1;text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.semi-ai-chat-dialogue-references .semi-ai-chat-dialogue-reference-icon{display:flex;justify-content:center;align-items:center;margin-right:4px;color:var(--semi-color-white);width:16px;height:16px;border-radius:2px}.semi-ai-chat-dialogue-references .semi-ai-chat-dialogue-reference-icon-word{background-color:rgba(var(--semi-blue-4),1)}.semi-ai-chat-dialogue-references .semi-ai-chat-dialogue-reference-icon-pdf{background-color:rgba(var(--semi-red-4),1)}.semi-ai-chat-dialogue-references .semi-ai-chat-dialogue-reference-icon-excel{background-color:rgba(var(--semi-green-4),1)}.semi-ai-chat-dialogue-references .semi-ai-chat-dialogue-reference-icon-video{background-color:rgba(var(--semi-purple-4),1)}.semi-ai-chat-dialogue-references .semi-ai-chat-dialogue-reference-icon-code{background-color:rgba(var(--semi-teal-4),1)}.semi-ai-chat-dialogue-references .semi-ai-chat-dialogue-reference-img{margin-right:4px}.semi-ai-chat-dialogue-references .semi-ai-chat-dialogue-reference-name{display:inline-block;text-overflow:ellipsis;overflow:hidden;word-break:break-all;max-width:130px}.semi-ai-chat-dialogue-code{border-radius:var(--semi-border-radius-large);overflow:hidden;border:1px solid var(--semi-color-border);line-height:32px}.semi-ai-chat-dialogue-code .semi-codeHighlight pre{word-break:break-all;white-space:pre-wrap}.semi-ai-chat-dialogue-code-topSlot{display:flex;justify-content:space-between;background-color:var(--semi-color-fill-0);align-items:center;padding:8px 16px;color:var(--semi-color-text-0);font-size:14px}.semi-ai-chat-dialogue-code-topSlot-copy{display:flex;justify-content:flex-end;align-items:center;width:24px}.semi-ai-chat-dialogue-code-topSlot-copy-wrapper{display:flex;align-items:center;justify-content:center;cursor:pointer;background:#0000;border:none}.semi-ai-chat-dialogue-code .semi-codeHighlight-defaultTheme pre[class*=language-]{margin:0;background:var(--semi-color-bg-0)}.semi-ai-chat-dialogue-hints{display:flex;flex-direction:column;row-gap:8px;margin-top:4px;margin-bottom:12px;margin-left:52px}.semi-ai-chat-dialogue-hints-selecting{margin-left:68px}.semi-ai-chat-dialogue-hint-item{cursor:pointer;display:flex;flex-direction:row;width:fit-content;background:var(--semi-color-bg-0);align-items:center;border:1px solid var(--semi-color-border);padding:8px 16px;border-radius:var(--semi-border-radius-medium)}.semi-ai-chat-dialogue-hint-item:hover{background-color:var(--semi-color-fill-0)}.semi-ai-chat-dialogue-hint-content{font-size:14px;color:var(--semi-color-text-0)}@keyframes semi-ai-chat-dialogue-loading-bounce{0%{transform:translateY(0) scale(1)}18%{transform:translateY(-4px) scale(.96)}36%{transform:translateY(0) scale(1.06)}44%{transform:translateY(-.5px) scale(.98)}52%{transform:translateY(0) scale(1)}to{transform:translateY(0) scale(1)}}.semi-rtl .semi-ai-chat-dialogue-wrapper,.semi-portal-rtl .semi-ai-chat-dialogue-wrapper{direction:rtl}.semi-rtl .semi-ai-chat-dialogue-wrapper-action-icon-redo,.semi-portal-rtl .semi-ai-chat-dialogue-wrapper-action-icon-redo{transform:scaleX(-1)}.semi-aiChatInput{display:flex;flex-direction:column;padding:20px;border-radius:12px;border:1px solid var(--semi-color-border);box-sizing:border-box}.semi-aiChatInput-skill{padding:4px 0;border-radius:8px;overflow:scroll}.semi-aiChatInput-skill-item{display:flex;align-items:center;column-gap:8px;padding:8px 20px;cursor:pointer}.semi-aiChatInput-skill-item-active{background-color:var(--semi-color-fill-0)}.semi-aiChatInput-popover-suggestion{box-shadow:none}.semi-aiChatInput-suggestion{overflow:scroll}.semi-aiChatInput-suggestion-item{border-radius:6px;padding:8px 20px;color:var(--semi-color-text-0);font-size:14px;line-height:20px;font-family:Inter,-apple-system,BlinkMacSystemFont,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Segoe UI,Helvetica Neue,Helvetica,Arial,sans-serif}.semi-aiChatInput-suggestion-item-active{background-color:var(--semi-color-fill-0)}.semi-aiChatInput-reference-icon{width:16px;height:16px;border-radius:2px;margin-right:4px}.semi-aiChatInput-ref-icon{display:inline-flex;align-items:center;justify-content:center;color:var(--semi-color-white);flex-shrink:0}.semi-aiChatInput-ref-icon-word{background-color:rgba(var(--semi-blue-4),1)}.semi-aiChatInput-ref-icon-pdf{background-color:rgba(var(--semi-red-4),1)}.semi-aiChatInput-ref-icon-code{background-color:rgba(var(--semi-teal-5),1)}.semi-aiChatInput-ref-icon-excel{background-color:rgba(var(--semi-green-5),1)}.semi-aiChatInput-ref-icon-video,.semi-aiChatInput-ref-icon-audio{background-color:rgba(var(--semi-purple-4),1)}.semi-aiChatInput-ref-icon-unknown{background-color:rgba(var(--semi-grey-5),1)}.semi-aiChatInput-references{display:flex;flex-wrap:wrap;margin-bottom:8px;font-size:12px;line-height:16px;font-family:Inter,-apple-system,BlinkMacSystemFont,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Segoe UI,Helvetica Neue,Helvetica,Arial,sans-serif;color:var(--semi-color-text-2);column-gap:4px;row-gap:4px}.semi-aiChatInput-references>.semi-aiChatInput-reference:only-child{width:100%}.semi-aiChatInput-references>.semi-aiChatInput-reference:nth-last-child(2):first-child,.semi-aiChatInput-references>.semi-aiChatInput-reference:nth-child(2):nth-last-child(1){flex-basis:calc(50% - 4px);max-width:calc(50% - 4px)}.semi-aiChatInput-references>.semi-aiChatInput-reference:nth-last-child(n+3):nth-child(1),.semi-aiChatInput-references>.semi-aiChatInput-reference:nth-last-child(n+3):nth-child(1)~.semi-aiChatInput-reference{width:calc(33.333% - 4px)}.semi-aiChatInput-reference{padding:8px 12px;box-sizing:border-box;border-radius:6px;background:var(--semi-color-fill-0);flex-shrink:1;display:flex;align-items:center;column-gap:8px}.semi-aiChatInput-reference-content{display:flex;align-items:center;flex-grow:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.semi-aiChatInput-reference-img{width:16px;height:16px;margin-right:4px}.semi-aiChatInput-reference-name{display:inline-block;text-overflow:ellipsis;overflow:hidden;word-break:break-all}.semi-aiChatInput-reference-delete{cursor:pointer;padding:2px;border-radius:50%}.semi-aiChatInput-reference-delete:hover{background:var(--semi-color-fill-1)}.semi-aiChatInput-footer{display:flex;justify-content:space-between;margin-top:20px;align-items:center;user-select:none;-webkit-user-select:none}.semi-aiChatInput-footer-round .semi-aiChatInput-footer-configure-select,.semi-aiChatInput-footer-round .semi-aiChatInput-footer-configure-button,.semi-aiChatInput-footer-round .semi-aiChatInput-footer-configure-radio-button,.semi-aiChatInput-footer-round .semi-aiChatInput-footer-configure-mcp-trigger,.semi-aiChatInput-footer-round .semi-aiChatInput-footer-action-button,.semi-aiChatInput-footer-round .semi-aiChatInput-footer-action-upload,.semi-aiChatInput-footer-round .semi-radio-addon-buttonRadio{border-radius:9999px}.semi-aiChatInput-footer-action{display:flex;align-items:center;column-gap:8px}.semi-aiChatInput-footer-action button{padding:0;border:0px;display:flex;align-items:center;justify-content:center}.semi-aiChatInput-footer-action-button{width:32px;height:32px;cursor:pointer;border-radius:8px}.semi-aiChatInput-footer-action-send{background-color:var(--semi-color-primary);color:rgba(var(--semi-white),1)}.semi-aiChatInput-footer-action-send:hover:not(.semi-aiChatInput-footer-action-send-disabled){background-color:var(--semi-color-primary-hover)}.semi-aiChatInput-footer-action-send:active:not(.semi-aiChatInput-footer-action-send-disabled){background-color:var(--semi-color-primary-active)}.semi-aiChatInput-footer-action-send-disabled{background-color:var(--semi-color-fill-2)}.semi-aiChatInput-footer-action-stop{background-color:var(--semi-color-primary);color:rgba(var(--semi-white),1)}.semi-aiChatInput-footer-action-stop:hover:not(.semi-aiChatInput-footer-action-send-disabled){background-color:var(--semi-color-primary-hover)}.semi-aiChatInput-footer-action-stop:active:not(.semi-aiChatInput-footer-action-send-disabled){background-color:var(--semi-color-primary-active)}.semi-aiChatInput-footer-action-stop-disabled{background-color:var(--semi-color-fill-2)}.semi-aiChatInput-footer-action-upload{background:#0000;color:var(--semi-color-text-1)}.semi-aiChatInput-footer-action-upload:hover{background-color:var(--semi-color-fill-0)}.semi-aiChatInput-footer-action-upload:active{background-color:var(--semi-color-fill-1)}.semi-aiChatInput-footer-configure{display:flex;flex-direction:row;column-gap:8px}.semi-aiChatInput-footer-configure-button{border:1px solid var(--semi-color-primary)}.semi-aiChatInput-footer-configure-button-active.semi-button-tertiary.semi-button-outline{border:1px solid var(--semi-color-primary);color:var(--semi-color-primary);background-color:var(--semi-color-primary-light-default)}.semi-aiChatInput-footer-configure-select{border:1px solid var(--semi-color-border);background:#0000}.semi-aiChatInput-footer-configure-select.semi-select-focus,.semi-aiChatInput-footer-configure-select .semi-select-selection-text{font-weight:600;color:var(--semi-color-text-1)}.semi-aiChatInput-footer-configure-select.semi-select:hover{border-color:var(--semi-color-border)}.semi-aiChatInput-footer-configure-select.semi-select:focus{border:1px solid var(--semi-color-border);background:#0000}.semi-aiChatInput-footer-configure-radio-button .semi-radio-addon-buttonRadio{height:16px;padding:4px;font-size:14px}.semi-aiChatInput-footer-configure-radio-button .semi-radio-addon-buttonRadio-checked{color:var(--semi-color-text-1);background:var(--semi-color-bg-2)}.semi-aiChatInput-footer-configure-mcp-header{padding:8px 16px 0;font-size:12px;line-height:16px;font-family:Inter,-apple-system,BlinkMacSystemFont,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Segoe UI,Helvetica Neue,Helvetica,Arial,sans-serif;height:16px;align-items:center;display:flex;justify-content:space-between;column-gap:4px}.semi-aiChatInput-footer-configure-mcp-header-title{color:var(--semi-color-text-2)}.semi-aiChatInput-footer-configure-mcp-header-config.semi-button{padding:0;border:0px;height:fit-content;font-size:12px;line-height:16px;font-family:Inter,-apple-system,BlinkMacSystemFont,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Segoe UI,Helvetica Neue,Helvetica,Arial,sans-serif}.semi-aiChatInput-attachment{position:relative;display:flex;align-items:center;column-gap:8px;border-radius:6px;background:var(--semi-color-fill-0);padding:8px;width:224px;height:36px;overflow:hidden;letter-spacing:0;flex-shrink:0}.semi-aiChatInput-attachment-icon,.semi-aiChatInput-attachment-img{display:flex;flex-shrink:0;align-items:center;justify-content:center;border-radius:3px;width:36px;height:36px}.semi-aiChatInput-attachment-img{object-fit:cover}.semi-aiChatInput-attachment-content{display:flex;flex-direction:column;flex-shrink:0;align-items:flex-start;width:180px}.semi-aiChatInput-attachment-content-name{flex-shrink:0;width:180px;height:20px;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;color:var(--semi-color-text-0);font-size:12px;line-height:16px;font-family:Inter,-apple-system,BlinkMacSystemFont,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Segoe UI,Helvetica Neue,Helvetica,Arial,sans-serif;font-weight:600}.semi-aiChatInput-attachment-content-size{display:flex;flex-shrink:0;align-items:flex-start;column-gap:4px;color:var(--semi-color-text-2);font-size:12px;line-height:16px;font-family:Inter,-apple-system,BlinkMacSystemFont,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Segoe UI,Helvetica Neue,Helvetica,Arial,sans-serif;text-transform:uppercase}.semi-aiChatInput-attachment-delete{display:none}.semi-aiChatInput-attachment:hover>.semi-aiChatInput-attachment-delete{cursor:pointer;position:absolute;top:0;right:0;background:rgba(var(--semi-grey-7),1);color:var(--semi-color-white);border-radius:50%;width:16px;height:16px;font-size:12px;display:flex;align-items:center;justify-content:center}.semi-aiChatInput-attachment-progress.semi-progress-circle{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%)}.semi-aiChatInput-scroll-wrapper{position:relative;width:100%;display:flex;align-items:center;margin-bottom:8px}.semi-aiChatInput-scroll-container{display:flex;overflow-x:auto;scroll-behavior:smooth;scrollbar-width:none;-ms-overflow-style:none;column-gap:8px}.semi-aiChatInput-scroll-container::-webkit-scrollbar{display:none}.semi-aiChatInput-scroll-button{padding:0;border:0px;position:absolute;top:50%;transform:translateY(-50%);z-index:10;width:16px;height:16px;border-radius:50%;background:var(--semi-color-white);box-shadow:var(--semi-shadow-elevated);cursor:pointer;display:flex;justify-content:center;align-items:center;transition:background-color .2s,box-shadow .2s}.semi-aiChatInput-scroll-button .semi-icon{font-size:12px;color:var(--semi-color-text-2)}.semi-aiChatInput-scroll-button:active{transform:translateY(-50%) scale(.95)}.semi-aiChatInput-scroll-button-left-icon{transform:rotate(180deg)}.semi-aiChatInput-scroll-button.semi-aiChatInput-scroll-button-left{left:10px}.semi-aiChatInput-scroll-button.semi-aiChatInput-scroll-button-right{right:10px}.semi-aiChatInput-editor-content{flex:1 1 0%;min-height:0;margin-top:-4px;padding-top:4px;overflow:auto}.semi-aiChatInput-editor-content .tiptap{font-size:14px;line-height:24px}.semi-aiChatInput-editor-content .tiptap p.is-editor-empty:first-child:before{color:var(--semi-color-text-2);content:attr(data-placeholder);float:left;height:0;pointer-events:none}.semi-aiChatInput-editor-content .tiptap p.has-skill-slot.is-editor-empty:first-child:before{content:none}.semi-aiChatInput-editor-content .tiptap p.has-skill-slot.is-editor-empty:first-child:after{color:var(--semi-color-text-2);content:attr(data-placeholder);display:inline;height:0;margin-left:8px;pointer-events:none}.semi-aiChatInput-editor-content .tiptap p{margin:0;white-space:pre-wrap}.semi-aiChatInput-editor-content .tiptap:focus{outline:none}.semi-aiChatInput-editor-content .tiptap .node-inputSlot{display:inline-block;font-size:14px;line-height:20px}.semi-aiChatInput-editor-content .tiptap .input-slot{display:inline-block;box-sizing:content-box;background-color:var(--semi-color-primary-light-default);border-radius:4px;padding:2px 4px;position:relative;margin:2px;font-weight:600;min-width:2px}.semi-aiChatInput-editor-content .tiptap .input-slot .content{color:var(--semi-color-primary)}.semi-aiChatInput-editor-content .tiptap .input-slot .input-slot-placeholder{-webkit-user-select:none;user-select:none;position:absolute;top:2px;left:4px;pointer-events:none;white-space:pre;z-index:1;color:var(--semi-color-primary-disabled)}.semi-aiChatInput-editor-content .tiptap .node-selectSlot{display:inline-flex}.semi-aiChatInput-editor-content .tiptap .select-slot{font-size:14px;line-height:20px;font-family:Inter,-apple-system,BlinkMacSystemFont,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Segoe UI,Helvetica Neue,Helvetica,Arial,sans-serif;height:24px;padding:2px 4px;border-radius:4px;background-color:var(--semi-color-primary-light-default)}.semi-aiChatInput-editor-content .tiptap .select-slot:first-child{margin-left:0}.semi-aiChatInput-editor-content .tiptap .select-slot-wrapper{display:inline-flex;margin:2px 4px}.semi-aiChatInput-editor-content .tiptap .select-slot .semi-select-selection{color:var(--semi-color-primary);font-weight:700;margin-left:0}.semi-aiChatInput-editor-content .tiptap .select-slot .semi-select-arrow{color:var(--semi-color-text-2);width:16px}.semi-aiChatInput-editor-content .tiptap .select-slot.semi-select-open,.semi-aiChatInput-editor-content .tiptap .select-slot.semi-select-focus{border-color:#0000}.semi-aiChatInput-editor-content .tiptap .select-slot.semi-select:focus{border-color:#0000}.semi-aiChatInput-editor-content .tiptap .node-skillSlot{display:inline-flex}.semi-aiChatInput-editor-content .tiptap .skill-slot{color:var(--semi-color-primary);font-weight:600;outline:none}.semi-aiChatInput-editor-content .tiptap .skill-slot-wrapper{display:inline-flex;position:relative;padding:0 4px;margin:2px;border-radius:4px}.semi-aiChatInput-editor-content .tiptap .skill-slot-wrapper:hover{background-color:var(--semi-color-primary-light-default)}.semi-aiChatInput-editor-content .tiptap .skill-slot-wrapper:hover .skill-slot-delete{cursor:pointer;position:absolute;top:0;right:0;background:rgba(var(--semi-grey-7),1);color:var(--semi-color-white);transform:translate(50%,-50%);border-radius:50%;width:12px;height:12px;font-size:8px;display:flex;align-items:center;justify-content:center}.semi-aiChatInput-editor-content .tiptap .skill-slot-delete{display:none}.semi-anchor{font-size:14px;line-height:20px;font-family:Inter,-apple-system,BlinkMacSystemFont,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Segoe UI,Helvetica Neue,Helvetica,Arial,sans-serif;overflow-y:auto;overflow-x:hidden;position:relative}.semi-anchor-size-small{font-size:12px;line-height:16px;font-family:Inter,-apple-system,BlinkMacSystemFont,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Segoe UI,Helvetica Neue,Helvetica,Arial,sans-serif}.semi-anchor-slide{position:absolute;left:0;top:0;height:100%}.semi-anchor-slide-muted{display:none}.semi-anchor-slide-bar{display:none;position:absolute;top:0;width:2px;border-radius:1px}.semi-anchor-slide-bar-active{display:inline-block}.semi-anchor-slide-bar-default{height:28px}.semi-anchor-slide-bar-small{height:24px}.semi-anchor-slide-bar-primary{background-color:var(--semi-color-primary)}.semi-anchor-slide-bar-tertiary{background-color:var(--semi-color-tertiary)}.semi-anchor-slide:before{position:absolute;display:block;width:2px;height:100%;background-color:var(--semi-color-border);border-radius:1px;content:" "}.semi-anchor-link-title{cursor:pointer;color:var(--semi-color-text-2);padding-top:4px;padding-bottom:4px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;border-radius:3px;transition:color var(--semi-transition_duration-none) var(--semi-transition_function-easeIn) var(--semi-transition_delay-none);transform:scale(var(--semi-transform_scale-none));background:#0000}.semi-anchor-link-title:hover{color:var(--semi-color-tertiary-hover)}.semi-anchor-link-title-active{color:var(--semi-color-text-0);background:#0000}.semi-anchor-link-title-active:hover{color:var(--semi-color-tertiary-hover)}.semi-anchor-link-title:focus-visible{outline:2px solid var(--semi-color-primary-light-active);outline-offset:-2px}.semi-anchor-link-title-disabled{color:var(--semi-color-disabled-text);cursor:not-allowed}.semi-anchor-link-title-disabled:hover{color:var(--semi-color-disabled-text)}.semi-anchor-link-tooltip{cursor:pointer;color:var(--semi-color-text-2)!important}.semi-anchor-link-tooltip-small{font-size:12px;line-height:16px;font-family:Inter,-apple-system,BlinkMacSystemFont,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Segoe UI,Helvetica Neue,Helvetica,Arial,sans-serif}.semi-anchor-link-tooltip:hover{color:var(--semi-color-tertiary-hover)!important}.semi-anchor-link-tooltip-active{color:var(--semi-color-text-0)!important}.semi-anchor-link-tooltip-disabled{color:var(--semi-color-disabled-text)!important;cursor:not-allowed}.semi-anchor-link-tooltip-disabled:hover{color:var(--semi-color-disabled-text)!important}.semi-rtl .semi-anchor,.semi-portal-rtl .semi-anchor{direction:rtl}.semi-rtl .semi-anchor-slide,.semi-portal-rtl .semi-anchor-slide{right:0;left:auto}.semi-rtl .semi-anchor-link,.semi-portal-rtl .semi-anchor-link{padding-left:auto}.semi-audio-player{display:flex;align-items:center;justify-content:center;gap:24px;max-width:1440px;height:78px;background:rgba(var(--semi-grey-9),.8)}.semi-audio-player-control{display:flex;align-items:center;gap:16px}.semi-audio-player-control-button-icon{color:var(--semi-color-bg-0)}.semi-audio-player-control-button-play{background:var(--semi-color-bg-0)!important;color:var(--semi-color-text-0)!important}.semi-audio-player-control-button-play-disabled{background:rgba(var(--semi-grey-0),.35)!important;color:var(--semi-color-grey-7)!important}.semi-audio-player-slider-container{width:323px;height:100%}.semi-audio-player-info-container{display:flex;align-items:center;gap:16px}.semi-audio-player-info{display:flex;flex-direction:column;gap:4px}.semi-audio-player-info-title{font-size:14px;color:var(--semi-color-bg-0);font-weight:600;display:flex;align-items:center}.semi-audio-player-info-time{width:100%;height:22px;font-size:14px;color:var(--semi-color-bg-0);display:flex;align-items:center;justify-content:space-between;gap:4px;-webkit-user-select:none;user-select:none}.semi-audio-player-control-speed{width:40px;height:24px;display:flex;align-items:center;justify-content:center;gap:4px;background:rgba(var(--semi-grey-8),1);border-radius:3px;font-size:12px;line-height:16px;color:var(--semi-color-default);font-weight:600;-webkit-user-select:none;user-select:none}.semi-audio-player-control-speed-menu{background:rgba(var(--semi-grey-8),1);width:65px}.semi-audio-player-control-speed-menu-item{color:var(--semi-color-default)}.semi-audio-player-control-speed-menu-item:hover{background:var(--semi-color-tertiary-active)!important}.semi-audio-player-control-volume{width:43px;height:164px;background:rgba(var(--semi-grey-8),1);border-radius:4px;padding:4px 0;display:flex;align-items:center;justify-content:center;flex-direction:column;gap:8px}.semi-audio-player-control-volume-title{font-size:12px;line-height:16px;color:var(--semi-color-default);font-weight:600;-webkit-user-select:none;user-select:none}.semi-audio-player-error{display:flex;align-items:center;gap:4px;margin-left:4px;color:var(--semi-color-danger)}.semi-audio-player-light{background:var(--semi-color-bg-0);border:1px solid var(--semi-color-border)}.semi-audio-player-light .semi-audio-player-control-button-icon{color:rgba(var(--semi-grey-9),1)}.semi-audio-player-light .semi-audio-player-control-button-play{background:rgba(var(--semi-grey-9),1)!important;color:var(--semi-color-bg-0)!important}.semi-audio-player-light .semi-audio-player-control-button-play-disabled{background:var(--semi-color-disabled-text)!important;color:rgba(var(--semi-white),1)!important}.semi-audio-player-light .semi-audio-player-info-title,.semi-audio-player-light .semi-audio-player-info-time,.semi-audio-player-light .semi-audio-player-control-speed-menu-item,.semi-audio-player-light .semi-audio-player-control-volume-title{color:rgba(var(--semi-grey-9),1)}.semi-audio-player-light .semi-audio-player-control-speed-menu-item:hover{background:rgba(var(--semi-grey-1),1)!important}.semi-audio-player-slider{background:rgba(var(--semi-grey-5),1);border-radius:9999px;position:relative}.semi-audio-player-slider-light{background:rgba(var(--semi-grey-2),1)}.semi-audio-player-slider-wrapper{position:relative;cursor:pointer;display:flex;align-items:center;justify-content:center}.semi-audio-player-slider-wrapper-vertical{width:100%}.semi-audio-player-slider-wrapper-horizontal{height:100%}.semi-audio-player-slider-vertical{width:4px;height:100%}.semi-audio-player-slider-horizontal{width:100%;height:4px}.semi-audio-player-slider-progress{position:absolute;background:rgba(var(--semi-blue-4),1);border-radius:9999px}.semi-audio-player-slider-progress-vertical{bottom:0}.semi-audio-player-slider-progress-horizontal{left:0}.semi-audio-player-slider-dot{position:absolute;width:16px;height:16px;background:rgba(var(--semi-white),1);border:1px solid var(--semi-color-primary);box-shadow:0 0 4px 0 var(--semi-color-shadow);border-radius:50%;transition:opacity .2s}.semi-autocomplete-option{font-size:14px;line-height:20px;font-family:Inter,-apple-system,BlinkMacSystemFont,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Segoe UI,Helvetica Neue,Helvetica,Arial,sans-serif;word-break:break-all;padding:8px 12px;color:var(--semi-color-text-0);border-radius:0;position:relative;display:flex;flex-wrap:nowrap;align-items:center;cursor:pointer;box-sizing:border-box;transition:background-color var(--semi-transition_duration-none) var(--semi-transition_function-easeIn) var(--semi-transition_delay-none)}.semi-autocomplete-option-icon{width:12px;color:#0000;visibility:hidden;margin-right:8px;display:flex;justify-content:center;align-content:center}.semi-autocomplete-option-text{display:flex;flex-wrap:wrap;white-space:pre}.semi-autocomplete-option-keyword{color:var(--semi-color-primary);background-color:inherit;font-weight:600}.semi-autocomplete-option:active{background-color:var(--semi-color-fill-1)}.semi-autocomplete-option-empty{cursor:not-allowed;color:var(--semi-color-disabled-text);justify-content:center}.semi-autocomplete-option-empty:hover,.semi-autocomplete-option-empty:active{background-color:inherit}.semi-autocomplete-option-disabled{color:var(--semi-color-disabled-text);cursor:not-allowed}.semi-autocomplete-option-disabled:hover{background-color:var(--semi-color-fill-0)}.semi-autocomplete-option-selected{font-weight:600}.semi-autocomplete-option-selected .semi-autocomplete-option-icon{visibility:visible;color:var(--semi-color-text-2)}.semi-autocomplete-option-focused{background-color:var(--semi-color-fill-0)}.semi-autocomplete-option:first-of-type{margin-top:4px}.semi-autocomplete-option:last-of-type{margin-bottom:4px}.semi-autocomplete{cursor:text;display:inline-flex;vertical-align:middle;box-sizing:border-box}.semi-autocomplete-option-list{overflow-x:hidden;overflow-y:auto}.semi-autocomplete-option-list-chosen .semi-autocomplete-option-icon{display:flex}.semi-autocomplete-loading-wrapper{padding-top:8px;padding-bottom:8px;cursor:not-allowed;height:20px}.semi-autocomplete-loading-wrapper .semi-spin{width:100%}.semi-rtl .semi-autocomplete,.semi-portal-rtl .semi-autocomplete{direction:rtl}.semi-avatar{position:relative;display:inline-flex;overflow:hidden;align-items:center;justify-content:center;white-space:nowrap;text-align:center;vertical-align:middle}.semi-avatar:focus-visible{outline:2px solid var(--semi-color-primary-light-active)}.semi-avatar-focus{outline:2px solid var(--semi-color-primary-light-active)}.semi-avatar-no-focus-visible:focus-visible{outline:none}.semi-avatar .semi-avatar-label{display:flex;align-items:center;font-size:14px;line-height:20px;font-family:Inter,-apple-system,BlinkMacSystemFont,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Segoe UI,Helvetica Neue,Helvetica,Arial,sans-serif;font-weight:600}.semi-avatar-content{-webkit-user-select:none;user-select:none}.semi-avatar-extra-extra-small{width:20px;height:20px;border-radius:3px}.semi-avatar-extra-extra-small .semi-avatar-content{transform-origin:center;transform:scale(.8)}.semi-avatar-extra-extra-small .semi-avatar-label{font-size:10px;line-height:15px}.semi-avatar-extra-small{width:24px;height:24px;border-radius:3px}.semi-avatar-extra-small .semi-avatar-content{transform-origin:center;transform:scale(.8)}.semi-avatar-extra-small .semi-avatar-label{font-size:10px;line-height:15px}.semi-avatar-small{width:32px;height:32px;border-radius:3px}.semi-avatar-small .semi-avatar-label{font-size:12px;line-height:16px;font-family:Inter,-apple-system,BlinkMacSystemFont,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Segoe UI,Helvetica Neue,Helvetica,Arial,sans-serif}.semi-avatar-default{width:40px;height:40px;border-radius:3px}.semi-avatar-default .semi-avatar-label{font-size:18px;line-height:24px;font-family:Inter,-apple-system,BlinkMacSystemFont,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Segoe UI,Helvetica Neue,Helvetica,Arial,sans-serif}.semi-avatar-medium{width:48px;height:48px;border-radius:3px}.semi-avatar-medium .semi-avatar-label{font-size:20px;line-height:28px;font-family:Inter,-apple-system,BlinkMacSystemFont,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Segoe UI,Helvetica Neue,Helvetica,Arial,sans-serif}.semi-avatar-large{width:72px;height:72px;border-radius:6px}.semi-avatar-large .semi-avatar-label{font-size:32px;line-height:44px;font-family:Inter,-apple-system,BlinkMacSystemFont,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Segoe UI,Helvetica Neue,Helvetica,Arial,sans-serif}.semi-avatar-extra-large{width:128px;height:128px;border-radius:12px}.semi-avatar-extra-large .semi-avatar-label{font-size:64px;line-height:77px}.semi-avatar-circle{border-radius:var(--semi-border-radius-circle)}.semi-avatar-image{background-color:#0000}.semi-avatar>img{display:block;width:100%;height:100%;object-fit:cover}.semi-avatar-hover{position:absolute;left:0;top:0;width:100%;height:100%}.semi-avatar:hover{cursor:pointer}.semi-avatar-wrapper{position:relative;display:inline-flex;flex-direction:column;align-items:center;width:fit-content}.semi-avatar-wrapper .semi-avatar-top_slot-bg{position:absolute;display:flex;justify-content:center;border-radius:50%;overflow:hidden}.semi-avatar-wrapper .semi-avatar-top_slot-bg-small{width:32px;height:32px}.semi-avatar-wrapper .semi-avatar-top_slot-bg-default{width:40px;height:40px}.semi-avatar-wrapper .semi-avatar-top_slot-bg-medium{width:48px;height:48px}.semi-avatar-wrapper .semi-avatar-top_slot-bg-large{width:72px;height:72px}.semi-avatar-wrapper .semi-avatar-top_slot-bg-extra-large{width:128px;height:128px}.semi-avatar-wrapper .semi-avatar-top_slot-bg-svg{position:absolute}.semi-avatar-wrapper .semi-avatar-top_slot-bg-svg-small{top:-28px;scale:.4}.semi-avatar-wrapper .semi-avatar-top_slot-bg-svg-default{top:-32px;scale:.7}.semi-avatar-wrapper .semi-avatar-top_slot-bg-svg-medium{top:-30px;scale:.8}.semi-avatar-wrapper .semi-avatar-top_slot-bg-svg-large{top:-30px;scale:1.1}.semi-avatar-wrapper .semi-avatar-top_slot-bg-svg-extra-large{top:-32px;scale:1.4}.semi-avatar-wrapper .semi-avatar-top_slot-wrapper{position:absolute;display:flex;justify-content:center}.semi-avatar-wrapper .semi-avatar-top_slot-wrapper .semi-avatar-top_slot{color:var(--semi-color-bg-0);font-weight:600}.semi-avatar-wrapper .semi-avatar-top_slot-wrapper .semi-avatar-top_slot-content{-webkit-user-select:none;user-select:none;position:relative;line-height:normal}.semi-avatar-wrapper .semi-avatar-top_slot-wrapper .semi-avatar-top_slot-content-small{font-size:5px;margin-top:0}.semi-avatar-wrapper .semi-avatar-top_slot-wrapper .semi-avatar-top_slot-content-default{font-size:6px;margin-top:-2px}.semi-avatar-wrapper .semi-avatar-top_slot-wrapper .semi-avatar-top_slot-content-medium{font-size:8px;margin-top:0}.semi-avatar-wrapper .semi-avatar-top_slot-wrapper .semi-avatar-top_slot-content-large{font-size:14px;margin-top:0}.semi-avatar-wrapper .semi-avatar-top_slot-wrapper .semi-avatar-top_slot-content-extra-large{font-size:16px;margin-top:0}.semi-avatar-wrapper .semi-avatar-bottom_slot{color:var(--semi-color-bg-0);position:absolute;cursor:pointer;bottom:3.5px;transform:translateY(50%);-webkit-user-select:none;user-select:none}.semi-avatar-wrapper .semi-avatar-bottom_slot-shape_circle{display:flex;justify-content:center;align-items:center;background:var(--semi-color-primary);border-radius:var(--semi-border-radius-circle);line-height:normal}.semi-avatar-wrapper .semi-avatar-bottom_slot-shape_circle-extra-small,.semi-avatar-wrapper .semi-avatar-bottom_slot-shape_circle-small{width:12px;height:12px;font-size:5px}.semi-avatar-wrapper .semi-avatar-bottom_slot-shape_circle-default{width:16px;height:16px;font-size:12px}.semi-avatar-wrapper .semi-avatar-bottom_slot-shape_circle-medium{width:18px;height:18px;font-size:12px}.semi-avatar-wrapper .semi-avatar-bottom_slot-shape_circle-large{width:28px;height:28px;font-size:12px}.semi-avatar-wrapper .semi-avatar-bottom_slot-shape_circle-extra-large{width:28px;height:28px;font-size:14px}.semi-avatar-wrapper .semi-avatar-bottom_slot-shape_square{display:flex;justify-content:center;align-items:center;background:var(--semi-color-primary);border-radius:4px;padding:1px 4px;font-weight:600;border-style:solid;border-color:var(--semi-color-bg-0)}.semi-avatar-wrapper .semi-avatar-bottom_slot-shape_square-extra_small,.semi-avatar-wrapper .semi-avatar-bottom_slot-shape_square-small{font-size:5px;border-width:2px}.semi-avatar-wrapper .semi-avatar-bottom_slot-shape_square-default,.semi-avatar-wrapper .semi-avatar-bottom_slot-shape_square-medium,.semi-avatar-wrapper .semi-avatar-bottom_slot-shape_square-large{font-size:12px;border-width:2px}.semi-avatar-wrapper .semi-avatar-bottom_slot-shape_square-extra-large{font-size:14px;border-width:2px}.semi-avatar-group{display:inline-block}.semi-avatar-group .semi-avatar{box-sizing:border-box}.semi-avatar-group .semi-avatar:first-child{margin-left:0}.semi-avatar-group .semi-avatar-extra-large{border:3px var(--semi-color-bg-1) solid;margin-left:-32px}.semi-avatar-group .semi-avatar-large{border:3px var(--semi-color-bg-1) solid;margin-left:-18px}.semi-avatar-group .semi-avatar-medium,.semi-avatar-group .semi-avatar-default,.semi-avatar-group .semi-avatar-small{border:2px var(--semi-color-bg-1) solid;margin-left:-12px}.semi-avatar-group .semi-avatar-extra-small{border:1px var(--semi-color-bg-1) solid;margin-left:-10px}.semi-avatar-group .semi-avatar-extra-extra-small{border:1px var(--semi-color-bg-1) solid;margin-left:-4px}.semi-avatar-group .semi-avatar-item-start-0{z-index:100}.semi-avatar-group .semi-avatar-item-end-0{z-index:80}.semi-avatar-group .semi-avatar-item-start-1{z-index:99}.semi-avatar-group .semi-avatar-item-end-1{z-index:81}.semi-avatar-group .semi-avatar-item-start-2{z-index:98}.semi-avatar-group .semi-avatar-item-end-2{z-index:82}.semi-avatar-group .semi-avatar-item-start-3{z-index:97}.semi-avatar-group .semi-avatar-item-end-3{z-index:83}.semi-avatar-group .semi-avatar-item-start-4{z-index:96}.semi-avatar-group .semi-avatar-item-end-4{z-index:84}.semi-avatar-group .semi-avatar-item-start-5{z-index:95}.semi-avatar-group .semi-avatar-item-end-5{z-index:85}.semi-avatar-group .semi-avatar-item-start-6{z-index:94}.semi-avatar-group .semi-avatar-item-end-6{z-index:86}.semi-avatar-group .semi-avatar-item-start-7{z-index:93}.semi-avatar-group .semi-avatar-item-end-7{z-index:87}.semi-avatar-group .semi-avatar-item-start-8{z-index:92}.semi-avatar-group .semi-avatar-item-end-8{z-index:88}.semi-avatar-group .semi-avatar-item-start-9{z-index:91}.semi-avatar-group .semi-avatar-item-end-9{z-index:89}.semi-avatar-group .semi-avatar-item-start-10,.semi-avatar-group .semi-avatar-item-end-10{z-index:90}.semi-avatar-group .semi-avatar-item-start-11{z-index:89}.semi-avatar-group .semi-avatar-item-end-11{z-index:91}.semi-avatar-group .semi-avatar-item-start-12{z-index:88}.semi-avatar-group .semi-avatar-item-end-12{z-index:92}.semi-avatar-group .semi-avatar-item-start-13{z-index:87}.semi-avatar-group .semi-avatar-item-end-13{z-index:93}.semi-avatar-group .semi-avatar-item-start-14{z-index:86}.semi-avatar-group .semi-avatar-item-end-14{z-index:94}.semi-avatar-group .semi-avatar-item-start-15{z-index:85}.semi-avatar-group .semi-avatar-item-end-15{z-index:95}.semi-avatar-group .semi-avatar-item-start-16{z-index:84}.semi-avatar-group .semi-avatar-item-end-16{z-index:96}.semi-avatar-group .semi-avatar-item-start-17{z-index:83}.semi-avatar-group .semi-avatar-item-end-17{z-index:97}.semi-avatar-group .semi-avatar-item-start-18{z-index:82}.semi-avatar-group .semi-avatar-item-end-18{z-index:98}.semi-avatar-group .semi-avatar-item-start-19{z-index:81}.semi-avatar-group .semi-avatar-item-end-19{z-index:99}.semi-avatar-group .semi-avatar-item-start-20{z-index:80}.semi-avatar-group .semi-avatar-item-end-20{z-index:100}.semi-avatar-group .semi-avatar-item-more{background-color:rgba(var(--semi-grey-5),1)}.semi-avatar-amber{background-color:rgba(var(--semi-amber-3),1);color:rgba(var(--semi-white),1)}.semi-avatar-blue{background-color:rgba(var(--semi-blue-3),1);color:rgba(var(--semi-white),1)}.semi-avatar-cyan{background-color:rgba(var(--semi-cyan-3),1);color:rgba(var(--semi-white),1)}.semi-avatar-green{background-color:rgba(var(--semi-green-3),1);color:rgba(var(--semi-white),1)}.semi-avatar-grey{background-color:rgba(var(--semi-grey-3),1);color:rgba(var(--semi-white),1)}.semi-avatar-indigo{background-color:rgba(var(--semi-indigo-3),1);color:rgba(var(--semi-white),1)}.semi-avatar-light-blue{background-color:rgba(var(--semi-light-blue-3),1);color:rgba(var(--semi-white),1)}.semi-avatar-light-green{background-color:rgba(var(--semi-light-green-3),1);color:rgba(var(--semi-white),1)}.semi-avatar-lime{background-color:rgba(var(--semi-lime-3),1);color:rgba(var(--semi-white),1)}.semi-avatar-orange{background-color:rgba(var(--semi-orange-3),1);color:rgba(var(--semi-white),1)}.semi-avatar-pink{background-color:rgba(var(--semi-pink-3),1);color:rgba(var(--semi-white),1)}.semi-avatar-purple{background-color:rgba(var(--semi-purple-3),1);color:rgba(var(--semi-white),1)}.semi-avatar-red{background-color:rgba(var(--semi-red-3),1);color:rgba(var(--semi-white),1)}.semi-avatar-teal{background-color:rgba(var(--semi-teal-3),1);color:rgba(var(--semi-white),1)}.semi-avatar-violet{background-color:rgba(var(--semi-violet-3),1);color:rgba(var(--semi-white),1)}.semi-avatar-yellow{background-color:rgba(var(--semi-yellow-3),1);color:rgba(var(--semi-white),1)}.semi-avatar-additionalBorder{border-style:solid;border-color:var(--semi-color-primary);display:inline-block;box-sizing:border-box;position:absolute;border-width:1.5px;top:-3.5px;left:-3.5px}.semi-avatar-additionalBorder-extra-extra-small{width:27px;height:27px}.semi-avatar-additionalBorder-extra-small{width:31px;height:31px}.semi-avatar-additionalBorder-small{width:39px;height:39px}.semi-avatar-additionalBorder-default{width:47px;height:47px}.semi-avatar-additionalBorder-medium{width:55px;height:55px}.semi-avatar-additionalBorder-large{width:79px;height:79px}.semi-avatar-additionalBorder-extra-large{width:135px;height:135px}.semi-avatar-square.semi-avatar-additionalBorder-extra_extra_small,.semi-avatar-square.semi-avatar-additionalBorder-extra_small,.semi-avatar-square.semi-avatar-additionalBorder-small,.semi-avatar-square.semi-avatar-additionalBorder-default,.semi-avatar-square.semi-avatar-additionalBorder-medium{border-radius:3px}.semi-avatar-square.semi-avatar-additionalBorder-large{border-radius:6px}.semi-avatar-additionalBorder-circle{border-radius:var(--semi-border-radius-circle)}.semi-avatar-additionalBorder-animated{animation:.8s linear infinite semi-avatar-additionalBorder}.semi-avatar-animated{animation:1s linear infinite semi-avatar-content}@keyframes semi-avatar-additionalBorder{0%{opacity:1;transform:scale(1)}to{border-width:0;opacity:0;transform:scale(1.15)}}@keyframes semi-avatar-content{0%{transform:scale(1)}50%{transform:scale(.9)}to{transform:scale(1)}}.semi-rtl .semi-avatar,.semi-portal-rtl .semi-avatar{direction:rtl}.semi-rtl .semi-avatar-extra-extra-small .semi-avatar-content,.semi-portal-rtl .semi-avatar-extra-extra-small .semi-avatar-content,.semi-rtl .semi-avatar-extra-small .semi-avatar-content,.semi-portal-rtl .semi-avatar-extra-small .semi-avatar-content{transform:scale(.8)}.semi-rtl .semi-avatar-hover,.semi-portal-rtl .semi-avatar-hover{left:auto;right:0}.semi-rtl .semi-avatar-group,.semi-portal-rtl .semi-avatar-group{direction:rtl}.semi-rtl .semi-avatar-group .semi-avatar:first-child,.semi-portal-rtl .semi-avatar-group .semi-avatar:first-child{margin-left:auto;margin-right:0}.semi-rtl .semi-avatar-group .semi-avatar-extra-large,.semi-portal-rtl .semi-avatar-group .semi-avatar-extra-large{margin-left:auto;margin-right:-32px}.semi-rtl .semi-avatar-group .semi-avatar-large,.semi-portal-rtl .semi-avatar-group .semi-avatar-large{margin-left:auto;margin-right:-18px}.semi-rtl .semi-avatar-group .semi-avatar-medium,.semi-rtl .semi-avatar-group .semi-avatar-small,.semi-portal-rtl .semi-avatar-group .semi-avatar-medium,.semi-portal-rtl .semi-avatar-group .semi-avatar-small{margin-left:auto;margin-right:-12px}.semi-rtl .semi-avatar-group .semi-avatar-extra-small,.semi-portal-rtl .semi-avatar-group .semi-avatar-extra-small{margin-left:auto;margin-right:-10px}.semi-rtl .semi-avatar-group .semi-avatar-extra-extra-small,.semi-portal-rtl .semi-avatar-group .semi-avatar-extra-extra-small{margin-left:auto;margin-right:-4px}.semi-backtop{position:fixed;box-sizing:border-box;right:100px;bottom:50px;z-index:10;cursor:pointer;text-align:center;overflow:hidden}.semi-rtl .semi-backtop,.semi-portal-rtl .semi-backtop{direction:rtl;right:auto;left:100px}.semi-badge{position:relative;display:inline-block}.semi-badge-dot{box-sizing:border-box;width:8px;height:8px;border-radius:var(--semi-border-radius-circle);background-color:var(--semi-color-bg-1);border:1px var(--semi-color-bg-1) solid;z-index:1}.semi-badge-count{box-sizing:border-box;height:18px;min-width:18px;border-radius:9px;padding:0 4px;background-color:var(--semi-color-bg-1);border:1px var(--semi-color-bg-1) solid;z-index:1;text-align:center;font-size:12px;line-height:16px;font-family:Inter,-apple-system,BlinkMacSystemFont,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Segoe UI,Helvetica Neue,Helvetica,Arial,sans-serif;font-weight:400;color:var(--semi-color-bg-2)}.semi-badge-rightTop{position:absolute;top:0;right:0;transform:translate(50%,-50%);transform-origin:100% 0%}.semi-badge-rightBottom{position:absolute;right:0;bottom:0;transform:translate(50%,50%);transform-origin:100% 0%}.semi-badge-leftTop{position:absolute;top:0;left:0;transform:translate(-50%,-50%);transform-origin:100% 0%}.semi-badge-leftBottom{position:absolute;bottom:0;left:0;transform:translate(-50%,50%);transform-origin:100% 0%}.semi-badge-custom{display:flex}.semi-badge-block{position:static;display:inline-block}.semi-badge-primary.semi-badge-solid{background-color:var(--semi-color-primary)}.semi-badge-primary.semi-badge-light{background-color:var(--semi-color-primary-light-default);color:var(--semi-color-primary)}.semi-badge-primary.semi-badge-inverted{color:var(--semi-color-primary)}.semi-badge-secondary.semi-badge-solid{background-color:var(--semi-color-secondary)}.semi-badge-secondary.semi-badge-light{background-color:var(--semi-color-secondary-light-default);color:var(--semi-color-secondary)}.semi-badge-secondary.semi-badge-inverted{color:var(--semi-color-secondary)}.semi-badge-tertiary.semi-badge-solid{background-color:var(--semi-color-tertiary)}.semi-badge-tertiary.semi-badge-light{background-color:var(--semi-color-tertiary-light-default);color:var(--semi-color-tertiary)}.semi-badge-tertiary.semi-badge-inverted{color:var(--semi-color-tertiary)}.semi-badge-danger.semi-badge-solid{background-color:var(--semi-color-danger)}.semi-badge-danger.semi-badge-light{background-color:var(--semi-color-danger-light-default);color:var(--semi-color-danger)}.semi-badge-danger.semi-badge-inverted{color:var(--semi-color-danger)}.semi-badge-warning.semi-badge-solid{background-color:var(--semi-color-warning)}.semi-badge-warning.semi-badge-light{background-color:var(--semi-color-warning-light-default);color:var(--semi-color-warning)}.semi-badge-warning.semi-badge-inverted{color:var(--semi-color-warning)}.semi-badge-success.semi-badge-solid{background-color:var(--semi-color-success)}.semi-badge-success.semi-badge-light{background-color:var(--semi-color-success-light-default);color:var(--semi-color-success)}.semi-badge-success.semi-badge-inverted{color:var(--semi-color-success)}.semi-rtl .semi-badge,.semi-portal-rtl .semi-badge{direction:rtl}.semi-banner{padding:12px}.semi-banner-content-wrapper{display:flex;flex-direction:row}.semi-banner-description{margin:0}.semi-banner .semi-banner-content-wrapper .semi-banner-content{display:flex;flex:1}.semi-banner-in-container{border-radius:var(--semi-border-radius-small)}.semi-banner-in-container .semi-banner-content-wrapper .semi-banner-content-body{flex:1}.semi-banner-in-container .semi-banner-content-wrapper .semi-banner-content-body .semi-banner-title+.semi-banner-description{margin-top:2px}.semi-banner-full .semi-banner-content-wrapper .semi-banner-content{justify-content:center}.semi-banner-full .semi-banner-content-wrapper .semi-banner-icon,.semi-banner-full .semi-banner-content-wrapper .semi-banner-content-body{display:flex;align-items:center}.semi-banner-close{margin-left:12px;height:24px;width:24px}.semi-banner-extra{margin-top:8px}.semi-banner-icon{display:flex;margin-right:12px}.semi-banner-info{background-color:var(--semi-color-info-light-default);color:var(--semi-color-info)}.semi-banner-info.semi-banner-bordered{border:1px solid var(--semi-color-info)}.semi-banner-warning{background-color:var(--semi-color-warning-light-default);color:var(--semi-color-warning)}.semi-banner-warning.semi-banner-bordered{border:1px solid var(--semi-color-warning)}.semi-banner-success{background-color:var(--semi-color-success-light-default);color:var(--semi-color-success)}.semi-banner-success.semi-banner-bordered{border:1px solid var(--semi-color-success)}.semi-banner-danger{background-color:var(--semi-color-danger-light-default);color:var(--semi-color-danger)}.semi-banner-danger.semi-banner-bordered{border:1px solid var(--semi-color-danger)}.semi-rtl .semi-banner,.semi-portal-rtl .semi-banner{direction:rtl}.semi-rtl .semi-banner-close,.semi-portal-rtl .semi-banner-close{margin-left:0;margin-right:12px;height:24px;width:24px}.semi-rtl .semi-banner-icon,.semi-portal-rtl .semi-banner-icon{margin-right:0;margin-left:12px}.semi-light-scrollbar::-webkit-scrollbar-thumb,.semi-light-scrollbar *::-webkit-scrollbar-thumb{border-radius:6px;background:#0000;transition:all 1s}.semi-breadcrumb{overflow:hidden}.semi-breadcrumb-wrapper{display:flex;flex-wrap:wrap}.semi-breadcrumb-wrapper-loose{line-height:20px;font-family:Inter,-apple-system,BlinkMacSystemFont,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Segoe UI,Helvetica Neue,Helvetica,Arial,sans-serif;font-size:14px}.semi-breadcrumb-wrapper-compact{line-height:16px;font-family:Inter,-apple-system,BlinkMacSystemFont,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Segoe UI,Helvetica Neue,Helvetica,Arial,sans-serif;font-size:12px}.semi-breadcrumb-item-wrap{display:inline-flex;align-items:center;margin:4px 4px 4px 0}.semi-breadcrumb-item{display:inline-flex;align-items:center;column-gap:4px;margin-right:4px;color:var(--semi-color-text-2);font-weight:400}.semi-breadcrumb-item .semi-typography{color:inherit}.semi-breadcrumb-item-title-inline{display:inline-flex}.semi-breadcrumb-item-active{color:var(--semi-color-text-0);font-weight:600}.semi-breadcrumb-item-active:hover,.semi-breadcrumb-item-active:active{border:none;margin-bottom:0;color:var(--semi-color-text-0);cursor:default}.semi-breadcrumb-item-active .semi-typography{font-weight:600}.semi-breadcrumb-item-icon{margin-bottom:-1px}.semi-breadcrumb-item-more svg{vertical-align:middle}.semi-breadcrumb-item-link{text-decoration:inherit;transition:color var(--semi-transition_duration-none) var(--semi-transition_function-easeIn) var(--semi-transition_delay-none);transform:scale(var(--semi-transform_scale-none))}.semi-breadcrumb-item-link:hover{color:var(--semi-color-link);cursor:pointer}.semi-breadcrumb-item-link:active{color:var(--semi-color-link-hover);cursor:pointer}.semi-breadcrumb-collapse{display:inline-flex;flex-shrink:0}.semi-breadcrumb-separator{display:flex;color:var(--semi-color-text-2)}.semi-breadcrumb-restItem{color:var(--semi-color-text-2);margin-right:8px}.semi-rtl .semi-breadcrumb-wrapper,.semi-portal-rtl .semi-breadcrumb-wrapper{direction:rtl}.semi-rtl .semi-breadcrumb-item-wrap,.semi-portal-rtl .semi-breadcrumb-item-wrap,.semi-rtl .semi-breadcrumb-item,.semi-portal-rtl .semi-breadcrumb-item{margin-right:0;margin-left:4px}.semi-rtl .semi-breadcrumb-restItem,.semi-portal-rtl .semi-breadcrumb-restItem{margin-right:0;margin-left:8px}.semi-rtl .semi-breadcrumb-item-icon+.semi-breadcrumb-item-title,.semi-portal-rtl .semi-breadcrumb-item-icon+.semi-breadcrumb-item-title{margin-left:0;margin-right:4px;display:inline-block}.semi-button-split{display:inline-block}.semi-button-split .semi-button{border-radius:0;margin-right:1px}.semi-button-split .semi-button-first{border-top-left-radius:var(--semi-border-radius-small);border-bottom-left-radius:var(--semi-border-radius-small)}.semi-button-split .semi-button-last{border-top-right-radius:var(--semi-border-radius-small);border-bottom-right-radius:var(--semi-border-radius-small);margin-right:unset}.semi-button-split:hover .semi-button-borderless:active{background-color:var(--semi-color-fill-1)}.semi-button{--semi-button-colorful-multiple-fill-0: rgba(var(--semi-ai-general-5-3));--semi-button-colorful-multiple-fill-1: rgba(var(--semi-ai-general-5-2));--semi-button-colorful-multiple-fill-2: rgba(var(--semi-ai-general-5-1));--semi-button-colorful-multiple-fill-3: rgba(var(--semi-ai-general-5-0));--semi-button-colorful-disabled-fill: var(--semi-color-disabled-text);--semi-button-colorful-fill-primary: var(--semi-color-ai-purple);--semi-button-colorful-fill-secondary: var(--semi-color-text-0)}.semi-button{box-shadow:none;height:32px;display:inline-flex;align-items:center;justify-content:center;cursor:pointer;-webkit-user-select:none;user-select:none;border:0 rgba(0,0,0,0) solid;border-radius:var(--semi-border-radius-small);padding:6px 12px;font-size:14px;line-height:20px;font-weight:600;outline:none;vertical-align:middle;white-space:nowrap}.semi-button.semi-button-primary:focus-visible,.semi-button.semi-button-secondary:focus-visible,.semi-button.semi-button-tertiary:focus-visible,.semi-button.semi-button-warning:focus-visible,.semi-button.semi-button-danger:focus-visible{outline:2px solid var(--semi-color-primary-light-active)}.semi-button-content{display:flex;align-items:center}.semi-button-danger{background-color:var(--semi-color-danger);color:rgba(var(--semi-white),1);transition:background-color var(--semi-transition_duration-none) var(--semi-transition_function-easeIn) var(--semi-transition_delay-none),border var(--semi-transition_duration-none) var(--semi-transition_function-easeIn) var(--semi-transition_delay-none);transform:scale(var(--semi-transform_scale-none))}.semi-button-danger-disabled{background-color:var(--semi-color-disabled-bg)}.semi-button-danger-disabled.semi-button-outline{background-color:#0000;border:1px solid var(--semi-color-border)}.semi-button-danger-disabled.semi-button-light{background-color:var(--semi-color-fill-0)}.semi-button-danger:hover{background-color:var(--semi-color-danger-hover)}.semi-button-danger:active{background-color:var(--semi-color-danger-active)}.semi-button-danger.semi-button-outline{background-color:#0000;border:1px solid var(--semi-color-danger)}.semi-button-danger.semi-button-light,.semi-button-danger.semi-button-outline,.semi-button-danger.semi-button-borderless{color:var(--semi-color-danger)}.semi-button-danger:not(.semi-button-borderless):not(.semi-button-light):focus-visible{outline:2px solid var(--semi-color-danger-light-active)}.semi-button-warning{background-color:var(--semi-color-warning);color:rgba(var(--semi-white),1);transition:background-color var(--semi-transition_duration-none) var(--semi-transition_function-easeIn) var(--semi-transition_delay-none),border var(--semi-transition_duration-none) var(--semi-transition_function-easeIn) var(--semi-transition_delay-none);transform:scale(var(--semi-transform_scale-none))}.semi-button-warning-disabled{background-color:var(--semi-color-disabled-bg)}.semi-button-warning-disabled.semi-button-outline{background-color:#0000;border:1px solid var(--semi-color-border)}.semi-button-warning-disabled.semi-button-light{background-color:var(--semi-color-fill-0)}.semi-button-warning:hover{background-color:var(--semi-color-warning-hover)}.semi-button-warning:active{background-color:var(--semi-color-warning-active)}.semi-button-warning.semi-button-outline{background-color:#0000;border:1px solid var(--semi-color-warning)}.semi-button-warning.semi-button-light,.semi-button-warning.semi-button-outline,.semi-button-warning.semi-button-borderless{color:var(--semi-color-warning)}.semi-button-warning:not(.semi-button-borderless):not(.semi-button-light):focus-visible{outline:2px solid var(--semi-color-warning-light-active)}.semi-button-tertiary{background-color:var(--semi-color-tertiary);color:rgba(var(--semi-white),1);transition:background-color var(--semi-transition_duration-none) var(--semi-transition_function-easeIn) var(--semi-transition_delay-none),border var(--semi-transition_duration-none) var(--semi-transition_function-easeIn) var(--semi-transition_delay-none);transform:scale(var(--semi-transform_scale-none))}.semi-button-tertiary.semi-button-colorful.semi-button-solid{background:var(--semi-ai-general-0)}.semi-button-tertiary.semi-button-colorful.semi-button-solid:hover{background:var(--semi-ai-general-1)}.semi-button-tertiary.semi-button-colorful.semi-button-solid:active{background:var(--semi-ai-general-2)}.semi-button-tertiary.semi-button-colorful.semi-button-solid .semi-button-content-right,.semi-button-tertiary.semi-button-colorful.semi-button-solid .semi-button-content:not(:has(>.semi-button-content-right)){background:var(--semi-color-ai-general);-webkit-background-clip:text;background-clip:text;color:#0000}.semi-button-tertiary-disabled{background-color:var(--semi-color-disabled-bg)}.semi-button-tertiary-disabled.semi-button-outline{background-color:#0000;border:1px solid var(--semi-color-border)}.semi-button-tertiary-disabled.semi-button-light{background-color:var(--semi-color-fill-0)}.semi-button-tertiary:hover{background-color:var(--semi-color-tertiary-hover)}.semi-button-tertiary:active{background-color:var(--semi-color-tertiary-active)}.semi-button-tertiary.semi-button-outline{background-color:#0000;border:1px solid var(--semi-color-border)}.semi-button-tertiary.semi-button-light,.semi-button-tertiary.semi-button-outline,.semi-button-tertiary.semi-button-borderless{color:var(--semi-color-text-1)}.semi-button-primary{background-color:var(--semi-color-primary);color:rgba(var(--semi-white),1);transition:background-color var(--semi-transition_duration-none) var(--semi-transition_function-easeIn) var(--semi-transition_delay-none),border var(--semi-transition_duration-none) var(--semi-transition_function-easeIn) var(--semi-transition_delay-none);transform:scale(var(--semi-transform_scale-none))}.semi-button-primary.semi-button-colorful.semi-button-solid{background:var(--semi-color-ai-general)}.semi-button-primary.semi-button-colorful.semi-button-solid:not(.semi-button-borderless):not(.semi-button-light):not(.semi-button-outline):hover{background:var(--semi-color-ai-general-hover)}.semi-button-primary.semi-button-colorful.semi-button-solid:not(.semi-button-borderless):not(.semi-button-light):not(.semi-button-outline):active{background:var(--semi-color-ai-general-active)}.semi-button-primary.semi-button-colorful.semi-button-light .semi-button-content-right,.semi-button-primary.semi-button-colorful.semi-button-light .semi-button-content:not(:has(>.semi-button-content-right)){background:var(--semi-color-ai-general);-webkit-background-clip:text;background-clip:text;color:#0000}.semi-button-primary.semi-button-colorful.semi-button-outline{color:var(--semi-color-ai-purple);border-color:var(--semi-color-ai-purple)}.semi-button-primary.semi-button-colorful.semi-button-borderless .semi-button-content-right,.semi-button-primary.semi-button-colorful.semi-button-borderless .semi-button-content:not(:has(>.semi-button-content-right)){background:var(--semi-color-ai-general);-webkit-background-clip:text;background-clip:text;color:#0000}.semi-button-primary-disabled{background-color:var(--semi-color-disabled-bg)}.semi-button-primary-disabled.semi-button-light{background:var(--semi-color-fill-0)}.semi-button-primary-disabled.semi-button-outline{background-color:#0000;border:1px solid var(--semi-color-border)}.semi-button-primary:not(.semi-button-borderless):not(.semi-button-light):not(.semi-button-outline):hover{background-color:var(--semi-color-primary-hover)}.semi-button-primary.semi-button-outline{background-color:#0000;border:1px solid var(--semi-color-border)}.semi-button-primary:not(.semi-button-borderless):not(.semi-button-light):not(.semi-button-outline):active{background-color:var(--semi-color-primary-active)}.semi-button-primary.semi-button-light,.semi-button-primary.semi-button-outline,.semi-button-primary.semi-button-borderless{color:var(--semi-color-primary)}.semi-button-secondary{background-color:var(--semi-color-secondary);outline-color:var(--semi-color-secondary);color:rgba(var(--semi-white),1);transition:background-color var(--semi-transition_duration-none) var(--semi-transition_function-easeIn) var(--semi-transition_delay-none),border var(--semi-transition_duration-none) var(--semi-transition_function-easeIn) var(--semi-transition_delay-none);transform:scale(var(--semi-transform_scale-none))}.semi-button-secondary-disabled{background-color:var(--semi-color-disabled-bg)}.semi-button-secondary-disabled.semi-button-outline{background-color:#0000;border:1px solid var(--semi-color-border)}.semi-button-secondary-disabled.semi-button-light{background-color:var(--semi-color-fill-0)}.semi-button-secondary.semi-button-outline{background-color:#0000;border:1px solid var(--semi-color-border)}.semi-button-secondary:hover{background-color:var(--semi-color-secondary-hover)}.semi-button-secondary:active{background-color:var(--semi-color-secondary-active)}.semi-button-secondary.semi-button-light,.semi-button-secondary.semi-button-outline,.semi-button-secondary.semi-button-borderless{color:var(--semi-color-secondary)}.semi-button-disabled{color:var(--semi-color-disabled-text);cursor:not-allowed}.semi-button-disabled:not(.semi-button-borderless):not(.semi-button-light):not(.semi-button-outline):hover{color:var(--semi-color-disabled-text)}.semi-button-disabled.semi-button-light,.semi-button-disabled.semi-button-borderless,.semi-button-disabled.semi-button-outline{color:var(--semi-color-disabled-text)}.semi-button-borderless{background-color:#0000;border:0 rgba(0,0,0,0) solid;transition:background-color var(--semi-transition_duration-none) var(--semi-transition_function-easeIn) var(--semi-transition_delay-none);transform:scale(var(--semi-transform_scale-none))}.semi-button-borderless:not(.semi-button-disabled):hover{background-color:var(--semi-color-fill-0);border:0 rgba(0,0,0,0) solid}.semi-button-borderless:not(.semi-button-disabled):active{background-color:var(--semi-color-fill-1);border:0 rgba(0,0,0,0) solid}.semi-button-outline{background-color:#0000}.semi-button-outline:not(.semi-button-disabled):hover{background-color:var(--semi-color-fill-0)}.semi-button-outline:not(.semi-button-disabled):active{background-color:var(--semi-color-fill-1)}.semi-button-light{background-color:var(--semi-color-fill-0);border:0 rgba(0,0,0,0) solid;transition:background-color var(--semi-transition_duration-none) var(--semi-transition_function-easeIn) var(--semi-transition_delay-none),border var(--semi-transition_duration-none) var(--semi-transition_function-easeIn) var(--semi-transition_delay-none);transform:scale(var(--semi-transform_scale-none))}.semi-button-light:not(.semi-button-disabled):hover{background-color:var(--semi-color-fill-1);border:0 rgba(0,0,0,0) solid}.semi-button-light:not(.semi-button-disabled):active{background-color:var(--semi-color-fill-2);border:0 rgba(0,0,0,0) solid}.semi-button-size-small{height:24px;padding:2px 12px;font-size:14px;line-height:20px;font-weight:600}.semi-button-size-large{height:40px;padding:10px 16px;font-size:14px;line-height:20px;font-weight:600}.semi-button-block{width:100%}.semi-button-group{display:flex;flex-wrap:wrap}.semi-button-group>.semi-button{margin:0;padding-left:0;padding-right:0;border-radius:0}.semi-button-group>.semi-button .semi-button-content{padding-left:12px;padding-right:12px}.semi-button-group>.semi-button-size-large .semi-button-content{padding-left:16px;padding-right:16px}.semi-button-group>.semi-button-size-small .semi-button-content{padding-left:12px;padding-right:12px}.semi-button-group>.semi-button.semi-button-with-icon-only{padding-left:0;padding-right:0}.semi-button-group>.semi-button.semi-button-with-icon-only .semi-button-content{padding-left:8px;padding-right:8px}.semi-button-group>.semi-button.semi-button-with-icon-only.semi-button-size-small .semi-button-content{padding-left:4px;padding-right:4px}.semi-button-group>.semi-button.semi-button-with-icon-only.semi-button-size-large .semi-button-content{padding-left:12px;padding-right:12px}.semi-button-group>.semi-button:first-child{border-top-left-radius:var(--semi-border-radius-small);border-bottom-left-radius:var(--semi-border-radius-small)}.semi-button-group>.semi-button:last-child{border-top-right-radius:var(--semi-border-radius-small);border-bottom-right-radius:var(--semi-border-radius-small)}.semi-button-group>.semi-button-outline:not(:last-child){border-right-color:#0000;margin-right:-1px}.semi-button-group-line{display:inline-flex;align-items:center;background-color:var(--semi-color-border)}.semi-button-group-line-primary{background-color:var(--semi-color-primary)}.semi-button-group-line-secondary{background-color:var(--semi-color-secondary)}.semi-button-group-line-tertiary{background-color:var(--semi-color-tertiary)}.semi-button-group-line-warning{background-color:var(--semi-color-warning)}.semi-button-group-line-danger{background-color:var(--semi-color-danger)}.semi-button-group-line-disabled{background-color:var(--semi-color-disabled-bg)}.semi-button-group-line-light{background-color:var(--semi-color-fill-0)}.semi-button-group-line-borderless{background-color:#0000}.semi-button-group-line:before{display:block;content:"";width:1px;height:20px;background-color:var(--semi-color-border)}.semi-calendar-day ul,.semi-calendar-day li,.semi-calendar-week ul,.semi-calendar-week li,.semi-calendar-month ul,.semi-calendar-month li{padding:0;margin:0;list-style:none}.semi-calendar-day-sticky-top,.semi-calendar-week-sticky-top,.semi-calendar-month-sticky-top{position:sticky;position:-webkit-sticky;top:0;left:0;right:0;background-color:var(--semi-color-bg-2);z-index:20}.semi-calendar-day .semi-calendar-weekend,.semi-calendar-week .semi-calendar-weekend,.semi-calendar-month .semi-calendar-weekend{background-color:var(--semi-color-fill-0)}.semi-calendar-day .semi-calendar-event-items,.semi-calendar-week .semi-calendar-event-items,.semi-calendar-month .semi-calendar-event-items{pointer-events:none}.semi-calendar-day .semi-calendar-event-items>*,.semi-calendar-week .semi-calendar-event-items>*,.semi-calendar-month .semi-calendar-event-items>*{pointer-events:auto}.semi-calendar-day .semi-calendar-event-items .semi-calendar-event-day,.semi-calendar-week .semi-calendar-event-items .semi-calendar-event-day,.semi-calendar-month .semi-calendar-event-items .semi-calendar-event-day{position:absolute;left:0;right:0;z-index:5;overflow:hidden}.semi-calendar-day .semi-calendar-custom-container,.semi-calendar-week .semi-calendar-custom-container,.semi-calendar-month .semi-calendar-custom-container{position:absolute;top:0;right:0;bottom:0;left:0}.semi-calendar-day,.semi-calendar-week{overflow:auto}.semi-calendar-day-sticky-left,.semi-calendar-week-sticky-left{position:sticky;position:-webkit-sticky;left:0;background-color:var(--semi-color-bg-2);z-index:10}.semi-calendar-day .semi-calendar-tag,.semi-calendar-week .semi-calendar-tag{font-size:14px;line-height:20px;font-family:Inter,-apple-system,BlinkMacSystemFont,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Segoe UI,Helvetica Neue,Helvetica,Arial,sans-serif;min-width:70px;color:var(--semi-color-text-2)}.semi-calendar-day-scroll,.semi-calendar-week-scroll{display:flex;flex:1 1 auto;position:relative}.semi-calendar-day .semi-calendar-grid,.semi-calendar-week .semi-calendar-grid{display:flex;align-items:flex-start;flex:1 1 auto;position:relative}.semi-calendar-day .semi-calendar-grid-skeleton,.semi-calendar-week .semi-calendar-grid-skeleton{position:relative;box-sizing:border-box}.semi-calendar-day .semi-calendar-grid-skeleton li,.semi-calendar-week .semi-calendar-grid-skeleton li{height:30px}.semi-calendar-day .semi-calendar-grid-skeleton li:last-child,.semi-calendar-day .semi-calendar-grid-skeleton li:nth-last-child(2),.semi-calendar-week .semi-calendar-grid-skeleton li:last-child,.semi-calendar-week .semi-calendar-grid-skeleton li:nth-last-child(2){height:0}.semi-calendar-day .semi-calendar-grid-skeleton-row-line:after,.semi-calendar-week .semi-calendar-grid-skeleton-row-line:after{content:"";border-bottom:1px solid var(--semi-color-border);position:absolute;left:0;right:0;z-index:3;pointer-events:none}.semi-calendar-day .semi-calendar-grid-skeleton-row-line:first-child:after,.semi-calendar-week .semi-calendar-grid-skeleton-row-line:first-child:after{border:0}.semi-calendar-day .semi-calendar-grid-content,.semi-calendar-week .semi-calendar-grid-content{flex:1 0 auto;min-width:130px;height:100%}.semi-calendar-day .semi-calendar-grid-curr-circle,.semi-calendar-week .semi-calendar-grid-curr-circle{background:var(--semi-color-danger);border-radius:var(--semi-border-radius-circle);content:"";position:absolute;height:8px;width:8px;margin-top:-4px;z-index:8}.semi-calendar-day .semi-calendar-grid-curr-line,.semi-calendar-week .semi-calendar-grid-curr-line{position:absolute;left:0;right:0;z-index:8;border-top:1px solid var(--semi-color-danger);pointer-events:none}.semi-calendar-day .semi-calendar-all-day,.semi-calendar-week .semi-calendar-all-day{display:flex;flex:1 1 auto;border-bottom:1px solid var(--semi-color-border)}.semi-calendar-day .semi-calendar-all-day .semi-calendar-tag,.semi-calendar-week .semi-calendar-all-day .semi-calendar-tag{text-align:right;padding-right:8px}.semi-calendar-day .semi-calendar-all-day .semi-calendar-tag span,.semi-calendar-week .semi-calendar-all-day .semi-calendar-tag span{line-height:26px}.semi-calendar-day .semi-calendar-all-day-content,.semi-calendar-week .semi-calendar-all-day-content{display:flex;flex:1 0 auto;height:100%;min-height:26px;min-width:130px}.semi-calendar-day .semi-calendar-all-day .semi-calendar-event-items,.semi-calendar-week .semi-calendar-all-day .semi-calendar-event-items{width:100%}.semi-calendar-day .semi-calendar-time,.semi-calendar-week .semi-calendar-time{height:auto;display:flex;flex:none;align-items:flex-start;padding-right:8px}.semi-calendar-day .semi-calendar-time-item,.semi-calendar-week .semi-calendar-time-item{position:relative;height:60px;text-align:right}.semi-calendar-day .semi-calendar-time-item span,.semi-calendar-week .semi-calendar-time-item span{font-size:14px;line-height:20px;font-family:Inter,-apple-system,BlinkMacSystemFont,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Segoe UI,Helvetica Neue,Helvetica,Arial,sans-serif;display:block;position:relative;top:-10px;color:var(--semi-color-text-2)}.semi-calendar-day .semi-calendar-time .semi-calendar-time-items,.semi-calendar-week .semi-calendar-time .semi-calendar-time-items{position:relative;min-width:70px;background-color:var(--semi-color-bg-2);box-sizing:border-box;margin-left:auto}.semi-calendar-week .semi-calendar-today .semi-calendar-today-date,.semi-calendar-month .semi-calendar-today .semi-calendar-today-date{width:24px;height:24px;line-height:24px;text-align:center;border-radius:var(--semi-border-radius-circle);background-color:var(--semi-color-primary);color:var(--semi-color-bg-1)}.semi-calendar-day-scroll-wrapper{height:calc(100% - 28px)}.semi-calendar-week{position:relative;display:grid}.semi-calendar-week-scroll-wrapper{height:calc(100% - 55px)}.semi-calendar-week .semi-calendar-grid-skeleton-row-line:after{left:0}.semi-calendar-week .semi-calendar-grid-skeleton li{border-right:1px solid var(--semi-color-border)}.semi-calendar-week .semi-calendar-grid:last-child .semi-calendar-grid-content li{border-right:0}.semi-calendar-week-header,.semi-calendar-week-grid-row{display:flex;align-items:flex-start;font-size:14px;line-height:20px;font-family:Inter,-apple-system,BlinkMacSystemFont,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Segoe UI,Helvetica Neue,Helvetica,Arial,sans-serif;color:var(--semi-color-text-2)}.semi-calendar-week-header{flex:1 1 auto;border-bottom:1px solid var(--semi-color-border)}.semi-calendar-week-grid,.semi-calendar-week-grid-row{display:flex;flex:1 0 auto}.semi-calendar-week-grid-row li{display:flex;flex:1 1 0;border-right:1px solid rgba(0,0,0,0);height:auto;box-sizing:border-box;justify-content:center;align-items:center}.semi-calendar-week-grid-row li>span{display:flex;align-items:center;justify-content:center;line-height:26px}.semi-calendar-week-grid-row li>span:last-child{padding:0 4px}.semi-calendar-week .semi-calendar-all-day{font-size:26px}.semi-calendar-week .semi-calendar-all-day-content{padding-left:0;position:relative}.semi-calendar-week .semi-calendar-all-day-content .semi-calendar-all-day-skeleton{display:flex;flex:1 1 auto}.semi-calendar-week .semi-calendar-all-day-content .semi-calendar-all-day-skeleton li{flex:1 1 auto;min-width:130px;box-sizing:border-box;border-right:1px solid var(--semi-color-border)}.semi-calendar-week .semi-calendar-all-day-content .semi-calendar-all-day-skeleton li:last-child{border-right:1px solid rgba(0,0,0,0)}.semi-calendar-week .semi-calendar-all-day .semi-calendar-event-items,.semi-calendar-week .semi-calendar-all-day .semi-calendar-event-items .semi-calendar-event-allday{position:absolute}.semi-calendar-week .semi-calendar-all-day .semi-calendar-event-items .semi-calendar-event-allday>*{font-size:14px;line-height:20px;font-family:Inter,-apple-system,BlinkMacSystemFont,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Segoe UI,Helvetica Neue,Helvetica,Arial,sans-serif}.semi-calendar-week .semi-calendar-week-tag{text-align:right;line-height:26px}.semi-calendar-week .semi-calendar-week-tag:first-child{padding-right:8px}.semi-calendar-month{display:flex;flex-direction:column;height:100%;overflow:hidden;font-size:14px;line-height:20px;font-family:Inter,-apple-system,BlinkMacSystemFont,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Segoe UI,Helvetica Neue,Helvetica,Arial,sans-serif}.semi-calendar-month-grid-wrapper{height:calc(100% - 27px)}.semi-calendar-month-week,.semi-calendar-month-skeleton{height:100%}.semi-calendar-month-header{display:flex;flex:1 1 auto;align-items:flex-start;color:var(--semi-color-text-2)}.semi-calendar-month-grid{flex:1 1 auto;box-sizing:border-box}.semi-calendar-month-grid li{line-height:26px}.semi-calendar-month-grid-row,.semi-calendar-month-skeleton{display:flex;box-sizing:border-box}.semi-calendar-month-grid-row li,.semi-calendar-month-skeleton li{flex:1;white-space:nowrap;text-align:right;padding-right:8px;box-sizing:border-box;border-bottom:1px solid var(--semi-color-border);color:var(--semi-color-text-2)}.semi-calendar-month-grid-row li span,.semi-calendar-month-skeleton li span{display:inline-block;text-align:right}.semi-calendar-month-skeleton{position:absolute;overflow:hidden;left:0;right:0}.semi-calendar-month-skeleton li{position:relative;overflow:hidden;border-right:1px solid var(--semi-color-border);height:100%;padding-top:4px}.semi-calendar-month-skeleton li span{font-size:14px;line-height:20px;font-family:Inter,-apple-system,BlinkMacSystemFont,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Segoe UI,Helvetica Neue,Helvetica,Arial,sans-serif}.semi-calendar-month-skeleton li:last-child{border-right:none}.semi-calendar-month-skeleton .semi-calendar-month-same{color:var(--semi-color-text-0)}.semi-calendar-month-skeleton .semi-calendar-month-event-card-wrapper{font-size:14px;line-height:20px;font-family:Inter,-apple-system,BlinkMacSystemFont,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Segoe UI,Helvetica Neue,Helvetica,Arial,sans-serif;display:block;position:absolute;right:8px;padding-top:2px;-webkit-user-select:none;user-select:none}.semi-calendar-month-skeleton .semi-calendar-month-event-card-wrapper:hover{cursor:pointer}.semi-calendar-month .semi-calendar-event-items{position:absolute;top:31px;right:0;bottom:20px;left:0;overflow:hidden}.semi-calendar-month-grid-col{display:flex;flex-direction:column;flex:1;height:100%}.semi-calendar-month-weekrow{flex:1 1 auto;position:relative}.semi-calendar-month-weekrow .semi-calendar-event-items .semi-calendar-event-month{position:absolute;font-size:24px;height:1em;overflow:hidden}.semi-calendar-month-weekrow .semi-calendar-event-items .semi-calendar-event-month>*{font-size:14px;line-height:20px;font-family:Inter,-apple-system,BlinkMacSystemFont,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Segoe UI,Helvetica Neue,Helvetica,Arial,sans-serif}.semi-calendar-month-date{position:absolute;right:4px;z-index:3}.semi-calendar-month-event-card{width:220px}.semi-calendar-month-event-card ul,.semi-calendar-month-event-card li{padding:0;margin:0;list-style:none}.semi-calendar-month-event-card-close{margin-right:-4px}.semi-calendar-month-event-card-content{padding:12px 0}.semi-calendar-month-event-card-header{display:flex;flex-direction:row;margin:12px 20px}.semi-calendar-month-event-card-header-info{display:flex;flex:1;flex-direction:column;align-items:center}.semi-calendar-month-event-card-header-info-weekday{color:var(--semi-color-text-2)}.semi-calendar-month-event-card-header-info-date{font-size:20px;line-height:28px;font-family:Inter,-apple-system,BlinkMacSystemFont,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Segoe UI,Helvetica Neue,Helvetica,Arial,sans-serif;margin-top:4px}.semi-calendar-month-event-card-body{padding:0 16px}.semi-calendar-month-event-card-body li{height:24px}.semi-rtl .semi-calendar-day,.semi-rtl .semi-calendar-week,.semi-rtl .semi-calendar-month,.semi-portal-rtl .semi-calendar-day,.semi-portal-rtl .semi-calendar-week,.semi-portal-rtl .semi-calendar-month{direction:rtl}.semi-rtl .semi-calendar-day-sticky-left,.semi-rtl .semi-calendar-week-sticky-left,.semi-portal-rtl .semi-calendar-day-sticky-left,.semi-portal-rtl .semi-calendar-week-sticky-left{left:auto;right:0}.semi-rtl .semi-calendar-day .semi-calendar-all-day .semi-calendar-tag,.semi-rtl .semi-calendar-week .semi-calendar-all-day .semi-calendar-tag,.semi-portal-rtl .semi-calendar-day .semi-calendar-all-day .semi-calendar-tag,.semi-portal-rtl .semi-calendar-week .semi-calendar-all-day .semi-calendar-tag{text-align:left;padding-right:0;padding-left:8px}.semi-rtl .semi-calendar-day .semi-calendar-time,.semi-rtl .semi-calendar-week .semi-calendar-time,.semi-portal-rtl .semi-calendar-day .semi-calendar-time,.semi-portal-rtl .semi-calendar-week .semi-calendar-time{padding-right:0;padding-left:8px}.semi-rtl .semi-calendar-day .semi-calendar-time-item,.semi-rtl .semi-calendar-week .semi-calendar-time-item,.semi-portal-rtl .semi-calendar-day .semi-calendar-time-item,.semi-portal-rtl .semi-calendar-week .semi-calendar-time-item{text-align:left}.semi-rtl .semi-calendar-day .semi-calendar-time .semi-calendar-time-items,.semi-rtl .semi-calendar-week .semi-calendar-time .semi-calendar-time-items,.semi-portal-rtl .semi-calendar-day .semi-calendar-time .semi-calendar-time-items,.semi-portal-rtl .semi-calendar-week .semi-calendar-time .semi-calendar-time-items{margin-left:0;margin-right:auto}.semi-rtl .semi-calendar-week .semi-calendar-grid-skeleton-row-line:after,.semi-portal-rtl .semi-calendar-week .semi-calendar-grid-skeleton-row-line:after{left:0;right:0}.semi-rtl .semi-calendar-week .semi-calendar-grid-skeleton li,.semi-portal-rtl .semi-calendar-week .semi-calendar-grid-skeleton li{border-right:0;border-left:1px solid var(--semi-color-border)}.semi-rtl .semi-calendar-week .semi-calendar-grid:last-child .semi-calendar-grid-content li,.semi-portal-rtl .semi-calendar-week .semi-calendar-grid:last-child .semi-calendar-grid-content li{border-left:0}.semi-rtl .semi-calendar-week .semi-calendar-all-day-content,.semi-portal-rtl .semi-calendar-week .semi-calendar-all-day-content{padding-left:auto;padding-right:0}.semi-rtl .semi-calendar-week .semi-calendar-all-day-content .semi-calendar-all-day-skeleton li,.semi-portal-rtl .semi-calendar-week .semi-calendar-all-day-content .semi-calendar-all-day-skeleton li{border-right:0;border-left:1px solid var(--semi-color-border)}.semi-rtl .semi-calendar-week .semi-calendar-all-day-content .semi-calendar-all-day-skeleton li:last-child,.semi-portal-rtl .semi-calendar-week .semi-calendar-all-day-content .semi-calendar-all-day-skeleton li:last-child{border-left:1px solid rgba(0,0,0,0)}.semi-rtl .semi-calendar-week .semi-rtl .semi-calendar-week-tag,.semi-rtl .semi-calendar-week .semi-portal-rtl .semi-calendar-week-tag,.semi-portal-rtl .semi-calendar-week .semi-rtl .semi-calendar-week-tag,.semi-portal-rtl .semi-calendar-week .semi-portal-rtl .semi-calendar-week-tag{text-align:left}.semi-rtl .semi-calendar-week .semi-rtl .semi-calendar-week-tag:first-child,.semi-rtl .semi-calendar-week .semi-portal-rtl .semi-calendar-week-tag:first-child,.semi-portal-rtl .semi-calendar-week .semi-rtl .semi-calendar-week-tag:first-child,.semi-portal-rtl .semi-calendar-week .semi-portal-rtl .semi-calendar-week-tag:first-child{padding-right:auto;padding-left:8px}.semi-rtl .semi-calendar-month-grid-row li,.semi-rtl .semi-calendar-month-skeleton li,.semi-portal-rtl .semi-calendar-month-grid-row li,.semi-portal-rtl .semi-calendar-month-skeleton li{text-align:left;padding-right:auto;padding-left:8px}.semi-rtl .semi-calendar-month-grid-row li span,.semi-rtl .semi-calendar-month-skeleton li span,.semi-portal-rtl .semi-calendar-month-grid-row li span,.semi-portal-rtl .semi-calendar-month-skeleton li span{text-align:left}.semi-rtl .semi-calendar-month-skeleton li,.semi-portal-rtl .semi-calendar-month-skeleton li{border-right:0;border-left:1px solid var(--semi-color-border)}.semi-rtl .semi-calendar-month-skeleton li:last-child,.semi-portal-rtl .semi-calendar-month-skeleton li:last-child{border-left:none}.semi-rtl .semi-calendar-month-skeleton .semi-calendar-month-event-card-wrapper,.semi-portal-rtl .semi-calendar-month-skeleton .semi-calendar-month-event-card-wrapper{right:auto;left:8px}.semi-rtl .semi-calendar-month-date,.semi-portal-rtl .semi-calendar-month-date{right:auto;left:4px}.semi-rtl .semi-calendar-month-event-card-close,.semi-portal-rtl .semi-calendar-month-event-card-close{margin-right:0;margin-left:-4px}.semi-card{box-sizing:border-box;margin:0;padding:0;border-radius:var(--semi-border-radius-medium);overflow:hidden;background-color:var(--semi-color-bg-0);font-size:14px;font-style:normal;font-weight:400;line-height:20px;letter-spacing:0em}.semi-card-shadows{cursor:pointer;transition:box-shadow .3s}.semi-card-shadows-hover:hover{box-shadow:var(--semi-shadow-elevated);z-index:1}.semi-card-shadows-always{box-shadow:var(--semi-shadow-elevated)}.semi-card-bordered{border:1px solid var(--semi-color-border)}.semi-card-header{padding:20px}.semi-card-header-bordered{border-bottom:1px solid var(--semi-color-border)}.semi-card-header-wrapper{display:flex;align-items:flex-start;flex-direction:row-reverse;justify-content:space-between}.semi-card-header-wrapper-spacing{margin-right:20px}.semi-card-header-wrapper-title{width:100%;overflow:hidden}.semi-card-header-wrapper-extra{flex-shrink:0;font-size:16px;font-style:normal;font-weight:700;letter-spacing:0em;color:var(--semi-color-text-0)}.semi-card-cover>*{display:block;width:100%}.semi-card-body{padding:20px;font-size:14px;font-style:normal;font-weight:400;line-height:20px;letter-spacing:0em;color:var(--semi-color-text-1)}.semi-card-body-actions{margin-top:20px;padding-top:20px;border-top:1px solid var(--semi-color-border)}.semi-card-footer{padding:20px}.semi-card-footer-bordered{border-top:1px solid var(--semi-color-border)}.semi-card-meta{display:flex;align-items:center;justify-content:flex-start}.semi-card-meta-avatar{margin-right:12px}.semi-card-meta-wrapper-title{font-size:16px;font-style:normal;font-weight:700;line-height:22px;letter-spacing:0em;color:var(--semi-color-text-0)}.semi-card-meta-wrapper-description{font-size:14px;font-style:normal;font-weight:400;line-height:20px;letter-spacing:0em;color:var(--semi-color-text-2)}.semi-card-group-grid .semi-card{border-radius:0}.semi-card-group-grid .semi-card{margin-left:-1px;margin-top:-1px}.semi-rtl .semi-card,.semi-portal-rtl .semi-card{direction:rtl}.semi-rtl .semi-card-header-wrapper,.semi-portal-rtl .semi-card-header-wrapper{align-items:flex-end}.semi-rtl .semi-card-header-wrapper-title,.semi-portal-rtl .semi-card-header-wrapper-title{display:flex;align-items:flex-end}.semi-rtl .semi-card-header-wrapper-spacing,.semi-portal-rtl .semi-card-header-wrapper-spacing{margin-left:20px;margin-right:0}.semi-rtl .semi-card-meta-avatar,.semi-portal-rtl .semi-card-meta-avatar{margin-left:12px;margin-right:0}.semi-rtl .semi-card-group,.semi-portal-rtl .semi-card-group{direction:rtl}.semi-rtl .semi-card-group-grid .semi-card,.semi-portal-rtl .semi-card-group-grid .semi-card{margin:0 -1px -1px 0}.semi-carousel{position:relative;overflow:hidden}.semi-carousel-content{width:100%;height:100%;overflow:hidden;position:relative}.semi-carousel-content-item{position:absolute;left:0;top:0;width:100%;height:100%;overflow:hidden}.semi-carousel-content-item-current{z-index:1}.semi-carousel-content-fade>*{opacity:0}.semi-carousel-content-fade .semi-carousel-content-item-current{opacity:1}.semi-carousel-content-slide>*:not(.semi-carousel-content-item-current){visibility:hidden}.semi-carousel-content-slide .semi-carousel-content-item-slide-out{display:block;animation:semi-carousel-content-item-keyframe-slide-out;animation-fill-mode:forwards}.semi-carousel-content-slide .semi-carousel-content-item-slide-in{display:block;animation:semi-carousel-content-item-keyframe-slide-in;animation-fill-mode:forwards}.semi-carousel-content-reverse .semi-carousel-content-item-slide-out{animation:semi-carousel-content-item-keyframe-slide-out-reverse;animation-fill-mode:forwards}.semi-carousel-content-reverse .semi-carousel-content-item-slide-in{animation:semi-carousel-content-item-keyframe-slide-in-reverse;animation-fill-mode:forwards}.semi-carousel-indicator{display:flex;align-items:flex-end;z-index:2}.semi-carousel-indicator-left{position:absolute;left:32px;bottom:32px}.semi-carousel-indicator-center{position:absolute;left:50%;bottom:32px;transform:translate(-50%)}.semi-carousel-indicator-right{position:absolute;right:32px;bottom:32px}.semi-carousel-indicator-dot .semi-carousel-indicator-item{border-radius:50%;cursor:pointer}.semi-carousel-indicator-dot .semi-carousel-indicator-item:not(:last-child){margin-right:8px}.semi-carousel-indicator-dot .semi-carousel-indicator-item-small{width:8px;height:8px}.semi-carousel-indicator-dot .semi-carousel-indicator-item-medium{width:12px;height:12px}.semi-carousel-indicator-dot .semi-carousel-indicator-item-primary{background-color:rgba(var(--semi-blue-6),.4);transition:background-color var(--semi-transition_delay-none) var(--semi-transition_function-easeOut) var(--semi-transition_delay-none)}.semi-carousel-indicator-dot .semi-carousel-indicator-item-primary.semi-carousel-indicator-item-active{background:rgba(var(--semi-blue-6),1)}.semi-carousel-indicator-dot .semi-carousel-indicator-item-primary:hover{background-color:rgba(var(--semi-blue-6),.7)}.semi-carousel-indicator-dot .semi-carousel-indicator-item-primary:active{background:rgba(var(--semi-blue-6),1)}.semi-carousel-indicator-dot .semi-carousel-indicator-item-light{background-color:rgba(var(--semi-white),.4);transition:background-color var(--semi-transition_delay-none) var(--semi-transition_function-easeOut) var(--semi-transition_delay-none)}.semi-carousel-indicator-dot .semi-carousel-indicator-item-light.semi-carousel-indicator-item-active{background:rgba(var(--semi-white),1)}.semi-carousel-indicator-dot .semi-carousel-indicator-item-light:hover{background-color:rgba(var(--semi-white),.7)}.semi-carousel-indicator-dot .semi-carousel-indicator-item-light:active{background:rgba(var(--semi-white),1)}.semi-carousel-indicator-dot .semi-carousel-indicator-item-dark{background-color:rgba(var(--semi-black),.5);transition:background-color var(--semi-transition_delay-none) var(--semi-transition_function-easeOut) var(--semi-transition_delay-none)}.semi-carousel-indicator-dot .semi-carousel-indicator-item-dark.semi-carousel-indicator-item-active{background-color:rgba(var(--semi-black),1)}.semi-carousel-indicator-dot .semi-carousel-indicator-item-dark:hover{background-color:rgba(var(--semi-black),.7)}.semi-carousel-indicator-dot .semi-carousel-indicator-item-dark:active{background:rgba(var(--semi-black),1)}.semi-carousel-indicator-line{width:240px}.semi-carousel-indicator-line .semi-carousel-indicator-item{flex:1;cursor:pointer}.semi-carousel-indicator-line .semi-carousel-indicator-item:not(:last-child){margin-right:4px}.semi-carousel-indicator-line .semi-carousel-indicator-item-small{height:4px}.semi-carousel-indicator-line .semi-carousel-indicator-item-medium{height:6px}.semi-carousel-indicator-line .semi-carousel-indicator-item-primary{background-color:rgba(var(--semi-blue-6),.4)}.semi-carousel-indicator-line .semi-carousel-indicator-item-primary.semi-carousel-indicator-item-active{background:rgba(var(--semi-blue-6),1)}.semi-carousel-indicator-line .semi-carousel-indicator-item-primary:hover{background-color:rgba(var(--semi-blue-6),.7)}.semi-carousel-indicator-line .semi-carousel-indicator-item-primary:active{background:rgba(var(--semi-blue-6),1)}.semi-carousel-indicator-line .semi-carousel-indicator-item-light{background-color:rgba(var(--semi-white),.4)}.semi-carousel-indicator-line .semi-carousel-indicator-item-light.semi-carousel-indicator-item-active{background:rgba(var(--semi-white),1)}.semi-carousel-indicator-line .semi-carousel-indicator-item-light:hover{background-color:rgba(var(--semi-white),.7)}.semi-carousel-indicator-line .semi-carousel-indicator-item-light:active{background:rgba(var(--semi-white),1)}.semi-carousel-indicator-line .semi-carousel-indicator-item-dark{background-color:rgba(var(--semi-black),.5)}.semi-carousel-indicator-line .semi-carousel-indicator-item-dark.semi-carousel-indicator-item-active{background:rgba(var(--semi-black),1)}.semi-carousel-indicator-line .semi-carousel-indicator-item-dark:hover{background-color:rgba(var(--semi-black),.7)}.semi-carousel-indicator-line .semi-carousel-indicator-item-dark:active{background:rgba(var(--semi-black),1)}.semi-carousel-indicator-columnar .semi-carousel-indicator-item{cursor:pointer}.semi-carousel-indicator-columnar .semi-carousel-indicator-item:not(:last-child){margin-right:4px}.semi-carousel-indicator-columnar .semi-carousel-indicator-item-small{width:4px;height:12px}.semi-carousel-indicator-columnar .semi-carousel-indicator-item-small.semi-carousel-indicator-item-active{height:20px}.semi-carousel-indicator-columnar .semi-carousel-indicator-item-medium{width:6px;height:20px}.semi-carousel-indicator-columnar .semi-carousel-indicator-item-medium.semi-carousel-indicator-item-active{height:28px}.semi-carousel-indicator-columnar .semi-carousel-indicator-item-primary{background-color:rgba(var(--semi-blue-6),.4)}.semi-carousel-indicator-columnar .semi-carousel-indicator-item-primary.semi-carousel-indicator-item-active{background:rgba(var(--semi-blue-6),1)}.semi-carousel-indicator-columnar .semi-carousel-indicator-item-primary:hover{background-color:rgba(var(--semi-blue-6),.7)}.semi-carousel-indicator-columnar .semi-carousel-indicator-item-primary:active{background:rgba(var(--semi-blue-6),1)}.semi-carousel-indicator-columnar .semi-carousel-indicator-item-light{background-color:rgba(var(--semi-white),.4)}.semi-carousel-indicator-columnar .semi-carousel-indicator-item-light.semi-carousel-indicator-item-active{background:rgba(var(--semi-white),1)}.semi-carousel-indicator-columnar .semi-carousel-indicator-item-light:hover{background-color:rgba(var(--semi-white),.7)}.semi-carousel-indicator-columnar .semi-carousel-indicator-item-light:active{background:rgba(var(--semi-white),1)}.semi-carousel-indicator-columnar .semi-carousel-indicator-item-dark{background-color:rgba(var(--semi-black),.5)}.semi-carousel-indicator-columnar .semi-carousel-indicator-item-dark.semi-carousel-indicator-item-active{background:rgba(var(--semi-black),1)}.semi-carousel-indicator-columnar .semi-carousel-indicator-item-dark:hover{background-color:rgba(var(--semi-black),.7)}.semi-carousel-indicator-columnar .semi-carousel-indicator-item-dark:active{background:rgba(var(--semi-black),1)}.semi-carousel-arrow{display:flex;font-size:32px;cursor:pointer}.semi-carousel-arrow-prev{position:absolute;top:50%;left:20px;transform:translateY(-50%);z-index:2}.semi-carousel-arrow-next{position:absolute;top:50%;right:20px;transform:translateY(-50%);z-index:2}.semi-carousel-arrow-light{color:rgba(var(--semi-white),.4);transition:color var(--semi-transition_delay-none) var(--semi-transition_function-easeOut) var(--semi-transition_delay-none)}.semi-carousel-arrow-light:hover{color:rgba(var(--semi-white),1)}.semi-carousel-arrow-primary{color:rgba(var(--semi-blue-6),.4);transition:color var(--semi-transition_delay-none) var(--semi-transition_function-easeOut) var(--semi-transition_delay-none)}.semi-carousel-arrow-primary:hover{color:rgba(var(--semi-blue-6),1)}.semi-carousel-arrow-dark{color:rgba(var(--semi-black),.5);transition:color var(--semi-transition_delay-none) var(--semi-transition_function-easeOut) var(--semi-transition_delay-none)}.semi-carousel-arrow-dark:hover{color:rgba(var(--semi-black),1)}.semi-carousel-arrow-hover div{z-index:2;opacity:0}.semi-carousel:hover .semi-carousel-arrow-hover div{opacity:1}@keyframes semi-carousel-content-item-keyframe-slide-in{0%{transform:translate(100%)}to{transform:translate(0)}}@keyframes semi-carousel-content-item-keyframe-slide-out{0%{transform:translate(0)}to{transform:translate(-100%)}}@keyframes semi-carousel-content-item-keyframe-slide-in-reverse{0%{transform:translate(-100%)}to{transform:translate(0)}}@keyframes semi-carousel-content-item-keyframe-slide-out-reverse{0%{transform:translate(0)}to{transform:translate(100%)}}.semi-rtl .semi-carousel,.semi-portal-rtl .semi-carousel{direction:rtl}.semi-rtl .semi-carousel-indicator,.semi-portal-rtl .semi-carousel-indicator{display:flex}.semi-rtl .semi-carousel-indicator-dot .semi-carousel-indicator-item:not(:last-child),.semi-portal-rtl .semi-carousel-indicator-dot .semi-carousel-indicator-item:not(:last-child){margin-right:0;margin-left:8px}.semi-rtl .semi-carousel-indicator-columnar .semi-carousel-indicator-item:not(:last-child),.semi-portal-rtl .semi-carousel-indicator-columnar .semi-carousel-indicator-item:not(:last-child){margin-right:0;margin-left:4px}.semi-rtl .semi-carousel-arrow,.semi-portal-rtl .semi-carousel-arrow{flex-direction:row-reverse}.semi-rtl .semi-carousel-arrow-prev,.semi-portal-rtl .semi-carousel-arrow-prev{left:auto;right:20px;transform:scaleX(-1) translateY(-50%);z-index:2}.semi-rtl .semi-carousel-arrow-next,.semi-portal-rtl .semi-carousel-arrow-next{left:20px;transform:scaleX(-1) translateY(-50%);right:auto;z-index:2}.semi-cascader{box-sizing:border-box;border-radius:var(--semi-border-radius-small);border:1px solid rgba(0,0,0,0);min-width:80px;min-height:32px;height:auto;line-height:32px;font-weight:400;background-color:var(--semi-color-fill-0);display:inline-flex;align-items:center;vertical-align:middle;position:relative;cursor:pointer}.semi-cascader:hover{background-color:var(--semi-color-fill-1);border:1px rgba(0,0,0,0) solid}.semi-cascader:focus:not(.semi-cascader-disabled){border:1px solid var(--semi-color-focus-border);background-color:var(--semi-color-fill-0);outline:0}.semi-cascader:active{background-color:var(--semi-color-fill-2)}.semi-cascader-small{min-height:24px;line-height:24px}.semi-cascader-small .semi-cascader-selection{padding-left:12px;padding-right:12px}.semi-cascader-small .semi-cascader-selection-multiple{padding-left:4px;padding-right:4px}.semi-cascader-large{min-height:40px;line-height:40px}.semi-cascader-large .semi-cascader-selection{font-size:16px;line-height:22px;font-family:Inter,-apple-system,BlinkMacSystemFont,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Segoe UI,Helvetica Neue,Helvetica,Arial,sans-serif}.semi-cascader-large .semi-cascader-selection{padding-left:12px;padding-right:12px}.semi-cascader-large .semi-cascader-selection-multiple{padding-left:4px;padding-right:4px}.semi-cascader-focus{border:1px solid var(--semi-color-focus-border);outline:0}.semi-cascader-focus:hover{background-color:var(--semi-color-fill-0);border:1px solid var(--semi-color-focus-border)}.semi-cascader-focus:active{background-color:var(--semi-color-fill-2)}.semi-cascader-warning{background-color:var(--semi-color-warning-light-default);border-color:var(--semi-color-warning-light-default)}.semi-cascader-warning:hover{background-color:var(--semi-color-warning-light-hover);border-color:var(--semi-color-warning-light-hover)}.semi-cascader-warning.semi-cascader-focus{background-color:var(--semi-color-warning-light-default);border-color:var(--semi-color-warning)}.semi-cascader-warning:active{background-color:var(--semi-color-warning-light-active);border-color:var(--semi-color-warning-light-active)}.semi-cascader-error{background-color:var(--semi-color-danger-light-default);border-color:var(--semi-color-danger-light-default)}.semi-cascader-error:hover{background-color:var(--semi-color-danger-light-hover);border-color:var(--semi-color-danger-light-hover)}.semi-cascader-error.semi-cascader-focus{background-color:var(--semi-color-danger-light-default);border-color:var(--semi-color-danger)}.semi-cascader-error:active{background-color:var(--semi-color-danger-light-active);border-color:var(--semi-color-danger-light-active)}.semi-cascader-selection{font-size:14px;line-height:20px;font-family:Inter,-apple-system,BlinkMacSystemFont,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Segoe UI,Helvetica Neue,Helvetica,Arial,sans-serif;height:100%;display:inline-flex;align-items:center;flex-wrap:wrap;flex-grow:1;overflow:hidden;padding-left:12px;padding-right:12px;cursor:pointer;color:var(--semi-color-text-0)}.semi-cascader-selection-multiple{padding-left:4px;padding-right:4px}.semi-cascader-selection-placeholder{overflow:hidden;white-space:nowrap;text-overflow:ellipsis;color:var(--semi-color-text-2)}.semi-cascader-selection-tag{margin:1px 2px 1px 0}.semi-cascader-selection-tag:first-child{margin-left:0}.semi-cascader-selection-tag-disabled.semi-tag{color:var(--semi-color-disabled-text);background-color:#0000;cursor:not-allowed}.semi-cascader-selection-tag-disabled.semi-tag .semi-tag-close{color:var(--semi-color-disabled-text);cursor:not-allowed;pointer-events:none}.semi-cascader-selection-n{cursor:pointer;font-size:12px;margin-right:4px;color:var(--semi-color-text-0);padding-left:8px;padding-right:8px}.semi-cascader-selection-n-disabled{cursor:not-allowed;color:var(--semi-color-disabled-text)}.semi-cascader-selection span{overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.semi-cascader-selection .semi-cascader-tagInput-wrapper{border:hidden;background:#0000;margin-left:-4px}.semi-cascader-selection .semi-tagInput{min-height:30px}.semi-cascader-selection .semi-tagInput-small{min-height:22px}.semi-cascader-selection .semi-tagInput-large{min-height:38px}.semi-cascader-selection .semi-tagInput .semi-input-wrapper{margin-left:4px}.semi-cascader-selection .semi-tagInput .semi-input-wrapper .semi-input{padding-left:0}.semi-cascader-selection .semi-tagInput .semi-input-wrapper-default,.semi-cascader-selection .semi-tagInput .semi-input-wrapper-large{margin-top:1px;margin-bottom:1px}.semi-cascader-selection-text-inactive{color:var(--semi-color-text-2)}.semi-cascader-selection-text-hide{display:none}.semi-cascader-arrow,.semi-cascader-clearbtn{display:inline-flex;align-items:center;height:100%;justify-content:center;width:32px;color:var(--semi-color-text-2)}.semi-cascader-clearbtn:hover{color:var(--semi-color-primary-hover)}.semi-cascader-clearbtn:active{color:var(--semi-color-primary-active)}.semi-cascader-prefix,.semi-cascader-suffix{display:inline;display:flex;justify-content:center;align-items:center}.semi-cascader-prefix-text,.semi-cascader-suffix-text{margin:0 12px;font-weight:600;font-size:14px;line-height:20px;font-family:Inter,-apple-system,BlinkMacSystemFont,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Segoe UI,Helvetica Neue,Helvetica,Arial,sans-serif;color:var(--semi-color-text-2)}.semi-cascader-prefix-icon,.semi-cascader-suffix-icon{color:var(--semi-color-text-2);margin:0 8px}.semi-cascader-inset-label{display:inline;margin:0 12px;font-weight:600;font-size:14px;line-height:20px;font-family:Inter,-apple-system,BlinkMacSystemFont,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Segoe UI,Helvetica Neue,Helvetica,Arial,sans-serif;color:var(--semi-color-text-2);flex-shrink:0;white-space:nowrap}.semi-cascader.semi-cascader-with-prefix{display:inline-flex;align-items:center}.semi-cascader.semi-cascader-with-prefix .semi-cascader-selection{padding-left:0}.semi-cascader.semi-cascader-with-suffix .semi-cascader-selection{padding-right:0}.semi-cascader-disabled{cursor:not-allowed;-webkit-user-select:none;user-select:none;background-color:var(--semi-color-disabled-fill)}.semi-cascader-disabled .semi-cascader-selection{cursor:not-allowed}.semi-cascader-disabled:hover{background-color:var(--semi-color-disabled-fill)}.semi-cascader-disabled .semi-cascader-selection,.semi-cascader-disabled .semi-cascader-selection-placeholder,.semi-cascader-disabled .semi-cascader-prefix,.semi-cascader-disabled .semi-cascader-suffix{color:var(--semi-color-disabled-text);cursor:not-allowed}.semi-cascader-disabled .semi-cascader-arrow{color:var(--semi-color-disabled-text)}.semi-cascader-popover .semi-cascader-search-wrapper{padding:8px 12px;border-bottom:1px solid var(--semi-color-fill-0)}.semi-cascader-popover .semi-cascader-option-lists .semi-cascader-option-empty{font-size:14px;line-height:20px;font-family:Inter,-apple-system,BlinkMacSystemFont,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Segoe UI,Helvetica Neue,Helvetica,Arial,sans-serif;border-radius:var(--semi-border-radius-medium);color:var(--semi-color-disabled-text);margin:0;padding:8px 12px;-webkit-user-select:none;user-select:none;text-align:center;cursor:not-allowed}.semi-cascader-popover .semi-cascader-option-lists .semi-cascader-option-empty:hover{background-color:#0000}.semi-cascader-single.semi-cascader-filterable{display:inline-flex}.semi-cascader-single.semi-cascader-filterable .semi-cascader-selection .semi-cascader-search-wrapper{width:100%;height:30px;display:flex;align-items:center;position:relative}.semi-cascader-single.semi-cascader-filterable .semi-cascader-selection .semi-cascader-search-wrapper-small{height:22px}.semi-cascader-single.semi-cascader-filterable .semi-cascader-selection .semi-cascader-search-wrapper-large{height:38px}.semi-cascader-single.semi-cascader-filterable .semi-cascader-selection .semi-cascader-search-wrapper .semi-input-wrapper{position:absolute;top:0;left:0;height:100%;width:100%;border:none;background-color:#0000}.semi-cascader-single.semi-cascader-filterable .semi-cascader-selection .semi-cascader-search-wrapper .semi-input-wrapper-focus{border:none}.semi-cascader-single.semi-cascader-filterable .semi-cascader-selection .semi-cascader-search-wrapper .semi-input{padding-left:0;padding-right:0}.semi-cascader-option-lists{display:flex;overflow:hidden;padding:0;margin:0;height:180px}.semi-cascader-option-lists-empty{height:auto;justify-content:center;cursor:not-allowed}.semi-cascader-option-lists ul,.semi-cascader-option-lists li{list-style-type:none;padding:0;margin:0}.semi-cascader-option-lists ul>li{padding:8px 16px 8px 12px}.semi-cascader-option-lists .semi-cascader-option-list{box-sizing:border-box;display:inline-block;min-width:150px;height:100%;margin:0;padding:4px 0;overflow:auto;list-style:none;border-left:1px solid var(--semi-color-fill-0)}.semi-cascader-option-lists .semi-cascader-option-list:first-child{border-left:none}.semi-cascader-option-lists .semi-cascader-option{display:flex;align-items:center;justify-content:space-between;cursor:pointer;transition:background-color var(--semi-transition_duration-none) var(--semi-transition_function-easeIn) var(--semi-transition_delay-none);font-size:14px;line-height:20px;font-family:Inter,-apple-system,BlinkMacSystemFont,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Segoe UI,Helvetica Neue,Helvetica,Arial,sans-serif;min-width:min-content;word-break:break-all;color:var(--semi-color-text-0);position:relative}.semi-cascader-option-lists .semi-cascader-option:hover{background-color:var(--semi-color-fill-0)}.semi-cascader-option-lists .semi-cascader-option:active{background-color:var(--semi-color-fill-1)}.semi-cascader-option-lists .semi-cascader-option-icon{display:inline-flex;flex-shrink:0;width:16px;color:var(--semi-color-text-2)}.semi-cascader-option-lists .semi-cascader-option-icon-active,.semi-cascader-option-lists .semi-cascader-option-icon-empty{margin-right:8px}.semi-cascader-option-lists .semi-cascader-option-icon-left{margin-left:8px}.semi-cascader-option-lists .semi-cascader-option-spin-icon{width:16px;height:16px;line-height:0}.semi-cascader-option-lists .semi-cascader-option-spin-icon svg{width:16px;height:16px}.semi-cascader-option-lists .semi-cascader-option-label{display:flex;align-items:center;white-space:pre}.semi-cascader-option-lists .semi-cascader-option-label-checkbox{margin-right:8px}.semi-cascader-option-lists .semi-cascader-option-hidden{display:none}.semi-cascader-option-lists .semi-cascader-option-active,.semi-cascader-option-lists .semi-cascader-option-active:hover{background-color:var(--semi-color-primary-light-default)}.semi-cascader-option-lists .semi-cascader-option-select,.semi-cascader-option-lists .semi-cascader-option-label-highlight{font-weight:600;color:var(--semi-color-primary)}.semi-cascader-option-lists .semi-cascader-option-disabled{cursor:not-allowed}.semi-cascader-option-lists .semi-cascader-option-disabled:hover,.semi-cascader-option-lists .semi-cascader-option-disabled:active{background-color:#0000}.semi-cascader-option-lists .semi-cascader-option-disabled .semi-cascader-option-label{color:var(--semi-color-disabled-text)}.semi-cascader-option-lists .semi-cascader-option-flatten{padding-right:64px}.semi-cascader-borderless:not(:focus-within):not(:hover){background-color:#0000;border-color:#0000}.semi-cascader-borderless:not(:focus-within):not(:hover) .semi-cascader-arrow{opacity:0}.semi-cascader-borderless:focus-within:not(:active){background-color:#0000}.semi-cascader-borderless.semi-cascader-error:not(:focus-within){border-color:var(--semi-color-danger)}.semi-cascader-borderless.semi-cascader-warning:not(:focus-within){border-color:var(--semi-color-warning)}.semi-cascader-borderless.semi-cascader-error:focus-within{border-color:var(--semi-color-danger)}.semi-cascader-borderless.semi-cascader-warning:focus-within{border-color:var(--semi-color-warning)}.semi-rtl .semi-cascader,.semi-portal-rtl .semi-cascader{direction:rtl}.semi-rtl .semi-cascader.semi-cascader-with-prefix .semi-cascader-selection,.semi-portal-rtl .semi-cascader.semi-cascader-with-prefix .semi-cascader-selection{padding-left:auto;padding-right:0}.semi-rtl .semi-cascader.semi-cascader-with-suffix .semi-cascader-selection,.semi-portal-rtl .semi-cascader.semi-cascader-with-suffix .semi-cascader-selection{padding-right:auto;padding-left:0}.semi-rtl .semi-cascader-selection-multiple,.semi-portal-rtl .semi-cascader-selection-multiple{padding-right:4px;padding-left:4px}.semi-rtl .semi-cascader-selection-tag:first-child,.semi-portal-rtl .semi-cascader-selection-tag:first-child{margin-right:0}.semi-rtl .semi-cascader-selection-n,.semi-portal-rtl .semi-cascader-selection-n{margin-right:0;margin-left:4px}.semi-rtl .semi-cascader-selection .semi-cascader-tagInput-wrapper,.semi-portal-rtl .semi-cascader-selection .semi-cascader-tagInput-wrapper{margin-left:0;margin-right:-4px}.semi-rtl .semi-cascader-selection .semi-tagInput .semi-input-wrapper,.semi-portal-rtl .semi-cascader-selection .semi-tagInput .semi-input-wrapper{margin-left:0;margin-right:4px}.semi-rtl .semi-cascader-selection .semi-tagInput .semi-input-wrapper .semi-input,.semi-portal-rtl .semi-cascader-selection .semi-tagInput .semi-input-wrapper .semi-input{padding-right:0}.semi-cascader-option-label-checkbox{margin-right:0;margin-left:8px}.semi-cascader-option-lists-rtl{direction:rtl}.semi-cascader-option-lists.semi-cascader-option-lists-rtl ul>li{padding-right:12px;padding-left:auto}.semi-cascader-option-lists.semi-cascader-option-lists-rtl .semi-cascader-option-list{border-left:0;border-right:1px solid var(--semi-color-fill-0)}.semi-cascader-option-lists.semi-cascader-option-lists-rtl .semi-cascader-option-list:first-child{border-right:none}.semi-cascader-option-lists.semi-cascader-option-lists-rtl .semi-cascader-option-icon-active,.semi-cascader-option-lists.semi-cascader-option-lists-rtl .semi-cascader-option-icon-empty{margin-right:0;margin-left:8px}.semi-cascader-option-lists.semi-cascader-option-lists-rtl .semi-cascader-option-flatten{padding-right:0;padding-left:64px}.semi-cascader-option-lists.semi-cascader-option-lists-rtl .semi-cascader-option .semi-icon-chevron_right{margin-left:0;margin-right:8px;transform:scaleX(-1)}.semi-chat{padding-top:12px;padding-bottom:12px;display:flex;flex-direction:column;height:100%;max-width:800px;position:relative;overflow:hidden}.semi-chat-inner{display:flex;flex-direction:column;height:100%}.semi-chat-dropArea{position:absolute;top:0;left:0;right:0;bottom:0;background:rgba(var(--semi-grey-2),.9);z-index:10;border:5px dotted var(--semi-color-border);display:flex;align-items:center;justify-content:center;border-radius:16px}.semi-chat-dropArea-text{font-size:48px}.semi-chat-content{overflow:hidden;flex:1 1;position:relative}.semi-chat-toast{position:absolute;top:0;left:50%;transform:translate(-50%)}.semi-chat-container{padding-left:16px;padding-right:16px;height:100%;overflow:scroll}.semi-chat-container-scroll-hidden::-webkit-scrollbar{display:none}.semi-chat-action{position:relative;z-index:1}.semi-chat-action-content.semi-button{position:absolute;bottom:0;left:50%;transform:translate(-50%);display:flex;justify-content:center;align-items:center;background:var(--semi-color-bg-0);border:1px solid var(--semi-color-border)}.semi-chat-action-content.semi-button-light:not(.semi-button-disabled):hover{background:var(--semi-color-tertiary-light-hover);border:1px solid var(--semi-color-border)}.semi-chat-action-backBottom.semi-button{width:42px;height:42px;border-radius:50%}.semi-chat-action-stop.semi-button{-webkit-user-select:none;user-select:none;height:42px;border-radius:21px}.semi-chat-divider{color:var(--semi-color-text-2);font-size:12px;margin-top:12px;margin-bottom:12px;font-weight:400}.semi-chat-chatBox{display:flex;flex-direction:row;margin-top:8px;margin-bottom:8px;column-gap:12px}.semi-chat-chatBox:hover .semi-chat-chatBox-action:not(.semi-chat-chatBox-action-hidden){visibility:visible}.semi-chat-chatBox-right{flex-direction:row-reverse}.semi-chat-chatBox-right .semi-chat-chatBox-wrap{align-items:flex-end}.semi-chat-chatBox-avatar{flex-shrink:0;width:24px;height:24px}.semi-chat-chatBox-avatar-hidden{visibility:hidden}.semi-chat-chatBox-title{line-height:20px;font-size:16px;color:var(--semi-color-text-0);font-weight:400;text-overflow:ellipsis}.semi-chat-chatBox-action{visibility:hidden;display:flex;align-items:center;position:relative;column-gap:10px;margin-left:10px;margin-right:10px}.semi-chat-chatBox-action-btn.semi-button{height:fit-content;width:fit-content}.semi-chat-chatBox-action-btn.semi-button.semi-button-with-icon-only{padding:0}.semi-chat-chatBox-action-icon-flip{transform:scaleY(-1)}.semi-chat-chatBox-action-show{visibility:visible}.semi-chat-chatBox-action-delete-wrap{display:inline-flex}.semi-chat-chatBox-action.semi-chat-chatBox-action-hidden,.semi-chat-chatBox-action:hover.semi-chat-chatBox-action-hidden{visibility:hidden}.semi-chat-chatBox-action .semi-button-borderless:not(.semi-button-disabled):hover{background-color:#0000}.semi-chat-chatBox-action .semi-button-tertiary.semi-button-borderless{color:var(--semi-color-text-2)}.semi-chat-chatBox-action .semi-button-tertiary.semi-button-borderless:hover{color:var(--semi-color-text-0)}.semi-chat-chatBox-wrap{display:flex;flex-direction:column;align-items:flex-start;position:relative;row-gap:8px;max-width:calc(100% - 36px)}.semi-chat-chatBox-content-bubble,.semi-chat-chatBox-content-userBubble{padding:8px 12px;border-radius:var(--semi-border-radius-large);background-color:var(--semi-color-fill-0);max-width:100%;box-sizing:border-box}.semi-chat-chatBox-content code{white-space:pre-wrap}.semi-chat-chatBox-content .semi-typography{color:var(--semi-color-text-0)}.semi-chat-chatBox-content .semi-chat-attachment-file{background:var(--semi-color-fill-2)}.semi-chat-chatBox-content .semi-chat-attachment-file,.semi-chat-chatBox-content .semi-chat-attachment-img{margin-top:4px;margin-bottom:4px;margin-right:4px}.semi-chat-chatBox-content-user{background:var(--semi-color-primary);color:var(--semi-color-white)}.semi-chat-chatBox-content-user .semi-chat-attachment-file{background:var(--semi-color-bg-0)}.semi-chat-chatBox-content-user .semi-typography,.semi-chat-chatBox-content-user .semi-typography code,.semi-chat-chatBox-content-user .semi-markdownRender ul,.semi-chat-chatBox-content-user .semi-markdownRender li,.semi-chat-chatBox-content-user .semi-typography a,.semi-chat-chatBox-content-user .semi-typography a:visited,.semi-chat-chatBox-content-user .semi-typography a:hover{color:var(--semi-color-white)}.semi-chat-chatBox-content-error{background:var(--semi-color-danger-hover)}.semi-chat-chatBox-content-error .semi-typography{color:var(--semi-color-white)}.semi-chat-chatBox-content-loading{display:flex;align-items:baseline}.semi-chat-chatBox-content-loading-item{border-radius:50%;height:8px;width:8px;background-color:var(--semi-color-text-0);margin:6px 18px;overflow:visible;position:relative;animation:semi-chat-loading-flashing .8s infinite alternate;animation-delay:-.2s;animation-timing-function:ease}.semi-chat-chatBox-content-loading-item:before{content:"";border-radius:50%;height:8px;width:8px;background-color:var(--semi-color-text-0);position:absolute;top:0;left:-15px;animation:semi-chat-loading-flashing .8s infinite alternate;animation-timing-function:ease;animation-delay:-.4s}.semi-chat-chatBox-content-loading-item:after{content:"";border-radius:50%;height:8px;width:8px;background-color:var(--semi-color-text-0);position:absolute;top:0;left:15px;animation:semi-chat-loading-flashing .8s infinite alternate;animation-delay:0s;animation-timing-function:ease}.semi-chat-chatBox-content pre{background-color:#0000}.semi-chat-chatBox-content-code{border-radius:var(--semi-border-radius-large);overflow:hidden}.semi-chat-chatBox-content-code .semi-codeHighlight pre{word-break:break-all;white-space:pre-wrap}.semi-chat-chatBox-content-code-topSlot{display:flex;justify-content:space-between;background-color:rgba(var(--semi-grey-4),1);align-items:center;padding:5px 8px;color:rgba(var(--semi-white),1);font-size:12px}.semi-chat-chatBox-content-code-topSlot-copy{min-width:150px;display:flex;justify-content:flex-end}.semi-chat-chatBox-content-code-topSlot-copy-wrapper{display:flex;align-items:center;column-gap:5px;cursor:pointer;background:#0000;border:none;color:rgba(var(--semi-white),1);line-height:16px;padding:5px;border-radius:var(--semi-border-radius-large)}.semi-chat-chatBox-content-code-topSlot-toCopy:hover{background:rgba(var(--semi-grey-5),1)}.semi-chat-chatBox-content-code .semi-codeHighlight-defaultTheme pre[class*=language-]{margin:0;background:var(--semi-color-bg-0)}.semi-chat-inputBox{padding:8px 16px}.semi-chat-inputBox-clearButton.semi-button{border-radius:50%;width:48px;height:48px;margin-top:4px;margin-bottom:4px}.semi-chat-inputBox-clearButton.semi-button .semi-icon{font-size:30px}.semi-chat-inputBox-clearButton.semi-button.semi-button-primary.semi-button-borderless{color:var(--semi-color-text-2)}.semi-chat-inputBox-upload .semi-upload-file-list{display:none}.semi-chat-inputBox-uploadButton.semi-button{width:32px;height:32px}.semi-chat-inputBox-uploadButton.semi-button.semi-button-primary.semi-button-borderless{color:var(--semi-color-text-0)}.semi-chat-inputBox-sendButton.semi-button{width:32px;height:32px}.semi-chat-inputBox-sendButton.semi-button-icon{transform:rotate(45deg)}.semi-chat-inputBox-sendButton.semi-button.semi-button-disabled.semi-button-borderless{color:var(--semi-color-primary-disabled)}.semi-chat-inputBox-inner{display:flex;flex-direction:row;align-items:flex-end;column-gap:4px}.semi-chat-inputBox-container{display:flex;flex-direction:row;flex-grow:1;border-radius:16px;padding:11px;border:1px solid var(--semi-color-border);align-items:flex-end}.semi-chat-inputBox-inputArea{flex-grow:1;display:flex;flex-direction:column}.semi-chat-inputBox-textarea{flex-grow:1}.semi-chat-inputBox-textarea.semi-input-textarea-wrapper,.semi-chat-inputBox-textarea.semi-input-textarea-wrapper:hover,.semi-chat-inputBox-textarea.semi-input-textarea-wrapper:active{border:none;background-color:#0000}.semi-chat-attachment{display:flex;flex-direction:row;flex-wrap:wrap;column-gap:10px;row-gap:5px;margin-left:12px;margin-right:12px}.semi-chat-attachment-item{position:relative}.semi-chat-attachment-item:hover .semi-chat-inputBox-attachment-clear{visibility:visible}.semi-chat-attachment-img{border-radius:var(--semi-border-radius-medium);vertical-align:top}.semi-chat-attachment-img img{object-fit:cover}.semi-chat-attachment a{text-decoration:none;color:inherit}.semi-chat-attachment-clear{position:absolute;top:-8px;right:-8px;color:var(--semi-color-text-2)}.semi-chat-attachment-process.semi-progress-circle,.semi-chat-attachment-fail{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%)}.semi-chat-attachment-fail{color:var(--semi-color-danger)}.semi-chat-attachment-file{display:inline-flex;flex-direction:row;align-items:center;height:50px;column-gap:5px;padding:5px;border-radius:var(--semi-border-radius-medium);background:var(--semi-color-fill-0);text-decoration:none}.semi-chat-attachment-file-icon{color:var(--semi-color-text-2)}.semi-chat-attachment-file-info{display:flex;flex-direction:column}.semi-chat-attachment-file-title{font-size:16px;color:var(--semi-color-text-0);max-width:90px;text-overflow:ellipsis;overflow:hidden}.semi-chat-attachment-file-metadata{font-size:14px;color:var(--semi-color-text-2)}.semi-chat-attachment-file-type{text-transform:uppercase}.semi-chat .semi-typography a.semi-chat-attachment-file{display:flex}.semi-chat .semi-typography a.semi-chat-attachment-file .semi-chat-attachment-file-title{color:var(--semi-color-text-0)}.semi-chat-hints{display:flex;flex-direction:column;row-gap:10px;margin-top:12px;margin-bottom:12px;margin-left:34px}.semi-chat-hint-item{cursor:pointer;display:flex;flex-direction:row;column-gap:20px;width:fit-content;background:#0000;align-items:center;border:1px solid var(--semi-color-border);padding:8px 12px;border-radius:var(--semi-border-radius-large)}.semi-chat-hint-item:hover{background-color:var(--semi-color-fill-0)}.semi-chat-hint-content{font-size:14px;color:var(--semi-color-text-1)}.semi-chat-hint-icon{color:var(--semi-color-text-2)}@keyframes semi-chat-loading-flashing{0%{opacity:1}50%{opacity:.1}to{opacity:1}}.semi-rtl .semi-chat,.semi-portal-rtl .semi-chat{direction:rtl}.semi-rtl .semi-chat-hint-icon,.semi-portal-rtl .semi-chat-hint-icon{transform:scaleX(-1)}.semi-rtl .semi-chat-inputBox-sendButton-icon,.semi-portal-rtl .semi-chat-inputBox-sendButton-icon{transform:rotate(225deg)}.semi-rtl .semi-chat-chatBox-action-icon-redo,.semi-portal-rtl .semi-chat-chatBox-action-icon-redo{transform:scaleX(-1)}.semi-checkbox{box-sizing:border-box;position:relative;display:flex;align-items:flex-start;font-size:14px;line-height:20px;font-family:Inter,-apple-system,BlinkMacSystemFont,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Segoe UI,Helvetica Neue,Helvetica,Arial,sans-serif;cursor:pointer;transition:background-color var(--semi-transition_duration-none) var(--semi-transition_function-easeIn) var(--semi-transition_delay-none),border var(--semi-transition_duration-none) var(--semi-transition_function-easeIn) var(--semi-transition_delay-none);transform:scale(var(--semi-transform_scale-none));column-gap:8px}.semi-checkbox input[type=checkbox]{position:absolute;left:0;top:0;width:100%;height:100%;margin:0;opacity:0}.semi-checkbox-content{flex:1;display:flex;flex-direction:column;row-gap:4px}.semi-checkbox-addon{display:flex;flex:1;align-items:center;color:var(--semi-color-text-0);line-height:20px;-webkit-user-select:none;user-select:none}.semi-checkbox:hover .semi-checkbox-inner-display{background:var(--semi-color-fill-0);box-shadow:inset 0 0 0 1px var(--semi-color-focus-border)}.semi-checkbox:hover .semi-checkbox-inner-checked .semi-checkbox-inner-display{background:var(--semi-color-primary-hover);box-shadow:none}.semi-checkbox:active .semi-checkbox-inner-checked .semi-checkbox-inner-display{background:var(--semi-color-primary-active);box-shadow:none}.semi-checkbox.semi-checkbox-disabled:hover .semi-checkbox-inner-display,.semi-checkbox.semi-checkbox-disabled:active .semi-checkbox-inner-display{background:var(--semi-color-disabled-fill);box-shadow:inset 0 0 0 1px var(--semi-color-border)}.semi-checkbox.semi-checkbox-disabled:hover .semi-checkbox-inner-checked .semi-checkbox-inner-display,.semi-checkbox.semi-checkbox-disabled:active .semi-checkbox-inner-checked .semi-checkbox-inner-display{color:var(--semi-color-white);background:var(--semi-color-primary-disabled);box-shadow:none}.semi-checkbox-inner{position:relative;display:flex;align-items:center;width:16px;height:20px;-webkit-user-select:none;user-select:none;cursor:pointer}.semi-checkbox-inner-display{box-sizing:border-box;position:relative;width:16px;height:16px;margin:0;background:#0000;transition:background-color var(--semi-transition_duration-none) var(--semi-transition_function-easeIn) var(--semi-transition_delay-none),border var(--semi-transition_duration-none) var(--semi-transition_function-easeIn) var(--semi-transition_delay-none);box-shadow:inset 0 0 0 1px var(--semi-color-text-3);border-radius:var(--semi-border-radius-extra-small)}.semi-checkbox-inner-display .semi-icon{font-size:16px}.semi-checkbox-inner-checked .semi-checkbox-inner-display{background:var(--semi-color-primary);color:var(--semi-color-white);box-shadow:inset 0 0 0 1px var(--semi-color-primary);border-radius:var(--semi-border-radius-extra-small)}.semi-checkbox-inner-checked>.semi-checkbox-addon{color:var(--semi-color-text-0)}.semi-checkbox:hover .semi-checkbox-inner-display{background:var(--semi-color-fill-0)}.semi-checkbox:hover.semi-checkbox-indeterminate .semi-checkbox-inner-display{background:var(--semi-color-primary-hover);box-shadow:none;color:var(--semi-color-white)}.semi-checkbox:hover .semi-checkbox-inner-checked .semi-checkbox-inner-display{background:var(--semi-color-primary-hover);border-color:var(--semi-color-primary-hover);color:var(--semi-color-white)}.semi-checkbox:hover.semi-checkbox-cardType.semi-checkbox-unChecked.semi-checkbox-cardType_enable .semi-checkbox-inner-display{background:var(--semi-color-white)}.semi-checkbox:active .semi-checkbox-inner-display{background:var(--semi-color-fill-1)}.semi-checkbox:active.semi-checkbox-indeterminate .semi-checkbox-inner-display{background:var(--semi-color-primary-active);border-color:var(--semi-color-primary-active);color:var(--semi-color-white);box-shadow:none}.semi-checkbox:active .semi-checkbox-inner-checked .semi-checkbox-inner-display{background:var(--semi-color-primary-active);border-color:var(--semi-color-primary-active);color:var(--semi-color-white)}.semi-checkbox:active.semi-checkbox-cardType.semi-checkbox-unChecked.semi-checkbox-cardType_enable .semi-checkbox-inner-display{background:var(--semi-color-white)}.semi-checkbox-cardType{flex-wrap:nowrap;align-items:flex-start;border-radius:3px;padding:12px 16px;background:#0000;border:1px solid rgba(0,0,0,0)}.semi-checkbox-cardType .semi-checkbox-inner{position:relative;flex-shrink:0}.semi-checkbox-cardType .semi-checkbox-inner-display{background:var(--semi-color-white)}.semi-checkbox-cardType .semi-checkbox-inner-pureCardType{opacity:0;width:0}.semi-checkbox-cardType .semi-checkbox-addon{font-weight:600;font-size:14px;line-height:20px;color:var(--semi-color-text-0)}.semi-checkbox-cardType .semi-checkbox-extra{font-weight:400;font-size:14px;line-height:20px;color:var(--semi-color-text-2)}.semi-checkbox-cardType .semi-checkbox-extra.semi-checkbox-cardType_extra_noChildren{margin-top:0}.semi-checkbox-cardType:hover{background:var(--semi-color-fill-0)}.semi-checkbox-cardType:active{background:var(--semi-color-fill-1)}.semi-checkbox-cardType_checked{background:var(--semi-color-primary-light-default);border:1px solid var(--semi-color-primary)}.semi-checkbox-cardType_checked:hover{background:var(--semi-color-primary-light-default);border-color:var(--semi-color-primary-hover)}.semi-checkbox-cardType_checked:hover .semi-checkbox-inner-checked .semi-checkbox-inner-display{box-shadow:none}.semi-checkbox-cardType_checked:active{background:var(--semi-color-primary-light-default);border-color:var(--semi-color-primary-active)}.semi-checkbox-cardType_disabled:active,.semi-checkbox-cardType_disabled:hover{background:#0000}.semi-checkbox-cardType_checked_disabled.semi-checkbox-cardType{background:var(--semi-color-primary-light-default);border:1px solid var(--semi-color-primary-disabled)}.semi-checkbox-cardType_checked_disabled.semi-checkbox-cardType:hover .semi-checkbox-inner-checked .semi-checkbox-inner-display{box-shadow:none}.semi-checkbox-indeterminate .semi-checkbox-inner-display,.semi-checkbox-checked .semi-checkbox-inner-display{background:var(--semi-color-primary);color:var(--semi-color-white);box-shadow:inset 0 0 0 1px var(--semi-color-primary);border-radius:var(--semi-border-radius-extra-small)}.semi-checkbox-indeterminate .semi-checkbox-inner-display:hover,.semi-checkbox-checked .semi-checkbox-inner-display:hover{background:var(--semi-color-primary-hover);border-color:var(--semi-color-primary-hover);color:var(--semi-color-white)}.semi-checkbox-indeterminate .semi-checkbox-inner-display:active,.semi-checkbox-checked .semi-checkbox-inner-display:active{background:var(--semi-color-primary-active);border-color:var(--semi-color-primary-active);color:var(--semi-color-white)}.semi-checkbox-indeterminate .semi-checkbox-inner-addon,.semi-checkbox-checked .semi-checkbox-inner-addon{color:var(--semi-color-text-0)}.semi-checkbox-disabled,.semi-checkbox-disabled .semi-checkbox-inner{cursor:not-allowed}.semi-checkbox-disabled .semi-checkbox-inner-display{color:var(--semi-color-white);background:var(--semi-color-disabled-fill);box-shadow:inset 0 0 0 1px var(--semi-color-border)}.semi-checkbox-disabled .semi-checkbox-inner-display:hover{color:var(--semi-color-white);background:#0000}.semi-checkbox-disabled .semi-checkbox-inner-checked{color:var(--semi-color-white)}.semi-checkbox-disabled .semi-checkbox-inner-checked .semi-checkbox-inner-display{opacity:.75;background:var(--semi-color-primary-disabled);box-shadow:inset 0 0 0 1px var(--semi-color-primary-disabled)}.semi-checkbox-disabled .semi-checkbox-inner-checked .semi-checkbox-inner-display:hover{color:var(--semi-color-white);background:var(--semi-color-primary-disabled)}.semi-checkbox-disabled .semi-checkbox-addon,.semi-checkbox-disabled .semi-checkbox-extra{color:var(--semi-color-disabled-text)}.semi-checkbox.semi-checkbox-disabled.semi-checkbox-indeterminate .semi-checkbox-inner-display{opacity:.75;background:var(--semi-color-primary-disabled);box-shadow:inset 0 0 0 1px var(--semi-color-primary-disabled);color:var(--semi-color-white)}.semi-checkbox-extra{flex-shrink:0;flex-grow:1;flex-basis:100%;box-sizing:border-box;color:var(--semi-color-text-2)}.semi-checkbox-focus{outline:2px solid var(--semi-color-primary-light-active)}.semi-checkbox-focus-border{box-shadow:inset 0 0 0 1px var(--semi-color-focus-border)}.semi-checkboxGroup{font-size:14px;line-height:20px;font-family:Inter,-apple-system,BlinkMacSystemFont,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Segoe UI,Helvetica Neue,Helvetica,Arial,sans-serif;line-height:14px}.semi-checkboxGroup .semi-checkbox.semi-checkbox-vertical{margin-bottom:16px}.semi-checkboxGroup-horizontal{display:flex;flex-wrap:wrap;gap:16px}.semi-checkboxGroup-horizontal .semi-checkbox{display:inline-flex}.semi-checkboxGroup-vertical{display:flex;flex-direction:column;row-gap:12px}.semi-checkboxGroup-vertical-cardType{row-gap:16px}.semi-checkboxGroup-vertical-pureCardType .semi-checkbox{column-gap:0}.semi-rtl .semi-checkbox,.semi-portal-rtl .semi-checkbox{direction:rtl}.semi-rtl .semi-checkbox input[type=checkbox],.semi-portal-rtl .semi-checkbox input[type=checkbox]{left:auto;right:0}.semi-rtl .semi-checkboxGroup,.semi-portal-rtl .semi-checkboxGroup{direction:rtl}.semi-codeHighlight-defaultTheme pre[class*=language-],.semi-codeHighlight-defaultTheme code[class*=language-]{color:var(--semi-color-text-0);font-size:13px;text-shadow:none;font-family:ui-monospace,SFMono-Regular,SF Mono,Menlo,Monaco,Consolas,Liberation Mono,DejaVu Sans Mono,Courier New,monospace;direction:ltr;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;line-height:1.5;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-moz-hyphens:none;-webkit-hyphens:none;hyphens:none}.semi-codeHighlight-defaultTheme pre[class*=language-]::selection,.semi-codeHighlight-defaultTheme code[class*=language-]::selection,.semi-codeHighlight-defaultTheme pre[class*=language-]::-moz-selection,.semi-codeHighlight-defaultTheme code[class*=language-]::-moz-selection{text-shadow:none;background:#b3d4fc}.semi-codeHighlight-defaultTheme pre[class*=language-]{padding:1em;margin:.5em 0;overflow:auto;background:var(--semi-color-tertiary-light-default)}.semi-codeHighlight-defaultTheme :not(pre)>code[class*=language-]{display:block;border-radius:.3em;color:#895fe2;background:#f9f7f9}.semi-codeHighlight-defaultTheme pre .namespace{opacity:.7}.semi-codeHighlight-defaultTheme pre .token.comment,.semi-codeHighlight-defaultTheme pre .token.prolog,.semi-codeHighlight-defaultTheme pre .token.doctype,.semi-codeHighlight-defaultTheme pre .token.cdata{color:#6b7075}.semi-codeHighlight-defaultTheme pre .token.punctuation{color:rgba(var(--semi-grey-8),1)}.semi-codeHighlight-defaultTheme pre .token.property,.semi-codeHighlight-defaultTheme pre .token.tag,.semi-codeHighlight-defaultTheme pre .token.boolean,.semi-codeHighlight-defaultTheme pre .token.number,.semi-codeHighlight-defaultTheme pre .token.constant,.semi-codeHighlight-defaultTheme pre .token.symbol,.semi-codeHighlight-defaultTheme pre .token.deleted{color:rgba(var(--semi-purple-6),1)}.semi-codeHighlight-defaultTheme pre .token.selector,.semi-codeHighlight-defaultTheme pre .token.attr-name,.semi-codeHighlight-defaultTheme pre .token.string,.semi-codeHighlight-defaultTheme pre .token.char,.semi-codeHighlight-defaultTheme pre .token.builtin,.semi-codeHighlight-defaultTheme pre .token.inserted{color:rgba(var(--semi-green-6),1)}.semi-codeHighlight-defaultTheme pre .token.operator,.semi-codeHighlight-defaultTheme pre .token.entity,.semi-codeHighlight-defaultTheme pre .token.url,.semi-codeHighlight-defaultTheme pre .language-css .token.string,.semi-codeHighlight-defaultTheme pre .style .token.string{color:rgba(var(--semi-grey-8),1)}.semi-codeHighlight-defaultTheme pre .token.atrule,.semi-codeHighlight-defaultTheme pre .token.attr-value,.semi-codeHighlight-defaultTheme pre .token.keyword{color:rgba(var(--semi-purple-6),1)}.semi-codeHighlight-defaultTheme pre .token.function{color:rgba(var(--semi-violet-6),1)}.semi-codeHighlight-defaultTheme pre .token.regex,.semi-codeHighlight-defaultTheme pre .token.important,.semi-codeHighlight-defaultTheme pre .token.variable{color:#d0955f}.semi-codeHighlight-defaultTheme pre .token.important,.semi-codeHighlight-defaultTheme pre .token.bold{font-weight:700}.semi-codeHighlight-defaultTheme pre .token.italic{font-style:italic}.semi-codeHighlight-defaultTheme pre .token.entity{cursor:help}.semi-codeHighlight-defaultTheme pre[data-line]{position:relative}.semi-codeHighlight-defaultTheme pre[class*=language-]>code[class*=language-]{position:relative;z-index:1}.semi-codeHighlight-defaultTheme .line-highlight{position:absolute;left:0;right:0;padding:inherit 0;margin-top:1em;background:#ebf4ff;box-shadow:inset 5px 0 #0064d2;z-index:0;pointer-events:none;line-height:inherit;white-space:pre}.semi-codeHighlight pre[class*=language-].line-numbers{position:relative;padding-left:3.8em;counter-reset:linenumber}.semi-codeHighlight pre[class*=language-].line-numbers>code{position:relative;white-space:inherit}.semi-codeHighlight .line-numbers .line-numbers-rows{position:absolute;pointer-events:none;top:0;font-size:100%;left:-3.8em;width:3em;letter-spacing:-1px;border-right:1px solid #999;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.semi-codeHighlight .line-numbers-rows>span{display:block;counter-increment:linenumber}.semi-codeHighlight .line-numbers-rows>span:before{content:counter(linenumber);color:#999;display:block;padding-right:.8em;text-align:right}.semi-collapse-header-disabled:hover{background-color:#0000}.semi-colorPicker-colorChooseArea{box-shadow:inset 0 0 0 1px #0000000d;position:relative;flex-grow:1;border-color:#0000;border-radius:8px 8px 0 0;background-image:linear-gradient(to top,#000,#0000),linear-gradient(to right,#fff,#fff0)}.semi-colorPicker-handle{border-radius:var(--semi-border-radius-full);border:2px solid var(--semi-color-white);position:absolute;box-sizing:border-box;cursor:grab}.semi-colorPicker-alphaSlider{position:relative;cursor:pointer;margin-top:6px;border-radius:var(--semi-border-radius-full);background:url('data:image/svg+xml,')}.semi-colorPicker-alphaSlider .semi-colorPicker-alphaSliderInner{width:100%;height:100%;border-radius:4px}.semi-colorPicker-alphaSlider .semi-colorPicker-alphaHandle{background:url('data:image/svg+xml,');border-radius:var(--semi-border-radius-full);border:2px solid var(--semi-color-white);position:absolute;box-sizing:border-box;cursor:grab}.semi-colorPicker-colorSlider{position:relative;cursor:pointer;margin-top:6px;border-radius:var(--semi-border-radius-full);background:linear-gradient(to right,red,#ff0 17%,#0f0 33%,#0ff,#00f 67%,#f0f 83%,red)}.semi-colorPicker-dataPart{margin-top:8px;display:flex;align-items:center}.semi-colorPicker-dataPart .semi-colorPicker-colorDemoBlock{border-radius:4px}.semi-colorPicker-dataPart .semi-colorPicker-inputGroup{margin-left:4px;width:100%;flex:1;flex-wrap:nowrap}.semi-colorPicker-dataPart .semi-colorPicker-inputGroup .semi-colorPicker-colorPickerInput{flex:1}.semi-colorPicker-dataPart .semi-colorPicker-inputGroup .semi-colorPicker-colorPickerInputNumber{width:58px}.semi-colorPicker-dataPart .semi-colorPicker-inputGroup .semi-colorPicker-colorPickerInputNumber .semi-colorPicker-inputNumberSuffix{font-size:14px;padding:4px}.semi-colorPicker-dataPart .semi-colorPicker-formatSelect{width:80px}.semi-colorPicker-popover{padding:8px}.semi-colorPicker-popover-defaultChildren{width:24px;height:24px;border-radius:4px;cursor:pointer}.semi-cropper{position:relative}.semi-cropper img{max-width:none}.semi-cropper-img{position:absolute;-webkit-user-select:none;user-select:none}.semi-cropper-img-wrapper{position:absolute;top:0;left:0;right:0;bottom:0;overflow:hidden}.semi-cropper-mask{position:absolute;top:0;left:0;width:100%;height:100%;background:var(--semi-color-overlay-bg);cursor:move}.semi-cropper-box{position:absolute;outline:1px solid var(--semi-color-primary)}.semi-cropper-box-corner{position:absolute;background:var(--semi-color-primary);width:10px;height:10px;z-index:1}.semi-cropper-box-corner-tl{top:-5px;left:-5px;cursor:nwse-resize}.semi-cropper-box-corner-tr{top:-5px;right:-5px;cursor:nesw-resize}.semi-cropper-box-corner-tm{top:-5px;left:50%;margin-left:-5px;cursor:ns-resize}.semi-cropper-box-corner-ml{top:50%;left:-5px;margin-top:-5px;cursor:ew-resize}.semi-cropper-box-corner-mr{top:50%;right:-5px;margin-top:-5px;cursor:ew-resize}.semi-cropper-box-corner-bl{bottom:-5px;left:-5px;cursor:nesw-resize}.semi-cropper-box-corner-bm{bottom:-5px;left:50%;margin-left:-5px;cursor:ns-resize}.semi-cropper-box-corner-br{bottom:-5px;right:-5px;cursor:nwse-resize}.semi-cropper-view-box{position:absolute;overflow:hidden;cursor:move;top:0;left:0;right:0;bottom:0}.semi-cropper-view-box-round{border-radius:50%}.semi-cropper-view-img{-webkit-user-select:none;user-select:none}.semi-datepicker{box-sizing:border-box;display:inline-block}.semi-datepicker-container{display:flex}.semi-datepicker .semi-scrolllist-body .semi-scrolllist-item{-ms-overflow-style:none;scrollbar-width:none}.semi-datepicker .semi-scrolllist-body .semi-scrolllist-item::-webkit-scrollbar{display:none;width:0;height:0}.semi-datepicker .semi-scrolllist-body .semi-scrolllist-list-outer{-ms-overflow-style:none;scrollbar-width:none}.semi-datepicker .semi-scrolllist-body .semi-scrolllist-list-outer::-webkit-scrollbar{display:none;width:0;height:0}.semi-datepicker-month-grid{-webkit-user-select:none;user-select:none;display:flex}.semi-datepicker-month-grid-left,.semi-datepicker-month-grid-right{position:relative;padding:0;display:inline-flex;flex-direction:column;justify-content:flex-start}.semi-datepicker-month-grid[x-type=date] .semi-datepicker-yam,.semi-datepicker-month-grid[x-type=dateRange] .semi-datepicker-yam{height:100%}.semi-datepicker-month-grid[x-type=dateTime] .semi-datepicker-yam,.semi-datepicker-month-grid[x-type=dateTimeRange] .semi-datepicker-yam{height:calc(100% - 54px)}.semi-datepicker-month-grid .semi-datepicker-yam-showing{min-height:378px;min-width:284px}.semi-datepicker-month-grid[x-type=date] .semi-datepicker-yam-showing{min-height:325px}.semi-datepicker-month-grid[x-insetinput=true] .semi-datepicker-month-grid-left[x-open-type=year],.semi-datepicker-month-grid[x-insetinput=true] .semi-datepicker-month-grid-right[x-open-type=year],.semi-datepicker-month-grid[x-insetinput=true] .semi-datepicker-month-grid-left[x-open-type=time],.semi-datepicker-month-grid[x-insetinput=true] .semi-datepicker-month-grid-right[x-open-type=time]{min-height:317px}.semi-datepicker-month-grid[x-insetinput=true] .semi-datepicker-navigation{padding-top:8px;padding-bottom:8px}.semi-datepicker-month-grid[x-insetinput=true] .semi-datepicker-tpk{min-height:100%}.semi-datepicker-month-grid[x-insetinput=true][x-type=dateTime] .semi-datepicker-yam,.semi-datepicker-month-grid[x-insetinput=true][x-type=dateTimeRange] .semi-datepicker-yam{height:100%}.semi-datepicker-month-grid[x-preset-position=left][x-insetinput=false] .semi-datepicker-month,.semi-datepicker-month-grid[x-preset-position=right][x-insetinput=false] .semi-datepicker-month{height:253px}.semi-datepicker-month-grid .semi-datepicker-yearmonth-header{background:var(--semi-color-bg-3);padding:12px 16px;border-bottom:1px solid var(--semi-color-border);border-radius:var(--semi-border-radius-medium) var(--semi-border-radius-medium) 0 0;display:flex;align-items:center}.semi-datepicker-month-grid .semi-scrolllist{background:var(--semi-color-bg-3);position:relative;box-shadow:none;height:auto;width:100%;height:100%;overflow:hidden;flex:1}.semi-datepicker-month-grid .semi-scrolllist-header,.semi-datepicker-month-grid .semi-scrolllist-body{box-sizing:border-box;width:100%}.semi-datepicker-month-grid .semi-scrolllist-header{border-bottom:1px solid var(--semi-color-border);padding:16px}.semi-datepicker-month-grid .semi-scrolllist-body{height:100%;overflow:hidden;padding:0;flex:1}.semi-datepicker-month-grid .semi-scrolllist-line{display:none}.semi-datepicker-month-grid .semi-scrolllist-header-title{padding:0;font-size:14px;line-height:20px;font-family:Inter,-apple-system,BlinkMacSystemFont,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Segoe UI,Helvetica Neue,Helvetica,Arial,sans-serif;min-height:24px;line-height:24px}.semi-datepicker-month-grid[x-panel-yearandmonth-open-type=left] .semi-datepicker-weeks,.semi-datepicker-month-grid[x-panel-yearandmonth-open-type=right] .semi-datepicker-weeks{min-height:216px}.semi-datepicker-panel-yam{max-width:484px}.semi-datepicker-panel-yam[x-type=monthRange]{max-width:584px}.semi-datepicker-panel-yam .semi-datepicker-yearmonth-body{display:flex}.semi-datepicker-panel-yam .semi-datepicker-yearmonth-body .semi-scrolllist:nth-child(2){border-left:1px solid var(--semi-color-border)}.semi-datepicker-panel-yam .semi-scrolllist{box-shadow:none;height:266px}.semi-datepicker-panel-yam .semi-scrolllist-list-outer>ul>li{min-width:64px}.semi-datepicker-panel-yam .semi-scrolllist-item>ul>li{min-width:82px}.semi-datepicker-panel-yam .semi-scrolllist-body{padding:0;overflow:hidden}.semi-datepicker-panel-yam .semi-scrolllist-body .semi-scrolllist-item-wheel:not(#neverExistElement){border:none}.semi-datepicker-footer{padding-top:10px;padding-right:8px;padding-bottom:10px;text-align:right;background-color:var(--semi-color-fill-0)}.semi-datepicker-footer .semi-button:first-of-type{margin-right:12px}.semi-datepicker-footer .semi-button:nth-of-type(2){margin-right:8px}.semi-datepicker-yam{position:absolute;top:0;width:100%;display:flex;flex-direction:column;box-sizing:border-box}.semi-datepicker-tpk{position:absolute;top:0;height:calc(100% - 54px);width:100%;display:flex;flex-direction:column}.semi-datepicker-tpk .semi-datepicker-time{height:100%}.semi-datepicker-navigation{display:flex;align-items:center;box-sizing:content-box;height:32px;padding:12px 16px}.semi-datepicker-navigation-left,.semi-datepicker-navigation-right{width:32px;height:32px;display:flex;justify-content:center;align-items:center}.semi-datepicker-navigation .semi-button{color:var(--semi-color-text-2);min-width:32px}.semi-datepicker-navigation-month{font-size:16px;line-height:22px;font-family:Inter,-apple-system,BlinkMacSystemFont,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Segoe UI,Helvetica Neue,Helvetica,Arial,sans-serif;flex-grow:1;text-align:center;font-weight:600;color:var(--semi-color-text-0)}.semi-datepicker-navigation-month .semi-button{color:var(--semi-color-text-0)}.semi-datepicker-month{width:252px;box-sizing:content-box;padding:0 16px 16px}.semi-datepicker-weekday{font-size:12px;line-height:16px;font-family:Inter,-apple-system,BlinkMacSystemFont,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Segoe UI,Helvetica Neue,Helvetica,Arial,sans-serif;font-weight:600;color:var(--semi-color-text-2);border-bottom:1px solid var(--semi-color-border)}.semi-datepicker-weekday-item{width:36px;height:36px;line-height:36px;text-align:center;display:inline-block}.semi-datepicker-weeks{color:var(--semi-color-text-0)}.semi-datepicker-week{display:flex;align-items:center}.semi-datepicker-day{box-sizing:border-box;display:inline-block;width:36px;height:36px;display:flex;justify-content:center;align-items:center;cursor:pointer}.semi-datepicker-day-main{display:flex;justify-content:center;align-items:center;width:32px;height:32px;margin:0 auto;box-sizing:border-box;border-radius:var(--semi-border-radius-small)}.semi-datepicker-day-main:hover{background-color:var(--semi-color-fill-0)}.semi-datepicker-day-main:active{background-color:var(--semi-color-fill-1)}.semi-datepicker-day-today .semi-datepicker-day-main{color:var(--semi-color-primary);background-color:var(--semi-color-fill-0);font-weight:600}.semi-datepicker-day-today.semi-datepicker-day-disabled .semi-datepicker-day-main{color:var(--semi-color-primary-disabled)}.semi-datepicker-day-inrange .semi-datepicker-day-main,.semi-datepicker-day-inhover .semi-datepicker-day-main,.semi-datepicker-day-inoffsetrange .semi-datepicker-day-main,.semi-datepicker-day-hoverday .semi-datepicker-day-main,.semi-datepicker-day-selectedrange-hover .semi-datepicker-day-main,.semi-datepicker-day-hoverday-around-singleselected .semi-datepicker-day-main{border-radius:0;margin-left:0;margin-right:0;width:36px}.semi-datepicker-day-selected .semi-datepicker-day-main,.semi-datepicker-day-selected-start.semi-datepicker-day-selected-end .semi-datepicker-day-main,.semi-datepicker-day-offsetrange-start.semi-datepicker-day-offsetrange-end .semi-datepicker-day-main{border-radius:var(--semi-border-radius-small)}.semi-datepicker-day-offsetrange-start .semi-datepicker-day-main{border-radius:var(--semi-border-radius-small) 0 0 var(--semi-border-radius-small)}.semi-datepicker-day-offsetrange-end .semi-datepicker-day-main{border-radius:0 var(--semi-border-radius-small) var(--semi-border-radius-small) 0}.semi-datepicker-day-hoverday-beforerange .semi-datepicker-day-main{border-radius:var(--semi-border-radius-small) 0 0 var(--semi-border-radius-small)}.semi-datepicker-day-hoverday-afterrange .semi-datepicker-day-main{border-radius:0 var(--semi-border-radius-small) var(--semi-border-radius-small) 0}.semi-datepicker-day-selected-start .semi-datepicker-day-main,.semi-datepicker-day-offsetrange-start .semi-datepicker-day-main{width:34px;margin-left:2px;margin-right:0;border-radius:var(--semi-border-radius-small) 0 0 var(--semi-border-radius-small)}.semi-datepicker-day-selected-end .semi-datepicker-day-main,.semi-datepicker-day-offsetrange-end .semi-datepicker-day-main{width:34px;margin-right:2px;margin-left:0;border-radius:0 var(--semi-border-radius-small) var(--semi-border-radius-small) 0}.semi-datepicker-day-hoverday-inrange .semi-datepicker-day-main{border-radius:0}.semi-datepicker-day-inoffsetrange .semi-datepicker-day-main,.semi-datepicker-day-offsetrange-start .semi-datepicker-day-main,.semi-datepicker-day-offsetrange-end .semi-datepicker-day-main{background-color:var(--semi-color-fill-0)}.semi-datepicker-day-hoverday .semi-datepicker-day-main,.semi-datepicker-day-hoverday-offset .semi-datepicker-day-main{background-color:var(--semi-color-fill-1)}.semi-datepicker-day-inrange .semi-datepicker-day-main,.semi-datepicker-day-inhover .semi-datepicker-day-main{background-color:var(--semi-color-primary-light-default)}.semi-datepicker-day-hoverday-inrange .semi-datepicker-day-main,.semi-datepicker-day-hoverday-beforerange .semi-datepicker-day-main,.semi-datepicker-day-hoverday-afterrange .semi-datepicker-day-main,.semi-datepicker-day-hoverday-around-singleselected .semi-datepicker-day-main{background-color:var(--semi-color-primary-light-active)}.semi-datepicker-day-selected .semi-datepicker-day-main,.semi-datepicker-day-selected-start .semi-datepicker-day-main,.semi-datepicker-day-selected-end .semi-datepicker-day-main{background-color:var(--semi-color-primary);color:var(--semi-color-white)}.semi-datepicker-day-selected .semi-datepicker-day-main:hover,.semi-datepicker-day-selected-start .semi-datepicker-day-main:hover,.semi-datepicker-day-selected-end .semi-datepicker-day-main:hover{background-color:var(--semi-color-primary)}.semi-datepicker-day-selectedrange-hover .semi-datepicker-day-main{background-color:var(--semi-color-primary-light-hover)}.semi-datepicker-day-selected-start-afterhover .semi-datepicker-day-main,.semi-datepicker-day-selected-end-beforehover .semi-datepicker-day-main{border:1px solid var(--semi-color-primary-active)}.semi-datepicker-day-disabled{cursor:not-allowed;color:var(--semi-color-disabled-text)}.semi-datepicker-day-disabled .semi-datepicker-day-main:hover,.semi-datepicker-day-disabled .semi-datepicker-day-main:active{background-color:#0000}.semi-datepicker-day-disabled.semi-datepicker-day-selected .semi-datepicker-day-main,.semi-datepicker-day-disabled.semi-datepicker-day-selected-start .semi-datepicker-day-main,.semi-datepicker-day-disabled.semi-datepicker-day-selected-end .semi-datepicker-day-main,.semi-datepicker-day-disabled.semi-datepicker-day-inhover .semi-datepicker-day-main,.semi-datepicker-day-disabled.semi-datepicker-day-inrange .semi-datepicker-day-main,.semi-datepicker-day-disabled.semi-datepicker-day-inoffsetrange .semi-datepicker-day-main,.semi-datepicker-day-disabled.semi-datepicker-day-hoverday .semi-datepicker-day-main,.semi-datepicker-day-disabled.semi-datepicker-day-hoverday-offset .semi-datepicker-day-main,.semi-datepicker-day-disabled.semi-datepicker-day-offsetrange-start .semi-datepicker-day-main,.semi-datepicker-day-disabled.semi-datepicker-day-offsetrange-end .semi-datepicker-day-main,.semi-datepicker-day-disabled.semi-datepicker-day-selectedrange-hover .semi-datepicker-day-main{background-color:var(--semi-color-disabled-fill);color:var(--semi-color-disabled-text)}.semi-datepicker-switch{text-align:center;display:flex;border-top:1px solid var(--semi-color-border);margin-top:auto}.semi-datepicker-switch-date,.semi-datepicker-switch-time{width:50%;cursor:pointer;padding-top:16px;padding-bottom:16px;display:flex;justify-content:center;align-items:center;color:var(--semi-color-text-2)}.semi-datepicker-switch-date:not(.semi-datepicker-switch-time-disabled):hover,.semi-datepicker-switch-time:not(.semi-datepicker-switch-time-disabled):hover{background-color:var(--semi-color-fill-0)}.semi-datepicker-switch-date-active,.semi-datepicker-switch-time-active{color:var(--semi-color-text-0);font-weight:600;cursor:auto}.semi-datepicker-switch-date-active:hover,.semi-datepicker-switch-time-active:hover{background-color:inherit}.semi-datepicker-switch-date-disabled,.semi-datepicker-switch-time-disabled{cursor:not-allowed}.semi-datepicker-switch-text{padding-left:8px}.semi-datepicker-time .semi-jumperlist{box-shadow:none;border-radius:0}.semi-datepicker-quick-control{box-sizing:border-box;background-color:#0000}.semi-datepicker-quick-control-header{padding:18px 12px 0;font-weight:600}.semi-datepicker-quick-control-left{border-right:1px solid var(--semi-color-border)}.semi-datepicker-quick-control-right{border-left:1px solid var(--semi-color-border)}.semi-datepicker-quick-control-top{border-bottom:1px solid var(--semi-color-border)}.semi-datepicker-quick-control-bottom{border-top:1px solid var(--semi-color-border)}.semi-datepicker-quick-control-left-content-wrapper,.semi-datepicker-quick-control-right-content-wrapper{max-width:200px;margin-top:14px;overflow-y:auto}.semi-datepicker-quick-control-top-content-wrapper,.semi-datepicker-quick-control-bottom-content-wrapper{overflow-y:auto;max-height:100px}.semi-datepicker-quick-control-left-content,.semi-datepicker-quick-control-right-content{box-sizing:border-box;display:grid;align-content:flex-start;grid-gap:8px;grid-template-columns:repeat(2,minmax(76.5px,84px));padding:0 12px 12px}.semi-datepicker-quick-control-left-content-item,.semi-datepicker-quick-control-right-content-item{max-width:84px}.semi-datepicker-quick-control-left-content-item-ellipsis,.semi-datepicker-quick-control-right-content-item-ellipsis{width:68px;color:var(--semi-color-primary)}.semi-datepicker-quick-control-top-content,.semi-datepicker-quick-control-bottom-content{display:grid;grid-gap:8px;grid-template-columns:repeat(3,minmax(70.924px,75.924px));align-content:flex-start;padding:8px 20px}.semi-datepicker-quick-control-top-content-item,.semi-datepicker-quick-control-bottom-content-item{max-width:75.924px}.semi-datepicker-quick-control-top-content-item-ellipsis,.semi-datepicker-quick-control-bottom-content-item-ellipsis{width:59.924px;color:var(--semi-color-primary)}.semi-datepicker-quick-control-top-range-content,.semi-datepicker-quick-control-bottom-range-content{box-sizing:border-box;display:grid;align-content:flex-start;grid-template-columns:repeat(5,minmax(96.2px,99.2px));grid-gap:8px;padding:8px 20px}.semi-datepicker-quick-control-top-range-content-item,.semi-datepicker-quick-control-bottom-range-content-item{max-width:99.2px}.semi-datepicker-quick-control-top-range-content-item-ellipsis,.semi-datepicker-quick-control-bottom-range-content-item-ellipsis{width:83.2px;color:var(--semi-color-primary)}.semi-datepicker-quick-control-top-month-content,.semi-datepicker-quick-control-bottom-month-content{box-sizing:border-box;display:grid;grid-template-columns:repeat(2,minmax(51px,58.5px));grid-gap:8px;align-content:flex-start;padding:8px 20px}.semi-datepicker-quick-control-top-month-content-item,.semi-datepicker-quick-control-bottom-month-content-item{max-width:58.5px}.semi-datepicker-quick-control-top-month-content-item-ellipsis,.semi-datepicker-quick-control-bottom-month-content-item-ellipsis{max-width:42.5px;color:var(--semi-color-primary)}.semi-datepicker-quick-control-month{max-width:284px}.semi-datepicker-quick-control-month[x-insetinput=true] .semi-datepicker-quick-control-right-content-wrapper,.semi-datepicker-quick-control-month[x-insetinput=true] .semi-datepicker-quick-control-left-content-wrapper{max-height:258px}.semi-datepicker-quick-control-month .semi-datepicker-quick-control-right-content-wrapper,.semi-datepicker-quick-control-month .semi-datepicker-quick-control-left-content-wrapper{max-height:214px}.semi-datepicker-quick-control-date{max-width:284px}.semi-datepicker-quick-control-date[x-insetinput=true] .semi-datepicker-quick-control-right-content-wrapper,.semi-datepicker-quick-control-date[x-insetinput=true] .semi-datepicker-quick-control-left-content-wrapper{max-height:309px}.semi-datepicker-quick-control-date .semi-datepicker-quick-control-right-content-wrapper,.semi-datepicker-quick-control-date .semi-datepicker-quick-control-left-content-wrapper{max-height:273px}.semi-datepicker-quick-control-dateTime{max-width:284px}.semi-datepicker-quick-control-dateTime[x-insetinput=true] .semi-datepicker-quick-control-right-content-wrapper,.semi-datepicker-quick-control-dateTime[x-insetinput=true] .semi-datepicker-quick-control-left-content-wrapper{max-height:309px}.semi-datepicker-quick-control-dateTime .semi-datepicker-quick-control-right-content-wrapper,.semi-datepicker-quick-control-dateTime .semi-datepicker-quick-control-left-content-wrapper{max-height:326px}.semi-datepicker-quick-control-dateRange{max-width:568px}.semi-datepicker-quick-control-dateRange[x-insetinput=true] .semi-datepicker-quick-control-right-content-wrapper,.semi-datepicker-quick-control-dateRange[x-insetinput=true] .semi-datepicker-quick-control-left-content-wrapper{max-height:309px}.semi-datepicker-quick-control-dateRange .semi-datepicker-quick-control-right-content-wrapper,.semi-datepicker-quick-control-dateRange .semi-datepicker-quick-control-left-content-wrapper{max-height:273px}.semi-datepicker-quick-control-dateTimeRange{max-width:568px}.semi-datepicker-quick-control-dateTimeRange[x-insetinput=true] .semi-datepicker-quick-control-right-content-wrapper,.semi-datepicker-quick-control-dateTimeRange[x-insetinput=true] .semi-datepicker-quick-control-left-content-wrapper{max-height:309px}.semi-datepicker-quick-control-dateTimeRange .semi-datepicker-quick-control-right-content-wrapper,.semi-datepicker-quick-control-dateTimeRange .semi-datepicker-quick-control-left-content-wrapper{max-height:326px}.semi-datepicker-topSlot{border-bottom:1px solid var(--semi-color-border)}.semi-datepicker-leftSlot{border-right:1px solid var(--semi-color-border)}.semi-datepicker-rightSlot{border-left:1px solid var(--semi-color-border)}.semi-datepicker-bottomSlot{border-top:1px solid var(--semi-color-border)}.semi-datepicker .semi-popover-trigger{width:100%}.semi-datepicker .semi-popover-trigger .semi-input-wrapper{font-size:13px}.semi-datepicker .semi-popover-trigger .semi-input-suffix{color:var(--semi-color-primary)}.semi-datepicker .semi-datepicker-input-readonly{cursor:pointer}.semi-datepicker-inset-input-wrapper{display:flex;flex-wrap:nowrap;justify-content:space-between;box-sizing:border-box;column-gap:8px;padding:12px 16px 0;width:284px}.semi-datepicker-inset-input-wrapper[x-type=dateRange],.semi-datepicker-inset-input-wrapper[x-type=dateTimeRange]{width:568px}.semi-datepicker-inset-input-wrapper[x-type=month]{width:165px}.semi-datepicker-inset-input-wrapper[x-type=monthRange]{width:331px}.semi-datepicker-inset-input-wrapper .semi-input-wrapper{flex:1;flex-shrink:0}.semi-datepicker-inset-input-separator{flex-grow:0;flex-shrink:0;height:32px;line-height:32px;padding:0 4px;color:var(--semi-color-text-3)}.semi-datepicker-range-input{display:flex;align-items:center;box-sizing:border-box;border-radius:var(--semi-border-radius-small);height:32px;color:var(--semi-color-text-2);background-color:var(--semi-color-fill-0);border:0px solid rgba(0,0,0,0)}.semi-datepicker-range-input:hover,.semi-datepicker-range-input:active{border-color:#0000}.semi-datepicker-range-input:focus-within{border-color:#0000}.semi-datepicker-range-input .semi-datepicker-monthRange-input{background-color:#0000}.semi-datepicker-range-input-wrapper{box-sizing:border-box;background-color:#0000;padding:0 8px;height:100%;width:100%;border:1px solid rgba(0,0,0,0);border-radius:var(--semi-border-radius-small);display:flex;align-items:center}.semi-datepicker-range-input-wrapper .semi-input-wrapper{background-color:#0000;height:fit-content;border:none}.semi-datepicker-range-input-wrapper .semi-input-wrapper:active:not(#neverExistElement){background-color:#0000}.semi-datepicker-range-input-wrapper .semi-input-wrapper:hover:not(#neverExistElement){background-color:#0000}.semi-datepicker-range-input-wrapper-focus{border-color:#0000;background-color:var(--semi-color-fill-1);border-radius:var(--semi-border-radius-small);transition:background-color .16s ease-in-out}.semi-datepicker-range-input-wrapper-focus~.semi-datepicker-range-input-clearbtn{display:flex}.semi-datepicker-range-input-wrapper-focus~.semi-datepicker-range-input-clearbtn~.semi-datepicker-range-input-suffix{display:none}.semi-datepicker-range-input-wrapper .semi-input{padding:2px 4px}.semi-datepicker-range-input-wrapper-icon{flex-shrink:0}.semi-datepicker-range-input-wrapper:hover{background-color:var(--semi-color-fill-1)}.semi-datepicker-range-input-wrapper-start{border-top-right-radius:0;border-bottom-right-radius:0}.semi-datepicker-range-input-wrapper-start-with-prefix,.semi-datepicker-range-input-wrapper-end{border-radius:0}.semi-datepicker-range-input-wrapper-active{border-color:var(--semi-color-focus-border);background-color:var(--semi-color-fill-1)}.semi-datepicker-range-input-separator{display:flex;align-items:center}.semi-datepicker-range-input-separator-active{color:var(--semi-color-text-0)}.semi-datepicker-range-input-small{height:24px}.semi-datepicker-range-input-large{height:40px}.semi-datepicker-range-input-large .semi-input-default{font-size:16px}.semi-datepicker-range-input:hover .semi-datepicker-range-input-clearbtn{display:flex;cursor:pointer}.semi-datepicker-range-input:hover .semi-datepicker-range-input-clearbtn~.semi-datepicker-range-input-suffix{display:none}.semi-datepicker-range-input:hover .semi-datepicker-range-input-clearbtn:hover{color:var(--semi-color-primary-hover)}.semi-datepicker-range-input-disabled{cursor:not-allowed;color:var(--semi-color-disabled-text);background-color:var(--semi-color-disabled-fill)}.semi-datepicker-range-input-disabled .semi-datepicker-range-input-wrapper:hover{background-color:#0000}.semi-datepicker-range-input-disabled:hover{background-color:var(--semi-color-disabled-fill)}.semi-datepicker-range-input-disabled .semi-datepicker-range-input-prefix,.semi-datepicker-range-input-disabled .semi-datepicker-range-input-suffix,.semi-datepicker-range-input-disabled .semi-datepicker-range-input-clearbtn{color:var(--semi-color-disabled-text)}.semi-datepicker-range-input-warning{background-color:var(--semi-color-warning-light-default)}.semi-datepicker-range-input-warning .semi-datepicker-range-input-wrapper:hover{background-color:var(--semi-color-warning-light-hover)}.semi-datepicker-range-input-warning .semi-datepicker-range-input-wrapper-active{border-color:var(--semi-color-warning);background-color:var(--semi-color-warning-light-hover)}.semi-datepicker-range-input-error{background-color:var(--semi-color-danger-light-default)}.semi-datepicker-range-input-error .semi-datepicker-range-input-wrapper:hover{background-color:var(--semi-color-danger-light-hover)}.semi-datepicker-range-input-error .semi-datepicker-range-input-wrapper-active{border-color:var(--semi-color-danger);background-color:var(--semi-color-danger-light-hover)}.semi-datepicker-range-input .semi-datepicker-range-input-clearbtn{display:none}.semi-datepicker-range-input-prefix,.semi-datepicker-range-input-suffix,.semi-datepicker-range-input-clearbtn{display:flex;align-items:center;justify-content:center;font-weight:600;font-size:14px;line-height:20px;font-family:Inter,-apple-system,BlinkMacSystemFont,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Segoe UI,Helvetica Neue,Helvetica,Arial,sans-serif;white-space:nowrap;color:var(--semi-color-text-2)}.semi-datepicker-range-input-prefix{padding-left:12px;padding-right:8px}.semi-datepicker-range-input-suffix{padding-left:8px;padding-right:12px}.semi-datepicker-range-input-suffix-hidden{display:none}.semi-datepicker-range-input-clearbtn{padding-left:8px;padding-right:12px}.semi-datepicker-compact{font-size:12px;line-height:16px;font-family:Inter,-apple-system,BlinkMacSystemFont,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Segoe UI,Helvetica Neue,Helvetica,Arial,sans-serif;line-height:20px;display:inline-block;max-width:calc(100vw - 32px)}.semi-datepicker-compact:not(.semi-datepicker-compact-insetInput){width:max-content}.semi-datepicker-compact .semi-datepicker-container,.semi-datepicker-compact .semi-datepicker-month-grid{width:max-content}.semi-datepicker-compact .semi-datepicker-month-grid .semi-datepicker-month-grid-left,.semi-datepicker-compact .semi-datepicker-month-grid .semi-datepicker-month-grid-right{min-width:216px;max-width:calc(100vw - 32px)}.semi-datepicker-compact .semi-datepicker-month-grid .semi-datepicker-month{margin-left:auto;margin-right:auto}.semi-datepicker-compact .semi-datepicker-month-grid[x-type=dateTime] .semi-datepicker-yam,.semi-datepicker-compact .semi-datepicker-month-grid[x-type=dateTimeRange] .semi-datepicker-yam{height:calc(100% - 32px)}.semi-datepicker-compact .semi-datepicker-month-grid .semi-datepicker-yam{position:relative;width:100%;max-width:100%;max-height:256px;overflow-x:auto;overflow-y:hidden}.semi-datepicker-compact .semi-datepicker-month-grid[x-type=dateRange] .semi-datepicker-month-grid-left,.semi-datepicker-compact .semi-datepicker-month-grid[x-type=dateTimeRange] .semi-datepicker-month-grid-left{border-right:1px solid var(--semi-color-border)}.semi-datepicker-compact .semi-datepicker-month-grid .semi-datepicker-yam-showing{min-height:288px;min-width:216px}.semi-datepicker-compact .semi-datepicker-month-grid[x-type=date] .semi-datepicker-yam-showing{min-height:256px}.semi-datepicker-compact .semi-datepicker-month-grid[x-preset-position=left][x-insetinput=false] .semi-datepicker-month,.semi-datepicker-compact .semi-datepicker-month-grid[x-preset-position=right][x-insetinput=false] .semi-datepicker-month{height:220px}.semi-datepicker-compact .semi-datepicker-month-grid .semi-datepicker-yearmonth-header{box-sizing:border-box;height:48px;padding:12px;width:100%;max-width:100%}.semi-datepicker-compact .semi-datepicker-month-grid .semi-datepicker-yearmonth-header button,.semi-datepicker-compact .semi-datepicker-month-grid .semi-datepicker-yearmonth-header .semi-button{width:100%;max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.semi-datepicker-compact .semi-datepicker-month-grid .semi-datepicker-yearmonth-body{display:flex}.semi-datepicker-compact .semi-datepicker-month-grid .semi-datepicker-yearmonth-body .semi-scrolllist:nth-child(2){border:1px solid var(--semi-color-border)}.semi-datepicker-compact .semi-datepicker-month-grid .semi-scrolllist{font-size:12px;line-height:16px;font-family:Inter,-apple-system,BlinkMacSystemFont,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Segoe UI,Helvetica Neue,Helvetica,Arial,sans-serif;line-height:20px}.semi-datepicker-compact .semi-datepicker-month-grid .semi-scrolllist-header{display:none}.semi-datepicker-compact .semi-datepicker-month-grid .semi-scrolllist-list-outer>ul>li{height:32px}.semi-datepicker-compact .semi-datepicker-month-grid .semi-scrolllist-item-wheel{border-right:0}.semi-datepicker-compact .semi-datepicker-month-grid .semi-scrolllist-item-wheel .semi-scrolllist-selector{height:32px}.semi-datepicker-compact .semi-datepicker-month-grid .semi-scrolllist-item-wheel .semi-scrolllist-shade-pre{margin-top:-17px}.semi-datepicker-compact .semi-datepicker-month-grid .semi-scrolllist-item-wheel .semi-scrolllist-shade-post{margin-top:17px}.semi-datepicker-compact .semi-datepicker-month-grid[x-panel-yearandmonth-open-type=left] .semi-datepicker-weeks,.semi-datepicker-compact .semi-datepicker-month-grid[x-panel-yearandmonth-open-type=right] .semi-datepicker-weeks{min-height:168px}.semi-datepicker-compact .semi-datepicker-month-grid[x-insetinput=true] .semi-datepicker-month-grid-left[x-open-type=year],.semi-datepicker-compact .semi-datepicker-month-grid[x-insetinput=true] .semi-datepicker-month-grid-right[x-open-type=year],.semi-datepicker-compact .semi-datepicker-month-grid[x-insetinput=true] .semi-datepicker-month-grid-left[x-open-type=time],.semi-datepicker-compact .semi-datepicker-month-grid[x-insetinput=true] .semi-datepicker-month-grid-right[x-open-type=time],.semi-datepicker-compact .semi-datepicker-month-grid[x-insetinput=true] .semi-datepicker-yam-showing{min-height:256px}.semi-datepicker-compact .semi-datepicker-month-grid[x-insetinput=true] .semi-datepicker-tpk{min-height:100%}.semi-datepicker-compact .semi-datepicker-month-grid[x-insetinput=true][x-type=dateTime] .semi-datepicker-yam,.semi-datepicker-compact .semi-datepicker-month-grid[x-insetinput=true][x-type=dateTimeRange] .semi-datepicker-yam{height:100%}.semi-datepicker-compact.semi-datepicker-panel-yam .semi-scrolllist{font-size:12px;line-height:16px;font-family:Inter,-apple-system,BlinkMacSystemFont,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Segoe UI,Helvetica Neue,Helvetica,Arial,sans-serif;line-height:20px}.semi-datepicker-compact .semi-datepicker-tpk{height:calc(100% - 32px)}.semi-datepicker-compact .semi-datepicker-navigation{box-sizing:border-box;height:24px;padding:12px 12px 0;width:100%;max-width:100%}.semi-datepicker-compact .semi-datepicker-navigation-left,.semi-datepicker-compact .semi-datepicker-navigation-right{width:24px;height:24px}.semi-datepicker-compact .semi-datepicker-navigation .semi-button{min-width:24px;min-height:24px}.semi-datepicker-compact .semi-datepicker-navigation-month{min-width:0;overflow:hidden}.semi-datepicker-compact .semi-datepicker-navigation-month .semi-button{font-size:12px;line-height:16px;font-family:Inter,-apple-system,BlinkMacSystemFont,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Segoe UI,Helvetica Neue,Helvetica,Arial,sans-serif;line-height:20px;max-width:100%}.semi-datepicker-compact .semi-datepicker-navigation-month .semi-button>span{display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.semi-datepicker-compact .semi-datepicker-month{width:216px;padding:0}.semi-datepicker-compact .semi-datepicker-weeks{padding:6px 10px 10px}.semi-datepicker-compact .semi-datepicker-weekday{box-sizing:border-box;height:36px;padding-left:10px;padding-right:10px;padding-bottom:8px;border-bottom:1px solid var(--semi-color-border)}.semi-datepicker-compact .semi-datepicker-weekday-item{width:28px;height:28px;line-height:28px}.semi-datepicker-compact .semi-datepicker-day{width:28px;height:28px}.semi-datepicker-compact .semi-datepicker-day-main{width:24px;height:24px}.semi-datepicker-compact .semi-datepicker-day-inrange .semi-datepicker-day-main,.semi-datepicker-compact .semi-datepicker-day-inhover .semi-datepicker-day-main,.semi-datepicker-compact .semi-datepicker-day-inoffsetrange .semi-datepicker-day-main,.semi-datepicker-compact .semi-datepicker-day-hoverday .semi-datepicker-day-main,.semi-datepicker-compact .semi-datepicker-day-selectedrange-hover .semi-datepicker-day-main{width:28px}.semi-datepicker-compact .semi-datepicker-day-selected-start.semi-datepicker-day-selected-end .semi-datepicker-day-main,.semi-datepicker-compact .semi-datepicker-day-offsetrange-start.semi-datepicker-day-offsetrange-end .semi-datepicker-day-main{border-radius:4px}.semi-datepicker-compact .semi-datepicker-day-offsetrange-start .semi-datepicker-day-main{border-radius:4px 0 0 4px}.semi-datepicker-compact .semi-datepicker-day-offsetrange-end .semi-datepicker-day-main{border-radius:0 4px 4px 0}.semi-datepicker-compact .semi-datepicker-day-hoverday-beforerange .semi-datepicker-day-main{border-radius:4px 0 0 4px}.semi-datepicker-compact .semi-datepicker-day-hoverday-afterrange .semi-datepicker-day-main{border-radius:0 4px 4px 0}.semi-datepicker-compact .semi-datepicker-day-selected-start .semi-datepicker-day-main,.semi-datepicker-compact .semi-datepicker-day-offsetrange-start .semi-datepicker-day-main{width:34px;margin-left:2px;margin-right:0;border-radius:4px 0 0 4px}.semi-datepicker-compact .semi-datepicker-day-selected-end .semi-datepicker-day-main,.semi-datepicker-compact .semi-datepicker-day-offsetrange-end .semi-datepicker-day-main{width:34px;margin-right:2px;margin-left:0;border-radius:0 4px 4px 0}.semi-datepicker-compact .semi-datepicker-switch{box-sizing:border-box;height:32px}.semi-datepicker-compact .semi-datepicker-switch-date,.semi-datepicker-compact .semi-datepicker-switch-time{padding-top:6px;padding-bottom:6px}.semi-datepicker-compact .semi-datepicker-switch-date{border-right:1px solid var(--semi-color-border)}.semi-datepicker-compact .semi-datepicker-switch-text{padding-left:0}.semi-datepicker-compact .semi-datepicker-quick-control-header{padding:16px 12px 0;font-weight:600}.semi-datepicker-compact .semi-datepicker-quick-control-left-content-wrapper,.semi-datepicker-compact .semi-datepicker-quick-control-right-content-wrapper{margin-top:12px}.semi-datepicker-compact .semi-datepicker-quick-control-left-content,.semi-datepicker-compact .semi-datepicker-quick-control-right-content{box-sizing:border-box;display:grid;align-content:flex-start;grid-gap:8px;grid-template-columns:repeat(2,minmax(76.5px,84px));padding:0 12px 12px}.semi-datepicker-compact .semi-datepicker-quick-control-left-content-item,.semi-datepicker-compact .semi-datepicker-quick-control-right-content-item{max-width:84px}.semi-datepicker-compact .semi-datepicker-quick-control-left-content-item-ellipsis,.semi-datepicker-compact .semi-datepicker-quick-control-right-content-item-ellipsis{width:68px;font-size:12px;color:var(--semi-color-primary)}.semi-datepicker-compact .semi-datepicker-quick-control-top-content,.semi-datepicker-compact .semi-datepicker-quick-control-bottom-content{box-sizing:border-box;display:grid;grid-gap:8px;grid-template-columns:repeat(3,minmax(54.94px,59.94px));align-content:flex-start;padding:8px 10px}.semi-datepicker-compact .semi-datepicker-quick-control-top-content-item,.semi-datepicker-compact .semi-datepicker-quick-control-bottom-content-item{max-width:59.94px}.semi-datepicker-compact .semi-datepicker-quick-control-top-content-item-ellipsis,.semi-datepicker-compact .semi-datepicker-quick-control-bottom-content-item-ellipsis{width:43.94px;font-size:12px;color:var(--semi-color-primary)}.semi-datepicker-compact .semi-datepicker-quick-control-top-range-content,.semi-datepicker-compact .semi-datepicker-quick-control-bottom-range-content{display:grid;grid-template-columns:repeat(5,minmax(73px,76px));grid-gap:8px;align-content:flex-start;padding:8px 10px}.semi-datepicker-compact .semi-datepicker-quick-control-top-range-content-item,.semi-datepicker-compact .semi-datepicker-quick-control-bottom-range-content-item{max-width:76px}.semi-datepicker-compact .semi-datepicker-quick-control-top-range-content-item-ellipsis,.semi-datepicker-compact .semi-datepicker-quick-control-bottom-range-content-item-ellipsis{width:60px;font-size:12px;color:var(--semi-color-primary)}.semi-datepicker-compact .semi-datepicker-quick-control-top-month-content,.semi-datepicker-compact .semi-datepicker-quick-control-bottom-month-content{display:grid;grid-template-columns:repeat(2,minmax(61px,68.5px));grid-gap:8px;align-content:flex-start;padding:8px 10px}.semi-datepicker-compact .semi-datepicker-quick-control-top-month-content-item,.semi-datepicker-compact .semi-datepicker-quick-control-bottom-month-content-item{max-width:68.5px}.semi-datepicker-compact .semi-datepicker-quick-control-top-month-content-item-ellipsis,.semi-datepicker-compact .semi-datepicker-quick-control-bottom-month-content-item-ellipsis{max-width:52.5px;font-size:12px;color:var(--semi-color-primary)}.semi-datepicker-compact .semi-datepicker-quick-control-month{min-width:216px;width:max-content;max-width:calc(100vw - 32px)}.semi-datepicker-compact .semi-datepicker-quick-control-month[x-insetinput=true] .semi-datepicker-quick-control-right-content-wrapper,.semi-datepicker-compact .semi-datepicker-quick-control-month[x-insetinput=true] .semi-datepicker-quick-control-left-content-wrapper{max-height:254px}.semi-datepicker-compact .semi-datepicker-quick-control-month .semi-datepicker-quick-control-right-content-wrapper,.semi-datepicker-compact .semi-datepicker-quick-control-month .semi-datepicker-quick-control-left-content-wrapper{max-height:218px}.semi-datepicker-compact .semi-datepicker-quick-control-date{min-width:216px;width:max-content;max-width:calc(100vw - 32px)}.semi-datepicker-compact .semi-datepicker-quick-control-date[x-insetinput=true] .semi-datepicker-quick-control-right-content-wrapper,.semi-datepicker-compact .semi-datepicker-quick-control-date[x-insetinput=true] .semi-datepicker-quick-control-left-content-wrapper{max-height:248px}.semi-datepicker-compact .semi-datepicker-quick-control-date .semi-datepicker-quick-control-right-content-wrapper,.semi-datepicker-compact .semi-datepicker-quick-control-date .semi-datepicker-quick-control-left-content-wrapper{max-height:208px}.semi-datepicker-compact .semi-datepicker-quick-control-dateTime{min-width:216px;width:max-content;max-width:calc(100vw - 32px)}.semi-datepicker-compact .semi-datepicker-quick-control-dateTime[x-insetinput=true] .semi-datepicker-quick-control-right-content-wrapper,.semi-datepicker-compact .semi-datepicker-quick-control-dateTime[x-insetinput=true] .semi-datepicker-quick-control-left-content-wrapper{max-height:248px}.semi-datepicker-compact .semi-datepicker-quick-control-dateTime .semi-datepicker-quick-control-right-content-wrapper,.semi-datepicker-compact .semi-datepicker-quick-control-dateTime .semi-datepicker-quick-control-left-content-wrapper{max-height:240px}.semi-datepicker-compact .semi-datepicker-quick-control-dateRange{min-width:min(432px,calc(100vw - 32px));width:max-content;max-width:calc(100vw - 32px)}.semi-datepicker-compact .semi-datepicker-quick-control-dateRange[x-insetinput=true] .semi-datepicker-quick-control-right-content-wrapper,.semi-datepicker-compact .semi-datepicker-quick-control-dateRange[x-insetinput=true] .semi-datepicker-quick-control-left-content-wrapper{max-height:248px}.semi-datepicker-compact .semi-datepicker-quick-control-dateRange .semi-datepicker-quick-control-right-content-wrapper,.semi-datepicker-compact .semi-datepicker-quick-control-dateRange .semi-datepicker-quick-control-left-content-wrapper{max-height:208px}.semi-datepicker-compact .semi-datepicker-quick-control-dateTimeRange{min-width:min(432px,calc(100vw - 32px));width:max-content;max-width:calc(100vw - 32px)}.semi-datepicker-compact .semi-datepicker-quick-control-dateTimeRange[x-insetinput=true] .semi-datepicker-quick-control-right-content-wrapper,.semi-datepicker-compact .semi-datepicker-quick-control-dateTimeRange[x-insetinput=true] .semi-datepicker-quick-control-left-content-wrapper{max-height:248px}.semi-datepicker-compact .semi-datepicker-quick-control-dateTimeRange .semi-datepicker-quick-control-right-content-wrapper,.semi-datepicker-compact .semi-datepicker-quick-control-dateTimeRange .semi-datepicker-quick-control-left-content-wrapper{max-height:240px}.semi-datepicker-compact .semi-datepicker-footer{padding-top:10px;padding-right:8px;padding-bottom:10px}.semi-datepicker-compact .semi-datepicker-inset-input-wrapper{column-gap:4px;padding:8px 8px 0;width:216px}.semi-datepicker-compact .semi-datepicker-inset-input-wrapper[x-type=dateRange],.semi-datepicker-compact .semi-datepicker-inset-input-wrapper[x-type=dateTimeRange]{width:432px;padding-top:0}.semi-datepicker-compact .semi-datepicker-inset-input-wrapper[x-type=dateRange] .semi-input-wrapper,.semi-datepicker-compact .semi-datepicker-inset-input-wrapper[x-type=dateTimeRange] .semi-input-wrapper{margin-top:8px}.semi-datepicker-compact .semi-datepicker-inset-input-wrapper[x-type=month]{width:195px}.semi-datepicker-compact .semi-datepicker-inset-input-wrapper .semi-input-wrapper{height:28px;box-sizing:border-box}.semi-datepicker-compact .semi-datepicker-inset-input-wrapper .semi-input-wrapper .semi-input{font-size:12px;line-height:26px;height:26px;vertical-align:top}.semi-datepicker-compact .semi-datepicker-inset-input-separator{border-left:1px solid var(--semi-color-border);transform:translate(50%);height:auto}.semi-popover-wrapper[x-placement^=top] .semi-datepicker .semi-datepicker-weeks,.semi-popover-wrapper[x-placement=leftTop] .semi-datepicker .semi-datepicker-weeks,.semi-popover-wrapper[x-placement=rightTop] .semi-datepicker .semi-datepicker-weeks,.semi-popover-wrapper[x-placement*=BottomOver] .semi-datepicker .semi-datepicker-weeks{min-height:216px}.semi-popover-wrapper[x-placement^=top] .semi-datepicker-compact .semi-datepicker-weeks,.semi-popover-wrapper[x-placement=leftTop] .semi-datepicker-compact .semi-datepicker-weeks,.semi-popover-wrapper[x-placement=rightTop] .semi-datepicker-compact .semi-datepicker-weeks,.semi-popover-wrapper[x-placement*=BottomOver] .semi-datepicker-compact .semi-datepicker-weeks{min-height:168px}.semi-datepicker-borderless:not(:focus-within):not(:hover){background-color:#0000;border-color:#0000}.semi-datepicker-borderless:not(:focus-within):not(:hover) .semi-input-suffix,.semi-datepicker-borderless:not(:focus-within):not(:hover) .semi-datepicker-range-input-suffix{opacity:0}.semi-datepicker-borderless:focus-within:not(:active){background-color:#0000}.semi-datepicker-borderless.semi-datepicker-range-input-error .semi-datepicker-range-input-wrapper-active{border-color:#0000}.semi-datepicker-borderless.semi-datepicker-range-input-error:hover{background-color:var(--semi-color-danger-light-default)}.semi-datepicker-borderless.semi-datepicker-range-input-error:focus-within{background-color:var(--semi-color-danger-light-default)}.semi-datepicker-borderless.semi-datepicker-range-input-error:not(:focus-within){border-width:1px;border-color:var(--semi-color-danger)}.semi-datepicker-borderless.semi-datepicker-range-input-error:focus-within{border-width:1px;border-color:var(--semi-color-danger)}.semi-datepicker-borderless.semi-datepicker-range-input-warning .semi-datepicker-range-input-wrapper-active{border-color:#0000}.semi-datepicker-borderless.semi-datepicker-range-input-warning:hover{background-color:var(--semi-color-warning-light-default)}.semi-datepicker-borderless.semi-datepicker-range-input-warning:focus-within{background-color:var(--semi-color-warning-light-default)}.semi-datepicker-borderless.semi-datepicker-range-input-warning:not(:focus-within){border-width:1px;border-color:var(--semi-color-warning)}.semi-datepicker-borderless.semi-datepicker-range-input-warning:focus-within{border-width:1px;border-color:var(--semi-color-warning)}.semi-rtl .semi-datepicker,.semi-portal-rtl .semi-datepicker{direction:rtl}.semi-rtl .semi-datepicker-footer,.semi-portal-rtl .semi-datepicker-footer{padding-right:0;padding-left:8px;text-align:left}.semi-rtl .semi-datepicker-footer .semi-button:first-of-type,.semi-portal-rtl .semi-datepicker-footer .semi-button:first-of-type{margin-left:0;margin-right:0}.semi-rtl .semi-datepicker-footer .semi-button:nth-of-type(2),.semi-portal-rtl .semi-datepicker-footer .semi-button:nth-of-type(2){margin-right:12px;margin-left:0}.semi-rtl .semi-datepicker-day-offsetrange-start .semi-datepicker-day-main,.semi-portal-rtl .semi-datepicker-day-offsetrange-start .semi-datepicker-day-main{border-radius:0 var(--semi-border-radius-small) var(--semi-border-radius-small) 0}.semi-rtl .semi-datepicker-day-offsetrange-end .semi-datepicker-day-main,.semi-portal-rtl .semi-datepicker-day-offsetrange-end .semi-datepicker-day-main{border-radius:var(--semi-border-radius-small) 0 0 var(--semi-border-radius-small)}.semi-rtl .semi-datepicker-day-selected-start .semi-datepicker-day-main,.semi-rtl .semi-datepicker-day-hoverday-before-selectedrange .semi-datepicker-day-main,.semi-rtl .semi-datepicker-day-offsetrange-start .semi-datepicker-day-main,.semi-portal-rtl .semi-datepicker-day-selected-start .semi-datepicker-day-main,.semi-portal-rtl .semi-datepicker-day-hoverday-before-selectedrange .semi-datepicker-day-main,.semi-portal-rtl .semi-datepicker-day-offsetrange-start .semi-datepicker-day-main{margin-right:2px;margin-left:auto;border-radius:0 var(--semi-border-radius-small) var(--semi-border-radius-small) 0}.semi-rtl .semi-datepicker-day-selected-end .semi-datepicker-day-main,.semi-rtl .semi-datepicker-day-hoverday-after-selectedrange .semi-datepicker-day-main,.semi-rtl .semi-datepicker-day-offsetrange-end .semi-datepicker-day-main,.semi-portal-rtl .semi-datepicker-day-selected-end .semi-datepicker-day-main,.semi-portal-rtl .semi-datepicker-day-hoverday-after-selectedrange .semi-datepicker-day-main,.semi-portal-rtl .semi-datepicker-day-offsetrange-end .semi-datepicker-day-main{margin-left:2px;margin-right:auto;border-radius:var(--semi-border-radius-small) 0 0 var(--semi-border-radius-small)}.semi-rtl .semi-datepicker-switch-text,.semi-portal-rtl .semi-datepicker-switch-text{padding-left:0;padding-right:8px}.semi-rtl .semi-datepicker-navigation .semi-icon-chevron_left,.semi-rtl .semi-datepicker-navigation .semi-icon-chevron_right,.semi-rtl .semi-datepicker-navigation .semi-icon-double_chevron_left,.semi-rtl .semi-datepicker-navigation .semi-icon-double_chevron_right,.semi-rtl .semi-datepicker-yam .semi-icon-chevron_left,.semi-rtl .semi-datepicker-yam .semi-icon-chevron_right,.semi-rtl .semi-datepicker-yam .semi-icon-double_chevron_left,.semi-rtl .semi-datepicker-yam .semi-icon-double_chevron_right,.semi-portal-rtl .semi-datepicker-navigation .semi-icon-chevron_left,.semi-portal-rtl .semi-datepicker-navigation .semi-icon-chevron_right,.semi-portal-rtl .semi-datepicker-navigation .semi-icon-double_chevron_left,.semi-portal-rtl .semi-datepicker-navigation .semi-icon-double_chevron_right,.semi-portal-rtl .semi-datepicker-yam .semi-icon-chevron_left,.semi-portal-rtl .semi-datepicker-yam .semi-icon-chevron_right,.semi-portal-rtl .semi-datepicker-yam .semi-icon-double_chevron_left,.semi-portal-rtl .semi-datepicker-yam .semi-icon-double_chevron_right{transform:scaleX(-1)}.semi-rtl .semi-datepicker-range-input-prefix,.semi-portal-rtl .semi-datepicker-range-input-prefix{padding-left:8px;padding-right:12px}.semi-rtl .semi-datepicker-range-input-suffix,.semi-portal-rtl .semi-datepicker-range-input-suffix{padding-left:12px;padding-right:8px}.semi-rtl .semi-datepicker-range-input-suffix-hidden,.semi-portal-rtl .semi-datepicker-range-input-suffix-hidden{display:none}.semi-rtl .semi-datepicker-range-input-clearbtn,.semi-portal-rtl .semi-datepicker-range-input-clearbtn{padding-left:12px;padding-right:8px}.semi-rtl .semi-datepicker-compact .semi-datepicker-month-grid[x-type=dateRange] .semi-datepicker-month-grid-left,.semi-rtl .semi-datepicker-compact .semi-datepicker-month-grid[x-type=dateTimeRange] .semi-datepicker-month-grid-left,.semi-portal-rtl .semi-datepicker-compact .semi-datepicker-month-grid[x-type=dateRange] .semi-datepicker-month-grid-left,.semi-portal-rtl .semi-datepicker-compact .semi-datepicker-month-grid[x-type=dateTimeRange] .semi-datepicker-month-grid-left{border-left:1px solid var(--semi-color-border);border-right:0}.semi-rtl .semi-datepicker-compact .semi-datepicker-month-grid .semi-scrolllist-item-wheel,.semi-portal-rtl .semi-datepicker-compact .semi-datepicker-month-grid .semi-scrolllist-item-wheel{border-left:0;border-right:0}.semi-rtl .semi-datepicker-compact .semi-datepicker-day-offsetrange-start .semi-datepicker-day-main,.semi-portal-rtl .semi-datepicker-compact .semi-datepicker-day-offsetrange-start .semi-datepicker-day-main{border-radius:0 4px 4px 0}.semi-rtl .semi-datepicker-compact .semi-datepicker-day-offsetrange-end .semi-datepicker-day-main,.semi-portal-rtl .semi-datepicker-compact .semi-datepicker-day-offsetrange-end .semi-datepicker-day-main{border-radius:4px 0 0 4px}.semi-rtl .semi-datepicker-compact .semi-datepicker-day-selected-start .semi-datepicker-day-main,.semi-portal-rtl .semi-datepicker-compact .semi-datepicker-day-selected-start .semi-datepicker-day-main{margin-left:0;margin-right:2px;border-radius:0 4px 4px 0}.semi-rtl .semi-datepicker-compact .semi-datepicker-day-selected-end .semi-datepicker-day-main,.semi-portal-rtl .semi-datepicker-compact .semi-datepicker-day-selected-end .semi-datepicker-day-main{margin-right:0;margin-left:2px;border-radius:4px 0 0 4px}.semi-rtl .semi-datepicker-compact .semi-datepicker-switch-date,.semi-portal-rtl .semi-datepicker-compact .semi-datepicker-switch-date{border-left:1px solid var(--semi-color-border);border-right:0}.semi-rtl .semi-datepicker-compact .semi-datepicker-switch-text,.semi-portal-rtl .semi-datepicker-compact .semi-datepicker-switch-text{padding-left:auto;padding-right:0}.semi-rtl .semi-datepicker-compact .semi-datepicker-footer,.semi-portal-rtl .semi-datepicker-compact .semi-datepicker-footer{padding-left:8px;padding-right:auto}.semi-rtl .semi-datepicker-compact .semi-datepicker-inset-input-separator,.semi-portal-rtl .semi-datepicker-compact .semi-datepicker-inset-input-separator{border-right:1px solid var(--semi-color-border);border-left:0;transform:translate(-50%)}.semi-descriptions{line-height:20px}.semi-descriptions table,.semi-descriptions tr,.semi-descriptions th,.semi-descriptions td{margin:0;padding:0;border:0}.semi-descriptions th{padding-right:24px}.semi-descriptions .semi-descriptions-item{margin:0;padding-bottom:12px;text-align:left;vertical-align:top}.semi-descriptions-key{font-weight:400;font-size:14px;line-height:20px;font-family:Inter,-apple-system,BlinkMacSystemFont,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Segoe UI,Helvetica Neue,Helvetica,Arial,sans-serif;min-height:14px;white-space:nowrap;color:var(--semi-color-text-2)}.semi-descriptions-value{font-weight:400;font-size:14px;line-height:20px;font-family:Inter,-apple-system,BlinkMacSystemFont,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Segoe UI,Helvetica Neue,Helvetica,Arial,sans-serif;color:var(--semi-color-text-0)}.semi-descriptions-center .semi-descriptions-item-th{text-align:right}.semi-descriptions-center .semi-descriptions-item-td,.semi-descriptions-left .semi-descriptions-item-th,.semi-descriptions-left .semi-descriptions-item-td,.semi-descriptions-justify .semi-descriptions-item-th{text-align:left}.semi-descriptions-justify .semi-descriptions-item-td{text-align:right}.semi-descriptions-plain .semi-descriptions-key,.semi-descriptions-plain .semi-descriptions-value{display:inline-block}.semi-descriptions-plain .semi-descriptions-value{padding-left:8px}.semi-descriptions-plain .semi-descriptions-value .semi-tag{vertical-align:middle}.semi-descriptions-double tbody{display:flex;flex-wrap:wrap}.semi-descriptions-double tr{display:inline-flex;flex-direction:column}.semi-descriptions-double .semi-descriptions-item{padding:0;flex:1}.semi-descriptions-double .semi-descriptions-value{font-weight:600}.semi-descriptions-double-small .semi-descriptions-item{padding-right:48px}.semi-descriptions-double-small .semi-descriptions-key{line-height:16px;font-family:Inter,-apple-system,BlinkMacSystemFont,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Segoe UI,Helvetica Neue,Helvetica,Arial,sans-serif;padding-bottom:0;font-size:12px}.semi-descriptions-double-small .semi-descriptions-value{line-height:22px;font-family:Inter,-apple-system,BlinkMacSystemFont,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Segoe UI,Helvetica Neue,Helvetica,Arial,sans-serif;font-size:16px}.semi-descriptions-double-medium .semi-descriptions-item{padding-right:60px}.semi-descriptions-double-medium .semi-descriptions-key{padding-bottom:4px;font-size:14px}.semi-descriptions-double-medium .semi-descriptions-value{line-height:28px;font-family:Inter,-apple-system,BlinkMacSystemFont,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Segoe UI,Helvetica Neue,Helvetica,Arial,sans-serif;font-size:20px}.semi-descriptions-double-large .semi-descriptions-item{padding-right:80px}.semi-descriptions-double-large .semi-descriptions-key{padding-bottom:4px;font-size:14px}.semi-descriptions-double-large .semi-descriptions-value{line-height:40px;font-family:Inter,-apple-system,BlinkMacSystemFont,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Segoe UI,Helvetica Neue,Helvetica,Arial,sans-serif;font-size:28px}.semi-descriptions-horizontal table{table-layout:fixed}.semi-descriptions-horizontal table,.semi-descriptions-horizontal tbody{width:100%}.semi-descriptions-horizontal .semi-descriptions-item{flex:0}.semi-rtl .semi-descriptions,.semi-portal-rtl .semi-descriptions{direction:rtl}.semi-rtl .semi-descriptions th,.semi-portal-rtl .semi-descriptions th{direction:rtl;padding-right:0;padding-left:24px}.semi-rtl .semi-descriptions .semi-descriptions-item,.semi-portal-rtl .semi-descriptions .semi-descriptions-item{text-align:right}.semi-rtl .semi-descriptions-center .semi-descriptions-item-th,.semi-portal-rtl .semi-descriptions-center .semi-descriptions-item-th{text-align:left}.semi-rtl .semi-descriptions-center .semi-descriptions-item-td,.semi-portal-rtl .semi-descriptions-center .semi-descriptions-item-td{text-align:right}.semi-rtl .semi-descriptions-left .semi-descriptions-item-th,.semi-rtl .semi-descriptions-left .semi-descriptions-item-td,.semi-portal-rtl .semi-descriptions-left .semi-descriptions-item-th,.semi-portal-rtl .semi-descriptions-left .semi-descriptions-item-td{text-align:left}.semi-rtl .semi-descriptions-justify .semi-descriptions-item-th,.semi-portal-rtl .semi-descriptions-justify .semi-descriptions-item-th{text-align:right}.semi-rtl .semi-descriptions-justify .semi-descriptions-item-td,.semi-portal-rtl .semi-descriptions-justify .semi-descriptions-item-td{text-align:left}.semi-rtl .semi-descriptions-plain .semi-descriptions-key,.semi-rtl .semi-descriptions-plain .semi-descriptions-value,.semi-portal-rtl .semi-descriptions-plain .semi-descriptions-key,.semi-portal-rtl .semi-descriptions-plain .semi-descriptions-value{display:inline-block}.semi-rtl .semi-descriptions-plain .semi-descriptions-value,.semi-portal-rtl .semi-descriptions-plain .semi-descriptions-value{padding-left:0;padding-right:8px}.semi-rtl .semi-descriptions-plain .semi-descriptions-value .semi-tag,.semi-portal-rtl .semi-descriptions-plain .semi-descriptions-value .semi-tag{vertical-align:middle}.semi-rtl .semi-descriptions-double,.semi-portal-rtl .semi-descriptions-double{direction:rtl}.semi-rtl .semi-descriptions-double .semi-descriptions-item,.semi-portal-rtl .semi-descriptions-double .semi-descriptions-item{text-align:right}.semi-rtl .semi-descriptions-double-small .semi-descriptions-item,.semi-portal-rtl .semi-descriptions-double-small .semi-descriptions-item{padding-right:0;padding-left:48px}.semi-rtl .semi-descriptions-double-medium .semi-descriptions-item,.semi-portal-rtl .semi-descriptions-double-medium .semi-descriptions-item{padding-right:0;padding-left:60px}.semi-rtl .semi-descriptions-double-large .semi-descriptions-item,.semi-portal-rtl .semi-descriptions-double-large .semi-descriptions-item{padding-right:0;padding-left:80px}.semi-divider{margin:1px 0;border-bottom:1px solid var(--semi-color-border);color:var(--semi-color-text-0);box-sizing:border-box}.semi-divider-dashed{border-bottom-style:dashed}.semi-divider-horizontal{width:100%;display:flex}.semi-divider-vertical{border-bottom:0;display:inline-block;margin:0 1px;border-left:1px solid var(--semi-color-border);height:20px;vertical-align:middle}.semi-divider-with-text{display:flex;border-bottom:0;white-space:nowrap;align-items:center}.semi-divider-with-text .semi-divider_inner-text{font-weight:600;padding:0 8px;display:inline-block}.semi-divider-with-text:before,.semi-divider-with-text:after{content:"";width:50%;border-bottom:1px solid var(--semi-color-border)}.semi-divider-with-text-left:before{width:40px}.semi-divider-with-text-left:after{flex:1}.semi-divider-with-text-right:before{flex:1}.semi-divider-with-text-right:after{width:40px}.semi-divider-dashed:before,.semi-divider-dashed:after{border-bottom:1px dashed var(--semi-color-border)}.semi-divider-vertical.semi-divider-dashed{border-left:1px dashed var(--semi-color-border)}.semi-dropdown{font-size:14px;line-height:20px;font-family:Inter,-apple-system,BlinkMacSystemFont,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Segoe UI,Helvetica Neue,Helvetica,Arial,sans-serif}.semi-dropdown-wrapper{overflow-y:auto;box-shadow:var(--semi-shadow-elevated);position:relative;z-index:1050;border-radius:var(--semi-border-radius-medium);background:var(--semi-color-bg-3);-webkit-backdrop-filter:none;backdrop-filter:none;opacity:0}.semi-dropdown-wrapper-show{opacity:1}.semi-dropdown-trigger{display:inline-block}.semi-dropdown-menu{list-style:none;padding:4px 0;margin:0}.semi-dropdown-title{color:var(--semi-color-text-2);padding:8px 16px 4px;font-size:12px;line-height:16px;font-family:Inter,-apple-system,BlinkMacSystemFont,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Segoe UI,Helvetica Neue,Helvetica,Arial,sans-serif;cursor:default}.semi-dropdown-title-withTick{padding-left:31px}.semi-dropdown-item{padding:8px 16px;color:var(--semi-color-text-0);max-width:280px;display:flex;align-items:center;transition:background-color var(--semi-transition_duration-none) var(--semi-transition_function-easeOut) 0ms;border-radius:0}.semi-dropdown-item-hover{background-color:var(--semi-color-fill-0)}.semi-dropdown-item:not(.semi-dropdown-item-active):hover{background-color:var(--semi-color-fill-0);cursor:pointer}.semi-dropdown-item:not(.semi-dropdown-item-active):active{background-color:var(--semi-color-fill-1)}.semi-dropdown-item:focus-visible{background-color:var(--semi-color-fill-0);outline:0}.semi-dropdown-item-icon{display:inline-flex;align-items:center;margin-right:8px}.semi-dropdown-item-danger{color:var(--semi-color-danger)}.semi-dropdown-item-secondary{color:var(--semi-color-secondary)}.semi-dropdown-item-warning{color:var(--semi-color-warning)}.semi-dropdown-item-tertiary{color:var(--semi-color-tertiary)}.semi-dropdown-item-primary{color:var(--semi-color-primary)}.semi-dropdown-item-withTick{padding-left:12px}.semi-dropdown-item>.semi-icon{flex-shrink:0;margin-right:9px;font-size:12px}.semi-dropdown-item-active{font-weight:600}.semi-dropdown-item.semi-dropdown-item-disabled{color:var(--semi-color-disabled-text);cursor:not-allowed}.semi-dropdown-item.semi-dropdown-item-disabled:hover,.semi-dropdown-item.semi-dropdown-item-disabled:active{cursor:not-allowed;background-color:#0000}.semi-dropdown-divider{display:block;height:1px;width:100%;min-width:100%;clear:both;background:var(--semi-color-border);margin:4px 0}.semi-rtl .semi-dropdown-wrapper,.semi-portal-rtl .semi-dropdown-wrapper{direction:rtl}.semi-rtl .semi-dropdown-title-withTick,.semi-portal-rtl .semi-dropdown-title-withTick{padding-left:0;padding-right:31px}.semi-rtl .semi-dropdown-item-withTick,.semi-portal-rtl .semi-dropdown-item-withTick{padding-left:auto;padding-right:12px}.semi-rtl .semi-dropdown-item>.semi-icon,.semi-portal-rtl .semi-dropdown-item>.semi-icon{margin-right:0;margin-left:9px}.semi-empty{display:flex}.semi-empty-image{display:flex;justify-content:center;-webkit-user-select:none;user-select:none;-webkit-user-drag:none;pointer-events:none}.semi-empty-vertical{align-items:center;flex-direction:column}.semi-empty-vertical .semi-empty-content{margin-top:24px}.semi-empty-vertical .semi-empty-title,.semi-empty-vertical .semi-empty-description{text-align:center}.semi-empty-horizontal .semi-empty-content{margin-left:32px}.semi-empty-title.semi-typography{display:block;font-weight:600}.semi-empty-title+.semi-empty-description{margin-top:16px}.semi-empty-description{color:var(--semi-color-text-1)}.semi-empty-footer{margin-top:24px}.semi-rtl .semi-empty,.semi-portal-rtl .semi-empty{direction:rtl}.semi-rtl .semi-empty-horizontal .semi-empty-content,.semi-portal-rtl .semi-empty-horizontal .semi-empty-content{margin-left:auto;margin-right:32px}.semi-feedback-emoji-container{display:flex;justify-content:center;align-items:center;column-gap:24px;align-self:stretch;margin-top:24px;margin-bottom:24px}.semi-feedback-emoji-item{-webkit-user-select:none;user-select:none;cursor:pointer;font-family:Inter;font-size:36px;line-height:36px;height:36px;font-style:normal;filter:grayscale(100%)}.semi-feedback-emoji-item:hover,.semi-feedback-emoji-item-selected{filter:none}.semi-feedback-thank-text{color:var(--semi-color-text-2);text-align:center;font-size:14px;font-weight:400;line-height:20px;margin-bottom:0;margin-top:24px}.semi-feedback .semi-checkboxGroup-vertical{row-gap:16px}.semi-feedback-footer{display:flex;justify-content:flex-end;column-gap:12px}.semi-feedback .semi-modal,.semi-feedback.semi-feedback-text .semi-modal{width:400px}.semi-feedback .semi-sidesheet-inner{border-radius:12px}.semi-feedback.semi-sidesheet.semi-sidesheet-size-small{width:400px}.semi-feedback.semi-sidesheet.semi-feedback-text{width:600px}.semi-feedback.semi-sidesheet-bottom{right:20px;left:auto}.semi-feedback.semi-sidesheet-bottom .semi-sidesheet-inner-wrap{bottom:50px}@keyframes semi-sidesheet-slideShow_bottom{0%{transform:translateY(calc(100% + 50px))}to{transform:translateY(0)}}@keyframes semi-sidesheet-slideHide_bottom{0%{transform:translateY(0)}to{transform:translateY(calc(100% + 50px))}}.semi-feedback.semi-sidesheet .semi-sidesheet-fixed.semi-feedback-bottom{top:auto}.semi-feedback.semi-sidesheet .semi-sidesheet-fixed.semi-feedback-bottom .semi-sidesheet-inner{bottom:50px}.semi-floatButton{position:fixed;bottom:24px;right:24px;z-index:1000;cursor:pointer}.semi-floatButton-body{background-color:var(--semi-color-fill-0);box-shadow:var(--semi-shadow-elevated);color:var(--semi-color-primary);display:flex;align-items:center;justify-content:center}.semi-floatButton-body:hover{background-color:var(--semi-color-fill-1)}.semi-floatButton-body:active{background-color:var(--semi-color-fill-2)}.semi-floatButton-disabled{background:var(--semi-color-disabled-bg);color:var(--semi-color-disabled-text);cursor:not-allowed}.semi-floatButton-disabled:hover{background-color:var(--semi-color-disabled-bg)}.semi-floatButton-colorful{background:var(--semi-color-ai-general);color:var(--semi-color-white)}.semi-floatButton-colorful:hover{background:var(--semi-color-ai-general-hover)}.semi-floatButton-colorful:active{background:var(--semi-color-ai-general-active)}.semi-floatButton.semi-floatButton-square .semi-badge-dot,.semi-floatButton.semi-floatButton-square .semi-badge-count{top:2.32px;inset-inline-end:2.32px}.semi-floatButton-default{width:32px;height:32px}.semi-floatButton-default.semi-floatButton-round .semi-badge-dot,.semi-floatButton-default.semi-floatButton-round .semi-badge-count{top:4.64px;inset-inline-end:4.64px}.semi-floatButton-small{width:24px;height:24px}.semi-floatButton-small.semi-floatButton-round .semi-badge-dot,.semi-floatButton-small.semi-floatButton-round .semi-badge-count{top:3.48px;inset-inline-end:3.48px}.semi-floatButton-large{width:40px;height:40px}.semi-floatButton-large.semi-floatButton-round .semi-badge-dot,.semi-floatButton-large.semi-floatButton-round .semi-badge-count{top:5.8px;inset-inline-end:5.8px}.semi-floatButton-square{border-radius:8px}.semi-floatButton-round{border-radius:var(--semi-border-radius-full)}.semi-floatButtonGroup{position:fixed;border-radius:8px;bottom:24px;right:24px;z-index:1000;background:var(--semi-color-bg-0);box-shadow:var(--semi-shadow-elevated);display:inline-flex;padding:6px;gap:4px}.semi-floatButtonGroup-item{cursor:pointer;display:flex;padding:6px 12px;align-items:center;column-gap:8px;border-radius:4px;color:var(--semi-color-text-0);font-size:14px;font-style:normal;font-weight:400;line-height:20px}.semi-floatButtonGroup-item:hover{background:var(--semi-color-fill-1)}.semi-floatButtonGroup-item:active{background:var(--semi-color-fill-2)}.semi-form .semi-form-field{box-sizing:border-box}.semi-form-horizontal{display:flex;flex-wrap:wrap}.semi-form-horizontal .semi-form-field{margin-left:0;padding-right:16px}.semi-form-horizontal .semi-form-field:last-child{margin-right:16px}.semi-form-horizontal .semi-form-field-group{padding-right:16px}.semi-form-horizontal .semi-row{display:block}.semi-form-vertical .semi-form-field{margin:0;padding-top:12px;padding-bottom:12px;overflow:hidden}.semi-form-vertical .semi-form-field .semi-form-col-right{display:flex;justify-content:flex-end}.semi-form-vertical .semi-form-field .semi-form-col-left{display:flex;justify-content:flex-start}.semi-form-vertical .semi-form-field-group .semi-form-col-right{display:flex;justify-content:flex-end}.semi-form-vertical .semi-form-field-group .semi-form-col-left{display:flex;justify-content:flex-start}.semi-form-field-label{box-sizing:border-box;font-weight:600;color:var(--semi-color-text-0);margin-bottom:4px;margin-top:0;padding-right:16px;display:inline-block;vertical-align:middle;font-size:14px;line-height:20px;font-family:Inter,-apple-system,BlinkMacSystemFont,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Segoe UI,Helvetica Neue,Helvetica,Arial,sans-serif;flex-shrink:0}.semi-form-field-label-disabled{color:var(--semi-color-disabled-text)}.semi-form-field-label-with-extra .semi-form-field-label-text{display:inline-block}.semi-form-field-label-with-extra .semi-form-field-label-extra{display:flex;align-items:center;margin-left:4px}.semi-form-field-label-required .semi-form-field-label-text:after{content:"*";margin-left:4px;color:var(--semi-color-danger);font-weight:600}.semi-form-field-label-required-disabled{color:var(--semi-color-danger)}.semi-form-field-label-optional-text{color:var(--semi-color-tertiary)}.semi-form-field-label-left{text-align:left}.semi-form-field-label-right{text-align:right}.semi-form-field-error-message,.semi-form-field-help-text{font-size:14px;line-height:20px;font-family:Inter,-apple-system,BlinkMacSystemFont,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Segoe UI,Helvetica Neue,Helvetica,Arial,sans-serif;display:flex;align-items:center;margin-top:4px}.semi-form-field-error-message .semi-icon-alert_triangle,.semi-form-field-help-text .semi-icon-alert_triangle{color:var(--semi-color-warning)}.semi-form-field-error-message{color:var(--semi-color-danger)}.semi-form-field[x-label-pos=top] .semi-form-field-label{display:block}.semi-form-field[x-label-pos=top] .semi-checkboxGroup,.semi-form-field[x-label-pos=top] .semi-radioGroup{padding-top:4px;padding-bottom:4px}.semi-form-field[x-label-pos=top] .semi-radioGroup-buttonRadio,.semi-form-field[x-label-pos=top] .semi-radioGroup-horizontal-card,.semi-form-field[x-label-pos=top] .semi-radioGroup-vertical-card{padding-top:0;padding-bottom:0}.semi-form-field[x-label-pos=top] .semi-form-field-label-with-extra{display:flex;align-items:center}.semi-form-field[x-label-pos=left]{display:flex}.semi-form-field[x-label-pos=left] .semi-form-field-label{margin-bottom:0;margin-right:0;padding-top:6px;padding-bottom:6px}.semi-form-field[x-label-pos=left] .semi-form-field-label-with-extra{display:flex;align-items:center}.semi-form-field[x-label-pos=left] .semi-form-field-label-with-extra.semi-form-field-label-right{justify-content:flex-end}.semi-form-field[x-label-pos=left] .semi-checkboxGroup,.semi-form-field[x-label-pos=left] .semi-radioGroup{padding-top:6px;padding-bottom:6px}.semi-form-field[x-label-pos=left] .semi-radioGroup-buttonRadio,.semi-form-field[x-label-pos=left] .semi-radioGroup-horizontal-card,.semi-form-field[x-label-pos=left] .semi-radioGroup-vertical-card{padding-top:0;padding-bottom:0}.semi-form-field[x-label-pos=left] .semi-switch,.semi-form-field[x-label-pos=left] .semi-rating{vertical-align:middle;margin-top:4px;margin-bottom:4px}.semi-form-field[x-extra-pos=middle] .semi-form-field-extra{margin-top:4px;margin-bottom:4px}.semi-form-field[x-extra-pos=bottom] .semi-form-field-extra{margin-top:4px}.semi-form-field-main{width:100%}.semi-form-field-validate-status-icon{margin-right:4px;flex-shrink:0;align-self:flex-start;position:relative;top:2px}.semi-form-field-extra{color:var(--semi-color-tertiary)}.semi-form-field-extra-string{color:var(--semi-color-tertiary);font-size:14px;line-height:20px;font-family:Inter,-apple-system,BlinkMacSystemFont,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Segoe UI,Helvetica Neue,Helvetica,Arial,sans-serif}.semi-form-vertical .semi-form-field-group{margin-top:0;margin-bottom:0;padding-top:12px;padding-bottom:12px;overflow:hidden}.semi-form-vertical .semi-form-field-group .semi-form-field{margin-top:0;margin-bottom:0}.semi-form-field-group[x-label-pos=left]{display:flex}.semi-form-field-group[x-label-pos=left] .semi-form-field-label{margin-bottom:0;margin-right:0;padding-top:6px;padding-bottom:6px}.semi-form-section{width:100%;margin-top:28px}.semi-form-section-text{margin-block-start:0;margin-block-end:0;font-size:18px;line-height:24px;font-family:Inter,-apple-system,BlinkMacSystemFont,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Segoe UI,Helvetica Neue,Helvetica,Arial,sans-serif;font-weight:600;width:100%;padding-bottom:8px;padding-top:0;border-bottom:1px solid var(--semi-color-border);margin-bottom:4px;margin-top:0;color:var(--semi-color-text-0)}.semi-form-section:nth-of-type(1){margin-top:0}.semi-rtl .semi-form,.semi-portal-rtl .semi-form{direction:rtl}.semi-rtl .semi-form-horizontal .semi-form-field,.semi-portal-rtl .semi-form-horizontal .semi-form-field{margin-left:0;margin-right:0;padding-right:0;padding-left:16px}.semi-rtl .semi-form-horizontal .semi-form-field:last-child,.semi-portal-rtl .semi-form-horizontal .semi-form-field:last-child{margin-left:16px}.semi-rtl .semi-form-horizontal .semi-form-field-group,.semi-portal-rtl .semi-form-horizontal .semi-form-field-group,.semi-rtl .semi-form-field-label,.semi-portal-rtl .semi-form-field-label{padding-right:0;padding-left:16px}.semi-rtl .semi-form-field-label-with-extra .semi-form-field-label-extra,.semi-portal-rtl .semi-form-field-label-with-extra .semi-form-field-label-extra{margin-left:0;margin-right:4px}.semi-rtl .semi-form-field-label-required .semi-form-field-label-text:after,.semi-portal-rtl .semi-form-field-label-required .semi-form-field-label-text:after{content:"*";margin-left:0;margin-right:4px}.semi-rtl .semi-form-field-label-left,.semi-portal-rtl .semi-form-field-label-left{text-align:right}.semi-rtl .semi-form-field-label-right,.semi-portal-rtl .semi-form-field-label-right{text-align:left}.semi-rtl .semi-form-field,.semi-portal-rtl .semi-form-field{direction:rtl}.semi-rtl .semi-form-field[x-label-pos=left] .semi-form-field-label,.semi-portal-rtl .semi-form-field[x-label-pos=left] .semi-form-field-label{margin-right:0;margin-left:0}.semi-rtl .semi-form-field-validate-status-icon,.semi-portal-rtl .semi-form-field-validate-status-icon{margin-right:0;margin-left:4px}.semi-rtl .semi-form-section,.semi-portal-rtl .semi-form-section{direction:rtl}.semi-row{display:block;box-sizing:border-box;position:relative;height:auto;margin-right:0;margin-left:0;zoom:1}.semi-row:before,.semi-row:after{display:table;content:""}.semi-row:after{clear:both}.semi-row-flex{display:flex;flex-flow:row wrap}.semi-row-flex:before,.semi-row-flex:after{display:flex}.semi-col-0,.semi-col-xs-0,.semi-col-sm-0,.semi-col-md-0,.semi-col-lg-0,.semi-col-xl-0,.semi-col-xxl-0{display:none}.semi-row-flex-start{justify-content:flex-start}.semi-row-flex-center{justify-content:center}.semi-row-flex-end{justify-content:flex-end}.semi-row-flex-space-between{justify-content:space-between}.semi-row-flex-space-around{justify-content:space-around}.semi-row-flex-top{align-items:flex-start}.semi-row-flex-middle{align-items:center}.semi-row-flex-bottom{align-items:flex-end}.semi-col{position:relative}.semi-col-1,.semi-col-xs-1,.semi-col-sm-1,.semi-col-md-1,.semi-col-lg-1,.semi-col-2,.semi-col-xs-2,.semi-col-sm-2,.semi-col-md-2,.semi-col-lg-2,.semi-col-3,.semi-col-xs-3,.semi-col-sm-3,.semi-col-md-3,.semi-col-lg-3,.semi-col-4,.semi-col-xs-4,.semi-col-sm-4,.semi-col-md-4,.semi-col-lg-4,.semi-col-5,.semi-col-xs-5,.semi-col-sm-5,.semi-col-md-5,.semi-col-lg-5,.semi-col-6,.semi-col-xs-6,.semi-col-sm-6,.semi-col-md-6,.semi-col-lg-6,.semi-col-7,.semi-col-xs-7,.semi-col-sm-7,.semi-col-md-7,.semi-col-lg-7,.semi-col-8,.semi-col-xs-8,.semi-col-sm-8,.semi-col-md-8,.semi-col-lg-8,.semi-col-9,.semi-col-xs-9,.semi-col-sm-9,.semi-col-md-9,.semi-col-lg-9,.semi-col-10,.semi-col-xs-10,.semi-col-sm-10,.semi-col-md-10,.semi-col-lg-10,.semi-col-11,.semi-col-xs-11,.semi-col-sm-11,.semi-col-md-11,.semi-col-lg-11,.semi-col-12,.semi-col-xs-12,.semi-col-sm-12,.semi-col-md-12,.semi-col-lg-12,.semi-col-13,.semi-col-xs-13,.semi-col-sm-13,.semi-col-md-13,.semi-col-lg-13,.semi-col-14,.semi-col-xs-14,.semi-col-sm-14,.semi-col-md-14,.semi-col-lg-14,.semi-col-15,.semi-col-xs-15,.semi-col-sm-15,.semi-col-md-15,.semi-col-lg-15,.semi-col-16,.semi-col-xs-16,.semi-col-sm-16,.semi-col-md-16,.semi-col-lg-16,.semi-col-17,.semi-col-xs-17,.semi-col-sm-17,.semi-col-md-17,.semi-col-lg-17,.semi-col-18,.semi-col-xs-18,.semi-col-sm-18,.semi-col-md-18,.semi-col-lg-18,.semi-col-19,.semi-col-xs-19,.semi-col-sm-19,.semi-col-md-19,.semi-col-lg-19,.semi-col-20,.semi-col-xs-20,.semi-col-sm-20,.semi-col-md-20,.semi-col-lg-20,.semi-col-21,.semi-col-xs-21,.semi-col-sm-21,.semi-col-md-21,.semi-col-lg-21,.semi-col-22,.semi-col-xs-22,.semi-col-sm-22,.semi-col-md-22,.semi-col-lg-22,.semi-col-23,.semi-col-xs-23,.semi-col-sm-23,.semi-col-md-23,.semi-col-lg-23,.semi-col-24,.semi-col-xs-24,.semi-col-sm-24,.semi-col-md-24,.semi-col-lg-24{position:relative;min-height:1px;padding-right:0;padding-left:0}.semi-col-1,.semi-col-2,.semi-col-3,.semi-col-4,.semi-col-5,.semi-col-6,.semi-col-7,.semi-col-8,.semi-col-9,.semi-col-10,.semi-col-11,.semi-col-12,.semi-col-13,.semi-col-14,.semi-col-15,.semi-col-16,.semi-col-17,.semi-col-18,.semi-col-19,.semi-col-20,.semi-col-21,.semi-col-22,.semi-col-23,.semi-col-24{flex:0 0 auto;float:left}.semi-col-1{display:block;box-sizing:border-box;width:4.1666666667%}.semi-col-push-1{left:4.1666666667%}.semi-col-pull-1{right:4.1666666667%}.semi-col-offset-1{margin-left:4.1666666667%}.semi-col-order-1{order:1}.semi-col-2{display:block;box-sizing:border-box;width:8.3333333333%}.semi-col-push-2{left:8.3333333333%}.semi-col-pull-2{right:8.3333333333%}.semi-col-offset-2{margin-left:8.3333333333%}.semi-col-order-2{order:2}.semi-col-3{display:block;box-sizing:border-box;width:12.5%}.semi-col-push-3{left:12.5%}.semi-col-pull-3{right:12.5%}.semi-col-offset-3{margin-left:12.5%}.semi-col-order-3{order:3}.semi-col-4{display:block;box-sizing:border-box;width:16.6666666667%}.semi-col-push-4{left:16.6666666667%}.semi-col-pull-4{right:16.6666666667%}.semi-col-offset-4{margin-left:16.6666666667%}.semi-col-order-4{order:4}.semi-col-5{display:block;box-sizing:border-box;width:20.8333333333%}.semi-col-push-5{left:20.8333333333%}.semi-col-pull-5{right:20.8333333333%}.semi-col-offset-5{margin-left:20.8333333333%}.semi-col-order-5{order:5}.semi-col-6{display:block;box-sizing:border-box;width:25%}.semi-col-push-6{left:25%}.semi-col-pull-6{right:25%}.semi-col-offset-6{margin-left:25%}.semi-col-order-6{order:6}.semi-col-7{display:block;box-sizing:border-box;width:29.1666666667%}.semi-col-push-7{left:29.1666666667%}.semi-col-pull-7{right:29.1666666667%}.semi-col-offset-7{margin-left:29.1666666667%}.semi-col-order-7{order:7}.semi-col-8{display:block;box-sizing:border-box;width:33.3333333333%}.semi-col-push-8{left:33.3333333333%}.semi-col-pull-8{right:33.3333333333%}.semi-col-offset-8{margin-left:33.3333333333%}.semi-col-order-8{order:8}.semi-col-9{display:block;box-sizing:border-box;width:37.5%}.semi-col-push-9{left:37.5%}.semi-col-pull-9{right:37.5%}.semi-col-offset-9{margin-left:37.5%}.semi-col-order-9{order:9}.semi-col-10{display:block;box-sizing:border-box;width:41.6666666667%}.semi-col-push-10{left:41.6666666667%}.semi-col-pull-10{right:41.6666666667%}.semi-col-offset-10{margin-left:41.6666666667%}.semi-col-order-10{order:10}.semi-col-11{display:block;box-sizing:border-box;width:45.8333333333%}.semi-col-push-11{left:45.8333333333%}.semi-col-pull-11{right:45.8333333333%}.semi-col-offset-11{margin-left:45.8333333333%}.semi-col-order-11{order:11}.semi-col-12{display:block;box-sizing:border-box;width:50%}.semi-col-push-12{left:50%}.semi-col-pull-12{right:50%}.semi-col-offset-12{margin-left:50%}.semi-col-order-12{order:12}.semi-col-13{display:block;box-sizing:border-box;width:54.1666666667%}.semi-col-push-13{left:54.1666666667%}.semi-col-pull-13{right:54.1666666667%}.semi-col-offset-13{margin-left:54.1666666667%}.semi-col-order-13{order:13}.semi-col-14{display:block;box-sizing:border-box;width:58.3333333333%}.semi-col-push-14{left:58.3333333333%}.semi-col-pull-14{right:58.3333333333%}.semi-col-offset-14{margin-left:58.3333333333%}.semi-col-order-14{order:14}.semi-col-15{display:block;box-sizing:border-box;width:62.5%}.semi-col-push-15{left:62.5%}.semi-col-pull-15{right:62.5%}.semi-col-offset-15{margin-left:62.5%}.semi-col-order-15{order:15}.semi-col-16{display:block;box-sizing:border-box;width:66.6666666667%}.semi-col-push-16{left:66.6666666667%}.semi-col-pull-16{right:66.6666666667%}.semi-col-offset-16{margin-left:66.6666666667%}.semi-col-order-16{order:16}.semi-col-17{display:block;box-sizing:border-box;width:70.8333333333%}.semi-col-push-17{left:70.8333333333%}.semi-col-pull-17{right:70.8333333333%}.semi-col-offset-17{margin-left:70.8333333333%}.semi-col-order-17{order:17}.semi-col-18{display:block;box-sizing:border-box;width:75%}.semi-col-push-18{left:75%}.semi-col-pull-18{right:75%}.semi-col-offset-18{margin-left:75%}.semi-col-order-18{order:18}.semi-col-19{display:block;box-sizing:border-box;width:79.1666666667%}.semi-col-push-19{left:79.1666666667%}.semi-col-pull-19{right:79.1666666667%}.semi-col-offset-19{margin-left:79.1666666667%}.semi-col-order-19{order:19}.semi-col-20{display:block;box-sizing:border-box;width:83.3333333333%}.semi-col-push-20{left:83.3333333333%}.semi-col-pull-20{right:83.3333333333%}.semi-col-offset-20{margin-left:83.3333333333%}.semi-col-order-20{order:20}.semi-col-21{display:block;box-sizing:border-box;width:87.5%}.semi-col-push-21{left:87.5%}.semi-col-pull-21{right:87.5%}.semi-col-offset-21{margin-left:87.5%}.semi-col-order-21{order:21}.semi-col-22{display:block;box-sizing:border-box;width:91.6666666667%}.semi-col-push-22{left:91.6666666667%}.semi-col-pull-22{right:91.6666666667%}.semi-col-offset-22{margin-left:91.6666666667%}.semi-col-order-22{order:22}.semi-col-23{display:block;box-sizing:border-box;width:95.8333333333%}.semi-col-push-23{left:95.8333333333%}.semi-col-pull-23{right:95.8333333333%}.semi-col-offset-23{margin-left:95.8333333333%}.semi-col-order-23{order:23}.semi-col-24{display:block;box-sizing:border-box;width:100%}.semi-col-push-24{left:100%}.semi-col-pull-24{right:100%}.semi-col-offset-24{margin-left:100%}.semi-col-order-24{order:24}.semi-rtl .semi-col-1,.semi-rtl .semi-col-2,.semi-rtl .semi-col-3,.semi-rtl .semi-col-4,.semi-rtl .semi-col-5,.semi-rtl .semi-col-6,.semi-rtl .semi-col-7,.semi-rtl .semi-col-8,.semi-rtl .semi-col-9,.semi-rtl .semi-col-10,.semi-rtl .semi-col-11,.semi-rtl .semi-col-12,.semi-rtl .semi-col-13,.semi-rtl .semi-col-14,.semi-rtl .semi-col-15,.semi-rtl .semi-col-16,.semi-rtl .semi-col-17,.semi-rtl .semi-col-18,.semi-rtl .semi-col-19,.semi-rtl .semi-col-20,.semi-rtl .semi-col-21,.semi-rtl .semi-col-22,.semi-rtl .semi-col-23,.semi-rtl .semi-col-24{float:right}.semi-rtl .semi-col-offset-1{margin-left:auto;margin-right:4.1666666667%}.semi-rtl .semi-col-offset-2{margin-left:auto;margin-right:8.3333333333%}.semi-rtl .semi-col-offset-3{margin-left:auto;margin-right:12.5%}.semi-rtl .semi-col-offset-4{margin-left:auto;margin-right:16.6666666667%}.semi-rtl .semi-col-offset-5{margin-left:auto;margin-right:20.8333333333%}.semi-rtl .semi-col-offset-6{margin-left:auto;margin-right:25%}.semi-rtl .semi-col-offset-7{margin-left:auto;margin-right:29.1666666667%}.semi-rtl .semi-col-offset-8{margin-left:auto;margin-right:33.3333333333%}.semi-rtl .semi-col-offset-9{margin-left:auto;margin-right:37.5%}.semi-rtl .semi-col-offset-10{margin-left:auto;margin-right:41.6666666667%}.semi-rtl .semi-col-offset-11{margin-left:auto;margin-right:45.8333333333%}.semi-rtl .semi-col-offset-12{margin-left:auto;margin-right:50%}.semi-rtl .semi-col-offset-13{margin-left:auto;margin-right:54.1666666667%}.semi-rtl .semi-col-offset-14{margin-left:auto;margin-right:58.3333333333%}.semi-rtl .semi-col-offset-15{margin-left:auto;margin-right:62.5%}.semi-rtl .semi-col-offset-16{margin-left:auto;margin-right:66.6666666667%}.semi-rtl .semi-col-offset-17{margin-left:auto;margin-right:70.8333333333%}.semi-rtl .semi-col-offset-18{margin-left:auto;margin-right:75%}.semi-rtl .semi-col-offset-19{margin-left:auto;margin-right:79.1666666667%}.semi-rtl .semi-col-offset-20{margin-left:auto;margin-right:83.3333333333%}.semi-rtl .semi-col-offset-21{margin-left:auto;margin-right:87.5%}.semi-rtl .semi-col-offset-22{margin-left:auto;margin-right:91.6666666667%}.semi-rtl .semi-col-offset-23{margin-left:auto;margin-right:95.8333333333%}.semi-rtl .semi-col-offset-24{margin-left:auto;margin-right:100%}.semi-col-xs-1,.semi-col-xs-2,.semi-col-xs-3,.semi-col-xs-4,.semi-col-xs-5,.semi-col-xs-6,.semi-col-xs-7,.semi-col-xs-8,.semi-col-xs-9,.semi-col-xs-10,.semi-col-xs-11,.semi-col-xs-12,.semi-col-xs-13,.semi-col-xs-14,.semi-col-xs-15,.semi-col-xs-16,.semi-col-xs-17,.semi-col-xs-18,.semi-col-xs-19,.semi-col-xs-20,.semi-col-xs-21,.semi-col-xs-22,.semi-col-xs-23,.semi-col-xs-24{flex:0 0 auto;float:left}.semi-col-xs-1{display:block;box-sizing:border-box;width:4.1666666667%}.semi-col-xs-push-1{left:4.1666666667%}.semi-col-xs-pull-1{right:4.1666666667%}.semi-col-xs-offset-1{margin-left:4.1666666667%}.semi-col-xs-order-1{order:1}.semi-col-xs-2{display:block;box-sizing:border-box;width:8.3333333333%}.semi-col-xs-push-2{left:8.3333333333%}.semi-col-xs-pull-2{right:8.3333333333%}.semi-col-xs-offset-2{margin-left:8.3333333333%}.semi-col-xs-order-2{order:2}.semi-col-xs-3{display:block;box-sizing:border-box;width:12.5%}.semi-col-xs-push-3{left:12.5%}.semi-col-xs-pull-3{right:12.5%}.semi-col-xs-offset-3{margin-left:12.5%}.semi-col-xs-order-3{order:3}.semi-col-xs-4{display:block;box-sizing:border-box;width:16.6666666667%}.semi-col-xs-push-4{left:16.6666666667%}.semi-col-xs-pull-4{right:16.6666666667%}.semi-col-xs-offset-4{margin-left:16.6666666667%}.semi-col-xs-order-4{order:4}.semi-col-xs-5{display:block;box-sizing:border-box;width:20.8333333333%}.semi-col-xs-push-5{left:20.8333333333%}.semi-col-xs-pull-5{right:20.8333333333%}.semi-col-xs-offset-5{margin-left:20.8333333333%}.semi-col-xs-order-5{order:5}.semi-col-xs-6{display:block;box-sizing:border-box;width:25%}.semi-col-xs-push-6{left:25%}.semi-col-xs-pull-6{right:25%}.semi-col-xs-offset-6{margin-left:25%}.semi-col-xs-order-6{order:6}.semi-col-xs-7{display:block;box-sizing:border-box;width:29.1666666667%}.semi-col-xs-push-7{left:29.1666666667%}.semi-col-xs-pull-7{right:29.1666666667%}.semi-col-xs-offset-7{margin-left:29.1666666667%}.semi-col-xs-order-7{order:7}.semi-col-xs-8{display:block;box-sizing:border-box;width:33.3333333333%}.semi-col-xs-push-8{left:33.3333333333%}.semi-col-xs-pull-8{right:33.3333333333%}.semi-col-xs-offset-8{margin-left:33.3333333333%}.semi-col-xs-order-8{order:8}.semi-col-xs-9{display:block;box-sizing:border-box;width:37.5%}.semi-col-xs-push-9{left:37.5%}.semi-col-xs-pull-9{right:37.5%}.semi-col-xs-offset-9{margin-left:37.5%}.semi-col-xs-order-9{order:9}.semi-col-xs-10{display:block;box-sizing:border-box;width:41.6666666667%}.semi-col-xs-push-10{left:41.6666666667%}.semi-col-xs-pull-10{right:41.6666666667%}.semi-col-xs-offset-10{margin-left:41.6666666667%}.semi-col-xs-order-10{order:10}.semi-col-xs-11{display:block;box-sizing:border-box;width:45.8333333333%}.semi-col-xs-push-11{left:45.8333333333%}.semi-col-xs-pull-11{right:45.8333333333%}.semi-col-xs-offset-11{margin-left:45.8333333333%}.semi-col-xs-order-11{order:11}.semi-col-xs-12{display:block;box-sizing:border-box;width:50%}.semi-col-xs-push-12{left:50%}.semi-col-xs-pull-12{right:50%}.semi-col-xs-offset-12{margin-left:50%}.semi-col-xs-order-12{order:12}.semi-col-xs-13{display:block;box-sizing:border-box;width:54.1666666667%}.semi-col-xs-push-13{left:54.1666666667%}.semi-col-xs-pull-13{right:54.1666666667%}.semi-col-xs-offset-13{margin-left:54.1666666667%}.semi-col-xs-order-13{order:13}.semi-col-xs-14{display:block;box-sizing:border-box;width:58.3333333333%}.semi-col-xs-push-14{left:58.3333333333%}.semi-col-xs-pull-14{right:58.3333333333%}.semi-col-xs-offset-14{margin-left:58.3333333333%}.semi-col-xs-order-14{order:14}.semi-col-xs-15{display:block;box-sizing:border-box;width:62.5%}.semi-col-xs-push-15{left:62.5%}.semi-col-xs-pull-15{right:62.5%}.semi-col-xs-offset-15{margin-left:62.5%}.semi-col-xs-order-15{order:15}.semi-col-xs-16{display:block;box-sizing:border-box;width:66.6666666667%}.semi-col-xs-push-16{left:66.6666666667%}.semi-col-xs-pull-16{right:66.6666666667%}.semi-col-xs-offset-16{margin-left:66.6666666667%}.semi-col-xs-order-16{order:16}.semi-col-xs-17{display:block;box-sizing:border-box;width:70.8333333333%}.semi-col-xs-push-17{left:70.8333333333%}.semi-col-xs-pull-17{right:70.8333333333%}.semi-col-xs-offset-17{margin-left:70.8333333333%}.semi-col-xs-order-17{order:17}.semi-col-xs-18{display:block;box-sizing:border-box;width:75%}.semi-col-xs-push-18{left:75%}.semi-col-xs-pull-18{right:75%}.semi-col-xs-offset-18{margin-left:75%}.semi-col-xs-order-18{order:18}.semi-col-xs-19{display:block;box-sizing:border-box;width:79.1666666667%}.semi-col-xs-push-19{left:79.1666666667%}.semi-col-xs-pull-19{right:79.1666666667%}.semi-col-xs-offset-19{margin-left:79.1666666667%}.semi-col-xs-order-19{order:19}.semi-col-xs-20{display:block;box-sizing:border-box;width:83.3333333333%}.semi-col-xs-push-20{left:83.3333333333%}.semi-col-xs-pull-20{right:83.3333333333%}.semi-col-xs-offset-20{margin-left:83.3333333333%}.semi-col-xs-order-20{order:20}.semi-col-xs-21{display:block;box-sizing:border-box;width:87.5%}.semi-col-xs-push-21{left:87.5%}.semi-col-xs-pull-21{right:87.5%}.semi-col-xs-offset-21{margin-left:87.5%}.semi-col-xs-order-21{order:21}.semi-col-xs-22{display:block;box-sizing:border-box;width:91.6666666667%}.semi-col-xs-push-22{left:91.6666666667%}.semi-col-xs-pull-22{right:91.6666666667%}.semi-col-xs-offset-22{margin-left:91.6666666667%}.semi-col-xs-order-22{order:22}.semi-col-xs-23{display:block;box-sizing:border-box;width:95.8333333333%}.semi-col-xs-push-23{left:95.8333333333%}.semi-col-xs-pull-23{right:95.8333333333%}.semi-col-xs-offset-23{margin-left:95.8333333333%}.semi-col-xs-order-23{order:23}.semi-col-xs-24{display:block;box-sizing:border-box;width:100%}.semi-col-xs-push-24{left:100%}.semi-col-xs-pull-24{right:100%}.semi-col-xs-offset-24{margin-left:100%}.semi-col-xs-order-24{order:24}.semi-rtl .semi-col-xs-1,.semi-rtl .semi-col-xs-2,.semi-rtl .semi-col-xs-3,.semi-rtl .semi-col-xs-4,.semi-rtl .semi-col-xs-5,.semi-rtl .semi-col-xs-6,.semi-rtl .semi-col-xs-7,.semi-rtl .semi-col-xs-8,.semi-rtl .semi-col-xs-9,.semi-rtl .semi-col-xs-10,.semi-rtl .semi-col-xs-11,.semi-rtl .semi-col-xs-12,.semi-rtl .semi-col-xs-13,.semi-rtl .semi-col-xs-14,.semi-rtl .semi-col-xs-15,.semi-rtl .semi-col-xs-16,.semi-rtl .semi-col-xs-17,.semi-rtl .semi-col-xs-18,.semi-rtl .semi-col-xs-19,.semi-rtl .semi-col-xs-20,.semi-rtl .semi-col-xs-21,.semi-rtl .semi-col-xs-22,.semi-rtl .semi-col-xs-23,.semi-rtl .semi-col-xs-24{float:right}.semi-rtl .semi-col-xs-offset-1{margin-left:auto;margin-right:4.1666666667%}.semi-rtl .semi-col-xs-offset-2{margin-left:auto;margin-right:8.3333333333%}.semi-rtl .semi-col-xs-offset-3{margin-left:auto;margin-right:12.5%}.semi-rtl .semi-col-xs-offset-4{margin-left:auto;margin-right:16.6666666667%}.semi-rtl .semi-col-xs-offset-5{margin-left:auto;margin-right:20.8333333333%}.semi-rtl .semi-col-xs-offset-6{margin-left:auto;margin-right:25%}.semi-rtl .semi-col-xs-offset-7{margin-left:auto;margin-right:29.1666666667%}.semi-rtl .semi-col-xs-offset-8{margin-left:auto;margin-right:33.3333333333%}.semi-rtl .semi-col-xs-offset-9{margin-left:auto;margin-right:37.5%}.semi-rtl .semi-col-xs-offset-10{margin-left:auto;margin-right:41.6666666667%}.semi-rtl .semi-col-xs-offset-11{margin-left:auto;margin-right:45.8333333333%}.semi-rtl .semi-col-xs-offset-12{margin-left:auto;margin-right:50%}.semi-rtl .semi-col-xs-offset-13{margin-left:auto;margin-right:54.1666666667%}.semi-rtl .semi-col-xs-offset-14{margin-left:auto;margin-right:58.3333333333%}.semi-rtl .semi-col-xs-offset-15{margin-left:auto;margin-right:62.5%}.semi-rtl .semi-col-xs-offset-16{margin-left:auto;margin-right:66.6666666667%}.semi-rtl .semi-col-xs-offset-17{margin-left:auto;margin-right:70.8333333333%}.semi-rtl .semi-col-xs-offset-18{margin-left:auto;margin-right:75%}.semi-rtl .semi-col-xs-offset-19{margin-left:auto;margin-right:79.1666666667%}.semi-rtl .semi-col-xs-offset-20{margin-left:auto;margin-right:83.3333333333%}.semi-rtl .semi-col-xs-offset-21{margin-left:auto;margin-right:87.5%}.semi-rtl .semi-col-xs-offset-22{margin-left:auto;margin-right:91.6666666667%}.semi-rtl .semi-col-xs-offset-23{margin-left:auto;margin-right:95.8333333333%}.semi-rtl .semi-col-xs-offset-24{margin-left:auto;margin-right:100%}@media(min-width:576px){.semi-col-sm-1,.semi-col-sm-2,.semi-col-sm-3,.semi-col-sm-4,.semi-col-sm-5,.semi-col-sm-6,.semi-col-sm-7,.semi-col-sm-8,.semi-col-sm-9,.semi-col-sm-10,.semi-col-sm-11,.semi-col-sm-12,.semi-col-sm-13,.semi-col-sm-14,.semi-col-sm-15,.semi-col-sm-16,.semi-col-sm-17,.semi-col-sm-18,.semi-col-sm-19,.semi-col-sm-20,.semi-col-sm-21,.semi-col-sm-22,.semi-col-sm-23,.semi-col-sm-24{flex:0 0 auto;float:left}.semi-col-sm-1{display:block;box-sizing:border-box;width:4.1666666667%}.semi-col-sm-push-1{left:4.1666666667%}.semi-col-sm-pull-1{right:4.1666666667%}.semi-col-sm-offset-1{margin-left:4.1666666667%}.semi-col-sm-order-1{order:1}.semi-col-sm-2{display:block;box-sizing:border-box;width:8.3333333333%}.semi-col-sm-push-2{left:8.3333333333%}.semi-col-sm-pull-2{right:8.3333333333%}.semi-col-sm-offset-2{margin-left:8.3333333333%}.semi-col-sm-order-2{order:2}.semi-col-sm-3{display:block;box-sizing:border-box;width:12.5%}.semi-col-sm-push-3{left:12.5%}.semi-col-sm-pull-3{right:12.5%}.semi-col-sm-offset-3{margin-left:12.5%}.semi-col-sm-order-3{order:3}.semi-col-sm-4{display:block;box-sizing:border-box;width:16.6666666667%}.semi-col-sm-push-4{left:16.6666666667%}.semi-col-sm-pull-4{right:16.6666666667%}.semi-col-sm-offset-4{margin-left:16.6666666667%}.semi-col-sm-order-4{order:4}.semi-col-sm-5{display:block;box-sizing:border-box;width:20.8333333333%}.semi-col-sm-push-5{left:20.8333333333%}.semi-col-sm-pull-5{right:20.8333333333%}.semi-col-sm-offset-5{margin-left:20.8333333333%}.semi-col-sm-order-5{order:5}.semi-col-sm-6{display:block;box-sizing:border-box;width:25%}.semi-col-sm-push-6{left:25%}.semi-col-sm-pull-6{right:25%}.semi-col-sm-offset-6{margin-left:25%}.semi-col-sm-order-6{order:6}.semi-col-sm-7{display:block;box-sizing:border-box;width:29.1666666667%}.semi-col-sm-push-7{left:29.1666666667%}.semi-col-sm-pull-7{right:29.1666666667%}.semi-col-sm-offset-7{margin-left:29.1666666667%}.semi-col-sm-order-7{order:7}.semi-col-sm-8{display:block;box-sizing:border-box;width:33.3333333333%}.semi-col-sm-push-8{left:33.3333333333%}.semi-col-sm-pull-8{right:33.3333333333%}.semi-col-sm-offset-8{margin-left:33.3333333333%}.semi-col-sm-order-8{order:8}.semi-col-sm-9{display:block;box-sizing:border-box;width:37.5%}.semi-col-sm-push-9{left:37.5%}.semi-col-sm-pull-9{right:37.5%}.semi-col-sm-offset-9{margin-left:37.5%}.semi-col-sm-order-9{order:9}.semi-col-sm-10{display:block;box-sizing:border-box;width:41.6666666667%}.semi-col-sm-push-10{left:41.6666666667%}.semi-col-sm-pull-10{right:41.6666666667%}.semi-col-sm-offset-10{margin-left:41.6666666667%}.semi-col-sm-order-10{order:10}.semi-col-sm-11{display:block;box-sizing:border-box;width:45.8333333333%}.semi-col-sm-push-11{left:45.8333333333%}.semi-col-sm-pull-11{right:45.8333333333%}.semi-col-sm-offset-11{margin-left:45.8333333333%}.semi-col-sm-order-11{order:11}.semi-col-sm-12{display:block;box-sizing:border-box;width:50%}.semi-col-sm-push-12{left:50%}.semi-col-sm-pull-12{right:50%}.semi-col-sm-offset-12{margin-left:50%}.semi-col-sm-order-12{order:12}.semi-col-sm-13{display:block;box-sizing:border-box;width:54.1666666667%}.semi-col-sm-push-13{left:54.1666666667%}.semi-col-sm-pull-13{right:54.1666666667%}.semi-col-sm-offset-13{margin-left:54.1666666667%}.semi-col-sm-order-13{order:13}.semi-col-sm-14{display:block;box-sizing:border-box;width:58.3333333333%}.semi-col-sm-push-14{left:58.3333333333%}.semi-col-sm-pull-14{right:58.3333333333%}.semi-col-sm-offset-14{margin-left:58.3333333333%}.semi-col-sm-order-14{order:14}.semi-col-sm-15{display:block;box-sizing:border-box;width:62.5%}.semi-col-sm-push-15{left:62.5%}.semi-col-sm-pull-15{right:62.5%}.semi-col-sm-offset-15{margin-left:62.5%}.semi-col-sm-order-15{order:15}.semi-col-sm-16{display:block;box-sizing:border-box;width:66.6666666667%}.semi-col-sm-push-16{left:66.6666666667%}.semi-col-sm-pull-16{right:66.6666666667%}.semi-col-sm-offset-16{margin-left:66.6666666667%}.semi-col-sm-order-16{order:16}.semi-col-sm-17{display:block;box-sizing:border-box;width:70.8333333333%}.semi-col-sm-push-17{left:70.8333333333%}.semi-col-sm-pull-17{right:70.8333333333%}.semi-col-sm-offset-17{margin-left:70.8333333333%}.semi-col-sm-order-17{order:17}.semi-col-sm-18{display:block;box-sizing:border-box;width:75%}.semi-col-sm-push-18{left:75%}.semi-col-sm-pull-18{right:75%}.semi-col-sm-offset-18{margin-left:75%}.semi-col-sm-order-18{order:18}.semi-col-sm-19{display:block;box-sizing:border-box;width:79.1666666667%}.semi-col-sm-push-19{left:79.1666666667%}.semi-col-sm-pull-19{right:79.1666666667%}.semi-col-sm-offset-19{margin-left:79.1666666667%}.semi-col-sm-order-19{order:19}.semi-col-sm-20{display:block;box-sizing:border-box;width:83.3333333333%}.semi-col-sm-push-20{left:83.3333333333%}.semi-col-sm-pull-20{right:83.3333333333%}.semi-col-sm-offset-20{margin-left:83.3333333333%}.semi-col-sm-order-20{order:20}.semi-col-sm-21{display:block;box-sizing:border-box;width:87.5%}.semi-col-sm-push-21{left:87.5%}.semi-col-sm-pull-21{right:87.5%}.semi-col-sm-offset-21{margin-left:87.5%}.semi-col-sm-order-21{order:21}.semi-col-sm-22{display:block;box-sizing:border-box;width:91.6666666667%}.semi-col-sm-push-22{left:91.6666666667%}.semi-col-sm-pull-22{right:91.6666666667%}.semi-col-sm-offset-22{margin-left:91.6666666667%}.semi-col-sm-order-22{order:22}.semi-col-sm-23{display:block;box-sizing:border-box;width:95.8333333333%}.semi-col-sm-push-23{left:95.8333333333%}.semi-col-sm-pull-23{right:95.8333333333%}.semi-col-sm-offset-23{margin-left:95.8333333333%}.semi-col-sm-order-23{order:23}.semi-col-sm-24{display:block;box-sizing:border-box;width:100%}.semi-col-sm-push-24{left:100%}.semi-col-sm-pull-24{right:100%}.semi-col-sm-offset-24{margin-left:100%}.semi-col-sm-order-24{order:24}.semi-rtl .semi-col-sm-1,.semi-rtl .semi-col-sm-2,.semi-rtl .semi-col-sm-3,.semi-rtl .semi-col-sm-4,.semi-rtl .semi-col-sm-5,.semi-rtl .semi-col-sm-6,.semi-rtl .semi-col-sm-7,.semi-rtl .semi-col-sm-8,.semi-rtl .semi-col-sm-9,.semi-rtl .semi-col-sm-10,.semi-rtl .semi-col-sm-11,.semi-rtl .semi-col-sm-12,.semi-rtl .semi-col-sm-13,.semi-rtl .semi-col-sm-14,.semi-rtl .semi-col-sm-15,.semi-rtl .semi-col-sm-16,.semi-rtl .semi-col-sm-17,.semi-rtl .semi-col-sm-18,.semi-rtl .semi-col-sm-19,.semi-rtl .semi-col-sm-20,.semi-rtl .semi-col-sm-21,.semi-rtl .semi-col-sm-22,.semi-rtl .semi-col-sm-23,.semi-rtl .semi-col-sm-24{float:right}.semi-rtl .semi-col-sm-offset-1{margin-left:auto;margin-right:4.1666666667%}.semi-rtl .semi-col-sm-offset-2{margin-left:auto;margin-right:8.3333333333%}.semi-rtl .semi-col-sm-offset-3{margin-left:auto;margin-right:12.5%}.semi-rtl .semi-col-sm-offset-4{margin-left:auto;margin-right:16.6666666667%}.semi-rtl .semi-col-sm-offset-5{margin-left:auto;margin-right:20.8333333333%}.semi-rtl .semi-col-sm-offset-6{margin-left:auto;margin-right:25%}.semi-rtl .semi-col-sm-offset-7{margin-left:auto;margin-right:29.1666666667%}.semi-rtl .semi-col-sm-offset-8{margin-left:auto;margin-right:33.3333333333%}.semi-rtl .semi-col-sm-offset-9{margin-left:auto;margin-right:37.5%}.semi-rtl .semi-col-sm-offset-10{margin-left:auto;margin-right:41.6666666667%}.semi-rtl .semi-col-sm-offset-11{margin-left:auto;margin-right:45.8333333333%}.semi-rtl .semi-col-sm-offset-12{margin-left:auto;margin-right:50%}.semi-rtl .semi-col-sm-offset-13{margin-left:auto;margin-right:54.1666666667%}.semi-rtl .semi-col-sm-offset-14{margin-left:auto;margin-right:58.3333333333%}.semi-rtl .semi-col-sm-offset-15{margin-left:auto;margin-right:62.5%}.semi-rtl .semi-col-sm-offset-16{margin-left:auto;margin-right:66.6666666667%}.semi-rtl .semi-col-sm-offset-17{margin-left:auto;margin-right:70.8333333333%}.semi-rtl .semi-col-sm-offset-18{margin-left:auto;margin-right:75%}.semi-rtl .semi-col-sm-offset-19{margin-left:auto;margin-right:79.1666666667%}.semi-rtl .semi-col-sm-offset-20{margin-left:auto;margin-right:83.3333333333%}.semi-rtl .semi-col-sm-offset-21{margin-left:auto;margin-right:87.5%}.semi-rtl .semi-col-sm-offset-22{margin-left:auto;margin-right:91.6666666667%}.semi-rtl .semi-col-sm-offset-23{margin-left:auto;margin-right:95.8333333333%}.semi-rtl .semi-col-sm-offset-24{margin-left:auto;margin-right:100%}}@media(min-width:768px){.semi-col-md-1,.semi-col-md-2,.semi-col-md-3,.semi-col-md-4,.semi-col-md-5,.semi-col-md-6,.semi-col-md-7,.semi-col-md-8,.semi-col-md-9,.semi-col-md-10,.semi-col-md-11,.semi-col-md-12,.semi-col-md-13,.semi-col-md-14,.semi-col-md-15,.semi-col-md-16,.semi-col-md-17,.semi-col-md-18,.semi-col-md-19,.semi-col-md-20,.semi-col-md-21,.semi-col-md-22,.semi-col-md-23,.semi-col-md-24{flex:0 0 auto;float:left}.semi-col-md-1{display:block;box-sizing:border-box;width:4.1666666667%}.semi-col-md-push-1{left:4.1666666667%}.semi-col-md-pull-1{right:4.1666666667%}.semi-col-md-offset-1{margin-left:4.1666666667%}.semi-col-md-order-1{order:1}.semi-col-md-2{display:block;box-sizing:border-box;width:8.3333333333%}.semi-col-md-push-2{left:8.3333333333%}.semi-col-md-pull-2{right:8.3333333333%}.semi-col-md-offset-2{margin-left:8.3333333333%}.semi-col-md-order-2{order:2}.semi-col-md-3{display:block;box-sizing:border-box;width:12.5%}.semi-col-md-push-3{left:12.5%}.semi-col-md-pull-3{right:12.5%}.semi-col-md-offset-3{margin-left:12.5%}.semi-col-md-order-3{order:3}.semi-col-md-4{display:block;box-sizing:border-box;width:16.6666666667%}.semi-col-md-push-4{left:16.6666666667%}.semi-col-md-pull-4{right:16.6666666667%}.semi-col-md-offset-4{margin-left:16.6666666667%}.semi-col-md-order-4{order:4}.semi-col-md-5{display:block;box-sizing:border-box;width:20.8333333333%}.semi-col-md-push-5{left:20.8333333333%}.semi-col-md-pull-5{right:20.8333333333%}.semi-col-md-offset-5{margin-left:20.8333333333%}.semi-col-md-order-5{order:5}.semi-col-md-6{display:block;box-sizing:border-box;width:25%}.semi-col-md-push-6{left:25%}.semi-col-md-pull-6{right:25%}.semi-col-md-offset-6{margin-left:25%}.semi-col-md-order-6{order:6}.semi-col-md-7{display:block;box-sizing:border-box;width:29.1666666667%}.semi-col-md-push-7{left:29.1666666667%}.semi-col-md-pull-7{right:29.1666666667%}.semi-col-md-offset-7{margin-left:29.1666666667%}.semi-col-md-order-7{order:7}.semi-col-md-8{display:block;box-sizing:border-box;width:33.3333333333%}.semi-col-md-push-8{left:33.3333333333%}.semi-col-md-pull-8{right:33.3333333333%}.semi-col-md-offset-8{margin-left:33.3333333333%}.semi-col-md-order-8{order:8}.semi-col-md-9{display:block;box-sizing:border-box;width:37.5%}.semi-col-md-push-9{left:37.5%}.semi-col-md-pull-9{right:37.5%}.semi-col-md-offset-9{margin-left:37.5%}.semi-col-md-order-9{order:9}.semi-col-md-10{display:block;box-sizing:border-box;width:41.6666666667%}.semi-col-md-push-10{left:41.6666666667%}.semi-col-md-pull-10{right:41.6666666667%}.semi-col-md-offset-10{margin-left:41.6666666667%}.semi-col-md-order-10{order:10}.semi-col-md-11{display:block;box-sizing:border-box;width:45.8333333333%}.semi-col-md-push-11{left:45.8333333333%}.semi-col-md-pull-11{right:45.8333333333%}.semi-col-md-offset-11{margin-left:45.8333333333%}.semi-col-md-order-11{order:11}.semi-col-md-12{display:block;box-sizing:border-box;width:50%}.semi-col-md-push-12{left:50%}.semi-col-md-pull-12{right:50%}.semi-col-md-offset-12{margin-left:50%}.semi-col-md-order-12{order:12}.semi-col-md-13{display:block;box-sizing:border-box;width:54.1666666667%}.semi-col-md-push-13{left:54.1666666667%}.semi-col-md-pull-13{right:54.1666666667%}.semi-col-md-offset-13{margin-left:54.1666666667%}.semi-col-md-order-13{order:13}.semi-col-md-14{display:block;box-sizing:border-box;width:58.3333333333%}.semi-col-md-push-14{left:58.3333333333%}.semi-col-md-pull-14{right:58.3333333333%}.semi-col-md-offset-14{margin-left:58.3333333333%}.semi-col-md-order-14{order:14}.semi-col-md-15{display:block;box-sizing:border-box;width:62.5%}.semi-col-md-push-15{left:62.5%}.semi-col-md-pull-15{right:62.5%}.semi-col-md-offset-15{margin-left:62.5%}.semi-col-md-order-15{order:15}.semi-col-md-16{display:block;box-sizing:border-box;width:66.6666666667%}.semi-col-md-push-16{left:66.6666666667%}.semi-col-md-pull-16{right:66.6666666667%}.semi-col-md-offset-16{margin-left:66.6666666667%}.semi-col-md-order-16{order:16}.semi-col-md-17{display:block;box-sizing:border-box;width:70.8333333333%}.semi-col-md-push-17{left:70.8333333333%}.semi-col-md-pull-17{right:70.8333333333%}.semi-col-md-offset-17{margin-left:70.8333333333%}.semi-col-md-order-17{order:17}.semi-col-md-18{display:block;box-sizing:border-box;width:75%}.semi-col-md-push-18{left:75%}.semi-col-md-pull-18{right:75%}.semi-col-md-offset-18{margin-left:75%}.semi-col-md-order-18{order:18}.semi-col-md-19{display:block;box-sizing:border-box;width:79.1666666667%}.semi-col-md-push-19{left:79.1666666667%}.semi-col-md-pull-19{right:79.1666666667%}.semi-col-md-offset-19{margin-left:79.1666666667%}.semi-col-md-order-19{order:19}.semi-col-md-20{display:block;box-sizing:border-box;width:83.3333333333%}.semi-col-md-push-20{left:83.3333333333%}.semi-col-md-pull-20{right:83.3333333333%}.semi-col-md-offset-20{margin-left:83.3333333333%}.semi-col-md-order-20{order:20}.semi-col-md-21{display:block;box-sizing:border-box;width:87.5%}.semi-col-md-push-21{left:87.5%}.semi-col-md-pull-21{right:87.5%}.semi-col-md-offset-21{margin-left:87.5%}.semi-col-md-order-21{order:21}.semi-col-md-22{display:block;box-sizing:border-box;width:91.6666666667%}.semi-col-md-push-22{left:91.6666666667%}.semi-col-md-pull-22{right:91.6666666667%}.semi-col-md-offset-22{margin-left:91.6666666667%}.semi-col-md-order-22{order:22}.semi-col-md-23{display:block;box-sizing:border-box;width:95.8333333333%}.semi-col-md-push-23{left:95.8333333333%}.semi-col-md-pull-23{right:95.8333333333%}.semi-col-md-offset-23{margin-left:95.8333333333%}.semi-col-md-order-23{order:23}.semi-col-md-24{display:block;box-sizing:border-box;width:100%}.semi-col-md-push-24{left:100%}.semi-col-md-pull-24{right:100%}.semi-col-md-offset-24{margin-left:100%}.semi-col-md-order-24{order:24}.semi-rtl .semi-col-md-1,.semi-rtl .semi-col-md-2,.semi-rtl .semi-col-md-3,.semi-rtl .semi-col-md-4,.semi-rtl .semi-col-md-5,.semi-rtl .semi-col-md-6,.semi-rtl .semi-col-md-7,.semi-rtl .semi-col-md-8,.semi-rtl .semi-col-md-9,.semi-rtl .semi-col-md-10,.semi-rtl .semi-col-md-11,.semi-rtl .semi-col-md-12,.semi-rtl .semi-col-md-13,.semi-rtl .semi-col-md-14,.semi-rtl .semi-col-md-15,.semi-rtl .semi-col-md-16,.semi-rtl .semi-col-md-17,.semi-rtl .semi-col-md-18,.semi-rtl .semi-col-md-19,.semi-rtl .semi-col-md-20,.semi-rtl .semi-col-md-21,.semi-rtl .semi-col-md-22,.semi-rtl .semi-col-md-23,.semi-rtl .semi-col-md-24{float:right}.semi-rtl .semi-col-md-offset-1{margin-left:auto;margin-right:4.1666666667%}.semi-rtl .semi-col-md-offset-2{margin-left:auto;margin-right:8.3333333333%}.semi-rtl .semi-col-md-offset-3{margin-left:auto;margin-right:12.5%}.semi-rtl .semi-col-md-offset-4{margin-left:auto;margin-right:16.6666666667%}.semi-rtl .semi-col-md-offset-5{margin-left:auto;margin-right:20.8333333333%}.semi-rtl .semi-col-md-offset-6{margin-left:auto;margin-right:25%}.semi-rtl .semi-col-md-offset-7{margin-left:auto;margin-right:29.1666666667%}.semi-rtl .semi-col-md-offset-8{margin-left:auto;margin-right:33.3333333333%}.semi-rtl .semi-col-md-offset-9{margin-left:auto;margin-right:37.5%}.semi-rtl .semi-col-md-offset-10{margin-left:auto;margin-right:41.6666666667%}.semi-rtl .semi-col-md-offset-11{margin-left:auto;margin-right:45.8333333333%}.semi-rtl .semi-col-md-offset-12{margin-left:auto;margin-right:50%}.semi-rtl .semi-col-md-offset-13{margin-left:auto;margin-right:54.1666666667%}.semi-rtl .semi-col-md-offset-14{margin-left:auto;margin-right:58.3333333333%}.semi-rtl .semi-col-md-offset-15{margin-left:auto;margin-right:62.5%}.semi-rtl .semi-col-md-offset-16{margin-left:auto;margin-right:66.6666666667%}.semi-rtl .semi-col-md-offset-17{margin-left:auto;margin-right:70.8333333333%}.semi-rtl .semi-col-md-offset-18{margin-left:auto;margin-right:75%}.semi-rtl .semi-col-md-offset-19{margin-left:auto;margin-right:79.1666666667%}.semi-rtl .semi-col-md-offset-20{margin-left:auto;margin-right:83.3333333333%}.semi-rtl .semi-col-md-offset-21{margin-left:auto;margin-right:87.5%}.semi-rtl .semi-col-md-offset-22{margin-left:auto;margin-right:91.6666666667%}.semi-rtl .semi-col-md-offset-23{margin-left:auto;margin-right:95.8333333333%}.semi-rtl .semi-col-md-offset-24{margin-left:auto;margin-right:100%}}@media(min-width:992px){.semi-col-lg-1,.semi-col-lg-2,.semi-col-lg-3,.semi-col-lg-4,.semi-col-lg-5,.semi-col-lg-6,.semi-col-lg-7,.semi-col-lg-8,.semi-col-lg-9,.semi-col-lg-10,.semi-col-lg-11,.semi-col-lg-12,.semi-col-lg-13,.semi-col-lg-14,.semi-col-lg-15,.semi-col-lg-16,.semi-col-lg-17,.semi-col-lg-18,.semi-col-lg-19,.semi-col-lg-20,.semi-col-lg-21,.semi-col-lg-22,.semi-col-lg-23,.semi-col-lg-24{flex:0 0 auto;float:left}.semi-col-lg-1{display:block;box-sizing:border-box;width:4.1666666667%}.semi-col-lg-push-1{left:4.1666666667%}.semi-col-lg-pull-1{right:4.1666666667%}.semi-col-lg-offset-1{margin-left:4.1666666667%}.semi-col-lg-order-1{order:1}.semi-col-lg-2{display:block;box-sizing:border-box;width:8.3333333333%}.semi-col-lg-push-2{left:8.3333333333%}.semi-col-lg-pull-2{right:8.3333333333%}.semi-col-lg-offset-2{margin-left:8.3333333333%}.semi-col-lg-order-2{order:2}.semi-col-lg-3{display:block;box-sizing:border-box;width:12.5%}.semi-col-lg-push-3{left:12.5%}.semi-col-lg-pull-3{right:12.5%}.semi-col-lg-offset-3{margin-left:12.5%}.semi-col-lg-order-3{order:3}.semi-col-lg-4{display:block;box-sizing:border-box;width:16.6666666667%}.semi-col-lg-push-4{left:16.6666666667%}.semi-col-lg-pull-4{right:16.6666666667%}.semi-col-lg-offset-4{margin-left:16.6666666667%}.semi-col-lg-order-4{order:4}.semi-col-lg-5{display:block;box-sizing:border-box;width:20.8333333333%}.semi-col-lg-push-5{left:20.8333333333%}.semi-col-lg-pull-5{right:20.8333333333%}.semi-col-lg-offset-5{margin-left:20.8333333333%}.semi-col-lg-order-5{order:5}.semi-col-lg-6{display:block;box-sizing:border-box;width:25%}.semi-col-lg-push-6{left:25%}.semi-col-lg-pull-6{right:25%}.semi-col-lg-offset-6{margin-left:25%}.semi-col-lg-order-6{order:6}.semi-col-lg-7{display:block;box-sizing:border-box;width:29.1666666667%}.semi-col-lg-push-7{left:29.1666666667%}.semi-col-lg-pull-7{right:29.1666666667%}.semi-col-lg-offset-7{margin-left:29.1666666667%}.semi-col-lg-order-7{order:7}.semi-col-lg-8{display:block;box-sizing:border-box;width:33.3333333333%}.semi-col-lg-push-8{left:33.3333333333%}.semi-col-lg-pull-8{right:33.3333333333%}.semi-col-lg-offset-8{margin-left:33.3333333333%}.semi-col-lg-order-8{order:8}.semi-col-lg-9{display:block;box-sizing:border-box;width:37.5%}.semi-col-lg-push-9{left:37.5%}.semi-col-lg-pull-9{right:37.5%}.semi-col-lg-offset-9{margin-left:37.5%}.semi-col-lg-order-9{order:9}.semi-col-lg-10{display:block;box-sizing:border-box;width:41.6666666667%}.semi-col-lg-push-10{left:41.6666666667%}.semi-col-lg-pull-10{right:41.6666666667%}.semi-col-lg-offset-10{margin-left:41.6666666667%}.semi-col-lg-order-10{order:10}.semi-col-lg-11{display:block;box-sizing:border-box;width:45.8333333333%}.semi-col-lg-push-11{left:45.8333333333%}.semi-col-lg-pull-11{right:45.8333333333%}.semi-col-lg-offset-11{margin-left:45.8333333333%}.semi-col-lg-order-11{order:11}.semi-col-lg-12{display:block;box-sizing:border-box;width:50%}.semi-col-lg-push-12{left:50%}.semi-col-lg-pull-12{right:50%}.semi-col-lg-offset-12{margin-left:50%}.semi-col-lg-order-12{order:12}.semi-col-lg-13{display:block;box-sizing:border-box;width:54.1666666667%}.semi-col-lg-push-13{left:54.1666666667%}.semi-col-lg-pull-13{right:54.1666666667%}.semi-col-lg-offset-13{margin-left:54.1666666667%}.semi-col-lg-order-13{order:13}.semi-col-lg-14{display:block;box-sizing:border-box;width:58.3333333333%}.semi-col-lg-push-14{left:58.3333333333%}.semi-col-lg-pull-14{right:58.3333333333%}.semi-col-lg-offset-14{margin-left:58.3333333333%}.semi-col-lg-order-14{order:14}.semi-col-lg-15{display:block;box-sizing:border-box;width:62.5%}.semi-col-lg-push-15{left:62.5%}.semi-col-lg-pull-15{right:62.5%}.semi-col-lg-offset-15{margin-left:62.5%}.semi-col-lg-order-15{order:15}.semi-col-lg-16{display:block;box-sizing:border-box;width:66.6666666667%}.semi-col-lg-push-16{left:66.6666666667%}.semi-col-lg-pull-16{right:66.6666666667%}.semi-col-lg-offset-16{margin-left:66.6666666667%}.semi-col-lg-order-16{order:16}.semi-col-lg-17{display:block;box-sizing:border-box;width:70.8333333333%}.semi-col-lg-push-17{left:70.8333333333%}.semi-col-lg-pull-17{right:70.8333333333%}.semi-col-lg-offset-17{margin-left:70.8333333333%}.semi-col-lg-order-17{order:17}.semi-col-lg-18{display:block;box-sizing:border-box;width:75%}.semi-col-lg-push-18{left:75%}.semi-col-lg-pull-18{right:75%}.semi-col-lg-offset-18{margin-left:75%}.semi-col-lg-order-18{order:18}.semi-col-lg-19{display:block;box-sizing:border-box;width:79.1666666667%}.semi-col-lg-push-19{left:79.1666666667%}.semi-col-lg-pull-19{right:79.1666666667%}.semi-col-lg-offset-19{margin-left:79.1666666667%}.semi-col-lg-order-19{order:19}.semi-col-lg-20{display:block;box-sizing:border-box;width:83.3333333333%}.semi-col-lg-push-20{left:83.3333333333%}.semi-col-lg-pull-20{right:83.3333333333%}.semi-col-lg-offset-20{margin-left:83.3333333333%}.semi-col-lg-order-20{order:20}.semi-col-lg-21{display:block;box-sizing:border-box;width:87.5%}.semi-col-lg-push-21{left:87.5%}.semi-col-lg-pull-21{right:87.5%}.semi-col-lg-offset-21{margin-left:87.5%}.semi-col-lg-order-21{order:21}.semi-col-lg-22{display:block;box-sizing:border-box;width:91.6666666667%}.semi-col-lg-push-22{left:91.6666666667%}.semi-col-lg-pull-22{right:91.6666666667%}.semi-col-lg-offset-22{margin-left:91.6666666667%}.semi-col-lg-order-22{order:22}.semi-col-lg-23{display:block;box-sizing:border-box;width:95.8333333333%}.semi-col-lg-push-23{left:95.8333333333%}.semi-col-lg-pull-23{right:95.8333333333%}.semi-col-lg-offset-23{margin-left:95.8333333333%}.semi-col-lg-order-23{order:23}.semi-col-lg-24{display:block;box-sizing:border-box;width:100%}.semi-col-lg-push-24{left:100%}.semi-col-lg-pull-24{right:100%}.semi-col-lg-offset-24{margin-left:100%}.semi-col-lg-order-24{order:24}.semi-rtl .semi-col-lg-1,.semi-rtl .semi-col-lg-2,.semi-rtl .semi-col-lg-3,.semi-rtl .semi-col-lg-4,.semi-rtl .semi-col-lg-5,.semi-rtl .semi-col-lg-6,.semi-rtl .semi-col-lg-7,.semi-rtl .semi-col-lg-8,.semi-rtl .semi-col-lg-9,.semi-rtl .semi-col-lg-10,.semi-rtl .semi-col-lg-11,.semi-rtl .semi-col-lg-12,.semi-rtl .semi-col-lg-13,.semi-rtl .semi-col-lg-14,.semi-rtl .semi-col-lg-15,.semi-rtl .semi-col-lg-16,.semi-rtl .semi-col-lg-17,.semi-rtl .semi-col-lg-18,.semi-rtl .semi-col-lg-19,.semi-rtl .semi-col-lg-20,.semi-rtl .semi-col-lg-21,.semi-rtl .semi-col-lg-22,.semi-rtl .semi-col-lg-23,.semi-rtl .semi-col-lg-24{float:right}.semi-rtl .semi-col-lg-offset-1{margin-left:auto;margin-right:4.1666666667%}.semi-rtl .semi-col-lg-offset-2{margin-left:auto;margin-right:8.3333333333%}.semi-rtl .semi-col-lg-offset-3{margin-left:auto;margin-right:12.5%}.semi-rtl .semi-col-lg-offset-4{margin-left:auto;margin-right:16.6666666667%}.semi-rtl .semi-col-lg-offset-5{margin-left:auto;margin-right:20.8333333333%}.semi-rtl .semi-col-lg-offset-6{margin-left:auto;margin-right:25%}.semi-rtl .semi-col-lg-offset-7{margin-left:auto;margin-right:29.1666666667%}.semi-rtl .semi-col-lg-offset-8{margin-left:auto;margin-right:33.3333333333%}.semi-rtl .semi-col-lg-offset-9{margin-left:auto;margin-right:37.5%}.semi-rtl .semi-col-lg-offset-10{margin-left:auto;margin-right:41.6666666667%}.semi-rtl .semi-col-lg-offset-11{margin-left:auto;margin-right:45.8333333333%}.semi-rtl .semi-col-lg-offset-12{margin-left:auto;margin-right:50%}.semi-rtl .semi-col-lg-offset-13{margin-left:auto;margin-right:54.1666666667%}.semi-rtl .semi-col-lg-offset-14{margin-left:auto;margin-right:58.3333333333%}.semi-rtl .semi-col-lg-offset-15{margin-left:auto;margin-right:62.5%}.semi-rtl .semi-col-lg-offset-16{margin-left:auto;margin-right:66.6666666667%}.semi-rtl .semi-col-lg-offset-17{margin-left:auto;margin-right:70.8333333333%}.semi-rtl .semi-col-lg-offset-18{margin-left:auto;margin-right:75%}.semi-rtl .semi-col-lg-offset-19{margin-left:auto;margin-right:79.1666666667%}.semi-rtl .semi-col-lg-offset-20{margin-left:auto;margin-right:83.3333333333%}.semi-rtl .semi-col-lg-offset-21{margin-left:auto;margin-right:87.5%}.semi-rtl .semi-col-lg-offset-22{margin-left:auto;margin-right:91.6666666667%}.semi-rtl .semi-col-lg-offset-23{margin-left:auto;margin-right:95.8333333333%}.semi-rtl .semi-col-lg-offset-24{margin-left:auto;margin-right:100%}}@media(min-width:1200px){.semi-col-xl-1,.semi-col-xl-2,.semi-col-xl-3,.semi-col-xl-4,.semi-col-xl-5,.semi-col-xl-6,.semi-col-xl-7,.semi-col-xl-8,.semi-col-xl-9,.semi-col-xl-10,.semi-col-xl-11,.semi-col-xl-12,.semi-col-xl-13,.semi-col-xl-14,.semi-col-xl-15,.semi-col-xl-16,.semi-col-xl-17,.semi-col-xl-18,.semi-col-xl-19,.semi-col-xl-20,.semi-col-xl-21,.semi-col-xl-22,.semi-col-xl-23,.semi-col-xl-24{flex:0 0 auto;float:left}.semi-col-xl-1{display:block;box-sizing:border-box;width:4.1666666667%}.semi-col-xl-push-1{left:4.1666666667%}.semi-col-xl-pull-1{right:4.1666666667%}.semi-col-xl-offset-1{margin-left:4.1666666667%}.semi-col-xl-order-1{order:1}.semi-col-xl-2{display:block;box-sizing:border-box;width:8.3333333333%}.semi-col-xl-push-2{left:8.3333333333%}.semi-col-xl-pull-2{right:8.3333333333%}.semi-col-xl-offset-2{margin-left:8.3333333333%}.semi-col-xl-order-2{order:2}.semi-col-xl-3{display:block;box-sizing:border-box;width:12.5%}.semi-col-xl-push-3{left:12.5%}.semi-col-xl-pull-3{right:12.5%}.semi-col-xl-offset-3{margin-left:12.5%}.semi-col-xl-order-3{order:3}.semi-col-xl-4{display:block;box-sizing:border-box;width:16.6666666667%}.semi-col-xl-push-4{left:16.6666666667%}.semi-col-xl-pull-4{right:16.6666666667%}.semi-col-xl-offset-4{margin-left:16.6666666667%}.semi-col-xl-order-4{order:4}.semi-col-xl-5{display:block;box-sizing:border-box;width:20.8333333333%}.semi-col-xl-push-5{left:20.8333333333%}.semi-col-xl-pull-5{right:20.8333333333%}.semi-col-xl-offset-5{margin-left:20.8333333333%}.semi-col-xl-order-5{order:5}.semi-col-xl-6{display:block;box-sizing:border-box;width:25%}.semi-col-xl-push-6{left:25%}.semi-col-xl-pull-6{right:25%}.semi-col-xl-offset-6{margin-left:25%}.semi-col-xl-order-6{order:6}.semi-col-xl-7{display:block;box-sizing:border-box;width:29.1666666667%}.semi-col-xl-push-7{left:29.1666666667%}.semi-col-xl-pull-7{right:29.1666666667%}.semi-col-xl-offset-7{margin-left:29.1666666667%}.semi-col-xl-order-7{order:7}.semi-col-xl-8{display:block;box-sizing:border-box;width:33.3333333333%}.semi-col-xl-push-8{left:33.3333333333%}.semi-col-xl-pull-8{right:33.3333333333%}.semi-col-xl-offset-8{margin-left:33.3333333333%}.semi-col-xl-order-8{order:8}.semi-col-xl-9{display:block;box-sizing:border-box;width:37.5%}.semi-col-xl-push-9{left:37.5%}.semi-col-xl-pull-9{right:37.5%}.semi-col-xl-offset-9{margin-left:37.5%}.semi-col-xl-order-9{order:9}.semi-col-xl-10{display:block;box-sizing:border-box;width:41.6666666667%}.semi-col-xl-push-10{left:41.6666666667%}.semi-col-xl-pull-10{right:41.6666666667%}.semi-col-xl-offset-10{margin-left:41.6666666667%}.semi-col-xl-order-10{order:10}.semi-col-xl-11{display:block;box-sizing:border-box;width:45.8333333333%}.semi-col-xl-push-11{left:45.8333333333%}.semi-col-xl-pull-11{right:45.8333333333%}.semi-col-xl-offset-11{margin-left:45.8333333333%}.semi-col-xl-order-11{order:11}.semi-col-xl-12{display:block;box-sizing:border-box;width:50%}.semi-col-xl-push-12{left:50%}.semi-col-xl-pull-12{right:50%}.semi-col-xl-offset-12{margin-left:50%}.semi-col-xl-order-12{order:12}.semi-col-xl-13{display:block;box-sizing:border-box;width:54.1666666667%}.semi-col-xl-push-13{left:54.1666666667%}.semi-col-xl-pull-13{right:54.1666666667%}.semi-col-xl-offset-13{margin-left:54.1666666667%}.semi-col-xl-order-13{order:13}.semi-col-xl-14{display:block;box-sizing:border-box;width:58.3333333333%}.semi-col-xl-push-14{left:58.3333333333%}.semi-col-xl-pull-14{right:58.3333333333%}.semi-col-xl-offset-14{margin-left:58.3333333333%}.semi-col-xl-order-14{order:14}.semi-col-xl-15{display:block;box-sizing:border-box;width:62.5%}.semi-col-xl-push-15{left:62.5%}.semi-col-xl-pull-15{right:62.5%}.semi-col-xl-offset-15{margin-left:62.5%}.semi-col-xl-order-15{order:15}.semi-col-xl-16{display:block;box-sizing:border-box;width:66.6666666667%}.semi-col-xl-push-16{left:66.6666666667%}.semi-col-xl-pull-16{right:66.6666666667%}.semi-col-xl-offset-16{margin-left:66.6666666667%}.semi-col-xl-order-16{order:16}.semi-col-xl-17{display:block;box-sizing:border-box;width:70.8333333333%}.semi-col-xl-push-17{left:70.8333333333%}.semi-col-xl-pull-17{right:70.8333333333%}.semi-col-xl-offset-17{margin-left:70.8333333333%}.semi-col-xl-order-17{order:17}.semi-col-xl-18{display:block;box-sizing:border-box;width:75%}.semi-col-xl-push-18{left:75%}.semi-col-xl-pull-18{right:75%}.semi-col-xl-offset-18{margin-left:75%}.semi-col-xl-order-18{order:18}.semi-col-xl-19{display:block;box-sizing:border-box;width:79.1666666667%}.semi-col-xl-push-19{left:79.1666666667%}.semi-col-xl-pull-19{right:79.1666666667%}.semi-col-xl-offset-19{margin-left:79.1666666667%}.semi-col-xl-order-19{order:19}.semi-col-xl-20{display:block;box-sizing:border-box;width:83.3333333333%}.semi-col-xl-push-20{left:83.3333333333%}.semi-col-xl-pull-20{right:83.3333333333%}.semi-col-xl-offset-20{margin-left:83.3333333333%}.semi-col-xl-order-20{order:20}.semi-col-xl-21{display:block;box-sizing:border-box;width:87.5%}.semi-col-xl-push-21{left:87.5%}.semi-col-xl-pull-21{right:87.5%}.semi-col-xl-offset-21{margin-left:87.5%}.semi-col-xl-order-21{order:21}.semi-col-xl-22{display:block;box-sizing:border-box;width:91.6666666667%}.semi-col-xl-push-22{left:91.6666666667%}.semi-col-xl-pull-22{right:91.6666666667%}.semi-col-xl-offset-22{margin-left:91.6666666667%}.semi-col-xl-order-22{order:22}.semi-col-xl-23{display:block;box-sizing:border-box;width:95.8333333333%}.semi-col-xl-push-23{left:95.8333333333%}.semi-col-xl-pull-23{right:95.8333333333%}.semi-col-xl-offset-23{margin-left:95.8333333333%}.semi-col-xl-order-23{order:23}.semi-col-xl-24{display:block;box-sizing:border-box;width:100%}.semi-col-xl-push-24{left:100%}.semi-col-xl-pull-24{right:100%}.semi-col-xl-offset-24{margin-left:100%}.semi-col-xl-order-24{order:24}.semi-rtl .semi-col-xl-1,.semi-rtl .semi-col-xl-2,.semi-rtl .semi-col-xl-3,.semi-rtl .semi-col-xl-4,.semi-rtl .semi-col-xl-5,.semi-rtl .semi-col-xl-6,.semi-rtl .semi-col-xl-7,.semi-rtl .semi-col-xl-8,.semi-rtl .semi-col-xl-9,.semi-rtl .semi-col-xl-10,.semi-rtl .semi-col-xl-11,.semi-rtl .semi-col-xl-12,.semi-rtl .semi-col-xl-13,.semi-rtl .semi-col-xl-14,.semi-rtl .semi-col-xl-15,.semi-rtl .semi-col-xl-16,.semi-rtl .semi-col-xl-17,.semi-rtl .semi-col-xl-18,.semi-rtl .semi-col-xl-19,.semi-rtl .semi-col-xl-20,.semi-rtl .semi-col-xl-21,.semi-rtl .semi-col-xl-22,.semi-rtl .semi-col-xl-23,.semi-rtl .semi-col-xl-24{float:right}.semi-rtl .semi-col-xl-offset-1{margin-left:auto;margin-right:4.1666666667%}.semi-rtl .semi-col-xl-offset-2{margin-left:auto;margin-right:8.3333333333%}.semi-rtl .semi-col-xl-offset-3{margin-left:auto;margin-right:12.5%}.semi-rtl .semi-col-xl-offset-4{margin-left:auto;margin-right:16.6666666667%}.semi-rtl .semi-col-xl-offset-5{margin-left:auto;margin-right:20.8333333333%}.semi-rtl .semi-col-xl-offset-6{margin-left:auto;margin-right:25%}.semi-rtl .semi-col-xl-offset-7{margin-left:auto;margin-right:29.1666666667%}.semi-rtl .semi-col-xl-offset-8{margin-left:auto;margin-right:33.3333333333%}.semi-rtl .semi-col-xl-offset-9{margin-left:auto;margin-right:37.5%}.semi-rtl .semi-col-xl-offset-10{margin-left:auto;margin-right:41.6666666667%}.semi-rtl .semi-col-xl-offset-11{margin-left:auto;margin-right:45.8333333333%}.semi-rtl .semi-col-xl-offset-12{margin-left:auto;margin-right:50%}.semi-rtl .semi-col-xl-offset-13{margin-left:auto;margin-right:54.1666666667%}.semi-rtl .semi-col-xl-offset-14{margin-left:auto;margin-right:58.3333333333%}.semi-rtl .semi-col-xl-offset-15{margin-left:auto;margin-right:62.5%}.semi-rtl .semi-col-xl-offset-16{margin-left:auto;margin-right:66.6666666667%}.semi-rtl .semi-col-xl-offset-17{margin-left:auto;margin-right:70.8333333333%}.semi-rtl .semi-col-xl-offset-18{margin-left:auto;margin-right:75%}.semi-rtl .semi-col-xl-offset-19{margin-left:auto;margin-right:79.1666666667%}.semi-rtl .semi-col-xl-offset-20{margin-left:auto;margin-right:83.3333333333%}.semi-rtl .semi-col-xl-offset-21{margin-left:auto;margin-right:87.5%}.semi-rtl .semi-col-xl-offset-22{margin-left:auto;margin-right:91.6666666667%}.semi-rtl .semi-col-xl-offset-23{margin-left:auto;margin-right:95.8333333333%}.semi-rtl .semi-col-xl-offset-24{margin-left:auto;margin-right:100%}}@media(min-width:1600px){.semi-col-xxl-1,.semi-col-xxl-2,.semi-col-xxl-3,.semi-col-xxl-4,.semi-col-xxl-5,.semi-col-xxl-6,.semi-col-xxl-7,.semi-col-xxl-8,.semi-col-xxl-9,.semi-col-xxl-10,.semi-col-xxl-11,.semi-col-xxl-12,.semi-col-xxl-13,.semi-col-xxl-14,.semi-col-xxl-15,.semi-col-xxl-16,.semi-col-xxl-17,.semi-col-xxl-18,.semi-col-xxl-19,.semi-col-xxl-20,.semi-col-xxl-21,.semi-col-xxl-22,.semi-col-xxl-23,.semi-col-xxl-24{flex:0 0 auto;float:left}.semi-col-xxl-1{display:block;box-sizing:border-box;width:4.1666666667%}.semi-col-xxl-push-1{left:4.1666666667%}.semi-col-xxl-pull-1{right:4.1666666667%}.semi-col-xxl-offset-1{margin-left:4.1666666667%}.semi-col-xxl-order-1{order:1}.semi-col-xxl-2{display:block;box-sizing:border-box;width:8.3333333333%}.semi-col-xxl-push-2{left:8.3333333333%}.semi-col-xxl-pull-2{right:8.3333333333%}.semi-col-xxl-offset-2{margin-left:8.3333333333%}.semi-col-xxl-order-2{order:2}.semi-col-xxl-3{display:block;box-sizing:border-box;width:12.5%}.semi-col-xxl-push-3{left:12.5%}.semi-col-xxl-pull-3{right:12.5%}.semi-col-xxl-offset-3{margin-left:12.5%}.semi-col-xxl-order-3{order:3}.semi-col-xxl-4{display:block;box-sizing:border-box;width:16.6666666667%}.semi-col-xxl-push-4{left:16.6666666667%}.semi-col-xxl-pull-4{right:16.6666666667%}.semi-col-xxl-offset-4{margin-left:16.6666666667%}.semi-col-xxl-order-4{order:4}.semi-col-xxl-5{display:block;box-sizing:border-box;width:20.8333333333%}.semi-col-xxl-push-5{left:20.8333333333%}.semi-col-xxl-pull-5{right:20.8333333333%}.semi-col-xxl-offset-5{margin-left:20.8333333333%}.semi-col-xxl-order-5{order:5}.semi-col-xxl-6{display:block;box-sizing:border-box;width:25%}.semi-col-xxl-push-6{left:25%}.semi-col-xxl-pull-6{right:25%}.semi-col-xxl-offset-6{margin-left:25%}.semi-col-xxl-order-6{order:6}.semi-col-xxl-7{display:block;box-sizing:border-box;width:29.1666666667%}.semi-col-xxl-push-7{left:29.1666666667%}.semi-col-xxl-pull-7{right:29.1666666667%}.semi-col-xxl-offset-7{margin-left:29.1666666667%}.semi-col-xxl-order-7{order:7}.semi-col-xxl-8{display:block;box-sizing:border-box;width:33.3333333333%}.semi-col-xxl-push-8{left:33.3333333333%}.semi-col-xxl-pull-8{right:33.3333333333%}.semi-col-xxl-offset-8{margin-left:33.3333333333%}.semi-col-xxl-order-8{order:8}.semi-col-xxl-9{display:block;box-sizing:border-box;width:37.5%}.semi-col-xxl-push-9{left:37.5%}.semi-col-xxl-pull-9{right:37.5%}.semi-col-xxl-offset-9{margin-left:37.5%}.semi-col-xxl-order-9{order:9}.semi-col-xxl-10{display:block;box-sizing:border-box;width:41.6666666667%}.semi-col-xxl-push-10{left:41.6666666667%}.semi-col-xxl-pull-10{right:41.6666666667%}.semi-col-xxl-offset-10{margin-left:41.6666666667%}.semi-col-xxl-order-10{order:10}.semi-col-xxl-11{display:block;box-sizing:border-box;width:45.8333333333%}.semi-col-xxl-push-11{left:45.8333333333%}.semi-col-xxl-pull-11{right:45.8333333333%}.semi-col-xxl-offset-11{margin-left:45.8333333333%}.semi-col-xxl-order-11{order:11}.semi-col-xxl-12{display:block;box-sizing:border-box;width:50%}.semi-col-xxl-push-12{left:50%}.semi-col-xxl-pull-12{right:50%}.semi-col-xxl-offset-12{margin-left:50%}.semi-col-xxl-order-12{order:12}.semi-col-xxl-13{display:block;box-sizing:border-box;width:54.1666666667%}.semi-col-xxl-push-13{left:54.1666666667%}.semi-col-xxl-pull-13{right:54.1666666667%}.semi-col-xxl-offset-13{margin-left:54.1666666667%}.semi-col-xxl-order-13{order:13}.semi-col-xxl-14{display:block;box-sizing:border-box;width:58.3333333333%}.semi-col-xxl-push-14{left:58.3333333333%}.semi-col-xxl-pull-14{right:58.3333333333%}.semi-col-xxl-offset-14{margin-left:58.3333333333%}.semi-col-xxl-order-14{order:14}.semi-col-xxl-15{display:block;box-sizing:border-box;width:62.5%}.semi-col-xxl-push-15{left:62.5%}.semi-col-xxl-pull-15{right:62.5%}.semi-col-xxl-offset-15{margin-left:62.5%}.semi-col-xxl-order-15{order:15}.semi-col-xxl-16{display:block;box-sizing:border-box;width:66.6666666667%}.semi-col-xxl-push-16{left:66.6666666667%}.semi-col-xxl-pull-16{right:66.6666666667%}.semi-col-xxl-offset-16{margin-left:66.6666666667%}.semi-col-xxl-order-16{order:16}.semi-col-xxl-17{display:block;box-sizing:border-box;width:70.8333333333%}.semi-col-xxl-push-17{left:70.8333333333%}.semi-col-xxl-pull-17{right:70.8333333333%}.semi-col-xxl-offset-17{margin-left:70.8333333333%}.semi-col-xxl-order-17{order:17}.semi-col-xxl-18{display:block;box-sizing:border-box;width:75%}.semi-col-xxl-push-18{left:75%}.semi-col-xxl-pull-18{right:75%}.semi-col-xxl-offset-18{margin-left:75%}.semi-col-xxl-order-18{order:18}.semi-col-xxl-19{display:block;box-sizing:border-box;width:79.1666666667%}.semi-col-xxl-push-19{left:79.1666666667%}.semi-col-xxl-pull-19{right:79.1666666667%}.semi-col-xxl-offset-19{margin-left:79.1666666667%}.semi-col-xxl-order-19{order:19}.semi-col-xxl-20{display:block;box-sizing:border-box;width:83.3333333333%}.semi-col-xxl-push-20{left:83.3333333333%}.semi-col-xxl-pull-20{right:83.3333333333%}.semi-col-xxl-offset-20{margin-left:83.3333333333%}.semi-col-xxl-order-20{order:20}.semi-col-xxl-21{display:block;box-sizing:border-box;width:87.5%}.semi-col-xxl-push-21{left:87.5%}.semi-col-xxl-pull-21{right:87.5%}.semi-col-xxl-offset-21{margin-left:87.5%}.semi-col-xxl-order-21{order:21}.semi-col-xxl-22{display:block;box-sizing:border-box;width:91.6666666667%}.semi-col-xxl-push-22{left:91.6666666667%}.semi-col-xxl-pull-22{right:91.6666666667%}.semi-col-xxl-offset-22{margin-left:91.6666666667%}.semi-col-xxl-order-22{order:22}.semi-col-xxl-23{display:block;box-sizing:border-box;width:95.8333333333%}.semi-col-xxl-push-23{left:95.8333333333%}.semi-col-xxl-pull-23{right:95.8333333333%}.semi-col-xxl-offset-23{margin-left:95.8333333333%}.semi-col-xxl-order-23{order:23}.semi-col-xxl-24{display:block;box-sizing:border-box;width:100%}.semi-col-xxl-push-24{left:100%}.semi-col-xxl-pull-24{right:100%}.semi-col-xxl-offset-24{margin-left:100%}.semi-col-xxl-order-24{order:24}.semi-rtl .semi-col-xxl-1,.semi-rtl .semi-col-xxl-2,.semi-rtl .semi-col-xxl-3,.semi-rtl .semi-col-xxl-4,.semi-rtl .semi-col-xxl-5,.semi-rtl .semi-col-xxl-6,.semi-rtl .semi-col-xxl-7,.semi-rtl .semi-col-xxl-8,.semi-rtl .semi-col-xxl-9,.semi-rtl .semi-col-xxl-10,.semi-rtl .semi-col-xxl-11,.semi-rtl .semi-col-xxl-12,.semi-rtl .semi-col-xxl-13,.semi-rtl .semi-col-xxl-14,.semi-rtl .semi-col-xxl-15,.semi-rtl .semi-col-xxl-16,.semi-rtl .semi-col-xxl-17,.semi-rtl .semi-col-xxl-18,.semi-rtl .semi-col-xxl-19,.semi-rtl .semi-col-xxl-20,.semi-rtl .semi-col-xxl-21,.semi-rtl .semi-col-xxl-22,.semi-rtl .semi-col-xxl-23,.semi-rtl .semi-col-xxl-24{float:right}.semi-rtl .semi-col-xxl-offset-1{margin-left:auto;margin-right:4.1666666667%}.semi-rtl .semi-col-xxl-offset-2{margin-left:auto;margin-right:8.3333333333%}.semi-rtl .semi-col-xxl-offset-3{margin-left:auto;margin-right:12.5%}.semi-rtl .semi-col-xxl-offset-4{margin-left:auto;margin-right:16.6666666667%}.semi-rtl .semi-col-xxl-offset-5{margin-left:auto;margin-right:20.8333333333%}.semi-rtl .semi-col-xxl-offset-6{margin-left:auto;margin-right:25%}.semi-rtl .semi-col-xxl-offset-7{margin-left:auto;margin-right:29.1666666667%}.semi-rtl .semi-col-xxl-offset-8{margin-left:auto;margin-right:33.3333333333%}.semi-rtl .semi-col-xxl-offset-9{margin-left:auto;margin-right:37.5%}.semi-rtl .semi-col-xxl-offset-10{margin-left:auto;margin-right:41.6666666667%}.semi-rtl .semi-col-xxl-offset-11{margin-left:auto;margin-right:45.8333333333%}.semi-rtl .semi-col-xxl-offset-12{margin-left:auto;margin-right:50%}.semi-rtl .semi-col-xxl-offset-13{margin-left:auto;margin-right:54.1666666667%}.semi-rtl .semi-col-xxl-offset-14{margin-left:auto;margin-right:58.3333333333%}.semi-rtl .semi-col-xxl-offset-15{margin-left:auto;margin-right:62.5%}.semi-rtl .semi-col-xxl-offset-16{margin-left:auto;margin-right:66.6666666667%}.semi-rtl .semi-col-xxl-offset-17{margin-left:auto;margin-right:70.8333333333%}.semi-rtl .semi-col-xxl-offset-18{margin-left:auto;margin-right:75%}.semi-rtl .semi-col-xxl-offset-19{margin-left:auto;margin-right:79.1666666667%}.semi-rtl .semi-col-xxl-offset-20{margin-left:auto;margin-right:83.3333333333%}.semi-rtl .semi-col-xxl-offset-21{margin-left:auto;margin-right:87.5%}.semi-rtl .semi-col-xxl-offset-22{margin-left:auto;margin-right:91.6666666667%}.semi-rtl .semi-col-xxl-offset-23{margin-left:auto;margin-right:95.8333333333%}.semi-rtl .semi-col-xxl-offset-24{margin-left:auto;margin-right:100%}}.semi-rtl .semi-row,.semi-rtl .semi-row-flex,.semi-portal-rtl .semi-row,.semi-portal-rtl .semi-row-flex{direction:rtl}.semi-highlight-tag{color:var(--semi-color-highlight);background-color:var(--semi-color-highlight-bg);font-weight:600}.semi-hotKeys{box-sizing:border-box;position:relative;-webkit-user-select:none;user-select:none;white-space:nowrap;vertical-align:bottom;display:flex;justify-content:center;align-items:center;display:inline-flex}.semi-hotKeys-content{font-size:12px;line-height:16px;font-family:Inter,-apple-system,BlinkMacSystemFont,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Segoe UI,Helvetica Neue,Helvetica,Arial,sans-serif;border-radius:2px;height:20px;padding:2px 8px;border:1px;background-color:var(--semi-color-fill-0);color:var(--semi-color-text-2)}.semi-hotKeys-split{font-size:12px;line-height:16px;font-family:Inter,-apple-system,BlinkMacSystemFont,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Segoe UI,Helvetica Neue,Helvetica,Arial,sans-serif;margin:0 3px;color:var(--semi-color-text-0)}.semi-image{border-radius:var(--semi-border-radius-small);position:relative;display:inline-block;overflow:hidden}.semi-image img{max-width:none}.semi-image-tooltip-children-wrapper{display:inline-flex;width:fit-content;height:fit-content;vertical-align:middle}.semi-image-img{vertical-align:top;border-radius:inherit;-webkit-user-select:none;user-select:none}.semi-image-img-preview{cursor:zoom-in}.semi-image-img-error{opacity:0}.semi-image-overlay{position:absolute;top:0;left:0;width:100%;height:100%}.semi-image-status{width:100%;height:100%;display:flex;justify-content:center;align-items:center;border-radius:var(--semi-border-radius-small);background-color:var(--semi-color-fill-0);color:var(--semi-color-disabled-text)}.semi-image-preview{position:fixed;top:0;left:0;width:100%;height:100%;z-index:1070;background-color:var(--semi-color-overlay-bg);transition:opacity .5s;overflow:hidden}.semi-image-preview-popup{position:absolute}.semi-image-preview .semi-image-preview-hide{opacity:0}.semi-image-preview-icon{display:flex;justify-content:center;align-items:center;width:40px;height:40px;border-radius:50%;position:absolute;top:50%;transform:translateY(-50%);background:#000000bf;cursor:pointer;color:var(--semi-color-white)}.semi-image-preview-prev{left:24px}.semi-image-preview-next{right:24px}.semi-image-preview-header{position:absolute;top:0;left:0;right:0;font-weight:400;font-size:14px;line-height:20px;font-family:Inter,-apple-system,BlinkMacSystemFont,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Segoe UI,Helvetica Neue,Helvetica,Arial,sans-serif;color:var(--semi-color-white);height:60px;display:flex;justify-content:space-between;align-items:center;padding:0 24px;z-index:1;pointer-events:none}.semi-image-preview-header-title{flex:1}.semi-image-preview-header-close{display:flex;justify-content:center;align-items:center;cursor:pointer;width:30px;height:30px;border-radius:50%;pointer-events:auto}.semi-image-preview-header-close:hover{background-color:#000000bf}.semi-image-preview-footer{display:flex;align-items:center}.semi-image-preview-footer-content{padding:0 16px;background:#000000bf;border-radius:var(--semi-border-radius-medium);height:48px}.semi-image-preview-footer-wrapper{position:absolute;left:50%;bottom:16px;transform:translate(-50%)}.semi-image-preview-footer-page{-webkit-user-select:none;user-select:none;color:var(--semi-color-white);font-size:16px;line-height:22px;font-family:Inter,-apple-system,BlinkMacSystemFont,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Segoe UI,Helvetica Neue,Helvetica,Arial,sans-serif;margin:0 12px}.semi-image-preview-footer .semi-icon{color:var(--semi-color-white);cursor:pointer}.semi-image-preview-footer-gap{margin-left:16px}.semi-image-preview-footer .semi-slider{width:132px;padding:0 16px}.semi-image-preview-footer .semi-slider .semi-slider-rail{color:var(--semi-color-white);height:2px}.semi-image-preview-footer .semi-slider .semi-slider-track{height:2px}.semi-image-preview-footer .semi-slider .semi-slider-handle{width:16px;height:16px;margin-top:8px;box-sizing:border-box}.semi-image-preview-footer .semi-divider{background:#ffffff80;margin:0 16px}.semi-image-preview-footer .semi-image-preview-footer-disabled{color:#f9f9f959;cursor:default;pointer-events:none}.semi-image-preview-image{position:relative;height:100%;display:flex;justify-content:center;align-items:center}.semi-image-preview-image-img{position:absolute;transform:scaleZ(1) var(--semi-transform-rotate-none);z-index:0;-webkit-user-select:none;user-select:none}.semi-image-preview-image-spin{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%)}.semi-image-preview-image-spin .semi-spin-wrapper{color:#ccc}@keyframes spinner{to{transform:var(--semi-transform_rotate-clockwise360deg)}}img[src=""],img:not([src]){opacity:0}.semi-rtl .semi-image-preview,.semi-portal-rtl .semi-image-preview,.semi-rtl .semi-image-preview-group,.semi-portal-rtl .semi-image-preview-group{direction:rtl}.semi-rtl .semi-image-preview-prev,.semi-portal-rtl .semi-image-preview-prev{right:24px;left:auto;transform:var(--semi-transform_rotate-clockwise180deg)}.semi-rtl .semi-image-preview-next,.semi-portal-rtl .semi-image-preview-next{left:24px;right:auto;transform:var(--semi-transform_rotate-clockwise180deg)}.semi-rtl .semi-image-preview-footer-page,.semi-portal-rtl .semi-image-preview-footer-page{display:flex;direction:rtl}.semi-rtl .semi-image-preview-footer-gap,.semi-portal-rtl .semi-image-preview-footer-gap{margin-right:16px;margin-left:0}.semi-rtl .semi-image-preview-footer .semi-icon-chevron_left,.semi-portal-rtl .semi-image-preview-footer .semi-icon-chevron_left,.semi-rtl .semi-image-preview-footer .semi-icon-chevron_right,.semi-portal-rtl .semi-image-preview-footer .semi-icon-chevron_right{transform:var(--semi-transform_rotate-clockwise180deg)}@keyframes semi-input-active{0%{transform:scale(1)}to{transform:scale(.97)}}@keyframes semi-input-inactive{0%{transform:scale(.97)}to{transform:scale(1)}}.semi-input{transition:background-color var(--semi-transition_duration-none) var(--semi-transition_function-easeIn) var(--semi-transition_delay-none),border var(--semi-transition_duration-none) var(--semi-transition_function-easeIn) var(--semi-transition_delay-none);transform:scale(var(--semi-transform_scale-none))}.semi-input-wrapper{display:inline-block;position:relative;vertical-align:middle;box-shadow:none;font-size:14px;line-height:20px;font-family:Inter,-apple-system,BlinkMacSystemFont,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Segoe UI,Helvetica Neue,Helvetica,Arial,sans-serif;background-color:var(--semi-color-fill-0);border:1px rgba(0,0,0,0) solid;border-radius:var(--semi-border-radius-small);width:100%;outline:none;cursor:text;box-sizing:border-box;color:var(--semi-color-text-0);transition:background-color var(--semi-transition_duration-none) var(--semi-transition_function-easeIn) var(--semi-transition_delay-none),border var(--semi-transition_duration-none) var(--semi-transition_function-easeIn) var(--semi-transition_delay-none);transform:scale(var(--semi-transform_scale-none))}.semi-input-wrapper-default{height:32px;font-size:14px;line-height:20px;font-family:Inter,-apple-system,BlinkMacSystemFont,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Segoe UI,Helvetica Neue,Helvetica,Arial,sans-serif;line-height:30px}.semi-input-wrapper-small{height:24px;font-size:14px;line-height:20px;font-family:Inter,-apple-system,BlinkMacSystemFont,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Segoe UI,Helvetica Neue,Helvetica,Arial,sans-serif;line-height:22px}.semi-input-wrapper-large{height:40px;font-size:16px;line-height:22px;font-family:Inter,-apple-system,BlinkMacSystemFont,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Segoe UI,Helvetica Neue,Helvetica,Arial,sans-serif;line-height:38px}.semi-input-wrapper:hover{background-color:var(--semi-color-fill-1);border-color:#0000}.semi-input-wrapper-focus{background-color:var(--semi-color-fill-0);border:var(--semi-color-focus-border) solid 1px}.semi-input-wrapper-focus:hover{background-color:var(--semi-color-fill-0);border-color:var(--semi-color-focus-border)}.semi-input-wrapper-focus:active{background-color:var(--semi-color-fill-2);border-color:var(--semi-color-focus-border)}.semi-input-wrapper.semi-input-readonly{cursor:default}.semi-input-wrapper-error{background-color:var(--semi-color-danger-light-default);border-color:var(--semi-color-danger-light-default)}.semi-input-wrapper-error:hover{background-color:var(--semi-color-danger-light-hover);border-color:var(--semi-color-danger-light-hover)}.semi-input-wrapper-error.semi-input-wrapper-focus{background-color:var(--semi-color-danger-light-default);border-color:var(--semi-color-danger)}.semi-input-wrapper-error:active{background-color:var(--semi-color-danger-light-active);border-color:var(--semi-color-danger)}.semi-input-wrapper-warning{background-color:var(--semi-color-warning-light-default);border-color:var(--semi-color-warning-light-default)}.semi-input-wrapper-warning:hover{background-color:var(--semi-color-warning-light-hover);border-color:var(--semi-color-warning-light-hover)}.semi-input-wrapper-warning.semi-input-wrapper-focus{background-color:var(--semi-color-warning-light-default);border-color:var(--semi-color-warning)}.semi-input-wrapper-warning:active{background-color:var(--semi-color-warning-light-active);border-color:var(--semi-color-warning)}.semi-input-wrapper__with-prefix{display:inline-flex;align-items:center}.semi-input-wrapper__with-prefix .semi-input{padding-left:0}.semi-input-wrapper__with-suffix{display:inline-flex;align-items:center}.semi-input-wrapper__with-suffix .semi-input{padding-right:0}.semi-input-wrapper-clearable,.semi-input-wrapper-modebtn{display:inline-flex;align-items:center}.semi-input-wrapper-hidden{border:none}.semi-input-wrapper .semi-icon{color:var(--semi-color-text-2)}.semi-input-wrapper .semi-input-clearbtn,.semi-input-wrapper .semi-input-modebtn{color:var(--semi-color-primary-hover)}.semi-input-wrapper .semi-input-clearbtn>svg,.semi-input-wrapper .semi-input-modebtn>svg{pointer-events:none}.semi-input-wrapper .semi-input-clearbtn:hover,.semi-input-wrapper .semi-input-modebtn:hover{cursor:pointer}.semi-input-wrapper .semi-input-clearbtn:hover .semi-icon,.semi-input-wrapper .semi-input-modebtn:hover .semi-icon{color:var(--semi-color-primary-hover)}.semi-input-wrapper .semi-input-clearbtn:focus-visible,.semi-input-wrapper .semi-input-modebtn:focus-visible{border-radius:var(--semi-border-radius-small);outline:2px solid var(--semi-color-primary-light-active);outline-offset:-1px}.semi-input-wrapper__with-suffix-icon.semi-input-wrapper-clearable:not(.semi-input-wrapper__with-suffix-hidden) .semi-input-clearbtn{min-width:24px;justify-content:flex-end}.semi-input-wrapper-modebtn.semi-input-wrapper-clearable .semi-input-clearbtn{min-width:16px;justify-content:center}.semi-input-wrapper.semi-input-wrapper__with-append-only .semi-input{border-radius:0 var(--semi-border-radius-small) var(--semi-border-radius-small) 0}.semi-input-wrapper.semi-input-wrapper__with-append-only .semi-input:not(:last-child){border-right-style:none;border-radius:0}.semi-input-wrapper.semi-input-wrapper__with-prepend-only .semi-input{border-radius:var(--semi-border-radius-small) 0 0 var(--semi-border-radius-small)}.semi-input-wrapper.semi-input-wrapper__with-prepend-only .semi-input:not(:last-child){border-right-style:none}.semi-input-wrapper.semi-input-wrapper__with-prepend,.semi-input-wrapper.semi-input-wrapper__with-append{display:inline-flex;align-items:center;background-color:#0000}.semi-input-wrapper.semi-input-wrapper__with-prepend:hover,.semi-input-wrapper.semi-input-wrapper__with-append:hover{background-color:#0000}.semi-input-wrapper.semi-input-wrapper__with-prepend.semi-input-wrapper-focus,.semi-input-wrapper.semi-input-wrapper__with-append.semi-input-wrapper-focus{border:1px rgba(0,0,0,0) solid;background-color:#0000}.semi-input-wrapper.semi-input-wrapper__with-prepend .semi-input,.semi-input-wrapper.semi-input-wrapper__with-append .semi-input{background-color:var(--semi-color-fill-0);border:1px rgba(0,0,0,0) solid}.semi-input-wrapper.semi-input-wrapper__with-prepend .semi-input:hover,.semi-input-wrapper.semi-input-wrapper__with-append .semi-input:hover{background-color:var(--semi-color-fill-1)}.semi-input-wrapper.semi-input-wrapper__with-prepend .semi-input:hover+.semi-input-clearbtn,.semi-input-wrapper.semi-input-wrapper__with-prepend .semi-input:hover~.semi-input-modebtn,.semi-input-wrapper.semi-input-wrapper__with-append .semi-input:hover+.semi-input-clearbtn,.semi-input-wrapper.semi-input-wrapper__with-append .semi-input:hover~.semi-input-modebtn{background-color:var(--semi-color-fill-1)}.semi-input-wrapper.semi-input-wrapper__with-prepend .semi-input:focus,.semi-input-wrapper.semi-input-wrapper__with-append .semi-input:focus{border:1px var(--semi-color-focus-border) solid;background-color:var(--semi-color-fill-0)}.semi-input-wrapper.semi-input-wrapper__with-prepend .semi-input:focus.semi-input-sibling-clearbtn,.semi-input-wrapper.semi-input-wrapper__with-prepend .semi-input:focus.semi-input-sibling-modebtn,.semi-input-wrapper.semi-input-wrapper__with-append .semi-input:focus.semi-input-sibling-clearbtn,.semi-input-wrapper.semi-input-wrapper__with-append .semi-input:focus.semi-input-sibling-modebtn{border-right-style:none}.semi-input-wrapper.semi-input-wrapper__with-prepend .semi-input:focus.semi-input-sibling-modebtn+.semi-input-clearbtn,.semi-input-wrapper.semi-input-wrapper__with-append .semi-input:focus.semi-input-sibling-modebtn+.semi-input-clearbtn{border-right-style:none}.semi-input-wrapper.semi-input-wrapper__with-prepend .semi-input:focus+.semi-input-clearbtn,.semi-input-wrapper.semi-input-wrapper__with-prepend .semi-input:focus~.semi-input-modebtn,.semi-input-wrapper.semi-input-wrapper__with-append .semi-input:focus+.semi-input-clearbtn,.semi-input-wrapper.semi-input-wrapper__with-append .semi-input:focus~.semi-input-modebtn{box-sizing:border-box;background-color:var(--semi-color-fill-0)}.semi-input-wrapper.semi-input-wrapper__with-prepend .semi-input:focus+.semi-input-clearbtn,.semi-input-wrapper.semi-input-wrapper__with-append .semi-input:focus+.semi-input-clearbtn{border:1px var(--semi-color-focus-border) solid;border-radius:0 var(--semi-border-radius-small) var(--semi-border-radius-small) 0;border-left-style:none}.semi-input-wrapper.semi-input-wrapper__with-prepend .semi-input:focus+.semi-input-clearbtn:not(:last-child),.semi-input-wrapper.semi-input-wrapper__with-append .semi-input:focus+.semi-input-clearbtn:not(:last-child){border-radius:0}.semi-input-wrapper.semi-input-wrapper__with-prepend .semi-input:focus~.semi-input-modebtn,.semi-input-wrapper.semi-input-wrapper__with-append .semi-input:focus~.semi-input-modebtn{border:1px var(--semi-color-focus-border) solid;border-radius:0 var(--semi-border-radius-small) var(--semi-border-radius-small) 0;border-left-style:none}.semi-input-wrapper.semi-input-wrapper__with-prepend .semi-input:focus~.semi-input-modebtn:not(:last-child),.semi-input-wrapper.semi-input-wrapper__with-append .semi-input:focus~.semi-input-modebtn:not(:last-child){border-radius:0}.semi-input-wrapper.semi-input-wrapper__with-prepend .semi-input:active,.semi-input-wrapper.semi-input-wrapper__with-append .semi-input:active{background-color:var(--semi-color-fill-2)}.semi-input-wrapper.semi-input-wrapper__with-prepend .semi-input:active+.semi-input-clearbtn,.semi-input-wrapper.semi-input-wrapper__with-prepend .semi-input:active~.semi-input-modebtn,.semi-input-wrapper.semi-input-wrapper__with-append .semi-input:active+.semi-input-clearbtn,.semi-input-wrapper.semi-input-wrapper__with-append .semi-input:active~.semi-input-modebtn{background-color:var(--semi-color-fill-2)}.semi-input-wrapper.semi-input-wrapper__with-prepend .semi-input-clearbtn,.semi-input-wrapper.semi-input-wrapper__with-prepend .semi-input-modebtn,.semi-input-wrapper.semi-input-wrapper__with-prepend .semi-input-clearbtn:hover,.semi-input-wrapper.semi-input-wrapper__with-prepend .semi-input-modebtn:hover,.semi-input-wrapper.semi-input-wrapper__with-append .semi-input-clearbtn,.semi-input-wrapper.semi-input-wrapper__with-append .semi-input-modebtn,.semi-input-wrapper.semi-input-wrapper__with-append .semi-input-clearbtn:hover,.semi-input-wrapper.semi-input-wrapper__with-append .semi-input-modebtn:hover{background-color:var(--semi-color-fill-0)}.semi-input-wrapper.semi-input-wrapper__with-prepend .semi-input-clearbtn:last-child,.semi-input-wrapper.semi-input-wrapper__with-prepend .semi-input-modebtn:last-child,.semi-input-wrapper.semi-input-wrapper__with-prepend .semi-input-clearbtn:hover:last-child,.semi-input-wrapper.semi-input-wrapper__with-prepend .semi-input-modebtn:hover:last-child,.semi-input-wrapper.semi-input-wrapper__with-append .semi-input-clearbtn:last-child,.semi-input-wrapper.semi-input-wrapper__with-append .semi-input-modebtn:last-child,.semi-input-wrapper.semi-input-wrapper__with-append .semi-input-clearbtn:hover:last-child,.semi-input-wrapper.semi-input-wrapper__with-append .semi-input-modebtn:hover:last-child{border-radius:0 var(--semi-border-radius-small) var(--semi-border-radius-small) 0}.semi-input-wrapper.semi-input-wrapper__with-prepend.semi-input-wrapper-error,.semi-input-wrapper.semi-input-wrapper__with-append.semi-input-wrapper-error{border-color:#0000}.semi-input-wrapper.semi-input-wrapper__with-prepend.semi-input-wrapper-error .semi-input,.semi-input-wrapper.semi-input-wrapper__with-append.semi-input-wrapper-error .semi-input{background-color:var(--semi-color-danger-light-default);border-color:var(--semi-color-danger-light-default)}.semi-input-wrapper.semi-input-wrapper__with-prepend.semi-input-wrapper-error .semi-input:hover,.semi-input-wrapper.semi-input-wrapper__with-append.semi-input-wrapper-error .semi-input:hover{background-color:var(--semi-color-danger-light-hover);border-color:var(--semi-color-danger-light-hover)}.semi-input-wrapper.semi-input-wrapper__with-prepend.semi-input-wrapper-error .semi-input:hover+.semi-input-clearbtn,.semi-input-wrapper.semi-input-wrapper__with-prepend.semi-input-wrapper-error .semi-input:hover+.semi-input-modebtn,.semi-input-wrapper.semi-input-wrapper__with-append.semi-input-wrapper-error .semi-input:hover+.semi-input-clearbtn,.semi-input-wrapper.semi-input-wrapper__with-append.semi-input-wrapper-error .semi-input:hover+.semi-input-modebtn{background-color:var(--semi-color-danger-light-hover)}.semi-input-wrapper.semi-input-wrapper__with-prepend.semi-input-wrapper-error .semi-input:focus,.semi-input-wrapper.semi-input-wrapper__with-append.semi-input-wrapper-error .semi-input:focus{background-color:var(--semi-color-danger-light-default);border-color:var(--semi-color-danger)}.semi-input-wrapper.semi-input-wrapper__with-prepend.semi-input-wrapper-error .semi-input:focus+.semi-input-clearbtn,.semi-input-wrapper.semi-input-wrapper__with-prepend.semi-input-wrapper-error .semi-input:focus+.semi-input-modebtn,.semi-input-wrapper.semi-input-wrapper__with-append.semi-input-wrapper-error .semi-input:focus+.semi-input-clearbtn,.semi-input-wrapper.semi-input-wrapper__with-append.semi-input-wrapper-error .semi-input:focus+.semi-input-modebtn{background-color:var(--semi-color-danger-light-default);border-color:var(--semi-color-danger)}.semi-input-wrapper.semi-input-wrapper__with-prepend.semi-input-wrapper-error .semi-input:active,.semi-input-wrapper.semi-input-wrapper__with-append.semi-input-wrapper-error .semi-input:active{background-color:var(--semi-color-danger-light-active)}.semi-input-wrapper.semi-input-wrapper__with-prepend.semi-input-wrapper-error .semi-input:active+.semi-input-clearbtn,.semi-input-wrapper.semi-input-wrapper__with-prepend.semi-input-wrapper-error .semi-input:active+.semi-input-modebtn,.semi-input-wrapper.semi-input-wrapper__with-append.semi-input-wrapper-error .semi-input:active+.semi-input-clearbtn,.semi-input-wrapper.semi-input-wrapper__with-append.semi-input-wrapper-error .semi-input:active+.semi-input-modebtn{background-color:var(--semi-color-danger-light-active);border-color:var(--semi-color-danger)}.semi-input-wrapper.semi-input-wrapper__with-prepend.semi-input-wrapper-error .semi-input-clearbtn,.semi-input-wrapper.semi-input-wrapper__with-prepend.semi-input-wrapper-error .semi-input-modebtn,.semi-input-wrapper.semi-input-wrapper__with-prepend.semi-input-wrapper-error .semi-input-clearbtn:hover,.semi-input-wrapper.semi-input-wrapper__with-prepend.semi-input-wrapper-error .semi-input-modebtn:hover,.semi-input-wrapper.semi-input-wrapper__with-append.semi-input-wrapper-error .semi-input-clearbtn,.semi-input-wrapper.semi-input-wrapper__with-append.semi-input-wrapper-error .semi-input-modebtn,.semi-input-wrapper.semi-input-wrapper__with-append.semi-input-wrapper-error .semi-input-clearbtn:hover,.semi-input-wrapper.semi-input-wrapper__with-append.semi-input-wrapper-error .semi-input-modebtn:hover{background-color:var(--semi-color-danger-light-default)}.semi-input-wrapper.semi-input-wrapper__with-prepend.semi-input-wrapper-error .semi-input-clearbtn:last-child,.semi-input-wrapper.semi-input-wrapper__with-prepend.semi-input-wrapper-error .semi-input-modebtn:last-child,.semi-input-wrapper.semi-input-wrapper__with-prepend.semi-input-wrapper-error .semi-input-clearbtn:hover:last-child,.semi-input-wrapper.semi-input-wrapper__with-prepend.semi-input-wrapper-error .semi-input-modebtn:hover:last-child,.semi-input-wrapper.semi-input-wrapper__with-append.semi-input-wrapper-error .semi-input-clearbtn:last-child,.semi-input-wrapper.semi-input-wrapper__with-append.semi-input-wrapper-error .semi-input-modebtn:last-child,.semi-input-wrapper.semi-input-wrapper__with-append.semi-input-wrapper-error .semi-input-clearbtn:hover:last-child,.semi-input-wrapper.semi-input-wrapper__with-append.semi-input-wrapper-error .semi-input-modebtn:hover:last-child{border-radius:0 var(--semi-border-radius-small) var(--semi-border-radius-small) 0}.semi-input-wrapper.semi-input-wrapper__with-prepend.semi-input-wrapper-warning,.semi-input-wrapper.semi-input-wrapper__with-append.semi-input-wrapper-warning{border-color:#0000}.semi-input-wrapper.semi-input-wrapper__with-prepend.semi-input-wrapper-warning .semi-input,.semi-input-wrapper.semi-input-wrapper__with-append.semi-input-wrapper-warning .semi-input{background-color:var(--semi-color-warning-light-default);border-color:var(--semi-color-warning-light-default)}.semi-input-wrapper.semi-input-wrapper__with-prepend.semi-input-wrapper-warning .semi-input:hover,.semi-input-wrapper.semi-input-wrapper__with-append.semi-input-wrapper-warning .semi-input:hover{background-color:var(--semi-color-warning-light-hover);border-color:var(--semi-color-warning-light-hover)}.semi-input-wrapper.semi-input-wrapper__with-prepend.semi-input-wrapper-warning .semi-input:hover+.semi-input-clearbtn,.semi-input-wrapper.semi-input-wrapper__with-prepend.semi-input-wrapper-warning .semi-input:hover+.semi-input-modebtn,.semi-input-wrapper.semi-input-wrapper__with-append.semi-input-wrapper-warning .semi-input:hover+.semi-input-clearbtn,.semi-input-wrapper.semi-input-wrapper__with-append.semi-input-wrapper-warning .semi-input:hover+.semi-input-modebtn{background-color:var(--semi-color-warning-light-hover)}.semi-input-wrapper.semi-input-wrapper__with-prepend.semi-input-wrapper-warning .semi-input:focus,.semi-input-wrapper.semi-input-wrapper__with-append.semi-input-wrapper-warning .semi-input:focus{background-color:var(--semi-color-warning-light-default);border-color:var(--semi-color-warning)}.semi-input-wrapper.semi-input-wrapper__with-prepend.semi-input-wrapper-warning .semi-input:focus+.semi-input-clearbtn,.semi-input-wrapper.semi-input-wrapper__with-prepend.semi-input-wrapper-warning .semi-input:focus+.semi-input-modebtn,.semi-input-wrapper.semi-input-wrapper__with-append.semi-input-wrapper-warning .semi-input:focus+.semi-input-clearbtn,.semi-input-wrapper.semi-input-wrapper__with-append.semi-input-wrapper-warning .semi-input:focus+.semi-input-modebtn{background-color:var(--semi-color-warning-light-default);border-color:var(--semi-color-warning)}.semi-input-wrapper.semi-input-wrapper__with-prepend.semi-input-wrapper-warning .semi-input:active,.semi-input-wrapper.semi-input-wrapper__with-append.semi-input-wrapper-warning .semi-input:active{background-color:var(--semi-color-warning-light-active)}.semi-input-wrapper.semi-input-wrapper__with-prepend.semi-input-wrapper-warning .semi-input:active+.semi-input-clearbtn,.semi-input-wrapper.semi-input-wrapper__with-prepend.semi-input-wrapper-warning .semi-input:active+.semi-input-modebtn,.semi-input-wrapper.semi-input-wrapper__with-append.semi-input-wrapper-warning .semi-input:active+.semi-input-clearbtn,.semi-input-wrapper.semi-input-wrapper__with-append.semi-input-wrapper-warning .semi-input:active+.semi-input-modebtn{background-color:var(--semi-color-warning-light-active);border-color:var(--semi-color-warning)}.semi-input-wrapper.semi-input-wrapper__with-prepend.semi-input-wrapper-warning .semi-input-clearbtn,.semi-input-wrapper.semi-input-wrapper__with-prepend.semi-input-wrapper-warning .semi-input-modebtn,.semi-input-wrapper.semi-input-wrapper__with-prepend.semi-input-wrapper-warning .semi-input-clearbtn:hover,.semi-input-wrapper.semi-input-wrapper__with-prepend.semi-input-wrapper-warning .semi-input-modebtn:hover,.semi-input-wrapper.semi-input-wrapper__with-append.semi-input-wrapper-warning .semi-input-clearbtn,.semi-input-wrapper.semi-input-wrapper__with-append.semi-input-wrapper-warning .semi-input-modebtn,.semi-input-wrapper.semi-input-wrapper__with-append.semi-input-wrapper-warning .semi-input-clearbtn:hover,.semi-input-wrapper.semi-input-wrapper__with-append.semi-input-wrapper-warning .semi-input-modebtn:hover{background-color:var(--semi-color-warning-light-default)}.semi-input-wrapper.semi-input-wrapper__with-prepend.semi-input-wrapper-warning .semi-input-clearbtn:last-child,.semi-input-wrapper.semi-input-wrapper__with-prepend.semi-input-wrapper-warning .semi-input-modebtn:last-child,.semi-input-wrapper.semi-input-wrapper__with-prepend.semi-input-wrapper-warning .semi-input-clearbtn:hover:last-child,.semi-input-wrapper.semi-input-wrapper__with-prepend.semi-input-wrapper-warning .semi-input-modebtn:hover:last-child,.semi-input-wrapper.semi-input-wrapper__with-append.semi-input-wrapper-warning .semi-input-clearbtn:last-child,.semi-input-wrapper.semi-input-wrapper__with-append.semi-input-wrapper-warning .semi-input-modebtn:last-child,.semi-input-wrapper.semi-input-wrapper__with-append.semi-input-wrapper-warning .semi-input-clearbtn:hover:last-child,.semi-input-wrapper.semi-input-wrapper__with-append.semi-input-wrapper-warning .semi-input-modebtn:hover:last-child{border-radius:0 var(--semi-border-radius-small) var(--semi-border-radius-small) 0}.semi-input-wrapper-disabled{cursor:not-allowed;color:var(--semi-color-disabled-text);background-color:var(--semi-color-disabled-fill);-webkit-text-fill-color:var(--semi-color-disabled-text)}.semi-input-wrapper-disabled:hover{background-color:var(--semi-color-disabled-fill)}.semi-input-wrapper-disabled .semi-input-append,.semi-input-wrapper-disabled .semi-input-prepend,.semi-input-wrapper-disabled .semi-input-suffix,.semi-input-wrapper-disabled .semi-input-prefix,.semi-input-wrapper-disabled .semi-icon{color:var(--semi-color-disabled-text)}.semi-input{border:none;outline:none;width:100%;color:inherit;padding-left:12px;padding-right:12px;background-color:#0000;box-sizing:border-box}.semi-input:placeholder-shown{text-overflow:ellipsis}.semi-input[type=password]::-ms-reveal,.semi-input[type=password]::-ms-clear{display:none}.semi-input[type=search]::-webkit-search-cancel-button{display:none}.semi-input::placeholder{color:var(--semi-color-text-2)}.semi-input-large{height:38px;font-size:16px;line-height:22px;font-family:Inter,-apple-system,BlinkMacSystemFont,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Segoe UI,Helvetica Neue,Helvetica,Arial,sans-serif;line-height:38px}.semi-input-small{height:22px;font-size:14px;line-height:20px;font-family:Inter,-apple-system,BlinkMacSystemFont,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Segoe UI,Helvetica Neue,Helvetica,Arial,sans-serif;line-height:22px}.semi-input-default{height:30px;font-size:14px;line-height:20px;font-family:Inter,-apple-system,BlinkMacSystemFont,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Segoe UI,Helvetica Neue,Helvetica,Arial,sans-serif;line-height:30px}.semi-input-disabled{cursor:not-allowed;color:inherit}.semi-input-inset-label{margin:0 12px;font-weight:600;color:var(--semi-color-text-2);flex-shrink:0;white-space:nowrap}.semi-input-prefix,.semi-input-suffix{display:flex;justify-content:center;align-items:center}.semi-input-prefix-text,.semi-input-suffix-text{margin:0 12px;color:var(--semi-color-text-2);font-weight:600;white-space:nowrap}.semi-input-prefix-icon,.semi-input-suffix-icon{color:var(--semi-color-text-2);margin:0 8px}.semi-input-suffix{display:flex;justify-content:center;align-items:center}.semi-input-clearbtn,.semi-input-modebtn{display:flex;align-items:center;height:100%;justify-content:center;min-width:32px}.semi-input-clearbtn+.semi-input-suffix+.semi-input-suffix-text{margin-left:0}.semi-input-clearbtn+.semi-input-suffix+.semi-input-suffix-icon{margin-left:0}.semi-input-suffix-hidden{display:none}.semi-input-prepend,.semi-input-append{height:100%;display:flex;align-items:center;background-color:var(--semi-color-fill-0);color:var(--semi-color-text-2);font-size:14px;line-height:20px;font-family:Inter,-apple-system,BlinkMacSystemFont,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Segoe UI,Helvetica Neue,Helvetica,Arial,sans-serif;flex-shrink:0}.semi-input-prepend-icon,.semi-input-prepend-text,.semi-input-append-icon,.semi-input-append-text{padding:0 12px}.semi-input-append{border-radius:0 var(--semi-border-radius-small) var(--semi-border-radius-small) 0;border-left:1px rgba(0,0,0,0) solid}.semi-input-prepend{border-radius:var(--semi-border-radius-small) 0 0 var(--semi-border-radius-small);border-right:1px rgba(0,0,0,0) solid}.semi-input-disabled::placeholder{color:var(--semi-color-disabled-text)}.semi-input-group{display:inline-flex;align-items:center;align-content:center;flex-wrap:wrap}.semi-input-group .semi-select,.semi-input-group .semi-tagInput,.semi-input-group .semi-cascader,.semi-input-group .semi-tree-select,.semi-input-group>.semi-input-wrapper{border-radius:0}.semi-input-group .semi-select:first-child,.semi-input-group .semi-tagInput:first-child,.semi-input-group .semi-cascader:first-child,.semi-input-group .semi-tree-select:first-child,.semi-input-group>.semi-input-wrapper:first-child{border-radius:var(--semi-border-radius-small) 0 0 var(--semi-border-radius-small)}.semi-input-group .semi-select:last-child,.semi-input-group .semi-tagInput:last-child,.semi-input-group .semi-cascader:last-child,.semi-input-group .semi-tree-select:last-child,.semi-input-group>.semi-input-wrapper:last-child{border-radius:0 var(--semi-border-radius-small) var(--semi-border-radius-small) 0}.semi-input-group .semi-select:not(:last-child),.semi-input-group .semi-tagInput:not(:last-child),.semi-input-group .semi-cascader:not(:last-child),.semi-input-group .semi-tree-select:not(:last-child),.semi-input-group>.semi-input-wrapper:not(:last-child){position:relative}.semi-input-group .semi-select:not(:last-child):after,.semi-input-group .semi-tagInput:not(:last-child):after,.semi-input-group .semi-cascader:not(:last-child):after,.semi-input-group .semi-tree-select:not(:last-child):after,.semi-input-group>.semi-input-wrapper:not(:last-child):after{content:"";background-color:var(--semi-color-border);width:1px;position:absolute;right:-1px;top:1px;bottom:1px}.semi-input-group .semi-select{overflow-y:visible}.semi-input-group .semi-input-number .semi-input-wrapper,.semi-input-group .semi-input-number .semi-datepicker-range-input,.semi-input-group .semi-datepicker .semi-input-wrapper,.semi-input-group .semi-datepicker .semi-datepicker-range-input,.semi-input-group .semi-timepicker .semi-input-wrapper,.semi-input-group .semi-timepicker .semi-datepicker-range-input,.semi-input-group .semi-autocomplete .semi-input-wrapper,.semi-input-group .semi-autocomplete .semi-datepicker-range-input{border-radius:0}.semi-input-group .semi-input-number:first-child .semi-input-wrapper,.semi-input-group .semi-input-number:first-child .semi-datepicker-range-input,.semi-input-group .semi-datepicker:first-child .semi-input-wrapper,.semi-input-group .semi-datepicker:first-child .semi-datepicker-range-input,.semi-input-group .semi-timepicker:first-child .semi-input-wrapper,.semi-input-group .semi-timepicker:first-child .semi-datepicker-range-input,.semi-input-group .semi-autocomplete:first-child .semi-input-wrapper,.semi-input-group .semi-autocomplete:first-child .semi-datepicker-range-input{border-radius:var(--semi-border-radius-small) 0 0 var(--semi-border-radius-small)}.semi-input-group .semi-input-number:last-child .semi-input-wrapper,.semi-input-group .semi-input-number:last-child .semi-datepicker-range-input,.semi-input-group .semi-datepicker:last-child .semi-input-wrapper,.semi-input-group .semi-datepicker:last-child .semi-datepicker-range-input,.semi-input-group .semi-timepicker:last-child .semi-input-wrapper,.semi-input-group .semi-timepicker:last-child .semi-datepicker-range-input,.semi-input-group .semi-autocomplete:last-child .semi-input-wrapper,.semi-input-group .semi-autocomplete:last-child .semi-datepicker-range-input{border-radius:0 var(--semi-border-radius-small) var(--semi-border-radius-small) 0}.semi-input-group .semi-input-number:not(:last-child),.semi-input-group .semi-datepicker:not(:last-child),.semi-input-group .semi-timepicker:not(:last-child),.semi-input-group .semi-autocomplete:not(:last-child){position:relative}.semi-input-group .semi-input-number:not(:last-child):after,.semi-input-group .semi-datepicker:not(:last-child):after,.semi-input-group .semi-timepicker:not(:last-child):after,.semi-input-group .semi-autocomplete:not(:last-child):after{content:"";background-color:var(--semi-color-border);width:1px;position:absolute;right:-1px;top:1px;bottom:1px}.semi-input-group-wrapper-with-top-label{margin-top:16px;margin-bottom:16px}.semi-input-group-wrapper-with-top-label .semi-input-group{display:flex}.semi-input-group-wrapper-with-top-label .semi-input-group .semi-form-field{margin-top:0;margin-bottom:0}.semi-input-only_border,.semi-input-only_border:hover{background:#0000;border-color:var(--semi-color-border)}.semi-input-only_border:focus-within{background:#0000}.semi-input-borderless:not(:focus-within):not(:hover){background-color:#0000;border-color:#0000}.semi-input-borderless:focus-within:not(:active){background-color:#0000}.semi-input-borderless.semi-input-wrapper-error:not(:focus-within){border-color:var(--semi-color-danger)}.semi-input-borderless.semi-input-wrapper-warning:not(:focus-within){border-color:var(--semi-color-warning)}.semi-input-number{display:inline-flex;align-items:center;box-sizing:border-box;transition:background-color var(--semi-transition_duration-none) var(--semi-transition_function-easeIn) var(--semi-transition_delay-none),border var(--semi-transition_duration-none) var(--semi-transition_function-easeIn) var(--semi-transition_delay-none);transform:scale(var(--semi-transform_scale-none))}.semi-input-number-suffix-btns{display:inline-flex;flex-direction:column;margin-left:4px;border:1px solid var(--semi-color-border);border-radius:var(--semi-border-radius-small);background-color:var(--semi-color-bg-2);box-sizing:border-box}.semi-input-number-suffix-btns>.semi-input-number-button{height:50%;width:14px;padding:0;margin:0;display:inline-flex;align-items:center;justify-content:center;-webkit-user-select:none;user-select:none;border-radius:0;color:var(--semi-color-text-2)}.semi-input-number-suffix-btns>.semi-input-number-button-up:not(.semi-input-number-button-up-not-allowed):hover,.semi-input-number-suffix-btns>.semi-input-number-button-down:not(.semi-input-number-button-down-not-allowed):hover{cursor:pointer;background-color:var(--semi-color-fill-0)}.semi-input-number-suffix-btns>.semi-input-number-button-up:not(.semi-input-number-button-up-not-allowed):active,.semi-input-number-suffix-btns>.semi-input-number-button-down:not(.semi-input-number-button-down-not-allowed):active{cursor:pointer;background-color:var(--semi-color-fill-1)}.semi-input-number-suffix-btns>.semi-input-number-button-up.semi-input-number-button-up-disabled,.semi-input-number-suffix-btns>.semi-input-number-button-down.semi-input-number-button-down-disabled{background-color:var(--semi-color-disabled-fill);color:var(--semi-color-disabled-text)}.semi-input-number-suffix-btns>.semi-input-number-button-up.semi-input-number-button-up-not-allowed,.semi-input-number-suffix-btns>.semi-input-number-button-down.semi-input-number-button-down-not-allowed{cursor:not-allowed}.semi-input-number-suffix-btns-inner-hover{border-color:var(--semi-color-fill-2)}.semi-input-number-suffix-btns-inner{margin-left:8px;border-radius:var(--semi-border-radius-small);overflow:hidden}.semi-input-number .semi-input-clearbtn+.semi-input-suffix{margin-left:-4px}.semi-input-number .semi-input-clearbtn+.semi-input-suffix .semi-input-number-suffix-btns-inner{margin-left:0}.semi-input-number-size-default .semi-input-number-suffix-btns{height:32px}.semi-input-number-size-default .semi-input-number-suffix-btns-inner{height:30px}.semi-input-number-size-large .semi-input-number-suffix-btns{height:40px}.semi-input-number-size-large .semi-input-number-suffix-btns-inner{height:38px}.semi-input-number-size-small .semi-input-number-suffix-btns{height:24px}.semi-input-number-size-small .semi-input-number-suffix-btns-inner{height:22px}.semi-input-number:not(:focus-within):not(:hover) .semi-input-borderless+.semi-input-number-suffix-btns{opacity:0}.semi-rtl .semi-input-number,.semi-portal-rtl .semi-input-number{direction:rtl}.semi-rtl .semi-input-number-suffix-btns,.semi-portal-rtl .semi-input-number-suffix-btns{margin-left:auto;margin-right:4px}.semi-rtl .semi-input-number-suffix-btns-inner,.semi-portal-rtl .semi-input-number-suffix-btns-inner{margin-left:auto;margin-right:8px}.semi-rtl .semi-input-number .semi-input-clearbtn+.semi-input-suffix,.semi-portal-rtl .semi-input-number .semi-input-clearbtn+.semi-input-suffix{margin-left:auto;margin-right:-4px}.semi-rtl .semi-input-number .semi-input-clearbtn+.semi-input-suffix .semi-input-number-suffix-btns-inner,.semi-portal-rtl .semi-input-number .semi-input-clearbtn+.semi-input-suffix .semi-input-number-suffix-btns-inner{margin-left:auto;margin-right:0}.semi-json-viewer{box-sizing:border-box;padding:12px 0}.semi-json-viewer-background{background-color:var(--semi-color-default)}.semi-json-viewer-string-key{color:rgba(var(--semi-red-5),1)}.semi-json-viewer-string-value,.semi-json-viewer-keyword{color:rgba(var(--semi-blue-5),1)}.semi-json-viewer-number{color:rgba(var(--semi-green-5),1)}.semi-json-viewer-delimiter-comma{color:rgba(var(--semi-blue-6),1)}.semi-json-viewer-delimiter-bracket-0{color:rgba(var(--semi-blue-7),1)}.semi-json-viewer-delimiter-bracket-1{color:rgba(var(--semi-green-7),1)}.semi-json-viewer-delimiter-bracket-2{color:rgba(var(--semi-orange-7),1)}.semi-json-viewer-delimiter-array-0{color:rgba(var(--semi-blue-7),1)}.semi-json-viewer-delimiter-array-1{color:rgba(var(--semi-green-7),1)}.semi-json-viewer-delimiter-array-2{color:rgba(var(--semi-orange-7),1)}.semi-json-viewer-search-result{background-color:rgba(var(--semi-green-2),1)}.semi-json-viewer-current-search-result{background-color:rgba(var(--semi-yellow-4),1)!important}.semi-json-viewer-folding-icon{opacity:.7;transition:opacity .8s;color:rgba(var(--semi-blue-7),1)}.semi-json-viewer-view-line{font-family:ui-monospace,SFMono-Regular,SF Mono,Menlo,Monaco,Fira Code,Consolas,Liberation Mono,DejaVu Sans Mono,Courier New,monospace;font-weight:400;font-size:12px;font-feature-settings:"liga" 0,"calt" 0;font-variation-settings:normal;letter-spacing:0px;color:#237893;word-break:break-all!important;white-space:pre-wrap!important}.semi-json-viewer-line-number{font-family:ui-monospace,SFMono-Regular,SF Mono,Menlo,Monaco,Fira Code,Consolas,Liberation Mono,DejaVu Sans Mono,Courier New,monospace;font-weight:400;font-size:12px;font-feature-settings:"liga" 0,"calt" 0;font-variation-settings:normal;letter-spacing:0px;color:rgba(var(--semi-grey-5),1);text-align:center;width:50px;-webkit-user-select:none;user-select:none;word-wrap:normal!important;overflow-wrap:normal!important}.semi-json-viewer-content-container{scrollbar-width:none;-ms-overflow-style:none}.semi-json-viewer-content-container::-webkit-scrollbar{display:none}.semi-json-viewer-search-bar-container{width:458px;box-sizing:border-box;border:1px solid var(--semi-color-border);border-radius:var(--semi-border-radius-small);display:flex;flex-direction:column;padding:8px;gap:8px;background-color:var(--semi-color-bg-0)}.semi-json-viewer-search-bar{display:flex;align-items:flex-start;gap:8px}.semi-json-viewer-search-bar-input{width:200px!important;flex-shrink:0}.semi-json-viewer-search-bar .semi-button-group{flex-wrap:nowrap}.semi-json-viewer-search-bar .semi-button:nth-of-type(1){width:40px}.semi-json-viewer-search-bar .semi-button:nth-of-type(2){width:40px}.semi-json-viewer-replace-bar{display:flex;align-items:flex-start;gap:8px}.semi-json-viewer-replace-bar-input{width:261px}.semi-json-viewer-replace-bar .semi-button:nth-of-type(1){width:52px}.semi-json-viewer-replace-bar .semi-button:nth-of-type(2){width:80px}.semi-json-viewer-search-options{display:flex;align-items:center;justify-content:center;list-style:none;padding-inline-start:0;margin-block-start:0;margin-block-end:0;gap:8px}.semi-json-viewer-search-options-item{min-width:32px;height:32px;display:flex;align-items:center;justify-content:center;cursor:pointer;border-radius:var(--semi-border-radius-small);color:var(--semi-color-text-2)}.semi-json-viewer-search-options-item:hover{background-color:var(--semi-color-default)}.semi-json-viewer-search-options-item-active{color:var(--semi-color-primary);background-color:var(--semi-color-primary-light-default)}.semi-json-viewer-complete-suggestions-container{border-radius:var(--semi-border-radius-medium);background-color:var(--semi-color-bg-3);box-shadow:var(--semi-shadow-elevated);z-index:1000;min-width:200px;max-width:400px;list-style:none;padding:4px 0}.semi-json-viewer-complete-container{position:absolute;z-index:1000}.semi-json-viewer-complete-suggestions-item{padding:8px 16px;color:var(--semi-color-text-0);cursor:pointer}.semi-json-viewer-error{text-decoration:underline wavy var(--semi-color-danger);text-decoration-thickness:1px;text-underline-position:under}.semi-layout{display:flex;flex:auto;flex-direction:column;min-height:auto}.semi-layout,.semi-layout-header,.semi-layout-footer,.semi-layout-content,.semi-layout-sider,.semi-layout-sider-children{box-sizing:border-box}.semi-layout-header,.semi-layout-footer{flex:0 0 auto}.semi-layout-content{flex:auto;min-height:auto}.semi-layout-sider{position:relative;min-width:auto}.semi-layout-sider-children{height:100%;margin-top:-.1px;padding-top:.1px}.semi-layout-has-sider{flex-direction:row}.semi-layout-has-sider>.semi-layout,.semi-layout-has-sider>.semi-layout-content{overflow-x:hidden}.semi-rtl .semi-layout,.semi-portal-rtl .semi-layout{direction:rtl}.semi-list{font-size:14px;line-height:20px;font-family:Inter,-apple-system,BlinkMacSystemFont,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Segoe UI,Helvetica Neue,Helvetica,Arial,sans-serif}.semi-list-items{margin:0;padding:0;list-style:none}.semi-list-header,.semi-list-footer{padding:12px 24px}.semi-list-empty{padding:12px 0;color:var(--semi-color-text-2);width:100%;text-align:center}.semi-list-item{display:flex;flex-wrap:wrap;align-items:center;box-sizing:border-box;padding:12px 24px;margin:0;list-style:none}.semi-list-item-body{flex:1;display:flex}.semi-list-item-body-header{margin-right:20px}.semi-list-item-body-flex-start{align-items:flex-start}.semi-list-item-body-flex-end{align-items:flex-end}.semi-list-item-body-center{align-items:center}.semi-list-item-body-stretch{align-items:stretch}.semi-list-item-body-baseline{align-items:baseline}.semi-list-item-extra{flex:0 0 auto;margin-left:40px}.semi-list-split .semi-list-item{border-bottom:1px solid var(--semi-color-border)}.semi-list-split .semi-list-item:last-child{border-bottom:none}.semi-list-split .semi-list-header{border-bottom:1px solid var(--semi-color-border)}.semi-list-split .semi-list-footer{border-top:1px solid var(--semi-color-border)}.semi-list-small .semi-list-item,.semi-list-small .semi-list-header,.semi-list-small .semi-list-footer{padding:8px 16px}.semi-list-large .semi-list-item,.semi-list-large .semi-list-header,.semi-list-large .semi-list-footer{padding:16px 24px}.semi-list.semi-list-grid .semi-list-item{padding:0}.semi-list.semi-list-bordered{border:1px solid var(--semi-color-border)}.semi-list.semi-list-flex .semi-list-items{display:flex}.semi-list.semi-list-flex.semi-list-split .semi-list-item{border-bottom:none;border-right:1px solid var(--semi-color-border)}.semi-list.semi-list-flex.semi-list-split .semi-list-item:last-child{border-right:none}.semi-rtl .semi-list,.semi-portal-rtl .semi-list,.semi-rtl .semi-list-item,.semi-portal-rtl .semi-list-item{direction:rtl}.semi-rtl .semi-list-item-body-header,.semi-portal-rtl .semi-list-item-body-header{margin-right:auto;margin-left:20px}.semi-rtl .semi-list-item-extra,.semi-portal-rtl .semi-list-item-extra{flex:0 0 auto;margin-left:0;margin-right:40px}.semi-rtl .semi-list.semi-list-flex.semi-list-split .semi-list-item,.semi-portal-rtl .semi-list.semi-list-flex.semi-list-split .semi-list-item{border-bottom:none;border-right:0;border-left:1px solid var(--semi-color-border)}.semi-rtl .semi-list.semi-list-flex.semi-list-split .semi-list-item:last-child,.semi-portal-rtl .semi-list.semi-list-flex.semi-list-split .semi-list-item:last-child{border-left:none}.semi-markdownRender-simple-code{background:var(--semi-color-fill-0);color:var(--semi-color-text-1)}.semi-markdownRender ul,.semi-markdownRender li{color:var(--semi-color-text-0)}.semi-markdownRender-component-image{margin:16px;max-width:50%;max-height:500px;display:flex;flex-direction:column;justify-content:center}.semi-markdownRender-component-image-alt{margin-top:8px;text-align:center;color:var(--semi-color-tertiary)}.semi-markdownRender-component-header.semi-typography.semi-typography-h1,.semi-markdownRender-component-header.semi-typography.semi-typography-h2,.semi-markdownRender-component-header.semi-typography.semi-typography-h3,.semi-markdownRender-component-header.semi-typography.semi-typography-h4,.semi-markdownRender-component-header.semi-typography.semi-typography-h5{margin-top:16px;margin-bottom:16px}.semi-markdownRender-component-p strong{font-weight:600}.semi-modal{font-size:14px;line-height:20px;font-family:Inter,-apple-system,BlinkMacSystemFont,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Segoe UI,Helvetica Neue,Helvetica,Arial,sans-serif;position:relative;margin:80px auto;color:var(--semi-color-text-0)}.semi-modal-mask{position:fixed;top:0;right:0;left:0;bottom:0;background-color:var(--semi-color-overlay-bg);-webkit-backdrop-filter:none;backdrop-filter:none;height:100%;z-index:1000}.semi-modal-mask-hidden{display:none}.semi-modal-icon-wrapper{display:inline-flex;margin-right:12px;width:24px}.semi-modal-wrap{position:fixed;overflow:auto;top:0;right:0;bottom:0;left:0;z-index:1000;-webkit-overflow-scrolling:touch;outline:0}.semi-modal-wrap-center{display:flex;align-items:flex-start}.semi-modal-title{display:inline-flex;align-items:flex-start;justify-content:flex-start;width:100%;margin:0}.semi-modal-content{position:relative;display:flex;height:max-content;width:100%;box-sizing:border-box;flex-direction:column;background-color:var(--semi-color-bg-2);-webkit-backdrop-filter:none;backdrop-filter:none;border:1px solid var(--semi-color-border);border-radius:var(--semi-border-radius-large);padding:0 24px;background-clip:padding-box;overflow:hidden;box-shadow:var(--semi-shadow-elevated)}.semi-modal-footerfill{display:flex}.semi-modal-content-height-set{height:100%}.semi-modal-content-fullScreen{border-radius:0;border:none;height:100%;top:0}.semi-modal-header{display:flex;align-items:flex-start;margin:24px 0;padding:0;font-size:14px;font-weight:600;background-color:#0000;color:var(--semi-color-text-0);border-bottom:0 solid rgba(0,0,0,0)}.semi-modal-body-wrapper{display:flex;align-items:flex-start;margin:24px 0}.semi-modal-body{flex:1 1 auto;margin:0;padding:0}.semi-modal-withIcon{margin-left:36px}.semi-modal-footer{margin:24px 0;padding:0;text-align:right;border-radius:0 0 5px 5px;border-top:0 solid rgba(0,0,0,0);background-color:#0000}.semi-modal-footer .semi-button{margin-left:12px;margin-right:0}.semi-modal-confirm .semi-modal-header{margin-bottom:8px}.semi-modal-confirm-icon-wrapper{display:inline-flex;margin-right:12px;width:24px}.semi-modal-confirm-icon{display:inline-flex;color:var(--semi-color-primary)}.semi-modal-info-icon{color:var(--semi-color-info)}.semi-modal-success-icon{color:var(--semi-color-success)}.semi-modal-error-icon{color:var(--semi-color-danger)}.semi-modal-warning-icon{color:var(--semi-color-warning)}.semi-modal-small{width:448px}.semi-modal-medium{width:684px}.semi-modal-large{width:920px}.semi-modal-full-width{width:calc(100vw - 64px)}.semi-modal-centered{margin:auto}.semi-modal-popup .semi-modal-mask,.semi-modal-popup .semi-modal-wrap{position:absolute;overflow:hidden}.semi-modal-fixed .semi-modal-mask,.semi-modal-fixed .semi-modal-wrap{position:fixed;overflow:hidden}.semi-modal-displayNone{display:none}.semi-modal-content-animate-show{animation:.12s semi-modal-content-keyframe-show cubic-bezier(.215,.61,.355,1) 0ms forwards;animation-fill-mode:forwards}.semi-modal-content-animate-hide{animation:.12s semi-modal-content-keyframe-hide cubic-bezier(.215,.61,.355,1) 0ms forwards;animation-fill-mode:forwards}.semi-modal-mask-animate-show{animation:90ms semi-modal-mask-keyframe-show cubic-bezier(.215,.61,.355,1) 0ms forwards;animation-fill-mode:forwards}.semi-modal-mask-animate-hide{animation:90ms semi-modal-mask-keyframe-hide cubic-bezier(.215,.61,.355,1) 0ms forwards;animation-fill-mode:forwards}@keyframes semi-modal-content-keyframe-show{0%{opacity:0;transform:scale(.7)}to{opacity:1;transform:scale(1)}}@keyframes semi-modal-content-keyframe-hide{0%{opacity:1;transform:scale(1)}to{opacity:0;transform:scale(.7)}}@keyframes semi-modal-mask-keyframe-show{0%{opacity:0}to{opacity:1}}@keyframes semi-modal-mask-keyframe-hide{0%{opacity:1}to{opacity:0}}.semi-modal-rtl{direction:rtl}.semi-modal-rtl .semi-modal-icon-wrapper,.semi-modal-confirm-rtl .semi-modal-icon-wrapper{margin-right:0;margin-left:12px}.semi-modal-rtl .semi-modal-withIcon,.semi-modal-confirm-rtl .semi-modal-withIcon{margin-left:0;margin-right:36px}.semi-modal-rtl .semi-modal-footer,.semi-modal-confirm-rtl .semi-modal-footer{text-align:left}.semi-modal-rtl .semi-modal-footer .semi-button,.semi-modal-confirm-rtl .semi-modal-footer .semi-button{margin-left:0;margin-right:12px}.semi-modal-confirm-rtl{direction:rtl}.semi-modal-confirm .semi-modal-confirm-rtl .semi-button{margin-left:0;margin-right:12px}.semi-navigation{box-sizing:border-box;display:inline-flex;width:240px;outline:none;overflow:hidden;margin:0;padding-left:8px;padding-right:8px;-webkit-user-select:none;user-select:none;transition:padding-left .1s ease-out,width .2s cubic-bezier(.62,.05,.36,.95);border-right:1px solid var(--semi-color-border);background-color:var(--semi-color-nav-bg)}.semi-navigation-inner{width:100%;height:100%;display:flex;justify-content:space-between}.semi-navigation-list{margin:0;padding:0;list-style:none}.semi-navigation-list>.semi-navigation-item-normal{height:36px}.semi-navigation-list>.semi-navigation-item{font-weight:600}.semi-navigation-list>.semi-navigation-item>.semi-navigation-sub-title{font-weight:600}.semi-navigation-collapsed{width:60px;padding-left:8px;padding-right:8px;transition:padding-left .1s ease-out,width .2s cubic-bezier(.62,.05,.36,.95)}.semi-navigation-collapsed .semi-navigation-item-text{transition:opacity .2s cubic-bezier(.5,-.1,1,.4);opacity:0}.semi-navigation-collapsed .semi-navigation-item-icon:last-child{transition:opacity .2s cubic-bezier(.5,-.1,1,.4);opacity:0}.semi-navigation-collapsed-wrapper{display:flex;width:fit-content;height:fit-content}.semi-navigation-sub-wrap .semi-navigation-sub-title,.semi-navigation-item{cursor:pointer;display:flex;border-radius:var(--semi-border-radius-small);padding:8px 12px;box-sizing:border-box;margin-top:0;margin-bottom:8px;font-size:14px;line-height:20px;font-family:Inter,-apple-system,BlinkMacSystemFont,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Segoe UI,Helvetica Neue,Helvetica,Arial,sans-serif;font-weight:400;color:var(--semi-color-text-0);width:100%;transition:background-color var(--semi-transition_duration-none) var(--semi-transition_function-easeIn) var(--semi-transition_delay-none)}.semi-navigation-sub-wrap .semi-navigation-sub-title-text,.semi-navigation-item-text{overflow:hidden;white-space:nowrap;text-overflow:ellipsis;transition:opacity .2s cubic-bezier(.5,-.1,1,.4);opacity:1}.semi-navigation-sub-wrap .semi-navigation-sub-title-indent,.semi-navigation-item-indent{width:32px}.semi-navigation-sub-wrap .semi-navigation-sub-title:focus-visible,.semi-navigation-item:focus-visible{outline:2px solid var(--semi-color-primary-light-active);outline-offset:-2px}.semi-navigation-header-link,.semi-navigation-item-link{display:flex;width:100%;color:inherit;text-decoration:none;align-items:center;justify-content:flex-start}.semi-navigation-item-has-link{padding:0}.semi-navigation-item-has-link .semi-navigation-item-link{padding:8px 12px}.semi-navigation-item-sub{padding:0}.semi-navigation-sub-wrap>.semi-navigation-item-inner{width:100%}.semi-navigation-sub-wrap .semi-navigation-sub-title>.semi-navigation-item-inner{display:flex}.semi-navigation-item-inner{display:flex;align-items:center;width:100%;flex:0 0 auto}.semi-navigation-item-title{opacity:1;transition:opacity .1s 100s ease-out}.semi-navigation .semi-navigation-sub-title{margin-bottom:0}.semi-navigation-item-icon-info{display:inline-flex;color:var(--semi-color-text-2);margin-right:12px;min-width:20px;margin-left:0}.semi-navigation-item-icon-toggle-left{display:inline-flex;color:var(--semi-color-text-2);margin-right:12px;min-width:20px}.semi-navigation-item-icon-toggle-right{display:inline-flex;color:var(--semi-color-text-2);margin-left:auto;transition:opacity .2s cubic-bezier(.5,-.1,1,.4);opacity:1}.semi-navigation-item-selected{background-color:var(--semi-color-primary-light-default);color:var(--semi-color-text-0)}.semi-navigation-item-selected .semi-navigation-item-icon:first-child{color:var(--semi-color-primary)}.semi-navigation-item-selected.semi-navigation-item-disabled{background-color:#0000;color:var(--semi-color-primary-disabled);cursor:not-allowed}.semi-navigation-item-selected.semi-navigation-item-disabled .semi-navigation-item-icon:first-child{color:var(--semi-color-primary-disabled)}.semi-navigation-item-disabled{background-color:#0000;color:var(--semi-color-disabled-text);cursor:not-allowed}.semi-navigation-item-disabled .semi-navigation-item-icon,.semi-navigation-item-disabled .semi-navigation-item-icon:first-child{color:var(--semi-color-disabled-text)}.semi-navigation-inner>.semi-navigation-item{color:var(--semi-color-text-0)}.semi-navigation-item-normal:hover:not(.semi-navigation-item-selected){background-color:var(--semi-color-fill-0);color:var(--semi-color-text-0)}.semi-navigation-item-normal:hover:not(.semi-navigation-item-selected) .semi-navigation-item-icon:first-child{color:var(--semi-color-text-2)}.semi-navigation-item-normal:hover.semi-navigation-item-selected{color:var(--semi-color-text-0);background-color:var(--semi-color-fill-0)}.semi-navigation-item-normal:hover.semi-navigation-item-selected .semi-navigation-item-icon:first-child{color:var(--semi-color-primary)}.semi-navigation-item-normal:hover.semi-navigation-item-disabled{background-color:#0000;color:var(--semi-color-disabled-text);cursor:not-allowed}.semi-navigation-item-normal:hover.semi-navigation-item-disabled .semi-navigation-item-icon,.semi-navigation-item-normal:hover.semi-navigation-item-disabled .semi-navigation-item-icon:first-child{color:var(--semi-color-disabled-text)}.semi-navigation-item-normal:hover.semi-navigation-item-selected.semi-navigation-item-disabled{background-color:#0000;color:var(--semi-color-primary-disabled);cursor:not-allowed}.semi-navigation-item-normal:hover.semi-navigation-item-selected.semi-navigation-item-disabled .semi-navigation-item-icon:first-child{color:var(--semi-color-primary-disabled)}.semi-navigation-item-normal:active:not(.semi-navigation-item-selected),.semi-navigation-inner>.semi-navigation-item-normal:active:not(.semi-navigation-item-selected){background-color:var(--semi-color-fill-1);color:var(--semi-color-text-0)}.semi-navigation-item-normal:active:not(.semi-navigation-item-selected) .semi-navigation-item-icon:first-child,.semi-navigation-inner>.semi-navigation-item-normal:active:not(.semi-navigation-item-selected) .semi-navigation-item-icon:first-child{color:var(--semi-color-text-2)}.semi-navigation-item-normal:active.semi-navigation-item-selected,.semi-navigation-inner>.semi-navigation-item-normal:active.semi-navigation-item-selected{color:var(--semi-color-text-0);background-color:var(--semi-color-fill-1)}.semi-navigation-item-normal:active.semi-navigation-item-selected .semi-navigation-item-icon:first-child,.semi-navigation-inner>.semi-navigation-item-normal:active.semi-navigation-item-selected .semi-navigation-item-icon:first-child{color:var(--semi-color-primary)}.semi-navigation-item-normal:active.semi-navigation-item-disabled,.semi-navigation-inner>.semi-navigation-item-normal:active.semi-navigation-item-disabled{background-color:#0000;color:var(--semi-color-disabled-text);cursor:not-allowed}.semi-navigation-item-normal:active.semi-navigation-item-disabled .semi-navigation-item-icon,.semi-navigation-item-normal:active.semi-navigation-item-disabled .semi-navigation-item-icon:first-child,.semi-navigation-inner>.semi-navigation-item-normal:active.semi-navigation-item-disabled .semi-navigation-item-icon,.semi-navigation-inner>.semi-navigation-item-normal:active.semi-navigation-item-disabled .semi-navigation-item-icon:first-child{color:var(--semi-color-disabled-text)}.semi-navigation-sub-wrap .semi-navigation-item-inner{display:block}.semi-navigation-sub-wrap{display:block;padding:0;margin-top:0;height:inherit}.semi-navigation-sub-wrap .semi-navigation-sub-title{display:flex;justify-content:flex-start;height:36px;align-items:center}.semi-navigation-sub{font-weight:400;font-size:14px;list-style:none;outline:none;padding:0;text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.semi-navigation-sub .semi-navigation-item{color:var(--semi-color-text-0);background-color:#0000;height:36px;font-weight:400;width:100%}.semi-navigation-sub .semi-navigation-item:first-child{margin-top:8px}.semi-navigation-sub .semi-navigation-item>.semi-navigation-sub .semi-navigation-item-text:first-child{margin-left:44px}.semi-navigation-sub .semi-navigation-item:hover:not(.semi-navigation-sub-wrap):not(.semi-navigation-item-selected):not(.semi-navigation-item-disabled){background-color:var(--semi-color-fill-0);color:var(--semi-color-text-0)}.semi-navigation-sub .semi-navigation-item:hover:not(.semi-navigation-sub-wrap):not(.semi-navigation-item-selected):not(.semi-navigation-item-disabled) .semi-navigation-item-icon:first-child{color:var(--semi-color-text-2)}.semi-navigation-sub .semi-navigation-item:hover.semi-navigation-item-disabled{background-color:#0000;color:var(--semi-color-disabled-text);cursor:not-allowed}.semi-navigation-sub .semi-navigation-item:hover.semi-navigation-item-disabled .semi-navigation-item-icon,.semi-navigation-sub .semi-navigation-item:hover.semi-navigation-item-disabled .semi-navigation-item-icon:first-child{color:var(--semi-color-disabled-text)}.semi-navigation-sub .semi-navigation-item:hover.semi-navigation-item-selected{background-color:var(--semi-color-primary-light-default);color:var(--semi-color-text-0)}.semi-navigation-sub .semi-navigation-item:hover.semi-navigation-item-selected .semi-navigation-item-icon:first-child{color:var(--semi-color-primary)}.semi-navigation-sub .semi-navigation-item:active:not(.semi-navigation-sub-wrap):not(.semi-navigation-item-selected):not(.semi-navigation-item-disabled){background-color:var(--semi-color-fill-1);color:var(--semi-color-text-0)}.semi-navigation-sub .semi-navigation-item:active:not(.semi-navigation-sub-wrap):not(.semi-navigation-item-selected):not(.semi-navigation-item-disabled) .semi-navigation-item-icon:first-child{color:var(--semi-color-text-2)}.semi-navigation-sub .semi-navigation-item:active.semi-navigation-item-disabled{background-color:#0000;color:var(--semi-color-disabled-text);cursor:not-allowed}.semi-navigation-sub .semi-navigation-item:active.semi-navigation-item-disabled .semi-navigation-item-icon,.semi-navigation-sub .semi-navigation-item:active.semi-navigation-item-disabled .semi-navigation-item-icon:first-child{color:var(--semi-color-disabled-text)}.semi-navigation-sub .semi-navigation-item:active.semi-navigation-item-selected{background-color:var(--semi-color-primary-light-default);color:var(--semi-color-text-0)}.semi-navigation-sub .semi-navigation-item:active.semi-navigation-item-selected .semi-navigation-item-icon:first-child{color:var(--semi-color-primary)}.semi-navigation-sub .semi-navigation-item-selected{background-color:var(--semi-color-primary-light-default);color:var(--semi-color-text-0)}.semi-navigation-sub .semi-navigation-item-selected .semi-navigation-item-icon:first-child{color:var(--semi-color-primary)}.semi-navigation-sub .semi-navigation-item-selected.semi-navigation-item-disabled{cursor:not-allowed;background-color:var(--semi-color-primary-light-default);color:var(--semi-color-disabled-text)}.semi-navigation-sub .semi-navigation-item-disabled{background-color:#0000;color:var(--semi-color-disabled-text);cursor:not-allowed}.semi-navigation-sub .semi-navigation-item-disabled .semi-navigation-item-icon,.semi-navigation-sub .semi-navigation-item-disabled .semi-navigation-item-icon:first-child{color:var(--semi-color-disabled-text)}.semi-navigation-sub .semi-navigation-sub-wrap{height:inherit}.semi-navigation-icon-rotate-0{transition:transform .2s ease-in-out;transform:rotate(0)}.semi-navigation-icon-rotate-180{transition:transform .2s ease-in-out;transform:rotate(-180deg)}.semi-navigation-header{display:inline-flex;align-items:center;box-sizing:border-box}.semi-navigation-header-logo{margin-left:0;margin-right:8px;display:inline-flex}.semi-navigation-header-logo>.semi-icon,.semi-navigation-header-logo>img{width:36px;height:36px;object-fit:scale-down}.semi-navigation-header-text{font-size:18px;line-height:24px;font-family:Inter,-apple-system,BlinkMacSystemFont,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Segoe UI,Helvetica Neue,Helvetica,Arial,sans-serif;font-weight:600;display:inline-flex;color:var(--semi-color-text-0);white-space:nowrap;text-overflow:ellipsis;transition:opacity .2s cubic-bezier(.5,-.1,1,.4);opacity:1}.semi-navigation-footer{box-sizing:border-box;padding:16px 24px;display:inline-flex;align-items:center}.semi-navigation-footer .semi-navigation-collapse-btn{text-overflow:ellipsis;white-space:nowrap}.semi-navigation-collapsed .semi-navigation-header{justify-content:center}.semi-navigation-collapsed .semi-navigation-header .semi-navigation-header-logo{margin-right:0;width:100%}.semi-navigation-collapsed .semi-navigation-header .semi-navigation-header-logo>.semi-icon,.semi-navigation-collapsed .semi-navigation-header .semi-navigation-header-logo>img{width:36px;max-width:100%;max-height:100%}.semi-navigation-collapsed .semi-navigation-header .semi-navigation-header-text{transition:opacity .2s cubic-bezier(.5,-.1,1,.4);opacity:0}.semi-navigation-vertical .semi-navigation-list>.semi-navigation-item-selected:not(.semi-navigation-item-disabled).semi-navigation-item-normal:hover .semi-navigation-item-icon:first-child{color:var(--semi-color-primary)}.semi-navigation-vertical .semi-navigation-list>.semi-navigation-sub-wrap>.semi-navigation-sub-title{color:var(--semi-color-text-0);background-color:#0000}.semi-navigation-vertical .semi-navigation-list>.semi-navigation-sub-wrap>.semi-navigation-sub-title-selected{font-weight:600;background-color:var(--semi-color-primary-light-default);color:var(--semi-color-text-0)}.semi-navigation-vertical .semi-navigation-list>.semi-navigation-sub-wrap>.semi-navigation-sub-title-selected .semi-navigation-item-icon:first-child{color:var(--semi-color-primary)}.semi-navigation-vertical .semi-navigation-list>.semi-navigation-sub-wrap>.semi-navigation-sub-title-selected{background-color:#0000}.semi-navigation-vertical .semi-navigation-list>.semi-navigation-sub-wrap>.semi-navigation-sub-title-selected.semi-navigation-sub-title-disabled{background-color:#0000;color:var(--semi-color-primary-disabled);cursor:not-allowed}.semi-navigation-vertical .semi-navigation-list>.semi-navigation-sub-wrap>.semi-navigation-sub-title-selected.semi-navigation-sub-title-disabled .semi-navigation-item-icon:first-child{color:var(--semi-color-primary-disabled)}.semi-navigation-vertical .semi-navigation-list>.semi-navigation-sub-wrap>.semi-navigation-sub-title-disabled{font-weight:600;background-color:#0000;color:var(--semi-color-disabled-text);cursor:not-allowed}.semi-navigation-vertical .semi-navigation-list>.semi-navigation-sub-wrap>.semi-navigation-sub-title-disabled .semi-navigation-item-icon,.semi-navigation-vertical .semi-navigation-list>.semi-navigation-sub-wrap>.semi-navigation-sub-title-disabled .semi-navigation-item-icon:first-child{color:var(--semi-color-disabled-text)}.semi-navigation-vertical .semi-navigation-list>.semi-navigation-sub-wrap>.semi-navigation-sub-title:hover:not(.semi-navigation-sub-title-selected){background-color:var(--semi-color-fill-0);color:var(--semi-color-text-0)}.semi-navigation-vertical .semi-navigation-list>.semi-navigation-sub-wrap>.semi-navigation-sub-title:hover:not(.semi-navigation-sub-title-selected) .semi-navigation-item-icon:first-child{color:var(--semi-color-text-2)}.semi-navigation-vertical .semi-navigation-list>.semi-navigation-sub-wrap>.semi-navigation-sub-title:hover.semi-navigation-sub-title-selected{color:var(--semi-color-text-0);background-color:var(--semi-color-fill-0)}.semi-navigation-vertical .semi-navigation-list>.semi-navigation-sub-wrap>.semi-navigation-sub-title:hover.semi-navigation-sub-title-selected .semi-navigation-item-icon:first-child{color:var(--semi-color-primary)}.semi-navigation-vertical .semi-navigation-list>.semi-navigation-sub-wrap>.semi-navigation-sub-title:active:not(.semi-navigation-sub-title-selected){background-color:var(--semi-color-fill-1);color:var(--semi-color-text-0)}.semi-navigation-vertical .semi-navigation-list>.semi-navigation-sub-wrap>.semi-navigation-sub-title:active:not(.semi-navigation-sub-title-selected) .semi-navigation-item-icon:first-child{color:var(--semi-color-text-2)}.semi-navigation-vertical .semi-navigation-list>.semi-navigation-sub-wrap>.semi-navigation-sub-title:active.semi-navigation-sub-title-selected{color:var(--semi-color-text-0);background-color:var(--semi-color-fill-1)}.semi-navigation-vertical .semi-navigation-list>.semi-navigation-sub-wrap>.semi-navigation-sub-title:active.semi-navigation-sub-title-selected .semi-navigation-item-icon:first-child{color:var(--semi-color-primary)}.semi-navigation-vertical .semi-navigation-list>.semi-navigation-sub-wrap>.semi-navigation-sub-title:hover.semi-navigation-sub-title-disabled:not(.semi-navigation-sub-title-selected),.semi-navigation-vertical .semi-navigation-list>.semi-navigation-sub-wrap>.semi-navigation-sub-title:active.semi-navigation-sub-title-disabled:not(.semi-navigation-sub-title-selected){background-color:#0000;color:var(--semi-color-disabled-text);cursor:not-allowed}.semi-navigation-vertical .semi-navigation-list>.semi-navigation-sub-wrap>.semi-navigation-sub-title:hover.semi-navigation-sub-title-disabled:not(.semi-navigation-sub-title-selected) .semi-navigation-item-icon,.semi-navigation-vertical .semi-navigation-list>.semi-navigation-sub-wrap>.semi-navigation-sub-title:hover.semi-navigation-sub-title-disabled:not(.semi-navigation-sub-title-selected) .semi-navigation-item-icon:first-child,.semi-navigation-vertical .semi-navigation-list>.semi-navigation-sub-wrap>.semi-navigation-sub-title:active.semi-navigation-sub-title-disabled:not(.semi-navigation-sub-title-selected) .semi-navigation-item-icon,.semi-navigation-vertical .semi-navigation-list>.semi-navigation-sub-wrap>.semi-navigation-sub-title:active.semi-navigation-sub-title-disabled:not(.semi-navigation-sub-title-selected) .semi-navigation-item-icon:first-child{color:var(--semi-color-disabled-text)}.semi-navigation-vertical .semi-navigation-list>.semi-navigation-sub-wrap>.semi-navigation-sub-title:hover.semi-navigation-sub-title-disabled.semi-navigation-sub-title-selected,.semi-navigation-vertical .semi-navigation-list>.semi-navigation-sub-wrap>.semi-navigation-sub-title:active.semi-navigation-sub-title-disabled.semi-navigation-sub-title-selected{background-color:#0000;color:var(--semi-color-primary-disabled);cursor:not-allowed}.semi-navigation-vertical .semi-navigation-list>.semi-navigation-sub-wrap>.semi-navigation-sub-title:hover.semi-navigation-sub-title-disabled.semi-navigation-sub-title-selected .semi-navigation-item-icon:first-child,.semi-navigation-vertical .semi-navigation-list>.semi-navigation-sub-wrap>.semi-navigation-sub-title:active.semi-navigation-sub-title-disabled.semi-navigation-sub-title-selected .semi-navigation-item-icon:first-child{color:var(--semi-color-primary-disabled)}.semi-navigation-vertical .semi-navigation-list .semi-navigation-sub-wrap>.semi-navigation-sub-title-disabled{background-color:#0000;color:var(--semi-color-disabled-text);cursor:not-allowed}.semi-navigation-vertical .semi-navigation-list .semi-navigation-sub-wrap>.semi-navigation-sub-title-disabled .semi-navigation-item-icon,.semi-navigation-vertical .semi-navigation-list .semi-navigation-sub-wrap>.semi-navigation-sub-title-disabled .semi-navigation-item-icon:first-child{color:var(--semi-color-disabled-text)}.semi-navigation-vertical .semi-navigation-list .semi-navigation-sub-wrap>.semi-navigation-sub-title:hover:not(.semi-navigation-sub-title-selected){background-color:var(--semi-color-fill-0);color:var(--semi-color-text-0)}.semi-navigation-vertical .semi-navigation-list .semi-navigation-sub-wrap>.semi-navigation-sub-title:hover:not(.semi-navigation-sub-title-selected) .semi-navigation-item-icon:first-child{color:var(--semi-color-text-2)}.semi-navigation-vertical .semi-navigation-list .semi-navigation-sub-wrap>.semi-navigation-sub-title:hover.semi-navigation-sub-title-selected{color:var(--semi-color-text-0);background-color:var(--semi-color-fill-0)}.semi-navigation-vertical .semi-navigation-list .semi-navigation-sub-wrap>.semi-navigation-sub-title:hover.semi-navigation-sub-title-selected .semi-navigation-item-icon:first-child{color:var(--semi-color-primary)}.semi-navigation-vertical .semi-navigation-list .semi-navigation-sub-wrap>.semi-navigation-sub-title:hover.semi-navigation-sub-title-disabled:not(.semi-navigation-sub-title-selected){background-color:#0000;color:var(--semi-color-disabled-text);cursor:not-allowed}.semi-navigation-vertical .semi-navigation-list .semi-navigation-sub-wrap>.semi-navigation-sub-title:hover.semi-navigation-sub-title-disabled:not(.semi-navigation-sub-title-selected) .semi-navigation-item-icon,.semi-navigation-vertical .semi-navigation-list .semi-navigation-sub-wrap>.semi-navigation-sub-title:hover.semi-navigation-sub-title-disabled:not(.semi-navigation-sub-title-selected) .semi-navigation-item-icon:first-child{color:var(--semi-color-disabled-text)}.semi-navigation-vertical .semi-navigation-list .semi-navigation-sub-wrap>.semi-navigation-sub-title:hover.semi-navigation-sub-title-disabled.semi-navigation-sub-title-selected{background-color:#0000;color:var(--semi-color-primary-disabled);cursor:not-allowed}.semi-navigation-vertical .semi-navigation-list .semi-navigation-sub-wrap>.semi-navigation-sub-title:hover.semi-navigation-sub-title-disabled.semi-navigation-sub-title-selected .semi-navigation-item-icon:first-child{color:var(--semi-color-primary-disabled)}.semi-navigation-vertical .semi-navigation-item:last-of-type{margin-bottom:0}.semi-navigation-vertical .semi-navigation-inner{flex-direction:column}.semi-navigation-vertical .semi-navigation-header-list-outer{height:100%}.semi-navigation-vertical .semi-navigation-list-wrapper{padding-top:12px;overflow-y:auto;overflow-x:hidden}.semi-navigation-vertical .semi-navigation-header{padding:32px 8px 36px 3.5px;width:100%}.semi-navigation-vertical .semi-navigation-header-collapsed{padding-left:3.5px;padding-right:0;transition:padding-left .1s ease-out,width .2s cubic-bezier(.62,.05,.36,.95)}.semi-navigation-vertical .semi-navigation-footer{color:var(--semi-color-text-1);padding-left:8px;padding-right:8px}.semi-navigation-vertical .semi-navigation-footer .semi-navigation-collapse-btn .semi-button-content-right{margin-left:12px;opacity:1;transition:opacity .2s cubic-bezier(.5,-.1,1,.4)}.semi-navigation-vertical .semi-navigation-footer .semi-navigation-collapse-btn>.semi-button{padding-left:8px;padding-right:8px;color:var(--semi-color-text-1)}.semi-navigation-vertical .semi-navigation-footer-collapsed{justify-content:center}.semi-navigation-vertical .semi-navigation-footer-collapsed .semi-navigation-collapse-btn{width:100%}.semi-navigation-vertical .semi-navigation-footer-collapsed .semi-navigation-collapse-btn .semi-button-content-right{opacity:0;transition:opacity .2s cubic-bezier(.5,-.1,1,.4)}.semi-navigation-horizontal{width:100%;height:60px;border-right:none;border-bottom:1px solid var(--semi-color-border);padding-left:24px;padding-right:24px}.semi-navigation-horizontal .semi-navigation-inner{flex-direction:row}.semi-navigation-horizontal .semi-navigation-header-list-outer{display:inline-flex;align-items:center}.semi-navigation-horizontal .semi-navigation-header-list-outer-collapsed{align-items:baseline}.semi-navigation-horizontal .semi-navigation-header{width:inherit;margin-right:24px}.semi-navigation-horizontal .semi-navigation-list{display:inline-flex;align-items:center}.semi-navigation-horizontal .semi-navigation-list .semi-navigation-item{margin-bottom:0;color:var(--semi-color-text-2);background-color:#0000}.semi-navigation-horizontal .semi-navigation-list .semi-navigation-item .semi-navigation-item-icon:first-child{color:var(--semi-color-text-2)}.semi-navigation-horizontal .semi-navigation-list .semi-navigation-item-selected{color:var(--semi-color-text-0);background-color:#0000}.semi-navigation-horizontal .semi-navigation-list .semi-navigation-item-selected .semi-navigation-item-icon:first-child{color:var(--semi-color-text-0)}.semi-navigation-horizontal .semi-navigation-list .semi-navigation-item-disabled{color:var(--semi-color-disabled-text);background-color:#0000;cursor:not-allowed}.semi-navigation-horizontal .semi-navigation-list .semi-navigation-item-disabled .semi-navigation-item-icon,.semi-navigation-horizontal .semi-navigation-list .semi-navigation-item-disabled .semi-navigation-item-icon:first-child{color:var(--semi-color-disabled-text)}.semi-navigation-horizontal .semi-navigation-list .semi-navigation-item-normal:hover:not(.semi-navigation-item-selected){color:var(--semi-color-text-1);background-color:#0000}.semi-navigation-horizontal .semi-navigation-list .semi-navigation-item-normal:hover:not(.semi-navigation-item-selected) .semi-navigation-item-icon:first-child{color:var(--semi-color-text-1)}.semi-navigation-horizontal .semi-navigation-list .semi-navigation-item-normal:hover:not(.semi-navigation-item-selected) .semi-navigation-item-text{color:var(--semi-color-text-1);background-color:#0000}.semi-navigation-horizontal .semi-navigation-list .semi-navigation-item-normal:active:not(.semi-navigation-item-selected){color:var(--semi-color-text-0);background-color:#0000}.semi-navigation-horizontal .semi-navigation-list .semi-navigation-item-normal:active:not(.semi-navigation-item-selected) .semi-navigation-item-icon:first-child{color:var(--semi-color-text-0)}.semi-navigation-horizontal .semi-navigation-list .semi-navigation-item-normal:hover.semi-navigation-item-disabled,.semi-navigation-horizontal .semi-navigation-list .semi-navigation-item-normal:active.semi-navigation-item-disabled{color:var(--semi-color-disabled-text);background-color:#0000;cursor:not-allowed}.semi-navigation-horizontal .semi-navigation-list .semi-navigation-item-normal:hover.semi-navigation-item-disabled .semi-navigation-item-icon,.semi-navigation-horizontal .semi-navigation-list .semi-navigation-item-normal:hover.semi-navigation-item-disabled .semi-navigation-item-icon:first-child,.semi-navigation-horizontal .semi-navigation-list .semi-navigation-item-normal:active.semi-navigation-item-disabled .semi-navigation-item-icon,.semi-navigation-horizontal .semi-navigation-list .semi-navigation-item-normal:active.semi-navigation-item-disabled .semi-navigation-item-icon:first-child{color:var(--semi-color-disabled-text)}.semi-navigation-horizontal .semi-navigation-list .semi-navigation-item-normal:hover.semi-navigation-item-disabled .semi-navigation-item-text,.semi-navigation-horizontal .semi-navigation-list .semi-navigation-item-normal:active.semi-navigation-item-disabled .semi-navigation-item-text{color:var(--semi-color-disabled-text);background-color:#0000}.semi-navigation-horizontal .semi-navigation-list .semi-navigation-item:not(:last-of-type){margin-right:8px}.semi-navigation-horizontal .semi-navigation-list .semi-navigation-sub-title .semi-navigation-item-text{color:var(--semi-color-text-2);background-color:#0000}.semi-navigation-horizontal .semi-navigation-list .semi-navigation-sub-title-selected .semi-navigation-item-icon:first-child,.semi-navigation-horizontal .semi-navigation-list .semi-navigation-sub-title-selected .semi-navigation-item-text{color:var(--semi-color-text-0);background-color:#0000}.semi-navigation-horizontal .semi-navigation-list .semi-navigation-sub-title-disabled{cursor:not-allowed}.semi-navigation-horizontal .semi-navigation-list .semi-navigation-sub-title-disabled .semi-navigation-item-icon:first-child,.semi-navigation-horizontal .semi-navigation-list .semi-navigation-sub-title-disabled .semi-navigation-item-text{color:var(--semi-color-disabled-text);background-color:#0000}.semi-navigation-horizontal .semi-navigation-item-inner{width:auto}.semi-navigation-horizontal .semi-navigation-item-icon:last-child{margin-left:8px}.semi-navigation-horizontal .semi-navigation-item-icon:first-child{margin-right:8px}.semi-navigation-horizontal .semi-navigation-item{width:auto}.semi-navigation-horizontal .semi-navigation-item-collapsed{word-wrap:none;text-overflow:ellipsis}.semi-navigation-horizontal .semi-navigation-footer{border-top:none;padding-right:0}.semi-navigation-horizontal .semi-navigation-footer-collapsed{justify-content:center;flex-direction:row;align-items:center}.semi-navigation-popover .semi-navigation-sub-title{width:100%}.semi-navigation-popover .semi-navigation-item-selected{font-weight:400}.semi-dropdown-item .semi-navigation-sub-title{box-sizing:border-box;padding:8px 12px;width:100%}.semi-dropdown-item.semi-navigation-item{margin-top:0;margin-bottom:0;min-width:150px}.semi-dropdown-menu .semi-navigation-item-sub{padding:0}.semi-rtl .semi-navigation,.semi-portal-rtl .semi-navigation{direction:rtl;border-right:0;border-left:1px solid var(--semi-color-border);transition:padding-right .1s ease-out,width .2s cubic-bezier(.62,.05,.36,.95)}.semi-rtl .semi-navigation-collapsed,.semi-portal-rtl .semi-navigation-collapsed{transition:padding-right .1s ease-out,width .2s cubic-bezier(.62,.05,.36,.95)}.semi-rtl .semi-navigation-item-icon:first-child,.semi-portal-rtl .semi-navigation-item-icon:first-child{margin-right:0;margin-left:12px}.semi-rtl .semi-navigation-item-icon:last-child,.semi-portal-rtl .semi-navigation-item-icon:last-child{margin-left:0;margin-right:auto}.semi-rtl .semi-navigation-sub .semi-navigation-item>.semi-rtl .semi-navigation-sub .semi-navigation-item-text:first-child,.semi-rtl .semi-navigation-sub .semi-navigation-item>.semi-portal-rtl .semi-navigation-sub .semi-navigation-item-text:first-child,.semi-portal-rtl .semi-navigation-sub .semi-navigation-item>.semi-rtl .semi-navigation-sub .semi-navigation-item-text:first-child,.semi-portal-rtl .semi-navigation-sub .semi-navigation-item>.semi-portal-rtl .semi-navigation-sub .semi-navigation-item-text:first-child{margin-left:auto;margin-right:44px}.semi-rtl .semi-navigation-sub .semi-navigation-item>.semi-navigation-item-icon:first-child,.semi-portal-rtl .semi-navigation-sub .semi-navigation-item>.semi-navigation-item-icon:first-child{margin-right:12px}.semi-rtl .semi-navigation-header,.semi-portal-rtl .semi-navigation-header{display:inline-flex;align-items:center;box-sizing:border-box}.semi-rtl .semi-navigation-header-logo,.semi-portal-rtl .semi-navigation-header-logo{margin-left:8px;margin-right:0;display:inline-flex}.semi-rtl .semi-navigation-collapsed,.semi-portal-rtl .semi-navigation-collapsed{direction:rtl}.semi-rtl .semi-navigation-collapsed .semi-navigation-header .semi-navigation-header-logo,.semi-portal-rtl .semi-navigation-collapsed .semi-navigation-header .semi-navigation-header-logo{margin-right:auto;margin-left:0}.semi-rtl .semi-navigation-vertical,.semi-portal-rtl .semi-navigation-vertical{direction:rtl}.semi-rtl .semi-navigation-vertical .semi-navigation-header,.semi-portal-rtl .semi-navigation-vertical .semi-navigation-header{padding-right:3.5px;padding-left:8px}.semi-rtl .semi-navigation-vertical .semi-navigation-header-collapsed,.semi-portal-rtl .semi-navigation-vertical .semi-navigation-header-collapsed{padding-right:3.5px;padding-left:0;transition:padding-right .1s ease-out,width .2s cubic-bezier(.62,.05,.36,.95)}.semi-rtl .semi-navigation-vertical .semi-navigation-footer .semi-navigation-collapse-btn .semi-button-content-right,.semi-portal-rtl .semi-navigation-vertical .semi-navigation-footer .semi-navigation-collapse-btn .semi-button-content-right{margin-left:auto;margin-right:12px;transition:opacity .2s cubic-bezier(.5,-.1,1,.4)}.semi-rtl .semi-navigation-horizontal,.semi-portal-rtl .semi-navigation-horizontal{direction:rtl;border-right:auto;border-left:none;padding-left:24px;padding-right:24px}.semi-rtl .semi-navigation-horizontal .semi-navigation-header,.semi-portal-rtl .semi-navigation-horizontal .semi-navigation-header{margin-right:auto;margin-left:24px}.semi-rtl .semi-navigation-horizontal .semi-navigation-list .semi-navigation-item:not(:last-of-type),.semi-portal-rtl .semi-navigation-horizontal .semi-navigation-list .semi-navigation-item:not(:last-of-type){margin-right:auto;margin-left:8px}.semi-rtl .semi-navigation-horizontal .semi-navigation-item-icon:last-child,.semi-portal-rtl .semi-navigation-horizontal .semi-navigation-item-icon:last-child{margin-left:auto;margin-right:8px}.semi-rtl .semi-navigation-horizontal .semi-navigation-item-icon:first-child,.semi-portal-rtl .semi-navigation-horizontal .semi-navigation-item-icon:first-child{margin-right:auto;margin-left:8px}.semi-rtl .semi-navigation-horizontal .semi-navigation-footer,.semi-portal-rtl .semi-navigation-horizontal .semi-navigation-footer{padding-right:auto;padding-left:0}.semi-notification-wrapper{position:fixed}.semi-notification-list{position:fixed;box-sizing:border-box;margin:0;padding:0;z-index:1010;pointer-events:none}.semi-notification-list[placement=topRight]{right:0;top:0}.semi-notification-list[placement=top]{top:0;left:50%;transform:translate(-50%)}.semi-notification-list[placement=topLeft]{left:0;top:0}.semi-notification-list[placement=bottom]{bottom:0;left:50%;transform:translate(-50%)}.semi-notification-list[placement=bottomRight]{bottom:0;right:0}.semi-notification-list[placement=bottomLeft]{bottom:0;left:0}.semi-notification-notice{box-shadow:var(--semi-shadow-elevated);border-radius:var(--semi-border-radius-medium);padding:16px 12px 16px 20px;margin:20px;width:auto;min-width:320px;background-color:var(--semi-color-bg-3);position:relative;display:flex;pointer-events:auto}.semi-notification-notice-icon{width:24px;font-size:16px;line-height:22px;font-family:Inter,-apple-system,BlinkMacSystemFont,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Segoe UI,Helvetica Neue,Helvetica,Arial,sans-serif;display:flex;align-items:flex-start;justify-content:flex-start;height:100%;margin-right:12px}.semi-notification-notice-info{color:var(--semi-color-info)}.semi-notification-notice-warning{color:var(--semi-color-warning)}.semi-notification-notice-error{color:var(--semi-color-danger)}.semi-notification-notice-success{color:var(--semi-color-success)}.semi-notification-notice-light.semi-notification-notice-warning{background-image:linear-gradient(0deg,var(--semi-color-warning-light-default),var(--semi-color-warning-light-default));background-color:var(--semi-color-bg-0);border:1px solid var(--semi-color-warning)}.semi-notification-notice-light.semi-notification-notice-success{background-image:linear-gradient(0deg,var(--semi-color-success-light-default),var(--semi-color-success-light-default));background-color:var(--semi-color-bg-0);border:1px solid var(--semi-color-success)}.semi-notification-notice-light.semi-notification-notice-info,.semi-notification-notice-light.semi-notification-notice-default{background-image:linear-gradient(0deg,var(--semi-color-info-light-default),var(--semi-color-info-light-default));background-color:var(--semi-color-bg-0);border:1px solid var(--semi-color-info)}.semi-notification-notice-light.semi-notification-notice-error{background-image:linear-gradient(0deg,var(--semi-color-danger-light-default),var(--semi-color-danger-light-default));background-color:var(--semi-color-bg-0);border:1px solid var(--semi-color-danger)}.semi-notification-notice-title{font-size:16px;line-height:22px;font-family:Inter,-apple-system,BlinkMacSystemFont,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Segoe UI,Helvetica Neue,Helvetica,Arial,sans-serif;font-weight:600;color:var(--semi-color-text-0);margin-bottom:4px;word-wrap:break-word;overflow-wrap:break-word}.semi-notification-notice-inner{display:flex;width:100%;min-width:0}.semi-notification-notice-content-wrapper{flex:1 1 auto;margin-right:8px;min-width:0}.semi-notification-notice-content{font-size:14px;line-height:20px;font-family:Inter,-apple-system,BlinkMacSystemFont,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Segoe UI,Helvetica Neue,Helvetica,Arial,sans-serif;font-weight:400;color:var(--semi-color-text-1);word-wrap:break-word;overflow-wrap:break-word}.semi-notification-notice-icon-close{height:24px}.semi-notification-notice-icon-close .semi-icon-close{color:var(--semi-color-text-2)}.semi-notification-notice-controls{display:flex;font-size:14px;line-height:20px;font-family:Inter,-apple-system,BlinkMacSystemFont,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Segoe UI,Helvetica Neue,Helvetica,Arial,sans-serif;cursor:pointer}.semi-notification-notice-detail,.semi-notification-notice-later{text-align:center;flex-grow:1}@keyframes semi-notification-slideShow_top{0%{opacity:0;transform:translateY(-100%)}to{opacity:1;transform:translateY(0)}}@keyframes semi-notification-slideHide_top{0%{opacity:1;transform:translateY(0)}to{opacity:0;transform:translateY(-100%)}}@keyframes semi-notification-slideShow_topLeft{0%{opacity:0;transform:translate(-100%)}to{opacity:1;transform:translate(0)}}@keyframes semi-notification-slideHide_topLeft{0%{opacity:1;transform:translate(0)}to{opacity:0;transform:translate(-100%)}}@keyframes semi-notification-slideShow_topRight{0%{opacity:0;transform:translate(100%)}to{opacity:1;transform:translate(0)}}@keyframes semi-notification-slideHide_topRight{0%{opacity:1;transform:translate(0)}to{opacity:0;transform:translate(100%)}}@keyframes semi-notification-slideShow_bottom{0%{opacity:0;transform:translateY(100%)}to{opacity:1;transform:translateY(0)}}@keyframes semi-notification-slideHide_bottom{0%{opacity:1;transform:translateY(0)}to{opacity:0;transform:translateY(100%)}}@keyframes semi-notification-slideShow_bottomLeft{0%{opacity:0;transform:translate(-100%)}to{opacity:1;transform:translate(0)}}@keyframes semi-notification-slideHide_bottomLeft{0%{opacity:1;transform:translate(0)}to{opacity:0;transform:translate(-100%)}}@keyframes semi-notification-slideShow_bottomRight{0%{opacity:0;transform:translate(100%)}to{opacity:1;transform:translate(0)}}@keyframes semi-notification-slideHide_bottomRight{0%{opacity:1;transform:translate(0)}to{opacity:0;transform:translate(100%)}}.semi-notification-notice-animation-show_top{animation:semi-notification-slideShow_top .3s cubic-bezier(.62,.63,0,1.13) 0ms;animation-fill-mode:forwards}.semi-notification-notice-animation-hide_top{animation:semi-notification-slideHide_top .3s cubic-bezier(.62,.63,0,1.13) 0ms;animation-fill-mode:forwards}.semi-notification-notice-animation-show_topLeft{animation:semi-notification-slideShow_topLeft .3s cubic-bezier(.62,.63,0,1.13) 0ms;animation-fill-mode:forwards}.semi-notification-notice-animation-hide_topLeft{animation:semi-notification-slideHide_topLeft .3s cubic-bezier(.62,.63,0,1.13) 0ms;animation-fill-mode:forwards}.semi-notification-notice-animation-show_topRight{animation:semi-notification-slideShow_topRight .3s cubic-bezier(.62,.63,0,1.13) 0ms;animation-fill-mode:forwards}.semi-notification-notice-animation-hide_topRight{animation:semi-notification-slideHide_topRight .3s cubic-bezier(.62,.63,0,1.13) 0ms;animation-fill-mode:forwards}.semi-notification-notice-animation-show_bottom{animation:semi-notification-slideShow_bottom .3s cubic-bezier(.62,.63,0,1.13) 0ms;animation-fill-mode:forwards}.semi-notification-notice-animation-hide_bottom{animation:semi-notification-slideHide_bottom .3s cubic-bezier(.62,.63,0,1.13) 0ms;animation-fill-mode:forwards}.semi-notification-notice-animation-show_bottomLeft{animation:semi-notification-slideShow_bottomLeft .3s cubic-bezier(.62,.63,0,1.13) 0ms;animation-fill-mode:forwards}.semi-notification-notice-animation-hide_bottomLeft{animation:semi-notification-slideHide_bottomLeft .3s cubic-bezier(.62,.63,0,1.13) 0ms;animation-fill-mode:forwards}.semi-notification-notice-animation-show_bottomRight{animation:semi-notification-slideShow_bottomRight .3s cubic-bezier(.62,.63,0,1.13) 0ms;animation-fill-mode:forwards}.semi-notification-notice-animation-hide_bottomRight{animation:semi-notification-slideHide_bottomRight .3s cubic-bezier(.62,.63,0,1.13) 0ms;animation-fill-mode:forwards}.semi-notification-notice.semi-notification-notice-rtl{padding-right:20px;padding-left:12px}.semi-notification-notice-rtl{direction:rtl}.semi-notification-notice-rtl .semi-notification-notice-icon{margin-right:12px}.semi-notification-notice-rtl .semi-notification-notice-content-wrapper{margin-right:8px}.semi-overflow-list{display:flex;flex-wrap:nowrap;min-width:0}.semi-overflow-list-spacer{flex-shrink:1;width:1px}.semi-overflow-list-scroll-wrapper{display:flex;flex:1;flex-wrap:nowrap;overflow-x:scroll}.semi-rtl .semi-overflow-list,.semi-portal-rtl .semi-overflow-list{direction:rtl}.semi-page{display:flex;list-style:none;padding:0;align-items:center;font-family:Inter,-apple-system,BlinkMacSystemFont,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Segoe UI,Helvetica Neue,Helvetica,Arial,sans-serif;margin-block-start:0;margin-block-end:0}.semi-page-small{font-size:14px;line-height:20px;font-family:Inter,-apple-system,BlinkMacSystemFont,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Segoe UI,Helvetica Neue,Helvetica,Arial,sans-serif;font-weight:400;color:var(--semi-color-text-2);padding:0}.semi-page-disabled{cursor:not-allowed}.semi-page-disabled .semi-page-total{color:var(--semi-color-disabled-text)}.semi-page-item{font-size:14px;line-height:20px;font-family:Inter,-apple-system,BlinkMacSystemFont,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Segoe UI,Helvetica Neue,Helvetica,Arial,sans-serif;min-width:32px;border:0px solid rgba(0,0,0,0);cursor:pointer;-webkit-user-select:none;user-select:none;height:32px;margin-left:4px;margin-right:4px;font-weight:400;color:var(--semi-color-text-0);border-radius:var(--semi-border-radius-small);text-align:center;line-height:32px;display:flex;align-items:center;justify-content:center;transition:background-color var(--semi-transition_duration-none) var(--semi-transition_function-easeIn) var(--semi-transition_delay-none),color var(--semi-transition_duration-none) var(--semi-transition_function-easeIn) var(--semi-transition_delay-none);transform:scale(var(--semi-transform_scale-none))}.semi-page-item:hover{border-color:#0000;background-color:var(--semi-color-fill-0);color:var(--semi-color-text-0)}.semi-page-item-rest-opening{background-color:var(--semi-color-fill-0);color:var(--semi-color-text-0)}.semi-page-item:active{border-color:#0000;background-color:var(--semi-color-fill-1);color:var(--semi-color-text-0)}.semi-page-item-active{border-color:#0000;color:var(--semi-color-primary);font-weight:600;background-color:var(--semi-color-primary-light-default)}.semi-page-item-active:hover{border-color:#0000;color:var(--semi-color-primary);background-color:var(--semi-color-primary-light-default)}.semi-page-item-disabled{border-color:#0000;color:var(--semi-color-disabled-text);background-color:#0000;cursor:not-allowed}.semi-page-item-disabled:hover{background-color:#0000}.semi-page-item-small{min-width:44px;margin:0}.semi-page-item-all-disabled{border-color:#0000;color:var(--semi-color-disabled-text);background-color:#0000;cursor:not-allowed}.semi-page-item-all-disabled:hover{background-color:#0000;color:var(--semi-color-disabled-text)}.semi-page-item-all-disabled-active{background-color:var(--semi-color-disabled-fill);font-weight:600}.semi-page-item-all-disabled-active:hover{background-color:var(--semi-color-disabled-fill)}.semi-page-total{font-size:14px;line-height:20px;font-family:Inter,-apple-system,BlinkMacSystemFont,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Segoe UI,Helvetica Neue,Helvetica,Arial,sans-serif;color:var(--semi-color-text-2)}.semi-page-prev,.semi-page-next{color:var(--semi-color-tertiary);cursor:pointer}.semi-page-prev.semi-page-item-disabled,.semi-page-next.semi-page-item-disabled{color:var(--semi-color-disabled-text);cursor:not-allowed}.semi-page-quickjump{margin-left:24px;font-size:14px;line-height:20px;font-family:Inter,-apple-system,BlinkMacSystemFont,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Segoe UI,Helvetica Neue,Helvetica,Arial,sans-serif;display:flex;justify-content:center;align-items:center;flex-shrink:0;color:var(--semi-color-text-0)}.semi-page-quickjump-input-number{max-width:50px;margin-left:4px;margin-right:4px}.semi-page-quickjump-disabled{color:var(--semi-color-disabled-text)}.semi-page .semi-select,.semi-select-dropdown{-webkit-user-select:none;user-select:none}.semi-page-rest-list{padding-top:4px;padding-bottom:4px}.semi-page-rest-list>div{position:relative}.semi-page-rest-item{height:32px;line-height:32px;display:flex;justify-content:center;box-sizing:border-box;cursor:pointer}.semi-page-rest-item:hover{background-color:var(--semi-color-fill-0)}.semi-page-rest-item:active{background-color:var(--semi-color-fill-1)}.semi-rtl .semi-page,.semi-portal-rtl .semi-page{direction:rtl}.semi-rtl .semi-page-item,.semi-portal-rtl .semi-page-item{margin-right:4px;margin-left:4px}.semi-rtl .semi-page-prev,.semi-rtl .semi-page-next,.semi-portal-rtl .semi-page-prev,.semi-portal-rtl .semi-page-next{transform:scaleX(-1)}.semi-pincode-wrapper{display:flex}.semi-pincode-wrapper .semi-input-wrapper-small{width:24px;margin-right:6px}.semi-pincode-wrapper .semi-input-wrapper-small:last-child{margin-right:0}.semi-pincode-wrapper .semi-input-wrapper-default{width:32px;margin-right:8px}.semi-pincode-wrapper .semi-input-wrapper-default:last-child{margin-right:0}.semi-pincode-wrapper .semi-input-wrapper-large{width:42px;margin-right:12px}.semi-pincode-wrapper .semi-input-wrapper-large:last-child{margin-right:0}.semi-pincode-wrapper .semi-input-wrapper input{padding:0;text-align:center}.semi-popconfirm{box-sizing:border-box;max-width:400px}.semi-popconfirm-inner{display:flex;flex-direction:column;padding:24px 24px 24px 20px;position:relative}.semi-popconfirm-header{display:flex;justify-content:flex-start}.semi-popconfirm-header-title{font-size:16px;line-height:22px;font-family:Inter,-apple-system,BlinkMacSystemFont,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Segoe UI,Helvetica Neue,Helvetica,Arial,sans-serif;font-weight:600;margin-bottom:8px;color:var(--semi-color-text-0)}.semi-popconfirm-header-icon{width:24px;height:24px;margin-right:12px}.semi-popconfirm-header .semi-icon-alert_triangle{color:var(--semi-color-warning)}.semi-popconfirm-header-body{display:inline-flex;flex-grow:1;flex-direction:column}.semi-popconfirm-body{color:var(--semi-color-text-2)}.semi-popconfirm-body-withIcon{margin-left:36px}.semi-popconfirm-body>p{margin:0;padding:0}.semi-popconfirm-footer{margin-top:25px;display:flex;justify-content:flex-end}.semi-popconfirm-footer>.semi-button:first-child:not(:last-child){margin-right:8px}.semi-popconfirm-popover{border-radius:var(--semi-border-radius-medium)}.semi-popover-with-arrow .semi-popconfirm-inner{padding:12px 12px 12px 8px}.semi-popconfirm-rtl{direction:rtl}.semi-popconfirm-rtl .semi-popconfirm-inner{padding:24px 20px 24px 24px}.semi-popconfirm-rtl .semi-popconfirm-header{margin-right:0}.semi-popconfirm-rtl .semi-popconfirm-header-icon{margin-right:0;margin-left:12px}.semi-popconfirm-rtl .semi-popconfirm-footer{justify-content:flex-end}.semi-popconfirm-rtl .semi-popconfirm-footer>.semi-button:first-child:not(:last-child){margin-right:0;margin-left:8px}.semi-popover-with-arrow.semi-popconfirm-rtl{direction:rtl}.semi-popover-with-arrow.semi-popconfirm-rtl .semi-popconfirm-inner{padding:12px 8px 12px 12px}.semi-progress{display:flex;align-items:center}.semi-progress-track{background-color:var(--semi-color-fill-0);border-radius:var(--semi-border-radius-small)}.semi-progress-horizontal{height:4px;margin-top:4px;margin-bottom:4px}.semi-progress-horizontal.semi-progress-large{height:6px}.semi-progress-horizontal .semi-progress-track{height:100%;width:100%}.semi-progress-horizontal .semi-progress-track-inner{height:100%;background-color:var(--semi-color-success);border-radius:var(--semi-border-radius-small);transition:width .3s;transition-timing-function:cubic-bezier(.62,.05,.36,.95)}.semi-progress-horizontal .semi-progress-line-text{min-width:45px;font-weight:600;margin-left:16px;color:var(--semi-color-text-0)}.semi-progress-vertical{width:4px;display:inline-flex;height:100%;margin-left:4px;margin-right:4px;flex-direction:column}.semi-progress-vertical.semi-progress-large{width:6px}.semi-progress-vertical .semi-progress-track{height:100%;width:100%}.semi-progress-vertical .semi-progress-track-inner{background-color:var(--semi-color-success);border-radius:var(--semi-border-radius-small);width:100%;transition:height .3s;transition-timing-function:cubic-bezier(.62,.05,.36,.95)}.semi-progress-vertical .semi-progress-line-text{font-weight:600;margin-top:8px}.semi-progress-circle{position:relative;display:inline-block}.semi-progress-circle-ring{display:block}.semi-progress-circle-ring-track{stroke:var(--semi-color-fill-0)}.semi-progress-circle-ring-inner{transition:stroke-dashoffset .3s;transition-timing-function:cubic-bezier(.62,.05,.36,.95);transform:rotate(-90deg);transform-origin:50% 50%;stroke:var(--semi-color-success)}.semi-progress-circle-text{position:absolute;top:50%;left:50%;width:100%;text-align:center;transform:translate(-50%,-50%);-webkit-user-select:none;user-select:none;color:var(--semi-color-mode-minor-text)}.semi-rtl .semi-progress,.semi-portal-rtl .semi-progress{direction:rtl}.semi-rtl .semi-progress-horizontal .semi-progress-line-text,.semi-portal-rtl .semi-progress-horizontal .semi-progress-line-text{margin-left:0;margin-right:16px}.semi-rtl .semi-progress-circle-ring-inner,.semi-portal-rtl .semi-progress-circle-ring-inner{transform:rotate(-90deg);transform-origin:50% 50%}.semi-rtl .semi-progress-circle-text,.semi-portal-rtl .semi-progress-circle-text{left:auto;right:50%;transform:translate(50%,-50%)}.semi-radio{box-sizing:border-box;font-size:14px;line-height:20px;font-family:Inter,-apple-system,BlinkMacSystemFont,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Segoe UI,Helvetica Neue,Helvetica,Arial,sans-serif;position:relative;display:inline-flex;column-gap:8px;transition:background-color var(--semi-transition_duration-none) var(--semi-transition_function-easeIn) var(--semi-transition_delay-none),border var(--semi-transition_duration-none) var(--semi-transition_function-easeIn) var(--semi-transition_delay-none);min-height:20px;min-width:16px;cursor:pointer;vertical-align:bottom;text-align:left}.semi-radio.semi-radio-vertical{display:block}.semi-radio input[type=checkbox],.semi-radio input[type=radio]{position:absolute;left:0;top:0;opacity:0;width:100%;height:100%;margin:0;cursor:pointer}.semi-radio:hover .semi-radio-inner-display{background:var(--semi-color-fill-0);border:solid 1px var(--semi-color-focus-border)}.semi-radio:hover.semi-radio-cardRadioGroup .semi-radio-inner-display{background:var(--semi-color-white)}.semi-radio:hover .semi-radio-inner-checked .semi-radio-inner-display{background:var(--semi-color-primary-hover);border-color:var(--semi-color-primary-hover)}.semi-radio:active.semi-radio-cardRadioGroup .semi-radio-inner-display{background:var(--semi-color-white)}.semi-radio:active .semi-radio-inner-checked .semi-radio-inner-display{background:var(--semi-color-primary-active);border-color:var(--semi-color-primary-active)}.semi-radio-buttonRadioComponent{padding:4px;background:var(--semi-color-fill-0);border-radius:var(--semi-border-radius-small)}.semi-radio-buttonRadioGroup{position:relative;padding:4px;border-radius:var(--semi-border-radius-small);line-height:16px}.semi-radio-buttonRadioGroup:not(:last-child){padding-right:0}.semi-radio-buttonRadioGroup-small{padding:2px 4px;line-height:16px}.semi-radio-buttonRadioGroup-large{padding:4px;line-height:20px}.semi-radio-cardRadioGroup{flex-wrap:nowrap;border-radius:var(--semi-border-radius-small);padding:12px 16px;background:#0000;border:1px solid rgba(0,0,0,0);transition:background-color var(--semi-transition_duration-none) var(--semi-transition_function-easeIn) var(--semi-transition_delay-none),border var(--semi-transition_duration-none) var(--semi-transition_function-easeIn) var(--semi-transition_delay-none)}.semi-radio-cardRadioGroup .semi-radio-inner{flex-shrink:0}.semi-radio-cardRadioGroup .semi-radio-inner-display{background:var(--semi-color-white)}.semi-radio-cardRadioGroup .semi-radio-addon{font-weight:600;font-size:14px;line-height:20px;color:var(--semi-color-text-0)}.semi-radio-cardRadioGroup .semi-radio-extra{font-weight:400;font-size:14px;line-height:20px;color:var(--semi-color-text-2);padding-left:0}.semi-radio-cardRadioGroup:active{background:var(--semi-color-fill-1)}.semi-radio-cardRadioGroup_checked{background:var(--semi-color-primary-light-default);border:1px solid var(--semi-color-primary)}.semi-radio-cardRadioGroup_checked:hover{border:1px solid var(--semi-color-primary-hover)}.semi-radio-cardRadioGroup_checked:hover .semi-radio-inner-checked .semi-radio-inner-display{border-color:var(--semi-color-primary-hover)}.semi-radio-cardRadioGroup_checked:active{background:var(--semi-color-primary-light-default);border:1px solid var(--semi-color-primary-active)}.semi-radio-cardRadioGroup_checked:active .semi-radio-inner-checked .semi-radio-inner-display{border-color:var(--semi-color-primary-active)}.semi-radio-cardRadioGroup_checked:active .semi-radio-inner-checked:hover .semi-radio-inner-display{background:var(--semi-color-primary-active)}.semi-radio-cardRadioGroup_hover{background:var(--semi-color-fill-0)}.semi-radio-cardRadioGroup_disabled:active{background:#0000}.semi-radio-cardRadioGroup_checked_disabled.semi-radio-cardRadioGroup{background:var(--semi-color-primary-light-default);border:1px solid var(--semi-color-primary-disabled)}.semi-radio-cardRadioGroup_checked_disabled.semi-radio-cardRadioGroup .semi-radio-inner-checked .semi-radio-inner-display,.semi-radio-cardRadioGroup_checked_disabled.semi-radio-cardRadioGroup:hover .semi-radio-inner-checked .semi-radio-inner-display{border-color:var(--semi-color-primary-disabled)}.semi-radio.semi-radio-disabled:hover .semi-radio-inner-display,.semi-radio.semi-radio-disabled:active .semi-radio-inner-display{background:var(--semi-color-disabled-fill);border:solid 1px var(--semi-color-border)}.semi-radio.semi-radio-disabled:hover .semi-radio-inner-checked .semi-radio-inner-display,.semi-radio.semi-radio-disabled:active .semi-radio-inner-checked .semi-radio-inner-display{color:rgba(var(--semi-white),1);background:var(--semi-color-primary-disabled);border-color:var(--semi-color-primary-disabled)}.semi-radio-inner{display:inline-flex;margin-top:2px;position:relative;width:16px;height:16px;vertical-align:sub;-webkit-user-select:none;user-select:none}.semi-radio-inner-display{display:inline-flex;align-items:center;justify-content:center;box-sizing:border-box;width:16px;height:16px;border:solid 1px var(--semi-color-text-3);border-radius:16px;background:#0000;transition:background-color var(--semi-transition_duration-none) var(--semi-transition_function-easeIn) var(--semi-transition_delay-none),border var(--semi-transition_duration-none) var(--semi-transition_function-easeIn) var(--semi-transition_delay-none)}.semi-radio-inner-display .semi-icon{width:100%;height:100%;font-size:14px}.semi-radio-content{display:flex;flex-direction:column;row-gap:4px}.semi-radio:hover .semi-radio-inner-display{background:var(--semi-color-fill-0)}.semi-radio:active .semi-radio-inner-display{background:var(--semi-color-fill-1)}.semi-radio-addon{-webkit-user-select:none;user-select:none;color:var(--semi-color-text-0);display:inline-flex;align-items:center}.semi-radio-addon-buttonRadio{text-align:center;border-radius:var(--semi-border-radius-small);font-weight:600;color:var(--semi-color-text-1);font-size:12px;padding:4px 16px;transition:background-color var(--semi-transition_duration-none) var(--semi-transition_function-easeIn) var(--semi-transition_delay-none),border var(--semi-transition_duration-none) var(--semi-transition_function-easeIn) var(--semi-transition_delay-none)}.semi-radio-addon-buttonRadio-hover{font-weight:600;background:var(--semi-color-fill-1)}.semi-radio-addon-buttonRadio-checked{font-weight:600;background:var(--semi-color-bg-3);color:var(--semi-color-primary)}.semi-radio-addon-buttonRadio-disabled{cursor:not-allowed;color:var(--semi-color-disabled-text)}.semi-radio-addon-buttonRadio-small{font-size:12px;padding:2px 16px}.semi-radio-addon-buttonRadio-large{font-size:14px;padding:6px 24px}.semi-radio .semi-radio-inner-checked:hover .semi-radio-inner-display{background:var(--semi-color-primary-hover)}.semi-radio .semi-radio-inner-checked:active .semi-radio-inner-display{background:var(--semi-color-primary-active)}.semi-radio .semi-radio-inner-checked .semi-radio-inner-display{border:solid 1px var(--semi-color-primary);background:var(--semi-color-primary);color:rgba(var(--semi-white),1);border-radius:16px}.semi-radio .semi-radio-inner-checked>.semi-radio-addon{color:var(--semi-color-text-0)}.semi-radio .semi-radio-inner-buttonRadio,.semi-radio .semi-radio-inner-pureCardRadio{position:absolute;top:0;left:0;width:100%;height:100%;margin-top:0;z-index:-1;opacity:0}.semi-radio-disabled,.semi-radio-disabled:hover,.semi-radio-disabled .semi-radio-inner{cursor:not-allowed}.semi-radio-disabled .semi-radio-inner-display{opacity:.75;background:var(--semi-color-disabled-fill);border-color:var(--semi-color-border)}.semi-radio-disabled .semi-radio-inner-display:hover{background:#0000}.semi-radio-disabled .semi-radio-inner-checked .semi-radio-inner-display,.semi-radio-disabled .semi-radio-inner-checked .semi-radio-inner-display:hover{color:rgba(var(--semi-white),1);background:var(--semi-color-primary-disabled);border-color:var(--semi-color-primary-disabled)}.semi-radio-disabled .semi-radio-addon,.semi-radio-disabled .semi-radio-extra{color:var(--semi-color-disabled-text)}.semi-radio-extra{color:var(--semi-color-text-2);box-sizing:border-box}.semi-radio-focus{outline:2px solid var(--semi-color-primary-light-active)}.semi-radio-focus-border{border:solid 1px var(--semi-color-focus-border)}.semi-radioGroup{font-size:14px;line-height:20px;font-family:Inter,-apple-system,BlinkMacSystemFont,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Segoe UI,Helvetica Neue,Helvetica,Arial,sans-serif}.semi-radioGroup-vertical{display:flex;flex-direction:column;row-gap:12px}.semi-radioGroup-vertical-default .semi-radio,.semi-radioGroup-vertical-card .semi-radio{display:flex}.semi-radioGroup-horizontal{display:inline-flex;flex-wrap:wrap;vertical-align:bottom;gap:16px}.semi-radioGroup-buttonRadio{display:inline-block;background:var(--semi-color-fill-0);border-radius:var(--semi-border-radius-small);vertical-align:middle}.semi-rtl .semi-radio,.semi-portal-rtl .semi-radio{direction:rtl}.semi-rtl .semi-radio input[type=checkbox],.semi-rtl .semi-radio input[type=radio],.semi-portal-rtl .semi-radio input[type=checkbox],.semi-portal-rtl .semi-radio input[type=radio]{left:auto;right:0}.semi-rtl .semi-radio-buttonRadioGroup:not(:last-child),.semi-portal-rtl .semi-radio-buttonRadioGroup:not(:last-child){padding-left:0}.semi-rtl .semi-radioGroup,.semi-portal-rtl .semi-radioGroup{direction:rtl}.semi-rating{display:inline-block;margin:0;padding:0;color:rgba(var(--semi-yellow-5),1);list-style:none;outline:none;border-radius:3px}.semi-rating-focus{outline:2px solid var(--semi-color-primary-light-active)}.semi-rating-no-focus{outline:none}.semi-rating-disabled .semi-rating-star{cursor:default}.semi-rating-disabled .semi-rating-star:hover{transform:scale(1)}.semi-rating-star{position:relative;display:inline-block;margin:0;padding:0;color:inherit;cursor:pointer;transition:all .5s;transform:scale(var(--semi-transform_scale-none))}.semi-rating-star:not(:last-child){margin-right:6px}.semi-rating-star>div:hover,.semi-rating-star>div:focus{transform:scale(1.1)}.semi-rating-star>div.semi-rating-star-disabled{transform:none}.semi-rating-star-small{width:16px;height:16px;font-size:16px}.semi-rating-star-default{width:24px;height:24px;font-size:24px}.semi-rating-star-outer{display:inline-flex;width:fit-content;height:fit-content}.semi-rating-star-wrapper{position:relative;overflow:hidden;border-radius:3px;width:100%;height:100%}.semi-rating-star-first,.semi-rating-star-second{transition:color var(--semi-transition_duration-none) var(--semi-transition_function-easeIn) var(--semi-transition_delay-none);color:var(--semi-color-fill-0);-webkit-user-select:none;user-select:none}.semi-rating-star-first{position:absolute;top:0;left:0;width:50%;height:100%;overflow:hidden;opacity:0}.semi-rating-star-half .semi-rating-star-first,.semi-rating-star-half .semi-rating-star-second{opacity:1}.semi-rating-star-half .semi-rating-star-first,.semi-rating-star-full .semi-rating-star-second{color:inherit}.semi-rtl .semi-rating,.semi-portal-rtl .semi-rating{direction:rtl}.semi-rtl .semi-rating-star:not(:last-child),.semi-portal-rtl .semi-rating-star:not(:last-child){margin-right:0;margin-left:6px}.semi-rtl .semi-rating-star-first,.semi-portal-rtl .semi-rating-star-first{left:auto;right:0}.semi-resizable-resizable{position:relative;box-sizing:border-box;flex-shrink:0}.semi-resizable-resizableHandler{position:absolute;-webkit-user-select:none;user-select:none;z-index:10}.semi-resizable-resizableHandler-top{width:100%;height:10px;left:0;cursor:row-resize;top:-5px}.semi-resizable-resizableHandler-right{width:10px;height:100%;top:0;cursor:col-resize;left:auto;right:-5px}.semi-resizable-resizableHandler-bottom{width:100%;height:10px;left:0;cursor:row-resize;top:auto;bottom:-5px}.semi-resizable-resizableHandler-left{width:10px;height:100%;top:0;cursor:col-resize;left:-5px}.semi-resizable-resizableHandler-topRight{width:20px;height:20px;position:absolute;right:-10px;top:-10px;cursor:ne-resize}.semi-resizable-resizableHandler-bottomRight{width:20px;height:20px;position:absolute;right:-10px;bottom:-10px;cursor:se-resize}.semi-resizable-resizableHandler-bottomLeft{width:20px;height:20px;position:absolute;left:-10px;bottom:-10px;cursor:sw-resize}.semi-resizable-resizableHandler-topLeft{width:20px;height:20px;position:absolute;left:-10px;top:-10px;cursor:nw-resize}.semi-resizable-group{display:flex;position:relative;box-sizing:border-box;height:100%;width:100%}.semi-resizable-item{position:relative;box-sizing:border-box;flex-shrink:0}.semi-resizable-handler{-webkit-user-select:none;user-select:none;z-index:10;display:flex;align-items:center;justify-content:center;background-color:var(--semi-color-fill-0);opacity:1}.semi-resizable-handler-vertical{width:100%;height:10px;flex-shrink:0;cursor:row-resize}.semi-resizable-handler-horizontal{height:100%;width:10px;flex-shrink:0;cursor:col-resize}.semi-resizable-background{height:100%;width:100%;top:0;right:0;bottom:0;left:0;z-index:20;opacity:0;position:fixed}.semi-scrolllist{width:100%;height:100%;background:var(--semi-color-bg-3);box-shadow:0 0 1px #0000004d,0 4px 14px #0000001a;border-radius:var(--semi-border-radius-medium);overflow:hidden;font-size:14px;line-height:20px;font-family:Inter,-apple-system,BlinkMacSystemFont,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Segoe UI,Helvetica Neue,Helvetica,Arial,sans-serif;-webkit-user-select:none;user-select:none;display:flex;flex-direction:column}.semi-scrolllist-header{text-align:center;padding:0 16px;background:#0000}.semi-scrolllist-header-title{padding:16px 0;font-weight:600;color:var(--semi-color-text-0);font-size:14px;line-height:20px;font-family:Inter,-apple-system,BlinkMacSystemFont,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Segoe UI,Helvetica Neue,Helvetica,Arial,sans-serif}.semi-scrolllist-body{display:flex;height:300px;padding:0 16px;overflow:hidden}.semi-scrolllist-body .semi-scrolllist-item-wheel .semi-scrolllist-list-outer-nocycle>ul:before,.semi-scrolllist-body .semi-scrolllist-item>ul:before{content:"";display:block;width:100%;height:132px}.semi-scrolllist-body .semi-scrolllist-item{position:relative;flex:1;overflow-x:hidden;overflow-y:auto}.semi-scrolllist-body .semi-scrolllist-item:not(:last-child){border-right:1px solid var(--semi-color-border)}.semi-scrolllist-body .semi-scrolllist-item>ul,.semi-scrolllist-body .semi-scrolllist-item-wheel .semi-scrolllist-list-outer>ul{box-sizing:border-box;width:100%;margin:0;padding:0 0 132px;list-style:none}.semi-scrolllist-body .semi-scrolllist-item>ul>li,.semi-scrolllist-body .semi-scrolllist-item-wheel .semi-scrolllist-list-outer>ul>li{list-style:none;height:36px;box-sizing:border-box;color:var(--semi-color-text-0);text-align:center;display:flex;align-items:center;justify-content:center;cursor:pointer;background-color:#0000;transition:background-color var(--semi-transition_duration-none) var(--semi-transition_function-easeOut) 0ms}.semi-scrolllist-body .semi-scrolllist-item>ul>li.semi-scrolllist-item-sel,.semi-scrolllist-body .semi-scrolllist-item-wheel .semi-scrolllist-list-outer>ul>li.semi-scrolllist-item-sel{background:var(--semi-color-primary-light-default);color:var(--semi-color-text-0)}.semi-scrolllist-body .semi-scrolllist-item>ul>li.semi-scrolllist-item-sel>svg,.semi-scrolllist-body .semi-scrolllist-item-wheel .semi-scrolllist-list-outer>ul>li.semi-scrolllist-item-sel>svg{color:var(--semi-color-text-2);width:16px;height:16px;margin-right:12px}.semi-scrolllist-body .semi-scrolllist-item>ul>li:not(.disabled):not(.semi-scrolllist-item-disabled):not(.semi-scrolllist-item-sel):not(.semi-scrolllist-item-selected),.semi-scrolllist-body .semi-scrolllist-item-wheel .semi-scrolllist-list-outer>ul>li:not(.disabled):not(.semi-scrolllist-item-disabled):not(.semi-scrolllist-item-sel):not(.semi-scrolllist-item-selected){cursor:pointer}.semi-scrolllist-body .semi-scrolllist-item>ul>li:not(.disabled):not(.semi-scrolllist-item-disabled):not(.semi-scrolllist-item-sel):not(.semi-scrolllist-item-selected):hover,.semi-scrolllist-body .semi-scrolllist-item-wheel .semi-scrolllist-list-outer>ul>li:not(.disabled):not(.semi-scrolllist-item-disabled):not(.semi-scrolllist-item-sel):not(.semi-scrolllist-item-selected):hover{background-color:var(--semi-color-fill-1)}.semi-scrolllist-body .semi-scrolllist-item>ul>li:not(.disabled):not(.semi-scrolllist-item-disabled):not(.semi-scrolllist-item-sel):not(.semi-scrolllist-item-selected):active,.semi-scrolllist-body .semi-scrolllist-item-wheel .semi-scrolllist-list-outer>ul>li:not(.disabled):not(.semi-scrolllist-item-disabled):not(.semi-scrolllist-item-sel):not(.semi-scrolllist-item-selected):active{background-color:var(--semi-color-fill-2)}.semi-scrolllist-body .semi-scrolllist-item>ul>li.semi-scrolllist-item-disabled,.semi-scrolllist-body .semi-scrolllist-item-wheel .semi-scrolllist-list-outer>ul>li.semi-scrolllist-item-disabled{color:var(--semi-color-disabled-text);cursor:not-allowed}.semi-scrolllist-body .semi-scrolllist-item-wheel{position:relative;flex:1;overflow:hidden}.semi-scrolllist-body .semi-scrolllist-item-wheel:not(:last-child){border-right:1px solid var(--semi-color-border)}.semi-scrolllist-body .semi-scrolllist-item-wheel .semi-scrolllist-item-selected{font-weight:600;color:var(--semi-color-primary)!important}.semi-scrolllist-body .semi-scrolllist-item-wheel .semi-scrolllist-list-outer{overflow-x:hidden;overflow-y:auto;height:100%;width:100%;padding-right:18px}.semi-scrolllist-body .semi-scrolllist-item-wheel .semi-scrolllist-shade{width:100%;height:50%;pointer-events:none;position:absolute}.semi-scrolllist-body .semi-scrolllist-item-wheel .semi-scrolllist-shade-pre{top:0;margin-top:-19px;background:var(--semi-color-bg-3);opacity:.5}.semi-scrolllist-body .semi-scrolllist-item-wheel .semi-scrolllist-shade-post{top:50%;margin-top:19px;background:var(--semi-color-bg-3);opacity:.5}.semi-scrolllist-body .semi-scrolllist-item-wheel .semi-scrolllist-selector{pointer-events:none;position:absolute;top:50%;border-top:1px solid var(--semi-color-border);border-bottom:1px solid var(--semi-color-border);height:36px;width:100%;transform:translateY(-50%)}.semi-scrolllist .semi-scrolllist-footer{border-top:1px solid var(--semi-color-border);padding:10px}.semi-scrolllist .semi-scrolllist-line{background:var(--semi-color-border);height:1px}.semi-rtl .semi-scrolllist,.semi-portal-rtl .semi-scrolllist{direction:rtl}.semi-rtl .semi-scrolllist-body .semi-scrolllist-item:not(:last-child),.semi-portal-rtl .semi-scrolllist-body .semi-scrolllist-item:not(:last-child){border-right:0;border-left:1px solid var(--semi-color-border)}.semi-rtl .semi-scrolllist-body .semi-scrolllist-item>ul>li.semi-scrolllist-item-sel>svg,.semi-rtl .semi-scrolllist-body .semi-scrolllist-item-wheel .semi-scrolllist-list-outer>ul>li.semi-scrolllist-item-sel>svg,.semi-portal-rtl .semi-scrolllist-body .semi-scrolllist-item>ul>li.semi-scrolllist-item-sel>svg,.semi-portal-rtl .semi-scrolllist-body .semi-scrolllist-item-wheel .semi-scrolllist-list-outer>ul>li.semi-scrolllist-item-sel>svg{margin-right:0;margin-left:12px}.semi-rtl .semi-scrolllist-body .semi-scrolllist-item-wheel:not(:last-child),.semi-portal-rtl .semi-scrolllist-body .semi-scrolllist-item-wheel:not(:last-child){border-right:0;border-left:1px solid var(--semi-color-border)}.semi-rtl .semi-scrolllist-body .semi-scrolllist-item-wheel .semi-scrolllist-list-outer,.semi-portal-rtl .semi-scrolllist-body .semi-scrolllist-item-wheel .semi-scrolllist-list-outer{padding-right:0;padding-left:18px}.semi-select-option{font-size:14px;line-height:20px;font-family:Inter,-apple-system,BlinkMacSystemFont,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Segoe UI,Helvetica Neue,Helvetica,Arial,sans-serif;word-break:break-all;padding:8px 12px;color:var(--semi-color-text-0);border-radius:0;position:relative;display:flex;flex-wrap:nowrap;align-items:center;cursor:pointer;box-sizing:border-box;transition:background-color var(--semi-transition_duration-none) var(--semi-transition_function-easeIn) var(--semi-transition_delay-none)}.semi-select-option-icon{width:12px;color:#0000;margin-right:8px;display:flex;justify-content:center;align-content:center}.semi-select-option-text{display:flex;flex-wrap:wrap;white-space:pre}.semi-select-option-keyword{color:var(--semi-color-primary);background-color:inherit;font-weight:600}.semi-select-option:active{background-color:var(--semi-color-fill-1)}.semi-select-option-empty{cursor:not-allowed;color:var(--semi-color-disabled-text);justify-content:center}.semi-select-option-empty:hover,.semi-select-option-empty:active{background-color:inherit}.semi-select-option-disabled{color:var(--semi-color-disabled-text);cursor:not-allowed}.semi-select-option-disabled:hover{background-color:var(--semi-color-fill-0)}.semi-select-option-selected{font-weight:600;background:#0000}.semi-select-option-selected .semi-select-option-icon{color:var(--semi-color-text-2)}.semi-select-option-focused{background-color:var(--semi-color-fill-0)}.semi-select{box-sizing:border-box;border-radius:var(--semi-border-radius-small);border:1px solid rgba(0,0,0,0);height:32px;font-weight:400;background-color:var(--semi-color-fill-0);display:inline-flex;vertical-align:middle;position:relative;outline:none;cursor:pointer;transition:background-color var(--semi-transition_duration-none) var(--semi-transition_function-easeIn) var(--semi-transition_delay-none),border var(--semi-transition_duration-none) var(--semi-transition_function-easeIn) var(--semi-transition_delay-none);transform:scale(var(--semi-transform_scale-none));max-height:300px;overflow-y:auto}.semi-select:hover{background-color:var(--semi-color-fill-1);border:1px solid rgba(0,0,0,0)}.semi-select:focus{border:1px solid var(--semi-color-focus-border);background-color:var(--semi-color-fill-0);outline:0}.semi-select:active{background-color:var(--semi-color-fill-2)}.semi-select-small{height:24px;line-height:24px}.semi-select-large{min-height:40px;line-height:40px}.semi-select-large .semi-select-selection{font-size:16px;line-height:22px;font-family:Inter,-apple-system,BlinkMacSystemFont,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Segoe UI,Helvetica Neue,Helvetica,Arial,sans-serif}.semi-select-open,.semi-select-focus{border:1px solid var(--semi-color-focus-border);outline:0}.semi-select-open:hover,.semi-select-focus:hover{background-color:var(--semi-color-fill-0);border:1px solid var(--semi-color-focus-border)}.semi-select-open:active,.semi-select-focus:active{background-color:var(--semi-color-fill-2);border:1px solid var(--semi-color-focus-border)}.semi-select-warning{background-color:var(--semi-color-warning-light-default);border-color:var(--semi-color-warning-light-default)}.semi-select-warning:hover{background-color:var(--semi-color-warning-light-hover);border-color:var(--semi-color-warning-light-hover)}.semi-select-warning:focus{background-color:var(--semi-color-warning-light-default);border-color:var(--semi-color-warning)}.semi-select-warning:active{background-color:var(--semi-color-warning-light-active);border-color:var(--semi-color-warning-light-active)}.semi-select-error{background-color:var(--semi-color-danger-light-default);border-color:var(--semi-color-danger-light-default)}.semi-select-error:hover{background-color:var(--semi-color-danger-light-hover);border-color:var(--semi-color-danger-light-hover)}.semi-select-error:focus{background-color:var(--semi-color-danger-light-default);border-color:var(--semi-color-danger)}.semi-select-error:active{background-color:var(--semi-color-danger-light-active);border-color:var(--semi-color-danger-light-active)}.semi-select-disabled{cursor:not-allowed;background-color:var(--semi-color-disabled-fill)}.semi-select-disabled:hover{background-color:var(--semi-color-disabled-fill)}.semi-select-disabled:focus{border:1px solid rgba(0,0,0,0);background-color:var(--semi-color-disabled-fill)}.semi-select-disabled .semi-select-selection,.semi-select-disabled .semi-select-selection-placeholder{color:var(--semi-color-disabled-text);cursor:not-allowed}.semi-select-disabled .semi-select-arrow,.semi-select-disabled .semi-select-prefix,.semi-select-disabled .semi-select-suffix{color:var(--semi-color-disabled-text)}.semi-select-disabled .semi-tag{color:var(--semi-color-disabled-text);background-color:#0000}.semi-select-selection{font-size:14px;line-height:20px;font-family:Inter,-apple-system,BlinkMacSystemFont,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Segoe UI,Helvetica Neue,Helvetica,Arial,sans-serif;height:100%;display:flex;align-items:center;flex-grow:1;overflow:hidden;margin-left:12px;cursor:pointer;color:var(--semi-color-text-0)}.semi-select-selection-text{width:100%;overflow:hidden;text-overflow:ellipsis}.semi-select-selection-text-inactive{display:flex;opacity:.4}.semi-select-selection-text-hide{display:none}.semi-select-selection-placeholder{color:var(--semi-color-text-2)}.semi-select-selection .semi-tag{margin-top:1px;margin-right:4px;margin-bottom:1px}.semi-select-selection .semi-tag:nth-of-type(1){margin-left:0}.semi-select-selection .semi-tag-group{height:inherit}.semi-select-selection .semi-tag-group .semi-tag{margin-top:1px;margin-right:4px;margin-bottom:1px}.semi-select-content-wrapper{white-space:nowrap;overflow:hidden;display:flex;align-items:center;height:100%}.semi-select-content-wrapper-collapse{display:inline-flex;flex-shrink:0;width:100%}.semi-select-content-wrapper-collapse .semi-overflow-list-overflow{max-width:100%;min-width:50px}.semi-select-content-wrapper-collapse>.semi-select-content-wrapper-collapse-tag{background-color:#0000}.semi-select-content-wrapper-collapse>.semi-select-content-wrapper-collapse-N{background-color:#0000;padding:4px;color:var(--semi-color-text-0);font-size:12px}.semi-select-multiple{height:auto}.semi-select-multiple .semi-select-selection{margin-left:4px}.semi-select-multiple .semi-select-content-wrapper{width:100%;min-height:30px;flex-wrap:wrap}.semi-select-multiple .semi-select-content-wrapper-empty{margin-left:8px}.semi-select-multiple .semi-select-content-wrapper .semi-tag-group{display:flex;align-items:center}.semi-select-multiple .semi-select-content-wrapper-one-line{flex-wrap:nowrap}.semi-select-multiple .semi-select-content-wrapper-one-line .semi-tag-group{flex-wrap:nowrap;justify-content:flex-start;overflow:hidden;flex-shrink:0}.semi-select-multiple .semi-select-inline-label-wrapper{flex-shrink:0}.semi-select-multiple.semi-select-large .semi-select-content-wrapper{min-height:38px}.semi-select-multiple.semi-select-small .semi-select-content-wrapper{min-height:22px}.semi-select-arrow{display:flex;align-items:center;justify-content:center;width:32px;color:var(--semi-color-text-2);flex-shrink:0;transform:rotate(var(--semi-transform-rotate-none))}.semi-select-arrow-empty{display:flex;width:12px}.semi-select-prefix,.semi-select-suffix{display:flex;justify-content:center;align-items:center}.semi-select-prefix-text,.semi-select-suffix-text{margin:0 12px;color:var(--semi-color-text-2);font-size:14px;line-height:20px;font-family:Inter,-apple-system,BlinkMacSystemFont,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Segoe UI,Helvetica Neue,Helvetica,Arial,sans-serif;font-weight:600}.semi-select-prefix-icon,.semi-select-suffix-icon{color:var(--semi-color-text-2);margin:0 8px}.semi-select-suffix{display:flex;justify-content:center;align-items:center}.semi-select-clear{display:flex;justify-content:center;align-items:center;width:32px;color:var(--semi-color-text-2);flex-shrink:0}.semi-select-clear:hover{color:var(--semi-color-primary)}.semi-select-inset-label-wrapper{display:inline}.semi-select-inset-label{margin:0 12px;font-weight:600;font-size:14px;line-height:20px;font-family:Inter,-apple-system,BlinkMacSystemFont,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Segoe UI,Helvetica Neue,Helvetica,Arial,sans-serif;color:var(--semi-color-text-2);flex-shrink:0;white-space:nowrap}.semi-select-create-tips{color:var(--semi-color-text-2);margin-right:4px}.semi-select-with-prefix .semi-select-selection{margin-left:0}.semi-select-single.semi-select-filterable .semi-select-content-wrapper{flex-grow:1;height:100%;overflow:hidden;position:relative}.semi-select-single.semi-select-filterable .semi-input-wrapper{position:absolute;top:0;left:0;height:100%;width:100%;border:none;background-color:#0000}.semi-select-single.semi-select-filterable .semi-input-wrapper-focus{border:none}.semi-select-single.semi-select-filterable .semi-input{padding-left:0;padding-right:0;height:100%}.semi-select-multiple.semi-select-filterable .semi-select-content-wrapper{flex-grow:1;height:100%;overflow:hidden;position:relative}.semi-select-multiple.semi-select-filterable .semi-select-content-wrapper:not(.semi-select-content-wrapper-empty) .semi-input-wrapper{height:24px;line-height:24px}.semi-select-multiple.semi-select-filterable .semi-select-content-wrapper:not(.semi-select-content-wrapper-empty) .semi-input-wrapper .semi-input-default{height:24px}.semi-select-multiple.semi-select-filterable .semi-select-content-wrapper-empty .semi-input-wrapper{position:absolute;top:0;left:0;height:100%}.semi-select-multiple.semi-select-filterable .semi-select-content-wrapper-empty .semi-input-wrapper .semi-input-default{height:100%}.semi-select-multiple.semi-select-filterable .semi-input-wrapper{height:100%;width:100%;border:none;background-color:#0000}.semi-select-multiple.semi-select-filterable .semi-input-wrapper-focus{border:none}.semi-select-multiple.semi-select-filterable .semi-input{padding-left:0;padding-right:0}.semi-select-multiple.semi-select-filterable.semi-select-large .semi-select-content-wrapper:not(.semi-select-content-wrapper-empty) .semi-input-wrapper-large{height:24px;line-height:24px}.semi-select-multiple.semi-select-filterable.semi-select-large .semi-select-content-wrapper:not(.semi-select-content-wrapper-empty) .semi-input-wrapper-large .semi-input-large{height:24px}.semi-select-multiple.semi-select-filterable.semi-select-small .semi-select-content-wrapper:not(.semi-select-content-wrapper-empty) .semi-input-wrapper{height:20px;line-height:20px}.semi-select-multiple.semi-select-filterable.semi-select-small .semi-select-content-wrapper:not(.semi-select-content-wrapper-empty) .semi-input-wrapper .semi-input-small{height:20px}.semi-select-option-list-wrapper{padding:4px 0}.semi-select-option-list{overflow-x:hidden;overflow-y:auto}.semi-select-option-list-chosen .semi-select-option-icon{display:flex}.semi-select-group{color:var(--semi-color-text-2);margin-top:4px;padding:12px 16px 4px 32px;font-size:12px;line-height:16px;font-family:Inter,-apple-system,BlinkMacSystemFont,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Segoe UI,Helvetica Neue,Helvetica,Arial,sans-serif;cursor:default}.semi-select-group:not(:nth-of-type(1)){border-top:1px solid var(--semi-color-border)}.semi-select-loading-wrapper{padding:8px 16px;cursor:not-allowed;height:20px;box-sizing:content-box}.semi-select-borderless:not(:focus-within):not(:hover){background-color:#0000;border-color:#0000}.semi-select-borderless:not(:focus-within):not(:hover) .semi-select-arrow{opacity:0}.semi-select-borderless:focus-within:not(:active){background-color:#0000}.semi-select-borderless.semi-select-error:not(:focus-within){border-color:var(--semi-color-danger)}.semi-select-borderless.semi-select-warning:not(:focus-within){border-color:var(--semi-color-warning)}.semi-select-borderless.semi-select-error:focus-within{border-color:var(--semi-color-danger)}.semi-select-borderless.semi-select-warning:focus-within{border-color:var(--semi-color-warning)}.semi-select-dropdown-search-wrapper{padding:8px 12px;border-bottom:1px solid rgba(0,0,0,0)}.semi-rtl .semi-select,.semi-portal-rtl .semi-select{direction:rtl}.semi-rtl .semi-select-selection,.semi-portal-rtl .semi-select-selection{margin-left:0;margin-right:12px}.semi-rtl .semi-select-selection .semi-tag:nth-of-type(1),.semi-portal-rtl .semi-select-selection .semi-tag:nth-of-type(1){margin-right:0}.semi-rtl .semi-select-selection .semi-tag-group .semi-tag,.semi-portal-rtl .semi-select-selection .semi-tag-group .semi-tag{margin-left:4px;margin-right:0}.semi-rtl .semi-select-multiple .semi-select-selection,.semi-portal-rtl .semi-select-multiple .semi-select-selection{margin-left:0;margin-right:4px}.semi-rtl .semi-select-multiple .semi-select-content-wrapper-empty,.semi-portal-rtl .semi-select-multiple .semi-select-content-wrapper-empty{margin-left:0;margin-right:8px}.semi-rtl .semi-select-create-tips,.semi-portal-rtl .semi-select-create-tips{margin-right:0;margin-left:4px}.semi-rtl .semi-select-with-prefix .semi-select-selection,.semi-portal-rtl .semi-select-with-prefix .semi-select-selection{margin-left:auto;margin-right:0}.semi-rtl .semi-select-single.semi-select-filterable .semi-input-wrapper,.semi-portal-rtl .semi-select-single.semi-select-filterable .semi-input-wrapper,.semi-rtl .semi-select-multiple.semi-select-filterable .semi-select-content-wrapper-empty .semi-input-wrapper,.semi-portal-rtl .semi-select-multiple.semi-select-filterable .semi-select-content-wrapper-empty .semi-input-wrapper{left:auto;right:0}.semi-rtl .semi-select-group,.semi-portal-rtl .semi-select-group{padding-left:32px;padding-right:16px}.semi-rtl .semi-select-option-icon,.semi-portal-rtl .semi-select-option-icon{margin-right:0;margin-left:8px}.semi-sidesheet{font-size:14px;line-height:20px;font-family:Inter,-apple-system,BlinkMacSystemFont,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Segoe UI,Helvetica Neue,Helvetica,Arial,sans-serif;position:fixed;margin:0;top:0;left:0;height:100%}.semi-sidesheet-inner:focus,.semi-sidesheet-content:focus{outline:none}.semi-sidesheet-inner-wrap{position:absolute}.semi-sidesheet-left,.semi-sidesheet-right{top:0;width:0%;height:100%}.semi-sidesheet-left .semi-sidesheet-inner-wrap,.semi-sidesheet-right .semi-sidesheet-inner-wrap{height:100%}.semi-sidesheet-left.semi-sidesheet,.semi-sidesheet-right.semi-sidesheet{width:100%}.semi-sidesheet-right,.semi-sidesheet-right .semi-sidesheet-inner-wrap{right:0}.semi-sidesheet-top,.semi-sidesheet-bottom{left:0;width:100%;height:0%}.semi-sidesheet-top .semi-sidesheet-inner-wrap,.semi-sidesheet-bottom .semi-sidesheet-inner-wrap{width:100%}.semi-sidesheet-top.semi-sidesheet,.semi-sidesheet-bottom.semi-sidesheet{height:100%}.semi-sidesheet-top{top:0}.semi-sidesheet-bottom,.semi-sidesheet-bottom .semi-sidesheet-inner-wrap{bottom:0}.semi-sidesheet-title{flex:1 0 auto;margin:0;line-height:24px;font-family:Inter,-apple-system,BlinkMacSystemFont,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Segoe UI,Helvetica Neue,Helvetica,Arial,sans-serif;font-weight:600;font-size:18px;color:var(--semi-color-text-0);text-align:left}.semi-sidesheet-inner{z-index:1;overflow:auto;background-color:var(--semi-color-bg-2);-webkit-backdrop-filter:none;backdrop-filter:none;border:0}.semi-sidesheet-header{display:flex;align-items:flex-start;padding:24px 24px 20px;border-bottom:0px solid var(--semi-color-border)}.semi-sidesheet-body{padding:0 24px;flex:1;overflow:auto}.semi-sidesheet-size-small{width:448px}.semi-sidesheet-size-medium{width:684px}.semi-sidesheet-size-large{width:920px}.semi-sidesheet-size-small.semi-sidesheet{width:448px}.semi-sidesheet-size-medium.semi-sidesheet{width:684px}.semi-sidesheet-size-large.semi-sidesheet{width:920px}.semi-sidesheet-content{height:100%;display:flex;flex-direction:column;box-sizing:border-box;overflow:hidden}.semi-sidesheet-mask{position:absolute;top:0;left:0;width:100%;height:100%;background-color:var(--semi-color-overlay-bg);-webkit-backdrop-filter:none;backdrop-filter:none;opacity:1}.semi-sidesheet-mask-hidden{opacity:0;display:none}.semi-sidesheet-footer{padding:24px}@keyframes semi-sidesheet-slideShow_top{0%{transform:translateY(-100%)}to{transform:translateY(0)}}@keyframes semi-sidesheet-slideHide_top{0%{transform:translateY(0)}to{transform:translateY(-100%)}}@keyframes semi-sidesheet-slideShow_bottom{0%{transform:translateY(100%)}to{transform:translateY(0)}}@keyframes semi-sidesheet-slideHide_bottom{0%{transform:translateY(0)}to{transform:translateY(100%)}}@keyframes semi-sidesheet-slideShow_left{0%{transform:translate(-100%)}to{transform:translate(0)}}@keyframes semi-sidesheet-slideHide_left{0%{transform:translate(0)}to{transform:translate(-100%)}}@keyframes semi-sidesheet-slideShow_right{0%{transform:translate(100%)}to{transform:translate(0)}}@keyframes semi-sidesheet-slideHide_right{0%{transform:translate(0)}to{transform:translate(100%)}}@keyframes semi-sidesheet-opacityShow{0%{opacity:0}to{opacity:1}}@keyframes semi-sidesheet-opacityHide{0%{opacity:1}to{opacity:0}}.semi-sidesheet-animation-content_show_top{animation:semi-sidesheet-slideShow_top .18s cubic-bezier(.25,.46,.45,.94) 0ms;animation-fill-mode:forwards}.semi-sidesheet-animation-content_hide_top{animation:semi-sidesheet-slideHide_top .18s cubic-bezier(.25,.46,.45,.94) 0ms;animation-fill-mode:forwards}.semi-sidesheet-animation-content_show_bottom{animation:semi-sidesheet-slideShow_bottom .18s cubic-bezier(.25,.46,.45,.94) 0ms;animation-fill-mode:forwards}.semi-sidesheet-animation-content_hide_bottom{animation:semi-sidesheet-slideHide_bottom .18s cubic-bezier(.25,.46,.45,.94) 0ms;animation-fill-mode:forwards}.semi-sidesheet-animation-content_show_left{animation:semi-sidesheet-slideShow_left .18s cubic-bezier(.25,.46,.45,.94) 0ms;animation-fill-mode:forwards}.semi-sidesheet-animation-content_hide_left{animation:semi-sidesheet-slideHide_left .18s cubic-bezier(.25,.46,.45,.94) 0ms;animation-fill-mode:forwards}.semi-sidesheet-animation-content_show_right{animation:semi-sidesheet-slideShow_right .18s cubic-bezier(.25,.46,.45,.94) 0ms;animation-fill-mode:forwards}.semi-sidesheet-animation-content_hide_right{animation:semi-sidesheet-slideHide_right .18s cubic-bezier(.25,.46,.45,.94) 0ms;animation-fill-mode:forwards}.semi-sidesheet-animation-mask_show{animation:semi-sidesheet-opacityShow .18s cubic-bezier(.25,.46,.45,.94) 0ms;animation-fill-mode:forwards}.semi-sidesheet-animation-mask_hide{animation:semi-sidesheet-opacityHide .18s cubic-bezier(.25,.46,.45,.94) 0ms;animation-fill-mode:forwards}.semi-sidesheet-fixed .semi-sidesheet-inner{box-shadow:var(--semi-shadow-elevated)}.semi-sidesheet-fixed.semi-sidesheet-left,.semi-sidesheet-fixed.semi-sidesheet-left .semi-sidesheet-inner{left:0}.semi-sidesheet-fixed.semi-sidesheet-right{left:auto}.semi-sidesheet-fixed.semi-sidesheet-right .semi-sidesheet-inner{right:0}.semi-sidesheet-fixed.semi-sidesheet-top,.semi-sidesheet-fixed.semi-sidesheet-bottom{height:auto}.semi-sidesheet-fixed.semi-sidesheet-bottom{top:auto}.semi-sidesheet-fixed.semi-sidesheet-bottom .semi-sidesheet-inner{bottom:0}.semi-sidesheet.semi-sidesheet-popup{position:absolute}.semi-sidesheet-hidden{display:none}.semi-sidesheet-rtl .semi-sidesheet-inner{direction:rtl}.semi-sidesheet-rtl .semi-sidesheet-title{text-align:right}.semi-sidebar-main .semi-sidebar-container-content{overflow:hidden}.semi-sidebar-main-content-wrapper{display:flex;flex-direction:column;height:100%}.semi-sidebar-main-content{padding:12px;height:100%;box-sizing:border-box;overflow:auto}.semi-sidebar-container{height:100%;border-left:1px solid var(--semi-color-border);box-sizing:border-box;display:flex;flex-direction:column;overflow:hidden;position:relative}.semi-sidebar-container-header{display:flex;align-items:center;padding:12px 12px 12px 20px;border-bottom:1px solid var(--semi-color-border)}.semi-sidebar-container-header-title{flex:1;font-size:16px;line-height:22px;font-family:Inter,-apple-system,BlinkMacSystemFont,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Segoe UI,Helvetica Neue,Helvetica,Arial,sans-serif;font-weight:600}.semi-sidebar-container-header-closeBtn{flex-shrink:0}.semi-sidebar-container-content{flex:1 1;overflow:hidden}.semi-sidebar-container .semi-toast-wrapper{position:absolute}@keyframes semi-sidebar-slideShow_right{0%{transform:translate(100%)}to{transform:translate(0)}}@keyframes semi-sidebar-slideHide_right{0%{transform:translate(0)}to{transform:translate(100%)}}.semi-sidebar-animation-content_show{animation:semi-sidebar-slideShow_right .18s cubic-bezier(.25,.46,.45,.94) 0ms;animation-fill-mode:forwards}.semi-sidebar-animation-content_hide{animation:semi-sidebar-slideHide_right .18s cubic-bezier(.25,.46,.45,.94) 0ms;animation-fill-mode:forwards}.semi-sidebar-mcp-configure-content{padding:20px 16px;display:flex;flex-direction:column;height:100%;box-sizing:border-box}.semi-sidebar-mcp-configure-content-header{display:flex;align-items:center;justify-content:space-between}.semi-sidebar-mcp-configure-content-header-count{font-size:12px;line-height:16px;font-family:Inter,-apple-system,BlinkMacSystemFont,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Segoe UI,Helvetica Neue,Helvetica,Arial,sans-serif;vertical-align:middle;color:var(--semi-color-text-2)}.semi-sidebar-mcp-configure-content-search{margin:16px 0}.semi-sidebar-mcp-configure-content-search-container{display:flex;column-gap:8px}.semi-sidebar-mcp-configure-content-item-container{overflow-y:auto}.semi-sidebar-mcp-configure-content-item{padding:8px 16px;display:flex;align-items:center;border-bottom:1px solid var(--semi-color-border)}.semi-sidebar-mcp-configure-content-item-sign{width:32px;height:32px;margin-right:12px;flex-shrink:0}.semi-sidebar-mcp-configure-content-item-sign .semi-icon{font-size:32px}.semi-sidebar-mcp-configure-content-item-content{justify-content:center;flex:1;min-width:0;margin-right:24px}.semi-sidebar-mcp-configure-content-item-content-label{font-size:14px;line-height:20px;font-family:Inter,-apple-system,BlinkMacSystemFont,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Segoe UI,Helvetica Neue,Helvetica,Arial,sans-serif;font-weight:600;color:var(--semi-color-text-0)}.semi-sidebar-mcp-configure-content-item-content-desc{font-size:12px;line-height:16px;font-family:Inter,-apple-system,BlinkMacSystemFont,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Segoe UI,Helvetica Neue,Helvetica,Arial,sans-serif;color:var(--semi-color-text-0);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:100%}.semi-sidebar-mcp-configure-content-item-button{flex-shrink:0}.semi-sidebar-mcp-configure-content-item-button-configure{margin-right:12px}.semi-sidebar-mcp-configure-content-item-button.semi-button.semi-button-with-icon-only{width:24px;height:24px}.semi-sidebar-mcp-configure-content-custom-empty{margin-top:64px}.semi-sidebar-annotation .semi-sidebar-container-content{padding:12px;overflow:auto}.semi-sidebar-annotation-content{display:flex;flex-direction:row;flex-wrap:wrap;gap:8px;width:100%}.semi-sidebar-annotation-item{cursor:pointer}.semi-sidebar-annotation-item-title{overflow:hidden;text-overflow:ellipsis;white-space:normal;max-width:100%;display:-webkit-box;line-clamp:2;-webkit-line-clamp:2;-webkit-box-orient:vertical;font-size:14px;line-height:20px;font-family:Inter,-apple-system,BlinkMacSystemFont,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Segoe UI,Helvetica Neue,Helvetica,Arial,sans-serif;color:var(--semi-color-text-0);font-weight:600}.semi-sidebar-annotation-item-footer{display:flex;column-gap:4px;align-items:center}.semi-sidebar-annotation-item-footer-logo{font-size:14px;width:14px;height:14px}.semi-sidebar-annotation-item-footer-text{font-size:12px;line-height:16px;font-family:Inter,-apple-system,BlinkMacSystemFont,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Segoe UI,Helvetica Neue,Helvetica,Arial,sans-serif;color:var(--semi-color-text-0);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;flex-grow:1}.semi-sidebar-annotation-item-footer-order{box-sizing:border-box;min-width:16px;padding:0 2px;height:16px;border-radius:8px;background-color:var(--semi-color-fill-1);display:flex;align-items:center;justify-content:center;font-size:12px;line-height:16px;font-family:Inter,-apple-system,BlinkMacSystemFont,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Segoe UI,Helvetica Neue,Helvetica,Arial,sans-serif;color:var(--semi-color-text-2)}.semi-sidebar-annotation-item-text{padding:3px 12px;width:100%;row-gap:8px;display:flex;flex-direction:column}.semi-sidebar-annotation-item-text-detail{overflow:hidden;text-overflow:ellipsis;white-space:normal;max-width:100%;display:-webkit-box;line-clamp:4;-webkit-line-clamp:4;-webkit-box-orient:vertical;font-size:12px;line-height:16px;font-family:Inter,-apple-system,BlinkMacSystemFont,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Segoe UI,Helvetica Neue,Helvetica,Arial,sans-serif;color:var(--semi-color-text-2)}.semi-sidebar-annotation-item-video{border-radius:6px;border:1px solid var(--semi-color-border);overflow:hidden;width:calc((100% - 8px)/2);box-sizing:border-box}.semi-sidebar-annotation-item-video-content{padding:8px 8px 12px;display:flex;flex-direction:column;row-gap:8px}.semi-sidebar-annotation-item-video .semi-sidebar-annotation-item-title{height:40px}.semi-sidebar-annotation-item-video-img{width:100%;height:100%;object-fit:cover}.semi-sidebar-annotation-item-video-img-wrapper{position:relative;width:100%;height:107px}.semi-sidebar-annotation-item-video-play{position:absolute;top:6px;right:6px;border:1px solid var(--semi-color-bg-0);background:var(--semi-color-text-2);color:var(--semi-color-bg-0);border-radius:50%;width:20px;height:20px}.semi-sidebar-annotation-item-video-play.semi-icon{display:inline-flex;align-items:center;justify-content:center;font-size:12px}.semi-sidebar-annotation-item-video-duration{padding:2px 4px;position:absolute;bottom:6px;right:6px;background-color:rgba(var(--semi-grey-7),.7);border-radius:4px;font-size:12px;line-height:16px;font-family:Inter,-apple-system,BlinkMacSystemFont,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Segoe UI,Helvetica Neue,Helvetica,Arial,sans-serif;color:var(--semi-color-bg-0)}.semi-sidebar-annotation-item-video-title{font-size:14px;line-height:20px;font-family:Inter,-apple-system,BlinkMacSystemFont,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Segoe UI,Helvetica Neue,Helvetica,Arial,sans-serif;color:var(--semi-color-text-0)}.semi-sidebar-code-content{height:100%}.semi-sidebar-code-content .semi-codeHighlight-defaultTheme pre[class*=language-],.semi-sidebar-main-content .semi-codeHighlight-defaultTheme pre[class*=language-]{margin:0;padding-top:0;padding-bottom:0;background-color:#0000;overflow-y:hidden;overflow-x:auto}.semi-sidebar-code-content .semi-codeHighlight .line-numbers .line-numbers-rows,.semi-sidebar-main-content .semi-codeHighlight .line-numbers .line-numbers-rows{border-right:none}.semi-sidebar-code-content .semi-json-viewer,.semi-sidebar-main-content .semi-json-viewer{padding-top:0;padding-bottom:0;background-color:#0000}.semi-sidebar-collapse .semi-collapse-item{border:1px solid var(--semi-color-border);border-radius:8px}.semi-sidebar-collapse .semi-collapse-item:not(:last-child){margin-bottom:8px}.semi-sidebar-collapse .semi-collapse-header{padding:8px 16px;margin:0;font-weight:400}.semi-sidebar-collapse-header-content{display:flex;align-items:center;gap:8px;width:100%;padding-right:8px}.semi-sidebar-collapse-header-content .semi-icon{color:var(--semi-color-text-1)}.semi-sidebar-collapse-header-text{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.semi-sidebar-collapse-header-expand-btn{flex-shrink:0}.semi-sidebar-collapse-header-expand-btn.semi-button.semi-button-with-icon-only{padding:4px;width:24px;height:24px}.semi-sidebar-collapse .semi-collapse-item-active .semi-collapsible-wrapper{border-top:1px solid var(--semi-color-border)}.semi-sidebar-collapse-code .semi-collapse-content{padding:12px 0}.semi-sidebar-options{display:flex;flex-direction:row;flex-wrap:wrap;gap:8px;padding:8px 12px;border-bottom:1px solid var(--semi-color-border)}.semi-sidebar-options-button .semi-button-content-right{margin-left:4px}.semi-sidebar-options-normal.semi-button-primary.semi-button-light{color:var(--semi-color-text-2);font-weight:400}.semi-sidebar-file .tiptap{font-size:14px;line-height:24px}.semi-sidebar-file .tiptap ::selection{background:rgba(var(--semi-light-blue-1),1)}.semi-sidebar-file .tiptap ::-moz-selection{background:rgba(var(--semi-light-blue-1),1)}.semi-sidebar-file .tiptap p.is-editor-empty:first-child:before{color:var(--semi-color-text-2);content:attr(data-placeholder);float:left;height:0;pointer-events:none}.semi-sidebar-file .tiptap p{margin:0;white-space:pre-wrap;color:var(--semi-color-text-0)}.semi-sidebar-file .tiptap blockquote{border-left:3px solid var(--semi-color-border);margin:24px 0;padding-left:16px}.semi-sidebar-file .tiptap:focus{outline:none}.semi-sidebar-file .tiptap pre{background-color:var(--semi-color-fill-0);padding:2px 4px;border-radius:4px;overflow:auto;font-size:14px;line-height:24px;border:1px solid var(--semi-color-border)}.semi-sidebar-file .tiptap pre code{background-color:#0000}.semi-sidebar-file .tiptap code{background-color:var(--semi-color-border);padding:2px 4px}.semi-sidebar-file .tiptap hr{border:none;border-top:1px solid var(--semi-color-border)}.semi-sidebar-file .tiptap span.select{display:inline-block;background-color:rgba(var(--semi-light-blue-1),1);line-height:24px}.semi-sidebar-file .tiptap.ProseMirror img:not([data-type=emoji] img){outline:.125rem solid rgba(0,0,0,0);margin:12px 0}.semi-sidebar-file .tiptap.ProseMirror img:not([data-type=emoji] img).ProseMirror-selectednode{outline-color:var(--semi-color-text-0)}.semi-sidebar-file .tiptap .tiptap-image-slot .uploadFail .semi-upload-drag-area,.semi-sidebar-file .tiptap .tiptap-image-slot .validateFail .semi-upload-drag-area,.semi-sidebar-file .tiptap .tiptap-image-slot .uploading .semi-upload-drag-area,.semi-sidebar-file .tiptap .tiptap-image-slot .success .semi-upload-drag-area{display:none}.semi-sidebar-file-menu-bar{display:flex;flex-direction:row;align-items:center;justify-content:center;flex-wrap:wrap;gap:2px;border-top:1px solid var(--semi-color-border);border-bottom:1px solid var(--semi-color-border);padding:2px 12px}.semi-sidebar-file-menu-bar-dropdown-item-active{color:var(--semi-color-primary);background:var(--semi-color-fill-0)}.semi-sidebar-file-menu-bar .semi-divider-vertical{margin:0}.semi-sidebar-file-menu-bar-btn-active.semi-button-tertiary.semi-button-borderless{background:var(--semi-color-fill-0)}.semi-sidebar-file-menu-bar-btn-codeblock{font-size:12px;line-height:16px;padding:8px}.semi-sidebar-file-menu-bar-link-dropdown{padding:8px;display:flex;align-items:center;justify-content:center}.semi-sidebar-file-menu-bar-link-dropdown-btn-active.semi-button-tertiary.semi-button-borderless{color:var(--semi-color-primary)}.semi-sidebar-detail .semi-sidebar-file{height:100%;display:flex;flex-direction:column}.semi-sidebar-detail .semi-sidebar-file-content{height:100%}.semi-sidebar-detail .semi-sidebar-file-editor{overflow:auto;flex:1;padding:0 12px}.semi-sidebar-detail .semi-sidebar-code-content{overflow:auto}.semi-sidebar-main .semi-sidebar-code-content{height:200px;overflow:auto}.semi-sidebar-main .semi-sidebar-collapse-file .semi-collapse-content{max-height:400px;overflow:auto}.semi-sidebar-main .semi-sidebar-collapse-code .semi-collapse-content{max-height:200px;overflow:auto}.semi-sidebar-main .semi-codeHighlight{height:200px;overflow:auto}.semi-sidebar-detail-header{display:flex;flex-direction:row;justify-content:space-between;align-items:center;color:var(--semi-color-text-0);padding:12px}.semi-sidebar-detail-header-left{display:flex;flex-direction:row;column-gap:8px;align-items:center}.semi-sidebar-detail-header-title{font-size:16px;line-height:22px;font-family:Inter,-apple-system,BlinkMacSystemFont,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Segoe UI,Helvetica Neue,Helvetica,Arial,sans-serif;font-weight:600}.semi-sidebar-detail-header-right{display:flex;flex-direction:row;column-gap:4px;align-items:center}.semi-skeleton-avatar,.semi-skeleton-image,.semi-skeleton-title,.semi-skeleton-button{background:var(--semi-color-fill-0);border-radius:var(--semi-border-radius-small)}.semi-skeleton-avatar-circle{border-radius:50%}.semi-skeleton-avatar-extra-extra-small{width:20px;height:20px}.semi-skeleton-avatar-extra-small{width:24px;height:24px}.semi-skeleton-avatar-medium{width:48px;height:48px}.semi-skeleton-avatar-small{width:32px;height:32px}.semi-skeleton-avatar-large{width:72px;height:72px}.semi-skeleton-avatar-extra-large{width:128px;height:128px}.semi-skeleton-paragraph{margin:0;padding:0;list-style-type:none}.semi-skeleton-paragraph li{background:var(--semi-color-fill-0);border-radius:var(--semi-border-radius-small);width:100%;height:16px;margin-bottom:10px}.semi-skeleton-paragraph li:last-child{width:60%;margin-bottom:0}.semi-skeleton-paragraph li:first-child{width:100%}.semi-skeleton-title{width:100%;height:24px}.semi-skeleton-button{width:115px;height:32px}.semi-skeleton-image{width:100%;height:100%}.semi-skeleton-active .semi-skeleton-avatar,.semi-skeleton-active .semi-skeleton-image,.semi-skeleton-active .semi-skeleton-title,.semi-skeleton-active .semi-skeleton-button,.semi-skeleton-active .semi-skeleton-paragraph li{background:linear-gradient(90deg,var(--semi-color-fill-0) 25%,var(--semi-color-fill-1) 44%,var(--semi-color-fill-0) 88%);background-size:400% 100%;animation:1.4s skeleton-loading ease infinite;animation-fill-mode:forwards}@keyframes skeleton-loading{0%{background-position:100% 50%}to{background-position:0 50%}}.semi-rtl .semi-skeleton,.semi-portal-rtl .semi-skeleton{direction:rtl}.semi-slider{padding:0 13px;margin:0}.semi-slider-wrapper{box-sizing:border-box;position:relative;height:32px;width:100%;display:inline-block;vertical-align:bottom}.semi-slider-rail{box-sizing:border-box;margin:0;padding:0;color:#000000a6;font-size:14px;font-variant:tabular-nums;line-height:1.5;list-style:none;font-feature-settings:"tnum";position:absolute;height:4px;cursor:pointer;touch-action:none;background-color:var(--semi-color-fill-0);width:100%;border-radius:var(--semi-border-radius-small);top:14px}.semi-slider-handle{box-shadow:0 4px 6px #0000001a,0 0 1px #0000004d;box-sizing:border-box;touch-action:none;position:absolute;width:24px;height:24px;margin-top:4px;background-color:var(--semi-color-white);border:none;border-radius:50%;cursor:pointer;transition:background-color var(--semi-transition_duration-none) var(--semi-transition_function-easeIn) var(--semi-transition_delay-none);transform:var(--semi-transform_scale-small) translate(-50%) translateY(0);display:inline-flex;justify-content:center;align-items:center}.semi-slider-handle:focus-visible{outline:2px solid var(--semi-color-primary-light-active)}.semi-slider-handle-dot{background:var(--semi-color-primary);width:4px;height:4px;border-radius:var(--semi-border-radius-circle)}.semi-slider-handle:hover{background-color:var(--semi-color-white)}.semi-slider-handle-clicked{border:solid 1px var(--semi-color-focus-border);cursor:grabbing}.semi-slider-track{height:4px;background:var(--semi-color-primary);border-radius:var(--semi-border-radius-small);position:absolute;cursor:pointer;top:14px}.semi-slider-tooltip{position:absolute;top:-40px}.semi-slider-dots{width:100%;background:#0000}.semi-slider-dot{position:absolute;top:14px;width:4px;height:4px;background-color:var(--semi-color-white);border-radius:50%;cursor:pointer;transform:translate(0)}.semi-slider-dot-active{background-color:var(--semi-color-white)}.semi-slider-marks{position:absolute;top:23px;left:0;width:100%;font-size:14px}.semi-slider-mark{position:absolute;display:inline-block;color:var(--semi-color-text-2);text-align:center;cursor:pointer;transform:translate(-50%)}.semi-slider-marks-reverse{position:absolute;top:23px;left:0;width:100%;font-size:14px}.semi-slider-mark-reverse{position:absolute;display:inline-block;color:var(--semi-color-text-2);text-align:center;cursor:pointer;transform:translate(-50%) rotate(-180deg)}.semi-slider-boundary{position:relative;font-size:12px;color:var(--semi-color-text-0);visibility:hidden;top:30px}.semi-slider-boundary span{position:absolute;display:inline-block}.semi-slider-boundary-min{left:0}.semi-slider-boundary-max{right:0}.semi-slider-boundary-show{visibility:visible}.semi-slider-vertical-wrapper{width:4px;height:100%}.semi-slider-vertical-wrapper .semi-slider-track{width:4px}.semi-slider-vertical-wrapper .semi-slider-marks{height:100%;margin-top:-30px;margin-left:29px}.semi-slider-vertical-wrapper .semi-slider-marks-reverse{height:100%;margin-top:-30px;margin-left:-26px}.semi-slider-vertical-wrapper .semi-slider-rail{width:4px;height:100%;top:0}.semi-slider-vertical-wrapper .semi-slider-handle{margin-top:0;margin-left:-10px;transform:var(--semi-transform_scale-small) translateY(-50%) translate(0)}.semi-slider-vertical-wrapper .semi-slider-dot{transform:translateY(0)}.semi-slider-disabled{cursor:not-allowed}.semi-slider-disabled .semi-slider-handle{cursor:not-allowed;box-shadow:none;border:1px var(--semi-color-border) solid}.semi-slider-disabled .semi-slider-handle:hover{background-color:var(--semi-color-white)}.semi-slider-disabled .semi-slider-rail{cursor:not-allowed}.semi-slider-disabled .semi-slider-track{cursor:not-allowed;background-color:var(--semi-color-primary-disabled)}.semi-slider-disabled .semi-slider-dot{cursor:not-allowed;background-color:var(--semi-color-white);border-color:var(--semi-color-white);box-shadow:none}.semi-slider-handle-tooltip{text-align:center}.semi-slider-reverse{transform:rotate(180deg)}.semi-rtl .semi-slider,.semi-portal-rtl .semi-slider{direction:rtl}.semi-rtl .semi-slider-handle,.semi-portal-rtl .semi-slider-handle{transform:var(--semi-transform_scale-small) translate(50%) translateY(0)}.semi-rtl .semi-slider-mark,.semi-portal-rtl .semi-slider-mark{transform:translate(50%)}.semi-rtl .semi-slider-mark-reverse,.semi-portal-rtl .semi-slider-mark-reverse{transform:translate(50%) rotate(-180deg)}.semi-rtl .semi-slider-boundary-min,.semi-portal-rtl .semi-slider-boundary-min{left:auto;right:0}.semi-rtl .semi-slider-boundary-max,.semi-portal-rtl .semi-slider-boundary-max{right:auto;left:0}.semi-slider-rtl .semi-slider-handle{transform:var(--semi-transform_scale-small) translate(50%) translateY(0)}.semi-slider-rtl .semi-slider-mark{transform:translate(50%)}.semi-slider-rtl .semi-slider-mark-reverse{transform:translate(50%) rotate(-180deg)}.semi-slider-rtl .semi-slider-boundary-min{left:auto;right:0}.semi-slider-rtl .semi-slider-boundary-max{right:auto;left:0}.semi-space{display:inline-flex}.semi-space-vertical{flex-direction:column}.semi-space-horizontal{flex-direction:row}.semi-space-align-center{align-items:center}.semi-space-align-end{align-items:flex-end}.semi-space-align-start{align-items:flex-start}.semi-space-align-baseline{align-items:baseline}.semi-space-wrap{flex-wrap:wrap}.semi-space-tight-horizontal{column-gap:8px}.semi-space-tight-vertical{row-gap:8px}.semi-space-medium-horizontal{column-gap:16px}.semi-space-medium-vertical{row-gap:16px}.semi-space-loose-horizontal{column-gap:24px}.semi-space-loose-vertical{row-gap:24px}.semi-rtl .semi-space,.semi-portal-rtl .semi-space{direction:rtl}.semi-spin{position:relative;display:inline-block;width:20px;height:20px}.semi-spin-wrapper{text-align:center;position:absolute;width:100%;transform:translateY(-50%);top:50%;color:var(--semi-color-primary)}.semi-spin-wrapper>svg{display:inline;animation:.6s linear infinite semi-animation-rotate;animation-fill-mode:forwards;vertical-align:top;width:20px;height:20px}.semi-spin-animate{display:inline-flex;animation:1.6s linear infinite semi-animation-rotate;animation-fill-mode:forwards}.semi-spin-children{opacity:.5;-webkit-user-select:none;user-select:none}.semi-spin-block{display:block}.semi-spin-block:after{content:"";position:absolute;top:0;left:0;width:100%;height:100%;z-index:1}.semi-spin-block .semi-spin-wrapper{display:block}.semi-spin-block.semi-spin{height:auto;width:auto}.semi-spin-hidden:after{content:none}.semi-spin-hidden>.semi-spin-children{opacity:1;-webkit-user-select:auto;user-select:auto}.semi-spin-small{width:14px;height:14px}.semi-spin-small>.semi-spin-wrapper svg{width:14px;height:14px}.semi-spin-middle{width:20px;height:20px}.semi-spin-middle>.semi-spin-wrapper svg{width:20px;height:20px}.semi-spin-large{width:32px;height:32px}.semi-spin-large>.semi-spin-wrapper svg{width:32px;height:32px}.semi-spin-container{overflow:hidden}.semi-rtl .semi-spin,.semi-portal-rtl .semi-spin,.semi-rtl .semi-spin-container,.semi-portal-rtl .semi-spin-container{direction:rtl}.semi-steps .semi-col{flex:1}.semi-steps-vertical .semi-row-flex{flex-direction:column}.semi-steps .semi-steps-item{box-sizing:border-box;display:flex;height:72px;position:relative;overflow:hidden;margin-right:16px;border:1px solid rgba(0,0,0,0);border-radius:var(--semi-border-radius-medium);padding:12px 16px;transition:color var(--semi-transition_duration-none) var(--semi-transition_function-easeIn) var(--semi-transition_delay-none);transform:scale(var(--semi-transform_scale-small));transition:background-color var(--semi-transition_duration-none) var(--semi-transition_function-easeIn) var(--semi-transition_delay-none)}.semi-steps .semi-steps-item .semi-steps-item-title{position:relative;font-size:18px;line-height:24px;font-family:Inter,-apple-system,BlinkMacSystemFont,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Segoe UI,Helvetica Neue,Helvetica,Arial,sans-serif;font-weight:600;width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--semi-color-text-0);transition:color var(--semi-transition_duration-none) var(--semi-transition_function-easeIn) var(--semi-transition_delay-none)}.semi-steps .semi-steps-item .semi-steps-item-description{font-size:14px;line-height:20px;font-family:Inter,-apple-system,BlinkMacSystemFont,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Segoe UI,Helvetica Neue,Helvetica,Arial,sans-serif;color:var(--semi-color-text-2);width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.semi-steps .semi-steps-item-process{background-color:var(--semi-color-primary-light-default)}.semi-steps .semi-steps-item-process .semi-steps-item-left:not(.semi-steps-item-icon){background:var(--semi-color-primary)}.semi-steps .semi-steps-item-process .semi-steps-item-title,.semi-steps .semi-steps-item-process .semi-steps-item-icon{color:var(--semi-color-primary)}.semi-steps .semi-steps-item-wait .semi-steps-item-left:not(.semi-steps-item-icon){background:var(--semi-color-text-2)}.semi-steps .semi-steps-item-wait .semi-steps-item-icon{color:var(--semi-color-text-2)}.semi-steps .semi-steps-item-finish .semi-icon,.semi-steps .semi-steps-item-finish .semi-steps-item-title{color:var(--semi-color-success)}.semi-steps .semi-steps-item-finish-hover:hover{background-color:var(--semi-color-fill-0)}.semi-steps .semi-steps-item-finish-hover:hover .semi-icon,.semi-steps .semi-steps-item-finish-hover:hover .semi-steps-item-title{color:var(--semi-color-success-hover)}.semi-steps .semi-steps-item-finish-active:active{background-color:var(--semi-color-fill-1)}.semi-steps .semi-steps-item-finish-active:active .semi-icon,.semi-steps .semi-steps-item-finish-active:active .semi-steps-item-title{color:var(--semi-color-success-active)}.semi-steps .semi-steps-item-error .semi-icon,.semi-steps .semi-steps-item-error .semi-steps-item-title{color:var(--semi-color-danger)}.semi-steps .semi-steps-item-error-hover:hover{background:var(--semi-color-fill-0)}.semi-steps .semi-steps-item-error-hover:hover .semi-icon,.semi-steps .semi-steps-item-error-hover:hover .semi-steps-item-title{color:var(--semi-color-danger-hover)}.semi-steps .semi-steps-item-error-active:active{background-color:var(--semi-color-fill-1)}.semi-steps .semi-steps-item-error-active:active .semi-icon,.semi-steps .semi-steps-item-error-active:active .semi-steps-item-title{color:var(--semi-color-danger-active)}.semi-steps .semi-steps-item-warning .semi-steps-item-title,.semi-steps .semi-steps-item-warning .semi-icon{color:var(--semi-color-warning)}.semi-steps .semi-steps-item-warning-hover:hover{background:var(--semi-color-fill-0)}.semi-steps .semi-steps-item-warning-hover:hover .semi-steps-item-title,.semi-steps .semi-steps-item-warning-hover:hover .semi-icon{color:var(--semi-color-warning-hover)}.semi-steps .semi-steps-item-warning-active:active{background-color:var(--semi-color-fill-1)}.semi-steps .semi-steps-item-warning-active:active .semi-steps-item-title,.semi-steps .semi-steps-item-warning-active:active .semi-icon{color:var(--semi-color-warning-active)}.semi-steps .semi-steps-item-clickable{cursor:pointer}.semi-steps .semi-steps-item-left{width:24px;height:24px;line-height:32px;text-align:center;border-radius:32px;display:flex;align-items:center;justify-content:center;font-size:20px;line-height:28px;font-family:Inter,-apple-system,BlinkMacSystemFont,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Segoe UI,Helvetica Neue,Helvetica,Arial,sans-serif;font-weight:600;flex-grow:0}.semi-steps .semi-steps-item-left.semi-steps-item-plain{color:rgba(var(--semi-white),1)}.semi-steps .semi-steps-item-left-process{background:var(--semi-color-primary-light-default)}.semi-steps .semi-steps-item-content{margin-left:16px;flex:1;overflow:hidden}.semi-steps-basic.semi-steps-horizontal{display:flex;flex-flow:row nowrap}.semi-steps-basic.semi-steps-horizontal.semi-steps-hasline .semi-steps-item-title:after{content:"";position:absolute;top:50%;left:100%;display:block;width:9999px;height:1px;background:var(--semi-color-fill-2)}.semi-steps-basic.semi-steps-horizontal .semi-steps-item{padding-left:16px}.semi-steps-basic.semi-steps-horizontal .semi-steps-item:first-child{padding-left:0}.semi-steps-basic.semi-steps-horizontal .semi-steps-item:last-child{flex:none}.semi-steps-basic.semi-steps-horizontal .semi-steps-item:last-child .semi-steps-item-title{max-width:100%;padding-right:0}.semi-steps-basic.semi-steps-horizontal .semi-steps-item:last-child .semi-steps-item-title:after{display:none}.semi-steps-basic.semi-steps-horizontal .semi-steps-item-done .semi-steps-item-container .semi-steps-item-title:after{background:var(--semi-color-primary)}.semi-steps-basic.semi-steps-horizontal .semi-steps-item .semi-steps-item-content{flex:1}.semi-steps-basic.semi-steps-horizontal .semi-steps-item .semi-steps-item-description{font-size:12px;line-height:16px;font-family:Inter,-apple-system,BlinkMacSystemFont,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Segoe UI,Helvetica Neue,Helvetica,Arial,sans-serif;color:var(--semi-color-text-2);width:100%;max-width:268px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.semi-steps-basic.semi-steps-horizontal .semi-steps-item .semi-steps-item-title{max-width:80%;min-height:24px;display:inline-flex;align-items:center}.semi-steps-basic.semi-steps-horizontal .semi-steps-item .semi-steps-item-title .semi-steps-item-title-text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;transition:color var(--semi-transition_duration-none) var(--semi-transition_function-easeIn) var(--semi-transition_delay-none)}.semi-steps-basic.semi-steps-horizontal .semi-steps-item .semi-steps-item-title .semi-steps-item-title-text-empty{width:0}.semi-steps-basic.semi-steps-vertical{display:flex;flex-flow:column nowrap}.semi-steps-basic.semi-steps-vertical .semi-steps-item-icon{box-sizing:content-box}.semi-steps-basic.semi-steps-vertical.semi-steps-small .semi-steps-item .semi-steps-item-content{min-height:40px}.semi-steps-basic.semi-steps-vertical.semi-steps-hasline .semi-steps-item-icon:after{content:"";position:absolute;top:100%;left:50%;display:block;width:1px;height:9999px;background:var(--semi-color-fill-2)}.semi-steps-basic.semi-steps-vertical .semi-steps-item{padding-top:9px}.semi-steps-basic.semi-steps-vertical .semi-steps-item:first-child{padding-top:0}.semi-steps-basic.semi-steps-vertical .semi-steps-item:last-child .semi-steps-item-icon:after{display:none}.semi-steps-basic.semi-steps-vertical .semi-steps-item-done .semi-steps-item-icon:after{background:var(--semi-color-primary)}.semi-steps-basic.semi-steps-vertical .semi-steps-item .semi-steps-item-content{min-height:42px;padding-bottom:22px}.semi-steps-basic.semi-steps-vertical .semi-steps-item .semi-steps-item-icon{display:inline-flex;position:relative;padding-bottom:9px}.semi-steps-basic.semi-steps-vertical .semi-steps-item .semi-steps-item-description{font-size:12px;line-height:16px;font-family:Inter,-apple-system,BlinkMacSystemFont,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Segoe UI,Helvetica Neue,Helvetica,Arial,sans-serif;color:var(--semi-color-text-2);width:100%}.semi-steps-basic.semi-steps-vertical .semi-steps-item .semi-steps-item-title{max-width:100%}.semi-steps-basic.semi-steps-vertical .semi-steps-item .semi-steps-item-title .semi-steps-item-title-text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.semi-steps-basic .semi-steps-item{box-sizing:border-box;position:relative;display:inline-block;vertical-align:top;overflow:hidden;flex:1;transition:color var(--semi-transition_duration-none) var(--semi-transition_function-easeIn) var(--semi-transition_delay-none),background-color var(--semi-transition_duration-none) var(--semi-transition_function-easeIn) var(--semi-transition_delay-none);transform:scale(var(--semi-transform_scale-small))}.semi-steps-basic .semi-steps-item-clickable{cursor:pointer}.semi-steps-basic .semi-steps-item-hover:hover .semi-steps-item-title,.semi-steps-basic .semi-steps-item-hover:hover .semi-steps-item-description{color:var(--semi-color-focus-border)}.semi-steps-basic .semi-steps-item .semi-steps-item-container{display:flex;align-items:flex-start}.semi-steps-basic .semi-steps-item .semi-steps-item-left{display:flex;justify-content:center;align-items:center;margin-right:8px}.semi-steps-basic .semi-steps-item .semi-steps-item-left .semi-steps-item-icon{display:flex;height:24px;align-items:center}.semi-steps-basic .semi-steps-item .semi-steps-item-left .semi-steps-item-number-icon{display:inline-flex;align-items:center;justify-content:center;width:24px;height:24px;font-size:16px;line-height:22px;font-family:Inter,-apple-system,BlinkMacSystemFont,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Segoe UI,Helvetica Neue,Helvetica,Arial,sans-serif;font-weight:600;background:var(--semi-color-primary);border-radius:var(--semi-border-radius-circle);color:var(--semi-color-white);transition:color var(--semi-transition_duration-none) var(--semi-transition_function-easeIn) var(--semi-transition_delay-none)}.semi-steps-basic .semi-steps-item .semi-steps-item-title{position:relative;display:inline-block;font-size:16px;line-height:22px;font-family:Inter,-apple-system,BlinkMacSystemFont,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Segoe UI,Helvetica Neue,Helvetica,Arial,sans-serif;line-height:24px;font-weight:600;color:var(--semi-color-text-0);vertical-align:top;padding-right:16px;margin-bottom:4px;transition:color var(--semi-transition_duration-none) var(--semi-transition_function-easeIn) var(--semi-transition_delay-none)}.semi-steps-basic .semi-steps-item-finish .semi-steps-item-left .semi-steps-item-icon{color:var(--semi-color-primary)}.semi-steps-basic .semi-steps-item-finish .semi-steps-item-left .semi-steps-item-icon .semi-steps-item-number-icon{color:var(--semi-color-white)}.semi-steps-basic .semi-steps-item-wait .semi-steps-item-title,.semi-steps-basic .semi-steps-item-wait .semi-steps-item-left .semi-steps-item-icon{color:var(--semi-color-text-2)}.semi-steps-basic .semi-steps-item-wait .semi-steps-item-left .semi-steps-item-icon .semi-steps-item-number-icon{background:var(--semi-color-fill-0);color:var(--semi-color-text-2)}.semi-steps-basic .semi-steps-item-wait-hover:hover .semi-steps-item-left .semi-steps-item-icon .semi-steps-item-number-icon{background:var(--semi-color-secondary-light-default);color:var(--semi-color-focus-border)}.semi-steps-basic .semi-steps-item-process .semi-steps-item-left .semi-steps-item-icon{color:var(--semi-color-primary)}.semi-steps-basic .semi-steps-item-process .semi-steps-item-left .semi-steps-item-icon .semi-steps-item-number-icon{color:var(--semi-color-white)}.semi-steps-basic .semi-steps-item-error .semi-steps-item-left .semi-steps-item-icon{color:var(--semi-color-danger)}.semi-steps-basic .semi-steps-item-error .semi-steps-item-left .semi-steps-item-icon .semi-steps-item-number-icon{color:var(--semi-color-primary)}.semi-steps-basic .semi-steps-item-warning .semi-steps-item-left .semi-steps-item-icon{color:var(--semi-color-warning)}.semi-steps-basic .semi-steps-item-warning .semi-steps-item-left .semi-steps-item-icon .semi-steps-item-number-icon{color:var(--semi-color-white)}.semi-steps-basic.semi-steps-small .semi-steps-item .semi-steps-item-title{font-size:14px;line-height:20px;font-family:Inter,-apple-system,BlinkMacSystemFont,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Segoe UI,Helvetica Neue,Helvetica,Arial,sans-serif}.semi-steps-basic.semi-steps-small .semi-steps-item .semi-steps-item-left .semi-steps-item-icon{height:20px}.semi-steps-basic.semi-steps-small .semi-steps-item .semi-steps-item-left .semi-steps-item-icon .semi-steps-item-number-icon{font-size:12px;line-height:16px;font-family:Inter,-apple-system,BlinkMacSystemFont,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Segoe UI,Helvetica Neue,Helvetica,Arial,sans-serif;width:20px;height:20px}.semi-steps-nav{display:inline-flex;flex-flow:row nowrap}.semi-steps-nav .semi-steps-item{box-sizing:border-box}.semi-steps-nav .semi-steps-item:last-child{flex:none}.semi-steps-nav .semi-steps-item:last-child .semi-steps-item-content{width:auto}.semi-steps-nav .semi-steps-item .semi-steps-item-container{display:flex;align-items:center;color:var(--semi-color-text-2)}.semi-steps-nav .semi-steps-item .semi-steps-item-container .semi-steps-item-icon{display:inline-flex;flex:1;justify-content:center;color:var(--semi-grey-3);min-width:60px}.semi-steps-nav .semi-steps-item .semi-steps-item-content{flex:1;display:inline-block}.semi-steps-nav .semi-steps-item .semi-steps-item-title{font-size:16px;line-height:22px;font-family:Inter,-apple-system,BlinkMacSystemFont,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Segoe UI,Helvetica Neue,Helvetica,Arial,sans-serif;max-width:17em;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-weight:400}.semi-steps-nav .semi-steps-item-active .semi-steps-item-title{color:var(--semi-color-text-0);font-weight:600}.semi-steps-nav.semi-steps-small .semi-steps-item .semi-steps-item-title{font-size:14px;line-height:20px;font-family:Inter,-apple-system,BlinkMacSystemFont,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Segoe UI,Helvetica Neue,Helvetica,Arial,sans-serif}.semi-rtl .semi-steps,.semi-portal-rtl .semi-steps{direction:rtl}.semi-rtl .semi-steps-item,.semi-portal-rtl .semi-steps-item{margin-right:auto;margin-left:16px}.semi-rtl .semi-steps-item-content,.semi-portal-rtl .semi-steps-item-content{margin-left:auto;margin-right:16px}.semi-rtl .semi-steps-basic,.semi-portal-rtl .semi-steps-basic{direction:rtl}.semi-rtl .semi-steps-basic.semi-steps-horizontal .semi-steps-item .semi-steps-item-title,.semi-portal-rtl .semi-steps-basic.semi-steps-horizontal .semi-steps-item .semi-steps-item-title{padding-left:16px}.semi-rtl .semi-steps-basic.semi-steps-horizontal .semi-steps-item .semi-steps-item-title:after,.semi-portal-rtl .semi-steps-basic.semi-steps-horizontal .semi-steps-item .semi-steps-item-title:after{right:100%}.semi-rtl .semi-steps-basic.semi-steps-vertical .semi-steps-item,.semi-portal-rtl .semi-steps-basic.semi-steps-vertical .semi-steps-item{margin:0}.semi-rtl .semi-steps-nav,.semi-portal-rtl .semi-steps-nav{direction:rtl}.semi-switch{box-sizing:border-box;display:inline-block;border-radius:12px;border:1px rgba(0,0,0,0) solid;position:relative;cursor:pointer;background-color:var(--semi-color-fill-0);transition:background-color .2s var(--semi-transition_function-easeIn) var(--semi-transition_delay-none);width:40px;height:24px}.semi-switch:hover{background-color:var(--semi-color-fill-1)}.semi-switch:active{border:1px var(--semi-color-fill-2) solid}.semi-switch:active .semi-switch-knob{width:24px}.semi-switch-focus{outline:2px solid var(--semi-color-primary-light-active)}.semi-switch-checked{background-color:var(--semi-color-success)}.semi-switch-checked:hover{background-color:var(--semi-color-success-hover)}.semi-switch-checked .semi-switch-knob{transform:translate(18px);background-color:rgba(var(--semi-white),1)}.semi-switch-checked:active .semi-switch-knob{transform:translate(12px)}.semi-switch-active{background-color:var(--semi-color-success-active)}.semi-switch-disabled{cursor:not-allowed;background-color:#0000;border:1px var(--semi-color-border) solid}.semi-switch-disabled:hover,.semi-switch-disabled:active{background-color:#0000}.semi-switch-disabled:active .semi-switch-knob{width:18px}.semi-switch-disabled .semi-switch-knob{cursor:not-allowed;box-shadow:none;border:1px var(--semi-color-border) solid}.semi-switch-disabled .semi-switch-native-control{pointer-events:none;cursor:not-allowed}.semi-switch-disabled.semi-switch-checked{border-color:#0000;background-color:var(--semi-color-success-disabled)}.semi-switch-disabled.semi-switch-checked:active .semi-switch-knob{transform:translate(18px)}.semi-switch-disabled.semi-switch-checked .semi-switch-knob{box-shadow:none;border:none}.semi-switch-disabled.semi-switch-loading:not(.semi-switch-checked):hover{background-color:var(--semi-color-fill-1)}.semi-switch-knob{box-shadow:0 4px 6px #0000001a,0 0 1px #0000004d;cursor:pointer;border-radius:9px;background-color:rgba(var(--semi-white),1);box-sizing:border-box;position:absolute;left:0;right:auto;transition:transform .2s ease-in-out,width .2s ease-in-out;width:18px;height:18px;top:2px;transform:translate(2px)}.semi-switch-native-control{width:100%;height:100%;opacity:0;cursor:inherit;pointer-events:auto;margin:0;position:absolute;top:0;left:0}.semi-switch-native-control[type=checkbox]{width:inherit;height:inherit}.semi-switch-checked-text,.semi-switch-unchecked-text{position:absolute;font-size:12px;height:100%;width:20px;display:flex;justify-content:center;align-items:center}.semi-switch-checked-text{color:var(--semi-color-white)}.semi-switch-unchecked-text{color:var(--semi-color-text-2);right:0}.semi-switch-loading{display:inline-flex;align-items:center;background-color:var(--semi-color-fill-1)}.semi-switch-loading-spin .semi-spin-wrapper{display:inline-flex;align-items:center;color:var(--semi-color-white)}.semi-switch-loading .semi-switch-loading-spin{transform:translate(2px)}.semi-switch-loading .semi-switch-loading-spin>.semi-spin-wrapper>svg{width:18px;height:18px}.semi-switch-loading.semi-switch-checked{background-color:var(--semi-color-success-hover)}.semi-switch-loading.semi-switch-checked .semi-switch-loading-spin{transform:translate(16px)}.semi-switch-loading.semi-switch-small .semi-switch-loading-spin{transform:translate(2px)}.semi-switch-loading.semi-switch-small .semi-switch-loading-spin>.semi-spin-wrapper>svg{width:10px;height:10px}.semi-switch-loading.semi-switch-small.semi-switch-checked .semi-switch-loading-spin{transform:translate(10px)}.semi-switch-loading.semi-switch-large .semi-switch-loading-spin{transform:translate(2px)}.semi-switch-loading.semi-switch-large .semi-switch-loading-spin>.semi-spin-wrapper>svg{width:28px;height:28px}.semi-switch-loading.semi-switch-large.semi-switch-checked .semi-switch-loading-spin{transform:translate(22px)}.semi-switch-disabled.semi-switch-checked{background-color:var(--semi-color-success-disabled)}.semi-switch-large{width:54px;height:32px;border-radius:16px}.semi-switch-large .semi-switch-knob{width:24px;height:24px;top:3px;border-radius:12px;transform:translate(3px)}.semi-switch-large.semi-switch-checked .semi-switch-knob{transform:translate(26px)}.semi-switch-large.semi-switch-checked:active .semi-switch-knob{transform:translate(16px)}.semi-switch-large:active .semi-switch-knob{width:34px}.semi-switch-large .semi-switch-checked-text,.semi-switch-large .semi-switch-unchecked-text{width:26px;font-size:14px}.semi-switch-small{width:26px;height:16px;border-radius:8px}.semi-switch-small .semi-switch-knob{width:12px;height:12px;top:1px;border-radius:6px;transform:translate(1px)}.semi-switch-small.semi-switch-checked .semi-switch-knob{transform:translate(11px)}.semi-switch-small.semi-switch-checked:active .semi-switch-knob{transform:translate(9px)}.semi-switch-small:active .semi-switch-knob{width:14px}.semi-form .semi-switch-native-control{width:100%;height:100%}.semi-rtl .semi-switch,.semi-portal-rtl .semi-switch{direction:rtl}.semi-rtl .semi-switch-checked .semi-switch-knob,.semi-portal-rtl .semi-switch-checked .semi-switch-knob{transform:translate(-18px)}.semi-rtl .semi-switch-checked:active .semi-switch-knob,.semi-portal-rtl .semi-switch-checked:active .semi-switch-knob{transform:translate(-12px)}.semi-rtl .semi-switch-knob,.semi-portal-rtl .semi-switch-knob{right:0;left:auto;transform:translate(-2px)}.semi-rtl .semi-switch-native-control,.semi-portal-rtl .semi-switch-native-control{right:0}.semi-rtl .semi-switch-unchecked-text,.semi-portal-rtl .semi-switch-unchecked-text{left:0}.semi-rtl .semi-switch-loading .semi-switch-loading-spin,.semi-portal-rtl .semi-switch-loading .semi-switch-loading-spin{transform:translate(-2px)}.semi-rtl .semi-switch-loading.semi-switch-checked .semi-switch-loading-spin,.semi-portal-rtl .semi-switch-loading.semi-switch-checked .semi-switch-loading-spin{transform:translate(-16px)}.semi-rtl .semi-switch-loading.semi-switch-small .semi-switch-loading-spin,.semi-portal-rtl .semi-switch-loading.semi-switch-small .semi-switch-loading-spin{transform:translate(-2px)}.semi-rtl .semi-switch-loading.semi-switch-small.semi-switch-checked .semi-switch-loading-spin,.semi-portal-rtl .semi-switch-loading.semi-switch-small.semi-switch-checked .semi-switch-loading-spin{transform:translate(-10px)}.semi-rtl .semi-switch-loading.semi-switch-large .semi-switch-loading-spin,.semi-portal-rtl .semi-switch-loading.semi-switch-large .semi-switch-loading-spin{transform:translate(-2px)}.semi-rtl .semi-switch-loading.semi-switch-large.semi-switch-checked .semi-switch-loading-spin,.semi-portal-rtl .semi-switch-loading.semi-switch-large.semi-switch-checked .semi-switch-loading-spin{transform:translate(-22px)}.semi-rtl .semi-switch-large .semi-switch-knob,.semi-portal-rtl .semi-switch-large .semi-switch-knob{transform:translate(-3px)}.semi-rtl .semi-switch-large.semi-switch-checked .semi-switch-knob,.semi-portal-rtl .semi-switch-large.semi-switch-checked .semi-switch-knob{transform:translate(-26px)}.semi-rtl .semi-switch-large.semi-switch-checked:active .semi-switch-knob,.semi-portal-rtl .semi-switch-large.semi-switch-checked:active .semi-switch-knob{transform:translate(-16px)}.semi-rtl .semi-switch-small .semi-switch-knob,.semi-portal-rtl .semi-switch-small .semi-switch-knob{transform:translate(-1px)}.semi-rtl .semi-switch-small.semi-switch-checked .semi-switch-knob,.semi-portal-rtl .semi-switch-small.semi-switch-checked .semi-switch-knob{transform:translate(-11px)}.semi-rtl .semi-switch-small.semi-switch-checked:active .semi-switch-knob,.semi-portal-rtl .semi-switch-small.semi-switch-checked:active .semi-switch-knob{transform:translate(-9px)}.semi-table-panel-operation{background-color:var(--semi-color-primary);padding:8px 16px;display:flex;justify-content:space-between;color:var(--semi-color-text-2)}.semi-table-panel-operation-right,.semi-table-panel-operation-left{display:flex;justify-content:space-between}.semi-table-panel-operation-selected{color:var(--semi-color-primary-light-active)}.semi-table-pagination-info{font-size:14px;line-height:20px;font-family:Inter,-apple-system,BlinkMacSystemFont,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Segoe UI,Helvetica Neue,Helvetica,Arial,sans-serif;font-weight:400}.semi-table-pagination-outer{display:flex;justify-content:space-between;align-items:center}.semi-table{width:100%;text-align:left;border-collapse:separate;border-spacing:0;font-size:inherit;display:table}.semi-table-wrapper{zoom:1;position:relative;clear:both;box-sizing:border-box;margin:0;padding:0;font-size:14px;line-height:20px;font-family:Inter,-apple-system,BlinkMacSystemFont,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Segoe UI,Helvetica Neue,Helvetica,Arial,sans-serif;color:var(--semi-color-text-0);width:100%}.semi-table-wrapper[data-column-fixed=true]{z-index:1}.semi-table-wrapper-ltr,.semi-table-wrapper-ltr .semi-spin{direction:ltr}.semi-table-middle .semi-table-tbody>.semi-table-row>.semi-table-row-cell{padding-top:12px;padding-bottom:12px}.semi-table-small .semi-table-tbody>.semi-table-row>.semi-table-row-cell{padding-top:8px;padding-bottom:8px}.semi-table-title{position:relative;padding:16px 0}.semi-table-container{position:relative}.semi-table-header{overflow:hidden;scrollbar-base-color:rgba(0,0,0,0)}.semi-table-header::-webkit-scrollbar{background-color:#0000;border-bottom:2px solid var(--semi-color-border)}.semi-table-header-sticky{position:sticky;z-index:102}.semi-table-header-sticky .semi-table-thead>.semi-table-row>.semi-table-row-head{background-color:var(--semi-color-bg-1)}.semi-table-header-hidden{height:0}.semi-table-align-center .semi-table-operate-wrapper{justify-content:center}.semi-table-align-right .semi-table-operate-wrapper{justify-content:flex-end}.semi-table-operate-wrapper{display:flex;justify-content:flex-start}.semi-table-body{overflow:auto;width:100%;box-sizing:border-box}.semi-table-colgroup{display:table-column-group}.semi-table-colgroup .semi-table-col{display:table-column}.semi-table-colgroup .semi-table-column-expand,.semi-table-colgroup .semi-table-column-selection{width:48px}.semi-table-thead>.semi-table-row>.semi-table-row-head{background-color:var(--semi-color-bg-1);color:var(--semi-color-text-2);font-weight:600;text-align:left;border-bottom:2px solid var(--semi-color-border);padding:8px 16px;vertical-align:middle;overflow-wrap:break-word;position:relative;transition:background-color var(--semi-transition_duration-none) linear}.semi-table-thead>.semi-table-row>.semi-table-row-head.semi-table-row-head-clickSort{cursor:pointer}.semi-table-thead>.semi-table-row>.semi-table-row-head.semi-table-row-head-clickSort:hover{background-image:linear-gradient(0deg,var(--semi-color-fill-0),var(--semi-color-fill-0));background-color:var(--semi-color-bg-0)}.semi-table-thead>.semi-table-row>.semi-table-row-head.semi-table-cell-fixed-left,.semi-table-thead>.semi-table-row>.semi-table-row-head.semi-table-cell-fixed-right{z-index:101;position:sticky;background-color:var(--semi-color-bg-1)}.semi-table-thead>.semi-table-row>.semi-table-row-head.semi-table-cell-fixed-left-last{border-right:1px solid var(--semi-color-border);box-shadow:3px 0 0 0 var(--semi-color-shadow)}.semi-table-thead>.semi-table-row>.semi-table-row-head.semi-table-cell-fixed-left-last.resizing{border-right:2px solid var(--semi-color-primary)}.semi-table-thead>.semi-table-row>.semi-table-row-head.semi-table-cell-fixed-left-last.resizing .react-resizable-handle:hover{background-color:unset}.semi-table-thead>.semi-table-row>.semi-table-row-head.semi-table-cell-fixed-right-first{border-left:1px solid var(--semi-color-border);box-shadow:-3px 0 0 0 var(--semi-color-shadow)}.semi-table-thead>.semi-table-row>.semi-table-row-head.semi-table-cell-fixed-right-first.resizing{border-right:2px solid var(--semi-color-primary)}.semi-table-thead>.semi-table-row>.semi-table-row-head.semi-table-cell-fixed-right-first.resizing .react-resizable-handle:hover{background-color:unset}.semi-table-thead>.semi-table-row>.semi-table-row-head.semi-table-cell-fixed-right-first[x-type=column-scrollbar]{box-shadow:none;border-left:rgba(0,0,0,0)}.semi-table-thead>.semi-table-row>.semi-table-row-head.semi-table-column-selection{text-align:center}.semi-table-thead>.semi-table-row>.semi-table-row-head[colspan]:not([colspan="1"]){text-align:center}.semi-table-thead>.semi-table-row>.semi-table-row-head .semi-table-header-column{display:inline-flex;align-items:center}.semi-table-thead>.semi-table-row>.semi-table-row-head-ellipsis{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.semi-table-thead>.semi-table-row>.semi-table-row-head-ellipsis .semi-table-row-head-title{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.semi-table-thead>.semi-table-row .react-resizable{position:relative;background-clip:padding-box}.semi-table-thead>.semi-table-row .resizing{border-right:2px solid var(--semi-color-primary)}.semi-table-thead>.semi-table-row .resizing .react-resizable-handle:hover{background-color:unset}.semi-table-thead>.semi-table-row .react-resizable-handle{position:absolute;width:9px;height:calc(100% - 8px);background-color:var(--semi-color-border);bottom:4px;right:-1px;cursor:col-resize;z-index:0}.semi-table-thead>.semi-table-row .react-resizable-handle:hover{background-color:var(--semi-color-primary)}.semi-table-tbody{display:table-row-group}.semi-table-tbody>.semi-table-row{display:table-row;background-color:var(--semi-color-bg-1)}.semi-table-tbody>.semi-table-row.semi-table-row-hovered>.semi-table-row-cell{background-image:linear-gradient(0deg,var(--semi-color-fill-0),var(--semi-color-fill-0));background-color:var(--semi-color-bg-0)}.semi-table-tbody>.semi-table-row.semi-table-row-hovered>.semi-table-row-cell.semi-table-cell-fixed-left,.semi-table-tbody>.semi-table-row.semi-table-row-hovered>.semi-table-row-cell.semi-table-cell-fixed-right{background-image:linear-gradient(0deg,var(--semi-color-fill-0),var(--semi-color-fill-0));background-color:var(--semi-color-bg-1)}.semi-table-tbody>.semi-table-row:hover>.semi-table-row-cell{background-image:linear-gradient(0deg,var(--semi-color-fill-0),var(--semi-color-fill-0));background-color:var(--semi-color-bg-0)}.semi-table-tbody>.semi-table-row:hover>.semi-table-row-cell.semi-table-cell-fixed-left,.semi-table-tbody>.semi-table-row:hover>.semi-table-row-cell.semi-table-cell-fixed-right{background-image:linear-gradient(0deg,var(--semi-color-fill-0),var(--semi-color-fill-0));background-color:var(--semi-color-bg-1)}.semi-table-tbody>.semi-table-row>.semi-table-row-cell{display:table-cell;overflow-wrap:break-word;border-left:none;border-right:none;border-bottom:1px solid var(--semi-color-border);padding:16px;box-sizing:border-box;position:relative;vertical-align:middle}.semi-table-tbody>.semi-table-row>.semi-table-row-cell.resizing{border-right:2px solid var(--semi-color-primary)}.semi-table-tbody>.semi-table-row>.semi-table-row-cell-ellipsis{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.semi-table-tbody>.semi-table-row.semi-table-row-expand>.semi-table-row-cell{background-color:var(--semi-color-fill-0)}.semi-table-tbody>.semi-table-row.semi-table-row-hidden{display:none}.semi-table-tbody>.semi-table-row>.semi-table-cell-fixed-left,.semi-table-tbody>.semi-table-row>.semi-table-cell-fixed-right{z-index:101;position:sticky;background-color:var(--semi-color-bg-1)}.semi-table-tbody>.semi-table-row>.semi-table-cell-fixed-left-last{border-right:1px solid var(--semi-color-border);box-shadow:3px 0 0 0 var(--semi-color-shadow)}.semi-table-tbody>.semi-table-row>.semi-table-cell-fixed-right-first{border-left:1px solid var(--semi-color-border);box-shadow:-3px 0 0 0 var(--semi-color-shadow)}.semi-table-tbody>.semi-table-row>.semi-table-cell-fixed>*{transition:background-color var(--semi-transition_duration-none) var(--semi-transition_function-easeOut) 0ms}.semi-table-tbody>.semi-table-row>*{transition:background-color var(--semi-transition_duration-none) var(--semi-transition_function-easeOut) 0ms}.semi-table-tbody>.semi-table-row-section{display:table-row}.semi-table-tbody>.semi-table-row-section>.semi-table-row-cell{background-color:rgba(var(--semi-grey-0),1);border-bottom:1px solid var(--semi-color-border)}.semi-table-tbody>.semi-table-row-section>.semi-table-row-cell:not(.semi-table-column-selection){padding:10px 16px}.semi-table-tbody>.semi-table-row-section .semi-table-section-inner{display:inline-flex;align-items:center}.semi-table-virtualized .semi-table-tbody{display:block}.semi-table-virtualized .semi-table-tbody>.semi-table-row{display:flex}.semi-table-virtualized .semi-table-tbody>.semi-table-row>.semi-table-row-cell{word-wrap:unset;word-break:unset;white-space:nowrap;display:inline-flex;align-items:center;overflow:hidden}.semi-table-virtualized .semi-table-tbody>.semi-table-row-section>.semi-table-row-cell{padding-top:16px;padding-bottom:16px;display:flex}.semi-table-virtualized .semi-table-tbody>.semi-table-row-expand>.semi-table-row-cell{padding:0;overflow:unset}.semi-table-footer{background-color:var(--semi-color-fill-0);padding:16px;margin:0;position:relative}.semi-table .semi-table-selection-wrap{display:inline-flex;vertical-align:bottom}.semi-table .semi-table-selection-disabled{cursor:not-allowed}.semi-table .semi-table-selection-disabled>.semi-checkbox{pointer-events:none}.semi-table .semi-table-column-hidden{display:none}.semi-table .semi-table-column-selection{text-align:center}.semi-table .semi-table-column-selection .semi-checkbox-inner-display .semi-icon{left:0;top:0}.semi-table .semi-table-column-expand .semi-table-expand-icon{transform:translateY(2px)}.semi-table .semi-table-column-expand .semi-table-expand-icon:last-child{margin-right:0}.semi-table .semi-table-column-sorter{display:inline-block;width:16px;height:16px;vertical-align:middle;text-align:center}.semi-table .semi-table-column-sorter-wrapper{display:flex;gap:4px;align-items:center;cursor:pointer;overflow:hidden}.semi-table .semi-table-column-sorter-up,.semi-table .semi-table-column-sorter-down{height:0;display:block;color:var(--semi-color-text-2)}.semi-table .semi-table-column-sorter-up:hover .anticon,.semi-table .semi-table-column-sorter-down:hover .anticon{color:var(--semi-color-text-2)}.semi-table .semi-table-column-sorter-up svg,.semi-table .semi-table-column-sorter-down svg{width:16px;height:16px}.semi-table .semi-table-column-sorter-up.on .semi-icon-caretup,.semi-table .semi-table-column-sorter-up.on .semi-icon-caretdown,.semi-table .semi-table-column-sorter-down.on .semi-icon-caretup,.semi-table .semi-table-column-sorter-down.on .semi-icon-caretdown{color:var(--semi-color-primary)}.semi-table .semi-table-column-filter{margin-left:4px;display:inline-flex;cursor:pointer;color:var(--semi-color-text-2);align-items:center}.semi-table .semi-table-column-filter svg{width:16px;height:16px}.semi-table .semi-table-column-filter.on{color:var(--semi-color-primary)}.semi-table-bordered>.semi-table-title{padding-left:16px;padding-right:16px;border-top:1px solid var(--semi-color-border);border-right:1px solid var(--semi-color-border);border-left:1px solid var(--semi-color-border)}.semi-table-bordered>.semi-table-container{border:1px solid var(--semi-color-border);border-right:0;border-bottom:0}:where(.semi-table-bordered)>.semi-table-container>.semi-table-header::-webkit-scrollbar{border-right:1px solid var(--semi-color-border)}:where(.semi-table-bordered)>.semi-table-container>.semi-table-footer{border-left:1px solid var(--semi-color-border);border-right:1px solid var(--semi-color-border);border-bottom:1px solid var(--semi-color-border)}.semi-table-bordered:not(.semi-table-scroll-position-right)>.semi-table-container:after{content:"";position:absolute;top:0;right:0;bottom:0;width:1px;background-color:var(--semi-color-border);display:block;z-index:103;pointer-events:none}.semi-table-bordered:not(.semi-table-scroll-position-right)>.semi-table-container>.semi-table-header{box-shadow:inset -1px 0 0 0 var(--semi-color-border)}:where(.semi-table-bordered>.semi-table-container)>.semi-table-body>.semi-table-placeholder{border-right:1px solid var(--semi-color-border)}:where(.semi-table-bordered>.semi-table-container>.semi-table-body)>.semi-table>.semi-table-thead>.semi-table-row>.semi-table-row-head .react-resizable-handle{background-color:#0000}:where(.semi-table-bordered>.semi-table-container>.semi-table-body)>.semi-table>.semi-table-thead>.semi-table-row>.semi-table-row-head,:where(.semi-table-bordered>.semi-table-container>.semi-table-body)>.semi-table>.semi-table-tbody>.semi-table-row>.semi-table-row-cell{border-right:1px solid var(--semi-color-border)}:where(.semi-table-bordered>.semi-table-container>.semi-table-header)>.semi-table>.semi-table-thead>.semi-table-row>.semi-table-row-head{border-right:1px solid var(--semi-color-border)}:where(.semi-table-bordered>.semi-table-container>.semi-table-header)>.semi-table>.semi-table-thead>.semi-table-row>.semi-table-row-head .react-resizable-handle{background-color:#0000}.semi-table-placeholder{position:sticky;left:0;z-index:1;box-sizing:border-box;padding:16px 12px;color:var(--semi-color-text-2);font-size:14px;text-align:center;background:#0000;border-bottom:1px solid var(--semi-color-border)}.semi-table-fixed{table-layout:fixed;min-width:100%}.semi-table-fixed>.semi-table-tbody>.semi-table-row-expand>.semi-table-row-cell>.semi-table-expand-inner,.semi-table-fixed>.semi-table-tbody>.semi-table-row-section>.semi-table-row-cell>.semi-table-section-inner{position:sticky;overflow:auto;left:0;margin-left:-16px;margin-right:-16px;padding-left:16px;padding-right:16px;height:100%;display:flex;align-items:center}.semi-table-fixed-header table{table-layout:fixed}.semi-table-scroll-position-left .semi-table-tbody>.semi-table-row>.semi-table-cell-fixed-left-last,.semi-table-scroll-position-left .semi-table-thead>.semi-table-row>.semi-table-cell-fixed-left-last{box-shadow:none}.semi-table-scroll-position-right .semi-table-tbody>.semi-table-row>.semi-table-cell-fixed-right-first,.semi-table-scroll-position-right .semi-table-thead>.semi-table-row>.semi-table-cell-fixed-right-first{box-shadow:none}.semi-table-pagination-outer{color:var(--semi-color-text-2);min-height:60px}.semi-table-expand-icon{color:var(--semi-color-text-2);cursor:pointer;display:inline-flex;align-items:center;-webkit-user-select:none;user-select:none;background:#0000;position:relative;margin-right:8px}.semi-table-expand-icon-cell{display:inline-flex;align-items:center;justify-content:center}.semi-table-expand-icon .semi-table-expandedIcon-show{transition:transform .15s cubic-bezier(.62,.05,.36,.95);transform:rotate(90deg)}.semi-table-expand-icon .semi-table-expandedIcon-hide{transition:transform .15s cubic-bezier(.62,.05,.36,.95);transform:rotate(0)}.semi-table-column-filter-dropdown .semi-dropdown-menu{max-height:290px;overflow-y:auto}.semi-table-wrapper-rtl .semi-table{direction:rtl;text-align:right}.semi-table-wrapper-rtl .semi-table-align-left .semi-table-operate-wrapper{justify-content:flex-end}.semi-table-wrapper-rtl .semi-table-align-right .semi-table-operate-wrapper{justify-content:flex-start}.semi-table-wrapper-rtl .semi-table-thead>.semi-table-row>.semi-table-row-head{text-align:right}.semi-table-wrapper-rtl .semi-table-thead>.semi-table-row>.semi-table-row-head.semi-table-cell-fixed-left-last{border-right:0;border-left:1px solid var(--semi-color-border)}.semi-table-wrapper-rtl .semi-table-thead>.semi-table-row>.semi-table-row-head.semi-table-cell-fixed-left-last.resizing{border-left:2px solid var(--semi-color-primary)}.semi-table-wrapper-rtl .semi-table-thead>.semi-table-row>.semi-table-row-head.semi-table-cell-fixed-right-first{border-left:0;border-right:1px solid var(--semi-color-border)}.semi-table-wrapper-rtl .semi-table-thead>.semi-table-row>.semi-table-row-head.semi-table-cell-fixed-right-first.resizing{border-left:2px solid var(--semi-color-primary)}.semi-table-wrapper-rtl .semi-table-thead>.semi-table-row>.semi-table-row-head.semi-table-cell-fixed-right-first[x-type=column-scrollbar]{box-shadow:none;border-right:rgba(0,0,0,0)}.semi-table-wrapper-rtl .semi-table-thead>.semi-table-row .resizing{border-left:2px solid var(--semi-color-primary)}.semi-table-wrapper-rtl .semi-table-thead>.semi-table-row .react-resizable-handle{right:auto;left:-1px}.semi-table-wrapper-rtl .semi-table-tbody{display:table-row-group}.semi-table-wrapper-rtl .semi-table-tbody>.semi-table-row>.semi-table-row-cell.resizing{border-right:0;border-left:2px solid var(--semi-color-primary)}.semi-table-wrapper-rtl .semi-table-tbody>.semi-table-row>.semi-table-cell-fixed-left-last{border-right:0;border-left:1px solid var(--semi-color-border)}.semi-table-wrapper-rtl .semi-table-tbody>.semi-table-row>.semi-table-cell-fixed-right-first{border-left:0;border-right:1px solid var(--semi-color-border)}.semi-table-wrapper-rtl .semi-table .semi-table-column-selection .semi-checkbox-inner-display .semi-icon{left:auto;right:0}.semi-table-wrapper-rtl .semi-table .semi-table-column-expand .semi-table-expand-icon{transform:scaleX(-1) translateY(2px)}.semi-table-wrapper-rtl .semi-table .semi-table-column-expand .semi-table-expand-icon:last-child{margin-right:auto;margin-left:0}.semi-table-wrapper-rtl .semi-table .semi-table-column-sorter,.semi-table-wrapper-rtl .semi-table .semi-table-column-filter{margin-left:0;margin-right:4px}.semi-table-wrapper-rtl .semi-table-bordered .semi-table-container{border-left:0;border-right:1px solid var(--semi-color-border)}.semi-table-wrapper-rtl .semi-table-bordered .semi-table-thead>.semi-table-row>.semi-table-row-head,.semi-table-wrapper-rtl .semi-table-bordered .semi-table-tbody>.semi-table-row>.semi-table-row-cell{border-right:0;border-left:1px solid var(--semi-color-border)}.semi-table-wrapper-rtl .semi-table-bordered .semi-table-placeholder{border-left:1px solid var(--semi-color-border);border-right:0}.semi-table-wrapper-rtl .semi-table-bordered .semi-table-header::-webkit-scrollbar{border-right:0;border-left:1px solid var(--semi-color-border)}.semi-table-wrapper-rtl .semi-table-bordered:not(.semi-table-scroll-position-left)>.semi-table-container:after{content:"";position:absolute;top:0;left:0;bottom:0;width:1px;background-color:var(--semi-color-border);display:block;z-index:103;pointer-events:none}.semi-table-wrapper-rtl .semi-table-fixed>.semi-table-tbody>.semi-table-row-expand>.semi-table-row-cell>.semi-table-expand-inner,.semi-table-wrapper-rtl .semi-table-fixed>.semi-table-tbody>.semi-table-row-section>.semi-table-row-cell>.semi-table-section-inner{left:auto;right:0;margin-right:-16px;margin-left:-16px;padding-right:16px;padding-left:16px}.semi-table-wrapper-rtl .semi-table-scroll-position-left .semi-table-tbody>.semi-table-row>.semi-table-cell-fixed-left-last,.semi-table-wrapper-rtl .semi-table-scroll-position-left .semi-table-thead>.semi-table-row>.semi-table-cell-fixed-left-last{box-shadow:3px 0 0 0 var(--semi-color-shadow)}.semi-table-wrapper-rtl .semi-table-scroll-position-left .semi-table-tbody>.semi-table-row>.semi-table-cell-fixed-right-first,.semi-table-wrapper-rtl .semi-table-scroll-position-left .semi-table-thead>.semi-table-row>.semi-table-cell-fixed-right-first{box-shadow:none}.semi-table-wrapper-rtl .semi-table-scroll-position-right .semi-table-tbody>.semi-table-row>.semi-table-cell-fixed-left-last,.semi-table-wrapper-rtl .semi-table-scroll-position-right .semi-table-thead>.semi-table-row>.semi-table-cell-fixed-left-last{box-shadow:none}.semi-table-wrapper-rtl .semi-table-scroll-position-right .semi-table-tbody>.semi-table-row>.semi-table-cell-fixed-right-first,.semi-table-wrapper-rtl .semi-table-scroll-position-right .semi-table-thead>.semi-table-row>.semi-table-cell-fixed-right-first{box-shadow:-3px 0 0 0 var(--semi-color-shadow)}.semi-table-wrapper-rtl .semi-table-expand-icon{margin-right:auto;margin-left:8px;transform:scaleX(-1) translateY(2px)}.semi-table-wrapper-rtl .semi-spin{direction:rtl}.semi-tabs{box-sizing:border-box;position:relative}.semi-tabs-left{display:flex;flex-direction:row}.semi-tabs-bar{position:relative;white-space:nowrap;outline:none}.semi-tabs-bar-left{display:flex;flex-direction:column}.semi-tabs-bar-extra{padding:0 5px}.semi-tabs-bar-more-trigger{display:inline-block;cursor:pointer;color:var(--semi-color-text-2)}.semi-tabs-bar-more-trigger-content{display:flex;align-content:center}.semi-tabs-bar-more-trigger-content-icon:not(:not(.semi-tabs-bar-more-trigger-content-icon)){margin:0 8px;flex-shrink:0;display:flex;align-items:center}.semi-tabs-bar-more-trigger-line{padding:16px 4px 14px}.semi-tabs-bar-more-trigger-card,.semi-tabs-bar-more-trigger-button{padding:8px 12px}.semi-tabs-bar .semi-tabs-tab{font-size:14px;line-height:20px;font-family:Inter,-apple-system,BlinkMacSystemFont,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Segoe UI,Helvetica Neue,Helvetica,Arial,sans-serif;cursor:pointer;box-sizing:border-box;position:relative;display:block;float:left;font-weight:400;color:var(--semi-color-text-2);-webkit-user-select:none;user-select:none}.semi-tabs-bar .semi-tabs-tab .semi-icon:not(.semi-icon-checkbox_tick,.semi-icon-radio,.semi-icon-checkbox_indeterminate){position:relative;margin-right:8px;top:3px;color:var(--semi-color-text-2);transition:color var(--semi-transition_duration-none) var(--semi-transition_function-easeIn) var(--semi-transition_delay-none)}.semi-tabs-bar .semi-tabs-tab .semi-icon.semi-tabs-tab-icon-close{margin-right:0;font-size:14px;color:var(--semi-color-text-2);margin-left:10px;cursor:pointer}.semi-tabs-bar .semi-tabs-tab:hover{color:var(--semi-color-text-0)}.semi-tabs-bar .semi-tabs-tab:hover .semi-icon:not(.semi-icon-checkbox_tick,.semi-icon-radio,.semi-icon-checkbox_indeterminate){color:var(--semi-color-text-0)}.semi-tabs-bar .semi-tabs-tab:active{color:var(--semi-color-text-0)}.semi-tabs-bar .semi-tabs-tab:active .semi-icon:not(.semi-icon-checkbox_tick,.semi-icon-radio,.semi-icon-checkbox_indeterminate){color:var(--semi-color-text-0)}.semi-tabs-bar .semi-tabs-tab-active,.semi-tabs-bar .semi-tabs-tab-active:hover{cursor:default;font-weight:600;color:var(--semi-color-text-0)}.semi-tabs-bar .semi-tabs-tab-active .semi-icon:not(.semi-icon-checkbox_tick,.semi-icon-radio,.semi-icon-checkbox_indeterminate),.semi-tabs-bar .semi-tabs-tab-active:hover .semi-icon:not(.semi-icon-checkbox_tick,.semi-icon-radio,.semi-icon-checkbox_indeterminate){color:var(--semi-color-primary)}.semi-tabs-bar .semi-tabs-tab-active .semi-icon.semi-tabs-tab-icon-close,.semi-tabs-bar .semi-tabs-tab-active:hover .semi-icon.semi-tabs-tab-icon-close{color:var(--semi-color-text-2)}.semi-tabs-bar .semi-tabs-tab-active .semi-icon.semi-tabs-tab-icon-close:hover{color:var(--semi-color-text-1)}.semi-tabs-bar .semi-tabs-tab-disabled{cursor:not-allowed;color:var(--semi-color-disabled-text)}.semi-tabs-bar .semi-tabs-tab-disabled:hover{color:var(--semi-color-disabled-text);border-bottom:none}.semi-tabs-tab-single.semi-tabs-tab{font-size:14px;line-height:20px;font-family:Inter,-apple-system,BlinkMacSystemFont,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Segoe UI,Helvetica Neue,Helvetica,Arial,sans-serif;cursor:pointer;box-sizing:border-box;position:relative;display:inline-block;font-weight:400;color:var(--semi-color-text-2);-webkit-user-select:none;user-select:none}.semi-tabs-tab-single.semi-tabs-tab .semi-icon:not(.semi-icon-checkbox_tick,.semi-icon-radio,.semi-icon-checkbox_indeterminate){position:relative;margin-right:8px;top:3px;color:var(--semi-color-text-2);transition:color var(--semi-transition_duration-none) var(--semi-transition_function-easeIn) var(--semi-transition_delay-none)}.semi-tabs-tab-single.semi-tabs-tab .semi-icon.semi-tabs-tab-icon-close{margin-right:0;font-size:14px;color:var(--semi-color-text-2);margin-left:10px;cursor:pointer}.semi-tabs-tab-single.semi-tabs-tab .semi-icon.semi-tabs-tab-icon-close.semi-icon-close:hover,.semi-tabs-tab-single.semi-tabs-tab:hover{color:var(--semi-color-text-0)}.semi-tabs-tab-single.semi-tabs-tab:hover .semi-icon:not(.semi-icon-checkbox_tick,.semi-icon-radio,.semi-icon-checkbox_indeterminate){color:var(--semi-color-text-0)}.semi-tabs-tab-single.semi-tabs-tab:hover .semi-icon.semi-tabs-tab-icon-close{color:var(--semi-color-text-2)}.semi-tabs-tab-single.semi-tabs-tab:active{color:var(--semi-color-text-0)}.semi-tabs-tab-single.semi-tabs-tab:active .semi-icon:not(.semi-icon-checkbox_tick,.semi-icon-radio,.semi-icon-checkbox_indeterminate){color:var(--semi-color-text-0)}.semi-tabs-tab-single.semi-tabs-tab:active .semi-icon.semi-tabs-tab-icon-close{color:var(--semi-color-text-2)}.semi-tabs-tab-single.semi-tabs-tab-active,.semi-tabs-tab-single.semi-tabs-tab-active:hover{cursor:default;font-weight:600;color:var(--semi-color-text-0)}.semi-tabs-tab-single.semi-tabs-tab-active .semi-icon:not(.semi-icon-checkbox_tick,.semi-icon-radio,.semi-icon-checkbox_indeterminate),.semi-tabs-tab-single.semi-tabs-tab-active:hover .semi-icon:not(.semi-icon-checkbox_tick,.semi-icon-radio,.semi-icon-checkbox_indeterminate){color:var(--semi-color-primary)}.semi-tabs-tab-single.semi-tabs-tab-active .semi-icon.semi-tabs-tab-icon-close,.semi-tabs-tab-single.semi-tabs-tab-active:hover .semi-icon.semi-tabs-tab-icon-close{color:var(--semi-color-text-2)}.semi-tabs-tab-single.semi-tabs-tab-active .semi-icon.semi-tabs-tab-icon-close:hover{color:var(--semi-color-text-1)}.semi-tabs-tab-single.semi-tabs-tab-disabled{cursor:not-allowed;color:var(--semi-color-disabled-text)}.semi-tabs-tab-single.semi-tabs-tab-disabled:hover{color:var(--semi-color-disabled-text);border-bottom:none}.semi-tabs-bar-collapse,.semi-tabs-bar-collapse .semi-tabs-bar-overflow-list{display:flex;align-items:center}.semi-tabs-bar-collapse .semi-overflow-list{flex:1}.semi-tabs-bar-collapse .semi-overflow-list .semi-overflow-list-scroll-wrapper{-ms-overflow-style:none;scrollbar-width:none}.semi-tabs-bar-collapse .semi-overflow-list .semi-overflow-list-scroll-wrapper::-webkit-scrollbar{display:none;width:0;height:0}.semi-tabs-bar-collapse .semi-overflow-list .semi-overflow-list-scroll-wrapper:focus-visible{outline:2px solid var(--semi-color-primary-light-active);outline-offset:-2px}.semi-tabs-bar-collapse .semi-overflow-list>.semi-button-disabled{color:var(--semi-color-disabled-text);background-color:#0000}.semi-tabs-bar-collapse .semi-overflow-list>.semi-button-disabled:hover{color:var(--semi-color-disabled-text);background-color:#0000}.semi-tabs-bar-collapse .semi-tabs-bar-arrow-start{margin-right:4px}.semi-tabs-bar-collapse .semi-tabs-bar-arrow-start>.semi-button[aria-disabled=false]{color:var(--semi-color-primary);padding:8px;border:0px solid rgba(0,0,0,0);background-color:#0000}.semi-tabs-bar-collapse .semi-tabs-bar-arrow-start>.semi-button[aria-disabled=false]:hover{background-color:var(--semi-color-fill-0);color:var(--semi-color-primary);border-color:#0000}.semi-tabs-bar-collapse .semi-tabs-bar-arrow-start>.semi-button[aria-disabled=false]:active{background-color:var(--semi-color-fill-1);color:var(--semi-color-primary);border-color:#0000}.semi-tabs-bar-collapse .semi-tabs-bar-arrow-end{margin-left:4px}.semi-tabs-bar-collapse .semi-tabs-bar-arrow-end>.semi-button[aria-disabled=false]{color:var(--semi-color-primary);padding:8px;border:0px solid rgba(0,0,0,0);background-color:#0000}.semi-tabs-bar-collapse .semi-tabs-bar-arrow-end>.semi-button[aria-disabled=false]:hover{background-color:var(--semi-color-fill-0);color:var(--semi-color-primary);border-color:#0000}.semi-tabs-bar-collapse .semi-tabs-bar-arrow-end>.semi-button[aria-disabled=false]:active{background-color:var(--semi-color-fill-1);color:var(--semi-color-primary);border-color:#0000}.semi-tabs-bar-dropdown{max-height:300px;overflow-y:auto}.semi-tabs-bar:after{content:"";height:0;display:block;clear:both}.semi-tabs-bar-line.semi-tabs-bar-top{border-bottom:1px solid var(--semi-color-border);transition:color var(--semi-transition_duration-none) var(--semi-transition_function-easeIn) var(--semi-transition_delay-none);transform:scale(var(--semi-transform_scale-none))}.semi-tabs-bar-line.semi-tabs-bar-top .semi-tabs-tab{padding:16px 4px 14px;transition:border-bottom-color var(--semi-transition_duration-none) var(--semi-transition_function-easeIn) var(--semi-transition_delay-none),color var(--semi-transition_duration-none) var(--semi-transition_function-easeIn) var(--semi-transition_delay-none);border-bottom:2px solid rgba(0,0,0,0)}.semi-tabs-bar-line.semi-tabs-bar-top .semi-tabs-tab:nth-of-type(1){padding-left:0}.semi-tabs-bar-line.semi-tabs-bar-top .semi-tabs-tab:hover{border-bottom:2px solid var(--semi-color-fill-0)}.semi-tabs-bar-line.semi-tabs-bar-top .semi-tabs-tab:focus-visible{outline:2px solid var(--semi-color-primary-light-active);outline-offset:-1px}.semi-tabs-bar-line.semi-tabs-bar-top .semi-tabs-tab:active{border-bottom:2px solid var(--semi-color-fill-1)}.semi-tabs-bar-line.semi-tabs-bar-top .semi-tabs-tab:not(:last-of-type){margin-right:24px}.semi-tabs-bar-line.semi-tabs-bar-top .semi-tabs-tab-small{padding:8px 4px 6px}.semi-tabs-bar-line.semi-tabs-bar-top .semi-tabs-tab-medium{padding:12px 4px 10px}.semi-tabs-bar-line.semi-tabs-bar-top .semi-tabs-tab-active,.semi-tabs-bar-line.semi-tabs-bar-top .semi-tabs-tab-active:hover{border-bottom:2px solid var(--semi-color-primary)}.semi-tabs-bar-line.semi-tabs-bar-left{border-right:1px solid var(--semi-color-border)}.semi-tabs-bar-line.semi-tabs-bar-left .semi-tabs-tab{padding:12px;border-left:2px solid rgba(0,0,0,0);transition:background-color var(--semi-transition_duration-none) var(--semi-transition_function-easeIn) var(--semi-transition_delay-none),color var(--semi-transition_duration-none) var(--semi-transition_function-easeIn) var(--semi-transition_delay-none)}.semi-tabs-bar-line.semi-tabs-bar-left .semi-tabs-tab:hover{border-left:2px solid var(--semi-color-fill-0);background-color:var(--semi-color-fill-0)}.semi-tabs-bar-line.semi-tabs-bar-left .semi-tabs-tab:focus-visible{outline:2px solid var(--semi-color-primary-light-active);outline-offset:-2px}.semi-tabs-bar-line.semi-tabs-bar-left .semi-tabs-tab:active{border-left:2px solid var(--semi-color-fill-1);background-color:var(--semi-color-fill-1)}.semi-tabs-bar-line.semi-tabs-bar-left .semi-tabs-tab-small{padding:6px}.semi-tabs-bar-line.semi-tabs-bar-left .semi-tabs-tab-medium{padding:10px}.semi-tabs-bar-line.semi-tabs-bar-left .semi-tabs-tab-active{background-color:var(--semi-color-primary-light-default)}.semi-tabs-bar-line.semi-tabs-bar-left .semi-tabs-tab-active,.semi-tabs-bar-line.semi-tabs-bar-left .semi-tabs-tab-active:hover{border-left:2px solid var(--semi-color-primary);background-color:var(--semi-color-primary-light-default)}.semi-tabs-bar-line .semi-tabs-bar-extra{height:50px;line-height:50px}.semi-tabs-bar-line .semi-tabs-bar-line-extra-small{height:36px;line-height:36px}.semi-tabs-bar-card.semi-tabs-bar-top:before{position:absolute;right:0;left:0;bottom:0;border-bottom:1px solid var(--semi-color-border);content:""}.semi-tabs-bar-card.semi-tabs-bar-top .semi-tabs-tab{border:1px solid rgba(0,0,0,0);border-bottom:none;border-radius:var(--semi-border-radius-small) var(--semi-border-radius-small) 0 0}.semi-tabs-bar-card.semi-tabs-bar-top .semi-tabs-tab:hover{border-bottom:none}.semi-tabs-bar-card.semi-tabs-bar-top .semi-tabs-tab:not(:last-of-type){margin-right:8px}.semi-tabs-bar-card.semi-tabs-bar-top .semi-tabs-tab-active,.semi-tabs-bar-card.semi-tabs-bar-top .semi-tabs-tab-active:hover{padding:8px 12px 7px;border:1px solid var(--semi-color-border);border-bottom:1px solid var(--semi-color-bg-1);background:#0000}.semi-tabs-bar-card.semi-tabs-bar-left{border-right:1px solid var(--semi-color-border)}.semi-tabs-bar-card.semi-tabs-bar-left .semi-tabs-tab{border:1px solid rgba(0,0,0,0);border-right:none;border-radius:var(--semi-border-radius-small) 0 0 var(--semi-border-radius-small)}.semi-tabs-bar-card.semi-tabs-bar-left .semi-tabs-tab:hover{border-right:none}.semi-tabs-bar-card.semi-tabs-bar-left .semi-tabs-tab:not(:last-of-type){margin-bottom:8px}.semi-tabs-bar-card.semi-tabs-bar-left .semi-tabs-tab-active:after{content:" ";width:1px;position:absolute;right:-1px;top:0;bottom:0;background:var(--semi-color-bg-1)}.semi-tabs-bar-card.semi-tabs-bar-left .semi-tabs-tab-active,.semi-tabs-bar-card.semi-tabs-bar-left .semi-tabs-tab-active:hover{padding:8px 12px;border:1px solid var(--semi-color-border);border-right:none;background:#0000}.semi-tabs-bar-card .semi-tabs-tab{padding:8px 12px;transition:background-color var(--semi-transition_duration-none) var(--semi-transition_function-easeIn) var(--semi-transition_delay-none),color var(--semi-transition_duration-none) var(--semi-transition_function-easeIn) var(--semi-transition_delay-none);transform:scale(var(--semi-transform_scale-none))}.semi-tabs-bar-card .semi-tabs-tab:hover{background:var(--semi-color-fill-0)}.semi-tabs-bar-card .semi-tabs-tab:focus-visible{outline:2px solid var(--semi-color-primary-light-active);outline-offset:-2px}.semi-tabs-bar-card .semi-tabs-tab:active{background:var(--semi-color-fill-1)}.semi-tabs-bar-button{border:none}.semi-tabs-bar-button.semi-tabs-bar-left .semi-tabs-tab:not(:last-of-type){margin-bottom:8px}.semi-tabs-bar-button.semi-tabs-bar-top .semi-tabs-tab:not(:last-of-type){margin-right:8px}.semi-tabs-bar-button .semi-tabs-tab{padding:8px 12px;border-radius:var(--semi-border-radius-small);color:var(--semi-color-text-2);border:none;transition:background-color var(--semi-transition_duration-none) var(--semi-transition_function-easeIn) var(--semi-transition_delay-none),color var(--semi-transition_duration-none) var(--semi-transition_function-easeIn) var(--semi-transition_delay-none);transform:scale(var(--semi-transform_scale-none))}.semi-tabs-bar-button .semi-tabs-tab:hover{border:none;background-color:var(--semi-color-fill-0)}.semi-tabs-bar-button .semi-tabs-tab:focus-visible{outline:2px solid var(--semi-color-primary-light-active);outline-offset:-2px}.semi-tabs-bar-button .semi-tabs-tab:active{background-color:var(--semi-color-fill-1)}.semi-tabs-bar-button .semi-tabs-tab-active,.semi-tabs-bar-button .semi-tabs-tab-active:hover{color:var(--semi-color-primary);border:none;background-color:var(--semi-color-primary-light-default)}.semi-tabs-bar-slash .semi-tabs-tab{padding:12px 0}.semi-tabs-bar-slash .semi-tabs-tab:nth-of-type(1){padding-left:0}.semi-tabs-bar-slash .semi-tabs-tab:not(:last-of-type){margin-right:16px}.semi-tabs-bar-slash .semi-tabs-tab:not(:last-of-type):after{content:"";margin-left:16px;display:inline-block;height:14px;width:8px;margin-top:3px;margin-bottom:3px;vertical-align:bottom;background:linear-gradient(to bottom right,transparent 0%,transparent calc(50% - 1px),var(--semi-color-text-2) 50%,transparent calc(50% + 1px),transparent 100%)}.semi-tabs-content{width:100%;padding:5px 0}.semi-tabs-content-left{height:100%;padding:0 5px}.semi-tabs-pane{width:100%;overflow:hidden;color:var(--semi-color-text-0)}.semi-tabs-pane:focus-visible{outline:2px solid var(--semi-color-primary-light-active)}.semi-tabs-pane-inactive,.semi-tabs-content-no-animated .semi-tabs-pane-inactive{display:none}@keyframes semi-tabs-panel-keyframe-leftShow{0%{transform:translate(60px);opacity:0}to{transform:translate(0);opacity:1}}@keyframes semi-tabs-panel-keyframe-rightShow{0%{transform:translate(-60px);opacity:0}to{transform:translate(0);opacity:1}}@keyframes semi-tabs-panel-keyframe-topShow{0%{transform:translateY(60px);opacity:0}to{transform:translateY(0);opacity:1}}@keyframes semi-tabs-panel-keyframe-bottomShow{0%{transform:translateY(-60px);opacity:0}to{transform:translateY(0);opacity:1}}.semi-tabs-pane-animate-leftShow{animation:.2s semi-tabs-panel-keyframe-leftShow ease-in-out 0s;animation-fill-mode:forwards}.semi-tabs-pane-animate-rightShow{animation:.2s semi-tabs-panel-keyframe-rightShow ease-in-out 0s;animation-fill-mode:forwards}.semi-tabs-pane-animate-topShow{animation:.2s semi-tabs-panel-keyframe-topShow ease-in-out 0s;animation-fill-mode:forwards}.semi-tabs-pane-animate-bottomShow{animation:.2s semi-tabs-panel-keyframe-bottomShow ease-in-out 0s;animation-fill-mode:forwards}.semi-tabs-tab-line.semi-tabs-tab-top.semi-tabs-tab{font-size:14px;padding:16px 4px 14px;transition:border-bottom-color var(--semi-transition_duration-none) var(--semi-transition_function-easeIn) var(--semi-transition_delay-none),color var(--semi-transition_duration-none) var(--semi-transition_function-easeIn) var(--semi-transition_delay-none);border-bottom:2px solid rgba(0,0,0,0)}.semi-tabs-tab-line.semi-tabs-tab-top.semi-tabs-tab:nth-of-type(1){padding-left:0}.semi-tabs-tab-line.semi-tabs-tab-top.semi-tabs-tab:hover{border-bottom:2px solid var(--semi-color-fill-0)}.semi-tabs-tab-line.semi-tabs-tab-top.semi-tabs-tab:focus-visible{outline:2px solid var(--semi-color-primary-light-active);outline-offset:-1px}.semi-tabs-tab-line.semi-tabs-tab-top.semi-tabs-tab:active{border-bottom:2px solid var(--semi-color-fill-1)}.semi-tabs-tab-line.semi-tabs-tab-top.semi-tabs-tab-small{font-size:14px;padding:8px 4px 6px}.semi-tabs-tab-line.semi-tabs-tab-top.semi-tabs-tab-medium{font-size:14px;padding:12px 4px 10px}.semi-tabs-tab-line.semi-tabs-tab-top.semi-tabs-tab-active,.semi-tabs-tab-line.semi-tabs-tab-top.semi-tabs-tab-active:hover{border-bottom:2px solid var(--semi-color-primary)}.semi-tabs-tab-line.semi-tabs-tab-left.semi-tabs-tab{padding:12px;border-left:2px solid rgba(0,0,0,0);transition:background-color var(--semi-transition_duration-none) var(--semi-transition_function-easeIn) var(--semi-transition_delay-none),color var(--semi-transition_duration-none) var(--semi-transition_function-easeIn) var(--semi-transition_delay-none)}.semi-tabs-tab-line.semi-tabs-tab-left.semi-tabs-tab:hover{border-left:2px solid var(--semi-color-fill-0);background-color:var(--semi-color-fill-0)}.semi-tabs-tab-line.semi-tabs-tab-left.semi-tabs-tab:focus-visible{outline:2px solid var(--semi-color-primary-light-active);outline-offset:-2px}.semi-tabs-tab-line.semi-tabs-tab-left.semi-tabs-tab:active{border-left:2px solid var(--semi-color-fill-1);background-color:var(--semi-color-fill-1)}.semi-tabs-tab-line.semi-tabs-tab-left.semi-tabs-tab-small{padding:6px}.semi-tabs-tab-line.semi-tabs-tab-left.semi-tabs-tab-medium{padding:10px}.semi-tabs-tab-line.semi-tabs-tab-left.semi-tabs-tab-active{background-color:var(--semi-color-primary-light-default)}.semi-tabs-tab-line.semi-tabs-tab-left.semi-tabs-tab-active,.semi-tabs-tab-line.semi-tabs-tab-left.semi-tabs-tab-active:hover{border-left:2px solid var(--semi-color-primary);background-color:var(--semi-color-primary-light-default)}.semi-tabs-tab-card.semi-tabs-tab-top.semi-tabs-tab{border:1px solid rgba(0,0,0,0);border-bottom:none;border-radius:var(--semi-border-radius-small) var(--semi-border-radius-small) 0 0}.semi-tabs-tab-card.semi-tabs-tab-top.semi-tabs-tab:hover{border-bottom:none}.semi-tabs-tab-card.semi-tabs-tab-top.semi-tabs-tab-active,.semi-tabs-tab-card.semi-tabs-tab-top.semi-tabs-tab-active:hover{padding:8px 12px 7px;border:1px solid var(--semi-color-border);border-bottom:1px solid var(--semi-color-bg-1);background:#0000}.semi-tabs-tab-card.semi-tabs-tab-left.semi-tabs-tab{border:1px solid rgba(0,0,0,0);border-right:none;border-radius:var(--semi-border-radius-small) 0 0 var(--semi-border-radius-small)}.semi-tabs-tab-card.semi-tabs-tab-left.semi-tabs-tab:hover{border-right:none}.semi-tabs-tab-card.semi-tabs-tab-left.semi-tabs-tab-active:after{content:" ";width:1px;position:absolute;right:-1px;top:0;bottom:0;background:var(--semi-color-bg-1)}.semi-tabs-tab-card.semi-tabs-tab-left.semi-tabs-tab-active,.semi-tabs-tab-card.semi-tabs-tab-left.semi-tabs-tab-active:hover{padding:8px 12px;border:1px solid var(--semi-color-border);border-right:none;background:#0000}.semi-tabs-tab-card.semi-tabs-tab{padding:8px 12px;transition:background-color var(--semi-transition_duration-none) var(--semi-transition_function-easeIn) var(--semi-transition_delay-none),color var(--semi-transition_duration-none) var(--semi-transition_function-easeIn) var(--semi-transition_delay-none);transform:scale(var(--semi-transform_scale-none))}.semi-tabs-tab-card.semi-tabs-tab:hover{background:var(--semi-color-fill-0)}.semi-tabs-tab-card.semi-tabs-tab:focus-visible{outline:2px solid var(--semi-color-primary-light-active);outline-offset:-2px}.semi-tabs-tab-card.semi-tabs-tab:active{background:var(--semi-color-fill-1)}.semi-tabs-tab-button{border:none}.semi-tabs-tab-button.semi-tabs-tab{padding:8px 12px;border-radius:var(--semi-border-radius-small);color:var(--semi-color-text-2);border:none;transition:background-color var(--semi-transition_duration-none) var(--semi-transition_function-easeIn) var(--semi-transition_delay-none),color var(--semi-transition_duration-none) var(--semi-transition_function-easeIn) var(--semi-transition_delay-none);transform:scale(var(--semi-transform_scale-none))}.semi-tabs-tab-button.semi-tabs-tab:hover{border:none;background-color:var(--semi-color-fill-0)}.semi-tabs-tab-button.semi-tabs-tab:focus-visible{outline:2px solid var(--semi-color-primary-light-active);outline-offset:-2px}.semi-tabs-tab-button.semi-tabs-tab:active{background-color:var(--semi-color-fill-1)}.semi-tabs-tab-button.semi-tabs-tab-active,.semi-tabs-tab-button.semi-tabs-tab-active:hover{color:var(--semi-color-primary);border:none;background-color:var(--semi-color-primary-light-default)}.semi-rtl .semi-tabs,.semi-portal-rtl .semi-tabs{direction:rtl}.semi-rtl .semi-tabs-bar .semi-tabs-tab,.semi-portal-rtl .semi-tabs-bar .semi-tabs-tab{float:right}.semi-rtl .semi-tabs-bar .semi-tabs-tab .semi-icon,.semi-portal-rtl .semi-tabs-bar .semi-tabs-tab .semi-icon{margin-right:0;margin-left:8px}.semi-rtl .semi-tabs-bar-collapse .semi-tabs-bar-arrow-start,.semi-portal-rtl .semi-tabs-bar-collapse .semi-tabs-bar-arrow-start{margin-right:0;margin-left:4px}.semi-rtl .semi-tabs-bar-collapse .semi-tabs-bar-arrow-end,.semi-portal-rtl .semi-tabs-bar-collapse .semi-tabs-bar-arrow-end{margin-left:0;margin-right:4px}.semi-rtl .semi-tabs-bar-collapse .semi-icon-chevron_right,.semi-rtl .semi-tabs-bar-collapse .semi-icon-chevron_left,.semi-portal-rtl .semi-tabs-bar-collapse .semi-icon-chevron_right,.semi-portal-rtl .semi-tabs-bar-collapse .semi-icon-chevron_left{transform:scaleX(-1)}.semi-rtl .semi-tabs-bar-line.semi-tabs-bar-top .semi-tabs-tab:not(:last-of-type),.semi-portal-rtl .semi-tabs-bar-line.semi-tabs-bar-top .semi-tabs-tab:not(:last-of-type){margin-right:0;margin-left:24px}.semi-rtl .semi-tabs-bar-line.semi-tabs-bar-left,.semi-portal-rtl .semi-tabs-bar-line.semi-tabs-bar-left{border-right:0;border-left:1px solid var(--semi-color-border)}.semi-rtl .semi-tabs-bar-line.semi-tabs-bar-left .semi-tabs-tab,.semi-portal-rtl .semi-tabs-bar-line.semi-tabs-bar-left .semi-tabs-tab{border-left:0;border-right:2px solid rgba(0,0,0,0)}.semi-rtl .semi-tabs-bar-line.semi-tabs-bar-left .semi-tabs-tab:hover,.semi-portal-rtl .semi-tabs-bar-line.semi-tabs-bar-left .semi-tabs-tab:hover{border-left:0;border-right:2px solid var(--semi-color-fill-0)}.semi-rtl .semi-tabs-bar-line.semi-tabs-bar-left .semi-tabs-tab:active,.semi-portal-rtl .semi-tabs-bar-line.semi-tabs-bar-left .semi-tabs-tab:active{border-left:0;border-right:2px solid var(--semi-color-fill-1)}.semi-rtl .semi-tabs-bar-line.semi-tabs-bar-left .semi-tabs-tab-active,.semi-rtl .semi-tabs-bar-line.semi-tabs-bar-left .semi-tabs-tab-active:hover,.semi-portal-rtl .semi-tabs-bar-line.semi-tabs-bar-left .semi-tabs-tab-active,.semi-portal-rtl .semi-tabs-bar-line.semi-tabs-bar-left .semi-tabs-tab-active:hover{border-left:0;border-right:2px solid var(--semi-color-primary)}.semi-rtl .semi-tabs-bar-card.semi-tabs-bar-top .semi-tabs-tab:not(:last-of-type),.semi-portal-rtl .semi-tabs-bar-card.semi-tabs-bar-top .semi-tabs-tab:not(:last-of-type){margin-left:0;margin-right:8px}.semi-rtl .semi-tabs-bar-card.semi-tabs-bar-left,.semi-portal-rtl .semi-tabs-bar-card.semi-tabs-bar-left{border-right:0;border-left:1px solid var(--semi-color-border)}.semi-rtl .semi-tabs-bar-card.semi-tabs-bar-left .semi-tabs-tab,.semi-portal-rtl .semi-tabs-bar-card.semi-tabs-bar-left .semi-tabs-tab{border:1px solid rgba(0,0,0,0);border-left:none}.semi-rtl .semi-tabs-bar-card.semi-tabs-bar-left .semi-tabs-tab:hover,.semi-portal-rtl .semi-tabs-bar-card.semi-tabs-bar-left .semi-tabs-tab:hover{border-left:none}.semi-rtl .semi-tabs-bar-card.semi-tabs-bar-left .semi-tabs-tab-active:after,.semi-portal-rtl .semi-tabs-bar-card.semi-tabs-bar-left .semi-tabs-tab-active:after{right:auto;left:-1px}.semi-rtl .semi-tabs-bar-button.semi-tabs-bar-top .semi-tabs-tab:not(:last-of-type),.semi-portal-rtl .semi-tabs-bar-button.semi-tabs-bar-top .semi-tabs-tab:not(:last-of-type){margin-right:auto;margin-left:8px}.semi-tag{box-sizing:border-box;border-radius:var(--semi-border-radius-small);background-color:#0000;position:relative;-webkit-user-select:none;user-select:none;overflow:hidden;white-space:nowrap;vertical-align:bottom;display:flex;justify-content:center;align-items:center;display:inline-flex}.semi-tag-default,.semi-tag-small{font-size:12px;line-height:16px;font-family:Inter,-apple-system,BlinkMacSystemFont,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Segoe UI,Helvetica Neue,Helvetica,Arial,sans-serif;height:20px;padding:2px 8px}.semi-tag-default:focus-visible,.semi-tag-small:focus-visible{outline:2px solid var(--semi-color-primary-light-active)}.semi-tag-square{border-radius:var(--semi-border-radius-small)}.semi-tag-circle{border-radius:var(--semi-border-radius-full)}.semi-tag-large{font-size:12px;line-height:16px;font-family:Inter,-apple-system,BlinkMacSystemFont,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Segoe UI,Helvetica Neue,Helvetica,Arial,sans-serif;padding:4px 8px;height:24px}.semi-tag-large:focus-visible{outline:2px solid var(--semi-color-primary-light-active)}.semi-tag-invisible{display:none}.semi-tag-prefix-icon{display:flex;padding-right:4px}.semi-tag-suffix-icon{display:flex;padding-left:4px}.semi-tag-content{flex:1}.semi-tag-content-ellipsis{overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.semi-tag-content-center{display:flex;justify-content:center;align-items:center;height:100%;min-width:0}.semi-tag-close{display:flex;justify-content:center;align-items:center;color:var(--semi-color-text-2);padding-left:4px;cursor:pointer}.semi-tag-close:hover{color:var(--semi-color-text-1)}.semi-tag-close:active{color:var(--semi-color-text-0)}.semi-tag-closable{padding:4px 4px 4px 8px}.semi-tag-avatar-square .semi-avatar,.semi-tag-avatar-circle .semi-avatar{margin-right:4px}.semi-tag-avatar-square{padding:0 4px 0 0}.semi-tag-avatar-square .semi-avatar>img{background-color:var(--semi-color-default)}.semi-tag-avatar-circle{padding:2px 4px 2px 2px}.semi-tag-avatar-square.semi-tag-default .semi-avatar,.semi-tag-avatar-square.semi-tag-small .semi-avatar{width:20px;height:20px}.semi-tag-avatar-square.semi-tag-large .semi-avatar{width:24px;height:24px}.semi-tag-avatar-circle.semi-tag-small,.semi-tag-avatar-circle.semi-tag-default{border-radius:11px}.semi-tag-avatar-circle.semi-tag-small .semi-avatar,.semi-tag-avatar-circle.semi-tag-default .semi-avatar{width:16px;height:16px}.semi-tag-avatar-circle.semi-tag-large{border-radius:13px}.semi-tag-avatar-circle.semi-tag-large .semi-avatar{width:20px;height:20px}.semi-tag-colorful{font-weight:600}.semi-tag-colorful.semi-tag-solid{background:var(--semi-color-ai-purple);color:var(--semi-color-white)}.semi-tag-colorful.semi-tag-solid.semi-tag-gradient{background:var(--semi-color-ai-general)}.semi-tag-colorful.semi-tag-light{background:rgba(var(--semi-ai-purple-0),1);color:var(--semi-color-ai-purple)}.semi-tag-colorful.semi-tag-light.semi-tag-gradient{background:var(--semi-ai-general-0)}.semi-tag-colorful.semi-tag-light.semi-tag-gradient .semi-tag-prefix-icon svg stop:nth-child(1){stop-color:rgba(var(--semi-ai-general-5-0),1)}.semi-tag-colorful.semi-tag-light.semi-tag-gradient .semi-tag-prefix-icon svg stop:nth-child(2){stop-color:rgba(var(--semi-ai-general-5-1),1)}.semi-tag-colorful.semi-tag-light.semi-tag-gradient .semi-tag-prefix-icon svg stop:nth-child(3){stop-color:rgba(var(--semi-ai-general-5-2),1)}.semi-tag-colorful.semi-tag-light.semi-tag-gradient .semi-tag-prefix-icon svg stop:nth-child(4){stop-color:rgba(var(--semi-ai-general-5-3),1)}.semi-tag-colorful.semi-tag-light.semi-tag-gradient .semi-tag-content{background:var(--semi-color-ai-general);-webkit-background-clip:text;background-clip:text;color:#0000}.semi-tag-colorful.semi-tag-ghost{background:var(--semi-color-white);color:var(--semi-color-ai-purple);border-color:var(--semi-color-ai-general)}.semi-tag-colorful.semi-tag-ghost.semi-tag-gradient{border:none}.semi-tag-colorful.semi-tag-ghost.semi-tag-gradient .semi-tag-prefix-icon svg stop:nth-child(1){stop-color:rgba(var(--semi-ai-general-5-0),1)}.semi-tag-colorful.semi-tag-ghost.semi-tag-gradient .semi-tag-prefix-icon svg stop:nth-child(2){stop-color:rgba(var(--semi-ai-general-5-1),1)}.semi-tag-colorful.semi-tag-ghost.semi-tag-gradient .semi-tag-prefix-icon svg stop:nth-child(3){stop-color:rgba(var(--semi-ai-general-5-2),1)}.semi-tag-colorful.semi-tag-ghost.semi-tag-gradient .semi-tag-prefix-icon svg stop:nth-child(4){stop-color:rgba(var(--semi-ai-general-5-3),1)}.semi-tag-colorful.semi-tag-ghost.semi-tag-gradient.semi-tag-circle:before{border-radius:var(--semi-border-radius-full)}.semi-tag-colorful.semi-tag-ghost.semi-tag-gradient:before{content:"";position:absolute;top:0;right:0;bottom:0;left:0;border-radius:var(--semi-border-radius-small);padding:1px;background:var(--semi-color-ai-general);-webkit-mask:linear-gradient(var(--semi-color-white) 0 0) content-box,linear-gradient(var(--semi-color-white) 0 0);mask:linear-gradient(var(--semi-color-white) 0 0) content-box,linear-gradient(var(--semi-color-white) 0 0);-webkit-mask-composite:xor;mask-composite:exclude;pointer-events:none}.semi-tag-colorful.semi-tag-ghost.semi-tag-gradient .semi-tag-content{background:var(--semi-color-ai-general);-webkit-background-clip:text;background-clip:text;color:#0000}.semi-tag-group{display:block;height:auto}.semi-tag-group .semi-tag{margin-bottom:0;margin-right:8px}.semi-tag-group-max.semi-tag-group-small{height:22px}.semi-tag-group-max.semi-tag-group-large{height:26px}.semi-tag-rest-group-popover .semi-tag{margin-right:8px;margin-bottom:0}.semi-tag-rest-group-popover .semi-tag:last-of-type{margin-right:0}.semi-tag-amber-ghost{background-color:#0000;border:1px solid rgba(var(--semi-amber-4),1);color:rgba(var(--semi-amber-5),1)}.semi-tag-amber-solid{background-color:rgba(var(--semi-amber-5),1);color:rgba(var(--semi-white),1)}.semi-tag-amber-light{background-color:rgba(var(--semi-amber-5),.15);color:rgba(var(--semi-amber-8),1)}.semi-tag-blue-ghost{background-color:#0000;border:1px solid rgba(var(--semi-blue-4),1);color:rgba(var(--semi-blue-5),1)}.semi-tag-blue-solid{background-color:rgba(var(--semi-blue-5),1);color:rgba(var(--semi-white),1)}.semi-tag-blue-light{background-color:rgba(var(--semi-blue-5),.15);color:rgba(var(--semi-blue-8),1)}.semi-tag-cyan-ghost{background-color:#0000;border:1px solid rgba(var(--semi-cyan-4),1);color:rgba(var(--semi-cyan-5),1)}.semi-tag-cyan-solid{background-color:rgba(var(--semi-cyan-5),1);color:rgba(var(--semi-white),1)}.semi-tag-cyan-light{background-color:rgba(var(--semi-cyan-5),.15);color:rgba(var(--semi-cyan-8),1)}.semi-tag-green-ghost{background-color:#0000;border:1px solid rgba(var(--semi-green-4),1);color:rgba(var(--semi-green-5),1)}.semi-tag-green-solid{background-color:rgba(var(--semi-green-5),1);color:rgba(var(--semi-white),1)}.semi-tag-green-light{background-color:rgba(var(--semi-green-5),.15);color:rgba(var(--semi-green-8),1)}.semi-tag-grey-ghost{background-color:#0000;border:1px solid rgba(var(--semi-grey-4),1);color:rgba(var(--semi-grey-5),1)}.semi-tag-grey-solid{background-color:rgba(var(--semi-grey-5),1);color:rgba(var(--semi-white),1)}.semi-tag-grey-light{background-color:rgba(var(--semi-grey-5),.15);color:rgba(var(--semi-grey-8),1)}.semi-tag-indigo-ghost{background-color:#0000;border:1px solid rgba(var(--semi-indigo-4),1);color:rgba(var(--semi-indigo-5),1)}.semi-tag-indigo-solid{background-color:rgba(var(--semi-indigo-5),1);color:rgba(var(--semi-white),1)}.semi-tag-indigo-light{background-color:rgba(var(--semi-indigo-5),.15);color:rgba(var(--semi-indigo-8),1)}.semi-tag-light-blue-ghost{background-color:#0000;border:1px solid rgba(var(--semi-light-blue-4),1);color:rgba(var(--semi-light-blue-5),1)}.semi-tag-light-blue-solid{background-color:rgba(var(--semi-light-blue-5),1);color:rgba(var(--semi-white),1)}.semi-tag-light-blue-light{background-color:rgba(var(--semi-light-blue-5),.15);color:rgba(var(--semi-light-blue-8),1)}.semi-tag-light-green-ghost{background-color:#0000;border:1px solid rgba(var(--semi-light-green-4),1);color:rgba(var(--semi-light-green-5),1)}.semi-tag-light-green-solid{background-color:rgba(var(--semi-light-green-5),1);color:rgba(var(--semi-white),1)}.semi-tag-light-green-light{background-color:rgba(var(--semi-light-green-5),.15);color:rgba(var(--semi-light-green-8),1)}.semi-tag-lime-ghost{background-color:#0000;border:1px solid rgba(var(--semi-lime-4),1);color:rgba(var(--semi-lime-5),1)}.semi-tag-lime-solid{background-color:rgba(var(--semi-lime-5),1);color:rgba(var(--semi-white),1)}.semi-tag-lime-light{background-color:rgba(var(--semi-lime-5),.15);color:rgba(var(--semi-lime-8),1)}.semi-tag-orange-ghost{background-color:#0000;border:1px solid rgba(var(--semi-orange-4),1);color:rgba(var(--semi-orange-5),1)}.semi-tag-orange-solid{background-color:rgba(var(--semi-orange-5),1);color:rgba(var(--semi-white),1)}.semi-tag-orange-light{background-color:rgba(var(--semi-orange-5),.15);color:rgba(var(--semi-orange-8),1)}.semi-tag-pink-ghost{background-color:#0000;border:1px solid rgba(var(--semi-pink-4),1);color:rgba(var(--semi-pink-5),1)}.semi-tag-pink-solid{background-color:rgba(var(--semi-pink-5),1);color:rgba(var(--semi-white),1)}.semi-tag-pink-light{background-color:rgba(var(--semi-pink-5),.15);color:rgba(var(--semi-pink-8),1)}.semi-tag-purple-ghost{background-color:#0000;border:1px solid rgba(var(--semi-purple-4),1);color:rgba(var(--semi-purple-5),1)}.semi-tag-purple-solid{background-color:rgba(var(--semi-purple-5),1);color:rgba(var(--semi-white),1)}.semi-tag-purple-light{background-color:rgba(var(--semi-purple-5),.15);color:rgba(var(--semi-purple-8),1)}.semi-tag-red-ghost{background-color:#0000;border:1px solid rgba(var(--semi-red-4),1);color:rgba(var(--semi-red-5),1)}.semi-tag-red-solid{background-color:rgba(var(--semi-red-5),1);color:rgba(var(--semi-white),1)}.semi-tag-red-light{background-color:rgba(var(--semi-red-5),.15);color:rgba(var(--semi-red-8),1)}.semi-tag-teal-ghost{background-color:#0000;border:1px solid rgba(var(--semi-teal-4),1);color:rgba(var(--semi-teal-5),1)}.semi-tag-teal-solid{background-color:rgba(var(--semi-teal-5),1);color:rgba(var(--semi-white),1)}.semi-tag-teal-light{background-color:rgba(var(--semi-teal-5),.15);color:rgba(var(--semi-teal-8),1)}.semi-tag-violet-ghost{background-color:#0000;border:1px solid rgba(var(--semi-violet-4),1);color:rgba(var(--semi-violet-5),1)}.semi-tag-violet-solid{background-color:rgba(var(--semi-violet-5),1);color:rgba(var(--semi-white),1)}.semi-tag-violet-light{background-color:rgba(var(--semi-violet-5),.15);color:rgba(var(--semi-violet-8),1)}.semi-tag-yellow-ghost{background-color:#0000;border:1px solid rgba(var(--semi-yellow-4),1);color:rgba(var(--semi-yellow-5),1)}.semi-tag-yellow-solid{background-color:rgba(var(--semi-yellow-5),1);color:rgba(var(--semi-white),1)}.semi-tag-yellow-light{background-color:rgba(var(--semi-yellow-5),.15);color:rgba(var(--semi-yellow-8),1)}.semi-tag-white-ghost,.semi-tag-white-solid,.semi-tag-white-light{background-color:var(--semi-color-bg-4);border:1px solid rgba(var(--semi-grey-2),.7);color:var(--semi-color-text-0)}.semi-tag-white-ghost .semi-tag-close,.semi-tag-white-light .semi-tag-close,.semi-tag-white-solid .semi-tag-close{color:var(--semi-color-text-2)}.semi-tag-avatar-square,.semi-tag-avatar-circle{background-color:var(--semi-color-bg-4);border:1px solid var(--semi-color-border);color:var(--semi-color-text-0)}.semi-tag-split{display:inline-flex;align-items:center}.semi-tag-split .semi-tag{border-radius:0;margin-right:1px}.semi-tag-split .semi-tag-first{border-top-left-radius:var(--semi-border-radius-small);border-bottom-left-radius:var(--semi-border-radius-small)}.semi-tag-split .semi-tag-last{border-top-right-radius:var(--semi-border-radius-small);border-bottom-right-radius:var(--semi-border-radius-small);margin-right:unset}.semi-tag-split .semi-tag-circle.semi-tag-first{border-top-left-radius:var(--semi-border-radius-full);border-bottom-left-radius:var(--semi-border-radius-full)}.semi-tag-split .semi-tag-circle.semi-tag-last{border-top-right-radius:var(--semi-border-radius-full);border-bottom-right-radius:var(--semi-border-radius-full)}.semi-rtl .semi-tag,.semi-portal-rtl .semi-tag{direction:rtl}.semi-rtl .semi-tag-close,.semi-portal-rtl .semi-tag-close{padding-left:auto;padding-right:4px}.semi-rtl .semi-tag-closable,.semi-portal-rtl .semi-tag-closable{padding:4px 8px 4px 4px}.semi-rtl .semi-tag-avatar-square .semi-avatar,.semi-rtl .semi-tag-avatar-circle .semi-avatar,.semi-portal-rtl .semi-tag-avatar-square .semi-avatar,.semi-portal-rtl .semi-tag-avatar-circle .semi-avatar{margin-right:auto;margin-left:4px}.semi-rtl .semi-tag-avatar-square,.semi-portal-rtl .semi-tag-avatar-square{padding-right:auto;padding-left:4px}.semi-rtl .semi-tag-avatar-circle,.semi-portal-rtl .semi-tag-avatar-circle{padding:2px 2px 2px 4px}.semi-rtl .semi-tag-group,.semi-portal-rtl .semi-tag-group{direction:rtl}.semi-rtl .semi-tag-group .semi-tag,.semi-portal-rtl .semi-tag-group .semi-tag{margin-right:auto;margin-left:8px}.semi-rtl .semi-tag-rest-group-popover,.semi-portal-rtl .semi-tag-rest-group-popover{direction:rtl}.semi-rtl .semi-tag-rest-group-popover .semi-tag,.semi-portal-rtl .semi-tag-rest-group-popover .semi-tag{margin-right:0;margin-left:8px}.semi-rtl .semi-tag-rest-group-popover .semi-tag:last-of-type,.semi-portal-rtl .semi-tag-rest-group-popover .semi-tag:last-of-type{margin-right:auto;margin-left:0}.semi-tagInput{background-color:var(--semi-color-fill-0);border:1px rgba(0,0,0,0) solid;border-radius:var(--semi-border-radius-small);display:inline-flex;font-weight:400;width:100%;min-height:32px;box-sizing:border-box;transition:background-color var(--semi-transition_duration-none) var(--semi-transition_function-easeIn) var(--semi-transition_delay-none),border var(--semi-transition_duration-none) var(--semi-transition_function-easeIn) var(--semi-transition_delay-none)}.semi-tagInput-small{min-height:24px}.semi-tagInput-large{min-height:40px}.semi-tagInput-drag-item{display:flex;align-items:center}.semi-tagInput-drag-item-move{z-index:2000}.semi-tagInput-drag-handler{color:var(--semi-color-text-2);margin-right:4px;cursor:move}.semi-tagInput-sortable-item{position:relative;max-width:100%}.semi-tagInput-sortable-item-over{overflow:visible}.semi-tagInput-sortable-item-over:before{content:"";display:block;height:100%;width:2px;background-color:var(--semi-color-primary);position:absolute;left:-2px;top:0}.semi-tagInput-sortable-item-active{opacity:.5}.semi-tagInput-hover{background-color:var(--semi-color-fill-1);border:1px rgba(0,0,0,0) solid}.semi-tagInput-focus{background-color:var(--semi-color-fill-0);border:1px var(--semi-color-focus-border) solid}.semi-tagInput-warning{background-color:var(--semi-color-warning-light-default);border-color:var(--semi-color-warning-light-default)}.semi-tagInput-warning:hover{background-color:var(--semi-color-warning-light-hover);border-color:var(--semi-color-warning-light-hover)}.semi-tagInput-warning.semi-tagInput-focus{background-color:var(--semi-color-warning-light-default);border-color:var(--semi-color-warning)}.semi-tagInput-error{background-color:var(--semi-color-danger-light-default);border-color:var(--semi-color-danger-light-default)}.semi-tagInput-error:hover{background-color:var(--semi-color-danger-light-hover);border-color:var(--semi-color-danger-light-hover)}.semi-tagInput-error.semi-tagInput-focus{background-color:var(--semi-color-danger-light-default);border-color:var(--semi-color-danger)}.semi-tagInput-disabled{background-color:var(--semi-color-disabled-fill);cursor:not-allowed}.semi-tagInput-disabled .semi-tagInput-clearBtn,.semi-tagInput-disabled .semi-tagInput-prefix,.semi-tagInput-disabled .semi-tagInput-suffix{color:var(--semi-color-disabled-text)}.semi-tagInput-disabled .semi-tagInput-wrapper{cursor:not-allowed}.semi-tagInput-disabled .semi-tagInput-wrapper-tag{color:var(--semi-color-disabled-text);background-color:#0000}.semi-tagInput-disabled .semi-tagInput-wrapper-input{cursor:not-allowed}.semi-tagInput-disabled .semi-tagInput-wrapper-input::placeholder{color:var(--semi-color-disabled-text)}.semi-tagInput-wrapper{display:flex;flex-wrap:wrap;flex-grow:1;align-items:center;padding-left:4px;padding-right:4px;overflow:hidden;position:relative}.semi-tagInput-wrapper-tag{margin-right:4px;white-space:pre;max-width:100%}.semi-tagInput-wrapper-tag-size-small{margin-top:1px;margin-bottom:1px}.semi-tagInput-wrapper-tag-size-default{margin-top:2px;margin-bottom:2px}.semi-tagInput-wrapper-tag-size-large{margin-top:3px;margin-bottom:3px}.semi-tagInput-wrapper-tag-icon{padding-left:4px}.semi-tagInput-wrapper-typo{font-size:12px}.semi-tagInput-wrapper-typo-disabled{color:var(--semi-color-disabled-text)}.semi-tagInput-wrapper-n{cursor:pointer;font-size:12px;margin-right:4px;color:var(--semi-color-text-0);padding-left:8px;padding-right:8px}.semi-tagInput-wrapper-n-disabled{cursor:not-allowed;color:var(--semi-color-disabled-text)}.semi-tagInput-wrapper .semi-tagInput-wrapper-input{flex-grow:1;width:min-content;min-width:2px;max-width:100%;border:none;outline:none;background-color:#0000;font-size:14px}.semi-tagInput-wrapper .semi-tagInput-wrapper-input:hover{background-color:#0000}.semi-tagInput-wrapper .semi-tagInput-wrapper-input:not(:first-child)>input{padding-left:0}.semi-tagInput-wrapper .semi-tagInput-wrapper-input-small{height:20px;margin-top:1px;margin-bottom:1px;line-height:20px}.semi-tagInput-wrapper .semi-tagInput-wrapper-input-small .semi-input-small{height:20px;line-height:20px}.semi-tagInput-wrapper .semi-tagInput-wrapper-input-default{height:24px;margin-top:2px;margin-bottom:2px;line-height:24px}.semi-tagInput-wrapper .semi-tagInput-wrapper-input-default .semi-input-default{height:24px;line-height:24px}.semi-tagInput-wrapper .semi-tagInput-wrapper-input-large{height:24px;margin-top:3px;margin-bottom:3px;line-height:24px}.semi-tagInput-wrapper .semi-tagInput-wrapper-input-large .semi-input-large{height:24px;line-height:24px}.semi-tagInput-wrapper-inputMirror{position:absolute;top:0;left:0;visibility:hidden;pointer-events:none;height:0;overflow:hidden;white-space:pre;font-size:14px;font-weight:400;font-family:inherit}.semi-tagInput-clearBtn{display:flex;justify-content:center;align-items:center;width:32px;flex-shrink:0;color:var(--semi-color-text-2)}.semi-tagInput-clearBtn:hover{cursor:pointer;color:var(--semi-color-primary-hover)}.semi-tagInput-clearBtn-invisible{visibility:hidden}.semi-tagInput-inset-label{margin:0 12px;font-weight:600;font-size:14px;line-height:20px;font-family:Inter,-apple-system,BlinkMacSystemFont,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Segoe UI,Helvetica Neue,Helvetica,Arial,sans-serif;color:var(--semi-color-text-2);flex-shrink:0;white-space:nowrap}.semi-tagInput-prefix,.semi-tagInput-suffix{display:flex;justify-content:center;align-items:center}.semi-tagInput-prefix-text,.semi-tagInput-suffix-text{margin:0 12px;font-weight:600;white-space:nowrap;font-size:14px;line-height:20px;font-family:Inter,-apple-system,BlinkMacSystemFont,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Segoe UI,Helvetica Neue,Helvetica,Arial,sans-serif}.semi-tagInput-prefix-icon,.semi-tagInput-suffix-icon{color:var(--semi-color-text-2);margin:0 8px}.semi-tagInput-prefix-text,.semi-tagInput-suffix-text{color:var(--semi-color-text-2)}.semi-tagInput-with-prefix .semi-input{padding-left:0}.semi-tagInput-tag-content-wrapper{display:flex;align-items:center}.semi-tagInput-sortable-list{display:flex;flex-flow:row wrap;width:100%}.semi-rtl .semi-tagInput,.semi-portal-rtl .semi-tagInput{direction:rtl}.semi-rtl .semi-tagInput-wrapper-tag,.semi-portal-rtl .semi-tagInput-wrapper-tag{margin-left:4px;margin-right:0}.semi-rtl .semi-tagInput-wrapper-input:not(:first-child)>input,.semi-portal-rtl .semi-tagInput-wrapper-input:not(:first-child)>input{padding-right:0}.semi-timepicker{display:inline-block}.semi-timepicker-panel .semi-scrolllist-body{height:252px}.semi-timepicker-panel .semi-scrolllist-body .semi-scrolllist-item-wheel .semi-scrolllist-list-outer-nocycle>ul:before,.semi-timepicker-panel .semi-scrolllist-body .semi-scrolllist-item>ul:before{height:108px}.semi-timepicker-panel .semi-scrolllist-body .semi-scrolllist-item,.semi-timepicker-panel .semi-scrolllist-body .semi-scrolllist-item-wheel .semi-scrolllist-list-outer{-ms-overflow-style:none;scrollbar-width:none}.semi-timepicker-panel .semi-scrolllist-body .semi-scrolllist-item::-webkit-scrollbar,.semi-timepicker-panel .semi-scrolllist-body .semi-scrolllist-item-wheel .semi-scrolllist-list-outer::-webkit-scrollbar{display:none;width:0;height:0}.semi-timepicker-panel .semi-scrolllist-body .semi-scrolllist-item>ul,.semi-timepicker-panel .semi-scrolllist-body .semi-scrolllist-item-wheel .semi-scrolllist-list-outer>ul{padding-bottom:108px}.semi-timepicker-panel .semi-scrolllist-body .semi-scrolllist-item{-ms-overflow-style:none;scrollbar-width:none}.semi-timepicker-panel .semi-scrolllist-body .semi-scrolllist-item::-webkit-scrollbar{display:none;width:0;height:0}.semi-timepicker-panel .semi-scrolllist-item,.semi-timepicker-panel .semi-scrolllist-item-wheel{flex:none}.semi-timepicker-panel .semi-scrolllist-item-wheel,.semi-timepicker-panel .semi-scrolllist-item-wheel:not(:last-child){border:none}.semi-timepicker-panel-list-ampm{width:72px}.semi-timepicker-panel-list-hour,.semi-timepicker-panel-list-minute,.semi-timepicker-panel-list-second{width:64px}.semi-timepicker-range-panel .semi-timepicker-lists{display:flex;box-shadow:0 4px 14px #0000001a;border:1px solid rgba(0,0,0,.1);border-radius:var(--semi-border-radius-medium)}.semi-timepicker-range-panel .semi-timepicker-lists .semi-scrolllist:first-of-type{border-radius:var(--semi-border-radius-medium) 0 0 var(--semi-border-radius-medium)}.semi-timepicker-range-panel .semi-timepicker-lists .semi-scrolllist:last-of-type{border-radius:0 var(--semi-border-radius-medium) var(--semi-border-radius-medium) 0}.semi-timepicker-range-panel .semi-timepicker-lists>.semi-scrolllist:not(:last-child) .semi-scrolllist-body{border-right:2px solid var(--semi-color-border)}.semi-timepicker-range-panel .semi-timepicker-lists>.semi-scrolllist{box-shadow:none}.semi-timepicker-range-panel .semi-timepicker-lists>.semi-scrolllist .semi-scrolllist-body,.semi-timepicker-range-panel .semi-timepicker-lists>.semi-scrolllist .semi-scrolllist-header{padding:0}.semi-timepicker .semi-timepicker-input{font-size:14px;line-height:20px;font-family:Inter,-apple-system,BlinkMacSystemFont,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Segoe UI,Helvetica Neue,Helvetica,Arial,sans-serif;border-radius:var(--semi-border-radius-small);align-items:center}.semi-timepicker .semi-input-readonly{cursor:pointer}.semi-timepicker .semi-input-borderless:not(:focus-within):not(:hover) .semi-input-suffix{opacity:0}.semi-rtl .semi-timepicker,.semi-portal-rtl .semi-timepicker,.semi-rtl .semi-timepicker-panel,.semi-portal-rtl .semi-timepicker-panel,.semi-rtl .semi-timepicker-range,.semi-portal-rtl .semi-timepicker-range{direction:rtl}.semi-rtl .semi-timepicker-range-panel .semi-timepicker-lists>.semi-scrolllist:not(:last-child) .semi-scrolllist-body,.semi-portal-rtl .semi-timepicker-range-panel .semi-timepicker-lists>.semi-scrolllist:not(:last-child) .semi-scrolllist-body{border-right:0;border-left:2px solid var(--semi-color-border)}.semi-timeline{margin:0;padding:8px;width:100%;list-style:none}.semi-timeline-item{position:relative;margin:0;padding:0 0 24px;list-style:none}.semi-timeline-item-tail{position:absolute;top:20px;left:4px;height:calc(100% - 20px);border-left:1px solid var(--semi-color-text-3)}.semi-timeline-item-head{position:absolute;top:5px;width:9px;height:9px;border-radius:var(--semi-border-radius-circle)}.semi-timeline-item-head-ongoing{background-color:var(--semi-color-primary)}.semi-timeline-item-head-default{background-color:var(--semi-color-tertiary-light-active)}.semi-timeline-item-head-success{background-color:var(--semi-color-success)}.semi-timeline-item-head-warning{background-color:var(--semi-color-warning)}.semi-timeline-item-head-error{background-color:var(--semi-color-danger)}.semi-timeline-item-head-custom{position:absolute;display:flex;align-self:center;top:10px;left:5px;width:auto;height:auto;border:0;border-radius:0;transform:translate(-50%,-50%)}.semi-timeline-item .semi-timeline-item-head-custom.semi-timeline-item-head-ongoing{background-color:#0000;color:var(--semi-color-primary)}.semi-timeline-item .semi-timeline-item-head-custom.semi-timeline-item-head-success{background-color:#0000;color:var(--semi-color-success)}.semi-timeline-item .semi-timeline-item-head-custom.semi-timeline-item-head-warning{background-color:#0000;color:var(--semi-color-warning)}.semi-timeline-item .semi-timeline-item-head-custom.semi-timeline-item-head-error{background-color:#0000;color:var(--semi-color-danger)}.semi-timeline-item .semi-timeline-item-head-custom.semi-timeline-item-head-default{background-color:#0000;color:var(--semi-color-tertiary-light-active)}.semi-timeline-item-content{font-size:14px;line-height:20px;font-family:Inter,-apple-system,BlinkMacSystemFont,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Segoe UI,Helvetica Neue,Helvetica,Arial,sans-serif;position:relative;margin:0 0 0 25px;word-break:break-word;color:var(--semi-color-text-0)}.semi-timeline-item-content-extra,.semi-timeline-item-content-time{font-size:12px;line-height:16px;font-family:Inter,-apple-system,BlinkMacSystemFont,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Segoe UI,Helvetica Neue,Helvetica,Arial,sans-serif;color:var(--semi-color-text-2);margin-top:4px}.semi-timeline-item:last-child>.semi-timeline-item-tail{border-left:none}.semi-timeline-alternate .semi-timeline-item-tail,.semi-timeline-alternate .semi-timeline-item-head,.semi-timeline-alternate .semi-timeline-item-head-custom,.semi-timeline-right .semi-timeline-item-tail,.semi-timeline-right .semi-timeline-item-head,.semi-timeline-right .semi-timeline-item-head-custom,.semi-timeline-center .semi-timeline-item-tail,.semi-timeline-center .semi-timeline-item-head,.semi-timeline-center .semi-timeline-item-head-custom{left:50%}.semi-timeline-alternate .semi-timeline-item-head.semi-timeline-item-head-custom,.semi-timeline-right .semi-timeline-item-head.semi-timeline-item-head-custom,.semi-timeline-center .semi-timeline-item-head.semi-timeline-item-head-custom{margin-left:0}.semi-timeline-alternate .semi-timeline-item-head,.semi-timeline-right .semi-timeline-item-head,.semi-timeline-center .semi-timeline-item-head{margin-left:-4px}.semi-timeline-alternate .semi-timeline-item-left .semi-timeline-item-content,.semi-timeline-right .semi-timeline-item-left .semi-timeline-item-content,.semi-timeline-center .semi-timeline-item-left .semi-timeline-item-content{left:calc(50% - 4px);width:calc(50% - 14px);text-align:left}.semi-timeline-alternate .semi-timeline-item-right .semi-timeline-item-content,.semi-timeline-right .semi-timeline-item-right .semi-timeline-item-content,.semi-timeline-center .semi-timeline-item-right .semi-timeline-item-content{width:calc(50% - 20px);margin:0;text-align:right}.semi-timeline-center .semi-timeline-item-content-time{position:absolute;top:-2px;margin-left:calc(-40px - 100%);width:100%;text-align:right}.semi-timeline-right .semi-timeline-item-right .semi-timeline-item-tail,.semi-timeline-right .semi-timeline-item-right .semi-timeline-item-head,.semi-timeline-right .semi-timeline-item-right .semi-timeline-item-head-custom{left:calc(100% - 9px)}.semi-timeline-right .semi-timeline-item-right .semi-timeline-item-content{width:calc(100% - 28px)}.semi-rtl .semi-timeline,.semi-portal-rtl .semi-timeline{direction:rtl}.semi-rtl .semi-timeline-item-tail,.semi-portal-rtl .semi-timeline-item-tail{left:auto;right:4px;border-left:0;border-right:1px solid var(--semi-color-text-3)}.semi-rtl .semi-timeline-item-head-custom,.semi-portal-rtl .semi-timeline-item-head-custom{left:auto;right:5px;transform:translate(50%,-50%)}.semi-rtl .semi-timeline-item-content,.semi-portal-rtl .semi-timeline-item-content{margin:0 25px 0 0}.semi-rtl .semi-timeline-item:last-child .semi-timeline-item-tail,.semi-portal-rtl .semi-timeline-item:last-child .semi-timeline-item-tail{border-right:none}.semi-rtl .semi-timeline-alternate .semi-timeline-item-tail,.semi-rtl .semi-timeline-alternate .semi-timeline-item-head,.semi-rtl .semi-timeline-alternate .semi-timeline-item-head-custom,.semi-rtl .semi-timeline-right .semi-timeline-item-tail,.semi-rtl .semi-timeline-right .semi-timeline-item-head,.semi-rtl .semi-timeline-right .semi-timeline-item-head-custom,.semi-rtl .semi-timeline-center .semi-timeline-item-tail,.semi-rtl .semi-timeline-center .semi-timeline-item-head,.semi-rtl .semi-timeline-center .semi-timeline-item-head-custom,.semi-portal-rtl .semi-timeline-alternate .semi-timeline-item-tail,.semi-portal-rtl .semi-timeline-alternate .semi-timeline-item-head,.semi-portal-rtl .semi-timeline-alternate .semi-timeline-item-head-custom,.semi-portal-rtl .semi-timeline-right .semi-timeline-item-tail,.semi-portal-rtl .semi-timeline-right .semi-timeline-item-head,.semi-portal-rtl .semi-timeline-right .semi-timeline-item-head-custom,.semi-portal-rtl .semi-timeline-center .semi-timeline-item-tail,.semi-portal-rtl .semi-timeline-center .semi-timeline-item-head,.semi-portal-rtl .semi-timeline-center .semi-timeline-item-head-custom{left:auto;right:50%}.semi-rtl .semi-timeline-alternate .semi-timeline-item-head,.semi-rtl .semi-timeline-right .semi-timeline-item-head,.semi-rtl .semi-timeline-center .semi-timeline-item-head,.semi-portal-rtl .semi-timeline-alternate .semi-timeline-item-head,.semi-portal-rtl .semi-timeline-right .semi-timeline-item-head,.semi-portal-rtl .semi-timeline-center .semi-timeline-item-head{margin-left:0;margin-right:-4px}.semi-rtl .semi-timeline-alternate .semi-timeline-item-left .semi-timeline-item-content,.semi-rtl .semi-timeline-right .semi-timeline-item-left .semi-timeline-item-content,.semi-rtl .semi-timeline-center .semi-timeline-item-left .semi-timeline-item-content,.semi-portal-rtl .semi-timeline-alternate .semi-timeline-item-left .semi-timeline-item-content,.semi-portal-rtl .semi-timeline-right .semi-timeline-item-left .semi-timeline-item-content,.semi-portal-rtl .semi-timeline-center .semi-timeline-item-left .semi-timeline-item-content{left:auto;right:calc(50% - 4px);text-align:right}.semi-rtl .semi-timeline-alternate .semi-timeline-item-right .semi-timeline-item-content,.semi-rtl .semi-timeline-right .semi-timeline-item-right .semi-timeline-item-content,.semi-rtl .semi-timeline-center .semi-timeline-item-right .semi-timeline-item-content,.semi-portal-rtl .semi-timeline-alternate .semi-timeline-item-right .semi-timeline-item-content,.semi-portal-rtl .semi-timeline-right .semi-timeline-item-right .semi-timeline-item-content,.semi-portal-rtl .semi-timeline-center .semi-timeline-item-right .semi-timeline-item-content{text-align:left}.semi-rtl .semi-timeline-center .semi-timeline-item-content-time,.semi-portal-rtl .semi-timeline-center .semi-timeline-item-content-time{margin-left:0;margin-right:calc(-40px - 100%);text-align:left}.semi-rtl .semi-timeline-right .semi-timeline-item-right .semi-timeline-item-tail,.semi-rtl .semi-timeline-right .semi-timeline-item-right .semi-timeline-item-head,.semi-rtl .semi-timeline-right .semi-timeline-item-right .semi-timeline-item-head-custom,.semi-portal-rtl .semi-timeline-right .semi-timeline-item-right .semi-timeline-item-tail,.semi-portal-rtl .semi-timeline-right .semi-timeline-item-right .semi-timeline-item-head,.semi-portal-rtl .semi-timeline-right .semi-timeline-item-right .semi-timeline-item-head-custom{left:0;right:calc(100% - 9px)}.semi-toast{pointer-events:none}.semi-toast-wrapper{position:fixed;height:0;top:0;width:100%;display:flex;justify-content:center;z-index:1010}.semi-toast-wrapper .semi-toast-innerWrapper{width:fit-content;height:fit-content;text-align:center}.semi-toast-wrapper .semi-toast-innerWrapper-hover .semi-toast-zero-height-wrapper{perspective:unset;perspective-origin:center center}.semi-toast-zero-height-wrapper{transition:all .3s cubic-bezier(.22,.57,.02,1.2);perspective-origin:center 280px;perspective:280px;height:0;overflow:visible}.semi-toast-content{pointer-events:all;box-shadow:var(--semi-shadow-elevated);font-size:14px;line-height:20px;font-family:Inter,-apple-system,BlinkMacSystemFont,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Segoe UI,Helvetica Neue,Helvetica,Arial,sans-serif;background-color:var(--semi-color-bg-3);border-radius:var(--semi-border-radius-medium);padding:12px 8px;display:inline-flex;align-items:flex-start;justify-content:center;margin:12px;font-weight:600;color:var(--semi-color-text-0)}.semi-toast-content .semi-toast-close-button{margin-top:-2px;height:20px}.semi-toast-content .semi-toast-content-text{margin-left:12px;margin-right:12px;text-align:left;word-wrap:break-word;overflow-wrap:break-word}.semi-toast-light.semi-toast-warning .semi-toast-content{background-color:var(--semi-color-warning-light-default);border:1px solid var(--semi-color-warning)}.semi-toast-light.semi-toast-warning .semi-toast-icon-warning{color:var(--semi-color-warning)}.semi-toast-light.semi-toast-success .semi-toast-content{background-color:var(--semi-color-success-light-default);border:1px solid var(--semi-color-success)}.semi-toast-light.semi-toast-success .semi-toast-icon-success{color:var(--semi-color-success)}.semi-toast-light.semi-toast-info .semi-toast-content{background-color:var(--semi-color-info-light-default);border:1px solid var(--semi-color-info)}.semi-toast-light.semi-toast-info .semi-toast-icon-info{color:var(--semi-color-info)}.semi-toast-light.semi-toast-error .semi-toast-content{background-color:var(--semi-color-danger-light-default);border:1px solid var(--semi-color-danger)}.semi-toast-light.semi-toast-error .semi-toast-icon-error{color:var(--semi-color-danger)}.semi-toast .semi-toast-icon-warning{color:var(--semi-color-warning)}.semi-toast .semi-toast-icon-success{color:var(--semi-color-success)}.semi-toast .semi-toast-icon-info{color:var(--semi-color-info)}.semi-toast .semi-toast-icon-error{color:var(--semi-color-danger)}.semi-toast-animation-show{animation:.3s semi-toast-keyframe-toast-show cubic-bezier(.22,.57,.02,1.2) 0s;animation-fill-mode:forwards}.semi-toast-animation-hide{animation:.3s semi-toast-keyframe-toast-hide cubic-bezier(.22,.57,.02,1.2) 0s;animation-fill-mode:forwards}@keyframes semi-toast-keyframe-toast-show{0%{opacity:0;transform:translateY(-100%)}to{opacity:1}}@keyframes semi-toast-keyframe-toast-hide{0%{opacity:1}to{opacity:0;transform:translateY(-100%)}}.semi-toast-rtl{direction:rtl}.semi-toast-rtl .semi-toast-content .semi-toast-content-text{text-align:right;margin-left:12px;margin-right:12px}.semi-transfer{background-color:var(--semi-color-bg-1);border:1px solid var(--semi-color-border);border-radius:var(--semi-border-radius-medium);min-width:402px;height:400px;box-sizing:border-box;display:flex}.semi-transfer-disabled .semi-transfer-header,.semi-transfer-disabled .semi-transfer-item{color:var(--semi-color-disabled-text);cursor:not-allowed}.semi-transfer-disabled .semi-transfer-item:hover{background-color:inherit}.semi-transfer-disabled .semi-transfer-item:hover .semi-transfer-item-close-icon{visibility:hidden}.semi-transfer-disabled .semi-transfer-item:active{background-color:inherit}.semi-transfer-custom-panel{border:none;min-width:inherit;height:inherit}.semi-transfer-header{font-size:12px;line-height:16px;font-family:Inter,-apple-system,BlinkMacSystemFont,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Segoe UI,Helvetica Neue,Helvetica,Arial,sans-serif;display:flex;align-items:center;height:24px;margin:12px 12px 8px;color:var(--semi-color-text-2);flex-shrink:0}.semi-transfer-header-all{font-weight:600;margin-left:16px}.semi-transfer-header .semi-button{font-size:12px;line-height:16px;font-family:Inter,-apple-system,BlinkMacSystemFont,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Segoe UI,Helvetica Neue,Helvetica,Arial,sans-serif}.semi-transfer-item{min-height:36px;box-sizing:border-box;padding:8px 9px 8px 12px;-webkit-user-select:none;user-select:none;font-size:14px;line-height:20px;font-family:Inter,-apple-system,BlinkMacSystemFont,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Segoe UI,Helvetica Neue,Helvetica,Arial,sans-serif;display:flex;align-items:center;justify-content:space-between;flex-wrap:nowrap;color:var(--semi-color-text-1);cursor:pointer;transition:background-color var(--semi-transition_duration-none) var(--semi-transition_function-easeIn) var(--semi-transition_delay-none)}.semi-transfer-item:hover{background-color:var(--semi-color-fill-0)}.semi-transfer-item:active{background-color:var(--semi-color-fill-1)}.semi-transfer-item-disabled{cursor:not-allowed}.semi-transfer-item-disabled:hover{background-color:inherit}.semi-transfer-item .semi-transfer-item-close-icon{font-size:12px;cursor:pointer;visibility:hidden;color:var(--semi-color-text-2)}.semi-transfer-left{width:50%;border-right:1px solid var(--semi-color-border);display:flex;flex-direction:column}.semi-transfer-left-list{overflow:auto;flex-grow:1}.semi-transfer-left-pagination{padding:12px;flex-shrink:0;display:flex;justify-content:center}.semi-transfer-left-empty{height:36px}.semi-transfer-left>.semi-spin{width:100%;flex-grow:1}.semi-transfer-right{width:50%;display:flex;flex-direction:column;position:relative}.semi-transfer-right-header{margin-top:12px;margin-bottom:0;height:32px;flex-shrink:0}.semi-transfer-right-list{overflow:auto;flex-grow:1}.semi-transfer-right-item{color:var(--semi-color-text-0);cursor:auto}.semi-transfer-right-item:hover .semi-transfer-item-close-icon{flex-shrink:0;visibility:visible;cursor:pointer}.semi-transfer-right-item:hover .semi-transfer-item-close-icon.semi-transfer-item-close-icon-disabled{visibility:hidden}.semi-transfer-right-item-text{flex:1;word-break:break-all}.semi-transfer-right-item-drag-handler{margin-right:4px;flex-shrink:0;cursor:move}.semi-transfer-right-item-drag-item-move{z-index:2000}.semi-transfer-right-item-sortable-item-active{opacity:0}.semi-transfer-right-empty{position:absolute;height:100%}.semi-transfer-empty{width:100%;display:flex;justify-content:center;align-items:center;font-size:12px;line-height:16px;font-family:Inter,-apple-system,BlinkMacSystemFont,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Segoe UI,Helvetica Neue,Helvetica,Arial,sans-serif;color:var(--semi-color-text-2)}.semi-transfer-filter{margin:12px 12px 0}.semi-transfer-group-title{color:var(--semi-color-text-2);padding-left:12px;font-size:12px;line-height:16px;font-family:Inter,-apple-system,BlinkMacSystemFont,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Segoe UI,Helvetica Neue,Helvetica,Arial,sans-serif;height:28px;display:flex;align-items:center}.semi-rtl .semi-transfer,.semi-portal-rtl .semi-transfer{direction:rtl}.semi-rtl .semi-transfer-header-all,.semi-portal-rtl .semi-transfer-header-all{margin-left:0;margin-right:16px}.semi-rtl .semi-transfer-item,.semi-portal-rtl .semi-transfer-item{padding-left:9px;padding-right:12px}.semi-rtl .semi-transfer-left,.semi-portal-rtl .semi-transfer-left{border-right:0;border-left:1px solid var(--semi-color-border)}.semi-rtl .semi-transfer-group-title,.semi-portal-rtl .semi-transfer-group-title{padding-left:0;padding-right:12px}.semi-tree-search-wrapper{padding:8px 12px}.semi-tree-wrapper{display:flex;flex-direction:column}.semi-tree-option-list{overflow-x:hidden;overflow-y:auto;box-sizing:border-box;flex:1;padding:8px 0}.semi-tree-option-list ul,.semi-tree-option-list li{list-style-type:none;padding:0;margin:0}.semi-tree-option-list li.semi-tree-option{box-sizing:border-box;padding-top:4px;padding-bottom:4px;padding-left:8px}.semi-tree-option-list li>.semi-tree-option-label{list-style-type:none;padding:0}.semi-tree-option-list .semi-tree-option-expand-icon,.semi-tree-option-list .semi-tree-option-empty-icon{box-sizing:border-box;width:12px;color:var(--semi-color-text-2);margin-right:8px;display:flex;flex-shrink:0}.semi-tree-option-list .semi-tree-option{display:flex;align-items:center;cursor:pointer;transition:background-color var(--semi-transition_duration-none) var(--semi-transition_function-easeIn) var(--semi-transition_delay-none);transform:scale(var(--semi-transform_scale-none));font-size:14px;line-height:20px;font-family:Inter,-apple-system,BlinkMacSystemFont,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Segoe UI,Helvetica Neue,Helvetica,Arial,sans-serif;word-break:break-word;color:var(--semi-color-text-0);position:relative}.semi-tree-option-list .semi-tree-option-label{display:flex;align-items:center}.semi-tree-option-list .semi-tree-option-label>.semi-icon{margin-right:8px}.semi-tree-option-list .semi-tree-option-label .semi-checkbox{margin-right:8px}.semi-tree-option-list .semi-tree-option-label-text{display:block;flex:1}.semi-tree-option-list .semi-tree-option-ellipsis .semi-tree-option-label-text{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.semi-tree-option-list .semi-tree-option-label-text,.semi-tree-option-list .semi-tree-option .semi-checkbox-addon{border-radius:var(--semi-border-radius-small)}.semi-tree-option-list .semi-tree-option-label-text:hover,.semi-tree-option-list .semi-tree-option .semi-checkbox-addon:hover{background-color:var(--semi-color-fill-0)}.semi-tree-option-list .semi-tree-option-label-text:active,.semi-tree-option-list .semi-tree-option .semi-checkbox-addon:active{background-color:var(--semi-color-fill-1)}.semi-tree-option-list .semi-tree-option-item-icon{color:var(--semi-color-text-2)}.semi-tree-option-list .semi-tree-option-active .semi-tree-option-label-text{background-color:var(--semi-color-primary-light-default)}.semi-tree-option-list .semi-tree-option-active:hover,.semi-tree-option-list .semi-tree-option-active:active{background-color:#0000}.semi-tree-option-list .semi-tree-option-selected .semi-tree-option-label,.semi-tree-option-list .semi-tree-option-selected .semi-tree-option-label:hover,.semi-tree-option-list .semi-tree-option-selected .semi-tree-option-label:active{background-color:var(--semi-color-primary-light-default)}.semi-tree-option-list .semi-tree-option-collapsed .semi-tree-option-expand-icon{transform:rotate(270deg)}.semi-tree-option-list .semi-tree-option-highlight{font-weight:600;color:var(--semi-color-primary);background-color:inherit}.semi-tree-option-list .semi-tree-option-hidden{display:none}.semi-tree-option-list .semi-tree-option-disabled .semi-tree-option-label{color:var(--semi-color-disabled-text)}.semi-tree-option-list .semi-tree-option-fullLabel-draggable,.semi-tree-option-list .semi-tree-option-draggable{-moz-user-select:none;-khtml-user-select:none;-webkit-user-select:none;user-select:none;-khtml-user-drag:element;-webkit-user-drag:element}.semi-tree-option-list .semi-tree-option-draggable{box-sizing:border-box;border-left:2px solid rgba(0,0,0,0)}.semi-tree-option-list .semi-tree-option-draggable .semi-tree-option-label{border-top:2px rgba(0,0,0,0) solid;border-bottom:2px rgba(0,0,0,0) solid}.semi-tree-option-list .semi-tree-option-draggable .semi-tree-option-drag-over-gap-top{border-top:2px var(--semi-color-primary) solid}.semi-tree-option-list .semi-tree-option-draggable .semi-tree-option-drag-over-gap-bottom{border-bottom:2px var(--semi-color-primary) solid}.semi-tree-option-list .semi-tree-option-draggable .semi-tree-option-indent .semi-tree-option-indent-unit:before{top:0;bottom:0}.semi-tree-option-list .semi-tree-option-draggable .semi-tree-option-switcher-leaf-line:before{top:0;bottom:0}.semi-tree-option-list .semi-tree-option-draggable.semi-tree-option-tree-node-last-leaf .semi-tree-option-switcher-leaf-line:before{height:50%}.semi-tree-option-list .semi-tree-option-fullLabel-draggable.semi-tree-option-fullLabel-drag-over-gap-top{border-top:2px var(--semi-color-primary) solid}.semi-tree-option-list .semi-tree-option-fullLabel-draggable.semi-tree-option-fullLabel-drag-over-gap-bottom{border-bottom:2px var(--semi-color-primary) solid}.semi-tree-option-list .semi-tree-option-drag-over.semi-tree-option-draggable,.semi-tree-option-list .semi-tree-option-drag-over.semi-tree-option-fullLabel-draggable{border:2px solid var(--semi-color-primary)}.semi-tree-option-list .semi-tree-option-drag-over.semi-tree-option-draggable .semi-tree-option-label,.semi-tree-option-list .semi-tree-option-drag-over.semi-tree-option-fullLabel-draggable .semi-tree-option-label{border-top:0;border-bottom:0}.semi-tree-option-list .semi-tree-option-drag-over.semi-tree-option-draggable+.semi-tree-option-selected:after,.semi-tree-option-list .semi-tree-option-drag-over.semi-tree-option-fullLabel-draggable+.semi-tree-option-selected:after{content:"";position:absolute;top:0;left:-2px;bottom:0;right:-1px;border-top:2px solid var(--semi-color-primary)}.semi-tree-option-list .semi-tree-option-indent{align-self:stretch;white-space:nowrap;-webkit-user-select:none;user-select:none}.semi-tree-option-list .semi-tree-option-indent-unit{display:inline-block;width:20px}.semi-tree-option-list .semi-tree-option-indent-show-line .semi-tree-option-indent-unit{position:relative;height:100%}.semi-tree-option-list .semi-tree-option-indent-show-line .semi-tree-option-indent-unit:before{position:absolute;top:-4px;inset-inline-start:6px;bottom:-4px;border-inline-end:1px solid var(--semi-color-text-3);content:""}.semi-tree-option-list .semi-tree-option-indent-show-line .semi-tree-option-indent-unit-end:before{display:none}.semi-tree-option-list .semi-tree-option-switcher{position:relative;flex:none;align-self:stretch;width:12px;margin:0 8px 0 0;text-align:center;cursor:pointer;-webkit-user-select:none;user-select:none}.semi-tree-option-list .semi-tree-option-switcher-leaf-line{z-index:1;position:relative;display:inline-block;width:100%;height:100%}.semi-tree-option-list .semi-tree-option-switcher-leaf-line:before{position:absolute;top:-4px;inset-inline-start:6px;bottom:-4px;border-inline-end:1px solid var(--semi-color-text-3);content:""}.semi-tree-option-list .semi-tree-option-switcher-leaf-line:after{box-sizing:border-box;position:absolute;width:8px;height:50%;border-bottom:1px solid var(--semi-color-text-3);content:"";margin-inline-start:1px}.semi-tree-option-list .semi-tree-option-tree-node-last-leaf .semi-tree-option-switcher-leaf-line:before{height:calc(50% + 4px)}.semi-tree-option-list li.semi-tree-option-draggable.semi-tree-option{padding-top:0;padding-bottom:0}.semi-tree-option-list li.semi-tree-option-draggable.semi-tree-option .semi-tree-option-label{padding:2px 0}.semi-tree-option-list li.semi-tree-option-draggable.semi-tree-option .semi-tree-option-selected,.semi-tree-option-list li.semi-tree-option-draggable.semi-tree-option .semi-tree-option-selected:hover,.semi-tree-option-list li.semi-tree-option-draggable.semi-tree-option .semi-tree-option-selected:active{background-color:#0000}.semi-tree-option-list .semi-tree-option.semi-tree-option-fullLabel-level-1{padding-left:8px}.semi-tree-option-list .semi-tree-option.semi-tree-option-fullLabel-level-2{padding-left:28px}.semi-tree-option-list .semi-tree-option.semi-tree-option-fullLabel-level-3{padding-left:48px}.semi-tree-option-list .semi-tree-option.semi-tree-option-fullLabel-level-4{padding-left:68px}.semi-tree-option-list .semi-tree-option.semi-tree-option-fullLabel-level-5{padding-left:88px}.semi-tree-option-list .semi-tree-option.semi-tree-option-fullLabel-level-6{padding-left:108px}.semi-tree-option-list .semi-tree-option.semi-tree-option-fullLabel-level-7{padding-left:128px}.semi-tree-option-list .semi-tree-option.semi-tree-option-fullLabel-level-8{padding-left:148px}.semi-tree-option-list .semi-tree-option.semi-tree-option-fullLabel-level-9{padding-left:168px}.semi-tree-option-list .semi-tree-option.semi-tree-option-fullLabel-level-10{padding-left:188px}.semi-tree-option-list .semi-tree-option.semi-tree-option-fullLabel-level-11{padding-left:208px}.semi-tree-option-list .semi-tree-option.semi-tree-option-fullLabel-level-12{padding-left:228px}.semi-tree-option-list .semi-tree-option.semi-tree-option-fullLabel-level-13{padding-left:248px}.semi-tree-option-list .semi-tree-option.semi-tree-option-fullLabel-level-14{padding-left:268px}.semi-tree-option-list .semi-tree-option.semi-tree-option-fullLabel-level-15{padding-left:288px}.semi-tree-option-list .semi-tree-option.semi-tree-option-fullLabel-level-16{padding-left:308px}.semi-tree-option-list .semi-tree-option.semi-tree-option-fullLabel-level-17{padding-left:328px}.semi-tree-option-list .semi-tree-option.semi-tree-option-fullLabel-level-18{padding-left:348px}.semi-tree-option-list .semi-tree-option.semi-tree-option-fullLabel-level-19{padding-left:368px}.semi-tree-option-list .semi-tree-option.semi-tree-option-fullLabel-level-20{padding-left:388px}.semi-tree-option-list .semi-tree-option-empty:hover,.semi-tree-option-list .semi-tree-option-empty:active{background-color:#0000}.semi-tree-option-list .semi-tree-option-label-empty{padding-left:0;justify-content:center;color:var(--semi-color-disabled-text);-webkit-user-select:none;user-select:none;cursor:not-allowed}.semi-tree-option-list .semi-checkboxGroup-vertical{row-gap:0}.semi-tree-option-list-block .semi-tree-option:hover{background-color:var(--semi-color-fill-0)}.semi-tree-option-list-block .semi-tree-option:active{background-color:var(--semi-color-fill-1)}.semi-tree-option-list-block .semi-tree-option-label{flex:1}.semi-tree-option-list-block .semi-tree-option-active,.semi-tree-option-list-block .semi-tree-option-active:hover,.semi-tree-option-list-block .semi-tree-option-active:active{background-color:var(--semi-color-primary-light-default)}.semi-tree-option-list-block .semi-tree-option-active .semi-tree-option-label-text{background-color:#0000}.semi-tree-option-list-block .semi-tree-option-expand-icon{flex-shrink:0;box-sizing:content-box}.semi-tree-option-list-block .semi-tree-option-expand-icon:hover{color:var(--semi-color-text-0)}.semi-tree-option-list-block .semi-tree-option-expand-icon:active{color:var(--semi-color-black)}.semi-tree-option-list-block .semi-tree-option-spin-icon{display:flex;line-height:0;color:var(--semi-color-primary)}.semi-tree-option-list-block .semi-tree-option-spin-icon svg{width:12px;height:12px}.semi-tree-option-list-block .semi-tree-option-selected{background-color:var(--semi-color-primary-light-default)}.semi-tree-option-list-block .semi-tree-option-selected .semi-tree-option-label,.semi-tree-option-list-block .semi-tree-option-selected .semi-tree-option-label:hover,.semi-tree-option-list-block .semi-tree-option-selected .semi-tree-option-label:active,.semi-tree-option-list-block .semi-tree-option-selected .semi-checkbox-addon{background-color:#0000}.semi-tree-option-list-block .semi-tree-option-selected:hover,.semi-tree-option-list-block .semi-tree-option-selected:active{background-color:var(--semi-color-primary-light-default)}.semi-tree-option-list-block .semi-tree-option-label-text,.semi-tree-option-list-block .semi-tree-option .semi-checkbox-addon{padding:0;border-radius:var(--semi-border-radius-small)}.semi-tree-option-list-block .semi-tree-option-label-text:hover,.semi-tree-option-list-block .semi-tree-option .semi-checkbox-addon:hover,.semi-tree-option-list-block .semi-tree-option-label-text:active,.semi-tree-option-list-block .semi-tree-option .semi-checkbox-addon:active{background-color:#0000}.semi-tree-option-list-block .semi-tree-option-label-text{width:0}.semi-tree-option-list-block .semi-tree-option-empty:hover,.semi-tree-option-list-block .semi-tree-option-empty:active{background-color:#0000}.semi-rtl .semi-tree,.semi-popover-rtl .semi-tree,.semi-rtl .semi-tree-wrapper,.semi-popover-rtl .semi-tree-wrapper,.semi-rtl .semi-tree-option-list,.semi-popover-rtl .semi-tree-option-list{direction:rtl}.semi-rtl .semi-tree-option-list .semi-tree-option-expand-icon,.semi-rtl .semi-tree-option-list .semi-tree-option-empty-icon,.semi-popover-rtl .semi-tree-option-list .semi-tree-option-expand-icon,.semi-popover-rtl .semi-tree-option-list .semi-tree-option-empty-icon{margin-right:0;margin-left:8px}.semi-rtl .semi-tree-option-list .semi-tree-option,.semi-popover-rtl .semi-tree-option-list .semi-tree-option{padding-left:0;padding-right:8px}.semi-rtl .semi-tree-option-list .semi-tree-option-label>.semi-icon,.semi-popover-rtl .semi-tree-option-list .semi-tree-option-label>.semi-icon{margin-right:0;margin-left:8px}.semi-rtl .semi-tree-option-list .semi-tree-option-label .semi-checkbox,.semi-popover-rtl .semi-tree-option-list .semi-tree-option-label .semi-checkbox{margin-right:0;margin-left:8px}.semi-rtl .semi-tree-option-list .semi-tree-option-collapsed .semi-tree-option-expand-icon,.semi-popover-rtl .semi-tree-option-list .semi-tree-option-collapsed .semi-tree-option-expand-icon{transform:rotate(90deg)}.semi-rtl .semi-tree-option-list li.semi-tree-option.semi-tree-option-fullLabel-level-1,.semi-popover-rtl .semi-tree-option-list li.semi-tree-option.semi-tree-option-fullLabel-level-1{padding-left:0;padding-right:8px}.semi-rtl .semi-tree-option-list li.semi-tree-option.semi-tree-option-fullLabel-level-2,.semi-popover-rtl .semi-tree-option-list li.semi-tree-option.semi-tree-option-fullLabel-level-2{padding-left:0;padding-right:28px}.semi-rtl .semi-tree-option-list li.semi-tree-option.semi-tree-option-fullLabel-level-3,.semi-popover-rtl .semi-tree-option-list li.semi-tree-option.semi-tree-option-fullLabel-level-3{padding-left:0;padding-right:48px}.semi-rtl .semi-tree-option-list li.semi-tree-option.semi-tree-option-fullLabel-level-4,.semi-popover-rtl .semi-tree-option-list li.semi-tree-option.semi-tree-option-fullLabel-level-4{padding-left:0;padding-right:68px}.semi-rtl .semi-tree-option-list li.semi-tree-option.semi-tree-option-fullLabel-level-5,.semi-popover-rtl .semi-tree-option-list li.semi-tree-option.semi-tree-option-fullLabel-level-5{padding-left:0;padding-right:88px}.semi-rtl .semi-tree-option-list li.semi-tree-option.semi-tree-option-fullLabel-level-6,.semi-popover-rtl .semi-tree-option-list li.semi-tree-option.semi-tree-option-fullLabel-level-6{padding-left:0;padding-right:108px}.semi-rtl .semi-tree-option-list li.semi-tree-option.semi-tree-option-fullLabel-level-7,.semi-popover-rtl .semi-tree-option-list li.semi-tree-option.semi-tree-option-fullLabel-level-7{padding-left:0;padding-right:128px}.semi-rtl .semi-tree-option-list li.semi-tree-option.semi-tree-option-fullLabel-level-8,.semi-popover-rtl .semi-tree-option-list li.semi-tree-option.semi-tree-option-fullLabel-level-8{padding-left:0;padding-right:148px}.semi-rtl .semi-tree-option-list li.semi-tree-option.semi-tree-option-fullLabel-level-9,.semi-popover-rtl .semi-tree-option-list li.semi-tree-option.semi-tree-option-fullLabel-level-9{padding-left:0;padding-right:168px}.semi-rtl .semi-tree-option-list li.semi-tree-option.semi-tree-option-fullLabel-level-10,.semi-popover-rtl .semi-tree-option-list li.semi-tree-option.semi-tree-option-fullLabel-level-10{padding-left:0;padding-right:188px}.semi-rtl .semi-tree-option-list li.semi-tree-option.semi-tree-option-fullLabel-level-11,.semi-popover-rtl .semi-tree-option-list li.semi-tree-option.semi-tree-option-fullLabel-level-11{padding-left:0;padding-right:208px}.semi-rtl .semi-tree-option-list li.semi-tree-option.semi-tree-option-fullLabel-level-12,.semi-popover-rtl .semi-tree-option-list li.semi-tree-option.semi-tree-option-fullLabel-level-12{padding-left:0;padding-right:228px}.semi-rtl .semi-tree-option-list li.semi-tree-option.semi-tree-option-fullLabel-level-13,.semi-popover-rtl .semi-tree-option-list li.semi-tree-option.semi-tree-option-fullLabel-level-13{padding-left:0;padding-right:248px}.semi-rtl .semi-tree-option-list li.semi-tree-option.semi-tree-option-fullLabel-level-14,.semi-popover-rtl .semi-tree-option-list li.semi-tree-option.semi-tree-option-fullLabel-level-14{padding-left:0;padding-right:268px}.semi-rtl .semi-tree-option-list li.semi-tree-option.semi-tree-option-fullLabel-level-15,.semi-popover-rtl .semi-tree-option-list li.semi-tree-option.semi-tree-option-fullLabel-level-15{padding-left:0;padding-right:288px}.semi-rtl .semi-tree-option-list li.semi-tree-option.semi-tree-option-fullLabel-level-16,.semi-popover-rtl .semi-tree-option-list li.semi-tree-option.semi-tree-option-fullLabel-level-16{padding-left:0;padding-right:308px}.semi-rtl .semi-tree-option-list li.semi-tree-option.semi-tree-option-fullLabel-level-17,.semi-popover-rtl .semi-tree-option-list li.semi-tree-option.semi-tree-option-fullLabel-level-17{padding-left:0;padding-right:328px}.semi-rtl .semi-tree-option-list li.semi-tree-option.semi-tree-option-fullLabel-level-18,.semi-popover-rtl .semi-tree-option-list li.semi-tree-option.semi-tree-option-fullLabel-level-18{padding-left:0;padding-right:348px}.semi-rtl .semi-tree-option-list li.semi-tree-option.semi-tree-option-fullLabel-level-19,.semi-popover-rtl .semi-tree-option-list li.semi-tree-option.semi-tree-option-fullLabel-level-19{padding-left:0;padding-right:368px}.semi-rtl .semi-tree-option-list li.semi-tree-option.semi-tree-option-fullLabel-level-20,.semi-popover-rtl .semi-tree-option-list li.semi-tree-option.semi-tree-option-fullLabel-level-20{padding-left:0;padding-right:388px}.semi-rtl .semi-tree-option-list .semi-tree-option-label-empty,.semi-popover-rtl .semi-tree-option-list .semi-tree-option-label-empty{padding-left:auto;padding-right:0}.semi-rtl .semi-tree-option-list .semi-tree-option-switcher,.semi-popover-rtl .semi-tree-option-list .semi-tree-option-switcher{margin-right:0;margin-left:8px}.semi-rtl .semi-tree-option-list-block,.semi-popover-rtl .semi-tree-option-list-block{direction:rtl}.semi-tree-select{box-sizing:border-box;border-radius:var(--semi-border-radius-small);border:1px solid rgba(0,0,0,0);min-width:80px;min-height:32px;line-height:32px;font-weight:400;background-color:var(--semi-color-fill-0);display:inline-flex;align-items:center;position:relative;cursor:pointer}.semi-tree-select:hover{background-color:var(--semi-color-fill-1);border:1px solid rgba(0,0,0,0)}.semi-tree-select:active{background-color:var(--semi-color-fill-2)}.semi-tree-select-focus,.semi-tree-select-focus:hover{background-color:var(--semi-color-fill-0);border:1px solid var(--semi-color-focus-border);outline:0}.semi-tree-select-focus:active{background-color:var(--semi-color-fill-2)}.semi-tree-select-warning{background-color:var(--semi-color-warning-light-default);border-color:var(--semi-color-warning-light-default)}.semi-tree-select-warning:hover{background-color:var(--semi-color-warning-light-hover);border-color:var(--semi-color-warning-light-hover)}.semi-tree-select-warning.semi-tree-select-focus{background-color:var(--semi-color-warning-light-default);border-color:var(--semi-color-warning)}.semi-tree-select-warning:active{background-color:var(--semi-color-warning-light-active);border-color:var(--semi-color-warning-light-active)}.semi-tree-select-error{background-color:var(--semi-color-danger-light-default);border-color:var(--semi-color-danger-light-default)}.semi-tree-select-error:hover{background-color:var(--semi-color-danger-light-hover);border-color:var(--semi-color-danger-light-hover)}.semi-tree-select-error.semi-tree-select-focus{background-color:var(--semi-color-danger-light-default);border-color:var(--semi-color-danger)}.semi-tree-select-error:active{background-color:var(--semi-color-danger-light-active);border-color:var(--semi-color-danger-light-active)}.semi-tree-select-disabled{cursor:not-allowed;-webkit-user-select:none;user-select:none;background-color:var(--semi-color-disabled-fill)}.semi-tree-select-disabled:hover{background-color:var(--semi-color-disabled-fill)}.semi-tree-select-disabled .semi-tree-select-selection,.semi-tree-select-disabled .semi-tree-select-selection-placeholder{color:var(--semi-color-disabled-text);cursor:not-allowed}.semi-tree-select-disabled .semi-tree-select-arrow,.semi-tree-select-disabled .semi-tree-select-prefix,.semi-tree-select-disabled .semi-tree-select-suffix{color:var(--semi-color-disabled-text)}.semi-tree-select-disabled .semi-tag{color:var(--semi-color-disabled-text);background-color:#0000}.semi-tree-select-selection{font-size:14px;line-height:20px;font-family:Inter,-apple-system,BlinkMacSystemFont,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Segoe UI,Helvetica Neue,Helvetica,Arial,sans-serif;height:100%;display:inline-flex;align-items:center;flex-wrap:wrap;flex-grow:1;overflow:hidden;padding-left:12px;padding-right:0;cursor:pointer;color:var(--semi-color-text-0);position:relative}.semi-tree-select-selection-content{overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.semi-tree-select-selection-placeholder{color:var(--semi-color-text-2)}.semi-tree-select-selection .semi-tag-group{height:inherit;display:inline-flex;align-items:center;flex-wrap:wrap}.semi-tree-select-selection .semi-tag{margin:1px 2px}.semi-tree-select-selection-TriggerSearchItem{position:absolute;max-width:calc(100% - 12px);text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.semi-tree-select-selection-TriggerSearchItem-placeholder{opacity:.6}.semi-tree-select-selection-TriggerSearchItem-disabled{cursor:not-allowed;color:var(--semi-color-disabled-text)}.semi-tree-select-selection .semi-tree-select-triggerSingleSearch-upper{z-index:1}.semi-tree-select-selection .semi-tree-select-triggerSingleSearch-wrapper{width:100%}.semi-tree-select-selection .semi-tree-select-triggerSingleSearch-wrapper .semi-tree-select-inputTrigger .semi-input-wrapper{background:#0000}.semi-tree-select-selection .semi-tree-select-triggerSingleSearch-wrapper .semi-input-wrapper{height:100%;width:100%;border:none;background-color:#0000}.semi-tree-select-selection .semi-tree-select-triggerSingleSearch-wrapper .semi-input-wrapper-focus{border:none}.semi-tree-select-selection .semi-tree-select-triggerSingleSearch-wrapper .semi-input{padding-left:0;padding-right:0}.semi-tree-select-selection .semi-tagInput{border:hidden;background:#0000;min-height:30px}.semi-tree-select-selection .semi-tagInput-small{min-height:22px}.semi-tree-select-selection .semi-tagInput-large{min-height:38px}.semi-tree-select-selection .semi-tagInput .semi-tagInput-wrapper{padding-left:4px;padding-right:4px}.semi-tree-select-selection .semi-tagInput .semi-tagInput-wrapper .semi-input-wrapper .semi-input{padding-left:0}.semi-tree-select-selection .semi-tagInput .semi-tagInput-wrapper .semi-input-wrapper-default,.semi-tree-select-selection .semi-tagInput .semi-tagInput-wrapper .semi-input-wrapper-large{margin-top:1px;margin-bottom:1px}.semi-tree-select-multiple-tagInput-notEmpty .semi-tagInput{margin-left:-4px}.semi-tree-select-multiple-tagInput-empty .semi-tagInput{margin-left:4px}.semi-tree-select-multiple{display:inline-flex}.semi-tree-select-multiple .semi-tree-select-selection{padding-left:4px;padding-right:0}.semi-tree-select-multiple .semi-tree-select-selection-placeholder{padding-left:8px}.semi-tree-select-triggerTagWrap{max-width:100%}.semi-tree-select-triggerTagWrap .semi-tree-select-selection{min-width:0}.semi-tree-select-triggerTagWrap.semi-tree-select-multiple{height:auto}.semi-tree-select-triggerTagWrap.semi-tree-select-multiple .semi-tree-select-selection{height:auto;min-height:30px;overflow:visible}.semi-tree-select-triggerTagWrap.semi-tree-select-multiple.semi-tree-select-small .semi-tree-select-selection{min-height:22px}.semi-tree-select-triggerTagWrap.semi-tree-select-multiple.semi-tree-select-large .semi-tree-select-selection{min-height:38px}.semi-tree-select-triggerTagWrap .semi-tagInput{min-width:0;max-width:100%;flex:1 1 auto}.semi-tree-select-triggerTagWrap .semi-tagInput .semi-tagInput-wrapper-input{max-width:100%}.semi-tree-select-small{min-height:24px;line-height:24px}.semi-tree-select-large{min-height:40px;line-height:40px}.semi-tree-select-large .semi-tree-select-selection{font-size:16px;line-height:22px;font-family:Inter,-apple-system,BlinkMacSystemFont,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Segoe UI,Helvetica Neue,Helvetica,Arial,sans-serif}.semi-tree-select-arrow{display:inline-flex;align-items:center;flex-shrink:0;height:100%;justify-content:center;width:32px;color:var(--semi-color-text-2)}.semi-tree-select-inset-label{display:inline;margin:0 12px;font-weight:600;font-size:14px;line-height:20px;font-family:Inter,-apple-system,BlinkMacSystemFont,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Segoe UI,Helvetica Neue,Helvetica,Arial,sans-serif;color:var(--semi-color-text-2);flex-shrink:0;white-space:nowrap}.semi-tree-select.semi-tree-select-with-prefix{display:inline-flex;align-items:center}.semi-tree-select-arrow,.semi-tree-select-clearbtn{display:inline-flex;align-items:center;height:100%;flex-shrink:0;justify-content:center;width:32px;color:var(--semi-color-text-2)}.semi-tree-select-clearbtn:hover{color:var(--semi-color-primary-hover)}.semi-tree-select-clearbtn:active{color:var(--semi-color-primary-active)}.semi-tree-select-prefix,.semi-tree-select-suffix{display:inline;display:flex;justify-content:center;align-items:center}.semi-tree-select-prefix-text,.semi-tree-select-suffix-text{color:var(--semi-color-text-2);font-weight:600;font-size:14px;line-height:20px;font-family:Inter,-apple-system,BlinkMacSystemFont,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Segoe UI,Helvetica Neue,Helvetica,Arial,sans-serif;margin:0 12px}.semi-tree-select-prefix-icon,.semi-tree-select-suffix-icon{color:var(--semi-color-text-2);margin:0 8px}.semi-tree-select-prefix.semi-tree-select-with-suffix .semi-tree-select-selection,.semi-tree-select-suffix.semi-tree-select-with-suffix .semi-tree-select-selection{padding-right:0}.semi-tree-select-prefix-search-wrapper,.semi-tree-select-suffix-search-wrapper{padding:8px 12px;border-bottom:1px solid var(--semi-color-fill-0)}.semi-tree-select-prefix-maxTagCount,.semi-tree-select-suffix-maxTagCount{color:var(--semi-color-text-2);font-size:14px}.semi-tree-select-prefix-popover,.semi-tree-select-suffix-popover{max-height:300px;overflow:auto}.semi-tree-select-popover .semi-tree-wrapper{height:100%;display:flex;flex-direction:column}.semi-tree-select-popover .semi-tree-wrapper .semi-tree-option-list{flex:1;min-width:230px}.semi-tree-select-popover .semi-tree-wrapper .semi-tree-option-list-hidden{padding:0}.semi-tree-select-popover .semi-tree-wrapper .semi-tree-search-wrapper{border-bottom:1px var(--semi-color-fill-0) solid}.semi-tree-select-borderless:not(:focus-within):not(:hover){background-color:#0000;border-color:#0000}.semi-tree-select-borderless:not(:focus-within):not(:hover) .semi-tree-select-arrow{opacity:0}.semi-tree-select-borderless:focus-within:not(:active){background-color:#0000}.semi-tree-select-borderless.semi-tree-select-error:not(:focus-within){border-color:var(--semi-color-danger)}.semi-tree-select-borderless.semi-tree-select-warning:not(:focus-within){border-color:var(--semi-color-warning)}.semi-tree-select-borderless.semi-tree-select-error:focus-within{border-color:var(--semi-color-danger)}.semi-tree-select-borderless.semi-tree-select-warning:focus-within{border-color:var(--semi-color-warning)}.semi-rtl .semi-tree-select,.semi-portal-rtl .semi-tree-select{direction:rtl}.semi-rtl .semi-tree-select .semi-tagInput .semi-input,.semi-portal-rtl .semi-tree-select .semi-tagInput .semi-input{padding-right:0}.semi-rtl .semi-tree-select-multiple-tagInput-notEmpty .semi-tagInput,.semi-portal-rtl .semi-tree-select-multiple-tagInput-notEmpty .semi-tagInput{margin-left:0;margin-right:-4px}.semi-rtl .semi-tree-select-multiple-tagInput-empty .semi-tagInput,.semi-portal-rtl .semi-tree-select-multiple-tagInput-empty .semi-tagInput{margin-left:0;margin-right:4px}.semi-rtl .semi-tree-select-selection,.semi-portal-rtl .semi-tree-select-selection{padding-right:12px;padding-left:0}.semi-rtl .semi-tree-select-multiple .semi-tree-select-selection,.semi-portal-rtl .semi-tree-select-multiple .semi-tree-select-selection{padding-left:0;padding-right:4px}.semi-rtl .semi-tree-select-multiple .semi-tree-select-selection-placeholder,.semi-portal-rtl .semi-tree-select-multiple .semi-tree-select-selection-placeholder{padding-left:0;padding-right:8px}.semi-rtl .semi-tree-select-prefix.semi-tree-select-with-suffix .semi-tree-select-selection,.semi-rtl .semi-tree-select-suffix.semi-tree-select-with-suffix .semi-tree-select-selection,.semi-portal-rtl .semi-tree-select-prefix.semi-tree-select-with-suffix .semi-tree-select-selection,.semi-portal-rtl .semi-tree-select-suffix.semi-tree-select-with-suffix .semi-tree-select-selection{padding-right:auto;padding-left:0}.semi-rtl .semi-tree-select-popover,.semi-portal-rtl .semi-tree-select-popover{direction:rtl}.semi-upload{display:flex;flex-wrap:wrap}.semi-upload-tooltip-children-wrapper{display:inline-flex;width:fit-content;height:fit-content;vertical-align:middle}.semi-upload-disabled,.semi-upload-disabled .semi-upload-file-card,.semi-upload-disabled .semi-upload-file-card-close{cursor:not-allowed}.semi-upload-disabled .semi-upload-drag-area{border:none;cursor:not-allowed}.semi-upload-disabled .semi-upload-drag-area:hover{background-color:var(--semi-color-tertiary-light-default)}.semi-upload-disabled .semi-upload-drag-area-main-text,.semi-upload-disabled .semi-upload-drag-area-sub-text,.semi-upload-disabled .semi-upload-drag-area-icon{cursor:not-allowed;color:var(--semi-color-disabled-text)}.semi-upload-hidden-input,.semi-upload-hidden-input-replace{display:none}.semi-upload-add{display:flex;align-items:center}.semi-upload[x-prompt-pos=right] .semi-upload-add,.semi-upload[x-prompt-pos=right] .semi-upload-prompt{display:inline-flex}.semi-upload[x-prompt-pos=bottom] .semi-upload-add{display:flex}.semi-upload[x-prompt-pos=bottom] .semi-upload-prompt{display:flex;flex-basis:100%}.semi-upload[x-prompt-pos=bottom] .semi-upload-file-list{flex-basis:100%}.semi-upload[x-prompt-pos=left] .semi-upload-add{display:inline-flex}.semi-upload[x-prompt-pos=left] .semi-upload-prompt{display:inline-flex;order:-1}.semi-upload[x-prompt-pos=left] .semi-upload-file-list{order:2}.semi-upload-file-list{flex-basis:100%;flex-shrink:0;display:block;margin-top:8px;margin-bottom:8px}.semi-upload-file-list-main{display:flex;flex-wrap:wrap;flex-shrink:0;gap:8px;margin-bottom:8px}.semi-upload-file-list-main p{display:flex;align-items:center}.semi-upload-file-list-title{font-size:12px;line-height:16px;font-family:Inter,-apple-system,BlinkMacSystemFont,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Segoe UI,Helvetica Neue,Helvetica,Arial,sans-serif;color:var(--semi-color-text-2);margin-bottom:4px}.semi-upload-file-list-title-choosen{margin-right:8px}.semi-upload-file-list-title-clear{cursor:pointer;color:var(--semi-color-primary)}.semi-upload-file-card{border-radius:var(--semi-border-radius-medium);display:inline-flex;align-items:center;justify-content:space-between;height:52px;width:250px;background-color:var(--semi-color-fill-0);cursor:pointer}.semi-upload-file-card:hover{background-color:var(--semi-color-fill-1)}.semi-upload-file-card a{text-decoration:none}.semi-upload-file-card-preview{height:36px;width:36px;color:var(--semi-color-text-2);margin:8px;display:flex;justify-content:center;align-items:center;border-radius:var(--semi-border-radius-small);flex-shrink:0}.semi-upload-file-card-preview img{width:36px;height:36px;object-fit:cover}.semi-upload-file-card-preview-placeholder{background-color:rgba(var(--semi-grey-3),1);color:rgba(var(--semi-white),1)}.semi-upload-file-card-show-pointer{cursor:pointer}.semi-upload-file-card-info{display:flex;align-items:center}.semi-upload-file-card-info-main{display:flex;flex-wrap:wrap;flex:1}.semi-upload-file-card-info-main-text{display:flex;align-items:center;flex-basis:100%}.semi-upload-file-card-info-main-control{display:flex}.semi-upload-file-card-info-name{width:0;flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;display:inline-block;font-size:14px;line-height:20px;font-family:Inter,-apple-system,BlinkMacSystemFont,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Segoe UI,Helvetica Neue,Helvetica,Arial,sans-serif;font-weight:600;color:var(--semi-color-text-0)}.semi-upload-file-card-info-size{font-size:12px;line-height:16px;font-family:Inter,-apple-system,BlinkMacSystemFont,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Segoe UI,Helvetica Neue,Helvetica,Arial,sans-serif;font-weight:400;margin-left:8px;color:var(--semi-color-text-2);margin-top:1px}.semi-upload-file-card-info-replace{display:inline-flex;margin-left:8px;color:var(--semi-color-text-2)}.semi-upload-file-card-info-validate-message{font-size:12px;line-height:16px;font-family:Inter,-apple-system,BlinkMacSystemFont,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Segoe UI,Helvetica Neue,Helvetica,Arial,sans-serif;display:flex;align-items:center;color:var(--semi-color-text-0)}.semi-upload-file-card-info-retry{font-size:12px;line-height:16px;font-family:Inter,-apple-system,BlinkMacSystemFont,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Segoe UI,Helvetica Neue,Helvetica,Arial,sans-serif;color:var(--semi-color-primary);cursor:pointer;margin-left:8px}.semi-upload-file-card-info .semi-progress{flex-basis:100%;margin-top:4px}.semi-upload-file-card-close{margin-left:8px;margin-right:8px;flex-shrink:0}.semi-upload-file-card-replace{margin-left:8px;width:24px;flex-shrink:0}.semi-upload-file-card-icon-loading,.semi-upload-file-card-icon-error.semi-icon{font-size:11px;margin-right:2px}.semi-upload-file-card-icon-error{position:relative;top:-1px}.semi-upload-file-card-icon-loading{line-height:0}.semi-upload-file-card-icon-loading .semi-spin-wrapper svg{height:11px;width:11px}.semi-upload-file-card-fail{background-color:var(--semi-color-danger-light-default)}.semi-upload-file-card-fail:hover{background-color:var(--semi-color-danger-light-hover)}.semi-upload-file-card-fail .semi-upload-file-card-info-validate-message{color:var(--semi-color-danger)}.semi-upload-picture{display:flex}.semi-upload-picture[x-prompt-pos=bottom]{flex-direction:column}.semi-upload-picture[x-prompt-pos=bottom] .semi-upload-prompt,.semi-upload-picture[x-prompt-pos=right] .semi-upload-prompt{order:1}.semi-upload-picture-add{background-color:var(--semi-color-fill-0);height:96px;width:96px;box-sizing:border-box;display:inline-flex;justify-content:center;align-items:center;border:2px dashed var(--semi-color-border);color:var(--semi-color-tertiary);border-radius:var(--semi-border-radius-small);cursor:pointer}.semi-upload-picture-add:hover{background-color:var(--semi-color-fill-1)}.semi-upload-picture-add:active{background-color:var(--semi-color-fill-2)}.semi-upload-picture-add-disabled{cursor:not-allowed}.semi-upload-picture-add-disabled:hover,.semi-upload-picture-add-disabled:active{background-color:var(--semi-color-fill-0)}.semi-upload-picture-file-list{flex-basis:inherit;margin-top:0;margin-bottom:0}.semi-upload-picture-file-card{display:flex;align-items:center;justify-content:center;height:96px;width:96px;border-radius:var(--semi-border-radius-small);box-sizing:border-box;position:relative;overflow:hidden}.semi-upload-picture-file-card img{height:96px;width:96px;object-fit:cover;border-radius:var(--semi-border-radius-small)}.semi-upload-picture-file-card-custom-thumbnail .semi-image img{width:inherit;height:inherit}.semi-upload-picture-file-card-close{visibility:hidden;display:inline-flex;position:absolute;top:8px;right:8px;border-radius:var(--semi-border-radius-circle);cursor:pointer;transition:all 0s}.semi-upload-picture-file-card-icon-close{font-size:16px;color:var(--semi-color-white)}.semi-upload-picture-file-card:before{visibility:hidden;background-color:var(--semi-color-overlay-bg);content:"";position:absolute;left:0;right:0;top:0;bottom:0}.semi-upload-picture-file-card-retry{visibility:hidden;background-color:var(--semi-color-white);width:24px;height:24px;position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);color:var(--semi-color-primary);border-radius:var(--semi-border-radius-circle);display:flex;align-items:center;justify-content:center;cursor:pointer}.semi-upload-picture-file-card-icon-retry{transform:scaleX(-1);font-size:13px}.semi-upload-picture-file-card-replace{visibility:hidden;display:inline-flex;position:absolute;cursor:pointer;top:50%;left:50%;color:var(--semi-color-white);transform:translate3D(-50%,-50%,0)}.semi-upload-picture-file-card-preview{visibility:hidden;display:inline-flex;position:absolute;cursor:pointer;top:50%;left:50%;transform:translate3D(-50%,-50%,0)}.semi-upload-picture-file-card-preview-fallback{background-color:var(--semi-color-fill-0);border:2px var(--semi-color-border);color:var(--semi-color-tertiary);border-radius:var(--semi-border-radius-small)}.semi-upload-picture-file-card-pic-info{display:inline-flex;box-sizing:border-box;justify-content:space-between;align-items:center;position:absolute;width:100%;height:24px;padding:0 10px;bottom:0;left:0;color:var(--semi-color-white);font-size:12px;font-weight:600;background:linear-gradient(0deg,#16161a4d,#16161a00 77.08%)}.semi-upload-picture-file-card-icon-loading,.semi-upload-picture-file-card-icon-error{position:absolute;bottom:6px;right:6px;color:var(--semi-color-danger)}.semi-upload-picture-file-card-icon-loading{font-size:14px}.semi-upload-picture-file-card-show-pointer{cursor:pointer}.semi-upload-picture-file-card-error{border:1px solid var(--semi-color-danger);outline:1px solid var(--semi-color-danger)}.semi-upload-picture-file-card:hover:before{visibility:visible}.semi-upload-picture-file-card:hover .semi-upload-picture-file-card-close,.semi-upload-picture-file-card:hover .semi-upload-picture-file-card-replace,.semi-upload-picture-file-card:hover .semi-upload-picture-file-card-retry,.semi-upload-picture-file-card:hover .semi-upload-picture-file-card-preview{visibility:visible}.semi-upload-picture-file-card-uploading:before{visibility:visible}.semi-upload-picture-file-card .semi-progress-circle{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%)}.semi-upload-drag-area{border-radius:var(--semi-border-radius-small);border:2px dashed var(--semi-color-border);width:100%;padding:12px;background-color:var(--semi-color-tertiary-light-default);display:flex;justify-content:center;align-items:center;flex-direction:column;cursor:pointer}.semi-upload-drag-area:hover{background-color:var(--semi-color-primary-light-default);border-color:var(--semi-color-primary)}.semi-upload-drag-area-custom{border:none;padding:0;background-color:inherit}.semi-upload-drag-area-custom:hover{background-color:inherit}.semi-upload-drag-area-legal{background-color:var(--semi-color-primary-light-default);border-color:var(--semi-color-primary)}.semi-upload-drag-area-legal .semi-upload-drag-area-sub-text{display:none}.semi-upload-drag-area-icon{color:var(--semi-color-primary)}.semi-upload-drag-area-text{text-align:center}.semi-upload-drag-area-main-text{cursor:pointer;font-size:14px;line-height:20px;font-family:Inter,-apple-system,BlinkMacSystemFont,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Segoe UI,Helvetica Neue,Helvetica,Arial,sans-serif;margin-bottom:4px;color:var(--semi-color-text-0)}.semi-upload-drag-area-main-text:hover,.semi-upload-drag-area-main-text:active{color:var(--semi-color-text-0)}.semi-upload-drag-area-sub-text{cursor:pointer;font-size:12px;line-height:16px;font-family:Inter,-apple-system,BlinkMacSystemFont,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Segoe UI,Helvetica Neue,Helvetica,Arial,sans-serif;color:var(--semi-color-text-0)}.semi-upload-drag-area-sub-text:hover,.semi-upload-drag-area-sub-text:active{color:var(--semi-color-text-0)}.semi-upload-drag-area-tips{font-size:12px;line-height:16px;font-family:Inter,-apple-system,BlinkMacSystemFont,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Segoe UI,Helvetica Neue,Helvetica,Arial,sans-serif;font-weight:600}.semi-upload-drag-area-tips-legal{color:var(--semi-color-primary)}.semi-upload-validate-message{flex-basis:100%;flex-shrink:0;display:block;color:var(--semi-color-danger)}.semi-rtl .semi-upload,.semi-portal-rtl .semi-upload{direction:rtl}.semi-rtl .semi-upload-file-list-title-choosen,.semi-portal-rtl .semi-upload-file-list-title-choosen{margin-right:0;margin-left:8px}.semi-rtl .semi-upload-file-list-title-choosen,.semi-rtl .semi-upload-file-list-title-clear,.semi-portal-rtl .semi-upload-file-list-title-choosen,.semi-portal-rtl .semi-upload-file-list-title-clear{display:inline-block}.semi-rtl .semi-upload-file-card-info-size,.semi-portal-rtl .semi-upload-file-card-info-size,.semi-rtl .semi-upload-file-card-info-retry,.semi-portal-rtl .semi-upload-file-card-info-retry{margin-left:0;margin-right:8px}.semi-rtl .semi-upload-file-card-icon-loading,.semi-rtl .semi-upload-file-card-icon-error,.semi-portal-rtl .semi-upload-file-card-icon-loading,.semi-portal-rtl .semi-upload-file-card-icon-error{margin-right:0;margin-left:2px}.semi-rtl .semi-upload-picture-file-card-close,.semi-portal-rtl .semi-upload-picture-file-card-close{right:auto;left:8px}.semi-rtl .semi-upload-picture-file-card .semi-progress-circle,.semi-portal-rtl .semi-upload-picture-file-card .semi-progress-circle,.semi-rtl .semi-upload-picture-file-card-retry,.semi-portal-rtl .semi-upload-picture-file-card-retry{left:auto;right:50%;transform:translate(50%,-50%)}.semi-rtl .semi-upload-picture-file-card-icon-loading,.semi-rtl .semi-upload-picture-file-card-icon-error,.semi-portal-rtl .semi-upload-picture-file-card-icon-loading,.semi-portal-rtl .semi-upload-picture-file-card-icon-error{right:0;left:6px}.semi-userGuide-spotlight{position:fixed;top:0;left:0;width:100vw;height:100vh;pointer-events:none}.semi-userGuide-spotlight-transparent-rect{pointer-events:auto}.semi-userGuide-spotlight-rect{transition:all .2s cubic-bezier(.4,0,.2,1)}.semi-userGuide-popover{max-width:fit-content;width:400px}.semi-userGuide-popup-content{color:var(--semi-color-text-0)}.semi-userGuide-popup-content-primary{color:var(--semi-color-tertiary-light-default)}.semi-userGuide-popup-content-cover img{display:block;height:200px;width:100%;border-radius:var(--semi-border-radius-medium) var(--semi-border-radius-medium) 0 0}.semi-userGuide-popup-content-body{padding:24px}.semi-userGuide-popup-content-title{font-size:18px;font-weight:600;line-height:24px;margin-bottom:8px}.semi-userGuide-popup-content-description{font-size:14px;line-height:20px;margin-bottom:48px}.semi-userGuide-popup-content-footer{display:flex;justify-content:space-between;align-items:center}.semi-userGuide-popup-content-buttons{display:flex;gap:12px;margin-left:120px}.semi-userGuide-popup-content-indicator{font-size:14px;line-height:20px}.semi-userGuide-modal .semi-modal-small{width:fit-content}.semi-userGuide-modal .semi-modal-content{padding:0;width:600px;max-width:fit-content}.semi-userGuide-modal-cover{height:300px}.semi-userGuide-modal-indicator{height:30px;display:flex;justify-content:center;align-items:center;column-gap:8px}.semi-userGuide-modal-indicator-item{width:6px;height:6px;border-radius:var(--semi-border-radius-large);background-color:var(--semi-color-primary-light-active)}.semi-userGuide-modal-indicator-item-active{background:var(--semi-color-primary)}.semi-userGuide-modal-body{display:flex;justify-content:center;align-items:center;flex-direction:column;padding:24px 48px}.semi-userGuide-modal-body-title{font-size:18px;font-weight:600;line-height:24px;margin-bottom:8px}.semi-userGuide-modal-body-description{font-size:14px;line-height:20px}.semi-userGuide-modal-footer{display:flex;justify-content:center;align-items:center;padding:24px;column-gap:12px}.semi-videoPlayer{position:relative;display:inline-block;width:100%;height:100%}.semi-videoPlayer ::-webkit-media-controls{display:none}.semi-videoPlayer-wrapper{width:100%;height:100%;position:relative;line-height:0}.semi-videoPlayer-wrapper video{width:100%;height:100%;object-fit:contain}.semi-videoPlayer-wrapper-dark{background-color:rgba(var(--semi-grey-8),1);color:var(--semi-color-bg-0)}.semi-videoPlayer-wrapper-light{background-color:var(--semi-color-disabled-bg);color:rgba(var(--semi-grey-8),1)}.semi-videoPlayer-pause{top:0;left:0;width:100%;height:100%;position:absolute;display:flex;justify-content:center;align-items:center;pointer-events:none}.semi-videoPlayer-pause svg{font-size:88px;color:var(--semi-color-text-1);pointer-events:none}.semi-videoPlayer-error{top:0;left:0;width:100%;height:100%;position:absolute;display:flex;justify-content:center;align-items:center;flex-direction:column;font-weight:600;font-size:14px}.semi-videoPlayer-error-svg{margin-bottom:12px}.semi-videoPlayer-error-dark{background-color:rgba(var(--semi-grey-8),1);color:var(--semi-color-bg-0)}.semi-videoPlayer-error-dark path{fill:var(--semi-color-bg-0)}.semi-videoPlayer-error-light{background-color:var(--semi-color-disabled-bg);color:rgba(var(--semi-grey-8),1)}.semi-videoPlayer-error-light path{fill:rgba(var(--semi-grey-8),1)}.semi-videoPlayer-poster{position:absolute;top:0;left:0;width:100%;height:100%;pointer-events:none}.semi-videoPlayer-poster-hide{opacity:0}.semi-videoPlayer-notification{position:absolute;bottom:78px;left:8px;text-align:center;background-color:var(--semi-color-overlay-bg);color:var(--semi-color-default);padding:8px 12px;line-height:20px;border-radius:3px;font-size:14px}.semi-videoPlayer-mirror video{transform:rotateX(0) rotateY(180deg)}.semi-videoPlayer-controls{position:absolute;bottom:0;left:0;right:0;height:fit-content;opacity:1;transition:opacity .5s ease-in-out;z-index:1}.semi-videoPlayer-controls-hide{opacity:0}.semi-videoPlayer-controls-menu{display:flex;justify-content:space-between;align-items:center;box-sizing:border-box;height:56px;background-color:#1c1f23cc;padding:12px 16px}.semi-videoPlayer-controls-menu-left,.semi-videoPlayer-controls-menu-right{display:flex;align-items:center}.semi-videoPlayer-controls-menu-item{margin-right:8px}.semi-videoPlayer-controls-menu-button svg{color:#fff}.semi-videoPlayer-controls-time{color:#fff;font-size:14px;margin-right:8px;padding:0 8px;font-variant-numeric:tabular-nums}.semi-videoPlayer-controls-popover{background-color:#0000}.semi-videoPlayer-controls-volume{box-sizing:border-box;width:40px;height:160px;background-color:var(--semi-color-overlay-bg);color:#ffffffb3;border-radius:4px;padding:0 4px;line-height:16px;font-size:12px;-webkit-user-select:none;user-select:none}.semi-videoPlayer-controls-volume-title{padding:10px 0;text-align:center}.semi-videoPlayer-controls-popup{display:flex;justify-content:center;align-items:center;width:50px;height:24px;background-color:var(--semi-color-overlay-bg);color:#fff;font-weight:600;font-size:12px;line-height:16px;border-radius:3px;cursor:pointer}.semi-videoPlayer-controls-popup-menu{width:48px;background-color:var(--semi-color-overlay-bg);border-radius:4px}.semi-videoPlayer-controls-popup-menu-item{display:flex;justify-content:center;align-items:center;padding:0 8px;height:32px;color:#fff;font-size:12px}.semi-videoPlayer-controls-popup-menu-item:hover{background-color:#43444a!important}.semi-videoPlayer-controls-popup-menu .semi-dropdown-item-active{color:var(--semi-color-primary);font-weight:600;cursor:pointer}.semi-videoPlayer-progress{position:relative;height:20px;display:flex;align-items:center;justify-content:center;cursor:pointer;margin:0 8px}.semi-videoPlayer-progress-markers{position:absolute;width:100%;height:100%}.semi-videoPlayer-progress-tooltip{top:6px}.semi-videoPlayer-progress-tooltip-content{display:flex;justify-content:center;align-items:center}.semi-videoPlayer-progress-slider{position:absolute;width:100%;height:100%;left:0;bottom:0;border-radius:999px}.semi-videoPlayer-progress-slider-active .semi-videoPlayer-progress-slider-list,.semi-videoPlayer-progress-slider-active .semi-videoPlayer-progress-slider-played,.semi-videoPlayer-progress-slider-active .semi-videoPlayer-progress-slider-buffered,.semi-videoPlayer-progress-slider:hover .semi-videoPlayer-progress-slider-list,.semi-videoPlayer-progress-slider:hover .semi-videoPlayer-progress-slider-played,.semi-videoPlayer-progress-slider:hover .semi-videoPlayer-progress-slider-buffered{height:10px;transition:transform .3s;transition-timing-function:cubic-bezier(.62,.05,.36,.95)}.semi-videoPlayer-progress-slider-list{position:absolute;bottom:0;left:0;background-color:rgba(var(--semi-grey-5),1);height:4px;width:calc(100% - 2px);margin-right:2px;border-radius:999px;transition:transform .3s;transition-timing-function:cubic-bezier(.62,.05,.36,.95)}.semi-videoPlayer-progress-slider-played{position:absolute;bottom:0;left:0;background-color:var(--semi-color-primary);height:4px;border-radius:999px;transition:transform .3s;transition-timing-function:cubic-bezier(.62,.05,.36,.95)}.semi-videoPlayer-progress-slider-buffered{position:absolute;bottom:0;left:0;background-color:rgba(var(--semi-grey-3),1);height:4px;border-radius:999px;transition:transform .3s;transition-timing-function:cubic-bezier(.62,.05,.36,.95)}.semi-videoPlayer-progress-handle{box-sizing:border-box;position:absolute;width:16px;height:16px;background-color:#fff;border:1px solid var(--semi-color-primary);box-shadow:0 0 4px 0 var(--semi-color-shadow);border-radius:50%;top:15px}@keyframes semi-animation-rotate{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.semi-button.semi-button-with-icon{display:inline-flex;align-items:center}.semi-button.semi-button-with-icon .semi-button-content{display:flex;align-items:center;justify-content:center}.semi-button.semi-button-loading{pointer-events:none;cursor:not-allowed}.semi-button.semi-button-loading .semi-button-content>svg,.semi-button.semi-button-loading .semi-button-content-loading-icon{width:16px;height:16px;animation:.6s linear infinite semi-animation-rotate;animation-fill-mode:forwards}.semi-button.semi-button-with-icon-only{padding:8px;height:32px;width:32px;justify-content:center;align-items:center}.semi-button.semi-button-with-icon-only.semi-button-size-small{padding:4px;height:24px;width:24px}.semi-button.semi-button-with-icon-only.semi-button-size-large{padding:12px;height:40px;width:40px}.semi-button-content-left{margin-right:8px;display:flex;align-items:center}.semi-button-content-right{margin-left:8px;display:flex;align-items:center}.semi-rtl .semi-button,.semi-portal-rtl .semi-button{direction:rtl;padding-left:12px;padding-right:12px}.semi-rtl .semi-button-size-small,.semi-portal-rtl .semi-button-size-small{padding-left:12px;padding-right:12px}.semi-rtl .semi-button-size-large,.semi-portal-rtl .semi-button-size-large{padding-left:16px;padding-right:16px}.semi-rtl .semi-button-group,.semi-portal-rtl .semi-button-group{direction:rtl}.semi-rtl .semi-button-group>.semi-button,.semi-portal-rtl .semi-button-group>.semi-button{padding-left:0;padding-right:0}.semi-rtl .semi-button-group>.semi-button .semi-button-content,.semi-portal-rtl .semi-button-group>.semi-button .semi-button-content{padding-left:12px;padding-right:12px}.semi-rtl .semi-button-group>.semi-button-size-large .semi-button-content,.semi-portal-rtl .semi-button-group>.semi-button-size-large .semi-button-content{padding-left:16px;padding-right:16px}.semi-rtl .semi-button-group>.semi-button-size-small .semi-button-content,.semi-portal-rtl .semi-button-group>.semi-button-size-small .semi-button-content{padding-left:12px;padding-right:12px}.semi-rtl .semi-button-group>.semi-button.semi-button-with-icon-only,.semi-portal-rtl .semi-button-group>.semi-button.semi-button-with-icon-only{padding-left:0;padding-right:0}.semi-rtl .semi-button-group>.semi-button.semi-button-with-icon-only .semi-button-content,.semi-portal-rtl .semi-button-group>.semi-button.semi-button-with-icon-only .semi-button-content{padding-left:8px;padding-right:8px}.semi-rtl .semi-button-group>.semi-button.semi-button-with-icon-only.semi-button-size-small .semi-button-content,.semi-portal-rtl .semi-button-group>.semi-button.semi-button-with-icon-only.semi-button-size-small .semi-button-content{padding-left:4px;padding-right:4px}.semi-rtl .semi-button-group>.semi-button.semi-button-with-icon-only.semi-button-size-large .semi-button-content,.semi-portal-rtl .semi-button-group>.semi-button.semi-button-with-icon-only.semi-button-size-large .semi-button-content{padding-left:12px;padding-right:12px}.semi-rtl .semi-button-group>.semi-button:first-child,.semi-portal-rtl .semi-button-group>.semi-button:first-child{border-top-left-radius:0;border-bottom-left-radius:0;border-top-right-radius:var(--semi-border-radius-small);border-bottom-right-radius:var(--semi-border-radius-small)}.semi-rtl .semi-button-group>.semi-button:not(:last-child) .semi-button-content,.semi-portal-rtl .semi-button-group>.semi-button:not(:last-child) .semi-button-content{border-left:1px var(--semi-color-border) solid;border-right:0}.semi-rtl .semi-button-group>.semi-button:last-child,.semi-portal-rtl .semi-button-group>.semi-button:last-child{border-top-right-radius:0;border-bottom-right-radius:0;border-top-left-radius:var(--semi-border-radius-small);border-bottom-left-radius:var(--semi-border-radius-small)}.semi-rtl .semi-button.semi-button-with-icon-only,.semi-portal-rtl .semi-button.semi-button-with-icon-only{padding-left:8px;padding-right:8px}.semi-rtl .semi-button.semi-button-with-icon-only.semi-button-size-small,.semi-portal-rtl .semi-button.semi-button-with-icon-only.semi-button-size-small{padding-left:4px;padding-right:4px}.semi-rtl .semi-button.semi-button-with-icon-only.semi-button-size-large,.semi-portal-rtl .semi-button.semi-button-with-icon-only.semi-button-size-large{padding-left:12px;padding-right:12px}.semi-rtl .semi-button-content-left,.semi-portal-rtl .semi-button-content-left{margin-left:8px;margin-right:0}.semi-rtl .semi-button-content-right,.semi-portal-rtl .semi-button-content-right{margin-right:8px;margin-left:0}.semi-input-textarea-wrapper{box-sizing:border-box;display:inline-block;position:relative;width:100%;border:1px rgba(0,0,0,0) solid;border-radius:var(--semi-border-radius-small);vertical-align:bottom;background-color:var(--semi-color-fill-0);transition:background-color var(--semi-transition_duration-none) var(--semi-transition_function-easeIn) var(--semi-transition_delay-none),border var(--semi-transition_duration-none) var(--semi-transition_function-easeIn) var(--semi-transition_delay-none)}.semi-input-textarea-wrapper-resizeX{display:inline-block;width:fit-content;max-width:100%}.semi-input-textarea-wrapper:hover{background-color:var(--semi-color-fill-1)}.semi-input-textarea-wrapper-focus{background-color:var(--semi-color-fill-0);border:1px var(--semi-color-focus-border) solid}.semi-input-textarea-wrapper-focus:hover,.semi-input-textarea-wrapper-focus:active{background-color:var(--semi-color-fill-0)}.semi-input-textarea-wrapper:active{background-color:var(--semi-color-fill-2)}.semi-input-textarea-wrapper .semi-input-clearbtn{position:absolute;top:0;min-width:24px;color:var(--semi-color-text-2);right:4px;height:32px;display:flex;align-items:center;justify-content:center}.semi-input-textarea-wrapper .semi-input-clearbtn>svg{pointer-events:none}.semi-input-textarea-wrapper .semi-input-clearbtn:hover{cursor:pointer}.semi-input-textarea-wrapper .semi-input-clearbtn:hover .semi-icon{color:var(--semi-color-primary-hover)}.semi-input-textarea-wrapper .semi-input-clearbtn-hidden{visibility:hidden}.semi-input-textarea-wrapper-disabled,.semi-input-textarea-wrapper-readonly{cursor:not-allowed;color:var(--semi-color-disabled-text);background-color:var(--semi-color-disabled-fill)}.semi-input-textarea-wrapper-disabled:hover,.semi-input-textarea-wrapper-readonly:hover{background-color:var(--semi-color-disabled-fill)}.semi-input-textarea-wrapper-disabled::placeholder,.semi-input-textarea-wrapper-readonly::placeholder{color:var(--semi-color-disabled-text)}.semi-input-textarea-wrapper-readonly{cursor:text}.semi-input-textarea-wrapper-error{background-color:var(--semi-color-danger-light-default);border-color:var(--semi-color-danger-light-default)}.semi-input-textarea-wrapper-error:hover{background-color:var(--semi-color-danger-light-hover);border-color:var(--semi-color-danger-light-hover)}.semi-input-textarea-wrapper-error.semi-input-textarea-wrapper-focus{background-color:var(--semi-color-danger-light-default);border-color:var(--semi-color-danger)}.semi-input-textarea-wrapper-error:active{background-color:var(--semi-color-danger-light-active);border-color:var(--semi-color-danger)}.semi-input-textarea-wrapper-warning{background-color:var(--semi-color-warning-light-default);border-color:var(--semi-color-warning-light-default)}.semi-input-textarea-wrapper-warning:hover{background-color:var(--semi-color-warning-light-hover);border-color:var(--semi-color-warning-light-hover)}.semi-input-textarea-wrapper-warning.semi-input-textarea-wrapper-focus{background-color:var(--semi-color-warning-light-default);border-color:var(--semi-color-warning)}.semi-input-textarea-wrapper-warning:active{background-color:var(--semi-color-warning-light-active);border-color:var(--semi-color-warning)}.semi-input-textarea{position:relative;resize:none;padding:5px 12px;box-shadow:none;font-size:14px;line-height:20px;font-family:Inter,-apple-system,BlinkMacSystemFont,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Segoe UI,Helvetica Neue,Helvetica,Arial,sans-serif;background-color:#0000;border:0 solid rgba(0,0,0,0);vertical-align:bottom;width:100%;outline:none;cursor:text;box-sizing:border-box;color:var(--semi-color-text-0)}.semi-input-textarea:hover{border-color:#0000}.semi-input-textarea::placeholder{color:var(--semi-color-text-2)}.semi-input-textarea-showClear{padding-right:36px}.semi-input-textarea-disabled,.semi-input-textarea-readonly{cursor:not-allowed;color:var(--semi-color-disabled-text);background-color:#0000}.semi-input-textarea-disabled:hover,.semi-input-textarea-readonly:hover{background-color:#0000}.semi-input-textarea-disabled::placeholder,.semi-input-textarea-readonly::placeholder{color:var(--semi-color-disabled-text)}.semi-input-textarea-readonly{cursor:text}.semi-input-textarea-autosize{overflow:hidden;resize:none}.semi-input-textarea-counter{font-size:12px;line-height:16px;font-family:Inter,-apple-system,BlinkMacSystemFont,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Segoe UI,Helvetica Neue,Helvetica,Arial,sans-serif;display:flex;flex-direction:column;justify-content:center;padding:3px 12px 5px;min-height:24px;text-align:right;color:var(--semi-color-text-2)}.semi-input-textarea-counter-exceed{color:var(--semi-color-danger)}.semi-input-textarea-borderless:not(:focus-within):not(:hover){background-color:#0000;border-color:#0000}.semi-input-textarea-borderless:focus-within:not(:active){background-color:#0000}.semi-input-textarea-borderless.semi-input-textarea-wrapper-error:not(:focus-within){border-color:var(--semi-color-danger)}.semi-input-textarea-borderless.semi-input-textarea-wrapper-warning:not(:focus-within){border-color:var(--semi-color-warning)}.semi-input-textarea-borderless.semi-input-textarea-wrapper-error .semi-input-textarea-counter{color:var(--semi-color-danger)}.semi-input-textarea-borderless.semi-input-textarea-wrapper-warning .semi-input-textarea-counter{color:var(--semi-color-warning)}.semi-input-textarea-wrapper-withLineNumber{display:flex;padding:0;align-items:flex-start}.semi-input-textarea-wrapper-withLineNumber.semi-input-textarea-wrapper-resizeX{display:inline-flex;width:fit-content;max-width:100%}.semi-input-textarea-wrapper-withLineNumber.semi-input-textarea-wrapper-resizeX .semi-input-textarea-content{flex:0 0 auto}.semi-input-textarea-wrapper-withLineNumber .semi-input-textarea-lineNumber{flex-shrink:0;padding:5px 12px;background-color:var(--semi-color-fill-1);border-right:1px solid var(--semi-color-border);color:var(--semi-color-text-2);font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-size:inherit;line-height:1.5;text-align:right;-webkit-user-select:none;user-select:none;min-width:36px;border-radius:var(--semi-border-radius-small) 0 0 var(--semi-border-radius-small);overflow-y:auto;overflow-x:hidden;scrollbar-width:none;-ms-overflow-style:none}.semi-input-textarea-wrapper-withLineNumber .semi-input-textarea-lineNumber::-webkit-scrollbar{display:none}.semi-input-textarea-wrapper-withLineNumber .semi-input-textarea-content{display:flex;flex:1;min-width:0}.semi-input-textarea-wrapper-withLineNumber .semi-input-textarea-lineNumber-item{display:flex;align-items:flex-start;justify-content:flex-end;box-sizing:border-box}.semi-input-textarea-wrapper-withLineNumber .semi-input-textarea{border-radius:0 var(--semi-border-radius-small) var(--semi-border-radius-small) 0;line-height:1.5;flex:1}.semi-rtl .semi-input-wrapper,.semi-portal-rtl .semi-input-wrapper{direction:rtl}.semi-rtl .semi-input-wrapper__with-prefix .semi-input,.semi-portal-rtl .semi-input-wrapper__with-prefix .semi-input{padding-left:auto;padding-right:0}.semi-rtl .semi-input-wrapper__with-suffix .semi-input,.semi-portal-rtl .semi-input-wrapper__with-suffix .semi-input{padding-right:auto;padding-left:0}.semi-rtl .semi-input,.semi-portal-rtl .semi-input{padding-left:12px;padding-right:12px}.semi-rtl .semi-input-clearbtn+.semi-rtl .semi-input-suffix+.semi-input-suffix-text,.semi-rtl .semi-input-clearbtn+.semi-portal-rtl .semi-input-suffix+.semi-input-suffix-text,.semi-portal-rtl .semi-input-clearbtn+.semi-rtl .semi-input-suffix+.semi-input-suffix-text,.semi-portal-rtl .semi-input-clearbtn+.semi-portal-rtl .semi-input-suffix+.semi-input-suffix-text{margin-left:auto;margin-right:0}.semi-rtl .semi-input-clearbtn+.semi-rtl .semi-input-suffix+.semi-input-suffix-icon,.semi-rtl .semi-input-clearbtn+.semi-portal-rtl .semi-input-suffix+.semi-input-suffix-icon,.semi-portal-rtl .semi-input-clearbtn+.semi-rtl .semi-input-suffix+.semi-input-suffix-icon,.semi-portal-rtl .semi-input-clearbtn+.semi-portal-rtl .semi-input-suffix+.semi-input-suffix-icon{margin-left:auto;margin-right:0}.semi-rtl .semi-input-append,.semi-portal-rtl .semi-input-append{border-left:0;border-right:1px rgba(0,0,0,0) solid}.semi-rtl .semi-input-prepend,.semi-portal-rtl .semi-input-prepend{border-right:0;border-left:1px rgba(0,0,0,0) solid}.semi-rtl .semi-input-group .semi-select:not(:last-child):after,.semi-rtl .semi-input-group .semi-cascader:not(:last-child):after,.semi-rtl .semi-input-group .semi-tree-select:not(:last-child):after,.semi-rtl .semi-input-group>.semi-input-wrapper:not(:last-child):after,.semi-portal-rtl .semi-input-group .semi-select:not(:last-child):after,.semi-portal-rtl .semi-input-group .semi-cascader:not(:last-child):after,.semi-portal-rtl .semi-input-group .semi-tree-select:not(:last-child):after,.semi-portal-rtl .semi-input-group>.semi-input-wrapper:not(:last-child):after{right:auto;left:-1px}.semi-rtl .semi-input-group .semi-input-number:not(:last-child):after,.semi-portal-rtl .semi-input-group .semi-input-number:not(:last-child):after{right:auto;left:-1px}.semi-rtl .semi-input-textarea-wrapper,.semi-portal-rtl .semi-input-textarea-wrapper{direction:rtl}.semi-rtl .semi-input-textarea-counter,.semi-portal-rtl .semi-input-textarea-counter{text-align:left}.semi-rtl .semi-input-textarea-showClear,.semi-portal-rtl .semi-input-textarea-showClear{padding-right:0;padding-left:36px}body,:host{--semi-transition_duration-slowest:0ms;--semi-transition_duration-slower:0ms;--semi-transition_duration-slow:0ms;--semi-transition_duration-normal:0ms;--semi-transition_duration-fast:0ms;--semi-transition_duration-faster:0ms;--semi-transition_duration-fastest:0ms;--semi-transition_duration-none:0ms;--semi-transition_function-linear:linear;--semi-transition_function-ease:ease;--semi-transition_function-easeIn:ease-in;--semi-transition_function-easeOut:ease-out;--semi-transition_function-easeInIOut:ease-in-out;--semi-transition_delay-none: 0ms;--semi-transition_delay-slowest:0ms;--semi-transition_delay-slower:0ms;--semi-transition_delay-slow:0ms;--semi-transition_delay-normal:0ms;--semi-transition_delay-fast:0ms;--semi-transition_delay-faster:0ms;--semi-transition_delay-fastest:0ms;--semi-transform_scale-none:scale(1,1);--semi-transform_scale-small:scale(1,1);--semi-transform_scale-medium:scale(1,1);--semi-transform_scale-large:scale(1,1);--semi-transform-rotate-none:rotate(0deg);--semi-transform_rotate-clockwise90deg:rotate(90deg);--semi-transform_rotate-clockwise180deg:rotate(180deg);--semi-transform_rotate-clockwise270deg:rotate(270deg);--semi-transform_rotate-clockwise360deg:rotate(360deg);--semi-transform_rotate-anticlockwise90deg:rotate(-90deg);--semi-transform_rotate-anticlockwise180deg:rotate(-180deg);--semi-transform_rotate-anticlockwise270deg:rotate(-270deg);--semi-transform_rotate-anticlockwise360deg:rotate(-360deg)}body,body .semi-always-light,:host,:host .semi-always-light{--semi-amber-0: 254,251,235;--semi-amber-1: 252,245,206;--semi-amber-2: 249,232,158;--semi-amber-3: 246,216,111;--semi-amber-4: 243,198,65;--semi-amber-5: 240,177,20;--semi-amber-6: 200,138,15;--semi-amber-7: 160,102,10;--semi-amber-8: 120,70,6;--semi-amber-9: 80,43,3;--semi-black: 0,0,0;--semi-blue-0: 234,245,255;--semi-blue-1: 203,231,254;--semi-blue-2: 152,205,253;--semi-blue-3: 101,178,252;--semi-blue-4: 50,149,251;--semi-blue-5: 0,100,250;--semi-blue-6: 0,98,214;--semi-blue-7: 0,79,179;--semi-blue-8: 0,61,143;--semi-blue-9: 0,44,107;--semi-cyan-0: 229,247,248;--semi-cyan-1: 194,239,240;--semi-cyan-2: 138,221,226;--semi-cyan-3: 88,203,211;--semi-cyan-4: 44,184,197;--semi-cyan-5: 5,164,182;--semi-cyan-6: 3,134,152;--semi-cyan-7: 1,105,121;--semi-cyan-8: 0,77,91;--semi-cyan-9: 0,50,61;--semi-green-0: 236,247,236;--semi-green-1: 208,240,209;--semi-green-2: 164,224,167;--semi-green-3: 125,209,130;--semi-green-4: 90,194,98;--semi-green-5: 59,179,70;--semi-green-6: 48,149,59;--semi-green-7: 37,119,47;--semi-green-8: 27,89,36;--semi-green-9: 17,60,24;--semi-grey-0: 249,249,249;--semi-grey-1: 230,232,234;--semi-grey-2: 198,202,205;--semi-grey-3: 167,171,176;--semi-grey-4: 136,141,146;--semi-grey-5: 107,112,117;--semi-grey-6: 85,91,97;--semi-grey-7: 65,70,76;--semi-grey-8: 46,50,56;--semi-grey-9: 28,31,35;--semi-indigo-0: 236,239,248;--semi-indigo-1: 209,216,240;--semi-indigo-2: 167,179,225;--semi-indigo-3: 128,144,211;--semi-indigo-4: 94,111,196;--semi-indigo-5: 63,81,181;--semi-indigo-6: 51,66,161;--semi-indigo-7: 40,52,140;--semi-indigo-8: 31,40,120;--semi-indigo-9: 23,29,99;--semi-light-blue-0: 233,247,253;--semi-light-blue-1: 201,236,252;--semi-light-blue-2: 149,216,248;--semi-light-blue-3: 98,195,245;--semi-light-blue-4: 48,172,241;--semi-light-blue-5: 0,149,238;--semi-light-blue-6: 0,123,202;--semi-light-blue-7: 0,99,167;--semi-light-blue-8: 0,75,131;--semi-light-blue-9: 0,53,95;--semi-light-green-0: 243,248,236;--semi-light-green-1: 227,240,208;--semi-light-green-2: 200,226,165;--semi-light-green-3: 173,211,126;--semi-light-green-4: 147,197,91;--semi-light-green-5: 123,182,60;--semi-light-green-6: 100,152,48;--semi-light-green-7: 78,121,38;--semi-light-green-8: 57,91,27;--semi-light-green-9: 37,61,18;--semi-lime-0: 242,250,230;--semi-lime-1: 227,246,197;--semi-lime-2: 203,237,142;--semi-lime-3: 183,227,91;--semi-lime-4: 167,218,44;--semi-lime-5: 155,209,0;--semi-lime-6: 126,174,0;--semi-lime-7: 99,139,0;--semi-lime-8: 72,104,0;--semi-lime-9: 47,70,0;--semi-orange-0: 255,248,234;--semi-orange-1: 254,238,204;--semi-orange-2: 254,217,152;--semi-orange-3: 253,193,101;--semi-orange-4: 253,166,51;--semi-orange-5: 252,136,0;--semi-orange-6: 210,103,0;--semi-orange-7: 168,74,0;--semi-orange-8: 126,49,0;--semi-orange-9: 84,29,0;--semi-pink-0: 253,236,239;--semi-pink-1: 251,207,216;--semi-pink-2: 246,160,181;--semi-pink-3: 242,115,150;--semi-pink-4: 237,72,123;--semi-pink-5: 233,30,99;--semi-pink-6: 197,19,86;--semi-pink-7: 162,11,72;--semi-pink-8: 126,5,58;--semi-pink-9: 90,1,43;--semi-purple-0: 247,233,247;--semi-purple-1: 239,202,240;--semi-purple-2: 221,155,224;--semi-purple-3: 201,111,209;--semi-purple-4: 180,73,194;--semi-purple-5: 158,40,179;--semi-purple-6: 135,30,158;--semi-purple-7: 113,22,138;--semi-purple-8: 92,15,117;--semi-purple-9: 73,10,97;--semi-red-0: 254,242,237;--semi-red-1: 254,221,210;--semi-red-2: 253,183,165;--semi-red-3: 251,144,120;--semi-red-4: 250,102,76;--semi-red-5: 249,57,32;--semi-red-6: 213,37,21;--semi-red-7: 178,20,12;--semi-red-8: 142,8,5;--semi-red-9: 106,1,3;--semi-teal-0: 228,247,244;--semi-teal-1: 192,240,232;--semi-teal-2: 135,224,211;--semi-teal-3: 84,209,193;--semi-teal-4: 39,194,176;--semi-teal-5: 0,179,161;--semi-teal-6: 0,149,137;--semi-teal-7: 0,119,111;--semi-teal-8: 0,89,85;--semi-teal-9: 0,60,58;--semi-violet-0: 243,237,249;--semi-violet-1: 226,209,244;--semi-violet-2: 196,167,233;--semi-violet-3: 166,127,221;--semi-violet-4: 136,91,210;--semi-violet-5: 106,58,199;--semi-violet-6: 87,47,179;--semi-violet-7: 70,37,158;--semi-violet-8: 54,28,138;--semi-violet-9: 40,20,117;--semi-white: 255,255,255;--semi-yellow-0: 255,253,234;--semi-yellow-1: 254,251,203;--semi-yellow-2: 253,243,152;--semi-yellow-3: 252,232,101;--semi-yellow-4: 251,218,50;--semi-yellow-5: 250,200,0;--semi-yellow-6: 208,170,0;--semi-yellow-7: 167,139,0;--semi-yellow-8: 125,106,0;--semi-yellow-9: 83,72,0;--semi-ai-purple-0: 248,237,255;--semi-ai-purple-1: 242,218,255;--semi-ai-purple-2: 227,181,255;--semi-ai-purple-3: 209,145,255;--semi-ai-purple-4: 189,108,255;--semi-ai-purple-5: 166,71,255;--semi-ai-purple-6: 134,54,219;--semi-ai-purple-7: 105,40,184;--semi-ai-purple-8: 78,28,148;--semi-ai-purple-9: 54,18,112;--semi-ai-general-0-3: 239,247,255;--semi-ai-general-0-2: 244,244,255;--semi-ai-general-0-1: 248,237,255;--semi-ai-general-0-0: 255,242,255;--semi-ai-general-1-3: 213,235,255;--semi-ai-general-1-2: 223,224,255;--semi-ai-general-1-1: 242,218,255;--semi-ai-general-1-0: 255,218,254;--semi-ai-general-2-3: 171,213,255;--semi-ai-general-2-2: 193,192,255;--semi-ai-general-2-1: 227,181,255;--semi-ai-general-2-0: 254,181,255;--semi-ai-general-3-3: 130,190,255;--semi-ai-general-3-2: 163,160,255;--semi-ai-general-3-1: 209,145,255;--semi-ai-general-3-0: 249,143,255;--semi-ai-general-4-3: 88,166,255;--semi-ai-general-4-2: 134,129,255;--semi-ai-general-4-1: 189,108,255;--semi-ai-general-4-0: 242,106,255;--semi-ai-general-5-3: 46,140,255;--semi-ai-general-5-2: 107,97,255;--semi-ai-general-5-1: 166,71,255;--semi-ai-general-5-0: 233,69,255;--semi-ai-general-6-3: 33,114,219;--semi-ai-general-6-2: 88,77,219;--semi-ai-general-6-1: 134,54,219;--semi-ai-general-6-0: 194,53,219;--semi-ai-general-7-3: 22,89,184;--semi-ai-general-7-2: 71,59,184;--semi-ai-general-7-1: 105,40,184;--semi-ai-general-7-0: 157,39,184;--semi-ai-general-8-3: 13,67,148;--semi-ai-general-8-2: 55,43,148;--semi-ai-general-8-1: 78,28,148;--semi-ai-general-8-0: 121,27,148;--semi-ai-general-9-3: 7,47,112;--semi-ai-general-9-2: 40,29,112;--semi-ai-general-9-1: 54,18,112;--semi-ai-general-9-0: 88,17,112;--semi-ai-general-0: linear-gradient(278deg, rgba(var(--semi-ai-general-0-0)) 0%, rgba(var(--semi-ai-general-0-1)) 30%, rgba(var(--semi-ai-general-0-2)) 60%, rgba(var(--semi-ai-general-0-3)) 100%);--semi-ai-general-1: linear-gradient(278deg, rgba(var(--semi-ai-general-1-0)) 0%, rgba(var(--semi-ai-general-1-1)) 30%, rgba(var(--semi-ai-general-1-2)) 60%, rgba(var(--semi-ai-general-1-3)) 100%);--semi-ai-general-2: linear-gradient(278deg, rgba(var(--semi-ai-general-2-0)) 0%, rgba(var(--semi-ai-general-2-1)) 30%, rgba(var(--semi-ai-general-2-2)) 60%, rgba(var(--semi-ai-general-2-3)) 100%);--semi-ai-general-3: linear-gradient(278deg, rgba(var(--semi-ai-general-3-0)) 0%, rgba(var(--semi-ai-general-3-1)) 30%, rgba(var(--semi-ai-general-3-2)) 60%, rgba(var(--semi-ai-general-3-3)) 100%);--semi-ai-general-4: linear-gradient(278deg, rgba(var(--semi-ai-general-4-0)) 0%, rgba(var(--semi-ai-general-4-1)) 30%, rgba(var(--semi-ai-general-4-2)) 60%, rgba(var(--semi-ai-general-4-3)) 100%);--semi-ai-general-5: linear-gradient(278deg, rgba(var(--semi-ai-general-5-0)) 0%, rgba(var(--semi-ai-general-5-1)) 30%, rgba(var(--semi-ai-general-5-2)) 60%, rgba(var(--semi-ai-general-5-3)) 100%);--semi-ai-general-6: linear-gradient(278deg, rgba(var(--semi-ai-general-6-0)) 0%, rgba(var(--semi-ai-general-6-1)) 30%, rgba(var(--semi-ai-general-6-2)) 60%, rgba(var(--semi-ai-general-6-3)) 100%);--semi-ai-general-7: linear-gradient(278deg, rgba(var(--semi-ai-general-7-0)) 0%, rgba(var(--semi-ai-general-7-1)) 30%, rgba(var(--semi-ai-general-7-2)) 60%, rgba(var(--semi-ai-general-7-3)) 100%);--semi-ai-general-8: linear-gradient(278deg, rgba(var(--semi-ai-general-8-0)) 0%, rgba(var(--semi-ai-general-8-1)) 30%, rgba(var(--semi-ai-general-8-2)) 60%, rgba(var(--semi-ai-general-8-3)) 100%);--semi-ai-general-9: linear-gradient(278deg, rgba(var(--semi-ai-general-9-0)) 0%, rgba(var(--semi-ai-general-9-1)) 30%, rgba(var(--semi-ai-general-9-2)) 60%, rgba(var(--semi-ai-general-9-3)) 100%)}body[theme-mode=dark],body .semi-always-dark,:host([theme-mode=dark]),:host .semi-always-dark{--semi-red-0: 108,9,11;--semi-red-1: 144,17,16;--semi-red-2: 180,32,25;--semi-red-3: 215,51,36;--semi-red-4: 251,73,50;--semi-red-5: 252,114,90;--semi-red-6: 253,153,131;--semi-red-7: 253,190,172;--semi-red-8: 254,224,213;--semi-red-9: 255,243,239;--semi-pink-0: 92,7,48;--semi-pink-1: 128,14,65;--semi-pink-2: 164,23,81;--semi-pink-3: 199,34,97;--semi-pink-4: 235,47,113;--semi-pink-5: 239,86,134;--semi-pink-6: 243,126,159;--semi-pink-7: 247,168,188;--semi-pink-8: 251,211,220;--semi-pink-9: 253,238,241;--semi-purple-0: 74,16,97;--semi-purple-1: 94,23,118;--semi-purple-2: 115,31,138;--semi-purple-3: 137,40,159;--semi-purple-4: 160,51,179;--semi-purple-5: 181,83,194;--semi-purple-6: 202,120,209;--semi-purple-7: 221,160,225;--semi-purple-8: 239,206,240;--semi-purple-9: 247,235,247;--semi-violet-0: 64,27,119;--semi-violet-1: 76,36,140;--semi-violet-2: 88,46,160;--semi-violet-3: 100,57,181;--semi-violet-4: 114,70,201;--semi-violet-5: 136,101,212;--semi-violet-6: 162,136,223;--semi-violet-7: 190,173,233;--semi-violet-8: 221,212,244;--semi-violet-9: 241,238,250;--semi-indigo-0: 23,30,101;--semi-indigo-1: 32,41,122;--semi-indigo-2: 41,54,142;--semi-indigo-3: 52,68,163;--semi-indigo-4: 64,83,183;--semi-indigo-5: 95,113,197;--semi-indigo-6: 129,145,212;--semi-indigo-7: 167,180,226;--semi-indigo-8: 209,216,241;--semi-indigo-9: 237,239,248;--semi-blue-0: 5,49,112;--semi-blue-1: 10,70,148;--semi-blue-2: 19,92,184;--semi-blue-3: 29,117,219;--semi-blue-4: 41,144,255;--semi-blue-5: 84,169,255;--semi-blue-6: 127,193,255;--semi-blue-7: 169,215,255;--semi-blue-8: 212,236,255;--semi-blue-9: 239,248,255;--semi-light-blue-0: 0,55,97;--semi-light-blue-1: 0,77,133;--semi-light-blue-2: 3,102,169;--semi-light-blue-3: 10,129,204;--semi-light-blue-4: 19,159,240;--semi-light-blue-5: 64,180,243;--semi-light-blue-6: 110,200,246;--semi-light-blue-7: 157,220,249;--semi-light-blue-8: 206,238,252;--semi-light-blue-9: 235,248,254;--semi-cyan-0: 4,52,61;--semi-cyan-1: 7,79,92;--semi-cyan-2: 10,108,123;--semi-cyan-3: 14,137,153;--semi-cyan-4: 19,168,184;--semi-cyan-5: 56,187,198;--semi-cyan-6: 98,205,212;--semi-cyan-7: 145,223,227;--semi-cyan-8: 198,239,241;--semi-cyan-9: 231,247,248;--semi-teal-0: 2,60,57;--semi-teal-1: 4,90,85;--semi-teal-2: 7,119,111;--semi-teal-3: 10,149,136;--semi-teal-4: 14,179,161;--semi-teal-5: 51,194,176;--semi-teal-6: 94,209,193;--semi-teal-7: 142,225,211;--semi-teal-8: 196,240,232;--semi-teal-9: 230,247,244;--semi-green-0: 18,60,25;--semi-green-1: 28,90,37;--semi-green-2: 39,119,49;--semi-green-3: 50,149,61;--semi-green-4: 62,179,73;--semi-green-5: 93,194,100;--semi-green-6: 127,209,132;--semi-green-7: 166,225,168;--semi-green-8: 208,240,209;--semi-green-9: 236,247,236;--semi-light-green-0: 38,61,19;--semi-light-green-1: 59,92,29;--semi-light-green-2: 81,123,40;--semi-light-green-3: 103,153,52;--semi-light-green-4: 127,184,64;--semi-light-green-5: 151,198,95;--semi-light-green-6: 176,212,129;--semi-light-green-7: 201,227,167;--semi-light-green-8: 228,241,209;--semi-light-green-9: 243,248,237;--semi-lime-0: 49,70,3;--semi-lime-1: 75,105,5;--semi-lime-2: 103,141,9;--semi-lime-3: 132,176,12;--semi-lime-4: 162,211,17;--semi-lime-5: 174,220,58;--semi-lime-6: 189,229,102;--semi-lime-7: 207,237,150;--semi-lime-8: 229,246,201;--semi-lime-9: 243,251,233;--semi-yellow-0: 84,73,3;--semi-yellow-1: 126,108,6;--semi-yellow-2: 168,142,10;--semi-yellow-3: 210,175,15;--semi-yellow-4: 252,206,20;--semi-yellow-5: 253,222,67;--semi-yellow-6: 253,235,113;--semi-yellow-7: 254,245,160;--semi-yellow-8: 254,251,208;--semi-yellow-9: 255,254,236;--semi-amber-0: 81,46,9;--semi-amber-1: 121,75,15;--semi-amber-2: 161,107,22;--semi-amber-3: 202,143,30;--semi-amber-4: 242,183,38;--semi-amber-5: 245,202,80;--semi-amber-6: 247,219,122;--semi-amber-7: 250,234,166;--semi-amber-8: 252,246,210;--semi-amber-9: 254,251,237;--semi-orange-0: 85,31,3;--semi-orange-1: 128,53,6;--semi-orange-2: 170,80,10;--semi-orange-3: 213,111,15;--semi-orange-4: 255,146,20;--semi-orange-5: 255,174,67;--semi-orange-6: 255,199,114;--semi-orange-7: 255,221,161;--semi-orange-8: 255,239,208;--semi-orange-9: 255,249,237;--semi-grey-0: 28,31,35;--semi-grey-1: 46,50,56;--semi-grey-2: 65,70,76;--semi-grey-3: 85,91,97;--semi-grey-4: 107,112,117;--semi-grey-5: 136,141,146;--semi-grey-6: 167,171,176;--semi-grey-7: 198,202,205;--semi-grey-8: 230,232,234;--semi-grey-9: 249,249,249;--semi-white: 255, 255, 255;--semi-black: 0, 0, 0;--semi-ai-purple-0: 58,23,112;--semi-ai-purple-1: 83,35,148;--semi-ai-purple-2: 111,49,184;--semi-ai-purple-3: 141,65,219;--semi-ai-purple-4: 167,68,255;--semi-ai-purple-5: 195,117,255;--semi-ai-purple-6: 213,152,255;--semi-ai-purple-7: 229,186,255;--semi-ai-purple-8: 243,221,255;--semi-ai-purple-9: 251,243,255;--semi-ai-general-0-0: 9,44,100;--semi-ai-general-0-1: 39,29,108;--semi-ai-general-0-2: 58,23,112;--semi-ai-general-0-3: 80,18,101;--semi-ai-general-1-0: 17,64,136;--semi-ai-general-1-1: 54,43,144;--semi-ai-general-1-2: 83,35,148;--semi-ai-general-1-3: 113,28,137;--semi-ai-general-2-0: 26,86,172;--semi-ai-general-2-1: 70,59,180;--semi-ai-general-2-2: 111,49,184;--semi-ai-general-2-3: 148,41,173;--semi-ai-general-3-0: 38,111,207;--semi-ai-general-3-1: 88,78,215;--semi-ai-general-3-2: 141,65,219;--semi-ai-general-3-3: 185,55,208;--semi-ai-general-4-0: 35,127,240;--semi-ai-general-4-1: 94,84,248;--semi-ai-general-4-2: 167,68,255;--semi-ai-general-4-3: 219,56,241;--semi-ai-general-5-0: 91,162,245;--semi-ai-general-5-1: 134,129,252;--semi-ai-general-5-2: 195,117,255;--semi-ai-general-5-3: 234,107,246;--semi-ai-general-6-0: 131,187,248;--semi-ai-general-6-1: 163,160,253;--semi-ai-general-6-2: 213,152,255;--semi-ai-general-6-3: 243,143,248;--semi-ai-general-7-0: 172,210,250;--semi-ai-general-7-1: 192,192,253;--semi-ai-general-7-2: 229,186,255;--semi-ai-general-7-3: 249,180,251;--semi-ai-general-8-0: 213,233,253;--semi-ai-general-8-1: 223,223,254;--semi-ai-general-8-2: 243,221,255;--semi-ai-general-8-3: 253,217,252;--semi-ai-general-9-0: 239,247,254;--semi-ai-general-9-1: 244,244,255;--semi-ai-general-9-2: 251,243,255;--semi-ai-general-9-3: 254,241,254;--semi-ai-general-0: linear-gradient(278deg, rgba(var(--semi-ai-general-0-0)) 0%, rgba(var(--semi-ai-general-0-1)) 30%, rgba(var(--semi-ai-general-0-2)) 60%, rgba(var(--semi-ai-general-0-3)) 100%);--semi-ai-general-1: linear-gradient(278deg, rgba(var(--semi-ai-general-1-0)) 0%, rgba(var(--semi-ai-general-1-1)) 30%, rgba(var(--semi-ai-general-1-2)) 60%, rgba(var(--semi-ai-general-1-3)) 100%);--semi-ai-general-2: linear-gradient(278deg, rgba(var(--semi-ai-general-2-0)) 0%, rgba(var(--semi-ai-general-2-1)) 30%, rgba(var(--semi-ai-general-2-2)) 60%, rgba(var(--semi-ai-general-2-3)) 100%);--semi-ai-general-3: linear-gradient(278deg, rgba(var(--semi-ai-general-3-0)) 0%, rgba(var(--semi-ai-general-3-1)) 30%, rgba(var(--semi-ai-general-3-2)) 60%, rgba(var(--semi-ai-general-3-3)) 100%);--semi-ai-general-4: linear-gradient(278deg, rgba(var(--semi-ai-general-4-0)) 0%, rgba(var(--semi-ai-general-4-1)) 30%, rgba(var(--semi-ai-general-4-2)) 60%, rgba(var(--semi-ai-general-4-3)) 100%);--semi-ai-general-5: linear-gradient(278deg, rgba(var(--semi-ai-general-5-0)) 0%, rgba(var(--semi-ai-general-5-1)) 30%, rgba(var(--semi-ai-general-5-2)) 60%, rgba(var(--semi-ai-general-5-3)) 100%);--semi-ai-general-6: linear-gradient(278deg, rgba(var(--semi-ai-general-6-0)) 0%, rgba(var(--semi-ai-general-6-1)) 30%, rgba(var(--semi-ai-general-6-2)) 60%, rgba(var(--semi-ai-general-6-3)) 100%);--semi-ai-general-7: linear-gradient(278deg, rgba(var(--semi-ai-general-7-0)) 0%, rgba(var(--semi-ai-general-7-1)) 30%, rgba(var(--semi-ai-general-7-2)) 60%, rgba(var(--semi-ai-general-7-3)) 100%);--semi-ai-general-8: linear-gradient(278deg, rgba(var(--semi-ai-general-8-0)) 0%, rgba(var(--semi-ai-general-8-1)) 30%, rgba(var(--semi-ai-general-8-2)) 60%, rgba(var(--semi-ai-general-8-3)) 100%);--semi-ai-general-9: linear-gradient(278deg, rgba(var(--semi-ai-general-9-0)) 0%, rgba(var(--semi-ai-general-9-1)) 30%, rgba(var(--semi-ai-general-9-2)) 60%, rgba(var(--semi-ai-general-9-3)) 100%)}body,body[theme-mode=dark] .semi-always-light,:host,:host .semi-always-light{font-family:Inter,-apple-system,BlinkMacSystemFont,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Segoe UI,Helvetica Neue,Helvetica,Arial,sans-serif;-webkit-font-smoothing:antialiased;--semi-color-white: rgba(var(--semi-white), 1);--semi-color-black: rgba(var(--semi-black), 1);--semi-color-primary: rgba(var(--semi-blue-5), 1);--semi-color-primary-hover: rgba(var(--semi-blue-6), 1);--semi-color-primary-active: rgba(var(--semi-blue-7), 1);--semi-color-primary-disabled: rgba(var(--semi-blue-2), 1);--semi-color-primary-light-default: rgba(var(--semi-blue-0), 1);--semi-color-primary-light-hover: rgba(var(--semi-blue-1), 1);--semi-color-primary-light-active: rgba(var(--semi-blue-2), 1);--semi-color-secondary: rgba(var(--semi-light-blue-5), 1);--semi-color-secondary-hover: rgba(var(--semi-light-blue-6), 1);--semi-color-secondary-active: rgba(var(--semi-light-blue-7), 1);--semi-color-secondary-disabled: rgba(var(--semi-light-blue-2), 1);--semi-color-secondary-light-default: rgba(var(--semi-light-blue-0), 1);--semi-color-secondary-light-hover: rgba(var(--semi-light-blue-1), 1);--semi-color-secondary-light-active: rgba(var(--semi-light-blue-2), 1);--semi-color-tertiary: rgba(var(--semi-grey-5), 1);--semi-color-tertiary-hover: rgba(var(--semi-grey-6), 1);--semi-color-tertiary-active: rgba(var(--semi-grey-7), 1);--semi-color-tertiary-light-default: rgba(var(--semi-grey-0), 1);--semi-color-tertiary-light-hover: rgba(var(--semi-grey-1), 1);--semi-color-tertiary-light-active: rgba(var(--semi-grey-2), 1);--semi-color-default: rgba(var(--semi-grey-0), 1);--semi-color-default-hover: rgba(var(--semi-grey-1), 1);--semi-color-default-active: rgba(var(--semi-grey-2), 1);--semi-color-info: rgba(var(--semi-blue-5), 1);--semi-color-info-hover: rgba(var(--semi-blue-6), 1);--semi-color-info-active: rgba(var(--semi-blue-7), 1);--semi-color-info-disabled: rgba(var(--semi-blue-2), 1);--semi-color-info-light-default: rgba(var(--semi-blue-0), 1);--semi-color-info-light-hover: rgba(var(--semi-blue-1), 1);--semi-color-info-light-active: rgba(var(--semi-blue-2), 1);--semi-color-success: rgba(var(--semi-green-5), 1);--semi-color-success-hover: rgba(var(--semi-green-6), 1);--semi-color-success-active: rgba(var(--semi-green-7), 1);--semi-color-success-disabled: rgba(var(--semi-green-2), 1);--semi-color-success-light-default: rgba(var(--semi-green-0), 1);--semi-color-success-light-hover: rgba(var(--semi-green-1), 1);--semi-color-success-light-active: rgba(var(--semi-green-2), 1);--semi-color-danger: rgba(var(--semi-red-5), 1);--semi-color-danger-hover: rgba(var(--semi-red-6), 1);--semi-color-danger-active: rgba(var(--semi-red-7), 1);--semi-color-danger-light-default: rgba(var(--semi-red-0), 1);--semi-color-danger-light-hover: rgba(var(--semi-red-1), 1);--semi-color-danger-light-active: rgba(var(--semi-red-2), 1);--semi-color-warning: rgba(var(--semi-orange-5), 1);--semi-color-warning-hover: rgba(var(--semi-orange-6), 1);--semi-color-warning-active: rgba(var(--semi-orange-7), 1);--semi-color-warning-light-default: rgba(var(--semi-orange-0), 1);--semi-color-warning-light-hover: rgba(var(--semi-orange-1), 1);--semi-color-warning-light-active: rgba(var(--semi-orange-2), 1);--semi-color-focus-border: rgba(var(--semi-blue-5), 1);--semi-color-disabled-text: rgba(var(--semi-grey-9), .35);--semi-color-disabled-border: rgba(var(--semi-grey-1), 1);--semi-color-disabled-bg: rgba(var(--semi-grey-1), 1);--semi-color-disabled-fill: rgba(var(--semi-grey-8), .04);--semi-color-shadow: rgba(var(--semi-black), .04);--semi-color-link: rgba(var(--semi-blue-5), 1);--semi-color-link-hover: rgba(var(--semi-blue-6), 1);--semi-color-link-active: rgba(var(--semi-blue-7), 1);--semi-color-link-visited: rgba(var(--semi-blue-5), 1);--semi-color-border: rgba(var(--semi-grey-9), .08);--semi-color-nav-bg: rgba(var(--semi-white), 1);--semi-color-overlay-bg: rgba(22, 22, 26, .6);--semi-color-fill-0: rgba(var(--semi-grey-8), .05);--semi-color-fill-1: rgba(var(--semi-grey-8), .09);--semi-color-fill-2: rgba(var(--semi-grey-8), .13);--semi-color-bg-0: rgba(var(--semi-white), 1);--semi-color-bg-1: rgba(var(--semi-white), 1);--semi-color-bg-2: rgba(var(--semi-white), 1);--semi-color-bg-3: rgba(var(--semi-white), 1);--semi-color-bg-4: rgba(var(--semi-white), 1);--semi-color-text-0: rgba(var(--semi-grey-9), 1);--semi-color-text-1: rgba(var(--semi-grey-9), .8);--semi-color-text-2: rgba(var(--semi-grey-9), .62);--semi-color-text-3: rgba(var(--semi-grey-9), .35);--semi-shadow-elevated: 0 0 1px rgba(0, 0, 0, .3), 0 4px 14px rgba(0, 0, 0, .1);--semi-border-radius-extra-small: 3px;--semi-border-radius-small: 3px;--semi-border-radius-medium: 6px;--semi-border-radius-large: 12px;--semi-border-radius-circle: 50%;--semi-border-radius-full: 9999px;--semi-color-highlight-bg: rgba(var(--semi-yellow-4), 1);--semi-color-highlight: rgba(var(--semi-black), 1);--semi-color-data-0: rgba(87, 105, 255, 1);--semi-color-data-1: rgba(142, 212, 231, 1);--semi-color-data-2: rgba(245, 135, 0, 1);--semi-color-data-3: rgba(220, 183, 252, 1);--semi-color-data-4: rgba(74, 156, 247, 1);--semi-color-data-5: rgba(243, 204, 53, 1);--semi-color-data-6: rgba(254, 128, 144, 1);--semi-color-data-7: rgba(139, 215, 210, 1);--semi-color-data-8: rgba(131, 176, 35, 1);--semi-color-data-9: rgba(233, 165, 229, 1);--semi-color-data-10: rgba(48, 167, 206, 1);--semi-color-data-11: rgba(249, 192, 100, 1);--semi-color-data-12: rgba(177, 113, 249, 1);--semi-color-data-13: rgba(119, 182, 249, 1);--semi-color-data-14: rgba(200, 143, 2, 1);--semi-color-data-15: rgba(255, 170, 178, 1);--semi-color-data-16: rgba(51, 176, 171, 1);--semi-color-data-17: rgba(182, 215, 129, 1);--semi-color-data-18: rgba(212, 88, 212, 1);--semi-color-data-19: rgba(188, 198, 255, 1);--semi-color-ai-general: var(--semi-ai-general-5);--semi-color-ai-general-hover: var(--semi-ai-general-6);--semi-color-ai-general-active: var(--semi-ai-general-7);--semi-color-ai-general-disabled: var(--semi-ai-general-2);--semi-color-ai-purple: rgba(var(--semi-ai-purple-5));--semi-color-ai-purple-hover: rgba(var(--semi-ai-purple-6));--semi-color-ai-purple-active: rgba(var(--semi-ai-purple-7));--semi-color-ai-purple-disabled: rgba(var(--semi-ai-purple-2));--semi-color-ai-background-bottom: linear-gradient(201.15deg, rgba(255, 255, 255, .04) 6.58%, rgba(255, 226, 138, .04) 32.88%, rgba(231, 45, 255, .04) 67.93%, rgba(0, 115, 255, .04) 94.23%);--semi-color-ai-background-bottom-hover: linear-gradient(201.15deg, rgba(255, 255, 255, .08) 6.58%, rgba(255, 226, 138, .08) 32.88%, rgba(231, 45, 255, .08) 67.93%, rgba(0, 115, 255, .08) 94.23%);--semi-color-ai-background-bottom-active: linear-gradient(201.15deg, rgba(255, 255, 255, .12) 6.58%, rgba(255, 226, 138, .12) 32.88%, rgba(231, 45, 255, .12) 67.93%, rgba(0, 115, 255, .12) 94.23%);--semi-color-ai-background-top: linear-gradient(201.15deg, rgba(83, 56, 255, .16) 6.58%, rgba(176, 48, 240, .096) 32.88%, rgba(231, 45, 255, .048) 59.17%, rgba(255, 255, 255, 0) 94.23%);--semi-color-ai-background-top-hover: linear-gradient(201.15deg, rgba(83, 56, 255, .24) 6.58%, rgba(176, 48, 240, .144) 32.88%, rgba(231, 45, 255, .072) 59.17%, rgba(255, 255, 255, 0) 94.23%);--semi-color-ai-background-top-hover: linear-gradient(201.15deg, rgba(83, 56, 255, .32) 6.58%, rgba(176, 48, 240, .192) 32.88%, rgba(231, 45, 255, .096) 59.17%, rgba(255, 255, 255, 0) 94.23%)}body[theme-mode=dark],body .semi-always-dark,:host([theme-mode=dark]),:host .semi-always-dark{font-family:Inter,-apple-system,BlinkMacSystemFont,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Segoe UI,Helvetica Neue,Helvetica,Arial,sans-serif;-webkit-font-smoothing:antialiased;--semi-color-white: rgba(228, 231, 245, 1);--semi-color-black: rgba(var(--semi-black), 1);--semi-color-primary: rgba(var(--semi-blue-5), 1);--semi-color-primary-hover: rgba(var(--semi-blue-6), 1);--semi-color-primary-active: rgba(var(--semi-blue-7), 1);--semi-color-primary-disabled: rgba(var(--semi-blue-2), 1);--semi-color-primary-light-default: rgba(var(--semi-blue-5), .2);--semi-color-primary-light-hover: rgba(var(--semi-blue-5), .3);--semi-color-primary-light-active: rgba(var(--semi-blue-5), .4);--semi-color-secondary: rgba(var(--semi-light-blue-5), 1);--semi-color-secondary-hover: rgba(var(--semi-light-blue-6), 1);--semi-color-secondary-active: rgba(var(--semi-light-blue-7), 1);--semi-color-secondary-disabled: rgba(var(--semi-light-blue-2), 1);--semi-color-secondary-light-default: rgba(var(--semi-light-blue-5), .2);--semi-color-secondary-light-hover: rgba(var(--semi-light-blue-5), .3);--semi-color-secondary-light-active: rgba(var(--semi-light-blue-5), .4);--semi-color-tertiary: rgba(var(--semi-grey-5), 1);--semi-color-tertiary-hover: rgba(var(--semi-grey-6), 1);--semi-color-tertiary-active: rgba(var(--semi-grey-7), 1);--semi-color-tertiary-light-default: rgba(var(--semi-grey-5), .2);--semi-color-tertiary-light-hover: rgba(var(--semi-grey-5), .3);--semi-color-tertiary-light-active: rgba(var(--semi-grey-5), .4);--semi-color-default: rgba(var(--semi-grey-0), 1);--semi-color-default-hover: rgba(var(--semi-grey-1), 1);--semi-color-default-active: rgba(var(--semi-grey-2), 1);--semi-color-info: rgba(var(--semi-blue-5), 1);--semi-color-info-hover: rgba(var(--semi-blue-6), 1);--semi-color-info-active: rgba(var(--semi-blue-7), 1);--semi-color-info-disabled: rgba(var(--semi-blue-2), 1);--semi-color-info-light-default: rgba(var(--semi-blue-5), .2);--semi-color-info-light-hover: rgba(var(--semi-blue-5), .3);--semi-color-info-light-active: rgba(var(--semi-blue-5), .4);--semi-color-success: rgba(var(--semi-green-5), 1);--semi-color-success-hover: rgba(var(--semi-green-6), 1);--semi-color-success-active: rgba(var(--semi-green-7), 1);--semi-color-success-disabled: rgba(var(--semi-green-2), 1);--semi-color-success-light-default: rgba(var(--semi-green-5), .2);--semi-color-success-light-hover: rgba(var(--semi-green-5), .3);--semi-color-success-light-active: rgba(var(--semi-green-5), .4);--semi-color-danger: rgba(var(--semi-red-5), 1);--semi-color-danger-hover: rgba(var(--semi-red-6), 1);--semi-color-danger-active: rgba(var(--semi-red-7), 1);--semi-color-danger-light-default: rgba(var(--semi-red-5), .2);--semi-color-danger-light-hover: rgba(var(--semi-red-5), .3);--semi-color-danger-light-active: rgba(var(--semi-red-5), .4);--semi-color-warning: rgba(var(--semi-orange-5), 1);--semi-color-warning-hover: rgba(var(--semi-orange-6), 1);--semi-color-warning-active: rgba(var(--semi-orange-7), 1);--semi-color-warning-light-default: rgba(var(--semi-orange-5), .2);--semi-color-warning-light-hover: rgba(var(--semi-orange-5), .3);--semi-color-warning-light-active: rgba(var(--semi-orange-5), .4);--semi-color-focus-border: rgba(var(--semi-blue-5), 1);--semi-color-disabled-text: rgba(var(--semi-grey-9), .35);--semi-color-disabled-border: rgba(var(--semi-grey-1), 1);--semi-color-disabled-bg: rgba(var(--semi-grey-1), 1);--semi-color-disabled-fill: rgba(var(--semi-grey-8), .04);--semi-color-link: rgba(var(--semi-blue-5), 1);--semi-color-link-hover: rgba(var(--semi-blue-6), 1);--semi-color-link-active: rgba(var(--semi-blue-7), 1);--semi-color-link-visited: rgba(var(--semi-blue-5), 1);--semi-color-nav-bg: rgba(35, 36, 41, 1);--semi-shadow-elevated: inset 0 0 0 1px rgba(255, 255, 255, .1), 0 4px 14px rgba(0, 0, 0, .25);--semi-color-overlay-bg: rgba(22, 22, 26, .6);--semi-color-fill-0: rgba(var(--semi-white), .12);--semi-color-fill-1: rgba(var(--semi-white), .16);--semi-color-fill-2: rgba(var(--semi-white), .2);--semi-color-border: rgba(var(--semi-white), .08);--semi-color-shadow: rgba(var(--semi-black), .04);--semi-color-bg-0: rgba(22, 22, 26, 1);--semi-color-bg-1: rgba(35, 36, 41, 1);--semi-color-bg-2: rgba(53, 54, 60, 1);--semi-color-bg-3: rgba(67, 68, 74, 1);--semi-color-bg-4: rgba(79, 81, 89, 1);--semi-color-text-0: rgba(var(--semi-grey-9), 1);--semi-color-text-1: rgba(var(--semi-grey-9), .8);--semi-color-text-2: rgba(var(--semi-grey-9), .6);--semi-color-text-3: rgba(var(--semi-grey-9), .35);--semi-border-radius-extra-small: 3px;--semi-border-radius-small: 3px;--semi-border-radius-medium: 6px;--semi-border-radius-large: 12px;--semi-border-radius-circle: 50%;--semi-border-radius-full: 9999px;--semi-color-highlight-bg: rgba(var(--semi-yellow-2), 1);--semi-color-highlight: rgba(var(--semi-white), 1);--semi-color-data-0: rgba(94, 109, 194, 1);--semi-color-data-1: rgba(8, 104, 120, 1);--semi-color-data-2: rgba(250, 173, 63, 1);--semi-color-data-3: rgba(76, 43, 156, 1);--semi-color-data-4: rgba(16, 125, 248, 1);--semi-color-data-5: rgba(248, 202, 16, 1);--semi-color-data-6: rgba(195, 30, 87, 1);--semi-color-data-7: rgba(5, 119, 115, 1);--semi-color-data-8: rgba(154, 207, 13, 1);--semi-color-data-9: rgba(117, 29, 138, 1);--semi-color-data-10: rgba(16, 162, 180, 1);--semi-color-data-11: rgba(208, 110, 11, 1);--semi-color-data-12: rgba(113, 66, 197, 1);--semi-color-data-13: rgba(7, 100, 212, 1);--semi-color-data-14: rgba(251, 232, 110, 1);--semi-color-data-15: rgba(160, 19, 73, 1);--semi-color-data-16: rgba(11, 179, 167, 1);--semi-color-data-17: rgba(98, 138, 6, 1);--semi-color-data-18: rgba(162, 48, 179, 1);--semi-color-data-19: rgba(40, 51, 138, 1);--semi-color-ai-general: var(--semi-ai-general-5);--semi-color-ai-general-hover: var(--semi-ai-general-6);--semi-color-ai-general-active: var(--semi-ai-general-7);--semi-color-ai-general-disabled: var(--semi-ai-general-2);--semi-color-ai-purple: rgba(var(--semi-ai-purple-5));--semi-color-ai-purple-hover: rgba(var(--semi-ai-purple-6));--semi-color-ai-purple-active: rgba(var(--semi-ai-purple-7));--semi-color-ai-purple-disabled: rgba(var(--semi-ai-purple-2));--semi-color-ai-background-bottom: linear-gradient(201.15deg, rgba(255, 226, 138, .2) 6.58%, rgba(231, 45, 255, .2) 50.4%, rgba(0, 115, 255, .2) 94.23%);--semi-color-ai-background-bottom-hover: linear-gradient(201.15deg, rgba(255, 226, 138, .3) 6.58%, rgba(231, 45, 255, .3) 50.4%, rgba(0, 115, 255, .3) 94.23%);--semi-color-ai-background-bottom-active: linear-gradient(201.15deg, rgba(255, 226, 138, .4) 6.58%, rgba(231, 45, 255, .4) 50.4%, rgba(0, 115, 255, .4) 94.23%);--semi-color-ai-background-top: linear-gradient(201.15deg, rgba(83, 56, 255, .36) 6.58%, rgba(176, 48, 240, .216) 32.88%, rgba(154, 0, 174, .108) 59.17%, rgba(0, 0, 0, 0) 94.23%);--semi-color-ai-background-top-hover: linear-gradient(201.15deg, rgba(83, 56, 255, .54) 6.58%, rgba(176, 48, 240, .324) 32.88%, rgba(154, 0, 174, .162) 59.17%, rgba(0, 0, 0, 0) 94.23%);--semi-color-ai-background-top-hover: linear-gradient(201.15deg, rgba(83, 56, 255, .72) 6.58%, rgba(176, 48, 240, .432) 32.88%, rgba(154, 0, 174, .216) 59.17%, rgba(0, 0, 0, 0) 94.23%)}.semi-light-scrollbar::-webkit-scrollbar,.semi-light-scrollbar *::-webkit-scrollbar{width:8px;height:8px}.semi-light-scrollbar::-webkit-scrollbar-track,.semi-light-scrollbar *::-webkit-scrollbar-track{background:#0000}.semi-light-scrollbar::-webkit-scrollbar-corner,.semi-light-scrollbar *::-webkit-scrollbar-corner{background-color:#0000}.semi-light-scrollbar::-webkit-scrollbar-thumb,.semi-light-scrollbar *::-webkit-scrollbar-thumb{border-radius:6px;background:transparent;transition:all 1s}.semi-light-scrollbar:hover::-webkit-scrollbar-thumb,.semi-light-scrollbar *:hover::-webkit-scrollbar-thumb{background:var(--semi-color-fill-2)}.semi-light-scrollbar::-webkit-scrollbar-thumb:hover,.semi-light-scrollbar *::-webkit-scrollbar-thumb:hover{background:var(--semi-color-fill-1)}.semi-typography{color:var(--semi-color-text-0);font-size:14px;line-height:20px;font-family:Inter,-apple-system,BlinkMacSystemFont,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Segoe UI,Helvetica Neue,Helvetica,Arial,sans-serif}.semi-typography.semi-typography-secondary{color:var(--semi-color-text-1)}.semi-typography.semi-typography-tertiary{color:var(--semi-color-text-2)}.semi-typography.semi-typography-quaternary{color:var(--semi-color-text-3)}.semi-typography.semi-typography-warning{color:var(--semi-color-warning)}.semi-typography.semi-typography-success{color:var(--semi-color-success)}.semi-typography.semi-typography-danger{color:var(--semi-color-danger)}.semi-typography.semi-typography-link{color:var(--semi-color-link);font-weight:600}.semi-typography.semi-typography-disabled{color:var(--semi-color-disabled-text);cursor:not-allowed;-webkit-user-select:none;user-select:none}.semi-typography.semi-typography-disabled.semi-typography-link{color:var(--semi-color-link)}.semi-typography-icon{margin-right:4px;vertical-align:middle;color:inherit}.semi-typography-small{font-size:12px;line-height:16px;font-family:Inter,-apple-system,BlinkMacSystemFont,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Segoe UI,Helvetica Neue,Helvetica,Arial,sans-serif;font-weight:400}.semi-typography-small.semi-typography-paragraph{font-weight:400}.semi-typography code{border:1px solid var(--semi-color-border);border-radius:2px;color:var(--semi-color-text-2);background-color:var(--semi-color-fill-1);padding:2px 4px}.semi-typography mark{background-color:var(--semi-color-primary-light-default)}.semi-typography u{text-decoration:underline;text-decoration-skip-ink:auto}.semi-typography del{text-decoration:line-through}.semi-typography strong{font-weight:600}.semi-typography a{display:inline;color:var(--semi-color-link);cursor:pointer;text-decoration:none}.semi-typography a:visited{color:var(--semi-color-link-visited)}.semi-typography a:hover{color:var(--semi-color-link-hover)}.semi-typography a:active{color:var(--semi-color-link-active)}.semi-typography a .semi-typography-link-underline:hover{border-bottom:1px solid var(--semi-color-link-hover);margin-bottom:-1px}.semi-typography a .semi-typography-link-underline:active{border-bottom:1px solid var(--semi-color-link-active);margin-bottom:-1px}.semi-typography-ellipsis-single-line{overflow:hidden}.semi-typography-ellipsis-multiple-line{display:-webkit-box;-webkit-box-orient:vertical;overflow:hidden}.semi-typography-ellipsis-multiple-line.semi-typography-ellipsis-multiple-line-text{display:-webkit-inline-box}.semi-typography-ellipsis-overflow-ellipsis{display:block;white-space:nowrap;text-overflow:ellipsis}.semi-typography-ellipsis-overflow-ellipsis.semi-typography-ellipsis-overflow-ellipsis-text{display:inline-block;max-width:100%;vertical-align:top}.semi-typography-ellipsis-expand{display:inline;margin-left:8px}.semi-typography-action-copy{display:inline-flex;vertical-align:middle;padding:0;margin-left:4px}.semi-typography a.semi-typography-action-copy-icon{display:inline-flex}.semi-typography-action-copied{display:inline-flex;padding:0;margin-left:4px;color:var(--semi-color-text-2)}.semi-typography-action-copied .semi-icon{vertical-align:middle;color:var(--semi-color-success)}.semi-typography-paragraph{margin:0}h1.semi-typography,.semi-typography-h1.semi-typography{font-size:32px;line-height:44px;font-family:Inter,-apple-system,BlinkMacSystemFont,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Segoe UI,Helvetica Neue,Helvetica,Arial,sans-serif;font-weight:600;margin:0}h1.semi-typography.semi-typography-h1-weight-light,.semi-typography-h1.semi-typography.semi-typography-h1-weight-light{font-weight:200}h1.semi-typography.semi-typography-h1-weight-regular,.semi-typography-h1.semi-typography.semi-typography-h1-weight-regular{font-weight:400}h1.semi-typography.semi-typography-h1-weight-medium,.semi-typography-h1.semi-typography.semi-typography-h1-weight-medium{font-weight:500}h1.semi-typography.semi-typography-h1-weight-semibold,.semi-typography-h1.semi-typography.semi-typography-h1-weight-semibold{font-weight:600}h1.semi-typography.semi-typography-h1-weight-bold,.semi-typography-h1.semi-typography.semi-typography-h1-weight-bold{font-weight:700}h2.semi-typography,.semi-typography-h2.semi-typography{font-size:28px;line-height:40px;font-family:Inter,-apple-system,BlinkMacSystemFont,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Segoe UI,Helvetica Neue,Helvetica,Arial,sans-serif;font-weight:600;margin:0}h2.semi-typography.semi-typography-h2-weight-light,.semi-typography-h2.semi-typography.semi-typography-h2-weight-light{font-weight:200}h2.semi-typography.semi-typography-h2-weight-regular,.semi-typography-h2.semi-typography.semi-typography-h2-weight-regular{font-weight:400}h2.semi-typography.semi-typography-h2-weight-medium,.semi-typography-h2.semi-typography.semi-typography-h2-weight-medium{font-weight:500}h2.semi-typography.semi-typography-h2-weight-semibold,.semi-typography-h2.semi-typography.semi-typography-h2-weight-semibold{font-weight:600}h2.semi-typography.semi-typography-h2-weight-bold,.semi-typography-h2.semi-typography.semi-typography-h2-weight-bold{font-weight:700}h3.semi-typography,.semi-typography-h3.semi-typography{font-size:24px;line-height:32px;font-family:Inter,-apple-system,BlinkMacSystemFont,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Segoe UI,Helvetica Neue,Helvetica,Arial,sans-serif;font-weight:600;margin:0}h3.semi-typography.semi-typography-h3-weight-light,.semi-typography-h3.semi-typography.semi-typography-h3-weight-light{font-weight:200}h3.semi-typography.semi-typography-h3-weight-regular,.semi-typography-h3.semi-typography.semi-typography-h3-weight-regular{font-weight:400}h3.semi-typography.semi-typography-h3-weight-medium,.semi-typography-h3.semi-typography.semi-typography-h3-weight-medium{font-weight:500}h3.semi-typography.semi-typography-h3-weight-semibold,.semi-typography-h3.semi-typography.semi-typography-h3-weight-semibold{font-weight:600}h3.semi-typography.semi-typography-h3-weight-bold,.semi-typography-h3.semi-typography.semi-typography-h3-weight-bold{font-weight:700}h4.semi-typography,.semi-typography-h4.semi-typography{font-size:20px;line-height:28px;font-family:Inter,-apple-system,BlinkMacSystemFont,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Segoe UI,Helvetica Neue,Helvetica,Arial,sans-serif;font-weight:600;margin:0}h4.semi-typography.semi-typography-h4-weight-light,.semi-typography-h4.semi-typography.semi-typography-h4-weight-light{font-weight:200}h4.semi-typography.semi-typography-h4-weight-regular,.semi-typography-h4.semi-typography.semi-typography-h4-weight-regular{font-weight:400}h4.semi-typography.semi-typography-h4-weight-medium,.semi-typography-h4.semi-typography.semi-typography-h4-weight-medium{font-weight:500}h4.semi-typography.semi-typography-h4-weight-semibold,.semi-typography-h4.semi-typography.semi-typography-h4-weight-semibold{font-weight:600}h4.semi-typography.semi-typography-h4-weight-bold,.semi-typography-h4.semi-typography.semi-typography-h4-weight-bold{font-weight:700}h5.semi-typography,.semi-typography-h5.semi-typography{font-size:18px;line-height:24px;font-family:Inter,-apple-system,BlinkMacSystemFont,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Segoe UI,Helvetica Neue,Helvetica,Arial,sans-serif;font-weight:600;margin:0}h5.semi-typography.semi-typography-h5-weight-light,.semi-typography-h5.semi-typography.semi-typography-h5-weight-light{font-weight:200}h5.semi-typography.semi-typography-h5-weight-regular,.semi-typography-h5.semi-typography.semi-typography-h5-weight-regular{font-weight:400}h5.semi-typography.semi-typography-h5-weight-medium,.semi-typography-h5.semi-typography.semi-typography-h5-weight-medium{font-weight:500}h5.semi-typography.semi-typography-h5-weight-semibold,.semi-typography-h5.semi-typography.semi-typography-h5-weight-semibold{font-weight:600}h5.semi-typography.semi-typography-h5-weight-bold,.semi-typography-h5.semi-typography.semi-typography-h5-weight-bold{font-weight:700}h6.semi-typography,.semi-typography-h6.semi-typography{font-size:16px;line-height:22px;font-family:Inter,-apple-system,BlinkMacSystemFont,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Segoe UI,Helvetica Neue,Helvetica,Arial,sans-serif;font-weight:600;margin:0}h6.semi-typography.semi-typography-h6-weight-light,.semi-typography-h6.semi-typography.semi-typography-h6-weight-light{font-weight:200}h6.semi-typography.semi-typography-h6-weight-regular,.semi-typography-h6.semi-typography.semi-typography-h6-weight-regular{font-weight:400}h6.semi-typography.semi-typography-h6-weight-medium,.semi-typography-h6.semi-typography.semi-typography-h6-weight-medium{font-weight:500}h6.semi-typography.semi-typography-h6-weight-semibold,.semi-typography-h6.semi-typography.semi-typography-h6-weight-semibold{font-weight:600}h6.semi-typography.semi-typography-h6-weight-bold,.semi-typography-h6.semi-typography.semi-typography-h6-weight-bold{font-weight:700}p.semi-typography-extended,.semi-typography-paragraph.semi-typography-extended{line-height:24px;font-weight:400}.semi-rtl .semi-typography,.semi-portal-rtl .semi-typography{direction:rtl}.semi-rtl .semi-typography-link a,.semi-rtl .semi-typography a,.semi-portal-rtl .semi-typography-link a,.semi-portal-rtl .semi-typography a{display:inline-block}.semi-rtl .semi-typography-icon,.semi-portal-rtl .semi-typography-icon{margin-right:auto;margin-left:4px}.semi-rtl .semi-typography-ellipsis-expand,.semi-portal-rtl .semi-typography-ellipsis-expand{margin-left:auto}.semi-rtl .semi-typography-action-copy,.semi-portal-rtl .semi-typography-action-copy,.semi-rtl .semi-typography-action-copied,.semi-portal-rtl .semi-typography-action-copied{margin-left:auto;margin-right:4px}@keyframes semi-tooltip-zoomIn{0%{opacity:0;transform:scale(.8)}50%{opacity:1}}@keyframes semi-tooltip-bounceIn{0%{opacity:0;transform:scale(.6)}70%{opacity:1;transform:scale(1.01)}to{opacity:1;transform:scale(1);animation-timing-function:cubic-bezier(.215,.61,.355,1)}}@keyframes semi-tooltip-zoomOut{0%{opacity:1}60%{opacity:0;transform:scale(.8)}to{opacity:0}}.semi-tooltip-wrapper{position:relative;background-color:rgba(var(--semi-grey-7),1);-webkit-backdrop-filter:none;backdrop-filter:none;color:var(--semi-color-bg-0);border-radius:var(--semi-border-radius-medium);padding:8px 12px;left:0;top:0;word-wrap:break-word;overflow-wrap:break-word;font-size:14px;line-height:20px;font-family:Inter,-apple-system,BlinkMacSystemFont,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Segoe UI,Helvetica Neue,Helvetica,Arial,sans-serif;opacity:0;max-width:240px}.semi-tooltip-wrapper-show{opacity:1}.semi-tooltip-content{min-width:0}.semi-tooltip-trigger{display:inline-block;width:auto;height:auto}.semi-tooltip-with-arrow{display:flex;align-items:center;justify-content:center;box-sizing:border-box}.semi-tooltip-animation-show{animation:semi-tooltip-zoomIn .1s cubic-bezier(.215,.61,.355,1);animation-fill-mode:forwards}.semi-tooltip-animation-hide{animation:semi-tooltip-zoomOut .1s cubic-bezier(.215,.61,.355,1);animation-fill-mode:forwards}.semi-tooltip-wrapper .semi-tooltip-icon-arrow{height:7px;width:24px;position:absolute;color:rgba(var(--semi-grey-7),1)}.semi-tooltip-wrapper[x-placement=top] .semi-tooltip-icon-arrow{left:var(--semi-tooltip-arrow-offset-x, 50%);transform:translate(-50%);bottom:-6px}.semi-tooltip-wrapper[x-placement=top].semi-tooltip-with-arrow,.semi-tooltip-wrapper[x-placement=top] .semi-tooltip-with-arrow{min-width:36px}.semi-tooltip-wrapper[x-placement=topLeft] .semi-tooltip-icon-arrow{bottom:-6px;left:6px}.semi-tooltip-wrapper[x-placement=topLeft].semi-tooltip-with-arrow,.semi-tooltip-wrapper[x-placement=topLeft] .semi-tooltip-with-arrow{min-width:36px}.semi-tooltip-wrapper[x-placement=topRight] .semi-tooltip-icon-arrow{bottom:-6px;right:6px}.semi-tooltip-wrapper[x-placement=topRight].semi-tooltip-with-arrow,.semi-tooltip-wrapper[x-placement=topRight] .semi-tooltip-with-arrow{min-width:36px}.semi-tooltip-wrapper[x-placement=leftTop] .semi-tooltip-icon-arrow{width:7px;height:24px;right:-6px;top:5px}.semi-tooltip-wrapper[x-placement=leftTop].semi-tooltip-with-arrow,.semi-tooltip-wrapper[x-placement=leftTop] .semi-tooltip-with-arrow{min-height:34px}.semi-tooltip-wrapper[x-placement=left] .semi-tooltip-icon-arrow{width:7px;height:24px;right:-6px;top:var(--semi-tooltip-arrow-offset-y, 50%);transform:translateY(-50%)}.semi-tooltip-wrapper[x-placement=left].semi-tooltip-with-arrow,.semi-tooltip-wrapper[x-placement=left] .semi-tooltip-with-arrow{min-height:34px}.semi-tooltip-wrapper[x-placement=leftBottom] .semi-tooltip-icon-arrow{width:7px;height:24px;right:-6px;bottom:5px}.semi-tooltip-wrapper[x-placement=leftBottom].semi-tooltip-with-arrow,.semi-tooltip-wrapper[x-placement=leftBottom] .semi-tooltip-with-arrow{min-height:34px}.semi-tooltip-wrapper[x-placement=rightTop] .semi-tooltip-icon-arrow{width:7px;height:24px;left:-6px;top:5px;transform:rotate(180deg)}.semi-tooltip-wrapper[x-placement=rightTop].semi-tooltip-with-arrow,.semi-tooltip-wrapper[x-placement=rightTop] .semi-tooltip-with-arrow{min-height:34px}.semi-tooltip-wrapper[x-placement=right] .semi-tooltip-icon-arrow{width:7px;height:24px;left:-6px;top:var(--semi-tooltip-arrow-offset-y, 50%);transform:translateY(-50%) rotate(180deg)}.semi-tooltip-wrapper[x-placement=right].semi-tooltip-with-arrow,.semi-tooltip-wrapper[x-placement=right] .semi-tooltip-with-arrow{min-height:34px}.semi-tooltip-wrapper[x-placement=rightBottom] .semi-tooltip-icon-arrow{width:7px;height:24px;left:-6px;bottom:5px;transform:rotate(180deg)}.semi-tooltip-wrapper[x-placement=rightBottom].semi-tooltip-with-arrow,.semi-tooltip-wrapper[x-placement=rightBottom] .semi-tooltip-with-arrow{min-height:34px}.semi-tooltip-wrapper[x-placement=bottomLeft] .semi-tooltip-icon-arrow{top:-6px;left:6px;transform:rotate(180deg)}.semi-tooltip-wrapper[x-placement=bottomLeft].semi-tooltip-with-arrow,.semi-tooltip-wrapper[x-placement=bottomLeft] .semi-tooltip-with-arrow{min-width:36px}.semi-tooltip-wrapper[x-placement=bottom] .semi-tooltip-icon-arrow{top:-6px;left:var(--semi-tooltip-arrow-offset-x, 50%);transform:translate(-50%) rotate(180deg)}.semi-tooltip-wrapper[x-placement=bottom].semi-tooltip-with-arrow,.semi-tooltip-wrapper[x-placement=bottom] .semi-tooltip-with-arrow{min-width:36px}.semi-tooltip-wrapper[x-placement=bottomRight] .semi-tooltip-icon-arrow{right:6px;top:-6px;transform:rotate(180deg)}.semi-tooltip-wrapper[x-placement=bottomRight].semi-tooltip-with-arrow,.semi-tooltip-wrapper[x-placement=bottomRight] .semi-tooltip-with-arrow{min-width:36px}.semi-rtl .semi-tooltip-wrapper,.semi-portal-rtl .semi-tooltip-wrapper{direction:rtl;padding-right:12px;padding-left:12px;left:auto;right:0}.semi-portal{position:absolute;top:0;left:0;width:100%;z-index:1}.semi-portal-inner{position:absolute;background-color:transparent;min-width:max-content}.semi-icon{display:inline-block;font-style:normal;line-height:0;text-align:center;text-transform:none;text-rendering:optimizeLegibility;fill:currentColor}.semi-icon-extra-small{font-size:8px}.semi-icon-small{font-size:12px}.semi-icon-default{font-size:16px}.semi-icon-large{font-size:20px}.semi-icon-extra-large{font-size:24px}.semi-icon-spinning{animation:.6s linear infinite semi-icon-animation-rotate;animation-fill-mode:forwards}@keyframes semi-icon-animation-rotate{0%{transform:rotate(0)}to{transform:rotate(360deg)}}@keyframes semi-popover-zoomIn{0%{opacity:0;transform:scale(.8)}50%{opacity:1}}@keyframes semi-popover-zoomOut{0%{opacity:1}60%{opacity:0;transform:scale(.8)}to{opacity:0}}.semi-popover-wrapper{position:relative;background-color:var(--semi-color-bg-3);-webkit-backdrop-filter:none;backdrop-filter:none;box-shadow:var(--semi-shadow-elevated);z-index:1030;border-radius:var(--semi-border-radius-medium);font-size:14px;line-height:20px;font-family:Inter,-apple-system,BlinkMacSystemFont,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Segoe UI,Helvetica Neue,Helvetica,Arial,sans-serif;opacity:0}.semi-popover-wrapper-show{opacity:1}.semi-popover-trigger{display:inline-block;width:auto;height:auto}.semi-popover-title{padding:8px;border-bottom:1px solid var(--semi-color-border)}.semi-popover-confirm{position:absolute}.semi-popover-with-arrow{padding:12px;box-sizing:border-box}.semi-popover-animation-show{animation:semi-popover-zoomIn .1s cubic-bezier(.215,.61,.355,1);animation-fill-mode:forwards}.semi-popover-animation-hide{animation:semi-popover-zoomOut .1s cubic-bezier(.215,.61,.355,1);animation-fill-mode:forwards}.semi-popover-icon-arrow path:nth-child(1){fill:var(--semi-color-border)}.semi-popover-icon-arrow path:nth-child(2){fill:var(--semi-color-bg-3)}.semi-popover-wrapper .semi-popover-icon-arrow{height:8px;width:24px;position:absolute;color:unset}.semi-popover-wrapper[x-placement=top] .semi-popover-icon-arrow{left:var(--semi-tooltip-arrow-offset-x, 50%);transform:translate(-50%);bottom:-7px}.semi-popover-wrapper[x-placement=top].semi-popover-with-arrow,.semi-popover-wrapper[x-placement=top] .semi-popover-with-arrow{min-width:36px}.semi-popover-wrapper[x-placement=topLeft] .semi-popover-icon-arrow{bottom:-7px;left:6px}.semi-popover-wrapper[x-placement=topLeft].semi-popover-with-arrow,.semi-popover-wrapper[x-placement=topLeft] .semi-popover-with-arrow{min-width:36px}.semi-popover-wrapper[x-placement=topRight] .semi-popover-icon-arrow{bottom:-7px;right:6px}.semi-popover-wrapper[x-placement=topRight].semi-popover-with-arrow,.semi-popover-wrapper[x-placement=topRight] .semi-popover-with-arrow{min-width:36px}.semi-popover-wrapper[x-placement=leftTop] .semi-popover-icon-arrow{width:8px;height:24px;right:-7px;top:6px}.semi-popover-wrapper[x-placement=leftTop].semi-popover-with-arrow,.semi-popover-wrapper[x-placement=leftTop] .semi-popover-with-arrow{min-height:36px}.semi-popover-wrapper[x-placement=left] .semi-popover-icon-arrow{width:8px;height:24px;right:-7px;top:var(--semi-tooltip-arrow-offset-y, 50%);transform:translateY(-50%)}.semi-popover-wrapper[x-placement=left].semi-popover-with-arrow,.semi-popover-wrapper[x-placement=left] .semi-popover-with-arrow{min-height:36px}.semi-popover-wrapper[x-placement=leftBottom] .semi-popover-icon-arrow{width:8px;height:24px;right:-7px;bottom:6px}.semi-popover-wrapper[x-placement=leftBottom].semi-popover-with-arrow,.semi-popover-wrapper[x-placement=leftBottom] .semi-popover-with-arrow{min-height:36px}.semi-popover-wrapper[x-placement=rightTop] .semi-popover-icon-arrow{width:8px;height:24px;left:-7px;top:6px;transform:rotate(180deg)}.semi-popover-wrapper[x-placement=rightTop].semi-popover-with-arrow,.semi-popover-wrapper[x-placement=rightTop] .semi-popover-with-arrow{min-height:36px}.semi-popover-wrapper[x-placement=right] .semi-popover-icon-arrow{width:8px;height:24px;left:-7px;top:var(--semi-tooltip-arrow-offset-y, 50%);transform:translateY(-50%) rotate(180deg)}.semi-popover-wrapper[x-placement=right].semi-popover-with-arrow,.semi-popover-wrapper[x-placement=right] .semi-popover-with-arrow{min-height:36px}.semi-popover-wrapper[x-placement=rightBottom] .semi-popover-icon-arrow{width:8px;height:24px;left:-7px;bottom:6px;transform:rotate(180deg)}.semi-popover-wrapper[x-placement=rightBottom].semi-popover-with-arrow,.semi-popover-wrapper[x-placement=rightBottom] .semi-popover-with-arrow{min-height:36px}.semi-popover-wrapper[x-placement=bottomLeft] .semi-popover-icon-arrow{top:-7px;left:6px;transform:rotate(180deg)}.semi-popover-wrapper[x-placement=bottomLeft].semi-popover-with-arrow,.semi-popover-wrapper[x-placement=bottomLeft] .semi-popover-with-arrow{min-width:36px}.semi-popover-wrapper[x-placement=bottom] .semi-popover-icon-arrow{top:-7px;left:var(--semi-tooltip-arrow-offset-x, 50%);transform:translate(-50%) rotate(180deg)}.semi-popover-wrapper[x-placement=bottom].semi-popover-with-arrow,.semi-popover-wrapper[x-placement=bottom] .semi-popover-with-arrow{min-width:36px}.semi-popover-wrapper[x-placement=bottomRight] .semi-popover-icon-arrow{right:6px;top:-7px;transform:rotate(180deg)}.semi-popover-wrapper[x-placement=bottomRight].semi-popover-with-arrow,.semi-popover-wrapper[x-placement=bottomRight] .semi-popover-with-arrow{min-width:36px}.semi-popover.semi-popover-rtl{direction:rtl}.semi-collapsible-transition{transition:height .25s cubic-bezier(.25,.1,.25,1) var(--semi-transition_delay-none),opacity .25s var(--semi-transition_function-easeIn) var(--semi-transition_delay-none)}.semi-collapse-item{border-bottom:1px solid var(--semi-color-border)}.semi-collapse-header{display:flex;align-items:center;justify-content:space-between;margin:4px 8px;padding:8px;border-radius:var(--semi-border-radius-small);outline:none;cursor:pointer;color:var(--semi-color-text-0);font-weight:600;font-size:14px;line-height:20px;font-family:Inter,-apple-system,BlinkMacSystemFont,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Segoe UI,Helvetica Neue,Helvetica,Arial,sans-serif}.semi-collapse-header-right{display:flex;align-items:center}.semi-collapse-header-right span{display:flex;padding-right:8px}.semi-collapse-header-right span:last-child{padding-right:0}.semi-collapse-header-icon{width:16px;height:16px;color:var(--semi-color-text-2)}.semi-collapse-header-iconLeft{justify-content:flex-start}.semi-collapse-header-iconLeft .semi-collapse-header-icon{margin-right:8px}.semi-collapse-header-iconDisabled{color:var(--semi-color-disabled-text)}.semi-collapse-header:hover{background-color:var(--semi-color-fill-0)}.semi-collapse-header:active{background-color:var(--semi-color-fill-1)}.semi-collapse-header-disabled{color:var(--semi-color-disabled-text)}.semi-collapse-header-disabled:hover{background-color:transparent}.semi-collapse-content{padding:4px 16px 8px;color:var(--semi-color-text-1);font-size:14px;line-height:20px;font-family:Inter,-apple-system,BlinkMacSystemFont,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Segoe UI,Helvetica Neue,Helvetica,Arial,sans-serif}.semi-collapse-content p{margin:0}.semi-rtl .semi-collapse,.semi-portal-rtl .semi-collapse{direction:rtl}.semi-rtl .semi-collapse-header-right span,.semi-portal-rtl .semi-collapse-header-right span{display:flex;padding-right:0;padding-left:8px}.semi-rtl .semi-collapse-header-right span:last-child,.semi-portal-rtl .semi-collapse-header-right span:last-child{padding-right:0;padding-left:0} diff --git a/frontends/desktop/dist/assets/tauri-compat-tfiFK9EG.js b/frontends/desktop/dist/assets/tauri-compat-tfiFK9EG.js new file mode 100644 index 000000000..67360a123 --- /dev/null +++ b/frontends/desktop/dist/assets/tauri-compat-tfiFK9EG.js @@ -0,0 +1,47 @@ +function H_(s,i){for(var r=0;ro[l]})}}}return Object.freeze(Object.defineProperty(s,Symbol.toStringTag,{value:"Module"}))}(function(){const i=document.createElement("link").relList;if(i&&i.supports&&i.supports("modulepreload"))return;for(const l of document.querySelectorAll('link[rel="modulepreload"]'))o(l);new MutationObserver(l=>{for(const f of l)if(f.type==="childList")for(const d of f.addedNodes)d.tagName==="LINK"&&d.rel==="modulepreload"&&o(d)}).observe(document,{childList:!0,subtree:!0});function r(l){const f={};return l.integrity&&(f.integrity=l.integrity),l.referrerPolicy&&(f.referrerPolicy=l.referrerPolicy),l.crossOrigin==="use-credentials"?f.credentials="include":l.crossOrigin==="anonymous"?f.credentials="omit":f.credentials="same-origin",f}function o(l){if(l.ep)return;l.ep=!0;const f=r(l);fetch(l.href,f)}})();var na=typeof globalThis<"u"?globalThis:typeof window<"u"?window:typeof global<"u"?global:typeof self<"u"?self:{};function He(s){return s&&s.__esModule&&Object.prototype.hasOwnProperty.call(s,"default")?s.default:s}var gl={exports:{}},Ri={},ml={exports:{}},me={};/** + * @license React + * react.production.min.js + * + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */var og;function U_(){if(og)return me;og=1;var s=Symbol.for("react.element"),i=Symbol.for("react.portal"),r=Symbol.for("react.fragment"),o=Symbol.for("react.strict_mode"),l=Symbol.for("react.profiler"),f=Symbol.for("react.provider"),d=Symbol.for("react.context"),p=Symbol.for("react.forward_ref"),g=Symbol.for("react.suspense"),m=Symbol.for("react.memo"),_=Symbol.for("react.lazy"),C=Symbol.iterator;function b(T){return T===null||typeof T!="object"?null:(T=C&&T[C]||T["@@iterator"],typeof T=="function"?T:null)}var x={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},A=Object.assign,k={};function R(T,j,ae){this.props=T,this.context=j,this.refs=k,this.updater=ae||x}R.prototype.isReactComponent={},R.prototype.setState=function(T,j){if(typeof T!="object"&&typeof T!="function"&&T!=null)throw Error("setState(...): takes an object of state variables to update or a function which returns an object of state variables.");this.updater.enqueueSetState(this,T,j,"setState")},R.prototype.forceUpdate=function(T){this.updater.enqueueForceUpdate(this,T,"forceUpdate")};function z(){}z.prototype=R.prototype;function H(T,j,ae){this.props=T,this.context=j,this.refs=k,this.updater=ae||x}var W=H.prototype=new z;W.constructor=H,A(W,R.prototype),W.isPureReactComponent=!0;var $=Array.isArray,Y=Object.prototype.hasOwnProperty,M={current:null},N={key:!0,ref:!0,__self:!0,__source:!0};function U(T,j,ae){var se,fe={},ue=null,he=null;if(j!=null)for(se in j.ref!==void 0&&(he=j.ref),j.key!==void 0&&(ue=""+j.key),j)Y.call(j,se)&&!N.hasOwnProperty(se)&&(fe[se]=j[se]);var de=arguments.length-2;if(de===1)fe.children=ae;else if(1-1}return Gl=i,Gl}var Xl,$g;function pw(){if($g)return Xl;$g=1;var s=ga();function i(r,o){var l=this.__data__,f=s(l,r);return f<0?(++this.size,l.push([r,o])):l[f][1]=o,this}return Xl=i,Xl}var Ql,Bg;function ma(){if(Bg)return Ql;Bg=1;var s=uw(),i=cw(),r=fw(),o=dw(),l=pw();function f(d){var p=-1,g=d==null?0:d.length;for(this.clear();++p1?i-1:0),o=1;o0&&arguments[0]!==void 0?arguments[0]:"value";const r=this.getProps();return i in r}_isInProps(i){const r=this.getProps();return i in r}init(i){}destroy(){}log(i){for(var r=arguments.length,o=new Array(r>1?r-1:0),l=1;l(r.substr(0,5)==="data-"&&(i[r]=s[r]),i),{})}const{hasOwnProperty:xw}=Object.prototype;class $r extends Ee.Component{constructor(i){super(i),this.isControlled=r=>!!(r&&this.props&&typeof this.props=="object"&&xw.call(this.props,r)),this.setStateAsync=r=>new Promise(o=>{this.setState(r,o)}),this.cache={},this.foundation=null}componentDidMount(){this.foundation&&typeof this.foundation.init=="function"&&this.foundation.init()}componentWillUnmount(){this.foundation&&typeof this.foundation.destroy=="function"&&this.foundation.destroy(),this.cache={}}get adapter(){return{getContext:i=>{if(this.context&&i)return this.context[i]},getContexts:()=>this.context,getProp:i=>this.props[i],getProps:()=>this.props,getState:i=>this.state[i],getStates:()=>this.state,setState:(i,r)=>this.setState(Object.assign({},i),r),getCache:i=>i&&this.cache[i],getCaches:()=>this.cache,setCache:(i,r)=>i&&(this.cache[i]=r),stopPropagation:i=>{try{i.stopPropagation(),i.nativeEvent&&i.nativeEvent.stopImmediatePropagation()}catch{}},persistEvent:i=>{i&&i.persist&&typeof i.persist=="function"&&i.persist()}}}log(i){for(var r=arguments.length,o=new Array(r>1?r-1:0),l=1;l0&&arguments[0]!==void 0?arguments[0]:this.props;return bw(i)}}$r.propTypes={};$r.defaultProps={};var mu,lm;function Rw(){if(lm)return mu;lm=1;var s=Kt(),i=function(){return s.Date.now()};return mu=i,mu}var vu,um;function kw(){if(um)return vu;um=1;var s=/\s/;function i(r){for(var o=r.length;o--&&s.test(r.charAt(o)););return o}return vu=i,vu}var yu,cm;function Iw(){if(cm)return yu;cm=1;var s=kw(),i=/^\s+/;function r(o){return o&&o.slice(0,s(o)+1).replace(i,"")}return yu=r,yu}var _u,fm;function Aw(){if(fm)return _u;fm=1;var s=Iw(),i=Nt(),r=da(),o=NaN,l=/^[-+]0x[0-9a-f]+$/i,f=/^0b[01]+$/i,d=/^0o[0-7]+$/i,p=parseInt;function g(m){if(typeof m=="number")return m;if(r(m))return o;if(i(m)){var _=typeof m.valueOf=="function"?m.valueOf():m;m=i(_)?_+"":_}if(typeof m!="string")return m===0?m:+m;m=s(m);var C=f.test(m);return C||d.test(m)?p(m.slice(2),C?2:8):l.test(m)?o:+m}return _u=g,_u}var wu,dm;function Nw(){if(dm)return wu;dm=1;var s=Nt(),i=Rw(),r=Aw(),o="Expected a function",l=Math.max,f=Math.min;function d(p,g,m){var _,C,b,x,A,k,R=0,z=!1,H=!1,W=!0;if(typeof p!="function")throw new TypeError(o);g=r(g)||0,s(m)&&(z=!!m.leading,H="maxWait"in m,b=H?l(r(m.maxWait)||0,g):b,W="trailing"in m?!!m.trailing:W);function $(ne){var pe=_,_e=C;return _=C=void 0,R=ne,x=p.apply(_e,pe),x}function Y(ne){return R=ne,A=setTimeout(U,g),z?$(ne):x}function M(ne){var pe=ne-k,_e=ne-R,Pe=g-pe;return H?f(Pe,b-_e):Pe}function N(ne){var pe=ne-k,_e=ne-R;return k===void 0||pe>=g||pe<0||H&&_e>=b}function U(){var ne=i();if(N(ne))return X(ne);A=setTimeout(U,M(ne))}function X(ne){return A=void 0,W&&_?$(ne):(_=C=void 0,x)}function ee(){A!==void 0&&clearTimeout(A),R=0,_=k=C=A=void 0}function V(){return A===void 0?x:X(i())}function ce(){var ne=i(),pe=N(ne);if(_=arguments,C=this,k=ne,pe){if(A===void 0)return Y(k);if(H)return clearTimeout(A),A=setTimeout(U,g),$(k)}return A===void 0&&(A=setTimeout(U,g)),x}return ce.cancel=ee,ce.flush=V,ce}return wu=d,wu}var Su,pm;function jw(){if(pm)return Su;pm=1;var s=Nw(),i=Nt(),r="Expected a function";function o(l,f,d){var p=!0,g=!0;if(typeof l!="function")throw new TypeError(r);return i(d)&&(p="leading"in d?!!d.leading:p,g="trailing"in d?!!d.trailing:g),s(l,f,{leading:p,maxWait:f,trailing:g})}return Su=o,Su}var Mw=jw();const hm=He(Mw);var Cu={exports:{}};/*! + Copyright (c) 2018 Jed Watson. + Licensed under the MIT License (MIT), see + http://jedwatson.github.io/classnames +*/var gm;function Dw(){return gm||(gm=1,(function(s){(function(){var i={}.hasOwnProperty;function r(){for(var f="",d=0;d-1&&o%1==0&&o-1&&r%1==0&&r<=s}return Bu=i,Bu}var Hu,Lm;function Qw(){if(Lm)return Hu;Lm=1;var s=cr(),i=ld(),r=rn(),o="[object Arguments]",l="[object Array]",f="[object Boolean]",d="[object Date]",p="[object Error]",g="[object Function]",m="[object Map]",_="[object Number]",C="[object Object]",b="[object RegExp]",x="[object Set]",A="[object String]",k="[object WeakMap]",R="[object ArrayBuffer]",z="[object DataView]",H="[object Float32Array]",W="[object Float64Array]",$="[object Int8Array]",Y="[object Int16Array]",M="[object Int32Array]",N="[object Uint8Array]",U="[object Uint8ClampedArray]",X="[object Uint16Array]",ee="[object Uint32Array]",V={};V[H]=V[W]=V[$]=V[Y]=V[M]=V[N]=V[U]=V[X]=V[ee]=!0,V[o]=V[l]=V[R]=V[f]=V[z]=V[d]=V[p]=V[g]=V[m]=V[_]=V[C]=V[b]=V[x]=V[A]=V[k]=!1;function ce(ne){return r(ne)&&i(ne.length)&&!!V[s(ne)]}return Hu=ce,Hu}var Uu,Fm;function ud(){if(Fm)return Uu;Fm=1;function s(i){return function(r){return i(r)}}return Uu=s,Uu}var Ii={exports:{}};Ii.exports;var qm;function cd(){return qm||(qm=1,(function(s,i){var r=i1(),o=i&&!i.nodeType&&i,l=o&&!0&&s&&!s.nodeType&&s,f=l&&l.exports===o,d=f&&r.process,p=(function(){try{var g=l&&l.require&&l.require("util").types;return g||d&&d.binding&&d.binding("util")}catch{}})();s.exports=p})(Ii,Ii.exports)),Ii.exports}var Wu,zm;function wa(){if(zm)return Wu;zm=1;var s=Qw(),i=ud(),r=cd(),o=r&&r.isTypedArray,l=o?i(o):s;return Wu=l,Wu}var Vu,$m;function c1(){if($m)return Vu;$m=1;var s=Kw(),i=Hi(),r=Et(),o=Ui(),l=_a(),f=wa(),d=Object.prototype,p=d.hasOwnProperty;function g(m,_){var C=r(m),b=!C&&i(m),x=!C&&!b&&o(m),A=!C&&!b&&!x&&f(m),k=C||b||x||A,R=k?s(m.length,String):[],z=R.length;for(var H in m)(_||p.call(m,H))&&!(k&&(H=="length"||x&&(H=="offset"||H=="parent")||A&&(H=="buffer"||H=="byteLength"||H=="byteOffset")||l(H,z)))&&R.push(H);return R}return Vu=g,Vu}var Ku,Bm;function Sa(){if(Bm)return Ku;Bm=1;var s=Object.prototype;function i(r){var o=r&&r.constructor,l=typeof o=="function"&&o.prototype||s;return r===l}return Ku=i,Ku}var Gu,Hm;function f1(){if(Hm)return Gu;Hm=1;function s(i,r){return function(o){return i(r(o))}}return Gu=s,Gu}var Xu,Um;function Yw(){if(Um)return Xu;Um=1;var s=f1(),i=s(Object.keys,Object);return Xu=i,Xu}var Qu,Wm;function d1(){if(Wm)return Qu;Wm=1;var s=Sa(),i=Yw(),r=Object.prototype,o=r.hasOwnProperty;function l(f){if(!s(f))return i(f);var d=[];for(var p in Object(f))o.call(f,p)&&p!="constructor"&&d.push(p);return d}return Qu=l,Qu}var Yu,Vm;function Hr(){if(Vm)return Yu;Vm=1;var s=pa(),i=ld();function r(o){return o!=null&&i(o.length)&&!s(o)}return Yu=r,Yu}var Zu,Km;function Ca(){if(Km)return Zu;Km=1;var s=c1(),i=d1(),r=Hr();function o(l){return r(l)?s(l):i(l)}return Zu=o,Zu}var Ju,Gm;function Zw(){if(Gm)return Ju;Gm=1;var s=Br(),i=Ca();function r(o,l){return o&&s(l,i(l),o)}return Ju=r,Ju}var ec,Xm;function Jw(){if(Xm)return ec;Xm=1;function s(i){var r=[];if(i!=null)for(var o in Object(i))r.push(o);return r}return ec=s,ec}var tc,Qm;function eS(){if(Qm)return tc;Qm=1;var s=Nt(),i=Sa(),r=Jw(),o=Object.prototype,l=o.hasOwnProperty;function f(d){if(!s(d))return r(d);var p=i(d),g=[];for(var m in d)m=="constructor"&&(p||!l.call(d,m))||g.push(m);return g}return tc=f,tc}var nc,Ym;function Wi(){if(Ym)return nc;Ym=1;var s=c1(),i=eS(),r=Hr();function o(l){return r(l)?s(l,!0):i(l)}return nc=o,nc}var rc,Zm;function tS(){if(Zm)return rc;Zm=1;var s=Br(),i=Wi();function r(o,l){return o&&s(l,i(l),o)}return rc=r,rc}var Ai={exports:{}};Ai.exports;var Jm;function p1(){return Jm||(Jm=1,(function(s,i){var r=Kt(),o=i&&!i.nodeType&&i,l=o&&!0&&s&&!s.nodeType&&s,f=l&&l.exports===o,d=f?r.Buffer:void 0,p=d?d.allocUnsafe:void 0;function g(m,_){if(_)return m.slice();var C=m.length,b=p?p(C):new m.constructor(C);return m.copy(b),b}s.exports=g})(Ai,Ai.exports)),Ai.exports}var ic,ev;function h1(){if(ev)return ic;ev=1;function s(i,r){var o=-1,l=i.length;for(r||(r=Array(l));++of?0:f+r),o=o>f?f:o,o<0&&(o+=f),f=r>o?0:o-r>>>0,r>>>=0;for(var d=Array(f);++l0&&f(_)?l>1?r(_,l-1,f,d,p):s(p,_):d||(p[p.length]=_)}return p}return Hc=r,Hc}var Uc,zv;function PS(){if(zv)return Uc;zv=1;var s=OS();function i(r){var o=r==null?0:r.length;return o?s(r,1):[]}return Uc=i,Uc}var Wc,$v;function bS(){if($v)return Wc;$v=1;function s(i,r,o){switch(o.length){case 0:return i.call(r);case 1:return i.call(r,o[0]);case 2:return i.call(r,o[0],o[1]);case 3:return i.call(r,o[0],o[1],o[2])}return i.apply(r,o)}return Wc=s,Wc}var Vc,Bv;function O1(){if(Bv)return Vc;Bv=1;var s=bS(),i=Math.max;function r(o,l,f){return l=i(l===void 0?o.length-1:l,0),function(){for(var d=arguments,p=-1,g=i(d.length-l,0),m=Array(g);++p0){if(++f>=s)return arguments[0]}else f=0;return l.apply(void 0,arguments)}}return Qc=o,Qc}var Yc,Kv;function P1(){if(Kv)return Yc;Kv=1;var s=RS(),i=kS(),r=i(s);return Yc=r,Yc}var Zc,Gv;function b1(){if(Gv)return Zc;Gv=1;var s=PS(),i=O1(),r=P1();function o(l){return r(i(l,void 0,s),l+"")}return Zc=o,Zc}var Jc,Xv;function IS(){if(Xv)return Jc;Xv=1;var s=a1(),i=T1(),r=CS(),o=zr(),l=Br(),f=TS(),d=b1(),p=_1(),g=1,m=2,_=4,C=d(function(b,x){var A={};if(b==null)return A;var k=!1;x=s(x,function(z){return z=o(z,b),k||(k=z.length>1),z}),l(b,p(b),A),k&&(A=i(A,g|m|_,f));for(var R=x.length;R--;)r(A,x[R]);return A});return Jc=C,Jc}var AS=IS();const Ta=He(AS),Ea={PREFIX:`${qn}-typography`},st={WEIGHT:["light","regular","medium","semibold","bold","default"],TYPE:["primary","secondary","danger","warning","success","tertiary","quaternary"],SIZE:["normal","small","inherit"],SPACING:["normal","extended"],HEADING:[1,2,3,4,5,6],RULE:["text","numbers","bytes-decimal","bytes-binary","percentages","exponential"],TRUNCATE:["ceil","floor","round"]};var NS=function(s,i){var r={};for(var o in s)Object.prototype.hasOwnProperty.call(s,o)&&i.indexOf(o)<0&&(r[o]=s[o]);if(s!=null&&typeof Object.getOwnPropertySymbols=="function")for(var l=0,o=Object.getOwnPropertySymbols(s);l1?f[p-1]:void 0,m=p>2?f[2]:void 0;for(g=o.length>3&&typeof g=="function"?(p--,g):void 0,m&&i(f[0],f[1],m)&&(g=p<3?void 0:g,p=1),l=Object(l);++dx))return!1;var k=C.get(d),R=C.get(p);if(k&&R)return k==p&&R==d;var z=-1,H=!0,W=g&l?new s:void 0;for(C.set(d,p),C.set(p,d);++zf===r))>-1;)o.splice(l,1)}}else ca(r)&&this._eventMap.delete(i);return this}emit(i){for(var r=arguments.length,o=new Array(r>1?r-1:0),l=1;ld(...o)),!0):!1}}function Ni(s){try{return s instanceof HTMLElement}catch{return typeof s=="object"&&s.nodeType===1&&typeof s.style=="object"&&typeof s.ownerDocument=="object"}}function OC(s){for(var i=arguments.length,r=new Array(i>1?i-1:0),o=1;o1?i-1:0),o=1;o(r[o]=s[o],r),{})}function bC(s){s.stopPropagation(),s.preventDefault()}function pO(s){return s.length===1&&s.match(/\S/)}function Pa(s,i){for(let r=0;r0&&Pa(s,s[0])}function gO(s){s.length>0&&Pa(s,s[s.length-1])}function mO(s,i){let r,o;s.length>0&&(i===s[0]?r=s[s.length-1]:(o=s.indexOf(i),r=s[o-1]),Pa(s,r))}function vO(s,i){let r,o;s.length>0&&(i===s[s.length-1]?r=s[0]:(o=s.indexOf(i),r=s[o+1]),Pa(s,r))}function yO(s,i,r,o){let l,f;return!s||!r||!o||o.length>1?-1:(o=o.toLowerCase(),l=s.indexOf(i)+1,l>=s.length&&(l=0),f=r.indexOf(o,l),f===-1&&(f=r.indexOf(o,0)),f>=0?f:-1)}function _O(s,i){if(!s)return null;for(;s.parentElement&&Te(s.parentElement,"attributes.role.value","")!==i;)s=s.parentElement;return s.parentElement}function wO(s,i){for(let r=0;r{this._adapter.removePortal()},this.setDisplayNone=(o,l)=>{this._adapter.setDisplayNone(o,l)},this.updateStateIfCursorOnTrigger=o=>{var l,f;if(!((l=o==null?void 0:o.matches)===null||l===void 0)&&l.call(o,":hover")){const d=this._adapter.getEventName(),p=this.getState("triggerEventSet");(f=p[d.mouseEnter])===null||f===void 0||f.call(p)}},this.onResize=()=>{this.getState("visible")&&this.calcPosition()},this.delayShow=()=>{const o=this.getProp("mouseEnterDelay");this.clearDelayTimer(),o>0?this._timer=setTimeout(()=>{this.show(),this.clearDelayTimer()},o):this.show()},this.show=()=>{if(this._initContainerPosition(),this._adapter.getAnimatingState())return;const o=this.getProp("content"),l=this.getProp("trigger"),f=this.getProp("clickTriggerToHide"),{visible:d,displayNone:p}=this.getStates();if(p&&this.setDisplayNone(!1),!d){if(this.clearDelayTimer(),this._adapter.on("portalInserted",()=>{this.calcPosition()}),l==="hover"){const g=()=>{var m;const _=this._adapter.getTriggerDOM();l&&!(!((m=_==null?void 0:_.matches)===null||m===void 0)&&m.call(_,":hover"))&&this.hide(),this._adapter.off("portalInserted",g)};this._adapter.on("portalInserted",g)}this._adapter.on("positionUpdated",()=>{this._togglePortalVisible(!0)}),this._adapter.insertPortal(o,{left:-9999,top:-9999}),l==="custom"&&this._adapter.registerClickOutsideHandler(()=>{}),(l==="click"||f||l==="contextMenu")&&this._adapter.registerClickOutsideHandler(this.hide),this._bindScrollEvent(),this._bindResizeEvent()}},this.calcPosition=function(o,l,f){let d=arguments.length>3&&arguments[3]!==void 0?arguments[3]:!0;o=(Fn(o)?r._adapter.getTriggerBounding():o)||Object.assign({},Mr),f=(Fn(f)?r._adapter.getPopupContainerRect():f)||Object.assign({},Mr),l=(Fn(l)?r._adapter.getWrapperBounding():l)||Object.assign({},Mr);let p=r.calcPosStyle({triggerRect:o,wrapperRect:l,containerRect:f}),g=r.getProp("position");if(r.getProp("autoAdjustOverflow")){const{position:m,isHeightOverFlow:_,isWidthOverFlow:C}=r.adjustPosIfNeed(g,p,o,l,f);(g!==m||_||C)&&(g=m,p=r.calcPosStyle({triggerRect:o,wrapperRect:l,containerRect:f,position:g,spacing:null,isOverFlow:[_,C]}))}return d&&r._mounted&&r._adapter.setPosition(Object.assign(Object.assign({},p),{position:g})),p},this.delayHide=()=>{const o=this.getProp("mouseLeaveDelay");this.clearDelayTimer(),o>0?this._timer=setTimeout(()=>{this.hide(),this.clearDelayTimer()},o):this.hide()},this.hide=()=>{this.clearDelayTimer(),this._togglePortalVisible(!1),this._adapter.off("portalInserted"),this._adapter.off("positionUpdated")},this.handleContainerKeydown=o=>{const{guardFocus:l,closeOnEsc:f}=this.getProps();switch(o&&o.key){case"Escape":f&&this._handleEscKeyDown(o);break;case"Tab":if(l){const d=this._adapter.getContainer(),p=this._adapter.getFocusableElements(d);p.length&&(o.shiftKey?this._handleContainerShiftTabKeyDown(p,o):this._handleContainerTabKeyDown(p,o))}break}},this._timer=null}init(){const{wrapperId:i}=this.getProps();this._mounted=!0,this._bindEvent(),this._shouldShow(),i||this._adapter.setId()}destroy(){this._mounted=!1,this.unBindEvent()}_bindEvent(){const i=this.getProp("trigger"),{triggerEventSet:r,portalEventSet:o}=this._generateEvent(i);this._bindTriggerEvent(r),this._bindPortalEvent(o),this._bindResizeEvent()}unBindEvent(){this._adapter.unregisterClickOutsideHandler(),this.unBindResizeEvent(),this.unBindScrollEvent(),clearTimeout(this._timer)}_bindTriggerEvent(i){this._adapter.registerTriggerEvent(i)}_bindPortalEvent(i){this._adapter.registerPortalEvent(i)}_bindResizeEvent(){this._adapter.registerResizeHandler(this.onResize)}unBindResizeEvent(){this._adapter.unregisterResizeHandler(this.onResize)}_adjustPos(){let i=arguments.length>0&&arguments[0]!==void 0?arguments[0]:"",r=arguments.length>1&&arguments[1]!==void 0?arguments[1]:!1,o=arguments.length>2&&arguments[2]!==void 0?arguments[2]:"reverse",l=arguments.length>3?arguments[3]:void 0;switch(o){case"reverse":return this._reversePos(i,r);case"expand":return this._expandPos(i,l);case"reduce":return this._reducePos(i);default:return this._reversePos(i,r)}}_reversePos(){let i=arguments.length>0&&arguments[0]!==void 0?arguments[0]:"";if(arguments.length>1&&arguments[1]!==void 0?arguments[1]:!1){if(ia.TOP.test(i))return i.replace("top","bottom").replace("Top","Bottom");if(ia.BOTTOM.test(i))return i.replace("bottom","top").replace("Bottom","Top")}else{if(ia.LEFT.test(i))return i.replace("left","right").replace("Left","Right");if(ia.RIGHT.test(i))return i.replace("right","left").replace("Right","Left")}return i}_expandPos(){let i=arguments.length>0&&arguments[0]!==void 0?arguments[0]:"",r=arguments.length>1?arguments[1]:void 0;return i.concat(r)}_reducePos(){let i=arguments.length>0&&arguments[0]!==void 0?arguments[0]:"";const r=["Top","Bottom","Left","Right"].find(o=>i.endsWith(o));return r?i.replace(r,""):i}clearDelayTimer(){this._timer&&(clearTimeout(this._timer),this._timer=null)}_generateEvent(i){const r=this._adapter.getEventName(),o={[r.keydown]:f=>{this._handleTriggerKeydown(f)}};let l={};switch(i){case"focus":o[r.focus]=()=>{this.getProp("condition")!==!1&&this.delayShow()},o[r.blur]=()=>{this.delayHide()},l=o;break;case"click":o[r.click]=()=>{this.getProp("condition")!==!1&&this.show()},l={};break;case"hover":o[r.mouseEnter]=()=>{this.setCache("isClickToHide",!1),this.getProp("condition")!==!1&&this.delayShow()},o[r.mouseLeave]=()=>{this.delayHide()},o[r.focus]=()=>{const{disableFocusListener:f}=this.getProps();this.getProp("condition")!==!1&&!f&&this.delayShow()},o[r.blur]=()=>{const{disableFocusListener:f}=this.getProps();!f&&this.delayHide()},l=Object.assign({},o),this.getProp("clickToHide")&&(l[r.click]=()=>{this.setCache("isClickToHide",!0),this.hide()},l[r.mouseEnter]=()=>{this.getCache("isClickToHide")||this.getProp("condition")!==!1&&this.delayShow()});break;case"custom":break;case"contextMenu":o[r.contextMenu]=f=>{this.getProp("condition")!==!1&&(f.preventDefault(),this.show())};break}return{triggerEventSet:o,portalEventSet:l}}_shouldShow(){this.getProp("visible")&&this.show()}_togglePortalVisible(i){const r=this.getState("visible"),o=this.getState("isInsert");(r!==i||o!==i)&&this._adapter.togglePortalVisible(i,()=>{i&&this._adapter.setInitialFocus(),this._adapter.notifyVisibleChange(i)})}_roundPixel(i){return typeof i=="number"?Math.round(i):i}calcTransformOrigin(i,r,o,l){if(i&&r&&o!=null&&l!=null){if(this.getProp("transformFromCenter")){if(["topLeft","bottomLeft"].includes(i))return`${this._roundPixel(r.width/2)}px ${-l*100}%`;if(["topRight","bottomRight"].includes(i))return`calc(100% - ${this._roundPixel(r.width/2)}px) ${-l*100}%`;if(["leftTop","rightTop"].includes(i))return`${-o*100}% ${this._roundPixel(r.height/2)}px`;if(["leftBottom","rightBottom"].includes(i))return`${-o*100}% calc(100% - ${this._roundPixel(r.height/2)}px)`}return`${-o*100}% ${-l*100}%`}return null}calcPosStyle(i){var r;const{spacing:o,isOverFlow:l}=i,{innerWidth:f}=window,d=(Fn(i.triggerRect)?i.triggerRect:this._adapter.getTriggerBounding())||Object.assign({},Mr),p=(Fn(i.containerRect)?i.containerRect:this._adapter.getPopupContainerRect())||Object.assign({},Mr),g=(Fn(i.wrapperRect)?i.wrapperRect:this._adapter.getWrapperBounding())||Object.assign({},Mr),m=i.position!=null?i.position:this.getProp("position"),_=o??this.getProp("spacing"),{arrowPointAtCenter:C,showArrow:b,arrowBounding:x}=this.getProps(),A=b&&C;let k=_,R=0;if(typeof _!="number"){const Me=m.includes("top")||m.includes("bottom");k=Me?_.y:_.x,R=Me?_.x:_.y}const z=Te(x,"width",24),H=Te(x,"width",24),W=Te(x,"offsetY",0),$=6,Y=6;let M,N,U=0,X=0;const ee=d.left+d.width/2,V=d.top+d.height/2,ce=$+z/2,ne=Y+H/2,pe=g.height-p.height,_e=g.width-p.width,Pe=pe>0?pe:0,we=_e>0?_e:0,F=l&&l[0],K=l&&l[1],G=ee-p.leftf,ae=Math.abs((g==null?void 0:g.width)-((r=this._adapter.getContainer())===null||r===void 0?void 0:r.clientWidth))>1;switch(ae&&(k=k*g.width/this._adapter.getContainer().clientWidth),m){case"top":M=K?G?p.left+g.width/2:p.right-g.width/2+we:ee+R,N=F?p.top:d.top-k,U=-.5,X=F?0:-1;break;case"topLeft":M=K?j?p.left:p.right-g.width:A?ee-ce+R:d.left+R,N=F?p.top:d.top-k,X=F?0:-1;break;case"topRight":M=K?p.right+we:A?ee+ce+R:d.right+R,N=F?p.top:d.top-k,X=F?0:-1,U=-1;break;case"left":M=K?p.left:d.left-k,N=F?T?p.top+g.height/2:p.bottom-g.height/2+Pe:V+R,U=K?0:-1,X=-.5;break;case"leftTop":M=K?p.left:d.left-k,N=F?p.top:A?V-ne+R:d.top+R,U=K?0:-1;break;case"leftBottom":M=K?p.left:d.left-k,N=F?p.bottom:A?V+ne+R:d.bottom+R,U=K?0:-1,X=-1;break;case"bottom":M=K?G?p.left+g.width/2:p.right-g.width/2+we:ee+R,N=F?p.bottom:d.top+d.height+k,U=-.5,X=F?-1:0;break;case"bottomLeft":M=K?j?p.left:p.right-g.width:A?ee-ce+R:d.left+R,N=F?p.bottom:d.top+d.height+k,X=F?-1:0;break;case"bottomRight":M=K?p.right+we:A?ee+ce+R:d.right+R,N=F?p.bottom:d.top+d.height+k,U=-1,X=F?-1:0;break;case"right":M=K?p.right:d.right+k,N=F?T?p.top+g.height/2:p.bottom-g.height/2+Pe:V+R,U=K?-1:0,X=-.5;break;case"rightTop":M=K?p.right:d.right+k,N=F?p.top:A?V-ne+R:d.top+R,U=K?-1:0;break;case"rightBottom":M=K?p.right:d.right+k,N=F?p.bottom:A?V+ne+R:d.bottom+R,U=K?-1:0,X=-1;break;case"leftTopOver":M=K?p.left:d.left-k,N=F?p.top:d.top-k;break;case"rightTopOver":M=K?p.right:d.right+k,N=F?p.top:d.top-k,U=-1;break;case"leftBottomOver":M=K?p.left:d.left-k,N=F?p.bottom:d.bottom+k,X=-1;break;case"rightBottomOver":M=K?p.right:d.right+k,N=F?p.bottom:d.bottom+k,U=-1,X=-1;break}const se=this.calcTransformOrigin(m,d,U,X),fe=this._adapter.containerIsBody();if(M=M-p.left,N=N-p.top,ae&&(M/=g.width/this._adapter.getContainer().clientWidth),ae&&(N/=g.height/this._adapter.getContainer().clientHeight),fe&&!this._adapter.containerIsRelativeOrAbsolute()){const Me=this._adapter.getDocumentElementBounding();M+=p.left-Me.left,N+=p.top-Me.top}M=fe?M:M+p.scrollLeft,N=fe?N:N+p.scrollTop;const ue=d.height;if(this.getProp("showArrow")&&!C&&ue<=(H/2+W)*2){const Me=ue/2-(W+H/2);(m.includes("Top")||m.includes("Bottom"))&&!m.includes("Over")&&(N=m.includes("Top")?N+Me:N-Me)}let he,de;if(b&&["top","bottom","left","right"].includes(m))if(C){if((m==="top"||m==="bottom")&&g.width>0){const Je=(ee-M)/g.width+.5,ft=(z/2+$)/g.width,jt=1-ft,ve=Math.max(ft,Math.min(jt,Je));Math.abs(ve-.5)>.01&&(he=`${ve*100}%`)}if((m==="left"||m==="right")&&g.height>0){const Je=(V-N)/g.height+.5,ft=(H/2+Y)/g.height,jt=1-ft,ve=Math.max(ft,Math.min(jt,Je));Math.abs(ve-.5)>.01&&(de=`${ve*100}%`)}}else{if((m==="top"||m==="bottom")&&g.width>0){const Je=$+z/2;G?he=`${Je/g.width*100}%`:he=`${(g.width-Je)/g.width*100}%`}if((m==="left"||m==="right")&&g.height>0){const Je=Y+H/2;T?de=`${Je/g.height*100}%`:de=`${(g.height-Je)/g.height*100}%`}}const ge={left:this._roundPixel(M),top:this._roundPixel(N)};he&&(ge["--semi-tooltip-arrow-offset-x"]=he),de&&(ge["--semi-tooltip-arrow-offset-y"]=de);let be="";return U!=null&&(be+=`translateX(${U*100}%) `,Object.defineProperty(ge,"translateX",{enumerable:!1,value:U})),X!=null&&(be+=`translateY(${X*100}%) `,Object.defineProperty(ge,"translateY",{enumerable:!1,value:X})),se!=null&&(ge.transformOrigin=se),be&&(ge.transform=be),ge}isLR(){let i=arguments.length>0&&arguments[0]!==void 0?arguments[0]:"";return i.includes("left")||i.includes("right")}isTB(){let i=arguments.length>0&&arguments[0]!==void 0?arguments[0]:"";return i.includes("top")||i.includes("bottom")}isReverse(i,r,o){return io}isOverFlow(i,r,o){return i=o||r>=o}getReverse(i,r,o,l){return i&&l||o}adjustPosIfNeed(i,r,o,l,f){const{innerWidth:d,innerHeight:p}=window,{margin:g}=this.getProps(),m=typeof g=="number"?g:g.marginLeft,_=typeof g=="number"?g:g.marginTop,C=typeof g=="number"?g:g.marginRight,b=typeof g=="number"?g:g.marginBottom;let x=!1,A=!1;const k=this.getProp("spacing");let R=k,z=0;if(typeof k!="number"){const H=i.includes("top")||i.includes("bottom");R=H?k.y:k.x,z=H?k.x:k.y}if(l.width>0&&l.height>0){const H=o.left,W=o.right,$=o.top,Y=o.bottom,M=d-H,N=p-$,U=d-W,X=p-Y,ee=l.width>o.width,V=l.height>o.height,ce=$-_l.height+R,ne=H-ml.width+R,pe=X-bl.height+R,_e=U-Cl.width+R;N-bl.height+R,Y-_l.height+R;const Pe=Nl.height+z,we=Yl.height+z,F=Ml.width+z,K=Wl.width+z,G=Nl.height+R,T=Yl.height+R,j=Ml.width,ae=Wl.width,se=$-f.top,fe=H-f.left,ue=se+o.height,he=fe+o.width,de=f.bottom-Y,ge=f.right-W,be=de+o.height,Me=ge+o.width,Je=this.isReverse(se-_,de-b,l.height+R),ft=this.isReverse(fe-m,ge-C,l.width+R),jt=this.isReverse(de-b,se-_,l.height+R),ve=this.isReverse(ge-C,fe-m,l.width+R);this.isReverse(be-b,ue-_,l.height+R),this.isReverse(ue-_,be-b,l.height+R);const on=this.isReverse(be,ue,l.height+z),ye=this.isReverse(ue,be,l.height+z),Mt=this.isReverse(Me,he,l.width+z),Ot=this.isReverse(he,Me,l.width+z),et=o.height/2,$e=o.width/2,tt=this.isOverFlow($-_,X-b,l.height+R),Fe=this.isOverFlow(H-m,U-C,l.width+R),Dt=this.isOverFlow(Y-_,N-b,l.height+R),Lt=this.isOverFlow(W-m,M-C,l.width+R),$n=this.isHalfOverFlow(Y-et,N-et,(l.height+z)/2),an=this.isHalfOverFlow(W-$e,M-$e,(l.width+z)/2),nt=this.isHalfAllEnough(Y-et,N-et,(l.height+z)/2),Gt=this.isHalfAllEnough(W-$e,M-$e,(l.width+z)/2),Pt=this.isOverFlow(se-_,de-b,l.height+R),Ft=this.isOverFlow(fe-m,ge-C,l.width+R),mn=this.isOverFlow(ue-_,be-b,l.height+R),lt=this.isOverFlow(he-m,Me-C,l.width+R),yt=this.isHalfOverFlow(ue-et,be-et,(l.height+z)/2),Ki=this.isHalfOverFlow(he-$e,Me-$e,(l.width+z)/2),vn=this.isHalfAllEnough(ue-et,be-et,(l.height+z)/2),yn=this.isHalfAllEnough(he-$e,Me-$e,(l.width+z)/2),Bn=this.getReverse(tt,Pt,ce,Je),Hn=this.getReverse(Fe,Ft,ne,ft),Un=this.getReverse(tt,Pt,pe,jt),Xt=this.getReverse(Fe,Ft,_e,ve),_t=this.getReverse(Dt,mn,Pe,on),Wn=this.getReverse(Dt,mn,we,ye),sn=this.getReverse(Lt,lt,F,Mt),Vn=this.getReverse(Lt,lt,K,Ot),Wr=$n&&yt,Vr=an&&Ki;switch(i){case"top":Bn&&(i=this._adjustPos(i,!0)),Vr&&(sn||Vn)&&(i=this._adjustPos(i,!0,"expand",sn?"Right":"Left"));break;case"topLeft":Bn&&(i=this._adjustPos(i,!0)),sn&&ee&&(i=this._adjustPos(i)),A&&(Gt||yn)&&(i=this._adjustPos(i,!0,"reduce"));break;case"topRight":Bn&&(i=this._adjustPos(i,!0)),Vn&&ee&&(i=this._adjustPos(i)),A&&(Gt||yn)&&(i=this._adjustPos(i,!0,"reduce"));break;case"left":Hn&&(i=this._adjustPos(i)),Wr&&(_t||Wn)&&(i=this._adjustPos(i,!1,"expand",_t?"Bottom":"Top"));break;case"leftTop":Hn&&(i=this._adjustPos(i)),_t&&V&&(i=this._adjustPos(i,!0)),x&&(nt||vn)&&(i=this._adjustPos(i,!1,"reduce"));break;case"leftBottom":Hn&&(i=this._adjustPos(i)),Wn&&V&&(i=this._adjustPos(i,!0)),x&&(nt||vn)&&(i=this._adjustPos(i,!1,"reduce"));break;case"bottom":Un&&(i=this._adjustPos(i,!0)),Vr&&(sn||Vn)&&(i=this._adjustPos(i,!0,"expand",sn?"Right":"Left"));break;case"bottomLeft":Un&&(i=this._adjustPos(i,!0)),sn&&ee&&(i=this._adjustPos(i)),A&&(Gt||yn)&&(i=this._adjustPos(i,!0,"reduce"));break;case"bottomRight":Un&&(i=this._adjustPos(i,!0)),Vn&&ee&&(i=this._adjustPos(i)),A&&(Gt||yn)&&(i=this._adjustPos(i,!0,"reduce"));break;case"right":Xt&&(i=this._adjustPos(i)),Wr&&(_t||Wn)&&(i=this._adjustPos(i,!1,"expand",_t?"Bottom":"Top"));break;case"rightTop":Xt&&(i=this._adjustPos(i)),_t&&V&&(i=this._adjustPos(i,!0)),x&&(nt||vn)&&(i=this._adjustPos(i,!1,"reduce"));break;case"rightBottom":Xt&&(i=this._adjustPos(i)),Wn&&V&&(i=this._adjustPos(i,!0)),x&&(nt||vn)&&(i=this._adjustPos(i,!1,"reduce"));break;case"leftTopOver":G&&(i=this._adjustPos(i,!0)),j&&(i=this._adjustPos(i));break;case"leftBottomOver":T&&(i=this._adjustPos(i,!0)),j&&(i=this._adjustPos(i));break;case"rightTopOver":G&&(i=this._adjustPos(i,!0)),ae&&(i=this._adjustPos(i));break;case"rightBottomOver":T&&(i=this._adjustPos(i,!0)),ae&&(i=this._adjustPos(i));break}this.isTB(i)&&(x=tt&&Pt,i==="top"||i==="bottom"?A=an&&Ki||W<0||U<0:A=Lt&<||W<0||U<0),this.isLR(i)&&(A=Fe&&Ft,i==="left"||i==="right"?x=$n&&yt||$<0||N<0:x=Dt&&mn||$<0||N<0)}return{position:i,isHeightOverFlow:x,isWidthOverFlow:A}}_bindScrollEvent(){this._adapter.registerScrollHandler(()=>this.calcPosition())}unBindScrollEvent(){this._adapter.unregisterScrollHandler()}_initContainerPosition(){this._adapter.getContainerPosition()||!this._adapter.containerIsBody()||this._adapter.updateContainerPosition()}_handleTriggerKeydown(i){const{closeOnEsc:r,disableArrowKeyDown:o}=this.getProps(),l=this._adapter.getContainer(),f=this._adapter.getFocusableElements(l),d=f.length;switch(i&&i.key){case"Escape":bC(i),r&&this._handleEscKeyDown(i);break;case"ArrowUp":!o&&d&&this._handleTriggerArrowUpKeydown(f,i);break;case"ArrowDown":!o&&d&&this._handleTriggerArrowDownKeydown(f,i);break}}focusTrigger(){const{trigger:i,returnFocusOnClose:r,preventScroll:o}=this.getProps();if(r&&i!=="custom"){const l=this._adapter.getTriggerNode();l&&"focus"in l&&l.focus({preventScroll:o})}}_handleEscKeyDown(i){const{trigger:r}=this.getProps();r!=="custom"&&(this.focusTrigger(),this.hide()),this._adapter.notifyEscKeydown(i)}_handleContainerTabKeyDown(i,r){const{preventScroll:o}=this.getProps(),l=this._adapter.getActiveElement();i[i.length-1]===l&&(i[0].focus({preventScroll:o}),r.preventDefault())}_handleContainerShiftTabKeyDown(i,r){const{preventScroll:o}=this.getProps(),l=this._adapter.getActiveElement();i[0]===l&&(i[i.length-1].focus({preventScroll:o}),r.preventDefault())}_handleTriggerArrowDownKeydown(i,r){const{preventScroll:o}=this.getProps();i[0].focus({preventScroll:o}),r.preventDefault()}_handleTriggerArrowUpKeydown(i,r){const{preventScroll:o}=this.getProps();i[i.length-1].focus({preventScroll:o}),r.preventDefault()}};const RC={PREFIX:`${qn}-tooltip`},Mi={POSITION_SET:["top","topLeft","topRight","left","leftTop","leftBottom","right","rightTop","rightBottom","bottom","bottomLeft","bottomRight","leftTopOver","rightTopOver","leftBottomOver","rightBottomOver"],TRIGGER_SET:["hover","focus","click","custom","contextMenu"],STATUS_DISABLED:"disabled",STATUS_LOADING:"loading"},ar={ARROW_BOUNDING:{offsetX:0,offsetY:2,width:24,height:7},DEFAULT_Z_INDEX:1060,MOUSE_ENTER_DELAY:50,MOUSE_LEAVE_DELAY:50,SPACING:8,MARGIN:0};function kC(s){return`${s}-${new Date().getTime()}-${Math.random()}`}function CO(){var s,i;try{return(i=(s=crypto==null?void 0:crypto.randomUUID)===null||s===void 0?void 0:s.call(crypto))!==null&&i!==void 0?i:String(9987e3+-1e11).replace(/[018]/g,r=>(Number(r)^crypto.getRandomValues(new Uint8Array(1))[0]&15>>Number(r)/4).toString(16))}catch{return kC("semi")}}function vd(){let s=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{};const{prefix:i="",length:r=7}=s,o="0123456789abcdefghijklmnopqrstuvwxyz",l=o.length;let f="";for(let d=0;d{if(typeof i=="function")return i(r);if(typeof r=="function"||I.isValidElement(r)||Object.prototype.toString.call(r)==="[object Error]")return r;if(Array.isArray(r)&&r.length===0){const o=Object.keys(r);if(o.length){const l=[];o.forEach(f=>{NC(l,f,r[f])});try{Fi(Te(process,"env.NODE_ENV")!=="production",`[Semi] You may use an out-of-bounds array. In some cases, your program may not behave as expected. + The maximum length of an array is 4294967295. + Please check whether the array subscript in your data exceeds the maximum value of the JS array subscript`)}catch{}return l}else return}})}const FC=s=>I.isValidElement(s)&&Te(s.type,"elementType")==="Icon";function qC(){return document?document.activeElement:null}function zC(s){if(!Ni(s))return[];const r=["input:not([disabled]):not([tabindex='-1'])","textarea:not([disabled]):not([tabindex='-1'])","button:not([disabled]):not([tabindex='-1'])","a[href]:not([tabindex='-1'])","select:not([disabled]):not([tabindex='-1'])","area[href]:not([tabindex='-1'])","iframe:not([tabindex='-1'])","object:not([tabindex='-1'])","*[tabindex]:not([tabindex='-1'])","*[contenteditable]:not([tabindex='-1'])"].join(",");return Array.from(s.querySelectorAll(r))}function yd(s,i){return jy(this,void 0,void 0,function*(){if(i===0){yield s();return}else{yield new Promise(r=>{setTimeout(()=>jy(this,void 0,void 0,function*(){yield yd(s,i-1),r()}),0)});return}})}function EO(){return globalThis&&Object.prototype.toString.call(globalThis)==="[object Window]"?window.innerWidth-document.documentElement.clientWidth:0}function ba(s){let i=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{};const r=()=>{var o,l;return((l=(o=sr==null?void 0:sr.config)===null||o===void 0?void 0:o.overrideDefaultProps)===null||l===void 0?void 0:l[s])||{}};return new Proxy(Object.assign({},i),{get(o,l,f){const d=r();return l in d?d[l]:Reflect.get(o,l,f)},set(o,l,f,d){return Reflect.set(o,l,f,d)},ownKeys(){const o=r();return Array.from(new Set([...Reflect.ownKeys(i),...Object.keys(o)]))},getOwnPropertyDescriptor(o,l){const f=r();return l in f?Reflect.getOwnPropertyDescriptor(f,l):Reflect.getOwnPropertyDescriptor(o,l)}})}var qf={exports:{}},vt={},zf={exports:{}},$f={};/** + * @license React + * scheduler.production.min.js + * + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */var My;function $C(){return My||(My=1,(function(s){function i(F,K){var G=F.length;F.push(K);e:for(;0>>1,j=F[T];if(0>>1;Tl(fe,G))uel(he,fe)?(F[T]=he,F[ue]=G,T=ue):(F[T]=fe,F[se]=G,T=se);else if(uel(he,G))F[T]=he,F[ue]=G,T=ue;else break e}}return K}function l(F,K){var G=F.sortIndex-K.sortIndex;return G!==0?G:F.id-K.id}if(typeof performance=="object"&&typeof performance.now=="function"){var f=performance;s.unstable_now=function(){return f.now()}}else{var d=Date,p=d.now();s.unstable_now=function(){return d.now()-p}}var g=[],m=[],_=1,C=null,b=3,x=!1,A=!1,k=!1,R=typeof setTimeout=="function"?setTimeout:null,z=typeof clearTimeout=="function"?clearTimeout:null,H=typeof setImmediate<"u"?setImmediate:null;typeof navigator<"u"&&navigator.scheduling!==void 0&&navigator.scheduling.isInputPending!==void 0&&navigator.scheduling.isInputPending.bind(navigator.scheduling);function W(F){for(var K=r(m);K!==null;){if(K.callback===null)o(m);else if(K.startTime<=F)o(m),K.sortIndex=K.expirationTime,i(g,K);else break;K=r(m)}}function $(F){if(k=!1,W(F),!A)if(r(g)!==null)A=!0,Pe(Y);else{var K=r(m);K!==null&&we($,K.startTime-F)}}function Y(F,K){A=!1,k&&(k=!1,z(U),U=-1),x=!0;var G=b;try{for(W(K),C=r(g);C!==null&&(!(C.expirationTime>K)||F&&!V());){var T=C.callback;if(typeof T=="function"){C.callback=null,b=C.priorityLevel;var j=T(C.expirationTime<=K);K=s.unstable_now(),typeof j=="function"?C.callback=j:C===r(g)&&o(g),W(K)}else o(g);C=r(g)}if(C!==null)var ae=!0;else{var se=r(m);se!==null&&we($,se.startTime-K),ae=!1}return ae}finally{C=null,b=G,x=!1}}var M=!1,N=null,U=-1,X=5,ee=-1;function V(){return!(s.unstable_now()-eeF||125T?(F.sortIndex=G,i(m,F),r(g)===null&&F===r(m)&&(k?(z(U),U=-1):k=!0,we($,G-T))):(F.sortIndex=j,i(g,F),A||x||(A=!0,Pe(Y))),F},s.unstable_shouldYield=V,s.unstable_wrapCallback=function(F){var K=b;return function(){var G=b;b=K;try{return F.apply(this,arguments)}finally{b=G}}}})($f)),$f}var Dy;function BC(){return Dy||(Dy=1,zf.exports=$C()),zf.exports}/** + * @license React + * react-dom.production.min.js + * + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */var Ly;function HC(){if(Ly)return vt;Ly=1;var s=td(),i=BC();function r(e){for(var t="https://reactjs.org/docs/error-decoder.html?invariant="+e,n=1;n"u"||typeof window.document>"u"||typeof window.document.createElement>"u"),g=Object.prototype.hasOwnProperty,m=/^[:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD][:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD\-.0-9\u00B7\u0300-\u036F\u203F-\u2040]*$/,_={},C={};function b(e){return g.call(C,e)?!0:g.call(_,e)?!1:m.test(e)?C[e]=!0:(_[e]=!0,!1)}function x(e,t,n,a){if(n!==null&&n.type===0)return!1;switch(typeof t){case"function":case"symbol":return!0;case"boolean":return a?!1:n!==null?!n.acceptsBooleans:(e=e.toLowerCase().slice(0,5),e!=="data-"&&e!=="aria-");default:return!1}}function A(e,t,n,a){if(t===null||typeof t>"u"||x(e,t,n,a))return!0;if(a)return!1;if(n!==null)switch(n.type){case 3:return!t;case 4:return t===!1;case 5:return isNaN(t);case 6:return isNaN(t)||1>t}return!1}function k(e,t,n,a,u,c,h){this.acceptsBooleans=t===2||t===3||t===4,this.attributeName=a,this.attributeNamespace=u,this.mustUseProperty=n,this.propertyName=e,this.type=t,this.sanitizeURL=c,this.removeEmptyString=h}var R={};"children dangerouslySetInnerHTML defaultValue defaultChecked innerHTML suppressContentEditableWarning suppressHydrationWarning style".split(" ").forEach(function(e){R[e]=new k(e,0,!1,e,null,!1,!1)}),[["acceptCharset","accept-charset"],["className","class"],["htmlFor","for"],["httpEquiv","http-equiv"]].forEach(function(e){var t=e[0];R[t]=new k(t,1,!1,e[1],null,!1,!1)}),["contentEditable","draggable","spellCheck","value"].forEach(function(e){R[e]=new k(e,2,!1,e.toLowerCase(),null,!1,!1)}),["autoReverse","externalResourcesRequired","focusable","preserveAlpha"].forEach(function(e){R[e]=new k(e,2,!1,e,null,!1,!1)}),"allowFullScreen async autoFocus autoPlay controls default defer disabled disablePictureInPicture disableRemotePlayback formNoValidate hidden loop noModule noValidate open playsInline readOnly required reversed scoped seamless itemScope".split(" ").forEach(function(e){R[e]=new k(e,3,!1,e.toLowerCase(),null,!1,!1)}),["checked","multiple","muted","selected"].forEach(function(e){R[e]=new k(e,3,!0,e,null,!1,!1)}),["capture","download"].forEach(function(e){R[e]=new k(e,4,!1,e,null,!1,!1)}),["cols","rows","size","span"].forEach(function(e){R[e]=new k(e,6,!1,e,null,!1,!1)}),["rowSpan","start"].forEach(function(e){R[e]=new k(e,5,!1,e.toLowerCase(),null,!1,!1)});var z=/[\-:]([a-z])/g;function H(e){return e[1].toUpperCase()}"accent-height alignment-baseline arabic-form baseline-shift cap-height clip-path clip-rule color-interpolation color-interpolation-filters color-profile color-rendering dominant-baseline enable-background fill-opacity fill-rule flood-color flood-opacity font-family font-size font-size-adjust font-stretch font-style font-variant font-weight glyph-name glyph-orientation-horizontal glyph-orientation-vertical horiz-adv-x horiz-origin-x image-rendering letter-spacing lighting-color marker-end marker-mid marker-start overline-position overline-thickness paint-order panose-1 pointer-events rendering-intent shape-rendering stop-color stop-opacity strikethrough-position strikethrough-thickness stroke-dasharray stroke-dashoffset stroke-linecap stroke-linejoin stroke-miterlimit stroke-opacity stroke-width text-anchor text-decoration text-rendering underline-position underline-thickness unicode-bidi unicode-range units-per-em v-alphabetic v-hanging v-ideographic v-mathematical vector-effect vert-adv-y vert-origin-x vert-origin-y word-spacing writing-mode xmlns:xlink x-height".split(" ").forEach(function(e){var t=e.replace(z,H);R[t]=new k(t,1,!1,e,null,!1,!1)}),"xlink:actuate xlink:arcrole xlink:role xlink:show xlink:title xlink:type".split(" ").forEach(function(e){var t=e.replace(z,H);R[t]=new k(t,1,!1,e,"http://www.w3.org/1999/xlink",!1,!1)}),["xml:base","xml:lang","xml:space"].forEach(function(e){var t=e.replace(z,H);R[t]=new k(t,1,!1,e,"http://www.w3.org/XML/1998/namespace",!1,!1)}),["tabIndex","crossOrigin"].forEach(function(e){R[e]=new k(e,1,!1,e.toLowerCase(),null,!1,!1)}),R.xlinkHref=new k("xlinkHref",1,!1,"xlink:href","http://www.w3.org/1999/xlink",!0,!1),["src","href","action","formAction"].forEach(function(e){R[e]=new k(e,1,!1,e.toLowerCase(),null,!0,!0)});function W(e,t,n,a){var u=R.hasOwnProperty(t)?R[t]:null;(u!==null?u.type!==0:a||!(2y||u[h]!==c[y]){var w=` +`+u[h].replace(" at new "," at ");return e.displayName&&w.includes("")&&(w=w.replace("",e.displayName)),w}while(1<=h&&0<=y);break}}}finally{ae=!1,Error.prepareStackTrace=n}return(e=e?e.displayName||e.name:"")?j(e):""}function fe(e){switch(e.tag){case 5:return j(e.type);case 16:return j("Lazy");case 13:return j("Suspense");case 19:return j("SuspenseList");case 0:case 2:case 15:return e=se(e.type,!1),e;case 11:return e=se(e.type.render,!1),e;case 1:return e=se(e.type,!0),e;default:return""}}function ue(e){if(e==null)return null;if(typeof e=="function")return e.displayName||e.name||null;if(typeof e=="string")return e;switch(e){case N:return"Fragment";case M:return"Portal";case X:return"Profiler";case U:return"StrictMode";case ne:return"Suspense";case pe:return"SuspenseList"}if(typeof e=="object")switch(e.$$typeof){case V:return(e.displayName||"Context")+".Consumer";case ee:return(e._context.displayName||"Context")+".Provider";case ce:var t=e.render;return e=e.displayName,e||(e=t.displayName||t.name||"",e=e!==""?"ForwardRef("+e+")":"ForwardRef"),e;case _e:return t=e.displayName||null,t!==null?t:ue(e.type)||"Memo";case Pe:t=e._payload,e=e._init;try{return ue(e(t))}catch{}}return null}function he(e){var t=e.type;switch(e.tag){case 24:return"Cache";case 9:return(t.displayName||"Context")+".Consumer";case 10:return(t._context.displayName||"Context")+".Provider";case 18:return"DehydratedFragment";case 11:return e=t.render,e=e.displayName||e.name||"",t.displayName||(e!==""?"ForwardRef("+e+")":"ForwardRef");case 7:return"Fragment";case 5:return t;case 4:return"Portal";case 3:return"Root";case 6:return"Text";case 16:return ue(t);case 8:return t===U?"StrictMode":"Mode";case 22:return"Offscreen";case 12:return"Profiler";case 21:return"Scope";case 13:return"Suspense";case 19:return"SuspenseList";case 25:return"TracingMarker";case 1:case 0:case 17:case 2:case 14:case 15:if(typeof t=="function")return t.displayName||t.name||null;if(typeof t=="string")return t}return null}function de(e){switch(typeof e){case"boolean":case"number":case"string":case"undefined":return e;case"object":return e;default:return""}}function ge(e){var t=e.type;return(e=e.nodeName)&&e.toLowerCase()==="input"&&(t==="checkbox"||t==="radio")}function be(e){var t=ge(e)?"checked":"value",n=Object.getOwnPropertyDescriptor(e.constructor.prototype,t),a=""+e[t];if(!e.hasOwnProperty(t)&&typeof n<"u"&&typeof n.get=="function"&&typeof n.set=="function"){var u=n.get,c=n.set;return Object.defineProperty(e,t,{configurable:!0,get:function(){return u.call(this)},set:function(h){a=""+h,c.call(this,h)}}),Object.defineProperty(e,t,{enumerable:n.enumerable}),{getValue:function(){return a},setValue:function(h){a=""+h},stopTracking:function(){e._valueTracker=null,delete e[t]}}}}function Me(e){e._valueTracker||(e._valueTracker=be(e))}function Je(e){if(!e)return!1;var t=e._valueTracker;if(!t)return!0;var n=t.getValue(),a="";return e&&(a=ge(e)?e.checked?"true":"false":e.value),e=a,e!==n?(t.setValue(e),!0):!1}function ft(e){if(e=e||(typeof document<"u"?document:void 0),typeof e>"u")return null;try{return e.activeElement||e.body}catch{return e.body}}function jt(e,t){var n=t.checked;return G({},t,{defaultChecked:void 0,defaultValue:void 0,value:void 0,checked:n??e._wrapperState.initialChecked})}function ve(e,t){var n=t.defaultValue==null?"":t.defaultValue,a=t.checked!=null?t.checked:t.defaultChecked;n=de(t.value!=null?t.value:n),e._wrapperState={initialChecked:a,initialValue:n,controlled:t.type==="checkbox"||t.type==="radio"?t.checked!=null:t.value!=null}}function on(e,t){t=t.checked,t!=null&&W(e,"checked",t,!1)}function ye(e,t){on(e,t);var n=de(t.value),a=t.type;if(n!=null)a==="number"?(n===0&&e.value===""||e.value!=n)&&(e.value=""+n):e.value!==""+n&&(e.value=""+n);else if(a==="submit"||a==="reset"){e.removeAttribute("value");return}t.hasOwnProperty("value")?Ot(e,t.type,n):t.hasOwnProperty("defaultValue")&&Ot(e,t.type,de(t.defaultValue)),t.checked==null&&t.defaultChecked!=null&&(e.defaultChecked=!!t.defaultChecked)}function Mt(e,t,n){if(t.hasOwnProperty("value")||t.hasOwnProperty("defaultValue")){var a=t.type;if(!(a!=="submit"&&a!=="reset"||t.value!==void 0&&t.value!==null))return;t=""+e._wrapperState.initialValue,n||t===e.value||(e.value=t),e.defaultValue=t}n=e.name,n!==""&&(e.name=""),e.defaultChecked=!!e._wrapperState.initialChecked,n!==""&&(e.name=n)}function Ot(e,t,n){(t!=="number"||ft(e.ownerDocument)!==e)&&(n==null?e.defaultValue=""+e._wrapperState.initialValue:e.defaultValue!==""+n&&(e.defaultValue=""+n))}var et=Array.isArray;function $e(e,t,n,a){if(e=e.options,t){t={};for(var u=0;u"+t.valueOf().toString()+"",t=nt.firstChild;e.firstChild;)e.removeChild(e.firstChild);for(;t.firstChild;)e.appendChild(t.firstChild)}});function Pt(e,t){if(t){var n=e.firstChild;if(n&&n===e.lastChild&&n.nodeType===3){n.nodeValue=t;return}}e.textContent=t}var Ft={animationIterationCount:!0,aspectRatio:!0,borderImageOutset:!0,borderImageSlice:!0,borderImageWidth:!0,boxFlex:!0,boxFlexGroup:!0,boxOrdinalGroup:!0,columnCount:!0,columns:!0,flex:!0,flexGrow:!0,flexPositive:!0,flexShrink:!0,flexNegative:!0,flexOrder:!0,gridArea:!0,gridRow:!0,gridRowEnd:!0,gridRowSpan:!0,gridRowStart:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnSpan:!0,gridColumnStart:!0,fontWeight:!0,lineClamp:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,tabSize:!0,widows:!0,zIndex:!0,zoom:!0,fillOpacity:!0,floodOpacity:!0,stopOpacity:!0,strokeDasharray:!0,strokeDashoffset:!0,strokeMiterlimit:!0,strokeOpacity:!0,strokeWidth:!0},mn=["Webkit","ms","Moz","O"];Object.keys(Ft).forEach(function(e){mn.forEach(function(t){t=t+e.charAt(0).toUpperCase()+e.substring(1),Ft[t]=Ft[e]})});function lt(e,t,n){return t==null||typeof t=="boolean"||t===""?"":n||typeof t!="number"||t===0||Ft.hasOwnProperty(e)&&Ft[e]?(""+t).trim():t+"px"}function yt(e,t){e=e.style;for(var n in t)if(t.hasOwnProperty(n)){var a=n.indexOf("--")===0,u=lt(n,t[n],a);n==="float"&&(n="cssFloat"),a?e.setProperty(n,u):e[n]=u}}var Ki=G({menuitem:!0},{area:!0,base:!0,br:!0,col:!0,embed:!0,hr:!0,img:!0,input:!0,keygen:!0,link:!0,meta:!0,param:!0,source:!0,track:!0,wbr:!0});function vn(e,t){if(t){if(Ki[e]&&(t.children!=null||t.dangerouslySetInnerHTML!=null))throw Error(r(137,e));if(t.dangerouslySetInnerHTML!=null){if(t.children!=null)throw Error(r(60));if(typeof t.dangerouslySetInnerHTML!="object"||!("__html"in t.dangerouslySetInnerHTML))throw Error(r(61))}if(t.style!=null&&typeof t.style!="object")throw Error(r(62))}}function yn(e,t){if(e.indexOf("-")===-1)return typeof t.is=="string";switch(e){case"annotation-xml":case"color-profile":case"font-face":case"font-face-src":case"font-face-uri":case"font-face-format":case"font-face-name":case"missing-glyph":return!1;default:return!0}}var Bn=null;function Hn(e){return e=e.target||e.srcElement||window,e.correspondingUseElement&&(e=e.correspondingUseElement),e.nodeType===3?e.parentNode:e}var Un=null,Xt=null,_t=null;function Wn(e){if(e=hi(e)){if(typeof Un!="function")throw Error(r(280));var t=e.stateNode;t&&(t=vo(t),Un(e.stateNode,e.type,t))}}function sn(e){Xt?_t?_t.push(e):_t=[e]:Xt=e}function Vn(){if(Xt){var e=Xt,t=_t;if(_t=Xt=null,Wn(e),t)for(e=0;e>>=0,e===0?32:31-(o0(e)/a0|0)|0}var Zi=64,Ji=4194304;function Qr(e){switch(e&-e){case 1:return 1;case 2:return 2;case 4:return 4;case 8:return 8;case 16:return 16;case 32:return 32;case 64:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return e&4194240;case 4194304:case 8388608:case 16777216:case 33554432:case 67108864:return e&130023424;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 1073741824;default:return e}}function eo(e,t){var n=e.pendingLanes;if(n===0)return 0;var a=0,u=e.suspendedLanes,c=e.pingedLanes,h=n&268435455;if(h!==0){var y=h&~u;y!==0?a=Qr(y):(c&=h,c!==0&&(a=Qr(c)))}else h=n&~u,h!==0?a=Qr(h):c!==0&&(a=Qr(c));if(a===0)return 0;if(t!==0&&t!==a&&(t&u)===0&&(u=a&-a,c=t&-t,u>=c||u===16&&(c&4194240)!==0))return t;if((a&4)!==0&&(a|=n&16),t=e.entangledLanes,t!==0)for(e=e.entanglements,t&=a;0n;n++)t.push(e);return t}function Yr(e,t,n){e.pendingLanes|=t,t!==536870912&&(e.suspendedLanes=0,e.pingedLanes=0),e=e.eventTimes,t=31-qt(t),e[t]=n}function c0(e,t){var n=e.pendingLanes&~t;e.pendingLanes=t,e.suspendedLanes=0,e.pingedLanes=0,e.expiredLanes&=t,e.mutableReadLanes&=t,e.entangledLanes&=t,t=e.entanglements;var a=e.eventTimes;for(e=e.expirationTimes;0=oi),Zd=" ",Jd=!1;function ep(e,t){switch(e){case"keyup":return F0.indexOf(t.keyCode)!==-1;case"keydown":return t.keyCode!==229;case"keypress":case"mousedown":case"focusout":return!0;default:return!1}}function tp(e){return e=e.detail,typeof e=="object"&&"data"in e?e.data:null}var gr=!1;function z0(e,t){switch(e){case"compositionend":return tp(t);case"keypress":return t.which!==32?null:(Jd=!0,Zd);case"textInput":return e=t.data,e===Zd&&Jd?null:e;default:return null}}function $0(e,t){if(gr)return e==="compositionend"||!Xa&&ep(e,t)?(e=Vd(),oo=Ha=Tn=null,gr=!1,e):null;switch(e){case"paste":return null;case"keypress":if(!(t.ctrlKey||t.altKey||t.metaKey)||t.ctrlKey&&t.altKey){if(t.char&&1=t)return{node:n,offset:t-e};e=a}e:{for(;n;){if(n.nextSibling){n=n.nextSibling;break e}n=n.parentNode}n=void 0}n=lp(n)}}function cp(e,t){return e&&t?e===t?!0:e&&e.nodeType===3?!1:t&&t.nodeType===3?cp(e,t.parentNode):"contains"in e?e.contains(t):e.compareDocumentPosition?!!(e.compareDocumentPosition(t)&16):!1:!1}function fp(){for(var e=window,t=ft();t instanceof e.HTMLIFrameElement;){try{var n=typeof t.contentWindow.location.href=="string"}catch{n=!1}if(n)e=t.contentWindow;else break;t=ft(e.document)}return t}function Za(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return t&&(t==="input"&&(e.type==="text"||e.type==="search"||e.type==="tel"||e.type==="url"||e.type==="password")||t==="textarea"||e.contentEditable==="true")}function Q0(e){var t=fp(),n=e.focusedElem,a=e.selectionRange;if(t!==n&&n&&n.ownerDocument&&cp(n.ownerDocument.documentElement,n)){if(a!==null&&Za(n)){if(t=a.start,e=a.end,e===void 0&&(e=t),"selectionStart"in n)n.selectionStart=t,n.selectionEnd=Math.min(e,n.value.length);else if(e=(t=n.ownerDocument||document)&&t.defaultView||window,e.getSelection){e=e.getSelection();var u=n.textContent.length,c=Math.min(a.start,u);a=a.end===void 0?c:Math.min(a.end,u),!e.extend&&c>a&&(u=a,a=c,c=u),u=up(n,c);var h=up(n,a);u&&h&&(e.rangeCount!==1||e.anchorNode!==u.node||e.anchorOffset!==u.offset||e.focusNode!==h.node||e.focusOffset!==h.offset)&&(t=t.createRange(),t.setStart(u.node,u.offset),e.removeAllRanges(),c>a?(e.addRange(t),e.extend(h.node,h.offset)):(t.setEnd(h.node,h.offset),e.addRange(t)))}}for(t=[],e=n;e=e.parentNode;)e.nodeType===1&&t.push({element:e,left:e.scrollLeft,top:e.scrollTop});for(typeof n.focus=="function"&&n.focus(),n=0;n=document.documentMode,mr=null,Ja=null,ui=null,es=!1;function dp(e,t,n){var a=n.window===n?n.document:n.nodeType===9?n:n.ownerDocument;es||mr==null||mr!==ft(a)||(a=mr,"selectionStart"in a&&Za(a)?a={start:a.selectionStart,end:a.selectionEnd}:(a=(a.ownerDocument&&a.ownerDocument.defaultView||window).getSelection(),a={anchorNode:a.anchorNode,anchorOffset:a.anchorOffset,focusNode:a.focusNode,focusOffset:a.focusOffset}),ui&&li(ui,a)||(ui=a,a=ho(Ja,"onSelect"),0Sr||(e.current=ds[Sr],ds[Sr]=null,Sr--)}function xe(e,t){Sr++,ds[Sr]=e.current,e.current=t}var bn={},rt=Pn(bn),dt=Pn(!1),Xn=bn;function Cr(e,t){var n=e.type.contextTypes;if(!n)return bn;var a=e.stateNode;if(a&&a.__reactInternalMemoizedUnmaskedChildContext===t)return a.__reactInternalMemoizedMaskedChildContext;var u={},c;for(c in n)u[c]=t[c];return a&&(e=e.stateNode,e.__reactInternalMemoizedUnmaskedChildContext=t,e.__reactInternalMemoizedMaskedChildContext=u),u}function pt(e){return e=e.childContextTypes,e!=null}function yo(){ke(dt),ke(rt)}function bp(e,t,n){if(rt.current!==bn)throw Error(r(168));xe(rt,t),xe(dt,n)}function xp(e,t,n){var a=e.stateNode;if(t=t.childContextTypes,typeof a.getChildContext!="function")return n;a=a.getChildContext();for(var u in a)if(!(u in t))throw Error(r(108,he(e)||"Unknown",u));return G({},n,a)}function _o(e){return e=(e=e.stateNode)&&e.__reactInternalMemoizedMergedChildContext||bn,Xn=rt.current,xe(rt,e),xe(dt,dt.current),!0}function Rp(e,t,n){var a=e.stateNode;if(!a)throw Error(r(169));n?(e=xp(e,t,Xn),a.__reactInternalMemoizedMergedChildContext=e,ke(dt),ke(rt),xe(rt,e)):ke(dt),xe(dt,n)}var un=null,wo=!1,ps=!1;function kp(e){un===null?un=[e]:un.push(e)}function l_(e){wo=!0,kp(e)}function xn(){if(!ps&&un!==null){ps=!0;var e=0,t=Oe;try{var n=un;for(Oe=1;e>=h,u-=h,cn=1<<32-qt(t)+u|n<le?(Ge=oe,oe=null):Ge=oe.sibling;var Ce=D(E,oe,O[le],B);if(Ce===null){oe===null&&(oe=Ge);break}e&&oe&&Ce.alternate===null&&t(E,oe),S=c(Ce,S,le),ie===null?re=Ce:ie.sibling=Ce,ie=Ce,oe=Ge}if(le===O.length)return n(E,oe),Ie&&Yn(E,le),re;if(oe===null){for(;lele?(Ge=oe,oe=null):Ge=oe.sibling;var Ln=D(E,oe,Ce.value,B);if(Ln===null){oe===null&&(oe=Ge);break}e&&oe&&Ln.alternate===null&&t(E,oe),S=c(Ln,S,le),ie===null?re=Ln:ie.sibling=Ln,ie=Ln,oe=Ge}if(Ce.done)return n(E,oe),Ie&&Yn(E,le),re;if(oe===null){for(;!Ce.done;le++,Ce=O.next())Ce=q(E,Ce.value,B),Ce!==null&&(S=c(Ce,S,le),ie===null?re=Ce:ie.sibling=Ce,ie=Ce);return Ie&&Yn(E,le),re}for(oe=a(E,oe);!Ce.done;le++,Ce=O.next())Ce=Q(oe,E,le,Ce.value,B),Ce!==null&&(e&&Ce.alternate!==null&&oe.delete(Ce.key===null?le:Ce.key),S=c(Ce,S,le),ie===null?re=Ce:ie.sibling=Ce,ie=Ce);return e&&oe.forEach(function(B_){return t(E,B_)}),Ie&&Yn(E,le),re}function ze(E,S,O,B){if(typeof O=="object"&&O!==null&&O.type===N&&O.key===null&&(O=O.props.children),typeof O=="object"&&O!==null){switch(O.$$typeof){case Y:e:{for(var re=O.key,ie=S;ie!==null;){if(ie.key===re){if(re=O.type,re===N){if(ie.tag===7){n(E,ie.sibling),S=u(ie,O.props.children),S.return=E,E=S;break e}}else if(ie.elementType===re||typeof re=="object"&&re!==null&&re.$$typeof===Pe&&Dp(re)===ie.type){n(E,ie.sibling),S=u(ie,O.props),S.ref=gi(E,ie,O),S.return=E,E=S;break e}n(E,ie);break}else t(E,ie);ie=ie.sibling}O.type===N?(S=or(O.props.children,E.mode,B,O.key),S.return=E,E=S):(B=Go(O.type,O.key,O.props,null,E.mode,B),B.ref=gi(E,S,O),B.return=E,E=B)}return h(E);case M:e:{for(ie=O.key;S!==null;){if(S.key===ie)if(S.tag===4&&S.stateNode.containerInfo===O.containerInfo&&S.stateNode.implementation===O.implementation){n(E,S.sibling),S=u(S,O.children||[]),S.return=E,E=S;break e}else{n(E,S);break}else t(E,S);S=S.sibling}S=cl(O,E.mode,B),S.return=E,E=S}return h(E);case Pe:return ie=O._init,ze(E,S,ie(O._payload),B)}if(et(O))return J(E,S,O,B);if(K(O))return te(E,S,O,B);Eo(E,O)}return typeof O=="string"&&O!==""||typeof O=="number"?(O=""+O,S!==null&&S.tag===6?(n(E,S.sibling),S=u(S,O),S.return=E,E=S):(n(E,S),S=ul(O,E.mode,B),S.return=E,E=S),h(E)):n(E,S)}return ze}var Pr=Lp(!0),Fp=Lp(!1),Oo=Pn(null),Po=null,br=null,_s=null;function ws(){_s=br=Po=null}function Ss(e){var t=Oo.current;ke(Oo),e._currentValue=t}function Cs(e,t,n){for(;e!==null;){var a=e.alternate;if((e.childLanes&t)!==t?(e.childLanes|=t,a!==null&&(a.childLanes|=t)):a!==null&&(a.childLanes&t)!==t&&(a.childLanes|=t),e===n)break;e=e.return}}function xr(e,t){Po=e,_s=br=null,e=e.dependencies,e!==null&&e.firstContext!==null&&((e.lanes&t)!==0&&(ht=!0),e.firstContext=null)}function Rt(e){var t=e._currentValue;if(_s!==e)if(e={context:e,memoizedValue:t,next:null},br===null){if(Po===null)throw Error(r(308));br=e,Po.dependencies={lanes:0,firstContext:e}}else br=br.next=e;return t}var Zn=null;function Ts(e){Zn===null?Zn=[e]:Zn.push(e)}function qp(e,t,n,a){var u=t.interleaved;return u===null?(n.next=n,Ts(t)):(n.next=u.next,u.next=n),t.interleaved=n,dn(e,a)}function dn(e,t){e.lanes|=t;var n=e.alternate;for(n!==null&&(n.lanes|=t),n=e,e=e.return;e!==null;)e.childLanes|=t,n=e.alternate,n!==null&&(n.childLanes|=t),n=e,e=e.return;return n.tag===3?n.stateNode:null}var Rn=!1;function Es(e){e.updateQueue={baseState:e.memoizedState,firstBaseUpdate:null,lastBaseUpdate:null,shared:{pending:null,interleaved:null,lanes:0},effects:null}}function zp(e,t){e=e.updateQueue,t.updateQueue===e&&(t.updateQueue={baseState:e.baseState,firstBaseUpdate:e.firstBaseUpdate,lastBaseUpdate:e.lastBaseUpdate,shared:e.shared,effects:e.effects})}function pn(e,t){return{eventTime:e,lane:t,tag:0,payload:null,callback:null,next:null}}function kn(e,t,n){var a=e.updateQueue;if(a===null)return null;if(a=a.shared,(Se&2)!==0){var u=a.pending;return u===null?t.next=t:(t.next=u.next,u.next=t),a.pending=t,dn(e,n)}return u=a.interleaved,u===null?(t.next=t,Ts(a)):(t.next=u.next,u.next=t),a.interleaved=t,dn(e,n)}function bo(e,t,n){if(t=t.updateQueue,t!==null&&(t=t.shared,(n&4194240)!==0)){var a=t.lanes;a&=e.pendingLanes,n|=a,t.lanes=n,Fa(e,n)}}function $p(e,t){var n=e.updateQueue,a=e.alternate;if(a!==null&&(a=a.updateQueue,n===a)){var u=null,c=null;if(n=n.firstBaseUpdate,n!==null){do{var h={eventTime:n.eventTime,lane:n.lane,tag:n.tag,payload:n.payload,callback:n.callback,next:null};c===null?u=c=h:c=c.next=h,n=n.next}while(n!==null);c===null?u=c=t:c=c.next=t}else u=c=t;n={baseState:a.baseState,firstBaseUpdate:u,lastBaseUpdate:c,shared:a.shared,effects:a.effects},e.updateQueue=n;return}e=n.lastBaseUpdate,e===null?n.firstBaseUpdate=t:e.next=t,n.lastBaseUpdate=t}function xo(e,t,n,a){var u=e.updateQueue;Rn=!1;var c=u.firstBaseUpdate,h=u.lastBaseUpdate,y=u.shared.pending;if(y!==null){u.shared.pending=null;var w=y,P=w.next;w.next=null,h===null?c=P:h.next=P,h=w;var L=e.alternate;L!==null&&(L=L.updateQueue,y=L.lastBaseUpdate,y!==h&&(y===null?L.firstBaseUpdate=P:y.next=P,L.lastBaseUpdate=w))}if(c!==null){var q=u.baseState;h=0,L=P=w=null,y=c;do{var D=y.lane,Q=y.eventTime;if((a&D)===D){L!==null&&(L=L.next={eventTime:Q,lane:0,tag:y.tag,payload:y.payload,callback:y.callback,next:null});e:{var J=e,te=y;switch(D=t,Q=n,te.tag){case 1:if(J=te.payload,typeof J=="function"){q=J.call(Q,q,D);break e}q=J;break e;case 3:J.flags=J.flags&-65537|128;case 0:if(J=te.payload,D=typeof J=="function"?J.call(Q,q,D):J,D==null)break e;q=G({},q,D);break e;case 2:Rn=!0}}y.callback!==null&&y.lane!==0&&(e.flags|=64,D=u.effects,D===null?u.effects=[y]:D.push(y))}else Q={eventTime:Q,lane:D,tag:y.tag,payload:y.payload,callback:y.callback,next:null},L===null?(P=L=Q,w=q):L=L.next=Q,h|=D;if(y=y.next,y===null){if(y=u.shared.pending,y===null)break;D=y,y=D.next,D.next=null,u.lastBaseUpdate=D,u.shared.pending=null}}while(!0);if(L===null&&(w=q),u.baseState=w,u.firstBaseUpdate=P,u.lastBaseUpdate=L,t=u.shared.interleaved,t!==null){u=t;do h|=u.lane,u=u.next;while(u!==t)}else c===null&&(u.shared.lanes=0);tr|=h,e.lanes=h,e.memoizedState=q}}function Bp(e,t,n){if(e=t.effects,t.effects=null,e!==null)for(t=0;tn?n:4,e(!0);var a=Rs.transition;Rs.transition={};try{e(!1),t()}finally{Oe=n,Rs.transition=a}}function sh(){return kt().memoizedState}function d_(e,t,n){var a=jn(e);if(n={lane:a,action:n,hasEagerState:!1,eagerState:null,next:null},lh(e))uh(t,n);else if(n=qp(e,t,n,a),n!==null){var u=ct();Wt(n,e,a,u),ch(n,t,a)}}function p_(e,t,n){var a=jn(e),u={lane:a,action:n,hasEagerState:!1,eagerState:null,next:null};if(lh(e))uh(t,u);else{var c=e.alternate;if(e.lanes===0&&(c===null||c.lanes===0)&&(c=t.lastRenderedReducer,c!==null))try{var h=t.lastRenderedState,y=c(h,n);if(u.hasEagerState=!0,u.eagerState=y,zt(y,h)){var w=t.interleaved;w===null?(u.next=u,Ts(t)):(u.next=w.next,w.next=u),t.interleaved=u;return}}catch{}finally{}n=qp(e,t,u,a),n!==null&&(u=ct(),Wt(n,e,a,u),ch(n,t,a))}}function lh(e){var t=e.alternate;return e===je||t!==null&&t===je}function uh(e,t){_i=Io=!0;var n=e.pending;n===null?t.next=t:(t.next=n.next,n.next=t),e.pending=t}function ch(e,t,n){if((n&4194240)!==0){var a=t.lanes;a&=e.pendingLanes,n|=a,t.lanes=n,Fa(e,n)}}var jo={readContext:Rt,useCallback:it,useContext:it,useEffect:it,useImperativeHandle:it,useInsertionEffect:it,useLayoutEffect:it,useMemo:it,useReducer:it,useRef:it,useState:it,useDebugValue:it,useDeferredValue:it,useTransition:it,useMutableSource:it,useSyncExternalStore:it,useId:it,unstable_isNewReconciler:!1},h_={readContext:Rt,useCallback:function(e,t){return Jt().memoizedState=[e,t===void 0?null:t],e},useContext:Rt,useEffect:Jp,useImperativeHandle:function(e,t,n){return n=n!=null?n.concat([e]):null,Ao(4194308,4,nh.bind(null,t,e),n)},useLayoutEffect:function(e,t){return Ao(4194308,4,e,t)},useInsertionEffect:function(e,t){return Ao(4,2,e,t)},useMemo:function(e,t){var n=Jt();return t=t===void 0?null:t,e=e(),n.memoizedState=[e,t],e},useReducer:function(e,t,n){var a=Jt();return t=n!==void 0?n(t):t,a.memoizedState=a.baseState=t,e={pending:null,interleaved:null,lanes:0,dispatch:null,lastRenderedReducer:e,lastRenderedState:t},a.queue=e,e=e.dispatch=d_.bind(null,je,e),[a.memoizedState,e]},useRef:function(e){var t=Jt();return e={current:e},t.memoizedState=e},useState:Yp,useDebugValue:Ds,useDeferredValue:function(e){return Jt().memoizedState=e},useTransition:function(){var e=Yp(!1),t=e[0];return e=f_.bind(null,e[1]),Jt().memoizedState=e,[t,e]},useMutableSource:function(){},useSyncExternalStore:function(e,t,n){var a=je,u=Jt();if(Ie){if(n===void 0)throw Error(r(407));n=n()}else{if(n=t(),Ke===null)throw Error(r(349));(er&30)!==0||Vp(a,t,n)}u.memoizedState=n;var c={value:n,getSnapshot:t};return u.queue=c,Jp(Gp.bind(null,a,c,e),[e]),a.flags|=2048,Ci(9,Kp.bind(null,a,c,n,t),void 0,null),n},useId:function(){var e=Jt(),t=Ke.identifierPrefix;if(Ie){var n=fn,a=cn;n=(a&~(1<<32-qt(a)-1)).toString(32)+n,t=":"+t+"R"+n,n=wi++,0<\/script>",e=e.removeChild(e.firstChild)):typeof a.is=="string"?e=h.createElement(n,{is:a.is}):(e=h.createElement(n),n==="select"&&(h=e,a.multiple?h.multiple=!0:a.size&&(h.size=a.size))):e=h.createElementNS(e,n),e[Yt]=t,e[pi]=a,kh(e,t,!1,!1),t.stateNode=e;e:{switch(h=yn(n,a),n){case"dialog":Re("cancel",e),Re("close",e),u=a;break;case"iframe":case"object":case"embed":Re("load",e),u=a;break;case"video":case"audio":for(u=0;uNr&&(t.flags|=128,a=!0,Ti(c,!1),t.lanes=4194304)}else{if(!a)if(e=Ro(h),e!==null){if(t.flags|=128,a=!0,n=e.updateQueue,n!==null&&(t.updateQueue=n,t.flags|=4),Ti(c,!0),c.tail===null&&c.tailMode==="hidden"&&!h.alternate&&!Ie)return ot(t),null}else 2*qe()-c.renderingStartTime>Nr&&n!==1073741824&&(t.flags|=128,a=!0,Ti(c,!1),t.lanes=4194304);c.isBackwards?(h.sibling=t.child,t.child=h):(n=c.last,n!==null?n.sibling=h:t.child=h,c.last=h)}return c.tail!==null?(t=c.tail,c.rendering=t,c.tail=t.sibling,c.renderingStartTime=qe(),t.sibling=null,n=Ne.current,xe(Ne,a?n&1|2:n&1),t):(ot(t),null);case 22:case 23:return al(),a=t.memoizedState!==null,e!==null&&e.memoizedState!==null!==a&&(t.flags|=8192),a&&(t.mode&1)!==0?(Tt&1073741824)!==0&&(ot(t),t.subtreeFlags&6&&(t.flags|=8192)):ot(t),null;case 24:return null;case 25:return null}throw Error(r(156,t.tag))}function C_(e,t){switch(gs(t),t.tag){case 1:return pt(t.type)&&yo(),e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 3:return Rr(),ke(dt),ke(rt),xs(),e=t.flags,(e&65536)!==0&&(e&128)===0?(t.flags=e&-65537|128,t):null;case 5:return Ps(t),null;case 13:if(ke(Ne),e=t.memoizedState,e!==null&&e.dehydrated!==null){if(t.alternate===null)throw Error(r(340));Or()}return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 19:return ke(Ne),null;case 4:return Rr(),null;case 10:return Ss(t.type._context),null;case 22:case 23:return al(),null;case 24:return null;default:return null}}var Fo=!1,at=!1,T_=typeof WeakSet=="function"?WeakSet:Set,Z=null;function Ir(e,t){var n=e.ref;if(n!==null)if(typeof n=="function")try{n(null)}catch(a){De(e,t,a)}else n.current=null}function Gs(e,t,n){try{n()}catch(a){De(e,t,a)}}var Nh=!1;function E_(e,t){if(as=ro,e=fp(),Za(e)){if("selectionStart"in e)var n={start:e.selectionStart,end:e.selectionEnd};else e:{n=(n=e.ownerDocument)&&n.defaultView||window;var a=n.getSelection&&n.getSelection();if(a&&a.rangeCount!==0){n=a.anchorNode;var u=a.anchorOffset,c=a.focusNode;a=a.focusOffset;try{n.nodeType,c.nodeType}catch{n=null;break e}var h=0,y=-1,w=-1,P=0,L=0,q=e,D=null;t:for(;;){for(var Q;q!==n||u!==0&&q.nodeType!==3||(y=h+u),q!==c||a!==0&&q.nodeType!==3||(w=h+a),q.nodeType===3&&(h+=q.nodeValue.length),(Q=q.firstChild)!==null;)D=q,q=Q;for(;;){if(q===e)break t;if(D===n&&++P===u&&(y=h),D===c&&++L===a&&(w=h),(Q=q.nextSibling)!==null)break;q=D,D=q.parentNode}q=Q}n=y===-1||w===-1?null:{start:y,end:w}}else n=null}n=n||{start:0,end:0}}else n=null;for(ss={focusedElem:e,selectionRange:n},ro=!1,Z=t;Z!==null;)if(t=Z,e=t.child,(t.subtreeFlags&1028)!==0&&e!==null)e.return=t,Z=e;else for(;Z!==null;){t=Z;try{var J=t.alternate;if((t.flags&1024)!==0)switch(t.tag){case 0:case 11:case 15:break;case 1:if(J!==null){var te=J.memoizedProps,ze=J.memoizedState,E=t.stateNode,S=E.getSnapshotBeforeUpdate(t.elementType===t.type?te:Bt(t.type,te),ze);E.__reactInternalSnapshotBeforeUpdate=S}break;case 3:var O=t.stateNode.containerInfo;O.nodeType===1?O.textContent="":O.nodeType===9&&O.documentElement&&O.removeChild(O.documentElement);break;case 5:case 6:case 4:case 17:break;default:throw Error(r(163))}}catch(B){De(t,t.return,B)}if(e=t.sibling,e!==null){e.return=t.return,Z=e;break}Z=t.return}return J=Nh,Nh=!1,J}function Ei(e,t,n){var a=t.updateQueue;if(a=a!==null?a.lastEffect:null,a!==null){var u=a=a.next;do{if((u.tag&e)===e){var c=u.destroy;u.destroy=void 0,c!==void 0&&Gs(t,n,c)}u=u.next}while(u!==a)}}function qo(e,t){if(t=t.updateQueue,t=t!==null?t.lastEffect:null,t!==null){var n=t=t.next;do{if((n.tag&e)===e){var a=n.create;n.destroy=a()}n=n.next}while(n!==t)}}function Xs(e){var t=e.ref;if(t!==null){var n=e.stateNode;switch(e.tag){case 5:e=n;break;default:e=n}typeof t=="function"?t(e):t.current=e}}function jh(e){var t=e.alternate;t!==null&&(e.alternate=null,jh(t)),e.child=null,e.deletions=null,e.sibling=null,e.tag===5&&(t=e.stateNode,t!==null&&(delete t[Yt],delete t[pi],delete t[fs],delete t[a_],delete t[s_])),e.stateNode=null,e.return=null,e.dependencies=null,e.memoizedProps=null,e.memoizedState=null,e.pendingProps=null,e.stateNode=null,e.updateQueue=null}function Mh(e){return e.tag===5||e.tag===3||e.tag===4}function Dh(e){e:for(;;){for(;e.sibling===null;){if(e.return===null||Mh(e.return))return null;e=e.return}for(e.sibling.return=e.return,e=e.sibling;e.tag!==5&&e.tag!==6&&e.tag!==18;){if(e.flags&2||e.child===null||e.tag===4)continue e;e.child.return=e,e=e.child}if(!(e.flags&2))return e.stateNode}}function Qs(e,t,n){var a=e.tag;if(a===5||a===6)e=e.stateNode,t?n.nodeType===8?n.parentNode.insertBefore(e,t):n.insertBefore(e,t):(n.nodeType===8?(t=n.parentNode,t.insertBefore(e,n)):(t=n,t.appendChild(e)),n=n._reactRootContainer,n!=null||t.onclick!==null||(t.onclick=mo));else if(a!==4&&(e=e.child,e!==null))for(Qs(e,t,n),e=e.sibling;e!==null;)Qs(e,t,n),e=e.sibling}function Ys(e,t,n){var a=e.tag;if(a===5||a===6)e=e.stateNode,t?n.insertBefore(e,t):n.appendChild(e);else if(a!==4&&(e=e.child,e!==null))for(Ys(e,t,n),e=e.sibling;e!==null;)Ys(e,t,n),e=e.sibling}var Qe=null,Ht=!1;function In(e,t,n){for(n=n.child;n!==null;)Lh(e,t,n),n=n.sibling}function Lh(e,t,n){if(Qt&&typeof Qt.onCommitFiberUnmount=="function")try{Qt.onCommitFiberUnmount(Yi,n)}catch{}switch(n.tag){case 5:at||Ir(n,t);case 6:var a=Qe,u=Ht;Qe=null,In(e,t,n),Qe=a,Ht=u,Qe!==null&&(Ht?(e=Qe,n=n.stateNode,e.nodeType===8?e.parentNode.removeChild(n):e.removeChild(n)):Qe.removeChild(n.stateNode));break;case 18:Qe!==null&&(Ht?(e=Qe,n=n.stateNode,e.nodeType===8?cs(e.parentNode,n):e.nodeType===1&&cs(e,n),ni(e)):cs(Qe,n.stateNode));break;case 4:a=Qe,u=Ht,Qe=n.stateNode.containerInfo,Ht=!0,In(e,t,n),Qe=a,Ht=u;break;case 0:case 11:case 14:case 15:if(!at&&(a=n.updateQueue,a!==null&&(a=a.lastEffect,a!==null))){u=a=a.next;do{var c=u,h=c.destroy;c=c.tag,h!==void 0&&((c&2)!==0||(c&4)!==0)&&Gs(n,t,h),u=u.next}while(u!==a)}In(e,t,n);break;case 1:if(!at&&(Ir(n,t),a=n.stateNode,typeof a.componentWillUnmount=="function"))try{a.props=n.memoizedProps,a.state=n.memoizedState,a.componentWillUnmount()}catch(y){De(n,t,y)}In(e,t,n);break;case 21:In(e,t,n);break;case 22:n.mode&1?(at=(a=at)||n.memoizedState!==null,In(e,t,n),at=a):In(e,t,n);break;default:In(e,t,n)}}function Fh(e){var t=e.updateQueue;if(t!==null){e.updateQueue=null;var n=e.stateNode;n===null&&(n=e.stateNode=new T_),t.forEach(function(a){var u=N_.bind(null,e,a);n.has(a)||(n.add(a),a.then(u,u))})}}function Ut(e,t){var n=t.deletions;if(n!==null)for(var a=0;au&&(u=h),a&=~c}if(a=u,a=qe()-a,a=(120>a?120:480>a?480:1080>a?1080:1920>a?1920:3e3>a?3e3:4320>a?4320:1960*P_(a/1960))-a,10e?16:e,Nn===null)var a=!1;else{if(e=Nn,Nn=null,Uo=0,(Se&6)!==0)throw Error(r(331));var u=Se;for(Se|=4,Z=e.current;Z!==null;){var c=Z,h=c.child;if((Z.flags&16)!==0){var y=c.deletions;if(y!==null){for(var w=0;wqe()-el?rr(e,0):Js|=n),mt(e,t)}function Yh(e,t){t===0&&((e.mode&1)===0?t=1:(t=Ji,Ji<<=1,(Ji&130023424)===0&&(Ji=4194304)));var n=ct();e=dn(e,t),e!==null&&(Yr(e,t,n),mt(e,n))}function A_(e){var t=e.memoizedState,n=0;t!==null&&(n=t.retryLane),Yh(e,n)}function N_(e,t){var n=0;switch(e.tag){case 13:var a=e.stateNode,u=e.memoizedState;u!==null&&(n=u.retryLane);break;case 19:a=e.stateNode;break;default:throw Error(r(314))}a!==null&&a.delete(t),Yh(e,n)}var Zh;Zh=function(e,t,n){if(e!==null)if(e.memoizedProps!==t.pendingProps||dt.current)ht=!0;else{if((e.lanes&n)===0&&(t.flags&128)===0)return ht=!1,w_(e,t,n);ht=(e.flags&131072)!==0}else ht=!1,Ie&&(t.flags&1048576)!==0&&Ip(t,Co,t.index);switch(t.lanes=0,t.tag){case 2:var a=t.type;Lo(e,t),e=t.pendingProps;var u=Cr(t,rt.current);xr(t,n),u=Is(null,t,a,e,u,n);var c=As();return t.flags|=1,typeof u=="object"&&u!==null&&typeof u.render=="function"&&u.$$typeof===void 0?(t.tag=1,t.memoizedState=null,t.updateQueue=null,pt(a)?(c=!0,_o(t)):c=!1,t.memoizedState=u.state!==null&&u.state!==void 0?u.state:null,Es(t),u.updater=Mo,t.stateNode=u,u._reactInternals=t,Fs(t,a,e,n),t=Bs(null,t,a,!0,c,n)):(t.tag=0,Ie&&c&&hs(t),ut(null,t,u,n),t=t.child),t;case 16:a=t.elementType;e:{switch(Lo(e,t),e=t.pendingProps,u=a._init,a=u(a._payload),t.type=a,u=t.tag=M_(a),e=Bt(a,e),u){case 0:t=$s(null,t,a,e,n);break e;case 1:t=Eh(null,t,a,e,n);break e;case 11:t=_h(null,t,a,e,n);break e;case 14:t=wh(null,t,a,Bt(a.type,e),n);break e}throw Error(r(306,a,""))}return t;case 0:return a=t.type,u=t.pendingProps,u=t.elementType===a?u:Bt(a,u),$s(e,t,a,u,n);case 1:return a=t.type,u=t.pendingProps,u=t.elementType===a?u:Bt(a,u),Eh(e,t,a,u,n);case 3:e:{if(Oh(t),e===null)throw Error(r(387));a=t.pendingProps,c=t.memoizedState,u=c.element,zp(e,t),xo(t,a,null,n);var h=t.memoizedState;if(a=h.element,c.isDehydrated)if(c={element:a,isDehydrated:!1,cache:h.cache,pendingSuspenseBoundaries:h.pendingSuspenseBoundaries,transitions:h.transitions},t.updateQueue.baseState=c,t.memoizedState=c,t.flags&256){u=kr(Error(r(423)),t),t=Ph(e,t,a,n,u);break e}else if(a!==u){u=kr(Error(r(424)),t),t=Ph(e,t,a,n,u);break e}else for(Ct=On(t.stateNode.containerInfo.firstChild),St=t,Ie=!0,$t=null,n=Fp(t,null,a,n),t.child=n;n;)n.flags=n.flags&-3|4096,n=n.sibling;else{if(Or(),a===u){t=hn(e,t,n);break e}ut(e,t,a,n)}t=t.child}return t;case 5:return Hp(t),e===null&&vs(t),a=t.type,u=t.pendingProps,c=e!==null?e.memoizedProps:null,h=u.children,ls(a,u)?h=null:c!==null&&ls(a,c)&&(t.flags|=32),Th(e,t),ut(e,t,h,n),t.child;case 6:return e===null&&vs(t),null;case 13:return bh(e,t,n);case 4:return Os(t,t.stateNode.containerInfo),a=t.pendingProps,e===null?t.child=Pr(t,null,a,n):ut(e,t,a,n),t.child;case 11:return a=t.type,u=t.pendingProps,u=t.elementType===a?u:Bt(a,u),_h(e,t,a,u,n);case 7:return ut(e,t,t.pendingProps,n),t.child;case 8:return ut(e,t,t.pendingProps.children,n),t.child;case 12:return ut(e,t,t.pendingProps.children,n),t.child;case 10:e:{if(a=t.type._context,u=t.pendingProps,c=t.memoizedProps,h=u.value,xe(Oo,a._currentValue),a._currentValue=h,c!==null)if(zt(c.value,h)){if(c.children===u.children&&!dt.current){t=hn(e,t,n);break e}}else for(c=t.child,c!==null&&(c.return=t);c!==null;){var y=c.dependencies;if(y!==null){h=c.child;for(var w=y.firstContext;w!==null;){if(w.context===a){if(c.tag===1){w=pn(-1,n&-n),w.tag=2;var P=c.updateQueue;if(P!==null){P=P.shared;var L=P.pending;L===null?w.next=w:(w.next=L.next,L.next=w),P.pending=w}}c.lanes|=n,w=c.alternate,w!==null&&(w.lanes|=n),Cs(c.return,n,t),y.lanes|=n;break}w=w.next}}else if(c.tag===10)h=c.type===t.type?null:c.child;else if(c.tag===18){if(h=c.return,h===null)throw Error(r(341));h.lanes|=n,y=h.alternate,y!==null&&(y.lanes|=n),Cs(h,n,t),h=c.sibling}else h=c.child;if(h!==null)h.return=c;else for(h=c;h!==null;){if(h===t){h=null;break}if(c=h.sibling,c!==null){c.return=h.return,h=c;break}h=h.return}c=h}ut(e,t,u.children,n),t=t.child}return t;case 9:return u=t.type,a=t.pendingProps.children,xr(t,n),u=Rt(u),a=a(u),t.flags|=1,ut(e,t,a,n),t.child;case 14:return a=t.type,u=Bt(a,t.pendingProps),u=Bt(a.type,u),wh(e,t,a,u,n);case 15:return Sh(e,t,t.type,t.pendingProps,n);case 17:return a=t.type,u=t.pendingProps,u=t.elementType===a?u:Bt(a,u),Lo(e,t),t.tag=1,pt(a)?(e=!0,_o(t)):e=!1,xr(t,n),dh(t,a,u),Fs(t,a,u,n),Bs(null,t,a,!0,e,n);case 19:return Rh(e,t,n);case 22:return Ch(e,t,n)}throw Error(r(156,t.tag))};function Jh(e,t){return Ad(e,t)}function j_(e,t,n,a){this.tag=e,this.key=n,this.sibling=this.child=this.return=this.stateNode=this.type=this.elementType=null,this.index=0,this.ref=null,this.pendingProps=t,this.dependencies=this.memoizedState=this.updateQueue=this.memoizedProps=null,this.mode=a,this.subtreeFlags=this.flags=0,this.deletions=null,this.childLanes=this.lanes=0,this.alternate=null}function At(e,t,n,a){return new j_(e,t,n,a)}function ll(e){return e=e.prototype,!(!e||!e.isReactComponent)}function M_(e){if(typeof e=="function")return ll(e)?1:0;if(e!=null){if(e=e.$$typeof,e===ce)return 11;if(e===_e)return 14}return 2}function Dn(e,t){var n=e.alternate;return n===null?(n=At(e.tag,t,e.key,e.mode),n.elementType=e.elementType,n.type=e.type,n.stateNode=e.stateNode,n.alternate=e,e.alternate=n):(n.pendingProps=t,n.type=e.type,n.flags=0,n.subtreeFlags=0,n.deletions=null),n.flags=e.flags&14680064,n.childLanes=e.childLanes,n.lanes=e.lanes,n.child=e.child,n.memoizedProps=e.memoizedProps,n.memoizedState=e.memoizedState,n.updateQueue=e.updateQueue,t=e.dependencies,n.dependencies=t===null?null:{lanes:t.lanes,firstContext:t.firstContext},n.sibling=e.sibling,n.index=e.index,n.ref=e.ref,n}function Go(e,t,n,a,u,c){var h=2;if(a=e,typeof e=="function")ll(e)&&(h=1);else if(typeof e=="string")h=5;else e:switch(e){case N:return or(n.children,u,c,t);case U:h=8,u|=8;break;case X:return e=At(12,n,t,u|2),e.elementType=X,e.lanes=c,e;case ne:return e=At(13,n,t,u),e.elementType=ne,e.lanes=c,e;case pe:return e=At(19,n,t,u),e.elementType=pe,e.lanes=c,e;case we:return Xo(n,u,c,t);default:if(typeof e=="object"&&e!==null)switch(e.$$typeof){case ee:h=10;break e;case V:h=9;break e;case ce:h=11;break e;case _e:h=14;break e;case Pe:h=16,a=null;break e}throw Error(r(130,e==null?e:typeof e,""))}return t=At(h,n,t,u),t.elementType=e,t.type=a,t.lanes=c,t}function or(e,t,n,a){return e=At(7,e,a,t),e.lanes=n,e}function Xo(e,t,n,a){return e=At(22,e,a,t),e.elementType=we,e.lanes=n,e.stateNode={isHidden:!1},e}function ul(e,t,n){return e=At(6,e,null,t),e.lanes=n,e}function cl(e,t,n){return t=At(4,e.children!==null?e.children:[],e.key,t),t.lanes=n,t.stateNode={containerInfo:e.containerInfo,pendingChildren:null,implementation:e.implementation},t}function D_(e,t,n,a,u){this.tag=t,this.containerInfo=e,this.finishedWork=this.pingCache=this.current=this.pendingChildren=null,this.timeoutHandle=-1,this.callbackNode=this.pendingContext=this.context=null,this.callbackPriority=0,this.eventTimes=La(0),this.expirationTimes=La(-1),this.entangledLanes=this.finishedLanes=this.mutableReadLanes=this.expiredLanes=this.pingedLanes=this.suspendedLanes=this.pendingLanes=0,this.entanglements=La(0),this.identifierPrefix=a,this.onRecoverableError=u,this.mutableSourceEagerHydrationData=null}function fl(e,t,n,a,u,c,h,y,w){return e=new D_(e,t,n,y,w),t===1?(t=1,c===!0&&(t|=8)):t=0,c=At(3,null,null,t),e.current=c,c.stateNode=e,c.memoizedState={element:a,isDehydrated:n,cache:null,transitions:null,pendingSuspenseBoundaries:null},Es(c),e}function L_(e,t,n){var a=3"u"||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!="function"))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(s)}catch(i){console.error(i)}}return s(),qf.exports=HC(),qf.exports}var _d=N1();const UC=He(_d),j1=H_({__proto__:null,default:UC},[_d]),lr=Object.assign({},j1),qy=lr.render,zy=lr.unmountComponentAtNode,$y=lr.findDOMNode,{version:M1}=j1,D1=Number((M1||"").split(".")[0]);let By=!1;function WC(){var s;By||D1<18&&typeof((s=sr.config)===null||s===void 0?void 0:s.createRoot)=="function"&&(By=!0,console.warn(`[Semi UI] createRoot was injected but React version is ${M1} (< 18). This configuration is unusual and may cause unexpected behavior.`))}function Hy(s){var i;const r=(i=lr.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED)!==null&&i!==void 0?i:lr.__DOM_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE;r&&typeof r=="object"&&(r.usingClientEntryPoint=s)}function VC(){var s;if(typeof((s=sr.config)===null||s===void 0?void 0:s.createRoot)=="function")return sr.config.createRoot;if(typeof lr.createRoot=="function")return lr.createRoot}let Uy=!1;function KC(){Uy||(Uy=!0,console.error(`[Semi UI] createRoot is not available. If you are using React 19, please inject createRoot before using Semi components. For details, see: https://semi.design/zh-CN/ecosystem/react19 +[Semi UI] createRoot 不可用。如果您正在使用 React 19,请在使用 Semi 组件前注入 createRoot。详情请参阅:https://semi.design/zh-CN/ecosystem/react19`))}const Di="__semi_react_root__";function OO(s,i){WC();const r=VC();if(r){Hy(!0);const o=i[Di]||r(i);Hy(!1),o.render(s),i[Di]=o}else qy?qy(s,i):KC()}function PO(s){s[Di]?(s[Di].unmount(),delete s[Di]):zy&&zy(s)}function GC(s){var i;try{const r=(i=s==null?void 0:s._reactInternals)!==null&&i!==void 0?i:s==null?void 0:s._reactInternalFiber;if(!r||typeof r!="object")return null;let o=r.child,l=0;const f=50;for(;o&&l=19?(r=(i=s.props)===null||i===void 0?void 0:i.ref)!==null&&r!==void 0?r:null:(o=s.ref)!==null&&o!==void 0?o:null:null}const xa=I.createContext({}),XC=()=>document.body;class Ra extends Ee.PureComponent{constructor(i,r){var o;super(i),o=this,this.initContainer=function(l){let f=arguments.length>1&&arguments[1]!==void 0?arguments[1]:!1;var d,p;try{let g;if(!o.el||!(!((d=o.state)===null||d===void 0)&&d.container)||!Array.from(o.state.container.childNodes).includes(o.el)){o.el=document.createElement("div");const _=(o.props.getPopupContainer||l.getPopupContainer||XC)();return _.appendChild(o.el),o.addStyle(o.props.style),o.addClass(o.props.prefixCls,l,o.props.className),g=_,g}}catch(g){if(!f)throw g}return(p=o.state)===null||p===void 0?void 0:p.container},this.addStyle=function(){let l=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{};if(o.el)for(const f of Object.keys(l))o.el.style[f]=l[f]},this.addClass=function(l){let f=arguments.length>1&&arguments[1]!==void 0?arguments[1]:o.context;const{direction:d}=f;for(var p=arguments.length,g=new Array(p>2?p-2:0),m=2;m{const{className:i,style:r}=s,o=QC(s,["className","style"]);return I.createElement("svg",Object.assign({"aria-hidden":!0,className:i,style:r},o,{width:"24",height:"7",viewBox:"0 0 24 7",fill:"currentColor",xmlns:"http://www.w3.org/2000/svg"}),I.createElement("path",{d:"M24 0V1C20 1 18.5 2 16.5 4C14.5 6 14 7 12 7C10 7 9.5 6 7.5 4C5.5 2 4 1 0 1V0H24Z"}))};var ZC=function(s,i){var r={};for(var o in s)Object.prototype.hasOwnProperty.call(s,o)&&i.indexOf(o)<0&&(r[o]=s[o]);if(s!=null&&typeof Object.getOwnPropertySymbols=="function")for(var l=0,o=Object.getOwnPropertySymbols(s);l{const{className:i,style:r}=s,o=ZC(s,["className","style"]);return I.createElement("svg",Object.assign({"aria-hidden":!0,className:i,style:r},o,{width:"7",height:"24",xmlns:"http://www.w3.org/2000/svg",fill:"currentColor"}),I.createElement("path",{d:"M0 0L1 0C1 4, 2 5.5, 4 7.5S7,10 7,12S6 14.5, 4 16.5S1,20 1,24L0 24L0 0z"}))},eT=v.shape({offsetX:v.number,offsetY:v.number,width:v.number,height:v.number});class F1 extends I.Component{constructor(i){super(i),this.handleAnimationStart=()=>{var r,o;(o=(r=this.props).onAnimationStart)===null||o===void 0||o.call(r)},this.handleAnimationEnd=()=>{this.setState({currentClassName:this.props.endClassName,extraStyle:{animationFillMode:this.props.fillMode},isAnimating:!1},()=>{var r,o;(o=(r=this.props).onAnimationEnd)===null||o===void 0||o.call(r,!1)})},this.state={currentClassName:this.props.startClassName,extraStyle:{animationFillMode:this.props.fillMode},isAnimating:!0}}componentDidMount(){var i,r,o,l;(r=(i=this.props).onAnimationStart)===null||r===void 0||r.call(i),this.props.motion||((l=(o=this.props).onAnimationEnd)===null||l===void 0||l.call(o,!1),this.setState({isAnimating:!1}))}componentDidUpdate(i,r,o){const l=Object.keys(this.props).filter(f=>!Li(this.props[f],i[f]));l.includes("animationState"),(l.includes("startClassName")||l.includes("replayKey")||l.includes("motion"))&&this.setState({currentClassName:this.props.startClassName,extraStyle:{animationFillMode:this.props.fillMode},isAnimating:!0},()=>{var f,d,p,g;(d=(f=this.props).onAnimationStart)===null||d===void 0||d.call(f),this.props.motion||((g=(p=this.props).onAnimationEnd)===null||g===void 0||g.call(p,this.state.isAnimating),this.setState({isAnimating:!1}))})}render(){var i;return this.props.motion?this.props.children({animationClassName:(i=this.state.currentClassName)!==null&&i!==void 0?i:"",animationStyle:this.state.extraStyle,animationEventsNeedBind:{onAnimationStart:this.handleAnimationStart,onAnimationEnd:this.handleAnimationEnd},isAnimating:this.state.isAnimating}):this.props.children({animationClassName:"",animationStyle:{},animationEventsNeedBind:{},isAnimating:this.state.isAnimating})}}F1.defaultProps={motion:!0,replayKey:""};var Wy=function(s,i){var r={};for(var o in s)Object.prototype.hasOwnProperty.call(s,o)&&i.indexOf(o)<0&&(r[o]=s[o]);if(s!=null&&typeof Object.getOwnPropertySymbols=="function")for(var l=0,o=Object.getOwnPropertySymbols(s);ldocument.body;class zn extends $r{constructor(i){super(i),this.isAnimating=!1,this.cachedLatestTransitionState="enter",this.setContainerEl=r=>this.containerEl={current:r},this.isSpecial=r=>{if(Ni(r))return!!r.disabled;if(Ee.isValidElement(r)){if(Te(r,"props.disabled"))return Mi.STATUS_DISABLED;const l=Te(r,"props.loading"),f=!Fn(r)&&!Fn(r.type)&&(Te(r,"type.elementType")==="Button"||Te(r,"type.elementType")==="IconButton");if(l&&f)return Mi.STATUS_LOADING}return!1},this.didLeave=()=>{this.props.keepDOM?this.foundation.setDisplayNone(!0):this.foundation.removePortal(),this.foundation.unBindEvent()},this.renderIcon=()=>{const{placement:r}=this.state,{showArrow:o,prefixCls:l,style:f}=this.props;let d=null;const p=Le([`${l}-icon-arrow`]),g=Te(f,"backgroundColor"),m=r!=null&&r.includes("left")||r!=null&&r.includes("right")?I.createElement(JC,null):I.createElement(YC,null);return o&&(Ee.isValidElement(o)?d=o:d=I.cloneElement(m,{className:p,style:{color:g,fill:"currentColor"}})),d},this.handlePortalInnerClick=r=>{this.props.clickToHide&&this.foundation.hide(),this.props.stopPropagation&&oa(r)},this.handlePortalMouseDown=r=>{this.props.stopPropagation&&oa(r)},this.handlePortalFocus=r=>{this.props.stopPropagation&&oa(r)},this.handlePortalBlur=r=>{this.props.stopPropagation&&oa(r)},this.handlePortalInnerKeyDown=r=>{this.foundation.handleContainerKeydown(r)},this.renderContentNode=r=>{const o={initialFocusRef:this.initialFocusRef};return md(r)?r(o):r},this.renderPortal=()=>{const{containerStyle:r={},visible:o,portalEventSet:l,placement:f,displayNone:d,transitionState:p,id:g,isPositionUpdated:m}=this.state,{prefixCls:_,content:C,showArrow:b,style:x,motion:A,role:k,zIndex:R}=this.props,z=this.renderContentNode(C),{className:H}=this.props,W=this.context.direction,$=Le(H,{[`${_}-wrapper`]:!0,[`${_}-wrapper-show`]:o,[`${_}-with-arrow`]:!!b,[`${_}-rtl`]:W==="rtl"}),Y=this.renderIcon(),M=Ta(r,A?["transformOrigin"]:void 0),N=Te(r,"transformOrigin"),U=Te(r,"--semi-tooltip-arrow-offset-x"),X=Te(r,"--semi-tooltip-arrow-offset-y"),ee=Object.assign(Object.assign({},U?{"--semi-tooltip-arrow-offset-x":U}:{}),X?{"--semi-tooltip-arrow-offset-y":X}:{}),V=Te(x,"opacity",null),ce=V||1,ne=I.createElement(F1,{fillMode:"forwards",animationState:p,motion:A&&m,startClassName:p==="enter"?`${la}-animation-show`:`${la}-animation-hide`,onAnimationStart:()=>this.isAnimating=!0,onAnimationEnd:()=>{var pe,_e;p==="leave"&&(this.didLeave(),(_e=(pe=this.props).afterClose)===null||_e===void 0||_e.call(pe)),this.isAnimating=!1}},pe=>{let{animationStyle:_e,animationClassName:Pe,animationEventsNeedBind:we}=pe;return I.createElement("div",Object.assign({className:Le($,Pe),style:Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({},_e),d?{display:"none"}:{}),{transformOrigin:N}),x),ee),V?{opacity:m?ce:"0"}:{})},l,we,{role:k,"x-placement":f,id:g}),I.createElement("div",{className:`${la}-content`},z),Y)});return I.createElement(Ra,{getPopupContainer:this.props.getPopupContainer,style:{zIndex:R}},I.createElement("div",{tabIndex:-1,className:`${qn}-portal-inner`,style:M,ref:this.setContainerEl,onClick:this.handlePortalInnerClick,onFocus:this.handlePortalFocus,onBlur:this.handlePortalBlur,onMouseDown:this.handlePortalMouseDown,onKeyDown:this.handlePortalInnerKeyDown},ne))},this.wrapSpan=r=>{const{wrapperClassName:o}=this.props,l=Te(r,"props.style.display"),f=Te(r,"props.block"),d=typeof r=="string",p={};return d||(p.display="inline-block"),(f||rT.includes(l))&&(p.width="100%"),I.createElement("span",{className:o,style:p},r)},this.mergeEvents=(r,o)=>{const l={};return TC(o,(f,d)=>{typeof f=="function"&&(l[d]=function(){f(...arguments),r&&typeof r[d]=="function"&&r[d](...arguments)})}),l},this.getPopupId=()=>this.state.id,this.state={visible:!1,transitionState:"",triggerEventSet:{},portalEventSet:{},containerStyle:{},isInsert:!1,placement:i.position||"top",transitionStyle:{},isPositionUpdated:!1,id:i.wrapperId,displayNone:!1},this.foundation=new xC(this.adapter),this.eventManager=new EC,this.triggerEl=I.createRef(),this.containerEl=I.createRef(),this.initialFocusRef=I.createRef(),this.clickOutsideHandler=null,this.resizeHandler=null,this.isWrapped=!1,this.containerPosition=void 0}get adapter(){var i=this;return Object.assign(Object.assign({},super.adapter),{on:function(){return i.eventManager.on(...arguments)},off:function(){return i.eventManager.off(...arguments)},getAnimatingState:()=>this.isAnimating,insertPortal:(r,o)=>{var{position:l}=o,f=Wy(o,["position"]);this.cachedLatestTransitionState="enter",this.setState({isInsert:!0,transitionState:"enter",containerStyle:Object.assign(Object.assign({},this.state.containerStyle),f),isPositionUpdated:!1},()=>{var d;const p=()=>{this.cachedLatestTransitionState==="enter"&&this.eventManager.emit("portalInserted")},g=(d=this.containerEl)===null||d===void 0?void 0:d.current;if(g&&(g.offsetWidth>0||g.offsetHeight>0)){p();return}if(g&&typeof ResizeObserver<"u"){let m=!1;const _=new ResizeObserver(()=>{!m&&g.offsetWidth>0&&g.offsetHeight>0&&(m=!0,_.disconnect(),p())});_.observe(g),setTimeout(()=>{m||(m=!0,_.disconnect(),p())},50);return}setTimeout(p,0)})},removePortal:()=>{this.setState({isInsert:!1,isPositionUpdated:!1})},getEventName:()=>({mouseEnter:"onMouseEnter",mouseLeave:"onMouseLeave",mouseOut:"onMouseOut",mouseOver:"onMouseOver",click:"onClick",focus:"onFocus",blur:"onBlur",keydown:"onKeyDown",contextMenu:"onContextMenu"}),registerTriggerEvent:r=>{this.setState({triggerEventSet:r})},registerPortalEvent:r=>{this.setState({portalEventSet:r})},getTriggerBounding:()=>{const r=this.adapter.getTriggerNode();return this.triggerEl.current=r,r&&r.getBoundingClientRect()},getPopupContainerRect:()=>{const r=this.getPopupContainer();let o=null;if(r&&Ni(r)){const l=PC(r.getBoundingClientRect());o=Object.assign(Object.assign({},l),{scrollLeft:r.scrollLeft,scrollTop:r.scrollTop})}return o},containerIsBody:()=>this.getPopupContainer()===document.body,containerIsRelative:()=>{const r=this.getPopupContainer();return window.getComputedStyle(r).getPropertyValue("position")==="relative"},containerIsRelativeOrAbsolute:()=>["relative","absolute"].includes(this.containerPosition),getWrapperBounding:()=>{const r=this.containerEl&&this.containerEl.current;return r&&r.getBoundingClientRect()},getDocumentElementBounding:()=>document.documentElement.getBoundingClientRect(),setPosition:r=>{var{position:o}=r,l=Wy(r,["position"]);this.setState({containerStyle:Object.assign(Object.assign({},this.state.containerStyle),l),placement:o,isPositionUpdated:!0},()=>{this.eventManager.emit("positionUpdated")})},setDisplayNone:(r,o)=>{this.setState({displayNone:r},o)},updatePlacementAttr:r=>{this.setState({placement:r})},togglePortalVisible:(r,o)=>{const l={};l.transitionState=r?"enter":"leave",l.visible=r,this.cachedLatestTransitionState=l.transitionState,this.mounted&&this.setState(l,()=>{o()})},registerClickOutsideHandler:r=>{this.clickOutsideHandler&&this.adapter.unregisterClickOutsideHandler(),this.clickOutsideHandler=o=>{var l;if(!this.mounted)return!1;let f=this.triggerEl&&this.triggerEl.current,d=this.containerEl&&this.containerEl.current;f=(l=ji(f))!==null&&l!==void 0?l:f;const p=o.target,g=o.composedPath&&o.composedPath()||[p],m=this.props.clickTriggerToHide?f&&f.contains(p)||g.includes(f):!1;(f&&!f.contains(p)&&d&&!d.contains(p)&&!(g.includes(d)||g.includes(f))||m)&&(this.props.onClickOutSide(o),r())},window.addEventListener("mousedown",this.clickOutsideHandler)},unregisterClickOutsideHandler:()=>{this.clickOutsideHandler&&(window.removeEventListener("mousedown",this.clickOutsideHandler),this.clickOutsideHandler=null)},registerResizeHandler:r=>{this.resizeHandler&&this.adapter.unregisterResizeHandler(),this.resizeHandler=hm(o=>{if(!this.mounted)return!1;r(o)},10),window.addEventListener("resize",this.resizeHandler,!1)},unregisterResizeHandler:()=>{this.resizeHandler&&(window.removeEventListener("resize",this.resizeHandler,!1),this.resizeHandler=null)},notifyVisibleChange:r=>{this.props.onVisibleChange(r)},registerScrollHandler:r=>{this.scrollHandler&&this.adapter.unregisterScrollHandler(),this.scrollHandler=hm(o=>{if(!this.mounted)return!1;const l=this.adapter.getTriggerNode();if(o.target.contains(l)){const d={x:o.target.scrollLeft,y:o.target.scrollTop};r(d)}},10),window.addEventListener("scroll",this.scrollHandler,!0)},unregisterScrollHandler:()=>{this.scrollHandler&&(window.removeEventListener("scroll",this.scrollHandler,!0),this.scrollHandler=null)},canMotion:()=>!!this.props.motion,updateContainerPosition:()=>{const r=document.body.getAttribute("data-position");if(r){this.containerPosition=r;return}requestAnimationFrame(()=>{const o=this.getPopupContainer();if(o&&Ni(o)){const f=window.getComputedStyle(o).getPropertyValue("position");document.body.setAttribute("data-position",f),this.containerPosition=f}})},getContainerPosition:()=>this.containerPosition,getContainer:()=>this.containerEl&&this.containerEl.current,getTriggerNode:()=>{let r=this.triggerEl.current;if(!Ni(r)){const o=ji(r);if(o)r=o;else return r&&Fi(!0,"[Semi Tooltip] The trigger element's ref did not return a DOM node. Please ensure the trigger component forwards ref correctly."),null}return r},getFocusableElements:r=>zC(r),getActiveElement:()=>qC(),setInitialFocus:()=>{const{preventScroll:r}=this.props,o=Te(this,"initialFocusRef.current");o&&"focus"in o&&o.focus({preventScroll:r})},notifyEscKeydown:r=>{this.props.onEscKeyDown(r)},setId:()=>{this.setState({id:vd()})},getTriggerDOM:()=>this.triggerEl.current?ji(this.triggerEl.current):null})}componentDidMount(){this.mounted=!0,this.getPopupContainer=this.props.getPopupContainer||this.context.getPopupContainer||iT,this.foundation.init(),yd(()=>{let i=this.triggerEl.current;i&&!(i instanceof HTMLElement)&&(i=ji(i)),this.foundation.updateStateIfCursorOnTrigger(i)},1)}componentWillUnmount(){this.mounted=!1,this.foundation.destroy()}focusTrigger(){this.foundation.focusTrigger()}rePosition(){return this.foundation.calcPosition()}componentDidUpdate(i,r){Fi(this.props.mouseLeaveDelay{const{tooltipRef:A}=g.props;A?this.triggerEl.current=A.current:this.triggerEl.current=x;const k=L1(g);typeof k=="function"?k(x):k&&typeof k=="object"&&(k.current=x)},tabIndex:g.props.tabIndex||0,"data-popupid":l}));return I.createElement(I.Fragment,null,i?this.renderPortal():null,b)}}zn.contextType=xa;zn.propTypes={children:v.node,motion:v.bool,autoAdjustOverflow:v.bool,position:v.oneOf(tT),getPopupContainer:v.func,mouseEnterDelay:v.number,mouseLeaveDelay:v.number,trigger:v.oneOf(nT).isRequired,className:v.string,wrapperClassName:v.string,clickToHide:v.bool,clickTriggerToHide:v.bool,visible:v.bool,style:v.object,content:v.oneOfType([v.node,v.func]),prefixCls:v.string,onVisibleChange:v.func,onClickOutSide:v.func,spacing:v.oneOfType([v.number,v.object]),margin:v.oneOfType([v.number,v.object]),showArrow:v.oneOfType([v.bool,v.node]),zIndex:v.number,rePosKey:v.oneOfType([v.string,v.number]),arrowBounding:eT,transformFromCenter:v.bool,arrowPointAtCenter:v.bool,stopPropagation:v.bool,role:v.string,wrapWhenSpecial:v.bool,guardFocus:v.bool,returnFocusOnClose:v.bool,preventScroll:v.bool,keepDOM:v.bool,condition:v.bool};zn.__SemiComponentName__="Tooltip";zn.defaultProps=ba(zn.__SemiComponentName__,{arrowBounding:ar.ARROW_BOUNDING,autoAdjustOverflow:!0,arrowPointAtCenter:!0,trigger:"hover",transformFromCenter:!0,position:"top",prefixCls:la,role:"tooltip",mouseEnterDelay:ar.MOUSE_ENTER_DELAY,mouseLeaveDelay:ar.MOUSE_LEAVE_DELAY,motion:!0,onVisibleChange:Ze,onClickOutSide:Ze,spacing:ar.SPACING,margin:ar.MARGIN,showArrow:!0,wrapWhenSpecial:!0,zIndex:ar.DEFAULT_Z_INDEX,closeOnEsc:!1,guardFocus:!1,returnFocusOnClose:!1,onEscKeyDown:Ze,disableFocusListener:!1,disableArrowKeyDown:!1,keepDOM:!1,condition:!0});var aa={exports:{}},Vy;function oT(){if(Vy)return aa.exports;Vy=1;const s=(i,{target:r=document.body}={})=>{const o=document.createElement("textarea"),l=document.activeElement;o.value=i,o.setAttribute("readonly",""),o.style.contain="strict",o.style.position="absolute",o.style.left="-9999px",o.style.fontSize="12pt";const f=document.getSelection();let d=!1;f.rangeCount>0&&(d=f.getRangeAt(0)),r.append(o),o.select(),o.selectionStart=0,o.selectionEnd=i.length;let p=!1;try{p=document.execCommand("copy")}catch{}return o.remove(),d&&(f.removeAllRanges(),f.addRange(d)),l&&l.focus(),p};return aa.exports=s,aa.exports.default=s,aa.exports}var aT=oT();const sT=He(aT);function q1(){}const z1=I.createContext(null);function Dr(s){return function(){var i=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{},r=i.width?String(i.width):s.defaultWidth,o=s.formats[r]||s.formats[s.defaultWidth];return o}}function tn(s){return function(i,r){var o=r!=null&&r.context?String(r.context):"standalone",l;if(o==="formatting"&&s.formattingValues){var f=s.defaultFormattingWidth||s.defaultWidth,d=r!=null&&r.width?String(r.width):f;l=s.formattingValues[d]||s.formattingValues[f]}else{var p=s.defaultWidth,g=r!=null&&r.width?String(r.width):s.defaultWidth;l=s.values[g]||s.values[p]}var m=s.argumentCallback?s.argumentCallback(i):i;return l[m]}}function nn(s){return function(i){var r=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{},o=r.width,l=o&&s.matchPatterns[o]||s.matchPatterns[s.defaultMatchWidth],f=i.match(l);if(!f)return null;var d=f[0],p=o&&s.parsePatterns[o]||s.parsePatterns[s.defaultParseWidth],g=Array.isArray(p)?uT(p,function(C){return C.test(d)}):lT(p,function(C){return C.test(d)}),m;m=s.valueCallback?s.valueCallback(g):g,m=r.valueCallback?r.valueCallback(m):m;var _=i.slice(d.length);return{value:m,rest:_}}}function lT(s,i){for(var r in s)if(s.hasOwnProperty(r)&&i(s[r]))return r}function uT(s,i){for(var r=0;r1&&arguments[1]!==void 0?arguments[1]:{},o=i.match(s.matchPattern);if(!o)return null;var l=o[0],f=i.match(s.parsePattern);if(!f)return null;var d=s.valueCallback?s.valueCallback(f[0]):f[0];d=r.valueCallback?r.valueCallback(d):d;var p=i.slice(l.length);return{value:d,rest:p}}}function Jf(s){"@babel/helpers - typeof";return Jf=typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?function(i){return typeof i}:function(i){return i&&typeof Symbol=="function"&&i.constructor===Symbol&&i!==Symbol.prototype?"symbol":typeof i},Jf(s)}function cT(s){if(s===null||s===!0||s===!1)return NaN;var i=Number(s);return isNaN(i)?i:i<0?Math.ceil(i):Math.floor(i)}function wd(s,i){if(i.length1?"s":"")+" required, but only "+i.length+" present")}function fT(s){wd(1,arguments);var i=Object.prototype.toString.call(s);return s instanceof Date||Jf(s)==="object"&&i==="[object Date]"?new Date(s.getTime()):typeof s=="number"||i==="[object Number]"?new Date(s):((typeof s=="string"||i==="[object String]")&&typeof console<"u"&&(console.warn("Starting with v2.0.0-beta.1 date-fns doesn't accept strings as date arguments. Please use `parseISO` to parse strings. See: https://github.com/date-fns/date-fns/blob/master/docs/upgradeGuide.md#string-arguments"),console.warn(new Error().stack)),new Date(NaN))}var dT={};function pT(){return dT}function Ky(s,i){var r,o,l,f,d,p,g,m;wd(1,arguments);var _=pT(),C=cT((r=(o=(l=(f=i==null?void 0:i.weekStartsOn)!==null&&f!==void 0?f:i==null||(d=i.locale)===null||d===void 0||(p=d.options)===null||p===void 0?void 0:p.weekStartsOn)!==null&&l!==void 0?l:_.weekStartsOn)!==null&&o!==void 0?o:(g=_.locale)===null||g===void 0||(m=g.options)===null||m===void 0?void 0:m.weekStartsOn)!==null&&r!==void 0?r:0);if(!(C>=0&&C<=6))throw new RangeError("weekStartsOn must be between 0 and 6 inclusively");var b=fT(s),x=b.getUTCDay(),A=(x0?"in "+l:l+" ago":l},mT={full:"EEEE, MMMM do, y",long:"MMMM do, y",medium:"MMM d, y",short:"MM/dd/yyyy"},vT={full:"h:mm:ss a zzzz",long:"h:mm:ss a z",medium:"h:mm:ss a",short:"h:mm a"},yT={full:"{{date}} 'at' {{time}}",long:"{{date}} 'at' {{time}}",medium:"{{date}}, {{time}}",short:"{{date}}, {{time}}"},_T={date:Dr({formats:mT,defaultWidth:"full"}),time:Dr({formats:vT,defaultWidth:"full"}),dateTime:Dr({formats:yT,defaultWidth:"full"})},wT={lastWeek:"'last' eeee 'at' p",yesterday:"'yesterday at' p",today:"'today at' p",tomorrow:"'tomorrow at' p",nextWeek:"eeee 'at' p",other:"P"},ST=function(i,r,o,l){return wT[i]},CT={narrow:["B","A"],abbreviated:["BC","AD"],wide:["Before Christ","Anno Domini"]},TT={narrow:["1","2","3","4"],abbreviated:["Q1","Q2","Q3","Q4"],wide:["1st quarter","2nd quarter","3rd quarter","4th quarter"]},ET={narrow:["J","F","M","A","M","J","J","A","S","O","N","D"],abbreviated:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],wide:["January","February","March","April","May","June","July","August","September","October","November","December"]},OT={narrow:["S","M","T","W","T","F","S"],short:["Su","Mo","Tu","We","Th","Fr","Sa"],abbreviated:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],wide:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"]},PT={narrow:{am:"a",pm:"p",midnight:"mi",noon:"n",morning:"morning",afternoon:"afternoon",evening:"evening",night:"night"},abbreviated:{am:"AM",pm:"PM",midnight:"midnight",noon:"noon",morning:"morning",afternoon:"afternoon",evening:"evening",night:"night"},wide:{am:"a.m.",pm:"p.m.",midnight:"midnight",noon:"noon",morning:"morning",afternoon:"afternoon",evening:"evening",night:"night"}},bT={narrow:{am:"a",pm:"p",midnight:"mi",noon:"n",morning:"in the morning",afternoon:"in the afternoon",evening:"in the evening",night:"at night"},abbreviated:{am:"AM",pm:"PM",midnight:"midnight",noon:"noon",morning:"in the morning",afternoon:"in the afternoon",evening:"in the evening",night:"at night"},wide:{am:"a.m.",pm:"p.m.",midnight:"midnight",noon:"noon",morning:"in the morning",afternoon:"in the afternoon",evening:"in the evening",night:"at night"}},xT=function(i,r){var o=Number(i),l=o%100;if(l>20||l<10)switch(l%10){case 1:return o+"st";case 2:return o+"nd";case 3:return o+"rd"}return o+"th"},RT={ordinalNumber:xT,era:tn({values:CT,defaultWidth:"wide"}),quarter:tn({values:TT,defaultWidth:"wide",argumentCallback:function(i){return i-1}}),month:tn({values:ET,defaultWidth:"wide"}),day:tn({values:OT,defaultWidth:"wide"}),dayPeriod:tn({values:PT,defaultWidth:"wide",formattingValues:bT,defaultFormattingWidth:"wide"})},kT=/^(\d+)(th|st|nd|rd)?/i,IT=/\d+/i,AT={narrow:/^(b|a)/i,abbreviated:/^(b\.?\s?c\.?|b\.?\s?c\.?\s?e\.?|a\.?\s?d\.?|c\.?\s?e\.?)/i,wide:/^(before christ|before common era|anno domini|common era)/i},NT={any:[/^b/i,/^(a|c)/i]},jT={narrow:/^[1234]/i,abbreviated:/^q[1234]/i,wide:/^[1234](th|st|nd|rd)? quarter/i},MT={any:[/1/i,/2/i,/3/i,/4/i]},DT={narrow:/^[jfmasond]/i,abbreviated:/^(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)/i,wide:/^(january|february|march|april|may|june|july|august|september|october|november|december)/i},LT={narrow:[/^j/i,/^f/i,/^m/i,/^a/i,/^m/i,/^j/i,/^j/i,/^a/i,/^s/i,/^o/i,/^n/i,/^d/i],any:[/^ja/i,/^f/i,/^mar/i,/^ap/i,/^may/i,/^jun/i,/^jul/i,/^au/i,/^s/i,/^o/i,/^n/i,/^d/i]},FT={narrow:/^[smtwf]/i,short:/^(su|mo|tu|we|th|fr|sa)/i,abbreviated:/^(sun|mon|tue|wed|thu|fri|sat)/i,wide:/^(sunday|monday|tuesday|wednesday|thursday|friday|saturday)/i},qT={narrow:[/^s/i,/^m/i,/^t/i,/^w/i,/^t/i,/^f/i,/^s/i],any:[/^su/i,/^m/i,/^tu/i,/^w/i,/^th/i,/^f/i,/^sa/i]},zT={narrow:/^(a|p|mi|n|(in the|at) (morning|afternoon|evening|night))/i,any:/^([ap]\.?\s?m\.?|midnight|noon|(in the|at) (morning|afternoon|evening|night))/i},$T={any:{am:/^a/i,pm:/^p/i,midnight:/^mi/i,noon:/^no/i,morning:/morning/i,afternoon:/afternoon/i,evening:/evening/i,night:/night/i}},BT={ordinalNumber:$1({matchPattern:kT,parsePattern:IT,valueCallback:function(i){return parseInt(i,10)}}),era:nn({matchPatterns:AT,defaultMatchWidth:"wide",parsePatterns:NT,defaultParseWidth:"any"}),quarter:nn({matchPatterns:jT,defaultMatchWidth:"wide",parsePatterns:MT,defaultParseWidth:"any",valueCallback:function(i){return i+1}}),month:nn({matchPatterns:DT,defaultMatchWidth:"wide",parsePatterns:LT,defaultParseWidth:"any"}),day:nn({matchPatterns:FT,defaultMatchWidth:"wide",parsePatterns:qT,defaultParseWidth:"any"}),dayPeriod:nn({matchPatterns:zT,defaultMatchWidth:"any",parsePatterns:$T,defaultParseWidth:"any"})},HT={code:"en-US",formatDistance:gT,formatLong:_T,formatRelative:ST,localize:RT,match:BT,options:{weekStartsOn:0,firstWeekContainsDate:1}};function UT(s,i,r){wd(2,arguments);var o=Ky(s,r),l=Ky(i,r);return o.getTime()===l.getTime()}var WT={lessThanXSeconds:{one:"不到 1 秒",other:"不到 {{count}} 秒"},xSeconds:{one:"1 秒",other:"{{count}} 秒"},halfAMinute:"半分钟",lessThanXMinutes:{one:"不到 1 分钟",other:"不到 {{count}} 分钟"},xMinutes:{one:"1 分钟",other:"{{count}} 分钟"},xHours:{one:"1 小时",other:"{{count}} 小时"},aboutXHours:{one:"大约 1 小时",other:"大约 {{count}} 小时"},xDays:{one:"1 天",other:"{{count}} 天"},aboutXWeeks:{one:"大约 1 个星期",other:"大约 {{count}} 个星期"},xWeeks:{one:"1 个星期",other:"{{count}} 个星期"},aboutXMonths:{one:"大约 1 个月",other:"大约 {{count}} 个月"},xMonths:{one:"1 个月",other:"{{count}} 个月"},aboutXYears:{one:"大约 1 年",other:"大约 {{count}} 年"},xYears:{one:"1 年",other:"{{count}} 年"},overXYears:{one:"超过 1 年",other:"超过 {{count}} 年"},almostXYears:{one:"将近 1 年",other:"将近 {{count}} 年"}},VT=function(i,r,o){var l,f=WT[i];return typeof f=="string"?l=f:r===1?l=f.one:l=f.other.replace("{{count}}",String(r)),o!=null&&o.addSuffix?o.comparison&&o.comparison>0?l+"内":l+"前":l},KT={full:"y'年'M'月'd'日' EEEE",long:"y'年'M'月'd'日'",medium:"yyyy-MM-dd",short:"yy-MM-dd"},GT={full:"zzzz a h:mm:ss",long:"z a h:mm:ss",medium:"a h:mm:ss",short:"a h:mm"},XT={full:"{{date}} {{time}}",long:"{{date}} {{time}}",medium:"{{date}} {{time}}",short:"{{date}} {{time}}"},QT={date:Dr({formats:KT,defaultWidth:"full"}),time:Dr({formats:GT,defaultWidth:"full"}),dateTime:Dr({formats:XT,defaultWidth:"full"})};function Gy(s,i,r){var o="eeee p";return UT(s,i,r)?o:s.getTime()>i.getTime()?"'下个'"+o:"'上个'"+o}var YT={lastWeek:Gy,yesterday:"'昨天' p",today:"'今天' p",tomorrow:"'明天' p",nextWeek:Gy,other:"PP p"},ZT=function(i,r,o,l){var f=YT[i];return typeof f=="function"?f(r,o,l):f},JT={narrow:["前","公元"],abbreviated:["前","公元"],wide:["公元前","公元"]},eE={narrow:["1","2","3","4"],abbreviated:["第一季","第二季","第三季","第四季"],wide:["第一季度","第二季度","第三季度","第四季度"]},tE={narrow:["一","二","三","四","五","六","七","八","九","十","十一","十二"],abbreviated:["1月","2月","3月","4月","5月","6月","7月","8月","9月","10月","11月","12月"],wide:["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月"]},nE={narrow:["日","一","二","三","四","五","六"],short:["日","一","二","三","四","五","六"],abbreviated:["周日","周一","周二","周三","周四","周五","周六"],wide:["星期日","星期一","星期二","星期三","星期四","星期五","星期六"]},rE={narrow:{am:"上",pm:"下",midnight:"凌晨",noon:"午",morning:"早",afternoon:"下午",evening:"晚",night:"夜"},abbreviated:{am:"上午",pm:"下午",midnight:"凌晨",noon:"中午",morning:"早晨",afternoon:"中午",evening:"晚上",night:"夜间"},wide:{am:"上午",pm:"下午",midnight:"凌晨",noon:"中午",morning:"早晨",afternoon:"中午",evening:"晚上",night:"夜间"}},iE={narrow:{am:"上",pm:"下",midnight:"凌晨",noon:"午",morning:"早",afternoon:"下午",evening:"晚",night:"夜"},abbreviated:{am:"上午",pm:"下午",midnight:"凌晨",noon:"中午",morning:"早晨",afternoon:"中午",evening:"晚上",night:"夜间"},wide:{am:"上午",pm:"下午",midnight:"凌晨",noon:"中午",morning:"早晨",afternoon:"中午",evening:"晚上",night:"夜间"}},oE=function(i,r){var o=Number(i);switch(r==null?void 0:r.unit){case"date":return o.toString()+"日";case"hour":return o.toString()+"时";case"minute":return o.toString()+"分";case"second":return o.toString()+"秒";default:return"第 "+o.toString()}},aE={ordinalNumber:oE,era:tn({values:JT,defaultWidth:"wide"}),quarter:tn({values:eE,defaultWidth:"wide",argumentCallback:function(i){return i-1}}),month:tn({values:tE,defaultWidth:"wide"}),day:tn({values:nE,defaultWidth:"wide"}),dayPeriod:tn({values:rE,defaultWidth:"wide",formattingValues:iE,defaultFormattingWidth:"wide"})},sE=/^(第\s*)?\d+(日|时|分|秒)?/i,lE=/\d+/i,uE={narrow:/^(前)/i,abbreviated:/^(前)/i,wide:/^(公元前|公元)/i},cE={any:[/^(前)/i,/^(公元)/i]},fE={narrow:/^[1234]/i,abbreviated:/^第[一二三四]刻/i,wide:/^第[一二三四]刻钟/i},dE={any:[/(1|一)/i,/(2|二)/i,/(3|三)/i,/(4|四)/i]},pE={narrow:/^(一|二|三|四|五|六|七|八|九|十[二一])/i,abbreviated:/^(一|二|三|四|五|六|七|八|九|十[二一]|\d|1[12])月/i,wide:/^(一|二|三|四|五|六|七|八|九|十[二一])月/i},hE={narrow:[/^一/i,/^二/i,/^三/i,/^四/i,/^五/i,/^六/i,/^七/i,/^八/i,/^九/i,/^十(?!(一|二))/i,/^十一/i,/^十二/i],any:[/^一|1/i,/^二|2/i,/^三|3/i,/^四|4/i,/^五|5/i,/^六|6/i,/^七|7/i,/^八|8/i,/^九|9/i,/^十(?!(一|二))|10/i,/^十一|11/i,/^十二|12/i]},gE={narrow:/^[一二三四五六日]/i,short:/^[一二三四五六日]/i,abbreviated:/^周[一二三四五六日]/i,wide:/^星期[一二三四五六日]/i},mE={any:[/日/i,/一/i,/二/i,/三/i,/四/i,/五/i,/六/i]},vE={any:/^(上午?|下午?|午夜|[中正]午|早上?|下午|晚上?|凌晨|)/i},yE={any:{am:/^上午?/i,pm:/^下午?/i,midnight:/^午夜/i,noon:/^[中正]午/i,morning:/^早上/i,afternoon:/^下午/i,evening:/^晚上?/i,night:/^凌晨/i}},_E={ordinalNumber:$1({matchPattern:sE,parsePattern:lE,valueCallback:function(i){return parseInt(i,10)}}),era:nn({matchPatterns:uE,defaultMatchWidth:"wide",parsePatterns:cE,defaultParseWidth:"any"}),quarter:nn({matchPatterns:fE,defaultMatchWidth:"wide",parsePatterns:dE,defaultParseWidth:"any",valueCallback:function(i){return i+1}}),month:nn({matchPatterns:pE,defaultMatchWidth:"wide",parsePatterns:hE,defaultParseWidth:"any"}),day:nn({matchPatterns:gE,defaultMatchWidth:"wide",parsePatterns:mE,defaultParseWidth:"any"}),dayPeriod:nn({matchPatterns:vE,defaultMatchWidth:"any",parsePatterns:yE,defaultParseWidth:"any"})},wE={code:"zh-CN",formatDistance:VT,formatLong:QT,formatRelative:ZT,localize:aE,match:_E,options:{weekStartsOn:1,firstWeekContainsDate:4}};const ed={code:"zh-CN",currency:"CNY",dateFnsLocale:wE,Pagination:{pageSize:"每页条数:${pageSize}",total:"总页数:${total}",jumpTo:"跳至",page:"页"},Modal:{confirm:"确定",cancel:"取消"},Tabs:{more:"更多"},TimePicker:{placeholder:{time:"请选择时间",timeRange:"请选择时间范围"},begin:"开始时间",end:"结束时间",hour:"时",minute:"分",second:"秒",AM:"上午",PM:"下午"},DatePicker:{placeholder:{date:"请选择日期",dateTime:"请选择日期及时间",dateRange:["开始日期","结束日期"],dateTimeRange:["开始日期","结束日期"],monthRange:["开始月份","结束月份"]},presets:"快捷选择",footer:{confirm:"确定",cancel:"取消"},selectDate:"返回选择日期",selectTime:"选择时间",year:"年",month:"月",day:"日",monthText:"${year}年 ${month}",months:{1:"1月",2:"2月",3:"3月",4:"4月",5:"5月",6:"6月",7:"7月",8:"8月",9:"9月",10:"10月",11:"11月",12:"12月"},fullMonths:{1:"1",2:"2",3:"3",4:"4",5:"5",6:"6",7:"7",8:"8",9:"9",10:"10",11:"11",12:"12"},weeks:{Mon:"一",Tue:"二",Wed:"三",Thu:"四",Fri:"五",Sat:"六",Sun:"日"},localeFormatToken:{FORMAT_SWITCH_DATE:"yyyy-MM-dd"}},Navigation:{collapseText:"收起侧边栏",expandText:"展开侧边栏"},Popconfirm:{confirm:"确定",cancel:"取消"},Table:{emptyText:"暂无数据",pageText:"显示第 ${currentStart} 条-第 ${currentEnd} 条,共 ${total} 条",descend:"点击降序",ascend:"点击升序",cancelSort:"取消排序",confirmFilter:"确定",resetFilter:"重置"},Select:{emptyText:"暂无数据",createText:"创建"},Cascader:{emptyText:"暂无数据"},Tree:{emptyText:"暂无数据",searchPlaceholder:"搜索"},List:{emptyText:"暂无数据"},Calendar:{allDay:"全天",AM:"上午${time}时",PM:"下午${time}时",datestring:"日",remaining:"还有${remained}项"},Upload:{mainText:"点击上传文件或拖拽文件到这里",illegalTips:"不支持此类型文件",legalTips:"松手开始上传",retry:"重试",replace:"替换文件",clear:"清空",selectedFiles:"已选择文件",illegalSize:"文件尺寸不合法",fail:"上传失败",cropTitle:"裁切图片",cropOk:"确定",cropCancel:"取消"},TreeSelect:{searchPlaceholder:"搜索"},Typography:{copy:"复制",copied:"复制成功",expand:"展开",collapse:"收起"},Transfer:{emptyLeft:"暂无数据",emptySearch:"无搜索结果",emptyRight:"暂无内容,可从左侧勾选",placeholder:"搜索",clear:"清空",selectAll:"全选",clearSelectAll:"取消全选",total:"总个数:${total}",selected:"已选个数:${total}"},Form:{optional:"(可选)"},Image:{preview:"预览",loading:"加载中",loadError:"加载失败",prevTip:"上一张",nextTip:"下一张",zoomInTip:"放大",zoomOutTip:"缩小",rotateTip:"旋转",downloadTip:"下载",adaptiveTip:"适应页面",originTip:"原始尺寸"},Chat:{deleteConfirm:"确认删除该会话吗?",clearContext:"上下文已清除",copySuccess:"复制成功",stop:"停止",copy:"复制",copied:"复制成功",dropAreaText:"将文件放到这里"},UserGuide:{skip:"跳过",next:"下一步",prev:"上一步",finish:"完成"},InputNumber:{},JsonViewer:{search:"查找",replace:"替换",replaceAll:"全部替换"},VideoPlayer:{rateChange:"切换速率至 ${rate}",qualityChange:"切换清晰度至${quality}",routeChange:"切换线路至${route}",mirror:"镜像",cancelMirror:"取消镜像",loading:"加载中...",stall:"加载失败",noResource:"暂无资源",videoError:"视频加载错误"},AIChatDialogue:{delete:"删除",deleteConfirm:"确认要删除吗?",deleteContent:"删除后将无法恢复!",copySuccess:"复制成功",loading:"请稍候...",reasoning:{completed:"已思考完成",thinking:"正在思考中..."},annotationText:"篇资料"},Feedback:{submit:"提交",cancel:"取消"},AIChatInput:{template:"模板",configure:"配置",selected:"已选 ${count} 个"},Sidebar:{linkAddSuccess:"已添加链接",linkRemoveSuccess:"已移除链接",enterLinkAddress:"输入链接地址",validateFailInfo:"验证失败,请重新上传",uploadFailInfo:"上传失败,请重试",uploadImgInfo:"点击上传图片或者拖拽图片到这里",defaultMcpInfo:"预设 MCP,不可关闭",searchPlaceholder:"请输入",emptyCustomMcpInfo:"暂无自定义 MCP",newMcpAdd:"自定义 MCP",mcpConfigure:"MCP 配置",annotationTitle:"参考来源",activeMCPNumber:"已激活 MCP 数:",copySuccess:"复制成功"},AudioPlayer:{backward:"后退 ${skipDuration} 秒",forward:"前进 ${skipDuration} 秒",prev:"上一首",next:"下一首",loop:"循环播放",volume:"音量",mediaError:"音频加载失败"}};class qi extends Ee.Component{renderChildren(i,r){const{componentName:o}=this.props;let l=i;i!=null&&i.code||(l=ed);const f=Te(ed,"dateFnsLocale"),d=Te(l,"dateFnsLocale",f),p=Te(l,"currency");return r(l[o],l.code,d,p)}render(){const{children:i}=this.props;return I.createElement(xa.Consumer,null,r=>{let{locale:o}=r;return I.createElement(z1.Consumer,null,l=>this.renderChildren(o||l,i))})}}qi.propTypes={componentName:v.string.isRequired,children:v.any};qi.defaultProps={componentName:""};const SE="semi";var CE=function(s,i){var r={};for(var o in s)Object.prototype.hasOwnProperty.call(s,o)&&i.indexOf(o)<0&&(r[o]=s[o]);if(s!=null&&typeof Object.getOwnPropertySymbols=="function")for(var l=0,o=Object.getOwnPropertySymbols(s);l{const{svg:r,spin:o=!1,rotate:l,style:f,className:d,prefixCls:p=SE,type:g,size:m="default",fill:_}=s,C=CE(s,["svg","spin","rotate","style","className","prefixCls","type","size","fill"]),b=Le(`${p}-icon`,{[`${p}-icon-extra-small`]:m==="extra-small",[`${p}-icon-small`]:m==="small",[`${p}-icon-default`]:m==="default",[`${p}-icon-large`]:m==="large",[`${p}-icon-extra-large`]:m==="extra-large",[`${p}-icon-spinning`]:o===!0,[`${p}-icon-${g}`]:!!g},d),x={};return Number.isSafeInteger(l)&&(x.transform=`rotate(${l}deg)`),Object.assign(x,f),I.createElement("span",Object.assign({role:"img",ref:i,"aria-label":g,className:b,style:x},C),_?I.cloneElement(r,{fill:_}):r)});B1.elementType="Icon";const Ur=(s,i)=>{const r=I.forwardRef((o,l)=>I.createElement(B1,Object.assign({svg:I.createElement(s),type:i,ref:l},o)));return r.elementType="Icon",r};function TE(s){return Ee.createElement("svg",Object.assign({viewBox:"0 0 24 24",fill:"none",xmlns:"http://www.w3.org/2000/svg",width:"1em",height:"1em",focusable:!1,"aria-hidden":!0},s),Ee.createElement("path",{fillRule:"evenodd",clipRule:"evenodd",d:"M23 12a11 11 0 1 1-22 0 11 11 0 0 1 22 0Zm-9.5 5.5a1.5 1.5 0 1 0-3 0 1.5 1.5 0 0 0 3 0ZM12 5a1.9 1.9 0 0 0-1.89 2l.3 5.5a1.59 1.59 0 0 0 3.17 0l.3-5.5c.07-1.09-.8-2-1.88-2Z",fill:"currentColor"}))}const bO=Ur(TE,"alert_circle");function EE(s){return Ee.createElement("svg",Object.assign({viewBox:"0 0 24 24",fill:"none",xmlns:"http://www.w3.org/2000/svg",width:"1em",height:"1em",focusable:!1,"aria-hidden":!0},s),Ee.createElement("path",{fillRule:"evenodd",clipRule:"evenodd",d:"M4.08 7.6a1.5 1.5 0 0 1 2.12 0l5.66 5.65 5.66-5.65a1.5 1.5 0 1 1 2.12 2.12l-6.72 6.72a1.5 1.5 0 0 1-2.12 0L4.08 9.72a1.5 1.5 0 0 1 0-2.12Z",fill:"currentColor"}))}const OE=Ur(EE,"chevron_down");function PE(s){return Ee.createElement("svg",Object.assign({viewBox:"0 0 24 24",fill:"none",xmlns:"http://www.w3.org/2000/svg",width:"1em",height:"1em",focusable:!1,"aria-hidden":!0},s),Ee.createElement("path",{fillRule:"evenodd",clipRule:"evenodd",d:"M19.64 16.44a1.5 1.5 0 0 1-2.12 0l-5.66-5.66-5.66 5.66a1.5 1.5 0 1 1-2.12-2.12L10.8 7.6a1.5 1.5 0 0 1 2.12 0l6.72 6.72a1.5 1.5 0 0 1 0 2.12Z",fill:"currentColor"}))}const bE=Ur(PE,"chevron_up");function xE(s){return Ee.createElement("svg",Object.assign({viewBox:"0 0 24 24",fill:"none",xmlns:"http://www.w3.org/2000/svg",width:"1em",height:"1em",focusable:!1,"aria-hidden":!0},s),Ee.createElement("path",{d:"M7 4c0-1.1.9-2 2-2h11a2 2 0 0 1 2 2v11a2 2 0 0 1-2 2h-1V8c0-2-1-3-3-3H7V4Z",fill:"currentColor"}),Ee.createElement("path",{d:"M5 7a2 2 0 0 0-2 2v10c0 1.1.9 2 2 2h10a2 2 0 0 0 2-2V9a2 2 0 0 0-2-2H5Z",fill:"currentColor"}))}const RE=Ur(xE,"copy");function kE(s){return Ee.createElement("svg",Object.assign({viewBox:"0 0 24 24",fill:"none",xmlns:"http://www.w3.org/2000/svg",width:"1em",height:"1em",focusable:!1,"aria-hidden":!0},s),Ee.createElement("path",{fillRule:"evenodd",clipRule:"evenodd",d:"M21.35 4.27c.68.47.86 1.4.38 2.08l-10 14.5a1.5 1.5 0 0 1-2.33.17l-6.5-7a1.5 1.5 0 0 1 2.2-2.04l5.23 5.63 8.94-12.96a1.5 1.5 0 0 1 2.08-.38Z",fill:"currentColor"}))}const IE=Ur(kE,"tick");function AE(s){return Ee.createElement("svg",Object.assign({viewBox:"0 0 24 24",fill:"none",xmlns:"http://www.w3.org/2000/svg",width:"1em",height:"1em",focusable:!1,"aria-hidden":!0},s),Ee.createElement("path",{fillRule:"evenodd",clipRule:"evenodd",d:"M12 23a11 11 0 1 0 0-22 11 11 0 0 0 0 22Zm5.88-13.18-6.2 7.6a1.5 1.5 0 0 1-2.37 0l-3.5-4a1.5 1.5 0 1 1 2.37-1.84l2.3 2.46L15.5 8a1.5 1.5 0 1 1 2.38 1.82Z",fill:"currentColor"}))}const xO=Ur(AE,"tick_circle"),RO={BACKSPACE:8,TAB:9,ENTER:13,ESC:27,UP:38,DOWN:40},NE="Enter";function H1(s){return Te(s,"key")===NE}const Bf=Ea.PREFIX;class Sd extends I.PureComponent{constructor(i){super(i),this.copy=r=>{const{content:o,duration:l,onCopy:f}=this.props,d=sT(o);f&&f(r,o,d),this.setCopied(o,l)},this.setCopied=(r,o)=>{this.setState({copied:!0,item:r}),this._timeId=setTimeout(()=>{this.resetCopied()},o*1e3)},this.resetCopied=()=>{this._timeId&&(clearTimeout(this._timeId),this._timeId=null,this.setState({copied:!1,item:""}))},this.renderSuccessTip=()=>{const{successTip:r}=this.props;return typeof r<"u"?r:I.createElement(qi,{componentName:"Typography"},o=>I.createElement("span",null,I.createElement(IE,null),o.copied))},this.renderCopyIcon=()=>{const{icon:r}=this.props,o={role:"button",tabIndex:0,onClick:this.copy,onKeyPress:f=>H1(f)&&this.copy(f)},l=I.createElement("a",{className:`${Bf}-action-copy-icon`},I.createElement(RE,Object.assign({onClick:this.copy},o)));return I.isValidElement(r)?I.cloneElement(r,o):l},this.state={copied:!1,item:""}}componentWillUnmount(){this._timeId&&(clearTimeout(this._timeId),this._timeId=null)}render(){const{style:i,className:r,forwardRef:o,copyTip:l,render:f}=this.props,{copied:d}=this.state,p=Le(r,{[`${Bf}-action-copy`]:!d,[`${Bf}-action-copied`]:d});return f?f(d,this.copy,this.props):I.createElement(qi,{componentName:"Typography"},g=>I.createElement("span",{style:Object.assign({marginLeft:"4px"},i),className:p,ref:o},d?this.renderSuccessTip():I.createElement(zn,{content:typeof l<"u"?l:g.copy},this.renderCopyIcon())))}}Sd.propTypes={content:v.string,onCopy:v.func,successTip:v.node,copyTip:v.node,duration:v.number,style:v.object,className:v.string,icon:v.node};Sd.defaultProps={content:"",onCopy:q1,duration:3,style:{},className:""};const U1={PREFIX:`${qn}-popover`,ARROW:`${qn}-popover-icon-arrow`},W1={POSITION_SET:["top","topLeft","topRight","left","leftTop","leftBottom","right","rightTop","rightBottom","bottom","bottomLeft","bottomRight","leftTopOver","rightTopOver"],TRIGGER_SET:["hover","focus","click","custom","contextMenu"]},Lr={ARROW_BOUNDING:Object.assign(Object.assign({},ar.ARROW_BOUNDING),{offsetY:6,offsetX:0,height:8}),SPACING:4,SPACING_WITH_ARROW:10,DEFAULT_Z_INDEX:1030};var jE=function(s,i){var r={};for(var o in s)Object.prototype.hasOwnProperty.call(s,o)&&i.indexOf(o)<0&&(r[o]=s[o]);if(s!=null&&typeof Object.getOwnPropertySymbols=="function")for(var l=0,o=Object.getOwnPropertySymbols(s);l0&&arguments[0]!==void 0?arguments[0]:{};const{position:i="",className:r,arrowStyle:o,popStyle:l}=s,f=jE(s,["position","className","arrowStyle","popStyle"]),d=i.indexOf("top")===0||i.indexOf("bottom")===0,p=Le(r,U1.ARROW),g=Te(o,"borderOpacity"),m=Te(o,"backgroundColor",Te(l,"backgroundColor")),_=Te(o,"borderColor",Te(l,"borderColor")),C=Object.assign(Object.assign({},f),{width:Lr.ARROW_BOUNDING.width,height:Lr.ARROW_BOUNDING.height,xmlns:"http://www.w3.org/2000/svg",className:p});return d?I.createElement("svg",Object.assign({},C),I.createElement("path",{d:"M0 0.5L0 1.5C4 1.5, 5.5 3, 7.5 5S10,8 12,8S14.5 7, 16.5 5S20,1.5 24,1.5L24 0.5L0 0.5z",style:{fill:_,opacity:g}}),I.createElement("path",{d:"M0 0L0 1C4 1, 5.5 2, 7.5 4S10,7 12,7S14.5 6, 16.5 4S20,1 24,1L24 0L0 0z",style:{fill:m}})):I.createElement("svg",Object.assign({},C),I.createElement("path",{d:"M0.5 0L1.5 0C1.5 4, 3 5.5, 5 7.5S8,10 8,12S7 14.5, 5 16.5S1.5,20 1.5,24L0.5 24L0.5 0z",style:{fill:_,opacity:g}}),I.createElement("path",{d:"M0 0L1 0C1 4, 2 5.5, 4 7.5S7,10 7,12S6 14.5, 4 16.5S1,20 1,24L0 24L0 0z",style:{fill:m}}))};var DE=function(s,i){var r={};for(var o in s)Object.prototype.hasOwnProperty.call(s,o)&&i.indexOf(o)<0&&(r[o]=s[o]);if(s!=null&&typeof Object.getOwnPropertySymbols=="function")for(var l=0,o=Object.getOwnPropertySymbols(s);l{var r;(r=this.tooltipRef.current)===null||r===void 0||r.focusTrigger()},this.renderPopCard=r=>{let{initialFocusRef:o}=r;const{content:l,contentClassName:f,prefixCls:d}=this.props,{direction:p}=this.context,g=Le(d,f,{[`${d}-rtl`]:p==="rtl"}),m=this.renderContentNode({initialFocusRef:o,content:l});return I.createElement("div",{className:g},I.createElement("div",{className:`${d}-content`},m))},this.renderContentNode=r=>{const{initialFocusRef:o,content:l}=r,f={initialFocusRef:o};return md(l)?l(f):l},this.tooltipRef=I.createRef()}render(){const i=this.props,{children:r,prefixCls:o,showArrow:l,arrowStyle:f={},arrowBounding:d,position:p,style:g,trigger:m}=i,_=DE(i,["children","prefixCls","showArrow","arrowStyle","arrowBounding","position","style","trigger"]);let{spacing:C}=this.props;const b={position:p,className:"",popStyle:g,arrowStyle:f},x=l?I.createElement(ME,Object.assign({},b)):!1;ca(C)&&(C=l?Lr.SPACING_WITH_ARROW:Lr.SPACING);const A=m==="click"||m==="custom"?"dialog":"tooltip";return I.createElement(zn,Object.assign({guardFocus:!0,ref:this.tooltipRef},_,{trigger:m,position:p,style:g,content:this.renderPopCard,prefixCls:o,spacing:C,showArrow:x,arrowBounding:d,role:A}),r)}}Fr.contextType=xa;Fr.propTypes={children:v.node,content:v.oneOfType([v.node,v.func]),visible:v.bool,autoAdjustOverflow:v.bool,motion:v.bool,position:v.oneOf(LE),margin:v.oneOfType([v.number,v.object]),mouseEnterDelay:v.number,mouseLeaveDelay:v.number,trigger:v.oneOf(FE).isRequired,contentClassName:v.oneOfType([v.string,v.array]),onVisibleChange:v.func,onClickOutSide:v.func,style:v.object,spacing:v.oneOfType([v.number,v.object]),zIndex:v.number,showArrow:v.bool,arrowStyle:v.shape({borderColor:v.string,backgroundColor:v.string,borderOpacity:v.oneOfType([v.string,v.number])}),arrowPointAtCenter:v.bool,arrowBounding:v.object,prefixCls:v.string,guardFocus:v.bool,disableArrowKeyDown:v.bool,condition:v.bool};Fr.__SemiComponentName__="Popover";Fr.defaultProps=ba(Fr.__SemiComponentName__,{arrowBounding:Lr.ARROW_BOUNDING,showArrow:!1,autoAdjustOverflow:!0,zIndex:Lr.DEFAULT_Z_INDEX,motion:!0,trigger:"hover",cancelText:"No",okText:"Yes",position:"bottom",prefixCls:U1.PREFIX,onClickOutSide:Ze,onEscKeyDown:Ze,closeOnEsc:!0,returnFocusOnClose:!0,guardFocus:!0,disableFocusListener:!0});let Ae;function Hf(s){if(!s)return 0;const i=s.match(/^\d*(\.\d*)?/);return i?Number(i[0]):0}function qE(s){return Array.prototype.slice.apply(s).map(r=>`${r}: ${s.getPropertyValue(r)};`).join("")}const zE=function(s,i){let r=arguments.length>2&&arguments[2]!==void 0?arguments[2]:"",o=arguments.length>3?arguments[3]:void 0,l=arguments.length>4?arguments[4]:void 0,f=arguments.length>5?arguments[5]:void 0,d=arguments.length>6?arguments[6]:void 0,p=arguments.length>7?arguments[7]:void 0;if(r.length===0)return"";Ae||(Ae=document.createElement("div"),Ae.setAttribute("aria-hidden","true"),document.body.appendChild(Ae));const g=window.getComputedStyle(s),m=qE(g),_=Hf(g.lineHeight),C=Math.round(_*(i+1)+Hf(g.paddingTop)+Hf(g.paddingBottom));Ae.setAttribute("style",m),Ae.style.position="fixed",Ae.style.left="0",g.getPropertyValue("width")==="auto"&&s.offsetWidth&&(Ae.style.width=`${s.offsetWidth}px`),Ae.style.height="auto",Ae.style.top="-999999px",Ae.style.zIndex="-1000",p&&(Ae.style.fontWeight="600"),Ae.style.textOverflow="clip",Ae.style.webkitLineClamp="none",Ae.innerHTML="";function b(){const W=Ae.scrollWidth<=Ae.offsetWidth,$=Ae.scrollHeight0){const W=document.createTextNode(f);x.appendChild(W)}Ae.appendChild(x),Object.values(Ta(o,"expand")).map(W=>W&&Ae.appendChild(W.cloneNode(!0)));function k(){Ae.innerHTML="",Ae.appendChild(x),Object.values(o).map(W=>W&&Ae.appendChild(W.cloneNode(!0)))}function R(W,$){const Y=W.length;return $?d==="end"?W.slice(0,$)+l:W.slice(0,$)+l+W.slice(Y-$,Y):l}function z(W,$){let Y=arguments.length>2&&arguments[2]!==void 0?arguments[2]:0,M=arguments.length>3&&arguments[3]!==void 0?arguments[3]:$.length,N=arguments.length>4&&arguments[4]!==void 0?arguments[4]:0;const U=Math.floor((Y+M)/2),X=R($,U);if(W.textContent=X,Y>=M-1&&M>0)for(let ee=M;ee>=Y;ee-=1){const V=R($,ee);if(W.textContent=V,b())return V}else if(M===0)return l;return b()?z(W,$,U,M,U):z(W,$,Y,U,N)}let H=r;return b()||(k(),H=z(A,r,0,d==="middle"?Math.floor(r.length/2):r.length)),Ae.innerHTML="",H},V1=I.createContext("normal");var fa;(function(s){s.Width="width",s.Height="height",s.All="all"})(fa||(fa={}));class Cd extends $r{constructor(i){var r;super(i),r=this,this.formerPropertyValue=new Map,this.getElement=()=>{try{const o=this.childNode||this;return ji(o)||(o instanceof Element?o:null)}catch{return null}},this.handleResizeEventTriggered=o=>{var l,f,d,p;if(this.props.observerProperty===fa.All)(f=(l=this.props).onResize)===null||f===void 0||f.call(l,o);else{const g=[];for(const m of o)this.formerPropertyValue.has(m.target)?m.contentRect[this.props.observerProperty]!==this.formerPropertyValue.get(m.target)&&(this.formerPropertyValue.set(m.target,m.contentRect[this.props.observerProperty]),g.push(m)):(this.formerPropertyValue.set(m.target,m.contentRect[this.props.observerProperty]),g.push(m));g.length>0&&((p=(d=this.props).onResize)===null||p===void 0||p.call(d,g))}},this.observeElement=function(){let o=arguments.length>0&&arguments[0]!==void 0?arguments[0]:!1;const l=r.getElement();if(r.observer||(r.observer=new ResizeObserver(r.handleResizeEventTriggered)),!(l&&l instanceof Element)){r.observer.disconnect();return}l===r.element&&!o||(r.observer.disconnect(),r.element=l,r.observer.observe(l),r.props.observeParent&&l.parentNode&&l.parentNode.ownerDocument&&l.parentNode.ownerDocument.defaultView&&l.parentNode instanceof l.parentNode.ownerDocument.defaultView.HTMLElement&&(r._parentNode=l.parentNode,r.observer.observe(r._parentNode)))},this.mergeRef=(o,l)=>{this.childNode=l,typeof o=="function"?o(l):typeof o=="object"&&o&&"current"in o&&(o.current=l)},globalThis.ResizeObserver&&(this.observer=new ResizeObserver(this.handleResizeEventTriggered))}componentDidMount(){var i;(i=this.observeElement)===null||i===void 0||i.call(this)}componentDidUpdate(i){var r;(r=this.observeElement)===null||r===void 0||r.call(this,this.props.observeParent!==i.observeParent)}componentWillUnmount(){this.observer&&(this.observer.disconnect(),this.observer=null,this.element=null)}render(){const i=I.Children.only(this.props.children),r=L1(i);return I.cloneElement(i,{ref:o=>this.mergeRef(r,o)})}}Cd.propTypes={onResize:v.func,observeParent:v.bool,observerProperty:v.string,delayTick:v.number};Cd.defaultProps={onResize:()=>{},observeParent:!1,observerProperty:"all",delayTick:0};var Uf=function(s,i,r,o){function l(f){return f instanceof r?f:new r(function(d){d(f)})}return new(r||(r=Promise))(function(f,d){function p(_){try{m(o.next(_))}catch(C){d(C)}}function g(_){try{m(o.throw(_))}catch(C){d(C)}}function m(_){_.done?f(_.value):l(_.value).then(p,g)}m((o=o.apply(s,i||[])).next())})},$E=function(s,i){var r={};for(var o in s)Object.prototype.hasOwnProperty.call(s,o)&&i.indexOf(o)<0&&(r[o]=s[o]);if(s!=null&&typeof Object.getOwnPropertySymbols=="function")for(var l=0,o=Object.getOwnPropertySymbols(s);l{const{mark:r,code:o,underline:l,strong:f,link:d,disabled:p}=s;let g=i;const m=(_,C)=>{let b={};_&&(typeof _=="object"&&(b=Object.assign({},_)),g=I.createElement(C,b,g))};return m(r,"mark"),m(o,"code"),m(l&&!d,"u"),m(f,"strong"),m(s.delete,"del"),m(d,p?"span":"a"),g};class dr extends Ee.Component{constructor(i){super(i),this.observerTakingEffect=!1,this.onResize=r=>Uf(this,void 0,void 0,function*(){return this.rafId&&window.cancelAnimationFrame(this.rafId),new Promise(o=>{this.rafId=window.requestAnimationFrame(()=>Uf(this,void 0,void 0,function*(){yield this.getEllipsisState(),o()}))})}),this.canUseCSSEllipsis=()=>{const{copyable:r}=this.props,{expandable:o,expandText:l,pos:f,suffix:d}=this.getEllipsisOpt();return!o&&ra(l)&&!r&&f==="end"&&!d.length},this.shouldTruncated=r=>!r||r<1?!1:r<=1?this.compareSingleRow():this.wrapperRef.current.scrollHeight>this.wrapperRef.current.offsetHeight,this.compareSingleRow=()=>{if(!(document&&document.createRange))return!1;const r=this.wrapperRef.current,o=r.clientWidth,l=window.getComputedStyle(r),f=parseFloat(l.paddingLeft)||0,d=parseFloat(l.paddingRight)||0,p=Math.max(0,o-f-d),g=Array.from(r.childNodes),m=document.createRange(),_=g.reduce((C,b)=>{var x;return m.selectNodeContents(b),C+((x=m.getBoundingClientRect().width)!==null&&x!==void 0?x:0)},0);return m.detach(),_>p},this.showTooltip=()=>{var r,o;const{isOverflowed:l,isTruncated:f,expanded:d}=this.state,{showTooltip:p,expandable:g,expandText:m}=this.getEllipsisOpt(),_=this.canUseCSSEllipsis(),C=!d&&(_?l:f),x=!g&&ra(m)&&C&&p;if(!x)return x;const A={type:"tooltip"};return typeof p=="object"?p.type&&p.type.toLowerCase()==="popover"?ZS({opts:{showArrow:!0}},p,{opts:{className:Le({[`${Xe}-ellipsis-popover`]:!0,[(r=p==null?void 0:p.opts)===null||r===void 0?void 0:r.className]:!!(!((o=p==null?void 0:p.opts)===null||o===void 0)&&o.className)})}}):Object.assign(Object.assign({},A),p):A},this.onHover=()=>{if(this.canUseCSSEllipsis()){const{rows:o,suffix:l,pos:f}=this.getEllipsisOpt(),d=this.shouldTruncated(o);this.setState({isOverflowed:d,isTruncated:!1});return}},this.getEllipsisState=()=>Uf(this,void 0,void 0,function*(){const{rows:r,suffix:o,pos:l,showTooltip:f}=this.getEllipsisOpt(),{children:d,strong:p}=this.props;if(!this.wrapperRef||!this.wrapperRef.current){yield this.onResize();return}const{expanded:g}=this.state;if(this.canUseCSSEllipsis()){if(f){const x=this.shouldTruncated(r);return new Promise(A=>{this.setState({isOverflowed:x,isTruncated:!1},A)})}return}if(FS(d))return new Promise(x=>{this.setState({isTruncated:!1,isOverflowed:!1},x)});if(Fi("children"in this.props&&typeof d!="string","[Semi Typography] Only children with pure text could be used with ellipsis at this moment."),!r||r<0||g)return;const _={expand:this.expandRef.current,copy:this.copyRef&&this.copyRef.current},C=Array.isArray(d)?d.join(""):String(d),b=zE(this.wrapperRef.current,r,C,_,BE,o,l,p);return new Promise(x=>{this.setState({isOverflowed:!1,ellipsisContent:b,isTruncated:C!==b},x)})}),this.toggleOverflow=r=>{const{onExpand:o,expandable:l,collapsible:f}=this.getEllipsisOpt(),{expanded:d}=this.state;o&&o(!d,r),(l&&!d||f&&d)&&this.setState({expanded:!d})},this.getEllipsisOpt=()=>{const{ellipsis:r}=this.props;return r?Object.assign({rows:1,expandable:!1,pos:"end",suffix:"",showTooltip:!1,collapsible:!1,expandText:r.expandable?this.expandStr:void 0,collapseText:r.collapsible?this.collapseStr:void 0},typeof r=="object"?r:null):{}},this.renderExpandable=()=>{const{expanded:r,isTruncated:o}=this.state;if(!o)return null;const{expandText:l,expandable:f,collapseText:d,collapsible:p}=this.getEllipsisOpt(),g=!f&&ra(l),m=!p&&ra(d);let _;return!r&&!g?_=l:r&&!m&&(_=d),!g||!m?I.createElement("a",{role:"button",tabIndex:0,className:`${Xe}-ellipsis-expand`,key:"expand",ref:this.expandRef,"aria-label":_,onClick:this.toggleOverflow,onKeyPress:C=>H1(C)&&this.toggleOverflow(C)},_):null},this.getEllipsisStyle=()=>{const{ellipsis:r,component:o}=this.props;if(!r)return{ellipsisCls:"",ellipsisStyle:{}};const{rows:l}=this.getEllipsisOpt(),{expanded:f}=this.state,d=!f&&this.canUseCSSEllipsis(),p=Le({[`${Xe}-ellipsis`]:!0,[`${Xe}-ellipsis-single-line`]:l===1,[`${Xe}-ellipsis-multiple-line`]:l>1,[`${Xe}-ellipsis-multiple-line-text`]:l>1&&o==="span",[`${Xe}-ellipsis-overflow-ellipsis`]:l===1&&d,[`${Xe}-ellipsis-overflow-ellipsis-text`]:l===1&&d&&o==="span"}),g=d&&l>1?{WebkitLineClamp:l}:{};return{ellipsisCls:p,ellipsisStyle:g}},this.renderEllipsisText=r=>{const{suffix:o}=r,{children:l}=this.props,{isTruncated:f,expanded:d,ellipsisContent:p}=this.state;return d||!f?I.createElement("span",{onMouseEnter:this.onHover},l,o&&o.length?o:null):I.createElement("span",{onMouseEnter:this.onHover},p,o)},this.state={editable:!1,copied:!1,isOverflowed:!1,ellipsisContent:i.children,expanded:!1,isTruncated:!1,prevChildren:null},this.wrapperRef=I.createRef(),this.expandRef=I.createRef(),this.copyRef=I.createRef()}componentDidMount(){this.props.ellipsis&&this.onResize().then(()=>yd(()=>this.observerTakingEffect=!0,1))}static getDerivedStateFromProps(i,r){const{prevChildren:o}=r,l={};return l.prevChildren=i.children,i.ellipsis&&o!==i.children&&(l.isOverflowed=!1,l.ellipsisContent=i.children,l.expanded=!1,l.isTruncated=!0),l}componentDidUpdate(i){this.props.children!==i.children&&(this.forceUpdate(),this.props.ellipsis&&this.onResize())}componentWillUnmount(){this.rafId&&window.cancelAnimationFrame(this.rafId)}renderOperations(){return I.createElement(I.Fragment,null,this.renderExpandable(),this.renderCopy())}renderCopy(){var i;const{copyable:r,children:o}=this.props;if(!r)return null;const l=(i=r==null?void 0:r.content)!==null&&i!==void 0?i:o;let f,d=!1;Array.isArray(l)?(f="",l.forEach(g=>{typeof g=="object"&&(d=!0),f+=String(g)})):(typeof l!="object"||(d=!0),f=String(l)),Fi(d,"Content to be copied in Typography is a object, it will case a [object Object] mistake when copy to clipboard.");const p=Object.assign({content:f,duration:3},typeof r=="object"?r:null);return I.createElement(Sd,Object.assign({},p,{forwardRef:this.copyRef}))}renderIcon(){const{icon:i,size:r}=this.props,o=r==="inherit"?this.context:r;if(!i)return null;const l=o==="small"?"small":"default";return I.createElement("span",{className:`${Xe}-icon`,"x-semi-prop":"icon"},FC(i)?I.cloneElement(i,{size:l}):i)}renderContent(){const i=this.props,{component:r,children:o,className:l,type:f,spacing:d,disabled:p,style:g,ellipsis:m,icon:_,size:C,link:b,heading:x,weight:A}=i,k=$E(i,["component","children","className","type","spacing","disabled","style","ellipsis","icon","size","link","heading","weight"]),R=Ta(k,["strong","editable","mark","copyable","underline","code","delete"]),z=C==="inherit"?this.context:C,H=this.renderIcon(),W=this.getEllipsisOpt(),{ellipsisCls:$,ellipsisStyle:Y}=this.getEllipsisStyle();let M=m?this.renderEllipsisText(W):o;const N=Le({[`${Xe}-link-text`]:b,[`${Xe}-link-underline`]:this.props.underline&&b});M=HE(this.props,I.createElement(I.Fragment,null,H,this.props.link?I.createElement("span",{className:N},M):M));const U=/^h[1-6]$/,X=$S(x)&&U.test(x),ee=Le(l,$,{[`${Xe}-${f}`]:f&&!b,[`${Xe}-${z}`]:z,[`${Xe}-link`]:b,[`${Xe}-disabled`]:p,[`${Xe}-${d}`]:d,[`${Xe}-${x}`]:X,[`${Xe}-${x}-weight-${A}`]:X&&A&&isNaN(Number(A))}),V=Object.assign(Object.assign({},isNaN(Number(A))?{}:{fontWeight:A}),g);return I.createElement(Oa,Object.assign({tooltipRef:this.wrapperRef,className:ee,style:Object.assign(Object.assign({},V),Y),component:r,forwardRef:this.wrapperRef},R),M,this.renderOperations())}renderTipWrapper(){const{children:i}=this.props,r=this.showTooltip(),o=this.renderContent();if(r){const{type:l,opts:f,renderTooltip:d}=r;return md(d)?d(i,o):l.toLowerCase()==="popover"?I.createElement(Fr,Object.assign({content:i,position:"top"},f),o):I.createElement(zn,Object.assign({content:i,position:"top"},f),o)}else return o}render(){var i=this;const{size:r}=this.props,o=r==="inherit"?this.context:r,l=I.createElement(V1.Provider,{value:o},I.createElement(qi,{componentName:"Typography"},f=>(this.expandStr=f.expand,this.collapseStr=f.collapse,this.renderTipWrapper())));return this.props.ellipsis?I.createElement(Cd,{onResize:function(){i.observerTakingEffect&&i.onResize(...arguments)},observeParent:!0,observerProperty:fa.Width},l):l}}dr.propTypes={children:v.node,copyable:v.oneOfType([v.shape({text:v.string,onCopy:v.func,successTip:v.node,copyTip:v.node}),v.bool]),delete:v.bool,disabled:v.bool,ellipsis:v.oneOfType([v.shape({rows:v.number,expandable:v.bool,expandText:v.string,onExpand:v.func,suffix:v.string,showTooltip:v.oneOfType([v.shape({type:v.string,opts:v.object}),v.bool]),collapsible:v.bool,collapseText:v.string,pos:v.oneOf(["end","middle"])}),v.bool]),mark:v.bool,underline:v.bool,link:v.oneOfType([v.object,v.bool]),spacing:v.oneOf(st.SPACING),strong:v.bool,size:v.oneOf(st.SIZE),type:v.oneOf(st.TYPE),style:v.object,className:v.string,icon:v.oneOfType([v.node,v.string]),heading:v.string,component:v.string};dr.defaultProps={children:null,copyable:!1,delete:!1,disabled:!1,ellipsis:!1,icon:"",mark:!1,underline:!1,strong:!1,link:!1,type:"primary",spacing:"normal",size:"normal",style:{},className:""};dr.contextType=V1;class Td extends Ee.PureComponent{render(){return I.createElement(dr,Object.assign({component:"span"},this.props))}}Td.propTypes={copyable:v.oneOfType([v.object,v.bool]),delete:v.bool,disabled:v.bool,icon:v.oneOfType([v.node,v.string]),ellipsis:v.oneOfType([v.object,v.bool]),mark:v.bool,underline:v.bool,link:v.oneOfType([v.object,v.bool]),strong:v.bool,type:v.oneOf(st.TYPE),size:v.oneOf(st.SIZE),style:v.object,className:v.string,code:v.bool,component:v.string,weight:v.number};Td.defaultProps={copyable:!1,delete:!1,disabled:!1,icon:"",ellipsis:!1,mark:!1,underline:!1,strong:!1,link:!1,type:"primary",style:{},size:"normal",className:""};var UE=function(s,i){var r={};for(var o in s)Object.prototype.hasOwnProperty.call(s,o)&&i.indexOf(o)<0&&(r[o]=s[o]);if(s!=null&&typeof Object.getOwnPropertySymbols=="function")for(var l=0,o=Object.getOwnPropertySymbols(s);l{const p=["B","KB","MB","GB","TB","PB","EB","ZB","YB"];let g=0;for(;d>=1e3;)d/=1e3,g++;return`${this.truncatePrecision(d)} ${p[g]}`},"bytes-binary":d=>{const p=["B","KiB","MiB","GiB","TiB","PiB","EiB","ZiB","YiB"];let g=0;for(;d>=1024;)d/=1024,g++;return`${this.truncatePrecision(d)} ${p[g]}`},percentages:d=>`${this.truncatePrecision(d*100)}%`,exponential:d=>{const g=d.toExponential(this.precision+2).split("e");return`${this.truncatePrecision(Number(g[0]))}e${g[1]}`}},this.truncateMethods={ceil:Math.ceil,floor:Math.floor,round:Math.round},this.isDiyParser=typeof f<"u",this.content=i,this.rule=r,this.precision=o,this.truncate=l,this.parser=f}format(){return this.isDiyParser?this.parser(this.content):this.rule==="text"?Wf(this.content).map(i=>Vf(i)?this.truncatePrecision(i):i).join(""):this.rule==="numbers"?Wf(this.content).filter(i=>Vf(i)).map(i=>this.truncatePrecision(i)).join(","):Wf(this.content).map(i=>Vf(i)?this.ruleMethods[this.rule](Number(i)):i).join("")}truncatePrecision(i){const r=this.truncateMethods[this.truncate](Number(i)*Math.pow(10,this.precision))/Math.pow(10,this.precision),o=r.toString().split(".");if(o.length===1)return r.toFixed(this.precision);const l=o[1].length;return ltypeof r=="string"||typeof r=="number"?new VE(String(r),this.props.rule,this.props.precision,this.props.truncate,this.props.parser).format():typeof r=="function"?this.formatNodeDFS(r()):typeof r=="object"&&"children"in r.props?Object.assign(Object.assign({},r),{props:Object.assign(Object.assign({},r.props),{children:this.formatNodeDFS(r.props.children)})}):r),i.length===1?i[0]:i}render(){const i=Object.assign({},this.props);return delete i.rule,delete i.parser,i.children=this.formatNodeDFS(this.props.children),I.createElement(dr,Object.assign({component:"span"},i))}}Pd.propTypes={rule:v.oneOf(st.RULE),precision:v.number,truncate:v.oneOf(st.TRUNCATE),parser:v.func,copyable:v.oneOfType([v.object,v.bool]),delete:v.bool,disabled:v.bool,icon:v.oneOfType([v.node,v.string]),mark:v.bool,underline:v.bool,link:v.oneOfType([v.object,v.bool]),strong:v.bool,type:v.oneOf(st.TYPE),size:v.oneOf(st.SIZE),style:v.object,className:v.string,code:v.bool,component:v.string};Pd.defaultProps={rule:"text",precision:0,truncate:"round",parser:void 0,copyable:!1,delete:!1,icon:"",mark:!1,underline:!1,strong:!1,link:!1,type:"primary",style:{},size:"normal",className:""};const ka=Oa;ka.Text=Td;ka.Title=Ed;ka.Paragraph=Od;ka.Numeral=Pd;var KE=function(s,i){var r={};for(var o in s)Object.prototype.hasOwnProperty.call(s,o)&&i.indexOf(o)<0&&(r[o]=s[o]);if(s!=null&&typeof Object.getOwnPropertySymbols=="function")for(var l=0,o=Object.getOwnPropertySymbols(s);l0&&arguments[0]!==void 0?arguments[0]:{};const{id:i,className:r,customIconCls:o}=s,l=KE(s,["id","className","customIconCls"]),f=Te(sr,"config.overrideDefaultProps.Spin.indicator");if(f&&I.isValidElement(f))return I.cloneElement(f,{className:Le({[o]:o,[r]:r})});const d="linearGradient-semi-spin",[p,g]=Ee.useState(()=>ca(i)?d:`linearGradient-${i}`);return Ee.useEffect(()=>{if(!ca(i)){g(`linearGradient-${i}`);return}const m=vd({prefix:"semi-spin-gradient"});g(`linearGradient-${m}`)},[i]),I.createElement("svg",Object.assign({},l,{className:r,width:"48",height:"48",viewBox:"0 0 36 36",version:"1.1",xmlns:"http://www.w3.org/2000/svg","aria-hidden":!0,"data-icon":"spin"}),I.createElement("defs",null,I.createElement("linearGradient",{x1:"0%",y1:"100%",x2:"100%",y2:"100%",id:p},I.createElement("stop",{stopColor:"currentColor",stopOpacity:"0",offset:"0%"}),I.createElement("stop",{stopColor:"currentColor",stopOpacity:"0.50",offset:"39.9430698%"}),I.createElement("stop",{stopColor:"currentColor",offset:"100%"}))),I.createElement("g",{stroke:"none",strokeWidth:"1",fill:"none",fillRule:"evenodd"},I.createElement("rect",{fillOpacity:"0.01",fill:"none",x:"0",y:"0",width:"36",height:"36"}),I.createElement("path",{d:"M34,18 C34,9.163444 26.836556,2 18,2 C11.6597233,2 6.18078805,5.68784135 3.59122325,11.0354951",stroke:`url(#${p})`,strokeWidth:"4",strokeLinecap:"round"})))}var Kf,Xy;function GE(){if(Xy)return Kf;Xy=1;var s=id(),i=A1(),r=zr();function o(l,f,d){for(var p=-1,g=f.length,m={};++p"u"&&this._adapter.addActiveKey(d)}}class rO extends Bi{constructor(i){super(Object.assign({},i)),this.updateDOMInRenderTree=r=>{this._adapter.setDOMInRenderTree(r)},this.updateDOMHeight=r=>{this._adapter.setDOMHeight(r)},this.updateVisible=r=>{this._adapter.setVisible(r)},this.updateIsTransitioning=r=>{this._adapter.setIsTransitioning(r)}}}const n1={PREFIX:`${qn}-collapsible`};class ur extends $r{constructor(i){super(i),this.domRef=I.createRef(),this.hasBeenRendered=!1,this.handleResize=r=>{const o=r[0];if(o){const l=ur.getEntryInfo(o);this.foundation.updateDOMHeight(l.height),this.foundation.updateDOMInRenderTree(l.isShown)}},this.isChildrenInRenderTree=()=>this.domRef.current?this.domRef.current.offsetHeight>0:!1,this.state={domInRenderTree:!1,domHeight:0,visible:this.props.isOpen,isTransitioning:!1,cacheIsOpen:this.props.isOpen},this.foundation=new rO(this.adapter)}get adapter(){return Object.assign(Object.assign({},super.adapter),{setDOMInRenderTree:i=>{this.state.domInRenderTree!==i&&this.setState({domInRenderTree:i})},setDOMHeight:i=>{this.state.domHeight!==i&&this.setState({domHeight:i})},setVisible:i=>{this.state.visible!==i&&this.setState({visible:i})},setIsTransitioning:i=>{this.state.isTransitioning!==i&&this.setState({isTransitioning:i})}})}componentDidMount(){super.componentDidMount(),this.resizeObserver=new ResizeObserver(this.handleResize),this.resizeObserver.observe(this.domRef.current);const i=this.isChildrenInRenderTree();this.foundation.updateDOMInRenderTree(i),i&&this.foundation.updateDOMHeight(this.domRef.current.scrollHeight)}static getDerivedStateFromProps(i,r){const o={},l=i.isOpen!==r.cacheIsOpen;return l&&(i.isOpen||!i.motion)&&(o.visible=i.isOpen),i.motion&&l&&(o.isTransitioning=!0),o.cacheIsOpen=i.isOpen,o}componentDidUpdate(i,r,o){const l=Object.keys(t1(this.props,["reCalcKey"])).filter(d=>!Li(this.props[d],i[d])),f=Object.keys(t1(this.state,["domInRenderTree"])).filter(d=>!Li(this.state[d],r[d]));l.includes("reCalcKey")&&this.foundation.updateDOMHeight(this.domRef.current.scrollHeight),f.includes("domInRenderTree")&&this.state.domInRenderTree&&this.foundation.updateDOMHeight(this.domRef.current.scrollHeight)}componentWillUnmount(){super.componentWillUnmount(),this.resizeObserver.disconnect()}render(){const{isOpen:i,collapseHeight:r,collapseHeightAdaptive:o}=this.props,l=o?Math.min(this.state.domHeight,r):r,f=Object.assign({overflow:"hidden",height:i?this.state.domHeight:l,opacity:i||!this.props.fade||r!==0?1:0,transitionDuration:`${this.props.motion&&this.state.isTransitioning?this.props.duration:0}ms`},this.props.style),d=Le(`${n1.PREFIX}-wrapper`,{[`${n1.PREFIX}-transition`]:this.props.motion&&this.state.isTransitioning},this.props.className),p=this.props.keepDOM&&(this.props.lazyRender?this.hasBeenRendered:!0)||this.props.collapseHeight!==0||this.state.visible||this.props.isOpen;return p&&!this.hasBeenRendered&&(this.hasBeenRendered=!0),I.createElement("div",Object.assign({className:d,style:f,onTransitionEnd:()=>{var g,m;this.props.isOpen||this.foundation.updateVisible(!1),this.foundation.updateIsTransitioning(!1),(m=(g=this.props).onMotionEnd)===null||m===void 0||m.call(g)}},this.getDataAttr(this.props)),I.createElement("div",{"x-semi-prop":"children",ref:this.domRef,style:{overflow:"hidden"},id:this.props.id},p&&this.props.children))}}ur.__SemiComponentName__="Collapsible";ur.defaultProps=ba(ur.__SemiComponentName__,{isOpen:!1,duration:250,motion:!0,keepDOM:!1,lazyRender:!1,collapseHeight:0,collapseHeightAdaptive:!1,fade:!1});ur.getEntryInfo=s=>{let i;s.borderBoxSize?i=!(s.borderBoxSize[0].blockSize===0&&s.borderBoxSize[0].inlineSize===0):i=!(s.contentRect.height===0&&s.contentRect.width===0);let r=0;return s.borderBoxSize?r=Math.ceil(s.borderBoxSize[0].blockSize):r=s.target.clientHeight,{isShown:i,height:r}};const K1=I.createContext({});var iO=function(s,i){var r={};for(var o in s)Object.prototype.hasOwnProperty.call(s,o)&&i.indexOf(o)<0&&(r[o]=s[o]);if(s!=null&&typeof Object.getOwnPropertySymbols=="function")for(var l=0,o=Object.getOwnPropertySymbols(s);l{var o;(this.context.clickHeaderToExpand||!((o=this.headerExpandIconTriggerRef.current)===null||o===void 0)&&o.contains(r.target))&&this.context.onClick(i,r)}}componentDidMount(){this.ariaID=vd({})}renderHeader(i){let r=arguments.length>1&&arguments[1]!==void 0?arguments[1]:!0;const{showArrow:o,header:l,extra:f}=this.props;let{expandIcon:d,collapseIcon:p}=this.context;const{expandIconPosition:g}=this.context;typeof d>"u"&&(d=I.createElement(OE,null)),typeof p>"u"&&(p=I.createElement(bE,null));const m=I.createElement("span",{ref:this.headerExpandIconTriggerRef,"aria-hidden":"true",className:Le([`${Vt.PREFIX}-header-icon`,{[`${Vt.PREFIX}-header-iconDisabled`]:!r}])},r&&i?p:d),_=g==="left";return typeof l=="string"?I.createElement(I.Fragment,null,o&&(_?m:null),I.createElement("span",null,l),I.createElement("span",{className:`${Vt.PREFIX}-header-right`},I.createElement("span",null,f),o&&(_?null:m))):I.createElement(I.Fragment,null,o&&(_?m:null),l,o&&(_?null:m))}render(){const i=this.props,{className:r,children:o,itemKey:l,reCalcKey:f,header:d,extra:p,showArrow:g,disabled:m}=i,_=iO(i,["className","children","itemKey","reCalcKey","header","extra","showArrow","disabled"]),{keepDOM:C,expandIconPosition:b,activeSet:x,motion:A,lazyRender:k}=this.context,R=x.has(l),z=Le(r,{[`${Vt.PREFIX}-item`]:!0,[`${Vt.PREFIX}-item-active`]:R}),H=Le({[`${Vt.PREFIX}-header`]:!0,[`${Vt.PREFIX}-header-disabled`]:m,[`${Vt.PREFIX}-header-iconLeft`]:b==="left"}),W=Le({[`${Vt.PREFIX}-content`]:!0});return I.createElement("div",Object.assign({className:z},_),I.createElement("div",{role:"button",tabIndex:0,className:H,"aria-disabled":m,"aria-expanded":R?"true":"false","aria-owns":this.ariaID,onClick:$=>!m&&this.handleClick(l,$)},this.renderHeader(R,o!==void 0&&!m)),o&&I.createElement(ur,{lazyRender:k,isOpen:R,keepDOM:C,motion:A,onMotionEnd:this.props.onMotionEnd,reCalcKey:f},I.createElement("div",{className:W,"aria-hidden":!R,id:this.ariaID},I.createElement("div",{className:`${Vt.PREFIX}-content-wrapper`},o))))}}Ia.contextType=K1;Ia.propTypes={itemKey:v.string,extra:v.node,header:v.oneOfType([v.string,v.node]),className:v.string,reCalcKey:v.oneOfType([v.string,v.number]),showArrow:v.bool,disabled:v.bool};Ia.defaultProps={showArrow:!0,disabled:!1};var oO=function(s,i){var r={};for(var o in s)Object.prototype.hasOwnProperty.call(s,o)&&i.indexOf(o)<0&&(r[o]=s[o]);if(s!=null&&typeof Object.getOwnPropertySymbols=="function")for(var l=0,o=Object.getOwnPropertySymbols(s);l{this.foundation.handleChange(o,l)},this.foundation=new nO(this.adapter);const r=this.foundation.initActiveKey();this.state={activeSet:new Set(r)},this.onChange=this.onChange.bind(this)}get adapter(){return Object.assign(Object.assign({},super.adapter),{handleChange:(i,r)=>this.props.onChange(i,r),addActiveKey:i=>this.setState({activeSet:i})})}static getDerivedStateFromProps(i,r){if(i.activeKey){const o=Array.isArray(i.activeKey)?i.activeKey:[i.activeKey],l=new Set(o);return Li(l,r.activeSet)?r:Object.assign(Object.assign({},r),{activeSet:l})}return r}componentWillUnmount(){this.foundation.destroy()}render(){const i=this.props,{defaultActiveKey:r,lazyRender:o,accordion:l,style:f,motion:d,className:p,keepDOM:g,expandIconPosition:m,expandIcon:_,collapseIcon:C,children:b,clickHeaderToExpand:x}=i;oO(i,["defaultActiveKey","lazyRender","accordion","style","motion","className","keepDOM","expandIconPosition","expandIcon","collapseIcon","children","clickHeaderToExpand"]);const A=Le(Vt.PREFIX,p),{activeSet:k}=this.state;return I.createElement("div",Object.assign({className:A,style:f},this.getDataAttr(this.props)),I.createElement(K1.Provider,{value:{activeSet:k,expandIcon:_,collapseIcon:C,clickHeaderToExpand:x,keepDOM:g,expandIconPosition:m,onClick:this.onChange,motion:d,lazyRender:o}},b))}}zi.Panel=Ia;zi.propTypes={activeKey:v.oneOfType([v.string,v.array]),defaultActiveKey:v.oneOfType([v.string,v.array]),accordion:v.bool,clickHeaderToExpand:v.bool,onChange:v.func,expandIcon:v.node,collapseIcon:v.node,style:v.object,className:v.string,keepDOM:v.bool,motion:v.oneOfType([v.bool,v.func,v.object]),expandIconPosition:v.oneOf(tO.iconPosition),lazyRender:v.bool};zi.__SemiComponentName__="Collapse";zi.defaultProps=ba(zi.__SemiComponentName__,{defaultActiveKey:"",clickHeaderToExpand:!0,onChange:q1,expandIconPosition:"right",lazyRender:!1});class G1 extends Ee.Component{constructor(i){super(i),this.state={}}render(){const{children:i,locale:r}=this.props;return I.createElement(z1.Provider,{value:r},i)}}G1.propTypes={locale:v.object,children:v.node};G1.defaultProps={locale:ed};var sa={},r1;function aO(){if(r1)return sa;r1=1;var s=N1();return sa.createRoot=s.createRoot,sa.hydrateRoot=s.hydrateRoot,sa}var IO=aO();const AO={code:"en-US",dateFnsLocale:HT,currency:"USD",Pagination:{pageSize:"Items per page: ${pageSize}",total:"Total pages: ${total}",jumpTo:"Jump to",page:" page"},Modal:{confirm:"Confirm",cancel:"Cancel"},Tabs:{more:"More"},TimePicker:{placeholder:{time:"Select time",timeRange:"Select a time range"},begin:"Start Time",end:"End Time",hour:"",minute:"",second:"",AM:"AM",PM:"PM"},DatePicker:{placeholder:{date:"Select date",dateTime:"Select date and time",dateRange:["Start date","End date"],dateTimeRange:["Start date","End date"],monthRange:["Start month","End month"]},presets:"Presets",footer:{confirm:"Confirm",cancel:"Cancel"},selectDate:"Select Date",selectTime:"Select Time",year:"year",month:"month",day:"day",monthText:"${month} ${year}",months:{1:"Jan",2:"Feb",3:"Mar",4:"Apr",5:"May",6:"Jun",7:"Jul",8:"Aug",9:"Sep",10:"Oct",11:"Nov",12:"Dec"},fullMonths:{1:"January",2:"February",3:"March",4:"April",5:"May",6:"June",7:"July",8:"August",9:"September",10:"October",11:"November",12:"December"},weeks:{Mon:"Mon",Tue:"Tue",Wed:"Wed",Thu:"Thu",Fri:"Fri",Sat:"Sat",Sun:"Sun"},localeFormatToken:{FORMAT_SWITCH_DATE:"MM/dd/yyyy"}},Popconfirm:{confirm:"Confirm",cancel:"Cancel"},Navigation:{collapseText:"Collapse Sidebar",expandText:"Expand Sidebar"},Table:{emptyText:"No Result",pageText:"Showing ${currentStart} to ${currentEnd} of ${total}",descend:"Click to descend",ascend:"Click to ascend",cancelSort:"Cancel sorting",confirmFilter:"OK",resetFilter:"Reset"},Select:{emptyText:"No Result",createText:"Create"},Cascader:{emptyText:"No Result"},Tree:{emptyText:"No Result",searchPlaceholder:"Search"},List:{emptyText:"No Result"},Calendar:{allDay:"All Day",AM:"${time} AM",PM:"${time} PM",datestring:"",remaining:"${remained} more"},Upload:{mainText:"Click to Upload File or Drag File to here",illegalTips:"This type of file is not supported",legalTips:"Release and start uploading",retry:"Retry",replace:"Replace File",clear:"Clear",selectedFiles:"Selected Files",illegalSize:"Illegal file size",fail:"Upload fail",cropTitle:"Crop Image",cropOk:"OK",cropCancel:"Cancel"},TreeSelect:{searchPlaceholder:"Search"},Typography:{copy:"Copy",copied:"Copied",expand:"Expand",collapse:"Collapse"},Transfer:{emptyLeft:"No Data",emptySearch:"No search results",emptyRight:"No content, check from the left",placeholder:"Search",clear:"Clear",selectAll:"Select all",clearSelectAll:"Unselect all",total:"Total items: ${total}",selected:"Items selected: ${total}"},Form:{optional:"(optional)"},Image:{preview:"Preview",loading:"Loading",loadError:"Failed to load",prevTip:"Previous",nextTip:"Next",zoomInTip:"Zoom in",zoomOutTip:"Zoom out",rotateTip:"Rotate",downloadTip:"Download",adaptiveTip:"Adapt to the page",originTip:"Original size"},Chat:{deleteConfirm:"Are you sure you want to delete this session?",clearContext:"Context cleared",copySuccess:"Copy successful.",stop:"Stop",copy:"Copy",copied:"Copied",dropAreaText:"Put the file here"},UserGuide:{skip:"Skip",next:"Next",prev:"Prev",finish:"Finish"},InputNumber:{},JsonViewer:{search:"Search",replace:"Replace",replaceAll:"Replace All"},VideoPlayer:{rateChange:"Switch rate to ${rate}",qualityChange:"Switch quality to ${quality}",routeChange:"Switch route to ${route}",mirror:"Mirror",cancelMirror:"Cancel mirror",loading:"Loading...",stall:"Loading failed",noResource:"No resource",videoError:"Video load error"},AIChatDialogue:{delete:"Delete",deleteConfirm:"Are you sure you want to delete this message?",deleteContent:"This message will be permanently deleted and cannot be recovered.",copySuccess:"Copy successful.",loading:"Loading...",reasoning:{completed:"Reasoning completed",thinking:"Thinking..."},annotationText:"pieces of information"},Feedback:{submit:"Submit",cancel:"Cancel"},AIChatInput:{template:"Template",configure:"Configure",selected:"Selected ${count} items"},Sidebar:{linkAddSuccess:"Link added successfully",linkRemoveSuccess:"Link removed successfully",enterLinkAddress:"Enter link address",validateFailInfo:"Verification failed, please upload again",uploadFailInfo:"Upload failed, please try again",uploadImgInfo:"Click to upload image or drag image here",defaultMcpInfo:"Preset MCP, cannot be closed",searchPlaceholder:"Please enter",emptyCustomMcpInfo:"No custom MCP yet",newMcpAdd:"Custom MCP",mcpConfigure:"MCP Configuration",annotationTitle:"Reference Source",activeMCPNumber:"Number of activated MCPs:",copySuccess:"Copy successful."},AudioPlayer:{backward:"Backward ${skipDuration}s",forward:"Forward ${skipDuration}s",prev:"Previous",next:"Next",loop:"Loop",volume:"Volume",mediaError:"Audio load error"}};function sO(s){if(s instanceof Error)return s.message;if(typeof s=="string")return s;try{return JSON.stringify(s)}catch{return String(s)}}function NO(s,i){const r=sO(s).toLowerCase(),o=i.toLowerCase();return r.includes(o)?["not found","unknown command","does not exist","doesn't exist","not registered"].some(l=>r.includes(l)):!1}export{EO as $,h1 as A,qn as B,Et as C,da as D,NE as E,Cw as F,ya as G,Ew as H,QE as I,RO as J,KS as K,HS as L,Ni as M,Te as N,xa as O,v as P,OO as Q,I as R,xO as S,ka as T,bO as U,Ta as V,PO as W,qi as X,F1 as Y,Ra as Z,md as _,Nt as a,od as a$,Mi as a0,hO as a1,gO as a2,wO as a3,yO as a4,Pa as a5,_O as a6,pO as a7,vO as a8,mO as a9,wd as aA,fT as aB,cT as aC,Jf as aD,Ky as aE,pT as aF,HT as aG,Lr as aH,W1 as aI,cd as aJ,Xw as aK,Li as aL,Kw as aM,_C as aN,dO as aO,OC as aP,Fr as aQ,yS as aR,Hr as aS,qS as aT,OS as aU,gd as aV,sS as aW,G_ as aX,sC as aY,FS as aZ,H1 as a_,IE as aa,zn as ab,ar as ac,Aw as ad,ca as ae,bE as af,OE as ag,kC as ah,sr as ai,lO as aj,uO as ak,cO as al,_d as am,NO as an,sO as ao,zi as ap,G1 as aq,AO as ar,ed as as,IO as at,bw as au,RE as av,kO as aw,t1 as ax,hm as ay,Cd as az,Ee as b,fC as b0,Ow as b1,YE as b2,Z_ as b3,id as b4,yC as b5,GS as b6,wS as b7,E1 as b8,Fn as b9,EC as ba,qC as bb,zC as bc,Td as bd,iC as be,nS as bf,TC as bg,mS as bh,ZS as bi,T1 as bj,TO as bk,d1 as bl,Vi as bm,Tw as bn,td as bo,N1 as bp,zw as bq,CO as br,na as bs,Ur as c,cr as d,rn as e,Bi as f,He as g,Ze as h,$S as i,NC as j,$r as k,Le as l,FC as m,ra as n,vd as o,bC as p,q1 as q,Nw as r,ba as s,a1 as t,Ca as u,rC as v,Fi as w,ud as x,oC as y,CS as z}; diff --git a/frontends/desktop/dist/build-provenance.json b/frontends/desktop/dist/build-provenance.json new file mode 100644 index 000000000..1cb14ced3 --- /dev/null +++ b/frontends/desktop/dist/build-provenance.json @@ -0,0 +1,9 @@ +{ + "schemaVersion": 1, + "product": "GenericAgent React Desktop 2.0", + "version": "0.2.0", + "sourceRepository": "https://github.com/abraxas914/GenericAgent", + "sourceCommit": "21f12f6dfe57ada8572bb21fe6604caac230b1cf", + "generatedAssetCount": 98, + "generatedManifestSha256": "7ed4bd56d50919d1ea6f92f60658403f19a93f117612704252f6e154ba39f92e" +} diff --git a/frontends/desktop/dist/fallback.html b/frontends/desktop/dist/fallback.html new file mode 100644 index 000000000..31ac81134 --- /dev/null +++ b/frontends/desktop/dist/fallback.html @@ -0,0 +1,80 @@ + + + + + +Startup recovery + + + +
+

完成启动设置

+

恢复界面未能加载。你仍可选择应用运行所需的位置并继续启动。

+

此页面不依赖应用界面组件,可在前端资源损坏时独立运行。

+ +
应用文件夹
尚未选择应用文件夹
选择此前用于运行桌面版的应用文件夹。
+
Python 环境
选择应用文件夹后自动识别
应用会自动选择可用环境;如有需要,可以重新选择。
+

+ +
诊断信息
GenericAgent Desktop startup diagnostics

诊断信息由启动服务脱敏后提供,包含本机路径和错误日志,不包含 API Key、会话或记忆内容。

+
帮助与反馈

如果仍无法完成启动,可添加微信联系:

RoundSquisheen_Ashes_in_the_Snow_
+
+ + + diff --git a/frontends/desktop/dist/index.html b/frontends/desktop/dist/index.html new file mode 100644 index 000000000..619d62212 --- /dev/null +++ b/frontends/desktop/dist/index.html @@ -0,0 +1,38 @@ + + + + + + +GenericAgent + + + + + + + + + + + +
+ + diff --git a/frontends/desktop/dist/loading.html b/frontends/desktop/dist/loading.html new file mode 100644 index 000000000..e92b90726 --- /dev/null +++ b/frontends/desktop/dist/loading.html @@ -0,0 +1,36 @@ + + + + + +GenericAgent + + + + + + + + + + + + + +
+
+ +
+
+ + diff --git a/frontends/desktop/dist/setup.html b/frontends/desktop/dist/setup.html new file mode 100644 index 000000000..984f2f121 --- /dev/null +++ b/frontends/desktop/dist/setup.html @@ -0,0 +1,54 @@ + + + + + +GenericAgent — Fix startup + + + + + + + + + + + + + +
+
+ +
+
+ + diff --git a/frontends/desktop/package.json b/frontends/desktop/package.json index 49acb8f38..16d192184 100644 --- a/frontends/desktop/package.json +++ b/frontends/desktop/package.json @@ -1,10 +1,12 @@ { "name": "genericagent-web2", - "version": "0.1.8", + "version": "0.2.0", "scripts": { - "tauri": "tauri" + "tauri": "tauri", + "test:dist": "node scripts/verify-compiled-dist.mjs", + "build:dmg": "tauri build --bundles dmg && bash scripts/post-dmg.sh src-tauri/target/release/bundle/dmg/*.dmg" }, "devDependencies": { - "@tauri-apps/cli": "^2" + "@tauri-apps/cli": "2.11.4" } } diff --git a/frontends/desktop/packaging/README.md b/frontends/desktop/packaging/README.md index 89e2a038b..f68c0569a 100644 --- a/frontends/desktop/packaging/README.md +++ b/frontends/desktop/packaging/README.md @@ -1,20 +1,37 @@ -# packaging +# Desktop packaging -桌面端发布相关材料。本目录的内容**不会**整体打进发布包——CI -(`.github/workflows/desktop-release-package.yml`)只从这里挑选 `scripts/` 下的 -安装/卸载脚本拷进各平台的发布产物,其余文件对构建打包过程是只读参考。 +This directory contains the scripts and locked Python inputs used to assemble GenericAgent Desktop packages. +The directory is not copied wholesale into a release; the workflow selects only the platform scripts and +requirements files required by each package. -## 目录结构 +## Submitted renderer boundary -``` +Official upstream package jobs consume the tracked `frontends/desktop/dist/**` renderer directly. They install +only the minimal submitted Tauri CLI manifest and do not run Vite, TypeScript, React tests, or any other renderer +source command. Tauri embeds `dist/**` in the native application. The portable `runtime/app` copy deliberately +excludes `dist/**` so the same renderer is not duplicated as loose runtime data. + +The React source, issue tracker, and contribution home is +. The exact accepted fork commit and generated content manifest are +recorded in `dist/build-provenance.json`. `frontends/desktop/static/**` remains the independent Desktop v1 and is +unchanged by Desktop 2.0 packaging. + +The Semi Design MIT text is tracked as `dist/THIRD_PARTY_NOTICES.txt`. Root attributes force the source notice and +compiled notice to LF on every platform, and all three package builders verify the locked notice SHA-256 before +building. + +## Inputs + +```text frontends/desktop/packaging/ -├── README.md # 本说明 -├── CHECKLIST.md # 发布前功能测试清单(测试协调用,不参与打包) -├── TODO.md # 各平台测试分工与计划(测试协调用,不参与打包) -└── scripts/ # ← 唯一被 CI 消费的内容 +├── README.md +├── dmg-build-requirements.txt +├── python-runtime-requirements.txt +└── scripts/ + ├── merge_desktop_settings.py ├── windows/ - │ ├── install_windows.ps1 # 环境准备脚本 - │ ├── uninstall.bat # 卸载入口(向用户确认后调用 ps1) + │ ├── install_windows.ps1 + │ ├── uninstall.bat │ └── uninstall_windows.ps1 ├── linux/ │ ├── install_linux.sh @@ -24,12 +41,74 @@ frontends/desktop/packaging/ └── uninstall.command ``` -## CI 如何使用这些脚本 +- Node is fixed at `22.23.2`; the compiled-only jobs install exactly `@tauri-apps/cli` `2.11.4` with + `npm install --package-lock=false`, assert that no source lockfile was created, and never invoke Vite. Rust is + fixed at `1.95.0` and crates are locked by `Cargo.lock`. +- Root `.gitattributes` pins both the source `public/THIRD_PARTY_NOTICES.txt` path and the delivered + `dist/THIRD_PARTY_NOTICES.txt` path to LF; the source file itself stays outside this compiled-only PR. Each of + the three builders runs the cross-platform compiled-distribution contract immediately before Tauri embeds the + tracked `dist`, locking the notice SHA-256 to + `2acf865e87e59090121369aac0575467067fdd7999923a70d785a46ceae3330f` and failing on any byte drift. +- python-build-standalone is fixed at release `20260814`, CPython `3.12.14`, an explicit architecture, and an + archive SHA-256 on each platform. +- The macOS builder runs on the Apple-silicon `macos-15` host and uses host CPython `3.12.10` only for the + hash-locked DMG layout tools. That host interpreter is separate from the embedded `3.12.14` runtime. +- Windows converts `RUNNER_TEMP` with `cygpath -u` before passing its archive path to POSIX tools. +- Linux builds on Ubuntu 22.04, uses a dedicated glibc-2.35 Rust cache prefix with target/bin caching disabled, + and scans every packaged ELF to reject a maximum GLIBC requirement above 2.35. +- Runtime direct and transitive dependencies use exact versions in `python-runtime-requirements.txt`; downloads + require binary wheels. The DMG layout requirements use exact versions and wheel hashes. +- Preparation disables Python bytecode writes and removes `__pycache__`, `.pyc`, and `.pyo` files across the + complete bundled runtime without removing vendored Python packages. +- Checkout, Node/Python setup, artifact upload/download, Rust toolchain, and Rust cache actions use full commit + SHA pins and disable persisted checkout credentials. + +These controls do not make the packages bit-for-bit reproducible. Runner images, Ubuntu packages, the Windows +SDK/UCRT input, platform wheels, and native packaging metadata can change or contain timestamps. Candidate +artifact SHA-256 values and release-qualification reports remain the evidence for a particular build. + +## Candidate artifacts and publication + +Manual `workflow_dispatch` runs build the selected platform or all three platforms as downloadable Actions +artifacts. They never create or edit a GitHub Release. + +A maintainer-created `desktop-portable-*` tag starts this publication graph: + +```text +Windows builder (contents: read) ─┐ +Linux builder (contents: read) ─┼─ verified Actions artifacts ─┐ +macOS builder (contents: read) ─┘ │ + ▼ + publisher (contents: write) + validate six files/checksums + create one invisible draft + verify uploaded asset set + expose one prerelease +``` + +The three builders do not receive a write token and do not call the GitHub Release API. The publisher runs only +for a matching tag push after all three builders succeed; it does not check out source or run package tooling. +It refuses to overwrite an existing Release for the tag. + +The prerelease contains exactly: + +- `GenericAgent-Desktop-Windows-Portable.zip` +- `SHA256SUMS-windows.txt` +- `GenericAgent-Desktop-Linux-Portable.tar.gz` +- `SHA256SUMS-linux.txt` +- `GenericAgent-Desktop-macOS-aarch64.dmg` +- `GenericAgent-Desktop-macOS-aarch64.dmg.sha256` + +The macOS application is ad-hoc signed only. It is not Developer ID signed or notarized, and the published notes +retain the documented context-menu / Privacy & Security opening path. -`desktop-release-package.yml` 在打各平台 portable 包时,把对应平台的脚本 -`cp` 进发布目录(例如 Windows 包里放 `install_windows.ps1` / -`uninstall.bat` / `uninstall_windows.ps1`)。**修改安装/卸载行为只需改 -`scripts/` 下的文件,不需要动 workflow。** +## Validation -> 说明:实际的桌面壳二进制(`GenericAgent.exe` / `.AppImage` / `.app`)由 CI -> 构建生成并发布到 GitHub Release,不在本仓库内提交,也不在本目录占位。 +- `npm run test:dist` verifies required compiled entries, references, source leakage, dead assets, the notice hash, + version/CSP/E2E isolation, source provenance, and the atomic release contract. +- `python -m pytest frontends/tests` verifies Desktop bridge, conductor, model/session/upload behavior, the + Desktop-only cost ledger, transactional data import, release-qualification tooling, owned service/port + behavior, `GA_ROOT`, and Tauri security contracts. +- Rust formatting, clippy, production/E2E tests, and a Tauri `--no-bundle` build validate the native shell against + the tracked renderer. +- Shell, Python, PowerShell, YAML, action pinning, boundary diff, and conflict checks run before delivery. diff --git a/frontends/desktop/packaging/dmg-build-requirements.txt b/frontends/desktop/packaging/dmg-build-requirements.txt new file mode 100644 index 000000000..677ed72bc --- /dev/null +++ b/frontends/desktop/packaging/dmg-build-requirements.txt @@ -0,0 +1,5 @@ +# Pure-Python tools used only to write the curated Finder layout. +ds-store==1.3.3 \ + --hash=sha256:b92a371efbf1b4ccce2a04d1ed13fceacc4736c81ba09cf5aefb74c088160a35 +mac-alias==2.2.3 \ + --hash=sha256:7362b521d2132ef92f606a37abfed5fcd849ceb2f28b6f9743e014b02af92f0d diff --git a/frontends/desktop/packaging/python-runtime-requirements.txt b/frontends/desktop/packaging/python-runtime-requirements.txt new file mode 100644 index 000000000..3fe5dd802 --- /dev/null +++ b/frontends/desktop/packaging/python-runtime-requirements.txt @@ -0,0 +1,37 @@ +# Desktop embedded-runtime lock for CPython 3.12.14. +# +# Direct and transitive versions are exact so all three builders resolve the same +# dependency graph. Wheel file hashes remain platform-specific and are not locked +# here; see README.md for that remaining reproducibility risk. +aiohappyeyeballs==2.7.1 +aiohttp==3.14.3 +aiosignal==1.4.0 +annotated-doc==0.0.5 +annotated-types==0.8.0 +anyio==4.14.2 +attrs==26.1.0 +beautifulsoup4==4.15.0 +bottle==0.13.4 +certifi==2026.7.22 +charset-normalizer==3.5.1 +click==8.4.2 +colorama==0.4.6 +fastapi==0.141.1 +frozenlist==1.8.0 +h11==0.16.0 +idna==3.19 +multidict==6.7.1 +propcache==0.5.2 +psutil==7.1.1 +pydantic==2.13.4 +pydantic-core==2.46.4 +requests==2.34.2 +simple-websocket-server==0.4.4 +soupsieve==2.9.2 +starlette==1.6.0 +typing-extensions==4.16.0 +typing-inspection==0.4.4 +urllib3==2.7.0 +uvicorn==0.52.1 +websockets==17.0.1 +yarl==1.24.5 diff --git a/frontends/desktop/packaging/scripts/linux/install_linux.sh b/frontends/desktop/packaging/scripts/linux/install_linux.sh index f8b14242c..1c4bf5812 100755 --- a/frontends/desktop/packaging/scripts/linux/install_linux.sh +++ b/frontends/desktop/packaging/scripts/linux/install_linux.sh @@ -5,6 +5,7 @@ set -euo pipefail # read-only mount, which breaks the bundled python ("No module named 'encodings'"). Always # run with a clean python env so the embedded interpreter uses its own stdlib/libs. unset PYTHONHOME PYTHONPATH LD_LIBRARY_PATH +export PYTHONDONTWRITEBYTECODE=1 # GenericAgent Desktop Linux installer. # Expected normal location: GenericAgent/frontends/install_linux.sh @@ -91,10 +92,20 @@ resolve_script_root() { } abs_path() { - python3 - "$1" <<'PY' -import os, sys -print(os.path.abspath(os.path.expanduser(sys.argv[1]))) -PY + local value="$1" + case "$value" in + "~") value="$HOME" ;; + "~/"*) value="$HOME/${value#~/}" ;; + esac + [[ "$value" == /* ]] || value="$PWD/$value" + if [[ -d "$value" ]]; then + (cd -P "$value" && pwd) + else + local directory base + directory="$(dirname "$value")" + base="$(basename "$value")" + printf '%s/%s\n' "$(cd -P "$directory" && pwd)" "$base" + fi } has_agentmain() { [[ -f "$1/agentmain.py" ]]; } @@ -199,23 +210,41 @@ install_dependencies() { if [[ -n "$WHEEL_DIR" ]]; then # Offline (portable bundle): install from local wheels only, no network, no pip self-upgrade. log_step "Install dependencies offline from $WHEEL_DIR" + local locked_requirements="$WHEEL_DIR/requirements.txt" + [[ -f "$locked_requirements" ]] || fail "Pinned offline requirements are missing: $locked_requirements" # Install deps directly (NOT an editable -e of the source): an editable install bakes the # project's absolute path into a .pth. Combined with --no-venv (deps go into the relocatable # embedded python) this keeps the portable bundle movable. The bridge adds the source to # sys.path itself (ensure_ga_import_path), so no install of the project is needed. # shellcheck disable=SC2086 - "$py" -m pip install --no-index --find-links "$WHEEL_DIR" \ - "requests>=2.28" "beautifulsoup4>=4.12" "bottle>=0.12" "simple-websocket-server>=0.4" "aiohttp>=3.9" psutil $EXTRA_PACKAGES \ + "$py" -m pip install --no-compile --no-index --find-links "$WHEEL_DIR" \ + --requirement "$locked_requirements" $EXTRA_PACKAGES \ || fail "Offline pip install failed (check wheel dir)." else log_step "Install/refresh minimal Python dependencies" - "$py" -m pip install --upgrade pip setuptools wheel || fail "pip bootstrap failed." + "$py" -m pip install --no-compile --upgrade pip setuptools wheel || fail "pip bootstrap failed." # shellcheck disable=SC2086 - "$py" -m pip install -e "$root" psutil $EXTRA_PACKAGES || fail "pip install failed." + "$py" -m pip install --no-compile -e "$root" psutil $EXTRA_PACKAGES || fail "pip install failed." fi printf 'GAPROGRESS|done\n' } +clean_portable_runtime_bytecode() { + local root="$1" + local py="$2" + [[ -n "$WHEEL_DIR" && "$NO_VENV" -eq 1 ]] || return + local runtime_root + runtime_root="$(cd "$root/.." && pwd -P)" + [[ -d "$runtime_root/python" && "$py" == "$runtime_root"/python/* ]] \ + || fail "Refusing to clean an unverified portable runtime: $runtime_root" + find "$runtime_root" -type d -name '__pycache__' -prune -exec rm -rf {} + + find "$runtime_root" -type f \( -name '*.pyc' -o -name '*.pyo' \) -delete + ! find "$runtime_root" -type d -name '__pycache__' -print -quit | grep -q . \ + || fail "Python bytecode cache directory remains in portable runtime" + ! find "$runtime_root" -type f \( -name '*.pyc' -o -name '*.pyo' \) -print -quit | grep -q . \ + || fail "Python bytecode remains in portable runtime" +} + ensure_mykey() { local root="$1" local mykey="$root/mykey.py" @@ -235,18 +264,16 @@ write_desktop_settings() { local py="$2" local bridge="$root/frontends/desktop_bridge.py" local settings_path="$HOME/.ga_desktop_settings.json" + local helper="$SCRIPT_ROOT/merge_desktop_settings.py" + [[ -f "$helper" ]] || helper="$SCRIPT_ROOT/../merge_desktop_settings.py" [[ -f "$bridge" ]] || fail "desktop_bridge.py not found: $bridge" + [[ -f "$helper" ]] || fail "Desktop settings merge helper not found: $helper" - "$py" - "$settings_path" "$py" "$root" "$bridge" <<'PY' -import json, pathlib, sys -settings_path, python_path, project_dir, bridge_script = sys.argv[1:5] -obj = { - "python_path": python_path, - "project_dir": project_dir, - "bridge_script": bridge_script, -} -pathlib.Path(settings_path).write_text(json.dumps(obj, indent=2), encoding="utf-8") -PY + "$py" "$helper" \ + --settings "$settings_path" \ + --python-path "$py" \ + --project-dir "$root" \ + --bridge-script "$bridge" log_ok "Wrote desktop settings: $settings_path" } @@ -296,10 +323,12 @@ find_icon() { } shell_quote() { - python3 - "$1" <<'PY' -import shlex, sys -print(shlex.quote(sys.argv[1])) -PY + local value="$1" + value="${value//\\/\\\\}" + value="${value//\"/\\\"}" + value="${value//\$/\\\$}" + value="${value//\`/\\\`}" + printf '"%s"\n' "$value" } write_desktop_file() { @@ -412,6 +441,7 @@ log_ok "Runtime Python: $PY" install_dependencies "$ROOT" "$PY" ensure_mykey "$ROOT" write_desktop_settings "$ROOT" "$PY" +clean_portable_runtime_bytecode "$ROOT" "$PY" if [[ "$PORTABLE_PREPARE" -eq 0 ]]; then install_desktop_launchers "$ROOT" "$APPIMAGE" fi diff --git a/frontends/desktop/packaging/scripts/linux/uninstall.sh b/frontends/desktop/packaging/scripts/linux/uninstall.sh index ed0c083c3..5da4c4aa8 100644 --- a/frontends/desktop/packaging/scripts/linux/uninstall.sh +++ b/frontends/desktop/packaging/scripts/linux/uninstall.sh @@ -8,8 +8,8 @@ # install on the same machine is left alone. # 2. Remove the desktop shortcut (GenericAgent.desktop) — only when its Exec # points into this bundle. -# 3. Remove ~/.ga_desktop_settings.json (shared settings; other bundles rebuild -# it on next launch). +# 3. Detach only settings paths owned by this bundle; keep preferences and any +# second bundle / external source selection. # 4. Remove the WebKitGTK data dir (~/.local/share + ~/.cache for the app id). # 5. Delete the bundle folder. set -u @@ -24,7 +24,7 @@ echo echo "This will completely remove GenericAgent from this computer:" echo " - stop its background services (bridge 14168 / conductor 8900)" echo " - delete the desktop shortcut" -echo " - delete settings (~/.ga_desktop_settings.json)" +echo " - detach this bundle from shared desktop settings (preferences are kept)" echo " - delete WebView data (~/.local/share/$APP_ID, ~/.cache/$APP_ID)" echo " - delete THIS folder and everything in it:" echo " $BUNDLE" @@ -39,8 +39,19 @@ esac echo echo "==> Stopping GenericAgent backend services" -# Best-effort graceful exit first. -curl -fsS -m 3 -X POST "http://127.0.0.1:14168/services/bridge/exit" >/dev/null 2>&1 || true +# Best-effort graceful exit only when the listener reports an app_dir inside +# this bundle. Never ask a second bundle or foreign listener to shut down. +RUNTIME_PY="$BUNDLE/runtime/python/bin/python3" +PROJECT_DIR="$BUNDLE/runtime/app" +SETTINGS_HELPER="$BUNDLE/runtime/merge_desktop_settings.py" +IDENTITY="$(curl -fsS -m 3 "http://127.0.0.1:14168/services/identity" 2>/dev/null || true)" +if [[ -x "$RUNTIME_PY" && -n "$IDENTITY" ]] && \ + BUNDLE="$BUNDLE" IDENTITY="$IDENTITY" "$RUNTIME_PY" -c \ + 'import json, os, pathlib; app=pathlib.Path(json.loads(os.environ["IDENTITY"])["app_dir"]).resolve(); bundle=pathlib.Path(os.environ["BUNDLE"]).resolve(); raise SystemExit(0 if app == bundle or bundle in app.parents else 1)'; then + curl -fsS -m 3 -X POST "http://127.0.0.1:14168/services/bridge/exit" >/dev/null 2>&1 || true +else + echo " bridge listener is not owned by this bundle; left running" +fi sleep 1 # Kill any process whose exe or command line lives inside this bundle — never touch @@ -70,11 +81,19 @@ for f in "$HOME/.local/share/applications/GenericAgent.desktop" \ done [ "$removed_shortcut" = 0 ] && echo " no desktop shortcut for this bundle found" -echo "==> Removing settings file" -if [ -f "$HOME/.ga_desktop_settings.json" ]; then - rm -f "$HOME/.ga_desktop_settings.json" && echo "[OK] removed ~/.ga_desktop_settings.json" +echo "==> Detaching bundle paths from shared settings" +if [[ -f "$HOME/.ga_desktop_settings.json" && -x "$RUNTIME_PY" \ + && -f "$SETTINGS_HELPER" && -f "$PROJECT_DIR/frontends/desktop_settings.py" ]]; then + if "$RUNTIME_PY" "$SETTINGS_HELPER" \ + --settings "$HOME/.ga_desktop_settings.json" \ + --project-dir "$PROJECT_DIR" \ + --remove-bundle "$BUNDLE"; then + echo "[OK] removed this bundle's path keys; preferences and overrides were kept" + else + echo " settings were invalid or locked; left unchanged" + fi else - echo " no settings file found" + echo " no owned settings paths could be detached" fi echo "==> Removing WebView data" diff --git a/frontends/desktop/packaging/scripts/macos/install_macos.sh b/frontends/desktop/packaging/scripts/macos/install_macos.sh index a03b74da7..f7e806155 100755 --- a/frontends/desktop/packaging/scripts/macos/install_macos.sh +++ b/frontends/desktop/packaging/scripts/macos/install_macos.sh @@ -1,5 +1,6 @@ #!/usr/bin/env bash set -euo pipefail +export PYTHONDONTWRITEBYTECODE=1 # GenericAgent Desktop macOS portable installer/preparer. # Intended bundle layout: @@ -108,7 +109,6 @@ install_deps() { [[ "$SKIP_PIP_INSTALL" == "1" ]] && return progress deps log_step "Install desktop bridge dependencies" - "$py" -m pip install --upgrade pip setuptools wheel local pkgs=( "requests>=2.28" "beautifulsoup4>=4.12" "bottle>=0.12" "simple-websocket-server>=0.4" "aiohttp>=3.9" psutil ) @@ -117,13 +117,34 @@ install_deps() { pkgs+=( $EXTRA_PACKAGES ) fi if [[ -n "$WHEEL_DIR" && -d "$WHEEL_DIR" ]]; then - "$py" -m pip install --no-index --find-links "$WHEEL_DIR" "${pkgs[@]}" + # A wheelhouse repair only needs pip itself. Keep the path fully offline and + # do not install setuptools/wheel into the prepared runtime. + local locked_requirements="$WHEEL_DIR/requirements.txt" + [[ -f "$locked_requirements" ]] || fail "Pinned offline requirements are missing: $locked_requirements" + "$py" -m pip install --no-compile --no-index --find-links "$WHEEL_DIR" \ + --requirement "$locked_requirements" "${pkgs[@]:6}" else log_warn "No wheel dir supplied; falling back to online pip install" - "$py" -m pip install "${pkgs[@]}" + "$py" -m pip install --no-compile --upgrade pip setuptools wheel + "$py" -m pip install --no-compile "${pkgs[@]}" fi } +clean_portable_runtime_bytecode() { + local py="$1" + [[ -n "$WHEEL_DIR" && "$NO_VENV" == "1" ]] || return + local runtime_root + runtime_root="$(cd "$PROJECT_DIR/.." && pwd -P)" + [[ -d "$runtime_root/python" && "$py" == "$runtime_root"/python/* ]] \ + || fail "Refusing to clean an unverified portable runtime: $runtime_root" + find "$runtime_root" -type d -name '__pycache__' -prune -exec rm -rf {} + + find "$runtime_root" -type f \( -name '*.pyc' -o -name '*.pyo' \) -delete + ! find "$runtime_root" -type d -name '__pycache__' -print -quit | grep -q . \ + || fail "Python bytecode cache directory remains in portable runtime" + ! find "$runtime_root" -type f \( -name '*.pyc' -o -name '*.pyo' \) -print -quit | grep -q . \ + || fail "Python bytecode remains in portable runtime" +} + ensure_mykey() { local mykey="$PROJECT_DIR/mykey.py" local tpl="$PROJECT_DIR/mykey_template.py" @@ -140,11 +161,16 @@ ensure_mykey() { write_settings() { local py="$1" local settings_path="$HOME/.ga_desktop_settings.json" - "$py" - "$settings_path" "$py" "$PROJECT_DIR" <<'PY' -import json, pathlib, sys -settings_path, python_path, project_dir = sys.argv[1:4] -pathlib.Path(settings_path).write_text(json.dumps({"python_path": python_path, "project_dir": project_dir}, indent=2), encoding="utf-8") -PY + local bridge="$PROJECT_DIR/frontends/desktop_bridge.py" + local helper="$SCRIPT_ROOT/merge_desktop_settings.py" + [[ -f "$helper" ]] || helper="$SCRIPT_ROOT/../merge_desktop_settings.py" + [[ -f "$bridge" ]] || fail "desktop_bridge.py not found: $bridge" + [[ -f "$helper" ]] || fail "Desktop settings merge helper not found: $helper" + "$py" "$helper" \ + --settings "$settings_path" \ + --python-path "$py" \ + --project-dir "$PROJECT_DIR" \ + --bridge-script "$bridge" log_ok "Wrote desktop settings: $settings_path" } @@ -172,6 +198,7 @@ if [[ "$NO_VENV" == "1" ]]; then RUNTIME_PY="$PYTHON_PATH"; fi install_deps "$RUNTIME_PY" ensure_mykey write_settings "$RUNTIME_PY" +clean_portable_runtime_bytecode "$RUNTIME_PY" progress done case "$MODE" in diff --git a/frontends/desktop/packaging/scripts/macos/uninstall.command b/frontends/desktop/packaging/scripts/macos/uninstall.command index 0898a03b6..cc640423c 100644 --- a/frontends/desktop/packaging/scripts/macos/uninstall.command +++ b/frontends/desktop/packaging/scripts/macos/uninstall.command @@ -7,7 +7,7 @@ # only processes whose command line lives inside this bundle. # 2. Remove the desktop alias (~/Desktop/GenericAgent.app) — only when it links # into this bundle. -# 3. Remove ~/.ga_desktop_settings.json (shared settings). +# 3. Detach only this bundle's path settings while keeping shared preferences. # 4. Remove the WKWebView data for the app id under ~/Library. # 5. Delete the bundle folder. set -u @@ -22,7 +22,7 @@ echo echo "This will completely remove GenericAgent from this computer:" echo " - stop its background services (bridge 14168 / conductor 8900)" echo " - delete the desktop alias" -echo " - delete settings (~/.ga_desktop_settings.json)" +echo " - detach this bundle from shared desktop settings (preferences are kept)" echo " - delete WebView data (~/Library/.../$APP_ID)" echo " - delete THIS folder and everything in it:" echo " $BUNDLE" @@ -37,7 +37,19 @@ esac echo echo "==> Stopping GenericAgent backend services" -curl -fsS -m 3 -X POST "http://127.0.0.1:14168/services/bridge/exit" >/dev/null 2>&1 || true +RUNTIME_ROOT="$BUNDLE/runtime" +[[ -d "$RUNTIME_ROOT/app" ]] || RUNTIME_ROOT="$BUNDLE/GenericAgent.app/Contents/Resources/runtime" +RUNTIME_PY="$RUNTIME_ROOT/python/bin/python3" +PROJECT_DIR="$RUNTIME_ROOT/app" +SETTINGS_HELPER="$RUNTIME_ROOT/merge_desktop_settings.py" +IDENTITY="$(curl -fsS -m 3 "http://127.0.0.1:14168/services/identity" 2>/dev/null || true)" +if [[ -x "$RUNTIME_PY" && -n "$IDENTITY" ]] && \ + BUNDLE="$BUNDLE" IDENTITY="$IDENTITY" "$RUNTIME_PY" -c \ + 'import json, os, pathlib; app=pathlib.Path(json.loads(os.environ["IDENTITY"])["app_dir"]).resolve(); bundle=pathlib.Path(os.environ["BUNDLE"]).resolve(); raise SystemExit(0 if app == bundle or bundle in app.parents else 1)'; then + curl -fsS -m 3 -X POST "http://127.0.0.1:14168/services/bridge/exit" >/dev/null 2>&1 || true +else + echo " bridge listener is not owned by this bundle; left running" +fi sleep 1 # Kill any process whose command line lives inside this bundle (no /proc on macOS, @@ -65,11 +77,19 @@ else echo " no desktop alias found" fi -echo "==> Removing settings file" -if [ -f "$HOME/.ga_desktop_settings.json" ]; then - rm -f "$HOME/.ga_desktop_settings.json" && echo "[OK] removed ~/.ga_desktop_settings.json" +echo "==> Detaching bundle paths from shared settings" +if [[ -f "$HOME/.ga_desktop_settings.json" && -x "$RUNTIME_PY" \ + && -f "$SETTINGS_HELPER" && -f "$PROJECT_DIR/frontends/desktop_settings.py" ]]; then + if "$RUNTIME_PY" "$SETTINGS_HELPER" \ + --settings "$HOME/.ga_desktop_settings.json" \ + --project-dir "$PROJECT_DIR" \ + --remove-bundle "$BUNDLE"; then + echo "[OK] removed this bundle's path keys; preferences and overrides were kept" + else + echo " settings were invalid or locked; left unchanged" + fi else - echo " no settings file found" + echo " no owned settings paths could be detached" fi echo "==> Removing WebView data" diff --git a/frontends/desktop/packaging/scripts/merge_desktop_settings.py b/frontends/desktop/packaging/scripts/merge_desktop_settings.py new file mode 100644 index 000000000..557f3496a --- /dev/null +++ b/frontends/desktop/packaging/scripts/merge_desktop_settings.py @@ -0,0 +1,39 @@ +#!/usr/bin/env python3 +"""Update or detach package-owned Desktop paths without dropping user settings.""" + +from __future__ import annotations + +import argparse +import sys +from pathlib import Path + + +def main() -> None: + parser = argparse.ArgumentParser() + parser.add_argument("--settings", required=True, type=Path) + parser.add_argument("--project-dir", required=True) + parser.add_argument("--python-path") + parser.add_argument("--bridge-script") + parser.add_argument("--remove-bundle") + args = parser.parse_args() + + sys.path.insert(0, str(Path(args.project_dir).resolve() / "frontends")) + from desktop_settings import merge_package_paths, remove_bundle_paths + + if args.remove_bundle: + if args.python_path or args.bridge_script: + parser.error("--remove-bundle cannot be combined with path updates") + remove_bundle_paths(args.settings, args.remove_bundle) + return + if not args.python_path or not args.bridge_script: + parser.error("--python-path and --bridge-script are required when updating settings") + merge_package_paths( + args.settings, + python_path=args.python_path, + project_dir=args.project_dir, + bridge_script=args.bridge_script, + ) + + +if __name__ == "__main__": + main() diff --git a/frontends/desktop/packaging/scripts/windows/install_windows.ps1 b/frontends/desktop/packaging/scripts/windows/install_windows.ps1 index e501d5b30..b513f8528 100644 --- a/frontends/desktop/packaging/scripts/windows/install_windows.ps1 +++ b/frontends/desktop/packaging/scripts/windows/install_windows.ps1 @@ -52,6 +52,7 @@ param( ) $ErrorActionPreference = "Stop" +$env:PYTHONDONTWRITEBYTECODE = "1" function Write-Step([string]$msg) { Write-Host "`n==> $msg" -ForegroundColor Cyan } function Write-Ok([string]$msg) { Write-Host "[OK] $msg" -ForegroundColor Green } @@ -159,6 +160,10 @@ function Install-Dependencies([string]$root, [string]$py) { # Offline mode (portable bundle): install from local wheels only, no network, no pip self-upgrade. if ($WheelDir) { $wd = (Resolve-Path $WheelDir -ErrorAction Stop).Path + $lockedRequirements = Join-Path $wd "requirements.txt" + if (-not (Test-Path $lockedRequirements -PathType Leaf)) { + Fail "Pinned offline requirements are missing: $lockedRequirements" + } Write-Ok "offline wheels: $wd" if ($extra.Count) { Write-Ok "extra packages: $($extra -join ', ')" } Write-Host "GAPROGRESS|deps" @@ -167,7 +172,7 @@ function Install-Dependencies([string]$root, [string]$py) { # project's absolute path into a .pth. With -NoVenv (deps go into the relocatable embedded # python) this keeps the portable bundle movable. The bridge adds the source to sys.path # itself (ensure_ga_import_path), so the project itself need not be installed. - & $py -m pip install --no-index --find-links $wd "requests>=2.28" "beautifulsoup4>=4.12" "bottle>=0.12" "simple-websocket-server>=0.4" "aiohttp>=3.9" psutil @extra + & $py -m pip install --no-compile --no-index --find-links $wd --requirement $lockedRequirements @extra if ($LASTEXITCODE -ne 0) { Fail "offline pip install failed (check wheels dir)." } Write-Host "GAPROGRESS|done" return @@ -182,16 +187,40 @@ function Install-Dependencies([string]$root, [string]$py) { Write-Warn "No pip mirror set; using official PyPI." } Write-Step "Upgrade pip" - & $py -m pip install @pipIndexArgs --upgrade pip + & $py -m pip install --no-compile @pipIndexArgs --upgrade pip if ($LASTEXITCODE -ne 0) { Fail "pip upgrade failed." } Write-Step "Install GenericAgent minimal package and desktop bridge extras" # pyproject.toml already includes: requests, beautifulsoup4, bottle, simple-websocket-server, aiohttp. # desktop_bridge.py additionally imports psutil. - & $py -m pip install @pipIndexArgs -e $root psutil @extra + & $py -m pip install --no-compile @pipIndexArgs -e $root psutil @extra if ($LASTEXITCODE -ne 0) { Fail "pip install failed." } } +function Remove-PortableRuntimeBytecode([string]$root, [string]$py) { + if (-not $WheelDir -or -not $NoVenv) { return } + $runtimeRoot = [System.IO.Path]::GetFullPath((Split-Path $root -Parent)) + $pythonRoot = [System.IO.Path]::GetFullPath((Join-Path $runtimeRoot "python")) + $pythonPrefix = $pythonRoot.TrimEnd('\', '/') + [System.IO.Path]::DirectorySeparatorChar + $pythonPath = [System.IO.Path]::GetFullPath($py) + if (-not (Test-Path $pythonRoot -PathType Container) -or + -not $pythonPath.StartsWith($pythonPrefix, [System.StringComparison]::OrdinalIgnoreCase)) { + Fail "Refusing to clean an unverified portable runtime: $runtimeRoot" + } + Get-ChildItem -LiteralPath $runtimeRoot -Directory -Filter "__pycache__" -Recurse -Force | + Sort-Object { $_.FullName.Length } -Descending | + Remove-Item -Recurse -Force + Get-ChildItem -LiteralPath $runtimeRoot -File -Recurse -Force | + Where-Object { $_.Name -match '\.py[co]$' } | + Remove-Item -Force + $cacheDir = Get-ChildItem -LiteralPath $runtimeRoot -Directory -Filter "__pycache__" -Recurse -Force | + Select-Object -First 1 + $bytecode = Get-ChildItem -LiteralPath $runtimeRoot -File -Recurse -Force | + Where-Object { $_.Name -match '\.py[co]$' } | + Select-Object -First 1 + if ($cacheDir -or $bytecode) { Fail "Python bytecode remains in portable runtime" } +} + function Ensure-MyKey([string]$root) { $mykey = Join-Path $root "mykey.py" $tpl = Join-Path $root "mykey_template.py" @@ -209,17 +238,20 @@ function Ensure-MyKey([string]$root) { function Write-DesktopSettings([string]$root, [string]$py) { $settingsPath = Join-Path $env:USERPROFILE ".ga_desktop_settings.json" - $obj = [ordered]@{ - python_path = $py - project_dir = $root - bridge_script = (Join-Path $root "frontends\desktop_bridge.py") + $bridge = Join-Path $root "frontends\desktop_bridge.py" + $scriptRoot = Resolve-ScriptRoot + $helper = Join-Path $scriptRoot "merge_desktop_settings.py" + if (-not (Test-Path -LiteralPath $helper -PathType Leaf)) { + $helper = Join-Path (Split-Path $scriptRoot -Parent) "merge_desktop_settings.py" + } + if (-not (Test-Path -LiteralPath $bridge -PathType Leaf)) { + Fail "desktop_bridge.py not found: $bridge" + } + if (-not (Test-Path -LiteralPath $helper -PathType Leaf)) { + Fail "Desktop settings merge helper not found: $helper" } - $json = $obj | ConvertTo-Json -Depth 5 - # PowerShell 5.1 `Set-Content -Encoding UTF8` writes a UTF-8 BOM. - # Rust serde_json does not accept BOM at the beginning, causing the Tauri shell - # to ignore this settings file and auto-discover the wrong project directory. - $utf8NoBom = New-Object System.Text.UTF8Encoding($false) - [System.IO.File]::WriteAllText($settingsPath, $json, $utf8NoBom) + & $py $helper --settings $settingsPath --python-path $py --project-dir $root --bridge-script $bridge + if ($LASTEXITCODE -ne 0) { Fail "Desktop settings merge failed." } Write-Ok "Wrote desktop settings: $settingsPath" } @@ -269,7 +301,7 @@ function Install-DesktopNpm([string]$root) { Write-Step "Install Tauri desktop npm dependencies: $desktop" Push-Location $desktop try { - & cmd /c npm install @npmRegArgs + & cmd /c npm install --package-lock=false @npmRegArgs if ($LASTEXITCODE -ne 0) { Fail "npm install failed in $desktop" } & cmd /c npx tauri --version if ($LASTEXITCODE -ne 0) { Fail "npx tauri --version failed after npm install" } @@ -349,6 +381,7 @@ Write-Ok "Runtime Python: $py" Install-Dependencies $root $py Ensure-MyKey $root Write-DesktopSettings $root $py +Remove-PortableRuntimeBytecode $root $py Test-WebView2Installed if ($Mode -eq "PrepareOnly") { diff --git a/frontends/desktop/packaging/scripts/windows/uninstall.bat b/frontends/desktop/packaging/scripts/windows/uninstall.bat index 077652ec4..9df3809fc 100644 --- a/frontends/desktop/packaging/scripts/windows/uninstall.bat +++ b/frontends/desktop/packaging/scripts/windows/uninstall.bat @@ -9,7 +9,7 @@ echo. echo This will completely remove GenericAgent from this computer: echo - stop its background services (ports 14168 / 8900) echo - delete the desktop shortcut -echo - delete settings (%%USERPROFILE%%\.ga_desktop_settings.json) +echo - detach this bundle from shared settings; keep preferences and other installs echo - delete THIS folder and everything in it: echo "%~dp0" echo. diff --git a/frontends/desktop/packaging/scripts/windows/uninstall_windows.ps1 b/frontends/desktop/packaging/scripts/windows/uninstall_windows.ps1 index e2262585d..29179b19d 100644 --- a/frontends/desktop/packaging/scripts/windows/uninstall_windows.ps1 +++ b/frontends/desktop/packaging/scripts/windows/uninstall_windows.ps1 @@ -8,8 +8,8 @@ bundle folder itself: on the same machine are left alone. 2. Remove the desktop shortcut (GenericAgent.lnk) — only when it points into this bundle. - 3. Remove ~/.ga_desktop_settings.json (shared settings; other bundles rebuild it - automatically on next launch). + 3. Detach only path settings owned by this bundle while preserving preferences, + external source selection, and any second installed bundle. 4. Schedule deletion of the bundle folder after this script exits (a folder cannot delete itself while code runs inside it). @@ -44,11 +44,16 @@ function Path-IsInsideBundle([string]$p) { # ── 1. Graceful backend shutdown, then force-kill bundle-owned processes ────── Write-Step "Stopping GenericAgent backend services" -# Best-effort graceful exit: tell the bridge to stop its managed extras and quit. +# Best-effort graceful exit only when identity.app_dir belongs to this bundle. try { - Invoke-WebRequest -Uri "http://127.0.0.1:14168/services/bridge/exit" -Method Post ` - -TimeoutSec 3 -UseBasicParsing | Out-Null - Start-Sleep -Milliseconds 800 + $identity = Invoke-RestMethod -Uri "http://127.0.0.1:14168/services/identity" -Method Get -TimeoutSec 3 + if ($identity.app_dir -and (Path-IsInsideBundle ([string]$identity.app_dir))) { + Invoke-WebRequest -Uri "http://127.0.0.1:14168/services/bridge/exit" -Method Post ` + -TimeoutSec 3 -UseBasicParsing | Out-Null + Start-Sleep -Milliseconds 800 + } else { + Write-Info "bridge listener is not owned by this bundle; left running" + } } catch { } # Force-kill anything still listening on our ports, but ONLY if the owning process @@ -97,13 +102,23 @@ if (Test-Path -LiteralPath $lnk) { } # ── 3. Shared settings file ────────────────────────────────────────────────── -Write-Step "Removing settings file" +Write-Step "Detaching bundle paths from shared settings" $settings = Join-Path $env:USERPROFILE '.ga_desktop_settings.json' -if (Test-Path -LiteralPath $settings) { - Remove-Item -LiteralPath $settings -Force -ErrorAction SilentlyContinue - Write-Ok "removed $settings" +$runtimePy = Join-Path $bundle 'runtime\python\python.exe' +$projectDir = Join-Path $bundle 'runtime\app' +$settingsHelper = Join-Path $bundle 'runtime\merge_desktop_settings.py' +if ((Test-Path -LiteralPath $settings -PathType Leaf) -and + (Test-Path -LiteralPath $runtimePy -PathType Leaf) -and + (Test-Path -LiteralPath $settingsHelper -PathType Leaf) -and + (Test-Path -LiteralPath (Join-Path $projectDir 'frontends\desktop_settings.py') -PathType Leaf)) { + & $runtimePy $settingsHelper --settings $settings --project-dir $projectDir --remove-bundle $bundle + if ($LASTEXITCODE -eq 0) { + Write-Ok "removed this bundle's path keys; preferences and overrides were kept" + } else { + Write-Info "settings were invalid or locked; left unchanged" + } } else { - Write-Info "no settings file found" + Write-Info "no owned settings paths could be detached" } # ── 3b. WebView2 data dir (cache + localStorage) ───────────────────────────── diff --git a/frontends/desktop/release_qualification/README.md b/frontends/desktop/release_qualification/README.md new file mode 100644 index 000000000..c2e253cb1 --- /dev/null +++ b/frontends/desktop/release_qualification/README.md @@ -0,0 +1,29 @@ +# Desktop release qualification + +`run_release_qualification.py` is the common production-package runner. Platform wrappers install +or extract one artifact produced from a candidate commit and invoke it against the production binary. +It temporarily uses the real per-user settings path, restores it byte-for-byte, and therefore +must run in a dedicated Windows/Linux/macOS test account. + +Every platform report records the candidate commit, artifact SHA-256, OS/architecture, bootstrap +snapshots, bridge identity/PIDs, package paths before and after relocation, screenshots, redacted +fake-model transcript, data results, cleanup status, and a short manual checklist. Screenshots and +manual checklist values are supporting material for the release owner; they do not determine the +automated evidence gate result. + +After all three reports and the Windows native retry report are complete, combine them: + +```bash +python3 frontends/desktop/release_qualification/verify_release_evidence.py \ + --expected-commit \ + --windows \ + --linux \ + --macos \ + --windows-native-report \ + --output +``` + +The verifier fails on a commit mismatch, missing artifact digest, failed automated scenario, +incomplete bootstrap evidence, missing macOS app immutability proof, or unclean final process/port +state. The release owner still reviews the screenshots and platform checklists separately before +publishing. The manifest is evidence for the candidate SHA; it is not committed to the repository. diff --git a/frontends/desktop/release_qualification/linux/README.md b/frontends/desktop/release_qualification/linux/README.md new file mode 100644 index 000000000..5526db46e --- /dev/null +++ b/frontends/desktop/release_qualification/linux/README.md @@ -0,0 +1,23 @@ +# Ubuntu 24.04 release qualification + +Run this on a real Ubuntu 24.04 x64 desktop in a dedicated test account. FUSE must be available. +A screenshot tool (`gnome-screenshot`, `scrot`, or ImageMagick `import`) supplies optional review +evidence when present. + +```bash +frontends/desktop/release_qualification/linux/run_linux_release_qualification.sh \ + --artifact /path/GenericAgent-Desktop-Linux-Portable.tar.gz \ + --expected-commit \ + --keep-work-dir +``` + +The wrapper verifies/extracts the tar, preserves the AppImage launch path, and runs the shared +production qualification. It covers package shape, embedded Python, first launch, warm +restart, package-owned bridge plus external `GA_ROOT`, deterministic chat, upload, memory import, +foreign-port protection, recovery after release, relocation into a path containing spaces and +Chinese characters, stale-override fallback, optional P2P degradation, screenshots, and cleanup. + +After automation passes, review the Linux manual items: executable bit and desktop launcher, +window dragging/close behavior, retry button after port release, native directory picker, and +visual/loading behavior. The report retains these checklist values for notes, but the automated +evidence verifier does not require them to be edited to `pass`. diff --git a/frontends/desktop/release_qualification/linux/run_linux_release_qualification.sh b/frontends/desktop/release_qualification/linux/run_linux_release_qualification.sh new file mode 100755 index 000000000..b9e162dc5 --- /dev/null +++ b/frontends/desktop/release_qualification/linux/run_linux_release_qualification.sh @@ -0,0 +1,72 @@ +#!/usr/bin/env bash +set -euo pipefail + +usage() { + echo "Usage: $0 --artifact --expected-commit [--work-dir ]" >&2 +} + +artifact="" +expected_commit="" +work_dir="" +keep_work_dir=0 +while [[ $# -gt 0 ]]; do + case "$1" in + --artifact) artifact="$2"; shift 2 ;; + --expected-commit) expected_commit="$2"; shift 2 ;; + --work-dir) work_dir="$2"; shift 2 ;; + --keep-work-dir) keep_work_dir=1; shift ;; + *) usage; exit 2 ;; + esac +done + +[[ -n "$artifact" && -n "$expected_commit" ]] || { usage; exit 2; } +artifact="$(realpath "$artifact")" +[[ -f "$artifact" ]] || { echo "Artifact not found: $artifact" >&2; exit 1; } +script_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +driver="$script_dir/../run_release_qualification.py" +if [[ -z "$work_dir" ]]; then + work_dir="$(mktemp -d -t ga-linux-release-qualification.XXXXXX)" +else + mkdir -p "$work_dir" + work_dir="$(realpath "$work_dir")" +fi +extract_dir="$work_dir/extracted" +report_dir="$work_dir/report" +driver_work="$work_dir/driver-work" +mkdir -p "$extract_dir" "$report_dir" "$driver_work" + +cleanup() { + if [[ $keep_work_dir -eq 0 ]]; then + echo "Evidence kept at $report_dir; extracted package kept until the report is collected." + else + echo "Work directory kept at $work_dir" + fi +} +trap cleanup EXIT + +tar -xzf "$artifact" -C "$extract_dir" +package_root="$extract_dir/GenericAgent-Desktop-Linux-Portable" +if [[ ! -d "$package_root" ]]; then + mapfile -t roots < <(find "$extract_dir" -mindepth 1 -maxdepth 1 -type d) + [[ ${#roots[@]} -eq 1 ]] || { echo "Could not identify the portable package root" >&2; exit 1; } + package_root="${roots[0]}" +fi +chmod +x "$package_root/GenericAgent.AppImage" + +sidecar="$(dirname "$artifact")/SHA256SUMS-linux.txt" +[[ -f "$sidecar" ]] || { echo "Linux SHA-256 sidecar not found: $sidecar" >&2; exit 1; } +expected_hash="$(grep -Eo '[0-9a-fA-F]{64}' "$sidecar" | head -n 1 | tr '[:upper:]' '[:lower:]')" +actual_hash="$(sha256sum "$artifact" | awk '{print $1}')" +[[ "$actual_hash" == "$expected_hash" ]] || { echo "Artifact SHA-256 mismatch" >&2; exit 1; } + +python3 "$driver" \ + --platform linux \ + --artifact "$artifact" \ + --expected-commit "$expected_commit" \ + --package-root "$package_root" \ + --application-relative "GenericAgent.AppImage" \ + --runtime-relative "runtime" \ + --relocated-root "$work_dir/relocated/含 空格/GenericAgent 包" \ + --report-dir "$report_dir" \ + --work-dir "$driver_work" \ + --allow-user-settings-mutation diff --git a/frontends/desktop/release_qualification/macos/README.md b/frontends/desktop/release_qualification/macos/README.md new file mode 100644 index 000000000..e002613ad --- /dev/null +++ b/frontends/desktop/release_qualification/macos/README.md @@ -0,0 +1,28 @@ +# macOS 15 DMG release qualification + +Run this on a real macOS 15 machine in a dedicated test account. The wrapper mounts the DMG, +copies its app into `/Applications` under a collision-safe qualification name, launches the production +binary, and later moves that exact app to a path containing spaces and Chinese characters. + +```bash +frontends/desktop/release_qualification/macos/run_macos_release_qualification.sh \ + --artifact /path/GenericAgent-Desktop-macOS-aarch64.dmg \ + --expected-commit \ + --keep-work-dir +``` + +The release workflow builds this artifact on the explicit macOS 15 arm64 runner and names it +`aarch64`; it is not an Intel/universal binary. The app is ad-hoc signed only, not Developer ID +signed or notarized. + +In addition to the shared chat/data/port/relocation checks, this qualification hard-fails if the DMG +does not contain the build-time `.prepared` marker or if any file inside the `.app` changes from +first launch through restart and relocation. It verifies the package bridge remains inside the +app while `GA_ROOT` points at an external core, then verifies a deleted override falls back to the +stable writable runtime at `~/Library/Application Support/GenericAgent/runtime/app`. + +After automation, review Gatekeeper/open-anyway, traffic lights, focus, retry behavior, the native +directory picker, and visual/loading behavior. The report keeps those checklist values as supporting +notes, but the automated verifier does not require them to be edited to `pass`. The wrapper restores +the settings file exactly and removes its temporary `/Applications` copy; run it only in a dedicated +account because the normal Application Support runtime may be created. diff --git a/frontends/desktop/release_qualification/macos/run_macos_release_qualification.sh b/frontends/desktop/release_qualification/macos/run_macos_release_qualification.sh new file mode 100755 index 000000000..594bcdaf5 --- /dev/null +++ b/frontends/desktop/release_qualification/macos/run_macos_release_qualification.sh @@ -0,0 +1,85 @@ +#!/usr/bin/env bash +set -euo pipefail + +usage() { + echo "Usage: $0 --artifact --expected-commit [--work-dir ]" >&2 +} + +artifact="" +expected_commit="" +work_dir="" +keep_work_dir=0 +while [[ $# -gt 0 ]]; do + case "$1" in + --artifact) artifact="$2"; shift 2 ;; + --expected-commit) expected_commit="$2"; shift 2 ;; + --work-dir) work_dir="$2"; shift 2 ;; + --keep-work-dir) keep_work_dir=1; shift ;; + *) usage; exit 2 ;; + esac +done + +[[ -n "$artifact" && -n "$expected_commit" ]] || { usage; exit 2; } +artifact="$(cd "$(dirname "$artifact")" && pwd)/$(basename "$artifact")" +[[ -f "$artifact" ]] || { echo "Artifact not found: $artifact" >&2; exit 1; } +script_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +driver="$script_dir/../run_release_qualification.py" +if [[ -z "$work_dir" ]]; then + work_dir="$(mktemp -d -t ga-macos-release-qualification.XXXXXX)" +else + mkdir -p "$work_dir" + work_dir="$(cd "$work_dir" && pwd)" +fi +report_dir="$work_dir/report" +driver_work="$work_dir/driver-work" +mount_point="$work_dir/dmg" +install_app="/Applications/GenericAgent Release Qualification $$.app" +mounted=0 +mkdir -p "$report_dir" "$driver_work" "$mount_point" + +cleanup() { + if [[ $mounted -eq 1 ]]; then + hdiutil detach "$mount_point" -quiet || true + fi + if [[ -d "$install_app" ]]; then + rm -rf -- "$install_app" + fi + if [[ $keep_work_dir -eq 1 ]]; then + echo "Work directory kept at $work_dir" + else + echo "Evidence kept at $report_dir" + fi +} +trap cleanup EXIT + +[[ ! -e "$install_app" ]] || { echo "Refusing to replace existing app: $install_app" >&2; exit 1; } +sidecar="$artifact.sha256" +[[ -f "$sidecar" ]] || { echo "macOS SHA-256 sidecar not found: $sidecar" >&2; exit 1; } +expected_hash="$(grep -Eo '[0-9a-fA-F]{64}' "$sidecar" | head -n 1 | tr '[:upper:]' '[:lower:]')" +actual_hash="$(shasum -a 256 "$artifact" | awk '{print $1}')" +[[ "$actual_hash" == "$expected_hash" ]] || { echo "Artifact SHA-256 mismatch" >&2; exit 1; } + +hdiutil attach "$artifact" -mountpoint "$mount_point" -nobrowse -readonly -quiet +mounted=1 +source_app="$(find "$mount_point" -mindepth 1 -maxdepth 1 -type d -name '*.app' | head -n 1)" +[[ -n "$source_app" ]] || { echo "DMG does not contain an application" >&2; exit 1; } +ditto "$source_app" "$install_app" +hdiutil detach "$mount_point" -quiet +mounted=0 + +binary="$(find "$install_app/Contents/MacOS" -mindepth 1 -maxdepth 1 -type f -perm -111 | head -n 1)" +[[ -n "$binary" ]] || { echo "Installed application has no executable" >&2; exit 1; } +binary_relative="${binary#"$install_app"/}" + +python3 "$driver" \ + --platform macos \ + --artifact "$artifact" \ + --expected-commit "$expected_commit" \ + --package-root "$install_app" \ + --application-relative "$binary_relative" \ + --runtime-relative "Contents/Resources/runtime" \ + --relocated-root "$work_dir/relocated/含 空格/GenericAgent 已移动.app" \ + --report-dir "$report_dir" \ + --work-dir "$driver_work" \ + --allow-user-settings-mutation \ + --allow-external-package diff --git a/frontends/desktop/release_qualification/run_release_qualification.py b/frontends/desktop/release_qualification/run_release_qualification.py new file mode 100644 index 000000000..2ee319960 --- /dev/null +++ b/frontends/desktop/release_qualification/run_release_qualification.py @@ -0,0 +1,1027 @@ +#!/usr/bin/env python3 +"""Cross-platform release qualification for GenericAgent Desktop 2.0. + +This runner deliberately exercises a production binary and its packaged runtime. It does +not import product code from the checkout and it does not require network access. The +platform wrappers are responsible for extracting/installing the artifact and then pass the +application/runtime paths here. + +The production binary uses the real per-user settings file, so the runner refuses to start +without an explicit acknowledgement. It backs up that file byte-for-byte and restores it in +``finally``. Run this only in a dedicated OS test account: macOS may also create its normal +stable writable runtime under Application Support during the stale-override fallback test. +""" + +from __future__ import annotations + +import argparse +import base64 +import contextlib +import hashlib +import http.server +import json +import os +import platform +import plistlib +import shutil +import socket +import subprocess +import sys +import threading +import time +import urllib.error +import urllib.request +from pathlib import Path +from typing import Any + + +BRIDGE_HOST = "127.0.0.1" +DEFAULT_BRIDGE_PORT = 14168 +BRIDGE_PORT = DEFAULT_BRIDGE_PORT +BRIDGE_BASE = f"http://{BRIDGE_HOST}:{BRIDGE_PORT}" +RELEASE_VERSION = "0.2.0" +CONDUCTOR_SERVICE_ID = "frontends/conductor.py" +DEFAULT_CONDUCTOR_PORT = 8900 +E2E_CONDUCTOR_PORT_ENV = "GA_DESKTOP_E2E_CONDUCTOR_PORT" + + +class JourneyFailure(RuntimeError): + pass + + +def utc_now() -> str: + return time.strftime("%Y-%m-%dT%H:%M:%SZ", time.gmtime()) + + +def sha256(path: Path) -> str: + digest = hashlib.sha256() + with path.open("rb") as stream: + for chunk in iter(lambda: stream.read(1024 * 1024), b""): + digest.update(chunk) + return digest.hexdigest() + + +def canonical(path: Path | str) -> Path: + return Path(path).expanduser().resolve() + + +def is_within(child: Path | str, parent: Path | str) -> bool: + try: + canonical(child).relative_to(canonical(parent)) + return True + except (OSError, ValueError): + return False + + +def read_json(path: Path, default: Any = None) -> Any: + try: + return json.loads(path.read_text(encoding="utf-8")) + except (OSError, json.JSONDecodeError): + return default + + +def write_json(path: Path, value: Any) -> None: + path.parent.mkdir(parents=True, exist_ok=True) + path.write_text(json.dumps(value, ensure_ascii=False, indent=2) + "\n", encoding="utf-8") + + +def read_macos_bundle_versions(package_root: Path) -> tuple[str, str]: + info_path = package_root / "Contents" / "Info.plist" + try: + with info_path.open("rb") as stream: + info = plistlib.load(stream) + except (OSError, plistlib.InvalidFileException, TypeError, ValueError) as error: + raise JourneyFailure(f"macOS application Info.plist is missing or invalid: {info_path}") from error + if not isinstance(info, dict): + raise JourneyFailure(f"macOS application Info.plist is missing or invalid: {info_path}") + + values = { + "CFBundleShortVersionString": info.get("CFBundleShortVersionString"), + "CFBundleVersion": info.get("CFBundleVersion"), + } + for key, value in values.items(): + if not isinstance(value, str) or value != RELEASE_VERSION: + raise JourneyFailure(f"macOS {key} is {value!r}; expected {RELEASE_VERSION!r}") + return values["CFBundleShortVersionString"], values["CFBundleVersion"] + + +def request_json(method: str, path: str, body: Any = None, timeout: float = 5.0) -> Any: + payload = None if body is None else json.dumps(body).encode("utf-8") + request = urllib.request.Request(f"{BRIDGE_BASE}{path}", data=payload, method=method) + if payload is not None: + request.add_header("Content-Type", "application/json") + with urllib.request.urlopen(request, timeout=timeout) as response: + return json.loads(response.read().decode("utf-8")) + + +def request_json_with_status( + method: str, + path: str, + body: Any = None, + timeout: float = 5.0, +) -> tuple[int, Any]: + """Return an intentional HTTP error as JSON without treating it as a retry signal.""" + payload = None if body is None else json.dumps(body).encode("utf-8") + request = urllib.request.Request(f"{BRIDGE_BASE}{path}", data=payload, method=method) + if payload is not None: + request.add_header("Content-Type", "application/json") + try: + with urllib.request.urlopen(request, timeout=timeout) as response: + status = int(response.status) + raw = response.read() + except urllib.error.HTTPError as error: + status = int(error.code) + raw = error.read() + error.close() + try: + value = json.loads(raw.decode("utf-8")) + except (UnicodeDecodeError, json.JSONDecodeError) as error: + raise JourneyFailure(f"{method} {path} returned HTTP {status} without valid JSON") from error + return status, value + + +def completed_assistant_reply(snapshot: Any) -> str | None: + if not isinstance(snapshot, dict): + raise JourneyFailure("chat messages response is not an object") + status = snapshot.get("status") + if status in {"error", "cancelled"}: + detail = snapshot.get("lastError") or status + raise JourneyFailure(f"chat entered terminal state {status}: {detail}") + messages = snapshot.get("messages") + if not isinstance(messages, list): + raise JourneyFailure("chat messages response has no messages list") + reply = next( + ( + content + for message in reversed(messages) + if isinstance(message, dict) + and message.get("role") == "assistant" + and isinstance((content := message.get("content")), str) + and "Harness reply" in content + ), + None, + ) + if reply is None: + return None + if status != "idle" or snapshot.get("hasUnfinishedWork") is not False: + return None + return reply + + +def validate_import_maintenance_conflict(status: int, payload: Any) -> list[str]: + if status != 409 or not isinstance(payload, dict): + raise JourneyFailure(f"initial memory import was not the expected HTTP 409: {status} {payload}") + if payload.get("ok") is not False or payload.get("code") != "maintenance_conflict": + raise JourneyFailure(f"initial memory import returned the wrong conflict: {payload}") + if payload.get("runningSessions") != []: + raise JourneyFailure(f"memory import still saw unfinished Desktop sessions: {payload}") + running_extras = payload.get("runningExtras") + if ( + not isinstance(running_extras, list) + or not running_extras + or any(not isinstance(item, str) or not item for item in running_extras) + or len(running_extras) != len(set(running_extras)) + or CONDUCTOR_SERVICE_ID not in running_extras + ): + raise JourneyFailure(f"memory import did not identify the running conductor: {payload}") + return running_extras + + +def verified_stopped_extras_panel(payload: Any, expected_ids: list[str]) -> dict[str, Any] | None: + if not isinstance(payload, dict) or not expected_ids: + return None + services = payload.get("services") + if not isinstance(services, list): + return None + states: dict[str, dict[str, Any]] = {} + for item in services: + if not isinstance(item, dict) or not isinstance(item.get("id"), str): + continue + service_id = item["id"] + if service_id in states: + return None + states[service_id] = item + for service_id in expected_ids: + state = states.get(service_id) + if ( + state is None + or state.get("running") is not False + or state.get("status") != "offline" + ): + return None + return payload + + +def verified_owned_conductor( + payload: Any, + expected_port: int, + port_is_listening: bool, +) -> dict[str, Any] | None: + """Return the one live conductor owned by this bridge, never an external listener.""" + if port_is_listening is not True or not isinstance(payload, dict): + return None + services = payload.get("services") + if not isinstance(services, list): + return None + matches = [ + item + for item in services + if isinstance(item, dict) and item.get("id") == CONDUCTOR_SERVICE_ID + ] + if len(matches) != 1: + return None + state = matches[0] + pid = state.get("pid") + if ( + state.get("status") != "running" + or state.get("running") is not True + or state.get("owned") is not True + or state.get("external") is not False + or state.get("port") != expected_port + or not isinstance(pid, int) + or isinstance(pid, bool) + or pid <= 0 + ): + return None + return state + + +def wait_until(label: str, predicate, timeout: float, interval: float = 0.25) -> Any: + deadline = time.monotonic() + timeout + last_error: BaseException | None = None + while time.monotonic() < deadline: + try: + value = predicate() + if value: + return value + except (OSError, ValueError, urllib.error.URLError, json.JSONDecodeError) as error: + last_error = error + time.sleep(interval) + suffix = f": {last_error}" if last_error else "" + raise JourneyFailure(f"timed out waiting for {label}{suffix}") + + +def loopback_port_is_free(port: int) -> bool: + with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as probe: + probe.settimeout(0.25) + return probe.connect_ex((BRIDGE_HOST, port)) != 0 + + +def port_is_free() -> bool: + return loopback_port_is_free(BRIDGE_PORT) + + +def allocate_isolated_conductor_port() -> int: + for _ in range(20): + with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as reservation: + reservation.bind((BRIDGE_HOST, 0)) + port = int(reservation.getsockname()[1]) + if port not in {BRIDGE_PORT, DEFAULT_BRIDGE_PORT, DEFAULT_CONDUCTOR_PORT}: + return port + raise JourneyFailure("could not allocate an isolated conductor port") + + +def pid_is_alive(pid: int) -> bool: + if pid <= 0: + return False + try: + os.kill(pid, 0) + except ProcessLookupError: + return False + except PermissionError: + return True + except OSError: + return False + return True + + +class FakeOpenAIHandler(http.server.BaseHTTPRequestHandler): + protocol_version = "HTTP/1.1" + + def log_message(self, _format: str, *_args: Any) -> None: + return + + def do_POST(self) -> None: # noqa: N802 - stdlib callback name + length = int(self.headers.get("Content-Length", "0")) + raw = self.rfile.read(length) + try: + body = json.loads(raw or b"{}") + except json.JSONDecodeError: + body = {} + self.server.transcript.append({ # type: ignore[attr-defined] + "path": self.path, + "model": body.get("model", ""), + "authorization": "[redacted]" if self.headers.get("Authorization") else "", + "at": utc_now(), + }) + events = [ + {"choices": [{"delta": {"content": "Harness reply"}}]}, + { + "choices": [], + "usage": { + "prompt_tokens": 101, + "completion_tokens": 17, + "prompt_tokens_details": {"cached_tokens": 11}, + }, + }, + ] + data = "".join(f"data: {json.dumps(event)}\n\n" for event in events) + data += "data: [DONE]\n\n" + encoded = data.encode("utf-8") + self.send_response(200) + self.send_header("Content-Type", "text/event-stream; charset=utf-8") + self.send_header("Content-Length", str(len(encoded))) + self.send_header("Connection", "close") + self.end_headers() + self.wfile.write(encoded) + + +class FakeOpenAI: + def __init__(self) -> None: + self.server = http.server.ThreadingHTTPServer((BRIDGE_HOST, 0), FakeOpenAIHandler) + self.server.transcript = [] # type: ignore[attr-defined] + self.thread = threading.Thread(target=self.server.serve_forever, daemon=True) + self.started = False + + @property + def base_url(self) -> str: + return f"http://{BRIDGE_HOST}:{self.server.server_port}" + + @property + def transcript(self) -> list[dict[str, Any]]: + return list(self.server.transcript) # type: ignore[attr-defined] + + def start(self) -> None: + self.thread.start() + self.started = True + + def stop(self) -> None: + if self.started: + self.server.shutdown() + self.server.server_close() + if self.started: + self.thread.join(timeout=5) + + +class ForeignIdentityHandler(http.server.BaseHTTPRequestHandler): + def log_message(self, _format: str, *_args: Any) -> None: + return + + def do_GET(self) -> None: # noqa: N802 - stdlib callback name + payload = json.dumps({"service": "foreign-p2-package-listener", "pid": os.getpid()}).encode() + self.send_response(200) + self.send_header("Content-Type", "application/json") + self.send_header("Content-Length", str(len(payload))) + self.end_headers() + self.wfile.write(payload) + + +def fake_mykey(base_url: str) -> str: + return "\n".join( + [ + "native_oai_config = {", + " 'name': 'GenericAgent package E2E',", + " 'apikey': 'e2e-dummy-key',", + f" 'apibase': {str(base_url + '/v1')!r},", + " 'model': 'e2e-model',", + " 'api_mode': 'chat_completions',", + " 'stream': True,", + " 'max_retries': 0,", + " 'connect_timeout': 2,", + " 'read_timeout': 30,", + "}", + "", + ] + ) + + +def tree_snapshot(root: Path) -> dict[str, tuple[int, int]]: + snapshot: dict[str, tuple[int, int]] = {} + for path in sorted(root.rglob("*")): + if path.is_file() and not path.is_symlink(): + stat = path.stat() + snapshot[path.relative_to(root).as_posix()] = (stat.st_size, stat.st_mtime_ns) + return snapshot + + +def capture_screenshot(target: Path) -> bool: + target.parent.mkdir(parents=True, exist_ok=True) + system = platform.system() + commands: list[list[str]] = [] + if system == "Darwin": + commands = [["screencapture", "-x", str(target)]] + elif system == "Linux": + commands = [ + ["gnome-screenshot", "-f", str(target)], + ["scrot", str(target)], + ["import", "-window", "root", str(target)], + ] + for command in commands: + if not shutil.which(command[0]): + continue + completed = subprocess.run(command, stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL) + if completed.returncode == 0 and target.is_file() and target.stat().st_size > 0: + return True + return False + + +class Journey: + def __init__(self, args: argparse.Namespace) -> None: + self.args = args + self.package_root = canonical(args.package_root) + self.application_relative = Path(args.application_relative) + self.runtime_relative = Path(args.runtime_relative) + self.runtime_root = self.package_root / self.runtime_relative + self.application = self.package_root / self.application_relative + self.report_dir = canonical(args.report_dir) + self.work_dir = canonical(args.work_dir) + self.settings_path = Path.home() / ".ga_desktop_settings.json" + self.settings_existed = self.settings_path.exists() + self.settings_bytes = self.settings_path.read_bytes() if self.settings_existed else b"" + self.settings_mode = self.settings_path.stat().st_mode if self.settings_existed else None + self.conductor_port = allocate_isolated_conductor_port() + self.default_conductor_port_initially_free = loopback_port_is_free(DEFAULT_CONDUCTOR_PORT) + self.fake = FakeOpenAI() + self.external_root = self.work_dir / "external compatible core" + self.stale_root = self.work_dir / "external compatible core.removed" + self.process: subprocess.Popen[bytes] | None = None + self.process_log = None + self.foreign_server: http.server.ThreadingHTTPServer | None = None + self.foreign_thread: threading.Thread | None = None + self.screenshots: list[str] = [] + self.app_snapshot: dict[str, tuple[int, int]] | None = None + self.report: dict[str, Any] = { + "schemaVersion": 1, + "startedAt": utc_now(), + "expectedCommit": args.expected_commit, + "releaseVersion": RELEASE_VERSION, + "artifact": {}, + "environment": { + "system": platform.system(), + "release": platform.release(), + "version": platform.version(), + "architecture": platform.machine(), + "python": platform.python_version(), + "isolatedConductorPort": self.conductor_port, + "defaultConductorPortInitiallyFree": self.default_conductor_port_initially_free, + }, + "paths": {"before": str(self.package_root)}, + "checks": {}, + "bootstrap": {}, + "identities": {}, + "pids": [], + "screenshots": self.screenshots, + "manualChecklist": self.manual_checklist(args.platform), + "failures": [], + } + + @staticmethod + def manual_checklist(system: str) -> dict[str, str]: + common = { + "loadingFallbackAndMainRender": "pending", + "nativeDirectoryPicker": "pending", + "noVisualRegression": "pending", + } + platform_items = { + "windows": { + "framelessTitlebarAndThreeButtons": "pending", + "trayAndCloseHides": "pending", + "shortcutSelfHealsAfterMove": "pending", + }, + "linux": { + "appImageExecutableAndDesktopLauncher": "pending", + "windowDragAndCloseBehavior": "pending", + "retryButtonAfterPortRelease": "pending", + }, + "macos": { + "gatekeeperOrOpenAnyway": "pending", + "trafficLightsAndWindowFocus": "pending", + "retryButtonAfterPortRelease": "pending", + }, + } + return {**common, **platform_items[system]} + + def check_package_shape(self) -> None: + required = [ + self.application, + self.runtime_root / "app" / "agentmain.py", + self.runtime_root / "app" / "frontends" / "desktop_bridge.py", + self.runtime_root / "app" / "frontends" / "desktop" / "static" / "index.html", + ] + python = self.runtime_root / "python" / ("python.exe" if self.args.platform == "windows" else "bin/python3") + required.append(python) + missing = [str(path) for path in required if not path.exists()] + if missing: + raise JourneyFailure(f"package paths are missing: {missing}") + source_package_json = self.runtime_root / "app" / "frontends" / "desktop" / "package.json" + if source_package_json.exists(): + raise JourneyFailure(f"runtime contains excluded Desktop source metadata: {source_package_json}") + if self.args.platform == "macos" and not (self.runtime_root / ".prepared").is_file(): + raise JourneyFailure("macOS package has no build-time .prepared marker") + if self.args.platform == "macos": + short_version, bundle_version = read_macos_bundle_versions(self.package_root) + self.report["checks"]["packagedVersion"] = short_version + self.report["checks"]["packagedBundleVersion"] = bundle_version + self.report["checks"]["packageShape"] = True + + def prepare_external_root(self) -> None: + if self.external_root.exists() or self.stale_root.exists(): + raise JourneyFailure(f"test work directory is not clean: {self.work_dir}") + shutil.copytree(self.runtime_root / "app", self.external_root, symlinks=True) + (self.external_root / "mykey.py").write_text(fake_mykey(self.fake.base_url), encoding="utf-8") + write_json( + self.settings_path, + {"lang": "en", "ga_source_override": str(self.external_root), "ui": {"llmNo": 0}}, + ) + + def scenario_dir(self, name: str) -> Path: + path = self.report_dir / "bootstrap" / name + path.mkdir(parents=True, exist_ok=True) + return path + + def start_application(self, scenario: str) -> None: + if self.process is not None: + raise JourneyFailure("application is already running") + if not loopback_port_is_free(self.conductor_port): + raise JourneyFailure( + f"isolated conductor port {self.conductor_port} is occupied before {scenario}" + ) + report = self.scenario_dir(scenario) + log_path = self.report_dir / "logs" / f"{scenario}.log" + log_path.parent.mkdir(parents=True, exist_ok=True) + self.process_log = log_path.open("wb") + env = os.environ.copy() + env["GA_DESKTOP_E2E_REPORT_DIR"] = str(report) + env[E2E_CONDUCTOR_PORT_ENV] = str(self.conductor_port) + self.process = subprocess.Popen( + [str(self.application)], + cwd=str(self.package_root), + env=env, + stdout=self.process_log, + stderr=subprocess.STDOUT, + ) + self.report["pids"].append({"scenario": scenario, "app": self.process.pid}) + + def stop_application(self) -> None: + process_record = self.report["pids"][-1] if self.report["pids"] else None + with contextlib.suppress(Exception): + request_json("POST", "/services/bridge/exit", {}, timeout=2) + if self.process is not None: + with contextlib.suppress(subprocess.TimeoutExpired): + self.process.terminate() + self.process.wait(timeout=8) + if self.process.poll() is None: + self.process.kill() + self.process.wait(timeout=5) + self.process = None + if self.process_log is not None: + self.process_log.close() + self.process_log = None + wait_until("bridge port cleanup", port_is_free, 20) + wait_until( + "isolated conductor port cleanup", + lambda: loopback_port_is_free(self.conductor_port), + 20, + ) + if process_record is not None: + owned = { + kind: int(pid) + for kind in ("app", "bridge", "conductor") + if isinstance((pid := process_record.get(kind)), int) + and not isinstance(pid, bool) + and pid > 0 + } + wait_until( + f"{process_record.get('scenario', 'application')} owned processes to exit", + lambda: all(not pid_is_alive(pid) for pid in owned.values()), + 20, + ) + self.report["checks"].setdefault("ownedProcessStops", {})[ + str(process_record.get("scenario", "application")) + ] = owned + + def wait_ready(self, scenario: str, expected_root: Path | None) -> dict[str, Any]: + latest = self.scenario_dir(scenario) / "bootstrap-latest.json" + + def ready_snapshot() -> dict[str, Any] | None: + value = read_json(latest, {}) + if value.get("phase") == "failed": + raise JourneyFailure(f"bootstrap failed in {scenario}: {value.get('failure')}") + return value if value.get("phase") == "ready" else None + + snapshot = wait_until(f"{scenario} bootstrap ready", ready_snapshot, self.args.start_timeout) + + def expected_identity() -> dict[str, Any] | None: + value = request_json("GET", "/services/identity", timeout=2) + if not value.get("ga_root") or not value.get("app_dir") or not value.get("pid"): + return None + if expected_root is not None and canonical(value["ga_root"]) != canonical(expected_root): + return None + return value + + identity = wait_until(f"{scenario} bridge identity", expected_identity, 30) + if is_within(identity["app_dir"], self.external_root): + raise JourneyFailure("desktop bridge came from external GA_ROOT instead of the package") + expected_app_dir = self.runtime_root / "app" / "frontends" + if canonical(identity["app_dir"]) != canonical(expected_app_dir): + raise JourneyFailure( + f"package bridge app_dir mismatch: {identity['app_dir']} != {expected_app_dir}" + ) + build_id = str(identity.get("build_id", "")) + expected = self.args.expected_commit.strip().lower() + if expected and expected[:7] not in build_id.lower(): + raise JourneyFailure(f"bridge build_id {build_id!r} does not contain commit {expected[:7]}") + self.report["bootstrap"][scenario] = snapshot + self.report["identities"][scenario] = identity + self.report["pids"][-1]["bridge"] = identity["pid"] + conductor = wait_until( + f"{scenario} owned isolated conductor", + lambda: verified_owned_conductor( + request_json("GET", "/services/panel", timeout=5), + self.conductor_port, + not loopback_port_is_free(self.conductor_port), + ), + 30, + 0.25, + ) + self.report["pids"][-1]["conductor"] = conductor["pid"] + ownership = self.report["checks"].setdefault("isolatedConductorOwnership", {}) + ownership[scenario] = conductor + return identity + + def run_chat_upload_memory(self) -> None: + session = request_json("POST", "/session/new", {"cwd": str(self.external_root)}) + sid = session.get("sessionId") + if not sid: + raise JourneyFailure(f"session creation failed: {session}") + tiny_png = base64.b64encode( + b"\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00\x01\x00\x00\x00\x01" + ).decode() + uploaded = request_json( + "POST", + "/upload", + {"name": "p2.png", "dataUrl": f"data:image/png;base64,{tiny_png}", "sid": sid}, + ) + upload_path = Path(str(uploaded.get("path", ""))) + if not uploaded.get("ok") or not upload_path.is_file() or not is_within(upload_path, self.external_root): + raise JourneyFailure(f"package upload did not stay under GA_ROOT: {uploaded}") + accepted = request_json( + "POST", + f"/session/{sid}/prompt", + {"prompt": "[E2E:normal] release package smoke", "display": "release package smoke"}, + ) + if not accepted.get("ok"): + raise JourneyFailure(f"chat prompt was rejected: {accepted}") + + def assistant_reply() -> str | None: + value = request_json("GET", f"/session/{sid}/messages?limit=20", timeout=3) + return completed_assistant_reply(value) + + wait_until("deterministic package chat reply", assistant_reply, 90, 0.5) + if not self.fake.transcript: + raise JourneyFailure("fake model received no request") + + source = self.work_dir / "memory import source" + source_memory = source / "memory" + source_responses = source / "temp" / "model_responses" + source_sessions = source / "temp" / "desktop_sessions" + destination_memory = self.external_root / "memory" + destination_responses = self.external_root / "temp" / "model_responses" + for directory in (source_memory, source_responses, source_sessions, destination_memory, destination_responses): + directory.mkdir(parents=True, exist_ok=True) + (destination_memory / "p2-package-memory.txt").write_text("before\n", encoding="utf-8") + (source_memory / "p2-package-memory.txt").write_text("after\n", encoding="utf-8") + (destination_responses / "shared.json").write_text("destination\n", encoding="utf-8") + (source_responses / "shared.json").write_text("source-must-not-win\n", encoding="utf-8") + (source_responses / "new.json").write_text("new\n", encoding="utf-8") + current_session_file = self.external_root / "temp" / "desktop_sessions" / f"{sid}.json" + wait_until("persisted package session", current_session_file.is_file, 10) + shutil.copy2(current_session_file, source_sessions / current_session_file.name) + imported_sid = "sess-p2-package-imported" + write_json( + source_sessions / f"{imported_sid}.json", + { + "id": imported_sid, + "title": "Qualification imported", + "messages": [], + "msg_seq": 0, + "cwd": str(source), + "created_at": time.time(), + "updated_at": time.time(), + }, + ) + imported_session_file = self.external_root / "temp" / "desktop_sessions" / f"{imported_sid}.json" + backup_parent = self.external_root / "temp" + + def import_target_snapshot() -> dict[str, Any]: + files: dict[str, bytes] = {} + for data_root in ( + destination_memory, + destination_responses, + self.external_root / "temp" / "desktop_sessions", + ): + if not data_root.exists(): + continue + for path in sorted(data_root.rglob("*")): + if path.is_file() and not path.is_symlink(): + files[path.relative_to(self.external_root).as_posix()] = path.read_bytes() + return { + "files": files, + "importedSessionExists": imported_session_file.exists(), + "backupDirectories": sorted( + path.name for path in backup_parent.glob("memory_import_backup_*") + ), + } + + before_conflict = import_target_snapshot() + conflict_status, conflict_payload = request_json_with_status( + "POST", + "/memory/import", + {"sourceDir": str(source)}, + timeout=20, + ) + running_extras = validate_import_maintenance_conflict(conflict_status, conflict_payload) + if import_target_snapshot() != before_conflict: + raise JourneyFailure("rejected memory import changed target data") + + stopped = request_json("POST", "/services/stop-extras", {}, timeout=20) + if not isinstance(stopped, dict) or stopped.get("ok") is not True: + raise JourneyFailure(f"managed extras stop request failed: {stopped}") + + def stopped_extras_panel() -> dict[str, Any] | None: + panel = request_json("GET", "/services/panel", timeout=5) + return verified_stopped_extras_panel(panel, running_extras) + + stopped_panel = wait_until( + "managed extras to stop before memory import", + stopped_extras_panel, + 30, + 0.25, + ) + result = request_json("POST", "/memory/import", {"sourceDir": str(source)}, timeout=20) + required_fields = { + "memoryCopied", + "responsesCopied", + "responsesSkipped", + "sessionsAdded", + "backupDir", + } + if not result.get("ok") or not required_fields.issubset(result): + raise JourneyFailure(f"memory import response contract failed: {result}") + backup_file = Path(result["backupDir"]) / "memory" / "p2-package-memory.txt" + if backup_file.read_text(encoding="utf-8") != "before\n": + raise JourneyFailure("memory import did not preserve the pre-import backup") + if (destination_memory / "p2-package-memory.txt").read_text(encoding="utf-8") != "after\n": + raise JourneyFailure("memory import did not overwrite memory") + if (destination_responses / "shared.json").read_text(encoding="utf-8") != "destination\n": + raise JourneyFailure("memory import overwrote an existing response") + if not (destination_responses / "new.json").is_file() or result["sessionsAdded"] != 1: + raise JourneyFailure(f"memory response/session merge failed: {result}") + self.report["checks"].update( + { + "deterministicChat": True, + "uploadUnderExternalRoot": True, + "memoryImportMaintenanceGate": { + "code": conflict_payload["code"], + "runningSessions": conflict_payload["runningSessions"], + "runningExtras": running_extras, + "stoppedPanel": stopped_panel, + }, + "memoryImport": result, + "fakeModelRequests": self.fake.transcript, + } + ) + + def run_port_conflict(self) -> None: + if not port_is_free(): + raise JourneyFailure("bridge port was not released before foreign-port test") + self.foreign_server = http.server.ThreadingHTTPServer( + (BRIDGE_HOST, BRIDGE_PORT), ForeignIdentityHandler + ) + self.foreign_thread = threading.Thread(target=self.foreign_server.serve_forever, daemon=True) + self.foreign_thread.start() + self.start_application("foreign-port") + latest = self.scenario_dir("foreign-port") / "bootstrap-latest.json" + + def failed_snapshot() -> dict[str, Any] | None: + value = read_json(latest, {}) + return value if value.get("phase") == "failed" else None + + failed = wait_until("foreign port bootstrap failure", failed_snapshot, 90) + if failed.get("failure", {}).get("code") != "port_conflict": + raise JourneyFailure(f"foreign port produced the wrong failure: {failed}") + if self.foreign_thread is None or not self.foreign_thread.is_alive(): + raise JourneyFailure("desktop terminated the foreign listener") + self.report["bootstrap"]["foreign-port"] = failed + self.report["checks"]["foreignListenerSurvived"] = True + screenshot = self.report_dir / "screenshots" / "foreign-port.png" + if capture_screenshot(screenshot): + self.screenshots.append(str(screenshot)) + if self.process is not None: + self.process.terminate() + with contextlib.suppress(subprocess.TimeoutExpired): + self.process.wait(timeout=8) + if self.process.poll() is None: + self.process.kill() + self.process = None + if self.process_log is not None: + self.process_log.close() + self.process_log = None + self.foreign_server.shutdown() + self.foreign_server.server_close() + self.foreign_server = None + if self.foreign_thread: + self.foreign_thread.join(timeout=5) + self.foreign_thread = None + wait_until("foreign port release", port_is_free, 10) + self.start_application("after-port-release") + self.wait_ready("after-port-release", self.external_root) + self.report["checks"]["portRecovery"] = "release-then-production-restart" + + def relocate_package(self) -> None: + self.stop_application() + destination = canonical(self.args.relocated_root) + if destination.exists(): + raise JourneyFailure(f"relocation target already exists: {destination}") + destination.parent.mkdir(parents=True, exist_ok=True) + shutil.move(str(self.package_root), str(destination)) + self.package_root = destination + self.application = destination / self.application_relative + self.runtime_root = destination / self.runtime_relative + self.report["paths"]["after"] = str(destination) + self.start_application("relocated") + identity = self.wait_ready("relocated", self.external_root) + if not is_within(identity["app_dir"], destination): + raise JourneyFailure("relocated package still reported the previous package path") + self.report["checks"]["relocation"] = True + + def stale_override_fallback(self) -> None: + self.stop_application() + self.external_root.rename(self.stale_root) + self.start_application("stale-override") + identity = self.wait_ready("stale-override", None) + if canonical(identity["ga_root"]) == canonical(self.external_root): + raise JourneyFailure("deleted GA_ROOT override did not fall back") + fallback = canonical(identity["ga_root"]) + if not (fallback / "agentmain.py").is_file(): + raise JourneyFailure(f"fallback GA_ROOT is not a usable core: {fallback}") + panel = request_json("GET", "/services/panel", timeout=5) + if "services" not in panel: + raise JourneyFailure(f"service panel failed with optional P2P dependencies absent: {panel}") + self.report["checks"]["staleOverrideFallback"] = str(fallback) + self.report["checks"]["optionalP2PDoesNotBlockReady"] = True + + def restore_settings(self) -> None: + if self.settings_existed: + self.settings_path.write_bytes(self.settings_bytes) + if self.settings_mode is not None: + os.chmod(self.settings_path, self.settings_mode) + else: + with contextlib.suppress(FileNotFoundError): + self.settings_path.unlink() + + def cleanup(self) -> None: + with contextlib.suppress(Exception): + self.stop_application() + with contextlib.suppress(Exception): + if self.foreign_server is not None: + self.foreign_server.shutdown() + self.foreign_server.server_close() + with contextlib.suppress(Exception): + if self.foreign_thread is not None: + self.foreign_thread.join(timeout=5) + with contextlib.suppress(Exception): + self.fake.stop() + with contextlib.suppress(Exception): + if self.stale_root.exists() and not self.external_root.exists(): + self.stale_root.rename(self.external_root) + self.restore_settings() + self.report["checks"]["settingsRestored"] = ( + self.settings_path.read_bytes() == self.settings_bytes + if self.settings_existed + else not self.settings_path.exists() + ) + self.report["checks"]["finalPortFree"] = port_is_free() + self.report["checks"]["finalConductorPortFree"] = loopback_port_is_free( + self.conductor_port + ) + self.report["checks"]["defaultConductorPortPreserved"] = ( + loopback_port_is_free(DEFAULT_CONDUCTOR_PORT) + == self.default_conductor_port_initially_free + ) + owned_pids = { + int(pid) + for item in self.report["pids"] + for pid in (item.get("app"), item.get("bridge"), item.get("conductor")) + if isinstance(pid, int) and pid > 0 + } + deadline = time.monotonic() + 10 + while any(pid_is_alive(pid) for pid in owned_pids) and time.monotonic() < deadline: + time.sleep(0.2) + alive_pids = sorted(pid for pid in owned_pids if pid_is_alive(pid)) + self.report["checks"]["finalAliveOwnedPids"] = alive_pids + self.report["checks"]["finalOwnedProcessesExited"] = not alive_pids + + def save_report(self, success: bool) -> None: + self.report["success"] = success + self.report["manualComplete"] = all( + value == "pass" for value in self.report["manualChecklist"].values() + ) + self.report["completedAt"] = utc_now() + write_json(self.report_dir / "real-package-report.json", self.report) + + def run(self) -> None: + if not self.args.allow_user_settings_mutation: + raise JourneyFailure("pass --allow-user-settings-mutation in a dedicated OS test account") + if not port_is_free(): + raise JourneyFailure(f"{BRIDGE_HOST}:{BRIDGE_PORT} is already occupied before the test") + if not is_within(self.package_root, self.work_dir.parent) and not self.args.allow_external_package: + raise JourneyFailure("package root must be inside the test work area") + self.report_dir.mkdir(parents=True, exist_ok=True) + self.work_dir.mkdir(parents=True, exist_ok=True) + if self.args.artifact: + artifact = canonical(self.args.artifact) + self.report["artifact"] = { + "path": str(artifact), + "sha256": sha256(artifact), + "size": artifact.stat().st_size, + } + self.check_package_shape() + self.fake.start() + self.prepare_external_root() + if self.args.platform == "macos": + self.app_snapshot = tree_snapshot(self.package_root) + + self.start_application("first-launch") + self.wait_ready("first-launch", self.external_root) + ready_shot = self.report_dir / "screenshots" / "ready.png" + if capture_screenshot(ready_shot): + self.screenshots.append(str(ready_shot)) + self.run_chat_upload_memory() + + self.stop_application() + self.start_application("warm-restart") + self.wait_ready("warm-restart", self.external_root) + self.report["checks"]["warmRestart"] = True + + self.stop_application() + self.run_port_conflict() + self.relocate_package() + self.stale_override_fallback() + + if self.args.platform == "macos" and self.app_snapshot is not None: + after_snapshot = tree_snapshot(self.package_root) + if after_snapshot != self.app_snapshot: + changed = sorted(set(after_snapshot) ^ set(self.app_snapshot)) + changed += sorted( + key + for key in set(after_snapshot) & set(self.app_snapshot) + if after_snapshot[key] != self.app_snapshot[key] + ) + raise JourneyFailure(f"first launch modified the signed .app: {changed[:20]}") + self.report["checks"]["macAppImmutable"] = True + + +def parse_args() -> argparse.Namespace: + parser = argparse.ArgumentParser() + parser.add_argument("--platform", choices=("windows", "linux", "macos"), required=True) + parser.add_argument("--artifact", default="") + parser.add_argument("--expected-commit", required=True) + parser.add_argument("--package-root", required=True) + parser.add_argument("--application-relative", required=True) + parser.add_argument("--runtime-relative", required=True) + parser.add_argument("--relocated-root", required=True) + parser.add_argument("--report-dir", required=True) + parser.add_argument("--work-dir", required=True) + parser.add_argument("--start-timeout", type=float, default=300) + parser.add_argument("--allow-user-settings-mutation", action="store_true") + parser.add_argument("--allow-external-package", action="store_true") + return parser.parse_args() + + +def main() -> int: + args = parse_args() + journey = Journey(args) + success = False + try: + journey.run() + success = True + return 0 + except BaseException as error: # retain evidence for assertion and unexpected failures + journey.report["failures"].append(f"{type(error).__name__}: {error}") + print(f"release qualification failed: {error}", file=sys.stderr) + return 1 + finally: + with contextlib.suppress(BaseException): + journey.cleanup() + journey.save_report( + success + and journey.report["checks"].get("finalPortFree", False) + and journey.report["checks"].get("finalConductorPortFree", False) + and journey.report["checks"].get("defaultConductorPortPreserved", False) + ) + print(journey.report_dir / "real-package-report.json") + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/frontends/desktop/release_qualification/verify_release_evidence.py b/frontends/desktop/release_qualification/verify_release_evidence.py new file mode 100644 index 000000000..b3d42d620 --- /dev/null +++ b/frontends/desktop/release_qualification/verify_release_evidence.py @@ -0,0 +1,181 @@ +#!/usr/bin/env python3 +"""Combine three package reports and enforce the automated release evidence gate.""" + +from __future__ import annotations + +import argparse +import json +import sys +from pathlib import Path +from typing import Any + + +COMMON_CHECKS = ( + "packageShape", + "deterministicChat", + "uploadUnderExternalRoot", + "isolatedConductorOwnership", + "memoryImport", + "warmRestart", + "foreignListenerSurvived", + "portRecovery", + "relocation", + "staleOverrideFallback", + "optionalP2PDoesNotBlockReady", + "settingsRestored", + "finalPortFree", + "finalConductorPortFree", + "defaultConductorPortPreserved", + "ownedProcessStops", + "finalOwnedProcessesExited", +) + +SUCCESSFUL_APPLICATION_SCENARIOS = { + "first-launch", + "warm-restart", + "after-port-release", + "relocated", + "stale-override", +} + + +def load(path: str) -> dict[str, Any]: + target = Path(path).expanduser().resolve() + try: + value = json.loads(target.read_text(encoding="utf-8")) + except (OSError, json.JSONDecodeError) as error: + raise ValueError(f"cannot read {target}: {error}") from error + if not isinstance(value, dict): + raise ValueError(f"report is not an object: {target}") + value["_path"] = str(target) + return value + + +def assert_report(name: str, report: dict[str, Any], expected_commit: str) -> list[str]: + failures: list[str] = [] + actual_commit = str(report.get("expectedCommit", "")).lower() + if actual_commit != expected_commit.lower(): + failures.append(f"{name}: commit {actual_commit!r} != {expected_commit!r}") + if report.get("releaseVersion") != "0.2.0": + failures.append(f"{name}: release version is not 0.2.0") + if report.get("success") is not True: + failures.append(f"{name}: automated qualification did not pass") + if not str(report.get("artifact", {}).get("sha256", "")): + failures.append(f"{name}: artifact SHA-256 is missing") + checks = report.get("checks", {}) + for check in COMMON_CHECKS: + if not checks.get(check): + failures.append(f"{name}: required check {check} did not pass") + environment = report.get("environment") + isolated_port = ( + environment.get("isolatedConductorPort") if isinstance(environment, dict) else None + ) + if ( + not isinstance(isolated_port, int) + or isinstance(isolated_port, bool) + or not 1 <= isolated_port <= 65535 + or isolated_port in {8900, 14168} + ): + failures.append(f"{name}: isolated conductor port is missing or invalid") + ownership = checks.get("isolatedConductorOwnership") + if not isinstance(ownership, dict) or set(ownership) != SUCCESSFUL_APPLICATION_SCENARIOS: + failures.append(f"{name}: conductor ownership does not cover every successful launch") + elif isinstance(isolated_port, int): + for scenario, state in ownership.items(): + pid = state.get("pid") if isinstance(state, dict) else None + if ( + not isinstance(state, dict) + or state.get("status") != "running" + or state.get("running") is not True + or state.get("owned") is not True + or state.get("external") is not False + or state.get("port") != isolated_port + or not isinstance(pid, int) + or isinstance(pid, bool) + or pid <= 0 + ): + failures.append(f"{name}: invalid conductor ownership evidence for {scenario}") + stops = checks.get("ownedProcessStops") + if not isinstance(stops, dict) or set(stops) != SUCCESSFUL_APPLICATION_SCENARIOS: + failures.append(f"{name}: owned process stops do not cover every successful launch") + else: + for scenario, pids in stops.items(): + expected_conductor_pid = ( + ownership.get(scenario, {}).get("pid") if isinstance(ownership, dict) else None + ) + if ( + not isinstance(pids, dict) + or set(pids) != {"app", "bridge", "conductor"} + or any( + not isinstance(pid, int) or isinstance(pid, bool) or pid <= 0 + for pid in pids.values() + ) + or len(set(pids.values())) != 3 + or pids.get("conductor") != expected_conductor_pid + ): + failures.append(f"{name}: invalid owned process stop evidence for {scenario}") + if name == "macos" and checks.get("macAppImmutable") is not True: + failures.append("macos: signed .app immutability did not pass") + required_bootstrap = SUCCESSFUL_APPLICATION_SCENARIOS | {"foreign-port"} + missing_bootstrap = sorted(required_bootstrap - set(report.get("bootstrap", {}))) + if missing_bootstrap: + failures.append(f"{name}: missing bootstrap evidence {missing_bootstrap}") + return failures + + +def main() -> int: + parser = argparse.ArgumentParser() + parser.add_argument("--expected-commit", required=True) + parser.add_argument("--windows", required=True) + parser.add_argument("--linux", required=True) + parser.add_argument("--macos", required=True) + parser.add_argument("--windows-native-report", required=True) + parser.add_argument("--output", required=True) + args = parser.parse_args() + + reports = { + "windows": load(args.windows), + "linux": load(args.linux), + "macos": load(args.macos), + } + failures: list[str] = [] + for name, report in reports.items(): + failures.extend(assert_report(name, report, args.expected_commit)) + + windows_native = load(args.windows_native_report) + if windows_native.get("success") is not True: + failures.append("windows native wrapper did not pass") + if windows_native.get("checks", {}).get("portConflictRecovery") is not True: + failures.append("windows native retry path did not pass") + if windows_native.get("checks", {}).get("settingsRestored") is not True: + failures.append("windows native wrapper did not restore the original settings file") + manifest = { + "schemaVersion": 1, + "candidateCommit": args.expected_commit, + "releaseVersion": "0.2.0", + "platforms": { + name: { + "report": report["_path"], + "artifactSha256": report.get("artifact", {}).get("sha256"), + "environment": report.get("environment"), + "success": report.get("success"), + } + for name, report in reports.items() + }, + "windowsNativeReport": windows_native["_path"], + "gate": "pass" if not failures else "fail", + "failures": failures, + } + output = Path(args.output).expanduser().resolve() + output.parent.mkdir(parents=True, exist_ok=True) + output.write_text(json.dumps(manifest, ensure_ascii=False, indent=2) + "\n", encoding="utf-8") + if failures: + for failure in failures: + print(f"FAIL: {failure}", file=sys.stderr) + return 1 + print(output) + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/frontends/desktop/release_qualification/windows/Invoke-WindowsReleaseQualification.ps1 b/frontends/desktop/release_qualification/windows/Invoke-WindowsReleaseQualification.ps1 new file mode 100644 index 000000000..f50afaca0 --- /dev/null +++ b/frontends/desktop/release_qualification/windows/Invoke-WindowsReleaseQualification.ps1 @@ -0,0 +1,661 @@ +[CmdletBinding()] +param( + [string]$Repo = "abraxas914/GenericAgent", + [Parameter(Mandatory = $true)] + [string]$RunId, + [string]$ExpectedCommit = "", + [string]$PackageZip = "", + [string]$WorkDir = "", + [ValidateSet("Full", "Smoke", "FailureOnly")] + [string]$Mode = "Full", + [switch]$KeepWorkDir +) + +$ErrorActionPreference = "Stop" +Set-StrictMode -Version 2.0 + +if (-not $WorkDir) { + $WorkDir = Join-Path $env:TEMP ("ga-desktop-release-qualification\run-" + $RunId) +} + +$ScriptRoot = Split-Path -Parent $MyInvocation.MyCommand.Path +$WorkDir = [System.IO.Path]::GetFullPath($WorkDir) +$DownloadDir = Join-Path $WorkDir "download" +$ExtractDir = Join-Path $WorkDir "app" +$ReportDir = Join-Path $WorkDir "report" +$ScreensDir = Join-Path $ReportDir "screenshots" +$ReportPath = Join-Path $ReportDir "e2e-report.json" +$RunSucceeded = $false +$PortWasFreeAtStart = $false +$UserHome = [Environment]::GetFolderPath([Environment+SpecialFolder]::UserProfile) +$SettingsPath = Join-Path $UserHome ".ga_desktop_settings.json" +$SettingsExisted = Test-Path -LiteralPath $SettingsPath +[byte[]]$SettingsBackupBytes = @() +$SettingsAttributes = $null +if ($SettingsExisted) { + $SettingsBackupBytes = [System.IO.File]::ReadAllBytes($SettingsPath) + $SettingsAttributes = [System.IO.File]::GetAttributes($SettingsPath) +} + +$Report = [ordered]@{ + repo = $Repo + runId = $RunId + expectedCommit = $ExpectedCommit + mode = $Mode + package = [ordered]@{} + environment = [ordered]@{} + checks = [ordered]@{} + screenshots = @() + manualChecklist = [ordered]@{ + windowsTitlebarVisible = "manual" + exactlyThreeWindowButtons = "manual" + titlebarBlankAreaDrags = "manual" + buttonAreaDoesNotDrag = "manual" + minimizeWorks = "manual" + maximizeRestoreWorks = "manual" + closeHidesToTray = "manual" + sidebarNavHasNoBlankRow = "manual" + nativeDirectoryPicker = "manual" + shortcutSelfHealsAfterMove = "manual" + loadingFallbackAndMainRender = "manual" + } + failures = @() + startedAt = (Get-Date).ToUniversalTime().ToString("o") +} + +function Write-Step([string]$Message) { + Write-Host "" + Write-Host "==> $Message" +} + +function Add-Failure([string]$Message) { + $script:Report.failures += $Message +} + +function Save-Report { + $script:Report.completedAt = (Get-Date).ToUniversalTime().ToString("o") + $json = $script:Report | ConvertTo-Json -Depth 12 + [System.IO.Directory]::CreateDirectory($ReportDir) | Out-Null + [System.IO.File]::WriteAllText($ReportPath, $json, [System.Text.UTF8Encoding]::new($false)) +} + +function Fail([string]$Message) { + Add-Failure $Message + Save-Report + throw $Message +} + +function Ensure-Dir([string]$Path) { + [System.IO.Directory]::CreateDirectory($Path) | Out-Null +} + +function Test-Command([string]$Name) { + $cmd = Get-Command $Name -ErrorAction SilentlyContinue + return $null -ne $cmd +} + +function Normalize-Commit([string]$Commit) { + return ($Commit -replace "\s", "").ToLowerInvariant() +} + +function Test-CommitMatches([string]$Actual, [string]$Expected) { + if (-not $Expected) { return $true } + $actualNorm = Normalize-Commit $Actual + $expectedNorm = Normalize-Commit $Expected + return $actualNorm.StartsWith($expectedNorm) -or $expectedNorm.StartsWith($actualNorm) +} + +function Get-RunMetadata { + if (-not (Test-Command "gh")) { + Fail "GitHub CLI 'gh' is required when -PackageZip is not enough to skip run metadata." + } + $json = & gh run view $RunId --repo $Repo --json headSha,status,conclusion,event,name 2>&1 + if ($LASTEXITCODE -ne 0) { + Fail "gh run view failed: $json" + } + $meta = ($json | Out-String) | ConvertFrom-Json + $script:Report.run = $meta + if ($ExpectedCommit -and -not (Test-CommitMatches $meta.headSha $ExpectedCommit)) { + Fail "Run headSha $($meta.headSha) does not match expected commit $ExpectedCommit" + } + return $meta +} + +function Resolve-PackageZip { + Ensure-Dir $DownloadDir + if ($PackageZip) { + $zipPath = [System.IO.Path]::GetFullPath($PackageZip) + if (-not (Test-Path -LiteralPath $zipPath)) { + Fail "Package zip not found: $zipPath" + } + return $zipPath + } + + if (-not (Test-Command "gh")) { + Fail "GitHub CLI 'gh' is required to download artifacts." + } + + Write-Step "Download GitHub Actions artifact" + $downloadOutput = & gh run download $RunId --repo $Repo --dir $DownloadDir 2>&1 + if ($LASTEXITCODE -ne 0) { + Fail "gh run download failed: $downloadOutput" + } + + $zips = @(Get-ChildItem -LiteralPath $DownloadDir -Recurse -Filter "GenericAgent-Desktop-Windows-Portable.zip") + if ($zips.Count -ne 1) { + Fail "Expected exactly one GenericAgent-Desktop-Windows-Portable.zip under $DownloadDir, found $($zips.Count)" + } + return $zips[0].FullName +} + +function Test-Sha256([string]$ZipPath) { + Write-Step "Verify SHA-256" + $hash = (Get-FileHash -LiteralPath $ZipPath -Algorithm SHA256).Hash.ToLowerInvariant() + $shaFile = $ZipPath + ".sha256" + if (-not (Test-Path -LiteralPath $shaFile)) { + $matches = @(Get-ChildItem -LiteralPath (Split-Path -Parent $ZipPath) -Recurse -File | Where-Object { + $_.Name -like "*.sha256" -or $_.Name -like "SHA256SUMS*.txt" + }) + if ($matches.Count -eq 1) { + $shaFile = $matches[0].FullName + } + } + if (Test-Path -LiteralPath $shaFile) { + $expectedText = [System.IO.File]::ReadAllText($shaFile) + $expectedHash = ([regex]::Match($expectedText, "[A-Fa-f0-9]{64}")).Value.ToLowerInvariant() + if (-not $expectedHash) { + Fail "Could not parse SHA-256 from $shaFile" + } + if ($hash -ne $expectedHash) { + Fail "SHA-256 mismatch. actual=$hash expected=$expectedHash" + } + $script:Report.package.sha256File = $shaFile + $script:Report.package.expectedSha256 = $expectedHash + } else { + Fail "SHA-256 sidecar not found next to $ZipPath" + } + $script:Report.package.sha256 = $hash +} + +function Expand-Package([string]$ZipPath) { + Write-Step "Extract package" + if (Test-Path -LiteralPath $ExtractDir) { + Remove-Item -LiteralPath $ExtractDir -Recurse -Force + } + Ensure-Dir $ExtractDir + Expand-Archive -LiteralPath $ZipPath -DestinationPath $ExtractDir -Force + + $packageRoot = Join-Path $ExtractDir "GenericAgent-Desktop-Windows-Portable" + if (-not (Test-Path -LiteralPath $packageRoot)) { + $dirs = @(Get-ChildItem -LiteralPath $ExtractDir -Directory) + if ($dirs.Count -eq 1) { + $packageRoot = $dirs[0].FullName + } + } + if (-not (Test-Path -LiteralPath $packageRoot)) { + Fail "Could not find extracted package root under $ExtractDir" + } + return [System.IO.Path]::GetFullPath($packageRoot) +} + +function Assert-PackageShape([string]$PackageRoot) { + Write-Step "Validate package structure" + $required = @( + "GenericAgent.exe", + "runtime\install_windows.ps1", + "runtime\wheels", + "runtime\python", + "runtime\app\frontends\desktop_bridge.py" + ) + foreach ($rel in $required) { + $path = Join-Path $PackageRoot $rel + if (-not (Test-Path -LiteralPath $path)) { + Fail "Package is missing required path: $rel" + } + } + $script:Report.package.root = $PackageRoot + $script:Report.package.exe = Join-Path $PackageRoot "GenericAgent.exe" + $script:Report.package.form = "windows-portable-zip" +} + +function Get-WindowsEnvironment { + $os = Get-CimInstance Win32_OperatingSystem + $cpu = Get-CimInstance Win32_Processor | Select-Object -First 1 + $arch = if ($env:PROCESSOR_ARCHITECTURE) { $env:PROCESSOR_ARCHITECTURE } else { [System.Runtime.InteropServices.RuntimeInformation]::OSArchitecture.ToString() } + return [ordered]@{ + caption = $os.Caption + version = $os.Version + buildNumber = $os.BuildNumber + architecture = $arch + cpu = $cpu.Name + userInteractive = [Environment]::UserInteractive + webView2Installed = Test-WebView2Installed + } +} + +function Test-WebView2Installed { + $keys = @( + "HKLM:\SOFTWARE\WOW6432Node\Microsoft\EdgeUpdate\Clients\{F3017226-FE2A-4295-8BDF-00C3A9A7E4C5}", + "HKLM:\SOFTWARE\Microsoft\EdgeUpdate\Clients\{F3017226-FE2A-4295-8BDF-00C3A9A7E4C5}", + "HKCU:\SOFTWARE\Microsoft\EdgeUpdate\Clients\{F3017226-FE2A-4295-8BDF-00C3A9A7E4C5}" + ) + foreach ($key in $keys) { + if (Test-Path $key) { return $true } + } + return $false +} + +function Get-PortState { + try { + $connections = @(Get-NetTCPConnection -LocalAddress "127.0.0.1" -LocalPort 14168 -ErrorAction SilentlyContinue) + return @($connections | Select-Object LocalAddress, LocalPort, State, OwningProcess) + } catch { + return @() + } +} + +function Get-GaProcesses { + return @(Get-Process | Where-Object { + $_.ProcessName -like "GenericAgent*" -or $_.ProcessName -like "ga-desktop*" -or $_.ProcessName -like "python*" + } | Select-Object ProcessName, Id, Path) +} + +function Stop-ProcessTreeSafe([int]$ProcessId) { + try { + Stop-Process -Id $ProcessId -Force -ErrorAction SilentlyContinue + } catch {} +} + +function Capture-Screenshot([string]$Name) { + Ensure-Dir $ScreensDir + $path = Join-Path $ScreensDir $Name + try { + Add-Type -AssemblyName System.Windows.Forms + Add-Type -AssemblyName System.Drawing + $bounds = [System.Windows.Forms.Screen]::PrimaryScreen.Bounds + $bitmap = [System.Drawing.Bitmap]::new($bounds.Width, $bounds.Height) + $graphics = [System.Drawing.Graphics]::FromImage($bitmap) + $graphics.CopyFromScreen($bounds.Location, [System.Drawing.Point]::Empty, $bounds.Size) + $bitmap.Save($path, [System.Drawing.Imaging.ImageFormat]::Png) + $graphics.Dispose() + $bitmap.Dispose() + $script:Report.screenshots += $path + return $path + } catch { + Add-Failure "Screenshot failed for ${Name}: $($_.Exception.Message)" + return $null + } +} + +function Wait-ForBootstrapPhase( + [string]$ReportDirectory, + [string]$Phase, + [int]$TimeoutSeconds, + [int]$AfterSequence = 0 +) { + $latest = Join-Path $ReportDirectory "bootstrap-latest.json" + $deadline = (Get-Date).AddSeconds($TimeoutSeconds) + while ((Get-Date) -lt $deadline) { + if (Test-Path -LiteralPath $latest) { + try { + $snapshot = [System.IO.File]::ReadAllText($latest) | ConvertFrom-Json + if ([int]$snapshot.seq -le $AfterSequence) { + Start-Sleep -Milliseconds 500 + continue + } + if ($snapshot.phase -eq $Phase) { + return $snapshot + } + if ($Phase -ne "failed" -and $snapshot.phase -eq "failed") { + return $snapshot + } + } catch {} + } + Start-Sleep -Milliseconds 500 + } + return $null +} + +function Wait-ForBootstrapAnyPhase([string]$ReportDirectory, [string[]]$Phases, [int]$TimeoutSeconds) { + $latest = Join-Path $ReportDirectory "bootstrap-latest.json" + $deadline = (Get-Date).AddSeconds($TimeoutSeconds) + while ((Get-Date) -lt $deadline) { + if (Test-Path -LiteralPath $latest) { + try { + $snapshot = [System.IO.File]::ReadAllText($latest) | ConvertFrom-Json + if ($Phases -contains [string]$snapshot.phase) { + return $snapshot + } + } catch {} + } + Start-Sleep -Milliseconds 500 + } + return $null +} + +function Wait-ForBridgeIdentity([string]$ExpectedRoot, [int]$TimeoutSeconds) { + $deadline = (Get-Date).AddSeconds($TimeoutSeconds) + while ((Get-Date) -lt $deadline) { + try { + $identity = Invoke-RestMethod -Uri "http://127.0.0.1:14168/services/identity" -TimeoutSec 2 + if ($identity.ga_root) { + $reported = [System.IO.Path]::GetFullPath([string]$identity.ga_root).TrimEnd('\') + $expected = [System.IO.Path]::GetFullPath($ExpectedRoot).TrimEnd('\') + if ($reported.Equals($expected, [System.StringComparison]::OrdinalIgnoreCase)) { + return $identity + } + } + } catch {} + Start-Sleep -Milliseconds 700 + } + return $null +} + +function Start-GenericAgent([string]$PackageRoot, [string]$Scenario) { + $exe = Join-Path $PackageRoot "GenericAgent.exe" + $scenarioReportDir = Join-Path $ReportDir $Scenario + Ensure-Dir $scenarioReportDir + $env:GA_DESKTOP_E2E_REPORT_DIR = $scenarioReportDir + try { + return Start-Process -FilePath $exe -WorkingDirectory $PackageRoot -PassThru + } finally { + Remove-Item Env:\GA_DESKTOP_E2E_REPORT_DIR -ErrorAction SilentlyContinue + } +} + +function Stop-GenericAgent { + foreach ($proc in @(Get-Process GenericAgent -ErrorAction SilentlyContinue)) { + Stop-Process -Id $proc.Id -Force -ErrorAction SilentlyContinue + } + foreach ($proc in @(Get-Process ga-desktop -ErrorAction SilentlyContinue)) { + Stop-Process -Id $proc.Id -Force -ErrorAction SilentlyContinue + } +} + +function Stop-BridgeOnPort { + foreach ($conn in @(Get-PortState)) { + if ($conn.OwningProcess) { + try { + $proc = Get-Process -Id $conn.OwningProcess -ErrorAction Stop + if ($proc.ProcessName -like "python*" -or $proc.ProcessName -like "GenericAgent*" -or $proc.ProcessName -like "ga-desktop*") { + Stop-Process -Id $proc.Id -Force -ErrorAction SilentlyContinue + } + } catch {} + } + } +} + +function Invoke-FreshLaunch([string]$PackageRoot) { + Write-Step "Fresh launch and first-run prepare" + $marker = Join-Path $PackageRoot "runtime\.prepared" + if (Test-Path -LiteralPath $marker) { + Fail "Fresh package already has runtime\\.prepared before launch" + } + + $proc = Start-GenericAgent $PackageRoot "fresh" + $script:Report.checks.freshProcessId = $proc.Id + Start-Sleep -Seconds 2 + Capture-Screenshot "loading-first.png" | Out-Null + $prepSnapshot = Wait-ForBootstrapAnyPhase (Join-Path $ReportDir "fresh") @("preparing", "ready", "failed") 30 + if ($prepSnapshot -and $prepSnapshot.phase -eq "preparing") { + Capture-Screenshot "preparing.png" | Out-Null + } else { + $prepPhase = if ($prepSnapshot) { [string]$prepSnapshot.phase } else { "unavailable" } + $script:Report.checks.preparingScreenshot = "not captured; phase was $prepPhase" + } + + $snapshot = Wait-ForBootstrapPhase (Join-Path $ReportDir "fresh") "ready" 240 + if (-not $snapshot -or $snapshot.phase -ne "ready") { + Capture-Screenshot "fresh-failed.png" | Out-Null + Fail "Fresh launch did not reach bootstrap ready" + } + + if (-not (Test-Path -LiteralPath $marker)) { + Fail "Fresh launch reached ready but runtime\\.prepared was not created" + } + $identity = Wait-ForBridgeIdentity (Join-Path $PackageRoot "runtime\app") 30 + if (-not $identity) { + Fail "Bridge identity did not match extracted runtime app" + } + Capture-Screenshot "main-ready.png" | Out-Null + $script:Report.checks.freshReady = $true + $script:Report.checks.bridgeIdentity = $identity +} + +function Start-ForeignPortListener { + Write-Step "Start unknown foreign listener on 127.0.0.1:14168" + $ready = Join-Path $WorkDir "foreign-listener.ready" + Remove-Item -LiteralPath $ready -Force -ErrorAction SilentlyContinue + $fixture = Join-Path $ScriptRoot "fixtures\foreign-port-listener.ps1" + $proc = Start-Process -FilePath "powershell.exe" -ArgumentList @( + "-NoProfile", + "-ExecutionPolicy", "Bypass", + "-File", $fixture, + "-Port", "14168", + "-ReadyFile", $ready + ) -WindowStyle Hidden -PassThru + $deadline = (Get-Date).AddSeconds(20) + while ((Get-Date) -lt $deadline) { + if ((Test-Path -LiteralPath $ready) -and (Get-PortState).Count -gt 0) { + return $proc + } + Start-Sleep -Milliseconds 250 + } + Stop-ProcessTreeSafe $proc.Id + Fail "Foreign listener did not bind 127.0.0.1:14168" +} + +function Invoke-SetupRetry( + [System.Diagnostics.Process]$AppProcess, + [int]$TimeoutSeconds, + [int]$AfterSequence +) { + Add-Type -AssemblyName System.Windows.Forms + $sig = @" +using System; +using System.Runtime.InteropServices; +public static class Win32Focus { + [DllImport("user32.dll")] public static extern bool SetForegroundWindow(IntPtr hWnd); + [DllImport("user32.dll")] public static extern bool ShowWindow(IntPtr hWnd, int nCmdShow); +} +"@ + Add-Type -TypeDefinition $sig -ErrorAction SilentlyContinue + try { + $AppProcess.Refresh() + if ($AppProcess.MainWindowHandle -ne [IntPtr]::Zero) { + [Win32Focus]::ShowWindow($AppProcess.MainWindowHandle, 9) | Out-Null + [Win32Focus]::SetForegroundWindow($AppProcess.MainWindowHandle) | Out-Null + Start-Sleep -Milliseconds 500 + [System.Windows.Forms.SendKeys]::SendWait("{TAB}{TAB}{ENTER}") + } + } catch { + Add-Failure "Automatic setup retry keypress failed: $($_.Exception.Message)" + } + + $snapshot = Wait-ForBootstrapPhase ` + (Join-Path $ReportDir "port-conflict") "ready" $TimeoutSeconds $AfterSequence + if ($snapshot -and $snapshot.phase -eq "ready") { + $script:Report.checks.setupRetry = "automatic" + return $true + } + + Write-Host "" + Write-Host "Manual action required: click 'Retry startup' in the setup window." + $snapshot = Wait-ForBootstrapPhase ` + (Join-Path $ReportDir "port-conflict") "ready" 180 $AfterSequence + if ($snapshot -and $snapshot.phase -eq "ready") { + $script:Report.checks.setupRetry = "manual" + return $true + } + return $false +} + +function Invoke-PortConflictScenario([string]$PackageRoot) { + Write-Step "Port conflict recovery scenario" + Stop-GenericAgent + Stop-BridgeOnPort + Start-Sleep -Seconds 2 + + $listener = Start-ForeignPortListener + $script:Report.checks.foreignListenerPid = $listener.Id + $appProc = Start-GenericAgent $PackageRoot "port-conflict" + Start-Sleep -Seconds 2 + + $failed = Wait-ForBootstrapPhase (Join-Path $ReportDir "port-conflict") "failed" 80 + if (-not $failed -or $failed.phase -ne "failed") { + Stop-ProcessTreeSafe $listener.Id + Fail "Port conflict scenario did not reach failed phase" + } + if ($failed.failure.code -ne "port_conflict") { + Stop-ProcessTreeSafe $listener.Id + Fail "Expected port_conflict, got $($failed.failure.code)" + } + try { + Get-Process -Id $listener.Id -ErrorAction Stop | Out-Null + $script:Report.checks.foreignListenerSurvived = $true + } catch { + Fail "Foreign listener was not alive after port_conflict" + } + Capture-Screenshot "setup-failure.png" | Out-Null + + Stop-ProcessTreeSafe $listener.Id + Start-Sleep -Seconds 2 + if (-not (Invoke-SetupRetry $appProc 40 ([int]$failed.seq))) { + Fail "Setup retry did not reach ready after releasing port" + } + Capture-Screenshot "setup-retry-ready.png" | Out-Null + $script:Report.checks.portConflictRecovery = $true +} + +function Invoke-ProductionContractJourney( + [string]$PackageRoot, + [string]$ZipPath +) { + Write-Step "Run production package chat, data, relocation, and fallback journey" + if (-not $ExpectedCommit) { + Fail "Full mode requires -ExpectedCommit for the production build identity assertion" + } + Stop-GenericAgent + Stop-BridgeOnPort + Start-Sleep -Seconds 2 + + # The package itself must be movable while the journey is running. Running the driver + # with runtime\python\python.exe would keep that executable open and make Windows reject + # the relocation, so copy the already-prepared embedded interpreter outside the package. + $driverPythonRoot = Join-Path $WorkDir "production-contract-python" + if (Test-Path -LiteralPath $driverPythonRoot) { + Remove-Item -LiteralPath $driverPythonRoot -Recurse -Force + } + Copy-Item -LiteralPath (Join-Path $PackageRoot "runtime\python") ` + -Destination $driverPythonRoot -Recurse -Force + $python = Join-Path $driverPythonRoot "python.exe" + if (-not (Test-Path -LiteralPath $python)) { + Fail "Could not create an out-of-package Python for the relocation journey" + } + $driver = [System.IO.Path]::GetFullPath((Join-Path $ScriptRoot "..\run_release_qualification.py")) + $contractReport = Join-Path $ReportDir "production-contract" + $contractWork = Join-Path $WorkDir "production-contract-work" + $relocated = Join-Path $ExtractDir "relocated\含 空格\GenericAgent 包" + & $python $driver ` + --platform windows ` + --artifact $ZipPath ` + --expected-commit $ExpectedCommit ` + --package-root $PackageRoot ` + --application-relative "GenericAgent.exe" ` + --runtime-relative "runtime" ` + --relocated-root $relocated ` + --report-dir $contractReport ` + --work-dir $contractWork ` + --allow-user-settings-mutation + if ($LASTEXITCODE -ne 0) { + Fail "Production package contract journey failed; see $contractReport" + } + $script:Report.checks.productionContract = [System.IO.File]::ReadAllText( + (Join-Path $contractReport "real-package-report.json") + ) | ConvertFrom-Json +} + +try { + Ensure-Dir $WorkDir + Ensure-Dir $ReportDir + Ensure-Dir $ScreensDir + $Report.environment = Get-WindowsEnvironment + + if (-not $PackageZip) { + Write-Step "Read GitHub Actions run metadata" + Get-RunMetadata | Out-Null + } elseif ($ExpectedCommit) { + $Report.run = [ordered]@{ headSha = $ExpectedCommit; source = "local-package" } + } + + $zip = Resolve-PackageZip + $Report.package.zip = $zip + Test-Sha256 $zip + $packageRoot = Expand-Package $zip + Assert-PackageShape $packageRoot + $Report.environment.initialPortState = @(Get-PortState) + $Report.environment.initialProcesses = @(Get-GaProcesses) + if ($Report.environment.initialPortState.Count -gt 0) { + Fail "127.0.0.1:14168 was already occupied before release qualification" + } + $script:PortWasFreeAtStart = $true + + if ($Mode -eq "Smoke" -or $Mode -eq "Full") { + Invoke-FreshLaunch $packageRoot + } + if ($Mode -eq "FailureOnly" -or $Mode -eq "Full") { + Invoke-PortConflictScenario $packageRoot + } + if ($Mode -eq "Full") { + Invoke-ProductionContractJourney $packageRoot $zip + } + + Stop-GenericAgent + Stop-BridgeOnPort + Start-Sleep -Seconds 2 + $Report.environment.finalPortState = @(Get-PortState) + $Report.environment.finalProcesses = @(Get-GaProcesses) + if ($Report.environment.finalPortState.Count -gt 0) { + Fail "Package journey left a listener on 127.0.0.1:14168" + } + $Report.success = $true + $script:RunSucceeded = $true + Save-Report + Write-Host "" + Write-Host "Release qualification report: $ReportPath" +} catch { + $Report.success = $false + Add-Failure $_.Exception.Message + $Report.environment.finalPortState = @(Get-PortState) + $Report.environment.finalProcesses = @(Get-GaProcesses) + Save-Report + Write-Error $_.Exception.Message + exit 1 +} finally { + if ($script:PortWasFreeAtStart) { + Stop-GenericAgent + Stop-BridgeOnPort + } + if ($SettingsExisted) { + [System.IO.File]::WriteAllBytes($SettingsPath, $SettingsBackupBytes) + if ($null -ne $SettingsAttributes) { + [System.IO.File]::SetAttributes($SettingsPath, $SettingsAttributes) + } + } else { + Remove-Item -LiteralPath $SettingsPath -Force -ErrorAction SilentlyContinue + } + $script:Report.checks.settingsRestored = if ($SettingsExisted) { + [Convert]::ToBase64String([System.IO.File]::ReadAllBytes($SettingsPath)) -eq ` + [Convert]::ToBase64String($SettingsBackupBytes) + } else { + -not (Test-Path -LiteralPath $SettingsPath) + } + Save-Report + if ($script:RunSucceeded -and -not $KeepWorkDir) { + Remove-Item -LiteralPath $ExtractDir -Recurse -Force -ErrorAction SilentlyContinue + Remove-Item -LiteralPath $DownloadDir -Recurse -Force -ErrorAction SilentlyContinue + Write-Host "Report kept at: $ReportDir" + } else { + Write-Host "WorkDir kept for diagnostics: $WorkDir" + } +} diff --git a/frontends/desktop/release_qualification/windows/README.md b/frontends/desktop/release_qualification/windows/README.md new file mode 100644 index 000000000..613b6947d --- /dev/null +++ b/frontends/desktop/release_qualification/windows/README.md @@ -0,0 +1,65 @@ +# Windows Desktop release qualification + +This folder contains the Windows qualification runner for the portable desktop package. It exercises: + +1. Download a GitHub Actions artifact, or use a local zip. +2. Verify commit, SHA-256, and required package files. +3. Extract to a clean directory. +4. Launch `GenericAgent.exe` directly. +5. Wait for first-run prepare, bridge identity, and bootstrap `ready`. +6. In `Full` mode, inject an unknown process on port `14168`, verify `port_conflict`, release it, and retry from setup. +7. Run the shared production-package qualification with the embedded Python: package-owned bridge plus + external `GA_ROOT`, fake-model chat, upload, memory import, warm restart, a second foreign-port + assertion, relocation into a path with spaces and Chinese characters, stale override fallback, + optional P2P degradation, and process/settings cleanup. + +## Full Run + +```powershell +.\frontends\desktop\release_qualification\windows\Invoke-WindowsReleaseQualification.ps1 ` + -Repo abraxas914/GenericAgent ` + -RunId 29071095889 ` + -ExpectedCommit 696ddfc ` + -Mode Full +``` + +Use `-PackageZip C:\path\GenericAgent-Desktop-Windows-Portable.zip` when the artifact has expired or has already been downloaded. + +## Modes + +- `Smoke`: package verification, extraction, first launch, prepare marker, bridge identity, bootstrap ready. +- `FailureOnly`: assumes the package can be extracted and focuses on the unknown port conflict and setup retry path. +- `Full`: runs `Smoke`, the native retry failure path, and the complete production package qualification. + It requires `-ExpectedCommit` so the bridge build identity is tied to the candidate SHA. + +## Manual Checks + +The script collects screenshots and writes these checklist items to the report for separate human review: + +- Loading, prepare, setup, and main windows always show the Windows titlebar. +- Right side has exactly minimize, maximize, and close. +- Blank titlebar area drags the window; button area does not. +- Minimize works. +- Maximize and restore work. +- Close hides to tray instead of exiting. +- Sidebar nav sits directly below the custom titlebar with no blank row. +- The native directory picker opens and returns a real directory. +- The shortcut self-heals after the portable folder is moved. +- Loading, fallback, and main React pages render through the Tauri resource protocol. + +Screenshot capture and checklist values are supporting evidence. They do not determine the automated +qualification result or need to be edited to `pass` before the evidence verifier runs. + +## Report + +Reports are written under `\report`: + +- `e2e-report.json` +- `bootstrap-events.jsonl` +- `bootstrap-latest.json` +- screenshots such as `loading-first.png`, `main-ready.png`, and `setup-failure.png` +- `production-contract/real-package-report.json`, including artifact SHA-256, OS/architecture, + bootstrap phases, bridge identities, PIDs/ports, before/after paths, deterministic data results, + and cleanup state + +Failures exit non-zero and keep diagnostics unless `-KeepWorkDir` is omitted and cleanup succeeds. diff --git a/frontends/desktop/release_qualification/windows/fixtures/foreign-port-listener.ps1 b/frontends/desktop/release_qualification/windows/fixtures/foreign-port-listener.ps1 new file mode 100644 index 000000000..fe90a8a7c --- /dev/null +++ b/frontends/desktop/release_qualification/windows/fixtures/foreign-port-listener.ps1 @@ -0,0 +1,35 @@ +param( + [int]$Port = 14168, + [string]$ReadyFile = "" +) + +$ErrorActionPreference = "Stop" +Set-StrictMode -Version 2.0 + +$listener = [System.Net.Sockets.TcpListener]::new([System.Net.IPAddress]::Parse("127.0.0.1"), $Port) +$listener.Start() + +if ($ReadyFile) { + $dir = Split-Path -Parent $ReadyFile + if ($dir) { + [System.IO.Directory]::CreateDirectory($dir) | Out-Null + } + [System.IO.File]::WriteAllText($ReadyFile, "ready", [System.Text.Encoding]::ASCII) +} + +try { + while ($true) { + $client = $listener.AcceptTcpClient() + try { + $stream = $client.GetStream() + $body = "foreign listener" + $response = "HTTP/1.1 404 Not Found`r`nContent-Type: text/plain`r`nContent-Length: $($body.Length)`r`nConnection: close`r`n`r`n$body" + $bytes = [System.Text.Encoding]::ASCII.GetBytes($response) + $stream.Write($bytes, 0, $bytes.Length) + } finally { + $client.Close() + } + } +} finally { + $listener.Stop() +} diff --git a/frontends/desktop/scripts/gen_ds_store.py b/frontends/desktop/scripts/gen_ds_store.py new file mode 100644 index 000000000..e359434a9 --- /dev/null +++ b/frontends/desktop/scripts/gen_ds_store.py @@ -0,0 +1,68 @@ +"""Generate a .DS_Store file for DMG layout. + +Usage: python3 gen_ds_store.py + +Creates a .DS_Store that configures Finder to display: +- 540x380 window +- icon view, 128px icons +- at (140, 190), Applications at (400, 190) +""" +import sys +import struct +from ds_store import DSStore, DSStoreEntry +from mac_alias import Alias +import plistlib + +def main(): + output_path = sys.argv[1] + app_name = sys.argv[2] + + with DSStore.open(output_path, 'w+') as ds: + # Icon view properties for the folder + icvp = { + 'backgroundColorBlue': 1.0, + 'backgroundColorGreen': 1.0, + 'backgroundColorRed': 1.0, + 'backgroundType': 1, # 1 = solid color + 'gridOffsetX': 0.0, + 'gridOffsetY': 0.0, + 'gridSpacing': 100.0, + 'iconSize': 128.0, + 'labelOnBottom': True, + 'showIconPreview': True, + 'showItemInfo': False, + 'textSize': 13.0, + 'viewOptionsVersion': 1, + 'arrangeBy': 'none', + } + ds['.'] = DSStoreEntry('.', 'icvp', plistlib.dumps(icvp, fmt=plistlib.FMT_BINARY)) + + # Window bounds/settings + # vSrn = view style (icnv = icon view) + ds['.'] = DSStoreEntry('.', 'vSrn', 1) + + # bwsp = browser window settings plist + bwsp = { + 'WindowBounds': '{{100, 100}, {540, 380}}', + 'ShowPathbar': False, + 'ShowSidebar': False, + 'ShowStatusBar': False, + 'ShowToolbar': False, + 'ShowTabView': False, + 'SidebarWidth': 0, + } + ds['.'] = DSStoreEntry('.', 'bwsp', plistlib.dumps(bwsp, fmt=plistlib.FMT_BINARY)) + + # Icon positions (Iloc = icon location, 16 bytes: x(4) + y(4) + padding(8)) + # GenericAgent.app at (140, 190) + iloc_app = struct.pack('>II', 140, 190) + b'\xff\xff\xff\xff\xff\xff\x00\x00' + ds[app_name] = DSStoreEntry(app_name, 'Iloc', iloc_app) + + # Applications at (400, 190) + iloc_apps = struct.pack('>II', 400, 190) + b'\xff\xff\xff\xff\xff\xff\x00\x00' + ds['Applications'] = DSStoreEntry('Applications', 'Iloc', iloc_apps) + + print(f"Generated: {output_path}") + +if __name__ == '__main__': + main() diff --git a/frontends/desktop/scripts/post-dmg.sh b/frontends/desktop/scripts/post-dmg.sh new file mode 100644 index 000000000..50b58f0ea --- /dev/null +++ b/frontends/desktop/scripts/post-dmg.sh @@ -0,0 +1,153 @@ +#!/bin/bash +# Repackage a Tauri-bundled DMG into a clean DMG with proper Finder layout. +# Only contains .app + Applications symlink + .DS_Store for layout. +# No .VolumeIcon.icns, .background, .fseventsd or other debris. +# +# Usage: ./scripts/post-dmg.sh +# Requires: macOS (hdiutil), Python 3 with ds_store package + +set -euo pipefail + +DMG_PATH="${1:-}" +HDIUTIL_BIN="${HDIUTIL_BIN:-hdiutil}" +if [[ -z "$DMG_PATH" ]]; then + echo "Usage: $0 " >&2 + exit 1 +fi + +if [[ ! -f "$DMG_PATH" ]]; then + echo "Error: DMG not found: $DMG_PATH" >&2 + exit 1 +fi + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +DMG_DIR="$(cd "$(dirname "$DMG_PATH")" && pwd)" +DMG_NAME="$(basename "$DMG_PATH")" +STAGE_DIR="$(mktemp -d)" +RW_DMG="$(mktemp -u).dmg" + +cleanup() { + if [[ -n "${MOUNT_POINT:-}" ]] && mount | grep -q "$MOUNT_POINT"; then + "$HDIUTIL_BIN" detach "$MOUNT_POINT" -force 2>/dev/null || true + fi + rm -rf "$STAGE_DIR" "$RW_DMG" +} +trap cleanup EXIT + +# --- Step 1: Extract app from original DMG --- +echo "Mounting original DMG..." +MOUNT_OUTPUT="$("$HDIUTIL_BIN" attach "$DMG_PATH" -readonly -noverify -noautoopen -plist)" +MOUNT_POINT="$(echo "$MOUNT_OUTPUT" | grep -A1 'mount-point' | grep '' | sed 's/.*\(.*\)<\/string>.*/\1/' | head -1)" + +if [[ -z "$MOUNT_POINT" ]]; then + echo "Error: could not determine mount point" >&2 + exit 1 +fi + +APP_NAME="" +for item in "$MOUNT_POINT"/*.app; do + if [[ -d "$item" ]]; then + APP_NAME="$(basename "$item")" + ditto "$item" "$STAGE_DIR/$APP_NAME" + break + fi +done + +if [[ -z "$APP_NAME" ]]; then + echo "Error: no .app found in DMG" >&2 + exit 1 +fi + +"$HDIUTIL_BIN" detach "$MOUNT_POINT" -quiet +unset MOUNT_POINT + +# --- Step 2: Prepare stage directory --- +ln -s /Applications "$STAGE_DIR/Applications" + +# Generate .DS_Store with layout metadata +python3 -c " +import struct, plistlib, sys +sys.path.insert(0, '') +from ds_store import DSStore, DSStoreEntry + +app_name = '$APP_NAME' +output = '$STAGE_DIR/.DS_Store' + +entries = [] + +# Icon positions (Iloc: x(4) + y(4) + padding(8)) +iloc_app = struct.pack('>II', 140, 190) + b'\xff\xff\xff\xff\xff\xff\x00\x00' +entries.append(DSStoreEntry(app_name, 'Iloc', 'blob', iloc_app)) + +iloc_apps = struct.pack('>II', 400, 190) + b'\xff\xff\xff\xff\xff\xff\x00\x00' +entries.append(DSStoreEntry('Applications', 'Iloc', 'blob', iloc_apps)) + +# Icon view properties +icvp = { + 'backgroundColorBlue': 1.0, + 'backgroundColorGreen': 1.0, + 'backgroundColorRed': 1.0, + 'backgroundType': 1, + 'gridOffsetX': 0.0, + 'gridOffsetY': 0.0, + 'gridSpacing': 100.0, + 'iconSize': 128.0, + 'labelOnBottom': True, + 'showIconPreview': True, + 'showItemInfo': False, + 'textSize': 13.0, + 'viewOptionsVersion': 1, + 'arrangeBy': 'none', +} +entries.append(DSStoreEntry('.', 'icvp', 'blob', plistlib.dumps(icvp, fmt=plistlib.FMT_BINARY))) + +# View style (1 = icon view) +entries.append(DSStoreEntry('.', 'vSrn', 'long', 1)) + +# Browser window settings +bwsp = { + 'WindowBounds': '{{100, 100}, {540, 380}}', + 'ShowSidebar': False, + 'ShowStatusBar': False, + 'ShowToolbar': False, + 'ShowTabView': False, + 'SidebarWidth': 0, +} +entries.append(DSStoreEntry('.', 'bwsp', 'blob', plistlib.dumps(bwsp, fmt=plistlib.FMT_BINARY))) + +with DSStore.open(output, 'w+') as ds: + for e in entries: + ds.insert(e) +" + +echo " Stage: $APP_NAME + Applications + .DS_Store" + +# --- Step 3: Create final DMG --- +VOLNAME="${APP_NAME%.app}" +CREATE_STATUS=1 +for attempt in 1 2 3; do + rm -f "$DMG_DIR/$DMG_NAME" + if "$HDIUTIL_BIN" create \ + -volname "$VOLNAME" \ + -srcfolder "$STAGE_DIR" \ + -ov \ + -format UDZO \ + "$DMG_DIR/$DMG_NAME"; then + CREATE_STATUS=0 + break + else + CREATE_STATUS=$? + fi + + if [[ "$attempt" -lt 3 ]]; then + echo "hdiutil create failed (attempt $attempt/3, exit $CREATE_STATUS); retrying..." >&2 + sleep $((attempt * 2)) + fi +done + +if [[ "$CREATE_STATUS" -ne 0 ]]; then + echo "Error: hdiutil create failed after 3 attempts" >&2 + exit "$CREATE_STATUS" +fi + +echo "Done: $DMG_NAME ($(du -h "$DMG_DIR/$DMG_NAME" | cut -f1))" diff --git a/frontends/desktop/scripts/verify-compiled-dist.mjs b/frontends/desktop/scripts/verify-compiled-dist.mjs new file mode 100644 index 000000000..8c9bbfe43 --- /dev/null +++ b/frontends/desktop/scripts/verify-compiled-dist.mjs @@ -0,0 +1,383 @@ +import { createHash } from 'node:crypto'; +import { execFileSync } from 'node:child_process'; +import { access, readFile, readdir } from 'node:fs/promises'; +import path from 'node:path'; +import { fileURLToPath } from 'node:url'; + +const desktopDir = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '..'); +const repoRoot = path.resolve(desktopDir, '..', '..'); +const distDir = path.join(desktopDir, 'dist'); +const expectedVersion = '0.2.0'; +const expectedSourceCommit = '21f12f6dfe57ada8572bb21fe6604caac230b1cf'; +const expectedNoticeSha256 = '2acf865e87e59090121369aac0575467067fdd7999923a70d785a46ceae3330f'; +const noticeAttributeRules = [ + 'frontends/desktop/public/THIRD_PARTY_NOTICES.txt text eol=lf', + 'frontends/desktop/dist/THIRD_PARTY_NOTICES.txt text eol=lf', +]; +const excludedManifestFiles = new Set(['README.md', 'build-provenance.json']); +const removedLegacyAssets = [ + 'styles.css', + 'i18n.js', + 'phosphor-icons.js', + 'vendor/marked.min.js', + 'assets/fonts/fonts.css', + 'assets/fonts/README.md', + 'assets/fonts/azonix-wordmark.woff2', + 'assets/fonts/jetbrains-mono-latin.woff2', + 'assets/fonts/lexend-latin.woff2', + 'assets/fonts/noto-sans-latin.woff2', +]; +const semiPackages = [ + '@douyinfe/semi-animation', + '@douyinfe/semi-animation-react', + '@douyinfe/semi-animation-styled', + '@douyinfe/semi-foundation', + '@douyinfe/semi-icons', + '@douyinfe/semi-illustrations', + '@douyinfe/semi-json-viewer-core', + '@douyinfe/semi-theme-default', + '@douyinfe/semi-ui', +]; + +function fail(message) { + throw new Error(message); +} + +async function exists(file) { + try { + await access(file); + return true; + } catch { + return false; + } +} + +async function readJson(file) { + return JSON.parse(await readFile(file, 'utf8')); +} + +async function walk(dir) { + const entries = await readdir(dir, { withFileTypes: true }); + const files = []; + for (const entry of entries) { + const fullPath = path.join(dir, entry.name); + if (entry.isDirectory()) files.push(...await walk(fullPath)); + if (entry.isFile()) files.push(fullPath); + } + return files; +} + +function sha256(contents) { + return createHash('sha256').update(contents).digest('hex'); +} + +function relativeToDist(file) { + return path.relative(distDir, file).split(path.sep).join('/'); +} + +async function assertExists(relativePath) { + if (!await exists(path.join(distDir, relativePath))) { + fail(`missing compiled asset: ${relativePath}`); + } +} + +function workflowJob(workflow, name) { + const match = new RegExp(`^ ${name}:\\s*$`, 'm').exec(workflow); + if (!match) return ''; + const remainder = workflow.slice(match.index + match[0].length); + const nextJob = /^ [a-zA-Z0-9_-]+:\s*$/m.exec(remainder); + return nextJob ? remainder.slice(0, nextJob.index) : remainder; +} + +async function verifyHtmlReferences(relativePath) { + const html = await readFile(path.join(distDir, relativePath), 'utf8'); + const references = [...html.matchAll(/\b(?:src|href)=["']([^"']+)["']/g)].map((match) => match[1]); + for (const reference of references) { + if (/^(?:[a-z]+:|#|\/\/)/i.test(reference)) continue; + const cleanReference = reference.split(/[?#]/, 1)[0].replace(/^\//, ''); + if (cleanReference) await assertExists(cleanReference); + } +} + +function verifyTrackedSourceBoundary() { + const tracked = execFileSync('git', ['ls-files'], { cwd: repoRoot, encoding: 'utf8' }) + .split('\n') + .filter(Boolean); + const forbidden = tracked.filter((file) => ( + file.startsWith('frontends/desktop/src/') + || file.startsWith('frontends/desktop/public/') + || file.startsWith('frontends/desktop/e2e/') + || /^frontends\/desktop\/(?:index|loading|setup)\.html$/.test(file) + || /^frontends\/desktop\/(?:vite\.config\.[^/]+|tsconfig(?:\.[^/]+)?\.json|package-lock\.json)$/.test(file) + )); + if (forbidden.length > 0) { + fail(`tracked React development files crossed the compiled-only boundary: ${forbidden.join(', ')}`); + } +} + +async function verifyNoticeAttributes() { + const attributes = await readFile(path.join(repoRoot, '.gitattributes'), 'utf8'); + const lines = attributes.split(/\r?\n/); + for (const rule of noticeAttributeRules) { + const noticePath = rule.split(/\s+/, 1)[0]; + const matchingRules = lines.filter((line) => line.trim().split(/\s+/, 1)[0] === noticePath); + if (matchingRules.length !== 1 || matchingRules[0] !== rule) { + fail(`third-party notice must have one exact LF attribute rule: ${rule}`); + } + } +} + +async function verifyVersionsRendererAndEntry() { + const packageJson = await readJson(path.join(desktopDir, 'package.json')); + const tauriConfig = await readJson(path.join(desktopDir, 'src-tauri', 'tauri.conf.json')); + const tauriE2eConfig = await readJson(path.join(desktopDir, 'src-tauri', 'tauri.e2e.conf.json')); + const cargoToml = await readFile(path.join(desktopDir, 'src-tauri', 'Cargo.toml'), 'utf8'); + const cargoLock = await readFile(path.join(desktopDir, 'src-tauri', 'Cargo.lock'), 'utf8'); + const desktopShell = await readFile(path.join(desktopDir, 'src-tauri', 'src', 'lib.rs'), 'utf8'); + + if (packageJson.version !== expectedVersion) fail(`package.json version must be ${expectedVersion}`); + if (tauriConfig.version !== expectedVersion) fail(`tauri.conf.json version must be ${expectedVersion}`); + if (tauriConfig.build?.frontendDist !== '../dist') fail('Tauri frontendDist must be ../dist'); + for (const sourceBuildKey of ['beforeBuildCommand', 'beforeDevCommand', 'devUrl']) { + if (sourceBuildKey in tauriConfig.build) fail(`compiled-only Tauri config must not require ${sourceBuildKey}`); + } + if (!/^\[package\][\s\S]*?^name = "ga-desktop"$[\s\S]*?^version = "0\.2\.0"$/m.test(cargoToml)) { + fail(`Cargo.toml ga-desktop version must be ${expectedVersion}`); + } + if (!/^\[\[package\]\][\s\S]*?^name = "ga-desktop"$\nversion = "0\.2\.0"$/m.test(cargoLock)) { + fail(`Cargo.lock ga-desktop version must be ${expectedVersion}`); + } + + const productionSecurity = tauriConfig.app?.security; + if (!productionSecurity?.csp || typeof productionSecurity.csp !== 'object') { + fail('production renderer must use an explicit CSP'); + } + if (String(productionSecurity.csp['script-src']).includes('unsafe-eval')) { + fail('production CSP must not enable unsafe-eval'); + } + if (!String(productionSecurity.csp['connect-src']).includes('127.0.0.1:14168')) { + fail('production CSP must retain the Desktop loopback bridge'); + } + if (JSON.stringify(productionSecurity).includes('wdio:')) { + fail('production Tauri security config must not grant WebDriver permissions'); + } + if (!JSON.stringify(tauriE2eConfig).includes('wdio:default')) { + fail('E2E-only Tauri config must retain its isolated WebDriver capability'); + } + if (!desktopShell.includes('fn main_ui_url_from_current')) { + fail('desktop shell must resolve index.html from the active Tauri asset origin'); + } + if (/tauri::Url::parse\("http:\/\/127\.0\.0\.1:14168\/?"\)/.test(desktopShell)) { + fail('desktop shell must not navigate the renderer to the legacy bridge root'); + } +} + +async function verifyReleaseContract() { + const workflow = await readFile( + path.join(repoRoot, '.github', 'workflows', 'desktop-release-package.yml'), + 'utf8', + ); + const buildJobs = ['build-windows', 'build-linux', 'build-macos']; + const tauriCommands = { + 'build-windows': 'npm run tauri build -- --bundles nsis', + 'build-linux': 'npm run tauri build -- --bundles appimage', + 'build-macos': 'npm run tauri build -- --bundles app', + }; + const jobNames = [...workflow.slice(workflow.search(/^jobs:\s*$/m)).matchAll(/^ ([a-zA-Z0-9_-]+):\s*$/gm)] + .map((match) => match[1]); + if (JSON.stringify(jobNames) !== JSON.stringify([...buildJobs, 'publish-release'])) { + fail('release workflow must contain exactly three builders and one publisher'); + } + if (!/^permissions:\n contents: read\s*$/m.test(workflow)) { + fail('release workflow must default to contents: read'); + } + if ((workflow.match(/^ contents: write\s*$/gm) ?? []).length !== 1) { + fail('release workflow must grant contents: write exactly once'); + } + if ((workflow.match(/^ run: npm run test:dist$/gm) ?? []).length !== 3) { + fail('all three builders must run the compiled renderer byte contract'); + } + if (/\bnpm ci\b|\bnpm run build\b|\b(?:npx|npm exec)\s+vite\b/.test(workflow)) { + fail('compiled-only release workflow must not require the React source toolchain'); + } + + for (const job of buildJobs) { + const body = workflowJob(workflow, job); + if (!body) fail(`missing release builder: ${job}`); + if (!/^ permissions:\n contents: read\s*$/m.test(body) || body.includes('contents: write')) { + fail(`${job} must have read-only repository permission`); + } + if (!/uses: actions\/checkout@[0-9a-f]{40}[^\n]*\n with:\n persist-credentials: false/.test(body)) { + fail(`${job} checkout must use a full SHA and disable persisted credentials`); + } + if (body.includes('secrets.GITHUB_TOKEN') || /\bgh release\b/.test(body)) { + fail(`${job} must not receive a release token or publish`); + } + if (!body.includes('npm install --package-lock=false') + || !body.includes("if(v!=='2.11.4')") + || !body.includes('test ! -e package-lock.json') + || body.includes('npm ci')) { + fail(`${job} must install only the submitted minimal Tauri package manifest`); + } + const adjacentGate = new RegExp( + ' - name: Verify tracked compiled renderer bytes\\n' + + ' working-directory: frontends/desktop\\n' + + ' run: npm run test:dist\\n\\n' + + ' - name: [^\\n]+\\n' + + ' working-directory: frontends/desktop\\n' + + ` run: ${tauriCommands[job].replace(/[.*+?^${}()|[\]\\]/g, '\\$&')}`, + ); + if (!adjacentGate.test(body)) { + fail(`${job} must validate notice bytes immediately before Tauri embeds dist`); + } + if (!(body.includes("--exclude='./frontends/desktop/dist'") + || body.includes("--exclude='frontends/desktop/dist'"))) { + fail(`${job} must not duplicate Tauri-embedded dist inside runtime/app`); + } + if (!/--exclude='(?:\.\/)?frontends\/desktop\/release_qualification'/.test(body)) { + fail(`${job} must not package release qualification tooling inside runtime/app`); + } + if (!(body.includes('test ! -e "$RUNTIME/app/frontends/desktop/dist"') + || body.includes('test ! -e "$RUNTIME_SRC/app/frontends/desktop/dist"'))) { + fail(`${job} must verify dist is not duplicated inside runtime/app`); + } + } + + const windows = workflowJob(workflow, 'build-windows'); + if (!windows.includes('cygpath -u "$RUNNER_TEMP"') + || !windows.includes('PBS_ARCHIVE="${RUNNER_TEMP_POSIX}/pbs-windows-x86_64.tar.gz"')) { + fail('Windows packaging must convert RUNNER_TEMP with cygpath before POSIX tools use it'); + } + const macos = workflowJob(workflow, 'build-macos'); + if (!macos.includes('runs-on: macos-15') + || !macos.includes('test "$(uname -m)" = arm64') + || !workflow.includes('MACOS_PACKAGING_PYTHON_VERSION: "3.12.10"') + || !workflow.includes('PBS_PYTHON_VERSION: "3.12.14"')) { + fail('macOS packaging must use the pinned arm64 host and separate Python inputs'); + } + const linux = workflowJob(workflow, 'build-linux'); + if (!linux.includes('runs-on: ubuntu-22.04') + || !linux.includes('prefix-key: "v1-rust-release-ubuntu-22.04-glibc-2.35"') + || linux.includes('prefix-key: "v0-rust"') + || !linux.includes('cache-targets: "false"') + || !linux.includes('cache-bin: "false"')) { + fail('Linux packaging must isolate its Ubuntu 22.04/glibc 2.35 Rust cache ABI'); + } + + const publisher = workflowJob(workflow, 'publish-release'); + if (!publisher.includes('needs: [build-windows, build-linux, build-macos]') + || !publisher.includes("github.event_name == 'push'") + || !publisher.includes('refs/tags/desktop-portable-') + || !/^ permissions:\n contents: write\s*$/m.test(publisher)) { + fail('publisher must be the sole tag-only writer after all three builders'); + } + const publisherRun = publisher.slice(publisher.indexOf(' run: |')); + if (!publisher.includes('TAG_NAME: ${{ github.ref_name }}') + || publisherRun.includes('${{ github.ref_name }}') + || !publisherRun.includes('^desktop-portable-[A-Za-z0-9._-]+$')) { + fail('publisher must pass the tag through env and validate it before shell use'); + } + if ((publisher.match(/actions\/download-artifact@/g) ?? []).length !== 3 + || (publisher.match(/\bgh release create\b/g) ?? []).length !== 1 + || publisher.includes('gh release upload') + || !publisher.includes('--draft') + || !publisher.includes('gh release edit "$TAG_NAME" --draft=false --prerelease')) { + fail('publisher must aggregate three artifacts as a verified draft, then expose one prerelease'); + } + for (const file of [ + 'GenericAgent-Desktop-Windows-Portable.zip', + 'SHA256SUMS-windows.txt', + 'GenericAgent-Desktop-Linux-Portable.tar.gz', + 'SHA256SUMS-linux.txt', + 'GenericAgent-Desktop-macOS-aarch64.dmg', + 'GenericAgent-Desktop-macOS-aarch64.dmg.sha256', + ]) { + if (!publisher.includes(file)) fail(`publisher does not require release asset: ${file}`); + } +} + +async function verifyGeneratedManifest(files) { + const provenance = await readJson(path.join(distDir, 'build-provenance.json')); + const generatedFiles = files + .map((file) => ({ file, relativePath: relativeToDist(file) })) + .filter(({ relativePath }) => !excludedManifestFiles.has(relativePath)) + .sort((left, right) => left.relativePath.localeCompare(right.relativePath, 'en')); + + const manifestLines = []; + for (const { file, relativePath } of generatedFiles) { + manifestLines.push(`${sha256(await readFile(file))} ${relativePath}\n`); + } + const manifestDigest = sha256(manifestLines.join('')); + + if (provenance.version !== expectedVersion) fail(`provenance version must be ${expectedVersion}`); + if (provenance.sourceRepository !== 'https://github.com/abraxas914/GenericAgent') { + fail('provenance source repository is incorrect'); + } + if (provenance.sourceCommit !== expectedSourceCommit) fail('provenance source commit is incorrect'); + if (provenance.generatedAssetCount !== generatedFiles.length) { + fail(`provenance asset count mismatch: expected ${provenance.generatedAssetCount}, found ${generatedFiles.length}`); + } + if (provenance.generatedManifestSha256 !== manifestDigest) { + fail(`provenance manifest mismatch: expected ${provenance.generatedManifestSha256}, found ${manifestDigest}`); + } +} + +async function main() { + const requiredFiles = [ + 'index.html', + 'loading.html', + 'setup.html', + 'fallback.html', + 'assets/ga-logo.svg', + 'THIRD_PARTY_NOTICES.txt', + 'README.md', + 'build-provenance.json', + ]; + await Promise.all(requiredFiles.map(assertExists)); + for (const deadAsset of removedLegacyAssets) { + if (await exists(path.join(distDir, deadAsset))) { + fail(`dead legacy React asset remains in compiled output: ${deadAsset}`); + } + } + + verifyTrackedSourceBoundary(); + await verifyNoticeAttributes(); + const files = await walk(distDir); + const forbiddenSource = files.map(relativeToDist).filter((file) => /(?:\.map|\.tsx?|\.jsx)$/i.test(file)); + if (forbiddenSource.length > 0) fail(`compiled distribution contains source files: ${forbiddenSource.join(', ')}`); + + const searchableFiles = files.filter((file) => /\.(?:html|js|css)$/i.test(file)); + for (const file of searchableFiles) { + const contents = await readFile(file, 'utf8'); + if (/(?:webdriverio|__GA_E2E__|wdio:|sourceMappingURL|webpack:\/\/|\/Users\/)/i.test(contents)) { + fail(`compiled distribution leaks source/E2E material: ${relativeToDist(file)}`); + } + } + + const notice = await readFile(path.join(distDir, 'THIRD_PARTY_NOTICES.txt')); + if (sha256(notice) !== expectedNoticeSha256) fail('Semi Design third-party notice hash is incorrect'); + const readme = await readFile(path.join(distDir, 'README.md'), 'utf8'); + for (const value of [ + expectedSourceCommit, + ...semiPackages, + 'https://github.com/DouyinFE/semi-design', + 'https://semi.design', + 'Copyright (c) 2021 DouyinFE', + 'License: MIT', + 'THIRD_PARTY_NOTICES.txt', + '5ddf03bb152666637bdfcfa44f1fac3cff5a66b6', + '2fb55d944e4444b08cb9ad76c13aef7a5788186b', + '3e7ca6a2b20eefdb3ee335dc0d520c3b6d9d57f8', + 'not a claim that later builds are bit-for-bit reproducible', + ]) { + if (!readme.includes(value)) fail(`compiled README is missing required provenance/license text: ${value}`); + } + + await Promise.all(['index.html', 'loading.html', 'setup.html'].map(verifyHtmlReferences)); + await verifyVersionsRendererAndEntry(); + await verifyReleaseContract(); + await verifyGeneratedManifest(files); + console.log('Compiled React Desktop 2.0 distribution contracts passed.'); +} + +await main(); diff --git a/frontends/desktop/src-tauri/Cargo.lock b/frontends/desktop/src-tauri/Cargo.lock index b2e5389dc..3c5d829e6 100644 --- a/frontends/desktop/src-tauri/Cargo.lock +++ b/frontends/desktop/src-tauri/Cargo.lock @@ -229,7 +229,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "241b621213072e993be4f6f3a9e4b45f65b7e6faad43001be957184b7bb1824b" dependencies = [ "atk-sys", - "glib", + "glib 0.18.5", "libc", ] @@ -239,10 +239,10 @@ version = "0.18.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c5e48b684b0ca77d2bbadeef17424c2ea3c897d44d566a1617e7e8f30614d086" dependencies = [ - "glib-sys", - "gobject-sys", + "glib-sys 0.18.1", + "gobject-sys 0.18.0", "libc", - "system-deps", + "system-deps 6.2.2", ] [[package]] @@ -257,6 +257,58 @@ version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" +[[package]] +name = "axum" +version = "0.8.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "31b698c5f9a010f6573133b09e0de5408834d0c82f8d7475a89fc1867a71cd90" +dependencies = [ + "axum-core", + "bytes", + "form_urlencoded", + "futures-util", + "http", + "http-body", + "http-body-util", + "hyper", + "hyper-util", + "itoa", + "matchit", + "memchr", + "mime", + "percent-encoding", + "pin-project-lite", + "serde_core", + "serde_json", + "serde_path_to_error", + "serde_urlencoded", + "sync_wrapper", + "tokio", + "tower", + "tower-layer", + "tower-service", + "tracing", +] + +[[package]] +name = "axum-core" +version = "0.5.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08c78f31d7b1291f7ee735c1c6780ccde7785daae9a9206026862dab7d8792d1" +dependencies = [ + "bytes", + "futures-core", + "http", + "http-body", + "http-body-util", + "mime", + "pin-project-lite", + "sync_wrapper", + "tower-layer", + "tower-service", + "tracing", +] + [[package]] name = "base64" version = "0.21.7" @@ -395,7 +447,7 @@ checksum = "8ca26ef0159422fb77631dc9d17b102f253b876fe1586b03b803e63a309b4ee2" dependencies = [ "bitflags 2.11.1", "cairo-sys-rs", - "glib", + "glib 0.18.5", "libc", "once_cell", "thiserror 1.0.69", @@ -407,9 +459,9 @@ version = "0.18.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "685c9fa8e590b8b3d678873528d83411db17242a73fccaed827770ea0fedda51" dependencies = [ - "glib-sys", + "glib-sys 0.18.1", "libc", - "system-deps", + "system-deps 6.2.2", ] [[package]] @@ -488,7 +540,17 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d067ad48b8650848b989a59a86c6c36a995d02d2bf778d45c3c5d57bc2718f02" dependencies = [ "smallvec", - "target-lexicon", + "target-lexicon 0.12.16", +] + +[[package]] +name = "cfg-expr" +version = "0.20.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fb693542bcafa528e198be0ebd9d3632ca5b7c93dbe7237460e199910835997c" +dependencies = [ + "smallvec", + "target-lexicon 0.13.5", ] [[package]] @@ -1191,7 +1253,7 @@ dependencies = [ [[package]] name = "ga-desktop" -version = "0.1.8" +version = "0.2.0" dependencies = [ "dirs 5.0.1", "rfd", @@ -1199,7 +1261,10 @@ dependencies = [ "serde_json", "tauri", "tauri-build", + "tauri-plugin-opener", "tauri-plugin-single-instance", + "tauri-plugin-wdio", + "tauri-plugin-wdio-webdriver", ] [[package]] @@ -1212,7 +1277,7 @@ dependencies = [ "gdk-pixbuf", "gdk-sys", "gio", - "glib", + "glib 0.18.5", "libc", "pango", ] @@ -1225,7 +1290,7 @@ checksum = "50e1f5f1b0bfb830d6ccc8066d18db35c487b1b2b1e8589b5dfe9f07e8defaec" dependencies = [ "gdk-pixbuf-sys", "gio", - "glib", + "glib 0.18.5", "libc", "once_cell", ] @@ -1236,11 +1301,11 @@ version = "0.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3f9839ea644ed9c97a34d129ad56d38a25e6756f99f3a88e15cd39c20629caf7" dependencies = [ - "gio-sys", - "glib-sys", - "gobject-sys", + "gio-sys 0.18.1", + "glib-sys 0.18.1", + "gobject-sys 0.18.0", "libc", - "system-deps", + "system-deps 6.2.2", ] [[package]] @@ -1251,13 +1316,13 @@ checksum = "5c2d13f38594ac1e66619e188c6d5a1adb98d11b2fcf7894fc416ad76aa2f3f7" dependencies = [ "cairo-sys-rs", "gdk-pixbuf-sys", - "gio-sys", - "glib-sys", - "gobject-sys", + "gio-sys 0.18.1", + "glib-sys 0.18.1", + "gobject-sys 0.18.0", "libc", "pango-sys", "pkg-config", - "system-deps", + "system-deps 6.2.2", ] [[package]] @@ -1267,11 +1332,11 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "140071d506d223f7572b9f09b5e155afbd77428cd5cc7af8f2694c41d98dfe69" dependencies = [ "gdk-sys", - "glib-sys", - "gobject-sys", + "glib-sys 0.18.1", + "gobject-sys 0.18.0", "libc", "pkg-config", - "system-deps", + "system-deps 6.2.2", ] [[package]] @@ -1283,7 +1348,7 @@ dependencies = [ "gdk", "gdkx11-sys", "gio", - "glib", + "glib 0.18.5", "libc", "x11", ] @@ -1295,9 +1360,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6e2e7445fe01ac26f11601db260dd8608fe172514eb63b3b5e261ea6b0f4428d" dependencies = [ "gdk-sys", - "glib-sys", + "glib-sys 0.18.1", "libc", - "system-deps", + "system-deps 6.2.2", "x11", ] @@ -1357,8 +1422,8 @@ dependencies = [ "futures-core", "futures-io", "futures-util", - "gio-sys", - "glib", + "gio-sys 0.18.1", + "glib 0.18.5", "libc", "once_cell", "pin-project-lite", @@ -1372,13 +1437,26 @@ version = "0.18.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "37566df850baf5e4cb0dfb78af2e4b9898d817ed9263d1090a2df958c64737d2" dependencies = [ - "glib-sys", - "gobject-sys", + "glib-sys 0.18.1", + "gobject-sys 0.18.0", "libc", - "system-deps", + "system-deps 6.2.2", "winapi", ] +[[package]] +name = "gio-sys" +version = "0.21.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0071fe88dba8e40086c8ff9bbb62622999f49628344b1d1bf490a48a29d80f22" +dependencies = [ + "glib-sys 0.21.5", + "gobject-sys 0.21.5", + "libc", + "system-deps 7.0.8", + "windows-sys 0.61.2", +] + [[package]] name = "glib" version = "0.18.5" @@ -1391,10 +1469,10 @@ dependencies = [ "futures-executor", "futures-task", "futures-util", - "gio-sys", - "glib-macros", - "glib-sys", - "gobject-sys", + "gio-sys 0.18.1", + "glib-macros 0.18.5", + "glib-sys 0.18.1", + "gobject-sys 0.18.0", "libc", "memchr", "once_cell", @@ -1402,6 +1480,27 @@ dependencies = [ "thiserror 1.0.69", ] +[[package]] +name = "glib" +version = "0.21.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16de123c2e6c90ce3b573b7330de19be649080ec612033d397d72da265f1bd8b" +dependencies = [ + "bitflags 2.11.1", + "futures-channel", + "futures-core", + "futures-executor", + "futures-task", + "futures-util", + "gio-sys 0.21.5", + "glib-macros 0.21.5", + "glib-sys 0.21.5", + "gobject-sys 0.21.5", + "libc", + "memchr", + "smallvec", +] + [[package]] name = "glib-macros" version = "0.18.5" @@ -1416,6 +1515,19 @@ dependencies = [ "syn 2.0.117", ] +[[package]] +name = "glib-macros" +version = "0.21.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf59b675301228a696fe01c3073974643365080a76cc3ed5bc2cbc466ad87f17" +dependencies = [ + "heck 0.5.0", + "proc-macro-crate 3.5.0", + "proc-macro2", + "quote", + "syn 2.0.117", +] + [[package]] name = "glib-sys" version = "0.18.1" @@ -1423,7 +1535,17 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "063ce2eb6a8d0ea93d2bf8ba1957e78dbab6be1c2220dd3daca57d5a9d869898" dependencies = [ "libc", - "system-deps", + "system-deps 6.2.2", +] + +[[package]] +name = "glib-sys" +version = "0.21.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d95e1a3a19ae464a7286e14af9a90683c64d70c02532d88d87ce95056af3e6c" +dependencies = [ + "libc", + "system-deps 7.0.8", ] [[package]] @@ -1438,9 +1560,20 @@ version = "0.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0850127b514d1c4a4654ead6dedadb18198999985908e6ffe4436f53c785ce44" dependencies = [ - "glib-sys", + "glib-sys 0.18.1", "libc", - "system-deps", + "system-deps 6.2.2", +] + +[[package]] +name = "gobject-sys" +version = "0.21.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2dca35da0d19a18f4575f3cb99fe1c9e029a2941af5662f326f738a21edaf294" +dependencies = [ + "glib-sys 0.21.5", + "libc", + "system-deps 7.0.8", ] [[package]] @@ -1456,7 +1589,7 @@ dependencies = [ "gdk", "gdk-pixbuf", "gio", - "glib", + "glib 0.18.5", "gtk-sys", "gtk3-macros", "libc", @@ -1474,12 +1607,12 @@ dependencies = [ "cairo-sys-rs", "gdk-pixbuf-sys", "gdk-sys", - "gio-sys", - "glib-sys", - "gobject-sys", + "gio-sys 0.18.1", + "glib-sys 0.18.1", + "gobject-sys 0.18.0", "libc", "pango-sys", - "system-deps", + "system-deps 6.2.2", ] [[package]] @@ -1589,6 +1722,12 @@ version = "1.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" +[[package]] +name = "httpdate" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" + [[package]] name = "hyper" version = "1.9.0" @@ -1602,6 +1741,7 @@ dependencies = [ "http", "http-body", "httparse", + "httpdate", "itoa", "pin-project-lite", "smallvec", @@ -1819,6 +1959,25 @@ version = "2.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d98f6fed1fde3f8c21bc40a1abb88dd75e67924f9cffc3ef95607bad8017f8e2" +[[package]] +name = "is-docker" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "928bae27f42bc99b60d9ac7334e3a21d10ad8f1835a4e12ec3ec0464765ed1b3" +dependencies = [ + "once_cell", +] + +[[package]] +name = "is-wsl" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "173609498df190136aa7dea1a91db051746d339e18476eed5ca40521f02d7aa5" +dependencies = [ + "is-docker", + "once_cell", +] + [[package]] name = "itoa" version = "1.0.18" @@ -1832,7 +1991,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ca5671e9ffce8ffba57afc24070e906da7fc4b1ba66f2cabebf61bf2ea257fcc" dependencies = [ "bitflags 1.3.2", - "glib", + "glib 0.18.5", "javascriptcore-rs-sys", ] @@ -1842,10 +2001,10 @@ version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "af1be78d14ffa4b75b66df31840478fef72b51f8c2465d4ca7c194da9f7a5124" dependencies = [ - "glib-sys", - "gobject-sys", + "glib-sys 0.18.1", + "gobject-sys 0.18.0", "libc", - "system-deps", + "system-deps 6.2.2", ] [[package]] @@ -1949,7 +2108,7 @@ version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "03589b9607c868cc7ae54c0b2a22c8dc03dd41692d48f2d7df73615c6a95dc0a" dependencies = [ - "glib", + "glib 0.18.5", "gtk", "gtk-sys", "libappindicator-sys", @@ -2039,6 +2198,12 @@ dependencies = [ "web_atoms", ] +[[package]] +name = "matchit" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47e1ffaa40ddd1f3ed91f717a33c8c0ee23fff369e3aa8772b9605cc1d22f4c3" + [[package]] name = "memchr" version = "2.8.0" @@ -2187,9 +2352,17 @@ checksum = "d49e936b501e5c5bf01fda3a9452ff86dc3ea98ad5f283e1455153142d97518c" dependencies = [ "bitflags 2.11.1", "block2", + "libc", "objc2", + "objc2-cloud-kit", + "objc2-core-data", "objc2-core-foundation", + "objc2-core-graphics", + "objc2-core-image", + "objc2-core-text", + "objc2-core-video", "objc2-foundation", + "objc2-quartz-core", ] [[package]] @@ -2209,6 +2382,7 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0b402a653efbb5e82ce4df10683b6b28027616a2715e90009947d50b8dd298fa" dependencies = [ + "bitflags 2.11.1", "objc2", "objc2-foundation", ] @@ -2269,6 +2443,19 @@ dependencies = [ "objc2-core-graphics", ] +[[package]] +name = "objc2-core-video" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d425caf1df73233f29fd8a5c3e5edbc30d2d4307870f802d18f00d83dc5141a6" +dependencies = [ + "bitflags 2.11.1", + "objc2", + "objc2-core-foundation", + "objc2-core-graphics", + "objc2-io-surface", +] + [[package]] name = "objc2-encode" version = "4.1.0" @@ -2292,6 +2479,7 @@ checksum = "e3e0adef53c21f888deb4fa59fc59f7eb17404926ee8a6f59f5df0fd7f9f3272" dependencies = [ "bitflags 2.11.1", "block2", + "libc", "objc2", "objc2-core-foundation", ] @@ -2307,6 +2495,16 @@ dependencies = [ "objc2-core-foundation", ] +[[package]] +name = "objc2-javascript-core" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a1e6550c4caed348956ce3370c9ffeca70bb1dbed4fa96112e7c6170e074586" +dependencies = [ + "objc2", + "objc2-core-foundation", +] + [[package]] name = "objc2-quartz-core" version = "0.3.2" @@ -2319,6 +2517,17 @@ dependencies = [ "objc2-foundation", ] +[[package]] +name = "objc2-security" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "709fe137109bd1e8b5a99390f77a7d8b2961dafc1a1c5db8f2e60329ad6d895a" +dependencies = [ + "bitflags 2.11.1", + "objc2", + "objc2-core-foundation", +] + [[package]] name = "objc2-ui-kit" version = "0.3.2" @@ -2362,6 +2571,8 @@ dependencies = [ "objc2-app-kit", "objc2-core-foundation", "objc2-foundation", + "objc2-javascript-core", + "objc2-security", ] [[package]] @@ -2370,6 +2581,17 @@ version = "1.21.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50" +[[package]] +name = "open" +version = "5.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd8d3b65c44123a56e0133d2cd06ce4361bd3ca99d41198b2f25e3c3db9b8b4a" +dependencies = [ + "dunce", + "is-wsl", + "libc", +] + [[package]] name = "option-ext" version = "0.2.0" @@ -2393,7 +2615,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7ca27ec1eb0457ab26f3036ea52229edbdb74dee1edd29063f5b9b010e7ebee4" dependencies = [ "gio", - "glib", + "glib 0.18.5", "libc", "once_cell", "pango-sys", @@ -2405,10 +2627,10 @@ version = "0.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "436737e391a843e5933d6d9aa102cb126d501e815b83601365a948a518555dc5" dependencies = [ - "glib-sys", - "gobject-sys", + "glib-sys 0.18.1", + "gobject-sys 0.18.0", "libc", - "system-deps", + "system-deps 6.2.2", ] [[package]] @@ -2920,6 +3142,12 @@ version = "1.0.22" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" +[[package]] +name = "ryu" +version = "1.0.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9774ba4a74de5f7b1c1451ed6cd5285a32eddb5cccb8cc655a4e50009e06477f" + [[package]] name = "same-file" version = "1.0.6" @@ -3087,6 +3315,17 @@ dependencies = [ "zmij", ] +[[package]] +name = "serde_path_to_error" +version = "0.1.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "10a9ff822e371bb5403e391ecd83e182e0e77ba7f6fe0160b795797109d1b457" +dependencies = [ + "itoa", + "serde", + "serde_core", +] + [[package]] name = "serde_repr" version = "0.1.20" @@ -3116,6 +3355,18 @@ dependencies = [ "serde_core", ] +[[package]] +name = "serde_urlencoded" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" +dependencies = [ + "form_urlencoded", + "itoa", + "ryu", + "serde", +] + [[package]] name = "serde_with" version = "3.20.0" @@ -3270,7 +3521,7 @@ checksum = "471f924a40f31251afc77450e781cb26d55c0b650842efafc9c6cbd2f7cc4f9f" dependencies = [ "futures-channel", "gio", - "glib", + "glib 0.18.5", "libc", "soup3-sys", ] @@ -3281,11 +3532,11 @@ version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7ebe8950a680a12f24f15ebe1bf70db7af98ad242d9db43596ad3108aab86c27" dependencies = [ - "gio-sys", - "glib-sys", - "gobject-sys", + "gio-sys 0.18.1", + "glib-sys 0.18.1", + "gobject-sys 0.18.0", "libc", - "system-deps", + "system-deps 6.2.2", ] [[package]] @@ -3382,13 +3633,26 @@ version = "6.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a3e535eb8dded36d55ec13eddacd30dec501792ff23a0b1682c38601b8cf2349" dependencies = [ - "cfg-expr", + "cfg-expr 0.15.8", "heck 0.5.0", "pkg-config", "toml 0.8.2", "version-compare", ] +[[package]] +name = "system-deps" +version = "7.0.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "396a35feb67335377e0251fcbc1092fc85c484bd4e3a7a54319399da127796e7" +dependencies = [ + "cfg-expr 0.20.8", + "heck 0.5.0", + "pkg-config", + "toml 1.1.2+spec-1.1.0", + "version-compare", +] + [[package]] name = "tao" version = "0.35.2" @@ -3446,6 +3710,12 @@ version = "0.12.16" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "61c41af27dd6d1e27b1b16b489db798443478cef1f06a660c96db617ba5de3b1" +[[package]] +name = "target-lexicon" +version = "0.13.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "adb6935a6f5c20170eeceb1a3835a49e12e19d792f6dd344ccc76a985ca5a6ca" + [[package]] name = "tauri" version = "2.11.1" @@ -3559,6 +3829,44 @@ dependencies = [ "tauri-utils", ] +[[package]] +name = "tauri-plugin" +version = "2.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74be5dd4bed9afbd145e5716b5fa2ec28cbc29c34ffa61c258c9273d896c8020" +dependencies = [ + "anyhow", + "glob", + "plist", + "schemars 0.8.22", + "serde", + "serde_json", + "tauri-utils", + "walkdir", +] + +[[package]] +name = "tauri-plugin-opener" +version = "2.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17e1bea14edce6b793a04e2417e3fd924b9bc4faae83cdee7d714156cceeed29" +dependencies = [ + "dunce", + "glob", + "objc2-app-kit", + "objc2-foundation", + "open", + "schemars 0.8.22", + "serde", + "serde_json", + "tauri", + "tauri-plugin", + "thiserror 2.0.18", + "url", + "windows", + "zbus", +] + [[package]] name = "tauri-plugin-single-instance" version = "2.4.2" @@ -3574,6 +3882,56 @@ dependencies = [ "zbus", ] +[[package]] +name = "tauri-plugin-wdio" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8aa9b559f110924b9897793767a3bb4880c195db75838030eb224f94d21565d9" +dependencies = [ + "log", + "serde", + "serde_json", + "tauri", + "tauri-build", + "tauri-plugin", + "thiserror 1.0.69", + "tokio", + "uuid", +] + +[[package]] +name = "tauri-plugin-wdio-webdriver" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30c5bffe978c41b06ad44a5f4b5b543405918cf316b98756c678a6431061f2e9" +dependencies = [ + "async-trait", + "axum", + "base64 0.22.1", + "block2", + "cairo-rs", + "glib 0.21.5", + "gtk", + "javascriptcore-rs", + "objc2", + "objc2-app-kit", + "objc2-foundation", + "objc2-web-kit", + "serde", + "serde_json", + "tauri", + "tauri-plugin", + "tempfile", + "thiserror 2.0.18", + "tokio", + "tracing", + "uuid", + "webkit2gtk", + "webview2-com", + "windows", + "windows-core 0.61.2", +] + [[package]] name = "tauri-runtime" version = "2.11.1" @@ -3627,9 +3985,9 @@ dependencies = [ [[package]] name = "tauri-utils" -version = "2.9.1" +version = "2.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d57200389a2f82b4b0a40ae29ca19b6978116e8f4d4e974c3234ce40c0ffbdec" +checksum = "3e176a18e67764923c4f1ce66f25ae4abe5f688384d5eb1a0fa6c77f3d90f887" dependencies = [ "anyhow", "brotli", @@ -3804,9 +4162,21 @@ dependencies = [ "mio", "pin-project-lite", "socket2", + "tokio-macros", "windows-sys 0.61.2", ] +[[package]] +name = "tokio-macros" +version = "2.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6328af13490e73a9b4694030fafd93f8c8c6a9dede33e821c3fc63eddf8042ba" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + [[package]] name = "tokio-util" version = "0.7.18" @@ -3953,6 +4323,7 @@ dependencies = [ "tokio", "tower-layer", "tower-service", + "tracing", ] [[package]] @@ -3991,6 +4362,7 @@ version = "0.1.44" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "63e71662fa4b2a2c3a26f570f037eb95bb1f85397f3cd8076caed2f026a6d100" dependencies = [ + "log", "pin-project-lite", "tracing-attributes", "tracing-core", @@ -4451,10 +4823,10 @@ dependencies = [ "gdk", "gdk-sys", "gio", - "gio-sys", - "glib", - "glib-sys", - "gobject-sys", + "gio-sys 0.18.1", + "glib 0.18.5", + "glib-sys 0.18.1", + "gobject-sys 0.18.0", "gtk", "gtk-sys", "javascriptcore-rs", @@ -4473,15 +4845,15 @@ dependencies = [ "bitflags 1.3.2", "cairo-sys-rs", "gdk-sys", - "gio-sys", - "glib-sys", - "gobject-sys", + "gio-sys 0.18.1", + "glib-sys 0.18.1", + "gobject-sys 0.18.0", "gtk-sys", "javascriptcore-rs-sys", "libc", "pkg-config", "soup3-sys", - "system-deps", + "system-deps 6.2.2", ] [[package]] diff --git a/frontends/desktop/src-tauri/Cargo.toml b/frontends/desktop/src-tauri/Cargo.toml index 3914e307e..d11d9c00a 100644 --- a/frontends/desktop/src-tauri/Cargo.toml +++ b/frontends/desktop/src-tauri/Cargo.toml @@ -1,19 +1,26 @@ [package] name = "ga-desktop" -version = "0.1.8" +version = "0.2.0" edition = "2021" [build-dependencies] tauri-build = { version = "2", features = [] } [dependencies] -tauri = { version = "2", features = ["devtools"] } +tauri = { version = "2", features = ["devtools", "tray-icon"] } tauri-plugin-single-instance = "2" +tauri-plugin-opener = "2" +tauri-plugin-wdio = { version = "1.2.0", optional = true } +tauri-plugin-wdio-webdriver = { version = "1.2.0", optional = true } serde = { version = "1", features = ["derive"] } serde_json = "1" dirs = "5" rfd = "0.15" +[features] +default = [] +e2e = ["dep:tauri-plugin-wdio", "dep:tauri-plugin-wdio-webdriver"] + [lib] name = "ga_desktop_lib" crate-type = ["lib", "cdylib", "staticlib"] diff --git a/frontends/desktop/src-tauri/build.rs b/frontends/desktop/src-tauri/build.rs index 97ab5de72..2b5d70c5c 100644 --- a/frontends/desktop/src-tauri/build.rs +++ b/frontends/desktop/src-tauri/build.rs @@ -1,25 +1,39 @@ use std::process::Command; +fn git_text(args: &[&str]) -> Option { + Command::new("git") + .args(args) + .output() + .ok() + .filter(|output| output.status.success()) + .map(|output| String::from_utf8_lossy(&output.stdout).trim().to_string()) + .filter(|value| !value.is_empty()) +} + fn main() { // Build identity used to decide whether a bridge already holding :14168 belongs to THIS // build. commit hash + build timestamp → distinct on every build, even when the human // version in tauri.conf.json is unchanged (so same-version re-publishes still take over // a stale bridge). The bridge reports this back via GET /services/identity. - let commit = Command::new("git") - .args(["rev-parse", "--short", "HEAD"]) - .output() - .ok() - .filter(|o| o.status.success()) - .map(|o| String::from_utf8_lossy(&o.stdout).trim().to_string()) - .filter(|s| !s.is_empty()) - .unwrap_or_else(|| "nogit".to_string()); + let source_revision = git_text(&["rev-parse", "HEAD"]).unwrap_or_else(|| "nogit".to_string()); + let short_revision: String = source_revision.chars().take(12).collect(); let stamp = std::time::SystemTime::now() .duration_since(std::time::UNIX_EPOCH) .map(|d| d.as_secs()) .unwrap_or(0); - println!("cargo:rustc-env=GA_BUILD_ID={}-{}", commit, stamp); - // Re-run when the checked-out commit changes so the id stays fresh. - println!("cargo:rerun-if-changed=../../../.git/HEAD"); + println!("cargo:rustc-env=GA_BUILD_ID={}-{}", short_revision, stamp); + println!("cargo:rustc-env=GA_SOURCE_REVISION={source_revision}"); + // Watch both HEAD and its resolved branch ref. This works in ordinary + // checkouts, detached CI checkouts, and linked worktrees; watching only + // `/.git/HEAD` misses branch advances and is invalid in a worktree. + if let Some(head_path) = git_text(&["rev-parse", "--git-path", "HEAD"]) { + println!("cargo:rerun-if-changed={head_path}"); + } + if let Some(head_ref) = git_text(&["symbolic-ref", "-q", "HEAD"]) { + if let Some(ref_path) = git_text(&["rev-parse", "--git-path", &head_ref]) { + println!("cargo:rerun-if-changed={ref_path}"); + } + } tauri_build::build() } diff --git a/frontends/desktop/src-tauri/capabilities/default.json b/frontends/desktop/src-tauri/capabilities/default.json index e5401c2cf..5ae79f0d9 100644 --- a/frontends/desktop/src-tauri/capabilities/default.json +++ b/frontends/desktop/src-tauri/capabilities/default.json @@ -1,29 +1,29 @@ { "identifier": "default", - "description": "Default capabilities for all windows", - "windows": ["main", "setup"], - "remote": { - "urls": ["http://127.0.0.1:14168", "http://localhost:14168"] - }, + "description": "Least-privilege capabilities for the main application window", + "windows": ["main"], "permissions": [ - "core:default", - "core:window:default", - "core:window:allow-show", - "core:window:allow-hide", - "core:window:allow-set-focus", + "core:event:allow-listen", + "core:event:allow-unlisten", + "core:window:allow-minimize", + "core:window:allow-toggle-maximize", "core:window:allow-close", - "core:window:allow-get-all-windows", - "core:webview:default", + "core:window:allow-start-dragging", "allow-start-bridge", - "allow-start-bridge-with-config", - "allow-get-config", + "allow-retry-bootstrap", + "allow-get-bootstrap-snapshot", "allow-export-mykey", "allow-pick-directory", + "allow-pick-data-backup-file", + "allow-pick-data-export-path", + "allow-reveal-in-file-manager", "allow-get-ga-source", + "allow-validate-ga-source", "allow-set-ga-source", "allow-clear-ga-source", - "allow-move-ga-runtime", "allow-shortcut-should-ask", - "allow-shortcut-decide" + "allow-shortcut-decide", + "opener:allow-open-url", + "opener:allow-default-urls" ] } diff --git a/frontends/desktop/src-tauri/capabilities/setup.json b/frontends/desktop/src-tauri/capabilities/setup.json new file mode 100644 index 000000000..4e94ab66b --- /dev/null +++ b/frontends/desktop/src-tauri/capabilities/setup.json @@ -0,0 +1,16 @@ +{ + "identifier": "setup", + "description": "Startup-recovery commands for the setup window only", + "windows": ["setup"], + "permissions": [ + "core:event:allow-listen", + "core:event:allow-unlisten", + "allow-start-bridge-with-config", + "allow-retry-bootstrap", + "allow-get-bootstrap-snapshot", + "allow-get-config", + "allow-discover-python-for-project", + "allow-pick-directory", + "allow-pick-python-interpreter" + ] +} diff --git a/frontends/desktop/src-tauri/permissions/bridge-commands.toml b/frontends/desktop/src-tauri/permissions/bridge-commands.toml index 27dc07df9..002b7f1d3 100644 --- a/frontends/desktop/src-tauri/permissions/bridge-commands.toml +++ b/frontends/desktop/src-tauri/permissions/bridge-commands.toml @@ -8,11 +8,26 @@ identifier = "allow-start-bridge-with-config" description = "Spawn bridge from setup with explicit python/project paths." commands.allow = ["start_bridge_with_config"] +[[permission]] +identifier = "allow-retry-bootstrap" +description = "Retry the unified desktop bootstrap with validated Python and project paths." +commands.allow = ["retry_bootstrap"] + +[[permission]] +identifier = "allow-get-bootstrap-snapshot" +description = "Read the current desktop bootstrap state and filtered diagnostics." +commands.allow = ["get_bootstrap_snapshot"] + [[permission]] identifier = "allow-get-config" description = "Read saved bridge spawn configuration." commands.allow = ["get_config"] +[[permission]] +identifier = "allow-discover-python-for-project" +description = "Discover a usable Python environment for a selected application folder." +commands.allow = ["discover_python_for_project"] + [[permission]] identifier = "allow-export-mykey" description = "Save mykey.py via native file dialog." @@ -20,14 +35,39 @@ commands.allow = ["export_mykey"] [[permission]] identifier = "allow-pick-directory" -description = "Pick a source directory via native folder dialog (import memory)." +description = "Pick a local application, data, or repository directory via a native folder dialog." commands.allow = ["pick_directory"] +[[permission]] +identifier = "allow-pick-python-interpreter" +description = "Pick a Python environment through a native file dialog." +commands.allow = ["pick_python_interpreter"] + +[[permission]] +identifier = "allow-pick-data-backup-file" +description = "Pick a desktop data backup ZIP via a native file dialog." +commands.allow = ["pick_data_backup_file"] + +[[permission]] +identifier = "allow-pick-data-export-path" +description = "Choose the destination for a desktop data backup ZIP." +commands.allow = ["pick_data_export_path"] + +[[permission]] +identifier = "allow-reveal-in-file-manager" +description = "Reveal a completed local export in the system file manager." +commands.allow = ["reveal_in_file_manager"] + [[permission]] identifier = "allow-get-ga-source" description = "Read the user-set external GenericAgent source directory." commands.allow = ["get_ga_source"] +[[permission]] +identifier = "allow-validate-ga-source" +description = "Validate a local repository without persisting or reconnecting." +commands.allow = ["validate_ga_source"] + [[permission]] identifier = "allow-set-ga-source" description = "Point the desktop shell at an external GenericAgent source and restart the bridge." @@ -47,8 +87,3 @@ commands.allow = ["shortcut_should_ask"] identifier = "allow-shortcut-decide" description = "Persist the user's desktop-shortcut choice and create it if enabled." commands.allow = ["shortcut_decide"] - -[[permission]] -identifier = "allow-move-ga-runtime" -description = "Copy the current GA workspace to a user-selected folder and switch to it." -commands.allow = ["move_ga_runtime"] diff --git a/frontends/desktop/src-tauri/src/lib.rs b/frontends/desktop/src-tauri/src/lib.rs index c0b63df0f..1286bd094 100644 --- a/frontends/desktop/src-tauri/src/lib.rs +++ b/frontends/desktop/src-tauri/src/lib.rs @@ -1,27 +1,394 @@ -use std::process::{Command, Child, Stdio}; -use std::io::{BufRead, BufReader}; -use std::sync::Mutex; -use std::net::TcpStream; -use std::time::{Duration, Instant}; -use std::thread; +use serde::{Deserialize, Serialize}; +use std::collections::VecDeque; +use std::fs::OpenOptions; +use std::io::{BufRead, BufReader, Write}; +use std::net::{SocketAddr, TcpStream, ToSocketAddrs}; use std::path::{Path, PathBuf}; -use tauri::Manager; +use std::process::{Child, Command, Stdio}; +use std::sync::{LazyLock, Mutex}; +use std::thread; +use std::time::{Duration, Instant}; +use tauri::{Emitter, Manager}; #[cfg(windows)] use std::os::windows::process::CommandExt; +#[cfg(windows)] +use tauri::menu::{MenuBuilder, MenuItemBuilder}; +#[cfg(windows)] +use tauri::tray::{MouseButton, MouseButtonState, TrayIconBuilder, TrayIconEvent}; + static BRIDGE_PROCESS: Mutex> = Mutex::new(None); +static BRIDGE_LOG_READERS: Mutex>> = Mutex::new(Vec::new()); +static SETTINGS_WRITE_LOCK: Mutex<()> = Mutex::new(()); + +#[derive(Clone, Debug, PartialEq)] +struct BridgeEndpoint { + host: String, + port: u16, +} + +impl BridgeEndpoint { + fn socket_addr(&self) -> String { + format!("{}:{}", self.host, self.port) + } + + fn tcp_addr(&self) -> Option { + (self.host.as_str(), self.port) + .to_socket_addrs() + .ok()? + .find(|addr| addr.ip().is_loopback()) + } +} + +fn bridge_endpoint_from_values( + host: Option<&str>, + port: Option<&str>, +) -> Result { + let host = host.unwrap_or("127.0.0.1").trim(); + if host != "127.0.0.1" && host != "localhost" && host != "::1" { + return Err("BRIDGE_HOST must be loopback".to_string()); + } + let port = port + .unwrap_or("14168") + .parse::() + .map_err(|_| "BRIDGE_PORT must be between 1 and 65535".to_string())?; + if port == 0 { + return Err("BRIDGE_PORT must be between 1 and 65535".to_string()); + } + Ok(BridgeEndpoint { + host: host.to_string(), + port, + }) +} + +fn bridge_endpoint() -> BridgeEndpoint { + bridge_endpoint_from_values( + std::env::var("BRIDGE_HOST").ok().as_deref(), + std::env::var("BRIDGE_PORT").ok().as_deref(), + ) + .unwrap_or(BridgeEndpoint { + host: "127.0.0.1".to_string(), + port: 14168, + }) +} + +const MAX_DIAGNOSTIC_LINES: usize = 100; +const MAX_DIAGNOSTIC_LINE_BYTES: usize = 2 * 1024; + +fn sanitize_diagnostic_line(line: &str) -> String { + let lower = line.to_ascii_lowercase(); + const SENSITIVE_MARKERS: [&str; 12] = [ + "apikey", + "api_key", + "authorization", + "bearer", + "secret", + "token", + "mykey", + "[session]", + "[turn]", + "memory", + "conversation", + "llm_history", + ]; + if SENSITIVE_MARKERS + .iter() + .any(|marker| lower.contains(marker)) + { + return "[redacted sensitive diagnostic line]".to_string(); + } + + let mut end = line.len().min(MAX_DIAGNOSTIC_LINE_BYTES); + while end > 0 && !line.is_char_boundary(end) { + end -= 1; + } + line[..end].to_string() +} + +fn push_bounded_log(logs: &mut VecDeque, line: &str) { + logs.push_back(sanitize_diagnostic_line(line)); + while logs.len() > MAX_DIAGNOSTIC_LINES { + logs.pop_front(); + } +} + +#[derive(Debug, PartialEq)] +enum ListenerIdentity { + Owned, + KnownGenericAgent, + Foreign, +} + +fn classify_listener_identity( + identity: Option<&serde_json::Value>, + project_dir: &str, +) -> ListenerIdentity { + let Some(identity) = identity else { + return ListenerIdentity::Foreign; + }; + let reported_root = identity + .get("ga_root") + .and_then(|value| value.as_str()) + .unwrap_or(""); + let reported_build = identity + .get("build_id") + .and_then(|value| value.as_str()) + .unwrap_or(""); + let reported_pid = identity + .get("pid") + .and_then(|value| value.as_u64()) + .unwrap_or(0); + if reported_root.is_empty() || reported_pid == 0 { + return ListenerIdentity::Foreign; + } + let same_root = { + let (reported, expected) = (norm_path(reported_root), norm_path(project_dir)); + #[cfg(windows)] + { + reported.eq_ignore_ascii_case(&expected) + } + #[cfg(not(windows))] + { + reported == expected + } + }; + if same_root && reported_build == env!("GA_BUILD_ID") { + ListenerIdentity::Owned + } else { + ListenerIdentity::KnownGenericAgent + } +} + +#[cfg(any(windows, test))] +fn should_retry_without_breakaway(raw_os_error: Option) -> bool { + raw_os_error == Some(5) +} + +#[derive(Clone, Copy, Debug, Deserialize, Serialize)] +#[serde(rename_all = "snake_case")] +enum BootstrapMode { + HotStart, + ColdStart, + Prepare, +} + +#[derive(Clone, Copy, Debug, Deserialize, Serialize)] +#[serde(rename_all = "snake_case")] +enum BootstrapPhase { + Idle, + Resolving, + Preparing, + StartingService, + OpeningUi, + Ready, + Failed, +} + +#[derive(Clone, Copy, Debug, Deserialize, Serialize, PartialEq, Eq)] +#[serde(rename_all = "snake_case")] +enum BootstrapFailureCode { + ConfigUnresolved, + PrepareFailed, + SpawnFailed, + BridgeShutdownRefused, + PortConflict, + ServiceTimeout, + ServiceExited, + UiNavigationFailed, + Unknown, +} + +#[derive(Clone, Copy, Debug, Deserialize, Serialize)] +#[serde(rename_all = "snake_case")] +enum PortState { + Free, + Owned, + Foreign, + Unknown, +} + +#[derive(Clone, Debug, Deserialize, Serialize)] +struct BootstrapFailure { + code: BootstrapFailureCode, + detail: String, +} + +#[derive(Clone, Debug, Deserialize, Serialize)] +#[serde(rename_all = "camelCase")] +struct BootstrapDiagnostics { + build_id: String, + platform: String, + project_dir: String, + python_path: String, + port_state: PortState, + bridge_identity: Option, + recent_logs: Vec, +} + +#[derive(Clone, Debug, Deserialize, Serialize)] +struct BootstrapSnapshot { + seq: u64, + mode: BootstrapMode, + phase: BootstrapPhase, + stage: Option, + progress: u8, + failure: Option, + diagnostics: BootstrapDiagnostics, +} + +fn current_platform() -> String { + #[cfg(windows)] + { + "windows".to_string() + } + #[cfg(target_os = "macos")] + { + "macos".to_string() + } + #[cfg(all(not(windows), not(target_os = "macos")))] + { + "linux".to_string() + } +} -/// Last first-run prepare error, surfaced to the setup window (fallback.html) so the -/// user sees WHY the install failed instead of a generic "configure paths" screen. -static PREPARE_ERROR: Mutex> = Mutex::new(None); +static BOOTSTRAP_STATE: LazyLock> = LazyLock::new(|| { + Mutex::new(BootstrapSnapshot { + seq: 0, + mode: BootstrapMode::ColdStart, + phase: BootstrapPhase::Idle, + stage: None, + progress: 0, + failure: None, + diagnostics: BootstrapDiagnostics { + build_id: env!("GA_BUILD_ID").to_string(), + platform: current_platform(), + project_dir: String::new(), + python_path: String::new(), + port_state: PortState::Unknown, + bridge_identity: None, + recent_logs: Vec::new(), + }, + }) +}); + +fn write_e2e_bootstrap_snapshot(snapshot: &BootstrapSnapshot) { + let Some(report_dir) = std::env::var_os("GA_DESKTOP_E2E_REPORT_DIR") else { + return; + }; + let report_dir = PathBuf::from(report_dir); + if report_dir.as_os_str().is_empty() { + return; + } + if std::fs::create_dir_all(&report_dir).is_err() { + return; + } + + let Ok(line) = serde_json::to_string(snapshot) else { + return; + }; + if let Ok(mut file) = OpenOptions::new() + .create(true) + .append(true) + .open(report_dir.join("bootstrap-events.jsonl")) + { + let _ = writeln!(file, "{line}"); + } + + if let Ok(json) = serde_json::to_vec_pretty(snapshot) { + let _ = std::fs::write(report_dir.join("bootstrap-latest.json"), json); + } +} + +fn snapshot_update( + app_handle: Option<&tauri::AppHandle>, + update: impl FnOnce(&mut BootstrapSnapshot), +) -> BootstrapSnapshot { + let snapshot = { + let mut state = BOOTSTRAP_STATE.lock().unwrap(); + update(&mut state); + state.seq = state.seq.saturating_add(1); + state.clone() + }; + if let Some(app_handle) = app_handle { + let _ = app_handle.emit("bootstrap", snapshot.clone()); + } + write_e2e_bootstrap_snapshot(&snapshot); + snapshot +} + +fn begin_bootstrap( + app_handle: &tauri::AppHandle, + mode: BootstrapMode, + python_path: &str, + project_dir: &str, +) { + snapshot_update(Some(app_handle), |snapshot| { + snapshot.mode = mode; + snapshot.phase = BootstrapPhase::Resolving; + snapshot.stage = Some("validate".to_string()); + snapshot.progress = 5; + snapshot.failure = None; + snapshot.diagnostics.project_dir = project_dir.to_string(); + snapshot.diagnostics.python_path = python_path.to_string(); + snapshot.diagnostics.port_state = PortState::Unknown; + snapshot.diagnostics.bridge_identity = None; + snapshot.diagnostics.recent_logs.clear(); + }); +} + +fn set_bootstrap_phase( + app_handle: &tauri::AppHandle, + phase: BootstrapPhase, + stage: Option<&str>, + progress: u8, +) { + snapshot_update(Some(app_handle), |snapshot| { + snapshot.phase = phase; + snapshot.stage = stage.map(str::to_string); + snapshot.progress = progress.min(100); + snapshot.failure = None; + }); +} + +fn record_diagnostic_log(app_handle: &tauri::AppHandle, line: &str) { + if matches!( + BOOTSTRAP_STATE.lock().unwrap().phase, + BootstrapPhase::Ready | BootstrapPhase::Failed + ) { + return; + } + snapshot_update(Some(app_handle), |snapshot| { + let mut logs: VecDeque = snapshot.diagnostics.recent_logs.drain(..).collect(); + push_bounded_log(&mut logs, line); + snapshot.diagnostics.recent_logs = logs.into_iter().collect(); + }); +} + +fn set_port_diagnostics( + app_handle: &tauri::AppHandle, + port_state: PortState, + identity: Option<&serde_json::Value>, +) { + snapshot_update(Some(app_handle), |snapshot| { + snapshot.diagnostics.port_state = port_state; + snapshot.diagnostics.bridge_identity = identity.map(ToString::to_string); + }); +} + +#[tauri::command] +fn get_bootstrap_snapshot() -> BootstrapSnapshot { + BOOTSTRAP_STATE.lock().unwrap().clone() +} /// Get project root (parent of frontends/) fn project_root() -> PathBuf { std::env::current_exe() .expect("cannot get exe path") - .parent().expect("cannot get exe dir") // frontends/ - .parent().expect("cannot get project root") // project root + .parent() + .expect("cannot get exe dir") // frontends/ + .parent() + .expect("cannot get project root") // project root .to_path_buf() } @@ -53,7 +420,12 @@ fn bundle_anchor_dir() -> Option { while let Some(dir) = d { if dir.extension().and_then(|s| s.to_str()) == Some("app") { let resources = dir.join("Contents").join("Resources"); - if resources.join("runtime").join("app").join("agentmain.py").exists() { + if resources + .join("runtime") + .join("app") + .join("agentmain.py") + .exists() + { return Some(resources); } if let Some(parent) = dir.parent() { @@ -74,53 +446,135 @@ fn bundle_python() -> Option { let p = root.join("python").join("python.exe"); #[cfg(not(windows))] let p = root.join("python").join("bin").join("python3"); - if p.exists() { Some(p) } else { None } + if p.exists() { + Some(p) + } else { + None + } +} + +fn platform_python_name() -> &'static str { + #[cfg(windows)] + { + "python" + } + #[cfg(not(windows))] + { + "python3" + } +} + +fn project_venv_python(project: &Path) -> PathBuf { + #[cfg(windows)] + { + project.join(".venv").join("Scripts").join("python.exe") + } + #[cfg(not(windows))] + { + project.join(".venv").join("bin").join("python") + } +} + +fn portable_python(project: &Path) -> Option { + let root = project.join(".portable").join("uv-python"); + #[cfg(windows)] + let direct = root.join("python.exe"); + #[cfg(not(windows))] + let direct = root.join("bin").join("python3"); + if direct.is_file() { + return Some(direct); + } + + let mut children = std::fs::read_dir(root) + .ok()? + .flatten() + .map(|entry| entry.path()) + .filter(|path| path.is_dir()) + .collect::>(); + children.sort(); + children.into_iter().find_map(|path| { + #[cfg(windows)] + let python = path.join("python.exe"); + #[cfg(not(windows))] + let python = path.join("bin").join("python3"); + python.is_file().then_some(python) + }) +} + +fn discover_python_for_project_path(project: &Path, saved_python: Option<&str>) -> String { + if let Some(python) = bundle_python() { + return display_path(&python); + } + let venv = project_venv_python(project); + if venv.is_file() { + return display_path(&venv); + } + if let Some(python) = portable_python(project) { + return display_path(&python); + } + if let Some(python) = saved_python + .map(str::trim) + .filter(|python| python_interpreter_resolves(python)) + { + return python.to_string(); + } + let fallback = platform_python_name(); + if python_interpreter_resolves(fallback) { + fallback.to_string() + } else { + String::new() + } } -/// Find python executable: -/// 1. The embedded bundle python (runtime/python) — deps are installed directly into it -/// (no venv), and its path is resolved relative to the bundle anchor at runtime, so the -/// package stays relocatable (moving the folder doesn't break absolute venv paths). -/// 2. .portable/uv-python/ 下找 python.exe (Windows) 或 python3 (Unix) -/// 3. Fallback to system PATH +/// Resolve package, project-local, portable, saved, then PATH Python in that order. fn find_python() -> String { - if let Some(p) = bundle_python() { - return p.to_string_lossy().to_string(); - } - let root = project_root(); - let portable_python_dir = root.join(".portable").join("uv-python"); - - if portable_python_dir.exists() { - // uv installs python like: uv-python/cpython-3.12.x-windows-x86_64/python.exe - // We need to search for python.exe inside subdirectories - if let Ok(entries) = std::fs::read_dir(&portable_python_dir) { - for entry in entries.flatten() { - let path = entry.path(); - if path.is_dir() { - #[cfg(windows)] - { - let py = path.join("python.exe"); - if py.exists() { - return py.to_string_lossy().to_string(); - } - } - #[cfg(not(windows))] - { - let py = path.join("bin").join("python3"); - if py.exists() { - return py.to_string_lossy().to_string(); - } - } + let discovered = discover_python_for_project_path(&project_root(), None); + if discovered.is_empty() { + platform_python_name().to_string() + } else { + discovered + } +} + +fn python_interpreter_resolves(python_path: &str) -> bool { + let python_path = python_path.trim(); + if python_path.is_empty() { + return false; + } + + let explicit_path = python_path.contains('/') || python_path.contains('\\'); + if explicit_path { + return PathBuf::from(python_path).is_file(); + } + + let Some(path_entries) = std::env::var_os("PATH") else { + return false; + }; + for directory in std::env::split_paths(&path_entries) { + if directory.join(python_path).is_file() { + return true; + } + #[cfg(windows)] + { + let extensions = + std::env::var("PATHEXT").unwrap_or_else(|_| ".EXE;.CMD;.BAT".to_string()); + for extension in extensions + .split(';') + .filter(|extension| !extension.is_empty()) + { + if directory + .join(format!("{python_path}{extension}")) + .is_file() + || directory + .join(format!("{python_path}{}", extension.to_ascii_lowercase())) + .is_file() + { + return true; } } } } - - // Fallback: system PATH - #[cfg(windows)] - { "python".to_string() } - #[cfg(not(windows))] - { "python3".to_string() } + false } /// Find the project directory (folder containing agentmain.py). @@ -151,49 +605,287 @@ fn find_project_dir() -> Option { None } -/// Settings file path: ~/.ga_desktop_settings.json -fn settings_path() -> PathBuf { - dirs::home_dir() +fn resolve_settings_path(home_dir: Option, e2e_override: Option<&str>) -> PathBuf { + if let Some(path) = e2e_override.filter(|path| !path.trim().is_empty()) { + return PathBuf::from(path); + } + home_dir .unwrap_or_else(|| PathBuf::from(".")) .join(".ga_desktop_settings.json") } +/// Settings file path: ~/.ga_desktop_settings.json. +/// +/// Windows resolves the home directory through Known Folders and ignores an overridden +/// USERPROFILE. E2E builds therefore accept an explicit sandbox-owned settings file; the +/// production feature set never reads this override. +fn settings_path() -> PathBuf { + #[cfg(feature = "e2e")] + let e2e_override = if std::env::var("GA_E2E").ok().as_deref() == Some("1") { + std::env::var("GA_E2E_SETTINGS_PATH").ok() + } else { + None + }; + #[cfg(not(feature = "e2e"))] + let e2e_override: Option = None; + + resolve_settings_path(dirs::home_dir(), e2e_override.as_deref()) +} + +fn read_settings_from_strict( + path: &Path, +) -> Result, String> { + if !path.exists() { + return Ok(serde_json::Map::new()); + } + let content = std::fs::read_to_string(path) + .map_err(|error| format!("cannot read Desktop settings: {error}"))?; + match serde_json::from_str(&content) { + Ok(serde_json::Value::Object(object)) => Ok(object), + Ok(_) => Err("Desktop settings must be a JSON object".to_string()), + Err(error) => Err(format!("cannot parse Desktop settings: {error}")), + } +} + +fn read_settings_from(path: &Path) -> serde_json::Map { + read_settings_from_strict(path).unwrap_or_default() +} + /// Read the settings file as a JSON object (empty object when missing/unparseable). fn read_settings() -> serde_json::Map { - let path = settings_path(); - if let Ok(content) = std::fs::read_to_string(&path) { - if let Ok(serde_json::Value::Object(m)) = serde_json::from_str(&content) { - return m; + read_settings_from(&settings_path()) +} + +#[cfg(windows)] +fn atomic_replace(source: &Path, destination: &Path) -> std::io::Result<()> { + use std::os::windows::ffi::OsStrExt; + + #[link(name = "Kernel32")] + extern "system" { + fn MoveFileExW( + existing_file_name: *const u16, + new_file_name: *const u16, + flags: u32, + ) -> i32; + } + + const MOVEFILE_REPLACE_EXISTING: u32 = 0x1; + const MOVEFILE_WRITE_THROUGH: u32 = 0x8; + let source_wide: Vec = source.as_os_str().encode_wide().chain(Some(0)).collect(); + let destination_wide: Vec = destination + .as_os_str() + .encode_wide() + .chain(Some(0)) + .collect(); + let result = unsafe { + MoveFileExW( + source_wide.as_ptr(), + destination_wide.as_ptr(), + MOVEFILE_REPLACE_EXISTING | MOVEFILE_WRITE_THROUGH, + ) + }; + if result == 0 { + Err(std::io::Error::last_os_error()) + } else { + Ok(()) + } +} + +struct SettingsFileLock { + path: PathBuf, + token: String, +} + +impl SettingsFileLock { + fn acquire(settings: &Path) -> Result { + const TIMEOUT: Duration = Duration::from_secs(5); + const STALE_AFTER: Duration = Duration::from_secs(30); + let parent = settings + .parent() + .ok_or_else(|| "settings path has no parent".to_string())?; + std::fs::create_dir_all(parent) + .map_err(|error| format!("create settings directory: {error}"))?; + let name = settings + .file_name() + .and_then(|part| part.to_str()) + .unwrap_or("ga_desktop_settings.json"); + let path = settings.with_file_name(format!("{name}.lock")); + let nonce = std::time::SystemTime::now() + .duration_since(std::time::UNIX_EPOCH) + .unwrap_or_default() + .as_nanos(); + let token = format!("{}:{nonce}", std::process::id()); + let deadline = Instant::now() + TIMEOUT; + loop { + match std::fs::create_dir(&path) { + Ok(()) => { + if let Err(error) = std::fs::write(path.join("owner"), &token) { + let _ = std::fs::remove_dir(&path); + return Err(format!("write settings lock owner: {error}")); + } + return Ok(Self { path, token }); + } + Err(error) if error.kind() == std::io::ErrorKind::AlreadyExists => { + let metadata = std::fs::symlink_metadata(&path) + .map_err(|error| format!("inspect settings lock: {error}"))?; + if metadata.file_type().is_symlink() || !metadata.is_dir() { + return Err(format!( + "settings lock is not a directory: {}", + display_path(&path) + )); + } + let stale = metadata + .modified() + .ok() + .and_then(|modified| modified.elapsed().ok()) + .map(|age| age > STALE_AFTER) + .unwrap_or(false); + if stale { + let tombstone = path.with_file_name(format!("{name}.lock.stale.{nonce}")); + if std::fs::rename(&path, &tombstone).is_ok() { + let _ = std::fs::remove_dir_all(tombstone); + continue; + } + } + if Instant::now() >= deadline { + return Err(format!( + "timed out waiting for settings lock: {}", + display_path(&path) + )); + } + thread::sleep(Duration::from_millis(50)); + } + Err(error) => return Err(format!("create settings lock: {error}")), + } + } + } +} + +impl Drop for SettingsFileLock { + fn drop(&mut self) { + let owner = self.path.join("owner"); + if std::fs::read_to_string(&owner).ok().as_deref() == Some(self.token.as_str()) { + let _ = std::fs::remove_file(owner); + let _ = std::fs::remove_dir(&self.path); } } - serde_json::Map::new() +} + +#[cfg(not(windows))] +fn atomic_replace(source: &Path, destination: &Path) -> std::io::Result<()> { + std::fs::rename(source, destination) +} + +fn write_settings_atomically(path: &Path, value: &serde_json::Value) -> std::io::Result<()> { + let parent = path.parent().ok_or_else(|| { + std::io::Error::new( + std::io::ErrorKind::InvalidInput, + "settings path has no parent", + ) + })?; + std::fs::create_dir_all(parent)?; + let text = serde_json::to_string_pretty(value) + .map_err(|error| std::io::Error::new(std::io::ErrorKind::InvalidData, error))?; + let nonce = std::time::SystemTime::now() + .duration_since(std::time::UNIX_EPOCH) + .unwrap_or_default() + .as_nanos(); + let name = path + .file_name() + .and_then(|part| part.to_str()) + .unwrap_or("ga_desktop_settings.json"); + let temporary = parent.join(format!(".{name}.{}.{}.tmp", std::process::id(), nonce)); + let result = (|| { + let mut file = OpenOptions::new() + .write(true) + .create_new(true) + .open(&temporary)?; + file.write_all(text.as_bytes())?; + file.write_all(b"\n")?; + file.sync_all()?; + atomic_replace(&temporary, path)?; + #[cfg(unix)] + std::fs::File::open(parent)?.sync_all()?; + Ok(()) + })(); + if result.is_err() { + let _ = std::fs::remove_file(&temporary); + } + result +} + +fn update_settings_at( + path: &Path, + mutator: impl FnOnce(&mut serde_json::Map), +) -> Result<(), String> { + let _file_lock = SettingsFileLock::acquire(path)?; + let mut object = read_settings_from_strict(path)?; + mutator(&mut object); + write_settings_atomically(path, &serde_json::Value::Object(object)) + .map_err(|error| format!("cannot write Desktop settings: {error}")) +} + +fn update_settings( + mutator: impl FnOnce(&mut serde_json::Map), +) -> Result<(), String> { + let _guard = SETTINGS_WRITE_LOCK + .lock() + .unwrap_or_else(|poisoned| poisoned.into_inner()); + update_settings_at(&settings_path(), mutator) } /// Merge `updates` into the existing settings file and write it back, preserving any keys /// we don't touch. The old code rewrote the file with only python_path/project_dir, which /// would silently drop sibling keys like `desktop_shortcut`. Always go through here. -fn merge_settings(updates: serde_json::Value) { - let mut obj = read_settings(); - if let serde_json::Value::Object(m) = updates { - for (k, v) in m { - obj.insert(k, v); - } +fn merge_settings(updates: serde_json::Value) -> Result<(), String> { + if let serde_json::Value::Object(updates) = updates { + return update_settings(move |object| { + for (key, value) in updates { + object.insert(key, value); + } + }); + } + Err("settings update must be a JSON object".to_string()) +} + +fn valid_ga_source_override_from( + settings: &serde_json::Map, +) -> Option { + let source = settings + .get("ga_source_override") + .and_then(|value| value.as_str()) + .unwrap_or("") + .trim(); + if source.is_empty() { + return None; } - let val = serde_json::Value::Object(obj); - if let Ok(text) = serde_json::to_string_pretty(&val) { - let _ = std::fs::write(settings_path(), text); + let path = PathBuf::from(source); + if path.join("agentmain.py").exists() { + Some(display_path(&path)) + } else { + None } } +fn effective_ga_root_from( + project_dir: &str, + settings: &serde_json::Map, +) -> String { + valid_ga_source_override_from(settings) + .unwrap_or_else(|| display_path(&builtin_ga_root(project_dir))) +} + /// Desktop-shortcut preference stored in settings under `desktop_shortcut`. /// None = never asked (first run) /// Some(true)/Some(false) = user's remembered choice. fn read_shortcut_pref() -> Option { - read_settings().get("desktop_shortcut").and_then(|v| v.as_bool()) + read_settings() + .get("desktop_shortcut") + .and_then(|v| v.as_bool()) } -fn write_shortcut_pref(enabled: bool) { - merge_settings(serde_json::json!({ "desktop_shortcut": enabled })); +fn write_shortcut_pref(enabled: bool) -> Result<(), String> { + merge_settings(serde_json::json!({ "desktop_shortcut": enabled })) } /// Create (or overwrite) a desktop shortcut pointing at the CURRENT exe. Overwriting on every @@ -201,10 +893,17 @@ fn write_shortcut_pref(enabled: bool) { /// the shortcut is rewritten to the new path. Windows-only (uses a .lnk via WScript.Shell). #[cfg(windows)] fn ensure_desktop_shortcut() { - let Ok(exe) = std::env::current_exe() else { return; }; - let Some(desktop) = dirs::desktop_dir() else { return; }; + let Ok(exe) = std::env::current_exe() else { + return; + }; + let Some(desktop) = dirs::desktop_dir() else { + return; + }; let lnk = desktop.join("GenericAgent.lnk"); - let work_dir = exe.parent().map(|p| p.to_path_buf()).unwrap_or_else(|| exe.clone()); + let work_dir = exe + .parent() + .map(|p| p.to_path_buf()) + .unwrap_or_else(|| exe.clone()); let exe_s = exe.to_string_lossy().replace('\'', "''"); let lnk_s = lnk.to_string_lossy().replace('\'', "''"); @@ -219,11 +918,19 @@ fn ensure_desktop_shortcut() { $sc.WorkingDirectory = '{work}'; \ $sc.IconLocation = '{exe}'; \ $sc.Save()", - lnk = lnk_s, exe = exe_s, work = work_s + lnk = lnk_s, + exe = exe_s, + work = work_s ); let mut cmd = Command::new("powershell.exe"); - cmd.args(["-NoProfile", "-ExecutionPolicy", "Bypass", "-Command", &script]); + cmd.args([ + "-NoProfile", + "-ExecutionPolicy", + "Bypass", + "-Command", + &script, + ]); cmd.creation_flags(0x08000000); // CREATE_NO_WINDOW let _ = cmd.status(); } @@ -232,8 +939,12 @@ fn ensure_desktop_shortcut() { fn ensure_desktop_shortcut() { // Launch target: the AppImage path when running as one, else the current exe. Writing the // current path on every enabled launch keeps a relocated bundle's launcher valid. - let Some(target) = std::env::var_os("APPIMAGE").map(PathBuf::from) - .or_else(|| std::env::current_exe().ok()) else { return; }; + let Some(target) = std::env::var_os("APPIMAGE") + .map(PathBuf::from) + .or_else(|| std::env::current_exe().ok()) + else { + return; + }; let exec = target.to_string_lossy().replace('"', ""); // Linux .desktop Icon= needs an image file (or themed name), not the AppImage path. The CI // ships GenericAgent.png next to the AppImage; fall back to a generic themed icon otherwise. @@ -245,7 +956,8 @@ fn ensure_desktop_shortcut() { let entry = format!( "[Desktop Entry]\nType=Application\nName=GenericAgent\nComment=GenericAgent Desktop\n\ Exec=\"{exec}\"\nIcon={icon}\nTerminal=false\nCategories=Utility;Development;\n", - exec = exec, icon = icon + exec = exec, + icon = icon ); let write_desktop = |path: &std::path::Path| { if std::fs::write(path, &entry).is_ok() { @@ -272,14 +984,21 @@ fn ensure_desktop_shortcut() { #[cfg(target_os = "macos")] fn ensure_desktop_shortcut() { // The .app is the launchable unit; drop a symlink to it on the Desktop. - let Ok(exe) = std::env::current_exe() else { return; }; + let Ok(exe) = std::env::current_exe() else { + return; + }; let mut app: Option = None; let mut d = exe.parent(); while let Some(dir) = d { - if dir.extension().and_then(|s| s.to_str()) == Some("app") { app = Some(dir.to_path_buf()); break; } + if dir.extension().and_then(|s| s.to_str()) == Some("app") { + app = Some(dir.to_path_buf()); + break; + } d = dir.parent(); } - let (Some(app), Some(desktop)) = (app, dirs::desktop_dir()) else { return; }; + let (Some(app), Some(desktop)) = (app, dirs::desktop_dir()) else { + return; + }; let link = desktop.join("GenericAgent.app"); let _ = std::fs::remove_file(&link); let _ = std::os::unix::fs::symlink(&app, &link); @@ -310,120 +1029,426 @@ fn shortcut_should_ask() -> bool { bundle_root().is_some() && read_shortcut_pref().is_none() } -/// Returns the last first-run prepare error (if any) so the setup window can display it. -#[tauri::command] -fn get_prepare_error() -> Option { - PREPARE_ERROR.lock().unwrap().clone() -} - /// Frontend reports the user's choice. Persists it and creates the shortcut when enabled. #[tauri::command] -fn shortcut_decide(create: bool) { - write_shortcut_pref(create); +fn shortcut_decide(create: bool) -> Result<(), String> { + write_shortcut_pref(create)?; if create { ensure_desktop_shortcut(); } + Ok(()) } -/// True when this binary is running from inside a macOS .app bundle (packaged build). -/// Used to refuse stale ~/.ga_desktop_settings.json that could point at an old checkout -/// when App Translocation hides our own runtime/ from current_exe(). #[cfg(target_os = "macos")] fn running_inside_app_bundle() -> bool { std::env::current_exe() .ok() - .map(|p| { - p.components().any(|c| { - c.as_os_str().to_string_lossy().ends_with(".app") - }) + .map(|path| { + path.components() + .any(|component| component.as_os_str().to_string_lossy().ends_with(".app")) }) .unwrap_or(false) } -/// User-set external GenericAgent source directory (方案三: bundle shell + external core). -/// Returns the path only when it still looks like a GA core checkout (agentmain.py exists). -/// The bundle's own bridge/frontend/conductor are used; the saved source only becomes GA_ROOT. -/// An invalid/missing override returns None so callers fall back to the bundle runtime/app. +/// User-set external GenericAgent core. The desktop bridge and conductor remain package-owned; +/// this path is only injected as GA_ROOT. A moved or deleted core falls back to the bundled one. fn valid_ga_source_override() -> Option { - let s = read_settings() - .get("ga_source_override") - .and_then(|v| v.as_str()) - .unwrap_or("") - .trim() - .to_string(); - if s.is_empty() { - return None; - } - let p = PathBuf::from(&s); - if p.join("agentmain.py").exists() { - Some(p.to_string_lossy().to_string()) - } else { - None - } + valid_ga_source_override_from(&read_settings()) } /// Remove a single key from the settings file (merge_settings can only add/overwrite). -fn remove_setting(key: &str) { - let mut obj = read_settings(); - obj.remove(key); - let val = serde_json::Value::Object(obj); - if let Ok(text) = serde_json::to_string_pretty(&val) { - let _ = std::fs::write(settings_path(), text); - } +fn remove_setting(key: &str) -> Result<(), String> { + let key = key.to_string(); + update_settings(move |object| { + object.remove(&key); + }) } -fn restore_setting(key: &str, value: Option) { +fn restore_setting(key: &str, value: Option) -> Result<(), String> { match value { - Some(v) => merge_settings(serde_json::json!({ key: v })), + Some(value) => merge_settings(serde_json::json!({ key: value })), None => remove_setting(key), } } -fn copy_dir_replace(src: &Path, dst: &Path) -> Result<(), String> { - std::fs::create_dir_all(dst).map_err(|e| format!("create {:?}: {}", dst, e))?; - for entry in std::fs::read_dir(src).map_err(|e| format!("read {:?}: {}", src, e))? { - let entry = entry.map_err(|e| e.to_string())?; - let sp = entry.path(); - let dp = dst.join(entry.file_name()); - let ft = entry.file_type().map_err(|e| e.to_string())?; - if ft.is_dir() { - if dp.exists() && !dp.is_dir() { - std::fs::remove_file(&dp).map_err(|e| format!("remove {:?}: {}", dp, e))?; - } - copy_dir_replace(&sp, &dp)?; - } else if ft.is_file() { - if let Some(parent) = dp.parent() { - std::fs::create_dir_all(parent).map_err(|e| e.to_string())?; - } - std::fs::copy(&sp, &dp).map_err(|e| format!("copy {:?} -> {:?}: {}", sp, dp, e))?; - } +const RUNTIME_MARKER_FILENAME: &str = ".ga-package-runtime.json"; +const RUNTIME_MARKER_SCHEMA: u32 = 1; +const PRESERVED_RUNTIME_PATHS: [&str; 4] = ["mykey.py", "mykey.json", "memory", "temp"]; + +#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)] +#[serde(rename_all = "camelCase")] +struct RuntimePackageMarker { + schema: u32, + package: String, + package_version: String, + build_id: String, + source_revision: String, +} + +#[derive(Debug, Eq, PartialEq)] +enum RuntimeCopyStatus { + Current, + Installed, + Refreshed, +} + +fn expected_runtime_marker() -> RuntimePackageMarker { + RuntimePackageMarker { + schema: RUNTIME_MARKER_SCHEMA, + package: env!("CARGO_PKG_NAME").to_string(), + package_version: env!("CARGO_PKG_VERSION").to_string(), + build_id: env!("GA_BUILD_ID").to_string(), + source_revision: env!("GA_SOURCE_REVISION").to_string(), } - Ok(()) } -fn bundled_project_dir() -> Option { - let app = bundle_root()?.join("app"); - if app.join("agentmain.py").exists() { Some(app) } else { None } +fn runtime_marker_path(runtime: &Path) -> PathBuf { + runtime.join(RUNTIME_MARKER_FILENAME) } -fn same_path(a: &Path, b: &Path) -> bool { - let aa = a.canonicalize().unwrap_or_else(|_| a.to_path_buf()); - let bb = b.canonicalize().unwrap_or_else(|_| b.to_path_buf()); - #[cfg(windows)] - { display_path(&aa).eq_ignore_ascii_case(&display_path(&bb)) } - #[cfg(not(windows))] - { aa == bb } +fn read_runtime_marker(runtime: &Path) -> Option { + let text = std::fs::read_to_string(runtime_marker_path(runtime)).ok()?; + serde_json::from_str(&text).ok() } -fn display_path(path: &Path) -> String { - let s = path.to_string_lossy().to_string(); - #[cfg(windows)] - { - if let Some(rest) = s.strip_prefix("\\\\?\\") { +fn runtime_copy_is_current(runtime: &Path, expected: &RuntimePackageMarker) -> bool { + runtime.join("agentmain.py").is_file() + && runtime + .join("frontends") + .join("desktop_bridge.py") + .is_file() + && read_runtime_marker(runtime).as_ref() == Some(expected) +} + +fn remove_fs_path(path: &Path) -> Result<(), String> { + if path.is_symlink() || path.is_file() { + std::fs::remove_file(path).map_err(|error| format!("remove {:?}: {error}", path)) + } else if path.is_dir() { + std::fs::remove_dir_all(path).map_err(|error| format!("remove {:?}: {error}", path)) + } else { + Ok(()) + } +} + +fn copy_dir_replace(src: &Path, dst: &Path) -> Result<(), String> { + if src.is_symlink() || !src.is_dir() { + return Err(format!("refusing to copy unsafe directory {:?}", src)); + } + std::fs::create_dir_all(dst).map_err(|error| format!("create {:?}: {error}", dst))?; + for entry in std::fs::read_dir(src).map_err(|error| format!("read {:?}: {error}", src))? { + let entry = entry.map_err(|error| error.to_string())?; + let source = entry.path(); + let destination = dst.join(entry.file_name()); + let file_type = entry.file_type().map_err(|error| error.to_string())?; + if file_type.is_symlink() { + return Err(format!("refusing to copy symbolic link {:?}", source)); + } + if file_type.is_dir() { + if destination.exists() && !destination.is_dir() { + remove_fs_path(&destination)?; + } + copy_dir_replace(&source, &destination)?; + } else if file_type.is_file() { + if destination.exists() && !destination.is_file() { + remove_fs_path(&destination)?; + } + if let Some(parent) = destination.parent() { + std::fs::create_dir_all(parent).map_err(|error| error.to_string())?; + } + std::fs::copy(&source, &destination) + .map_err(|error| format!("copy {:?} -> {:?}: {error}", source, destination))?; + } else { + return Err(format!("refusing to copy special file {:?}", source)); + } + } + Ok(()) +} + +fn copy_preserved_runtime_data(existing: &Path, staging: &Path) -> Result<(), String> { + for relative in PRESERVED_RUNTIME_PATHS { + let source = existing.join(relative); + if !source.exists() && !source.is_symlink() { + continue; + } + if source.is_symlink() { + return Err(format!( + "refusing to preserve symbolic-link user data {:?}", + source + )); + } + let destination = staging.join(relative); + remove_fs_path(&destination)?; + if source.is_dir() { + copy_dir_replace(&source, &destination)?; + } else if source.is_file() { + if let Some(parent) = destination.parent() { + std::fs::create_dir_all(parent).map_err(|error| error.to_string())?; + } + std::fs::copy(&source, &destination) + .map_err(|error| format!("preserve {:?} -> {:?}: {error}", source, destination))?; + } else { + return Err(format!("refusing to preserve special file {:?}", source)); + } + } + Ok(()) +} + +fn unique_runtime_sibling(parent: &Path, label: &str) -> Result { + let nanos = std::time::SystemTime::now() + .duration_since(std::time::UNIX_EPOCH) + .map(|duration| duration.as_nanos()) + .unwrap_or(0); + for suffix in 0..1000_u32 { + let candidate = parent.join(format!( + ".app-{label}-{}-{nanos}-{suffix}", + std::process::id() + )); + if !candidate.exists() && !candidate.is_symlink() { + return Ok(candidate); + } + } + Err(format!("cannot allocate runtime {label} path")) +} + +fn refresh_runtime_copy_with_activation( + source: &Path, + destination: &Path, + preserved_source: Option<&Path>, + expected: &RuntimePackageMarker, + activate: F, +) -> Result +where + F: FnOnce(&Path, &Path) -> std::io::Result<()>, +{ + if runtime_copy_is_current(destination, expected) { + return Ok(RuntimeCopyStatus::Current); + } + if source.is_symlink() + || !source.join("agentmain.py").is_file() + || !source.join("frontends").join("desktop_bridge.py").is_file() + { + return Err(format!( + "bundled core is incomplete at {}", + display_path(source) + )); + } + if destination.is_symlink() || (destination.exists() && !destination.is_dir()) { + return Err(format!( + "writable runtime is not a safe directory at {}", + display_path(destination) + )); + } + let parent = destination + .parent() + .ok_or_else(|| "writable runtime has no parent directory".to_string())?; + std::fs::create_dir_all(parent) + .map_err(|error| format!("create writable runtime parent: {error}"))?; + let staging = unique_runtime_sibling(parent, "staging")?; + std::fs::create_dir(&staging) + .map_err(|error| format!("create writable runtime staging dir: {error}"))?; + + let prepare_result = (|| { + copy_dir_replace(source, &staging)?; + if let Some(existing) = + preserved_source.or_else(|| destination.is_dir().then_some(destination)) + { + copy_preserved_runtime_data(existing, &staging)?; + } + let marker = serde_json::to_string_pretty(expected) + .map_err(|error| format!("serialize runtime marker: {error}"))?; + std::fs::write(runtime_marker_path(&staging), marker + "\n") + .map_err(|error| format!("write runtime marker: {error}"))?; + if !runtime_copy_is_current(&staging, expected) { + return Err("staged writable runtime failed validation".to_string()); + } + Ok(()) + })(); + if let Err(error) = prepare_result { + let _ = remove_fs_path(&staging); + return Err(error); + } + + let existed = destination.is_dir(); + let rollback = match unique_runtime_sibling(parent, "rollback") { + Ok(path) => path, + Err(error) => { + let _ = remove_fs_path(&staging); + return Err(error); + } + }; + if existed { + if let Err(error) = std::fs::rename(destination, &rollback) { + let _ = remove_fs_path(&staging); + return Err(format!("backup previous writable runtime: {error}")); + } + } + + if let Err(error) = activate(&staging, destination) { + let _ = remove_fs_path(&staging); + if existed { + if destination.exists() || destination.is_symlink() { + let _ = remove_fs_path(destination); + } + if let Err(rollback_error) = std::fs::rename(&rollback, destination) { + return Err(format!( + "activate writable runtime: {error}; restore previous runtime from {}: {rollback_error}", + display_path(&rollback) + )); + } + } + return Err(format!("activate writable runtime: {error}")); + } + + if existed { + // The activated tree already contains copied user data. This old tree is + // retained until activation succeeds, then removed on a best-effort basis. + let _ = remove_fs_path(&rollback); + Ok(RuntimeCopyStatus::Refreshed) + } else { + Ok(RuntimeCopyStatus::Installed) + } +} + +fn refresh_runtime_copy( + source: &Path, + destination: &Path, + expected: &RuntimePackageMarker, +) -> Result { + refresh_runtime_copy_with_activation(source, destination, None, expected, |staging, active| { + std::fs::rename(staging, active) + }) +} + +fn trusted_legacy_runtime(runtime_parent: &Path) -> Result, String> { + if !runtime_parent.is_dir() { + return Ok(None); + } + let mut candidates = Vec::new(); + for entry in std::fs::read_dir(runtime_parent) + .map_err(|error| format!("read legacy runtime parent: {error}"))? + { + let entry = entry.map_err(|error| format!("read legacy runtime entry: {error}"))?; + let version_dir = entry.path(); + if entry.file_name() == "app" + || entry + .file_type() + .map_err(|error| error.to_string())? + .is_symlink() + { + continue; + } + let version_name = entry.file_name().to_string_lossy().to_string(); + let version_key = version_name + .split('-') + .next() + .unwrap_or("") + .split('.') + .map(str::parse::) + .collect::, _>>(); + let Ok(version_key) = version_key else { + continue; + }; + if version_key.is_empty() { + continue; + } + let app = version_dir.join("app"); + if app.is_symlink() + || !app.is_dir() + || !app.join("agentmain.py").is_file() + || !app.join("frontends").join("desktop_bridge.py").is_file() + { + continue; + } + let Some(marker) = read_runtime_marker(&app) else { + continue; + }; + if marker.schema != RUNTIME_MARKER_SCHEMA + || marker.package != env!("CARGO_PKG_NAME") + || marker.package_version != version_name + { + continue; + } + candidates.push((version_key, app)); + } + candidates.sort_by(|left, right| left.0.cmp(&right.0)); + Ok(candidates.pop().map(|(_, path)| path)) +} + +fn refresh_runtime_copy_from_legacy( + source: &Path, + legacy: &Path, + destination: &Path, + expected: &RuntimePackageMarker, +) -> Result { + let result = refresh_runtime_copy_with_activation( + source, + destination, + Some(legacy), + expected, + |staging, active| std::fs::rename(staging, active), + )?; + let _ = remove_fs_path(legacy); + if let Some(parent) = legacy.parent() { + let _ = std::fs::remove_dir(parent); + } + Ok(result) +} + +fn builtin_ga_root(project_dir: &str) -> PathBuf { + #[cfg(target_os = "macos")] + { + if running_inside_app_bundle() { + if let Some(data_dir) = dirs::data_dir() { + return data_dir.join("GenericAgent").join("runtime").join("app"); + } + } + } + PathBuf::from(project_dir) +} + +fn ensure_builtin_ga_root(project_dir: &str) -> Result<(), String> { + if valid_ga_source_override().is_some() { + return Ok(()); + } + let source = PathBuf::from(project_dir); + let destination = builtin_ga_root(project_dir); + if same_path(&source, &destination) { + return Ok(()); + } + let expected = expected_runtime_marker(); + if !destination.exists() { + if let Some(parent) = destination.parent() { + if let Some(legacy) = trusted_legacy_runtime(parent)? { + return refresh_runtime_copy_from_legacy(&source, &legacy, &destination, &expected) + .map(|_| ()); + } + } + } + refresh_runtime_copy(&source, &destination, &expected).map(|_| ()) +} + +fn same_path(a: &Path, b: &Path) -> bool { + let a = a.canonicalize().unwrap_or_else(|_| a.to_path_buf()); + let b = b.canonicalize().unwrap_or_else(|_| b.to_path_buf()); + #[cfg(windows)] + { + display_path(&a).eq_ignore_ascii_case(&display_path(&b)) + } + #[cfg(not(windows))] + { + a == b + } +} + +fn display_path(path: &Path) -> String { + let value = path.to_string_lossy().to_string(); + #[cfg(windows)] + { + if let Some(rest) = value.strip_prefix("\\\\?\\") { return rest.to_string(); } } - s + value } /// Read config from settings file, or auto-discover and save. @@ -432,15 +1457,13 @@ fn display_path(path: &Path) -> String { pub fn get_or_discover_config() -> (String, String) { let path = settings_path(); - // NOTE: the external GA source override does NOT change which project_dir/bridge we run. - // 方案三: we always run the bundle's own bridge + frontend, and inject the external核 via - // the GA_ROOT env (see sanitize_bundle_env). So project_dir stays the bundle here. - + // An external core never replaces project_dir: project_dir locates the package-owned bridge, + // while sanitize_bundle_env injects the selected core as GA_ROOT. if bundle_root().is_some() { let python = find_python(); let project = find_project_dir().unwrap_or_default(); if !python.is_empty() && !project.is_empty() { - merge_settings(serde_json::json!({ + let _ = merge_settings(serde_json::json!({ "python_path": python, "project_dir": project })); @@ -448,29 +1471,32 @@ pub fn get_or_discover_config() -> (String, String) { } } - // Try reading existing settings. - // On macOS, a packaged .app must never trust ~/.ga_desktop_settings.json: App - // Translocation can run the bundle from a random read-only copy where bundle_root() - // fails to see our own runtime/, and an old settings file would then silently point - // the bridge at a previously installed checkout. In that case fall through to - // auto-discovery (which still resolves the bundle via .app-relative search below). #[cfg(target_os = "macos")] let trust_settings = !running_inside_app_bundle(); #[cfg(not(target_os = "macos"))] let trust_settings = true; + // A packaged macOS app never trusts a stale path from a previous install/translocation. if trust_settings && path.exists() { if let Ok(content) = std::fs::read_to_string(&path) { if let Ok(val) = serde_json::from_str::(&content) { - let python = val.get("python_path") + let python = val + .get("python_path") .and_then(|v| v.as_str()) .unwrap_or("") .to_string(); - let project = val.get("project_dir") + let project = val + .get("project_dir") .and_then(|v| v.as_str()) .unwrap_or("") .to_string(); - if !python.is_empty() && !project.is_empty() { + if python_interpreter_resolves(&python) + && !project.is_empty() + && PathBuf::from(&project) + .join("frontends") + .join("desktop_bridge.py") + .exists() + { return (python, project); } } @@ -478,12 +1504,16 @@ pub fn get_or_discover_config() -> (String, String) { } // Auto-discover - let python = find_python(); let project = find_project_dir().unwrap_or_default(); + let python = if project.is_empty() { + find_python() + } else { + discover_python_for_project_path(Path::new(&project), None) + }; // Save discovered config if !python.is_empty() && !project.is_empty() { - merge_settings(serde_json::json!({ + let _ = merge_settings(serde_json::json!({ "python_path": python, "project_dir": project })); @@ -513,33 +1543,42 @@ fn prepared_marker() -> Option { /// True when this is a self-contained bundle whose python env has not been prepared yet /// (embedded python present but deps not yet installed into it). fn needs_first_run_prepare(project_dir: &str) -> bool { - if project_dir.is_empty() { return false; } + if project_dir.is_empty() { + return false; + } bundle_python().is_some() && prepared_marker().map(|m| !m.exists()).unwrap_or(false) } /// Clear env vars a host launcher injects pointing at its own runtime. The Linux AppImage exports /// PYTHONHOME/PYTHONPATH (-> bundled python crashes with "No module named 'encodings'") and /// LD_LIBRARY_PATH (-> wrong shared libs). Our bundled python / prepare / bridge must run clean. -fn sanitize_bundle_env(cmd: &mut Command) { +fn sanitize_bundle_env(cmd: &mut Command, project_dir: &str) { cmd.env_remove("PYTHONHOME"); cmd.env_remove("PYTHONPATH"); cmd.env_remove("LD_LIBRARY_PATH"); + cmd.env("PYTHONDONTWRITEBYTECODE", "1"); // Stamp the bridge we spawn with this build's id so a later app launch can tell whether the // bridge holding :14168 is ours (see bridge_identity_matches / GET /services/identity). cmd.env("GA_BUILD_ID", env!("GA_BUILD_ID")); - // 方案三: when the user has set a valid external GA source, inject it as GA_ROOT so the - // (bundle's own) bridge + conductor import the external核 and read/write its data. When - // unset/invalid we leave GA_ROOT unset → the bridge falls back to its own bundle runtime. - match valid_ga_source_override() { - Some(src) => { cmd.env("GA_ROOT", src); } - None => { cmd.env_remove("GA_ROOT"); } + let ga_root = effective_ga_root(project_dir); + if ga_root.is_empty() { + cmd.env_remove("GA_ROOT"); + } else { + cmd.env("GA_ROOT", ga_root); } + let endpoint = bridge_endpoint(); + cmd.env("BRIDGE_HOST", &endpoint.host); + cmd.env("BRIDGE_PORT", endpoint.port.to_string()); } /// Run the offline prepare (install_windows.ps1 -Mode PrepareOnly) using bundled python + wheels. /// Streams the script's stdout and forwards GAPROGRESS markers to `report(pct, message)`. /// Blocking; intended to run on a background thread. Writes ~/.ga_desktop_settings.json. -fn run_offline_prepare(project_dir: &str, report: &dyn Fn(i32, &str)) -> Result<(), String> { +fn run_offline_prepare( + project_dir: &str, + report: &dyn Fn(i32, &str), + log: &dyn Fn(&str), +) -> Result<(), String> { let root = bundle_root().ok_or("cannot locate bundle root")?; let wheels = root.join("wheels"); @@ -568,10 +1607,14 @@ fn run_offline_prepare(project_dir: &str, report: &dyn Fn(i32, &str)) -> Result< let mut c = Command::new("powershell.exe"); c.args(["-NoProfile", "-ExecutionPolicy", "Bypass", "-File"]) .arg(&script) - .arg("-PythonPath").arg(&py) - .arg("-ProjectDir").arg(project_dir) - .arg("-WheelDir").arg(&wheels) - .arg("-ExtraPipPackages").arg("fastapi uvicorn websockets") + .arg("-PythonPath") + .arg(&py) + .arg("-ProjectDir") + .arg(project_dir) + .arg("-WheelDir") + .arg(&wheels) + .arg("-ExtraPipPackages") + .arg("fastapi uvicorn websockets") // -NoVenv: install deps straight into the embedded python (no venv) so the // bundle is relocatable. See prepared_marker / find_python. .args(["-Mode", "PrepareOnly", "-SkipNpmInstall", "-NoVenv"]); @@ -581,10 +1624,14 @@ fn run_offline_prepare(project_dir: &str, report: &dyn Fn(i32, &str)) -> Result< let mut cmd = { let mut c = Command::new("bash"); c.arg(&script) - .arg("--python-path").arg(&py) - .arg("--project-dir").arg(project_dir) - .arg("--wheel-dir").arg(&wheels) - .arg("--extra-packages").arg("fastapi uvicorn websockets") + .arg("--python-path") + .arg(&py) + .arg("--project-dir") + .arg(project_dir) + .arg("--wheel-dir") + .arg(&wheels) + .arg("--extra-packages") + .arg("fastapi uvicorn websockets") // --no-venv: install deps straight into the embedded python (no venv) so the // bundle is relocatable. See prepared_marker / find_python. .args(["--mode", "PrepareOnly", "--no-venv"]); @@ -592,70 +1639,64 @@ fn run_offline_prepare(project_dir: &str, report: &dyn Fn(i32, &str)) -> Result< }; cmd.stdout(Stdio::piped()).stderr(Stdio::piped()); - sanitize_bundle_env(&mut cmd); + sanitize_bundle_env(&mut cmd, project_dir); #[cfg(windows)] cmd.creation_flags(0x08000000); // CREATE_NO_WINDOW - let mut child = cmd.spawn().map_err(|e| format!("failed to launch prepare: {}", e))?; - - // Keep only the last N lines of a stream (pip errors are at the end; a full capture - // could be huge and the setup window only needs the tail to explain the failure). - const TAIL: usize = 40; - fn push_tail(buf: &mut Vec, line: String) { - if buf.len() >= TAIL { - buf.remove(0); - } - buf.push(line); + let mut child = cmd + .spawn() + .map_err(|e| format!("failed to launch prepare: {}", e))?; + + // Drain both streams concurrently so a verbose prepare cannot deadlock on a full pipe. + // Only stable stage keys reach the main copy; raw output is retained in diagnostics. + let (sender, receiver) = std::sync::mpsc::channel::>(); + let mut stream_count = 0; + if let Some(stdout) = child.stdout.take() { + stream_count += 1; + let sender = sender.clone(); + thread::spawn(move || { + for line in BufReader::new(stdout).lines().map_while(Result::ok) { + let _ = sender.send(Some(line)); + } + let _ = sender.send(None); + }); } - - // Drain stderr on a helper thread (both pipes must be drained concurrently or the child - // can deadlock on a full pipe buffer). pip/install errors land here. - let stderr_tail = std::sync::Arc::new(Mutex::new(Vec::::new())); - let stderr_thread = child.stderr.take().map(|err| { - let tail = std::sync::Arc::clone(&stderr_tail); + if let Some(stderr) = child.stderr.take() { + stream_count += 1; + let sender = sender.clone(); thread::spawn(move || { - for line in BufReader::new(err).lines().flatten() { - push_tail(&mut tail.lock().unwrap(), line); + for line in BufReader::new(stderr).lines().map_while(Result::ok) { + let _ = sender.send(Some(line)); } - }) - }); - - // Forward the script's ASCII progress keys to the loading window, which localizes them - // (window.gaProgress maps key -> zh/en by navigator.language). Non-progress stdout is - // kept (tail only) so a failure can show what the script was doing when it died. - let mut stdout_tail: Vec = Vec::new(); - if let Some(out) = child.stdout.take() { - for line in BufReader::new(out).lines().flatten() { - if let Some(key) = line.trim().strip_prefix("GAPROGRESS|") { - match key.trim() { - "venv" => report(15, "venv"), - "deps" => report(45, "deps"), - "done" => report(90, "done"), - _ => {} + let _ = sender.send(None); + }); + } + drop(sender); + + let mut completed_streams = 0; + while completed_streams < stream_count { + match receiver.recv() { + Ok(Some(line)) => { + if let Some(key) = line.trim().strip_prefix("GAPROGRESS|") { + match key.trim() { + "venv" => report(25, "python"), + "deps" => report(50, "dependencies"), + "done" => report(75, "dependencies"), + _ => {} + } + } else { + log(&line); } - } else if !line.trim().is_empty() { - push_tail(&mut stdout_tail, line); } + Ok(None) => completed_streams += 1, + Err(_) => break, } } - let status = child.wait().map_err(|e| format!("prepare wait failed: {}", e))?; - if let Some(h) = stderr_thread { - let _ = h.join(); - } + let status = child + .wait() + .map_err(|e| format!("prepare wait failed: {}", e))?; if !status.success() { - // Surface the real installer output, not just the exit code (shown in the setup - // window via get_prepare_error and written to prepare_error.log). - let mut msg = format!("prepare exited with status {:?}", status.code()); - let err_lines = stderr_tail.lock().unwrap(); - if !err_lines.is_empty() { - msg.push_str("\n\n--- stderr (tail) ---\n"); - msg.push_str(&err_lines.join("\n")); - } - if !stdout_tail.is_empty() { - msg.push_str("\n\n--- output (tail) ---\n"); - msg.push_str(&stdout_tail.join("\n")); - } - return Err(msg); + return Err(format!("prepare exited with status {:?}", status.code())); } // Record success so later launches (and relocated copies) skip the prepare step. if let Some(marker) = prepared_marker() { @@ -664,213 +1705,773 @@ fn run_offline_prepare(project_dir: &str, report: &dyn Fn(i32, &str)) -> Result< Ok(()) } +const MAX_IDENTITY_RESPONSE_BYTES: usize = 32 * 1024; +const MAX_IDENTITY_PATH_BYTES: usize = 2 * 1024; +const MAX_IDENTITY_BUILD_BYTES: usize = 256; +const MAX_SHUTDOWN_RESPONSE_BYTES: usize = 4 * 1024; + +#[derive(Debug, PartialEq, Eq)] +enum BridgeShutdownResponse { + Accepted, + Refused { status: u16, maintenance: bool }, + Indeterminate, +} + +fn normalize_bridge_identity(identity: serde_json::Value) -> Option { + let ga_root = identity.get("ga_root")?.as_str()?; + let build_id = identity + .get("build_id") + .and_then(|value| value.as_str()) + .unwrap_or(""); + let pid = identity.get("pid")?.as_u64()?; + if ga_root.is_empty() + || ga_root.len() > MAX_IDENTITY_PATH_BYTES + || build_id.len() > MAX_IDENTITY_BUILD_BYTES + || pid == 0 + { + return None; + } + Some(serde_json::json!({ + "ga_root": ga_root, + "build_id": build_id, + "pid": pid + })) +} + /// GET /services/identity from a running bridge; returns the parsed JSON (or None when the /// endpoint is absent — i.e. an older/foreign bridge). fn bridge_reported_identity() -> Option { use std::io::{Read, Write}; - let mut stream = TcpStream::connect_timeout( - &"127.0.0.1:14168".parse().unwrap(), - Duration::from_millis(800), - ).ok()?; + let endpoint = bridge_endpoint(); + let addr = endpoint.tcp_addr()?; + let mut stream = TcpStream::connect_timeout(&addr, Duration::from_millis(800)).ok()?; let _ = stream.set_read_timeout(Some(Duration::from_millis(800))); let _ = stream.set_write_timeout(Some(Duration::from_millis(600))); - let req = b"GET /services/identity HTTP/1.1\r\nHost: 127.0.0.1\r\nConnection: close\r\n\r\n"; - stream.write_all(req).ok()?; + let req = format!( + "GET /services/identity HTTP/1.1\r\nHost: {}\r\nConnection: close\r\n\r\n", + endpoint.socket_addr(), + ); + stream.write_all(req.as_bytes()).ok()?; let mut buf = Vec::new(); - let _ = stream.read_to_end(&mut buf); + stream + .take((MAX_IDENTITY_RESPONSE_BYTES + 1) as u64) + .read_to_end(&mut buf) + .ok()?; + if buf.len() > MAX_IDENTITY_RESPONSE_BYTES { + return None; + } let text = String::from_utf8_lossy(&buf); - let body = text.split("\r\n\r\n").nth(1)?; - serde_json::from_str(body.trim()).ok() + let mut response = text.splitn(2, "\r\n\r\n"); + let headers = response.next()?; + let status = headers.lines().next()?; + if !(status.starts_with("HTTP/1.1 200 ") || status.starts_with("HTTP/1.0 200 ")) { + return None; + } + let body = response.next()?; + normalize_bridge_identity(serde_json::from_str(body.trim()).ok()?) } fn norm_path(p: &str) -> String { std::fs::canonicalize(p) - .map(|c| display_path(&c)) + .map(|c| c.to_string_lossy().to_string()) .unwrap_or_else(|_| p.to_string()) } -/// A running bridge is "ours" only when it serves the same install path AND was spawned by the -/// same build. The build id (commit+timestamp, see build.rs) changes on every build, so an -/// in-place upgrade or a same-version re-publish still counts as a different bridge → take over. -/// An old bridge with no /identity (None) or no build_id field ("") never matches → taken over. -fn bridge_identity_matches(project_dir: &str) -> bool { - let Some(id) = bridge_reported_identity() else { return false; }; - let reported_root = id.get("ga_root").and_then(|v| v.as_str()).unwrap_or(""); - let reported_build = id.get("build_id").and_then(|v| v.as_str()).unwrap_or(""); - if reported_build != env!("GA_BUILD_ID") { - return false; +fn effective_ga_root(project_dir: &str) -> String { + effective_ga_root_from(project_dir, &read_settings()) +} + +fn bootstrap_failure(code: BootstrapFailureCode, detail: impl AsRef) -> BootstrapFailure { + BootstrapFailure { + code, + detail: sanitize_diagnostic_line(detail.as_ref()), } - path_matches(reported_root, project_dir) } -/// Last resort when a stale bridge ignores POST /services/bridge/exit (e.g. an old build with -/// no such endpoint): force-kill whatever process is listening on :14168 so the new bridge can -/// bind it. Only called after an identity mismatch, so we never kill a bridge that is ours. -fn force_free_bridge_port() { - #[cfg(windows)] - { - // netstat -ano: last column is the PID for the :14168 LISTENING row. - if let Ok(out) = Command::new("netstat").args(["-ano", "-p", "tcp"]).output() { - let text = String::from_utf8_lossy(&out.stdout); - for line in text.lines() { - if line.contains(":14168") && line.to_uppercase().contains("LISTENING") { - if let Some(pid) = line.split_whitespace().last() { - let mut c = Command::new("taskkill"); - c.args(["/F", "/PID", pid]); - c.creation_flags(0x08000000); - let _ = c.status(); - } - } - } - } +fn parse_bridge_shutdown_response(response: &[u8]) -> BridgeShutdownResponse { + // The HTTP status line is authoritative even if an error body is truncated + // or contains non-UTF-8 bytes. Lossy decoding cannot turn an invalid status + // line into one of the exact HTTP/version/status tokens accepted below. + let text = String::from_utf8_lossy(response); + let Some((status_line, _)) = text.split_once("\r\n") else { + return BridgeShutdownResponse::Indeterminate; + }; + let mut parts = status_line.split_ascii_whitespace(); + let Some(version) = parts.next() else { + return BridgeShutdownResponse::Indeterminate; + }; + if version != "HTTP/1.0" && version != "HTTP/1.1" { + return BridgeShutdownResponse::Indeterminate; } - #[cfg(not(windows))] - { - // lsof prints the listening PIDs; kill -9 each. - if let Ok(out) = Command::new("lsof").args(["-ti", "tcp:14168", "-sTCP:LISTEN"]).output() { - for pid in String::from_utf8_lossy(&out.stdout).split_whitespace() { - let _ = Command::new("kill").args(["-9", pid]).status(); - } - } + let Some(raw_status) = parts.next() else { + return BridgeShutdownResponse::Indeterminate; + }; + if raw_status.len() != 3 || !raw_status.bytes().all(|byte| byte.is_ascii_digit()) { + return BridgeShutdownResponse::Indeterminate; + } + let Ok(status) = raw_status.parse::() else { + return BridgeShutdownResponse::Indeterminate; + }; + if (200..300).contains(&status) { + return BridgeShutdownResponse::Accepted; + } + let body = text + .split_once("\r\n\r\n") + .map(|(_, body)| body.trim()) + .unwrap_or(""); + let maintenance = status == 409 + && serde_json::from_str::(body) + .ok() + .and_then(|document| { + document + .get("code") + .and_then(serde_json::Value::as_str) + .map(|code| code == "maintenance_conflict") + }) + .unwrap_or(false); + BridgeShutdownResponse::Refused { + status, + maintenance, } } -fn request_bridge_shutdown() { +fn request_bridge_shutdown() -> BridgeShutdownResponse { + request_bridge_shutdown_at(&bridge_endpoint()) +} + +fn request_bridge_shutdown_at(endpoint: &BridgeEndpoint) -> BridgeShutdownResponse { use std::io::{Read, Write}; - let Ok(mut stream) = TcpStream::connect_timeout( - &"127.0.0.1:14168".parse().unwrap(), - Duration::from_millis(800), - ) else { - return; + let Some(addr) = endpoint.tcp_addr() else { + return BridgeShutdownResponse::Indeterminate; + }; + let Ok(mut stream) = TcpStream::connect_timeout(&addr, Duration::from_millis(800)) else { + return BridgeShutdownResponse::Indeterminate; }; let _ = stream.set_read_timeout(Some(Duration::from_millis(600))); let _ = stream.set_write_timeout(Some(Duration::from_millis(600))); - let req = b"POST /services/bridge/exit HTTP/1.1\r\nHost: 127.0.0.1\r\nContent-Length: 0\r\nConnection: close\r\n\r\n"; - let _ = stream.write_all(req); - let _ = stream.read(&mut [0u8; 512]); + let req = format!( + "POST /services/bridge/exit HTTP/1.1\r\nHost: {}\r\nContent-Length: 0\r\nConnection: close\r\n\r\n", + endpoint.socket_addr(), + ); + if stream.write_all(req.as_bytes()).is_err() { + return BridgeShutdownResponse::Indeterminate; + } + let mut response = Vec::new(); + // A timeout or oversized body must not erase an already received explicit + // non-2xx status. Parse the bounded prefix; an incomplete status line stays + // indeterminate and retains the established own-child fallback. + let _ = stream + .take(MAX_SHUTDOWN_RESPONSE_BYTES as u64) + .read_to_end(&mut response); + parse_bridge_shutdown_response(&response) } -fn takeover_stale_bridge(project_dir: &str) { - if project_dir.is_empty() || !is_bridge_running() { - return; - } - if bridge_identity_matches(project_dir) { - return; - } - eprintln!("[tauri] a different/stale bridge holds 127.0.0.1:14168; taking over"); - request_bridge_shutdown(); - let start = Instant::now(); - while is_bridge_running() && start.elapsed() < Duration::from_secs(10) { - thread::sleep(Duration::from_millis(200)); +fn shutdown_refusal_failure(response: BridgeShutdownResponse) -> Option { + let BridgeShutdownResponse::Refused { + status, + maintenance, + } = response + else { + return None; + }; + let detail = if maintenance { + "the Desktop bridge is busy with data maintenance and refused a safe restart".to_string() + } else { + format!("the Desktop bridge refused a safe restart with HTTP {status}") + }; + Some(bootstrap_failure( + BootstrapFailureCode::BridgeShutdownRefused, + detail, + )) +} + +fn is_bridge_running() -> bool { + bridge_endpoint() + .tcp_addr() + .is_some_and(|addr| TcpStream::connect(addr).is_ok()) +} + +fn resolve_existing_listener( + app_handle: &tauri::AppHandle, + project_dir: &str, +) -> Result { + if !is_bridge_running() { + if BRIDGE_PROCESS.lock().unwrap().is_some() { + record_diagnostic_log( + app_handle, + "A tracked bridge process no longer owns the local listener; stopping it before retry.", + ); + stop_tracked_bridge(); + } + set_port_diagnostics(app_handle, PortState::Free, None); + return Ok(false); } - // Old bridges have no /services/bridge/exit endpoint and ignore the request above — if the - // port is still held, force-kill the listener so our fresh bridge can bind it. - if is_bridge_running() { - eprintln!("[tauri] stale bridge did not exit; force-freeing :14168"); - force_free_bridge_port(); - let start = Instant::now(); - while is_bridge_running() && start.elapsed() < Duration::from_secs(5) { - thread::sleep(Duration::from_millis(200)); + + let identity = bridge_reported_identity(); + match classify_listener_identity(identity.as_ref(), project_dir) { + ListenerIdentity::Owned => { + set_port_diagnostics(app_handle, PortState::Owned, identity.as_ref()); + Ok(true) + } + ListenerIdentity::Foreign => { + set_port_diagnostics(app_handle, PortState::Foreign, None); + Err(bootstrap_failure( + BootstrapFailureCode::PortConflict, + format!( + "{} is held by an unidentified process", + bridge_endpoint().socket_addr() + ), + )) + } + ListenerIdentity::KnownGenericAgent => { + set_port_diagnostics(app_handle, PortState::Foreign, identity.as_ref()); + record_diagnostic_log( + app_handle, + "A previous GenericAgent bridge was found; requesting graceful shutdown.", + ); + if let Some(failure) = shutdown_refusal_failure(request_bridge_shutdown()) { + record_diagnostic_log(app_handle, &failure.detail); + return Err(failure); + } + let start = Instant::now(); + while is_bridge_running() && start.elapsed() < Duration::from_secs(10) { + thread::sleep(Duration::from_millis(200)); + } + + if is_bridge_running() { + let remaining_identity = bridge_reported_identity(); + if classify_listener_identity(remaining_identity.as_ref(), project_dir) + != ListenerIdentity::KnownGenericAgent + { + set_port_diagnostics( + app_handle, + PortState::Foreign, + remaining_identity.as_ref(), + ); + return Err(bootstrap_failure( + BootstrapFailureCode::PortConflict, + "the local listener changed identity while waiting for shutdown", + )); + } + record_diagnostic_log( + app_handle, + "The identified old bridge ignored graceful shutdown; it will not be force-stopped.", + ); + return Err(bootstrap_failure( + BootstrapFailureCode::PortConflict, + format!( + "the identified old bridge did not release {}", + bridge_endpoint().socket_addr() + ), + )); + } + + if is_bridge_running() { + set_port_diagnostics( + app_handle, + PortState::Foreign, + bridge_reported_identity().as_ref(), + ); + Err(bootstrap_failure( + BootstrapFailureCode::PortConflict, + format!( + "the identified old bridge did not release {}", + bridge_endpoint().socket_addr() + ), + )) + } else { + // A bridge spawned by this desktop process may release the socket slightly + // before its process and pipe readers finish. Reap only that tracked child; + // an untracked bridge that exited gracefully is left untouched. + let tracked_child = BRIDGE_PROCESS.lock().unwrap().is_some(); + if tracked_child { + stop_tracked_bridge(); + } + set_port_diagnostics(app_handle, PortState::Free, None); + Ok(false) + } } } } -fn is_bridge_running() -> bool { - TcpStream::connect(("127.0.0.1", 14168)).is_ok() +fn bridge_command(python_path: &str, project_dir: &str) -> Result { + if python_path.trim().is_empty() { + return Err(bootstrap_failure( + BootstrapFailureCode::SpawnFailed, + "Python interpreter path is empty", + )); + } + let dir = PathBuf::from(project_dir); + let script = dir.join("frontends").join("desktop_bridge.py"); + if !script.exists() { + return Err(bootstrap_failure( + BootstrapFailureCode::ConfigUnresolved, + format!("desktop bridge not found under {}", dir.display()), + )); + } + + let mut cmd = Command::new(python_path); + cmd.arg(&script).current_dir(&dir); + cmd.stdout(Stdio::piped()).stderr(Stdio::piped()); + sanitize_bundle_env(&mut cmd, project_dir); + Ok(cmd) } -fn wait_for_port(port: u16, timeout: Duration) -> bool { - let start = Instant::now(); - while start.elapsed() < timeout { - if TcpStream::connect(("127.0.0.1", port)).is_ok() { - return true; +fn capture_bridge_output( + app_handle: tauri::AppHandle, + stream_name: &'static str, + stream: R, +) -> thread::JoinHandle<()> { + thread::spawn(move || { + for line in BufReader::new(stream).lines().map_while(Result::ok) { + record_diagnostic_log(&app_handle, &format!("{stream_name}: {line}")); } - thread::sleep(Duration::from_millis(100)); + }) +} + +fn join_bridge_log_readers() { + let readers = std::mem::take(&mut *BRIDGE_LOG_READERS.lock().unwrap()); + for reader in readers { + let _ = reader.join(); } - false } -fn path_matches(a: &str, b: &str) -> bool { - let (a, b) = (norm_path(a), norm_path(b)); +fn spawn_bridge_process( + app_handle: &tauri::AppHandle, + python_path: &str, + project_dir: &str, +) -> Result<(), BootstrapFailure> { + if is_bridge_running() { + return Err(bootstrap_failure( + BootstrapFailureCode::PortConflict, + format!( + "cannot spawn while {} is already in use", + bridge_endpoint().socket_addr() + ), + )); + } + + let mut command = bridge_command(python_path, project_dir)?; #[cfg(windows)] - { a.eq_ignore_ascii_case(&b) } + command.creation_flags(0x08000000 | 0x01000000); // CREATE_NO_WINDOW | CREATE_BREAKAWAY_FROM_JOB + + let spawn_result = command.spawn(); + #[cfg(windows)] + let mut child = match spawn_result { + Ok(child) => child, + Err(error) if should_retry_without_breakaway(error.raw_os_error()) => { + record_diagnostic_log( + app_handle, + "Windows denied CREATE_BREAKAWAY_FROM_JOB; retrying with CREATE_NO_WINDOW.", + ); + let mut fallback = bridge_command(python_path, project_dir)?; + fallback.creation_flags(0x08000000); // CREATE_NO_WINDOW + fallback.spawn().map_err(|fallback_error| { + bootstrap_failure( + BootstrapFailureCode::SpawnFailed, + format!("bridge spawn fallback failed: {fallback_error}"), + ) + })? + } + Err(error) => { + return Err(bootstrap_failure( + BootstrapFailureCode::SpawnFailed, + format!("bridge spawn failed: {error}"), + )); + } + }; #[cfg(not(windows))] - { a == b } + let mut child = spawn_result.map_err(|error| { + bootstrap_failure( + BootstrapFailureCode::SpawnFailed, + format!("bridge spawn failed: {error}"), + ) + })?; + + let mut readers = Vec::new(); + if let Some(stdout) = child.stdout.take() { + readers.push(capture_bridge_output(app_handle.clone(), "stdout", stdout)); + } + if let Some(stderr) = child.stderr.take() { + readers.push(capture_bridge_output(app_handle.clone(), "stderr", stderr)); + } + *BRIDGE_LOG_READERS.lock().unwrap() = readers; + *BRIDGE_PROCESS.lock().unwrap() = Some(child); + Ok(()) +} + +fn bridge_exit_status() -> Result, BootstrapFailure> { + let result = { + let mut process = BRIDGE_PROCESS.lock().unwrap(); + let result = match process.as_mut() { + Some(child) => child.try_wait().map_err(|error| { + bootstrap_failure( + BootstrapFailureCode::ServiceExited, + format!("failed to inspect bridge process: {error}"), + ) + })?, + None => None, + }; + if result.is_some() { + *process = None; + } + result + }; + if let Some(status) = result { + join_bridge_log_readers(); + return Ok(Some(format!("bridge exited with status {status}"))); + } + Ok(None) } -fn wait_for_bridge_identity(expected_ga_root: &str, timeout: Duration) -> bool { +fn stop_tracked_bridge() { + if let Some(mut child) = BRIDGE_PROCESS.lock().unwrap().take() { + let _ = child.kill(); + let _ = child.wait(); + } + join_bridge_log_readers(); +} + +fn wait_for_owned_bridge( + app_handle: &tauri::AppHandle, + project_dir: &str, + timeout: Duration, +) -> Result<(), BootstrapFailure> { let start = Instant::now(); + let mut unidentified_since: Option = None; while start.elapsed() < timeout { - if let Some(id) = bridge_reported_identity() { - let reported_root = id.get("ga_root").and_then(|v| v.as_str()).unwrap_or(""); - let reported_build = id.get("build_id").and_then(|v| v.as_str()).unwrap_or(""); - if reported_build == env!("GA_BUILD_ID") && path_matches(reported_root, expected_ga_root) { - return true; + if let Some(detail) = bridge_exit_status()? { + return Err(bootstrap_failure( + BootstrapFailureCode::ServiceExited, + detail, + )); + } + + if let Some(identity) = bridge_reported_identity() { + match classify_listener_identity(Some(&identity), project_dir) { + ListenerIdentity::Owned => { + set_port_diagnostics(app_handle, PortState::Owned, Some(&identity)); + return Ok(()); + } + ListenerIdentity::KnownGenericAgent => { + set_port_diagnostics(app_handle, PortState::Foreign, Some(&identity)); + return Err(bootstrap_failure( + BootstrapFailureCode::PortConflict, + "a different GenericAgent bridge answered during readiness", + )); + } + ListenerIdentity::Foreign => { + set_port_diagnostics(app_handle, PortState::Foreign, None); + return Err(bootstrap_failure( + BootstrapFailureCode::PortConflict, + "a foreign identity response answered during readiness", + )); + } + } + } + + if is_bridge_running() { + let since = unidentified_since.get_or_insert_with(Instant::now); + if BRIDGE_PROCESS.lock().unwrap().is_none() || since.elapsed() >= Duration::from_secs(2) + { + set_port_diagnostics(app_handle, PortState::Foreign, None); + return Err(bootstrap_failure( + BootstrapFailureCode::PortConflict, + "an unidentified process answered during readiness", + )); } + } else { + unidentified_since = None; } thread::sleep(Duration::from_millis(150)); } - false + + Err(bootstrap_failure( + BootstrapFailureCode::ServiceTimeout, + format!( + "bridge identity did not become ready within {} seconds", + timeout.as_secs() + ), + )) } -fn spawn_bridge_process(python_path: &str, project_dir: &str) -> Result<(), String> { - if is_bridge_running() { - return Ok(()); +fn main_ui_url_from_current(mut current_url: tauri::Url) -> Result { + if current_url.cannot_be_a_base() { + return Err("current main window URL cannot resolve an application asset".to_string()); } - let py = PathBuf::from(python_path); - let dir = PathBuf::from(project_dir); - let script = dir.join("frontends").join("desktop_bridge.py"); - if !script.exists() { - return Err(format!("desktop_bridge.py not found at {:?}", script)); + current_url.set_path("/index.html"); + current_url.set_query(None); + current_url.set_fragment(None); + Ok(current_url) +} + +fn open_main_window(app_handle: &tauri::AppHandle, dev_mode: bool) -> Result<(), BootstrapFailure> { + let main_window = app_handle.get_webview_window("main").ok_or_else(|| { + bootstrap_failure( + BootstrapFailureCode::UiNavigationFailed, + "main window is unavailable", + ) + })?; + // Derive the target from the webview's current loading.html URL so each + // platform keeps the asset scheme Tauri selected for it. WebView2 uses + // http://tauri.localhost while WKWebView uses tauri://localhost. + let current_url = main_window.url().map_err(|error| { + bootstrap_failure( + BootstrapFailureCode::UiNavigationFailed, + format!("main window URL could not be read: {error}"), + ) + })?; + let url = main_ui_url_from_current(current_url.clone()) + .map_err(|error| bootstrap_failure(BootstrapFailureCode::UiNavigationFailed, error))?; + // Source switches are invoked from index.html. Navigating that same webview while its + // Tauri command is in flight destroys the JavaScript callback, so the caller never sees + // the command resolve and a subsequent clear_ga_source can remain blocked. Initial + // bootstrap still moves loading.html to index.html; hot restarts keep the current page. + if current_url != url { + main_window.navigate(url).map_err(|error| { + bootstrap_failure( + BootstrapFailureCode::UiNavigationFailed, + format!("main window navigation failed: {error}"), + ) + })?; + } + main_window.show().map_err(|error| { + bootstrap_failure( + BootstrapFailureCode::UiNavigationFailed, + format!("main window could not be shown: {error}"), + ) + })?; + main_window.set_focus().map_err(|error| { + bootstrap_failure( + BootstrapFailureCode::UiNavigationFailed, + format!("main window could not be focused: {error}"), + ) + })?; + + if dev_mode { + main_window.open_devtools(); + } else { + let _ = main_window.eval( + r#" + document.addEventListener('keydown', function(e) { + if (e.key === 'F12' || e.key === 'F5' || + (e.ctrlKey && e.key === 'r') || + (e.ctrlKey && e.shiftKey && e.key === 'I')) { + e.preventDefault(); + } + }); + document.addEventListener('contextmenu', function(e) { + e.preventDefault(); + }); + "#, + ); } - let mut cmd = Command::new(&py); - cmd.arg(&script).current_dir(&dir); - sanitize_bundle_env(&mut cmd); - #[cfg(windows)] - cmd.creation_flags(0x08000000); // CREATE_NO_WINDOW - let child = cmd.spawn().map_err(|e| format!("Failed to spawn: {}", e))?; - *BRIDGE_PROCESS.lock().unwrap() = Some(child); + if let Some(setup_window) = app_handle.get_webview_window("setup") { + let _ = setup_window.hide(); + } Ok(()) } -fn show_bridge_window(app_handle: &tauri::AppHandle) { - if let Some(main_win) = app_handle.get_webview_window("main") { - let url = tauri::Url::parse("http://127.0.0.1:14168/").unwrap(); - let _ = main_win.navigate(url); - let _ = main_win.show(); - let _ = main_win.set_focus(); +fn show_bootstrap_recovery(app_handle: &tauri::AppHandle) { + if let Some(main_window) = app_handle.get_webview_window("main") { + let _ = main_window.hide(); } - if let Some(setup_win) = app_handle.get_webview_window("setup") { - let _ = setup_win.hide(); + if let Some(setup_window) = app_handle.get_webview_window("setup") { + let _ = setup_window.show(); + let _ = setup_window.set_focus(); } } -#[tauri::command] -fn start_bridge_with_config(app_handle: tauri::AppHandle, python_path: String, project_dir: String) -> Result<(), String> { - // Save to settings (merge so sibling keys like desktop_shortcut survive). - merge_settings(serde_json::json!({"python_path": python_path, "project_dir": project_dir})); - - spawn_bridge_process(&python_path, &project_dir)?; +static BOOTSTRAP_RUN_LOCK: Mutex<()> = Mutex::new(()); + +fn bootstrap_inner( + app_handle: &tauri::AppHandle, + python_path: &str, + project_dir: &str, + dev_mode: bool, +) -> Result<(), BootstrapFailure> { + let project = PathBuf::from(project_dir); + if project_dir.trim().is_empty() + || !project.join("agentmain.py").exists() + || !project.join("frontends").join("desktop_bridge.py").exists() + { + return Err(bootstrap_failure( + BootstrapFailureCode::ConfigUnresolved, + format!("GenericAgent source was not found at {}", project.display()), + )); + } + if !python_interpreter_resolves(python_path) { + return Err(bootstrap_failure( + BootstrapFailureCode::SpawnFailed, + format!("Python interpreter was not found at {python_path}"), + )); + } + + ensure_builtin_ga_root(project_dir) + .map_err(|detail| bootstrap_failure(BootstrapFailureCode::PrepareFailed, detail))?; + + set_bootstrap_phase(app_handle, BootstrapPhase::Resolving, Some("validate"), 10); + let expected_ga_root = effective_ga_root(project_dir); + let prepare_needed = needs_first_run_prepare(project_dir); + let already_ready = resolve_existing_listener(app_handle, &expected_ga_root)?; + if already_ready { + snapshot_update(Some(app_handle), |snapshot| { + snapshot.mode = BootstrapMode::HotStart + }); + } else { + snapshot_update(Some(app_handle), |snapshot| { + snapshot.mode = if prepare_needed { + BootstrapMode::Prepare + } else { + BootstrapMode::ColdStart + }; + }); + if prepare_needed { + set_bootstrap_phase(app_handle, BootstrapPhase::Preparing, Some("validate"), 15); + let report = |progress: i32, stage: &str| { + set_bootstrap_phase( + app_handle, + BootstrapPhase::Preparing, + Some(stage), + progress.clamp(0, 100) as u8, + ); + }; + let log = |line: &str| record_diagnostic_log(app_handle, line); + run_offline_prepare(project_dir, &report, &log) + .map_err(|detail| bootstrap_failure(BootstrapFailureCode::PrepareFailed, detail))?; + } - // Wait for port - if !wait_for_port(14168, Duration::from_secs(20)) { - return Err("Bridge did not become ready within 20s".into()); + set_bootstrap_phase( + app_handle, + BootstrapPhase::StartingService, + Some("service"), + 82, + ); + spawn_bridge_process(app_handle, python_path, project_dir)?; } - show_bridge_window(&app_handle); + set_bootstrap_phase( + app_handle, + BootstrapPhase::StartingService, + Some("service"), + 90, + ); + let timeout = if prepare_needed && !already_ready { + Duration::from_secs(60) + } else { + Duration::from_secs(30) + }; + wait_for_owned_bridge(app_handle, &expected_ga_root, timeout)?; + + set_bootstrap_phase(app_handle, BootstrapPhase::OpeningUi, Some("ui"), 98); + open_main_window(app_handle, dev_mode)?; + set_bootstrap_phase(app_handle, BootstrapPhase::Ready, None, 100); + maybe_setup_shortcut(); Ok(()) } +fn execute_bootstrap( + app_handle: &tauri::AppHandle, + python_path: String, + project_dir: String, + dev_mode: bool, +) -> Result<(), String> { + let _run_guard = BOOTSTRAP_RUN_LOCK + .lock() + .map_err(|_| "bootstrap lock poisoned".to_string())?; + let initial_mode = if needs_first_run_prepare(&project_dir) { + BootstrapMode::Prepare + } else { + BootstrapMode::ColdStart + }; + begin_bootstrap(app_handle, initial_mode, &python_path, &project_dir); + + match bootstrap_inner(app_handle, &python_path, &project_dir, dev_mode) { + Ok(()) => Ok(()), + Err(failure) => { + if should_force_stop_tracked_bridge(failure.code) { + // This handle only ever refers to a child spawned by this desktop process. + // It is safe to stop; the unidentified listener itself is never targeted. + stop_tracked_bridge(); + } + record_diagnostic_log(app_handle, &failure.detail); + snapshot_update(Some(app_handle), |snapshot| { + snapshot.phase = BootstrapPhase::Failed; + snapshot.progress = snapshot.progress.min(99); + snapshot.failure = Some(failure.clone()); + }); + show_bootstrap_recovery(app_handle); + Err(failure.detail) + } + } +} + +fn should_force_stop_tracked_bridge(code: BootstrapFailureCode) -> bool { + matches!( + code, + BootstrapFailureCode::ServiceTimeout | BootstrapFailureCode::PortConflict + ) +} + +async fn execute_bootstrap_async( + app_handle: tauri::AppHandle, + python_path: String, + project_dir: String, + dev_mode: bool, +) -> Result<(), String> { + tauri::async_runtime::spawn_blocking(move || { + execute_bootstrap(&app_handle, python_path, project_dir, dev_mode) + }) + .await + .map_err(|error| format!("bootstrap task failed: {error}"))? +} + +fn resolve_requested_bootstrap_config( + requested_python: String, + requested_project: String, +) -> Result<(String, String), String> { + if bundle_root().is_some() { + return Ok(get_or_discover_config()); + } + let python = if requested_python.trim().is_empty() { + let settings = read_settings(); + let saved = settings.get("python_path").and_then(|value| value.as_str()); + discover_python_for_project_path(Path::new(requested_project.trim()), saved) + } else { + requested_python + }; + merge_settings(serde_json::json!({ + "python_path": python, + "project_dir": requested_project + }))?; + Ok((python, requested_project)) +} + +#[tauri::command] +async fn retry_bootstrap( + app_handle: tauri::AppHandle, + python_path: String, + project_dir: String, +) -> Result<(), String> { + let (python_path, project_dir) = resolve_requested_bootstrap_config(python_path, project_dir)?; + execute_bootstrap_async(app_handle, python_path, project_dir, false).await +} + #[tauri::command] -fn start_bridge(app_handle: tauri::AppHandle) -> Result<(), String> { +async fn start_bridge_with_config( + app_handle: tauri::AppHandle, + python_path: String, + project_dir: String, +) -> Result<(), String> { + let (python_path, project_dir) = resolve_requested_bootstrap_config(python_path, project_dir)?; + execute_bootstrap_async(app_handle, python_path, project_dir, false).await +} + +#[tauri::command] +async fn start_bridge(app_handle: tauri::AppHandle) -> Result<(), String> { let (python_path, project_dir) = get_or_discover_config(); - spawn_bridge_process(&python_path, &project_dir)?; - if !wait_for_port(14168, Duration::from_secs(20)) { - return Err("Bridge did not become ready within 20s".into()); - } - show_bridge_window(&app_handle); - Ok(()) + execute_bootstrap_async(app_handle, python_path, project_dir, false).await } #[tauri::command] @@ -878,6 +2479,11 @@ fn get_config() -> (String, String) { get_or_discover_config() } +#[tauri::command] +fn discover_python_for_project(project_dir: String, current_python: Option) -> String { + discover_python_for_project_path(Path::new(project_dir.trim()), current_python.as_deref()) +} + #[tauri::command] fn export_mykey(content: String) -> Result, String> { let path = rfd::FileDialog::new() @@ -904,173 +2510,223 @@ fn pick_directory(title: Option) -> Option { dlg.pick_folder().map(|p| p.to_string_lossy().into_owned()) } -/// Stop the current bridge (ours or a stale one) and free :14168 before respawning. -fn stop_current_bridge() { - request_bridge_shutdown(); - if let Some(mut child) = BRIDGE_PROCESS.lock().unwrap().take() { - let _ = child.kill(); - let _ = child.wait(); +#[tauri::command] +fn pick_python_interpreter(title: Option) -> Result, String> { + let mut dialog = rfd::FileDialog::new(); + #[cfg(windows)] + { + dialog = dialog.add_filter("Python", &["exe"]); } - let start = Instant::now(); - while is_bridge_running() && start.elapsed() < Duration::from_secs(6) { - thread::sleep(Duration::from_millis(150)); + if let Some(value) = title.filter(|value| !value.is_empty()) { + dialog = dialog.set_title(&value); } - if is_bridge_running() { - force_free_bridge_port(); - let start = Instant::now(); - while is_bridge_running() && start.elapsed() < Duration::from_secs(5) { - thread::sleep(Duration::from_millis(150)); - } + let Some(path) = dialog.pick_file() else { + return Ok(None); + }; + if !path.is_file() { + return Err("the selected Python environment is unavailable".to_string()); } + Ok(Some(display_path(&path))) } -/// Restart the bridge with whatever get_or_discover_config() now resolves to, then reload the -/// webview so it reconnects. Shared by set_ga_source / clear_ga_source. -fn switch_bridge(app_handle: &tauri::AppHandle) -> Result { - stop_current_bridge(); - let (py, project) = get_or_discover_config(); - if project.is_empty() { - return Err("no GenericAgent source resolved".into()); - } - let expected_ga_root = valid_ga_source_override().unwrap_or_else(|| project.clone()); - spawn_bridge_process(&py, &project)?; - if !wait_for_port(14168, Duration::from_secs(20)) { - return Err("bridge did not become ready within 20s".into()); - } - if !wait_for_bridge_identity(&expected_ga_root, Duration::from_secs(10)) { - return Err(format!("bridge did not switch to GA workspace: {}", expected_ga_root)); - } - show_bridge_window(app_handle); - Ok(expected_ga_root) +#[tauri::command] +fn pick_data_backup_file(title: Option) -> Option { + let mut dialog = rfd::FileDialog::new().add_filter("ZIP", &["zip"]); + if let Some(value) = title.filter(|value| !value.is_empty()) { + dialog = dialog.set_title(&value); + } + dialog + .pick_file() + .map(|path| path.to_string_lossy().into_owned()) } #[tauri::command] -fn get_ga_source() -> String { - read_settings() - .get("ga_source_override") - .and_then(|v| v.as_str()) - .unwrap_or("") - .to_string() +fn pick_data_export_path(default_name: String, title: Option) -> Option { + let safe_default = Path::new(&default_name) + .file_name() + .and_then(|name| name.to_str()) + .filter(|name| name.to_ascii_lowercase().ends_with(".zip")) + .unwrap_or("GenericAgent-data-backup.zip"); + let mut dialog = rfd::FileDialog::new() + .add_filter("ZIP", &["zip"]) + .set_file_name(safe_default); + if let Some(value) = title.filter(|value| !value.is_empty()) { + dialog = dialog.set_title(&value); + } + dialog.save_file().map(|mut path| { + if path.extension().and_then(|value| value.to_str()) != Some("zip") { + path.set_extension("zip"); + } + path.to_string_lossy().into_owned() + }) } #[tauri::command] -fn move_ga_runtime(app_handle: tauri::AppHandle, dir: String) -> Result { - let previous_override = read_settings() - .get("ga_source_override") - .and_then(|v| v.as_str()) - .map(|s| s.to_string()); - let src_s = valid_ga_source_override().or_else(|| find_project_dir()).unwrap_or_default(); - let src = PathBuf::from(src_s.trim()); - let parent = PathBuf::from(dir.trim()); - if src_s.trim().is_empty() { - return Err("current GA workspace is empty; wait for the bridge to become ready and try again".into()); - } - if dir.trim().is_empty() { - return Err("target parent directory is empty".into()); - } - if !src.is_dir() || !src.join("agentmain.py").exists() { - return Err(format!("current GA workspace is invalid: {}", src.to_string_lossy())); - } - std::fs::create_dir_all(&parent).map_err(|e| format!("cannot create target parent dir: {}", e))?; - let src_c = src.canonicalize().unwrap_or(src.clone()); - let parent_c = parent.canonicalize().unwrap_or(parent.clone()); - let name = src_c.file_name().and_then(|s| s.to_str()).unwrap_or("GenericAgent"); - let folder_name = if name == "app" { "GenericAgent" } else { name }; - let dst = parent_c.join(folder_name); - let dst_c = if dst.exists() { dst.canonicalize().unwrap_or(dst.clone()) } else { dst.clone() }; - if same_path(&src_c, &dst_c) { - merge_settings(serde_json::json!({ "ga_source_override": display_path(&dst_c) })); - return switch_bridge(&app_handle).map_err(|err| { - restore_setting("ga_source_override", previous_override.clone()); - err - }); - } - if dst_c.starts_with(&src_c) { - return Err("target directory cannot be inside the current GA workspace".into()); - } - if dst_c.exists() { - return Err(format!("target GA workspace already exists: {}", display_path(&dst_c))); - } - copy_dir_replace(&src_c, &dst_c)?; - merge_settings(serde_json::json!({ "ga_source_override": display_path(&dst_c) })); - if let Err(err) = switch_bridge(&app_handle) { - restore_setting("ga_source_override", previous_override); - return Err(err); +fn reveal_in_file_manager(path: String) -> Result<(), String> { + let target = PathBuf::from(path.trim()); + if !target.is_file() { + return Err("the selected file is unavailable".to_string()); } + #[cfg(target_os = "macos")] + let mut command = { + let mut command = Command::new("open"); + command.arg("-R").arg(&target); + command + }; + #[cfg(windows)] + let mut command = { + let mut command = Command::new("explorer"); + command.arg("/select,").arg(&target); + command.creation_flags(0x08000000); + command + }; + #[cfg(all(unix, not(target_os = "macos")))] + let mut command = { + let mut command = Command::new("xdg-open"); + command.arg(target.parent().unwrap_or(Path::new("."))); + command + }; + command + .spawn() + .map(|_| ()) + .map_err(|error| format!("cannot reveal the selected file: {error}")) +} - // The packaged bundle's own runtime/app is still needed by the desktop shell and - // bridge. Only remove the old source when it is already a user-selected external copy. - let bundled = bundled_project_dir(); - if !bundled.as_ref().map(|p| same_path(&src_c, p)).unwrap_or(false) { - if let Err(e) = std::fs::remove_dir_all(&src_c) { - eprintln!("remove old runtime {:?}: {}", src_c, e); - } - } - Ok(display_path(&dst_c)) +#[tauri::command] +fn get_ga_source() -> String { + valid_ga_source_override().unwrap_or_default() +} + +fn saved_ga_source_override() -> Option { + read_settings() + .get("ga_source_override") + .and_then(|value| value.as_str()) + .map(str::to_string) } -/// Run the contract probe (frontends/ga_contract_probe.py, shipped with the bundle) against a -/// target ga_root using the bundle python. Returns Ok(()) if the核 satisfies the bridge/conductor -/// contract, or Err(message) listing what's missing / why it's incompatible. fn probe_ga_source(dir: &str) -> Result<(), String> { - let (py, bundle_project) = get_or_discover_config(); - if py.is_empty() { - return Err("no python available to run the compatibility probe".into()); + let (python, bundle_project) = get_or_discover_config(); + if python.is_empty() { + return Err("no python available to run the compatibility probe".to_string()); } - let probe = PathBuf::from(&bundle_project).join("frontends").join("ga_contract_probe.py"); + let probe = PathBuf::from(&bundle_project) + .join("frontends") + .join("ga_contract_probe.py"); if !probe.exists() { - // No probe shipped → skip the check rather than block (backward compatible). - return Ok(()); + return Err("the packaged compatibility probe is missing".to_string()); } - let mut cmd = Command::new(&py); - cmd.arg(&probe).arg(dir); - sanitize_bundle_env(&mut cmd); - // If switching from one external core to another, validate the candidate core, not the - // previously saved GA_ROOT that sanitize_bundle_env may have injected. - cmd.env("GA_ROOT", dir); + + let mut command = Command::new(python); + command.arg(probe).arg(dir); + sanitize_bundle_env(&mut command, &bundle_project); + command.env("GA_ROOT", dir); #[cfg(windows)] - cmd.creation_flags(0x08000000); - let out = cmd.output().map_err(|e| format!("probe failed to run: {}", e))?; - let stdout = String::from_utf8_lossy(&out.stdout); - // The probe prints a JSON line: {"ok":bool,"missing":[..],"error":".."}. - if let Some(line) = stdout.lines().rev().find(|l| l.trim_start().starts_with('{')) { - if let Ok(v) = serde_json::from_str::(line.trim()) { - if v.get("ok").and_then(|b| b.as_bool()).unwrap_or(false) { + command.creation_flags(0x08000000); + let output = command + .output() + .map_err(|error| format!("compatibility probe failed to run: {error}"))?; + let stdout = String::from_utf8_lossy(&output.stdout); + if let Some(line) = stdout + .lines() + .rev() + .find(|line| line.trim_start().starts_with('{')) + { + if let Ok(verdict) = serde_json::from_str::(line.trim()) { + if verdict.get("ok").and_then(|value| value.as_bool()) == Some(true) { return Ok(()); } - let missing = v.get("missing") - .and_then(|m| m.as_array()) - .map(|a| a.iter().filter_map(|x| x.as_str()).collect::>().join(", ")) + let missing = verdict + .get("missing") + .and_then(|value| value.as_array()) + .map(|items| { + items + .iter() + .filter_map(|item| item.as_str()) + .collect::>() + .join(", ") + }) .unwrap_or_default(); - let err = v.get("error").and_then(|e| e.as_str()).unwrap_or(""); - let mut msg = String::from("this GenericAgent core is not compatible"); - if !missing.is_empty() { msg = format!("{}: missing {}", msg, missing); } - if !err.is_empty() { msg = format!("{} ({})", msg, err); } - return Err(msg); + let detail = verdict + .get("error") + .and_then(|value| value.as_str()) + .unwrap_or(""); + let mut message = "this GenericAgent core is not compatible".to_string(); + if !missing.is_empty() { + message.push_str(&format!(": missing {missing}")); + } + if !detail.is_empty() { + message.push_str(&format!(" ({detail})")); + } + return Err(message); } } - Err(format!("compatibility probe returned no verdict: {}", - String::from_utf8_lossy(&out.stderr).lines().last().unwrap_or(""))) + let stderr = String::from_utf8_lossy(&output.stderr); + Err(format!( + "compatibility probe returned no verdict: {}", + stderr.lines().last().unwrap_or("") + )) } -#[tauri::command] -fn set_ga_source(app_handle: tauri::AppHandle, dir: String) -> Result { - let p = PathBuf::from(&dir); - if !p.join("agentmain.py").exists() { - return Err("not a GenericAgent source: agentmain.py not found".into()); +fn validated_ga_source(dir: &str) -> Result { + let source = PathBuf::from(dir.trim()); + if !source.join("agentmain.py").exists() { + return Err("not a GenericAgent source: agentmain.py not found".to_string()); + } + let source = source.canonicalize().unwrap_or(source); + let source_text = display_path(&source); + probe_ga_source(&source_text)?; + Ok(source_text) +} + +async fn restart_for_current_source(app_handle: tauri::AppHandle) -> Result { + let (python_path, project_dir) = get_or_discover_config(); + let expected_ga_root = effective_ga_root(&project_dir); + execute_bootstrap_async(app_handle, python_path, project_dir, false).await?; + Ok(expected_ga_root) +} + +async fn apply_ga_source_with_rollback( + app_handle: tauri::AppHandle, + next_override: Option, + previous_override: Option, +) -> Result { + restore_setting("ga_source_override", next_override)?; + match restart_for_current_source(app_handle.clone()).await { + Ok(root) => Ok(root), + Err(error) => { + restore_setting("ga_source_override", previous_override).map_err(|rollback_error| { + format!( + "{error}; restoring the previous workspace setting failed: {rollback_error}" + ) + })?; + match restart_for_current_source(app_handle).await { + Ok(_) => Err(error), + Err(rollback_error) => Err(format!( + "{error}; restoring the previous workspace also failed: {rollback_error}" + )), + } + } } - // 方案三: we do NOT copy files into 本体. We run the bundle's own bridge/frontend and point - // its ga_root at this external核 via GA_ROOT. Verify the核 satisfies the contract first so a - // stale/incompatible核 fails up front with a clear message instead of a runtime crash. - probe_ga_source(&dir)?; - merge_settings(serde_json::json!({ "ga_source_override": dir })); - switch_bridge(&app_handle) } #[tauri::command] -fn clear_ga_source(app_handle: tauri::AppHandle) -> Result { - remove_setting("ga_source_override"); - switch_bridge(&app_handle) +async fn validate_ga_source(dir: String) -> Result { + tauri::async_runtime::spawn_blocking(move || validated_ga_source(&dir)) + .await + .map_err(|error| format!("compatibility probe task failed: {error}"))? +} + +#[tauri::command] +async fn set_ga_source(app_handle: tauri::AppHandle, dir: String) -> Result { + let source_text = validate_ga_source(dir).await?; + let previous_override = saved_ga_source_override(); + apply_ga_source_with_rollback(app_handle, Some(source_text), previous_override).await +} + +#[tauri::command] +async fn clear_ga_source(app_handle: tauri::AppHandle) -> Result { + let previous_override = saved_ga_source_override(); + apply_ga_source_with_rollback(app_handle, None, previous_override).await } #[cfg_attr(mobile, tauri::mobile_entry_point)] @@ -1079,174 +2735,154 @@ pub fn run() { let no_autostart = args.iter().any(|a| a == "--no-autostart"); let dev_mode = args.iter().any(|a| a == "--dev"); - // Resolve the effective config once. project_dir is ALWAYS the bundle's own (方案三: we run - // our own bridge/frontend); the external核, if any, is injected via GA_ROOT in - // sanitize_bundle_env. Identity/takeover must compare against the EFFECTIVE ga_root (what the - // bridge will report), not the bundle script dir. let (eff_py, eff_project) = get_or_discover_config(); - let effective_ga_root = valid_ga_source_override().unwrap_or_else(|| eff_project.clone()); - let needs_prepare = needs_first_run_prepare(&eff_project); - - takeover_stale_bridge(&effective_ga_root); - - let bridge_ok = is_bridge_running(); - let mut spawned_bridge = false; - // Skip the early spawn when a first-run prepare is required (no venv yet); - // the setup thread prepares the env first and then starts the bridge. - if !bridge_ok && !no_autostart && !needs_prepare { - let dir = PathBuf::from(&eff_project); - let script = dir.join("frontends").join("desktop_bridge.py"); - if script.exists() { - let mut cmd = Command::new(&eff_py); - cmd.arg(&script).current_dir(&dir); - sanitize_bundle_env(&mut cmd); - #[cfg(windows)] - cmd.creation_flags(0x08000000); - if let Ok(child) = cmd.spawn() { - *BRIDGE_PROCESS.lock().unwrap() = Some(child); - spawned_bridge = true; - } - } - } - tauri::Builder::default() + let builder = tauri::Builder::default() + .plugin(tauri_plugin_opener::init()) .plugin(tauri_plugin_single_instance::init(|app, _args, _cwd| { - if let Some(w) = app.get_webview_window("main") { - let _ = w.unminimize(); - let _ = w.show(); - let _ = w.set_focus(); + let bootstrap_failed = matches!( + BOOTSTRAP_STATE.lock().unwrap().phase, + BootstrapPhase::Failed + ); + if bootstrap_failed { + if let Some(window) = app.get_webview_window("setup") { + let _ = window.show(); + let _ = window.set_focus(); + } + } else if let Some(window) = app.get_webview_window("main") { + let _ = window.unminimize(); + let _ = window.show(); + let _ = window.set_focus(); } - })) - .invoke_handler(tauri::generate_handler![start_bridge_with_config, start_bridge, get_config, export_mykey, pick_directory, get_ga_source, set_ga_source, clear_ga_source, move_ga_runtime, shortcut_should_ask, shortcut_decide, get_prepare_error]) + })); + + #[cfg(feature = "e2e")] + let builder = if std::env::var("GA_E2E").ok().as_deref() == Some("1") { + builder + .plugin(tauri_plugin_wdio::init()) + .plugin(tauri_plugin_wdio_webdriver::init()) + } else { + builder + }; + + builder + .invoke_handler(tauri::generate_handler![ + start_bridge_with_config, + start_bridge, + retry_bootstrap, + get_bootstrap_snapshot, + get_config, + discover_python_for_project, + export_mykey, + pick_directory, + pick_python_interpreter, + pick_data_backup_file, + pick_data_export_path, + reveal_in_file_manager, + get_ga_source, + validate_ga_source, + set_ga_source, + clear_ga_source, + shortcut_should_ask, + shortcut_decide + ]) .setup(move |app| { // Show the loading window immediately so the first-run prepare isn't a blank screen. // The window starts on loading.html (a local page), so no "connection refused" flash. if let Some(w) = app.get_webview_window("main") { + // Windows: remove native decorations at runtime (config keeps them for macOS + // traffic lights). titleBarStyle:"Overlay" is macOS-only in Tauri v2. + #[cfg(windows)] + let _ = w.set_decorations(false); let _ = w.show(); } - let handle = app.handle().clone(); - let project_dir = eff_project.clone(); - thread::spawn(move || { - // Progress reporter: push status into the loading window (window.gaProgress). - let main_win = handle.get_webview_window("main"); - - let report = |pct: i32, msg: &str| { - if let Some(w) = &main_win { - let js = format!( - "window.gaProgress && window.gaProgress({}, {})", - pct, - serde_json::to_string(msg).unwrap_or_else(|_| "\"\"".to_string()) - ); - let _ = w.eval(&js); - } - }; - - // First-run (self-contained bundle): prepare the embedded python env offline, - // then start the bridge with the freshly created venv. - if needs_prepare { - report(5, "start"); - if let Err(e) = run_offline_prepare(&project_dir, &report) { - eprintln!("[tauri] first-run prepare failed: {}", e); - // Persist the error for the setup window and to a log file next to the - // bundle, so the failure is explicit instead of a silent config screen. - *PREPARE_ERROR.lock().unwrap() = Some(e.clone()); - if let Some(root) = bundle_root() { - let _ = std::fs::write(root.join("prepare_error.log"), &e); - } - if let Some(sw) = handle.get_webview_window("setup") { let _ = sw.show(); } - if let Some(mw) = handle.get_webview_window("main") { let _ = mw.hide(); } - return; - } - report(95, "starting"); - if !is_bridge_running() { - let (py_str, dir_str) = get_or_discover_config(); - let dir = PathBuf::from(&dir_str); - let script = dir.join("frontends").join("desktop_bridge.py"); - if script.exists() { - let mut cmd = Command::new(&py_str); - cmd.arg(&script).current_dir(&dir); - sanitize_bundle_env(&mut cmd); - #[cfg(windows)] - cmd.creation_flags(0x08000000); - if let Ok(child) = cmd.spawn() { - *BRIDGE_PROCESS.lock().unwrap() = Some(child); + // Windows: system tray so the app can hide-on-close instead of exiting. + #[cfg(windows)] + { + let show_item = MenuItemBuilder::with_id("show", "显示主窗口").build(app)?; + let quit_item = MenuItemBuilder::with_id("quit", "退出").build(app)?; + let menu = MenuBuilder::new(app) + .item(&show_item) + .separator() + .item(&quit_item) + .build()?; + + let _tray = TrayIconBuilder::new() + .icon(app.default_window_icon().unwrap().clone()) + .tooltip("GenericAgent") + .menu(&menu) + .on_menu_event(|app, event| match event.id().as_ref() { + "show" => { + if let Some(w) = app.get_webview_window("main") { + let _ = w.show(); + let _ = w.unminimize(); + let _ = w.set_focus(); } } - } - } - - // First run (prepare) and cold bridge start may take a while; allow up to 60s. - let wait = if needs_prepare || spawned_bridge { - Duration::from_secs(60) - } else { - Duration::from_secs(2) - }; - let bridge_ready = wait_for_port(14168, wait); - - if bridge_ready { - // The bridge auto-starts conductor + scheduler itself (on_startup), so we do - // NOT probe their ports here: that would self-detect the bridge's own - // just-started extras and falsely report "ports busy". - if !wait_for_port(14168, Duration::from_secs(15)) { - eprintln!("[tauri] bridge not reachable before navigate"); - if let Some(w) = &main_win { - let msg = "无法连接 bridge (127.0.0.1:14168),请关闭程序后重试。"; - let js = format!( - "alert({})", - serde_json::to_string(msg).unwrap_or_else(|_| "\"\"".to_string()) - ); - let _ = w.eval(&js); + "quit" => { + app.exit(0); } - return; - } - // Navigate to the bridge HTTP only after it is ready. - if let Some(w) = handle.get_webview_window("main") { - if let Ok(url) = tauri::Url::parse("http://127.0.0.1:14168/") { - let _ = w.navigate(url); - } - if dev_mode { - w.open_devtools(); - } else { - // Disable F5/F12/Ctrl+R/right-click in production - let _ = w.eval(r#" - document.addEventListener('keydown', function(e) { - if (e.key === 'F12' || e.key === 'F5' || - (e.ctrlKey && e.key === 'r') || - (e.ctrlKey && e.shiftKey && e.key === 'I')) { - e.preventDefault(); - } - }); - document.addEventListener('contextmenu', function(e) { - e.preventDefault(); - }); - "#); + _ => {} + }) + .on_tray_icon_event(|tray, event| { + if let TrayIconEvent::Click { + button: MouseButton::Left, + button_state: MouseButtonState::Up, + .. + } = event + { + if let Some(w) = tray.app_handle().get_webview_window("main") { + let _ = w.show(); + let _ = w.unminimize(); + let _ = w.set_focus(); + } } - let _ = w.show(); - let _ = w.set_focus(); - } - if let Some(sw) = handle.get_webview_window("setup") { let _ = sw.hide(); } - // App is up and reachable: ask-once / self-heal the desktop shortcut. - // Runs last so it never blocks the loading/navigation path. - maybe_setup_shortcut(); + }) + .build(app)?; + } + + let handle = app.handle().clone(); + let python_path = eff_py.clone(); + let project_dir = eff_project.clone(); + thread::spawn(move || { + if no_autostart && !is_bridge_running() { + begin_bootstrap( + &handle, + BootstrapMode::ColdStart, + &python_path, + &project_dir, + ); + let failure = bootstrap_failure( + BootstrapFailureCode::Unknown, + "automatic bridge startup was disabled by --no-autostart", + ); + snapshot_update(Some(&handle), |snapshot| { + snapshot.phase = BootstrapPhase::Failed; + snapshot.failure = Some(failure); + }); + show_bootstrap_recovery(&handle); } else { - // Bridge never came up -> let the user fix paths in the setup window. - if let Some(sw) = handle.get_webview_window("setup") { - if dev_mode { sw.open_devtools(); } - let _ = sw.show(); - } - if let Some(mw) = handle.get_webview_window("main") { let _ = mw.hide(); } + let _ = execute_bootstrap(&handle, python_path, project_dir, dev_mode); } }); Ok(()) }) .on_window_event(|window, event| { - if let tauri::WindowEvent::CloseRequested { .. } = event { + if let tauri::WindowEvent::CloseRequested { api, .. } = event { let label = window.label(); if label == "main" { - // Persistent backend: closing the window does NOT stop the bridge or its - // services, so relaunching attaches to the warm backend on 14168. - window.app_handle().exit(0); + #[cfg(windows)] + { + // Windows: hide to tray instead of exiting. Bridge stays alive. + api.prevent_close(); + let _ = window.hide(); + } + #[cfg(not(windows))] + { + let _ = api; + window.app_handle().exit(0); + } } else if label == "setup" { // Setup closed -> exit if main is not visible if let Some(main_win) = window.app_handle().get_webview_window("main") { @@ -1262,3 +2898,799 @@ pub fn run() { .run(tauri::generate_context!()) .expect("error while running tauri application"); } + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn sensitive_diagnostic_lines_are_replaced_and_long_lines_are_bounded() { + assert_eq!( + sanitize_diagnostic_line("Authorization: Bearer super-secret"), + "[redacted sensitive diagnostic line]" + ); + assert_eq!( + sanitize_diagnostic_line("API_KEY=should-not-leak"), + "[redacted sensitive diagnostic line]" + ); + assert_eq!( + sanitize_diagnostic_line("[session] Quarterly planning"), + "[redacted sensitive diagnostic line]" + ); + assert_eq!( + sanitize_diagnostic_line("restored memory entry: personal note"), + "[redacted sensitive diagnostic line]" + ); + assert!(sanitize_diagnostic_line(&"x".repeat(4096)).len() <= MAX_DIAGNOSTIC_LINE_BYTES); + } + + #[test] + fn recent_log_buffer_keeps_only_the_last_hundred_lines() { + let mut logs = VecDeque::new(); + for index in 0..125 { + push_bounded_log(&mut logs, &format!("line-{index}")); + } + assert_eq!(logs.len(), MAX_DIAGNOSTIC_LINES); + assert_eq!(logs.front().map(String::as_str), Some("line-25")); + assert_eq!(logs.back().map(String::as_str), Some("line-124")); + } + + #[test] + fn listener_identity_distinguishes_owned_known_and_foreign_ports() { + let project = std::env::current_dir().unwrap(); + let project_text = project.to_string_lossy(); + let owned = serde_json::json!({ + "ga_root": project_text, + "build_id": env!("GA_BUILD_ID"), + "pid": 100 + }); + let old = serde_json::json!({ + "ga_root": project_text, + "build_id": "older-build", + "pid": 101 + }); + assert_eq!( + classify_listener_identity(Some(&owned), &project_text), + ListenerIdentity::Owned + ); + assert_eq!( + classify_listener_identity(Some(&old), &project_text), + ListenerIdentity::KnownGenericAgent + ); + assert_eq!( + classify_listener_identity(None, &project_text), + ListenerIdentity::Foreign + ); + assert_eq!( + classify_listener_identity(Some(&serde_json::json!({"status": "ok"})), &project_text), + ListenerIdentity::Foreign + ); + } + + #[test] + fn bridge_identity_is_bounded_and_only_keeps_allowlisted_fields() { + let normalized = normalize_bridge_identity(serde_json::json!({ + "ga_root": "/tmp/GenericAgent", + "build_id": "build-1", + "pid": 42, + "authorization": "must-not-survive" + })) + .unwrap(); + assert_eq!( + normalized.get("ga_root").and_then(|value| value.as_str()), + Some("/tmp/GenericAgent") + ); + assert_eq!( + normalized.get("build_id").and_then(|value| value.as_str()), + Some("build-1") + ); + assert_eq!( + normalized.get("pid").and_then(|value| value.as_u64()), + Some(42) + ); + assert!(normalized.get("authorization").is_none()); + + assert!(normalize_bridge_identity(serde_json::json!({ + "ga_root": "x".repeat(MAX_IDENTITY_PATH_BYTES + 1), + "build_id": "build-1", + "pid": 42 + })) + .is_none()); + assert!(normalize_bridge_identity(serde_json::json!({ + "ga_root": "/tmp/GenericAgent", + "build_id": "x".repeat(MAX_IDENTITY_BUILD_BYTES + 1), + "pid": 42 + })) + .is_none()); + } + + #[test] + fn bridge_shutdown_response_distinguishes_acceptance_and_explicit_refusal() { + assert_eq!( + parse_bridge_shutdown_response(b"HTTP/1.1 200 OK\r\nContent-Length: 2\r\n\r\n{}"), + BridgeShutdownResponse::Accepted + ); + assert_eq!( + parse_bridge_shutdown_response( + b"HTTP/1.1 409 Conflict\r\nContent-Type: application/json\r\n\r\n{\"code\":\"maintenance_conflict\"}" + ), + BridgeShutdownResponse::Refused { + status: 409, + maintenance: true, + } + ); + assert_eq!( + parse_bridge_shutdown_response(b"HTTP/1.0 503 Unavailable\r\n\r\n"), + BridgeShutdownResponse::Refused { + status: 503, + maintenance: false, + } + ); + assert_eq!( + parse_bridge_shutdown_response(b"HTTP/1.1 409"), + BridgeShutdownResponse::Indeterminate + ); + assert_eq!( + parse_bridge_shutdown_response(b"NOT-HTTP 200 OK\r\n\r\n"), + BridgeShutdownResponse::Indeterminate + ); + let mut non_utf8_refusal = b"HTTP/1.1 503 Unavailable\r\n\r\n".to_vec(); + non_utf8_refusal.push(0xff); + assert_eq!( + parse_bridge_shutdown_response(&non_utf8_refusal), + BridgeShutdownResponse::Refused { + status: 503, + maintenance: false, + } + ); + } + + #[test] + fn explicit_shutdown_refusal_never_allows_force_stopping_the_tracked_bridge() { + let failure = shutdown_refusal_failure(BridgeShutdownResponse::Refused { + status: 409, + maintenance: true, + }) + .unwrap(); + assert_eq!(failure.code, BootstrapFailureCode::BridgeShutdownRefused); + assert!(failure.detail.contains("data maintenance")); + assert!(!should_force_stop_tracked_bridge(failure.code)); + assert!(should_force_stop_tracked_bridge( + BootstrapFailureCode::PortConflict + )); + assert!(should_force_stop_tracked_bridge( + BootstrapFailureCode::ServiceTimeout + )); + } + + #[test] + fn shutdown_request_honors_a_live_bridge_maintenance_refusal() { + use std::io::{Read, Write}; + use std::net::TcpListener; + use std::sync::mpsc; + + let listener = TcpListener::bind("127.0.0.1:0").unwrap(); + let port = listener.local_addr().unwrap().port(); + let (request_sender, request_receiver) = mpsc::channel(); + let server = thread::spawn(move || { + let (mut stream, _) = listener.accept().unwrap(); + let mut request = [0u8; 1024]; + let length = stream.read(&mut request).unwrap(); + request_sender.send(request[..length].to_vec()).unwrap(); + let body = br#"{"code":"maintenance_conflict"}"#; + write!( + stream, + "HTTP/1.1 409 Conflict\r\nContent-Type: application/json\r\nContent-Length: {}\r\nConnection: close\r\n\r\n", + body.len() + ) + .unwrap(); + stream.write_all(body).unwrap(); + }); + let endpoint = BridgeEndpoint { + host: "127.0.0.1".to_string(), + port, + }; + + assert_eq!( + request_bridge_shutdown_at(&endpoint), + BridgeShutdownResponse::Refused { + status: 409, + maintenance: true, + } + ); + let request = String::from_utf8(request_receiver.recv().unwrap()).unwrap(); + assert!(request.starts_with("POST /services/bridge/exit HTTP/1.1\r\n")); + server.join().unwrap(); + } + + #[test] + fn breakaway_fallback_is_limited_to_access_denied() { + assert!(should_retry_without_breakaway(Some(5))); + assert!(!should_retry_without_breakaway(Some(2))); + assert!(!should_retry_without_breakaway(None)); + } + + #[test] + fn python_validation_rejects_an_unresolvable_explicit_path() { + let current_exe = std::env::current_exe().unwrap(); + assert!(python_interpreter_resolves(¤t_exe.to_string_lossy())); + assert!(!python_interpreter_resolves( + "/definitely/missing/genericagent-python" + )); + } + + #[test] + fn project_python_discovery_prefers_venv_then_sorted_portable_then_saved() { + let root = std::env::temp_dir().join(format!( + "ga-python-discovery-{}-{}", + std::process::id(), + std::time::SystemTime::now() + .duration_since(std::time::UNIX_EPOCH) + .unwrap() + .as_nanos() + )); + let portable_a = root.join(".portable").join("uv-python").join("a"); + let portable_z = root.join(".portable").join("uv-python").join("z"); + #[cfg(windows)] + let portable_a_python = portable_a.join("python.exe"); + #[cfg(not(windows))] + let portable_a_python = portable_a.join("bin").join("python3"); + #[cfg(windows)] + let portable_z_python = portable_z.join("python.exe"); + #[cfg(not(windows))] + let portable_z_python = portable_z.join("bin").join("python3"); + std::fs::create_dir_all(portable_a_python.parent().unwrap()).unwrap(); + std::fs::create_dir_all(portable_z_python.parent().unwrap()).unwrap(); + std::fs::write(&portable_a_python, []).unwrap(); + std::fs::write(&portable_z_python, []).unwrap(); + + let current_exe = std::env::current_exe().unwrap(); + assert_eq!( + discover_python_for_project_path(&root, Some(current_exe.to_str().unwrap())), + display_path(&portable_a_python) + ); + + let venv = project_venv_python(&root); + std::fs::create_dir_all(venv.parent().unwrap()).unwrap(); + std::fs::write(&venv, []).unwrap(); + assert_eq!( + discover_python_for_project_path(&root, Some(current_exe.to_str().unwrap())), + display_path(&venv) + ); + std::fs::remove_dir_all(&root).unwrap(); + } + + #[test] + fn bridge_endpoint_uses_defaults_and_validates_overrides() { + let default = bridge_endpoint_from_values(None, None).unwrap(); + assert_eq!(default.host, "127.0.0.1"); + assert_eq!(default.port, 14168); + assert_eq!(default.socket_addr(), "127.0.0.1:14168"); + + let custom = bridge_endpoint_from_values(Some("localhost"), Some("24168")).unwrap(); + assert_eq!(custom.host, "localhost"); + assert_eq!(custom.port, 24168); + + assert!(bridge_endpoint_from_values(Some("0.0.0.0"), Some("24168")).is_err()); + assert!(bridge_endpoint_from_values(Some("127.0.0.1"), Some("0")).is_err()); + assert!(bridge_endpoint_from_values(Some("127.0.0.1"), Some("bad")).is_err()); + } + + #[test] + fn main_ui_url_keeps_the_platform_asset_origin() { + let windows = main_ui_url_from_current( + tauri::Url::parse("http://tauri.localhost/loading.html?phase=ready#status").unwrap(), + ) + .unwrap(); + assert_eq!(windows.as_str(), "http://tauri.localhost/index.html"); + + let macos = + main_ui_url_from_current(tauri::Url::parse("tauri://localhost/loading.html").unwrap()) + .unwrap(); + assert_eq!(macos.as_str(), "tauri://localhost/index.html"); + + let dev = main_ui_url_from_current( + tauri::Url::parse("http://localhost:5173/loading.html").unwrap(), + ) + .unwrap(); + assert_eq!(dev.as_str(), "http://localhost:5173/index.html"); + + let current = tauri::Url::parse("tauri://localhost/index.html").unwrap(); + assert_eq!(main_ui_url_from_current(current.clone()).unwrap(), current); + } + + #[test] + fn main_ui_url_rejects_non_hierarchical_urls() { + let data_url = tauri::Url::parse("data:text/plain,loading").unwrap(); + assert!(main_ui_url_from_current(data_url).is_err()); + } + + #[test] + fn explicit_e2e_settings_path_wins_over_platform_home_resolution() { + let resolved = resolve_settings_path( + Some(PathBuf::from("C:\\Users\\runneradmin")), + Some("C:\\sandbox\\home\\.ga_desktop_settings.json"), + ); + assert_eq!( + resolved, + PathBuf::from("C:\\sandbox\\home\\.ga_desktop_settings.json") + ); + + assert_eq!( + resolve_settings_path(Some(PathBuf::from("/home/user")), None), + PathBuf::from("/home/user/.ga_desktop_settings.json") + ); + } + + fn runtime_test_root(label: &str) -> PathBuf { + let root = std::env::temp_dir().join(format!( + "ga-runtime-{label}-{}-{}", + std::process::id(), + std::time::SystemTime::now() + .duration_since(std::time::UNIX_EPOCH) + .unwrap() + .as_nanos() + )); + std::fs::create_dir_all(&root).unwrap(); + root + } + + #[test] + fn settings_update_rejects_malformed_json_without_overwriting_it() { + let root = runtime_test_root("settings-malformed"); + let settings = root.join(".ga_desktop_settings.json"); + let malformed = b"{\"ga_source_override\":"; + std::fs::write(&settings, malformed).unwrap(); + + let error = update_settings_at(&settings, |document| { + document.insert("desktop_shortcut".to_string(), serde_json::json!(true)); + }) + .unwrap_err(); + + assert!(error.contains("cannot parse Desktop settings")); + assert_eq!(std::fs::read(&settings).unwrap(), malformed); + assert!(!settings + .with_file_name(".ga_desktop_settings.json.lock") + .exists()); + std::fs::remove_dir_all(root).unwrap(); + } + + #[test] + fn settings_lock_serializes_read_modify_replace_and_preserves_union() { + use std::sync::mpsc; + + let root = runtime_test_root("settings-union"); + let settings = root.join(".ga_desktop_settings.json"); + std::fs::write(&settings, "{}\n").unwrap(); + let (locked_sender, locked_receiver) = mpsc::channel(); + let (release_sender, release_receiver) = mpsc::channel(); + let first_path = settings.clone(); + let first = thread::spawn(move || { + let _lock = SettingsFileLock::acquire(&first_path).unwrap(); + let mut document = read_settings_from_strict(&first_path).unwrap(); + locked_sender.send(()).unwrap(); + release_receiver.recv().unwrap(); + document.insert("ui".to_string(), serde_json::json!({"lang": "en"})); + write_settings_atomically(&first_path, &serde_json::Value::Object(document)).unwrap(); + }); + locked_receiver.recv().unwrap(); + let second_path = settings.clone(); + let second = thread::spawn(move || { + update_settings_at(&second_path, |document| { + document.insert("conductor".to_string(), serde_json::json!({"llmNo": 2})); + }) + .unwrap(); + }); + thread::sleep(Duration::from_millis(100)); + assert!(!second.is_finished()); + release_sender.send(()).unwrap(); + first.join().unwrap(); + second.join().unwrap(); + + let document = read_settings_from_strict(&settings).unwrap(); + assert_eq!(document.get("ui"), Some(&serde_json::json!({"lang": "en"}))); + assert_eq!( + document.get("conductor"), + Some(&serde_json::json!({"llmNo": 2})) + ); + assert!(!settings + .with_file_name(".ga_desktop_settings.json.lock") + .exists()); + let residue = std::fs::read_dir(&root) + .unwrap() + .filter_map(Result::ok) + .filter(|entry| entry.file_name().to_string_lossy().ends_with(".tmp")) + .count(); + assert_eq!(residue, 0); + std::fs::remove_dir_all(root).unwrap(); + } + + #[test] + fn preserved_external_override_drives_spawn_and_listener_identity() { + let root = runtime_test_root("external-identity"); + let package = root.join("bundle").join("app"); + let external = root.join("external-core"); + std::fs::create_dir_all(&package).unwrap(); + std::fs::create_dir_all(&external).unwrap(); + std::fs::write(external.join("agentmain.py"), "# external").unwrap(); + let mut settings = serde_json::Map::new(); + settings.insert( + "ga_source_override".to_string(), + serde_json::json!(display_path(&external)), + ); + settings.insert("conductor".to_string(), serde_json::json!({"llmNo": 3})); + settings.insert("desktop_shortcut".to_string(), serde_json::json!(true)); + settings.insert("unknown".to_string(), serde_json::json!({"keep": true})); + settings.insert( + "python_path".to_string(), + serde_json::json!("/bundle/python"), + ); + settings.insert( + "project_dir".to_string(), + serde_json::json!(display_path(&package)), + ); + settings.insert( + "bridge_script".to_string(), + serde_json::json!(display_path(&package.join("frontends/desktop_bridge.py"))), + ); + + let expected_root = effective_ga_root_from(&display_path(&package), &settings); + let identity = serde_json::json!({ + "ga_root": expected_root, + "build_id": env!("GA_BUILD_ID"), + "pid": 42 + }); + + assert_eq!(expected_root, display_path(&external)); + assert_eq!( + classify_listener_identity(Some(&identity), &expected_root), + ListenerIdentity::Owned + ); + assert_eq!(settings["conductor"], serde_json::json!({"llmNo": 3})); + assert_eq!(settings["desktop_shortcut"], serde_json::json!(true)); + assert_eq!(settings["unknown"], serde_json::json!({"keep": true})); + std::fs::remove_dir_all(root).unwrap(); + } + + fn seed_package_runtime(root: &Path, agent_text: &str, bridge_text: &str) { + std::fs::create_dir_all(root.join("frontends")).unwrap(); + std::fs::create_dir_all(root.join("memory")).unwrap(); + std::fs::create_dir_all(root.join("temp")).unwrap(); + std::fs::write(root.join("agentmain.py"), agent_text).unwrap(); + std::fs::write( + root.join("frontends").join("desktop_bridge.py"), + bridge_text, + ) + .unwrap(); + std::fs::write(root.join("memory").join("package-default.md"), "package").unwrap(); + std::fs::write(root.join("temp").join("package-cache.txt"), "package").unwrap(); + std::fs::write(root.join("mykey_template.py"), "# template").unwrap(); + } + + fn write_runtime_marker(root: &Path, marker: &RuntimePackageMarker) { + std::fs::write( + runtime_marker_path(root), + serde_json::to_string_pretty(marker).unwrap(), + ) + .unwrap(); + } + + fn runtime_tree_bytes(root: &Path) -> Vec<(PathBuf, Vec)> { + fn collect(root: &Path, folder: &Path, output: &mut Vec<(PathBuf, Vec)>) { + for entry in std::fs::read_dir(folder).unwrap() { + let path = entry.unwrap().path(); + if path.is_dir() { + collect(root, &path, output); + } else { + output.push(( + path.strip_prefix(root).unwrap().to_path_buf(), + std::fs::read(path).unwrap(), + )); + } + } + } + + let mut output = Vec::new(); + collect(root, root, &mut output); + output.sort_by(|left, right| left.0.cmp(&right.0)); + output + } + + #[test] + fn fresh_runtime_install_never_writes_the_packaged_source() { + let root = runtime_test_root("fresh-install"); + let package = root + .join("GenericAgent.app") + .join("Contents") + .join("Resources"); + let runtime = root.join("application-support").join("app"); + seed_package_runtime(&package, "packaged agent", "packaged bridge"); + let package_before = runtime_tree_bytes(&package); + let expected = expected_runtime_marker(); + + let result = refresh_runtime_copy(&package, &runtime, &expected).unwrap(); + + assert_eq!(result, RuntimeCopyStatus::Installed); + assert_eq!(runtime_tree_bytes(&package), package_before); + assert!(!runtime_marker_path(&package).exists()); + assert_eq!(read_runtime_marker(&runtime), Some(expected)); + assert_eq!( + std::fs::read_to_string(runtime.join("agentmain.py")).unwrap(), + "packaged agent" + ); + std::fs::remove_dir_all(root).unwrap(); + } + + #[test] + fn stale_same_version_runtime_refreshes_package_code_and_preserves_user_data() { + let root = runtime_test_root("refresh"); + let package = root.join("signed-package-app"); + let runtime = root.join("application-support").join("app"); + seed_package_runtime(&package, "new agent", "new bridge"); + seed_package_runtime(&runtime, "old fork agent", "old fork bridge"); + + std::fs::write(runtime.join("mykey.py"), "user key").unwrap(); + std::fs::write(runtime.join("mykey.json"), "user json key").unwrap(); + std::fs::write(runtime.join("memory").join("user.md"), "remember me").unwrap(); + std::fs::remove_file(runtime.join("memory").join("package-default.md")).unwrap(); + let responses = runtime.join("temp").join("model_responses"); + let sessions = runtime.join("temp").join("desktop_sessions"); + std::fs::create_dir_all(&responses).unwrap(); + std::fs::create_dir_all(&sessions).unwrap(); + std::fs::write(responses.join("response.txt"), "response").unwrap(); + std::fs::write(sessions.join("sess-one.json"), "session").unwrap(); + std::fs::write( + runtime.join("temp").join("tui_v3_settings.json"), + "settings", + ) + .unwrap(); + std::fs::write(runtime.join("temp").join("token_ledger.jsonl"), "ledger").unwrap(); + let host_settings = root.join(".ga_desktop_settings.json"); + std::fs::write(&host_settings, "host settings").unwrap(); + + let expected = expected_runtime_marker(); + let mut old_marker = expected.clone(); + old_marker.build_id = "old-fork-build".to_string(); + old_marker.source_revision = "old-fork-source".to_string(); + write_runtime_marker(&runtime, &old_marker); + + let result = refresh_runtime_copy(&package, &runtime, &expected).unwrap(); + + assert_eq!(result, RuntimeCopyStatus::Refreshed); + assert_eq!( + std::fs::read_to_string(runtime.join("agentmain.py")).unwrap(), + "new agent" + ); + assert_eq!( + std::fs::read_to_string(runtime.join("frontends").join("desktop_bridge.py")).unwrap(), + "new bridge" + ); + assert_eq!( + std::fs::read_to_string(runtime.join("mykey.py")).unwrap(), + "user key" + ); + assert_eq!( + std::fs::read_to_string(runtime.join("mykey.json")).unwrap(), + "user json key" + ); + assert_eq!( + std::fs::read_to_string(runtime.join("memory").join("user.md")).unwrap(), + "remember me" + ); + assert!(!runtime.join("memory").join("package-default.md").exists()); + assert_eq!( + std::fs::read_to_string(responses.join("response.txt")).unwrap(), + "response" + ); + assert_eq!( + std::fs::read_to_string(sessions.join("sess-one.json")).unwrap(), + "session" + ); + assert_eq!( + std::fs::read_to_string(runtime.join("temp").join("tui_v3_settings.json")).unwrap(), + "settings" + ); + assert_eq!( + std::fs::read_to_string(runtime.join("temp").join("token_ledger.jsonl")).unwrap(), + "ledger" + ); + assert_eq!(read_runtime_marker(&runtime), Some(expected)); + assert_eq!( + std::fs::read_to_string(&host_settings).unwrap(), + "host settings" + ); + assert_eq!( + std::fs::read_to_string(package.join("agentmain.py")).unwrap(), + "new agent" + ); + assert!(!runtime_marker_path(&package).exists()); + std::fs::remove_dir_all(root).unwrap(); + } + + #[test] + fn matching_runtime_marker_keeps_hot_start_copy_untouched() { + let root = runtime_test_root("current"); + let package = root.join("signed-package-app"); + let runtime = root.join("application-support").join("app"); + seed_package_runtime(&package, "new package bytes", "new package bridge"); + seed_package_runtime(&runtime, "already active bytes", "already active bridge"); + let expected = expected_runtime_marker(); + write_runtime_marker(&runtime, &expected); + + let result = refresh_runtime_copy(&package, &runtime, &expected).unwrap(); + + assert_eq!(result, RuntimeCopyStatus::Current); + assert_eq!( + std::fs::read_to_string(runtime.join("agentmain.py")).unwrap(), + "already active bytes" + ); + std::fs::remove_dir_all(root).unwrap(); + } + + #[test] + fn failed_runtime_activation_restores_old_code_marker_and_user_data() { + let root = runtime_test_root("rollback"); + let package = root.join("signed-package-app"); + let runtime = root.join("application-support").join("app"); + seed_package_runtime(&package, "new agent", "new bridge"); + seed_package_runtime(&runtime, "old agent", "old bridge"); + std::fs::write(runtime.join("mykey.py"), "user key").unwrap(); + std::fs::write(runtime.join("memory").join("user.md"), "user memory").unwrap(); + let expected = expected_runtime_marker(); + let mut old_marker = expected.clone(); + old_marker.build_id = "old-build".to_string(); + write_runtime_marker(&runtime, &old_marker); + + let error = refresh_runtime_copy_with_activation( + &package, + &runtime, + None, + &expected, + |_staging, _destination| { + Err(std::io::Error::new( + std::io::ErrorKind::PermissionDenied, + "simulated activation failure", + )) + }, + ) + .unwrap_err(); + + assert!(error.contains("simulated activation failure")); + assert_eq!( + std::fs::read_to_string(runtime.join("agentmain.py")).unwrap(), + "old agent" + ); + assert_eq!( + std::fs::read_to_string(runtime.join("mykey.py")).unwrap(), + "user key" + ); + assert_eq!( + std::fs::read_to_string(runtime.join("memory").join("user.md")).unwrap(), + "user memory" + ); + assert_eq!(read_runtime_marker(&runtime), Some(old_marker)); + let leftovers = std::fs::read_dir(runtime.parent().unwrap()) + .unwrap() + .filter_map(Result::ok) + .filter(|entry| entry.file_name().to_string_lossy().starts_with(".app-")) + .count(); + assert_eq!(leftovers, 0); + assert_eq!( + std::fs::read_to_string(package.join("agentmain.py")).unwrap(), + "new agent" + ); + assert!(!runtime_marker_path(&package).exists()); + std::fs::remove_dir_all(root).unwrap(); + } + + #[test] + fn legacy_versioned_runtime_migrates_into_stable_root_with_all_user_data() { + let root = runtime_test_root("legacy-migration"); + let package = root.join("signed-package-app"); + let runtime_parent = root.join("application-support").join("runtime"); + let legacy = runtime_parent.join("0.2.0").join("app"); + let stable = runtime_parent.join("app"); + seed_package_runtime(&package, "new agent", "new bridge"); + seed_package_runtime(&legacy, "old agent", "old bridge"); + std::fs::write(legacy.join("mykey.py"), "user key").unwrap(); + std::fs::write(legacy.join("mykey.json"), "user json key").unwrap(); + std::fs::write(legacy.join("memory").join("user.md"), "memory").unwrap(); + std::fs::create_dir_all(legacy.join("temp").join("desktop_sessions")).unwrap(); + std::fs::write( + legacy + .join("temp") + .join("desktop_sessions") + .join("sess.json"), + "session", + ) + .unwrap(); + std::fs::write(legacy.join("temp").join("token_ledger.jsonl"), "ledger").unwrap(); + let mut legacy_marker = expected_runtime_marker(); + legacy_marker.package_version = "0.2.0".to_string(); + legacy_marker.build_id = "old-build".to_string(); + write_runtime_marker(&legacy, &legacy_marker); + let mut expected = expected_runtime_marker(); + expected.package_version = "0.2.1".to_string(); + expected.build_id = "new-build".to_string(); + + assert_eq!( + trusted_legacy_runtime(&runtime_parent).unwrap(), + Some(legacy.clone()) + ); + let result = + refresh_runtime_copy_from_legacy(&package, &legacy, &stable, &expected).unwrap(); + + assert_eq!(result, RuntimeCopyStatus::Installed); + assert_eq!( + std::fs::read_to_string(stable.join("agentmain.py")).unwrap(), + "new agent" + ); + assert_eq!( + std::fs::read_to_string(stable.join("mykey.py")).unwrap(), + "user key" + ); + assert_eq!( + std::fs::read_to_string(stable.join("mykey.json")).unwrap(), + "user json key" + ); + assert_eq!( + std::fs::read_to_string(stable.join("memory").join("user.md")).unwrap(), + "memory" + ); + assert_eq!( + std::fs::read_to_string( + stable + .join("temp") + .join("desktop_sessions") + .join("sess.json") + ) + .unwrap(), + "session" + ); + assert_eq!( + std::fs::read_to_string(stable.join("temp").join("token_ledger.jsonl")).unwrap(), + "ledger" + ); + assert_eq!(read_runtime_marker(&stable), Some(expected)); + assert!(!legacy.exists()); + std::fs::remove_dir_all(root).unwrap(); + } + + #[test] + fn failed_legacy_runtime_activation_leaves_legacy_data_and_no_stable_root() { + let root = runtime_test_root("legacy-rollback"); + let package = root.join("signed-package-app"); + let legacy = root.join("runtime").join("0.2.0").join("app"); + let stable = root.join("runtime").join("app"); + seed_package_runtime(&package, "new agent", "new bridge"); + seed_package_runtime(&legacy, "old agent", "old bridge"); + std::fs::write(legacy.join("mykey.py"), "user key").unwrap(); + let expected = expected_runtime_marker(); + + let error = refresh_runtime_copy_with_activation( + &package, + &stable, + Some(&legacy), + &expected, + |_staging, _active| { + Err(std::io::Error::new( + std::io::ErrorKind::PermissionDenied, + "simulated migration activation failure", + )) + }, + ) + .unwrap_err(); + + assert!(error.contains("simulated migration activation failure")); + assert!(!stable.exists()); + assert_eq!( + std::fs::read_to_string(legacy.join("agentmain.py")).unwrap(), + "old agent" + ); + assert_eq!( + std::fs::read_to_string(legacy.join("mykey.py")).unwrap(), + "user key" + ); + std::fs::remove_dir_all(root).unwrap(); + } +} diff --git a/frontends/desktop/src-tauri/tauri.conf.json b/frontends/desktop/src-tauri/tauri.conf.json index 6db15a9ee..73f06974d 100644 --- a/frontends/desktop/src-tauri/tauri.conf.json +++ b/frontends/desktop/src-tauri/tauri.conf.json @@ -1,41 +1,90 @@ { "productName": "GenericAgent", - "version": "0.1.8", + "version": "0.2.0", "identifier": "com.genericagent.app", "build": { - "frontendDist": "../static" + "frontendDist": "../dist" }, "app": { "withGlobalTauri": true, "security": { - "csp": null + "csp": { + "default-src": "'self' tauri: asset:", + "script-src": "'self'", + "style-src": "'self' 'unsafe-inline'", + "font-src": "'self' data: asset: http://asset.localhost", + "img-src": "'self' data: blob: asset: http://asset.localhost http://127.0.0.1:14168 http://localhost:14168", + "media-src": "'self' data: blob: http://127.0.0.1:14168 http://localhost:14168", + "connect-src": "'self' ipc: http://ipc.localhost http://127.0.0.1:14168 http://localhost:14168 ws://127.0.0.1:14168 ws://localhost:14168 http://127.0.0.1:8900 http://localhost:8900 ws://127.0.0.1:8900 ws://localhost:8900", + "worker-src": "'self' blob:", + "object-src": "'none'", + "base-uri": "'self'", + "form-action": "'none'", + "frame-src": "'none'", + "frame-ancestors": "'none'" + }, + "devCsp": { + "default-src": "'self' tauri: asset: http://localhost:5173", + "script-src": "'self' 'unsafe-inline' 'unsafe-eval' http://localhost:5173", + "style-src": "'self' 'unsafe-inline' http://localhost:5173", + "font-src": "'self' data: asset: http://asset.localhost http://localhost:5173", + "img-src": "'self' data: blob: asset: http://asset.localhost http://localhost:5173 http://127.0.0.1:14168 http://localhost:14168", + "media-src": "'self' data: blob: http://127.0.0.1:14168 http://localhost:14168", + "connect-src": "'self' ipc: http://ipc.localhost http://localhost:5173 ws://localhost:5173 http://127.0.0.1:14168 http://localhost:14168 ws://127.0.0.1:14168 ws://localhost:14168 http://127.0.0.1:8900 http://localhost:8900 ws://127.0.0.1:8900 ws://localhost:8900", + "worker-src": "'self' blob:", + "object-src": "'none'", + "base-uri": "'self'", + "form-action": "'none'", + "frame-src": "'none'", + "frame-ancestors": "'none'" + }, + "capabilities": ["default", "setup"] }, "windows": [ { - "title": "GenericAgent", + "title": "", "label": "main", "width": 1280, "height": 800, "resizable": true, "maximized": false, "visible": false, + "titleBarStyle": "Overlay", + "trafficLightPosition": { "x": 13, "y": 22 }, + "dragDropEnabled": false, "url": "loading.html" }, { - "title": "GenericAgent — Setup", + "title": "", "label": "setup", "width": 600, "height": 580, "resizable": false, "visible": false, "center": true, - "url": "fallback.html" + "url": "setup.html" } ] }, "bundle": { "active": true, "targets": ["nsis", "dmg"], - "icon": ["icons/icon.ico", "icons/icon.png", "icons/32x32.png", "icons/128x128.png", "icons/128x128@2x.png"] + "icon": ["icons/icon.ico", "icons/icon.png", "icons/32x32.png", "icons/128x128.png", "icons/128x128@2x.png"], + "macOS": { + "dmg": { + "windowSize": { + "width": 540, + "height": 380 + }, + "appPosition": { + "x": 140, + "y": 200 + }, + "applicationFolderPosition": { + "x": 400, + "y": 200 + } + } + } } } diff --git a/frontends/desktop/src-tauri/tauri.e2e.conf.json b/frontends/desktop/src-tauri/tauri.e2e.conf.json new file mode 100644 index 000000000..0df11198e --- /dev/null +++ b/frontends/desktop/src-tauri/tauri.e2e.conf.json @@ -0,0 +1,19 @@ +{ + "app": { + "security": { + "csp": { + "connect-src": "'self' ipc: http://ipc.localhost http://127.0.0.1:* ws://127.0.0.1:* http://localhost:14168 ws://localhost:14168 http://127.0.0.1:8900 http://localhost:8900 ws://127.0.0.1:8900 ws://localhost:8900" + }, + "capabilities": [ + "default", + "setup", + { + "identifier": "e2e", + "description": "Test-only WebdriverIO capability", + "windows": ["main", "setup"], + "permissions": ["wdio:default"] + } + ] + } + } +} diff --git a/frontends/desktop_bridge.py b/frontends/desktop_bridge.py index a42388d8f..438ea51c7 100644 --- a/frontends/desktop_bridge.py +++ b/frontends/desktop_bridge.py @@ -28,6 +28,9 @@ POST /services/stop-extras stop conductor + scheduler (127.0.0.1 only) POST /services/start-extras start conductor + scheduler (127.0.0.1 only) POST /services/bridge/exit stop managed services, then exit bridge (127.0.0.1 only) + POST /memory/import/inspect validate a data backup or legacy folder + POST /memory/import safely merge memory and sessions + POST /memory/export write a point-in-time data backup ZIP WS API (state sync): GET /ws -> on connect sends services.snapshot; service.changed on updates @@ -36,33 +39,78 @@ """ from __future__ import annotations -import asyncio, atexit, contextlib, importlib, json, os, re, shutil, subprocess, sys +import asyncio, atexit, contextlib, copy, importlib, json, os, re, shutil, subprocess, sys from collections import Counter, deque import threading, time, traceback, uuid from dataclasses import dataclass, field from pathlib import Path from typing import Any, Dict, List, Optional, Set from aiohttp import web, WSMsgType +from data_backup import ( + BackupFormatError, + canonical_session_record, + export_data_backup, + inspect_import_source, + materialize_import_source, + merge_data_files, +) +from desktop_settings import DesktopSettingsError, read_settings, update_settings APP_DIR = Path(__file__).resolve().parent +DEFAULT_CONDUCTOR_PORT = 8900 +E2E_CONDUCTOR_PORT_ENV = "GA_DESKTOP_E2E_CONDUCTOR_PORT" +E2E_REPORT_DIR_ENV = "GA_DESKTOP_E2E_REPORT_DIR" + + +def _configured_conductor_port() -> int: + """Return the package-journey conductor port without changing production :8900. + + Desktop's compiled renderer and production CSP intentionally use :8900. The + alternate port exists only to isolate real-package evidence from an installed + user's conductor; both E2E variables are required before it is honored. + """ + if not os.environ.get(E2E_REPORT_DIR_ENV): + return DEFAULT_CONDUCTOR_PORT + raw = os.environ.get(E2E_CONDUCTOR_PORT_ENV) + if raw is None: + return DEFAULT_CONDUCTOR_PORT + value = raw.strip() + if not value.isascii() or not value.isdigit() or not 1 <= int(value) <= 65535: + raise RuntimeError(f"{E2E_CONDUCTOR_PORT_ENV} must be an integer between 1 and 65535") + return int(value) + +# ─── Bridge self-log ring buffer ─── +import datetime as _dt, io as _io + +_bridge_log: deque = deque(maxlen=500) + + +def bridge_print(*args, **kwargs): + """Print to stderr AND capture into bridge ring buffer (timestamped).""" + kwargs.pop("file", None) + buf = _io.StringIO() + print(*args, file=buf, **kwargs) + text = buf.getvalue().rstrip("\n") + ts = _dt.datetime.now().strftime("%H:%M:%S") + for line in text.split("\n"): + _bridge_log.append(f"[{ts}] {line}") + print(*args, file=sys.stderr, **kwargs) def _ga_root_override() -> Optional[Path]: - """External core dir injected by the desktop shell (design 三: bundle bridge + external核). - Priority: --ga-root arg, then GA_ROOT env. Only honored when it holds agentmain.py; - an invalid/missing value returns None so we fall back to the bundle's own derivation.""" - val = "" - for i, a in enumerate(sys.argv): - if a == "--ga-root" and i + 1 < len(sys.argv): - val = sys.argv[i + 1] - elif a.startswith("--ga-root="): - val = a.split("=", 1)[1] - if not val: - val = os.environ.get("GA_ROOT", "") - val = (val or "").strip() - if not val: + """Resolve an external core while keeping this bundled bridge as the executable surface.""" + value = "" + for index, argument in enumerate(sys.argv): + if argument == "--ga-root" and index + 1 < len(sys.argv): + value = sys.argv[index + 1] + elif argument.startswith("--ga-root="): + value = argument.split("=", 1)[1] + if not value: + value = os.environ.get("GA_ROOT", "") + value = (value or "").strip() + if not value: return None - root = Path(val).expanduser().resolve() + root = Path(value).expanduser().resolve() return root if (root / "agentmain.py").exists() else None @@ -110,6 +158,68 @@ def normalize_final_turn_segs(full: str, outputs: Any) -> Optional[List[str]]: return None +# ─── Empty-turn microcopy (i18n) ─── + +_EMPTY_TURN_MICROCOPY = { + "zh": '⚠️ 这一轮结束了,但没有产出可见回复。你可以发送"继续"重试。', + "en": '⚠️ This turn ended without a visible response. You can send "continue" to retry.', +} + + +def _get_ui_lang() -> str: + try: + p = Path.home() / ".ga_desktop_settings.json" + doc = json.loads(p.read_text(encoding="utf-8")) if p.is_file() else {} + if not isinstance(doc, dict): + return "zh" + ui = doc.get("ui") + candidates = ( + ui.get("lang") if isinstance(ui, dict) else None, + doc.get("lang"), # legacy Desktop settings + ) + return next( + (lang for lang in candidates + if isinstance(lang, str) and lang in _EMPTY_TURN_MICROCOPY), + "zh", + ) + except Exception: + return "zh" + + +def empty_turn_fallback() -> str: + lang = _get_ui_lang() + return _EMPTY_TURN_MICROCOPY.get(lang, _EMPTY_TURN_MICROCOPY["zh"]) + + +# ─── Test-only control plane ──────────────────────────────────────────────── + +_E2E_CONTROL_LOCK = threading.Lock() +_E2E_NEXT_TURN: Optional[str] = None + + +def _e2e_control_token() -> Optional[str]: + if os.environ.get("GA_E2E") != "1": + return None + token = os.environ.get("GA_E2E_CONTROL_TOKEN", "").strip() + return token or None + + +def _set_e2e_next_turn(mode: str) -> None: + if mode != "empty": + raise ValueError("mode must be empty") + global _E2E_NEXT_TURN + with _E2E_CONTROL_LOCK: + _E2E_NEXT_TURN = mode + + +def _consume_e2e_next_turn() -> Optional[str]: + global _E2E_NEXT_TURN + with _E2E_CONTROL_LOCK: + mode = _E2E_NEXT_TURN + _E2E_NEXT_TURN = None + return mode + + for _s in (sys.stdout, sys.stderr): with contextlib.suppress(Exception): _s.reconfigure(encoding="utf-8", errors="replace") @@ -143,6 +253,44 @@ class Session: # 该会话绑定的模型下标(mykey.py 配置块顺序,== agent.llmclients 下标)。 # None = 未绑定,发消息时回退到全局默认 ui.llmNo,保持旧会话平滑迁移。 llm_no: Optional[int] = None + # 当前正在执行的 turn 使用的模型。仅运行期存在,不写入 session JSON。 + running_llm_no: Optional[int] = None + running_model: Optional[str] = None + + +class MaintenanceConflict(RuntimeError): + def __init__( + self, + message: str, + *, + code: str = "maintenance_conflict", + running_sessions: Optional[List[str]] = None, + running_extras: Optional[List[str]] = None, + ): + super().__init__(message) + self.code = code + self.running_sessions = sorted(set(running_sessions or [])) + self.running_extras = sorted(set(running_extras or [])) + + def payload(self) -> dict: + return { + "ok": False, + "error": str(self), + "code": self.code, + "runningSessions": self.running_sessions, + "runningExtras": self.running_extras, + } + + +def _is_desktop_session_id(session_id: Any) -> bool: + """Keep internal TUI/Conductor worker artifacts out of Desktop sessions.""" + if not isinstance(session_id, str): + return False + value = session_id + return ( + not value.startswith("tui_") + and re.fullmatch(r"[A-Za-z0-9][A-Za-z0-9_-]{0,127}", value) is not None + ) def _load_plan_baseline(item: dict, msgs: list) -> int: @@ -170,6 +318,10 @@ def __init__(self): self.ga_root = str(DEFAULT_GA_ROOT) self.config: Dict[str, Any] = {} self.sessions: Dict[str, Session] = {} + self._retired_sessions: Dict[str, Session] = {} + self._maintenance_token: Optional[str] = None + self._maintenance_kind: Optional[str] = None + self._shutdown_requested = False self.active_session_id: Optional[str] = None self._sessions_dir = Path(self.ga_root) / "temp" / "desktop_sessions" # Legacy monolithic store; migrated into _sessions_dir on first load, then retired. @@ -199,18 +351,90 @@ def _session_dict(self, s: "Session") -> dict: def _session_file(self, sid: str) -> Path: return self._sessions_dir / f"{sid}.json" - def _persist_session(self, s: "Session"): + @staticmethod + def _session_has_unfinished_work(session: "Session") -> bool: + agent = session.agent + task_queue = getattr(agent, "task_queue", None) + unfinished = int(getattr(task_queue, "unfinished_tasks", 0) or 0) + agent_running = bool(getattr(agent, "is_running", False)) + thread_running = bool(session.thread and session.thread.is_alive()) + return session.status == "running" or unfinished > 0 or agent_running or thread_running + + def _running_session_ids_locked(self) -> List[str]: + retired_sessions = getattr(self, "_retired_sessions", {}) + self._retired_sessions = retired_sessions + for sid, retired in list(retired_sessions.items()): + if not self._session_has_unfinished_work(retired): + retired_sessions.pop(sid, None) + running = [ + sid for sid, session in self.sessions.items() + if self._session_has_unfinished_work(session) + ] + running.extend( + sid for sid, session in retired_sessions.items() + if self._session_has_unfinished_work(session) + ) + return sorted(set(running)) + + def _assert_mutation_allowed_locked(self) -> None: + if getattr(self, "_shutdown_requested", False): + raise MaintenanceConflict( + "Desktop bridge shutdown is in progress", + code="shutdown_in_progress", + ) + if getattr(self, "_maintenance_token", None) is not None: + raise MaintenanceConflict( + f"data {getattr(self, '_maintenance_kind', None) or 'maintenance'} is in progress" + ) + + @contextlib.contextmanager + def mutation(self): + with self.lock: + self._assert_mutation_allowed_locked() + yield + + def begin_maintenance(self, kind: str, running_extras_fn) -> str: + with self.lock: + self._assert_mutation_allowed_locked() + running_sessions = self._running_session_ids_locked() + running_extras = list(running_extras_fn()) + if running_sessions or running_extras: + raise MaintenanceConflict( + "stop running sessions and managed services before data maintenance", + running_sessions=running_sessions, + running_extras=running_extras, + ) + token = uuid.uuid4().hex + self._maintenance_token = token + self._maintenance_kind = kind + return token + + def end_maintenance(self, token: str) -> None: + with self.lock: + if self._maintenance_token != token: + raise RuntimeError("maintenance token does not own the active gate") + self._maintenance_token = None + self._maintenance_kind = None + + def _persist_session(self, s: "Session", *, strict: bool = False): """Write a single session file. Cost is O(one session), independent of how many sessions exist — this is the fix for the monolithic-file scaling problem.""" + tmp = self._sessions_dir / f"{s.id}.json.tmp" try: self._sessions_dir.mkdir(parents=True, exist_ok=True) with self.lock: data = self._session_dict(s) - tmp = self._sessions_dir / f"{s.id}.json.tmp" + data["messages"] = copy.deepcopy(data["messages"]) + if data.get("llm_history"): + data["llm_history"] = copy.deepcopy(data["llm_history"]) tmp.write_text(json.dumps(data, ensure_ascii=False, default=str), encoding="utf-8") - os.replace(tmp, self._session_file(s.id)) # atomic swap + os.replace(tmp, self._session_file(s.id)) except Exception as e: - print(f"[bridge] persist session {s.id} failed: {e}", file=sys.stderr) + with contextlib.suppress(OSError): + tmp.unlink() + bridge_print(f"[bridge] persist session {s.id} failed: {e}") + if strict: + raise OSError(f"could not persist session {s.id}: {e}") from e def _delete_session_file(self, sid: str): try: @@ -218,30 +442,31 @@ def _delete_session_file(self, sid: str): if f.exists(): f.unlink() except Exception as e: - print(f"[bridge] delete session file {sid} failed: {e}", file=sys.stderr) + bridge_print(f"[bridge] delete session file {sid} failed: {e}") - def _persist(self): + def _persist(self, *, strict: bool = False): """Write every session (one file each). Used for bulk ops (import) / full flush.""" with self.lock: sessions = list(self.sessions.values()) for s in sessions: - self._persist_session(s) + self._persist_session(s, strict=strict) def _session_from_item(self, item: dict) -> "Session": - msgs = item.get("messages", []) - return Session(id=item["id"], title=item.get("title", "New chat"), - cwd=item.get("cwd", self.ga_root), - created_at=item.get("created_at", time.time()), - updated_at=item.get("updated_at", time.time()), + item = canonical_session_record(item, default_cwd=self.ga_root) + msgs = item["messages"] + return Session(id=item["id"], title=item["title"], + cwd=item["cwd"], + created_at=item["created_at"], + updated_at=item["updated_at"], messages=msgs, - msg_seq=item.get("msg_seq", 0), - pinned=item.get("pinned", False), - untitled=item.get("untitled", True), + msg_seq=item["msg_seq"], + pinned=item["pinned"], + untitled=item["untitled"], plan_scan_baseline=_load_plan_baseline(item, msgs), - plan_path=_sanitize_desktop_plan_path(item["id"], item.get("plan_path") or ""), + plan_path=_sanitize_desktop_plan_path(item["id"], item["plan_path"]), status="idle", agent=None, - llm_history=item.get("llm_history"), - llm_no=item.get("llm_no")) + llm_history=item["llm_history"], + llm_no=item["llm_no"]) def _load_sessions(self): # New format: one file per session under temp/desktop_sessions/. @@ -250,32 +475,36 @@ def _load_sessions(self): for f in self._sessions_dir.glob("*.json"): try: item = json.loads(f.read_text(encoding="utf-8")) + if not _is_desktop_session_id(item.get("id")): + continue sess = self._session_from_item(item) self.sessions[sess.id] = sess except Exception as e: - print(f"[bridge] load session {f.name} failed: {e}", file=sys.stderr) + bridge_print(f"[bridge] load session {f.name} failed: {e}") except Exception as e: - print(f"[bridge] load sessions dir failed: {e}", file=sys.stderr) + bridge_print(f"[bridge] load sessions dir failed: {e}") # One-time migration from the legacy monolithic desktop_sessions.json. try: if self._sessions_file.exists(): arr = json.loads(self._sessions_file.read_text(encoding="utf-8")) for item in arr: - if not isinstance(item, dict) or item.get("id") in self.sessions: + if (not isinstance(item, dict) + or not _is_desktop_session_id(item.get("id")) + or item.get("id") in self.sessions): continue try: sess = self._session_from_item(item) self.sessions[sess.id] = sess self._persist_session(sess) except Exception as e: - print(f"[bridge] migrate session failed: {e}", file=sys.stderr) + bridge_print(f"[bridge] migrate session failed: {e}") # Retire the legacy file so we do not migrate again next launch. with contextlib.suppress(Exception): self._sessions_file.rename( self._sessions_file.parent / (self._sessions_file.name + ".migrated")) except Exception as e: - print(f"[bridge] migrate sessions failed: {e}", file=sys.stderr) + bridge_print(f"[bridge] migrate sessions failed: {e}") if self.sessions: self.active_session_id = max(self.sessions.values(), key=lambda s: s.updated_at).id @@ -318,18 +547,22 @@ def import_sessions(self, source_dir: str) -> dict: added = 0 skipped = 0 new_sessions: List["Session"] = [] - with self.lock: + with self.mutation(): for item in items: sid = item.get("id") - if not sid or sid in self.sessions: + if not _is_desktop_session_id(sid) or sid in self.sessions: + skipped += 1 + continue + try: + sess = self._session_from_item(item) + except ValueError: skipped += 1 continue - sess = self._session_from_item(item) self.sessions[sid] = sess new_sessions.append(sess) added += 1 - for sess in new_sessions: - self._persist_session(sess) + for sess in new_sessions: + self._persist_session(sess) return {"sessionsAdded": added, "sessionsSkipped": skipped, "sessionsFileFound": True} def _mykey_file(self) -> Path: @@ -472,7 +705,7 @@ def _reload_live_agents(self) -> None: llmcore._mykey_mtime = None # 让本次 reload_mykeys() 视为“已变更”,触发真正重建 fn() except Exception as e: - print(f"[bridge] reload live agent failed: {e}", file=sys.stderr) + bridge_print(f"[bridge] reload live agent failed: {e}") def add_model_profile(self, data: dict) -> dict: cfg = self._build_cfg(data) @@ -565,7 +798,7 @@ def list_model_profiles(self): try: keys, mk = self._mykey_vars() except Exception as e: - print(f"get model profiles failed: {e}", file=sys.stderr) + bridge_print(f"get model profiles failed: {e}") return [] # A profile can be referenced by any mixin channel, not only the first one. # Keep each mixin row's own members for display, but mark native profiles as @@ -656,18 +889,22 @@ def reorder_mixin(self, members: list) -> dict: def _live_model(sess: Session) -> Optional[dict]: """该会话 agent 当前真正在用的模型(渠道组会随故障转移变化)。 agent 还没建(没跑过 turn)时返回静态绑定信息,前端据 llmNo 回显选择器。 - llmNo: agent 存活取 agent.llm_no(权威运行态),否则取 sess.llm_no(可能 None)。""" + llmNo: 始终以 sess.llm_no 为权威(用户选择),agent.llm_no 在初始化窗口可能滞后。""" ag = getattr(sess, "agent", None) if ag is None: - return {"current": None, "isMixin": False, "llmNo": sess.llm_no} + return {"current": None, "isMixin": False, "llmNo": sess.llm_no, + "runningLlmNo": sess.running_llm_no, "runningModel": sess.running_model} try: back = ag.llmclient.backend - live_no = getattr(ag, "llm_no", sess.llm_no) + live_no = sess.llm_no if sess.llm_no is not None else getattr(ag, "llm_no", 0) if "Mixin" in type(back).__name__: - return {"current": back.current_name, "isMixin": True, "llmNo": live_no} - return {"current": back.name, "isMixin": False, "llmNo": live_no} + return {"current": back.current_name, "isMixin": True, "llmNo": live_no, + "runningLlmNo": sess.running_llm_no, "runningModel": sess.running_model} + return {"current": back.name, "isMixin": False, "llmNo": live_no, + "runningLlmNo": sess.running_llm_no, "runningModel": sess.running_model} except Exception: - return {"current": None, "isMixin": False, "llmNo": sess.llm_no} + return {"current": None, "isMixin": False, "llmNo": sess.llm_no, + "runningLlmNo": sess.running_llm_no, "runningModel": sess.running_model} def snapshot(self, sess: Session, include_messages: bool = True) -> dict: out = { @@ -703,11 +940,11 @@ def add_message(self, sess: Session, role: str, content: str, **extra) -> dict: def create_session(self, cwd: Optional[str] = None) -> Session: sid = "sess-" + uuid.uuid4().hex[:12] sess = Session(id=sid, cwd=str(cwd or self.ga_root), llm_no=_global_default_llm_no()) - with self.lock: + with self.mutation(): self.sessions[sid] = sess self.active_session_id = sid - emit_session_state(sess, "created") - self._persist_session(sess) + emit_session_state(sess, "created") + self._persist_session(sess) return sess def get_session(self, sid: str) -> Session: @@ -718,23 +955,37 @@ def get_session(self, sid: str) -> Session: return sess def delete_session(self, sid: str) -> dict: - with self.lock: + with self.mutation(): sess = self.sessions.pop(sid, None) if not sess: raise web.HTTPNotFound(text=json.dumps({"error": f"session not found: {sid}"}, ensure_ascii=False), content_type="application/json") if self.active_session_id == sid: self.active_session_id = next(iter(self.sessions), None) + # Retire the turn identity before aborting so a late runner cannot + # persist and resurrect the deleted session file. + sess.cancel_requested = True + sess.active_turn_id = "" + sess.status = "cancelled" + sess.partial = None if sess.agent and hasattr(sess.agent, "abort"): with contextlib.suppress(Exception): sess.agent.abort() - emit_session_state(sess, "closed") - self._delete_session_file(sid) - _purge_session_uploads(sid) + if self._session_has_unfinished_work(sess): + self._retired_sessions[sid] = sess + emit_session_state(sess, "closed") + self._delete_session_file(sid) + _purge_session_uploads(sid) return {"ok": True, "sessionId": sid} def submit_prompt(self, sid: str, prompt: Any, images: Optional[list] = None, display: Optional[str] = None, files_meta: Optional[list] = None, image_metas: Optional[list] = None) -> dict: prompt, image_ids = normalize_prompt(prompt, images) - with self.lock: + # Build agent_prompt with file paths prepended (agent sees paths, UI sees clean text) + agent_prompt = prompt + if files_meta: + paths = [m["path"] for m in files_meta if m.get("path")] + if paths: + agent_prompt = " ".join(paths) + "\n" + prompt + with self.mutation(): sess = self.sessions.get(sid) if not sess: raise web.HTTPNotFound(text=json.dumps({"error": f"session not found: {sid}"}, ensure_ascii=False), content_type="application/json") @@ -756,28 +1007,114 @@ def submit_prompt(self, sid: str, prompt: Any, images: Optional[list] = None, di sess.active_turn_id = turn_id sess.last_error = "" sess.partial = {"id": sess.msg_seq + 1, "role": "assistant", "content": "", "ts": time.time(), "partial": True, - "curr_turn": 0, "turn_segs": []} # turn_segs[i]=第i轮全文(权威结构化,前端按轮渲染);content保留双轨兜底 - t = threading.Thread(target=self.run_agent_turn, args=(sess, prompt, None, turn_id), daemon=True, name=f"Turn-{sid}") + "curr_turn": 0, "turn_segs": []} # turn_segs[i]=第i轮全文(权威结构化,前端按轮渲染);content保留双轮兜底 + image_paths = [m["path"] for m in (image_metas or []) if m.get("path")] + t = threading.Thread( + target=self.run_agent_turn, + args=(sess, agent_prompt, image_paths or None, turn_id), + daemon=True, + name=f"Turn-{sid}", + ) sess.thread = t t.start() seq = sess.msg_seq emit_session_state(sess, "running") return {"ok": True, "sessionId": sid, "accepted": True, "userMessageId": user_msg["id"], "seq": seq} - def run_agent_turn(self, sess: Session, prompt: str, images: Optional[list] = None, turn_id: str = ""): + @staticmethod + def _patch_chat_for_images(client, image_paths): + """Monkey-patch backend.ask to inject base64 image blocks on the first LLM call.""" + import base64 as b64, mimetypes + try: + from llmcore import NativeToolClient + except ImportError: + return + if not isinstance(client, NativeToolClient): + return + backend = client.backend + original_ask = backend.ask + + _VISION_MIMES = {'image/png', 'image/jpeg', 'image/gif', 'image/webp'} + + def patched_ask(msg): + try: + del backend.ask + except AttributeError: + backend.ask = original_ask + if isinstance(msg, dict) and isinstance(msg.get("content"), list): + for p in image_paths: + try: + mime = mimetypes.guess_type(p)[0] or 'image/png' + if mime not in _VISION_MIMES: + # Unsupported image format (e.g. SVG) — inject as text path reference + msg["content"].append({"type": "text", "text": f"[attached file: {p}]"}) + continue + with open(p, 'rb') as f: + raw = f.read() + data = b64.b64encode(raw).decode() + msg["content"].append({"type": "image", "source": {"type": "base64", "media_type": mime, "data": data}}) + except Exception: + pass + resp = yield from original_ask(msg) + return resp + + backend.ask = patched_ask + + def run_agent_turn( + self, + sess: Session, + prompt: str, + images: Optional[list] = None, + turn_id: str = "", + ): def turn_state() -> tuple[bool, bool]: with self.lock: return sess.active_turn_id == turn_id, sess.cancel_requested try: + is_current, _ = turn_state() + if not is_current: + return + if _consume_e2e_next_turn() == "empty": + with self.lock: + if sess.active_turn_id != turn_id: + return + sess.partial = None + self.add_message(sess, "assistant", empty_turn_fallback()) + sess.running_llm_no = None + sess.running_model = None + sess.status = "idle" + sess.active_turn_id = "" + sess.last_error = "" + emit_session_state(sess, "idle") + return if sess.agent is None: sess.agent = self.make_agent(sess) + if sess.llm_history: + try: + sess.agent.llmclient.backend.history = sess.llm_history + except Exception: + pass agent = sess.agent # 模型取会话绑定 sess.llm_no,未绑定回退全局默认。切换走 set_session_model。 no = sess.llm_no if sess.llm_no is not None else _global_default_llm_no() if no is not None and hasattr(agent, "next_llm"): with contextlib.suppress(Exception): agent.next_llm(int(no)) + with self.lock: + sess.running_llm_no = getattr(agent, "llm_no", no) + try: + running_backend = agent.llmclient.backend + sess.running_model = str( + getattr(running_backend, "current_name", None) + or getattr(running_backend, "name", None) + or getattr(running_backend, "model", None) + or "" + ) or None + except Exception: + sess.running_model = None + if images: + self._patch_chat_for_images(agent.llmclient, images) full = "" done_outputs = None # done时agent给的全量轮文本(turn_resps.copy()) if hasattr(agent, "put_task"): @@ -815,6 +1152,10 @@ def turn_state() -> tuple[bool, bool]: _segs[_idx] = str(_outs[-1]) if len(_outs) >= 2 and _idx >= 1: _segs[_idx - 1] = str(_outs[-2]) + # Push partial to frontend via WS for real-time streaming + hub.emit({"type": "partial-update", "sessionId": sess.id, + "content": sess.partial["content"], + "turn_segs": list(_segs), "curr_turn": _idx}) if "done" in item: full = strip_final_info_marker(item.get("done") or "") done_outputs = normalize_final_turn_segs(full, item.get("outputs")) # done时=turn_resps.copy()全量轮 @@ -837,9 +1178,13 @@ def turn_state() -> tuple[bool, bool]: is_current, is_cancelled = turn_state() if not is_current: return + if not full: + full = empty_turn_fallback() if is_cancelled: with self.lock: sess.partial = None + sess.running_llm_no = None + sess.running_model = None if sess.active_turn_id == turn_id: sess.active_turn_id = "" # Ensure status stays cancelled (don't overwrite) @@ -848,8 +1193,6 @@ def turn_state() -> tuple[bool, bool]: sess.updated_at = time.time() emit_session_state(sess, "cancelled") return - if not full: - full = "(completed)" with self.lock: if sess.active_turn_id != turn_id: return @@ -865,6 +1208,8 @@ def turn_state() -> tuple[bool, bool]: self.add_message(sess, "assistant", full) try: sess.llm_history = json.loads(json.dumps(agent.llmclient.backend.history, ensure_ascii=False, default=str)) except Exception: pass + sess.running_llm_no = None + sess.running_model = None sess.status = "idle" sess.active_turn_id = "" sess.last_error = "" @@ -875,10 +1220,13 @@ def turn_state() -> tuple[bool, bool]: if sess.active_turn_id != turn_id: return sess.partial = None + sess.running_llm_no = None + sess.running_model = None sess.status = "error" sess.active_turn_id = "" sess.last_error = str(e) self.add_message(sess, "error", str(e)) + bridge_print(f"[turn] error: {e}") print(tb, file=sys.stderr) emit_session_state(sess, "error") @@ -894,6 +1242,7 @@ def messages(self, sid: str, after: int = 0, limit: int = 200) -> dict: return { "sessionId": sid, "status": sess.status, + "hasUnfinishedWork": self._session_has_unfinished_work(sess), "messages": msgs, "partial": dict(sess.partial) if sess.partial else None, "plan": plan_state.desktop_plan_payload_from_session(sess, self.ga_root), @@ -915,7 +1264,7 @@ def plan_snapshot(self, sid: str) -> dict: } def cancel(self, sid: str) -> dict: - with self.lock: + with self.mutation(): sess = self.sessions.get(sid) if not sess: raise web.HTTPNotFound(text=json.dumps({"error": f"session not found: {sid}"}, ensure_ascii=False), content_type="application/json") @@ -952,7 +1301,7 @@ def restore_context(self, sid: str) -> dict: try: agent.llmclient.backend.history = sess.llm_history except Exception as e: - print(f"[bridge] restore llm_history failed: {e}", file=sys.stderr) + bridge_print(f"[bridge] restore llm_history failed: {e}") else: history = [] for m in sess.messages: @@ -966,25 +1315,29 @@ def restore_context(self, sid: str) -> dict: try: agent.llmclient.backend.history = history except Exception as e: - print(f"[bridge] inject history failed: {e}", file=sys.stderr) + bridge_print(f"[bridge] inject history failed: {e}") with self.lock: sess.agent = agent sess.status = "idle" return {"ok": True, "sessionId": sid, "restored": True, "messageCount": len(sess.llm_history or sess.messages)} def set_session_model(self, sid: str, llm_no: int) -> dict: - """前端申请切换某会话的模型(唯一入口)。写 sess.llm_no(权威)并持久化; - agent 存活时立即 next_llm 让运行态跟上。返回该会话的运行态模型快照。""" - with self.lock: + """Bind a model to a session. + + An idle agent switches immediately. A running turn keeps its captured client; + the new binding is applied at the start of the next turn. + """ + with self.mutation(): sess = self.sessions.get(sid) if not sess: raise web.HTTPNotFound(text=json.dumps({"error": f"session not found: {sid}"}, ensure_ascii=False), content_type="application/json") sess.llm_no = int(llm_no) - if sess.agent is not None and hasattr(sess.agent, "next_llm"): + if (sess.status != "running" and sess.agent is not None + and hasattr(sess.agent, "next_llm")): with contextlib.suppress(Exception): sess.agent.next_llm(int(llm_no)) sess.updated_at = time.time() - self._persist_session(sess) + self._persist_session(sess) return {"ok": True, "sessionId": sid, "llmNo": sess.llm_no, "model": self._live_model(sess)} @@ -1014,6 +1367,13 @@ def normalize_prompt(prompt: Any, images: Optional[list] = None): manager = AgentManager() +# Initialize per-call token ledger +try: + import cost_tracker + cost_tracker.init_ledger(manager.ga_root) +except Exception: + pass + # --------------------------------------------------------------------------- # Transport layer: WS state push @@ -1094,17 +1454,35 @@ def discover_extra_services(ga_root: Path) -> List[dict]: # conductor 跟 scheduler 一样,bridge 启动时自动拉起。--no-browser 是关键: # conductor.py 默认会用 webbrowser.open 在用户浏览器弹一个 8900 端口 UI, # 桌面版自启时不需要这个独立 UI(用户从「指挥家」页直接访问)。 - # 方案三:conductor 深度桌面耦合,恒用 bundle 自带的那份(APP_DIR 侧), - # 通过 GA_ROOT(见 start_service env)让它 import 外部核。 + # The desktop conductor evolves with this bridge. Keep both package-owned and inject the + # external core through GA_ROOT instead of executing arbitrary UI glue from that checkout. conductor = APP_DIR / "conductor.py" if conductor.is_file(): + conductor_port = _configured_conductor_port() out.append({ "id": "frontends/conductor.py", - "cmd": [sys.executable, str(conductor), "--no-browser"], + "cmd": [ + sys.executable, + str(conductor), + "--no-browser", + "--port", + str(conductor_port), + ], + "port": conductor_port, }) return out +def _port_alive(port: Optional[int]) -> bool: + """Check if something is listening on localhost:port.""" + if not port: + return False + import socket + with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: + s.settimeout(0.3) + return s.connect_ex(("127.0.0.1", port)) == 0 + + def _mem_mb(pid: Optional[int]) -> Optional[int]: if not pid: return None @@ -1145,10 +1523,28 @@ def _cpu_pct(pid: Optional[int]) -> Optional[float]: return None +_ERROR_PATTERNS: list[tuple[re.Pattern, str, str]] = [ + (re.compile(r"errno 48|address already in use", re.I), "transient", "err.portBusy"), + (re.compile(r"Exception in thread conductor", re.I), "fatal", "err.conductorCrash"), + (re.compile(r"ModuleNotFoundError|ImportError", re.I), "fatal", "err.missingModule"), + (re.compile(r"ConnectionRefusedError|Connection refused", re.I), "warning", "err.connRefused"), + (re.compile(r"TimeoutError|timed out", re.I), "warning", "err.timeout"), +] + + +def _classify_log_error(line: str) -> tuple[str, str] | None: + """Classify a log line by severity. Returns (severity, i18n_key) or None.""" + for pattern, severity, key in _ERROR_PATTERNS: + if pattern.search(line): + return (severity, key) + return None + + class ServiceManager: """hub.pyw ServiceManager + HTTP/WS glue.""" def __init__(self, ga_root: str, emit_fn): + self.lock = threading.RLock() self.ga_root = Path(ga_root) self.procs: Dict[str, subprocess.Popen] = {} self.buffers: Dict[str, deque] = {} @@ -1166,7 +1562,34 @@ def _is_configured(self, sid: str) -> bool: mykeys = _load_mykeys(self.ga_root) return all(str(mykeys.get(k) or "").strip() for k in keys) + def _scan_errors(self, sid: str, n: int = 20) -> dict: + """Scan last N buffer lines, classify by severity. + Returns {"fatal": (line, key) | None, "warning": (line, key) | None}. + Transient errors (e.g. port-busy retry) are discarded. + """ + buf = self.buffers.get(sid) + if not buf: + return {"fatal": None, "warning": None} + lines = [ln.strip() for ln in list(buf)[-n:] if ln.strip()] + if not lines: + return {"fatal": None, "warning": None} + result: dict = {"fatal": None, "warning": None} + for line in lines: + classified = _classify_log_error(line) + if classified is None: + continue + severity, key = classified + if severity == "fatal": + result["fatal"] = (line[:300], key) + elif severity == "warning": + result["warning"] = (line[:300], key) + return result + def _log_tail(self, sid: str, n: int = 3) -> str: + """Legacy: return last fatal error line for lastError field.""" + scan = self._scan_errors(sid, n=20) + if scan["fatal"]: + return scan["fatal"][0] buf = self.buffers.get(sid) if not buf: return "" @@ -1175,27 +1598,71 @@ def _log_tail(self, sid: str, n: int = 3) -> str: def _state(self, sid: str, *, err: str = "") -> dict: proc = self.procs.get(sid) - running = proc is not None and proc.poll() is None - status = "running" if running else "offline" + owned = proc is not None and proc.poll() is None + running = owned + status = "running" if owned else "offline" last_error = err - if proc is not None and proc.poll() is not None: + error_key = "" + last_warning = "" + warning_key = "" + scan = self._scan_errors(sid) + catalog_port = self._catalog.get(sid, {}).get("port") + port_alive = _port_alive(catalog_port) + external = bool(catalog_port and port_alive and not owned) + if proc is not None and not owned: if sid in self._stopping: status, last_error = "offline", "" + elif external: + status = "error" + last_error = err or f"port {catalog_port} is occupied by an untracked process" + error_key = "err.portBusy" else: status = "error" - last_error = err or self._log_tail(sid) or f"exit code {proc.returncode}" + if scan["fatal"]: + last_error = scan["fatal"][0] + error_key = scan["fatal"][1] + elif err: + last_error = err + else: + last_error = f"exit code {proc.returncode}" + elif external: + status = "error" + last_error = err or f"port {catalog_port} is occupied by an untracked process" + error_key = "err.portBusy" + elif owned: + if scan["warning"]: + last_warning = scan["warning"][0] + warning_key = scan["warning"][1] elif err: status, running = "error", False + last_error = err + if scan["fatal"]: + error_key = scan["fatal"][1] return { "id": sid, "status": status, "running": running, - "pid": proc.pid if running else None, + "owned": owned, + "external": external, + "portConflict": external, + "port": catalog_port, + "pid": proc.pid if owned and proc is not None else None, "lastError": last_error, + "errorKey": error_key, + "lastWarning": last_warning, + "warningKey": warning_key, } def list_state(self) -> List[dict]: - return [self._state(sid) for sid in sorted(self._im_catalog)] + with self.lock: + return [self._state(sid) for sid in sorted(self._im_catalog)] + + def running_managed_ids(self) -> List[str]: + with self.lock: + return [ + sid for sid in sorted(self._catalog) + if self._state(sid).get("owned") is True + ] def _bridge_state(self) -> dict: pid = os.getpid() @@ -1212,19 +1679,23 @@ def _bridge_state(self) -> dict: "lastError": "", } + def _managed_state(self, sid: str, *, err: str = "") -> dict: + item = self._state(sid, err=err) + item["name"] = sid + item["memMb"] = _mem_mb(item.get("pid")) + item["cpuPct"] = _cpu_pct(item.get("pid")) + item["managed"] = True + return item + def list_panel_state(self) -> List[dict]: - out = [self._bridge_state()] - for sid in sorted(self._catalog, key=lambda s: (s in self._im_catalog, s)): - item = self._state(sid) - item["name"] = sid - item["memMb"] = _mem_mb(item.get("pid")) - item["cpuPct"] = _cpu_pct(item.get("pid")) - item["managed"] = True - out.append(item) - return out + with self.lock: + out = [self._bridge_state()] + for sid in sorted(self._catalog, key=lambda s: (s in self._im_catalog, s)): + out.append(self._managed_state(sid)) + return out def _notify(self, sid: str, *, err: str = "") -> None: - self._emit({"type": "service.changed", "service": self._state(sid, err=err)}) + self._emit({"type": "service.changed", "service": self._managed_state(sid, err=err)}) def _wait_started(self, proc: subprocess.Popen, timeout: float = 2.0) -> None: deadline = time.time() + timeout @@ -1242,36 +1713,52 @@ def _reader(self, sid: str, proc: subprocess.Popen) -> None: self._notify(sid) def start_service(self, sid: str) -> dict: - svc = self._catalog.get(sid) - if not svc: - raise KeyError(sid) - proc = self.procs.get(sid) - if proc is not None and proc.poll() is None: - return {"ok": True, "service": self._state(sid)} - if not self._is_configured(sid): - keys = ", ".join(_SERVICE_KEYS.get(sid, ())) - err = f"not configured in mykey.py ({keys})" - self._notify(sid, err=err) - return {"ok": False, "error": "not_configured", "service": self._state(sid, err=err)} - self.buffers[sid] = deque(maxlen=500) - # Pass the effective ga_root so bundle-side extras (conductor) import the external核. - env = {**os.environ, "PYTHONUNBUFFERED": "1", "PYTHONIOENCODING": "utf-8", - "GA_ROOT": str(self.ga_root)} - kw: Dict[str, Any] = dict( - cwd=str(self.ga_root), stdout=subprocess.PIPE, stderr=subprocess.STDOUT, - text=True, encoding="utf-8", errors="replace", bufsize=1, env=env, - ) - if sys.platform == "win32": - kw["creationflags"] = subprocess.CREATE_NO_WINDOW - proc = subprocess.Popen(svc["cmd"], **kw) - self.procs[sid] = proc - threading.Thread(target=self._reader, args=(sid, proc), daemon=True).start() - self._wait_started(proc) - item = self._state(sid) - self._notify(sid) - if item["status"] == "error": - return {"ok": False, "error": item["lastError"] or "start_failed", "service": item} - return {"ok": True, "service": item} + # Lock order is always AgentManager -> ServiceManager. This makes a + # service start atomic with maintenance-gate admission. + with manager.mutation(), self.lock: + svc = self._catalog.get(sid) + if not svc: + raise KeyError(sid) + proc = self.procs.get(sid) + if proc is not None and proc.poll() is None: + return {"ok": True, "service": self._managed_state(sid)} + catalog_port = svc.get("port") + if catalog_port and _port_alive(catalog_port): + err = f"port {catalog_port} is occupied by an untracked process" + item = self._managed_state(sid, err=err) + self._notify(sid, err=err) + return {"ok": False, "error": "port_conflict", "service": item} + if not self._is_configured(sid): + keys = ", ".join(_SERVICE_KEYS.get(sid, ())) + err = f"not configured in mykey.py ({keys})" + self._notify(sid, err=err) + return { + "ok": False, + "error": "not_configured", + "service": self._managed_state(sid, err=err), + } + self.buffers[sid] = deque(maxlen=500) + env = { + **os.environ, + "PYTHONUNBUFFERED": "1", + "PYTHONIOENCODING": "utf-8", + "GA_ROOT": str(self.ga_root), + } + kw: Dict[str, Any] = dict( + cwd=str(self.ga_root), stdout=subprocess.PIPE, stderr=subprocess.STDOUT, + text=True, encoding="utf-8", errors="replace", bufsize=1, env=env, + ) + if sys.platform == "win32": + kw["creationflags"] = subprocess.CREATE_NO_WINDOW + proc = subprocess.Popen(svc["cmd"], **kw) + self.procs[sid] = proc + threading.Thread(target=self._reader, args=(sid, proc), daemon=True).start() + self._wait_started(proc) + item = self._managed_state(sid) + self._notify(sid) + if item["running"] is not True: + return {"ok": False, "error": item["lastError"] or "start_failed", "service": item} + return {"ok": True, "service": item} def autostart_extras(self) -> None: """Auto-start non-IM services on bridge boot. Currently: @@ -1283,7 +1770,7 @@ def autostart_extras(self) -> None: tag = "ok" if res.get("ok") else f"fail: {res.get('error')}" except Exception as e: tag = f"exception {type(e).__name__}: {e}" - print(f"[autostart] {sid}: {tag}", file=sys.stderr) + bridge_print(f"[autostart] {sid}: {tag}") def stop_all_extras(self) -> None: for sid in sorted(set(self._catalog) - set(self._im_catalog)): @@ -1319,25 +1806,45 @@ def restart_broken_extras(self) -> None: tag = "ok" if res.get("ok") else f"fail: {res.get('error')}" except Exception as e: tag = f"exception {type(e).__name__}: {e}" - print(f"[restart-broken] {sid}: {tag}", file=sys.stderr) + bridge_print(f"[restart-broken] {sid}: {tag}") def stop_service(self, sid: str) -> dict: - if sid not in self._catalog: - raise KeyError(sid) - self._stopping.add(sid) - proc = self.procs.get(sid) - if proc and proc.poll() is None: - proc.terminate() - proc.wait() - self.procs.pop(sid, None) - self._stopping.discard(sid) - item = self._state(sid) - self._notify(sid) - return {"ok": True, "service": item} + with self.lock: + if sid not in self._catalog: + raise KeyError(sid) + self._stopping.add(sid) + proc = self.procs.get(sid) + stop_error = "" + if proc and proc.poll() is None: + try: + proc.terminate() + try: + proc.wait(timeout=5.0) + except subprocess.TimeoutExpired: + proc.kill() + proc.wait(timeout=2.0) + except Exception as exc: + stop_error = f"failed to stop managed process: {type(exc).__name__}: {exc}" + if proc is None or proc.poll() is not None: + self.procs.pop(sid, None) + self._stopping.discard(sid) + item = self._managed_state(sid, err=stop_error) + self._notify(sid, err=stop_error) + if item.get("external") is True: + return {"ok": False, "error": "not_owned", "service": item} + return { + "ok": not stop_error, + "error": "stop_failed" if stop_error else "", + "service": item, + } def read_logs(self, sid: str, tail: int = 200) -> dict: if sid == BRIDGE_ID: - return {"ok": True, "lines": [f"GenericAgent bridge pid={os.getpid()}"]} + tail = max(1, min(int(tail or 200), 2000)) + lines = list(_bridge_log)[-tail:] + if not lines: + lines = [f"GenericAgent bridge pid={os.getpid()}"] + return {"ok": True, "lines": lines} if sid not in self._catalog: raise KeyError(sid) tail = max(1, min(int(tail or 200), 2000)) @@ -1358,6 +1865,9 @@ def _bridge_shutdown_services() -> None: def emit_session_state(sess: Session, state_name: str): + if state_name != "created": + title = (sess.title or sess.id)[:20] + bridge_print(f"[session] {title}: {state_name}") hub.emit({ "type": "session-state", "sessionId": sess.id, @@ -1370,6 +1880,12 @@ def emit_session_state(sess: Session, state_name: str): async def ws_handler(request): + origin_error = _request_origin_error(request) + if origin_error: + return web.json_response( + {"ok": False, "error": origin_error, "code": "origin_forbidden"}, + status=403, + ) ws = web.WebSocketResponse(heartbeat=30) await ws.prepare(request) hub.websockets.add(ws) @@ -1382,7 +1898,7 @@ async def ws_handler(request): }, ensure_ascii=False)) await ws.send_str(json.dumps({ "type": "services.snapshot", - "services": services.list_state(), + "services": services.list_panel_state(), }, ensure_ascii=False, default=str)) async for msg in ws: if msg.type == WSMsgType.TEXT: @@ -1399,26 +1915,95 @@ async def ws_handler(request): # Transport layer: HTTP command/data API # --------------------------------------------------------------------------- -def cors_headers(): - return { - "Access-Control-Allow-Origin": "*", - "Access-Control-Allow-Methods": "GET,POST,PUT,DELETE,OPTIONS", - "Access-Control-Allow-Headers": "Content-Type", +def _valid_port(value: str, default: int) -> int: + if not re.fullmatch(r"[0-9]{1,5}", value or ""): + return default + port = int(value) + return port if 1 <= port <= 65535 else default + + +def _allowed_request_origins() -> Set[str]: + bridge_port = _valid_port(os.environ.get("BRIDGE_PORT", "14168"), 14168) + origins = { + "tauri://localhost", + "http://tauri.localhost", + "http://localhost:5173", + f"http://127.0.0.1:{bridge_port}", + f"http://localhost:{bridge_port}", + f"http://[::1]:{bridge_port}", } + if os.environ.get("GA_E2E") == "1": + vite_port = os.environ.get("VITE_PORT", "") + if re.fullmatch(r"[0-9]{1,5}", vite_port or ""): + parsed_port = int(vite_port) + if 1 <= parsed_port <= 65535: + origins.add(f"http://127.0.0.1:{parsed_port}") + return origins + + +def _request_origin_error(request) -> Optional[str]: + origin = request.headers.get("Origin") + if origin is not None: + if origin not in _allowed_request_origins(): + return "request origin is not allowed" + return None + if request.headers.get("Sec-Fetch-Site", "").strip().lower() == "cross-site": + return "cross-site request without an Origin header is not allowed" + return None + + +def _add_cors_response_headers(response: web.StreamResponse, origin: Optional[str]) -> None: + if origin is None: + return + response.headers["Access-Control-Allow-Origin"] = origin + vary = [part.strip() for part in response.headers.get("Vary", "").split(",") if part.strip()] + if not any(part.lower() == "origin" for part in vary): + vary.append("Origin") + response.headers["Vary"] = ", ".join(vary) + response.headers["Access-Control-Allow-Methods"] = "GET,POST,PUT,PATCH,DELETE,OPTIONS,HEAD" + response.headers["Access-Control-Allow-Headers"] = "Content-Type, X-GA-E2E-Token" @web.middleware async def cors_middleware(request, handler): + origin = request.headers.get("Origin") + origin_error = _request_origin_error(request) + if origin_error: + return web.json_response( + {"ok": False, "error": origin_error, "code": "origin_forbidden"}, + status=403, + ) if request.method == "OPTIONS": - return web.Response(status=204, headers=cors_headers()) - resp = await handler(request) - for k, v in cors_headers().items(): - resp.headers[k] = v - return resp + response: web.StreamResponse = web.Response(status=204) + else: + try: + response = await handler(request) + except MaintenanceConflict as error: + response = web.json_response(error.payload(), status=409) + except web.HTTPException as error: + response = web.Response( + status=error.status, + reason=error.reason, + body=error.body, + headers=error.headers, + ) + except asyncio.CancelledError: + raise + except Exception as error: + bridge_print(f"[bridge] unhandled request error: {type(error).__name__}: {error}") + response = web.json_response( + {"ok": False, "error": "internal server error"}, status=500 + ) + _add_cors_response_headers(response, origin) + return response def json_ok(data: dict, status: int = 200): - return web.json_response(data, status=status, headers=cors_headers(), dumps=lambda x: json.dumps(x, ensure_ascii=False, default=str)) + return web.json_response( + data, + status=status, + dumps=lambda x: json.dumps(x, ensure_ascii=False, default=str), + ) async def read_json(request) -> dict: @@ -1440,6 +2025,7 @@ async def status_handler(request): "mykeyPath": manager.mykey_path, "sessionCount": len(manager.sessions), "activeSessionId": manager.active_session_id, + "maintenance": getattr(manager, "_maintenance_kind", None), "ws": "/ws", "transport": {"http": True, "wsEventsOnly": True}, }) @@ -1450,15 +2036,11 @@ async def status_handler(request): def _settings_doc() -> dict: - try: - doc = json.loads(_SETTINGS.read_text(encoding="utf-8")) if _SETTINGS.is_file() else {} - return doc if isinstance(doc, dict) else {} - except Exception: - return {} + return read_settings(_SETTINGS, strict=False) -def _write_settings_doc(doc: dict) -> None: - _SETTINGS.write_text(json.dumps(doc, ensure_ascii=False, indent=2), encoding="utf-8") +def _update_settings_doc(mutate) -> dict: + return update_settings(_SETTINGS, mutate) def _desktop_ui() -> dict: @@ -1480,6 +2062,34 @@ def _global_default_llm_no() -> int: return 0 +def _parse_model_no(value: Any) -> Optional[int]: + if value is None or isinstance(value, bool): + return None + try: + return int(value) + except (TypeError, ValueError): + return None + + +def _resolve_conductor_model_state(doc: dict, profile_count: int) -> dict: + """Resolve persisted Conductor config without relying on modulo selection.""" + count = max(0, int(profile_count or 0)) + conductor = doc.get("conductor") if isinstance(doc, dict) else None + ui = doc.get("ui") if isinstance(doc, dict) else None + raw_configured = conductor.get("llmNo") if isinstance(conductor, dict) else None + configured = _parse_model_no(raw_configured) + ui_default = _parse_model_no(ui.get("llmNo")) if isinstance(ui, dict) else None + + if count <= 0: + return {"configured": configured, "effective": None, "fallbackReason": "no_models"} + if configured is not None and 0 <= configured < count: + return {"configured": configured, "effective": configured, "fallbackReason": None} + if ui_default is not None and 0 <= ui_default < count: + reason = "invalid_configured" if raw_configured is not None else "ui_default" + return {"configured": configured, "effective": ui_default, "fallbackReason": reason} + return {"configured": configured, "effective": 0, "fallbackReason": "first_available"} + + async def get_config_handler(request): profiles = manager.list_model_profiles() active = next((p["id"] for p in profiles if p.get("active")), manager.config.get("llmNo", 0)) @@ -1495,17 +2105,20 @@ async def save_config_handler(request): data = await read_json(request) cfg = data.get("config", data) if isinstance(cfg, dict): - patch = {k: cfg[k] for k in _UI_KEYS if k in cfg} - if patch: - try: - doc = _settings_doc() - ui = doc["ui"] if isinstance(doc.get("ui"), dict) else {} - ui.update(patch) - doc["ui"] = ui - _write_settings_doc(doc) - except Exception as e: - print(f"[bridge] save ui prefs failed: {e}", file=sys.stderr) - manager.config.update(cfg) + with manager.mutation(): + patch = {k: cfg[k] for k in _UI_KEYS if k in cfg} + if patch: + try: + def update_ui(doc): + ui = doc["ui"] if isinstance(doc.get("ui"), dict) else {} + ui.update(patch) + doc["ui"] = ui + + _update_settings_doc(update_ui) + except DesktopSettingsError as error: + bridge_print(f"[bridge] save ui prefs failed: {error}") + return json_ok({"ok": False, "error": str(error)}, status=500) + manager.config.update(cfg) return json_ok({"ok": True, "gaRoot": manager.ga_root, "mykeyPath": manager.mykey_path, "config": manager.config}) @@ -1517,13 +2130,20 @@ async def model_profiles_handler(request): if request.method == "GET": return json_ok({"profile": manager.get_model_profile(profile_id)}) if request.method == "PUT": - return json_ok({"ok": True, **manager.update_model_profile(profile_id, await read_json(request))}) + data = await read_json(request) + with manager.mutation(): + return json_ok({"ok": True, **manager.update_model_profile(profile_id, data)}) if request.method == "DELETE": - return json_ok({"ok": True, **manager.delete_model_profile(profile_id)}) + with manager.mutation(): + return json_ok({"ok": True, **manager.delete_model_profile(profile_id)}) return json_ok({"ok": False, "error": "method not allowed"}, status=405) if request.method == "POST": - return json_ok({"ok": True, **manager.add_model_profile(await read_json(request))}) + data = await read_json(request) + with manager.mutation(): + return json_ok({"ok": True, **manager.add_model_profile(data)}) return json_ok({"profiles": manager.list_model_profiles()}) + except MaintenanceConflict: + raise except ValueError as e: return json_ok({"ok": False, "error": str(e)}, status=400) except Exception as e: @@ -1534,11 +2154,14 @@ async def mixin_handler(request): """聚合渠道成员管理:POST 加入 / DELETE 移出 主聚合渠道。""" try: profile_id = int(request.match_info.get("id")) - if request.method == "POST": - return json_ok({"ok": True, **manager.add_to_mixin(profile_id)}) - if request.method == "DELETE": - return json_ok({"ok": True, **manager.remove_from_mixin(profile_id)}) + with manager.mutation(): + if request.method == "POST": + return json_ok({"ok": True, **manager.add_to_mixin(profile_id)}) + if request.method == "DELETE": + return json_ok({"ok": True, **manager.remove_from_mixin(profile_id)}) return json_ok({"ok": False, "error": "method not allowed"}, status=405) + except MaintenanceConflict: + raise except ValueError as e: return json_ok({"ok": False, "error": str(e)}, status=400) except Exception as e: @@ -1549,7 +2172,10 @@ async def mixin_order_handler(request): """渠道组成员拖拽排序:PUT {members:[name,...]}。""" try: data = await read_json(request) - return json_ok({"ok": True, **manager.reorder_mixin(data.get("members") or [])}) + with manager.mutation(): + return json_ok({"ok": True, **manager.reorder_mixin(data.get("members") or [])}) + except MaintenanceConflict: + raise except ValueError as e: return json_ok({"ok": False, "error": str(e)}, status=400) except Exception as e: @@ -1558,7 +2184,8 @@ async def mixin_order_handler(request): async def list_sessions_handler(request): with manager.lock: - sessions = [manager.snapshot(s, include_messages=False) for s in manager.sessions.values()] + sessions = [manager.snapshot(s, include_messages=False) + for s in manager.sessions.values() if _is_desktop_session_id(s.id)] return json_ok({"sessions": sessions, "activeSessionId": manager.active_session_id}) @@ -1581,20 +2208,21 @@ async def delete_session_handler(request): async def patch_session_handler(request): sid = request.match_info["sid"] - sess = manager.get_session(sid) data = await read_json(request) - if "title" in data: - sess.title = data["title"] - sess.untitled = False - if "pinned" in data: - sess.pinned = bool(data["pinned"]) - if "untitled" in data: - sess.untitled = bool(data["untitled"]) - if "plan_scan_baseline" in data: - sess.plan_scan_baseline = int(data["plan_scan_baseline"]) - sess.updated_at = time.time() - manager._persist_session(sess) - return json_ok({"ok": True, "session": manager.snapshot(sess, include_messages=False)}) + with manager.mutation(): + sess = manager.get_session(sid) + if "title" in data: + sess.title = data["title"] + sess.untitled = False + if "pinned" in data: + sess.pinned = bool(data["pinned"]) + if "untitled" in data: + sess.untitled = bool(data["untitled"]) + if "plan_scan_baseline" in data: + sess.plan_scan_baseline = int(data["plan_scan_baseline"]) + sess.updated_at = time.time() + manager._persist_session(sess) + return json_ok({"ok": True, "session": manager.snapshot(sess, include_messages=False)}) async def prompt_handler(request): @@ -1625,7 +2253,8 @@ async def cancel_handler(request): async def restore_handler(request): sid = request.match_info["sid"] - return json_ok(manager.restore_context(sid)) + with manager.mutation(): + return json_ok(manager.restore_context(sid)) async def session_model_handler(request): @@ -1764,8 +2393,9 @@ async def upload_handler(request): if not blob: return json_ok({"ok": False, "error": "empty file"}) safe_name = name or "file" - fpath = _session_upload_dir(data.get("sid") or "") / f"{uuid.uuid4().hex[:12]}__{safe_name}" - fpath.write_bytes(blob) + with manager.mutation(): + fpath = _session_upload_dir(data.get("sid") or "") / f"{uuid.uuid4().hex[:12]}__{safe_name}" + fpath.write_bytes(blob) return json_ok({"ok": True, "path": str(fpath)}) @@ -1774,13 +2404,16 @@ async def upload_delete_handler(request): data = await read_json(request) raw = data.get("path") or "" try: - target = Path(raw).resolve() - upload_root = _WEB_UPLOAD_DIR.resolve() - if upload_root not in target.parents: - return json_ok({"ok": False, "error": "path outside upload dir"}) - if target.exists(): - target.unlink() + with manager.mutation(): + target = Path(raw).resolve() + upload_root = _WEB_UPLOAD_DIR.resolve() + if upload_root not in target.parents: + return json_ok({"ok": False, "error": "path outside upload dir"}) + if target.exists(): + target.unlink() return json_ok({"ok": True}) + except MaintenanceConflict: + raise except Exception as e: return json_ok({"ok": False, "error": str(e)}) @@ -1890,98 +2523,133 @@ async def mykey_save_handler(request): if content is None: return json_ok({"ok": False, "error": "missing_content"}, status=400) try: - profiles = manager._save_mykey_text(str(content)) + with manager.mutation(): + profiles = manager._save_mykey_text(str(content)) + # Importing/rewriting mykey may recover only extras that are already + # broken. Healthy tasks keep their current process/model snapshot. + services.restart_broken_extras() + except MaintenanceConflict: + raise except Exception as e: return json_ok({"ok": False, "error": str(e)}, status=400) - # 导入/整体重写 mykey 后,只有「已崩坏」的 conductor/scheduler 才重启(死了才救); - # 健康运行中的进程不打断,它们会在下个任务靠自身 mtime 热重载读到新 key。 - services.restart_broken_extras() return json_ok({"ok": True, "path": str(manager._mykey_file()), "profiles": profiles}) def _import_memory_from(source_dir: str, ga_root: str) -> dict: - """把 source_dir 的 memory/ 与 temp/model_responses/ 导入到 ga_root。 + """Compatibility wrapper for the transactional Desktop data import.""" + return merge_data_files(source_dir, ga_root) - memory/: 先整体备份现有 ga_root/memory 到 temp/memory_import_backup_/,再覆盖同名文件、补齐新文件。 - temp/model_responses/: 文件名带 pid/logid 天然唯一,只拷目标端不存在的,已存在的跳过。 - """ - src = Path(source_dir).expanduser().resolve() - dst_root = Path(ga_root).resolve() - if not src.is_dir(): - raise ValueError(f"source is not a directory: {src}") - if src == dst_root: - raise ValueError("source is the same as current GA root") - - src_mem = src / "memory" - src_resp = src / "temp" / "model_responses" - if not src_mem.is_dir() and not src_resp.is_dir(): - raise ValueError("not a GA directory (no memory/ or temp/model_responses/)") - - memory_copied = 0 - responses_copied = 0 - responses_skipped = 0 - backup_dir = "" - - # --- memory/: 备份后覆盖 --- - if src_mem.is_dir(): - dst_mem = dst_root / "memory" - if dst_mem.is_dir() and any(dst_mem.iterdir()): - ts = time.strftime("%Y%m%d_%H%M%S") - backup_root = dst_root / "temp" / f"memory_import_backup_{ts}" - backup_root.mkdir(parents=True, exist_ok=True) - shutil.copytree(dst_mem, backup_root / "memory") - backup_dir = str(backup_root) - dst_mem.mkdir(parents=True, exist_ok=True) - for item in src_mem.rglob("*"): - rel = item.relative_to(src_mem) - target = dst_mem / rel - if item.is_dir(): - target.mkdir(parents=True, exist_ok=True) - else: - target.parent.mkdir(parents=True, exist_ok=True) - shutil.copy2(item, target) - memory_copied += 1 - - # --- temp/model_responses/: 补齐缺失 --- - if src_resp.is_dir(): - dst_resp = dst_root / "temp" / "model_responses" - dst_resp.mkdir(parents=True, exist_ok=True) - for item in src_resp.rglob("*"): - if item.is_dir(): - continue - rel = item.relative_to(src_resp) - target = dst_resp / rel - if target.exists(): - responses_skipped += 1 + +async def _run_worker_to_completion(function, *args): + """A cancelled HTTP task must not release a worker-owned maintenance gate.""" + worker = asyncio.create_task(asyncio.to_thread(function, *args)) + try: + return await asyncio.shield(worker) + except asyncio.CancelledError as cancellation: + while not worker.done(): + try: + await asyncio.shield(worker) + except asyncio.CancelledError: continue - target.parent.mkdir(parents=True, exist_ok=True) - shutil.copy2(item, target) - responses_copied += 1 + except Exception: + break + with contextlib.suppress(Exception): + worker.result() + raise cancellation - return { - "ok": True, - "memoryCopied": memory_copied, - "responsesCopied": responses_copied, - "responsesSkipped": responses_skipped, - "backupDir": backup_dir, - } + +async def memory_import_inspect_handler(request): + data = await read_json(request) + source_path = str(data.get("sourcePath") or data.get("sourceDir") or "").strip() + if not source_path: + return json_ok({"ok": False, "error": "missing_sourcePath"}, status=400) + try: + result = await asyncio.to_thread(inspect_import_source, source_path) + except (BackupFormatError, OSError, ValueError) as error: + return json_ok({"ok": False, "error": str(error)}, status=400) + return json_ok(result) + + +def _import_data_source(source_path: str) -> dict: + with materialize_import_source(source_path) as source_root: + token = manager.begin_maintenance("import", services.running_managed_ids) + try: + with manager.lock: + existing_session_ids = set(manager.sessions) + result = merge_data_files( + str(source_root), + manager.ga_root, + existing_session_ids=existing_session_ids, + session_preparer=manager._session_from_item, + ) + prepared_sessions = result.pop("_preparedSessions", []) + if prepared_sessions: + # Files are already committed atomically by merge_data_files. Adopt the + # prevalidated objects without a second persistence pass that could + # partially fail or overwrite an existing Desktop session. + with manager.lock: + for session in prepared_sessions: + manager.sessions.setdefault(session.id, session) + return result + finally: + manager.end_maintenance(token) async def memory_import_handler(request): data = await read_json(request) - source_dir = (data.get("sourceDir") or "").strip() - if not source_dir: + source_path = str(data.get("sourcePath") or data.get("sourceDir") or "").strip() + if not source_path: return json_ok({"ok": False, "error": "missing_sourceDir"}, status=400) try: - result = _import_memory_from(source_dir, manager.ga_root) - result.update(manager.import_sessions(source_dir)) - except Exception as e: - return json_ok({"ok": False, "error": str(e)}, status=400) + result = await _run_worker_to_completion(_import_data_source, source_path) + except MaintenanceConflict as error: + return json_ok(error.payload(), status=409) + except (BackupFormatError, ValueError) as error: + return json_ok({"ok": False, "error": str(error)}, status=400) + except OSError as error: + return json_ok({"ok": False, "error": str(error)}, status=500) + return json_ok(result) + + +def _export_data_source(destination_path: str, source_mode: str) -> dict: + token = manager.begin_maintenance("export", services.running_managed_ids) + try: + manager._persist(strict=True) + return export_data_backup( + manager.ga_root, + destination_path, + source_mode, + forbidden_roots=( + _WEB_UPLOAD_DIR, + APP_DIR / "desktop" / "static", + ), + ) + finally: + manager.end_maintenance(token) + + +async def memory_export_handler(request): + data = await read_json(request) + destination_path = str(data.get("destinationPath") or "").strip() + source_mode = str(data.get("sourceMode") or "").strip() + if not destination_path: + return json_ok({"ok": False, "error": "missing_destinationPath"}, status=400) + try: + result = await _run_worker_to_completion( + _export_data_source, destination_path, source_mode + ) + except MaintenanceConflict as error: + return json_ok(error.payload(), status=409) + except (BackupFormatError, ValueError) as error: + return json_ok({"ok": False, "error": str(error)}, status=400) + except OSError as error: + return json_ok({"ok": False, "error": str(error)}, status=500) return json_ok(result) async def conductor_model_get_handler(request): - return json_ok({"model": _conductor_settings()}) + state = _resolve_conductor_model_state(_settings_doc(), len(manager.list_model_profiles())) + return json_ok({"model": state}) async def conductor_model_save_handler(request): @@ -1990,15 +2658,23 @@ async def conductor_model_save_handler(request): llm_no = int(data.get("llmNo")) except (TypeError, ValueError): return json_ok({"ok": False, "error": "invalid_llmNo"}, status=400) + profile_count = len(manager.list_model_profiles()) + if llm_no < 0 or llm_no >= profile_count: + return json_ok({"ok": False, "error": "model_out_of_range"}, status=400) try: - doc = _settings_doc() - conductor = doc["conductor"] if isinstance(doc.get("conductor"), dict) else {} - conductor["llmNo"] = llm_no - doc["conductor"] = conductor - _write_settings_doc(doc) + with manager.mutation(): + def update_conductor(doc): + conductor = doc["conductor"] if isinstance(doc.get("conductor"), dict) else {} + conductor["llmNo"] = llm_no + doc["conductor"] = conductor + + doc = _update_settings_doc(update_conductor) + except MaintenanceConflict: + raise except Exception as e: return json_ok({"ok": False, "error": str(e)}, status=500) - return json_ok({"ok": True, "model": conductor}) + state = _resolve_conductor_model_state(doc, profile_count) + return json_ok({"ok": True, "model": state}) async def service_start_handler(request): @@ -2047,7 +2723,8 @@ async def stop_extras_handler(request): async def start_extras_handler(request): if not _is_local_peer(request.remote or ""): return json_ok({"ok": False, "error": "forbidden"}, status=403) - services.autostart_extras() + with manager.mutation(): + services.autostart_extras() return json_ok({"ok": True}) @@ -2065,10 +2742,32 @@ def _exit_bridge() -> None: async def bridge_exit_handler(request): if not _is_local_peer(request.remote or ""): return json_ok({"ok": False, "error": "forbidden"}, status=403) - _exit_bridge() + with manager.mutation(): + # Make graceful shutdown admission irreversible before scheduling the + # delayed process exit. Otherwise a new import/export could acquire the + # maintenance gate during the response-to-exit timer window. + manager._shutdown_requested = True + _exit_bridge() return json_ok({"ok": True}) +async def e2e_next_turn_handler(request): + token = _e2e_control_token() + if token is None: + raise web.HTTPNotFound() + if not _is_local_peer(request.remote or ""): + return json_ok({"ok": False, "error": "forbidden"}, status=403) + if request.headers.get("X-GA-E2E-Token", "") != token: + return json_ok({"ok": False, "error": "forbidden"}, status=403) + try: + body = await request.json() + with manager.mutation(): + _set_e2e_next_turn(str(body.get("mode", ""))) + except (ValueError, TypeError, json.JSONDecodeError): + return json_ok({"ok": False, "error": "mode must be empty"}, status=400) + return json_ok({"ok": True, "mode": "empty"}) + + async def token_stats_handler(request): try: sys.path.insert(0, str(APP_DIR)) if str(APP_DIR) not in sys.path else None @@ -2090,30 +2789,25 @@ async def token_stats_handler(request): return json_ok({"records": records}) -_TOKEN_HISTORY_FILE = None - -def _tok_file() -> Path: - global _TOKEN_HISTORY_FILE - if _TOKEN_HISTORY_FILE is None: - _TOKEN_HISTORY_FILE = Path(manager.ga_root) / "temp" / "desktop_token_history.json" - return _TOKEN_HISTORY_FILE - async def get_token_history_handler(request): - f = _tok_file() - if f.is_file(): - try: - data = json.loads(f.read_text(encoding="utf-8")) - return json_ok(data) - except Exception: - pass - return json_ok({"history": [], "snap": {}}) - -async def post_token_history_handler(request): - data = await read_json(request) - f = _tok_file() - f.parent.mkdir(parents=True, exist_ok=True) - f.write_text(json.dumps(data, ensure_ascii=False), encoding="utf-8") - return json_ok({"ok": True}) + try: + import cost_tracker + data = cost_tracker.aggregate_ledger() + # Enrich session titles from manager + for entry in data.get("history", []): + sid = entry.get("sessionId", "") + with manager.lock: + sess = manager.sessions.get(sid) + if sess and sess.title: + entry["title"] = sess.title + if not entry.get("model") and sess and sess.agent: + try: + entry["model"] = sess.agent.get_llm_name(model=True) or "" + except Exception: + pass + return json_ok(data) + except Exception: + return json_ok({"history": [], "snap": {}}) async def subscription_portal_handler(request): @@ -2127,7 +2821,8 @@ async def subscription_portal_handler(request): return json_ok({"available": bool(sp)}) if not sp: return json_ok({"ok": False, "available": False}, status=404) - sp() + with manager.mutation(): + sp() return json_ok({"ok": True}) @@ -2162,7 +2857,6 @@ def create_app(): app.router.add_get("/upload/raw", upload_raw_handler) app.router.add_get("/token-stats", token_stats_handler) app.router.add_get("/token-history", get_token_history_handler) - app.router.add_post("/token-history", post_token_history_handler) app.router.add_get("/subscription-portal", subscription_portal_handler) app.router.add_post("/subscription-portal", subscription_portal_handler) app.router.add_post("/services/start", service_start_handler) @@ -2171,13 +2865,17 @@ def create_app(): app.router.add_get("/services/panel", service_panel_handler) app.router.add_get("/services/mykey", mykey_get_handler) app.router.add_post("/services/mykey", mykey_save_handler) + app.router.add_post("/memory/import/inspect", memory_import_inspect_handler) app.router.add_post("/memory/import", memory_import_handler) + app.router.add_post("/memory/export", memory_export_handler) app.router.add_get("/services/conductor/model", conductor_model_get_handler) app.router.add_post("/services/conductor/model", conductor_model_save_handler) app.router.add_post("/services/stop-extras", stop_extras_handler) app.router.add_post("/services/start-extras", start_extras_handler) app.router.add_get("/services/identity", identity_handler) app.router.add_post("/services/bridge/exit", bridge_exit_handler) + if _e2e_control_token() is not None: + app.router.add_post("/__e2e__/next-turn", e2e_next_turn_handler) # Serve static frontend (desktop/static/) static_dir = APP_DIR / "desktop" / "static" @@ -2206,5 +2904,5 @@ async def on_shutdown(app): if __name__ == "__main__": host = os.environ.get("BRIDGE_HOST", "127.0.0.1") port = int(os.environ.get("BRIDGE_PORT", "14168")) - print(f"GenericAgent Web2 bridge: http://{host}:{port} ws://{host}:{port}/ws", file=sys.stderr) + bridge_print(f"GenericAgent Web2 bridge: http://{host}:{port} ws://{host}:{port}/ws") web.run_app(create_app(), host=host, port=port, print=None) diff --git a/frontends/desktop_settings.py b/frontends/desktop_settings.py new file mode 100644 index 000000000..afe80b1f5 --- /dev/null +++ b/frontends/desktop_settings.py @@ -0,0 +1,161 @@ +"""Shared, crash-safe Desktop settings storage for bridge and package tools.""" + +from __future__ import annotations + +import contextlib +import json +import os +import shutil +import stat +import time +import uuid +from pathlib import Path +from typing import Callable + + +LOCK_TIMEOUT_SECONDS = 5.0 +LOCK_STALE_SECONDS = 30.0 +PACKAGE_PATH_KEYS = ("python_path", "project_dir", "bridge_script") + + +class DesktopSettingsError(RuntimeError): + pass + + +def _lock_path(settings_path: Path) -> Path: + return settings_path.with_name(f"{settings_path.name}.lock") + + +@contextlib.contextmanager +def settings_lock( + settings_path: Path, + *, + timeout: float = LOCK_TIMEOUT_SECONDS, + stale_after: float = LOCK_STALE_SECONDS, +): + lock_path = _lock_path(settings_path) + token = f"{os.getpid()}:{uuid.uuid4().hex}" + deadline = time.monotonic() + timeout + settings_path.parent.mkdir(parents=True, exist_ok=True) + while True: + try: + os.mkdir(lock_path, 0o700) + (lock_path / "owner").write_text(token, encoding="ascii") + break + except FileExistsError: + try: + lock_stat = lock_path.lstat() + if not stat.S_ISDIR(lock_stat.st_mode) or stat.S_ISLNK(lock_stat.st_mode): + raise DesktopSettingsError(f"settings lock is not a directory: {lock_path}") + stale = time.time() - lock_stat.st_mtime > stale_after + except FileNotFoundError: + continue + if stale: + tombstone = lock_path.with_name(f"{lock_path.name}.stale.{uuid.uuid4().hex}") + try: + os.rename(lock_path, tombstone) + except FileNotFoundError: + continue + except OSError: + pass + else: + shutil.rmtree(tombstone, ignore_errors=True) + continue + if time.monotonic() >= deadline: + raise DesktopSettingsError(f"timed out waiting for settings lock: {lock_path}") + time.sleep(0.05) + try: + yield + finally: + try: + owner = lock_path / "owner" + if owner.read_text(encoding="ascii") == token: + owner.unlink() + lock_path.rmdir() + except (FileNotFoundError, OSError): + pass + + +def read_settings(settings_path: Path, *, strict: bool = True) -> dict: + if not settings_path.exists(): + return {} + try: + document = json.loads(settings_path.read_text(encoding="utf-8-sig")) + except (OSError, UnicodeError, json.JSONDecodeError) as error: + if strict: + raise DesktopSettingsError(f"cannot read Desktop settings: {error}") from error + return {} + if not isinstance(document, dict): + if strict: + raise DesktopSettingsError(f"Desktop settings must be a JSON object: {settings_path}") + return {} + return document + + +def write_settings_atomically(settings_path: Path, document: dict) -> None: + if not isinstance(document, dict): + raise DesktopSettingsError("Desktop settings must be a JSON object") + mode = stat.S_IMODE(settings_path.stat().st_mode) if settings_path.exists() else 0o600 + payload = (json.dumps(document, ensure_ascii=False, indent=2) + "\n").encode("utf-8") + temporary = settings_path.with_name( + f".{settings_path.name}.{os.getpid()}.{uuid.uuid4().hex}.tmp" + ) + try: + descriptor = os.open(temporary, os.O_WRONLY | os.O_CREAT | os.O_EXCL, mode) + with os.fdopen(descriptor, "wb") as stream: + stream.write(payload) + stream.flush() + os.fsync(stream.fileno()) + os.replace(temporary, settings_path) + if os.name != "nt": + directory = os.open(settings_path.parent, os.O_RDONLY) + try: + os.fsync(directory) + finally: + os.close(directory) + except OSError as error: + raise DesktopSettingsError(f"cannot write Desktop settings: {error}") from error + finally: + temporary.unlink(missing_ok=True) + + +def update_settings(settings_path: Path, mutate: Callable[[dict], None]) -> dict: + with settings_lock(settings_path): + document = read_settings(settings_path, strict=True) + mutate(document) + write_settings_atomically(settings_path, document) + return document + + +def merge_package_paths( + settings_path: Path, + *, + python_path: str, + project_dir: str, + bridge_script: str, +) -> dict: + updates = { + "python_path": python_path, + "project_dir": project_dir, + "bridge_script": bridge_script, + } + return update_settings(settings_path, lambda document: document.update(updates)) + + +def _path_is_within(value: str, bundle_root: str) -> bool: + try: + candidate = os.path.normcase(os.path.abspath(os.path.expanduser(value))) + bundle = os.path.normcase(os.path.abspath(os.path.expanduser(bundle_root))) + return os.path.commonpath((candidate, bundle)) == bundle + except (OSError, ValueError): + return False + + +def remove_bundle_paths(settings_path: Path, bundle_root: str) -> dict: + def remove_owned(document: dict) -> None: + for key in PACKAGE_PATH_KEYS: + value = document.get(key) + if isinstance(value, str) and _path_is_within(value, bundle_root): + document.pop(key, None) + + return update_settings(settings_path, remove_owned) diff --git a/frontends/tests/requirements.txt b/frontends/tests/requirements.txt new file mode 100644 index 000000000..62a15c16f --- /dev/null +++ b/frontends/tests/requirements.txt @@ -0,0 +1,8 @@ +pytest +aiohttp>=3.9 +requests>=2.28 +psutil +fastapi +uvicorn +websockets +pydantic diff --git a/frontends/tests/test_bridge_e2e_controls.py b/frontends/tests/test_bridge_e2e_controls.py new file mode 100644 index 000000000..8fe89a11f --- /dev/null +++ b/frontends/tests/test_bridge_e2e_controls.py @@ -0,0 +1,117 @@ +"""Security and one-shot semantics for the bridge E2E control plane.""" +from __future__ import annotations + +import ast +import os +import threading +from pathlib import Path + +import pytest + + +ROOT = Path(__file__).resolve().parent.parent.parent +SOURCE = (ROOT / "frontends" / "desktop_bridge.py").read_text(encoding="utf-8") +TREE = ast.parse(SOURCE) + + +def _function_node(name: str) -> ast.FunctionDef | ast.AsyncFunctionDef: + return next( + node + for node in TREE.body + if isinstance(node, (ast.FunctionDef, ast.AsyncFunctionDef)) and node.name == name + ) + + +def _load_helpers(): + wanted = { + "_E2E_NEXT_TURN", + "_E2E_CONTROL_LOCK", + "_e2e_control_token", + "_set_e2e_next_turn", + "_consume_e2e_next_turn", + } + nodes = [] + for node in TREE.body: + if isinstance(node, (ast.FunctionDef, ast.AsyncFunctionDef)) and node.name in wanted: + nodes.append(node) + elif isinstance(node, (ast.Assign, ast.AnnAssign)): + targets = node.targets if isinstance(node, ast.Assign) else [node.target] + names = {target.id for target in targets if isinstance(target, ast.Name)} + if names & wanted: + nodes.append(node) + namespace = {"os": os, "threading": threading} + exec(compile(ast.Module(body=nodes, type_ignores=[]), "desktop_bridge.py", "exec"), namespace) + return namespace + + +def test_control_requires_explicit_e2e_flag_and_random_token(monkeypatch): + helpers = _load_helpers() + monkeypatch.delenv("GA_E2E", raising=False) + monkeypatch.setenv("GA_E2E_CONTROL_TOKEN", "secret") + assert helpers["_e2e_control_token"]() is None + + monkeypatch.setenv("GA_E2E", "1") + monkeypatch.delenv("GA_E2E_CONTROL_TOKEN", raising=False) + assert helpers["_e2e_control_token"]() is None + + monkeypatch.setenv("GA_E2E_CONTROL_TOKEN", "secret") + assert helpers["_e2e_control_token"]() == "secret" + + +def test_next_turn_override_is_validated_and_consumed_once(): + helpers = _load_helpers() + with pytest.raises(ValueError, match="empty"): + helpers["_set_e2e_next_turn"]("crash") + + helpers["_set_e2e_next_turn"]("empty") + assert helpers["_consume_e2e_next_turn"]() == "empty" + assert helpers["_consume_e2e_next_turn"]() is None + + +def test_e2e_route_is_not_registered_without_the_control_gate(): + create_app = _function_node("create_app") + registrations = [ + node + for node in ast.walk(create_app) + if isinstance(node, ast.Call) + and any( + isinstance(arg, ast.Constant) and arg.value == "/__e2e__/next-turn" + for arg in node.args + ) + ] + assert len(registrations) == 1 + + registration = registrations[0] + gate = next( + node + for node in ast.walk(create_app) + if isinstance(node, ast.If) and registration in list(ast.walk(node)) + ) + assert isinstance(gate.test, ast.Compare) + assert isinstance(gate.test.left, ast.Call) + assert isinstance(gate.test.left.func, ast.Name) + assert gate.test.left.func.id == "_e2e_control_token" + + +def test_e2e_handler_requires_loopback_and_secret_header(): + handler = _function_node("e2e_next_turn_handler") + called_names = { + node.func.id + for node in ast.walk(handler) + if isinstance(node, ast.Call) and isinstance(node.func, ast.Name) + } + constants = { + node.value + for node in ast.walk(handler) + if isinstance(node, ast.Constant) and isinstance(node.value, str) + } + assert "_e2e_control_token" in called_names + assert "_is_local_peer" in called_names + assert "X-GA-E2E-Token" in constants + assert any( + isinstance(node, ast.Attribute) + and isinstance(node.value, ast.Name) + and node.value.id == "web" + and node.attr == "HTTPNotFound" + for node in ast.walk(handler) + ) diff --git a/frontends/tests/test_bridge_model_switch.py b/frontends/tests/test_bridge_model_switch.py new file mode 100644 index 000000000..2eec9a43b --- /dev/null +++ b/frontends/tests/test_bridge_model_switch.py @@ -0,0 +1,173 @@ +"""Unit tests for model hot-switching within a session. + +Tests the contract: set_session_model changes llm_no without destroying session +state. Idle agents switch immediately; running turns defer the new client. +Run: pytest frontends/tests/test_bridge_model_switch.py -v +""" + + +class FakeAgent: + """Minimal mock of an agent object with next_llm capability.""" + def __init__(self): + self.current_llm = 0 + self.next_llm_calls = [] + + def next_llm(self, llm_no: int): + self.next_llm_calls.append(llm_no) + self.current_llm = llm_no + + +class FakeSession: + """Minimal mock of desktop_bridge.Session for model switch tests.""" + def __init__(self, sid="test-session", llm_no=0, messages=None, agent=None): + self.id = sid + self.llm_no = llm_no + self.messages = messages or [ + {"id": 1, "role": "user", "content": "Hello"}, + {"id": 2, "role": "assistant", "content": "Hi there"}, + {"id": 3, "role": "user", "content": "Switch model now"}, + ] + self.agent = agent + self.status = "idle" + self.updated_at = 0.0 + + +def simulate_set_session_model(sess: FakeSession, llm_no: int) -> dict: + """Replicate set_session_model logic from desktop_bridge.py:1105-1118.""" + import time + sess.llm_no = int(llm_no) + if sess.status != "running" and sess.agent is not None and hasattr(sess.agent, "next_llm"): + try: + sess.agent.next_llm(int(llm_no)) + except Exception: + pass + sess.updated_at = time.time() + return {"ok": True, "sessionId": sess.id, "llmNo": sess.llm_no} + + +class TestModelHotSwitch: + """Core contract: model switch preserves session state.""" + + def test_llm_no_updated(self): + sess = FakeSession(llm_no=0) + result = simulate_set_session_model(sess, 2) + assert sess.llm_no == 2 + assert result["llmNo"] == 2 + assert result["ok"] is True + + def test_messages_preserved(self): + original_messages = [ + {"id": 1, "role": "user", "content": "Hello"}, + {"id": 2, "role": "assistant", "content": "World"}, + ] + sess = FakeSession(messages=list(original_messages)) + simulate_set_session_model(sess, 3) + assert sess.messages == original_messages + assert len(sess.messages) == 2 + + def test_agent_next_llm_called(self): + agent = FakeAgent() + sess = FakeSession(agent=agent) + simulate_set_session_model(sess, 5) + assert agent.next_llm_calls == [5] + assert agent.current_llm == 5 + + def test_agent_none_no_error(self): + sess = FakeSession(agent=None) + result = simulate_set_session_model(sess, 1) + assert result["ok"] is True + assert sess.llm_no == 1 + + def test_agent_without_next_llm_no_error(self): + class LegacyAgent: + pass + sess = FakeSession(agent=LegacyAgent()) + result = simulate_set_session_model(sess, 4) + assert result["ok"] is True + assert sess.llm_no == 4 + + def test_updated_at_changed(self): + sess = FakeSession() + sess.updated_at = 0.0 + simulate_set_session_model(sess, 1) + assert sess.updated_at > 0.0 + + def test_status_not_changed(self): + sess = FakeSession() + sess.status = "idle" + simulate_set_session_model(sess, 2) + assert sess.status == "idle" + + def test_switch_during_running_preserves_status(self): + agent = FakeAgent() + sess = FakeSession(agent=agent) + sess.status = "running" + simulate_set_session_model(sess, 3) + assert sess.status == "running" + assert sess.llm_no == 3 + assert agent.next_llm_calls == [] + + def test_multiple_switches(self): + agent = FakeAgent() + sess = FakeSession(agent=agent, llm_no=0) + simulate_set_session_model(sess, 1) + simulate_set_session_model(sess, 2) + simulate_set_session_model(sess, 0) + assert sess.llm_no == 0 + assert agent.next_llm_calls == [1, 2, 0] + + def test_switch_back_to_same_model(self): + agent = FakeAgent() + sess = FakeSession(agent=agent, llm_no=3) + simulate_set_session_model(sess, 3) + assert sess.llm_no == 3 + assert agent.next_llm_calls == [3] + + +class TestModelSwitchFrontendContract: + """Frontend side: sendPrompt uses current selectedModelNo.""" + + def test_llm_no_passed_to_send_prompt(self): + """sendPrompt reads selectedModelNo at call time, not at session creation.""" + selectedModelNo = 0 + calls = [] + + def mock_send_prompt(sid, prompt, llm_no, files=None, images=None): + calls.append({"sid": sid, "llm_no": llm_no}) + + # First message with model 0 + mock_send_prompt("s1", "hello", selectedModelNo) + # User switches model + selectedModelNo = 2 + # Second message with model 2 + mock_send_prompt("s1", "world", selectedModelNo) + + assert calls[0]["llm_no"] == 0 + assert calls[1]["llm_no"] == 2 + # Same session ID — context preserved + assert calls[0]["sid"] == calls[1]["sid"] + + def test_model_change_does_not_create_new_session(self): + """Switching model mid-session does not call createSession.""" + session_creates = [] + + def mock_create(): + session_creates.append(1) + return "new-session" + + # Simulate: active session exists, user switches model + active_session_id = "existing-session" + # selectModel only updates selectedModelNo + calls legacy bridge + # It does NOT create a new session + assert len(session_creates) == 0 + + def test_live_model_cleared_on_switch(self): + """selectModel sets liveModel to null (re-fetched from bridge on next poll).""" + state = {"selectedModelNo": 0, "liveModel": {"isMixin": False, "current": "gpt-4"}} + + # Simulate selectModel logic + state["selectedModelNo"] = 2 + state["liveModel"] = None # cleared + + assert state["liveModel"] is None + assert state["selectedModelNo"] == 2 diff --git a/frontends/tests/test_bridge_origin_security.py b/frontends/tests/test_bridge_origin_security.py new file mode 100644 index 000000000..2164ece9e --- /dev/null +++ b/frontends/tests/test_bridge_origin_security.py @@ -0,0 +1,194 @@ +"""Origin enforcement for the local Desktop bridge transport.""" +from __future__ import annotations + +import asyncio +from pathlib import Path + +import pytest +from aiohttp import WSServerHandshakeError, web +from aiohttp.test_utils import TestClient, TestServer + +from frontends.tests.test_bridge_sessions import _mod as bridge + + +PROTECTED_PATHS = ( + "/status", + "/memory/export", + "/memory/import/inspect", + "/upload", + "/upload/raw", +) + + +async def _with_client(callback, tmp_path: Path): + side_effect = tmp_path / "request-reached-handler" + + async def protected_handler(_request): + side_effect.write_text("reached", encoding="utf-8") + return web.Response(text="protected-secret") + + async def http_error(_request): + raise web.HTTPBadRequest(text="bad request") + + async def internal_error(_request): + raise RuntimeError("secret failure detail") + + app = web.Application(middlewares=[bridge.cors_middleware]) + for path in PROTECTED_PATHS: + app.router.add_route("*", path, protected_handler) + app.router.add_get("/ws", bridge.ws_handler) + app.router.add_get("/http-error", http_error) + app.router.add_get("/internal-error", internal_error) + client = TestClient(TestServer(app)) + await client.start_server() + try: + await callback(client, side_effect) + finally: + await client.close() + + +def test_evil_origins_are_rejected_before_sensitive_handlers( + tmp_path: Path, monkeypatch: pytest.MonkeyPatch +): + monkeypatch.setenv("BRIDGE_PORT", "14168") + monkeypatch.delenv("GA_E2E", raising=False) + monkeypatch.delenv("VITE_PORT", raising=False) + evil_origins = ( + "null", + "https://localhost:5173", + "http://localhost:5174", + "http://127.0.0.1:5173", + "http://127.0.0.1:14169", + "http://localhost:5173.evil.example", + "http://tauri.localhost.evil.example", + "tauri://evil", + ) + + async def scenario(client: TestClient, side_effect: Path): + for origin in evil_origins: + for path in PROTECTED_PATHS: + for method in ("GET", "POST", "OPTIONS"): + response = await client.request(method, path, headers={"Origin": origin}) + assert response.status == 403, (origin, method, path, await response.text()) + assert response.headers.get("Access-Control-Allow-Origin") is None + assert "protected-secret" not in await response.text() + assert not side_effect.exists() + + asyncio.run(_with_client(scenario, tmp_path)) + + +def test_allowed_origins_are_reflected_exactly_without_credentials( + tmp_path: Path, monkeypatch: pytest.MonkeyPatch +): + monkeypatch.setenv("BRIDGE_PORT", "15168") + monkeypatch.setenv("GA_E2E", "1") + monkeypatch.setenv("VITE_PORT", "5273") + allowed = ( + "tauri://localhost", + "http://tauri.localhost", + "http://localhost:5173", + "http://127.0.0.1:15168", + "http://localhost:15168", + "http://[::1]:15168", + "http://127.0.0.1:5273", + ) + + async def scenario(client: TestClient, side_effect: Path): + for origin in allowed: + response = await client.get("/status", headers={"Origin": origin}) + assert response.status == 200 + assert response.headers["Access-Control-Allow-Origin"] == origin + assert "origin" in response.headers.get("Vary", "").lower() + assert "Access-Control-Allow-Credentials" not in response.headers + assert response.headers["Access-Control-Allow-Origin"] != "*" + + preflight = await client.options("/memory/export", headers={"Origin": origin}) + assert preflight.status == 204 + assert preflight.headers["Access-Control-Allow-Origin"] == origin + assert side_effect.exists() + + asyncio.run(_with_client(scenario, tmp_path)) + + +def test_no_origin_cli_is_allowed_but_cross_site_navigation_is_rejected( + tmp_path: Path, monkeypatch: pytest.MonkeyPatch +): + monkeypatch.delenv("GA_E2E", raising=False) + + async def scenario(client: TestClient, side_effect: Path): + response = await client.get("/status") + assert response.status == 200 + assert "Access-Control-Allow-Origin" not in response.headers + assert await response.text() == "protected-secret" + + side_effect.unlink() + rejected = await client.get( + "/status", headers={"Sec-Fetch-Site": "cross-site"} + ) + assert rejected.status == 403 + assert not side_effect.exists() + + asyncio.run(_with_client(scenario, tmp_path)) + + +def test_e2e_origin_requires_explicit_mode_and_a_strict_valid_port( + tmp_path: Path, monkeypatch: pytest.MonkeyPatch +): + async def scenario(client: TestClient, side_effect: Path): + origin = "http://127.0.0.1:5273" + response = await client.get("/status", headers={"Origin": origin}) + assert response.status == 403 + assert not side_effect.exists() + + monkeypatch.setenv("GA_E2E", "1") + for invalid in ("", "0", "65536", "52x73", "5273/path"): + monkeypatch.setenv("VITE_PORT", invalid) + asyncio.run(_with_client(scenario, tmp_path)) + monkeypatch.setenv("VITE_PORT", "5273") + monkeypatch.delenv("GA_E2E") + asyncio.run(_with_client(scenario, tmp_path)) + + +def test_allowed_origin_headers_cover_http_errors_and_internal_errors( + tmp_path: Path, monkeypatch: pytest.MonkeyPatch +): + origin = "tauri://localhost" + + async def scenario(client: TestClient, _side_effect: Path): + bad = await client.get("/http-error", headers={"Origin": origin}) + assert bad.status == 400 + assert bad.headers["Access-Control-Allow-Origin"] == origin + failed = await client.get("/internal-error", headers={"Origin": origin}) + assert failed.status == 500 + assert failed.headers["Access-Control-Allow-Origin"] == origin + assert "secret failure detail" not in await failed.text() + + asyncio.run(_with_client(scenario, tmp_path)) + + +def test_websocket_evil_origin_fails_before_prepare( + tmp_path: Path, monkeypatch: pytest.MonkeyPatch +): + monkeypatch.delenv("GA_E2E", raising=False) + + async def scenario(client: TestClient, side_effect: Path): + with pytest.raises(WSServerHandshakeError) as raised: + await client.ws_connect("/ws", headers={"Origin": "http://evil.example"}) + assert raised.value.status == 403 + assert not side_effect.exists() + + asyncio.run(_with_client(scenario, tmp_path)) + + +def test_bridge_source_has_no_wildcard_cors_and_checks_ws_before_prepare(): + source = Path(bridge.__file__).read_text(encoding="utf-8") + assert 'Access-Control-Allow-Origin": "*"' not in source + assert "cors_headers" not in source + ws_start = source.index("async def ws_handler") + ws_end = source.index( + "# ---------------------------------------------------------------------------\n# Transport layer", + ws_start, + ) + ws_source = source[ws_start:ws_end] + assert ws_source.index("_request_origin_error(request)") < ws_source.index("WebSocketResponse") + assert ws_source.index("_request_origin_error(request)") < ws_source.index("await ws.prepare(request)") diff --git a/frontends/tests/test_bridge_sessions.py b/frontends/tests/test_bridge_sessions.py new file mode 100644 index 000000000..de1a65251 --- /dev/null +++ b/frontends/tests/test_bridge_sessions.py @@ -0,0 +1,1384 @@ +"""Tests for session persistence: race conditions, corruption resilience, and reload.""" +from __future__ import annotations + +import copy +import json +import os +import socket +import sys +import tempfile +import threading +import time +from pathlib import Path +from typing import Any +from unittest.mock import patch + +import pytest + +# Add the frontend and project roots so direct bridge imports resolve sibling helpers. +BRIDGE_PATH = Path(__file__).resolve().parent.parent / "desktop_bridge.py" +PROJECT_ROOT = BRIDGE_PATH.parent.parent +sys.path.insert(0, str(BRIDGE_PATH.parent)) +sys.path.insert(0, str(PROJECT_ROOT)) + +# We need a lightweight extraction of AgentManager without starting the full server. +# Import the module to get access to _load_plan_baseline, _sanitize_desktop_plan_path, Session, etc. +import importlib.util + +_spec = importlib.util.spec_from_file_location("desktop_bridge", str(BRIDGE_PATH)) +_mod = importlib.util.module_from_spec(_spec) +sys.modules["desktop_bridge"] = _mod + +# Patch heavy imports that desktop_bridge may pull in. +import types as _types + +def _make_stub(name, attrs=None): + m = _types.ModuleType(name) + if attrs: + for k, v in attrs.items(): + setattr(m, k, v) + return m + +_plan_state_stub = _make_stub("plan_state", { + "is_session_scoped_plan_path": lambda p, sid: True, + "is_plan_preset_prompt": lambda prompt: False, + "PLAN_PRESETS": {}, +}) + +for _name in ("agentmain", "llmcore", "agent_loop", "plugins", "reflect", + "frontends.plan_state", "cost_tracker"): + sys.modules.setdefault(_name, _make_stub(_name)) +sys.modules["plan_state"] = _plan_state_stub + +# Attempt import; if it fails due to missing deps, skip. +try: + _spec.loader.exec_module(_mod) +except Exception as exc: + pytest.skip(f"Cannot import desktop_bridge: {exc}", allow_module_level=True) + +Session = _mod.Session +AgentManager = _mod.AgentManager +MaintenanceConflict = _mod.MaintenanceConflict +ServiceManager = _mod.ServiceManager + + +@pytest.fixture +def tmp_ga_root(tmp_path: Path): + """Create a minimal GA root with temp/desktop_sessions/ directory.""" + sessions_dir = tmp_path / "temp" / "desktop_sessions" + sessions_dir.mkdir(parents=True) + # Provide a dummy mykey_template so AgentManager.__init__ doesn't break. + (tmp_path / "mykey_template.py").write_text("", encoding="utf-8") + return tmp_path + + +@pytest.fixture +def manager(tmp_ga_root: Path): + """Create an AgentManager using the tmp root.""" + with patch.object(AgentManager, "__init__", lambda self: None): + mgr = AgentManager.__new__(AgentManager) + mgr.lock = threading.RLock() + mgr.ga_root = str(tmp_ga_root) + mgr.config = {} + mgr.sessions = {} + mgr._retired_sessions = {} + mgr._maintenance_token = None + mgr._maintenance_kind = None + mgr._shutdown_requested = False + mgr.active_session_id = None + mgr._sessions_dir = tmp_ga_root / "temp" / "desktop_sessions" + mgr._sessions_file = tmp_ga_root / "temp" / "desktop_sessions.json" + return mgr + + +def _make_session(sid: str = "sess-test-1", messages: list | None = None) -> Session: + return Session( + id=sid, + title="Test", + cwd="/tmp", + created_at=time.time(), + updated_at=time.time(), + messages=messages if messages is not None else [{"role": "user", "content": "hello"}], + msg_seq=1, + pinned=False, + untitled=False, + plan_scan_baseline=0, + plan_path="", + status="idle", + agent=None, + llm_history=[{"role": "user", "content": "hello"}], + llm_no=None, + ) + + +class TestPersistSessionConcurrentMutation: + """Verify that concurrent mutations to messages during _persist_session don't corrupt data.""" + + def test_concurrent_append_no_crash(self, manager: AgentManager): + """Appending messages from another thread during persist must not raise.""" + sess = _make_session(messages=[{"role": "user", "content": f"msg-{i}"} for i in range(50)]) + manager.sessions[sess.id] = sess + + errors = [] + stop = threading.Event() + + def mutator(): + i = 100 + while not stop.is_set(): + sess.messages.append({"role": "assistant", "content": f"resp-{i}"}) + i += 1 + time.sleep(0.001) + + t = threading.Thread(target=mutator, daemon=True) + t.start() + try: + for _ in range(20): + try: + manager._persist_session(sess) + except Exception as e: + errors.append(e) + time.sleep(0.005) + finally: + stop.set() + t.join(timeout=2) + + assert not errors, f"persist raised: {errors}" + # Verify the file is valid JSON. + f = manager._session_file(sess.id) + data = json.loads(f.read_text(encoding="utf-8")) + assert data["id"] == sess.id + assert isinstance(data["messages"], list) + + def test_concurrent_mutation_llm_history(self, manager: AgentManager): + """Mutating llm_history from another thread during persist must not corrupt.""" + sess = _make_session() + sess.llm_history = [{"role": "user", "content": "hi"}] + manager.sessions[sess.id] = sess + + stop = threading.Event() + + def mutator(): + i = 0 + while not stop.is_set(): + sess.llm_history.append({"role": "assistant", "content": f"turn-{i}"}) + i += 1 + time.sleep(0.001) + + t = threading.Thread(target=mutator, daemon=True) + t.start() + try: + for _ in range(15): + manager._persist_session(sess) + time.sleep(0.005) + finally: + stop.set() + t.join(timeout=2) + + f = manager._session_file(sess.id) + data = json.loads(f.read_text(encoding="utf-8")) + assert isinstance(data["llm_history"], list) + + +class TestTransactionalDataImport: + def test_import_commits_new_session_file_and_in_memory_object_together( + self, manager: AgentManager, tmp_path: Path, monkeypatch: pytest.MonkeyPatch + ): + source = tmp_path / "import-source" + (source / "memory").mkdir(parents=True) + (source / "memory" / "imported.md").write_text("new", encoding="utf-8") + sessions = source / "temp" / "desktop_sessions" + sessions.mkdir(parents=True) + sessions.joinpath("sess-imported.json").write_text( + json.dumps( + { + "id": "sess-imported", + "title": "Imported", + "messages": [], + "msg_seq": 0, + } + ), + encoding="utf-8", + ) + monkeypatch.setattr(_mod, "manager", manager) + monkeypatch.setattr(_mod.services, "running_managed_ids", lambda: []) + + result = _mod._import_data_source(str(source)) + + assert result["ok"] is True + assert result["sessionsAdded"] == 1 + assert "_preparedSessions" not in result + assert manager.sessions["sess-imported"].title == "Imported" + persisted = Path(manager.ga_root) / "temp" / "desktop_sessions" / "sess-imported.json" + assert json.loads(persisted.read_text(encoding="utf-8"))["id"] == "sess-imported" + assert (Path(manager.ga_root) / "memory" / "imported.md").read_text( + encoding="utf-8" + ) == "new" + + +class TestLoadSessionsCorruptFile: + """Verify that one corrupt file does not prevent loading others.""" + + def test_corrupt_file_skipped(self, manager: AgentManager): + """A corrupt JSON file should be skipped; valid sessions still load.""" + sessions_dir = manager._sessions_dir + # Write 2 valid sessions. + for i in range(2): + sid = f"sess-valid-{i}" + data = {"id": sid, "title": f"Valid {i}", "messages": [], "msg_seq": 0, + "cwd": "/tmp", "created_at": time.time(), "updated_at": time.time()} + (sessions_dir / f"{sid}.json").write_text(json.dumps(data), encoding="utf-8") + # Write 1 corrupt file. + (sessions_dir / "sess-corrupt.json").write_text("{invalid json !!!", encoding="utf-8") + + manager._load_sessions() + + assert len(manager.sessions) == 2 + assert "sess-valid-0" in manager.sessions + assert "sess-valid-1" in manager.sessions + assert "sess-corrupt" not in manager.sessions + + def test_empty_file_skipped(self, manager: AgentManager): + """An empty file should be skipped without crash.""" + sessions_dir = manager._sessions_dir + (sessions_dir / "sess-empty.json").write_text("", encoding="utf-8") + (sessions_dir / "sess-ok.json").write_text( + json.dumps({"id": "sess-ok", "title": "OK", "messages": [], "msg_seq": 0, + "cwd": "/tmp", "created_at": time.time(), "updated_at": time.time()}), + encoding="utf-8") + + manager._load_sessions() + assert "sess-ok" in manager.sessions + assert len(manager.sessions) == 1 + + def test_internal_tui_sessions_are_not_loaded(self, manager: AgentManager): + """Conductor/TUI worker artifacts must not enter the desktop session registry.""" + sessions_dir = manager._sessions_dir + for sid in ("sess-visible", "tui_worker_hidden"): + (sessions_dir / f"{sid}.json").write_text( + json.dumps({ + "id": sid, + "title": sid, + "messages": [], + "msg_seq": 0, + "cwd": "/tmp", + "created_at": time.time(), + "updated_at": time.time(), + }), + encoding="utf-8", + ) + + manager._load_sessions() + + assert set(manager.sessions) == {"sess-visible"} + + +class TestLoadSessionsMissingDir: + """Verify graceful handling when sessions directory does not exist.""" + + def test_missing_dir_returns_empty(self, tmp_ga_root: Path): + """If temp/desktop_sessions/ doesn't exist, load returns empty without crash.""" + import shutil + sessions_dir = tmp_ga_root / "temp" / "desktop_sessions" + shutil.rmtree(sessions_dir) + + with patch.object(AgentManager, "__init__", lambda self: None): + mgr = AgentManager.__new__(AgentManager) + mgr.lock = threading.RLock() + mgr.ga_root = str(tmp_ga_root) + mgr.config = {} + mgr.sessions = {} + mgr._retired_sessions = {} + mgr._maintenance_token = None + mgr._maintenance_kind = None + mgr.active_session_id = None + mgr._sessions_dir = sessions_dir + mgr._sessions_file = tmp_ga_root / "temp" / "desktop_sessions.json" + + mgr._load_sessions() + assert mgr.sessions == {} + + +class TestImportSessionsFiltersInternalArtifacts: + def test_import_skips_tui_sessions(self, manager: AgentManager, tmp_path: Path): + source = tmp_path / "source" + sessions_dir = source / "temp" / "desktop_sessions" + sessions_dir.mkdir(parents=True) + for sid in ("sess-imported", "tui_internal"): + (sessions_dir / f"{sid}.json").write_text( + json.dumps({ + "id": sid, + "title": sid, + "messages": [], + "msg_seq": 0, + "cwd": "/tmp", + "created_at": time.time(), + "updated_at": time.time(), + }), + encoding="utf-8", + ) + + result = manager.import_sessions(str(source)) + + assert set(manager.sessions) == {"sess-imported"} + assert result["sessionsAdded"] == 1 + assert result["sessionsSkipped"] == 1 + + def test_import_rejects_session_ids_that_could_escape_storage(self, manager: AgentManager, tmp_path: Path): + source = tmp_path / "source" + sessions_dir = source / "temp" / "desktop_sessions" + sessions_dir.mkdir(parents=True) + (sessions_dir / "malicious.json").write_text( + json.dumps({ + "id": "../../outside", + "title": "unsafe", + "messages": [], + "msg_seq": 0, + }), + encoding="utf-8", + ) + + result = manager.import_sessions(str(source)) + + assert result["sessionsAdded"] == 0 + assert result["sessionsSkipped"] == 1 + assert manager.sessions == {} + assert not (manager._sessions_dir.parent.parent / "outside.json").exists() + + +class TestPersistAtomicNoDataLoss: + """Verify that a failed write does not destroy the existing session file.""" + + def test_write_failure_preserves_original(self, manager: AgentManager): + """If write_text raises mid-write, the original .json file is untouched.""" + sess = _make_session(sid="sess-atomic-test", messages=[{"role": "user", "content": "original"}]) + manager.sessions[sess.id] = sess + # Persist once successfully. + manager._persist_session(sess) + original_content = manager._session_file(sess.id).read_text(encoding="utf-8") + + # Now make the session have new content and make tmp write fail. + sess.messages.append({"role": "assistant", "content": "new content"}) + with patch("pathlib.Path.write_text", side_effect=OSError("disk full")): + manager._persist_session(sess) + + # Original file should be untouched (os.replace never ran because tmp write failed). + current_content = manager._session_file(sess.id).read_text(encoding="utf-8") + assert current_content == original_content + + def test_replace_failure_preserves_original(self, manager: AgentManager): + """If os.replace raises, the original file is untouched.""" + sess = _make_session(sid="sess-replace-test", messages=[{"role": "user", "content": "original"}]) + manager.sessions[sess.id] = sess + manager._persist_session(sess) + original_content = manager._session_file(sess.id).read_text(encoding="utf-8") + + sess.messages.append({"role": "assistant", "content": "new"}) + with patch("os.replace", side_effect=OSError("permission denied")): + manager._persist_session(sess) + + current_content = manager._session_file(sess.id).read_text(encoding="utf-8") + assert current_content == original_content + + +class TestSessionContinuityAfterRestart: + """Verify that llm_history is injected when agent is recreated (simulates bridge restart).""" + + def test_stale_turn_cannot_mutate_a_reused_session(self, manager: AgentManager): + sess = _make_session(sid="sess-stale-turn", messages=[]) + sess.active_turn_id = "new-turn" + manager.sessions[sess.id] = sess + + with patch.object(manager, "make_agent") as make_agent: + manager.run_agent_turn(sess, "old work", turn_id="old-turn") + + make_agent.assert_not_called() + assert sess.status == "idle" + assert sess.messages == [] + + def test_run_agent_turn_injects_history(self, manager: AgentManager): + """After bridge restart (agent=None, llm_history populated), run_agent_turn + should inject persisted llm_history into the newly created agent.""" + history = [ + {"role": "user", "content": [{"type": "text", "text": "hello"}]}, + {"role": "assistant", "content": [{"type": "text", "text": "hi there"}]}, + {"role": "user", "content": [{"type": "text", "text": "what did I just say?"}]}, + ] + sess = _make_session(sid="sess-continuity-1", messages=[ + {"role": "user", "content": "hello"}, + {"role": "assistant", "content": "hi there"}, + ]) + sess.llm_history = history + sess.agent = None + manager.sessions[sess.id] = sess + + class FakeBackend: + def __init__(self): + self.history = [] + self.name = "test-backend" + + class FakeLLMClient: + def __init__(self): + self.backend = FakeBackend() + + class FakeAgent: + def __init__(self): + self.llmclient = FakeLLMClient() + self.llm_no = 0 + self.inc_out = True + self.verbose = True + + def next_llm(self, n): + self.llm_no = n + + fake_agent = FakeAgent() + with patch.object(manager, "make_agent", return_value=fake_agent): + if sess.agent is None: + sess.agent = manager.make_agent(sess) + if sess.llm_history: + try: + sess.agent.llmclient.backend.history = sess.llm_history + except Exception: + pass + + assert sess.agent.llmclient.backend.history == history + assert len(sess.agent.llmclient.backend.history) == 3 + + def test_no_history_no_crash(self, manager: AgentManager): + """New session with no llm_history should not crash on agent creation.""" + sess = _make_session(sid="sess-continuity-2") + sess.llm_history = None + sess.agent = None + manager.sessions[sess.id] = sess + + class FakeBackend: + def __init__(self): + self.history = [] + self.name = "test" + + class FakeLLMClient: + def __init__(self): + self.backend = FakeBackend() + + class FakeAgent: + def __init__(self): + self.llmclient = FakeLLMClient() + self.llm_no = 0 + + def next_llm(self, n): + self.llm_no = n + + fake_agent = FakeAgent() + with patch.object(manager, "make_agent", return_value=fake_agent): + if sess.agent is None: + sess.agent = manager.make_agent(sess) + if sess.llm_history: + try: + sess.agent.llmclient.backend.history = sess.llm_history + except Exception: + pass + + assert sess.agent.llmclient.backend.history == [] + + def test_empty_history_list_no_inject(self, manager: AgentManager): + """Empty llm_history list should not overwrite agent's default state.""" + sess = _make_session(sid="sess-continuity-3") + sess.llm_history = [] + sess.agent = None + manager.sessions[sess.id] = sess + + class FakeBackend: + def __init__(self): + self.history = [{"role": "system", "content": "default"}] + self.name = "test" + + class FakeLLMClient: + def __init__(self): + self.backend = FakeBackend() + + class FakeAgent: + def __init__(self): + self.llmclient = FakeLLMClient() + self.llm_no = 0 + + def next_llm(self, n): + self.llm_no = n + + fake_agent = FakeAgent() + with patch.object(manager, "make_agent", return_value=fake_agent): + if sess.agent is None: + sess.agent = manager.make_agent(sess) + if sess.llm_history: + try: + sess.agent.llmclient.backend.history = sess.llm_history + except Exception: + pass + + assert sess.agent.llmclient.backend.history == [{"role": "system", "content": "default"}] + + def test_model_preserved_after_restart(self, manager: AgentManager): + """sess.llm_no should be applied to recreated agent via next_llm.""" + sess = _make_session(sid="sess-continuity-4") + sess.llm_no = 3 + sess.llm_history = [{"role": "user", "content": [{"type": "text", "text": "test"}]}] + sess.agent = None + manager.sessions[sess.id] = sess + + class FakeBackend: + def __init__(self): + self.history = [] + self.name = "test" + + class FakeLLMClient: + def __init__(self): + self.backend = FakeBackend() + + class FakeAgent: + def __init__(self): + self.llmclient = FakeLLMClient() + self.llm_no = 0 + self.next_llm_calls = [] + + def next_llm(self, n): + self.llm_no = n + self.next_llm_calls.append(n) + + fake_agent = FakeAgent() + with patch.object(manager, "make_agent", return_value=fake_agent): + if sess.agent is None: + sess.agent = manager.make_agent(sess) + if sess.llm_history: + try: + sess.agent.llmclient.backend.history = sess.llm_history + except Exception: + pass + agent = sess.agent + no = sess.llm_no + if no is not None and hasattr(agent, "next_llm"): + agent.next_llm(int(no)) + + assert fake_agent.llm_no == 3 + assert fake_agent.next_llm_calls == [3] + assert fake_agent.llmclient.backend.history == sess.llm_history + + def test_persist_and_reload_preserves_llm_no(self, manager: AgentManager): + """Full cycle: persist session with llm_no, reload, verify llm_no survives.""" + sess = _make_session(sid="sess-roundtrip") + sess.llm_no = 5 + sess.llm_history = [{"role": "user", "content": [{"type": "text", "text": "hi"}]}] + manager.sessions[sess.id] = sess + manager._persist_session(sess) + + manager.sessions = {} + manager._load_sessions() + + reloaded = manager.sessions.get("sess-roundtrip") + assert reloaded is not None + assert reloaded.llm_no == 5 + assert reloaded.llm_history == [{"role": "user", "content": [{"type": "text", "text": "hi"}]}] + assert reloaded.agent is None + + +class TestDeferredSessionModelSwitch: + class FakeBackend: + name = "model-a" + history = [] + + class FakeClient: + backend = None + + def __init__(self): + self.backend = TestDeferredSessionModelSwitch.FakeBackend() + + class FakeAgent: + def __init__(self): + self.llm_no = 0 + self.llmclient = TestDeferredSessionModelSwitch.FakeClient() + self.next_llm_calls: list[int] = [] + + def next_llm(self, no: int): + self.next_llm_calls.append(no) + self.llm_no = no + self.llmclient.backend.name = f"model-{no}" + + def test_running_turn_keeps_current_client_and_defers_new_binding(self, manager: AgentManager): + sess = _make_session("sess-running-switch") + sess.status = "running" + sess.llm_no = 0 + sess.running_llm_no = 0 + sess.running_model = "model-a" + sess.agent = self.FakeAgent() + manager.sessions[sess.id] = sess + + result = manager.set_session_model(sess.id, 2) + + assert sess.llm_no == 2 + assert sess.agent.next_llm_calls == [] + assert result["model"]["llmNo"] == 2 + assert result["model"]["runningLlmNo"] == 0 + assert result["model"]["runningModel"] == "model-a" + + def test_idle_session_switches_live_client_immediately(self, manager: AgentManager): + sess = _make_session("sess-idle-switch") + sess.status = "idle" + sess.llm_no = 0 + sess.agent = self.FakeAgent() + manager.sessions[sess.id] = sess + + manager.set_session_model(sess.id, 2) + + assert sess.agent.next_llm_calls == [2] + + def test_turn_captures_and_clears_running_model(self, manager: AgentManager): + import queue + + sess = _make_session("sess-running-snapshot") + sess.llm_no = 2 + fake_agent = self.FakeAgent() + observed: list[tuple[int | None, str | None]] = [] + + def put_task(_prompt, images=None): + observed.append((sess.running_llm_no, sess.running_model)) + q = queue.Queue() + q.put({"done": "ok", "outputs": ["ok"]}) + return q + + fake_agent.put_task = put_task + fake_agent.inc_out = True + sess.agent = fake_agent + manager.sessions[sess.id] = sess + plan_state = sys.modules["plan_state"] + with patch.object(plan_state, "sync_plan_path_from_text", lambda *args: None, create=True): + manager.run_agent_turn(sess, "hello") + + assert observed == [(2, "model-2")] + assert sess.running_llm_no is None + assert sess.running_model is None + assert sess.status == "idle" + + def test_concurrent_sessions_keep_independent_next_model_bindings(self, manager: AgentManager): + sessions = [] + for i in range(10): + sess = _make_session(f"sess-concurrent-{i}") + sess.status = "running" + sess.llm_no = 0 + sess.agent = self.FakeAgent() + manager.sessions[sess.id] = sess + sessions.append(sess) + + threads = [ + threading.Thread(target=manager.set_session_model, args=(sess.id, i + 1)) + for i, sess in enumerate(sessions) + ] + for thread in threads: + thread.start() + for thread in threads: + thread.join(timeout=2) + + assert [sess.llm_no for sess in sessions] == list(range(1, 11)) + assert all(sess.agent.next_llm_calls == [] for sess in sessions) + + +class TestConductorModelConfigResolution: + def test_configured_model_wins(self): + state = _mod._resolve_conductor_model_state( + {"conductor": {"llmNo": 2}, "ui": {"llmNo": 1}}, + profile_count=4, + ) + assert state == {"configured": 2, "effective": 2, "fallbackReason": None} + + def test_missing_config_uses_ui_default(self): + state = _mod._resolve_conductor_model_state( + {"ui": {"llmNo": 1}}, + profile_count=4, + ) + assert state == {"configured": None, "effective": 1, "fallbackReason": "ui_default"} + + def test_out_of_range_config_never_wraps(self): + state = _mod._resolve_conductor_model_state( + {"conductor": {"llmNo": 99}, "ui": {"llmNo": 1}}, + profile_count=4, + ) + assert state == {"configured": 99, "effective": 1, "fallbackReason": "invalid_configured"} + + def test_no_valid_config_falls_back_to_first_profile(self): + state = _mod._resolve_conductor_model_state( + {"conductor": {"llmNo": "bad"}, "ui": {"llmNo": 99}}, + profile_count=4, + ) + assert state == {"configured": None, "effective": 0, "fallbackReason": "first_available"} + + def test_no_profiles_has_no_effective_model(self): + state = _mod._resolve_conductor_model_state({}, profile_count=0) + assert state == {"configured": None, "effective": None, "fallbackReason": "no_models"} + + +class TestConductorModelHandlers: + class Request: + def __init__(self, body: dict): + self._body = body + self.can_read_body = True + + async def json(self): + return self._body + + def test_post_rejects_out_of_range_without_writing(self, manager: AgentManager, tmp_path: Path): + import asyncio + + settings = tmp_path / "settings.json" + settings.write_text(json.dumps({"ui": {"llmNo": 1}}), encoding="utf-8") + manager.list_model_profiles = lambda: [{"id": i} for i in range(4)] + with patch.object(_mod, "manager", manager), patch.object(_mod, "_SETTINGS", settings): + response = asyncio.run(_mod.conductor_model_save_handler(self.Request({"llmNo": 99}))) + + assert response.status == 400 + assert json.loads(response.text)["error"] == "model_out_of_range" + assert json.loads(settings.read_text(encoding="utf-8")) == {"ui": {"llmNo": 1}} + + +class TestMaintenanceGate: + class FakeQueue: + def __init__(self, unfinished: int): + self.unfinished_tasks = unfinished + + class FakeAgent: + def __init__(self, unfinished: int = 0, *, running: bool = False): + self.task_queue = TestMaintenanceGate.FakeQueue(unfinished) + self.is_running = running + self.abort_calls = 0 + + def abort(self): + self.abort_calls += 1 + + def test_rejects_running_sessions_and_managed_extras(self, manager: AgentManager): + active = _make_session("sess-active") + active.status = "running" + manager.sessions[active.id] = active + + with pytest.raises(MaintenanceConflict) as raised: + manager.begin_maintenance("import", lambda: ["reflect/scheduler.py"]) + + assert raised.value.running_sessions == ["sess-active"] + assert raised.value.running_extras == ["reflect/scheduler.py"] + assert manager._maintenance_token is None + + def test_cancelled_but_unfinished_queue_still_blocks(self, manager: AgentManager): + queued = _make_session("sess-queued") + queued.status = "cancelled" + queued.agent = self.FakeAgent(unfinished=1) + manager.sessions[queued.id] = queued + + with pytest.raises(MaintenanceConflict) as raised: + manager.begin_maintenance("import", lambda: []) + + assert raised.value.running_sessions == ["sess-queued"] + + def test_messages_reports_idle_live_thread_as_unfinished_until_joined( + self, manager: AgentManager, monkeypatch: pytest.MonkeyPatch + ): + release = threading.Event() + worker = threading.Thread(target=release.wait) + session = _make_session("sess-idle-live-thread") + session.thread = worker + manager.sessions[session.id] = session + monkeypatch.setattr( + _plan_state_stub, + "desktop_plan_payload_from_session", + lambda *_args, **_kwargs: {}, + raising=False, + ) + + worker.start() + try: + snapshot = manager.messages(session.id) + assert snapshot["status"] == "idle" + assert snapshot["hasUnfinishedWork"] is True + finally: + release.set() + worker.join(timeout=2) + + assert worker.is_alive() is False + assert manager.messages(session.id)["hasUnfinishedWork"] is False + + def test_deleted_running_session_remains_registered_until_done( + self, manager: AgentManager, monkeypatch: pytest.MonkeyPatch + ): + queued = _make_session("sess-retired") + queued.status = "cancelled" + queued.agent = self.FakeAgent(unfinished=1) + manager.sessions[queued.id] = queued + monkeypatch.setattr(_mod, "_purge_session_uploads", lambda _sid: None) + + manager.delete_session(queued.id) + assert queued.cancel_requested is True + assert queued.active_turn_id == "" + assert queued.status == "cancelled" + with pytest.raises(MaintenanceConflict) as raised: + manager.begin_maintenance("export", lambda: []) + assert raised.value.running_sessions == ["sess-retired"] + + queued.agent.task_queue.unfinished_tasks = 0 + token = manager.begin_maintenance("export", lambda: []) + assert manager._retired_sessions == {} + manager.end_maintenance(token) + + def test_gate_rejects_prompt_and_service_start( + self, manager: AgentManager, monkeypatch: pytest.MonkeyPatch + ): + session = _make_session("sess-blocked") + manager.sessions[session.id] = session + monkeypatch.setattr(_mod, "manager", manager) + token = manager.begin_maintenance("import", lambda: []) + try: + with pytest.raises(MaintenanceConflict): + manager.submit_prompt(session.id, "blocked") + with pytest.raises(MaintenanceConflict): + _mod.services.start_service("missing-service") + finally: + manager.end_maintenance(token) + + def test_gate_rejects_cancel_without_mutating_session_or_disk( + self, manager: AgentManager + ): + session = _make_session("sess-cancel-blocked") + session.partial = {"content": "unfinished"} + manager.sessions[session.id] = session + manager._persist_session(session, strict=True) + session_path = manager._session_file(session.id) + before_bytes = session_path.read_bytes() + before_messages = copy.deepcopy(session.messages) + token = manager.begin_maintenance("import", lambda: []) + try: + with pytest.raises(MaintenanceConflict): + manager.cancel(session.id) + finally: + manager.end_maintenance(token) + + assert session.cancel_requested is False + assert session.status == "idle" + assert session.partial == {"content": "unfinished"} + assert session.messages == before_messages + assert session_path.read_bytes() == before_bytes + + def test_accepted_exit_irreversibly_blocks_new_mutation_and_maintenance( + self, manager: AgentManager, monkeypatch: pytest.MonkeyPatch + ): + import asyncio + + class Request: + remote = "127.0.0.1" + + exit_calls: list[bool] = [] + session = _make_session("sess-before-exit") + manager.sessions[session.id] = session + manager._persist_session(session, strict=True) + session_path = manager._session_file(session.id) + before_bytes = session_path.read_bytes() + monkeypatch.setattr(_mod, "manager", manager) + monkeypatch.setattr(_mod, "_exit_bridge", lambda: exit_calls.append(True)) + + response = asyncio.run(_mod.bridge_exit_handler(Request())) + + assert response.status == 200 + assert exit_calls == [True] + assert manager._shutdown_requested is True + with pytest.raises(MaintenanceConflict) as maintenance_error: + manager.begin_maintenance("import", lambda: []) + assert maintenance_error.value.code == "shutdown_in_progress" + with pytest.raises(MaintenanceConflict) as mutation_error: + with manager.mutation(): + session.title = "must not happen" + manager._persist_session(session, strict=True) + assert mutation_error.value.code == "shutdown_in_progress" + assert session.title == "Test" + assert session_path.read_bytes() == before_bytes + + def test_active_maintenance_refuses_exit_with_409_and_keeps_bridge_alive( + self, manager: AgentManager, monkeypatch: pytest.MonkeyPatch + ): + import asyncio + + class Request: + remote = "127.0.0.1" + headers: dict[str, str] = {} + method = "POST" + + exit_calls: list[bool] = [] + monkeypatch.setattr(_mod, "manager", manager) + monkeypatch.setattr(_mod, "_exit_bridge", lambda: exit_calls.append(True)) + token = manager.begin_maintenance("import", lambda: []) + try: + response = asyncio.run( + _mod.cors_middleware(Request(), _mod.bridge_exit_handler) + ) + finally: + manager.end_maintenance(token) + + assert response.status == 409 + assert json.loads(response.text)["code"] == "maintenance_conflict" + assert exit_calls == [] + assert manager._shutdown_requested is False + + def test_import_failure_releases_gate( + self, manager: AgentManager, tmp_path: Path, monkeypatch: pytest.MonkeyPatch + ): + source = tmp_path / "source" + (source / "memory").mkdir(parents=True) + (source / "memory" / "one.md").write_text("one", encoding="utf-8") + monkeypatch.setattr(_mod, "manager", manager) + monkeypatch.setattr(_mod.services, "running_managed_ids", lambda: []) + monkeypatch.setattr( + _mod, "merge_data_files", lambda *_args, **_kwargs: (_ for _ in ()).throw(OSError("merge failed")) + ) + + with pytest.raises(OSError, match="merge failed"): + _mod._import_data_source(str(source)) + + assert manager._maintenance_token is None + token = manager.begin_maintenance("export", lambda: []) + manager.end_maintenance(token) + + def test_export_flush_failure_preserves_existing_destination( + self, manager: AgentManager, tmp_path: Path, monkeypatch: pytest.MonkeyPatch + ): + root = Path(manager.ga_root) + (root / "memory").mkdir() + (root / "memory" / "one.md").write_text("one", encoding="utf-8") + session = _make_session("sess-flush-failure") + manager.sessions[session.id] = session + destination = tmp_path / "backup.zip" + destination.write_bytes(b"old backup") + monkeypatch.setattr(_mod, "manager", manager) + monkeypatch.setattr(_mod.services, "running_managed_ids", lambda: []) + monkeypatch.setattr( + manager, + "_persist_session", + lambda *_args, **_kwargs: (_ for _ in ()).throw(OSError("disk full")), + ) + + with pytest.raises(OSError, match="disk full"): + _mod._export_data_source(str(destination), "included") + + assert destination.read_bytes() == b"old backup" + assert manager._maintenance_token is None + + def test_cancelled_http_task_waits_for_worker_owned_gate( + self, manager: AgentManager, monkeypatch: pytest.MonkeyPatch + ): + import asyncio + + started = threading.Event() + release = threading.Event() + monkeypatch.setattr(_mod, "manager", manager) + + def worker(): + token = manager.begin_maintenance("import", lambda: []) + started.set() + try: + assert release.wait(timeout=5) + finally: + manager.end_maintenance(token) + + async def scenario(): + task = asyncio.create_task(_mod._run_worker_to_completion(worker)) + assert await asyncio.to_thread(started.wait, 2) + task.cancel() + await asyncio.sleep(0.02) + assert manager._maintenance_token is not None + release.set() + with pytest.raises(asyncio.CancelledError): + await task + assert manager._maintenance_token is None + + asyncio.run(scenario()) + + def test_service_start_race_cannot_pass_maintenance_admission( + self, manager: AgentManager, tmp_path: Path, monkeypatch: pytest.MonkeyPatch + ): + class FakeProcess: + pid = 43210 + stdout = () + returncode = None + + def poll(self): + return None + + service_manager = ServiceManager.__new__(ServiceManager) + service_manager.lock = threading.RLock() + service_manager.ga_root = tmp_path + service_manager.procs = {} + service_manager.buffers = {} + service_manager._emit = lambda _event: None + service_manager._im_catalog = {} + service_manager._catalog = {"worker": {"id": "worker", "cmd": ["worker"], "port": None}} + service_manager._stopping = set() + entered_start = threading.Event() + release_start = threading.Event() + start_result: list[dict] = [] + admission_result: list[object] = [] + + monkeypatch.setattr(_mod, "manager", manager) + monkeypatch.setattr(_mod.subprocess, "Popen", lambda *_args, **_kwargs: FakeProcess()) + monkeypatch.setattr(service_manager, "_is_configured", lambda _sid: True) + + def wait_started(_proc): + entered_start.set() + assert release_start.wait(timeout=5) + + monkeypatch.setattr(service_manager, "_wait_started", wait_started) + + start_thread = threading.Thread( + target=lambda: start_result.append(service_manager.start_service("worker")) + ) + + def admit(): + try: + admission_result.append( + manager.begin_maintenance("import", service_manager.running_managed_ids) + ) + except Exception as error: + admission_result.append(error) + + start_thread.start() + assert entered_start.wait(timeout=2) + admission_thread = threading.Thread(target=admit) + admission_thread.start() + time.sleep(0.03) + assert admission_result == [] + release_start.set() + start_thread.join(timeout=2) + admission_thread.join(timeout=2) + + assert start_result[0]["ok"] is True + assert start_result[0]["service"]["managed"] is True + assert isinstance(admission_result[0], MaintenanceConflict) + assert admission_result[0].running_extras == ["worker"] + + def test_managed_service_state_keeps_ui_maintenance_metadata( + self, tmp_path: Path, monkeypatch: pytest.MonkeyPatch + ): + service_manager = ServiceManager.__new__(ServiceManager) + service_manager.lock = threading.RLock() + service_manager.ga_root = tmp_path + service_manager.procs = {} + service_manager.buffers = {} + service_manager._im_catalog = {} + service_manager._catalog = { + "reflect/scheduler.py": { + "id": "reflect/scheduler.py", + "port": None, + } + } + service_manager._stopping = set() + monkeypatch.setattr(_mod, "_port_alive", lambda _port: False) + + state = service_manager.list_panel_state()[1] + + assert state["id"] == "reflect/scheduler.py" + assert state["name"] == "reflect/scheduler.py" + assert state["managed"] is True + assert state["running"] is False + assert "memMb" in state + assert "cpuPct" in state + + +class TestManagedServiceOwnership: + @staticmethod + def service_manager(tmp_path: Path, port: int = 8900) -> ServiceManager: + service_manager = ServiceManager.__new__(ServiceManager) + service_manager.lock = threading.RLock() + service_manager.ga_root = tmp_path + service_manager.procs = {} + service_manager.buffers = {} + service_manager._emit = lambda _event: None + service_manager._im_catalog = {} + service_manager._catalog = { + "frontends/conductor.py": { + "id": "frontends/conductor.py", + "cmd": ["python", "conductor.py", "--no-browser", "--port", str(port)], + "port": port, + } + } + service_manager._stopping = set() + return service_manager + + def test_foreign_listener_is_external_not_owned_or_running( + self, tmp_path: Path, monkeypatch: pytest.MonkeyPatch + ): + service_manager = self.service_manager(tmp_path) + monkeypatch.setattr(_mod, "_port_alive", lambda port: port == 8900) + + state = service_manager.list_panel_state()[1] + + assert state == { + **state, + "id": "frontends/conductor.py", + "status": "error", + "running": False, + "owned": False, + "external": True, + "portConflict": True, + "port": 8900, + "pid": None, + "errorKey": "err.portBusy", + } + assert service_manager.running_managed_ids() == [] + + def test_foreign_listener_prevents_spawn_and_stop_never_touches_it( + self, + manager: AgentManager, + tmp_path: Path, + monkeypatch: pytest.MonkeyPatch, + ): + service_manager = self.service_manager(tmp_path) + spawn_calls: list[object] = [] + monkeypatch.setattr(_mod, "manager", manager) + monkeypatch.setattr(_mod, "_port_alive", lambda port: port == 8900) + monkeypatch.setattr(service_manager, "_is_configured", lambda _sid: True) + monkeypatch.setattr( + _mod.subprocess, + "Popen", + lambda *_args, **_kwargs: spawn_calls.append(object()), + ) + + started = service_manager.start_service("frontends/conductor.py") + stopped = service_manager.stop_service("frontends/conductor.py") + + assert started["ok"] is False + assert started["error"] == "port_conflict" + assert started["service"]["status"] == "error" + assert stopped["ok"] is False + assert stopped["error"] == "not_owned" + assert stopped["service"]["status"] == "error" + assert spawn_calls == [] + assert service_manager.procs == {} + + def test_dead_owned_child_with_foreign_port_is_port_conflict( + self, tmp_path: Path, monkeypatch: pytest.MonkeyPatch + ): + class DeadProcess: + pid = 41001 + returncode = 1 + + @staticmethod + def poll(): + return 1 + + service_manager = self.service_manager(tmp_path) + service_manager.procs["frontends/conductor.py"] = DeadProcess() + monkeypatch.setattr(_mod, "_port_alive", lambda _port: True) + + state = service_manager.list_panel_state()[1] + + assert state["status"] == "error" + assert state["running"] is False + assert state["owned"] is False + assert state["external"] is True + assert state["pid"] is None + assert service_manager.running_managed_ids() == [] + + def test_stop_terminates_only_the_tracked_owned_process_with_a_bound( + self, tmp_path: Path, monkeypatch: pytest.MonkeyPatch + ): + class OwnedProcess: + pid = 41002 + returncode = None + terminate_calls = 0 + kill_calls = 0 + waits: list[float | None] = [] + + def poll(self): + return self.returncode + + def terminate(self): + self.terminate_calls += 1 + + def wait(self, timeout=None): + self.waits.append(timeout) + if len(self.waits) == 1: + raise _mod.subprocess.TimeoutExpired("conductor", timeout) + self.returncode = -9 + return self.returncode + + def kill(self): + self.kill_calls += 1 + + service_manager = self.service_manager(tmp_path, 29890) + owned = OwnedProcess() + service_manager.procs["frontends/conductor.py"] = owned + monkeypatch.setattr( + _mod, + "_port_alive", + lambda _port: owned.poll() is None, + ) + + before = service_manager.list_panel_state()[1] + result = service_manager.stop_service("frontends/conductor.py") + + assert before["status"] == "running" + assert before["running"] is True + assert before["owned"] is True + assert before["external"] is False + assert before["pid"] == owned.pid + assert result["ok"] is True + assert result["service"]["status"] == "offline" + assert owned.terminate_calls == 1 + assert owned.kill_calls == 1 + assert owned.waits == [5.0, 2.0] + assert service_manager.procs == {} + + def test_real_foreign_socket_survives_panel_start_and_stop( + self, + manager: AgentManager, + tmp_path: Path, + monkeypatch: pytest.MonkeyPatch, + ): + with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as foreign: + foreign.bind(("127.0.0.1", 0)) + foreign.listen() + port = int(foreign.getsockname()[1]) + service_manager = self.service_manager(tmp_path, port) + monkeypatch.setattr(_mod, "manager", manager) + monkeypatch.setattr(service_manager, "_is_configured", lambda _sid: True) + monkeypatch.setattr( + _mod.subprocess, + "Popen", + lambda *_args, **_kwargs: pytest.fail("foreign listener must prevent spawn"), + ) + + assert service_manager.list_panel_state()[1]["status"] == "error" + assert service_manager.start_service("frontends/conductor.py")["error"] == "port_conflict" + stopped = service_manager.stop_service("frontends/conductor.py") + assert stopped["ok"] is False + assert stopped["error"] == "not_owned" + assert stopped["service"]["status"] == "error" + assert foreign.getsockname()[1] == port + + +class TestConductorPortIsolation: + def test_production_ignores_e2e_port_without_report_marker( + self, monkeypatch: pytest.MonkeyPatch + ): + monkeypatch.delenv(_mod.E2E_REPORT_DIR_ENV, raising=False) + monkeypatch.setenv(_mod.E2E_CONDUCTOR_PORT_ENV, "29890") + assert _mod._configured_conductor_port() == 8900 + + def test_e2e_catalog_and_explicit_child_argv_share_the_validated_port( + self, tmp_path: Path, monkeypatch: pytest.MonkeyPatch + ): + monkeypatch.setenv(_mod.E2E_REPORT_DIR_ENV, str(tmp_path / "report")) + monkeypatch.setenv(_mod.E2E_CONDUCTOR_PORT_ENV, "29890") + + services = _mod.discover_extra_services(tmp_path) + conductor = next(item for item in services if item["id"] == "frontends/conductor.py") + + assert conductor["port"] == 29890 + assert conductor["cmd"][-2:] == ["--port", "29890"] + + @pytest.mark.parametrize("value", ["", "0", "65536", "2.5", "-1", "1234"]) + def test_invalid_e2e_conductor_port_fails_closed( + self, tmp_path: Path, monkeypatch: pytest.MonkeyPatch, value: str + ): + monkeypatch.setenv(_mod.E2E_REPORT_DIR_ENV, str(tmp_path / "report")) + monkeypatch.setenv(_mod.E2E_CONDUCTOR_PORT_ENV, value) + with pytest.raises(RuntimeError, match="between 1 and 65535"): + _mod._configured_conductor_port() + + +class TestCanonicalSessionRestart: + def test_invalid_imported_records_are_skipped_and_valid_record_reloads( + self, manager: AgentManager + ): + records = { + "int-id.json": {"id": 9, "messages": [], "msg_seq": 0}, + "nan.json": { + "id": "sess-nan", + "messages": [], + "msg_seq": 0, + "updated_at": float("nan"), + }, + "bad-list.json": { + "id": "sess-bad-list", + "messages": ["bad"], + "msg_seq": 0, + }, + "valid.json": { + "id": "sess-canonical", + "title": "Canonical", + "messages": [{"role": "user", "content": "hi"}], + "msg_seq": 1, + "created_at": 10, + "updated_at": 11, + "unknown": "ignored", + }, + } + for name, record in records.items(): + (manager._sessions_dir / name).write_text(json.dumps(record), encoding="utf-8") + + manager._load_sessions() + + assert set(manager.sessions) == {"sess-canonical"} + assert manager.active_session_id == "sess-canonical" + assert manager.sessions["sess-canonical"].updated_at == 11 + + +class TestBridgeSettingsWrites: + class Request: + can_read_body = True + + def __init__(self, body: dict): + self.body = body + + async def json(self): + return self.body + + def test_ui_save_preserves_sibling_keys_with_atomic_update( + self, manager: AgentManager, tmp_path: Path + ): + import asyncio + + settings = tmp_path / "settings.json" + settings.write_text( + json.dumps({ + "ga_source_override": "/external/source", + "conductor": {"llmNo": 3}, + "unknown": {"keep": True}, + }), + encoding="utf-8", + ) + with patch.object(_mod, "manager", manager), patch.object(_mod, "_SETTINGS", settings): + response = asyncio.run( + _mod.save_config_handler(self.Request({"config": {"lang": "en"}})) + ) + + assert response.status == 200 + assert json.loads(settings.read_text(encoding="utf-8")) == { + "ga_source_override": "/external/source", + "conductor": {"llmNo": 3}, + "unknown": {"keep": True}, + "ui": {"lang": "en"}, + } + + def test_ui_save_failure_returns_500_and_does_not_claim_success( + self, manager: AgentManager, tmp_path: Path, monkeypatch: pytest.MonkeyPatch + ): + import asyncio + + settings = tmp_path / "settings.json" + original = '{"unknown":{"keep":true}}' + settings.write_text(original, encoding="utf-8") + monkeypatch.setattr( + _mod, + "_update_settings_doc", + lambda _mutate: (_ for _ in ()).throw( + _mod.DesktopSettingsError("atomic replace failed") + ), + ) + with patch.object(_mod, "manager", manager), patch.object(_mod, "_SETTINGS", settings): + response = asyncio.run( + _mod.save_config_handler(self.Request({"config": {"lang": "en"}})) + ) + + assert response.status == 500 + assert json.loads(response.text)["error"] == "atomic replace failed" + assert settings.read_text(encoding="utf-8") == original + assert manager.config == {} diff --git a/frontends/tests/test_bridge_submit.py b/frontends/tests/test_bridge_submit.py new file mode 100644 index 000000000..630c06b10 --- /dev/null +++ b/frontends/tests/test_bridge_submit.py @@ -0,0 +1,261 @@ +"""Unit tests for desktop_bridge.py submit_prompt path-prepend logic and add_message. + +Tests the core file-attachment contract: files_meta → agent_prompt path prepend. +Run: pytest frontends/tests/test_bridge_submit.py -v +""" +import json + + +class TestPathPrepend: + """Test the agent_prompt construction logic from submit_prompt.""" + + @staticmethod + def _build_agent_prompt(prompt: str, files_meta: list | None) -> str: + """Replicate the path prepend logic from desktop_bridge.py submit_prompt.""" + agent_prompt = prompt + if files_meta: + paths = [f["path"] for f in files_meta if f.get("path")] + if paths: + agent_prompt = " ".join(paths) + "\n" + prompt + return agent_prompt + + def test_single_file_prepend(self): + prompt = "Analyze this file" + files = [{"name": "data.csv", "path": "/tmp/uploads/data.csv", "size": 1024}] + result = self._build_agent_prompt(prompt, files) + assert result == "/tmp/uploads/data.csv\nAnalyze this file" + + def test_multiple_files_prepend(self): + prompt = "Compare these" + files = [ + {"name": "a.py", "path": "/tmp/a.py", "size": 100}, + {"name": "b.py", "path": "/tmp/b.py", "size": 200}, + {"name": "c.py", "path": "/tmp/c.py", "size": 300}, + ] + result = self._build_agent_prompt(prompt, files) + assert result == "/tmp/a.py /tmp/b.py /tmp/c.py\nCompare these" + + def test_no_files_meta_unchanged(self): + prompt = "Just a question" + assert self._build_agent_prompt(prompt, None) == prompt + assert self._build_agent_prompt(prompt, []) == prompt + + def test_files_without_path_skipped(self): + prompt = "Check files" + files = [ + {"name": "good.txt", "path": "/tmp/good.txt"}, + {"name": "bad.txt"}, # no path + {"name": "empty.txt", "path": ""}, # empty path + ] + result = self._build_agent_prompt(prompt, files) + assert result == "/tmp/good.txt\nCheck files" + + def test_path_with_spaces(self): + prompt = "Read it" + files = [{"name": "my report.txt", "path": "/tmp/desktop_uploads/my report.txt"}] + result = self._build_agent_prompt(prompt, files) + assert "/tmp/desktop_uploads/my report.txt" in result + + def test_path_with_cjk(self): + prompt = "分析这个" + files = [{"name": "报告.csv", "path": "/tmp/desktop_uploads/报告.csv"}] + result = self._build_agent_prompt(prompt, files) + assert result.startswith("/tmp/desktop_uploads/报告.csv\n") + + def test_empty_prompt_with_files(self): + prompt = "" + files = [{"name": "f.txt", "path": "/tmp/f.txt"}] + result = self._build_agent_prompt(prompt, files) + assert result == "/tmp/f.txt\n" + + +class TestAddMessageExtra: + """Test that add_message stores extra fields correctly.""" + + @staticmethod + def _simulate_add_message(role: str, content: str, **extra) -> dict: + """Replicate add_message logic from AgentManager.""" + msg = { + "id": 1, + "role": role, + "content": content, + "ts": 1000.0, + } + msg.update(extra) + return msg + + def test_files_stored_in_message(self): + files_meta = [{"name": "x.py", "path": "/tmp/x.py", "size": 512}] + msg = self._simulate_add_message("user", "hello", files=files_meta) + assert msg["files"] == files_meta + + def test_images_stored_in_message(self): + image_metas = [{"name": "pic.png", "path": "/tmp/pic.png"}] + msg = self._simulate_add_message("user", "see this", images=image_metas) + assert msg["images"] == image_metas + + def test_display_stored_separately(self): + msg = self._simulate_add_message("user", "full prompt with paths", display="clean display text") + assert msg["display"] == "clean display text" + assert msg["content"] == "full prompt with paths" + + def test_no_extra_fields_minimal(self): + msg = self._simulate_add_message("assistant", "response") + assert "files" not in msg + assert "images" not in msg + assert "display" not in msg + + def test_combined_files_and_images(self): + msg = self._simulate_add_message( + "user", "both", + files=[{"name": "f.txt", "path": "/tmp/f.txt"}], + images=[{"name": "i.png", "path": "/tmp/i.png"}], + ) + assert len(msg["files"]) == 1 + assert len(msg["images"]) == 1 + + +class TestImagePathExtraction: + """Test image_paths extraction from image_metas (used for _patch_chat_for_images).""" + + def test_extracts_paths(self): + image_metas = [ + {"name": "a.png", "path": "/tmp/a.png"}, + {"name": "b.jpg", "path": "/tmp/b.jpg"}, + ] + image_paths = [m["path"] for m in (image_metas or []) if m.get("path")] + assert image_paths == ["/tmp/a.png", "/tmp/b.jpg"] + + def test_none_metas(self): + image_metas = None + image_paths = [m["path"] for m in (image_metas or []) if m.get("path")] + assert image_paths == [] + + def test_skips_entries_without_path(self): + image_metas = [ + {"name": "a.png", "path": "/tmp/a.png"}, + {"name": "broken.png"}, + ] + image_paths = [m["path"] for m in (image_metas or []) if m.get("path")] + assert image_paths == ["/tmp/a.png"] + + +class TestSessionFiltering: + """Test the tui_ prefix filter for conductor sessions.""" + + def test_filters_tui_prefix(self): + sessions = [ + {"id": "abc123", "title": "Chat"}, + {"id": "tui_worker_1", "title": "Worker"}, + {"id": "def456", "title": "Another"}, + {"id": "tui_conductor_main", "title": "Main"}, + ] + filtered = [s for s in sessions if not s["id"].startswith("tui_")] + assert len(filtered) == 2 + assert all(not s["id"].startswith("tui_") for s in filtered) + + def test_no_tui_sessions_unchanged(self): + sessions = [{"id": "a"}, {"id": "b"}] + filtered = [s for s in sessions if not s["id"].startswith("tui_")] + assert len(filtered) == 2 + + def test_all_tui_sessions_empty_result(self): + sessions = [{"id": "tui_x"}, {"id": "tui_y"}] + filtered = [s for s in sessions if not s["id"].startswith("tui_")] + assert len(filtered) == 0 + + +class TestRunAgentTurnScope: + """Guard tests: run_agent_turn must NOT reference variables from submit_prompt's scope. + + These tests parse the actual bridge source to catch NameError regressions + (e.g. referencing 'sid' inside run_agent_turn which runs in a different thread). + """ + + @staticmethod + def _get_bridge_source() -> str: + from pathlib import Path + candidates = [ + Path(__file__).parent.parent / "desktop_bridge.py", + Path(__file__).parent.parent.parent / "frontends" / "desktop_bridge.py", + ] + for p in candidates: + if p.exists(): + return p.read_text(encoding="utf-8") + raise FileNotFoundError("desktop_bridge.py not found") + + @staticmethod + def _extract_method_body(source: str, method_name: str) -> str: + """Extract a method with Python's parser so multiline signatures remain supported.""" + import ast + tree = ast.parse(source) + method = next( + ( + node + for node in ast.walk(tree) + if isinstance(node, (ast.FunctionDef, ast.AsyncFunctionDef)) + and node.name == method_name + ), + None, + ) + return ast.get_source_segment(source, method) if method is not None else "" + + def test_run_agent_turn_does_not_reference_bare_sid(self): + """run_agent_turn must use sess.id, never bare 'sid' (which is out of scope).""" + import re + source = self._get_bridge_source() + body = self._extract_method_body(source, "run_agent_turn") + assert body, "Could not extract run_agent_turn body" + # Find bare 'sid' references that are NOT part of 'sess.id' or string literals + bare_sid_refs = re.findall(r'(? str: + s = re.sub(r"[^A-Za-z0-9_-]", "", str(sid or "")) + return s or "_misc" + + +# Mirrors desktop_bridge._session_upload_dir +def _session_upload_dir(upload_root: Path, sid: str) -> Path: + return upload_root / _safe_session_dir(sid) + + +# Mirrors the upload_handler naming/path rules. +def _build_upload_path(upload_root: Path, sid: str, name: str, token: str) -> Path: + safe_name = (name or "file").strip().replace("/", "_").replace("\\", "_") or "file" + return _session_upload_dir(upload_root, sid) / f"{token}__{safe_name}" + + +# Mirrors upload_handler decode logic. +def _decode_upload_data(data_url: str) -> bytes: + if "," in data_url: + b64 = data_url.split(",", 1)[1] + else: + b64 = data_url + return base64.b64decode(b64) + + +# Mirrors upload_delete_handler path whitelist. +def _delete_allowed(upload_root: Path, raw_path: str) -> bool: + target = Path(raw_path).resolve() + root = upload_root.resolve() + return root in target.parents + + +# Mirrors upload_raw_handler path whitelist. +def _raw_allowed(upload_root: Path, raw_path: str) -> bool: + target = Path(raw_path).resolve() + try: + target.relative_to(upload_root.resolve()) + return True + except (ValueError, OSError): + return False + + +# Mirrors upload_raw_handler original filename recovery. +def _original_upload_name(path: Path) -> str: + return path.name.split("__", 1)[-1] + + +class TestSafeSessionDir: + def test_keeps_safe_ascii_chars(self): + assert _safe_session_dir("abc-DEF_123") == "abc-DEF_123" + + def test_strips_path_traversal_and_spaces(self): + assert _safe_session_dir(" ../../team notes ") == "teamnotes" + + def test_empty_or_none_falls_back_to_misc(self): + assert _safe_session_dir("") == "_misc" + assert _safe_session_dir(None) == "_misc" + + def test_non_ascii_only_sid_falls_back_to_misc(self): + assert _safe_session_dir("报告/会议") == "_misc" + + +class TestSessionUploadDir: + def test_scopes_uploads_under_sanitized_sid(self, tmp_path: Path): + root = tmp_path / "desktop_uploads" + actual = _session_upload_dir(root, "../../tui_worker") + assert actual == root / "tui_worker" + + def test_files_bucket_stays_isolated(self, tmp_path: Path): + root = tmp_path / "desktop_uploads" + actual = _session_upload_dir(root, "_files") + assert actual == root / "_files" + + +class TestUploadPathConstruction: + def test_replaces_slashes_in_uploaded_name(self, tmp_path: Path): + root = tmp_path / "desktop_uploads" + path = _build_upload_path(root, "session-1", "dir/sub\\name.txt", "abc123def456") + assert path == root / "session-1" / "abc123def456__dir_sub_name.txt" + + def test_uses_file_when_name_empty(self, tmp_path: Path): + root = tmp_path / "desktop_uploads" + path = _build_upload_path(root, "session-1", " ", "abc123def456") + assert path.name == "abc123def456__file" + + +class TestUploadDecode: + def test_decodes_data_url_payload(self): + payload = "hello,world".encode("utf-8") + data_url = "data:text/plain;base64," + base64.b64encode(payload).decode("ascii") + assert _decode_upload_data(data_url) == payload + + def test_decodes_raw_base64_payload(self): + payload = b"abc123" + raw = base64.b64encode(payload).decode("ascii") + assert _decode_upload_data(raw) == payload + + +class TestUploadPathSafety: + def test_delete_allows_file_inside_upload_root(self, tmp_path: Path): + root = tmp_path / "desktop_uploads" + target = root / "session-1" / "abc__note.txt" + target.parent.mkdir(parents=True) + target.write_text("ok", encoding="utf-8") + assert _delete_allowed(root, str(target)) is True + + def test_delete_rejects_file_outside_upload_root(self, tmp_path: Path): + root = tmp_path / "desktop_uploads" + outside = tmp_path / "outside.txt" + outside.write_text("nope", encoding="utf-8") + assert _delete_allowed(root, str(outside)) is False + + def test_raw_allows_file_inside_upload_root(self, tmp_path: Path): + root = tmp_path / "desktop_uploads" + target = root / "session-1" / "abc__report.csv" + target.parent.mkdir(parents=True) + target.write_text("x,y", encoding="utf-8") + assert _raw_allowed(root, str(target)) is True + + def test_raw_rejects_path_traversal_outside_upload_root(self, tmp_path: Path): + root = tmp_path / "desktop_uploads" + outside = tmp_path / "secret.txt" + outside.write_text("top secret", encoding="utf-8") + assert _raw_allowed(root, str(outside)) is False + + +class TestOriginalUploadName: + def test_strips_uuid_prefix_from_uploaded_file(self): + path = Path("/tmp/desktop_uploads/session-1/abc123def456__my report.txt") + assert _original_upload_name(path) == "my report.txt" + + def test_preserves_cjk_filename(self): + path = Path("/tmp/desktop_uploads/session-1/abc123def456__报告.csv") + assert _original_upload_name(path) == "报告.csv" + + def test_filename_without_prefix_returns_name_as_is(self): + path = Path("/tmp/desktop_uploads/session-1/plain.txt") + assert _original_upload_name(path) == "plain.txt" diff --git a/frontends/tests/test_bridge_utils.py b/frontends/tests/test_bridge_utils.py new file mode 100644 index 000000000..69541514f --- /dev/null +++ b/frontends/tests/test_bridge_utils.py @@ -0,0 +1,420 @@ +"""Unit tests for desktop_bridge.py utility functions. + +Tests pure functions that don't require agent/session infrastructure. +Run: pytest frontends/tests/test_bridge_utils.py -v +""" +import ast +import json +import os +import sys +import re +from pathlib import Path +from types import SimpleNamespace + +# Add project root so we can import bridge helpers +ROOT = Path(__file__).resolve().parent.parent.parent +sys.path.insert(0, str(ROOT / "frontends")) +from data_backup import materialize_import_source, merge_data_files + +# Import the functions under test (module-level helpers) +import importlib.util +spec = importlib.util.spec_from_file_location("desktop_bridge", ROOT / "frontends" / "desktop_bridge.py") + +# We can't import the whole module (it starts aiohttp etc.) so we extract functions manually +_bridge_source = (ROOT / "frontends" / "desktop_bridge.py").read_text(encoding="utf-8") + + +def _load_named_helpers(names, namespace): + tree = ast.parse(_bridge_source) + nodes = [ + node + for node in tree.body + if isinstance(node, (ast.FunctionDef, ast.AsyncFunctionDef)) and node.name in names + ] + exec(compile(ast.Module(body=nodes, type_ignores=[]), "desktop_bridge.py", "exec"), namespace) + return namespace + + +class TestGaRootBoundary: + def test_external_core_override_needs_only_agentmain(self, tmp_path, monkeypatch): + external = tmp_path / "external core" + external.mkdir() + (external / "agentmain.py").write_text("# core\n", encoding="utf-8") + monkeypatch.setenv("GA_ROOT", str(external)) + monkeypatch.setattr(sys, "argv", ["desktop_bridge.py"]) + + helpers = _load_named_helpers( + {"_ga_root_override"}, + {"os": os, "sys": sys, "Path": Path, "Optional": __import__("typing").Optional}, + ) + + assert helpers["_ga_root_override"]() == external.resolve() + + def test_invalid_override_falls_back_instead_of_becoming_app_dir(self, tmp_path, monkeypatch): + missing = tmp_path / "deleted-core" + monkeypatch.setenv("GA_ROOT", str(missing)) + monkeypatch.setattr(sys, "argv", ["desktop_bridge.py"]) + helpers = _load_named_helpers( + {"_ga_root_override"}, + {"os": os, "sys": sys, "Path": Path, "Optional": __import__("typing").Optional}, + ) + + assert helpers["_ga_root_override"]() is None + + +class TestMemoryImport: + def test_source_memory_wins_while_current_responses_remain_add_only(self, tmp_path): + source = tmp_path / "source" + target = tmp_path / "target" + (source / "memory").mkdir(parents=True) + (source / "memory" / "same.md").write_text("new", encoding="utf-8") + (source / "memory" / "added.md").write_text("added", encoding="utf-8") + (source / "temp" / "model_responses").mkdir(parents=True) + (source / "temp" / "model_responses" / "same.json").write_text("new", encoding="utf-8") + (source / "temp" / "model_responses" / "added.json").write_text("added", encoding="utf-8") + (target / "memory").mkdir(parents=True) + (target / "memory" / "same.md").write_text("old", encoding="utf-8") + (target / "temp" / "model_responses").mkdir(parents=True) + (target / "temp" / "model_responses" / "same.json").write_text("old", encoding="utf-8") + + result = merge_data_files(str(source), str(target)) + + assert result["memoryCopied"] == 2 + assert result["memorySkipped"] == 0 + assert result["responsesCopied"] == 1 + assert result["responsesSkipped"] == 1 + assert (target / "memory" / "same.md").read_text(encoding="utf-8") == "new" + assert (target / "memory" / "added.md").read_text(encoding="utf-8") == "added" + assert (target / "temp" / "model_responses" / "same.json").read_text(encoding="utf-8") == "old" + assert (Path(result["backupDir"]) / "memory" / "same.md").read_text(encoding="utf-8") == "old" + + def test_bridge_adopts_only_sessions_committed_by_transaction(self, tmp_path): + source = tmp_path / "source" + target = tmp_path / "target" + (source / "memory").mkdir(parents=True) + (source / "memory" / "imported.md").write_text("new", encoding="utf-8") + source_sessions = source / "temp" / "desktop_sessions" + source_sessions.mkdir(parents=True) + source_sessions.joinpath("sess-imported.json").write_text( + json.dumps({"id": "sess-imported", "title": "Imported", "messages": []}), + encoding="utf-8", + ) + target.mkdir() + + class Lock: + def __enter__(self): + return self + + def __exit__(self, *_args): + return False + + class Manager: + ga_root = str(target) + lock = Lock() + sessions = {} + + @staticmethod + def begin_maintenance(kind, running_extras_fn): + assert kind == "import" + assert running_extras_fn() == [] + return "test-token" + + @staticmethod + def end_maintenance(token): + assert token == "test-token" + + @staticmethod + def _session_from_item(item): + return SimpleNamespace(id=item["id"], title=item.get("title", "")) + + helpers = _load_named_helpers( + {"_import_data_source"}, + { + "manager": Manager(), + "services": SimpleNamespace(running_managed_ids=lambda: []), + "materialize_import_source": materialize_import_source, + "merge_data_files": merge_data_files, + }, + ) + + result = helpers["_import_data_source"](str(source)) + + manager = helpers["manager"] + assert result["sessionsAdded"] == 1 + assert "_preparedSessions" not in result + assert manager.sessions["sess-imported"].title == "Imported" + persisted = target / "temp" / "desktop_sessions" / "sess-imported.json" + assert json.loads(persisted.read_text(encoding="utf-8"))["id"] == "sess-imported" + + +def _load_empty_turn_helpers(): + tree = ast.parse(_bridge_source) + wanted = {"_EMPTY_TURN_MICROCOPY", "_get_ui_lang", "empty_turn_fallback"} + nodes = [] + for node in tree.body: + if isinstance(node, (ast.FunctionDef, ast.AsyncFunctionDef)) and node.name in wanted: + nodes.append(node) + elif isinstance(node, ast.Assign): + names = {target.id for target in node.targets if isinstance(target, ast.Name)} + if names & wanted: + nodes.append(node) + namespace = {"Path": Path, "json": json} + exec(compile(ast.Module(body=nodes, type_ignores=[]), "desktop_bridge.py", "exec"), namespace) + return namespace + + +class TestEmptyTurnFallback: + def test_uses_english_microcopy(self, tmp_path, monkeypatch): + (tmp_path / ".ga_desktop_settings.json").write_text( + '{"ui":{"lang":"en"},"lang":"zh"}', encoding="utf-8" + ) + monkeypatch.setattr(Path, "home", lambda: tmp_path) + + helpers = _load_empty_turn_helpers() + + assert helpers["empty_turn_fallback"]() == ( + '⚠️ This turn ended without a visible response. You can send "continue" to retry.' + ) + + def test_supports_legacy_top_level_language(self, tmp_path, monkeypatch): + (tmp_path / ".ga_desktop_settings.json").write_text('{"lang":"en"}', encoding="utf-8") + monkeypatch.setattr(Path, "home", lambda: tmp_path) + + helpers = _load_empty_turn_helpers() + + assert helpers["empty_turn_fallback"]() == ( + '⚠️ This turn ended without a visible response. You can send "continue" to retry.' + ) + + def test_defaults_to_chinese_for_missing_or_invalid_settings(self, tmp_path, monkeypatch): + monkeypatch.setattr(Path, "home", lambda: tmp_path) + helpers = _load_empty_turn_helpers() + expected = '⚠️ 这一轮结束了,但没有产出可见回复。你可以发送"继续"重试。' + assert helpers["empty_turn_fallback"]() == expected + + (tmp_path / ".ga_desktop_settings.json").write_text("not-json", encoding="utf-8") + assert helpers["empty_turn_fallback"]() == expected + + def test_defaults_to_chinese_for_non_string_language(self, tmp_path, monkeypatch): + (tmp_path / ".ga_desktop_settings.json").write_text( + '{"ui":{"lang":[]},"lang":[]}', encoding="utf-8" + ) + monkeypatch.setattr(Path, "home", lambda: tmp_path) + + helpers = _load_empty_turn_helpers() + + assert helpers["empty_turn_fallback"]() == ( + '⚠️ 这一轮结束了,但没有产出可见回复。你可以发送"继续"重试。' + ) + + +# === strip_final_info_marker === + +_FINAL_INFO_RE = re.compile(r'\n*`{5}\n*\[Info\] Final response to user\.\n*`{5}\s*$') + +def strip_final_info_marker(text): + return _FINAL_INFO_RE.sub('', str(text or '')) + + +class TestStripFinalInfoMarker: + def test_removes_marker_at_end(self): + text = "Hello world\n`````\n[Info] Final response to user.\n`````" + assert strip_final_info_marker(text) == "Hello world" + + def test_no_marker_unchanged(self): + text = "Just normal text" + assert strip_final_info_marker(text) == "Just normal text" + + def test_empty_string(self): + assert strip_final_info_marker("") == "" + + def test_none_becomes_empty(self): + # str(None or '') → '' since `or` short-circuits + assert strip_final_info_marker(None) == "" + + def test_marker_only_in_middle_not_removed(self): + text = "Before\n`````\n[Info] Final response to user.\n`````\nAfter" + assert strip_final_info_marker(text) == text + + +# === normalize_final_turn_segs === + +def normalize_final_turn_segs(full, outputs): + if not outputs or not isinstance(outputs, (list, tuple)): + return None + segs = [strip_final_info_marker(s) for s in outputs] + full_text = strip_final_info_marker(full) + if not segs: + return None + joined = "".join(segs) + if full_text.strip() == joined.strip(): + return segs + if joined and full_text.startswith(joined): + suffix = full_text[len(joined):] + if suffix.strip(): + segs[-1] = segs[-1] + suffix + return segs + return None + + +class TestNormalizeFinalTurnSegs: + def test_exact_match(self): + segs = normalize_final_turn_segs("AB", ["A", "B"]) + assert segs == ["A", "B"] + + def test_suffix_appended_to_last_seg(self): + segs = normalize_final_turn_segs("ABC_extra", ["A", "BC"]) + assert segs is not None + assert segs[-1] == "BC_extra" + + def test_no_match_returns_none(self): + segs = normalize_final_turn_segs("XYZ", ["A", "B"]) + assert segs is None + + def test_none_outputs_returns_none(self): + assert normalize_final_turn_segs("text", None) is None + + def test_empty_outputs_returns_none(self): + assert normalize_final_turn_segs("text", []) is None + + def test_string_outputs_returns_none(self): + assert normalize_final_turn_segs("text", "not a list") is None + + def test_whitespace_match(self): + segs = normalize_final_turn_segs("A B ", ["A B "]) + assert segs == ["A B "] + + +# === _extract_first_timestamp === + +def _extract_first_timestamp(content): + m = re.search(r'^=== Prompt === (\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2})', content, re.MULTILINE) + if m: + try: + from datetime import datetime + return datetime.strptime(m.group(1), "%Y-%m-%d %H:%M:%S").timestamp() + except Exception: + pass + return 0.0 + + +class TestExtractFirstTimestamp: + def test_extracts_valid_timestamp(self): + content = "=== Prompt === 2024-06-15 14:30:00\nSome prompt text" + ts = _extract_first_timestamp(content) + assert ts > 0 + from datetime import datetime + expected = datetime(2024, 6, 15, 14, 30, 0).timestamp() + assert ts == expected + + def test_no_match_returns_zero(self): + assert _extract_first_timestamp("No timestamp here") == 0.0 + + def test_empty_string(self): + assert _extract_first_timestamp("") == 0.0 + + def test_multiline_finds_first(self): + content = "Some header\n=== Prompt === 2024-01-01 00:00:00\n=== Response === 2024-01-01 00:01:00" + ts = _extract_first_timestamp(content) + from datetime import datetime + assert ts == datetime(2024, 1, 1, 0, 0, 0).timestamp() + + +# === _next_native_var === + +def _next_native_var(text, protocol): + proto = str(protocol or "").strip().lower() + if proto == "claude": + prefix = "native_claude_config" + elif proto in ("oai", "openai"): + prefix = "native_oai_config" + else: + raise ValueError("protocol is required: choose 'oai' or 'claude'") + nums = [0] + if re.search(rf"^{prefix}\s*=", text, re.M): + nums.append(0) + nums.extend(int(m.group(1)) for m in re.finditer(rf"^{prefix}(\d+)\s*=", text, re.M)) + n = max(nums) + 1 + return prefix if n == 1 and not re.search(rf"^{prefix}\s*=", text, re.M) else f"{prefix}{n}" + + +class TestNextNativeVar: + def test_first_oai_config(self): + assert _next_native_var("", "oai") == "native_oai_config" + + def test_first_claude_config(self): + assert _next_native_var("", "claude") == "native_claude_config" + + def test_increments_when_one_exists(self): + text = "native_oai_config = {'key': 'xxx'}" + result = _next_native_var(text, "oai") + # When base var exists: nums=[0,0], max=0, n=1, but base already exists → prefix1 + assert result == "native_oai_config1" + + def test_increments_past_existing_numbered(self): + text = "native_claude_config = {}\nnative_claude_config2 = {}\nnative_claude_config3 = {}" + result = _next_native_var(text, "claude") + assert result == "native_claude_config4" + + def test_raises_on_invalid_protocol(self): + import pytest + with pytest.raises(ValueError, match="protocol is required"): + _next_native_var("", "gemini") + + def test_openai_alias(self): + assert _next_native_var("", "openai") == "native_oai_config" + + +# === _format_py_dict === + +def _format_py_dict(d): + lines = [f" '{k}': {json.dumps(v, ensure_ascii=False)}," if isinstance(v, str) else f" '{k}': {v}," for k, v in d.items()] + return "{\n" + "\n".join(lines) + "\n}" + + +class TestFormatPyDict: + def test_simple_dict(self): + result = _format_py_dict({"key": "sk-xxx", "model": "gpt-4"}) + assert "'key': \"sk-xxx\"" in result + assert "'model': \"gpt-4\"" in result + assert result.startswith("{") + assert result.endswith("}") + + def test_non_string_values(self): + result = _format_py_dict({"timeout": 30, "stream": True}) + assert "'timeout': 30," in result + assert "'stream': True," in result + + def test_empty_dict(self): + result = _format_py_dict({}) + assert result == "{\n\n}" + + def test_chinese_values_preserved(self): + result = _format_py_dict({"name": "模型一"}) + assert "模型一" in result + + +# === _load_plan_baseline === + +def _load_plan_baseline(item, msgs): + base = int(item.get("plan_scan_baseline", 0) or 0) + if base >= len(msgs): + return 0 + return max(0, base) + + +class TestLoadPlanBaseline: + def test_valid_baseline(self): + assert _load_plan_baseline({"plan_scan_baseline": 5}, list(range(10))) == 5 + + def test_baseline_exceeds_messages_returns_zero(self): + assert _load_plan_baseline({"plan_scan_baseline": 20}, list(range(5))) == 0 + + def test_missing_key_returns_zero(self): + assert _load_plan_baseline({}, list(range(10))) == 0 + + def test_none_value_returns_zero(self): + assert _load_plan_baseline({"plan_scan_baseline": None}, list(range(10))) == 0 + + def test_negative_clamped_to_zero(self): + assert _load_plan_baseline({"plan_scan_baseline": -5}, list(range(10))) == 0 diff --git a/frontends/tests/test_conductor_model_routing.py b/frontends/tests/test_conductor_model_routing.py new file mode 100644 index 000000000..e0fa335bb --- /dev/null +++ b/frontends/tests/test_conductor_model_routing.py @@ -0,0 +1,411 @@ +"""Runtime model-routing tests for the isolated Conductor process.""" +from __future__ import annotations + +import importlib.util +import argparse +import os +import queue +import sys +import threading +import types +from pathlib import Path + +import pytest + + +ROOT = Path(__file__).resolve().parent.parent.parent +CONDUCTOR_PATH = ROOT / "frontends" / "conductor.py" + + +class StubGenericAgent: + pass + + +agentmain_stub = types.ModuleType("agentmain") +agentmain_stub.GenericAgent = StubGenericAgent +previous_agentmain = sys.modules.get("agentmain") +sys.modules["agentmain"] = agentmain_stub + +spec = importlib.util.spec_from_file_location("conductor_model_under_test", CONDUCTOR_PATH) +conductor = importlib.util.module_from_spec(spec) +assert spec.loader is not None +_argv = sys.argv +try: + sys.argv = [str(CONDUCTOR_PATH), "--no-browser"] + spec.loader.exec_module(conductor) +finally: + sys.argv = _argv +if previous_agentmain is None: + del sys.modules["agentmain"] +else: + sys.modules["agentmain"] = previous_agentmain + + +class Backend: + def __init__(self, name: str): + self.name = name + self.model = name + + +class Client: + def __init__(self, name: str | None): + if name is not None: + self.backend = Backend(name) + + +class FakeAgent: + def __init__(self, names: list[str | None], failing: set[int] | None = None): + self.llmclients = [Client(name) for name in names] + self.llm_no = 0 + self.llmclient = self.llmclients[0] + self.next_llm_calls: list[int] = [] + self.reloads = 0 + self.failing = failing or set() + + def load_llm_sessions(self): + self.reloads += 1 + + def next_llm(self, no: int): + # Deliberately mirrors GenericAgent's modulo behavior. The Conductor + # resolver must validate before calling this method. + self.next_llm_calls.append(no) + if no in self.failing: + raise RuntimeError("broken client") + self.llm_no = no % len(self.llmclients) + self.llmclient = self.llmclients[self.llm_no] + + def get_llm_name(self, client=None, model=False): + client = client or self.llmclient + return client.backend.model if model else client.backend.name + + +def test_out_of_range_config_falls_back_without_modulo(monkeypatch): + agent = FakeAgent(["zero", "one", "two", "three"]) + monkeypatch.setattr( + conductor, + "_settings_doc", + lambda: {"conductor": {"llmNo": 99}, "ui": {"llmNo": 1}}, + ) + + state = conductor._apply_desktop_model(agent) + + assert agent.next_llm_calls == [1] + assert state["effective"] == 1 + assert state["fallbackReason"] == "invalid_configured" + + +def test_conductor_default_port_override_is_e2e_scoped(monkeypatch): + monkeypatch.delenv(conductor.E2E_REPORT_DIR_ENV, raising=False) + monkeypatch.setenv(conductor.E2E_CONDUCTOR_PORT_ENV, "29890") + assert conductor._default_conductor_port() == 8900 + + monkeypatch.setenv(conductor.E2E_REPORT_DIR_ENV, "/tmp/package-evidence") + assert conductor._default_conductor_port() == 29890 + + +@pytest.mark.parametrize("value", ["1", "8900", "65535"]) +def test_conductor_port_parser_accepts_full_valid_range(value): + assert conductor._parse_conductor_port(value) == int(value) + + +@pytest.mark.parametrize("value", ["", "0", "65536", "2.5", "-1", "1234"]) +def test_conductor_port_parser_rejects_invalid_values(value): + with pytest.raises(argparse.ArgumentTypeError, match="between 1 and 65535"): + conductor._parse_conductor_port(value) + + +def test_unusable_configured_client_falls_back_to_ui_default(monkeypatch): + agent = FakeAgent(["zero", "one", None, "three"]) + monkeypatch.setattr( + conductor, + "_settings_doc", + lambda: {"conductor": {"llmNo": 2}, "ui": {"llmNo": 1}}, + ) + + state = conductor._apply_desktop_model(agent) + + assert agent.next_llm_calls == [1] + assert state["effective"] == 1 + assert state["fallbackReason"] == "configured_unavailable" + + +def test_configured_activation_failure_falls_back_to_ui_default(monkeypatch): + agent = FakeAgent(["zero", "one", "two"], failing={2}) + monkeypatch.setattr( + conductor, + "_settings_doc", + lambda: {"conductor": {"llmNo": 2}, "ui": {"llmNo": 1}}, + ) + + state = conductor._apply_desktop_model(agent) + + assert agent.next_llm_calls == [2, 1] + assert state["effective"] == 1 + assert state["fallbackReason"] == "configured_unavailable" + + +def test_missing_config_uses_first_usable_when_ui_is_invalid(monkeypatch): + agent = FakeAgent([None, None, "two", "three"]) + monkeypatch.setattr(conductor, "_settings_doc", lambda: {"ui": {"llmNo": 99}}) + + state = conductor._apply_desktop_model(agent) + + assert agent.next_llm_calls == [2] + assert state["effective"] == 2 + assert state["fallbackReason"] == "first_available" + + +def test_explicit_numeric_worker_model_rejects_out_of_range(): + agent = FakeAgent(["zero", "one"]) + + with pytest.raises(ValueError, match="out of range"): + conductor._select_llm(agent, 99) + + assert agent.next_llm_calls == [] + + +def test_runtime_model_snapshot_is_broadcast_with_running_state(monkeypatch): + instance = conductor.Conductor() + payloads: list[dict] = [] + monkeypatch.setattr(conductor, "schedule_broadcast", payloads.append) + state = { + "configured": 2, + "effective": 1, + "fallbackReason": "configured_unavailable", + "current": "model-one", + } + + instance._publish_model_state(state, running=True) + + assert instance.model_snapshot() == {**state, "running": True} + assert payloads == [{"type": "model", "model": {**state, "running": True}}] + + +def test_long_lived_conductor_refreshes_model_between_tasks(monkeypatch): + """A saved binding waits for task cleanup, then affects the next task.""" + + class EndOfInbox(Exception): + pass + + second_boundary_entered = threading.Event() + + class BoundaryInbox: + def __init__(self): + self.events = [ + {"type": "user_message", "id": "first"}, + {"type": "user_message", "id": "second"}, + ] + + def get(self): + if not self.events: + raise EndOfInbox + if len(self.events) == 1: + second_boundary_entered.set() + return self.events.pop(0) + + def task_done(self): + pass + + def empty(self): + # Keep each event as a separate task boundary for this regression. + return True + + selected = {"llmNo": 1} + timeline: list[tuple[str, int]] = [] + allow_first_cleanup = threading.Event() + first_cleanup_done = threading.Event() + + class TaskAgent(FakeAgent): + def __init__(self): + super().__init__(["zero", "one", "two"]) + self.inc_out = False + self.task_models: list[int] = [] + self.task_queue: queue.Queue = queue.Queue() + self.cleanup_threads: list[threading.Thread] = [] + + def next_llm(self, no: int): + super().next_llm(no) + timeline.append(("select", self.llm_no)) + + def put_task(self, _prompt: str, source: str): + assert source == "conductor" + self.task_models.append(self.llm_no) + timeline.append(("submit", self.llm_no)) + if len(self.task_models) == 1: + # Simulate save_config while task one is already submitted. The + # display queue reports done before the agent runner persists its + # final state and calls task_done(). + selected["llmNo"] = 2 + assert self.llm_no == 1 + self.task_queue.put("first") + + def finish_first_task(): + assert allow_first_cleanup.wait(timeout=2) + assert self.task_queue.get_nowait() == "first" + self.task_queue.task_done() + first_cleanup_done.set() + + cleanup = threading.Thread(target=finish_first_task) + cleanup.start() + self.cleanup_threads.append(cleanup) + else: + self.task_queue.put("second") + assert self.task_queue.get_nowait() == "second" + self.task_queue.task_done() + output: queue.Queue = queue.Queue() + output.put({"done": True, "turn": len(self.task_models)}) + return output + + instance = conductor.Conductor() + instance.agent = TaskAgent() + instance.inbox = BoundaryInbox() + payloads: list[dict] = [] + monkeypatch.setattr( + conductor, + "_settings_doc", + lambda: {"conductor": {"llmNo": selected["llmNo"]}}, + ) + monkeypatch.setattr(conductor, "schedule_broadcast", payloads.append) + monkeypatch.setattr(conductor, "start_agent_runner", lambda *_args: None) + monkeypatch.setattr(conductor.time, "sleep", lambda _seconds: None) + monkeypatch.setattr(instance, "_build_prompt", lambda events: events[0]["id"]) + + run_errors: list[BaseException] = [] + + def run_loop(): + try: + instance._run() + except EndOfInbox: + pass + except BaseException as error: # surfaced below in the test thread + run_errors.append(error) + + runner = threading.Thread(target=run_loop) + runner.start() + assert second_boundary_entered.wait(timeout=2) + + # The display `done` marker has already arrived, but queue cleanup is still + # blocked. Model two must not be applied or submitted yet. + assert instance.agent.task_models == [1] + assert timeline == [("select", 1), ("submit", 1)] + + allow_first_cleanup.set() + assert first_cleanup_done.wait(timeout=2) + runner.join(timeout=2) + for cleanup in instance.agent.cleanup_threads: + cleanup.join(timeout=2) + + assert not runner.is_alive() + assert run_errors == [] + + assert instance.agent.task_models == [1, 2] + assert timeline == [ + ("select", 1), + ("submit", 1), + ("select", 2), + ("submit", 2), + ] + assert instance.model_snapshot() == { + "configured": 2, + "effective": 2, + "fallbackReason": None, + "current": "two", + "running": False, + } + assert [item["model"]["effective"] for item in payloads] == [1, 1, 2, 2] + assert [item["model"]["running"] for item in payloads] == [True, False, True, False] + + +def test_conductor_defers_events_without_models_and_recovers(monkeypatch): + class EndOfInbox(Exception): + pass + + ready = {"value": False} + + class BoundaryInbox: + def __init__(self): + self.events = [ + {"type": "user_message", "id": "deferred"}, + {"type": "user_message", "id": "recovery"}, + ] + + def get(self): + if not self.events: + raise EndOfInbox + if len(self.events) == 1: + ready["value"] = True + return self.events.pop(0) + + def task_done(self): + pass + + def empty(self): + return True + + class RecoveringAgent: + def __init__(self): + self.inc_out = False + self.llmclients: list[Client] = [] + self.llm_no = 0 + self.task_queue: queue.Queue = queue.Queue() + self.submissions: list[str] = [] + + def load_llm_sessions(self): + if ready["value"] and not self.llmclients: + self.llmclients = [Client("recovered")] + + def next_llm(self, no: int): + self.llm_no = no + self.llmclient = self.llmclients[no] + + def get_llm_name(self, client=None, model=False): + client = client or self.llmclient + return client.backend.model if model else client.backend.name + + def put_task(self, prompt: str, source: str): + assert source == "conductor" + self.submissions.append(prompt) + output: queue.Queue = queue.Queue() + output.put({"done": True, "turn": 1}) + return output + + instance = conductor.Conductor() + instance.agent = RecoveringAgent() + instance.inbox = BoundaryInbox() + payloads: list[dict] = [] + monkeypatch.setattr(conductor, "_settings_doc", lambda: {}) + monkeypatch.setattr(conductor, "schedule_broadcast", payloads.append) + monkeypatch.setattr(conductor, "start_agent_runner", lambda *_args: None) + monkeypatch.setattr(conductor.time, "sleep", lambda _seconds: None) + monkeypatch.setattr(instance, "_build_prompt", lambda events: ",".join(e["id"] for e in events)) + + with pytest.raises(EndOfInbox): + instance._run() + + assert instance.agent.submissions == ["deferred,recovery"] + model_payloads = [item["model"] for item in payloads if item["type"] == "model"] + assert model_payloads[0]["effective"] is None + assert model_payloads[0]["fallbackReason"] == "no_models" + assert model_payloads[0]["running"] is False + assert [model["running"] for model in model_payloads[1:]] == [True, False] + assert any( + item["item"]["text"].startswith("Conductor paused: no usable model") + for item in payloads + if item["type"] == "log" + ) + + +def test_parallel_worker_model_selection_keeps_agents_isolated(): + from concurrent.futures import ThreadPoolExecutor + + agents = [FakeAgent(["zero", "one", "two", "three"]) for _ in range(10)] + requested = [i % 4 for i in range(10)] + with ThreadPoolExecutor(max_workers=10) as executor: + selected = list(executor.map( + lambda pair: conductor._select_llm(pair[0], pair[1]), + zip(agents, requested), + )) + + assert selected == [True] * 10 + assert [agent.llm_no for agent in agents] == requested + assert [agent.next_llm_calls for agent in agents] == [[no] for no in requested] diff --git a/frontends/tests/test_cost_tracker_ledger.py b/frontends/tests/test_cost_tracker_ledger.py new file mode 100644 index 000000000..36b059adf --- /dev/null +++ b/frontends/tests/test_cost_tracker_ledger.py @@ -0,0 +1,444 @@ +"""Regression tests for the per-call token ledger.""" + +from __future__ import annotations + +import importlib.util +import json +import sys +import threading +import time +import types +from pathlib import Path + +import pytest + +ROOT = Path(__file__).resolve().parent.parent.parent +_SPEC = importlib.util.spec_from_file_location( + "desktop_cost_tracker_under_test", ROOT / "frontends" / "cost_tracker.py" +) +assert _SPEC and _SPEC.loader +cost_tracker = importlib.util.module_from_spec(_SPEC) +sys.modules[_SPEC.name] = cost_tracker +_SPEC.loader.exec_module(cost_tracker) + + +def _close_ledger() -> None: + fd = cost_tracker._ledger_fd + if fd is not None: + fd.close() + cost_tracker._ledger_fd = None + cost_tracker._ledger_path = None + + +def setup_function() -> None: + _close_ledger() + + +def teardown_function() -> None: + _close_ledger() + + +def test_uninitialized_append_returns_before_clock_json_and_lock(monkeypatch): + class ForbiddenLock: + def __enter__(self): + raise AssertionError("uninitialized TUI path acquired the ledger lock") + + def __exit__(self, *_args): + return False + + monkeypatch.setattr( + cost_tracker.json, + "dumps", + lambda *_args, **_kwargs: (_ for _ in ()).throw( + AssertionError("uninitialized TUI path serialized JSON") + ), + ) + monkeypatch.setattr( + cost_tracker.time, + "time", + lambda: (_ for _ in ()).throw( + AssertionError("uninitialized TUI path read the clock") + ), + ) + monkeypatch.setattr(cost_tracker, "_ledger_lock", ForbiddenLock()) + + cost_tracker._append_ledger("tui-main", 1, 2, 3, 4) + + +def test_public_tracker_and_context_interfaces_keep_tui_semantics(monkeypatch): + cost_tracker._trackers.clear() + tracker = cost_tracker.get("tui-main") + assert tracker is cost_tracker.get("tui-main") + tracker.requests = 2 + tracker.input = 10 + tracker.output = 4 + tracker.cache_create = 3 + tracker.cache_read = 5 + tracker.started_at = 100.0 + monkeypatch.setattr(cost_tracker.time, "time", lambda: 106.5) + + assert tracker.total_input_side() == 18 + assert tracker.total_tokens() == 22 + assert tracker.cache_hit_rate() == pytest.approx(5 / 18 * 100) + assert tracker.elapsed_seconds() == 6.5 + snapshot = cost_tracker.all_trackers() + assert snapshot == {"tui-main": tracker} + snapshot.clear() + assert cost_tracker.all_trackers() == {"tui-main": tracker} + + backend = types.SimpleNamespace( + context_win="200", + history=[{"role": "user", "content": "你好"}], + ) + assert cost_tracker.context_window_chars(backend) == 600 + assert cost_tracker.current_input_chars(backend) == len( + json.dumps(backend.history[0], ensure_ascii=False) + ) + assert cost_tracker.context_window_chars(types.SimpleNamespace(context_win="bad")) == 0 + + +def test_install_remains_idempotent_without_desktop_ledger(monkeypatch): + original_calls = [] + printed = [] + fake_llmcore = types.ModuleType("llmcore") + fake_llmcore._record_usage = lambda value, mode: original_calls.append((value, mode)) + monkeypatch.setitem(sys.modules, "llmcore", fake_llmcore) + monkeypatch.setattr(cost_tracker, "_INSTALLED", False) + monkeypatch.setattr(cost_tracker, "_trackers", {}) + monkeypatch.setattr("builtins.print", lambda *args, **_kwargs: printed.append(args)) + + cost_tracker.install() + wrapped_record = fake_llmcore._record_usage + wrapped_print = fake_llmcore.print + cost_tracker.install() + + assert fake_llmcore._record_usage is wrapped_record + assert fake_llmcore.print is wrapped_print + fake_llmcore._record_usage( + {"prompt_tokens": 7, "prompt_tokens_details": {"cached_tokens": 2}}, + "chat_completions", + ) + fake_llmcore.print("[Output] tokens=3") + tracker = cost_tracker.get(threading.current_thread().name) + assert (tracker.requests, tracker.input, tracker.output, tracker.cache_read) == (1, 5, 3, 2) + assert original_calls and printed == [("[Output] tokens=3",)] + assert cost_tracker._ledger_path is None + + +def test_append_persists_and_aggregates_per_session(tmp_path): + cost_tracker.init_ledger(str(tmp_path)) + + cost_tracker._append_ledger("GA-sess-1", 10, 0, 2, 3) + cost_tracker._append_ledger("GA-sess-1", 0, 7, 0, 0) + cost_tracker._append_ledger("GA-sess-2", 4, 5, 0, 1) + + entries = cost_tracker.read_ledger() + assert len(entries) == 3 + aggregate = cost_tracker.aggregate_ledger() + by_id = {entry["sessionId"]: entry for entry in aggregate["history"]} + assert by_id["sess-1"]["input"] == 10 + assert by_id["sess-1"]["output"] == 7 + assert by_id["sess-1"]["cacheCreate"] == 2 + assert by_id["sess-1"]["cacheRead"] == 3 + assert aggregate["snap"]["GA-sess-2"] == { + "input": 4, + "output": 5, + "cacheCreate": 0, + "cacheRead": 1, + } + + +def test_concurrent_appends_are_serialized(tmp_path, monkeypatch): + cost_tracker.init_ledger(str(tmp_path)) + real_fd = cost_tracker._ledger_fd + + class DetectConcurrentWrites: + def __init__(self): + self.active = 0 + self.overlapped = False + + def write(self, value): + self.active += 1 + if self.active > 1: + self.overlapped = True + time.sleep(0.01) + result = real_fd.write(value) + self.active -= 1 + return result + + def flush(self): + real_fd.flush() + + def close(self): + real_fd.close() + + detector = DetectConcurrentWrites() + monkeypatch.setattr(cost_tracker, "_ledger_fd", detector) + threads = [ + threading.Thread(target=cost_tracker._append_ledger, args=(f"GA-{i}", 1, 0, 0, 0)) + for i in range(12) + ] + + for thread in threads: + thread.start() + for thread in threads: + thread.join() + + assert detector.overlapped is False + assert len(cost_tracker.read_ledger()) == 12 + + +def test_threshold_compaction_runs_during_process_lifetime(tmp_path, monkeypatch): + monkeypatch.setattr(cost_tracker, "_COMPACT_THRESHOLD", 1) + cost_tracker.init_ledger(str(tmp_path)) + + cost_tracker._append_ledger("GA-sess-1", 10, 7, 2, 3) + + entries = cost_tracker.read_ledger() + assert len(entries) == 1 + assert entries[0]["_compacted"] is True + + +def test_compaction_preserves_last_activity_timestamp(tmp_path): + cost_tracker.init_ledger(str(tmp_path)) + ledger_path = tmp_path / "temp" / "token_ledger.jsonl" + first_ts = 1_700_000_000.0 + second_ts = 1_700_000_100.0 + cost_tracker._ledger_fd.close() + cost_tracker._ledger_fd = None + ledger_path.write_text( + "\n".join( + [ + json.dumps({"t": first_ts, "k": "GA-sess-1", "i": 10, "o": 0, "cc": 0, "cr": 0}), + json.dumps({"t": second_ts, "k": "GA-sess-1", "i": 0, "o": 7, "cc": 0, "cr": 0}), + ] + ) + + "\n", + encoding="utf-8", + ) + cost_tracker._ledger_fd = ledger_path.open("a", encoding="utf-8") + + cost_tracker._compact_ledger() + + history = cost_tracker.aggregate_ledger()["history"] + assert history[0]["ts"] == second_ts + + +def test_reinitializing_closes_the_previous_descriptor(tmp_path): + cost_tracker.init_ledger(str(tmp_path / "one")) + previous_fd = cost_tracker._ledger_fd + + cost_tracker.init_ledger(str(tmp_path / "two")) + + assert previous_fd.closed is True + + +def test_init_migrates_legacy_snapshot_when_ledger_is_empty(tmp_path): + temp_dir = tmp_path / "temp" + temp_dir.mkdir() + (temp_dir / "desktop_token_history.json").write_text( + json.dumps( + { + "history": [ + { + "sessionId": "sess-legacy", + "title": "Legacy session", + "input": 3, + "output": 4, + "cacheCreate": 5, + "cacheRead": 6, + "model": "legacy-model", + "ts": 1_700_000_000.0, + } + ], + "snap": { + "GA-sess-legacy": { + "input": 30, + "output": 40, + "cacheCreate": 50, + "cacheRead": 60, + } + }, + } + ), + encoding="utf-8", + ) + + cost_tracker.init_ledger(str(tmp_path)) + + aggregate = cost_tracker.aggregate_ledger() + assert aggregate["snap"]["GA-sess-legacy"] == { + "input": 30, + "output": 40, + "cacheCreate": 50, + "cacheRead": 60, + } + assert aggregate["history"][0]["title"] == "Legacy session" + assert aggregate["history"][0]["model"] == "legacy-model" + assert aggregate["history"][0]["ts"] == 1_700_000_000.0 + + +def test_init_does_not_migrate_legacy_snapshot_into_nonempty_ledger(tmp_path): + temp_dir = tmp_path / "temp" + temp_dir.mkdir() + (temp_dir / "token_ledger.jsonl").write_text( + json.dumps({"t": 2.0, "k": "GA-current", "i": 1, "o": 0, "cc": 0, "cr": 0}) + "\n", + encoding="utf-8", + ) + (temp_dir / "desktop_token_history.json").write_text( + json.dumps({"snap": {"GA-legacy": {"input": 99, "output": 0, "cacheCreate": 0, "cacheRead": 0}}}), + encoding="utf-8", + ) + + cost_tracker.init_ledger(str(tmp_path)) + + assert set(cost_tracker.aggregate_ledger()["snap"]) == {"GA-current"} + + +@pytest.mark.parametrize( + ("api_mode", "usage", "expected"), + [ + ( + "messages", + { + "input_tokens": 10, + "output_tokens": 1, + "cache_creation_input_tokens": 2, + "cache_read_input_tokens": 3, + }, + {"input": 10, "output": 7, "cacheCreate": 2, "cacheRead": 3}, + ), + ( + "chat_completions", + {"prompt_tokens": 13, "prompt_tokens_details": {"cached_tokens": 3}}, + {"input": 10, "output": 7, "cacheCreate": 0, "cacheRead": 3}, + ), + ( + "responses", + {"input_tokens": 13, "input_tokens_details": {"cached_tokens": 3}}, + {"input": 10, "output": 7, "cacheCreate": 0, "cacheRead": 3}, + ), + ], +) +def test_install_hooks_append_each_api_mode(tmp_path, monkeypatch, api_mode, usage, expected): + original_calls = [] + fake_llmcore = types.ModuleType("llmcore") + fake_llmcore._record_usage = lambda value, mode: original_calls.append((value, mode)) + monkeypatch.setitem(sys.modules, "llmcore", fake_llmcore) + monkeypatch.setattr(cost_tracker, "_INSTALLED", False) + cost_tracker._trackers.clear() + cost_tracker.init_ledger(str(tmp_path)) + + cost_tracker.install() + fake_llmcore._record_usage(usage, api_mode) + fake_llmcore.print("[Output] tokens=7") + + snapshot = next(iter(cost_tracker.aggregate_ledger()["snap"].values())) + assert snapshot == expected + assert original_calls == [(usage, api_mode)] + + +def test_concurrent_appends_remain_exact_across_compactions(tmp_path, monkeypatch): + monkeypatch.setattr(cost_tracker, "_COMPACT_THRESHOLD", 1_000) + cost_tracker.init_ledger(str(tmp_path)) + per_thread = 20 + + def append_session(key: str) -> None: + for _ in range(per_thread): + cost_tracker._append_ledger(key, 1, 2, 3, 4) + + threads = [ + threading.Thread(target=append_session, args=(key,)) + for key in (f"GA-sess-{i}" for i in range(8)) + ] + + for thread in threads: + thread.start() + for thread in threads: + thread.join() + + aggregate = cost_tracker.aggregate_ledger() + assert len(aggregate["snap"]) == 8 + for snapshot in aggregate["snap"].values(): + assert snapshot == { + "input": per_thread, + "output": per_thread * 2, + "cacheCreate": per_thread * 3, + "cacheRead": per_thread * 4, + } + + +def test_corrupt_and_truncated_lines_are_skipped(tmp_path): + cost_tracker.init_ledger(str(tmp_path)) + cost_tracker._append_ledger("GA-valid", 3, 4, 5, 6) + ledger_path = tmp_path / "temp" / "token_ledger.jsonl" + cost_tracker._ledger_fd.write("not-json\n{\"truncated\":\n") + cost_tracker._ledger_fd.flush() + + assert cost_tracker.aggregate_ledger()["snap"] == { + "GA-valid": {"input": 3, "output": 4, "cacheCreate": 5, "cacheRead": 6} + } + + +def test_compaction_uses_atomic_replace_and_keeps_descriptor_writable(tmp_path, monkeypatch): + cost_tracker.init_ledger(str(tmp_path)) + cost_tracker._append_ledger("GA-valid", 3, 4, 0, 0) + real_replace = cost_tracker.os.replace + replacements = [] + + def observe_replace(source, target): + replacements.append((Path(source), Path(target))) + assert Path(source).name == "token_ledger.jsonl.tmp" + assert Path(target).name == "token_ledger.jsonl" + real_replace(source, target) + + monkeypatch.setattr(cost_tracker.os, "replace", observe_replace) + cost_tracker._compact_ledger() + cost_tracker._append_ledger("GA-valid", 0, 2, 0, 0) + + assert len(replacements) == 1 + assert cost_tracker.aggregate_ledger()["snap"]["GA-valid"]["output"] == 6 + + +def test_real_10mb_threshold_compacts_on_init(tmp_path): + temp_dir = tmp_path / "temp" + temp_dir.mkdir() + ledger_path = temp_dir / "token_ledger.jsonl" + valid = json.dumps({"t": 1, "k": "GA-valid", "i": 3, "o": 4, "cc": 0, "cr": 0}) + "\n" + with ledger_path.open("wb") as ledger: + ledger.write(valid.encode("utf-8")) + ledger.truncate(cost_tracker._COMPACT_THRESHOLD) + + cost_tracker.init_ledger(str(tmp_path)) + + assert ledger_path.stat().st_size < 1_000 + assert cost_tracker.aggregate_ledger()["snap"]["GA-valid"] == { + "input": 3, + "output": 4, + "cacheCreate": 0, + "cacheRead": 0, + } + + +def test_repeated_init_migrates_legacy_snapshot_only_once(tmp_path): + temp_dir = tmp_path / "temp" + temp_dir.mkdir() + (temp_dir / "desktop_token_history.json").write_text( + json.dumps({ + "snap": { + "GA-legacy": {"input": 7, "output": 8, "cacheCreate": 9, "cacheRead": 10} + } + }), + encoding="utf-8", + ) + + cost_tracker.init_ledger(str(tmp_path)) + cost_tracker.init_ledger(str(tmp_path)) + + assert cost_tracker.aggregate_ledger()["snap"]["GA-legacy"] == { + "input": 7, + "output": 8, + "cacheCreate": 9, + "cacheRead": 10, + } + assert len(cost_tracker.read_ledger()) == 1 diff --git a/frontends/tests/test_data_backup.py b/frontends/tests/test_data_backup.py new file mode 100644 index 000000000..6afd309c8 --- /dev/null +++ b/frontends/tests/test_data_backup.py @@ -0,0 +1,674 @@ +from __future__ import annotations + +import json +import stat +import zipfile +from pathlib import Path + +import pytest + +import frontends.data_backup as data_backup +from frontends.data_backup import ( + BACKUP_FORMAT_VERSION, + BACKUP_SCHEMA, + BackupFormatError, + export_data_backup, + inspect_import_source, + materialize_import_source, + merge_data_files, +) + + +def _seed_data(root: Path) -> None: + (root / "memory" / "nested").mkdir(parents=True) + (root / "memory" / "notes.md").write_text("memory", encoding="utf-8") + (root / "memory" / "nested" / "facts.json").write_text("{}", encoding="utf-8") + (root / "temp" / "model_responses").mkdir(parents=True) + (root / "temp" / "model_responses" / "response.json").write_text("{}", encoding="utf-8") + (root / "temp" / "desktop_sessions").mkdir(parents=True) + (root / "temp" / "desktop_sessions" / "sess-one.json").write_text( + json.dumps({"id": "sess-one", "title": "One", "messages": []}), + encoding="utf-8", + ) + (root / "mykey.py").write_text("secret", encoding="utf-8") + (root / "agentmain.py").write_text("code", encoding="utf-8") + (root / "logs").mkdir() + (root / "logs" / "bridge.log").write_text("private log", encoding="utf-8") + + +class TestDataBackupExport: + def test_exports_only_allowed_data_and_private_manifest(self, tmp_path: Path): + source = tmp_path / "source" + source.mkdir() + _seed_data(source) + destination = tmp_path / "GenericAgent-data-backup.zip" + + result = export_data_backup(str(source), str(destination), "localRepository") + + assert result["content"] == {"memory": 2, "responses": 1, "sessions": 1} + with zipfile.ZipFile(destination) as archive: + names = set(archive.namelist()) + assert names == { + "manifest.json", + "memory/notes.md", + "memory/nested/facts.json", + "temp/model_responses/response.json", + "temp/desktop_sessions/sess-one.json", + } + manifest = json.loads(archive.read("manifest.json")) + assert manifest["schema"] == BACKUP_SCHEMA + assert manifest["formatVersion"] == BACKUP_FORMAT_VERSION + assert manifest["sourceMode"] == "localRepository" + assert str(source) not in json.dumps(manifest) + assert "mykey.py" not in names + assert "agentmain.py" not in names + assert "logs/bridge.log" not in names + + def test_rejects_symlinks_instead_of_reading_through_them(self, tmp_path: Path): + source = tmp_path / "source" + (source / "memory").mkdir(parents=True) + secret = tmp_path / "outside-secret.txt" + secret.write_text("secret", encoding="utf-8") + (source / "memory" / "linked.txt").symlink_to(secret) + destination = tmp_path / "backup.zip" + + with pytest.raises(ValueError, match="link or reparse point"): + export_data_backup(str(source), str(destination), "included") + + assert not destination.exists() + + def test_rejects_destination_inside_exported_data_before_replacing_it( + self, tmp_path: Path + ): + source = tmp_path / "source" + (source / "memory").mkdir(parents=True) + destination = source / "memory" / "nested-backup.zip" + destination.write_bytes(b"old-destination") + + with pytest.raises(ValueError, match="protected application data"): + export_data_backup(str(source), str(destination), "included") + + assert destination.read_bytes() == b"old-destination" + + def test_rejects_http_readable_destination_before_creating_it(self, tmp_path: Path): + source = tmp_path / "source" + (source / "memory").mkdir(parents=True) + (source / "memory" / "one.md").write_text("one", encoding="utf-8") + upload_root = source / "temp" / "desktop_uploads" + upload_root.mkdir(parents=True) + destination = upload_root / "exfil.zip" + + with pytest.raises(ValueError, match="protected application data"): + export_data_backup( + str(source), str(destination), "included", forbidden_roots=(upload_root,) + ) + + assert not destination.exists() + + def test_export_enforces_the_same_entry_limit_as_import( + self, tmp_path: Path, monkeypatch: pytest.MonkeyPatch + ): + source = tmp_path / "source" + (source / "memory").mkdir(parents=True) + (source / "memory" / "one.md").write_text("one", encoding="utf-8") + destination = tmp_path / "backup.zip" + destination.write_bytes(b"old") + monkeypatch.setattr(data_backup, "MAX_ARCHIVE_ENTRIES", 1) + + with pytest.raises(BackupFormatError, match="too many files"): + export_data_backup(str(source), str(destination), "included") + + assert destination.read_bytes() == b"old" + + def test_export_enforces_the_same_size_limit_as_import( + self, tmp_path: Path, monkeypatch: pytest.MonkeyPatch + ): + source = tmp_path / "source" + (source / "memory").mkdir(parents=True) + (source / "memory" / "one.md").write_text("one", encoding="utf-8") + destination = tmp_path / "backup.zip" + destination.write_bytes(b"old") + monkeypatch.setattr(data_backup, "MAX_ARCHIVE_UNCOMPRESSED_BYTES", 1) + + with pytest.raises(BackupFormatError, match="too large"): + export_data_backup(str(source), str(destination), "included") + + assert destination.read_bytes() == b"old" + + def test_export_revalidates_written_zip_before_replacing_destination( + self, tmp_path: Path, monkeypatch: pytest.MonkeyPatch + ): + source = tmp_path / "source" + (source / "memory").mkdir(parents=True) + data_file = source / "memory" / "one.md" + data_file.write_text("one", encoding="utf-8") + destination = tmp_path / "backup.zip" + destination.write_bytes(b"old") + monkeypatch.setattr(data_backup, "MAX_ARCHIVE_UNCOMPRESSED_BYTES", 10_000) + original_write = zipfile.ZipFile.write + + def grow_then_write(archive, filename, arcname=None, *args, **kwargs): + path = Path(filename) + if path == data_file: + path.write_bytes(b"x" * 20_000) + return original_write(archive, filename, arcname, *args, **kwargs) + + monkeypatch.setattr(zipfile.ZipFile, "write", grow_then_write) + + with pytest.raises(BackupFormatError, match="too large"): + export_data_backup(str(source), str(destination), "included") + + assert destination.read_bytes() == b"old" + assert not list(tmp_path.glob(".backup.*.tmp")) + + +class TestDataBackupInspection: + def test_inspects_generated_backup(self, tmp_path: Path): + source = tmp_path / "source" + source.mkdir() + _seed_data(source) + destination = tmp_path / "backup.zip" + export_data_backup(str(source), str(destination), "included") + + result = inspect_import_source(str(destination)) + + assert result["sourceType"] == "backupZip" + assert result["sourceMode"] == "included" + assert result["content"]["sessions"] == 1 + + def test_rejects_traversal_before_extraction(self, tmp_path: Path): + destination = tmp_path / "traversal.zip" + manifest = { + "schema": BACKUP_SCHEMA, + "formatVersion": BACKUP_FORMAT_VERSION, + "exportedAt": "2026-08-22T00:00:00Z", + "sourceMode": "included", + "content": {"memory": 0, "responses": 0, "sessions": 0}, + } + with zipfile.ZipFile(destination, "w") as archive: + archive.writestr("manifest.json", json.dumps(manifest)) + archive.writestr("../outside.txt", "escape") + + with pytest.raises(BackupFormatError, match="invalid backup entry path"): + inspect_import_source(str(destination)) + + def test_rejects_symlink_entries(self, tmp_path: Path): + destination = tmp_path / "link.zip" + manifest = { + "schema": BACKUP_SCHEMA, + "formatVersion": BACKUP_FORMAT_VERSION, + "exportedAt": "2026-08-22T00:00:00Z", + "sourceMode": "included", + "content": {"memory": 1, "responses": 0, "sessions": 0}, + } + link = zipfile.ZipInfo("memory/link") + link.create_system = 3 + link.external_attr = (stat.S_IFLNK | 0o777) << 16 + with zipfile.ZipFile(destination, "w") as archive: + archive.writestr("manifest.json", json.dumps(manifest)) + archive.writestr(link, "../../secret") + + with pytest.raises(BackupFormatError, match="contains links"): + inspect_import_source(str(destination)) + + def test_rejects_manifest_count_mismatch(self, tmp_path: Path): + destination = tmp_path / "mismatch.zip" + manifest = { + "schema": BACKUP_SCHEMA, + "formatVersion": BACKUP_FORMAT_VERSION, + "exportedAt": "2026-08-22T00:00:00Z", + "sourceMode": "included", + "content": {"memory": 2, "responses": 0, "sessions": 0}, + } + with zipfile.ZipFile(destination, "w") as archive: + archive.writestr("manifest.json", json.dumps(manifest)) + archive.writestr("memory/one.md", "one") + + with pytest.raises(BackupFormatError, match="summary"): + inspect_import_source(str(destination)) + + def test_rejects_duplicate_paths_even_when_case_differs(self, tmp_path: Path): + destination = tmp_path / "duplicates.zip" + manifest = { + "schema": BACKUP_SCHEMA, + "formatVersion": BACKUP_FORMAT_VERSION, + "exportedAt": "2026-08-22T00:00:00Z", + "sourceMode": "included", + "content": {"memory": 2, "responses": 0, "sessions": 0}, + } + with zipfile.ZipFile(destination, "w") as archive: + archive.writestr("manifest.json", json.dumps(manifest)) + archive.writestr("memory/Note.md", "one") + archive.writestr("memory/note.md", "two") + + with pytest.raises(BackupFormatError, match="duplicate"): + inspect_import_source(str(destination)) + + def test_accepts_session_only_legacy_folder(self, tmp_path: Path): + source = tmp_path / "legacy" + (source / "temp").mkdir(parents=True) + (source / "temp" / "desktop_sessions.json").write_text( + json.dumps([{"id": "sess-only", "messages": [], "msg_seq": 0}]), + encoding="utf-8", + ) + + result = inspect_import_source(str(source)) + + assert result["sourceType"] == "legacyFolder" + assert result["content"] == {"memory": 0, "responses": 0, "sessions": 1} + + def test_rejects_empty_legacy_folder_and_empty_backup(self, tmp_path: Path): + source = tmp_path / "legacy" + (source / "temp").mkdir(parents=True) + (source / "temp" / "desktop_sessions.json").write_text("[]", encoding="utf-8") + with pytest.raises(BackupFormatError, match="no importable data"): + inspect_import_source(str(source)) + + backup = tmp_path / "empty.zip" + manifest = { + "schema": BACKUP_SCHEMA, + "formatVersion": BACKUP_FORMAT_VERSION, + "exportedAt": "2026-08-22T00:00:00Z", + "sourceMode": "included", + "content": {"memory": 0, "responses": 0, "sessions": 0}, + } + with zipfile.ZipFile(backup, "w") as archive: + archive.writestr("manifest.json", json.dumps(manifest)) + with pytest.raises(BackupFormatError, match="no importable data"): + inspect_import_source(str(backup)) + + def test_accepts_generated_sessions_only_zip(self, tmp_path: Path): + source = tmp_path / "source" + sessions = source / "temp" / "desktop_sessions" + sessions.mkdir(parents=True) + (sessions / "sess-only.json").write_text( + json.dumps({"id": "sess-only", "messages": [], "msg_seq": 0}), + encoding="utf-8", + ) + backup = tmp_path / "sessions-only.zip" + + export_data_backup(str(source), str(backup), "included") + inspection = inspect_import_source(str(backup)) + + assert inspection["content"] == {"memory": 0, "responses": 0, "sessions": 1} + + +class TestDataBackupImport: + def test_sessions_only_backup_round_trips(self, tmp_path: Path): + source = tmp_path / "source" + sessions = source / "temp" / "desktop_sessions" + sessions.mkdir(parents=True) + (sessions / "sess-only.json").write_text( + json.dumps({"id": "sess-only", "messages": [], "msg_seq": 0}), + encoding="utf-8", + ) + backup = tmp_path / "sessions-only.zip" + export_data_backup(str(source), str(backup), "included") + target = tmp_path / "target" + target.mkdir() + + with materialize_import_source(str(backup)) as extracted: + result = merge_data_files(str(extracted), str(target)) + + assert result["sessionsAdded"] == 1 + assert result["memoryCopied"] == 0 + assert (target / "temp" / "desktop_sessions" / "sess-only.json").is_file() + + def test_materializes_backup_and_applies_the_full_merge_contract(self, tmp_path: Path): + source = tmp_path / "source" + source.mkdir() + _seed_data(source) + backup = tmp_path / "backup.zip" + export_data_backup(str(source), str(backup), "included") + + target = tmp_path / "target" + (target / "memory").mkdir(parents=True) + (target / "memory" / "notes.md").write_text("current", encoding="utf-8") + with materialize_import_source(str(backup)) as extracted: + result = merge_data_files(str(extracted), str(target)) + assert (extracted / "temp" / "desktop_sessions" / "sess-one.json").is_file() + + assert result.keys() >= { + "ok", + "memoryCopied", + "responsesCopied", + "responsesSkipped", + "sessionsAdded", + "sessionsSkipped", + "sessionsFileFound", + "backupDir", + } + assert result["memoryCopied"] == 2 + assert result["memorySkipped"] == 0 + assert result["responsesCopied"] == 1 + assert result["sessionsAdded"] == 1 + assert result["sessionsSkipped"] == 0 + assert result["sessionsFileFound"] is True + assert (target / "memory" / "notes.md").read_text(encoding="utf-8") == "memory" + assert (target / "memory" / "nested" / "facts.json").is_file() + assert (target / "temp" / "desktop_sessions" / "sess-one.json").is_file() + backup_dir = Path(result["backupDir"]) + assert backup_dir.is_dir() + assert (backup_dir / "memory" / "notes.md").read_text(encoding="utf-8") == "current" + + def test_memory_is_source_wins_responses_are_add_only(self, tmp_path: Path): + source = tmp_path / "source" + target = tmp_path / "target" + (source / "memory").mkdir(parents=True) + (source / "memory" / "same.md").write_text("new", encoding="utf-8") + (source / "memory" / "added.md").write_text("added", encoding="utf-8") + (source / "temp" / "model_responses").mkdir(parents=True) + (source / "temp" / "model_responses" / "same.json").write_text("new", encoding="utf-8") + (source / "temp" / "model_responses" / "added.json").write_text("added", encoding="utf-8") + (target / "memory").mkdir(parents=True) + (target / "memory" / "same.md").write_text("old", encoding="utf-8") + (target / "temp" / "model_responses").mkdir(parents=True) + (target / "temp" / "model_responses" / "same.json").write_text("old", encoding="utf-8") + + result = merge_data_files(str(source), str(target)) + + assert result["memoryCopied"] == 2 + assert result["responsesCopied"] == 1 + assert result["responsesSkipped"] == 1 + assert (target / "memory" / "same.md").read_text(encoding="utf-8") == "new" + assert (target / "memory" / "added.md").read_text(encoding="utf-8") == "added" + assert (target / "temp" / "model_responses" / "same.json").read_text(encoding="utf-8") == "old" + assert (target / "temp" / "model_responses" / "added.json").read_text(encoding="utf-8") == "added" + assert (Path(result["backupDir"]) / "memory" / "same.md").read_text(encoding="utf-8") == "old" + + def test_sessions_dedupe_by_desktop_id_across_new_and_legacy_stores(self, tmp_path: Path): + source = tmp_path / "source" + target = tmp_path / "target" + (source / "memory").mkdir(parents=True) + source_sessions = source / "temp" / "desktop_sessions" + source_sessions.mkdir(parents=True) + (source_sessions / "existing.json").write_text( + json.dumps({"id": "sess-existing", "messages": []}), encoding="utf-8" + ) + (source_sessions / "new.json").write_text( + json.dumps({"id": "sess-new", "messages": []}), encoding="utf-8" + ) + (source_sessions / "tui.json").write_text( + json.dumps({"id": "tui_worker", "messages": []}), encoding="utf-8" + ) + (source_sessions / "corrupt.json").write_text("{bad", encoding="utf-8") + (source / "temp" / "desktop_sessions.json").write_text( + json.dumps([ + {"id": "sess-new", "messages": []}, + {"id": "sess-legacy", "messages": []}, + {"id": "../../escape", "messages": []}, + ]), + encoding="utf-8", + ) + target_sessions = target / "temp" / "desktop_sessions" + target_sessions.mkdir(parents=True) + (target_sessions / "different-name.json").write_text( + json.dumps({"id": "sess-existing", "messages": []}), encoding="utf-8" + ) + + result = merge_data_files( + str(source), str(target), existing_session_ids={"sess-in-memory"} + ) + + assert result["sessionsAdded"] == 2 + assert result["sessionsSkipped"] == 5 + assert result["sessionsFileFound"] is True + assert (target_sessions / "sess-new.json").is_file() + assert (target_sessions / "sess-legacy.json").is_file() + assert not (tmp_path / "escape.json").exists() + + def test_invalid_session_schema_is_skipped_and_valid_record_is_canonical( + self, tmp_path: Path + ): + source = tmp_path / "source" + sessions = source / "temp" / "desktop_sessions" + sessions.mkdir(parents=True) + records = { + "int-id.json": {"id": 7, "messages": [], "msg_seq": 0}, + "nan-time.json": { + "id": "sess-nan", + "messages": [], + "msg_seq": 0, + "updated_at": float("nan"), + }, + "bad-seq.json": {"id": "sess-seq", "messages": [], "msg_seq": -1}, + "bad-messages.json": { + "id": "sess-msg", + "messages": ["not-an-object"], + "msg_seq": 0, + }, + "valid.json": { + "id": "sess-valid", + "title": "Valid", + "messages": [{"id": 1, "role": "user", "content": "hi"}], + "msg_seq": 1, + "created_at": 10, + "updated_at": 11.5, + "llm_history": [{"role": "user", "content": "hi"}], + "unknown": "drop-me", + }, + } + for name, record in records.items(): + (sessions / name).write_text(json.dumps(record), encoding="utf-8") + target = tmp_path / "target" + target.mkdir() + + result = merge_data_files(str(source), str(target)) + + assert result["sessionsAdded"] == 1 + assert result["sessionsSkipped"] == 4 + document = json.loads( + (target / "temp" / "desktop_sessions" / "sess-valid.json").read_text( + encoding="utf-8" + ) + ) + assert document["id"] == "sess-valid" + assert document["updated_at"] == 11.5 + assert document["messages"][0]["role"] == "user" + assert "unknown" not in document + + def test_mocked_windows_reparse_source_is_rejected_before_read( + self, tmp_path: Path, monkeypatch: pytest.MonkeyPatch + ): + source = tmp_path / "source" + memory = source / "memory" + memory.mkdir(parents=True) + (memory / "secret.md").write_text("secret", encoding="utf-8") + destination = tmp_path / "backup.zip" + real_check = data_backup._is_link_or_reparse + + monkeypatch.setattr( + data_backup, + "_is_link_or_reparse", + lambda path: Path(path) == memory or real_check(Path(path)), + ) + + with pytest.raises(ValueError, match="safe directory"): + export_data_backup(str(source), str(destination), "included") + assert not destination.exists() + + def test_mocked_windows_reparse_target_ancestor_is_rejected_before_write( + self, tmp_path: Path, monkeypatch: pytest.MonkeyPatch + ): + source = tmp_path / "source" + target = tmp_path / "target" + (source / "memory").mkdir(parents=True) + (source / "memory" / "new.md").write_text("new", encoding="utf-8") + target_memory = target / "memory" + target_memory.mkdir(parents=True) + (target_memory / "old.md").write_text("old", encoding="utf-8") + real_check = data_backup._is_link_or_reparse + + monkeypatch.setattr( + data_backup, + "_is_link_or_reparse", + lambda path: Path(path) == target_memory or real_check(Path(path)), + ) + + with pytest.raises(ValueError, match="safe directory"): + merge_data_files(str(source), str(target)) + assert (target_memory / "old.md").read_text(encoding="utf-8") == "old" + assert not (target_memory / "new.md").exists() + + def test_empty_target_needs_no_backup_and_reports_missing_sessions(self, tmp_path: Path): + source = tmp_path / "source" + target = tmp_path / "target" + (source / "memory").mkdir(parents=True) + (source / "memory" / "one.md").write_text("one", encoding="utf-8") + target.mkdir() + + result = merge_data_files(str(source), str(target)) + + assert result["backupDir"] == "" + assert result["sessionsAdded"] == 0 + assert result["sessionsSkipped"] == 0 + assert result["sessionsFileFound"] is False + + def test_backup_failure_never_writes_the_destination( + self, tmp_path: Path, monkeypatch: pytest.MonkeyPatch + ): + source = tmp_path / "source" + target = tmp_path / "target" + (source / "memory").mkdir(parents=True) + (source / "memory" / "same.md").write_text("new", encoding="utf-8") + (source / "temp" / "model_responses").mkdir(parents=True) + (source / "temp" / "model_responses" / "added.json").write_text("new", encoding="utf-8") + (target / "memory").mkdir(parents=True) + (target / "memory" / "same.md").write_text("old", encoding="utf-8") + + def fail_backup(*_args, **_kwargs): + raise OSError("backup disk full") + + monkeypatch.setattr(data_backup, "_create_memory_backup", fail_backup) + + with pytest.raises(OSError, match="backup disk full"): + merge_data_files(str(source), str(target)) + + assert (target / "memory" / "same.md").read_text(encoding="utf-8") == "old" + assert not (target / "temp" / "model_responses" / "added.json").exists() + + def test_staging_copy_failure_cleans_up_without_partial_writes( + self, tmp_path: Path, monkeypatch: pytest.MonkeyPatch + ): + source = tmp_path / "source" + target = tmp_path / "target" + responses = source / "temp" / "model_responses" + responses.mkdir(parents=True) + (responses / "a-ok.json").write_text("ok", encoding="utf-8") + (responses / "z-fail.json").write_text("fail", encoding="utf-8") + target.mkdir() + real_copy2 = data_backup.shutil.copy2 + + def fail_second_copy(source_path, destination_path, *args, **kwargs): + if Path(source_path).name == "z-fail.json": + raise OSError("copy failed") + return real_copy2(source_path, destination_path, *args, **kwargs) + + monkeypatch.setattr(data_backup.shutil, "copy2", fail_second_copy) + + with pytest.raises(OSError, match="copy failed"): + merge_data_files(str(source), str(target)) + + assert not (target / "temp" / "model_responses" / "a-ok.json").exists() + assert not list(target.glob(".genericagent-memory-import-*")) + + def test_activation_partial_failure_rolls_memory_and_added_files_back( + self, tmp_path: Path, monkeypatch: pytest.MonkeyPatch + ): + source = tmp_path / "source" + target = tmp_path / "target" + (source / "memory").mkdir(parents=True) + (source / "memory" / "same.md").write_text("new", encoding="utf-8") + (source / "temp" / "model_responses").mkdir(parents=True) + (source / "temp" / "model_responses" / "fail.json").write_text("new", encoding="utf-8") + (target / "memory").mkdir(parents=True) + (target / "memory" / "same.md").write_text("old", encoding="utf-8") + failing_target = target / "temp" / "model_responses" / "fail.json" + + real_install = data_backup._install_file_add_only + + def fail_response_activation(source_path, destination_path): + if Path(destination_path) == failing_target: + raise OSError("activation failed") + return real_install(source_path, destination_path) + + monkeypatch.setattr( + data_backup, "_install_file_add_only", fail_response_activation + ) + + with pytest.raises(OSError, match="activation failed"): + merge_data_files(str(source), str(target)) + + assert (target / "memory" / "same.md").read_text(encoding="utf-8") == "old" + assert not failing_target.exists() + backups = list((target / "temp").glob("memory_import_backup_*")) + assert len(backups) == 1 + assert (backups[0] / "memory" / "same.md").read_text(encoding="utf-8") == "old" + + def test_add_only_install_falls_back_on_filesystems_without_hard_links( + self, tmp_path: Path, monkeypatch: pytest.MonkeyPatch + ): + source = tmp_path / "source" + target = tmp_path / "target" + responses = source / "temp" / "model_responses" + responses.mkdir(parents=True) + (responses / "portable.json").write_text("portable", encoding="utf-8") + target.mkdir() + + def unsupported_link(*_args, **_kwargs): + raise OSError(data_backup.errno.EOPNOTSUPP, "hard links unsupported") + + monkeypatch.setattr(data_backup.os, "link", unsupported_link) + + result = merge_data_files(str(source), str(target)) + + assert result["responsesCopied"] == 1 + assert ( + target / "temp" / "model_responses" / "portable.json" + ).read_text(encoding="utf-8") == "portable" + + def test_concurrent_response_creation_is_never_overwritten( + self, tmp_path: Path, monkeypatch: pytest.MonkeyPatch + ): + source = tmp_path / "source" + target = tmp_path / "target" + (source / "memory").mkdir(parents=True) + (source / "memory" / "same.md").write_text("new", encoding="utf-8") + responses = source / "temp" / "model_responses" + responses.mkdir(parents=True) + (responses / "race.json").write_text("import", encoding="utf-8") + (target / "memory").mkdir(parents=True) + (target / "memory" / "same.md").write_text("old", encoding="utf-8") + racing_target = target / "temp" / "model_responses" / "race.json" + real_link = data_backup.os.link + + def collide_then_link(source_path, destination_path, **kwargs): + destination = Path(destination_path) + if destination == racing_target: + destination.write_text("concurrent", encoding="utf-8") + return real_link(source_path, destination_path, **kwargs) + + monkeypatch.setattr(data_backup.os, "link", collide_then_link) + + with pytest.raises(FileExistsError): + merge_data_files(str(source), str(target)) + + assert racing_target.read_text(encoding="utf-8") == "concurrent" + assert (target / "memory" / "same.md").read_text(encoding="utf-8") == "old" + + def test_memory_backup_refuses_symlinked_temp_directory(self, tmp_path: Path): + source = tmp_path / "source" + target = tmp_path / "target" + outside = tmp_path / "outside" + (source / "memory").mkdir(parents=True) + (source / "memory" / "same.md").write_text("new", encoding="utf-8") + (target / "memory").mkdir(parents=True) + (target / "memory" / "same.md").write_text("old", encoding="utf-8") + outside.mkdir() + (target / "temp").symlink_to(outside, target_is_directory=True) + + with pytest.raises(ValueError, match="backup destination"): + merge_data_files(str(source), str(target)) + + assert (target / "memory" / "same.md").read_text(encoding="utf-8") == "old" + assert list(outside.iterdir()) == [] diff --git a/frontends/tests/test_ga_root_contract.py b/frontends/tests/test_ga_root_contract.py new file mode 100644 index 000000000..f1154fabd --- /dev/null +++ b/frontends/tests/test_ga_root_contract.py @@ -0,0 +1,144 @@ +"""Contracts for the package-owned bridge/conductor plus external GA_ROOT architecture.""" +from __future__ import annotations + +import ast +import json +import os +import subprocess +import sys +from pathlib import Path + + +ROOT = Path(__file__).resolve().parent.parent.parent +BRIDGE_SOURCE = (ROOT / "frontends" / "desktop_bridge.py").read_text(encoding="utf-8") +CONDUCTOR_SOURCE = (ROOT / "frontends" / "conductor.py").read_text(encoding="utf-8") +HUB_SOURCE = (ROOT / "frontends" / "hub.py").read_text(encoding="utf-8") +PROBE = ROOT / "frontends" / "ga_contract_probe.py" + + +def _load_function(source: str, name: str, namespace: dict): + tree = ast.parse(source) + node = next(item for item in tree.body if isinstance(item, ast.FunctionDef) and item.name == name) + exec(compile(ast.Module(body=[node], type_ignores=[]), "contract.py", "exec"), namespace) + return namespace[name] + + +def test_conductor_prefers_a_valid_external_ga_root(tmp_path, monkeypatch): + external = tmp_path / "external" + external.mkdir() + (external / "agentmain.py").write_text("# core\n", encoding="utf-8") + monkeypatch.setenv("GA_ROOT", str(external)) + resolve = _load_function(CONDUCTOR_SOURCE, "_resolve_ga_root", {"os": os}) + + assert resolve() == str(external.resolve()) + + +def test_bridge_discovers_package_conductor_but_external_scheduler(tmp_path): + external = tmp_path / "external" + (external / "reflect").mkdir(parents=True) + (external / "reflect" / "scheduler.py").write_text("# scheduler\n", encoding="utf-8") + bundle_frontends = tmp_path / "bundle" / "frontends" + bundle_frontends.mkdir(parents=True) + bundled_conductor = bundle_frontends / "conductor.py" + bundled_conductor.write_text("# conductor\n", encoding="utf-8") + discover = _load_function( + BRIDGE_SOURCE, + "discover_extra_services", + { + "Path": Path, + "List": list, + "APP_DIR": bundle_frontends, + "sys": sys, + "_configured_conductor_port": lambda: 29890, + }, + ) + + catalog = {item["id"]: item for item in discover(external)} + + assert catalog["frontends/conductor.py"]["cmd"][1] == str(bundled_conductor) + assert catalog["frontends/conductor.py"]["cmd"][-2:] == ["--port", "29890"] + assert catalog["frontends/conductor.py"]["port"] == 29890 + assert catalog["reflect/scheduler.py"]["cmd"][-1] == "reflect/scheduler.py" + + +def test_service_spawn_injects_effective_ga_root(): + tree = ast.parse(BRIDGE_SOURCE) + service_manager = next( + item for item in tree.body if isinstance(item, ast.ClassDef) and item.name == "ServiceManager" + ) + start_service = next( + item for item in service_manager.body + if isinstance(item, ast.FunctionDef) and item.name == "start_service" + ) + string_constants = { + node.value for node in ast.walk(start_service) + if isinstance(node, ast.Constant) and isinstance(node.value, str) + } + + assert "GA_ROOT" in string_constants + + +def test_missing_optional_p2p_dependencies_cannot_abort_hub_setup(): + tree = ast.parse(HUB_SOURCE) + p2p_import = next( + node + for node in ast.walk(tree) + if isinstance(node, ast.ImportFrom) and node.module == "hub_p2p" + ) + guard = next( + node + for node in ast.walk(tree) + if isinstance(node, ast.Try) and p2p_import in set(ast.walk(node)) + ) + + assert any( + handler.type is None + or (isinstance(handler.type, ast.Name) and handler.type.id == "Exception") + for handler in guard.handlers + ) + + +def _run_probe(core: Path) -> tuple[subprocess.CompletedProcess[str], dict]: + completed = subprocess.run( + [sys.executable, str(PROBE), str(core)], + check=False, + capture_output=True, + text=True, + ) + return completed, json.loads(completed.stdout.strip().splitlines()[-1]) + + +def test_compatibility_probe_rejects_a_core_missing_generic_agent(tmp_path): + (tmp_path / "agentmain.py").write_text("# no GenericAgent\n", encoding="utf-8") + (tmp_path / "llmcore.py").write_text( + "def reload_mykeys(): pass\ndef _record_usage(usage, api_mode): pass\n", + encoding="utf-8", + ) + + completed, verdict = _run_probe(tmp_path) + + assert completed.returncode == 1 + assert verdict == {"ok": False, "missing": ["agentmain.GenericAgent"], "error": ""} + + +def test_compatibility_probe_accepts_the_desktop_core_contract(tmp_path): + (tmp_path / "agentmain.py").write_text( + """class GenericAgent: + def run(self): pass + def put_task(self, prompt, images=None, source=None): pass + def next_llm(self): pass + def load_llm_sessions(self): pass + def get_llm_name(self, model=None): pass + def abort(self): pass +""", + encoding="utf-8", + ) + (tmp_path / "llmcore.py").write_text( + "def reload_mykeys(): pass\ndef _record_usage(usage, api_mode): pass\n", + encoding="utf-8", + ) + + completed, verdict = _run_probe(tmp_path) + + assert completed.returncode == 0 + assert verdict == {"ok": True, "missing": [], "error": ""} diff --git a/frontends/tests/test_release_qualification.py b/frontends/tests/test_release_qualification.py new file mode 100644 index 000000000..8f65dbf63 --- /dev/null +++ b/frontends/tests/test_release_qualification.py @@ -0,0 +1,606 @@ +import importlib.util +import io +import json +import plistlib +import urllib.error +import urllib.request +from pathlib import Path +from types import SimpleNamespace + +import pytest + + +ROOT = Path(__file__).resolve().parents[2] + + +def load_module(name: str, relative: str): + path = ROOT / relative + spec = importlib.util.spec_from_file_location(name, path) + module = importlib.util.module_from_spec(spec) + assert spec.loader is not None + spec.loader.exec_module(module) + return module + + +journey = load_module( + "run_release_qualification", + "frontends/desktop/release_qualification/run_release_qualification.py", +) +evidence = load_module( + "verify_release_evidence", + "frontends/desktop/release_qualification/verify_release_evidence.py", +) + + +def complete_report(platform: str = "linux"): + checks = {name: True for name in evidence.COMMON_CHECKS} + isolated_port = 29890 + ownership = { + scenario: owned_conductor(port=isolated_port, pid=44120 + index) + for index, scenario in enumerate(sorted(evidence.SUCCESSFUL_APPLICATION_SCENARIOS)) + } + checks["isolatedConductorOwnership"] = ownership + checks["ownedProcessStops"] = { + scenario: { + "app": 45120 + index * 3, + "bridge": 45121 + index * 3, + "conductor": ownership[scenario]["pid"], + } + for index, scenario in enumerate(sorted(evidence.SUCCESSFUL_APPLICATION_SCENARIOS)) + } + checks["portRecovery"] = "release-then-production-restart" + if platform == "macos": + checks["macAppImmutable"] = True + bootstrap = { + name: {"phase": "failed" if name == "foreign-port" else "ready"} + for name in ( + "first-launch", + "warm-restart", + "foreign-port", + "after-port-release", + "relocated", + "stale-override", + ) + } + return { + "expectedCommit": "abc1234", + "releaseVersion": "0.2.0", + "artifact": {"sha256": "f" * 64}, + "environment": {"isolatedConductorPort": isolated_port}, + "success": True, + "checks": checks, + "bootstrap": bootstrap, + "manualChecklist": {"nativeVisuals": "pass"}, + "screenshots": ["ready.png", "foreign.png"], + } + + +def test_candidate_report_contract_accepts_complete_platform_evidence(): + assert evidence.assert_report("linux", complete_report(), "abc1234") == [] + assert evidence.assert_report("macos", complete_report("macos"), "abc1234") == [] + + +def test_automated_gate_ignores_manual_evidence_but_rejects_commit_mismatch(): + report = complete_report() + report["manualChecklist"]["nativeVisuals"] = "pending" + report["screenshots"] = [] + assert evidence.assert_report("linux", report, "abc1234") == [] + + report["expectedCommit"] = "different" + failures = evidence.assert_report("linux", report, "abc1234") + assert any("commit" in failure for failure in failures) + + +def test_combined_gate_ignores_platform_and_windows_native_manual_review( + tmp_path, monkeypatch +): + report_paths = {} + for platform in ("windows", "linux", "macos"): + report = complete_report(platform) + report["manualChecklist"] = {"nativeVisuals": "pending"} + report["screenshots"] = [] + path = tmp_path / f"{platform}.json" + path.write_text(json.dumps(report), encoding="utf-8") + report_paths[platform] = path + + windows_native = tmp_path / "windows-native.json" + windows_native.write_text( + json.dumps( + { + "success": True, + "checks": {"portConflictRecovery": True, "settingsRestored": True}, + "manualChecklist": {"nativeVisuals": "manual"}, + } + ), + encoding="utf-8", + ) + output = tmp_path / "manifest.json" + monkeypatch.setattr( + evidence.sys, + "argv", + [ + "verify_release_evidence.py", + "--expected-commit", + "abc1234", + "--windows", + str(report_paths["windows"]), + "--linux", + str(report_paths["linux"]), + "--macos", + str(report_paths["macos"]), + "--windows-native-report", + str(windows_native), + "--output", + str(output), + ], + ) + + assert evidence.main() == 0 + assert json.loads(output.read_text(encoding="utf-8"))["gate"] == "pass" + + +def test_candidate_report_contract_rejects_partial_or_unowned_conductor_evidence(): + report = complete_report() + report["checks"]["isolatedConductorOwnership"].pop("relocated") + report["checks"]["ownedProcessStops"]["warm-restart"].pop("conductor") + + failures = evidence.assert_report("linux", report, "abc1234") + + assert any("ownership does not cover every successful launch" in item for item in failures) + assert any("invalid owned process stop evidence for warm-restart" in item for item in failures) + + +def test_stdlib_fake_model_emits_sse_and_redacts_auth_in_transcript(): + fake = journey.FakeOpenAI() + fake.start() + try: + request = urllib.request.Request( + fake.base_url + "/v1/chat/completions", + data=json.dumps({"model": "e2e-model"}).encode(), + headers={"Authorization": "Bearer secret", "Content-Type": "application/json"}, + method="POST", + ) + with urllib.request.urlopen(request, timeout=5) as response: + body = response.read().decode() + assert "Harness reply" in body + assert "[DONE]" in body + assert fake.transcript == [ + { + "path": "/v1/chat/completions", + "model": "e2e-model", + "authorization": "[redacted]", + "at": fake.transcript[0]["at"], + } + ] + finally: + fake.stop() + + +def write_info_plist(root: Path, **overrides): + contents = root / "Contents" + contents.mkdir(parents=True, exist_ok=True) + values = { + "CFBundleShortVersionString": "0.2.0", + "CFBundleVersion": "0.2.0", + **overrides, + } + with (contents / "Info.plist").open("wb") as stream: + plistlib.dump(values, stream) + + +def test_macos_package_version_comes_from_both_native_bundle_keys(tmp_path): + write_info_plist(tmp_path) + assert journey.read_macos_bundle_versions(tmp_path) == ("0.2.0", "0.2.0") + + +@pytest.mark.parametrize("key", ["CFBundleShortVersionString", "CFBundleVersion"]) +@pytest.mark.parametrize("value", ["0.2.1", 200]) +def test_macos_package_version_rejects_wrong_or_non_string_keys(tmp_path, key, value): + write_info_plist(tmp_path, **{key: value}) + with pytest.raises(journey.JourneyFailure, match=key): + journey.read_macos_bundle_versions(tmp_path) + + +@pytest.mark.parametrize("key", ["CFBundleShortVersionString", "CFBundleVersion"]) +def test_macos_package_version_rejects_missing_keys(tmp_path, key): + write_info_plist(tmp_path) + path = tmp_path / "Contents" / "Info.plist" + with path.open("rb") as stream: + values = plistlib.load(stream) + del values[key] + with path.open("wb") as stream: + plistlib.dump(values, stream) + with pytest.raises(journey.JourneyFailure, match=key): + journey.read_macos_bundle_versions(tmp_path) + + +@pytest.mark.parametrize("payload", [b"not a plist", b"", plistlib.dumps([])]) +def test_macos_package_version_rejects_invalid_or_empty_plist(tmp_path, payload): + contents = tmp_path / "Contents" + contents.mkdir() + (contents / "Info.plist").write_bytes(payload) + with pytest.raises(journey.JourneyFailure, match="missing or invalid"): + journey.read_macos_bundle_versions(tmp_path) + + +def test_macos_package_version_rejects_missing_plist(tmp_path): + with pytest.raises(journey.JourneyFailure, match="missing or invalid"): + journey.read_macos_bundle_versions(tmp_path) + + +def test_package_shape_rejects_excluded_source_package_json(tmp_path): + package_root = tmp_path / "GenericAgent.app" + runtime_root = package_root / "Contents" / "Resources" / "runtime" + application = package_root / "Contents" / "MacOS" / "GenericAgent" + for path in [ + application, + runtime_root / "app" / "agentmain.py", + runtime_root / "app" / "frontends" / "desktop_bridge.py", + runtime_root / "app" / "frontends" / "desktop" / "static" / "index.html", + runtime_root / "python" / "bin" / "python3", + runtime_root / ".prepared", + runtime_root / "app" / "frontends" / "desktop" / "package.json", + ]: + path.parent.mkdir(parents=True, exist_ok=True) + path.write_text("{}", encoding="utf-8") + write_info_plist(package_root) + + candidate = object.__new__(journey.Journey) + candidate.args = type("Args", (), {"platform": "macos"})() + candidate.package_root = package_root + candidate.runtime_root = runtime_root + candidate.application = application + candidate.report = {"checks": {}} + + with pytest.raises(journey.JourneyFailure, match="excluded Desktop source metadata"): + candidate.check_package_shape() + + (runtime_root / "app" / "frontends" / "desktop" / "package.json").unlink() + candidate.check_package_shape() + assert candidate.report["checks"] == { + "packagedVersion": "0.2.0", + "packagedBundleVersion": "0.2.0", + "packageShape": True, + } + + +def chat_snapshot(*, status="idle", unfinished=False): + return { + "status": status, + "hasUnfinishedWork": unfinished, + "messages": [{"role": "assistant", "content": "Harness reply"}], + "lastError": "model failed" if status == "error" else "", + } + + +def test_package_chat_waits_for_the_live_turn_thread_after_reply_and_idle_status(): + assert journey.completed_assistant_reply(chat_snapshot(status="running", unfinished=True)) is None + assert journey.completed_assistant_reply(chat_snapshot(unfinished=True)) is None + assert journey.completed_assistant_reply(chat_snapshot()) == "Harness reply" + + missing_barrier = chat_snapshot() + missing_barrier.pop("hasUnfinishedWork") + assert journey.completed_assistant_reply(missing_barrier) is None + + +@pytest.mark.parametrize("status", ["error", "cancelled"]) +def test_package_chat_fails_immediately_on_terminal_session_state(status): + with pytest.raises(journey.JourneyFailure, match=f"terminal state {status}"): + journey.completed_assistant_reply(chat_snapshot(status=status)) + + +def valid_import_conflict(): + return { + "ok": False, + "error": "managed Desktop services are running", + "code": "maintenance_conflict", + "runningSessions": [], + "runningExtras": ["frontends/conductor.py", "reflect/scheduler.py"], + } + + +def test_package_import_requires_the_exact_running_extras_conflict(): + assert journey.validate_import_maintenance_conflict(409, valid_import_conflict()) == [ + "frontends/conductor.py", + "reflect/scheduler.py", + ] + + +def test_package_request_reads_the_expected_http_error_json(monkeypatch): + payload = {**valid_import_conflict(), "runningExtras": ["frontends/conductor.py"]} + error = urllib.error.HTTPError( + "http://127.0.0.1:14168/memory/import", + 409, + "Conflict", + {}, + io.BytesIO(json.dumps(payload).encode("utf-8")), + ) + + def reject(*_args, **_kwargs): + raise error + + monkeypatch.setattr(urllib.request, "urlopen", reject) + status, response = journey.request_json_with_status( + "POST", + "/memory/import", + {"sourceDir": "/source"}, + ) + + assert status == 409 + assert response == payload + + +@pytest.mark.parametrize( + ("status", "payload"), + [ + (200, valid_import_conflict()), + (409, {**valid_import_conflict(), "ok": True}), + (409, {**valid_import_conflict(), "code": "other_conflict"}), + (409, {**valid_import_conflict(), "runningSessions": ["sess-live"]}), + (409, {**valid_import_conflict(), "runningExtras": []}), + (409, {**valid_import_conflict(), "runningExtras": ["reflect/scheduler.py"]}), + (409, {**valid_import_conflict(), "runningExtras": ["frontends/conductor.py"] * 2}), + ], +) +def test_package_import_rejects_inexact_maintenance_conflicts(status, payload): + with pytest.raises(journey.JourneyFailure): + journey.validate_import_maintenance_conflict(status, payload) + + +def stopped_panel(*services): + return {"services": list(services)} + + +def owned_conductor(port=29890, pid=44123): + return { + "id": "frontends/conductor.py", + "status": "running", + "running": True, + "owned": True, + "external": False, + "port": port, + "pid": pid, + } + + +def test_package_journey_requires_exact_owned_isolated_conductor_state(): + state = owned_conductor() + payload = stopped_panel(state) + assert journey.verified_owned_conductor(payload, 29890, True) is state + assert journey.verified_owned_conductor(payload, 29890, False) is None + + mutations = [ + {**state, "status": "error"}, + {**state, "running": False}, + {**state, "owned": False}, + {**state, "external": True}, + {**state, "port": 8900}, + {**state, "pid": None}, + ] + for mutation in mutations: + assert journey.verified_owned_conductor(stopped_panel(mutation), 29890, True) is None + assert journey.verified_owned_conductor(stopped_panel(state, state), 29890, True) is None + + +def test_package_start_injects_only_the_isolated_e2e_conductor_port(tmp_path, monkeypatch): + candidate = object.__new__(journey.Journey) + candidate.process = None + candidate.package_root = tmp_path + candidate.application = tmp_path / "GenericAgent" + candidate.report_dir = tmp_path / "reports" + candidate.conductor_port = 29890 + candidate.process_log = None + candidate.report = {"pids": []} + captured = {} + + class FakeProcess: + pid = 44120 + + def fake_popen(command, **kwargs): + captured["command"] = command + captured.update(kwargs) + return FakeProcess() + + monkeypatch.setattr(journey, "loopback_port_is_free", lambda port: port == 29890) + monkeypatch.setattr(journey.subprocess, "Popen", fake_popen) + + candidate.start_application("first-launch") + candidate.process_log.close() + + assert captured["env"]["GA_DESKTOP_E2E_CONDUCTOR_PORT"] == "29890" + assert captured["env"]["GA_DESKTOP_E2E_REPORT_DIR"].endswith( + "bootstrap/first-launch" + ) + assert candidate.report["pids"] == [{"scenario": "first-launch", "app": 44120}] + + +def test_isolated_conductor_allocator_rejects_active_and_default_product_ports(monkeypatch): + candidates = iter([24170, 14168, 8900, 29890]) + + class FakeReservation: + def __enter__(self): + return self + + def __exit__(self, *_args): + return False + + def bind(self, _address): + return None + + def getsockname(self): + return ("127.0.0.1", next(candidates)) + + monkeypatch.setattr(journey, "BRIDGE_PORT", 24170) + monkeypatch.setattr(journey.socket, "socket", lambda *_args, **_kwargs: FakeReservation()) + + assert journey.allocate_isolated_conductor_port() == 29890 + + +def test_every_successful_ready_snapshot_records_its_owned_conductor_pid( + tmp_path, monkeypatch +): + candidate = object.__new__(journey.Journey) + candidate.args = SimpleNamespace(start_timeout=1, expected_commit="abc1234") + candidate.report_dir = tmp_path / "report" + candidate.external_root = tmp_path / "external" + candidate.runtime_root = tmp_path / "package" / "runtime" + candidate.conductor_port = 29890 + candidate.report = { + "bootstrap": {}, + "identities": {}, + "pids": [{"scenario": "warm-restart", "app": 44120}], + "checks": {}, + } + expected_app_dir = candidate.runtime_root / "app" / "frontends" + latest = candidate.scenario_dir("warm-restart") / "bootstrap-latest.json" + journey.write_json(latest, {"phase": "ready"}) + + def fake_request(_method, path, body=None, timeout=5.0): + del body, timeout + if path == "/services/identity": + return { + "ga_root": str(candidate.external_root), + "app_dir": str(expected_app_dir), + "pid": 44121, + "build_id": "desktop-abc1234", + } + if path == "/services/panel": + return stopped_panel(owned_conductor(pid=44122)) + raise AssertionError(path) + + monkeypatch.setattr(journey, "request_json", fake_request) + monkeypatch.setattr( + journey, + "loopback_port_is_free", + lambda port: False if port == 29890 else True, + ) + + candidate.wait_ready("warm-restart", candidate.external_root) + + assert candidate.report["pids"][-1]["bridge"] == 44121 + assert candidate.report["pids"][-1]["conductor"] == 44122 + assert candidate.report["checks"]["isolatedConductorOwnership"] == { + "warm-restart": owned_conductor(pid=44122) + } + + +def test_package_import_waits_until_every_reported_extra_is_offline(): + ids = ["frontends/conductor.py", "reflect/scheduler.py"] + complete = stopped_panel( + {"id": "frontends/conductor.py", "running": False, "status": "offline"}, + {"id": "reflect/scheduler.py", "running": False, "status": "offline"}, + ) + assert journey.verified_stopped_extras_panel(complete, ids) is complete + assert journey.verified_stopped_extras_panel( + stopped_panel({"id": ids[0], "running": False, "status": "offline"}), + ids, + ) is None + assert journey.verified_stopped_extras_panel( + stopped_panel( + {"id": ids[0], "running": False, "status": "offline"}, + {"id": ids[1], "running": True, "status": "running"}, + ), + ids, + ) is None + assert journey.verified_stopped_extras_panel( + stopped_panel( + {"id": ids[0], "running": False, "status": "offline"}, + {"id": ids[1], "running": False, "status": "error"}, + ), + ids, + ) is None + + +def test_real_package_memory_import_stops_reported_extras_before_one_successful_import( + tmp_path, monkeypatch +): + candidate = object.__new__(journey.Journey) + candidate.external_root = tmp_path / "external" + candidate.work_dir = tmp_path / "work" + candidate.fake = SimpleNamespace(transcript=[{"model": "e2e-model"}]) + candidate.report = {"checks": {}} + sid = "sess-package-test" + session_file = candidate.external_root / "temp" / "desktop_sessions" / f"{sid}.json" + imported_sid = "sess-p2-package-imported" + stopped = False + calls = [] + + def fake_request(method, path, body=None, timeout=5.0): + nonlocal stopped + calls.append((method, path)) + if path == "/session/new": + session_file.parent.mkdir(parents=True, exist_ok=True) + session_file.write_text('{"id":"sess-package-test"}\n', encoding="utf-8") + return {"sessionId": sid} + if path == "/upload": + upload = candidate.external_root / "temp" / "desktop_uploads" / "p2.png" + upload.parent.mkdir(parents=True, exist_ok=True) + upload.write_bytes(b"png") + return {"ok": True, "path": str(upload)} + if path.endswith("/prompt"): + return {"ok": True} + if path.endswith("/messages?limit=20"): + return chat_snapshot() + if path == "/services/stop-extras": + stopped = True + return {"ok": True} + if path == "/services/panel": + assert stopped is True + return stopped_panel( + {"id": "frontends/conductor.py", "running": False, "status": "offline"} + ) + if path == "/memory/import": + assert stopped is True + source = Path(body["sourceDir"]) + memory = candidate.external_root / "memory" / "p2-package-memory.txt" + responses = candidate.external_root / "temp" / "model_responses" + backup = candidate.external_root / "temp" / "memory_import_backup_test" + (backup / "memory").mkdir(parents=True) + (backup / "memory" / memory.name).write_bytes(memory.read_bytes()) + memory.write_bytes((source / "memory" / memory.name).read_bytes()) + (responses / "new.json").write_bytes( + (source / "temp" / "model_responses" / "new.json").read_bytes() + ) + imported = candidate.external_root / "temp" / "desktop_sessions" / f"{imported_sid}.json" + imported.write_bytes( + (source / "temp" / "desktop_sessions" / imported.name).read_bytes() + ) + return { + "ok": True, + "memoryCopied": 1, + "responsesCopied": 1, + "responsesSkipped": 1, + "sessionsAdded": 1, + "backupDir": str(backup), + } + raise AssertionError(f"unexpected request: {method} {path}") + + def fake_conflict(method, path, body=None, timeout=5.0): + calls.append((method, f"{path}:expected-conflict")) + memory = candidate.external_root / "memory" / "p2-package-memory.txt" + responses = candidate.external_root / "temp" / "model_responses" + assert memory.read_text(encoding="utf-8") == "before\n" + assert (responses / "shared.json").read_text(encoding="utf-8") == "destination\n" + assert not (responses / "new.json").exists() + assert session_file.read_text(encoding="utf-8") == '{"id":"sess-package-test"}\n' + return 409, {**valid_import_conflict(), "runningExtras": ["frontends/conductor.py"]} + + monkeypatch.setattr(journey, "request_json", fake_request) + monkeypatch.setattr(journey, "request_json_with_status", fake_conflict) + + candidate.run_chat_upload_memory() + + assert calls == [ + ("POST", "/session/new"), + ("POST", "/upload"), + ("POST", f"/session/{sid}/prompt"), + ("GET", f"/session/{sid}/messages?limit=20"), + ("POST", "/memory/import:expected-conflict"), + ("POST", "/services/stop-extras"), + ("GET", "/services/panel"), + ("POST", "/memory/import"), + ] + gate = candidate.report["checks"]["memoryImportMaintenanceGate"] + assert gate["runningSessions"] == [] + assert gate["runningExtras"] == ["frontends/conductor.py"] + assert candidate.report["checks"]["memoryImport"]["ok"] is True diff --git a/frontends/tests/test_tauri_security_contract.py b/frontends/tests/test_tauri_security_contract.py new file mode 100644 index 000000000..ccaa8227c --- /dev/null +++ b/frontends/tests/test_tauri_security_contract.py @@ -0,0 +1,125 @@ +"""Security contracts for the packaged Tauri shell.""" + +from __future__ import annotations + +import json +from pathlib import Path + + +ROOT = Path(__file__).resolve().parent.parent.parent +TAURI_ROOT = ROOT / "frontends" / "desktop" / "src-tauri" + + +def _json(path: Path) -> dict: + return json.loads(path.read_text(encoding="utf-8")) + + +def test_production_csp_is_local_and_keeps_required_tauri_ipc_and_services(): + config = _json(TAURI_ROOT / "tauri.conf.json") + security = config["app"]["security"] + csp = security["csp"] + + assert isinstance(csp, dict) + assert csp["object-src"] == "'none'" + assert csp["base-uri"] == "'self'" + assert csp["form-action"] == "'none'" + assert csp["frame-src"] == "'none'" + assert csp["frame-ancestors"] == "'none'" + assert "'unsafe-inline'" not in csp["script-src"] + assert "'unsafe-eval'" not in csp["script-src"] + + connect_sources = set(csp["connect-src"].split()) + assert { + "'self'", + "ipc:", + "http://ipc.localhost", + "http://127.0.0.1:14168", + "ws://127.0.0.1:14168", + "http://127.0.0.1:8900", + "ws://127.0.0.1:8900", + } <= connect_sources + assert not any("*" in source for source in connect_sources) + assert not any(source.startswith("https://") for source in connect_sources) + + +def test_global_tauri_remains_only_because_compiled_compatibility_page_uses_it(): + config = _json(TAURI_ROOT / "tauri.conf.json") + fallback = (ROOT / "frontends" / "desktop" / "dist" / "fallback.html").read_text( + encoding="utf-8" + ) + + assert config["app"]["withGlobalTauri"] is True + assert "window.__TAURI__" in fallback + + +def test_main_and_setup_capabilities_are_window_scoped_without_remote_ipc_access(): + config = _json(TAURI_ROOT / "tauri.conf.json") + main = _json(TAURI_ROOT / "capabilities" / "default.json") + setup = _json(TAURI_ROOT / "capabilities" / "setup.json") + + assert config["app"]["security"]["capabilities"] == ["default", "setup"] + assert main["windows"] == ["main"] + assert setup["windows"] == ["setup"] + assert "remote" not in main + assert "remote" not in setup + + main_permissions = set(main["permissions"]) + setup_permissions = set(setup["permissions"]) + assert "core:default" not in main_permissions + assert "core:window:default" not in main_permissions + assert "core:webview:default" not in main_permissions + assert "opener:default" not in main_permissions + assert { + "core:window:allow-minimize", + "core:window:allow-toggle-maximize", + "core:window:allow-close", + "core:window:allow-start-dragging", + "opener:allow-open-url", + "opener:allow-default-urls", + } <= main_permissions + + assert { + "allow-start-bridge-with-config", + "allow-retry-bootstrap", + "allow-get-bootstrap-snapshot", + "allow-get-config", + "allow-discover-python-for-project", + "allow-pick-directory", + "allow-pick-python-interpreter", + } <= setup_permissions + assert not setup_permissions.intersection( + { + "allow-export-mykey", + "allow-pick-data-export-path", + "allow-reveal-in-file-manager", + "allow-set-ga-source", + "allow-clear-ga-source", + "opener:allow-open-url", + } + ) + + +def test_e2e_config_only_adds_test_driver_and_dynamic_loopback_connectivity(): + e2e = _json(TAURI_ROOT / "tauri.e2e.conf.json") + security = e2e["app"]["security"] + capabilities = security["capabilities"] + assert capabilities[:2] == ["default", "setup"] + capability = capabilities[2] + + assert capability["identifier"] == "e2e" + assert capability["permissions"] == ["wdio:default"] + + assert set(security["csp"]) == {"connect-src"} + connect_sources = set(security["csp"]["connect-src"].split()) + assert { + "'self'", + "ipc:", + "http://ipc.localhost", + "http://127.0.0.1:*", + "ws://127.0.0.1:*", + } <= connect_sources + assert {source for source in connect_sources if "*" in source} == { + "http://127.0.0.1:*", + "ws://127.0.0.1:*", + } + assert not any(source.startswith("https://") for source in connect_sources)