From 38f2fb4fcd8ff77a137f0315760b15a2f6df2fee Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 30 Oct 2026 00:39:20 +0000 Subject: [PATCH 01/23] Initial plan From 078433ea5a1403a7d58b6962fff90ee79ff350fa Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 30 Oct 2026 00:42:28 +0000 Subject: [PATCH 02/23] Fix quality audit by requiring patched Pillow 13 Co-authored-by: MajoorWaldi <129623145+MajoorWaldi@users.noreply.github.com> --- pyproject.toml | 2 +- requirements.txt | 3 +-- tests/test_runtime_dependencies.py | 19 +++++++++++++++++++ 3 files changed, 21 insertions(+), 3 deletions(-) create mode 100644 tests/test_runtime_dependencies.py diff --git a/pyproject.toml b/pyproject.toml index 62460263..82b05119 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -28,7 +28,7 @@ dependencies = [ "aiohttp>=3.8.0,<4.0.0", "aiosqlite>=0.20.0,<1.0.0", "numpy>=1.24,<3.0.0", - "pillow>=10.0.0,<13.0.0", + "pillow>=13.0.0,<14.0.0", "av>=12.0.0,<18.0.0", "hachoir>=3.3.0,<4.0.0", "send2trash>=1.8.0,<3.0.0", diff --git a/requirements.txt b/requirements.txt index 4d57f8cd..fc884586 100644 --- a/requirements.txt +++ b/requirements.txt @@ -10,8 +10,7 @@ aiosqlite>=0.20.0,<1.0.0 numpy>=1.24,<3.0.0 # Image processing and thumbnails -# Updated for security patches (CVE-2023-50447, CVE-2024-28219) -pillow>=10.0.0,<13.0.0 +pillow>=13.0.0,<14.0.0 # Video encoding/metadata support for the Majoor Save Video node av>=12.0.0,<18.0.0 diff --git a/tests/test_runtime_dependencies.py b/tests/test_runtime_dependencies.py new file mode 100644 index 00000000..cbdc1359 --- /dev/null +++ b/tests/test_runtime_dependencies.py @@ -0,0 +1,19 @@ +from pathlib import Path + +import pytest +from packaging.requirements import Requirement + +ROOT = Path(__file__).resolve().parents[1] + + +@pytest.mark.parametrize( + ("version", "allowed"), + [("10.0.0", False), ("12.3.0", False), ("13.0.0", True)], +) +def test_pillow_security_constraint(version, allowed): + requirements = (ROOT / "requirements.txt").read_text(encoding="utf-8").splitlines() + pillow_requirement = next(line for line in requirements if line.startswith("pillow")) + pillow = Requirement(pillow_requirement) + + assert (version in pillow.specifier) is allowed + assert f'"{pillow_requirement}",' in (ROOT / "pyproject.toml").read_text(encoding="utf-8") From eb0c3408bd310716942ea3a3056c2b343090c226 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 30 Oct 2026 07:33:45 +0000 Subject: [PATCH 03/23] chore(deps): bump actions/setup-python from 7.0.0 to 7.1.0 Bumps [actions/setup-python](https://github.com/actions/setup-python) from 7.0.0 to 7.1.0. - [Release notes](https://github.com/actions/setup-python/releases) - [Commits](https://github.com/actions/setup-python/compare/5fda3b95a4ea91299a34e894583c3862153e4b97...6d4fd22b20465ccc0f7354476588e8df7c9ca0e0) --- updated-dependencies: - dependency-name: actions/setup-python dependency-version: 7.1.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- .github/workflows/compat-smoke.yml | 4 ++-- .github/workflows/nightly.yml | 2 +- .github/workflows/publish.yml | 4 ++-- .github/workflows/python-tests.yml | 6 +++--- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/.github/workflows/compat-smoke.yml b/.github/workflows/compat-smoke.yml index b7360251..2ec2f929 100644 --- a/.github/workflows/compat-smoke.yml +++ b/.github/workflows/compat-smoke.yml @@ -18,7 +18,7 @@ jobs: python-version: ["3.10", "3.11", "3.12", "3.14"] steps: - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 - - uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0 + - uses: actions/setup-python@6d4fd22b20465ccc0f7354476588e8df7c9ca0e0 # v7.1.0 with: python-version: ${{ matrix.python-version }} - name: Install deps @@ -41,7 +41,7 @@ jobs: python-version: ["3.10", "3.12"] steps: - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 - - uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0 + - uses: actions/setup-python@6d4fd22b20465ccc0f7354476588e8df7c9ca0e0 # v7.1.0 with: python-version: ${{ matrix.python-version }} - name: Install deps diff --git a/.github/workflows/nightly.yml b/.github/workflows/nightly.yml index 935bb6fa..6c89cd82 100644 --- a/.github/workflows/nightly.yml +++ b/.github/workflows/nightly.yml @@ -24,7 +24,7 @@ jobs: uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 - name: Set up Python - uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0 + uses: actions/setup-python@6d4fd22b20465ccc0f7354476588e8df7c9ca0e0 # v7.1.0 with: python-version: "3.12" diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 0401bdf3..a2375633 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -27,7 +27,7 @@ jobs: - name: Check out code uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 - name: Set up Python - uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0 + uses: actions/setup-python@6d4fd22b20465ccc0f7354476588e8df7c9ca0e0 # v7.1.0 with: python-version: "3.12" - name: Set up Node.js @@ -71,7 +71,7 @@ jobs: - name: Check out code uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 - name: Set up Python - uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0 + uses: actions/setup-python@6d4fd22b20465ccc0f7354476588e8df7c9ca0e0 # v7.1.0 with: python-version: "3.12" - name: Set up Node.js diff --git a/.github/workflows/python-tests.yml b/.github/workflows/python-tests.yml index 97fc18b3..4611cb54 100644 --- a/.github/workflows/python-tests.yml +++ b/.github/workflows/python-tests.yml @@ -29,7 +29,7 @@ jobs: fetch-depth: 0 - name: Set up Python - uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0 + uses: actions/setup-python@6d4fd22b20465ccc0f7354476588e8df7c9ca0e0 # v7.1.0 with: python-version: "3.12" @@ -133,7 +133,7 @@ jobs: fetch-depth: 0 - name: Set up Python ${{ matrix.python-version }} - uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0 + uses: actions/setup-python@6d4fd22b20465ccc0f7354476588e8df7c9ca0e0 # v7.1.0 with: python-version: ${{ matrix.python-version }} @@ -186,7 +186,7 @@ jobs: fetch-depth: 0 - name: Set up Python - uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0 + uses: actions/setup-python@6d4fd22b20465ccc0f7354476588e8df7c9ca0e0 # v7.1.0 with: python-version: "3.12" From 660d0f867b990e2ac31aa3867f0de751f0b22efe Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 30 Oct 2026 07:34:15 +0000 Subject: [PATCH 04/23] chore(deps-dev): bump oxlint from 1.86.0 to 1.90.0 Bumps [oxlint](https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint) from 1.86.0 to 1.90.0. - [Release notes](https://github.com/oxc-project/oxc/releases) - [Changelog](https://github.com/oxc-project/oxc/blob/main/npm/oxlint/CHANGELOG.md) - [Commits](https://github.com/oxc-project/oxc/commits/oxlint_v1.90.0/npm/oxlint) --- updated-dependencies: - dependency-name: oxlint dependency-version: 1.90.0 dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- package-lock.json | 206 +++++++++++++++++++++++----------------------- package.json | 2 +- 2 files changed, 106 insertions(+), 102 deletions(-) diff --git a/package-lock.json b/package-lock.json index 3e26894a..1876ae75 100644 --- a/package-lock.json +++ b/package-lock.json @@ -24,7 +24,7 @@ "eslint": "^10.12.0", "happy-dom": "^21.0.4", "knip": "^6.39.0", - "oxlint": "^1.86.0", + "oxlint": "^1.90.0", "prettier": "^3.9.9", "typescript": "^7.0.2", "vite": "^8.3.5", @@ -1075,9 +1075,9 @@ ] }, "node_modules/@oxlint/binding-android-arm-eabi": { - "version": "1.86.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-android-arm-eabi/-/binding-android-arm-eabi-1.86.0.tgz", - "integrity": "sha512-63Ozq6yQn79B2UxjSZ9huJmI+3/ZPI7hxAe6TyFh9oQL447KnIMoffOdtog+h4KILbQr61ZRvFPW5gYbAUgpgQ==", + "version": "1.90.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-android-arm-eabi/-/binding-android-arm-eabi-1.90.0.tgz", + "integrity": "sha512-sgfalb1HuxYjiAa4wESZ626z1FGusqNcXYHyB5oIOEprS2sbPg0UYEfo83uF1GNG70DIfZxHkXuE6KFrlSdn8Q==", "cpu": [ "arm" ], @@ -1092,9 +1092,9 @@ } }, "node_modules/@oxlint/binding-android-arm64": { - "version": "1.86.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-android-arm64/-/binding-android-arm64-1.86.0.tgz", - "integrity": "sha512-JdLGp44phbf/0Du236Dt06yfK6Qw8xhTFeDvHJdjk167r59OfP5+BL31mgMYVnswS8e+j6tFuccSY0QDC/lgCw==", + "version": "1.90.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-android-arm64/-/binding-android-arm64-1.90.0.tgz", + "integrity": "sha512-RcKhz1ETMq+fazE9TKS2+5NIRGwigm/nW8egqF0LI+A8Yw2iW5r0E/C3XAPRiwIm/vcPiutIRIa6IQCIKhZsTQ==", "cpu": [ "arm64" ], @@ -1109,9 +1109,9 @@ } }, "node_modules/@oxlint/binding-darwin-arm64": { - "version": "1.86.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-darwin-arm64/-/binding-darwin-arm64-1.86.0.tgz", - "integrity": "sha512-h+vkOr4ik6KLFCXdtNVEj9xfnXfNUpPoF95QjORdhiSpLqQePzcN81kGHjAgsw1/G7WBWK5KsFKbI2UK8EyzMA==", + "version": "1.90.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-darwin-arm64/-/binding-darwin-arm64-1.90.0.tgz", + "integrity": "sha512-PSrxMvP6mx+p1karZcUxLdy9lpaP+JWQPti4al9FgTaPhxE+pT/BjhGExloVVSWgZgIfOlLOjVyyq8BXlodhLQ==", "cpu": [ "arm64" ], @@ -1126,9 +1126,9 @@ } }, "node_modules/@oxlint/binding-darwin-x64": { - "version": "1.86.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-darwin-x64/-/binding-darwin-x64-1.86.0.tgz", - "integrity": "sha512-wbglRuH5eKsp68keTOOeKDHU1astWSRYFsh2bwKQTAPb44rD6kVgzYI1ZrAJRTc6/7PH55ZXFCQx0rQXrj0UdA==", + "version": "1.90.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-darwin-x64/-/binding-darwin-x64-1.90.0.tgz", + "integrity": "sha512-OLbU9qsrV2Q8QxT2OEzOPdO8zCCpyI8qB+hDI8yr6RsYELtkf0FAZhJdfjM/RnLHKzt44HWwAPnk92vBtKofvw==", "cpu": [ "x64" ], @@ -1143,9 +1143,9 @@ } }, "node_modules/@oxlint/binding-freebsd-x64": { - "version": "1.86.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-freebsd-x64/-/binding-freebsd-x64-1.86.0.tgz", - "integrity": "sha512-yTQ7QSOlNfQsrfbeVweTiegQJLKPjUKgXp/JpGiFzza6Hp29S9LAoH77TM3L0RjK39iQRZB5lk5iq2t241Mfag==", + "version": "1.90.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-freebsd-x64/-/binding-freebsd-x64-1.90.0.tgz", + "integrity": "sha512-fBA4pWyVDARmNucQqpyFuPC49xYf1r+sX7dxPL5fNPQrSMLum39Sn56tZ9JPleWC7FzLPwSQ7plYYfirYBHF8A==", "cpu": [ "x64" ], @@ -1160,9 +1160,9 @@ } }, "node_modules/@oxlint/binding-linux-arm-gnueabihf": { - "version": "1.86.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.86.0.tgz", - "integrity": "sha512-QYJGy0E2Tv8GAayyBIeHFTwQb8u+zrvrOYrifuDGZDr9ad5XsDhiMScpZymhS9fwWjqrgG2ZUwT4vpY0ISqp4Q==", + "version": "1.90.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.90.0.tgz", + "integrity": "sha512-zhxH78eP2nR6/pGdhBc7MIfjhhcgATeu8fkmkFJbuzfk6Cj0FzBxyEhL85yDqrCybjx+G2YDzZGsxIO9kvO4Iw==", "cpu": [ "arm" ], @@ -1177,9 +1177,9 @@ } }, "node_modules/@oxlint/binding-linux-arm-musleabihf": { - "version": "1.86.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm-musleabihf/-/binding-linux-arm-musleabihf-1.86.0.tgz", - "integrity": "sha512-oQo83CafLT8p3qh0AGkN0tSUIh5Hm63mfDsoqUmBQUBnSZLNBAbyRaAftfGY5a0cKZ34dG6jAtMYgcY5kZqt5g==", + "version": "1.90.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm-musleabihf/-/binding-linux-arm-musleabihf-1.90.0.tgz", + "integrity": "sha512-MvYmpHyJqUJjEvkZbJHdwfdL45cGn8EVBkYmoXFiaYFW9suoD3dbJl5mBdpy0DVgdjlyddmldbRtk3cCgETadQ==", "cpu": [ "arm" ], @@ -1194,13 +1194,16 @@ } }, "node_modules/@oxlint/binding-linux-arm64-gnu": { - "version": "1.86.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.86.0.tgz", - "integrity": "sha512-EM6wy5c2UM12qPb7iDJDBAZvHyfEJGH6iosFgaFiaRZpirz99//EHcUyD2KAskz07x1TULuiAtsojf4nvWWksw==", + "version": "1.90.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.90.0.tgz", + "integrity": "sha512-L13Sy+Kg0nZhwTsToniqjUFPA2TuM6962qCZ5Wp5KeB517Tw7ApdLTTtlb+bF86fcZZa2EtvCVvAJxk4Dya/MQ==", "cpu": [ "arm64" ], "dev": true, + "libc": [ + "glibc" + ], "license": "MIT", "optional": true, "os": [ @@ -1211,13 +1214,16 @@ } }, "node_modules/@oxlint/binding-linux-arm64-musl": { - "version": "1.86.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.86.0.tgz", - "integrity": "sha512-vCiUQb9ZNzZalxYRU4mlZwUqT5f+c7Sk9DwUOplWHtik3Dl4r3DVnUB5tBeRuTAUe6MUVCTylNW7TkkN8J1oTw==", + "version": "1.90.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.90.0.tgz", + "integrity": "sha512-wFDdZWGpzIPFdJFjSLWnKB0TGzFriTKUIrl04iMqMyM9BBIJTuerfCHYa0WpDSjr5x3lcW/CHLyacSt886WpGg==", "cpu": [ "arm64" ], "dev": true, + "libc": [ + "musl" + ], "license": "MIT", "optional": true, "os": [ @@ -1228,13 +1234,16 @@ } }, "node_modules/@oxlint/binding-linux-ppc64-gnu": { - "version": "1.86.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.86.0.tgz", - "integrity": "sha512-T0AzE89yjTYmOhB/hb6i+rWTpe2mYt+xiguBhs9DEPIJTZ1H8OYqsE4VxJHHw2Wlq8Mztwvp2P8NV87ZOuhPRw==", + "version": "1.90.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.90.0.tgz", + "integrity": "sha512-FRywfn+MoKn8xpBSzgNwNVliSKRI2QXkxi/iF7o6FEQs8Bh8z2RpVTaFAcO3pchXjvB2eGNFIoLLQABIQ+u7VA==", "cpu": [ "ppc64" ], "dev": true, + "libc": [ + "glibc" + ], "license": "MIT", "optional": true, "os": [ @@ -1245,13 +1254,16 @@ } }, "node_modules/@oxlint/binding-linux-riscv64-gnu": { - "version": "1.86.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-riscv64-gnu/-/binding-linux-riscv64-gnu-1.86.0.tgz", - "integrity": "sha512-s49r0K2f5Oc7fJoMUO1WkdhYK5Ob79uYRwWQ/XNoGysaOq3RUGmGUbHSuXiyydTTA+P9xEdDEnnlZVXiaSJhlw==", + "version": "1.90.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-riscv64-gnu/-/binding-linux-riscv64-gnu-1.90.0.tgz", + "integrity": "sha512-IS2PaUgpc/qeLADTyhUNmdx3x4ijs9pjJdPKBYHaT+mAE7k3FsjnHPTjhpsak1b++h6CIPhv6WX9Z+y7Pw0voQ==", "cpu": [ "riscv64" ], "dev": true, + "libc": [ + "glibc" + ], "license": "MIT", "optional": true, "os": [ @@ -1262,13 +1274,16 @@ } }, "node_modules/@oxlint/binding-linux-riscv64-musl": { - "version": "1.86.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-riscv64-musl/-/binding-linux-riscv64-musl-1.86.0.tgz", - "integrity": "sha512-JIa2tYR8ayb3nvcMSZzn4O/xTy13S7MHllu7cBD+B5qDQXXSRy/Vwk1aNpiTjZmBJGwKCHOy/NvnY5Xcwg27uQ==", + "version": "1.90.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-riscv64-musl/-/binding-linux-riscv64-musl-1.90.0.tgz", + "integrity": "sha512-s7JFKRkGS8O7i2ZVODfuO++NC7sH6HDqpMn8lYxw91w0SXJOxnAVjQ8utvmDwLMMT0jaSkuOKuUYJDGDtu4sHQ==", "cpu": [ "riscv64" ], "dev": true, + "libc": [ + "musl" + ], "license": "MIT", "optional": true, "os": [ @@ -1279,13 +1294,16 @@ } }, "node_modules/@oxlint/binding-linux-s390x-gnu": { - "version": "1.86.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.86.0.tgz", - "integrity": "sha512-XwXMyBsAuWZkhZU74UNcfQKr1CJJAKnS80dZzOnjl6A4fKcf91IjFgidegQugMHA5SN8ulwDXEDV1yPntjXgQQ==", + "version": "1.90.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.90.0.tgz", + "integrity": "sha512-b0GxrOQr5VONCkd7KLSqmP6b6nqZuTpuS8QPQHzltmqdXP5bY0Jl0CZ0QmlCTrS3ExaLYbioFYOARzNbYvcApQ==", "cpu": [ "s390x" ], "dev": true, + "libc": [ + "glibc" + ], "license": "MIT", "optional": true, "os": [ @@ -1296,13 +1314,16 @@ } }, "node_modules/@oxlint/binding-linux-x64-gnu": { - "version": "1.86.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.86.0.tgz", - "integrity": "sha512-C1WjukSyMnr66b+w1/tV8RFVv6d9v0MzDf4p9IxVXknqgmTHBgZh1pccN1eHzFr0b9Tbb3OXoPsAAdAuHAQfeA==", + "version": "1.90.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.90.0.tgz", + "integrity": "sha512-iaJeShJtgUp8rZbt9YUdTAGOpmX5KogCLba17Jp1tWdJ3F4M3D2g2TKUyI1FMTHxKH9NNHuQcuC2kZRg6IV7yQ==", "cpu": [ "x64" ], "dev": true, + "libc": [ + "glibc" + ], "license": "MIT", "optional": true, "os": [ @@ -1313,13 +1334,16 @@ } }, "node_modules/@oxlint/binding-linux-x64-musl": { - "version": "1.86.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-x64-musl/-/binding-linux-x64-musl-1.86.0.tgz", - "integrity": "sha512-ap6KLmvC38c6MdYzsIh25cXQupqYvjd37tMNftzrX1DCtkX1Gcf2B+S2B17dD4lKa5c5gJog7DQJyDo82PBKyw==", + "version": "1.90.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-x64-musl/-/binding-linux-x64-musl-1.90.0.tgz", + "integrity": "sha512-/aZoXnL5WBLCXuzfHqvEFXcm4iwYmr/cYByHDTXzLFzJdE5DC7bm6phpWqHv6BeqpVgY9IpBAxGDv2WEkl5JCg==", "cpu": [ "x64" ], "dev": true, + "libc": [ + "musl" + ], "license": "MIT", "optional": true, "os": [ @@ -1330,9 +1354,9 @@ } }, "node_modules/@oxlint/binding-openharmony-arm64": { - "version": "1.86.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-openharmony-arm64/-/binding-openharmony-arm64-1.86.0.tgz", - "integrity": "sha512-996Q9w/2GLwNyy5Djs39Jt09aFlr4b7TPhoj7dvo5FHmcyiF68nPz73HNc5UAYKIYeK+M9JzPQ4Wg1r1dXvP6A==", + "version": "1.90.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-openharmony-arm64/-/binding-openharmony-arm64-1.90.0.tgz", + "integrity": "sha512-SMhk7ozwoxYDKfYqGZCQEfULOKDneF9uhaoIf2neoDLWvNtjY9yVeL7YHmE5L9WdKvMpWNwwZxhenxBu6AgfOg==", "cpu": [ "arm64" ], @@ -1347,9 +1371,9 @@ } }, "node_modules/@oxlint/binding-win32-arm64-msvc": { - "version": "1.86.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.86.0.tgz", - "integrity": "sha512-9uTCHYTknNkug5+46ViSoUMuOuGWK61D87QnblU6CXaWKJC630Z7dbls61vdHxya/cR2ycQZ6Mm6ckgF6Cag5g==", + "version": "1.90.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.90.0.tgz", + "integrity": "sha512-KBvR3A9fO7fCi2vCP8ifWvlia7tGEQV9NaYh+IGwa/7Groy48Mt/UaYqMK9/zOtAWl20BUCf6RPqzJ32fRw33Q==", "cpu": [ "arm64" ], @@ -1364,9 +1388,9 @@ } }, "node_modules/@oxlint/binding-win32-ia32-msvc": { - "version": "1.86.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-win32-ia32-msvc/-/binding-win32-ia32-msvc-1.86.0.tgz", - "integrity": "sha512-a47ga7EKVfMU8rO0i1m3mGwfNRj3FhQyt1d/ukO/E9u1HHF3KpR3tyb3VhuJBGEVPF8uR4exSyHUyx7xbE+uxw==", + "version": "1.90.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-win32-ia32-msvc/-/binding-win32-ia32-msvc-1.90.0.tgz", + "integrity": "sha512-+x42rDHQGbTCuT3EzpWAzhP3NoVPE/cJsG4gnrakOSg0olV+GCdMpPU23Nvrl3zZMnXxFZdTtDv4D3SuaA5ZeQ==", "cpu": [ "ia32" ], @@ -1381,9 +1405,9 @@ } }, "node_modules/@oxlint/binding-win32-x64-msvc": { - "version": "1.86.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.86.0.tgz", - "integrity": "sha512-az4dzifCRzES1crwu6pDFXzJTIanrdxXFL9TbiJWrx9LKcuacbR83aPvxDA1LKLNswi/RoqitC7Afcflhu3zBQ==", + "version": "1.90.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.90.0.tgz", + "integrity": "sha512-30JiaFEBUB9peEOcvVM8ggo88SoN/IdSr9DW505JdBji/R6dM66gKEiG65hw6qcaF2f4mO0cEJ+RwRZprmun9g==", "cpu": [ "x64" ], @@ -1844,7 +1868,6 @@ "cpu": [ "ppc64" ], - "dev": true, "license": "Apache-2.0", "optional": true, "os": [ @@ -1861,7 +1884,6 @@ "cpu": [ "arm64" ], - "dev": true, "license": "Apache-2.0", "optional": true, "os": [ @@ -1878,7 +1900,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "Apache-2.0", "optional": true, "os": [ @@ -1895,7 +1916,6 @@ "cpu": [ "arm64" ], - "dev": true, "license": "Apache-2.0", "optional": true, "os": [ @@ -1912,7 +1932,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "Apache-2.0", "optional": true, "os": [ @@ -1929,7 +1948,6 @@ "cpu": [ "arm" ], - "dev": true, "license": "Apache-2.0", "optional": true, "os": [ @@ -1946,7 +1964,6 @@ "cpu": [ "arm64" ], - "dev": true, "license": "Apache-2.0", "optional": true, "os": [ @@ -1963,7 +1980,6 @@ "cpu": [ "loong64" ], - "dev": true, "license": "Apache-2.0", "optional": true, "os": [ @@ -1980,7 +1996,6 @@ "cpu": [ "mips64el" ], - "dev": true, "license": "Apache-2.0", "optional": true, "os": [ @@ -1997,7 +2012,6 @@ "cpu": [ "ppc64" ], - "dev": true, "license": "Apache-2.0", "optional": true, "os": [ @@ -2014,7 +2028,6 @@ "cpu": [ "riscv64" ], - "dev": true, "license": "Apache-2.0", "optional": true, "os": [ @@ -2031,7 +2044,6 @@ "cpu": [ "s390x" ], - "dev": true, "license": "Apache-2.0", "optional": true, "os": [ @@ -2048,7 +2060,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "Apache-2.0", "optional": true, "os": [ @@ -2065,7 +2076,6 @@ "cpu": [ "arm64" ], - "dev": true, "license": "Apache-2.0", "optional": true, "os": [ @@ -2082,7 +2092,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "Apache-2.0", "optional": true, "os": [ @@ -2099,7 +2108,6 @@ "cpu": [ "arm64" ], - "dev": true, "license": "Apache-2.0", "optional": true, "os": [ @@ -2116,7 +2124,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "Apache-2.0", "optional": true, "os": [ @@ -2133,7 +2140,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "Apache-2.0", "optional": true, "os": [ @@ -2150,7 +2156,6 @@ "cpu": [ "arm64" ], - "dev": true, "license": "Apache-2.0", "optional": true, "os": [ @@ -2167,7 +2172,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "Apache-2.0", "optional": true, "os": [ @@ -3785,9 +3789,9 @@ } }, "node_modules/oxlint": { - "version": "1.86.0", - "resolved": "https://registry.npmjs.org/oxlint/-/oxlint-1.86.0.tgz", - "integrity": "sha512-og0lhgvZfgGF//gOOmZXvtr+GmBbAGEnbEhv/QUg7UW2Wi4wHMnJbnMD+zuHgPdJxdklfgpPupdlAaAySyxrZg==", + "version": "1.90.0", + "resolved": "https://registry.npmjs.org/oxlint/-/oxlint-1.90.0.tgz", + "integrity": "sha512-RkTN9EmgIUpLuhNoLhO3OliMGJlvb3Dk7XVjBZnfoMCHrVpuz5ESd97klfiyYeV7XfA2lNLnDCPMkUI+Qw5How==", "dev": true, "license": "MIT", "bin": { @@ -3800,28 +3804,28 @@ "url": "https://github.com/sponsors/oxc-project" }, "optionalDependencies": { - "@oxlint/binding-android-arm-eabi": "1.86.0", - "@oxlint/binding-android-arm64": "1.86.0", - "@oxlint/binding-darwin-arm64": "1.86.0", - "@oxlint/binding-darwin-x64": "1.86.0", - "@oxlint/binding-freebsd-x64": "1.86.0", - "@oxlint/binding-linux-arm-gnueabihf": "1.86.0", - "@oxlint/binding-linux-arm-musleabihf": "1.86.0", - "@oxlint/binding-linux-arm64-gnu": "1.86.0", - "@oxlint/binding-linux-arm64-musl": "1.86.0", - "@oxlint/binding-linux-ppc64-gnu": "1.86.0", - "@oxlint/binding-linux-riscv64-gnu": "1.86.0", - "@oxlint/binding-linux-riscv64-musl": "1.86.0", - "@oxlint/binding-linux-s390x-gnu": "1.86.0", - "@oxlint/binding-linux-x64-gnu": "1.86.0", - "@oxlint/binding-linux-x64-musl": "1.86.0", - "@oxlint/binding-openharmony-arm64": "1.86.0", - "@oxlint/binding-win32-arm64-msvc": "1.86.0", - "@oxlint/binding-win32-ia32-msvc": "1.86.0", - "@oxlint/binding-win32-x64-msvc": "1.86.0" + "@oxlint/binding-android-arm-eabi": "1.90.0", + "@oxlint/binding-android-arm64": "1.90.0", + "@oxlint/binding-darwin-arm64": "1.90.0", + "@oxlint/binding-darwin-x64": "1.90.0", + "@oxlint/binding-freebsd-x64": "1.90.0", + "@oxlint/binding-linux-arm-gnueabihf": "1.90.0", + "@oxlint/binding-linux-arm-musleabihf": "1.90.0", + "@oxlint/binding-linux-arm64-gnu": "1.90.0", + "@oxlint/binding-linux-arm64-musl": "1.90.0", + "@oxlint/binding-linux-ppc64-gnu": "1.90.0", + "@oxlint/binding-linux-riscv64-gnu": "1.90.0", + "@oxlint/binding-linux-riscv64-musl": "1.90.0", + "@oxlint/binding-linux-s390x-gnu": "1.90.0", + "@oxlint/binding-linux-x64-gnu": "1.90.0", + "@oxlint/binding-linux-x64-musl": "1.90.0", + "@oxlint/binding-openharmony-arm64": "1.90.0", + "@oxlint/binding-win32-arm64-msvc": "1.90.0", + "@oxlint/binding-win32-ia32-msvc": "1.90.0", + "@oxlint/binding-win32-x64-msvc": "1.90.0" }, "peerDependencies": { - "oxlint-tsgolint": ">=7.0.2003", + "oxlint-tsgolint": ">=7.0.2005", "vite-plus": "*" }, "peerDependenciesMeta": { diff --git a/package.json b/package.json index 3784f2f1..e58d45f7 100644 --- a/package.json +++ b/package.json @@ -47,7 +47,7 @@ "eslint": "^10.12.0", "happy-dom": "^21.0.4", "knip": "^6.39.0", - "oxlint": "^1.86.0", + "oxlint": "^1.90.0", "prettier": "^3.9.9", "typescript": "^7.0.2", "vite": "^8.3.5", From e89f48620df14d7b6365654364c76a598592f497 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 30 Oct 2026 07:34:26 +0000 Subject: [PATCH 05/23] chore(deps-dev): bump @comfyorg/comfyui-frontend-types Bumps [@comfyorg/comfyui-frontend-types](https://github.com/Comfy-Org/ComfyUI_frontend) from 1.57.3 to 1.60.0. - [Release notes](https://github.com/Comfy-Org/ComfyUI_frontend/releases) - [Changelog](https://github.com/Comfy-Org/ComfyUI_frontend/blob/main/docs/release-process.md) - [Commits](https://github.com/Comfy-Org/ComfyUI_frontend/compare/v1.57.3...v1.60.0) --- updated-dependencies: - dependency-name: "@comfyorg/comfyui-frontend-types" dependency-version: 1.60.0 dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- package-lock.json | 28 ++++------------------------ package.json | 2 +- 2 files changed, 5 insertions(+), 25 deletions(-) diff --git a/package-lock.json b/package-lock.json index 3e26894a..b1237c87 100644 --- a/package-lock.json +++ b/package-lock.json @@ -13,7 +13,7 @@ "vue": "^3.5.41" }, "devDependencies": { - "@comfyorg/comfyui-frontend-types": "^1.57.3", + "@comfyorg/comfyui-frontend-types": "^1.60.0", "@comfyorg/litegraph": "^0.17.2", "@eslint/js": "^10.0.1", "@playwright/test": "^1.63.0", @@ -119,9 +119,9 @@ "license": "MIT" }, "node_modules/@comfyorg/comfyui-frontend-types": { - "version": "1.57.3", - "resolved": "https://registry.npmjs.org/@comfyorg/comfyui-frontend-types/-/comfyui-frontend-types-1.57.3.tgz", - "integrity": "sha512-QjsuFqO/9RHKPGDfW2eCobIOgU38IkIOtam+nZiStvmcdfIn5MS0NTB+pzAopev3nC+Eha7pWtRb3vRf3kuVkg==", + "version": "1.60.0", + "resolved": "https://registry.npmjs.org/@comfyorg/comfyui-frontend-types/-/comfyui-frontend-types-1.60.0.tgz", + "integrity": "sha512-G37ThdoiwH1cJrCwkiFLokKcwRmheOwPm4l0EbofPDhfwLofj5mX9+D3y0DSkrGeXG3Bt3JDjaJCMSTaIdEyLQ==", "dev": true, "license": "GPL-3.0-only", "dependencies": { @@ -1844,7 +1844,6 @@ "cpu": [ "ppc64" ], - "dev": true, "license": "Apache-2.0", "optional": true, "os": [ @@ -1861,7 +1860,6 @@ "cpu": [ "arm64" ], - "dev": true, "license": "Apache-2.0", "optional": true, "os": [ @@ -1878,7 +1876,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "Apache-2.0", "optional": true, "os": [ @@ -1895,7 +1892,6 @@ "cpu": [ "arm64" ], - "dev": true, "license": "Apache-2.0", "optional": true, "os": [ @@ -1912,7 +1908,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "Apache-2.0", "optional": true, "os": [ @@ -1929,7 +1924,6 @@ "cpu": [ "arm" ], - "dev": true, "license": "Apache-2.0", "optional": true, "os": [ @@ -1946,7 +1940,6 @@ "cpu": [ "arm64" ], - "dev": true, "license": "Apache-2.0", "optional": true, "os": [ @@ -1963,7 +1956,6 @@ "cpu": [ "loong64" ], - "dev": true, "license": "Apache-2.0", "optional": true, "os": [ @@ -1980,7 +1972,6 @@ "cpu": [ "mips64el" ], - "dev": true, "license": "Apache-2.0", "optional": true, "os": [ @@ -1997,7 +1988,6 @@ "cpu": [ "ppc64" ], - "dev": true, "license": "Apache-2.0", "optional": true, "os": [ @@ -2014,7 +2004,6 @@ "cpu": [ "riscv64" ], - "dev": true, "license": "Apache-2.0", "optional": true, "os": [ @@ -2031,7 +2020,6 @@ "cpu": [ "s390x" ], - "dev": true, "license": "Apache-2.0", "optional": true, "os": [ @@ -2048,7 +2036,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "Apache-2.0", "optional": true, "os": [ @@ -2065,7 +2052,6 @@ "cpu": [ "arm64" ], - "dev": true, "license": "Apache-2.0", "optional": true, "os": [ @@ -2082,7 +2068,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "Apache-2.0", "optional": true, "os": [ @@ -2099,7 +2084,6 @@ "cpu": [ "arm64" ], - "dev": true, "license": "Apache-2.0", "optional": true, "os": [ @@ -2116,7 +2100,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "Apache-2.0", "optional": true, "os": [ @@ -2133,7 +2116,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "Apache-2.0", "optional": true, "os": [ @@ -2150,7 +2132,6 @@ "cpu": [ "arm64" ], - "dev": true, "license": "Apache-2.0", "optional": true, "os": [ @@ -2167,7 +2148,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "Apache-2.0", "optional": true, "os": [ diff --git a/package.json b/package.json index 3784f2f1..c1b0471b 100644 --- a/package.json +++ b/package.json @@ -36,7 +36,7 @@ "brace-expansion": "5.0.12" }, "devDependencies": { - "@comfyorg/comfyui-frontend-types": "^1.57.3", + "@comfyorg/comfyui-frontend-types": "^1.60.0", "@comfyorg/litegraph": "^0.17.2", "@eslint/js": "^10.0.1", "@playwright/test": "^1.63.0", From 9a439d54293d6c186351631db05ec0242c223814 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 30 Oct 2026 07:34:33 +0000 Subject: [PATCH 06/23] chore(deps): bump vue from 3.5.43 to 3.5.44 Bumps [vue](https://github.com/vuejs/core) from 3.5.43 to 3.5.44. - [Release notes](https://github.com/vuejs/core/releases) - [Changelog](https://github.com/vuejs/core/blob/main/CHANGELOG.md) - [Commits](https://github.com/vuejs/core/compare/v3.5.43...v3.5.44) --- updated-dependencies: - dependency-name: vue dependency-version: 3.5.44 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- package-lock.json | 160 ++++++++++++++++++++-------------------------- package.json | 2 +- 2 files changed, 71 insertions(+), 91 deletions(-) diff --git a/package-lock.json b/package-lock.json index 3e26894a..f7dc9a07 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,7 +10,7 @@ "pinia": "^4.0.3", "primevue": "4.5.5", "three": "0.186.1", - "vue": "^3.5.41" + "vue": "^3.5.44" }, "devDependencies": { "@comfyorg/comfyui-frontend-types": "^1.57.3", @@ -32,9 +32,9 @@ } }, "node_modules/@babel/helper-string-parser": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.29.7.tgz", - "integrity": "sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==", + "version": "7.29.11", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.29.11.tgz", + "integrity": "sha512-snZbO7MEDOof+hvNa97EjEY7qD7h2kwvQr5AJC3ZhQudKW5dnej6k3kP9NQV88hJwaS8vDqRLFo9rivLEhle2g==", "license": "MIT", "engines": { "node": ">=6.9.0" @@ -50,12 +50,12 @@ } }, "node_modules/@babel/parser": { - "version": "7.29.8", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.8.tgz", - "integrity": "sha512-E8lTAYNB1KW+FH+VGJuZM1ioAx2E6oVlvQFRrf5P8ZZmsiJXYAD9vTFV7yyEURNzgh1dFqMZuO6tUwcARbqFCA==", + "version": "7.29.11", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.11.tgz", + "integrity": "sha512-OZ6+oaK7GMyg3IfCpj8JOmn8n+w2rJbDT0LLfVDTLb1ZFeKDh3AiNELgCMUw175IJHSkLl74hG0M0VLsvx+gag==", "license": "MIT", "dependencies": { - "@babel/types": "^7.29.8" + "@babel/types": "^7.29.11" }, "bin": { "parser": "bin/babel-parser.js" @@ -65,12 +65,12 @@ } }, "node_modules/@babel/types": { - "version": "7.29.8", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.8.tgz", - "integrity": "sha512-Vj1jF3cPfxg7OAfoI7QnVKLoILlm2JF9pnVHrX8qx7AHMiYWT+NDAA7jChlNgRS4WTLc/fD1lXLmPixluj+3Gg==", + "version": "7.29.11", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.11.tgz", + "integrity": "sha512-WCsemW40Cpc6gouC1SrY6PBaZ+oLRlEVY9XBvZBI7il/HyUrb2nJ505wE1MHEFyDZNnrWDEuy4jL50WVHfTTSQ==", "license": "MIT", "dependencies": { - "@babel/helper-string-parser": "^7.29.7", + "@babel/helper-string-parser": "^7.29.11", "@babel/helper-validator-identifier": "^7.29.7" }, "engines": { @@ -1844,7 +1844,6 @@ "cpu": [ "ppc64" ], - "dev": true, "license": "Apache-2.0", "optional": true, "os": [ @@ -1861,7 +1860,6 @@ "cpu": [ "arm64" ], - "dev": true, "license": "Apache-2.0", "optional": true, "os": [ @@ -1878,7 +1876,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "Apache-2.0", "optional": true, "os": [ @@ -1895,7 +1892,6 @@ "cpu": [ "arm64" ], - "dev": true, "license": "Apache-2.0", "optional": true, "os": [ @@ -1912,7 +1908,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "Apache-2.0", "optional": true, "os": [ @@ -1929,7 +1924,6 @@ "cpu": [ "arm" ], - "dev": true, "license": "Apache-2.0", "optional": true, "os": [ @@ -1946,7 +1940,6 @@ "cpu": [ "arm64" ], - "dev": true, "license": "Apache-2.0", "optional": true, "os": [ @@ -1963,7 +1956,6 @@ "cpu": [ "loong64" ], - "dev": true, "license": "Apache-2.0", "optional": true, "os": [ @@ -1980,7 +1972,6 @@ "cpu": [ "mips64el" ], - "dev": true, "license": "Apache-2.0", "optional": true, "os": [ @@ -1997,7 +1988,6 @@ "cpu": [ "ppc64" ], - "dev": true, "license": "Apache-2.0", "optional": true, "os": [ @@ -2014,7 +2004,6 @@ "cpu": [ "riscv64" ], - "dev": true, "license": "Apache-2.0", "optional": true, "os": [ @@ -2031,7 +2020,6 @@ "cpu": [ "s390x" ], - "dev": true, "license": "Apache-2.0", "optional": true, "os": [ @@ -2048,7 +2036,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "Apache-2.0", "optional": true, "os": [ @@ -2065,7 +2052,6 @@ "cpu": [ "arm64" ], - "dev": true, "license": "Apache-2.0", "optional": true, "os": [ @@ -2082,7 +2068,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "Apache-2.0", "optional": true, "os": [ @@ -2099,7 +2084,6 @@ "cpu": [ "arm64" ], - "dev": true, "license": "Apache-2.0", "optional": true, "os": [ @@ -2116,7 +2100,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "Apache-2.0", "optional": true, "os": [ @@ -2133,7 +2116,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "Apache-2.0", "optional": true, "os": [ @@ -2150,7 +2132,6 @@ "cpu": [ "arm64" ], - "dev": true, "license": "Apache-2.0", "optional": true, "os": [ @@ -2167,7 +2148,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "Apache-2.0", "optional": true, "os": [ @@ -2295,16 +2275,16 @@ } }, "node_modules/@vue/compiler-core": { - "version": "3.5.43", - "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.43.tgz", - "integrity": "sha512-zdiLhnbe1QQqgDT8xZMpNmyqZ3qlI+/Q/FHQco57Kwl/b05HhCzN6eVGN9QU9rbga4CrS0H5SYY8VGHZCt/1Hg==", + "version": "3.5.44", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.44.tgz", + "integrity": "sha512-k34nCytbK8PQ1gR2mGROYOw6Pnv/mumqIdrZ3x2tbyXZDWm7ViKGLTfdB+DRrWqEQsLgGJvn0WN9jBif5zCTLQ==", "license": "MIT", "dependencies": { - "@babel/parser": "^7.29.8", - "@vue/shared": "3.5.43", + "@babel/parser": "^7.29.9", + "@vue/shared": "3.5.44", "entities": "^7.0.1", "estree-walker": "^2.0.2", - "source-map-js": "^1.2.1" + "source-map-js": "^1.2.2" } }, "node_modules/@vue/compiler-core/node_modules/estree-walker": { @@ -2314,30 +2294,30 @@ "license": "MIT" }, "node_modules/@vue/compiler-dom": { - "version": "3.5.43", - "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.43.tgz", - "integrity": "sha512-PEZoAk3NQmsn/ejMzSOCyTYqwGqczrWm70PuhBKjjv1+TCoQAaO/zOqNwjV+honlNstT5ILxtc+8r8UUfj+iEQ==", + "version": "3.5.44", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.44.tgz", + "integrity": "sha512-W5AoBFWdw1lQAKiHowkfgFKFab82oSRT6sGsPfw/q1GRjsy/ZJFLHGhJyBRIFN9APLTUduDH9U2JAiPOIyKuYg==", "license": "MIT", "dependencies": { - "@vue/compiler-core": "3.5.43", - "@vue/shared": "3.5.43" + "@vue/compiler-core": "3.5.44", + "@vue/shared": "3.5.44" } }, "node_modules/@vue/compiler-sfc": { - "version": "3.5.43", - "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.43.tgz", - "integrity": "sha512-FCbrG3XNCRl+js3huuKx4IVHBLTvMkJhVepjbxSPu1gn4yWLaYtGNQdjJGZaMytXB6qb76qQDDmDSLy/vkmleQ==", + "version": "3.5.44", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.44.tgz", + "integrity": "sha512-dzHmQ4jXTpdr5FjIQUeykVakN/uzqFbUo9/C5ikBFg3a3PeM6uRxeczx1ZbXBML0/zJstEh3ygYipzR5Z7b2Pw==", "license": "MIT", "dependencies": { - "@babel/parser": "^7.29.8", - "@vue/compiler-core": "3.5.43", - "@vue/compiler-dom": "3.5.43", - "@vue/compiler-ssr": "3.5.43", - "@vue/shared": "3.5.43", + "@babel/parser": "^7.29.9", + "@vue/compiler-core": "3.5.44", + "@vue/compiler-dom": "3.5.44", + "@vue/compiler-ssr": "3.5.44", + "@vue/shared": "3.5.44", "estree-walker": "^2.0.2", "magic-string": "^0.30.21", - "postcss": "^8.5.28", - "source-map-js": "^1.2.1" + "postcss": "^8.5.29", + "source-map-js": "^1.2.2" } }, "node_modules/@vue/compiler-sfc/node_modules/estree-walker": { @@ -2347,13 +2327,13 @@ "license": "MIT" }, "node_modules/@vue/compiler-ssr": { - "version": "3.5.43", - "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.43.tgz", - "integrity": "sha512-GF62orf7KiJX9RqrHNGrYBudsQGD0OhJ5nDs90O8UiDuS40+YMYomiXu6w6EuvtXuRDc3MSNis3EaaSKAVSWpg==", + "version": "3.5.44", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.44.tgz", + "integrity": "sha512-xr5gb1JVHlfXJwSlRz1FeP6uxoazdzHuMTVLE7up+4Vrqxk219CvxLPxD9NXBt47yvZW7+p4DXfyp4O1fkByIA==", "license": "MIT", "dependencies": { - "@vue/compiler-dom": "3.5.43", - "@vue/shared": "3.5.43" + "@vue/compiler-dom": "3.5.44", + "@vue/shared": "3.5.44" } }, "node_modules/@vue/devtools-api": { @@ -2387,51 +2367,51 @@ "peer": true }, "node_modules/@vue/reactivity": { - "version": "3.5.43", - "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.43.tgz", - "integrity": "sha512-G/c9GyOZNI2jVaaS6OX1EF1SSFSv7H0ERqNTl4+DTFMlZmB5eVAB53aLQNam/7NL2NPtaDD7RdVrzf8uJzMuOA==", + "version": "3.5.44", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.44.tgz", + "integrity": "sha512-u+QJdKeBBEADkPdevsL+6E12QlYVfBD8Zcw5qjDQKtamI6l14KyqazJMobhCKelhWN5zpyKUiEDoTyHE93cqWw==", "license": "MIT", "dependencies": { - "@vue/shared": "3.5.43" + "@vue/shared": "3.5.44" } }, "node_modules/@vue/runtime-core": { - "version": "3.5.43", - "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.5.43.tgz", - "integrity": "sha512-hU6U6VnVhBGQDpvlnnDlIB8ZGJBiOcgk2lh/0InltHiz3D8oSkluvuvY+do1G2H3+udeKFsmaBlgVYP7gXQzEw==", + "version": "3.5.44", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.5.44.tgz", + "integrity": "sha512-uEa/ndwjhrrhnOfb2p+sZy6zeoamJOISqaLSJGk/8R6nABT1ZldpzcJoPzKj+zHVomVBPcmQYyC2r4LtvDV6CQ==", "license": "MIT", "dependencies": { - "@vue/reactivity": "3.5.43", - "@vue/shared": "3.5.43" + "@vue/reactivity": "3.5.44", + "@vue/shared": "3.5.44" } }, "node_modules/@vue/runtime-dom": { - "version": "3.5.43", - "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.5.43.tgz", - "integrity": "sha512-Bb2Jc0YjjJdMt1SJmb9b2L/IWd3I8lIT9x9eS/xvvP9CiVgna0ffua74xKRmt4/uSJ+0r4iN8ex1jrqkhQGWQw==", + "version": "3.5.44", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.5.44.tgz", + "integrity": "sha512-3fc4ARcXVhVBaJ3ujWiNZJARD6pkyRcwG+ZYhMzjKtKUp7MAY0HLwr7r3Smep3Li6ZaWT6ewdmx8XqdaD5oNZg==", "license": "MIT", "dependencies": { - "@vue/reactivity": "3.5.43", - "@vue/runtime-core": "3.5.43", - "@vue/shared": "3.5.43", + "@vue/reactivity": "3.5.44", + "@vue/runtime-core": "3.5.44", + "@vue/shared": "3.5.44", "csstype": "^3.2.3" } }, "node_modules/@vue/server-renderer": { - "version": "3.5.43", - "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.43.tgz", - "integrity": "sha512-l2Ygjv9NehV94PSBxNWsAHC0j/eIIKbn92mBuWXAPGLnn6HfJ6MH5ubsd+Nk0YoZ5FRuxWI1P2VSoh+dbPQhCQ==", + "version": "3.5.44", + "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.44.tgz", + "integrity": "sha512-R4S1UoH4h5Frrauv8Z5XE5TxV9oBiUSgWIC4TyVK1FK+RocRnOLwFA5Xcmo2011RlgJp+AbZCnw6afrhlgRuUQ==", "license": "MIT", "dependencies": { - "@vue/compiler-ssr": "3.5.43", - "@vue/runtime-dom": "3.5.43", - "@vue/shared": "3.5.43" + "@vue/compiler-ssr": "3.5.44", + "@vue/runtime-dom": "3.5.44", + "@vue/shared": "3.5.44" } }, "node_modules/@vue/shared": { - "version": "3.5.43", - "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.43.tgz", - "integrity": "sha512-uksS7YGMR5NZyr4JNq0Rp+QyLns0ueaz20KwzIPW9R0LH1Vnt4E+XUM29PNseEbf1www2gOuhuDi5AKOIXag9Q==", + "version": "3.5.44", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.44.tgz", + "integrity": "sha512-H82XLH0DjmSOdbEwO15x3QTo1f5PWEtv237eLpYKc0mqLu+B8hnq16lFWmuBmNurkeiG3wr+oM1FhOll/YVFRg==", "license": "MIT" }, "node_modules/@vue/test-utils": { @@ -4526,16 +4506,16 @@ } }, "node_modules/vue": { - "version": "3.5.43", - "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.43.tgz", - "integrity": "sha512-o5qZoksdnjIKvW1srZ3ab7pcDNYAerBjRe54D0LBLfRdCYFrSgBHVXokMas35czQc0//lmx4/tuY4ZNQ+Rf2Ng==", + "version": "3.5.44", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.44.tgz", + "integrity": "sha512-dvvmaOCG7lAMkJTPqPwWeGMsPS6DIsFsfZDUgBp9V6mHf9b3+/wyVwYR4Es+WV6uJC0FKRxp81Obcq0ZwUcGFQ==", "license": "MIT", "dependencies": { - "@vue/compiler-dom": "3.5.43", - "@vue/compiler-sfc": "3.5.43", - "@vue/runtime-dom": "3.5.43", - "@vue/server-renderer": "3.5.43", - "@vue/shared": "3.5.43" + "@vue/compiler-dom": "3.5.44", + "@vue/compiler-sfc": "3.5.44", + "@vue/runtime-dom": "3.5.44", + "@vue/server-renderer": "3.5.44", + "@vue/shared": "3.5.44" }, "peerDependencies": { "typescript": "*" diff --git a/package.json b/package.json index 3784f2f1..d2eb57af 100644 --- a/package.json +++ b/package.json @@ -58,6 +58,6 @@ "pinia": "^4.0.3", "primevue": "4.5.5", "three": "0.186.1", - "vue": "^3.5.41" + "vue": "^3.5.44" } } From 6422a9589cc7bddca807e668e6db12c1ba3be80e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 30 Oct 2026 07:34:44 +0000 Subject: [PATCH 07/23] chore(deps-dev): bump @playwright/test from 1.63.0 to 1.64.1 Bumps [@playwright/test](https://github.com/microsoft/playwright) from 1.63.0 to 1.64.1. - [Release notes](https://github.com/microsoft/playwright/releases) - [Commits](https://github.com/microsoft/playwright/compare/v1.63.0...v1.64.1) --- updated-dependencies: - dependency-name: "@playwright/test" dependency-version: 1.64.1 dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- package-lock.json | 44 ++++++++++++-------------------------------- package.json | 2 +- 2 files changed, 13 insertions(+), 33 deletions(-) diff --git a/package-lock.json b/package-lock.json index 3e26894a..765bcefe 100644 --- a/package-lock.json +++ b/package-lock.json @@ -16,7 +16,7 @@ "@comfyorg/comfyui-frontend-types": "^1.57.3", "@comfyorg/litegraph": "^0.17.2", "@eslint/js": "^10.0.1", - "@playwright/test": "^1.63.0", + "@playwright/test": "^1.64.1", "@types/node": "^26.6.4", "@vitejs/plugin-vue": "^6.0.9", "@vitest/coverage-v8": "^5.0.5", @@ -1398,13 +1398,13 @@ } }, "node_modules/@playwright/test": { - "version": "1.63.0", - "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.63.0.tgz", - "integrity": "sha512-oxMK4vllB9RK5NQ2l1pq1IfOf2AvnEuj/vYGDj0H2nMtmtZpKtCwt/l00GEO6xjGfpBNAvjovvYdCm50dRQkpQ==", + "version": "1.64.1", + "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.64.1.tgz", + "integrity": "sha512-IaYGml/nSOiZWROfPtuIL7neuu9qDOZ3TNvNljUIrhDMxiGTgPjzj/g9p9RxpS2tSepPDRY+UwAaEeiKtUvIAg==", "dev": true, "license": "Apache-2.0", "dependencies": { - "playwright": "1.63.0" + "playwright": "1.64.1" }, "bin": { "playwright": "cli.js" @@ -1844,7 +1844,6 @@ "cpu": [ "ppc64" ], - "dev": true, "license": "Apache-2.0", "optional": true, "os": [ @@ -1861,7 +1860,6 @@ "cpu": [ "arm64" ], - "dev": true, "license": "Apache-2.0", "optional": true, "os": [ @@ -1878,7 +1876,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "Apache-2.0", "optional": true, "os": [ @@ -1895,7 +1892,6 @@ "cpu": [ "arm64" ], - "dev": true, "license": "Apache-2.0", "optional": true, "os": [ @@ -1912,7 +1908,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "Apache-2.0", "optional": true, "os": [ @@ -1929,7 +1924,6 @@ "cpu": [ "arm" ], - "dev": true, "license": "Apache-2.0", "optional": true, "os": [ @@ -1946,7 +1940,6 @@ "cpu": [ "arm64" ], - "dev": true, "license": "Apache-2.0", "optional": true, "os": [ @@ -1963,7 +1956,6 @@ "cpu": [ "loong64" ], - "dev": true, "license": "Apache-2.0", "optional": true, "os": [ @@ -1980,7 +1972,6 @@ "cpu": [ "mips64el" ], - "dev": true, "license": "Apache-2.0", "optional": true, "os": [ @@ -1997,7 +1988,6 @@ "cpu": [ "ppc64" ], - "dev": true, "license": "Apache-2.0", "optional": true, "os": [ @@ -2014,7 +2004,6 @@ "cpu": [ "riscv64" ], - "dev": true, "license": "Apache-2.0", "optional": true, "os": [ @@ -2031,7 +2020,6 @@ "cpu": [ "s390x" ], - "dev": true, "license": "Apache-2.0", "optional": true, "os": [ @@ -2048,7 +2036,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "Apache-2.0", "optional": true, "os": [ @@ -2065,7 +2052,6 @@ "cpu": [ "arm64" ], - "dev": true, "license": "Apache-2.0", "optional": true, "os": [ @@ -2082,7 +2068,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "Apache-2.0", "optional": true, "os": [ @@ -2099,7 +2084,6 @@ "cpu": [ "arm64" ], - "dev": true, "license": "Apache-2.0", "optional": true, "os": [ @@ -2116,7 +2100,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "Apache-2.0", "optional": true, "os": [ @@ -2133,7 +2116,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "Apache-2.0", "optional": true, "os": [ @@ -2150,7 +2132,6 @@ "cpu": [ "arm64" ], - "dev": true, "license": "Apache-2.0", "optional": true, "os": [ @@ -2167,7 +2148,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "Apache-2.0", "optional": true, "os": [ @@ -3961,13 +3941,13 @@ } }, "node_modules/playwright": { - "version": "1.63.0", - "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.63.0.tgz", - "integrity": "sha512-+7ziBLidS4NaNCdt57SUDT+wYmmd5fmiQejUic/kb+YsYSCPyOOE9sebzMjNmQrsnNpDJqd4WHvV/8lfKfUDUg==", + "version": "1.64.1", + "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.64.1.tgz", + "integrity": "sha512-HCrVhHr5QQuwYoswEUGTb7gGp522yflbv/ST8nF4sFWGuLjQCt17Q/EubpGGSNKYn1tsTCPZxqHhHCfVURu7UA==", "dev": true, "license": "Apache-2.0", "dependencies": { - "playwright-core": "1.63.0" + "playwright-core": "1.64.1" }, "bin": { "playwright": "cli.js" @@ -3977,9 +3957,9 @@ } }, "node_modules/playwright-core": { - "version": "1.63.0", - "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.63.0.tgz", - "integrity": "sha512-rYCsBF/M5HjUch52bbtVONEFjv6Xu8sm8h72dNlR5bzIE1fvC/bxgspzkjSfU+MweEMmPM8KJebG6nnyxo5mCg==", + "version": "1.64.1", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.64.1.tgz", + "integrity": "sha512-BC4s8y6SEVA6Q1rSxZTto8hI1KUI3xXlHGZgvGqP4IqPdI/a6FX9H29IDNz7vKo9l21b6LfYosScPL6M3xxyDQ==", "dev": true, "license": "Apache-2.0", "bin": { diff --git a/package.json b/package.json index 3784f2f1..4e29478e 100644 --- a/package.json +++ b/package.json @@ -39,7 +39,7 @@ "@comfyorg/comfyui-frontend-types": "^1.57.3", "@comfyorg/litegraph": "^0.17.2", "@eslint/js": "^10.0.1", - "@playwright/test": "^1.63.0", + "@playwright/test": "^1.64.1", "@types/node": "^26.6.4", "@vitejs/plugin-vue": "^6.0.9", "@vitest/coverage-v8": "^5.0.5", From fdb0c5b2f16f58b2acddbec575139afe8d118992 Mon Sep 17 00:00:00 2001 From: Ewald ALOEBOETOE <129623145+MajoorWaldi@users.noreply.github.com> Date: Tue, 3 Nov 2026 21:00:06 +0000 Subject: [PATCH 08/23] Align host integration with current ComfyUI frontend/backend - hostAdapter: serialize the root graph instead of calling the now-async graphToPrompt() synchronously (avoids exporting only the open subgraph and an unhandled rejection); read dirty state from the workflow store. - Bump @comfyorg/comfyui-frontend-types to ^1.60.0: 1.57.3 was published without index.d.ts, so the official ComfyApp type was silently lost. - Backend: typed aiohttp request keys (web.RequestKey when available) to silence NotAppKeyWarning on aiohttp >= 3.13 and avoid key clashes. - Fix ruff import-order failures; rebuild dist bundle. - Add docs/COMFYUI_INTEGRATION_AUDIT.md with remaining conflict risks and an integration roadmap. --- ...D8bHMZQk.js => FloatingViewer-C99U6UdL.js} | 14 +-- ...2lOUV.js => LiveStreamTracker-CXkc1cyF.js} | 4 +- ....js => SidebarWorkflowSection-BHtHjc_k.js} | 12 +- ...tor-CP5qPOcc.js => TagsEditor-7DAMS3OV.js} | 6 +- ...{Viewer-DHesfEdb.js => Viewer-DI9upE3v.js} | 12 +- ...l-DZOLbwNu.js => ViewerPortal-uNjS7OxV.js} | 10 +- ...{events-tsQFsZrH.js => events-DxfljH4A.js} | 30 ++--- ...t.js => floatingViewerManager-DKOeP6-T.js} | 6 +- ...enInfo-C_5G1vVv.js => genInfo-Dxtoun1T.js} | 6 +- ...18R8Ewh.js => model3dRenderer-k0ey48io.js} | 2 +- ...HDLb.js => openMajoorSettings-BfOHsVlq.js} | 4 +- ...ide-BI1-c6CN.js => sideBySide-Css6Vh8y.js} | 2 +- ...Fm-S5.js => viewerOpenRequest-CCFPrnGk.js} | 4 +- ...wab-.js => viewerRuntimeHosts-DQcoOjsY.js} | 2 +- dist/entry.js | 36 +++--- docs/COMFYUI_INTEGRATION_AUDIT.md | 119 ++++++++++++++++++ .../metadata/metadata_service_impl.py | 4 +- mjr_am_backend/observability_runtime.py | 11 +- mjr_am_backend/request_keys.py | 37 ++++++ mjr_am_backend/routes/core/request_json.py | 1 + .../routes/core/security_auth_context.py | 3 +- mjr_am_backend/routes/handlers/scan.py | 7 +- mjr_am_backend/routes/handlers/viewer.py | 5 +- mjr_am_backend/routes/registry_middlewares.py | 3 +- mjr_am_shared/version.py | 4 +- package-lock.json | 8 +- package.json | 2 +- tests/core/test_registry_more.py | 3 +- tests/metadata/test_exif_text_images.py | 1 - ui/app/hostAdapter.ts | 35 ++++-- ui/tests/host_adapter_contract.vitest.ts | 37 ++++++ 31 files changed, 326 insertions(+), 104 deletions(-) rename dist/chunks/{FloatingViewer-D8bHMZQk.js => FloatingViewer-C99U6UdL.js} (99%) rename dist/chunks/{LiveStreamTracker-CIt2lOUV.js => LiveStreamTracker-CXkc1cyF.js} (97%) rename dist/chunks/{SidebarWorkflowSection-CZBV2aho.js => SidebarWorkflowSection-BHtHjc_k.js} (99%) rename dist/chunks/{TagsEditor-CP5qPOcc.js => TagsEditor-7DAMS3OV.js} (97%) rename dist/chunks/{Viewer-DHesfEdb.js => Viewer-DI9upE3v.js} (99%) rename dist/chunks/{ViewerPortal-DZOLbwNu.js => ViewerPortal-uNjS7OxV.js} (97%) rename dist/chunks/{events-tsQFsZrH.js => events-DxfljH4A.js} (99%) rename dist/chunks/{floatingViewerManager-DYNfChQt.js => floatingViewerManager-DKOeP6-T.js} (99%) rename dist/chunks/{genInfo-C_5G1vVv.js => genInfo-Dxtoun1T.js} (99%) rename dist/chunks/{model3dRenderer-B18R8Ewh.js => model3dRenderer-k0ey48io.js} (99%) rename dist/chunks/{openMajoorSettings-IdB9HDLb.js => openMajoorSettings-BfOHsVlq.js} (99%) rename dist/chunks/{sideBySide-BI1-c6CN.js => sideBySide-Css6Vh8y.js} (99%) rename dist/chunks/{viewerOpenRequest-Bw0Fm-S5.js => viewerOpenRequest-CCFPrnGk.js} (90%) rename dist/chunks/{viewerRuntimeHosts-Ctr8wab-.js => viewerRuntimeHosts-DQcoOjsY.js} (99%) create mode 100644 docs/COMFYUI_INTEGRATION_AUDIT.md create mode 100644 mjr_am_backend/request_keys.py diff --git a/dist/chunks/FloatingViewer-D8bHMZQk.js b/dist/chunks/FloatingViewer-C99U6UdL.js similarity index 99% rename from dist/chunks/FloatingViewer-D8bHMZQk.js rename to dist/chunks/FloatingViewer-C99U6UdL.js index a69afb9a..ae49467d 100644 --- a/dist/chunks/FloatingViewer-D8bHMZQk.js +++ b/dist/chunks/FloatingViewer-C99U6UdL.js @@ -1,12 +1,12 @@ -import { $t as e, g as t, y as n } from "./viewerRuntimeHosts-Ctr8wab-.js"; -import { B as r, C as i, I as a, M as o, O as s, P as c, R as l, V as u, j as d, m as f, o as p, r as m, rt as h, v as g, w as _, x as v } from "./events-tsQFsZrH.js"; +import { $t as e, g as t, y as n } from "./viewerRuntimeHosts-DQcoOjsY.js"; +import { B as r, C as i, I as a, M as o, O as s, P as c, R as l, V as u, j as d, m as f, o as p, r as m, rt as h, v as g, w as _, x as v } from "./events-DxfljH4A.js"; import { a as y, i as b, o as x, s as S } from "./graphTraversal-DTdQWkn5.js"; -import { _ as C, g as w, m as T, n as E, p as ee, r as D, w as O } from "./Viewer-DHesfEdb.js"; -import { r as k, v as A } from "./SidebarWorkflowSection-CZBV2aho.js"; -import { _ as j, a as M, c as N, d as P, f as F, g as I, h as L, i as te, l as R, m as z, o as ne, p as B, r as re, s as V, t as ie, u as H, v as U } from "./openMajoorSettings-IdB9HDLb.js"; -import { a as W, n as ae, r as oe } from "./model3dRenderer-B18R8Ewh.js"; +import { _ as C, g as w, m as T, n as E, p as ee, r as D, w as O } from "./Viewer-DI9upE3v.js"; +import { r as k, v as A } from "./SidebarWorkflowSection-BHtHjc_k.js"; +import { _ as j, a as M, c as N, d as P, f as F, g as I, h as L, i as te, l as R, m as z, o as ne, p as B, r as re, s as V, t as ie, u as H, v as U } from "./openMajoorSettings-BfOHsVlq.js"; +import { a as W, n as ae, r as oe } from "./model3dRenderer-k0ey48io.js"; import { i as se, o as ce, r as le, t as ue } from "./geninfoParser-CgHp-y-n.js"; -import { t as de } from "./genInfo-C_5G1vVv.js"; +import { t as de } from "./genInfo-Dxtoun1T.js"; // ui/features/viewer/floatingViewerConstants.ts var G = Object.freeze({ SIMPLE: "simple", diff --git a/dist/chunks/LiveStreamTracker-CIt2lOUV.js b/dist/chunks/LiveStreamTracker-CXkc1cyF.js similarity index 97% rename from dist/chunks/LiveStreamTracker-CIt2lOUV.js rename to dist/chunks/LiveStreamTracker-CXkc1cyF.js index 418e52d1..d1c1ea1c 100644 --- a/dist/chunks/LiveStreamTracker-CIt2lOUV.js +++ b/dist/chunks/LiveStreamTracker-CXkc1cyF.js @@ -1,5 +1,5 @@ -import { J as e, o as t, r as n } from "./events-tsQFsZrH.js"; -import { t as r } from "./floatingViewerManager-DYNfChQt.js"; +import { J as e, o as t, r as n } from "./events-DxfljH4A.js"; +import { t as r } from "./floatingViewerManager-DKOeP6-T.js"; // ui/features/viewer/LiveStreamTracker.ts var i = !1, a = null, o = null, s = null, c = null, l = null, u = null, d = null, f = null, p = 0, m = 0, h = !1, g = 400, _ = "kj_preview_override", v = /* @__PURE__ */ new Set([ "image/jpeg", diff --git a/dist/chunks/SidebarWorkflowSection-CZBV2aho.js b/dist/chunks/SidebarWorkflowSection-BHtHjc_k.js similarity index 99% rename from dist/chunks/SidebarWorkflowSection-CZBV2aho.js rename to dist/chunks/SidebarWorkflowSection-BHtHjc_k.js index 8af6d1f8..3a6b75ba 100644 --- a/dist/chunks/SidebarWorkflowSection-CZBV2aho.js +++ b/dist/chunks/SidebarWorkflowSection-BHtHjc_k.js @@ -1,10 +1,10 @@ -import { $ as e, $t as t, At as n, Bt as r, Ct as i, Dt as a, Et as o, Ft as s, Gt as c, Ht as l, I as u, It as d, K as f, Kt as p, Mt as m, N as h, Nt as g, O as _, Ot as v, Pt as y, Q as b, Qt as x, R as S, Rt as C, S as ee, St as te, T as ne, Tt as w, Ut as T, Vt as E, X as re, Y as D, Yt as ie, Z as ae, Zt as oe, at as se, cn as ce, ct as le, dt as ue, en as de, et as fe, gt as pe, it as me, jt as he, k as ge, kt as _e, lt as ve, nt as ye, ot as be, p as xe, rt as Se, sn as Ce, tt as we, ut as Te, w as Ee, wt as De } from "./viewerRuntimeHosts-Ctr8wab-.js"; -import { Ct as Oe, K as ke, N as Ae, T as je, c as Me, d as Ne, f as Pe, h as Fe, j as Ie, l as Le, m as O, o as k, p as Re, pt as ze, s as A, tt as Be, u as Ve, x as He, y as Ue } from "./events-tsQFsZrH.js"; -import { F as We, K as Ge, P as Ke, Y as qe, f as Je, m as Ye, p as Xe } from "./Viewer-DHesfEdb.js"; -import { t as Ze } from "./floatingViewerManager-DYNfChQt.js"; +import { $ as e, $t as t, At as n, Bt as r, Ct as i, Dt as a, Et as o, Ft as s, Gt as c, Ht as l, I as u, It as d, K as f, Kt as p, Mt as m, N as h, Nt as g, O as _, Ot as v, Pt as y, Q as b, Qt as x, R as S, Rt as C, S as ee, St as te, T as ne, Tt as w, Ut as T, Vt as E, X as re, Y as D, Yt as ie, Z as ae, Zt as oe, at as se, cn as ce, ct as le, dt as ue, en as de, et as fe, gt as pe, it as me, jt as he, k as ge, kt as _e, lt as ve, nt as ye, ot as be, p as xe, rt as Se, sn as Ce, tt as we, ut as Te, w as Ee, wt as De } from "./viewerRuntimeHosts-DQcoOjsY.js"; +import { Ct as Oe, K as ke, N as Ae, T as je, c as Me, d as Ne, f as Pe, h as Fe, j as Ie, l as Le, m as O, o as k, p as Re, pt as ze, s as A, tt as Be, u as Ve, x as He, y as Ue } from "./events-DxfljH4A.js"; +import { F as We, K as Ge, P as Ke, Y as qe, f as Je, m as Ye, p as Xe } from "./Viewer-DI9upE3v.js"; +import { t as Ze } from "./floatingViewerManager-DKOeP6-T.js"; import { A as Qe, C as j, D as $e, E as M, G as et, J as tt, K as nt, N as rt, O as N, R as it, S as at, T as P, U as F, V as I, Y as ot, _ as st, a as ct, b as lt, c as ut, d as dt, dt as L, f as ft, ft as R, g as pt, h as mt, i as ht, j as gt, k as z, l as _t, lt as B, m as vt, n as yt, nt as bt, o as xt, p as St, r as Ct, rt as V, s as wt, t as Tt, u as Et, ut as Dt, y as Ot, z as kt } from "./mjr-primevue-BRqtdXzb.js"; import { t as At } from "./mjr-vue-vendor-mHY_eIVE.js"; -import { t as jt } from "./viewerOpenRequest-Bw0Fm-S5.js"; +import { t as jt } from "./viewerOpenRequest-CCFPrnGk.js"; import { a as Mt, i as Nt, n as Pt, o as Ft, r as It, t as Lt } from "./geninfoParser-CgHp-y-n.js"; // ui/app/settings/settingsUtils.ts var H = (e, t) => { @@ -5119,7 +5119,7 @@ var Do = ["title"], Oo = ["src"], ko = { setup(e) { let n = e, r = V(0), i = V(!1), a = null; function o() { - return a ||= import("./floatingViewerManager-DYNfChQt.js").then((e) => e.n), a; + return a ||= import("./floatingViewerManager-DKOeP6-T.js").then((e) => e.n), a; } function s() { return (Array.isArray(n.inputFile?.previewCandidates) ? n.inputFile.previewCandidates : [])[r.value] || ""; diff --git a/dist/chunks/TagsEditor-CP5qPOcc.js b/dist/chunks/TagsEditor-7DAMS3OV.js similarity index 97% rename from dist/chunks/TagsEditor-CP5qPOcc.js rename to dist/chunks/TagsEditor-7DAMS3OV.js index 44e09da5..6c97a968 100644 --- a/dist/chunks/TagsEditor-CP5qPOcc.js +++ b/dist/chunks/TagsEditor-7DAMS3OV.js @@ -1,6 +1,6 @@ -import { $t as e, F as t, v as n } from "./viewerRuntimeHosts-Ctr8wab-.js"; -import { St as r, m as i, n as a } from "./events-tsQFsZrH.js"; -import { Y as o } from "./Viewer-DHesfEdb.js"; +import { $t as e, F as t, v as n } from "./viewerRuntimeHosts-DQcoOjsY.js"; +import { St as r, m as i, n as a } from "./events-DxfljH4A.js"; +import { Y as o } from "./Viewer-DI9upE3v.js"; import { A as s, C as c, E as l, G as u, J as d, K as f, L as ee, N as p, R as te, T as m, U as ne, V as h, Y as g, b as _, ft as v, j as y, k as b, lt as x, rt as S, ut as C, z as w } from "./mjr-primevue-BRqtdXzb.js"; // ui/vue/components/common/TagsEditor.vue?vue&type=script&setup=true&lang.ts var T = ["aria-busy"], E = ["aria-label"], re = { diff --git a/dist/chunks/Viewer-DHesfEdb.js b/dist/chunks/Viewer-DI9upE3v.js similarity index 99% rename from dist/chunks/Viewer-DHesfEdb.js rename to dist/chunks/Viewer-DI9upE3v.js index 899be768..287e6f92 100644 --- a/dist/chunks/Viewer-DHesfEdb.js +++ b/dist/chunks/Viewer-DI9upE3v.js @@ -1,9 +1,9 @@ -import { $t as e, H as t, P as n, _ as r, c as i, d as a, g as o, gt as s, n as c, o as l, r as u, s as d, vt as f, x as p, y as m } from "./viewerRuntimeHosts-Ctr8wab-.js"; -import { Ct as h, D as g, a as _, ct as v, h as y, i as b, j as x, k as S, m as C, n as w, o as T, pt as E, r as D, rt as O, t as k } from "./events-tsQFsZrH.js"; +import { $t as e, H as t, P as n, _ as r, c as i, d as a, g as o, gt as s, n as c, o as l, r as u, s as d, vt as f, x as p, y as m } from "./viewerRuntimeHosts-DQcoOjsY.js"; +import { Ct as h, D as g, a as _, ct as v, h as y, i as b, j as x, k as S, m as C, n as w, o as T, pt as E, r as D, rt as O, t as k } from "./events-DxfljH4A.js"; import { T as A, nt as j, rt as M } from "./mjr-primevue-BRqtdXzb.js"; import { n as N, r as ee } from "./mjr-vue-vendor-mHY_eIVE.js"; import { n as P, r as te, t as F } from "./state-D0Gu1AgG.js"; -import { a as ne, c as re, i as ie, o as ae, r as oe, s as se } from "./model3dRenderer-B18R8Ewh.js"; +import { a as ne, c as re, i as ie, o as ae, r as oe, s as se } from "./model3dRenderer-k0ey48io.js"; // ui/utils/events.ts function ce(e, t, { target: n = null, warnPrefix: r = "[Majoor]" } = {}) { let i = n || (typeof window < "u" ? window : null); @@ -9619,13 +9619,13 @@ var Wr = null, Gr = null, Kr = null, qr = null, Jr = null, Yr = null; function Xr() { Wr || import("./abCompare-BUrGm4-x.js").then((e) => { Wr = e; - }), Gr || import("./sideBySide-BI1-c6CN.js").then((e) => { + }), Gr || import("./sideBySide-Css6Vh8y.js").then((e) => { Gr = e; - }), Kr || import("./model3dRenderer-B18R8Ewh.js").then((e) => e.t).then((e) => { + }), Kr || import("./model3dRenderer-k0ey48io.js").then((e) => e.t).then((e) => { Kr = e; }), qr || import("./scopes-bvTRS68K.js").then((e) => { qr = e; - }), Jr || import("./genInfo-C_5G1vVv.js").then((e) => e.n).then((e) => { + }), Jr || import("./genInfo-Dxtoun1T.js").then((e) => e.n).then((e) => { Jr = e; }), Yr || import("./frameExport-CnNO7oN6.js").then((e) => { Yr = e; diff --git a/dist/chunks/ViewerPortal-DZOLbwNu.js b/dist/chunks/ViewerPortal-uNjS7OxV.js similarity index 97% rename from dist/chunks/ViewerPortal-DZOLbwNu.js rename to dist/chunks/ViewerPortal-uNjS7OxV.js index 2249ad12..c8630aa5 100644 --- a/dist/chunks/ViewerPortal-DZOLbwNu.js +++ b/dist/chunks/ViewerPortal-uNjS7OxV.js @@ -1,9 +1,9 @@ -import { a as e, i as t } from "./viewerRuntimeHosts-Ctr8wab-.js"; -import { r as n } from "./events-tsQFsZrH.js"; -import { a as r, c as i, i as a, l as o, o as s, s as c, t as l, u } from "./Viewer-DHesfEdb.js"; -import { i as d, r as f } from "./floatingViewerManager-DYNfChQt.js"; +import { a as e, i as t } from "./viewerRuntimeHosts-DQcoOjsY.js"; +import { r as n } from "./events-DxfljH4A.js"; +import { a as r, c as i, i as a, l as o, o as s, s as c, t as l, u } from "./Viewer-DI9upE3v.js"; +import { i as d, r as f } from "./floatingViewerManager-DKOeP6-T.js"; import { B as p, C as m, D as h, E as g, G as _, J as v, K as y, L as b, N as x, O as S, T as C, U as w, V as T, dt as E, ft as D, j as O, k, lt as A, rt as j, ut as M, w as N, z as P } from "./mjr-primevue-BRqtdXzb.js"; -import { t as F } from "./TagsEditor-CP5qPOcc.js"; +import { t as F } from "./TagsEditor-7DAMS3OV.js"; // ui/vue/components/viewer/FloatingViewerHost.vue var I = /* @__PURE__ */ x({ __name: "FloatingViewerHost", diff --git a/dist/chunks/events-tsQFsZrH.js b/dist/chunks/events-DxfljH4A.js similarity index 99% rename from dist/chunks/events-tsQFsZrH.js rename to dist/chunks/events-DxfljH4A.js index ce5c2cab..b25e5a0a 100644 --- a/dist/chunks/events-tsQFsZrH.js +++ b/dist/chunks/events-DxfljH4A.js @@ -964,23 +964,23 @@ function ut(e, t = null) { mode: "none" }; } -function dt(e = null) { +function dt(t = null) { try { - let t = e || N || j(); - if (typeof t?.graphToPrompt == "function") { - let e = t.graphToPrompt(); - if (e?.workflow && typeof e.workflow == "object") return e.workflow; - } - let n = L(t); - if (typeof n?.serialize == "function") { - let e = n.serialize(); - if (e && typeof e == "object") return e; - } - let r = t?.rootGraph || t?.graph?.rootGraph || null; + let n = t || N || j(), r = e(n); if (typeof r?.serialize == "function") { let e = r.serialize(); if (e && typeof e == "object") return e; } + let i = L(n); + if (i !== r && typeof i?.serialize == "function") { + let e = i.serialize(); + if (e && typeof e == "object") return e; + } + if (typeof n?.graphToPrompt == "function") { + let e = n.graphToPrompt(); + if (e && typeof e.then == "function") return e.then(void 0, (e) => console.debug?.(e)), null; + if (e?.workflow && typeof e.workflow == "object") return e.workflow; + } } catch (e) { console.debug?.(e); } @@ -990,7 +990,9 @@ function ft(e = null) { try { let t = e || N || j(); if (!t) return null; - let n = [ + let n = t?.extensionManager?.workflow?.activeWorkflow; + if (typeof n?.isModified == "boolean") return n.isModified; + let r = [ t?.isDirty, t?.dirty, t?.graph?.isDirty, @@ -1000,7 +1002,7 @@ function ft(e = null) { t?.graph?.has_changed, t?.graph?.changed ]; - for (let e of n) { + for (let e of r) { if (typeof e == "boolean") return e; if (typeof e == "number") return e !== 0; if (typeof e == "function") try { diff --git a/dist/chunks/floatingViewerManager-DYNfChQt.js b/dist/chunks/floatingViewerManager-DKOeP6-T.js similarity index 99% rename from dist/chunks/floatingViewerManager-DYNfChQt.js rename to dist/chunks/floatingViewerManager-DKOeP6-T.js index 875b9478..0c60d21d 100644 --- a/dist/chunks/floatingViewerManager-DYNfChQt.js +++ b/dist/chunks/floatingViewerManager-DKOeP6-T.js @@ -1,6 +1,6 @@ import { t as e } from "./rolldown-runtime-CGnMp29N.js"; -import { _ as t, d as n, o as r, s as i, t as a } from "./viewerRuntimeHosts-Ctr8wab-.js"; -import { o, r as s, z as c } from "./events-tsQFsZrH.js"; +import { _ as t, d as n, o as r, s as i, t as a } from "./viewerRuntimeHosts-DQcoOjsY.js"; +import { o, r as s, z as c } from "./events-DxfljH4A.js"; // ui/features/panel/panelRuntimeRefs.ts var l = null; function u(e) { @@ -96,7 +96,7 @@ var te = /* @__PURE__ */ e({ teardownFloatingViewerManager: () => we }), v = null, y = null; async function ne() { - return v || (y ||= import("./FloatingViewer-D8bHMZQk.js").then((e) => (v = e.FloatingViewer, v)), y); + return v || (y ||= import("./FloatingViewer-C99U6UdL.js").then((e) => (v = e.FloatingViewer, v)), y); } var b = null, re = null; async function ie() { diff --git a/dist/chunks/genInfo-C_5G1vVv.js b/dist/chunks/genInfo-Dxtoun1T.js similarity index 99% rename from dist/chunks/genInfo-C_5G1vVv.js rename to dist/chunks/genInfo-Dxtoun1T.js index 1388bc9f..056f1e44 100644 --- a/dist/chunks/genInfo-C_5G1vVv.js +++ b/dist/chunks/genInfo-Dxtoun1T.js @@ -1,7 +1,7 @@ import { t as e } from "./rolldown-runtime-CGnMp29N.js"; -import { m as t, o as n } from "./events-tsQFsZrH.js"; -import { h as r } from "./Viewer-DHesfEdb.js"; -import { i, n as a, r as o, t as s, u as c } from "./SidebarWorkflowSection-CZBV2aho.js"; +import { m as t, o as n } from "./events-DxfljH4A.js"; +import { h as r } from "./Viewer-DI9upE3v.js"; +import { i, n as a, r as o, t as s, u as c } from "./SidebarWorkflowSection-BHtHjc_k.js"; import { D as l, E as u, N as d, O as f, T as p, V as m, dt as h, ft as g, k as _, lt as v } from "./mjr-primevue-BRqtdXzb.js"; // ui/vue/components/viewer/ViewerMetadataBlock.vue?vue&type=script&setup=true&lang.ts var y = { style: { diff --git a/dist/chunks/model3dRenderer-B18R8Ewh.js b/dist/chunks/model3dRenderer-k0ey48io.js similarity index 99% rename from dist/chunks/model3dRenderer-B18R8Ewh.js rename to dist/chunks/model3dRenderer-k0ey48io.js index 4ea97062..2641c018 100644 --- a/dist/chunks/model3dRenderer-B18R8Ewh.js +++ b/dist/chunks/model3dRenderer-k0ey48io.js @@ -1,5 +1,5 @@ import { t as e } from "./rolldown-runtime-CGnMp29N.js"; -import { m as t, mt as n, o as r, r as i } from "./events-tsQFsZrH.js"; +import { m as t, mt as n, o as r, r as i } from "./events-DxfljH4A.js"; import { n as a } from "./state-D0Gu1AgG.js"; // ui/features/viewer/model3dCore.ts function o(e, t) { diff --git a/dist/chunks/openMajoorSettings-IdB9HDLb.js b/dist/chunks/openMajoorSettings-BfOHsVlq.js similarity index 99% rename from dist/chunks/openMajoorSettings-IdB9HDLb.js rename to dist/chunks/openMajoorSettings-BfOHsVlq.js index 20f8ca1f..3f6a8644 100644 --- a/dist/chunks/openMajoorSettings-IdB9HDLb.js +++ b/dist/chunks/openMajoorSettings-BfOHsVlq.js @@ -1,6 +1,6 @@ -import { A as e, E as t, J as n, R as r, S as i, Y as a, b as o, j as s, m as c } from "./events-tsQFsZrH.js"; +import { A as e, E as t, J as n, R as r, S as i, Y as a, b as o, j as s, m as c } from "./events-DxfljH4A.js"; import { a as l, n as u } from "./graphTraversal-DTdQWkn5.js"; -import { S as d, Y as f, b as p, x as m, y as h } from "./SidebarWorkflowSection-CZBV2aho.js"; +import { S as d, Y as f, b as p, x as m, y as h } from "./SidebarWorkflowSection-BHtHjc_k.js"; // ui/features/viewer/floatingViewerProgress.ts var g = "progress-update", _ = "__MJR_MFV_PROGRESS_SERVICE__"; function ee() { diff --git a/dist/chunks/sideBySide-BI1-c6CN.js b/dist/chunks/sideBySide-Css6Vh8y.js similarity index 99% rename from dist/chunks/sideBySide-BI1-c6CN.js rename to dist/chunks/sideBySide-Css6Vh8y.js index ad59c54a..95bd34fe 100644 --- a/dist/chunks/sideBySide-BI1-c6CN.js +++ b/dist/chunks/sideBySide-Css6Vh8y.js @@ -1,4 +1,4 @@ -import { i as e } from "./model3dRenderer-B18R8Ewh.js"; +import { i as e } from "./model3dRenderer-k0ey48io.js"; import { i as t, o as n } from "./geninfoParser-CgHp-y-n.js"; // ui/features/viewer/sideBySide.ts function r(e) { diff --git a/dist/chunks/viewerOpenRequest-Bw0Fm-S5.js b/dist/chunks/viewerOpenRequest-CCFPrnGk.js similarity index 90% rename from dist/chunks/viewerOpenRequest-Bw0Fm-S5.js rename to dist/chunks/viewerOpenRequest-CCFPrnGk.js index 305f02c5..05c52289 100644 --- a/dist/chunks/viewerOpenRequest-Bw0Fm-S5.js +++ b/dist/chunks/viewerOpenRequest-CCFPrnGk.js @@ -1,6 +1,6 @@ import { t as e } from "./rolldown-runtime-CGnMp29N.js"; -import { r as t } from "./events-tsQFsZrH.js"; -import { t as n } from "./Viewer-DHesfEdb.js"; +import { r as t } from "./events-DxfljH4A.js"; +import { t as n } from "./Viewer-DI9upE3v.js"; // ui/features/viewer/viewerOpenRequest.ts var r = /* @__PURE__ */ e({ requestViewerOpen: () => o }); function i(e) { diff --git a/dist/chunks/viewerRuntimeHosts-Ctr8wab-.js b/dist/chunks/viewerRuntimeHosts-DQcoOjsY.js similarity index 99% rename from dist/chunks/viewerRuntimeHosts-Ctr8wab-.js rename to dist/chunks/viewerRuntimeHosts-DQcoOjsY.js index e846913a..6190750f 100644 --- a/dist/chunks/viewerRuntimeHosts-Ctr8wab-.js +++ b/dist/chunks/viewerRuntimeHosts-DQcoOjsY.js @@ -1,4 +1,4 @@ -import { Ct as e, St as t, _t as n, gt as r, ht as i, k as a, m as o, nt as s, o as c, tt as l, vt as u, xt as d } from "./events-tsQFsZrH.js"; +import { Ct as e, St as t, _t as n, gt as r, ht as i, k as a, m as o, nt as s, o as c, tt as l, vt as u, xt as d } from "./events-DxfljH4A.js"; // ui/app/settingsStore.ts var f = "mjrSettings", p = "mjrMinimapSettings", m = /* @__PURE__ */ new Set([ "POST", diff --git a/dist/entry.js b/dist/entry.js index 768afc88..51a2d33f 100644 --- a/dist/entry.js +++ b/dist/entry.js @@ -1,13 +1,13 @@ -import { $t as e, A as t, B as n, Bt as r, C as i, D as a, E as o, Et as s, G as c, H as l, J as u, Jt as d, L as f, Lt as p, M as m, N as h, O as g, P as _, Rt as v, S as y, U as b, Ut as x, V as S, Vt as C, W as w, Wt as T, Xt as E, Yt as D, _ as O, _t as k, an as A, b as j, bt as M, c as N, d as P, en as ee, f as te, ft as F, g as I, gt as ne, h as re, ht as ie, in as ae, j as oe, jt as se, k as L, l as ce, m as le, mt as ue, nn as de, o as fe, on as pe, pt as me, q as he, qt as ge, rn as _e, s as ve, st as ye, tn as be, u as xe, ut as Se, vt as Ce, w as we, xt as Te, y as Ee, yt as De, z as Oe, zt as ke } from "./chunks/viewerRuntimeHosts-Ctr8wab-.js"; -import { $ as Ae, A as je, Ct as Me, F as Ne, G as Pe, H as Fe, K as Ie, L as Le, Q as Re, St as ze, U as Be, W as Ve, X as He, Z as Ue, _ as We, at as Ge, bt as Ke, ct as qe, dt as Je, et as Ye, ft as Xe, g as Ze, it as Qe, j as $e, lt as et, m as R, n as z, o as B, ot as tt, pt as nt, q as rt, r as V, rt as it, st as at, t as ot, tt as st, ut as ct, xt as lt, yt as ut } from "./chunks/events-tsQFsZrH.js"; +import { $t as e, A as t, B as n, Bt as r, C as i, D as a, E as o, Et as s, G as c, H as l, J as u, Jt as d, L as f, Lt as p, M as m, N as h, O as g, P as _, Rt as v, S as y, U as b, Ut as x, V as S, Vt as C, W as w, Wt as T, Xt as E, Yt as D, _ as O, _t as k, an as A, b as j, bt as M, c as N, d as P, en as ee, f as te, ft as F, g as I, gt as ne, h as re, ht as ie, in as ae, j as oe, jt as se, k as L, l as ce, m as le, mt as ue, nn as de, o as fe, on as pe, pt as me, q as he, qt as ge, rn as _e, s as ve, st as ye, tn as be, u as xe, ut as Se, vt as Ce, w as we, xt as Te, y as Ee, yt as De, z as Oe, zt as ke } from "./chunks/viewerRuntimeHosts-DQcoOjsY.js"; +import { $ as Ae, A as je, Ct as Me, F as Ne, G as Pe, H as Fe, K as Ie, L as Le, Q as Re, St as ze, U as Be, W as Ve, X as He, Z as Ue, _ as We, at as Ge, bt as Ke, ct as qe, dt as Je, et as Ye, ft as Xe, g as Ze, it as Qe, j as $e, lt as et, m as R, n as z, o as B, ot as tt, pt as nt, q as rt, r as V, rt as it, st as at, t as ot, tt as st, ut as ct, xt as lt, yt as ut } from "./chunks/events-DxfljH4A.js"; import { a as dt, i as ft, n as pt, t as mt } from "./chunks/graphTraversal-DTdQWkn5.js"; -import { A as ht, B as gt, C as _t, D as vt, E as yt, F as bt, G as xt, H as St, I as Ct, J as wt, L as Tt, M as Et, N as Dt, O as Ot, P as kt, R as At, S as jt, T as Mt, U as Nt, V as Pt, W as Ft, Y as It, _ as Lt, b as Rt, d as zt, g as Bt, j as Vt, k as Ht, q as Ut, v as Wt, x as Gt, y as Kt, z as qt } from "./chunks/Viewer-DHesfEdb.js"; -import { $ as Jt, A as Yt, B as Xt, C as Zt, D as Qt, E as $t, F as en, G as tn, H as nn, I as rn, J as an, K as on, L as sn, M as cn, N as ln, O as un, P as dn, Q as fn, R as pn, T as mn, U as hn, V as gn, W as _n, X as vn, Y as yn, Z as bn, _ as xn, a as Sn, c as Cn, d as wn, et as Tn, f as En, g as Dn, h as On, i as kn, j as An, k as jn, l as Mn, m as Nn, n as Pn, o as Fn, p as In, q as Ln, s as Rn, t as zn, u as Bn, w as Vn, z as Hn } from "./chunks/SidebarWorkflowSection-CZBV2aho.js"; -import { _ as Un, i as Wn, n as Gn, p as Kn, t as qn } from "./chunks/openMajoorSettings-IdB9HDLb.js"; -import { a as Jn, c as Yn, l as Xn, o as Zn, s as Qn, u as $n } from "./chunks/floatingViewerManager-DYNfChQt.js"; +import { A as ht, B as gt, C as _t, D as vt, E as yt, F as bt, G as xt, H as St, I as Ct, J as wt, L as Tt, M as Et, N as Dt, O as Ot, P as kt, R as At, S as jt, T as Mt, U as Nt, V as Pt, W as Ft, Y as It, _ as Lt, b as Rt, d as zt, g as Bt, j as Vt, k as Ht, q as Ut, v as Wt, x as Gt, y as Kt, z as qt } from "./chunks/Viewer-DI9upE3v.js"; +import { $ as Jt, A as Yt, B as Xt, C as Zt, D as Qt, E as $t, F as en, G as tn, H as nn, I as rn, J as an, K as on, L as sn, M as cn, N as ln, O as un, P as dn, Q as fn, R as pn, T as mn, U as hn, V as gn, W as _n, X as vn, Y as yn, Z as bn, _ as xn, a as Sn, c as Cn, d as wn, et as Tn, f as En, g as Dn, h as On, i as kn, j as An, k as jn, l as Mn, m as Nn, n as Pn, o as Fn, p as In, q as Ln, s as Rn, t as zn, u as Bn, w as Vn, z as Hn } from "./chunks/SidebarWorkflowSection-BHtHjc_k.js"; +import { _ as Un, i as Wn, n as Gn, p as Kn, t as qn } from "./chunks/openMajoorSettings-BfOHsVlq.js"; +import { a as Jn, c as Yn, l as Xn, o as Zn, s as Qn, u as $n } from "./chunks/floatingViewerManager-DKOeP6-T.js"; import { A as er, B as tr, C as H, D as nr, E as U, G as rr, H as ir, I as ar, J as W, K as or, L as sr, M as cr, N as lr, O as G, P as ur, R as dr, S as fr, T as K, U as pr, V as q, W as mr, Y as hr, at as gr, b as _r, ct as vr, dt as yr, ft as J, it as br, j as Y, k as X, lt as Z, nt as xr, q as Sr, rt as Q, tt as Cr, ut as wr, v as Tr, w as Er, x as Dr, y as Or, z as kr } from "./chunks/mjr-primevue-BRqtdXzb.js"; import { n as Ar, r as jr } from "./chunks/mjr-vue-vendor-mHY_eIVE.js"; -import { t as Mr } from "./chunks/TagsEditor-CP5qPOcc.js"; +import { t as Mr } from "./chunks/TagsEditor-7DAMS3OV.js"; import { app as Nr } from "../../scripts/app.js"; function Pr(e = null) { return null; @@ -869,7 +869,7 @@ var Oi = { } }, ki = null; function Ai() { - return ki ||= import("./chunks/viewerOpenRequest-Bw0Fm-S5.js").then((e) => e.n), ki; + return ki ||= import("./chunks/viewerOpenRequest-CCFPrnGk.js").then((e) => e.n), ki; } function ji(e) { if (!e) return ""; @@ -1361,10 +1361,10 @@ function zi() { // ui/features/contextmenu/GridContextMenu.ts var Bi = 1, Vi = null, Hi = null; function Ui() { - return Vi ||= import("./chunks/viewerOpenRequest-Bw0Fm-S5.js").then((e) => e.n), Vi; + return Vi ||= import("./chunks/viewerOpenRequest-CCFPrnGk.js").then((e) => e.n), Vi; } function Wi() { - return Hi ||= import("./chunks/floatingViewerManager-DYNfChQt.js").then((e) => e.n), Hi; + return Hi ||= import("./chunks/floatingViewerManager-DKOeP6-T.js").then((e) => e.n), Hi; } function Gi(e) { let t = String(e || "").trim().toLowerCase(); @@ -7556,10 +7556,10 @@ var Lu = { Q(!0); let s = Q(0), c = Q(0), l = /* @__PURE__ */ new WeakMap(), u = 0, d = 0, f = 0, p = 0, m = 0, h = /* @__PURE__ */ new Map(), g = null, _ = null; function v() { - return g ||= import("./chunks/viewerOpenRequest-Bw0Fm-S5.js").then((e) => e.n), g; + return g ||= import("./chunks/viewerOpenRequest-CCFPrnGk.js").then((e) => e.n), g; } function b() { - return _ ||= import("./chunks/floatingViewerManager-DYNfChQt.js").then((e) => e.n), _; + return _ ||= import("./chunks/floatingViewerManager-DKOeP6-T.js").then((e) => e.n), _; } function x(e) { return (Array.isArray(e) ? e : []).slice().sort((e, t) => { @@ -8824,10 +8824,10 @@ var Lu = { } }), Qu = 240, $u = 120, ed = 80, td = null, nd = null; function rd() { - return td ||= import("./chunks/viewerOpenRequest-Bw0Fm-S5.js").then((e) => e.n), td; + return td ||= import("./chunks/viewerOpenRequest-CCFPrnGk.js").then((e) => e.n), td; } function id() { - return nd ||= import("./chunks/floatingViewerManager-DYNfChQt.js").then((e) => e.n), nd; + return nd ||= import("./chunks/floatingViewerManager-DKOeP6-T.js").then((e) => e.n), nd; } function ad(e) { let t = document.createElement("button"); @@ -11041,7 +11041,7 @@ function Pp() { var Fp = /* @__PURE__ */ lr({ __name: "GlobalRuntime", setup(e) { - let t = cr(() => import("./chunks/ViewerPortal-DZOLbwNu.js")), n = Q(!1), r = [ + let t = cr(() => import("./chunks/ViewerPortal-uNjS7OxV.js")), n = Q(!1), r = [ V.OPEN_VIEWER, V.MFV_OPEN, V.MFV_TOGGLE, @@ -23906,7 +23906,7 @@ async function gC(e) { try { let t = await pC(e); if (t.length) { - let { floatingViewerManager: e } = await import("./chunks/floatingViewerManager-DYNfChQt.js").then((e) => e.n); + let { floatingViewerManager: e } = await import("./chunks/floatingViewerManager-DKOeP6-T.js").then((e) => e.n); if (await e.openAssets({ assets: t, index: 0 @@ -24362,7 +24362,7 @@ function UC({ cleanupEntryRuntimeFn: e = VC, teardownLiveStreamTracker: t, teard // ui/entry.ts var WC = null, GC = null, KC = null; function qC() { - return KC ||= import("./chunks/floatingViewerManager-DYNfChQt.js").then((e) => e.n), KC; + return KC ||= import("./chunks/floatingViewerManager-DKOeP6-T.js").then((e) => e.n), KC; } function JC() { KC && KC.then((e) => e?.teardownFloatingViewerManager?.()).catch((e) => console.debug?.("[Majoor] MFV teardown skipped", e)); @@ -24482,7 +24482,7 @@ function pw(e = 1200) { }, Math.max(250, Number(e) || 0)); } function mw(e) { - import("./chunks/LiveStreamTracker-CIt2lOUV.js").then((t) => { + import("./chunks/LiveStreamTracker-CXkc1cyF.js").then((t) => { WC = t; try { t.initLiveStreamTracker(e); diff --git a/docs/COMFYUI_INTEGRATION_AUDIT.md b/docs/COMFYUI_INTEGRATION_AUDIT.md new file mode 100644 index 00000000..ffcff843 --- /dev/null +++ b/docs/COMFYUI_INTEGRATION_AUDIT.md @@ -0,0 +1,119 @@ +# Audit d'intégration ComfyUI — novembre 2026 + +Audit du code backend (aiohttp / PromptServer / nœuds V3) et frontend (extension +Vue/TS) de Majoor Assets Manager v2.5.3, face aux versions récentes de ComfyUI +(core avec API Assets/Jobs, frontend 1.5x–1.60, sous-graphes, nœuds V3). + +Objectif : faire évoluer l'extension **sans conflit** avec le core et avec les +autres custom nodes, et s'appuyer sur les API officielles plutôt que sur des +internes. + +## 1. État des lieux + +Tous les contrôles existants passent sur la branche : + +| Contrôle | Résultat | +| --- | --- | +| `tsc -p tsconfig.json` | OK | +| `vitest run` | 157 fichiers, 858 tests OK | +| `pytest` | 1931 OK, 2 ignorés (torch absent) | +| `ruff` | 5 erreurs d'ordre d'imports → corrigées | + +L'architecture d'intégration est déjà saine : + +- **Frontend** : une couche unique `ui/app/hostAdapter.ts` → `comfyApiBridge.ts` + (ADR 0007) isole toutes les API ComfyUI ; commandes, raccourcis, menus + (`menuCommands`, `getCanvasMenuItems`, `getNodeMenuItems`, + `getSelectionToolboxCommands`), onglets latéral/bas et toasts passent par + l'API déclarative d'extension. Les ID de nœuds de sous-graphes (`"12:5"`) sont + résolus par `graphTraversal.findGraphNodeById`. Les écouteurs + `execution_start/success/error/interrupted` sont tous enregistrés et retirés. +- **Backend** : `adapters/comfy_core.py` sonde les capacités du core (assets, + jobs, user manager, websocket) sans import dur ; toutes les routes sont sous + `/mjr/am/*` ; les middlewares ne s'appliquent qu'aux chemins Majoor (y compris + le miroir `/api/mjr/am/*` ajouté par `server.py`). +- **Nœuds** : schéma V3 (`comfy_api.latest`, `comfy_entrypoint`) avec + dégradation à zéro nœud si une dépendance optionnelle manque. + +## 2. Problèmes trouvés et corrigés dans cette branche + +### 2.1 `graphToPrompt()` appelé de façon synchrone (frontend) +`serializeCurrentHostWorkflow()` (utilisé par le bouton d'en-tête du panneau) +appelait `app.graphToPrompt()` et lisait `.workflow` directement. Depuis le +frontend 1.x, `graphToPrompt` est **asynchrone** (`Promise<{output, workflow}>`, +confirmé dans `comfyui-frontend-types@1.60`). Conséquences : sérialisation +complète des widgets lancée pour rien à chaque appel, résultat ignoré, rejet de +promesse potentiellement non géré. + +Correctif : on sérialise d'abord le **graphe racine** (`getHostRootGraph`), ce +qui évite aussi d'exporter seulement le sous-graphe ouvert ; `graphToPrompt` ne +reste qu'en repli pour les anciens hôtes synchrones, et une promesse retournée +est neutralisée proprement. Tests ajoutés dans +`ui/tests/host_adapter_contract.vitest.ts`. + +### 2.2 État « modifié » du workflow +`isHostWorkflowDirty()` ne lisait que des drapeaux historiques. Il interroge +désormais d'abord `app.extensionManager.workflow.activeWorkflow.isModified`, +le signal officiel du store de workflows, puis retombe sur les anciens. + +### 2.3 Types officiels du frontend absents +`@comfyorg/comfyui-frontend-types@1.57.3` a été publié **sans `index.d.ts`** +(seulement `package.json` + `LICENSE` ; idem 1.56.0). Avec `skipLibCheck`, le +type `OfficialComfyApp` réexporté par `ui/types/comfyui-frontend.d.ts` +devenait silencieusement inutilisable. Mise à jour vers `^1.60.0` (contient +bien les déclarations) ; `tsc` reste vert. + +### 2.4 Clés de requête aiohttp +aiohttp ≥ 3.13 émet `NotAppKeyWarning` pour `request["mjr_user_id"]`, +`request["mjr_stats"]`, etc. Nouveau module `mjr_am_backend/request_keys.py` : +utilise `web.RequestKey` quand il existe, sinon la clé texte historique (ComfyUI +n'exige que `aiohttp>=3.11`). Tous les lecteurs/écrivains passent par ces +constantes, ce qui évite aussi toute collision avec les clés d'autres +extensions sur l'objet requête partagé. + +### 2.5 Lint +Imports non triés dans 5 fichiers (`ruff --fix`) qui faisaient échouer +`npm run quality:py`. + +## 3. Risques de conflit restants (non modifiés, à décider) + +| # | Risque | Gravité | Recommandation | +| --- | --- | --- | --- | +| R1 | La couche de compatibilité `/api/v2/assets/*` occupe un espace de noms qui appartient au core (`/api/...`). Si ComfyUI publie un jour `/api/v2/assets`, les routes du core (enregistrées en premier) masqueront silencieusement celles de Majoor. | Moyenne | Exposer la même surface sous `/mjr/am/compat/assets/*`, garder `/api/v2/assets` comme alias déprécié, puis le retirer. | +| R2 | `api.queuePrompt` est enveloppé (`floatingViewerProgress.ts`) pour suivre les prompts. Fonctionne, mais d'autres extensions font de même et l'ordre d'enveloppement n'est pas garanti. | Faible | Le frontend envoie déjà `execution_start` avec `prompt_id` ; à terme, s'appuyer uniquement sur les événements websocket et l'API Jobs du core (`adapters/comfy_core` détecte déjà `jobs`). | +| R3 | Les middlewares sont insérés en tête de `app.middlewares`. Ils filtrent bien les chemins Majoor, mais l'insertion échoue si l'app est déjà figée (`freeze()`), ce qui est rattrapé et signalé en « degraded » dans `/mjr/am/health`. | Faible | Garder ; surveiller l'étape `security_middlewares` dans le rapport de démarrage. | +| R4 | Doublon fonctionnel avec la barre latérale native « Assets » du frontend (onglet média du core). Les ID (`majoor-assets`) ne se chevauchent pas, mais deux panneaux similaires coexistent. | UX | Proposer un réglage « Remplacer l'onglet Assets natif » plutôt que masquer quoi que ce soit par défaut. | +| R5 | `requires-python = ">=3.10, <3.14"` : bloque les installations ComfyUI en Python 3.14 via le Registry/comfy-cli. | Moyenne | Vérifier les roues `av`, `blake3`, `pywin32` pour 3.14, lancer la CI sur 3.14, puis relever la borne. | +| R6 | `@comfyorg/litegraph@0.17.2` en devDependency : LiteGraph est désormais intégré au frontend et ses types sont exportés par `comfyui-frontend-types`. | Faible | Importer `LGraph`/`LGraphCanvas` depuis `@comfyorg/comfyui-frontend-types` et retirer le paquet séparé. | +| R7 | `import { app } from "../../scripts/app.js"` dans `ui/entry.ts` : shim encore supporté, mais le frontend pousse vers `window.comfyAPI` et a déjà déprécié d'autres modules `scripts/*`. | Faible | `comfyApiBridge` sait déjà attendre l'app ; préférer `window.comfyAPI?.app?.app` avec repli sur l'import. | +| R8 | 913 erreurs de typage dans `tsconfig.test.json` (script « advisory »). | Dette | Les réduire progressivement ; ne bloque pas le runtime. | + +## 4. Feuille de route d'évolution (meilleure intégration) + +1. **Progression par nœud** — écouter l'événement websocket `progress_state` + (déclaré dans `comfyui-frontend-types`) pour une progression fiable dans les + sous-graphes et en exécution parallèle, en complément de `progress`. +2. **API Jobs du core** — utiliser l'historique/les jobs du core (déjà détectés + par `ComfyCoreCapabilities.jobs`) pour rattacher chaque sortie à son prompt, + au lieu de reconstruire cet état côté Majoor. +3. **API Assets du core** — quand `capabilities.assets` est vrai, synchroniser + les tags/notes avec `/api/assets` (lecture seule d'abord), afin que les + assets soient visibles dans les deux panneaux sans double indexation. +4. **Multi-utilisateur** — brancher `onAuthUserResolved` (nouveau hook + d'extension) pour rafraîchir les réglages par utilisateur au lieu de sonder. +5. **Barre d'actions** — `actionBarButtons` / `topbarBadges` remplacent proprement + le bouton MFV injecté dans la barre supérieure (`teardownTopBarMfvButton`). +6. **Mode Nodes 2.0 (Vue)** — vérifier que le flux de nœuds (`nodeStream`) et + les menus contextuels fonctionnent quand le canvas LiteGraph n'appelle plus + `onDrawForeground` ; privilégier les données d'exécution aux hooks de dessin. + +## 5. Règles pour rester sans conflit + +- Ne jamais enregistrer de route hors de `/mjr/am/*` (ni sous `/api/*`). +- Toute nouvelle API ComfyUI passe par `hostAdapter.ts` (front) ou + `adapters/comfy_core.py` (back), avec détection de capacité et repli. +- Préfixer réglages (`Majoor.*`), commandes (`mjr.*`), événements websocket + (`mjr-*` / `mjr.*`) et clés de requête (`request_keys.py`). +- Ne pas modifier de prototypes LiteGraph ni d'objets globaux du core ; un + enveloppement inévitable doit être réversible (cf. `wrapHostQueuePrompt`). +- Reconstruire `dist/` (`npm run build`) à chaque modification de `ui/`. diff --git a/mjr_am_backend/features/metadata/metadata_service_impl.py b/mjr_am_backend/features/metadata/metadata_service_impl.py index db654b8e..aed3c678 100644 --- a/mjr_am_backend/features/metadata/metadata_service_impl.py +++ b/mjr_am_backend/features/metadata/metadata_service_impl.py @@ -20,6 +20,9 @@ from ..geninfo.parser import parse_geninfo_from_prompt from ..workflows import classify_workflow, parse_workflow, workflow_node_text from .dimension_resolver import get_file_info as dims_get_file_info from .dimension_resolver import normalize_dimensions +from .extractor_registry import ( + EXIF_TEXT_IMAGE_EXTS, +) from .extractor_registry import ( batch_tool_data as registry_batch_tool_data, ) @@ -39,7 +42,6 @@ from .extractor_registry import ( expand_video_resolution_fields as registry_expand_video_resolution_fields, ) from .extractor_registry import ( - EXIF_TEXT_IMAGE_EXTS, extract_image_by_extension as registry_extract_image_by_extension, ) from .extractor_registry import ( diff --git a/mjr_am_backend/observability_runtime.py b/mjr_am_backend/observability_runtime.py index 9e1a10b1..88ea25f6 100644 --- a/mjr_am_backend/observability_runtime.py +++ b/mjr_am_backend/observability_runtime.py @@ -9,6 +9,7 @@ from uuid import uuid4 from aiohttp import web from mjr_am_shared.runtime_env import get_env +from .request_keys import REQUEST_DURATION_MS_KEY, REQUEST_ID_KEY, REQUEST_STATS_KEY from .shared import get_logger, request_id_var from .utils import env_float @@ -171,7 +172,7 @@ async def request_context_middleware(request: web.Request, handler): return await handler(request) rid = _get_request_id(request) - request["mjr_request_id"] = rid + request[REQUEST_ID_KEY] = rid token = _set_request_id_context(rid) start = time.perf_counter() status: int | None = None @@ -202,7 +203,7 @@ async def request_context_middleware(request: web.Request, handler): raise finally: duration_ms = (time.perf_counter() - start) * 1000.0 - request["mjr_duration_ms"] = duration_ms + request[REQUEST_DURATION_MS_KEY] = duration_ms _reset_request_id_context(token) _emit_request_log(request, status=status, duration_ms=duration_ms, error=error, error_type=error_type) @@ -283,14 +284,14 @@ def _sanitize_query_params(request: web.Request) -> dict[str, Any]: def build_request_log_fields(request: web.Request, response_status: int | None = None) -> dict[str, Any]: - stats = request.get("mjr_stats") + stats = request.get(REQUEST_STATS_KEY) return { - "request_id": request.get("mjr_request_id"), + "request_id": request.get(REQUEST_ID_KEY), "method": request.method, "path": request.path, "query": _sanitize_query_params(request), "status": response_status, - "duration_ms": request.get("mjr_duration_ms"), + "duration_ms": request.get(REQUEST_DURATION_MS_KEY), "remote": getattr(request, "remote", None), "stats": stats if isinstance(stats, dict) else None, } diff --git a/mjr_am_backend/request_keys.py b/mjr_am_backend/request_keys.py new file mode 100644 index 00000000..bf71e296 --- /dev/null +++ b/mjr_am_backend/request_keys.py @@ -0,0 +1,37 @@ +"""Typed per-request storage keys shared by Majoor middlewares and handlers. + +aiohttp >= 3.13 introduces ``web.RequestKey`` and emits ``NotAppKeyWarning`` +for plain-string request storage keys. ComfyUI only pins ``aiohttp>=3.11``, so +we fall back to the historical string keys on older runtimes. Every reader and +writer must go through these constants so both spellings stay consistent. +""" + +from __future__ import annotations + +from typing import Any + +from aiohttp import web + +_RequestKey: Any = getattr(web, "RequestKey", None) + + +def _key(name: str, value_type: Any) -> Any: + if _RequestKey is None: + return name + try: + return _RequestKey(name, value_type) + except Exception: + return name + + +REQUEST_USER_ID_KEY: Any = _key("mjr_user_id", str) +REQUEST_ID_KEY: Any = _key("mjr_request_id", str) +REQUEST_DURATION_MS_KEY: Any = _key("mjr_duration_ms", float) +REQUEST_STATS_KEY: Any = _key("mjr_stats", dict) + +__all__ = [ + "REQUEST_DURATION_MS_KEY", + "REQUEST_ID_KEY", + "REQUEST_STATS_KEY", + "REQUEST_USER_ID_KEY", +] diff --git a/mjr_am_backend/routes/core/request_json.py b/mjr_am_backend/routes/core/request_json.py index a3cccd40..ce94a0e9 100644 --- a/mjr_am_backend/routes/core/request_json.py +++ b/mjr_am_backend/routes/core/request_json.py @@ -14,6 +14,7 @@ from typing import Any from aiohttp import web from mjr_am_backend.shared import ErrorCode, Result, get_logger from mjr_am_shared.runtime_env import get_env + logger = get_logger(__name__) DEFAULT_MAX_JSON_BYTES = 10 * 1024 * 1024 # 10MB diff --git a/mjr_am_backend/routes/core/security_auth_context.py b/mjr_am_backend/routes/core/security_auth_context.py index eda949f6..3e8ebbb5 100644 --- a/mjr_am_backend/routes/core/security_auth_context.py +++ b/mjr_am_backend/routes/core/security_auth_context.py @@ -6,6 +6,7 @@ from contextvars import ContextVar, Token from typing import Any from aiohttp import web +from mjr_am_backend.request_keys import REQUEST_USER_ID_KEY from mjr_am_backend.shared import Result, get_logger logger = get_logger(__name__) @@ -115,7 +116,7 @@ def _get_request_user_id(request: web.Request | None) -> str: if request is None: return "" try: - stored = str(request.get("mjr_user_id") or "").strip() + stored = str(request.get(REQUEST_USER_ID_KEY) or "").strip() if stored: return stored except Exception: diff --git a/mjr_am_backend/routes/handlers/scan.py b/mjr_am_backend/routes/handlers/scan.py index b2b4e11e..1c94996b 100644 --- a/mjr_am_backend/routes/handlers/scan.py +++ b/mjr_am_backend/routes/handlers/scan.py @@ -43,6 +43,7 @@ from mjr_am_backend.features.watcher_settings import ( # noqa: F401 — exposed get_watcher_settings, update_watcher_settings, ) +from mjr_am_backend.request_keys import REQUEST_STATS_KEY from mjr_am_backend.shared import Result, get_logger, sanitize_error_message from mjr_am_backend.utils import parse_bool, sanitize_for_json @@ -373,7 +374,7 @@ def register_scan_routes(routes: web.RouteTableDef) -> None: merged = all_scope_result.data or {} try: if isinstance(merged, dict): - request["mjr_stats"] = { + request[REQUEST_STATS_KEY] = { "scanned": merged.get("scanned", 0), "added": merged.get("added", 0), "updated": merged.get("updated", 0), @@ -472,7 +473,7 @@ def register_scan_routes(routes: web.RouteTableDef) -> None: return _json_response(Result.Err("TIMEOUT", "Scan timed out")) try: if result.ok and isinstance(result.data, dict): - request["mjr_stats"] = { + request[REQUEST_STATS_KEY] = { "scanned": result.data.get("scanned", 0), "added": result.data.get("added", 0), "updated": result.data.get("updated", 0), @@ -1246,7 +1247,7 @@ def register_scan_routes(routes: web.RouteTableDef) -> None: try: - request["mjr_stats"] = { + request[REQUEST_STATS_KEY] = { "scanned": total_stats.get("scanned", 0), "added": total_stats.get("added", 0), "updated": total_stats.get("updated", 0), diff --git a/mjr_am_backend/routes/handlers/viewer.py b/mjr_am_backend/routes/handlers/viewer.py index 74ee3288..f6e15c1d 100644 --- a/mjr_am_backend/routes/handlers/viewer.py +++ b/mjr_am_backend/routes/handlers/viewer.py @@ -16,7 +16,10 @@ from aiohttp import web from mjr_am_backend.adapters.comfy_core import get_input_directory from mjr_am_backend.config import get_runtime_output_root from mjr_am_backend.custom_roots import list_custom_roots, resolve_custom_root -from mjr_am_backend.features.metadata.thumbnail_cache import PREVIEW_ONLY_EXTENSIONS, get_or_create_preview +from mjr_am_backend.features.metadata.thumbnail_cache import ( + PREVIEW_ONLY_EXTENSIONS, + get_or_create_preview, +) from mjr_am_backend.features.viewer.info import build_viewer_media_info from mjr_am_backend.shared import Result, get_logger diff --git a/mjr_am_backend/routes/registry_middlewares.py b/mjr_am_backend/routes/registry_middlewares.py index f92cac64..17a3a023 100644 --- a/mjr_am_backend/routes/registry_middlewares.py +++ b/mjr_am_backend/routes/registry_middlewares.py @@ -6,6 +6,7 @@ from collections.abc import Awaitable, Callable from typing import Any from aiohttp import web +from mjr_am_backend.request_keys import REQUEST_USER_ID_KEY from mjr_am_backend.shared import Result, get_logger from .core import ( @@ -178,7 +179,7 @@ def _requires_auth(path: str, method: str) -> bool: def _store_request_user_id(request: web.Request, user_id: Any) -> None: try: - request["mjr_user_id"] = str(user_id or "").strip() + request[REQUEST_USER_ID_KEY] = str(user_id or "").strip() except Exception: logger.debug("_store_request_user_id: suppressed exception", exc_info=True) diff --git a/mjr_am_shared/version.py b/mjr_am_shared/version.py index 0609b6b3..f8465ac9 100644 --- a/mjr_am_shared/version.py +++ b/mjr_am_shared/version.py @@ -6,8 +6,10 @@ from functools import lru_cache from pathlib import Path from typing import TypedDict -from .log import get_logger from mjr_am_shared.runtime_env import get_env + +from .log import get_logger + logger = get_logger(__name__) diff --git a/package-lock.json b/package-lock.json index 3e26894a..97aed5d9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -13,7 +13,7 @@ "vue": "^3.5.41" }, "devDependencies": { - "@comfyorg/comfyui-frontend-types": "^1.57.3", + "@comfyorg/comfyui-frontend-types": "^1.60.0", "@comfyorg/litegraph": "^0.17.2", "@eslint/js": "^10.0.1", "@playwright/test": "^1.63.0", @@ -119,9 +119,9 @@ "license": "MIT" }, "node_modules/@comfyorg/comfyui-frontend-types": { - "version": "1.57.3", - "resolved": "https://registry.npmjs.org/@comfyorg/comfyui-frontend-types/-/comfyui-frontend-types-1.57.3.tgz", - "integrity": "sha512-QjsuFqO/9RHKPGDfW2eCobIOgU38IkIOtam+nZiStvmcdfIn5MS0NTB+pzAopev3nC+Eha7pWtRb3vRf3kuVkg==", + "version": "1.60.0", + "resolved": "https://registry.npmjs.org/@comfyorg/comfyui-frontend-types/-/comfyui-frontend-types-1.60.0.tgz", + "integrity": "sha512-G37ThdoiwH1cJrCwkiFLokKcwRmheOwPm4l0EbofPDhfwLofj5mX9+D3y0DSkrGeXG3Bt3JDjaJCMSTaIdEyLQ==", "dev": true, "license": "GPL-3.0-only", "dependencies": { diff --git a/package.json b/package.json index 3784f2f1..c1b0471b 100644 --- a/package.json +++ b/package.json @@ -36,7 +36,7 @@ "brace-expansion": "5.0.12" }, "devDependencies": { - "@comfyorg/comfyui-frontend-types": "^1.57.3", + "@comfyorg/comfyui-frontend-types": "^1.60.0", "@comfyorg/litegraph": "^0.17.2", "@eslint/js": "^10.0.1", "@playwright/test": "^1.63.0", diff --git a/tests/core/test_registry_more.py b/tests/core/test_registry_more.py index 4997e850..d8fbe8cc 100644 --- a/tests/core/test_registry_more.py +++ b/tests/core/test_registry_more.py @@ -4,6 +4,7 @@ import sqlite3 import pytest from aiohttp import web from aiohttp.test_utils import make_mocked_request +from mjr_am_backend.request_keys import REQUEST_USER_ID_KEY from mjr_am_backend.routes import registry as r from mjr_am_backend.shared import Result @@ -99,7 +100,7 @@ def test_auth_error_response_or_none(monkeypatch): monkeypatch.setattr(r, "_require_authenticated_user", lambda _req: Result.Ok("u1")) out2 = r._auth_error_response_or_none(req) - assert out2 is None and req.get("mjr_user_id") == "u1" + assert out2 is None and req.get(REQUEST_USER_ID_KEY) == "u1" @pytest.mark.asyncio diff --git a/tests/metadata/test_exif_text_images.py b/tests/metadata/test_exif_text_images.py index 58a101f8..f31f1bcc 100644 --- a/tests/metadata/test_exif_text_images.py +++ b/tests/metadata/test_exif_text_images.py @@ -1,7 +1,6 @@ import json import pytest - from mjr_am_backend.features.metadata import extractor_registry as reg PROMPT = { diff --git a/ui/app/hostAdapter.ts b/ui/app/hostAdapter.ts index d535f896..bd99593d 100644 --- a/ui/app/hostAdapter.ts +++ b/ui/app/hostAdapter.ts @@ -878,20 +878,30 @@ export function importWorkflowPreferHostTab( export function serializeCurrentHostWorkflow(app: any = null): any { try { const runtimeApp = app || _app || getComfyApp(); - if (typeof runtimeApp?.graphToPrompt === "function") { - const data = runtimeApp.graphToPrompt(); - if (data?.workflow && typeof data.workflow === "object") return data.workflow; - } - const graph = _getHostGraph(runtimeApp); - if (typeof graph?.serialize === "function") { - const workflow = graph.serialize(); - if (workflow && typeof workflow === "object") return workflow; - } - const rootGraph = runtimeApp?.rootGraph || runtimeApp?.graph?.rootGraph || null; + // Prefer the root graph: with subgraphs, `app.canvas.graph` (and on some + // builds `app.graph`) can point at the subgraph currently being edited, + // which would serialize a fragment instead of the whole workflow. + const rootGraph = getHostRootGraph(runtimeApp); if (typeof rootGraph?.serialize === "function") { const workflow = rootGraph.serialize(); if (workflow && typeof workflow === "object") return workflow; } + const graph = _getHostGraph(runtimeApp); + if (graph !== rootGraph && typeof graph?.serialize === "function") { + const workflow = graph.serialize(); + if (workflow && typeof workflow === "object") return workflow; + } + // Legacy hosts only: modern ComfyUI frontends make graphToPrompt() async + // (it returns a Promise), so a synchronous caller cannot use its result. + // Never leave a rejected promise unhandled when we discard it. + if (typeof runtimeApp?.graphToPrompt === "function") { + const data = runtimeApp.graphToPrompt(); + if (data && typeof data.then === "function") { + data.then(undefined, (e: unknown) => console.debug?.(e)); + return null; + } + if (data?.workflow && typeof data.workflow === "object") return data.workflow; + } } catch (e) { console.debug?.(e); } @@ -909,6 +919,11 @@ export function isHostWorkflowDirty(app: any = null): boolean | null { const runtimeApp = app || _app || getComfyApp(); if (!runtimeApp) return null; + // ComfyUI frontend >= 1.2x exposes the workflow store on the extension + // manager; its `isModified` flag is the authoritative dirty signal. + const activeWorkflow = runtimeApp?.extensionManager?.workflow?.activeWorkflow; + if (typeof activeWorkflow?.isModified === "boolean") return activeWorkflow.isModified; + const candidates = [ runtimeApp?.isDirty, runtimeApp?.dirty, diff --git a/ui/tests/host_adapter_contract.vitest.ts b/ui/tests/host_adapter_contract.vitest.ts index fbde067e..b498c23e 100644 --- a/ui/tests/host_adapter_contract.vitest.ts +++ b/ui/tests/host_adapter_contract.vitest.ts @@ -380,6 +380,43 @@ describe("hostAdapter contract", () => { expect(mod.serializeCurrentHostWorkflow(app)).toEqual(workflow); }); + it("prefers the root graph over the active subgraph when serializing", async () => { + const mod = await import("../app/hostAdapter.js"); + + const rootWorkflow = { last_node_id: 3, nodes: [{ id: 1 }, { id: 2 }, { id: 3 }] }; + const app = { + rootGraph: { serialize: vi.fn(() => rootWorkflow) }, + canvas: { graph: { serialize: vi.fn(() => ({ nodes: [{ id: 99 }] })) } }, + graphToPrompt: vi.fn(), + }; + mod.init(app); + + expect(mod.serializeCurrentHostWorkflow(app)).toEqual(rootWorkflow); + expect(app.graphToPrompt).not.toHaveBeenCalled(); + }); + + it("does not leak an unhandled rejection from an async graphToPrompt", async () => { + const mod = await import("../app/hostAdapter.js"); + + const rejection = Promise.reject(new Error("boom")); + const app = { graphToPrompt: vi.fn(() => rejection) }; + mod.init(app); + + expect(mod.serializeCurrentHostWorkflow(app)).toBeNull(); + await expect(rejection).rejects.toThrow("boom"); + }); + + it("reads dirty state from the frontend workflow store first", async () => { + const mod = await import("../app/hostAdapter.js"); + + const app = { + isDirty: true, + extensionManager: { workflow: { activeWorkflow: { isModified: false } } }, + }; + mod.init(app); + expect(mod.isHostWorkflowDirty(app)).toBe(false); + }); + it("reads host dirty state from stable and nightly signal shapes", async () => { const mod = await import("../app/hostAdapter.js"); From d0ab7d594e6dfe3df686c3df0462ddd3da6a6870 Mon Sep 17 00:00:00 2001 From: Ewald ALOEBOETOE <129623145+MajoorWaldi@users.noreply.github.com> Date: Tue, 3 Nov 2026 21:16:34 +0000 Subject: [PATCH 09/23] Resolve remaining ComfyUI integration conflicts - Move the read-only OpenAPI compat surface from /api/v2/assets to /mjr/am/compat/assets so it never squats ComfyUI core's /api namespace; the legacy alias is opt-in via MJR_AM_LEGACY_API_V2_ASSETS=1. - Allow Python 3.14 (requires-python <3.15) and add 3.14 to CI and tox. - Stop wrapping api.queuePrompt: progress tracking now resolves the running prompt from the core Jobs API (getJobDetail), then /queue and /history, driven by websocket events. Remove wrapHostQueuePrompt. - Add opt-in Majoor.Integration.HideNativeAssetsTab setting that hides ComfyUI's native Assets sidebar tab through the official getSidebarTabs/unregisterSidebarTab API and restores it when disabled. - Fix all 913 type errors in tsconfig.test.json and type-check tests in CI; drop a duplicated `stubs` key in asset_card_inner test; make addToastHistory's type argument optional for the object form. - Update audit report, changelog, API reference and env var docs. --- .github/workflows/python-tests.yml | 5 +- CHANGELOG.md | 9 + README.md | 2 +- ...C99U6UdL.js => FloatingViewer-Cccq5sHS.js} | 60 +- ...c1cyF.js => LiveStreamTracker-C8HwFSOT.js} | 4 +- ....js => SidebarWorkflowSection-BihItyAk.js} | 2022 +++--- ...tor-7DAMS3OV.js => TagsEditor-CPV0rYyM.js} | 84 +- ...{Viewer-DI9upE3v.js => Viewer-geJFRz8N.js} | 400 +- ...l-uNjS7OxV.js => ViewerPortal-BStxU0ID.js} | 10 +- ...{events-DxfljH4A.js => events-BRfpU-6M.js} | 431 +- ...T.js => floatingViewerManager-Gv7MTmpu.js} | 30 +- ...enInfo-Dxtoun1T.js => genInfo-BkEKNdy-.js} | 6 +- ...0ey48io.js => model3dRenderer-DdPKugXy.js} | 82 +- ...sVlq.js => openMajoorSettings-Cd5Nutru.js} | 371 +- ...ide-Css6Vh8y.js => sideBySide-sOf24A5X.js} | 2 +- ...PrnGk.js => viewerOpenRequest-Crw9UWH5.js} | 4 +- ...OjsY.js => viewerRuntimeHosts-D3Jyfx0-.js} | 346 +- dist/entry.js | 5933 +++++++++-------- docs/API_REFERENCE.md | 1 + docs/COMFYUI_INTEGRATION_AUDIT.md | 27 +- docs/INSTALLATION.md | 2 +- docs/SECURITY_ENV_VARS.md | 8 + .../routes/handlers/api_v2_assets.py | 98 +- mjr_am_backend/routes/registry_middlewares.py | 7 +- mjr_am_backend/routes/route_catalog.py | 10 +- pyproject.toml | 4 +- tests/features/test_api_v2_assets.py | 60 +- tox.ini | 2 +- tsconfig.test.json | 3 +- ui/app/hostAdapter.ts | 89 +- ui/app/settings/settingsCore.ts | 5 + ui/app/settings/settingsGrid.ts | 18 + ui/features/panel/messages/toastHistory.ts | 2 +- ui/features/runtime/entryUiRegistration.ts | 12 + ui/features/runtime/nativeAssetsTab.ts | 91 + ui/features/viewer/floatingViewerProgress.ts | 130 +- ui/tests/api_client_dedupe.vitest.ts | 36 +- ui/tests/asset_card_inner.vitest.ts | 14 +- ui/tests/assets_grid_host_state.vitest.ts | 31 +- ui/tests/audio_visualizer.vitest.ts | 2 +- ui/tests/auth_refresh_race.vitest.ts | 24 +- .../browser_navigation_controller.vitest.ts | 8 +- ui/tests/browser_perf_extended.vitest.ts | 30 +- ui/tests/client_auth_token.vitest.ts | 18 +- ui/tests/comfy_api_bridge.vitest.ts | 6 +- ui/tests/custom_roots_controller.vitest.ts | 67 +- ui/tests/dialog_templates.vitest.ts | 10 +- ui/tests/dialogs.vitest.ts | 10 +- ui/tests/dnd_model3d.vitest.ts | 8 +- ui/tests/drag_drop_canvas.vitest.ts | 14 +- ui/tests/drag_out.vitest.ts | 8 +- ui/tests/entry_debug_api.vitest.ts | 10 +- .../execution_runtime_controller.vitest.ts | 8 +- ui/tests/fetch_utils.vitest.ts | 26 +- ui/tests/filters_controller.vitest.ts | 32 +- ui/tests/floating_viewer.vitest.ts | 122 +- .../floating_viewer_genfields_api.vitest.ts | 10 +- .../floating_viewer_geninfo_overlap.vitest.ts | 4 +- ui/tests/floating_viewer_manager.vitest.ts | 117 +- ...oating_viewer_panel_interactions.vitest.ts | 40 +- ui/tests/floating_viewer_progress.vitest.ts | 111 +- ...g_viewer_simple_player_shortcuts.vitest.ts | 8 +- ..._viewer_toolbar_overlay_controls.vitest.ts | 24 +- ...id_controller_exit_similar_scope.vitest.ts | 8 +- .../grid_controller_semantic_mode.vitest.ts | 8 +- ...grid_controller_similar_fallback.vitest.ts | 8 +- ui/tests/grid_dom_bridge.vitest.ts | 10 +- ui/tests/grid_keyboard_navigation.vitest.ts | 76 +- .../grid_loader_adaptive_paging.vitest.ts | 26 +- ui/tests/grid_perf_budget.vitest.ts | 24 +- ui/tests/grid_scope_switch_cache.vitest.ts | 12 +- ui/tests/grid_selection_manager.vitest.ts | 18 +- ui/tests/helpers/vitestEnvironment.ts | 2 +- ui/tests/hide_siblings.vitest.ts | 6 +- ui/tests/host_adapter_contract.vitest.ts | 44 - ui/tests/hotkeys_state.vitest.ts | 6 +- ui/tests/infinite_scroll_upsert.vitest.ts | 8 +- ui/tests/live_stream_tracker.vitest.ts | 8 +- ui/tests/media_factory_model3d.vitest.ts | 10 +- ui/tests/message_center.vitest.ts | 26 +- ui/tests/message_popover_controller.vitest.ts | 28 +- ui/tests/native_assets_tab.vitest.ts | 74 + ui/tests/node_stream_controller.vitest.ts | 22 +- ui/tests/open_majoor_settings.vitest.ts | 10 +- ui/tests/panel_cleanup_contract.vitest.ts | 2 +- ui/tests/panel_hotkeys.vitest.ts | 34 +- ui/tests/panel_primevue_controls.vitest.ts | 50 +- ui/tests/pending_generated_assets.vitest.ts | 6 +- ui/tests/popover_manager.vitest.ts | 124 +- ui/tests/rating_tags_id_save.vitest.ts | 2 +- .../register_realtime_listeners.vitest.ts | 34 +- ui/tests/security_client_headers.vitest.ts | 26 +- ui/tests/security_deep_merge.vitest.ts | 16 +- ui/tests/security_runtime_state.vitest.ts | 2 +- ui/tests/settings_mfv_persistence.vitest.ts | 8 +- ui/tests/settings_panel.vitest.ts | 2 +- ui/tests/settings_runtime.vitest.ts | 22 +- ui/tests/settings_security.vitest.ts | 6 +- ui/tests/settings_store.vitest.ts | 4 +- ui/tests/sidebar_asset_badge.vitest.ts | 12 +- ui/tests/sidebar_controller.vitest.ts | 65 +- .../sidebar_run_button_execution.vitest.ts | 4 +- .../sidebar_run_button_live_sync.vitest.ts | 30 +- ui/tests/sidebar_workflow_section.vitest.ts | 32 +- ui/tests/sort_controller.vitest.ts | 10 +- ui/tests/stack_group_cards.vitest.ts | 8 +- ui/tests/tags_editor.vitest.ts | 64 +- ui/tests/toast.vitest.ts | 24 +- ui/tests/tooltip_shortcuts.vitest.ts | 2 +- ui/tests/topbar_mfv_button.vitest.ts | 20 +- ui/tests/ui_lifecycle_contract.vitest.ts | 2 +- ui/tests/ui_registration_lifecycle.vitest.ts | 48 +- ui/tests/use_assets_query.vitest.ts | 16 +- ui/tests/use_grid_display_assets.vitest.ts | 10 +- ui/tests/use_grid_keyboard.vitest.ts | 6 +- ui/tests/use_grid_query.vitest.ts | 4 +- ui/tests/use_grid_selection.vitest.ts | 20 +- ui/tests/use_grid_snapshot_cache.vitest.ts | 4 +- ui/tests/use_grid_state.vitest.ts | 2 +- ui/tests/video_controls_audio.vitest.ts | 38 +- .../video_controls_fps_override.vitest.ts | 8 +- ...video_controls_responsive_layout.vitest.ts | 8 +- ui/tests/video_controls_seek_drag.vitest.ts | 32 +- ui/tests/video_sync.vitest.ts | 4 +- ui/tests/viewer_ab_compare.vitest.ts | 14 +- ui/tests/viewer_compare_audio.vitest.ts | 18 +- ui/tests/viewer_context_menu_vue.vitest.ts | 4 +- ui/tests/viewer_keyboard.vitest.ts | 18 +- ui/tests/viewer_panzoom_performance.vitest.ts | 2 +- ui/tests/viewer_player_bar_fps_sync.vitest.ts | 4 +- ui/tests/viewer_runtime_hosts.vitest.ts | 10 +- ui/tests/viewer_toolbar.vitest.ts | 8 +- ui/tests/workflow_api_client.vitest.ts | 70 +- ui/tests/workflow_graph_map_actions.vitest.ts | 2 +- ...workflow_graph_map_panel_preview.vitest.ts | 2 +- ui/tests/workflow_save_info_dialog.vitest.ts | 2 +- ui/tests/workflow_sidebar_live_sync.vitest.ts | 24 +- 137 files changed, 6491 insertions(+), 6100 deletions(-) rename dist/chunks/{FloatingViewer-C99U6UdL.js => FloatingViewer-Cccq5sHS.js} (99%) rename dist/chunks/{LiveStreamTracker-CXkc1cyF.js => LiveStreamTracker-C8HwFSOT.js} (97%) rename dist/chunks/{SidebarWorkflowSection-BHtHjc_k.js => SidebarWorkflowSection-BihItyAk.js} (85%) rename dist/chunks/{TagsEditor-7DAMS3OV.js => TagsEditor-CPV0rYyM.js} (74%) rename dist/chunks/{Viewer-DI9upE3v.js => Viewer-geJFRz8N.js} (96%) rename dist/chunks/{ViewerPortal-uNjS7OxV.js => ViewerPortal-BStxU0ID.js} (97%) rename dist/chunks/{events-DxfljH4A.js => events-BRfpU-6M.js} (95%) rename dist/chunks/{floatingViewerManager-DKOeP6-T.js => floatingViewerManager-Gv7MTmpu.js} (90%) rename dist/chunks/{genInfo-Dxtoun1T.js => genInfo-BkEKNdy-.js} (99%) rename dist/chunks/{model3dRenderer-k0ey48io.js => model3dRenderer-DdPKugXy.js} (94%) rename dist/chunks/{openMajoorSettings-BfOHsVlq.js => openMajoorSettings-Cd5Nutru.js} (83%) rename dist/chunks/{sideBySide-Css6Vh8y.js => sideBySide-sOf24A5X.js} (99%) rename dist/chunks/{viewerOpenRequest-CCFPrnGk.js => viewerOpenRequest-Crw9UWH5.js} (90%) rename dist/chunks/{viewerRuntimeHosts-DQcoOjsY.js => viewerRuntimeHosts-D3Jyfx0-.js} (87%) create mode 100644 ui/features/runtime/nativeAssetsTab.ts create mode 100644 ui/tests/native_assets_tab.vitest.ts diff --git a/.github/workflows/python-tests.yml b/.github/workflows/python-tests.yml index 97fc18b3..b58a858c 100644 --- a/.github/workflows/python-tests.yml +++ b/.github/workflows/python-tests.yml @@ -96,6 +96,9 @@ jobs: - name: Typecheck frontend run: npx tsc -p tsconfig.json --noEmit --pretty false + - name: Typecheck frontend tests + run: npx tsc -p tsconfig.test.json --noEmit --pretty false + - name: Build frontend bundle run: npm run build @@ -119,7 +122,7 @@ jobs: strategy: fail-fast: false matrix: - python-version: ["3.10", "3.11", "3.12", "3.13"] + python-version: ["3.10", "3.11", "3.12", "3.13", "3.14"] steps: - name: Tune Git HTTP settings run: | diff --git a/CHANGELOG.md b/CHANGELOG.md index a9c5a2ef..243d5eb0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -30,6 +30,15 @@ All notable changes to this project are documented in this file. ### Fixed - **`mjr_am_backend.adapters.tools` missing from Registry installs**: `.comfyignore`'s unanchored `tools/` pattern also matched `mjr_am_backend/adapters/tools/`, stripping the ExifTool/FFProbe adapters out of every Registry-published package and causing `ModuleNotFoundError: No module named 'mjr_am_backend.adapters.tools'` at startup. The pattern is now anchored to the repo-root `/tools/` dev-scripts folder only. +### Changed (ComfyUI integration) +- **Compat assets API moved to `/mjr/am/compat/assets/*`**: the read-only OpenAPI-aligned surface no longer squats ComfyUI core's `/api` namespace. The old `/api/v2/assets/*` paths are only registered when `MJR_AM_LEGACY_API_V2_ASSETS=1` (deprecated). +- **Python 3.14**: `requires-python` is now `>=3.10, <3.15`; CI runs the full suite on 3.14. +- **Execution tracking without wrapping `api.queuePrompt`**: the floating viewer progress reads the running prompt from ComfyUI's Jobs API (`GET /api/jobs/{id}`), then `/queue` and `/history/{id}` on older cores, driven by websocket events. No more conflicts with other extensions that wrap `queuePrompt`. +- **Optional: hide ComfyUI's native Assets tab** (`Majoor.Integration.HideNativeAssetsTab`, off by default). Uses the official `getSidebarTabs`/`unregisterSidebarTab` API and restores the tab when turned off. +- **Workflow serialization** uses the root graph instead of the async `graphToPrompt()`; dirty state reads the frontend workflow store. +- **Typed aiohttp request keys** (`web.RequestKey`) — no more `NotAppKeyWarning` on aiohttp ≥ 3.13. +- **Frontend test typing**: `tsconfig.test.json` now type-checks with 0 errors (was 913) and runs in CI. + ## [2.5.2] - 2026-09-27 ### Changed diff --git a/README.md b/README.md index 363e1a36..810536dc 100644 --- a/README.md +++ b/README.md @@ -716,7 +716,7 @@ See [`docs/TESTING.md`](docs/TESTING.md), [`tests/README.md`](tests/README.md), - Linux (Ubuntu 22.04+, Fedora, Debian) - **Browsers**: Modern browsers with ES2020+ support -The automated CI matrix currently validates Python 3.10-3.13 and the frontend on Ubuntu. Windows and macOS support is maintained through portable code paths and contributor/user testing rather than dedicated hosted CI jobs. +The automated CI matrix currently validates Python 3.10-3.14 and the frontend on Ubuntu. Windows and macOS support is maintained through portable code paths and contributor/user testing rather than dedicated hosted CI jobs. --- diff --git a/dist/chunks/FloatingViewer-C99U6UdL.js b/dist/chunks/FloatingViewer-Cccq5sHS.js similarity index 99% rename from dist/chunks/FloatingViewer-C99U6UdL.js rename to dist/chunks/FloatingViewer-Cccq5sHS.js index ae49467d..34e1d7db 100644 --- a/dist/chunks/FloatingViewer-C99U6UdL.js +++ b/dist/chunks/FloatingViewer-Cccq5sHS.js @@ -1,12 +1,12 @@ -import { $t as e, g as t, y as n } from "./viewerRuntimeHosts-DQcoOjsY.js"; -import { B as r, C as i, I as a, M as o, O as s, P as c, R as l, V as u, j as d, m as f, o as p, r as m, rt as h, v as g, w as _, x as v } from "./events-DxfljH4A.js"; +import { $t as e, g as t, y as n } from "./viewerRuntimeHosts-D3Jyfx0-.js"; +import { C as r, H as i, I as a, M as o, O as s, P as c, V as l, at as u, j as d, m as f, o as p, r as m, v as h, w as g, x as _, z as v } from "./events-BRfpU-6M.js"; import { a as y, i as b, o as x, s as S } from "./graphTraversal-DTdQWkn5.js"; -import { _ as C, g as w, m as T, n as E, p as ee, r as D, w as O } from "./Viewer-DI9upE3v.js"; -import { r as k, v as A } from "./SidebarWorkflowSection-BHtHjc_k.js"; -import { _ as j, a as M, c as N, d as P, f as F, g as I, h as L, i as te, l as R, m as z, o as ne, p as B, r as re, s as V, t as ie, u as H, v as U } from "./openMajoorSettings-BfOHsVlq.js"; -import { a as W, n as ae, r as oe } from "./model3dRenderer-k0ey48io.js"; +import { _ as C, g as w, m as T, n as E, p as ee, r as D, w as O } from "./Viewer-geJFRz8N.js"; +import { r as k, v as A } from "./SidebarWorkflowSection-BihItyAk.js"; +import { _ as j, a as M, c as N, d as P, f as F, g as I, h as L, i as te, l as R, m as z, o as ne, p as B, r as re, s as V, t as ie, u as H, v as U } from "./openMajoorSettings-Cd5Nutru.js"; +import { a as W, n as ae, r as oe } from "./model3dRenderer-DdPKugXy.js"; import { i as se, o as ce, r as le, t as ue } from "./geninfoParser-CgHp-y-n.js"; -import { t as de } from "./genInfo-Dxtoun1T.js"; +import { t as de } from "./genInfo-BkEKNdy-.js"; // ui/features/viewer/floatingViewerConstants.ts var G = Object.freeze({ SIMPLE: "simple", @@ -305,7 +305,7 @@ function K(e) { return a === ".gif" ? "gif" : De.has(a) ? "video" : Oe.has(a) ? "audio" : ae.has(a) ? "model3d" : "image"; } function Ae(e) { - return e ? e.url ? String(e.url) : e.filename && h(e) || "" : ""; + return e ? e.url ? String(e.url) : e.filename && u(e) || "" : ""; } function q(e = "No media - select assets in the grid") { let t = document.createElement("div"); @@ -600,15 +600,15 @@ var Xe = class { let t = e?.widgets?.[0], i = t?.inputEl ?? t?.element ?? t?.el ?? null; i != null && "value" in i && i.value !== n.value && (i.value = n.value), r(); try { - l(e); + v(e); } catch {} }), n._mjrAutoFit = r, this._noteTextarea = n, this._autoFits.push(r), c.appendChild(n), this._body = c, t.appendChild(c), this._el = t, this._applyExpandedState(), requestAnimationFrame(r), t; } - let u = e.widgets ?? [], d = !1; - for (let t of u) { + let l = e.widgets ?? [], u = !1; + for (let t of l) { let n = String(t.type || "").toLowerCase(); if (Re.has(n) || t.hidden || t.options?.hidden) continue; - d = !0; + u = !0; let r = n === "text" || n === "string" || n === "customtext", i = document.createElement("div"); i.className = r ? "mjr-ws-widget-row mjr-ws-widget-row--block" : "mjr-ws-widget-row"; let a = document.createElement("label"); @@ -620,7 +620,7 @@ var Xe = class { let l = s._mjrAutoFit ?? s.querySelector?.("textarea")?._mjrAutoFit; l && this._autoFits.push(l), i.appendChild(a), i.appendChild(o), c.appendChild(i); } - if (!d) { + if (!u) { let e = document.createElement("div"); e.className = "mjr-ws-node-empty", e.textContent = "No editable parameters", c.appendChild(e); } @@ -647,7 +647,7 @@ var Xe = class { } let e = this._node; if (e) try { - i(e, { + r(e, { select: !1, focusCanvas: !1 }); @@ -830,7 +830,7 @@ function it(e, t, n) { } function at(e) { try { - i(e); + r(e); } catch (e) { console.debug?.("[MFV] _focusNode", e); } @@ -870,14 +870,14 @@ function dt(e) { if (!e || !t || typeof t.add != "function") return !1; let n = String(e?.type || e?.class_type || e?.comfyClass || "").trim(), r = null; try { - r = v(n); + r = _(n); } catch (e) { console.debug?.("[MFV Graph Map] createNode failed", e); } if (!r) return !1; try { let t = typeof structuredClone == "function" ? structuredClone(e) : JSON.parse(JSON.stringify(e)); - return gt(t, e), delete t.id, Array.isArray(t.pos) && (t.pos = [Number(t.pos[0] || 0) + 32, Number(t.pos[1] || 0) + 32]), typeof r.configure == "function" ? r.configure(t) : Object.assign(r, t), g(r); + return gt(t, e), delete t.id, Array.isArray(t.pos) && (t.pos = [Number(t.pos[0] || 0) + 32, Number(t.pos[1] || 0) + 32]), typeof r.configure == "function" ? r.configure(t) : Object.assign(r, t), h(r); } catch (e) { return console.debug?.("[MFV Graph Map] import node failed", e), !1; } @@ -895,34 +895,34 @@ function ft(e) { count: 0, reason: "no-widgets" }; - let i = /* @__PURE__ */ new Map(); + let a = /* @__PURE__ */ new Map(); r.forEach((e, t) => { - for (let n of vt(e)) i.has(n) || i.set(n, { + for (let n of vt(e)) a.has(n) || a.set(n, { widget: e, index: t }); }); - let a = bt(R(e)), o = bt(t?.type || t?.comfyClass || t?.class_type), s = !!(a && o && a === o), c = /* @__PURE__ */ new Set(), l = 0; + let o = bt(R(e)), s = bt(t?.type || t?.comfyClass || t?.class_type), c = !!(o && s && o === s), l = /* @__PURE__ */ new Set(), u = 0; for (let e of n) { - let n = yt(e.label), a = n ? i.get(n) : null, o = e.index; - if ((!a || c.has(a.index)) && s && typeof o == "number" && Number.isInteger(o)) { + let n = yt(e.label), i = n ? a.get(n) : null, o = e.index; + if ((!i || l.has(i.index)) && c && typeof o == "number" && Number.isInteger(o)) { let e = r[o]; - e && (a = { + e && (i = { widget: e, index: o }); } - a && !c.has(a.index) && te(a.widget, X(e.value), t) && (c.add(a.index), l += 1); + i && !l.has(i.index) && te(i.widget, X(e.value), t) && (l.add(i.index), u += 1); } - return u(), { - ok: l > 0, - count: l, - reason: l > 0 ? "ok" : "no-match", + return i(), { + ok: u > 0, + count: u, + reason: u > 0 ? "ok" : "no-match", targetNode: t }; } function pt() { - return _() || null; + return g() || null; } function mt(e) { let t = N(e); @@ -1648,7 +1648,7 @@ async function Xt() { let e = d(); if (!e) throw Error("ComfyUI app not available"); let t = Yt(y(e)); - return { tracked: await r({ + return { tracked: await l({ app: e, forceNativeQueue: t, resolvePromptData(e) { diff --git a/dist/chunks/LiveStreamTracker-CXkc1cyF.js b/dist/chunks/LiveStreamTracker-C8HwFSOT.js similarity index 97% rename from dist/chunks/LiveStreamTracker-CXkc1cyF.js rename to dist/chunks/LiveStreamTracker-C8HwFSOT.js index d1c1ea1c..56babecc 100644 --- a/dist/chunks/LiveStreamTracker-CXkc1cyF.js +++ b/dist/chunks/LiveStreamTracker-C8HwFSOT.js @@ -1,5 +1,5 @@ -import { J as e, o as t, r as n } from "./events-DxfljH4A.js"; -import { t as r } from "./floatingViewerManager-DKOeP6-T.js"; +import { Z as e, o as t, r as n } from "./events-BRfpU-6M.js"; +import { t as r } from "./floatingViewerManager-Gv7MTmpu.js"; // ui/features/viewer/LiveStreamTracker.ts var i = !1, a = null, o = null, s = null, c = null, l = null, u = null, d = null, f = null, p = 0, m = 0, h = !1, g = 400, _ = "kj_preview_override", v = /* @__PURE__ */ new Set([ "image/jpeg", diff --git a/dist/chunks/SidebarWorkflowSection-BHtHjc_k.js b/dist/chunks/SidebarWorkflowSection-BihItyAk.js similarity index 85% rename from dist/chunks/SidebarWorkflowSection-BHtHjc_k.js rename to dist/chunks/SidebarWorkflowSection-BihItyAk.js index 3a6b75ba..37e8e2d9 100644 --- a/dist/chunks/SidebarWorkflowSection-BHtHjc_k.js +++ b/dist/chunks/SidebarWorkflowSection-BihItyAk.js @@ -1,11 +1,11 @@ -import { $ as e, $t as t, At as n, Bt as r, Ct as i, Dt as a, Et as o, Ft as s, Gt as c, Ht as l, I as u, It as d, K as f, Kt as p, Mt as m, N as h, Nt as g, O as _, Ot as v, Pt as y, Q as b, Qt as x, R as S, Rt as C, S as ee, St as te, T as ne, Tt as w, Ut as T, Vt as E, X as re, Y as D, Yt as ie, Z as ae, Zt as oe, at as se, cn as ce, ct as le, dt as ue, en as de, et as fe, gt as pe, it as me, jt as he, k as ge, kt as _e, lt as ve, nt as ye, ot as be, p as xe, rt as Se, sn as Ce, tt as we, ut as Te, w as Ee, wt as De } from "./viewerRuntimeHosts-DQcoOjsY.js"; -import { Ct as Oe, K as ke, N as Ae, T as je, c as Me, d as Ne, f as Pe, h as Fe, j as Ie, l as Le, m as O, o as k, p as Re, pt as ze, s as A, tt as Be, u as Ve, x as He, y as Ue } from "./events-DxfljH4A.js"; -import { F as We, K as Ge, P as Ke, Y as qe, f as Je, m as Ye, p as Xe } from "./Viewer-DI9upE3v.js"; -import { t as Ze } from "./floatingViewerManager-DKOeP6-T.js"; -import { A as Qe, C as j, D as $e, E as M, G as et, J as tt, K as nt, N as rt, O as N, R as it, S as at, T as P, U as F, V as I, Y as ot, _ as st, a as ct, b as lt, c as ut, d as dt, dt as L, f as ft, ft as R, g as pt, h as mt, i as ht, j as gt, k as z, l as _t, lt as B, m as vt, n as yt, nt as bt, o as xt, p as St, r as Ct, rt as V, s as wt, t as Tt, u as Et, ut as Dt, y as Ot, z as kt } from "./mjr-primevue-BRqtdXzb.js"; -import { t as At } from "./mjr-vue-vendor-mHY_eIVE.js"; -import { t as jt } from "./viewerOpenRequest-CCFPrnGk.js"; -import { a as Mt, i as Nt, n as Pt, o as Ft, r as It, t as Lt } from "./geninfoParser-CgHp-y-n.js"; +import { $ as e, $t as t, At as n, Bt as r, Ct as i, Dt as a, Et as o, Ft as s, Gt as c, Ht as l, I as u, It as d, K as f, Kt as p, Mt as m, N as h, Nt as g, O as _, Ot as v, Pt as y, Q as b, Qt as x, R as S, Rt as C, S as ee, St as te, T as ne, Tt as w, Ut as T, Vt as E, X as re, Y as D, Yt as ie, Z as ae, Zt as oe, at as se, cn as ce, ct as le, dt as ue, en as de, et as fe, gt as pe, it as me, jt as he, k as ge, kt as _e, lt as ve, nt as ye, ot as be, p as xe, rt as Se, sn as Ce, tt as we, ut as Te, w as Ee, wt as De } from "./viewerRuntimeHosts-D3Jyfx0-.js"; +import { G as Oe, J as ke, N as Ae, R as je, T as Me, Tt as Ne, X as Pe, c as Fe, d as Ie, f as Le, h as Re, ht as ze, j as Be, l as Ve, m as O, o as k, p as He, rt as Ue, s as A, u as We, x as Ge, y as Ke } from "./events-BRfpU-6M.js"; +import { F as qe, K as Je, P as Ye, Y as Xe, f as Ze, m as Qe, p as $e } from "./Viewer-geJFRz8N.js"; +import { t as et } from "./floatingViewerManager-Gv7MTmpu.js"; +import { A as tt, C as j, D as nt, E as M, G as rt, J as it, K as at, N as ot, O as N, R as st, S as ct, T as P, U as F, V as I, Y as lt, _ as ut, a as dt, b as ft, c as pt, d as mt, dt as L, f as ht, ft as R, g as gt, h as _t, i as vt, j as yt, k as z, l as bt, lt as B, m as xt, n as St, nt as Ct, o as wt, p as Tt, r as Et, rt as V, s as Dt, t as Ot, u as kt, ut as At, y as jt, z as Mt } from "./mjr-primevue-BRqtdXzb.js"; +import { t as Nt } from "./mjr-vue-vendor-mHY_eIVE.js"; +import { t as Pt } from "./viewerOpenRequest-Crw9UWH5.js"; +import { a as Ft, i as It, n as Lt, o as Rt, r as zt, t as Bt } from "./geninfoParser-CgHp-y-n.js"; // ui/app/settings/settingsUtils.ts var H = (e, t) => { if (typeof e == "boolean") return e; @@ -28,30 +28,30 @@ var H = (e, t) => { }, U = (e, t) => { let n = Number(e); return Number.isFinite(n) ? n : Number(t); -}, Rt = (e, t, n) => { +}, Vt = (e, t, n) => { let r = typeof e == "string" ? e.trim() : String(e ?? ""); return t.includes(r) ? r : n; -}, zt = (e) => e === "__proto__" || e === "prototype" || e === "constructor", Bt = (e, t) => { +}, Ht = (e) => e === "__proto__" || e === "prototype" || e === "constructor", Ut = (e, t) => { let n = { ...e }; return !t || typeof t != "object" || Object.keys(t).forEach((r) => { - if (zt(r)) return; + if (Ht(r)) return; let i = t[r]; - i && typeof i == "object" && !Array.isArray(i) ? n[r] = Bt(e[r] || {}, i) : i !== void 0 && (n[r] = i); + i && typeof i == "object" && !Array.isArray(i) ? n[r] = Ut(e[r] || {}, i) : i !== void 0 && (n[r] = i); }), n; -}, Vt = Object.freeze({ +}, Wt = Object.freeze({ small: 80, medium: 120, large: 180 -}), Ht = Object.freeze([ +}), Gt = Object.freeze([ "small", "medium", "large" -]), Ut = (e, t) => Math.max(60, Math.min(600, Math.round(U(e, t)))), Wt = (e = {}) => { +]), Kt = (e, t) => Math.max(60, Math.min(600, Math.round(U(e, t)))), qt = (e = {}) => { let t = Number(e?.minSize); - if (Number.isFinite(t)) return Ut(t, A.GRID_MIN_SIZE); - let n = Rt(String(e?.minSizePreset || "").toLowerCase(), Ht, ""); - return n ? Vt[n] : Ut(e?.minSize, A.GRID_MIN_SIZE); -}, Gt = (e = {}) => Ut(e?.minSize, A.FEED_GRID_MIN_SIZE), Kt = (e) => { + if (Number.isFinite(t)) return Kt(t, A.GRID_MIN_SIZE); + let n = Vt(String(e?.minSizePreset || "").toLowerCase(), Gt, ""); + return n ? Wt[n] : Kt(e?.minSize, A.GRID_MIN_SIZE); +}, Jt = (e = {}) => Kt(e?.minSize, A.FEED_GRID_MIN_SIZE), Yt = (e) => { let t = Math.round(U(e, A.GRID_MIN_SIZE)); return t <= 100 ? "small" : t >= 150 ? "large" : "medium"; }, W = { @@ -63,7 +63,7 @@ var H = (e, t) => { grid: { pageSize: A.DEFAULT_PAGE_SIZE, minSize: A.GRID_MIN_SIZE, - minSizePreset: Kt(A.GRID_MIN_SIZE), + minSizePreset: Yt(A.GRID_MIN_SIZE), gap: A.GRID_GAP, showExtBadge: A.GRID_SHOW_BADGES_EXTENSION, showRatingBadge: A.GRID_SHOW_BADGES_RATING, @@ -156,6 +156,7 @@ var H = (e, t) => { widthPx: 360, assetBadgeEnabled: A.SIDEBAR_ASSET_BADGE_ENABLED }, + integration: { hideNativeAssetsTab: !1 }, probeBackend: { mode: "auto" }, i18n: { followComfyLanguage: !0 }, metadataFallback: { @@ -213,16 +214,16 @@ var H = (e, t) => { tokenConfigured: !1, tokenHint: "" } -}, qt = () => { +}, Xt = () => { try { - let e = Fe.get(ce); + let e = Re.get(ce); if (!e) return { ...W }; let t = JSON.parse(e), n = t && typeof t == "object" && Number.isInteger(t.version) && t.data && typeof t.data == "object"; if (!n && (!t || typeof t != "object" || Array.isArray(t))) return { ...W }; if (n && Number(t.version) > 1) return console.warn("[Majoor] settings schema version is newer than this build, using defaults"), { ...W }; let r = n ? t.data : t, i = /* @__PURE__ */ new Set(/* @__PURE__ */ "debug.grid.infiniteScroll.siblings.autoScan.scan.watcher.status.viewer.rtHydrate.observability.feed.sidebar.probeBackend.i18n.paths.db.ratingTagsSync.cache.search.ai.executionGrouping.workflowMinimap.ui.security.safety".split(".")), a = {}; if (r && typeof r == "object") for (let [e, t] of Object.entries(r)) i.has(e) && (a[e] = t); - let o = Bt(W, a); + let o = Ut(W, a); if (!n) try { G(o); } catch (e) { @@ -240,24 +241,24 @@ var H = (e, t) => { version: 1, data: t }; - if (!Fe.set("mjrSettings", JSON.stringify(n))) throw Error("SettingsStore rejected the write"); + if (!Re.set("mjrSettings", JSON.stringify(n))) throw Error("SettingsStore rejected the write"); } catch (e) { console.warn("[Majoor] settings save failed", e); try { let e = Date.now(); - e - (Number(window?._mjrSettingsSaveFailAt || 0) || 0) > 3e4 && (window._mjrSettingsSaveFailAt = e, Ge(O("dialog.settingsSaveFailed", "Majoor: Failed to save settings (browser storage full or blocked)."))); + e - (Number(window?._mjrSettingsSaveFailAt || 0) || 0) > 3e4 && (window._mjrSettingsSaveFailAt = e, Je(O("dialog.settingsSaveFailed", "Majoor: Failed to save settings (browser storage full or blocked)."))); } catch (e) { console.debug?.(e); } try { - qe("mjr-settings-save-failed", { error: String(e?.message || e || "") }, { warnPrefix: "[Majoor]" }); + Xe("mjr-settings-save-failed", { error: String(e?.message || e || "") }, { warnPrefix: "[Majoor]" }); } catch (e) { console.debug?.(e); } } }, K = (e) => { let t = Number(A.MAX_PAGE_SIZE) || 2e3, n = Math.max(50, Math.min(t, Number(e.grid?.pageSize) || A.DEFAULT_PAGE_SIZE)); - k.DEFAULT_PAGE_SIZE = n, k.AUTO_SCAN_ON_STARTUP = !!e.autoScan?.onStartup, k.EXECUTION_GROUPING_ENABLED = !!(e.executionGrouping?.enabled ?? A.EXECUTION_GROUPING_ENABLED), k.STATUS_POLL_INTERVAL = Math.max(1e3, Number(e.status?.pollInterval) || A.STATUS_POLL_INTERVAL), k.DEBUG_SAFE_CALL = !!e.debug?.safeCall, k.DEBUG_SAFE_LISTENERS = !!e.debug?.safeListeners, k.DEBUG_VIEWER = !!e.debug?.viewer, k.GRID_MIN_SIZE = Wt(e.grid), k.FEED_GRID_MIN_SIZE = Gt(e.feed), k.GRID_GAP = Math.max(0, Math.min(40, Math.round(U(e.grid?.gap, A.GRID_GAP)))), k.GRID_SHOW_BADGES_EXTENSION = !!(e.grid?.showExtBadge ?? A.GRID_SHOW_BADGES_EXTENSION), k.GRID_SHOW_BADGES_RATING = !!(e.grid?.showRatingBadge ?? A.GRID_SHOW_BADGES_RATING), k.GRID_SHOW_BADGES_TAGS = !!(e.grid?.showTagsBadge ?? A.GRID_SHOW_BADGES_TAGS), k.GRID_SHOW_DETAILS = !!(e.grid?.showDetails ?? A.GRID_SHOW_DETAILS), k.GRID_SHOW_DETAILS_FILENAME = !!(e.grid?.showFilename ?? A.GRID_SHOW_DETAILS_FILENAME), k.GRID_SHOW_DETAILS_DATE = !!(e.grid?.showDate ?? A.GRID_SHOW_DETAILS_DATE), k.GRID_SHOW_DETAILS_DIMENSIONS = !!(e.grid?.showDimensions ?? A.GRID_SHOW_DETAILS_DIMENSIONS), k.GRID_SHOW_DETAILS_GENTIME = !!(e.grid?.showGenTime ?? A.GRID_SHOW_DETAILS_GENTIME), k.GRID_SHOW_HOVER_INFO = !!(e.grid?.showHoverInfo ?? A.GRID_SHOW_HOVER_INFO), k.GRID_SHOW_WORKFLOW_DOT = !!(e.grid?.showWorkflowDot ?? A.GRID_SHOW_WORKFLOW_DOT); + k.DEFAULT_PAGE_SIZE = n, k.AUTO_SCAN_ON_STARTUP = !!e.autoScan?.onStartup, k.EXECUTION_GROUPING_ENABLED = !!(e.executionGrouping?.enabled ?? A.EXECUTION_GROUPING_ENABLED), k.STATUS_POLL_INTERVAL = Math.max(1e3, Number(e.status?.pollInterval) || A.STATUS_POLL_INTERVAL), k.DEBUG_SAFE_CALL = !!e.debug?.safeCall, k.DEBUG_SAFE_LISTENERS = !!e.debug?.safeListeners, k.DEBUG_VIEWER = !!e.debug?.viewer, k.GRID_MIN_SIZE = qt(e.grid), k.FEED_GRID_MIN_SIZE = Jt(e.feed), k.GRID_GAP = Math.max(0, Math.min(40, Math.round(U(e.grid?.gap, A.GRID_GAP)))), k.GRID_SHOW_BADGES_EXTENSION = !!(e.grid?.showExtBadge ?? A.GRID_SHOW_BADGES_EXTENSION), k.GRID_SHOW_BADGES_RATING = !!(e.grid?.showRatingBadge ?? A.GRID_SHOW_BADGES_RATING), k.GRID_SHOW_BADGES_TAGS = !!(e.grid?.showTagsBadge ?? A.GRID_SHOW_BADGES_TAGS), k.GRID_SHOW_DETAILS = !!(e.grid?.showDetails ?? A.GRID_SHOW_DETAILS), k.GRID_SHOW_DETAILS_FILENAME = !!(e.grid?.showFilename ?? A.GRID_SHOW_DETAILS_FILENAME), k.GRID_SHOW_DETAILS_DATE = !!(e.grid?.showDate ?? A.GRID_SHOW_DETAILS_DATE), k.GRID_SHOW_DETAILS_DIMENSIONS = !!(e.grid?.showDimensions ?? A.GRID_SHOW_DETAILS_DIMENSIONS), k.GRID_SHOW_DETAILS_GENTIME = !!(e.grid?.showGenTime ?? A.GRID_SHOW_DETAILS_GENTIME), k.GRID_SHOW_HOVER_INFO = !!(e.grid?.showHoverInfo ?? A.GRID_SHOW_HOVER_INFO), k.GRID_SHOW_WORKFLOW_DOT = !!(e.grid?.showWorkflowDot ?? A.GRID_SHOW_WORKFLOW_DOT); { let t = String(e.grid?.workflowGroupBy ?? A.WORKFLOW_GRID_GROUP_BY).toLowerCase(); k.WORKFLOW_GRID_GROUP_BY = [ @@ -304,53 +305,53 @@ var H = (e, t) => { } k.VIEWER_VIDEO_GRADE_THROTTLE_FPS = Math.max(1, Math.min(60, Math.round(U(e.viewer?.videoGradeThrottleFps, A.VIEWER_VIDEO_GRADE_THROTTLE_FPS)))), k.VIEWER_SCOPES_FPS = Math.max(1, Math.min(60, Math.round(U(e.viewer?.scopesFps, A.VIEWER_SCOPES_FPS)))), k.VIEWER_META_TTL_MS = Math.max(1e3, Math.min(6e5, Math.round(U(e.viewer?.metaTtlMs, A.VIEWER_META_TTL_MS)))), k.VIEWER_META_MAX_ENTRIES = Math.max(50, Math.min(5e3, Math.round(U(e.viewer?.metaMaxEntries, A.VIEWER_META_MAX_ENTRIES)))), k.WORKFLOW_MINIMAP_ENABLED = !!(e.workflowMinimap?.enabled ?? A.WORKFLOW_MINIMAP_ENABLED), k.RT_HYDRATE_CONCURRENCY = Math.max(1, Math.min(16, Math.round(U(e.rtHydrate?.concurrency, A.RT_HYDRATE_CONCURRENCY)))), k.RT_HYDRATE_QUEUE_MAX = Math.max(10, Math.min(5e3, Math.round(U(e.rtHydrate?.queueMax, A.RT_HYDRATE_QUEUE_MAX)))), k.RT_HYDRATE_SEEN_MAX = Math.max(1e3, Math.min(2e5, Math.round(U(e.rtHydrate?.seenMax, A.RT_HYDRATE_SEEN_MAX)))), k.RT_HYDRATE_PRUNE_BUDGET = Math.max(10, Math.min(1e4, Math.round(U(e.rtHydrate?.pruneBudget, A.RT_HYDRATE_PRUNE_BUDGET)))), k.RT_HYDRATE_SEEN_TTL_MS = Math.max(5e3, Math.min(216e5, Math.round(U(e.rtHydrate?.seenTtlMs, A.RT_HYDRATE_SEEN_TTL_MS)))), k.DELETE_CONFIRMATION = !!e.safety?.confirmDeletion, k.DEBUG_VERBOSE_ERRORS = !!e.observability?.verboseErrors, k.WATCHER_MAX_PENDING = Math.max(10, Math.min(5e3, Math.round(U(e.watcher?.maxPending, 500)))), k.WATCHER_MIN_SIZE = Math.max(0, Math.min(1e6, Math.round(U(e.watcher?.minSize, 100)))), k.WATCHER_MAX_SIZE = Math.max(1e5, Math.min(17179869184, Math.round(U(e.watcher?.maxSize, 4294967296)))), k.DB_TIMEOUT_MS = Math.max(1e3, Math.min(3e4, Math.round(U(e.db?.timeoutMs, 5e3)))), k.DB_MAX_CONNECTIONS = Math.max(1, Math.min(100, Math.round(U(e.db?.maxConnections, 10)))), k.DB_QUERY_TIMEOUT_MS = Math.max(500, Math.min(1e4, Math.round(U(e.db?.queryTimeoutMs, 1e3)))), k.SIDEBAR_ASSET_BADGE_ENABLED = !!(e.sidebar?.assetBadgeEnabled ?? A.SIDEBAR_ASSET_BADGE_ENABLED), k.SEARCH_REQUEST_LIMIT = Math.max(10, Math.min(A.MAX_PAGE_SIZE || 2e3, Math.round(U(e.search?.maxResults, A.SEARCH_DEFAULT_LIMIT)))); }; -async function Jt() { +async function Zt() { try { let e = await se(); if (!e?.ok) return; let t = e.data?.prefs; if (!t || typeof t != "object") return; - let n = qt(); + let n = Xt(); if (n.security = n.security || {}, n.security.safeMode = H(t.safe_mode, n.security.safeMode), n.security.allowWrite = H(t.allow_write, n.security.allowWrite), n.security.requireAuth = H(t.require_auth, n.security.requireAuth), n.security.allowRemoteWrite = H(t.allow_remote_write, n.security.allowRemoteWrite), n.security.allowInsecureTokenTransport = H(t.allow_insecure_token_transport, n.security.allowInsecureTokenTransport), n.security.allowDelete = H(t.allow_delete, n.security.allowDelete), n.security.allowRename = H(t.allow_rename, n.security.allowRename), n.security.allowOpenInFolder = H(t.allow_open_in_folder, n.security.allowOpenInFolder), n.security.allowResetIndex = H(t.allow_reset_index, n.security.allowResetIndex), n.security.tokenConfigured = H(t.token_configured, n.security.tokenConfigured), n.security.tokenHint = String(t.token_hint || "").trim(), !String(n.security.apiToken || "").trim()) try { let e = await S(), t = String(e?.data?.token || "").trim(); e?.ok && t && x(t); } catch (e) { console.debug?.(e); } - G(n), K(n), qe("mjr-settings-changed", { key: "security" }, { warnPrefix: "[Majoor]" }); + G(n), K(n), Xe("mjr-settings-changed", { key: "security" }, { warnPrefix: "[Majoor]" }); } catch (e) { console.warn("[Majoor] failed to sync backend security settings", e); } } -async function Yt() { +async function Qt() { try { let e = await le(); if (!e?.ok) return; let t = e.data?.prefs; if (!t || typeof t != "object") return; - let n = qt(); - n.ai = n.ai || {}, n.ai.vectorSearchEnabled = H(t.enabled, n.ai.vectorSearchEnabled ?? !0), n.ai.vectorCaptionOnIndex = H(t.caption_on_index ?? t.captionOnIndex, n.ai.vectorCaptionOnIndex ?? !1), n.ai.vectorIndexOnScan = H(t.index_on_scan ?? t.indexOnScan, n.ai.vectorIndexOnScan ?? !1), n.ai.vectorUnloadAfterUse = H(t.unload_after_use ?? t.unloadAfterUse, n.ai.vectorUnloadAfterUse ?? !1), n.ai.vectorConcurrency = Math.max(1, Math.min(16, Math.floor(Number(t.concurrency ?? n.ai.vectorConcurrency ?? 1) || 1))), G(n), K(n), qe("mjr-settings-changed", { key: "ai.vectorSearch" }, { warnPrefix: "[Majoor]" }); + let n = Xt(); + n.ai = n.ai || {}, n.ai.vectorSearchEnabled = H(t.enabled, n.ai.vectorSearchEnabled ?? !0), n.ai.vectorCaptionOnIndex = H(t.caption_on_index ?? t.captionOnIndex, n.ai.vectorCaptionOnIndex ?? !1), n.ai.vectorIndexOnScan = H(t.index_on_scan ?? t.indexOnScan, n.ai.vectorIndexOnScan ?? !1), n.ai.vectorUnloadAfterUse = H(t.unload_after_use ?? t.unloadAfterUse, n.ai.vectorUnloadAfterUse ?? !1), n.ai.vectorConcurrency = Math.max(1, Math.min(16, Math.floor(Number(t.concurrency ?? n.ai.vectorConcurrency ?? 1) || 1))), G(n), K(n), Xe("mjr-settings-changed", { key: "ai.vectorSearch" }, { warnPrefix: "[Majoor]" }); } catch (e) { console.warn("[Majoor] failed to sync backend vector search settings", e); } } -async function Xt() { +async function $t() { try { let e = await D(); if (!e?.ok) return; let t = e.data?.prefs; if (!t || typeof t != "object") return; - let n = qt(); - n.executionGrouping = n.executionGrouping || {}, n.executionGrouping.enabled = H(t.enabled, n.executionGrouping.enabled ?? A.EXECUTION_GROUPING_ENABLED), G(n), K(n), qe("mjr-settings-changed", { key: "executionGrouping.enabled" }, { warnPrefix: "[Majoor]" }); + let n = Xt(); + n.executionGrouping = n.executionGrouping || {}, n.executionGrouping.enabled = H(t.enabled, n.executionGrouping.enabled ?? A.EXECUTION_GROUPING_ENABLED), G(n), K(n), Xe("mjr-settings-changed", { key: "executionGrouping.enabled" }, { warnPrefix: "[Majoor]" }); } catch (e) { console.warn("[Majoor] failed to sync backend execution grouping settings", e); } } // ui/app/settings/settingsRuntime.ts -var Zt = "mjr-runtime-status-dashboard", Qt = 3e4; -function $t() { +var en = "mjr-runtime-status-dashboard", tn = 3e4; +function nn() { try { - let e = qt(), t = String(e?.observability?.runtimeDashboardMode || W.observability.runtimeDashboardMode); + let e = Xt(), t = String(e?.observability?.runtimeDashboardMode || W.observability.runtimeDashboardMode); return [ "autoHide30", "always", @@ -360,27 +361,27 @@ function $t() { return "autoHide30"; } } -function en() { +function rn() { try { - document.getElementById(Zt)?.remove?.(); + document.getElementById(en)?.remove?.(); } catch (e) { console.debug?.(e); } } -function tn() { +function an() { try { window.__MJR_RUNTIME_STATUS_HIDE_TIMEOUT__ && (clearTimeout(window.__MJR_RUNTIME_STATUS_HIDE_TIMEOUT__), window.__MJR_RUNTIME_STATUS_HIDE_TIMEOUT__ = null); } catch (e) { console.debug?.(e); } } -function nn(e, t) { +function on(e, t) { let n = t === "auth" ? "__mjrAuthLine" : "__mjrMetricsLine"; if (e?.[n]) return e[n]; let r = document.createElement("div"); return r.style.whiteSpace = "nowrap", r.style.lineHeight = "1.35", t === "auth" && (r.style.marginTop = "4px", r.style.fontWeight = "600"), e.appendChild(r), e[n] = r, r; } -function rn(e) { +function sn(e) { let t = String(e?.token_hint || "").trim(), n = oe(), r = t || (n ? "(session)" : ""), i = e?.allow_write !== !1, a = e?.require_auth === !0, o = e?.token_configured === !0; return i ? n ? { text: O("runtime.writeAuthActive", "Write auth: active {tokenHint}", { tokenHint: r || "(session)" }), @@ -402,10 +403,10 @@ function rn(e) { color: "#ff9b9b" }; } -function an() { +function cn() { try { - if ($t() === "hidden" || window.__MJR_RUNTIME_STATUS_HIDDEN__) return en(), null; - let e = document.querySelector(".mjr-assets-manager.mjr-am-container"), t = document.getElementById(Zt); + if (nn() === "hidden" || window.__MJR_RUNTIME_STATUS_HIDDEN__) return rn(), null; + let e = document.querySelector(".mjr-assets-manager.mjr-am-container"), t = document.getElementById(en); if (!e) { try { t?.remove?.(); @@ -420,16 +421,16 @@ function an() { } catch (e) { console.debug?.(e); } - let n = document.getElementById(Zt); - return n ? n.parentElement !== e && e.appendChild(n) : (n = document.createElement("div"), n.id = Zt, n.style.position = "absolute", n.style.bottom = "10px", n.style.right = "10px", n.style.zIndex = "9999", n.style.padding = "6px 10px", n.style.borderRadius = "10px", n.style.border = "1px solid rgba(255,255,255,0.16)", n.style.background = "rgba(0,0,0,0.45)", n.style.backdropFilter = "blur(4px)", n.style.color = "var(--content-fg, #fff)", n.style.fontSize = "11px", n.style.pointerEvents = "none", n.style.display = "flex", n.style.flexDirection = "column", e.appendChild(n)), n; + let n = document.getElementById(en); + return n ? n.parentElement !== e && e.appendChild(n) : (n = document.createElement("div"), n.id = en, n.style.position = "absolute", n.style.bottom = "10px", n.style.right = "10px", n.style.zIndex = "9999", n.style.padding = "6px 10px", n.style.borderRadius = "10px", n.style.border = "1px solid rgba(255,255,255,0.16)", n.style.background = "rgba(0,0,0,0.45)", n.style.backdropFilter = "blur(4px)", n.style.color = "var(--content-fg, #fff)", n.style.fontSize = "11px", n.style.pointerEvents = "none", n.style.display = "flex", n.style.flexDirection = "column", e.appendChild(n)), n; } catch { return null; } } -async function on() { - let e = an(); +async function ln() { + let e = cn(); if (!e) return !1; - let t = nn(e, "metrics"), n = nn(e, "auth"); + let t = on(e, "metrics"), n = on(e, "auth"); try { let [r, i] = await Promise.all([me(), se()]), a = O("runtime.unavailable", "Runtime: unavailable"); if (!r?.ok || !r?.data) t.textContent = a; @@ -445,27 +446,27 @@ async function on() { pending: c }); } - let o = rn(i?.data?.prefs || null); + let o = sn(i?.data?.prefs || null); return n.textContent = o.text, n.style.color = o.color, e.title = `${a}\n${o.text}`, !0; } catch { return t.textContent = O("runtime.unavailable", "Runtime: unavailable"), n.textContent = O("runtime.writeAuthUnknown", "Write auth: unknown"), n.style.color = "#c8ced8", e.title = `${O("runtime.unavailable", "Runtime: unavailable")}\n${n.textContent}`, !0; } } -function sn() { +function un() { try { - let e = $t(); + let e = nn(); if (e === "hidden") { - window.__MJR_RUNTIME_STATUS_HIDDEN__ = !0, tn(), en(); + window.__MJR_RUNTIME_STATUS_HIDDEN__ = !0, an(), rn(); return; } window.__MJR_RUNTIME_STATUS_SETTINGS_LISTENER__ || (window.__MJR_RUNTIME_STATUS_SETTINGS_LISTENER__ = (e) => { if (e?.detail?.key !== "observability.runtimeDashboardMode") return; - let t = $t(); - window.__MJR_RUNTIME_STATUS_HIDDEN__ = t === "hidden", tn(), en(), t !== "hidden" && sn(); - }, window.addEventListener?.("mjr-settings-changed", window.__MJR_RUNTIME_STATUS_SETTINGS_LISTENER__)), window.__MJR_RUNTIME_STATUS_HIDDEN__ = !1, tn(), e === "autoHide30" && (window.__MJR_RUNTIME_STATUS_HIDE_TIMEOUT__ = setTimeout(() => { - window.__MJR_RUNTIME_STATUS_HIDDEN__ = !0, en(); - }, Qt)), on().catch(() => {}), window.__MJR_RUNTIME_STATUS_INFLIGHT__ ?? (window.__MJR_RUNTIME_STATUS_INFLIGHT__ = !1), window.__MJR_RUNTIME_STATUS_MISS_COUNT__ ?? (window.__MJR_RUNTIME_STATUS_MISS_COUNT__ = 0), window.__MJR_RUNTIME_STATUS_INTERVAL__ || (window.__MJR_RUNTIME_STATUS_INTERVAL__ = setInterval(() => { - window.__MJR_RUNTIME_STATUS_INFLIGHT__ || (window.__MJR_RUNTIME_STATUS_INFLIGHT__ = !0, on().then((e) => { + let t = nn(); + window.__MJR_RUNTIME_STATUS_HIDDEN__ = t === "hidden", an(), rn(), t !== "hidden" && un(); + }, window.addEventListener?.("mjr-settings-changed", window.__MJR_RUNTIME_STATUS_SETTINGS_LISTENER__)), window.__MJR_RUNTIME_STATUS_HIDDEN__ = !1, an(), e === "autoHide30" && (window.__MJR_RUNTIME_STATUS_HIDE_TIMEOUT__ = setTimeout(() => { + window.__MJR_RUNTIME_STATUS_HIDDEN__ = !0, rn(); + }, tn)), ln().catch(() => {}), window.__MJR_RUNTIME_STATUS_INFLIGHT__ ?? (window.__MJR_RUNTIME_STATUS_INFLIGHT__ = !1), window.__MJR_RUNTIME_STATUS_MISS_COUNT__ ?? (window.__MJR_RUNTIME_STATUS_MISS_COUNT__ = 0), window.__MJR_RUNTIME_STATUS_INTERVAL__ || (window.__MJR_RUNTIME_STATUS_INTERVAL__ = setInterval(() => { + window.__MJR_RUNTIME_STATUS_INFLIGHT__ || (window.__MJR_RUNTIME_STATUS_INFLIGHT__ = !0, ln().then((e) => { e ? window.__MJR_RUNTIME_STATUS_MISS_COUNT__ = 0 : window.__MJR_RUNTIME_STATUS_MISS_COUNT__ = Number(window.__MJR_RUNTIME_STATUS_MISS_COUNT__ || 0) + 1; }).catch(() => {}).finally(() => { window.__MJR_RUNTIME_STATUS_INFLIGHT__ = !1; @@ -476,8 +477,8 @@ function sn() { } } // ui/utils/debounce.ts -var cn = 300; -function ln(e, t = cn) { +var dn = 300; +function fn(e, t = dn) { let n, r = (...r) => { clearTimeout(n), n = setTimeout(() => e(...r), t); }; @@ -487,37 +488,78 @@ function ln(e, t = cn) { clearTimeout(n), e(...t); }, r; } +// ui/features/runtime/nativeAssetsTab.ts +var pn = /* @__PURE__ */ new Set([ + "assets", + "media-assets", + "assets-sidebar" +]), mn = [ + 500, + 2e3, + 6e3 +], hn = !1, gn = /* @__PURE__ */ new Map(), _n = []; +function vn(e) { + let t = String(e?.id || "").trim().toLowerCase(); + return !t || t.startsWith("majoor") || t.startsWith("mjr") ? !1 : pn.has(t); +} +function yn() { + for (let e of _n.splice(0)) clearTimeout(e); +} +function bn() { + let e = 0; + for (let t of je()) { + if (!vn(t)) continue; + let n = String(t.id); + Pe(n) && (gn.set(n, t), e += 1); + } + return e; +} +function xn() { + for (let [e, t] of [...gn.entries()]) (je().some((t) => String(t?.id || "") === e) || Oe(t)) && gn.delete(e); +} +function Sn(e) { + if (hn = !!e, yn(), !hn) xn(); + else { + bn(); + for (let e of mn) _n.push(setTimeout(() => { + hn && bn(); + }, e)); + } +} +function Cn() { + hn = !1, yn(), xn(); +} // ui/app/settings/settingsGrid.ts -var q = "Majoor", un = "Majoor Assets Manager"; -function dn(e, t, n) { +var q = "Majoor", wn = "Majoor Assets Manager"; +function Tn(e, t, n) { let r = (e, t) => [ - un, + wn, e, t ], i = (e) => [ - un, + wn, O("cat.cards", "Cards"), e ], a = (e) => [ - un, + wn, O("cat.badges", "Badges"), e ], o = (e) => [ - un, + wn, O("cat.badges", "Badges"), e ], s = (e, t) => { let n = String(e || "").trim(); return /^[0-9a-fA-F]{6}$/.test(n) && (n = `#${n}`), /^#[0-9a-fA-F]{6}$/.test(n) ? n.toUpperCase() : t; }; - t.grid?.minSizePreset || (t.grid = t.grid || {}, t.grid.minSizePreset = Kt(t.grid.minSize), G(t)), e({ + t.grid?.minSizePreset || (t.grid = t.grid || {}, t.grid.minSizePreset = Yt(t.grid.minSize), G(t)), e({ id: `${q}.Cards.ThumbSize`, category: i(O("setting.grid.cardSize.group", "Card size")), name: O("setting.grid.cardSize.name", "Majoor: Card Size"), tooltip: O("setting.grid.cardSize.desc", "Choose the card size preset used by the grid layout."), type: "combo", defaultValue: (() => { - let e = Rt(String(t.grid?.minSizePreset || "").toLowerCase(), Ht, Kt(t.grid?.minSize)), n = { + let e = Vt(String(t.grid?.minSizePreset || "").toLowerCase(), Gt, Yt(t.grid?.minSize)), n = { small: O("setting.grid.cardSize.small", "Small"), medium: O("setting.grid.cardSize.medium", "Medium"), large: O("setting.grid.cardSize.large", "Large") @@ -531,7 +573,7 @@ function dn(e, t, n) { ], onChange: (e) => { let r = String(e || "").trim().toLowerCase(), i = O("setting.grid.cardSize.small", "Small").toLowerCase(), a = O("setting.grid.cardSize.medium", "Medium").toLowerCase(), o = O("setting.grid.cardSize.large", "Large").toLowerCase(), s = "medium"; - r === i || r === "small" || r === "petit" ? s = "small" : r === o || r === "large" || r === "grand" ? s = "large" : (r === a || r === "medium" || r === "moyen") && (s = "medium"), t.grid.minSizePreset = s, t.grid.minSize = Vt[s], G(t), K(t), n("grid.minSizePreset"); + r === i || r === "small" || r === "petit" ? s = "small" : r === o || r === "large" || r === "grand" ? s = "large" : (r === a || r === "medium" || r === "moyen") && (s = "medium"), t.grid.minSizePreset = s, t.grid.minSize = Wt[s], G(t), K(t), n("grid.minSizePreset"); } }), e({ id: `${q}.Cards.CustomThumbSize`, @@ -547,7 +589,7 @@ function dn(e, t, n) { }, onChange: (e) => { let r = Math.max(60, Math.min(600, Math.round(Number(e) || 120))); - t.grid.minSize = r, t.grid.minSizePreset = Kt(r), G(t), K(t), n("grid.minSize"); + t.grid.minSize = r, t.grid.minSizePreset = Yt(r), G(t), K(t), n("grid.minSize"); } }), e({ id: `${q}.Grid.ShowDetails`, @@ -796,6 +838,16 @@ function dn(e, t, n) { onChange: (e) => { t.sidebar = t.sidebar || {}, t.sidebar.assetBadgeEnabled = !!e, G(t), K(t), n("sidebar.assetBadgeEnabled"); } + }), e({ + id: `${q}.Integration.HideNativeAssetsTab`, + category: r(O("cat.grid"), "Hide ComfyUI native Assets tab"), + name: "Hide ComfyUI's native Assets sidebar tab", + tooltip: "Optional. Removes ComfyUI's built-in Assets tab from the sidebar so only Majoor Assets Manager is shown. Turning it off restores the native tab. Your files and the native tab's data are not affected.", + type: "boolean", + defaultValue: !!t.integration?.hideNativeAssetsTab, + onChange: (e) => { + t.integration = t.integration || {}, t.integration.hideNativeAssetsTab = !!e, G(t), Sn(!!e), n("integration.hideNativeAssetsTab"); + } }), e({ id: `${q}.Sidebar.WidthPx`, category: r(O("cat.grid"), "Sidebar width"), @@ -893,15 +945,15 @@ function dn(e, t, n) { }); } // ui/app/settings/settingsViewer.ts -var fn = "Majoor", pn = "Majoor Assets Manager"; -function mn(e, n, r) { +var En = "Majoor", Dn = "Majoor Assets Manager"; +function On(e, n, r) { let a = (e, t) => [ - pn, + Dn, e, t ], o = (e) => a(O("cat.viewer", "Viewer"), e), s = (e) => a(O("cat.floatingViewer", "Floating Viewer"), e); e({ - id: `${fn}.Viewer.AllowPanAtZoom1`, + id: `${En}.Viewer.AllowPanAtZoom1`, category: o(O("setting.viewer.pan.name").replace("Majoor: ", "")), name: O("setting.viewer.pan.name"), tooltip: O("setting.viewer.pan.desc"), @@ -911,7 +963,7 @@ function mn(e, n, r) { n.viewer = n.viewer || {}, n.viewer.allowPanAtZoom1 = !!e, G(n), K(n), r("viewer.allowPanAtZoom1"); } }), e({ - id: `${fn}.Viewer.DisableWebGL`, + id: `${En}.Viewer.DisableWebGL`, category: o("Disable WebGL Video"), name: "Disable WebGL Video", tooltip: "Use CPU rendering (Canvas 2D) for video playback. Fixes 'black screen' issues on incompatible hardware/browsers.", @@ -921,7 +973,7 @@ function mn(e, n, r) { n.viewer = n.viewer || {}, n.viewer.disableWebGL = !!e, G(n), K(n), r("viewer.disableWebGL"); } }), e({ - id: `${fn}.Viewer.PauseDuringExecution`, + id: `${En}.Viewer.PauseDuringExecution`, category: o(O("setting.viewer.pauseExecution.name").replace("Majoor: ", "")), name: O("setting.viewer.pauseExecution.name"), tooltip: O("setting.viewer.pauseExecution.desc"), @@ -931,7 +983,7 @@ function mn(e, n, r) { n.viewer = n.viewer || {}, n.viewer.pauseDuringExecution = !!e, G(n), K(n), r("viewer.pauseDuringExecution"); } }), e({ - id: `${fn}.Viewer.FloatingPauseDuringExecution`, + id: `${En}.Viewer.FloatingPauseDuringExecution`, category: s(O("setting.viewer.floatingPauseExecution.name").replace("Majoor: ", "")), name: O("setting.viewer.floatingPauseExecution.name"), tooltip: O("setting.viewer.floatingPauseExecution.desc"), @@ -941,7 +993,7 @@ function mn(e, n, r) { n.viewer = n.viewer || {}, n.viewer.floatingPauseDuringExecution = !!e, G(n), K(n), r("viewer.floatingPauseDuringExecution"); } }), e({ - id: `${fn}.Browser.ShowFolders`, + id: `${En}.Browser.ShowFolders`, category: o("Browser"), name: "Show folders in Input / Output panels", tooltip: "When enabled, subdirectories under the Input and Output roots are shown as folder cards in the browser grid. Disable to see only files.", @@ -958,7 +1010,7 @@ function mn(e, n, r) { } } }), e({ - id: `${fn}.Viewer.MfvLiveDefault`, + id: `${En}.Viewer.MfvLiveDefault`, category: s(O("setting.viewer.mfvLiveDefault.name").replace("Majoor: ", "")), name: O("setting.viewer.mfvLiveDefault.name"), tooltip: O("setting.viewer.mfvLiveDefault.desc"), @@ -968,7 +1020,7 @@ function mn(e, n, r) { n.viewer = n.viewer || {}, n.viewer.mfvLiveDefault = !!e, G(n), K(n), r("viewer.mfvLiveDefault"); } }), e({ - id: `${fn}.Viewer.MfvPreviewDefault`, + id: `${En}.Viewer.MfvPreviewDefault`, category: s(O("setting.viewer.mfvPreviewDefault.name").replace("Majoor: ", "")), name: O("setting.viewer.mfvPreviewDefault.name"), tooltip: O("setting.viewer.mfvPreviewDefault.desc"), @@ -978,7 +1030,7 @@ function mn(e, n, r) { n.viewer = n.viewer || {}, n.viewer.mfvPreviewDefault = !!e, G(n), K(n), r("viewer.mfvPreviewDefault"); } }), e({ - id: `${fn}.Viewer.MfvTopbarButton`, + id: `${En}.Viewer.MfvTopbarButton`, category: s("Top bar Viewer button"), name: "Show Viewer button in the top bar", tooltip: "Show a Viewer toggle button in the ComfyUI top bar next to the queue controls. Disable to hide it (the V shortcut keeps working).", @@ -988,7 +1040,7 @@ function mn(e, n, r) { n.viewer = n.viewer || {}, n.viewer.mfvTopbarButton = !!e, G(n), K(n), r("viewer.mfvTopbarButton"); } }), e({ - id: `${fn}.Viewer.MfvSidebarPosition`, + id: `${En}.Viewer.MfvSidebarPosition`, category: s("Node Parameters sidebar position"), name: "Node Parameters sidebar position", tooltip: "Position of the Node Parameters sidebar in the Floating Viewer (right, left, or bottom).", @@ -1008,7 +1060,7 @@ function mn(e, n, r) { n.viewer = n.viewer || {}, n.viewer.mfvSidebarPosition = t, G(n), K(n), r("viewer.mfvSidebarPosition"); } }), e({ - id: `${fn}.Viewer.MfvPreviewMethod`, + id: `${En}.Viewer.MfvPreviewMethod`, category: s(O("setting.viewer.mfvPreviewMethod.name").replace("Majoor: ", "")), name: O("setting.viewer.mfvPreviewMethod.name"), tooltip: O("setting.viewer.mfvPreviewMethod.desc"), @@ -1032,7 +1084,7 @@ function mn(e, n, r) { n.viewer = n.viewer || {}, n.viewer.mfvPreviewMethod = t, G(n), K(n), r("viewer.mfvPreviewMethod"); } }), e({ - id: `${fn}.Viewer.MfvKjPreviewOverrideEnabled`, + id: `${En}.Viewer.MfvKjPreviewOverrideEnabled`, category: s(O("setting.viewer.mfvKjPreviewOverride.name").replace("Majoor: ", "")), name: O("setting.viewer.mfvKjPreviewOverride.name"), tooltip: O("setting.viewer.mfvKjPreviewOverride.desc"), @@ -1042,7 +1094,7 @@ function mn(e, n, r) { n.viewer = n.viewer || {}, n.viewer.mfvKjPreviewOverrideEnabled = !!e, G(n), K(n), r("viewer.mfvKjPreviewOverrideEnabled"); } }), e({ - id: `${fn}.Viewer.LtxavRgbFallback`, + id: `${En}.Viewer.LtxavRgbFallback`, category: s("LTXAV preview fallback"), name: "Majoor: LTXAV RGB Preview Fallback (experimental)", tooltip: "Reuse LTXV RGB projection for LTXAV when native latent preview is unavailable. Experimental; quality may be approximate.", @@ -1062,7 +1114,7 @@ function mn(e, n, r) { try { fe().then((e) => { if (!e?.ok) return; - let t = !!e?.data?.prefs?.enabled, i = qt(); + let t = !!e?.data?.prefs?.enabled, i = Xt(); i.viewer = i.viewer || {}, !!i.viewer.ltxavRgbFallback !== t && (i.viewer.ltxavRgbFallback = t, Object.assign(n, i), G(i), K(i), r("viewer.ltxavRgbFallback")); }).catch(() => {}); } catch (e) { @@ -1070,7 +1122,7 @@ function mn(e, n, r) { } ((t, i, a, s) => { e({ - id: `${fn}.WorkflowMinimap.${t}`, + id: `${En}.WorkflowMinimap.${t}`, category: o(O(a).replace("Majoor: ", "")), name: O(a), tooltip: O(s), @@ -1083,15 +1135,15 @@ function mn(e, n, r) { })("Enabled", "enabled", "setting.minimap.enabled.name", "setting.minimap.enabled.desc"); } // ui/app/settings/settingsScanning.ts -var hn = "Majoor", gn = "Majoor Assets Manager"; -function _n(n, i, a) { +var kn = "Majoor", An = "Majoor Assets Manager"; +function jn(n, i, a) { let o = (e, t) => [ - gn, + An, e, t ]; n({ - id: `${hn}.ExecutionGrouping.Enabled`, + id: `${kn}.ExecutionGrouping.Enabled`, category: o(O("cat.scanning"), "Execution grouping"), name: "Execution job/stack grouping", tooltip: "Enable or disable all live job_id / stack_id tracking, grouping, and stack finalization logic.", @@ -1109,7 +1161,7 @@ function _n(n, i, a) { } } }), n({ - id: `${hn}.AutoScan.OnStartup`, + id: `${kn}.AutoScan.OnStartup`, category: o(O("cat.scanning"), O("setting.scan.startup.name").replace("Majoor: ", "")), name: O("setting.scan.startup.name"), tooltip: O("setting.scan.startup.desc"), @@ -1119,7 +1171,7 @@ function _n(n, i, a) { i.autoScan = i.autoScan || {}, i.autoScan.onStartup = !!e, G(i), K(i), a("autoScan.onStartup"); } }), n({ - id: `${hn}.Scan.FastMode`, + id: `${kn}.Scan.FastMode`, category: o(O("cat.scanning"), "Scan mode"), name: "Fast scan mode", tooltip: "Use fast scan mode for manual backfill scans (skip heavier metadata work during scan).", @@ -1129,7 +1181,7 @@ function _n(n, i, a) { i.scan = i.scan || {}, i.scan.fastMode = !!e, G(i), a("scan.fastMode"); } }), n({ - id: `${hn}.Scan.JpegXL`, + id: `${kn}.Scan.JpegXL`, category: o(O("cat.scanning"), "Image formats"), name: "JPEG XL (JXL) support (Experimental)", tooltip: "Index and preview .jxl images. Preview generation requires JPEG XL support in Pillow or FFmpeg. Run a new scan after enabling.", @@ -1148,7 +1200,7 @@ function _n(n, i, a) { }), e().then((e) => { e?.ok && (i.scan = i.scan || {}, i.scan.jxlEnabled = !!e?.data?.prefs?.enabled, G(i), a("scan.jxlEnabled")); }).catch(() => {}), n({ - id: `${hn}.RtHydrate.Concurrency`, + id: `${kn}.RtHydrate.Concurrency`, category: o(O("cat.scanning"), "Hydration"), name: "Hydrate Concurrency", tooltip: "Maximum concurrent hydration requests for rating/tags.", @@ -1187,7 +1239,7 @@ function _n(n, i, a) { } }; n({ - id: `${hn}.Watcher.Enabled`, + id: `${kn}.Watcher.Enabled`, category: o(O("cat.scanning"), O("setting.watcher.enabled.label", "Enable watcher")), name: O("setting.watcher.name"), tooltip: O("setting.watcher.desc") + " (env: MJR_ENABLE_WATCHER)", @@ -1203,7 +1255,7 @@ function _n(n, i, a) { } } }), n({ - id: `${hn}.Watcher.DebounceDelay`, + id: `${kn}.Watcher.DebounceDelay`, category: o(O("cat.scanning"), O("setting.watcher.debounce.label", "Watcher debounce delay")), name: O("setting.watcher.debounce.name"), tooltip: O("setting.watcher.debounce.desc") + " (env: MJR_WATCHER_DEBOUNCE_MS)", @@ -1229,7 +1281,7 @@ function _n(n, i, a) { } } }), n({ - id: `${hn}.Watcher.DedupeWindow`, + id: `${kn}.Watcher.DedupeWindow`, category: o(O("cat.scanning"), O("setting.watcher.dedupe.label", "Watcher dedupe window")), name: O("setting.watcher.dedupe.name"), tooltip: O("setting.watcher.dedupe.desc") + " (env: MJR_WATCHER_DEDUPE_TTL_MS)", @@ -1255,7 +1307,7 @@ function _n(n, i, a) { } } }), n({ - id: `${hn}.Watcher.MaxPending`, + id: `${kn}.Watcher.MaxPending`, category: o(O("cat.scanning"), "Watcher queue"), name: "Watcher: max pending files", tooltip: "Maximum number of pending watcher files kept in memory.", @@ -1270,7 +1322,7 @@ function _n(n, i, a) { i.watcher = i.watcher || {}, i.watcher.maxPending = Math.max(10, Math.min(5e3, Math.round(U(e, 500)))), G(i), K(i), a("watcher.maxPending"); } }), n({ - id: `${hn}.Watcher.MinSize`, + id: `${kn}.Watcher.MinSize`, category: o(O("cat.scanning"), "Watcher file size"), name: "Watcher: min size (bytes)", tooltip: "Minimum file size indexed by watcher.", @@ -1285,7 +1337,7 @@ function _n(n, i, a) { i.watcher = i.watcher || {}, i.watcher.minSize = Math.max(0, Math.min(1e6, Math.round(U(e, 100)))), G(i), K(i), a("watcher.minSize"); } }), n({ - id: `${hn}.Watcher.MaxSize`, + id: `${kn}.Watcher.MaxSize`, category: o(O("cat.scanning"), "Watcher file size"), name: "Watcher: max size (bytes)", tooltip: "Maximum file size indexed by watcher.", @@ -1306,7 +1358,7 @@ function _n(n, i, a) { console.debug?.(e); } n({ - id: `${hn}.RatingTagsSync.Enabled`, + id: `${kn}.RatingTagsSync.Enabled`, category: o(O("cat.scanning"), O("setting.sync.rating.name").replace("Majoor: ", "")), name: O("setting.sync.rating.name"), tooltip: O("setting.sync.rating.desc"), @@ -1318,17 +1370,17 @@ function _n(n, i, a) { }); } // ui/app/settings/settingsFeed.ts -var vn = "Majoor", yn = "Majoor Assets Manager"; -function bn(e, t, n) { +var Mn = "Majoor", Nn = "Majoor Assets Manager"; +function Pn(e, t, n) { let r = (e) => [ - yn, + Nn, O("cat.feed", "Generated Feed"), e ], i = () => { t.feed = t.feed || {}; }; e({ - id: `${vn}.Feed.CardSize`, + id: `${Mn}.Feed.CardSize`, category: r("Card size"), name: "Feed card size (px)", tooltip: "Set the minimum card width used by the Generated Feed layout (60-600 px).", @@ -1343,7 +1395,7 @@ function bn(e, t, n) { i(), t.feed.minSize = Math.max(60, Math.min(600, Math.round(Number(e) || 120))), G(t), K(t), n("feed.minSize"); } }), e({ - id: `${vn}.Feed.ShowInfo`, + id: `${Mn}.Feed.ShowInfo`, category: r("Show info section"), name: "Show card info section", tooltip: "Show or hide the entire info section (filename, metadata, dots) below thumbnails in the Generated Feed.", @@ -1353,7 +1405,7 @@ function bn(e, t, n) { i(), t.feed.showInfo = !!e, G(t), K(t), n("feed.showInfo"); } }), e({ - id: `${vn}.Feed.ShowFilename`, + id: `${Mn}.Feed.ShowFilename`, category: r("Show filename"), name: "Show filename", tooltip: "Display the filename on feed cards.", @@ -1363,7 +1415,7 @@ function bn(e, t, n) { i(), t.feed.showFilename = !!e, G(t), K(t), n("feed.showFilename"); } }), e({ - id: `${vn}.Feed.ShowDimensions`, + id: `${Mn}.Feed.ShowDimensions`, category: r("Show dimensions"), name: "Show dimensions", tooltip: "Display resolution (WxH) and duration on feed cards.", @@ -1373,7 +1425,7 @@ function bn(e, t, n) { i(), t.feed.showDimensions = !!e, G(t), K(t), n("feed.showDimensions"); } }), e({ - id: `${vn}.Feed.ShowDate`, + id: `${Mn}.Feed.ShowDate`, category: r("Show date/time"), name: "Show date/time", tooltip: "Display date and time on feed cards.", @@ -1383,7 +1435,7 @@ function bn(e, t, n) { i(), t.feed.showDate = !!e, G(t), K(t), n("feed.showDate"); } }), e({ - id: `${vn}.Feed.ShowGenTime`, + id: `${Mn}.Feed.ShowGenTime`, category: r("Show generation time"), name: "Show generation time", tooltip: "Display the generation time badge on feed cards.", @@ -1393,7 +1445,7 @@ function bn(e, t, n) { i(), t.feed.showGenTime = !!e, G(t), K(t), n("feed.showGenTime"); } }), e({ - id: `${vn}.Feed.ShowWorkflowDot`, + id: `${Mn}.Feed.ShowWorkflowDot`, category: r("Show workflow dot"), name: "Show workflow indicator", tooltip: "Display the workflow availability dot on feed cards.", @@ -1403,7 +1455,7 @@ function bn(e, t, n) { i(), t.feed.showWorkflowDot = !!e, G(t), K(t), n("feed.showWorkflowDot"); } }), e({ - id: `${vn}.Feed.ShowExtBadge`, + id: `${Mn}.Feed.ShowExtBadge`, category: r("Show format badges"), name: "Show format badges", tooltip: "Display format badges (e.g. JPG, MP4) on feed card thumbnails.", @@ -1413,7 +1465,7 @@ function bn(e, t, n) { i(), t.feed.showExtBadge = !!e, G(t), K(t), n("feed.showExtBadge"); } }), e({ - id: `${vn}.Feed.ShowRatingBadge`, + id: `${Mn}.Feed.ShowRatingBadge`, category: r("Show rating badges"), name: "Show ratings", tooltip: "Display star ratings on feed card thumbnails.", @@ -1423,7 +1475,7 @@ function bn(e, t, n) { i(), t.feed.showRatingBadge = !!e, G(t), K(t), n("feed.showRatingBadge"); } }), e({ - id: `${vn}.Feed.ShowTagsBadge`, + id: `${Mn}.Feed.ShowTagsBadge`, category: r("Show tags badges"), name: "Show tags", tooltip: "Display tag indicators on feed card thumbnails.", @@ -1435,7 +1487,7 @@ function bn(e, t, n) { }); } // ui/app/settings/settingsSecurity.ts -var xn = "Majoor", Sn = "Majoor Assets Manager", Cn = 16, wn = { +var Fn = "Majoor", In = "Majoor Assets Manager", Ln = 16, Rn = { safeMode: !1, allowWrite: !0, allowDelete: !0, @@ -1443,54 +1495,54 @@ var xn = "Majoor", Sn = "Majoor Assets Manager", Cn = 16, wn = { allowOpenInFolder: !0, allowResetIndex: !0 }; -function Tn(e) { +function zn(e) { return !!e; } -function En(e, t) { - return Tn(e) === Tn(t); +function Bn(e, t) { + return zn(e) === zn(t); } -function Dn(e) { +function Vn(e) { return typeof e == "string" ? e.trim() : ""; } -function On(e) { +function Hn(e) { let t = String(e || "").trim().toLowerCase(); return t === "localhost" || t === "127.0.0.1" || t === "::1"; } -function kn() { +function Un() { return globalThis.location || globalThis.window?.location || null; } -function An() { - let e = kn(); +function Wn() { + let e = Un(); if (!e) return !1; let t = String(e.protocol || "").toLowerCase(), n = String(e.hostname || "").trim(); - return t === "http:" && !On(n); + return t === "http:" && !Hn(n); } -function jn(e) { +function Gn(e) { let t = globalThis.crypto; if (!t?.getRandomValues) throw Error("Secure token generation requires crypto.getRandomValues()."); return t.getRandomValues(e); } -function Mn(e) { +function Kn(e) { let t = Math.max(4, Number(e) || 0), n = new Uint8Array(t); - return jn(n), Array.from(n, (e) => e.toString(16).padStart(2, "0")).join(""); + return Gn(n), Array.from(n, (e) => e.toString(16).padStart(2, "0")).join(""); } -function Nn() { - return `mjr_${Mn(18)}`; +function qn() { + return `mjr_${Kn(18)}`; } -function Pn(e) { - return String(e?.apiToken || "").trim().length >= Cn && H(e?.allowWrite, !0) && H(e?.requireAuth, !1) && !H(e?.allowRemoteWrite, !1); +function Jn(e) { + return String(e?.apiToken || "").trim().length >= Ln && H(e?.allowWrite, !0) && H(e?.requireAuth, !1) && !H(e?.allowRemoteWrite, !1); } -function Fn(e) { +function Yn(e) { let t = String((e && typeof e == "object" ? e : {}).apiToken || "").trim(); return { - apiToken: t.length >= Cn ? t : Nn(), + apiToken: t.length >= Ln ? t : qn(), allowWrite: !0, requireAuth: !0, allowRemoteWrite: !1, - allowInsecureTokenTransport: An() + allowInsecureTokenTransport: Wn() }; } -function In(e) { +function Xn(e) { let t = e || {}; return { safe_mode: H(t.safeMode, !1), @@ -1505,44 +1557,44 @@ function In(e) { ...String(t.apiToken || "").trim() ? { api_token: String(t.apiToken || "").trim() } : {} }; } -function Ln(e) { - return y(In(e)); +function Zn(e) { + return y(Xn(e)); } -function Rn(e) { +function Qn(e) { let t = String(e?.security?.tokenHint || "").trim(); return t ? O("setting.sec.token.placeholderConfigured", "Token configured on server ({tokenHint}). Leave blank to keep the current server token.", { tokenHint: t }) : e?.security?.tokenConfigured ? O("setting.sec.token.placeholderConfiguredGeneric", "Token configured on server. Leave blank to keep the current server token.") : O("setting.sec.token.placeholder", "Auto-generated for this browser session."); } -function zn(e, n, r) { +function $n(e, n, r) { let i = (e, t) => [ - Sn, + In, e, t ]; e({ - id: `${xn}.Safety.ConfirmDeletion`, + id: `${Fn}.Safety.ConfirmDeletion`, category: i(O("cat.security"), "Confirm before deleting"), name: "Confirm before deleting", tooltip: "Show a confirmation dialog before deleting files. Disabling this allows instant deletion.", type: "boolean", defaultValue: n.safety?.confirmDeletion !== !1, onChange: (e) => { - En(n.safety?.confirmDeletion !== !1, e) || (n.safety = n.safety || {}, n.safety.confirmDeletion = !!e, G(n), K(n), r("safety.confirmDeletion")); + Bn(n.safety?.confirmDeletion !== !1, e) || (n.safety = n.safety || {}, n.safety.confirmDeletion = !!e, G(n), K(n), r("safety.confirmDeletion")); } }); let a = (t, a, o, s = "cat.security") => { e({ - id: `${xn}.Security.${t}`, + id: `${Fn}.Security.${t}`, category: i(O(s), O(a).replace("Majoor: ", "")), name: O(a), tooltip: O(o), type: "boolean", - defaultValue: H(n.security?.[t], wn[t] ?? !1), + defaultValue: H(n.security?.[t], Rn[t] ?? !1), onChange: (e) => { - if (!En(n.security?.[t], e)) { + if (!Bn(n.security?.[t], e)) { n.security = n.security || {}, n.security[t] = !!e, G(n), r(`security.${t}`); try { - Ln(n.security).then((e) => { - e?.ok && e.data?.prefs ? Jt() : e && e.ok === !1 && console.warn("[Majoor] backend security settings update failed", e.error || e); + Zn(n.security).then((e) => { + e?.ok && e.data?.prefs ? Zt() : e && e.ok === !1 && console.warn("[Majoor] backend security settings update failed", e.error || e); }).catch(() => {}); } catch (e) { console.debug?.(e); @@ -1552,29 +1604,29 @@ function zn(e, n, r) { }); }; a("safeMode", "setting.sec.safe.name", "setting.sec.safe.desc"), a("allowWrite", "setting.sec.write.name", "setting.sec.write.desc"), a("allowDelete", "setting.sec.del.name", "setting.sec.del.desc"), a("allowRename", "setting.sec.ren.name", "setting.sec.ren.desc"), a("allowOpenInFolder", "setting.sec.open.name", "setting.sec.open.desc"), a("allowResetIndex", "setting.sec.reset.name", "setting.sec.reset.desc"), e({ - id: `${xn}.Security.RemoteLanPreset`, + id: `${Fn}.Security.RemoteLanPreset`, category: i(O("cat.remote"), O("setting.sec.remoteLanPreset.name").replace("Majoor: ", "")), name: O("setting.sec.remoteLanPreset.name"), tooltip: O("setting.sec.remoteLanPreset.desc"), type: "boolean", - defaultValue: Pn(n.security), + defaultValue: Jn(n.security), onChange: (e) => { - if (n.security = n.security || {}, En(n.security.remoteLanPreset, e)) return; + if (n.security = n.security || {}, Bn(n.security.remoteLanPreset, e)) return; if (n.security.remoteLanPreset = !!e, !e) { G(n), r("security.remoteLanPreset"); return; } let i; try { - i = Fn(n.security); + i = Yn(n.security); } catch (e) { t(e?.message || O("toast.remoteLanPresetFailed", "Failed to apply the recommended remote LAN setup."), "error"); return; } Object.assign(n.security, i), n.security.tokenConfigured = !0, n.security.tokenHint = String(i.apiToken || "").trim() ? `...${String(i.apiToken).trim().slice(-4)}` : "", i.apiToken && x(i.apiToken), G(n), r("security.remoteLanPreset"), r("security.apiToken"), r("security.allowWrite"), r("security.requireAuth"), r("security.allowRemoteWrite"), r("security.allowInsecureTokenTransport"); try { - Ln(n.security).then((e) => { - e?.ok && e.data?.prefs ? (Jt(), t(O("toast.remoteLanPresetApplied", "Recommended remote LAN setup applied. This browser session is now authorized for Majoor write operations."), "success")) : e && e.ok === !1 && (t(e.error || O("toast.remoteLanPresetFailed", "Failed to apply the recommended remote LAN setup."), "error"), console.warn("[Majoor] backend remote LAN preset update failed", e.error || e)); + Zn(n.security).then((e) => { + e?.ok && e.data?.prefs ? (Zt(), t(O("toast.remoteLanPresetApplied", "Recommended remote LAN setup applied. This browser session is now authorized for Majoor write operations."), "success")) : e && e.ok === !1 && (t(e.error || O("toast.remoteLanPresetFailed", "Failed to apply the recommended remote LAN setup."), "error"), console.warn("[Majoor] backend remote LAN preset update failed", e.error || e)); }).catch((e) => { t(e?.message || O("toast.remoteLanPresetFailed", "Failed to apply the recommended remote LAN setup."), "error"); }); @@ -1583,19 +1635,19 @@ function zn(e, n, r) { } } }), e({ - id: `${xn}.Security.ApiToken`, + id: `${Fn}.Security.ApiToken`, category: i(O("cat.remote"), O("setting.sec.token.name").replace("Majoor: ", "")), name: O("setting.sec.token.name", "Majoor: API Token"), tooltip: O("setting.sec.token.desc", "Store the API token used for write operations. Majoor sends it via X-MJR-Token and Authorization headers."), type: "text", defaultValue: n.security?.apiToken || "", - attrs: { placeholder: Rn(n) }, + attrs: { placeholder: Qn(n) }, onChange: (e) => { n.security = n.security || {}; - let t = Dn(e); - if (Dn(n.security.apiToken) !== t && (n.security.apiToken = t, n.security.apiToken && (n.security.tokenConfigured = !0, n.security.tokenHint = `...${n.security.apiToken.slice(-4)}`, x(n.security.apiToken)), G(n), r("security.apiToken"), n.security.apiToken)) try { + let t = Vn(e); + if (Vn(n.security.apiToken) !== t && (n.security.apiToken = t, n.security.apiToken && (n.security.tokenConfigured = !0, n.security.tokenHint = `...${n.security.apiToken.slice(-4)}`, x(n.security.apiToken)), G(n), r("security.apiToken"), n.security.apiToken)) try { y({ api_token: n.security.apiToken }).then((e) => { - e?.ok && e.data?.prefs ? Jt() : e && e.ok === !1 && console.warn("[Majoor] backend token update failed", e.error || e); + e?.ok && e.data?.prefs ? Zt() : e && e.ok === !1 && console.warn("[Majoor] backend token update failed", e.error || e); }).catch(() => {}); } catch (e) { console.debug?.(e); @@ -1604,10 +1656,10 @@ function zn(e, n, r) { }), a("requireAuth", "setting.sec.requireAuth.name", "setting.sec.requireAuth.desc", "cat.remote"), a("allowRemoteWrite", "setting.sec.remote.name", "setting.sec.remote.desc", "cat.remote"), a("allowInsecureTokenTransport", "setting.sec.insecureTransport.name", "setting.sec.insecureTransport.desc", "cat.remote"); } // ui/app/settings/settingsAdvanced.ts -var J = "Majoor", Bn = "Majoor Assets Manager"; -function Vn(e, r, i, c) { +var J = "Majoor", er = "Majoor Assets Manager"; +function tr(e, r, i, c) { let l = (e, t) => [ - Bn, + er, e, t ], u = String(r.paths?.outputDirectory || ""), d = null, p = 0, h = null; @@ -1794,17 +1846,17 @@ function Vn(e, r, i, c) { } catch (e) { console.debug?.(e); } - let fe = Le().map((e) => e.code), pe = ["auto", ...fe]; + let fe = Ve().map((e) => e.code), pe = ["auto", ...fe]; e({ id: `${J}.Language`, category: l(O("cat.advanced"), O("setting.language.name", "Language")), name: O("setting.language.name", "Majoor: Language"), tooltip: "Use auto to detect and follow ComfyUI language. Or choose a fixed language for Majoor only.", type: "combo", - defaultValue: r.i18n?.followComfyLanguage ? "auto" : Me(), + defaultValue: r.i18n?.followComfyLanguage ? "auto" : Fe(), options: pe, onChange: (e) => { - r.i18n = r.i18n || {}, e === "auto" ? (r.i18n.followComfyLanguage = !0, Ne(!0), Ve(c), G(r), i("language")) : fe.includes(e) && (r.i18n.followComfyLanguage = !1, Ne(!1), Pe(e), G(r), i("language")); + r.i18n = r.i18n || {}, e === "auto" ? (r.i18n.followComfyLanguage = !0, Ie(!0), We(c), G(r), i("language")) : fe.includes(e) && (r.i18n.followComfyLanguage = !1, Ie(!1), Le(e), G(r), i("language")); } }), e({ id: `${J}.ProbeBackend.Mode`, @@ -1820,7 +1872,7 @@ function Vn(e, r, i, c) { "both" ], onChange: (e) => { - let t = Rt(e, [ + let t = Vt(e, [ "auto", "exiftool", "ffprobe", @@ -1948,7 +2000,7 @@ function Vn(e, r, i, c) { "hidden" ], onChange: (e) => { - let t = Rt(e, [ + let t = Vt(e, [ "autoHide30", "always", "hidden" @@ -2238,15 +2290,15 @@ function Vn(e, r, i, c) { }); } // ui/app/settings/settingsSearch.ts -var Hn = "Majoor", Un = "Majoor Assets Manager"; -function Wn(e, n, r) { +var nr = "Majoor", rr = "Majoor Assets Manager"; +function ir(e, n, r) { let i = (e, t) => [ - Un, + rr, e, t ]; e({ - id: `${Hn}.AI.VectorSearchEnabled`, + id: `${nr}.AI.VectorSearchEnabled`, category: i(O("cat.search", "Search"), "AI"), name: O("setting.ai.vector.enabled.name", "Enable AI semantic search"), tooltip: O("setting.ai.vector.enabled.desc", "Enable/disable AI vector search features (SigLIP2/X-CLIP: description search, prompt alignment, AI tag suggestions, smart collections)."), @@ -2268,7 +2320,7 @@ function Wn(e, n, r) { } } }), e({ - id: `${Hn}.AI.VectorCaptionOnIndex`, + id: `${nr}.AI.VectorCaptionOnIndex`, category: i(O("cat.search", "Search"), "AI"), name: O("setting.ai.vector.captionOnIndex.name", "Generate AI captions during indexing"), tooltip: O("setting.ai.vector.captionOnIndex.desc", "Allow automatic vector indexing and backfill to run Florence-2 captions for image assets. This is slower and can use significant VRAM/CPU; leave it off for faster grid startup."), @@ -2290,7 +2342,7 @@ function Wn(e, n, r) { } } }), e({ - id: `${Hn}.AI.VectorIndexOnScan`, + id: `${nr}.AI.VectorIndexOnScan`, category: i(O("cat.search", "Search"), "AI"), name: O("setting.ai.vector.indexOnScan.name", "Index vectors during scans"), tooltip: O("setting.ai.vector.indexOnScan.desc", "Compute SigLIP/X-CLIP embeddings while assets are scanned. Disable to avoid surprise VRAM use; run vector backfill manually when needed."), @@ -2312,7 +2364,7 @@ function Wn(e, n, r) { } } }), e({ - id: `${Hn}.AI.VectorConcurrency`, + id: `${nr}.AI.VectorConcurrency`, category: i(O("cat.search", "Search"), "AI"), name: O("setting.ai.vector.concurrency.name", "Vector indexing concurrency"), tooltip: O("setting.ai.vector.concurrency.desc", "Maximum concurrent vector embedding workers. Use 1 to minimize transient VRAM spikes."), @@ -2335,7 +2387,7 @@ function Wn(e, n, r) { } } }), e({ - id: `${Hn}.AI.VectorUnloadAfterUse`, + id: `${nr}.AI.VectorUnloadAfterUse`, category: i(O("cat.search", "Search"), "AI"), name: O("setting.ai.vector.unloadAfterUse.name", "Unload AI models after use"), tooltip: O("setting.ai.vector.unloadAfterUse.desc", "Unload Majoor SigLIP/X-CLIP/Florence models after heavy AI actions and call torch CUDA cache cleanup. This frees VRAM but makes the next AI action slower."), @@ -2357,7 +2409,7 @@ function Wn(e, n, r) { } } }), e({ - id: `${Hn}.AI.VectorUnloadNow`, + id: `${nr}.AI.VectorUnloadNow`, category: i(O("cat.search", "Search"), "AI"), name: O("setting.ai.vector.unloadNow.name", "Memory purge now"), tooltip: O("setting.ai.vector.unloadNow.desc", "Immediately unload Majoor AI vector/caption models, ask ComfyUI to unload loaded models, and clear torch CUDA cache when idle."), @@ -2373,7 +2425,7 @@ function Wn(e, n, r) { } } }), e({ - id: `${Hn}.Search.MaxResults`, + id: `${nr}.Search.MaxResults`, category: i(O("cat.search", "Search")), name: O("setting.search.maxResults.name", "Max search results (client)"), tooltip: O("setting.search.maxResults.desc", "Maximum number of results requested per search. The backend still enforces MAJOOR_SEARCH_MAX_LIMIT; increase that env var if you need a higher hard cap."), @@ -2388,7 +2440,7 @@ function Wn(e, n, r) { n.search = n.search || {}, n.search.maxResults = Math.max(10, Math.min(A.MAX_PAGE_SIZE || 2e3, Number(e) || A.SEARCH_DEFAULT_LIMIT)), G(n), K(n), r("search.maxResults"); } }), e({ - id: `${Hn}.EnvVars.Reference`, + id: `${nr}.EnvVars.Reference`, category: i(O("cat.advanced"), "Environment variables"), name: "Environment variables reference", tooltip: "Set these env vars before starting ComfyUI to override defaults:\n\nMAJOOR_OUTPUT_DIRECTORY - Override output root directory\nMAJOOR_EXIFTOOL_PATH - Path to exiftool binary\nMAJOOR_FFPROBE_PATH - Path to ffprobe binary\nMAJOOR_MEDIA_PROBE_BACKEND - Probe mode: auto|exiftool|ffprobe|both\nMAJOOR_EXIFTOOL_TIMEOUT - ExifTool timeout in seconds (default: 15)\nMAJOOR_FFPROBE_TIMEOUT - FFprobe timeout in seconds (default: 10)\nMAJOOR_DB_TIMEOUT - Database timeout in seconds (default: 30)\nMAJOOR_DB_MAX_CONNECTIONS - Max DB connections (default: 8)\nMAJOOR_METADATA_CACHE_MAX - Metadata cache max entries (default: 100000)\nMAJOOR_METADATA_EXTRACT_CONCURRENCY - Parallel metadata workers (default: 1)\nMJR_ENABLE_WATCHER - Enable file watcher: 1|0 (default: 1)\nMJR_WATCHER_DEBOUNCE_MS - Watcher debounce delay in ms (default: 3000)\nMJR_WATCHER_DEDUPE_TTL_MS - Watcher dedupe window in ms (default: 3000)\nMJR_WATCHER_MAX_FILE_SIZE_BYTES - Max file size to index (default: 512MB)\nMJR_WATCHER_FLUSH_MAX_FILES - Max files per flush batch (default: 256)\nMJR_WATCHER_PENDING_MAX - Max pending watcher queue (default: 5000)\nMJR_AM_ENABLE_VECTOR_SEARCH - Enable AI vector/semantic search: 1|0 (default: 1)\nMJR_AM_VECTOR_INDEX_ON_SCAN - Compute vectors during scans: 1|0 (default: 0)\nMJR_AM_VECTOR_CAPTION_ON_INDEX - Generate Florence captions during vector indexing: 1|0 (default: 0)\nMJR_VECTOR_CONCURRENCY - Concurrent vector workers (default: 2, use 1 for lower VRAM spikes)\nMJR_AM_VECTOR_UNLOAD_AFTER_USE - Unload Majoor AI models after heavy vector actions: 1|0 (default: 0)\nMAJOOR_SEARCH_MAX_LIMIT - Max search results (default: 500)\nMAJOOR_BG_SCAN_ON_LIST - Scan on directory list: 0|1 (default: 0)", @@ -2397,7 +2449,7 @@ function Wn(e, n, r) { }); } // ui/app/settings/SettingsPanel.ts -var Gn = "Majoor Assets Manager", Kn = /^\s*Majoor:\s*/i, qn = Object.freeze({ +var ar = "Majoor Assets Manager", or = /^\s*Majoor:\s*/i, sr = Object.freeze({ ASSETS_PANEL: "Assets Panel", GENERATED_FEED: "Generated Feed", VIEWER: "Viewer & Floating Viewer", @@ -2406,7 +2458,7 @@ var Gn = "Majoor Assets Manager", Kn = /^\s*Majoor:\s*/i, qn = Object.freeze({ GENERAL: "General", ADVANCED: "Advanced", SECURITY: "Security" -}), Jn = /* @__PURE__ */ new Set([ +}), cr = /* @__PURE__ */ new Set([ "grid.starColor", "grid.badgeImageColor", "grid.badgeVideoColor", @@ -2417,70 +2469,70 @@ var Gn = "Majoor Assets Manager", Kn = /^\s*Majoor:\s*/i, qn = Object.freeze({ "ui.cardSelectionColor", "ui.ratingColor", "ui.tagColor" -]), Yn = "Majoor.General.ResetAllSettings", Xn = "mjr-settings-reset-btn", Zn = null, Qn = null; -function $n(e) { +]), lr = "Majoor.General.ResetAllSettings", ur = "mjr-settings-reset-btn", dr = null, fr = null; +function pr(e) { let t = String(e || "").trim(); - return !t || t === Yn || t === "Majoor.Language" ? qn.GENERAL : /^Majoor\.(Safety|Security)\./.test(t) ? qn.SECURITY : /^Majoor\.(Paths|Db|ProbeBackend|MetadataFallback|Observability)\./.test(t) || t === "Majoor.EnvVars.Reference" ? qn.ADVANCED : /^Majoor\.(Viewer|WorkflowMinimap)\./.test(t) ? qn.VIEWER : /^Majoor\.Feed\./.test(t) ? qn.GENERATED_FEED : /^Majoor\.(AutoScan|Scan|Watcher|ExecutionGrouping|RatingTagsSync)\./.test(t) || t === "Majoor.RtHydrate.Concurrency" ? qn.INDEXING : /^Majoor\.AI\.(HuggingFaceTokenVisible|HuggingFaceToken|VerboseLogs|VectorStats|VectorBackfillAction|VectorSearchEnabled|VectorCaptionOnIndex|VectorIndexOnScan|VectorConcurrency|VectorUnloadAfterUse|VectorUnloadNow)$/.test(t) || /^Majoor\.Search\./.test(t) ? qn.SEARCH_AI : /^Majoor\.(Grid|Cards|Badges|Sidebar|InfiniteScroll|General)\./.test(t) ? qn.ASSETS_PANEL : qn.GENERAL; + return !t || t === lr || t === "Majoor.Language" ? sr.GENERAL : /^Majoor\.(Safety|Security)\./.test(t) ? sr.SECURITY : /^Majoor\.(Paths|Db|ProbeBackend|MetadataFallback|Observability)\./.test(t) || t === "Majoor.EnvVars.Reference" ? sr.ADVANCED : /^Majoor\.(Viewer|WorkflowMinimap)\./.test(t) ? sr.VIEWER : /^Majoor\.Feed\./.test(t) ? sr.GENERATED_FEED : /^Majoor\.(AutoScan|Scan|Watcher|ExecutionGrouping|RatingTagsSync)\./.test(t) || t === "Majoor.RtHydrate.Concurrency" ? sr.INDEXING : /^Majoor\.AI\.(HuggingFaceTokenVisible|HuggingFaceToken|VerboseLogs|VectorStats|VectorBackfillAction|VectorSearchEnabled|VectorCaptionOnIndex|VectorIndexOnScan|VectorConcurrency|VectorUnloadAfterUse|VectorUnloadNow)$/.test(t) || /^Majoor\.Search\./.test(t) ? sr.SEARCH_AI : /^Majoor\.(Grid|Cards|Badges|Sidebar|InfiniteScroll|General)\./.test(t) ? sr.ASSETS_PANEL : sr.GENERAL; } -function er(e) { - let t = Array.isArray(e?.category) ? e.category.filter(Boolean) : [], n = $n(e?.id), r = String(t[1] || t[0] || "").trim(), i = String(t[2] || "").trim(), a = String(e?.name || "").replace(Kn, "").trim(); +function mr(e) { + let t = Array.isArray(e?.category) ? e.category.filter(Boolean) : [], n = pr(e?.id), r = String(t[1] || t[0] || "").trim(), i = String(t[2] || "").trim(), a = String(e?.name || "").replace(or, "").trim(); return [ - Gn, + ar, n, i || r || a || n ]; } -var tr = !1, nr = null, rr = null, ir = !1, ar = /* @__PURE__ */ new Set(); -function or(e) { +var hr = !1, gr = null, _r = null, vr = !1, yr = /* @__PURE__ */ new Set(); +function br(e) { if (!e || typeof e != "object") return null; let t = { ...e }; try { - typeof t.name == "string" && (t.name = t.name.replace(Kn, "").trim()); + typeof t.name == "string" && (t.name = t.name.replace(or, "").trim()); } catch (e) { console.debug?.(e); } try { - t.category = er(t); + t.category = mr(t); } catch { - t.category = [Gn, qn.GENERAL]; + t.category = [ar, sr.GENERAL]; } return !t.tooltip && typeof t.name == "string" && t.name.trim() && (t.tooltip = t.name.trim()), t; } -function sr(e, t, n) { +function xr(e, t, n) { let r = String(t?.id || "").trim(); - if (!r || ar.has(r)) return !1; - ar.add(r); + if (!r || yr.has(r)) return !1; + yr.add(r); try { return ke(e, r, n); } finally { - ar.delete(r); + yr.delete(r); } } -function cr(e, t) { +function Sr(e, t) { if (!t || typeof t != "object") return t; let n = { ...t }; - sr(e, n, n.defaultValue); + xr(e, n, n.defaultValue); let r = n.onChange; return n.onChange = (t, ...i) => { - if (sr(e, n, t), typeof r == "function") return r(t, ...i); + if (xr(e, n, t), typeof r == "function") return r(t, ...i); n.defaultValue = t; }, n; } -function lr(e) { +function Cr(e) { try { return JSON.parse(JSON.stringify(e || {})); } catch { return { ...W }; } } -function ur(e, t, n, { wrapForComfy: r = !0 } = {}) { +function wr(e, t, n, { wrapForComfy: r = !0 } = {}) { let i = [], a = (e) => { - let n = or(e); - n && i.push(r ? cr(t, n) : n); + let n = br(e); + n && i.push(r ? Sr(t, n) : n); }; - return dn(a, e, n), bn(a, e, n), mn(a, e, n), _n(a, e, n), zn(a, e, n), Vn(a, e, n, t), Wn(a, e, n), i; + return Tn(a, e, n), Pn(a, e, n), On(a, e, n), jn(a, e, n), $n(a, e, n), tr(a, e, n, t), ir(a, e, n), i; } -function dr(e, t) { +function Tr(e, t) { if (e === t) return !0; try { return JSON.stringify(e) === JSON.stringify(t); @@ -2488,97 +2540,97 @@ function dr(e, t) { return !1; } } -function fr(e) { +function Er(e) { return e ? e.querySelector(".form-input") || e.querySelector(".p-inputgroup") || e.querySelector(".setting-input") || e.querySelector("[class*='input']") : null; } -function pr(e, t) { +function Dr(e, t) { let n = document.createElement("button"); - return n.type = "button", n.className = Xn, n.textContent = e, n.title = t, n.style.marginLeft = "8px", n.style.minWidth = e.length > 2 ? "auto" : "24px", n.style.height = "24px", n.style.padding = e.length > 2 ? "0 10px" : "0", n.style.borderRadius = "6px", n.style.border = "1px solid var(--border-color, #555)", n.style.background = "var(--comfy-input-bg, #2b2b2b)", n.style.color = "var(--input-text, inherit)", n.style.cursor = "pointer", n.style.fontSize = "12px", n.style.lineHeight = "22px", n.style.flexShrink = "0", n; + return n.type = "button", n.className = ur, n.textContent = e, n.title = t, n.style.marginLeft = "8px", n.style.minWidth = e.length > 2 ? "auto" : "24px", n.style.height = "24px", n.style.padding = e.length > 2 ? "0 10px" : "0", n.style.borderRadius = "6px", n.style.border = "1px solid var(--border-color, #555)", n.style.background = "var(--comfy-input-bg, #2b2b2b)", n.style.color = "var(--input-text, inherit)", n.style.cursor = "pointer", n.style.fontSize = "12px", n.style.lineHeight = "22px", n.style.flexShrink = "0", n; } -function mr(e, t, n) { - String(e?.id || "").trim() && (sr(n, e, t), typeof e?.onChange == "function" && e.onChange(t)); +function Or(e, t, n) { + String(e?.id || "").trim() && (xr(n, e, t), typeof e?.onChange == "function" && e.onChange(t)); } -function hr(e, t, n, r) { - let i = !dr(Ae(r, t.id, t.defaultValue), n); +function kr(e, t, n, r) { + let i = !Tr(Ae(r, t.id, t.defaultValue), n); e.disabled = !i, e.style.opacity = i ? "1" : "0.45"; } -function gr() { - if (typeof document > "u" || !Qn) return; - let { app: e, definitions: t, defaultValues: n } = Qn, r = document.querySelector(`[data-setting-id="${Yn}"]`), i = fr(r); +function Ar() { + if (typeof document > "u" || !fr) return; + let { app: e, definitions: t, defaultValues: n } = fr, r = document.querySelector(`[data-setting-id="${lr}"]`), i = Er(r); if (r && i && !r.getAttribute("data-mjr-reset-injected")) { r.setAttribute("data-mjr-reset-injected", "true"), i.innerHTML = ""; - let a = pr("Reset all settings", "Reset all Majoor settings to defaults"); + let a = Dr("Reset all settings", "Reset all Majoor settings to defaults"); a.onclick = (r) => { r.preventDefault(), r.stopPropagation(); - for (let r of t) r.id !== Yn && n.has(r.id) && mr(r, n.get(r.id), e); - gr(); + for (let r of t) r.id !== lr && n.has(r.id) && Or(r, n.get(r.id), e); + Ar(); }, i.appendChild(a); } for (let r of t) { - if (!r?.id || r.id === Yn || !n.has(r.id)) continue; + if (!r?.id || r.id === lr || !n.has(r.id)) continue; let t = document.querySelector(`[data-setting-id="${r.id}"]`); if (!t || t.getAttribute("data-mjr-reset-injected")) continue; - let i = fr(t); + let i = Er(t); if (!i) continue; t.setAttribute("data-mjr-reset-injected", "true"); - let a = pr("Reset", "Reset this setting to default"); - hr(a, r, n.get(r.id), e), a.onclick = (t) => { + let a = Dr("Reset", "Reset this setting to default"); + kr(a, r, n.get(r.id), e), a.onclick = (t) => { t.preventDefault(), t.stopPropagation(); let i = n.get(r.id); - mr(r, i, e), hr(a, r, i, e); + Or(r, i, e), kr(a, r, i, e); }, i.appendChild(a); } } -function _r(e, t, n) { - typeof document < "u" && typeof MutationObserver < "u" && (Qn = { +function jr(e, t, n) { + typeof document < "u" && typeof MutationObserver < "u" && (fr = { app: e, definitions: t, - defaultValues: new Map(n.filter((e) => e?.id && e.id !== Yn).map((e) => [e.id, e.defaultValue])) - }, gr(), !Zn && (Zn = new MutationObserver(() => gr()), Zn.observe(document.body, { + defaultValues: new Map(n.filter((e) => e?.id && e.id !== lr).map((e) => [e.id, e.defaultValue])) + }, Ar(), !dr && (dr = new MutationObserver(() => Ar()), dr.observe(document.body, { childList: !0, subtree: !0 }))); } -function vr(e, t, { initRuntime: n = !1 } = {}) { - if (rr) typeof t == "function" && rr.onAppliedListeners.add(t), e && !rr.app && (rr.app = e); +function Mr(e, t, { initRuntime: n = !1 } = {}) { + if (_r) typeof t == "function" && _r.onAppliedListeners.add(t), e && !_r.app && (_r.app = e); else { - let n = qt(); - n.i18n = n.i18n || {}, typeof n.i18n.followComfyLanguage == "boolean" ? Ne(!!n.i18n.followComfyLanguage) : (n.i18n.followComfyLanguage = !0, Ne(!0), G(n)); + let n = Xt(); + n.i18n = n.i18n || {}, typeof n.i18n.followComfyLanguage == "boolean" ? Ie(!!n.i18n.followComfyLanguage) : (n.i18n.followComfyLanguage = !0, Ie(!0), G(n)); let r = /* @__PURE__ */ new Set(); typeof t == "function" && r.add(t); let i = /* @__PURE__ */ new Set(), a = /* @__PURE__ */ new Set(), o = () => { if (!i.size) return; let e = Array.from(i); i.clear(); - for (let t of e) qe("mjr-settings-changed", { key: t }, { warnPrefix: "[Majoor]" }); + for (let t of e) Xe("mjr-settings-changed", { key: t }, { warnPrefix: "[Majoor]" }); }, s = () => { if (!a.size) return; let e = Array.from(a); a.clear(); - for (let t of e) qe("mjr-settings-changed", { key: t }, { warnPrefix: "[Majoor]" }); - }, c = ln(o, 120), l = ln(s, 450), u = (e) => { + for (let t of e) Xe("mjr-settings-changed", { key: t }, { warnPrefix: "[Majoor]" }); + }, c = fn(o, 120), l = fn(s, 450), u = (e) => { typeof e == "string" && i.add(e), c(); }, d = (e) => { typeof e == "string" && a.add(e), l(); }, f = () => { - let e = qt(); + let e = Xt(); Object.assign(n, e), K(n), u("storage"); }, p = (e) => { e && e.key === "mjrSettings" && e.newValue !== e.oldValue && f(); }; - if (!tr) { - if (nr && typeof window < "u") try { - window.removeEventListener("storage", nr); + if (!hr) { + if (gr && typeof window < "u") try { + window.removeEventListener("storage", gr); } catch (e) { console.debug?.(e); } try { - window.addEventListener("storage", p), tr = !0, nr = p; + window.addEventListener("storage", p), hr = !0, gr = p; } catch (e) { console.debug?.(e); } } - rr = { + _r = { app: e, notifyApplied: (e) => { for (let t of r) try { @@ -2586,47 +2638,47 @@ function vr(e, t, { initRuntime: n = !1 } = {}) { } catch (e) { console.debug?.(e); } - Jn.has(String(e || "")) ? d(e) : u(e); + cr.has(String(e || "")) ? d(e) : u(e); }, onAppliedListeners: r, refreshFromStorage: f, settings: n }; } - if (n && !ir) { - let t = e || rr.app, n = rr.settings; - Ve(t), K(n), Re(t), Jt(), Yt(), Xt(), n?.watcher && typeof n.watcher.enabled == "boolean" && r(!!n.watcher.enabled).catch(() => {}), sn(), ir = !0; + if (n && !vr) { + let t = e || _r.app, n = _r.settings; + We(t), K(n), He(t), Zt(), Qt(), $t(), n?.watcher && typeof n.watcher.enabled == "boolean" && r(!!n.watcher.enabled).catch(() => {}), un(), vr = !0; } - return rr; + return _r; } -var yr = (e, t) => vr(e, t, { initRuntime: !0 }).settings, br = (e, t) => { - let n = vr(e, t, { initRuntime: !1 }); - Object.assign(n.settings, qt()); - let r = e || n.app, i = ur(n.settings, r, n.notifyApplied), a = ur(lr(W), r, () => {}, { wrapForComfy: !1 }); - return i.unshift(cr(r, { - id: Yn, +var Nr = (e, t) => Mr(e, t, { initRuntime: !0 }).settings, Pr = (e, t) => { + let n = Mr(e, t, { initRuntime: !1 }); + Object.assign(n.settings, Xt()); + let r = e || n.app, i = wr(n.settings, r, n.notifyApplied), a = wr(Cr(W), r, () => {}, { wrapForComfy: !1 }); + return i.unshift(Sr(r, { + id: lr, category: [ - Gn, - qn.GENERAL, + ar, + sr.GENERAL, "Reset" ], name: "Reset all settings to defaults", tooltip: "Reset every Majoor Assets Manager setting to its default value.", type: "text", defaultValue: "" - })), _r(r, i, a), i; + })), jr(r, i, a), i; }; try { - let e = qt(); + let e = Xt(); e?.watcher && typeof e.watcher.enabled == "boolean" && Te().then((e) => { - let t = !!e?.ok && !!e?.data?.enabled, n = qt(); - n.watcher = n.watcher || {}, typeof t == "boolean" && t !== !!n.watcher.enabled && (n.watcher.enabled = t, G(n), qe("mjr-settings-changed", { key: "watcher.enabled" }, { warnPrefix: "[Majoor]" })); + let t = !!e?.ok && !!e?.data?.enabled, n = Xt(); + n.watcher = n.watcher || {}, typeof t == "boolean" && t !== !!n.watcher.enabled && (n.watcher.enabled = t, G(n), Xe("mjr-settings-changed", { key: "watcher.enabled" }, { warnPrefix: "[Majoor]" })); }).catch(() => {}); } catch (e) { console.debug?.(e); } // ui/features/contextmenu/gridContextMenuState.ts -function xr() { +function Fr() { return { open: !1, x: 0, @@ -2635,11 +2687,11 @@ function xr() { title: "" }; } -var Y = bt({ +var Y = Ct({ portalOwnerId: "", mountedPortalIds: [], - main: xr(), - submenu: xr(), + main: Fr(), + submenu: Fr(), tags: { open: !1, x: 0, @@ -2647,51 +2699,51 @@ var Y = bt({ asset: null, onChanged: null } -}), Sr = 1; -function Cr(e) { +}), Ir = 1; +function Lr(e) { e && (e.open = !1, e.x = 0, e.y = 0, e.items = [], e.title = ""); } -function wr(e = "") { +function Rr(e = "") { try { window.dispatchEvent(new CustomEvent("mjr-close-all-menus", { detail: { source: String(e || "") } })); } catch (e) { console.debug?.(e); } } -function Tr() { - let e = `mjr-grid-context-menu-portal-${Sr++}`; +function zr() { + let e = `mjr-grid-context-menu-portal-${Ir++}`; return Y.mountedPortalIds.push(e), Y.portalOwnerId ||= e, e; } -function Er(e) { +function Br(e) { let t = Y.mountedPortalIds.filter((t) => t !== e); Y.mountedPortalIds.splice(0, Y.mountedPortalIds.length, ...t), Y.portalOwnerId === e && (Y.portalOwnerId = Y.mountedPortalIds[0] || ""); } -function Dr(e) { +function Vr(e) { return String(Y.portalOwnerId || "") === String(e || ""); } -function Or({ x: e = 0, y: t = 0, items: n = [], title: r = "" } = {}) { - wr("grid"), Nr(), jr(), Y.main.open = !0, Y.main.x = Number(e) || 0, Y.main.y = Number(t) || 0, Y.main.items = Array.isArray(n) ? n.filter(Boolean) : [], Y.main.title = String(r || ""); +function Hr({ x: e = 0, y: t = 0, items: n = [], title: r = "" } = {}) { + Rr("grid"), qr(), Gr(), Y.main.open = !0, Y.main.x = Number(e) || 0, Y.main.y = Number(t) || 0, Y.main.items = Array.isArray(n) ? n.filter(Boolean) : [], Y.main.title = String(r || ""); } -function kr() { - Cr(Y.main), jr(); +function Ur() { + Lr(Y.main), Gr(); } -function Ar({ x: e = 0, y: t = 0, items: n = [], title: r = "" } = {}) { +function Wr({ x: e = 0, y: t = 0, items: n = [], title: r = "" } = {}) { Y.submenu.open = !0, Y.submenu.x = Number(e) || 0, Y.submenu.y = Number(t) || 0, Y.submenu.items = Array.isArray(n) ? n.filter(Boolean) : [], Y.submenu.title = String(r || ""); } -function jr() { - Cr(Y.submenu); +function Gr() { + Lr(Y.submenu); } -function Mr({ x: e = 0, y: t = 0, asset: n = null, onChanged: r = null } = {}) { - kr(), Y.tags.open = !!n, Y.tags.x = Number(e) || 0, Y.tags.y = Number(t) || 0, Y.tags.asset = n || null, Y.tags.onChanged = typeof r == "function" ? r : null; +function Kr({ x: e = 0, y: t = 0, asset: n = null, onChanged: r = null } = {}) { + Ur(), Y.tags.open = !!n, Y.tags.x = Number(e) || 0, Y.tags.y = Number(t) || 0, Y.tags.asset = n || null, Y.tags.onChanged = typeof r == "function" ? r : null; } -function Nr() { +function qr() { Y.tags.open = !1, Y.tags.x = 0, Y.tags.y = 0, Y.tags.asset = null, Y.tags.onChanged = null; } -function Pr() { - kr(), Nr(); +function Jr() { + Ur(), qr(); } // ui/features/dnd/utils/constants.ts -var Fr = "application/x-mjr-asset", Ir = "application/x-mjr-assets", Lr = "application/x-comfy-asset-info", Rr = /* @__PURE__ */ new Set([ +var Yr = "application/x-mjr-asset", Xr = "application/x-mjr-assets", Zr = "application/x-comfy-asset-info", Qr = /* @__PURE__ */ new Set([ ".png", ".jpg", ".jpeg", @@ -2702,14 +2754,14 @@ var Fr = "application/x-mjr-asset", Ir = "application/x-mjr-assets", Lr = "appli ".tiff", ".avif", ".jxl" -]), zr = /* @__PURE__ */ new Set([ +]), $r = /* @__PURE__ */ new Set([ ".mp4", ".mov", ".mkv", ".webm", ".avi", ".m4v" -]), Br = /* @__PURE__ */ new Set([ +]), ei = /* @__PURE__ */ new Set([ ".wav", ".mp3", ".flac", @@ -2717,7 +2769,7 @@ var Fr = "application/x-mjr-asset", Ir = "application/x-mjr-assets", Lr = "appli ".m4a", ".aac", ".opus" -]), Vr = /* @__PURE__ */ new Set([ +]), ti = /* @__PURE__ */ new Set([ ".obj", ".fbx", ".glb", @@ -2727,23 +2779,23 @@ var Fr = "application/x-mjr-asset", Ir = "application/x-mjr-assets", Lr = "appli ".splat", ".ksplat", ".spz" -]), Hr = (e) => { +]), ni = (e) => { if (!e) return !1; let t = e.lastIndexOf("."); - return t !== -1 && Rr.has(e.slice(t).toLowerCase()); -}, Ur = (e) => e ? String(e.kind || "").toLowerCase() === "image" || Hr(e.filename) : !1, Wr = (e) => { + return t !== -1 && Qr.has(e.slice(t).toLowerCase()); +}, ri = (e) => e ? String(e.kind || "").toLowerCase() === "image" || ni(e.filename) : !1, ii = (e) => { if (!e) return !1; let t = e.lastIndexOf("."); - return t !== -1 && zr.has(e.slice(t).toLowerCase()); -}, Gr = (e) => e ? String(e.kind || "").toLowerCase() === "video" || Wr(e.filename) : !1, Kr = (e) => { + return t !== -1 && $r.has(e.slice(t).toLowerCase()); +}, ai = (e) => e ? String(e.kind || "").toLowerCase() === "video" || ii(e.filename) : !1, oi = (e) => { if (!e) return !1; let t = e.lastIndexOf("."); - return t !== -1 && Br.has(e.slice(t).toLowerCase()); -}, qr = (e) => e ? String(e.kind || "").toLowerCase() === "audio" || Kr(e.filename) : !1, Jr = (e) => { + return t !== -1 && ei.has(e.slice(t).toLowerCase()); +}, si = (e) => e ? String(e.kind || "").toLowerCase() === "audio" || oi(e.filename) : !1, ci = (e) => { if (!e) return !1; let t = e.lastIndexOf("."); - return t !== -1 && Vr.has(e.slice(t).toLowerCase()); -}, Yr = (e) => e ? String(e.kind || "").toLowerCase() === "model3d" || Jr(e.filename) : !1, Xr = (e) => Ur(e) || Gr(e) || qr(e) || Yr(e) || String(e?.kind || "").toLowerCase() === "workflow", Zr = { + return t !== -1 && ti.has(e.slice(t).toLowerCase()); +}, li = (e) => e ? String(e.kind || "").toLowerCase() === "model3d" || ci(e.filename) : !1, ui = (e) => ri(e) || ai(e) || si(e) || li(e) || String(e?.kind || "").toLowerCase() === "workflow", di = { mp4: "video/mp4", mov: "video/quicktime", webm: "video/webm", @@ -2753,45 +2805,45 @@ var Fr = "application/x-mjr-asset", Ir = "application/x-mjr-assets", Lr = "appli obj: "model/obj", stl: "model/stl", ply: "application/ply" -}, Qr = (e) => Zr[String(e || "").split(".").pop()?.toLowerCase()] ?? "application/octet-stream", $r = (e, t) => { +}, fi = (e) => di[String(e || "").split(".").pop()?.toLowerCase()] ?? "application/octet-stream", pi = (e, t) => { if (typeof e != "string") return !1; let n = e.trim().toLowerCase(); if (!n) return !1; let r = (n.split(/[?#]/)[0].split(".").pop() || "").toLowerCase(); - return r ? t && r === String(t).toLowerCase() ? !0 : zr.has(`.${r}`) : !1; -}, ei = (e, t, n) => { + return r ? t && r === String(t).toLowerCase() ? !0 : $r.has(`.${r}`) : !1; +}, mi = (e, t, n) => { if (!e || e.type !== "combo" || !e.options) return !1; let r = Array.isArray(e.options.values) && e.options.values || e.options.values && Array.isArray(e.options.values.values) && e.options.values.values || null; return Array.isArray(r) ? r.some((e) => n(typeof e == "string" ? e : e?.content ?? e?.value ?? e?.text, t)) : !1; -}, ti = (e, t) => ei(e, t, $r), ni = (e, t) => { +}, hi = (e, t) => mi(e, t, pi), gi = (e, t) => { if (typeof e != "string") return !1; let n = e.trim().toLowerCase(); if (!n) return !1; let r = (n.split(/[?#]/)[0].split(".").pop() || "").toLowerCase(); - return r ? t && r === String(t).toLowerCase() ? !0 : Rr.has(`.${r}`) : !1; -}, ri = (e, t) => ei(e, t, ni), ii = (e, t) => { + return r ? t && r === String(t).toLowerCase() ? !0 : Qr.has(`.${r}`) : !1; +}, _i = (e, t) => mi(e, t, gi), vi = (e, t) => { if (typeof e != "string") return !1; let n = e.trim().toLowerCase(); if (!n) return !1; let r = (n.split(/[?#]/)[0].split(".").pop() || "").toLowerCase(); - return r ? t && r === String(t).toLowerCase() ? !0 : Br.has(`.${r}`) : !1; -}, ai = (e, t) => ei(e, t, ii), oi = (e, t) => { + return r ? t && r === String(t).toLowerCase() ? !0 : ei.has(`.${r}`) : !1; +}, yi = (e, t) => mi(e, t, vi), bi = (e, t) => { if (typeof e != "string") return !1; let n = e.trim().toLowerCase(); if (!n) return !1; let r = (n.split(/[?#]/)[0].split(".").pop() || "").toLowerCase(); - return r ? t && r === String(t).toLowerCase() ? !0 : Vr.has(`.${r}`) : !1; -}, si = (e, t) => ei(e, t, oi), ci = /* @__PURE__ */ new WeakMap(), li = (e) => { + return r ? t && r === String(t).toLowerCase() ? !0 : ti.has(`.${r}`) : !1; +}, xi = (e, t) => mi(e, t, bi), Si = /* @__PURE__ */ new WeakMap(), Ci = (e) => { if (!e || typeof e != "object") return { node: null, prev: null }; - let t = ci.get(e); + let t = Si.get(e); return t || (t = { node: null, prev: null - }, ci.set(e, t)), t; -}, ui = (e, t, n) => { + }, Si.set(e, t)), t; +}, wi = (e, t, n) => { let r = e?.canvas?.canvas || document.querySelector("canvas"), i = e?.canvas?.graph, a = e?.canvas?.ds; if (!r || !i || !a) return null; let o = r.getBoundingClientRect(); @@ -2806,14 +2858,14 @@ var Fr = "application/x-mjr-asset", Ir = "application/x-mjr-assets", Lr = "appli if (t.flags && t.flags.collapsed && (r = 30), d >= t.pos[0] && f >= t.pos[1] && d <= t.pos[0] + n && f <= t.pos[1] + r) return t; } return null; -}, di = (e, t, n) => { - let r = li(e); - t && r.node !== t && (fi(e, n), r.node = t, r.prev = { +}, Ti = (e, t, n) => { + let r = Ci(e); + t && r.node !== t && (Ei(e, n), r.node = t, r.prev = { color: t.color, bgcolor: t.bgcolor }, t.bgcolor = "#3355ff", t.color = "#a9c4ff", n(e)); -}, fi = (e, t) => { - let n = li(e); +}, Ei = (e, t) => { + let n = Ci(e); if (n.node) { try { n.prev && (n.node.color = n.prev.color, n.node.bgcolor = n.prev.bgcolor); @@ -2822,7 +2874,7 @@ var Fr = "application/x-mjr-asset", Ir = "application/x-mjr-assets", Lr = "appli } n.node = null, n.prev = null, t(e); } -}, pi = (e, t) => { +}, Di = (e, t) => { if (!e || e.type !== "combo" || !e.options) return; let n = e.options.values, r = e.options; if (typeof n != "function") { @@ -2836,7 +2888,7 @@ var Fr = "application/x-mjr-asset", Ir = "application/x-mjr-assets", Lr = "appli value: t }), r.values = n); } -}, mi = /* @__PURE__ */ new Set([ +}, Oi = /* @__PURE__ */ new Set([ "number", "int", "float", @@ -2845,34 +2897,34 @@ var Fr = "application/x-mjr-asset", Ir = "application/x-mjr-assets", Lr = "appli "checkbox", "button", "hidden" -]), hi = [ +]), ki = [ "output", "save", "export", "folder", "dir" -], gi = ["file", "path"], _i = [ +], Ai = ["file", "path"], ji = [ "path", "file", "input", "src", "source" -], vi = (e, t, n) => { +], Mi = (e, t, n) => { let r = e?.widgets; if (!Array.isArray(r) || !r.length) return null; let i = String(t || "").toLowerCase().replace(/^\./, ""), a = String(e?.type || "").toLowerCase(), o = n.knownNodeIncludes.some((e) => a.includes(e)), s = []; for (let e of r) { if (!e) continue; let t = String(e?.type || "").toLowerCase(), r = e?.value; - if (mi.has(t) || typeof r == "number" || typeof r == "boolean") continue; + if (Oi.has(t) || typeof r == "number" || typeof r == "boolean") continue; let a = t === "text" || t === "string" || t === "combo", c = typeof e?.callback == "function" && typeof r == "string"; if (!a && !c) continue; let l = String(e?.name || e?.label || "").toLowerCase().trim(), u = 0; n.exactNames.has(l) && (u += 100), l === "file" && o && t === "combo" && n.comboChecker(e, i) && (u += 100); - let d = n.mediaTerms.some((e) => l.includes(e)), f = _i.some((e) => l.includes(e)); - d && f && (u += 80), gi.some((e) => l.includes(e)) && (u += 35); + let d = n.mediaTerms.some((e) => l.includes(e)), f = ji.some((e) => l.includes(e)); + d && f && (u += 80), Ai.some((e) => l.includes(e)) && (u += 35); for (let { terms: e, score: t } of n.extraTerms) e.some((e) => l.includes(e)) && (u += t); - hi.some((e) => l.includes(e)) && (u -= 90), n.exactSingleNames.has(l) && (typeof r == "string" && r.trim() === "" || n.looksLikeFn(r, i) ? u += 25 : u -= 10), o && (u += 15); + ki.some((e) => l.includes(e)) && (u -= 90), n.exactSingleNames.has(l) && (typeof r == "string" && r.trim() === "" || n.looksLikeFn(r, i) ? u += 25 : u -= 10), o && (u += 15); let p = typeof r == "string" && r.trim() === ""; p && (u += 3), t === "combo" && n.comboChecker(e, i) && (u += 12), s.push({ w: e, @@ -2891,7 +2943,7 @@ var Fr = "application/x-mjr-asset", Ir = "application/x-mjr-assets", Lr = "appli console.debug?.(e); } return c.w; -}, yi = { +}, Ni = { exactNames: /* @__PURE__ */ new Set([ "video_path", "input_video", @@ -2934,10 +2986,10 @@ var Fr = "application/x-mjr-asset", Ir = "application/x-mjr-assets", Lr = "appli score: 45 }], exactSingleNames: /* @__PURE__ */ new Set(["video"]), - looksLikeFn: $r, - comboChecker: ti, + looksLikeFn: pi, + comboChecker: hi, scoreKey: "__mjrVideoPickScore" -}, bi = { +}, Pi = { exactNames: /* @__PURE__ */ new Set([ "image", "image_path", @@ -2992,10 +3044,10 @@ var Fr = "application/x-mjr-asset", Ir = "application/x-mjr-assets", Lr = "appli score: 35 }], exactSingleNames: /* @__PURE__ */ new Set(["image", "face"]), - looksLikeFn: ni, - comboChecker: ri, + looksLikeFn: gi, + comboChecker: _i, scoreKey: "__mjrImagePickScore" -}, xi = { +}, Fi = { exactNames: /* @__PURE__ */ new Set([ "audio_path", "input_audio", @@ -3043,10 +3095,10 @@ var Fr = "application/x-mjr-asset", Ir = "application/x-mjr-assets", Lr = "appli score: 45 }], exactSingleNames: /* @__PURE__ */ new Set(["audio", "voice"]), - looksLikeFn: ii, - comboChecker: ai, + looksLikeFn: vi, + comboChecker: yi, scoreKey: "__mjrAudioPickScore" -}, Si = { +}, Ii = { exactNames: /* @__PURE__ */ new Set([ "model_path", "input_model", @@ -3105,13 +3157,13 @@ var Fr = "application/x-mjr-asset", Ir = "application/x-mjr-assets", Lr = "appli "mesh", "geometry" ]), - looksLikeFn: oi, - comboChecker: si, + looksLikeFn: bi, + comboChecker: xi, scoreKey: "__mjrModel3DPickScore" -}, Ci = (e, t, n) => { +}, Li = (e, t, n) => { let r = String(t?.kind || "").toLowerCase(); - return vi(e, n, r === "model3d" ? Si : r === "audio" ? xi : r === "image" ? bi : yi); -}, wi = (e, t, n, r) => { + return Mi(e, n, r === "model3d" ? Ii : r === "audio" ? Fi : r === "image" ? Pi : Ni); +}, Ri = (e, t, n, r) => { if (!t || !t.inputs || !t.inputs.length) return null; let i = e?.canvas?.canvas || document.querySelector("canvas"), a = e?.canvas?.ds; if (!i || !a) return null; @@ -3124,15 +3176,15 @@ var Fr = "application/x-mjr-asset", Ir = "application/x-mjr-assets", Lr = "appli }; } return null; -}, Ti = (e) => { +}, zi = (e) => { let t = e?.canvas?.canvas || document.querySelector("canvas"); return t ? t.getBoundingClientRect() : null; -}, Ei = (e, t) => { - let n = Ti(e); +}, Bi = (e, t) => { + let n = zi(e); if (!n) return !1; let r = t.clientX, i = t.clientY; return r >= n.left && r <= n.right && i >= n.top && i <= n.bottom; -}, Di = (e) => { +}, Vi = (e) => { try { e?.graph?.setDirtyCanvas?.(!0, !0); } catch (e) { @@ -3143,21 +3195,21 @@ var Fr = "application/x-mjr-asset", Ir = "application/x-mjr-assets", Lr = "appli } catch (e) { console.debug?.(e); } -}, Oi = (e) => { +}, Hi = (e) => { let t = String(e?.filename || ""), n = t.lastIndexOf("."); return n >= 0 ? t.slice(n).toLowerCase() : ""; -}, ki = (e) => { - let t = String(e?.kind || "").toLowerCase(), n = Oi(e); - return t === "image" || Rr.has(n) ? ["LoadImage"] : t === "video" || zr.has(n) ? [ +}, Ui = (e) => { + let t = String(e?.kind || "").toLowerCase(), n = Hi(e); + return t === "image" || Qr.has(n) ? ["LoadImage"] : t === "video" || $r.has(n) ? [ "LoadVideo", "VHS_LoadVideo", "VideoLoader" - ] : t === "audio" || Br.has(n) ? [ + ] : t === "audio" || ei.has(n) ? [ "LoadAudio", "VHS_LoadAudioUpload", "VHS_LoadAudio", "AudioLoader" - ] : t === "model3d" || Vr.has(n) ? [ + ] : t === "model3d" || ti.has(n) ? [ "Load3D", "LoadModel", "LoadMesh", @@ -3166,9 +3218,9 @@ var Fr = "application/x-mjr-asset", Ir = "application/x-mjr-assets", Lr = "appli "LoadSTL", "LoadPLY" ] : []; -}, Ai = (e, t) => { +}, Wi = (e, t) => { if (e) { - e.type === "combo" && pi(e, t), e.value = t; + e.type === "combo" && Di(e, t), e.value = t; try { e.callback?.(e.value); } catch (e) { @@ -3180,41 +3232,41 @@ var Fr = "application/x-mjr-asset", Ir = "application/x-mjr-assets", Lr = "appli console.debug?.(e); } } -}, ji = (e) => { +}, Gi = (e) => { let t = e?.canvas?.canvas || document.querySelector("canvas"), n = t?.getBoundingClientRect?.(), r = n ? Number(n.width || n.right - n.left) : 0, i = n ? Number(n.height || n.bottom - n.top) : 0, a = Number(r || t?.width || 800), o = Number(i || t?.height || 600); if (!n) return [Math.max(0, a / 2), Math.max(0, o / 2)]; let s = n && Number(n.left) || 0, c = n && Number(n.top) || 0; - return Mi(e, s + Math.max(0, a / 2), c + Math.max(0, o / 2)); -}, Mi = (e, t, n) => { + return Ki(e, s + Math.max(0, a / 2), c + Math.max(0, o / 2)); +}, Ki = (e, t, n) => { let r = (e?.canvas?.canvas || document.querySelector("canvas"))?.getBoundingClientRect?.(), i = e?.canvas?.ds || {}, a = Number(i.scale) || 1, o = i.offset || [0, 0], s = Array.isArray(o) ? Number(o[0]) || 0 : Number(o?.x) || 0, c = Array.isArray(o) ? Number(o[1]) || 0 : Number(o?.y) || 0; - return !r || !Number.isFinite(Number(t)) || !Number.isFinite(Number(n)) ? ji(e) : [(Number(t) - r.left) / a - s, (Number(n) - r.top) / a - c]; -}, Ni = (e, t = null) => { - if (Number.isFinite(Number(t?.clientX)) && Number.isFinite(Number(t?.clientY))) return Mi(e, t.clientX, t.clientY); + return !r || !Number.isFinite(Number(t)) || !Number.isFinite(Number(n)) ? Gi(e) : [(Number(t) - r.left) / a - s, (Number(n) - r.top) / a - c]; +}, qi = (e, t = null) => { + if (Number.isFinite(Number(t?.clientX)) && Number.isFinite(Number(t?.clientY))) return Ki(e, t.clientX, t.clientY); try { let n = e?.canvas?.convertEventToCanvasOffset?.(t); if (Array.isArray(n)) return [Number(n[0]) || 0, Number(n[1]) || 0]; } catch (e) { console.debug?.(e); } - return Mi(e, t?.clientX, t?.clientY); -}, Pi = ({ app: e, payload: t, relativePath: n, event: r = null, droppedExt: i = "", position: a = null }) => { + return Ki(e, t?.clientX, t?.clientY); +}, Ji = ({ app: e, payload: t, relativePath: n, event: r = null, droppedExt: i = "", position: a = null }) => { let o = e?.graph ?? e?.canvas?.graph ?? null; if (!o || typeof o.add != "function") return !1; let s = null; - for (let n of ki(t)) try { - if (s = He(n, e), s) break; + for (let n of Ui(t)) try { + if (s = Ge(n, e), s) break; } catch (e) { console.debug?.(e); } if (!s) return !1; - s.pos = Array.isArray(a) ? [Number(a[0]) || 0, Number(a[1]) || 0] : Ni(e, r), o.add(s); - let c = Ci(s, t, i); - return c && Ai(c, n), Di(e), !0; -}, Fi = ({ app: e, items: t = [], event: n = null, gap: r = 90 }) => { + s.pos = Array.isArray(a) ? [Number(a[0]) || 0, Number(a[1]) || 0] : qi(e, r), o.add(s); + let c = Li(s, t, i); + return c && Wi(c, n), Vi(e), !0; +}, Yi = ({ app: e, items: t = [], event: n = null, gap: r = 90 }) => { let i = Array.isArray(t) ? t.filter(Boolean) : []; if (!i.length) return 0; - let a = Ni(e, n), o = 0; - for (let t of i) Pi({ + let a = qi(e, n), o = 0; + for (let t of i) Ji({ app: e, payload: t.payload, relativePath: t.relativePath, @@ -3223,27 +3275,27 @@ var Fr = "application/x-mjr-asset", Ir = "application/x-mjr-assets", Lr = "appli position: [a[0] + o * Number(r || 90), a[1]] }) && (o += 1); return o; -}, Ii = Ai, Li = ({ app: e, payload: t, relativePath: n, targetNode: r, inputSlotIndex: i, event: a = null }) => { +}, Xi = Wi, Zi = ({ app: e, payload: t, relativePath: n, targetNode: r, inputSlotIndex: i, event: a = null }) => { let o = e?.graph ?? e?.canvas?.graph ?? null; if (!o || typeof o.add != "function" || !r) return !1; let s = null; - for (let n of ki(t)) try { - if (s = He(n, e), s) break; + for (let n of Ui(t)) try { + if (s = Ge(n, e), s) break; } catch (e) { console.debug?.(e); } if (!s) return !1; let c = Number(r.pos[0]) || 0, l = Number(r.pos[1]) || 0, u = Array.isArray(s.size) && Number(s.size[0]) || 220; s.pos = [c - u - 60, l + Number(i) * 20], o.add(s); - let d = Oi(t), f = Ci(s, t, d); - f && Ai(f, n); + let d = Hi(t), f = Li(s, t, d); + f && Wi(f, n); try { s.connect(0, r, i); } catch (e) { console.debug?.(e); } - return Di(e), !0; -}, Ri = async ({ post: e, endpoint: t, payload: n, index: r = !0, purpose: i = null }) => { + return Vi(e), !0; +}, Qi = async ({ post: e, endpoint: t, payload: n, index: r = !0, purpose: i = null }) => { let a = { index: !!r, files: [{ @@ -3251,12 +3303,12 @@ var Fr = "application/x-mjr-asset", Ir = "application/x-mjr-assets", Lr = "appli subfolder: n.subfolder || "", dest_subfolder: "", type: n.type || "output", - root_id: Oe(n) || void 0 + root_id: Ne(n) || void 0 }] }; return i && (a.purpose = i), e(t, a); -}, zi = async ({ post: e, endpoint: t, payload: n, index: r = !0, purpose: i = null }) => { - let a = await Ri({ +}, $i = async ({ post: e, endpoint: t, payload: n, index: r = !0, purpose: i = null }) => { + let a = await Qi({ post: e, endpoint: t, payload: n, @@ -3271,40 +3323,40 @@ var Fr = "application/x-mjr-asset", Ir = "application/x-mjr-assets", Lr = "appli name: o?.name || null, subfolder: o?.subfolder || "" } : null; -}, Bi = async ({ post: e, endpoint: t, payload: n, index: r = !0, purpose: i = null }) => (await zi({ +}, ea = async ({ post: e, endpoint: t, payload: n, index: r = !0, purpose: i = null }) => (await $i({ post: e, endpoint: t, payload: n, index: r, purpose: i -}))?.relativePath || null, Vi = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i, Hi = /^[0-9a-f]{20,}$/i; -function Ui(...e) { +}))?.relativePath || null, ta = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i, na = /^[0-9a-f]{20,}$/i; +function ra(...e) { for (let t of e) { let e = String(t || "").trim(); if (e) return e; } return ""; } -function Wi(e) { +function ia(e) { let t = String(e || "").trim(); - return !!t && (Vi.test(t) || Hi.test(t)); + return !!t && (ta.test(t) || na.test(t)); } -function Gi(e) { +function aa(e) { return String(e?.type || e?.class_type || e?.comfyClass || e?.classType || "").trim(); } -function Ki(e) { - return Ui(e?.properties?.subgraph_name, e?.title, e?.properties?.title, e?.properties?.name, e?.properties?.label, e?.name, e?.subgraph?.name, e?.subgraph_instance?.name); +function oa(e) { + return ra(e?.properties?.subgraph_name, e?.title, e?.properties?.title, e?.properties?.name, e?.properties?.label, e?.name, e?.subgraph?.name, e?.subgraph_instance?.name); } -function qi(e) { - let t = Gi(e), n = Ki(e); - return n && (!t || Wi(t) || n !== t) ? n : t && !Wi(t) ? t : n || (t ? "Subgraph" : String(e?.id || "Node").trim() || "Node"); +function sa(e) { + let t = aa(e), n = oa(e); + return n && (!t || ia(t) || n !== t) ? n : t && !ia(t) ? t : n || (t ? "Subgraph" : String(e?.id || "Node").trim() || "Node"); } -function Ji(e) { - let t = Gi(e); - return t && !Wi(t) ? t : t ? "Subgraph" : "Node"; +function ca(e) { + let t = aa(e); + return t && !ia(t) ? t : t ? "Subgraph" : "Node"; } // ui/components/sidebar/utils/minimap.ts -var Yi = 6, Xi = 1, Zi = 64, Qi = 74, $i = 42, ea = [ +var la = 6, ua = 1, da = 64, fa = 74, pa = 42, ma = [ ["sampler", "#8e5cff"], ["ksampler", "#8e5cff"], ["loader", "#4f8cff"], @@ -3321,20 +3373,20 @@ var Yi = 6, Xi = 1, Zi = 64, Qi = 74, $i = 42, ea = [ ["save", "#4aa37c"], ["preview", "#4aa37c"], ["api", "#3aa6a6"] -], ta = (e, t, n) => { +], ha = (e, t, n) => { let r = Number(e); return Number.isFinite(r) ? Math.max(t, Math.min(n, r)) : t; -}, na = (e, t = !1) => { +}, ga = (e, t = !1) => { let n = String(e || "").toUpperCase(); return n.includes("IMAGE") ? "rgba(145,198,99,0.9)" : n.includes("LATENT") ? "rgba(89,178,118,0.9)" : n.includes("MODEL") ? "rgba(112,155,255,0.9)" : n.includes("CONDITIONING") ? "rgba(191,123,226,0.9)" : n.includes("CLIP") ? "rgba(220,178,77,0.9)" : n.includes("VAE") ? "rgba(72,184,214,0.9)" : n.includes("MASK") ? "rgba(190,190,190,0.88)" : n.includes("STRING") || n.includes("TEXT") ? "rgba(230,230,230,0.86)" : n.includes("INT") || n.includes("FLOAT") || n.includes("NUMBER") ? "rgba(130,210,220,0.88)" : t ? "rgba(170,220,255,0.82)" : "rgba(255,255,255,0.72)"; -}, ra = (e, t, n) => { +}, _a = (e, t, n) => { let r = String(t || "").replace(/\s+/g, " ").trim(), i = Math.max(1, Number(n) || 1); if (!r || e.measureText(r).width <= i) return r; let a = r; for (; a.length > 3 && e.measureText(`${a}...`).width > i;) a = a.slice(0, -1); return a.length > 3 ? `${a}...` : r.slice(0, 3); }; -function ia(e, t, n = null) { +function va(e, t, n = null) { if (!e) return; let r = e.getContext?.("2d"); if (!r) return; @@ -3348,7 +3400,7 @@ function ia(e, t, n = null) { showNodeLabels: !1, expandSubgraphs: !0, ...n && typeof n == "object" ? n : {} - }, a = i.expandSubgraphs === !1 ? t : aa(t), o = Array.isArray(a?.nodes) ? a.nodes : [], s = Array.isArray(a?.groups) && a.groups || Array.isArray(a?.extra?.groups) && a.extra.groups || Array.isArray(a?.extra?.groupNodes) && a.extra.groupNodes || Array.isArray(a?.extra?.group_nodes) && a.extra.group_nodes || [], c = Array.isArray(a?.links) && a.links || Array.isArray(a?.extra?.links) && a.extra.links || [], l = Math.max(1, e.clientWidth || e.width || 1), u = Math.max(1, e.clientHeight || e.height || 1); + }, a = i.expandSubgraphs === !1 ? t : ya(t), o = Array.isArray(a?.nodes) ? a.nodes : [], s = Array.isArray(a?.groups) && a.groups || Array.isArray(a?.extra?.groups) && a.extra.groups || Array.isArray(a?.extra?.groupNodes) && a.extra.groupNodes || Array.isArray(a?.extra?.group_nodes) && a.extra.group_nodes || [], c = Array.isArray(a?.links) && a.links || Array.isArray(a?.extra?.links) && a.extra.links || [], l = Math.max(1, e.clientWidth || e.width || 1), u = Math.max(1, e.clientHeight || e.height || 1); if ((!o || o.length === 0) && (!s || s.length === 0)) return r.clearRect(0, 0, l, u), null; let d = (e, t) => { if (!e || typeof e != "string") return `rgba(255,255,255,${t})`; @@ -3385,7 +3437,7 @@ function ia(e, t, n = null) { let t = e?.bgcolor || e?.color || null; if (t) return t; let n = String(e?.category || e?.type || e?.comfyClass || e?.class_type || e?.title || "").toLowerCase(); - for (let [e, t] of ea) if (n.includes(e)) return t; + for (let [e, t] of ma) if (n.includes(e)) return t; let r = 0; for (let e = 0; e < n.length; e += 1) r = r * 31 + n.charCodeAt(e) | 0; return `hsl(${Math.abs(r) % 360} 42% 42%)`; @@ -3394,7 +3446,7 @@ function ia(e, t, n = null) { if (n) { for (let [e, r] of Object.entries(n)) if (!(Array.isArray(r) || r && typeof r == "object") && (t.push([e, r]), t.length >= 3)) return t; } - let r = Array.isArray(e?.widgets_values) ? e.widgets_values : [], i = Array.isArray(e?.widgets) ? e.widgets : [], a = Array.isArray(e?.inputs) ? e.inputs : [], o = a.filter((e) => e?.widget === !0 || e?.widget && typeof e.widget == "object" || typeof e?.widget == "string" && e.widget.trim()), s = a.filter((e) => e?.link == null && pa(e?.type)), c = (o.length ? o : s.length ? s : a).map((e) => String(e?.label || e?.localized_name || e?.name || e?.widget?.name || e?.widget?.label || "").trim()); + let r = Array.isArray(e?.widgets_values) ? e.widgets_values : [], i = Array.isArray(e?.widgets) ? e.widgets : [], a = Array.isArray(e?.inputs) ? e.inputs : [], o = a.filter((e) => e?.widget === !0 || e?.widget && typeof e.widget == "object" || typeof e?.widget == "string" && e.widget.trim()), s = a.filter((e) => e?.link == null && Da(e?.type)), c = (o.length ? o : s.length ? s : a).map((e) => String(e?.label || e?.localized_name || e?.name || e?.widget?.name || e?.widget?.label || "").trim()); return r.forEach((e, n) => { let r = i[n]?.name || i[n]?.label || c[n] || `p${n + 1}`; t.push([r, e]); @@ -3437,7 +3489,7 @@ function ia(e, t, n = null) { outputs: C, inputCount: S.length || (e?.inputs && typeof e.inputs == "object" ? Object.keys(e.inputs).length : 0), outputCount: C.length, - label: qi(e).replace(/\s+/g, " ").trim() + label: sa(e).replace(/\s+/g, " ").trim() }), n && h.set(n, m[m.length - 1]); } if (i.showGroups) for (let e of s || []) { @@ -3457,21 +3509,21 @@ function ia(e, t, n = null) { if (!m.length) return r.clearRect(0, 0, l, u), null; let v = m[0].x, y = m[0].y, b = m[0].x + m[0].w, x = m[0].y + m[0].h; for (let e of m) v = Math.min(v, e.x), y = Math.min(y, e.y), b = Math.max(b, e.x + e.w), x = Math.max(x, e.y + e.h); - let S = Math.max(1, b - v), C = Math.max(1, x - y), ee = v + S / 2, te = y + C / 2, ne = i.view && typeof i.view == "object" ? i.view : Object.create(null), w = ta(ne.zoom ?? 1, Xi, Zi), T = Math.max(1, S / w), E = Math.max(1, C / w), re = T / 2, D = E / 2, ie = T >= S ? ee : ta(ne.centerX ?? ee, v + re, b - re), ae = E >= C ? te : ta(ne.centerY ?? te, y + D, x - D), oe = ie - re, se = ae - D, ce = Yi, le = Math.min((l - 12) / T, (u - 12) / E), ue = ne.hoveredNodeId !== null && ne.hoveredNodeId !== void 0 ? String(ne.hoveredNodeId) : null; + let S = Math.max(1, b - v), C = Math.max(1, x - y), ee = v + S / 2, te = y + C / 2, ne = i.view && typeof i.view == "object" ? i.view : Object.create(null), w = ha(ne.zoom ?? 1, ua, da), T = Math.max(1, S / w), E = Math.max(1, C / w), re = T / 2, D = E / 2, ie = T >= S ? ee : ha(ne.centerX ?? ee, v + re, b - re), ae = E >= C ? te : ha(ne.centerY ?? te, y + D, x - D), oe = ie - re, se = ae - D, ce = la, le = Math.min((l - 12) / T, (u - 12) / E), ue = ne.hoveredNodeId !== null && ne.hoveredNodeId !== void 0 ? String(ne.hoveredNodeId) : null; r.clearRect(0, 0, l, u), r.fillStyle = "rgba(0,0,0,0.22)", r.fillRect(0, 0, l, u); let de = (e, t) => ({ x: ce + (e - oe) * le, y: ce + (t - se) * le }), fe = (e, t) => ({ - x: ta(oe + (Number(e) - ce) / le, v, b), - y: ta(se + (Number(t) - ce) / le, y, x) + x: ha(oe + (Number(e) - ce) / le, v, b), + y: ha(se + (Number(t) - ce) / le, y, x) }), pe = (e) => ({ x: ce + (e.x - oe) * le, y: ce + (e.y - se) * le, w: Math.max(1, e.w * le), h: Math.max(1, e.h * le) }), me = (e) => Math.max(10, Math.min(24, Math.floor(Number(e) * .2))), he = (e, t, n) => { - let r = pe(e), i = me(r.h), a = n === "output" ? e.outputs : e.inputs, o = Math.max(1, Array.isArray(a) ? a.length : Number(e[`${n}Count`]) || 0), s = ta(t, 0, Math.max(0, o - 1)); + let r = pe(e), i = me(r.h), a = n === "output" ? e.outputs : e.inputs, o = Math.max(1, Array.isArray(a) ? a.length : Number(e[`${n}Count`]) || 0), s = ha(t, 0, Math.max(0, o - 1)); return r.y + i + (r.h - i) * (s + 1) / (o + 1); }, ge = (e) => Array.isArray(e) && e.length >= 5 ? { originId: e[1], @@ -3508,7 +3560,7 @@ function ia(e, t, n = null) { r.restore(); } }, ye = (e) => { - let { x: t, y: n, w: a, h: o } = pe(e), s = e.kind === "node", c = e.kind === "group", l = !!e.bypassed, u = !!e.errored, f = c ? .18 : l && i.renderBypassState ? .14 : .62, p = c ? .55 : l && i.renderBypassState ? .32 : .8, m = d(e.fill, f), h = d(e.stroke, p), g = s && i.showNodeLabels && a >= Qi && o >= $i, _ = Math.max(2, Math.min(g ? 7 : 8, Math.floor(Math.min(a, o) * .08))), v = s ? me(o) : 0; + let { x: t, y: n, w: a, h: o } = pe(e), s = e.kind === "node", c = e.kind === "group", l = !!e.bypassed, u = !!e.errored, f = c ? .18 : l && i.renderBypassState ? .14 : .62, p = c ? .55 : l && i.renderBypassState ? .32 : .8, m = d(e.fill, f), h = d(e.stroke, p), g = s && i.showNodeLabels && a >= fa && o >= pa, _ = Math.max(2, Math.min(g ? 7 : 8, Math.floor(Math.min(a, o) * .08))), v = s ? me(o) : 0; if (r.save(), r.globalAlpha = 1, typeof m == "string" && (m.startsWith("#") || m.startsWith("rgb") || m.startsWith("hsl")) ? (r.fillStyle = m, r.globalAlpha = f) : (r.fillStyle = typeof m == "string" ? m : "rgba(82,88,96,0.72)", r.globalAlpha = f), typeof r.roundRect == "function" ? (r.beginPath(), r.roundRect(t, n, a, o, _), r.fill()) : r.fillRect(t, n, a, o), r.restore(), s && (r.save(), r.fillStyle = d(e.stroke || e.fill, l ? .34 : .9), typeof r.roundRect == "function" ? (r.beginPath(), r.roundRect(t, n, a, v, [ _, _, @@ -3529,11 +3581,11 @@ function ia(e, t, n = null) { r.save(), r.strokeStyle = "rgba(0,0,0,0.48)", r.lineWidth = 1; for (let i = 0; i < n; i += 1) { let n = he(e, i, "input"); - r.fillStyle = na(e.inputs?.[i]?.type, !1), r.beginPath(), r.arc(t, n, g ? 3 : 2.2, 0, Math.PI * 2), r.fill(), r.stroke(); + r.fillStyle = ga(e.inputs?.[i]?.type, !1), r.beginPath(), r.arc(t, n, g ? 3 : 2.2, 0, Math.PI * 2), r.fill(), r.stroke(); } for (let n = 0; n < i; n += 1) { let i = he(e, n, "output"); - r.fillStyle = na(e.outputs?.[n]?.type, !0), r.beginPath(), r.arc(t + a, i, g ? 3 : 2.2, 0, Math.PI * 2), r.fill(), r.stroke(); + r.fillStyle = ga(e.outputs?.[n]?.type, !0), r.beginPath(), r.arc(t + a, i, g ? 3 : 2.2, 0, Math.PI * 2), r.fill(), r.stroke(); } r.restore(); } @@ -3576,12 +3628,12 @@ function ia(e, t, n = null) { let i = Math.max(24, a * .34); for (let a = 0; a < Math.min(8, e.inputs?.length || 0); a += 1) { let o = e.inputs[a], s = String(o?.label || o?.localized_name || o?.name || "").trim(); - s && r.fillText(ra(r, s, i), t + 7, he(e, a, "input") + n * .35, i); + s && r.fillText(_a(r, s, i), t + 7, he(e, a, "input") + n * .35, i); } for (let o = 0; o < Math.min(8, e.outputs?.length || 0); o += 1) { let s = e.outputs[o], c = String(s?.label || s?.localized_name || s?.name || "").trim(); if (!c) continue; - let l = ra(r, c, i); + let l = _a(r, c, i); r.fillText(l, t + a - 7 - Math.min(i, r.measureText(l).width), he(e, o, "output") + n * .35, i); } r.restore(); @@ -3591,7 +3643,7 @@ function ia(e, t, n = null) { ve(); for (let e of m.filter((e) => e.kind === "node")) ye(e); if (i.showViewport) try { - let e = je(); + let e = Me(); if (e) { let t = de(e.x0, e.y0), n = de(e.x1, e.y1), i = Math.min(t.x, n.x), a = Math.min(t.y, n.y), o = Math.abs(n.x - t.x), s = Math.abs(n.y - t.y); r.save(), r.globalAlpha = 1, r.strokeStyle = "rgba(255,255,255,0.9)", r.lineWidth = 1, r.strokeRect(i, a, o, s), r.restore(); @@ -3631,16 +3683,16 @@ function ia(e, t, n = null) { } }; } -function aa(e, t = null) { +function ya(e, t = null) { if (!e || typeof e != "object") return e; - let n = Array.isArray(e.nodes) ? e.nodes.filter(Boolean) : [], r = oa(e, t); + let n = Array.isArray(e.nodes) ? e.nodes.filter(Boolean) : [], r = ba(e, t); if (!n.length) return e; let i = [], a = Array.isArray(e.links) ? [...e.links] : [], o = [...Array.isArray(e.groups) ? e.groups : [], ...Array.isArray(e.extra?.groups) ? e.extra.groups : []]; for (let e of n) { i.push(e); - let t = sa(e, r); + let t = xa(e, r); if (!t || !Array.isArray(t.nodes) || !t.nodes.length) continue; - let n = la(e, aa(t, r)); + let n = Ca(e, ya(t, r)); i.push(...n.nodes), a.push(...n.links), n.group && o.push(n.group); } return { @@ -3654,16 +3706,16 @@ function aa(e, t = null) { } }; } -function oa(e, t = null) { +function ba(e, t = null) { let n = [ ...Array.isArray(e?.definitions?.subgraphs) ? e.definitions.subgraphs : [], ...Array.isArray(e?.subgraphs) ? e.subgraphs : [], ...Array.isArray(e?.rootGraph?.subgraphs) ? e.rootGraph.subgraphs : [] ], r = new Map(t || []); - for (let e of n) for (let t of ca(e)) t != null && r.set(String(t), e); + for (let e of n) for (let t of Sa(e)) t != null && r.set(String(t), e); return r; } -function sa(e, t) { +function xa(e, t) { let n = [ e?.type, e?.comfyClass, @@ -3691,7 +3743,7 @@ function sa(e, t) { e?.subgraph_graph ].find((e) => e && typeof e == "object" && Array.isArray(e.nodes)) || null; } -function ca(e) { +function Sa(e) { return [ e?.id, e?.name, @@ -3703,9 +3755,9 @@ function ca(e) { e?.properties?.subgraphId ].filter((e) => e != null && String(e).trim()); } -function la(e, t) { - let n = String(e?.id ?? e?.ID ?? ""), r = da(e?.pos) || [0, 0], i = fa(e?.size) || [260, 180], a = t.nodes.filter(Boolean), o = ua(a), s = Math.min(22, Math.max(8, i[0] * .08)), c = Math.min(34, Math.max(18, i[1] * .18)), l = Math.min(18, Math.max(8, i[1] * .08)), u = Math.max(40, i[0] - s * 2), d = Math.max(34, i[1] - c - l), f = Math.min(1, u / o.width, d / o.height), p = r[0] + s + (u - o.width * f) / 2, m = r[1] + c + (d - o.height * f) / 2, h = a.map((r) => { - let i = da(r?.pos) || [o.minX, o.minY], a = fa(r?.size) || [140, 60]; +function Ca(e, t) { + let n = String(e?.id ?? e?.ID ?? ""), r = Ta(e?.pos) || [0, 0], i = Ea(e?.size) || [260, 180], a = t.nodes.filter(Boolean), o = wa(a), s = Math.min(22, Math.max(8, i[0] * .08)), c = Math.min(34, Math.max(18, i[1] * .18)), l = Math.min(18, Math.max(8, i[1] * .08)), u = Math.max(40, i[0] - s * 2), d = Math.max(34, i[1] - c - l), f = Math.min(1, u / o.width, d / o.height), p = r[0] + s + (u - o.width * f) / 2, m = r[1] + c + (d - o.height * f) / 2, h = a.map((r) => { + let i = Ta(r?.pos) || [o.minX, o.minY], a = Ea(r?.size) || [140, 60]; return { ...r, id: `${n}::${r?.id ?? r?.ID ?? ""}`, @@ -3745,12 +3797,12 @@ function la(e, t) { } }; } -function ua(e) { +function wa(e) { let t = Infinity, n = Infinity, r = -Infinity, i = -Infinity; for (let a of e) { - let e = da(a?.pos); + let e = Ta(a?.pos); if (!e) continue; - let o = fa(a?.size) || [140, 60]; + let o = Ea(a?.size) || [140, 60]; t = Math.min(t, e[0]), n = Math.min(n, e[1]), r = Math.max(r, e[0] + o[0]), i = Math.max(i, e[1] + o[1]); } return Number.isFinite(t) ? { @@ -3765,7 +3817,7 @@ function ua(e) { height: 1 }; } -function da(e) { +function Ta(e) { if (Array.isArray(e) && e.length >= 2) return [Number(e[0]), Number(e[1])]; if (e && typeof e == "object") { let t = e[0] ?? e[0] ?? e.x ?? e.left ?? null, n = e[1] ?? e[1] ?? e.y ?? e.top ?? null; @@ -3773,7 +3825,7 @@ function da(e) { } return null; } -function fa(e) { +function Ea(e) { if (Array.isArray(e) && e.length >= 2) return [Number(e[0]), Number(e[1])]; if (e && typeof e == "object") { let t = e[0] ?? e[0] ?? e.w ?? e.width ?? null, n = e[1] ?? e[1] ?? e.h ?? e.height ?? null; @@ -3781,12 +3833,12 @@ function fa(e) { } return null; } -function pa(e) { +function Da(e) { if (Array.isArray(e)) return !0; let t = String(e || "").trim().toUpperCase(); return t === "INT" || t === "FLOAT" || t === "STRING" || t === "BOOLEAN" || t === "BOOL" || t === "COMBO" || t === "ENUM"; } -function ma(e, t = null) { +function Oa(e, t = null) { if (!e || typeof e != "object") return null; let n = { maxNodes: 220, @@ -3856,7 +3908,7 @@ function ma(e, t = null) { }; } // ui/features/workflows/workflowPickerState.ts -var X = bt({ +var X = Ct({ open: !1, mode: "workflow", title: "", @@ -3865,17 +3917,17 @@ var X = bt({ items: [], resolve: null }); -function ha({ title: e = "Select workflow", sourceAsset: t = null } = {}) { - return _a(null), X.open = !0, X.mode = "workflow", X.title = String(e || "Select workflow"), X.sourceAsset = t || null, X.workflow = null, X.items = [], new Promise((e) => { +function ka({ title: e = "Select workflow", sourceAsset: t = null } = {}) { + return ja(null), X.open = !0, X.mode = "workflow", X.title = String(e || "Select workflow"), X.sourceAsset = t || null, X.workflow = null, X.items = [], new Promise((e) => { X.resolve = e; }); } -function ga({ title: e = "Select asset", workflow: t = null, items: n = [] } = {}) { - return _a(null), X.open = !0, X.mode = "asset", X.title = String(e || "Select asset"), X.sourceAsset = null, X.workflow = t || null, X.items = Array.isArray(n) ? n.filter(Boolean) : [], new Promise((e) => { +function Aa({ title: e = "Select asset", workflow: t = null, items: n = [] } = {}) { + return ja(null), X.open = !0, X.mode = "asset", X.title = String(e || "Select asset"), X.sourceAsset = null, X.workflow = t || null, X.items = Array.isArray(n) ? n.filter(Boolean) : [], new Promise((e) => { X.resolve = e; }); } -function _a(e = null) { +function ja(e = null) { let t = X.resolve; if (X.open = !1, X.mode = "workflow", X.title = "", X.sourceAsset = null, X.workflow = null, X.items = [], X.resolve = null, typeof t == "function") try { t(e || null); @@ -3884,40 +3936,40 @@ function _a(e = null) { } } // ui/vue/majoorPrimeVue.ts -var va = { - Button: ft, - Checkbox: dt, - InputText: Et, - Textarea: _t, - Select: wt, - ToggleButton: xt, - Badge: St, - Tag: ct, - Dialog: ht, - Menu: Ct, - Listbox: yt, - Tree: Tt, - VirtualScroller: ut +var Ma = { + Button: ht, + Checkbox: mt, + InputText: kt, + Textarea: bt, + Select: Dt, + ToggleButton: wt, + Badge: Tt, + Tag: dt, + Dialog: vt, + Menu: Et, + Listbox: St, + Tree: Ot, + VirtualScroller: pt }; -function ya(e) { - return e.use(pt, { +function Na(e) { + return e.use(gt, { ripple: !1, unstyled: !0, zIndex: { overlay: 10100 } - }), e.use(mt), e.use(vt), Object.entries(va).forEach(([t, n]) => { + }), e.use(_t), e.use(xt), Object.entries(Ma).forEach(([t, n]) => { e.component(`M${t}`, n); }), e; } // ui/vue/createVueApp.ts -function ba(e, t = void 0) { - let n = At(), r = st(e, t); - return r.use(n), ya(r), { +function Pa(e, t = void 0) { + let n = Nt(), r = ut(e, t); + return r.use(n), Na(r), { app: r, pinia: n }; } -var xa = /* @__PURE__ */ new Map(); -function Sa(e, t, n) { +var Fa = /* @__PURE__ */ new Map(); +function Ia(e, t, n) { try { window.dispatchEvent(new CustomEvent("mjr:keepalive-attached", { detail: { mountKey: String(e || "_mjrVueApp"), @@ -3926,31 +3978,31 @@ function Sa(e, t, n) { } })); } catch {} } -function Ca(e) { +function La(e) { let t = document.createElement("div"); return t.dataset.mjrKeepAliveHost = String(e || "_mjrVueApp"), t.style.height = "100%", t.style.width = "100%", t.style.minHeight = "0", t.style.display = "flex", t.style.flexDirection = "column", t.style.overflow = "hidden", t; } -function wa(e, t) { - e && t && (e.style.height = "100%", e.style.minHeight = "0", e.style.display = "flex", e.style.flexDirection = "column", e.style.overflow = "hidden", (e.firstChild !== t || e.childNodes.length !== 1) && (e.replaceChildren(t), Sa(t?.dataset?.mjrKeepAliveHost, t, e))); +function Ra(e, t) { + e && t && (e.style.height = "100%", e.style.minHeight = "0", e.style.display = "flex", e.style.flexDirection = "column", e.style.overflow = "hidden", (e.firstChild !== t || e.childNodes.length !== 1) && (e.replaceChildren(t), Ia(t?.dataset?.mjrKeepAliveHost, t, e))); } -function Ta(e, t, n = "_mjrVueApp", { attachIfExists: r = !0 } = {}) { +function za(e, t, n = "_mjrVueApp", { attachIfExists: r = !0 } = {}) { if (!e) return !1; - let i = xa.get(n), a = !1; + let i = Fa.get(n), a = !1; if (!i) { - let e = Ca(n), { app: r } = ba(t); + let e = La(n), { app: r } = Pa(t); r.mount(e), i = { app: r, host: e, container: null - }, xa.set(n, i), a = !0; + }, Fa.set(n, i), a = !0; } - return (a || r) && (wa(e, i.host), i.container = e), a; + return (a || r) && (Ra(e, i.host), i.container = e), a; } -function Ea(e = "_mjrVueApp") { - return xa.has(e); +function Ba(e = "_mjrVueApp") { + return Fa.has(e); } -function Da(e, t = "_mjrVueApp") { - let n = xa.get(t); +function Va(e, t = "_mjrVueApp") { + let n = Fa.get(t); if (n?.app) { try { n.app.unmount(); @@ -3958,29 +4010,29 @@ function Da(e, t = "_mjrVueApp") { try { n.host?.remove?.(); } catch {} - xa.delete(t); + Fa.delete(t); } } // ui/utils/format.ts -function Oa(e) { +function Ha(e) { if (!e) return null; let t = Number(e); if (!isNaN(t)) return /* @__PURE__ */ new Date(t * 1e3); let n = new Date(e); return isNaN(n.getTime()) ? null : n; } -function ka(e) { - let t = Oa(e); +function Ua(e) { + let t = Ha(e); return t ? `${t.getDate().toString().padStart(2, "0")}/${(t.getMonth() + 1).toString().padStart(2, "0")}` : ""; } -function Aa(e) { - let t = Oa(e); +function Wa(e) { + let t = Ha(e); return t ? `${t.getHours().toString().padStart(2, "0")}:${t.getMinutes().toString().padStart(2, "0")}` : ""; } -function ja(e) { +function Ga(e) { return e ? e < 60 ? `${Math.round(e)}s` : `${Math.floor(e / 60)}m ${Math.round(e % 60)}s` : ""; } -var Ma = { +var Ka = { version: 1, parser_family_version: "geninfo-catalog-v1", sections: [ @@ -4073,24 +4125,24 @@ var Ma = { } ] }; -function Na() { +function qa() { let e = {}; - for (let t of Ma.sections) { + for (let t of Ka.sections) { e[t.key] = t.searchField, e[t.searchField] = t.searchField; for (let n of t.aliases || []) e[String(n).toLowerCase()] = t.searchField; } return e; } -function Pa(e) { +function Ja(e) { let t = String(e || "").trim().toLowerCase(); - return Na()[t] || ""; + return qa()[t] || ""; } -function Fa(e) { +function Ya(e) { let t = String(e || "").trim().toLowerCase(); - return t && Ma.sections.find((e) => e.key === t) || null; + return t && Ka.sections.find((e) => e.key === t) || null; } // ui/vue/components/panel/sidebar/SidebarFileInfoSection.vue?vue&type=script&setup=true&lang.ts -var Ia = { +var Xa = { key: 0, class: "mjr-sidebar-section", style: { @@ -4099,11 +4151,11 @@ var Ia = { "border-radius": "8px", padding: "10px" } -}, La = { style: { +}, Za = { style: { display: "flex", "flex-direction": "column", gap: "6px" -} }, Ra = ["title"], za = ["title"], Ba = /* @__PURE__ */ rt({ +} }, Qa = ["title"], $a = ["title"], eo = /* @__PURE__ */ ot({ __name: "SidebarFileInfoSection", props: { asset: {} }, setup(e) { @@ -4156,16 +4208,16 @@ var Ia = { tooltip: "Image/video resolution in pixels" }), e.duration && e.duration > 0 && f.push({ label: "Duration", - value: ja(e.duration), + value: Ga(e.duration), tooltip: "Video duration" }); - let p = Xe(e); + let p = $e(e); p != null && f.push({ label: "FPS", - value: Je(p), + value: Ze(p), tooltip: "Native frame rate" }); - let m = Ye(e, p); + let m = Qe(e, p); f.push({ label: "Frames", value: m == null ? "N/A" : String(Math.max(0, Math.floor(m))), @@ -4199,16 +4251,16 @@ var Ia = { value: String(i(u.color_space, c.color_space, c.colorspace) || "N/A"), tooltip: "Encoded color space" }); - let h = We(e.generation_time_ms ?? e.metadata?.generation_time_ms ?? 0); + let h = qe(e.generation_time_ms ?? e.metadata?.generation_time_ms ?? 0); h > 0 && f.push({ label: "Generation Time", value: `${(Number(h) / 1e3).toFixed(1)}s`, tooltip: "Time taken to generate this asset (workflow execution time)", - valueStyle: `color: ${Ke(h)}; font-weight: 600;` + valueStyle: `color: ${Ye(h)}; font-weight: 600;` }); let g = e.generation_time || e.file_creation_time || e.mtime || e.created_at; if (g) { - let e = ka(g), t = Aa(g); + let e = Ua(g), t = Wa(g); e && f.push({ label: "Date", value: e, @@ -4253,14 +4305,14 @@ var Ia = { tooltip: "ComfyUI workflow identifier (from workflow.id in extra_data)" }), f.filter((e) => a(e.value)); }); - return (e, t) => c.value.length ? (I(), z("div", Ia, [t[0] ||= M("div", { style: { + return (e, t) => c.value.length ? (I(), z("div", Xa, [t[0] ||= M("div", { style: { "font-size": "12px", "font-weight": "700", color: "#607d8b", "margin-bottom": "8px", "text-transform": "uppercase", "letter-spacing": "0.4px" - } }, " File Info ", -1), M("div", La, [(I(!0), z(j, null, F(c.value, (e) => (I(), z("div", { + } }, " File Info ", -1), M("div", Za, [(I(!0), z(j, null, F(c.value, (e) => (I(), z("div", { key: e.label, style: { display: "flex", @@ -4275,12 +4327,12 @@ var Ia = { opacity: "0.68", "min-width": "92px" } - }, R(e.label), 9, Ra), M("div", { + }, R(e.label), 9, Qa), M("div", { style: L(e.valueStyle || "font-size: 12px; text-align: right; word-break: break-word"), title: String(e.value || "") - }, R(e.value), 13, za)]))), 128))])])) : N("", !0); + }, R(e.value), 13, $a)]))), 128))])])) : N("", !0); } -}), Va = /* @__PURE__ */ new Set([ +}), to = /* @__PURE__ */ new Set([ "png", "jpg", "jpeg", @@ -4297,31 +4349,31 @@ var Ia = { "hdr", "svg" ]); -function Ha(e) { +function no(e) { let t = String(e?.filename || e?.name || e?.filepath || e?.path || "").trim().toLowerCase(); return !t || !t.includes(".") ? "" : t.split(".").pop() || ""; } -function Ua(e) { - return String(e?.kind || "").trim().toLowerCase() === "image" || String(e?.mime || e?.mimetype || "").trim().toLowerCase().startsWith("image/") ? !0 : Va.has(Ha(e)); +function ro(e) { + return String(e?.kind || "").trim().toLowerCase() === "image" || String(e?.mime || e?.mimetype || "").trim().toLowerCase().startsWith("image/") ? !0 : to.has(no(e)); } -function Wa(e) { - let t = Ha(e); +function io(e) { + let t = no(e); return t === "jpg" || t === "jpeg"; } -function Ga() { +function ao() { try { - return !!(qt()?.ai?.vectorSearchEnabled ?? !0); + return !!(Xt()?.ai?.vectorSearchEnabled ?? !0); } catch { return !0; } } -function Ka(e) { +function oo(e) { return e >= .75 ? "#4CAF50" : e >= .5 ? "#8BC34A" : e >= .3 ? "#FF9800" : "#F44336"; } -function qa(e) { +function so(e) { return e >= .85 ? "Excellent" : e >= .7 ? "Good" : e >= .5 ? "Fair" : e >= .3 ? "Low" : "Very Low"; } -function Ja(e) { +function co(e) { let t = String(e || "").trim(); if (!t) return ""; let n = []; @@ -4331,7 +4383,7 @@ function Ja(e) { } return (n.length ? n.join(" ") : t).replace(/\s+/g, " ").replace(/:{2,}\s*$/, "").trim(); } -function Ya(e) { +function lo(e) { let t = String(e?.filename || "").trim(); if (!t) return []; let n = String(e?.subfolder || "").trim(), r = String(e?.folder_type || "input").trim().toLowerCase(), i = [], a = (e) => { @@ -4341,11 +4393,11 @@ function Ya(e) { }; return (r === "input" || r === "output") && a(r), a("input"), a("output"), i; } -function Xa(e) { +function uo(e) { let t = String(e?.filepath || "").trim(), n = String(e?.filename || "").trim(); return !t || t === n ? "" : t; } -function Za(e) { +function fo(e) { let t = String(e || "").trim(); if (!t) return !1; if (t.startsWith("/")) return !0; @@ -4359,7 +4411,7 @@ function Za(e) { function Z(e) { return e == null || e === "" ? "-" : String(e); } -function Qa(e, t) { +function po(e, t) { let n = String(e?.pass_stage || e?.stage || e?.kind || "").trim().toLowerCase(); if (n === "txt2img" || n === "text_to_image" || n === "text-to-image") return O("sidebar.generation.stageTextToImage", "Text-to-Image"); if (n === "img2img" || n === "image_to_image" || n === "image-to-image") return O("sidebar.generation.stageImageToImage", "Image-to-Image"); @@ -4371,34 +4423,34 @@ function Qa(e, t) { let i = Number(e?.denoise); return t === 0 || i === 1 ? O("sidebar.generation.stageBase", "Base") : Number.isFinite(i) && i < 1 ? O("sidebar.generation.stageRefineUpscale", "Refine / Upscale") : O("sidebar.generation.stagePassN", "Pass {n}", { n: t + 1 }); } -function $a(e) { +function mo(e) { let t = []; return e?.metadata_raw && t.push(e.metadata_raw), e?.workflow && t.push(e.workflow), e?.metadata_raw?.workflow && t.push(e.metadata_raw.workflow), e?.metadata_raw?.raw_ffprobe?.format?.tags && t.push(e.metadata_raw.raw_ffprobe.format.tags), e?.metadata_raw?.ffprobe?.format?.tags && t.push(e.metadata_raw.ffprobe.format.tags), e?.geninfo && typeof e.geninfo == "object" && t.push({ geninfo: e.geninfo }), e?.metadata && (typeof e.metadata == "object" || typeof e.metadata == "string") && t.push(e.metadata), e?.prompt && (typeof e.prompt == "object" || typeof e.prompt == "string") && t.push(e.prompt), e?.exif && t.push(e.exif), e && typeof e == "object" && t.push(e), t; } -function eo(e, t) { +function ho(e, t) { for (let [n, r] of Object.entries(t)) r != null && r !== "" && (e[n] === void 0 || e[n] === null || e[n] === "") && (e[n] = r); } -function to(e) { - let t = $a(e), n = {}; +function go(e) { + let t = mo(e), n = {}; for (let e of t) { - let t = Nt(e); - t && typeof t == "object" && eo(n, t); + let t = It(e); + t && typeof t == "object" && ho(n, t); } return Object.keys(n).length ? n : null; } -function no(e) { +function _o(e) { try { if (!e || typeof e != "object") return !1; - if (e.is_override || typeof e.workflow_notes == "string" && e.workflow_notes.trim() || typeof e.notes == "string" && e.notes.trim() || Array.isArray(e.custom_info) && e.custom_info.length > 0 || e.engine && typeof e.engine == "object" && e.engine.type || Ft(e.prompt) || typeof (e.negative_prompt || e.negativePrompt) == "string" && Ft(e.negative_prompt || e.negativePrompt) || e.models || e.model || e.checkpoint || e.loras || e.ltx_director && typeof e.ltx_director == "object" || e.ideogram && typeof e.ideogram == "object" || e.sampler || e.sampler_name || e.steps || e.cfg || e.cfg_scale || e.cfg_high_noise || e.cfg_low_noise || e.scheduler || Array.isArray(e.chained_passes) && e.chained_passes.length > 0 || Array.isArray(e.all_samplers) && e.all_samplers.length > 0 || e.seed || e.denoise || e.denoising || e.clip_skip || e.voice || e.language || e.temperature || e.top_k || e.top_p || e.repetition_penalty || e.max_new_tokens || e.device || e.voice_preset || e.instruct || e.dtype || e.attn_implementation || e.enable_chunking !== void 0 || e.max_chars_per_chunk || e.chunk_combination_method || e.silence_between_chunks_ms || e.enable_audio_cache !== void 0 || e.batch_size !== void 0 || e.use_torch_compile !== void 0 || e.use_cuda_graphs !== void 0 || e.compile_mode || typeof e.lyrics == "string" && e.lyrics.trim()) return !0; + if (e.is_override || typeof e.workflow_notes == "string" && e.workflow_notes.trim() || typeof e.notes == "string" && e.notes.trim() || Array.isArray(e.custom_info) && e.custom_info.length > 0 || e.engine && typeof e.engine == "object" && e.engine.type || Rt(e.prompt) || typeof (e.negative_prompt || e.negativePrompt) == "string" && Rt(e.negative_prompt || e.negativePrompt) || e.models || e.model || e.checkpoint || e.loras || e.ltx_director && typeof e.ltx_director == "object" || e.ideogram && typeof e.ideogram == "object" || e.sampler || e.sampler_name || e.steps || e.cfg || e.cfg_scale || e.cfg_high_noise || e.cfg_low_noise || e.scheduler || Array.isArray(e.chained_passes) && e.chained_passes.length > 0 || Array.isArray(e.all_samplers) && e.all_samplers.length > 0 || e.seed || e.denoise || e.denoising || e.clip_skip || e.voice || e.language || e.temperature || e.top_k || e.top_p || e.repetition_penalty || e.max_new_tokens || e.device || e.voice_preset || e.instruct || e.dtype || e.attn_implementation || e.enable_chunking !== void 0 || e.max_chars_per_chunk || e.chunk_combination_method || e.silence_between_chunks_ms || e.enable_audio_cache !== void 0 || e.batch_size !== void 0 || e.use_torch_compile !== void 0 || e.use_cuda_graphs !== void 0 || e.compile_mode || typeof e.lyrics == "string" && e.lyrics.trim()) return !0; } catch { return !1; } return !1; } function Q(e) { - return e ? typeof e == "string" ? It(e) : typeof e == "object" ? It(e.name || e.value || "") : "" : ""; + return e ? typeof e == "string" ? zt(e) : typeof e == "object" ? zt(e.name || e.value || "") : "" : ""; } -function ro(e, t, n, r) { +function vo(e, t, n, r) { let i = String(r || "").trim(); if (!i) return; let a = `${n}::${i}`; @@ -4407,15 +4459,15 @@ function ro(e, t, n, r) { value: i })); } -function io(e) { +function yo(e) { let t = `${String(e?.source || "").toLowerCase()} ${String(e?.name || e?.lora_name || "").toLowerCase()}`; return t.includes("high_noise") || t.includes("high noise") ? "high_noise" : t.includes("low_noise") || t.includes("low noise") ? "low_noise" : ""; } -function ao(e) { +function bo(e) { let t = [], n = Array.isArray(e.model_groups) ? e.model_groups : []; if (n.length) return n.forEach((e) => { if (!e || typeof e != "object") return; - let n = Q(e.model), r = Array.isArray(e.loras) ? e.loras.map((e) => Pt(e)).filter(Boolean) : []; + let n = Q(e.model), r = Array.isArray(e.loras) ? e.loras.map((e) => Lt(e)).filter(Boolean) : []; (n || r.length) && t.push({ key: String(e.key || "").trim() || `group-${t.length + 1}`, label: String(e.label || "").trim() || `Group ${t.length + 1}`, @@ -4433,14 +4485,14 @@ function ao(e) { label: O("sidebar.generation.lowNoise", "Low Noise"), model: Q(r.unet_low_noise) }].forEach((e) => { - let n = i.filter((t) => io(t) === e.key).map((e) => Pt(e)).filter(Boolean); + let n = i.filter((t) => yo(t) === e.key).map((e) => Lt(e)).filter(Boolean); (e.model || n.length) && t.push({ ...e, loras: n }); }), t; } -function oo(e, t) { +function xo(e, t) { return t == null ? null : { label: e, value: t ? O("state.on", "on") : O("state.off", "off") @@ -4449,74 +4501,74 @@ function oo(e, t) { function $(e) { return e != null && String(e).trim() !== ""; } -function so(e) { +function So(e) { let t = String(e || "").toLowerCase(); return t.includes("high") ? "#52ffe8" : t.includes("low") ? "#42A5F5" : t.includes("refine") ? "#AB47BC" : t.includes("upscale") ? "#66BB6A" : t.includes("interpolation") || t.includes("video") ? "#dace26" : "#9C27B0"; } -function co(e) { +function Co(e) { return String(e || "").trim().toLowerCase().replace(/[^a-z0-9]+/g, "_").replace(/^_+|_+$/g, ""); } -function lo(e, t) { +function wo(e, t) { let n = String(t || e || "").trim(), r = String(e || n).toLowerCase(), i = r.match(/^pass_(\d+)$/); return i ? O("sidebar.generation.stagePassN", "Pass {n}", { n: Number(i[1]) }) : r.includes("high") ? "High" : r.includes("low") ? "Low" : r.includes("refine") ? "Refiner" : r.includes("upscale") ? "Upscale" : r.includes("text_to_image") || r.includes("image_to_image") || r === "base" ? "Base" : n || "Branch"; } -function uo(e, t) { +function To(e, t) { let n = new Set(t.map((e) => String(e).toLowerCase())); return e.find((e) => n.has(String(e.label || "").toLowerCase())) || null; } -function fo(e, t) { +function Eo(e, t) { return $(t) ? { label: e, value: t } : null; } -function po(e) { +function Do(e) { let t = String(e || "").toLowerCase(); return t.includes("high_noise") || t.includes("high-noise") || t.includes("high noise") ? "high" : t.includes("low_noise") || t.includes("low-noise") || t.includes("low noise") ? "low" : ""; } -function mo(e) { +function Oo(e) { return Array.isArray(e) || e && typeof e == "object" ? !1 : $(e) && String(e).trim() !== "-"; } -function ho(e) { +function ko(e) { return typeof e == "number" ? Math.abs(e - Math.round(e)) < 1e-9 ? String(Math.round(e)) : e.toFixed(2).replace(/0+$/g, "").replace(/\.$/, "") : String(e ?? "").trim(); } -function go(e) { +function Ao(e) { if (!$(e)) return null; let t = Number(e); return !Number.isFinite(t) || t <= 0 ? null : e; } -function _o(e, t) { - let n = go(e.seed); +function jo(e, t) { + let n = Ao(e.seed); if (n !== null) return n; let r = [Array.isArray(e.chained_passes) ? e.chained_passes : [], Array.isArray(e.all_samplers) ? e.all_samplers : []]; for (let e of r) for (let t of e) { - let e = go(t?.seed_val ?? t?.seed); + let e = Ao(t?.seed_val ?? t?.seed); if (e !== null) return e; } for (let e of t || []) { - let t = go(uo(e.fields || [], ["Seed"])?.value); + let t = Ao(To(e.fields || [], ["Seed"])?.value); if (t !== null) return t; } return null; } -function vo(e, t) { - if (!t || !mo(t.value)) return; - let n = `${String(t.label || "").toLowerCase()}::${ho(t.value)}`; - e.some((e) => `${String(e.label || "").toLowerCase()}::${ho(e.value)}` === n) || e.push({ +function Mo(e, t) { + if (!t || !Oo(t.value)) return; + let n = `${String(t.label || "").toLowerCase()}::${ko(t.value)}`; + e.some((e) => `${String(e.label || "").toLowerCase()}::${ko(e.value)}` === n) || e.push({ ...t, - value: ho(t.value) + value: ko(t.value) }); } -function yo(e, t, n, r) { +function No(e, t, n, r) { let i = /* @__PURE__ */ new Map(), a = (e, t) => { - let n = co(e || t || "branch") || "branch"; + let n = Co(e || t || "branch") || "branch"; n.includes("high") && (n = "high"), n.includes("low") && (n = "low"); let r = i.get(n); if (r) return r; let a = { key: n, - label: lo(n, t), - accent: so(n), + label: wo(n, t), + accent: So(n), modelFields: [], samplingFields: [], loras: [] @@ -4524,7 +4576,7 @@ function yo(e, t, n, r) { return i.set(n, a), a; }, o = (e, t, n) => { let r = String(n || "").trim(); - r && (e.modelFields.some((e) => String(e.label || "").toLowerCase() === String(t || "").toLowerCase() && It(e.value) === It(r)) || e.modelFields.push({ + r && (e.modelFields.some((e) => String(e.label || "").toLowerCase() === String(t || "").toLowerCase() && zt(e.value) === zt(r)) || e.modelFields.push({ label: t, value: r })); @@ -4539,7 +4591,7 @@ function yo(e, t, n, r) { } let c = e.models && typeof e.models == "object" ? e.models : null; if (c) { - let t = Q(c.unet), n = po(t), r = Q(c.checkpoint || (n ? null : c.unet) || e.model || e.checkpoint), i = Q(c.unet_high_noise) || (n === "high" ? t : ""), l = Q(c.unet_low_noise) || (n === "low" ? t : ""), u = Q(c.clip), d = Q(c.vae), f = Array.isArray(e.loras) ? e.loras.map((e) => Pt(e)).filter(Boolean) : [], p = !!(i || l), m = !p && (r || u || d || f.length) ? a("base", "Base") : null, h = p && (u || d) ? a("shared", "Shared") : null, g = i ? a("high", "High") : null, _ = l ? a("low", "Low") : null; + let t = Q(c.unet), n = Do(t), r = Q(c.checkpoint || (n ? null : c.unet) || e.model || e.checkpoint), i = Q(c.unet_high_noise) || (n === "high" ? t : ""), l = Q(c.unet_low_noise) || (n === "low" ? t : ""), u = Q(c.clip), d = Q(c.vae), f = Array.isArray(e.loras) ? e.loras.map((e) => Lt(e)).filter(Boolean) : [], p = !!(i || l), m = !p && (r || u || d || f.length) ? a("base", "Base") : null, h = p && (u || d) ? a("shared", "Shared") : null, g = i ? a("high", "High") : null, _ = l ? a("low", "Low") : null; if (m) { r && o(m, e.model || e.checkpoint || c.checkpoint ? "Model" : "UNet", r), u && o(m, "CLIP", u), d && o(m, "VAE", d); for (let e of f) s(m, e); @@ -4547,22 +4599,22 @@ function yo(e, t, n, r) { h && (u && o(h, "CLIP", u), d && o(h, "VAE", d)), g && o(g, "UNet", i), _ && o(_, "UNet", l); } let l = i.get("high") || i.get("high_noise"), u = i.get("low") || i.get("low_noise"), d = [ - uo(n, ["Sampler"]), - uo(n, ["Scheduler"]), - uo(n, ["Steps"]), - uo(n, ["Seed"]) - ].filter(Boolean), f = fo("CFG", e.cfg_high_noise), p = fo("CFG", e.cfg_low_noise); - l && [...d, ...f ? [f] : []].forEach((e) => vo(l.samplingFields, e)), u && [...d, ...p ? [p] : []].forEach((e) => vo(u.samplingFields, e)); - let m = (r || []).some((e) => co(e.label).includes("upscale")), h = (r || []).length === 2 && (r || []).every((e) => ["base", "pass_2"].includes(co(e.label))); + To(n, ["Sampler"]), + To(n, ["Scheduler"]), + To(n, ["Steps"]), + To(n, ["Seed"]) + ].filter(Boolean), f = Eo("CFG", e.cfg_high_noise), p = Eo("CFG", e.cfg_low_noise); + l && [...d, ...f ? [f] : []].forEach((e) => Mo(l.samplingFields, e)), u && [...d, ...p ? [p] : []].forEach((e) => Mo(u.samplingFields, e)); + let m = (r || []).some((e) => Co(e.label).includes("upscale")), h = (r || []).length === 2 && (r || []).every((e) => ["base", "pass_2"].includes(Co(e.label))); for (let [e, t] of (r || []).entries()) { - let n = co(t.label); + let n = Co(t.label); if (!n) continue; - let i = (r || []).filter((e) => co(e.label) === co(t.label)).length, o = co(t.stage), s = o ? (r || []).filter((e) => co(e.stage) === o).length : 0, c = uo(t.fields || [], ["Model"]), d = po(c?.value); + let i = (r || []).filter((e) => Co(e.label) === Co(t.label)).length, o = Co(t.stage), s = o ? (r || []).filter((e) => Co(e.stage) === o).length : 0, c = To(t.fields || [], ["Model"]), d = Do(c?.value); ["high", "low"].includes(n) || (d ? n = d : s > 1 || i > 1 ? n = `pass_${e + 1}` : h ? n = e === 0 ? "high" : "low" : n === "base" && l && u ? n = "high" : ["text_to_image", "image_to_image"].includes(n) && (n = m ? "low" : "base")), n.includes("upscale") && m && (n = "high"); let f = a(n, t.label); if (!/^pass_\d+$/i.test(n) && c && String(c.value || "") !== "-") { - let e = It(c.value); - f.modelFields.some((t) => It(t.value) === e) || f.modelFields.push(c); + let e = zt(c.value); + f.modelFields.some((t) => zt(t.value) === e) || f.modelFields.push(c); } for (let e of t.fields || []) [ "Sampler", @@ -4573,11 +4625,11 @@ function yo(e, t, n, r) { "Seed", "Start", "End" - ].includes(String(e.label || "")) && vo(f.samplingFields, e); + ].includes(String(e.label || "")) && Mo(f.samplingFields, e); } return Array.from(i.values()).filter((e) => e.modelFields.length || e.samplingFields.length || e.loras.length); } -function bo(e, t, n, r) { +function Po(e, t, n, r) { let i = [], a = (e, t, n, r) => { let a = r.filter((e) => e && $(e.value) && String(e.value) !== "-"); a.length && i.push({ @@ -4588,24 +4640,24 @@ function bo(e, t, n, r) { }); }; for (let n of t || []) { - let t = co(n.label), r = (n.fields || []).some((e) => { + let t = Co(n.label), r = (n.fields || []).some((e) => { let t = String(e?.label || "").toLowerCase(), n = String(e?.value || "").toLowerCase(); return t.includes("upscaler") || n.includes("upscale") || n.includes("upscaler") || /(?:^|[_\s-])to[_\s-]?\d{3,5}(?:[_\s.-]|$)/i.test(n); }); t.includes("upscale") && (e.upscaler || r) && a("upscale", "Upscale", "#66BB6A", n.fields || []), (t.includes("interpolation") || t.includes("rife") || t.includes("film")) && a("interpolation", "Interpolation", "#26C6DA", n.fields || []); } a("audio", "MMAudio", "#26A69A", [ - fo("Voice", e.voice), - fo("Language", e.language), - fo("Temperature", e.temperature), - fo("Lyrics Strength", e.lyrics_strength) + Eo("Voice", e.voice), + Eo("Language", e.language), + Eo("Temperature", e.temperature), + Eo("Lyrics Strength", e.lyrics_strength) ].filter(Boolean)), a("interpolation", "Interpolation", "#26C6DA", [ - fo("Engine", e.interpolation_engine || e.frame_interpolation || e.interpolator), - fo("Source FPS", e.source_fps || e.input_fps), - fo("Final FPS", e.final_fps || e.output_fps || e.fps) + Eo("Engine", e.interpolation_engine || e.frame_interpolation || e.interpolator), + Eo("Source FPS", e.source_fps || e.input_fps), + Eo("Final FPS", e.final_fps || e.output_fps || e.fps) ].filter(Boolean)); for (let e of n || []) i.push({ - key: co(e.title) || `module_${i.length}`, + key: Co(e.title) || `module_${i.length}`, title: e.title, accent: e.color || "#2196F3", fields: [{ @@ -4613,32 +4665,32 @@ function bo(e, t, n, r) { value: e.content }] }); - r && !i.some((e) => String(e.title).toLowerCase() === String(r).toLowerCase()) && a("workflow_engine", r, "#2196F3", [fo("Engine", r)].filter(Boolean)); + r && !i.some((e) => String(e.title).toLowerCase() === String(r).toLowerCase()) && a("workflow_engine", r, "#2196F3", [Eo("Engine", r)].filter(Boolean)); let o = /* @__PURE__ */ new Set(); return i.filter((e) => { let t = `${e.key}:${e.title}:${JSON.stringify(e.fields)}`; return !o.has(t) && (o.add(t), !0); }); } -function xo(e) { +function Fo(e) { return new Set(Array.isArray(e.override_fields) ? e.override_fields.map((e) => String(e || "").trim()).filter(Boolean) : []); } -function So(e, ...t) { +function Io(e, ...t) { return t.some((t) => e.has(t)); } -function Co(e) { +function Lo(e) { return Array.isArray(e) ? e.filter((e) => e && typeof e == "object").map((e, t) => ({ title: String(e.title || O("sidebar.generation.customInfoN", "Custom Info {n}", { n: t + 1 })).trim(), content: String(e.content ?? e.value ?? "").trim(), color: /^#[0-9a-fA-F]{6}$/.test(String(e.color || "").trim()) ? String(e.color).trim() : "#2196F3" })).filter((e) => e.content) : []; } -function wo(e) { +function Ro(e) { if (!e || typeof e != "object") return null; let t = [], n = (e, n) => { $(n) && t.push({ label: e, - value: ho(n) + value: ko(n) }); }; n("FPS", e.frame_rate), n("Frames", e.duration_frames), n("Duration", e.duration_seconds), ($(e.width) || $(e.height)) && t.push({ @@ -4647,7 +4699,7 @@ function wo(e) { }); let r = Array.isArray(e.segments) ? e.segments.map((e, t) => { if (!e || typeof e != "object") return null; - let n = Ft(e.prompt || e.text || ""), r = String(e.filename || e.imageFile || e.videoFile || e.audioFile || "").trim(), i = String(e.filepath || e.path || r).trim(), a = String(e.in || e.in_label || e.start || e.start_frame || "").trim(), o = String(e.out || e.out_label || e.end || e.end_frame || "").trim(); + let n = Rt(e.prompt || e.text || ""), r = String(e.filename || e.imageFile || e.videoFile || e.audioFile || "").trim(), i = String(e.filepath || e.path || r).trim(), a = String(e.in || e.in_label || e.start || e.start_frame || "").trim(), o = String(e.out || e.out_label || e.end || e.end_frame || "").trim(); if (!n && !r && !a && !o) return null; let s = String(e.type || "").trim().toLowerCase(), c = s === "video" || /\.(mp4|mov|webm|mkv|avi|m4v)$/i.test(r), l = s === "audio" || /\.(mp3|wav|flac|ogg|m4a|aac|opus)$/i.test(r); return { @@ -4661,14 +4713,14 @@ function wo(e) { type: String(e.type || "").trim(), isVideo: c, isAudio: l, - previewCandidates: r ? Ya({ + previewCandidates: r ? lo({ filename: r, filepath: i, folder_type: String(e.folder_type || e.folderType || "input").trim(), subfolder: String(e.subfolder || "").trim() }) : [] }; - }).filter(Boolean) : [], i = Ft(e.global_prompt || e.globalPrompt || ""); + }).filter(Boolean) : [], i = Rt(e.global_prompt || e.globalPrompt || ""); return !i && !r.length && !t.length ? null : { title: String(e.title || "LTX Director").trim(), globalPrompt: i, @@ -4676,12 +4728,12 @@ function wo(e) { segments: r }; } -function To(e) { +function zo(e) { if (!e || typeof e != "object") return null; - let t = e.payload && typeof e.payload == "object" ? e.payload : e, n = typeof e.json == "string" && e.json.trim() ? e.json.trim() : JSON.stringify(t, null, 2), r = Ft(e.high_level_description || e.highLevelDescription || t.high_level_description || ""), i = Ft(e.background || t.background || ""), a = [], o = (e, t) => { + let t = e.payload && typeof e.payload == "object" ? e.payload : e, n = typeof e.json == "string" && e.json.trim() ? e.json.trim() : JSON.stringify(t, null, 2), r = Rt(e.high_level_description || e.highLevelDescription || t.high_level_description || ""), i = Rt(e.background || t.background || ""), a = [], o = (e, t) => { $(t) && a.push({ label: e, - value: ho(t) + value: ko(t) }); }; o("Style", t.style), o("Photo Style", t.photo_style || t["style.photo"]), o("Medium", t.medium), o("Lighting", t.lighting), o("Aesthetics", t.aesthetics), o("BG Brightness", t.bg_brightness), ($(t.width) || $(t.height)) && a.push({ @@ -4715,8 +4767,8 @@ function To(e) { colorPalette: c.map((e) => String(e || "").trim()).filter(Boolean) }; } -function Eo(e) { - let t = to(e), n = { +function Bo(e) { + let t = go(e), n = { kind: "empty", title: O("sidebar.generation.title", "Generation"), workflowType: "", @@ -4732,7 +4784,7 @@ function Eo(e) { showAlignment: !1, captionLabel: O("sidebar.generation.imageDescription", "Image Description"), emptyCaptionText: O("sidebar.generation.noImageDescription", "No image description yet."), - isImageAsset: Ua(e), + isImageAsset: ro(e), lyrics: "", modelFields: [], modelGroups: [], @@ -4755,26 +4807,26 @@ function Eo(e) { ltxDirector: null, ideogram: null }; - if (!t || typeof t == "object" && Object.keys(t).length === 0 || !no(t)) { + if (!t || typeof t == "object" && Object.keys(t).length === 0 || !_o(t)) { let t = e?.metadata_raw?.geninfo_status || e?.geninfo_status; return t && typeof t == "object" && t.kind === "media_pipeline" ? { ...n, kind: "media-only", mediaOnlyMessage: O("sidebar.generation.mediaOnlyPipeline", "This file looks like a media-only pipeline (e.g. LoadVideo/VideoCombine) and does not contain generation parameters.") - } : Ua(e) || Wa(e) ? { + } : ro(e) || io(e) ? { ...n, kind: "caption-only", showAlignment: !1 } : n; } - let r = t, i = wo(r.ltx_director), a = To(r.ideogram), o = xo(r), s = r.engine && typeof r.engine == "object" ? r.engine : null, c = !!(r.is_override || s?.mode === "override" || s?.parser_version === "geninfo-override-v1" || s?.source === "majoor_geninfo"), l = Lt(r), u = Mt(typeof r.prompt == "string" ? r.prompt : null, typeof (r.negative_prompt || r.negativePrompt) == "string" ? r.negative_prompt || r.negativePrompt : null), d = Array.isArray(r.all_positive_prompts) && r.all_positive_prompts.length > 1 ? r.all_positive_prompts.map((e, t) => { - let n = Mt(typeof e == "string" ? e : "", typeof r.all_negative_prompts?.[t] == "string" ? r.all_negative_prompts[t] : ""); + let r = t, i = Ro(r.ltx_director), a = zo(r.ideogram), o = Fo(r), s = r.engine && typeof r.engine == "object" ? r.engine : null, c = !!(r.is_override || s?.mode === "override" || s?.parser_version === "geninfo-override-v1" || s?.source === "majoor_geninfo"), l = Bt(r), u = Ft(typeof r.prompt == "string" ? r.prompt : null, typeof (r.negative_prompt || r.negativePrompt) == "string" ? r.negative_prompt || r.negativePrompt : null), d = Array.isArray(r.all_positive_prompts) && r.all_positive_prompts.length > 1 ? r.all_positive_prompts.map((e, t) => { + let n = Ft(typeof e == "string" ? e : "", typeof r.all_negative_prompts?.[t] == "string" ? r.all_negative_prompts[t] : ""); return { label: O("sidebar.generation.promptN", "Prompt {n}", { n: t + 1 }), - positive: Ft(n.positive), - negative: Ft(n.negative) + positive: Rt(n.positive), + negative: Rt(n.negative) }; - }).filter((e) => e.positive) : [], f = [], p = /* @__PURE__ */ new Set(), m = r.models && typeof r.models == "object" ? r.models : null, h = ao(r), g = new Set(h.map((e) => String(e.model || "").trim()).filter(Boolean)), _ = Array.isArray(r.all_checkpoints) && r.all_checkpoints.length > 1 ? r.all_checkpoints : null; + }).filter((e) => e.positive) : [], f = [], p = /* @__PURE__ */ new Set(), m = r.models && typeof r.models == "object" ? r.models : null, h = bo(r), g = new Set(h.map((e) => String(e.model || "").trim()).filter(Boolean)), _ = Array.isArray(r.all_checkpoints) && r.all_checkpoints.length > 1 ? r.all_checkpoints : null; if (m) { let e = new Set([ Q(m.unet_high_noise), @@ -4783,11 +4835,11 @@ function Eo(e) { ].filter(Boolean)); if (_) _.forEach((e, t) => { let n = Q(e); - ro(f, p, O("sidebar.generation.checkpointN", "Checkpoint {n}", { n: t + 1 }), n); + vo(f, p, O("sidebar.generation.checkpointN", "Checkpoint {n}", { n: t + 1 }), n); }); else { let t = Q(m.checkpoint); - t && !e.has(t) && ro(f, p, O("sidebar.generation.checkpoint", "Checkpoint"), t); + t && !e.has(t) && vo(f, p, O("sidebar.generation.checkpoint", "Checkpoint"), t); } [ ["UNet", Q(m.unet)], @@ -4796,37 +4848,37 @@ function Eo(e) { ["CLIP", Q(m.clip)], ["VAE", Q(m.vae)] ].forEach(([t, n]) => { - e.has(n) || ro(f, p, t, n); + e.has(n) || vo(f, p, t, n); }); - } else (r.model || r.checkpoint) && ro(f, p, O("sidebar.generation.model", "Model"), It(r.model || r.checkpoint)); + } else (r.model || r.checkpoint) && vo(f, p, O("sidebar.generation.model", "Model"), zt(r.model || r.checkpoint)); if (Array.isArray(r.loras) && r.loras.length > 0) { - let e = r.loras.map((e) => Pt(e)).filter(Boolean).join("\n"); - e && ro(f, p, r.loras.length > 1 ? O("sidebar.generation.loras", "LoRAs") : "LoRA", e); + let e = r.loras.map((e) => Lt(e)).filter(Boolean).join("\n"); + e && vo(f, p, r.loras.length > 1 ? O("sidebar.generation.loras", "LoRAs") : "LoRA", e); } - !m && r.clip && ro(f, p, "CLIP", It(r.clip)), !m && r.vae && ro(f, p, "VAE", It(r.vae)), !m && r.unet && ro(f, p, "UNet", It(r.unet)), !m && r.diffusion && ro(f, p, "Diffusion", It(r.diffusion)), !m && r.upscaler && ro(f, p, O("sidebar.generation.upscaler", "Upscaler"), It(r.upscaler)), m && r.clip && ro(f, p, "CLIP", It(r.clip)), m && r.vae && ro(f, p, "VAE", It(r.vae)); + !m && r.clip && vo(f, p, "CLIP", zt(r.clip)), !m && r.vae && vo(f, p, "VAE", zt(r.vae)), !m && r.unet && vo(f, p, "UNet", zt(r.unet)), !m && r.diffusion && vo(f, p, "Diffusion", zt(r.diffusion)), !m && r.upscaler && vo(f, p, O("sidebar.generation.upscaler", "Upscaler"), zt(r.upscaler)), m && r.clip && vo(f, p, "CLIP", zt(r.clip)), m && r.vae && vo(f, p, "VAE", zt(r.vae)); for (let e of f) { let t = String(e.label || "").toLowerCase(); - (t.includes("checkpoint") || t === "model") && (e.override = So(o, "checkpoint", "model")), t === "clip" && (e.override = So(o, "clip")), t === "vae" && (e.override = So(o, "vae")), t.includes("lora") && (e.override = So(o, "loras")); + (t.includes("checkpoint") || t === "model") && (e.override = Io(o, "checkpoint", "model")), t === "clip" && (e.override = Io(o, "clip")), t === "vae" && (e.override = Io(o, "vae")), t.includes("lora") && (e.override = Io(o, "loras")); } let v = []; $(r.seed) && v.push({ label: O("sidebar.generation.seed", "Seed"), value: r.seed, - override: So(o, "seed") + override: Io(o, "seed") }), (r.sampler || r.sampler_name) && v.push({ label: O("sidebar.generation.sampler", "Sampler"), value: r.sampler || r.sampler_name, - override: So(o, "sampler", "sampler_name") + override: Io(o, "sampler", "sampler_name") }), $(r.steps) && v.push({ label: O("sidebar.generation.steps", "Steps"), value: r.steps, - override: So(o, "steps") + override: Io(o, "steps") }); let y = $(r.cfg) ? r.cfg : r.cfg_scale; $(y) && v.push({ label: O("sidebar.generation.cfgScale", "CFG Scale"), value: y, - override: So(o, "cfg", "cfg_scale") + override: Io(o, "cfg", "cfg_scale") }), r.cfg_high_noise !== void 0 && r.cfg_high_noise !== null && v.push({ label: O("sidebar.generation.cfgHighNoise", "CFG High Noise"), value: r.cfg_high_noise @@ -4836,17 +4888,17 @@ function Eo(e) { }), r.scheduler && v.push({ label: O("sidebar.generation.scheduler", "Scheduler"), value: r.scheduler, - override: So(o, "scheduler") + override: Io(o, "scheduler") }); let b = $(r.denoise) ? r.denoise : r.denoising; $(b) && v.push({ label: O("sidebar.generation.denoise", "Denoise"), value: b, - override: So(o, "denoise", "denoising") + override: Io(o, "denoise", "denoising") }); let x = []; Array.isArray(r.chained_passes) && r.chained_passes.length > 1 ? x = r.chained_passes.filter((e) => e && typeof e == "object").map((e, t) => ({ - label: Qa(e, t), + label: po(e, t), stage: String(e?.pass_stage || "").trim(), fields: [ { @@ -4887,7 +4939,7 @@ function Eo(e) { } ] })) : Array.isArray(r.all_samplers) && r.all_samplers.length > 1 && (x = r.all_samplers.filter((e) => e && typeof e == "object").map((e, t) => ({ - label: Qa(e, t), + label: po(e, t), stage: String(e?.pass_stage || "").trim(), fields: [ { @@ -4968,13 +5020,13 @@ function Eo(e) { label: O("sidebar.generation.compileMode", "Compile Mode"), value: r.compile_mode }), [ - oo(O("sidebar.generation.torchCompile", "Torch Compile"), r.use_torch_compile), - oo(O("sidebar.generation.cudaGraphs", "CUDA Graphs"), r.use_cuda_graphs), - oo(O("sidebar.generation.xVectorOnly", "X-Vector Only"), r.x_vector_only_mode) + xo(O("sidebar.generation.torchCompile", "Torch Compile"), r.use_torch_compile), + xo(O("sidebar.generation.cudaGraphs", "CUDA Graphs"), r.use_cuda_graphs), + xo(O("sidebar.generation.xVectorOnly", "X-Vector Only"), r.x_vector_only_mode) ].filter(Boolean).forEach((e) => C.push(e)); let ee = []; [ - oo(O("sidebar.generation.chunking", "Chunking"), r.enable_chunking), + xo(O("sidebar.generation.chunking", "Chunking"), r.enable_chunking), r.max_chars_per_chunk !== void 0 && r.max_chars_per_chunk !== null ? { label: O("sidebar.generation.maxCharsChunk", "Max Chars/Chunk"), value: r.max_chars_per_chunk @@ -4987,7 +5039,7 @@ function Eo(e) { label: O("sidebar.generation.silenceBetweenChunks", "Silence Between Chunks (ms)"), value: r.silence_between_chunks_ms } : null, - oo(O("sidebar.generation.audioCache", "Audio Cache"), r.enable_audio_cache), + xo(O("sidebar.generation.audioCache", "Audio Cache"), r.enable_audio_cache), r.batch_size !== void 0 && r.batch_size !== null ? { label: O("sidebar.generation.batchSize", "Batch Size"), value: r.batch_size @@ -5010,21 +5062,21 @@ function Eo(e) { T && w.push({ label: O("sidebar.generation.workflowNotes", "Workflow Notes"), value: T, - override: So(o, "workflow_notes", "notes") + override: Io(o, "workflow_notes", "notes") }); - let E = Co(r.custom_info), re = yo(r, h, v, x), D = bo(r, x, E, l.workflowType), ie = _o(r, x), ae = Array.isArray(r.inputs) ? r.inputs.filter((e) => e && typeof e == "object" && e.filename).map((e, t) => ({ + let E = Lo(r.custom_info), re = No(r, h, v, x), D = Po(r, x, E, l.workflowType), ie = jo(r, x), ae = Array.isArray(r.inputs) ? r.inputs.filter((e) => e && typeof e == "object" && e.filename).map((e, t) => ({ id: `${e.filename}-${t}`, filename: String(e.filename || "").trim(), subfolder: String(e.subfolder || "").trim(), type: String(e.folder_type || "input").trim().toLowerCase(), root_id: String(e.root_id || e.rootId || "").trim(), kind: String(e.kind || e.media_kind || e.type || "").trim().toLowerCase(), - filepath: Xa(e), + filepath: uo(e), role: String(e.role || "").trim(), roleLabel: String(e.role || "").trim().replace(/_/g, " "), isVideo: String(e.type || "").toLowerCase() === "video" || /\.(mp4|mov|webm)$/i.test(String(e.filename || "")), isAudio: String(e.type || "").toLowerCase() === "audio" || /\.(wav|mp3|flac|ogg|m4a|aac|opus)$/i.test(String(e.filename || "")), - previewCandidates: Ya(e) + previewCandidates: lo(e) })) : []; return { ...n, @@ -5036,11 +5088,11 @@ function Eo(e) { isTruncated: !!(e?.geninfo?._truncated || e?.metadata?._truncated || e?.prompt?._truncated), positivePrompt: d.length || a ? "" : String(u.positive || "").trim(), negativePrompt: d.length ? "" : String(u.negative || "").trim(), - positivePromptOverride: So(o, "prompt", "positive", "positive_prompt"), - negativePromptOverride: So(o, "negative_prompt", "negative", "negativePrompt"), + positivePromptOverride: Io(o, "prompt", "positive", "positive_prompt"), + negativePromptOverride: Io(o, "negative_prompt", "negative", "negativePrompt"), promptTabs: d, showAlignment: !!e?.id && (!!String(u.positive || "").trim() || d.length > 0), - isImageAsset: Ua(e), + isImageAsset: ro(e), lyrics: String(r.lyrics || "").trim(), modelFields: f, modelGroups: h, @@ -5065,7 +5117,7 @@ function Eo(e) { }; } // ui/vue/components/panel/sidebar/GenerationInputThumb.vue?vue&type=script&setup=true&lang.ts -var Do = ["title"], Oo = ["src"], ko = { +var Vo = ["title"], Ho = ["src"], Uo = { key: 1, style: { width: "100%", @@ -5080,14 +5132,14 @@ var Do = ["title"], Oo = ["src"], ko = { padding: "6px", "text-align": "center" } -}, Ao = { style: { +}, Wo = { style: { "font-size": "8px", "font-weight": "700", "max-width": "54px", "white-space": "nowrap", overflow: "hidden", "text-overflow": "ellipsis" -} }, jo = ["src"], Mo = { +} }, Go = ["src"], Ko = { key: 3, style: { position: "absolute", @@ -5103,7 +5155,7 @@ var Do = ["title"], Oo = ["src"], ko = { overflow: "hidden", "text-overflow": "ellipsis" } -}, No = { +}, qo = { key: 4, title: "Video file", style: { @@ -5113,13 +5165,13 @@ var Do = ["title"], Oo = ["src"], ko = { "font-size": "16px", "pointer-events": "none" } -}, Po = /* @__PURE__ */ rt({ +}, Jo = /* @__PURE__ */ ot({ __name: "GenerationInputThumb", props: { inputFile: {} }, setup(e) { let n = e, r = V(0), i = V(!1), a = null; function o() { - return a ||= import("./floatingViewerManager-DKOeP6-T.js").then((e) => e.n), a; + return a ||= import("./floatingViewerManager-Gv7MTmpu.js").then((e) => e.n), a; } function s() { return (Array.isArray(n.inputFile?.previewCandidates) ? n.inputFile.previewCandidates : [])[r.value] || ""; @@ -5184,16 +5236,16 @@ var Do = ["title"], Oo = ["src"], ko = { }; } function h() { - return Za(s()) || !!n.inputFile?.filename || !!n.inputFile?.filepath; + return fo(s()) || !!n.inputFile?.filename || !!n.inputFile?.filepath; } function g() { let e = d(); - if (jt({ + if (Pt({ asset: e, index: 0 })) return; let t = s(); - if (Za(t)) try { + if (fo(t)) try { window.open(t, "_blank", "noopener,noreferrer"); } catch (e) { console.debug?.(e); @@ -5221,14 +5273,14 @@ var Do = ["title"], Oo = ["src"], ko = { type: e.type || "input", root_id: e.root_id || void 0, kind: e.kind - }, r = await zi({ + }, r = await $i({ post: ge, - endpoint: Be.STAGE_TO_INPUT, + endpoint: Ue.STAGE_TO_INPUT, payload: n, index: !1 }); - if (!r?.relativePath || !Fi({ - app: Ie(), + if (!r?.relativePath || !Yi({ + app: Be(), items: [{ payload: n, relativePath: r.relativePath, @@ -5245,7 +5297,7 @@ var Do = ["title"], Oo = ["src"], ko = { function b(e) { e?.preventDefault?.(), e?.stopPropagation?.(); let t = f(), r = t === "video" ? O("ctx.loadVideo", "Load video") : t === "audio" ? O("ctx.loadAudio", "Load audio") : t === "model3d" ? O("ctx.loadModel3d", "Load 3D model") : O("ctx.loadImage", "Load image"); - Or({ + Hr({ x: e?.clientX || 0, y: e?.clientY || 0, items: [ @@ -5305,10 +5357,10 @@ var Do = ["title"], Oo = ["src"], ko = { onError: c, onMouseover: x, onMouseout: S - }, null, 40, Oo)) : C() ? (I(), z("div", ko, [n[0] ||= M("div", { style: { + }, null, 40, Ho)) : C() ? (I(), z("div", Uo, [n[0] ||= M("div", { style: { "font-size": "18px", "line-height": "1" - } }, "♪", -1), M("div", Ao, R(e.inputFile.filename), 1)])) : (I(), z("img", { + } }, "♪", -1), M("div", Wo, R(e.inputFile.filename), 1)])) : (I(), z("img", { key: 2, src: s(), style: { @@ -5317,16 +5369,16 @@ var Do = ["title"], Oo = ["src"], ko = { "object-fit": "cover" }, onError: c - }, null, 40, jo)), e.inputFile.role && e.inputFile.role !== "secondary" ? (I(), z("div", Mo, R(e.inputFile.roleLabel), 1)) : e.inputFile.isVideo ? (I(), z("div", No, " Play ")) : N("", !0)], 44, Do)); + }, null, 40, Go)), e.inputFile.role && e.inputFile.role !== "secondary" ? (I(), z("div", Ko, R(e.inputFile.roleLabel), 1)) : e.inputFile.isVideo ? (I(), z("div", qo, " Play ")) : N("", !0)], 44, Vo)); } -}), Fo = { +}), Yo = { key: 0, style: { display: "flex", "flex-direction": "column", gap: "12px" } -}, Io = { +}, Xo = { key: 0, style: { display: "flex", @@ -5341,66 +5393,66 @@ var Do = ["title"], Oo = ["src"], ko = { fontSize: "11px", color: "var(--fg-color, #ccc)" } -}, Lo = { style: { opacity: "0.85" } }, Ro = { style: { +}, Zo = { style: { opacity: "0.85" } }, Qo = { style: { display: "flex", "align-items": "center", gap: "8px", "flex-wrap": "wrap", "justify-content": "flex-end" -} }, zo = ["title"], Bo = ["title"], Vo = { style: { +} }, $o = ["title"], es = ["title"], ts = { style: { display: "flex", "align-items": "center", "justify-content": "space-between", gap: "10px" -} }, Ho = { style: { +} }, ns = { style: { "font-size": "11px", "font-weight": "700", color: "#00BCD4", "text-transform": "uppercase", "letter-spacing": "0.6px" -} }, Uo = { style: { +} }, rs = { style: { "font-size": "11px", color: "var(--fg-color, rgba(255,255,255,0.9))", "font-weight": "600" -} }, Wo = { style: { +} }, is = { style: { "font-size": "11px", "font-weight": "600", color: "#FF9800", "text-transform": "uppercase", "letter-spacing": "0.5px", "margin-bottom": "8px" -} }, Go = { style: { +} }, as = { style: { "font-size": "12px", color: "var(--fg-color, rgba(255,255,255,0.9))", "line-height": "1.5", "white-space": "pre-wrap", "word-break": "break-word" -} }, Ko = { style: { +} }, os = { style: { "font-size": "11px", "font-weight": "600", color: "#9E9E9E", "text-transform": "uppercase", "letter-spacing": "0.5px", "margin-bottom": "8px" -} }, qo = { style: { +} }, ss = { style: { "font-size": "12px", color: "var(--fg-color, rgba(255,255,255,0.9))", "line-height": "1.5", "white-space": "pre-wrap", "word-break": "break-word" -} }, Jo = { style: { +} }, cs = { style: { display: "flex", "align-items": "center", "justify-content": "space-between", gap: "8px", "margin-bottom": "10px" -} }, Yo = { style: { +} }, ls = { style: { "font-size": "11px", "font-weight": "800", color: "#26C6DA", "text-transform": "uppercase", "letter-spacing": "0.5px" -} }, Xo = { +} }, us = { key: 0, style: { display: "grid", @@ -5408,18 +5460,18 @@ var Do = ["title"], Oo = ["src"], ko = { gap: "8px", "margin-bottom": "10px" } -}, Zo = { style: { +}, ds = { style: { "font-size": "9px", "font-weight": "800", color: "rgba(255,255,255,0.55)", "text-transform": "uppercase", "letter-spacing": "0.4px" -} }, Qo = { style: { +} }, fs = { style: { "font-size": "12px", color: "var(--fg-color,#eee)", "font-weight": "650", "word-break": "break-word" -} }, $o = { +} }, ps = { key: 1, style: { border: "1px solid rgba(76,175,80,0.36)", @@ -5428,32 +5480,32 @@ var Do = ["title"], Oo = ["src"], ko = { padding: "10px", "margin-bottom": "10px" } -}, es = ["title"], ts = { +}, ms = ["title"], hs = { key: 2, style: { display: "flex", "flex-direction": "column", gap: "8px" } -}, ns = { style: { +}, gs = { style: { display: "flex", "align-items": "center", "justify-content": "space-between", gap: "8px", "margin-bottom": "7px" -} }, rs = { style: { +} }, _s = { style: { "font-size": "10px", "font-weight": "800", color: "#26C6DA", "text-transform": "uppercase", "letter-spacing": "0.45px" -} }, is = { style: { +} }, vs = { style: { display: "flex", "align-items": "center", gap: "5px", "flex-wrap": "wrap", "justify-content": "flex-end" -} }, as = { +} }, ys = { key: 0, style: { "font-size": "10px", @@ -5464,7 +5516,7 @@ var Do = ["title"], Oo = ["src"], ko = { padding: "2px 6px", "font-weight": "700" } -}, os = { +}, bs = { key: 1, style: { "font-size": "10px", @@ -5475,15 +5527,15 @@ var Do = ["title"], Oo = ["src"], ko = { padding: "2px 6px", "font-weight": "700" } -}, ss = { style: { +}, xs = { style: { display: "flex", gap: "10px", "align-items": "flex-start", "min-width": "0" -} }, cs = { style: { +} }, Ss = { style: { "min-width": "0", flex: "1" -} }, ls = ["title", "onClick"], us = { +} }, Cs = ["title", "onClick"], ws = { key: 1, style: { "font-size": "10px", @@ -5493,19 +5545,19 @@ var Do = ["title"], Oo = ["src"], ko = { gap: "6px", "flex-wrap": "wrap" } -}, ds = { key: 0 }, fs = { key: 1 }, ps = { style: { +}, Ts = { key: 0 }, Es = { key: 1 }, Ds = { style: { display: "flex", "align-items": "center", "justify-content": "space-between", gap: "8px", "margin-bottom": "10px" -} }, ms = { style: { +} }, Os = { style: { "font-size": "11px", "font-weight": "800", color: "#FFB300", "text-transform": "uppercase", "letter-spacing": "0.5px" -} }, hs = { +} }, ks = { key: 0, style: { display: "grid", @@ -5513,18 +5565,18 @@ var Do = ["title"], Oo = ["src"], ko = { gap: "8px", "margin-bottom": "10px" } -}, gs = { style: { +}, As = { style: { "font-size": "9px", "font-weight": "800", color: "rgba(255,255,255,0.55)", "text-transform": "uppercase", "letter-spacing": "0.4px" -} }, _s = { style: { +} }, js = { style: { "font-size": "12px", color: "var(--fg-color,#eee)", "font-weight": "650", "word-break": "break-word" -} }, vs = { +} }, Ms = { key: 1, style: { border: "1px solid rgba(76,175,80,0.34)", @@ -5533,7 +5585,7 @@ var Do = ["title"], Oo = ["src"], ko = { padding: "10px", "margin-bottom": "10px" } -}, ys = ["title"], bs = { +}, Ns = ["title"], Ps = { key: 2, style: { border: "1px solid rgba(33,150,243,0.32)", @@ -5542,7 +5594,7 @@ var Do = ["title"], Oo = ["src"], ko = { padding: "10px", "margin-bottom": "10px" } -}, xs = ["title"], Ss = { +}, Fs = ["title"], Is = { key: 3, style: { display: "flex", @@ -5550,19 +5602,19 @@ var Do = ["title"], Oo = ["src"], ko = { gap: "8px", "margin-bottom": "10px" } -}, Cs = { style: { +}, Ls = { style: { display: "flex", "align-items": "center", "justify-content": "space-between", gap: "8px", "margin-bottom": "7px" -} }, ws = { style: { +} }, Rs = { style: { "font-size": "10px", "font-weight": "800", color: "#FFCA28", "text-transform": "uppercase", "letter-spacing": "0.45px" -} }, Ts = { +} }, zs = { key: 0, style: { "font-size": "10px", @@ -5573,7 +5625,7 @@ var Do = ["title"], Oo = ["src"], ko = { padding: "2px 6px", "font-weight": "700" } -}, Es = ["title", "onClick"], Ds = { +}, Bs = ["title", "onClick"], Vs = { key: 1, style: { display: "flex", @@ -5581,35 +5633,35 @@ var Do = ["title"], Oo = ["src"], ko = { gap: "5px", "margin-top": "8px" } -}, Os = ["title", "onClick"], ks = { style: { +}, Hs = ["title", "onClick"], Us = { style: { border: "1px solid rgba(255,179,0,0.30)", "border-radius": "6px", background: "rgba(0,0,0,0.16)", overflow: "hidden" -} }, As = ["title"], js = { style: { +} }, Ws = ["title"], Gs = { style: { "font-size": "11px", "font-weight": "600", color: "#4CAF50", "text-transform": "uppercase", "letter-spacing": "0.5px", "margin-bottom": "10px" -} }, Ms = { style: { +} }, Ks = { style: { display: "flex", "flex-wrap": "wrap", gap: "6px", "margin-bottom": "10px" -} }, Ns = { style: { +} }, qs = { style: { "font-size": "10px", "font-weight": "700", color: "#4CAF50", "letter-spacing": "0.4px" -} }, Ps = ["onClick"], Fs = { style: { +} }, Js = ["onClick"], Ys = { style: { "font-size": "10px", "font-weight": "700", color: "#F44336", "letter-spacing": "0.4px", "margin-top": "4px" -} }, Is = ["onClick"], Ls = { style: { +} }, Xs = ["onClick"], Zs = { style: { display: "flex", "justify-content": "space-between", "align-items": "center", @@ -5619,7 +5671,7 @@ var Do = ["title"], Oo = ["src"], ko = { "text-transform": "uppercase", "letter-spacing": "0.5px", "margin-bottom": "8px" -} }, Rs = ["title"], zs = ["title"], Bs = { style: { +} }, Qs = ["title"], $s = ["title"], ec = { style: { display: "flex", "justify-content": "space-between", "align-items": "center", @@ -5629,7 +5681,7 @@ var Do = ["title"], Oo = ["src"], ko = { "text-transform": "uppercase", "letter-spacing": "0.5px", "margin-bottom": "8px" -} }, Vs = ["title"], Hs = ["title"], Us = { style: { +} }, tc = ["title"], nc = ["title"], rc = { style: { "font-size": "11px", "font-weight": "600", color: "#00BCD4", @@ -5638,17 +5690,17 @@ var Do = ["title"], Oo = ["src"], ko = { display: "flex", "align-items": "center", "justify-content": "space-between" -} }, Ws = ["title"], Gs = { style: { +} }, ic = ["title"], ac = { style: { display: "flex", "align-items": "center", gap: "10px" -} }, Ks = { style: { +} }, oc = { style: { flex: "1", height: "8px", background: "rgba(255,255,255,0.1)", "border-radius": "4px", overflow: "hidden" -} }, qs = { +} }, sc = { key: 0, style: { "font-size": "10px", @@ -5658,7 +5710,7 @@ var Do = ["title"], Oo = ["src"], ko = { padding: "6px 8px", background: "rgba(255,255,255,0.04)" } -}, Js = { style: { +}, cc = { style: { "font-size": "10px", "font-weight": "600", color: "rgba(0, 188, 212, 0.75)", @@ -5669,35 +5721,35 @@ var Do = ["title"], Oo = ["src"], ko = { "align-items": "center", "justify-content": "space-between", gap: "8px" -} }, Ys = ["title"], Xs = { style: { +} }, lc = ["title"], uc = { style: { display: "flex", "align-items": "center", gap: "6px" -} }, Zs = ["title"], Qs = { style: { +} }, dc = ["title"], fc = { style: { "font-size": "11px", "font-weight": "600", color: "#9C27B0", "text-transform": "uppercase", "letter-spacing": "0.5px", "margin-bottom": "10px" -} }, $s = { style: { +} }, pc = { style: { display: "grid", "grid-template-columns": "repeat(auto-fit, minmax(190px, 1fr))", gap: "10px" -} }, ec = { style: { +} }, mc = { style: { "font-size": "10px", "font-weight": "700", color: "rgba(255,255,255,0.58)", "text-transform": "uppercase", "letter-spacing": "0.4px" -} }, tc = ["onClick"], nc = { +} }, hc = ["onClick"], gc = { key: 0, style: { display: "flex", "flex-direction": "column", gap: "5px" } -}, rc = ["onClick"], ic = { style: { +}, _c = ["onClick"], vc = { style: { display: "flex", "justify-content": "space-between", "align-items": "center", @@ -5707,90 +5759,90 @@ var Do = ["title"], Oo = ["src"], ko = { "text-transform": "uppercase", "letter-spacing": "0.5px", "margin-bottom": "8px" -} }, ac = { style: { +} }, yc = { style: { "font-size": "12px", color: "var(--fg-color, rgba(255,255,255,0.9))", "line-height": "1.5", "white-space": "pre-wrap", "word-break": "break-word" -} }, oc = { style: { +} }, bc = { style: { "font-size": "11px", "font-weight": "600", color: "#FF9800", "text-transform": "uppercase", "letter-spacing": "0.5px", "margin-bottom": "10px" -} }, sc = { style: { +} }, xc = { style: { display: "grid", "grid-template-columns": "repeat(auto-fit, minmax(130px, 1fr))", gap: "8px" -} }, cc = ["onClick"], lc = { style: { +} }, Sc = ["onClick"], Cc = { style: { "font-size": "11px", "font-weight": "600", color: "#9C27B0", "text-transform": "uppercase", "letter-spacing": "0.5px", "margin-bottom": "10px" -} }, uc = { style: { +} }, wc = { style: { display: "grid", "grid-template-columns": "repeat(auto-fit, minmax(220px, 1fr))", gap: "10px" -} }, dc = { style: { +} }, Tc = { style: { display: "flex", "align-items": "center", "justify-content": "space-between", gap: "10px" -} }, fc = { style: { +} }, Ec = { style: { display: "flex", "flex-direction": "column", gap: "4px" -} }, pc = ["onClick"], mc = { +} }, Dc = ["onClick"], Oc = { key: 0, style: { display: "flex", "flex-direction": "column", gap: "6px" } -}, hc = { style: { +}, kc = { style: { "font-size": "10px", "font-weight": "700", color: "rgba(255,255,255,0.58)", "text-transform": "uppercase", "letter-spacing": "0.4px" -} }, gc = { style: { +} }, Ac = { style: { display: "flex", "flex-direction": "column", gap: "5px" -} }, _c = ["onClick"], vc = { style: { +} }, jc = ["onClick"], Mc = { style: { display: "grid", "grid-template-columns": "auto 1fr", gap: "8px 12px", "align-items": "start" -} }, yc = ["title"], bc = ["title"], xc = ["title", "onClick"], Sc = { style: { +} }, Nc = ["title"], Pc = ["title"], Fc = ["title", "onClick"], Ic = { style: { "font-size": "11px", "font-weight": "600", color: "#4CAF50", "text-transform": "uppercase", "letter-spacing": "0.5px", "margin-bottom": "10px" -} }, Cc = ["title", "onClick"], wc = { style: { +} }, Lc = ["title", "onClick"], Rc = { style: { "font-size": "11px", "font-weight": "600", color: "#26C6DA", "text-transform": "uppercase", "letter-spacing": "0.5px", "margin-bottom": "10px" -} }, Tc = { style: { +} }, zc = { style: { display: "grid", "grid-template-columns": "repeat(auto-fit, minmax(190px, 1fr))", gap: "10px" -} }, Ec = { style: { +} }, Bc = { style: { "font-size": "10px", "font-weight": "700", color: "rgba(255,255,255,0.58)", "text-transform": "uppercase", "letter-spacing": "0.4px" -} }, Dc = ["title", "onClick"], Oc = { style: { +} }, Vc = ["title", "onClick"], Hc = { style: { display: "flex", "justify-content": "space-between", "align-items": "center", @@ -5800,17 +5852,17 @@ var Do = ["title"], Oo = ["src"], ko = { "text-transform": "uppercase", "letter-spacing": "0.5px", "margin-bottom": "8px" -} }, kc = ["title"], Ac = { style: { +} }, Uc = ["title"], Wc = { style: { "font-size": "11px", "font-weight": "700", color: "#E91E63", "text-transform": "uppercase", "letter-spacing": "1px" -} }, jc = ["title"], Mc = ["title"], Nc = { style: { +} }, Gc = ["title"], Kc = ["title"], qc = { style: { display: "flex", gap: "8px", "flex-wrap": "wrap" -} }, Pc = /* @__PURE__ */ rt({ +} }, Jc = /* @__PURE__ */ ot({ __name: "SidebarGenerationSection", props: { asset: {} }, setup(e) { @@ -5871,10 +5923,10 @@ var Do = ["title"], Oo = ["src"], ko = { whiteSpace: "nowrap" }; } - let _ = P(() => Eo(t.asset)), v = P(() => Ga()), y = P(() => _.value.kind === "full" || _.value.kind === "caption-only"), b = P(() => Ja(i.value) || _.value.emptyCaptionText), x = P(() => v.value && _.value.isImageAsset && !!t.asset?.id), S = P(() => v.value && !!Ja(b.value) && b.value !== _.value.emptyCaptionText), C = P(() => _.value.branchCards.filter((e) => e.modelFields.length || e.loras.length)), ee = P(() => _.value.branchCards.filter((e) => e.samplingFields.length)); + let _ = P(() => Bo(t.asset)), v = P(() => ao()), y = P(() => _.value.kind === "full" || _.value.kind === "caption-only"), b = P(() => co(i.value) || _.value.emptyCaptionText), x = P(() => v.value && _.value.isImageAsset && !!t.asset?.id), S = P(() => v.value && !!co(b.value) && b.value !== _.value.emptyCaptionText), C = P(() => _.value.branchCards.filter((e) => e.modelFields.length || e.loras.length)), ee = P(() => _.value.branchCards.filter((e) => e.samplingFields.length)); P(() => _.value.branchCards.filter((e) => e.loras.length)); let te = P(() => { - let e = [], t = (e, t) => Fa(e)?.title || t; + let e = [], t = (e, t) => Ya(e)?.title || t; return !C.value.length && _.value.modelFields.length && e.push({ key: "model", title: t("model", O("sidebar.generation.modelLora", "Model & LoRA")), @@ -6001,11 +6053,11 @@ var Do = ["title"], Oo = ["src"], ko = { }; return; } - let i = Math.round(r * 100), a = Ka(r); + let i = Math.round(r * 100), a = oo(r); l.value = { scoreText: `${i}%`, scoreColor: a, - qualityText: qa(r), + qualityText: so(r), qualityColor: a, qualityBackground: `${a}33`, fillWidth: `${i}%`, @@ -6051,9 +6103,9 @@ var Do = ["title"], Oo = ["src"], ko = { console.debug?.(e); } } - return nt(() => t.asset, () => { + return at(() => t.asset, () => { n.value = 0, r.value = 0, i.value = String(t.asset?.enhanced_caption || "").trim(), a.value = O("action.copy", "Copy"), o.value = O("action.generate", "Generate"); - }, { immediate: !0 }), nt(() => [ + }, { immediate: !0 }), at(() => [ t.asset?.id, _.value.kind, _.value.showAlignment, @@ -6061,9 +6113,9 @@ var Do = ["title"], Oo = ["src"], ko = { ], () => { oe(); }, { immediate: !0 }), (e, t) => { - let r = et("MButton"); - return _.value.kind === "empty" ? N("", !0) : (I(), z("div", Fo, [ - _.value.workflowType ? (I(), z("div", Io, [M("span", Lo, R(B(O)("viewer.workflow", "Workflow")), 1), M("div", Ro, [M("span", { + let r = rt("MButton"); + return _.value.kind === "empty" ? N("", !0) : (I(), z("div", Yo, [ + _.value.workflowType ? (I(), z("div", Xo, [M("span", Zo, R(B(O)("viewer.workflow", "Workflow")), 1), M("div", Qo, [M("span", { title: B(O)("sidebar.generation.workflowEngine", "Workflow engine: {value}", { value: _.value.workflowType }), style: { background: "#2196F3", @@ -6074,7 +6126,7 @@ var Do = ["title"], Oo = ["src"], ko = { "font-size": "10px", "letter-spacing": "0.2px" } - }, R(_.value.workflowLabel || _.value.workflowType), 9, zo), _.value.workflowBadge ? (I(), z("span", { + }, R(_.value.workflowLabel || _.value.workflowType), 9, $o), _.value.workflowBadge ? (I(), z("span", { key: 0, title: B(O)("sidebar.generation.apiProvider", "API provider: {value}", { value: _.value.workflowBadge }), style: { @@ -6087,7 +6139,7 @@ var Do = ["title"], Oo = ["src"], ko = { "font-size": "10px", "letter-spacing": "0.2px" } - }, R(_.value.workflowBadge), 9, Bo)) : N("", !0)])])) : N("", !0), + }, R(_.value.workflowBadge), 9, es)) : N("", !0)])])) : N("", !0), _.value.isOverride ? (I(), z("div", { key: 1, style: L(m("#00BCD4", { @@ -6095,7 +6147,7 @@ var Do = ["title"], Oo = ["src"], ko = { startAlpha: .14, endAlpha: .08 })) - }, [M("div", Vo, [M("span", Ho, R(B(O)("sidebar.generation.override", "Override")), 1), M("span", Uo, R(_.value.overrideLabel), 1)])], 4)) : N("", !0), + }, [M("div", ts, [M("span", ns, R(B(O)("sidebar.generation.override", "Override")), 1), M("span", rs, R(_.value.overrideLabel), 1)])], 4)) : N("", !0), _.value.isTruncated ? (I(), z("div", { key: 2, style: L(m("#FF9800", { @@ -6103,7 +6155,7 @@ var Do = ["title"], Oo = ["src"], ko = { startAlpha: .12, endAlpha: .08 })) - }, [M("div", Wo, R(B(O)("sidebar.generation.metadataTruncated", "Metadata Truncated")), 1), M("div", Go, R(B(O)("sidebar.generation.metadataTruncatedBody", "Generation data is incomplete because it exceeded the size limit.")), 1)], 4)) : N("", !0), + }, [M("div", is, R(B(O)("sidebar.generation.metadataTruncated", "Metadata Truncated")), 1), M("div", as, R(B(O)("sidebar.generation.metadataTruncatedBody", "Generation data is incomplete because it exceeded the size limit.")), 1)], 4)) : N("", !0), _.value.kind === "media-only" ? (I(), z("div", { key: 3, style: L(m("#9E9E9E", { @@ -6111,7 +6163,7 @@ var Do = ["title"], Oo = ["src"], ko = { startAlpha: .1, endAlpha: .06 })) - }, [M("div", Ko, R(B(O)("sidebar.generation.generationData", "Generation Data")), 1), M("div", qo, R(_.value.mediaOnlyMessage), 1)], 4)) : N("", !0), + }, [M("div", os, R(B(O)("sidebar.generation.generationData", "Generation Data")), 1), M("div", ss, R(_.value.mediaOnlyMessage), 1)], 4)) : N("", !0), _.value.kind === "full" ? (I(), z(j, { key: 4 }, [ _.value.ltxDirector ? (I(), z("div", { key: 0, @@ -6121,7 +6173,7 @@ var Do = ["title"], Oo = ["src"], ko = { endAlpha: .08 })) }, [ - M("div", Jo, [M("div", Yo, R(_.value.ltxDirector.title || "LTX Director"), 1), t[8] ||= M("span", { style: { + M("div", cs, [M("div", ls, R(_.value.ltxDirector.title || "LTX Director"), 1), t[8] ||= M("span", { style: { "font-size": "10px", "font-weight": "700", color: "#26C6DA", @@ -6130,7 +6182,7 @@ var Do = ["title"], Oo = ["src"], ko = { "border-radius": "999px", padding: "2px 8px" } }, " Director ", -1)]), - _.value.ltxDirector.fields.length ? (I(), z("div", Xo, [(I(!0), z(j, null, F(_.value.ltxDirector.fields, (e) => (I(), z("div", { + _.value.ltxDirector.fields.length ? (I(), z("div", us, [(I(!0), z(j, null, F(_.value.ltxDirector.fields, (e) => (I(), z("div", { key: `ltx-field-${e.label}`, style: { border: "1px solid rgba(255,255,255,0.10)", @@ -6139,8 +6191,8 @@ var Do = ["title"], Oo = ["src"], ko = { padding: "7px 8px", "min-width": "0" } - }, [M("div", Zo, R(e.label), 1), M("div", Qo, R(e.value), 1)]))), 128))])) : N("", !0), - _.value.ltxDirector.globalPrompt ? (I(), z("div", $o, [t[9] ||= M("div", { style: { + }, [M("div", ds, R(e.label), 1), M("div", fs, R(e.value), 1)]))), 128))])) : N("", !0), + _.value.ltxDirector.globalPrompt ? (I(), z("div", ps, [t[9] ||= M("div", { style: { "font-size": "10px", "font-weight": "800", color: "#66BB6A", @@ -6158,8 +6210,8 @@ var Do = ["title"], Oo = ["src"], ko = { cursor: "pointer" }, onClick: t[0] ||= (e) => D(_.value.ltxDirector.globalPrompt, e.currentTarget) - }, R(_.value.ltxDirector.globalPrompt), 9, es)])) : N("", !0), - _.value.ltxDirector.segments.length ? (I(), z("div", ts, [(I(!0), z(j, null, F(_.value.ltxDirector.segments, (e) => (I(), z("div", { + }, R(_.value.ltxDirector.globalPrompt), 9, ms)])) : N("", !0), + _.value.ltxDirector.segments.length ? (I(), z("div", hs, [(I(!0), z(j, null, F(_.value.ltxDirector.segments, (e) => (I(), z("div", { key: e.key, style: { border: "1px solid rgba(38,198,218,0.30)", @@ -6167,7 +6219,7 @@ var Do = ["title"], Oo = ["src"], ko = { background: "rgba(38,198,218,0.075)", padding: "10px" } - }, [M("div", ns, [M("div", rs, R(e.label), 1), M("div", is, [e.inLabel ? (I(), z("span", as, " in " + R(e.inLabel), 1)) : N("", !0), e.outLabel ? (I(), z("span", os, " out " + R(e.outLabel), 1)) : N("", !0)])]), M("div", ss, [e.filename ? (I(), $e(Po, { + }, [M("div", gs, [M("div", _s, R(e.label), 1), M("div", vs, [e.inLabel ? (I(), z("span", ys, " in " + R(e.inLabel), 1)) : N("", !0), e.outLabel ? (I(), z("span", bs, " out " + R(e.outLabel), 1)) : N("", !0)])]), M("div", xs, [e.filename ? (I(), nt(Jo, { key: 0, "input-file": { filename: e.filename, @@ -6178,7 +6230,7 @@ var Do = ["title"], Oo = ["src"], ko = { isAudio: e.isAudio, previewCandidates: e.previewCandidates } - }, null, 8, ["input-file"])) : N("", !0), M("div", cs, [e.prompt ? (I(), z("div", { + }, null, 8, ["input-file"])) : N("", !0), M("div", Ss, [e.prompt ? (I(), z("div", { key: 0, title: B(O)("action.clickToCopy", "Click to copy"), style: { @@ -6190,7 +6242,7 @@ var Do = ["title"], Oo = ["src"], ko = { cursor: "pointer" }, onClick: (t) => D(e.prompt, t.currentTarget) - }, R(e.prompt), 9, ls)) : N("", !0), e.filename || e.type ? (I(), z("div", us, [e.type ? (I(), z("span", ds, R(e.type), 1)) : N("", !0), e.filename ? (I(), z("span", fs, R(e.filename), 1)) : N("", !0)])) : N("", !0)])])]))), 128))])) : N("", !0) + }, R(e.prompt), 9, Cs)) : N("", !0), e.filename || e.type ? (I(), z("div", ws, [e.type ? (I(), z("span", Ts, R(e.type), 1)) : N("", !0), e.filename ? (I(), z("span", Es, R(e.filename), 1)) : N("", !0)])) : N("", !0)])])]))), 128))])) : N("", !0) ], 4)) : N("", !0), _.value.ideogram ? (I(), z("div", { key: 1, @@ -6200,7 +6252,7 @@ var Do = ["title"], Oo = ["src"], ko = { endAlpha: .08 })) }, [ - M("div", ps, [M("div", ms, R(_.value.ideogram.title || "Ideogram 4"), 1), t[10] ||= M("span", { style: { + M("div", Ds, [M("div", Os, R(_.value.ideogram.title || "Ideogram 4"), 1), t[10] ||= M("span", { style: { "font-size": "10px", "font-weight": "700", color: "#FFCA28", @@ -6209,7 +6261,7 @@ var Do = ["title"], Oo = ["src"], ko = { "border-radius": "999px", padding: "2px 8px" } }, " Prompt JSON ", -1)]), - _.value.ideogram.fields.length ? (I(), z("div", hs, [(I(!0), z(j, null, F(_.value.ideogram.fields, (e) => (I(), z("div", { + _.value.ideogram.fields.length ? (I(), z("div", ks, [(I(!0), z(j, null, F(_.value.ideogram.fields, (e) => (I(), z("div", { key: `ideogram-field-${e.label}`, style: { border: "1px solid rgba(255,255,255,0.10)", @@ -6218,8 +6270,8 @@ var Do = ["title"], Oo = ["src"], ko = { padding: "7px 8px", "min-width": "0" } - }, [M("div", gs, R(e.label), 1), M("div", _s, R(e.value), 1)]))), 128))])) : N("", !0), - _.value.ideogram.highLevelDescription ? (I(), z("div", vs, [t[11] ||= M("div", { style: { + }, [M("div", As, R(e.label), 1), M("div", js, R(e.value), 1)]))), 128))])) : N("", !0), + _.value.ideogram.highLevelDescription ? (I(), z("div", Ms, [t[11] ||= M("div", { style: { "font-size": "10px", "font-weight": "800", color: "#81C784", @@ -6237,8 +6289,8 @@ var Do = ["title"], Oo = ["src"], ko = { cursor: "pointer" }, onClick: t[1] ||= (e) => D(_.value.ideogram.highLevelDescription, e.currentTarget) - }, R(_.value.ideogram.highLevelDescription), 9, ys)])) : N("", !0), - _.value.ideogram.background ? (I(), z("div", bs, [t[12] ||= M("div", { style: { + }, R(_.value.ideogram.highLevelDescription), 9, Ns)])) : N("", !0), + _.value.ideogram.background ? (I(), z("div", Ps, [t[12] ||= M("div", { style: { "font-size": "10px", "font-weight": "800", color: "#64B5F6", @@ -6256,8 +6308,8 @@ var Do = ["title"], Oo = ["src"], ko = { cursor: "pointer" }, onClick: t[2] ||= (e) => D(_.value.ideogram.background, e.currentTarget) - }, R(_.value.ideogram.background), 9, xs)])) : N("", !0), - _.value.ideogram.elements.length ? (I(), z("div", Ss, [(I(!0), z(j, null, F(_.value.ideogram.elements, (e) => (I(), z("div", { + }, R(_.value.ideogram.background), 9, Fs)])) : N("", !0), + _.value.ideogram.elements.length ? (I(), z("div", Is, [(I(!0), z(j, null, F(_.value.ideogram.elements, (e) => (I(), z("div", { key: e.key, style: { border: "1px solid rgba(255,179,0,0.30)", @@ -6266,7 +6318,7 @@ var Do = ["title"], Oo = ["src"], ko = { padding: "10px" } }, [ - M("div", Cs, [M("div", ws, R(e.label), 1), e.bbox ? (I(), z("span", Ts, " bbox " + R(e.bbox), 1)) : N("", !0)]), + M("div", Ls, [M("div", Rs, R(e.label), 1), e.bbox ? (I(), z("span", zs, " bbox " + R(e.bbox), 1)) : N("", !0)]), e.description ? (I(), z("div", { key: 0, title: B(O)("action.clickToCopy", "Click to copy"), @@ -6279,8 +6331,8 @@ var Do = ["title"], Oo = ["src"], ko = { cursor: "pointer" }, onClick: (t) => D(e.description, t.currentTarget) - }, R(e.description), 9, Es)) : N("", !0), - e.palette.length ? (I(), z("div", Ds, [(I(!0), z(j, null, F(e.palette, (t) => (I(), z("span", { + }, R(e.description), 9, Bs)) : N("", !0), + e.palette.length ? (I(), z("div", Vs, [(I(!0), z(j, null, F(e.palette, (t) => (I(), z("span", { key: `${e.key}-${t}`, title: t, style: L({ @@ -6291,9 +6343,9 @@ var Do = ["title"], Oo = ["src"], ko = { background: t }), onClick: (e) => D(t, e.currentTarget) - }, null, 12, Os))), 128))])) : N("", !0) + }, null, 12, Hs))), 128))])) : N("", !0) ]))), 128))])) : N("", !0), - M("details", ks, [t[13] ||= M("summary", { style: { + M("details", Us, [t[13] ||= M("summary", { style: { cursor: "pointer", padding: "8px 10px", "font-size": "10px", @@ -6316,7 +6368,7 @@ var Do = ["title"], Oo = ["src"], ko = { cursor: "pointer" }, onClick: t[3] ||= (e) => D(_.value.ideogram.json, e.currentTarget) - }, R(_.value.ideogram.json), 9, As)]) + }, R(_.value.ideogram.json), 9, Ws)]) ], 4)) : N("", !0), !_.value.ltxDirector && !_.value.ideogram && _.value.promptTabs.length ? (I(), z("div", { key: 2, @@ -6326,8 +6378,8 @@ var Do = ["title"], Oo = ["src"], ko = { endAlpha: .1 })) }, [ - M("div", js, R(B(O)("sidebar.generation.promptPipeline", "Prompt Pipeline ({count} variants)", { count: _.value.promptTabs.length })), 1), - M("div", Ms, [(I(!0), z(j, null, F(_.value.promptTabs, (e, t) => (I(), $e(r, { + M("div", Gs, R(B(O)("sidebar.generation.promptPipeline", "Prompt Pipeline ({count} variants)", { count: _.value.promptTabs.length })), 1), + M("div", Ks, [(I(!0), z(j, null, F(_.value.promptTabs, (e, t) => (I(), nt(r, { key: e.label, type: "button", severity: "secondary", @@ -6347,10 +6399,10 @@ var Do = ["title"], Oo = ["src"], ko = { }), onClick: (e) => n.value = t }, { - default: tt(() => [Qe(R(e.label), 1)]), + default: it(() => [tt(R(e.label), 1)]), _: 2 }, 1032, ["style", "onClick"]))), 128))]), - (I(!0), z(j, null, F(_.value.promptTabs, (e, t) => ot((I(), z("div", { + (I(!0), z(j, null, F(_.value.promptTabs, (e, t) => lt((I(), z("div", { key: `${e.label}-panel`, style: { display: "flex", @@ -6363,7 +6415,7 @@ var Do = ["title"], Oo = ["src"], ko = { padding: "10px" } }, [ - M("div", Ns, R(B(O)("sidebar.generation.positive", "POSITIVE")), 1), + M("div", qs, R(B(O)("sidebar.generation.positive", "POSITIVE")), 1), M("div", { style: { "font-size": "12px", @@ -6373,8 +6425,8 @@ var Do = ["title"], Oo = ["src"], ko = { cursor: "pointer" }, onClick: (t) => D(e.positive, t.currentTarget) - }, R(e.positive), 9, Ps), - e.negative ? (I(), z(j, { key: 0 }, [M("div", Fs, R(B(O)("sidebar.generation.negative", "NEGATIVE")), 1), M("div", { + }, R(e.positive), 9, Js), + e.negative ? (I(), z(j, { key: 0 }, [M("div", Ys, R(B(O)("sidebar.generation.negative", "NEGATIVE")), 1), M("div", { style: { "font-size": "12px", color: "var(--fg-color, #ddd)", @@ -6383,8 +6435,8 @@ var Do = ["title"], Oo = ["src"], ko = { cursor: "pointer" }, onClick: (t) => D(e.negative, t.currentTarget) - }, R(e.negative), 9, Is)], 64)) : N("", !0) - ])), [[lt, n.value === t]])), 128)) + }, R(e.negative), 9, Xs)], 64)) : N("", !0) + ])), [[ft, n.value === t]])), 128)) ], 4)) : !_.value.ltxDirector && !_.value.ideogram && _.value.positivePrompt ? (I(), z("div", { key: 3, style: L(m("#4CAF50", { @@ -6392,11 +6444,11 @@ var Do = ["title"], Oo = ["src"], ko = { startAlpha: .16, endAlpha: .1 })) - }, [M("div", Ls, [M("span", null, R(B(O)("sidebar.generation.positivePrompt", "Positive Prompt")), 1), _.value.positivePromptOverride ? (I(), z("span", { + }, [M("div", Zs, [M("span", null, R(B(O)("sidebar.generation.positivePrompt", "Positive Prompt")), 1), _.value.positivePromptOverride ? (I(), z("span", { key: 0, style: L(g()), title: B(O)("sidebar.generation.overrideTooltip", "This field was forced by Majoor Gen Info Override") - }, R(B(O)("sidebar.generation.override", "override")), 13, Rs)) : N("", !0)]), M("div", { + }, R(B(O)("sidebar.generation.override", "override")), 13, Qs)) : N("", !0)]), M("div", { title: B(O)("action.clickToCopy", "Click to copy"), style: { "font-size": "12px", @@ -6407,7 +6459,7 @@ var Do = ["title"], Oo = ["src"], ko = { cursor: "pointer" }, onClick: t[4] ||= (e) => D(_.value.positivePrompt, e.currentTarget) - }, R(_.value.positivePrompt), 9, zs)], 4)) : N("", !0), + }, R(_.value.positivePrompt), 9, $s)], 4)) : N("", !0), !_.value.ltxDirector && !_.value.ideogram && !_.value.promptTabs.length && _.value.negativePrompt ? (I(), z("div", { key: 4, style: L(m("#F44336", { @@ -6415,11 +6467,11 @@ var Do = ["title"], Oo = ["src"], ko = { startAlpha: .16, endAlpha: .1 })) - }, [M("div", Bs, [M("span", null, R(B(O)("sidebar.generation.negativePrompt", "Negative Prompt")), 1), _.value.negativePromptOverride ? (I(), z("span", { + }, [M("div", ec, [M("span", null, R(B(O)("sidebar.generation.negativePrompt", "Negative Prompt")), 1), _.value.negativePromptOverride ? (I(), z("span", { key: 0, style: L(g()), title: B(O)("sidebar.generation.overrideTooltip", "This field was forced by Majoor Gen Info Override") - }, R(B(O)("sidebar.generation.override", "override")), 13, Vs)) : N("", !0)]), M("div", { + }, R(B(O)("sidebar.generation.override", "override")), 13, tc)) : N("", !0)]), M("div", { title: B(O)("action.clickToCopy", "Click to copy"), style: { "font-size": "12px", @@ -6430,7 +6482,7 @@ var Do = ["title"], Oo = ["src"], ko = { cursor: "pointer" }, onClick: t[5] ||= (e) => D(_.value.negativePrompt, e.currentTarget) - }, R(_.value.negativePrompt), 9, Hs)], 4)) : N("", !0) + }, R(_.value.negativePrompt), 9, nc)], 4)) : N("", !0) ], 64)) : N("", !0), y.value ? (I(), z("div", { key: 5, @@ -6443,12 +6495,12 @@ var Do = ["title"], Oo = ["src"], ko = { "flex-direction": "column", gap: "10px" }, - class: Dt({ "mjr-ai-disabled-block": !v.value }) + class: At({ "mjr-ai-disabled-block": !v.value }) }, [ _.value.showAlignment ? (I(), z(j, { key: 0 }, [ - M("div", Us, [M("span", { title: B(O)("sidebar.generation.promptAlignmentTooltip", "How closely the generated image matches the prompt (SigLIP2 score)") }, R(B(O)("sidebar.generation.promptAlignment", "Prompt Alignment")), 9, Ws)]), - M("div", Gs, [ - M("div", Ks, [M("div", { style: L({ + M("div", rc, [M("span", { title: B(O)("sidebar.generation.promptAlignmentTooltip", "How closely the generated image matches the prompt (SigLIP2 score)") }, R(B(O)("sidebar.generation.promptAlignment", "Prompt Alignment")), 9, ic)]), + M("div", ac, [ + M("div", oc, [M("div", { style: L({ height: "100%", width: l.value.fillWidth, background: l.value.fillColor, @@ -6474,9 +6526,9 @@ var Do = ["title"], Oo = ["src"], ko = { letterSpacing: "0.5px" }) }, R(l.value.qualityText), 5) ]), - l.value.aiStatusVisible ? (I(), z("div", qs, R(l.value.aiStatusText), 1)) : N("", !0) + l.value.aiStatusVisible ? (I(), z("div", sc, R(l.value.aiStatusText), 1)) : N("", !0) ], 64)) : N("", !0), - M("div", Js, [M("span", { title: B(O)("sidebar.generation.aiCaptionTooltip", "AI caption generated by Florence-2") }, R(_.value.captionLabel), 9, Ys), M("div", Xs, [gt(r, { + M("div", cc, [M("span", { title: B(O)("sidebar.generation.aiCaptionTooltip", "AI caption generated by Florence-2") }, R(_.value.captionLabel), 9, lc), M("div", uc, [yt(r, { type: "button", class: "mjr-ai-control", severity: "secondary", @@ -6495,11 +6547,11 @@ var Do = ["title"], Oo = ["src"], ko = { opacity: x.value ? "1" : "0.6", cursor: x.value ? "pointer" : "default" }]), - onClick: at(se, ["stop"]) + onClick: ct(se, ["stop"]) }, { - default: tt(() => [Qe(R(o.value), 1)]), + default: it(() => [tt(R(o.value), 1)]), _: 1 - }, 8, ["disabled", "style"]), gt(r, { + }, 8, ["disabled", "style"]), yt(r, { type: "button", class: "mjr-ai-control", severity: "secondary", @@ -6518,9 +6570,9 @@ var Do = ["title"], Oo = ["src"], ko = { opacity: S.value ? "1" : "0.6", cursor: S.value ? "pointer" : "default" }]), - onClick: at(ce, ["stop"]) + onClick: ct(ce, ["stop"]) }, { - default: tt(() => [Qe(R(a.value), 1)]), + default: it(() => [tt(R(a.value), 1)]), _: 1 }, 8, ["disabled", "style"])])]), M("div", { @@ -6539,7 +6591,7 @@ var Do = ["title"], Oo = ["src"], ko = { cursor: S.value ? "copy" : "default" }), onClick: ce - }, R(b.value), 13, Zs) + }, R(b.value), 13, dc) ], 2)) : N("", !0), C.value.length ? (I(), z("div", { key: 6, @@ -6548,7 +6600,7 @@ var Do = ["title"], Oo = ["src"], ko = { startAlpha: .18, endAlpha: .1 })) - }, [M("div", Qs, R(B(O)("sidebar.generation.models", "Models")), 1), M("div", $s, [(I(!0), z(j, null, F(C.value, (e) => (I(), z("div", { + }, [M("div", fc, R(B(O)("sidebar.generation.models", "Models")), 1), M("div", pc, [(I(!0), z(j, null, F(C.value, (e) => (I(), z("div", { key: `models-top-${e.key}`, style: L(w(T(e), !0)) }, [ @@ -6567,7 +6619,7 @@ var Do = ["title"], Oo = ["src"], ko = { gap: "3px", "min-width": "0" } - }, [M("span", ec, R(t.label), 1), M("span", { + }, [M("span", mc, R(t.label), 1), M("span", { style: { "font-size": "12px", color: "var(--fg-color, rgba(255,255,255,0.96))", @@ -6576,8 +6628,8 @@ var Do = ["title"], Oo = ["src"], ko = { cursor: "pointer" }, onClick: (e) => D(t.value, e.currentTarget) - }, R(t.value || "-"), 9, tc)]))), 128)), - e.loras.length ? (I(), z("div", nc, [t[14] ||= M("span", { style: { + }, R(t.value || "-"), 9, hc)]))), 128)), + e.loras.length ? (I(), z("div", gc, [t[14] ||= M("span", { style: { "font-size": "10px", "font-weight": "700", color: "rgba(255,255,255,0.58)", @@ -6597,12 +6649,12 @@ var Do = ["title"], Oo = ["src"], ko = { cursor: "pointer" }, onClick: (e) => D(t, e.currentTarget) - }, R(t), 9, rc))), 128))])) : N("", !0) + }, R(t), 9, _c))), 128))])) : N("", !0) ], 4))), 128))])], 4)) : N("", !0), _.value.lyrics ? (I(), z("div", { key: 7, style: L(m("#00BCD4", { emphasis: !1 })) - }, [M("div", ic, [M("span", null, R(B(O)("sidebar.generation.lyrics", "Lyrics")), 1)]), M("div", ac, R(_.value.lyrics), 1)], 4)) : N("", !0), + }, [M("div", vc, [M("span", null, R(B(O)("sidebar.generation.lyrics", "Lyrics")), 1)]), M("div", yc, R(_.value.lyrics), 1)], 4)) : N("", !0), _.value.branchCards.length ? (I(), z(j, { key: 8 }, [ N("", !0), ee.value.length ? (I(), z("div", { @@ -6612,7 +6664,7 @@ var Do = ["title"], Oo = ["src"], ko = { startAlpha: .16, endAlpha: .1 })) - }, [M("div", oc, R(B(O)("sidebar.generation.sampling", "Sampling")), 1), M("div", sc, [(I(!0), z(j, null, F(ee.value, (e) => (I(), z("div", { + }, [M("div", bc, R(B(O)("sidebar.generation.sampling", "Sampling")), 1), M("div", xc, [(I(!0), z(j, null, F(ee.value, (e) => (I(), z("div", { key: `sampling-${e.key}`, style: L(w(E(e), !0)) }, [M("div", { style: L({ @@ -6639,7 +6691,7 @@ var Do = ["title"], Oo = ["src"], ko = { cursor: "pointer" }, onClick: (e) => D(t.value, e.currentTarget) - }, R(t.value), 9, cc)]))), 128))], 4))), 128))])], 4)) : N("", !0), + }, R(t.value), 9, Sc)]))), 128))], 4))), 128))])], 4)) : N("", !0), N("", !0) ], 64)) : _.value.modelGroups.length ? (I(), z("div", { key: 9, @@ -6648,11 +6700,11 @@ var Do = ["title"], Oo = ["src"], ko = { startAlpha: .18, endAlpha: .1 })) - }, [M("div", lc, R(B(O)("sidebar.generation.models", "Models")), 1), M("div", uc, [(I(!0), z(j, null, F(_.value.modelGroups, (e) => (I(), z("div", { + }, [M("div", Cc, R(B(O)("sidebar.generation.models", "Models")), 1), M("div", wc, [(I(!0), z(j, null, F(_.value.modelGroups, (e) => (I(), z("div", { key: `model-group-${e.key}`, style: L(w(re(e.key), !0)) }, [ - M("div", dc, [M("div", { style: L({ + M("div", Tc, [M("div", { style: L({ fontSize: "10px", fontWeight: "800", color: re(e.key), @@ -6669,7 +6721,7 @@ var Do = ["title"], Oo = ["src"], ko = { letterSpacing: "0.4px", textTransform: "uppercase" }) }, R(e.loras?.length || 0) + " LoRA ", 5)]), - M("div", fc, [t[15] ||= M("div", { style: { + M("div", Ec, [t[15] ||= M("div", { style: { "font-size": "10px", "font-weight": "700", color: "rgba(255,255,255,0.58)", @@ -6684,8 +6736,8 @@ var Do = ["title"], Oo = ["src"], ko = { cursor: "pointer" }, onClick: (t) => D(e.model, t.currentTarget) - }, R(e.model || "-"), 9, pc)]), - e.loras?.length ? (I(), z("div", mc, [M("div", hc, R(B(O)("sidebar.generation.loraStack", "LoRA Stack")), 1), M("div", gc, [(I(!0), z(j, null, F(e.loras, (t, n) => (I(), z("div", { + }, R(e.model || "-"), 9, Dc)]), + e.loras?.length ? (I(), z("div", Oc, [M("div", kc, R(B(O)("sidebar.generation.loraStack", "LoRA Stack")), 1), M("div", Ac, [(I(!0), z(j, null, F(e.loras, (t, n) => (I(), z("div", { key: `${e.key}-lora-${n}`, style: { "font-size": "12px", @@ -6699,7 +6751,7 @@ var Do = ["title"], Oo = ["src"], ko = { cursor: "pointer" }, onClick: (e) => D(t, e.currentTarget) - }, R(t), 9, _c))), 128))])])) : N("", !0) + }, R(t), 9, jc))), 128))])])) : N("", !0) ], 4))), 128))])], 4)) : N("", !0), (I(!0), z(j, null, F(te.value, (e) => (I(), z("div", { key: e.key, @@ -6711,7 +6763,7 @@ var Do = ["title"], Oo = ["src"], ko = { textTransform: "uppercase", letterSpacing: "0.5px", marginBottom: "10px" - }) }, R(e.title), 5), M("div", vc, [(I(!0), z(j, null, F(e.fields, (t) => (I(), z(j, { key: `${e.key}-${t.label}` }, [M("div", { + }) }, R(e.title), 5), M("div", Mc, [(I(!0), z(j, null, F(e.fields, (t) => (I(), z(j, { key: `${e.key}-${t.label}` }, [M("div", { title: t.label, style: { "font-size": "11px", @@ -6725,7 +6777,7 @@ var Do = ["title"], Oo = ["src"], ko = { key: 0, style: L(g()), title: B(O)("sidebar.generation.overrideTooltip", "This field was forced by Majoor Gen Info Override") - }, R(B(O)("sidebar.generation.override", "override")), 13, bc)) : N("", !0)], 8, yc), M("div", { + }, R(B(O)("sidebar.generation.override", "override")), 13, Pc)) : N("", !0)], 8, Nc), M("div", { title: `${t.label}: ${t.value}`, style: { "font-size": "12px", @@ -6735,11 +6787,11 @@ var Do = ["title"], Oo = ["src"], ko = { cursor: "pointer" }, onClick: (e) => D(t.value, e.currentTarget) - }, R(t.value), 9, xc)], 64))), 128))])], 4))), 128)), + }, R(t.value), 9, Fc)], 64))), 128))])], 4))), 128)), _.value.notesFields.length ? (I(), z("div", { key: 10, style: L(m("#4CAF50", { emphasis: !1 })) - }, [M("div", Sc, R(B(O)("sidebar.generation.notes", "Notes")), 1), (I(!0), z(j, null, F(_.value.notesFields, (e) => (I(), z("div", { + }, [M("div", Ic, R(B(O)("sidebar.generation.notes", "Notes")), 1), (I(!0), z(j, null, F(_.value.notesFields, (e) => (I(), z("div", { key: e.label, title: `${e.label}: ${e.value}`, style: { @@ -6751,7 +6803,7 @@ var Do = ["title"], Oo = ["src"], ko = { cursor: "pointer" }, onClick: (t) => D(e.value, t.currentTarget) - }, R(e.value), 9, Cc))), 128))], 4)) : N("", !0), + }, R(e.value), 9, Lc))), 128))], 4)) : N("", !0), _.value.moduleBlocks.length ? (I(), z("div", { key: 11, style: L(m("#26C6DA", { @@ -6759,7 +6811,7 @@ var Do = ["title"], Oo = ["src"], ko = { startAlpha: .14, endAlpha: .08 })) - }, [M("div", wc, R(B(O)("sidebar.generation.modules", "Modules")), 1), M("div", Tc, [(I(!0), z(j, null, F(_.value.moduleBlocks, (e) => (I(), z("div", { + }, [M("div", Rc, R(B(O)("sidebar.generation.modules", "Modules")), 1), M("div", zc, [(I(!0), z(j, null, F(_.value.moduleBlocks, (e) => (I(), z("div", { key: `module-${e.key}-${e.title}`, style: L(w(e.accent, !1)) }, [M("div", { style: L({ @@ -6776,7 +6828,7 @@ var Do = ["title"], Oo = ["src"], ko = { gap: "3px", "min-width": "0" } - }, [M("span", Ec, R(t.label), 1), M("span", { + }, [M("span", Bc, R(t.label), 1), M("span", { title: `${t.label}: ${t.value}`, style: { "font-size": "12px", @@ -6787,11 +6839,11 @@ var Do = ["title"], Oo = ["src"], ko = { cursor: "pointer" }, onClick: (e) => D(t.value, e.currentTarget) - }, R(t.value), 9, Dc)]))), 128))], 4))), 128))])], 4)) : N("", !0), + }, R(t.value), 9, Vc)]))), 128))], 4))), 128))])], 4)) : N("", !0), _.value.ttsInstruction ? (I(), z("div", { key: 12, style: L(m("#26A69A", { emphasis: !1 })) - }, [M("div", Oc, [M("span", null, R(B(O)("sidebar.generation.ttsInstruction", "TTS Instruction")), 1)]), M("div", { + }, [M("div", Hc, [M("span", null, R(B(O)("sidebar.generation.ttsInstruction", "TTS Instruction")), 1)]), M("div", { title: B(O)("action.clickToCopy", "Click to copy"), style: { "font-size": "12px", @@ -6802,11 +6854,11 @@ var Do = ["title"], Oo = ["src"], ko = { cursor: "pointer" }, onClick: t[6] ||= (e) => D(_.value.ttsInstruction, e.currentTarget) - }, R(_.value.ttsInstruction), 9, kc)], 4)) : N("", !0), + }, R(_.value.ttsInstruction), 9, Uc)], 4)) : N("", !0), _.value.seed !== null && _.value.seed !== void 0 && _.value.seed !== "" ? (I(), z("div", { key: 13, style: L(h()) - }, [M("div", Ac, R(B(O)("sidebar.generation.seed", "SEED")), 1), M("div", { + }, [M("div", Wc, R(B(O)("sidebar.generation.seed", "SEED")), 1), M("div", { title: B(O)("sidebar.generation.copySeedTooltip", "Click to copy seed: {seed}", { seed: _.value.seed }), style: { "font-size": "18px", @@ -6820,7 +6872,7 @@ var Do = ["title"], Oo = ["src"], ko = { transition: "background 0.2s" }, onClick: t[7] ||= (e) => D(_.value.seed, e.currentTarget, "rgba(76, 175, 80, 0.4)") - }, R(_.value.seed), 9, jc)], 4)) : N("", !0), + }, R(_.value.seed), 9, Gc)], 4)) : N("", !0), _.value.inputFiles.length ? (I(), z("div", { key: 14, style: L(m("#4CAF50", { @@ -6838,14 +6890,14 @@ var Do = ["title"], Oo = ["src"], ko = { "letter-spacing": "0.5px", "margin-bottom": "8px" } - }, R(B(O)("sidebar.generation.sourceFiles", "Source Files")), 9, Mc), M("div", Nc, [(I(!0), z(j, null, F(_.value.inputFiles, (e) => (I(), $e(Po, { + }, R(B(O)("sidebar.generation.sourceFiles", "Source Files")), 9, Kc), M("div", qc, [(I(!0), z(j, null, F(_.value.inputFiles, (e) => (I(), nt(Jo, { key: e.id, "input-file": e }, null, 8, ["input-file"]))), 128))])], 4)) : N("", !0) ])); }; } -}), Fc = { +}), Yc = { key: 0, class: "mjr-sidebar-section", style: { @@ -6855,14 +6907,14 @@ var Do = ["title"], Oo = ["src"], ko = { padding: "12px", "min-width": "300px" } -}, Ic = { style: { "margin-bottom": "12px" } }, Lc = { style: { +}, Xc = { style: { "margin-bottom": "12px" } }, Zc = { style: { "font-size": "16px", "font-weight": "800", color: "rgba(255,255,255,0.94)", "line-height": "1.25", overflow: "hidden", "text-overflow": "ellipsis" -} }, Rc = ["title"], zc = { +} }, Qc = ["title"], $c = { key: 1, style: { display: "flex", @@ -6872,16 +6924,16 @@ var Do = ["title"], Oo = ["src"], ko = { "min-width": "0" }, "aria-label": "Workflow metadata badges" -}, Bc = ["title"], Vc = { style: { +}, el = ["title"], tl = { style: { overflow: "hidden", "text-overflow": "ellipsis", "white-space": "nowrap" -} }, Hc = { style: { +} }, nl = { style: { display: "flex", "flex-wrap": "wrap", gap: "8px", "margin-bottom": "10px" -} }, Uc = { style: { +} }, rl = { style: { padding: "4px 9px", "border-radius": "999px", background: "rgba(33,150,243,0.14)", @@ -6891,7 +6943,7 @@ var Do = ["title"], Oo = ["src"], ko = { color: "#90CAF9", "text-transform": "uppercase", "letter-spacing": "0.4px" -} }, Wc = { +} }, il = { key: 0, style: { padding: "4px 9px", @@ -6902,12 +6954,12 @@ var Do = ["title"], Oo = ["src"], ko = { "font-weight": "600", color: "rgba(255,255,255,0.82)" } -}, Gc = { style: { +}, al = { style: { display: "grid", "grid-template-columns": "repeat(2, minmax(0, 1fr))", gap: "8px", "margin-bottom": "12px" -} }, Kc = { +} }, ol = { key: 0, style: { padding: "8px 10px", @@ -6915,12 +6967,12 @@ var Do = ["title"], Oo = ["src"], ko = { background: "rgba(255,255,255,0.04)", border: "1px solid rgba(255,255,255,0.10)" } -}, qc = { style: { +}, sl = { style: { "font-size": "13px", "font-weight": "750", color: "rgba(255,255,255,0.92)", "margin-top": "3px" -} }, Jc = { +} }, cl = { key: 1, style: { padding: "8px 10px", @@ -6928,12 +6980,12 @@ var Do = ["title"], Oo = ["src"], ko = { background: "rgba(255,255,255,0.04)", border: "1px solid rgba(255,255,255,0.10)" } -}, Yc = { style: { +}, ll = { style: { "font-size": "13px", "font-weight": "750", color: "rgba(255,255,255,0.92)", "margin-top": "3px" -} }, Xc = { +} }, ul = { key: 2, style: { padding: "8px 10px", @@ -6941,12 +6993,12 @@ var Do = ["title"], Oo = ["src"], ko = { background: "rgba(255,255,255,0.04)", border: "1px solid rgba(255,255,255,0.10)" } -}, Zc = { style: { +}, dl = { style: { "font-size": "13px", "font-weight": "750", color: "rgba(255,255,255,0.92)", "margin-top": "3px" -} }, Qc = { +} }, fl = { key: 3, style: { padding: "8px 10px", @@ -6954,19 +7006,19 @@ var Do = ["title"], Oo = ["src"], ko = { background: "rgba(255,255,255,0.04)", border: "1px solid rgba(255,255,255,0.10)" } -}, $c = { style: { +}, pl = { style: { "font-size": "12px", "font-weight": "650", color: "rgba(255,255,255,0.84)", "margin-top": "3px" -} }, el = { +} }, ml = { key: 0, style: { "font-size": "11px", color: "rgba(255,255,255,0.54)", "margin-top": "2px" } -}, tl = { +}, hl = { key: 0, style: { "margin-bottom": "12px", @@ -6975,14 +7027,14 @@ var Do = ["title"], Oo = ["src"], ko = { background: "rgba(244,67,54,0.08)", border: "1px solid rgba(244,67,54,0.25)" } -}, nl = { +}, gl = { key: 1, style: { display: "flex", "flex-wrap": "wrap", gap: "5px" } -}, rl = { +}, _l = { key: 1, style: { "margin-bottom": "12px", @@ -6991,7 +7043,7 @@ var Do = ["title"], Oo = ["src"], ko = { background: "rgba(255,255,255,0.035)", border: "1px solid rgba(255,255,255,0.10)" } -}, il = { +}, vl = { key: 0, style: { "font-size": "12px", @@ -6999,12 +7051,12 @@ var Do = ["title"], Oo = ["src"], ko = { color: "rgba(255,255,255,0.82)", "white-space": "pre-wrap" } -}, al = { style: { +}, yl = { style: { display: "grid", "grid-template-columns": "repeat(3, minmax(0, 1fr))", gap: "8px", "margin-bottom": "12px" -} }, ol = { +} }, bl = { key: 2, style: { "margin-bottom": "12px", @@ -7013,92 +7065,92 @@ var Do = ["title"], Oo = ["src"], ko = { background: "rgba(76,175,80,0.07)", border: "1px solid rgba(76,175,80,0.22)" } -}, sl = { style: { +}, xl = { style: { display: "flex", "align-items": "center", "justify-content": "space-between", gap: "8px", "margin-bottom": "7px" -} }, cl = { style: { +} }, Sl = { style: { "font-size": "11px", color: "rgba(255,255,255,0.62)" -} }, ll = { +} }, Cl = { key: 0, style: { display: "flex", "flex-direction": "column", gap: "6px" } -}, ul = { +}, wl = { key: 0, style: { display: "flex", "flex-wrap": "wrap", gap: "5px" } -}, dl = { +}, Tl = { key: 1, style: { display: "flex", "flex-wrap": "wrap", gap: "5px" } -}, fl = { +}, El = { key: 1, style: { "font-size": "12px", color: "rgba(255,255,255,0.78)" } -}, pl = { +}, Dl = { key: 2, style: { "margin-top": "7px", "font-size": "11px", color: "rgba(255,255,255,0.58)" } -}, ml = { +}, Ol = { key: 3, style: { "margin-top": "8px", "font-size": "11px", color: "rgba(255,255,255,0.62)" } -}, hl = { key: 0 }, gl = { style: { +}, kl = { key: 0 }, Al = { style: { display: "grid", "grid-template-columns": "repeat(3, minmax(0, 1fr))", gap: "8px", "margin-bottom": "12px" -} }, _l = { style: { +} }, jl = { style: { padding: "8px 10px", "border-radius": "10px", background: "rgba(255,255,255,0.04)", border: "1px solid rgba(255,255,255,0.10)" -} }, vl = { style: { +} }, Ml = { style: { "font-size": "18px", "font-weight": "700", color: "rgba(255,255,255,0.94)", "margin-top": "2px" -} }, yl = { style: { +} }, Nl = { style: { padding: "8px 10px", "border-radius": "10px", background: "rgba(255,255,255,0.04)", border: "1px solid rgba(255,255,255,0.10)" -} }, bl = { style: { +} }, Pl = { style: { "font-size": "18px", "font-weight": "700", color: "rgba(255,255,255,0.94)", "margin-top": "2px" -} }, xl = { style: { +} }, Fl = { style: { padding: "8px 10px", "border-radius": "10px", background: "rgba(255,255,255,0.04)", border: "1px solid rgba(255,255,255,0.10)" -} }, Sl = { style: { +} }, Il = { style: { "font-size": "18px", "font-weight": "700", color: "rgba(255,255,255,0.94)", "margin-top": "2px" -} }, Cl = { +} }, Ll = { key: 3, style: { "margin-bottom": "12px", @@ -7107,41 +7159,41 @@ var Do = ["title"], Oo = ["src"], ko = { background: "rgba(255,255,255,0.03)", border: "1px solid rgba(255,255,255,0.10)" } -}, wl = { style: { +}, Rl = { style: { display: "flex", "align-items": "center", "justify-content": "space-between", gap: "10px", "margin-bottom": "8px", "min-width": "0" -} }, Tl = { style: { +} }, zl = { style: { "min-width": "0", flex: "1 1 auto" -} }, El = ["title"], Dl = ["title"], Ol = { style: { +} }, Bl = ["title"], Vl = ["title"], Hl = { style: { display: "flex", gap: "8px", "align-items": "center" -} }, kl = ["placeholder"], Al = { +} }, Ul = ["placeholder"], Wl = { key: 4, class: "mjr-workflow-tree-wrap" -}, jl = { class: "mjr-workflow-tree-node" }, Ml = { class: "mjr-workflow-tree-node-name" }, Nl = { +}, Gl = { class: "mjr-workflow-tree-node" }, Kl = { class: "mjr-workflow-tree-node-name" }, ql = { key: 0, class: "mjr-workflow-tree-node-type" -}, Pl = { class: "mjr-menu-item-hint" }, Fl = { +}, Jl = { class: "mjr-menu-item-hint" }, Yl = { key: 0, class: "mjr-section-hint" -}, Il = { style: { +}, Xl = { style: { display: "flex", "align-items": "center", "justify-content": "space-between", gap: "10px", "margin-top": "8px" -} }, Ll = { style: { +} }, Zl = { style: { display: "flex", "flex-wrap": "wrap", gap: "6px", "align-items": "center" -} }, Rl = { +} }, Ql = { key: 5, style: { display: "grid", @@ -7151,23 +7203,23 @@ var Do = ["title"], Oo = ["src"], ko = { "margin-top": "10px", "margin-bottom": "10px" } -}, zl = { style: { +}, $l = { style: { display: "flex", "flex-direction": "column", gap: "2px", "min-width": "0" -} }, Bl = { style: { +} }, eu = { style: { "font-size": "13px", "font-weight": "600" -} }, Vl = { style: { +} }, tu = { style: { "font-size": "11px", color: "rgba(255,255,255,0.58)" -} }, Hl = { style: { +} }, nu = { style: { display: "flex", gap: "10px", "align-items": "stretch", "margin-top": "10px" -} }, Ul = { style: { +} }, ru = { style: { display: "flex", "justify-content": "space-between", "align-items": "center", @@ -7175,7 +7227,7 @@ var Do = ["title"], Oo = ["src"], ko = { "margin-top": "8px", "font-size": "11px", color: "rgba(255,255,255,0.58)" -} }, Wl = ["open"], Gl = { style: { +} }, iu = ["open"], au = { style: { background: "rgba(0,0,0,0.5)", padding: "10px", "border-radius": "6px", @@ -7185,7 +7237,7 @@ var Do = ["title"], Oo = ["src"], ko = { margin: "10px 0 0 0", color: "#90CAF9", "font-family": "'Consolas', 'Monaco', monospace" -} }, Kl = 1, ql = 8, Jl = 250, Yl = /* @__PURE__ */ rt({ +} }, ou = 1, su = 8, cu = 250, lu = /* @__PURE__ */ ot({ __name: "SidebarWorkflowSection", props: { asset: {} }, setup(e) { @@ -7227,7 +7279,7 @@ var Do = ["title"], Oo = ["src"], ko = { function re(e) { e && typeof e == "object" && (x.value = { ...x.value, - zoom: E(e.zoom ?? x.value.zoom, Kl, ql), + zoom: E(e.zoom ?? x.value.zoom, ou, su), centerX: Number.isFinite(Number(e.centerX)) ? Number(e.centerX) : null, centerY: Number.isFinite(Number(e.centerY)) ? Number(e.centerY) : null }); @@ -7295,7 +7347,7 @@ var Do = ["title"], Oo = ["src"], ko = { } function ce() { try { - let e = qt?.()?.workflowMinimap; + let e = Xt?.()?.workflowMinimap; if (e && typeof e == "object") return { ...r, ...e @@ -7313,7 +7365,7 @@ var Do = ["title"], Oo = ["src"], ko = { ...t }; try { - let e = qt(); + let e = Xt(); e.workflowMinimap = { ...e.workflowMinimap, ...n @@ -7328,7 +7380,7 @@ var Do = ["title"], Oo = ["src"], ko = { } function le(e) { try { - let t = qt(); + let t = Xt(); t.workflowMinimap = { ...t.workflowMinimap, ...e @@ -7339,7 +7391,7 @@ var Do = ["title"], Oo = ["src"], ko = { } let ue = P(() => { let e = oe(n.asset) || oe(d.value), t = se(n.asset) || se(d.value); - return !e && !t ? null : e || ma(t); + return !e && !t ? null : e || Oa(t); }), de = P(() => String(n.asset?.filepath || n.asset?.path || n.asset?.file_info?.filepath || "").trim()), fe = P(() => { if (de.value.toLowerCase().endsWith(".json")) return !0; let e = String(n.asset?.kind || "").trim().toLowerCase(), t = String(n.asset?.source || "").trim().toLowerCase(); @@ -7351,7 +7403,7 @@ var Do = ["title"], Oo = ["src"], ko = { n.asset?.detected_task ? `detected: ${n.asset.detected_task}` : "", n.asset?.detected_model_family ? n.asset.detected_model_family : "", n.asset?.detected_provider ? n.asset.detected_provider : "" - ].filter(Boolean).join(" · ")), Se = P(() => ze(n.asset?.missing_nodes || n.asset?.missingNodes)), we = P(() => ze(n.asset?.missing_models || n.asset?.missingModels)), Te = P(() => ze(n.asset?.tags || n.asset?.workflow_tags || n.asset?.tags_json)), De = P(() => Te.value.slice(0, 3)), Oe = P(() => Math.max(0, Te.value.length - De.value.length)), ke = P(() => ze(p.value?.missing_nodes)), Ae = P(() => ze(p.value?.missing_models)), je = P(() => ze(p.value?.warnings)), Me = P(() => { + ].filter(Boolean).join(" · ")), Se = P(() => Be(n.asset?.missing_nodes || n.asset?.missingNodes)), we = P(() => Be(n.asset?.missing_models || n.asset?.missingModels)), Te = P(() => Be(n.asset?.tags || n.asset?.workflow_tags || n.asset?.tags_json)), De = P(() => Te.value.slice(0, 3)), Oe = P(() => Math.max(0, Te.value.length - De.value.length)), ke = P(() => Be(p.value?.missing_nodes)), Ae = P(() => Be(p.value?.missing_models)), je = P(() => Be(p.value?.warnings)), Me = P(() => { let e = p.value; return e ? `${Number(e.node_count || 0)} nodes | ${Number(e.subgraph_count || 0)} subgraphs | ${Array.isArray(e.required_nodes) ? e.required_nodes.length : 0} node types` : ""; }), Ne = P(() => { @@ -7363,7 +7415,7 @@ var Do = ["title"], Oo = ["src"], ko = { }), Fe = P(() => { let e = Number(n.asset?.usage_count || n.asset?.usageCount || 0); return !Number.isFinite(e) || e <= 0 ? "" : `${Math.floor(e)} use${e === 1 ? "" : "s"}`; - }), Ie = P(() => A(n.asset?.last_loaded_at || n.asset?.lastLoadedAt)), Le = P(() => A(n.asset?.mtime || n.asset?.modified_at || n.asset?.updated_at)), k = P(() => { + }), Ie = P(() => Ve(n.asset?.last_loaded_at || n.asset?.lastLoadedAt)), Le = P(() => Ve(n.asset?.mtime || n.asset?.modified_at || n.asset?.updated_at)), Re = P(() => { let e = []; n.asset?.favorite && e.push({ key: "favorite", @@ -7394,25 +7446,25 @@ var Do = ["title"], Oo = ["src"], ko = { tone: "tag" }), e; }); - function Re(e) { + function ze(e) { let t = "display:inline-flex;align-items:center;gap:5px;max-width:100%;padding:4px 8px;border-radius:999px;font-size:10px;font-weight:750;line-height:1.1;overflow:hidden"; return e === "favorite" ? `${t};background:rgba(255,193,7,0.15);border:1px solid rgba(255,193,7,0.34);color:#ffe082` : e === "usage" ? `${t};background:rgba(33,150,243,0.14);border:1px solid rgba(33,150,243,0.30);color:#90caf9` : e === "loaded" ? `${t};background:rgba(76,175,80,0.13);border:1px solid rgba(76,175,80,0.28);color:#a5d6a7` : `${t};background:rgba(255,255,255,0.07);border:1px solid rgba(255,255,255,0.14);color:rgba(255,255,255,0.82)`; } - function ze(e) { + function Be(e) { if (Array.isArray(e)) return e.map((e) => String(e || "").trim()).filter(Boolean); if (typeof e == "string") { let t = e.trim(); if (!t) return []; try { let e = JSON.parse(t); - if (Array.isArray(e)) return ze(e); + if (Array.isArray(e)) return Be(e); } catch { return t.split(/[,\n]/).map((e) => e.trim()).filter(Boolean); } } return []; } - function A(e) { + function Ve(e) { let t = Number(e); if (!Number.isFinite(t) || t <= 0) return ""; let n = t > 1e10 ? t : t * 1e3; @@ -7422,7 +7474,7 @@ var Do = ["title"], Oo = ["src"], ko = { return ""; } } - async function Be() { + async function k() { if (ue.value) return; let e = de.value; if (e && !l.value) { @@ -7443,7 +7495,7 @@ var Do = ["title"], Oo = ["src"], ko = { } } } - let Ve = P(() => n.asset?.has_generation_data ? "Complete" : "Partial"), He = P(() => ue.value ? JSON.stringify(ue.value, null, 2) : ""), We = P(() => String(n.asset?.category || n.asset?.subfolder || n.asset?.folder || "").trim().replace(/^\/+|\/+$/g, "")), Ge = P(() => We.value ? We.value.split(/[\\/]+/).filter(Boolean) : []), Ke = P(() => Ge.value.at(-1) || We.value || "Root"), qe = P(() => Ge.value.slice(-1)); + let He = P(() => n.asset?.has_generation_data ? "Complete" : "Partial"), Ue = P(() => ue.value ? JSON.stringify(ue.value, null, 2) : ""), A = P(() => String(n.asset?.category || n.asset?.subfolder || n.asset?.folder || "").trim().replace(/^\/+|\/+$/g, "")), We = P(() => A.value ? A.value.split(/[\\/]+/).filter(Boolean) : []), Ge = P(() => We.value.at(-1) || A.value || "Root"), qe = P(() => We.value.slice(-1)); function Je(e, t) { let n = e?.id ?? e?.key ?? t + 1; return String(e?.title || e?._meta?.title || e?.type || e?.class_type || e?.name || `Node ${n}`); @@ -7452,9 +7504,9 @@ var Do = ["title"], Oo = ["src"], ko = { return String(e?.type || e?.class_type || e?.name || "").trim(); } function Xe() { - s.value = We.value; + s.value = A.value; } - async function rt() { + async function Ze() { if (!fe.value) return; let e = String(n.asset?.filepath || n.asset?.path || n.asset?.file_info?.filepath || "").trim(); if (!e) { @@ -7462,7 +7514,7 @@ var Do = ["title"], Oo = ["src"], ko = { return; } let r = String(s.value || "").trim(); - if (r !== We.value) { + if (r !== A.value) { c.value = !0; try { let n = await _({ @@ -7481,7 +7533,7 @@ var Do = ["title"], Oo = ["src"], ko = { } } } - async function at() { + async function Qe() { let e = de.value; if (!e) { t(O("toast.workflowMissingPath", "Workflow file path is missing."), "error"); @@ -7500,7 +7552,7 @@ var Do = ["title"], Oo = ["src"], ko = { t(O("toast.workflowThumbnailNoCandidates", "No linked outputs are available for this workflow yet."), "warning", 2600); return; } - let a = await ga({ + let a = await Aa({ title: O("ctx.setWorkflowThumbnail", "Set workflow thumbnail"), workflow: n.asset, items: i @@ -7512,10 +7564,10 @@ var Do = ["title"], Oo = ["src"], ko = { }, { timeoutMs: 3e4 }); o?.ok ? (t(O("toast.workflowUpdated", "Workflow updated"), "success", 1800), window?.dispatchEvent?.(new CustomEvent("mjr:reload-grid", { detail: { reason: "workflow-thumbnail-sidebar" } }))) : t(o?.error || O("toast.workflowSaveFailed", "Failed to save workflow."), "error"); } - async function st() { - if (await Be(), !ue.value) t(O("toast.workflowLoadFailed", "Failed to load workflow."), "error"); + async function $e() { + if (await k(), !ue.value) t(O("toast.workflowLoadFailed", "Failed to load workflow."), "error"); else try { - await Ze.openAssets({ + await et.openAssets({ assets: [{ ...n.asset, workflow: ue.value, @@ -7528,7 +7580,7 @@ var Do = ["title"], Oo = ["src"], ko = { console.debug?.(e), t(O("toast.workflowLoadFailed", "Failed to load workflow."), "error"); } } - async function ct() { + async function ot() { let e = de.value; if (!e) t(O("toast.workflowMissingPath", "Workflow file path is missing."), "error"); else { @@ -7552,7 +7604,7 @@ var Do = ["title"], Oo = ["src"], ko = { } } } - let lt = P(() => (Array.isArray(ue.value?.nodes) ? ue.value.nodes : []).slice(0, Jl).map((e, t) => { + let ct = P(() => (Array.isArray(ue.value?.nodes) ? ue.value.nodes : []).slice(0, cu).map((e, t) => { let n = e?.id ?? e?.key ?? t + 1, r = Ye(e); return { key: String(n), @@ -7563,7 +7615,7 @@ var Do = ["title"], Oo = ["src"], ko = { type: r } }; - })), ut = P(() => Math.max(0, Number(dt.value.nodes || 0) - lt.value.length)), dt = P(() => { + })), ut = P(() => Math.max(0, Number(dt.value.nodes || 0) - ct.value.length)), dt = P(() => { let e = ue.value; return e ? { nodes: Array.isArray(e?.nodes) ? e.nodes.length : 0, @@ -7622,15 +7674,15 @@ var Do = ["title"], Oo = ["src"], ko = { let n = Math.max(1, e.clientWidth || 320), r = Math.max(1, e.clientHeight || 120), i = Math.max(1, Math.min(2, window.devicePixelRatio || 1)); e.width = Math.floor(n * i), e.height = Math.floor(r * i); let a = e.getContext("2d"); - a && a.setTransform(i, 0, 0, i, 0, 0), w = ia(e, t, { + a && a.setTransform(i, 0, 0, i, 0, 0), w = va(e, t, { ...b.value, view: x.value }) || null, re(w?.resolvedView); } - function _t(e) { - Ue(e); + function gt(e) { + Ke(e); } - function vt(e) { + function _t(e) { let t = o.value; if (!t) return null; let n = t.getBoundingClientRect?.(); @@ -7639,22 +7691,22 @@ var Do = ["title"], Oo = ["src"], ko = { y: Number(e?.clientY) - n.top } : null; } - function yt(e) { - let t = vt(e); + function vt(e) { + let t = _t(e); return !t || !w?.canvasToWorld ? null : { local: t, world: w.canvasToWorld(t.x, t.y) }; } function bt(e) { - let t = vt(e), n = t && w?.hitTestNode ? w.hitTestNode(t.x, t.y) : null, r = n?.id !== null && n?.id !== void 0 ? String(n.id) : null, i = x.value.hoveredNodeId !== null && x.value.hoveredNodeId !== void 0 ? String(x.value.hoveredNodeId) : null; + let t = _t(e), n = t && w?.hitTestNode ? w.hitTestNode(t.x, t.y) : null, r = n?.id !== null && n?.id !== void 0 ? String(n.id) : null, i = x.value.hoveredNodeId !== null && x.value.hoveredNodeId !== void 0 ? String(x.value.hoveredNodeId) : null; C.value = n?.label || "", r !== i && (x.value = { ...x.value, hoveredNodeId: r }, ht()); } function xt(e) { - e && (_t(e), x.value = { + e && (gt(e), x.value = { ...x.value, centerX: Number(e.x), centerY: Number(e.y) @@ -7662,12 +7714,12 @@ var Do = ["title"], Oo = ["src"], ko = { } function St(e) { if (Number(e?.button ?? 0) !== 0) return; - let t = yt(e); + let t = vt(e); t && (T = e.pointerId ?? 1, S.value = "grabbing", o.value?.setPointerCapture?.(T), xt(t.world), bt(e), e.preventDefault?.(), e.stopPropagation?.()); } function Ct(e) { if (T !== null && e.pointerId === T) { - let t = yt(e); + let t = vt(e); t && xt(t.world), e.preventDefault?.(), e.stopPropagation?.(); } else bt(e); } @@ -7678,9 +7730,9 @@ var Do = ["title"], Oo = ["src"], ko = { }, ht())); } function Tt(e) { - let t = yt(e), n = w?.resolvedView; + let t = vt(e), n = w?.resolvedView; if (!t || !n) return; - let r = E(Number(e?.deltaY) || 0, -240, 240), i = Math.exp(-r * .0025), a = E((Number(x.value.zoom) || 1) * i, Kl, ql); + let r = E(Number(e?.deltaY) || 0, -240, 240), i = Math.exp(-r * .0025), a = E((Number(x.value.zoom) || 1) * i, ou, su); if (Math.abs(a - (Number(x.value.zoom) || 1)) < .001) { e.preventDefault?.(), e.stopPropagation?.(); return; @@ -7694,37 +7746,37 @@ var Do = ["title"], Oo = ["src"], ko = { }, ht(), bt(e), e.preventDefault?.(), e.stopPropagation?.(); } function Et(e) { - let t = yt(e); - D(), t && _t(t.world), ht(), e.preventDefault?.(), e.stopPropagation?.(); + let t = vt(e); + D(), t && gt(t.world), ht(), e.preventDefault?.(), e.stopPropagation?.(); } - function At(e) { + function Dt(e) { b.value = { ...b.value, [e]: !b.value?.[e] }, le(b.value); } - function jt(e) { + function Ot(e) { a.some((t) => t.key === e) && (b.value = { ...b.value, size: e }, le(b.value)); } - return kt(() => { - o.value && typeof ResizeObserver == "function" && (te = new ResizeObserver(() => ht()), te.observe(o.value)), Xe(), Be(), ht(); - }), nt(ue, () => { + return Mt(() => { + o.value && typeof ResizeObserver == "function" && (te = new ResizeObserver(() => ht()), te.observe(o.value)), Xe(), k(), ht(); + }), at(ue, () => { D(), ht(); - }, { flush: "post" }), nt(de, () => { - d.value = null, Be(); - }, { immediate: !0 }), nt(We, () => { + }, { flush: "post" }), at(de, () => { + d.value = null, k(); + }, { immediate: !0 }), at(A, () => { Xe(); - }), nt(b, () => { + }), at(b, () => { ht(); }, { deep: !0, flush: "post" - }), nt(v, () => { + }), at(v, () => { ht(); - }, { flush: "post" }), it(() => { + }, { flush: "post" }), st(() => { try { te?.disconnect?.(); } catch (e) { @@ -7732,8 +7784,8 @@ var Do = ["title"], Oo = ["src"], ko = { } te = null, T = null; }), (e, t) => { - let n = et("MButton"), r = et("MTree"); - return ue.value ? (I(), z("div", Fc, [ + let n = rt("MButton"), r = rt("MTree"); + return ue.value ? (I(), z("div", Yc, [ t[18] ||= M("div", { style: { "font-size": "13px", "font-weight": "600", @@ -7742,8 +7794,8 @@ var Do = ["title"], Oo = ["src"], ko = { "text-transform": "uppercase", "letter-spacing": "0.5px" } }, " ComfyUI Workflow ", -1), - M("div", Ic, [ - M("div", Lc, R(pe.value), 1), + M("div", Xc, [ + M("div", Zc, R(pe.value), 1), de.value ? (I(), z("div", { key: 0, style: { @@ -7755,43 +7807,43 @@ var Do = ["title"], Oo = ["src"], ko = { "white-space": "nowrap" }, title: de.value - }, R(de.value), 9, Rc)) : N("", !0), - k.value.length ? (I(), z("div", zc, [(I(!0), z(j, null, F(k.value, (e) => (I(), z("span", { + }, R(de.value), 9, Qc)) : N("", !0), + Re.value.length ? (I(), z("div", $c, [(I(!0), z(j, null, F(Re.value, (e) => (I(), z("span", { key: e.key, - style: L(Re(e.tone)), + style: L(ze(e.tone)), title: e.label }, [M("i", { - class: Dt(e.icon), + class: At(e.icon), style: { "font-size": "10px", flex: "0 0 auto" } - }, null, 2), M("span", Vc, R(e.label), 1)], 12, Bc))), 128))])) : N("", !0) + }, null, 2), M("span", tl, R(e.label), 1)], 12, el))), 128))])) : N("", !0) ]), - M("div", Hc, [M("div", Uc, R(Ve.value), 1), dt.value.source ? (I(), z("div", Wc, R(dt.value.source), 1)) : N("", !0)]), - M("div", Gc, [ - me.value ? (I(), z("div", Kc, [t[3] ||= M("div", { style: { + M("div", nl, [M("div", rl, R(He.value), 1), dt.value.source ? (I(), z("div", il, R(dt.value.source), 1)) : N("", !0)]), + M("div", al, [ + me.value ? (I(), z("div", ol, [t[3] ||= M("div", { style: { "font-size": "10px", "font-weight": "700", color: "rgba(255,255,255,0.55)", "text-transform": "uppercase", "letter-spacing": "0.4px" - } }, "Task", -1), M("div", qc, R(me.value), 1)])) : N("", !0), - he.value ? (I(), z("div", Jc, [t[4] ||= M("div", { style: { + } }, "Task", -1), M("div", sl, R(me.value), 1)])) : N("", !0), + he.value ? (I(), z("div", cl, [t[4] ||= M("div", { style: { "font-size": "10px", "font-weight": "700", color: "rgba(255,255,255,0.55)", "text-transform": "uppercase", "letter-spacing": "0.4px" - } }, "Model", -1), M("div", Yc, R(he.value), 1)])) : N("", !0), - ve.value ? (I(), z("div", Xc, [t[5] ||= M("div", { style: { + } }, "Model", -1), M("div", ll, R(he.value), 1)])) : N("", !0), + ve.value ? (I(), z("div", ul, [t[5] ||= M("div", { style: { "font-size": "10px", "font-weight": "700", color: "rgba(255,255,255,0.55)", "text-transform": "uppercase", "letter-spacing": "0.4px" - } }, "Runs on", -1), M("div", Zc, R(ve.value), 1)])) : N("", !0), - Fe.value || Le.value ? (I(), z("div", Qc, [ + } }, "Runs on", -1), M("div", dl, R(ve.value), 1)])) : N("", !0), + Fe.value || Le.value ? (I(), z("div", fl, [ t[6] ||= M("div", { style: { "font-size": "10px", "font-weight": "700", @@ -7799,11 +7851,11 @@ var Do = ["title"], Oo = ["src"], ko = { "text-transform": "uppercase", "letter-spacing": "0.4px" } }, "Library", -1), - M("div", $c, R(Fe.value || Le.value), 1), - Fe.value && Le.value ? (I(), z("div", el, R(Le.value), 1)) : N("", !0) + M("div", pl, R(Fe.value || Le.value), 1), + Fe.value && Le.value ? (I(), z("div", ml, R(Le.value), 1)) : N("", !0) ])) : N("", !0) ]), - Se.value.length || we.value.length ? (I(), z("div", tl, [ + Se.value.length || we.value.length ? (I(), z("div", hl, [ t[7] ||= M("div", { style: { "font-size": "10px", "font-weight": "800", @@ -7831,7 +7883,7 @@ var Do = ["title"], Oo = ["src"], ko = { color: "#ffcdd2" } }, R(e), 1))), 128))], 4)) : N("", !0), - we.value.length ? (I(), z("div", nl, [(I(!0), z(j, null, F(we.value, (e) => (I(), z("span", { + we.value.length ? (I(), z("div", gl, [(I(!0), z(j, null, F(we.value, (e) => (I(), z("span", { key: `model-${e}`, style: { padding: "3px 7px", @@ -7843,7 +7895,7 @@ var Do = ["title"], Oo = ["src"], ko = { } }, R(e), 1))), 128))])) : N("", !0) ])) : N("", !0), - ye.value || be.value ? (I(), z("div", rl, [ye.value ? (I(), z("div", il, R(ye.value), 1)) : N("", !0), be.value ? (I(), z("div", { + ye.value || be.value ? (I(), z("div", _l, [ye.value ? (I(), z("div", vl, R(ye.value), 1)) : N("", !0), be.value ? (I(), z("div", { key: 1, style: L({ fontSize: "11px", @@ -7851,8 +7903,8 @@ var Do = ["title"], Oo = ["src"], ko = { marginTop: ye.value ? "7px" : "0" }) }, R(be.value), 5)) : N("", !0)])) : N("", !0), - M("div", al, [ - gt(n, { + M("div", yl, [ + yt(n, { type: "button", severity: "secondary", text: "", @@ -7870,12 +7922,12 @@ var Do = ["title"], Oo = ["src"], ko = { "justify-content": "center", gap: "7px" }, - onClick: at + onClick: Qe }, { - default: tt(() => [t[8] ||= M("i", { class: "pi pi-image" }, null, -1), M("span", null, R(B(O)("ctx.setWorkflowThumbnail", "Set workflow thumbnail")), 1)]), + default: it(() => [t[8] ||= M("i", { class: "pi pi-image" }, null, -1), M("span", null, R(B(O)("ctx.setWorkflowThumbnail", "Set workflow thumbnail")), 1)]), _: 1 }), - gt(n, { + yt(n, { type: "button", severity: "secondary", text: "", @@ -7893,12 +7945,12 @@ var Do = ["title"], Oo = ["src"], ko = { "justify-content": "center", gap: "7px" }, - onClick: st + onClick: $e }, { - default: tt(() => [t[9] ||= M("i", { class: "pi pi-search" }, null, -1), M("span", null, R(B(O)("ctx.inspect", "Inspect")), 1)]), + default: it(() => [t[9] ||= M("i", { class: "pi pi-search" }, null, -1), M("span", null, R(B(O)("ctx.inspect", "Inspect")), 1)]), _: 1 }), - gt(n, { + yt(n, { type: "button", severity: "secondary", text: "", @@ -7917,21 +7969,21 @@ var Do = ["title"], Oo = ["src"], ko = { "justify-content": "center", gap: "7px" }, - onClick: ct + onClick: ot }, { - default: tt(() => [M("i", { class: Dt(f.value ? "pi pi-spin pi-spinner" : "pi pi-check-circle") }, null, 2), M("span", null, R(f.value ? "Checking" : "Validate"), 1)]), + default: it(() => [M("i", { class: At(f.value ? "pi pi-spin pi-spinner" : "pi pi-check-circle") }, null, 2), M("span", null, R(f.value ? "Checking" : "Validate"), 1)]), _: 1 }, 8, ["disabled"]) ]), - p.value ? (I(), z("div", ol, [ - M("div", sl, [t[10] ||= M("div", { style: { + p.value ? (I(), z("div", bl, [ + M("div", xl, [t[10] ||= M("div", { style: { "font-size": "10px", "font-weight": "800", color: "#a5d6a7", "text-transform": "uppercase", "letter-spacing": "0.4px" - } }, "Workflow diagnostics", -1), M("div", cl, R(Me.value), 1)]), - ke.value.length || Ae.value.length ? (I(), z("div", ll, [ke.value.length ? (I(), z("div", ul, [(I(!0), z(j, null, F(ke.value, (e) => (I(), z("span", { + } }, "Workflow diagnostics", -1), M("div", Sl, R(Me.value), 1)]), + ke.value.length || Ae.value.length ? (I(), z("div", Cl, [ke.value.length ? (I(), z("div", wl, [(I(!0), z(j, null, F(ke.value, (e) => (I(), z("span", { key: `diag-node-${e}`, style: { padding: "3px 7px", @@ -7941,7 +7993,7 @@ var Do = ["title"], Oo = ["src"], ko = { "font-weight": "700", color: "#ffcdd2" } - }, " Missing node: " + R(e), 1))), 128))])) : N("", !0), Ae.value.length ? (I(), z("div", dl, [(I(!0), z(j, null, F(Ae.value, (e) => (I(), z("span", { + }, " Missing node: " + R(e), 1))), 128))])) : N("", !0), Ae.value.length ? (I(), z("div", Tl, [(I(!0), z(j, null, F(Ae.value, (e) => (I(), z("span", { key: `diag-model-${e}`, style: { padding: "3px 7px", @@ -7951,41 +8003,41 @@ var Do = ["title"], Oo = ["src"], ko = { "font-weight": "700", color: "#ffe0b2" } - }, " Missing model: " + R(e), 1))), 128))])) : N("", !0)])) : (I(), z("div", fl, " No missing dependencies detected by the current ComfyUI runtime. ")), - je.value.length ? (I(), z("div", pl, R(je.value.join(" | ")), 1)) : N("", !0), - Ne.value || Pe.value ? (I(), z("div", ml, [Qe(" Latest version: " + R(Ne.value || "none"), 1), Pe.value ? (I(), z("span", hl, " | Diff: " + R(Pe.value), 1)) : N("", !0)])) : N("", !0) + }, " Missing model: " + R(e), 1))), 128))])) : N("", !0)])) : (I(), z("div", El, " No missing dependencies detected by the current ComfyUI runtime. ")), + je.value.length ? (I(), z("div", Dl, R(je.value.join(" | ")), 1)) : N("", !0), + Ne.value || Pe.value ? (I(), z("div", Ol, [tt(" Latest version: " + R(Ne.value || "none"), 1), Pe.value ? (I(), z("span", kl, " | Diff: " + R(Pe.value), 1)) : N("", !0)])) : N("", !0) ])) : N("", !0), - M("div", gl, [ - M("div", _l, [t[11] ||= M("div", { style: { + M("div", Al, [ + M("div", jl, [t[11] ||= M("div", { style: { "font-size": "10px", "font-weight": "700", color: "rgba(255,255,255,0.55)", "text-transform": "uppercase", "letter-spacing": "0.4px" - } }, "Nodes", -1), M("div", vl, R(dt.value.nodes), 1)]), - M("div", yl, [t[12] ||= M("div", { style: { + } }, "Nodes", -1), M("div", Ml, R(dt.value.nodes), 1)]), + M("div", Nl, [t[12] ||= M("div", { style: { "font-size": "10px", "font-weight": "700", color: "rgba(255,255,255,0.55)", "text-transform": "uppercase", "letter-spacing": "0.4px" - } }, "Links", -1), M("div", bl, R(dt.value.links), 1)]), - M("div", xl, [t[13] ||= M("div", { style: { + } }, "Links", -1), M("div", Pl, R(dt.value.links), 1)]), + M("div", Fl, [t[13] ||= M("div", { style: { "font-size": "10px", "font-weight": "700", color: "rgba(255,255,255,0.55)", "text-transform": "uppercase", "letter-spacing": "0.4px" - } }, "Groups", -1), M("div", Sl, R(dt.value.groups), 1)]) + } }, "Groups", -1), M("div", Il, R(dt.value.groups), 1)]) ]), - fe.value ? (I(), z("div", Cl, [M("div", wl, [M("div", Tl, [t[14] ||= M("div", { style: { + fe.value ? (I(), z("div", Ll, [M("div", Rl, [M("div", zl, [t[14] ||= M("div", { style: { "font-size": "10px", "font-weight": "700", color: "rgba(255,255,255,0.55)", "text-transform": "uppercase", "letter-spacing": "0.4px" } }, "Category", -1), M("div", { - title: We.value || "Root", + title: A.value || "Root", style: { "font-size": "12px", color: "rgba(255,255,255,0.8)", @@ -7995,9 +8047,9 @@ var Do = ["title"], Oo = ["src"], ko = { "white-space": "nowrap", "max-width": "100%" } - }, R(Ke.value), 9, El)]), qe.value.length ? (I(), z("div", { + }, R(Ge.value), 9, Bl)]), qe.value.length ? (I(), z("div", { key: 0, - title: We.value, + title: A.value, style: { display: "flex", "flex-wrap": "wrap", @@ -8023,7 +8075,7 @@ var Do = ["title"], Oo = ["src"], ko = { "text-overflow": "ellipsis", "white-space": "nowrap" } - }, R(e), 1))), 128))], 8, Dl)) : N("", !0)]), M("div", Ol, [ot(M("input", { + }, R(e), 1))), 128))], 8, Vl)) : N("", !0)]), M("div", Hl, [lt(M("input", { "onUpdate:modelValue": t[0] ||= (e) => s.value = e, type: "text", placeholder: B(O)("dialog.workflowCategory", "Workflow category"), @@ -8037,7 +8089,7 @@ var Do = ["title"], Oo = ["src"], ko = { color: "rgba(255,255,255,0.92)", "font-size": "12px" } - }, null, 8, kl), [[Ot, s.value]]), gt(n, { + }, null, 8, Ul), [[jt, s.value]]), yt(n, { type: "button", severity: "secondary", text: "", @@ -8054,15 +8106,15 @@ var Do = ["title"], Oo = ["src"], ko = { fontWeight: "700", whiteSpace: "nowrap" }), - onClick: rt + onClick: Ze }, { - default: tt(() => [Qe(R(c.value ? "Saving..." : "Move"), 1)]), + default: it(() => [tt(R(c.value ? "Saving..." : "Move"), 1)]), _: 1 }, 8, ["disabled", "style"])])])) : N("", !0), - lt.value.length ? (I(), z("div", Al, [ + ct.value.length ? (I(), z("div", Wl, [ t[15] ||= M("div", { class: "mjr-section-title" }, " Workflow Nodes ", -1), - gt(r, { - value: lt.value, + yt(r, { + value: ct.value, class: "mjr-workflow-tree", "scroll-height": "180px", pt: { @@ -8074,16 +8126,16 @@ var Do = ["title"], Oo = ["src"], ko = { nodeLabel: { class: "mjr-workflow-tree-label" } } }, { - default: tt(({ node: e }) => [M("span", jl, [ - M("span", Ml, R(e.label), 1), - e.data?.type ? (I(), z("span", Nl, R(e.data.type), 1)) : N("", !0), - M("span", Pl, "#" + R(e.data?.id), 1) + default: it(({ node: e }) => [M("span", Gl, [ + M("span", Kl, R(e.label), 1), + e.data?.type ? (I(), z("span", ql, R(e.data.type), 1)) : N("", !0), + M("span", Jl, "#" + R(e.data?.id), 1) ])]), _: 1 }, 8, ["value"]), - ut.value ? (I(), z("div", Fl, " +" + R(ut.value) + " more nodes ", 1)) : N("", !0) + ut.value ? (I(), z("div", Yl, " +" + R(ut.value) + " more nodes ", 1)) : N("", !0) ])) : N("", !0), - M("div", Il, [M("div", Ll, [(I(!0), z(j, null, F(B(a), (e) => (I(), $e(n, { + M("div", Xl, [M("div", Zl, [(I(!0), z(j, null, F(B(a), (e) => (I(), nt(n, { key: e.key, type: "button", severity: "secondary", @@ -8101,15 +8153,15 @@ var Do = ["title"], Oo = ["src"], ko = { fontWeight: b.value.size === e.key ? "700" : "600", cursor: "pointer" }), - onClick: (t) => jt(e.key) + onClick: (t) => Ot(e.key) }, { - default: tt(() => [Qe(R(e.label), 1)]), + default: it(() => [tt(R(e.label), 1)]), _: 2 }, 1032, [ "title", "style", "onClick" - ]))), 128))]), gt(n, { + ]))), 128))]), yt(n, { type: "button", class: "mjr-btn mjr-icon-btn", severity: "secondary", @@ -8130,10 +8182,10 @@ var Do = ["title"], Oo = ["src"], ko = { }, onClick: t[1] ||= (e) => v.value = !v.value }, { - default: tt(() => [...t[16] ||= [M("i", { class: "pi pi-sliders-h" }, null, -1)]]), + default: it(() => [...t[16] ||= [M("i", { class: "pi pi-sliders-h" }, null, -1)]]), _: 1 }, 8, ["title"])]), - v.value ? (I(), z("div", Rl, [(I(!0), z(j, null, F(mt.value, (e) => (I(), $e(n, { + v.value ? (I(), z("div", Ql, [(I(!0), z(j, null, F(mt.value, (e) => (I(), nt(n, { key: e.key, type: "button", severity: "secondary", @@ -8150,9 +8202,9 @@ var Do = ["title"], Oo = ["src"], ko = { color: "rgba(255,255,255,0.92)", textAlign: "left" }), - onClick: (t) => At(e.key) + onClick: (t) => Dt(e.key) }, { - default: tt(() => [ + default: it(() => [ M("span", { style: L({ width: "22px", height: "22px", @@ -8171,18 +8223,18 @@ var Do = ["title"], Oo = ["src"], ko = { }) }, null, 4)], 4), M("i", { - class: Dt(e.iconClass), + class: At(e.iconClass), style: { "font-size": "18px", opacity: "0.9", width: "18px" } }, null, 2), - M("div", zl, [M("div", Bl, R(e.label), 1), M("div", Vl, R(b.value?.[e.key] ? "On" : "Off"), 1)]) + M("div", $l, [M("div", eu, R(e.label), 1), M("div", tu, R(b.value?.[e.key] ? "On" : "Off"), 1)]) ]), _: 2 }, 1032, ["style", "onClick"]))), 128))])) : N("", !0), - M("div", Hl, [M("canvas", { + M("div", nu, [M("canvas", { ref_key: "canvasRef", ref: o, style: L({ @@ -8204,7 +8256,7 @@ var Do = ["title"], Oo = ["src"], ko = { onWheel: Tt, onDblclick: Et }, null, 36)]), - M("div", Ul, [M("span", null, R(C.value || "Click/drag to navigate | wheel to zoom"), 1), M("span", null, R(Math.round((x.value.zoom || 1) * 100)) + "% | " + R(ft.value.label), 1)]), + M("div", ru, [M("span", null, R(C.value || "Click/drag to navigate | wheel to zoom"), 1), M("span", null, R(Math.round((x.value.zoom || 1) * 100)) + "% | " + R(ft.value.label), 1)]), M("details", { open: y.value, style: { "margin-top": "10px" }, @@ -8214,9 +8266,9 @@ var Do = ["title"], Oo = ["src"], ko = { color: "var(--mjr-muted, rgba(255,255,255,0.65))", "font-size": "12px", "user-select": "none" - } }, " Show raw JSON ", -1), M("pre", Gl, R(He.value), 1)], 40, Wl) + } }, " Show raw JSON ", -1), M("pre", au, R(Ue.value), 1)], 40, iu) ])) : N("", !0); }; } }); -export { qt as $, di as A, Tr as B, Bi as C, Ii as D, Li as E, Qr as F, Or as G, jr as H, Xr as I, Er as J, Ar as K, Lr as L, wi as M, ui as N, Ei as O, Ci as P, K as Q, Fr as R, Ji as S, Fi as T, Y as U, Pr as V, Dr as W, yr as X, br as Y, ln as Z, X as _, Na as a, qi as b, ja as c, Ea as d, G as et, Ta as f, ha as g, ga as h, Ba as i, fi as j, Di as k, Aa as l, _a as m, Pc as n, Pa as o, Da as p, Mr as q, Eo as r, ka as s, Yl as t, ba as u, ia as v, zi as w, Gi as x, ma as y, Ir as z }; +export { fn as $, Ti as A, zr as B, ea as C, Xi as D, Zi as E, fi as F, Hr as G, Gr as H, ui as I, Br as J, Wr as K, Zr as L, Ri as M, wi as N, Bi as O, Li as P, Cn as Q, Yr as R, ca as S, Yi as T, Y as U, Jr as V, Vr as W, Nr as X, Pr as Y, Sn as Z, X as _, qa as a, sa as b, Ga as c, Ba as d, K as et, za as f, ka as g, Aa as h, eo as i, Ei as j, Vi as k, Wa as l, ja as m, Jc as n, G as nt, Ja as o, Va as p, Kr as q, Bo as r, Ua as s, lu as t, Xt as tt, Pa as u, va as v, $i as w, aa as x, Oa as y, Xr as z }; diff --git a/dist/chunks/TagsEditor-7DAMS3OV.js b/dist/chunks/TagsEditor-CPV0rYyM.js similarity index 74% rename from dist/chunks/TagsEditor-7DAMS3OV.js rename to dist/chunks/TagsEditor-CPV0rYyM.js index 6c97a968..a4fd667f 100644 --- a/dist/chunks/TagsEditor-7DAMS3OV.js +++ b/dist/chunks/TagsEditor-CPV0rYyM.js @@ -1,12 +1,12 @@ -import { $t as e, F as t, v as n } from "./viewerRuntimeHosts-DQcoOjsY.js"; -import { St as r, m as i, n as a } from "./events-DxfljH4A.js"; -import { Y as o } from "./Viewer-DI9upE3v.js"; -import { A as s, C as c, E as l, G as u, J as d, K as f, L as ee, N as p, R as te, T as m, U as ne, V as h, Y as g, b as _, ft as v, j as y, k as b, lt as x, rt as S, ut as C, z as w } from "./mjr-primevue-BRqtdXzb.js"; +import { $t as e, F as t, v as n } from "./viewerRuntimeHosts-D3Jyfx0-.js"; +import { m as r, n as i, wt as a } from "./events-BRfpU-6M.js"; +import { Y as o } from "./Viewer-geJFRz8N.js"; +import { A as s, C as c, E as l, G as u, J as d, K as f, L as p, N as m, R as ee, T as h, U as te, V as g, Y as _, b as ne, ft as v, j as y, k as b, lt as x, rt as S, ut as C, z as w } from "./mjr-primevue-BRqtdXzb.js"; // ui/vue/components/common/TagsEditor.vue?vue&type=script&setup=true&lang.ts -var T = ["aria-busy"], E = ["aria-label"], re = { +var T = ["aria-busy"], re = ["aria-label"], ie = { key: 0, class: "mjr-tags-empty" -}, ie = { class: "mjr-tags-input-wrap" }, ae = ["aria-selected", "onMouseenter"], oe = 100, D = 200, O = /* @__PURE__ */ p({ +}, ae = { class: "mjr-tags-input-wrap" }, oe = ["aria-selected", "onMouseenter"], se = 100, E = 200, D = /* @__PURE__ */ m({ __name: "TagsEditor", props: { asset: {}, @@ -14,11 +14,11 @@ var T = ["aria-busy"], E = ["aria-label"], re = { disabled: { type: Boolean } }, emits: ["update:modelValue", "tags-change"], - setup(p, { emit: O }) { - function se(e) { + setup(m, { emit: D }) { + function O(e) { try { let t = String(e ?? "").trim(); - if (!t || t.length > oe) return null; + if (!t || t.length > se) return null; for (let e = 0; e < t.length; e += 1) { let n = t.charCodeAt(e); if (n <= 31 || n === 127) return null; @@ -45,7 +45,7 @@ var T = ["aria-busy"], E = ["aria-label"], re = { let e = k(r); if (!e) continue; let i = e.toLowerCase(); - if (!n.has(i) && (n.add(i), t.push(e), t.length >= D)) break; + if (!n.has(i) && (n.add(i), t.push(e), t.length >= E)) break; } return t; } @@ -68,7 +68,7 @@ var T = ["aria-busy"], E = ["aria-label"], re = { for (let n = 0; n < e.length; n += 1) if (e[n] !== t[n]) return !1; return !0; } - let N = p, P = O, F = M(N.asset?.tags ?? N.modelValue ?? []), I = S([...F]), L = S(null), R = S(""), z = S(!1), B = S(-1), V = S(null), H = S([]), U = S(!1), W = (e) => e?.$el || e || null, G = !1, K = !1, q = null, J = [...F], le = (e) => Math.min(100 * 2 ** Math.max(0, e - 1), 2e3), ue = (e) => new Promise((t) => setTimeout(t, e)), de = () => setTimeout(() => z.value = !1, 200), Y = m(() => { + let N = m, P = D, F = M(N.asset?.tags ?? N.modelValue ?? []), I = S([...F]), L = S(null), R = S(""), z = S(!1), B = S(-1), V = S(null), H = S([]), U = S(!1), W = (e) => e?.$el || e || null, G = !1, K = !1, q = null, J = [...F], le = (e) => Math.min(100 * 2 ** Math.max(0, e - 1), 2e3), ue = (e) => new Promise((t) => setTimeout(t, e)), de = () => setTimeout(() => z.value = !1, 200), Y = h(() => { let e = R.value.toLowerCase().trim(); if (!e) return []; let t = new Set(I.value.map((e) => A(e)).filter(Boolean)); @@ -76,7 +76,7 @@ var T = ["aria-busy"], E = ["aria-label"], re = { let r = A(n); return n.toLowerCase().includes(e) && (!r || !t.has(r)); }).slice(0, 10); - }), X = m(() => Y.value.length > 0); + }), X = h(() => Y.value.length > 0); function Z(e) { if (G) return; let t = M(e); @@ -87,7 +87,7 @@ var T = ["aria-busy"], E = ["aria-label"], re = { P("update:modelValue", t), P("tags-change", { assetId: N.asset?.id, tags: t - }), o(a, { + }), o(i, { assetId: n, tags: t }); @@ -107,11 +107,11 @@ var T = ["aria-busy"], E = ["aria-label"], re = { let n = 0; for (; n < 10;) { n > 0 && await ue(le(n)), n += 1; - let a = M(I.value), o = typeof AbortController < "u" ? new AbortController() : null; + let i = M(I.value), o = typeof AbortController < "u" ? new AbortController() : null; q = o; let s = null; try { - s = await t(N.asset, a, o ? { signal: o.signal } : {}); + s = await t(N.asset, i, o ? { signal: o.signal } : {}); } catch (e) { console.error("Failed to update tags:", e); } @@ -124,23 +124,23 @@ var T = ["aria-busy"], E = ["aria-label"], re = { break; } let t = [...J]; - I.value = t, P("update:modelValue", t), e(s?.error || i("toast.tagsUpdateFailed", "Failed to update tags"), "error"), G = !1, q = null, U.value = !1; + I.value = t, P("update:modelValue", t), e(s?.error || r("toast.tagsUpdateFailed", "Failed to update tags"), "error"), G = !1, q = null, U.value = !1; return; } try { let e = s?.data?.asset_id ?? null; - e != null && !r(N.asset.id) && (N.asset.id = e); + e != null && !a(N.asset.id) && (N.asset.id = e); } catch (e) { console.debug?.(e); } - let c = M(Array.isArray(s?.data?.tags) ? s.data.tags : a); + let c = M(Array.isArray(s?.data?.tags) ? s.data.tags : i); J = [...c]; try { N.asset.tags = [...c]; } catch (e) { console.debug?.(e); } - if (K || (I.value = [...c]), fe(c), e(i("toast.tagsUpdated", "Tags updated"), "success", 1e3), !K) break; + if (K || (I.value = [...c]), fe(c), e(r("toast.tagsUpdated", "Tags updated"), "success", 1e3), !K) break; K = !1; } if (n >= 10) { @@ -151,13 +151,13 @@ var T = ["aria-busy"], E = ["aria-label"], re = { } catch (e) { console.debug?.(e); } - P("update:modelValue", t), e(i("toast.tagsUpdateFailed", "Failed to update tags"), "error"); + P("update:modelValue", t), e(r("toast.tagsUpdateFailed", "Failed to update tags"), "error"); } G = !1, q = null, U.value = !1; } w(async () => { try { - await ee(), W(L.value)?.focus(); + await p(), W(L.value)?.focus(); } catch (e) { console.debug?.(e); } @@ -167,7 +167,7 @@ var T = ["aria-busy"], E = ["aria-label"], re = { } catch (e) { console.warn("Failed to load available tags:", e); } - }), te(() => { + }), ee(() => { try { q?.abort?.(); } catch (e) { @@ -176,10 +176,10 @@ var T = ["aria-busy"], E = ["aria-label"], re = { }); function $(t) { if (N.disabled) return; - let n = se(t); + let n = O(t); if (!n) return; - let r = A(n); - r && (I.value.some((e) => A(e) === r) || (I.value.length >= D ? e(i("toast.maxTagsReached", "Maximum number of tags reached"), "warning") : (I.value = [...I.value, n], Q()))); + let i = A(n); + i && (I.value.some((e) => A(e) === i) || (I.value.length >= E ? e(r("toast.maxTagsReached", "Maximum number of tags reached"), "warning") : (I.value = [...I.value, n], Q()))); } function pe(e) { if (N.disabled || e < 0 || e >= I.value.length) return; @@ -212,15 +212,15 @@ var T = ["aria-busy"], E = ["aria-label"], re = { }), f(() => N.asset?.tags, (e) => { Z(e); }), (e, t) => { - let n = u("MButton"), r = u("MInputText"), a = u("MListbox"); - return h(), b("div", { - class: C(["mjr-tags-editor", { "is-disabled": p.disabled }]), + let n = u("MButton"), i = u("MInputText"), a = u("MListbox"); + return g(), b("div", { + class: C(["mjr-tags-editor", { "is-disabled": m.disabled }]), "aria-busy": U.value }, [l("div", { class: "mjr-tags-display", role: "list", - "aria-label": x(i)("tags.label", "Tags") - }, [I.value.length === 0 ? (h(), b("span", re, v(x(i)("msg.noTagsYet", "No tags yet...")), 1)) : (h(!0), b(c, { key: 1 }, ne(I.value, (e, r) => (h(), b("div", { + "aria-label": x(r)("tags.label", "Tags") + }, [I.value.length === 0 ? (g(), b("span", ie, v(x(r)("msg.noTagsYet", "No tags yet...")), 1)) : (g(!0), b(c, { key: 1 }, te(I.value, (e, i) => (g(), b("div", { key: e, class: "mjr-tag-chip", role: "listitem" @@ -230,9 +230,9 @@ var T = ["aria-busy"], E = ["aria-label"], re = { severity: "secondary", text: "", rounded: "", - "aria-label": x(i)("tags.remove", "Remove tag"), - disabled: p.disabled, - onClick: (e) => pe(r) + "aria-label": x(r)("tags.remove", "Remove tag"), + disabled: m.disabled, + onClick: (e) => pe(i) }, { default: d(() => [...t[4] ||= [s(" x ", -1)]]), _: 1 @@ -240,16 +240,16 @@ var T = ["aria-busy"], E = ["aria-label"], re = { "aria-label", "disabled", "onClick" - ])]))), 128))], 8, E), l("div", ie, [y(r, { + ])]))), 128))], 8, re), l("div", ae, [y(i, { ref_key: "inputRef", ref: L, modelValue: R.value, "onUpdate:modelValue": t[0] ||= (e) => R.value = e, type: "text", class: "mjr-tag-input", - placeholder: x(i)("sidebar.addTag", "Add tag..."), - disabled: p.disabled, - "aria-label": x(i)("tags.addLabel", "Add tag"), + placeholder: x(r)("sidebar.addTag", "Add tag..."), + disabled: m.disabled, + "aria-label": x(r)("tags.addLabel", "Add tag"), "aria-autocomplete": X.value ? "list" : "none", "aria-expanded": z.value, "aria-haspopup": X.value ? "listbox" : void 0, @@ -265,27 +265,27 @@ var T = ["aria-busy"], E = ["aria-label"], re = { "aria-autocomplete", "aria-expanded", "aria-haspopup" - ]), g(y(a, { + ]), _(y(a, { modelValue: V.value, "onUpdate:modelValue": t[3] ||= (e) => V.value = e, options: Y.value, class: "mjr-tags-dropdown", "scroll-height": "150px", - "aria-label": x(i)("tags.suggestions", "Tag suggestions"), + "aria-label": x(r)("tags.suggestions", "Tag suggestions"), onChange: ge }, { option: d(({ option: e, index: t }) => [l("div", { class: C(["mjr-tag-suggestion", { "is-active": t === B.value }]), "aria-selected": t === B.value, onMouseenter: (e) => B.value = t - }, v(e), 43, ae)]), + }, v(e), 43, oe)]), _: 1 }, 8, [ "modelValue", "options", "aria-label" - ]), [[_, z.value && X.value]])])], 10, T); + ]), [[ne, z.value && X.value]])])], 10, T); }; } }); -export { O as t }; +export { D as t }; diff --git a/dist/chunks/Viewer-DI9upE3v.js b/dist/chunks/Viewer-geJFRz8N.js similarity index 96% rename from dist/chunks/Viewer-DI9upE3v.js rename to dist/chunks/Viewer-geJFRz8N.js index 287e6f92..f60897c3 100644 --- a/dist/chunks/Viewer-DI9upE3v.js +++ b/dist/chunks/Viewer-geJFRz8N.js @@ -1,9 +1,9 @@ -import { $t as e, H as t, P as n, _ as r, c as i, d as a, g as o, gt as s, n as c, o as l, r as u, s as d, vt as f, x as p, y as m } from "./viewerRuntimeHosts-DQcoOjsY.js"; -import { Ct as h, D as g, a as _, ct as v, h as y, i as b, j as x, k as S, m as C, n as w, o as T, pt as E, r as D, rt as O, t as k } from "./events-DxfljH4A.js"; +import { $t as e, H as t, P as n, _ as r, c as i, d as a, g as o, gt as s, n as c, o as l, r as u, s as d, vt as f, x as p, y as m } from "./viewerRuntimeHosts-D3Jyfx0-.js"; +import { D as h, Tt as g, a as _, at as v, h as y, ht as b, i as x, j as S, k as C, m as w, n as T, o as E, r as D, t as O, ut as k } from "./events-BRfpU-6M.js"; import { T as A, nt as j, rt as M } from "./mjr-primevue-BRqtdXzb.js"; import { n as N, r as ee } from "./mjr-vue-vendor-mHY_eIVE.js"; import { n as P, r as te, t as F } from "./state-D0Gu1AgG.js"; -import { a as ne, c as re, i as ie, o as ae, r as oe, s as se } from "./model3dRenderer-k0ey48io.js"; +import { a as ne, c as re, i as ie, o as ae, r as oe, s as se } from "./model3dRenderer-DdPKugXy.js"; // ui/utils/events.ts function ce(e, t, { target: n = null, warnPrefix: r = "[Majoor]" } = {}) { let i = n || (typeof window < "u" ? window : null); @@ -95,7 +95,7 @@ var le = async (e, t = "Majoor", n = {}) => { justifyContent: "flex-end", gap: "10px" } }, [U("button", { - textContent: C("dialog.confirm", "Confirm"), + textContent: w("dialog.confirm", "Confirm"), onclick: () => { try { r.close(); @@ -135,7 +135,7 @@ var le = async (e, t = "Majoor", n = {}) => { let n = de(); if (n) try { let r = { - title: String(t || C("dialog.confirm", "Confirm")), + title: String(t || w("dialog.confirm", "Confirm")), message: String(e || "") }; return !!(typeof n.confirm == "function" && await n.confirm(r)); @@ -191,7 +191,7 @@ var le = async (e, t = "Majoor", n = {}) => { justifyContent: "flex-end", gap: "10px" } }, [U("button", { - textContent: C("dialog.cancel", "Cancel"), + textContent: w("dialog.cancel", "Cancel"), onclick: () => a(!1), style: { padding: "10px 16px", @@ -203,7 +203,7 @@ var le = async (e, t = "Majoor", n = {}) => { cursor: "pointer" } }), U("button", { - textContent: C("dialog.confirm", "Confirm"), + textContent: w("dialog.confirm", "Confirm"), onclick: () => a(!0), style: { padding: "10px 16px", @@ -230,7 +230,7 @@ var le = async (e, t = "Majoor", n = {}) => { let r = de(); if (r) try { let i = { - title: String(n || C("dialog.prompt", "Prompt")), + title: String(n || w("dialog.prompt", "Prompt")), message: String(e || ""), defaultValue: String(t ?? "") }, a = typeof r.prompt == "function" ? await r.prompt(i) : null; @@ -299,7 +299,7 @@ var le = async (e, t = "Majoor", n = {}) => { justifyContent: "flex-end", gap: "10px" } }, [U("button", { - textContent: C("dialog.cancel", "Cancel"), + textContent: w("dialog.cancel", "Cancel"), onclick: () => o(null), style: { padding: "8px 12px", @@ -310,7 +310,7 @@ var le = async (e, t = "Majoor", n = {}) => { cursor: "pointer" } }), U("button", { - textContent: C("dialog.ok", "OK"), + textContent: w("dialog.ok", "OK"), onclick: () => o(s.value), style: { padding: "8px 12px", @@ -340,14 +340,14 @@ var le = async (e, t = "Majoor", n = {}) => { }); }, ue = () => { try { - return x()?.ui || null; + return S()?.ui || null; } catch { return null; } }, de = () => { let e = (e) => !!e && (typeof e.alert == "function" || typeof e.confirm == "function" || typeof e.prompt == "function"); try { - let t = g(); + let t = h(); if (e(t)) return t; } catch (e) { console.debug?.(e); @@ -355,7 +355,7 @@ var le = async (e, t = "Majoor", n = {}) => { return null; }, R = () => { try { - let e = S(); + let e = C(); if (e && typeof e.add == "function") return e; } catch (e) { console.debug?.(e); @@ -1310,7 +1310,7 @@ async function pt(e) { } // ui/utils/deleteGuard.ts async function mt(e, t) { - return !T.DELETE_CONFIRMATION || !!await I(e > 1 ? C("dialog.deleteSelectedFiles", "Delete {count} selected files?", { count: e }) : C("dialog.deleteSingleFile", "Delete \"{label}\"?", { label: String(t || C("label.thisFile", "this file")) }), C("dialog.confirmDeleteTitle", "Majoor: Confirm delete")); + return !E.DELETE_CONFIRMATION || !!await I(e > 1 ? w("dialog.deleteSelectedFiles", "Delete {count} selected files?", { count: e }) : w("dialog.deleteSingleFile", "Delete \"{label}\"?", { label: String(t || w("label.thisFile", "this file")) }), w("dialog.confirmDeleteTitle", "Majoor: Confirm delete")); } // ui/features/collections/contextmenu/addToCollectionMenuState.ts var ht = j({ @@ -1341,7 +1341,7 @@ function yt(e) { filename: e.filename || "", subfolder: e.subfolder || "", type: (e.type || "output").toLowerCase(), - root_id: h(e), + root_id: g(e), kind: e.kind || "" } : null; } @@ -1351,7 +1351,7 @@ async function bt({ x: t, y: n, assets: r }) { x: Number(t) || 0, y: Number(n) || 0, assets: i - }) : e(C("toast.noValidAssetsSelected", "No valid assets selected."), "warning"); + }) : e(w("toast.noValidAssetsSelected", "No valid assets selected."), "warning"); } // ui/features/contextmenu/ratingUpdater.ts var xt = 350, St = /* @__PURE__ */ new Map(); @@ -1422,7 +1422,7 @@ function Ot(e, t, n, { setAriaLabel: r = !0, ariaLabel: i = null } = {}) { var kt = () => {}; function At(e) { try { - return !!T?.[e]; + return !!E?.[e]; } catch { return !1; } @@ -1617,14 +1617,14 @@ function Zt(e, t) { let r = document.createElement("div"); r.className = "mjr-video-controls mjr-video-controls--preview"; try { - r.setAttribute("role", "group"), r.setAttribute("aria-label", C("video.previewControls", "Video preview controls")); + r.setAttribute("role", "group"), r.setAttribute("aria-label", w("video.previewControls", "Video preview controls")); } catch (e) { console.debug?.(e); } let i = document.createElement("button"); - i.type = "button", i.className = "mjr-video-preview-btn", i.title = C("video.playPause", "Play/Pause"); + i.type = "button", i.className = "mjr-video-preview-btn", i.title = w("video.playPause", "Play/Pause"); try { - i.setAttribute("aria-label", C("video.playPause", "Play/Pause")); + i.setAttribute("aria-label", w("video.playPause", "Play/Pause")); } catch (e) { console.debug?.(e); } @@ -1712,7 +1712,7 @@ function Qt(e, t = {}) { window.getComputedStyle?.(c)?.position === "static" && (c.style.position = "relative"); }); let l = document.createElement("div"); - l.className = `mjr-video-controls mjr-video-controls--${n}`, i && l.classList.add("mjr-video-controls--modern"), r && l.classList.add("mjr-video-controls--audio"), l.dataset.mjrLayout = "regular", l.setAttribute("role", "group"), l.setAttribute("aria-label", r ? C("video.audioControls", "Audio controls") : C("video.controls", "Video controls")); + l.className = `mjr-video-controls mjr-video-controls--${n}`, i && l.classList.add("mjr-video-controls--modern"), r && l.classList.add("mjr-video-controls--audio"), l.dataset.mjrLayout = "regular", l.setAttribute("role", "group"), l.setAttribute("aria-label", r ? w("video.audioControls", "Audio controls") : w("video.controls", "Video controls")); let u = document.createElement("div"); u.className = "mjr-video-row mjr-video-row--top"; let d = document.createElement("div"); @@ -1720,7 +1720,7 @@ function Qt(e, t = {}) { let f = document.createElement("div"); f.className = "mjr-video-seek-wrap"; let p = document.createElement("input"); - p.className = "mjr-video-range mjr-video-range--seek", p.type = "range", p.min = "0", p.max = String(Rt), p.step = "1", p.value = "0", p.setAttribute("aria-label", C("video.seek", "Seek")), p.title = r ? C("video.seekThroughAudio", "Seek through audio") : C("video.seekThrough", "Seek through video"); + p.className = "mjr-video-range mjr-video-range--seek", p.type = "range", p.min = "0", p.max = String(Rt), p.step = "1", p.value = "0", p.setAttribute("aria-label", w("video.seek", "Seek")), p.title = r ? w("video.seekThroughAudio", "Seek through audio") : w("video.seekThrough", "Seek through video"); let m = document.createElement("div"); m.className = "mjr-video-seek-overlay"; let h = null, g = null, _ = null, v = null; @@ -1733,16 +1733,16 @@ function Qt(e, t = {}) { x.className = "mjr-video-seek-mark mjr-video-seek-mark--in"; let S = document.createElement("div"); S.className = "mjr-video-seek-mark mjr-video-seek-mark--out"; - let w = document.createElement("div"); - w.className = "mjr-video-seek-playhead"; + let C = document.createElement("div"); + C.className = "mjr-video-seek-playhead"; let T = document.createElement("div"); - T.className = "mjr-video-seek-playhead-label", m.appendChild(y), m.appendChild(b), m.appendChild(w), m.appendChild(T); + T.className = "mjr-video-seek-playhead-label", m.appendChild(y), m.appendChild(b), m.appendChild(C), m.appendChild(T); let E = document.createElement("div"); - E.className = "mjr-video-seek-handle mjr-video-seek-handle--in", E.title = C("video.dragSetIn", "Drag to set In"), E.setAttribute("aria-label", C("video.dragSetIn", "Drag to set In")); + E.className = "mjr-video-seek-handle mjr-video-seek-handle--in", E.title = w("video.dragSetIn", "Drag to set In"), E.setAttribute("aria-label", w("video.dragSetIn", "Drag to set In")); let D = document.createElement("div"); - D.className = "mjr-video-seek-handle mjr-video-seek-handle--out", D.title = C("video.dragSetOut", "Drag to set Out"), D.setAttribute("aria-label", C("video.dragSetOut", "Drag to set Out")), f.appendChild(p), h && f.appendChild(h), f.appendChild(m), o && (f.appendChild(x), f.appendChild(S), f.appendChild(E), f.appendChild(D)); + D.className = "mjr-video-seek-handle mjr-video-seek-handle--out", D.title = w("video.dragSetOut", "Drag to set Out"), D.setAttribute("aria-label", w("video.dragSetOut", "Drag to set Out")), f.appendChild(p), h && f.appendChild(h), f.appendChild(m), o && (f.appendChild(x), f.appendChild(S), f.appendChild(E), f.appendChild(D)); let O = document.createElement("span"); - O.className = "mjr-video-time", O.textContent = "0:00 / 0:00", O.title = C("video.currentTimeTotal", "Current time / Total duration"); + O.className = "mjr-video-time", O.textContent = "0:00 / 0:00", O.title = w("video.currentTimeTotal", "Current time / Total duration"); let k = document.createElement("span"); k.className = "mjr-video-range-count", k.textContent = ""; try { @@ -1753,37 +1753,37 @@ function Qt(e, t = {}) { let A = document.createElement("div"); A.className = "mjr-video-timegroup", A.appendChild(O), o && A.appendChild(k); let j = document.createElement("span"); - j.className = "mjr-video-frame", j.textContent = "F: 0", j.title = C("video.currentFrame", "Current frame number"); - let M = Gt("mjr-video-btn--play", C("btn.play", "Play"), C("video.playPauseSpace", "Play/Pause (Space)")), N = Gt("mjr-video-btn--step", "<", C("video.stepBack", "Step back")), ee = Gt("mjr-video-btn--step", ">", C("video.stepForward", "Step forward")), te = Gt("mjr-video-btn--jump mjr-video-btn--in", "|<", C("video.goToIn", "Go to In")), ne = Gt("mjr-video-btn--jump mjr-video-btn--out", ">|", C("video.goToOut", "Go to Out")), re = Gt("mjr-video-btn--mark mjr-video-btn--in", "I", C("video.setInFromCurrent", "Set In from current frame")), ie = Gt("mjr-video-btn--mark mjr-video-btn--out", "O", C("video.setOutFromCurrent", "Set Out from current frame")), ae = Kt("mjr-video-btn--toggle", "pi-refresh", C("video.loopPlaybackInRange", "Loop playback in range"), C("video.loop", "Loop")), oe = ae.btn, se = qt("mjr-video-num--in", { + j.className = "mjr-video-frame", j.textContent = "F: 0", j.title = w("video.currentFrame", "Current frame number"); + let M = Gt("mjr-video-btn--play", w("btn.play", "Play"), w("video.playPauseSpace", "Play/Pause (Space)")), N = Gt("mjr-video-btn--step", "<", w("video.stepBack", "Step back")), ee = Gt("mjr-video-btn--step", ">", w("video.stepForward", "Step forward")), te = Gt("mjr-video-btn--jump mjr-video-btn--in", "|<", w("video.goToIn", "Go to In")), ne = Gt("mjr-video-btn--jump mjr-video-btn--out", ">|", w("video.goToOut", "Go to Out")), re = Gt("mjr-video-btn--mark mjr-video-btn--in", "I", w("video.setInFromCurrent", "Set In from current frame")), ie = Gt("mjr-video-btn--mark mjr-video-btn--out", "O", w("video.setOutFromCurrent", "Set Out from current frame")), ae = Kt("mjr-video-btn--toggle", "pi-refresh", w("video.loopPlaybackInRange", "Loop playback in range"), w("video.loop", "Loop")), oe = ae.btn, se = qt("mjr-video-num--in", { min: 0, step: 1, value: 0, - title: C("video.inFrame", "In frame"), - ariaLabel: C("video.inFrame", "In frame"), + title: w("video.inFrame", "In frame"), + ariaLabel: w("video.inFrame", "In frame"), widthPx: 72 }), ce = qt("mjr-video-num--out", { min: 0, step: 1, value: 0, - title: C("video.outFrame", "Out frame"), - ariaLabel: C("video.outFrame", "Out frame"), + title: w("video.outFrame", "Out frame"), + ariaLabel: w("video.outFrame", "Out frame"), widthPx: 72 }), le = qt("mjr-video-num--step", { min: 1, step: 1, value: 1, - title: C("video.frameIncrement", "Frame increment"), - ariaLabel: C("video.frameIncrement", "Frame increment"), + title: w("video.frameIncrement", "Frame increment"), + ariaLabel: w("video.frameIncrement", "Frame increment"), widthPx: 56 }), I = qt("mjr-video-num--fps", { min: 1, step: .001, value: It(s || 30), - title: C("video.fpsStepping", "FPS (used for frame stepping)"), - ariaLabel: C("video.fps", "FPS"), + title: w("video.fpsStepping", "FPS (used for frame stepping)"), + ariaLabel: w("video.fps", "FPS"), widthPx: 56 }), L = document.createElement("select"); - L.className = "mjr-video-num mjr-video-num--speed", L.title = C("video.playbackSpeed", "Playback speed"), L.setAttribute("aria-label", C("video.playbackSpeed", "Playback speed")), L.style.width = "74px"; + L.className = "mjr-video-num mjr-video-num--speed", L.title = w("video.playbackSpeed", "Playback speed"), L.setAttribute("aria-label", w("video.playbackSpeed", "Playback speed")), L.style.width = "74px"; for (let e of [ .25, .5, @@ -1799,10 +1799,10 @@ function Qt(e, t = {}) { let t = document.createElement("option"); t.value = String(e), t.textContent = `${e}x`, L.appendChild(t); } - let ue = Kt("mjr-video-btn--mute", "pi-volume-up", C("video.mute", "Mute"), C("video.mute", "Mute")), de = ue.btn, R = document.createElement("div"); + let ue = Kt("mjr-video-btn--mute", "pi-volume-up", w("video.mute", "Mute"), w("video.mute", "Mute")), de = ue.btn, R = document.createElement("div"); R.className = "mjr-video-volume-wrap", R.style.cssText = "display:none; align-items:center; position:relative;"; let z = null; - z = document.createElement("input"), z.className = "mjr-video-range mjr-video-range--volume", z.type = "range", z.min = "0", z.max = "1", z.step = "0.02", z.value = String(P(Number(e.volume) || 0)), z.setAttribute("aria-label", C("video.volume", "Volume")), z.title = C("video.volume", "Volume"); + z = document.createElement("input"), z.className = "mjr-video-range mjr-video-range--volume", z.type = "range", z.min = "0", z.max = "1", z.step = "0.02", z.value = String(P(Number(e.volume) || 0)), z.setAttribute("aria-label", w("video.volume", "Volume")), z.title = w("video.volume", "Volume"); try { z.style.width = "120px"; } catch (e) { @@ -1812,17 +1812,17 @@ function Qt(e, t = {}) { let fe = document.createElement("div"); fe.className = "mjr-video-group mjr-video-group--in"; let B = document.createElement("span"); - B.textContent = "In", B.title = C("video.resetInToStart", "Reset In to start"), B.style.cssText = "cursor:pointer; user-select:none;", o && (fe.appendChild(B), fe.appendChild(se)); + B.textContent = "In", B.title = w("video.resetInToStart", "Reset In to start"), B.style.cssText = "cursor:pointer; user-select:none;", o && (fe.appendChild(B), fe.appendChild(se)); let V = document.createElement("div"); V.className = "mjr-video-group mjr-video-group--out"; let H = document.createElement("span"); - H.textContent = "Out", H.title = C("video.resetOutToEnd", "Reset Out to end"), H.style.cssText = "cursor:pointer; user-select:none;", o && (V.appendChild(H), V.appendChild(ce)); + H.textContent = "Out", H.title = w("video.resetOutToEnd", "Reset Out to end"), H.style.cssText = "cursor:pointer; user-select:none;", o && (V.appendChild(H), V.appendChild(ce)); let pe = document.createElement("div"); - pe.className = "mjr-video-group mjr-video-group--adjust-left", o && (pe.appendChild(re), r || (pe.appendChild(document.createTextNode(C("video.step", "Step"))), pe.appendChild(le), pe.appendChild(document.createTextNode(C("video.fps", "FPS"))), pe.appendChild(I)), pe.appendChild(j)); + pe.className = "mjr-video-group mjr-video-group--adjust-left", o && (pe.appendChild(re), r || (pe.appendChild(document.createTextNode(w("video.step", "Step"))), pe.appendChild(le), pe.appendChild(document.createTextNode(w("video.fps", "FPS"))), pe.appendChild(I)), pe.appendChild(j)); let U = document.createElement("div"); U.className = "mjr-video-group mjr-video-group--adjust-right", o && (U.appendChild(A), U.appendChild(oe)); let me = document.createElement("div"); - me.className = "mjr-video-group mjr-video-group--speed", me.appendChild(document.createTextNode(C("video.speed", "Speed"))), me.appendChild(L); + me.className = "mjr-video-group mjr-video-group--speed", me.appendChild(document.createTextNode(w("video.speed", "Speed"))), me.appendChild(L); let he = document.createElement("div"); he.className = "mjr-video-bottom mjr-video-bottom--left"; let ge = document.createElement("div"); @@ -1939,7 +1939,7 @@ function Qt(e, t = {}) { }, xe = (e = !1) => { try { if (!I || r) return; - let t = Number(q.nativeFps), n = be(), i = C("video.fpsStepping", "FPS (used for frame stepping)"); + let t = Number(q.nativeFps), n = be(), i = w("video.fpsStepping", "FPS (used for frame stepping)"); I.classList.toggle("is-overridden", n), Number.isFinite(t) && t > 0 ? (I.dataset.defaultFps = String(t), I.title = `${i} - Source FPS: ${t}`, n && (I.title += " - Modified")) : (delete I.dataset.defaultFps, I.title = i), e && !I.matches?.(":focus") && (I.value = String(It(q.fps, q.nativeFps || 30))); } catch (e) { console.debug?.(e); @@ -2018,7 +2018,7 @@ function Qt(e, t = {}) { try { Te(oe, !!(q.loop || q.pingpong)); try { - ae?.icon && (q.pingpong ? (ae.icon.className = "pi pi-sort-alt", oe.title = C("video.pingpongPlayback", "Ping-pong playback (forward then reverse)")) : (ae.icon.className = "pi pi-refresh", oe.title = C("video.loopPlaybackInRange", "Loop playback in range"))); + ae?.icon && (q.pingpong ? (ae.icon.className = "pi pi-sort-alt", oe.title = w("video.pingpongPlayback", "Ping-pong playback (forward then reverse)")) : (ae.icon.className = "pi pi-refresh", oe.title = w("video.loopPlaybackInRange", "Loop playback in range"))); } catch (e) { console.debug?.(e); } @@ -2086,7 +2086,7 @@ function Qt(e, t = {}) { }, Fe = () => { try { let t = !e?.paused || q._ppReverse; - M.textContent = t ? C("video.pause", "Pause") : C("video.play", "Play"); + M.textContent = t ? w("video.pause", "Pause") : w("video.play", "Play"); } catch (e) { console.debug?.(e); } @@ -2098,7 +2098,7 @@ function Qt(e, t = {}) { } catch (e) { console.debug?.(e); } - let n = t ? C("video.unmute", "Unmute") : C("video.mute", "Mute"); + let n = t ? w("video.unmute", "Unmute") : w("video.mute", "Mute"); de.title = n, de.setAttribute("aria-label", n); } catch (e) { console.debug?.(e); @@ -2112,14 +2112,14 @@ function Qt(e, t = {}) { let t = Math.round(e * Ne()); Number.isNaN(t) || q._seeking || p.matches?.(":active") || (p.value = String(t)); try { - w.style.left = `${e * 100}%`; + C.style.left = `${e * 100}%`; } catch (e) { console.debug?.(e); } } else { p.value = "0"; try { - w.style.left = "0%"; + C.style.left = "0%"; } catch (e) { console.debug?.(e); } @@ -2564,7 +2564,7 @@ function Qt(e, t = {}) { W(e), We(); })); try { - k.title = C("video.resetPlayerControls", "Reset player controls"), k.style.cursor = "pointer", k.style.userSelect = "none"; + k.title = w("video.resetPlayerControls", "Reset player controls"), k.style.cursor = "pointer", k.style.userSelect = "none"; } catch (e) { console.debug?.(e); } @@ -3113,7 +3113,7 @@ function Sn(e, t, r) { errorMessage: "Failed to update rating", warnPrefix: "[ViewerContextMenu]", onSuccess: () => { - ce(k, { + ce(O, { assetId: String(i), rating: t }, { warnPrefix: "[ViewerContextMenu]" }); @@ -3142,35 +3142,35 @@ function wn(e, t, n) { ].map((r) => yn(`${r} Stars`, "pi pi-star", null, async () => { Sn(e, r, t); }, { disabled: !n })); - return r.push(bn()), r.push(yn(C("ctx.resetRating", "Reset rating"), "pi pi-star", "0", async () => { + return r.push(bn()), r.push(yn(w("ctx.resetRating", "Reset rating"), "pi pi-star", "0", async () => { Sn(e, 0, t); }, { disabled: !n })), r; } function Tn({ asset: n, event: r, getCurrentViewUrl: i, onAssetChanged: o }) { - let c = typeof i == "function" ? i(n) : O(n), l = !!(n?.id || n?.filepath); + let c = typeof i == "function" ? i(n) : v(n), l = !!(n?.id || n?.filepath); return [ - yn(C("ctx.openInNewTab", "Open in New Tab"), "pi pi-external-link", null, async () => { + yn(w("ctx.openInNewTab", "Open in New Tab"), "pi pi-external-link", null, async () => { xn(c) && window.open(c, "_blank", "noopener,noreferrer"); }), - yn(C("ctx.copyPath", "Copy path"), "pi pi-copy", mn.COPY_PATH, async () => { + yn(w("ctx.copyPath", "Copy path"), "pi pi-copy", mn.COPY_PATH, async () => { let t = n?.filepath ? String(n.filepath) : ""; - if (!t) e(C("toast.noFilePath"), "error"); + if (!t) e(w("toast.noFilePath"), "error"); else try { - await navigator.clipboard.writeText(t), e(C("toast.pathCopied"), "success", 2e3); + await navigator.clipboard.writeText(t), e(w("toast.pathCopied"), "success", 2e3); } catch (t) { - console.error("[ViewerContextMenu] Copy failed:", t), e(C("toast.pathCopyFailed"), "error"); + console.error("[ViewerContextMenu] Copy failed:", t), e(w("toast.pathCopyFailed"), "error"); } }), - yn(C("ctx.downloadOriginal", "Download Original"), "pi pi-download", mn.DOWNLOAD, async () => { + yn(w("ctx.downloadOriginal", "Download Original"), "pi pi-download", mn.DOWNLOAD, async () => { if (!n || !n.filepath) return; - let t = v(n.filepath), r = document.createElement("a"); - r.href = t, r.download = n.filename, document.body.appendChild(r), r.click(), document.body.removeChild(r), e(C("toast.downloadingFile", "Downloading {filename}...", { filename: n.filename }), "info", 3e3); + let t = k(n.filepath), r = document.createElement("a"); + r.href = t, r.download = n.filename, document.body.appendChild(r), r.click(), document.body.removeChild(r), e(w("toast.downloadingFile", "Downloading {filename}...", { filename: n.filename }), "info", 3e3); }, { disabled: !n?.filepath }), - yn(C("ctx.openInFolder", "Open in folder"), "pi pi-folder-open", mn.OPEN_IN_FOLDER, async () => { + yn(w("ctx.openInFolder", "Open in folder"), "pi pi-folder-open", mn.OPEN_IN_FOLDER, async () => { let t = await s(n); - t?.ok ? e(C("toast.openedInFolder"), "info", 2e3) : e(t?.error || C("toast.openFolderFailed"), "error"); + t?.ok ? e(w("toast.openedInFolder"), "info", 2e3) : e(t?.error || w("toast.openFolderFailed"), "error"); }, { disabled: !(n?.id || n?.filepath) }), - yn(C("ctx.addToCollection", "Add to collection"), "pi pi-bookmark", mn.ADD_TO_COLLECTION, async () => { + yn(w("ctx.addToCollection", "Add to collection"), "pi pi-bookmark", mn.ADD_TO_COLLECTION, async () => { try { await bt({ x: r?.clientX, @@ -3182,14 +3182,14 @@ function Tn({ asset: n, event: r, getCurrentViewUrl: i, onAssetChanged: o }) { } }), bn(), - yn(C("ctx.editTags", "Edit tags"), "pi pi-tags", mn.EDIT_TAGS, async () => { + yn(w("ctx.editTags", "Edit tags"), "pi pi-tags", mn.EDIT_TAGS, async () => { dn({ x: (Number(r?.clientX) || 0) + 6, y: (Number(r?.clientY) || 0) + 6, asset: n, onChanged: ((...e) => { let t = e[0]; - n.tags = t, ce(w, { + n.tags = t, ce(T, { assetId: String(n.id), tags: t }, { warnPrefix: "[ViewerContextMenu]" }); @@ -3202,16 +3202,16 @@ function Tn({ asset: n, event: r, getCurrentViewUrl: i, onAssetChanged: o }) { }); }, { closeOnSelect: !1 }), bn(), - yn(C("ctx.setRating", "Set rating"), "pi pi-star", `${mn.RATING_SUBMENU} >`, null, { + yn(w("ctx.setRating", "Set rating"), "pi pi-star", `${mn.RATING_SUBMENU} >`, null, { disabled: !l, closeOnSelect: !1, submenu: wn(n, o, l) }), - yn(C("ctx.refreshMetadata", "Refresh metadata"), "pi pi-sync", "R", async () => { + yn(w("ctx.refreshMetadata", "Refresh metadata"), "pi pi-sync", "R", async () => { if (n?.id) try { let t = await p(n.id, { refresh: !0 }); if (!t?.ok || !t?.data) { - e(t?.error || C("toast.metadataRefreshFailed", "Failed to refresh metadata."), "error"); + e(t?.error || w("toast.metadataRefreshFailed", "Failed to refresh metadata."), "error"); return; } let r = t.data; @@ -3226,15 +3226,15 @@ function Tn({ asset: n, event: r, getCurrentViewUrl: i, onAssetChanged: o }) { let i = [], a = Cn(r?.size_bytes); a && i.push(a), r?.mime && i.push(r.mime); let o = i.length ? ` (${i.join(", ")})` : ""; - e(C("toast.metadataRefreshed", "Metadata refreshed{suffix}", { suffix: o }), "success", 3e3); + e(w("toast.metadataRefreshed", "Metadata refreshed{suffix}", { suffix: o }), "success", 3e3); } catch (e) { a(e, "[ViewerContextMenu] Metadata refresh", { showToast: !0 }); } }, { disabled: !n?.id }), bn(), - yn(C("ctx.rename", "Rename"), "pi pi-pencil", mn.RENAME, async () => { + yn(w("ctx.rename", "Rename"), "pi pi-pencil", mn.RENAME, async () => { if (!(n?.id || n?.filepath)) return; - let t = n.filename || "", r = ut(await L(C("dialog.rename.title", "Rename file"), t), t); + let t = n.filename || "", r = ut(await L(w("dialog.rename.title", "Rename file"), t), t); if (!r || r === t) return; let i = st(r); if (!i.valid) e(i.reason, "error"); @@ -3242,24 +3242,24 @@ function Tn({ asset: n, event: r, getCurrentViewUrl: i, onAssetChanged: o }) { let t = await f(n, r); if (t?.ok) { let i = t?.data?.asset; - i && typeof i == "object" ? Object.assign(n, i) : (n.filename = r, n.filepath = n.filepath.replace(/[^\\/]+$/, r), n.path &&= String(n.path).replace(/[^\\/]+$/, r), n.file_info && typeof n.file_info == "object" && (n.file_info.filename = r, n.file_info.filepath && (n.file_info.filepath = String(n.file_info.filepath).replace(/[^\\/]+$/, r)), n.file_info.path && (n.file_info.path = String(n.file_info.path).replace(/[^\\/]+$/, r)))), e(C("toast.fileRenamedSuccess"), "success"); + i && typeof i == "object" ? Object.assign(n, i) : (n.filename = r, n.filepath = n.filepath.replace(/[^\\/]+$/, r), n.path &&= String(n.path).replace(/[^\\/]+$/, r), n.file_info && typeof n.file_info == "object" && (n.file_info.filename = r, n.file_info.filepath && (n.file_info.filepath = String(n.file_info.filepath).replace(/[^\\/]+$/, r)), n.file_info.path && (n.file_info.path = String(n.file_info.path).replace(/[^\\/]+$/, r)))), e(w("toast.fileRenamedSuccess"), "success"); try { window.dispatchEvent(new CustomEvent("mjr:reload-grid", { detail: { reason: "viewer-rename" } })); } catch (e) { console.debug?.(e); } o?.(); - } else e(t?.error || C("toast.fileRenameFailed"), "error"); + } else e(t?.error || w("toast.fileRenameFailed"), "error"); } catch (t) { - e(C("toast.errorRenaming", "Error renaming file: {error}", { error: t?.message || String(t || "") }), "error"); + e(w("toast.errorRenaming", "Error renaming file: {error}", { error: t?.message || String(t || "") }), "error"); } }, { disabled: !(n?.id || n?.filepath) }), - yn(C("ctx.delete", "Delete"), "pi pi-trash", mn.DELETE, async () => { + yn(w("ctx.delete", "Delete"), "pi pi-trash", mn.DELETE, async () => { if ((n?.id || n?.filepath) && await mt(1, n?.filename)) try { let r = await t(n); - r?.ok ? (e(C("toast.fileDeletedSuccess"), "success"), o?.()) : e(r?.error || C("toast.fileDeleteFailed"), "error"); + r?.ok ? (e(w("toast.fileDeletedSuccess"), "success"), o?.()) : e(r?.error || w("toast.fileDeleteFailed"), "error"); } catch (t) { - e(C("toast.errorDeleting", "Error deleting file: {error}", { error: t?.message || String(t || "") }), "error"); + e(w("toast.errorDeleting", "Error deleting file: {error}", { error: t?.message || String(t || "") }), "error"); } }, { disabled: !(n?.id || n?.filepath) }) ]; @@ -3660,7 +3660,7 @@ function zn({ VIEWER_MODES: e, state: t, onToolsChanged: n, onCompareModeChanged b: i, setActive: a }; - }, w = b("Channel View", [ + }, C = b("Channel View", [ { value: "rgb", label: "RGB" @@ -3686,7 +3686,7 @@ function zn({ VIEWER_MODES: e, state: t, onToolsChanged: n, onCompareModeChanged label: "Luma" } ]); - w.title = C("tooltip.colorChannels", "View color channels or luminance"); + C.title = w("tooltip.colorChannels", "View color channels or luminance"); let T = x("Exposure (EV)", { min: -10, max: 10, @@ -3729,31 +3729,31 @@ function zn({ VIEWER_MODES: e, state: t, onToolsChanged: n, onCompareModeChanged }, A = (e) => { try { let t = String(e || "rgb"); - if (w.style.boxShadow = "", t === "r") { - w.style.borderColor = "rgba(255,90,90,0.60)", w.style.background = "rgba(255,90,90,0.14)", w.style.boxShadow = "0 0 0 1px rgba(255,90,90,0.14) inset"; + if (C.style.boxShadow = "", t === "r") { + C.style.borderColor = "rgba(255,90,90,0.60)", C.style.background = "rgba(255,90,90,0.14)", C.style.boxShadow = "0 0 0 1px rgba(255,90,90,0.14) inset"; return; } if (t === "g") { - w.style.borderColor = "rgba(90,255,140,0.55)", w.style.background = "rgba(90,255,140,0.12)", w.style.boxShadow = "0 0 0 1px rgba(90,255,140,0.12) inset"; + C.style.borderColor = "rgba(90,255,140,0.55)", C.style.background = "rgba(90,255,140,0.12)", C.style.boxShadow = "0 0 0 1px rgba(90,255,140,0.12) inset"; return; } if (t === "b") { - w.style.borderColor = "rgba(90,160,255,0.60)", w.style.background = "rgba(90,160,255,0.12)", w.style.boxShadow = "0 0 0 1px rgba(90,160,255,0.12) inset"; + C.style.borderColor = "rgba(90,160,255,0.60)", C.style.background = "rgba(90,160,255,0.12)", C.style.boxShadow = "0 0 0 1px rgba(90,160,255,0.12) inset"; return; } if (t === "l") { - w.style.borderColor = "rgba(255,210,90,0.60)", w.style.background = "rgba(255,210,90,0.12)", w.style.boxShadow = "0 0 0 1px rgba(255,210,90,0.12) inset"; + C.style.borderColor = "rgba(255,210,90,0.60)", C.style.background = "rgba(255,210,90,0.12)", C.style.boxShadow = "0 0 0 1px rgba(255,210,90,0.12) inset"; return; } if (t === "a") { - w.style.borderColor = "rgba(220,220,220,0.35)", w.style.background = "rgba(255,255,255,0.10)", w.style.boxShadow = "0 0 0 1px rgba(255,255,255,0.08) inset"; + C.style.borderColor = "rgba(220,220,220,0.35)", C.style.background = "rgba(255,255,255,0.10)", C.style.boxShadow = "0 0 0 1px rgba(255,255,255,0.08) inset"; return; } if (t === "rgb") { - w.style.borderColor = "rgba(255,255,255,0.22)", w.style.background = "linear-gradient(90deg, rgba(255,90,90,0.16), rgba(90,255,140,0.14), rgba(90,160,255,0.16))", w.style.boxShadow = "0 0 0 1px rgba(255,255,255,0.10) inset"; + C.style.borderColor = "rgba(255,255,255,0.22)", C.style.background = "linear-gradient(90deg, rgba(255,90,90,0.16), rgba(90,255,140,0.14), rgba(90,160,255,0.16))", C.style.boxShadow = "0 0 0 1px rgba(255,255,255,0.10) inset"; return; } - w.style.borderColor = "rgba(255,255,255,0.14)", w.style.background = "rgba(255,255,255,0.08)"; + C.style.borderColor = "rgba(255,255,255,0.14)", C.style.background = "rgba(255,255,255,0.08)"; } catch (e) { console.debug?.(e); } @@ -3807,7 +3807,7 @@ function zn({ VIEWER_MODES: e, state: t, onToolsChanged: n, onCompareModeChanged label: "Both" } ]); - P.title = C("tooltip.scopesHistogram", "Show histogram/waveform scopes"); + P.title = w("tooltip.scopesHistogram", "Show histogram/waveform scopes"); let te = S("Grid", "Grid (G)", { iconClass: "pi-th-large", accentRgb: D.overlay @@ -3833,7 +3833,7 @@ function zn({ VIEWER_MODES: e, state: t, onToolsChanged: n, onCompareModeChanged label: "Golden" } ]); - F.title = Dt(C("tooltip.gridOverlay", "Grid overlay (rule of thirds, center)"), "G"); + F.title = Dt(w("tooltip.gridOverlay", "Grid overlay (rule of thirds, center)"), "G"); let ne = S("Mask", "Format mask (dim outside)", { iconClass: "pi-stop", accentRgb: D.overlay @@ -3863,7 +3863,7 @@ function zn({ VIEWER_MODES: e, state: t, onToolsChanged: n, onCompareModeChanged label: "9:16" } ]); - re.title = C("tooltip.aspectRatioMask", "Aspect ratio overlay mask"); + re.title = w("tooltip.aspectRatioMask", "Aspect ratio overlay mask"); let ie = x("Mask Opacity", { min: 0, max: .9, @@ -3918,7 +3918,7 @@ function zn({ VIEWER_MODES: e, state: t, onToolsChanged: n, onCompareModeChanged label: "Screen" } ]); - I.title = C("tooltip.compareBlendMode", "Compare blend mode"); + I.title = w("tooltip.compareBlendMode", "Compare blend mode"); let L = b("Audio Visualizer", [{ value: "simple", label: "Simple" @@ -3926,11 +3926,11 @@ function zn({ VIEWER_MODES: e, state: t, onToolsChanged: n, onCompareModeChanged value: "artistic", label: "Artistic" }]); - L.title = C("tooltip.audioVisualizer", "Audio visualizer mode"); - let ue = Ln("Reset", C("tooltip.resetPlayerControls", "Reset all viewer controls")); + L.title = w("tooltip.audioVisualizer", "Audio visualizer mode"); + let ue = Ln("Reset", w("tooltip.resetPlayerControls", "Reset all viewer controls")); ue.style.height = "26px", ue.style.fontSize = "11px", ue.style.padding = "0 8px", ue.classList?.add?.("mjr-viewer-tool-btn", "mjr-viewer-tool-btn--reset"), ue.classList?.add?.("mjr-viewer-tools-action", "mjr-viewer-tools-action--primary"), ue.style.marginLeft = "auto"; let de = document.createElement("button"); - de.type = "button", de.title = C("tooltip.exportFrame", "Save current frame as PNG"), de.setAttribute("aria-label", C("tooltip.exportFrame", "Save frame as PNG")), de.className = "mjr-viewer-tool-btn mjr-viewer-tool-btn--reset", de.style.cssText = "height:24px; padding:0 8px; display:inline-flex; align-items:center; justify-content:center;"; + de.type = "button", de.title = w("tooltip.exportFrame", "Save current frame as PNG"), de.setAttribute("aria-label", w("tooltip.exportFrame", "Save frame as PNG")), de.className = "mjr-viewer-tool-btn mjr-viewer-tool-btn--reset", de.style.cssText = "height:24px; padding:0 8px; display:inline-flex; align-items:center; justify-content:center;"; let R = document.createElement("span"); R.className = "pi pi-download", R.setAttribute("aria-hidden", "true"), R.style.fontSize = "14px", de.appendChild(R), de.classList?.add?.("mjr-viewer-tools-action"); try { @@ -3939,7 +3939,7 @@ function zn({ VIEWER_MODES: e, state: t, onToolsChanged: n, onCompareModeChanged console.debug?.(e); } let z = document.createElement("button"); - z.type = "button", z.title = C("tooltip.copyFrame", "Copy current frame to clipboard"), z.setAttribute("aria-label", C("tooltip.copyFrame", "Copy frame to clipboard")), z.className = "mjr-viewer-tool-btn mjr-viewer-tool-btn--reset", z.style.cssText = "height:24px; padding:0 8px; display:inline-flex; align-items:center; justify-content:center;"; + z.type = "button", z.title = w("tooltip.copyFrame", "Copy current frame to clipboard"), z.setAttribute("aria-label", w("tooltip.copyFrame", "Copy frame to clipboard")), z.className = "mjr-viewer-tool-btn mjr-viewer-tool-btn--reset", z.style.cssText = "height:24px; padding:0 8px; display:inline-flex; align-items:center; justify-content:center;"; let fe = document.createElement("span"); fe.className = "pi pi-copy", fe.setAttribute("aria-hidden", "true"), fe.style.fontSize = "14px", z.appendChild(fe), z.classList?.add?.("mjr-viewer-tools-action"); try { @@ -3952,7 +3952,7 @@ function zn({ VIEWER_MODES: e, state: t, onToolsChanged: n, onCompareModeChanged label: "Channel", accentRgb: D.channel }); - B.appendChild(w), f.body.appendChild(B); + B.appendChild(C), f.body.appendChild(B); let V = y({ key: "exposure", label: "EV", @@ -3999,23 +3999,23 @@ function zn({ VIEWER_MODES: e, state: t, onToolsChanged: n, onCompareModeChanged }; try { let e = V.querySelector?.(".mjr-viewer-tools-group-label"); - e && (e.title = C("tooltip.resetExposure", "Reset EV to 0"), e.style.cursor = "pointer", e.style.userSelect = "none"); + e && (e.title = w("tooltip.resetExposure", "Reset EV to 0"), e.style.cursor = "pointer", e.style.userSelect = "none"); } catch (e) { console.debug?.(e); } try { - T.out.title = C("tooltip.resetExposure", "Reset EV to 0"), T.out.style.cursor = "pointer", T.out.style.userSelect = "none"; + T.out.title = w("tooltip.resetExposure", "Reset EV to 0"), T.out.style.cursor = "pointer", T.out.style.userSelect = "none"; } catch (e) { console.debug?.(e); } try { let e = H.querySelector?.(".mjr-viewer-tools-group-label"); - e && (e.title = C("tooltip.resetGamma", "Reset Gamma to 1.00"), e.style.cursor = "pointer", e.style.userSelect = "none"); + e && (e.title = w("tooltip.resetGamma", "Reset Gamma to 1.00"), e.style.cursor = "pointer", e.style.userSelect = "none"); } catch (e) { console.debug?.(e); } try { - E.out.title = C("tooltip.resetGamma", "Reset Gamma to 1.00"), E.out.style.cursor = "pointer", E.out.style.userSelect = "none"; + E.out.title = w("tooltip.resetGamma", "Reset Gamma to 1.00"), E.out.style.cursor = "pointer", E.out.style.userSelect = "none"; } catch (e) { console.debug?.(e); } @@ -4062,7 +4062,7 @@ function zn({ VIEWER_MODES: e, state: t, onToolsChanged: n, onCompareModeChanged let ve = document.createElement("div"); ve.style.cssText = "position: relative; display:inline-flex; align-items:center;", ve.className = "mjr-viewer-tools-action", ve.style.marginLeft = "4px"; let ye = document.createElement("button"); - ye.type = "button", ye.title = C("tooltip.viewerShortcuts", "Viewer shortcuts"), ye.setAttribute("aria-label", C("tooltip.viewerShortcuts", "Viewer shortcuts")), ye.style.cssText = "\n height: 24px;\n padding: 0 8px;\n border-radius: 6px;\n border: 1px solid rgba(255,255,255,0.14);\n background: rgba(255,255,255,0.08);\n color: rgba(255,255,255,0.92);\n cursor: pointer;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n "; + ye.type = "button", ye.title = w("tooltip.viewerShortcuts", "Viewer shortcuts"), ye.setAttribute("aria-label", w("tooltip.viewerShortcuts", "Viewer shortcuts")), ye.style.cssText = "\n height: 24px;\n padding: 0 8px;\n border-radius: 6px;\n border: 1px solid rgba(255,255,255,0.14);\n background: rgba(255,255,255,0.08);\n color: rgba(255,255,255,0.92);\n cursor: pointer;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n "; let q = document.createElement("span"); q.className = "pi pi-question-circle", q.setAttribute("aria-hidden", "true"), q.style.fontSize = "14px", ye.appendChild(q); let be = document.createElement("div"); @@ -4101,7 +4101,7 @@ function zn({ VIEWER_MODES: e, state: t, onToolsChanged: n, onCompareModeChanged helpWrap: ve, helpBtn: ye, helpPop: be, - channelsSelect: w, + channelsSelect: C, exposureCtl: T, gammaCtl: E, zebraToggle: N, @@ -4508,22 +4508,22 @@ function Un({ VIEWER_MODES: e, state: t, lifecycle: n, onClose: r, _onZoomIn: i, x.className = "mjr-viewer-title-wrap", x.style.cssText = "display:flex; align-items:center; justify-content:center; gap:12px; min-width:0; max-width:min(100%, calc(100vw - 220px)); text-align:center;"; let S = document.createElement("span"); S.className = "mjr-viewer-filename", S.style.cssText = "font-size: 13px; font-weight: 600; min-width:0; max-width:min(60vw, 820px); overflow:hidden; text-overflow:ellipsis; white-space:nowrap; text-align:center;"; - let w = document.createElement("div"); - w.className = "mjr-viewer-badges", w.style.cssText = "display:flex; gap:6px; align-items:center; flex-wrap:nowrap; min-width:0;"; + let C = document.createElement("div"); + C.className = "mjr-viewer-badges", C.style.cssText = "display:flex; gap:6px; align-items:center; flex-wrap:nowrap; min-width:0;"; let T = document.createElement("div"); T.className = "mjr-viewer-header-meta mjr-viewer-header-meta--right", T.style.cssText = "display:none; align-items:center; gap:10px; min-width:0; justify-content:flex-end; overflow:hidden;"; let E = document.createElement("span"); E.className = "mjr-viewer-filename mjr-viewer-filename--right", E.style.cssText = "font-size: 14px; font-weight: 500; min-width:0; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; text-align:right;"; let D = document.createElement("div"); - D.className = "mjr-viewer-badges mjr-viewer-badges--right", D.style.cssText = "display:flex; gap:8px; align-items:center; flex-wrap:wrap; justify-content:flex-end;", b.appendChild(S), b.appendChild(w), x.appendChild(b), T.appendChild(D), T.appendChild(E); + D.className = "mjr-viewer-badges mjr-viewer-badges--right", D.style.cssText = "display:flex; gap:8px; align-items:center; flex-wrap:wrap; justify-content:flex-end;", b.appendChild(S), b.appendChild(C), x.appendChild(b), T.appendChild(D), T.appendChild(E); let O = document.createElement("div"); O.className = "mjr-viewer-mode-buttons", O.style.cssText = "display: flex; gap: 4px;"; let k = Rn("Single", e.SINGLE); - k.title = C("tooltip.singleViewMode", "Single view mode (one image)"); + k.title = w("tooltip.singleViewMode", "Single view mode (one image)"); let A = Rn("A/B", e.AB_COMPARE); - A.title = C("tooltip.compareOverlayMode", "A/B compare mode (overlay)"); + A.title = w("tooltip.compareOverlayMode", "A/B compare mode (overlay)"); let j = Rn("Side", e.SIDE_BY_SIDE); - j.title = C("tooltip.compareSideBySide", "Side-by-side comparison mode"), O.appendChild(k), O.appendChild(A), O.appendChild(j); + j.title = w("tooltip.compareSideBySide", "Side-by-side comparison mode"), O.appendChild(k), O.appendChild(A), O.appendChild(j); let M = Ln("X", "Close (Esc)"); M.style.fontSize = "18px"; try { @@ -4742,7 +4742,7 @@ function Un({ VIEWER_MODES: e, state: t, lifecycle: n, onClose: r, _onZoomIn: i, headerEl: _, headerTopEl: v, filenameEl: S, - badgesBarEl: w, + badgesBarEl: C, filenameRightEl: E, badgesBarRightEl: D, leftAreaEl: ee, @@ -4788,7 +4788,7 @@ function Wn(e) { } return null; } -function Gn({ overlay: t, _content: n, singleView: r, state: i, VIEWER_MODES: a, computeOneToOneZoom: o, setZoom: s, scheduleOverlayRedraw: c, scheduleApplyGrade: l, syncToolsUIFromState: u, applyDistractionFreeUI: f, navigateViewerAssets: p, closeViewer: m, renderBadges: h, updateAssetRating: g, safeDispatchCustomEvent: _, ASSET_RATING_CHANGED_EVENT: v, probeTooltip: y, loupeWrap: b, getVideoControls: x, lifecycle: S, renderGenInfoPanel: T } = {}) { +function Gn({ overlay: t, _content: n, singleView: r, state: i, VIEWER_MODES: a, computeOneToOneZoom: o, setZoom: s, scheduleOverlayRedraw: c, scheduleApplyGrade: l, syncToolsUIFromState: u, applyDistractionFreeUI: f, navigateViewerAssets: p, closeViewer: m, renderBadges: h, updateAssetRating: g, safeDispatchCustomEvent: _, ASSET_RATING_CHANGED_EVENT: v, probeTooltip: y, loupeWrap: b, getVideoControls: x, lifecycle: S, renderGenInfoPanel: C } = {}) { let E = S?.unsubs || [], D = null, O = null, k = () => { try { D && clearTimeout(D); @@ -4805,15 +4805,15 @@ function Gn({ overlay: t, _content: n, singleView: r, state: i, VIEWER_MODES: a, if (D = null, O = null, t?.assetId) try { let n = await g?.(t.assetId, t.rating); if (!n?.ok) { - e(n?.error || C("toast.ratingUpdateFailed"), "error"); + e(n?.error || w("toast.ratingUpdateFailed"), "error"); return; } - e(C("toast.ratingSetN", { n: t.rating }), "success", 1500), _?.(v, { + e(w("toast.ratingSetN", { n: t.rating }), "success", 1500), _?.(v, { assetId: String(t.assetId), rating: t.rating }, { warnPrefix: "[Viewer]" }); } catch { - e(C("toast.ratingUpdateError"), "error"); + e(w("toast.ratingUpdateError"), "error"); } }, 300); }, j = () => { @@ -4910,10 +4910,10 @@ function Gn({ overlay: t, _content: n, singleView: r, state: i, VIEWER_MODES: a, if (!r) return !1; if (n) { let n = r.setPlaybackRate?.(t); - return Number.isFinite(Number(n)) ? (i.playbackRate = Number(n), e(C("toast.playbackRate", "Playback {rate}x", { rate: Number(n).toFixed(2) }), "info", 1200), !0) : !1; + return Number.isFinite(Number(n)) ? (i.playbackRate = Number(n), e(w("toast.playbackRate", "Playback {rate}x", { rate: Number(n).toFixed(2) }), "info", 1200), !0) : !1; } let a = r.adjustPlaybackRate?.(t); - return Number.isFinite(Number(a)) ? (i.playbackRate = Number(a), e(C("toast.playbackRate", "Playback {rate}x", { rate: Number(a).toFixed(2) }), "info", 1200), !0) : !1; + return Number.isFinite(Number(a)) ? (i.playbackRate = Number(a), e(w("toast.playbackRate", "Playback {rate}x", { rate: Number(a).toFixed(2) }), "info", 1200), !0) : !1; } catch { return !1; } @@ -4921,7 +4921,7 @@ function Gn({ overlay: t, _content: n, singleView: r, state: i, VIEWER_MODES: a, if ((n.ctrlKey || n.metaKey) && (n.key === "c" || n.key === "C")) try { let t = Wn(S); if (t) { - g(), navigator.clipboard?.writeText?.(t).then(() => e(C("toast.promptCopied", "Prompt copied to clipboard"), "success", 1500)).catch(() => e(C("toast.copyFailed", "Copy failed"), "error", 1500)); + g(), navigator.clipboard?.writeText?.(t).then(() => e(w("toast.promptCopied", "Prompt copied to clipboard"), "success", 1500)).catch(() => e(w("toast.copyFailed", "Copy failed"), "error", 1500)); return; } } catch (e) { @@ -4967,7 +4967,7 @@ function Gn({ overlay: t, _content: n, singleView: r, state: i, VIEWER_MODES: a, } catch (e) { console.debug?.(e); } - X(u), X(T); + X(u), X(C); break; case "t": case "T": @@ -4978,7 +4978,7 @@ function Gn({ overlay: t, _content: n, singleView: r, state: i, VIEWER_MODES: a, asset: S, onChanged: ((...e) => { let t = e[0]; - S.tags = t, _(w, { + S.tags = t, _(T, { assetId: String(S.id), tags: t }, { warnPrefix: "[ViewerKeyboard]" }), X(h); @@ -4998,7 +4998,7 @@ function Gn({ overlay: t, _content: n, singleView: r, state: i, VIEWER_MODES: a, case "i": case "I": if (v && S?.kind === "video" && k()?.setInPoint?.()) { - g(), e(C("toast.inPointSet", "In point set"), "info", 1200); + g(), e(w("toast.inPointSet", "In point set"), "info", 1200); break; } g(); @@ -5017,7 +5017,7 @@ function Gn({ overlay: t, _content: n, singleView: r, state: i, VIEWER_MODES: a, case "o": case "O": if (v && S?.kind === "video" && k()?.setOutPoint?.()) { - g(), e(C("toast.outPointSet", "Out point set"), "info", 1200); + g(), e(w("toast.outPointSet", "Out point set"), "info", 1200); break; } break; @@ -5056,7 +5056,7 @@ function Gn({ overlay: t, _content: n, singleView: r, state: i, VIEWER_MODES: a, } catch (e) { console.debug?.(e); } - X(u), X(f), X(T); + X(u), X(f), X(C); break; case "c": case "C": { @@ -5129,15 +5129,15 @@ function Gn({ overlay: t, _content: n, singleView: r, state: i, VIEWER_MODES: a, break; case "[": case "{": - g(), N(-.25) || e(C("toast.playbackVideoOnly"), "warning", 1400); + g(), N(-.25) || e(w("toast.playbackVideoOnly"), "warning", 1400); break; case "]": case "}": - g(), N(.25) || e(C("toast.playbackVideoOnly"), "warning", 1400); + g(), N(.25) || e(w("toast.playbackVideoOnly"), "warning", 1400); break; case "\\": case "|": - g(), N(1, { absolute: !0 }) || e(C("toast.playbackVideoOnly"), "warning", 1400); + g(), N(1, { absolute: !0 }) || e(w("toast.playbackVideoOnly"), "warning", 1400); break; case "+": case "=": @@ -5189,7 +5189,7 @@ function Gn({ overlay: t, _content: n, singleView: r, state: i, VIEWER_MODES: a, // ui/features/viewer/videoSync.ts var Kn = () => { try { - return !!T?.DEBUG_VIEWER; + return !!E?.DEBUG_VIEWER; } catch { return !1; } @@ -6373,7 +6373,7 @@ function $n({ overlay: e, content: t, singleView: n, abView: r, sideView: i, sta let n = Number(a?.zoom) || 1, r = f(), { w: i, h: o } = p(r) || { w: 0, h: 0 - }, s = m(), c = s && i > 0 && o > 0 ? E(i, o, s.width, s.height, n) : !1; + }, s = m(), c = s && i > 0 && o > 0 ? T(i, o, s.width, s.height, n) : !1; if (!(n > 1.01 || c)) { t.style.cursor = ""; return; @@ -6486,7 +6486,7 @@ function $n({ overlay: e, content: t, singleView: n, abView: r, sideView: i, sta } catch { return n || t || null; } - }, E = (e, t, n, r, i) => { + }, T = (e, t, n, r, i) => { try { let a = S(e, t, n, r); if (!(a.w > 0 && a.h > 0)) return !1; @@ -6526,7 +6526,7 @@ function $n({ overlay: e, content: t, singleView: n, abView: r, sideView: i, sta if (!e || e.style.display === "none" || ne(n?.target)) return; let r = Number(a?.zoom) || 1, i = (() => { try { - return !!T?.VIEWER_ALLOW_PAN_AT_ZOOM_1; + return !!E?.VIEWER_ALLOW_PAN_AT_ZOOM_1; } catch { return !1; } @@ -6538,7 +6538,7 @@ function $n({ overlay: e, content: t, singleView: n, abView: r, sideView: i, sta w: 0, h: 0 }, a = m(); - return !a || !(t > 0 && n > 0) ? r > 1.01 : r > 1.01 || E(t, n, a.width, a.height, r); + return !a || !(t > 0 && n > 0) ? r > 1.01 : r > 1.01 || T(t, n, a.width, a.height, r); } catch { return r > 1.01; } @@ -6898,7 +6898,7 @@ function ar(e) { } // ui/features/viewer/videoProcessor.ts function or({ canvas: e, videoEl: t, disableWebGL: n, pauseDuringExecution: r = null, getGradeParams: i, isDefaultGrade: a, _tonemap: o, maxProcPixelsVideo: s, throttleFps: c, safeAddListener: l, safeCall: u, onReady: d } = {}) { - let f = r == null ? !!T?.VIEWER_PAUSE_DURING_EXECUTION : !!r, p = null; + let f = r == null ? !!E?.VIEWER_PAUSE_DURING_EXECUTION : !!r, p = null; if (!n && ir()) try { p = ar({ canvas: e, @@ -7050,7 +7050,7 @@ function or({ canvas: e, videoEl: t, disableWebGL: n, pauseDuringExecution: r = } catch (e) { console.debug?.(e); } - }, E = () => { + }, T = () => { if (!y._destroyed && e?.isConnected && (y.ready || S(), y.ready)) { try { let e = y.lastParams || i?.() || {}; @@ -7125,7 +7125,7 @@ function or({ canvas: e, videoEl: t, disableWebGL: n, pauseDuringExecution: r = y._rendering = !0; try { y._rafIdSchedule = requestAnimationFrame(() => { - y._rafIdSchedule = null, y._rendering = !1, E(); + y._rafIdSchedule = null, y._rendering = !1, T(); try { r && (y._lastHeavyRenderAt = Date.now()); } catch (e) { @@ -7408,7 +7408,7 @@ function cr(e) { console.debug?.(e); } try { - let e = String(T?.VIEWER_AUDIO_VISUALIZER_MODE || "simple").toLowerCase(); + let e = String(E?.VIEWER_AUDIO_VISUALIZER_MODE || "simple").toLowerCase(); if (e === "artistic") return "artistic"; if (e === "webgl3d" || e === "webgl") return "simple"; } catch (e) { @@ -7563,7 +7563,7 @@ function ur(e, { pseudo3d: t = !1 } = {}) { } function dr({ canvas: e, audioEl: t, mode: n, pauseDuringExecution: r = null } = {}) { if (!e || !t) return { destroy() {} }; - let i = r == null ? !!T?.VIEWER_PAUSE_DURING_EXECUTION : !!r, a = null, o = !1, s = null, c = null, l = null, u = null, d = null, f = null, p = 0, m = !1, h = 1e3 / sr(T?.VIEWER_AUDIO_VIS_FPS ?? 24, 8, 60), g = cr(n), _ = () => { + let i = r == null ? !!E?.VIEWER_PAUSE_DURING_EXECUTION : !!r, a = null, o = !1, s = null, c = null, l = null, u = null, d = null, f = null, p = 0, m = !1, h = 1e3 / sr(E?.VIEWER_AUDIO_VIS_FPS ?? 24, 8, 60), g = cr(n), _ = () => { try { let t = sr(window.devicePixelRatio || 1, 1, 2), n = Math.max(32, Math.floor((e.clientWidth || 640) * t)), r = Math.max(24, Math.floor((e.clientHeight || 140) * t)); e.width !== n && (e.width = n), e.height !== r && (e.height = r); @@ -7584,7 +7584,7 @@ function dr({ canvas: e, audioEl: t, mode: n, pauseDuringExecution: r = null } = console.debug?.(e); } try { - g === "artistic" && !T?.VIEWER_DISABLE_WEBGL_AUDIO && (f = ur(e, { pseudo3d: !0 })); + g === "artistic" && !E?.VIEWER_DISABLE_WEBGL_AUDIO && (f = ur(e, { pseudo3d: !0 })); } catch (e) { console.debug?.(e); } @@ -7640,7 +7640,7 @@ function dr({ canvas: e, audioEl: t, mode: n, pauseDuringExecution: r = null } = a = null; }, C = () => { x(); - }, w = () => S(), E = () => S(), O = () => _(), k = (e) => { + }, w = () => S(), T = () => S(), O = () => _(), k = (e) => { i && (m = !!String(e?.detail?.active_prompt_id || "").trim(), m ? S() : t?.paused || x()); }; try { @@ -7649,7 +7649,7 @@ function dr({ canvas: e, audioEl: t, mode: n, pauseDuringExecution: r = null } = console.debug?.(e); } try { - t.addEventListener("play", C, { passive: !0 }), t.addEventListener("pause", w, { passive: !0 }), t.addEventListener("ended", E, { passive: !0 }), window.addEventListener("resize", O, { passive: !0 }), i && (window.addEventListener(D.RUNTIME_STATUS, k), String(window?.__MJR_EXECUTION_RUNTIME__?.active_prompt_id || "").trim() && (m = !0)); + t.addEventListener("play", C, { passive: !0 }), t.addEventListener("pause", w, { passive: !0 }), t.addEventListener("ended", T, { passive: !0 }), window.addEventListener("resize", O, { passive: !0 }), i && (window.addEventListener(D.RUNTIME_STATUS, k), String(window?.__MJR_EXECUTION_RUNTIME__?.active_prompt_id || "").trim() && (m = !0)); } catch (e) { console.debug?.(e); } @@ -7661,7 +7661,7 @@ function dr({ canvas: e, audioEl: t, mode: n, pauseDuringExecution: r = null } = if (!o) { o = !0, S(); try { - t.removeEventListener("play", C), t.removeEventListener("pause", w), t.removeEventListener("ended", E), window.removeEventListener("resize", O), window.removeEventListener(D.RUNTIME_STATUS, k); + t.removeEventListener("play", C), t.removeEventListener("pause", w), t.removeEventListener("ended", T), window.removeEventListener("resize", O), window.removeEventListener(D.RUNTIME_STATUS, k); } catch (e) { console.debug?.(e); } @@ -7865,7 +7865,7 @@ function fr({ overlay: e, state: t, mediaTransform: n, updateMediaNaturalSize: r } catch (e) { console.debug?.(e); } - }, E = (e, n, { compare: r = !1 } = {}) => { + }, T = (e, n, { compare: r = !1 } = {}) => { let i = document.createElement("div"); if (i.className = "mjr-viewer-audio-shell", !r) { let t = document.createElement("div"); @@ -7948,7 +7948,7 @@ function fr({ overlay: e, state: t, mediaTransform: n, updateMediaNaturalSize: r } return t; } - if (v === "audio") return E(e, m, { compare: !1 }); + if (v === "audio") return T(e, m, { compare: !1 }); if (v === "video") { let u = document.createElement("canvas"); u.className = "mjr-viewer-media"; @@ -7975,8 +7975,8 @@ function fr({ overlay: e, state: t, mediaTransform: n, updateMediaNaturalSize: r u._mjrProc = or({ canvas: u, videoEl: v, - disableWebGL: f || !!T.VIEWER_DISABLE_WEBGL_VIDEO, - pauseDuringExecution: T.VIEWER_PAUSE_DURING_EXECUTION, + disableWebGL: f || !!E.VIEWER_DISABLE_WEBGL_VIDEO, + pauseDuringExecution: E.VIEWER_PAUSE_DURING_EXECUTION, getGradeParams: s, isDefaultGrade: c, tonemap: l, @@ -8126,7 +8126,7 @@ function fr({ overlay: e, state: t, mediaTransform: n, updateMediaNaturalSize: r } return t; } - if (m === "audio") return E(e, f, { compare: !0 }); + if (m === "audio") return T(e, f, { compare: !0 }); if (m === "video") { let u = document.createElement("div"); u.style.cssText = "width:100%; height:100%; position:relative; display:flex; align-items:center; justify-content:center;"; @@ -8155,7 +8155,7 @@ function fr({ overlay: e, state: t, mediaTransform: n, updateMediaNaturalSize: r m._mjrProc = or({ canvas: m, videoEl: h, - pauseDuringExecution: T.VIEWER_PAUSE_DURING_EXECUTION, + pauseDuringExecution: E.VIEWER_PAUSE_DURING_EXECUTION, getGradeParams: s, isDefaultGrade: c, tonemap: l, @@ -8463,7 +8463,7 @@ function br(e, t) { let r = document.createElement("div"); r.style.cssText = "display:flex;flex-direction:column;gap:8px;margin:0 0 14px 0;padding:10px;border:1px solid rgba(144,220,220,0.22);border-radius:10px;background:rgba(90,220,220,0.06);"; let i = document.createElement("div"); - i.textContent = C("viewer.metadataCompare", "Metadata compare"), i.style.cssText = "font-size:12px;font-weight:700;color:rgba(255,255,255,0.9);letter-spacing:0.02em", r.appendChild(i); + i.textContent = w("viewer.metadataCompare", "Metadata compare"), i.style.cssText = "font-size:12px;font-weight:700;color:rgba(255,255,255,0.9);letter-spacing:0.02em", r.appendChild(i); for (let e of n.slice(0, 24)) { let t = document.createElement("div"); t.style.cssText = "display:grid;grid-template-columns:minmax(74px,0.42fr) 1fr 1fr;gap:6px;align-items:start"; @@ -9298,7 +9298,7 @@ function Br({ state: e, buildAssetViewURL: t, onNavigate: n, onCompare: r }) { console.debug?.(e); } zr(e, { releaseSrc: !0 }), y(r); - }, { once: !0 }), r.appendChild(e), S(r), f(e), r; + }, { once: !0 }), r.appendChild(e), C(r), f(e), r; } if (a === "audio") { let t = String(e?.thumbnail_url || e?.thumb_url || "").trim(); @@ -9310,10 +9310,10 @@ function Br({ state: e, buildAssetViewURL: t, onNavigate: n, onCompare: r }) { } catch (e) { console.debug?.(e); } - b(r); + x(r); }, { once: !0 }), r.appendChild(n); - } else b(r); - return T(r), r; + } else x(r); + return E(r), r; } if (a === "model3d") { let n = (() => { @@ -9325,7 +9325,7 @@ function Br({ state: e, buildAssetViewURL: t, onNavigate: n, onCompare: r }) { ...e, filename: r, kind: "image" - }) : E(r, i || null, a); + }) : b(r, i || null, a); } catch { return ""; } @@ -9338,10 +9338,10 @@ function Br({ state: e, buildAssetViewURL: t, onNavigate: n, onCompare: r }) { } catch (e) { console.debug?.(e); } - C(r); + w(r); }, { once: !0 }), r.appendChild(t); - } else C(r); - return w(r), r; + } else w(r); + return T(r), r; } if (o) { let e = document.createElement("img"); @@ -9353,7 +9353,7 @@ function Br({ state: e, buildAssetViewURL: t, onNavigate: n, onCompare: r }) { } }, { once: !0 }), r.appendChild(e), r; } - return x(r), r; + return S(r), r; }; function y(e) { let t = document.createElement("div"); @@ -9364,7 +9364,7 @@ function Br({ state: e, buildAssetViewURL: t, onNavigate: n, onCompare: r }) { console.debug?.(e); } } - function b(e) { + function x(e) { let t = document.createElement("div"); t.className = "mjr-filmstrip-audio-thumb"; let n = document.createElement("span"); @@ -9375,7 +9375,7 @@ function Br({ state: e, buildAssetViewURL: t, onNavigate: n, onCompare: r }) { console.debug?.(e); } } - function x(e) { + function S(e) { let t = document.createElement("div"); t.style.cssText = "\n position: absolute; inset: 0;\n display: flex; align-items: center; justify-content: center;\n font-size: 18px; color: rgba(255,255,255,0.25);\n pointer-events: none;\n ", t.textContent = "?"; try { @@ -9384,11 +9384,11 @@ function Br({ state: e, buildAssetViewURL: t, onNavigate: n, onCompare: r }) { console.debug?.(e); } } - function S(e) { + function C(e) { let t = document.createElement("div"); t.style.cssText = "\n position: absolute; bottom: 2px; right: 2px;\n font-size: 7px; line-height: 1;\n background: rgba(0,0,0,0.55); color: rgba(255,255,255,0.85);\n padding: 2px 3px; border-radius: 2px;\n pointer-events: none;\n letter-spacing: 0.02em;\n ", t.textContent = "VID", e.appendChild(t); } - function C(e) { + function w(e) { let t = document.createElement("div"); t.style.cssText = "\n position: absolute; inset: 0;\n display: flex; align-items: center; justify-content: center;\n font-size: 10px; font-weight: 700;\n color: rgba(76, 175, 80, 0.7);\n pointer-events: none;\n letter-spacing: 0.04em;\n ", t.textContent = "3D"; try { @@ -9397,11 +9397,11 @@ function Br({ state: e, buildAssetViewURL: t, onNavigate: n, onCompare: r }) { console.debug?.(e); } } - function w(e) { + function T(e) { let t = document.createElement("div"); t.style.cssText = "\n position: absolute; bottom: 2px; right: 2px;\n font-size: 7px; line-height: 1;\n background: rgba(0,0,0,0.55); color: rgba(76, 175, 80, 0.95);\n padding: 2px 3px; border-radius: 2px;\n pointer-events: none;\n letter-spacing: 0.02em;\n font-weight: 700;\n ", t.textContent = "3D", e.appendChild(t); } - function T(e) { + function E(e) { let t = document.createElement("div"); t.style.cssText = "\n position: absolute; bottom: 2px; right: 2px;\n font-size: 7px; line-height: 1;\n background: rgba(0,0,0,0.55); color: rgba(255,255,255,0.85);\n padding: 2px 3px; border-radius: 2px;\n pointer-events: none;\n letter-spacing: 0.02em;\n ", t.textContent = "AUD", e.appendChild(t); } @@ -9619,13 +9619,13 @@ var Wr = null, Gr = null, Kr = null, qr = null, Jr = null, Yr = null; function Xr() { Wr || import("./abCompare-BUrGm4-x.js").then((e) => { Wr = e; - }), Gr || import("./sideBySide-Css6Vh8y.js").then((e) => { + }), Gr || import("./sideBySide-sOf24A5X.js").then((e) => { Gr = e; - }), Kr || import("./model3dRenderer-k0ey48io.js").then((e) => e.t).then((e) => { + }), Kr || import("./model3dRenderer-DdPKugXy.js").then((e) => e.t).then((e) => { Kr = e; }), qr || import("./scopes-bvTRS68K.js").then((e) => { qr = e; - }), Jr || import("./genInfo-Dxtoun1T.js").then((e) => e.n).then((e) => { + }), Jr || import("./genInfo-BkEKNdy-.js").then((e) => e.n).then((e) => { Jr = e; }), Yr || import("./frameExport-CnNO7oN6.js").then((e) => { Yr = e; @@ -9689,21 +9689,21 @@ function Zr() { console.debug?.(e); } } - function v() { + function y() { try { u?.updatePanCursor?.(); } catch (e) { console.debug?.(e); } } - function y() { + function b() { try { return u?.getPrimaryMedia?.() || null; } catch { return null; } } - function x(e) { + function S(e) { try { return u?.getMediaNaturalSize?.(e) || { w: 0, @@ -9716,21 +9716,21 @@ function Zr() { }; } } - function S() { + function C() { try { return u?.getViewportRect?.() || null; } catch { return null; } } - function E() { + function D() { try { return u?.computeOneToOneZoom?.() ?? null; } catch { return null; } } - function D() { + function k() { try { u?.updateMediaNaturalSize?.(); } catch (e) { @@ -9845,7 +9845,7 @@ function Zr() { onZoomOneToOne: () => { try { let e = () => { - let e = E(); + let e = D(); return e != null && (_(Math.abs((Number(s.zoom) || 1) - e) < .01 ? 1 : e, { clientX: s._lastPointerX, clientY: s._lastPointerY @@ -9855,7 +9855,7 @@ function Zr() { try { requestAnimationFrame(() => { try { - D(); + k(); } catch (e) { console.debug?.(e); } @@ -9958,7 +9958,7 @@ function Zr() { } let { contentRow: z, content: fe, singleView: B, abView: V, sideView: H, overlayLayer: pe, gridCanvas: U, probeTooltip: me, loupeWrap: he, loupeCanvas: ge, genInfoOverlay: _e, genInfoTitle: W, genInfoBody: G, genInfoOverlayLeft: K, genInfoTitleLeft: ve, genInfoBodyLeft: ye, footer: q, prevBtn: be, indexInfo: xe, nextBtn: Se, navBar: Ce, playerBarHost: we, filmstrip: Te } = Hr({ state: s, - buildAssetViewURL: O, + buildAssetViewURL: v, onNavigate: (e) => { try { s.compareAsset != null && (s.compareAsset = null, s.mode = $.SINGLE), s.currentIndex = e, Qe(); @@ -10007,7 +10007,7 @@ function Zr() { let Oe = Zn({ state: s, VIEWER_MODES: $, - APP_CONFIG: T, + APP_CONFIG: E, getAssetMetadata: o, getAssetsBatch: r }), ke = 3e5, Ae = /* @__PURE__ */ new Map(), je = () => { @@ -10117,7 +10117,7 @@ function Zr() { } return null; }, - getViewportRect: S, + getViewportRect: C, clearCanvas: Fe }), Re = () => { let t = (() => { @@ -10363,14 +10363,14 @@ function Zr() { e.textContent = t, e.style.cssText = "font-size: 12px; font-weight: 600; letter-spacing: 0.02em; color: rgba(255,255,255,0.86);", i.appendChild(e); } let o = document.createElement("div"); - o.style.cssText = "padding: 10px 12px; border-radius: 10px; border: 1px solid rgba(255,255,255,0.12); background: rgba(255,255,255,0.06); color: rgba(255,255,255,0.72);", o.textContent = C("viewer.noGenerationDataFile", "No generation data found for this file."), i.appendChild(o); + o.style.cssText = "padding: 10px 12px; border-radius: 10px; border: 1px solid rgba(255,255,255,0.12); background: rgba(255,255,255,0.06); color: rgba(255,255,255,0.72);", o.textContent = w("viewer.noGenerationDataFile", "No generation data found for this file."), i.appendChild(o); try { let e = n?.metadata_raw; if (e != null) { let t = document.createElement("details"); t.style.cssText = "border: 1px solid rgba(255,255,255,0.10); border-radius: 10px; background: rgba(255,255,255,0.04); overflow: hidden;"; let n = document.createElement("summary"); - n.textContent = C("msg.rawMetadata", "Raw metadata"), n.style.cssText = "cursor: pointer; padding: 10px 12px; color: rgba(255,255,255,0.78); user-select: none;"; + n.textContent = w("msg.rawMetadata", "Raw metadata"), n.style.cssText = "cursor: pointer; padding: 10px 12px; color: rgba(255,255,255,0.78); user-select: none;"; let r = document.createElement("pre"); r.style.cssText = "margin:0; padding: 10px 12px; max-height: 280px; overflow:auto; font-size: 11px; line-height: 1.35; color: rgba(255,255,255,0.86);"; let a = ""; @@ -10668,7 +10668,7 @@ function Zr() { function et() { let e = s.assets[s.currentIndex]; if (!e) return; - let t = O(e); + let t = v(e); if (t) { if (s.mode === $.SINGLE) { try { @@ -10684,7 +10684,7 @@ function Zr() { state: s, currentAsset: e, viewUrl: t, - buildAssetViewURL: O, + buildAssetViewURL: v, createCompareMediaElement: j, destroyMediaProcessorsIn: Fn }) : s.mode === $.SIDE_BY_SIDE && Y() && Gr?.renderSideBySideView?.({ @@ -10692,11 +10692,11 @@ function Zr() { state: s, currentAsset: e, viewUrl: t, - buildAssetViewURL: O, + buildAssetViewURL: v, createMediaElement: A, destroyMediaProcessorsIn: Fn }); - g(), v(); + g(), y(); } else { try { Fn(B); @@ -10713,12 +10713,12 @@ function Zr() { } } let { preloadAdjacentAssets: tt, preloadImageForAsset: nt, trackPreloadRef: rt } = pr({ - buildAssetViewURL: O, + buildAssetViewURL: v, IMAGE_PRELOAD_EXTENSIONS: c, state: s }), { destroyPlayerBar: at, syncPlayerBar: ot } = Sr({ state: s, - APP_CONFIG: T, + APP_CONFIG: E, VIEWER_MODES: $, overlay: e, navBar: Ce, @@ -10736,7 +10736,7 @@ function Zr() { scheduleOverlayRedraw: J, viewerInfoCacheGet: Me, viewerInfoCacheSet: Ne - }), st = () => ot(), ct = T.VIEWER_MAX_PROC_PIXELS ?? 12e6, lt = () => ({ + }), st = () => ot(), ct = E.VIEWER_MAX_PROC_PIXELS ?? 12e6, lt = () => ({ exposureEV: Number(s.exposureEV) || 0, gamma: Math.max(.1, Math.min(3, Number(s.gamma) || 1)), channel: s.channel || "rgb", @@ -10768,13 +10768,13 @@ function Zr() { } catch { return !0; } - }, ft = T.VIEWER_MAX_PROC_PIXELS_VIDEO ?? 3e6, pt = T.VIEWER_VIDEO_GRADE_THROTTLE_FPS ?? 15; + }, ft = E.VIEWER_MAX_PROC_PIXELS_VIDEO ?? 3e6, pt = E.VIEWER_VIDEO_GRADE_THROTTLE_FPS ?? 15; try { d = fr({ overlay: e, state: s, mediaTransform: f, - updateMediaNaturalSize: D, + updateMediaNaturalSize: k, clampPanToBounds: h, applyTransform: g, scheduleOverlayRedraw: J, @@ -10783,7 +10783,7 @@ function Zr() { tonemap: null, maxProcPixels: ct, maxProcPixelsVideo: ft, - disableWebGL: !!T.VIEWER_DISABLE_WEBGL_VIDEO, + disableWebGL: !!E.VIEWER_DISABLE_WEBGL_VIDEO, videoGradeThrottleFps: pt, safeAddListener: Z, safeCall: X @@ -10852,7 +10852,7 @@ function Zr() { }); }, yt = (e, t, n, { offsetX: r = 16, offsetY: i = 16 } = {}) => { try { - let a = S(); + let a = C(); if (!a) return; let o = fe.getBoundingClientRect(), s = (Number(t) || 0) - o.left, c = (Number(n) || 0) - o.top, l = Number(e.offsetWidth) || 0, u = Number(e.offsetHeight) || 0, d = s + r, f = c + i; d = Math.max(10, Math.min(d, a.width - l - 10)), f = Math.max(10, Math.min(f, a.height - u - 10)), e.style.left = `${Math.round(d)}px`, e.style.top = `${Math.round(f)}px`; @@ -10864,9 +10864,9 @@ function Zr() { content: fe, state: s, VIEWER_MODES: $, - getPrimaryMedia: y, - getMediaNaturalSize: x, - getViewportRect: S, + getPrimaryMedia: b, + getMediaNaturalSize: S, + getViewportRect: C, positionOverlayBox: yt, probeTooltip: me, loupeWrap: he, @@ -10874,7 +10874,7 @@ function Zr() { state: s, loupeCanvas: ge, loupeWrap: he, - getMediaNaturalSize: x, + getMediaNaturalSize: S, positionOverlayBox: yt }).redraw, lifecycle: t @@ -10916,7 +10916,7 @@ function Zr() { singleView: B, state: s, VIEWER_MODES: $, - computeOneToOneZoom: E, + computeOneToOneZoom: D, setZoom: _, scheduleOverlayRedraw: J, scheduleApplyGrade: ht, @@ -10927,7 +10927,7 @@ function Zr() { renderBadges: Ye, updateAssetRating: n, safeDispatchCustomEvent: ce, - ASSET_RATING_CHANGED_EVENT: k, + ASSET_RATING_CHANGED_EVENT: O, probeTooltip: me, loupeWrap: he, renderGenInfoPanel: Ke, @@ -11027,7 +11027,7 @@ function Zr() { } }; try { - e._mjrBadgeSyncBound ||= (a.push(Z(window, k, (e) => { + e._mjrBadgeSyncBound ||= (a.push(Z(window, O, (e) => { try { let t = e?.detail?.assetId, n = e?.detail?.rating; if (t == null) return; @@ -11041,7 +11041,7 @@ function Zr() { } catch (e) { console.debug?.(e); } - }, { passive: !0 })), a.push(Z(window, w, (e) => { + }, { passive: !0 })), a.push(Z(window, T, (e) => { try { let t = e?.detail?.assetId, n = e?.detail?.tags; if (t == null) return; @@ -11062,7 +11062,7 @@ function Zr() { function Tt() { try { let e = s.assets?.[s.currentIndex]; - e?.id && ce(b, { assetId: String(e.id) }, { warnPrefix: "[ViewerRuntime]" }); + e?.id && ce(x, { assetId: String(e.id) }, { warnPrefix: "[ViewerRuntime]" }); } catch (e) { console.debug?.(e); } @@ -11391,7 +11391,7 @@ function Zr() { En({ overlayEl: e, getCurrentAsset: () => s.assets[s.currentIndex], - getCurrentViewUrl: (e) => O(e), + getCurrentViewUrl: (e) => v(e), onAssetChanged: () => { try { Ye(); diff --git a/dist/chunks/ViewerPortal-uNjS7OxV.js b/dist/chunks/ViewerPortal-BStxU0ID.js similarity index 97% rename from dist/chunks/ViewerPortal-uNjS7OxV.js rename to dist/chunks/ViewerPortal-BStxU0ID.js index c8630aa5..85eee5b1 100644 --- a/dist/chunks/ViewerPortal-uNjS7OxV.js +++ b/dist/chunks/ViewerPortal-BStxU0ID.js @@ -1,9 +1,9 @@ -import { a as e, i as t } from "./viewerRuntimeHosts-DQcoOjsY.js"; -import { r as n } from "./events-DxfljH4A.js"; -import { a as r, c as i, i as a, l as o, o as s, s as c, t as l, u } from "./Viewer-DI9upE3v.js"; -import { i as d, r as f } from "./floatingViewerManager-DKOeP6-T.js"; +import { a as e, i as t } from "./viewerRuntimeHosts-D3Jyfx0-.js"; +import { r as n } from "./events-BRfpU-6M.js"; +import { a as r, c as i, i as a, l as o, o as s, s as c, t as l, u } from "./Viewer-geJFRz8N.js"; +import { i as d, r as f } from "./floatingViewerManager-Gv7MTmpu.js"; import { B as p, C as m, D as h, E as g, G as _, J as v, K as y, L as b, N as x, O as S, T as C, U as w, V as T, dt as E, ft as D, j as O, k, lt as A, rt as j, ut as M, w as N, z as P } from "./mjr-primevue-BRqtdXzb.js"; -import { t as F } from "./TagsEditor-7DAMS3OV.js"; +import { t as F } from "./TagsEditor-CPV0rYyM.js"; // ui/vue/components/viewer/FloatingViewerHost.vue var I = /* @__PURE__ */ x({ __name: "FloatingViewerHost", diff --git a/dist/chunks/events-DxfljH4A.js b/dist/chunks/events-BRfpU-6M.js similarity index 95% rename from dist/chunks/events-DxfljH4A.js rename to dist/chunks/events-BRfpU-6M.js index b25e5a0a..fd1f95f0 100644 --- a/dist/chunks/events-DxfljH4A.js +++ b/dist/chunks/events-BRfpU-6M.js @@ -580,7 +580,7 @@ async function Ae({ app: e = null, timeoutMs: t = 4e3, intervalMs: n = de, warnO return null; } // ui/app/hostAdapter.ts -var N = null, P = Symbol.for("mjr.host.queuePromptBinding"), je = [ +var N = null, je = [ "selectionchange", "selection-change", "node-selected", @@ -626,59 +626,82 @@ function Ie(e, t, n) { return !1; } } -function Le(e, t) { +function Le(e) { try { - return Te(e || N || j(), t); + return Te(N || j(), e); } catch { return !1; } } -function Re(e, t) { +function Re(e = null) { try { - return Se(e || N || j(), t); + let t = M(e || N || j()), n = typeof t?.getSidebarTabs == "function" ? t.getSidebarTabs() : []; + return Array.isArray(n) ? n.filter(Boolean) : []; } catch { - return !1; + return []; } } -function ze(e, t) { +function ze(e, t = null) { try { - return Ee(e || N || j(), t); + let n = M(t || N || j()); + return !e || typeof n?.unregisterSidebarTab != "function" ? !1 : (n.unregisterSidebarTab(e), !0); } catch { return !1; } } function Be(e, t) { try { - return Ce(e || N || j(), t); + return Te(e || N || j(), t); } catch { return !1; } } function Ve(e, t) { + try { + return Se(e || N || j(), t); + } catch { + return !1; + } +} +function He(e, t) { + try { + return Ee(e || N || j(), t); + } catch { + return !1; + } +} +function Ue(e, t) { + try { + return Ce(e || N || j(), t); + } catch { + return !1; + } +} +function We(e, t) { try { return we(e || N || j(), t); } catch { return !1; } } -function He() { +function Ge() { return N || j() || null; } -function F(e = null) { +function P(e = null) { try { return A(e || N || j()) || null; } catch { return null; } } -async function Ue(e = {}) { +async function Ke(e = {}) { try { return await Ae(e); } catch { return null; } } -async function We(e, t = null, n = null) { +async function qe(e, t = null, n = null) { try { return await me(e, t, n || N || j()); } catch { @@ -688,7 +711,7 @@ async function We(e, t = null, n = null) { }); } } -function Ge(e, t, n) { +function Je(e, t, n) { if (!e || typeof e.addEventListener != "function") return null; try { e.addEventListener(t, n); @@ -703,7 +726,7 @@ function Ge(e, t, n) { } }; } -function Ke(e, t = {}) { +function Ye(e, t = {}) { if (typeof e != "function") return null; let n = t.app || N || j(), r = n?.canvas; if (!r) return null; @@ -719,7 +742,7 @@ function Ke(e, t = {}) { } }; for (let e of o) for (let t of je) { - let n = Ge(e, t, s); + let n = Je(e, t, s); n && (i.push(n), a = !0); } if (!a) { @@ -739,7 +762,7 @@ function Ke(e, t = {}) { }); } if (t.includePointerFallback !== !1 && r.canvas?.addEventListener) { - let e = Ge(r.canvas, "pointerup", s); + let e = Je(r.canvas, "pointerup", s); e && i.push(e); } let c = !1; @@ -750,34 +773,8 @@ function Ke(e, t = {}) { } }; } -function qe(e = {}) { - let t = e.api || F(e.app || N || j()), n = e.owner || null, r = typeof e.createWrapper == "function" ? e.createWrapper : null; - if (!t || typeof t.queuePrompt != "function" || !r) return null; - let i = t.queuePrompt?.[P] || null; - if (i?.owner === n) return i; - if (i?.owner && i.owner !== n) return null; - let a = t.queuePrompt, o = r(a, t); - if (typeof o != "function") return null; - let s = { - api: t, - owner: n, - originalQueuePrompt: a, - wrappedQueuePrompt: o, - restore: () => { - try { - return (t.queuePrompt?.[P] || null)?.owner === n && (t.queuePrompt = a, !0); - } catch (e) { - return console.debug?.(e), !1; - } - } - }; - return Object.defineProperty(o, P, { - configurable: !0, - value: s - }), t.queuePrompt = o, s; -} -async function Je(e = null) { - let t = e || N || j(), n = (t?.api && typeof t.api.interrupt == "function" ? t.api : null) || F(t); +async function Xe(e = null) { + let t = e || N || j(), n = (t?.api && typeof t.api.interrupt == "function" ? t.api : null) || P(t); if (n && typeof n.interrupt == "function") return await n.interrupt(), !0; if (n && typeof n.fetchApi == "function") { let e = await n.fetchApi("/interrupt", { method: "POST" }); @@ -791,20 +788,20 @@ async function Je(e = null) { if (!r.ok) throw Error(`POST /interrupt failed (${r.status})`); return !1; } -function I(e = null) { +function F(e = null) { return (e || N || j())?.canvas || null; } -function Ye(e = null) { - return I(e); +function Ze(e = null) { + return F(e); } -function L(e = null) { +function I(e = null) { let t = e || N || j(); return t?.graph || t?.canvas?.graph || null; } -function Xe(e = null) { - return L(e); +function Qe(e = null) { + return I(e); } -function Ze(e) { +function $e(e) { if (typeof e != "object" || !e) return e; try { return typeof structuredClone == "function" ? structuredClone(e) : JSON.parse(JSON.stringify(e)); @@ -812,23 +809,23 @@ function Ze(e) { return e; } } -function R(e, t) { +function L(e, t) { n(e, ({ node: e }) => t(e)); } -function Qe(e) { +function et(e) { let t = []; - return R(e, (e) => { + return L(e, (e) => { for (let n of e?.widgets ?? []) t.push({ widget: n, - value: Ze(n?.value) + value: $e(n?.value) }); }), t; } -function $e(e, t) { +function tt(e, t) { for (let e of Array.isArray(t) ? t : []) { let t = e?.widget; if (!t || typeof t != "object") continue; - let n = Ze(e?.value); + let n = $e(e?.value); try { t.value = n; } catch (e) { @@ -841,9 +838,9 @@ function $e(e, t) { console.debug?.(e); } } - z(e, { change: !1 }); + R(e, { change: !1 }); } -function et(e, t) { +function nt(e, t) { let n = [ e?.clientId, e?.clientID, @@ -858,46 +855,46 @@ function et(e, t) { } return ""; } -function tt(e = null) { - let t = I(e); +function rt(e = null) { + let t = F(e); return t?.selected_nodes ?? t?.selectedNodes ?? null; } -function nt(e = null) { - let t = tt(e); +function it(e = null) { + let t = rt(e); return t ? Array.isArray(t) ? t.filter(Boolean) : t instanceof Map ? Array.from(t.values()).filter(Boolean) : typeof t == "object" ? Object.values(t).filter(Boolean) : [] : []; } -function rt(e = null) { - return nt(e).map((e) => String(e?.id ?? "").trim()).filter(Boolean); +function at(e = null) { + return it(e).map((e) => String(e?.id ?? "").trim()).filter(Boolean); } -function it(e = null) { - return nt(e)[0] || null; +function ot(e = null) { + return it(e)[0] || null; } -function z(e = null, t = {}) { +function R(e = null, t = {}) { try { - let n = e || N || j(), r = I(n), i = L(n); + let n = e || N || j(), r = F(n), i = I(n); return r?.setDirty?.(!0, !0), t.draw !== !1 && r?.draw?.(!0, !0), i?.setDirtyCanvas?.(!0, !0), t.change !== !1 && i?.change?.(), !!(r || i); } catch (e) { return console.debug?.(e), !1; } } -function at(e, t = null, n = {}) { +function st(e, t = null, n = {}) { try { - let r = t || N || j(), i = L(r), a = e?.graph ?? null; - return a && a !== i && (a.setDirtyCanvas?.(!0, !0), n.change !== !1 && a.change?.()), z(r, n); + let r = t || N || j(), i = I(r), a = e?.graph ?? null; + return a && a !== i && (a.setDirtyCanvas?.(!0, !0), n.change !== !1 && a.change?.()), R(r, n); } catch (e) { return console.debug?.(e), !1; } } -function ot(e, t = null) { +function ct(e, t = null) { if (!e) return !1; try { - let n = t || N || j(), r = L(n); - return !r || typeof r.add != "function" ? !1 : (r.add(e), at(e, n), !0); + let n = t || N || j(), r = I(n); + return !r || typeof r.add != "function" ? !1 : (r.add(e), st(e, n), !0); } catch (e) { return console.debug?.(e), !1; } } -function st(e = null) { +function lt(e = null) { try { let t = e || N || j(), n = globalThis; return t?.LiteGraph || t?.ui?.LiteGraph || t?.canvas?.LiteGraph || n?.LiteGraph || n?.window?.LiteGraph || null; @@ -905,17 +902,17 @@ function st(e = null) { return console.debug?.(e), null; } } -function ct(e, t = null) { +function ut(e, t = null) { let n = String(e || "").trim(); if (!n) return null; try { - let e = st(t); + let e = lt(t); return !e || typeof e.createNode != "function" ? null : e.createNode(n) || null; } catch (e) { return console.debug?.(e), null; } } -function lt(e, t = null) { +function dt(e, t = null) { let n = t || N || j(); if (!e || typeof e != "object") return !1; try { @@ -927,7 +924,7 @@ function lt(e, t = null) { n?.extensionManager?.workflow?.importWorkflow ]; for (let r of t) if (typeof r == "function") try { - return r.call(n?.workflowManager || n?.extensionManager?.workflow || n, e), z(n, { + return r.call(n?.workflowManager || n?.extensionManager?.workflow || n, e), R(n, { draw: !1, change: !1 }), !0; @@ -935,8 +932,8 @@ function lt(e, t = null) { console.debug?.(e); } if (typeof n?.loadGraphData == "function") return n.loadGraphData(e), !0; - let r = L(n); - if (typeof r?.configure == "function") return r.configure(e), z(n, { + let r = I(n); + if (typeof r?.configure == "function") return r.configure(e), R(n, { draw: !1, change: !1 }), !0; @@ -945,14 +942,14 @@ function lt(e, t = null) { } return !1; } -function ut(e, t = null) { +function ft(e, t = null) { let n = t || N || j(); if (!e || typeof e != "object") return { ok: !1, mode: "none" }; try { - if (lt(e, n)) return { + if (dt(e, n)) return { ok: !0, mode: "replace" }; @@ -964,14 +961,14 @@ function ut(e, t = null) { mode: "none" }; } -function dt(t = null) { +function pt(t = null) { try { let n = t || N || j(), r = e(n); if (typeof r?.serialize == "function") { let e = r.serialize(); if (e && typeof e == "object") return e; } - let i = L(n); + let i = I(n); if (i !== r && typeof i?.serialize == "function") { let e = i.serialize(); if (e && typeof e == "object") return e; @@ -986,7 +983,7 @@ function dt(t = null) { } return null; } -function ft(e = null) { +function mt(e = null) { try { let t = e || N || j(); if (!t) return null; @@ -1018,29 +1015,29 @@ function ft(e = null) { } return null; } -async function pt(t = {}) { +async function ht(t = {}) { let n = t.app || N || j(); if (!n) throw Error("ComfyUI app not available"); - let r = F(n), i = !!(r && typeof r.queuePrompt == "function" || r && typeof r.fetchApi == "function"); + let r = P(n), i = !!(r && typeof r.queuePrompt == "function" || r && typeof r.fetchApi == "function"); if ((t.forceNativeQueue || !i) && typeof n.queuePrompt == "function") return await n.queuePrompt(0), !0; let a = e(n), o = null; try { - o = Qe(a), R(a, (e) => { + o = et(a), L(a, (e) => { for (let t of e?.widgets ?? []) t.beforeQueued?.({ isPartialExecution: !1 }); }); let e = await (typeof t.resolvePromptData == "function" ? t.resolvePromptData : (e) => e?.graphToPrompt?.())(n); if (!e?.output) throw Error("graphToPrompt returned empty output"); let i = typeof t.enrichPromptData == "function" ? t.enrichPromptData(e) : e; - if (r && typeof r.queuePrompt == "function") return await r.queuePrompt(0, i), R(a, (e) => { + if (r && typeof r.queuePrompt == "function") return await r.queuePrompt(0, i), L(a, (e) => { for (let t of e?.widgets ?? []) t.afterQueued?.({ isPartialExecution: !1 }); - }), z(n, { change: !1 }), !0; + }), R(n, { change: !1 }), !0; let s = (typeof t.buildPromptRequestBody == "function" ? t.buildPromptRequestBody : (e, t) => { let n = { prompt: e?.output, extra_data: e?.extra_data || {} }; return t.clientId && (n.client_id = t.clientId), n; - })(e, { clientId: et(r, n) }); + })(e, { clientId: nt(r, n) }); if (r && typeof r.fetchApi == "function") { let e = await r.fetchApi("/prompt", { method: "POST", @@ -1048,9 +1045,9 @@ async function pt(t = {}) { body: JSON.stringify(s) }); if (!e?.ok) throw Error(`POST /prompt failed (${e?.status})`); - return R(a, (e) => { + return L(a, (e) => { for (let t of e?.widgets ?? []) t.afterQueued?.({ isPartialExecution: !1 }); - }), z(n, { change: !1 }), !0; + }), R(n, { change: !1 }), !0; } let c = await fetch("/prompt", { method: "POST", @@ -1059,17 +1056,17 @@ async function pt(t = {}) { body: JSON.stringify(s) }); if (!c.ok) throw Error(`POST /prompt failed (${c.status})`); - return R(a, (e) => { + return L(a, (e) => { for (let t of e?.widgets ?? []) t.afterQueued?.({ isPartialExecution: !1 }); - }), z(n, { change: !1 }), !1; + }), R(n, { change: !1 }), !1; } catch (e) { - throw $e(n, o), e; + throw tt(n, o), e; } } -function mt(e, t = {}) { +function gt(e, t = {}) { if (!e) return !1; try { - let n = I(t.app || N || j()); + let n = F(t.app || N || j()); if (!n) return !1; if (t.select !== !1 && n.selectNode?.(e, !1), typeof n.centerOnNode == "function") n.centerOnNode(e); else if (e.pos && n.ds) { @@ -1081,12 +1078,12 @@ function mt(e, t = {}) { return console.debug?.(e), !1; } } -function ht(n, r = null) { +function _t(n, r = null) { let i = String(n || "").trim(); if (!i) return !1; try { let n = r || N || j(), a = t(e(n), i); - return a ? mt(a, { + return a ? gt(a, { app: n, select: !1, focusCanvas: !1 @@ -1095,7 +1092,7 @@ function ht(n, r = null) { return console.debug?.(e), !1; } } -function gt() { +function vt() { let e = N || j() || null, t = e?.canvas || null, n = t?.ds || null, r = t?.canvas || t?.el || null; if (!t || !n || !r) return null; let i = Number(n?.scale), a = Number(r?.width || r?.clientWidth || 0), o = Number(r?.height || r?.clientHeight || 0); @@ -1108,10 +1105,10 @@ function gt() { height: o }; } -function _t(e, t, n) { +function yt(e, t, n) { return Array.isArray(e?.offset) ? (e.offset[0] = t, e.offset[1] = n, !0) : e?.offset && typeof e.offset == "object" ? (e.offset.x = t, e.offset.y = n, !0) : !1; } -function vt(e, t) { +function bt(e, t) { try { t?.setDirty?.(!0, !0); } catch (e) { @@ -1123,21 +1120,21 @@ function vt(e, t) { console.debug?.(e); } } -function yt(e) { +function xt(e) { try { - let t = gt(); + let t = vt(); if (!t || !e) return !1; let n = Number(e.x), r = Number(e.y); if (!Number.isFinite(n) || !Number.isFinite(r)) return !1; let i = Math.max(1, Number(globalThis?.devicePixelRatio ?? globalThis?.window?.devicePixelRatio) || 1), a = -n + t.width * .5 / (t.scale * i), o = -r + t.height * .5 / (t.scale * i); - return !Number.isFinite(a) || !Number.isFinite(o) || !_t(t.ds, a, o) ? !1 : (vt(t.app, t.graphCanvas), !0); + return !Number.isFinite(a) || !Number.isFinite(o) || !yt(t.ds, a, o) ? !1 : (bt(t.app, t.graphCanvas), !0); } catch (e) { return console.debug?.(e), !1; } } -function bt() { +function St() { try { - let e = gt(); + let e = vt(); if (!e) return null; let t = e.ds?.offset, n = Number(Array.isArray(t) ? t[0] : t?.x), r = Number(Array.isArray(t) ? t[1] : t?.y); return !Number.isFinite(n) || !Number.isFinite(r) ? null : { @@ -1151,35 +1148,35 @@ function bt() { } } // ui/app/settings/SettingsStore.ts -var B = /* @__PURE__ */ new Map(), V = !1, H = null; -function U() { +var z = /* @__PURE__ */ new Map(), B = !1, V = null; +function H() { try { return typeof window > "u" ? null : window.localStorage || null; } catch { return null; } } -function W(e, t, n) { - let r = B.get(String(e || "")); +function U(e, t, n) { + let r = z.get(String(e || "")); if (r && r.size) for (let i of Array.from(r)) try { i(t, n, e); } catch (e) { console.debug?.(e); } } -function xt() { - if (!V) try { - H = (e) => { +function Ct() { + if (!B) try { + V = (e) => { let t = String(e?.key || ""); - t && W(t, e?.newValue ?? null, e?.oldValue ?? null); - }, window.addEventListener("storage", H), V = !0; + t && U(t, e?.newValue ?? null, e?.oldValue ?? null); + }, window.addEventListener("storage", V), B = !0; } catch (e) { console.debug?.(e); } } -var G = { +var W = { get(e) { - let t = U(); + let t = H(); if (!t) return null; try { return t.getItem(String(e || "")); @@ -1190,13 +1187,13 @@ var G = { set(e, t) { let n = String(e || ""); if (!n) return !1; - let r = U(); + let r = H(); if (!r) return !1; - let i = G.get(n); + let i = W.get(n); try { - if (t == null) return r.removeItem(n), W(n, null, i), !0; + if (t == null) return r.removeItem(n), U(n, null, i), !0; let e = String(t); - return r.setItem(n, e), W(n, e, i), !0; + return r.setItem(n, e), U(n, e, i), !0; } catch { return !1; } @@ -1204,19 +1201,19 @@ var G = { subscribe(e, t) { let n = String(e || ""); if (!n || typeof t != "function") return () => {}; - xt(); - let r = B.get(n); - return r || (r = /* @__PURE__ */ new Set(), B.set(n, r)), r.add(t), () => { + Ct(); + let r = z.get(n); + return r || (r = /* @__PURE__ */ new Set(), z.set(n, r)), r.add(t), () => { try { - let e = B.get(n); - e?.delete(t), e && !e.size && B.delete(n); + let e = z.get(n); + e?.delete(t), e && !e.size && z.delete(n); } catch (e) { console.debug?.(e); } }; }, getAll() { - let e = {}, t = U(); + let e = {}, t = H(); if (!t) return e; try { let n = Number(t.length || 0) || 0; @@ -1231,17 +1228,17 @@ var G = { }, dispose() { try { - V && H && typeof window < "u" && window.removeEventListener("storage", H); + B && V && typeof window < "u" && window.removeEventListener("storage", V); } catch (e) { console.debug?.(e); } - V = !1, H = null, B.clear(); + B = !1, V = null, z.clear(); } -}, K = "en-US", q = K, St = /* @__PURE__ */ new Set(), Ct = ["mjr_lang", "majoor.lang"], wt = "mjr_lang_follow_comfy", Tt = 500, J = /* @__PURE__ */ new Set(), Y = null, Et = /* @__PURE__ */ new Set([ +}, G = "en-US", K = G, wt = /* @__PURE__ */ new Set(), Tt = ["mjr_lang", "majoor.lang"], Et = "mjr_lang_follow_comfy", Dt = 500, q = /* @__PURE__ */ new Set(), J = null, Ot = /* @__PURE__ */ new Set([ "ar-SA", "fa-IR", "he-IL" -]), Dt = { +]), kt = { fr: "fr-FR", "fr-fr": "fr-FR", fr_FR: "fr-FR", @@ -1347,7 +1344,7 @@ var G = { "el-gr": "el-GR", el_gr: "el-GR", elgr: "el-GR" -}, X = { +}, Y = { "en-US": { "cat.grid": "Grid", "cat.cards": "Cards", @@ -2847,7 +2844,7 @@ var G = { "msg.newVersionDetail": "La version {latest} est disponible. Version installée : {current}.", "tooltip.starGithub": "Ouvrir GitHub et mettre une etoile" } -}, Ot = Object.freeze({ +}, At = Object.freeze({ "en-US": "English", "fr-FR": "Français", "zh-CN": "Chinese (Simplified)", @@ -2897,43 +2894,43 @@ var G = { "ro-RO", "el-GR" ].forEach((e) => { - X[e] || (X[e] = {}); + Y[e] || (Y[e] = {}); }); -var Z = !1, kt = null; -function At(e) { - Z || (Z = !0, Object.entries(e || {}).forEach(([e, t]) => { - X[e] = { - ...X[e] || {}, +var X = !1, jt = null; +function Mt(e) { + X || (X = !0, Object.entries(e || {}).forEach(([e, t]) => { + Y[e] = { + ...Y[e] || {}, ...t || {} }; - }), jt()); + }), Z()); } -function jt() { - let e = X["en-US"] || {}; - Object.keys(X).forEach((t) => { - t !== "en-US" && (X[t] = { +function Z() { + let e = Y["en-US"] || {}; + Object.keys(Y).forEach((t) => { + t !== "en-US" && (Y[t] = { ...e, - ...X[t] || {} + ...Y[t] || {} }); }); } -function Mt() { - return Z ? Promise.resolve() : (kt ||= import("./i18n.generated-DqByySOH.js").then(({ GENERATED_TRANSLATIONS: e }) => { - At(e); - }).catch((e) => { - console.warn("[Majoor i18n] Failed to load generated translations:", e), jt(); - }), kt); -} -jt(); -function Q(e) { - if (!e) return K; - let t = String(e || "").trim(), n = t.toLowerCase(); - return Dt[n] ? Dt[n] : X[t] ? t : K; -} function Nt() { + return X ? Promise.resolve() : (jt ||= import("./i18n.generated-DqByySOH.js").then(({ GENERATED_TRANSLATIONS: e }) => { + Mt(e); + }).catch((e) => { + console.warn("[Majoor i18n] Failed to load generated translations:", e), Z(); + }), jt); +} +Z(); +function Q(e) { + if (!e) return G; + let t = String(e || "").trim(), n = t.toLowerCase(); + return kt[n] ? kt[n] : Y[t] ? t : G; +} +function Pt() { try { - for (let e of Ct) { - let t = String(G.get(e) || "").trim(); + for (let e of Tt) { + let t = String(W.get(e) || "").trim(); if (t) return t; } } catch (e) { @@ -2941,16 +2938,16 @@ function Nt() { } return ""; } -function Pt(e) { +function Ft(e) { try { - G.set(Ct[0], e), G.set(Ct[1], e); + W.set(Tt[0], e), W.set(Tt[1], e); } catch (e) { console.debug?.(e); } } -function Ft() { +function It() { try { - let e = String(G.get(wt) || "").trim().toLowerCase(); + let e = String(W.get(Et) || "").trim().toLowerCase(); return !e || ![ "0", "false", @@ -2962,14 +2959,14 @@ function Ft() { } return !0; } -function It(e) { +function Lt(e) { try { - G.set(wt, e ? "1" : "0"); + W.set(Et, e ? "1" : "0"); } catch (e) { console.debug?.(e); } } -function Lt(e) { +function Rt(e) { let t = [], n = (e) => { if (typeof e != "string") return; let n = e.trim(); @@ -2984,7 +2981,7 @@ function Lt(e) { ]) n(Fe(e, t)); return n(e?.ui?.locale), n(e?.locale), n(e?.ui?.i18n?.locale), t; } -function Rt() { +function zt() { let e = [], t = (t) => { if (typeof t != "string") return; let n = t.trim(); @@ -3006,84 +3003,84 @@ function Rt() { } return e; } -function zt() { +function Bt() { try { if (typeof document < "u" && document.documentElement) { - let e = Et.has(q); + let e = Ot.has(K); document.documentElement.dir = e ? "rtl" : "ltr"; } } catch (e) { console.debug?.(e); } } -var Bt = (e) => { +var Vt = (e) => { try { - let t = Ft(), n = Nt(), r = Q(n), i = () => { - let t = Lt(e); + let t = It(), n = Pt(), r = Q(n), i = () => { + let t = Rt(e); for (let e of t) { let t = Q(e); - if (X[t]) return $(t), !0; + if (Y[t]) return $(t), !0; } return !1; }; if (t) { if (i()) return; - if (n && X[r]) { + if (n && Y[r]) { $(r); return; } - if (X[q]) return; - $(K); + if (Y[K]) return; + $(G); return; } - if (n && X[r]) { + if (n && Y[r]) { $(r); return; } if (i()) return; - let a = Rt(); + let a = zt(); for (let e of a) { let t = Q(e); - if (X[t]) { + if (Y[t]) { $(t); return; } } - $(K); + $(G); } catch (e) { - console.warn("[Majoor i18n] Failed to detect language:", e), $(K); + console.warn("[Majoor i18n] Failed to detect language:", e), $(G); } }, $ = (e) => { - X[e] || (console.warn(`[Majoor i18n] Unknown language: ${e}, falling back to ${K}`), e = K), q !== e && (q = e, Pt(e), zt(), e !== K && !Z && Mt().then(() => { - Array.from(St).forEach((t) => { + Y[e] || (console.warn(`[Majoor i18n] Unknown language: ${e}, falling back to ${G}`), e = G), K !== e && (K = e, Ft(e), Bt(), e !== G && !X && Nt().then(() => { + Array.from(wt).forEach((t) => { try { t(e); } catch (e) { console.debug?.(e); } }); - }), Array.from(St).forEach((t) => { + }), Array.from(wt).forEach((t) => { try { t(e); } catch (e) { console.debug?.(e); } })); -}, Vt = (e) => { - It(!!e); }, Ht = (e) => { + Lt(!!e); +}, Ut = (e) => { try { - Y &&= (clearInterval(Y), null), typeof window < "u" && window.__MJR_COMFY_LANG_SYNC_TIMER__ && (clearInterval(window.__MJR_COMFY_LANG_SYNC_TIMER__), window.__MJR_COMFY_LANG_SYNC_TIMER__ = null); + J &&= (clearInterval(J), null), typeof window < "u" && window.__MJR_COMFY_LANG_SYNC_TIMER__ && (clearInterval(window.__MJR_COMFY_LANG_SYNC_TIMER__), window.__MJR_COMFY_LANG_SYNC_TIMER__ = null); } catch (e) { console.debug?.(e); } - Y = setInterval(() => { + J = setInterval(() => { try { - if (!Ft()) return; - let t = Lt(e); + if (!It()) return; + let t = Rt(e); for (let e of t) { let t = Q(e); - if (X[t] && t !== q) { + if (Y[t] && t !== K) { $(t); return; } @@ -3093,35 +3090,35 @@ var Bt = (e) => { } }, 2e3); try { - typeof window < "u" && (window.__MJR_COMFY_LANG_SYNC_TIMER__ = Y); + typeof window < "u" && (window.__MJR_COMFY_LANG_SYNC_TIMER__ = J); } catch (e) { console.debug?.(e); } -}, Ut = () => q, Wt = () => Object.keys(X).map((e) => ({ +}, Wt = () => K, Gt = () => Object.keys(Y).map((e) => ({ code: e, - name: Ot[e] || e -})), Gt = (e, t, n) => { - let r = X[q] || X[K], i = X[K], a = r[e] || i[e]; + name: At[e] || e +})), Kt = (e, t, n) => { + let r = Y[K] || Y[G], i = Y[G], a = r[e] || i[e]; if (!a) { - let n = `${q}:${String(e || "")}`; - if (!J.has(n)) { - if (J.size >= Tt) { - let e = Math.floor(Tt * .2), t = J.values(); + let n = `${K}:${String(e || "")}`; + if (!q.has(n)) { + if (q.size >= Dt) { + let e = Math.floor(Dt * .2), t = q.values(); for (let n = 0; n < e; n++) { let e = t.next().value; - e && J.delete(e); + e && q.delete(e); } } - J.add(n); + q.add(n); try { - console.warn(`[Majoor i18n] Missing translation key "${e}" for locale "${q}"`); + console.warn(`[Majoor i18n] Missing translation key "${e}" for locale "${K}"`); } catch (e) { console.debug?.(e); } try { typeof window < "u" && typeof window.dispatchEvent == "function" && window.dispatchEvent(new CustomEvent("mjr-i18n-missing-key", { detail: { key: String(e || ""), - locale: q + locale: K } })); } catch (e) { console.debug?.(e); @@ -3133,7 +3130,7 @@ var Bt = (e) => { return o && typeof o == "object" && Object.entries(o).forEach(([e, t]) => { a = a.replaceAll(`{${e}}`, String(t)); }), a; -}, Kt = Object.freeze({ +}, qt = Object.freeze({ DEBUG_SAFE_CALL: !1, DEBUG_SAFE_LISTENERS: !1, DEBUG_VIEWER: !1, @@ -3223,11 +3220,11 @@ var Bt = (e) => { DELETE_CONFIRMATION: !0, DEBUG_VERBOSE_ERRORS: !1, SIDEBAR_ASSET_BADGE_ENABLED: !0 -}), qt = { ...Kt }, Jt = "mjr:asset-rating-changed", Yt = "mjr:asset-tags-changed", Xt = "mjr:viewer-info-refreshed", Zt = "mjr:viewer-active-asset-changed", Qt = Object.freeze({ - ASSET_RATING_CHANGED: Jt, - ASSET_TAGS_CHANGED: Yt, - VIEWER_INFO_REFRESHED: Xt, - VIEWER_ACTIVE_ASSET_CHANGED: Zt, +}), Jt = { ...qt }, Yt = "mjr:asset-rating-changed", Xt = "mjr:asset-tags-changed", Zt = "mjr:viewer-info-refreshed", Qt = "mjr:viewer-active-asset-changed", $t = Object.freeze({ + ASSET_RATING_CHANGED: Yt, + ASSET_TAGS_CHANGED: Xt, + VIEWER_INFO_REFRESHED: Zt, + VIEWER_ACTIVE_ASSET_CHANGED: Qt, SCAN_COMPLETE: "mjr-scan-complete", CORE_EXECUTION_ASSETS_READY: "mjr-core-execution-assets-ready", ENRICHMENT_STATUS: "mjr-enrichment-status", @@ -3262,4 +3259,4 @@ var Bt = (e) => { OPEN_NODE_CONTEXT: "mjr:open-node-context", OPEN_MESSAGE_HISTORY: "mjr:open-message-history" }); -export { Ae as $, F as A, pt as B, mt as C, u as Ct, Pe as D, Ye as E, ut as F, dt as G, Be as H, Je as I, Ue as J, Ie as K, ft as L, rt as M, Fe as N, Xe as O, lt as P, fe as Q, at as R, We as S, l as St, bt as T, Ve as U, z as V, Le as W, A as X, qe as Y, pe as Z, Re as _, S as _t, Xt as a, ue as at, ht as b, o as bt, Ut as c, se as ct, Vt as d, ne as dt, ke as et, $ as f, y as ft, ze as g, le as gt, G as h, ce as ht, Zt as i, ee as it, He as j, Ne as k, Wt as l, b as lt, Gt as m, ie as mt, Yt as n, _ as nt, qt as o, x as ot, Ht as p, v as pt, Me as q, Qt as r, oe as rt, Kt as s, ae as st, Jt as t, g as tt, Bt as u, re as ut, ot as v, C as vt, it as w, ct as x, s as xt, yt as y, d as yt, Ke as z }; +export { pe as $, P as A, Ye as B, gt as C, s as Ct, Pe as D, Ze as E, ft as F, Le as G, R as H, Xe as I, Ie as J, Be as K, mt as L, at as M, Fe as N, Qe as O, dt as P, A as Q, Re as R, qe as S, o as St, St as T, u as Tt, Ue as U, ht as V, We as W, ze as X, Me as Y, Ke as Z, Ve as _, ce as _t, Zt as a, oe as at, _t as b, C as bt, Wt as c, x as ct, Ht as d, b as dt, fe as et, $ as f, re as ft, He as g, ie as gt, W as h, v as ht, Qt as i, _ as it, Ge as j, Ne as k, Gt as l, ae as lt, Kt as m, y as mt, Xt as n, ke as nt, Jt as o, ee as ot, Ut as p, ne as pt, pt as q, $t as r, g as rt, qt as s, ue as st, Yt as t, Ae as tt, Vt as u, se as ut, ct as v, le as vt, ot as w, l as wt, ut as x, d as xt, xt as y, S as yt, st as z }; diff --git a/dist/chunks/floatingViewerManager-DKOeP6-T.js b/dist/chunks/floatingViewerManager-Gv7MTmpu.js similarity index 90% rename from dist/chunks/floatingViewerManager-DKOeP6-T.js rename to dist/chunks/floatingViewerManager-Gv7MTmpu.js index 0c60d21d..3775a913 100644 --- a/dist/chunks/floatingViewerManager-DKOeP6-T.js +++ b/dist/chunks/floatingViewerManager-Gv7MTmpu.js @@ -1,6 +1,6 @@ import { t as e } from "./rolldown-runtime-CGnMp29N.js"; -import { _ as t, d as n, o as r, s as i, t as a } from "./viewerRuntimeHosts-DQcoOjsY.js"; -import { o, r as s, z as c } from "./events-DxfljH4A.js"; +import { _ as t, d as n, o as r, s as i, t as a } from "./viewerRuntimeHosts-D3Jyfx0-.js"; +import { B as o, o as s, r as c } from "./events-BRfpU-6M.js"; // ui/features/panel/panelRuntimeRefs.ts var l = null; function u(e) { @@ -96,7 +96,7 @@ var te = /* @__PURE__ */ e({ teardownFloatingViewerManager: () => we }), v = null, y = null; async function ne() { - return v || (y ||= import("./FloatingViewer-C99U6UdL.js").then((e) => (v = e.FloatingViewer, v)), y); + return v || (y ||= import("./FloatingViewer-Cccq5sHS.js").then((e) => (v = e.FloatingViewer, v)), y); } var b = null, re = null; async function ie() { @@ -117,10 +117,10 @@ function ae(e) { } var S = null; function C() { - return o.MFV_LIVE_DEFAULT !== !1; + return s.MFV_LIVE_DEFAULT !== !1; } function w() { - return o.MFV_PREVIEW_DEFAULT !== !1; + return s.MFV_PREVIEW_DEFAULT !== !1; } var T = C(), E = w(), D = !1, O = null, k = !1, A = null, j = 0; function oe() { @@ -178,7 +178,7 @@ function se() { } } function F(e) { - typeof window < "u" && window.dispatchEvent(new CustomEvent(s.MFV_VISIBILITY_CHANGED, { detail: { visible: !!e } })); + typeof window < "u" && window.dispatchEvent(new CustomEvent(c.MFV_VISIBILITY_CHANGED, { detail: { visible: !!e } })); } function I(e) { e && (e.setLiveActive(T), e.setPreviewActive(E), e.setNodeStreamActive?.(D)); @@ -299,10 +299,10 @@ function B(e) { } } function V() { - k || typeof window < "u" && (window.addEventListener(s.SELECTION_CHANGED, B), k = !0); + k || typeof window < "u" && (window.addEventListener(c.SELECTION_CHANGED, B), k = !0); } function H() { - typeof window < "u" && window.removeEventListener(s.SELECTION_CHANGED, B), k = !1, N(); + typeof window < "u" && window.removeEventListener(c.SELECTION_CHANGED, B), k = !1, N(); } var U = !1, W = null, G = null, K = ""; function q() { @@ -329,7 +329,7 @@ function de() { } function J() { if (!U) try { - W = c(ue, { includePointerFallback: !0 }), U = typeof W == "function"; + W = o(ue, { includePointerFallback: !0 }), U = typeof W == "function"; } catch (e) { console.debug?.("[MFV] _bindNodeSelectionListener error", e); } @@ -394,7 +394,7 @@ var Y = { }, async upsertWithContent(e) { let t = await M(), n = !!t.isVisible; - (n || o.MFV_LIVE_AUTO_OPEN !== !1) && (t.show(), I(t), V(), ce(t, e), n || F(!0)); + (n || s.MFV_LIVE_AUTO_OPEN !== !1) && (t.show(), I(t), V(), ce(t, e), n || F(!0)); }, setLiveActive(e) { T = !!e, S?.setLiveActive(T); @@ -413,12 +413,12 @@ var Y = { return E; }, canAcceptPreviewBlob() { - return E ? S?.isVisible ? !0 : o.MFV_PREVIEW_AUTO_OPEN !== !1 : !1; + return E ? S?.isVisible ? !0 : s.MFV_PREVIEW_AUTO_OPEN !== !1 : !1; }, async feedPreviewBlob(e, t = {}) { if (!Y.canAcceptPreviewBlob()) return; let n = await M(), r = !!n.isVisible; - (r || o.MFV_PREVIEW_AUTO_OPEN !== !1) && (n.isVisible || n.show(), I(n), n.loadPreviewBlob(e, ...Object.keys(t).length ? [t] : []), r || F(!0)); + (r || s.MFV_PREVIEW_AUTO_OPEN !== !1) && (n.isVisible || n.show(), I(n), n.loadPreviewBlob(e, ...Object.keys(t).length ? [t] : []), r || F(!0)); }, toggleNodeStream() { Y.setNodeStreamActive(!D); @@ -443,7 +443,7 @@ var Y = { async feedNodeStream(e) { if (!D) return; let t = await M(), n = !!t.isVisible; - (n || o.MFV_NODE_STREAM_AUTO_OPEN !== !1) && (t.isVisible || (t.show(), V()), I(t), L(t), ce(t, e), n || F(!0)); + (n || s.MFV_NODE_STREAM_AUTO_OPEN !== !1) && (t.isVisible || (t.show(), V()), I(t), L(t), ce(t, e), n || F(!0)); } }, X = !1, pe = () => Y.open(), me = () => Y.close(), he = () => Y.toggle(), Z = () => Y.toggleLive(), ge = () => Y.togglePreview(), _e = () => Y.toggleNodeStream(), ve = () => Y.popOut(), ye = () => { try { @@ -504,10 +504,10 @@ var Q = (e) => { } }; function $() { - X || typeof window < "u" && window?.addEventListener && (window.addEventListener(s.MFV_OPEN, pe), window.addEventListener(s.MFV_CLOSE, me), window.addEventListener(s.MFV_TOGGLE, he), window.addEventListener(s.MFV_LIVE_TOGGLE, Z), window.addEventListener(s.MFV_PREVIEW_TOGGLE, ge), window.addEventListener(s.MFV_NODESTREAM_TOGGLE, _e), window.addEventListener(s.MFV_POPOUT, ve), window.addEventListener(s.SETTINGS_CHANGED, be), window.addEventListener("keydown", Q, !0), window.addEventListener("beforeunload", ye), X = !0); + X || typeof window < "u" && window?.addEventListener && (window.addEventListener(c.MFV_OPEN, pe), window.addEventListener(c.MFV_CLOSE, me), window.addEventListener(c.MFV_TOGGLE, he), window.addEventListener(c.MFV_LIVE_TOGGLE, Z), window.addEventListener(c.MFV_PREVIEW_TOGGLE, ge), window.addEventListener(c.MFV_NODESTREAM_TOGGLE, _e), window.addEventListener(c.MFV_POPOUT, ve), window.addEventListener(c.SETTINGS_CHANGED, be), window.addEventListener("keydown", Q, !0), window.addEventListener("beforeunload", ye), X = !0); } function Ce() { - typeof window > "u" || !window?.removeEventListener || (window.removeEventListener(s.MFV_OPEN, pe), window.removeEventListener(s.MFV_CLOSE, me), window.removeEventListener(s.MFV_TOGGLE, he), window.removeEventListener(s.MFV_LIVE_TOGGLE, Z), window.removeEventListener(s.MFV_PREVIEW_TOGGLE, ge), window.removeEventListener(s.MFV_NODESTREAM_TOGGLE, _e), window.removeEventListener(s.MFV_POPOUT, ve), window.removeEventListener(s.SETTINGS_CHANGED, be), window.removeEventListener("keydown", Q, !0), window.removeEventListener("beforeunload", ye)), X = !1; + typeof window > "u" || !window?.removeEventListener || (window.removeEventListener(c.MFV_OPEN, pe), window.removeEventListener(c.MFV_CLOSE, me), window.removeEventListener(c.MFV_TOGGLE, he), window.removeEventListener(c.MFV_LIVE_TOGGLE, Z), window.removeEventListener(c.MFV_PREVIEW_TOGGLE, ge), window.removeEventListener(c.MFV_NODESTREAM_TOGGLE, _e), window.removeEventListener(c.MFV_POPOUT, ve), window.removeEventListener(c.SETTINGS_CHANGED, be), window.removeEventListener("keydown", Q, !0), window.removeEventListener("beforeunload", ye)), X = !1; } function we({ reinstallGlobalHandlers: e = !1 } = {}) { let t = !!S?.isVisible; diff --git a/dist/chunks/genInfo-Dxtoun1T.js b/dist/chunks/genInfo-BkEKNdy-.js similarity index 99% rename from dist/chunks/genInfo-Dxtoun1T.js rename to dist/chunks/genInfo-BkEKNdy-.js index 056f1e44..4fbbf7a3 100644 --- a/dist/chunks/genInfo-Dxtoun1T.js +++ b/dist/chunks/genInfo-BkEKNdy-.js @@ -1,7 +1,7 @@ import { t as e } from "./rolldown-runtime-CGnMp29N.js"; -import { m as t, o as n } from "./events-DxfljH4A.js"; -import { h as r } from "./Viewer-DI9upE3v.js"; -import { i, n as a, r as o, t as s, u as c } from "./SidebarWorkflowSection-BHtHjc_k.js"; +import { m as t, o as n } from "./events-BRfpU-6M.js"; +import { h as r } from "./Viewer-geJFRz8N.js"; +import { i, n as a, r as o, t as s, u as c } from "./SidebarWorkflowSection-BihItyAk.js"; import { D as l, E as u, N as d, O as f, T as p, V as m, dt as h, ft as g, k as _, lt as v } from "./mjr-primevue-BRqtdXzb.js"; // ui/vue/components/viewer/ViewerMetadataBlock.vue?vue&type=script&setup=true&lang.ts var y = { style: { diff --git a/dist/chunks/model3dRenderer-k0ey48io.js b/dist/chunks/model3dRenderer-DdPKugXy.js similarity index 94% rename from dist/chunks/model3dRenderer-k0ey48io.js rename to dist/chunks/model3dRenderer-DdPKugXy.js index 2641c018..67ce336c 100644 --- a/dist/chunks/model3dRenderer-k0ey48io.js +++ b/dist/chunks/model3dRenderer-DdPKugXy.js @@ -1,5 +1,5 @@ import { t as e } from "./rolldown-runtime-CGnMp29N.js"; -import { m as t, mt as n, o as r, r as i } from "./events-DxfljH4A.js"; +import { gt as t, m as n, o as r, r as i } from "./events-BRfpU-6M.js"; import { n as a } from "./state-D0Gu1AgG.js"; // ui/features/viewer/model3dCore.ts function o(e, t) { @@ -544,16 +544,16 @@ function T(e) { let t = Math.max(0, Number(e) || 0), n = Math.floor(t / 60), r = Math.floor(t % 60); return n > 0 ? `${n}:${String(r).padStart(2, "0")}` : `${Math.floor(t)}s`; } -function E(e, n) { +function E(e, t) { let r = document.createElement("button"); - return r.type = "button", r.textContent = String(e || ""), r.title = String(n || e || ""), r.setAttribute("aria-label", String(n || e || t("model3d.viewportAction", "3D viewport action"))), r.style.cssText = "height:28px;padding:0 10px;border-radius:999px;border:1px solid rgba(255,255,255,0.16);background:rgba(13,15,20,0.78);color:rgba(255,255,255,0.92);font:600 11px system-ui,sans-serif;letter-spacing:0.02em;cursor:pointer;backdrop-filter:blur(8px);display:inline-flex;align-items:center;justify-content:center;box-shadow:0 4px 18px rgba(0,0,0,0.24)", r; + return r.type = "button", r.textContent = String(e || ""), r.title = String(t || e || ""), r.setAttribute("aria-label", String(t || e || n("model3d.viewportAction", "3D viewport action"))), r.style.cssText = "height:28px;padding:0 10px;border-radius:999px;border:1px solid rgba(255,255,255,0.16);background:rgba(13,15,20,0.78);color:rgba(255,255,255,0.92);font:600 11px system-ui,sans-serif;letter-spacing:0.02em;cursor:pointer;backdrop-filter:blur(8px);display:inline-flex;align-items:center;justify-content:center;box-shadow:0 4px 18px rgba(0,0,0,0.24)", r; } function D(e, t) { if (!e) return; let n = !!t; e.dataset.active = n ? "1" : "0", e.style.background = n ? "rgba(76,175,80,0.18)" : "rgba(13,15,20,0.78)", e.style.borderColor = n ? "rgba(76,175,80,0.42)" : "rgba(255,255,255,0.16)", e.style.color = n ? "rgba(230,255,235,0.96)" : "rgba(255,255,255,0.92)"; } -function O(e, n, r = "", i = "#4CAF50") { +function O(e, t, r = "", i = "#4CAF50") { if (!e) return; try { let t = Math.max(480, Number(e.width) || 960), n = Math.max(270, Number(e.height) || 540); @@ -572,17 +572,17 @@ function O(e, n, r = "", i = "#4CAF50") { let o = Number(e.width) || 960, s = Number(e.height) || 540, c = o / 2, l = s / 2; try { let e = a.createLinearGradient(0, 0, o, s); - e.addColorStop(0, "#0f1419"), e.addColorStop(1, "#11181f"), a.fillStyle = e, a.fillRect(0, 0, o, s), a.save(), a.translate(c, l - 32), a.strokeStyle = i, a.lineWidth = 3, a.globalAlpha = .95, a.beginPath(), a.moveTo(0, -44), a.lineTo(42, -22), a.lineTo(42, 22), a.lineTo(0, 44), a.lineTo(-42, 22), a.lineTo(-42, -22), a.closePath(), a.stroke(), a.beginPath(), a.moveTo(0, -44), a.lineTo(0, 0), a.lineTo(42, 22), a.moveTo(0, 0), a.lineTo(-42, 22), a.moveTo(-42, -22), a.lineTo(0, 0), a.moveTo(42, -22), a.lineTo(0, 0), a.stroke(), a.restore(), a.fillStyle = "rgba(255,255,255,0.94)", a.font = "600 18px system-ui, sans-serif", a.textAlign = "center", a.textBaseline = "middle", a.fillText(String(n || t("model3d.preview", "3D preview")), c, l + 44), r && (a.fillStyle = "rgba(255,255,255,0.62)", a.font = "13px system-ui, sans-serif", a.fillText(String(r), c, l + 72)); + e.addColorStop(0, "#0f1419"), e.addColorStop(1, "#11181f"), a.fillStyle = e, a.fillRect(0, 0, o, s), a.save(), a.translate(c, l - 32), a.strokeStyle = i, a.lineWidth = 3, a.globalAlpha = .95, a.beginPath(), a.moveTo(0, -44), a.lineTo(42, -22), a.lineTo(42, 22), a.lineTo(0, 44), a.lineTo(-42, 22), a.lineTo(-42, -22), a.closePath(), a.stroke(), a.beginPath(), a.moveTo(0, -44), a.lineTo(0, 0), a.lineTo(42, 22), a.moveTo(0, 0), a.lineTo(-42, 22), a.moveTo(-42, -22), a.lineTo(0, 0), a.moveTo(42, -22), a.lineTo(0, 0), a.stroke(), a.restore(), a.fillStyle = "rgba(255,255,255,0.94)", a.font = "600 18px system-ui, sans-serif", a.textAlign = "center", a.textBaseline = "middle", a.fillText(String(t || n("model3d.preview", "3D preview")), c, l + 44), r && (a.fillStyle = "rgba(255,255,255,0.62)", a.font = "13px system-ui, sans-serif", a.fillText(String(r), c, l + 72)); } catch (i) { console.debug?.(i); try { - b(e, n, r || t("model3d.unavailable", "3D viewer unavailable")); + b(e, t, r || n("model3d.unavailable", "3D viewer unavailable")); } catch (e) { console.debug?.(e); } } } -function ne({ defaultBgColor: e, defaultFov: n, defaultLightIntensity: r, hasSkeleton: i } = {}) { +function ne({ defaultBgColor: e, defaultFov: t, defaultLightIntensity: r, hasSkeleton: i } = {}) { let a = document.createElement("div"); a.className = "mjr-model3d-settings", a.style.cssText = "position:absolute;right:0;top:44px;width:210px;max-height:calc(100% - 100px);overflow-y:auto;background:rgba(14,18,26,0.96);border:1px solid rgba(255,255,255,0.10);border-right:none;border-radius:10px 0 0 10px;padding:10px 10px 12px 10px;z-index:4;display:none;box-shadow:-6px 4px 24px rgba(0,0,0,0.5);backdrop-filter:blur(12px);font:13px system-ui,sans-serif;color:rgba(255,255,255,0.88);scrollbar-width:thin", [ "pointerdown", @@ -634,7 +634,7 @@ function ne({ defaultBgColor: e, defaultFov: n, defaultLightIntensity: r, hasSke }; o("Scene"); let u = document.createElement("input"); - u.type = "color", u.value = e || "#282828", u.style.cssText = "width:34px;height:24px;cursor:pointer;border:1px solid rgba(255,255,255,0.18);border-radius:4px;padding:1px;background:none;flex-shrink:0;", s(t("model3d.background", "Background"), u), o("Model"); + u.type = "color", u.value = e || "#282828", u.style.cssText = "width:34px;height:24px;cursor:pointer;border:1px solid rgba(255,255,255,0.18);border-radius:4px;padding:1px;background:none;flex-shrink:0;", s(n("model3d.background", "Background"), u), o("Model"); let d = c([ ["original", "Original"], ["normal", "Normal map"], @@ -642,7 +642,7 @@ function ne({ defaultBgColor: e, defaultFov: n, defaultLightIntensity: r, hasSke ["wireframe", "Wireframe"], ["pointcloud", "Point cloud"] ], "original"); - s(t("model3d.material", "Material"), d); + s(n("model3d.material", "Material"), d); let f = c([ ["original", "Original"], ["+y", "+Y (default)"], @@ -654,11 +654,11 @@ function ne({ defaultBgColor: e, defaultFov: n, defaultLightIntensity: r, hasSke ], "original"); s("Up", f); let p = null, m = null; - i && (m = document.createElement("input"), m.type = "checkbox", m.checked = !1, m.style.cssText = "cursor:pointer;accent-color:#4CAF50;flex-shrink:0;", p = s(t("model3d.skeleton", "Skeleton"), m)), o("Camera"); - let h = l(15, 120, 1, n ?? 75); - s("FOV", h.wrap), o(t("model3d.lights", "Lights")); + i && (m = document.createElement("input"), m.type = "checkbox", m.checked = !1, m.style.cssText = "cursor:pointer;accent-color:#4CAF50;flex-shrink:0;", p = s(n("model3d.skeleton", "Skeleton"), m)), o("Camera"); + let h = l(15, 120, 1, t ?? 75); + s("FOV", h.wrap), o(n("model3d.lights", "Lights")); let g = l(0, 5, .1, r ?? 1); - return s(t("model3d.intensity", "Intensity"), g.wrap), { + return s(n("model3d.intensity", "Intensity"), g.wrap), { panel: a, bgInput: u, materialSel: d, @@ -699,10 +699,10 @@ function re() { ].forEach((t) => { e.addEventListener(t, (e) => w(e, { preventDefault: !1 })); }); - let n = document.createElement("button"); - n.type = "button", n.textContent = t("model3d.play", "Play"), n.title = t("model3d.playPause", "Play / Pause"), n.style.cssText = "width:28px;height:28px;border-radius:50%;border:1px solid rgba(255,255,255,0.18);background:rgba(76,175,80,0.14);color:rgba(255,255,255,0.92);font:600 12px system-ui,sans-serif;cursor:pointer;flex-shrink:0;padding:0;line-height:1;display:flex;align-items:center;justify-content:center"; + let t = document.createElement("button"); + t.type = "button", t.textContent = n("model3d.play", "Play"), t.title = n("model3d.playPause", "Play / Pause"), t.style.cssText = "width:28px;height:28px;border-radius:50%;border:1px solid rgba(255,255,255,0.18);background:rgba(76,175,80,0.14);color:rgba(255,255,255,0.92);font:600 12px system-ui,sans-serif;cursor:pointer;flex-shrink:0;padding:0;line-height:1;display:flex;align-items:center;justify-content:center"; let r = document.createElement("select"); - r.title = t("model3d.playbackSpeed", "Playback speed"), r.style.cssText = "background:rgba(20,24,34,0.9);color:rgba(255,255,255,0.8);border:1px solid rgba(255,255,255,0.14);border-radius:6px;padding:3px 4px;font:11px system-ui,sans-serif;cursor:pointer;width:52px;flex-shrink:0"; + r.title = n("model3d.playbackSpeed", "Playback speed"), r.style.cssText = "background:rgba(20,24,34,0.9);color:rgba(255,255,255,0.8);border:1px solid rgba(255,255,255,0.14);border-radius:6px;padding:3px 4px;font:11px system-ui,sans-serif;cursor:pointer;width:52px;flex-shrink:0"; for (let e of S) { let t = document.createElement("option"); t.value = String(e), t.textContent = `${e}x`, e === 1 && (t.selected = !0), r.appendChild(t); @@ -712,9 +712,9 @@ function re() { let a = document.createElement("input"); a.type = "range", a.min = "0", a.max = "1000", a.value = "0", a.style.cssText = "flex:1;min-width:50px;cursor:pointer;accent-color:#4CAF50;height:3px;"; let o = document.createElement("span"); - return o.style.cssText = "font:500 11px system-ui,sans-serif;color:rgba(255,255,255,0.45);white-space:nowrap;flex-shrink:0", o.textContent = "0s / 0s", e.appendChild(n), e.appendChild(r), e.appendChild(i), e.appendChild(a), e.appendChild(o), { + return o.style.cssText = "font:500 11px system-ui,sans-serif;color:rgba(255,255,255,0.45);white-space:nowrap;flex-shrink:0", o.textContent = "0s / 0s", e.appendChild(t), e.appendChild(r), e.appendChild(i), e.appendChild(a), e.appendChild(o), { bar: e, - playBtn: n, + playBtn: t, speedSel: r, animSel: i, progressSlider: a, @@ -738,7 +738,7 @@ var ie = Object.freeze({ "fbx", "stl", "ply" -]), oe = "#282828", se = t("model3d.controlHint", "Rotate: left drag Pan: right drag Zoom: wheel"), A = Object.freeze({ +]), oe = "#282828", se = n("model3d.controlHint", "Rotate: left drag Pan: right drag Zoom: wheel"), A = Object.freeze({ PERSPECTIVE: "perspective", ORTHOGRAPHIC: "orthographic" }); @@ -877,7 +877,7 @@ function F(e, a, o = {}) { S.className = "mjr-model3d-toolbar", S.style.cssText = "position:absolute;top:10px;right:10px;display:flex;align-items:center;gap:6px;flex-wrap:wrap;pointer-events:none;z-index:5"; let C = document.createElement("div"); C.style.cssText = "display:flex;align-items:center;gap:6px;flex-wrap:wrap;pointer-events:auto;"; - let ie = E(t("model3d.reset", "Reset"), t("model3d.resetView", "Reset 3D view")), k = E(t("model3d.grid", "Grid"), t("model3d.toggleGrid", "Toggle grid")), pe = E(t("model3d.persp", "Persp"), t("model3d.switchCamera", "Switch perspective / orthographic")), me = E(t("model3d.settings", "Settings"), t("model3d.settings", "Settings")); + let ie = E(n("model3d.reset", "Reset"), n("model3d.resetView", "Reset 3D view")), k = E(n("model3d.grid", "Grid"), n("model3d.toggleGrid", "Toggle grid")), pe = E(n("model3d.persp", "Persp"), n("model3d.switchCamera", "Switch perspective / orthographic")), me = E(n("model3d.settings", "Settings"), n("model3d.settings", "Settings")); C.append(ie, k, pe, me), S.appendChild(C), _.appendChild(S); let M = document.createElement("div"); M.className = "mjr-model3d-hint", M.textContent = o.hintText || se, M.style.cssText = "position:absolute;right:10px;bottom:10px;padding:5px 10px;border-radius:999px;font:500 11px system-ui,sans-serif;color:rgba(255,255,255,0.75);background:rgba(0,0,0,0.35);backdrop-filter:blur(6px);pointer-events:none;z-index:2;transition:bottom 0.2s", _.appendChild(M); @@ -1013,8 +1013,8 @@ function F(e, a, o = {}) { } }, qe = (e) => { if (!X || !Z.length) return; - let n = Z[e]; - if (!n) return; + let t = Z[e]; + if (!t) return; Q.forEach((e) => { try { e?.stop(); @@ -1022,14 +1022,14 @@ function F(e, a, o = {}) { console.debug?.(e); } }); - let r = X.clipAction(n); - r.timeScale = Ae, r.clampWhenFinished = !1, r.loop = I?.LoopRepeat ?? 2201, r.play(), Q[e] = r, $ = e, je = !0, P.playBtn.textContent = t("model3d.pause", "Pause"); + let r = X.clipAction(t); + r.timeScale = Ae, r.clampWhenFinished = !1, r.loop = I?.LoopRepeat ?? 2201, r.play(), Q[e] = r, $ = e, je = !0, P.playBtn.textContent = n("model3d.pause", "Pause"); try { - let e = Math.max(100, Math.min(1e4, Math.round((n.duration || 1) * 100))); + let e = Math.max(100, Math.min(1e4, Math.round((t.duration || 1) * 100))); P.progressSlider.max = String(e); } catch {} }, Je = () => { - X && Z.length && (je ? (X.timeScale = 0, je = !1, P.playBtn.textContent = t("model3d.play", "Play")) : (X.timeScale = Ae, Q[$]?.isRunning?.() ? (je = !0, P.playBtn.textContent = t("model3d.pause", "Pause")) : qe($))); + X && Z.length && (je ? (X.timeScale = 0, je = !1, P.playBtn.textContent = n("model3d.play", "Play")) : (X.timeScale = Ae, Q[$]?.isRunning?.() ? (je = !0, P.playBtn.textContent = n("model3d.pause", "Pause")) : qe($))); }, Ye = (e, t) => { e && e.length !== 0 && I && (Z = e, X = new I.AnimationMixer(t), ke = new I.Clock(), Q = Array(e.length).fill(null), P.animSel.innerHTML = "", e.forEach((e, t) => { let n = document.createElement("option"); @@ -1060,7 +1060,7 @@ function F(e, a, o = {}) { } })); }, Xe = () => { - D(k, !!W?.visible), D(pe, q === A.ORTHOGRAPHIC), pe.textContent = q === A.ORTHOGRAPHIC ? t("model3d.ortho", "Ortho") : t("model3d.persp", "Persp"), D(me, Ne); + D(k, !!W?.visible), D(pe, q === A.ORTHOGRAPHIC), pe.textContent = q === A.ORTHOGRAPHIC ? n("model3d.ortho", "Ortho") : n("model3d.persp", "Persp"), D(me, Ne); }; N.bgInput.addEventListener("input", () => { let e = N.bgInput.value; @@ -1237,26 +1237,26 @@ function F(e, a, o = {}) { return Ie("Preparing 3D preview", Pe), Promise.resolve().then(async () => { let r = he(e); if (ae.has(r)) try { - let t = await te(); + let n = await te(); if (F) return; - let i = t.THREE; + let i = n.THREE; I = i; let l = new i.LoadingManager(); - l.setURLModifier((t) => { - if (!t || fe(t)) return t; - let r = n(e, t); + l.setURLModifier((n) => { + if (!n || fe(n)) return n; + let r = t(e, n); if (r) return r; try { - return new URL(t, a).href; + return new URL(n, a).href; } catch { - return t; + return n; } }), L = new i.WebGLRenderer({ canvas: y, antialias: !0, alpha: !0, preserveDrawingBuffer: !0 - }), L.outputColorSpace = i.SRGBColorSpace, L.setPixelRatio(Math.min(2, window.devicePixelRatio || 1)), R = new i.Scene(), R.background = new i.Color(oe), B = new i.PerspectiveCamera(le, 16 / 9, .01, 1e4), V = new i.OrthographicCamera(-1, 1, 1, -1, -1e4, 1e4), z = B, H = new t.OrbitControls(z, y), H.enableDamping = !0, H.dampingFactor = .08, H.rotateSpeed = .82, H.zoomSpeed = 1, H.panSpeed = .9, H.screenSpacePanning = !0, H.mouseButtons = ge(null, i.MOUSE), xe = Ze(), De = new i.AmbientLight(16777215, j.ambient * Y), R.add(De); + }), L.outputColorSpace = i.SRGBColorSpace, L.setPixelRatio(Math.min(2, window.devicePixelRatio || 1)), R = new i.Scene(), R.background = new i.Color(oe), B = new i.PerspectiveCamera(le, 16 / 9, .01, 1e4), V = new i.OrthographicCamera(-1, 1, 1, -1, -1e4, 1e4), z = B, H = new n.OrbitControls(z, y), H.enableDamping = !0, H.dampingFactor = .08, H.rotateSpeed = .82, H.zoomSpeed = 1, H.panSpeed = .9, H.screenSpacePanning = !0, H.mouseButtons = ge(null, i.MOUSE), xe = Ze(), De = new i.AmbientLight(16777215, j.ambient * Y), R.add(De); let u = new i.DirectionalLight(16777215, j.main * Y); u.position.set(0, 10, 10); let p = new i.DirectionalLight(16777215, j.back * Y); @@ -1279,14 +1279,14 @@ function F(e, a, o = {}) { L.setSize(t, n, !1), B && (B.aspect = t / n, B.updateProjectionMatrix()), ze(t, n), Re(), Fe(); }; typeof ResizeObserver < "u" && (_e = new ResizeObserver(() => x()), _e.observe(_)); - let S = v(t, r, l); + let S = v(n, r, l); if (!S) { Ie("3D loader unavailable", `${r.toUpperCase()} loader could not be created.`), M.style.display = "none"; return; } - if (r === "obj" && t.MTLLoader) try { - let e = a.replace(/\.obj(\?.*)?$/i, (e, t) => `.mtl${t || ""}`), n = new t.MTLLoader(l), r = await new Promise((t) => { - n.load(e, t, void 0, () => t(null)); + if (r === "obj" && n.MTLLoader) try { + let e = a.replace(/\.obj(\?.*)?$/i, (e, t) => `.mtl${t || ""}`), t = new n.MTLLoader(l), r = await new Promise((n) => { + t.load(e, n, void 0, () => n(null)); }); r && !F && (r.preload(), S.setMaterials(r)); } catch (e) { @@ -1435,8 +1435,8 @@ function F(e, a, o = {}) { console.warn("[MJR 3D] preview init failed", e), Ie("Failed to load 3D preview", String(e?.message || "Three.js initialization failed.")), M.style.display = "none"; } else if (Ie("3D preview unavailable", `${r.toUpperCase()} is not supported in the embedded viewer.`), M.style.display = "none", a) try { - let n = document.createElement("a"); - n.href = a, n.download = String(e?.filename || "model"), n.textContent = t("model3d.downloadFile", "Download {file}", { file: String(e?.filename || "file") }), n.style.cssText = "position:absolute;bottom:18px;left:50%;transform:translateX(-50%);padding:7px 16px;border-radius:8px;font:600 12px system-ui,sans-serif;color:#fff;background:rgba(76,175,80,0.85);text-decoration:none;pointer-events:auto;z-index:3", _.appendChild(n); + let t = document.createElement("a"); + t.href = a, t.download = String(e?.filename || "model"), t.textContent = n("model3d.downloadFile", "Download {file}", { file: String(e?.filename || "file") }), t.style.cssText = "position:absolute;bottom:18px;left:50%;transform:translateX(-50%);padding:7px 16px;border-radius:8px;font:600 12px system-ui,sans-serif;color:#fff;background:rgba(76,175,80,0.85);text-decoration:none;pointer-events:auto;z-index:3", _.appendChild(t); } catch {} }).catch((e) => { if (!F) { diff --git a/dist/chunks/openMajoorSettings-BfOHsVlq.js b/dist/chunks/openMajoorSettings-Cd5Nutru.js similarity index 83% rename from dist/chunks/openMajoorSettings-BfOHsVlq.js rename to dist/chunks/openMajoorSettings-Cd5Nutru.js index 3f6a8644..0635730a 100644 --- a/dist/chunks/openMajoorSettings-BfOHsVlq.js +++ b/dist/chunks/openMajoorSettings-Cd5Nutru.js @@ -1,18 +1,18 @@ -import { A as e, E as t, J as n, R as r, S as i, Y as a, b as o, j as s, m as c } from "./events-DxfljH4A.js"; -import { a as l, n as u } from "./graphTraversal-DTdQWkn5.js"; -import { S as d, Y as f, b as p, x as m, y as h } from "./SidebarWorkflowSection-BHtHjc_k.js"; +import { A as e, E as t, S as n, Z as r, b as i, j as a, m as o, z as s } from "./events-BRfpU-6M.js"; +import { a as c, n as l } from "./graphTraversal-DTdQWkn5.js"; +import { S as u, Y as d, b as f, x as p, y as m } from "./SidebarWorkflowSection-BihItyAk.js"; // ui/features/viewer/floatingViewerProgress.ts -var g = "progress-update", _ = "__MJR_MFV_PROGRESS_SERVICE__"; +var h = "progress-update", g = "__MJR_MFV_PROGRESS_SERVICE__"; function ee() { return typeof globalThis < "u" ? globalThis : typeof window < "u" ? window : {}; } -function v(e, t) { +function _(e, t) { if (typeof CustomEvent == "function") return new CustomEvent(e, { detail: t }); let n = typeof Event == "function" ? new Event(e) : { type: e }; return n.detail = t, n; } var te = class { - constructor(e, t = () => s()) { + constructor(e, t = () => a()) { this.id = String(e || ""), this.promptApi = null, this.executedNodeIds = [], this.totalNodes = 0, this.currentlyExecuting = null, this.errorDetails = null, this._getApp = typeof t == "function" ? t : () => null; } setPrompt(e) { @@ -25,7 +25,7 @@ var te = class { getNodeLabel(e) { let t = this.getApiNode(e), n = t?._meta?.title || t?.class_type || ""; if (!n) { - let t = this._getApp?.(), r = u(l(t), e); + let t = this._getApp?.(), r = l(c(t), e); n = r?.title || r?.type || ""; } return String(n || "").trim(); @@ -61,8 +61,8 @@ var te = class { this.errorDetails = e || null; } }, ne = class extends EventTarget { - constructor({ getApi: t = (t) => e(t), getApp: r = () => s(), waitForApi: i = (e) => n(e) } = {}) { - super(), this._getApi = t, this._getApp = r, this._waitForApi = i, this.promptsMap = /* @__PURE__ */ new Map(), this.currentExecution = null, this.lastQueueRemaining = 0, this._api = null, this._listenerEntries = [], this._initPromise = null, this._queuePromptBinding = null; + constructor({ getApi: t = (t) => e(t), getApp: n = () => a(), waitForApi: i = (e) => r(e) } = {}) { + super(), this._getApi = t, this._getApp = n, this._waitForApi = i, this.promptsMap = /* @__PURE__ */ new Map(), this.currentExecution = null, this.lastQueueRemaining = 0, this._api = null, this._listenerEntries = [], this._initPromise = null, this._hydrations = /* @__PURE__ */ new Map(); } getSnapshot() { return { @@ -100,45 +100,51 @@ var te = class { return r ? (this._attachApi(r), r) : null; } _attachApi(e) { - e && typeof e.addEventListener == "function" && this._api !== e && (this.dispose({ - resetPatchedQueuePrompt: !1, - keepState: !0 - }), this._api = e, this._patchQueuePrompt(e), this._attachApiListeners(e)); + e && typeof e.addEventListener == "function" && this._api !== e && (this.dispose({ keepState: !0 }), this._api = e, this._attachApiListeners(e)); } - _patchQueuePrompt(e) { - let t = this; - this._queuePromptBinding = a({ - api: e, - owner: this, - createWrapper(e) { - return async function(n, r, ...i) { - let a; - try { - a = await e.apply(this, [ - n, - r, - ...i - ]); - } catch (e) { - let n = t.getOrMakePrompt("error"); - throw n.error({ exception_type: "Unknown." }), t.currentExecution = n, t.dispatchProgressUpdate(), e; - } - let o = String(a?.prompt_id || a?.promptId || "").trim(); - if (o) { - let e = t.getOrMakePrompt(o); - e.setPrompt(r), t.currentExecution ||= e, t.dispatchEvent(v("queue-prompt", { prompt: e })), t.dispatchProgressUpdate(); - } - return a; - }; + async _hydratePrompt(e, t) { + let n = String(t?.id || "").trim(); + if (!n || n === "unknown" || t.promptApi || !e) return; + if (this._hydrations.has(n)) return this._hydrations.get(n); + let r = (async () => { + let r = await this._findPromptInJob(e, n) || await this._findPromptInQueue(e, n) || await this._findPromptInHistory(e, n); + if (r && !t.promptApi) { + t.setPrompt({ output: r }); + let e = t.currentlyExecuting; + e?.nodeId && (e.nodeLabel = t.getNodeLabel(e.nodeId) || e.nodeLabel), this.promptsMap.get(n) === t && this.dispatchProgressUpdate(); } - }); + })().catch((e) => console.debug?.(e)).finally(() => this._hydrations.delete(n)); + return this._hydrations.set(n, r), r; + } + async _findPromptInJob(e, t) { + if (typeof e.getJobDetail != "function") return null; + try { + let n = (await e.getJobDetail(t))?.workflow?.prompt; + return n && typeof n == "object" && !Array.isArray(n) ? n : null; + } catch (e) { + return console.debug?.(e), null; + } + } + async _fetchJson(e, t) { + if (typeof e.fetchApi != "function") return null; + let n = await e.fetchApi(t, { cache: "no-store" }); + return !n?.ok || typeof n.json != "function" ? null : n.json(); + } + async _findPromptInQueue(e, t) { + let n = await this._fetchJson(e, "/queue"), r = [...Array.isArray(n?.queue_running) ? n.queue_running : [], ...Array.isArray(n?.queue_pending) ? n.queue_pending : []]; + for (let e of r) if (Array.isArray(e) && String(e[1] || "") === t) return e[2] && typeof e[2] == "object" ? e[2] : null; + return null; + } + async _findPromptInHistory(e, t) { + let n = (await this._fetchJson(e, `/history/${encodeURIComponent(t)}`))?.[t]?.prompt; + return Array.isArray(n) && n[2] && typeof n[2] == "object" ? n[2] : null; } _attachApiListeners(e) { this._attachListener(e, "status", (e) => { e?.detail?.exec_info && (this.lastQueueRemaining = Number(e.detail.exec_info.queue_remaining) || 0, this.dispatchProgressUpdate()); - }), this._attachListener(e, "execution_start", (e) => { - let t = String(e?.detail?.prompt_id || e?.detail?.promptId || "").trim(); - t && (this.currentExecution = this.getOrMakePrompt(t), this.dispatchProgressUpdate()); + }), this._attachListener(e, "execution_start", (t) => { + let n = String(t?.detail?.prompt_id || t?.detail?.promptId || "").trim(); + n && (this.currentExecution = this.getOrMakePrompt(n), this.dispatchProgressUpdate(), this._hydratePrompt(e, this.currentExecution)); }), this._attachListener(e, "executing", (e) => { this.currentExecution ||= this.getOrMakePrompt("unknown"), this.currentExecution.executing(e?.detail), e?.detail ?? (this.currentExecution = null), this.dispatchProgressUpdate(); }), this._attachListener(e, "progress", (e) => { @@ -172,25 +178,20 @@ var te = class { }); } dispatchProgressUpdate() { - this.dispatchEvent(v(g, this.getSnapshot())); + this.dispatchEvent(_(h, this.getSnapshot())); } - dispose({ resetPatchedQueuePrompt: e = !1, keepState: t = !1 } = {}) { + dispose({ keepState: e = !1 } = {}) { for (let { api: e, type: t, handler: n } of this._listenerEntries.splice(0)) try { e?.removeEventListener?.(t, n); } catch (e) { console.debug?.(e); } - if (e && this._queuePromptBinding?.owner === this) try { - this._queuePromptBinding.restore?.(); - } catch (e) { - console.debug?.(e); - } - this._queuePromptBinding = null, this._api = null, t || (this.promptsMap.clear(), this.currentExecution = null, this.lastQueueRemaining = 0); + this._api = null, e || (this.promptsMap.clear(), this.currentExecution = null, this.lastQueueRemaining = 0); } -}, y = ee(), b = y[_] || new ne(); -y[_] || (y[_] = b); -function x(e = {}) { - return b.ensureInitialized(e); +}, v = ee(), y = v[g] || new ne(); +v[g] || (v[g] = y); +function b(e = {}) { + return y.ensureInitialized(e); } function re(e) { let t = Math.max(0, Number(e?.queue) || 0), n = e?.prompt || null; @@ -227,7 +228,7 @@ function ie(e) { let r = String(n.nodeLabel || n.nodeId || "Node").trim(), i = Number(n.step), a = Number(n.maxSteps); return Number.isFinite(i) && Number.isFinite(a) && a > 0 ? n.pass > 1 ? `${r} #${n.pass} - ${i}/${a}` : `${r} - ${i}/${a}` : r; } -function S(e, t) { +function x(e, t) { if (!e?._progressEl && !e?._mediaProgressEl) return; let n = t?.prompt || null, r = String(n?.errorDetails?.node_id || n?.currentlyExecuting?.nodeId || "").trim(), i = "0%", a = "0%", o = !!n?.errorDetails; if (n?.currentlyExecuting) { @@ -247,7 +248,7 @@ function ae(e, t) { let n = String(t || "").trim(); if (!n) return !1; try { - return o(n, s()); + return i(n, a()); } catch (e) { return console.debug?.(e), !1; } @@ -264,78 +265,78 @@ function oe(e) { let a = document.createElement("span"); return a.className = "mjr-mfv-progress-text", a.textContent = "Idle", t.appendChild(n), t.appendChild(r), t.appendChild(i), t.appendChild(a), t.addEventListener("pointerdown", (t) => { t.button === 0 && ae(e, e._progressCurrentNodeId) && (t.preventDefault(), t.stopPropagation()); - }), e._progressEl = t, e._progressNodesEl = n, e._progressStepsEl = r, e._progressTextEl = a, e._progressUpdateHandler && b.removeEventListener(g, e._progressUpdateHandler), e._progressUpdateHandler = (t) => { - S(e, t?.detail || b.getSnapshot()); - }, b.addEventListener(g, e._progressUpdateHandler), x({ timeoutMs: 4e3 }).catch((e) => { + }), e._progressEl = t, e._progressNodesEl = n, e._progressStepsEl = r, e._progressTextEl = a, e._progressUpdateHandler && y.removeEventListener(h, e._progressUpdateHandler), e._progressUpdateHandler = (t) => { + x(e, t?.detail || y.getSnapshot()); + }, y.addEventListener(h, e._progressUpdateHandler), b({ timeoutMs: 4e3 }).catch((e) => { console.debug?.(e); - }), S(e, b.getSnapshot()), t; + }), x(e, y.getSnapshot()), t; } function se(e) { let t = document.createElement("div"); t.className = "mjr-mfv-media-progress", t.setAttribute("aria-hidden", "true"); let n = document.createElement("span"); - return n.className = "mjr-mfv-media-progress-text", t.appendChild(n), e._mediaProgressEl = t, e._mediaProgressTextEl = n, S(e, b.getSnapshot()), t; + return n.className = "mjr-mfv-media-progress-text", t.appendChild(n), e._mediaProgressEl = t, e._mediaProgressTextEl = n, x(e, y.getSnapshot()), t; } function ce(e) { if (e?._progressUpdateHandler) try { - b.removeEventListener(g, e._progressUpdateHandler); + y.removeEventListener(h, e._progressUpdateHandler); } catch (e) { console.debug?.(e); } e._progressUpdateHandler = null, e._progressCurrentNodeId = null, e._progressEl = null, e._progressNodesEl = null, e._progressStepsEl = null, e._progressTextEl = null, e._mediaProgressEl = null, e._mediaProgressTextEl = null; } // ui/features/viewer/workflowGraphMap/workflowGraphMapData.ts -var C = /* @__PURE__ */ new Map(), w = null; +var S = /* @__PURE__ */ new Map(), C = null; async function le(e) { - let t = Array.from(new Set(T(e).map((e) => O(e)).filter(Boolean))); - if (t.length && t.filter((e) => !C.has(e)).length) try { - w ||= i("/object_info").then((e) => e?.ok ? e.json() : null).then((e) => { - if (e && typeof e == "object") for (let [t, n] of Object.entries(e)) C.set(String(t), n); + let t = Array.from(new Set(w(e).map((e) => D(e)).filter(Boolean))); + if (t.length && t.filter((e) => !S.has(e)).length) try { + C ||= n("/object_info").then((e) => e?.ok ? e.json() : null).then((e) => { + if (e && typeof e == "object") for (let [t, n] of Object.entries(e)) S.set(String(t), n); return e; - }).catch(() => null), await w; + }).catch(() => null), await C; } catch {} } function ue(e) { - let t = be(e), n = xe(e); + let t = ye(e), n = be(e); for (let e of t) { - let t = Se(L(e)); - if (t) return we(t, n), R(t), t; + let t = xe(L(e)); + if (t) return Ce(t, n), R(t), t; } return null; } -function T(e, t = null) { +function w(e, t = null) { let n = t?.includeSubgraphs !== !1, r = Array.isArray(e?.nodes) ? e.nodes.filter(Boolean) : []; if (!n) return r; let i = [...r], a = H(e); for (let n of r) { let r = W(e, n, a); - r && i.push(...T(r, t)); + r && i.push(...w(r, t)); } return i; } -function E(e, t, n = null) { +function T(e, t, n = null) { let r = n?.includeSubgraphs !== !1, i = String(t ?? ""); if (!i) return null; if (!r) return (Array.isArray(e?.nodes) ? e.nodes : []).find((e) => String(e?.id ?? e?.ID ?? "") === i) || null; - if (i.includes("::")) return Pe(e, i.split("::").filter(Boolean)); + if (i.includes("::")) return Ne(e, i.split("::").filter(Boolean)); let a = (Array.isArray(e?.nodes) ? e.nodes : []).find((e) => String(e?.id ?? e?.ID ?? "") === i) || null; if (a) return a; for (let t of Array.isArray(e?.nodes) ? e.nodes : []) { - let n = W(e, t, H(e)), r = n ? E(n, i) : null; + let n = W(e, t, H(e)), r = n ? T(n, i) : null; if (r) return r; } return null; } +function E(e) { + return f(e); +} function D(e) { return p(e); } -function O(e) { - return m(e); -} function de(e) { - return d(e); + return u(e); } -function k(e) { +function O(e) { let t = fe(e), n = e?.properties && typeof e.properties == "object" ? e.properties : null; if (Array.isArray(e?._mjrSubgraphProxyParams)) for (let n of e._mjrSubgraphProxyParams) { let e = String(n?.label || n?.key || "").trim(); @@ -346,21 +347,21 @@ function k(e) { } function fe(e) { let t = [], n = e?._mjrPromptInputs && typeof e._mjrPromptInputs == "object" ? e._mjrPromptInputs : null, r = e?.inputs && typeof e.inputs == "object" ? e.inputs : null; - if (n && !Array.isArray(n)) for (let [e, r] of Object.entries(n)) M(r) || t.push([e, r]); - if (r && !Array.isArray(r)) for (let [e, n] of Object.entries(r)) M(n) || t.some(([t]) => String(t) === String(e)) || t.push([e, n]); - for (let { label: n, value: r } of A(e)) t.some(([e]) => String(e) === String(n)) || t.push([n, r]); + if (n && !Array.isArray(n)) for (let [e, r] of Object.entries(n)) j(r) || t.push([e, r]); + if (r && !Array.isArray(r)) for (let [e, n] of Object.entries(r)) j(n) || t.some(([t]) => String(t) === String(e)) || t.push([e, n]); + for (let { label: n, value: r } of k(e)) t.some(([e]) => String(e) === String(n)) || t.push([n, r]); return t; } -function A(e) { +function k(e) { let t = e?.widgets_values; if (pe(t)) return Object.entries(t).map(([e, t], n) => ({ label: e, value: t, index: n })); - let n = me(t), r = Array.isArray(e?.widgets) ? e.widgets : [], i = P(_e(e)), a = he(e); + let n = me(t), r = Array.isArray(e?.widgets) ? e.widgets : [], i = N(_e(e)), a = he(e); return n.map((t, n) => { - let o = ye(e, n, t); + let o = ve(e, n, t); return { label: a[n] || r[n]?.name || r[n]?.label || i[n] || o || `param ${n + 1}`, value: t, @@ -369,29 +370,29 @@ function A(e) { }); } function pe(e) { - return !(!e || typeof e != "object" || Array.isArray(e) || j(e)); + return !(!e || typeof e != "object" || Array.isArray(e) || A(e)); } function me(e) { if (Array.isArray(e)) return e; - if (!j(e)) return []; + if (!A(e)) return []; let t = Math.max(0, Math.floor(Number(e.length) || 0)), n = []; for (let r = 0; r < t; r += 1) n.push(e[r]); return n; } -function j(e) { +function A(e) { if (!e || typeof e != "object" || Array.isArray(e)) return !1; let t = Number(e.length); return !(!Number.isFinite(t) || t < 0); } function he(e) { - let t = (Array.isArray(e?.inputs) ? e.inputs : []).filter(F), n = [], r = /* @__PURE__ */ new Set(), i = (e) => { + let t = (Array.isArray(e?.inputs) ? e.inputs : []).filter(P), n = [], r = /* @__PURE__ */ new Set(), i = (e) => { let t = `${String(e?.name || "")}\u0000${String(e?.label || "")}\u0000${String(e?.link ?? "")}`; r.has(t) || (r.add(t), n.push(e)); }; for (let e of t) i(e); return n.map((e) => String(e?.label || e?.localized_name || e?.name || e?.widget?.name || e?.widget?.label || "").trim()); } -function M(e) { +function j(e) { return Array.isArray(e) && e.length === 2 && String(e[0] ?? "").trim() !== "" && Number.isFinite(Number(e[1])); } function ge(e) { @@ -399,39 +400,39 @@ function ge(e) { return !t || t === "cnr_id" || t === "ver" || t === "node_name_for_s&r" || t === "subgraph_name" || t === "subgraph_id" || t === "enabletabs" || t === "tabwidth" || t === "tabxoffset" || t === "hassecondtab" || t === "secondtabtext" || t === "secondtaboffset" || t === "secondtabwidth" || t.startsWith("ue_"); } function _e(e) { - let t = O(e); - return t && C.get(t) || null; + let t = D(e); + return t && S.get(t) || null; } -function N(e) { +function M(e) { let t = e?.input_order; if (t && typeof t == "object") return [...Array.isArray(t.required) ? t.required : [], ...Array.isArray(t.optional) ? t.optional : []].filter(Boolean); let n = e?.input; return n && typeof n == "object" ? ["required", "optional"].flatMap((e) => n[e] && typeof n[e] == "object" ? Object.keys(n[e]) : []).filter(Boolean) : []; } -function P(e) { +function N(e) { let t = e?.input; - if (!t || typeof t != "object") return N(e); + if (!t || typeof t != "object") return M(e); let n = []; for (let e of ["required", "optional"]) { let r = t[e]; - if (r && typeof r == "object") for (let [e, t] of Object.entries(r)) I(t) && n.push(e); + if (r && typeof r == "object") for (let [e, t] of Object.entries(r)) F(t) && n.push(e); } - return n.length ? n : N(e); + return n.length ? n : M(e); } -function F(e) { +function P(e) { return !e || typeof e != "object" ? !1 : !!(e.widget === !0 || e.widget && typeof e.widget == "object" || typeof e.widget == "string" && e.widget.trim() || e.widget_index != null || e.widgetIndex != null); } -function I(e) { +function F(e) { let t = Array.isArray(e) ? e : [], n = t[0], r = t[1] && typeof t[1] == "object" && !Array.isArray(t[1]) ? t[1] : null; - return r?.forceInput === !0 || r?.rawLink === !0 ? !1 : r?.widgetType && String(r.widgetType).trim() ? !0 : ve(n); + return r?.forceInput === !0 || r?.rawLink === !0 ? !1 : r?.widgetType && String(r.widgetType).trim() ? !0 : I(n); } -function ve(e) { +function I(e) { if (Array.isArray(e)) return !0; let t = String(e || "").trim().toUpperCase(); return t ? t === "INT" || t === "FLOAT" || t === "STRING" || t === "BOOLEAN" || t === "BOOL" || t === "COMBO" || t === "ENUM" : !1; } -function ye(e, t, n) { - let r = O(e), i = D(e), a = `${r} ${i}`.toLowerCase(), o = String(n ?? "").toLowerCase(); +function ve(e, t, n) { + let r = D(e), i = E(e), a = `${r} ${i}`.toLowerCase(), o = String(n ?? "").toLowerCase(); if (a.includes("ksamplerselect")) return "sampler_name"; if (a.includes("ksampler")) return [ "seed", @@ -472,7 +473,7 @@ function ye(e, t, n) { } return null; } -function be(e) { +function ye(e) { let t = L(e?.metadata_raw), n = L(e?.metadata); return [ e?.workflow, @@ -514,7 +515,7 @@ function be(e) { n?.Prompt ].filter((e) => e != null); } -function xe(e) { +function be(e) { let t = L(e?.metadata_raw), n = L(e?.metadata), r = [ e?.prompt, e?.Prompt, @@ -541,16 +542,16 @@ function L(e) { return null; } } -function Se(e) { +function xe(e) { if (!e || typeof e != "object") return null; if (Array.isArray(e.nodes)) return e; - let t = Ce(e); + let t = Se(e); if (t) return t; - if (e.prompt && typeof e.prompt == "object") return h(e.prompt); - let n = h(e); + if (e.prompt && typeof e.prompt == "object") return m(e.prompt); + let n = m(e); return n && Array.isArray(n.nodes) ? n : null; } -function Ce(e) { +function Se(e) { for (let t of [ "workflow", "Workflow", @@ -571,14 +572,14 @@ function R(e, t = /* @__PURE__ */ new WeakSet()) { t.add(e); let n = H(e); for (let r of Array.isArray(e?.nodes) ? e.nodes : []) { - De(r, n); + Ee(r, n); let i = W(e, r, n); - i && (Oe(r, i), R(i, t)); + i && (De(r, i), R(i, t)); } } -function we(e, t) { +function Ce(e, t) { if (!e || typeof e != "object" || !t || typeof t != "object") return; - let n = Te(t); + let n = we(t); n.length && z(e, n, /* @__PURE__ */ new WeakSet()); } function z(e, t, n) { @@ -586,13 +587,13 @@ function z(e, t, n) { n.add(e); let r = H(e); for (let i of Array.isArray(e?.nodes) ? e.nodes : []) { - let a = Ee(i, t); + let a = Te(i, t); a?.inputs && typeof a.inputs == "object" && !Array.isArray(a.inputs) && (i._mjrPromptInputs = a.inputs); let o = W(e, i, r); o && z(o, t, n); } } -function Te(e) { +function we(e) { if (!e || typeof e != "object" || Array.isArray(e)) return []; let t = []; for (let [n, r] of Object.entries(e)) { @@ -609,8 +610,8 @@ function Te(e) { } return t; } -function Ee(e, t) { - let n = String(e?.id ?? e?.ID ?? "").trim(), r = B(O(e)); +function Te(e, t) { + let n = String(e?.id ?? e?.ID ?? "").trim(), r = B(D(e)); if (!n || !r) return null; let i = t.find((e) => e.id === n && B(e.classType) === r); if (i) return i; @@ -620,7 +621,7 @@ function Ee(e, t) { function B(e) { return String(e || "").trim().toLowerCase(); } -function De(e, t) { +function Ee(e, t) { if (!e || typeof e != "object") return; let n = U(e).find((e) => t.has(String(e))); if (!n) return; @@ -629,18 +630,18 @@ function De(e, t) { let a = e?.properties && typeof e.properties == "object" ? e.properties : e.properties = {}; String(a.subgraph_name || "").trim() || (a.subgraph_name = i), String(a.subgraph_id || "").trim() || (a.subgraph_id = n); } -function Oe(e, t) { +function De(e, t) { let n = Array.isArray(e?.properties?.proxyWidgets) ? e.properties.proxyWidgets : []; if (!n.length || !Array.isArray(t?.nodes)) return; - let r = new Map(t.nodes.filter(Boolean).map((e) => [String(e?.id ?? e?.ID ?? ""), e])), i = ke(e), a = Ae(t), o = []; + let r = new Map(t.nodes.filter(Boolean).map((e) => [String(e?.id ?? e?.ID ?? ""), e])), i = Oe(e), a = ke(t), o = []; for (let e = 0; e < n.length; e += 1) { let t = n[e], s = Array.isArray(t) ? t[0] : t?.nodeId ?? t?.node_id ?? t?.id, c = Array.isArray(t) ? t[1] : t?.widget ?? t?.name ?? t?.widgetName, l = r.get(String(s ?? "")); if (!l) continue; - let u = k(l); + let u = O(l); if (!u.length) continue; let d = u.find(([e]) => V(e) === V(c)) || u.find(([e]) => V(e) === "value") || (u.length === 1 ? u[0] : null); if (!d) continue; - let f = `${String(s)}:${je(t, c, d[0])}`, p = a.get(f) || a.get(String(s)) || Me(l, d[0], c); + let f = `${String(s)}:${Ae(t, c, d[0])}`, p = a.get(f) || a.get(String(s)) || je(l, d[0], c); (!i.size || i.has(V(p))) && o.push({ label: p, value: d[1], @@ -650,16 +651,16 @@ function Oe(e, t) { } o.length && (e._mjrSubgraphProxyParams = o); } -function ke(e) { +function Oe(e) { let t = Array.isArray(e?.inputs) ? e.inputs : [], n = /* @__PURE__ */ new Set(); for (let e of t) { - if (!F(e)) continue; + if (!P(e)) continue; let t = String(e?.label || e?.localized_name || e?.name || "").trim(); t && n.add(V(t)); } return n; } -function Ae(e) { +function ke(e) { let t = Array.isArray(e?.inputs) ? e.inputs : [], n = Array.isArray(e?.links) ? e.links : [], r = /* @__PURE__ */ new Map(); for (let e of n) { let n = Array.isArray(e) ? e[1] : e?.origin_id ?? e?.originId ?? e?.from; @@ -669,15 +670,15 @@ function Ae(e) { } return r; } -function je(e, t, n) { +function Ae(e, t, n) { if (e && typeof e == "object" && !Array.isArray(e)) { let t = e.target_slot ?? e.targetSlot ?? e.slot; if (Number.isFinite(Number(t))) return Number(t); } return 0; } -function Me(e, t, n) { - let r = String(D(e) || "").trim(), i = String(t || n || "").trim(); +function je(e, t, n) { + let r = String(E(e) || "").trim(), i = String(t || n || "").trim(); return r && i && V(i) !== "value" ? `${r} ${i}` : r || i || "param"; } function V(e) { @@ -689,10 +690,10 @@ function H(e) { ...Array.isArray(e?.subgraphs) ? e.subgraphs : [], ...Array.isArray(e?.rootGraph?.subgraphs) ? e.rootGraph.subgraphs : [] ], n = /* @__PURE__ */ new Map(); - for (let e of t) for (let t of Ne(e)) t != null && n.set(String(t), e); + for (let e of t) for (let t of Me(e)) t != null && n.set(String(t), e); return n; } -function Ne(e) { +function Me(e) { let t = e?.properties && typeof e.properties == "object" ? e.properties : {}; return [ e?.id, @@ -734,7 +735,7 @@ function W(e, t, n = H(e)) { for (let e of r) if (e && typeof e == "object" && Array.isArray(e.nodes)) return e; return Array.isArray(t?.nodes) ? { nodes: t.nodes } : null; } -function Pe(e, t) { +function Ne(e, t) { let n = e, r = null; for (let e = 0; e < t.length; e += 1) { let i = String(t[e] ?? "").trim(); @@ -747,42 +748,42 @@ function Pe(e, t) { return r; } // ui/features/viewer/workflowSidebar/widgetAdapters.ts -function Fe(e, t, n = null) { +function Pe(e, t, n = null) { switch (String(e?.type || "").toLowerCase()) { case "number": case "int": - case "float": return Le(e, t, n); - case "combo": return Re(e, t, n); + case "float": return Ie(e, t, n); + case "combo": return Le(e, t, n); case "text": case "string": - case "customtext": return ze(e, t, n); + case "customtext": return Re(e, t, n); case "toggle": - case "boolean": return Be(e, t, n); - default: return Ve(e); + case "boolean": return ze(e, t, n); + default: return Be(e); } } -function G(e, n, i = null) { +function G(e, n, r = null) { if (!e) return !1; - let a = String(e.type || "").toLowerCase(); - if (a === "number" || a === "int" || a === "float") { + let i = String(e.type || "").toLowerCase(); + if (i === "number" || i === "int" || i === "float") { let t = Number(n); if (Number.isNaN(t)) return !1; - let r = e.options ?? {}, i = r.min ?? -Infinity, o = r.max ?? Infinity, s = Math.min(o, Math.max(i, t)); - (a === "int" || r.precision === 0 || r.round === 1) && (s = Math.round(s)), e.value = s; - } else e.value = a === "toggle" || a === "boolean" ? !!n : n; + let r = e.options ?? {}, a = r.min ?? -Infinity, o = r.max ?? Infinity, s = Math.min(o, Math.max(a, t)); + (i === "int" || r.precision === 0 || r.round === 1) && (s = Math.round(s)), e.value = s; + } else e.value = i === "toggle" || i === "boolean" ? !!n : n; try { - let n = t(), o = i ?? e?.parent ?? null, s = e.value; - e.callback?.(e.value, n, o, null, e), (a === "number" || a === "int" || a === "float") && (e.value = s), Ie(e), r(o); + let n = t(), a = r ?? e?.parent ?? null, o = e.value; + e.callback?.(e.value, n, a, null, e), (i === "number" || i === "int" || i === "float") && (e.value = o), Fe(e), s(a); } catch (e) { console.debug?.("[MFV] writeWidgetValue", e); } return !0; } -function Ie(e) { +function Fe(e) { let t = String(e.value ?? ""), n = e?.inputEl ?? e?.element ?? e?.el ?? e?.cachedDeepestByFrame?.widget?.inputEl ?? e?.cachedDeepestByFrame?.widget?.element ?? e?.cachedDeepestByFrame?.widget?.el ?? null; n != null && "value" in n && n.value !== t && (n.value = t); } -function Le(e, t, n = null) { +function Ie(e, t, n = null) { let r = document.createElement("input"); r.type = "number", r.className = "mjr-ws-input", r.value = e.value ?? ""; let i = e.options ?? {}, a = String(e?.type || "").toLowerCase() === "int" || i.precision === 0 || i.round === 1; @@ -798,7 +799,7 @@ function Le(e, t, n = null) { G(e, r.value, n) && (r.value = String(e.value), t?.(e.value)); }), r; } -function Re(e, t, n = null) { +function Le(e, t, n = null) { let r = document.createElement("select"); r.className = "mjr-ws-input"; let i = e.options?.values ?? []; @@ -816,7 +817,7 @@ function Re(e, t, n = null) { G(e, r.value, n) && t?.(e.value); }), r; } -function ze(e, t, n = null) { +function Re(e, t, n = null) { let r = document.createElement("div"); r.className = "mjr-ws-text-wrapper"; let i = document.createElement("textarea"); @@ -830,7 +831,7 @@ function ze(e, t, n = null) { G(e, i.value, n), t?.(e.value), a(); }), r.appendChild(i), r._mjrAutoFit = a, i._mjrAutoFit = a, requestAnimationFrame(a), r; } -function Be(e, t, n = null) { +function ze(e, t, n = null) { let r = document.createElement("label"); r.className = "mjr-ws-toggle-label"; let i = document.createElement("input"); @@ -838,12 +839,12 @@ function Be(e, t, n = null) { G(e, i.checked, n) && t?.(e.value); }), r.appendChild(i), r; } -function Ve(e) { +function Be(e) { let t = document.createElement("input"); return t.type = "text", t.className = "mjr-ws-input mjr-ws-readonly", t.value = e.value == null ? "" : String(e.value), t.readOnly = !0, t.tabIndex = -1, t; } // ui/app/settings/MajoorSettingsDialog.ts -var K = "mjr-settings-dialog", q = "mjr-settings-dialog-style", J = "mjr:settings-dialog-visibility", Y = null, He = { +var K = "mjr-settings-dialog", q = "mjr-settings-dialog-style", J = "mjr:settings-dialog-visibility", Y = null, Ve = { Cards: { icon: "pi pi-th-large", label: "Cards" @@ -897,7 +898,7 @@ var K = "mjr-settings-dialog", q = "mjr-settings-dialog-style", J = "mjr:setting label: "General" } }; -function Ue() { +function He() { if (typeof document > "u" || document.getElementById(q)) return; let e = document.createElement("style"); e.id = q, e.textContent = ` @@ -1078,23 +1079,23 @@ function Ue() { } `, document.head.appendChild(e); } -function We(e) { +function Ue(e) { return String(e || "").replace(/^\s*Majoor:\s*/i, "").trim(); } -function Ge(e) { +function We(e) { let t = Array.isArray(e?.category) ? e.category : []; return String(t[1] || "General").trim() || "General"; } -function Ke(e) { +function X(e) { return (Array.isArray(e?.category) ? e.category : []).slice(2).filter(Boolean).join(" / ") || "General"; } -function qe(e) { - return He[e] || { +function Ge(e) { + return Ve[e] || { icon: "pi pi-sliders-h", label: e || "General" }; } -function X(e, t) { +function Ke(e, t) { return !t || [ e?.id, e?.name, @@ -1115,7 +1116,7 @@ function Z(e, t) { } } } -function Je(e) { +function qe(e) { let t = String(e?.type || "text").toLowerCase(), n = e?.defaultValue, r; if (t === "boolean") return r = document.createElement("input"), r.type = "checkbox", r.checked = !!n, r.addEventListener("change", () => Z(e, r.checked)), r; if (t === "combo") { @@ -1133,20 +1134,20 @@ function Je(e) { Z(e, t === "number" ? Number(r.value) : r.value); }), r; } -function Ye(e, t, n = "") { +function Je(e, t, n = "") { e.replaceChildren(); let r = document.createElement("div"); r.className = "mjr-settings-stack", e.appendChild(r); let i = /* @__PURE__ */ new Map(); for (let e of t || []) { - if (!X(e, n)) continue; - let t = Ge(e), r = Ke(e); + if (!Ke(e, n)) continue; + let t = We(e), r = X(e); i.has(t) || i.set(t, /* @__PURE__ */ new Map()); let a = i.get(t); a.has(r) || a.set(r, []), a.get(r).push(e); } for (let [e, t] of i.entries()) { - let i = Array.from(t.values()).flat(), a = qe(e), o = document.createElement("details"); + let i = Array.from(t.values()).flat(), a = Ge(e), o = document.createElement("details"); o.className = "mjr-settings-group", o.open = !!n; let s = document.createElement("summary"), c = document.createElement("span"); c.className = "mjr-settings-group-icon"; @@ -1169,19 +1170,19 @@ function Ye(e, t, n = "") { let n = document.createElement("label"); n.className = "mjr-settings-row"; let r = document.createElement("div"), i = document.createElement("div"); - if (i.className = "mjr-settings-name", i.textContent = We(e?.name) || e?.id || "Setting", r.appendChild(i), e?.tooltip) { + if (i.className = "mjr-settings-name", i.textContent = Ue(e?.name) || e?.id || "Setting", r.appendChild(i), e?.tooltip) { let t = document.createElement("div"); t.className = "mjr-settings-tip", t.textContent = String(e.tooltip), r.appendChild(t); } - n.appendChild(r), n.appendChild(Je(e)), t.appendChild(n); + n.appendChild(r), n.appendChild(qe(e)), t.appendChild(n); } p.appendChild(t); } o.appendChild(p), r.appendChild(o); } } -function Xe() { - Ue(); +function Ye() { + He(); let e = document.createElement("div"); e.id = K, e.hidden = !0, e.addEventListener("click", (t) => { t.target === e && Q(); @@ -1191,18 +1192,18 @@ function Xe() { let n = document.createElement("div"); n.className = "mjr-settings-head"; let r = document.createElement("div"); - r.className = "mjr-settings-title", r.textContent = c("settings.majoor.title", "Majoor Assets Manager Settings"); + r.className = "mjr-settings-title", r.textContent = o("settings.majoor.title", "Majoor Assets Manager Settings"); let i = document.createElement("button"); - i.type = "button", i.className = "mjr-settings-close", i.textContent = "X", i.setAttribute("aria-label", c("btn.close", "Close")), i.addEventListener("click", Q), n.append(r, i); + i.type = "button", i.className = "mjr-settings-close", i.textContent = "X", i.setAttribute("aria-label", o("btn.close", "Close")), i.addEventListener("click", Q), n.append(r, i); let a = document.createElement("div"); a.className = "mjr-settings-tools"; - let o = document.createElement("input"); - o.type = "search", o.className = "mjr-settings-search", o.placeholder = c("placeholder.searchSettings", "Search settings"), a.appendChild(o); - let s = document.createElement("div"); - return s.className = "mjr-settings-body", t.append(n, a, s), e.appendChild(t), document.body.appendChild(e), { - body: s, + let s = document.createElement("input"); + s.type = "search", s.className = "mjr-settings-search", s.placeholder = o("placeholder.searchSettings", "Search settings"), a.appendChild(s); + let c = document.createElement("div"); + return c.className = "mjr-settings-body", t.append(n, a, c), e.appendChild(t), document.body.appendChild(e), { + body: c, root: e, - search: o + search: s }; } function Q() { @@ -1215,10 +1216,10 @@ function Q() { } } } -function Ze(e = s()) { +function Xe(e = a()) { if (typeof document > "u") return !1; - Y?.root?.isConnected || (Y = Xe()); - let t = f(e), n = () => Ye(Y.body, t, String(Y.search.value || "").trim().toLowerCase()); + Y?.root?.isConnected || (Y = Ye()); + let t = d(e), n = () => Je(Y.body, t, String(Y.search.value || "").trim().toLowerCase()); Y.search.oninput = n, Y.search.value = "", n(), Y.root.hidden = !1; try { window.dispatchEvent(new CustomEvent(J, { detail: { open: !0 } })); @@ -1228,12 +1229,12 @@ function Ze(e = s()) { return setTimeout(() => Y?.search?.focus?.(), 0), !0; } // ui/app/openMajoorSettings.ts -function $(e = s()) { - return Ze(e); +function $(e = a()) { + return Xe(e); } try { typeof window < "u" && (window.MajoorAssetsManager = window.MajoorAssetsManager || {}, window.MajoorAssetsManager.openSettings = $); } catch (e) { console.debug?.(e); } -export { x as _, le as a, k as c, A as d, T as f, ce as g, oe as h, G as i, O as l, se as m, J as n, E as o, ue as p, Fe as r, D as s, $ as t, de as u, b as v }; +export { b as _, le as a, O as c, k as d, w as f, ce as g, oe as h, G as i, D as l, se as m, J as n, T as o, ue as p, Pe as r, E as s, $ as t, de as u, y as v }; diff --git a/dist/chunks/sideBySide-Css6Vh8y.js b/dist/chunks/sideBySide-sOf24A5X.js similarity index 99% rename from dist/chunks/sideBySide-Css6Vh8y.js rename to dist/chunks/sideBySide-sOf24A5X.js index 95bd34fe..d9223df7 100644 --- a/dist/chunks/sideBySide-Css6Vh8y.js +++ b/dist/chunks/sideBySide-sOf24A5X.js @@ -1,4 +1,4 @@ -import { i as e } from "./model3dRenderer-k0ey48io.js"; +import { i as e } from "./model3dRenderer-DdPKugXy.js"; import { i as t, o as n } from "./geninfoParser-CgHp-y-n.js"; // ui/features/viewer/sideBySide.ts function r(e) { diff --git a/dist/chunks/viewerOpenRequest-CCFPrnGk.js b/dist/chunks/viewerOpenRequest-Crw9UWH5.js similarity index 90% rename from dist/chunks/viewerOpenRequest-CCFPrnGk.js rename to dist/chunks/viewerOpenRequest-Crw9UWH5.js index 05c52289..66e81f13 100644 --- a/dist/chunks/viewerOpenRequest-CCFPrnGk.js +++ b/dist/chunks/viewerOpenRequest-Crw9UWH5.js @@ -1,6 +1,6 @@ import { t as e } from "./rolldown-runtime-CGnMp29N.js"; -import { r as t } from "./events-DxfljH4A.js"; -import { t as n } from "./Viewer-DI9upE3v.js"; +import { r as t } from "./events-BRfpU-6M.js"; +import { t as n } from "./Viewer-geJFRz8N.js"; // ui/features/viewer/viewerOpenRequest.ts var r = /* @__PURE__ */ e({ requestViewerOpen: () => o }); function i(e) { diff --git a/dist/chunks/viewerRuntimeHosts-DQcoOjsY.js b/dist/chunks/viewerRuntimeHosts-D3Jyfx0-.js similarity index 87% rename from dist/chunks/viewerRuntimeHosts-DQcoOjsY.js rename to dist/chunks/viewerRuntimeHosts-D3Jyfx0-.js index 6190750f..b7725742 100644 --- a/dist/chunks/viewerRuntimeHosts-DQcoOjsY.js +++ b/dist/chunks/viewerRuntimeHosts-D3Jyfx0-.js @@ -1,4 +1,4 @@ -import { Ct as e, St as t, _t as n, gt as r, ht as i, k as a, m as o, nt as s, o as c, tt as l, vt as u, xt as d } from "./events-DxfljH4A.js"; +import { Ct as e, Tt as t, _t as n, bt as r, it as i, k as a, m as o, o as s, rt as c, vt as l, wt as u, yt as d } from "./events-BRfpU-6M.js"; // ui/app/settingsStore.ts var f = "mjrSettings", p = "mjrMinimapSettings", m = /* @__PURE__ */ new Set([ "POST", @@ -429,28 +429,28 @@ function ye(e) { function be(e, t, n) { return e && t ? `${e}: ${t}` : t || e || n || ""; } -function k(e, t = "info", n = null) { - if (!e || typeof e != "object") return null; - let r = O(e.title || e.summary), i = O(e.detail), a = O(e.message || be(r, i, O(e.fallbackMessage))); - if (!a) return null; - let o = ve(e.durationMs ?? e.duration ?? n), s = Number(e.createdAt), c = Number.isFinite(s) && s > 0 ? s : Date.now(), l = typeof e.persistent == "boolean" ? e.persistent : !(Number.isFinite(o) && (o ?? 0) > 0); +function k(t, n = "info", r = null) { + if (!t || typeof t != "object") return null; + let i = O(t.title || t.summary), a = O(t.detail), o = O(t.message || be(i, a, O(t.fallbackMessage))); + if (!o) return null; + let s = ve(t.durationMs ?? t.duration ?? r), c = Number(t.createdAt), l = Number.isFinite(c) && c > 0 ? c : Date.now(), u = typeof t.persistent == "boolean" ? t.persistent : !(Number.isFinite(s) && (s ?? 0) > 0); return { - id: O(e.id) || d(`th-${c}-`, 4), - message: a, - title: r, - detail: i, - type: _e(e.type || t), - createdAt: c, - durationMs: o, - persistent: l, - source: O(e.source), - trackId: O(e.trackId), - status: O(e.status), - operation: O(e.operation), - progress: ye(e.progress), - forceStore: !!e.forceStore, - actionLabel: O(e.actionLabel), - actionUrl: O(e.actionUrl) + id: O(t.id) || e(`th-${l}-`, 4), + message: o, + title: i, + detail: a, + type: _e(t.type || n), + createdAt: l, + durationMs: s, + persistent: u, + source: O(t.source), + trackId: O(t.trackId), + status: O(t.status), + operation: O(t.operation), + progress: ye(t.progress), + forceStore: !!t.forceStore, + actionLabel: O(t.actionLabel), + actionUrl: O(t.actionUrl) }; } function A() { @@ -944,99 +944,99 @@ async function Qe(e) { } : Y("/mjr/am/settings/probe-backend", { mode: e }); } async function $e() { - return J(l.SETTINGS_METADATA_FALLBACK); + return J(c.SETTINGS_METADATA_FALLBACK); } async function et({ image: e, media: t } = {}) { - return Y(l.SETTINGS_METADATA_FALLBACK, { + return Y(c.SETTINGS_METADATA_FALLBACK, { image: e, media: t }); } async function tt() { - return J(l.SETTINGS_VECTOR_SEARCH); + return J(c.SETTINGS_VECTOR_SEARCH); } async function nt(e = !0) { if (e && typeof e == "object") { let t = {}; - return "enabled" in e && (t.enabled = !!e.enabled), "caption_on_index" in e && (t.caption_on_index = !!e.caption_on_index), "captionOnIndex" in e && (t.caption_on_index = !!e.captionOnIndex), "index_on_scan" in e && (t.index_on_scan = !!e.index_on_scan), "indexOnScan" in e && (t.index_on_scan = !!e.indexOnScan), "unload_after_use" in e && (t.unload_after_use = !!e.unload_after_use), "unloadAfterUse" in e && (t.unload_after_use = !!e.unloadAfterUse), "concurrency" in e && (t.concurrency = Number(e.concurrency) || 1), "vectorConcurrency" in e && (t.concurrency = Number(e.vectorConcurrency) || 1), Y(l.SETTINGS_VECTOR_SEARCH, t); + return "enabled" in e && (t.enabled = !!e.enabled), "caption_on_index" in e && (t.caption_on_index = !!e.caption_on_index), "captionOnIndex" in e && (t.caption_on_index = !!e.captionOnIndex), "index_on_scan" in e && (t.index_on_scan = !!e.index_on_scan), "indexOnScan" in e && (t.index_on_scan = !!e.indexOnScan), "unload_after_use" in e && (t.unload_after_use = !!e.unload_after_use), "unloadAfterUse" in e && (t.unload_after_use = !!e.unloadAfterUse), "concurrency" in e && (t.concurrency = Number(e.concurrency) || 1), "vectorConcurrency" in e && (t.concurrency = Number(e.vectorConcurrency) || 1), Y(c.SETTINGS_VECTOR_SEARCH, t); } - return Y(l.SETTINGS_VECTOR_SEARCH, { enabled: !!e }); + return Y(c.SETTINGS_VECTOR_SEARCH, { enabled: !!e }); } async function rt() { - return Y(l.SETTINGS_VECTOR_SEARCH_UNLOAD, {}); + return Y(c.SETTINGS_VECTOR_SEARCH_UNLOAD, {}); } async function it() { - return J(l.SETTINGS_EXECUTION_GROUPING); + return J(c.SETTINGS_EXECUTION_GROUPING); } async function at(e = !0) { - return Y(l.SETTINGS_EXECUTION_GROUPING, { enabled: !!e }); + return Y(c.SETTINGS_EXECUTION_GROUPING, { enabled: !!e }); } async function ot(e = !0) { - return Y(l.SETTINGS_BROWSER_SHOW_FOLDERS, { enabled: !!e }); + return Y(c.SETTINGS_BROWSER_SHOW_FOLDERS, { enabled: !!e }); } async function st() { - return J(l.SETTINGS_HUGGINGFACE); + return J(c.SETTINGS_HUGGINGFACE); } async function ct(e = "") { - return Y(l.SETTINGS_HUGGINGFACE, { token: String(e ?? "").trim() }); + return Y(c.SETTINGS_HUGGINGFACE, { token: String(e ?? "").trim() }); } async function lt() { - return J(l.SETTINGS_AI_LOGGING); + return J(c.SETTINGS_AI_LOGGING); } async function ut(e = !1) { - return Y(l.SETTINGS_AI_LOGGING, { enabled: !!e }); + return Y(c.SETTINGS_AI_LOGGING, { enabled: !!e }); } async function dt() { - return J(l.SETTINGS_ROUTE_LOGGING); + return J(c.SETTINGS_ROUTE_LOGGING); } async function ft(e = !1) { - return Y(l.SETTINGS_ROUTE_LOGGING, { enabled: !!e }); + return Y(c.SETTINGS_ROUTE_LOGGING, { enabled: !!e }); } async function pt() { - return J(l.SETTINGS_STARTUP_LOGGING); + return J(c.SETTINGS_STARTUP_LOGGING); } async function mt(e = !1) { - return Y(l.SETTINGS_STARTUP_LOGGING, { enabled: !!e }); + return Y(c.SETTINGS_STARTUP_LOGGING, { enabled: !!e }); } async function ht() { - return J(l.SETTINGS_LTXAV_RGB_FALLBACK); + return J(c.SETTINGS_LTXAV_RGB_FALLBACK); } async function gt(e = !1) { - return Y(l.SETTINGS_LTXAV_RGB_FALLBACK, { enabled: !!e }); + return Y(c.SETTINGS_LTXAV_RGB_FALLBACK, { enabled: !!e }); } async function _t() { - return J(l.SETTINGS_JXL); + return J(c.SETTINGS_JXL); } async function vt(e = !1) { - return Y(l.SETTINGS_JXL, { enabled: !!e }); + return Y(c.SETTINGS_JXL, { enabled: !!e }); } async function yt() { - return J(l.SETTINGS_OUTPUT_DIRECTORY); + return J(c.SETTINGS_OUTPUT_DIRECTORY); } async function bt() { - return J(l.SETTINGS_INPUT_DIRECTORY); + return J(c.SETTINGS_INPUT_DIRECTORY); } async function xt(e, t = {}) { let n = String(e ?? "").trim(); - return Y(l.SETTINGS_INPUT_DIRECTORY, { input_directory: n }, t); + return Y(c.SETTINGS_INPUT_DIRECTORY, { input_directory: n }, t); } async function St(e, t = {}) { let n = String(e ?? "").trim(); - return Y(l.SETTINGS_OUTPUT_DIRECTORY, { output_directory: n }, t); + return Y(c.SETTINGS_OUTPUT_DIRECTORY, { output_directory: n }, t); } async function Ct() { - return J(l.SETTINGS_INDEX_DIRECTORY); + return J(c.SETTINGS_INDEX_DIRECTORY); } async function wt(e, t = {}) { let n = String(e ?? "").trim(); - return Y(l.SETTINGS_INDEX_DIRECTORY, { index_directory: n }, t); + return Y(c.SETTINGS_INDEX_DIRECTORY, { index_directory: n }, t); } async function Tt(e = {}) { - return J(l.SETTINGS_WORKFLOW_ROOTS, e); + return J(c.SETTINGS_WORKFLOW_ROOTS, e); } async function Et(e, t = {}) { let n = Array.isArray(e) ? e.map((e) => String(e ?? "").trim()).filter(Boolean) : String(e ?? "").trim(); - return Y(l.SETTINGS_WORKFLOW_ROOTS, { workflow_roots: n }, t); + return Y(c.SETTINGS_WORKFLOW_ROOTS, { workflow_roots: n }, t); } async function Dt() { return J("/mjr/am/settings/security"); @@ -1056,14 +1056,14 @@ async function kt() { } async function At(e) { if (e && typeof e == "object") { - let n = String(e.filepath || e.path || e?.file_info?.filepath || "").trim(); - return n ? Y("/mjr/am/open-in-folder", { filepath: n }) : Y("/mjr/am/open-in-folder", { asset_id: t(e.id) }); + let t = String(e.filepath || e.path || e?.file_info?.filepath || "").trim(); + return t ? Y("/mjr/am/open-in-folder", { filepath: t }) : Y("/mjr/am/open-in-folder", { asset_id: u(e.id) }); } - return Y("/mjr/am/open-in-folder", { asset_id: t(e) }); + return Y("/mjr/am/open-in-folder", { asset_id: u(e) }); } async function jt(e) { let t = ""; - return t = e && typeof e == "object" ? String(e.filepath || e.path || e?.file_info?.filepath || "").trim() : String(e || "").trim(), t ? Y(l.COLLECT_FILES, { filepath: t }) : { + return t = e && typeof e == "object" ? String(e.filepath || e.path || e?.file_info?.filepath || "").trim() : String(e || "").trim(), t ? Y(c.COLLECT_FILES, { filepath: t }) : { ok: !1, data: null, error: "Missing file path", @@ -1075,7 +1075,7 @@ async function Mt({ op: e = "", path: t = "", name: n = "", destination: r = "", op: String(e || "").trim().toLowerCase(), path: String(t || "").trim() }; - return n != null && String(n).trim() && (o.name = String(n).trim()), r != null && String(r).trim() && (o.destination = String(r).trim()), o.op === "delete" && (o.recursive = !!i), Y(l.BROWSER_FOLDER_OP, o, a); + return n != null && String(n).trim() && (o.name = String(n).trim()), r != null && String(r).trim() && (o.destination = String(r).trim()), o.op === "delete" && (o.recursive = !!i), Y(c.BROWSER_FOLDER_OP, o, a); } async function Nt(e = {}) { let t = (e, t) => e == null ? t : !!e, n = String(e.scope || "output").trim().toLowerCase() || "output", r = e.customRootId ?? e.custom_root_id ?? e.rootId ?? e.root_id ?? e.customRoot ?? null, i = { @@ -1093,42 +1093,42 @@ async function Nt(e = {}) { background_metadata: t(e.backgroundMetadata ?? e.background_metadata, !0), maintenance_force: t(e.maintenanceForce ?? e.maintenance_force, !1) }; - return r && (i.custom_root_id = String(r)), Y(l.INDEX_RESET, i); + return r && (i.custom_root_id = String(r)), Y(c.INDEX_RESET, i); } async function Pt({ scope: e = "output", customRootId: t = "" } = {}) { let n = String(e || "output").trim().toLowerCase() || "output", r = String(t || "").trim(), i = { scope: n }; - return r && (i.custom_root_id = r), Y(l.WATCHER_SCOPE, i); + return r && (i.custom_root_id = r), Y(c.WATCHER_SCOPE, i); } async function Ft(e = {}) { - return J(l.WATCHER_STATUS, e); + return J(c.WATCHER_STATUS, e); } async function It(e = !0) { - return Y(l.WATCHER_TOGGLE, { enabled: !!e }); + return Y(c.WATCHER_TOGGLE, { enabled: !!e }); } async function Lt() { - return J(l.WATCHER_SETTINGS); + return J(c.WATCHER_SETTINGS); } async function Rt(e = {}) { - return Y(l.WATCHER_SETTINGS, e); + return Y(c.WATCHER_SETTINGS, e); } async function zt(e = {}) { - return J(l.TOOLS_STATUS, e); + return J(c.TOOLS_STATUS, e); } async function Bt(e = {}) { - return J(l.STATUS, e); + return J(c.STATUS, e); } async function Vt() { return Y("/mjr/am/db/force-delete", {}); } async function Ht(e = {}) { - return J(l.DB_BACKUPS, e); + return J(c.DB_BACKUPS, e); } async function Ut() { - return Y(l.DB_BACKUP_SAVE, {}); + return Y(c.DB_BACKUP_SAVE, {}); } async function Wt({ name: e = "", useLatest: t = !1 } = {}) { let n = {}; - return e && (n.name = String(e)), t && (n.use_latest = !0), Y(l.DB_BACKUP_RESTORE, n); + return e && (n.name = String(e)), t && (n.use_latest = !0), Y(c.DB_BACKUP_RESTORE, n); } async function Gt(e = 250) { return Y("/mjr/am/duplicates/analyze", { limit: Math.max(10, Math.min(5e3, Number(e) || 250)) }); @@ -1144,18 +1144,18 @@ async function qt(e, t = []) { }); } async function Jt(e) { - let n, r; + let t, n; if (e && typeof e == "object") { - n = t(e.id); - let i = String(e.filepath || e.path || e?.file_info?.filepath || "").trim(); - r = n ? { asset_id: n } : { filepath: i }; - } else n = t(e), r = { asset_id: n }; - let i = await Y("/mjr/am/asset/delete", r); - return i?.ok && n && Xt([n]), i; + t = u(e.id); + let r = String(e.filepath || e.path || e?.file_info?.filepath || "").trim(); + n = t ? { asset_id: t } : { filepath: r }; + } else t = u(e), n = { asset_id: t }; + let r = await Y("/mjr/am/asset/delete", n); + return r?.ok && t && Xt([t]), r; } async function Yt(e) { - let n = Array.isArray(e) ? e.map((e) => t(e)).filter(Boolean) : [], r = await Y("/mjr/am/assets/delete", { ids: n }); - return r?.ok && Xt(n), r; + let t = Array.isArray(e) ? e.map((e) => u(e)).filter(Boolean) : [], n = await Y("/mjr/am/assets/delete", { ids: t }); + return n?.ok && Xt(t), n; } function Xt(e) { try { @@ -1166,43 +1166,43 @@ function Xt(e) { console.debug?.(e); } } -async function Zt(e, n) { - let r; +async function Zt(e, t) { + let n; if (e && typeof e == "object") { - r = t(e.id); - let i = String(e.filepath || e.path || e?.file_info?.filepath || "").trim(), a = r ? await Y("/mjr/am/asset/rename", { - asset_id: r, - new_name: n + n = u(e.id); + let r = String(e.filepath || e.path || e?.file_info?.filepath || "").trim(), i = n ? await Y("/mjr/am/asset/rename", { + asset_id: n, + new_name: t }) : await Y("/mjr/am/asset/rename", { - filepath: i, - new_name: n + filepath: r, + new_name: t }); - if (a?.ok && r) try { - let e = await In(r); - e?.ok && e?.data && (a.data = { - ...a.data || {}, + if (i?.ok && n) try { + let e = await In(n); + e?.ok && e?.data && (i.data = { + ...i.data || {}, asset: e.data }); } catch (e) { console.debug?.(e); } - return a; + return i; } - r = t(e); - let i = await Y("/mjr/am/asset/rename", { - asset_id: r, - new_name: n + n = u(e); + let r = await Y("/mjr/am/asset/rename", { + asset_id: n, + new_name: t }); - if (i?.ok && r) try { - let e = await In(r); - e?.ok && e?.data && (i.data = { - ...i.data || {}, + if (r?.ok && n) try { + let e = await In(n); + e?.ok && e?.data && (r.data = { + ...r.data || {}, asset: e.data }); } catch (e) { console.debug?.(e); } - return i; + return r; } async function Qt() { let e = typeof AbortController < "u" ? new AbortController() : null, t = null; @@ -1237,8 +1237,8 @@ async function an(e, t = 20) { ok: !1, error: "Empty query" }; - let r = t && typeof t == "object" ? t : { topK: Number(t) }, i = Math.max(1, Math.min(200, Number(r?.topK ?? 20) || 20)), a = String(r?.scope || "").trim(), o = String(r?.customRootId || "").trim(), c = `${l.VECTOR_SEARCH}?q=${encodeURIComponent(n)}&top_k=${i}`; - return a && (c += `&scope=${encodeURIComponent(a)}`), o && (c += `&custom_root_id=${encodeURIComponent(o)}`), c = s(c, { + let r = t && typeof t == "object" ? t : { topK: Number(t) }, a = Math.max(1, Math.min(200, Number(r?.topK ?? 20) || 20)), o = String(r?.scope || "").trim(), s = String(r?.customRootId || "").trim(), l = `${c.VECTOR_SEARCH}?q=${encodeURIComponent(n)}&top_k=${a}`; + return o && (l += `&scope=${encodeURIComponent(o)}`), s && (l += `&custom_root_id=${encodeURIComponent(s)}`), l = i(l, { subfolder: r?.subfolder ?? null, kind: r?.kind ?? null, hasWorkflow: r?.hasWorkflow ?? null, @@ -1253,7 +1253,7 @@ async function an(e, t = 20) { workflowId: r?.workflowId ?? null, dateRange: r?.dateRange ?? null, dateExact: r?.dateExact ?? null - }), J(c, { timeoutMs: 12e4 }); + }), J(l, { timeoutMs: 12e4 }); } async function on(e, t = 20) { let n = String(e || "").trim(); @@ -1261,34 +1261,34 @@ async function on(e, t = 20) { ok: !1, error: "Missing asset ID" }; - let r = t && typeof t == "object" ? t : { topK: Number(t) }, i = Math.max(1, Math.min(200, Number(r?.topK ?? 20) || 20)), a = String(r?.scope || "").trim(), o = String(r?.customRootId || "").trim(), s = `${l.VECTOR_SIMILAR}/${encodeURIComponent(n)}?top_k=${i}`; + let r = t && typeof t == "object" ? t : { topK: Number(t) }, i = Math.max(1, Math.min(200, Number(r?.topK ?? 20) || 20)), a = String(r?.scope || "").trim(), o = String(r?.customRootId || "").trim(), s = `${c.VECTOR_SIMILAR}/${encodeURIComponent(n)}?top_k=${i}`; return a && (s += `&scope=${encodeURIComponent(a)}`), o && (s += `&custom_root_id=${encodeURIComponent(o)}`), J(s, { dedupeKey: `vec:${n}:${i}:${a}:${o}` }); } async function sn(e) { let t = String(e || "").trim(); - return t ? J(`${l.VECTOR_ALIGNMENT}/${encodeURIComponent(t)}`) : { + return t ? J(`${c.VECTOR_ALIGNMENT}/${encodeURIComponent(t)}`) : { ok: !1, error: "Missing asset ID" }; } async function cn(e) { let t = String(e || "").trim(); - return t ? Y(`${l.VECTOR_INDEX}/${encodeURIComponent(t)}`, {}) : { + return t ? Y(`${c.VECTOR_INDEX}/${encodeURIComponent(t)}`, {}) : { ok: !1, error: "Missing asset ID" }; } async function ln() { - return J(l.VECTOR_STATS); + return J(c.VECTOR_STATS); } async function un(e = 64, t = {}) { - let n = Math.max(1, Math.min(200, e)), r = typeof t?.onProgress == "function" ? t.onProgress : null, i = String(t?.scope || "").trim().toLowerCase(), a = String(t?.customRootId ?? t?.custom_root_id ?? "").trim(), o = `${l.VECTOR_BACKFILL}?batch_size=${n}&async=1`; + let n = Math.max(1, Math.min(200, e)), r = typeof t?.onProgress == "function" ? t.onProgress : null, i = String(t?.scope || "").trim().toLowerCase(), a = String(t?.customRootId ?? t?.custom_root_id ?? "").trim(), o = `${c.VECTOR_BACKFILL}?batch_size=${n}&async=1`; i && (o += `&scope=${encodeURIComponent(i)}`), a && (o += `&custom_root_id=${encodeURIComponent(a)}`); let s = await Y(o, {}, { timeoutMs: 3e4 }); if (!s?.ok) return s; - let c = s?.data || {}, u = String(c?.status || "").toLowerCase(), d = String(c?.backfill_id || "").trim(); + let l = s?.data || {}, u = String(l?.status || "").toLowerCase(), d = String(l?.backfill_id || "").trim(); try { - r?.(c); + r?.(l); } catch (e) { console.debug?.(e); } @@ -1300,7 +1300,7 @@ async function un(e = 64, t = {}) { let f = Number(t?.pollIntervalMs), p = Number(t?.pollTimeoutMs), m = Number.isFinite(f) ? Math.max(500, Math.min(1e4, Math.floor(f))) : vn, h = Number.isFinite(p) ? Math.max(1e4, Math.min(bn, Math.floor(p))) : yn, ee = Date.now(), g = null; for (; Date.now() - ee < h;) { await S(m); - let e = await J(`${l.VECTOR_BACKFILL_STATUS}?backfill_id=${encodeURIComponent(d)}`, { timeoutMs: 3e4 }); + let e = await J(`${c.VECTOR_BACKFILL_STATUS}?backfill_id=${encodeURIComponent(d)}`, { timeoutMs: 3e4 }); if (!e?.ok) { g = e; continue; @@ -1326,7 +1326,7 @@ async function un(e = 64, t = {}) { status: 500 }; } - let _ = await J(`${l.VECTOR_BACKFILL_STATUS}?backfill_id=${encodeURIComponent(d)}`, { timeoutMs: 3e4 }), v = _?.data || g?.data || {}, y = String(v?.status || "").toLowerCase(); + let _ = await J(`${c.VECTOR_BACKFILL_STATUS}?backfill_id=${encodeURIComponent(d)}`, { timeoutMs: 3e4 }), v = _?.data || g?.data || {}, y = String(v?.status || "").toLowerCase(); if (_?.ok && [ "queued", "running", @@ -1368,23 +1368,23 @@ async function un(e = 64, t = {}) { } async function dn(e) { let t = String(e || "").trim(); - return t ? Y(`${l.VECTOR_CAPTION}/${encodeURIComponent(t)}`, {}) : { + return t ? Y(`${c.VECTOR_CAPTION}/${encodeURIComponent(t)}`, {}) : { ok: !1, error: "Missing asset ID" }; } -async function fn(e, { topK: t = 50, scope: n = "output", customRootId: r = "", subfolder: i = null, kind: a = null, hasWorkflow: o = null, minRating: c = null, minSizeMB: u = null, maxSizeMB: d = null, minWidth: f = null, minHeight: p = null, maxWidth: m = null, maxHeight: h = null, workflowType: ee = null, workflowId: g = null, dateRange: _ = null, dateExact: v = null } = {}) { +async function fn(e, { topK: t = 50, scope: n = "output", customRootId: r = "", subfolder: a = null, kind: o = null, hasWorkflow: s = null, minRating: l = null, minSizeMB: u = null, maxSizeMB: d = null, minWidth: f = null, minHeight: p = null, maxWidth: m = null, maxHeight: h = null, workflowType: ee = null, workflowId: g = null, dateRange: _ = null, dateExact: v = null } = {}) { let y = String(e || "").trim(); if (!y) return { ok: !1, error: "Empty query" }; - let b = `${l.HYBRID_SEARCH}?q=${encodeURIComponent(y)}&top_k=${Math.max(1, Math.min(200, t))}&scope=${encodeURIComponent(n)}`; - return r && (b += `&custom_root_id=${encodeURIComponent(r)}`), b = s(b, { - subfolder: i, - kind: a, - hasWorkflow: o, - minRating: c, + let b = `${c.HYBRID_SEARCH}?q=${encodeURIComponent(y)}&top_k=${Math.max(1, Math.min(200, t))}&scope=${encodeURIComponent(n)}`; + return r && (b += `&custom_root_id=${encodeURIComponent(r)}`), b = i(b, { + subfolder: a, + kind: o, + hasWorkflow: s, + minRating: l, minSizeMB: u, maxSizeMB: d, minWidth: f, @@ -1398,7 +1398,7 @@ async function fn(e, { topK: t = 50, scope: n = "output", customRootId: r = "", }), J(b, { timeoutMs: 12e4 }); } async function pn(e = 8) { - return Y(l.VECTOR_SUGGEST_COLLECTIONS, { k: Math.max(2, Math.min(20, e)) }); + return Y(c.VECTOR_SUGGEST_COLLECTIONS, { k: Math.max(2, Math.min(20, e)) }); } // ui/api/client.ts var mn = 3e4, hn = "__MJR_API_CLIENT__", gn = 2e3, _n = 200, vn = 1e3, yn = 18e5, bn = 432e5, H = "settings", xn = "available-tags", U = E({ @@ -1511,27 +1511,27 @@ async function J(e, t = {}) { async function Y(e, t, n = {}) { return q.post(e, t, n); } -async function Nn(n, r, i = {}) { - let a = jn(), o = n && typeof n == "object" ? n : null, s = o ? o.id : n, c = t(s), l = { rating: Math.max(0, Math.min(5, Number(r) || 0)) }; - return c ? l.asset_id = c : o && (l.filepath = o.filepath || o.path || o?.file_info?.filepath || "", l.type = o.type || "output", l.root_id = e(o)), Mn("/mjr/am/asset/rating", { - ...i, +async function Nn(e, n, r = {}) { + let i = jn(), a = e && typeof e == "object" ? e : null, o = a ? a.id : e, s = u(o), c = { rating: Math.max(0, Math.min(5, Number(n) || 0)) }; + return s ? c.asset_id = s : a && (c.filepath = a.filepath || a.path || a?.file_info?.filepath || "", c.type = a.type || "output", c.root_id = t(a)), Mn("/mjr/am/asset/rating", { + ...r, method: "POST", headers: { "Content-Type": "application/json", - ...a ? { "X-MJR-RTSYNC": "on" } : {} + ...i ? { "X-MJR-RTSYNC": "on" } : {} }, - body: JSON.stringify(l) + body: JSON.stringify(c) }); } -async function Pn(n, r, i = {}) { - let a = jn(), o = n && typeof n == "object" ? n : null, s = o ? o.id : n, c = t(s), u = String(o?.kind || o?.type || "").trim().toLowerCase() === "workflow", d = String(o?.filepath || o?.path || o?.file_info?.filepath || "").trim(), f = { tags: Array.isArray(r) ? r : [] }; - u && d ? f.filepath = d : c ? f.asset_id = c : o && (f.filepath = o.filepath || o.path || o?.file_info?.filepath || "", f.type = o.type || "output", f.root_id = e(o)); - let p = await Mn(u && d ? l.WORKFLOWS_TAGS : "/mjr/am/asset/tags", { - ...i, +async function Pn(e, n, r = {}) { + let i = jn(), a = e && typeof e == "object" ? e : null, o = a ? a.id : e, s = u(o), l = String(a?.kind || a?.type || "").trim().toLowerCase() === "workflow", d = String(a?.filepath || a?.path || a?.file_info?.filepath || "").trim(), f = { tags: Array.isArray(n) ? n : [] }; + l && d ? f.filepath = d : s ? f.asset_id = s : a && (f.filepath = a.filepath || a.path || a?.file_info?.filepath || "", f.type = a.type || "output", f.root_id = t(a)); + let p = await Mn(l && d ? c.WORKFLOWS_TAGS : "/mjr/am/asset/tags", { + ...r, method: "POST", headers: { "Content-Type": "application/json", - ...a ? { "X-MJR-RTSYNC": "on" } : {} + ...i ? { "X-MJR-RTSYNC": "on" } : {} }, body: JSON.stringify(f) }); @@ -1556,25 +1556,25 @@ async function Fn() { } return t; } -async function In(e, n = {}) { - let r = encodeURIComponent(t(e)); - return J(`/mjr/am/asset/${r}`, { - ...n, - dedupeKey: n?.dedupeKey || `meta:${r}` +async function In(e, t = {}) { + let n = encodeURIComponent(u(e)); + return J(`/mjr/am/asset/${n}`, { + ...t, + dedupeKey: t?.dedupeKey || `meta:${n}` }); } -async function Ln(e, n = {}) { - let r = t(e); - if (!r) return { +async function Ln(e, t = {}) { + let n = u(e); + if (!n) return { ok: !1, data: null, error: "Missing assetId", code: "INVALID_INPUT" }; - let i = `/mjr/am/viewer/info?asset_id=${encodeURIComponent(r)}`; - n.refresh && (i += "&refresh=1"); - let { refresh: a, ...o } = n; - return J(i, o); + let r = `/mjr/am/viewer/info?asset_id=${encodeURIComponent(n)}`; + t.refresh && (r += "&refresh=1"); + let { refresh: i, ...a } = t; + return J(r, a); } async function Rn(e, t = {}) { let n = Array.isArray(e) ? e : [], r = []; @@ -1590,15 +1590,6 @@ async function Rn(e, t = {}) { }; } async function zn(e, t = {}) { - let n = i(e); - return n ? J(n, t) : { - ok: !1, - data: null, - error: "Missing workflow filepath", - code: "INVALID_INPUT" - }; -} -async function Bn(e, t = {}) { let r = n(e); return r ? J(r, t) : { ok: !1, @@ -1607,8 +1598,17 @@ async function Bn(e, t = {}) { code: "INVALID_INPUT" }; } +async function Bn(e, t = {}) { + let n = d(e); + return n ? J(n, t) : { + ok: !1, + data: null, + error: "Missing workflow filepath", + code: "INVALID_INPUT" + }; +} async function Vn(e, t = {}) { - let n = u(e); + let n = r(e); return n ? J(n, t) : { ok: !1, data: null, @@ -1617,16 +1617,16 @@ async function Vn(e, t = {}) { }; } async function Hn(e, t = "", n = {}) { - let i = r(e, t); - return i ? J(i, n) : { + let r = l(e, t); + return r ? J(r, n) : { ok: !1, data: null, error: "Missing workflow filepath", code: "INVALID_INPUT" }; } -async function Un({ workflow: e = null, name: t = "", category: n = "", overwrite: r = !1, filepath: i = "", task: a = "", model_family: o = "", provider: s = "", runs_on: c = "", notes: u = "" } = {}, d = {}) { - return Y(l.WORKFLOWS_SAVE, { +async function Un({ workflow: e = null, name: t = "", category: n = "", overwrite: r = !1, filepath: i = "", task: a = "", model_family: o = "", provider: s = "", runs_on: l = "", notes: u = "" } = {}, d = {}) { + return Y(c.WORKFLOWS_SAVE, { workflow: e, name: t, category: n, @@ -1635,37 +1635,37 @@ async function Un({ workflow: e = null, name: t = "", category: n = "", overwrit task: a, model_family: o, provider: s, - runs_on: c, + runs_on: l, notes: u }, d); } async function Wn({ filepath: e = "", name: t = "" } = {}, n = {}) { - return Y(l.WORKFLOWS_DUPLICATE, { + return Y(c.WORKFLOWS_DUPLICATE, { filepath: e, name: t }, n); } async function Gn({ filepath: e = "", name: t = "", category: n = "" } = {}, r = {}) { - return Y(l.WORKFLOWS_MOVE, { + return Y(c.WORKFLOWS_MOVE, { filepath: e, name: t, category: n }, r); } async function Kn({ filepath: e = "" } = {}, t = {}) { - return Y(l.WORKFLOWS_DELETE, { filepath: e }, t); + return Y(c.WORKFLOWS_DELETE, { filepath: e }, t); } async function qn({ filepath: e = "" } = {}, t = {}) { - return Y(l.WORKFLOWS_MARK_LOADED, { filepath: e }, t); + return Y(c.WORKFLOWS_MARK_LOADED, { filepath: e }, t); } async function Jn({ filepath: e = "", favorite: t = !1 } = {}, n = {}) { - return Y(l.WORKFLOWS_FAVORITE, { + return Y(c.WORKFLOWS_FAVORITE, { filepath: e, favorite: !!t }, n); } async function Yn({ filepath: e = "", task: t = "", model_family: n = "", provider: r = "", runs_on: i = "", notes: a = "" } = {}, o = {}) { - return Y(l.WORKFLOWS_INFO, { + return Y(c.WORKFLOWS_INFO, { filepath: e, task: t, model_family: n, @@ -1676,17 +1676,17 @@ async function Yn({ filepath: e = "", task: t = "", model_family: n = "", provid } async function Xn({ filepath: e = "", limit: t = 12 } = {}, n = {}) { let r = Math.max(1, Math.min(50, Number(t) || 12)); - return J(`${l.WORKFLOWS_THUMBNAIL_CANDIDATES}?filepath=${encodeURIComponent(String(e || "").trim())}&limit=${encodeURIComponent(String(r))}`, n); + return J(`${c.WORKFLOWS_THUMBNAIL_CANDIDATES}?filepath=${encodeURIComponent(String(e || "").trim())}&limit=${encodeURIComponent(String(r))}`, n); } async function Zn(e = {}) { - return J(l.WORKFLOWS_MODEL_FAMILIES, e); + return J(c.WORKFLOWS_MODEL_FAMILIES, e); } async function Qn({ q: e = "*", limit: t = 100, offset: n = 0, sort: r = "mtime" } = {}, i = {}) { let a = Math.max(1, Math.min(500, Number(t) || 100)), o = Math.max(0, Number(n) || 0); - return J(`${l.LIST}?scope=workflow&q=${encodeURIComponent(String(e || "*"))}&limit=${encodeURIComponent(String(a))}&offset=${encodeURIComponent(String(o))}&sort=${encodeURIComponent(String(r || "mtime"))}`, i); + return J(`${c.LIST}?scope=workflow&q=${encodeURIComponent(String(e || "*"))}&limit=${encodeURIComponent(String(a))}&offset=${encodeURIComponent(String(o))}&sort=${encodeURIComponent(String(r || "mtime"))}`, i); } async function $n({ filepath: e = "", source_filepath: t = "" } = {}, n = {}) { - return Y(l.WORKFLOWS_THUMBNAIL_SET, { + return Y(c.WORKFLOWS_THUMBNAIL_SET, { filepath: e, source_filepath: t }, n); @@ -1725,8 +1725,8 @@ async function tr({ filepath: e = "", root_id: t = "", subfolder: n = "" } = {}, } catch (e) { console.debug?.(e); } - let i = String(e || "").trim(), a = String(t || "").trim(), o = String(n || "").trim(), s = l.FOLDER_INFO, c = []; - i ? (c.push(`filepath=${encodeURIComponent(i)}`), c.push("browser_mode=1")) : (a && c.push(`root_id=${encodeURIComponent(a)}`), o && c.push(`subfolder=${encodeURIComponent(o)}`)), c.length && (s += `?${c.join("&")}`); + let i = String(e || "").trim(), a = String(t || "").trim(), o = String(n || "").trim(), s = c.FOLDER_INFO, l = []; + i ? (l.push(`filepath=${encodeURIComponent(i)}`), l.push("browser_mode=1")) : (a && l.push(`root_id=${encodeURIComponent(a)}`), o && l.push(`subfolder=${encodeURIComponent(o)}`)), l.length && (s += `?${l.join("&")}`); let u = await J(s, r); try { !u?.ok && Number(u?.status || 0) === 404 && (globalThis.__mjrFolderInfoSupported = !1); @@ -1738,17 +1738,17 @@ async function tr({ filepath: e = "", root_id: t = "", subfolder: n = "" } = {}, // ui/utils/logging.ts function nr(e, ...t) { try { - c.DEBUG_VERBOSE_ERRORS && console.debug(e, ...t); + s.DEBUG_VERBOSE_ERRORS && console.debug(e, ...t); } catch {} } function rr(e, t = "Majoor", { showToast: n = !1, toastType: r = "error" } = {}) { let i = e?.message || String(e || "Unknown error"); try { - c.DEBUG_VERBOSE_ERRORS ? console.error(`[Majoor][${t}]`, i, e) : console.debug(`[Majoor][${t}]`, i); + s.DEBUG_VERBOSE_ERRORS ? console.error(`[Majoor][${t}]`, i, e) : console.debug(`[Majoor][${t}]`, i); } catch (e) { console.debug?.(e); } - if (n && c.DEBUG_VERBOSE_ERRORS) try { + if (n && s.DEBUG_VERBOSE_ERRORS) try { N(`${t}: ${i}`, r, 4e3); } catch (e) { console.debug?.(e); diff --git a/dist/entry.js b/dist/entry.js index 51a2d33f..77cea6da 100644 --- a/dist/entry.js +++ b/dist/entry.js @@ -1,25 +1,25 @@ -import { $t as e, A as t, B as n, Bt as r, C as i, D as a, E as o, Et as s, G as c, H as l, J as u, Jt as d, L as f, Lt as p, M as m, N as h, O as g, P as _, Rt as v, S as y, U as b, Ut as x, V as S, Vt as C, W as w, Wt as T, Xt as E, Yt as D, _ as O, _t as k, an as A, b as j, bt as M, c as N, d as P, en as ee, f as te, ft as F, g as I, gt as ne, h as re, ht as ie, in as ae, j as oe, jt as se, k as L, l as ce, m as le, mt as ue, nn as de, o as fe, on as pe, pt as me, q as he, qt as ge, rn as _e, s as ve, st as ye, tn as be, u as xe, ut as Se, vt as Ce, w as we, xt as Te, y as Ee, yt as De, z as Oe, zt as ke } from "./chunks/viewerRuntimeHosts-DQcoOjsY.js"; -import { $ as Ae, A as je, Ct as Me, F as Ne, G as Pe, H as Fe, K as Ie, L as Le, Q as Re, St as ze, U as Be, W as Ve, X as He, Z as Ue, _ as We, at as Ge, bt as Ke, ct as qe, dt as Je, et as Ye, ft as Xe, g as Ze, it as Qe, j as $e, lt as et, m as R, n as z, o as B, ot as tt, pt as nt, q as rt, r as V, rt as it, st as at, t as ot, tt as st, ut as ct, xt as lt, yt as ut } from "./chunks/events-DxfljH4A.js"; +import { $t as e, A as t, B as n, Bt as r, C as i, D as a, E as o, Et as s, G as c, H as l, J as u, Jt as d, L as f, Lt as p, M as m, N as h, O as g, P as _, Rt as v, S as y, U as b, Ut as x, V as S, Vt as C, W as w, Wt as T, Xt as E, Yt as D, _ as O, _t as k, an as A, b as j, bt as M, c as N, d as P, en as ee, f as te, ft as F, g as I, gt as ne, h as re, ht as ie, in as ae, j as oe, jt as se, k as L, l as ce, m as le, mt as ue, nn as de, o as fe, on as pe, pt as me, q as he, qt as ge, rn as _e, s as ve, st as ye, tn as be, u as xe, ut as Se, vt as Ce, w as we, xt as Te, y as Ee, yt as De, z as Oe, zt as ke } from "./chunks/viewerRuntimeHosts-D3Jyfx0-.js"; +import { $ as Ae, A as je, Ct as Me, F as Ne, J as Pe, K as Fe, L as Ie, Q as Le, St as Re, Tt as ze, U as Be, W as Ve, Y as He, _ as Ue, at as We, ct as Ge, dt as Ke, et as qe, ft as Je, g as Ye, ht as Xe, j as Ze, lt as Qe, m as R, mt as $e, n as et, nt as z, o as B, ot as tt, pt as nt, q as rt, r as V, rt as it, st as at, t as ot, tt as st, ut as ct, wt as lt, xt as ut } from "./chunks/events-BRfpU-6M.js"; import { a as dt, i as ft, n as pt, t as mt } from "./chunks/graphTraversal-DTdQWkn5.js"; -import { A as ht, B as gt, C as _t, D as vt, E as yt, F as bt, G as xt, H as St, I as Ct, J as wt, L as Tt, M as Et, N as Dt, O as Ot, P as kt, R as At, S as jt, T as Mt, U as Nt, V as Pt, W as Ft, Y as It, _ as Lt, b as Rt, d as zt, g as Bt, j as Vt, k as Ht, q as Ut, v as Wt, x as Gt, y as Kt, z as qt } from "./chunks/Viewer-DI9upE3v.js"; -import { $ as Jt, A as Yt, B as Xt, C as Zt, D as Qt, E as $t, F as en, G as tn, H as nn, I as rn, J as an, K as on, L as sn, M as cn, N as ln, O as un, P as dn, Q as fn, R as pn, T as mn, U as hn, V as gn, W as _n, X as vn, Y as yn, Z as bn, _ as xn, a as Sn, c as Cn, d as wn, et as Tn, f as En, g as Dn, h as On, i as kn, j as An, k as jn, l as Mn, m as Nn, n as Pn, o as Fn, p as In, q as Ln, s as Rn, t as zn, u as Bn, w as Vn, z as Hn } from "./chunks/SidebarWorkflowSection-BHtHjc_k.js"; -import { _ as Un, i as Wn, n as Gn, p as Kn, t as qn } from "./chunks/openMajoorSettings-BfOHsVlq.js"; -import { a as Jn, c as Yn, l as Xn, o as Zn, s as Qn, u as $n } from "./chunks/floatingViewerManager-DKOeP6-T.js"; -import { A as er, B as tr, C as H, D as nr, E as U, G as rr, H as ir, I as ar, J as W, K as or, L as sr, M as cr, N as lr, O as G, P as ur, R as dr, S as fr, T as K, U as pr, V as q, W as mr, Y as hr, at as gr, b as _r, ct as vr, dt as yr, ft as J, it as br, j as Y, k as X, lt as Z, nt as xr, q as Sr, rt as Q, tt as Cr, ut as wr, v as Tr, w as Er, x as Dr, y as Or, z as kr } from "./chunks/mjr-primevue-BRqtdXzb.js"; -import { n as Ar, r as jr } from "./chunks/mjr-vue-vendor-mHY_eIVE.js"; -import { t as Mr } from "./chunks/TagsEditor-7DAMS3OV.js"; -import { app as Nr } from "../../scripts/app.js"; -function Pr(e = null) { +import { A as ht, B as gt, C as _t, D as vt, E as yt, F as bt, G as xt, H as St, I as Ct, J as wt, L as Tt, M as Et, N as Dt, O as Ot, P as kt, R as At, S as jt, T as Mt, U as Nt, V as Pt, W as Ft, Y as It, _ as Lt, b as Rt, d as zt, g as Bt, j as Vt, k as Ht, q as Ut, v as Wt, x as Gt, y as Kt, z as qt } from "./chunks/Viewer-geJFRz8N.js"; +import { $ as Jt, A as Yt, B as Xt, C as Zt, D as Qt, E as $t, F as en, G as tn, H as nn, I as rn, J as an, K as on, L as sn, M as cn, N as ln, O as un, P as dn, Q as fn, R as pn, T as mn, U as hn, V as gn, W as _n, X as vn, Y as yn, Z as bn, _ as xn, a as Sn, c as Cn, d as wn, et as Tn, f as En, g as Dn, h as On, i as kn, j as An, k as jn, l as Mn, m as Nn, n as Pn, nt as Fn, o as In, p as Ln, q as Rn, s as zn, t as Bn, tt as Vn, u as Hn, w as Un, z as Wn } from "./chunks/SidebarWorkflowSection-BihItyAk.js"; +import { _ as Gn, i as Kn, n as qn, p as Jn, t as Yn } from "./chunks/openMajoorSettings-Cd5Nutru.js"; +import { a as Xn, c as Zn, l as Qn, o as $n, s as er, u as tr } from "./chunks/floatingViewerManager-Gv7MTmpu.js"; +import { A as nr, B as rr, C as H, D as ir, E as U, G as ar, H as or, I as sr, J as W, K as cr, L as lr, M as ur, N as dr, O as G, P as fr, R as pr, S as mr, T as K, U as hr, V as q, W as gr, Y as _r, at as vr, b as yr, ct as br, dt as xr, ft as J, it as Sr, j as Y, k as X, lt as Z, nt as Cr, q as wr, rt as Q, tt as Tr, ut as Er, v as Dr, w as Or, x as kr, y as Ar, z as jr } from "./chunks/mjr-primevue-BRqtdXzb.js"; +import { n as Mr, r as Nr } from "./chunks/mjr-vue-vendor-mHY_eIVE.js"; +import { t as Pr } from "./chunks/TagsEditor-CPV0rYyM.js"; +import { app as Fr } from "../../scripts/app.js"; +function Ir(e = null) { return null; } -function Fr() { +function Lr() { return null; } try { - typeof window < "u" && st && st.LIST; + typeof window < "u" && it && it.LIST; } catch {} // ui/integration/comfy_send_to_am.ts -var Ir = "MajoorAssetsManager.SendTo", Lr = "Send to Asset Manager", Rr = /* @__PURE__ */ new Set([ +var Rr = "MajoorAssetsManager.SendTo", zr = "Send to Asset Manager", Br = /* @__PURE__ */ new Set([ "SaveImage", "PreviewImage", "VHS_VideoCombine", @@ -29,11 +29,11 @@ var Ir = "MajoorAssetsManager.SendTo", Lr = "Send to Asset Manager", Rr = /* @__ "SaveAnimatedPNG", "SaveAudio" ]); -function zr(e) { +function Vr(e) { let t = String(e?.comfyClass || e?.type || "").trim(); - return Rr.has(t); + return Br.has(t); } -function Br(e) { +function Hr(e) { let t = []; try { let n = e?.imgs && Array.isArray(e.imgs) ? e.imgs : null, r = []; @@ -61,15 +61,15 @@ function Br(e) { } catch {} return t; } -async function Vr(e) { - let t = $e(), n = je(t); - if (!e.length) rt({ +async function Ur(e) { + let t = Ze(), n = je(t); + if (!e.length) He({ severity: "warn", summary: "Majoor Assets Manager", detail: "No output to send (run the node first).", life: 3500 }); - else if (!n || typeof n.fetchApi != "function") rt({ + else if (!n || typeof n.fetchApi != "function") He({ severity: "error", summary: "Majoor Assets Manager", detail: "ComfyUI API unavailable.", @@ -82,14 +82,14 @@ async function Vr(e) { body: JSON.stringify({ items: e }) }); if (!r.ok && r.status !== 404) throw Error(`HTTP ${r.status}`); - We(t, "majoor-assets"), rt({ + Ue(t, "majoor-assets"), He({ severity: "success", summary: "Majoor Assets Manager", detail: `Sent ${e.length} item(s) to the asset grid.`, life: 2500 }); } catch (e) { - rt({ + He({ severity: "error", summary: "Majoor Assets Manager", detail: `Failed to send: ${e?.message || e}`, @@ -97,16 +97,16 @@ async function Vr(e) { }); } } -function Hr() { - let e = $e(); - !e || typeof e.registerExtension != "function" ? setTimeout(Hr, 100) : e.registerExtension({ - name: Ir, +function Wr() { + let e = Ze(); + !e || typeof e.registerExtension != "function" ? setTimeout(Wr, 100) : e.registerExtension({ + name: Rr, getNodeMenuItems(e) { try { - return zr(e) ? [{ - content: Lr, + return Vr(e) ? [{ + content: zr, callback: () => { - Vr(Br(e)); + Ur(Hr(e)); } }] : []; } catch { @@ -115,11 +115,11 @@ function Hr() { } }); } -Hr(); +Wr(); // ui/integration/majoor_save_placeholders.ts -var Ur = "MajoorAssetsManager.SavePlaceholders", Wr = /* @__PURE__ */ new Set(["MajoorSaveImage", "MajoorSaveVideo"]), Gr = /dd?|MM?|hh?|mm?|ss?|yyy?y?/g; -function Kr(e, t) { - return e.replace(Gr, (e) => { +var Gr = "MajoorAssetsManager.SavePlaceholders", Kr = /* @__PURE__ */ new Set(["MajoorSaveImage", "MajoorSaveVideo"]), qr = /dd?|MM?|hh?|mm?|ss?|yyy?y?/g; +function Jr(e, t) { + return e.replace(qr, (e) => { if (e === "yyyy") return String(t.getFullYear()); if (e === "yy") return String(t.getFullYear()).substring(2, 4); let n; @@ -144,51 +144,51 @@ function Kr(e, t) { return String(n).padStart(e.length, "0"); }); } -var qr = /[/?<>\\:*|"\x00-\x1F\x7F]/g; -function Jr(e) { +var Yr = /[/?<>\\:*|"\x00-\x1F\x7F]/g; +function Xr(e) { let t = e?.nodes ?? e?._nodes; return Array.isArray(t) ? t : []; } -function Yr(e, t) { +function Zr(e, t) { return String(t ?? "").replace(/%([^%]+)%/g, (t, n) => { let r = String(n).split("."); - if (r.length !== 2) return r[0].startsWith("date:") ? Kr(r[0].substring(5), /* @__PURE__ */ new Date()) : t; - let i = Jr(e), a = i.filter((e) => e?.properties?.["Node name for S&R"] === r[0]); + if (r.length !== 2) return r[0].startsWith("date:") ? Jr(r[0].substring(5), /* @__PURE__ */ new Date()) : t; + let i = Xr(e), a = i.filter((e) => e?.properties?.["Node name for S&R"] === r[0]); a.length || (a = i.filter((e) => e?.title === r[0])); let o = a[0]; if (!o) return t; let s = Array.isArray(o.widgets) ? o.widgets.find((e) => e?.name === r[1]) : null; - return s ? String(s.value ?? "").replace(qr, "_") : t; + return s ? String(s.value ?? "").replace(Yr, "_") : t; }); } -function Xr(e, t) { +function Qr(e, t) { try { let n = Array.isArray(e?.widgets) ? e.widgets.find((e) => e?.name === "filename_prefix") : null; if (!n) return; let r = n.serializeValue; n.serializeValue = () => { let i = typeof r == "function" ? r.call(n) : n.value; - return Yr(e?.graph || t?.graph, i); + return Zr(e?.graph || t?.graph, i); }; } catch {} } -function Zr() { - let e = $e(); - !e || typeof e.registerExtension != "function" ? setTimeout(Zr, 100) : e.registerExtension({ - name: Ur, +function $r() { + let e = Ze(); + !e || typeof e.registerExtension != "function" ? setTimeout($r, 100) : e.registerExtension({ + name: Gr, nodeCreated(t) { try { let n = String(t?.comfyClass || t?.type || ""); - if (!Wr.has(n)) return; - Xr(t, e); + if (!Kr.has(n)) return; + Qr(t, e); } catch {} } }); } -Zr(); +$r(); // ui/app/bootstrap.ts -var Qr = !1, $r = null, ei = !1, ti = null; -function ni() { +var ei = !1, ti = null, ni = !1, ri = null; +function ii() { try { let e = window?.__MJR_EXECUTION_RUNTIME__; return !String(e?.active_prompt_id || "").trim(); @@ -196,26 +196,26 @@ function ni() { return console.debug?.(e), !0; } } -async function ri(e = {}) { - if (!B || typeof B != "object" || !B.AUTO_SCAN_ON_STARTUP || Qr) return; +async function ai(e = {}) { + if (!B || typeof B != "object" || !B.AUTO_SCAN_ON_STARTUP || ei) return; let t = Math.max(0, Number(e?.delayMs) || 0), n = e?.idleOnly !== !1; - if (t > 0) $r && clearTimeout($r), $r = setTimeout(() => { - $r = null, ri({ + if (t > 0) ti && clearTimeout(ti), ti = setTimeout(() => { + ti = null, ai({ ...e, delayMs: 0 }); }, t); - else if (n && !ni()) $r && clearTimeout($r), $r = setTimeout(() => { - $r = null, ri({ + else if (n && !ii()) ti && clearTimeout(ti), ti = setTimeout(() => { + ti = null, ai({ ...e, delayMs: 0 }); }, 5e3); else { - Qr = !0; + ei = !0; try { xe("[Majoor] Starting startup scan of output directory..."); - let e = await L(st.SCAN, { + let e = await L(it.SCAN, { recursive: !0, incremental: !0, fast: !0, @@ -230,23 +230,23 @@ async function ri(e = {}) { } } } -async function ii() { +async function oi() { try { await Promise.allSettled([ - re(st.HEALTH), - re(`${st.HEALTH_COUNTERS}?scope=output`), - re(st.HEALTH_DB) + re(it.HEALTH), + re(`${it.HEALTH_COUNTERS}?scope=output`), + re(it.HEALTH_DB) ]); } catch (e) { console.debug?.(e); } } -async function ai(e = {}) { - return ei ? ti || Promise.resolve() : (ei = !0, ti = (async () => { - await oi(), await ii(), await ri(e); - })(), ti); +async function si(e = {}) { + return ni ? ri || Promise.resolve() : (ni = !0, ri = (async () => { + await ci(), await oi(), await ai(e); + })(), ri); } -function oi() { +function ci() { return new Promise((e) => { try { if (typeof window > "u") { @@ -265,26 +265,26 @@ function oi() { } }); } -async function si() { +async function li() { try { xe("[Majoor] Testing API connection..."); - let e = await re(st.HEALTH); + let e = await re(it.HEALTH); e?.ok ? xe("[Majoor] API connection successful, health:", e.data.overall) : console.error("[Majoor] ERROR: API health check failed:", e?.error); } catch (e) { console.error("[Majoor] ERROR: Failed to connect to API:", e); } } // ui/app/style.ts -function ci() { +function ui() { let e = "mjr-feed-selection-override"; if (typeof document > "u" || document.getElementById(e)) return; let t = document.createElement("style"); t.id = e, t.textContent = "\n .mjr-bottom-feed .mjr-asset-card.is-selected,\n .mjr-bottom-feed .mjr-card.is-selected {\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--mjr-accent, #5fb3ff) 78%, #ffffff 22%), 0 0 0 6px color-mix(in srgb, var(--mjr-accent, #5fb3ff) 34%, transparent), 0 0 24px color-mix(in srgb, var(--mjr-accent, #5fb3ff) 52%, transparent), 0 10px 28px rgba(0, 0, 0, 0.32) !important;\n outline: 2px solid color-mix(in srgb, var(--mjr-accent, #5fb3ff) 85%, #ffffff 15%) !important;\n outline-offset: 0 !important;\n border-color: color-mix(in srgb, var(--mjr-accent, #5fb3ff) 62%, var(--mjr-border, rgba(255, 255, 255, 0.12))) !important;\n overflow: visible !important;\n z-index: 12 !important;\n }\n ", document.head.appendChild(t); } -function li({ enabled: e = !0 } = {}) { +function di({ enabled: e = !0 } = {}) { if (!e) return; let t = "mjr-theme-comfy-css"; - if (document.getElementById(t)) ci(); + if (document.getElementById(t)) ui(); else try { let e = new URL("data:text/css;base64,LyoqCiAqIE1ham9vciBBc3NldHMgTWFuYWdlciAtIENvbWZ5LWxpa2UgdGhlbWUgbGF5ZXIKICoKICogUlVMRVM6CiAqIC0gRG8gTk9UIGhhcmRjb2RlIGEgY3VzdG9tIHBhbGV0dGU7IHVzZSBleGlzdGluZyBDb21meVVJIENTUyB2YXJpYWJsZXMgdmlhIHZhciguLi4pLgogKiAtIEtlZXAgZXZlcnl0aGluZyBzY29wZWQgdW5kZXIgYC5tanItYXNzZXRzLW1hbmFnZXJgIHRvIGF2b2lkIGxlYWtpbmcgc3R5bGVzIHRvIENvbWZ5VUkgKGV4Y2VwdCBgLm1qci1wb3BvdmVyKmAgd2hpY2ggY2FuIGJlIHBvcnRhbGVkIHRvIGBkb2N1bWVudC5ib2R5YCkuCiAqLwoKLm1qci1hc3NldHMtbWFuYWdlciB7CiAgICAvKiBUeXBvZ3JhcGh5ICovCiAgICBmb250LWZhbWlseTogdmFyKAogICAgICAgIC0tY29tZnktZm9udCwKICAgICAgICB2YXIoCiAgICAgICAgICAgIC0tZm9udC1pbnRlciwKICAgICAgICAgICAgdWktc2Fucy1zZXJpZiwKICAgICAgICAgICAgc3lzdGVtLXVpLAogICAgICAgICAgICAtYXBwbGUtc3lzdGVtLAogICAgICAgICAgICAiU2Vnb2UgVUkiLAogICAgICAgICAgICBSb2JvdG8sCiAgICAgICAgICAgIEFyaWFsLAogICAgICAgICAgICBzYW5zLXNlcmlmCiAgICAgICAgKQogICAgKTsKICAgIGZvbnQtc2l6ZTogMTNweDsKICAgIGxpbmUtaGVpZ2h0OiAxLjM1OwogICAgY29sb3I6IHZhcigtLWZnLWNvbG9yLCB2YXIoLS1jb250ZW50LWZnLCB2YXIoLS1pbnB1dC10ZXh0LCAjZGRkKSkpOwoKICAgIC8qCiAgICAgKiBTdXJmYWNlcyAtIHByaW9yaXR5OiBDb21meVVJIHYxLjQyIGRlc2lnbi1zeXN0ZW0gdG9rZW4gLT4gbGVnYWN5IHRva2VuIC0+IGhhcmQgZmFsbGJhY2sKICAgICAqIE5ldyB0b2tlbnM6IC0taW50ZXJmYWNlLXBhbmVsLXN1cmZhY2UsIC0taW50ZXJmYWNlLW1lbnUtc3VyZmFjZSwgLS1pbnRlcmZhY2UtcGFuZWwtaG92ZXItc3VyZmFjZSwKICAgICAqICAgICAgICAgICAgIC0tbW9kYWwtY2FyZC1iYWNrZ3JvdW5kLCAtLWJ1dHRvbi1zdXJmYWNlLCAtLWJ1dHRvbi1ob3Zlci1zdXJmYWNlLAogICAgICogICAgICAgICAgICAgLS1pbnRlcmZhY2UtcGFuZWwtc2VsZWN0ZWQtc3VyZmFjZSwgLS1wcmltYXJ5LWJhY2tncm91bmQsIC0tbXV0ZWQtZm9yZWdyb3VuZCwKICAgICAqICAgICAgICAgICAgIC0tYm9yZGVyLWRlZmF1bHQsIC0tc3VjY2Vzcy1iYWNrZ3JvdW5kLCAtLXdhcm5pbmctYmFja2dyb3VuZCwgLS1kZXN0cnVjdGl2ZS1iYWNrZ3JvdW5kCiAgICAgKi8KICAgIC0tbWpyLXN1cmZhY2UtMDogdmFyKC0taW50ZXJmYWNlLXBhbmVsLXN1cmZhY2UsIHZhcigtLWNvbnRlbnQtYmcsICMxZTFlMWUpKTsKICAgIC0tbWpyLXN1cmZhY2UtMTogdmFyKC0taW50ZXJmYWNlLW1lbnUtc3VyZmFjZSwgdmFyKC0tY29tZnktbWVudS1iZywgIzJhMmEyYSkpOwogICAgLS1tanItc3VyZmFjZS0yOiB2YXIoLS1pbnRlcmZhY2UtcGFuZWwtaG92ZXItc3VyZmFjZSwgdmFyKC0tY29tZnktbWVudS1zZWNvbmRhcnktYmcsICMzMzMpKTsKICAgIC0tbWpyLXN1cmZhY2UtMzogdmFyKC0tbW9kYWwtY2FyZC1iYWNrZ3JvdW5kLCB2YXIoLS1jb21meS1tZW51LWJnLCAjMjIyKSk7CiAgICAtLW1qci1ib3JkZXI6IHZhcigtLWJvcmRlci1kZWZhdWx0LCB2YXIoLS1ib3JkZXItY29sb3IsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xMikpKTsKICAgIC0tbWpyLW11dGVkOiB2YXIoLS1tdXRlZC1mb3JlZ3JvdW5kLCB2YXIoLS1kZXNjcmlwLXRleHQsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC42NSkpKTsKICAgIC0tbWpyLWFjY2VudDogdmFyKC0tcHJpbWFyeS1iYWNrZ3JvdW5kLCB2YXIoLS1jb21meS1hY2NlbnQsICM1ZmIzZmYpKTsKICAgIC0tbWpyLWFjY2VudC1ob3ZlcjogdmFyKC0tcHJpbWFyeS1iYWNrZ3JvdW5kLWhvdmVyLCB2YXIoLS1jb21meS1hY2NlbnQsICM3ZWM4ZmYpKTsKICAgIC0tbWpyLWJ0bi1zdXJmYWNlOiB2YXIoLS1idXR0b24tc3VyZmFjZSwgdmFyKC0tbWpyLXN1cmZhY2UtMikpOwogICAgLS1tanItYnRuLWhvdmVyOiB2YXIoLS1idXR0b24taG92ZXItc3VyZmFjZSwgdmFyKC0tbWpyLXN1cmZhY2UtMikpOwogICAgLS1tanItc2VsZWN0ZWQtc3VyZmFjZTogdmFyKC0taW50ZXJmYWNlLXBhbmVsLXNlbGVjdGVkLXN1cmZhY2UsIHJnYmEoOTUsIDE3OSwgMjU1LCAwLjE1KSk7CgogICAgLyogUmFkaWkgLSB1c2UgQ29tZnlVSSBkZXNpZ24tc3lzdGVtIHJhZGl1cyB0b2tlbnMgd2hlbiBhdmFpbGFibGUgKi8KICAgIC0tbWpyLXItc206IHZhcigtLXJhZGl1cy1zbSwgOHB4KTsKICAgIC0tbWpyLXItbWQ6IHZhcigtLXJhZGl1cy1tZCwgMTBweCk7CiAgICAtLW1qci1yLWxnOiB2YXIoLS1yYWRpdXMtbGcsIDEycHgpOwoKICAgIC8qIFNwYWNpbmcgKi8KICAgIC0tbWpyLXBhZC1zbTogOHB4OwogICAgLS1tanItcGFkLW1kOiAxMnB4OwogICAgLS1tanItcGFkLWxnOiAxNnB4OwoKICAgIC8qIFNlbWFudGljIFN0YXR1cyBDb2xvcnMgLSBwcmVmZXIgQ29tZnlVSSB2MS40MiBzZW1hbnRpYyB0b2tlbnMgKi8KICAgIC0tbWpyLXN0YXR1cy1zdWNjZXNzOiB2YXIoLS1zdWNjZXNzLWJhY2tncm91bmQsIHZhcigtLWNvbWZ5LXN0YXR1cy1zdWNjZXNzLCAjNGNhZjUwKSk7CiAgICAtLW1qci1zdGF0dXMtd2FybmluZzogdmFyKC0td2FybmluZy1iYWNrZ3JvdW5kLCB2YXIoLS1jb21meS1zdGF0dXMtd2FybmluZywgI2ZmYTcyNikpOwogICAgLS1tanItc3RhdHVzLWVycm9yOiB2YXIoLS1kZXN0cnVjdGl2ZS1iYWNrZ3JvdW5kLCB2YXIoLS1jb21meS1zdGF0dXMtZXJyb3IsICNmNDQzMzYpKTsKICAgIC0tbWpyLXN0YXR1cy1pbmZvOiB2YXIoLS1jb21meS1zdGF0dXMtaW5mbywgIzIxOTZmMyk7CiAgICAtLW1qci1zdGF0dXMtbmV1dHJhbDogdmFyKC0tY29tZnktc3RhdHVzLW5ldXRyYWwsICM5ZTllOWUpOwogICAgLS1tanItc3Rhci1hY3RpdmU6ICNmZmQ0NWE7CgogICAgLyogQmFkZ2UgY29sb3JzIChvdmVycmlkZGVuIGJ5IHNldHRpbmdzKSAqLwogICAgLS1tanItYmFkZ2UtaW1hZ2U6ICMyMTk2ZjM7CiAgICAtLW1qci1iYWRnZS12aWRlbzogIzljMjdiMDsKICAgIC0tbWpyLWJhZGdlLWF1ZGlvOiAjZmY5ODAwOwogICAgLS1tanItYmFkZ2UtbW9kZWwzZDogIzRjYWY1MDsKICAgIC0tbWpyLWNhcmQtaG92ZXItY29sb3I6IHZhcigtLWludGVyZmFjZS1wYW5lbC1ob3Zlci1zdXJmYWNlLCAjM2QzZDNkKTsKICAgIC0tbWpyLWNhcmQtc2VsZWN0aW9uLWNvbG9yOiB2YXIoLS1pbnRlcmZhY2UtcGFuZWwtc2VsZWN0ZWQtc3VyZmFjZSwgIzRhOTBlMik7CiAgICAtLW1qci1yYXRpbmctY29sb3I6ICNmZjk1MDA7CiAgICAtLW1qci10YWctY29sb3I6ICM0YTkwZTI7Cn0KCi8qIE1ha2UgdGhlIHRoZW1lIHZpc2libHkgYXBwbHkgZXZlbiB3aXRoIGlubGluZSBzdHlsZXMgKi8KLm1qci1hc3NldHMtbWFuYWdlciAqIHsKICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIubWpyLWFtLWNvbnRhaW5lciB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgIGhlaWdodDogMTAwJTsKICAgIG92ZXJmbG93OiBoaWRkZW47Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hbS1oZWFkZXIgewogICAgcGFkZGluZzogMTRweCAxNnB4OwogICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHZhcigtLW1qci1ib3JkZXIpOwogICAgYmFja2dyb3VuZDogdmFyKC0tbWpyLXN1cmZhY2UtMSk7CiAgICBmbGV4OiAwIDAgYXV0bzsKICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgIHotaW5kZXg6IDI7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hbS1oZWFkZXItcm93IHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiAxMHB4OwogICAgbWluLWhlaWdodDogMjhweDsKICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsKICAgIGZsZXgtd3JhcDogd3JhcDsKICAgIHJvdy1nYXA6IDEwcHg7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hbS1oZWFkZXItbGVmdCB7CiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBnYXA6IDEwcHg7CiAgICBtaW4td2lkdGg6IDA7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hbS1oZWFkZXItYWN0aW9ucyB7CiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBnYXA6IDEwcHg7CiAgICBmbGV4OiAwIDAgYXV0bzsKICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgIGZsZXgtd3JhcDogd3JhcDsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFtLWhlYWRlci10b29scyB7CiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgIGdhcDogOHB4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLXRhYnMgewogICAgLyogUXVldWUtbGlrZSB0YWJzIChhY3RpdmUgcGlsbCwgb3RoZXJzIGFzIHRleHQpICovCiAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsKICAgIGJvcmRlcjogbm9uZTsKICAgIHBhZGRpbmc6IDA7CiAgICBnYXA6IDEwcHg7CiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBmbGV4OiAxIDEgYXV0bzsKICAgIG1pbi13aWR0aDogMDsKICAgIG92ZXJmbG93LXg6IGF1dG87CiAgICBvdmVyZmxvdy15OiBoaWRkZW47CiAgICBzY3JvbGxiYXItd2lkdGg6IG5vbmU7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci10YWJzOjotd2Via2l0LXNjcm9sbGJhciB7CiAgICB3aWR0aDogMDsKICAgIGhlaWdodDogMDsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLXRhYiB7CiAgICBwYWRkaW5nOiA2cHggMTJweDsKICAgIGJvcmRlci1yYWRpdXM6IDk5OXB4OwogICAgYm9yZGVyOiAxcHggc29saWQgdHJhbnNwYXJlbnQ7CiAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsKICAgIGNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tY29udGVudC1mZywgI2RkZCkgNjUlLCB0cmFuc3BhcmVudCk7CiAgICB0cmFuc2l0aW9uOgogICAgICAgIHRyYW5zZm9ybSAxMjBtcyBlYXNlLAogICAgICAgIGJhY2tncm91bmQtY29sb3IgMTIwbXMgZWFzZSwKICAgICAgICBjb2xvciAxMjBtcyBlYXNlLAogICAgICAgIGJvcmRlci1jb2xvciAxMjBtcyBlYXNlOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItdGFiOmhvdmVyIHsKICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtMXB4KTsKICAgIGNvbG9yOiB2YXIoLS1jb250ZW50LWZnLCAjZGRkKTsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0yKSA1NSUsIHRyYW5zcGFyZW50KTsKICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1ib3JkZXIpIDcwJSwgdHJhbnNwYXJlbnQpOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItdGFiLmlzLWFjdGl2ZSB7CiAgICBjb2xvcjogdmFyKC0tY29udGVudC1mZywgI2ZmZik7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMikgODAlLCB0cmFuc3BhcmVudCk7CiAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYm9yZGVyKSA4NSUsIHRyYW5zcGFyZW50KTsKICAgIGJveC1zaGFkb3c6IDAgNnB4IDE4cHggcmdiYSgwLCAwLCAwLCAwLjE4KTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWljb24tYnRuIHsKICAgIHdpZHRoOiAyOHB4OwogICAgaGVpZ2h0OiAyOHB4OwogICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1yYWRpdXMtbGcsIDAuNXJlbSk7CiAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1tanItYm9yZGVyKTsKICAgIGJhY2tncm91bmQ6IHZhcigtLW1qci1zdXJmYWNlLTIpOwogICAgY29sb3I6IHZhcigtLWNvbnRlbnQtZmcsICNkZGQpOwogICAgY3Vyc29yOiBwb2ludGVyOwogICAgcGFkZGluZzogMDsKICAgIHRyYW5zaXRpb246CiAgICAgICAgdHJhbnNmb3JtIDEyMG1zIGVhc2UsCiAgICAgICAgYmFja2dyb3VuZC1jb2xvciAxMjBtcyBlYXNlLAogICAgICAgIGJvcmRlci1jb2xvciAxMjBtcyBlYXNlOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItaWNvbi1idG46aG92ZXIgewogICAgYm9yZGVyLWNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWFjY2VudCkgNDUlLCB2YXIoLS1tanItYm9yZGVyKSk7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMikgODAlLCB2YXIoLS1tanItYWNjZW50KSA4JSk7CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTFweCk7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1pY29uLWJ0bi5tanItY29udGV4dC1hY3RpdmUsCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1pY29uLWJ0bi5tanItcG9wb3Zlci1vcGVuIHsKICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQpIDg1JSwgdmFyKC0tbWpyLWJvcmRlcikpOwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTIpIDU1JSwgdmFyKC0tbWpyLWFjY2VudCkgMTIlKTsKICAgIGJveC1zaGFkb3c6IDAgMCAwIDFweCBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWFjY2VudCkgMzUlLCB0cmFuc3BhcmVudCk7Cn0KCi8qIEZsb2F0aW5nIFZpZXdlciBidXR0b24gLSB0ZWFsIGdsb3cgd2hlbiB2aWV3ZXIgaXMgb3BlbiAqLwoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItaWNvbi1idG4ubWpyLW1mdi1idG4tYWN0aXZlIHsKICAgIGNvbG9yOiAjNGRkOWMwOwogICAgYm9yZGVyLWNvbG9yOiByZ2JhKDc3LCAyMTcsIDE5MiwgMC41NSk7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDc3LCAyMTcsIDE5MiwgMC4xKTsKICAgIGJveC1zaGFkb3c6IDAgMCAwIDFweCByZ2JhKDc3LCAyMTcsIDE5MiwgMC4yNSk7Cn0KLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWljb24tYnRuLm1qci1tZnYtYnRuLWFjdGl2ZSAucGkgewogICAgb3BhY2l0eTogMTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWljb24tYnRuLm1qci1tZXNzYWdlLWJ0biB7CiAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICBvdmVyZmxvdzogdmlzaWJsZTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWljb24tYnRuLm1qci1tZXNzYWdlLWhhcy11bnJlYWQgewogICAgYm9yZGVyLWNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWFjY2VudCkgNzUlLCB2YXIoLS1tanItYm9yZGVyKSk7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMikgNzIlLCB2YXIoLS1tanItYWNjZW50KSAxMSUpOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItbWVzc2FnZS1iYWRnZSB7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICB0b3A6IC01cHg7CiAgICByaWdodDogLTZweDsKICAgIG1pbi13aWR0aDogMTZweDsKICAgIGhlaWdodDogMTZweDsKICAgIHBhZGRpbmc6IDAgNHB4OwogICAgYm9yZGVyLXJhZGl1czogOTk5cHg7CiAgICBib3JkZXI6IDFweCBzb2xpZCBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMSkgNTUlLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMykpOwogICAgYmFja2dyb3VuZDogI2VmNTM1MDsKICAgIGNvbG9yOiAjZmZmOwogICAgZm9udC1zaXplOiAxMHB4OwogICAgZm9udC13ZWlnaHQ6IDcwMDsKICAgIGxpbmUtaGVpZ2h0OiAxOwogICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgIGJveC1zaGFkb3c6IDAgMnB4IDhweCByZ2JhKDAsIDAsIDAsIDAuMzUpOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItaWNvbi1idG4gLnBpIHsKICAgIGZvbnQtc2l6ZTogMTNweDsKICAgIGxpbmUtaGVpZ2h0OiAxOwogICAgb3BhY2l0eTogMC45Owp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItaWNvbi1idG46ZGlzYWJsZWQsCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1haS1jb250cm9sOmRpc2FibGVkIHsKICAgIG9wYWNpdHk6IDAuNTsKICAgIGN1cnNvcjogbm90LWFsbG93ZWQ7CiAgICB0cmFuc2Zvcm06IG5vbmU7CiAgICBmaWx0ZXI6IGdyYXlzY2FsZSgwLjQ1KTsKICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1ib3JkZXIpIDg4JSwgdHJhbnNwYXJlbnQpICFpbXBvcnRhbnQ7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMikgOTIlLCB0cmFuc3BhcmVudCkgIWltcG9ydGFudDsKICAgIGNvbG9yOiB2YXIoLS1tanItbXV0ZWQsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC42KSkgIWltcG9ydGFudDsKICAgIGJveC1zaGFkb3c6IG5vbmUgIWltcG9ydGFudDsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFpLWRpc2FibGVkIC5tanItYWktY29udHJvbDpob3ZlciB7CiAgICB0cmFuc2Zvcm06IG5vbmUgIWltcG9ydGFudDsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFpLWRpc2FibGVkLWJsb2NrIHsKICAgIG9wYWNpdHk6IDAuNTg7CiAgICBmaWx0ZXI6IGdyYXlzY2FsZSgwLjQ1KTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFpLWRpc2FibGVkLWJsb2NrIC5tanItYWktY29udHJvbCwKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFpLWRpc2FibGVkLWJsb2NrIGJ1dHRvbiB7CiAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKfQoKLyogUG9wb3ZlcnMgY2FuIGJlIG1vdmVkIHRvIGBkb2N1bWVudC5ib2R5YCAocG9ydGFsKSB0byBhdm9pZCBiZWluZyBjbGlwcGVkLiAqLwoubWpyLXBvcG92ZXIgewogICAgZm9udC1mYW1pbHk6IHZhcigKICAgICAgICAtLWNvbWZ5LWZvbnQsCiAgICAgICAgdmFyKAogICAgICAgICAgICAtLWZvbnQtaW50ZXIsCiAgICAgICAgICAgIHVpLXNhbnMtc2VyaWYsCiAgICAgICAgICAgIHN5c3RlbS11aSwKICAgICAgICAgICAgLWFwcGxlLXN5c3RlbSwKICAgICAgICAgICAgIlNlZ29lIFVJIiwKICAgICAgICAgICAgUm9ib3RvLAogICAgICAgICAgICBBcmlhbCwKICAgICAgICAgICAgc2Fucy1zZXJpZgogICAgICAgICkKICAgICk7CiAgICBmb250LXNpemU6IDEzcHg7CiAgICBsaW5lLWhlaWdodDogMS4zNTsKICAgIGNvbG9yOiB2YXIoLS1mZy1jb2xvciwgdmFyKC0tY29udGVudC1mZywgdmFyKC0taW5wdXQtdGV4dCwgI2RkZCkpKTsKCiAgICAvKiBQcm92aWRlIGZhbGxiYWNrcyB3aGVuIG91dHNpZGUgYC5tanItYXNzZXRzLW1hbmFnZXJgIHNjb3BlICovCiAgICAtLW1qci1zdXJmYWNlLTE6IHZhcigtLWludGVyZmFjZS1tZW51LXN1cmZhY2UsIHZhcigtLWNvbWZ5LW1lbnUtYmcsICMyYTJhMmEpKTsKICAgIC0tbWpyLWJvcmRlcjogdmFyKC0tYm9yZGVyLWRlZmF1bHQsIHZhcigtLWJvcmRlci1jb2xvciwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEyKSkpOwogICAgLS1tanItbXV0ZWQ6IHZhcigtLW11dGVkLWZvcmVncm91bmQsIHZhcigtLWRlc2NyaXAtdGV4dCwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjY1KSkpOwogICAgLS1tanItYWNjZW50OiB2YXIoLS1wcmltYXJ5LWJhY2tncm91bmQsIHZhcigtLWNvbWZ5LWFjY2VudCwgIzVmYjNmZikpOwogICAgLS1tanItcG9wb3Zlci16LWluZGV4OiAyMTQ3NDgzNjQ3OwoKICAgIHBvc2l0aW9uOiBmaXhlZDsKICAgIHRvcDogMDsKICAgIGxlZnQ6IDA7CiAgICBtaW4td2lkdGg6IDA7CiAgICB3aWR0aDogbWluKDI4MHB4LCBjYWxjKDEwMHZ3IC0gMjRweCkpOwogICAgbWF4LXdpZHRoOiBtaW4oMzYwcHgsIGNhbGMoMTAwdncgLSAyNHB4KSk7CiAgICBwYWRkaW5nOiAxMHB4OwogICAgYm9yZGVyLXJhZGl1czogdmFyKC0tcmFkaXVzLWxnLCAwLjVyZW0pOwogICAgYmFja2dyb3VuZDogdmFyKC0tbWpyLXN1cmZhY2UtMSwgdmFyKC0tY29tZnktbWVudS1iZywgIzJhMmEyYSkpOwogICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tbWpyLWJvcmRlciwgdmFyKC0tYm9yZGVyLWNvbG9yLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTIpKSk7CiAgICBib3gtc2hhZG93OiAwIDEycHggMjhweCByZ2JhKDAsIDAsIDAsIDAuMzUpOwogICAgei1pbmRleDogdmFyKC0tbWpyLXBvcG92ZXItei1pbmRleCk7CiAgICBtaW4taGVpZ2h0OiAwOwogICAgb3ZlcmZsb3cteDogaGlkZGVuOwogICAgb3ZlcmZsb3cteTogYXV0bzsKICAgIG92ZXJzY3JvbGwtYmVoYXZpb3I6IGNvbnRhaW47CiAgICAtd2Via2l0LW92ZXJmbG93LXNjcm9sbGluZzogdG91Y2g7CiAgICB0b3VjaC1hY3Rpb246IHBhbi15OwogICAgc2Nyb2xsYmFyLXdpZHRoOiB0aGluOwp9CgoubWpyLXBvcG92ZXItLWhpZGRlbiB7CiAgICBkaXNwbGF5OiBub25lOwp9CgoubWpyLWZpbHRlci1wb3BvdmVyIHsKICAgIG1pbi13aWR0aDogMzQwcHg7CiAgICB3aWR0aDogbWluKDM2MHB4LCBjYWxjKDEwMHZ3IC0gMjRweCkpOwogICAgcGFkZGluZzogMTJweDsKfQoKLm1qci1zb3J0LXBvcG92ZXIgewogICAgbWluLXdpZHRoOiAyMjBweDsKICAgIHdpZHRoOiBtaW4oMjYwcHgsIGNhbGMoMTAwdncgLSAyNHB4KSk7CiAgICBwYWRkaW5nOiAxMHB4Owp9CgoubWpyLWNvbGxlY3Rpb25zLXBvcG92ZXIgewogICAgbWluLXdpZHRoOiAyODBweDsKICAgIHdpZHRoOiBtaW4oMzIwcHgsIGNhbGMoMTAwdncgLSAyNHB4KSk7CiAgICBwYWRkaW5nOiAxMHB4Owp9CgoubWpyLXBpbm5lZC1mb2xkZXJzLXBvcG92ZXIgewogICAgbWluLXdpZHRoOiAyODBweDsKICAgIHdpZHRoOiBtaW4oMzQwcHgsIGNhbGMoMTAwdncgLSAyNHB4KSk7CiAgICBwYWRkaW5nOiAxMHB4Owp9CgoubWpyLXBpbm5lZC1mb2xkZXJzLXBvcG92ZXIgLm1qci1waW5uZWQtZm9sZGVycy1tZW51IHsKICAgIGRpc3BsYXk6IGdyaWQ7CiAgICBnYXA6IDZweDsKfQoKLm1qci1waW5uZWQtZm9sZGVycy1wb3BvdmVyIC5tanItcGlubmVkLWZvbGRlcnMtZW1wdHkgewogICAgcGFkZGluZzogMTBweCAxMnB4OwogICAgb3BhY2l0eTogMC43NTsKfQoKLm1qci1waW5uZWQtZm9sZGVycy1wb3BvdmVyIC5tanItcGlubmVkLWZvbGRlci1yb3cgewogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBzdHJldGNoOwogICAgd2lkdGg6IDEwMCU7Cn0KCi5tanItcGlubmVkLWZvbGRlcnMtcG9wb3ZlciAubWpyLXBpbm5lZC1mb2xkZXItb3BlbiB7CiAgICBmbGV4OiAxOwogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47CiAgICB3aWR0aDogMTAwJTsKICAgIGdhcDogMTBweDsKICAgIHBhZGRpbmc6IDlweCAxMHB4OwogICAgYm9yZGVyLXJhZGl1czogOXB4OwogICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgxMjAsIDE5MCwgMjU1LCAwLjE4KTsKICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgxMzVkZWcsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wMyksIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wMSkpOwogICAgdHJhbnNpdGlvbjoKICAgICAgICBib3JkZXItY29sb3IgMTIwbXMgZWFzZSwKICAgICAgICBiYWNrZ3JvdW5kIDEyMG1zIGVhc2U7Cn0KCi5tanItcGlubmVkLWZvbGRlcnMtcG9wb3ZlciAubWpyLXBpbm5lZC1mb2xkZXItb3Blbjpob3ZlciwKLm1qci1waW5uZWQtZm9sZGVycy1wb3BvdmVyIC5tanItcGlubmVkLWZvbGRlci1vcGVuOmZvY3VzLXZpc2libGUgewogICAgYm9yZGVyLWNvbG9yOiByZ2JhKDE0NSwgMjA1LCAyNTUsIDAuNCk7CiAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoMTM1ZGVnLCByZ2JhKDgwLCAxNDAsIDI1NSwgMC4xOCksIHJnYmEoMzIsIDEwMCwgMjAwLCAwLjE0KSk7Cn0KCi5tanItcGlubmVkLWZvbGRlcnMtcG9wb3ZlciAubWpyLXBpbm5lZC1mb2xkZXItbGFiZWwgewogICAgbWluLXdpZHRoOiAwOwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgIGZvbnQtd2VpZ2h0OiA2MDA7CiAgICBjb2xvcjogdmFyKC0tZmctY29sb3IsICNlNmVkZjcpOwp9CgoubWpyLXBpbm5lZC1mb2xkZXJzLXBvcG92ZXIgLm1qci1waW5uZWQtZm9sZGVyLXBhdGggewogICAgZmxleDogMCAxIGF1dG87CiAgICBtaW4td2lkdGg6IDA7CiAgICBtYXgtd2lkdGg6IDIyMHB4OwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgIG9wYWNpdHk6IDAuNjg7CiAgICBmb250LXNpemU6IDExcHg7Cn0KCi5tanItcGlubmVkLWZvbGRlcnMtcG9wb3ZlciAubWpyLXBpbm5lZC1mb2xkZXItdW5waW4gewogICAgd2lkdGg6IDQycHg7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgIHBhZGRpbmc6IDA7CiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDI1NSwgOTUsIDk1LCAwLjM1KTsKICAgIGJvcmRlci1yYWRpdXM6IDlweDsKICAgIG1hcmdpbi1sZWZ0OiA2cHg7CiAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoMTM1ZGVnLCByZ2JhKDI1NSwgNzAsIDcwLCAwLjE2KSwgcmdiYSgxNjAsIDIwLCAyMCwgMC4xMikpOwp9CgoubWpyLXBpbm5lZC1mb2xkZXJzLXBvcG92ZXIgLm1qci1waW5uZWQtZm9sZGVyLXVucGluIC5waSB7CiAgICBvcGFjaXR5OiAwLjg4OwogICAgY29sb3I6IHJnYmEoMjU1LCAxMzAsIDEzMCwgMC45Nik7Cn0KCi5tanItbWVzc2FnZXMtcG9wb3ZlciB7CiAgICBtaW4td2lkdGg6IDMyMHB4OwogICAgd2lkdGg6IG1pbig0NjBweCwgY2FsYygxMDB2dyAtIDI0cHgpKTsKICAgIHBhZGRpbmc6IDEwcHg7Cn0KCi5tanItaW5saW5lLWRpYWxvZy1tYXNrIHsKICAgIHBvc2l0aW9uOiBzdGF0aWMgIWltcG9ydGFudDsKICAgIGluc2V0OiBhdXRvICFpbXBvcnRhbnQ7CiAgICB3aWR0aDogYXV0byAhaW1wb3J0YW50OwogICAgaGVpZ2h0OiBhdXRvICFpbXBvcnRhbnQ7CiAgICBkaXNwbGF5OiBibG9jayAhaW1wb3J0YW50OwogICAgcG9pbnRlci1ldmVudHM6IGF1dG8gIWltcG9ydGFudDsKfQoKLm1qci1pbmxpbmUtZGlhbG9nLXJvb3QgewogICAgZGlzcGxheTogYmxvY2sgIWltcG9ydGFudDsKICAgIHdpZHRoOiAxMDAlOwogICAgcG9pbnRlci1ldmVudHM6IGF1dG87Cn0KCi5tanItaW5saW5lLWRpYWxvZy1jb250ZW50IHsKICAgIHBhZGRpbmc6IDA7Cn0KCi5tanItbWVzc2FnZXMtaGVhZCB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsKICAgIGdhcDogOHB4OwogICAgZmxleC13cmFwOiB3cmFwOwogICAgbWFyZ2luLWJvdHRvbTogOHB4Owp9CgoubWpyLW1lc3NhZ2VzLXRhYnMgewogICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiA2cHg7CiAgICBtYXJnaW4tYm90dG9tOiA4cHg7CiAgICBwYWRkaW5nOiAzcHg7CiAgICBib3JkZXItcmFkaXVzOiA5OTlweDsKICAgIGJvcmRlcjogMXB4IHNvbGlkIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYm9yZGVyKSA4OCUsIHRyYW5zcGFyZW50KTsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0yKSA3NCUsIHRyYW5zcGFyZW50KTsKfQoKLm1qci1tZXNzYWdlcy10YWIgewogICAgYXBwZWFyYW5jZTogbm9uZTsKICAgIGJvcmRlcjogMDsKICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50OwogICAgY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1jb250ZW50LWZnLCAjZjFmMWYxKSA3NiUsIHRyYW5zcGFyZW50KTsKICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogNnB4OwogICAgZm9udC1zaXplOiAxMXB4OwogICAgZm9udC13ZWlnaHQ6IDcwMDsKICAgIGxpbmUtaGVpZ2h0OiAxLjI7CiAgICBwYWRkaW5nOiA2cHggMTBweDsKICAgIGJvcmRlci1yYWRpdXM6IDk5OXB4OwogICAgY3Vyc29yOiBwb2ludGVyOwogICAgdHJhbnNpdGlvbjoKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yIDAuMTRzIGVhc2UsCiAgICAgICAgY29sb3IgMC4xNHMgZWFzZSwKICAgICAgICB0cmFuc2Zvcm0gMC4xNHMgZWFzZTsKfQoKLm1qci1tZXNzYWdlcy10YWI6aG92ZXIsCi5tanItbWVzc2FnZXMtdGFiOmZvY3VzLXZpc2libGUgewogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQpIDE0JSwgdHJhbnNwYXJlbnQpOwogICAgY29sb3I6IHZhcigtLWNvbnRlbnQtZmcsICNmMWYxZjEpOwogICAgb3V0bGluZTogbm9uZTsKfQoKLm1qci1tZXNzYWdlcy10YWIuaXMtYWN0aXZlIHsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYWNjZW50KSAyMiUsIHZhcigtLW1qci1zdXJmYWNlLTIpKTsKICAgIGNvbG9yOiB2YXIoLS1jb250ZW50LWZnLCAjZmZmKTsKICAgIGJveC1zaGFkb3c6IGluc2V0IDAgMCAwIDFweCBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWFjY2VudCkgMzQlLCB0cmFuc3BhcmVudCk7Cn0KCi5tanItbWVzc2FnZXMtcGFuZWxzIHsKICAgIGRpc3BsYXk6IGdyaWQ7CiAgICBnYXA6IDhweDsKICAgIG1heC1oZWlnaHQ6IG1pbig1MnZoLCA0MjBweCk7Cn0KCi5tanItbWVzc2FnZXMtbGlzdCwKLm1qci1tZXNzYWdlcy1zaG9ydGN1dHMtcGFuZWwgewogICAgb3ZlcmZsb3cteTogYXV0bzsKICAgIG92ZXJzY3JvbGwtYmVoYXZpb3I6IGNvbnRhaW47CiAgICBzY3JvbGxiYXItd2lkdGg6IHRoaW47Cn0KCi5tanItdGFiLWNvdW50LWJhZGdlIHsKICAgIG1pbi13aWR0aDogMTZweDsKICAgIGhlaWdodDogMTZweDsKICAgIHBhZGRpbmc6IDAgNXB4OwogICAgYm9yZGVyLXJhZGl1czogOTk5cHg7CiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgIGZvbnQtc2l6ZTogOXB4OwogICAgZm9udC13ZWlnaHQ6IDgwMDsKICAgIGxldHRlci1zcGFjaW5nOiAwLjAyZW07CiAgICBsaW5lLWhlaWdodDogMTsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYWNjZW50KSAyOCUsIHZhcigtLW1qci1zdXJmYWNlLTIpKTsKICAgIGNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tY29udGVudC1mZywgI2ZmZikgOTIlLCB0cmFuc3BhcmVudCk7CiAgICBib3gtc2hhZG93OiBpbnNldCAwIDAgMCAxcHggY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQpIDQ4JSwgdHJhbnNwYXJlbnQpOwp9CgoubWpyLW1lc3NhZ2VzLXRpdGxlIHsKICAgIGZsZXg6IDEgMSBhdXRvOwogICAgbWluLXdpZHRoOiAwOwogICAgZm9udC1zaXplOiAxMnB4OwogICAgZm9udC13ZWlnaHQ6IDcwMDsKICAgIGxldHRlci1zcGFjaW5nOiAwLjAzZW07CiAgICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOwogICAgY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1jb250ZW50LWZnLCAjZGRkKSA4MiUsIHZhcigtLW1qci1tdXRlZCkpOwp9CgoubWpyLW1lc3NhZ2VzLWFjdGlvbnMgewogICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBmbGV4LWVuZDsKICAgIGdhcDogNnB4OwogICAgZmxleC13cmFwOiB3cmFwOwp9CgoubWpyLW1lc3NhZ2VzLW1hcmstcmVhZC1idG4gewogICAgcGFkZGluZzogNHB4IDhweDsKICAgIGZvbnQtc2l6ZTogMTFweDsKICAgIGxpbmUtaGVpZ2h0OiAxLjI7Cn0KCi5tanItbWVzc2FnZXMtc3Rhci1saW5rIHsKICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogNnB4OwogICAgcGFkZGluZzogNHB4IDhweDsKICAgIGZvbnQtc2l6ZTogMTFweDsKICAgIGxpbmUtaGVpZ2h0OiAxLjI7CiAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7CiAgICBjb2xvcjogdmFyKC0tY29udGVudC1mZywgI2YxZjFmMSk7CiAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCAjZjNjODRiIDQyJSwgdmFyKC0tbWpyLWJvcmRlcikpOwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsICNmM2M4NGIgMTIlLCB2YXIoLS1tanItc3VyZmFjZS0yKSk7Cn0KCi5tanItbWVzc2FnZXMtc3Rhci1saW5rOmhvdmVyLAoubWpyLW1lc3NhZ2VzLXN0YXItbGluazpmb2N1cy12aXNpYmxlIHsKICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKfQoKLm1qci1tZXNzYWdlcy1zdGFyLWljb24gewogICAgY29sb3I6ICNmM2M4NGI7CiAgICBmb250LXNpemU6IDEycHg7CiAgICBsaW5lLWhlaWdodDogMTsKfQoKLm1qci1tZXNzYWdlcy1zdGFyLWxhYmVsIHsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7Cn0KCi5tanItbWVzc2FnZXMtbGlzdCB7CiAgICBkaXNwbGF5OiBncmlkOwogICAgZ2FwOiA4cHg7Cn0KCi5tanItbWVzc2FnZXMtZW1wdHkgewogICAgcGFkZGluZzogOHB4IDZweDsKICAgIGZvbnQtc2l6ZTogMTJweDsKICAgIG9wYWNpdHk6IDAuNzI7Cn0KCi5tanItbWVzc2FnZS1pdGVtIHsKICAgIGRpc3BsYXk6IGdyaWQ7CiAgICBnYXA6IDVweDsKICAgIGJvcmRlci1yYWRpdXM6IDEwcHg7CiAgICBib3JkZXI6IDFweCBzb2xpZCBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWJvcmRlcikgODYlLCB0cmFuc3BhcmVudCk7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMikgNTglLCB0cmFuc3BhcmVudCk7CiAgICBwYWRkaW5nOiA4cHg7Cn0KCi5tanItbWVzc2FnZS1pdGVtLS11bnJlYWQgewogICAgYm9yZGVyLWNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWFjY2VudCkgNTglLCB2YXIoLS1tanItYm9yZGVyKSk7CiAgICBib3gtc2hhZG93OiBpbnNldCAwIDAgMCAxcHggY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQpIDI2JSwgdHJhbnNwYXJlbnQpOwp9CgoubWpyLW1lc3NhZ2UtaXRlbS0td2FybmluZyB7CiAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCAjZjBiODVhIDYyJSwgdmFyKC0tbWpyLWJvcmRlcikpOwp9CgoubWpyLW1lc3NhZ2UtaXRlbS0tZXJyb3IgewogICAgYm9yZGVyLWNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgI2YzNmI2YiA2MiUsIHZhcigtLW1qci1ib3JkZXIpKTsKfQoKLm1qci1tZXNzYWdlLWl0ZW0tLXN1Y2Nlc3MgewogICAgYm9yZGVyLWNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgIzU4YzA3ZCA2MiUsIHZhcigtLW1qci1ib3JkZXIpKTsKfQoKLm1qci1tZXNzYWdlLWl0ZW0taGVhZCB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsKICAgIGdhcDogOHB4Owp9CgoubWpyLW1lc3NhZ2UtaXRlbS10aXRsZS13cmFwIHsKICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogOHB4OwogICAgbWluLXdpZHRoOiAwOwogICAgZmxleDogMSAxIGF1dG87Cn0KCi5tanItbWVzc2FnZS1pdGVtLWVtb2ppIHsKICAgIGZsZXg6IDAgMCBhdXRvOwogICAgZm9udC1zaXplOiAxNnB4OwogICAgbGluZS1oZWlnaHQ6IDE7Cn0KCi5tanItbWVzc2FnZS1pdGVtLXRpdGxlIHsKICAgIG1pbi13aWR0aDogMDsKICAgIGZvbnQtd2VpZ2h0OiA2MDA7CiAgICBjb2xvcjogdmFyKC0tY29udGVudC1mZywgI2YxZjFmMSk7Cn0KCi5tanItbWVzc2FnZS1pdGVtLWNhdGVnb3J5IHsKICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIHBhZGRpbmc6IDFweCA2cHg7CiAgICBib3JkZXItcmFkaXVzOiA5OTlweDsKICAgIGZvbnQtc2l6ZTogMTBweDsKICAgIGZvbnQtd2VpZ2h0OiA3MDA7CiAgICBsZXR0ZXItc3BhY2luZzogMC4wM2VtOwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQpIDIwJSwgdmFyKC0tbWpyLXN1cmZhY2UtMikpOwogICAgY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1jb250ZW50LWZnLCAjZmZmKSA4NiUsIHRyYW5zcGFyZW50KTsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7Cn0KCi5tanItbWVzc2FnZS1pdGVtLW1ldGEgewogICAgZm9udC1zaXplOiAxMXB4OwogICAgb3BhY2l0eTogMC43MjsKfQoKLm1qci1tZXNzYWdlLWl0ZW0tYm9keSB7CiAgICBmb250LXNpemU6IDEycHg7CiAgICBvcGFjaXR5OiAwLjkyOwogICAgbGluZS1oZWlnaHQ6IDEuNDU7CiAgICB3aGl0ZS1zcGFjZTogcHJlLXdyYXA7CiAgICB3b3JkLWJyZWFrOiBicmVhay13b3JkOwp9CgoubWpyLW1lc3NhZ2UtaXRlbS1hY3Rpb24gewogICAgZm9udC1zaXplOiAxMXB4OwogICAgZm9udC13ZWlnaHQ6IDYwMDsKICAgIGNvbG9yOiB2YXIoLS1tanItYWNjZW50LCB2YXIoLS1jb21meS1hY2NlbnQsICM1ZmIzZmYpKTsKICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKICAgIHdpZHRoOiBmaXQtY29udGVudDsKfQoKLm1qci1tZXNzYWdlLWl0ZW0tYWN0aW9uOmhvdmVyIHsKICAgIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOwp9CgovKiBUb2FzdCBIaXN0b3J5IHRhYiAtIHVucmVhZCBpbmRpY2F0b3IgZG90ICovCi5tanItdGFiLXVucmVhZC1kb3QgewogICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgd2lkdGg6IDZweDsKICAgIGhlaWdodDogNnB4OwogICAgYm9yZGVyLXJhZGl1czogNTAlOwogICAgYmFja2dyb3VuZDogdmFyKC0tbWpyLWFjY2VudCwgIzVmYjNmZik7CiAgICBtYXJnaW4tbGVmdDogNXB4OwogICAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsKICAgIGZsZXgtc2hyaW5rOiAwOwp9CgovKiBIaXN0b3J5IHBhbmVsICovCi5tanItbWVzc2FnZXMtaGlzdG9yeS1wYW5lbCB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgIG1pbi1oZWlnaHQ6IDA7CiAgICBvdmVyZmxvdzogaGlkZGVuOwp9CgoubWpyLWhpc3RvcnktaGVhZCB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsKICAgIHBhZGRpbmc6IDRweCAwIDZweDsKICAgIGZsZXgtc2hyaW5rOiAwOwp9CgoubWpyLWhpc3RvcnktaGVhZC1sYWJlbCB7CiAgICBmb250LXNpemU6IDExcHg7CiAgICBmb250LXdlaWdodDogNjAwOwogICAgb3BhY2l0eTogMC42MjsKICAgIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7CiAgICBsZXR0ZXItc3BhY2luZzogMC4wNWVtOwp9CgoubWpyLWhpc3RvcnktY2xlYXItYnRuIHsKICAgIGZvbnQtc2l6ZTogMTFweDsKICAgIHBhZGRpbmc6IDJweCA4cHg7CiAgICBib3JkZXItcmFkaXVzOiA0cHg7CiAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLW1qci1ib3JkZXIsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xMikpOwogICAgY29sb3I6IGluaGVyaXQ7CiAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICBvcGFjaXR5OiAwLjcyOwp9CgoubWpyLWhpc3RvcnktY2xlYXItYnRuOmhvdmVyIHsKICAgIG9wYWNpdHk6IDE7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWFjY2VudCkgMTIlLCB0cmFuc3BhcmVudCk7Cn0KCi5tanItaGlzdG9yeS1saXN0IHsKICAgIGRpc3BsYXk6IGdyaWQ7CiAgICBnYXA6IDRweDsKICAgIG92ZXJmbG93LXk6IGF1dG87CiAgICBvdmVyc2Nyb2xsLWJlaGF2aW9yOiBjb250YWluOwp9CgoubWpyLWhpc3RvcnktaXRlbSB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGZsZXgtc3RhcnQ7CiAgICBnYXA6IDhweDsKICAgIHBhZGRpbmc6IDZweCA4cHg7CiAgICBib3JkZXItcmFkaXVzOiA2cHg7CiAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1tanItYm9yZGVyLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDgpKTsKICAgIGJhY2tncm91bmQ6IHZhcigtLW1qci1zdXJmYWNlLTIsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wNCkpOwogICAgZm9udC1zaXplOiAxMnB4Owp9CgoubWpyLWhpc3RvcnktaXRlbS0tZXJyb3IgewogICAgYm9yZGVyLWNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgI2YzNmI2YiA1MCUsIHZhcigtLW1qci1ib3JkZXIpKTsKfQoKLm1qci1oaXN0b3J5LWl0ZW0tLXdhcm5pbmcgewogICAgYm9yZGVyLWNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgI2YwYjg1YSA1MCUsIHZhcigtLW1qci1ib3JkZXIpKTsKfQoKLm1qci1oaXN0b3J5LWl0ZW0tLXN1Y2Nlc3MgewogICAgYm9yZGVyLWNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgIzU4YzA3ZCA1MCUsIHZhcigtLW1qci1ib3JkZXIpKTsKfQoKLm1qci1oaXN0b3J5LWl0ZW0taWNvbiB7CiAgICBmbGV4LXNocmluazogMDsKICAgIGZvbnQtc2l6ZTogMTRweDsKICAgIGxpbmUtaGVpZ2h0OiAxLjQ7Cn0KCi5tanItaGlzdG9yeS1pdGVtLWNvbnRlbnQgewogICAgbWluLXdpZHRoOiAwOwogICAgZGlzcGxheTogZ3JpZDsKICAgIGdhcDogNHB4Owp9CgoubWpyLWhpc3RvcnktaXRlbS1tc2cgewogICAgb3BhY2l0eTogMC45MjsKICAgIHdoaXRlLXNwYWNlOiBwcmUtd3JhcDsKICAgIG92ZXJmbG93LXdyYXA6IGFueXdoZXJlOwogICAgd29yZC1icmVhazogYnJlYWstd29yZDsKfQoKLm1qci1oaXN0b3J5LWl0ZW0tdGl0bGUgewogICAgZm9udC13ZWlnaHQ6IDYwMDsKICAgIGxpbmUtaGVpZ2h0OiAxLjQ7CiAgICBvcGFjaXR5OiAwLjk2OwogICAgd2hpdGUtc3BhY2U6IHByZS13cmFwOwogICAgb3ZlcmZsb3ctd3JhcDogYW55d2hlcmU7Cn0KCi5tanItaGlzdG9yeS1pdGVtLWRldGFpbCB7CiAgICBvcGFjaXR5OiAwLjg0OwogICAgbGluZS1oZWlnaHQ6IDEuNDU7CiAgICB3aGl0ZS1zcGFjZTogcHJlLXdyYXA7CiAgICBvdmVyZmxvdy13cmFwOiBhbnl3aGVyZTsKICAgIHdvcmQtYnJlYWs6IGJyZWFrLXdvcmQ7Cn0KCi5tanItaGlzdG9yeS1pdGVtLW1ldGEgewogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBnYXA6IDZweDsKICAgIGZsZXgtd3JhcDogd3JhcDsKfQoKLm1qci1oaXN0b3J5LWl0ZW0tdGltZSB7CiAgICBmb250LXNpemU6IDEwcHg7CiAgICBvcGFjaXR5OiAwLjUyOwp9CgoubWpyLWhpc3RvcnktaXRlbS1jaGlwIHsKICAgIGZvbnQtc2l6ZTogMTBweDsKICAgIGxpbmUtaGVpZ2h0OiAxOwogICAgcGFkZGluZzogMnB4IDZweDsKICAgIGJvcmRlci1yYWRpdXM6IDk5OXB4OwogICAgYm9yZGVyOiAxcHggc29saWQgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1ib3JkZXIpIDgyJSwgdHJhbnNwYXJlbnQpOwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTMsIHZhcigtLW1qci1zdXJmYWNlLTIpKSA3OCUsIHRyYW5zcGFyZW50KTsKICAgIG9wYWNpdHk6IDAuNzY7Cn0KCi5tanItaGlzdG9yeS1pdGVtLWFjdGlvbiB7CiAgICBmb250LXNpemU6IDExcHg7CiAgICB3aWR0aDogZml0LWNvbnRlbnQ7CiAgICBjb2xvcjogdmFyKC0tbWpyLWFjY2VudCwgIzVmYjNmZik7CiAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7Cn0KCi5tanItaGlzdG9yeS1pdGVtLWFjdGlvbjpob3ZlciB7CiAgICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKfQoKLm1qci1oaXN0b3J5LWl0ZW0tcHJvZ3Jlc3MgewogICAgZGlzcGxheTogZ3JpZDsKICAgIGdhcDogNHB4Owp9CgoubWpyLWhpc3RvcnktaXRlbS1wcm9ncmVzcy1zdW1tYXJ5IHsKICAgIGZvbnQtc2l6ZTogMTFweDsKICAgIG9wYWNpdHk6IDAuNzQ7CiAgICBsaW5lLWhlaWdodDogMS4zNTsKICAgIHdoaXRlLXNwYWNlOiBwcmUtd3JhcDsKICAgIG92ZXJmbG93LXdyYXA6IGFueXdoZXJlOwp9CgoubWpyLWhpc3RvcnktaXRlbS1wcm9ncmVzcy1iYXIgewogICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgd2lkdGg6IDEwMCU7CiAgICBoZWlnaHQ6IDZweDsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICBib3JkZXItcmFkaXVzOiA5OTlweDsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYm9yZGVyKSA3NSUsIHRyYW5zcGFyZW50KTsKfQoKLm1qci1oaXN0b3J5LWl0ZW0tcHJvZ3Jlc3MtZmlsbCB7CiAgICBoZWlnaHQ6IDEwMCU7CiAgICBib3JkZXItcmFkaXVzOiBpbmhlcml0OwogICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KAogICAgICAgIDkwZGVnLAogICAgICAgIHZhcigtLW1qci1hY2NlbnQsICM1ZmIzZmYpLAogICAgICAgIGNvbG9yLW1peChpbiBzcmdiLCAjNThjMDdkIDcyJSwgdmFyKC0tbWpyLWFjY2VudCwgIzVmYjNmZikpCiAgICApOwp9CgoubWpyLXNob3J0Y3V0LWd1aWRlIHsKICAgIGRpc3BsYXk6IGdyaWQ7CiAgICBnYXA6IDhweDsKfQoKLm1qci1zaG9ydGN1dC1ndWlkZS1pbnRybyB7CiAgICBmb250LXNpemU6IDEycHg7CiAgICBsaW5lLWhlaWdodDogMS40NTsKICAgIG9wYWNpdHk6IDAuODQ7Cn0KCi5tanItc2hvcnRjdXQtc2VjdGlvbiB7CiAgICBkaXNwbGF5OiBncmlkOwogICAgZ2FwOiA2cHg7CiAgICBwYWRkaW5nOiA4cHg7CiAgICBib3JkZXItcmFkaXVzOiAxMHB4OwogICAgYm9yZGVyOiAxcHggc29saWQgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1ib3JkZXIpIDg0JSwgdHJhbnNwYXJlbnQpOwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTMsIHZhcigtLW1qci1zdXJmYWNlLTIpKSA3MiUsIHRyYW5zcGFyZW50KTsKfQoKLm1qci1zaG9ydGN1dC1zZWN0aW9uLXRpdGxlIHsKICAgIGZvbnQtc2l6ZTogMTFweDsKICAgIGZvbnQtd2VpZ2h0OiA3MDA7CiAgICBsZXR0ZXItc3BhY2luZzogMC4wNGVtOwogICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKICAgIGNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tY29udGVudC1mZywgI2YxZjFmMSkgODglLCB0cmFuc3BhcmVudCk7Cn0KCi5tanItc2hvcnRjdXQtbGlzdCB7CiAgICBkaXNwbGF5OiBncmlkOwogICAgZ2FwOiA2cHg7Cn0KCi5tanItc2hvcnRjdXQtcm93IHsKICAgIGRpc3BsYXk6IGdyaWQ7CiAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IG1pbm1heCgxMzJweCwgMTYwcHgpIG1pbm1heCgwLCAxZnIpOwogICAgZ2FwOiA4cHg7CiAgICBhbGlnbi1pdGVtczogc3RhcnQ7Cn0KCi5tanItc2hvcnRjdXQta2V5IHsKICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgbWluLWhlaWdodDogMjRweDsKICAgIHBhZGRpbmc6IDNweCA4cHg7CiAgICBib3JkZXItcmFkaXVzOiA5OTlweDsKICAgIGJvcmRlcjogMXB4IHNvbGlkIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYWNjZW50KSAzOCUsIHZhcigtLW1qci1ib3JkZXIpKTsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYWNjZW50KSAxMiUsIHZhcigtLW1qci1zdXJmYWNlLTIpKTsKICAgIGNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tY29udGVudC1mZywgI2ZmZikgOTAlLCB0cmFuc3BhcmVudCk7CiAgICBmb250LXNpemU6IDExcHg7CiAgICBmb250LXdlaWdodDogNzAwOwogICAgbGluZS1oZWlnaHQ6IDEuMjU7CiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgICB3aGl0ZS1zcGFjZTogbm9ybWFsOwp9CgoubWpyLXNob3J0Y3V0LWRlc2MgewogICAgbWluLXdpZHRoOiAwOwogICAgZm9udC1zaXplOiAxMnB4OwogICAgbGluZS1oZWlnaHQ6IDEuNDsKICAgIG9wYWNpdHk6IDAuOTI7Cn0KCkBtZWRpYSAobWF4LXdpZHRoOiA1NjBweCkgewogICAgLm1qci1zaG9ydGN1dC1yb3cgewogICAgICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogMWZyOwogICAgfQoKICAgIC5tanItc2hvcnRjdXQta2V5IHsKICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtc3RhcnQ7CiAgICB9Cn0KCi5tanItZmlsdGVyLXBvcG92ZXIgLm1qci1maWx0ZXItaGVhZCB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGZsZXgtc3RhcnQ7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47CiAgICBnYXA6IDEwcHg7CiAgICBtYXJnaW46IDAgMCAxMHB4OwogICAgcGFkZGluZzogNHB4IDJweCAxMHB4OwogICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYm9yZGVyKSA4NSUsIHRyYW5zcGFyZW50KTsKfQoKLm1qci1maWx0ZXItcG9wb3ZlciAubWpyLWZpbHRlci1oZWFkLWxlZnQgewogICAgbWluLXdpZHRoOiAwOwp9CgoubWpyLWZpbHRlci1wb3BvdmVyIC5tanItZmlsdGVyLWtpY2tlciB7CiAgICBmb250LXNpemU6IDExcHg7CiAgICBmb250LXdlaWdodDogODAwOwogICAgbGV0dGVyLXNwYWNpbmc6IDAuMDllbTsKICAgIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7CiAgICBjb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQsICM1ZmIzZmYpIDY1JSwgdmFyKC0tY29udGVudC1mZywgI2RkZCkpOwp9CgoubWpyLWZpbHRlci1wb3BvdmVyIC5tanItZmlsdGVyLXN1YnRpdGxlIHsKICAgIG1hcmdpbi10b3A6IDJweDsKICAgIGZvbnQtc2l6ZTogMTFweDsKICAgIGNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tY29udGVudC1mZywgI2RkZCkgNjIlLCB2YXIoLS1tanItbXV0ZWQsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC42NSkpKTsKfQoKLm1qci1maWx0ZXItcG9wb3ZlciAubWpyLWZpbHRlci1oZWFkLWFjdGlvbnMgewogICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiA4cHg7CiAgICBmbGV4OiAwIDAgYXV0bzsKfQoKLm1qci1maWx0ZXItcG9wb3ZlciAubWpyLWZpbHRlci1zdGFjayB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgIGdhcDogOHB4Owp9CgoubWpyLWZpbHRlci1wb3BvdmVyIC5tanItZmlsdGVyLWFjdGl2ZS1jb3VudCB7CiAgICBtaW4td2lkdGg6IDIycHg7CiAgICBoZWlnaHQ6IDIycHg7CiAgICBwYWRkaW5nOiAwIDZweDsKICAgIGJvcmRlci1yYWRpdXM6IDk5OXB4OwogICAgYm9yZGVyOiAxcHggc29saWQgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQsICM1ZmIzZmYpIDU1JSwgdmFyKC0tbWpyLWJvcmRlcikpOwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQsICM1ZmIzZmYpIDE4JSwgdmFyKC0tbWpyLXN1cmZhY2UtMikpOwogICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICBmb250LXNpemU6IDExcHg7CiAgICBmb250LXdlaWdodDogNzAwOwogICAgbGluZS1oZWlnaHQ6IDE7CiAgICBjb2xvcjogdmFyKC0tY29udGVudC1mZywgI2ZmZik7Cn0KCi5tanItZmlsdGVyLXBvcG92ZXIgLm1qci1maWx0ZXItY2xlYXItYWxsIHsKICAgIGhlaWdodDogMjRweDsKICAgIHBhZGRpbmc6IDAgOHB4OwogICAgYm9yZGVyLXJhZGl1czogOTk5cHg7CiAgICBib3JkZXI6IDFweCBzb2xpZCBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWJvcmRlcikgNzUlLCB0cmFuc3BhcmVudCk7CiAgICBmb250LXNpemU6IDExcHg7CiAgICBmb250LXdlaWdodDogNzAwOwp9CgoubWpyLWZpbHRlci1wb3BvdmVyIC5tanItcG9wb3Zlci1yb3cgewogICAgZGlzcGxheTogZ3JpZDsKICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogMWZyOwogICAgZ2FwOiA4cHg7CiAgICBhbGlnbi1pdGVtczogc3RhcnQ7CiAgICBtYXJnaW4tYm90dG9tOiAxMHB4Owp9CgoubWpyLWZpbHRlci1wb3BvdmVyIC5tanItcG9wb3Zlci1yb3ctLTNjb2wgewogICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiBtaW5tYXgoMCwgMWZyKSBtaW5tYXgoMCwgMWZyKTsKfQoKLm1qci1maWx0ZXItcG9wb3ZlciAubWpyLXBvcG92ZXItcm93LS0zY29sIC5tanItcG9wb3Zlci1sYWJlbCB7CiAgICBncmlkLWNvbHVtbjogMSAvIC0xOwp9CgoubWpyLWZpbHRlci1wb3BvdmVyIC5tanItcG9wb3Zlci1sYWJlbCB7CiAgICBmb250LXNpemU6IDEycHg7CiAgICBmb250LXdlaWdodDogNjAwOwogICAgY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1jb250ZW50LWZnLCAjZGRkKSA3MCUsIHZhcigtLW1qci1tdXRlZCwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjY1KSkpOwogICAgd2hpdGUtc3BhY2U6IG5vcm1hbDsKfQoKLm1qci1maWx0ZXItcG9wb3ZlciAubWpyLXBvcG92ZXItdG9nZ2xlIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiA2cHg7CiAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICBmb250LXNpemU6IDEycHg7CiAgICBjb2xvcjogdmFyKC0tZmctY29sb3IsICNlNmVkZjcpOwogICAgcGFkZGluZzogNnB4IDhweDsKICAgIGJvcmRlci1yYWRpdXM6IDhweDsKICAgIGJvcmRlcjogMXB4IHNvbGlkIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYm9yZGVyKSA4MCUsIHRyYW5zcGFyZW50KTsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0yKSA2NiUsIHRyYW5zcGFyZW50KTsKfQoKLm1qci1maWx0ZXItcG9wb3ZlciAubWpyLXBvcG92ZXItdG9nZ2xlIGlucHV0W3R5cGU9ImNoZWNrYm94Il0gewogICAgYWNjZW50LWNvbG9yOiB2YXIoLS1tanItYWNjZW50LCB2YXIoLS1jb21meS1hY2NlbnQsICM1ZmIzZmYpKTsKfQoKLm1qci1maWx0ZXItcG9wb3ZlciAubWpyLWZpbHRlci1ncm91cCB7CiAgICAtLW1qci1maWx0ZXItZ3JvdXAtYWNjZW50OiB2YXIoLS1tanItYWNjZW50LCAjN2FhMmZmKTsKICAgIHBhZGRpbmc6IDEwcHggMCA4cHg7CiAgICBtYXJnaW4tYm90dG9tOiA0cHg7CiAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgdmFyKC0tbWpyLWJvcmRlciwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEyKSk7Cn0KCi5tanItZmlsdGVyLXBvcG92ZXIgLm1qci1maWx0ZXItZ3JvdXA6bGFzdC1jaGlsZCB7CiAgICBtYXJnaW4tYm90dG9tOiAwOwogICAgYm9yZGVyLWJvdHRvbTogbm9uZTsKICAgIHBhZGRpbmctYm90dG9tOiAycHg7Cn0KCi5tanItZmlsdGVyLXBvcG92ZXIgLm1qci1maWx0ZXItZ3JvdXAtLWNvcmUgewogICAgLS1tanItZmlsdGVyLWdyb3VwLWFjY2VudDogIzU2YThmZjsKfQoKLm1qci1maWx0ZXItcG9wb3ZlciAubWpyLWZpbHRlci1ncm91cC0tbWVkaWEgewogICAgLS1tanItZmlsdGVyLWdyb3VwLWFjY2VudDogIzM1ZDA4YjsKfQoKLm1qci1maWx0ZXItcG9wb3ZlciAubWpyLWZpbHRlci1ncm91cC0tdGltZSB7CiAgICAtLW1qci1maWx0ZXItZ3JvdXAtYWNjZW50OiAjZjBiODRmOwp9CgoubWpyLWZpbHRlci1wb3BvdmVyIC5tanItZmlsdGVyLWdyb3VwLXRvZ2dsZSB7CiAgICB3aWR0aDogMTAwJTsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOwogICAgZ2FwOiAxMHB4OwogICAgbWFyZ2luOiAwIDAgMTBweDsKICAgIGJvcmRlcjogMDsKICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50OwogICAgY29sb3I6IGluaGVyaXQ7CiAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICB0ZXh0LWFsaWduOiBsZWZ0OwogICAgYm9yZGVyLXJhZGl1czogOHB4OwogICAgcGFkZGluZzogMnB4IDRweDsKfQoKLm1qci1maWx0ZXItcG9wb3ZlciAubWpyLWZpbHRlci1ncm91cC10aXRsZSB7CiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBnYXA6IDZweDsKICAgIGNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWZpbHRlci1ncm91cC1hY2NlbnQpIDYyJSwgdmFyKC0tY29udGVudC1mZywgI2RkZCkpOwogICAgZm9udC1zaXplOiAxMXB4OwogICAgZm9udC13ZWlnaHQ6IDcwMDsKICAgIGxldHRlci1zcGFjaW5nOiAwLjA4ZW07CiAgICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOwp9CgoubWpyLWZpbHRlci1wb3BvdmVyIC5tanItZmlsdGVyLWdyb3VwLXRpdGxlOjpiZWZvcmUgewogICAgY29udGVudDogIiI7CiAgICB3aWR0aDogNnB4OwogICAgaGVpZ2h0OiA2cHg7CiAgICBmbGV4OiAwIDAgNnB4OwogICAgYm9yZGVyLXJhZGl1czogOTk5cHg7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1tanItZmlsdGVyLWdyb3VwLWFjY2VudCk7Cn0KCi5tanItZmlsdGVyLXBvcG92ZXIgLm1qci1maWx0ZXItZ3JvdXAtY2hldnJvbiB7CiAgICBmb250LXNpemU6IDEycHg7CiAgICBsaW5lLWhlaWdodDogMTsKICAgIGNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWZpbHRlci1ncm91cC1hY2NlbnQpIDc4JSwgdmFyKC0tbWpyLW11dGVkLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNjUpKSk7Cn0KCi5tanItZmlsdGVyLXBvcG92ZXIgLm1qci1maWx0ZXItZ3JvdXAtYm9keSB7CiAgICBwYWRkaW5nLXRvcDogNHB4Owp9CgoubWpyLWZpbHRlci1wb3BvdmVyIC5tanItZmlsdGVyLWNhcmQgewogICAgYm9yZGVyOiAxcHggc29saWQgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1ib3JkZXIpIDg4JSwgdHJhbnNwYXJlbnQpOwogICAgYm9yZGVyLXJhZGl1czogMTBweDsKICAgIHBhZGRpbmc6IDEwcHg7CiAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoCiAgICAgICAgMTgwZGVnLAogICAgICAgIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0yKSA4NiUsIHRyYW5zcGFyZW50KSwKICAgICAgICBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMSkgODglLCB0cmFuc3BhcmVudCkKICAgICk7CiAgICBtYXJnaW4tYm90dG9tOiA4cHg7Cn0KCi5tanItZmlsdGVyLXBvcG92ZXIgLm1qci1maWx0ZXItY2FyZDpsYXN0LWNoaWxkIHsKICAgIG1hcmdpbi1ib3R0b206IDA7Cn0KCi5tanItZmlsdGVyLXBvcG92ZXIgLm1qci1maWx0ZXItY2FyZC0tYWdlbmRhIHsKICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgKICAgICAgICAxODBkZWcsCiAgICAgICAgY29sb3ItbWl4KGluIHNyZ2IsICNmMGI4NGYgOSUsIHZhcigtLW1qci1zdXJmYWNlLTIpKSwKICAgICAgICBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMSkgOTIlLCB0cmFuc3BhcmVudCkKICAgICk7Cn0KCi5tanItZmlsdGVyLXBvcG92ZXIgLm1qci1maWx0ZXItZ3JvdXA6bm90KC5pcy1vcGVuKSB7CiAgICBwYWRkaW5nLWJvdHRvbTogOHB4Owp9CgoubWpyLWZpbHRlci1wb3BvdmVyIC5tanItZmlsdGVyLWdyb3VwOm5vdCguaXMtb3BlbikgLm1qci1maWx0ZXItZ3JvdXAtdG9nZ2xlIHsKICAgIG1hcmdpbi1ib3R0b206IDA7Cn0KCkBtZWRpYSAobWF4LXdpZHRoOiA0NDBweCkgewogICAgLm1qci1maWx0ZXItcG9wb3ZlciAubWpyLWZpbHRlci1oZWFkIHsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICAgIGFsaWduLWl0ZW1zOiBzdHJldGNoOwogICAgfQoKICAgIC5tanItZmlsdGVyLXBvcG92ZXIgLm1qci1maWx0ZXItaGVhZC1hY3Rpb25zIHsKICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47CiAgICB9Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hbS1oZWFkZXItaWNvbiB7CiAgICBmb250LXNpemU6IDE2cHg7CiAgICBsaW5lLWhlaWdodDogMTsKICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgb3BhY2l0eTogMC45Owp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYW0taGVhZGVyLXRpdGxlIHsKICAgIG1hcmdpbjogMDsKICAgIGZvbnQtc2l6ZTogMTNweDsKICAgIGZvbnQtd2VpZ2h0OiA3MDA7CiAgICBsZXR0ZXItc3BhY2luZzogMC4wMWVtOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYW0tY29udGVudCB7CiAgICBmbGV4OiAxOwogICAgcGFkZGluZzogMTZweDsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgIG1pbi1oZWlnaHQ6IDA7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1mb2xkZXItYnJlYWRjcnVtYiB7CiAgICAtLW1qci1icmVhZGNydW1iLWFjY2VudDogIzU2YThmZjsKICAgIC0tbWpyLWJyZWFkY3J1bWItY3VycmVudDogIzM1ZDA4YjsKICAgIGRpc3BsYXk6IG5vbmU7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiA0cHg7CiAgICBwYWRkaW5nOiAzcHggNnB4OwogICAgbWFyZ2luOiAxcHggMCAzcHg7CiAgICBmb250LXNpemU6IDExcHg7CiAgICBvcGFjaXR5OiAwLjc4OwogICAgb3ZlcmZsb3c6IGF1dG87CiAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgYm9yZGVyLXJhZGl1czogOHB4OwogICAgYm9yZGVyOiAxcHggc29saWQgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1icmVhZGNydW1iLWFjY2VudCkgMjIlLCB0cmFuc3BhcmVudCk7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWJyZWFkY3J1bWItYWNjZW50KSA5JSwgdHJhbnNwYXJlbnQpOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItZm9sZGVyLWJyZWFkY3J1bWIuaXMtdmlzaWJsZSB7CiAgICBkaXNwbGF5OiBmbGV4Owp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItZm9sZGVyLWJyZWFkY3J1bWItYWN0aW9uIHsKICAgIHBhZGRpbmc6IDJweCA4cHg7CiAgICBib3JkZXI6IDFweCBzb2xpZCBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWJyZWFkY3J1bWItYWNjZW50KSA0MiUsIHRyYW5zcGFyZW50KTsKICAgIGJvcmRlci1yYWRpdXM6IDZweDsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYnJlYWRjcnVtYi1hY2NlbnQpIDE2JSwgdHJhbnNwYXJlbnQpOwogICAgY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYnJlYWRjcnVtYi1hY2NlbnQpIDc4JSwgI2ZmZmZmZik7CiAgICBmb250OiBpbmhlcml0OwogICAgY3Vyc29yOiBwb2ludGVyOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItZm9sZGVyLWJyZWFkY3J1bWItYWN0aW9uOmRpc2FibGVkIHsKICAgIGN1cnNvcjogZGVmYXVsdDsKICAgIG9wYWNpdHk6IDAuNTg7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1mb2xkZXItYnJlYWRjcnVtYi1hY3Rpb246bm90KDpkaXNhYmxlZCk6aG92ZXIgewogICAgYm9yZGVyLWNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWJyZWFkY3J1bWItYWNjZW50KSA2MiUsIHRyYW5zcGFyZW50KTsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYnJlYWRjcnVtYi1hY2NlbnQpIDI0JSwgdHJhbnNwYXJlbnQpOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItZm9sZGVyLWJyZWFkY3J1bWItc2VnbWVudCB7CiAgICBtYXgtd2lkdGg6IDIyMHB4OwogICAgbWluLXdpZHRoOiAwOwogICAgcGFkZGluZzogMXB4IDVweDsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHRyYW5zcGFyZW50OwogICAgYm9yZGVyLXJhZGl1czogNXB4OwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1icmVhZGNydW1iLWFjY2VudCkgOCUsIHRyYW5zcGFyZW50KTsKICAgIGNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWJyZWFkY3J1bWItYWNjZW50KSA3NiUsICNmZmZmZmYpOwogICAgZm9udDogaW5oZXJpdDsKICAgIGN1cnNvcjogcG9pbnRlcjsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWZvbGRlci1icmVhZGNydW1iLXNlZ21lbnQ6bm90KDpkaXNhYmxlZCk6aG92ZXIgewogICAgYm9yZGVyLWNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWJyZWFkY3J1bWItYWNjZW50KSAzOCUsIHRyYW5zcGFyZW50KTsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYnJlYWRjcnVtYi1hY2NlbnQpIDE2JSwgdHJhbnNwYXJlbnQpOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItZm9sZGVyLWJyZWFkY3J1bWItc2VnbWVudC5pcy1jdXJyZW50LAoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItZm9sZGVyLWJyZWFkY3J1bWItc2VnbWVudDpkaXNhYmxlZCB7CiAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYnJlYWRjcnVtYi1jdXJyZW50KSAzOCUsIHRyYW5zcGFyZW50KTsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYnJlYWRjcnVtYi1jdXJyZW50KSAxNCUsIHRyYW5zcGFyZW50KTsKICAgIGNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWJyZWFkY3J1bWItY3VycmVudCkgNzQlLCAjZmZmZmZmKTsKICAgIGN1cnNvcjogZGVmYXVsdDsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWZvbGRlci1icmVhZGNydW1iLXNlcGFyYXRvciB7CiAgICBjb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1icmVhZGNydW1iLWFjY2VudCkgNTglLCB2YXIoLS1tanItbXV0ZWQsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC42MikpKTsKICAgIG9wYWNpdHk6IDAuOTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLW1lZGlhLXNob3J0Y3V0cyB7CiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBnYXA6IDRweDsKICAgIGZsZXgtd3JhcDogd3JhcDsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLW1lZGlhLXNob3J0Y3V0LWJ0biB7CiAgICB3aWR0aDogMjRweDsKICAgIGhlaWdodDogMjRweDsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLW1lZGlhLXNob3J0Y3V0LWJ0biAucGkgewogICAgZm9udC1zaXplOiAxMXB4Owp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYW0tZHVwLWFsZXJ0IHsKICAgIHBhZGRpbmc6IDJweCA4cHg7CiAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXItY29sb3IsICM1NTUpOwogICAgYmFja2dyb3VuZDogdmFyKC0tY29tZnktbWVudS1iZywgIzIyMik7CiAgICBjb2xvcjogdmFyKC0taW5wdXQtdGV4dCwgI2VlZSk7CiAgICBib3JkZXItcmFkaXVzOiA5OTlweDsKICAgIGN1cnNvcjogcG9pbnRlcjsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFtLWJyb3dzZSB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IHN0cmV0Y2g7CiAgICBmbGV4OiAxOwogICAgbWluLWhlaWdodDogMDsKICAgIG1pbi13aWR0aDogMDsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICBib3JkZXItdG9wOiAxcHggc29saWQgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1ib3JkZXIpIDc1JSwgdHJhbnNwYXJlbnQpOwogICAgcGFkZGluZy10b3A6IDRweDsKfQoKLyogU2Nyb2xsYmFycyAobWF0Y2ggQ29tZnlVSSBmZWVsKSAqLwoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYW0tZ3JpZC1zY3JvbGwgewogICAgZmxleDogMSAxIGF1dG87CiAgICBtaW4td2lkdGg6IDA7CiAgICBtaW4taGVpZ2h0OiAwOwogICAgaGVpZ2h0OiAxMDAlOwogICAgb3ZlcmZsb3c6IGF1dG87CiAgICBvdmVyc2Nyb2xsLWJlaGF2aW9yOiBjb250YWluOwogICAgLXdlYmtpdC1vdmVyZmxvdy1zY3JvbGxpbmc6IHRvdWNoOwogICAgdG91Y2gtYWN0aW9uOiBwYW4teTsKICAgIHNjcm9sbGJhci13aWR0aDogdGhpbjsKICAgIHNjcm9sbGJhci1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1ib3JkZXIpIDg1JSwgdmFyKC0tY29udGVudC1mZywgI2RkZCkpIHRyYW5zcGFyZW50Owp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYW0tZ3JpZC1zY3JvbGw6Oi13ZWJraXQtc2Nyb2xsYmFyIHsKICAgIHdpZHRoOiAxMHB4OwogICAgaGVpZ2h0OiAxMHB4Owp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYW0tZ3JpZC1zY3JvbGw6Oi13ZWJraXQtc2Nyb2xsYmFyLXRyYWNrIHsKICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50Owp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYW0tZ3JpZC1zY3JvbGw6Oi13ZWJraXQtc2Nyb2xsYmFyLXRodW1iIHsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0yKSA1NSUsIHZhcigtLWNvbnRlbnQtZmcsICNkZGQpKTsKICAgIGJvcmRlcjogMnB4IHNvbGlkIHRyYW5zcGFyZW50OwogICAgYmFja2dyb3VuZC1jbGlwOiBwYWRkaW5nLWJveDsKICAgIGJvcmRlci1yYWRpdXM6IDk5OXB4Owp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYW0tZ3JpZC1zY3JvbGw6aG92ZXI6Oi13ZWJraXQtc2Nyb2xsYmFyLXRodW1iIHsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0yKSA3MCUsIHZhcigtLWNvbnRlbnQtZmcsICNkZGQpKTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFtLWdyaWQtc2Nyb2xsOjotd2Via2l0LXNjcm9sbGJhci1jb3JuZXIgewogICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hbS1jdXN0b20tY29udHJvbHMgewogICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICBmbGV4OiAxOwogICAgbWluLXdpZHRoOiAwOwogICAgZ2FwOiA4cHg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBmbGV4LWVuZDsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFtLXNlYXJjaCB7CiAgICBtYXJnaW4tYm90dG9tOiA4cHg7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogMTBweDsKICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFtLXNlYXJjaCB7CiAgICBwYWRkaW5nLWJvdHRvbTogNnB4OwogICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHZhcigtLW1qci1ib3JkZXIpOwogICAgbWFyZ2luLWJvdHRvbTogNnB4Owp9CgovKiBDYXJkIE1ldGFkYXRhIENvbG9ycyAqLwoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItbWV0YS1kdXJhdGlvbiB7CiAgICBjb2xvcjogI2ZmYTcyNjsgLyogT3JhbmdlIGZvciBkdXJhdGlvbiAqLwogICAgZm9udC13ZWlnaHQ6IDUwMDsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLW1ldGEtcmVzIHsKICAgIGNvbG9yOiAjNGZjM2Y3OyAvKiBMaWdodCBCbHVlIGZvciByZXNvbHV0aW9uICovCiAgICBmb250LXdlaWdodDogNTAwOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItbWV0YS1kYXRlIHsKICAgIGNvbG9yOiAjYjlmNmNhOyAvKiBQYWxlIEdyZWVuIGZvciBkYXRlICovCiAgICBmb250LXNpemU6IDAuOWVtOwogICAgZm9udC13ZWlnaHQ6IDUwMDsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLW1ldGEtdGltZSB7CiAgICBjb2xvcjogdmFyKC0tbWpyLW11dGVkLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNjUpKTsKICAgIGZvbnQtc2l6ZTogMC45ZW07Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hbS1zdW1tYXJ5IHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOwogICAgZ2FwOiAxMHB4OwogICAgbWFyZ2luOiAwIDAgNnB4IDA7CiAgICBwYWRkaW5nOiAwIDAgNHB4IDA7CiAgICBtaW4taGVpZ2h0OiAxNnB4OwogICAgZm9udC1zaXplOiAxMXB4OwogICAgY29sb3I6IHZhcigtLW1qci1tdXRlZCwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjY1KSk7CiAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1ib3JkZXIpIDY1JSwgdHJhbnNwYXJlbnQpOwogICAgZmxleDogMCAwIGF1dG87Cn0KCi8qIFRvYXN0cyAoZ2xvYmFsOiBjYW4gYmUgbW91bnRlZCB1bmRlciBkb2N1bWVudC5ib2R5KSAqLwoubWpyLXRvYXN0LWNvbnRhaW5lciB7CiAgICBwb3NpdGlvbjogZml4ZWQ7CiAgICB0b3A6IDE2cHg7CiAgICBsZWZ0OiA1MCU7CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLTUwJSk7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBnYXA6IDEwcHg7CiAgICB6LWluZGV4OiAxMDAwMDAxOwogICAgcG9pbnRlci1ldmVudHM6IG5vbmU7Cn0KCi5tanItdG9hc3QgewogICAgLS1tanItdG9hc3Qtc3RyaXA6IHZhcigtLW1qci1zdGF0dXMtaW5mbywgdmFyKC0tY29tZnktc3RhdHVzLWluZm8sICMyMTk2ZjMpKTsKICAgIC0tbWpyLXRvYXN0LWljb24tY29sb3I6IHZhcigtLW1qci1zdGF0dXMtaW5mbywgdmFyKC0tY29tZnktc3RhdHVzLWluZm8sICMyMTk2ZjMpKTsKICAgIGJhY2tncm91bmQ6IHZhcigtLWNvbWZ5LW1lbnUtYmcsICMyYTJhMmEpOwogICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyLWNvbG9yLCAjM2EzYTNhKTsKICAgIGJvcmRlci1sZWZ0OiA0cHggc29saWQgdmFyKC0tbWpyLXRvYXN0LXN0cmlwKTsKICAgIGJvcmRlci1yYWRpdXM6IDRweDsKICAgIHBhZGRpbmc6IDEycHggMTZweDsKICAgIGNvbG9yOiB2YXIoLS1mZy1jb2xvciwgI2VmZWZlZik7CiAgICBmb250LWZhbWlseTogdmFyKAogICAgICAgIC0tY29tZnktZm9udCwKICAgICAgICB1aS1zYW5zLXNlcmlmLAogICAgICAgIHN5c3RlbS11aSwKICAgICAgICAtYXBwbGUtc3lzdGVtLAogICAgICAgICJTZWdvZSBVSSIsCiAgICAgICAgUm9ib3RvLAogICAgICAgIEFyaWFsLAogICAgICAgIHNhbnMtc2VyaWYKICAgICk7CiAgICBmb250LXNpemU6IDE0cHg7CiAgICBib3gtc2hhZG93OiAwIDRweCAxNnB4IHJnYmEoMCwgMCwgMCwgMC41KTsKICAgIG9wYWNpdHk6IDA7CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTE1cHgpOwogICAgdHJhbnNpdGlvbjoKICAgICAgICBvcGFjaXR5IDAuMnMgZWFzZS1vdXQsCiAgICAgICAgdHJhbnNmb3JtIDAuMnMgZWFzZS1vdXQ7CiAgICBwb2ludGVyLWV2ZW50czogYXV0bzsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiAxMnB4OwogICAgd2hpdGUtc3BhY2U6IHByZS13cmFwOwogICAgd2lkdGg6IG1heC1jb250ZW50OwogICAgbWluLXdpZHRoOiBtaW4oMjUwcHgsIGNhbGMoMTAwdncgLSAyNHB4KSk7CiAgICBtYXgtd2lkdGg6IG1pbig0MDBweCwgY2FsYygxMDB2dyAtIDI0cHgpKTsKICAgIGJhY2tkcm9wLWZpbHRlcjogYmx1cig0cHgpOwogICAgY3Vyc29yOiBkZWZhdWx0OwogICAgdXNlci1zZWxlY3Q6IG5vbmU7Cn0KCi5tanItdG9hc3QuaXMtdmlzaWJsZSB7CiAgICBvcGFjaXR5OiAxOwogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDApOwp9CgoubWpyLXRvYXN0LXRleHQgewogICAgZmxleDogMTsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiA4cHg7Cn0KCi8qIFRvYXN0IGljb24gc3R5bGluZyAqLwoubWpyLXRvYXN0LXRleHQ6OmJlZm9yZSB7CiAgICBjb250ZW50OiBhdHRyKGRhdGEtaWNvbik7CiAgICBmb250LXNpemU6IDE2cHg7CiAgICBmb250LXdlaWdodDogYm9sZDsKICAgIGNvbG9yOiB2YXIoLS1tanItdG9hc3QtaWNvbi1jb2xvcik7CiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgIG1pbi13aWR0aDogMTZweDsKfQoKLm1qci10b2FzdC1zdWNjZXNzIHsKICAgIC0tbWpyLXRvYXN0LXN0cmlwOiB2YXIoLS1tanItc3RhdHVzLXN1Y2Nlc3MsIHZhcigtLWNvbWZ5LXN0YXR1cy1zdWNjZXNzLCAjNGNhZjUwKSk7CiAgICAtLW1qci10b2FzdC1pY29uLWNvbG9yOiB2YXIoLS1tanItc3RhdHVzLXN1Y2Nlc3MsIHZhcigtLWNvbWZ5LXN0YXR1cy1zdWNjZXNzLCAjNGNhZjUwKSk7Cn0KCi5tanItdG9hc3QtZXJyb3IgewogICAgLS1tanItdG9hc3Qtc3RyaXA6IHZhcigtLW1qci1zdGF0dXMtZXJyb3IsIHZhcigtLWNvbWZ5LXN0YXR1cy1lcnJvciwgI2Y0NDMzNikpOwogICAgLS1tanItdG9hc3QtaWNvbi1jb2xvcjogdmFyKC0tbWpyLXN0YXR1cy1lcnJvciwgdmFyKC0tY29tZnktc3RhdHVzLWVycm9yLCAjZjQ0MzM2KSk7Cn0KCi5tanItdG9hc3Qtd2FybmluZyB7CiAgICAtLW1qci10b2FzdC1zdHJpcDogdmFyKC0tbWpyLXN0YXR1cy13YXJuaW5nLCB2YXIoLS1jb21meS1zdGF0dXMtd2FybmluZywgI2ZmYTcyNikpOwogICAgLS1tanItdG9hc3QtaWNvbi1jb2xvcjogdmFyKC0tbWpyLXN0YXR1cy13YXJuaW5nLCB2YXIoLS1jb21meS1zdGF0dXMtd2FybmluZywgI2ZmYTcyNikpOwp9CgoubWpyLXRvYXN0LWluZm8gewogICAgLS1tanItdG9hc3Qtc3RyaXA6IHZhcigtLW1qci1zdGF0dXMtaW5mbywgdmFyKC0tY29tZnktc3RhdHVzLWluZm8sICMyMTk2ZjMpKTsKICAgIC0tbWpyLXRvYXN0LWljb24tY29sb3I6IHZhcigtLW1qci1zdGF0dXMtaW5mbywgdmFyKC0tY29tZnktc3RhdHVzLWluZm8sICMyMTk2ZjMpKTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFtLXN1bW1hcnktdGV4dCB7CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7CiAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYW0tc3VtbWFyeS1yaWdodCB7CiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBnYXA6IDZweDsKICAgIG1pbi13aWR0aDogMDsKICAgIGZsZXgtd3JhcDogd3JhcDsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFtLWNvbnRleHQtcGlsbHMgewogICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiA1cHg7CiAgICByb3ctZ2FwOiA0cHg7CiAgICBmbGV4LXdyYXA6IHdyYXA7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtZW5kOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItY29udGV4dC1waWxsIHsKICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogNnB4OwogICAgcGFkZGluZzogM3B4IDdweDsKICAgIGJvcmRlci1yYWRpdXM6IDk5OXB4OwogICAgYm9yZGVyOiAxcHggc29saWQgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQpIDU1JSwgdmFyKC0tbWpyLWJvcmRlcikpOwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTIpIDU1JSwgdmFyKC0tbWpyLWFjY2VudCkgMTAlKTsKICAgIGJveC1zaGFkb3c6IDAgMCAwIDFweCBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWFjY2VudCkgMTglLCB0cmFuc3BhcmVudCk7CiAgICBjb2xvcjogdmFyKC0tY29udGVudC1mZywgI2RkZCk7CiAgICBmb250LXNpemU6IDEwLjVweDsKICAgIGxpbmUtaGVpZ2h0OiAxOwogICAgbWluLWhlaWdodDogMjJweDsKICAgIG1heC13aWR0aDogMjIwcHg7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1jb250ZXh0LXBpbGw6aG92ZXIgewogICAgYm9yZGVyLWNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWFjY2VudCkgNzUlLCB2YXIoLS1tanItYm9yZGVyKSk7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMikgNTAlLCB2YXIoLS1tanItYWNjZW50KSAxNCUpOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItY29udGV4dC1waWxsLXRleHQgewogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgIG9wYWNpdHk6IDAuOTI7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1jb250ZXh0LXBpbGwteCB7CiAgICB3aWR0aDogMjBweDsKICAgIGhlaWdodDogMjBweDsKICAgIHBhZGRpbmc6IDA7CiAgICBib3JkZXI6IDFweCBzb2xpZCBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWJvcmRlcikgNzUlLCB0cmFuc3BhcmVudCk7CiAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsKICAgIGJvcmRlci1yYWRpdXM6IDk5OXB4OwogICAgY29sb3I6IHZhcigtLW1qci1tdXRlZCwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjY1KSk7CiAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICBsaW5lLWhlaWdodDogMTsKICAgIGZvbnQtc2l6ZTogMTRweDsKICAgIGZvbnQtZmFtaWx5OiBpbmhlcml0OwogICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICB0cmFuc2l0aW9uOgogICAgICAgIGJhY2tncm91bmQtY29sb3IgMTIwbXMgZWFzZSwKICAgICAgICBib3JkZXItY29sb3IgMTIwbXMgZWFzZTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWNvbnRleHQtcGlsbC14OmhvdmVyIHsKICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQpIDU1JSwgdmFyKC0tbWpyLWJvcmRlcikpOwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTIpIDcwJSwgdmFyKC0tbWpyLWFjY2VudCkgMTAlKTsKICAgIGNvbG9yOiB2YXIoLS1jb250ZW50LWZnLCAjZmZmKTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFtLXNlYXJjaC1waWxsIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiAxMHB4OwogICAgaGVpZ2h0OiAxLjc1cmVtOwogICAgcGFkZGluZzogMCAxMHB4OwogICAgd2lkdGg6IDEwMCU7CiAgICBtYXgtd2lkdGg6IG5vbmU7CiAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1yYWRpdXMtbGcsIDAuNXJlbSk7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1jb21meS1pbnB1dC1iZywgcmdiYSgwLCAwLCAwLCAwLjI1KSk7CiAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1tanItYm9yZGVyKTsKICAgIGZsZXg6IDEgMSBhdXRvOwogICAgbWluLXdpZHRoOiAwOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYW0tc2VhcmNoLXRvb2xzIHsKICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogOHB4OwogICAgZmxleDogMCAwIGF1dG87Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1wb3BvdmVyLWFuY2hvciB7CiAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7Cn0KCi5tanItYWdlbmRhLWlucHV0IHsKICAgIGRpc3BsYXk6IG5vbmU7CiAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1tanItYm9yZGVyKTsKICAgIGJhY2tncm91bmQ6IHZhcigtLWNvbWZ5LWlucHV0LWJnLCByZ2JhKDAsIDAsIDAsIDAuMjUpKTsKICAgIGNvbG9yOiB2YXIoLS1pbnB1dC10ZXh0LCAjZGRkKTsKICAgIHRyYW5zaXRpb246CiAgICAgICAgYmFja2dyb3VuZC1jb2xvciAwLjJzIGVhc2UsCiAgICAgICAgY29sb3IgMC4ycyBlYXNlLAogICAgICAgIGJvcmRlci1jb2xvciAwLjJzIGVhc2U7Cn0KLm1qci1hZ2VuZGEtaW5wdXQubWpyLWFnZW5kYS1maWxsZWQgewogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KAogICAgICAgIGluIHNyZ2IsCiAgICAgICAgdmFyKC0tbWpyLWFjY2VudCwgdmFyKC0tY29tZnktYWNjZW50LCAjNWZiM2ZmKSkgNDAlLAogICAgICAgIHZhcigtLW1qci1zdXJmYWNlLTIpIDYwJQogICAgKTsKICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KAogICAgICAgIGluIHNyZ2IsCiAgICAgICAgdmFyKC0tbWpyLWFjY2VudCwgdmFyKC0tY29tZnktYWNjZW50LCAjNWZiM2ZmKSkgODAlLAogICAgICAgIHZhcigtLW1qci1ib3JkZXIpCiAgICApOwogICAgY29sb3I6IHZhcigtLWNvbnRlbnQtZmcsICNmZmYpOwp9Ci5tanItYWdlbmRhLWlucHV0Lm1qci1hZ2VuZGEtZW1wdHkgewogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTIpIDg1JSwgdHJhbnNwYXJlbnQgMTUlKTsKICAgIGJvcmRlci1jb2xvcjogdmFyKC0tbWpyLWJvcmRlcik7CiAgICBjb2xvcjogdmFyKC0tbWpyLW11dGVkLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNjUpKTsKfQoKLm1qci1hZ2VuZGEtY29udGFpbmVyIHsKICAgIHdpZHRoOiAxMDAlOwp9CgoubWpyLWFnZW5kYS1jYWxlbmRhciB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgIGdhcDogOHB4OwogICAgd2lkdGg6IDEwMCU7CiAgICBtaW4td2lkdGg6IDA7Cn0KCi5tanItYWdlbmRhLWhlYWRlciB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogOHB4Owp9CgoubWpyLWFnZW5kYS1tb250aCB7CiAgICBmbGV4OiAxOwogICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgZm9udC13ZWlnaHQ6IDYwMDsKICAgIGZvbnQtc2l6ZTogMTJweDsKICAgIGNvbG9yOiB2YXIoLS1jb250ZW50LWZnLCAjZGRkKTsKICAgIHVzZXItc2VsZWN0OiBub25lOwp9CgoubWpyLWFnZW5kYS1uYXYgewogICAgd2lkdGg6IDMycHg7CiAgICBoZWlnaHQ6IDI4cHg7CiAgICBwYWRkaW5nOiAwOwogICAgYm9yZGVyLXJhZGl1czogMTBweDsKfQoKLm1qci1hZ2VuZGEtZ3JpZCB7CiAgICBkaXNwbGF5OiBncmlkOwogICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiByZXBlYXQoNywgbWlubWF4KDAsIDFmcikpOwogICAgZ2FwOiA2cHg7CiAgICB3aWR0aDogMTAwJTsKfQoKLm1qci1hZ2VuZGEtd2Vla2RheSB7CiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgICBmb250LXNpemU6IDExcHg7CiAgICBjb2xvcjogdmFyKC0tbWpyLW11dGVkLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNjUpKTsKICAgIHVzZXItc2VsZWN0OiBub25lOwp9CgoubWpyLWFnZW5kYS1kYXkgewogICAgaGVpZ2h0OiAzMHB4OwogICAgYm9yZGVyLXJhZGl1czogMTBweDsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLW1qci1ib3JkZXIpOwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTIpIDU1JSwgdHJhbnNwYXJlbnQpOwogICAgY29sb3I6IHZhcigtLWNvbnRlbnQtZmcsICNkZGQpOwogICAgY3Vyc29yOiBwb2ludGVyOwogICAgZm9udC1zaXplOiAxMnB4OwogICAgbGluZS1oZWlnaHQ6IDE7CiAgICBwYWRkaW5nOiAwOwogICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICB0cmFuc2l0aW9uOgogICAgICAgIGJhY2tncm91bmQtY29sb3IgMTIwbXMgZWFzZSwKICAgICAgICBib3JkZXItY29sb3IgMTIwbXMgZWFzZSwKICAgICAgICB0cmFuc2Zvcm0gODBtcyBlYXNlOwp9CgoubWpyLWFnZW5kYS1kYXktYmFkZ2UgewogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgdG9wOiAtNXB4OwogICAgcmlnaHQ6IC01cHg7CiAgICBtaW4td2lkdGg6IDE2cHg7CiAgICBoZWlnaHQ6IDE2cHg7CiAgICBwYWRkaW5nOiAwIDRweDsKICAgIGJvcmRlci1yYWRpdXM6IDk5OXB4OwogICAgYmFja2dyb3VuZDogI2U1MzkzNTsKICAgIGNvbG9yOiAjZmZmOwogICAgYm9yZGVyOiAxcHggc29saWQgY29sb3ItbWl4KGluIHNyZ2IsICNlNTM5MzUgNjUlLCAjZmZmZmZmIDM1JSk7CiAgICBmb250LXNpemU6IDEwcHg7CiAgICBmb250LXdlaWdodDogNzAwOwogICAgbGluZS1oZWlnaHQ6IDE0cHg7CiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7Cn0KCi5tanItYWdlbmRhLWRheTpob3ZlciB7CiAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peCgKICAgICAgICBpbiBzcmdiLAogICAgICAgIHZhcigtLW1qci1ib3JkZXIpIDU1JSwKICAgICAgICB2YXIoLS1tanItYWNjZW50LCB2YXIoLS1jb21meS1hY2NlbnQsICM1ZmIzZmYpKSA0NSUKICAgICk7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoCiAgICAgICAgaW4gc3JnYiwKICAgICAgICB2YXIoLS1tanItc3VyZmFjZS0yKSA0NSUsCiAgICAgICAgdmFyKC0tbWpyLWFjY2VudCwgdmFyKC0tY29tZnktYWNjZW50LCAjNWZiM2ZmKSkgMTAlCiAgICApOwp9CgoubWpyLWFnZW5kYS1kYXk6YWN0aXZlIHsKICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgxcHgpOwp9CgoubWpyLWFnZW5kYS1kYXktLWJsYW5rIHsKICAgIHZpc2liaWxpdHk6IGhpZGRlbjsKICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwp9CgoubWpyLWFnZW5kYS1kYXktLWhhcy1hc3NldHMgewogICAgYm9yZGVyLWNvbG9yOiBjb2xvci1taXgoCiAgICAgICAgaW4gc3JnYiwKICAgICAgICB2YXIoLS1tanItYWNjZW50LCB2YXIoLS1jb21meS1hY2NlbnQsICM1ZmIzZmYpKSA4MCUsCiAgICAgICAgdmFyKC0tbWpyLWJvcmRlcikKICAgICk7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoCiAgICAgICAgaW4gc3JnYiwKICAgICAgICB2YXIoLS1tanItYWNjZW50LCB2YXIoLS1jb21meS1hY2NlbnQsICM1ZmIzZmYpKSAxOCUsCiAgICAgICAgdmFyKC0tbWpyLXN1cmZhY2UtMikgODIlCiAgICApOwp9CgoubWpyLWFnZW5kYS1kYXktLXNlbGVjdGVkIHsKICAgIGJvcmRlci1jb2xvcjogdmFyKC0tbWpyLWFjY2VudCwgdmFyKC0tY29tZnktYWNjZW50LCAjNWZiM2ZmKSk7CiAgICBib3gtc2hhZG93OiAwIDAgMCAxcHgKICAgICAgICBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWFjY2VudCwgdmFyKC0tY29tZnktYWNjZW50LCAjNWZiM2ZmKSkgNTUlLCB0cmFuc3BhcmVudCk7Cn0KCi5tanItYWdlbmRhLWZvb3RlciB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZ2FwOiA4cHg7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47Cn0KCi5tanItYWdlbmRhLWNsZWFyLAoubWpyLWFnZW5kYS1yZWZyZXNoIHsKICAgIGZsZXg6IDE7Cn0KCi5tanItbWVudSwKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLW1lbnUgewogICAgZGlzcGxheTogZmxleDsKICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICBnYXA6IDRweDsKfQoKLm1qci1wcmltZS1tZW51LWxpc3QsCi5tanItc29ydC1tZW51IFtkYXRhLXBjLXNlY3Rpb249Imxpc3QiXSB7CiAgICBsaXN0LXN0eWxlOiBub25lOwogICAgbWFyZ2luOiAwOwogICAgcGFkZGluZzogMDsKICAgIGRpc3BsYXk6IGdyaWQ7CiAgICBnYXA6IDZweDsKfQoKLm1qci1wcmltZS1tZW51IFtkYXRhLXBjLXNlY3Rpb249Iml0ZW0iXSwKLm1qci1wcmltZS1tZW51LWxpc3QgW2RhdGEtcGMtc2VjdGlvbj0iaXRlbSJdIHsKICAgIGxpc3Qtc3R5bGU6IG5vbmU7Cn0KCi5tanItcHJpbWUtbWVudSBbZGF0YS1wYy1zZWN0aW9uPSJpdGVtY29udGVudCJdIHsKICAgIHdpZHRoOiAxMDAlOwp9CgoubWpyLW1lbnUtaXRlbSwKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLW1lbnUtaXRlbSB7CiAgICBhcHBlYXJhbmNlOiBub25lOwogICAgLXdlYmtpdC1hcHBlYXJhbmNlOiBub25lOwogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47CiAgICBnYXA6IDEwcHg7CiAgICB3aWR0aDogMTAwJTsKICAgIHBhZGRpbmc6IDhweCAxMHB4OwogICAgYm9yZGVyLXJhZGl1czogMTBweDsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHRyYW5zcGFyZW50OwogICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7CiAgICBjb2xvcjogdmFyKC0tY29udGVudC1mZywgI2RkZCk7CiAgICBmb250LWZhbWlseTogaW5oZXJpdDsKICAgIHRleHQtYWxpZ246IGxlZnQ7CiAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICB0cmFuc2l0aW9uOgogICAgICAgIGJhY2tncm91bmQtY29sb3IgMTIwbXMgZWFzZSwKICAgICAgICBib3JkZXItY29sb3IgMTIwbXMgZWFzZSwKICAgICAgICB0cmFuc2Zvcm0gODBtcyBlYXNlOwp9CgoubWpyLW1lbnUtaXRlbTpob3ZlciwKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLW1lbnUtaXRlbTpob3ZlciB7CiAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYm9yZGVyKSA4MCUsIHRyYW5zcGFyZW50KTsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0yKSA1NSUsIHRyYW5zcGFyZW50KTsKfQoKLm1qci1tZW51LWl0ZW06YWN0aXZlLAoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItbWVudS1pdGVtOmFjdGl2ZSB7CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoMXB4KTsKfQoKLm1qci1tZW51LWl0ZW0tbGFiZWwsCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1tZW51LWl0ZW0tbGFiZWwgewogICAgZmxleDogMSAxIGF1dG87CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7CiAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgbWluLXdpZHRoOiAwOwp9CgoubWpyLW1lbnUtaXRlbS1jaGVjaywKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLW1lbnUtaXRlbS1jaGVjayB7CiAgICBmb250LXNpemU6IDEycHg7CiAgICB3aWR0aDogMTZweDsKICAgIGZsZXg6IDAgMCAxNnB4OwogICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgb3BhY2l0eTogMDsKICAgIGNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWFjY2VudCkgNzIlLCB2YXIoLS1jb250ZW50LWZnKSk7CiAgICB0cmFuc2l0aW9uOgogICAgICAgIG9wYWNpdHkgMTIwbXMgZWFzZSwKICAgICAgICBjb2xvciAxMjBtcyBlYXNlOwp9CgoubWpyLW1lbnUtaXRlbSAucGksCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1tZW51LWl0ZW0gLnBpIHsKICAgIGZvbnQtc2l6ZTogMTNweDsKICAgIG9wYWNpdHk6IDAuOTsKfQoKLm1qci1jb2xsZWN0aW9ucy1tZW51IHsKICAgIGRpc3BsYXk6IGdyaWQ7CiAgICBnYXA6IDZweDsKfQoKLm1qci1tZW51LWl0ZW0tbGFiZWwtLWljb24gewogICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiA4cHg7CiAgICBmbGV4OiAxIDEgYXV0bzsKICAgIG1pbi13aWR0aDogMDsKfQoKLm1qci1tZW51LWl0ZW0tbGFiZWwtLWljb24gLnBpIHsKICAgIHdpZHRoOiAxNnB4OwogICAgZmxleDogMCAwIDE2cHg7CiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7Cn0KCi5tanItbWVudS1pdGVtLXJpZ2h0IHsKICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogMTBweDsKICAgIGZsZXg6IDAgMCBhdXRvOwogICAgbWluLXdpZHRoOiAxNnB4OwogICAgbWFyZ2luLWxlZnQ6IGF1dG87CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtZW5kOwp9CgoubWpyLW1lbnUtaXRlbS1oaW50IHsKICAgIGNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tY29udGVudC1mZykgNjIlLCB2YXIoLS1tanItbXV0ZWQpKTsKICAgIG9wYWNpdHk6IDAuNzI7CiAgICBmb250LXNpemU6IDExcHg7CiAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwp9CgoubWpyLW1lbnUtaXRlbS1jaGVjay0tdmlzaWJsZSwKLm1qci1tZW51LWl0ZW0uaXMtYWN0aXZlIC5tanItbWVudS1pdGVtLWNoZWNrIHsKICAgIG9wYWNpdHk6IDE7Cn0KCi5tanItbWVudS1kaXZpZGVyIHsKICAgIGhlaWdodDogMXB4OwogICAgbWFyZ2luOiA0cHggMDsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYm9yZGVyKSA4MCUsIHRyYW5zcGFyZW50KTsKfQoKLm1qci1tdXRlZCB7CiAgICBwYWRkaW5nOiAxMHB4IDEycHg7CiAgICBvcGFjaXR5OiAwLjc1Owp9CgoubWpyLXN0YXRlLWJsb2NrIHsKICAgIGZvbnQtc2l6ZTogMTBweDsKICAgIGxpbmUtaGVpZ2h0OiAxLjM1OwogICAgY29sb3I6IHZhcigtLW1qci1tdXRlZCk7CiAgICBib3JkZXI6IDFweCBkYXNoZWQgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1ib3JkZXIpIDg1JSwgdHJhbnNwYXJlbnQpOwogICAgYm9yZGVyLXJhZGl1czogdmFyKC0tbWpyLXItc20pOwogICAgcGFkZGluZzogOHB4IDEwcHg7CiAgICBtYXJnaW46IDRweCAwOwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTEpIDcwJSwgdHJhbnNwYXJlbnQpOwp9CgoubWpyLXN0YXRlLWJsb2NrLmlzLWVycm9yLAoubWpyLWNvbnRleHQtbWVudS1ub3RlLmlzLWVycm9yIHsKICAgIGNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN0YXR1cy1lcnJvcikgODIlLCB2YXIoLS1jb250ZW50LWZnKSk7CiAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3RhdHVzLWVycm9yKSA0NSUsIHZhcigtLW1qci1ib3JkZXIpKTsKfQoKLm1qci1jb2xsZWN0aW9uLXJvdyB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IHN0cmV0Y2g7CiAgICB3aWR0aDogMTAwJTsKICAgIG1pbi1oZWlnaHQ6IDQ4cHg7Cn0KCi5tanItY29sbGVjdGlvbnMtdmlydHVhbC1saXN0IHsKICAgIHdpZHRoOiAxMDAlOwogICAgb3ZlcmZsb3c6IGF1dG87CiAgICBzY3JvbGxiYXItd2lkdGg6IHRoaW47Cn0KCi5tanItZGVsZXRlLWJ0biB7CiAgICB3aWR0aDogNDJweDsKICAgIGZsZXg6IDAgMCA0MnB4OwogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICBwYWRkaW5nOiAwOwogICAgbWFyZ2luLWxlZnQ6IDZweDsKICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1ib3JkZXIpIDY1JSwgdmFyKC0tbWpyLXN0YXR1cy1lcnJvcikgNDUlKTsKfQoKLm1qci1kZWxldGUtYnRuOmhvdmVyOm5vdCg6ZGlzYWJsZWQpIHsKICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1ib3JkZXIpIDQwJSwgdmFyKC0tbWpyLXN0YXR1cy1lcnJvcikgNjUlKTsKfQoKLm1qci1kZWxldGUtYnRuIC5waSB7CiAgICBjb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdGF0dXMtZXJyb3IpIDc4JSwgdmFyKC0tY29udGVudC1mZykpOwp9CgoubWpyLXNlY3Rpb24tdGl0bGUgewogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBnYXA6IDZweDsKICAgIHBhZGRpbmc6IDZweCAxMHB4IDJweDsKICAgIGZvbnQtc2l6ZTogMTBweDsKICAgIGZvbnQtd2VpZ2h0OiA3MDA7CiAgICBsZXR0ZXItc3BhY2luZzogMC42cHg7CiAgICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOwogICAgb3BhY2l0eTogMC44ODsKICAgIGNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tY29udGVudC1mZykgNzIlLCB2YXIoLS1tanItbXV0ZWQpKTsKfQoKLm1qci1zZWN0aW9uLXRpdGxlLS1jeWFuIHsKICAgIGNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgIzZmZDRmZiA3OCUsIHZhcigtLWNvbnRlbnQtZmcpKTsKfQoKLm1qci1zZWN0aW9uLXRpdGxlLS12aW9sZXQgewogICAgY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCAjYzQ4ZGZmIDc4JSwgdmFyKC0tY29udGVudC1mZykpOwp9CgoubWpyLXNlY3Rpb24taGludCB7CiAgICBwYWRkaW5nOiAwIDEwcHggNHB4OwogICAgZm9udC1zaXplOiAxMHB4OwogICAgbGluZS1oZWlnaHQ6IDEuNDsKICAgIGNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tY29udGVudC1mZykgNTUlLCB2YXIoLS1tanItbXV0ZWQpKTsKfQoKLm1qci1tZW51LWl0ZW0tLXNtYXJ0LAoubWpyLW1lbnUtaXRlbS0tY2x1c3RlciB7CiAgICBib3JkZXItY29sb3I6IHRyYW5zcGFyZW50OwogICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7Cn0KCi5tanItbWVudS1pdGVtLS1jbHVzdGVyIHsKICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgY29sb3I6IHZhcigtLWNvbnRlbnQtZmcpOwp9CgoubWpyLW1lbnUtaXRlbS0tc21hcnQgLnBpIHsKICAgIGNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgIzZmZDRmZiA3NCUsIHZhcigtLWNvbnRlbnQtZmcpKTsKfQoKLm1qci1tZW51LWl0ZW0tLWNsdXN0ZXIgLnBpIHsKICAgIGNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgI2M0OGRmZiA3NCUsIHZhcigtLWNvbnRlbnQtZmcpKTsKfQoKLm1qci1tZW51LWl0ZW0tLXNtYXJ0OmhvdmVyOm5vdCg6ZGlzYWJsZWQpLAoubWpyLW1lbnUtaXRlbS0tY2x1c3Rlcjpob3Zlcjpub3QoOmRpc2FibGVkKSB7CiAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYm9yZGVyKSA4MCUsIHRyYW5zcGFyZW50KTsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0yKSA1NSUsIHRyYW5zcGFyZW50KTsKfQoKLm1qci1jbHVzdGVyLXJvdyB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogOHB4OwogICAgbWFyZ2luLWJvdHRvbTogNHB4OwogICAgcGFkZGluZzogNnB4IDhweDsKICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLW1qci1yLXNtKTsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLW1qci1ib3JkZXIpOwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTEpIDcwJSwgdHJhbnNwYXJlbnQpOwp9CgoubWpyLWNsdXN0ZXItdGh1bWJzIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBnYXA6IDNweDsKICAgIGZsZXgtc2hyaW5rOiAwOwp9CgoubWpyLWNsdXN0ZXItdGh1bWIgewogICAgd2lkdGg6IDI4cHg7CiAgICBoZWlnaHQ6IDI4cHg7CiAgICBib3JkZXItcmFkaXVzOiA0cHg7CiAgICBvYmplY3QtZml0OiBjb3ZlcjsKICAgIG9wYWNpdHk6IDAuODU7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMikgNjAlLCB0cmFuc3BhcmVudCk7Cn0KCi5tanItY2x1c3Rlci1pbmZvIHsKICAgIGZsZXg6IDE7CiAgICBtaW4td2lkdGg6IDA7Cn0KCi5tanItY2x1c3Rlci1uYW1lIHsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICBmb250LXNpemU6IDEycHg7CiAgICBmb250LXdlaWdodDogNjAwOwogICAgY29sb3I6IHZhcigtLWNvbnRlbnQtZmcpOwp9CgoubWpyLWNsdXN0ZXItY291bnQgewogICAgZm9udC1zaXplOiAxMHB4OwogICAgY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1jb250ZW50LWZnKSA1OCUsIHZhcigtLW1qci1tdXRlZCkpOwp9CgoubWpyLWNsdXN0ZXItY3JlYXRlLWJ0biB7CiAgICBmbGV4LXNocmluazogMDsKICAgIHBhZGRpbmc6IDNweCA4cHg7CiAgICBib3JkZXItcmFkaXVzOiA2cHg7CiAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1tanItYm9yZGVyKTsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0yKSA1NSUsIHRyYW5zcGFyZW50KTsKICAgIGNvbG9yOiB2YXIoLS1jb250ZW50LWZnKTsKICAgIGZvbnQtc2l6ZTogMTFweDsKICAgIGZvbnQtd2VpZ2h0OiA3MDA7CiAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICB0cmFuc2l0aW9uOgogICAgICAgIGJvcmRlci1jb2xvciAxMjBtcyBlYXNlLAogICAgICAgIGJhY2tncm91bmQgMTIwbXMgZWFzZSwKICAgICAgICBvcGFjaXR5IDEyMG1zIGVhc2U7Cn0KCi5tanItY2x1c3Rlci1jcmVhdGUtYnRuOmRpc2FibGVkIHsKICAgIG9wYWNpdHk6IDAuNjI7CiAgICBjdXJzb3I6IGRlZmF1bHQ7Cn0KCi5tanItY2x1c3Rlci1jcmVhdGUtYnRuOmhvdmVyOm5vdCg6ZGlzYWJsZWQpIHsKICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1ib3JkZXIpIDgwJSwgdHJhbnNwYXJlbnQpOwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTIpIDYyJSwgdHJhbnNwYXJlbnQpOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYW0tc2VhcmNoLWljb24gewogICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICBjb2xvcjogdmFyKC0tbWpyLW11dGVkKTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFtLXNlYXJjaC1pY29uIC5waSB7CiAgICBmb250LXNpemU6IDEycHg7CiAgICBsaW5lLWhlaWdodDogMTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFtLXNlYXJjaC1waWxsIC5tanItaW5wdXQgewogICAgcGFkZGluZzogMCAhaW1wb3J0YW50OwogICAgYm9yZGVyOiBub25lICFpbXBvcnRhbnQ7CiAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudCAhaW1wb3J0YW50OwogICAgYm94LXNoYWRvdzogbm9uZSAhaW1wb3J0YW50OwogICAgZm9udC1zaXplOiAxMnB4ICFpbXBvcnRhbnQ7CiAgICBsaW5lLWhlaWdodDogMS4yICFpbXBvcnRhbnQ7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hbS1zZWFyY2gtcGlsbDpmb2N1cy13aXRoaW4gewogICAgYm9yZGVyLWNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWFjY2VudCkgNjUlLCB2YXIoLS1tanItYm9yZGVyKSk7CiAgICBib3gtc2hhZG93OiAwIDAgMCAycHggY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQpIDE4JSwgdHJhbnNwYXJlbnQpOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYW0tYnJvd3NlIHsKICAgIG1hcmdpbi10b3A6IDA7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hbS1ncmlkLXNjcm9sbCB7CiAgICBwYWRkaW5nLXJpZ2h0OiA0cHg7CiAgICBzY3JvbGxiYXItZ3V0dGVyOiBzdGFibGU7Cn0KCi8qIEdyaWQgbGF5b3V0ICovCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1ncmlkIHsKICAgIGRpc3BsYXk6IGdyaWQ7CiAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAvKiBBdm9pZCBvdmVyZmxvdyB3aGVuIHRoZSBwYW5lbCBiZWNvbWVzIG5hcnJvd2VyIHRoYW4gdGhlIG1pbiBjYXJkIHNpemUgKi8KICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogcmVwZWF0KAogICAgICAgIGF1dG8tZmlsbCwKICAgICAgICBtaW5tYXgobWluKDEwMCUsIHZhcigtLW1qci1ncmlkLW1pbi1zaXplLCAxODBweCkpLCAxZnIpCiAgICApOwogICAgZ2FwOiB2YXIoLS1tanItZ3JpZC1nYXAsIDEwcHgpOwogICAgbWFyZ2luLXRvcDogNnB4OwogICAgbWluLWhlaWdodDogMDsKfQoKLyogQ2FyZCBzZWxlY3Rpb24gKyBmb2N1cyAoa2VlcHMgYSB2aXNpYmxlIGluZGljYXRvciB3aGVuIHNpZGViYXIgaXMgb3BlbikgKi8KLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFzc2V0LWNhcmQgewogICAgb3V0bGluZTogbm9uZTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFzc2V0LWNhcmQuaXMtc2VsZWN0ZWQgewogICAgYm94LXNoYWRvdzoKICAgICAgICAwIDAgMCAzcHggY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1jYXJkLXNlbGVjdGlvbi1jb2xvcikgODAlLCB2YXIoLS1jb250ZW50LWZnKSksCiAgICAgICAgMCAwIDAgNnB4IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItY2FyZC1zZWxlY3Rpb24tY29sb3IpIDMwJSwgdHJhbnNwYXJlbnQpLAogICAgICAgIDAgMCAyMHB4IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItY2FyZC1zZWxlY3Rpb24tY29sb3IpIDQwJSwgdHJhbnNwYXJlbnQpLAogICAgICAgIDAgMTBweCAyOHB4IHJnYmEoMCwgMCwgMCwgMC4yOCk7CiAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1tanItci1sZyk7CiAgICAvKiBzY2FsZSgwLjk3KSBpbnN0ZWFkIG9mIDAuOTI6IHN1YnRsZSBpbnNldCBmZWVsIHdpdGhvdXQgdGhlIGFnZ3Jlc3NpdmUKICAgICAgIHNocmluayB0aGF0IGNhdXNlZCBhIHZpc2libGUgYmxpbmsgb24gcmFwaWQgc2VsZWN0aW9uIGNoYW5nZXMuICovCiAgICB0cmFuc2Zvcm06IHNjYWxlKDAuOTcpICFpbXBvcnRhbnQ7CiAgICB6LWluZGV4OiAxMDsKICAgIG91dGxpbmU6IDJweCBzb2xpZCB2YXIoLS1tanItY2FyZC1zZWxlY3Rpb24tY29sb3IpOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYXNzZXQtY2FyZDpmb2N1cy12aXNpYmxlIHsKICAgIGJveC1zaGFkb3c6CiAgICAgICAgMCAwIDAgM3B4IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYWNjZW50KSA4MCUsIHZhcigtLWNvbnRlbnQtZmcpKSwKICAgICAgICAwIDAgMCA2cHggY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQpIDMwJSwgdHJhbnNwYXJlbnQpLAogICAgICAgIDAgMCAyMHB4IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYWNjZW50KSA0MCUsIHRyYW5zcGFyZW50KSwKICAgICAgICAwIDEwcHggMjhweCByZ2JhKDAsIDAsIDAsIDAuMjgpOwogICAgYm9yZGVyLXJhZGl1czogdmFyKC0tbWpyLXItbGcpOwogICAgdHJhbnNmb3JtOiBzY2FsZSgwLjk3KSAhaW1wb3J0YW50OwogICAgei1pbmRleDogMTA7Cn0KCkBrZXlmcmFtZXMgbWpyLWxpdmUtcGxhY2Vob2xkZXItc2hlZW4gewogICAgMCUgewogICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgtNTglKTsKICAgICAgICBvcGFjaXR5OiAwLjE4OwogICAgfQogICAgNTAlIHsKICAgICAgICBvcGFjaXR5OiAwLjM0OwogICAgfQogICAgMTAwJSB7CiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKDU4JSk7CiAgICAgICAgb3BhY2l0eTogMC4xODsKICAgIH0KfQoKQGtleWZyYW1lcyBtanItbGl2ZS1wbGFjZWhvbGRlci1wdWxzZSB7CiAgICAwJSwKICAgIDEwMCUgewogICAgICAgIGJveC1zaGFkb3c6CiAgICAgICAgICAgIDAgMCAwIDFweCByZ2JhKDExOCwgMjE0LCAyNTUsIDAuMzQpLAogICAgICAgICAgICAwIDEwcHggMjRweCByZ2JhKDAsIDAsIDAsIDAuMjQpOwogICAgfQogICAgNTAlIHsKICAgICAgICBib3gtc2hhZG93OgogICAgICAgICAgICAwIDAgMCAxcHggcmdiYSgxMTgsIDIxNCwgMjU1LCAwLjUyKSwKICAgICAgICAgICAgMCAwIDAgNHB4IHJnYmEoMTE4LCAyMTQsIDI1NSwgMC4xMiksCiAgICAgICAgICAgIDAgMTJweCAzMHB4IHJnYmEoMCwgMCwgMCwgMC4yOCk7CiAgICB9Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hc3NldC1jYXJkW2RhdGEtbWpyLWxpdmUtcGxhY2Vob2xkZXI9InRydWUiXSB7CiAgICBhbmltYXRpb246IG1qci1saXZlLXBsYWNlaG9sZGVyLXB1bHNlIDEuOXMgZWFzZS1pbi1vdXQgaW5maW5pdGU7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hc3NldC1jYXJkW2RhdGEtbWpyLWxpdmUtcGxhY2Vob2xkZXI9InRydWUiXSAubWpyLXRodW1iIHsKICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgIG92ZXJmbG93OiBoaWRkZW47Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1saXZlLXBsYWNlaG9sZGVyLXdhc2ggewogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgaW5zZXQ6IC04JTsKICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgei1pbmRleDogMTsKICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgKICAgICAgICAxMTVkZWcsCiAgICAgICAgcmdiYSg5OCwgMTk5LCAyNTUsIDApIDAlLAogICAgICAgIHJnYmEoOTgsIDE5OSwgMjU1LCAwLjA4KSAzMCUsCiAgICAgICAgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjI0KSA1MCUsCiAgICAgICAgcmdiYSg5OCwgMTk5LCAyNTUsIDAuMTIpIDcwJSwKICAgICAgICByZ2JhKDk4LCAxOTksIDI1NSwgMCkgMTAwJQogICAgKTsKICAgIGFuaW1hdGlvbjogbWpyLWxpdmUtcGxhY2Vob2xkZXItc2hlZW4gMi4ycyBsaW5lYXIgaW5maW5pdGU7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1saXZlLXBpbGwgewogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgdG9wOiA2cHg7CiAgICByaWdodDogNnB4OwogICAgei1pbmRleDogMTI7CiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBnYXA6IDZweDsKICAgIG1pbi1oZWlnaHQ6IDI0cHg7CiAgICBwYWRkaW5nOiAwIDhweDsKICAgIGJvcmRlci1yYWRpdXM6IDk5OXB4OwogICAgYmFja2dyb3VuZDogcmdiYSgxMCwgMTQsIDIwLCAwLjc4KTsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMTE4LCAyMTQsIDI1NSwgMC4zNCk7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjk2KTsKICAgIGZvbnQtc2l6ZTogMTBweDsKICAgIGZvbnQtd2VpZ2h0OiA3MDA7CiAgICBsZXR0ZXItc3BhY2luZzogMC4wMWVtOwogICAgYm94LXNoYWRvdzogMCAycHggOHB4IHJnYmEoMCwgMCwgMCwgMC4yNCk7CiAgICBiYWNrZHJvcC1maWx0ZXI6IGJsdXIoNnB4KTsKICAgIC13ZWJraXQtYmFja2Ryb3AtZmlsdGVyOiBibHVyKDZweCk7CiAgICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItbGl2ZS1waWxsLWRvdCB7CiAgICB3aWR0aDogN3B4OwogICAgaGVpZ2h0OiA3cHg7CiAgICBib3JkZXItcmFkaXVzOiA5OTlweDsKICAgIGJhY2tncm91bmQ6ICM3NmQ2ZmY7CiAgICBib3gtc2hhZG93OiAwIDAgMCA0cHggcmdiYSgxMTgsIDIxNCwgMjU1LCAwLjE2KTsKICAgIGZsZXg6IDAgMCBhdXRvOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYXNzZXQtY2FyZFtkYXRhLW1qci1saXZlLXBsYWNlaG9sZGVyPSJ0cnVlIl0gLm1qci1hc3NldC1zdGF0dXMtZG90IHsKICAgIGFuaW1hdGlvbjogbWpyLWxpdmUtcGxhY2Vob2xkZXItcHVsc2UgMS45cyBlYXNlLWluLW91dCBpbmZpbml0ZTsKfQoKLyogR3JpZCBsb2FkaW5nIG92ZXJsYXkgKi8KLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWdyaWQtbG9hZGluZy1vdmVybGF5IHsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIGluc2V0OiAwOwogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCAjMDAwIDM1JSwgdHJhbnNwYXJlbnQpOwogICAgY29sb3I6IHZhcigtLWNvbnRlbnQtZmcsICNmZmYpOwogICAgZm9udC1zaXplOiAxM3B4OwogICAgbGV0dGVyLXNwYWNpbmc6IDAuM3B4OwogICAgYm9yZGVyLXJhZGl1czogdmFyKC0tbWpyLXItbGcpOwogICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICBiYWNrZHJvcC1maWx0ZXI6IGJsdXIoMnB4KTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWdyaWQtc2tlbGV0b24tbGF5b3V0IHsKICAgIGRpc3BsYXk6IGdyaWQ7CiAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IHJlcGVhdChhdXRvLWZpbGwsIG1pbm1heCgxMzJweCwgMWZyKSk7CiAgICBnYXA6IDEycHg7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1ncmlkLXNrZWxldG9uLWNhcmQgewogICAgYm9yZGVyLXJhZGl1czogMTJweDsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4yMik7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDE5MiwgMTk4LCAyMDYsIDAuMik7CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgLyogbWluLWhlaWdodCByZW1vdmVkOiBWdWUgc2tlbGV0b25DYXJkU3R5bGUgc2V0cyBhbiBleHBsaWNpdCBoZWlnaHQgZGVyaXZlZAogICAgICAgZnJvbSBlc3RpbWF0ZVJvd0hlaWdodC4gQSBjb25mbGljdGluZyBtaW4taGVpZ2h0IGNhdXNlZCBza2VsZXRvbiBjYXJkcyB0bwogICAgICAgYmUgdGFsbGVyIHRoYW4gdGhlIGFjdHVhbCBjYXJkcyB0aGV5IHJlcGxhY2UsIGNhdXNpbmcgYSBsYXlvdXQganVtcCB3aGVuCiAgICAgICBhc3NldHMgZmlyc3QgbG9hZC4gKi8KICAgIGJveC1zaGFkb3c6IDAgNnB4IDE4cHggcmdiYSgwLCAwLCAwLCAwLjI0KTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWdyaWQtc2tlbGV0b24tdGh1bWIgewogICAgYXNwZWN0LXJhdGlvOiAxIC8gMTsKICAgIHdpZHRoOiAxMDAlOwogICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KAogICAgICAgIDkwZGVnLAogICAgICAgIHJnYmEoMTU2LCAxNjIsIDE3MSwgMC41MikgMCUsCiAgICAgICAgcmdiYSgyMjAsIDIyNSwgMjMyLCAwLjcyKSA0NSUsCiAgICAgICAgcmdiYSgxNTYsIDE2MiwgMTcxLCAwLjUyKSAxMDAlCiAgICApOwogICAgYmFja2dyb3VuZC1zaXplOiAyNDAlIDEwMCU7CiAgICBhbmltYXRpb246IG1qci1ncmlkLXNrZWxldG9uLXNoaW1tZXIgMS4ycyBsaW5lYXIgaW5maW5pdGU7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1ncmlkLXNrZWxldG9uLWxpbmUgewogICAgaGVpZ2h0OiAxMHB4OwogICAgbWFyZ2luOiA4cHggMTBweDsKICAgIGJvcmRlci1yYWRpdXM6IDhweDsKICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgKICAgICAgICA5MGRlZywKICAgICAgICByZ2JhKDE2NCwgMTcwLCAxNzksIDAuNDgpIDAlLAogICAgICAgIHJnYmEoMjE0LCAyMTksIDIyNiwgMC43KSA0NSUsCiAgICAgICAgcmdiYSgxNjQsIDE3MCwgMTc5LCAwLjQ4KSAxMDAlCiAgICApOwogICAgYmFja2dyb3VuZC1zaXplOiAyNDAlIDEwMCU7CiAgICBhbmltYXRpb246IG1qci1ncmlkLXNrZWxldG9uLXNoaW1tZXIgMS4ycyBsaW5lYXIgaW5maW5pdGU7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1ncmlkLXNrZWxldG9uLWxpbmUtLXRpdGxlIHsKICAgIHdpZHRoOiA3MiU7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1ncmlkLXNrZWxldG9uLWxpbmUtLW1ldGEgewogICAgd2lkdGg6IDQ4JTsKICAgIG1hcmdpbi10b3A6IDJweDsKICAgIG1hcmdpbi1ib3R0b206IDEwcHg7Cn0KCkBrZXlmcmFtZXMgbWpyLXNrZWxldG9uLXNoaW1tZXIgewogICAgMCUgewogICAgICAgIGJhY2tncm91bmQtcG9zaXRpb246IDEyMCUgMDsKICAgIH0KICAgIDEwMCUgewogICAgICAgIGJhY2tncm91bmQtcG9zaXRpb246IC0xMjAlIDA7CiAgICB9Cn0KCkBrZXlmcmFtZXMgbWpyLWdyaWQtc2tlbGV0b24tc2hpbW1lciB7CiAgICAwJSB7CiAgICAgICAgYmFja2dyb3VuZC1wb3NpdGlvbjogMTAwJSAwOwogICAgfQogICAgMTAwJSB7CiAgICAgICAgYmFja2dyb3VuZC1wb3NpdGlvbjogLTEwMCUgMDsKICAgIH0KfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWdyaWQtc2tlbGV0b24tc2hpbW1lciB7CiAgICB3aWxsLWNoYW5nZTogYmFja2dyb3VuZC1wb3NpdGlvbjsKfQoKLyogR2VuZXJpYyBoZWFkaW5ncyBpbnNpZGUgcGFuZWwgKi8KLm1qci1hc3NldHMtbWFuYWdlciBoMywKLm1qci1hc3NldHMtbWFuYWdlciBoNCB7CiAgICBmb250LWZhbWlseTogaW5oZXJpdDsKICAgIGxldHRlci1zcGFjaW5nOiAwLjAxZW07Cn0KCi8qIFBhbmVscyAqLwoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItcGFuZWwgewogICAgYmFja2dyb3VuZDogdmFyKC0tbWpyLXN1cmZhY2UtMSk7CiAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1tanItYm9yZGVyKTsKICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLW1qci1yLWxnKTsKICAgIGJveC1zaGFkb3c6IHZhcigtLWludGVyZmFjZS1wYW5lbC1ib3gtc2hhZG93LCAwIDhweCAyNHB4IHJnYmEoMCwgMCwgMCwgMC4yNSkpOwp9CgovKiBUb29sYmFyICovCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci10b29sYmFyIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiAxMHB4OwogICAgcGFkZGluZzogdmFyKC0tbWpyLXBhZC1tZCk7Cn0KCi8qIEJ1dHRvbnMgKi8KLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWJ0biB7CiAgICBhcHBlYXJhbmNlOiBub25lOwogICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tbWpyLWJvcmRlcik7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1tanItc3VyZmFjZS0yKTsKICAgIGNvbG9yOiB2YXIoLS1jb250ZW50LWZnLCAjZGRkKTsKICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLW1qci1yLW1kKTsKICAgIHBhZGRpbmc6IDdweCAxMHB4OwogICAgZm9udC1zaXplOiAxMnB4OwogICAgbGluZS1oZWlnaHQ6IDE7CiAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICB1c2VyLXNlbGVjdDogbm9uZTsKICAgIHRyYW5zaXRpb246CiAgICAgICAgYmFja2dyb3VuZCAxMjBtcyBlYXNlLAogICAgICAgIGJvcmRlci1jb2xvciAxMjBtcyBlYXNlLAogICAgICAgIHRyYW5zZm9ybSA4MG1zIGVhc2U7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1idG46aG92ZXIgewogICAgYm9yZGVyLWNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWFjY2VudCkgNTUlLCB2YXIoLS1tanItYm9yZGVyKSk7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMikgNzAlLCB2YXIoLS1tanItYWNjZW50KSAxMCUpOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYnRuOmFjdGl2ZSB7CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoMXB4KTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWJ0bjpkaXNhYmxlZCB7CiAgICBvcGFjaXR5OiAwLjU1OwogICAgY3Vyc29yOiBub3QtYWxsb3dlZDsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWJ0bi5tanItcHJpbWFyeSB7CiAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYWNjZW50KSA2MCUsIHZhcigtLW1qci1ib3JkZXIpKTsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYWNjZW50KSAxNCUsIHZhcigtLW1qci1zdXJmYWNlLTIpKTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWJ0biB7CiAgICAvKiBPdmVycmlkZSBpbmxpbmUgc3R5bGVzIGlmIHByZXNlbnQgKi8KICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLW1qci1ib3JkZXIpOwogICAgYmFja2dyb3VuZDogdmFyKC0tbWpyLXN1cmZhY2UtMik7CiAgICBjb2xvcjogdmFyKC0tY29udGVudC1mZywgI2RkZCk7CiAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1tanItci1tZCk7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1idG46aG92ZXIgewogICAgYm9yZGVyLWNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWFjY2VudCkgNTUlLCB2YXIoLS1tanItYm9yZGVyKSk7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMikgNzAlLCB2YXIoLS1tanItYWNjZW50KSAxMCUpOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYnRuLm1qci1zdGF0dXMtc2NhbiB7CiAgICBtYXJnaW4tbGVmdDogYXV0bzsKICAgIHBhZGRpbmc6IDRweCAxMHB4OwogICAgY29sb3I6IHZhcigtLW1qci1zdGF0dXMtY29sb3IsIHZhcigtLWNvbnRlbnQtZmcsICNkZGQpKTsKICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdGF0dXMtY29sb3IpIDYwJSwgdmFyKC0tbWpyLWJvcmRlcikpOwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdGF0dXMtY29sb3IpIDE0JSwgdmFyKC0tbWpyLXN1cmZhY2UtMikpOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYnRuLm1qci1zdGF0dXMtc2Nhbjpob3ZlciB7CiAgICBib3JkZXItY29sb3I6IHZhcigtLW1qci1zdGF0dXMtY29sb3IpOwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdGF0dXMtY29sb3IpIDI0JSwgdmFyKC0tbWpyLXN1cmZhY2UtMikpOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYnRuLm1qci1zdGF0dXMtc2Nhbjpmb2N1cy12aXNpYmxlIHsKICAgIG91dGxpbmU6IDJweCBzb2xpZCB2YXIoLS1tanItc3RhdHVzLWNvbG9yKTsKICAgIG91dGxpbmUtb2Zmc2V0OiAycHg7Cn0KCi8qIElucHV0cyAvIHNlbGVjdHMgKHVzZWQgaW5zaWRlIHBvcnRhbGVkIHBvcG92ZXJzIHRvbykgKi8KLm1qci1pbnB1dCwKLm1qci1zZWxlY3QsCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1pbnB1dCwKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLXNlbGVjdCB7CiAgICBhcHBlYXJhbmNlOiBub25lOwogICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tbWpyLWJvcmRlcik7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1jb21meS1pbnB1dC1iZywgcmdiYSgwLCAwLCAwLCAwLjI1KSk7CiAgICBjb2xvcjogdmFyKC0taW5wdXQtdGV4dCwgI2RkZCk7CiAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1tanItci1tZCk7CiAgICBwYWRkaW5nOiA4cHggMTBweDsKICAgIGZvbnQtc2l6ZTogMTNweDsKICAgIG91dGxpbmU6IG5vbmU7CiAgICB3aWR0aDogMTAwJTsKICAgIG1pbi13aWR0aDogMDsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWlucHV0OjpwbGFjZWhvbGRlciB7CiAgICBjb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1tdXRlZCkgODAlLCB0cmFuc3BhcmVudCk7Cn0KCi5tanItaW5wdXQ6Zm9jdXMsCi5tanItc2VsZWN0OmZvY3VzLAoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItaW5wdXQ6Zm9jdXMsCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1zZWxlY3Q6Zm9jdXMgewogICAgYm9yZGVyLWNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWFjY2VudCkgNjUlLCB2YXIoLS1tanItYm9yZGVyKSk7CiAgICBib3gtc2hhZG93OiAwIDAgMCAycHggY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQpIDIwJSwgdHJhbnNwYXJlbnQpOwp9CgoubWpyLWlucHV0LAoubWpyLXNlbGVjdCwKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWlucHV0LAoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItc2VsZWN0IHsKICAgIC8qIE92ZXJyaWRlIGlubGluZSBzdHlsZXMgaWYgcHJlc2VudCAqLwogICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tbWpyLWJvcmRlcik7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1jb21meS1pbnB1dC1iZywgcmdiYSgwLCAwLCAwLCAwLjI1KSk7CiAgICBjb2xvcjogdmFyKC0taW5wdXQtdGV4dCwgI2RkZCk7CiAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1tanItci1tZCk7CiAgICBwYWRkaW5nOiA4cHggMTBweDsKfQoKLm1qci1maWx0ZXItcG9wb3ZlciAubWpyLWZpbHRlci1zZWxlY3QgewogICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOwogICAgZ2FwOiA4cHg7CiAgICBtaW4taGVpZ2h0OiAzNHB4OwogICAgcGFkZGluZzogMCA5cHg7CiAgICBsaW5lLWhlaWdodDogMS4yOwp9CgoubWpyLWZpbHRlci1wb3BvdmVyIC5tanItZmlsdGVyLXNlbGVjdFtkYXRhLXAtZGlzYWJsZWQ9InRydWUiXSB7CiAgICBvcGFjaXR5OiAwLjU1OwogICAgY3Vyc29yOiBkZWZhdWx0Owp9CgoubWpyLWZpbHRlci1wb3BvdmVyIC5tanItZmlsdGVyLXNlbGVjdCBbZGF0YS1wYy1zZWN0aW9uPSJsYWJlbCJdIHsKICAgIGZsZXg6IDEgMSBhdXRvOwogICAgbWluLXdpZHRoOiAwOwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKfQoKLm1qci1maWx0ZXItcG9wb3ZlciAubWpyLWZpbHRlci1zZWxlY3QgW2RhdGEtcGMtc2VjdGlvbj0iZHJvcGRvd24iXSB7CiAgICBmbGV4OiAwIDAgYXV0bzsKICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgd2lkdGg6IDE4cHg7CiAgICBjb2xvcjogdmFyKC0tbWpyLW11dGVkLCB2YXIoLS1kZXNjcmlwLXRleHQsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC42NSkpKTsKfQoKLm1qci1maWx0ZXItc2VsZWN0LXBhbmVsIHsKICAgIG1pbi13aWR0aDogdmFyKC0tcC1zZWxlY3Qtb3ZlcmxheS13aWR0aCwgMTJyZW0pOwogICAgbWF4LXdpZHRoOiBtaW4oMzIwcHgsIGNhbGMoMTAwdncgLSAzMnB4KSk7CiAgICBtYXgtaGVpZ2h0OiBtaW4oMzIwcHgsIGNhbGMoMTAwdmggLSAzMnB4KSk7CiAgICBvdmVyZmxvdzogYXV0bzsKICAgIHBhZGRpbmc6IDRweDsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLW1qci1ib3JkZXIpOwogICAgYm9yZGVyLXJhZGl1czogdmFyKC0tbWpyLXItbWQpOwogICAgYmFja2dyb3VuZDogdmFyKC0tbWpyLXN1cmZhY2UtMSwgdmFyKC0tY29tZnktbWVudS1iZywgIzJhMmEyYSkpOwogICAgY29sb3I6IHZhcigtLWNvbnRlbnQtZmcsIHZhcigtLWlucHV0LXRleHQsICNkZGQpKTsKICAgIGJveC1zaGFkb3c6IDAgMTJweCAyOHB4IHJnYmEoMCwgMCwgMCwgMC4zOCk7CiAgICB6LWluZGV4OiBjYWxjKHZhcigtLW1qci1wb3BvdmVyLXotaW5kZXgsIDIxNDc0ODM2NDcpICsgMSk7Cn0KCi5tanItZmlsdGVyLXNlbGVjdC1wYW5lbCBbZGF0YS1wYy1zZWN0aW9uPSJsaXN0Il0gewogICAgZGlzcGxheTogZmxleDsKICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICBnYXA6IDJweDsKICAgIHBhZGRpbmc6IDA7CiAgICBtYXJnaW46IDA7CiAgICBsaXN0LXN0eWxlOiBub25lOwp9CgoubWpyLWZpbHRlci1zZWxlY3QtcGFuZWwgW2RhdGEtcGMtc2VjdGlvbj0ib3B0aW9uIl0gewogICAgbWluLWhlaWdodDogMjhweDsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgcGFkZGluZzogNnB4IDhweDsKICAgIGJvcmRlci1yYWRpdXM6IGNhbGModmFyKC0tbWpyLXItbWQpIC0gMnB4KTsKICAgIGZvbnQtc2l6ZTogMTJweDsKICAgIGxpbmUtaGVpZ2h0OiAxLjI1OwogICAgY3Vyc29yOiBwb2ludGVyOwogICAgY29sb3I6IHZhcigtLWNvbnRlbnQtZmcsIHZhcigtLWlucHV0LXRleHQsICNkZGQpKTsKfQoKLm1qci1maWx0ZXItc2VsZWN0LXBhbmVsIFtkYXRhLXBjLXNlY3Rpb249Im9wdGlvbiJdOmhvdmVyLAoubWpyLWZpbHRlci1zZWxlY3QtcGFuZWwgW2RhdGEtcC1oaWdobGlnaHQ9InRydWUiXSB7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWFjY2VudCkgMTglLCB0cmFuc3BhcmVudCk7CiAgICBjb2xvcjogdmFyKC0tY29udGVudC1mZywgI2ZmZik7Cn0KCi8qIFRhYnM6IG92ZXJyaWRkZW4gYWJvdmUgd2l0aCBxdWV1ZS1saWtlIHN0eWxlICovCgovKiBSZW1vdmVkIHJlZHVuZGFudCB0YWIgZGVjbGFyYXRpb25zIHRoYXQgd2VyZSB1c2luZyAhaW1wb3J0YW50ICovCgovKiBNdXRlZCB0ZXh0IGhlbHBlciAqLwoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItbXV0ZWQgewogICAgY29sb3I6IHZhcigtLW1qci1tdXRlZCk7Cn0KCi8qIEdyaWQgKyBjYXJkcyAob3ZlcnJpZGUgaW5saW5lIHN0eWxlcyBmcm9tIENhcmQuanMpICovCi5tanItYXNzZXRzLW1hbmFnZXIgI21qci1hc3NldHMtZ3JpZCB7CiAgICBnYXA6IDEwcHggIWltcG9ydGFudDsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFzc2V0LWNhcmQsCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1jYXJkIHsKICAgIGJhY2tncm91bmQ6IHZhcigtLW1qci1zdXJmYWNlLTEpICFpbXBvcnRhbnQ7CiAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1tanItYm9yZGVyKSAhaW1wb3J0YW50OwogICAgYm9yZGVyLXJhZGl1czogdmFyKC0tbWpyLXItbGcpICFpbXBvcnRhbnQ7CiAgICBvdmVyZmxvdzogaGlkZGVuICFpbXBvcnRhbnQ7CiAgICBtaW4td2lkdGg6IDA7CiAgICB0cmFuc2l0aW9uOgogICAgICAgIHRyYW5zZm9ybSAxMjBtcyBlYXNlLAogICAgICAgIGJvcmRlci1jb2xvciAxMjBtcyBlYXNlLAogICAgICAgIGJveC1zaGFkb3cgMTIwbXMgZWFzZSAhaW1wb3J0YW50Owp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYXNzZXQtY2FyZDpob3ZlciwKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWNhcmQ6aG92ZXIgewogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC0xcHgpICFpbXBvcnRhbnQ7CiAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peCgKICAgICAgICBpbiBzcmdiLAogICAgICAgIHZhcigtLW1qci1jYXJkLXNlbGVjdGlvbi1jb2xvcikgNTUlLAogICAgICAgIHZhcigtLW1qci1ib3JkZXIpCiAgICApICFpbXBvcnRhbnQ7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1tanItY2FyZC1ob3Zlci1jb2xvcikgIWltcG9ydGFudDsKICAgIGJveC1zaGFkb3c6IDAgOHB4IDIycHggcmdiYSgwLCAwLCAwLCAwLjI1KSAhaW1wb3J0YW50Owp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYXNzZXQtY2FyZCBpbWcsCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hc3NldC1jYXJkIHZpZGVvLAoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItdGh1bWItbWVkaWEgewogICAgZGlzcGxheTogYmxvY2s7CiAgICB3aWR0aDogMTAwJSAhaW1wb3J0YW50OwogICAgaGVpZ2h0OiAxMDAlICFpbXBvcnRhbnQ7CiAgICBvYmplY3QtZml0OiBjb3ZlciAhaW1wb3J0YW50Owp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItdGh1bWIgewogICAgZmxleDogMCAwIGF1dG87CiAgICB3aWR0aDogMTAwJTsKICAgIGFzcGVjdC1yYXRpbzogMSAvIDE7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMCkgODAlLCB0cmFuc3BhcmVudCk7CiAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICBvdmVyZmxvdzogaGlkZGVuOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYXVkaW8tdGh1bWIsCi5tanItYm90dG9tLWZlZWQgLm1qci1hdWRpby10aHVtYiB7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICBpbnNldDogMDsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOwogICAgZ2FwOiAxMHB4OwogICAgcGFkZGluZzogMTRweCAxMnB4IDEycHg7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjk0KTsKICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgYmFja2dyb3VuZDoKICAgICAgICByYWRpYWwtZ3JhZGllbnQoY2lyY2xlIGF0IDE4JSAyMCUsIHJnYmEoNzgsIDE4NCwgMjU1LCAwLjMyKSwgdHJhbnNwYXJlbnQgMzglKSwKICAgICAgICByYWRpYWwtZ3JhZGllbnQoY2lyY2xlIGF0IDg4JSA3MiUsIHJnYmEoODIsIDIyMCwgMTU2LCAwLjI0KSwgdHJhbnNwYXJlbnQgNDIlKSwKICAgICAgICBsaW5lYXItZ3JhZGllbnQoMTM1ZGVnLCByZ2JhKDE4LCAyNiwgMzYsIDAuOTgpLCByZ2JhKDgsIDEyLCAxOCwgMC45OCkpOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYXVkaW8tdGh1bWIuaGFzLXBvc3RlciwKLm1qci1ib3R0b20tZmVlZCAubWpyLWF1ZGlvLXRodW1iLmhhcy1wb3N0ZXIgewogICAgYmFja2dyb3VuZDoKICAgICAgICBsaW5lYXItZ3JhZGllbnQoMTgwZGVnLCByZ2JhKDQsIDYsIDEwLCAwLjI4KSwgcmdiYSg0LCA2LCAxMCwgMC44NikpLAogICAgICAgIHJhZGlhbC1ncmFkaWVudChjaXJjbGUgYXQgNTAlIDQyJSwgcmdiYSg3OCwgMTg0LCAyNTUsIDAuMiksIHRyYW5zcGFyZW50IDU0JSk7CiAgICBiYWNrZHJvcC1maWx0ZXI6IHNhdHVyYXRlKDEuMSk7CiAgICAtd2Via2l0LWJhY2tkcm9wLWZpbHRlcjogc2F0dXJhdGUoMS4xKTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWF1ZGlvLXRodW1iLWhlYWQsCi5tanItYm90dG9tLWZlZWQgLm1qci1hdWRpby10aHVtYi1oZWFkIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOwogICAgZ2FwOiA4cHg7CiAgICBtaW4td2lkdGg6IDA7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hdWRpby10aHVtYi1pY29uLAoubWpyLWJvdHRvbS1mZWVkIC5tanItYXVkaW8tdGh1bWItaWNvbiB7CiAgICB3aWR0aDogMjhweDsKICAgIGhlaWdodDogMjhweDsKICAgIGJvcmRlci1yYWRpdXM6IDk5OXB4OwogICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTIpOwogICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE4KTsKICAgIGJveC1zaGFkb3c6IDAgOHB4IDE4cHggcmdiYSgwLCAwLCAwLCAwLjIyKTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWF1ZGlvLXRodW1iLWtpbmQsCi5tanItYm90dG9tLWZlZWQgLm1qci1hdWRpby10aHVtYi1raW5kIHsKICAgIG1heC13aWR0aDogNjJweDsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICBwYWRkaW5nOiAzcHggN3B4OwogICAgYm9yZGVyLXJhZGl1czogOTk5cHg7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIDAuMjgpOwogICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEzKTsKICAgIGZvbnQtc2l6ZTogMTBweDsKICAgIGZvbnQtd2VpZ2h0OiA4MDA7CiAgICBsZXR0ZXItc3BhY2luZzogMDsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWF1ZGlvLXRodW1iLXdhdmVmb3JtLAoubWpyLWJvdHRvbS1mZWVkIC5tanItYXVkaW8tdGh1bWItd2F2ZWZvcm0gewogICAgZmxleDogMTsKICAgIG1pbi1oZWlnaHQ6IDQycHg7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgZ2FwOiBjbGFtcCgycHgsIDIuMiUsIDVweCk7CiAgICBwYWRkaW5nOiA0cHggMDsKICAgIGZpbHRlcjogZHJvcC1zaGFkb3coMCA0cHggMTRweCByZ2JhKDAsIDAsIDAsIDAuMzQpKTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWF1ZGlvLXRodW1iLXdhdmVmb3JtIHNwYW4sCi5tanItYm90dG9tLWZlZWQgLm1qci1hdWRpby10aHVtYi13YXZlZm9ybSBzcGFuIHsKICAgIHdpZHRoOiAzcHg7CiAgICBtaW4td2lkdGg6IDJweDsKICAgIG1heC13aWR0aDogNXB4OwogICAgYm9yZGVyLXJhZGl1czogOTk5cHg7CiAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoMTgwZGVnLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuOTgpLCByZ2JhKDE2MCwgMjI0LCAyNTUsIDAuNzIpKTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWF1ZGlvLXRodW1iLW1ldGEsCi5tanItYm90dG9tLWZlZWQgLm1qci1hdWRpby10aHVtYi1tZXRhIHsKICAgIG1pbi13aWR0aDogMDsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgZ2FwOiAycHg7CiAgICB0ZXh0LXNoYWRvdzogMCAycHggMTJweCByZ2JhKDAsIDAsIDAsIDAuNjIpOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYXVkaW8tdGh1bWItdGl0bGUsCi5tanItYm90dG9tLWZlZWQgLm1qci1hdWRpby10aHVtYi10aXRsZSB7CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7CiAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgZm9udC1zaXplOiAxMnB4OwogICAgZm9udC13ZWlnaHQ6IDgwMDsKICAgIGxpbmUtaGVpZ2h0OiAxLjI7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hdWRpby10aHVtYi1zdWJ0aXRsZSwKLm1qci1ib3R0b20tZmVlZCAubWpyLWF1ZGlvLXRodW1iLXN1YnRpdGxlIHsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjcpOwogICAgZm9udC1zaXplOiAxMHB4OwogICAgZm9udC13ZWlnaHQ6IDY1MDsKICAgIGxpbmUtaGVpZ2h0OiAxLjI7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hc3NldC1jYXJkIC5tanItd29ya2Zsb3ctdGh1bWIsCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1jYXJkIC5tanItd29ya2Zsb3ctdGh1bWIgewogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgaW5zZXQ6IDA7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgIGdhcDogN3B4OwogICAgcGFkZGluZzogMTRweCAxMnB4OwogICAgYmFja2dyb3VuZDoKICAgICAgICBsaW5lYXItZ3JhZGllbnQoMTM1ZGVnLCByZ2JhKDQ3LCA1OCwgNzYsIDAuOTQpLCByZ2JhKDE4LCAyMywgMzIsIDAuOTgpKSwKICAgICAgICByYWRpYWwtZ3JhZGllbnQoY2lyY2xlIGF0IDMwJSAyNSUsIHJnYmEoNzgsIDE4NCwgMjU1LCAwLjIyKSwgdHJhbnNwYXJlbnQgNDIlKTsKICAgIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuOSk7CiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgICB0ZXh0LXNoYWRvdzogMCAxcHggOHB4IHJnYmEoMCwgMCwgMCwgMC43Mik7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hc3NldC1jYXJkIC5tanItdGh1bWIubWpyLXRodW1iLXdvcmtmbG93LAoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItY2FyZCAubWpyLXRodW1iLm1qci10aHVtYi13b3JrZmxvdyB7CiAgICBhc3BlY3QtcmF0aW86IDEuMDggLyAxOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYXNzZXQtY2FyZCAubWpyLXdvcmtmbG93LWNhcmQtYWN0aW9ucywKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWNhcmQgLm1qci13b3JrZmxvdy1jYXJkLWFjdGlvbnMgewogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgdG9wOiA3cHg7CiAgICByaWdodDogN3B4OwogICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICBnYXA6IDRweDsKICAgIHotaW5kZXg6IDEyOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYXNzZXQtY2FyZCAubWpyLXdvcmtmbG93LWFjdGlvbi1idG4sCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1jYXJkIC5tanItd29ya2Zsb3ctYWN0aW9uLWJ0biB7CiAgICAtd2Via2l0LWFwcGVhcmFuY2U6IG5vbmU7CiAgICBhcHBlYXJhbmNlOiBub25lOwogICAgd2lkdGg6IDI0cHg7CiAgICBoZWlnaHQ6IDI0cHg7CiAgICBtaW4td2lkdGg6IDI0cHg7CiAgICBtaW4taGVpZ2h0OiAyNHB4OwogICAgcGFkZGluZzogMDsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4zNCk7CiAgICBib3JkZXItcmFkaXVzOiA3cHg7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDgsIDEyLCAxOCwgMC41OCk7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjkyKTsKICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgY3Vyc29yOiBwb2ludGVyOwogICAgbGluZS1oZWlnaHQ6IDE7CiAgICBiYWNrZHJvcC1maWx0ZXI6IGJsdXIoM3B4KTsKICAgIC13ZWJraXQtYmFja2Ryb3AtZmlsdGVyOiBibHVyKDNweCk7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hc3NldC1jYXJkIC5tanItd29ya2Zsb3ctYWN0aW9uLWJ0bjpob3ZlciwKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWNhcmQgLm1qci13b3JrZmxvdy1hY3Rpb24tYnRuOmhvdmVyIHsKICAgIGJhY2tncm91bmQ6IHJnYmEoMjksIDQwLCA1OCwgMC43OCk7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hc3NldC1jYXJkIC5tanItd29ya2Zsb3ctYWN0aW9uLWJ0bi5pcy1hY3RpdmUsCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1jYXJkIC5tanItd29ya2Zsb3ctYWN0aW9uLWJ0bi5pcy1hY3RpdmUgewogICAgY29sb3I6ICNmZmQ0NWE7CiAgICBib3JkZXItY29sb3I6IHJnYmEoMjU1LCAyMTIsIDkwLCAwLjcpOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYXNzZXQtY2FyZCAubWpyLXdvcmtmbG93LXRodW1iIC5waSwKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWNhcmQgLm1qci13b3JrZmxvdy10aHVtYiAucGkgewogICAgZm9udC1zaXplOiAxLjc1cmVtOwogICAgb3BhY2l0eTogMC43MjsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFzc2V0LWNhcmQgLm1qci13b3JrZmxvdy10aHVtYi5oYXMtdGh1bWJuYWlsLAoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItY2FyZCAubWpyLXdvcmtmbG93LXRodW1iLmhhcy10aHVtYm5haWwgewogICAganVzdGlmeS1jb250ZW50OiBmbGV4LWVuZDsKICAgIGJhY2tncm91bmQ6CiAgICAgICAgbGluZWFyLWdyYWRpZW50KDE4MGRlZywgdHJhbnNwYXJlbnQgMjQlLCByZ2JhKDAsIDAsIDAsIDAuMjgpIDU4JSwgcmdiYSgwLCAwLCAwLCAwLjc4KSksCiAgICAgICAgbGluZWFyLWdyYWRpZW50KDkwZGVnLCByZ2JhKDAsIDAsIDAsIDAuMzQpLCB0cmFuc3BhcmVudCAzNCUsIHRyYW5zcGFyZW50IDY2JSwgcmdiYSgwLCAwLCAwLCAwLjM0KSk7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hc3NldC1jYXJkIC5tanItdGh1bWItbWVkaWEubWpyLXdvcmtmbG93LWdyYXBoLW1hcC1wcmV2aWV3LAoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItY2FyZCAubWpyLXRodW1iLW1lZGlhLm1qci13b3JrZmxvdy1ncmFwaC1tYXAtcHJldmlldyB7CiAgICBvYmplY3QtZml0OiBjb3ZlciAhaW1wb3J0YW50OwogICAgb3BhY2l0eTogMC40NjsKICAgIGZpbHRlcjogc2F0dXJhdGUoMC43NSkgY29udHJhc3QoMC44MikgYnJpZ2h0bmVzcygwLjcpOwogICAgdHJhbnNmb3JtOiBzY2FsZSgxLjA2KTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFzc2V0LWNhcmQgLm1qci13b3JrZmxvdy10aHVtYi5oYXMtZ3JhcGgtbWFwLAoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItY2FyZCAubWpyLXdvcmtmbG93LXRodW1iLmhhcy1ncmFwaC1tYXAgewogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICBiYWNrZ3JvdW5kOgogICAgICAgIGxpbmVhci1ncmFkaWVudCgxODBkZWcsIHJnYmEoOCwgMTAsIDE0LCAwLjMpLCByZ2JhKDgsIDEwLCAxNCwgMC44MikpLAogICAgICAgIHJhZGlhbC1ncmFkaWVudChjaXJjbGUgYXQgNTAlIDQyJSwgcmdiYSgwLCAwLCAwLCAwLjE4KSwgcmdiYSgwLCAwLCAwLCAwLjY4KSA3MiUpOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYXNzZXQtY2FyZCAubWpyLXdvcmtmbG93LXRodW1iLmhhcy1ncmFwaC1tYXAgLm1qci13b3JrZmxvdy10aHVtYi10aXRsZSwKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWNhcmQgLm1qci13b3JrZmxvdy10aHVtYi5oYXMtZ3JhcGgtbWFwIC5tanItd29ya2Zsb3ctdGh1bWItdGl0bGUgewogICAgcGFkZGluZzogMnB4IDdweDsKICAgIGJvcmRlci1yYWRpdXM6IDVweDsKICAgIGJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgMC4zNik7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hc3NldC1jYXJkIC5tanItd29ya2Zsb3ctdGh1bWIuaGFzLXRodW1ibmFpbCAucGksCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1jYXJkIC5tanItd29ya2Zsb3ctdGh1bWIuaGFzLXRodW1ibmFpbCAucGkgewogICAgZGlzcGxheTogbm9uZTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFzc2V0LWNhcmQgLm1qci13b3JrZmxvdy10aHVtYi5oYXMtZ3JhcGgtbWFwIC5waSwKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWNhcmQgLm1qci13b3JrZmxvdy10aHVtYi5oYXMtZ3JhcGgtbWFwIC5waSB7CiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgIG1hcmdpbi1ib3R0b206IDJweDsKICAgIGZvbnQtc2l6ZTogMS4xNXJlbTsKICAgIG9wYWNpdHk6IDAuNTU7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hc3NldC1jYXJkIC5tanItd29ya2Zsb3ctdGh1bWItdGl0bGUsCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1jYXJkIC5tanItd29ya2Zsb3ctdGh1bWItdGl0bGUgewogICAgbWF4LXdpZHRoOiAxMDAlOwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgIGZvbnQtc2l6ZTogMC44NHJlbTsKICAgIGZvbnQtd2VpZ2h0OiA4MDA7CiAgICBsaW5lLWhlaWdodDogMS4xOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYXNzZXQtY2FyZCAubWpyLXdvcmtmbG93LXRodW1iLW1ldGEsCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1jYXJkIC5tanItd29ya2Zsb3ctdGh1bWItbWV0YSB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgbWF4LXdpZHRoOiAxMDAlOwogICAgZmxleC13cmFwOiB3cmFwOwogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICBnYXA6IDRweDsKICAgIGZvbnQtc2l6ZTogMC42OHJlbTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFzc2V0LWNhcmQgLm1qci13b3JrZmxvdy10aHVtYi1tZXRhIHNwYW4sCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1jYXJkIC5tanItd29ya2Zsb3ctdGh1bWItbWV0YSBzcGFuLAoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYXNzZXQtY2FyZCAubWpyLW1ldGEtd29ya2Zsb3ctdGFzaywKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWNhcmQgLm1qci1tZXRhLXdvcmtmbG93LXRhc2ssCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hc3NldC1jYXJkIC5tanItbWV0YS13b3JrZmxvdy1zdWJncmFwaHMsCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1jYXJkIC5tanItbWV0YS13b3JrZmxvdy1zdWJncmFwaHMgewogICAgYm9yZGVyLXJhZGl1czogNHB4OwogICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEyKTsKICAgIHBhZGRpbmc6IDJweCA1cHg7CiAgICBtYXgtd2lkdGg6IDEwMCU7CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7CiAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYXNzZXQtY2FyZCAubWpyLXdvcmtmbG93LXRodW1iLW1ldGEgc3BhbjpudGgtY2hpbGQobiArIDQpLAoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItY2FyZCAubWpyLXdvcmtmbG93LXRodW1iLW1ldGEgc3BhbjpudGgtY2hpbGQobiArIDQpIHsKICAgIGRpc3BsYXk6IG5vbmU7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hc3NldC1jYXJkIC5tanItY2FyZC1tZXRhW2RhdGEtbWpyLWtpbmQ9IndvcmtmbG93Il0sCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1jYXJkIC5tanItY2FyZC1tZXRhW2RhdGEtbWpyLWtpbmQ9IndvcmtmbG93Il0gewogICAgcGFkZGluZzogN3B4IDlweCAhaW1wb3J0YW50Owp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYXNzZXQtY2FyZCAubWpyLWNhcmQtbWV0YVtkYXRhLW1qci1raW5kPSJ3b3JrZmxvdyJdIC5tanItY2FyZC1maWxlbmFtZSwKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWNhcmQgLm1qci1jYXJkLW1ldGFbZGF0YS1tanIta2luZD0id29ya2Zsb3ciXSAubWpyLWNhcmQtZmlsZW5hbWUgewogICAgbWFyZ2luLWJvdHRvbTogM3B4ICFpbXBvcnRhbnQ7CiAgICBmb250LXNpemU6IDAuNzhyZW0gIWltcG9ydGFudDsKICAgIGxpbmUtaGVpZ2h0OiAxLjE1ICFpbXBvcnRhbnQ7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hc3NldC1jYXJkIC5tanItY2FyZC1tZXRhW2RhdGEtbWpyLWtpbmQ9IndvcmtmbG93Il0gLm1qci1jYXJkLW1ldGEtcm93LAoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItY2FyZCAubWpyLWNhcmQtbWV0YVtkYXRhLW1qci1raW5kPSJ3b3JrZmxvdyJdIC5tanItY2FyZC1tZXRhLXJvdyB7CiAgICBmb250LXNpemU6IDAuNzJyZW0gIWltcG9ydGFudDsKICAgIG9wYWNpdHk6IDAuNzQgIWltcG9ydGFudDsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFzc2V0LWNhcmQgLm1qci1jYXJkLW1ldGFbZGF0YS1tanIta2luZD0id29ya2Zsb3ciXSAubWpyLWNhcmQtbWV0YS1yb3cgLm1qci1tZXRhLXdvcmtmbG93LXRhc2ssCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1jYXJkIC5tanItY2FyZC1tZXRhW2RhdGEtbWpyLWtpbmQ9IndvcmtmbG93Il0gLm1qci1jYXJkLW1ldGEtcm93IC5tanItbWV0YS13b3JrZmxvdy10YXNrIHsKICAgIGRpc3BsYXk6IG5vbmU7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hc3NldC1jYXJkIC5tanItd29ya2Zsb3ctbWlzc2luZy1jaGlwLAoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItY2FyZCAubWpyLXdvcmtmbG93LW1pc3NpbmctY2hpcCwKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFzc2V0LWNhcmQgLm1qci1tZXRhLXdvcmtmbG93LW1pc3NpbmcsCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1jYXJkIC5tanItbWV0YS13b3JrZmxvdy1taXNzaW5nIHsKICAgIGJhY2tncm91bmQ6IHJnYmEoMjU1LCAxOTAsIDY2LCAwLjI4KTsKICAgIGNvbG9yOiByZ2JhKDI1NSwgMjM2LCAxODAsIDAuOTgpOwogICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgyNTUsIDIwNiwgMTAxLCAwLjQ1KTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWdyaWQgLm1qci1ncmlkLWdyb3VwLXNlcGFyYXRvciB7CiAgICAtd2Via2l0LWFwcGVhcmFuY2U6IG5vbmU7CiAgICBhcHBlYXJhbmNlOiBub25lOwogICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiA4cHg7CiAgICB3aWR0aDogMTAwJTsKICAgIG1pbi1oZWlnaHQ6IDMwcHg7CiAgICBtYXJnaW46IDAgMCA4cHg7CiAgICBwYWRkaW5nOiA1cHggOXB4OwogICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSh2YXIoLS1tanItd29ya2Zsb3ctZ3JvdXAtYWNjZW50LXJnYiwgOTUsIDE3OSwgMjU1KSwgMC40Mik7CiAgICBib3JkZXItcmFkaXVzOiA3cHg7CiAgICBiYWNrZ3JvdW5kOgogICAgICAgIGxpbmVhci1ncmFkaWVudCgKICAgICAgICAgICAgMTM1ZGVnLAogICAgICAgICAgICByZ2JhKHZhcigtLW1qci13b3JrZmxvdy1ncm91cC1hY2NlbnQtcmdiLCA5NSwgMTc5LCAyNTUpLCAwLjIyKSwKICAgICAgICAgICAgcmdiYSh2YXIoLS1tanItd29ya2Zsb3ctZ3JvdXAtYWNjZW50LXJnYiwgOTUsIDE3OSwgMjU1KSwgMC4wOCkKICAgICAgICApLAogICAgICAgIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0yKSA3OCUsIHRyYW5zcGFyZW50KTsKICAgIGNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tY29udGVudC1mZywgI2ZmZikgOTIlLCB0cmFuc3BhcmVudCk7CiAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICBmb250OiBpbmhlcml0OwogICAgbGluZS1oZWlnaHQ6IDE7CiAgICB0ZXh0LWFsaWduOiBsZWZ0OwogICAgYm94LXNoYWRvdzogaW5zZXQgMCAxcHggMCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDgpOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItZ3JpZCAubWpyLWdyaWQtZ3JvdXAtc2VwYXJhdG9yOmhvdmVyIHsKICAgIGJvcmRlci1jb2xvcjogcmdiYSh2YXIoLS1tanItd29ya2Zsb3ctZ3JvdXAtYWNjZW50LXJnYiwgOTUsIDE3OSwgMjU1KSwgMC42Nik7CiAgICBiYWNrZ3JvdW5kOgogICAgICAgIGxpbmVhci1ncmFkaWVudCgKICAgICAgICAgICAgMTM1ZGVnLAogICAgICAgICAgICByZ2JhKHZhcigtLW1qci13b3JrZmxvdy1ncm91cC1hY2NlbnQtcmdiLCA5NSwgMTc5LCAyNTUpLCAwLjMpLAogICAgICAgICAgICByZ2JhKHZhcigtLW1qci13b3JrZmxvdy1ncm91cC1hY2NlbnQtcmdiLCA5NSwgMTc5LCAyNTUpLCAwLjEyKQogICAgICAgICksCiAgICAgICAgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTIpIDg0JSwgdHJhbnNwYXJlbnQpOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItZ3JpZCAubWpyLWdyaWQtZ3JvdXAtc2VwYXJhdG9yOmZvY3VzLXZpc2libGUgewogICAgb3V0bGluZTogMnB4IHNvbGlkIHJnYmEodmFyKC0tbWpyLXdvcmtmbG93LWdyb3VwLWFjY2VudC1yZ2IsIDk1LCAxNzksIDI1NSksIDAuNTUpOwogICAgb3V0bGluZS1vZmZzZXQ6IDJweDsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWdyaWQgLm1qci1ncmlkLWdyb3VwLXNlcGFyYXRvci0tYWNjZW50LTAgewogICAgLS1tanItd29ya2Zsb3ctZ3JvdXAtYWNjZW50LXJnYjogOTUsIDE3OSwgMjU1Owp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItZ3JpZCAubWpyLWdyaWQtZ3JvdXAtc2VwYXJhdG9yLS1hY2NlbnQtMSB7CiAgICAtLW1qci13b3JrZmxvdy1ncm91cC1hY2NlbnQtcmdiOiA1NSwgMjExLCAxNTY7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1ncmlkIC5tanItZ3JpZC1ncm91cC1zZXBhcmF0b3ItLWFjY2VudC0yIHsKICAgIC0tbWpyLXdvcmtmbG93LWdyb3VwLWFjY2VudC1yZ2I6IDI0NiwgMTc3LCA3NTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWdyaWQgLm1qci1ncmlkLWdyb3VwLXNlcGFyYXRvci0tYWNjZW50LTMgewogICAgLS1tanItd29ya2Zsb3ctZ3JvdXAtYWNjZW50LXJnYjogMjM4LCAxMDQsIDEzNjsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWdyaWQgLm1qci1ncmlkLWdyb3VwLXNlcGFyYXRvci0tYWNjZW50LTQgewogICAgLS1tanItd29ya2Zsb3ctZ3JvdXAtYWNjZW50LXJnYjogMTU3LCAxMzIsIDIzODsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWdyaWQgLm1qci1ncmlkLWdyb3VwLXNlcGFyYXRvci0tYWNjZW50LTUgewogICAgLS1tanItd29ya2Zsb3ctZ3JvdXAtYWNjZW50LXJnYjogNzEsIDE5NywgMjIyOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItZ3JpZCAubWpyLWdyaWQtZ3JvdXAtc2VwYXJhdG9yLS1hY2NlbnQtNiB7CiAgICAtLW1qci13b3JrZmxvdy1ncm91cC1hY2NlbnQtcmdiOiAxNDksIDIwNywgODE7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1ncmlkIC5tanItZ3JpZC1ncm91cC1zZXBhcmF0b3ItLWFjY2VudC03IHsKICAgIC0tbWpyLXdvcmtmbG93LWdyb3VwLWFjY2VudC1yZ2I6IDI0MiwgMTMwLCA3ODsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWdyaWQgLm1qci1ncmlkLWdyb3VwLXNlcGFyYXRvci1jaGV2cm9uIHsKICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgZmxleDogMCAwIGF1dG87CiAgICB3aWR0aDogMThweDsKICAgIGhlaWdodDogMThweDsKICAgIGJvcmRlci1yYWRpdXM6IDk5OXB4OwogICAgY29sb3I6IHJnYih2YXIoLS1tanItd29ya2Zsb3ctZ3JvdXAtYWNjZW50LXJnYiwgOTUsIDE3OSwgMjU1KSk7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKHZhcigtLW1qci13b3JrZmxvdy1ncm91cC1hY2NlbnQtcmdiLCA5NSwgMTc5LCAyNTUpLCAwLjE0KTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWdyaWQgLm1qci1ncmlkLWdyb3VwLXNlcGFyYXRvci1jaGV2cm9uID4gLnBpIHsKICAgIGZvbnQtc2l6ZTogMTBweDsKICAgIGxpbmUtaGVpZ2h0OiAxOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItZ3JpZCAubWpyLWdyaWQtZ3JvdXAtc2VwYXJhdG9yLXRpdGxlIHsKICAgIG1pbi13aWR0aDogMDsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICBmb250LXNpemU6IDEycHg7CiAgICBmb250LXdlaWdodDogODAwOwp9CgoubWpyLXdvcmtmbG93LXBpY2tlci1iYWNrZHJvcCB7CiAgICBwb3NpdGlvbjogZml4ZWQ7CiAgICBpbnNldDogMDsKICAgIHotaW5kZXg6IDk5OTk5OTsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICBwYWRkaW5nOiAyNHB4OwogICAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjU4KTsKICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7Cn0KCi5tanItd29ya2Zsb3ctcGlja2VyLWRpYWxvZyB7CiAgICB3aWR0aDogbWluKDkyMHB4LCA5NnZ3KTsKICAgIG1heC1oZWlnaHQ6IG1pbig3NjBweCwgOTJ2aCk7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTQpOwogICAgYm9yZGVyLXJhZGl1czogMTBweDsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0wLCAjMTExNDE4KSA5NiUsICMwMDApOwogICAgY29sb3I6IHZhcigtLWNvbnRlbnQtZmcsICNmNWY1ZjUpOwogICAgYm94LXNoYWRvdzogMCAxOHB4IDYwcHggcmdiYSgwLCAwLCAwLCAwLjQ4KTsKfQoKLm1qci13b3JrZmxvdy1pbmZvLWRpYWxvZyB7CiAgICB3aWR0aDogbWluKDU2MHB4LCA5NnZ3KTsKfQoKLm1qci13b3JrZmxvdy1pbmZvLWZvcm0gewogICAgZGlzcGxheTogZ3JpZDsKICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogcmVwZWF0KDIsIG1pbm1heCgwLCAxZnIpKTsKICAgIGdhcDogMTJweDsKICAgIHBhZGRpbmc6IDE0cHggMThweCA0cHg7Cn0KCi5tanItd29ya2Zsb3ctaW5mby1mb3JtIGxhYmVsIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgZ2FwOiA2cHg7CiAgICBtaW4td2lkdGg6IDA7Cn0KCi5tanItd29ya2Zsb3ctaW5mby1mb3JtIGxhYmVsLmlzLXdpZGUgewogICAgZ3JpZC1jb2x1bW46IDEgLyAtMTsKfQoKLm1qci13b3JrZmxvdy1pbmZvLWZvcm0gc3BhbiB7CiAgICBjb2xvcjogcmdiYSgyNTUsMjU1LDI1NSwwLjY0KTsKICAgIGZvbnQtc2l6ZTogMTFweDsKICAgIGZvbnQtd2VpZ2h0OiA3NTA7CiAgICBsZXR0ZXItc3BhY2luZzogLjA0ZW07CiAgICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOwp9CgoubWpyLXdvcmtmbG93LWluZm8tZm9ybSBpbnB1dCwKLm1qci13b3JrZmxvdy1pbmZvLWZvcm0gc2VsZWN0LAoubWpyLXdvcmtmbG93LWluZm8tZm9ybSB0ZXh0YXJlYSB7CiAgICB3aWR0aDogMTAwJTsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjU1LDI1NSwyNTUsMC4xMik7CiAgICBib3JkZXItcmFkaXVzOiA4cHg7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDAsMCwwLDAuMjYpOwogICAgY29sb3I6IHJnYmEoMjU1LDI1NSwyNTUsMC45Mik7CiAgICBmb250OiBpbmhlcml0OwogICAgZm9udC1zaXplOiAxM3B4OwogICAgcGFkZGluZzogOXB4IDEwcHg7CiAgICBvdXRsaW5lOiBub25lOwp9CgoubWpyLXdvcmtmbG93LWluZm8tZm9ybSB0ZXh0YXJlYSB7CiAgICByZXNpemU6IHZlcnRpY2FsOwogICAgbWluLWhlaWdodDogOTZweDsKfQoKLm1qci13b3JrZmxvdy1waWNrZXItaGVhZGVyLAoubWpyLXdvcmtmbG93LXBpY2tlci1mb290ZXIgewogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47CiAgICBnYXA6IDEycHg7CiAgICBwYWRkaW5nOiAxMnB4IDE0cHg7CiAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEpOwp9CgoubWpyLXdvcmtmbG93LXBpY2tlci1mb290ZXIgewogICAganVzdGlmeS1jb250ZW50OiBmbGV4LWVuZDsKICAgIGJvcmRlci10b3A6IDFweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMSk7CiAgICBib3JkZXItYm90dG9tOiAwOwp9CgoubWpyLXdvcmtmbG93LXBpY2tlci10aXRsZSB7CiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBnYXA6IDlweDsKICAgIG1pbi13aWR0aDogMDsKICAgIGZvbnQtc2l6ZTogMTVweDsKICAgIGZvbnQtd2VpZ2h0OiA4MDA7Cn0KCi5tanItd29ya2Zsb3ctcGlja2VyLWljb24tYnRuLAoubWpyLXdvcmtmbG93LXBpY2tlci1idG4gewogICAgYXBwZWFyYW5jZTogbm9uZTsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xOCk7CiAgICBib3JkZXItcmFkaXVzOiA3cHg7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMiwgIzI1MjgyZCkgODglLCB0cmFuc3BhcmVudCk7CiAgICBjb2xvcjogdmFyKC0tY29udGVudC1mZywgI2Y1ZjVmNSk7CiAgICBjdXJzb3I6IHBvaW50ZXI7Cn0KCi5tanItd29ya2Zsb3ctcGlja2VyLWljb24tYnRuIHsKICAgIHdpZHRoOiAzMnB4OwogICAgaGVpZ2h0OiAzMnB4Owp9CgoubWpyLXdvcmtmbG93LXBpY2tlci1idG4gewogICAgbWluLWhlaWdodDogMzJweDsKICAgIHBhZGRpbmc6IDAgMTJweDsKICAgIGZvbnQtd2VpZ2h0OiA3MDA7Cn0KCi5tanItd29ya2Zsb3ctcGlja2VyLWJ0bi5pcy1wcmltYXJ5IHsKICAgIGJvcmRlci1jb2xvcjogcmdiYSg3NywgMTcxLCAyNDcsIDAuNyk7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDc3LCAxNzEsIDI0NywgMC4yMik7Cn0KCi5tanItd29ya2Zsb3ctcGlja2VyLWJ0bjpkaXNhYmxlZCB7CiAgICBjdXJzb3I6IG5vdC1hbGxvd2VkOwogICAgb3BhY2l0eTogMC40NTsKfQoKLm1qci13b3JrZmxvdy1waWNrZXItc291cmNlIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBnYXA6IDhweDsKICAgIHBhZGRpbmc6IDhweCAxNHB4OwogICAgY29sb3I6IHZhcigtLW1qci1tdXRlZCwgI2FlYjNiZCk7CiAgICBmb250LXNpemU6IDEycHg7CiAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA4KTsKfQoKLm1qci13b3JrZmxvdy1waWNrZXItc291cmNlIHN0cm9uZyB7CiAgICBtaW4td2lkdGg6IDA7CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7CiAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgY29sb3I6IHZhcigtLWNvbnRlbnQtZmcsICNmNWY1ZjUpOwp9CgoubWpyLXdvcmtmbG93LXBpY2tlci10b29sYmFyIHsKICAgIGRpc3BsYXk6IGdyaWQ7CiAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IG1pbm1heCgxODBweCwgMWZyKSByZXBlYXQoMywgbWlubWF4KDExMHB4LCAxNTBweCkpOwogICAgZ2FwOiA4cHg7CiAgICBwYWRkaW5nOiAxMnB4IDE0cHg7Cn0KCi5tanItd29ya2Zsb3ctcGlja2VyLWRpYWxvZy5pcy1hc3NldC1tb2RlIC5tanItd29ya2Zsb3ctcGlja2VyLXRvb2xiYXIgewogICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiBtaW5tYXgoMTgwcHgsIDFmcik7Cn0KCi5tanItd29ya2Zsb3ctcGlja2VyLXNlYXJjaCwKLm1qci13b3JrZmxvdy1waWNrZXItdG9vbGJhciBzZWxlY3QgewogICAgbWluLWhlaWdodDogMzRweDsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xNCk7CiAgICBib3JkZXItcmFkaXVzOiA3cHg7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMSwgIzE3MWExZikgOTIlLCAjMDAwKTsKICAgIGNvbG9yOiB2YXIoLS1jb250ZW50LWZnLCAjZjVmNWY1KTsKfQoKLm1qci13b3JrZmxvdy1waWNrZXItc2VhcmNoIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiA4cHg7CiAgICBwYWRkaW5nOiAwIDEwcHg7Cn0KCi5tanItd29ya2Zsb3ctcGlja2VyLXNlYXJjaCBpbnB1dCB7CiAgICB3aWR0aDogMTAwJTsKICAgIG1pbi13aWR0aDogMDsKICAgIGJvcmRlcjogMDsKICAgIG91dGxpbmU6IDA7CiAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsKICAgIGNvbG9yOiBpbmhlcml0Owp9CgoubWpyLXdvcmtmbG93LXBpY2tlci10b29sYmFyIHNlbGVjdCB7CiAgICBwYWRkaW5nOiAwIDhweDsKfQoKLm1qci13b3JrZmxvdy1waWNrZXItYm9keSB7CiAgICBmbGV4OiAxIDEgYXV0bzsKICAgIG1pbi1oZWlnaHQ6IDI2MHB4OwogICAgb3ZlcmZsb3c6IGF1dG87CiAgICBkaXNwbGF5OiBncmlkOwogICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiByZXBlYXQoYXV0by1maWxsLCBtaW5tYXgoMTgwcHgsIDFmcikpOwogICAgYWxpZ24tY29udGVudDogc3RhcnQ7CiAgICBnYXA6IDEwcHg7CiAgICBwYWRkaW5nOiAwIDE0cHggMTRweDsKfQoKLm1qci13b3JrZmxvdy1waWNrZXItY2FyZCB7CiAgICBhcHBlYXJhbmNlOiBub25lOwogICAgZGlzcGxheTogZ3JpZDsKICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogNjhweCBtaW5tYXgoMCwgMWZyKTsKICAgIGdhcDogMTBweDsKICAgIG1pbi1oZWlnaHQ6IDg0cHg7CiAgICBwYWRkaW5nOiA4cHg7CiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTIpOwogICAgYm9yZGVyLXJhZGl1czogOHB4OwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTEsICMxNzFhMWYpIDkyJSwgdHJhbnNwYXJlbnQpOwogICAgY29sb3I6IGluaGVyaXQ7CiAgICB0ZXh0LWFsaWduOiBsZWZ0OwogICAgY3Vyc29yOiBwb2ludGVyOwp9CgoubWpyLXdvcmtmbG93LXBpY2tlci1kaWFsb2cuaXMtYXNzZXQtbW9kZSAubWpyLXdvcmtmbG93LXBpY2tlci1jYXJkIHsKICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogNzZweCBtaW5tYXgoMCwgMWZyKTsKfQoKLm1qci13b3JrZmxvdy1waWNrZXItY2FyZDpob3ZlciwKLm1qci13b3JrZmxvdy1waWNrZXItY2FyZC5pcy1zZWxlY3RlZCB7CiAgICBib3JkZXItY29sb3I6IHJnYmEoNzcsIDE3MSwgMjQ3LCAwLjcyKTsKICAgIGJhY2tncm91bmQ6IHJnYmEoNzcsIDE3MSwgMjQ3LCAwLjEyKTsKfQoKLm1qci13b3JrZmxvdy1waWNrZXItdGh1bWIgewogICAgd2lkdGg6IDY4cHg7CiAgICBhc3BlY3QtcmF0aW86IDEgLyAxOwogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICBib3JkZXItcmFkaXVzOiA2cHg7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDYpOwp9CgoubWpyLXdvcmtmbG93LXBpY2tlci10aHVtYiBpbWcgewogICAgd2lkdGg6IDEwMCU7CiAgICBoZWlnaHQ6IDEwMCU7CiAgICBvYmplY3QtZml0OiBjb3ZlcjsKfQoKLm1qci13b3JrZmxvdy1waWNrZXItY2FyZC1pbmZvIHsKICAgIG1pbi13aWR0aDogMDsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICBnYXA6IDRweDsKfQoKLm1qci13b3JrZmxvdy1waWNrZXItY2FyZC1pbmZvIHN0cm9uZywKLm1qci13b3JrZmxvdy1waWNrZXItY2FyZC1pbmZvIHNwYW4sCi5tanItd29ya2Zsb3ctcGlja2VyLWNhcmQtaW5mbyBzbWFsbCB7CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7CiAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwp9CgoubWpyLXdvcmtmbG93LXBpY2tlci1jYXJkLWluZm8gc3Ryb25nIHsKICAgIGZvbnQtc2l6ZTogMTNweDsKfQoKLm1qci13b3JrZmxvdy1waWNrZXItY2FyZC1pbmZvIHNwYW4sCi5tanItd29ya2Zsb3ctcGlja2VyLWNhcmQtaW5mbyBzbWFsbCB7CiAgICBjb2xvcjogdmFyKC0tbWpyLW11dGVkLCAjYWViM2JkKTsKICAgIGZvbnQtc2l6ZTogMTFweDsKfQoKLm1qci13b3JrZmxvdy1waWNrZXItZW1wdHkgewogICAgZ3JpZC1jb2x1bW46IDEgLyAtMTsKICAgIHBhZGRpbmc6IDMycHg7CiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgICBjb2xvcjogdmFyKC0tbWpyLW11dGVkLCAjYWViM2JkKTsKfQoKLm1qci13b3JrZmxvdy1waWNrZXItZW1wdHkuaXMtZXJyb3IgewogICAgY29sb3I6ICNmZmI0YjQ7Cn0KCkBtZWRpYSAobWF4LXdpZHRoOiA3MjBweCkgewogICAgLm1qci13b3JrZmxvdy1waWNrZXItYmFja2Ryb3AgewogICAgICAgIHBhZGRpbmc6IDEwcHg7CiAgICB9CgogICAgLm1qci13b3JrZmxvdy1waWNrZXItdG9vbGJhciB7CiAgICAgICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiAxZnIgMWZyOwogICAgfQoKICAgIC5tanItd29ya2Zsb3ctcGlja2VyLXNlYXJjaCB7CiAgICAgICAgZ3JpZC1jb2x1bW46IDEgLyAtMTsKICAgIH0KfQoKLyogS2VlcCBnZW5lcmF0aW9uLXRpbWUgYmFkZ2UgcGlubmVkIHRvIHRoZSB0aHVtYm5haWwgY29ybmVyIGFjcm9zcyBncmlkL2ZlZWQgdmFyaWFudHMuICovCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci10aHVtYiA+IC5tanItZ2VudGltZS1iYWRnZSwKLm1qci1ib3R0b20tZmVlZCAubWpyLXRodW1iID4gLm1qci1nZW50aW1lLWJhZGdlIHsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZSAhaW1wb3J0YW50OwogICAgcmlnaHQ6IDZweCAhaW1wb3J0YW50OwogICAgYm90dG9tOiA2cHggIWltcG9ydGFudDsKICAgIGxlZnQ6IGF1dG8gIWltcG9ydGFudDsKICAgIHRvcDogYXV0byAhaW1wb3J0YW50OwogICAgei1pbmRleDogMTAgIWltcG9ydGFudDsKICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIHBhZGRpbmc6IDJweCA2cHggIWltcG9ydGFudDsKICAgIGJvcmRlci1yYWRpdXM6IDRweCAhaW1wb3J0YW50OwogICAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjU1KSAhaW1wb3J0YW50OwogICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEyKSAhaW1wb3J0YW50OwogICAgZm9udC1zaXplOiAxMHB4OwogICAgZm9udC13ZWlnaHQ6IDgwMCAhaW1wb3J0YW50OwogICAgbGV0dGVyLXNwYWNpbmc6IDAuMDE1ZW07CiAgICBsaW5lLWhlaWdodDogMS4xOwogICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICBib3gtc2hhZG93OiAwIDJweCA0cHggcmdiYSgwLCAwLCAwLCAwLjMpOwogICAgdGV4dC1zaGFkb3c6CiAgICAgICAgMCAxcHggMnB4IHJnYmEoMCwgMCwgMCwgMC45KSwKICAgICAgICAwIDAgMTBweCBjb2xvci1taXgoaW4gc3JnYiwgY3VycmVudENvbG9yIDM1JSwgdHJhbnNwYXJlbnQpOwogICAgYmFja2Ryb3AtZmlsdGVyOiBibHVyKDJweCk7CiAgICAtd2Via2l0LWJhY2tkcm9wLWZpbHRlcjogYmx1cigycHgpOwp9CgovKiBLZWVwIHJhdGluZy90YWdzIGJhZGdlcyBhbmNob3JlZC4gRG8gbm90IGZvcmNlIGRpc3BsYXkgaGVyZSBzbyBncmlkIHZpc2liaWxpdHkgdG9nZ2xlcyBzdGlsbCBjb250cm9sIHNob3cvaGlkZS4gKi8KLm1qci1hc3NldHMtbWFuYWdlciAubWpyLXRodW1iID4gLm1qci1yYXRpbmctYmFkZ2UsCi5tanItYm90dG9tLWZlZWQgLm1qci10aHVtYiA+IC5tanItcmF0aW5nLWJhZGdlIHsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZSAhaW1wb3J0YW50OwogICAgdG9wOiA2cHggIWltcG9ydGFudDsKICAgIHJpZ2h0OiA2cHggIWltcG9ydGFudDsKICAgIGxlZnQ6IGF1dG8gIWltcG9ydGFudDsKICAgIGJvdHRvbTogYXV0byAhaW1wb3J0YW50OwogICAgei1pbmRleDogMTAgIWltcG9ydGFudDsKICAgIGJvcmRlci1yYWRpdXM6IDZweDsKICAgIGJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgMC41NSk7CiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTIpOwogICAgcGFkZGluZzogMnB4IDZweDsKICAgIGZvbnQtc2l6ZTogMTNweDsKICAgIGxldHRlci1zcGFjaW5nOiAxcHg7CiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgYm94LXNoYWRvdzogMCA2cHggMThweCByZ2JhKDAsIDAsIDAsIDAuMjUpOwogICAgdGV4dC1zaGFkb3c6IDAgMnB4IDZweCByZ2JhKDAsIDAsIDAsIDAuNik7CiAgICBhbmltYXRpb246IG1qci1mYWRlLWluIDAuMnMgZWFzZS1vdXQ7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci10aHVtYiA+IC5tanItdGFncy1iYWRnZSwKLm1qci1ib3R0b20tZmVlZCAubWpyLXRodW1iID4gLm1qci10YWdzLWJhZGdlIHsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZSAhaW1wb3J0YW50OwogICAgbGVmdDogNnB4ICFpbXBvcnRhbnQ7CiAgICBib3R0b206IDZweCAhaW1wb3J0YW50OwogICAgcmlnaHQ6IGF1dG8gIWltcG9ydGFudDsKICAgIHRvcDogYXV0byAhaW1wb3J0YW50OwogICAgei1pbmRleDogMTAgIWltcG9ydGFudDsKICAgIHBhZGRpbmc6IDNweCA2cHg7CiAgICBmb250LXNpemU6IDlweDsKICAgIG1heC13aWR0aDogY2FsYygxMDAlIC0gNTZweCk7CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7CiAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICBib3JkZXItcmFkaXVzOiA0cHg7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIDAuOCk7CiAgICBib3gtc2hhZG93OiAwIDJweCA0cHggcmdiYSgwLCAwLCAwLCAwLjMpOwogICAgYW5pbWF0aW9uOiBtanItZmFkZS1pbiAwLjJzIGVhc2Utb3V0Owp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItdGh1bWItcGxheSB7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICBpbnNldDogMDsKICAgIGRpc3BsYXk6IGdyaWQ7CiAgICBwbGFjZS1pdGVtczogY2VudGVyOwogICAgZm9udC1zaXplOiAyOHB4OwogICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC45KTsKICAgIHRleHQtc2hhZG93OiAwIDAgMTBweCByZ2JhKDAsIDAsIDAsIDAuNyk7CiAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgIHRyYW5zaXRpb246IG9wYWNpdHkgMTIwbXMgZWFzZTsKfQoKLyogLS0tIEhvdmVyIGluZm8gb3ZlcmxheSAocG9zaXRpdmUgcHJvbXB0ICsgZ2VuIHRpbWUpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgIFNsaWRlcyB1cCBmcm9tIHRoZSBib3R0b20gb2YgLm1qci10aHVtYiBvbiBjYXJkIGhvdmVyLgogICBwb2ludGVyLWV2ZW50czogbm9uZSAgLT4gbmV2ZXIgYmxvY2tzIHZpZGVvIG1vdXNlZW50ZXIgLyBwbGF5LW9uLWhvdmVyLgogICB6LWluZGV4OiAyICAgICAgICAgICAtPiBzaXRzIGFib3ZlIHRoZSB0aHVtYm5haWwgaW1hZ2UsIGJlbG93IHRoZSBwbGF5IGljb24uCiAgIENvbnRyb2xsZWQgYnkgdGhlIC5tanItc2hvdy1ob3Zlci1pbmZvIGNsYXNzIG9uIHRoZSBncmlkIGNvbnRhaW5lciwgd2hpY2gKICAgaXMgdG9nZ2xlZCB2aWEgdGhlICJTaG93IHByb21wdCBvbiBob3ZlciIgc2V0dGluZy4KICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1jYXJkLWhvdmVyLWluZm8gewogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgYm90dG9tOiAwOwogICAgbGVmdDogMDsKICAgIHJpZ2h0OiAwOwogICAgcGFkZGluZzogMjJweCA4cHggN3B4OwogICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KHRvIGJvdHRvbSwgdHJhbnNwYXJlbnQgMCUsIHJnYmEoMCwgMCwgMCwgMC43OCkgMTAwJSk7CiAgICBjb2xvcjogI2ZmZjsKICAgIGZvbnQtc2l6ZTogMTBweDsKICAgIGxpbmUtaGVpZ2h0OiAxLjQ7CiAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgIG9wYWNpdHk6IDA7CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoNXB4KTsKICAgIHRyYW5zaXRpb246CiAgICAgICAgb3BhY2l0eSAxNTBtcyBlYXNlLAogICAgICAgIHRyYW5zZm9ybSAxNTBtcyBlYXNlOwogICAgZGlzcGxheTogZmxleDsKICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICBnYXA6IDNweDsKICAgIHotaW5kZXg6IDI7Cn0KLyogT25seSByZXZlYWwgb24gaG92ZXIgd2hlbiB0aGUgc2V0dGluZyBpcyBlbmFibGVkIChjbGFzcyBvbiBncmlkIGNvbnRhaW5lcikgKi8KLm1qci1ncmlkLm1qci1zaG93LWhvdmVyLWluZm8gLm1qci1jYXJkOmhvdmVyIC5tanItY2FyZC1ob3Zlci1pbmZvIHsKICAgIG9wYWNpdHk6IDE7CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoMCk7Cn0KLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWNhcmQtaG92ZXItaW5mbyAubWpyLWhvdmVyLXByb21wdCB7CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgZGlzcGxheTogLXdlYmtpdC1ib3g7CiAgICAtd2Via2l0LWxpbmUtY2xhbXA6IDI7CiAgICAtd2Via2l0LWJveC1vcmllbnQ6IHZlcnRpY2FsOwogICAgd29yZC1icmVhazogYnJlYWstd29yZDsKICAgIG9wYWNpdHk6IDAuOTsKICAgIGZvbnQtc2l6ZTogOS41cHg7Cn0KLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWNhcmQtaG92ZXItaW5mbyAubWpyLWhvdmVyLWdlbnRpbWUgewogICAgY29sb3I6IHJnYmEoMjU1LCAyMTAsIDEyMCwgMC45NSk7CiAgICBmb250LXdlaWdodDogNjAwOwogICAgZm9udC1zaXplOiA5cHg7CiAgICBsZXR0ZXItc3BhY2luZzogMC4wMmVtOwp9CkBtZWRpYSAocHJlZmVycy1yZWR1Y2VkLW1vdGlvbjogcmVkdWNlKSB7CiAgICAubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItY2FyZC1ob3Zlci1pbmZvIHsKICAgICAgICB0cmFuc2l0aW9uOiBvcGFjaXR5IDBtczsKICAgICAgICB0cmFuc2Zvcm06IG5vbmU7CiAgICB9Cn0KCi8qIC0tLSBDYXJkIGRldGFpbHMgcGFuZWwgc2hvdy9oaWRlIHZpYSBncmlkIGNvbnRhaW5lciBjbGFzcyAtLS0tLS0tLS0tLS0tLS0tCiAgIC5tanItc2hvdy1kZXRhaWxzIGlzIHRvZ2dsZWQgYnkgYXBwbHlHcmlkU2V0dGluZ3NDbGFzc2VzKCkgd2hlbiB0aGUKICAgIlNob3cgbWV0YWRhdGEgcGFuZWwiIHNldHRpbmcgY2hhbmdlcy4gIERlZmF1bHQgPSBPRkYg4oaSIHBhbmVsIGhpZGRlbi4KICAgSGlkaW5nIGhlcmUga2VlcHMgYWN0dWFsIHJvdyBoZWlnaHQgPSBlc3RpbWF0ZVJvd0hlaWdodChtZXRhSGVpZ2h0PTApLAogICBwcmV2ZW50aW5nIHRoZSB2aXJ0dWFsaXplciBmcm9tIHJlcG9zaXRpb25pbmcgYWxsIHJvd3Mgb24gbWVhc3VyZQogICAod2hpY2ggd2FzIHRoZSByb290IGNhdXNlIG9mIHRoZSAicmVsb2FkIGltcHJlc3Npb24iIGJsaW5rKS4KICAgTWF0Y2ggdGhlIGJvdHRvbS1mZWVkIHBhdHRlcm4gYXQgLm1qci1ib3R0b20tZmVlZCAubWpyLWNhcmQtaW5mby4KICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1ncmlkIC5tanItY2FyZC1pbmZvIHsKICAgIGRpc3BsYXk6IG5vbmU7Cn0KLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWdyaWQubWpyLXNob3ctZGV0YWlscyAubWpyLWNhcmQtaW5mbyB7CiAgICBkaXNwbGF5OiBibG9jazsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWNhcmQtbWV0YSB7CiAgICBwYWRkaW5nOiA4cHggMTBweDsKICAgIGZvbnQtc2l6ZTogMTFweDsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWNhcmQtZmlsZW5hbWUgewogICAgZm9udC13ZWlnaHQ6IDYwMDsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogOHB4OwogICAgbWluLXdpZHRoOiAwOwogICAgbWFyZ2luLWJvdHRvbTogMnB4Owp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItY2FyZC1kZXRhaWxzIHsKICAgIGNvbG9yOiB2YXIoLS1tanItbXV0ZWQpOwogICAgZm9udC1zaXplOiAxMHB4OwogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKICAgIG9wYWNpdHk6IDAuODsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWNhcmQtZmlsZW5hbWUtdGV4dCB7CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7CiAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgbWluLXdpZHRoOiAwOwp9CgovKiBSYXRpbmcgJiBUYWdzIEVkaXRvcnMgKi8KQGtleWZyYW1lcyBmYWRlSW4gewogICAgZnJvbSB7CiAgICAgICAgb3BhY2l0eTogMDsKICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTRweCk7CiAgICB9CiAgICB0byB7CiAgICAgICAgb3BhY2l0eTogMTsKICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoMCk7CiAgICB9Cn0KLyoqCiAqIEFyY2hpdmVkIENTUyBTdHlsZXMgLSBSYXRpbmcgYW5kIFRhZ3MKICogVGhlc2Ugc3R5bGVzIHdlcmUgcmVtb3ZlZCBmcm9tIHRoZW1lLWNvbWZ5LmNzcwogKi8KCi8qIEFuaW1hdGlvbnMgKi8KQGtleWZyYW1lcyBzbGlkZUluUmlnaHQgewogICAgZnJvbSB7CiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKDEwMCUpOwogICAgICAgIG9wYWNpdHk6IDA7CiAgICB9CiAgICB0byB7CiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKDApOwogICAgICAgIG9wYWNpdHk6IDE7CiAgICB9Cn0KCi8qIFBvcG92ZXJzICovCi5tanItcmF0aW5nLXBvcG92ZXIsCi5tanItdGFncy1wb3BvdmVyIHsKICAgIGFuaW1hdGlvbjogZmFkZUluIDAuMnMgZWFzZTsKfQoKLm1qci1yYXRpbmctcG9wb3ZlciwKLm1qci10YWdzLXBvcG92ZXIgewogICAgYmFja2dyb3VuZDogdmFyKC0tY29tZnktbWVudS1iZywgIzJhMmEyYSk7CiAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXItY29sb3IsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xMikpOwogICAgYm9yZGVyLXJhZGl1czogdmFyKC0tcmFkaXVzLWxnLCAwLjVyZW0pOwogICAgYm94LXNoYWRvdzogMCAxMnB4IDI4cHggcmdiYSgwLCAwLCAwLCAwLjM1KTsKICAgIHBhZGRpbmc6IDhweDsKfQoKLyogUmF0aW5nIEVkaXRvciAqLwoubWpyLXJhdGluZy1lZGl0b3IgewogICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiA0cHg7CiAgICBwYWRkaW5nOiAycHg7Cn0KCi5tanItcmF0aW5nLXN0YXIgewogICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7CiAgICBib3JkZXI6IDFweCBzb2xpZCB0cmFuc3BhcmVudDsKICAgIGJvcmRlci1yYWRpdXM6IDhweDsKICAgIGZvbnQtc2l6ZTogMjBweDsKICAgIGN1cnNvcjogcG9pbnRlcjsKICAgIHBhZGRpbmc6IDRweCA2cHg7CiAgICBsaW5lLWhlaWdodDogMTsKICAgIGNvbG9yOiB2YXIoLS1pbnB1dC10ZXh0LCAjZGRkKTsKICAgIHRyYW5zaXRpb246CiAgICAgICAgdHJhbnNmb3JtIDEyMG1zIGVhc2UsCiAgICAgICAgYmFja2dyb3VuZC1jb2xvciAxMjBtcyBlYXNlLAogICAgICAgIGJvcmRlci1jb2xvciAxMjBtcyBlYXNlLAogICAgICAgIGNvbG9yIDEyMG1zIGVhc2U7CiAgICBvdXRsaW5lOiBub25lOwp9CgoubWpyLXJhdGluZy1zdGFyOmhvdmVyIHsKICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLWNvbWZ5LWFjY2VudCwgIzVmYjNmZikgMzUlLCB0cmFuc3BhcmVudCk7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tY29tZnktbWVudS1zZWNvbmRhcnktYmcsICMzMzMpIDY1JSwgdHJhbnNwYXJlbnQpOwp9CgoubWpyLXJhdGluZy1lZGl0b3IgLm1qci1yYXRpbmctc3Rhcjpob3ZlciB7CiAgICB0cmFuc2Zvcm06IHNjYWxlKDEuMikgIWltcG9ydGFudDsKfQoKLm1qci1yYXRpbmctZWRpdG9yIC5tanItcmF0aW5nLXN0YXI6Zm9jdXMtdmlzaWJsZSB7CiAgICBvdXRsaW5lOiAycHggc29saWQgdmFyKC0tZm9jdXMtb3V0bGluZS1jb2xvciwgIzRkYWJmNyk7CiAgICBvdXRsaW5lLW9mZnNldDogMnB4OwogICAgYm9yZGVyLXJhZGl1czogMnB4Owp9CgoubWpyLXJhdGluZy1lZGl0b3IgLm1qci1yYXRpbmctc3RhcjphY3RpdmUgewogICAgdHJhbnNmb3JtOiBzY2FsZSgwLjk1KSAhaW1wb3J0YW50Owp9CgovKiBUYWdzIEVkaXRvciAqLwoubWpyLXRhZ3MtZWRpdG9yIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgZ2FwOiA4cHg7CiAgICBwYWRkaW5nOiAxMnB4OwogICAgYmFja2dyb3VuZDogdmFyKC0tbWpyLXN1cmZhY2UtMSwgdmFyKC0tY29tZnktbWVudS1iZywgIzJhMmEyYSkpOwogICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tbWpyLWJvcmRlcik7CiAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1tanItci1zbSk7CiAgICBib3gtc2hhZG93OiAwIDEycHggMjhweCByZ2JhKDAsIDAsIDAsIDAuNDUpOwogICAgbWluLXdpZHRoOiAyNTBweDsKICAgIG1heC13aWR0aDogbWluKDM1MHB4LCBjYWxjKDEwMHZ3IC0gMjBweCkpOwogICAgZm9udC1mYW1pbHk6IGluaGVyaXQ7Cn0KCi5tanItdGFncy1lZGl0b3IuaXMtZGlzYWJsZWQgewogICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICBvcGFjaXR5OiAwLjc7Cn0KCi5tanItdGFncy1kaXNwbGF5IHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBmbGV4LXdyYXA6IHdyYXA7CiAgICBnYXA6IDZweDsKICAgIG1pbi1oZWlnaHQ6IDMycHg7Cn0KCi5tanItdGFncy1lbXB0eSB7CiAgICBjb2xvcjogdmFyKC0tbWpyLW11dGVkKTsKICAgIGZvbnQtc2l6ZTogMTJweDsKICAgIGZvbnQtc3R5bGU6IGl0YWxpYzsKfQoKLm1qci10YWctY2hpcCB7CiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBnYXA6IDRweDsKICAgIHBhZGRpbmc6IDRweCA4cHg7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXRhZy1jb2xvcikgMjQlLCB0cmFuc3BhcmVudCk7CiAgICBib3JkZXI6IDFweCBzb2xpZCBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXRhZy1jb2xvcikgNDAlLCB2YXIoLS1tanItYm9yZGVyKSk7CiAgICBib3JkZXItcmFkaXVzOiAxMnB4OwogICAgZm9udC1zaXplOiAxMXB4OwogICAgY29sb3I6IHZhcigtLW1qci10YWctY29sb3IpOwogICAgdHJhbnNpdGlvbjogYWxsIDAuMnMgZWFzZTsKfQoKLm1qci10YWctY2hpcC1yZW1vdmUgewogICAgYXBwZWFyYW5jZTogbm9uZTsKICAgIC13ZWJraXQtYXBwZWFyYW5jZTogbm9uZTsKICAgIGJhY2tncm91bmQ6IG5vbmU7CiAgICBib3JkZXI6IDA7CiAgICBib3JkZXItcmFkaXVzOiAwOwogICAgYm94LXNoYWRvdzogbm9uZTsKICAgIGNvbG9yOiBpbmhlcml0OwogICAgY3Vyc29yOiBwb2ludGVyOwogICAgbWFyZ2luOiAwOwogICAgcGFkZGluZzogMDsKICAgIGZvbnQtc2l6ZTogMTRweDsKICAgIGxpbmUtaGVpZ2h0OiAxOwogICAgb3BhY2l0eTogMC43Owp9CgoubWpyLXRhZy1jaGlwLXJlbW92ZTpkaXNhYmxlZCB7CiAgICBjdXJzb3I6IGRlZmF1bHQ7Cn0KCi5tanItdGFncy1pbnB1dC13cmFwIHsKICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKfQoKLm1qci10YWctaW5wdXQgewogICAgd2lkdGg6IDEwMCU7CiAgICBwYWRkaW5nOiA2cHggOHB4OwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTIpIDc1JSwgdHJhbnNwYXJlbnQpOwogICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tbWpyLWJvcmRlcik7CiAgICBib3JkZXItcmFkaXVzOiA0cHg7CiAgICBjb2xvcjogdmFyKC0tY29udGVudC1mZyk7CiAgICBmb250LXNpemU6IDEzcHg7CiAgICBvdXRsaW5lOiBub25lOwp9CgoubWpyLXRhZy1pbnB1dDpmb2N1cyB7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMikgODglLCB0cmFuc3BhcmVudCkgIWltcG9ydGFudDsKICAgIGJvcmRlci1jb2xvcjogdmFyKC0tbWpyLWFjY2VudCkgIWltcG9ydGFudDsKfQoKLm1qci10YWctY2hpcDpob3ZlciB7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXRhZy1jb2xvcikgMzQlLCB0cmFuc3BhcmVudCkgIWltcG9ydGFudDsKICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci10YWctY29sb3IpIDYwJSwgdmFyKC0tbWpyLWJvcmRlcikpICFpbXBvcnRhbnQ7Cn0KCi5tanItdGFncy1kcm9wZG93biB7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICB0b3A6IDEwMCU7CiAgICBsZWZ0OiAwOwogICAgcmlnaHQ6IDA7CiAgICBtYXJnaW4tdG9wOiA0cHg7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1tanItc3VyZmFjZS0xLCB2YXIoLS1jb21meS1tZW51LWJnLCAjMmEyYTJhKSk7CiAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1tanItYm9yZGVyKTsKICAgIGJvcmRlci1yYWRpdXM6IDRweDsKICAgIG1heC1oZWlnaHQ6IDE1MHB4OwogICAgb3ZlcmZsb3cteTogYXV0bzsKICAgIHotaW5kZXg6IDEwMDA7Cn0KCi5tanItdGFncy1kcm9wZG93biBbZGF0YS1wYy1zZWN0aW9uPSJsaXN0Il0gewogICAgbGlzdC1zdHlsZTogbm9uZTsKICAgIG1hcmdpbjogMDsKICAgIHBhZGRpbmc6IDA7Cn0KCi5tanItdGFncy1kcm9wZG93biBbZGF0YS1wYy1zZWN0aW9uPSJvcHRpb24iXSB7CiAgICBsaXN0LXN0eWxlOiBub25lOwp9CgoubWpyLXRhZy1zdWdnZXN0aW9uIHsKICAgIHBhZGRpbmc6IDZweCA4cHg7CiAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsKICAgIGNvbG9yOiB2YXIoLS1tanItdGFnLWNvbG9yKTsKICAgIGZvbnQtc2l6ZTogMTJweDsKfQoKLm1qci10YWctc3VnZ2VzdGlvbi5pcy1hY3RpdmUsCi5tanItdGFnLXN1Z2dlc3Rpb246aG92ZXIgewogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci10YWctY29sb3IpIDI4JSwgdHJhbnNwYXJlbnQpICFpbXBvcnRhbnQ7Cn0KCi8qIEJhZGdlcyBJbnRlcmFjdGl2ZSAqLwoubWpyLXJhdGluZy1iYWRnZSwKLm1qci10YWdzLWJhZGdlIHsKICAgIHRyYW5zaXRpb246IGFsbCAwLjJzIGVhc2U7Cn0KCi5tanItcmF0aW5nLWJhZGdlIHsKICAgIGNvbG9yOiB2YXIoLS1tanItcmF0aW5nLWNvbG9yKSAhaW1wb3J0YW50Owp9CgoubWpyLXRhZ3MtYmFkZ2UgewogICAgY29sb3I6IHZhcigtLW1qci10YWctY29sb3IpICFpbXBvcnRhbnQ7Cn0KCi5tanItcmF0aW5nLWJhZGdlOmhvdmVyLAoubWpyLXRhZ3MtYmFkZ2U6aG92ZXIgewogICAgdHJhbnNmb3JtOiBzY2FsZSgxLjA1KTsKICAgIGJveC1zaGFkb3c6IDAgNHB4IDhweCByZ2JhKDAsIDAsIDAsIDAuNSk7Cn0KCi8qIFNjcm9sbGJhciBmb3IgdGFncyBkcm9wZG93biAqLwoubWpyLXRhZ3MtZHJvcGRvd246Oi13ZWJraXQtc2Nyb2xsYmFyIHsKICAgIHdpZHRoOiA2cHg7Cn0KCi5tanItdGFncy1kcm9wZG93bjo6LXdlYmtpdC1zY3JvbGxiYXItdHJhY2sgewogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTIpIDY1JSwgdHJhbnNwYXJlbnQpOwogICAgYm9yZGVyLXJhZGl1czogM3B4Owp9CgoubWpyLXRhZ3MtZHJvcGRvd246Oi13ZWJraXQtc2Nyb2xsYmFyLXRodW1iIHsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItdGFnLWNvbG9yKSA0OCUsIHZhcigtLW1qci1ib3JkZXIpKTsKICAgIGJvcmRlci1yYWRpdXM6IDNweDsKfQoKLm1qci10YWdzLWRyb3Bkb3duOjotd2Via2l0LXNjcm9sbGJhci10aHVtYjpob3ZlciB7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXRhZy1jb2xvcikgNjUlLCB2YXIoLS1tanItYm9yZGVyKSk7Cn0KCi8qIFNpZGViYXIgKGNhbiBiZSBsZWZ0IG9yIHJpZ2h0KSAqLwoubWpyLXNpZGViYXIgewogICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgei1pbmRleDogMzsKICAgIGZsZXg6IDAgMCBhdXRvOwogICAgdHJhbnNpdGlvbjogYWxsIDAuM3MgZWFzZTsKfQoKLm1qci13b3JrZmxvdy10cmVlLXdyYXAgewogICAgbWFyZ2luOiAwIDAgMTJweDsKICAgIGJvcmRlcjogMXB4IHNvbGlkIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYm9yZGVyKSA4MiUsIHRyYW5zcGFyZW50KTsKICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLW1qci1yLW1kLCA4cHgpOwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTEpIDcyJSwgdHJhbnNwYXJlbnQpOwp9CgoubWpyLXdvcmtmbG93LXRyZWUgewogICAgY29sb3I6IHZhcigtLWNvbnRlbnQtZmcsICNlYWVhZWEpOwogICAgZm9udC1zaXplOiAxMnB4Owp9CgoubWpyLXdvcmtmbG93LXRyZWUtc2Nyb2xsIHsKICAgIG92ZXJmbG93OiBhdXRvOwogICAgcGFkZGluZzogMnB4IDRweCA2cHg7Cn0KCi5tanItd29ya2Zsb3ctdHJlZS1saXN0IHsKICAgIGxpc3Qtc3R5bGU6IG5vbmU7CiAgICBtYXJnaW46IDA7CiAgICBwYWRkaW5nOiAwOwp9CgoubWpyLXdvcmtmbG93LXRyZWUtbm9kZS1jb250ZW50IHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiA2cHg7CiAgICBtaW4taGVpZ2h0OiAyOHB4OwogICAgcGFkZGluZzogNHB4IDZweDsKICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLW1qci1yLXNtLCA2cHgpOwp9CgoubWpyLXdvcmtmbG93LXRyZWUtbm9kZS1jb250ZW50OmhvdmVyIHsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0yKSA1OCUsIHRyYW5zcGFyZW50KTsKfQoKLm1qci13b3JrZmxvdy10cmVlLXRvZ2dsZSB7CiAgICB3aWR0aDogMTRweDsKICAgIGhlaWdodDogMjBweDsKICAgIHBhZGRpbmc6IDA7CiAgICBib3JkZXI6IDA7CiAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsKICAgIGNvbG9yOiB2YXIoLS1tanItbXV0ZWQsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC42NCkpOwp9CgoubWpyLXdvcmtmbG93LXRyZWUtdG9nZ2xlW2RhdGEtcC1sZWFmPSJ0cnVlIl0gewogICAgdmlzaWJpbGl0eTogaGlkZGVuOwp9CgoubWpyLXdvcmtmbG93LXRyZWUtaWNvbiB7CiAgICB3aWR0aDogOHB4OwogICAgZmxleDogMCAwIDhweDsKICAgIGNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWFjY2VudCkgNzAlLCB2YXIoLS1jb250ZW50LWZnKSk7CiAgICBmb250LXNpemU6IDdweDsKfQoKLm1qci13b3JrZmxvdy10cmVlLWxhYmVsIHsKICAgIG1pbi13aWR0aDogMDsKICAgIGZsZXg6IDEgMSBhdXRvOwp9CgoubWpyLXdvcmtmbG93LXRyZWUtbm9kZSB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogOHB4OwogICAgbWluLXdpZHRoOiAwOwp9CgoubWpyLXdvcmtmbG93LXRyZWUtbm9kZS1uYW1lIHsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7Cn0KCi5tanItd29ya2Zsb3ctdHJlZS1ub2RlLXR5cGUgewogICAgY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItbXV0ZWQpIDc1JSwgdmFyKC0tY29udGVudC1mZykpOwogICAgZm9udC1zaXplOiAxMXB4OwogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKfQoKLm1qci1zaWRlYmFyLmlzLW9wZW4gewogICAgLyogQm9yZGVyIGlzIHNldCBkeW5hbWljYWxseSBiYXNlZCBvbiBwb3NpdGlvbiAqLwp9CgoubWpyLXNpZGViYXIgLm1qci1zaWRlYmFyLWhlYWRlciB7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1tanItc3VyZmFjZS0yLCAjMzMzKTsKICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCB2YXIoLS1tanItYm9yZGVyLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTIpKTsKfQoKLm1qci1zaWRlYmFyIC5tanItc2lkZWJhci1jb250ZW50IHsKICAgIGJhY2tncm91bmQ6IHZhcigtLW1qci1zdXJmYWNlLTEsICMyYTJhMmEpOwp9CgoubWpyLXNpZGViYXIgLm1qci1zaWRlYmFyLWNvbnRlbnQ6Oi13ZWJraXQtc2Nyb2xsYmFyIHsKICAgIHdpZHRoOiA4cHg7Cn0KCi5tanItc2lkZWJhciAubWpyLXNpZGViYXItY29udGVudDo6LXdlYmtpdC1zY3JvbGxiYXItdHJhY2sgewogICAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjMpOwp9CgoubWpyLXNpZGViYXIgLm1qci1zaWRlYmFyLWNvbnRlbnQ6Oi13ZWJraXQtc2Nyb2xsYmFyLXRodW1iIHsKICAgIGJhY2tncm91bmQ6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4yKTsKICAgIGJvcmRlci1yYWRpdXM6IDRweDsKfQoKLm1qci1zaWRlYmFyIC5tanItc2lkZWJhci1jb250ZW50Ojotd2Via2l0LXNjcm9sbGJhci10aHVtYjpob3ZlciB7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMyk7Cn0KCi8qIEN1c3RvbSBSb290cyBQb3BvdmVyIFN0eWxpbmcgKi8KLm1qci1jdXN0b20tcG9wb3ZlciB7CiAgICBtaW4td2lkdGg6IDMwMHB4OwogICAgYmFja2dyb3VuZDogdmFyKC0tbWpyLXN1cmZhY2UtMSwgdmFyKC0tY29tZnktbWVudS1iZywgIzJhMmEyYSkpOwogICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tbWpyLWJvcmRlciwgdmFyKC0tYm9yZGVyLWNvbG9yLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTIpKSk7CiAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1yYWRpdXMtbGcsIDAuNXJlbSk7CiAgICBib3gtc2hhZG93OiAwIDEycHggMjhweCByZ2JhKDAsIDAsIDAsIDAuMzUpOwogICAgei1pbmRleDogdmFyKC0tbWpyLXBvcG92ZXItei1pbmRleCk7CiAgICBwYWRkaW5nOiAxMnB4Owp9CgoubWpyLWN1c3RvbS1wb3BvdmVyIC5tanItcG9wb3Zlci1yb3cgewogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBnYXA6IDEwcHg7CiAgICBtYXJnaW4tYm90dG9tOiAxMnB4OwogICAgZmxleC13cmFwOiB3cmFwOwp9CgoubWpyLWN1c3RvbS1wb3BvdmVyIC5tanItcG9wb3Zlci1yb3c6bGFzdC1jaGlsZCB7CiAgICBtYXJnaW4tYm90dG9tOiAwOwp9CgoubWpyLWN1c3RvbS1wb3BvdmVyIC5tanItcG9wb3Zlci1sYWJlbCB7CiAgICB3aWR0aDogNjBweDsKICAgIGNvbG9yOiB2YXIoLS1tanItbXV0ZWQsIHZhcigtLWRlc2NyaXAtdGV4dCwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjY1KSkpOwogICAgZm9udC1zaXplOiAxMnB4OwogICAgZm9udC13ZWlnaHQ6IDUwMDsKfQoKLm1qci1jdXN0b20tcG9wb3ZlciAubWpyLXNlbGVjdCB7CiAgICBmbGV4OiAxOwogICAgbWluLXdpZHRoOiAwOwp9CgoubWpyLWN1c3RvbS1wb3BvdmVyIC5tanItYnRuIHsKICAgIGZsZXg6IDE7CiAgICBtaW4td2lkdGg6IDA7CiAgICBtYXJnaW4tcmlnaHQ6IDVweDsKfQoKLm1qci1jdXN0b20tcG9wb3ZlciAubWpyLWJ0bjpsYXN0LWNoaWxkIHsKICAgIG1hcmdpbi1yaWdodDogMDsKfQoKLm1qci1jdXN0b20tcG9wb3ZlciAubWpyLWJ0bi5tanItcHJpbWFyeSB7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWFjY2VudCkgMTglLCB2YXIoLS1tanItc3VyZmFjZS0yKSk7CiAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYWNjZW50KSA2MCUsIHZhcigtLW1qci1ib3JkZXIpKTsKfQoKLm1qci1jdXN0b20tcG9wb3ZlciAubWpyLWJ0bi5tanItcHJpbWFyeTpob3ZlciB7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWFjY2VudCkgMjUlLCB2YXIoLS1tanItc3VyZmFjZS0yKSk7CiAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYWNjZW50KSA4MCUsIHZhcigtLW1qci1ib3JkZXIpKTsKfQoKLm1qci1zaWRlYmFyIC5tanItc2lkZWJhci1zZWN0aW9uIHsKICAgIHRyYW5zaXRpb246IGFsbCAwLjJzIGVhc2U7Cn0KCi5tanItc2lkZWJhciAubWpyLXNpZGViYXItc2VjdGlvbjpob3ZlciB7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIDAuMykgIWltcG9ydGFudDsKfQoKLyogSW5saW5lIFNpZGViYXIgKHdpZHRoLWJhc2VkIHRyYW5zaXRpb25zIGxpa2UgYXJjaGl2ZWQgdmVyc2lvbikgKi8KLm1qci1pbmxpbmUtc2lkZWJhciB7CiAgICB3aWR0aDogMDsKICAgIG1pbi13aWR0aDogMDsKICAgIG1heC13aWR0aDogNDgwcHg7CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgYmFja2dyb3VuZDogdmFyKC0tbWpyLXN1cmZhY2UtMSwgIzJhMmEyYSk7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgIHRyYW5zaXRpb246CiAgICAgICAgd2lkdGggMC4zcyBlYXNlLAogICAgICAgIG1pbi13aWR0aCAwLjNzIGVhc2U7Cn0KCi5tanItaW5saW5lLXNpZGViYXIuaXMtb3BlbiB7CiAgICB3aWR0aDogNDAwcHg7CiAgICBtaW4td2lkdGg6IDI2MHB4Owp9CgovKiBTcGFjZSBiZXR3ZWVuIHNpZGViYXIgYW5kIGdyaWQgKi8KLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFtLWJyb3dzZSB7CiAgICBnYXA6IDA7Cn0KCi8qIEJvcmRlciBiYXNlZCBvbiBwb3NpdGlvbiAqLwoubWpyLWlubGluZS1zaWRlYmFyW2RhdGEtcG9zaXRpb249ImxlZnQiXSB7CiAgICBib3JkZXItcmlnaHQ6IDFweCBzb2xpZCB2YXIoLS1tanItYm9yZGVyLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTIpKTsKfQoKLm1qci1pbmxpbmUtc2lkZWJhcltkYXRhLXBvc2l0aW9uPSJyaWdodCJdIHsKICAgIGJvcmRlci1sZWZ0OiAxcHggc29saWQgdmFyKC0tbWpyLWJvcmRlciwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEyKSk7Cn0KCi8qIFNpZGViYXIgcGxhY2Vob2xkZXIgKi8KLm1qci1zaWRlYmFyLXBsYWNlaG9sZGVyIHsKICAgIHBhZGRpbmc6IDIwcHg7CiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgICBjb2xvcjogdmFyKC0tbWpyLW11dGVkLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNjUpKTsKICAgIGZvbnQtc2l6ZTogMTRweDsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7Cn0KCi8qID09PT09PT09PT0gVmlld2VyIENvbXBvbmVudCA9PT09PT09PT09ICovCi5tanItdmlld2VyLW92ZXJsYXkgewogICAgcG9zaXRpb246IGZpeGVkOwogICAgdG9wOiAwOwogICAgbGVmdDogMDsKICAgIHJpZ2h0OiAwOwogICAgYm90dG9tOiAwOwogICAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjk1KTsKICAgIC8qIFNpdCBhYm92ZSBNRlYgKDEwMDAwKSBzbyB0aGUgZnVsbCB2aWV3ZXIgYWx3YXlzIGNvdmVycyB0aGUgZmxvYXRpbmcgcGFuZWwgKi8KICAgIHotaW5kZXg6IDEwMDAxOwogICAgcG9pbnRlci1ldmVudHM6IGF1dG87CiAgICBkaXNwbGF5OiBub25lOwogICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKfQovKiBGYWRlLWluOiBhbmltYXRpb24gcmUtdHJpZ2dlcnMgZWFjaCB0aW1lIEpTIHN3aXRjaGVzIGRpc3BsYXkgYmFjayB0byBmbGV4ICovCi5tanItdmlld2VyLW92ZXJsYXlbc3R5bGUqPSJmbGV4Il0gewogICAgYW5pbWF0aW9uOiBtanItZmFkZS1pbiAwLjE4cyBlYXNlLW91dDsKfQoKQGtleWZyYW1lcyBtanItZmFkZS1pbiB7CiAgICBmcm9tIHsKICAgICAgICBvcGFjaXR5OiAwOwogICAgICAgIHRyYW5zZm9ybTogc2NhbGUoMC45OTUpOwogICAgfQogICAgdG8gewogICAgICAgIG9wYWNpdHk6IDE7CiAgICAgICAgdHJhbnNmb3JtOiBzY2FsZSgxKTsKICAgIH0KfQoKLm1qci12aWV3ZXItaGVhZGVyIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgcGFkZGluZzogMTJweCAyMHB4OwogICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KDE3MGRlZywgcmdiYSgyNCwgMjcsIDMzLCAwLjk2KSwgcmdiYSgxNywgMTksIDI1LCAwLjk3KSk7CiAgICBib3JkZXItYm90dG9tOiAwLjhweCBzb2xpZCByZ2JhKDE5NiwgMjAyLCAyMTAsIDAuMik7CiAgICBjb2xvcjogd2hpdGU7Cn0KCi5tanItdmlld2VyLWZpbGVuYW1lIHsKICAgIGZvbnQtc2l6ZTogMTRweDsKICAgIGZvbnQtd2VpZ2h0OiA1MDA7CiAgICBtYXgtd2lkdGg6IDQwMHB4OwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKfQoKLm1qci12aWV3ZXItbW9kZS1idXR0b25zIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBnYXA6IDZweDsKfQoKLm1qci12aWV3ZXItbW9kZS1idXR0b25zIGJ1dHRvbiB7CiAgICBwYWRkaW5nOiA0cHggMTJweDsKICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgxODBkZWcsIHJnYmEoMjA2LCAyMTEsIDIxOCwgMC4xKSwgcmdiYSgyMDYsIDIxMSwgMjE4LCAwLjAzKSk7CiAgICBib3JkZXI6IDAuOHB4IHNvbGlkIHJnYmEoMTk2LCAyMDIsIDIxMCwgMC4zKTsKICAgIGNvbG9yOiByZ2JhKDIzMCwgMjMzLCAyMzgsIDAuOTUpOwogICAgYm9yZGVyLXJhZGl1czogNHB4OwogICAgY3Vyc29yOiBwb2ludGVyOwogICAgZm9udC1zaXplOiAxMnB4OwogICAgdHJhbnNpdGlvbjogYWxsIDAuMTZzOwp9CgoubWpyLXZpZXdlci1tb2RlLWJ1dHRvbnMgYnV0dG9uOmhvdmVyIHsKICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgxODBkZWcsIHJnYmEoMjEwLCAyMTQsIDIyMCwgMC4xNCksIHJnYmEoMjEwLCAyMTQsIDIyMCwgMC4wNikpOwogICAgYm9yZGVyLWNvbG9yOiByZ2JhKDIxNCwgMjE4LCAyMjQsIDAuNDIpOwp9CgovKiBWaWV3ZXIgY2xvc2UgYnV0dG9uIHBpbm5lZCB0byBvdmVybGF5IGNvcm5lciAqLwoubWpyLXZpZXdlci1jbG9zZSwKLm1qci12aWV3ZXItZnMgewogICAgYm9yZGVyLWNvbG9yOiByZ2JhKDE5NiwgMjAyLCAyMTAsIDAuMjYpICFpbXBvcnRhbnQ7CiAgICBib3JkZXItd2lkdGg6IDAuOHB4ICFpbXBvcnRhbnQ7CiAgICBiYWNrZ3JvdW5kOgogICAgICAgIGxpbmVhci1ncmFkaWVudCgxODBkZWcsIHJnYmEoMjA2LCAyMTEsIDIxOCwgMC4wOCksIHJnYmEoMjA2LCAyMTEsIDIxOCwgMC4wMikpLAogICAgICAgIHJnYmEoMjAsIDIzLCAyOSwgMC45NCkgIWltcG9ydGFudDsKICAgIGJveC1zaGFkb3c6IGluc2V0IDAgMXB4IDAgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA4KSAhaW1wb3J0YW50Owp9CgoubWpyLXZpZXdlci1jbG9zZSB7CiAgICBjb2xvcjogI2ZmZjRmNCAhaW1wb3J0YW50OwogICAgYm9yZGVyLWNvbG9yOiByZ2JhKDIwNSwgODIsIDgyLCAwLjUpICFpbXBvcnRhbnQ7CiAgICBiYWNrZ3JvdW5kOgogICAgICAgIGxpbmVhci1ncmFkaWVudCgxODBkZWcsIHJnYmEoMjA1LCA4MiwgODIsIDAuMyksIHJnYmEoMjA1LCA4MiwgODIsIDAuMTIpKSwKICAgICAgICByZ2JhKDU4LCAxOCwgMTgsIDAuOTQpICFpbXBvcnRhbnQ7CiAgICBib3gtc2hhZG93OgogICAgICAgIGluc2V0IDAgMXB4IDAgcmdiYSgyNTUsIDIxOSwgMjE5LCAwLjE2KSwKICAgICAgICAwIDAgMCAxcHggcmdiYSgyMDUsIDgyLCA4MiwgMC4wOCkgIWltcG9ydGFudDsKfQoKLm1qci12aWV3ZXItY2xvc2U6aG92ZXIgewogICAgYmFja2dyb3VuZDoKICAgICAgICBsaW5lYXItZ3JhZGllbnQoMTgwZGVnLCByZ2JhKDIzNSwgMTEwLCAxMTAsIDAuMzgpLCByZ2JhKDIzNSwgMTEwLCAxMTAsIDAuMTYpKSwKICAgICAgICByZ2JhKDcwLCAxOCwgMTgsIDAuOTcpICFpbXBvcnRhbnQ7CiAgICBib3JkZXItY29sb3I6IHJnYmEoMjM1LCAxMzgsIDEzOCwgMC42NCkgIWltcG9ydGFudDsKfQoKLm1qci12aWV3ZXItZnM6aG92ZXIgewogICAgYmFja2dyb3VuZDoKICAgICAgICBsaW5lYXItZ3JhZGllbnQoMTgwZGVnLCByZ2JhKDIxMCwgMjE0LCAyMjAsIDAuMTQpLCByZ2JhKDIxMCwgMjE0LCAyMjAsIDAuMDYpKSwKICAgICAgICByZ2JhKDIzLCAyNiwgMzIsIDAuOTUpICFpbXBvcnRhbnQ7CiAgICBib3JkZXItY29sb3I6IHJnYmEoMjE0LCAyMTgsIDIyNCwgMC4zOCkgIWltcG9ydGFudDsKfQoKLm1qci12aWV3ZXItY2xvc2UgLnBpIHsKICAgIGZvbnQtc2l6ZTogMTZweDsKICAgIGxpbmUtaGVpZ2h0OiAxOwp9CgoubWpyLXZpZXdlci1jb250ZW50IHsKICAgIGZsZXg6IDE7CiAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKfQoKLm1qci12aWV3ZXItc2luZ2xlLAoubWpyLXZpZXdlci1hYiwKLm1qci12aWV3ZXItc2lkZWJ5c2lkZSB7CiAgICB3aWR0aDogMTAwJTsKICAgIGhlaWdodDogMTAwJTsKfQoKLm1qci12aWV3ZXItc2luZ2xlIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7Cn0KCi5tanItdmlld2VyLXNpbmdsZSBpbWcsCi5tanItdmlld2VyLXNpbmdsZSB2aWRlbyB7CiAgICBtYXgtd2lkdGg6IDEwMCU7CiAgICBtYXgtaGVpZ2h0OiAxMDAlOwogICAgb2JqZWN0LWZpdDogY29udGFpbjsKICAgIHRyYW5zaXRpb246IHRyYW5zZm9ybSAwLjJzOwp9CgoubWpyLXZpZXdlci1hdWRpby1zaGVsbCB7CiAgICB3aWR0aDogMTAwJTsKICAgIGhlaWdodDogMTAwJTsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgZ2FwOiAxNHB4OwogICAgcGFkZGluZzogMThweDsKICAgIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuOSk7CiAgICBiYWNrZ3JvdW5kOgogICAgICAgIHJhZGlhbC1ncmFkaWVudChjaXJjbGUgYXQgMTglIDIyJSwgcmdiYSg3OCwgMTg0LCAyNTUsIDAuMiksIHRyYW5zcGFyZW50IDMyJSksCiAgICAgICAgcmFkaWFsLWdyYWRpZW50KGNpcmNsZSBhdCA4MiUgNzQlLCByZ2JhKDgyLCAyMjAsIDE1NiwgMC4xNSksIHRyYW5zcGFyZW50IDM2JSksCiAgICAgICAgbGluZWFyLWdyYWRpZW50KDEzNWRlZywgcmdiYSgxMiwgMTgsIDI2LCAwLjk4KSwgcmdiYSg0LCA3LCAxMSwgMC45OSkpOwp9CgoubWpyLXZpZXdlci1hdWRpby1oZWFkZXIgewogICAgd2lkdGg6IG1pbigxMDgwcHgsIDg4JSk7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgZ2FwOiAxMXB4OwogICAgbWluLXdpZHRoOiAwOwogICAgcGFkZGluZzogMCA4cHg7Cn0KCi5tanItdmlld2VyLWF1ZGlvLWljb24gewogICAgd2lkdGg6IDM0cHg7CiAgICBoZWlnaHQ6IDM0cHg7CiAgICBmbGV4OiAwIDAgYXV0bzsKICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgYm9yZGVyLXJhZGl1czogOTk5cHg7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMSk7CiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTYpOwogICAgYm94LXNoYWRvdzogMCA4cHggMjJweCByZ2JhKDAsIDAsIDAsIDAuMjYpOwp9CgoubWpyLXZpZXdlci1hdWRpby10aXRsZS13cmFwIHsKICAgIG1pbi13aWR0aDogMDsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgZ2FwOiAycHg7Cn0KCi5tanItdmlld2VyLWF1ZGlvLXRpdGxlIHsKICAgIG1heC13aWR0aDogbWluKDc2MHB4LCA3MnZ3KTsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICBmb250LXNpemU6IDEzcHg7CiAgICBmb250LXdlaWdodDogODAwOwogICAgbGluZS1oZWlnaHQ6IDEuMjU7Cn0KCi5tanItdmlld2VyLWF1ZGlvLW1ldGEgewogICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC41OCk7CiAgICBmb250LXNpemU6IDEwcHg7CiAgICBmb250LXdlaWdodDogODAwOwogICAgbGV0dGVyLXNwYWNpbmc6IDA7Cn0KCi5tanItdmlld2VyLWF1ZGlvLXZpeiB7CiAgICB3aWR0aDogbWluKDE5MjBweCwgOTYlKTsKICAgIGFzcGVjdC1yYXRpbzogMTYgLyA5OwogICAgaGVpZ2h0OiBhdXRvOwogICAgbWF4LWhlaWdodDogbWluKDEwODBweCwgNjh2aCk7CiAgICBtaW4taGVpZ2h0OiAyNjBweDsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wOSk7CiAgICBib3JkZXItcmFkaXVzOiAxNnB4OwogICAgYmFja2dyb3VuZDoKICAgICAgICBsaW5lYXItZ3JhZGllbnQoMTgwZGVnLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDQpLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDEpKSwKICAgICAgICByZ2JhKDIsIDUsIDksIDAuMjIpOwogICAgYm94LXNoYWRvdzoKICAgICAgICBpbnNldCAwIDFweCAwIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wNSksCiAgICAgICAgMCAxOHB4IDcwcHggcmdiYSgwLCAwLCAwLCAwLjMpOwp9CgoubWpyLXZpZXdlci1hdWRpby1zcmMgewogICAgd2lkdGg6IG1pbig2ODBweCwgOTAlKTsKfQoKLm1qci12aWV3ZXItYWIgewogICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgZGlzcGxheTogbm9uZTsKfQoKLm1qci12aWV3ZXItc2lkZWJ5c2lkZSB7CiAgICBkaXNwbGF5OiBub25lOwogICAgZmxleC1kaXJlY3Rpb246IHJvdzsKICAgIGdhcDogMnB4Owp9CgoubWpyLXZpZXdlci1zaWRlYnlzaWRlID4gZGl2IHsKICAgIGZsZXg6IDE7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA1KTsKfQoKLm1qci12aWV3ZXItc2lkZWJ5c2lkZSBpbWcsCi5tanItdmlld2VyLXNpZGVieXNpZGUgdmlkZW8gewogICAgbWF4LXdpZHRoOiAxMDAlOwogICAgbWF4LWhlaWdodDogMTAwJTsKICAgIG9iamVjdC1maXQ6IGNvbnRhaW47Cn0KCi5tanItdmlld2VyLWZvb3RlciB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgcGFkZGluZzogMTJweCAyMHB4OwogICAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjgpOwogICAgYm9yZGVyLXRvcDogMXB4IHNvbGlkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xKTsKICAgIGNvbG9yOiB3aGl0ZTsKICAgIGdhcDogMjBweDsKfQoKLm1qci12aWV3ZXItZm9vdGVyIGJ1dHRvbiB7CiAgICBwYWRkaW5nOiA2cHggMTJweDsKICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50OwogICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjMpOwogICAgY29sb3I6IHdoaXRlOwogICAgYm9yZGVyLXJhZGl1czogNHB4OwogICAgY3Vyc29yOiBwb2ludGVyOwogICAgZm9udC1zaXplOiAxNHB4OwogICAgdHJhbnNpdGlvbjogYWxsIDAuMnM7Cn0KCi5tanItdmlld2VyLWZvb3RlciBidXR0b246aG92ZXIgewogICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEpOwp9CgoubWpyLXZpZXdlci1uYXYgewogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBnYXA6IDE0cHg7Cn0KCi5tanItdmlld2VyLW5hdi1idG4gewogICAgd2lkdGg6IDQwcHggIWltcG9ydGFudDsKICAgIGhlaWdodDogNDBweCAhaW1wb3J0YW50OwogICAgcGFkZGluZzogMCAhaW1wb3J0YW50OwogICAgYm9yZGVyLXJhZGl1czogMTBweCAhaW1wb3J0YW50OwogICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgxOTYsIDIwMiwgMjEwLCAwLjQyKSAhaW1wb3J0YW50OwogICAgYmFja2dyb3VuZDoKICAgICAgICBsaW5lYXItZ3JhZGllbnQoMTgwZGVnLCByZ2JhKDE5NCwgMjAwLCAyMDgsIDAuMTgpLCByZ2JhKDE5NCwgMjAwLCAyMDgsIDAuMDcpKSwKICAgICAgICByZ2JhKDM0LCAzOCwgNDQsIDAuOTIpICFpbXBvcnRhbnQ7CiAgICBjb2xvcjogcmdiYSgyMzQsIDIzNiwgMjQwLCAwLjk2KSAhaW1wb3J0YW50OwogICAgZm9udC1zaXplOiAyMHB4ICFpbXBvcnRhbnQ7CiAgICBmb250LXdlaWdodDogNzAwICFpbXBvcnRhbnQ7CiAgICBsaW5lLWhlaWdodDogMSAhaW1wb3J0YW50OwogICAgdGV4dC1zaGFkb3c6IG5vbmU7CiAgICBib3gtc2hhZG93OiBpbnNldCAwIDFweCAwIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xNCk7CiAgICB0cmFuc2l0aW9uOgogICAgICAgIHRyYW5zZm9ybSAwLjE0cyBlYXNlLAogICAgICAgIGJhY2tncm91bmQtY29sb3IgMC4xNHMgZWFzZSwKICAgICAgICBib3JkZXItY29sb3IgMC4xNHMgZWFzZSAhaW1wb3J0YW50Owp9CgoubWpyLXZpZXdlci1uYXYtYnRuOmhvdmVyOm5vdCg6ZGlzYWJsZWQpIHsKICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtMXB4KTsKICAgIGJvcmRlci1jb2xvcjogcmdiYSgyMTQsIDIxOCwgMjI0LCAwLjU2KSAhaW1wb3J0YW50OwogICAgYmFja2dyb3VuZDoKICAgICAgICBsaW5lYXItZ3JhZGllbnQoMTgwZGVnLCByZ2JhKDIwNywgMjEyLCAyMTksIDAuMiksIHJnYmEoMjA3LCAyMTIsIDIxOSwgMC4xKSksCiAgICAgICAgcmdiYSgzOSwgNDMsIDQ5LCAwLjk0KSAhaW1wb3J0YW50OwogICAgYm94LXNoYWRvdzogaW5zZXQgMCAxcHggMCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMik7Cn0KCi5tanItdmlld2VyLW5hdi1idG46YWN0aXZlOm5vdCg6ZGlzYWJsZWQpIHsKICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgwKSBzY2FsZSgwLjk4KTsKICAgIGZpbHRlcjogbm9uZTsKfQoKLm1qci12aWV3ZXItbmF2LWJ0bjpkaXNhYmxlZCB7CiAgICBvcGFjaXR5OiAwLjM0ICFpbXBvcnRhbnQ7CiAgICBmaWx0ZXI6IGdyYXlzY2FsZSgwLjI1KTsKICAgIGJveC1zaGFkb3c6IG5vbmU7CiAgICBib3JkZXItY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xNCkgIWltcG9ydGFudDsKfQoKLm1qci12aWV3ZXItaW5kZXggewogICAgZm9udC1zaXplOiAxM3B4OwogICAgbWluLXdpZHRoOiA3NHB4OwogICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgZm9udC12YXJpYW50LW51bWVyaWM6IHRhYnVsYXItbnVtczsKICAgIGxldHRlci1zcGFjaW5nOiAwLjA0ZW07CiAgICBjb2xvcjogcmdiYSgyMjYsIDIyOCwgMjMzLCAwLjk0KTsKICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgxODBkZWcsIHJnYmEoMTk3LCAyMDMsIDIxMSwgMC4xNSksIHJnYmEoMTk3LCAyMDMsIDIxMSwgMC4wNikpOwogICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgxOTcsIDIwMywgMjExLCAwLjM0KTsKICAgIGJvcmRlci1yYWRpdXM6IDk5OXB4OwogICAgcGFkZGluZzogNXB4IDExcHg7CiAgICB0ZXh0LXNoYWRvdzogbm9uZTsKICAgIGJveC1zaGFkb3c6IGluc2V0IDAgMXB4IDAgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE4KTsKfQoKLm1qci12aWV3ZXItcGxheWVyYmFyIHsKICAgIGJvcmRlci1yYWRpdXM6IDE4cHg7CiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDE5NCwgMjAwLCAyMDgsIDAuMTYpOwogICAgYmFja2dyb3VuZDoKICAgICAgICByYWRpYWwtZ3JhZGllbnQoY2lyY2xlIGF0IHRvcCBsZWZ0LCByZ2JhKDkwLCAxNTAsIDI1NSwgMC4wOCksIHRyYW5zcGFyZW50IDM2JSksCiAgICAgICAgbGluZWFyLWdyYWRpZW50KDE2MGRlZywgcmdiYSgyMCwgMjQsIDMwLCAwLjk0KSwgcmdiYSgxMiwgMTUsIDIxLCAwLjk4KSk7CiAgICBib3gtc2hhZG93OgogICAgICAgIGluc2V0IDAgMXB4IDAgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA1KSwKICAgICAgICAwIDE2cHggMzZweCByZ2JhKDAsIDAsIDAsIDAuMjIpOwogICAgLyogb3ZlcmZsb3cgbXVzdCBzdGF5IHZpc2libGUgc28gdGhlIHNlZWsgcnVsZXIgdGlja3MvbGFiZWxzICh0b3A6LTE2cHggLyB0b3A6LTM0cHgpCiAgICAgICB0aGF0IGFyZSBhYnNvbHV0ZWx5IHBvc2l0aW9uZWQgYWJvdmUgdGhlIHNlZWsgYmFyIGFyZSBub3QgY2xpcHBlZC4gKi8KICAgIG92ZXJmbG93OiB2aXNpYmxlOwp9CgoubWpyLXZpZXdlci10b29scyB7CiAgICBhbGlnbi1pdGVtczogc3RhcnQ7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IHN0cmV0Y2g7CiAgICBnYXA6IDhweDsKfQoKLm1qci12aWV3ZXItaGVhZGVyIHsKICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKfQoKLm1qci12aWV3ZXItaGVhZGVyOjphZnRlciB7CiAgICBjb250ZW50OiAiIjsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIGxlZnQ6IDE4cHg7CiAgICByaWdodDogMThweDsKICAgIHRvcDogNDRweDsKICAgIGhlaWdodDogMXB4OwogICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KDkwZGVnLCB0cmFuc3BhcmVudCwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA4KSwgdHJhbnNwYXJlbnQpOwogICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICBvcGFjaXR5OiAwLjc7Cn0KCi5tanItdmlld2VyLWhlYWRlci1tZXRhIHsKICAgIG1pbi1oZWlnaHQ6IDMwcHg7CiAgICBwYWRkaW5nOiA0cHggOHB4OwogICAgYm9yZGVyLXJhZGl1czogMTBweDsKICAgIGJhY2tncm91bmQ6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wMzUpOwogICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA2KTsKfQoKLm1qci12aWV3ZXItaGVhZGVyLXRvcCB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgZ2FwOiAxMHB4OwogICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgcGFkZGluZy1yaWdodDogODRweDsKICAgIHBhZGRpbmctbGVmdDogMTJweDsKfQoKLm1qci12aWV3ZXItaGVhZGVyLWFyZWEtLWxlZnQgewogICAgZGlzcGxheTogbm9uZTsKICAgIGZsZXg6IDEgMSAwOwogICAgbWluLXdpZHRoOiAwOwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKfQoKLm1qci12aWV3ZXItaGVhZGVyLWFyZWEtLWNlbnRlciB7CiAgICBtaW4td2lkdGg6IDA7CiAgICBmbGV4OiAxIDEgYXV0bzsKfQoKLm1qci12aWV3ZXItaGVhZGVyLWFyZWEtLXJpZ2h0IHsKICAgIGp1c3RpZnktY29udGVudDogZmxleC1lbmQ7CiAgICBmbGV4OiAxIDEgMDsKICAgIG1pbi13aWR0aDogMDsKICAgIG92ZXJmbG93OiBoaWRkZW47Cn0KCi5tanItdmlld2VyLXRpdGxlLXdyYXAgewogICAgd2lkdGg6IGF1dG87CiAgICBtaW4td2lkdGg6IDA7CiAgICBtYXgtd2lkdGg6IG1pbigxMDAlLCBjYWxjKDEwMHZ3IC0gMjIwcHgpKTsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICBnYXA6IDEycHg7Cn0KCi5tanItdmlld2VyLXRpdGxlLWxpbmUgewogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgIGdhcDogNnB4OwogICAgbWluLXdpZHRoOiAwOwogICAgZmxleC13cmFwOiBub3dyYXA7CiAgICBvdmVyZmxvdzogaGlkZGVuOwp9CgoubWpyLXZpZXdlci1maWxlbmFtZSB7CiAgICBmb250LXNpemU6IDEzcHg7CiAgICBmb250LXdlaWdodDogNjAwOwogICAgbGV0dGVyLXNwYWNpbmc6IDAuMDFlbTsKICAgIGRpc3BsYXk6IGJsb2NrOwogICAgbWFyZ2luOiAwIGF1dG87CiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7Cn0KCi5tanItdmlld2VyLWJhZGdlcyB7CiAgICBnYXA6IDRweDsKfQoKLm1qci12aWV3ZXItdGl0bGUtbGluZSAubWpyLXZpZXdlci1iYWRnZXMgewogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICBmbGV4LXdyYXA6IG5vd3JhcDsKICAgIG1pbi13aWR0aDogMDsKfQoKLm1qci12aWV3ZXItaGVhZGVyLW1ldGEtLWxlZnQgewogICAganVzdGlmeS1jb250ZW50OiBmbGV4LXN0YXJ0OwogICAgd2lkdGg6IGZpdC1jb250ZW50OwogICAgbWF4LXdpZHRoOiAxMDAlOwp9CgoubWpyLXZpZXdlci1oZWFkZXItbWV0YS0tbGVmdDplbXB0eSB7CiAgICBkaXNwbGF5OiBub25lOwp9CgoubWpyLXZpZXdlci1oZWFkZXItbWV0YS0tcmlnaHQgewogICAganVzdGlmeS1zZWxmOiBlbmQ7CiAgICB3aWR0aDogZml0LWNvbnRlbnQ7CiAgICBtYXgtd2lkdGg6IDEwMCU7Cn0KCi5tanItdmlld2VyLW1vZGUtYnV0dG9ucyB7CiAgICBmbGV4OiAwIDAgYXV0bzsKICAgIHBhZGRpbmc6IDNweDsKICAgIGJvcmRlci1yYWRpdXM6IDk5OXB4OwogICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA0KTsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wOCk7CiAgICBib3gtc2hhZG93OiBpbnNldCAwIDFweCAwIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wNCk7Cn0KCi5tanItdmlld2VyLXRvb2xzLWRlY2sgewogICAgZGlzcGxheTogZmxleDsKICAgIGZsZXgtd3JhcDogbm93cmFwOwogICAgZ2FwOiA4cHg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgbWluLXdpZHRoOiAwOwogICAgb3ZlcmZsb3cteDogYXV0bzsKICAgIG92ZXJmbG93LXk6IGhpZGRlbjsKICAgIHNjcm9sbGJhci13aWR0aDogdGhpbjsKfQoKLm1qci12aWV3ZXItdG9vbHMtcGFuZWwgewogICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgbWluLXdpZHRoOiBhdXRvOwogICAgbWluLWhlaWdodDogMDsKICAgIGJvcmRlci1yYWRpdXM6IDEwcHg7CiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDgpOwogICAgYmFja2dyb3VuZDoKICAgICAgICBsaW5lYXItZ3JhZGllbnQoMTgwZGVnLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDUpLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDIpKSwKICAgICAgICByZ2JhKDEwLCAxMiwgMTYsIDAuMjQpOwogICAgYm94LXNoYWRvdzoKICAgICAgICBpbnNldCAwIDFweCAwIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wNCksCiAgICAgICAgMCA2cHggMTZweCByZ2JhKDAsIDAsIDAsIDAuMTIpOwogICAgcGFkZGluZzogNXB4IDZweDsKICAgIGZsZXg6IDAgMCBhdXRvOwp9CgoubWpyLXZpZXdlci10b29scy1wYW5lbDo6YmVmb3JlIHsKICAgIGNvbnRlbnQ6ICIiOwogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgaW5zZXQ6IDAgMCBhdXRvIDA7CiAgICBoZWlnaHQ6IDFweDsKICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCg5MGRlZywgdHJhbnNwYXJlbnQsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xNiksIHRyYW5zcGFyZW50KTsKICAgIG9wYWNpdHk6IDAuNzsKICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwp9CgoubWpyLXZpZXdlci10b29scy1wYW5lbC1oZWFkIHsKICAgIGRpc3BsYXk6IG5vbmU7Cn0KCi5tanItdmlld2VyLXRvb2xzLXBhbmVsLWhlYWRpbmcgewogICAgZGlzcGxheTogZmxleDsKICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICBnYXA6IDFweDsKICAgIG1pbi13aWR0aDogMDsKfQoKLm1qci12aWV3ZXItdG9vbHMtcGFuZWwtZXllYnJvdyB7CiAgICBmb250LXNpemU6IDlweDsKICAgIGZvbnQtd2VpZ2h0OiA3MDA7CiAgICBsZXR0ZXItc3BhY2luZzogMC4xNGVtOwogICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKICAgIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNDYpOwp9CgoubWpyLXZpZXdlci10b29scy1wYW5lbC10aXRsZSB7CiAgICBmb250LXNpemU6IDEycHg7CiAgICBmb250LXdlaWdodDogNjAwOwogICAgbGV0dGVyLXNwYWNpbmc6IDAuMDFlbTsKICAgIGNvbG9yOiByZ2JhKDI0OCwgMjUwLCAyNTIsIDAuOTYpOwp9CgoubWpyLXZpZXdlci10b29scy1wYW5lbC1ib2R5IHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZmxleC13cmFwOiBub3dyYXA7CiAgICBnYXA6IDZweDsKICAgIG1pbi13aWR0aDogMDsKfQoKLm1qci12aWV3ZXItdG9vbHMtcGFuZWxbZGF0YS1wYW5lbD0iZ3JhZGUiXSAubWpyLXZpZXdlci10b29scy1wYW5lbC1ib2R5IHsKICAgIGRpc3BsYXk6IGZsZXg7Cn0KCi5tanItdmlld2VyLXRvb2xzLXBhbmVsW2RhdGEtcGFuZWw9Im92ZXJsYXkiXSAubWpyLXZpZXdlci10b29scy1wYW5lbC1ib2R5IHsKICAgIGRpc3BsYXk6IGZsZXg7Cn0KCi5tanItdmlld2VyLXRvb2xzLXBhbmVsW2RhdGEtcGFuZWw9Imluc3BlY3QiXSAubWpyLXZpZXdlci10b29scy1wYW5lbC1ib2R5LAoubWpyLXZpZXdlci10b29scy1wYW5lbFtkYXRhLXBhbmVsPSJhY3Rpb25zIl0gLm1qci12aWV3ZXItdG9vbHMtcGFuZWwtYm9keSwKLm1qci12aWV3ZXItdG9vbHMtcGFuZWxbZGF0YS1wYW5lbD0iaW5mbyJdIC5tanItdmlld2VyLXRvb2xzLXBhbmVsLWJvZHkgewogICAgZGlzcGxheTogZmxleDsKfQoKLm1qci12aWV3ZXItdG9vbHMtZ3JvdXAgewogICAgd2lkdGg6IGF1dG87CiAgICBtaW4taGVpZ2h0OiAzMHB4OwogICAgcGFkZGluZzogNXB4IDdweDsKICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogZmxleC1zdGFydDsKICAgIGdhcDogNnB4OwogICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgxOTYsIDIwMiwgMjEwLCAwLjEyKTsKICAgIGJvcmRlci1yYWRpdXM6IDEwcHg7CiAgICBiYWNrZ3JvdW5kOgogICAgICAgIGxpbmVhci1ncmFkaWVudCgxODBkZWcsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wMzUpLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDIpKSwKICAgICAgICByZ2JhKDEwLCAxMiwgMTYsIDAuMTgpOwogICAgYm94LXNoYWRvdzogaW5zZXQgMCAxcHggMCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDMpOwogICAgbWluLXdpZHRoOiBmaXQtY29udGVudDsKfQoKLm1qci12aWV3ZXItdG9vbHMtZ3JvdXAtbGFiZWwgewogICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC43NSk7CiAgICBsZXR0ZXItc3BhY2luZzogMC4xNXB4OwogICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgbWFyZ2luLXJpZ2h0OiA1cHg7CiAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgZm9udC1zaXplOiAxMHB4Owp9CgoubWpyLXZpZXdlci10b29scy1ncm91cFtzdHlsZSo9Ii0tbWpyLWdyb3VwLWFjY2VudCJdIC5tanItdmlld2VyLXRvb2xzLWdyb3VwLWxhYmVsIHsKICAgIGNvbG9yOiByZ2JhKHZhcigtLW1qci1ncm91cC1hY2NlbnQpLCAwLjkpOwp9CgoubWpyLXZpZXdlci10b29scy1ncm91cFtzdHlsZSo9Ii0tbWpyLWdyb3VwLWFjY2VudCJdIHsKICAgIGJvcmRlci1jb2xvcjogcmdiYSh2YXIoLS1tanItZ3JvdXAtYWNjZW50KSwgMC4zNSk7Cn0KCi5tanItdmlld2VyLXRvb2xzLWdyb3VwW2RhdGEtZ3JvdXA9ImNoYW5uZWwiXSAubWpyLXZpZXdlci10b29scy1ncm91cC1sYWJlbCwKLm1qci12aWV3ZXItdG9vbHMtZ3JvdXBbZGF0YS1ncm91cD0iYW5hbHlzaXMiXSAubWpyLXZpZXdlci10b29scy1ncm91cC1sYWJlbCwKLm1qci12aWV3ZXItdG9vbHMtZ3JvdXBbZGF0YS1ncm91cD0ib3ZlcmxheS1ndWlkZXMiXSAubWpyLXZpZXdlci10b29scy1ncm91cC1sYWJlbCwKLm1qci12aWV3ZXItdG9vbHMtZ3JvdXBbZGF0YS1ncm91cD0ib3ZlcmxheS1pbnNwZWN0Il0gLm1qci12aWV3ZXItdG9vbHMtZ3JvdXAtbGFiZWwgewogICAgbWluLXdpZHRoOiA0MnB4Owp9CgoubWpyLXZpZXdlci10b29scy1wYW5lbFtkYXRhLXBhbmVsPSJvdmVybGF5Il0gLm1qci12aWV3ZXItdG9vbHMtZ3JvdXBbZGF0YS1ncm91cD0ib3ZlcmxheS1ndWlkZXMiXSB7CiAgICBmbGV4OiAwIDAgYXV0bzsKfQoKLm1qci12aWV3ZXItdG9vbHMtZ3JvdXBbZGF0YS1ncm91cD0ib3ZlcmxheS1ndWlkZXMiXSwKLm1qci12aWV3ZXItdG9vbHMtZ3JvdXBbZGF0YS1ncm91cD0ib3ZlcmxheS1pbnNwZWN0Il0gewogICAgZmxleC13cmFwOiB3cmFwOwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogZmxleC1zdGFydDsKICAgIGFsaWduLWNvbnRlbnQ6IGNlbnRlcjsKfQoKLm1qci12aWV3ZXItdG9vbHMtZ3JvdXBbZGF0YS1ncm91cD0iY2hhbm5lbCJdLAoubWpyLXZpZXdlci10b29scy1ncm91cFtkYXRhLWdyb3VwPSJleHBvc3VyZSJdLAoubWpyLXZpZXdlci10b29scy1ncm91cFtkYXRhLWdyb3VwPSJnYW1tYSJdLAoubWpyLXZpZXdlci10b29scy1ncm91cFtkYXRhLWdyb3VwPSJhbmFseXNpcyJdLAoubWpyLXZpZXdlci10b29scy1ncm91cFtkYXRhLWdyb3VwPSJjb21wYXJlIl0sCi5tanItdmlld2VyLXRvb2xzLWdyb3VwW2RhdGEtZ3JvdXA9ImF1ZGlvLXZpeiJdIHsKICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsKfQoKLm1qci12aWV3ZXItdG9vbHMtYWN0aW9ucywKLm1qci12aWV3ZXItdG9vbHMtbWV0YSB7CiAgICB3aWR0aDogYXV0bzsKICAgIG1pbi1oZWlnaHQ6IDMwcHg7CiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94OwogICAgcGFkZGluZzogNXB4IDdweDsKICAgIGJvcmRlci1yYWRpdXM6IDEwcHg7CiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDYpOwogICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjAzKTsKfQoKLm1qci12aWV3ZXItdG9vbHMtYWN0aW9ucyB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogZmxleC1zdGFydDsKICAgIGdhcDogNnB4OwogICAgZmxleC13cmFwOiB3cmFwOwogICAgbWluLXdpZHRoOiAwOwp9CgoubWpyLXZpZXdlci10b29scy1tZXRhIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOwogICAgZ2FwOiA2cHg7CiAgICBmbGV4LXdyYXA6IHdyYXA7CiAgICBtaW4td2lkdGg6IDA7Cn0KCi5tanItdmlld2VyLXRvb2xzLWFjdGlvbi0tcHJpbWFyeSB7CiAgICBtYXJnaW4tbGVmdDogMDsKfQoKLm1qci12aWV3ZXItdG9vbHMtYWN0aW9uICsgLm1qci12aWV3ZXItdG9vbHMtYWN0aW9uIHsKICAgIG1hcmdpbi1sZWZ0OiA0cHg7Cn0KCi5tanItdmlld2VyLXRvb2xzLXNlbGVjdCB7CiAgICBtaW4taGVpZ2h0OiAyNHB4Owp9CgoubWpyLXZpZXdlci10b29scy1yYW5nZS1pbnB1dCB7CiAgICB3aWR0aDogOTJweCAhaW1wb3J0YW50Owp9CgoubWpyLXZpZXdlci10b29scy1yYW5nZSBzcGFuIHsKICAgIGZvbnQtc2l6ZTogMTFweDsKfQoKQG1lZGlhIChtYXgtd2lkdGg6IDE0ODBweCkgewogICAgLm1qci12aWV3ZXItdG9vbHMtZGVjayB7CiAgICAgICAgZ2FwOiA2cHg7CiAgICB9Cn0KCkBtZWRpYSAobWF4LXdpZHRoOiAxMjIwcHgpIHsKICAgIC5tanItdmlld2VyLWhlYWRlci10b3AgewogICAgICAgIGZsZXgtd3JhcDogd3JhcDsKICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgICAgICBwYWRkaW5nLXJpZ2h0OiA4NHB4OwogICAgICAgIHBhZGRpbmctbGVmdDogMDsKICAgIH0KCiAgICAubWpyLXZpZXdlci1oZWFkZXItYXJlYS0tY2VudGVyLAogICAgLm1qci12aWV3ZXItaGVhZGVyLWFyZWEtLXJpZ2h0IHsKICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgIH0KCiAgICAubWpyLXZpZXdlci1oZWFkZXItYXJlYS0tY2VudGVyIHsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBmbGV4OiAxIDEgMTAwJTsKICAgIH0KCiAgICAubWpyLXZpZXdlci1oZWFkZXItYXJlYS0tcmlnaHQgewogICAgICAgIHBvc2l0aW9uOiBzdGF0aWM7CiAgICAgICAgdHJhbnNmb3JtOiBub25lOwogICAgICAgIG1heC13aWR0aDogMTAwJTsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBmbGV4OiAxIDEgMTAwJTsKICAgIH0KCiAgICAubWpyLXZpZXdlci1oZWFkZXItbWV0YS0tcmlnaHQgewogICAgICAgIGp1c3RpZnktc2VsZjogY2VudGVyOwogICAgfQoKICAgIC5tanItdmlld2VyLXRvb2xzLWRlY2sgewogICAgICAgIGZsZXgtd3JhcDogd3JhcDsKICAgICAgICBvdmVyZmxvdy14OiB2aXNpYmxlOwogICAgfQoKICAgIC5tanItdmlld2VyLXRvb2xzLXBhbmVsLAogICAgLm1qci12aWV3ZXItdG9vbHMtYWN0aW9ucywKICAgIC5tanItdmlld2VyLXRvb2xzLW1ldGEsCiAgICAubWpyLXZpZXdlci10b29scy1wYW5lbC1ib2R5IHsKICAgICAgICBmbGV4LXdyYXA6IHdyYXA7CiAgICB9CgogICAgLm1qci12aWV3ZXItdG9vbHMtbWV0YSB7CiAgICAgICAganVzdGlmeS1jb250ZW50OiBmbGV4LXN0YXJ0OwogICAgfQp9CgoubWpyLXZpZXdlci10b29scy1ncm91cFtkYXRhLWdyb3VwPSJjb21wYXJlIl1bZGF0YS1hY3RpdmU9IjEiXSB7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKHZhcigtLW1qci1ncm91cC1hY2NlbnQpLCAwLjEpOwogICAgYm9yZGVyLWxlZnQtY29sb3I6IHJnYmEodmFyKC0tbWpyLWdyb3VwLWFjY2VudCksIDAuNik7CiAgICBib3JkZXItcmFkaXVzOiAxMHB4OwogICAgcGFkZGluZzogNnB4IDEwcHg7CiAgICBib3gtc2hhZG93OiBpbnNldCAwIDAgMCAxcHggcmdiYSh2YXIoLS1tanItZ3JvdXAtYWNjZW50KSwgMC4yMik7Cn0KCi5tanItdmlld2VyLXRvb2xzLWdyb3VwW2RhdGEtZ3JvdXA9ImNvbXBhcmUiXVtkYXRhLWFjdGl2ZT0iMSJdIC5tanItdmlld2VyLXRvb2xzLXNlbGVjdCB7CiAgICBib3JkZXItY29sb3I6IHJnYmEodmFyKC0tbWpyLWdyb3VwLWFjY2VudCksIDAuNik7CiAgICBib3gtc2hhZG93OiAwIDAgMCAycHggcmdiYSh2YXIoLS1tanItZ3JvdXAtYWNjZW50KSwgMC4xOCk7Cn0KCi5tanItdmlld2VyLXRvb2xzLXNlbGVjdDpmb2N1cyB7CiAgICBvdXRsaW5lOiBub25lOwogICAgYm94LXNoYWRvdzogMCAwIDAgMnB4IHJnYmEoNjQsIDE2MCwgMjU1LCAwLjIyKTsKfQoKLyogTmF0aXZlIGRyb3Bkb3duczogaGludCBkYXJrIFVJIGFuZCBzdHlsZSBvcHRpb25zIHdoZW4gdGhlIGJyb3dzZXIgYWxsb3dzIGl0LiAqLwoubWpyLXZpZXdlci1oZWFkZXIgewogICAgY29sb3Itc2NoZW1lOiBkYXJrOwp9CgoubWpyLXZpZXdlci10b29scy1zZWxlY3QgewogICAgbWluLWhlaWdodDogMjRweDsKICAgIGJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgMC40NikgIWltcG9ydGFudDsKICAgIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuOTIpICFpbXBvcnRhbnQ7CiAgICBib3JkZXItY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xNCkgIWltcG9ydGFudDsKICAgIGJvcmRlci1yYWRpdXM6IDhweCAhaW1wb3J0YW50Owp9CgoubWpyLXZpZXdlci10b29scy1zZWxlY3Qgb3B0aW9uIHsKICAgIGJhY2tncm91bmQ6IHZhcigtLWNvbWZ5LW1lbnUtYmcsICMyYTJhMmEpOwogICAgY29sb3I6IHZhcigtLWNvbnRlbnQtZmcsIHZhcigtLWlucHV0LXRleHQsICNkZGQpKTsKfQoKLm1qci12aWV3ZXItdG9vbHMtcmFuZ2UtaW5wdXQ6Zm9jdXMgewogICAgb3V0bGluZTogbm9uZTsKfQoKLm1qci12aWV3ZXItdG9vbC1idG4tLXJlc2V0IHsKICAgIGJvcmRlci1jb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjIyKSAhaW1wb3J0YW50Owp9CgoubWpyLXZpZXdlci10b29sLWJ0biB7CiAgICBtaW4taGVpZ2h0OiAyNHB4ICFpbXBvcnRhbnQ7CiAgICBib3JkZXItcmFkaXVzOiA4cHggIWltcG9ydGFudDsKICAgIGJvcmRlci13aWR0aDogMXB4ICFpbXBvcnRhbnQ7CiAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoCiAgICAgICAgMTgwZGVnLAogICAgICAgIHJnYmEoMjEwLCAyMTQsIDIyMCwgMC4wNzUpLAogICAgICAgIHJnYmEoMjEwLCAyMTQsIDIyMCwgMC4wMjUpCiAgICApICFpbXBvcnRhbnQ7CiAgICBib3JkZXItY29sb3I6IHJnYmEoMTk2LCAyMDIsIDIxMCwgMC4xNikgIWltcG9ydGFudDsKICAgIGJveC1zaGFkb3c6IGluc2V0IDAgMXB4IDAgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA1KTsKICAgIGZvbnQtc2l6ZTogMTFweCAhaW1wb3J0YW50OwogICAgcGFkZGluZzogMCA4cHggIWltcG9ydGFudDsKfQoKLm1qci12aWV3ZXItdG9vbC1idG46aG92ZXIgewogICAgYm9yZGVyLWNvbG9yOiByZ2JhKDIyMCwgMjI0LCAyMzAsIDAuMjQpICFpbXBvcnRhbnQ7CiAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoCiAgICAgICAgMTgwZGVnLAogICAgICAgIHJnYmEoMjIwLCAyMjQsIDIzMCwgMC4xKSwKICAgICAgICByZ2JhKDIyMCwgMjI0LCAyMzAsIDAuMDM1KQogICAgKSAhaW1wb3J0YW50Owp9CgoubWpyLXZpZXdlci10b29scy1ncm91cFtkYXRhLWdyb3VwPSJhbmFseXNpcyJdIC5tanItdmlld2VyLXRvb2wtYnRuW2RhdGEtYWN0aXZlPSIxIl0gewogICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KAogICAgICAgIDE4MGRlZywKICAgICAgICByZ2JhKDI1NSwgMTY2LCA5MiwgMC4yMiksCiAgICAgICAgcmdiYSgyNTUsIDExNiwgNjQsIDAuMDgpCiAgICApICFpbXBvcnRhbnQ7CiAgICBib3JkZXItY29sb3I6IHJnYmEoMjU1LCAxNjAsIDkyLCAwLjM0KSAhaW1wb3J0YW50OwogICAgY29sb3I6IHJnYmEoMjU1LCAyMzYsIDIyNCwgMC45NikgIWltcG9ydGFudDsKfQoKLm1qci12aWV3ZXItdG9vbHMtZ3JvdXBbZGF0YS1ncm91cD0iYW5hbHlzaXMiXSAubWpyLXZpZXdlci10b29sLWJ0bltkYXRhLWFjdGl2ZT0iMSJdOmhvdmVyIHsKICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgKICAgICAgICAxODBkZWcsCiAgICAgICAgcmdiYSgyNTUsIDE4MCwgMTA4LCAwLjI4KSwKICAgICAgICByZ2JhKDI1NSwgMTI4LCA3MiwgMC4xNCkKICAgICkgIWltcG9ydGFudDsKICAgIGJvcmRlci1jb2xvcjogcmdiYSgyNTUsIDE4NCwgMTE2LCAwLjQ2KSAhaW1wb3J0YW50Owp9CgoubWpyLXZpZXdlci10b29scy1ncm91cFtkYXRhLWdyb3VwPSJvdmVybGF5LWd1aWRlcyJdIC5tanItdmlld2VyLXRvb2wtYnRuW2RhdGEtYWN0aXZlPSIxIl0gewogICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KAogICAgICAgIDE4MGRlZywKICAgICAgICByZ2JhKDkyLCAyMTksIDE4NiwgMC4yMiksCiAgICAgICAgcmdiYSg0NCwgMTcwLCAxNDQsIDAuMDgpCiAgICApICFpbXBvcnRhbnQ7CiAgICBib3JkZXItY29sb3I6IHJnYmEoOTIsIDIxOSwgMTg2LCAwLjM0KSAhaW1wb3J0YW50OwogICAgY29sb3I6IHJnYmEoMjI0LCAyNTUsIDI0OCwgMC45NikgIWltcG9ydGFudDsKfQoKLm1qci12aWV3ZXItdG9vbHMtZ3JvdXBbZGF0YS1ncm91cD0ib3ZlcmxheS1ndWlkZXMiXSAubWpyLXZpZXdlci10b29sLWJ0bltkYXRhLWFjdGl2ZT0iMSJdOmhvdmVyIHsKICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgKICAgICAgICAxODBkZWcsCiAgICAgICAgcmdiYSgxMDIsIDIzMCwgMTk2LCAwLjI4KSwKICAgICAgICByZ2JhKDUyLCAxODIsIDE1NiwgMC4xNCkKICAgICkgIWltcG9ydGFudDsKICAgIGJvcmRlci1jb2xvcjogcmdiYSgxMTAsIDIzNiwgMjAyLCAwLjQ2KSAhaW1wb3J0YW50Owp9CgoubWpyLXZpZXdlci10b29scy1ncm91cFtkYXRhLWdyb3VwPSJvdmVybGF5LWluc3BlY3QiXSAubWpyLXZpZXdlci10b29sLWJ0bltkYXRhLWFjdGl2ZT0iMSJdIHsKICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgKICAgICAgICAxODBkZWcsCiAgICAgICAgcmdiYSgxMjQsIDE2NiwgMjU1LCAwLjIyKSwKICAgICAgICByZ2JhKDEwOSwgODgsIDIyMiwgMC4wOCkKICAgICkgIWltcG9ydGFudDsKICAgIGJvcmRlci1jb2xvcjogcmdiYSgxMzIsIDE3MCwgMjU1LCAwLjM2KSAhaW1wb3J0YW50OwogICAgY29sb3I6IHJnYmEoMjM2LCAyNDIsIDI1NSwgMC45NykgIWltcG9ydGFudDsKfQoKLm1qci12aWV3ZXItdG9vbHMtZ3JvdXBbZGF0YS1ncm91cD0ib3ZlcmxheS1pbnNwZWN0Il0gLm1qci12aWV3ZXItdG9vbC1idG5bZGF0YS1hY3RpdmU9IjEiXTpob3ZlciB7CiAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoCiAgICAgICAgMTgwZGVnLAogICAgICAgIHJnYmEoMTM4LCAxODAsIDI1NSwgMC4zKSwKICAgICAgICByZ2JhKDEyNCwgMTAwLCAyMzIsIDAuMTQpCiAgICApICFpbXBvcnRhbnQ7CiAgICBib3JkZXItY29sb3I6IHJnYmEoMTQ4LCAxODgsIDI1NSwgMC40OCkgIWltcG9ydGFudDsKfQoKLm1qci12aWV3ZXItdG9vbC1idG5bZGF0YS1hY3RpdmU9IjEiXSB7CiAgICBmaWx0ZXI6IHNhdHVyYXRlKDEuMTIpIGJyaWdodG5lc3MoMS4wNCk7CiAgICBib3gtc2hhZG93OgogICAgICAgIGluc2V0IDAgMXB4IDAgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEpLAogICAgICAgIDAgMCAwIDFweCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDYpLAogICAgICAgIDAgOHB4IDE4cHggcmdiYSgwLCAwLCAwLCAwLjE2KSAhaW1wb3J0YW50Owp9CgoubWpyLXZpZXdlci1oZWxwIHsKICAgIGJvcmRlci1yYWRpdXM6IDE0cHggIWltcG9ydGFudDsKICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgxODBkZWcsIHJnYmEoMTMsIDE3LCAyMiwgMC45NiksIHJnYmEoOCwgMTEsIDE2LCAwLjk4KSkgIWltcG9ydGFudDsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xMikgIWltcG9ydGFudDsKICAgIGJveC1zaGFkb3c6IDAgMThweCAzNHB4IHJnYmEoMCwgMCwgMCwgMC4zNCkgIWltcG9ydGFudDsKfQoKQG1lZGlhIChtYXgtd2lkdGg6IDEyMjBweCkgewogICAgLm1qci12aWV3ZXItdG9vbHMgewogICAgICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogMWZyOwogICAgfQoKICAgIC5tanItdmlld2VyLXRvb2xzLWFjdGlvbnMgewogICAgICAgIGp1c3RpZnktY29udGVudDogZmxleC1zdGFydDsKICAgIH0KCiAgICAubWpyLXZpZXdlci1oZWFkZXItdG9wIHsKICAgICAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IDFmcjsKICAgICAgICBqdXN0aWZ5LWl0ZW1zOiBjZW50ZXI7CiAgICB9CgogICAgLm1qci12aWV3ZXItaGVhZGVyLWFyZWEtLWxlZnQsCiAgICAubWpyLXZpZXdlci1oZWFkZXItYXJlYS0tY2VudGVyLAogICAgLm1qci12aWV3ZXItaGVhZGVyLWFyZWEtLXJpZ2h0IHsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgIH0KCiAgICAubWpyLXZpZXdlci1oZWFkZXItbWV0YS0tbGVmdCwKICAgIC5tanItdmlld2VyLWhlYWRlci1tZXRhLS1yaWdodCB7CiAgICAgICAganVzdGlmeS1zZWxmOiBjZW50ZXI7CiAgICB9CgogICAgLm1qci12aWV3ZXItdG9vbHMtYm9keSB7CiAgICAgICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiByZXBlYXQoYXV0by1maXQsIG1pbm1heCgyMjBweCwgMWZyKSk7CiAgICB9Cn0KCi8qID09PT09PT09PT0gQ3VzdG9tIFZpZGVvIENvbnRyb2xzIChubyBuYXRpdmUgYmFyKSA9PT09PT09PT09ICovCi5tanItdmlkZW8taG9zdCB7CiAgICBwb3NpdGlvbjogcmVsYXRpdmU7Cn0KCi5tanItdmlkZW8tY29udHJvbHMgewogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgbGVmdDogMTJweDsKICAgIHJpZ2h0OiAxMnB4OwogICAgYm90dG9tOiAxMnB4OwogICAgZGlzcGxheTogZmxleDsKICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICBnYXA6IDhweDsKICAgIHBhZGRpbmc6IDhweCAxMHB4OwogICAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjYpOwogICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE0KTsKICAgIGJvcmRlci1yYWRpdXM6IDEwcHg7CiAgICBiYWNrZHJvcC1maWx0ZXI6IGJsdXIoMTBweCk7CiAgICBvcGFjaXR5OiAwOwogICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICB0cmFuc2l0aW9uOiBvcGFjaXR5IDAuMTVzIGVhc2U7CiAgICB6LWluZGV4OiA1Owp9CgoubWpyLXZpZGVvLXJvdyB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogMTBweDsKICAgIG1pbi13aWR0aDogMDsKfQoKLm1qci12aWRlby1yb3ctLXRvcCB7CiAgICBnYXA6IDEycHg7CiAgICBkaXNwbGF5OiBncmlkOwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogYXV0byBhdXRvIDFmciBhdXRvIGF1dG87Cn0KCi5tanItdmlkZW8tY29udHJvbHMtLXZpZXdlcmJhciAubWpyLXZpZGVvLXJvdy0tdG9wIHsKICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogYXV0byBhdXRvIDFmciBhdXRvIGF1dG87Cn0KCi5tanItdmlkZW8tY29udHJvbHMtLXByZXZpZXcgLm1qci12aWRlby1yb3ctLXRvcCB7CiAgICBkaXNwbGF5OiBmbGV4Owp9CgoubWpyLXZpZGVvLXJvdy0tYm90dG9tIHsKICAgIGdhcDogOHB4Owp9CgoubWpyLXZpZGVvLWdyb3VwIHsKICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogNnB4OwogICAgbWluLXdpZHRoOiAwOwogICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC44NSk7CiAgICBmb250LXNpemU6IDEycHg7CiAgICB1c2VyLXNlbGVjdDogbm9uZTsKfQoKLm1qci12aWRlby1udW0gewogICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA2KTsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xOCk7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjk1KTsKICAgIGJvcmRlci1yYWRpdXM6IDhweDsKICAgIHBhZGRpbmc6IDVweCA4cHg7CiAgICBmb250LXNpemU6IDEycHg7CiAgICBsaW5lLWhlaWdodDogMTsKICAgIG91dGxpbmU6IG5vbmU7Cn0KCi5tanItdmlkZW8tbnVtOmZvY3VzIHsKICAgIGJvcmRlci1jb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjM4KTsKfQoKLm1qci12aWRlby1udW0tLWZwcy5pcy1vdmVycmlkZGVuIHsKICAgIGJvcmRlci1jb2xvcjogcmdiYSgyNDUsIDE1OCwgMTEsIDAuODIpOwogICAgY29sb3I6ICNmYmJmMjQ7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDI0NSwgMTU4LCAxMSwgMC4xNCk7Cn0KCi5tanItdmlkZW8tbnVtLS1mcHMuaXMtb3ZlcnJpZGRlbjpmb2N1cyB7CiAgICBib3JkZXItY29sb3I6IHJnYmEoMjUxLCAxOTEsIDM2LCAwLjk2KTsKfQoKLm1qci12aWRlby1udW0tLXNwZWVkIHsKICAgIGNvbG9yLXNjaGVtZTogZGFyazsKICAgIGJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgMC42Mik7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjk1KTsKfQoKLm1qci12aWRlby1udW0tLXNwZWVkIG9wdGlvbiB7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1jb21meS1tZW51LWJnLCAjMmEyYTJhKTsKICAgIGNvbG9yOiB2YXIoLS1jb250ZW50LWZnLCAjZGRkKTsKfQoKLm1qci12aWRlby1mcmFtZSB7CiAgICBmb250LXNpemU6IDEycHg7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjkpOwogICAgbWluLXdpZHRoOiA1MnB4OwogICAgdGV4dC1hbGlnbjogcmlnaHQ7CiAgICB1c2VyLXNlbGVjdDogbm9uZTsKfQoKLm1qci12aWRlby1mcmFtZS5pcy1zdGVwIHsKICAgIGNvbG9yOiAjZmZkMjRkOwp9CgoubWpyLXZpZGVvLWJvdHRvbSB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogOHB4OwogICAgbWluLXdpZHRoOiAwOwogICAgZmxleDogMTsKfQoKLm1qci12aWRlby1ib3R0b20tLWxlZnQgewogICAganVzdGlmeS1jb250ZW50OiBmbGV4LXN0YXJ0Owp9CgoubWpyLXZpZGVvLWJvdHRvbS0tcmlnaHQgewogICAganVzdGlmeS1jb250ZW50OiBmbGV4LWVuZDsKfQoKLm1qci12aWRlby10cmFuc3BvcnQgewogICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICBnYXA6IDhweDsKICAgIGZsZXg6IDAgMCBhdXRvOwp9CgovKiBTaG93IGNvbnRyb2xzIG9uIGhvdmVyL2ZvY3VzICh2aWV3ZXIpLiAqLwoubWpyLXZpZGVvLWhvc3Q6aG92ZXIgLm1qci12aWRlby1jb250cm9scywKLm1qci12aWRlby1jb250cm9sczpmb2N1cy13aXRoaW4gewogICAgb3BhY2l0eTogMTsKICAgIHBvaW50ZXItZXZlbnRzOiBhdXRvOwp9CgovKiBQcmV2aWV3OiBrZWVwIGNvbnRyb2xzIHZpc2libGUgYmVjYXVzZSB0aGUgYXJlYSBpcyBzbWFsbC4gKi8KLm1qci12aWRlby1jb250cm9scy0tcHJldmlldyB7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICBsZWZ0OiBhdXRvOwogICAgcmlnaHQ6IDEwcHg7CiAgICB0b3A6IGF1dG87CiAgICBib3R0b206IDEwcHg7CiAgICBvcGFjaXR5OiAxOwogICAgcG9pbnRlci1ldmVudHM6IGF1dG87CiAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsKICAgIGJvcmRlcjogbm9uZTsKICAgIHBhZGRpbmc6IDA7CiAgICBkaXNwbGF5OiBibG9jazsKICAgIHdpZHRoOiBhdXRvOwogICAgaGVpZ2h0OiBhdXRvOwogICAgYmFja2Ryb3AtZmlsdGVyOiBub25lOwogICAgLXdlYmtpdC1iYWNrZHJvcC1maWx0ZXI6IG5vbmU7Cn0KCi5tanItdmlkZW8tcHJldmlldy1idG4gewogICAgd2lkdGg6IDM4cHg7CiAgICBoZWlnaHQ6IDM4cHg7CiAgICBib3JkZXItcmFkaXVzOiA5OTlweDsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4yMik7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIDAuNDIpOwogICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC45Mik7CiAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKfQoKLm1qci12aWRlby1wcmV2aWV3LWJ0bjpob3ZlciB7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIDAuNSk7CiAgICBib3JkZXItY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4yOCk7Cn0KCi5tanItdmlkZW8tcHJldmlldy1idG4gLnBpIHsKICAgIGZvbnQtc2l6ZTogMTZweDsKICAgIGxpbmUtaGVpZ2h0OiAxOwp9CgoubWpyLXZpZGVvLWJ0biB7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDgpOwogICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE4KTsKICAgIGNvbG9yOiAjZmZmOwogICAgYm9yZGVyLXJhZGl1czogOHB4OwogICAgcGFkZGluZzogNnB4IDEwcHg7CiAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICBmb250LXNpemU6IDEzcHg7CiAgICBsaW5lLWhlaWdodDogMTsKfQoKLm1qci12aWRlby1idG46aG92ZXIgewogICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE0KTsKfQoKLm1qci12aWRlby1idG4uaXMtb24gewogICAgYmFja2dyb3VuZDogcmdiYSg2NCwgMTYwLCAyNTUsIDAuMjUpOwogICAgYm9yZGVyLWNvbG9yOiByZ2JhKDY0LCAxNjAsIDI1NSwgMC41NSk7Cn0KCi5tanItdmlkZW8tYnRuLS1pbiB7CiAgICBib3JkZXItY29sb3I6IHJnYmEoNzAsIDI1NSwgMTIwLCAwLjU1KTsKICAgIGJhY2tncm91bmQ6IHJnYmEoNzAsIDI1NSwgMTIwLCAwLjEyKTsKfQoKLm1qci12aWRlby1idG4tLWluOmhvdmVyIHsKICAgIGJhY2tncm91bmQ6IHJnYmEoNzAsIDI1NSwgMTIwLCAwLjE4KTsKfQoKLm1qci12aWRlby1idG4tLW91dCB7CiAgICBib3JkZXItY29sb3I6IHJnYmEoMjU1LCA3MCwgNzAsIDAuNTUpOwogICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDcwLCA3MCwgMC4xKTsKfQoKLm1qci12aWRlby1idG4tLW91dDpob3ZlciB7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgNzAsIDcwLCAwLjE2KTsKfQoKLm1qci12aWRlby10aW1lIHsKICAgIGZvbnQtc2l6ZTogMTJweDsKICAgIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuOSk7CiAgICBtaW4td2lkdGg6IDkycHg7CiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgICB1c2VyLXNlbGVjdDogbm9uZTsKfQoKLm1qci12aWRlby10aW1lZ3JvdXAgewogICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBmbGV4LWVuZDsKICAgIGdhcDogMTBweDsKICAgIG1pbi13aWR0aDogMDsKfQoKLm1qci12aWRlby1yYW5nZS1jb3VudCB7CiAgICBmb250LXNpemU6IDEycHg7CiAgICBjb2xvcjogcmdiYSg2NCwgMTkwLCAyNTUsIDAuOTIpOwogICAgYmFja2dyb3VuZDogcmdiYSg2NCwgMTkwLCAyNTUsIDAuMSk7CiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDY0LCAxOTAsIDI1NSwgMC4yNSk7CiAgICBib3JkZXItcmFkaXVzOiA5OTlweDsKICAgIHBhZGRpbmc6IDFweCA4cHg7CiAgICBsaW5lLWhlaWdodDogMTZweDsKICAgIGZvbnQtdmFyaWFudC1udW1lcmljOiB0YWJ1bGFyLW51bXM7CiAgICB1c2VyLXNlbGVjdDogbm9uZTsKfQoKLm1qci12aWRlby1yYW5nZSB7CiAgICBhY2NlbnQtY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC45KTsKfQoKLm1qci12aWRlby1yYW5nZS0tc2VlayB7CiAgICBmbGV4OiAxOwogICAgbWluLXdpZHRoOiA4MHB4OwogICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgei1pbmRleDogMTsKICAgIC8qIFdlIGRyYXcgb3VyIG93biBwbGF5aGVhZC9tYXJrZXJzOyBoaWRlIHRoZSBuYXRpdmUgdGh1bWIgImRvdCIuICovCiAgICAtd2Via2l0LWFwcGVhcmFuY2U6IG5vbmU7CiAgICBhcHBlYXJhbmNlOiBub25lOwp9CgoubWpyLXZpZGVvLXJhbmdlLS1zZWVrOjotd2Via2l0LXNsaWRlci10aHVtYiB7CiAgICAtd2Via2l0LWFwcGVhcmFuY2U6IG5vbmU7CiAgICBhcHBlYXJhbmNlOiBub25lOwogICAgd2lkdGg6IDA7CiAgICBoZWlnaHQ6IDA7CiAgICBib3JkZXI6IDA7CiAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsKICAgIGJveC1zaGFkb3c6IG5vbmU7Cn0KCi5tanItdmlkZW8tcmFuZ2UtLXNlZWs6Oi1tb3otcmFuZ2UtdGh1bWIgewogICAgd2lkdGg6IDA7CiAgICBoZWlnaHQ6IDA7CiAgICBib3JkZXI6IDA7CiAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsKICAgIGJveC1zaGFkb3c6IG5vbmU7Cn0KCi5tanItdmlkZW8tc2Vlay13cmFwIHsKICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgIG1pbi13aWR0aDogODBweDsKICAgIGZsZXg6IDE7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKfQoKLm1qci12aWRlby1zZWVrLXpvbmVzIHsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIGxlZnQ6IDA7CiAgICByaWdodDogMDsKICAgIHRvcDogNTAlOwogICAgaGVpZ2h0OiAxMHB4OwogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC01MCUpOwogICAgYm9yZGVyLXJhZGl1czogOTk5cHg7CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICB6LWluZGV4OiAyOwp9CgoubWpyLXZpZGVvLXNlZWstem9uZSB7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICB0b3A6IDA7CiAgICBib3R0b206IDA7Cn0KCi8qIDAuLkluOiB0cmltbWVkLW91dCByYW5nZS4gKi8KLm1qci12aWRlby1zZWVrLXpvbmUtLWxlZnRUcmltIHsKICAgIGJhY2tncm91bmQ6IHJnYmEoMjU1LCA3MCwgNzAsIDAuMTgpOwp9CgovKiBJbi4uT3V0OiBzZWxlY3RlZCBwbGF5YmFjayByYW5nZSBoaWdobGlnaHQuICovCi5tanItdmlkZW8tc2Vlay16b25lLS1zZWxlY3RlZCB7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDY0LCAxOTAsIDI1NSwgMC41NSk7Cn0KCi5tanItdmlkZW8tc2Vlay16b25lcy5pcy1mdWxscmFuZ2UgLm1qci12aWRlby1zZWVrLXpvbmUtLXNlbGVjdGVkIHsKICAgIGJhY2tncm91bmQ6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xMik7Cn0KCi8qIE91dC4uRW5kOiBzaG93IG91dC1vZi1yYW5nZSBmcmFtZXMgYXMgYSBkaWZmZXJlbnQgY29sb3IuICovCi5tanItdmlkZW8tc2Vlay16b25lLS1yaWdodFRyaW0gewogICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDcwLCA3MCwgMC4yKTsKfQoKLm1qci12aWRlby1zZWVrLW92ZXJsYXkgewogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgbGVmdDogMDsKICAgIHJpZ2h0OiAwOwogICAgdG9wOiA1MCU7CiAgICBoZWlnaHQ6IDA7CiAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgIHotaW5kZXg6IDM7Cn0KCi5tanItdmlkZW8tc2Vlay1oYW5kbGUgewogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgdG9wOiA1MCU7CiAgICB3aWR0aDogMTZweDsKICAgIGhlaWdodDogMzJweDsKICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUsIC01MCUpOwogICAgY3Vyc29yOiBldy1yZXNpemU7CiAgICBwb2ludGVyLWV2ZW50czogYXV0bzsKICAgIHRvdWNoLWFjdGlvbjogbm9uZTsKICAgIHVzZXItc2VsZWN0OiBub25lOwogICAgei1pbmRleDogNDsKICAgIGJvcmRlci1yYWRpdXM6IDZweDsKICAgIGJhY2tncm91bmQ6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wNik7CiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTQpOwogICAgYm94LXNoYWRvdzogMCA0cHggMTBweCByZ2JhKDAsIDAsIDAsIDAuMzUpOwp9CgoubWpyLXZpZGVvLXNlZWstaGFuZGxlOmhvdmVyIHsKICAgIGJhY2tncm91bmQ6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xKTsKICAgIGJvcmRlci1jb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjI0KTsKfQoKLm1qci12aWRlby1zZWVrLWhhbmRsZS0taW46OmFmdGVyLAoubWpyLXZpZGVvLXNlZWstaGFuZGxlLS1vdXQ6OmFmdGVyIHsKICAgIGNvbnRlbnQ6ICIiOwogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgbGVmdDogNTAlOwogICAgdG9wOiA1MCU7CiAgICB3aWR0aDogMnB4OwogICAgaGVpZ2h0OiAxOHB4OwogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTUwJSwgLTUwJSk7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgNzAsIDcwLCAwLjk1KTsKICAgIGJvcmRlci1yYWRpdXM6IDJweDsKfQoKLm1qci12aWRlby1zZWVrLWhhbmRsZS0taW46OmFmdGVyIHsKICAgIGJhY2tncm91bmQ6IHJnYmEoNzAsIDI1NSwgMTIwLCAwLjk1KTsKfQoKLm1qci12aWRlby1zZWVrLWhhbmRsZS0taW46OmJlZm9yZSwKLm1qci12aWRlby1zZWVrLWhhbmRsZS0tb3V0OjpiZWZvcmUgewogICAgY29udGVudDogIiI7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICBsZWZ0OiA1MCU7CiAgICB3aWR0aDogMDsKICAgIGhlaWdodDogMDsKICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgtNTAlKTsKfQoKLm1qci12aWRlby1zZWVrLWhhbmRsZS0taW46OmJlZm9yZSB7CiAgICB0b3A6IDRweDsKICAgIGJvcmRlci1sZWZ0OiA1cHggc29saWQgdHJhbnNwYXJlbnQ7CiAgICBib3JkZXItcmlnaHQ6IDVweCBzb2xpZCB0cmFuc3BhcmVudDsKICAgIGJvcmRlci1ib3R0b206IDZweCBzb2xpZCByZ2JhKDcwLCAyNTUsIDEyMCwgMC45NSk7Cn0KCi5tanItdmlkZW8tc2Vlay1oYW5kbGUtLW91dDo6YmVmb3JlIHsKICAgIGJvdHRvbTogNHB4OwogICAgYm9yZGVyLWxlZnQ6IDVweCBzb2xpZCB0cmFuc3BhcmVudDsKICAgIGJvcmRlci1yaWdodDogNXB4IHNvbGlkIHRyYW5zcGFyZW50OwogICAgYm9yZGVyLXRvcDogNnB4IHNvbGlkIHJnYmEoMjU1LCA3MCwgNzAsIDAuOTUpOwp9CgoubWpyLXZpZGVvLXNlZWstdGlja3MgewogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgbGVmdDogMDsKICAgIHJpZ2h0OiAwOwogICAgdG9wOiAtMTZweDsKICAgIGhlaWdodDogMTJweDsKICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMSk7CiAgICBvcGFjaXR5OiAwLjk7Cn0KCi5tanItdmlkZW8tc2Vlay1sYWJlbHMgewogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgbGVmdDogMDsKICAgIHJpZ2h0OiAwOwogICAgdG9wOiAtMzRweDsKICAgIGhlaWdodDogMTRweDsKICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgZm9udC1zaXplOiAxMHB4OwogICAgbGluZS1oZWlnaHQ6IDE0cHg7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjcyKTsKICAgIGZvbnQtdmFyaWFudC1udW1lcmljOiB0YWJ1bGFyLW51bXM7CiAgICB0ZXh0LXNoYWRvdzogMCAxcHggMCByZ2JhKDAsIDAsIDAsIDAuNTUpOwp9CgoubWpyLXZpZGVvLXNlZWstbGFiZWwgewogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKC01MCUpOwogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKfQoKLm1qci12aWRlby1zZWVrLXBsYXloZWFkLWxhYmVsIHsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIHRvcDogMTJweDsKICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgtNTAlKTsKICAgIHBhZGRpbmc6IDFweCA2cHg7CiAgICBib3JkZXItcmFkaXVzOiA5OTlweDsKICAgIGJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgMC41NSk7CiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTQpOwogICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC45Mik7CiAgICBmb250LXNpemU6IDEwcHg7CiAgICBsaW5lLWhlaWdodDogMTRweDsKICAgIGZvbnQtdmFyaWFudC1udW1lcmljOiB0YWJ1bGFyLW51bXM7CiAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKfQoKLm1qci12aWRlby1zZWVrLW1hcmsgewogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgdG9wOiAtMTBweDsKICAgIHdpZHRoOiAxNHB4OwogICAgaGVpZ2h0OiAyMHB4OwogICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLTUwJSk7CiAgICBjdXJzb3I6IGV3LXJlc2l6ZTsKICAgIHBvaW50ZXItZXZlbnRzOiBhdXRvOwogICAgdG91Y2gtYWN0aW9uOiBub25lOwogICAgei1pbmRleDogNDsKICAgIC0tbWpyLW1hcmstY29sb3I6IHJnYmEoMjU1LCA3MCwgNzAsIDAuOTUpOwp9CgoubWpyLXZpZGVvLXNlZWstbWFyay0taW4gewogICAgLS1tanItbWFyay1jb2xvcjogcmdiYSg3MCwgMjU1LCAxMjAsIDAuOTUpOwp9CgoubWpyLXZpZGVvLXNlZWstbWFyazo6YmVmb3JlIHsKICAgIGNvbnRlbnQ6ICIiOwogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgbGVmdDogNTAlOwogICAgdG9wOiAwOwogICAgYm90dG9tOiAwOwogICAgd2lkdGg6IDJweDsKICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgtNTAlKTsKICAgIGJhY2tncm91bmQ6IHZhcigtLW1qci1tYXJrLWNvbG9yKTsKICAgIGJvcmRlci1yYWRpdXM6IDJweDsKICAgIGJveC1zaGFkb3c6IDAgMCAwIDFweCByZ2JhKDAsIDAsIDAsIDAuMzUpOwp9CgoubWpyLXZpZGVvLXNlZWstbWFyazo6YWZ0ZXIgewogICAgY29udGVudDogIiI7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICB0b3A6IC01cHg7CiAgICBsZWZ0OiA1MCU7CiAgICB3aWR0aDogMDsKICAgIGhlaWdodDogMDsKICAgIGJvcmRlci1sZWZ0OiA1cHggc29saWQgdHJhbnNwYXJlbnQ7CiAgICBib3JkZXItcmlnaHQ6IDVweCBzb2xpZCB0cmFuc3BhcmVudDsKICAgIGJvcmRlci1ib3R0b206IDZweCBzb2xpZCB2YXIoLS1tanItbWFyay1jb2xvcik7CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLTUwJSk7Cn0KCi5tanItdmlkZW8tc2Vlay1tYXJrLS1pbjo6YWZ0ZXIgewogICAgYm9yZGVyLWJvdHRvbS1jb2xvcjogdmFyKC0tbWpyLW1hcmstY29sb3IpOwp9CgoubWpyLXZpZGVvLXNlZWstbWFyay0tb3V0OjphZnRlciB7CiAgICB0b3A6IGF1dG87CiAgICBib3R0b206IC01cHg7CiAgICBib3JkZXItYm90dG9tOiBub25lOwogICAgYm9yZGVyLXRvcDogNnB4IHNvbGlkIHZhcigtLW1qci1tYXJrLWNvbG9yKTsKfQoKLm1qci12aWRlby1zZWVrLXBsYXloZWFkIHsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIHRvcDogLTEycHg7CiAgICB3aWR0aDogMnB4OwogICAgaGVpZ2h0OiAyNHB4OwogICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDIwMCwgNzAsIDAuOTUpOwogICAgYm94LXNoYWRvdzogMCAwIDAgMXB4IHJnYmEoMCwgMCwgMCwgMC4zNSk7CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLTFweCk7Cn0KCi5tanItdmlkZW8tY29udHJvbHMtLXZpZXdlcmJhciB7CiAgICBwb3NpdGlvbjogc3RhdGljOwogICAgbGVmdDogYXV0bzsKICAgIHJpZ2h0OiBhdXRvOwogICAgYm90dG9tOiBhdXRvOwogICAgb3BhY2l0eTogMTsKICAgIHBvaW50ZXItZXZlbnRzOiBhdXRvOwogICAgd2lkdGg6IDEwMCU7CiAgICBtYXgtd2lkdGg6IG5vbmU7CiAgICBtYXJnaW46IDA7CiAgICBwYWRkaW5nOiAxNHB4OwogICAgYm9yZGVyLXJhZGl1czogMThweDsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMTk2LCAyMDIsIDIxMCwgMC4xMik7CiAgICBiYWNrZ3JvdW5kOgogICAgICAgIHJhZGlhbC1ncmFkaWVudChjaXJjbGUgYXQgdG9wIGxlZnQsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wMyksIHRyYW5zcGFyZW50IDM0JSksCiAgICAgICAgbGluZWFyLWdyYWRpZW50KDE4MGRlZywgcmdiYSgxOTgsIDIwMywgMjEwLCAwLjAyNSksIHJnYmEoMTk4LCAyMDMsIDIxMCwgMC4wMDgpKSwKICAgICAgICBsaW5lYXItZ3JhZGllbnQoMTY1ZGVnLCByZ2JhKDE4LCAyMiwgMjgsIDAuODIpLCByZ2JhKDEyLCAxNSwgMjEsIDAuOSkpOwogICAgYm94LXNoYWRvdzoKICAgICAgICBpbnNldCAwIDFweCAwIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wNCksCiAgICAgICAgMCAxMHB4IDMwcHggcmdiYSgwLCAwLCAwLCAwLjE0KTsKICAgIGJhY2tkcm9wLWZpbHRlcjogbm9uZTsKICAgIC13ZWJraXQtYmFja2Ryb3AtZmlsdGVyOiBub25lOwogICAgZ2FwOiAxMnB4Owp9CgoubWpyLXZpZGVvLWNvbnRyb2xzLS12aWV3ZXJiYXIgLm1qci12aWRlby1idG4gewogICAgbWluLWhlaWdodDogMzhweDsKICAgIHBhZGRpbmc6IDhweCAxMnB4OwogICAgZm9udC1zaXplOiAxMnB4OwogICAgYm9yZGVyLXJhZGl1czogMTJweDsKICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgxODBkZWcsIHJnYmEoMjEwLCAyMTQsIDIyMCwgMC4wNyksIHJnYmEoMjEwLCAyMTQsIDIyMCwgMC4wMikpOwogICAgYm9yZGVyLWNvbG9yOiByZ2JhKDE5NCwgMjAxLCAyMDgsIDAuMTgpOwogICAgYm9yZGVyLXdpZHRoOiAxcHg7CiAgICBib3gtc2hhZG93OiBpbnNldCAwIDFweCAwIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wNik7CiAgICB0cmFuc2l0aW9uOgogICAgICAgIHRyYW5zZm9ybSAwLjEycyBlYXNlLAogICAgICAgIGJhY2tncm91bmQtY29sb3IgMC4xMnMgZWFzZSwKICAgICAgICBib3JkZXItY29sb3IgMC4xMnMgZWFzZSwKICAgICAgICBib3gtc2hhZG93IDAuMTJzIGVhc2U7Cn0KCi5tanItdmlkZW8tY29udHJvbHMtLXZpZXdlcmJhciAubWpyLXZpZGVvLWJ0bjpob3ZlciB7CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTFweCk7CiAgICBib3JkZXItY29sb3I6IHJnYmEoMjIwLCAyMjQsIDIzMCwgMC4yNik7CiAgICBib3gtc2hhZG93OgogICAgICAgIGluc2V0IDAgMXB4IDAgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA4KSwKICAgICAgICAwIDhweCAxOHB4IHJnYmEoMCwgMCwgMCwgMC4xNCk7Cn0KCi5tanItdmlkZW8tY29udHJvbHMtLXZpZXdlcmJhciAubWpyLXZpZGVvLWJ0bi5pcy1vbiB7CiAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoMTgwZGVnLCByZ2JhKDEwMCwgMTcwLCAyNTUsIDAuMiksIHJnYmEoMTAwLCAxNzAsIDI1NSwgMC4wOCkpOwogICAgYm9yZGVyLWNvbG9yOiByZ2JhKDEyMCwgMTg2LCAyNTUsIDAuNDIpOwogICAgYm94LXNoYWRvdzogMCAwIDAgMXB4IHJnYmEoMTIwLCAxODYsIDI1NSwgMC4xMikgaW5zZXQ7Cn0KCi5tanItdmlkZW8tY29udHJvbHMtLXZpZXdlcmJhciAubWpyLXZpZGVvLWJ0biAucGkgewogICAgZm9udC1zaXplOiAxNHB4OwogICAgbGluZS1oZWlnaHQ6IDE7Cn0KCi5tanItdmlkZW8tY29udHJvbHMtLXZpZXdlcmJhciAubWpyLXZpZGVvLWJhci1oZWFkLAoubWpyLXZpZGVvLWNvbnRyb2xzLS12aWV3ZXJiYXIgLm1qci12aWRlby1iYXItYWN0aW9ucyB7CiAgICBkaXNwbGF5OiBncmlkOwogICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiBtaW5tYXgoMCwgMWZyKSBhdXRvIG1pbm1heCgwLCAxZnIpOwogICAgZ2FwOiAxMnB4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKfQoKLm1qci12aWRlby1jb250cm9scy0tdmlld2VyYmFyIC5tanItdmlkZW8tYmFyLXN0YXR1cywKLm1qci12aWRlby1jb250cm9scy0tdmlld2VyYmFyIC5tanItdmlkZW8tYmFyLXNpZGUgewogICAgbWluLXdpZHRoOiAwOwogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBnYXA6IDEwcHg7CiAgICBmbGV4LXdyYXA6IHdyYXA7Cn0KCi5tanItdmlkZW8tY29udHJvbHMtLXZpZXdlcmJhciAubWpyLXZpZGVvLWJhci1jZW50ZXIgewogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKfQoKLm1qci12aWRlby1jb250cm9scy0tdmlld2VyYmFyIC5tanItdmlkZW8tYmFyLWhlYWQgewogICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiBtaW5tYXgoMCwgMWZyKTsKfQoKLm1qci12aWRlby1jb250cm9scy0tdmlld2VyYmFyIC5tanItdmlkZW8tYmFyLXNpZGUtLXJpZ2h0IHsKICAgIGp1c3RpZnktY29udGVudDogZmxleC1lbmQ7Cn0KCi5tanItdmlkZW8tY29udHJvbHMtLXZpZXdlcmJhciAubWpyLXZpZGVvLWJhci10aW1lbGluZSB7CiAgICBkaXNwbGF5OiBncmlkOwogICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiBhdXRvIG1pbm1heCgwLCAxZnIpIGF1dG87CiAgICBnYXA6IDEycHg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgcGFkZGluZzogMTBweCAxMnB4OwogICAgYm9yZGVyLXJhZGl1czogMTZweDsKICAgIGJhY2tncm91bmQ6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wNCk7CiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDYpOwp9CgoubWpyLXZpZGVvLWNvbnRyb2xzLS12aWV3ZXJiYXIubWpyLXZpZGVvLWNvbnRyb2xzLS1hdWRpbyAubWpyLXZpZGVvLWJhci10aW1lbGluZSB7CiAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IG1pbm1heCgwLCAxZnIpIGF1dG8gYXV0bzsKfQoKLm1qci12aWRlby1jb250cm9scy0tdmlld2VyYmFyLm1qci12aWRlby1jb250cm9scy0tYXVkaW8gLm1qci12aWRlby1zZWVrLXdyYXAgewogICAgZ3JpZC1jb2x1bW46IDEgLyAtMTsKICAgIGdyaWQtcm93OiAxOwogICAgd2lkdGg6IDEwMCU7Cn0KCi5tanItdmlkZW8tY29udHJvbHMtLXZpZXdlcmJhci5tanItdmlkZW8tY29udHJvbHMtLWF1ZGlvIC5tanItdmlkZW8tZ3JvdXAtLWluLAoubWpyLXZpZGVvLWNvbnRyb2xzLS12aWV3ZXJiYXIubWpyLXZpZGVvLWNvbnRyb2xzLS1hdWRpbyAubWpyLXZpZGVvLWdyb3VwLS1vdXQgewogICAgZ3JpZC1yb3c6IDI7CiAgICB3aWR0aDogbWF4LWNvbnRlbnQ7CiAgICBtYXgtd2lkdGg6IDEwMCU7Cn0KCi5tanItdmlkZW8tY29udHJvbHMtLXZpZXdlcmJhciAubWpyLXZpZGVvLW1lZGlhLWJhZGdlIHsKICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgbWluLWhlaWdodDogMjhweDsKICAgIHBhZGRpbmc6IDAgMTBweDsKICAgIGJvcmRlci1yYWRpdXM6IDk5OXB4OwogICAgYmFja2dyb3VuZDogcmdiYSg3OCwgMjI0LCAxOTYsIDAuMTIpOwogICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSg3OCwgMjI0LCAxOTYsIDAuMjIpOwogICAgY29sb3I6IHJnYmEoMjIwLCAyNDcsIDI0MSwgMC45Nik7CiAgICBmb250LXNpemU6IDExcHg7CiAgICBmb250LXdlaWdodDogNjAwOwogICAgbGV0dGVyLXNwYWNpbmc6IDAuMDhlbTsKICAgIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7Cn0KCi5tanItdmlkZW8tY29udHJvbHMtLXZpZXdlcmJhciAubWpyLXZpZGVvLXRpbWVncm91cCB7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtc3RhcnQ7CiAgICBnYXA6IDhweDsKICAgIHBhZGRpbmc6IDVweCAxMHB4OwogICAgYm9yZGVyLXJhZGl1czogOTk5cHg7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDQ1KTsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wOCk7Cn0KCi5tanItdmlkZW8tY29udHJvbHMtLXZpZXdlcmJhciAubWpyLXZpZGVvLXRpbWUsCi5tanItdmlkZW8tY29udHJvbHMtLXZpZXdlcmJhciAubWpyLXZpZGVvLWZyYW1lIHsKICAgIGZvbnQtdmFyaWFudC1udW1lcmljOiB0YWJ1bGFyLW51bXM7CiAgICBjb2xvcjogcmdiYSgyMjgsIDIzMCwgMjM0LCAwLjkyKTsKICAgIHRleHQtc2hhZG93OiBub25lOwp9CgoubWpyLXZpZGVvLWNvbnRyb2xzLS12aWV3ZXJiYXIgLm1qci12aWRlby1mcmFtZSB7CiAgICBtaW4td2lkdGg6IDk0cHg7CiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgICBwYWRkaW5nOiA1cHggMTBweDsKICAgIGJvcmRlci1yYWRpdXM6IDk5OXB4OwogICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA0NSk7CiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDgpOwp9CgoubWpyLXZpZGVvLWNvbnRyb2xzLS12aWV3ZXJiYXIgLm1qci12aWRlby10aW1lIHsKICAgIG1pbi13aWR0aDogYXV0bzsKICAgIHRleHQtYWxpZ246IGxlZnQ7Cn0KCi5tanItdmlkZW8tY29udHJvbHMtLXZpZXdlcmJhciAubWpyLXZpZGVvLXJhbmdlLS1zZWVrIHsKICAgIGhlaWdodDogMjJweDsKICAgIGFjY2VudC1jb2xvcjogcmdiYSgyMTQsIDIxOCwgMjI0LCAwLjkyKTsKfQoKLm1qci12aWRlby1jb250cm9scy0tdmlld2VyYmFyIC5tanItdmlkZW8tcmFuZ2UtY291bnQgewogICAgY29sb3I6IHJnYmEoMjIyLCAyMjUsIDIzMCwgMC45NSk7CiAgICBib3JkZXItY29sb3I6IHJnYmEoMTk0LCAyMDEsIDIwOSwgMC4yNik7CiAgICBib3JkZXItd2lkdGg6IDAuOHB4OwogICAgYmFja2dyb3VuZDogcmdiYSgxOTQsIDIwMSwgMjA5LCAwLjA4KTsKICAgIHRleHQtc2hhZG93OiBub25lOwp9CgoubWpyLXZpZGVvLWNvbnRyb2xzLS12aWV3ZXJiYXIgLm1qci12aWRlby1ncm91cCB7CiAgICBtaW4taGVpZ2h0OiAzNnB4OwogICAgcGFkZGluZzogNHB4IDhweDsKICAgIGJvcmRlci1yYWRpdXM6IDEycHg7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDM1KTsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wNik7Cn0KCi5tanItdmlkZW8tY29udHJvbHMtLXZpZXdlcmJhciAubWpyLXZpZGVvLWdyb3VwLS1hZGp1c3QtbGVmdCwKLm1qci12aWRlby1jb250cm9scy0tdmlld2VyYmFyIC5tanItdmlkZW8tZ3JvdXAtLWFkanVzdC1yaWdodCwKLm1qci12aWRlby1jb250cm9scy0tdmlld2VyYmFyIC5tanItdmlkZW8tZ3JvdXAtLXNwZWVkIHsKICAgIGdhcDogOHB4Owp9CgoubWpyLXZpZGVvLWNvbnRyb2xzLS12aWV3ZXJiYXIgLm1qci12aWRlby1udW0gewogICAgbWluLWhlaWdodDogMzRweDsKICAgIGJvcmRlci1yYWRpdXM6IDEwcHg7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDksIDEyLCAxNiwgMC41NSk7CiAgICBib3JkZXItY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xKTsKfQoKLm1qci12aWRlby1jb250cm9scy0tdmlld2VyYmFyIC5tanItdmlkZW8tdHJhbnNwb3J0IHsKICAgIGdhcDogMTBweDsKICAgIHBhZGRpbmc6IDZweDsKICAgIGJvcmRlci1yYWRpdXM6IDk5OXB4OwogICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA0NSk7CiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDgpOwp9CgoubWpyLXZpZGVvLWNvbnRyb2xzLS12aWV3ZXJiYXIgLm1qci12aWRlby1idG4tLXBsYXkgewogICAgbWluLXdpZHRoOiA4OHB4OwogICAgZm9udC13ZWlnaHQ6IDYwMDsKfQoKLm1qci12aWRlby1jb250cm9scy0tdmlld2VyYmFyIC5tanItdmlkZW8tc2Vlay13cmFwIHsKICAgIG1pbi1oZWlnaHQ6IDQ0cHg7Cn0KCi5tanItdmlkZW8tY29udHJvbHMtLXZpZXdlcmJhciAubWpyLXZpZGVvLXNlZWstem9uZXMgewogICAgaGVpZ2h0OiAxMnB4Owp9CgoubWpyLXZpZGVvLWNvbnRyb2xzLS12aWV3ZXJiYXIgLm1qci12aWRlby1zZWVrLWhhbmRsZSB7CiAgICB3aWR0aDogMThweDsKICAgIGhlaWdodDogMzRweDsKICAgIGJvcmRlci1yYWRpdXM6IDhweDsKfQoKLm1qci12aWRlby1jb250cm9scy0tdmlld2VyYmFyIC5tanItdmlkZW8tdm9sdW1lLXdyYXAgewogICAgcGFkZGluZzogMCA0cHg7Cn0KCi5tanItdmlkZW8tcmFuZ2UtLXZvbHVtZSB7CiAgICB3aWR0aDogOTBweDsKfQoKQG1lZGlhIChtYXgtd2lkdGg6IDk4MHB4KSB7CiAgICAubWpyLXZpZGVvLWNvbnRyb2xzLS12aWV3ZXJiYXIgLm1qci12aWRlby1iYXItaGVhZCwKICAgIC5tanItdmlkZW8tY29udHJvbHMtLXZpZXdlcmJhciAubWpyLXZpZGVvLWJhci1hY3Rpb25zLAogICAgLm1qci12aWRlby1jb250cm9scy0tdmlld2VyYmFyIC5tanItdmlkZW8tYmFyLXRpbWVsaW5lIHsKICAgICAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IDFmcjsKICAgIH0KCiAgICAubWpyLXZpZGVvLWNvbnRyb2xzLS12aWV3ZXJiYXIgLm1qci12aWRlby1iYXItY2VudGVyLAogICAgLm1qci12aWRlby1jb250cm9scy0tdmlld2VyYmFyIC5tanItdmlkZW8tYmFyLXNpZGUtLXJpZ2h0IHsKICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgIH0KCiAgICAubWpyLXZpZGVvLWNvbnRyb2xzLS12aWV3ZXJiYXIgLm1qci12aWRlby1iYXItdGltZWxpbmUgewogICAgICAgIGdhcDogMTBweDsKICAgIH0KCiAgICAubWpyLXZpZGVvLWNvbnRyb2xzLS12aWV3ZXJiYXIgLm1qci12aWRlby10cmFuc3BvcnQgewogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgICAgIGZsZXgtd3JhcDogd3JhcDsKICAgICAgICBib3JkZXItcmFkaXVzOiAxNnB4OwogICAgfQp9CgovKiA9PT09PT09PT09IENvbnRleHQgTWVudSBDb21wb25lbnQgPT09PT09PT09PSAqLwoubWpyLWNvbnRleHQtbWVudSB7CiAgICBwb3NpdGlvbjogZml4ZWQ7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1jb21meS1tZW51LWJnKTsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJvcmRlci1jb2xvcik7CiAgICBib3JkZXItcmFkaXVzOiA2cHg7CiAgICBib3gtc2hhZG93OiAwIDRweCAxMnB4IHJnYmEoMCwgMCwgMCwgMC4zKTsKICAgIG1pbi13aWR0aDogMjAwcHg7CiAgICAvKiBBYm92ZSB2aWV3ZXIgb3ZlcmxheSAoMTAwMDEpIGFuZCBNRlYgZGlhbG9nICgxMDAwMCkgKi8KICAgIHotaW5kZXg6IDEwMDAyOwogICAgZGlzcGxheTogbm9uZTsKICAgIHBhZGRpbmc6IDRweCAwOwogICAgYW5pbWF0aW9uOiBtanItY29udGV4dC1tZW51LWluIDAuMTVzIGVhc2Utb3V0Owp9CgoubWpyLWNvbnRleHQtbWVudSwKLm1qci1jb250ZXh0LW1lbnUgKiB7CiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94Owp9CgpAa2V5ZnJhbWVzIG1qci1jb250ZXh0LW1lbnUtaW4gewogICAgZnJvbSB7CiAgICAgICAgb3BhY2l0eTogMDsKICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTVweCk7CiAgICB9CiAgICB0byB7CiAgICAgICAgb3BhY2l0eTogMTsKICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoMCk7CiAgICB9Cn0KCi5tanItY29udGV4dC1tZW51LWl0ZW0gewogICAgYXBwZWFyYW5jZTogbm9uZTsKICAgIC13ZWJraXQtYXBwZWFyYW5jZTogbm9uZTsKICAgIHBhZGRpbmc6IDhweCAxNHB4OwogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47CiAgICB3aWR0aDogMTAwJTsKICAgIGJvcmRlcjogMDsKICAgIGJvcmRlci1yYWRpdXM6IDA7CiAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsKICAgIGJveC1zaGFkb3c6IG5vbmU7CiAgICBtYXJnaW46IDA7CiAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICBjb2xvcjogdmFyKC0tZmctY29sb3IpOwogICAgZm9udC1zaXplOiAxM3B4OwogICAgZm9udC1mYW1pbHk6IGluaGVyaXQ7CiAgICBmb250LXdlaWdodDogNDAwOwogICAgbGV0dGVyLXNwYWNpbmc6IG5vcm1hbDsKICAgIGxpbmUtaGVpZ2h0OiAxLjM1OwogICAgdGV4dC1hbGlnbjogbGVmdDsKICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKICAgIHRleHQtdHJhbnNmb3JtOiBub25lOwogICAgdHJhbnNpdGlvbjogYmFja2dyb3VuZCAwLjE1czsKICAgIHVzZXItc2VsZWN0OiBub25lOwp9CgoubWpyLWNvbnRleHQtbWVudS1pdGVtOjotbW96LWZvY3VzLWlubmVyIHsKICAgIGJvcmRlcjogMDsKICAgIHBhZGRpbmc6IDA7Cn0KCi5tanItY29udGV4dC1tZW51LWl0ZW06aG92ZXIsCi5tanItY29udGV4dC1tZW51LWl0ZW06Zm9jdXMtdmlzaWJsZSB7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1jb21meS1pbnB1dC1iZyk7CiAgICBvdXRsaW5lOiBub25lOwp9CgoubWpyLWNvbnRleHQtbWVudS1pdGVtLmlzLXRvbmUtZ3JhcGgtbWFwIHsKICAgIGNvbG9yOiAjZjVjNTQyOwp9CgoubWpyLWNvbnRleHQtbWVudS1pdGVtLmlzLXRvbmUtcmVuYW1lIHsKICAgIGNvbG9yOiAjNWRhOWZmOwp9CgoubWpyLWNvbnRleHQtbWVudS1pdGVtLmlzLXRvbmUtZGVsZXRlIHsKICAgIGNvbG9yOiAjZmY1ZjVmOwp9CgoubWpyLWNvbnRleHQtbWVudS1pdGVtLmlzLXRvbmUtZmxvYXRpbmctdmlld2VyIHsKICAgIGNvbG9yOiAjNWZkMzhkOwp9CgoubWpyLWNvbnRleHQtbWVudS1pdGVtLmlzLXRvbmUtZ3JhcGgtbWFwOmhvdmVyLAoubWpyLWNvbnRleHQtbWVudS1pdGVtLmlzLXRvbmUtZ3JhcGgtbWFwOmZvY3VzLXZpc2libGUgewogICAgYmFja2dyb3VuZDogcmdiYSgyNDUsIDE5NywgNjYsIDAuMTQpOwp9CgoubWpyLWNvbnRleHQtbWVudS1pdGVtLmlzLXRvbmUtcmVuYW1lOmhvdmVyLAoubWpyLWNvbnRleHQtbWVudS1pdGVtLmlzLXRvbmUtcmVuYW1lOmZvY3VzLXZpc2libGUgewogICAgYmFja2dyb3VuZDogcmdiYSg5MywgMTY5LCAyNTUsIDAuMTQpOwp9CgoubWpyLWNvbnRleHQtbWVudS1pdGVtLmlzLXRvbmUtZGVsZXRlOmhvdmVyLAoubWpyLWNvbnRleHQtbWVudS1pdGVtLmlzLXRvbmUtZGVsZXRlOmZvY3VzLXZpc2libGUgewogICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDk1LCA5NSwgMC4xNCk7Cn0KCi5tanItY29udGV4dC1tZW51LWl0ZW0uaXMtdG9uZS1mbG9hdGluZy12aWV3ZXI6aG92ZXIsCi5tanItY29udGV4dC1tZW51LWl0ZW0uaXMtdG9uZS1mbG9hdGluZy12aWV3ZXI6Zm9jdXMtdmlzaWJsZSB7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDk1LCAyMTEsIDE0MSwgMC4xNCk7Cn0KCi5tanItY29udGV4dC1tZW51LWl0ZW0uaXMtZGlzYWJsZWQgewogICAgY3Vyc29yOiBkZWZhdWx0OwogICAgb3BhY2l0eTogMC40NTsKfQoKLm1qci1jb250ZXh0LW1lbnUtaXRlbS5pcy1kaXNhYmxlZDpob3ZlciwKLm1qci1jb250ZXh0LW1lbnUtaXRlbS5pcy1kaXNhYmxlZDpmb2N1cy12aXNpYmxlIHsKICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50Owp9CgoubWpyLWNvbnRleHQtbWVudS1zZXBhcmF0b3IgewogICAgaGVpZ2h0OiAxcHg7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1ib3JkZXItY29sb3IpOwogICAgbWFyZ2luOiA0cHggMDsKfQoKLm1qci1jb250ZXh0LW1lbnUtaXRlbS1sZWZ0LAoubWpyLWNvbnRleHQtbWVudS1pdGVtLXJpZ2h0IHsKICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogMTBweDsKfQoKLm1qci1jb250ZXh0LW1lbnUtaXRlbS1sZWZ0IHsKICAgIGZsZXg6IDEgMSBhdXRvOwogICAgbWluLXdpZHRoOiAwOwp9CgoubWpyLWNvbnRleHQtbWVudS1pdGVtLXJpZ2h0IHsKICAgIGZsZXg6IDAgMCBhdXRvOwogICAgbWFyZ2luLWxlZnQ6IDE2cHg7Cn0KCi5tanItY29udGV4dC1tZW51LWl0ZW0tbGVmdCBpIHsKICAgIHdpZHRoOiAxNnB4OwogICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgb3BhY2l0eTogMC44MjsKfQoKLm1qci1jb250ZXh0LW1lbnUtaGludCB7CiAgICBvcGFjaXR5OiAwLjU4OwogICAgZm9udC1zaXplOiAxMXB4OwogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKfQoKLm1qci1jb250ZXh0LW1lbnUtc3VibWVudS1hcnJvdyB7CiAgICBvcGFjaXR5OiAwLjcyOwogICAgZm9udC1zaXplOiAxNnB4OwogICAgbGluZS1oZWlnaHQ6IDE7Cn0KCi5tanItYWRkLXRvLWNvbGxlY3Rpb24tbWVudSB7CiAgICBtaW4td2lkdGg6IDI2MHB4OwogICAgbWF4LXdpZHRoOiBtaW4oMzYwcHgsIGNhbGMoMTAwdncgLSAxNnB4KSk7CiAgICBiYWNrZHJvcC1maWx0ZXI6IGJsdXIoMTJweCk7Cn0KCi5tanItY29udGV4dC1tZW51LXRpdGxlIHsKICAgIHBhZGRpbmc6IDhweCAxNHB4IDEwcHg7CiAgICBmb250LXNpemU6IDEycHg7CiAgICBmb250LXdlaWdodDogNzAwOwogICAgY29sb3I6IHZhcigtLWZnLWNvbG9yKTsKICAgIG9wYWNpdHk6IDAuOTI7Cn0KCi5tanItY29udGV4dC1tZW51LW5vdGUgewogICAgcGFkZGluZzogMTBweCAxNHB4OwogICAgZm9udC1zaXplOiAxMnB4OwogICAgY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1jb250ZW50LWZnKSA3MiUsIHZhcigtLW1qci1tdXRlZCkpOwogICAgbGluZS1oZWlnaHQ6IDEuNDU7Cn0KCi5tanItZ3JpZC1wb3BvdmVyLAoubWpyLXZpZXdlci1wb3BvdmVyIHsKICAgIG1pbi13aWR0aDogMjUwcHg7CiAgICBtYXgtd2lkdGg6IG1pbigzNjBweCwgY2FsYygxMDB2dyAtIDE2cHgpKTsKICAgIGJhY2tncm91bmQ6IHZhcigtLW1qci1zdXJmYWNlLTEpOwogICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tbWpyLWJvcmRlcik7CiAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1tanItci1zbSk7CiAgICBib3gtc2hhZG93OiAwIDEycHggMjhweCByZ2JhKDAsIDAsIDAsIDAuMzUpOwp9CgpAbWVkaWEgKHByZWZlcnMtcmVkdWNlZC1tb3Rpb246IHJlZHVjZSkgewogICAgLm1qci12aWV3ZXItb3ZlcmxheSAqLAogICAgLm1qci12aWRlby1jb250cm9scywKICAgIC5tanItY29udGV4dC1tZW51IHsKICAgICAgICBhbmltYXRpb246IG5vbmUgIWltcG9ydGFudDsKICAgICAgICB0cmFuc2l0aW9uOiBub25lICFpbXBvcnRhbnQ7CiAgICAgICAgc2Nyb2xsLWJlaGF2aW9yOiBhdXRvICFpbXBvcnRhbnQ7CiAgICB9Cn0KCi8qIEhpZGUgaGVhZGVyICh0b29sYmFyKSB3aGVuIHZpZXdlciBvdmVybGF5IGlzIGluIGZ1bGxzY3JlZW4gKi8KLm1qci12aWV3ZXItb3ZlcmxheTpmdWxsc2NyZWVuIC5tanItdmlld2VyLWhlYWRlciB7CiAgICBkaXNwbGF5OiBub25lOwp9CgovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICBNYWpvb3IgRmxvYXRpbmcgVmlld2VyIChNRlYpIC0gcG9ydGFsZWQgdG8gZG9jdW1lbnQuYm9keQogICBSZWRlY2xhcmVzIENTUyB2YXJpYWJsZXMgc28gdGhlIHBhbmVsIHdvcmtzIG91dHNpZGUgLm1qci1hc3NldHMtbWFuYWdlcgogICAoc2FtZSBwYXR0ZXJuIGFzIC5tanItcG9wb3ZlcikKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCi5tanItbWZ2IHsKICAgIC0tbWpyLXN1cmZhY2UtMDogdmFyKC0tY29udGVudC1iZywgIzFlMWUxZSk7CiAgICAtLW1qci1zdXJmYWNlLTE6IHZhcigtLWNvbWZ5LW1lbnUtYmcsICMyYTJhMmEpOwogICAgLS1tanItc3VyZmFjZS0yOiB2YXIoLS1jb21meS1tZW51LXNlY29uZGFyeS1iZywgIzMzMyk7CiAgICAtLW1qci1ib3JkZXI6IHZhcigtLWJvcmRlci1jb2xvciwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEyKSk7CiAgICAtLW1qci1tdXRlZDogdmFyKC0tZGVzY3JpcC10ZXh0LCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNjUpKTsKICAgIC0tbWpyLWFjY2VudDogdmFyKC0tY29tZnktYWNjZW50LCAjNWZiM2ZmKTsKICAgIC0tbWpyLXN0YXR1cy1zdWNjZXNzOiB2YXIoLS1jb21meS1zdGF0dXMtc3VjY2VzcywgIzRjYWY1MCk7CgogICAgZm9udC1mYW1pbHk6IHZhcigKICAgICAgICAtLWNvbWZ5LWZvbnQsCiAgICAgICAgdWktc2Fucy1zZXJpZiwKICAgICAgICBzeXN0ZW0tdWksCiAgICAgICAgLWFwcGxlLXN5c3RlbSwKICAgICAgICAiU2Vnb2UgVUkiLAogICAgICAgIFJvYm90bywKICAgICAgICBBcmlhbCwKICAgICAgICBzYW5zLXNlcmlmCiAgICApOwogICAgZm9udC1zaXplOiAxM3B4OwogICAgbGluZS1oZWlnaHQ6IDEuMzU7CiAgICBjb2xvcjogdmFyKC0tY29udGVudC1mZywgdmFyKC0taW5wdXQtdGV4dCwgI2RkZCkpOwogICAgYm94LXNpemluZzogYm9yZGVyLWJveDsKCiAgICAvKiBWaXN1YWwgY2hyb21lICovCiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1tanItc3VyZmFjZS0xKTsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLW1qci1ib3JkZXIpOwogICAgYm9yZGVyLXJhZGl1czogOHB4OwogICAgYm94LXNoYWRvdzoKICAgICAgICAwIDhweCAzMnB4IHJnYmEoMCwgMCwgMCwgMC41NSksCiAgICAgICAgMCAycHggOHB4IHJnYmEoMCwgMCwgMCwgMC4zKTsKfQoKLm1qci1tZnYgKiB7CiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94Owp9CgpodG1sLm1qci1tZnYtcG9wb3V0LWRvY3VtZW50IHsKICAgIGJhY2tncm91bmQ6CiAgICAgICAgcmFkaWFsLWdyYWRpZW50KAogICAgICAgICAgICAxMjAwcHggNDIwcHggYXQgNTAlIDAlLAogICAgICAgICAgICBjb2xvci1taXgoCiAgICAgICAgICAgICAgICBpbiBzcmdiLAogICAgICAgICAgICAgICAgdmFyKC0tcHJpbWFyeS1iYWNrZ3JvdW5kLCB2YXIoLS1jb21meS1hY2NlbnQsICM1ZmIzZmYpKSAxMCUsCiAgICAgICAgICAgICAgICB0cmFuc3BhcmVudAogICAgICAgICAgICApLAogICAgICAgICAgICB0cmFuc3BhcmVudCA2MiUKICAgICAgICApLAogICAgICAgIGxpbmVhci1ncmFkaWVudCgKICAgICAgICAgICAgMTgwZGVnLAogICAgICAgICAgICBjb2xvci1taXgoCiAgICAgICAgICAgICAgICBpbiBzcmdiLAogICAgICAgICAgICAgICAgdmFyKC0taW50ZXJmYWNlLXBhbmVsLXN1cmZhY2UsIHZhcigtLWNvbnRlbnQtYmcsICMxNjE5MWYpKSA4MiUsCiAgICAgICAgICAgICAgICAjMDAwIDE4JQogICAgICAgICAgICApLAogICAgICAgICAgICBjb2xvci1taXgoCiAgICAgICAgICAgICAgICBpbiBzcmdiLAogICAgICAgICAgICAgICAgdmFyKC0taW50ZXJmYWNlLW1lbnUtc3VyZmFjZSwgdmFyKC0tY29tZnktbWVudS1iZywgIzFmMjIyNykpIDg0JSwKICAgICAgICAgICAgICAgICMwMDAgMTYlCiAgICAgICAgICAgICkKICAgICAgICApOwp9Cgpib2R5Lm1qci1tZnYtcG9wb3V0LWJvZHkgewogICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7Cn0KCiNtanItbWZ2LXBvcG91dC1yb290LAoubWpyLW1mdi1wb3BvdXQtcm9vdCB7CiAgICBpc29sYXRpb246IGlzb2xhdGU7Cn0KCi8qIC0tIEhlYWRlciAoZHJhZyBoYW5kbGUpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi5tanItbWZ2LWhlYWRlciB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsKICAgIHBhZGRpbmc6IDZweCAxMHB4OwogICAgYmFja2dyb3VuZDogdmFyKC0tbWpyLXN1cmZhY2UtMSk7CiAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgdmFyKC0tbWpyLWJvcmRlcik7CiAgICBjdXJzb3I6IG1vdmU7CiAgICB1c2VyLXNlbGVjdDogbm9uZTsKICAgIGZsZXgtc2hyaW5rOiAwOwogICAgZ2FwOiA2cHg7CiAgICBtaW4taGVpZ2h0OiAzNHB4Owp9CgoubWpyLW1mdi1oZWFkZXItdGl0bGUgewogICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiAxMHB4OwogICAgZm9udC1zaXplOiAxMnB4OwogICAgZm9udC13ZWlnaHQ6IDYwMDsKICAgIG9wYWNpdHk6IDAuNzg7CiAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7CiAgICBmbGV4OiAxOwogICAgbGV0dGVyLXNwYWNpbmc6IDAuMjhweDsKfQoKLyogLS0gVG9vbGJhciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoubWpyLW1mdi10b29sYmFyIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiA0cHg7CiAgICBwYWRkaW5nOiA0cHggOHB4OwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTApIDUwJSwgdmFyKC0tbWpyLXN1cmZhY2UtMSkgNTAlKTsKICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCB2YXIoLS1tanItYm9yZGVyKTsKICAgIGZsZXgtc2hyaW5rOiAwOwogICAgbWluLWhlaWdodDogMzZweDsKICAgIGZsZXgtd3JhcDogbm93cmFwOwogICAgb3ZlcmZsb3cteDogYXV0bzsKICAgIG92ZXJmbG93LXk6IGhpZGRlbjsKICAgIHNjcm9sbGJhci13aWR0aDogbm9uZTsKfQoubWpyLW1mdi10b29sYmFyOjotd2Via2l0LXNjcm9sbGJhciB7CiAgICBkaXNwbGF5OiBub25lOwp9CgoubWpyLW1mdi10b29sYmFyLXNlcCB7CiAgICB3aWR0aDogMXB4OwogICAgaGVpZ2h0OiAxOHB4OwogICAgYmFja2dyb3VuZDogdmFyKC0tbWpyLWJvcmRlcik7CiAgICBtYXJnaW46IDAgM3B4OwogICAgZmxleC1zaHJpbms6IDA7Cn0KCi5tanItbWZ2LXByb2dyZXNzIHsKICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICBoZWlnaHQ6IDIycHg7CiAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgdmFyKC0tbWpyLWJvcmRlcik7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMCkgNzIlLCAjMDAwIDI4JSk7CiAgICBmbGV4LXNocmluazogMDsKICAgIGN1cnNvcjogZGVmYXVsdDsKfQoKLm1qci1tZnYtcHJvZ3Jlc3MuaXMtY2xpY2thYmxlIHsKICAgIGN1cnNvcjogcG9pbnRlcjsKfQoKLm1qci1tZnYtcHJvZ3Jlc3MuaXMtY2xpY2thYmxlOmhvdmVyIHsKICAgIGZpbHRlcjogYnJpZ2h0bmVzcygxLjAzKTsKfQoKLm1qci1tZnYtcHJvZ3Jlc3MtYmFyIHsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIGxlZnQ6IDA7CiAgICB3aWR0aDogMCU7CiAgICB0cmFuc2l0aW9uOiB3aWR0aCA3MG1zIGVhc2UtaW4tb3V0Owp9CgoubWpyLW1mdi1wcm9ncmVzcy1iYXItLW5vZGVzIHsKICAgIHRvcDogMDsKICAgIGhlaWdodDogNTAlOwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdGF0dXMtc3VjY2VzcykgNjglLCAjMGIzNTEzIDMyJSk7Cn0KCi5tanItbWZ2LXByb2dyZXNzLWJhci0tc3RlcHMgewogICAgdG9wOiA1MCU7CiAgICBoZWlnaHQ6IDUwJTsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYWNjZW50KSA2NCUsICMwYjIzNDAgMzYlKTsKfQoKLm1qci1tZnYtcHJvZ3Jlc3MuaXMtZXJyb3IgLm1qci1tZnYtcHJvZ3Jlc3MtYmFyLS1ub2RlcywKLm1qci1tZnYtcHJvZ3Jlc3MuaXMtZXJyb3IgLm1qci1tZnYtcHJvZ3Jlc3MtYmFyLS1zdGVwcyB7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgI2Q5NTM0ZiA3OCUsICM0YTE0MTQgMjIlKTsKfQoKLm1qci1tZnYtcHJvZ3Jlc3Mtb3ZlcmxheSB7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICBpbnNldDogMDsKICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCh0byBib3R0b20sIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xOCksIHJnYmEoMCwgMCwgMCwgMC4xOCkpOwogICAgbWl4LWJsZW5kLW1vZGU6IHNjcmVlbjsKICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwp9CgoubWpyLW1mdi1wcm9ncmVzcy10ZXh0IHsKICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgIHotaW5kZXg6IDI7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGhlaWdodDogMTAwJTsKICAgIHBhZGRpbmc6IDAgOHB4OwogICAgY29sb3I6IHZhcigtLWNvbnRlbnQtZmcsICNkZGQpOwogICAgZm9udC1zaXplOiAxMXB4OwogICAgZm9udC13ZWlnaHQ6IDYwMDsKICAgIHRleHQtc2hhZG93OiAwIDAgMnB4IHJnYmEoMCwgMCwgMCwgMC45KTsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7Cn0KCi5tanItbWZ2LXBpbi1ncm91cCB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZ2FwOiAycHg7CiAgICBmbGV4LXNocmluazogMDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7Cn0KLm1qci1tZnYtcGluLWJ0biB7CiAgICB3aWR0aDogMjZweDsKICAgIGhlaWdodDogMjZweDsKICAgIGJvcmRlci1yYWRpdXM6IDVweDsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLW1qci1ib3JkZXIpOwogICAgYmFja2dyb3VuZDogdmFyKC0tbWpyLXN1cmZhY2UtMik7CiAgICBjb2xvcjogdmFyKC0tY29udGVudC1mZywgI2RkZCk7CiAgICBmb250LXNpemU6IDExcHg7CiAgICBmb250LXdlaWdodDogNjAwOwogICAgY3Vyc29yOiBwb2ludGVyOwogICAgcGFkZGluZzogMDsKICAgIGxpbmUtaGVpZ2h0OiAyNHB4OwogICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgdHJhbnNpdGlvbjoKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yIDEyMG1zIGVhc2UsCiAgICAgICAgYm9yZGVyLWNvbG9yIDEyMG1zIGVhc2UsCiAgICAgICAgY29sb3IgMTIwbXMgZWFzZSwKICAgICAgICBib3gtc2hhZG93IDEyMG1zIGVhc2U7Cn0KLm1qci1tZnYtcGluLWJ0bjpob3ZlciB7CiAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYWNjZW50KSA0NSUsIHZhcigtLW1qci1ib3JkZXIpKTsKICAgIGJhY2tncm91bmQtY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0yKSA4MCUsIHZhcigtLW1qci1hY2NlbnQpIDglKTsKfQoubWpyLW1mdi1waW4tYnRuLmlzLXBpbm5lZCB7CiAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYWNjZW50KSA1OCUsICNmZmZmZmYgMTIlKTsKICAgIGJhY2tncm91bmQtY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0yKSA0MiUsIHZhcigtLW1qci1hY2NlbnQpIDU4JSk7CiAgICBjb2xvcjogI2VlZjdmZjsKICAgIGJveC1zaGFkb3c6IGluc2V0IDAgMCAwIDFweCBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWFjY2VudCkgMjQlLCB0cmFuc3BhcmVudCk7Cn0KCi8qIC0tIFBpbiBncm91cDogbm93IGEgZHJvcGRvd24gbWVudSAoZGlzcGxheTpub25lIGJ5IGRlZmF1bHQsIGZsZXggd2hlbiAuaXMtb3BlbikgLS0gKi8KLm1qci1tZnYtcGluLWdyb3VwIHsKICAgIGRpc3BsYXk6IG5vbmU7CiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgZ2FwOiAycHg7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICB0b3A6IGNhbGMoMTAwJSArIDRweCk7CiAgICBsZWZ0OiAwOwogICAgei1pbmRleDogMTAwMTA7CiAgICBtaW4td2lkdGg6IDcwcHg7CiAgICBwYWRkaW5nOiA0cHg7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1jb21meS1tZW51LWJnLCAjMmEyYTJhKTsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLW1qci1ib3JkZXIsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xMikpOwogICAgYm9yZGVyLXJhZGl1czogOHB4OwogICAgYm94LXNoYWRvdzogMCA4cHggMjRweCByZ2JhKDAsIDAsIDAsIDAuNTUpOwp9Ci5tanItbWZ2LXBpbi1ncm91cC5pcy1vcGVuIHsKICAgIGRpc3BsYXk6IGZsZXg7Cn0KLm1qci1tZnYtcGluLWJ0biB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgd2lkdGg6IDEwMCU7CiAgICBoZWlnaHQ6IDMwcHg7CiAgICBib3JkZXItcmFkaXVzOiA2cHg7CiAgICBib3JkZXI6IDFweCBzb2xpZCB0cmFuc3BhcmVudDsKICAgIGJhY2tncm91bmQ6IG5vbmU7CiAgICBjb2xvcjogdmFyKC0tY29udGVudC1mZywgI2RkZCk7CiAgICBmb250LXNpemU6IDEycHg7CiAgICBmb250LXdlaWdodDogNjAwOwogICAgY3Vyc29yOiBwb2ludGVyOwogICAgcGFkZGluZzogMCAxMHB4OwogICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgdHJhbnNpdGlvbjoKICAgICAgICBiYWNrZ3JvdW5kIDEyMG1zIGVhc2UsCiAgICAgICAgYm9yZGVyLWNvbG9yIDEyMG1zIGVhc2UsCiAgICAgICAgY29sb3IgMTIwbXMgZWFzZTsKfQoubWpyLW1mdi1waW4tYnRuOmhvdmVyIHsKICAgIGJhY2tncm91bmQ6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wOCk7CiAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYWNjZW50KSAzNSUsIHRyYW5zcGFyZW50KTsKfQoubWpyLW1mdi1waW4tYnRuLmlzLXBpbm5lZCB7CiAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYWNjZW50KSA1OCUsICNmZmZmZmYgMTIlKTsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0yLCAjMzMzKSA0MiUsIHZhcigtLW1qci1hY2NlbnQsICM1ZmIzZmYpIDU4JSk7CiAgICBjb2xvcjogI2VlZjdmZjsKfQoKLyogLS0gSWNvbiBEcm9wZG93biBjb21wb25lbnQgKC5tanItbWZ2LWlkcm9wKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLm1qci1tZnYtaWRyb3AgewogICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZmxleC1zaHJpbms6IDA7Cn0KCi5tanItbWZ2LWlkcm9wLW1lbnUgewogICAgZGlzcGxheTogbm9uZTsKICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICBnYXA6IDJweDsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIHotaW5kZXg6IDEwMDEwOwogICAgbWluLXdpZHRoOiAxMTBweDsKICAgIHBhZGRpbmc6IDRweDsKICAgIGJhY2tncm91bmQ6IHZhcigtLWNvbWZ5LW1lbnUtYmcsICMyYTJhMmEpOwogICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tbWpyLWJvcmRlciwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEyKSk7CiAgICBib3JkZXItcmFkaXVzOiA4cHg7CiAgICBib3gtc2hhZG93OiAwIDhweCAyNHB4IHJnYmEoMCwgMCwgMCwgMC41NSk7CiAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwp9Ci5tanItbWZ2LWlkcm9wLW1lbnUuaXMtb3BlbiB7CiAgICBkaXNwbGF5OiBmbGV4Owp9CgoubWpyLW1mdi1pZHJvcC1pdGVtIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiA4cHg7CiAgICB3aWR0aDogMTAwJTsKICAgIHBhZGRpbmc6IDZweCAxMHB4OwogICAgYmFja2dyb3VuZDogbm9uZTsKICAgIGJvcmRlcjogbm9uZTsKICAgIGJvcmRlci1yYWRpdXM6IDZweDsKICAgIGNvbG9yOiB2YXIoLS1pbnB1dC10ZXh0LCAjZGRkKTsKICAgIGZvbnQtc2l6ZTogMTJweDsKICAgIGZvbnQtZmFtaWx5OiBpbmhlcml0OwogICAgdGV4dC1hbGlnbjogbGVmdDsKICAgIGN1cnNvcjogcG9pbnRlcjsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICB0cmFuc2l0aW9uOiBiYWNrZ3JvdW5kIDAuMXMgZWFzZTsKfQoubWpyLW1mdi1pZHJvcC1pdGVtOmhvdmVyIHsKICAgIGJhY2tncm91bmQ6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wOCk7Cn0KLm1qci1tZnYtaWRyb3AtaXRlbS5pcy1zZWxlY3RlZCB7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDk1LCAxNzksIDI1NSwgMC4xNik7CiAgICBjb2xvcjogI2E4ZDhmZjsKfQoubWpyLW1mdi1pZHJvcC10cmlnZ2VyW2FyaWEtZXhwYW5kZWQ9InRydWUiXSB7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMSkgIWltcG9ydGFudDsKICAgIGJvcmRlci1jb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjIpICFpbXBvcnRhbnQ7Cn0KLyogQ2hhbm5lbCB0cmlnZ2VyOiBzbGlnaHRseSB3aWRlciB0byBmaXQgIlJHQiIgKi8KLm1qci1tZnYtY2gtbGFiZWwgewogICAgZm9udC1zaXplOiAxMnB4OwogICAgbGV0dGVyLXNwYWNpbmc6IDAuMDRlbTsKICAgIGxpbmUtaGVpZ2h0OiAxOwp9CgovKiBUb29sYmFyIGljb24tYnV0dG9uIHBvcG92ZXJzIChjaGFubmVsLCBndWlkZXMsIHBpbiwgZm9ybWF0IC0gc29ydC1zdHlsZSBjb250ZXh0IG1lbnVzKSAqLwoubWpyLW1mdi1jaC1wb3BvdmVyLAoubWpyLW1mdi1ndWlkZXMtcG9wb3ZlciwKLm1qci1tZnYtcGluLXBvcG92ZXIsCi5tanItbWZ2LWZvcm1hdC1wb3BvdmVyIHsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIG1pbi13aWR0aDogMTIwcHg7CiAgICBwYWRkaW5nOiA2cHg7CiAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1yYWRpdXMtbGcsIDAuNXJlbSk7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1tanItc3VyZmFjZS0xLCB2YXIoLS1jb21meS1tZW51LWJnLCAjMmEyYTJhKSk7CiAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1tanItYm9yZGVyLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTIpKTsKICAgIGJveC1zaGFkb3c6IDAgOHB4IDI0cHggcmdiYSgwLCAwLCAwLCAwLjU1KTsKICAgIHotaW5kZXg6IDEwMDEwOwogICAgZGlzcGxheTogbm9uZTsKfQoubWpyLW1mdi1jaC1wb3BvdmVyLmlzLW9wZW4sCi5tanItbWZ2LWd1aWRlcy1wb3BvdmVyLmlzLW9wZW4sCi5tanItbWZ2LXBpbi1wb3BvdmVyLmlzLW9wZW4sCi5tanItbWZ2LWZvcm1hdC1wb3BvdmVyLmlzLW9wZW4gewogICAgZGlzcGxheTogYmxvY2s7Cn0KLyogVG9vbGJhciBpY29uIGltYWdlcyAtIGNoIGljb24gaXMgYmxhY2sgKGludmVydGVkKSwgZ3VpZGVzIGljb24gaXMgbmF0aXZlIHdoaXRlICovCi5tanItbWZ2LWNoLWljb24gewogICAgd2lkdGg6IDE4cHg7CiAgICBoZWlnaHQ6IDE4cHg7CiAgICBmaWx0ZXI6IGludmVydCgxKTsKICAgIG9wYWNpdHk6IDAuODU7CiAgICBkaXNwbGF5OiBibG9jazsKfQoubWpyLW1mdi1ndWlkZXMtaWNvbiB7CiAgICB3aWR0aDogMThweDsKICAgIGhlaWdodDogMThweDsKICAgIG9wYWNpdHk6IDAuODU7CiAgICBkaXNwbGF5OiBibG9jazsKfQoubWpyLW1mdi1jaC10cmlnZ2VyW2FyaWEtZXhwYW5kZWQ9InRydWUiXSwKLm1qci1tZnYtZ3VpZGVzLXRyaWdnZXJbYXJpYS1leHBhbmRlZD0idHJ1ZSJdLAoubWpyLW1mdi1waW4tdHJpZ2dlclthcmlhLWV4cGFuZGVkPSJ0cnVlIl0sCi5tanItbWZ2LWZvcm1hdC10cmlnZ2VyW2FyaWEtZXhwYW5kZWQ9InRydWUiXSB7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMSkgIWltcG9ydGFudDsKICAgIGJvcmRlci1jb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjIpICFpbXBvcnRhbnQ7Cn0KLyogUGluIHNsb3QgYWN0aXZlIHN0YXRlICovCi5tanItbWZ2LXBpbi1wb3BvdmVyIC5tanItbWVudS1pdGVtLmlzLXBpbm5lZCB7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDk1LCAxNzksIDI1NSwgMC4xNik7CiAgICBjb2xvcjogI2E4ZDhmZjsKfQoubWpyLW1mdi1waW4tcG9wb3ZlciAubWpyLW1lbnUtaXRlbS5pcy1waW5uZWQgLm1qci1tZW51LWl0ZW0tY2hlY2sgewogICAgb3BhY2l0eTogMSAhaW1wb3J0YW50Owp9Ci8qIEZvcm1hdCBwb3BvdmVyOiBzZXBhcmF0b3IgKyBvcGFjaXR5IHNsaWRlciByb3cgKi8KLm1qci1tZnYtZm9ybWF0LXNlcCB7CiAgICBoZWlnaHQ6IDFweDsKICAgIGJhY2tncm91bmQ6IHZhcigtLW1qci1ib3JkZXIsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xKSk7CiAgICBtYXJnaW46IDRweCAycHg7Cn0KLm1qci1tZnYtZm9ybWF0LXNsaWRlci1yb3cgewogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBnYXA6IDZweDsKICAgIHBhZGRpbmc6IDRweCA4cHggMnB4Owp9Ci5tanItbWZ2LWZvcm1hdC1zbGlkZXItbGFiZWwgewogICAgZm9udC1zaXplOiAxMXB4OwogICAgY29sb3I6IHZhcigtLWlucHV0LXRleHQsICNkZGQpOwogICAgb3BhY2l0eTogMC42NTsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICBmbGV4LXNocmluazogMDsKfQoubWpyLW1mdi1mb3JtYXQtcG9wb3ZlciBpbnB1dFt0eXBlPSJyYW5nZSJdIHsKICAgIGZsZXg6IDE7CiAgICBtaW4td2lkdGg6IDcwcHg7CiAgICBhY2NlbnQtY29sb3I6IHZhcigtLW1qci1hY2NlbnQsICM1ZmIzZmYpOwp9Ci5tanItbWZ2LWZvcm1hdC1wb3BvdmVyIC5tanItbWZ2LXRvb2xiYXItcmFuZ2Utb3V0IHsKICAgIGZvbnQtc2l6ZTogMTFweDsKICAgIGNvbG9yOiB2YXIoLS1pbnB1dC10ZXh0LCAjZGRkKTsKICAgIG9wYWNpdHk6IDAuNjU7CiAgICBtaW4td2lkdGg6IDMwcHg7CiAgICB0ZXh0LWFsaWduOiByaWdodDsKICAgIGZsZXgtc2hyaW5rOiAwOwp9CgoubWpyLW1mdiAubWpyLWljb24tYnRuIHsKICAgIHdpZHRoOiAzMHB4OwogICAgaGVpZ2h0OiAzMHB4OwogICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICBib3JkZXItcmFkaXVzOiA3cHg7CiAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1tanItYm9yZGVyKTsKICAgIGJhY2tncm91bmQ6IHZhcigtLW1qci1zdXJmYWNlLTIpOwogICAgY29sb3I6IHZhcigtLWNvbnRlbnQtZmcsICNkZGQpOwogICAgY3Vyc29yOiBwb2ludGVyOwogICAgcGFkZGluZzogMDsKICAgIGZsZXgtc2hyaW5rOiAwOwogICAgdHJhbnNpdGlvbjoKICAgICAgICB0cmFuc2Zvcm0gMTIwbXMgZWFzZSwKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yIDEyMG1zIGVhc2UsCiAgICAgICAgYm9yZGVyLWNvbG9yIDEyMG1zIGVhc2UsCiAgICAgICAgY29sb3IgMTIwbXMgZWFzZSwKICAgICAgICBib3gtc2hhZG93IDEyMG1zIGVhc2U7Cn0KCi5tanItbWZ2IC5tanItaWNvbi1idG46aG92ZXIgewogICAgYm9yZGVyLWNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWFjY2VudCkgNDUlLCB2YXIoLS1tanItYm9yZGVyKSk7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMikgODAlLCB2YXIoLS1tanItYWNjZW50KSA4JSk7CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTFweCk7Cn0KCi5tanItbWZ2IC5tanItaWNvbi1idG46Zm9jdXMtdmlzaWJsZSB7CiAgICBvdXRsaW5lOiBub25lOwogICAgYm9yZGVyLWNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWFjY2VudCkgNTglLCB2YXIoLS1tanItYm9yZGVyKSk7CiAgICBib3gtc2hhZG93OiAwIDAgMCAycHggY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQpIDI0JSwgdHJhbnNwYXJlbnQpOwp9CgoubWpyLW1mdiAubWpyLWljb24tYnRuIC5waSB7CiAgICBmb250LXNpemU6IDEzcHg7CiAgICBsaW5lLWhlaWdodDogMTsKICAgIG9wYWNpdHk6IDAuOTsKfQoKLyogVW5pdmVyc2FsIGFjdGl2ZSBoaWdobGlnaHQgLSBhbnkgYXJpYS1wcmVzc2VkPSJ0cnVlIiBidXR0b24gZ2V0cyBhY2NlbnQgZ2xvdy4KICAgUGxhY2VkIGJlZm9yZSB0aGUgY29sb3JlZCBhY3RpdmUgY2xhc3NlcyBzbyB0aGV5IGNhbiBvdmVycmlkZSB3aXRoIHRoZWlyIG93biBjb2xvci4gKi8KLm1qci1tZnYgLm1qci1pY29uLWJ0blthcmlhLXByZXNzZWQ9InRydWUiXSB7CiAgICBib3JkZXItY29sb3I6IHJnYmEoOTUsIDE3OSwgMjU1LCAwLjU1KTsKICAgIGNvbG9yOiB2YXIoLS1tanItYWNjZW50LCAjNWZiM2ZmKTsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0yLCAjMzMzKSA4MCUsIHZhcigtLW1qci1hY2NlbnQsICM1ZmIzZmYpIDE1JSk7CiAgICBib3gtc2hhZG93OiAwIDAgMCAxcHggY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQsICM1ZmIzZmYpIDI1JSwgdHJhbnNwYXJlbnQpOwp9Ci5tanItbWZ2IC5tanItaWNvbi1idG5bYXJpYS1wcmVzc2VkPSJ0cnVlIl0gLnBpIHsKICAgIG9wYWNpdHk6IDE7Cn0KCi5tanItbWZ2IC5tanItaWNvbi1idG4ubWpyLWxpdmUtYWN0aXZlIHsKICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdGF0dXMtc3VjY2VzcykgNjAlLCB2YXIoLS1tanItYm9yZGVyKSk7CiAgICBjb2xvcjogdmFyKC0tbWpyLXN0YXR1cy1zdWNjZXNzKTsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0yKSA4MCUsIHZhcigtLW1qci1zdGF0dXMtc3VjY2VzcykgMTIlKTsKICAgIGJveC1zaGFkb3c6IDAgMCAwIDFweCBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN0YXR1cy1zdWNjZXNzKSAyNSUsIHRyYW5zcGFyZW50KTsKfQoKLm1qci1tZnYgLm1qci1pY29uLWJ0bi5tanItbGl2ZS1hY3RpdmUgLnBpIHsKICAgIG9wYWNpdHk6IDE7Cn0KCi5tanItbWZ2IC5tanItaWNvbi1idG4ubWpyLXByZXZpZXctYWN0aXZlIHsKICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQpIDYwJSwgdmFyKC0tbWpyLWJvcmRlcikpOwogICAgY29sb3I6IHZhcigtLW1qci1hY2NlbnQpOwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTIpIDgwJSwgdmFyKC0tbWpyLWFjY2VudCkgMTIlKTsKICAgIGJveC1zaGFkb3c6IDAgMCAwIDFweCBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWFjY2VudCkgMjUlLCB0cmFuc3BhcmVudCk7Cn0KCi5tanItbWZ2IC5tanItaWNvbi1idG4ubWpyLXByZXZpZXctYWN0aXZlIC5waSB7CiAgICBvcGFjaXR5OiAxOwp9CgoubWpyLW1mdiAubWpyLWljb24tYnRuLm1qci1ub2Rlc3RyZWFtLWFjdGl2ZSB7CiAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3RhdHVzLXdhcm5pbmcsICNmZjk4MDApIDYwJSwgdmFyKC0tbWpyLWJvcmRlcikpOwogICAgY29sb3I6IHZhcigtLW1qci1zdGF0dXMtd2FybmluZywgI2ZmOTgwMCk7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoCiAgICAgICAgaW4gc3JnYiwKICAgICAgICB2YXIoLS1tanItc3VyZmFjZS0yKSA4MCUsCiAgICAgICAgdmFyKC0tbWpyLXN0YXR1cy13YXJuaW5nLCAjZmY5ODAwKSAxMiUKICAgICk7CiAgICBib3gtc2hhZG93OiAwIDAgMCAxcHggY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdGF0dXMtd2FybmluZywgI2ZmOTgwMCkgMjUlLCB0cmFuc3BhcmVudCk7Cn0KCi5tanItbWZ2IC5tanItaWNvbi1idG4ubWpyLW5vZGVzdHJlYW0tYWN0aXZlIC5waSB7CiAgICBvcGFjaXR5OiAxOwp9CgovKiBQb3AtaW4gbW9kZSAodmlld2VyIHBvcHBlZCBvdXQpOiByYWlzZSBidXR0b24gY29udHJhc3QvYnJpZ2h0bmVzcyAqLwoubWpyLW1mdi5tanItbWZ2LS1wb3BwZWQgewogICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KAogICAgICAgIDE4MGRlZywKICAgICAgICBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMSkgOTIlLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDQpKSwKICAgICAgICBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMCkgOTIlLCByZ2JhKDAsIDAsIDAsIDAuMTgpKQogICAgKTsKICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1ib3JkZXIpIDc0JSwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE4KSk7CiAgICBib3gtc2hhZG93OgogICAgICAgIGluc2V0IDAgMXB4IDAgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA1KSwKICAgICAgICAwIDI0cHggNTZweCByZ2JhKDAsIDAsIDAsIDAuNDIpOwp9CgoubWpyLW1mdi5tanItbWZ2LS1wb3BwZWQgLm1qci1tZnYtaGVhZGVyIHsKICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgKICAgICAgICAxODBkZWcsCiAgICAgICAgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTIpIDg4JSwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA4KSksCiAgICAgICAgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTEpIDkwJSwgcmdiYSgwLCAwLCAwLCAwLjI0KSkKICAgICk7CiAgICBib3JkZXItYm90dG9tLWNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWJvcmRlcikgNzglLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTQpKTsKICAgIGJveC1zaGFkb3c6IGluc2V0IDAgMXB4IDAgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA0KTsKfQoKLm1qci1tZnYubWpyLW1mdi0tcG9wcGVkIC5tanItbWZ2LWhlYWRlci10aXRsZSB7CiAgICBvcGFjaXR5OiAwLjk4OwogICAgY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1jb250ZW50LWZnLCAjZWVmNGZmKSA5NCUsICNmZmZmZmYgNiUpOwp9CgoubWpyLW1mdi5tanItbWZ2LS1wb3BwZWQgLm1qci1tZnYtdG9vbGJhciB7CiAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoCiAgICAgICAgMTgwZGVnLAogICAgICAgIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0xKSA4OCUsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wNCkpLAogICAgICAgIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0wKSA5MCUsIHJnYmEoMCwgMCwgMCwgMC4yNCkpCiAgICApOwogICAgYm9yZGVyLWJvdHRvbS1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1ib3JkZXIpIDc4JSwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE0KSk7Cn0KCi5tanItbWZ2Lm1qci1tZnYtLXBvcHBlZCAubWpyLW1mdi10b29sYmFyLXNlcCB7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWJvcmRlcikgNzglLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTgpKTsKfQoKLm1qci1tZnYubWpyLW1mdi0tcG9wcGVkIC5tanItbWZ2LXByb2dyZXNzIHsKICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgKICAgICAgICAxODBkZWcsCiAgICAgICAgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTApIDgyJSwgIzBhMTExOCAxOCUpLAogICAgICAgIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0wKSA5MiUsICMwMDAgOCUpCiAgICApOwogICAgYm9yZGVyLWJvdHRvbS1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1ib3JkZXIpIDc4JSwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE0KSk7Cn0KCi5tanItbWZ2Lm1qci1tZnYtLXBvcHBlZCAubWpyLW1mdi1wcm9ncmVzcy10ZXh0IHsKICAgIGNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tY29udGVudC1mZywgI2VlZjRmZikgOTQlLCAjZmZmZmZmIDYlKTsKfQoKLm1qci1tZnYubWpyLW1mdi0tcG9wcGVkIC5tanItbWZ2LWNvbnRlbnQgewogICAgYmFja2dyb3VuZDoKICAgICAgICByYWRpYWwtZ3JhZGllbnQoCiAgICAgICAgICAgIGNpcmNsZSBhdCB0b3AsCiAgICAgICAgICAgIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYWNjZW50KSAxMCUsIHRyYW5zcGFyZW50KSAwJSwKICAgICAgICAgICAgdHJhbnNwYXJlbnQgNDIlCiAgICAgICAgKSwKICAgICAgICBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMCkgODIlLCAjMDAwIDE4JSk7Cn0KCi5tanItbWZ2Lm1qci1tZnYtLXBvcHBlZCAubWpyLWljb24tYnRuIHsKICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1ib3JkZXIpIDc2JSwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE2KSk7CiAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoCiAgICAgICAgMTgwZGVnLAogICAgICAgIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0yKSA4NiUsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wOCkpLAogICAgICAgIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0xKSA5MiUsIHJnYmEoMCwgMCwgMCwgMC4xOCkpCiAgICApOwogICAgY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1jb250ZW50LWZnLCAjZGRkKSA5MiUsICNmZmZmZmYgOCUpICFpbXBvcnRhbnQ7CiAgICBib3gtc2hhZG93OgogICAgICAgIGluc2V0IDAgMXB4IDAgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA1KSwKICAgICAgICAwIDhweCAxOHB4IHJnYmEoMCwgMCwgMCwgMC4xOCk7Cn0KCi5tanItbWZ2Lm1qci1tZnYtLXBvcHBlZCAubWpyLWljb24tYnRuOmhvdmVyIHsKICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQpIDUyJSwgdmFyKC0tbWpyLWJvcmRlcikpOwogICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KAogICAgICAgIDE4MGRlZywKICAgICAgICBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMikgNTglLCB2YXIoLS1tanItYWNjZW50KSA0MiUpLAogICAgICAgIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0xKSA2MiUsIHZhcigtLW1qci1hY2NlbnQpIDM4JSkKICAgICk7CiAgICBjb2xvcjogI2Y0ZjhmZiAhaW1wb3J0YW50Owp9CgoubWpyLW1mdi5tanItbWZ2LS1wb3BwZWQgLm1qci1pY29uLWJ0biAucGkgewogICAgb3BhY2l0eTogMTsKICAgIGNvbG9yOiBpbmhlcml0ICFpbXBvcnRhbnQ7Cn0KCi5tanItbWZ2Lm1qci1tZnYtLXBvcHBlZCAubWpyLWljb24tYnRuLm1qci1saXZlLWFjdGl2ZSB7CiAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3RhdHVzLXN1Y2Nlc3MpIDYwJSwgI2ZmZmZmZiA0MCUpOwogICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KAogICAgICAgIDE4MGRlZywKICAgICAgICBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN0YXR1cy1zdWNjZXNzKSA2MiUsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wOCkpLAogICAgICAgIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3RhdHVzLXN1Y2Nlc3MpIDM2JSwgdmFyKC0tbWpyLXN1cmZhY2UtMSkgNjQlKQogICAgKTsKICAgIGNvbG9yOiAjZmZmZmZmICFpbXBvcnRhbnQ7CiAgICBib3gtc2hhZG93OgogICAgICAgIGluc2V0IDAgMXB4IDAgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEyKSwKICAgICAgICAwIDAgMCAxcHggY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdGF0dXMtc3VjY2VzcykgMjQlLCB0cmFuc3BhcmVudCksCiAgICAgICAgMCAwIDE4cHggcmdiYSg3NiwgMTc1LCA4MCwgMC4xOCk7Cn0KCi5tanItbWZ2Lm1qci1tZnYtLXBvcHBlZCAubWpyLWljb24tYnRuLm1qci1wcmV2aWV3LWFjdGl2ZSB7CiAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYWNjZW50KSA1OCUsICNmZmZmZmYgNDIlKTsKICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgKICAgICAgICAxODBkZWcsCiAgICAgICAgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQpIDYyJSwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA4KSksCiAgICAgICAgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQpIDM2JSwgdmFyKC0tbWpyLXN1cmZhY2UtMSkgNjQlKQogICAgKTsKICAgIGNvbG9yOiAjZmZmZmZmICFpbXBvcnRhbnQ7CiAgICBib3gtc2hhZG93OgogICAgICAgIGluc2V0IDAgMXB4IDAgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEyKSwKICAgICAgICAwIDAgMCAxcHggY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQpIDI0JSwgdHJhbnNwYXJlbnQpLAogICAgICAgIDAgMCAxOHB4IHJnYmEoOTUsIDE3OSwgMjU1LCAwLjE4KTsKfQoKLm1qci1tZnYubWpyLW1mdi0tcG9wcGVkIC5tanItaWNvbi1idG4ubWpyLW5vZGVzdHJlYW0tYWN0aXZlIHsKICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdGF0dXMtd2FybmluZywgI2ZmOTgwMCkgNTglLCAjZmZmZmZmIDQyJSk7CiAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoCiAgICAgICAgMTgwZGVnLAogICAgICAgIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3RhdHVzLXdhcm5pbmcsICNmZjk4MDApIDYyJSwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA4KSksCiAgICAgICAgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdGF0dXMtd2FybmluZywgI2ZmOTgwMCkgMzYlLCB2YXIoLS1tanItc3VyZmFjZS0xKSA2NCUpCiAgICApOwogICAgY29sb3I6ICNmZmZmZmYgIWltcG9ydGFudDsKICAgIGJveC1zaGFkb3c6CiAgICAgICAgaW5zZXQgMCAxcHggMCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTIpLAogICAgICAgIDAgMCAwIDFweCBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN0YXR1cy13YXJuaW5nLCAjZmY5ODAwKSAyNCUsIHRyYW5zcGFyZW50KSwKICAgICAgICAwIDAgMThweCByZ2JhKDI1NSwgMTUyLCAwLCAwLjE4KTsKfQoKLm1qci1tZnYubWpyLW1mdi0tcG9wcGVkIC5tanItbWZ2LXBpbi1idG4gewogICAgYm9yZGVyLWNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWJvcmRlcikgNzYlLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTYpKTsKICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgKICAgICAgICAxODBkZWcsCiAgICAgICAgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTIpIDg0JSwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA4KSksCiAgICAgICAgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTEpIDkyJSwgcmdiYSgwLCAwLCAwLCAwLjE4KSkKICAgICk7CiAgICBjb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLWNvbnRlbnQtZmcsICNkZGQpIDkyJSwgI2ZmZmZmZiA4JSk7CiAgICBib3gtc2hhZG93OiBpbnNldCAwIDFweCAwIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wNCk7Cn0KCi5tanItbWZ2Lm1qci1tZnYtLXBvcHBlZCAubWpyLW1mdi1waW4tYnRuOmhvdmVyIHsKICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQpIDUyJSwgdmFyKC0tbWpyLWJvcmRlcikpOwogICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KAogICAgICAgIDE4MGRlZywKICAgICAgICBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMikgNTYlLCB2YXIoLS1tanItYWNjZW50KSA0NCUpLAogICAgICAgIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0xKSA2NCUsIHZhcigtLW1qci1hY2NlbnQpIDM2JSkKICAgICk7Cn0KCi5tanItbWZ2Lm1qci1tZnYtLXBvcHBlZCAubWpyLW1mdi1waW4tYnRuLmlzLXBpbm5lZCB7CiAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYWNjZW50KSA1OCUsICNmZmZmZmYgNDIlKTsKICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgKICAgICAgICAxODBkZWcsCiAgICAgICAgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQpIDYyJSwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA4KSksCiAgICAgICAgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQpIDM2JSwgdmFyKC0tbWpyLXN1cmZhY2UtMSkgNjQlKQogICAgKTsKICAgIGNvbG9yOiAjZmZmZmZmOwp9CgoubWpyLW1mdi5tanItbWZ2LS1wb3BwZWQgLm1qci13cy1zaWRlYmFyIHsKICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgKICAgICAgICAxODBkZWcsCiAgICAgICAgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTEpIDk0JSwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA0KSksCiAgICAgICAgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTApIDk0JSwgcmdiYSgwLCAwLCAwLCAwLjE4KSkKICAgICk7CiAgICBib3JkZXItbGVmdC1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1ib3JkZXIpIDc4JSwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE2KSk7CiAgICBib3gtc2hhZG93OiBpbnNldCAxcHggMCAwIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wMyk7Cn0KCi5tanItbWZ2Lm1qci1tZnYtLXBvcHBlZCAubWpyLW1mdi1jb250ZW50LXdyYXBwZXJbZGF0YS1zaWRlYmFyLXBvcz0ibGVmdCJdIC5tanItd3Mtc2lkZWJhciB7CiAgICBib3JkZXItcmlnaHQtY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYm9yZGVyKSA3OCUsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xNikpOwp9CgoubWpyLW1mdi5tanItbWZ2LS1wb3BwZWQgLm1qci13cy1zaWRlYmFyLWhlYWRlciB7CiAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoCiAgICAgICAgMTgwZGVnLAogICAgICAgIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0yKSA4NCUsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wNSkpLAogICAgICAgIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0xKSA5MiUsIHJnYmEoMCwgMCwgMCwgMC4xOCkpCiAgICApOwogICAgYm9yZGVyLWJvdHRvbS1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1ib3JkZXIpIDc2JSwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE0KSk7Cn0KCi5tanItbWZ2Lm1qci1tZnYtLXBvcHBlZCAubWpyLXdzLXNpZGViYXItdGl0bGUgewogICAgY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1jb250ZW50LWZnLCAjZWVmNGZmKSA4MiUsIHZhcigtLW1qci1tdXRlZCkgMTglKTsKICAgIG9wYWNpdHk6IDAuODg7Cn0KCi5tanItbWZ2Lm1qci1tZnYtLXBvcHBlZCAubWpyLXdzLW5vZGUgewogICAgYm9yZGVyLWJvdHRvbS1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1ib3JkZXIpIDcyJSwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEyKSk7Cn0KCi5tanItbWZ2Lm1qci1tZnYtLXBvcHBlZCAubWpyLXdzLW5vZGUtaGVhZGVyIHsKICAgIGJhY2tncm91bmQ6CiAgICAgICAgbGluZWFyLWdyYWRpZW50KDE4MGRlZywgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA0KSwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwKSksCiAgICAgICAgbGluZWFyLWdyYWRpZW50KAogICAgICAgICAgICAxODBkZWcsCiAgICAgICAgICAgIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0xKSA4NiUsIHZhcigtLW1qci1hY2NlbnQpIDE0JSksCiAgICAgICAgICAgIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0wKSA4NiUsIHJnYmEoMCwgMCwgMCwgMC4xNCkpCiAgICAgICAgKTsKICAgIGJveC1zaGFkb3c6IGluc2V0IDAgMXB4IDAgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA0KTsKfQoKLm1qci1tZnYubWpyLW1mdi0tcG9wcGVkIC5tanItd3Mtbm9kZS10aXRsZSB7CiAgICBjb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLWNvbnRlbnQtZmcsICNlZWY0ZmYpIDk0JSwgI2ZmZmZmZiA2JSk7Cn0KCi5tanItbWZ2Lm1qci1tZnYtLXBvcHBlZCAubWpyLXdzLXdpZGdldC1sYWJlbCwKLm1qci1tZnYubWpyLW1mdi0tcG9wcGVkIC5tanItd3Mtc2lkZWJhci1lbXB0eSwKLm1qci1tZnYubWpyLW1mdi0tcG9wcGVkIC5tanItd3Mtbm9kZS1lbXB0eSB7CiAgICBjb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1tdXRlZCkgODQlLCAjZmZmZmZmIDE2JSk7Cn0KCi5tanItbWZ2Lm1qci1tZnYtLXBvcHBlZCAubWpyLXdzLWlucHV0IHsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0wKSA3NCUsICMwNTA3MGEgMjYlKTsKICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1ib3JkZXIpIDc0JSwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE4KSk7CiAgICBib3JkZXItcmFkaXVzOiA2cHg7CiAgICBib3gtc2hhZG93OiBpbnNldCAwIDFweCAwIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wNCk7Cn0KCi5tanItbWZ2Lm1qci1tZnYtLXBvcHBlZCAubWpyLXdzLWlucHV0OmZvY3VzIHsKICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQpIDU4JSwgI2ZmZmZmZiAxMCUpOwogICAgYm94LXNoYWRvdzoKICAgICAgICBpbnNldCAwIDFweCAwIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wNCksCiAgICAgICAgMCAwIDAgMnB4IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYWNjZW50KSAxOCUsIHRyYW5zcGFyZW50KTsKfQoKLm1qci1tZnYgLm1qci1pY29uLWJ0bi5tanItcG9waW4tYWN0aXZlIHsKICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQpIDU4JSwgI2ZmZmZmZiA0MiUpOwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTIpIDQ1JSwgdmFyKC0tbWpyLWFjY2VudCkgNTUlKTsKICAgIGNvbG9yOiAjZWVmN2ZmOwp9CgovKiAtLSBDb250ZW50IHdyYXBwZXIgKGhvcml6b250YWwgZmxleDogY29udGVudCArIHNpZGViYXIpIC0tLS0tLS0tLS0tLS0tICovCi5tanItbWZ2LWNvbnRlbnQtd3JhcHBlciB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZmxleDogMTsKICAgIG1pbi1oZWlnaHQ6IDA7CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgY29udGFpbmVyLXR5cGU6IGlubGluZS1zaXplOwp9CgovKiAtLSBTaWRlYmFyIHBvc2l0aW9uIHZhcmlhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLm1qci1tZnYtY29udGVudC13cmFwcGVyW2RhdGEtc2lkZWJhci1wb3M9ImxlZnQiXSB7CiAgICBmbGV4LWRpcmVjdGlvbjogcm93Owp9Ci5tanItbWZ2LWNvbnRlbnQtd3JhcHBlcltkYXRhLXNpZGViYXItcG9zPSJsZWZ0Il0gLm1qci13cy1zaWRlYmFyIHsKICAgIGJvcmRlci1sZWZ0OiBub25lOwogICAgYm9yZGVyLXJpZ2h0OiAxcHggc29saWQgdmFyKC0tbWpyLWJvcmRlciwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEyKSk7Cn0KLm1qci1tZnYtY29udGVudC13cmFwcGVyW2RhdGEtc2lkZWJhci1wb3M9ImJvdHRvbSJdIHsKICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47Cn0KLm1qci1tZnYtY29udGVudC13cmFwcGVyW2RhdGEtc2lkZWJhci1wb3M9ImJvdHRvbSJdIC5tanItd3Mtc2lkZWJhciB7CiAgICBib3JkZXItbGVmdDogbm9uZTsKICAgIGJvcmRlci10b3A6IDFweCBzb2xpZCB2YXIoLS1tanItYm9yZGVyLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTIpKTsKICAgIHdpZHRoOiAxMDAlOwogICAgaGVpZ2h0OiAwOwogICAgdHJhbnNpdGlvbjoKICAgICAgICBoZWlnaHQgMC4ycyBlYXNlLAogICAgICAgIHdpZHRoIDBzOwp9Ci5tanItbWZ2LWNvbnRlbnQtd3JhcHBlcltkYXRhLXNpZGViYXItcG9zPSJib3R0b20iXSAubWpyLXdzLXNpZGViYXIub3BlbiB7CiAgICB3aWR0aDogMTAwJTsKICAgIGhlaWdodDogMjIwcHg7CiAgICBvdmVyZmxvdy15OiBhdXRvOwogICAgbWluLWhlaWdodDogMTIwcHg7CiAgICBtYXgtaGVpZ2h0OiA2NSU7Cn0KCi8qIC0tIENvbnRlbnQgYXJlYSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLm1qci1tZnYtY29udGVudCB7CiAgICBmbGV4OiAxOwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgIGJhY2tncm91bmQ6ICMwZDBkMGQ7CiAgICBtaW4taGVpZ2h0OiAwOwp9CgoubWpyLW1mdi1nZW4tc2lkZWJhciB7CiAgICBkaXNwbGF5OiBub25lOwogICAgZmxleDogMCAwIDMyMHB4OwogICAgd2lkdGg6IDMyMHB4OwogICAgbWluLXdpZHRoOiAyMTBweDsKICAgIG1heC13aWR0aDogbWluKDQyJSwgNDIwcHgpOwogICAgb3ZlcmZsb3cteTogYXV0bzsKICAgIG92ZXJmbG93LXg6IGhpZGRlbjsKICAgIHBhZGRpbmc6IDEwcHg7CiAgICBib3JkZXItbGVmdDogMXB4IHNvbGlkIHZhcigtLW1qci1ib3JkZXIsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xMikpOwogICAgYmFja2dyb3VuZDogcmdiYSgxOCwgMTgsIDIwLCAwLjk2KTsKICAgIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuODgpOwp9CgoubWpyLW1mdi1nZW4tc2lkZWJhci5vcGVuIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgZ2FwOiAxMHB4Owp9CgoubWpyLW1mdi1jb250ZW50LXdyYXBwZXJbZGF0YS1zaWRlYmFyLXBvcz0ibGVmdCJdIC5tanItbWZ2LWdlbi1zaWRlYmFyIHsKICAgIGJvcmRlci1sZWZ0OiAxcHggc29saWQgdmFyKC0tbWpyLWJvcmRlciwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEyKSk7CiAgICBib3JkZXItcmlnaHQ6IG5vbmU7Cn0KCi5tanItbWZ2LWNvbnRlbnQtd3JhcHBlcltkYXRhLXNpZGViYXItcG9zPSJib3R0b20iXSAubWpyLW1mdi1nZW4tc2lkZWJhciB7CiAgICBmbGV4OiAwIDAgY2xhbXAoMTkwcHgsIDMyJSwgMjgwcHgpOwogICAgd2lkdGg6IDEwMCU7CiAgICBtYXgtd2lkdGg6IG5vbmU7CiAgICBtaW4td2lkdGg6IDA7CiAgICBtYXgtaGVpZ2h0OiA0NiU7CiAgICBib3JkZXItbGVmdDogbm9uZTsKICAgIGJvcmRlci10b3A6IDFweCBzb2xpZCB2YXIoLS1tanItYm9yZGVyLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTIpKTsKfQoKLm1qci1tZnYtZ2VuLXNpZGViYXItdGl0bGUgewogICAgZm9udC1zaXplOiAxMnB4OwogICAgZm9udC13ZWlnaHQ6IDcwMDsKICAgIGxldHRlci1zcGFjaW5nOiAwOwogICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC45NCk7Cn0KCi5tanItbWZ2LWdlbi1zaWRlYmFyLXNlY3Rpb24gewogICAgZGlzcGxheTogZmxleDsKICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICBnYXA6IDZweDsKICAgIHBhZGRpbmctdG9wOiA4cHg7CiAgICBib3JkZXItdG9wOiAxcHggc29saWQgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEpOwp9CgoubWpyLW1mdi1nZW4tc2lkZWJhci1zZWN0aW9uOmZpcnN0LW9mLXR5cGUgewogICAgcGFkZGluZy10b3A6IDA7CiAgICBib3JkZXItdG9wOiBub25lOwp9CgoubWpyLW1mdi1nZW4tc2lkZWJhci1oZWFkaW5nIHsKICAgIGZvbnQtc2l6ZTogMTFweDsKICAgIGZvbnQtd2VpZ2h0OiA3MDA7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjcyKTsKfQoKLm1qci1tZnYtZ2VuLXNpZGViYXItYm9keSB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgIGdhcDogMTBweDsKICAgIGZvbnQtc2l6ZTogMTJweDsKICAgIGxpbmUtaGVpZ2h0OiAxLjQ1OwogICAgd29yZC1icmVhazogYnJlYWstd29yZDsKfQoKLm1qci1tZnYtY29udGVudC13cmFwcGVyW2RhdGEtc2lkZWJhci1wb3M9ImJvdHRvbSJdIC5tanItbWZ2LWdlbi1zaWRlYmFyLm9wZW4gewogICAgZ2FwOiA2cHg7Cn0KCi5tanItbWZ2LWNvbnRlbnQtd3JhcHBlcltkYXRhLXNpZGViYXItcG9zPSJib3R0b20iXSAubWpyLW1mdi1nZW4tc2lkZWJhci10aXRsZSB7CiAgICBmbGV4OiAwIDAgYXV0bzsKfQoKLm1qci1tZnYtY29udGVudC13cmFwcGVyW2RhdGEtc2lkZWJhci1wb3M9ImJvdHRvbSJdIC5tanItbWZ2LWdlbi1zaWRlYmFyLXNlY3Rpb24gewogICAgZmxleDogMCAwIGF1dG87CiAgICBtaW4taGVpZ2h0OiBhdXRvOwogICAgcGFkZGluZy10b3A6IDRweDsKfQoKLm1qci1tZnYtY29udGVudC13cmFwcGVyW2RhdGEtc2lkZWJhci1wb3M9ImJvdHRvbSJdIC5tanItbWZ2LWdlbi1zaWRlYmFyLWhlYWRpbmcgewogICAgZGlzcGxheTogbm9uZTsKfQoKLm1qci1tZnYtY29udGVudC13cmFwcGVyW2RhdGEtc2lkZWJhci1wb3M9ImJvdHRvbSJdIC5tanItbWZ2LWdlbi1zaWRlYmFyLWJvZHkgewogICAgZGlzcGxheTogYmxvY2s7CiAgICBjb2x1bW5zOiAzIDE3MHB4OwogICAgY29sdW1uLWdhcDogMTBweDsKICAgIGNvbHVtbi1maWxsOiBiYWxhbmNlOwogICAgbWluLWhlaWdodDogYXV0bzsKICAgIG92ZXJmbG93LXg6IGhpZGRlbjsKICAgIG92ZXJmbG93LXk6IHZpc2libGU7CiAgICBwYWRkaW5nLXJpZ2h0OiAycHg7CiAgICBzY3JvbGxiYXItd2lkdGg6IHRoaW47Cn0KCi5tanItbWZ2LWNvbnRlbnQtd3JhcHBlcltkYXRhLXNpZGViYXItcG9zPSJib3R0b20iXSAubWpyLW1mdi1nZW4tc2lkZWJhci1ib2R5ID4gKiB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYnJlYWstaW5zaWRlOiBhdm9pZDsKICAgIHBhZ2UtYnJlYWstaW5zaWRlOiBhdm9pZDsKICAgIG1pbi13aWR0aDogMDsKICAgIG1pbi1oZWlnaHQ6IDA7CiAgICBtYXJnaW4tYmxvY2s6IDAgMTBweDsKfQoKLm1qci1tZnYtZ2VuLXRpbWUtYmFkZ2UgewogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47CiAgICBnYXA6IDEycHg7CiAgICBwYWRkaW5nOiA4cHggMTBweDsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjI0LCAyNTUsIDEyMiwgMC40Mik7CiAgICBib3JkZXItcmFkaXVzOiA5OTlweDsKICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgxMzVkZWcsIHJnYmEoMjI0LCAyNTUsIDEyMiwgMC4xNiksIHJnYmEoNzYsIDE3NSwgODAsIDAuMSkpOwogICAgYm94LXNoYWRvdzogMCAwIDAgMXB4IHJnYmEoMjI0LCAyNTUsIDEyMiwgMC4xMikgaW5zZXQ7CiAgICBjdXJzb3I6IGNvcHk7CiAgICB0cmFuc2l0aW9uOgogICAgICAgIGJhY2tncm91bmQgMC4xNnMgZWFzZSwKICAgICAgICBib3JkZXItY29sb3IgMC4xNnMgZWFzZSwKICAgICAgICBib3gtc2hhZG93IDAuMTZzIGVhc2U7Cn0KCi5tanItbWZ2LWNvbnRlbnQtd3JhcHBlcltkYXRhLXNpZGViYXItcG9zPSJib3R0b20iXSAubWpyLW1mdi1nZW4tdGltZS1iYWRnZSB7CiAgICBhbGlnbi1pdGVtczogc3RyZXRjaDsKICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47CiAgICBib3JkZXItcmFkaXVzOiA2cHg7Cn0KCi5tanItbWZ2LWdlbi10aW1lLWxhYmVsIHsKICAgIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNzIpOwogICAgZm9udC1zaXplOiAxMHB4OwogICAgZm9udC13ZWlnaHQ6IDcwMDsKICAgIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7CiAgICBsZXR0ZXItc3BhY2luZzogMC41cHg7Cn0KCi5tanItbWZ2LWdlbi10aW1lLXZhbHVlIHsKICAgIGNvbG9yOiAjZTBmZjdhOwogICAgZm9udC1zaXplOiAxM3B4OwogICAgZm9udC13ZWlnaHQ6IDgwMDsKICAgIGZvbnQtZmFtaWx5OiBDb25zb2xhcywgTW9uYWNvLCBtb25vc3BhY2U7Cn0KCi5tanItbWZ2LWdlbi1jYXJkIHsKICAgIC0tbWpyLW1mdi1nZW4tYWNjZW50OiAjMjE5NmYzOwogICAgZGlzcGxheTogZmxleDsKICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICBnYXA6IDhweDsKICAgIHBhZGRpbmc6IDEycHg7CiAgICBib3JkZXI6IDFweCBzb2xpZCBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLW1mdi1nZW4tYWNjZW50KSA0NSUsIHRyYW5zcGFyZW50KTsKICAgIGJvcmRlci1yYWRpdXM6IDZweDsKICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgKICAgICAgICAxMzVkZWcsCiAgICAgICAgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1tZnYtZ2VuLWFjY2VudCkgMTYlLCB0cmFuc3BhcmVudCkgMCUsCiAgICAgICAgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1tZnYtZ2VuLWFjY2VudCkgOCUsIHRyYW5zcGFyZW50KSAxMDAlCiAgICApOwogICAgYm94LXNoYWRvdzogMCAwIDAgMXB4IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItbWZ2LWdlbi1hY2NlbnQpIDE0JSwgdHJhbnNwYXJlbnQpIGluc2V0OwogICAgY3Vyc29yOiBjb3B5OwogICAgdHJhbnNpdGlvbjoKICAgICAgICBiYWNrZ3JvdW5kIDAuMTZzIGVhc2UsCiAgICAgICAgYm9yZGVyLWNvbG9yIDAuMTZzIGVhc2UsCiAgICAgICAgYm94LXNoYWRvdyAwLjE2cyBlYXNlOwp9CgoubWpyLW1mdi1jb250ZW50LXdyYXBwZXJbZGF0YS1zaWRlYmFyLXBvcz0iYm90dG9tIl0gLm1qci1tZnYtZ2VuLWNhcmQgewogICAgbWluLWhlaWdodDogMDsKICAgIHBhZGRpbmc6IDEwcHg7Cn0KCi5tanItbWZ2LWNvbnRlbnQtd3JhcHBlcltkYXRhLXNpZGViYXItcG9zPSJib3R0b20iXSAubWpyLW1mdi1nZW4tY2FyZC0tcG9zaXRpdmUtcHJvbXB0LAoubWpyLW1mdi1jb250ZW50LXdyYXBwZXJbZGF0YS1zaWRlYmFyLXBvcz0iYm90dG9tIl0gLm1qci1tZnYtZ2VuLWNhcmQtLW5lZ2F0aXZlLXByb21wdCwKLm1qci1tZnYtY29udGVudC13cmFwcGVyW2RhdGEtc2lkZWJhci1wb3M9ImJvdHRvbSJdIC5tanItbWZ2LWdlbi1jYXJkLS1wcm9tcHQgewogICAgbWluLWhlaWdodDogMTEwcHg7Cn0KCi5tanItbWZ2LWNvbnRlbnQtd3JhcHBlcltkYXRhLXNpZGViYXItcG9zPSJib3R0b20iXSAubWpyLW1mdi1nZW4tY2FyZC0td29ya2Zsb3cgewogICAgbWluLWhlaWdodDogNThweDsKfQoKLm1qci1tZnYtY29udGVudC13cmFwcGVyW2RhdGEtc2lkZWJhci1wb3M9ImJvdHRvbSJdIC5tanItbWZ2LWdlbi1jYXJkLS1tb2RlbC1hbmQtbG9yYSwKLm1qci1tZnYtY29udGVudC13cmFwcGVyW2RhdGEtc2lkZWJhci1wb3M9ImJvdHRvbSJdIC5tanItbWZ2LWdlbi1jYXJkLS1tb2RlbHMsCi5tanItbWZ2LWNvbnRlbnQtd3JhcHBlcltkYXRhLXNpZGViYXItcG9zPSJib3R0b20iXSAubWpyLW1mdi1nZW4tY2FyZC0tc2FtcGxpbmcsCi5tanItbWZ2LWNvbnRlbnQtd3JhcHBlcltkYXRhLXNpZGViYXItcG9zPSJib3R0b20iXSAubWpyLW1mdi1nZW4tY2FyZC0tZ2VuZXJhdGlvbi1waXBlbGluZSwKLm1qci1tZnYtY29udGVudC13cmFwcGVyW2RhdGEtc2lkZWJhci1wb3M9ImJvdHRvbSJdIC5tanItbWZ2LWdlbi1jYXJkLS10ZXh0LXRvLWltYWdlLAoubWpyLW1mdi1jb250ZW50LXdyYXBwZXJbZGF0YS1zaWRlYmFyLXBvcz0iYm90dG9tIl0gLm1qci1tZnYtZ2VuLWNhcmQtLWltYWdlLXRvLWltYWdlLAoubWpyLW1mdi1jb250ZW50LXdyYXBwZXJbZGF0YS1zaWRlYmFyLXBvcz0iYm90dG9tIl0gLm1qci1tZnYtZ2VuLWNhcmQtLWlucGFpbnQsCi5tanItbWZ2LWNvbnRlbnQtd3JhcHBlcltkYXRhLXNpZGViYXItcG9zPSJib3R0b20iXSAubWpyLW1mdi1nZW4tY2FyZC0tdXBzY2FsZSwKLm1qci1tZnYtY29udGVudC13cmFwcGVyW2RhdGEtc2lkZWJhci1wb3M9ImJvdHRvbSJdIC5tanItbWZ2LWdlbi1jYXJkLS1yZWZpbmUgewogICAgbWluLWhlaWdodDogODZweDsKfQoKLm1qci1tZnYtZ2VuLWNhcmQtLXNlZWQgewogICAgZmxleC1kaXJlY3Rpb246IHJvdzsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47CiAgICBib3JkZXItd2lkdGg6IDJweDsKfQoKLm1qci1tZnYtZ2VuLWNhcmQtLWNvbXBhY3QgewogICAgZmxleC1kaXJlY3Rpb246IHJvdzsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47CiAgICBnYXA6IDEycHg7Cn0KCi5tanItbWZ2LWNvbnRlbnQtd3JhcHBlcltkYXRhLXNpZGViYXItcG9zPSJib3R0b20iXSAubWpyLW1mdi1nZW4tY2FyZC0tY29tcGFjdCB7CiAgICBhbGlnbi1pdGVtczogc3RyZXRjaDsKICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47Cn0KCi5tanItbWZ2LWdlbi1jYXJkLS1jb21wYWN0IC5tanItbWZ2LWdlbi1jYXJkLXRpdGxlLAoubWpyLW1mdi1nZW4tY2FyZC0tY29tcGFjdCAubWpyLW1mdi1nZW4tY2FyZC12YWx1ZSB7CiAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwp9CgoubWpyLW1mdi1nZW4tY2FyZDpob3ZlciwKLm1qci1tZnYtZ2VuLXRpbWUtYmFkZ2U6aG92ZXIgewogICAgYm9yZGVyLWNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLW1mdi1nZW4tYWNjZW50LCAjZTBmZjdhKSA3MCUsIHRyYW5zcGFyZW50KTsKICAgIGJveC1zaGFkb3c6IDAgMCAwIDFweCBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLW1mdi1nZW4tYWNjZW50LCAjZTBmZjdhKSAyNCUsIHRyYW5zcGFyZW50KQogICAgICAgIGluc2V0Owp9CgoubWpyLW1mdi1nZW4tY29weS1mbGFzaCB7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDc2LCAxNzUsIDgwLCAwLjI4KSAhaW1wb3J0YW50Owp9CgoubWpyLW1mdi1nZW4tY2FyZC10aXRsZSB7CiAgICBjb2xvcjogdmFyKC0tbWpyLW1mdi1nZW4tYWNjZW50KTsKICAgIGZvbnQtc2l6ZTogMTFweDsKICAgIGZvbnQtd2VpZ2h0OiA3MDA7CiAgICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOwogICAgbGV0dGVyLXNwYWNpbmc6IDAuNXB4Owp9CgoubWpyLW1mdi1nZW4tY2FyZC12YWx1ZSB7CiAgICBjb2xvcjogdmFyKC0tZmctY29sb3IsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC45MikpOwogICAgZm9udC1zaXplOiAxMnB4OwogICAgbWluLXdpZHRoOiAwOwogICAgd29yZC1icmVhazogYnJlYWstd29yZDsKfQoKLm1qci1tZnYtY29udGVudC13cmFwcGVyW2RhdGEtc2lkZWJhci1wb3M9ImJvdHRvbSJdIC5tanItbWZ2LWdlbi1jYXJkLXZhbHVlIHsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICBkaXNwbGF5OiAtd2Via2l0LWJveDsKICAgIC13ZWJraXQtbGluZS1jbGFtcDogNTsKICAgIC13ZWJraXQtYm94LW9yaWVudDogdmVydGljYWw7Cn0KCi5tanItbWZ2LWdlbi1jYXJkLXZhbHVlLmlzLWNvbXBhY3QgewogICAgdGV4dC1hbGlnbjogcmlnaHQ7CiAgICBmb250LXdlaWdodDogNzAwOwp9CgoubWpyLW1mdi1jb250ZW50LXdyYXBwZXJbZGF0YS1zaWRlYmFyLXBvcz0iYm90dG9tIl0gLm1qci1tZnYtZ2VuLWNhcmQtdmFsdWUuaXMtY29tcGFjdCB7CiAgICB0ZXh0LWFsaWduOiBsZWZ0Owp9CgoubWpyLW1mdi1nZW4tY2FyZC12YWx1ZS5pcy1tdWx0aWxpbmUgewogICAgd2hpdGUtc3BhY2U6IHByZS13cmFwOwp9CgoubWpyLW1mdi1nZW4tY2FyZC0tc2VlZCAubWpyLW1mdi1nZW4tY2FyZC12YWx1ZSB7CiAgICBmb250LXNpemU6IDE4cHg7CiAgICBmb250LXdlaWdodDogNzAwOwogICAgZm9udC1mYW1pbHk6IENvbnNvbGFzLCBNb25hY28sIG1vbm9zcGFjZTsKICAgIGxldHRlci1zcGFjaW5nOiAxcHg7CiAgICBjb2xvcjogI2ZmZjsKfQoKLm1qci1tZnYtZ2VuLWNhcmQtdmFsdWUuaXMtZmllbGRzIHsKICAgIGRpc3BsYXk6IGdyaWQ7CiAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IDFmcjsKICAgIGdhcDogOHB4Owp9CgoubWpyLW1mdi1jb250ZW50LXdyYXBwZXJbZGF0YS1zaWRlYmFyLXBvcz0iYm90dG9tIl0gLm1qci1tZnYtZ2VuLWNhcmQtdmFsdWUuaXMtZmllbGRzIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgZ2FwOiA3cHg7CiAgICAtd2Via2l0LWxpbmUtY2xhbXA6IHVuc2V0Owp9CgoubWpyLW1mdi1nZW4tY2FyZC12YWx1ZS5pcy1icmFuY2gtZ3JvdXBzIHsKICAgIGdhcDogMTBweDsKfQoKLm1qci1tZnYtZ2VuLWJyYW5jaC1ncm91cCB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgIGdhcDogN3B4OwogICAgbWluLXdpZHRoOiAwOwogICAgcGFkZGluZzogOHB4OwogICAgYm9yZGVyLXJhZGl1czogNnB4OwogICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEpOwogICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA0NSk7Cn0KCi5tanItbWZ2LWdlbi1icmFuY2gtdGl0bGUgewogICAgY29sb3I6IHZhcigtLW1qci1tZnYtZ2VuLWFjY2VudCk7CiAgICBmb250LXNpemU6IDEwcHg7CiAgICBmb250LXdlaWdodDogODAwOwogICAgbGV0dGVyLXNwYWNpbmc6IDAuNnB4OwogICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKfQoKLm1qci1tZnYtZ2VuLWZpZWxkIHsKICAgIGRpc3BsYXk6IGdyaWQ7CiAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IG1pbm1heCg3OHB4LCBhdXRvKSAxZnI7CiAgICBnYXA6IDEwcHg7CiAgICBhbGlnbi1pdGVtczogc3RhcnQ7CiAgICBtaW4td2lkdGg6IDA7Cn0KCi5tanItbWZ2LWNvbnRlbnQtd3JhcHBlcltkYXRhLXNpZGViYXItcG9zPSJib3R0b20iXSAubWpyLW1mdi1nZW4tZmllbGQgewogICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiBtaW5tYXgoNTRweCwgYXV0bykgbWlubWF4KDAsIDFmcik7Cn0KCi5tanItbWZ2LWNvbnRlbnQtd3JhcHBlcltkYXRhLXNpZGViYXItcG9zPSJib3R0b20iXSAubWpyLW1mdi1nZW4tZmllbGQtdmFsdWUgewogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKfQoKLm1qci1tZnYtZ2VuLWZpZWxkLWxhYmVsIHsKICAgIGNvbG9yOiB2YXIoLS1tanItbXV0ZWQsIHJnYmEoMTgwLCAxODAsIDE4MCwgMC43MikpOwogICAgZm9udC1zaXplOiAxMXB4OwogICAgZm9udC13ZWlnaHQ6IDYwMDsKfQoKLm1qci1tZnYtZ2VuLWZpZWxkLXZhbHVlIHsKICAgIGNvbG9yOiB2YXIoLS1mZy1jb2xvciwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjk1KSk7CiAgICBtaW4td2lkdGg6IDA7CiAgICB3aGl0ZS1zcGFjZTogcHJlLXdyYXA7CiAgICB3b3JkLWJyZWFrOiBicmVhay13b3JkOwp9CgoubWpyLW1mdi1nZW4tc2lkZWJhci1ib2R5IHN0cm9uZyB7CiAgICBmb250LXdlaWdodDogNjAwOwogICAgbWFyZ2luLXJpZ2h0OiA0cHg7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjk1KTsKfQoKLm1qci1tZnYtZ2VuLXNpZGViYXItYm9keSBbZGF0YS1maWVsZD0icHJvbXB0Il0gc3Ryb25nIHsKICAgIGNvbG9yOiAjN2VjOGZmOwp9Ci5tanItbWZ2LWdlbi1zaWRlYmFyLWJvZHkgW2RhdGEtZmllbGQ9InNlZWQiXSBzdHJvbmcgewogICAgY29sb3I6ICNmZmQ0N2E7Cn0KLm1qci1tZnYtZ2VuLXNpZGViYXItYm9keSBbZGF0YS1maWVsZD0ibW9kZWwiXSBzdHJvbmcgewogICAgY29sb3I6ICM3ZGRhOGE7Cn0KLm1qci1tZnYtZ2VuLXNpZGViYXItYm9keSBbZGF0YS1maWVsZD0ibG9yYSJdIHN0cm9uZyB7CiAgICBjb2xvcjogI2Q0OGNmZjsKfQoubWpyLW1mdi1nZW4tc2lkZWJhci1ib2R5IFtkYXRhLWZpZWxkPSJzYW1wbGVyIl0gc3Ryb25nIHsKICAgIGNvbG9yOiAjZmY5ZjdhOwp9Ci5tanItbWZ2LWdlbi1zaWRlYmFyLWJvZHkgW2RhdGEtZmllbGQ9InNjaGVkdWxlciJdIHN0cm9uZyB7CiAgICBjb2xvcjogI2ZmN2E5ZjsKfQoubWpyLW1mdi1nZW4tc2lkZWJhci1ib2R5IFtkYXRhLWZpZWxkPSJjZmciXSBzdHJvbmcgewogICAgY29sb3I6ICM3YTlmZmY7Cn0KLm1qci1tZnYtZ2VuLXNpZGViYXItYm9keSBbZGF0YS1maWVsZD0ic3RlcCJdIHN0cm9uZyB7CiAgICBjb2xvcjogIzdhZmZkNDsKfQoubWpyLW1mdi1nZW4tc2lkZWJhci1ib2R5IFtkYXRhLWZpZWxkPSJnZW5UaW1lIl0gc3Ryb25nIHsKICAgIGNvbG9yOiAjZTBmZjdhOwp9CgoubWpyLW1mdi1nZW4tc2lkZWJhci1ib2R5IGRpdiB7CiAgICBtYXJnaW4tYm90dG9tOiA1cHg7Cn0KCi5tanItbWZ2LWNvbnRlbnQtd3JhcHBlcltkYXRhLXNpZGViYXItcG9zPSJib3R0b20iXSAubWpyLW1mdi1nZW4tc2lkZWJhci1ib2R5IGRpdiB7CiAgICBtYXJnaW4tYm90dG9tOiAwOwp9CgoubWpyLW1mdi1jb250ZW50LXdyYXBwZXJbZGF0YS1zaWRlYmFyLXBvcz0iYm90dG9tIl0gLm1qci1tZnYtZ2VuLXNpZGViYXItYm9keSA+IGRpdiwKLm1qci1tZnYtY29udGVudC13cmFwcGVyW2RhdGEtc2lkZWJhci1wb3M9ImJvdHRvbSJdIC5tanItbWZ2LWdlbi1zaWRlYmFyLWJvZHkgPiBzZWN0aW9uIHsKICAgIG1hcmdpbi1ibG9jazogMCAxMHB4Owp9CgoubWpyLW1mdi1nZW4tc2lkZWJhci1ib2R5IGRpdjpsYXN0LWNoaWxkIHsKICAgIG1hcmdpbi1ib3R0b206IDA7Cn0KCkBjb250YWluZXIgKG1heC13aWR0aDogNzYwcHgpIHsKICAgIC5tanItbWZ2LWNvbnRlbnQtd3JhcHBlcltkYXRhLXNpZGViYXItcG9zPSJib3R0b20iXSAubWpyLW1mdi1nZW4tc2lkZWJhci1ib2R5IHsKICAgICAgICBjb2x1bW5zOiBhdXRvOwogICAgICAgIGNvbHVtbi1jb3VudDogMTsKICAgICAgICBjb2x1bW4td2lkdGg6IGF1dG87CiAgICB9CgogICAgLm1qci1tZnYtY29udGVudC13cmFwcGVyW2RhdGEtc2lkZWJhci1wb3M9ImJvdHRvbSJdIC5tanItbWZ2LWdlbi1zaWRlYmFyLWJvZHkgPiAqIHsKICAgICAgICB3aWR0aDogMTAwJTsKICAgIH0KfQoKLm1qci1tZnYtb3ZlcmxheS1jYW52YXMgewogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgaW5zZXQ6IDA7CiAgICB3aWR0aDogMTAwJTsKICAgIGhlaWdodDogMTAwJTsKICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgei1pbmRleDogMTI7Cn0KCi5tanItbWZ2LXRvb2xiYXItc2VsZWN0IHsKICAgIGhlaWdodDogMjRweDsKICAgIHBhZGRpbmc6IDAgNnB4OwogICAgYm9yZGVyLXJhZGl1czogNnB4OwogICAgYm9yZGVyOiAwLjhweCBzb2xpZCByZ2JhKDE5NiwgMjAyLCAyMTAsIDAuMjQpOwogICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KDE4MGRlZywgcmdiYSgyMTAsIDIxNCwgMjIwLCAwLjA2KSwgcmdiYSgyMTAsIDIxNCwgMjIwLCAwLjAyKSk7CiAgICBjb2xvcjogcmdiYSgyMzAsIDIzMywgMjM4LCAwLjkyKTsKICAgIGZvbnQtc2l6ZTogMTFweDsKICAgIG91dGxpbmU6IG5vbmU7Cn0KCi5tanItbWZ2LXRvb2xiYXItcmFuZ2UgewogICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiA2cHg7Cn0KCi5tanItbWZ2LXRvb2xiYXItcmFuZ2UgaW5wdXRbdHlwZT0icmFuZ2UiXSB7CiAgICB3aWR0aDogNzJweDsKICAgIGFjY2VudC1jb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjg1KTsKfQoKLm1qci1tZnYtdG9vbGJhci1yYW5nZS1vdXQgewogICAgbWluLXdpZHRoOiAzMHB4OwogICAgdGV4dC1hbGlnbjogcmlnaHQ7CiAgICBmb250LXNpemU6IDExcHg7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjkpOwp9CgovKiBFViBzbGlkZXIgYWN0aXZlIHN0YXRlICh2YWx1ZSAhPSAwKSAqLwoubWpyLW1mdi10b29sYmFyLXJhbmdlLmlzLWFjdGl2ZSBpbnB1dFt0eXBlPSJyYW5nZSJdIHsKICAgIGFjY2VudC1jb2xvcjogI2Y1Yzg0MjsKfQoubWpyLW1mdi10b29sYmFyLXJhbmdlLmlzLWFjdGl2ZSAubWpyLW1mdi10b29sYmFyLXJhbmdlLW91dCB7CiAgICBjb2xvcjogI2Y1Yzg0MjsKICAgIGZvbnQtd2VpZ2h0OiA2MDA7Cn0KCi5tanItbWZ2LW1lZGlhLXByb2dyZXNzIHsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIHRvcDogMTBweDsKICAgIGxlZnQ6IDEwcHg7CiAgICB6LWluZGV4OiA2OwogICAgbWF4LXdpZHRoOiBjYWxjKDEwMCUgLSAyMHB4KTsKICAgIHBhZGRpbmc6IDVweCA5cHg7CiAgICBib3JkZXItcmFkaXVzOiA2cHg7CiAgICBib3JkZXI6IDFweCBzb2xpZAogICAgICAgIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYm9yZGVyLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTgpKSA4OCUsIHRyYW5zcGFyZW50KTsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCByZ2JhKDUsIDgsIDE0LCAwLjg2KSA4NiUsIHZhcigtLW1qci1zdXJmYWNlLTAsICMxMTEpIDE0JSk7CiAgICBjb2xvcjogdmFyKC0tY29udGVudC1mZywgI2Y1ZjdmYSk7CiAgICBib3gtc2hhZG93OiAwIDJweCAxMHB4IHJnYmEoMCwgMCwgMCwgMC4yOCk7CiAgICBiYWNrZHJvcC1maWx0ZXI6IGJsdXIoNnB4KTsKICAgIC13ZWJraXQtYmFja2Ryb3AtZmlsdGVyOiBibHVyKDZweCk7CiAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgIG9wYWNpdHk6IDA7CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTRweCk7CiAgICB0cmFuc2l0aW9uOgogICAgICAgIG9wYWNpdHkgMC4xNnMgZWFzZSwKICAgICAgICB0cmFuc2Zvcm0gMC4xNnMgZWFzZTsKfQoKLm1qci1tZnYtbWVkaWEtcHJvZ3Jlc3MuaXMtdmlzaWJsZSB7CiAgICBvcGFjaXR5OiAxOwogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDApOwp9CgoubWpyLW1mdi1tZWRpYS1wcm9ncmVzcy5pcy1lcnJvciB7CiAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3RhdHVzLWVycm9yLCAjZmY1YzdhKSA3MiUsIHRyYW5zcGFyZW50KTsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCByZ2JhKDYwLCAxMCwgMTgsIDAuOSkgODIlLCB2YXIoLS1tanItc3VyZmFjZS0wLCAjMTExKSAxOCUpOwp9CgoubWpyLW1mdi1tZWRpYS1wcm9ncmVzcy10ZXh0IHsKICAgIGRpc3BsYXk6IGJsb2NrOwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgIGZvbnQtc2l6ZTogMTFweDsKICAgIGZvbnQtd2VpZ2h0OiA2MDA7CiAgICBsaW5lLWhlaWdodDogMS4yOwp9CgovKiAtLSBXb3JrZmxvdyBTaWRlYmFyIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi5tanItd3Mtc2lkZWJhciB7CiAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgIHdpZHRoOiAwOwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIGJhY2tncm91bmQ6IHZhcigtLW1qci1zdXJmYWNlLTEsICMyYTJhMmEpOwogICAgYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCB2YXIoLS1tanItYm9yZGVyLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTIpKTsKICAgIHRyYW5zaXRpb246IHdpZHRoIDAuMnMgZWFzZTsKICAgIGZsZXgtc2hyaW5rOiAwOwp9CgoubWpyLXdzLXNpZGViYXIub3BlbiB7CiAgICB3aWR0aDogMjYwcHg7CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgbWluLXdpZHRoOiAxODBweDsKICAgIG1heC13aWR0aDogNjUlOwogICAgdHJhbnNpdGlvbjogbm9uZTsKfQoKLm1qci13cy1zaWRlYmFyLWhlYWRlciB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsKICAgIHBhZGRpbmc6IDZweCAxMHB4OwogICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHZhcigtLW1qci1ib3JkZXIsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xMikpOwogICAgZmxleC1zaHJpbms6IDA7CiAgICBtaW4taGVpZ2h0OiAzNHB4Owp9Ci5tanItd3Mtc2lkZWJhci10aXRsZSB7CiAgICBmb250LXNpemU6IDExcHg7CiAgICBmb250LXdlaWdodDogNjAwOwogICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKICAgIGxldHRlci1zcGFjaW5nOiAwLjVweDsKICAgIG9wYWNpdHk6IDAuNjU7Cn0KLm1qci13cy1zaWRlYmFyLWJvZHkgewogICAgZmxleDogMTsKICAgIG1pbi1oZWlnaHQ6IDA7CiAgICBvdmVyZmxvdy15OiBhdXRvOwogICAgcGFkZGluZzogMDsKfQoubWpyLXdzLXNpZGViYXItZW1wdHkgewogICAgcGFkZGluZzogMjRweCAxNnB4OwogICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4yNSk7CiAgICBmb250LXNpemU6IDExcHg7CiAgICBsaW5lLWhlaWdodDogMS41Owp9CgovKiAtLSBUYWIgYmFyIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoubWpyLXdzLXRhYi1iYXIgewogICAgZGlzcGxheTogZmxleDsKICAgIGZsZXgtc2hyaW5rOiAwOwogICAgZ2FwOiAycHg7CiAgICBwYWRkaW5nOiA0cHggOHB4OwogICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHZhcigtLW1qci1ib3JkZXIsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xMikpOwogICAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjE4KTsKfQoKLm1qci13cy10YWIgewogICAgZmxleDogMTsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICBnYXA6IDVweDsKICAgIHBhZGRpbmc6IDRweCA4cHg7CiAgICBib3JkZXI6IG5vbmU7CiAgICBib3JkZXItcmFkaXVzOiA0cHg7CiAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsKICAgIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNDUpOwogICAgZm9udC1zaXplOiAxMXB4OwogICAgZm9udC13ZWlnaHQ6IDUwMDsKICAgIGN1cnNvcjogcG9pbnRlcjsKICAgIHRyYW5zaXRpb246CiAgICAgICAgYmFja2dyb3VuZCAwLjE1cywKICAgICAgICBjb2xvciAwLjE1czsKfQoKLm1qci13cy10YWI6aG92ZXIgewogICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA3KTsKICAgIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNzUpOwp9CgoubWpyLXdzLXRhYi5pcy1hY3RpdmUgewogICAgYmFja2dyb3VuZDogcmdiYSg5OSwgMTU1LCAyNTUsIDAuMTUpOwogICAgY29sb3I6ICM2MzliZmY7Cn0KCi8qIC0tIE5vZGVzIHRhYiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi5tanItd3Mtbm9kZXMtdGFiIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgZmxleDogMTsKICAgIG1pbi1oZWlnaHQ6IDA7CiAgICBvdmVyZmxvdzogaGlkZGVuOwp9CgovKiBHcmFwaCBNYXAgdGFiICovCi5tanItd2dtIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgbWluLWhlaWdodDogMTAwJTsKICAgIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuODIpOwp9CgoubWpyLXdnbS1tYXAtd3JhcCB7CiAgICBoZWlnaHQ6IDE5MHB4OwogICAgbWluLWhlaWdodDogMTUwcHg7CiAgICBtYXJnaW46IDhweDsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xMik7CiAgICBib3JkZXItcmFkaXVzOiA2cHg7CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjIyKTsKfQoKLm1qci13Z20tcHJldmlldyB7CiAgICB3aWR0aDogMTAwJTsKICAgIGhlaWdodDogMTAwJTsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIDAuMzIpOwp9CgoubWpyLXdnbS1wcmV2aWV3IC5tanItbWZ2LW1lZGlhLAoubWpyLXdnbS1wcmV2aWV3IC5tanItbWZ2LXBsYXllci1ob3N0LAoubWpyLXdnbS1wcmV2aWV3IC5tanItbW9kZWwzZC1ob3N0LAoubWpyLXdnbS1wcmV2aWV3LW1lZGlhIHsKICAgIG1heC13aWR0aDogMTAwJTsKICAgIG1heC1oZWlnaHQ6IDEwMCU7CiAgICB3aWR0aDogMTAwJTsKICAgIGhlaWdodDogMTAwJTsKICAgIG9iamVjdC1maXQ6IGNvbnRhaW47Cn0KCi5tanItd2dtLXByZXZpZXctZW1wdHkgewogICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4zNCk7CiAgICBmb250LXNpemU6IDExcHg7Cn0KCi5tanItd2dtLWNhbnZhcyB7CiAgICBkaXNwbGF5OiBibG9jazsKICAgIHdpZHRoOiAxMDAlOwogICAgaGVpZ2h0OiAxMDAlOwogICAgY3Vyc29yOiBncmFiOwogICAgdG91Y2gtYWN0aW9uOiBub25lOwp9CgoubWpyLXdnbS1jYW52YXM6YWN0aXZlIHsKICAgIGN1cnNvcjogZ3JhYmJpbmc7Cn0KCi5tanItd2dtLS1sYXJnZSB7CiAgICB3aWR0aDogMTAwJTsKICAgIGhlaWdodDogMTAwJTsKICAgIG1pbi1oZWlnaHQ6IDA7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIDAuMTgpOwp9CgoubWpyLXdnbS0tbGFyZ2UgLm1qci13Z20tbWFwLXdyYXAgewogICAgZmxleDogMTsKICAgIGhlaWdodDogYXV0bzsKICAgIG1pbi1oZWlnaHQ6IDA7CiAgICBtYXJnaW46IDA7CiAgICBib3JkZXI6IG5vbmU7CiAgICBib3JkZXItcmFkaXVzOiAwOwp9CgoubWpyLXdnbS0tbGFyZ2UgLm1qci13Z20tc3RhdHVzIHsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIGxlZnQ6IDEwcHg7CiAgICB0b3A6IDEwcHg7CiAgICB6LWluZGV4OiAyOwogICAgbWF4LXdpZHRoOiBtaW4oNDIwcHgsIGNhbGMoMTAwJSAtIDIwcHgpKTsKICAgIHBhZGRpbmc6IDVweCA4cHg7CiAgICBib3JkZXItcmFkaXVzOiA1cHg7CiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTIpOwogICAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjUyKTsKICAgIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNzQpOwogICAgYmFja2Ryb3AtZmlsdGVyOiBibHVyKDhweCk7Cn0KCi5tanItd2dtLXRvb2xiYXIgewogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgbGVmdDogMTBweDsKICAgIHRvcDogNDZweDsKICAgIHotaW5kZXg6IDI7CiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgIGdhcDogNnB4OwogICAgbWF4LXdpZHRoOiBtaW4oNDIwcHgsIGNhbGMoMTAwJSAtIDIwcHgpKTsKfQoKLm1qci13Z20tbW9kZSB7CiAgICBtaW4taGVpZ2h0OiAyNnB4OwogICAgcGFkZGluZzogM3B4IDhweDsKICAgIGJvcmRlci1yYWRpdXM6IDk5OXB4OwogICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEyKTsKICAgIGJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgMC41KTsKICAgIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNzIpOwogICAgZm9udC1zaXplOiAxMHB4OwogICAgY3Vyc29yOiBwb2ludGVyOwp9CgoubWpyLXdnbS1tb2RlOmhvdmVyIHsKICAgIGJvcmRlci1jb2xvcjogcmdiYSgxNDksIDE4MywgMjU1LCAwLjQ1KTsKICAgIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuOSk7Cn0KCi5tanItd2dtLW1vZGUuaXMtYWN0aXZlIHsKICAgIGJvcmRlci1jb2xvcjogcmdiYSgxMjQsIDE4NiwgMjU1LCAwLjYyKTsKICAgIGJhY2tncm91bmQ6IHJnYmEoNzksIDEyMywgMjE0LCAwLjI2KTsKICAgIGNvbG9yOiByZ2JhKDIzNSwgMjQ1LCAyNTUsIDAuOTYpOwp9CgoubWpyLXdnbS0tbGFyZ2UgLm1qci13Z20tZGV0YWlscyB7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICByaWdodDogMTBweDsKICAgIHRvcDogMTBweDsKICAgIGJvdHRvbTogMTBweDsKICAgIHotaW5kZXg6IDI7CiAgICB3aWR0aDogbWluKDMyMHB4LCAzOCUpOwogICAgb3ZlcmZsb3cteTogYXV0bzsKICAgIHBhZGRpbmc6IDEwcHg7CiAgICBib3JkZXItcmFkaXVzOiA2cHg7CiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTIpOwogICAgYmFja2dyb3VuZDogcmdiYSgxOCwgMjAsIDI2LCAwLjg0KTsKICAgIGJhY2tkcm9wLWZpbHRlcjogYmx1cigxMHB4KTsKfQoKLm1qci13Z20tLWxhcmdlIC5tanItd2dtLWFjdGlvbiB7CiAgICBtaW4taGVpZ2h0OiAzMHB4Owp9CgoubWpyLXdnbS0tbGFyZ2UgLm1qci13Z20tcGFyYW0gewogICAgZm9udC1zaXplOiAxMXB4Owp9CgoubWpyLXdnbS1zdGF0dXMgewogICAgcGFkZGluZzogMCAxMHB4IDhweDsKICAgIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNDIpOwogICAgZm9udC1zaXplOiAxMHB4OwogICAgbGluZS1oZWlnaHQ6IDEuMzU7Cn0KCi5tanItd2dtLWRldGFpbHMgewogICAgZGlzcGxheTogZmxleDsKICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICBnYXA6IDZweDsKICAgIHBhZGRpbmc6IDAgOHB4IDEwcHg7Cn0KCi5tanItd2dtLW5vZGUtdGl0bGUgewogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgIGZvbnQtc2l6ZTogMTJweDsKICAgIGZvbnQtd2VpZ2h0OiA3MDA7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjkpOwp9CgoubWpyLXdnbS1ub2RlLW1ldGEgewogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgIG1hcmdpbi10b3A6IC00cHg7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjQyKTsKICAgIGZvbnQtc2l6ZTogMTBweDsKfQoKLm1qci13Z20tYnJlYWRjcnVtYiB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogNXB4OwogICAgbWluLXdpZHRoOiAwOwogICAgbWFyZ2luOiAtMnB4IDAgMnB4OwogICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC41OCk7CiAgICBmb250LXNpemU6IDExcHg7Cn0KCi5tanItd2dtLWJyZWFkY3J1bWItaXRlbSB7CiAgICBtaW4td2lkdGg6IDA7CiAgICBtYXgtd2lkdGg6IDE0MHB4OwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKfQoKLm1qci13Z20tYnJlYWRjcnVtYi1zZXAgewogICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4zMik7Cn0KCi5tanItd2dtLWFjdGlvbnMgewogICAgZGlzcGxheTogZ3JpZDsKICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogMWZyOwogICAgZ2FwOiA0cHg7Cn0KCi5tanItd2dtLWFjdGlvbiB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogN3B4OwogICAgbWluLWhlaWdodDogMjhweDsKICAgIHBhZGRpbmc6IDVweCA4cHg7CiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTIpOwogICAgYm9yZGVyLXJhZGl1czogNXB4OwogICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA0KTsKICAgIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNzYpOwogICAgZm9udC1zaXplOiAxMXB4OwogICAgY3Vyc29yOiBwb2ludGVyOwp9CgoubWpyLXdnbS1hY3Rpb246aG92ZXIgewogICAgYm9yZGVyLWNvbG9yOiByZ2JhKDk5LCAxNTUsIDI1NSwgMC40NSk7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDk5LCAxNTUsIDI1NSwgMC4xMik7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjkyKTsKfQoKLm1qci13Z20tYWN0aW9uLmlzLW9rIHsKICAgIGJvcmRlci1jb2xvcjogcmdiYSg3NiwgMTc1LCA4MCwgMC41NSk7CiAgICBjb2xvcjogcmdiYSgxOTAsIDI1NSwgMTk2LCAwLjk2KTsKfQoKLm1qci13Z20tcGFyYW1zIHsKICAgIGRpc3BsYXk6IGdyaWQ7CiAgICBnYXA6IDRweDsKICAgIG1hcmdpbi10b3A6IDJweDsKfQoKLm1qci13Z20tcGFyYW0gewogICAgZGlzcGxheTogZ3JpZDsKICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogbWlubWF4KDY0cHgsIDAuNDJmcikgbWlubWF4KDAsIDFmcik7CiAgICBnYXA6IDhweDsKICAgIHBhZGRpbmc6IDVweCA3cHg7CiAgICBib3JkZXItcmFkaXVzOiA0cHg7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIDAuMTgpOwogICAgZm9udC1zaXplOiAxMHB4OwogICAgbGluZS1oZWlnaHQ6IDEuMzU7CiAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICBib3JkZXI6IDFweCBzb2xpZCB0cmFuc3BhcmVudDsKICAgIHRyYW5zaXRpb246CiAgICAgICAgYmFja2dyb3VuZCAxMjBtcyBlYXNlLAogICAgICAgIGJvcmRlci1jb2xvciAxMjBtcyBlYXNlOwp9CgoubWpyLXdnbS1wYXJhbTpob3ZlciwKLm1qci13Z20tcGFyYW06Zm9jdXMtdmlzaWJsZSB7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDgpOwogICAgYm9yZGVyLWNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTgpOwogICAgb3V0bGluZTogbm9uZTsKfQoKLm1qci13Z20tcGFyYW0uaXMtb2sgewogICAgYm9yZGVyLWNvbG9yOiByZ2JhKDc5LCAyMTAsIDEyNSwgMC43KTsKICAgIGJhY2tncm91bmQ6IHJnYmEoNzksIDIxMCwgMTI1LCAwLjE2KTsKfQoKLm1qci13Z20tcGFyYW0uaXMtZXJyb3IgewogICAgYm9yZGVyLWNvbG9yOiByZ2JhKDI1NSwgOTAsIDkwLCAwLjcpOwogICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDkwLCA5MCwgMC4xNik7Cn0KCi5tanItd2dtLXBhcmFtLWtleSB7CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7CiAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC40OCk7Cn0KCi5tanItd2dtLXBhcmFtLXZhbHVlIHsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjgyKTsKfQoKLm1qci13Z20tbm9kZS12aXN1YWwgewogICAgLS1tanItd2dtLW5vZGUtYWNjZW50OiByZ2JhKDExNSwgMTU1LCAyNTUsIDAuODgpOwogICAgLS1tanItd2dtLW5vZGUtYWNjZW50LXNvZnQ6IHJnYmEoMTE1LCAxNTUsIDI1NSwgMC4yMik7CiAgICBkaXNwbGF5OiBncmlkOwogICAgZ2FwOiA4cHg7CiAgICBtYXJnaW4tdG9wOiAycHg7CiAgICBwYWRkaW5nOiA4cHg7CiAgICBib3JkZXItcmFkaXVzOiA2cHg7CiAgICBib3JkZXI6IDFweCBzb2xpZCBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXdnbS1ub2RlLWFjY2VudCkgMzQlLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMSkpOwogICAgYm94LXNoYWRvdzoKICAgICAgICBpbnNldCAwIDFweCAwIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wOCksCiAgICAgICAgMCAxMHB4IDI0cHggcmdiYSgwLCAwLCAwLCAwLjI0KTsKICAgIGJhY2tncm91bmQ6CiAgICAgICAgbGluZWFyLWdyYWRpZW50KDE4MGRlZywgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci13Z20tbm9kZS1hY2NlbnQtc29mdCkgMTAwJSwgdHJhbnNwYXJlbnQpLCByZ2JhKDQ0LCA1NiwgODgsIDAuMikpLAogICAgICAgIHJnYmEoMTMsIDE2LCAyNCwgMC44NSk7Cn0KCi5tanItd2dtLW5vZGUtdmlzdWFsOjpiZWZvcmUgewogICAgY29udGVudDogIiI7CiAgICBkaXNwbGF5OiBibG9jazsKICAgIGhlaWdodDogMnB4OwogICAgbWFyZ2luOiAtOHB4IC04cHggNnB4OwogICAgYm9yZGVyLXJhZGl1czogNnB4IDZweCAwIDA7CiAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoOTBkZWcsIHZhcigtLW1qci13Z20tbm9kZS1hY2NlbnQpLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTIpKTsKfQoKLm1qci13Z20tbm9kZS12aXN1YWwuaXMtbW9kZWwgewogICAgLS1tanItd2dtLW5vZGUtYWNjZW50OiByZ2JhKDEyNCwgMTg2LCAyNTUsIDAuOSk7CiAgICAtLW1qci13Z20tbm9kZS1hY2NlbnQtc29mdDogcmdiYSg3MCwgMTIzLCAxODEsIDAuMzQpOwp9CgoubWpyLXdnbS1ub2RlLXZpc3VhbC5pcy1zYW1wbGVyIHsKICAgIC0tbWpyLXdnbS1ub2RlLWFjY2VudDogcmdiYSgxNDMsIDIyOCwgMTY3LCAwLjkpOwogICAgLS1tanItd2dtLW5vZGUtYWNjZW50LXNvZnQ6IHJnYmEoNjQsIDEzMywgODgsIDAuMzQpOwp9CgoubWpyLXdnbS1ub2RlLXZpc3VhbC5pcy10ZXh0IHsKICAgIC0tbWpyLXdnbS1ub2RlLWFjY2VudDogcmdiYSgyNTUsIDE5MiwgMTE0LCAwLjkpOwogICAgLS1tanItd2dtLW5vZGUtYWNjZW50LXNvZnQ6IHJnYmEoMTU0LCAxMDIsIDQ5LCAwLjM0KTsKfQoKLm1qci13Z20tbm9kZS12aXN1YWwuaXMtbWVkaWEgewogICAgLS1tanItd2dtLW5vZGUtYWNjZW50OiByZ2JhKDE1NCwgMTcwLCAyNTUsIDAuOSk7CiAgICAtLW1qci13Z20tbm9kZS1hY2NlbnQtc29mdDogcmdiYSg4MywgOTMsIDE2NSwgMC4zNCk7Cn0KCi5tanItd2dtLW5vZGUtdmlzdWFsLmlzLWNvbnRyb2wgewogICAgLS1tanItd2dtLW5vZGUtYWNjZW50OiByZ2JhKDI1NSwgMTM5LCAxNjksIDAuOSk7CiAgICAtLW1qci13Z20tbm9kZS1hY2NlbnQtc29mdDogcmdiYSgxNDUsIDcwLCA5NSwgMC4zNCk7Cn0KCi5tanItd2dtLW5vZGUtdmlzdWFsLmlzLWxvZ2ljIHsKICAgIC0tbWpyLXdnbS1ub2RlLWFjY2VudDogcmdiYSgxODgsIDE2OCwgMjU1LCAwLjkpOwogICAgLS1tanItd2dtLW5vZGUtYWNjZW50LXNvZnQ6IHJnYmEoMTA1LCA4NiwgMTUzLCAwLjM0KTsKfQoKLm1qci13Z20tbm9kZS12aXN1YWwtaGVhZGVyIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOwogICAgZ2FwOiA4cHg7CiAgICBwYWRkaW5nLWJvdHRvbTogNnB4OwogICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItd2dtLW5vZGUtYWNjZW50KSAyNSUsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xNCkpOwp9CgoubWpyLXdnbS1ub2RlLXZpc3VhbC10eXBlIHsKICAgIGZvbnQtc2l6ZTogMTFweDsKICAgIGZvbnQtd2VpZ2h0OiA3MDA7CiAgICBjb2xvcjogcmdiYSgyMzYsIDI0NCwgMjU1LCAwLjk0KTsKICAgIHRleHQtc2hhZG93OiAwIDFweCAwIHJnYmEoMCwgMCwgMCwgMC4zNSk7Cn0KCi5tanItd2dtLW5vZGUtdmlzdWFsLWlkIHsKICAgIGZvbnQtc2l6ZTogMTBweDsKICAgIGNvbG9yOiByZ2JhKDE5NCwgMjEzLCAyNTUsIDAuNzgpOwp9CgoubWpyLXdnbS1ub2RlLXBvcnRzIHsKICAgIGRpc3BsYXk6IGdyaWQ7CiAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IDFmciAxZnI7CiAgICBnYXA6IDhweDsKfQoKLm1qci13Z20tbm9kZS1wb3J0cy1jb2wgewogICAgbWluLXdpZHRoOiAwOwp9CgoubWpyLXdnbS1ub2RlLXBvcnRzLXRpdGxlIHsKICAgIG1hcmdpbi1ib3R0b206IDRweDsKICAgIGZvbnQtc2l6ZTogMTBweDsKICAgIGxldHRlci1zcGFjaW5nOiAwLjAyZW07CiAgICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOwogICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC40NSk7Cn0KCi5tanItd2dtLW5vZGUtcG9ydHMtbGlzdCB7CiAgICBkaXNwbGF5OiBncmlkOwogICAgZ2FwOiAzcHg7Cn0KCi5tanItd2dtLW5vZGUtcG9ydCwKLm1qci13Z20tbm9kZS1wb3J0LWVtcHR5IHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiA2cHg7CiAgICBtaW4taGVpZ2h0OiAxOHB4OwogICAgcGFkZGluZzogMnB4IDZweDsKICAgIGJvcmRlci1yYWRpdXM6IDRweDsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wNik7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIDAuMjQpOwp9CgoubWpyLXdnbS1ub2RlLXBvcnQtZW1wdHkgewogICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4yNik7Cn0KCi5tanItd2dtLW5vZGUtcG9ydC1kb3QgewogICAgd2lkdGg6IDhweDsKICAgIGhlaWdodDogOHB4OwogICAgYm9yZGVyLXJhZGl1czogOTk5cHg7CiAgICBmbGV4OiAwIDAgYXV0bzsKICAgIGJveC1zaGFkb3c6IDAgMCAwIDFweCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTgpIGluc2V0Owp9CgoubWpyLXdnbS1ub2RlLXBvcnQtZG90LmlzLWluIHsKICAgIGJhY2tncm91bmQ6IHJnYmEoMTM1LCAxOTYsIDI1NSwgMC45KTsKfQoKLm1qci13Z20tbm9kZS1wb3J0LWRvdC5pcy1vdXQgewogICAgYmFja2dyb3VuZDogcmdiYSgxNDQsIDIzOCwgMTc0LCAwLjkpOwp9CgoubWpyLXdnbS1ub2RlLXBvcnQtbmFtZSB7CiAgICBmbGV4OiAxOwogICAgbWluLXdpZHRoOiAwOwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgIGZvbnQtc2l6ZTogMTBweDsKICAgIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNzgpOwp9CgoubWpyLXdnbS1ub2RlLXBvcnQtdHlwZSB7CiAgICBmbGV4OiAwIDAgYXV0bzsKICAgIG1heC13aWR0aDogNDUlOwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgIGZvbnQtc2l6ZTogOXB4OwogICAgbGV0dGVyLXNwYWNpbmc6IDAuMDJlbTsKICAgIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7CiAgICBwYWRkaW5nOiAxcHggNXB4OwogICAgYm9yZGVyLXJhZGl1czogOTk5cHg7CiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTQpOwogICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA4KTsKICAgIGNvbG9yOiByZ2JhKDIyNCwgMjM2LCAyNTUsIDAuOSk7Cn0KCi5tanItd2dtLW5vZGUtd2lkZ2V0cyB7CiAgICBkaXNwbGF5OiBncmlkOwogICAgZ2FwOiA0cHg7Cn0KCi5tanItd2dtLW5vZGUtd2lkZ2V0cy10aXRsZSB7CiAgICBtYXJnaW4tYm90dG9tOiAycHg7CiAgICBmb250LXNpemU6IDEwcHg7CiAgICBsZXR0ZXItc3BhY2luZzogMC4wMmVtOwogICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKICAgIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNDUpOwp9CgoubWpyLXdnbS1ub2RlLXdpZGdldCwKLm1qci13Z20tbm9kZS13aWRnZXQtZW1wdHkgewogICAgZGlzcGxheTogZ3JpZDsKICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogbWlubWF4KDcwcHgsIDAuNDJmcikgbWlubWF4KDAsIDFmcik7CiAgICBnYXA6IDhweDsKICAgIHBhZGRpbmc6IDRweCA2cHg7CiAgICBib3JkZXItcmFkaXVzOiA0cHg7CiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDYpOwogICAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjIpOwp9CgoubWpyLXdnbS1ub2RlLXdpZGdldCB7CiAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICB0cmFuc2l0aW9uOgogICAgICAgIGJhY2tncm91bmQgMTIwbXMgZWFzZSwKICAgICAgICBib3JkZXItY29sb3IgMTIwbXMgZWFzZTsKfQoKLm1qci13Z20tbm9kZS13aWRnZXQ6aG92ZXIsCi5tanItd2dtLW5vZGUtd2lkZ2V0OmZvY3VzLXZpc2libGUgewogICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA5KTsKICAgIGJvcmRlci1jb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjIpOwogICAgb3V0bGluZTogbm9uZTsKfQoKLm1qci13Z20tbm9kZS13aWRnZXQuaXMtb2sgewogICAgYm9yZGVyLWNvbG9yOiByZ2JhKDc5LCAyMTAsIDEyNSwgMC43KTsKICAgIGJhY2tncm91bmQ6IHJnYmEoNzksIDIxMCwgMTI1LCAwLjE2KTsKfQoKLm1qci13Z20tbm9kZS13aWRnZXQuaXMtZXJyb3IgewogICAgYm9yZGVyLWNvbG9yOiByZ2JhKDI1NSwgOTAsIDkwLCAwLjcpOwogICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDkwLCA5MCwgMC4xNik7Cn0KCi5tanItd2dtLW5vZGUtd2lkZ2V0LWVtcHR5IHsKICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogMWZyOwogICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4zNCk7Cn0KCi5tanItd2dtLW5vZGUtd2lkZ2V0LWtleSB7CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7CiAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgZm9udC1zaXplOiAxMHB4OwogICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC41Mik7Cn0KCi5tanItd2dtLW5vZGUtd2lkZ2V0LXZhbHVlIHsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICBmb250LXNpemU6IDEwcHg7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjg4KTsKfQoKLm1qci13Z20tbm9kZS13aWRnZXQuaXMtbXVsdGlsaW5lIHsKICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogMWZyOwogICAgYWxpZ24taXRlbXM6IHN0YXJ0OwogICAgZ2FwOiA0cHg7Cn0KCi5tanItd2dtLW5vZGUtd2lkZ2V0LmlzLW11bHRpbGluZSAubWpyLXdnbS1ub2RlLXdpZGdldC1rZXkgewogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKfQoKLm1qci13Z20tbm9kZS13aWRnZXQuaXMtbXVsdGlsaW5lIC5tanItd2dtLW5vZGUtd2lkZ2V0LXZhbHVlIHsKICAgIHdoaXRlLXNwYWNlOiBwcmUtd3JhcDsKICAgIHdvcmQtYnJlYWs6IGJyZWFrLXdvcmQ7CiAgICBvdmVyZmxvdy13cmFwOiBhbnl3aGVyZTsKICAgIGxpbmUtaGVpZ2h0OiAxLjM1OwogICAgbWF4LWhlaWdodDogOS4yZW07CiAgICBvdmVyZmxvdy15OiBhdXRvOwogICAgcGFkZGluZy1yaWdodDogMnB4Owp9CgoubWpyLXdnbS1ub2RlLXdpZGdldC5pcy1tdWx0aWxpbmUuaXMtdGV4dC1maWVsZCAubWpyLXdnbS1ub2RlLXdpZGdldC12YWx1ZSB7CiAgICBtYXgtaGVpZ2h0OiAxNmVtOwogICAgbGluZS1oZWlnaHQ6IDEuNDsKfQoKLm1qci13Z20tbm9kZS13aWRnZXQtbW9yZSB7CiAgICBmb250LXNpemU6IDEwcHg7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjQ2KTsKICAgIHRleHQtYWxpZ246IHJpZ2h0Owp9CgpAbWVkaWEgKG1heC13aWR0aDogODIwcHgpIHsKICAgIC5tanItd2dtLS1sYXJnZSAubWpyLXdnbS1kZXRhaWxzIHsKICAgICAgICB3aWR0aDogbWluKDM4MHB4LCBjYWxjKDEwMCUgLSAyMHB4KSk7CiAgICB9CgogICAgLm1qci13Z20tbm9kZS1wb3J0cyB7CiAgICAgICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiAxZnI7CiAgICB9Cn0KCi5tanItd3Mtc2VhcmNoLXdyYXAgewogICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBmbGV4LXNocmluazogMDsKICAgIHBhZGRpbmc6IDZweCA4cHg7CiAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgdmFyKC0tbWpyLWJvcmRlciwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEyKSk7Cn0KCi5tanItd3Mtc2VhcmNoLWljb24gewogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgbGVmdDogMTZweDsKICAgIGZvbnQtc2l6ZTogMTFweDsKICAgIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMyk7CiAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKfQoKLm1qci13cy1zZWFyY2ggewogICAgZmxleDogMTsKICAgIHBhZGRpbmc6IDRweCAyOHB4IDRweCAyNnB4OwogICAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjM1KTsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xMik7CiAgICBib3JkZXItcmFkaXVzOiA0cHg7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjg1KTsKICAgIGZvbnQtc2l6ZTogMTFweDsKICAgIG91dGxpbmU6IG5vbmU7Cn0KCi5tanItd3Mtc2VhcmNoOjpwbGFjZWhvbGRlciB7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjI4KTsKfQoKLm1qci13cy1zZWFyY2g6Zm9jdXMgewogICAgYm9yZGVyLWNvbG9yOiByZ2JhKDk5LCAxNTUsIDI1NSwgMC41KTsKfQoKLm1qci13cy1zZWFyY2gtY2xlYXIgewogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgcmlnaHQ6IDE0cHg7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgd2lkdGg6IDE4cHg7CiAgICBoZWlnaHQ6IDE4cHg7CiAgICBwYWRkaW5nOiAwOwogICAgYm9yZGVyOiBub25lOwogICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjMpOwogICAgZm9udC1zaXplOiAxMHB4OwogICAgY3Vyc29yOiBwb2ludGVyOwogICAgYm9yZGVyLXJhZGl1czogM3B4Owp9CgoubWpyLXdzLXNlYXJjaC1jbGVhcjpob3ZlciB7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjcpOwogICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA4KTsKfQoKLm1qci13cy1ub2Rlcy1saXN0IHsKICAgIGZsZXg6IDE7CiAgICBvdmVyZmxvdy15OiBhdXRvOwogICAgcGFkZGluZzogNHB4IDA7Cn0KCi5tanItd3Mtbm9kZS1yb3cgewogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBnYXA6IDZweDsKICAgIHBhZGRpbmc6IDVweCAxMHB4IDVweCAxMnB4OwogICAgY3Vyc29yOiBwb2ludGVyOwogICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wNSk7CiAgICBtaW4taGVpZ2h0OiAzMnB4OwogICAgdHJhbnNpdGlvbjogYmFja2dyb3VuZCAwLjFzOwp9CgoubWpyLXdzLW5vZGUtcm93OmhvdmVyIHsKICAgIGJhY2tncm91bmQ6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wNik7Cn0KCi5tanItd3Mtbm9kZS1yb3ctdHlwZSB7CiAgICBmbGV4OiAxOwogICAgZm9udC1zaXplOiAxMXB4OwogICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC43OCk7CiAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwp9CgoubWpyLXdzLW5vZGUtcm93LXRpdGxlIHsKICAgIGZvbnQtc2l6ZTogMTBweDsKICAgIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNCk7CiAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwogICAgbWF4LXdpZHRoOiA4MHB4OwogICAgZmxleC1zaHJpbms6IDA7Cn0KCi5tanItd3Mtbm9kZS1sb2NhdGUgewogICAgZmxleC1zaHJpbms6IDA7CiAgICB3aWR0aDogMjJweDsKICAgIGhlaWdodDogMjJweDsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICBwYWRkaW5nOiAwOwogICAgYm9yZGVyOiBub25lOwogICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjMpOwogICAgZm9udC1zaXplOiAxMXB4OwogICAgYm9yZGVyLXJhZGl1czogM3B4OwogICAgY3Vyc29yOiBwb2ludGVyOwogICAgb3BhY2l0eTogMDsKICAgIHRyYW5zaXRpb246CiAgICAgICAgb3BhY2l0eSAwLjFzLAogICAgICAgIGNvbG9yIDAuMXMsCiAgICAgICAgYmFja2dyb3VuZCAwLjFzOwp9CgoubWpyLXdzLW5vZGUtcm93OmhvdmVyIC5tanItd3Mtbm9kZS1sb2NhdGUgewogICAgb3BhY2l0eTogMTsKfQoKLm1qci13cy1ub2RlLWxvY2F0ZTpob3ZlciB7CiAgICBjb2xvcjogIzYzOWJmZjsKICAgIGJhY2tncm91bmQ6IHJnYmEoOTksIDE1NSwgMjU1LCAwLjE1KTsKfQoKLyogLS0gTm9kZSBzZWN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLm1qci13cy10cmVlLWl0ZW0gewogICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHZhcigtLW1qci1ib3JkZXIsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xMikpOwp9Ci5tanItd3MtdHJlZS1pdGVtID4gLm1qci13cy1ub2RlIHsKICAgIGJvcmRlci1ib3R0b206IG5vbmU7Cn0KLm1qci13cy10cmVlLWl0ZW0tLXN1YmdyYXBoIHsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYWNjZW50LCAjNWI4YWYwKSA0JSwgdHJhbnNwYXJlbnQgOTYlKTsKfQoubWpyLXdzLW5vZGUgewogICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHZhcigtLW1qci1ib3JkZXIsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xMikpOwp9Ci8qIFN1YnRsZSBoaWdobGlnaHQgd2hlbiB0aGlzIG5vZGUgbWF0Y2hlcyB0aGUgY3VycmVudCBncmFwaCBzZWxlY3Rpb24uICovCi5tanItd3Mtbm9kZS5pcy1zZWxlY3RlZC1mcm9tLWdyYXBoIHsKICAgIGJhY2tncm91bmQ6IHJnYmEoMjU1LCAyMTAsIDkwLCAwLjA4KTsKICAgIGJveC1zaGFkb3c6IGluc2V0IDJweCAwIDAgMCByZ2JhKDI1NSwgMjEwLCA5MCwgMC43NSk7Cn0KLm1qci13cy1ub2RlLmlzLXNlbGVjdGVkLWZyb20tZ3JhcGggLm1qci13cy1ub2RlLWhlYWRlciB7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgI2ZmZDQ1YSAxOCUsIHZhcigtLW1qci1zdXJmYWNlLTEsICMyYTJhMmEpIDgyJSk7Cn0KLm1qci13cy1ub2RlLmlzLXNlbGVjdGVkLWZyb20tZ3JhcGggLm1qci13cy1ub2RlLXR5cGUgewogICAgY29sb3I6ICNmZmQ0NWE7Cn0KLm1qci13cy1ub2RlLmlzLXNlbGVjdGVkLWZyb20tZ3JhcGggLm1qci13cy1ub2RlLXRpdGxlIHsKICAgIGNvbG9yOiByZ2JhKDI1NSwgMjI0LCAxMzAsIDAuODgpOwp9Ci5tanItd3Mtbm9kZS5pcy1zZWxlY3RlZC1mcm9tLWdyYXBoIC5tanItd3Mtbm9kZS10b2dnbGUsCi5tanItd3Mtbm9kZS5pcy1zZWxlY3RlZC1mcm9tLWdyYXBoIC5tanItd3MtbG9jYXRlLAoubWpyLXdzLW5vZGUuaXMtc2VsZWN0ZWQtZnJvbS1ncmFwaCAubWpyLXdzLW5vZGUta2luZCB7CiAgICBjb2xvcjogI2ZmZDQ1YTsKfQoubWpyLXdzLXNpZGViYXItcmVzaXplciB7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICB0b3A6IDA7CiAgICBib3R0b206IDA7CiAgICB3aWR0aDogMTRweDsKICAgIHotaW5kZXg6IDI7CiAgICBjdXJzb3I6IGV3LXJlc2l6ZTsKICAgIHBvaW50ZXItZXZlbnRzOiBhdXRvOwp9CgoubWpyLXdzLXNpZGViYXItcmVzaXplcjo6YmVmb3JlIHsKICAgIGNvbnRlbnQ6ICIiOwogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgdG9wOiA1MCU7CiAgICBsZWZ0OiA1MCU7CiAgICB3aWR0aDogNHB4OwogICAgaGVpZ2h0OiA1NnB4OwogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTUwJSwgLTUwJSk7CiAgICBib3JkZXItcmFkaXVzOiA5OTlweDsKICAgIGJhY2tncm91bmQ6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xOCk7CiAgICBib3gtc2hhZG93OiAwIDAgMCAxcHggcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA2KTsKICAgIG9wYWNpdHk6IDA7CiAgICB0cmFuc2l0aW9uOgogICAgICAgIG9wYWNpdHkgMC4xNXMgZWFzZSwKICAgICAgICBiYWNrZ3JvdW5kIDAuMTVzIGVhc2U7Cn0KCi5tanItd3Mtc2lkZWJhci5vcGVuOmhvdmVyIC5tanItd3Mtc2lkZWJhci1yZXNpemVyOjpiZWZvcmUsCi5tanItd3Mtc2lkZWJhci5pcy1yZXNpemluZyAubWpyLXdzLXNpZGViYXItcmVzaXplcjo6YmVmb3JlLAoubWpyLXdzLXNpZGViYXItcmVzaXplci5pcy1kcmFnZ2luZzo6YmVmb3JlIHsKICAgIG9wYWNpdHk6IDE7Cn0KCi5tanItd3Mtc2lkZWJhci5pcy1yZXNpemluZyAubWpyLXdzLXNpZGViYXItcmVzaXplcjo6YmVmb3JlLAoubWpyLXdzLXNpZGViYXItcmVzaXplcjpob3Zlcjo6YmVmb3JlLAoubWpyLXdzLXNpZGViYXItcmVzaXplci5pcy1kcmFnZ2luZzo6YmVmb3JlIHsKICAgIGJhY2tncm91bmQ6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4zNCk7Cn0KCi5tanItbWZ2LWNvbnRlbnQtd3JhcHBlcltkYXRhLXNpZGViYXItcG9zPSJyaWdodCJdIC5tanItd3Mtc2lkZWJhci1yZXNpemVyIHsKICAgIHJpZ2h0OiAwOwp9CgoubWpyLW1mdi1jb250ZW50LXdyYXBwZXJbZGF0YS1zaWRlYmFyLXBvcz0ibGVmdCJdIC5tanItd3Mtc2lkZWJhci1yZXNpemVyIHsKICAgIGxlZnQ6IDA7Cn0KCi5tanItbWZ2LWNvbnRlbnQtd3JhcHBlcltkYXRhLXNpZGViYXItcG9zPSJib3R0b20iXSAubWpyLXdzLXNpZGViYXItcmVzaXplciB7CiAgICBkaXNwbGF5OiBub25lOwp9Ci5tanItd3Mtbm9kZS1oZWFkZXIgewogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBnYXA6IDhweDsKICAgIHBhZGRpbmc6IDZweCAxMHB4OwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KAogICAgICAgIGluIHNyZ2IsCiAgICAgICAgdmFyKC0tbWpyLXN1cmZhY2UtMCwgIzFlMWUxZSkgNDAlLAogICAgICAgIHZhcigtLW1qci1zdXJmYWNlLTEsICMyYTJhMmEpIDYwJQogICAgKTsKICAgIGN1cnNvcjogZGVmYXVsdDsKICAgIHVzZXItc2VsZWN0OiBub25lOwogICAgdHJhbnNpdGlvbjogYmFja2dyb3VuZCAwLjEycyBlYXNlOwp9Ci5tanItd3Mtbm9kZS5pcy1jb2xsYXBzaWJsZSAubWpyLXdzLW5vZGUtaGVhZGVyIHsKICAgIGN1cnNvcjogcG9pbnRlcjsKfQoubWpyLXdzLW5vZGUuaXMtY29sbGFwc2libGUgLm1qci13cy1ub2RlLWhlYWRlcjpob3ZlciB7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoCiAgICAgICAgaW4gc3JnYiwKICAgICAgICB2YXIoLS1tanItc3VyZmFjZS0wLCAjMWUxZTFlKSAyOCUsCiAgICAgICAgdmFyKC0tbWpyLXN1cmZhY2UtMSwgIzJhMmEyYSkgNzIlCiAgICApOwp9Ci5tanItd3Mtbm9kZS5pcy1jb2xsYXBzaWJsZS5pcy1jb2xsYXBzZWQgLm1qci13cy1ub2RlLWhlYWRlcjpob3ZlciB7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoCiAgICAgICAgaW4gc3JnYiwKICAgICAgICB2YXIoLS1tanItYWNjZW50LCAjNWI4YWYwKSA4JSwKICAgICAgICB2YXIoLS1tanItc3VyZmFjZS0xLCAjMmEyYTJhKSA5MiUKICAgICk7Cn0KLm1qci13cy1ub2RlLXRvZ2dsZSB7CiAgICBmbGV4OiAwIDAgYXV0bzsKfQoubWpyLXdzLW5vZGUtdGl0bGUtd3JhcCB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZmxleDogMTsKICAgIG1pbi13aWR0aDogMDsKICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICBnYXA6IDFweDsKfQoubWpyLXdzLW5vZGUtdHlwZSB7CiAgICBmb250LXdlaWdodDogNjAwOwogICAgZm9udC1zaXplOiAxMnB4OwogICAgY29sb3I6IHZhcigtLWNvbnRlbnQtZmcsICNkZGQpOwogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKfQoubWpyLXdzLW5vZGUtdGl0bGUgewogICAgZm9udC1zaXplOiAxMHB4OwogICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC40OCk7CiAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwp9Ci5tanItd3Mtbm9kZS1raW5kIHsKICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogNHB4OwogICAgZmxleDogMCAwIGF1dG87CiAgICBtYXgtd2lkdGg6IDExMHB4OwogICAgcGFkZGluZzogMnB4IDZweDsKICAgIGJvcmRlcjogMXB4IHNvbGlkIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYWNjZW50LCAjNWI4YWYwKSAzOCUsIHRyYW5zcGFyZW50IDYyJSk7CiAgICBib3JkZXItcmFkaXVzOiA5OTlweDsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYWNjZW50LCAjNWI4YWYwKSAxMiUsIHRyYW5zcGFyZW50IDg4JSk7CiAgICBjb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQsICM1YjhhZjApIDc4JSwgI2ZmZmZmZiAyMiUpOwogICAgZm9udC1zaXplOiAxMHB4OwogICAgZm9udC13ZWlnaHQ6IDcwMDsKICAgIGxpbmUtaGVpZ2h0OiAxLjI7CiAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwp9Ci5tanItd3Mtbm9kZS1raW5kIC5waSB7CiAgICBmb250LXNpemU6IDEwcHg7Cn0KLm1qci13cy1ub2RlLWtpbmQtY291bnQgewogICAgbWluLXdpZHRoOiAxNHB4OwogICAgcGFkZGluZzogMCAzcHg7CiAgICBib3JkZXItcmFkaXVzOiA5OTlweDsKICAgIGJhY2tncm91bmQ6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xMik7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjgyKTsKICAgIHRleHQtYWxpZ246IGNlbnRlcjsKfQoubWpyLXdzLW5vZGUuaXMtY29sbGFwc2VkIC5tanItd3Mtbm9kZS1ib2R5IHsKICAgIGRpc3BsYXk6IG5vbmU7Cn0KLm1qci13cy1ub2RlLWJvZHkgewogICAgZGlzcGxheTogZmxleDsKICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICBnYXA6IDRweDsKICAgIHBhZGRpbmc6IDZweCAxMHB4Owp9Ci5tanItd3Mtbm9kZS1lbXB0eSB7CiAgICBmb250LXNpemU6IDExcHg7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjMpOwogICAgcGFkZGluZzogNHB4IDA7Cn0KCi8qIC0tIE5lc3RlZCBub2RlcyAoaW5zaWRlIHN1YmdyYXBocykgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLm1qci13cy1ub2RlLS1uZXN0ZWQgewogICAgYm9yZGVyLWxlZnQ6IDJweCBzb2xpZCByZ2JhKDkxLCAxMzgsIDI0MCwgMC4zNSk7Cn0KLm1qci13cy1ub2RlLS1uZXN0ZWQgLm1qci13cy1ub2RlLWhlYWRlciB7CiAgICBwYWRkaW5nLWxlZnQ6IDE2cHg7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoCiAgICAgICAgaW4gc3JnYiwKICAgICAgICB2YXIoLS1tanItYWNjZW50LCAjNWI4YWYwKSA1JSwKICAgICAgICB2YXIoLS1tanItc3VyZmFjZS0xLCAjMmEyYTJhKSA5NSUKICAgICk7Cn0KLm1qci13cy1ub2RlLS1uZXN0ZWQuaXMtY29sbGFwc2libGUgLm1qci13cy1ub2RlLWhlYWRlcjpob3ZlciB7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoCiAgICAgICAgaW4gc3JnYiwKICAgICAgICB2YXIoLS1tanItYWNjZW50LCAjNWI4YWYwKSAxMCUsCiAgICAgICAgdmFyKC0tbWpyLXN1cmZhY2UtMSwgIzJhMmEyYSkgOTAlCiAgICApOwp9CgovKiAtLSBTdWJncmFwaCBjaGlsZHJlbiBncm91cCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoubWpyLXdzLWNoaWxkcmVuLXRvZ2dsZSB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogNnB4OwogICAgd2lkdGg6IDEwMCU7CiAgICBwYWRkaW5nOiA1cHggMTBweCA1cHggMjBweDsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peCgKICAgICAgICBpbiBzcmdiLAogICAgICAgIHZhcigtLW1qci1hY2NlbnQsICM1YjhhZjApIDYlLAogICAgICAgIHZhcigtLW1qci1zdXJmYWNlLTAsICMxZTFlMWUpIDk0JQogICAgKTsKICAgIGJvcmRlcjogbm9uZTsKICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCB2YXIoLS1tanItYm9yZGVyLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTIpKTsKICAgIGNvbG9yOiB2YXIoLS1tanItYWNjZW50LCAjNWI4YWYwKTsKICAgIGZvbnQtc2l6ZTogMTFweDsKICAgIGN1cnNvcjogcG9pbnRlcjsKICAgIHRleHQtYWxpZ246IGxlZnQ7CiAgICBvcGFjaXR5OiAwLjg7CiAgICB0cmFuc2l0aW9uOgogICAgICAgIG9wYWNpdHkgMC4xcyBlYXNlLAogICAgICAgIGJhY2tncm91bmQgMC4xcyBlYXNlOwp9Ci5tanItd3MtY2hpbGRyZW4tdG9nZ2xlLS1uZXN0ZWQgewogICAgcGFkZGluZy1sZWZ0OiAyOHB4Owp9Ci5tanItd3MtY2hpbGRyZW4tdG9nZ2xlOmhvdmVyIHsKICAgIG9wYWNpdHk6IDE7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoCiAgICAgICAgaW4gc3JnYiwKICAgICAgICB2YXIoLS1tanItYWNjZW50LCAjNWI4YWYwKSAxMiUsCiAgICAgICAgdmFyKC0tbWpyLXN1cmZhY2UtMCwgIzFlMWUxZSkgODglCiAgICApOwp9Ci5tanItd3MtY2hpbGRyZW4tdG9nZ2xlW2FyaWEtZXhwYW5kZWQ9InRydWUiXSB7CiAgICBvcGFjaXR5OiAxOwp9Ci5tanItd3MtY2hpbGRyZW4gewogICAgYm9yZGVyLWxlZnQ6IDJweCBzb2xpZCByZ2JhKDkxLCAxMzgsIDI0MCwgMC4yNSk7CiAgICBtYXJnaW4tbGVmdDogNnB4OwogICAgcGFkZGluZy1sZWZ0OiA2cHg7Cn0KCi5tanItd3Mtd2lkZ2V0LXJvdyB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGZsZXgtc3RhcnQ7CiAgICBnYXA6IDhweDsKfQoubWpyLXdzLXdpZGdldC1yb3ctLWJsb2NrIHsKICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICBnYXA6IDJweDsKfQoubWpyLXdzLXdpZGdldC1yb3ctLWJsb2NrIC5tanItd3Mtd2lkZ2V0LWxhYmVsIHsKICAgIGZsZXg6IG5vbmU7CiAgICBwYWRkaW5nLXRvcDogMDsKfQoubWpyLXdzLXdpZGdldC1yb3ctLWJsb2NrIC5tanItd3Mtd2lkZ2V0LWlucHV0IHsKICAgIHdpZHRoOiAxMDAlOwp9Ci5tanItd3Mtd2lkZ2V0LWxhYmVsIHsKICAgIGZsZXg6IDAgMCA4MHB4OwogICAgZm9udC1zaXplOiAxMXB4OwogICAgY29sb3I6IHZhcigtLWRlc2NyaXAtdGV4dCwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjU1KSk7CiAgICBwYWRkaW5nLXRvcDogNXB4OwogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKfQoubWpyLXdzLXdpZGdldC1pbnB1dCB7CiAgICBmbGV4OiAxOwogICAgbWluLXdpZHRoOiAwOwp9Ci5tanItd3MtaW5wdXQgewogICAgd2lkdGg6IDEwMCU7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1jb21meS1pbnB1dC1iZywgIzIyMik7CiAgICBjb2xvcjogdmFyKC0taW5wdXQtdGV4dCwgI2RkZCk7CiAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1tanItYm9yZGVyLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTIpKTsKICAgIGJvcmRlci1yYWRpdXM6IDRweDsKICAgIHBhZGRpbmc6IDRweCA2cHg7CiAgICBmb250LXNpemU6IDEycHg7CiAgICBmb250LWZhbWlseTogaW5oZXJpdDsKICAgIG91dGxpbmU6IG5vbmU7CiAgICB0cmFuc2l0aW9uOiBib3JkZXItY29sb3IgMTIwbXMgZWFzZTsKfQoubWpyLXdzLWlucHV0OmZvY3VzIHsKICAgIGJvcmRlci1jb2xvcjogdmFyKC0tbWpyLWFjY2VudCwgIzVmYjNmZik7Cn0KLm1qci13cy10ZXh0YXJlYSB7CiAgICByZXNpemU6IG5vbmU7CiAgICBtaW4taGVpZ2h0OiAyOHB4OwogICAgbGluZS1oZWlnaHQ6IDEuNDsKICAgIG92ZXJmbG93LXk6IGhpZGRlbjsKfQoubWpyLXdzLXRleHQtd3JhcHBlciB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgIGdhcDogMnB4OwogICAgZmxleDogMTsKICAgIG1pbi13aWR0aDogMDsKfQoubWpyLXdzLXRleHQtd3JhcHBlciAubWpyLXdzLXRleHRhcmVhIHsKICAgIHdpZHRoOiAxMDAlOwp9Ci5tanItd3MtZXhwYW5kLWJ0biB7CiAgICBhbGlnbi1zZWxmOiBmbGV4LWVuZDsKICAgIGJhY2tncm91bmQ6IG5vbmU7CiAgICBib3JkZXI6IG5vbmU7CiAgICBjb2xvcjogdmFyKC0tbWpyLWFjY2VudCwgIzVmYjNmZik7CiAgICBmb250LXNpemU6IDEwcHg7CiAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICBwYWRkaW5nOiAwIDRweDsKICAgIG9wYWNpdHk6IDAuODsKfQoubWpyLXdzLWV4cGFuZC1idG46aG92ZXIgewogICAgb3BhY2l0eTogMTsKICAgIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOwp9Ci5tanItd3MtcmVhZG9ubHkgewogICAgb3BhY2l0eTogMC41OwogICAgY3Vyc29yOiBkZWZhdWx0Owp9Ci5tanItd3MtY2hlY2tib3ggewogICAgYWNjZW50LWNvbG9yOiB2YXIoLS1tanItYWNjZW50LCAjNWZiM2ZmKTsKICAgIHdpZHRoOiAxNnB4OwogICAgaGVpZ2h0OiAxNnB4OwogICAgbWFyZ2luLXRvcDogNHB4Owp9Ci5tanItd3MtdG9nZ2xlLWxhYmVsIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwp9CgovKiAtLSBMb2NhdGUgYnV0dG9uIGluc2lkZSBub2RlIGhlYWRlciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoubWpyLXdzLWxvY2F0ZSB7CiAgICB3aWR0aDogMjRweCAhaW1wb3J0YW50OwogICAgaGVpZ2h0OiAyNHB4ICFpbXBvcnRhbnQ7CiAgICBib3JkZXI6IG5vbmUgIWltcG9ydGFudDsKICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50ICFpbXBvcnRhbnQ7CiAgICBvcGFjaXR5OiAwLjU7Cn0KLm1qci13cy1sb2NhdGU6aG92ZXIgewogICAgb3BhY2l0eTogMTsKfQoKLyogLS0gUnVuIGJ1dHRvbiBzdGF0ZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLm1qci1tZnYtcnVuLWNvbnRyb2xzIHsKICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogNHB4Owp9Ci5tanItbWZ2LXJ1bi1idG4gLnBpIHsKICAgIGNvbG9yOiB2YXIoLS1tanItc3RhdHVzLXN1Y2Nlc3MsICM0Y2FmNTApOwp9Ci5tanItbWZ2LXJ1bi1idG4ucnVubmluZyAucGkgewogICAgY29sb3I6IHZhcigtLW1qci1tdXRlZCwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjY1KSk7Cn0KLm1qci1tZnYtcnVuLWJ0bi5zdG9wcGluZyAucGkgewogICAgY29sb3I6IHZhcigtLW1qci1zdGF0dXMtd2FybmluZywgI2ZmYTcyNik7Cn0KLm1qci1tZnYtcnVuLWJ0bi5lcnJvciAucGkgewogICAgY29sb3I6ICNmNDQzMzY7Cn0KCi5tanItbWZ2LXN0b3AtYnRuIC5waSB7CiAgICBjb2xvcjogI2VmNTM1MDsKfQoubWpyLW1mdi1zdG9wLWJ0bi5hY3RpdmUgLnBpIHsKICAgIGNvbG9yOiAjZmY4YTY1Owp9Ci5tanItbWZ2LXN0b3AtYnRuLnN0b3BwaW5nIC5waSB7CiAgICBjb2xvcjogdmFyKC0tbWpyLXN0YXR1cy13YXJuaW5nLCAjZmZhNzI2KTsKfQoKLyogLS0gRmxvYXRpbmcgVmlld2VyIHNpbXBsZSB2aWRlbyBwbGF5ZXIgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoubWpyLW1mdi1zaW1wbGUtcGxheWVyIHsKICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgIHdpZHRoOiAxMDAlOwogICAgaGVpZ2h0OiAxMDAlOwogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgIG92ZXJmbG93OiBoaWRkZW47Cn0KCi5tanItbWZ2LXNpbXBsZS1wbGF5ZXIuaXMtYXVkaW8gewogICAgYmFja2dyb3VuZDogcmFkaWFsLWdyYWRpZW50KGNpcmNsZSBhdCAyMCUgMjAlLCByZ2JhKDk1LCAxNzksIDI1NSwgMC4yKSwgcmdiYSgxOCwgMjAsIDI4LCAwLjk1KSk7Cn0KCi5tanItbWZ2LXNpbXBsZS1wbGF5ZXItYXVkaW8tYmFja2Ryb3AgewogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgaW5zZXQ6IDA7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC45KTsKICAgIGZvbnQtc2l6ZTogMTNweDsKICAgIGZvbnQtd2VpZ2h0OiA2MDA7CiAgICBsZXR0ZXItc3BhY2luZzogMC4ycHg7CiAgICB0ZXh0LXNoYWRvdzogMCAycHggMTJweCByZ2JhKDAsIDAsIDAsIDAuNDUpOwogICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICBwYWRkaW5nOiAxOHB4OwogICAgdGV4dC1hbGlnbjogY2VudGVyOwp9CgoubWpyLW1mdi1zaW1wbGUtcGxheWVyLWNvbnRyb2xzIHsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIGxlZnQ6IDEycHg7CiAgICByaWdodDogMTJweDsKICAgIGJvdHRvbTogMTJweDsKICAgIHotaW5kZXg6IDMwOwogICAgZGlzcGxheTogZmxleDsKICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICBnYXA6IDhweDsKICAgIHBhZGRpbmc6IDlweCAxMHB4OwogICAgYm9yZGVyLXJhZGl1czogMTRweDsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xNik7CiAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQodG8gdG9wLCByZ2JhKDEwLCAxMCwgMTQsIDAuNzYpLCByZ2JhKDE2LCAxNiwgMjQsIDAuNTUpKTsKICAgIGJhY2tkcm9wLWZpbHRlcjogYmx1cigxMHB4KTsKICAgIC13ZWJraXQtYmFja2Ryb3AtZmlsdGVyOiBibHVyKDEwcHgpOwogICAgcG9pbnRlci1ldmVudHM6IGF1dG87Cn0KCi5tanItbWZ2LXNpbXBsZS1wbGF5ZXItcm93IHsKICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogOHB4Owp9CgoubWpyLW1mdi1zaW1wbGUtcGxheWVyLXNlZWsgewogICAgLS1tanItc2Vlay1wY3Q6IDAlOwogICAgYXBwZWFyYW5jZTogbm9uZTsKICAgIC13ZWJraXQtYXBwZWFyYW5jZTogbm9uZTsKICAgIHdpZHRoOiAxMDAlOwogICAgaGVpZ2h0OiA2cHg7CiAgICBib3JkZXItcmFkaXVzOiA5OTlweDsKICAgIG91dGxpbmU6IG5vbmU7CiAgICBib3JkZXI6IG5vbmU7CiAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoCiAgICAgICAgdG8gcmlnaHQsCiAgICAgICAgI2ZmMmY1MiAwJSwKICAgICAgICAjZmYyZjUyIHZhcigtLW1qci1zZWVrLXBjdCksCiAgICAgICAgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjI0KSB2YXIoLS1tanItc2Vlay1wY3QpLAogICAgICAgIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4yNCkgMTAwJQogICAgKTsKICAgIGN1cnNvcjogcG9pbnRlcjsKfQoKLm1qci1tZnYtc2ltcGxlLXBsYXllci1zZWVrOjotd2Via2l0LXNsaWRlci10aHVtYiB7CiAgICAtd2Via2l0LWFwcGVhcmFuY2U6IG5vbmU7CiAgICB3aWR0aDogMTJweDsKICAgIGhlaWdodDogMTJweDsKICAgIGJvcmRlci1yYWRpdXM6IDk5OXB4OwogICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjM1KTsKICAgIGJhY2tncm91bmQ6ICNmZjJmNTI7Cn0KCi5tanItbWZ2LXNpbXBsZS1wbGF5ZXItc2Vlazo6LW1vei1yYW5nZS10aHVtYiB7CiAgICB3aWR0aDogMTJweDsKICAgIGhlaWdodDogMTJweDsKICAgIGJvcmRlci1yYWRpdXM6IDk5OXB4OwogICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjM1KTsKICAgIGJhY2tncm91bmQ6ICNmZjJmNTI7Cn0KCi5tanItbWZ2LXNpbXBsZS1wbGF5ZXItYnRuIHsKICAgIHdpZHRoOiAzMHB4OwogICAgaGVpZ2h0OiAzMHB4OwogICAgbWluLXdpZHRoOiAzMHB4OwogICAgYm9yZGVyLXJhZGl1czogOTk5cHg7CiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMjIpOwogICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA4KTsKfQoKLm1qci1tZnYtc2ltcGxlLXBsYXllci1idG4gLnBpIHsKICAgIGZvbnQtc2l6ZTogMTNweDsKICAgIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuOTUpOwp9CgoubWpyLW1mdi1zaW1wbGUtcGxheWVyLWJ0bi5pcy1kaXNhYmxlZCwKLm1qci1tZnYtc2ltcGxlLXBsYXllci1zZWVrLmlzLWRpc2FibGVkIHsKICAgIG9wYWNpdHk6IDAuNDU7CiAgICBjdXJzb3I6IGRlZmF1bHQ7Cn0KCi5tanItbWZ2LXNpbXBsZS1wbGF5ZXItdGltZSB7CiAgICBtYXJnaW4tbGVmdDogYXV0bzsKICAgIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuOTIpOwogICAgZm9udC1zaXplOiAxMXB4OwogICAgbGluZS1oZWlnaHQ6IDE7CiAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgZm9udC12YXJpYW50LW51bWVyaWM6IHRhYnVsYXItbnVtczsKfQoKLm1qci1tZnYtc2ltcGxlLXBsYXllci1mcmFtZSB7CiAgICBtYXJnaW4tcmlnaHQ6IDJweDsKICAgIHBhZGRpbmc6IDNweCA4cHg7CiAgICBib3JkZXItcmFkaXVzOiA5OTlweDsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xNik7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDYpOwogICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC45KTsKICAgIGZvbnQtc2l6ZTogMTFweDsKICAgIGxpbmUtaGVpZ2h0OiAxOwogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgIGZvbnQtdmFyaWFudC1udW1lcmljOiB0YWJ1bGFyLW51bXM7Cn0KCi5tanItbWZ2LXBsYXllci1ob3N0IHsKICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgIHdpZHRoOiAxMDAlOwogICAgaGVpZ2h0OiAxMDAlOwogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICBjb250YWluZXItdHlwZTogaW5saW5lLXNpemU7Cn0KCi5tanItbWZ2LXBsYXllci1ob3N0LS1hdWRpbyB7CiAgICBiYWNrZ3JvdW5kOiByYWRpYWwtZ3JhZGllbnQoY2lyY2xlIGF0IDIwJSAyMCUsIHJnYmEoOTUsIDE3OSwgMjU1LCAwLjIpLCByZ2JhKDE4LCAyMCwgMjgsIDAuOTUpKTsKfQoKLm1qci1tZnYtcGxheWVyLWF1ZGlvLWJhY2tkcm9wIHsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIGluc2V0OiAwOwogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuOSk7CiAgICBmb250LXNpemU6IDEzcHg7CiAgICBmb250LXdlaWdodDogNjAwOwogICAgbGV0dGVyLXNwYWNpbmc6IDAuMnB4OwogICAgdGV4dC1zaGFkb3c6IDAgMnB4IDEycHggcmdiYSgwLCAwLCAwLCAwLjQ1KTsKICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgcGFkZGluZzogMThweDsKICAgIHRleHQtYWxpZ246IGNlbnRlcjsKICAgIG92ZXJmbG93LXdyYXA6IGFueXdoZXJlOwp9CgoubWpyLW1mdi1wbGF5ZXItaG9zdCAubWpyLXZpZGVvLWNvbnRyb2xzIHsKICAgIHotaW5kZXg6IDMwOwp9CgoubWpyLW1mdi1wbGF5ZXItaG9zdCAubWpyLXZpZGVvLWNvbnRyb2xzW2RhdGEtbWpyLWxheW91dD0iY29tcGFjdCJdLAoubWpyLW1mdi1wbGF5ZXItaG9zdCAubWpyLXZpZGVvLWNvbnRyb2xzW2RhdGEtbWpyLWxheW91dD0ic3RhY2tlZCJdIHsKICAgIGxlZnQ6IDhweDsKICAgIHJpZ2h0OiA4cHg7CiAgICBib3R0b206IDhweDsKICAgIHBhZGRpbmc6IDhweDsKICAgIGdhcDogNnB4Owp9CgoubWpyLW1mdi1wbGF5ZXItaG9zdCAubWpyLXZpZGVvLWNvbnRyb2xzW2RhdGEtbWpyLWxheW91dD0iY29tcGFjdCJdIC5tanItdmlkZW8tcm93LS10b3AsCi5tanItbWZ2LXBsYXllci1ob3N0IC5tanItdmlkZW8tY29udHJvbHNbZGF0YS1tanItbGF5b3V0PSJzdGFja2VkIl0gLm1qci12aWRlby1yb3ctLXRvcCB7CiAgICBnYXA6IDhweDsKfQoKLm1qci1tZnYtcGxheWVyLWhvc3QgLm1qci12aWRlby1jb250cm9sc1tkYXRhLW1qci1sYXlvdXQ9ImNvbXBhY3QiXSAubWpyLXZpZGVvLXRpbWVncm91cCwKLm1qci1tZnYtcGxheWVyLWhvc3QgLm1qci12aWRlby1jb250cm9sc1tkYXRhLW1qci1sYXlvdXQ9InN0YWNrZWQiXSAubWpyLXZpZGVvLXRpbWVncm91cCB7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtc3RhcnQ7CiAgICBnYXA6IDZweDsKfQoKLm1qci1tZnYtcGxheWVyLWhvc3QgLm1qci12aWRlby1jb250cm9sc1tkYXRhLW1qci1sYXlvdXQ9ImNvbXBhY3QiXSAubWpyLXZpZGVvLXJvdy0tYm90dG9tLAoubWpyLW1mdi1wbGF5ZXItaG9zdCAubWpyLXZpZGVvLWNvbnRyb2xzW2RhdGEtbWpyLWxheW91dD0ic3RhY2tlZCJdIC5tanItdmlkZW8tcm93LS1ib3R0b20gewogICAgZmxleC13cmFwOiBub3dyYXA7CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgZ2FwOiA2cHg7Cn0KCi5tanItbWZ2LXBsYXllci1ob3N0IC5tanItdmlkZW8tY29udHJvbHNbZGF0YS1tanItbGF5b3V0PSJjb21wYWN0Il0gLm1qci12aWRlby1ib3R0b20sCi5tanItbWZ2LXBsYXllci1ob3N0IC5tanItdmlkZW8tY29udHJvbHNbZGF0YS1tanItbGF5b3V0PSJzdGFja2VkIl0gLm1qci12aWRlby1ib3R0b20gewogICAgZmxleC1zaHJpbms6IDE7CiAgICBmbGV4LXdyYXA6IG5vd3JhcDsKfQoKLm1qci1tZnYtcGxheWVyLWhvc3QgLm1qci12aWRlby1jb250cm9sc1tkYXRhLW1qci1sYXlvdXQ9ImNvbXBhY3QiXSAubWpyLXZpZGVvLXRyYW5zcG9ydCwKLm1qci1tZnYtcGxheWVyLWhvc3QgLm1qci12aWRlby1jb250cm9sc1tkYXRhLW1qci1sYXlvdXQ9InN0YWNrZWQiXSAubWpyLXZpZGVvLXRyYW5zcG9ydCB7CiAgICBmbGV4LXdyYXA6IG5vd3JhcDsKfQoKLm1qci1tZnYtcGxheWVyLWhvc3QgLm1qci12aWRlby1jb250cm9sc1tkYXRhLW1qci1sYXlvdXQ9ImNvbXBhY3QiXSAubWpyLXZpZGVvLWdyb3VwLAoubWpyLW1mdi1wbGF5ZXItaG9zdCAubWpyLXZpZGVvLWNvbnRyb2xzW2RhdGEtbWpyLWxheW91dD0ic3RhY2tlZCJdIC5tanItdmlkZW8tZ3JvdXAgewogICAgZmxleC13cmFwOiBub3dyYXA7Cn0KCi5tanItbWZ2LXBsYXllci1ob3N0IC5tanItdmlkZW8tY29udHJvbHNbZGF0YS1tanItbGF5b3V0PSJjb21wYWN0Il0gLm1qci12aWRlby1zZWVrLXdyYXAsCi5tanItbWZ2LXBsYXllci1ob3N0IC5tanItdmlkZW8tY29udHJvbHNbZGF0YS1tanItbGF5b3V0PSJzdGFja2VkIl0gLm1qci12aWRlby1zZWVrLXdyYXAgewogICAgbWluLXdpZHRoOiAwOwp9CgovKiBUaGUgTUZWIHVzZXMgdGhlICItLXZpZXdlciIgY29udHJvbCB2YXJpYW50LCB3aGljaCAodW5saWtlICItLXZpZXdlcmJhciIpCiAgIGRvZXMgbm90IHNpemUgdGhlIG5hdGl2ZSBzZWVrIGlucHV0IGFuZCBwYWNrcyBmcmFtZS9pbi9zZWVrL291dC90aW1lIGludG8gYQogICBzaW5nbGUgcm93LiBJbiB0aGUgbmFycm93IE1GViB0aGUgc2VlayB3cmFwIHRoZW4gY29sbGFwc2VzIHRvIH4wcHggd2lkZSBhbmQKICAgdGhlIG5hdGl2ZSBpbnB1dCB0byAwcHggdGFsbCwgbGVhdmluZyBhbG1vc3Qgbm8gY2xpY2sgLyBkcmFnIHRhcmdldCBmb3IKICAgc2NydWJiaW5nLiBHaXZlIHRoZSBzZWVrIGl0cyBvd24gZnVsbC13aWR0aCByb3cgd2l0aCBhIHVzYWJsZSBoaXQgYXJlYS4gKi8KLm1qci1tZnYtcGxheWVyLWhvc3QgLm1qci12aWRlby1jb250cm9scy0tdmlld2VyIC5tanItdmlkZW8tcm93LS10b3AgewogICAgZGlzcGxheTogZmxleDsKICAgIGZsZXgtd3JhcDogd3JhcDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICByb3ctZ2FwOiA0MnB4Owp9CgoubWpyLW1mdi1wbGF5ZXItaG9zdCAubWpyLXZpZGVvLWNvbnRyb2xzLS12aWV3ZXIgLm1qci12aWRlby1yb3ctLXRvcCAubWpyLXZpZGVvLXNlZWstd3JhcCB7CiAgICBvcmRlcjogMTA7CiAgICBmbGV4OiAxIDEgMTAwJTsKICAgIHdpZHRoOiAxMDAlOwogICAgbWluLXdpZHRoOiAwOwogICAgbWluLWhlaWdodDogNDJweDsKICAgIHBhZGRpbmctdG9wOiA2cHg7Cn0KCi5tanItbWZ2LXBsYXllci1ob3N0IC5tanItdmlkZW8tY29udHJvbHMtLXZpZXdlciAubWpyLXZpZGVvLXJhbmdlLS1zZWVrIHsKICAgIGhlaWdodDogMjBweDsKICAgIGFjY2VudC1jb2xvcjogcmdiYSgyMTQsIDIxOCwgMjI0LCAwLjkyKTsKfQoKLm1qci1tZnYtcGxheWVyLWhvc3QgLm1qci12aWRlby1jb250cm9scy0tdmlld2VyIC5tanItdmlkZW8tc2Vlay16b25lcyB7CiAgICBoZWlnaHQ6IDEwcHg7Cn0KCi5tanItbWZ2LXBsYXllci1ob3N0IC5tanItdmlkZW8tY29udHJvbHMtLXZpZXdlciAubWpyLXZpZGVvLXNlZWstaGFuZGxlIHsKICAgIHdpZHRoOiAxNnB4OwogICAgaGVpZ2h0OiAyOHB4OwogICAgdG9wOiAyMHB4Owp9CgoubWpyLW1mdi1wbGF5ZXItaG9zdCAubWpyLXZpZGVvLWNvbnRyb2xzW2RhdGEtbWpyLWxheW91dD0iY29tcGFjdCJdIC5tanItdmlkZW8tYmFyLXRpbWVsaW5lLAoubWpyLW1mdi1wbGF5ZXItaG9zdCAubWpyLXZpZGVvLWNvbnRyb2xzW2RhdGEtbWpyLWxheW91dD0ic3RhY2tlZCJdIC5tanItdmlkZW8tYmFyLXRpbWVsaW5lIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBmbGV4LXdyYXA6IHdyYXA7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwp9CgoubWpyLW1mdi1wbGF5ZXItaG9zdAogICAgLm1qci12aWRlby1jb250cm9sc1tkYXRhLW1qci1sYXlvdXQ9ImNvbXBhY3QiXQogICAgLm1qci12aWRlby1iYXItdGltZWxpbmUKICAgIC5tanItdmlkZW8tc2Vlay13cmFwLAoubWpyLW1mdi1wbGF5ZXItaG9zdAogICAgLm1qci12aWRlby1jb250cm9sc1tkYXRhLW1qci1sYXlvdXQ9InN0YWNrZWQiXQogICAgLm1qci12aWRlby1iYXItdGltZWxpbmUKICAgIC5tanItdmlkZW8tc2Vlay13cmFwIHsKICAgIG9yZGVyOiAtMTsKICAgIGZsZXg6IDEgMSAxMDAlOwogICAgd2lkdGg6IDEwMCU7Cn0KCi5tanItbWZ2LXBsYXllci1ob3N0CiAgICAubWpyLXZpZGVvLWNvbnRyb2xzW2RhdGEtbWpyLWxheW91dD0iY29tcGFjdCJdCiAgICAubWpyLXZpZGVvLWJhci10aW1lbGluZQogICAgLm1qci12aWRlby1ncm91cC0taW4sCi5tanItbWZ2LXBsYXllci1ob3N0CiAgICAubWpyLXZpZGVvLWNvbnRyb2xzW2RhdGEtbWpyLWxheW91dD0iY29tcGFjdCJdCiAgICAubWpyLXZpZGVvLWJhci10aW1lbGluZQogICAgLm1qci12aWRlby1ncm91cC0tb3V0LAoubWpyLW1mdi1wbGF5ZXItaG9zdAogICAgLm1qci12aWRlby1jb250cm9sc1tkYXRhLW1qci1sYXlvdXQ9InN0YWNrZWQiXQogICAgLm1qci12aWRlby1iYXItdGltZWxpbmUKICAgIC5tanItdmlkZW8tZ3JvdXAtLWluLAoubWpyLW1mdi1wbGF5ZXItaG9zdAogICAgLm1qci12aWRlby1jb250cm9sc1tkYXRhLW1qci1sYXlvdXQ9InN0YWNrZWQiXQogICAgLm1qci12aWRlby1iYXItdGltZWxpbmUKICAgIC5tanItdmlkZW8tZ3JvdXAtLW91dCB7CiAgICBmbGV4OiAwIDEgYXV0bzsKfQoKLm1qci1tZnYtcGxheWVyLWhvc3QgLm1qci12aWRlby1jb250cm9sc1tkYXRhLW1qci1sYXlvdXQ9ImNvbXBhY3QiXSAubWpyLXZpZGVvLXJhbmdlLWNvdW50LAoubWpyLW1mdi1wbGF5ZXItaG9zdCAubWpyLXZpZGVvLWNvbnRyb2xzW2RhdGEtbWpyLWxheW91dD0iY29tcGFjdCJdIC5tanItdmlkZW8tZnJhbWUgewogICAgbWluLXdpZHRoOiBhdXRvOwp9CgoubWpyLW1mdi1wbGF5ZXItaG9zdCAubWpyLXZpZGVvLWNvbnRyb2xzW2RhdGEtbWpyLWxheW91dD0ic3RhY2tlZCJdIC5tanItdmlkZW8tcmFuZ2UtY291bnQgewogICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50Owp9CgoubWpyLW1mdi1wbGF5ZXItaG9zdCAubWpyLXZpZGVvLWNvbnRyb2xzW2RhdGEtbWpyLWxheW91dD0ic3RhY2tlZCJdIC5tanItdmlkZW8tZnJhbWUgewogICAgbWluLXdpZHRoOiBhdXRvOwogICAgcGFkZGluZzogM3B4IDZweDsKfQoKLm1qci1tZnYtcGxheWVyLWhvc3QgLm1qci12aWRlby1jb250cm9sc1tkYXRhLW1qci1sYXlvdXQ9InN0YWNrZWQiXSAubWpyLXZpZGVvLWJ0bi0taW4sCi5tanItbWZ2LXBsYXllci1ob3N0IC5tanItdmlkZW8tY29udHJvbHNbZGF0YS1tanItbGF5b3V0PSJzdGFja2VkIl0gLm1qci12aWRlby1idG4tLW91dCwKLm1qci1tZnYtcGxheWVyLWhvc3QgLm1qci12aWRlby1jb250cm9sc1tkYXRhLW1qci1sYXlvdXQ9InN0YWNrZWQiXSAubWpyLXZpZGVvLWJ0bi0tbWFyayB7CiAgICBtaW4td2lkdGg6IDMycHg7Cn0KCkBjb250YWluZXIgKG1heC13aWR0aDogOTAwcHgpIHsKICAgIC5tanItbWZ2LXBsYXllci1ob3N0IC5tanItdmlkZW8tY29udHJvbHMgewogICAgICAgIGxlZnQ6IDhweDsKICAgICAgICByaWdodDogOHB4OwogICAgICAgIGJvdHRvbTogOHB4OwogICAgICAgIHBhZGRpbmc6IDhweDsKICAgICAgICBnYXA6IDZweDsKICAgIH0KCiAgICAubWpyLW1mdi1wbGF5ZXItaG9zdCAubWpyLXZpZGVvLXJvdy0tdG9wIHsKICAgICAgICBnYXA6IDhweDsKICAgIH0KCiAgICAubWpyLW1mdi1wbGF5ZXItaG9zdCAubWpyLXZpZGVvLXRpbWVncm91cCB7CiAgICAgICAganVzdGlmeS1jb250ZW50OiBmbGV4LXN0YXJ0OwogICAgICAgIGdhcDogNnB4OwogICAgfQoKICAgIC5tanItbWZ2LXBsYXllci1ob3N0IC5tanItdmlkZW8tcm93LS1ib3R0b20gewogICAgICAgIGZsZXgtd3JhcDogbm93cmFwOwogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgICAgZ2FwOiA2cHg7CiAgICB9CgogICAgLm1qci1tZnYtcGxheWVyLWhvc3QgLm1qci12aWRlby1ib3R0b20gewogICAgICAgIGZsZXgtc2hyaW5rOiAxOwogICAgICAgIGZsZXgtd3JhcDogbm93cmFwOwogICAgfQoKICAgIC5tanItbWZ2LXBsYXllci1ob3N0IC5tanItdmlkZW8tdHJhbnNwb3J0IHsKICAgICAgICBmbGV4LXdyYXA6IG5vd3JhcDsKICAgIH0KCiAgICAubWpyLW1mdi1wbGF5ZXItaG9zdCAubWpyLXZpZGVvLWdyb3VwIHsKICAgICAgICBmbGV4LXdyYXA6IG5vd3JhcDsKICAgIH0KCiAgICAubWpyLW1mdi1wbGF5ZXItaG9zdCAubWpyLXZpZGVvLXNlZWstd3JhcCB7CiAgICAgICAgbWluLXdpZHRoOiAwOwogICAgfQoKICAgIC5tanItbWZ2LXBsYXllci1ob3N0IC5tanItdmlkZW8tY29udHJvbHMtLXZpZXdlcmJhciAubWpyLXZpZGVvLWJhci10aW1lbGluZSB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmbGV4LXdyYXA6IHdyYXA7CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIH0KCiAgICAubWpyLW1mdi1wbGF5ZXItaG9zdAogICAgICAgIC5tanItdmlkZW8tY29udHJvbHMtLXZpZXdlcmJhcgogICAgICAgIC5tanItdmlkZW8tYmFyLXRpbWVsaW5lCiAgICAgICAgLm1qci12aWRlby1zZWVrLXdyYXAgewogICAgICAgIG9yZGVyOiAtMTsKICAgICAgICBmbGV4OiAxIDEgMTAwJTsKICAgICAgICB3aWR0aDogMTAwJTsKICAgIH0KfQoKQGNvbnRhaW5lciAobWF4LXdpZHRoOiA2ODBweCkgewogICAgLm1qci1tZnYtcGxheWVyLWhvc3QgLm1qci12aWRlby1jb250cm9scyB7CiAgICAgICAgcGFkZGluZzogNnB4OwogICAgfQoKICAgIC5tanItbWZ2LXBsYXllci1ob3N0IC5tanItdmlkZW8tYnRuIHsKICAgICAgICBwYWRkaW5nOiA1cHggOHB4OwogICAgICAgIGZvbnQtc2l6ZTogMTJweDsKICAgIH0KCiAgICAubWpyLW1mdi1wbGF5ZXItaG9zdCAubWpyLXZpZGVvLW51bSB7CiAgICAgICAgcGFkZGluZzogNHB4IDZweDsKICAgICAgICBmb250LXNpemU6IDExcHg7CiAgICB9CgogICAgLm1qci1tZnYtcGxheWVyLWhvc3QgLm1qci12aWRlby10aW1lLAogICAgLm1qci1tZnYtcGxheWVyLWhvc3QgLm1qci12aWRlby1mcmFtZSwKICAgIC5tanItbWZ2LXBsYXllci1ob3N0IC5tanItdmlkZW8tcmFuZ2UtY291bnQgewogICAgICAgIGZvbnQtc2l6ZTogMTFweDsKICAgIH0KfQoKLyogLS0gU2V0dGluZ3MgYnV0dG9uIGFjdGl2ZSBzdGF0ZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLm1qci1tZnYtc2V0dGluZ3MtYnRuLmFjdGl2ZSB7CiAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peCgKICAgICAgICBpbiBzcmdiLAogICAgICAgIHZhcigtLW1qci1hY2NlbnQsICM1ZmIzZmYpIDU1JSwKICAgICAgICB2YXIoLS1tanItYm9yZGVyLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTIpKQogICAgKTsKICAgIGJhY2tncm91bmQtY29sb3I6IGNvbG9yLW1peCgKICAgICAgICBpbiBzcmdiLAogICAgICAgIHZhcigtLW1qci1zdXJmYWNlLTIsICMzMzMpIDcwJSwKICAgICAgICB2YXIoLS1tanItYWNjZW50LCAjNWZiM2ZmKSAxOCUKICAgICk7Cn0KLm1qci1tZnYtc2V0dGluZ3MtYnRuLmFjdGl2ZSAucGkgewogICAgY29sb3I6IHZhcigtLW1qci1hY2NlbnQsICM1ZmIzZmYpOwp9CgovKiAtLSBDbG9zZSBidXR0b24gKHJlZCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi5tanItbWZ2IC5tanItbWZ2LWNsb3NlLWJ0biB7CiAgICBjb2xvcjogI2U4NTA1MDsKfQoubWpyLW1mdiAubWpyLW1mdi1jbG9zZS1idG46aG92ZXIgewogICAgY29sb3I6ICNmZjZiNmI7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDIzMiwgODAsIDgwLCAwLjE1KTsKfQoKLyogLS0gRW1wdHkgc3RhdGUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoubWpyLW1mdi1lbXB0eSB7CiAgICB3aWR0aDogMTAwJTsKICAgIGhlaWdodDogMTAwJTsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjI1KTsKICAgIGZvbnQtc2l6ZTogMTFweDsKICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgcGFkZGluZzogMTJweDsKfQoKLyogLS0gQ29tcGFyZSBsYWJlbHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoubWpyLW1mdi1sYWJlbCB7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICB0b3A6IDhweDsKICAgIGJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgMC41OCk7CiAgICBjb2xvcjogI2ZmZjsKICAgIGZvbnQtc2l6ZTogMTBweDsKICAgIGZvbnQtd2VpZ2h0OiA3MDA7CiAgICBwYWRkaW5nOiAycHggN3B4OwogICAgYm9yZGVyLXJhZGl1czogNHB4OwogICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICB6LWluZGV4OiAyMDsKICAgIGxldHRlci1zcGFjaW5nOiAwLjRweDsKfQoKLm1qci1tZnYtbGFiZWwubGFiZWwtbGVmdCB7CiAgICBsZWZ0OiA4cHg7Cn0KLm1qci1tZnYtbGFiZWwubGFiZWwtcmlnaHQgewogICAgcmlnaHQ6IDhweDsKfQoKLyogLS0gQUIgZGl2aWRlciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoubWpyLW1mdi1hYi1kaXZpZGVyIHsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIHRvcDogMDsKICAgIGJvdHRvbTogMDsKICAgIHdpZHRoOiAwLjVweDsKICAgIGN1cnNvcjogY29sLXJlc2l6ZTsKICAgIHotaW5kZXg6IDEwOwogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKC01MCUpOwogICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjg4KTsKICAgIGJveC1zaGFkb3c6CiAgICAgICAgMCAwIDAgMC41cHggcmdiYSgwLCAwLCAwLCAwLjQpLAogICAgICAgIDAgMnB4IDhweCByZ2JhKDAsIDAsIDAsIDAuNCk7CiAgICB0cmFuc2l0aW9uOiBiYWNrZ3JvdW5kIDEwMG1zIGVhc2U7Cn0KCi5tanItbWZ2LWFiLWRpdmlkZXI6OmJlZm9yZSB7CiAgICBjb250ZW50OiAiIjsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIHRvcDogMDsKICAgIGJvdHRvbTogMDsKICAgIGxlZnQ6IDUwJTsKICAgIHdpZHRoOiAxMnB4OwogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKC01MCUpOwp9CgoubWpyLW1mdi1hYi1kaXZpZGVyOmhvdmVyLAoubWpyLW1mdi1hYi1kaXZpZGVyOmFjdGl2ZSB7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1tanItYWNjZW50LCAjNWZiM2ZmKTsKfQoKLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgTUZWIEdlb21ldHJ5ICYgTGF5b3V0IENsYXNzZXMgKHJlcGxhY2VzIGlubGluZSBzdHlsZXMgaW4gRmxvYXRpbmdWaWV3ZXIuanMpCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgovKiBNYWluIE1GViBjb250YWluZXIgZ2VvbWV0cnkgKi8KLm1qci1tZnYgewogICAgcG9zaXRpb246IGZpeGVkOwogICAgdG9wOiB2YXIoLS1tanItbWZ2LXRvcC1vZmZzZXQsIDYwcHgpOwogICAgcmlnaHQ6IDIwcHg7CiAgICB3aWR0aDogNjQwcHg7CiAgICBoZWlnaHQ6IDM2MHB4OwogICAgbWluLXdpZHRoOiAyMjBweDsKICAgIG1pbi1oZWlnaHQ6IDE2MHB4OwogICAgLyogQWx3YXlzIGZsZXg7IHZpc2liaWxpdHkgKyBvcGFjaXR5IGNvbnRyb2wgc2hvdy9oaWRlIHNvIENTUyB0cmFuc2l0aW9ucyB3b3JrLgogICAgICAgcG9pbnRlci1ldmVudHM6bm9uZSB3aGlsZSBoaWRkZW4gcHJldmVudHMgYWNjaWRlbnRhbCBpbnRlcmFjdGlvbi4gKi8KICAgIGRpc3BsYXk6IGZsZXg7CiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgcmVzaXplOiBib3RoOwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIHotaW5kZXg6IDEwMDAwOwogICAgLyogSGlkZGVuIHN0YXRlICovCiAgICBvcGFjaXR5OiAwOwogICAgdmlzaWJpbGl0eTogaGlkZGVuOwogICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTZweCkgc2NhbGUoMC45OCk7CiAgICB0cmFuc2Zvcm0tb3JpZ2luOiB0b3AgcmlnaHQ7CiAgICB0cmFuc2l0aW9uOgogICAgICAgIG9wYWNpdHkgMC4xOHMgZWFzZS1vdXQsCiAgICAgICAgdHJhbnNmb3JtIDAuMThzIGVhc2Utb3V0LAogICAgICAgIHZpc2liaWxpdHkgMHMgbGluZWFyIDAuMThzOwp9CgoubWpyLW1mdi5tanItbWZ2LS1yZXNpemluZyB7CiAgICB1c2VyLXNlbGVjdDogbm9uZTsKfQoKLm1qci1tZnYuaXMtdmlzaWJsZSB7CiAgICBvcGFjaXR5OiAxOwogICAgdmlzaWJpbGl0eTogdmlzaWJsZTsKICAgIHBvaW50ZXItZXZlbnRzOiBhdXRvOwogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDApIHNjYWxlKDEpOwogICAgdHJhbnNpdGlvbjoKICAgICAgICBvcGFjaXR5IDAuMThzIGVhc2Utb3V0LAogICAgICAgIHRyYW5zZm9ybSAwLjE4cyBlYXNlLW91dCwKICAgICAgICB2aXNpYmlsaXR5IDBzIGxpbmVhciAwczsKfQoKLyogTWVkaWEgZWxlbWVudHMgKGltZy92aWRlbykgc2l6aW5nIHZhcmlhbnRzICovCi5tanItbWZ2LW1lZGlhIHsKICAgIGRpc3BsYXk6IGJsb2NrOwogICAgd2lkdGg6IDEwMCU7CiAgICBoZWlnaHQ6IDEwMCU7CiAgICBtYXgtd2lkdGg6IDEwMCU7CiAgICBtYXgtaGVpZ2h0OiAxMDAlOwogICAgb2JqZWN0LWZpdDogY29udGFpbjsKICAgIG9iamVjdC1wb3NpdGlvbjogY2VudGVyOwp9CgoubWpyLW1mdi1tZWRpYS0tZml0LWhlaWdodCB7CiAgICB3aWR0aDogMTAwJTsKICAgIGhlaWdodDogMTAwJTsKICAgIG1heC13aWR0aDogMTAwJTsKICAgIG1heC1oZWlnaHQ6IDEwMCU7CiAgICBvYmplY3QtZml0OiBjb250YWluOwogICAgb2JqZWN0LXBvc2l0aW9uOiBjZW50ZXI7Cn0KCi5tanItbWZ2LW1lZGlhLS1maWxsIHsKICAgIHdpZHRoOiAxMDAlOwogICAgaGVpZ2h0OiAxMDAlOwogICAgbWF4LXdpZHRoOiAxMDAlOwogICAgbWF4LWhlaWdodDogMTAwJTsKICAgIG9iamVjdC1maXQ6IGNvbnRhaW47CiAgICBvYmplY3QtcG9zaXRpb246IGNlbnRlcjsKICAgIGRpc3BsYXk6IGJsb2NrOwp9CgovKiBBdWRpbyBjYXJkIGluc2lkZSBNRlYgKi8KLm1qci1tZnYtYXVkaW8tY2FyZCB7CiAgICB3aWR0aDogbWluKDkyJSwgNTYwcHgpOwogICAgbWF4LXdpZHRoOiAxMDAlOwogICAgZGlzcGxheTogZmxleDsKICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICBnYXA6IDEwcHg7CiAgICBwYWRkaW5nOiAxMnB4OwogICAgYm9yZGVyLXJhZGl1czogMTBweDsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xOCk7CiAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoMTYwZGVnLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDYpLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDIpKTsKICAgIGJveC1zaGFkb3c6IDAgNnB4IDE2cHggcmdiYSgwLCAwLCAwLCAwLjM1KTsKfQoKLm1qci1tZnYtYXVkaW8taGVhZCB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogOHB4OwogICAgbWluLXdpZHRoOiAwOwp9CgoubWpyLW1mdi1hdWRpby1pY29uIHsKICAgIGNvbG9yOiB2YXIoLS1tanItYmFkZ2UtYXVkaW8sICNmZjk4MDApOwogICAgb3BhY2l0eTogMC45NTsKfQoKLm1qci1tZnYtYXVkaW8tdGl0bGUgewogICAgbWluLXdpZHRoOiAwOwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgIGZvbnQtc2l6ZTogMTJweDsKICAgIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuOSk7Cn0KCi5tanItbWZ2LWF1ZGlvLXBsYXllciB7CiAgICB3aWR0aDogMTAwJTsKfQoKLm1qci1tZnYtc2lkZS1wYW5lbCAubWpyLW1mdi1hdWRpby1jYXJkLAoubWpyLW1mdi1hYi1sYXllciAubWpyLW1mdi1hdWRpby1jYXJkLAoubWpyLW1mdi1ncmlkLWNlbGwgLm1qci1tZnYtYXVkaW8tY2FyZCB7CiAgICB3aWR0aDogY2FsYygxMDAlIC0gMjBweCk7Cn0KCi8qIFZpZGVvIGVsZW1lbnQgc3BlY2lmaWMgc3R5bGVzICovCi5tanItbWZ2LW1lZGlhLXZpZGVvIHsKICAgIC8qIEluaGVyaXRzIGZyb20gLm1qci1tZnYtbWVkaWEgb3IgLm1qci1tZnYtbWVkaWEtLWZpbGwgKi8KfQoKLyogTm9kZSBTdHJlYW0gLSBjdXJyZW50bHktc3RyZWFtZWQgbm9kZSBiYWRnZSAodG9wLWxlZnQgb2YgY29udGVudCBhcmVhLAogICBmb2xsb3dpbmcgdGhlIHNhbWUgb3ZlcmxheSBwYXR0ZXJuIGFzIC5tanItbWZ2LWdlbmluZm8pLiAqLwoubWpyLW1mdi1ub2RlLW92ZXJsYXkgewogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgdG9wOiA4cHg7CiAgICBsZWZ0OiA4cHg7CiAgICB6LWluZGV4OiAxMjsKICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgcGFkZGluZzogNHB4IDhweDsKICAgIGJvcmRlci1yYWRpdXM6IDZweDsKICAgIGZvbnQtc2l6ZTogMTFweDsKICAgIGZvbnQtd2VpZ2h0OiA2MDA7CiAgICBsaW5lLWhlaWdodDogMS4zOwogICAgY29sb3I6ICNlNmYzZmY7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIDAuNjUpOwogICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgxMjAsIDE3MCwgMjQwLCAwLjQ1KTsKICAgIGJveC1zaGFkb3c6IDAgMnB4IDhweCByZ2JhKDAsIDAsIDAsIDAuNCk7CiAgICBiYWNrZHJvcC1maWx0ZXI6IGJsdXIoNnB4KTsKICAgIC13ZWJraXQtYmFja2Ryb3AtZmlsdGVyOiBibHVyKDZweCk7CiAgICBtYXgtd2lkdGg6IGNhbGMoMTAwJSAtIDE2cHgpOwogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKfQovKiBHZW4gaW5mbyBvdmVybGF5IC0gYWxsIG1vZGVzIHNoYXJlIGJhc2UgbGF5b3V0ICovCi5tanItbWZ2LWdlbmluZm8sCi5tanItbWZ2LWdlbmluZm8tYSwKLm1qci1tZnYtZ2VuaW5mby1iIHsKICAgIGRpc3BsYXk6IG5vbmU7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICBsZWZ0OiA4cHg7CiAgICByaWdodDogOHB4OwogICAgYm90dG9tOiA4cHg7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIDAuNjUpOwogICAgY29sb3I6ICNmZmY7CiAgICBwYWRkaW5nOiA4cHggMTBweDsKICAgIGJvcmRlci1yYWRpdXM6IDZweDsKICAgIGZvbnQtc2l6ZTogMTFweDsKICAgIG1heC1oZWlnaHQ6IDQwJTsKICAgIG92ZXJmbG93LXk6IGF1dG87CiAgICBvdmVyZmxvdy14OiBoaWRkZW47CiAgICBvdmVyc2Nyb2xsLWJlaGF2aW9yLXk6IGNvbnRhaW47CiAgICAtd2Via2l0LW92ZXJmbG93LXNjcm9sbGluZzogdG91Y2g7CiAgICB0b3VjaC1hY3Rpb246IHBhbi15OwogICAgd29yZC1icmVhazogYnJlYWstd29yZDsKICAgIGJhY2tkcm9wLWZpbHRlcjogYmx1cig2cHgpOwogICAgLXdlYmtpdC1iYWNrZHJvcC1maWx0ZXI6IGJsdXIoNnB4KTsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xMik7CiAgICBib3gtc2hhZG93OiAwIDJweCA4cHggcmdiYSgwLCAwLCAwLCAwLjQpOwp9CgovKiBLZWVwIEdlbiBJbmZvIGFib3ZlIGN1c3RvbSBzaW1wbGUtcGxheWVyIGNvbnRyb2xzIHdoZW4gcHJlc2VudC4gKi8KLm1qci1tZnYtZ2VuaW5mby5tanItbWZ2LWdlbmluZm8tLWFib3ZlLXBsYXllciwKLm1qci1tZnYtZ2VuaW5mby1hLm1qci1tZnYtZ2VuaW5mby0tYWJvdmUtcGxheWVyLAoubWpyLW1mdi1nZW5pbmZvLWIubWpyLW1mdi1nZW5pbmZvLS1hYm92ZS1wbGF5ZXIgewogICAgdG9wOiA4cHg7CiAgICBib3R0b206IGF1dG87CiAgICBtYXgtaGVpZ2h0OiBtaW4oNDUlLCBjYWxjKDEwMCUgLSAxMjRweCkpOwp9CgovKiBGYWxsYmFjazogd2hlbiBzaW1wbGUtcGxheWVyIGlzIGltbWVkaWF0ZWx5IGZvbGxvd2VkIGJ5IGEgZ2VuaW5mbyBvdmVybGF5LAogICBtb3ZlIGl0IHVwIGV2ZW4gaWYgdGhlIG1vZGlmaWVyIGNsYXNzIHdhcyBub3QgYXR0YWNoZWQuICovCi5tanItbWZ2LXNpbXBsZS1wbGF5ZXIgKyAubWpyLW1mdi1nZW5pbmZvLAoubWpyLW1mdi1zaW1wbGUtcGxheWVyICsgLm1qci1tZnYtZ2VuaW5mby1hLAoubWpyLW1mdi1zaW1wbGUtcGxheWVyICsgLm1qci1tZnYtZ2VuaW5mby1iIHsKICAgIHRvcDogOHB4OwogICAgYm90dG9tOiBhdXRvOwogICAgbWF4LWhlaWdodDogbWluKDQ1JSwgY2FsYygxMDAlIC0gMTI0cHgpKTsKfQoKLyogQUIgbW9kZSBvdmVybGF5cyBhcmUgYXR0YWNoZWQgYXQgY29udGFpbmVyIGxldmVsOyBzaGlmdCB0aGVtIHdoZW4gQUIgbGF5ZXJzIHVzZSBzaW1wbGUtcGxheWVyLiAqLwoubWpyLW1mdi1hYi1jb250YWluZXI6aGFzKC5tanItbWZ2LWFiLWxheWVyIC5tanItbWZ2LXNpbXBsZS1wbGF5ZXIpIC5tanItbWZ2LWdlbmluZm8tYSwKLm1qci1tZnYtYWItY29udGFpbmVyOmhhcygubWpyLW1mdi1hYi1sYXllciAubWpyLW1mdi1zaW1wbGUtcGxheWVyKSAubWpyLW1mdi1nZW5pbmZvLWIgewogICAgdG9wOiA4cHg7CiAgICBib3R0b206IGF1dG87CiAgICBtYXgtaGVpZ2h0OiBtaW4oNDUlLCBjYWxjKDEwMCUgLSAxMjRweCkpOwp9CgovKiBTaGFyZWQgc3R5bGUgZm9yIGFsbCBnZW4gaW5mbyBvdmVybGF5IHZhcmlhbnRzICovCi5tanItbWZ2LWdlbmluZm8gc3Ryb25nLAoubWpyLW1mdi1nZW5pbmZvLWEgc3Ryb25nLAoubWpyLW1mdi1nZW5pbmZvLWIgc3Ryb25nIHsKICAgIGZvbnQtd2VpZ2h0OiA2MDA7CiAgICBtYXJnaW4tcmlnaHQ6IDRweDsKICAgIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuOTUpOyAvKiBkZWZhdWx0IC0gb3ZlcnJpZGRlbiBwZXIgZmllbGQgYmVsb3cgKi8KfQoKLyogUGVyLWZpZWxkIGxhYmVsIGNvbG9ycyAqLwoubWpyLW1mdi1nZW5pbmZvIFtkYXRhLWZpZWxkPSJwcm9tcHQiXSBzdHJvbmcsCi5tanItbWZ2LWdlbmluZm8tYSBbZGF0YS1maWVsZD0icHJvbXB0Il0gc3Ryb25nLAoubWpyLW1mdi1nZW5pbmZvLWIgW2RhdGEtZmllbGQ9InByb21wdCJdIHN0cm9uZyB7CiAgICBjb2xvcjogIzdlYzhmZjsKfSAvKiBibHVlICAgLSBQcm9tcHQgKi8KCi5tanItbWZ2LWdlbmluZm8gW2RhdGEtZmllbGQ9InNlZWQiXSBzdHJvbmcsCi5tanItbWZ2LWdlbmluZm8tYSBbZGF0YS1maWVsZD0ic2VlZCJdIHN0cm9uZywKLm1qci1tZnYtZ2VuaW5mby1iIFtkYXRhLWZpZWxkPSJzZWVkIl0gc3Ryb25nIHsKICAgIGNvbG9yOiAjZmZkNDdhOwp9IC8qIGFtYmVyICAtIFNlZWQgICAqLwoKLm1qci1tZnYtZ2VuaW5mbyBbZGF0YS1maWVsZD0ibW9kZWwiXSBzdHJvbmcsCi5tanItbWZ2LWdlbmluZm8tYSBbZGF0YS1maWVsZD0ibW9kZWwiXSBzdHJvbmcsCi5tanItbWZ2LWdlbmluZm8tYiBbZGF0YS1maWVsZD0ibW9kZWwiXSBzdHJvbmcgewogICAgY29sb3I6ICM3ZGRhOGE7Cn0gLyogZ3JlZW4gIC0gTW9kZWwgICovCgoubWpyLW1mdi1nZW5pbmZvIFtkYXRhLWZpZWxkPSJsb3JhIl0gc3Ryb25nLAoubWpyLW1mdi1nZW5pbmZvLWEgW2RhdGEtZmllbGQ9ImxvcmEiXSBzdHJvbmcsCi5tanItbWZ2LWdlbmluZm8tYiBbZGF0YS1maWVsZD0ibG9yYSJdIHN0cm9uZyB7CiAgICBjb2xvcjogI2Q0OGNmZjsKfSAvKiB2aW9sZXQgLSBMb1JBICAgKi8KCi5tanItbWZ2LWdlbmluZm8gW2RhdGEtZmllbGQ9InNhbXBsZXIiXSBzdHJvbmcsCi5tanItbWZ2LWdlbmluZm8tYSBbZGF0YS1maWVsZD0ic2FtcGxlciJdIHN0cm9uZywKLm1qci1tZnYtZ2VuaW5mby1iIFtkYXRhLWZpZWxkPSJzYW1wbGVyIl0gc3Ryb25nIHsKICAgIGNvbG9yOiAjZmY5ZjdhOwp9IC8qIG9yYW5nZSAtIFNhbXBsZXIgKi8KCi5tanItbWZ2LWdlbmluZm8gW2RhdGEtZmllbGQ9InNjaGVkdWxlciJdIHN0cm9uZywKLm1qci1tZnYtZ2VuaW5mby1hIFtkYXRhLWZpZWxkPSJzY2hlZHVsZXIiXSBzdHJvbmcsCi5tanItbWZ2LWdlbmluZm8tYiBbZGF0YS1maWVsZD0ic2NoZWR1bGVyIl0gc3Ryb25nIHsKICAgIGNvbG9yOiAjZmY3YTlmOwp9IC8qIHBpbmsgICAtIFNjaGVkdWxlciAqLwoKLm1qci1tZnYtZ2VuaW5mbyBbZGF0YS1maWVsZD0iY2ZnIl0gc3Ryb25nLAoubWpyLW1mdi1nZW5pbmZvLWEgW2RhdGEtZmllbGQ9ImNmZyJdIHN0cm9uZywKLm1qci1tZnYtZ2VuaW5mby1iIFtkYXRhLWZpZWxkPSJjZmciXSBzdHJvbmcgewogICAgY29sb3I6ICM3YTlmZmY7Cn0gLyogaW5kaWdvIC0gQ0ZHICovCgoubWpyLW1mdi1nZW5pbmZvIFtkYXRhLWZpZWxkPSJzdGVwIl0gc3Ryb25nLAoubWpyLW1mdi1nZW5pbmZvLWEgW2RhdGEtZmllbGQ9InN0ZXAiXSBzdHJvbmcsCi5tanItbWZ2LWdlbmluZm8tYiBbZGF0YS1maWVsZD0ic3RlcCJdIHN0cm9uZyB7CiAgICBjb2xvcjogIzdhZmZkNDsKfSAvKiB0ZWFsICAgLSBTdGVwICovCgoubWpyLW1mdi1nZW5pbmZvIFtkYXRhLWZpZWxkPSJnZW5UaW1lIl0gc3Ryb25nLAoubWpyLW1mdi1nZW5pbmZvLWEgW2RhdGEtZmllbGQ9ImdlblRpbWUiXSBzdHJvbmcsCi5tanItbWZ2LWdlbmluZm8tYiBbZGF0YS1maWVsZD0iZ2VuVGltZSJdIHN0cm9uZyB7CiAgICBjb2xvcjogI2UwZmY3YTsKfSAvKiBsaW1lICAgLSBHZW4gVGltZSAqLwoKLm1qci1tZnYtZ2VuaW5mbyBkaXYsCi5tanItbWZ2LWdlbmluZm8tYSBkaXYsCi5tanItbWZ2LWdlbmluZm8tYiBkaXYgewogICAgbGluZS1oZWlnaHQ6IDEuMzU7CiAgICBtYXJnaW4tYm90dG9tOiAzcHg7Cn0KCi5tanItbWZ2LWdlbmluZm8gZGl2Omxhc3QtY2hpbGQsCi5tanItbWZ2LWdlbmluZm8tYSBkaXY6bGFzdC1jaGlsZCwKLm1qci1tZnYtZ2VuaW5mby1iIGRpdjpsYXN0LWNoaWxkIHsKICAgIG1hcmdpbi1ib3R0b206IDA7Cn0KCi8qIFNpbXBsZSBtb2RlIGNvbnRhaW5lciAqLwoubWpyLW1mdi1zaW1wbGUtY29udGFpbmVyIHsKICAgIHdpZHRoOiAxMDAlOwogICAgaGVpZ2h0OiAxMDAlOwogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICBwb3NpdGlvbjogcmVsYXRpdmU7Cn0KCi8qIEFCIG1vZGUgY29udGFpbmVyICovCi5tanItbWZ2LWFiLWNvbnRhaW5lciB7CiAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICB3aWR0aDogMTAwJTsKICAgIGhlaWdodDogMTAwJTsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICBiYWNrZ3JvdW5kOiAjMDAwOwp9CgovKiBBQiBtb2RlIGxheWVycyAqLwoubWpyLW1mdi1hYi1sYXllciB7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICBpbnNldDogMDsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7Cn0KCi5tanItbWZ2LWFiLWxheWVyLS1iIHsKICAgIC8qIGNsaXAtcGF0aCBhcHBsaWVkIGlubGluZSBmb3IgZHluYW1pYyBkaXZpZGVyIHBvc2l0aW9uICovCn0KCi8qIFNpZGUtYnktc2lkZSBtb2RlIGNvbnRhaW5lciAqLwoubWpyLW1mdi1zaWRlLWNvbnRhaW5lciB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgd2lkdGg6IDEwMCU7CiAgICBoZWlnaHQ6IDEwMCU7CiAgICBnYXA6IDJweDsKICAgIGJhY2tncm91bmQ6ICMxMTE7CiAgICBvdmVyZmxvdzogaGlkZGVuOwp9CgovKiBTaWRlLWJ5LXNpZGUgaGFsZiBwYW5lbHMgKi8KLm1qci1tZnYtc2lkZS1wYW5lbCB7CiAgICBmbGV4OiAxOwogICAgbWluLXdpZHRoOiAwOwogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICBiYWNrZ3JvdW5kOiAjMGQwZDBkOwp9CgovKiBHcmlkIGNvbXBhcmUgKDItMikgY29udGFpbmVyICovCi5tanItbWZ2LWdyaWQtY29udGFpbmVyIHsKICAgIGRpc3BsYXk6IGdyaWQ7CiAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IDFmciAxZnI7CiAgICBncmlkLXRlbXBsYXRlLXJvd3M6IDFmciAxZnI7CiAgICB3aWR0aDogMTAwJTsKICAgIGhlaWdodDogMTAwJTsKICAgIGdhcDogMnB4OwogICAgYmFja2dyb3VuZDogIzExMTsKICAgIG92ZXJmbG93OiBoaWRkZW47Cn0KCi8qIEdyaWQgY2VsbHMgKi8KLm1qci1tZnYtZ3JpZC1jZWxsIHsKICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgYmFja2dyb3VuZDogIzBkMGQwZDsKICAgIG1pbi13aWR0aDogMDsKICAgIG1pbi1oZWlnaHQ6IDA7Cn0KCi8qIEdlbiBpbmZvIG92ZXJsYXlzIGZvciBncmlkIGNlbGxzIEMgYW5kIEQgKi8KLm1qci1tZnYtZ2VuaW5mby1jLAoubWpyLW1mdi1nZW5pbmZvLWQgewogICAgZGlzcGxheTogbm9uZTsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIGxlZnQ6IDhweDsKICAgIHJpZ2h0OiA4cHg7CiAgICBib3R0b206IDhweDsKICAgIGJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgMC42NSk7CiAgICBjb2xvcjogI2ZmZjsKICAgIHBhZGRpbmc6IDhweCAxMHB4OwogICAgYm9yZGVyLXJhZGl1czogNnB4OwogICAgZm9udC1zaXplOiAxMXB4OwogICAgbWF4LWhlaWdodDogNDAlOwogICAgb3ZlcmZsb3cteTogYXV0bzsKICAgIG92ZXJmbG93LXg6IGhpZGRlbjsKICAgIG92ZXJzY3JvbGwtYmVoYXZpb3IteTogY29udGFpbjsKICAgIC13ZWJraXQtb3ZlcmZsb3ctc2Nyb2xsaW5nOiB0b3VjaDsKICAgIHRvdWNoLWFjdGlvbjogcGFuLXk7CiAgICB3b3JkLWJyZWFrOiBicmVhay13b3JkOwogICAgYmFja2Ryb3AtZmlsdGVyOiBibHVyKDZweCk7CiAgICAtd2Via2l0LWJhY2tkcm9wLWZpbHRlcjogYmx1cig2cHgpOwogICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEyKTsKICAgIGJveC1zaGFkb3c6IDAgMnB4IDhweCByZ2JhKDAsIDAsIDAsIDAuNCk7Cn0KCi5tanItbWZ2LWdlbmluZm8tYyBzdHJvbmcsCi5tanItbWZ2LWdlbmluZm8tZCBzdHJvbmcgewogICAgZm9udC13ZWlnaHQ6IDYwMDsKICAgIG1hcmdpbi1yaWdodDogNHB4OwogICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC45NSk7Cn0KCi8qIFBlci1maWVsZCBsYWJlbCBjb2xvcnMgZm9yIEMvRCBnZW4gaW5mbyBvdmVybGF5cyAqLwoubWpyLW1mdi1nZW5pbmZvLWMgW2RhdGEtZmllbGQ9InByb21wdCJdIHN0cm9uZywKLm1qci1tZnYtZ2VuaW5mby1kIFtkYXRhLWZpZWxkPSJwcm9tcHQiXSBzdHJvbmcgewogICAgY29sb3I6ICM3ZWM4ZmY7Cn0KLm1qci1tZnYtZ2VuaW5mby1jIFtkYXRhLWZpZWxkPSJzZWVkIl0gc3Ryb25nLAoubWpyLW1mdi1nZW5pbmZvLWQgW2RhdGEtZmllbGQ9InNlZWQiXSBzdHJvbmcgewogICAgY29sb3I6ICNmZmQ0N2E7Cn0KLm1qci1tZnYtZ2VuaW5mby1jIFtkYXRhLWZpZWxkPSJtb2RlbCJdIHN0cm9uZywKLm1qci1tZnYtZ2VuaW5mby1kIFtkYXRhLWZpZWxkPSJtb2RlbCJdIHN0cm9uZyB7CiAgICBjb2xvcjogIzdkZGE4YTsKfQoubWpyLW1mdi1nZW5pbmZvLWMgW2RhdGEtZmllbGQ9ImxvcmEiXSBzdHJvbmcsCi5tanItbWZ2LWdlbmluZm8tZCBbZGF0YS1maWVsZD0ibG9yYSJdIHN0cm9uZyB7CiAgICBjb2xvcjogI2Q0OGNmZjsKfQoubWpyLW1mdi1nZW5pbmZvLWMgW2RhdGEtZmllbGQ9InNhbXBsZXIiXSBzdHJvbmcsCi5tanItbWZ2LWdlbmluZm8tZCBbZGF0YS1maWVsZD0ic2FtcGxlciJdIHN0cm9uZyB7CiAgICBjb2xvcjogI2ZmOWY3YTsKfQoubWpyLW1mdi1nZW5pbmZvLWMgW2RhdGEtZmllbGQ9InNjaGVkdWxlciJdIHN0cm9uZywKLm1qci1tZnYtZ2VuaW5mby1kIFtkYXRhLWZpZWxkPSJzY2hlZHVsZXIiXSBzdHJvbmcgewogICAgY29sb3I6ICNmZjdhOWY7Cn0KLm1qci1tZnYtZ2VuaW5mby1jIFtkYXRhLWZpZWxkPSJjZmciXSBzdHJvbmcsCi5tanItbWZ2LWdlbmluZm8tZCBbZGF0YS1maWVsZD0iY2ZnIl0gc3Ryb25nIHsKICAgIGNvbG9yOiAjN2E5ZmZmOwp9Ci5tanItbWZ2LWdlbmluZm8tYyBbZGF0YS1maWVsZD0ic3RlcCJdIHN0cm9uZywKLm1qci1tZnYtZ2VuaW5mby1kIFtkYXRhLWZpZWxkPSJzdGVwIl0gc3Ryb25nIHsKICAgIGNvbG9yOiAjN2FmZmQ0Owp9CgovKiBHZW4gaW5mbyBhY3RpdmUgc3RhdGUgLSBidXR0b24gZ2xvd3Mgd2hlbiBhdCBsZWFzdCBvbmUgZmllbGQgaXMgc2VsZWN0ZWQgKi8KLm1qci1tZnYgLm1qci1pY29uLWJ0bi5pcy1vbiB7CiAgICBib3JkZXItY29sb3I6IHJnYmEodmFyKC0tbWpyLWdyb3VwLWFjY2VudCwgOTUsIDE3OSwgMjU1KSwgMC41NSk7CiAgICBjb2xvcjogdmFyKC0tbWpyLWFjY2VudCwgIzVmYjNmZik7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMiwgIzMzMykgODAlLCB2YXIoLS1tanItYWNjZW50LCAjNWZiM2ZmKSAxNSUpOwogICAgYm94LXNoYWRvdzogMCAwIDAgMXB4IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYWNjZW50LCAjNWZiM2ZmKSAyNSUsIHRyYW5zcGFyZW50KTsKfQoKLm1qci1tZnYgLm1qci1pY29uLWJ0bi5pcy1vcGVuIHsKICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQsICM1ZmIzZmYpIDYyJSwgI2ZmZmZmZiAxMiUpOwogICAgY29sb3I6ICNlZWY3ZmY7CiAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoMTgwZGVnLCByZ2JhKDk1LCAxNzksIDI1NSwgMC4yOCksIHJnYmEoOTUsIDE3OSwgMjU1LCAwLjE0KSk7CiAgICBib3gtc2hhZG93OgogICAgICAgIGluc2V0IDAgMCAwIDFweCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDgpLAogICAgICAgIDAgMCAwIDFweCBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWFjY2VudCwgIzVmYjNmZikgMjYlLCB0cmFuc3BhcmVudCk7Cn0KCi5tanItbWZ2Lm1qci1tZnYtLXBvcHBlZCAubWpyLWljb24tYnRuLmlzLW9wZW4gewogICAgY29sb3I6ICNmZmZmZmYgIWltcG9ydGFudDsKfQoKLyogR2VuIGluZm8gZHJvcGRvd24gcGFuZWwgKi8KLm1qci1tZnYtZ2VuLWRyb3Bkb3duIHsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIHotaW5kZXg6IDEwMDAxOwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTEsICMyYTJhMmEpIDk2JSwgdHJhbnNwYXJlbnQpOwogICAgY29sb3I6IHZhcigtLWNvbnRlbnQtZmcsICNkZGQpOwogICAgcGFkZGluZzogNnB4IDRweDsKICAgIGJvcmRlci1yYWRpdXM6IDhweDsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMTk2LCAyMDIsIDIxMCwgMC4xOCk7CiAgICBib3gtc2hhZG93OgogICAgICAgIDAgOHB4IDI0cHggcmdiYSgwLCAwLCAwLCAwLjU1KSwKICAgICAgICAwIDJweCA2cHggcmdiYSgwLCAwLCAwLCAwLjMpOwogICAgZGlzcGxheTogbm9uZTsKICAgIG1pbi13aWR0aDogMTUwcHg7CiAgICBiYWNrZHJvcC1maWx0ZXI6IGJsdXIoOHB4KTsKICAgIC13ZWJraXQtYmFja2Ryb3AtZmlsdGVyOiBibHVyKDhweCk7Cn0KCi5tanItbWZ2LWdlbi1kcm9wZG93bjo6YmVmb3JlIHsKICAgIGNvbnRlbnQ6ICJHRU4gSU5GTyI7CiAgICBkaXNwbGF5OiBibG9jazsKICAgIGZvbnQtc2l6ZTogOXB4OwogICAgZm9udC13ZWlnaHQ6IDcwMDsKICAgIGxldHRlci1zcGFjaW5nOiAwLjhweDsKICAgIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMzUpOwogICAgcGFkZGluZzogMnB4IDEwcHggNnB4OwogICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHJnYmEoMTk2LCAyMDIsIDIxMCwgMC4xKTsKICAgIG1hcmdpbi1ib3R0b206IDRweDsKfQoKLm1qci1tZnYtZ2VuLWRyb3Bkb3duLmlzLXZpc2libGUgewogICAgZGlzcGxheTogYmxvY2s7Cn0KCi5tanItbWZ2LWdlbi1kcm9wZG93bi1yb3cgewogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBnYXA6IDhweDsKICAgIGZvbnQtc2l6ZTogMTJweDsKICAgIHBhZGRpbmc6IDVweCAxMHB4OwogICAgYm9yZGVyLXJhZGl1czogNXB4OwogICAgY3Vyc29yOiBwb2ludGVyOwogICAgdHJhbnNpdGlvbjogYmFja2dyb3VuZCAxMDBtcyBlYXNlOwogICAgdXNlci1zZWxlY3Q6IG5vbmU7Cn0KCi5tanItbWZ2LWdlbi1kcm9wZG93bi1yb3c6aG92ZXIgewogICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA3KTsKfQoKLm1qci1tZnYtZ2VuLWRyb3Bkb3duLXJvdyBpbnB1dFt0eXBlPSJjaGVja2JveCJdIHsKICAgIHdpZHRoOiAxM3B4OwogICAgaGVpZ2h0OiAxM3B4OwogICAgYWNjZW50LWNvbG9yOiB2YXIoLS1tanItYWNjZW50LCAjNWZiM2ZmKTsKICAgIGN1cnNvcjogcG9pbnRlcjsKICAgIGZsZXgtc2hyaW5rOiAwOwp9CgovKiBUcmFuc2Zvcm0gZm9yIHBhbi96b29tIC0gYXBwbGllZCBpbmxpbmUgZm9yIGR5bmFtaWMgdmFsdWVzICovCi5tanItbWZ2LW1lZGlhLS10cmFuc2Zvcm0gewogICAgdHJhbnNmb3JtLW9yaWdpbjogY2VudGVyOwp9CgovKiBDdXJzb3IgZmVlZGJhY2sgZm9yIHBhbi96b29tIGludGVyYWN0aW9ucyAqLwoubWpyLW1mdi1jb250ZW50LS1ncmFiIHsKICAgIGN1cnNvcjogZ3JhYjsKfQoKLm1qci1tZnYtY29udGVudC0tZ3JhYmJpbmcgewogICAgY3Vyc29yOiBncmFiYmluZzsKfQoKLyogU2lkZWJhciB0YWIgYnV0dG9uOiBhbGxvdyAyLWxpbmUgbGFiZWwgdmlhIFxuIGluIGxhYmVsIHN0cmluZyAqLwoubWFqb29yLWFzc2V0cy10YWItYnV0dG9uIC5zaWRlLWJhci1idXR0b24tbGFiZWwgewogICAgd2hpdGUtc3BhY2U6IHByZS1saW5lOwp9CgovKiBCb3R0b20tcGFuZWwgZ2VuZXJhdGVkIGZlZWQ6IGNvbXBhY3QgY2FyZHMgd2l0aCBvbmx5IHRoZSBnZW5lcmF0aW9uLXRpbWUgcGlsbCAqLwoubWpyLWJvdHRvbS1mZWVkIHsKICAgIG1pbi1oZWlnaHQ6IDA7CiAgICBvdmVyZmxvdzogaGlkZGVuOwp9CgoubWpyLWJvdHRvbS1mZWVkIC5tanItYW0tZ3JpZC1zY3JvbGwgewogICAgZmxleDogMSAxIGF1dG87CiAgICBtaW4taGVpZ2h0OiAwOwogICAgaGVpZ2h0OiAxMDAlOwogICAgb3ZlcmZsb3c6IGF1dG87CiAgICBzY3JvbGxiYXItZ3V0dGVyOiBzdGFibGU7CiAgICBvdmVyc2Nyb2xsLWJlaGF2aW9yLXk6IGNvbnRhaW47CiAgICAtd2Via2l0LW92ZXJmbG93LXNjcm9sbGluZzogdG91Y2g7CiAgICB0b3VjaC1hY3Rpb246IHBhbi15OwogICAgc2Nyb2xsLWJlaGF2aW9yOiBzbW9vdGg7CiAgICBzY3JvbGxiYXItd2lkdGg6IHRoaW47CiAgICBzY3JvbGxiYXItY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0yLCAjMmYzNTQwKSA3MCUsICM3ZjhlYTMgMzAlKQogICAgICAgIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0wLCAjMTYxOTFmKSA4OCUsICMwMDAgMTIlKTsKfQoKLm1qci1ib3R0b20tZmVlZCAubWpyLWFtLWdyaWQtc2Nyb2xsOjotd2Via2l0LXNjcm9sbGJhciwKLm1qci1mZWVkLWdyb3VwLXBvcG92ZXItZ3JpZDo6LXdlYmtpdC1zY3JvbGxiYXIgewogICAgd2lkdGg6IDEwcHg7CiAgICBoZWlnaHQ6IDEwcHg7Cn0KCi5tanItYm90dG9tLWZlZWQgLm1qci1hbS1ncmlkLXNjcm9sbDo6LXdlYmtpdC1zY3JvbGxiYXItdGh1bWIsCi5tanItZmVlZC1ncm91cC1wb3BvdmVyLWdyaWQ6Oi13ZWJraXQtc2Nyb2xsYmFyLXRodW1iIHsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0yLCAjMmYzNTQwKSA3MCUsICM3ZjhlYTMgMzAlKTsKICAgIGJvcmRlci1yYWRpdXM6IDk5OXB4OwogICAgYm9yZGVyOiAycHggc29saWQgdHJhbnNwYXJlbnQ7CiAgICBiYWNrZ3JvdW5kLWNsaXA6IHBhZGRpbmctYm94Owp9CgoubWpyLWJvdHRvbS1mZWVkIC5tanItYW0tZ3JpZC1zY3JvbGw6Oi13ZWJraXQtc2Nyb2xsYmFyLXRyYWNrLAoubWpyLWZlZWQtZ3JvdXAtcG9wb3Zlci1ncmlkOjotd2Via2l0LXNjcm9sbGJhci10cmFjayB7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMCwgIzE2MTkxZikgODglLCAjMDAwIDEyJSk7CiAgICBib3JkZXItcmFkaXVzOiA5OTlweDsKfQoKLm1qci1ib3R0b20tZmVlZCAubWpyLWdyaWQgewogICAgZ2FwOiA2cHggIWltcG9ydGFudDsKICAgIG1hcmdpbi10b3A6IDAgIWltcG9ydGFudDsKICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogcmVwZWF0KGF1dG8tZmlsbCwgbWlubWF4KG1pbigxMDAlLCAxMzJweCksIDFmcikpICFpbXBvcnRhbnQ7CiAgICBtaW4taGVpZ2h0OiAwOwogICAgaGVpZ2h0OiBhdXRvOwogICAgYWxpZ24tY29udGVudDogc3RhcnQ7Cn0KCi5tanItYm90dG9tLWZlZWQgLm1qci1jYXJkLAoubWpyLWJvdHRvbS1mZWVkIC5tanItYXNzZXQtY2FyZCB7CiAgICBib3JkZXItcmFkaXVzOiAxMnB4ICFpbXBvcnRhbnQ7CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTEpIDkyJSwgIzAwMCA4JSkgIWltcG9ydGFudDsKICAgIGJveC1zaGFkb3c6IDAgNnB4IDE4cHggcmdiYSgwLCAwLCAwLCAwLjIyKSAhaW1wb3J0YW50OwogICAgdHJhbnNmb3JtOiBub25lICFpbXBvcnRhbnQ7Cn0KCi5tanItYm90dG9tLWZlZWQgLm1qci1jYXJkOmhvdmVyLAoubWpyLWJvdHRvbS1mZWVkIC5tanItYXNzZXQtY2FyZDpob3ZlciB7CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTFweCkgIWltcG9ydGFudDsKICAgIGJveC1zaGFkb3c6IDAgMTBweCAyNHB4IHJnYmEoMCwgMCwgMCwgMC4yOCkgIWltcG9ydGFudDsKCiAgICAubWpyLWJvdHRvbS1mZWVkIC5tanItYXNzZXQtY2FyZC5pcy1zZWxlY3RlZCB7CiAgICAgICAgYm94LXNoYWRvdzoKICAgICAgICAgICAgMCAwIDAgM3B4IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItY2FyZC1zZWxlY3Rpb24tY29sb3IpIDgwJSwgdmFyKC0tY29udGVudC1mZykpLAogICAgICAgICAgICAwIDAgMCA2cHggY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1jYXJkLXNlbGVjdGlvbi1jb2xvcikgMzAlLCB0cmFuc3BhcmVudCksCiAgICAgICAgICAgIDAgMCAyMHB4IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItY2FyZC1zZWxlY3Rpb24tY29sb3IpIDQwJSwgdHJhbnNwYXJlbnQpLAogICAgICAgICAgICAwIDEwcHggMjhweCByZ2JhKDAsIDAsIDAsIDAuMjgpICFpbXBvcnRhbnQ7CiAgICAgICAgb3V0bGluZTogMnB4IHNvbGlkIHZhcigtLW1qci1jYXJkLXNlbGVjdGlvbi1jb2xvcikgIWltcG9ydGFudDsKICAgICAgICBvdmVyZmxvdzogdmlzaWJsZSAhaW1wb3J0YW50OwogICAgfQp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYXNzZXQtY2FyZFtkYXRhLW1qci1zdGFja2VkPSJ0cnVlIl0sCi5tanItYm90dG9tLWZlZWQgLm1qci1hc3NldC1jYXJkW2RhdGEtbWpyLXN0YWNrZWQ9InRydWUiXSB7CiAgICBvdmVyZmxvdzogdmlzaWJsZSAhaW1wb3J0YW50Owp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYXNzZXQtY2FyZFtkYXRhLW1qci1zdGFja2VkPSJ0cnVlIl0gLm1qci10aHVtYiwKLm1qci1ib3R0b20tZmVlZCAubWpyLWFzc2V0LWNhcmRbZGF0YS1tanItc3RhY2tlZD0idHJ1ZSJdIC5tanItdGh1bWIgewogICAgb3ZlcmZsb3c6IHZpc2libGUgIWltcG9ydGFudDsKICAgIGlzb2xhdGlvbjogaXNvbGF0ZTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFzc2V0LWNhcmRbZGF0YS1tanItc3RhY2tlZD0idHJ1ZSJdIC5tanItdGh1bWI6OmJlZm9yZSwKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFzc2V0LWNhcmRbZGF0YS1tanItc3RhY2tlZD0idHJ1ZSJdIC5tanItdGh1bWI6OmFmdGVyLAoubWpyLWJvdHRvbS1mZWVkIC5tanItYXNzZXQtY2FyZFtkYXRhLW1qci1zdGFja2VkPSJ0cnVlIl0gLm1qci10aHVtYjo6YmVmb3JlLAoubWpyLWJvdHRvbS1mZWVkIC5tanItYXNzZXQtY2FyZFtkYXRhLW1qci1zdGFja2VkPSJ0cnVlIl0gLm1qci10aHVtYjo6YWZ0ZXIgewogICAgY29udGVudDogIiI7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICBpbnNldDogMDsKICAgIGJvcmRlci1yYWRpdXM6IGluaGVyaXQ7CiAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgIHotaW5kZXg6IC0xOwogICAgdHJhbnNpdGlvbjoKICAgICAgICB0cmFuc2Zvcm0gMTQwbXMgZWFzZSwKICAgICAgICBvcGFjaXR5IDE0MG1zIGVhc2U7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hc3NldC1jYXJkW2RhdGEtbWpyLXN0YWNrZWQ9InRydWUiXSAubWpyLXRodW1iOjpiZWZvcmUsCi5tanItYm90dG9tLWZlZWQgLm1qci1hc3NldC1jYXJkW2RhdGEtbWpyLXN0YWNrZWQ9InRydWUiXSAubWpyLXRodW1iOjpiZWZvcmUgewogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoNXB4LCA1cHgpIHNjYWxlKDAuOTg1KTsKICAgIGJhY2tncm91bmQ6CiAgICAgICAgbGluZWFyLWdyYWRpZW50KDE4MGRlZywgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEpLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDMpKSwKICAgICAgICBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMSwgIzIwMjQyYikgODQlLCAjMDAwIDE2JSk7CiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDgpOwogICAgYm94LXNoYWRvdzogMCA4cHggMThweCByZ2JhKDAsIDAsIDAsIDAuMTYpOwogICAgb3BhY2l0eTogMC45Owp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYXNzZXQtY2FyZFtkYXRhLW1qci1zdGFja2VkPSJ0cnVlIl0gLm1qci10aHVtYjo6YWZ0ZXIsCi5tanItYm90dG9tLWZlZWQgLm1qci1hc3NldC1jYXJkW2RhdGEtbWpyLXN0YWNrZWQ9InRydWUiXSAubWpyLXRodW1iOjphZnRlciB7CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgxMHB4LCAxMHB4KSBzY2FsZSgwLjk3KTsKICAgIGJhY2tncm91bmQ6CiAgICAgICAgbGluZWFyLWdyYWRpZW50KDE4MGRlZywgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA2KSwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjAyKSksCiAgICAgICAgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTAsICMxNjE5MWYpIDgyJSwgIzAwMCAxOCUpOwogICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA2KTsKICAgIGJveC1zaGFkb3c6IDAgMTJweCAyMnB4IHJnYmEoMCwgMCwgMCwgMC4xNCk7CiAgICBvcGFjaXR5OiAwLjc1Owp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYXNzZXQtY2FyZFtkYXRhLW1qci1zdGFja2VkPSJ0cnVlIl06aG92ZXIgLm1qci10aHVtYjo6YmVmb3JlLAoubWpyLWJvdHRvbS1mZWVkIC5tanItYXNzZXQtY2FyZFtkYXRhLW1qci1zdGFja2VkPSJ0cnVlIl06aG92ZXIgLm1qci10aHVtYjo6YmVmb3JlIHsKICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlKDZweCwgNnB4KSBzY2FsZSgwLjk4NSk7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hc3NldC1jYXJkW2RhdGEtbWpyLXN0YWNrZWQ9InRydWUiXTpob3ZlciAubWpyLXRodW1iOjphZnRlciwKLm1qci1ib3R0b20tZmVlZCAubWpyLWFzc2V0LWNhcmRbZGF0YS1tanItc3RhY2tlZD0idHJ1ZSJdOmhvdmVyIC5tanItdGh1bWI6OmFmdGVyIHsKICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlKDEycHgsIDEycHgpIHNjYWxlKDAuOTcpOwp9CgoubWpyLWJvdHRvbS1mZWVkIC5tanItdGh1bWIgewogICAgYXNwZWN0LXJhdGlvOiAwLjk1IC8gMSAhaW1wb3J0YW50OwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTApIDcyJSwgIzAwMCAyOCUpICFpbXBvcnRhbnQ7Cn0KCi5tanItYm90dG9tLWZlZWQgLm1qci10aHVtYi1wbGF5IHsKICAgIGJhY2tncm91bmQ6IHJhZGlhbC1ncmFkaWVudCgKICAgICAgICBjaXJjbGUgYXQgY2VudGVyLAogICAgICAgIHJnYmEoMCwgMCwgMCwgMC4xOCksCiAgICAgICAgcmdiYSgwLCAwLCAwLCAwLjA0KSAzOCUsCiAgICAgICAgdHJhbnNwYXJlbnQgNzAlCiAgICApOwp9CgoubWpyLWJvdHRvbS1mZWVkIC5tanItYmFkZ2UtZXh0LAoubWpyLWJvdHRvbS1mZWVkIC5tanItYmFkZ2UtcmF0aW5nLAoubWpyLWJvdHRvbS1mZWVkIC5tanItYmFkZ2UtdGFncyB7CiAgICB0cmFuc2Zvcm06IHNjYWxlKDAuOTIpOwogICAgdHJhbnNmb3JtLW9yaWdpbjogdG9wIGxlZnQ7Cn0KCi8qIC0tIEZlZWQgY2FyZCBpbmZvOiBkZWZhdWx0IGhpZGRlbiwgdG9nZ2xlZCB2aWEgbWpyLWZlZWQtc2hvdy0qIGNsYXNzZXMgb24gLm1qci1ncmlkIC0tICovCi5tanItYm90dG9tLWZlZWQgLm1qci1jYXJkLWluZm8gewogICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50OwogICAgcGFkZGluZzogNHB4IDZweCAhaW1wb3J0YW50OwogICAgbWluLXdpZHRoOiAwOwp9Ci5tanItYm90dG9tLWZlZWQgLm1qci1ncmlkLm1qci1mZWVkLXNob3ctaW5mbyAubWpyLWNhcmQtaW5mbyB7CiAgICBkaXNwbGF5OiBibG9jayAhaW1wb3J0YW50Owp9CgovKiBGZWVkIGZpbGVuYW1lICovCi5tanItYm90dG9tLWZlZWQgLm1qci1jYXJkLWZpbGVuYW1lIHsKICAgIGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDsKfQoubWpyLWJvdHRvbS1mZWVkIC5tanItZ3JpZC5tanItZmVlZC1zaG93LWZpbGVuYW1lIC5tanItY2FyZC1maWxlbmFtZSB7CiAgICBkaXNwbGF5OiBibG9jayAhaW1wb3J0YW50Owp9CgovKiBGZWVkIGRpbWVuc2lvbnMgLyBkdXJhdGlvbiAqLwoubWpyLWJvdHRvbS1mZWVkIC5tanItbWV0YS1yZXMsCi5tanItYm90dG9tLWZlZWQgLm1qci1tZXRhLWR1cmF0aW9uIHsKICAgIGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDsKfQoubWpyLWJvdHRvbS1mZWVkIC5tanItZ3JpZC5tanItZmVlZC1zaG93LWRpbWVuc2lvbnMgLm1qci1tZXRhLXJlcywKLm1qci1ib3R0b20tZmVlZCAubWpyLWdyaWQubWpyLWZlZWQtc2hvdy1kaW1lbnNpb25zIC5tanItbWV0YS1kdXJhdGlvbiB7CiAgICBkaXNwbGF5OiBpbmxpbmUgIWltcG9ydGFudDsKfQoKLyogRmVlZCBkYXRlL3RpbWUgKi8KLm1qci1ib3R0b20tZmVlZCAubWpyLW1ldGEtZGF0ZSwKLm1qci1ib3R0b20tZmVlZCAubWpyLW1ldGEtdGltZS12YWwgewogICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50Owp9Ci5tanItYm90dG9tLWZlZWQgLm1qci1ncmlkLm1qci1mZWVkLXNob3ctZGF0ZSAubWpyLW1ldGEtZGF0ZSwKLm1qci1ib3R0b20tZmVlZCAubWpyLWdyaWQubWpyLWZlZWQtc2hvdy1kYXRlIC5tanItbWV0YS10aW1lLXZhbCB7CiAgICBkaXNwbGF5OiBpbmxpbmUgIWltcG9ydGFudDsKfQoKLyogRmVlZCBnZW5lcmF0aW9uIHRpbWUgYmFkZ2UgKi8KLm1qci1ib3R0b20tZmVlZCAubWpyLW1ldGEtZ2VudGltZSB7CiAgICBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7Cn0KLm1qci1ib3R0b20tZmVlZCAubWpyLWdyaWQubWpyLWZlZWQtc2hvdy1nZW50aW1lIC5tanItbWV0YS1nZW50aW1lIHsKICAgIGRpc3BsYXk6IGlubGluZS1mbGV4ICFpbXBvcnRhbnQ7Cn0KCi8qIEZlZWQgd29ya2Zsb3cgZG90ICovCi5tanItYm90dG9tLWZlZWQgLm1qci1jYXJkLWRvdC13cmFwcGVyIHsKICAgIGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDsKfQoubWpyLWJvdHRvbS1mZWVkIC5tanItZ3JpZC5tanItZmVlZC1zaG93LWRvdCAubWpyLWNhcmQtZG90LXdyYXBwZXIgewogICAgZGlzcGxheTogaW5saW5lLWZsZXggIWltcG9ydGFudDsKfQoKLyogRmVlZCBiYWRnZXMgKi8KLm1qci1ib3R0b20tZmVlZCAubWpyLWJhZGdlLWV4dCB7CiAgICBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7Cn0KLm1qci1ib3R0b20tZmVlZCAubWpyLWdyaWQubWpyLWZlZWQtc2hvdy1iYWRnZXMtZXh0IC5tanItYmFkZ2UtZXh0IHsKICAgIGRpc3BsYXk6IGZsZXggIWltcG9ydGFudDsKfQoKLm1qci1ib3R0b20tZmVlZCAubWpyLWJhZGdlLXJhdGluZyB7CiAgICBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7Cn0KLm1qci1ib3R0b20tZmVlZCAubWpyLWdyaWQubWpyLWZlZWQtc2hvdy1iYWRnZXMtcmF0aW5nIC5tanItYmFkZ2UtcmF0aW5nIHsKICAgIGRpc3BsYXk6IGZsZXggIWltcG9ydGFudDsKfQoKLm1qci1ib3R0b20tZmVlZCAubWpyLWJhZGdlLXRhZ3MgewogICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50Owp9Ci5tanItYm90dG9tLWZlZWQgLm1qci1ncmlkLm1qci1mZWVkLXNob3ctYmFkZ2VzLXRhZ3MgLm1qci1iYWRnZS10YWdzIHsKICAgIGRpc3BsYXk6IGZsZXggIWltcG9ydGFudDsKfQoKLyogRmVlZCBtZXRhIHJvdyBzdHlsaW5nIC0gZmxleCBsYXlvdXQgc28gdmlzaWJsZSBpdGVtcyBzdGF5IHNlcGFyYXRlZCAqLwoubWpyLWJvdHRvbS1mZWVkIC5tanItY2FyZC1tZXRhLXJvdyB7CiAgICBkaXNwbGF5OiBmbGV4ICFpbXBvcnRhbnQ7CiAgICBmbGV4LXdyYXA6IG5vd3JhcCAhaW1wb3J0YW50OwogICAgYWxpZ24taXRlbXM6IGNlbnRlciAhaW1wb3J0YW50OwogICAgZ2FwOiA1cHggIWltcG9ydGFudDsKICAgIG92ZXJmbG93OiBoaWRkZW4gIWltcG9ydGFudDsKICAgIG1pbi13aWR0aDogMCAhaW1wb3J0YW50OwogICAgcGFkZGluZy1yaWdodDogMCAhaW1wb3J0YW50OwogICAgbGluZS1oZWlnaHQ6IDEuMyAhaW1wb3J0YW50OwogICAgb3BhY2l0eTogMC43OCAhaW1wb3J0YW50OwogICAgZm9udC1zaXplOiAwLjhlbSAhaW1wb3J0YW50OwogICAgLyogdGV4dC1vdmVyZmxvdyBlbGxpcHNpcyBkb2Vzbid0IGFwcGx5IG9uIGEgZmxleCBjb250YWluZXIgaXRzZWxmICovCn0KLyogRWFjaCBtZXRhIHNwYW4gdHJ1bmNhdGVzIGluZGl2aWR1YWxseSBpZiB0b28gbG9uZyAqLwoubWpyLWJvdHRvbS1mZWVkIC5tanItY2FyZC1tZXRhLXJvdyA+IHNwYW4gewogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKICAgIG1pbi13aWR0aDogMDsKICAgIGZsZXgtc2hyaW5rOiAxOwp9Ci8qIEdlbnRpbWUgYmFkZ2UgYW5kIHRpbWUgdmFsdWUgc2hvdWxkIHN0YXkgdmlzaWJsZSAoZG9uJ3Qgc2hyaW5rIGF3YXkpICovCi5tanItYm90dG9tLWZlZWQgLm1qci1jYXJkLW1ldGEtcm93ID4gLm1qci1tZXRhLWdlbnRpbWUsCi5tanItYm90dG9tLWZlZWQgLm1qci1jYXJkLW1ldGEtcm93ID4gLm1qci1tZXRhLXRpbWUtdmFsIHsKICAgIGZsZXgtc2hyaW5rOiAwOwp9CgoubWpyLWJvdHRvbS1mZWVkIC5tanItZ3JpZC5tanItZmVlZC1zaG93LWdlbnRpbWUgLm1qci1tZXRhLWdlbnRpbWUgewogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogM3B4OwogICAgcGFkZGluZzogM3B4IDdweDsKICAgIGJvcmRlci1yYWRpdXM6IDk5OXB4OwogICAgYmFja2dyb3VuZDogcmdiYSgxMCwgMTQsIDIwLCAwLjc0KTsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xMik7CiAgICBib3gtc2hhZG93OiAwIDJweCA4cHggcmdiYSgwLCAwLCAwLCAwLjIyKTsKICAgIGZvbnQtc2l6ZTogMTBweDsKICAgIGZvbnQtd2VpZ2h0OiA4MDAgIWltcG9ydGFudDsKICAgIGxldHRlci1zcGFjaW5nOiAwLjAxNWVtOwogICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC45OCk7CiAgICB0ZXh0LXNoYWRvdzoKICAgICAgICAwIDFweCAycHggcmdiYSgwLCAwLCAwLCAwLjkpLAogICAgICAgIDAgMCAxMHB4IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xNik7CiAgICBiYWNrZHJvcC1maWx0ZXI6IGJsdXIoNnB4KTsKICAgIC13ZWJraXQtYmFja2Ryb3AtZmlsdGVyOiBibHVyKDZweCk7Cn0KCi8qIC0tIEF1ZGlvIC8gM0QgcGxhY2Vob2xkZXIgdGh1bWJuYWlscyBpbiB0aGUgZmVlZCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgovKiBBdWRpbyBjYXJkcyBzaG93IHRoZSB3YXZlZm9ybSBzcHJpdGU7IGdpdmUgaXQgYSBkaXN0aW5jdCBiYWNrZ3JvdW5kIHNvIGl0CiAgIGRvZXNuJ3QgbG9vayBsaWtlIGEgYnJva2VuIGltYWdlIHBsYWNlaG9sZGVyIGluIHRoZSBmZWVkLiAqLwoubWpyLWJvdHRvbS1mZWVkIC5tanItYXNzZXQtY2FyZFtkYXRhLW1qci1raW5kPSJhdWRpbyJdIC5tanItdGh1bWIsCi5tanItYm90dG9tLWZlZWQgLm1qci1hc3NldC1jYXJkW2RhdGEtbWpyLWV4dD0ibXAzIl0gLm1qci10aHVtYiwKLm1qci1ib3R0b20tZmVlZCAubWpyLWFzc2V0LWNhcmRbZGF0YS1tanItZXh0PSJ3YXYiXSAubWpyLXRodW1iLAoubWpyLWJvdHRvbS1mZWVkIC5tanItYXNzZXQtY2FyZFtkYXRhLW1qci1leHQ9Im9nZyJdIC5tanItdGh1bWIsCi5tanItYm90dG9tLWZlZWQgLm1qci1hc3NldC1jYXJkW2RhdGEtbWpyLWV4dD0iZmxhYyJdIC5tanItdGh1bWIgewogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTApIDYwJSwgIzFhMWYyYiA0MCUpICFpbXBvcnRhbnQ7Cn0KCi8qIDNEIG1vZGVsIGNhcmRzIHVzZSBhbiBpY29uIHBsYWNlaG9sZGVyIC0gYWRkIGEgc3VidGxlIGdyYWRpZW50IHNvIHRoZXkgcmVhZAogICBhcyBpbnRlbnRpb25hbCByYXRoZXIgdGhhbiBtaXNzaW5nLiAqLwoubWpyLWJvdHRvbS1mZWVkIC5tanItYXNzZXQtY2FyZFtkYXRhLW1qci1raW5kPSJtb2RlbDNkIl0gLm1qci10aHVtYiwKLm1qci1ib3R0b20tZmVlZCAubWpyLWFzc2V0LWNhcmRbZGF0YS1tanItZXh0PSJnbGIiXSAubWpyLXRodW1iLAoubWpyLWJvdHRvbS1mZWVkIC5tanItYXNzZXQtY2FyZFtkYXRhLW1qci1leHQ9ImdsdGYiXSAubWpyLXRodW1iLAoubWpyLWJvdHRvbS1mZWVkIC5tanItYXNzZXQtY2FyZFtkYXRhLW1qci1leHQ9Im9iaiJdIC5tanItdGh1bWIsCi5tanItYm90dG9tLWZlZWQgLm1qci1hc3NldC1jYXJkW2RhdGEtbWpyLWV4dD0iZmJ4Il0gLm1qci10aHVtYiB7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMCkgNTAlLCAjMGQxMTE3IDUwJSkgIWltcG9ydGFudDsKfQoKLyogLS0gRmVlZCBncm91cCBidXR0b24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgoubWpyLWJvdHRvbS1mZWVkIC5tanItZmVlZC1ncm91cC1idXR0b24gewogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgdG9wOiAzNHB4OwogICAgcmlnaHQ6IDZweDsKICAgIHotaW5kZXg6IDExOwogICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICBnYXA6IDRweDsKICAgIG1pbi13aWR0aDogMjhweDsKICAgIG1pbi1oZWlnaHQ6IDI4cHg7CiAgICBwYWRkaW5nOiA0cHggOHB4OwogICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE0KTsKICAgIGJvcmRlci1yYWRpdXM6IDk5OXB4OwogICAgYmFja2dyb3VuZDogcmdiYSgxMCwgMTQsIDIwLCAwLjc0KTsKICAgIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuOTYpOwogICAgZm9udC1zaXplOiAxMHB4OwogICAgZm9udC13ZWlnaHQ6IDcwMDsKICAgIGxpbmUtaGVpZ2h0OiAxOwogICAgYm94LXNoYWRvdzogMCAycHggOHB4IHJnYmEoMCwgMCwgMCwgMC4yNCk7CiAgICBiYWNrZHJvcC1maWx0ZXI6IGJsdXIoNnB4KTsKICAgIC13ZWJraXQtYmFja2Ryb3AtZmlsdGVyOiBibHVyKDZweCk7CiAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICB0b3VjaC1hY3Rpb246IG1hbmlwdWxhdGlvbjsKICAgIHRyYW5zaXRpb246CiAgICAgICAgYmFja2dyb3VuZCAxMjBtcyBlYXNlLAogICAgICAgIHRyYW5zZm9ybSA4MG1zIGVhc2U7Cn0KCi5tanItYm90dG9tLWZlZWQgLm1qci1mZWVkLWdyb3VwLWJ1dHRvbjpob3ZlciB7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDE4LCAyNCwgMzQsIDAuOSk7Cn0KCi5tanItZmVlZC1ncm91cC1idXR0b24taWNvbiB7CiAgICBmb250LXNpemU6IDExcHg7CiAgICBvcGFjaXR5OiAwLjk7Cn0KCi5tanItZmVlZC1ncm91cC1idXR0b24tY291bnQgewogICAgZm9udC1zaXplOiAxMHB4OwogICAgZm9udC13ZWlnaHQ6IDcwMDsKICAgIGxpbmUtaGVpZ2h0OiAxOwp9CgovKiAtLSBGZWVkIGdyb3VwIHBvcG92ZXIgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCi5tanItZmVlZC1ncm91cC1wb3BvdmVyIHsKICAgIGJhY2tncm91bmQ6IHZhcigtLWNvbWZ5LW1lbnUtYmcsICMyMjIpOwogICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyLWNvbG9yLCAjM2EzYTNhKTsKICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLW1qci1yLWxnLCA4cHgpOwogICAgYm94LXNoYWRvdzogMCA4cHggMjhweCByZ2JhKDAsIDAsIDAsIDAuNDUpOwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKfQoKLm1qci1mZWVkLWdyb3VwLXBvcG92ZXItdGl0bGUgewogICAgcGFkZGluZzogOHB4IDEwcHggNHB4OwogICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wNik7CiAgICBtYXJnaW4tYm90dG9tOiA4cHg7Cn0KCi5tanItZmVlZC1ncm91cC1wb3BvdmVyLWdyaWQgewogICAgcGFkZGluZzogNHB4IDhweCAxMHB4OwogICAgbWF4LWhlaWdodDogMzYwcHg7CiAgICBvdmVyZmxvdy15OiBhdXRvOwogICAgb3ZlcnNjcm9sbC1iZWhhdmlvcjogY29udGFpbjsKICAgIHNjcm9sbGJhci1ndXR0ZXI6IHN0YWJsZTsKICAgIHNjcm9sbGJhci13aWR0aDogdGhpbjsKICAgIHNjcm9sbGJhci1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTIsICMyZjM1NDApIDcwJSwgIzdmOGVhMyAzMCUpCiAgICAgICAgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTAsICMxNjE5MWYpIDg4JSwgIzAwMCAxMiUpOwp9CgoubWpyLWZlZWQtZ3JvdXAtYnV0dG9uLWljb24sCi5tanItZmVlZC1ncm91cC1idXR0b24tY291bnQgewogICAgcG9pbnRlci1ldmVudHM6IG5vbmU7Cn0KCi5tanItZmVlZC1ncm91cC1tZW1iZXItY2FyZCB7CiAgICBtaW4td2lkdGg6IDA7Cn0KCi5tanItZmVlZC1ncm91cC1tZW1iZXItY2FyZCAubWpyLXRodW1iIHsKICAgIGFzcGVjdC1yYXRpbzogMSAvIDEgIWltcG9ydGFudDsKfQoKLm1qci1mZWVkLWdyb3VwLW1lbWJlci1jYXJkIC5tanItY2FyZC1pbmZvIHsKICAgIGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLXN0YWNrLWdyb3VwLWJ1dHRvbiB7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICB0b3A6IDM0cHg7CiAgICByaWdodDogNnB4OwogICAgei1pbmRleDogMTE7CiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgIGdhcDogNHB4OwogICAgbWluLXdpZHRoOiAyOHB4OwogICAgbWluLWhlaWdodDogMjhweDsKICAgIHBhZGRpbmc6IDRweCA4cHg7CiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTQpOwogICAgYm9yZGVyLXJhZGl1czogOTk5cHg7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDEwLCAxNCwgMjAsIDAuNzQpOwogICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC45Nik7CiAgICBsaW5lLWhlaWdodDogMTsKICAgIGJveC1zaGFkb3c6IDAgMnB4IDhweCByZ2JhKDAsIDAsIDAsIDAuMjQpOwogICAgYmFja2Ryb3AtZmlsdGVyOiBibHVyKDZweCk7CiAgICAtd2Via2l0LWJhY2tkcm9wLWZpbHRlcjogYmx1cig2cHgpOwogICAgY3Vyc29yOiBwb2ludGVyOwogICAgdG91Y2gtYWN0aW9uOiBtYW5pcHVsYXRpb247CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVooMCk7CiAgICB0cmFuc2l0aW9uOgogICAgICAgIGJhY2tncm91bmQgMTIwbXMgZWFzZSwKICAgICAgICB0cmFuc2Zvcm0gODBtcyBlYXNlOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItc3RhY2stZ3JvdXAtYnV0dG9uOmhvdmVyIHsKICAgIGJhY2tncm91bmQ6IHJnYmEoMTgsIDI0LCAzNCwgMC45KTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLXN0YWNrLWdyb3VwLWJ1dHRvbiA+ICogewogICAgcG9pbnRlci1ldmVudHM6IG5vbmU7Cn0KCi5tanItZmlsbXN0cmlwOjotd2Via2l0LXNjcm9sbGJhciB7CiAgICB3aWR0aDogNHB4OwogICAgaGVpZ2h0OiA0cHg7Cn0KCi5tanItZmlsbXN0cmlwOjotd2Via2l0LXNjcm9sbGJhci10cmFjayB7CiAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsKfQoKLm1qci1maWxtc3RyaXA6Oi13ZWJraXQtc2Nyb2xsYmFyLXRodW1iIHsKICAgIGJvcmRlci1yYWRpdXM6IDk5OXB4OwogICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE0KTsKfQoKLm1qci1maWxtc3RyaXA6aG92ZXI6Oi13ZWJraXQtc2Nyb2xsYmFyLXRodW1iIHsKICAgIGJhY2tncm91bmQ6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4yMik7Cn0KCi5tanItZmlsbXN0cmlwLWF1ZGlvLXRodW1iIHsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIGluc2V0OiAwOwogICAgZGlzcGxheTogZmxleDsKICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICBnYXA6IDVweDsKICAgIHBhZGRpbmc6IDdweDsKICAgIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuODIpOwogICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICBiYWNrZ3JvdW5kOgogICAgICAgIHJhZGlhbC1ncmFkaWVudChjaXJjbGUgYXQgMjQlIDI0JSwgcmdiYSg3OCwgMTg0LCAyNTUsIDAuMjgpLCB0cmFuc3BhcmVudCA0MiUpLAogICAgICAgIHJhZGlhbC1ncmFkaWVudChjaXJjbGUgYXQgODQlIDcwJSwgcmdiYSg4MiwgMjIwLCAxNTYsIDAuMTgpLCB0cmFuc3BhcmVudCA0MCUpLAogICAgICAgIGxpbmVhci1ncmFkaWVudCgxMzVkZWcsIHJnYmEoMTgsIDI1LCAzNSwgMC45NiksIHJnYmEoNywgMTAsIDE1LCAwLjk4KSk7Cn0KCi5tanItZmlsbXN0cmlwLWF1ZGlvLXdhdmVmb3JtIHsKICAgIHdpZHRoOiA3NiU7CiAgICBoZWlnaHQ6IDI0cHg7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgZ2FwOiAycHg7Cn0KCi5tanItZmlsbXN0cmlwLWF1ZGlvLXdhdmVmb3JtIHNwYW4gewogICAgd2lkdGg6IDJweDsKICAgIG1pbi1oZWlnaHQ6IDRweDsKICAgIGJvcmRlci1yYWRpdXM6IDk5OXB4OwogICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KDE4MGRlZywgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjk0KSwgcmdiYSgxNDgsIDIxOCwgMjU1LCAwLjY4KSk7Cn0KCi5tanItZmlsbXN0cmlwLWF1ZGlvLWxhYmVsIHsKICAgIG1heC13aWR0aDogMTAwJTsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICBwYWRkaW5nOiAycHggNXB4OwogICAgYm9yZGVyLXJhZGl1czogOTk5cHg7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIDAuMjgpOwogICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEpOwogICAgZm9udC1zaXplOiA3cHg7CiAgICBmb250LXdlaWdodDogODAwOwogICAgbGluZS1oZWlnaHQ6IDE7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1zdGFjay1ncm91cC1idXR0b24tY291bnQgewogICAgZm9udC1zaXplOiAxMHB4OwogICAgZm9udC13ZWlnaHQ6IDcwMDsKICAgIGxpbmUtaGVpZ2h0OiAxOwp9CgovKiAtLSBEdXBsaWNhdGUgc3RhY2sgYnV0dG9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwovKiBTaG93cyBvbiB0aGUgcHJpbWFyeSBjYXJkIHdoZW4gc2FtZS1maWxlbmFtZSBkdXBsaWNhdGVzIGV4aXN0LiAgICAgICAgICAgICAqLwovKiBQb3NpdGlvbmVkIGF0IGJvdHRvbS1yaWdodCB0byBub3Qgb3ZlcmxhcCB0aGUgc3RhY2stZ3JvdXAgYnV0dG9uICh0b3AtcmlnaHQpLiAqLwoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItZHVwLXN0YWNrLWJ1dHRvbiB7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICBib3R0b206IDMwcHg7CiAgICByaWdodDogNnB4OwogICAgei1pbmRleDogMTE7CiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgIGdhcDogNHB4OwogICAgbWluLXdpZHRoOiAyOHB4OwogICAgbWluLWhlaWdodDogMjhweDsKICAgIHBhZGRpbmc6IDRweCA4cHg7CiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDI1NSwgMTgwLCAwLCAwLjM4KTsKICAgIGJvcmRlci1yYWRpdXM6IDk5OXB4OwogICAgYmFja2dyb3VuZDogcmdiYSgzMCwgMTgsIDAsIDAuODIpOwogICAgY29sb3I6IHJnYmEoMjU1LCAyMDAsIDYwLCAwLjk2KTsKICAgIGJveC1zaGFkb3c6IDAgMnB4IDhweCByZ2JhKDAsIDAsIDAsIDAuMzIpOwogICAgYmFja2Ryb3AtZmlsdGVyOiBibHVyKDZweCk7CiAgICAtd2Via2l0LWJhY2tkcm9wLWZpbHRlcjogYmx1cig2cHgpOwogICAgY3Vyc29yOiBwb2ludGVyOwogICAgZm9udC1zaXplOiAxMXB4OwogICAgbGluZS1oZWlnaHQ6IDE7CiAgICB0b3VjaC1hY3Rpb246IG1hbmlwdWxhdGlvbjsKICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWigwKTsKICAgIHRyYW5zaXRpb246CiAgICAgICAgYmFja2dyb3VuZCAwLjE1cywKICAgICAgICB0cmFuc2Zvcm0gODBtcyBlYXNlOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItZHVwLXN0YWNrLWJ1dHRvbjpob3ZlciB7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDUwLCAzMCwgMCwgMC45NCk7CiAgICBib3JkZXItY29sb3I6IHJnYmEoMjU1LCAxODAsIDAsIDAuNik7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1kdXAtc3RhY2stYnV0dG9uID4gKiB7CiAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWR1cC1zdGFjay1jb3VudCB7CiAgICBmb250LXNpemU6IDEwcHg7CiAgICBmb250LXdlaWdodDogNzAwOwogICAgbGluZS1oZWlnaHQ6IDE7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hc3NldC1jYXJkW2RhdGEtbWpyLWR1cC1zdGFja2VkPSJ0cnVlIl0gLm1qci1kdXAtc3RhY2stYnV0dG9uIHsKICAgIGJveC1zaGFkb3c6CiAgICAgICAgMCAycHggOHB4IHJnYmEoMCwgMCwgMCwgMC4zMiksCiAgICAgICAgMCAwIDAgMXB4IHJnYmEoMjU1LCAxODAsIDAsIDAuMik7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hc3NldC1jYXJkW2RhdGEtbWpyLXN0YWNrZWQ9InRydWUiXSAubWpyLXN0YWNrLWdyb3VwLWJ1dHRvbiwKLm1qci1ib3R0b20tZmVlZCAubWpyLWFzc2V0LWNhcmRbZGF0YS1tanItc3RhY2tlZD0idHJ1ZSJdIC5tanItZmVlZC1ncm91cC1idXR0b24gewogICAgYm94LXNoYWRvdzoKICAgICAgICAwIDJweCA4cHggcmdiYSgwLCAwLCAwLCAwLjI0KSwKICAgICAgICAwIDAgMCAxcHggcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA0KTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFzc2V0LWNhcmRbZGF0YS1tanItc3RhY2tlZD0idHJ1ZSJdOmhvdmVyLAoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYXNzZXQtY2FyZFtkYXRhLW1qci1kdXAtc3RhY2tlZD0idHJ1ZSJdOmhvdmVyIHsKICAgIHRyYW5zZm9ybTogbm9uZSAhaW1wb3J0YW50Owp9CgovKiAtLSBWaXN1YWwgc3RhY2tpbmcgZWZmZWN0IC0gbGF5ZXJlZCBjYXJkcyBiZWhpbmQgdGhlIG1haW4gY2FyZCAtLS0tLS0tLS0tLS0gKi8KLyogQ3JlYXRlcyBwc2V1ZG8tZWxlbWVudCAiY2FyZHMiIG9mZnNldCBiZWhpbmQgdGhlIHByaW1hcnkgY2FyZCB0byB2aXN1YWxseSAgICAqLwovKiBjb21tdW5pY2F0ZSB0aGF0IHRoaXMgY2FyZCByZXByZXNlbnRzIGEgZ3JvdXAgb2YgbXVsdGlwbGUgaW1hZ2VzLiAgICAgICAgICAgICovCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hc3NldC1jYXJkW2RhdGEtbWpyLXN0YWNrZWQ9InRydWUiXSB7CiAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICB6LWluZGV4OiAxOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYXNzZXQtY2FyZFtkYXRhLW1qci1zdGFja2VkPSJ0cnVlIl06OmJlZm9yZSwKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFzc2V0LWNhcmRbZGF0YS1tanItc3RhY2tlZD0idHJ1ZSJdOjphZnRlciB7CiAgICBjb250ZW50OiAiIjsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIGluc2V0OiAwOwogICAgYm9yZGVyLXJhZGl1czogaW5oZXJpdDsKICAgIGJhY2tncm91bmQ6IHZhcigtLWNvbWZ5LW1lbnUtYmcsICMxYTFhMmUpOwogICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA2KTsKICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgei1pbmRleDogLTE7CiAgICB0cmFuc2l0aW9uOgogICAgICAgIHRyYW5zZm9ybSAxODBtcyBlYXNlLAogICAgICAgIG9wYWNpdHkgMTgwbXMgZWFzZTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFzc2V0LWNhcmRbZGF0YS1tanItc3RhY2tlZD0idHJ1ZSJdOjpiZWZvcmUgewogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoM3B4LCAzcHgpIHJvdGF0ZSgxZGVnKTsKICAgIG9wYWNpdHk6IDAuNDU7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hc3NldC1jYXJkW2RhdGEtbWpyLXN0YWNrZWQ9InRydWUiXTo6YWZ0ZXIgewogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoNnB4LCA2cHgpIHJvdGF0ZSgyLjJkZWcpOwogICAgb3BhY2l0eTogMC4yNTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFzc2V0LWNhcmRbZGF0YS1tanItc3RhY2tlZD0idHJ1ZSJdOmhvdmVyOjpiZWZvcmUgewogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoNHB4LCA0cHgpIHJvdGF0ZSgxLjVkZWcpOwogICAgb3BhY2l0eTogMC41NTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFzc2V0LWNhcmRbZGF0YS1tanItc3RhY2tlZD0idHJ1ZSJdOmhvdmVyOjphZnRlciB7CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSg4cHgsIDhweCkgcm90YXRlKDNkZWcpOwogICAgb3BhY2l0eTogMC4zNTsKfQoKLm1qci1zdGFjay1ncm91cC1wb3BvdmVyIHsKICAgIHdpZHRoOiBtaW4oNDQwcHgsIDkydncpOwp9CgoubWpyLXN0YWNrLWdyb3VwLW1lbWJlci1jYXJkIHsKICAgIG1pbi13aWR0aDogMDsKfQoKLm1qci1zdGFjay1ncm91cC1tZW1iZXItY2FyZCAubWpyLXRodW1iIHsKICAgIGFzcGVjdC1yYXRpbzogMSAvIDEgIWltcG9ydGFudDsKfQoKLm1qci1zdGFjay1ncm91cC1tZW1iZXItY2FyZCAubWpyLWNhcmQtaW5mbyB7CiAgICBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7Cn0KCi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogKiBMaWdodCBtb2RlIG92ZXJyaWRlcyAoQ29tZnlVSSB2MS40MisgaW1wcm92ZWQgbGlnaHQgdGhlbWUpCiAqIFVzZXMgQ29tZnlVSSBkYXRhLXRoZW1lIGF0dHJpYnV0ZSB3aGVuIHNldCwgd2l0aAogKiBwcmVmZXJzLWNvbG9yLXNjaGVtZSBhcyBhIGZhbGxiYWNrIGZvciBvbGRlciB2ZXJzaW9ucy4KICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCgovKiBDb21meVVJIHNldHMgZGF0YS10aGVtZT0ibGlnaHQiIG9uIDxodG1sPiBvciA8Ym9keT4gKi8KOmlzKFtkYXRhLXRoZW1lPSJsaWdodCJdLCBbZGF0YS1jb2xvci1zY2hlbWU9ImxpZ2h0Il0pIC5tanItYXNzZXRzLW1hbmFnZXIsCjppcyhbZGF0YS10aGVtZT0ibGlnaHQiXSwgW2RhdGEtY29sb3Itc2NoZW1lPSJsaWdodCJdKSAubWpyLXBvcG92ZXIgewogICAgLS1tanItc3VyZmFjZS0wOiB2YXIoLS1pbnRlcmZhY2UtcGFuZWwtc3VyZmFjZSwgI2YwZjBmMCk7CiAgICAtLW1qci1zdXJmYWNlLTE6IHZhcigtLWludGVyZmFjZS1tZW51LXN1cmZhY2UsICNmYWZhZmEpOwogICAgLS1tanItc3VyZmFjZS0yOiB2YXIoLS1pbnRlcmZhY2UtcGFuZWwtaG92ZXItc3VyZmFjZSwgI2U4ZThlOCk7CiAgICAtLW1qci1zdXJmYWNlLTM6IHZhcigtLW1vZGFsLWNhcmQtYmFja2dyb3VuZCwgI2ZmZmZmZik7CiAgICAtLW1qci1ib3JkZXI6IHZhcigtLWJvcmRlci1kZWZhdWx0LCByZ2JhKDAsIDAsIDAsIDAuMTQpKTsKICAgIC0tbWpyLW11dGVkOiB2YXIoLS1tdXRlZC1mb3JlZ3JvdW5kLCByZ2JhKDAsIDAsIDAsIDAuNTUpKTsKICAgIC0tbWpyLWNhcmQtaG92ZXItY29sb3I6IHZhcigtLWludGVyZmFjZS1wYW5lbC1ob3Zlci1zdXJmYWNlLCAjZTBlMGUwKTsKfQoKQG1lZGlhIChwcmVmZXJzLWNvbG9yLXNjaGVtZTogbGlnaHQpIHsKICAgIC8qIEZhbGxiYWNrOiBvbmx5IGFwcGx5IGlmIENvbWZ5VUkgaGFzbid0IHNldCBhbiBleHBsaWNpdCBkYXRhLXRoZW1lICovCiAgICAubWpyLWFzc2V0cy1tYW5hZ2VyOm5vdChbZGF0YS10aGVtZS1hcHBsaWVkXSksCiAgICAubWpyLXBvcG92ZXI6bm90KFtkYXRhLXRoZW1lLWFwcGxpZWRdKSB7CiAgICAgICAgLS1tanItc3VyZmFjZS0wOiB2YXIoLS1pbnRlcmZhY2UtcGFuZWwtc3VyZmFjZSwgI2YwZjBmMCk7CiAgICAgICAgLS1tanItc3VyZmFjZS0xOiB2YXIoLS1pbnRlcmZhY2UtbWVudS1zdXJmYWNlLCAjZmFmYWZhKTsKICAgICAgICAtLW1qci1zdXJmYWNlLTI6IHZhcigtLWludGVyZmFjZS1wYW5lbC1ob3Zlci1zdXJmYWNlLCAjZThlOGU4KTsKICAgICAgICAtLW1qci1zdXJmYWNlLTM6IHZhcigtLW1vZGFsLWNhcmQtYmFja2dyb3VuZCwgI2ZmZmZmZik7CiAgICAgICAgLS1tanItYm9yZGVyOiB2YXIoLS1ib3JkZXItZGVmYXVsdCwgcmdiYSgwLCAwLCAwLCAwLjE0KSk7CiAgICAgICAgLS1tanItbXV0ZWQ6IHZhcigtLW11dGVkLWZvcmVncm91bmQsIHJnYmEoMCwgMCwgMCwgMC41NSkpOwogICAgICAgIC0tbWpyLWNhcmQtaG92ZXItY29sb3I6IHZhcigtLWludGVyZmFjZS1wYW5lbC1ob3Zlci1zdXJmYWNlLCAjZTBlMGUwKTsKICAgIH0KfQoKLyogLS0tIFNrZWxldG9uIGxvYWRlcnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCi5tanItY2FyZC1za2VsZXRvbiB7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1tanItc3VyZmFjZS0xLCAjMmEyYTJhKTsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLW1qci1ib3JkZXIsICMzYTNhM2EpOwogICAgYm9yZGVyLXJhZGl1czogdmFyKC0tbWpyLXItbGcsIDhweCk7CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgLyogTWF0Y2ggLm1qci10aHVtYiBhc3BlY3QgcmF0aW8gc28gc2tlbGV0b25zIGhhdmUgdGhlIHNhbWUgZm9vdHByaW50IGFzIHJlYWwgY2FyZHMuICovCiAgICBhc3BlY3QtcmF0aW86IDEgLyAxOwp9CgovKiBTaGltbWVyIHN3ZWVwICovCi5tanItY2FyZC1za2VsZXRvbjo6YWZ0ZXIgewogICAgY29udGVudDogIiI7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICBpbnNldDogMDsKICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgKICAgICAgICA5MGRlZywKICAgICAgICB0cmFuc3BhcmVudCAwJSwKICAgICAgICBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMiwgIzNhM2EzYSkgODAlLCB0cmFuc3BhcmVudCkgNTAlLAogICAgICAgIHRyYW5zcGFyZW50IDEwMCUKICAgICk7CiAgICBhbmltYXRpb246IG1qci1zaGltbWVyIDEuNHMgZWFzZS1pbi1vdXQgaW5maW5pdGU7CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLTEwMCUpOwp9CgpAa2V5ZnJhbWVzIG1qci1zaGltbWVyIHsKICAgIGZyb20gewogICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgtMTAwJSk7CiAgICB9CiAgICB0byB7CiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKDEwMCUpOwogICAgfQp9CgpAbWVkaWEgKHByZWZlcnMtcmVkdWNlZC1tb3Rpb246IHJlZHVjZSkgewogICAgLm1qci1jYXJkLXNrZWxldG9uOjphZnRlciB7CiAgICAgICAgYW5pbWF0aW9uOiBub25lOwogICAgfQp9CgovKiAtLS0gUmVzcG9uc2l2ZSBzdW1tYXJ5IGJhciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoKLyoKICogRW5hYmxlIGNvbnRhaW5lciBxdWVyaWVzIG9uIHRoZSBzdW1tYXJ5IGJhciBzbyBjaGlsZHJlbiBjYW4gcmVzcG9uZCB0byBpdHMKICogYWN0dWFsIHJlbmRlcmVkIHdpZHRoIChlLmcuIHdoZW4gdGhlIHBhbmVsIGlzIGRvY2tlZCBpbiBhIG5hcnJvdyBzaWRlYmFyKS4KICovCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hbS1zdW1tYXJ5IHsKICAgIGNvbnRhaW5lci10eXBlOiBpbmxpbmUtc2l6ZTsKICAgIGNvbnRhaW5lci1uYW1lOiBtanItc3VtbWFyeS1iYXI7Cn0KCi8qIEJlbG93IH4zODAgcHg6IGhpZGUgdGhlIHBpbGxzL3JpZ2h0IHNlY3Rpb24gdG8gcHJldmVudCBvdmVyZmxvdy4gKi8KQGNvbnRhaW5lciBtanItc3VtbWFyeS1iYXIgKG1heC13aWR0aDogMzgwcHgpIHsKICAgIC5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hbS1zdW1tYXJ5LXJpZ2h0IHsKICAgICAgICBkaXNwbGF5OiBub25lOwogICAgfQogICAgLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFtLXN1bW1hcnktdGV4dCB7CiAgICAgICAgbWF4LXdpZHRoOiAxMDAlOwogICAgfQp9Cg==", "" + import.meta.url).toString(), n = document.createElement("link"); n.id = t, n.rel = "stylesheet", n.type = "text/css", n.href = e, n.onerror = () => { @@ -295,7 +295,7 @@ function li({ enabled: e = !0 } = {}) { } }, document.head.appendChild(n), n.onload = () => { try { - document.documentElement.dataset.mjrThemeComfy = "1", ci(); + document.documentElement.dataset.mjrThemeComfy = "1", ui(); } catch (e) { console.debug?.(e); } @@ -304,29 +304,29 @@ function li({ enabled: e = !0 } = {}) { console.warn("Majoor: failed to load Comfy theme CSS", e); } } -ci(); +ui(); // ui/features/grid/gridApi.ts -function ui() { +function fi() { let e = "mjr-grid-settings-styles"; if (document.getElementById(e)) return; let t = document.createElement("style"); t.id = e, t.textContent = "\n .mjr-grid .mjr-asset-card,\n .mjr-grid .mjr-card {\n display: flex;\n flex-direction: column;\n }\n .mjr-grid .mjr-thumb {\n flex: 0 0 auto;\n width: 100%;\n aspect-ratio: 1 / 1;\n min-height: 0;\n position: relative;\n overflow: hidden;\n }\n .mjr-grid .mjr-thumb-media {\n width: 100%;\n height: 100%;\n object-fit: cover;\n display: block;\n }\n\n .mjr-grid .mjr-asset-card:hover {\n background-color: var(--mjr-card-hover-color) !important;\n }\n\n .mjr-grid .mjr-asset-card.is-selected {\n outline: 2px solid var(--mjr-card-selection-color) !important;\n box-shadow: 0 0 0 2px var(--mjr-card-selection-color) !important;\n }\n\n .mjr-grid .mjr-card-filename { display: none; }\n .mjr-grid.mjr-show-filename .mjr-card-filename { display: block; }\n\n .mjr-grid .mjr-card-dot-wrapper { display: none; }\n .mjr-grid.mjr-show-dot .mjr-card-dot-wrapper { display: inline-flex; }\n .mjr-grid .mjr-asset-status-dot {\n transition: color 0.3s ease, opacity 0.3s ease;\n }\n .mjr-grid .mjr-asset-status-dot.mjr-pulse-animation {\n animation: mjr-pulse 1.5s infinite;\n }\n @keyframes mjr-pulse {\n 0% { opacity: 1; }\n 50% { opacity: 0.4; }\n 100% { opacity: 1; }\n }\n\n .mjr-grid .mjr-meta-res { display: none; }\n .mjr-grid.mjr-show-dimensions .mjr-meta-res { display: inline; }\n\n .mjr-grid .mjr-meta-duration { display: none; }\n .mjr-grid.mjr-show-dimensions .mjr-meta-duration { display: inline; }\n\n .mjr-grid .mjr-meta-date { display: none; }\n .mjr-grid.mjr-show-date .mjr-meta-date { display: inline; }\n\n .mjr-grid .mjr-meta-gentime { display: none; }\n .mjr-grid.mjr-show-gentime .mjr-meta-gentime { display: inline; }\n\n .mjr-grid .mjr-badge-ext { display: none !important; }\n .mjr-grid.mjr-show-badges-ext .mjr-badge-ext { display: flex !important; }\n\n .mjr-grid .mjr-badge-rating { display: none !important; }\n .mjr-grid.mjr-show-badges-rating .mjr-badge-rating { display: flex !important; }\n\n .mjr-grid .mjr-badge-tags { display: none !important; }\n .mjr-grid.mjr-show-badges-tags .mjr-badge-tags { display: flex !important; }\n\n .mjr-grid .mjr-card-info { display: none !important; }\n .mjr-grid.mjr-show-details .mjr-card-info { display: block !important; }\n\n .mjr-card-meta-row > span + span::before {\n content: \" \"¢ \";\n opacity: 0.5;\n margin: 0 4px;\n }\n .mjr-card-meta-row > span[style*=\"display: none\"] + span::before {\n display: none;\n }\n ", document.head.appendChild(t); } -function di(e) { +function pi(e) { if (!e) return; - ui(); + fi(); let t = (t, n) => { n ? e.classList.add(t) : e.classList.remove(t); }; t("mjr-show-filename", B.GRID_SHOW_DETAILS_FILENAME), t("mjr-show-dimensions", B.GRID_SHOW_DETAILS_DIMENSIONS), t("mjr-show-date", B.GRID_SHOW_DETAILS_DATE), t("mjr-show-gentime", B.GRID_SHOW_DETAILS_GENTIME), t("mjr-show-hover-info", B.GRID_SHOW_HOVER_INFO), t("mjr-show-dot", B.GRID_SHOW_WORKFLOW_DOT), t("mjr-show-badges-ext", B.GRID_SHOW_BADGES_EXTENSION), t("mjr-show-badges-rating", B.GRID_SHOW_BADGES_RATING), t("mjr-show-badges-tags", B.GRID_SHOW_BADGES_TAGS), t("mjr-show-details", B.GRID_SHOW_DETAILS), e.style.setProperty("--mjr-grid-min-size", `${B.GRID_MIN_SIZE}px`), e.style.setProperty("--mjr-grid-gap", `${B.GRID_GAP}px`), e.style.setProperty("--mjr-star-active", B.BADGE_STAR_COLOR), e.style.setProperty("--mjr-badge-image", B.BADGE_IMAGE_COLOR), e.style.setProperty("--mjr-badge-video", B.BADGE_VIDEO_COLOR), e.style.setProperty("--mjr-badge-audio", B.BADGE_AUDIO_COLOR), e.style.setProperty("--mjr-badge-model3d", B.BADGE_MODEL3D_COLOR), e.style.setProperty("--mjr-badge-duplicate-alert", B.BADGE_DUPLICATE_ALERT_COLOR), e.style.setProperty("--mjr-card-hover-color", B.UI_CARD_HOVER_COLOR), e.style.setProperty("--mjr-card-selection-color", B.UI_CARD_SELECTION_COLOR), e.style.setProperty("--mjr-rating-color", B.UI_RATING_COLOR), e.style.setProperty("--mjr-tag-color", B.UI_TAG_COLOR); } -function fi(e, { applySettingsClasses: t = !0 } = {}) { +function mi(e, { applySettingsClasses: t = !0 } = {}) { if (!e) return null; if (e.id = "mjr-assets-grid", e.classList.add("mjr-grid"), e.tabIndex = 0, e.setAttribute("role", "grid"), t) { - di(e); + pi(e); let t = () => { requestAnimationFrame(() => { - di(e); + pi(e); }); }; try { @@ -344,7 +344,7 @@ function fi(e, { applySettingsClasses: t = !0 } = {}) { } return e; } -function pi(e, t, ...n) { +function hi(e, t, ...n) { let r = { _mjrCaptureAnchor: "captureAnchor", _mjrDispose: "dispose", @@ -367,56 +367,56 @@ function pi(e, t, ...n) { console.debug?.(e); } } -function mi(e, t = {}, n = {}) { - return pi(e, "_mjrHydrateFromSnapshot", t, n) ?? !1; +function gi(e, t = {}, n = {}) { + return hi(e, "_mjrHydrateFromSnapshot", t, n) ?? !1; } -function hi(e, t = "*", n = {}) { - return pi(e, "_mjrLoadAssets", t, n) ?? Promise.resolve({ +function _i(e, t = "*", n = {}) { + return hi(e, "_mjrLoadAssets", t, n) ?? Promise.resolve({ ok: !1, error: "Grid API unavailable" }); } -function gi(e, t, n = {}) { - return pi(e, "_mjrLoadAssetsFromList", t, n) ?? Promise.resolve({ +function vi(e, t, n = {}) { + return hi(e, "_mjrLoadAssetsFromList", t, n) ?? Promise.resolve({ ok: !1, error: "Grid API unavailable" }); } -function _i(e) { - return pi(e, "_mjrPrepareForScopeSwitch"); +function yi(e) { + return hi(e, "_mjrPrepareForScopeSwitch"); } -function vi(e) { +function bi(e) { try { e?._mjrSettingsChangedCleanup?.(); } catch (e) { console.debug?.(e); } - return pi(e, "_mjrDispose"); + return hi(e, "_mjrDispose"); } -function yi(e) { - return pi(e, "_mjrRefreshGrid"); +function xi(e) { + return hi(e, "_mjrRefreshGrid"); } -function bi(e) { - return pi(e, "_mjrCaptureAnchor") ?? null; +function Si(e) { + return hi(e, "_mjrCaptureAnchor") ?? null; } -function xi(e, t) { - return pi(e, "_mjrRestoreAnchor", t); +function Ci(e, t) { + return hi(e, "_mjrRestoreAnchor", t); } -function Si(e, t, n = {}) { - return pi(e, "_mjrRemoveAssets", t, n) ?? { +function wi(e, t, n = {}) { + return hi(e, "_mjrRemoveAssets", t, n) ?? { ok: !1, removed: 0, selectedIds: [] }; } -function Ci(e, t) { - return !!pi(e, "_mjrUpsertAsset", t); +function Ti(e, t) { + return !!hi(e, "_mjrUpsertAsset", t); } -function wi(e, t) { - return !!pi(e, "_mjrUpsertAssetNow", t); +function Ei(e, t) { + return !!hi(e, "_mjrUpsertAssetNow", t); } // ui/features/panel/views/popoverManager.ts -function Ti(e, t) { +function Di(e, t) { if (!e || !t?.size) return !1; for (let n of t.values()) { let t = n?.popover || null; @@ -431,7 +431,7 @@ function Ti(e, t) { } return !1; } -function Ei(e) { +function Oi(e) { if (!e || e === document?.body) return !1; try { if (typeof e.matches == "function" && e.matches("[data-pc-name],[role='listbox'],[role='dialog'],[role='menu'],[role='tree'],[role='grid']")) return !0; @@ -445,7 +445,7 @@ function Ei(e) { ].join(" ").toLowerCase(); return /\b(p-|p_)?(select|listbox|multiselect|datepicker|calendar|overlay|panel|menu|dialog|tooltip|popover)\b/.test(t); } -function Di(e) { +function ki(e) { let t = /* @__PURE__ */ new Map(), n = null, r = 0, i = [], a = !1, o = !1, s = !1, c = new AbortController(), l = new AbortController(), u = !1, d = null, f = (e, t = "y") => { if (!e) return !1; let n = globalThis.getComputedStyle?.(e), r = String(t === "x" ? n?.overflowX || n?.overflow || "" : n?.overflowY || n?.overflow || ""); @@ -531,7 +531,7 @@ function Di(e) { for (let e of t.values()) _(e.popover, e.anchor); })); }, y = (e) => { - Ti(e?.target, t) || v(); + Di(e?.target, t) || v(); }, b = () => { if (t.size) { try { @@ -689,7 +689,7 @@ function Di(e) { try { let e = n; for (; e && e !== document.body && e.parentNode && e.parentNode !== document.body;) e = e.parentNode; - if (e && e !== document.body && e.parentNode === document.body && Ei(e)) for (let e of t.values()) try { + if (e && e !== document.body && e.parentNode === document.body && Oi(e)) for (let e of t.values()) try { if (!e?.popover) continue; if (e.popover.querySelector("[data-pc-name][aria-expanded='true']") || e.popover.querySelector("[aria-expanded='true'][role='combobox']")) return; } catch (e) { @@ -751,7 +751,7 @@ function Di(e) { }; } // ui/features/grid/GridKeyboard.ts -var Oi = { +var Ai = { OPEN_VIEWER: { key: "Enter", description: "Open selected in viewer" @@ -867,29 +867,29 @@ var Oi = { key: "ArrowRight", description: "Navigate right" } -}, ki = null; -function Ai() { - return ki ||= import("./chunks/viewerOpenRequest-CCFPrnGk.js").then((e) => e.n), ki; +}, ji = null; +function Mi() { + return ji ||= import("./chunks/viewerOpenRequest-Crw9UWH5.js").then((e) => e.n), ji; } -function ji(e) { +function Ni(e) { if (!e) return ""; let t = []; e.ctrl && t.push("Ctrl"), e.shift && t.push("Shift"), e.alt && t.push("Alt"); let n = e.key; return n === " " && (n = "Space"), n === "Delete" && (n = "Del"), n === "ArrowUp" && (n = "<-‘"), n === "ArrowDown" && (n = "<-“"), n === "ArrowLeft" && (n = "<-"), n === "ArrowRight" && (n = "->"), t.push(n.length === 1 ? n.toUpperCase() : n), t.join("+"); } -function Mi(e, t) { +function Pi(e, t) { if (!t || !e) return !1; let n = e.key.toLowerCase() === t.key.toLowerCase() || e.key === t.key, r = !!t.ctrl === (e.ctrlKey || e.metaKey), i = !!t.shift === e.shiftKey, a = !!t.alt === e.altKey; return n && r && i && a; } -var Ni = /* @__PURE__ */ new Map(); -function Pi(t, n, r) { +var Fi = /* @__PURE__ */ new Map(); +function Ii(t, n, r) { let i = t?.id; if (!i) return; let a = String(i); try { - let e = Ni.get(a); + let e = Fi.get(a); e && clearTimeout(e); } catch (e) { console.debug?.(e); @@ -901,7 +901,7 @@ function Pi(t, n, r) { } let o = setTimeout(async () => { try { - Ni.delete(a); + Fi.delete(a); let t = await _(i, n); if (!t?.ok) { e(t?.error || R("toast.ratingUpdateFailed"), "error"); @@ -915,23 +915,23 @@ function Pi(t, n, r) { console.error("[GridKeyboard] Rating update failed:", t), e(R("toast.ratingUpdateError"), "error"); } }, 350); - Ni.set(a, o); + Fi.set(a, o); } -function Fi({ gridContainer: t, getState: n = () => ({}), getSelectedAssets: r = () => [], getActiveAsset: i = () => null, onOpenDetails: a = () => {}, onOpenTagsEditor: o = () => {}, onSelectionChanged: s = () => {}, onAssetChanged: c = () => {} } = {}) { +function Li({ gridContainer: t, getState: n = () => ({}), getSelectedAssets: r = () => [], getActiveAsset: i = () => null, onOpenDetails: a = () => {}, onOpenTagsEditor: o = () => {}, onSelectionChanged: s = () => {}, onAssetChanged: c = () => {} } = {}) { if (!t) return { bind: () => {}, unbind: () => {}, dispose: () => {} }; let u = null, d = null, f = null, p = null, m = !1, h = !1, g = ({ assets: e = [], index: t = 0, mode: n = "" } = {}) => { - Ai().then((r) => r.requestViewerOpen({ + Mi().then((r) => r.requestViewerOpen({ assets: e, index: t, mode: n })).catch((e) => console.debug?.(e)); }, _ = () => { try { - $n(t); + tr(t); } catch (e) { console.debug?.(e); } @@ -968,7 +968,7 @@ function Fi({ gridContainer: t, getState: n = () => ({}), getSelectedAssets: r = } }, x = (t) => { if (!t?.filepath) return !1; - let n = qe(t.filepath), r = document.createElement("a"); + let n = ct(t.filepath), r = document.createElement("a"); return r.href = n, r.download = t.filename || "download", document.body.appendChild(r), r.click(), document.body.removeChild(r), e(R("toast.downloadingFile", "Downloading {filename}...", { filename: t.filename }), "info", 3e3), !0; }, S = () => { try { @@ -1069,7 +1069,7 @@ function Fi({ gridContainer: t, getState: n = () => ({}), getSelectedAssets: r = let e = document.activeElement, n = t.contains(e), r = e && e.contains && e.contains(t), i = e?.closest?.(".mjr-asset-card"); if (!n && !r && !i) return; } else { - let e = Xn(); + let e = Qn(); if (e && e !== t) return; } let u = () => { @@ -1084,38 +1084,38 @@ function Fi({ gridContainer: t, getState: n = () => ({}), getSelectedAssets: r = console.debug?.(e); } let d = v(), f = b(), p = n(); - if (Mi(r, Oi.DOWNLOAD) && f?.filepath) { + if (Pi(r, Ai.DOWNLOAD) && f?.filepath) { u(), h = !0; return; } let m = !!fe().ratingHotkeysActive; if (!r.ctrlKey && !r.altKey && !r.metaKey && !r.shiftKey) { - if (!m && Mi(r, Oi.RATING_1) && f?.id) { - u(), Pi(f, 1, c); + if (!m && Pi(r, Ai.RATING_1) && f?.id) { + u(), Ii(f, 1, c); return; } - if (!m && Mi(r, Oi.RATING_2) && f?.id) { - u(), Pi(f, 2, c); + if (!m && Pi(r, Ai.RATING_2) && f?.id) { + u(), Ii(f, 2, c); return; } - if (!m && Mi(r, Oi.RATING_3) && f?.id) { - u(), Pi(f, 3, c); + if (!m && Pi(r, Ai.RATING_3) && f?.id) { + u(), Ii(f, 3, c); return; } - if (!m && Mi(r, Oi.RATING_4) && f?.id) { - u(), Pi(f, 4, c); + if (!m && Pi(r, Ai.RATING_4) && f?.id) { + u(), Ii(f, 4, c); return; } - if (!m && Mi(r, Oi.RATING_5) && f?.id) { - u(), Pi(f, 5, c); + if (!m && Pi(r, Ai.RATING_5) && f?.id) { + u(), Ii(f, 5, c); return; } - if (!m && Mi(r, Oi.RATING_RESET) && f?.id) { - u(), Pi(f, 0, c); + if (!m && Pi(r, Ai.RATING_RESET) && f?.id) { + u(), Ii(f, 0, c); return; } } - if ((Mi(r, Oi.OPEN_VIEWER) || Mi(r, Oi.OPEN_VIEWER_ALT)) && d.length > 0) { + if ((Pi(r, Ai.OPEN_VIEWER) || Pi(r, Ai.OPEN_VIEWER_ALT)) && d.length > 0) { u(); try { if (d.length >= 2 && d.length <= 4) g({ @@ -1138,8 +1138,8 @@ function Fi({ gridContainer: t, getState: n = () => ({}), getSelectedAssets: r = } catch (e) { console.error("[GridKeyboard] Open viewer failed:", e); } - } else if (Mi(r, Oi.METADATA_PANEL) && f) u(), a(f); - else if (Mi(r, Oi.COMPARE_AB) && d.length === 2) { + } else if (Pi(r, Ai.METADATA_PANEL) && f) u(), a(f); + else if (Pi(r, Ai.COMPARE_AB) && d.length === 2) { u(); try { g({ @@ -1150,7 +1150,7 @@ function Fi({ gridContainer: t, getState: n = () => ({}), getSelectedAssets: r = } catch (e) { console.debug?.(e); } - } else if (Mi(r, Oi.SIDE_BY_SIDE) && d.length >= 2 && d.length <= 4) { + } else if (Pi(r, Ai.SIDE_BY_SIDE) && d.length >= 2 && d.length <= 4) { u(); try { g({ @@ -1161,8 +1161,8 @@ function Fi({ gridContainer: t, getState: n = () => ({}), getSelectedAssets: r = } catch (e) { console.debug?.(e); } - } else if (Mi(r, Oi.EDIT_TAGS) && f?.id) u(), o(f); - else if (Mi(r, Oi.ADD_TO_COLLECTION) && (d.length > 0 || f)) { + } else if (Pi(r, Ai.EDIT_TAGS) && f?.id) u(), o(f); + else if (Pi(r, Ai.ADD_TO_COLLECTION) && (d.length > 0 || f)) { u(); let e = d.length > 0 ? d : [f], n = t.getBoundingClientRect(); await Rt({ @@ -1171,7 +1171,7 @@ function Fi({ gridContainer: t, getState: n = () => ({}), getSelectedAssets: r = assets: e }); } else { - if (Mi(r, Oi.REMOVE_FROM_COLLECTION)) { + if (Pi(r, Ai.REMOVE_FROM_COLLECTION)) { let t = p?.collectionId; if (t && (d.length > 0 || f)) { u(); @@ -1198,18 +1198,18 @@ function Fi({ gridContainer: t, getState: n = () => ({}), getSelectedAssets: r = return; } } - if (Mi(r, Oi.COPY_PATH) && f?.filepath) { + if (Pi(r, Ai.COPY_PATH) && f?.filepath) { u(); try { await navigator.clipboard.writeText(f.filepath), e(R("toast.pathCopied"), "success", 2e3); } catch { e(R("toast.pathCopyFailed"), "error"); } - } else if (Mi(r, Oi.OPEN_IN_FOLDER) && f?.id) { + } else if (Pi(r, Ai.OPEN_IN_FOLDER) && f?.id) { u(); let t = await ne(f.id); t?.ok ? e(R("toast.openedInFolder"), "info", 2e3) : e(t?.error || R("toast.openFolderFailed"), "error"); - } else if (Mi(r, Oi.RENAME) && f?.id) { + } else if (Pi(r, Ai.RENAME) && f?.id) { u(); let t = f.filename || "", n = await wt(R("dialog.rename.title", "Rename file"), t), r = vt(n, t); if (r && r !== t) { @@ -1234,7 +1234,7 @@ function Fi({ gridContainer: t, getState: n = () => ({}), getSelectedAssets: r = e(R("toast.errorRenaming", "Error renaming file: {error}", { error: t?.message || String(t || "") }), "error"); } } - } else if ((Mi(r, Oi.DELETE) || Mi(r, Oi.DELETE_ALT)) && (f?.id || d.length > 0)) { + } else if ((Pi(r, Ai.DELETE) || Pi(r, Ai.DELETE_ALT)) && (f?.id || d.length > 0)) { u(); let n = d.length > 0 ? d : [f], r = 0, i = 0, a = []; for (let e of n) if (e?.id) try { @@ -1262,7 +1262,7 @@ function Fi({ gridContainer: t, getState: n = () => ({}), getSelectedAssets: r = console.debug?.(e); } s(); - } else if (Mi(r, Oi.SELECT_ALL)) { + } else if (Pi(r, Ai.SELECT_ALL)) { u(); let e = []; try { @@ -1287,7 +1287,7 @@ function Fi({ gridContainer: t, getState: n = () => ({}), getSelectedAssets: r = console.debug?.(e); } s(); - } else if (Mi(r, Oi.DESELECT_ALL)) { + } else if (Pi(r, Ai.DESELECT_ALL)) { u(); try { typeof t?._mjrSetSelection == "function" ? t._mjrSetSelection([], "") : (y().filter((e) => e?.classList?.contains?.("is-selected")).forEach((e) => { @@ -1311,7 +1311,7 @@ function Fi({ gridContainer: t, getState: n = () => ({}), getSelectedAssets: r = if (m && u) { document.removeEventListener("keydown", u, !0), d && document.removeEventListener("keyup", d, !0), f && document.removeEventListener("dragstart", f, !0), p && (t.removeEventListener("pointerdown", p, !0), t.removeEventListener("focusin", p, !0)), u = null, d = null, f = null, p = null, h = !1; try { - Yn(t); + Zn(t); } catch (e) { console.debug?.(e); } @@ -1321,12 +1321,12 @@ function Fi({ gridContainer: t, getState: n = () => ({}), getSelectedAssets: r = console.debug?.(e); } m = !1; - for (let e of Ni.values()) try { + for (let e of Fi.values()) try { clearTimeout(e); } catch (e) { console.debug?.(e); } - Ni.clear(); + Fi.clear(); } }; return { @@ -1334,63 +1334,63 @@ function Fi({ gridContainer: t, getState: n = () => ({}), getSelectedAssets: r = unbind: M, dispose: () => { M(); - for (let e of Ni.values()) try { + for (let e of Fi.values()) try { clearTimeout(e); } catch (e) { console.debug?.(e); } - Ni.clear(); + Fi.clear(); } }; } -function Ii(e) { - let t = Oi[e]; - return t ? ji(t) : ""; +function Ri(e) { + let t = Ai[e]; + return t ? Ni(t) : ""; } // ui/features/workflows/workflowInfoState.ts -var Li = xr({ +var zi = Cr({ open: !1, workflow: null }); -function Ri(e) { - Li.workflow = e || null, Li.open = !0; +function Bi(e) { + zi.workflow = e || null, zi.open = !0; } -function zi() { - Li.open = !1, Li.workflow = null; +function Vi() { + zi.open = !1, zi.workflow = null; } // ui/features/contextmenu/GridContextMenu.ts -var Bi = 1, Vi = null, Hi = null; -function Ui() { - return Vi ||= import("./chunks/viewerOpenRequest-CCFPrnGk.js").then((e) => e.n), Vi; +var Hi = 1, Ui = null, Wi = null; +function Gi() { + return Ui ||= import("./chunks/viewerOpenRequest-Crw9UWH5.js").then((e) => e.n), Ui; } -function Wi() { - return Hi ||= import("./chunks/floatingViewerManager-DKOeP6-T.js").then((e) => e.n), Hi; +function Ki() { + return Wi ||= import("./chunks/floatingViewerManager-Gv7MTmpu.js").then((e) => e.n), Wi; } -function Gi(e) { +function qi(e) { let t = String(e || "").trim().toLowerCase(); return t ? t.includes("open graph map") ? "graph-map" : t.includes("open in floating viewer") || t.includes("open floating viewer") ? "floating-viewer" : t.includes("rename") ? "rename" : t.includes("delete") ? "delete" : "" : ""; } function $(e, t, n, r, { disabled: i = !1, closeOnSelect: a = !0, submenu: o = null } = {}) { return { - id: `mjr-grid-menu-item-${Bi++}`, + id: `mjr-grid-menu-item-${Hi++}`, type: "item", label: String(e || ""), iconClass: t ? String(t) : "", rightHint: n ? String(n) : "", - tone: Gi(e), + tone: qi(e), disabled: !!i, closeOnSelect: a, submenu: Array.isArray(o) && o.length ? o : null, action: typeof r == "function" ? r : null }; } -function Ki() { +function Ji() { return { - id: `mjr-grid-menu-separator-${Bi++}`, + id: `mjr-grid-menu-separator-${Hi++}`, type: "separator" }; } -var qi = (e) => { +var Yi = (e) => { let t = /* @__PURE__ */ new Set(); if (!e) return t; try { @@ -1412,7 +1412,7 @@ var qi = (e) => { console.debug?.(e); } return t; -}, Ji = (e) => { +}, Xi = (e) => { let t = []; if (!e) return t; try { @@ -1448,7 +1448,7 @@ var qi = (e) => { } return t; }; -async function Yi(e) { +async function Zi(e) { let t = String(e?.filepath || e?.path || e?.full_path || "").trim(); if (!t) return e; try { @@ -1467,53 +1467,53 @@ async function Yi(e) { return console.debug?.(t), e; } } -var Xi = (e) => { +var Qi = (e) => { try { let t = e?.filepath || e?.path || e?.file_info?.filepath || ""; return t ? String(t) : ""; } catch { return ""; } -}, Zi = (e) => { +}, $i = (e) => { if (!e || typeof e != "object") return null; let t = String(e.filename || "").trim(); return t ? { filename: t, subfolder: e.subfolder || "", type: String(e.type || e.source || "output").toLowerCase(), - root_id: Me(e) || void 0, + root_id: ze(e) || void 0, kind: String(e.kind || "").toLowerCase() } : null; -}, Qi = (e) => { +}, ea = (e) => { if (!e || typeof e != "object") return null; let t = String(e.filename || e.name || "").trim(); return t ? { filename: t, subfolder: e.subfolder || "", type: String(e.type || e.source || "output").toLowerCase(), - root_id: Me(e) || void 0 + root_id: ze(e) || void 0 } : null; }; -function $i(e, t = "") { +function ta(e, t = "") { if (!e) return; let n = document.createElement("a"); n.href = e, t && (n.download = t), document.body.appendChild(n), n.click(), document.body.removeChild(n); } -async function ea(t) { - let n = (Array.isArray(t) ? t.filter((e) => !ma(e)) : []).map(Qi).filter(Boolean); +async function na(t) { + let n = (Array.isArray(t) ? t.filter((e) => !ga(e)) : []).map(ea).filter(Boolean); if (n.length < 2) { e("Select at least two files to download a ZIP.", "warning", 2600); return; } let r = ""; try { - r = Ke("mjr_", 24); + r = Re("mjr_", 24); } catch (t) { P(t, "[GridContextMenu] Batch ZIP token", { showToast: B.DEBUG_VERBOSE_ERRORS }), e("Could not create a secure ZIP token.", "error"); return; } e(`Preparing ZIP for ${n.length} files...`, "info", 1800); - let i = await L(st.BATCH_ZIP_CREATE, { + let i = await L(it.BATCH_ZIP_CREATE, { token: r, items: n, strip_metadata: !1 @@ -1523,15 +1523,15 @@ async function ea(t) { return; } let a = i?.data?.filename || `Majoor_Batch_${n.length}.zip`; - $i(Qe(r), a), e(`Downloading ${a}...`, "info", 3e3); + ta(tt(r), a), e(`Downloading ${a}...`, "info", 3e3); } -async function ta(e) { +async function ra(e) { let t = Array.isArray(e) ? e.filter(Boolean) : [], n = await Promise.all(t.map(async (e) => { - let t = Zi(e); + let t = $i(e); if (!t) return null; - let n = (await Vn({ + let n = (await Un({ post: L, - endpoint: st.STAGE_TO_INPUT, + endpoint: it.STAGE_TO_INPUT, payload: t, index: !1 }))?.relativePath; @@ -1542,12 +1542,12 @@ async function ta(e) { } : null; })); return mn({ - app: $e(), + app: Ze(), items: n.filter(Boolean), event: null }); } -var na = (e) => { +var ia = (e) => { if (e) { try { if (typeof e?._mjrSetSelection == "function") e._mjrSetSelection([], ""); @@ -1564,10 +1564,10 @@ var na = (e) => { warnPrefix: "[GridContextMenu]" }); } -}, ra = (e, t, n, r) => { +}, aa = (e, t, n, r) => { if (!e) return; try { - na(e); + ia(e); } catch (e) { console.debug?.(e); } @@ -1587,7 +1587,7 @@ var na = (e) => { } catch (e) { console.debug?.(e); } -}, ia = (e) => { +}, oa = (e) => { let t = []; if (!e) return t; try { @@ -1609,7 +1609,7 @@ var na = (e) => { console.debug?.(e); } return t; -}, aa = (e, t) => { +}, sa = (e, t) => { try { let n = String(t ?? ""); return (e || []).findIndex((e) => String(e?.id ?? "") === n); @@ -1617,7 +1617,7 @@ var na = (e) => { return -1; } }; -function oa(e) { +function ca(e) { if (e == null) return null; try { return document.querySelector(`[data-mjr-asset-id="${yt(e)}"]`); @@ -1625,8 +1625,8 @@ function oa(e) { return console.debug?.(e), null; } } -function sa(e, t = null) { - let n = oa(e?.id); +function la(e, t = null) { + let n = ca(e?.id); if (!n || !n._mjrAsset || typeof n._mjrAsset != "object") return n; try { t && typeof t == "object" ? Object.assign(n._mjrAsset, t) : e && typeof e == "object" && Object.assign(n._mjrAsset, e); @@ -1635,7 +1635,7 @@ function sa(e, t = null) { } return n; } -var ca = (e) => { +var ua = (e) => { try { let t = e ? "grid-contextmenu" : "grid-contextmenu-global"; window?.dispatchEvent?.(new CustomEvent("mjr:reload-grid", { detail: { reason: t } })); @@ -1643,7 +1643,7 @@ var ca = (e) => { console.debug?.(e); } }; -async function la(e, t) { +async function da(e, t) { if (!e) return { ok: !1, error: "Missing asset" @@ -1658,7 +1658,7 @@ async function la(e, t) { ok: !1, error: "Missing filename" }; - let r = await L(st.INDEX_FILES, { + let r = await L(it.INDEX_FILES, { files: [n], incremental: !1 }); @@ -1670,7 +1670,7 @@ async function la(e, t) { let t = await I(e.id); if (t?.ok && t?.data && typeof t.data == "object") { Object.assign(e, t.data); - let n = sa(e, t.data), r = n?.querySelector?.(".mjr-workflow-dot"); + let n = la(e, t.data), r = n?.querySelector?.(".mjr-workflow-dot"); if (r) { let e = Et(n._mjrAsset); e && r.replaceWith(e); @@ -1679,12 +1679,12 @@ async function la(e, t) { } catch (e) { console.debug?.(e); } - return ca(t), { + return ua(t), { ok: !0, data: { refreshed: !0 } }; } -function ua(e, t, n) { +function fa(e, t, n) { let r = e?.id; try { e.rating = t; @@ -1713,29 +1713,29 @@ function ua(e, t, n) { P(e, "[GridContextMenu] Rating update", { showToast: B.DEBUG_VERBOSE_ERRORS }); }); } -function da(e) { +function pa(e) { let t = String(e?.scope || "").toLowerCase(); return t === "custom" || t === "input" || t === "output"; } -function fa() { +function ma() { try { - return !!(Jt()?.browser?.showFolders ?? !1); + return !!(Vn()?.browser?.showFolders ?? !1); } catch { return !1; } } -function pa(e) { +function ha(e) { return String(e?.scope || "").toLowerCase() === "workflow"; } -function ma(e) { +function ga(e) { return String(e?.kind || "").toLowerCase() === "folder"; } -function ha(e) { +function _a(e) { return String(e?.kind || "").toLowerCase() === "workflow"; } -function ga(e) { - if (!e || ma(e) || ha(e)) return !1; - let t = Xi(e); +function va(e) { + if (!e || ga(e) || _a(e)) return !1; + let t = Qi(e); if (!t) return !1; let n = String(e?.kind || "").toLowerCase(); if (n === "image" || n === "video") return !0; @@ -1754,27 +1754,27 @@ function ga(e) { "m4v" ].includes(r); } -async function _a(e) { - if (!e || ma(e)) return null; - let t = Kn(e); +async function ya(e) { + if (!e || ga(e)) return null; + let t = Jn(e); if (t) return t; let n = e?.id; if (n == null || n === "") return null; try { let t = await I(n, { timeoutMs: 3e4 }), r = t?.data; - if (t?.ok && r && typeof r == "object") return Object.assign(e, r), Kn(e); + if (t?.ok && r && typeof r == "object") return Object.assign(e, r), Jn(e); } catch (e) { console.debug?.(e); } return null; } -async function va(t) { - let n = await _a(t); +async function ba(t) { + let n = await ya(t); if (!n || typeof n != "object") { e(R("toast.assetWorkflowMissing", "No embedded ComfyUI workflow was found for this asset."), "warn", 2600); return; } - let r = $e(), i = Ne(n, r); + let r = Ze(), i = Ne(n, r); if (!i.ok) { e(R("toast.workflowImportUnavailable", "ComfyUI workflow import is unavailable in this frontend."), "error"); return; @@ -1782,14 +1782,14 @@ async function va(t) { let a = i.mode === "new-tab" ? R("toast.workflowLoadedNewTab", "Workflow loaded in a new ComfyUI tab.") : R("toast.workflowLoaded", "Workflow loaded"); e(a, "success", 1800); } -async function ya(t) { +async function xa(t) { let n = String(t?.filepath || t?.path || t?.full_path || "").trim(); if (!n) { e(R("toast.workflowMissingPath", "Workflow file path is missing."), "error"); return; } - let r = $e(); - if (Le(r) === !0 && !await Ut(R("dialog.workflowLoadReplaceDirty", "Current canvas has unsaved changes. Replace it with this workflow?"), R("tab.workflow", "Workflow"))) return; + let r = Ze(); + if (Ie(r) === !0 && !await Ut(R("dialog.workflowLoadReplaceDirty", "Current canvas has unsaved changes. Replace it with this workflow?"), R("tab.workflow", "Workflow"))) return; let i = await y(n, { timeoutMs: 3e4 }), o = i?.data?.workflow || i?.workflow || null; if (!i?.ok || !o || typeof o != "object") { e(i?.error || R("toast.workflowLoadFailed", "Failed to load workflow."), "error"); @@ -1804,7 +1804,7 @@ async function ya(t) { } e(R("toast.workflowLoaded", "Workflow loaded"), "success", 1800); } else { - let t = qe(n, { inline: !0 }); + let t = ct(n, { inline: !0 }); try { t && typeof window < "u" && window.open(t, "_blank", "noopener,noreferrer"); } catch (e) { @@ -1813,36 +1813,36 @@ async function ya(t) { e(R("toast.workflowImportFallback", "ComfyUI workflow import is unavailable in this frontend. Opened workflow JSON for manual import."), "warn"), s.mode === "new-tab" && e(R("toast.workflowLoadedNewTab", "Workflow loaded in a new ComfyUI tab."), "success"); } } -function ba(e) { +function Sa(e) { try { window.dispatchEvent(new CustomEvent("mjr:reload-grid", { detail: { reason: e } })); } catch (e) { console.debug?.(e); } } -async function xa(t) { +async function Ca(t) { let n = String(t?.filepath || "").trim(), r = await le({ filepath: n }, { timeoutMs: 3e4 }); - r?.ok ? (e(R("toast.workflowSaved", "Workflow saved"), "success", 1800), ba("workflow-duplicate")) : e(r?.error || R("toast.workflowSaveFailed", "Failed to save workflow."), "error"); + r?.ok ? (e(R("toast.workflowSaved", "Workflow saved"), "success", 1800), Sa("workflow-duplicate")) : e(r?.error || R("toast.workflowSaveFailed", "Failed to save workflow."), "error"); } -async function Sa(t) { +async function wa(t) { let n = String(t?.filepath || "").trim(), r = String(t?.display_name || t?.filename || "").replace(/\.json$/i, ""), i = await wt(R("ctx.renameWorkflow", "Rename workflow"), r, R("tab.workflow", "Workflow")), a = String(i || "").trim(); if (!a) return; let o = await g({ filepath: n, name: a }, { timeoutMs: 3e4 }); - o?.ok ? (e(R("toast.workflowUpdated", "Workflow updated"), "success", 1800), ba("workflow-rename")) : e(o?.error || R("toast.workflowSaveFailed", "Failed to save workflow."), "error"); + o?.ok ? (e(R("toast.workflowUpdated", "Workflow updated"), "success", 1800), Sa("workflow-rename")) : e(o?.error || R("toast.workflowSaveFailed", "Failed to save workflow."), "error"); } -async function Ca(t) { +async function Ta(t) { let n = String(t?.filepath || "").trim(), r = String(t?.subfolder || "").trim(), i = await wt(R("dialog.workflowCategory", "Workflow category"), r, R("tab.workflow", "Workflow")); if (i == null) return; let a = await g({ filepath: n, category: String(i || "") }, { timeoutMs: 3e4 }); - a?.ok ? (e(R("toast.workflowUpdated", "Workflow updated"), "success", 1800), ba("workflow-categorize")) : e(a?.error || R("toast.workflowSaveFailed", "Failed to save workflow."), "error"); + a?.ok ? (e(R("toast.workflowUpdated", "Workflow updated"), "success", 1800), Sa("workflow-categorize")) : e(a?.error || R("toast.workflowSaveFailed", "Failed to save workflow."), "error"); } -async function wa(t) { +async function Ea(t) { let n = String(t?.filepath || "").trim(); if (!n) { e(R("toast.noFilePath"), "error"); @@ -1871,9 +1871,9 @@ async function wa(t) { filepath: n, source_filepath: a.filepath }, { timeoutMs: 3e4 }); - o?.ok ? (e(R("toast.workflowUpdated", "Workflow updated"), "success", 1800), ba("workflow-thumbnail")) : e(o?.error || R("toast.workflowSaveFailed", "Failed to save workflow."), "error"); + o?.ok ? (e(R("toast.workflowUpdated", "Workflow updated"), "success", 1800), Sa("workflow-thumbnail")) : e(o?.error || R("toast.workflowSaveFailed", "Failed to save workflow."), "error"); } -async function Ta(t) { +async function Da(t) { let n = String(t?.filepath || "").trim(); if (!n) { e(R("toast.workflowMissingPath", "Workflow file path is missing."), "error"); @@ -1897,7 +1897,7 @@ async function Ta(t) { setTimeout(() => URL.revokeObjectURL(s), 5e3); } } -async function Ea(t) { +async function Oa(t) { let n = String(t?.filepath || "").trim(); if (!n) { e(R("toast.workflowMissingPath", "Workflow file path is missing."), "error"); @@ -1906,8 +1906,8 @@ async function Ea(t) { let r = await ne({ filepath: n }); r?.ok ? e(R("toast.openedInFolder", "Opened in folder"), "success", 1600) : e(r?.error || R("toast.openFolderFailed", "Failed to open folder."), "error"); } -async function Da(t) { - let n = Xi(t); +async function ka(t) { + let n = Qi(t); if (!n) { e(R("toast.noFilePath"), "error"); return; @@ -1923,16 +1923,16 @@ async function Da(t) { filepath: i, source_filepath: n }, { timeoutMs: a ? 75e3 : 3e4 }); - o?.ok ? (e(R("toast.workflowUpdated", "Workflow updated"), "success", 1800), ba("workflow-thumbnail-assign")) : e(o?.error || R("toast.workflowSaveFailed", "Failed to save workflow."), "error"); + o?.ok ? (e(R("toast.workflowUpdated", "Workflow updated"), "success", 1800), Sa("workflow-thumbnail-assign")) : e(o?.error || R("toast.workflowSaveFailed", "Failed to save workflow."), "error"); } -async function Oa(t) { +async function Aa(t) { let n = String(t?.filepath || "").trim(); if (!await Ut(R("dialog.deleteWorkflowConfirm", "Delete this workflow JSON and its adjacent thumbnail files?"), R("ctx.deleteWorkflow", "Delete workflow"))) return; let r = await te({ filepath: n }, { timeoutMs: 3e4 }); - r?.ok ? (e(R("toast.workflowDeleted", "Workflow deleted"), "success", 1800), ba("workflow-delete")) : e(r?.error || R("toast.fileDeleteFailed", "Failed to delete file."), "error"); + r?.ok ? (e(R("toast.workflowDeleted", "Workflow deleted"), "success", 1800), Sa("workflow-delete")) : e(r?.error || R("toast.fileDeleteFailed", "Failed to delete file."), "error"); } -function ka(e) { - let t = qi(e), n = Ji(e), r = n.length || t.size; +function ja(e) { + let t = Yi(e), n = Xi(e), r = n.length || t.size; return { selectedIds: t, selectedAssetsNow: n, @@ -1941,59 +1941,59 @@ function ka(e) { hasSelection: r > 0 }; } -function Aa(e, t) { +function Ma(e, t) { let n = (e) => "*".repeat(e) + "o".repeat(Math.max(0, 5 - e)), r = (t) => { - sa(e, { rating: t }); + la(e, { rating: t }); }; return [ $(n(5), "pi pi-star", null, async () => { - ua(e, 5, () => r(5)); + fa(e, 5, () => r(5)); }, { disabled: !t }), $(n(4), "pi pi-star", null, async () => { - ua(e, 4, () => r(4)); + fa(e, 4, () => r(4)); }, { disabled: !t }), $(n(3), "pi pi-star", null, async () => { - ua(e, 3, () => r(3)); + fa(e, 3, () => r(3)); }, { disabled: !t }), $(n(2), "pi pi-star", null, async () => { - ua(e, 2, () => r(2)); + fa(e, 2, () => r(2)); }, { disabled: !t }), $(n(1), "pi pi-star", null, async () => { - ua(e, 1, () => r(1)); + fa(e, 1, () => r(1)); }, { disabled: !t }), - Ki(), + Ji(), $(R("ctx.resetRating", "Reset rating"), "pi pi-star", "0", async () => { - ua(e, 0, () => r(0)); + fa(e, 0, () => r(0)); }, { disabled: !t }) ]; } -function ja(e, t) { +function Na(e, t) { let n = String(t?.dataset?.mjrScope || "").toLowerCase(); if (n !== "input" && n !== "output") return e; let r = String(e || "").trim().replaceAll("\\", "/"); return r ? `mjr://${n}/${r}` : `mjr://${n}`; } -function Ma({ currentPath: t, gridContainer: n } = {}) { +function Pa({ currentPath: t, gridContainer: n } = {}) { return [$(R("ctx.createFolderHere", "Create folder here..."), "pi pi-plus", null, async () => { try { let r = await wt(R("dialog.newFolderName", "New folder name"), ""), i = String(r || "").trim(); if (!i) return; let a = await Oe({ op: "create", - path: ja(t, n), + path: Na(t, n), name: i }); if (!a?.ok) { e(a?.error || "Failed to create folder", "error"); return; } - ca(n), e(R("toast.folderCreated", "Folder created: {name}", { name: i }), "success"); + ua(n), e(R("toast.folderCreated", "Folder created: {name}", { name: i }), "success"); } catch (t) { e(R("toast.createFolderFailedDetail", "Create folder failed: {error}", { error: t?.message || String(t || "") }), "error"); } })]; } -function Na({ asset: t, gridContainer: n, panelState: r } = {}) { +function Fa({ asset: t, gridContainer: n, panelState: r } = {}) { let i = String(t?.filepath || "").trim(), a = [$(R("ctx.openFolder", "Open folder"), "pi pi-folder-open", null, () => { try { n.dispatchEvent(new CustomEvent("mjr:open-folder-asset", { @@ -2008,7 +2008,7 @@ function Na({ asset: t, gridContainer: n, panelState: r } = {}) { e(R("toast.unableResolveFolderPath"), "error"); return; } - let n = await wt(R("dialog.browserRootLabelOptional"), String(t?.filename || "")), r = await L(st.CUSTOM_ROOTS, { + let n = await wt(R("dialog.browserRootLabelOptional"), String(t?.filename || "")), r = await L(it.CUSTOM_ROOTS, { path: i, label: String(n || "").trim() || void 0 }); @@ -2022,7 +2022,7 @@ function Na({ asset: t, gridContainer: n, panelState: r } = {}) { } } })]; - return da(r) && i && a.push(Ki(), $(R("ctx.createFolderHere"), "pi pi-plus", null, async () => { + return pa(r) && i && a.push(Ji(), $(R("ctx.createFolderHere"), "pi pi-plus", null, async () => { try { let t = await wt(R("dialog.newFolderName"), ""), r = String(t || "").trim(); if (!r) return; @@ -2035,7 +2035,7 @@ function Na({ asset: t, gridContainer: n, panelState: r } = {}) { e(a?.error || R("toast.createFolderFailed"), "error"); return; } - ca(n), e(R("toast.folderCreated", { name: r }), "success"); + ua(n), e(R("toast.folderCreated", { name: r }), "success"); } catch (t) { e(R("toast.createFolderFailedDetail", { error: t?.message || String(t || "") }), "error"); } @@ -2052,7 +2052,7 @@ function Na({ asset: t, gridContainer: n, panelState: r } = {}) { e(s?.error || R("toast.renameFolderFailed"), "error"); return; } - ca(n), e(R("toast.folderRenamed"), "success"); + ua(n), e(R("toast.folderRenamed"), "success"); } catch (t) { e(R("toast.renameFolderFailedDetail", { error: t?.message || String(t || "") }), "error"); } @@ -2069,7 +2069,7 @@ function Na({ asset: t, gridContainer: n, panelState: r } = {}) { e(a?.error || R("toast.moveFolderFailed"), "error"); return; } - ca(n), e(R("toast.folderMoved"), "success"); + ua(n), e(R("toast.folderMoved"), "success"); } catch (t) { e(R("toast.moveFolderFailedDetail", { error: t?.message || String(t || "") }), "error"); } @@ -2086,22 +2086,22 @@ function Na({ asset: t, gridContainer: n, panelState: r } = {}) { e(a?.error || R("toast.deleteFolderFailed"), "error"); return; } - ca(n), e(R("toast.folderDeleted"), "success"); + ua(n), e(R("toast.folderDeleted"), "success"); } catch (t) { e(R("toast.deleteFolderFailedDetail", { error: t?.message || String(t || "") }), "error"); } })), a; } -function Pa({ asset: t, card: r, gridContainer: i, panelState: a, pointerX: o, pointerY: s, selection: c } = {}) { - let { selectedAssetsNow: u, effectiveSelectionCount: d, isMultiSelected: f, hasSelection: p } = c, m = [], h = pa(a), g = ({ assets: e = [], index: t = 0, mode: n = "" } = {}) => Ui().then((r) => r.requestViewerOpen({ +function Ia({ asset: t, card: r, gridContainer: i, panelState: a, pointerX: o, pointerY: s, selection: c } = {}) { + let { selectedAssetsNow: u, effectiveSelectionCount: d, isMultiSelected: f, hasSelection: p } = c, m = [], h = ha(a), g = ({ assets: e = [], index: t = 0, mode: n = "" } = {}) => Gi().then((r) => r.requestViewerOpen({ assets: e, index: t, mode: n })).catch((e) => console.debug?.(e)); - if (ha(t)) { - if (m.push($(R("ctx.loadWorkflow", "Load workflow"), "pi pi-sitemap", null, () => ya(t)), $(R("ctx.duplicateWorkflow", "Duplicate workflow"), "pi pi-copy", null, () => xa(t)), $(R("ctx.renameWorkflow", "Rename workflow"), "pi pi-pencil", null, () => Sa(t)), $(R("ctx.categorizeWorkflow", "Set workflow category"), "pi pi-folder", null, () => Ca(t)), $(R("ctx.setWorkflowThumbnail", "Set workflow thumbnail"), "pi pi-image", null, () => wa(t)), $(R("ctx.editWorkflowInfo", "Edit infos"), "pi pi-info-circle", null, () => Ri(t)), $(R("ctx.exportWorkflow", "Export workflow"), "pi pi-download", null, () => Ta(t)), $(R("ctx.showInExplorer", "Show in Explorer"), "pi pi-folder-open", null, () => Ea(t)), $(R("ctx.deleteWorkflow", "Delete workflow"), "pi pi-trash", null, () => Oa(t)), Ki()), h) return m.push($("Open Graph Map", "pi pi-sitemap", null, async () => { + if (_a(t)) { + if (m.push($(R("ctx.loadWorkflow", "Load workflow"), "pi pi-sitemap", null, () => xa(t)), $(R("ctx.duplicateWorkflow", "Duplicate workflow"), "pi pi-copy", null, () => Ca(t)), $(R("ctx.renameWorkflow", "Rename workflow"), "pi pi-pencil", null, () => wa(t)), $(R("ctx.categorizeWorkflow", "Set workflow category"), "pi pi-folder", null, () => Ta(t)), $(R("ctx.setWorkflowThumbnail", "Set workflow thumbnail"), "pi pi-image", null, () => Ea(t)), $(R("ctx.editWorkflowInfo", "Edit infos"), "pi pi-info-circle", null, () => Bi(t)), $(R("ctx.exportWorkflow", "Export workflow"), "pi pi-download", null, () => Da(t)), $(R("ctx.showInExplorer", "Show in Explorer"), "pi pi-folder-open", null, () => Oa(t)), $(R("ctx.deleteWorkflow", "Delete workflow"), "pi pi-trash", null, () => Aa(t)), Ji()), h) return m.push($("Open Graph Map", "pi pi-sitemap", null, async () => { try { - let e = await Yi(t), { floatingViewerManager: n } = await Wi(); + let e = await Zi(t), { floatingViewerManager: n } = await Ki(); await n.openAssets({ assets: [e], index: 0, @@ -2112,9 +2112,9 @@ function Pa({ asset: t, card: r, gridContainer: i, panelState: a, pointerX: o, p } })), m; } else if (h) return m; - m.push($("Open As New Tab", "pi pi-external-link", null, () => va(t)), $("Open Viewer", "pi pi-image", Ii("OPEN_VIEWER"), () => { + m.push($("Open As New Tab", "pi pi-external-link", null, () => ba(t)), $("Open Viewer", "pi pi-image", Ri("OPEN_VIEWER"), () => { try { - let e = (p ? Ji(i) : []).filter((e) => !ma(e)), n = e.length; + let e = (p ? Xi(i) : []).filter((e) => !ga(e)), n = e.length; if (n >= 2 && n <= 4) { g({ assets: e, @@ -2122,7 +2122,7 @@ function Pa({ asset: t, card: r, gridContainer: i, panelState: a, pointerX: o, p }); return; } - let r = ia(i).filter((e) => !ma(e)), a = aa(r, t?.id); + let r = oa(i).filter((e) => !ga(e)), a = sa(r, t?.id); if (!r.length || a < 0) return; g({ assets: r, @@ -2131,9 +2131,9 @@ function Pa({ asset: t, card: r, gridContainer: i, panelState: a, pointerX: o, p } catch (e) { console.debug?.(e); } - }), $("Open in Floating Viewer", "pi pi-window-maximize", Ii("OPEN_FLOATING_VIEWER"), async () => { + }), $("Open in Floating Viewer", "pi pi-window-maximize", Ri("OPEN_FLOATING_VIEWER"), async () => { try { - let { floatingViewerManager: e } = await Wi(), n = (p ? Ji(i) : []).filter((e) => !ma(e)); + let { floatingViewerManager: e } = await Ki(), n = (p ? Xi(i) : []).filter((e) => !ga(e)); if (n.length) { await e.openAssets({ assets: n, @@ -2149,11 +2149,11 @@ function Pa({ asset: t, card: r, gridContainer: i, panelState: a, pointerX: o, p console.debug?.(e); } }), $("Load Asset", "pi pi-upload", "L / L+Drop", async () => { - let n = (p ? Ji(i) : []).filter((e) => !ma(e)); - await ta(n.length ? n : [t]) || e("Failed to create a loader node for this asset.", "error"); + let n = (p ? Xi(i) : []).filter((e) => !ga(e)); + await ra(n.length ? n : [t]) || e("Failed to create a loader node for this asset.", "error"); }), $("Open Graph Map", "pi pi-sitemap", null, async () => { try { - let e = await Yi(t), { floatingViewerManager: n } = await Wi(); + let e = await Zi(t), { floatingViewerManager: n } = await Ki(); await n.openAssets({ assets: [e], index: 0, @@ -2162,17 +2162,17 @@ function Pa({ asset: t, card: r, gridContainer: i, panelState: a, pointerX: o, p } catch (e) { console.debug?.(e); } - }), $(R("ctx.showMetadataPanel", "Show metadata panel"), "pi pi-info-circle", Ii("METADATA_PANEL"), () => { + }), $(R("ctx.showMetadataPanel", "Show metadata panel"), "pi pi-info-circle", Ri("METADATA_PANEL"), () => { try { - ra(i, r, t, a); + aa(i, r, t, a); let e = i?._mjrOpenDetails; typeof e == "function" && e(); } catch (e) { console.debug?.(e); } - })), ga(t) && m.push($(R("ctx.assignAsWorkflowThumbnail", "Use as workflow thumbnail"), "pi pi-image", null, () => Da(t))); - let _ = (p ? u : []).filter((e) => !ma(e)), v = _.length; - v === 2 && m.push($("Compare A/B (2 selected)", "pi pi-clone", Ii("COMPARE_AB"), () => { + })), va(t) && m.push($(R("ctx.assignAsWorkflowThumbnail", "Use as workflow thumbnail"), "pi pi-image", null, () => ka(t))); + let _ = (p ? u : []).filter((e) => !ga(e)), v = _.length; + v === 2 && m.push($("Compare A/B (2 selected)", "pi pi-clone", Ri("COMPARE_AB"), () => { try { g({ assets: _, @@ -2182,7 +2182,7 @@ function Pa({ asset: t, card: r, gridContainer: i, panelState: a, pointerX: o, p } catch (e) { console.debug?.(e); } - })), v >= 2 && v <= 4 && m.push($(`Side-by-side (2x2) (${v} selected)`, "pi pi-table", Ii("SIDE_BY_SIDE"), () => { + })), v >= 2 && v <= 4 && m.push($(`Side-by-side (2x2) (${v} selected)`, "pi pi-table", Ri("SIDE_BY_SIDE"), () => { try { g({ assets: _, @@ -2192,10 +2192,10 @@ function Pa({ asset: t, card: r, gridContainer: i, panelState: a, pointerX: o, p } catch (e) { console.debug?.(e); } - })), m.push($(R("ctx.openInFolder", "Open in folder"), "pi pi-folder-open", Ii("OPEN_IN_FOLDER"), async () => { + })), m.push($(R("ctx.openInFolder", "Open in folder"), "pi pi-folder-open", Ri("OPEN_IN_FOLDER"), async () => { let n = await ne(t); n?.ok ? e(R("toast.openedInFolder"), "info", 2e3) : e(n?.error || R("toast.openFolderFailed"), "error"); - }, { disabled: !(t?.id || Xi(t)) }), $(R("ctx.collectFiles", "Collect files"), "pi pi-box", null, async () => { + }, { disabled: !(t?.id || Qi(t)) }), $(R("ctx.collectFiles", "Collect files"), "pi pi-box", null, async () => { e(R("toast.collectingFiles", "Collecting files..."), "info", 2500); let r = await n(t); if (!r?.ok) { @@ -2207,7 +2207,7 @@ function Pa({ asset: t, card: r, gridContainer: i, panelState: a, pointerX: o, p where: o }); a > 0 && (s += ` — ${a} ${R("toast.collectMissingInputs", "input(s) missing")}`), e(s, a > 0 ? "warning" : "success", 6e3); - }, { disabled: !Xi(t) }), $(R("ctx.copyPath", "Copy path"), "pi pi-copy", Ii("COPY_PATH"), async () => { + }, { disabled: !Qi(t) }), $(R("ctx.copyPath", "Copy path"), "pi pi-copy", Ri("COPY_PATH"), async () => { let n = t?.filepath ? String(t.filepath) : ""; if (!n) e(R("toast.noFilePath"), "error"); else try { @@ -2215,14 +2215,14 @@ function Pa({ asset: t, card: r, gridContainer: i, panelState: a, pointerX: o, p } catch (t) { console.warn(R("log.clipboardCopyFailed", "Clipboard copy failed"), t), e(R("toast.pathCopyFailed"), "error"); } - }), $(R("ctx.download", "Download"), "pi pi-download", Ii("DOWNLOAD"), () => { + }), $(R("ctx.download", "Download"), "pi pi-download", Ri("DOWNLOAD"), () => { if (!t?.filepath) return; - let n = qe(t.filepath), r = t.filename || "download"; - $i(n, r), e(R("toast.downloadingFile", "Downloading {filename}...", { filename: r }), "info", 3e3); + let n = ct(t.filepath), r = t.filename || "download"; + ta(n, r), e(R("toast.downloadingFile", "Downloading {filename}...", { filename: r }), "info", 3e3); }, { disabled: !t?.filepath }), $(`Download selected as ZIP (${v})`, "pi pi-file-zip", null, async () => { - await ea(_); - }, { disabled: v < 2 }), $("Add to collection...", "pi pi-bookmark", Ii("ADD_TO_COLLECTION"), async () => { - let e = Ji(i), n = e.length ? e : [t]; + await na(_); + }, { disabled: v < 2 }), $("Add to collection...", "pi pi-bookmark", Ri("ADD_TO_COLLECTION"), async () => { + let e = Xi(i), n = e.length ? e : [t]; await Rt({ x: o, y: s, @@ -2231,37 +2231,37 @@ function Pa({ asset: t, card: r, gridContainer: i, panelState: a, pointerX: o, p })); let y = String(a?.collectionId || "").trim(); if (y) { - let n = Ji(i), r = (n.length ? n : [t]).map(Xi).filter(Boolean), a = r.length > 1 ? `Remove from collection (${r.length})` : "Remove from collection"; + let n = Xi(i), r = (n.length ? n : [t]).map(Qi).filter(Boolean), a = r.length > 1 ? `Remove from collection (${r.length})` : "Remove from collection"; m.push($(a, "pi pi-bookmark", null, async () => { if (!r.length) { e(R("toast.noFilePath"), "error"); return; } let t = await k(y, r); - t?.ok ? ca(i) : e(t?.error || R("toast.removeFromCollectionFailed"), "error"); + t?.ok ? ua(i) : e(t?.error || R("toast.removeFromCollectionFailed"), "error"); })); } - let b = !!(t?.id || Xi(t)); - return m.push(Ki(), $(R("ctx.editTags", "Edit tags"), "pi pi-tags", Ii("EDIT_TAGS"), () => { - Fa(o + 6, s + 6, t, () => { - sa(t, { tags: Array.isArray(t?.tags) ? [...t.tags] : [] }); + let b = !!(t?.id || Qi(t)); + return m.push(Ji(), $(R("ctx.editTags", "Edit tags"), "pi pi-tags", Ri("EDIT_TAGS"), () => { + La(o + 6, s + 6, t, () => { + la(t, { tags: Array.isArray(t?.tags) ? [...t.tags] : [] }); }); - }, { closeOnSelect: !1 }), Ki(), $(R("ctx.setRating", "Set rating"), "pi pi-star", "1-5 >", null, { + }, { closeOnSelect: !1 }), Ji(), $(R("ctx.setRating", "Set rating"), "pi pi-star", "1-5 >", null, { disabled: !b, closeOnSelect: !1, - submenu: Aa(t, b) - }), Ki(), $(R("ctx.resetIndexFile", "Reset index (this file)"), "pi pi-refresh", null, async () => { + submenu: Ma(t, b) + }), Ji(), $(R("ctx.resetIndexFile", "Reset index (this file)"), "pi pi-refresh", null, async () => { if (t?.filename || t?.id) { e(R("toast.rescanningFile", "Rescanning file..."), "info", 1600); try { - let n = await la(t, i); + let n = await da(t, i); n?.ok ? e(R("toast.metadataRefreshed", "Metadata refreshed{suffix}", { suffix: "" }), "success", 1800) : e(n?.error || R("toast.resetFailed", "Failed to reset index"), "error"); } catch (t) { e(`${R("toast.resetFailed", "Failed to reset index")}: ${t?.message || String(t || "")}`, "error"); } } - }, { disabled: !(t?.filename || t?.id) }), $("Rename...", "pi pi-pencil", Ii("RENAME"), async () => { - if (!(t?.id || Xi(t))) return; + }, { disabled: !(t?.filename || t?.id) }), $("Rename...", "pi pi-pencil", Ri("RENAME"), async () => { + if (!(t?.id || Qi(t))) return; let n = t.filename || "", r = await wt(R("dialog.rename.title", "Rename file"), n), a = vt(r, n); if (!a || a === n) return; let o = Ot(a); @@ -2273,33 +2273,33 @@ function Pa({ asset: t, card: r, gridContainer: i, panelState: a, pointerX: o, p return; } let r = n?.data?.asset; - r && typeof r == "object" ? (Object.assign(t, r), sa(t, r)) : (t.filename = a, t.filepath &&= String(t.filepath).replace(/[^\\/]+$/, a), t.path &&= String(t.path).replace(/[^\\/]+$/, a), t.file_info && typeof t.file_info == "object" && (t.file_info.filename = a, t.file_info.filepath && (t.file_info.filepath = String(t.file_info.filepath).replace(/[^\\/]+$/, a)), t.file_info.path && (t.file_info.path = String(t.file_info.path).replace(/[^\\/]+$/, a))), sa(t, { + r && typeof r == "object" ? (Object.assign(t, r), la(t, r)) : (t.filename = a, t.filepath &&= String(t.filepath).replace(/[^\\/]+$/, a), t.path &&= String(t.path).replace(/[^\\/]+$/, a), t.file_info && typeof t.file_info == "object" && (t.file_info.filename = a, t.file_info.filepath && (t.file_info.filepath = String(t.file_info.filepath).replace(/[^\\/]+$/, a)), t.file_info.path && (t.file_info.path = String(t.file_info.path).replace(/[^\\/]+$/, a))), la(t, { filename: t.filename, filepath: t.filepath, path: t.path, file_info: t.file_info })); - let o = oa(t.id)?.querySelector?.(".mjr-filename"); - o && (o.textContent = t.filename || a), e(R("toast.fileRenamedSuccess"), "success"), ca(i); + let o = ca(t.id)?.querySelector?.(".mjr-filename"); + o && (o.textContent = t.filename || a), e(R("toast.fileRenamedSuccess"), "success"), ua(i); } catch (t) { e(R("toast.errorRenaming", "Error renaming file: {error}", { error: t?.message || String(t || "") }), "error"); } - }, { disabled: !(t?.id || Xi(t)) })), f ? m.push($(`Delete ${d} files...`, "pi pi-trash", Ii("DELETE"), async () => { + }, { disabled: !(t?.id || Qi(t)) })), f ? m.push($(`Delete ${d} files...`, "pi pi-trash", Ri("DELETE"), async () => { if (await _t(Number(d) || 0)) try { let n = 0, r = 0, o = [], s = 0, c = u.length ? u : [t]; for (let e of c) (await l(e))?.ok ? (n += 1, e?.id == null ? s += 1 : o.push(String(e.id))) : r += 1; if (o.length) { - let e = Si(i, o); + let e = wi(i, o); a && Array.isArray(e?.selectedIds) && (a.selectedAssetIds = e.selectedIds, a.activeAssetId = e.selectedIds[0] || ""); } - s > 0 && ca(i), r === 0 ? e(R("toast.filesDeletedSuccessN", "{n} files deleted successfully!", { n }), "success") : e(R("toast.filesDeletedPartial", "{success} files deleted, {failed} failed.", { + s > 0 && ua(i), r === 0 ? e(R("toast.filesDeletedSuccessN", "{n} files deleted successfully!", { n }), "success") : e(R("toast.filesDeletedPartial", "{success} files deleted, {failed} failed.", { success: n, failed: r }), "warning"); } catch (t) { e(R("toast.errorDeleting", "Error deleting file: {error}", { error: t?.message || String(t || "") }), "error"); } - })) : m.push($(R("ctx.delete", "Delete"), "pi pi-trash", Ii("DELETE"), async () => { + })) : m.push($(R("ctx.delete", "Delete"), "pi pi-trash", Ri("DELETE"), async () => { if (await _t(1, t?.filename)) try { let n = await l(t); if (!n?.ok) { @@ -2307,24 +2307,24 @@ function Pa({ asset: t, card: r, gridContainer: i, panelState: a, pointerX: o, p return; } if (t?.id) { - let e = Si(i, [String(t.id)]); + let e = wi(i, [String(t.id)]); a && Array.isArray(e?.selectedIds) && (a.selectedAssetIds = e.selectedIds, a.activeAssetId = e.selectedIds[0] || ""); - } else ca(i); + } else ua(i); e(R("toast.fileDeletedSuccess"), "success"); } catch (t) { e(R("toast.errorDeleting", "Error deleting file: {error}", { error: t?.message || String(t || "") }), "error"); } - }, { disabled: !(t?.id || Xi(t)) })), m; + }, { disabled: !(t?.id || Qi(t)) })), m; } -function Fa(e, t, n, r) { - n && Ln({ +function La(e, t, n, r) { + n && Rn({ x: e, y: t, asset: n, onChanged: r }); } -function Ia({ gridContainer: e, getState: t = () => ({}) } = {}) { +function Ra({ gridContainer: e, getState: t = () => ({}) } = {}) { if (!e) return; if (e._mjrGridContextMenuBound && typeof e._mjrGridContextMenuUnbind == "function") return e._mjrGridContextMenuUnbind; let n = async (n) => { @@ -2336,13 +2336,13 @@ function Ia({ gridContainer: e, getState: t = () => ({}) } = {}) { } })(), i = Mt(n.target, ".mjr-asset-card"); if (!i) { - if (!da(r)) return; - let t = String(e?.dataset?.mjrScope || "").toLowerCase(), i = String(e?.dataset?.mjrSubfolder || "").trim(), a = (t === "input" || t === "output") && fa(); + if (!pa(r)) return; + let t = String(e?.dataset?.mjrScope || "").toLowerCase(), i = String(e?.dataset?.mjrSubfolder || "").trim(), a = (t === "input" || t === "output") && ma(); if (!i && !a) return; n.preventDefault(), n.stopPropagation(), tn({ x: n.clientX, y: n.clientY, - items: Ma({ + items: Pa({ currentPath: i, gridContainer: e }) @@ -2352,11 +2352,11 @@ function Ia({ gridContainer: e, getState: t = () => ({}) } = {}) { n.preventDefault(), n.stopPropagation(); let a = i._mjrAsset; if (!a) return; - let o = ka(e), s = ma(a) ? Na({ + let o = ja(e), s = ga(a) ? Fa({ asset: a, gridContainer: e, panelState: r - }) : Pa({ + }) : Ia({ asset: a, card: i, gridContainer: e, @@ -2407,8 +2407,8 @@ function Ia({ gridContainer: e, getState: t = () => ({}) } = {}) { return e._mjrGridContextMenuUnbind = r, r; } // ui/features/panel/controllers/ratingHotkeysController.ts -var La = ot; -function Ra(e) { +var za = ot; +function Ba(e) { let t = String(e ?? ""); try { if (typeof CSS < "u" && typeof CSS.escape == "function") return CSS.escape(t); @@ -2417,10 +2417,10 @@ function Ra(e) { } return t.replace(/([!"#$%&'()*+,./:;<=>?@[\\\]^`{|}~])/g, "\\$1"); } -function za(e, t = null) { +function Va(e, t = null) { if (!e) return []; try { - let t = Array.from(Jn(e)); + let t = Array.from(Xn(e)); if (t.length) return t; } catch (e) { console.debug?.(e); @@ -2433,14 +2433,14 @@ function za(e, t = null) { } return []; } -function Ba(e, t) { +function Ha(e, t) { try { - return e?.querySelector?.(`.mjr-asset-card[data-mjr-asset-id="${Ra(t)}"]`); + return e?.querySelector?.(`.mjr-asset-card[data-mjr-asset-id="${Ba(t)}"]`); } catch (e) { return console.debug?.(e), null; } } -function Va(e, t, n) { +function Ua(e, t, n) { if (!e) return; let r = e._mjrAsset; r && (r.rating = n); @@ -2453,7 +2453,7 @@ function Va(e, t, n) { console.debug?.(e); } } -async function Ha(e, t, n = 5) { +async function Wa(e, t, n = 5) { let r = Math.max(1, Number(n) || 1), i = 0, a = [], o = async () => { for (; i < e.length;) { let n = i; @@ -2468,7 +2468,7 @@ async function Ha(e, t, n = 5) { for (let t = 0; t < Math.min(r, e.length); t += 1) a.push(o()); await Promise.all(a); } -function Ua({ gridContainer: t, createRatingBadge: n } = {}) { +function Ga({ gridContainer: t, createRatingBadge: n } = {}) { let r = !1, i = null, a = null, o = async (t, n) => { if (t != null) { try { @@ -2483,7 +2483,7 @@ function Ua({ gridContainer: t, createRatingBadge: n } = {}) { return; } try { - window.dispatchEvent(new CustomEvent(La, { detail: { + window.dispatchEvent(new CustomEvent(za, { detail: { assetId: String(t), rating: n } })); @@ -2507,13 +2507,13 @@ function Ua({ gridContainer: t, createRatingBadge: n } = {}) { if (!a && !s && !c) return; let l = r === "0" ? 0 : Number(r); if (!Number.isFinite(l)) return; - let u = za(t, e.target); - u.length && (e.preventDefault(), e.stopPropagation(), e.stopImmediatePropagation?.(), await Ha(u, (e) => o(e, l), 5)); + let u = Va(t, e.target); + u.length && (e.preventDefault(), e.stopPropagation(), e.stopImmediatePropagation?.(), await Wa(u, (e) => o(e, l), 5)); }, a = (e) => { let r = e?.detail || {}, i = r.assetId ?? r.id ?? null, a = Number(r.rating); if (!i || !Number.isFinite(a)) return; - let o = Ba(t, i); - o && Va(o, n, a); + let o = Ha(t, i); + o && Ua(o, n, a); }; try { window.addEventListener("keydown", i, { capture: !0 }); @@ -2521,7 +2521,7 @@ function Ua({ gridContainer: t, createRatingBadge: n } = {}) { console.debug?.(e); } try { - window.addEventListener(La, a); + window.addEventListener(za, a); } catch (e) { console.debug?.(e); } @@ -2536,7 +2536,7 @@ function Ua({ gridContainer: t, createRatingBadge: n } = {}) { console.debug?.(e); } try { - window.removeEventListener(La, a); + window.removeEventListener(za, a); } catch (e) { console.debug?.(e); } @@ -2546,7 +2546,7 @@ function Ua({ gridContainer: t, createRatingBadge: n } = {}) { }; } // ui/features/grid/StackGroupCards.ts -function Wa(e) { +function Ka(e) { if (!e || e.dataset?.mjrOverlayButtonBound === "1") return e; try { e.dataset.mjrOverlayButtonBound = "1"; @@ -2565,7 +2565,7 @@ function Wa(e) { }; return e.addEventListener("pointerdown", t), e.addEventListener("mousedown", n), e.addEventListener("touchstart", t, { passive: !0 }), e.addEventListener("dblclick", t), e.addEventListener("keydown", t), e.addEventListener("dragstart", n), e; } -function Ga(e, t, n = null, r = "mjr-stack-group-button-count") { +function qa(e, t, n = null, r = "mjr-stack-group-button-count") { e.textContent = ""; let i = document.createElement("span"); if (i.className = t, e.appendChild(i), n != null) { @@ -2573,24 +2573,24 @@ function Ga(e, t, n = null, r = "mjr-stack-group-button-count") { t.className = r, t.textContent = String(n), e.appendChild(t); } } -function Ka(e) { +function Ja(e) { return String(e?.dataset?.mjrGroupStacks || "") === "1"; } -function qa(e) { +function Ya(e) { let t = String(e?.stack_id || "").trim(); return t ? `stack:${t}` : ""; } -function Ja(e, t, n) { - return Ka(e) && qa(t) || n; +function Xa(e, t, n) { + return Ja(e) && Ya(t) || n; } -function Ya(e) { +function Za(e) { try { e._mjrStackMembersCache?.clear?.(); } catch (e) { console.debug?.(e); } } -function Xa(e, t, n) { +function Qa(e, t, n) { if (!t || !n || t._mjrIsVue) return; let r = !!n._mjrDupStack, i = Number(n._mjrDupCount || 0) || 0; if (!r || i < 2) { @@ -2600,7 +2600,7 @@ function Xa(e, t, n) { } t.dataset.mjrDupStacked = "true", t.dataset.mjrDupCount = String(i); let a = t.querySelector(".mjr-dup-stack-button"); - a || (a = document.createElement("button"), a.type = "button", a.className = "mjr-dup-stack-button", a.setAttribute("aria-label", "Show all duplicates"), Wa(a), a.addEventListener("click", (e) => { + a || (a = document.createElement("button"), a.type = "button", a.className = "mjr-dup-stack-button", a.setAttribute("aria-label", "Show all duplicates"), Ka(a), a.addEventListener("click", (e) => { if (e.preventDefault(), e.stopPropagation(), a.dataset?.mjrStackOpening !== "1") try { a.dataset.mjrStackOpening = "1", a.disabled = !0; let e = a?._mjrGridContainer, t = a?._mjrAsset; @@ -2626,21 +2626,21 @@ function Xa(e, t, n) { } }), t.appendChild(a)), a._mjrGridContainer = e, a._mjrAsset = n; let o = `${i} duplicate${i > 1 ? "s" : ""}`; - a.title = `${o} - click to compare all copies`, Ga(a, "pi pi-copy", i, "mjr-dup-stack-count"); + a.title = `${o} - click to compare all copies`, qa(a, "pi pi-copy", i, "mjr-dup-stack-count"); } // ui/features/dnd/utils/log.ts -var Za = () => { +var $a = () => { try { return !!window?.MJR_DND_DEBUG; } catch { return !1; } -}, Qa = (...e) => { - Za() && console.debug("[Majoor.DnD]", ...e); -}, $a = (e, { buildCustomViewURL: t, buildViewURL: n }) => { +}, eo = (...e) => { + $a() && console.debug("[Majoor.DnD]", ...e); +}, to = (e, { buildCustomViewURL: t, buildViewURL: n }) => { let r = String(e?.type || "output").toLowerCase(); - return r === "custom" ? t(e?.filename || "", e?.subfolder || "", Me(e)) : r === "input" ? n(e?.filename || "", e?.subfolder || "", "input") : r === "temp" ? n(e?.filename || "", e?.subfolder || "", "temp") : n(e?.filename || "", e?.subfolder || "", "output"); -}, eo = (e) => { + return r === "custom" ? t(e?.filename || "", e?.subfolder || "", ze(e)) : r === "input" ? n(e?.filename || "", e?.subfolder || "", "input") : r === "temp" ? n(e?.filename || "", e?.subfolder || "", "temp") : n(e?.filename || "", e?.subfolder || "", "output"); +}, no = (e) => { if (!e || typeof e != "object") return null; let t = String(e.filename || "").trim(); if (!t || t.includes("/") || t.includes("\\") || t.includes("\0")) return null; @@ -2653,41 +2653,41 @@ var Za = () => { kind: o || void 0, filepath: o === "workflow" && s ? s : void 0 }; -}, to = eo, no = (e, t) => { +}, ro = no, io = (e, t) => { let n = e?.dataTransfer?.getData?.(t); if (!n) return null; try { - return eo(JSON.parse(n)); + return no(JSON.parse(n)); } catch { return null; } -}, ro = /* @__PURE__ */ new WeakMap(), io = !1; -function ao(e) { - return e && ro.get(e) || null; -} -function oo(e, t) { - return e ? typeof t == "function" ? (ro.set(e, t), t) : (ro.delete(e), null) : null; -} +}, ao = /* @__PURE__ */ new WeakMap(), oo = !1; function so(e) { - e && ro.delete(e); + return e && ao.get(e) || null; } -function co() { - io = !0; +function co(e, t) { + return e ? typeof t == "function" ? (ao.set(e, t), t) : (ao.delete(e), null) : null; } -function lo() { - return io ? (io = !1, !0) : !1; +function lo(e) { + e && ao.delete(e); } function uo() { - io = !1; + oo = !0; +} +function fo() { + return oo ? (oo = !1, !0) : !1; +} +function po() { + oo = !1; } // ui/features/dnd/out/DragOut.ts -var fo = (e) => { +var mo = (e) => { try { return new URL(String(e || ""), window.location.href).href; } catch { return String(e || ""); } -}, po = () => Ke("mjr_", 24), mo = (e) => { +}, ho = () => Re("mjr_", 24), go = (e) => { let t = e && typeof e == "object" ? e : null; if (!t) return null; let n = t.filename || t.name; @@ -2695,9 +2695,9 @@ var fo = (e) => { filename: n, subfolder: t.subfolder || "", type: String(t.type || "output").toLowerCase(), - root_id: Me(t) || void 0 + root_id: ze(t) || void 0 } : null; -}, ho = (e, t) => { +}, _o = (e, t) => { let n = []; if (!e || !t) return n; let r = t?.dataset?.mjrAssetId ? String(t.dataset.mjrAssetId) : ""; @@ -2747,25 +2747,25 @@ var fo = (e) => { t && typeof t == "object" && n.push(t); } return n; -}, go = (e) => { +}, vo = (e) => { if (!e || typeof e != "object") return ""; let t = e.filepath || e.path || e?.file_info?.filepath || ""; return t ? String(t) : ""; -}, _o = ({ dt: e, asset: t, containerEl: n, card: r, viewUrl: i, stripMetadata: a = !1 }) => { +}, yo = ({ dt: e, asset: t, containerEl: n, card: r, viewUrl: i, stripMetadata: a = !1 }) => { if (!e || !t) return; - let o = ho(n, r); + let o = _o(n, r); if (Array.isArray(o) && o.length > 1) { - let t = o.map(mo).filter(Boolean); + let t = o.map(go).filter(Boolean); if (t.length > 1) { let n = ""; try { - n = po(); + n = ho(); } catch (e) { console.warn("[DragOut] failed to create secure batch token", e); } if (n) { try { - L(st.BATCH_ZIP_CREATE, { + L(it.BATCH_ZIP_CREATE, { token: n, items: t, strip_metadata: !!a @@ -2773,7 +2773,7 @@ var fo = (e) => { } catch (e) { console.debug?.(e); } - let r = fo(Qe(n)), i = a ? `Majoor_Clean_Batch_${t.length}.zip` : `Majoor_Batch_${t.length}.zip`; + let r = mo(tt(n)), i = a ? `Majoor_Clean_Batch_${t.length}.zip` : `Majoor_Batch_${t.length}.zip`; try { e.setData("text/uri-list", r), e.setData("DownloadURL", `application/zip:${i}:${r}`), e.effectAllowed = "copyMove"; } catch (e) { @@ -2785,38 +2785,38 @@ var fo = (e) => { } let s = t.filename || t.name; if (!s) return; - let c = a ? go(t) : "", l = fo((c ? Ge(c) : "") || i), u = en(s); + let c = a ? vo(t) : "", l = mo((c ? at(c) : "") || i), u = en(s); try { e.setData("text/uri-list", l), e.setData("DownloadURL", `${u}:${s}:${l}`), e.effectAllowed = "copyMove"; } catch (e) { console.debug?.(e); } -}, vo = (e, { asset: t, containerEl: n, card: r }) => { +}, bo = (e, { asset: t, containerEl: n, card: r }) => { if (e && t) try { let t = e?.dataTransfer?.dropEffect; - !t || t === "none" || lo(); + !t || t === "none" || fo(); return; } catch (e) { console.debug?.(e); } -}, yo = () => { - let e = $e(); +}, xo = () => { + let e = Ze(); return e && typeof e == "object" ? e : null; -}, bo = (e) => $a(e, { - buildCustomViewURL: tt, - buildViewURL: nt -}), xo = !1, So = !1, Co = (e) => { +}, So = (e) => to(e, { + buildCustomViewURL: Ge, + buildViewURL: Xe +}), Co = !1, wo = !1, To = (e) => { try { return !!e?.closest?.("input, textarea, select, [contenteditable='true']"); } catch { return !1; } -}, wo = () => xo === !0, To = () => So === !0, Eo = (e) => [ +}, Eo = () => Co === !0, Do = () => wo === !0, Oo = (e) => [ String(e?.type || "output"), String(e?.filename || ""), String(e?.subfolder || ""), - String(Me(e) || "") -].join("\n"), Do = (e, t) => { + String(ze(e) || "") +].join("\n"), ko = (e, t) => { if (String(e?.type || e?.file_info?.type || "").toLowerCase() === "custom") return null; let n = ut(String(e?.filepath || e?.path || e?.fullpath || e?.full_path || e?.file_info?.filepath || e?.file_info?.path || "")).trim(); if (!n || !t) return null; @@ -2846,20 +2846,20 @@ var fo = (e) => { }; } return null; -}, Oo = (e) => { +}, Ao = (e) => { if (!e || typeof e != "object") return null; let t = String(e.filename || "").trim(); if (!t) return null; - let n = Do(e, t); + let n = ko(e, t); return { filename: t, subfolder: n?.subfolder ?? e.subfolder ?? "", type: n?.type ?? String(e.type || "output").toLowerCase(), - root_id: Me(e) || void 0, + root_id: ze(e) || void 0, kind: String(e.kind || "").toLowerCase(), filepath: String(e.filepath || e.path || e?.file_info?.filepath || "").trim() || void 0 }; -}, ko = (e, t, n) => { +}, jo = (e, t, n) => { if (!e || !t || n == null) return !1; let r = String(n); try { @@ -2873,10 +2873,10 @@ var fo = (e) => { console.debug?.(e); } return !1; -}, Ao = ({ dt: e, asset: t, payload: n, viewUrl: r }) => { +}, Mo = ({ dt: e, asset: t, payload: n, viewUrl: r }) => { if (!e || !t || !n) return; let i = String(n.kind || "").toLowerCase() === "model3d" ? "3D" : n.kind, a = { - id: t.id == null ? Eo(n) : String(t.id), + id: t.id == null ? Oo(n) : String(t.id), name: t.filename || n.filename, display_name: t.filename || n.filename, filename: n.filename, @@ -2892,46 +2892,46 @@ var fo = (e) => { }, tags: Array.isArray(t.tags) ? t.tags : [] }; - ko(e, sn, JSON.stringify(a)), r && ko(e, "text/uri-list", r); -}, jo = (e) => { + jo(e, sn, JSON.stringify(a)), r && jo(e, "text/uri-list", r); +}, No = (e) => { let t = e && typeof e == "object" ? e : null; if (!t) return []; try { let e = window?.__MJR_LAST_SELECTION_GRID__, n = typeof e?._mjrGetSelectedAssets == "function" ? e._mjrGetSelectedAssets() : []; if (Array.isArray(n) && n.length > 1) { - let e = n.map(Oo).filter(rn), r = Eo(t); - if (e.some((e) => Eo(e) === r)) return e; + let e = n.map(Ao).filter(rn), r = Oo(t); + if (e.some((e) => Oo(e) === r)) return e; } } catch (e) { console.debug?.(e); } return [t]; -}, Mo = (e, t) => { +}, Po = (e, t) => { try { let n = typeof e?._mjrGetSelectedAssets == "function" ? e._mjrGetSelectedAssets() : []; if (!Array.isArray(n) || n.length <= 1) return []; - let r = n.map(Oo).filter(rn), i = Eo(t); - return r.some((e) => Eo(e) === i) ? r : []; + let r = n.map(Ao).filter(rn), i = Oo(t); + return r.some((e) => Oo(e) === i) ? r : []; } catch (e) { return console.debug?.(e), []; } -}, No = (e, t) => { +}, Fo = (e, t) => { try { let t = e?.dataTransfer?.getData?.("application/x-mjr-assets") || ""; if (t) { - let e = JSON.parse(t), n = (Array.isArray(e?.items) ? e.items : Array.isArray(e) ? e : []).map(to).filter(rn); + let e = JSON.parse(t), n = (Array.isArray(e?.items) ? e.items : Array.isArray(e) ? e : []).map(ro).filter(rn); if (n.length) return n; } } catch (e) { console.debug?.(e); } - return jo(t); -}, Po = async (e) => { + return No(t); +}, Io = async (e) => { let t = Array.isArray(e) ? e.filter(Boolean) : []; return t.length ? (await Promise.all(t.map(async (e) => { - let t = (await Vn({ + let t = (await Un({ post: L, - endpoint: st.STAGE_TO_INPUT, + endpoint: it.STAGE_TO_INPUT, payload: e, index: !1 }))?.relativePath; @@ -2941,43 +2941,43 @@ var fo = (e) => { droppedExt: String(e?.filename || "").split(".").pop() || "" } : null; }))).filter(Boolean) : []; -}, Fo = /* @__PURE__ */ new Map(), Io = 6e4, Lo = 20, Ro = 5242880, zo = 5e3, Bo = 2e4, Vo = 256, Ho = 5e5, Uo = /[\u0000-\u001f\u007f]/, Wo = /\u0000/, Go = (e) => Uo.test(String(e || "")), Ko = (e) => Wo.test(String(e || "")), qo = (e) => { +}, Lo = /* @__PURE__ */ new Map(), Ro = 6e4, zo = 20, Bo = 5242880, Vo = 5e3, Ho = 2e4, Uo = 256, Wo = 5e5, Go = /[\u0000-\u001f\u007f]/, Ko = /\u0000/, qo = (e) => Go.test(String(e || "")), Jo = (e) => Ko.test(String(e || "")), Yo = (e) => { if (!e || typeof e != "object" || Array.isArray(e)) return !1; let t = Number(e.id); if (!Number.isFinite(t)) return !1; let n = e.type == null ? "" : String(e.type); - if (n && (n.length > Vo || Go(n))) return !1; + if (n && (n.length > Uo || qo(n))) return !1; let r = e.widgets_values; if (Array.isArray(r)) { - for (let e of r) if (typeof e == "string" && (e.length > Ho || Ko(e))) return !1; + for (let e of r) if (typeof e == "string" && (e.length > Wo || Jo(e))) return !1; } return !0; -}, Jo = (e) => { +}, Xo = (e) => { if (Array.isArray(e)) return e.length >= 4; if (e && typeof e == "object") { let t = Number(e.id); return !!Number.isFinite(t); } return !1; -}, Yo = (e) => { - if (!e || typeof e != "object" || !Array.isArray(e.nodes) || !Array.isArray(e.links) || e.nodes.length > zo || e.links.length > Bo || !e.nodes.every(qo) || !e.links.every(Jo)) return !1; +}, Zo = (e) => { + if (!e || typeof e != "object" || !Array.isArray(e.nodes) || !Array.isArray(e.links) || e.nodes.length > Vo || e.links.length > Ho || !e.nodes.every(Yo) || !e.links.every(Xo)) return !1; try { let t = JSON.stringify(e).length; - if (!Number.isFinite(t) || t <= 0 || t > Ro) return !1; + if (!Number.isFinite(t) || t <= 0 || t > Bo) return !1; } catch { return !1; } return !0; -}, Xo = () => { +}, Qo = () => { let e = Date.now(); - for (let [t, n] of Fo.entries()) e - (n?.at || 0) > Io && Fo.delete(t); - Fo.size > Lo && Array.from(Fo.entries()).sort((e, t) => (e[1]?.at || 0) - (t[1]?.at || 0)).slice(0, Fo.size - Lo).forEach(([e]) => Fo.delete(e)); -}, Zo = async (e, t = null) => { - let n = e && typeof e == "object" ? e : null, r = Me(n), i = yo(), a = n?.filename ? `${n.type || "output"}:${n.filename}:${n.subfolder || ""}:${r}` : t ? `path:${t}` : null; + for (let [t, n] of Lo.entries()) e - (n?.at || 0) > Ro && Lo.delete(t); + Lo.size > zo && Array.from(Lo.entries()).sort((e, t) => (e[1]?.at || 0) - (t[1]?.at || 0)).slice(0, Lo.size - zo).forEach(([e]) => Lo.delete(e)); +}, $o = async (e, t = null) => { + let n = e && typeof e == "object" ? e : null, r = ze(n), i = xo(), a = n?.filename ? `${n.type || "output"}:${n.filename}:${n.subfolder || ""}:${r}` : t ? `path:${t}` : null; if (a) { - let e = Fo.get(a); - if (e && Date.now() - (e.at || 0) < Io) { - if (e.workflow && Yo(e.workflow)) try { + let e = Lo.get(a); + if (e && Date.now() - (e.at || 0) < Ro) { + if (e.workflow && Zo(e.workflow)) try { if (typeof i?.loadGraphData == "function") return i.loadGraphData(e.workflow), !0; if (typeof i?.canvas?.graph?.configure == "function") { i.canvas.graph.configure(e.workflow); @@ -3001,19 +3001,19 @@ var fo = (e) => { let e = await y(String(n.filepath), { timeoutMs: 3e4 }); o = e?.ok && (e?.data?.workflow || e?.workflow) || null; } else if (n?.filename) { - let t = `${st.WORKFLOW_QUICK}?type=${encodeURIComponent(n.type || "output")}&filename=${encodeURIComponent(n.filename)}&subfolder=${encodeURIComponent(n.subfolder || "")}` + (r ? `&root_id=${encodeURIComponent(r)}` : ""), i = await re(t); - i?.ok && i.workflow && (o = i.workflow), o || (e = `${st.METADATA}?workflow_only=1&type=${encodeURIComponent(n.type || "output")}&filename=${encodeURIComponent(n.filename)}&subfolder=${encodeURIComponent(n.subfolder || "")}&root_id=${encodeURIComponent(r)}`); - } else t && (e = `${st.METADATA}?workflow_only=1&path=${encodeURIComponent(String(t))}`); + let t = `${it.WORKFLOW_QUICK}?type=${encodeURIComponent(n.type || "output")}&filename=${encodeURIComponent(n.filename)}&subfolder=${encodeURIComponent(n.subfolder || "")}` + (r ? `&root_id=${encodeURIComponent(r)}` : ""), i = await re(t); + i?.ok && i.workflow && (o = i.workflow), o || (e = `${it.METADATA}?workflow_only=1&type=${encodeURIComponent(n.type || "output")}&filename=${encodeURIComponent(n.filename)}&subfolder=${encodeURIComponent(n.subfolder || "")}&root_id=${encodeURIComponent(r)}`); + } else t && (e = `${it.METADATA}?workflow_only=1&path=${encodeURIComponent(String(t))}`); if (!o && e) { let t = await re(e); if (!t?.ok || !t.data) return !1; o = t.data?.workflow; } - if (!Yo(o)) return !1; - if (a && (Fo.set(a, { + if (!Zo(o)) return !1; + if (a && (Lo.set(a, { workflow: o, at: Date.now() - }), Xo()), typeof i?.loadGraphData == "function") return i.loadGraphData(o), !0; + }), Qo()), typeof i?.loadGraphData == "function") return i.loadGraphData(o), !0; if (typeof i?.canvas?.graph?.configure == "function") { i.canvas.graph.configure(o); try { @@ -3029,7 +3029,7 @@ var fo = (e) => { } return !1; }; -function Qo(e) { +function es(e) { return (t) => { let n = t?.dataTransfer; if (!n) return; @@ -3037,26 +3037,26 @@ function Qo(e) { if (!r) return; let i = r._mjrAsset; if (!i || typeof i != "object") return; - let a = String(i?.kind || "").toLowerCase(), o = Do(i, String(i.filename || "")), s = o?.type ?? String(i?.type || "output").toLowerCase(), c = { + let a = String(i?.kind || "").toLowerCase(), o = ko(i, String(i.filename || "")), s = o?.type ?? String(i?.type || "output").toLowerCase(), c = { filename: i.filename, subfolder: o?.subfolder ?? i.subfolder ?? "", type: s, - root_id: Me(i) || void 0, + root_id: ze(i) || void 0, kind: a, filepath: String(i.filepath || i.path || i?.file_info?.filepath || "").trim() || void 0 }; try { - let t = wo(); - ko(n, pn, JSON.stringify(c)); - let o = Mo(e, c); - o.length > 1 && ko(n, Hn, JSON.stringify({ items: o })), ko(n, "text/plain", String(i.filename || "")); - let s = a === "workflow" ? "" : bo(c); - Ao({ + let t = Eo(); + jo(n, pn, JSON.stringify(c)); + let o = Po(e, c); + o.length > 1 && jo(n, Wn, JSON.stringify({ items: o })), jo(n, "text/plain", String(i.filename || "")); + let s = a === "workflow" ? "" : So(c); + Mo({ dt: n, asset: i, payload: c, viewUrl: s - }), _o({ + }), yo({ dt: n, asset: i, containerEl: e, @@ -3069,7 +3069,7 @@ function Qo(e) { } try { r.addEventListener("dragend", (t) => { - vo(t, { + bo(t, { asset: i, containerEl: e, card: r @@ -3086,30 +3086,30 @@ function Qo(e) { } }; } -var $o = (e) => { +var ts = (e) => { if (!e) return () => {}; - let t = ao(e); + let t = so(e); if (typeof t == "function") return t; - let n = Qo(e); - return e.addEventListener("dragstart", n, !0), oo(e, () => { + let n = es(e); + return e.addEventListener("dragstart", n, !0), co(e, () => { try { e.removeEventListener("dragstart", n, !0); } catch (e) { console.debug?.(e); } - so(e); + lo(e); }); -}, es = null, ts = 0; -function ns() { +}, ns = null, rs = 0; +function is() { let t = (e) => { - if (Co(e?.target)) return; + if (To(e?.target)) return; let t = String(e?.key || "").toLowerCase(); - t === "s" ? xo = !0 : t === "l" && (So = !0); + t === "s" ? Co = !0 : t === "l" && (wo = !0); }, n = (e) => { let t = String(e?.key || "").toLowerCase(); - t === "s" ? xo = !1 : t === "l" && (So = !1); + t === "s" ? Co = !1 : t === "l" && (wo = !1); }, r = () => { - xo = !1, So = !1; + Co = !1, wo = !1; }, i = /* @__PURE__ */ new Set([ "mp3", "wav", @@ -3183,9 +3183,9 @@ function ns() { e && (a = e.resolvedStart === void 0 ? e.start : e.resolvedStart); } t._ghostSegmentId = null, t._ghostTrack = null, t._ghostInitialTimeline = null, t._previewSegments = null, t.render?.(); - let c = String(r || "").toLowerCase(), l = i.has(c), u = await Vn({ + let c = String(r || "").toLowerCase(), l = i.has(c), u = await Un({ post: L, - endpoint: st.STAGE_TO_INPUT, + endpoint: it.STAGE_TO_INPUT, payload: n, index: !1 }); @@ -3228,10 +3228,10 @@ function ns() { waveformPeaks: u }; if (!t.timeline?.audioSegments) { - Qa("ltxdirector inject: no audioSegments", {}); + eo("ltxdirector inject: no audioSegments", {}); return; } - t.timeline.audioSegments.push(g), t.timeline.audioSegments.sort((e, t) => e.start - t.start), t.selectionType = "audio", t.selectedIndex = t.timeline.audioSegments.findIndex((e) => e.id === h), t.updateUIFromSelection?.(), t.commitChanges?.(!0), t.render?.(), e(`Added audio to LTX Director: ${d}`, "success", 3e3), Qa("drop ltxdirector inject audio", { + t.timeline.audioSegments.push(g), t.timeline.audioSegments.sort((e, t) => e.start - t.start), t.selectionType = "audio", t.selectedIndex = t.timeline.audioSegments.findIndex((e) => e.id === h), t.updateUIFromSelection?.(), t.commitChanges?.(!0), t.render?.(), e(`Added audio to LTX Director: ${d}`, "success", 3e3), eo("drop ltxdirector inject audio", { file: d, start: f }); @@ -3274,7 +3274,7 @@ function ns() { imageB64: m }; if (!t.timeline?.segments) { - Qa("ltxdirector inject: no timeline", {}); + eo("ltxdirector inject: no timeline", {}); return; } if (t.timeline.segments.push(b), t.timeline.segments.sort((e, t) => e.start - t.start), g) try { @@ -3289,7 +3289,7 @@ function ns() { }, e.src = m; } let x = t.timeline.segments.findIndex((e) => e.id === y), S = g ? t.timeline.segments.findIndex((e) => e.id === b.id) : x; - S >= 0 && (t.selectionType = "image", t.selectedIndex = S, t.updateUIFromSelection?.()), t.commitChanges?.(!0), t.render?.(), e(`Added ${g ? "video" : "image"} to LTX Director: ${d}`, "success", 3e3), Qa("drop ltxdirector inject", { + S >= 0 && (t.selectionType = "image", t.selectedIndex = S, t.updateUIFromSelection?.()), t.commitChanges?.(!0), t.render?.(), e(`Added ${g ? "video" : "image"} to LTX Director: ${d}`, "success", 3e3), eo("drop ltxdirector inject", { file: d, start: v, ext: c, @@ -3301,34 +3301,34 @@ function ns() { onKeyUp: n, onWindowBlur: r, onDragOver: (e) => { - let t = yo(); + let t = xo(); if (!Array.from(e?.dataTransfer?.types || []).includes("application/x-mjr-asset")) return; - let n = no(e, pn); + let n = io(e, pn); if (!rn(n)) return; let r = ln(t, e.clientX, e.clientY), i = r ? cn(t, r, e.clientX, e.clientY) : null, a = String(n?.filename || "").split(".").pop() || "", o = r && !i ? dn(r, n, a) : null, s = r && !i && !o && !!r._timelineEditor; - r && (i || o || s) ? (e.preventDefault(), s || (e.stopImmediatePropagation?.(), e.stopPropagation()), Yt(t, r, jn), e.dataTransfer.dropEffect = "copy", i ? Qa("dragover slot", { + r && (i || o || s) ? (e.preventDefault(), s || (e.stopImmediatePropagation?.(), e.stopPropagation()), Yt(t, r, jn), e.dataTransfer.dropEffect = "copy", i ? eo("dragover slot", { node: r?.title, slot: i.input?.name - }) : s ? Qa("dragover ltxdirector", { node: r?.title }) : Qa("dragover widget", { + }) : s ? eo("dragover ltxdirector", { node: r?.title }) : eo("dragover widget", { node: r?.title, widget: o?.name })) : (An(t, jn), un(t, e) && (e.preventDefault(), e.dataTransfer.dropEffect = "copy")); }, onDrop: async (t) => { - let n = yo(); + let n = xo(); if (!Array.from(t?.dataTransfer?.types || []).includes("application/x-mjr-asset")) return; try { if ((t?.target)?.closest?.(".mjr-folder-card")) return; } catch {} - let r = no(t, pn); + let r = io(t, pn); if (!rn(r) || !un(n, t)) return; - co(); - let i = To(), a = i ? No(t, r) : [r], o = ln(n, t.clientX, t.clientY), s = o ? cn(n, o, t.clientX, t.clientY) : null, l = String(r?.filename || "").split(".").pop() || "", u = o && !s ? dn(o, r, l) : null; + uo(); + let i = Do(), a = i ? Fo(t, r) : [r], o = ln(n, t.clientX, t.clientY), s = o ? cn(n, o, t.clientX, t.clientY) : null, l = String(r?.filename || "").split(".").pop() || "", u = o && !s ? dn(o, r, l) : null; if (o && s) { t.preventDefault(), t.stopImmediatePropagation?.(), t.stopPropagation(), An(n, jn); let i = await Zt({ post: L, - endpoint: st.STAGE_TO_INPUT, + endpoint: it.STAGE_TO_INPUT, payload: r, index: !1 }); @@ -3341,7 +3341,7 @@ function ns() { inputSlotIndex: s.index, event: t })) { - Qa("drop slot created and connected loader", { + eo("drop slot created and connected loader", { node: o?.title, slot: s.input?.name, value: i @@ -3357,42 +3357,42 @@ function ns() { } if (!o || !u) { if (An(n, jn), t.preventDefault(), t.stopImmediatePropagation?.(), t.stopPropagation(), i) { - let i = await Po(a), o = mn({ + let i = await Io(a), o = mn({ app: n, items: i, event: t }); if (o > 0) { - Qa("drop canvas created loaders", { count: o }); + eo("drop canvas created loaders", { count: o }); return; } e(`Failed to load file: "${r?.filename}". Staging failed.`, "error"); return; } if (String(r?.kind || "").toLowerCase() === "workflow") { - if (await Zo(r)) { - Qa("drop canvas loaded workflow", { file: r?.filename }); + if (await $o(r)) { + eo("drop canvas loaded workflow", { file: r?.filename }); return; } e(`Failed to load workflow: "${r?.filename}".`, "error"); return; } - let s = !o && !i, c = Vn({ + let s = !o && !i, c = Un({ post: L, - endpoint: st.STAGE_TO_INPUT, + endpoint: it.STAGE_TO_INPUT, payload: r, index: !1 - }), u = s ? Zo(r) : Promise.resolve(!1), [d, f] = await Promise.all([u, c]); + }), u = s ? $o(r) : Promise.resolve(!1), [d, f] = await Promise.all([u, c]); if (d) { - Qa("drop canvas loaded workflow", { file: r?.filename }); + eo("drop canvas loaded workflow", { file: r?.filename }); return; } let p = f?.relativePath; if (!p) { - Qa("drop canvas stage failed"), e(`Failed to load file: "${r?.filename}". Staging failed.`, "error"); + eo("drop canvas stage failed"), e(`Failed to load file: "${r?.filename}". Staging failed.`, "error"); return; } - if (Qa("drop canvas staged", { value: p }), mn({ + if (eo("drop canvas staged", { value: p }), mn({ app: n, items: [{ payload: r, @@ -3401,7 +3401,7 @@ function ns() { }], event: t })) { - Qa("drop canvas created loader", { value: p }); + eo("drop canvas created loader", { value: p }); return; } e(`Staged to input: ${p}`, "success", 4e3); @@ -3410,62 +3410,62 @@ function ns() { t.preventDefault(), t.stopImmediatePropagation?.(), t.stopPropagation(), An(n, jn); let d = await Zt({ post: L, - endpoint: st.STAGE_TO_INPUT, + endpoint: it.STAGE_TO_INPUT, payload: r, index: !1 }); - d && (Qt(u, d), jn(n), Qa("drop inject", { + d && (Qt(u, d), jn(n), eo("drop inject", { node: o?.title, widget: u?.name, value: d })); }, onDragLeave: () => { - let e = yo(); - An(e, jn), Qa("dragleave"); + let e = xo(); + An(e, jn), eo("dragleave"); } }; } -function rs() { +function as() { if (typeof window > "u" || !window?.addEventListener) return { dispose() {} }; - let { onKeyDown: e, onKeyUp: t, onWindowBlur: n, onDragOver: r, onDrop: i, onDragLeave: a } = ns(); + let { onKeyDown: e, onKeyUp: t, onWindowBlur: n, onDragOver: r, onDrop: i, onDragLeave: a } = is(); return window.addEventListener("keydown", e, !0), window.addEventListener("keyup", t, !0), window.addEventListener("blur", n, !0), window.addEventListener("dragover", r, !0), window.addEventListener("drop", i, !0), window.addEventListener("dragleave", a, !0), { dispose: () => { try { window.removeEventListener("keydown", e, !0), window.removeEventListener("keyup", t, !0), window.removeEventListener("blur", n, !0), window.removeEventListener("dragover", r, !0), window.removeEventListener("drop", i, !0), window.removeEventListener("dragleave", a, !0); } catch (e) { console.debug?.(e); } - xo = !1, So = !1; + Co = !1, wo = !1; try { - An(yo(), jn); + An(xo(), jn); } catch (e) { console.debug?.(e); } } }; } -function is() { - es || (es = rs(), ts = 0), ts += 1; +function os() { + ns || (ns = as(), rs = 0), rs += 1; let e = !1; return ({ force: t = !1 } = {}) => { - e || (e = !0, as({ force: t })); + e || (e = !0, ss({ force: t })); }; } -function as({ force: e = !1 } = {}) { - if (!es) ts = 0, uo(); - else if (!e && ts > 1) --ts; +function ss({ force: e = !1 } = {}) { + if (!ns) rs = 0, po(); + else if (!e && rs > 1) --rs; else { - ts = 0; + rs = 0; try { - es.dispose?.(); + ns.dispose?.(); } catch (e) { console.debug?.(e); } - es = null, uo(); + ns = null, po(); } } // ui/features/grid/MediaBlobCache.ts -var os = "__MJR_MEDIA_BLOB_CACHE__", ss = 384, cs = 3e5, ls = 3e4, us = 15e3, ds = 6, fs = 192, ps = 3; -function ms() { +var cs = "__MJR_MEDIA_BLOB_CACHE__", ls = 384, us = 3e5, ds = 3e4, fs = 15e3, ps = 6, ms = 192, hs = 3; +function gs() { let e = /* @__PURE__ */ new Map(), t = null, n = 0, r = []; function i() { try { @@ -3477,10 +3477,10 @@ function ms() { return !1; } function a() { - return i() ? fs : ss; + return i() ? ms : ls; } function o() { - return i() ? ps : ds; + return i() ? hs : ps; } async function s(e) { n >= o() && await new Promise((e) => r.push(e)), n += 1; @@ -3493,7 +3493,7 @@ function ms() { } } function c() { - t ||= setInterval(l, us); + t ||= setInterval(l, fs); } function l() { try { @@ -3515,7 +3515,7 @@ function ms() { for (let [r, i] of e) i.refcount > 0 || i.expiresAt < n && (n = i.expiresAt, t = r); t && (u(e.get(t)), e.delete(t)); } - function f(e, t = cs) { + function f(e, t = us) { e.expiresAt = Date.now() + t; } function p() { @@ -3539,7 +3539,7 @@ function ms() { r ? (r.hasError = !0, f(r)) : (e.size >= a() && d(), e.set(n, { blobUrl: null, refcount: 0, - expiresAt: Date.now() + ls, + expiresAt: Date.now() + ds, hasError: !0 }), p(), c()); } catch (e) { @@ -3573,7 +3573,7 @@ function ms() { return e.size >= a() && d(), e.set(r, { blobUrl: g, refcount: 1, - expiresAt: Date.now() + cs, + expiresAt: Date.now() + us, hasError: !1 }), p(), c(), g; } catch (e) { @@ -3585,7 +3585,7 @@ function ms() { let n = m(t); if (!n) return; let r = e.get(n); - r && (r.refcount = Math.max(0, r.refcount - 1), r.refcount <= 0 && f(r, ls)), l(), p(); + r && (r.refcount = Math.max(0, r.refcount - 1), r.refcount <= 0 && f(r, ds)), l(), p(); } catch (e) { console.debug?.(e); } @@ -3612,26 +3612,26 @@ function ms() { dispose: y }; } -function hs() { +function _s() { try { - if (window[os]) return window[os]; + if (window[cs]) return window[cs]; } catch (e) { console.debug?.(e); } try { - window[os]?.dispose?.(); + window[cs]?.dispose?.(); } catch (e) { console.debug?.(e); } - let e = ms(); + let e = gs(); try { - window[os] = e; + window[cs] = e; } catch (e) { console.debug?.(e); } return e; } -var gs = hs(), _s = ["title"], vs = /* @__PURE__ */ lr({ +var vs = _s(), ys = ["title"], bs = /* @__PURE__ */ dr({ __name: "RatingBadge", props: { rating: { type: [Number, String], @@ -3647,15 +3647,15 @@ var gs = hs(), _s = ["title"], vs = /* @__PURE__ */ lr({ key: 0, class: "mjr-rating-badge", title: i.value - }, [(q(!0), X(H, null, pr(n.value, (e) => (q(), X("span", { + }, [(q(!0), X(H, null, hr(n.value, (e) => (q(), X("span", { key: e, - style: yr({ + style: xr({ color: "var(--mjr-rating-color, var(--mjr-star-active, #FFD45A))", marginRight: e < n.value ? "2px" : "0" }) - }, " ★ ", 4))), 128))], 8, _s)) : G("", !0); + }, " ★ ", 4))), 128))], 8, ys)) : G("", !0); } -}), ys = ["title"], bs = /* @__PURE__ */ lr({ +}), xs = ["title"], Ss = /* @__PURE__ */ dr({ __name: "TagsBadge", props: { tags: { type: [Array, String], @@ -3684,9 +3684,9 @@ var gs = hs(), _s = ["title"], vs = /* @__PURE__ */ lr({ class: "mjr-tags-badge", title: i.value, style: { color: "var(--mjr-tag-color, #90CAF9)" } - }, J(a.value), 9, ys)) : G("", !0); + }, J(a.value), 9, xs)) : G("", !0); } -}), xs = ["title"], Ss = /* @__PURE__ */ lr({ +}), Cs = ["title"], ws = /* @__PURE__ */ dr({ __name: "GenTimeBadge", props: { genTimeMs: { default: 0 } }, setup(e) { @@ -3695,23 +3695,23 @@ var gs = hs(), _s = ["title"], vs = /* @__PURE__ */ lr({ key: 0, class: "mjr-gentime-badge", title: i.value.title, - style: yr({ color: a.value }) - }, J(i.value.text), 13, xs)) : G("", !0); + style: xr({ color: a.value }) + }, J(i.value.text), 13, Cs)) : G("", !0); } -}), Cs = { +}), Ts = { key: 0, class: "mjr-live-placeholder-wash", "aria-hidden": "true" -}, ws = ["title", "aria-label"], Ts = ["alt", "src"], Es = { class: "mjr-workflow-thumb-title" }, Ds = { class: "mjr-workflow-thumb-meta" }, Os = { key: 0 }, ks = { key: 1 }, As = { key: 2 }, js = { +}, Es = ["title", "aria-label"], Ds = ["alt", "src"], Os = { class: "mjr-workflow-thumb-title" }, ks = { class: "mjr-workflow-thumb-meta" }, As = { key: 0 }, js = { key: 1 }, Ms = { key: 2 }, Ns = { key: 3, class: "mjr-workflow-missing-chip" -}, Ms = ["alt", "src"], Ns = { +}, Ps = ["alt", "src"], Fs = { key: 1, class: "mjr-media-error-placeholder" -}, Ps = ["data-src", "poster"], Fs = ["src"], Is = { class: "mjr-audio-thumb-head" }, Ls = { class: "mjr-audio-thumb-kind" }, Rs = { +}, Is = ["data-src", "poster"], Ls = ["src"], Rs = { class: "mjr-audio-thumb-head" }, zs = { class: "mjr-audio-thumb-kind" }, Bs = { class: "mjr-audio-thumb-waveform", "aria-hidden": "true" -}, zs = { class: "mjr-audio-thumb-meta" }, Bs = { class: "mjr-audio-thumb-title" }, Vs = { class: "mjr-audio-thumb-subtitle" }, Hs = ["src", "alt"], Us = { +}, Vs = { class: "mjr-audio-thumb-meta" }, Hs = { class: "mjr-audio-thumb-title" }, Us = { class: "mjr-audio-thumb-subtitle" }, Ws = ["src", "alt"], Gs = { key: 1, class: "mjr-model3d-thumb-icon", style: { @@ -3722,23 +3722,23 @@ var gs = hs(), _s = ["title"], vs = /* @__PURE__ */ lr({ "justify-content": "center", color: "rgba(255,255,255,0.7)" } -}, Ws = [ +}, Ks = [ "data-mjr-ext", "data-mjr-badge-bg", "title" -], Gs = ["title"], Ks = { +], qs = ["title"], Js = { key: 7, class: "mjr-card-hover-info" -}, qs = { +}, Ys = { key: 0, class: "mjr-hover-prompt" -}, Js = { +}, Xs = { key: 1, class: "mjr-hover-prompt mjr-hover-workflow-notes" -}, Ys = { +}, Zs = { key: 2, class: "mjr-hover-gentime" -}, Xs = ["data-mjr-kind"], Zs = ["title"], Qs = { +}, Qs = ["data-mjr-kind"], $s = ["title"], ec = { class: "mjr-card-meta-row", style: { "font-size": "0.85em", @@ -3749,7 +3749,7 @@ var gs = hs(), _s = ["title"], vs = /* @__PURE__ */ lr({ "text-overflow": "ellipsis", "padding-right": "16px" } -}, $s = ["title"], ec = ["title"], tc = ["title"], nc = { +}, tc = ["title"], nc = ["title"], rc = ["title"], ic = { key: 0, class: "mjr-meta-separator", "aria-hidden": "true", @@ -3757,7 +3757,7 @@ var gs = hs(), _s = ["title"], vs = /* @__PURE__ */ lr({ opacity: "0.55", margin: "0 3px" } -}, rc = ["title"], ic = { class: "mjr-stack-group-button-count" }, ac = { class: "mjr-dup-stack-count" }, oc = /* @__PURE__ */ lr({ +}, ac = ["title"], oc = { class: "mjr-stack-group-button-count" }, sc = { class: "mjr-dup-stack-count" }, cc = /* @__PURE__ */ dr({ __name: "AssetCardInner", props: { asset: {} }, emits: ["workflow-action"], @@ -3782,7 +3782,7 @@ var gs = hs(), _s = ["title"], vs = /* @__PURE__ */ lr({ async function i(e, t = {}) { if (!e) return null; try { - return gs.hasError(e) ? null : await gs.acquireUrl(e, t) || null; + return vs.hasError(e) ? null : await vs.acquireUrl(e, t) || null; } catch { return null; } @@ -3795,13 +3795,13 @@ var gs = hs(), _s = ["title"], vs = /* @__PURE__ */ lr({ let t = String(e.dataset?.src || "").trim(); if (!t || e.getAttribute("src")) return; let n = (Number(e._mjrVideoLoadRequestId || 0) || 0) + 1; - if (e._mjrVideoLoadRequestId = n, gs.hasError(t)) { + if (e._mjrVideoLoadRequestId = n, vs.hasError(t)) { e.src = t, e._mjrSourceKey = t; return; } - let r = await gs.acquireUrl(t); + let r = await vs.acquireUrl(t); if (e._mjrVideoLoadRequestId !== n || !e.isConnected) { - r && gs.releaseUrl(t); + r && vs.releaseUrl(t); return; } r ? (e.src = r, e._mjrCachedSrc = t, e._mjrSourceKey = t) : (e.src = t, e._mjrSourceKey = t), e.load?.(); @@ -3822,7 +3822,7 @@ var gs = hs(), _s = ["title"], vs = /* @__PURE__ */ lr({ } try { let t = String(e._mjrCachedSrc || "").trim(); - t && gs.releaseUrl(t), e._mjrCachedSrc = "", e._mjrSourceKey = ""; + t && vs.releaseUrl(t), e._mjrCachedSrc = "", e._mjrSourceKey = ""; } catch (e) { console.debug?.(e); } @@ -3893,7 +3893,7 @@ var gs = hs(), _s = ["title"], vs = /* @__PURE__ */ lr({ function f(e) { e && (u(e), s(e)); } - let p = e, m = t, h = K(() => String(p.asset.kind || "image").toLowerCase()), g = K(() => h.value === "workflow"), _ = K(() => h.value === "image"), v = K(() => h.value === "video"), y = K(() => h.value === "audio"), b = K(() => h.value === "model3d"), x = K(() => it(p.asset) || ""), S = K(() => String(p.asset.thumbnail_url || p.asset.graph_map_thumbnail_url || p.asset.thumb_url || p.asset.poster || "").trim()), C = K(() => !!String(p.asset.thumbnail_url || p.asset.thumb_url || p.asset.poster || "").trim()), w = K(() => g.value && !C.value && !!String(p.asset.graph_map_thumbnail_url || "").trim()), T = K(() => String(p.asset.preview_url || p.asset.previewUrl || p.asset.url || "").trim()), E = K(() => x.value), D = K(() => T.value || x.value), O = K(() => !v.value && !g.value ? "" : Xe(p.asset, 384)), k = K(() => S.value || O.value), A = K(() => String(p.asset.filename || "")), j = K(() => String(p.asset.display_name || p.asset.displayName || p.asset.name || A.value || "").trim()), M = K(() => { + let p = e, m = t, h = K(() => String(p.asset.kind || "image").toLowerCase()), g = K(() => h.value === "workflow"), _ = K(() => h.value === "image"), v = K(() => h.value === "video"), y = K(() => h.value === "audio"), b = K(() => h.value === "model3d"), x = K(() => We(p.asset) || ""), S = K(() => String(p.asset.thumbnail_url || p.asset.graph_map_thumbnail_url || p.asset.thumb_url || p.asset.poster || "").trim()), C = K(() => !!String(p.asset.thumbnail_url || p.asset.thumb_url || p.asset.poster || "").trim()), w = K(() => g.value && !C.value && !!String(p.asset.graph_map_thumbnail_url || "").trim()), T = K(() => String(p.asset.preview_url || p.asset.previewUrl || p.asset.url || "").trim()), E = K(() => x.value), D = K(() => T.value || x.value), O = K(() => !v.value && !g.value ? "" : $e(p.asset, 384)), k = K(() => S.value || O.value), A = K(() => String(p.asset.filename || "")), j = K(() => String(p.asset.display_name || p.asset.displayName || p.asset.name || A.value || "").trim()), M = K(() => { let e = A.value; return e.includes(".") ? e.split(".").pop().toUpperCase() : ""; }), N = K(() => { @@ -3912,7 +3912,7 @@ var gs = hs(), _s = ["title"], vs = /* @__PURE__ */ lr({ if (!xe.value) return ""; let e = []; return ye.value > 0 && e.push(`${ye.value} node`), be.value > 0 && e.push(`${be.value} model`), `Missing: ${e.join(" / ")}`; - }), Ce = K(() => p.asset.generation_time || p.asset.file_creation_time || p.asset.mtime || p.asset.created_at), we = K(() => Ce.value ? Rn(Ce.value) : ""), Te = K(() => Ce.value ? Mn(Ce.value) : ""), Ee = K(() => [ + }), Ce = K(() => p.asset.generation_time || p.asset.file_creation_time || p.asset.mtime || p.asset.created_at), we = K(() => Ce.value ? zn(Ce.value) : ""), Te = K(() => Ce.value ? Mn(Ce.value) : ""), Ee = K(() => [ de.value ? { key: "resolution", className: "mjr-meta-res", @@ -3952,7 +3952,7 @@ var gs = hs(), _s = ["title"], vs = /* @__PURE__ */ lr({ video: "var(--mjr-badge-video, #F44336)", audio: "var(--mjr-badge-audio, #4CAF50)", model3d: "var(--mjr-badge-model3d, #9C27B0)" - }[h.value] || "var(--mjr-badge-image, #888)"), ke = ar("mjrStackService", null), Ae = K(() => !ke || !String(p.asset.stack_id || "").trim() ? !1 : Number(p.asset.stack_asset_count || p.asset._mjrFeedGroupCount || 0) > 1), je = K(() => Number(p.asset.stack_asset_count || p.asset._mjrFeedGroupCount || 0) || 0), Me = K(() => !!p.asset._mjrDupStack && Number(p.asset._mjrDupCount || 0) >= 2), Ne = K(() => Number(p.asset._mjrDupCount || 0) || 0), Pe = K(() => Me.value && !Ae.value), Fe = Q(!1), Ie = Q(!1); + }[h.value] || "var(--mjr-badge-image, #888)"), ke = sr("mjrStackService", null), Ae = K(() => !ke || !String(p.asset.stack_id || "").trim() ? !1 : Number(p.asset.stack_asset_count || p.asset._mjrFeedGroupCount || 0) > 1), je = K(() => Number(p.asset.stack_asset_count || p.asset._mjrFeedGroupCount || 0) || 0), Me = K(() => !!p.asset._mjrDupStack && Number(p.asset._mjrDupCount || 0) >= 2), Ne = K(() => Number(p.asset._mjrDupCount || 0) || 0), Pe = K(() => Me.value && !Ae.value), Fe = Q(!1), Ie = Q(!1); async function Le(e) { if (e.preventDefault(), e.stopPropagation(), !Fe.value) { Fe.value = !0; @@ -3977,70 +3977,70 @@ var gs = hs(), _s = ["title"], vs = /* @__PURE__ */ lr({ } } } - let ze = Q(null), Be = Q(null), Ve = Q(null), He = Q(null), Ue = Q(!1), We = Q(!1), Ge = Q(""), Ke = 0, qe = "", Je = "", Ye = ""; + let ze = Q(null), Be = Q(null), Ve = Q(null), He = Q(null), Ue = Q(!1), Ge = Q(!1), Ke = Q(""), qe = 0, Je = "", Ye = "", Xe = ""; function Ze() { try { - qe && gs.releaseUrl(qe); + Je && vs.releaseUrl(Je); } catch (e) { console.debug?.(e); } - qe = ""; + Je = ""; } - or(() => g.value ? S.value : _.value ? E.value : "", (e) => { + cr(() => g.value ? S.value : _.value ? E.value : "", (e) => { let t = String(e || "").trim(); - t && t !== Je && (Ue.value = !1, Je = ""); - }, { immediate: !0 }), or(() => b.value ? k.value : "", (e) => { + t && t !== Ye && (Ue.value = !1, Ye = ""); + }, { immediate: !0 }), cr(() => b.value ? k.value : "", (e) => { let t = String(e || "").trim(); - t && t !== Ye && (We.value = !1, Ye = ""); - }, { immediate: !0 }), or(() => [_.value ? Ve.value : null, _.value ? E.value : ""], async ([e, t], n, r) => { + t && t !== Xe && (Ge.value = !1, Xe = ""); + }, { immediate: !0 }), cr(() => [_.value ? Ve.value : null, _.value ? E.value : ""], async ([e, t], n, r) => { if (!e || !t || Ue.value) return; - let o = Ke += 1, s = new AbortController(), c = !1; + let o = qe += 1, s = new AbortController(), c = !1; r(() => { c = !0, s.abort(); }); try { - let n = qe || String(e.dataset?.mjrSourceKey || ""); - if (Ge.value && n === t || (e.dataset.mjrSourceKey = t, await a(), c || o !== Ke || !e.isConnected)) return; + let n = Je || String(e.dataset?.mjrSourceKey || ""); + if (Ke.value && n === t || (e.dataset.mjrSourceKey = t, await a(), c || o !== qe || !e.isConnected)) return; let r = await i(t, { signal: s.signal }); - if (c || o !== Ke || !e.isConnected) { - r && r !== t && gs.releaseUrl(t); + if (c || o !== qe || !e.isConnected) { + r && r !== t && vs.releaseUrl(t); return; } - if (r && r !== Ge.value) { - let e = qe; - Ge.value = r, qe = r === t ? "" : t, e && e !== qe && gs.releaseUrl(e); - } else !r && qe && qe !== t && (Ze(), Ge.value = ""); + if (r && r !== Ke.value) { + let e = Je; + Ke.value = r, Je = r === t ? "" : t, e && e !== Je && vs.releaseUrl(e); + } else !r && Je && Je !== t && (Ze(), Ke.value = ""); } catch {} }, { immediate: !0 }); let Qe = Q(B.GRID_VIDEO_AUTOPLAY_MODE || "hover"); - function $e() { + function R() { Qe.value = B.GRID_VIDEO_AUTOPLAY_MODE || "hover"; } - kr(() => { - window.addEventListener("mjr-settings-changed", $e); - }), or(Be, (e, t) => { + jr(() => { + window.addEventListener("mjr-settings-changed", R); + }), cr(Be, (e, t) => { if (t) try { f(t); } catch {} if (e && ze.value) try { d(ze.value, e, Qe.value); } catch {} - }), or(Qe, (e) => { + }), cr(Qe, (e) => { let t = Be.value, n = ze.value; t && n && d(n, t, e); - }), or(D, (e, t) => { + }), cr(D, (e, t) => { if (e === t) return; let n = Be.value, r = ze.value; n && r && (f(n), d(r, n, Qe.value)); - }, { flush: "post" }), dr(() => { - window.removeEventListener("mjr-settings-changed", $e), Ke += 1, Ze(); + }, { flush: "post" }), pr(() => { + window.removeEventListener("mjr-settings-changed", R), qe += 1, Ze(); let e = Be.value; if (e) try { f(e); } catch {} - }), tr(() => { - window.removeEventListener("mjr-settings-changed", $e); - }), Sr(() => { + }), rr(() => { + window.removeEventListener("mjr-settings-changed", R); + }), wr(() => { let e = He.value; if (!e) return; let t = p.asset; @@ -4055,13 +4055,13 @@ var gs = hs(), _s = ["title"], vs = /* @__PURE__ */ lr({ Ue.value = !0; try { let e = g.value ? S.value : E.value; - Je = String(e || "").trim(), gs.markError(e); + Ye = String(e || "").trim(), vs.markError(e); } catch {} } - function R() { - We.value = !0, Ye = String(k.value || "").trim(); + function z() { + Ge.value = !0, Xe = String(k.value || "").trim(); } - function z(e) { + function tt(e) { if (!De.value) return; e.preventDefault(), e.stopPropagation(); let t = e.target?.closest?.(".mjr-asset-card"); @@ -4075,7 +4075,7 @@ var gs = hs(), _s = ["title"], vs = /* @__PURE__ */ lr({ } })); } - function tt(e, t) { + function nt(e, t) { try { t?.preventDefault?.(), t?.stopPropagation?.(); } catch (e) { @@ -4088,46 +4088,46 @@ var gs = hs(), _s = ["title"], vs = /* @__PURE__ */ lr({ }); } return (t, n) => { - let r = rr("MButton"); + let r = ar("MButton"); return q(), X(H, null, [ U("div", { - class: wr(["mjr-thumb", { "mjr-thumb-workflow": g.value }]), + class: Er(["mjr-thumb", { "mjr-thumb-workflow": g.value }]), ref_key: "thumbRef", ref: ze }, [ - ce.value ? (q(), X("div", Cs)) : G("", !0), + ce.value ? (q(), X("div", Ts)) : G("", !0), g.value ? (q(), X(H, { key: 1 }, [ U("div", { class: "mjr-workflow-card-actions", - onClick: n[1] ||= fr(() => {}, ["stop"]), - onDblclick: n[2] ||= fr(() => {}, ["stop"]) + onClick: n[1] ||= mr(() => {}, ["stop"]), + onDblclick: n[2] ||= mr(() => {}, ["stop"]) }, [U("button", { type: "button", - class: wr(["mjr-workflow-action-btn", { "is-active": _e.value }]), + class: Er(["mjr-workflow-action-btn", { "is-active": _e.value }]), title: _e.value ? "Remove favorite" : "Add favorite", "aria-label": _e.value ? "Remove favorite" : "Add favorite", - onClick: n[0] ||= (e) => tt("favorite", e) - }, [U("i", { class: wr(_e.value ? "pi pi-star-fill" : "pi pi-star") }, null, 2)], 10, ws)], 32), + onClick: n[0] ||= (e) => nt("favorite", e) + }, [U("i", { class: Er(_e.value ? "pi pi-star-fill" : "pi pi-star") }, null, 2)], 10, Es)], 32), k.value && !Ue.value ? (q(), X("img", { key: 0, - class: wr(["mjr-thumb-media", { "mjr-workflow-graph-map-preview": w.value }]), + class: Er(["mjr-thumb-media", { "mjr-workflow-graph-map-preview": w.value }]), alt: A.value, decoding: "async", loading: "lazy", src: k.value, onError: et - }, null, 42, Ts)) : G("", !0), - U("div", { class: wr(["mjr-workflow-thumb", { + }, null, 42, Ds)) : G("", !0), + U("div", { class: Er(["mjr-workflow-thumb", { "has-thumbnail": k.value && !Ue.value, "has-graph-map": w.value && !Ue.value }]) }, [ n[15] ||= U("i", { class: "pi pi-sitemap" }, null, -1), - U("div", Es, J(pe.value || "Workflow"), 1), - U("div", Ds, [ - me.value ? (q(), X("span", Os, J(me.value), 1)) : G("", !0), - he.value ? (q(), X("span", ks, J(he.value), 1)) : G("", !0), - ge.value ? (q(), X("span", As, J(ge.value) + " nodes", 1)) : G("", !0), - xe.value ? (q(), X("span", js, J(Se.value), 1)) : G("", !0) + U("div", Os, J(pe.value || "Workflow"), 1), + U("div", ks, [ + me.value ? (q(), X("span", As, J(me.value), 1)) : G("", !0), + he.value ? (q(), X("span", js, J(he.value), 1)) : G("", !0), + ge.value ? (q(), X("span", Ms, J(ge.value) + " nodes", 1)) : G("", !0), + xe.value ? (q(), X("span", Ns, J(Se.value), 1)) : G("", !0) ]) ], 2) ], 64)) : _.value ? (q(), X(H, { key: 2 }, [Ue.value ? G("", !0) : (q(), X("img", { @@ -4138,9 +4138,9 @@ var gs = hs(), _s = ["title"], vs = /* @__PURE__ */ lr({ alt: A.value, decoding: "async", loading: "lazy", - src: Ge.value || E.value || void 0, + src: Ke.value || E.value || void 0, onError: et - }, null, 40, Ms)), Ue.value ? (q(), X("div", Ns, [...n[16] ||= [U("i", { class: "pi pi-image" }, null, -1)]])) : G("", !0)], 64)) : v.value ? (q(), X(H, { key: 3 }, [U("video", { + }, null, 40, Ps)), Ue.value ? (q(), X("div", Fs, [...n[16] ||= [U("i", { class: "pi pi-image" }, null, -1)]])) : G("", !0)], 64)) : v.value ? (q(), X(H, { key: 3 }, [U("video", { ref_key: "videoRef", ref: Be, class: "mjr-thumb-media", @@ -4154,30 +4154,30 @@ var gs = hs(), _s = ["title"], vs = /* @__PURE__ */ lr({ draggable: !1, tabindex: -1, style: { "pointer-events": "none" } - }, null, 8, Ps), n[17] ||= U("div", { class: "mjr-thumb-play" }, [U("i", { class: "pi pi-play" })], -1)], 64)) : y.value ? (q(), X(H, { key: 4 }, [k.value ? (q(), X("img", { + }, null, 8, Is), n[17] ||= U("div", { class: "mjr-thumb-play" }, [U("i", { class: "pi pi-play" })], -1)], 64)) : y.value ? (q(), X(H, { key: 4 }, [k.value ? (q(), X("img", { key: 0, class: "mjr-thumb-media", src: k.value, draggable: !1, alt: "" - }, null, 8, Fs)) : G("", !0), U("div", { class: wr(["mjr-audio-thumb", { "has-poster": k.value }]) }, [ - U("div", Is, [n[18] ||= U("span", { class: "mjr-audio-thumb-icon" }, [U("i", { class: "pi pi-volume-up" })], -1), U("span", Ls, J(M.value || "AUDIO"), 1)]), - U("div", Rs, [(q(!0), X(H, null, pr(ee.value, (e, t) => (q(), X("span", { + }, null, 8, Ls)) : G("", !0), U("div", { class: Er(["mjr-audio-thumb", { "has-poster": k.value }]) }, [ + U("div", Rs, [n[18] ||= U("span", { class: "mjr-audio-thumb-icon" }, [U("i", { class: "pi pi-volume-up" })], -1), U("span", zs, J(M.value || "AUDIO"), 1)]), + U("div", Bs, [(q(!0), X(H, null, hr(ee.value, (e, t) => (q(), X("span", { key: t, - style: yr({ + style: xr({ height: `${e.height}%`, opacity: e.opacity }) }, null, 4))), 128))]), - U("div", zs, [U("span", Bs, J(te.value), 1), U("span", Vs, J(F.value), 1)]) - ], 2)], 64)) : b.value ? (q(), X(H, { key: 5 }, [k.value && !We.value ? (q(), X("img", { + U("div", Vs, [U("span", Hs, J(te.value), 1), U("span", Us, J(F.value), 1)]) + ], 2)], 64)) : b.value ? (q(), X(H, { key: 5 }, [k.value && !Ge.value ? (q(), X("img", { key: 0, class: "mjr-thumb-media", src: k.value, draggable: !1, alt: A.value, - onError: R - }, null, 40, Hs)) : (q(), X("div", Us, [...n[19] ||= [U("i", { + onError: z + }, null, 40, Ws)) : (q(), X("div", Gs, [...n[19] ||= [U("i", { class: "pi pi-box", style: { "font-size": "2.5rem" } }, null, -1)]]))], 64)) : G("", !0), @@ -4185,7 +4185,7 @@ var gs = hs(), _s = ["title"], vs = /* @__PURE__ */ lr({ class: "mjr-file-badge mjr-badge-ext", "data-mjr-ext": M.value, "data-mjr-badge-bg": Oe.value, - style: yr({ + style: xr({ position: "absolute", top: "6px", left: "6px", @@ -4200,17 +4200,17 @@ var gs = hs(), _s = ["title"], vs = /* @__PURE__ */ lr({ cursor: De.value ? "pointer" : "default" }), title: De.value ? `${M.value} - duplicate filename (${e.asset._mjrNameCollisionCount || 2} files)` : `${M.value} file`, - onClick: z - }, J(M.value) + J(De.value ? "+" : ""), 13, Ws), - Y(vs, { + onClick: tt + }, J(M.value) + J(De.value ? "+" : ""), 13, Ks), + Y(bs, { rating: ne.value, class: "mjr-badge-rating" }, null, 8, ["rating"]), - Y(bs, { + Y(Ss, { tags: re.value, class: "mjr-badge-tags" }, null, 8, ["tags"]), - Y(Ss, { "gen-time-ms": ie.value }, null, 8, ["gen-time-ms"]), + Y(ws, { "gen-time-ms": ie.value }, null, 8, ["gen-time-ms"]), ce.value ? (q(), X("div", { key: 6, class: "mjr-live-pill", @@ -4218,11 +4218,11 @@ var gs = hs(), _s = ["title"], vs = /* @__PURE__ */ lr({ }, [n[20] ||= U("span", { class: "mjr-live-pill-dot", "aria-hidden": "true" - }, null, -1), U("span", null, J(le.value), 1)], 8, Gs)) : G("", !0), - L.value || g.value && P.value || ae.value ? (q(), X("div", Ks, [ - L.value ? (q(), X("div", qs, J(L.value), 1)) : G("", !0), - g.value && P.value ? (q(), X("div", Js, J(P.value), 1)) : G("", !0), - ae.value ? (q(), X("div", Ys, "Time " + J(oe.value.text), 1)) : G("", !0) + }, null, -1), U("span", null, J(le.value), 1)], 8, qs)) : G("", !0), + L.value || g.value && P.value || ae.value ? (q(), X("div", Js, [ + L.value ? (q(), X("div", Ys, J(L.value), 1)) : G("", !0), + g.value && P.value ? (q(), X("div", Xs, J(P.value), 1)) : G("", !0), + ae.value ? (q(), X("div", Zs, "Time " + J(oe.value.text), 1)) : G("", !0) ])) : G("", !0) ], 2), U("div", { @@ -4244,28 +4244,28 @@ var gs = hs(), _s = ["title"], vs = /* @__PURE__ */ lr({ "margin-bottom": "4px", "padding-right": "12px" } - }, J(N.value), 9, Zs), - U("div", Qs, [g.value ? (q(), X(H, { key: 0 }, [ + }, J(N.value), 9, $s), + U("div", ec, [g.value ? (q(), X(H, { key: 0 }, [ pe.value ? (q(), X("span", { key: 0, class: "mjr-meta-workflow-task", title: `Task: ${pe.value}` - }, J(pe.value), 9, $s)) : G("", !0), + }, J(pe.value), 9, tc)) : G("", !0), ve.value ? (q(), X("span", { key: 1, class: "mjr-meta-workflow-subgraphs", title: `${ve.value} subgraph${ve.value > 1 ? "s" : ""}` - }, J(ve.value) + " sub", 9, ec)) : G("", !0), + }, J(ve.value) + " sub", 9, nc)) : G("", !0), xe.value ? (q(), X("span", { key: 2, class: "mjr-meta-workflow-missing", title: Se.value - }, J(Se.value), 9, tc)) : G("", !0) - ], 64)) : G("", !0), (q(!0), X(H, null, pr(Ee.value, (e, t) => (q(), X(H, { key: e.key }, [t > 0 ? (q(), X("span", nc, "/")) : G("", !0), U("span", { - class: wr(e.className), - style: yr(e.style || null), + }, J(Se.value), 9, rc)) : G("", !0) + ], 64)) : G("", !0), (q(!0), X(H, null, hr(Ee.value, (e, t) => (q(), X(H, { key: e.key }, [t > 0 ? (q(), X("span", ic, "/")) : G("", !0), U("span", { + class: Er(e.className), + style: xr(e.style || null), title: e.title - }, J(e.text), 15, rc)], 64))), 128))]), + }, J(e.text), 15, ac)], 64))), 128))]), U("div", { ref_key: "dotWrapperRef", ref: He, @@ -4277,8 +4277,8 @@ var gs = hs(), _s = ["title"], vs = /* @__PURE__ */ lr({ "z-index": "2" } }, null, 512) - ], 8, Xs), - Ae.value ? (q(), nr(r, { + ], 8, Qs), + Ae.value ? (q(), ir(r, { key: 0, type: "button", class: "mjr-stack-group-button", @@ -4290,14 +4290,14 @@ var gs = hs(), _s = ["title"], vs = /* @__PURE__ */ lr({ "aria-label": `Open generation group in grid (${je.value} assets)`, title: `Open generation group in grid (${je.value} assets)`, onClick: Le, - onPointerdown: n[3] ||= fr(() => {}, ["stop"]), - onMousedown: n[4] ||= fr(() => {}, ["stop", "prevent"]), - onTouchstartPassive: n[5] ||= fr(() => {}, ["stop"]), - onDblclick: n[6] ||= fr(() => {}, ["stop"]), - onKeydown: n[7] ||= fr(() => {}, ["stop"]), - onDragstart: n[8] ||= fr(() => {}, ["stop", "prevent"]) + onPointerdown: n[3] ||= mr(() => {}, ["stop"]), + onMousedown: n[4] ||= mr(() => {}, ["stop", "prevent"]), + onTouchstartPassive: n[5] ||= mr(() => {}, ["stop"]), + onDblclick: n[6] ||= mr(() => {}, ["stop"]), + onKeydown: n[7] ||= mr(() => {}, ["stop"]), + onDragstart: n[8] ||= mr(() => {}, ["stop", "prevent"]) }, { - default: W(() => [n[21] ||= U("span", { class: "pi pi-clone" }, null, -1), U("span", ic, J(je.value), 1)]), + default: W(() => [n[21] ||= U("span", { class: "pi pi-clone" }, null, -1), U("span", oc, J(je.value), 1)]), _: 1 }, 8, [ "disabled", @@ -4305,7 +4305,7 @@ var gs = hs(), _s = ["title"], vs = /* @__PURE__ */ lr({ "aria-label", "title" ])) : G("", !0), - Pe.value ? (q(), nr(r, { + Pe.value ? (q(), ir(r, { key: 1, type: "button", class: "mjr-dup-stack-button", @@ -4317,14 +4317,14 @@ var gs = hs(), _s = ["title"], vs = /* @__PURE__ */ lr({ "aria-label": `${Ne.value} duplicate${Ne.value > 1 ? "s" : ""} - click to compare all copies`, title: `${Ne.value} duplicate${Ne.value > 1 ? "s" : ""} - click to compare all copies`, onClick: Re, - onPointerdown: n[9] ||= fr(() => {}, ["stop"]), - onMousedown: n[10] ||= fr(() => {}, ["stop", "prevent"]), - onTouchstartPassive: n[11] ||= fr(() => {}, ["stop"]), - onDblclick: n[12] ||= fr(() => {}, ["stop"]), - onKeydown: n[13] ||= fr(() => {}, ["stop"]), - onDragstart: n[14] ||= fr(() => {}, ["stop", "prevent"]) + onPointerdown: n[9] ||= mr(() => {}, ["stop"]), + onMousedown: n[10] ||= mr(() => {}, ["stop", "prevent"]), + onTouchstartPassive: n[11] ||= mr(() => {}, ["stop"]), + onDblclick: n[12] ||= mr(() => {}, ["stop"]), + onKeydown: n[13] ||= mr(() => {}, ["stop"]), + onDragstart: n[14] ||= mr(() => {}, ["stop", "prevent"]) }, { - default: W(() => [n[22] ||= U("span", { class: "pi pi-copy" }, null, -1), U("span", ac, J(Ne.value), 1)]), + default: W(() => [n[22] ||= U("span", { class: "pi pi-copy" }, null, -1), U("span", sc, J(Ne.value), 1)]), _: 1 }, 8, [ "disabled", @@ -4335,23 +4335,23 @@ var gs = hs(), _s = ["title"], vs = /* @__PURE__ */ lr({ ], 64); }; } -}), sc = [ +}), lc = [ "data-mjr-asset-id", "data-mjr-filename-key", "data-mjr-stem", "aria-label", "aria-selected" -], cc = { +], uc = { class: "mjr-card-info mjr-card-meta", style: { padding: "6px 8px", "min-width": "0" } -}, lc = ["title"], uc = /*#__PURE__*/ ((e, t) => { +}, dc = ["title"], fc = /*#__PURE__*/ ((e, t) => { let n = e.__vccOpts || e; for (let [e, r] of t) n[e] = r; return n; -})(/* @__PURE__ */ lr({ +})(/* @__PURE__ */ dr({ __name: "FolderCard", props: { asset: {}, @@ -4381,16 +4381,16 @@ var gs = hs(), _s = ["title"], vs = /* @__PURE__ */ lr({ }); } return (t, n) => (q(), X("div", { - class: wr(["mjr-asset-card mjr-card mjr-folder-card", { + class: Er(["mjr-asset-card mjr-card mjr-folder-card", { "is-selected": e.selected, "drop-active": i.value }]), role: "button", tabindex: 0, draggable: "true", - onDragover: fr(a, ["prevent"]), + onDragover: mr(a, ["prevent"]), onDragleave: o, - onDrop: fr(s, ["stop", "prevent"]), + onDrop: mr(s, ["stop", "prevent"]), "data-mjr-asset-id": String(e.asset.id ?? ""), "data-mjr-filename-key": String(e.asset.filename || "").toLowerCase(), "data-mjr-ext": "FOLDER", @@ -4416,7 +4416,7 @@ var gs = hs(), _s = ["title"], vs = /* @__PURE__ */ lr({ }), U("path", { fill: "#D9A730", d: "M20 6H4c-1.1 0-2 .9-2 2v10c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V8c0-1.1-.9-2-2-2z" - })])], -1), U("div", cc, [U("div", { + })])], -1), U("div", uc, [U("div", { class: "mjr-card-filename", title: e.asset.filename, style: { @@ -4425,15 +4425,15 @@ var gs = hs(), _s = ["title"], vs = /* @__PURE__ */ lr({ "white-space": "nowrap", "margin-bottom": "4px" } - }, J(e.asset.filename), 9, lc), n[0] ||= U("div", { class: "mjr-card-meta-row" }, null, -1)])], 42, sc)); + }, J(e.asset.filename), 9, dc), n[0] ||= U("div", { class: "mjr-card-meta-row" }, null, -1)])], 42, lc)); } }), [["__scopeId", "data-v-252fa951"]]); // ui/vue/composables/useGridState.ts -function dc(e) { +function pc(e) { return Array.from(e || []).map((e) => String(e || "").trim()).filter(Boolean); } -function fc() { - let e = br({ +function mc() { + let e = Sr({ query: "*", offset: 0, cursor: null, @@ -4462,7 +4462,7 @@ function fc() { e.virtualGrid = { setItems(t) { e.assets = Array.isArray(t) ? t.slice() : []; } }; - let t = K(() => new Set(dc(e.selectedIds))); + let t = K(() => new Set(pc(e.selectedIds))); function n(t = "", { error: n = !1 } = {}) { e.statusMessage = String(t || ""), e.statusError = !!n; } @@ -4482,14 +4482,14 @@ function fc() { e.query = String(t || "*") || "*", e.offset = 0, e.cursor = null, e.total = n == null ? null : Number(n) || 0, e.done = !!r, e.assets = [], o(); } function c(t, n = "", { preserveAnchor: r = !1 } = {}) { - let i = Array.from(new Set(dc(t))), a = String(n || i[0] || "").trim(); + let i = Array.from(new Set(pc(t))), a = String(n || i[0] || "").trim(); return e.selectedIds = i, e.activeId = a, r || (a ? e.selectionAnchorId = a : i.length || (e.selectionAnchorId = "")), { selectedIds: i, activeId: a }; } function l(t, { activeId: n = "" } = {}) { - let r = new Set(dc(t)), i = dc(e.selectedIds).filter((e) => r.has(e)), a = String(n || e.activeId || i[0] || "").trim(); + let r = new Set(pc(t)), i = pc(e.selectedIds).filter((e) => r.has(e)), a = String(n || e.activeId || i[0] || "").trim(); return c(i, r.has(a) ? a : i[0] || "", { preserveAnchor: !0 }); } function u() { @@ -4520,14 +4520,14 @@ function fc() { }; } // ui/vue/composables/gridVisibility.ts -function pc(e) { +function hc(e) { try { return typeof e?.getClientRects != "function" || e.getClientRects().length > 0; } catch (e) { return console.debug?.(e), !1; } } -function mc(e, { requireClientRect: t = !0 } = {}) { +function gc(e, { requireClientRect: t = !0 } = {}) { if (!e || typeof e != "object") return !1; try { if (typeof document < "u" && document.hidden) return !1; @@ -4552,14 +4552,14 @@ function mc(e, { requireClientRect: t = !0 } = {}) { } catch (e) { console.debug?.(e); } - return !t || pc(e); + return !t || hc(e); } -function hc(e) { - return mc(e, { requireClientRect: !0 }); +function _c(e) { + return gc(e, { requireClientRect: !0 }); } -function gc(e, t = null) { +function vc(e, t = null) { let n = t || e; - if (!hc(n) || e && e !== n && !mc(e, { requireClientRect: !1 })) return !1; + if (!_c(n) || e && e !== n && !gc(e, { requireClientRect: !1 })) return !1; try { let e = Number(n?.clientWidth || 0) || 0, t = Number(n?.clientHeight || 0) || 0; return e > 0 && t > 0; @@ -4568,50 +4568,50 @@ function gc(e, t = null) { } } // ui/vue/grid/useGridQuery.ts -function _c(e, t = "") { +function yc(e, t = "") { return String(e ?? t).trim() || String(t); } -function vc(e, t = 0) { +function bc(e, t = 0) { let n = Number(e); return Number.isFinite(n) ? n : t; } -function yc(e) { +function xc(e) { return e === !0 || e === 1 || String(e || "") === "1"; } -function bc(e = {}) { - let t = _c(e.q ?? e.query, "*") || "*", n = Object.prototype.hasOwnProperty.call(e, "resolutionCompare") ? String(e.resolutionCompare ?? "").trim().toLowerCase() : "gte", r = n === "lte" ? "lte" : n ? "gte" : ""; +function Sc(e = {}) { + let t = yc(e.q ?? e.query, "*") || "*", n = Object.prototype.hasOwnProperty.call(e, "resolutionCompare") ? String(e.resolutionCompare ?? "").trim().toLowerCase() : "gte", r = n === "lte" ? "lte" : n ? "gte" : ""; return Object.freeze({ - scope: _c(e.scope, "output").toLowerCase(), + scope: yc(e.scope, "output").toLowerCase(), q: t, query: t, - customRootId: _c(e.customRootId), - subfolder: _c(e.subfolder), - collectionId: _c(e.collectionId), - viewScope: _c(e.viewScope), - kind: _c(e.kind).toLowerCase(), - workflowOnly: yc(e.workflowOnly), - minRating: vc(e.minRating, 0), - minSizeMB: vc(e.minSizeMB, 0), - maxSizeMB: vc(e.maxSizeMB, 0), + customRootId: yc(e.customRootId), + subfolder: yc(e.subfolder), + collectionId: yc(e.collectionId), + viewScope: yc(e.viewScope), + kind: yc(e.kind).toLowerCase(), + workflowOnly: xc(e.workflowOnly), + minRating: bc(e.minRating, 0), + minSizeMB: bc(e.minSizeMB, 0), + maxSizeMB: bc(e.maxSizeMB, 0), resolutionCompare: r, - minWidth: vc(e.minWidth, 0), - minHeight: vc(e.minHeight, 0), - maxWidth: vc(e.maxWidth, 0), - maxHeight: vc(e.maxHeight, 0), - workflowType: _c(e.workflowType).toUpperCase(), - workflowId: _c(e.workflowId), - workflowModel: _c(e.workflowModel), - workflowRunsOn: _c(e.workflowRunsOn).toLowerCase(), - dateRange: _c(e.dateRange).toLowerCase(), - dateExact: _c(e.dateExact), - metadataSearchMode: _c(e.metadataSearchMode), - sort: _c(e.sort, "mtime_desc").toLowerCase(), - semanticMode: e.semanticMode === void 0 || e.semanticMode === null ? void 0 : yc(e.semanticMode), - groupStacks: e.groupStacks === void 0 || e.groupStacks === null ? void 0 : yc(e.groupStacks) + minWidth: bc(e.minWidth, 0), + minHeight: bc(e.minHeight, 0), + maxWidth: bc(e.maxWidth, 0), + maxHeight: bc(e.maxHeight, 0), + workflowType: yc(e.workflowType).toUpperCase(), + workflowId: yc(e.workflowId), + workflowModel: yc(e.workflowModel), + workflowRunsOn: yc(e.workflowRunsOn).toLowerCase(), + dateRange: yc(e.dateRange).toLowerCase(), + dateExact: yc(e.dateExact), + metadataSearchMode: yc(e.metadataSearchMode), + sort: yc(e.sort, "mtime_desc").toLowerCase(), + semanticMode: e.semanticMode === void 0 || e.semanticMode === null ? void 0 : xc(e.semanticMode), + groupStacks: e.groupStacks === void 0 || e.groupStacks === null ? void 0 : xc(e.groupStacks) }); } -function xc(e = {}, t = {}) { - return bc({ +function Cc(e = {}, t = {}) { + return Sc({ scope: e.mjrScope, q: e.mjrQuery, customRootId: e.mjrCustomRootId, @@ -4641,16 +4641,16 @@ function xc(e = {}, t = {}) { ...t }); } -function Sc(e = null, t = "*") { +function wc(e = null, t = "*") { let n = e?.dataset || {}; - return xc(n, { q: n.mjrQuery ?? t }).q; + return Cc(n, { q: n.mjrQuery ?? t }).q; } -function Cc(e = null, t = "mtime_desc") { +function Tc(e = null, t = "mtime_desc") { let n = e?.dataset || {}; - return xc(n, { sort: n.mjrSort ?? t }).sort; + return Cc(n, { sort: n.mjrSort ?? t }).sort; } -function wc(e = {}) { - let t = bc(e); +function Ec(e = {}) { + let t = Sc(e); return [ t.scope, t.q, @@ -4676,30 +4676,30 @@ function wc(e = {}) { t.dateExact ].join("|"); } -function Tc(e = {}) { - let t = bc(e), n = t.viewScope && t.viewScope !== t.scope ? t.viewScope : ""; +function Dc(e = {}) { + let t = Sc(e), n = t.viewScope && t.viewScope !== t.scope ? t.viewScope : ""; return !!(t.subfolder || t.customRootId || t.collectionId || n || t.kind || t.workflowOnly || t.minRating > 0 || t.minSizeMB > 0 || t.maxSizeMB > 0 || t.minWidth > 0 || t.minHeight > 0 || t.maxWidth > 0 || t.maxHeight > 0 || t.workflowType || t.workflowId || t.workflowModel || t.workflowRunsOn || t.dateRange || t.dateExact); } -function Ec(e = {}) { - let t = bc(e); - return t.scope === "output" && t.q === "*" && t.sort === "mtime_desc" && !Tc(t); +function Oc(e = {}) { + let t = Sc(e); + return t.scope === "output" && t.q === "*" && t.sort === "mtime_desc" && !Dc(t); } // ui/features/grid/PersistentAssetCache.ts -var Dc = "mjr-asset-cache", Oc = 1, kc = "snapshots", Ac = 24, jc = 500, Mc = 27e5, Nc = null; -function Pc() { - return Nc || (Nc = new Promise((e) => { +var kc = "mjr-asset-cache", Ac = 1, jc = "snapshots", Mc = 24, Nc = 500, Pc = 27e5, Fc = null; +function Ic() { + return Fc || (Fc = new Promise((e) => { try { - let t = indexedDB.open(Dc, Oc); + let t = indexedDB.open(kc, Ac); t.onupgradeneeded = () => { let e = t.result; - e.objectStoreNames.contains(kc) || e.createObjectStore(kc, { keyPath: "key" }); + e.objectStoreNames.contains(jc) || e.createObjectStore(jc, { keyPath: "key" }); }, t.onsuccess = () => e(t.result), t.onerror = () => e(null); } catch { e(null); } - }), Nc); + }), Fc); } -function Fc(e) { +function Lc(e) { return !e || typeof e != "object" ? null : { id: e.id, filename: e.filename, @@ -4724,39 +4724,39 @@ function Fc(e) { positive_prompt: e.positive_prompt }; } -function Ic(e) { +function Rc(e) { if (!e || typeof e != "object") return null; let t = Number(e.at || 0); - if (!t || Date.now() - t > Mc) return null; - let n = Array.isArray(e.assets) ? e.assets.map(Fc).filter(Boolean) : []; + if (!t || Date.now() - t > Pc) return null; + let n = Array.isArray(e.assets) ? e.assets.map(Lc).filter(Boolean) : []; return n.length ? { ...e, assets: n } : null; } -async function Lc(e) { - let t = await Pc(); +async function zc(e) { + let t = await Ic(); if (!t) return null; try { - return t.transaction(kc, e).objectStore(kc); + return t.transaction(jc, e).objectStore(jc); } catch { return null; } } -var Rc = { +var Bc = { async get(e) { - let t = await Lc("readonly"); + let t = await zc("readonly"); return !t || !e ? null : await new Promise((n) => { let r = t.get(e); - r.onsuccess = () => n(Ic(r.result)), r.onerror = () => n(null); + r.onsuccess = () => n(Rc(r.result)), r.onerror = () => n(null); }); }, async put(e, t) { - let n = await Lc("readwrite"), r = Ic({ + let n = await zc("readwrite"), r = Rc({ ...t, key: e, at: t?.at || Date.now(), - assets: Array.isArray(t?.assets) ? t.assets.slice(0, jc) : [] + assets: Array.isArray(t?.assets) ? t.assets.slice(0, Nc) : [] }); return !n || !e || !r ? !1 : (await new Promise((e) => { let t = n.put(r); @@ -4764,7 +4764,7 @@ var Rc = { }), this.prune(), !0); }, async prune() { - let e = await Lc("readwrite"); + let e = await zc("readwrite"); if (!e) return; let t = await new Promise((t) => { let n = [], r = e.openCursor(); @@ -4773,175 +4773,175 @@ var Rc = { if (!e) return t(n); n.push(e.value), e.continue(); }, r.onerror = () => t(n); - }), n = t.filter((e) => !Ic(e)).map((e) => e.key), r = t.filter((e) => !n.includes(e.key)).sort((e, t) => Number(e.at || 0) - Number(t.at || 0)).slice(0, Math.max(0, t.length - Ac)).map((e) => e.key); + }), n = t.filter((e) => !Rc(e)).map((e) => e.key), r = t.filter((e) => !n.includes(e.key)).sort((e, t) => Number(e.at || 0) - Number(t.at || 0)).slice(0, Math.max(0, t.length - Mc)).map((e) => e.key); for (let t of [...n, ...r]) e.delete(t); } -}, zc = /* @__PURE__ */ new Map(), Bc = !0, Vc = 8, Hc = 200, Uc = "mjr_grid_snapshot_cache_v2", Wc = 18e5, Gc = 1500, Kc = !1, qc = null, Jc = !1; -function Yc() { - return Bc; +}, Vc = /* @__PURE__ */ new Map(), Hc = !0, Uc = 8, Wc = 200, Gc = "mjr_grid_snapshot_cache_v2", Kc = 18e5, qc = 1500, Jc = !1, Yc = null, Xc = !1; +function Zc() { + return Hc; } -function Xc() { +function Qc() { try { - zc.clear(), nl()?.removeItem?.(Uc), globalThis?.sessionStorage?.removeItem?.(Uc); + Vc.clear(), il()?.removeItem?.(Gc), globalThis?.sessionStorage?.removeItem?.(Gc); } catch (e) { console.debug?.(e); } } -var Zc = /* @__PURE__ */ "id.filename.name.display_name.filepath.path.fullpath.full_path.file_info.subfolder.source.type.root_id.custom_root_id.kind.ext.size.mtime.generation_time.file_creation_time.created_at.updated_at.indexed_at.width.height.duration.thumbnail_url.thumb_url.preview_url.poster.url.rating.tags.has_workflow.hasWorkflow.has_generation_data.hasGenerationData.workflow_type.workflowType.workflow_id.workflowId.generation_time_ms.positive_prompt.enhanced_caption.auto_tags.has_ai_info.has_ai_vector.has_ai_auto_tags.has_ai_enhanced_caption.job_id.stack_id.source_node_id.source_node_type.date.date_exact".split("."); -function Qc(e, t = "") { +var $c = /* @__PURE__ */ "id.filename.name.display_name.filepath.path.fullpath.full_path.file_info.subfolder.source.type.root_id.custom_root_id.kind.ext.size.mtime.generation_time.file_creation_time.created_at.updated_at.indexed_at.width.height.duration.thumbnail_url.thumb_url.preview_url.poster.url.rating.tags.has_workflow.hasWorkflow.has_generation_data.hasGenerationData.workflow_type.workflowType.workflow_id.workflowId.generation_time_ms.positive_prompt.enhanced_caption.auto_tags.has_ai_info.has_ai_vector.has_ai_auto_tags.has_ai_enhanced_caption.job_id.stack_id.source_node_id.source_node_type.date.date_exact".split("."); +function el(e, t = "") { try { return String(e ?? t).trim(); } catch { return String(t); } } -function $c(e = {}) { +function tl(e = {}) { return JSON.stringify({ - scope: Qc(e.scope || "output", "output"), - query: Qc(e.query || e.q || "*", "*"), - customRootId: Qc(e.customRootId || ""), - subfolder: Qc(e.subfolder || ""), - collectionId: Qc(e.collectionId || ""), - viewScope: Qc(e.viewScope || ""), - kind: Qc(e.kind || ""), - workflowOnly: Qc(e.workflowOnly ? "1" : ""), - minRating: Qc(e.minRating || ""), - minSizeMB: Qc(e.minSizeMB || ""), - maxSizeMB: Qc(e.maxSizeMB || ""), - resolutionCompare: Qc(e.resolutionCompare || ""), - minWidth: Qc(e.minWidth || ""), - minHeight: Qc(e.minHeight || ""), - maxWidth: Qc(e.maxWidth || ""), - maxHeight: Qc(e.maxHeight || ""), - workflowType: Qc(e.workflowType || "").toUpperCase(), - workflowId: Qc(e.workflowId || ""), - workflowModel: Qc(e.workflowModel || ""), - workflowRunsOn: Qc(e.workflowRunsOn || "").toLowerCase(), - dateRange: Qc(e.dateRange || ""), - dateExact: Qc(e.dateExact || ""), - sort: Qc(e.sort || "mtime_desc", "mtime_desc"), - semanticMode: Qc(e.semanticMode ? "1" : "") + scope: el(e.scope || "output", "output"), + query: el(e.query || e.q || "*", "*"), + customRootId: el(e.customRootId || ""), + subfolder: el(e.subfolder || ""), + collectionId: el(e.collectionId || ""), + viewScope: el(e.viewScope || ""), + kind: el(e.kind || ""), + workflowOnly: el(e.workflowOnly ? "1" : ""), + minRating: el(e.minRating || ""), + minSizeMB: el(e.minSizeMB || ""), + maxSizeMB: el(e.maxSizeMB || ""), + resolutionCompare: el(e.resolutionCompare || ""), + minWidth: el(e.minWidth || ""), + minHeight: el(e.minHeight || ""), + maxWidth: el(e.maxWidth || ""), + maxHeight: el(e.maxHeight || ""), + workflowType: el(e.workflowType || "").toUpperCase(), + workflowId: el(e.workflowId || ""), + workflowModel: el(e.workflowModel || ""), + workflowRunsOn: el(e.workflowRunsOn || "").toLowerCase(), + dateRange: el(e.dateRange || ""), + dateExact: el(e.dateExact || ""), + sort: el(e.sort || "mtime_desc", "mtime_desc"), + semanticMode: el(e.semanticMode ? "1" : "") }); } -function el(e) { +function nl(e) { if (!e || typeof e != "object") return null; let t = {}; - for (let n of Zc) e[n] !== void 0 && (t[n] = e[n]); + for (let n of $c) e[n] !== void 0 && (t[n] = e[n]); return !t.type && t.source && (t.type = t.source), !t.source && t.type && (t.source = t.type), t.kind ||= e.kind || "image", Array.isArray(t.tags) && (t.tags = t.tags.slice(0, 80)), Array.isArray(t.auto_tags) && (t.auto_tags = t.auto_tags.slice(0, 80)), t; } -function tl(e) { +function rl(e) { if (!e || typeof e != "object") return null; let t = Number(e.at || 0) || 0; - if (!t || Date.now() - t > Wc) return null; - let n = Array.isArray(e.assets) ? e.assets.map(el).filter(Boolean) : []; + if (!t || Date.now() - t > Kc) return null; + let n = Array.isArray(e.assets) ? e.assets.map(nl).filter(Boolean) : []; if (!n.length) return null; let r = Number(e.total ?? n.length), i = Number(e.offset ?? n.length); return { assets: n, - title: Qc(e.title || "Cached", "Cached"), + title: el(e.title || "Cached", "Cached"), at: t, total: Number.isFinite(r) ? Math.max(0, r) : n.length, offset: Number.isFinite(i) ? Math.max(n.length, i) : n.length, done: !!e.done, - query: Qc(e.query || "*", "*") + query: el(e.query || "*", "*") }; } -function nl() { +function il() { try { return globalThis?.localStorage || null; } catch { return null; } } -Yc() || Xc(); -function rl(e) { +Zc() || Qc(); +function al(e) { try { let t = globalThis?.sessionStorage; if (!t || !e) return; - let n = t.getItem?.(Uc); + let n = t.getItem?.(Gc); if (!n) return; - e.getItem?.(Uc) || e.setItem(Uc, n), t.removeItem(Uc); + e.getItem?.(Gc) || e.setItem(Gc, n), t.removeItem(Gc); } catch (e) { console.debug?.(e); } } -function il() { +function ol() { let e = Date.now(); - for (let [t, n] of zc.entries()) { + for (let [t, n] of Vc.entries()) { let r = Number(n?.at || 0) || 0; - (!r || e - r > Wc) && zc.delete(t); + (!r || e - r > Kc) && Vc.delete(t); } - for (; zc.size > Vc;) { - let e = zc.keys().next().value; + for (; Vc.size > Uc;) { + let e = Vc.keys().next().value; if (!e) break; - zc.delete(e); + Vc.delete(e); } } -function al() { - if (!Yc()) Kc = !0, Xc(); - else if (!Kc) { - Kc = !0; +function sl() { + if (!Zc()) Jc = !0, Qc(); + else if (!Jc) { + Jc = !0; try { - let e = nl(); - rl(e); - let t = e?.getItem?.(Uc); + let e = il(); + al(e); + let t = e?.getItem?.(Gc); if (!t) return; let n = JSON.parse(t), r = Array.isArray(n?.entries) ? n.entries : []; for (let e of r) { if (!Array.isArray(e) || e.length < 2) continue; - let t = String(e[0] || ""), n = tl(e[1]); - t && n && zc.set(t, n); + let t = String(e[0] || ""), n = rl(e[1]); + t && n && Vc.set(t, n); } - il(); + ol(); } catch (e) { console.debug?.(e); } } } -function ol() { - if (!Yc()) Xc(); +function cl() { + if (!Zc()) Qc(); else try { - il(); - let e = nl(); + ol(); + let e = il(); if (!e) return; - let t = Array.from(zc.entries()).map(([e, t]) => [e, { + let t = Array.from(Vc.entries()).map(([e, t]) => [e, { ...t, - assets: Array.isArray(t?.assets) ? t.assets.slice(0, Hc) : [] + assets: Array.isArray(t?.assets) ? t.assets.slice(0, Wc) : [] }]); - e.setItem(Uc, JSON.stringify({ entries: t })); + e.setItem(Gc, JSON.stringify({ entries: t })); } catch (e) { console.debug?.(e); } } -function sl() { - Yc() ? (Jc = !0, !qc && (qc = setTimeout(() => { - qc = null, Jc && (Jc = !1, ol()); - }, Gc))) : (Xc(), Jc = !1); +function ll() { + Zc() ? (Xc = !0, !Yc && (Yc = setTimeout(() => { + Yc = null, Xc && (Xc = !1, cl()); + }, qc))) : (Qc(), Xc = !1); } -function cl() { - qc &&= (clearTimeout(qc), null), Jc && (Jc = !1, ol()); +function ul() { + Yc &&= (clearTimeout(Yc), null), Xc && (Xc = !1, cl()); } -function ll(e) { - if (!Yc()) return null; - al(); - let t = tl(zc.get(e)); - return t ? (zc.delete(e), zc.set(e, t), sl(), t) : (zc.delete(e), sl(), null); +function dl(e) { + if (!Zc()) return null; + sl(); + let t = rl(Vc.get(e)); + return t ? (Vc.delete(e), Vc.set(e, t), ll(), t) : (Vc.delete(e), ll(), null); } -function ul(e) { - return Yc() ? (al(), !!tl(zc.get(e))) : !1; +function fl(e) { + return Zc() ? (sl(), !!rl(Vc.get(e))) : !1; } -function dl(e, t) { - if (!Yc() || !e || !t || typeof t != "object") return !1; - let n = tl({ +function pl(e, t) { + if (!Zc() || !e || !t || typeof t != "object") return !1; + let n = rl({ ...t, at: t.at || Date.now() }); - return n ? (zc.delete(e), zc.set(e, n), sl(), Rc.put(String(e || ""), n).catch((e) => { + return n ? (Vc.delete(e), Vc.set(e, n), ll(), Bc.put(String(e || ""), n).catch((e) => { console.debug?.(e); }), !0) : !1; } // ui/vue/grid/useAssetCollection.ts -function fl(e) { +function ml(e) { return !e || typeof e != "object" ? "" : [ e.source || e.type || "output", e.root_id || e.custom_root_id || "", @@ -4949,7 +4949,7 @@ function fl(e) { e.filename || e.filepath || e.path || e.fullpath || e.full_path || "" ].join("|").trim().toLowerCase(); } -function pl(e = [], { assetKey: t = fl } = {}) { +function hl(e = [], { assetKey: t = ml } = {}) { let n = /* @__PURE__ */ new Map(), r = /* @__PURE__ */ new Map(); for (let i of Array.isArray(e) ? e : []) { if (!i || typeof i != "object") continue; @@ -4961,12 +4961,12 @@ function pl(e = [], { assetKey: t = fl } = {}) { byKey: r }; } -function ml(e, { assetKey: t = fl } = {}) { +function gl(e, { assetKey: t = ml } = {}) { if (!e || typeof e != "object") return e; - let n = pl(Array.isArray(e.assets) ? e.assets : [], { assetKey: t }); + let n = hl(Array.isArray(e.assets) ? e.assets : [], { assetKey: t }); return e.assetIdSet = new Set(n.byId.keys()), e.seenKeys = new Set(n.byKey.keys()), e; } -function hl(e, t = [], { assetKey: n = fl } = {}) { +function _l(e, t = [], { assetKey: n = ml } = {}) { if (!e || typeof e != "object") return 0; let r = new Set((Array.isArray(t) ? t : [t]).map((e) => e == null ? "" : typeof e == "object" && e?.id != null ? String(e.id) : String(e)).map((e) => e.trim()).filter(Boolean)); if (!r.size) return 0; @@ -4974,10 +4974,10 @@ function hl(e, t = [], { assetKey: n = fl } = {}) { return e.assets = (Array.isArray(e.assets) ? e.assets : []).filter((e) => { let t = e?.id == null ? "" : String(e.id); return !t || !r.has(t) || (i += 1, !1); - }), i > 0 && ml(e, { assetKey: n }), i; + }), i > 0 && gl(e, { assetKey: n }), i; } // ui/vue/grid/usePagedAssets.ts -function gl({ assets: e = [], count: t = null, limit: n = 0, offset: r = 0, total: i = null } = {}) { +function vl({ assets: e = [], count: t = null, limit: n = 0, offset: r = 0, total: i = null } = {}) { let a = Array.isArray(e) ? e.length : 0, o = t == null ? a : Math.max(0, Number(t) || 0); if (o <= 0) return 0; let s = Math.max(0, Number(n) || 0), c = Math.max(0, Number(r) || 0), l = i == null ? null : Math.max(0, Number(i) || 0), u = l == null ? null : Math.max(0, l - c); @@ -4986,7 +4986,7 @@ function gl({ assets: e = [], count: t = null, limit: n = 0, offset: r = 0, tota let d = Math.min(s, u ?? 0); return d <= 0 ? o : Math.max(o, d); } -async function _l({ fetchPage: e, applyPage: t, getLimit: n, canContinue: r = null, beforeApplyPage: i = null, onEmptyPage: a = null, maxEmptyPages: o = 6 } = {}) { +async function yl({ fetchPage: e, applyPage: t, getLimit: n, canContinue: r = null, beforeApplyPage: i = null, onEmptyPage: a = null, maxEmptyPages: o = 6 } = {}) { if (typeof e != "function" || typeof t != "function") return { ok: !1, error: /* @__PURE__ */ Error("fetchPage and applyPage are required") @@ -5042,8 +5042,8 @@ async function _l({ fetchPage: e, applyPage: t, getLimit: n, canContinue: r = nu lastResult: l }; } -function vl({ query: e, collection: t, fetchPage: n, pageSize: r = 80, getPageSize: i = null } = {}) { - let a = xr({ +function bl({ query: e, collection: t, fetchPage: n, pageSize: r = 80, getPageSize: i = null } = {}) { + let a = Cr({ offset: 0, cursor: null, total: null, @@ -5073,7 +5073,7 @@ function vl({ query: e, collection: t, fetchPage: n, pageSize: r = 80, getPageSi }; } function f(e, { limit: n = l() } = {}) { - let r = Array.isArray(e?.assets) ? e.assets : [], i = e?.total == null ? null : Number(e.total) || 0, o = gl({ + let r = Array.isArray(e?.assets) ? e.assets : [], i = e?.total == null ? null : Number(e.total) || 0, o = vl({ assets: r, count: e?.count, limit: Number(e?.limit || n) || n, @@ -5138,7 +5138,7 @@ function vl({ query: e, collection: t, fetchPage: n, pageSize: r = 80, getPageSi let u = a.requestId; a.loading = !0, a.error = null; try { - let n = await _l({ + let n = await yl({ maxEmptyPages: o, canContinue: t, getLimit: e, @@ -5198,12 +5198,12 @@ function vl({ query: e, collection: t, fetchPage: n, pageSize: r = 80, getPageSi }; } // ui/vue/composables/useVirtualGrid.ts -function yl(e, t) { +function xl(e, t) { if (!t || typeof t != "object") return !1; - let n = xc(e?.dataset || {}), r = n.scope, i = n.subfolder.toLowerCase(), a = n.kind, o = n.workflowOnly, s = n.minRating, c = n.workflowType.toLowerCase(), l = String(n.workflowId || "").trim(), u = n.dateExact, d = String(t?.subfolder || "").trim().toLowerCase(), f = String(t?.type || t?.source || "output").trim().toLowerCase(), p = String(t?.kind || "").trim().toLowerCase(), m = String(t?.workflow_type || t?.workflowType || "").trim().toLowerCase(), h = String(t?.workflow_id || t?.workflowId || t?.metadata?.workflow_id || t?.metadata?.workflow?.id || "").trim(), g = String(t?.date_exact || t?.date || "").trim(), _ = t?.has_workflow ?? t?.hasWorkflow ?? null; + let n = Cc(e?.dataset || {}), r = n.scope, i = n.subfolder.toLowerCase(), a = n.kind, o = n.workflowOnly, s = n.minRating, c = n.workflowType.toLowerCase(), l = String(n.workflowId || "").trim(), u = n.dateExact, d = String(t?.subfolder || "").trim().toLowerCase(), f = String(t?.type || t?.source || "output").trim().toLowerCase(), p = String(t?.kind || "").trim().toLowerCase(), m = String(t?.workflow_type || t?.workflowType || "").trim().toLowerCase(), h = String(t?.workflow_id || t?.workflowId || t?.metadata?.workflow_id || t?.metadata?.workflow?.id || "").trim(), g = String(t?.date_exact || t?.date || "").trim(), _ = t?.has_workflow ?? t?.hasWorkflow ?? null; return !(r && r !== "all" && f && f !== r || i && d !== i || a && p && p !== a || o && _ !== null && !_ || s > 0 && (Number(t?.rating || 0) || 0) < s || c && m !== c || l && h && h !== l || u && g && g !== u); } -async function bl(e, t, n, r, i, { requestId: a = 0, signal: o = null, cursor: s = null } = {}) { +async function Sl(e, t, n, r, i, { requestId: a = 0, signal: o = null, cursor: s = null } = {}) { let c = (e) => { if (typeof e == "string") return e; if (e && typeof e == "object") { @@ -5211,9 +5211,9 @@ async function bl(e, t, n, r, i, { requestId: a = 0, signal: o = null, cursor: s if (typeof e.target?.value == "string") return e.target.value; } return String(e || ""); - }, l = xc(e?.dataset || {}), { scope: u, customRootId: d, subfolder: f, kind: p, workflowOnly: m, minRating: h, minSizeMB: g, maxSizeMB: _, resolutionCompare: v, minWidth: y, minHeight: b, maxWidth: x, maxHeight: S, workflowType: C, workflowId: w, workflowModel: T, workflowRunsOn: E, dateRange: D, dateExact: O, metadataSearchMode: k } = l, A = l.sort || "mtime_desc", j = c(t).trim() || "*", M = /^\[object\s+HTML.*Element\]$/i.test(j) ? "*" : j, N = i.sanitizeQuery(M) || M; + }, l = Cc(e?.dataset || {}), { scope: u, customRootId: d, subfolder: f, kind: p, workflowOnly: m, minRating: h, minSizeMB: g, maxSizeMB: _, resolutionCompare: v, minWidth: y, minHeight: b, maxWidth: x, maxHeight: S, workflowType: C, workflowId: w, workflowModel: T, workflowRunsOn: E, dateRange: D, dateExact: O, metadataSearchMode: k } = l, A = l.sort || "mtime_desc", j = c(t).trim() || "*", M = /^\[object\s+HTML.*Element\]$/i.test(j) ? "*" : j, N = i.sanitizeQuery(M) || M; try { - let t = String(u || "").toLowerCase() === "output", c = Tc({ + let t = String(u || "").toLowerCase() === "output", c = Dc({ ...l, q: N }), j = t && Number(r ?? 0) === 0 && N === "*" && !c && String(A || "mtime_desc").toLowerCase() === "mtime_desc", M = !(t && (Number(r ?? 0) > 0 || j)), P = !!l.groupStacks, ee = Number(r ?? 0) > 0 ? null : s || null, te = i.buildListURL({ @@ -5302,7 +5302,7 @@ async function bl(e, t, n, r, i, { requestId: a = 0, signal: o = null, cursor: s }; } } -function xl(e, t) { +function Cl(e, t) { switch (t) { case "mtime_desc": return -(Number(e?.mtime) || 0); case "mtime_asc": return Number(e?.mtime) || 0; @@ -5311,23 +5311,23 @@ function xl(e, t) { default: return -(Number(e?.mtime) || 0); } } -function Sl(e, t, n) { +function wl(e, t, n) { if (n === "name_desc") { let n = String(e?.filename || "").toLowerCase(), r = String(t?.filename || "").toLowerCase(); return n > r ? -1 : +(n < r); } - let r = xl(e, n), i = xl(t, n); + let r = Cl(e, n), i = Cl(t, n); return r < i ? -1 : +(r > i); } -function Cl(e, t, n) { +function Tl(e, t, n) { return n === "name_asc" ? String(e) < String(t) : n === "name_desc" ? String(e) > String(t) : Number(e) < Number(t); } -function wl(e, t, n) { - let r = xl(t, n); - for (let t = 0; t < e.length; t++) if (Cl(r, xl(e[t], n), n)) return t; +function El(e, t, n) { + let r = Cl(t, n); + for (let t = 0; t < e.length; t++) if (Tl(r, Cl(e[t], n), n)) return t; return e.length; } -function Tl(e, t) { +function Dl(e, t) { let n = t.get(e); return n || (n = { pending: /* @__PURE__ */ new Map(), @@ -5335,13 +5335,13 @@ function Tl(e, t) { flushing: !1 }, t.set(e, n)), n; } -function El(e) { +function Ol(e) { return String(e ?? "").trim().toLowerCase(); } -function Dl(e) { +function kl(e) { return e?._mjrLivePlaceholder === !0 || e?.is_live_placeholder === !0 || String(e?.id || "").trim().toLowerCase().startsWith("live:"); } -function Ol(e) { +function Al(e) { if (!e || typeof e != "object") return e; try { delete e._mjrLivePlaceholder, delete e._mjrLiveStatus, delete e._mjrLiveLabel, delete e.is_live_placeholder; @@ -5350,24 +5350,24 @@ function Ol(e) { } return e; } -function kl(e) { +function jl(e) { if (!e || typeof e != "object") return ""; - let t = El(e?.type || e?.source || "output"), n = El(e?.root_id || e?.custom_root_id || ""), r = El(e?.subfolder || ""), i = El(e?.filename || ""); + let t = Ol(e?.type || e?.source || "output"), n = Ol(e?.root_id || e?.custom_root_id || ""), r = Ol(e?.subfolder || ""), i = Ol(e?.filename || ""); if (i) return `${t}|${n}|${r}|${i}`; - let a = El(e?.filepath || e?.path || e?.fullpath || e?.full_path || ""); + let a = Ol(e?.filepath || e?.path || e?.fullpath || e?.full_path || ""); return a ? `${t}|${n}|path|${a}` : ""; } -function Al(e, t, n) { +function Ml(e, t, n) { let r = Array.isArray(e?.assets) ? e.assets : []; if (t) { let e = r.findIndex((e) => String(e?.id || "") === t); if (e > -1) return e; } - let i = kl(n); - return i ? r.findIndex((e) => kl(e) === i) : -1; + let i = jl(n); + return i ? r.findIndex((e) => jl(e) === i) : -1; } -function jl(e, t) { - return !t || typeof t != "object" || !e || typeof e != "object" ? !1 : Dl(t) ? !0 : ![ +function Nl(e, t) { + return !t || typeof t != "object" || !e || typeof e != "object" ? !1 : kl(t) ? !0 : ![ "filename", "filepath", "path", @@ -5386,7 +5386,7 @@ function jl(e, t) { "date" ].some((t) => Object.prototype.hasOwnProperty.call(e, t)); } -function Ml(e, t) { +function Pl(e, t) { let n = /* @__PURE__ */ new Set(), r = /* @__PURE__ */ new Set(), i = /* @__PURE__ */ new Map(), a = []; for (let o of Array.isArray(e?.assets) ? e.assets : []) { let e = o?.id == null ? "" : String(o.id), s = t.assetKey(o), c = At(o?.filename); @@ -5402,9 +5402,9 @@ function Ml(e, t) { e && n.add(e), s && r.add(s), c && i.set(c, o), o._mjrNameCollision = !1, delete o._mjrNameCollisionCount, delete o._mjrNameCollisionPaths, a.push(o); } } - e.assets = a, ml(e, { assetKey: t.assetKey }); + e.assets = a, gl(e, { assetKey: t.assetKey }); } -function Nl(e, t) { +function Fl(e, t) { let n = t.upsertState.get(e); if (!n || n.pending.size === 0 || n.flushing) return; n.flushing = !0, n.timer &&= (clearTimeout(n.timer), null); @@ -5414,7 +5414,7 @@ function Nl(e, t) { try { let n = !1; for (let [a, o] of r.entries()) { - let r = Dl(o); + let r = kl(o); i.assetKeyFn = t.assetKey; let s = St(o, i, t.loadMajoorSettings); if (Array.isArray(s?.removed) && s.removed.length) { @@ -5441,14 +5441,14 @@ function Nl(e, t) { let c = i.assets.findIndex((e) => String(e.id) === a), l = c > -1 ? i.assets[c] : null, u = l ? { ...l, ...o - } : o, d = c > -1 ? c : Al(i, a, u), f = d > -1 ? i.assets[d] : null, p = f ? { + } : o, d = c > -1 ? c : Ml(i, a, u), f = d > -1 ? i.assets[d] : null, p = f ? { ...f, ...o } : u, m = t.assetKey(u); - if (!yl(e, p)) { + if (!xl(e, p)) { if (d > -1) { - if (jl(o, f)) { - Object.assign(f, o), r || Ol(f), i.assets[d] = { ...f }, n = !0; + if (Nl(o, f)) { + Object.assign(f, o), r || Al(f), i.assets[d] = { ...f }, n = !0; continue; } let [e] = i.assets.splice(d, 1); @@ -5456,16 +5456,16 @@ function Nl(e, t) { } } else if (d > -1) { let e = t.assetKey(f); - Object.assign(f, o), r || Ol(f); + Object.assign(f, o), r || Al(f); let a = { ...f }, s = t.assetKey(a); i.assets[d] = a, e && e !== s && (i.seenKeys?.delete?.(e), s && i.seenKeys?.add?.(s)), n = !0; } else if (!(i.seenKeys.has(m) || o.id != null && i.assetIdSet?.has?.(a))) { - let t = xc(e?.dataset || {}).sort || "mtime_desc", s = r ? u : Ol({ ...u }), c = wl(i.assets, s, t); + let t = Cc(e?.dataset || {}).sort || "mtime_desc", s = r ? u : Al({ ...u }), c = El(i.assets, s, t); i.seenKeys.add(m), o.id != null && i.assetIdSet?.add?.(a), i.assets.splice(c, 0, s), n = !0; } } if (n && a) { - Ml(i, t); + Pl(i, t); try { e.dataset.mjrHiddenPngSiblings = String(Number(i.hiddenPngSiblings || 0) || 0); } catch (e) { @@ -5477,22 +5477,22 @@ function Nl(e, t) { if (n.flushing = !1, n.pending.size > 0 && !n.timer) { let r = Math.min(16, t.debounceMs); n.timer = setTimeout(() => { - n.timer = null, Nl(e, t); + n.timer = null, Fl(e, t); }, r); } } } -function Pl(e, t, n) { +function Il(e, t, n) { if (!t || !t.id) return !1; let r = n.getOrCreateState(e), i = String(t.id); if (!n.ensureVirtualGrid(e, r)) return !1; - let a = Tl(e, n.upsertState); - return a.pending.set(i, t), a.pending.size >= n.maxBatchSize ? Nl(e, n) : !a.timer && !a.flushing && (a.timer = setTimeout(() => { - a.timer = null, Nl(e, n); + let a = Dl(e, n.upsertState); + return a.pending.set(i, t), a.pending.size >= n.maxBatchSize ? Fl(e, n) : !a.timer && !a.flushing && (a.timer = setTimeout(() => { + a.timer = null, Fl(e, n); }, n.debounceMs)), !0; } // ui/vue/components/grid/gridDomBridge.ts -function Fl(e) { +function Ll(e) { let t = String(e ?? ""); try { if (typeof CSS < "u" && typeof CSS.escape == "function") return CSS.escape(t); @@ -5501,7 +5501,7 @@ function Fl(e) { } return t.replace(/([!"#$%&'()*+,./:;<=>?@[\\\]^`{|}~])/g, "\\$1"); } -function Il(e) { +function Rl(e) { if (!e) return []; try { return Array.from(e.querySelectorAll?.(".mjr-asset-card") || []); @@ -5509,7 +5509,7 @@ function Il(e) { return console.debug?.(e), []; } } -function Ll(e) { +function zl(e) { if (!e) return null; try { return e.querySelector?.(".mjr-asset-card.is-selected") || null; @@ -5517,46 +5517,46 @@ function Ll(e) { return console.debug?.(e), null; } } -function Rl(e, t) { +function Bl(e, t) { if (!e) return null; let n = String(t || "").trim(); if (!n) return null; try { - return e.querySelector?.(`.mjr-asset-card[data-mjr-asset-id="${Fl(n)}"]`) || null; + return e.querySelector?.(`.mjr-asset-card[data-mjr-asset-id="${Ll(n)}"]`) || null; } catch (e) { return console.debug?.(e), null; } } -function zl(e, t = 0) { +function Vl(e, t = 0) { let n = e?.dataset?.mjrShown, r = Number(n); return Number.isFinite(r) ? Math.max(0, r) : Math.max(0, Number(t) || 0); } // ui/vue/composables/useGridLoader.ts -var Bl = 200, Vl = 50, Hl = /* @__PURE__ */ new WeakMap(), Ul = /* @__PURE__ */ new Set([ +var Hl = 200, Ul = 50, Wl = /* @__PURE__ */ new WeakMap(), Gl = /* @__PURE__ */ new Set([ "collection", "filter", "initial", "scope", "search", "sort" -]), Wl = 0; -function Gl(e) { +]), Kl = 0; +function ql(e) { return new Promise((t) => setTimeout(t, Math.max(0, Number(e) || 0))); } -function Kl(e) { +function Jl(e) { if (!e || typeof e != "object") return ""; if (e.id != null && String(e.id).trim()) return `id:${String(e.id).trim()}`; - let t = String(e?.type || e?.source || "output").trim().toLowerCase(), n = String(Me(e) || "").trim().toLowerCase(), r = String(e?.subfolder || "").trim().toLowerCase(), i = String(e?.filename || "").trim().toLowerCase(); + let t = String(e?.type || e?.source || "output").trim().toLowerCase(), n = String(ze(e) || "").trim().toLowerCase(), r = String(e?.subfolder || "").trim().toLowerCase(), i = String(e?.filename || "").trim().toLowerCase(); if (i) return `${t}|${n}|${r}|${i}`; let a = String(e?.filepath || e?.path || e?.fullpath || e?.full_path || "").trim().toLowerCase(); return a ? `${t}|${n}|path|${a}` : ""; } -function ql(e) { +function Yl(e) { if (e == null) return e; let t = String(e); return t.trim() === "" ? t : t.trim() === "*" ? "*" : t.replace(/[\u0000-\u001f\u007f]+/g, " ").replace(/[<>]/g, " ").replace(/\s+/g, " ").trim() || t; } -function Jl(e) { +function Xl(e) { if (typeof e == "string") return e; if (e && typeof e == "object") { if (typeof e.value == "string") return e.value; @@ -5572,13 +5572,13 @@ function Jl(e) { } return String(e || ""); } -function Yl(e) { +function Zl(e) { return e ? typeof e == "object" && "value" in e ? e.value || null : e : null; } -async function Xl() { - await sr(); +async function Ql() { + await lr(); } -function Zl(e, t) { +function $l(e, t) { let n = String(e || "Failed to load"); try { let e = String(t?.message || t || "").trim(), r = e.toLowerCase(); @@ -5587,13 +5587,13 @@ function Zl(e, t) { return n; } } -function Ql(e, t) { +function eu(e, t) { let n = Math.max(1, Math.min(B.MAX_PAGE_SIZE, Number(e) || 1)), r = Math.max(0, Number(t) || 0); if (r <= 0) return n; let i = 2 ** Math.min(r, 5); return Math.max(1, Math.min(B.MAX_PAGE_SIZE, n * i)); } -function $l() { +function tu() { try { let e = typeof navigator < "u" ? navigator : null, t = Number(e?.deviceMemory || 0) || 0; if (t > 0 && t <= 4 || e?.connection?.saveData === !0) return !0; @@ -5602,10 +5602,10 @@ function $l() { } return !1; } -function eu() { - return B.PREFETCH_NEXT_PAGE ? !$l() : !1; +function nu() { + return B.PREFETCH_NEXT_PAGE ? !tu() : !1; } -function tu(e, t = {}) { +function ru(e, t = {}) { let n = Array.isArray(e.assets) ? e.assets : []; t.rebuildFromVisible && n.length ? gt(e, n, { assetKey: t.assetKey || e.assetKeyFn, @@ -5615,7 +5615,7 @@ function tu(e, t = {}) { preserveHiddenCount: !1 }); } -function nu({ gridContainerRef: e, state: t, setLoadingMessage: n, clearLoadingMessage: r, setStatusMessage: i, clearStatusMessage: a, resetAssets: o, setSelection: s, reconcileSelection: c, readScrollElement: l = () => null, readRenderedCards: u = () => [], scrollToAssetId: d = () => {}, canLoadMore: f = null } = {}) { +function iu({ gridContainerRef: e, state: t, setLoadingMessage: n, clearLoadingMessage: r, setStatusMessage: i, clearStatusMessage: a, resetAssets: o, setSelection: s, reconcileSelection: c, readScrollElement: l = () => null, readRenderedCards: u = () => [], scrollToAssetId: d = () => {}, canLoadMore: f = null } = {}) { let p = !1, m = null, h = null, g = { pagesRequested: 0, assetsReceived: 0, @@ -5642,7 +5642,7 @@ function nu({ gridContainerRef: e, state: t, setLoadingMessage: n, clearLoadingM g.lastOperation = String(e || ""), t.reloadReason && (g.lastReloadReason = String(t.reloadReason || "")), t.appendReason && (g.lastAppendReason = String(t.appendReason || "")); } function y() { - return Yl(e); + return Zl(e); } function b() { return C(); @@ -5678,7 +5678,7 @@ function nu({ gridContainerRef: e, state: t, setLoadingMessage: n, clearLoadingM ...e, counts: { loaded: e.assets.length, - visible: zl(y(), e.assets.length), + visible: Vl(y(), e.assets.length), total: e.pagination.total }, metrics: { ...g } @@ -5686,8 +5686,8 @@ function nu({ gridContainerRef: e, state: t, setLoadingMessage: n, clearLoadingM } function C() { let e = y(); - return xc(e?.dataset || {}, { - q: Sc(e, t.query || "*"), + return Cc(e?.dataset || {}, { + q: wc(e, t.query || "*"), resolutionCompare: e?.dataset?.mjrFilterResolutionCompare || "" }); } @@ -5725,7 +5725,7 @@ function nu({ gridContainerRef: e, state: t, setLoadingMessage: n, clearLoadingM }; } function D(e) { - return Ul.has(String(e || "").toLowerCase()); + return Gl.has(String(e || "").toLowerCase()); } function O(e = null) { try { @@ -5743,7 +5743,7 @@ function nu({ gridContainerRef: e, state: t, setLoadingMessage: n, clearLoadingM } catch (e) { console.debug?.(e); } - return gc(y(), l()); + return vc(y(), l()); } function j() { if (!B.DEFER_GRID_FETCH_DURING_EXECUTION) return !1; @@ -5780,7 +5780,7 @@ function nu({ gridContainerRef: e, state: t, setLoadingMessage: n, clearLoadingM h = null; } function P(e, n = B.PREFETCH_NEXT_PAGE_DELAY_MS) { - if (!eu()) return; + if (!nu()) return; N(); let r = Math.max(0, Number(n) || 0); h = setTimeout(() => { @@ -5793,7 +5793,7 @@ function nu({ gridContainerRef: e, state: t, setLoadingMessage: n, clearLoadingM M(); let n = (() => { try { - return $c(C()); + return tl(C()); } catch (e) { return console.debug?.(e), null; } @@ -5814,7 +5814,7 @@ function nu({ gridContainerRef: e, state: t, setLoadingMessage: n, clearLoadingM if (n) { let e = null; try { - e = $c(C()); + e = tl(C()); } catch (e) { console.debug?.(e); } @@ -5823,7 +5823,7 @@ function nu({ gridContainerRef: e, state: t, setLoadingMessage: n, clearLoadingM return; } } - let a = Sc(i, e); + let a = wc(i, e); Promise.resolve().then(() => _e(a, { ...t || {}, reset: !0, @@ -5844,16 +5844,16 @@ function nu({ gridContainerRef: e, state: t, setLoadingMessage: n, clearLoadingM } function te(e, t = null) { if (!e || typeof e != "object") return ""; - let n = e.id == null ? `${e.type || ""}|${Me(e)}|${e.filepath || ""}|${e.subfolder || ""}|${e.filename || ""}` : `id:${e.id}`; + let n = e.id == null ? `${e.type || ""}|${ze(e)}|${e.filepath || ""}|${e.subfolder || ""}|${e.filename || ""}` : `id:${e.id}`; try { - return Ja(t || y() || globalThis?.__MJR_LAST_ASSETKEY_GRID__, e, n); + return Xa(t || y() || globalThis?.__MJR_LAST_ASSETKEY_GRID__, e, n); } catch (e) { return console.debug?.(e), n; } } function F() { try { - let e = Jt?.() || {}, t = e.grid || {}; + let e = Vn?.() || {}, t = e.grid || {}; return t.snapshotCacheEnabled === !0 || t.enableSnapshotCache === !0 || e.snapshotCacheEnabled === !0 || e.enableSnapshotCache === !0; } catch (e) { return console.debug?.(e), !1; @@ -5864,14 +5864,14 @@ function nu({ gridContainerRef: e, state: t, setLoadingMessage: n, clearLoadingM if (!F()) return; let n = y(), r = Array.isArray(t.assets) ? t.assets : []; if (!n || !r.length) return; - let i = r.map(el).filter(Boolean); + let i = r.map(nl).filter(Boolean); if (!i.length) return; - let a = i.length < r.length, o = Number(t.offset || i.length) || i.length, s = Number(t.total ?? i.length), c = xc(n.dataset || {}, { - q: Sc(n, t.query || "*"), + let a = i.length < r.length, o = Number(t.offset || i.length) || i.length, s = Number(t.total ?? i.length), c = Cc(n.dataset || {}, { + q: wc(n, t.query || "*"), resolutionCompare: n.dataset?.mjrFilterResolutionCompare || "" - }), l = $c(c); + }), l = tl(c); if (!l) return; - dl(l, { + pl(l, { assets: i, title: String(e || "").trim(), query: String(t.query || c.query || "*").trim() || "*", @@ -5886,7 +5886,7 @@ function nu({ gridContainerRef: e, state: t, setLoadingMessage: n, clearLoadingM function ne() { let e = y(); if (e) try { - let t = Hl.get(e); + let t = Wl.get(e); if (!t) return; t.timer &&= (clearTimeout(t.timer), null), t.pending.clear(), t.flushing = !1; } catch (e) { @@ -5895,24 +5895,24 @@ function nu({ gridContainerRef: e, state: t, setLoadingMessage: n, clearLoadingM } function ie(e, n) { let r = _(), i = Array.isArray(n) ? n.length : 0, o = Tt(e, n, t, { - loadMajoorSettings: Jt, + loadMajoorSettings: Vn, clearGridMessage: () => { a(); }, ensureVirtualGrid: () => t.virtualGrid, setFileBadgeCollision: Ct, assetKey: (t) => te(t, e), - ensureDupStackCard: (e, t, n) => Xa(e, t, n) + ensureDupStackCard: (e, t, n) => Qa(e, t, n) }); return g.renderTimeMs += Math.max(0, _() - r), g.assetsReceived += i, g.visibleAssetsAdded += Number(o || 0) || 0, g.hiddenOrDedupedAssets += Math.max(0, i - (Number(o || 0) || 0)), o; } function ae(e, t) { let n = String(t || "*").trim() || "*"; - return wc(xc(e?.dataset || {}, { q: n })); + return Ec(Cc(e?.dataset || {}, { q: n })); } function oe(e) { - let t = C(), n = ql(Jl(e).trim() || "*") || "*"; - return Ec({ + let t = C(), n = Yl(Xl(e).trim() || "*") || "*"; + return Oc({ ...t, q: n }); @@ -5932,9 +5932,9 @@ function nu({ gridContainerRef: e, state: t, setLoadingMessage: n, clearLoadingM error: "Grid unavailable" }; if (r === 0) { - let s = ae(o, e), c = Fr(); + let s = ae(o, e), c = Lr(); if (c && c === s) { - let o = Pr(s); + let o = Ir(s); if (o) try { let s = await o; if (Number(t.requestId) !== Number(i)) return { @@ -5970,9 +5970,9 @@ function nu({ gridContainerRef: e, state: t, setLoadingMessage: n, clearLoadingM } } } - return se(await bl(o, e, n, r, { - sanitizeQuery: ql, - buildListURL: et, + return se(await Sl(o, e, n, r, { + sanitizeQuery: Yl, + buildListURL: Ke, get: re, getGridState: () => t }, { @@ -5985,7 +5985,7 @@ function nu({ gridContainerRef: e, state: t, setLoadingMessage: n, clearLoadingM offset: r }); } - let ce = vl({ + let ce = bl({ query: { get value() { return t.query || "*"; @@ -6056,7 +6056,7 @@ function nu({ gridContainerRef: e, state: t, setLoadingMessage: n, clearLoadingM console.debug?.(e); } let f = Array.isArray(t.selectedIds) ? t.selectedIds.join("|") : "", m = String(t.activeId || ""); - if (v("appendNextPage", { appendReason: "pagination" }), !A()) return !t.assets.length && !t.loading && eu() && P(t.requestId, 400), { + if (v("appendNextPage", { appendReason: "pagination" }), !A()) return !t.assets.length && !t.loading && nu() && P(t.requestId, 400), { ok: !0, skipped: !0, hidden: !0 @@ -6079,7 +6079,7 @@ function nu({ gridContainerRef: e, state: t, setLoadingMessage: n, clearLoadingM let n = t.requestId, r = await ce.loadUntilVisible({ maxEmptyPages: 6, canContinue: () => A(), - getLimit: (e) => Ql(h, e), + getLimit: (e) => eu(h, e), beforeApplyPage: (e) => { if (t.requestId !== n) return { ok: !1, @@ -6097,7 +6097,7 @@ function nu({ gridContainerRef: e, state: t, setLoadingMessage: n, clearLoadingM cursor: null, total: null, done: !1 - }), tu(t), g.resetCount += 1, p = !1, null) : Array.isArray(t.assets) && t.assets.length ? (xe("[Grid LoadPage] empty response with cached visible assets - preserving cached view", { + }), ru(t), g.resetCount += 1, p = !1, null) : Array.isArray(t.assets) && t.assets.length ? (xe("[Grid LoadPage] empty response with cached visible assets - preserving cached view", { offset: t.offset, query: t.query }), { @@ -6111,15 +6111,15 @@ function nu({ gridContainerRef: e, state: t, setLoadingMessage: n, clearLoadingM e.emptyPageIndex <= 0 || xe(`[Grid LoadPage] fetched adaptive page with no visible additions: offset=${t.offset}, fetched=${e.count}, consumed=${e.advanced}, added=${e.added}, limit=${e.limit}, done=${t.done}, visibleCount=${t.assets.length}, total=${t.total}`); } }); - if (de(), fe(), !r.ok) return r.aborted || r.stale || (ue({ done: !0 }), i(Zl("Failed to load assets", r?.error || "Unknown error"), { error: !0 })), r; + if (de(), fe(), !r.ok) return r.aborted || r.stale || (ue({ done: !0 }), i($l("Failed to load assets", r?.error || "Unknown error"), { error: !0 })), r; if (r.preservedCached) return r; - if (t.done || r.added > 0) return I(t.query || Sc(e, "*")), { + if (t.done || r.added > 0) return I(t.query || wc(e, "*")), { ok: !0, count: r.count, total: t.total }; let a = r.lastResult || r.firstResult || r; - return xe(`[Grid LoadPage] fetched one page with no visible additions: offset=${t.offset}, fetched=${r.count}, consumed=${a.advanced}, added=${a.added}, limit=${a.limit || h}, done=${t.done}, visibleCount=${t.assets.length}, total=${t.total}`), !t.done && eu() && P(Number(t.requestId ?? 0) || 0, Math.min(B.PREFETCH_NEXT_PAGE_DELAY_MS ?? 700, 250)), { + return xe(`[Grid LoadPage] fetched one page with no visible additions: offset=${t.offset}, fetched=${r.count}, consumed=${a.advanced}, added=${a.added}, limit=${a.limit || h}, done=${t.done}, visibleCount=${t.assets.length}, total=${t.total}`), !t.done && nu() && P(Number(t.requestId ?? 0) || 0, Math.min(B.PREFETCH_NEXT_PAGE_DELAY_MS ?? 700, 250)), { ok: !0, count: r.count, total: t.total, @@ -6141,7 +6141,7 @@ function nu({ gridContainerRef: e, state: t, setLoadingMessage: n, clearLoadingM } catch (e) { console.debug?.(e); } - return i(Zl("Failed to load assets", e), { error: !0 }), { + return i($l("Failed to load assets", e), { error: !0 }), { ok: !1, error: e?.message || String(e) }; @@ -6163,7 +6163,7 @@ function nu({ gridContainerRef: e, state: t, setLoadingMessage: n, clearLoadingM } try { let e = Date.now() - _; - e < Wl && await Gl(Wl - e); + e < Kl && await ql(Kl - e); } catch (e) { console.debug?.(e); } @@ -6180,7 +6180,7 @@ function nu({ gridContainerRef: e, state: t, setLoadingMessage: n, clearLoadingM } let n = t.requestId, r = null; try { - r = $c(C()); + r = tl(C()); } catch (e) { console.debug?.(e); } @@ -6189,7 +6189,7 @@ function nu({ gridContainerRef: e, state: t, setLoadingMessage: n, clearLoadingM if (r) { let e = null; try { - e = $c(C()); + e = tl(C()); } catch (e) { console.debug?.(e); } @@ -6208,7 +6208,7 @@ function nu({ gridContainerRef: e, state: t, setLoadingMessage: n, clearLoadingM if (r) { let e = null; try { - e = $c(C()); + e = tl(C()); } catch (e) { console.debug?.(e); } @@ -6243,7 +6243,7 @@ function nu({ gridContainerRef: e, state: t, setLoadingMessage: n, clearLoadingM } catch (e) { console.debug?.(e); } - let d = Jl(e).trim() || "*", f = /^\[object\s+HTML.*Element\]$/i.test(d) ? "*" : d, m = ql(f) || f; + let d = Xl(e).trim() || "*", f = /^\[object\s+HTML.*Element\]$/i.test(d) ? "*" : d, m = Yl(f) || f; t.query = m; let h = c ? E(m, i) : { reason: "append", @@ -6254,8 +6254,8 @@ function nu({ gridContainerRef: e, state: t, setLoadingMessage: n, clearLoadingM try { let n = C(); n.query = m; - let r = $c(n); - if (F() && ul(r) && (e = await Te(n, { allowReplaceExisting: !0 }), t.requestId > s + +!!e)) return console.debug?.("[Grid] loadAssets aborted during deferral due to scope switch"), { + let r = tl(n); + if (F() && fl(r) && (e = await Te(n, { allowReplaceExisting: !0 }), t.requestId > s + +!!e)) return console.debug?.("[Grid] loadAssets aborted during deferral due to scope switch"), { ok: !1, aborted: !0 }; @@ -6294,7 +6294,7 @@ function nu({ gridContainerRef: e, state: t, setLoadingMessage: n, clearLoadingM cursor: null, total: null, done: !1 - }), tu(t, { + }), ru(t, { rebuildFromVisible: !0, preserveHiddenCount: !0, assetKey: (e) => te(e, u) @@ -6307,10 +6307,10 @@ function nu({ gridContainerRef: e, state: t, setLoadingMessage: n, clearLoadingM cursor: null, total: null, done: !1 - }), tu(t), g.resetCount += 1), n(m === "*" ? "Loading assets..." : `Searching for "${m}"...`); + }), ru(t), g.resetCount += 1), n(m === "*" ? "Loading assets..." : `Searching for "${m}"...`); } let _ = await me(); - return fe(), eu() && _?.ok && !_?.skipped && !t.done && !_?.aborted && P(t.requestId), c && (pe({ + return fe(), nu() && _?.ok && !_?.skipped && !t.done && !_?.aborted && P(t.requestId), c && (pe({ title: m, showEmptyMessage: !(_?.skipped || _?.hidden || _?.aborted || _?.stale || _?.preservedCached || _?.busy) }), O(h.nextContext)), { @@ -6359,15 +6359,15 @@ function nu({ gridContainerRef: e, state: t, setLoadingMessage: n, clearLoadingM cursor: null, total: p.length, done: !0 - }), tu(t), g.resetCount += 1), u ? (n(p.length ? `Loading ${c}...` : `${c} is empty`), t.loading = !0) : (r(), t.loading = !1); + }), ru(t), g.resetCount += 1), u ? (n(p.length ? `Loading ${c}...` : `${c} is empty`), t.loading = !0) : (r(), t.loading = !1); } try { - let e = Cc(f, "mtime_desc"), n = p.sort((t, n) => Sl(t, n, e)); + let e = Tc(f, "mtime_desc"), n = p.sort((t, n) => wl(t, n, e)); return l && h && (o({ query: String(c || "Collection"), total: p.length, done: !0 - }), tu(t), g.resetCount += 1), ie(f, n), ue({ + }), ru(t), g.resetCount += 1), ie(f, n), ue({ offset: n.length, cursor: null, total: n.length, @@ -6378,14 +6378,14 @@ function nu({ gridContainerRef: e, state: t, setLoadingMessage: n, clearLoadingM total: n.length }; } catch (e) { - return i(Zl("Failed to load collection", e), { error: !0 }), { + return i($l("Failed to load collection", e), { error: !0 }), { ok: !1, error: e?.message || String(e) }; } finally { if (u) try { let e = Date.now() - m; - e < Wl && await Gl(Wl - e); + e < Kl && await ql(Kl - e); } catch (e) { console.debug?.(e); } @@ -6395,7 +6395,7 @@ function nu({ gridContainerRef: e, state: t, setLoadingMessage: n, clearLoadingM function ye() { v("reload", { reloadReason: "scopeSwitch" }); try { - Ya(y()); + Za(y()); } catch (e) { console.debug?.(e); } @@ -6415,7 +6415,7 @@ function nu({ gridContainerRef: e, state: t, setLoadingMessage: n, clearLoadingM t.virtualGrid?.setItems?.(t.assets || []); } function Se(e, { updateSelection: n = !0 } = {}) { - let r = hl(t, e, { assetKey: (e) => te(e, y()) }); + let r = _l(t, e, { assetKey: (e) => te(e, y()) }); return r ? (Number.isFinite(Number(t.total)) && ue({ total: Math.max(0, Number(t.total || 0) - r) }), n && c(t.assets.map((e) => String(e?.id || "")).filter(Boolean), { activeId: t.activeId }), !t.assets.length && !t.loading && i("No assets found"), { ok: !0, removed: r, @@ -6437,7 +6437,7 @@ function nu({ gridContainerRef: e, state: t, setLoadingMessage: n, clearLoadingM } catch { return !1; } - }, r = Ll(e), i = u(), a = i.find((e) => n(e)) || i[0] || null, o = n(r) ? r : a; + }, r = zl(e), i = u(), a = i.find((e) => n(e)) || i[0] || null, o = n(r) ? r : a; if (!o) return null; try { let e = o.getBoundingClientRect(), n = t.getBoundingClientRect(); @@ -6453,14 +6453,14 @@ function nu({ gridContainerRef: e, state: t, setLoadingMessage: n, clearLoadingM async function we(e) { let t = y(), n = l(); if (!t || !n || !e) return; - await Xl(); + await Ql(); let r = String(e.id || "").trim(); if (!r) { n.scrollTop = Number(e.scrollTop || 0) || 0, g.scrollRestoreCount += 1; return; } - d(r, { align: "start" }), await Xl(); - let i = Rl(t, r); + d(r, { align: "start" }), await Ql(); + let i = Bl(t, r); if (!i) n.scrollTop = Number(e.scrollTop || 0) || 0, g.scrollRestoreCount += 1; else try { let t = i.getBoundingClientRect(), r = n.getBoundingClientRect(), a = t.top - r.top - Number(e.top || 0); @@ -6472,7 +6472,7 @@ function nu({ gridContainerRef: e, state: t, setLoadingMessage: n, clearLoadingM async function Te(e = {}, n = {}) { let i = y(); if (!i || !F()) return !1; - let s = $c(e), c = ll(s); + let s = tl(e), c = dl(s); if (!c || !Array.isArray(c.assets) || !c.assets.length || !n.allowReplaceExisting && Array.isArray(t.assets) && t.assets.length) return !1; g.lastResetReason = "snapshot"; try { @@ -6489,7 +6489,7 @@ function nu({ gridContainerRef: e, state: t, setLoadingMessage: n, clearLoadingM query: c.query || n.title || "Cached", total: Number(c.total ?? c.assets.length) || c.assets.length, done: !!c.done - }), tu(t), g.resetCount += 1, a(), r(), t.loading = !1, ie(i, c.assets), ue({ + }), ru(t), g.resetCount += 1, a(), r(), t.loading = !1, ie(i, c.assets), ue({ offset: Math.max(Number(c.assets.length || 0) || 0, Number(c.offset || c.assets.length) || c.assets.length), cursor: c.cursor || null, total: Number(c.total ?? c.assets.length) || c.assets.length, @@ -6503,34 +6503,34 @@ function nu({ gridContainerRef: e, state: t, setLoadingMessage: n, clearLoadingM return { getOrCreateState: () => t, ensureVirtualGrid: () => t.virtualGrid, - upsertState: Hl, - maxBatchSize: Vl, - debounceMs: Bl, - assetKey: (t) => Kl(t) || te(t, e), - loadMajoorSettings: Jt + upsertState: Wl, + maxBatchSize: Ul, + debounceMs: Hl, + assetKey: (t) => Jl(t) || te(t, e), + loadMajoorSettings: Vn }; } function De(e) { v("upsertRealtime", { appendReason: "realtime" }); let t = y(); - return !t || !e || !e.id ? !1 : Pl(t, e, Ee(t)); + return !t || !e || !e.id ? !1 : Il(t, e, Ee(t)); } let Oe = !1; function ke(e) { v("upsertRealtime", { appendReason: "realtimeImmediate" }); let t = y(); if (!t || !e || !e.id) return !1; - let n = Pl(t, e, Ee(t)); + let n = Il(t, e, Ee(t)); return n && !Oe && (Oe = !0, queueMicrotask(() => { Oe = !1; let e = y(); - e && Nl(e, Ee(e)); + e && Fl(e, Ee(e)); })), n; } function Ae() { I(t.query || "Cached"); try { - cl(); + ul(); } catch (e) { console.debug?.(e); } @@ -6542,7 +6542,7 @@ function nu({ gridContainerRef: e, state: t, setLoadingMessage: n, clearLoadingM } let e = y(); if (e) try { - let t = Tl(e, Hl); + let t = Dl(e, Wl); t?.timer && (clearTimeout(t.timer), t.timer = null), t?.pending?.clear?.(); } catch (e) { console.debug?.(e); @@ -6580,10 +6580,10 @@ function nu({ gridContainerRef: e, state: t, setLoadingMessage: n, clearLoadingM }; } // node_modules/@tanstack/virtual-core/dist/esm/lazy-measurements.js -function ru(e) { +function au(e) { return typeof e == "object" ? e.key : e; } -function iu(e, t) { +function ou(e, t) { let n = e.length; return new Proxy(e, { get(e, r, i) { if (typeof r == "string") { @@ -6612,7 +6612,7 @@ function iu(e, t) { } }); } // node_modules/@tanstack/virtual-core/dist/esm/utils.js -function au(e, t, n) { +function su(e, t, n) { let r = n.initialDeps ?? [], i, a = !0; function o() { let o = e(); @@ -6622,34 +6622,34 @@ function au(e, t, n) { r = e; }, o; } -function ou(e, t) { +function cu(e, t) { if (e === void 0) throw Error(`Unexpected undefined${t ? `: ${t}` : ""}`); return e; } -var su = (e, t) => Math.abs(e - t) < 1.01, cu = (e, t, n) => { +var lu = (e, t) => Math.abs(e - t) < 1.01, uu = (e, t, n) => { let r; return Object.assign(function(...i) { e.clearTimeout(r), r = e.setTimeout(() => t.apply(this, i), n); }, { cancel: () => { e.clearTimeout(r); } }); -}, lu, uu = () => { - if (lu !== void 0) return lu; - if (typeof navigator > "u") return lu = !1; - if (/iP(hone|od|ad)/.test(navigator.userAgent)) return lu = !0; +}, du, fu = () => { + if (du !== void 0) return du; + if (typeof navigator > "u") return du = !1; + if (/iP(hone|od|ad)/.test(navigator.userAgent)) return du = !0; let e = navigator.maxTouchPoints; - return lu = navigator.platform === "MacIntel" && e !== void 0 && e > 0; -}, du = (e) => { + return du = navigator.platform === "MacIntel" && e !== void 0 && e > 0; +}, pu = (e) => { let { offsetWidth: t, offsetHeight: n } = e; return { width: t, height: n }; -}, fu = (e) => e, pu = (e) => { +}, mu = (e) => e, hu = (e) => { let t = Math.max(e.startIndex - e.overscan, 0), n = Math.min(e.endIndex + e.overscan, e.count - 1) - t + 1, r = Array(n); for (let e = 0; e < n; e++) r[e] = t + e; return r; -}, mu = (e, t) => { +}, gu = (e, t) => { let n = e.scrollElement; if (!n) return; let r = e.targetWindow; @@ -6661,7 +6661,7 @@ var su = (e, t) => Math.abs(e - t) < 1.01, cu = (e, t, n) => { height: Math.round(r) }); }; - if (i(du(n)), !r.ResizeObserver) return () => {}; + if (i(pu(n)), !r.ResizeObserver) return () => {}; let a = new r.ResizeObserver((t) => { let r = () => { let e = t[0]; @@ -6675,28 +6675,28 @@ var su = (e, t) => Math.abs(e - t) < 1.01, cu = (e, t, n) => { return; } } - i(du(n)); + i(pu(n)); }; e.options.useAnimationFrameWithResizeObserver ? requestAnimationFrame(r) : r(); }); return a.observe(n, { box: "border-box" }), () => { a.unobserve(n); }; -}, hu = { passive: !0 }, gu = typeof window > "u" || "onscrollend" in window, _u = (e, t, n) => { +}, _u = { passive: !0 }, vu = typeof window > "u" || "onscrollend" in window, yu = (e, t, n) => { let r = e.scrollElement; if (!r) return; let i = e.targetWindow; if (!i) return; - let a = e.options.useScrollendEvent && gu, o = 0, s = a ? null : cu(i, () => t(n(r), !1), e.options.isScrollingResetDelay), c = (e) => () => { + let a = e.options.useScrollendEvent && vu, o = 0, s = a ? null : uu(i, () => t(n(r), !1), e.options.isScrollingResetDelay), c = (e) => () => { o = n(r), s?.(), t(o, e); }, l = c(!0), u = c(!1); - return r.addEventListener("scroll", l, hu), a && r.addEventListener("scrollend", u, hu), () => { + return r.addEventListener("scroll", l, _u), a && r.addEventListener("scrollend", u, _u), () => { r.removeEventListener("scroll", l), a && r.removeEventListener("scrollend", u), s?.cancel(); }; -}, vu = (e, t) => _u(e, t, (t) => { +}, bu = (e, t) => yu(e, t, (t) => { let { horizontal: n, isRtl: r } = e.options; return n ? t.scrollLeft * (r && -1 || 1) : t.scrollTop; -}), yu = (e, t, n) => { +}), xu = (e, t, n) => { if (n.options.useCachedMeasurements) { let t = n.indexFromElement(e), r = n.options.getItemKey(t); return n.itemSizeCache.get(r) ?? n.options.estimateSize(t); @@ -6710,14 +6710,14 @@ var su = (e, t) => Math.abs(e - t) < 1.01, cu = (e, t, n) => { if (i !== void 0) return i; } return e[n.options.horizontal ? "offsetWidth" : "offsetHeight"]; -}, bu = (e, { adjustments: t = 0, behavior: n }, r) => { +}, Su = (e, { adjustments: t = 0, behavior: n }, r) => { var i, a; (a = (i = r.scrollElement)?.scrollTo) == null || a.call(i, { [r.options.horizontal ? "left" : "top"]: e + t, behavior: n }); }; -function xu(e, t, n, r) { +function Cu(e, t, n, r) { if (t === 0) return !1; let i = r(0), a = /* @__PURE__ */ new Set(), o = 0; for (; o < e;) { @@ -6731,7 +6731,7 @@ function xu(e, t, n, r) { for (let e = s; e < t; e++) if (a.has(r(e))) return !1; return !0; } -var Su = class { +var wu = class { constructor(e) { this.unsubs = [], this.scrollElement = null, this.targetWindow = null, this.isScrolling = !1, this.scrollState = null, this.measurementsCache = [], this._singleLaneMeasurements = null, this.itemSizeCache = /* @__PURE__ */ new Map(), this.itemSizeCacheVersion = 0, this.laneAssignments = /* @__PURE__ */ new Map(), this.pendingMin = null, this.prevLanes = void 0, this.lanesChangedFlag = !1, this.lanesSettling = !1, this.pendingScrollAnchor = null, this.scrollRect = null, this.scrollOffset = null, this.scrollDirection = null, this.scrollAdjustments = 0, this._iosDeferredAdjustment = 0, this._iosTouching = !1, this._iosJustTouchEnded = !1, this._iosTouchEndTimerId = null, this._intendedScrollOffset = null, this._clampedAdjustment = null, this.elementsCache = /* @__PURE__ */ new Map(), this.now = () => { var e; @@ -6771,10 +6771,10 @@ var Su = class { scrollPaddingStart: 0, scrollPaddingEnd: 0, horizontal: !1, - getItemKey: fu, - rangeExtractor: pu, + getItemKey: mu, + rangeExtractor: hu, onChange: () => {}, - measureElement: yu, + measureElement: xu, initialRect: { width: 0, height: 0 @@ -6801,13 +6801,13 @@ var Su = class { } let n = this.options, r = null, i = null, a = !1; if (n !== void 0 && n.enabled && t.enabled && t.anchorTo === "end" && this.scrollElement !== null) { - let e = n.count, o = t.count, s = this.getMeasurements(), c = this._singleLaneMeasurements?.items ?? s, l = (e) => ru(c[e]), u = e > 0 ? l(0) : null, d = e > 0 ? l(e - 1) : null; + let e = n.count, o = t.count, s = this.getMeasurements(), c = this._singleLaneMeasurements?.items ?? s, l = (e) => au(c[e]), u = e > 0 ? l(0) : null, d = e > 0 ? l(e - 1) : null; if (o !== e || e > 0 && o > 0 && (t.getItemKey(0) !== u || t.getItemKey(o - 1) !== d)) { a = !0; let c = e > 0 ? this.getVirtualItemForOffset(this.getScrollOffset()) ?? s[0] : null; c && (r = [c.key, this.getScrollOffset() - c.start]); let u = t.followOnAppend === !0 ? "auto" : t.followOnAppend || null; - u && o > 0 && this.isAtEnd(n.scrollEndThreshold) && (e === 0 || t.getItemKey(o - 1) !== d) && (o > e || xu(e, o, l, t.getItemKey)) && (i = u); + u && o > 0 && this.isAtEnd(n.scrollEndThreshold) && (e === 0 || t.getItemKey(o - 1) !== d) && (o > e || Cu(e, o, l, t.getItemKey)) && (i = u); } } this.options = t, a && (this.pendingMin = 0, this.itemSizeCacheVersion++); @@ -6832,7 +6832,7 @@ var Su = class { }, this.notify = (e) => { var t, n; (n = (t = this.options).onChange) == null || n.call(t, this, e); - }, this.maybeNotify = au(() => (this.calculateRange(), [ + }, this.maybeNotify = su(() => (this.calculateRange(), [ this.isScrolling, this.range ? this.range.startIndex : null, this.range ? this.range.endIndex : null @@ -6870,11 +6870,11 @@ var Su = class { let e = this.scrollElement, t = () => { this._iosTouching = !0, this._iosJustTouchEnded = !1, this._iosTouchEndTimerId !== null && this.targetWindow != null && (this.targetWindow.clearTimeout(this._iosTouchEndTimerId), this._iosTouchEndTimerId = null); }, n = () => { - this._iosTouching = !1, uu() && this.targetWindow != null && (this._iosJustTouchEnded = !0, this._iosTouchEndTimerId = this.targetWindow.setTimeout(() => { + this._iosTouching = !1, fu() && this.targetWindow != null && (this._iosJustTouchEnded = !0, this._iosTouchEndTimerId = this.targetWindow.setTimeout(() => { this._iosJustTouchEnded = !1, this._iosTouchEndTimerId = null, this._flushIosDeferredIfReady(); }, 150)); }; - e.addEventListener("touchstart", t, hu), e.addEventListener("touchend", n, hu), this.unsubs.push(() => { + e.addEventListener("touchstart", t, _u), e.addEventListener("touchend", n, _u), this.unsubs.push(() => { e.removeEventListener("touchstart", t), e.removeEventListener("touchend", n), this._iosTouchEndTimerId !== null && this.targetWindow != null && (this.targetWindow.clearTimeout(this._iosTouchEndTimerId), this._iosTouchEndTimerId = null); }); } @@ -6886,7 +6886,7 @@ var Su = class { let t = this.pendingScrollAnchor; if (this.pendingScrollAnchor = null, t && this.scrollElement && this.options.enabled) { let [e, n, r, i] = t; - e !== null && !r && (uu() && (this.isScrolling || this._iosTouching || this._iosJustTouchEnded) ? i !== 0 && (this._iosDeferredAdjustment += i) : this.scrollState?.behavior === "smooth" && !su(this.getScrollOffset() - i, this.scrollState.lastTargetOffset) || this._scrollToOffset(this.getScrollOffset(), { + e !== null && !r && (fu() && (this.isScrolling || this._iosTouching || this._iosJustTouchEnded) ? i !== 0 && (this._iosDeferredAdjustment += i) : this.scrollState?.behavior === "smooth" && !lu(this.getScrollOffset() - i, this.scrollState.lastTargetOffset) || this._scrollToOffset(this.getScrollOffset(), { adjustments: void 0, behavior: void 0 })), r && this.scrollToEnd({ behavior: r }); @@ -6915,7 +6915,7 @@ var Su = class { adjustments: this.scrollAdjustments += n, behavior: void 0 }); - }, this.rafId = null, this.getSize = () => this.options.enabled ? (this.scrollRect = this.scrollRect ?? this.options.initialRect, this.scrollRect[this.options.horizontal ? "width" : "height"]) : (this.scrollRect = null, 0), this.getScrollOffset = () => this.options.enabled ? (this.scrollOffset = this.scrollOffset ?? (typeof this.options.initialOffset == "function" ? this.options.initialOffset() : this.options.initialOffset), this.scrollOffset) : (this.scrollOffset = null, 0), this.getMeasurementOptions = au(() => [ + }, this.rafId = null, this.getSize = () => this.options.enabled ? (this.scrollRect = this.scrollRect ?? this.options.initialRect, this.scrollRect[this.options.horizontal ? "width" : "height"]) : (this.scrollRect = null, 0), this.getScrollOffset = () => this.options.enabled ? (this.scrollOffset = this.scrollOffset ?? (typeof this.options.initialOffset == "function" ? this.options.initialOffset() : this.options.initialOffset), this.scrollOffset) : (this.scrollOffset = null, 0), this.getMeasurementOptions = su(() => [ this.options.count, this.options.paddingStart, this.options.scrollMargin, @@ -6933,7 +6933,7 @@ var Su = class { lanes: a, laneAssignmentMode: o, gap: s - }), { key: !1 }), this.isIndexInRange = (e) => e >= 0 && e < this.options.count, this.getMeasurements = au(() => [this.getMeasurementOptions(), this.itemSizeCacheVersion], ({ count: e, paddingStart: t, scrollMargin: n, getItemKey: r, enabled: i, lanes: a, laneAssignmentMode: o, gap: s }, c) => { + }), { key: !1 }), this.isIndexInRange = (e) => e >= 0 && e < this.options.count, this.getMeasurements = su(() => [this.getMeasurementOptions(), this.itemSizeCacheVersion], ({ count: e, paddingStart: t, scrollMargin: n, getItemKey: r, enabled: i, lanes: a, laneAssignmentMode: o, gap: s }, c) => { let l = this.itemSizeCache; if (!i) return this.measurementsCache = [], this._singleLaneMeasurements = null, this.itemSizeCache.clear(), this.laneAssignments.clear(), []; if (this.laneAssignments.size > e) for (let t of this.laneAssignments.keys()) t >= e && this.laneAssignments.delete(t); @@ -6963,7 +6963,7 @@ var Su = class { flat: a, items: o }; - let d = iu(o, a); + let d = ou(o, a); return this.measurementsCache = d, d; } let d = this.measurementsCache.slice(0, u), f = Array(a).fill(void 0), p = new Float64Array(a), m = 0; @@ -6999,15 +6999,15 @@ var Su = class { }, { key: !1, debug: () => this.options.debug - }), this.calculateRange = au(() => [ + }), this.calculateRange = su(() => [ this.getMeasurements(), this.getSize(), this.getScrollOffset(), this.options.lanes - ], (e, t, n, r) => e.length === 0 || t === 0 ? (this.range = null, null) : (this.range = Tu(e, t, n, r, r === 1 && this._singleLaneMeasurements !== null ? this._singleLaneMeasurements.flat : null), this.range), { + ], (e, t, n, r) => e.length === 0 || t === 0 ? (this.range = null, null) : (this.range = Du(e, t, n, r, r === 1 && this._singleLaneMeasurements !== null ? this._singleLaneMeasurements.flat : null), this.range), { key: !1, debug: () => this.options.debug - }), this.getVirtualIndexes = au(() => { + }), this.getVirtualIndexes = su(() => { let e = null, t = null, n = this.calculateRange(); return n && (e = n.startIndex, t = n.endIndex), this.maybeNotify.updateDeps([ this.isScrolling, @@ -7073,7 +7073,7 @@ var Su = class { let f = !1; a ? f = this.applyScrollAdjustment(this.getTotalSize() - c) : d && (f = this.applyScrollAdjustment(s)), this.notify(f), this._retryClampedAdjustment(); } - }, this.getVirtualItems = au(() => [this.getVirtualIndexes(), this.getMeasurements()], (e, t) => { + }, this.getVirtualItems = su(() => [this.getVirtualIndexes(), this.getMeasurements()], (e, t) => { let n = []; for (let r = 0, i = e.length; r < i; r++) { let i = t[e[r]]; @@ -7087,7 +7087,7 @@ var Su = class { let t = this.getMeasurements(); if (t.length === 0) return; let n = this._singleLaneMeasurements?.flat, r = this.options.lanes === 1 && n != null; - return ou(t[Cu(0, t.length - 1, r ? (e) => n[e * 2] : (e) => ou(t[e]).start, e)]); + return cu(t[Tu(0, t.length - 1, r ? (e) => n[e * 2] : (e) => cu(t[e]).start, e)]); }, this.getMaxScrollOffset = () => { if (!this.scrollElement) return 0; if ("scrollHeight" in this.scrollElement) return this.options.horizontal ? this.scrollElement.scrollWidth - this.scrollElement.clientWidth : this.scrollElement.scrollHeight - this.scrollElement.clientHeight; @@ -7200,7 +7200,7 @@ var Su = class { } applyScrollAdjustment(e, t) { if (e === 0) return !1; - if (uu() && (this.isScrolling || this._iosTouching || this._iosJustTouchEnded)) return this._iosDeferredAdjustment += e, !1; + if (fu() && (this.isScrolling || this._iosTouching || this._iosJustTouchEnded)) return this._iosDeferredAdjustment += e, !1; { let n = this.getScrollOffset() + this.scrollAdjustments + e, r = this.scrollElement, i = r !== null && ("scrollHeight" in r || "document" in r) ? this.getMaxScrollOffset() : null; return this._clampedAdjustment = i !== null && n > i + .5 ? { @@ -7224,7 +7224,7 @@ var Su = class { return; } let e = this.scrollState.index == null ? void 0 : this.getOffsetForIndex(this.scrollState.index, this.scrollState.align), t = e ? e[0] : this.scrollState.lastTargetOffset, n = t !== this.scrollState.lastTargetOffset; - if (!n && su(t, this.getScrollOffset())) { + if (!n && lu(t, this.getScrollOffset())) { if (this.scrollState.stableFrames++, this.scrollState.stableFrames >= 1) { this.getScrollOffset() !== t && this._scrollToOffset(t, { adjustments: void 0, @@ -7241,7 +7241,7 @@ var Su = class { } this.scheduleScrollReconcile(); } -}, Cu = (e, t, n, r) => { +}, Tu = (e, t, n, r) => { for (; e <= t;) { let i = (e + t) / 2 | 0, a = n(i); if (a < r) e = i + 1; @@ -7250,7 +7250,7 @@ var Su = class { } return e > 0 ? e - 1 : 0; }; -function wu(e, t, n) { +function Eu(e, t, n) { let r = 0; for (; r <= t;) { let i = (r + t) / 2 | 0, a = e[i * 2]; @@ -7260,21 +7260,21 @@ function wu(e, t, n) { } return r > 0 ? r - 1 : 0; } -function Tu(e, t, n, r, i) { +function Du(e, t, n, r, i) { let a = e.length - 1; if (e.length <= r) return { startIndex: 0, endIndex: a }; if (r === 1 && i !== null) { - let e = wu(i, a, n), r = e, o = n + t; + let e = Eu(i, a, n), r = e, o = n + t; for (; r < a && i[r * 2] + i[r * 2 + 1] < o;) r++; return { startIndex: e, endIndex: r }; } - let o = Cu(0, a, (t) => e[t].start, n), s = o; + let o = Tu(0, a, (t) => e[t].start, n), s = o; if (r === 1) for (; s < a && e[s].end < n + t;) s++; else if (r > 1) { let i = Array(r).fill(0); @@ -7295,34 +7295,34 @@ function Tu(e, t, n, r, i) { }; } // node_modules/@tanstack/vue-virtual/dist/esm/index.js -function Eu(e) { - let t = new Su(Z(e)), n = gr(t), r = t._didMount(); - return or(() => Z(e).getScrollElement(), (e) => { +function Ou(e) { + let t = new wu(Z(e)), n = vr(t), r = t._didMount(); + return cr(() => Z(e).getScrollElement(), (e) => { e && t._willUpdate(); - }, { immediate: !0 }), or(() => Z(e), (e) => { + }, { immediate: !0 }), cr(() => Z(e), (e) => { t.setOptions({ ...e, onChange: (t, r) => { var i; - vr(n), (i = e.onChange) == null || i.call(e, t, r); + br(n), (i = e.onChange) == null || i.call(e, t, r); } - }), t._willUpdate(), vr(n); - }, { immediate: !0 }), Cr(r), n; + }), t._willUpdate(), br(n); + }, { immediate: !0 }), Tr(r), n; } -function Du(e) { - return Eu(K(() => ({ - observeElementRect: mu, - observeElementOffset: vu, - scrollToFn: bu, +function ku(e) { + return Ou(K(() => ({ + observeElementRect: gu, + observeElementOffset: bu, + scrollToFn: Su, ...Z(e) }))); } // ui/vue/grid/useGridVirtualRows.ts -function Ou(e, t = 0) { +function Au(e, t = 0) { let n = Number(Z(e)); return Number.isFinite(n) ? n : t; } -function ku(e = [], t = 1) { +function ju(e = [], t = 1) { let n = Array.isArray(e) ? e : [], r = Math.max(1, Number(t) || 1), i = []; for (let e = 0; e < n.length; e += r) i.push({ index: Math.floor(e / r), @@ -7330,22 +7330,22 @@ function ku(e = [], t = 1) { }); return i; } -function Au(e = [], t = 0, n = 1) { +function Mu(e = [], t = 0, n = 1) { let r = Array.isArray(e) ? e : [], i = Math.max(1, Number(n) || 1), a = Math.max(0, Number(t) || 0) * i; return r.slice(a, a + i); } -function ju({ scrollRef: e, items: t, rows: n, columnCount: r, estimateRowHeight: i, overscan: a = 8, enabled: o = !0, measure: s = yu } = {}) { +function Nu({ scrollRef: e, items: t, rows: n, columnCount: r, estimateRowHeight: i, overscan: a = 8, enabled: o = !0, measure: s = xu } = {}) { let c = K(() => { if (!Z(o)) return 0; let e = Z(n); if (Array.isArray(e)) return e.length; - let i = Z(t) || [], a = Math.max(1, Ou(r, 1)); + let i = Z(t) || [], a = Math.max(1, Au(r, 1)); return Math.ceil((Array.isArray(i) ? i.length : 0) / a); - }), l = Du(K(() => ({ + }), l = ku(K(() => ({ count: c.value, getScrollElement: () => Z(e) || null, - estimateSize: () => Math.max(1, Ou(i, 120)), - overscan: Math.max(0, Ou(a, 8)), + estimateSize: () => Math.max(1, Au(i, 120)), + overscan: Math.max(0, Au(a, 8)), measureElement: s }))); return { @@ -7365,27 +7365,27 @@ function ju({ scrollRef: e, items: t, rows: n, columnCount: r, estimateRowHeight groupKey: String(n?.groupKey || "") }; }); - let i = Z(t) || [], a = Math.max(1, Ou(r, 1)); + let i = Z(t) || [], a = Math.max(1, Au(r, 1)); return l.value.getVirtualItems().map((e) => ({ key: e.key, index: e.index, virtual: e, - items: Au(i, e.index, a), + items: Mu(i, e.index, a), kind: "assets", title: "", groupKey: "" })); }), totalSize: K(() => l.value.getTotalSize()), - getRowItems: (e) => Au(Z(t) || [], e, Ou(r, 1)) + getRowItems: (e) => Mu(Z(t) || [], e, Au(r, 1)) }; } // ui/vue/grid/useInfiniteTrigger.ts -function Mu(e, t = !0) { +function Pu(e, t = !0) { let n = Z(e); return n == null ? t : !!n; } -function Nu({ rootRef: e, enabled: t = !0, canLoad: n = !0, loadMore: r, rootMargin: i = "900px", threshold: a = .01 } = {}) { +function Fu({ rootRef: e, enabled: t = !0, canLoad: n = !0, loadMore: r, rootMargin: i = "900px", threshold: a = .01 } = {}) { let o = Q(null), s = null, c = !1; function l() { try { @@ -7396,7 +7396,7 @@ function Nu({ rootRef: e, enabled: t = !0, canLoad: n = !0, loadMore: r, rootMar s = null; } async function u() { - if (!c && Mu(t, !0) && Mu(n, !0) && typeof r == "function") { + if (!c && Pu(t, !0) && Pu(n, !0) && typeof r == "function") { c = !0; try { await r(); @@ -7416,7 +7416,7 @@ function Nu({ rootRef: e, enabled: t = !0, canLoad: n = !0, loadMore: r, rootMar threshold: a }), s.observe(t)); } - return ur() && (kr(d), dr(l), or(() => [Z(e), o.value], () => d(), { flush: "post" })), { + return fr() && (jr(d), pr(l), cr(() => [Z(e), o.value], () => d(), { flush: "post" })), { sentinelRef: o, connect: d, disconnect: l, @@ -7424,18 +7424,18 @@ function Nu({ rootRef: e, enabled: t = !0, canLoad: n = !0, loadMore: r, rootMar }; } // ui/vue/grid/useGridDisplayAssets.ts -function Pu(e) { +function Iu(e) { let t = At(e?.filename); return t ? `${String(e?.source || e?.type || "").trim().toLowerCase()}|${String(e?.root_id || e?.custom_root_id || "").trim().toLowerCase()}|${String(e?.subfolder || "").trim().toLowerCase()}|${t}` : ""; } -function Fu(e) { +function Lu(e) { return !!e; } -function Iu(e) { +function Ru(e) { let t = Array.isArray(e) ? e : [], n = /* @__PURE__ */ new Map(), r = []; for (let e of t) { if (!e) continue; - let t = Pu(e); + let t = Iu(e); if (!t) { e._mjrNameCollision = !1, delete e._mjrNameCollisionCount, delete e._mjrNameCollisionPaths, e._mjrDupStack = !1, e._mjrDupMembers = null, e._mjrDupCount = 0, r.push(e); continue; @@ -7453,7 +7453,7 @@ function Iu(e) { return r; } // ui/vue/components/grid/VirtualAssetGridHost.vue?vue&type=script&setup=true&lang.ts -var Lu = { +var zu = { key: 0, class: "mjr-grid-loading-overlay", style: { @@ -7468,19 +7468,19 @@ var Lu = { background: "rgba(20,22,28,0.55)", "backdrop-filter": "blur(2px)" } -}, Ru = { style: { width: "100%" } }, zu = { style: { +}, Bu = { style: { width: "100%" } }, Vu = { style: { "margin-top": "10px", "font-size": "12px", opacity: "0.68", "text-align": "center" -} }, Bu = ["data-index"], Vu = [ +} }, Hu = ["data-index"], Uu = [ "aria-expanded", "title", "onClick" -], Hu = { +], Wu = { class: "mjr-grid-group-separator-chevron", "aria-hidden": "true" -}, Uu = { class: "mjr-grid-group-separator-title" }, Wu = [ +}, Gu = { class: "mjr-grid-group-separator-title" }, Ku = [ "data-mjr-asset-id", "data-mjr-filename-key", "data-mjr-ext", @@ -7496,21 +7496,21 @@ var Lu = { "onMousedown", "onClick", "onDblclick" -], Gu = { +], qu = { key: 3, style: { display: "flex", "flex-direction": "column", width: "100%" } -}, Ku = [ +}, Ju = [ "aria-expanded", "title", "onClick" -], qu = { +], Yu = { class: "mjr-grid-group-separator-chevron", "aria-hidden": "true" -}, Ju = { class: "mjr-grid-group-separator-title" }, Yu = [ +}, Xu = { class: "mjr-grid-group-separator-title" }, Zu = [ "data-mjr-asset-id", "data-mjr-filename-key", "data-mjr-ext", @@ -7526,7 +7526,7 @@ var Lu = { "onMousedown", "onClick", "onDblclick" -], Xu = 501, Zu = /* @__PURE__ */ lr({ +], Qu = 501, $u = /* @__PURE__ */ dr({ __name: "VirtualAssetGridHost", props: { scrollElement: { default: null }, @@ -7556,10 +7556,10 @@ var Lu = { Q(!0); let s = Q(0), c = Q(0), l = /* @__PURE__ */ new WeakMap(), u = 0, d = 0, f = 0, p = 0, m = 0, h = /* @__PURE__ */ new Map(), g = null, _ = null; function v() { - return g ||= import("./chunks/viewerOpenRequest-CCFPrnGk.js").then((e) => e.n), g; + return g ||= import("./chunks/viewerOpenRequest-Crw9UWH5.js").then((e) => e.n), g; } function b() { - return _ ||= import("./chunks/floatingViewerManager-DKOeP6-T.js").then((e) => e.n), _; + return _ ||= import("./chunks/floatingViewerManager-Gv7MTmpu.js").then((e) => e.n), _; } function x(e) { return (Array.isArray(e) ? e : []).slice().sort((e, t) => { @@ -7567,7 +7567,7 @@ var Lu = { return (Number(t?.mtime || t?.created_at || 0) || 0) - n; }); } - ir("mjrStackService", { + or("mjrStackService", { openStackGroup: async (e) => { let t = i.value; if (!t || !e) return; @@ -7578,7 +7578,7 @@ var Lu = { let a = t._mjrStackMembersCache.get(r); if (!Array.isArray(a)) { let e = h.get(r); - e || (e = re(Je(n, { limit: Xu }), { timeoutMs: 3e4 }).finally(() => { + e || (e = re(nt(n, { limit: Qu }), { timeoutMs: 3e4 }).finally(() => { h.delete(r); }), h.set(r, e)); let i = await e; @@ -7611,13 +7611,13 @@ var Lu = { })); } }); - let { state: S, selectedIdSet: C, setLoadingMessage: w, clearLoadingMessage: T, setStatusMessage: E, clearStatusMessage: D, resetAssets: O, setSelection: k, reconcileSelection: A, getSelectedAssets: j, getActiveAsset: M } = fc(); + let { state: S, selectedIdSet: C, setLoadingMessage: w, clearLoadingMessage: T, setStatusMessage: E, clearStatusMessage: D, resetAssets: O, setSelection: k, reconcileSelection: A, getSelectedAssets: j, getActiveAsset: M } = mc(); function N(e) { return e ? typeof e == "object" && "value" in e ? e.value || null : e : null; } let P = K(() => N(r.scrollElement)); function ee() { - return Il(i.value); + return Rl(i.value); } function te(e, { align: t = "auto" } = {}) { let n = String(e || "").trim(); @@ -7627,7 +7627,7 @@ var Lu = { if (r.virtualize) { let e = Math.floor(i / Math.max(1, ze.value)); try { - Xe.value.scrollToIndex(e, { align: t }); + Ye.value.scrollToIndex(e, { align: t }); } catch (e) { console.debug?.(e); } @@ -7642,9 +7642,9 @@ var Lu = { } } function F() { - return gc(i.value, P.value); + return vc(i.value, P.value); } - let I = nu({ + let I = iu({ gridContainerRef: i, state: S, setLoadingMessage: w, @@ -7658,7 +7658,7 @@ var Lu = { readRenderedCards: ee, scrollToAssetId: te, canLoadMore: F - }), { sentinelRef: ne } = Nu({ + }), { sentinelRef: ne } = Fu({ rootRef: P, enabled: !0, canLoad: K(() => !S.loading && !S.done && F()), @@ -7751,7 +7751,7 @@ var Lu = { let e = i.value; if (!e) return; let t = new Set((Array.isArray(S.selectedIds) ? S.selectedIds : []).map((e) => String(e || "").trim()).filter(Boolean)); - Zn(e, t, S.activeId || ""); + $n(e, t, S.activeId || ""); try { t.size ? e.dataset.mjrSelectedAssetId = String(S.activeId || Array.from(t)[0] || "") : delete e.dataset.mjrSelectedAssetId; } catch (e) { @@ -7781,7 +7781,7 @@ var Lu = { } } ve._lastSelectionKey = ""; - let ye = K(() => Iu(S.assets)), be = K(() => (Array.isArray(ye.value) ? ye.value : []).filter((e) => Fu(e))), xe = Q(/* @__PURE__ */ new Set()), Se = Q(""), Ce = K(() => { + let ye = K(() => Ru(S.assets)), be = K(() => (Array.isArray(ye.value) ? ye.value : []).filter((e) => Lu(e))), xe = Q(/* @__PURE__ */ new Set()), Se = Q(""), Ce = K(() => { s.value; let e = ue(B.WORKFLOW_GRID_GROUP_BY); return e === "none" || Se.value !== "workflow" ? "none" : e; @@ -7791,7 +7791,7 @@ var Lu = { let t = Ce.value; return t === "none" ? [] : me(e, ze.value, t); }); - or(() => `${Ce.value}::${we.value.map((e) => `${e.kind}:${e.groupKey}`).join("|")}`, () => { + cr(() => `${Ce.value}::${we.value.map((e) => `${e.kind}:${e.groupKey}`).join("|")}`, () => { if (Ce.value === "none") { xe.value = /* @__PURE__ */ new Set(); return; @@ -7822,7 +7822,7 @@ var Lu = { let ke = K(() => { let e = Array.isArray(be.value) ? be.value : []; if (!e.length) return []; - if (Ce.value === "none") return ku(e, ze.value); + if (Ce.value === "none") return ju(e, ze.value); let t = Array.isArray(we.value) ? we.value : [], n = []; for (let e of t) e?.kind === "header" ? n.push(e) : Te(String(e?.groupKey || "")) || n.push(e); return n; @@ -7874,7 +7874,7 @@ var Lu = { let t = e?.detail || {}, n = String(t.assetId ?? t.id ?? "").trim(); n && (Array.isArray(be.value) ? be.value : []).some((e) => String(e?.id || "") === n) && (k([n], n), _e(), ve(), te(n, { align: "center" }), setTimeout(() => Pe(n), 0)); } - function Ie(e) { + function Le(e) { if (!e) return; e._mjrSelectionManagedByVue = !0; try { @@ -7887,9 +7887,9 @@ var Lu = { } catch (e) { console.debug?.(e); } - fi(e, { applySettingsClasses: r.applyDefaultSettingsClasses }); + mi(e, { applySettingsClasses: r.applyDefaultSettingsClasses }); try { - pt = $o(e); + pt = ts(e); } catch (e) { console.debug?.(e), pt = null; } @@ -7904,7 +7904,7 @@ var Lu = { e._mjrRemoveAssets = t, e._mjrGetRenderedCards = () => ee(), e._mjrScrollToAssetId = (e, t = {}) => { te(e, t); }, e._mjrHasAssetId = (e) => (Array.isArray(S.assets) ? S.assets : []).some((t) => String(t?.id || "") === String(e || "")), e._mjrGetGridState = () => S, e._mjrGetSelectedAssets = () => j(), e._mjrGetActiveAsset = () => M(), e._mjrOnKeyboardAssetChanged = (e) => je(e), e._mjrOpenKeyboardDetails = () => Me(); - let n = () => (r.applyDefaultSettingsClasses && (di(e), s.value += 1), I.refreshGrid()), i = () => { + let n = () => (r.applyDefaultSettingsClasses && (pi(e), s.value += 1), I.refreshGrid()), i = () => { I.prepareGridForScopeSwitch(), I.dispose(), S.cardElements.clear(), e._mjrGridApi = null; }; e._mjrGridApi = { @@ -7925,11 +7925,11 @@ var Lu = { getDebugSnapshot: () => I.getDebugSnapshot() }, e._mjrLoadAssets = (...e) => I.loadAssets(...e), e._mjrLoadAssetsFromList = (...e) => I.loadAssetsFromList(...e), e._mjrPrepareForScopeSwitch = () => I.prepareGridForScopeSwitch(), e._mjrRefreshGrid = n, e._mjrCaptureAnchor = () => I.captureAnchor(), e._mjrRestoreAnchor = (e) => I.restoreAnchor(e), e._mjrHydrateFromSnapshot = (...e) => I.hydrateFromSnapshot(...e), e._mjrUpsertAsset = (e) => I.upsertAsset(e), e._mjrUpsertAssetNow = (e) => I.upsertAssetNow(e), e._mjrGetCanonicalState = () => I.getCanonicalState(), e._mjrGetDebugSnapshot = () => I.getDebugSnapshot(), e._mjrDispose = i; } - or(i, (e) => { - e && (Ie(e), _e(), Ae()); - }, { immediate: !0 }), or(() => `${(S.selectedIds || []).join("|")}::${String(S.activeId || "")}`, () => { + cr(i, (e) => { + e && (Le(e), _e(), Ae()); + }, { immediate: !0 }), cr(() => `${(S.selectedIds || []).join("|")}::${String(S.activeId || "")}`, () => { i.value && (_e(), ve()); - }, { flush: "post" }), or(() => `${Array.isArray(be.value) ? be.value.length : 0}::${Number(S.total || 0)}::${Number(S.hiddenPngSiblings || 0)}`, () => { + }, { flush: "post" }), cr(() => `${Array.isArray(be.value) ? be.value.length : 0}::${Number(S.total || 0)}::${Number(S.hiddenPngSiblings || 0)}`, () => { i.value && Ae(); }, { flush: "post", @@ -7987,7 +7987,7 @@ var Lu = { } c.value = 0; } - let qe = ju({ + let qe = Nu({ scrollRef: P, items: be, rows: ke, @@ -8000,14 +8000,14 @@ var Lu = { return Math.max(3, Math.min(30, n + r)); }), enabled: K(() => r.virtualize) - }), Ye = qe.rowCount, Xe = qe.virtualizer, Ze = qe.virtualRows, Qe = qe.totalSize, et = K(() => { + }), Je = qe.rowCount, Ye = qe.virtualizer, Xe = qe.virtualRows, Qe = qe.totalSize, $e = K(() => { let e = /* @__PURE__ */ new Map(); - for (let t of Ze.value) e.set(t.index, t.virtual || t); + for (let t of Xe.value) e.set(t.index, t.virtual || t); return e; - }), z = K(() => (s.value, !!B.GRID_SHOW_DETAILS)), tt = K(() => { + }), et = K(() => (s.value, !!B.GRID_SHOW_DETAILS)), z = K(() => { let e = Math.max(1, Number(ze.value || 1)); return Math.max(12, Math.min(36, e * 4)); - }), nt = K(() => Array.from({ length: Number(tt.value || 12) }, (e, t) => t)), rt = K(() => { + }), tt = K(() => Array.from({ length: Number(z.value || 12) }, (e, t) => t)), rt = K(() => { let e = Math.max(80, Number(Ue.value || 0) - Number(Ve.value || 0)), t = Math.max(80, Number(He.value || 0)); return Math.max(0, e - t); }), it = K(() => ({ @@ -8049,7 +8049,7 @@ var Lu = { backgroundSize: "220% 100%", animation: "mjr-skeleton-shimmer 2.2s ease-in-out infinite" })), lt = K(() => ({ - display: z.value ? "block" : "none", + display: et.value ? "block" : "none", minHeight: `${Math.max(0, Number(rt.value || 0))}px` })); function ut() { @@ -8079,9 +8079,9 @@ var Lu = { 400 ]) setTimeout(e, t); } - kr(() => { + jr(() => { gt(), window.addEventListener(V.VIEWER_ACTIVE_ASSET_CHANGED, Fe); - }), or(i, (e) => { + }), cr(i, (e) => { try { ft?.disconnect?.(); } catch (e) { @@ -8100,7 +8100,7 @@ var Lu = { console.debug?.(e), ft = null; } } - }, { immediate: !0 }), or(P, (e, t) => { + }, { immediate: !0 }), cr(P, (e, t) => { try { dt?.disconnect?.(); } catch (e) { @@ -8116,14 +8116,14 @@ var Lu = { console.debug?.(e), dt = null; } } - }, { immediate: !0 }), or(() => Ye.value, async () => { - Be.value && (await sr(), bt(), Bt()); - }), or(() => S.assets, async (e) => { + }, { immediate: !0 }), cr(() => Je.value, async () => { + Be.value && (await lr(), bt(), Bt()); + }), cr(() => S.assets, async (e) => { if (!Array.isArray(e) || e.length === 0) { let e = i.value; e?._mjrStackMembersCache && e._mjrStackMembersCache.clear(); } - await sr(), bt(); + await lr(), bt(); }); function _t(e, t) { let n = String(t?.filename || "").trim().toLowerCase(), r = l.get(e); @@ -8327,8 +8327,8 @@ var Lu = { e(R("toast.workflowMissingPath", "Workflow file path is missing."), "error"); return; } - let r = $e(); - if (Le(r) === !0 && !await Ut(R("dialog.workflowLoadReplaceDirty", "Current canvas has unsaved changes. Replace it with this workflow?"), R("tab.workflow", "Workflow"))) return; + let r = Ze(); + if (Ie(r) === !0 && !await Ut(R("dialog.workflowLoadReplaceDirty", "Current canvas has unsaved changes. Replace it with this workflow?"), R("tab.workflow", "Workflow"))) return; let i = await y(n, { timeoutMs: 3e4 }), o = i?.data?.workflow || i?.workflow || null; if (!i?.ok || !o || typeof o != "object") e(i?.error || R("toast.workflowLoadFailed", "Failed to load workflow."), "error"); else if (!Ne(o, r).ok) e(R("toast.workflowImportUnavailable", "ComfyUI workflow import is unavailable in this frontend."), "error"); @@ -8381,7 +8381,7 @@ var Lu = { function zt() { ut(); try { - Xe.value?.measure?.(); + Ye.value?.measure?.(); } catch (e) { console.debug?.(e); } @@ -8391,7 +8391,7 @@ var Lu = { u = requestAnimationFrame(() => { u = 0; try { - Xe.value?.measure?.(); + Ye.value?.measure?.(); } catch (e) { console.debug?.(e); } @@ -8399,7 +8399,7 @@ var Lu = { } catch (e) { console.debug?.(e), u = 0; try { - Xe.value?.measure?.(); + Ye.value?.measure?.(); } catch (e) { console.debug?.(e); } @@ -8438,7 +8438,7 @@ var Lu = { Ke(); }; } - or(P, (e) => { + cr(P, (e) => { try { Ft?.(); } catch (e) { @@ -8462,7 +8462,7 @@ var Lu = { let e = P.value; if (!e) return; let t = Array.isArray(S.assets) ? S.assets.length : 0, n = `${t}::${ze.value}`; - if (!It && !(n === Rt && Date.now() - Lt < 500) && (await sr(), (Number(e.scrollHeight || 0) || 0) <= Wt(e) + 40)) { + if (!It && !(n === Rt && Date.now() - Lt < 500) && (await lr(), (Number(e.scrollHeight || 0) || 0) <= Wt(e) + 40)) { let e = t; It = Promise.resolve(I.loadNextPage()).catch((e) => console.debug?.(e)).finally(() => { let t = Array.isArray(S.assets) ? S.assets.length : 0; @@ -8472,12 +8472,12 @@ var Lu = { }); } } - or(() => `${Array.isArray(S.assets) ? S.assets.length : 0}::${ze.value}::${S.loading}::${S.done}`, () => { + cr(() => `${Array.isArray(S.assets) ? S.assets.length : 0}::${ze.value}::${S.loading}::${S.done}`, () => { Gt(); }, { flush: "post" }); function Kt(e) { if (e && r.virtualize) try { - Xe.value.measureElement(e); + Ye.value.measureElement(e); } catch (e) { console.debug?.(e); } @@ -8490,7 +8490,7 @@ var Lu = { }; } function Yt(e) { - return et.value.get(e) || null; + return $e.value.get(e) || null; } function Xt(e) { let t = Yt(e); @@ -8515,11 +8515,11 @@ var Lu = { }; } function Qt() { - s.value += 1, r.applyDefaultSettingsClasses && i.value && di(i.value); + s.value += 1, r.applyDefaultSettingsClasses && i.value && pi(i.value); } - return or(() => r.applyDefaultSettingsClasses, () => { - i.value && r.applyDefaultSettingsClasses && di(i.value); - }, { immediate: !0 }), dr(() => { + return cr(() => r.applyDefaultSettingsClasses, () => { + i.value && r.applyDefaultSettingsClasses && pi(i.value); + }, { immediate: !0 }), pr(() => { try { window.removeEventListener(V.VIEWER_ACTIVE_ASSET_CHANGED, Fe); } catch (e) { @@ -8577,7 +8577,7 @@ var Lu = { } catch (e) { console.debug?.(e); } - }), or(i, (e) => { + }), cr(i, (e) => { e && (mt ||= (window.addEventListener("mjr-settings-changed", Qt), window.addEventListener("mjr:keepalive-attached", Vt), !0)); }, { immediate: !0 }), n({ get gridContainer() { @@ -8645,27 +8645,27 @@ var Lu = { "min-height": "100%" } }, [ - Z(S).loading && !Z(S).assets.length ? (q(), X("div", Lu, [U("div", Ru, [U("div", { + Z(S).loading && !Z(S).assets.length ? (q(), X("div", zu, [U("div", Bu, [U("div", { class: "mjr-grid-skeleton-layout", - style: yr(it.value) - }, [(q(!0), X(H, null, pr(nt.value, (e) => (q(), X("div", { + style: xr(it.value) + }, [(q(!0), X(H, null, hr(tt.value, (e) => (q(), X("div", { key: `sk-${e}`, class: "mjr-grid-skeleton-card", - style: yr(at.value) + style: xr(at.value) }, [U("div", { class: "mjr-grid-skeleton-thumb mjr-grid-skeleton-shimmer", - style: yr(ot.value) - }, null, 4), U("div", { style: yr(lt.value) }, [U("div", { + style: xr(ot.value) + }, null, 4), U("div", { style: xr(lt.value) }, [U("div", { class: "mjr-grid-skeleton-line mjr-grid-skeleton-line--title mjr-grid-skeleton-shimmer", - style: yr(st.value) + style: xr(st.value) }, null, 4), U("div", { class: "mjr-grid-skeleton-line mjr-grid-skeleton-line--meta mjr-grid-skeleton-shimmer", - style: yr(ct.value) - }, null, 4)], 4)], 4))), 128))], 4), U("div", zu, J(Z(S).loadingMessage || "Loading assets..."), 1)])])) : G("", !0), + style: xr(ct.value) + }, null, 4)], 4)], 4))), 128))], 4), U("div", Vu, J(Z(S).loadingMessage || "Loading assets..."), 1)])])) : G("", !0), Z(S).statusMessage && !Z(S).assets.length && !Z(S).loading ? (q(), X("div", { key: 1, class: "mjr-grid-message", - style: yr({ + style: xr({ position: "absolute", inset: "0", zIndex: 3, @@ -8683,35 +8683,35 @@ var Lu = { }, J(Z(S).statusMessage), 5)) : G("", !0), t.virtualize ? (q(), X("div", { key: 2, - style: yr({ + style: xr({ height: `${Z(Qe)}px`, position: "relative", width: "100%", gridColumn: "1 / -1" }) - }, [(q(!0), X(H, null, pr(Z(Ze), (e) => (q(), X("div", { + }, [(q(!0), X(H, null, hr(Z(Xe), (e) => (q(), X("div", { key: e.key, ref_for: !0, ref: Kt, "data-index": e.index, - style: yr(Xt(e.index)) + style: xr(Xt(e.index)) }, [e.kind === "header" ? (q(), X("button", { key: 0, type: "button", - class: wr(["mjr-grid-group-separator", De(e)]), + class: Er(["mjr-grid-group-separator", De(e)]), "aria-expanded": Te(e.groupKey) ? "false" : "true", title: `${Te(e.groupKey) ? "Open" : "Close"} group`, onClick: (t) => Ee(e.groupKey) - }, [U("span", Hu, [U("i", { class: wr(["pi", Te(e.groupKey) ? "pi-chevron-down" : "pi-chevron-up"]) }, null, 2)]), U("span", Uu, J(e.title), 1)], 10, Vu)) : e.items.length ? (q(!0), X(H, { key: 1 }, pr(e.items, (e) => (q(), X(H, { key: String(e.id) }, [L(e) ? (q(), nr(uc, { + }, [U("span", Wu, [U("i", { class: Er(["pi", Te(e.groupKey) ? "pi-chevron-down" : "pi-chevron-up"]) }, null, 2)]), U("span", Gu, J(e.title), 1)], 10, Uu)) : e.items.length ? (q(!0), X(H, { key: 1 }, hr(e.items, (e) => (q(), X(H, { key: String(e.id) }, [L(e) ? (q(), ir(fc, { key: 0, ref_for: !0, ref: St(e), asset: e, selected: se(e), - style: yr(Jt()), - onMousedown: fr((t) => Et(t, e), ["left"]), + style: xr(Jt()), + onMousedown: mr((t) => Et(t, e), ["left"]), onClick: (t) => Tt(t, e), - onDblclick: fr((t) => Mt(e), ["stop"]), + onDblclick: mr((t) => Mt(e), ["stop"]), onDropAsset: Nt }, null, 8, [ "asset", @@ -8724,14 +8724,14 @@ var Lu = { key: 1, ref_for: !0, ref: St(e), - class: wr(["mjr-asset-card mjr-card", { + class: Er(["mjr-asset-card mjr-card", { "is-selected": se(e), "mjr-live-placeholder": ge(e) }]), role: "button", tabindex: "0", draggable: "true", - style: yr(Jt()), + style: xr(Jt()), "data-mjr-asset-id": String(e.id ?? ""), "data-mjr-filename-key": String(e.filename || "").toLowerCase(), "data-mjr-ext": ie(e), @@ -8744,32 +8744,32 @@ var Lu = { "data-mjr-dup-count": e._mjrDupStack ? String(e._mjrDupCount || 0) : void 0, "aria-label": `Asset ${e.filename || ""}`, "aria-selected": se(e) ? "true" : "false", - onMousedown: fr((t) => Et(t, e), ["left"]), + onMousedown: mr((t) => Et(t, e), ["left"]), onClick: (t) => Tt(t, e), - onDblclick: fr((t) => Mt(e), ["stop"]) - }, [Y(oc, { + onDblclick: mr((t) => Mt(e), ["stop"]) + }, [Y(cc, { asset: e, onWorkflowAction: (t) => At(t, e) - }, null, 8, ["asset", "onWorkflowAction"])], 46, Wu))], 64))), 128)) : G("", !0)], 12, Bu))), 128))], 4)) : (q(), X("div", Gu, [(q(!0), X(H, null, pr(We.value, (e) => (q(), X("div", { + }, null, 8, ["asset", "onWorkflowAction"])], 46, Ku))], 64))), 128)) : G("", !0)], 12, Hu))), 128))], 4)) : (q(), X("div", qu, [(q(!0), X(H, null, hr(We.value, (e) => (q(), X("div", { key: `${e.kind || "assets"}-${e.groupKey || ""}-${e.index ?? ""}`, - style: yr(Zt()) + style: xr(Zt()) }, [e.kind === "header" ? (q(), X("button", { key: 0, type: "button", - class: wr(["mjr-grid-group-separator", De(e)]), + class: Er(["mjr-grid-group-separator", De(e)]), "aria-expanded": Te(e.groupKey) ? "false" : "true", title: `${Te(e.groupKey) ? "Open" : "Close"} group`, onClick: (t) => Ee(e.groupKey) - }, [U("span", qu, [U("i", { class: wr(["pi", Te(e.groupKey) ? "pi-chevron-down" : "pi-chevron-up"]) }, null, 2)]), U("span", Ju, J(e.title), 1)], 10, Ku)) : (q(!0), X(H, { key: 1 }, pr(e.items, (e) => (q(), X(H, { key: String(e.id) }, [L(e) ? (q(), nr(uc, { + }, [U("span", Yu, [U("i", { class: Er(["pi", Te(e.groupKey) ? "pi-chevron-down" : "pi-chevron-up"]) }, null, 2)]), U("span", Xu, J(e.title), 1)], 10, Ju)) : (q(!0), X(H, { key: 1 }, hr(e.items, (e) => (q(), X(H, { key: String(e.id) }, [L(e) ? (q(), ir(fc, { key: 0, ref_for: !0, ref: St(e), asset: e, selected: se(e), - style: yr(Jt()), - onMousedown: fr((t) => Et(t, e), ["left"]), + style: xr(Jt()), + onMousedown: mr((t) => Et(t, e), ["left"]), onClick: (t) => Tt(t, e), - onDblclick: fr((t) => Mt(e), ["stop"]), + onDblclick: mr((t) => Mt(e), ["stop"]), onDropAsset: Nt }, null, 8, [ "asset", @@ -8782,14 +8782,14 @@ var Lu = { key: 1, ref_for: !0, ref: St(e), - class: wr(["mjr-asset-card mjr-card", { + class: Er(["mjr-asset-card mjr-card", { "is-selected": se(e), "mjr-live-placeholder": ge(e) }]), role: "button", tabindex: "0", draggable: "true", - style: yr(Jt()), + style: xr(Jt()), "data-mjr-asset-id": String(e.id ?? ""), "data-mjr-filename-key": String(e.filename || "").toLowerCase(), "data-mjr-ext": ie(e), @@ -8802,13 +8802,13 @@ var Lu = { "data-mjr-dup-count": e._mjrDupStack ? String(e._mjrDupCount || 0) : void 0, "aria-label": `Asset ${e.filename || ""}`, "aria-selected": se(e) ? "true" : "false", - onMousedown: fr((t) => Et(t, e), ["left"]), + onMousedown: mr((t) => Et(t, e), ["left"]), onClick: (t) => Tt(t, e), - onDblclick: fr((t) => Mt(e), ["stop"]) - }, [Y(oc, { + onDblclick: mr((t) => Mt(e), ["stop"]) + }, [Y(cc, { asset: e, onWorkflowAction: (t) => At(t, e) - }, null, 8, ["asset", "onWorkflowAction"])], 46, Yu))], 64))), 128))], 4))), 128))])), + }, null, 8, ["asset", "onWorkflowAction"])], 46, Zu))], 64))), 128))], 4))), 128))])), U("div", { ref_key: "infiniteSentinelRef", ref: ne, @@ -8822,14 +8822,14 @@ var Lu = { }, null, 512) ], 512)); } -}), Qu = 240, $u = 120, ed = 80, td = null, nd = null; -function rd() { - return td ||= import("./chunks/viewerOpenRequest-CCFPrnGk.js").then((e) => e.n), td; +}), ed = 240, td = 120, nd = 80, rd = null, id = null; +function ad() { + return rd ||= import("./chunks/viewerOpenRequest-Crw9UWH5.js").then((e) => e.n), rd; } -function id() { - return nd ||= import("./chunks/floatingViewerManager-DKOeP6-T.js").then((e) => e.n), nd; +function od() { + return id ||= import("./chunks/floatingViewerManager-Gv7MTmpu.js").then((e) => e.n), id; } -function ad(e) { +function sd(e) { let t = document.createElement("button"); t.type = "button", t.className = "mjr-asset-card mjr-card mjr-feed-group-member-card", t.style.cssText = "display:flex;flex-direction:column;align-items:flex-start;justify-content:flex-end;min-height:110px;padding:8px;border:1px solid var(--mjr-border,#444);border-radius:8px;background:var(--mjr-surface,#202020);color:inherit;text-align:left;overflow:hidden;"; try { @@ -8840,7 +8840,7 @@ function ad(e) { let n = document.createElement("div"); return n.className = "mjr-feed-group-member-name", n.style.cssText = "font-size:11px;font-weight:600;line-height:1.3;word-break:break-word;", n.textContent = String(e?.filename || "Asset"), t.appendChild(n), t; } -function od(e) { +function cd(e) { try { if (typeof e?._mjrGetRenderedCards == "function") { let t = e._mjrGetRenderedCards(); @@ -8855,11 +8855,11 @@ function od(e) { return console.debug?.(e), []; } } -function sd(e, t, n = "") { +function ld(e, t, n = "") { let r = Array.isArray(t) ? t.map(String).filter(Boolean) : []; - return Qn(e, r, { activeId: n || r[0] || "" }, od); + return er(e, r, { activeId: n || r[0] || "" }, cd); } -function cd(e) { +function ud(e) { let t = e?.grid; if (!t) return; let n = (e) => { @@ -8875,16 +8875,16 @@ function cd(e) { } catch (e) { console.debug?.(e); } - let a = od(t), o = a.indexOf(n), s = Jn(t); + let a = cd(t), o = a.indexOf(n), s = Xn(t); if (e.shiftKey && o >= 0) { let n = Number.isFinite(Number(t._mjrLastSelectedIndex)) ? Number(t._mjrLastSelectedIndex) : o, r = Math.min(n, o), s = Math.max(n, o), c = a.slice(r, s + 1).map((e) => String(e?.dataset?.mjrAssetId || "").trim()).filter(Boolean); - sd(t, c, i), t._mjrLastSelectedIndex = o, e.preventDefault(), e.stopPropagation(); + ld(t, c, i), t._mjrLastSelectedIndex = o, e.preventDefault(), e.stopPropagation(); } else if (e.ctrlKey || e.metaKey) { s.has(i) ? s.delete(i) : s.add(i); let n = Array.from(s); - sd(t, n, s.has(i) ? i : n[0] || ""), o >= 0 && (t._mjrLastSelectedIndex = o), e.preventDefault(), e.stopPropagation(); + ld(t, n, s.has(i) ? i : n[0] || ""), o >= 0 && (t._mjrLastSelectedIndex = o), e.preventDefault(), e.stopPropagation(); } else { - sd(t, [i], i), o >= 0 && (t._mjrLastSelectedIndex = o); + ld(t, [i], i), o >= 0 && (t._mjrLastSelectedIndex = o); try { n.focus?.({ preventScroll: !0 }); } catch (e) { @@ -8901,23 +8901,23 @@ function cd(e) { } }; } -var ld = { +var dd = { hosts: /* @__PURE__ */ new Set(), pendingAssets: /* @__PURE__ */ new Map() }; -function ud(e) { - if (!B.EXECUTION_GROUPING_ENABLED) return Td(e); +function fd(e) { + if (!B.EXECUTION_GROUPING_ENABLED) return Dd(e); let t = String(e?.stack_id || "").trim(); if (t) return `stack:${t}`; let n = String(e?.job_id || "").trim(); - return n ? `job:${n}` : Td(e); + return n ? `job:${n}` : Dd(e); } -function dd(e) { +function pd(e) { let t = /* @__PURE__ */ new Map(); for (let n of Array.isArray(e) ? e : []) { - let e = Dd(n); + let e = kd(n); if (!e) continue; - let r = ud(e), i = t.get(r); + let r = fd(e), i = t.get(r); i || (i = { key: r, members: [] @@ -8942,16 +8942,16 @@ function dd(e) { return (Number(t?.mtime || t?.created_at || 0) || 0) - n; }), n; } -function fd(e) { +function md(e) { return Array.from(e?.assetsByKey?.values?.() || []); } -function pd(e) { +function hd(e) { return String(e ?? "").trim().toLowerCase(); } -function md(e) { +function gd(e) { return e?._mjrLivePlaceholder === !0 || e?.is_live_placeholder === !0 || String(e?.id || "").trim().toLowerCase().startsWith("live:"); } -function hd(e) { +function _d(e) { if (!e || typeof e != "object") return e; try { delete e._mjrLivePlaceholder, delete e._mjrLiveStatus, delete e._mjrLiveLabel, delete e.is_live_placeholder; @@ -8960,19 +8960,19 @@ function hd(e) { } return e; } -function gd(e) { +function vd(e) { if (!e || typeof e != "object") return ""; - let t = pd(e?.type || e?.source || "output"), n = pd(e?.root_id || e?.custom_root_id || ""), r = pd(e?.subfolder || ""), i = pd(e?.filename || ""); + let t = hd(e?.type || e?.source || "output"), n = hd(e?.root_id || e?.custom_root_id || ""), r = hd(e?.subfolder || ""), i = hd(e?.filename || ""); if (i) return `${t}|${n}|${r}|${i}`; - let a = pd(e?.filepath || e?.path || e?.fullpath || e?.full_path || ""); + let a = hd(e?.filepath || e?.path || e?.fullpath || e?.full_path || ""); return a ? `${t}|${n}|path|${a}` : ""; } -function _d(e, t) { - let n = Dd(t); +function yd(e, t) { + let n = kd(t); if (!e || typeof e.set != "function" || !n) return null; - let r = Td(n), i = gd(n), a = ""; + let r = Dd(n), i = vd(n), a = ""; if (i) { - for (let [t, n] of e.entries()) if (gd(n) === i) { + for (let [t, n] of e.entries()) if (vd(n) === i) { a = t; break; } @@ -8981,17 +8981,17 @@ function _d(e, t) { ...o, ...n } : n; - return md(n) || hd(s), a && a !== r && e.delete(a), e.set(r, s), s; + return gd(n) || _d(s), a && a !== r && e.delete(a), e.set(r, s), s; } -function vd(e, t) { - return e ? (e.assetsByKey ||= /* @__PURE__ */ new Map(), _d(e.assetsByKey, t)) : null; +function bd(e, t) { + return e ? (e.assetsByKey ||= /* @__PURE__ */ new Map(), yd(e.assetsByKey, t)) : null; } -function yd(e) { +function xd(e) { e?.grid && e.loaded && (e._renderTimer ||= setTimeout(() => { - e._renderTimer = null, wd(e); - }, ed)); + e._renderTimer = null, Ed(e); + }, nd)); } -function bd(e, t, n = 0) { +function Sd(e, t, n = 0) { let r = Array.isArray(t?._mjrFeedGroupAssets) ? t._mjrFeedGroupAssets.filter(Boolean) : [t].filter(Boolean); if (!r.length) return; let i = Math.max(0, Math.min(n, r.length - 1)), a = r[i] || null, o = String(a?.id || "").trim(); @@ -9001,14 +9001,14 @@ function bd(e, t, n = 0) { } catch (e) { console.debug?.(e); } - sd(e.grid, [o], o); + ld(e.grid, [o], o); } - rd().then((e) => e.requestViewerOpen({ + ad().then((e) => e.requestViewerOpen({ assets: r, index: i })).catch((e) => console.debug?.(e)); } -function xd(e, t) { +function Cd(e, t) { let n = document.createElement("div"); n.className = "mjr-popover mjr-feed-group-popover", n.style.cssText = "display:none; width:min(440px, 92vw); padding:10px;"; let r = document.createElement("div"); @@ -9017,14 +9017,14 @@ function xd(e, t) { i.className = "mjr-feed-group-popover-grid", i.style.cssText = "display:grid; grid-template-columns:repeat(auto-fill, minmax(110px, 1fr)); gap:8px; max-height:360px; overflow-y:auto; overscroll-behavior:contain;"; let a = Array.isArray(t?._mjrFeedGroupAssets) ? t._mjrFeedGroupAssets : []; for (let r = 0; r < a.length; r += 1) { - let o = a[r], s = ad(o); + let o = a[r], s = sd(o); s.classList.add("mjr-feed-group-member-card"), r === 0 && s.classList.add("mjr-feed-group-member-card--cover"), s.addEventListener("click", (i) => { - i.preventDefault(), i.stopPropagation(), e.popoverManager?.close?.(n), bd(e, t, r); + i.preventDefault(), i.stopPropagation(), e.popoverManager?.close?.(n), Sd(e, t, r); }), i.appendChild(s); } return n.appendChild(i), e.root.appendChild(n), n; } -function Sd(e, t, n) { +function wd(e, t, n) { if (!t || !n) return; let r = Number(n?._mjrFeedGroupCount || 0) || 0; if (r <= 1 || (t.dataset.mjrFeedGrouped = "true", t.dataset.mjrFeedGroupCount = String(r), t.dataset.mjrStacked = "true", t.dataset.mjrStackCount = String(r), t.querySelector(".mjr-feed-group-button"))) return; @@ -9033,20 +9033,20 @@ function Sd(e, t, n) { let a = document.createElement("span"); a.className = "mjr-feed-group-button-icon pi pi-clone", i.appendChild(a); let o = document.createElement("span"); - o.className = "mjr-feed-group-button-count", o.textContent = String(r), i.appendChild(o), i.style.cssText = "position:absolute; top:34px; right:6px; z-index:11;", Wa(i); - let s = xd(e, n); + o.className = "mjr-feed-group-button-count", o.textContent = String(r), i.appendChild(o), i.style.cssText = "position:absolute; top:34px; right:6px; z-index:11;", Ka(i); + let s = Cd(e, n); i.addEventListener("click", (t) => { t.preventDefault(), t.stopPropagation(), e.popoverManager?.toggle?.(s, i); }), t.appendChild(i); } -function Cd(e, t) { +function Td(e, t) { let n = new Map((Array.isArray(t) ? t : []).map((e) => [String(e?.id || "").trim(), e]).filter(([e]) => !!e)); - for (let t of od(e?.grid)) { + for (let t of cd(e?.grid)) { let r = String(t?.dataset?.mjrAssetId || "").trim(), i = n.get(r); - i && Sd(e, t, i); + i && wd(e, t, i); } } -async function wd(e) { +async function Ed(e) { if (!e?.grid) return; try { e.popoverManager?.closeAll?.(); @@ -9059,19 +9059,19 @@ async function wd(e) { } catch (e) { console.debug?.(e); } - let t = dd(fd(e)), n = await gi(e.grid, t, { + let t = pd(md(e)), n = await vi(e.grid, t, { title: R("bottomFeed.title", "Generated Feed"), reset: !0 }); - Cd(e, t), Number(n?.count || 0) <= 0 ? (e.empty.textContent = R("bottomFeed.empty", "No generated assets yet."), e.empty.style.display = "") : e.empty.style.display = "none"; + Td(e, t), Number(n?.count || 0) <= 0 ? (e.empty.textContent = R("bottomFeed.empty", "No generated assets yet."), e.empty.style.display = "") : e.empty.style.display = "none"; } -function Td(e) { +function Dd(e) { let t = String(e?.id || "").trim(); if (t) return `id:${t}`; let n = String(e?.filename || "").trim(), r = String(e?.subfolder || "").trim(); return `file:${String(e?.source || e?.type || "").trim()}:${r}:${n}`; } -function Ed(e) { +function Od(e) { let t = String(e || "").split(".").pop()?.toUpperCase() ?? "", n = /* @__PURE__ */ new Set([ "MP4", "WEBM", @@ -9098,41 +9098,41 @@ function Ed(e) { ]); return n.has(t) ? "video" : r.has(t) ? "audio" : i.has(t) ? "model3d" : "image"; } -function Dd(e) { +function kd(e) { if (!e || typeof e != "object") return null; let t = { ...e }; - return !t.type && t.source && (t.type = t.source), !t.source && t.type && (t.source = t.type), t.kind ||= Ed(t.ext || t.filename || ""), t; + return !t.type && t.source && (t.type = t.source), !t.source && t.type && (t.source = t.type), t.kind ||= Od(t.ext || t.filename || ""), t; } -function Od(e) { - let t = Dd(e); +function Ad(e) { + let t = kd(e); if (!t) return null; - let n = Td(t); + let n = Dd(t); if (!n) return null; - let r = gd(t), i = null; - if (r) for (let [e, t] of ld.pendingAssets.entries()) e !== n && gd(t) === r && (i = t, ld.pendingAssets.delete(e)); - let a = ld.pendingAssets.get(n) || i || null, o = a ? { + let r = vd(t), i = null; + if (r) for (let [e, t] of dd.pendingAssets.entries()) e !== n && vd(t) === r && (i = t, dd.pendingAssets.delete(e)); + let a = dd.pendingAssets.get(n) || i || null, o = a ? { ...a, ...t } : t; - if (md(t) || hd(o), ld.pendingAssets.set(n, o), ld.pendingAssets.size > 64) { - let e = ld.pendingAssets.keys().next().value; - e && ld.pendingAssets.delete(e); + if (gd(t) || _d(o), dd.pendingAssets.set(n, o), dd.pendingAssets.size > 64) { + let e = dd.pendingAssets.keys().next().value; + e && dd.pendingAssets.delete(e); } return o; } -function kd() { - return Array.from(ld.pendingAssets.values()); +function jd() { + return Array.from(dd.pendingAssets.values()); } -async function Ad(e) { +async function Md(e) { if (e?.grid) { e.empty.style.display = "none", e.empty.textContent = R("bottomFeed.loading", "Loading recent assets..."); try { e.assetsByKey = /* @__PURE__ */ new Map(); let t = [], n = 0; - for (; n < Qu;) { - let r = et({ + for (; n < ed;) { + let r = Ke({ q: "*", - limit: Math.min($u, Qu - n), + limit: Math.min(td, ed - n), offset: n, scope: "output", sort: "mtime_desc", @@ -9142,19 +9142,19 @@ async function Ad(e) { let a = Array.isArray(i?.data?.assets) ? i.data.assets : []; if (!a.length) break; for (let n of a) { - let r = vd(e, n); + let r = bd(e, n); r && t.push(r); } - if (a.length < $u) break; + if (a.length < td) break; n += a.length; } - for (let t of kd()) vd(e, t); - ld.pendingAssets.clear(); - let r = dd(fd(e)), i = await gi(e.grid, r, { + for (let t of jd()) bd(e, t); + dd.pendingAssets.clear(); + let r = pd(md(e)), i = await vi(e.grid, r, { title: R("bottomFeed.title", "Generated Feed"), reset: !0 }); - Cd(e, r), Number(i?.count || 0) <= 0 ? (e.empty.textContent = R("bottomFeed.empty", "No generated assets yet."), e.empty.style.display = "") : e.empty.style.display = "none"; + Td(e, r), Number(i?.count || 0) <= 0 ? (e.empty.textContent = R("bottomFeed.empty", "No generated assets yet."), e.empty.style.display = "") : e.empty.style.display = "none"; } catch (t) { console.debug?.(t), e.empty.textContent = R("bottomFeed.loadFailed", "Failed to load generated assets."), e.empty.style.display = ""; } finally { @@ -9162,21 +9162,21 @@ async function Ad(e) { } } } -async function jd() { - for (let e of Array.from(ld.hosts)) try { - await Ad(e); +async function Nd() { + for (let e of Array.from(dd.hosts)) try { + await Md(e); } catch (e) { console.debug?.(e); } } -function Md() { - jd(); +function Pd() { + Nd(); } -function Nd(e) { +function Fd(e) { let t = document.createElement("div"); t.textContent = R("bottomFeed.loading", "Loading recent assets..."), t.style.cssText = "font-size:11px; opacity:0.65; padding:4px 2px 8px 2px;", e.root.appendChild(t), e.empty = t; } -function Pd(e) { +function Id(e) { if (!e) return; let t = [ e, @@ -9194,14 +9194,14 @@ function Pd(e) { console.debug?.(e); } } -function Fd(e) { +function Ld(e) { if (!e) return; let t = (t, n) => { n ? e.classList.add(t) : e.classList.remove(t); }; t("mjr-feed-show-info", B.FEED_SHOW_INFO), t("mjr-feed-show-filename", B.FEED_SHOW_FILENAME), t("mjr-feed-show-dimensions", B.FEED_SHOW_DIMENSIONS), t("mjr-feed-show-date", B.FEED_SHOW_DATE), t("mjr-feed-show-gentime", B.FEED_SHOW_GENTIME), t("mjr-show-hover-info", B.GRID_SHOW_HOVER_INFO), t("mjr-feed-show-dot", B.FEED_SHOW_WORKFLOW_DOT), t("mjr-feed-show-badges-ext", B.FEED_SHOW_BADGES_EXTENSION), t("mjr-feed-show-badges-rating", B.FEED_SHOW_BADGES_RATING), t("mjr-feed-show-badges-tags", B.FEED_SHOW_BADGES_TAGS); } -function Id(e, t = null) { +function Rd(e, t = null) { let n = t || document.createElement("div"); n.classList.add("mjr-am-grid-scroll"), n.style.position = "relative", n.style.flex = "1 1 auto", n.style.minHeight = "0", n.style.height = "100%", n.style.overflow = "auto", n.style.scrollbarGutter = "stable", n.style.overscrollBehavior = "contain", n.style.webkitOverflowScrolling = "touch"; let r = () => { @@ -9219,14 +9219,14 @@ function Id(e, t = null) { } }, a = document.createElement("div"); n.appendChild(a), e.root.appendChild(n); - let { app: o } = Bn(Zu, { + let { app: o } = Hn($u, { scrollElement: n, virtualize: !1, applyDefaultSettingsClasses: !1, emitWindowSelectionEvents: !0, onCardRendered: (t, n) => { try { - Sd(e, t, n); + wd(e, t, n); } catch (e) { console.debug?.(e); } @@ -9245,7 +9245,7 @@ function Id(e, t = null) { else if (t === "c") { e.preventDefault?.(), e.stopPropagation?.(), r(); try { - id().then(async ({ floatingViewerManager: e }) => { + od().then(async ({ floatingViewerManager: e }) => { await e.open(), e.toggleCompareAB(); }).catch((e) => console.debug?.(e)); } catch (e) { @@ -9266,19 +9266,19 @@ function Id(e, t = null) { } }; } -function Ld(e) { +function zd(e) { let t = e?.grid; if (!t) return []; - let n = Jn(t); - return n.size ? fd(e).filter((e) => n.has(String(e?.id || ""))) : []; + let n = Xn(t); + return n.size ? md(e).filter((e) => n.has(String(e?.id || ""))) : []; } -function Rd(e) { +function Bd(e) { let t = e?.grid; if (!t) return null; let n = String(t.dataset?.mjrSelectedAssetId || "").trim(); - return n ? fd(e).find((e) => String(e?.id || "") === n) || null : Ld(e)[0] || null; + return n ? md(e).find((e) => String(e?.id || "") === n) || null : zd(e)[0] || null; } -function zd(e) { +function Vd(e) { let t = String(e ?? ""); try { if (typeof CSS < "u" && typeof CSS.escape == "function") return CSS.escape(t); @@ -9287,39 +9287,39 @@ function zd(e) { } return t.replace(/([!"#$%&'()*+,./:;<=>?@[\\\]^`{|}~])/g, "\\$1"); } -function Bd(e) { +function Hd(e) { let t = e?.grid; if (!t) return; let n = () => { try { - yd(e); + xd(e); } catch (e) { console.debug?.(e); } }; - e.keyboard = Fi({ + e.keyboard = Li({ gridContainer: t, - getState: () => ({ assets: dd(fd(e)) }), - getSelectedAssets: () => Ld(e), - getActiveAsset: () => Rd(e), + getState: () => ({ assets: pd(md(e)) }), + getSelectedAssets: () => zd(e), + getActiveAsset: () => Bd(e), onOpenTagsEditor: (e) => { - let r = t.querySelector?.(`.mjr-asset-card[data-mjr-asset-id="${zd(e?.id || "")}"]`) || null, i = null; + let r = t.querySelector?.(`.mjr-asset-card[data-mjr-asset-id="${Vd(e?.id || "")}"]`) || null, i = null; try { i = r?.getBoundingClientRect?.() || t.getBoundingClientRect(); } catch (e) { console.debug?.(e); } - Fa(Math.round((i?.left || 0) + Math.min((i?.width || 0) * .5, 160)), Math.round((i?.top || 0) + Math.min((i?.height || 0) * .5, 120)), e, n); + La(Math.round((i?.left || 0) + Math.min((i?.width || 0) * .5, 160)), Math.round((i?.top || 0) + Math.min((i?.height || 0) * .5, 120)), e, n); }, onAssetChanged: n - }), e.keyboard.bind(), e.ratingHotkeys = Ua({ + }), e.keyboard.bind(), e.ratingHotkeys = Ga({ gridContainer: t, createRatingBadge: ht }), e.ratingHotkeys.bind(); } -var Vd = 60, Hd = 600, Ud = 10; -function Wd(e, t) { - let n = Math.max(Vd, Math.min(Hd, Math.round(Number(t) / Ud) * Ud)); +var Ud = 60, Wd = 600, Gd = 10; +function Kd(e, t) { + let n = Math.max(Ud, Math.min(Wd, Math.round(Number(t) / Gd) * Gd)); if (e?.grid) try { e.grid.style.setProperty("--mjr-grid-min-size", `${n}px`); } catch (e) { @@ -9327,8 +9327,8 @@ function Wd(e, t) { } B.FEED_GRID_MIN_SIZE = n; try { - let e = Jt(); - e.feed.minSize = n, Tn(e), fn(e); + let e = Vn(); + e.feed.minSize = n, Fn(e), Tn(e); } catch (e) { console.debug?.(e); } @@ -9345,27 +9345,27 @@ function Wd(e, t) { } return n; } -function Gd(e) { - let t = Math.max(Vd, Number(B.FEED_GRID_MIN_SIZE || 120) || 120), n = document.createElement("div"); +function qd(e) { + let t = Math.max(Ud, Number(B.FEED_GRID_MIN_SIZE || 120) || 120), n = document.createElement("div"); n.className = "mjr-feed-toolbar", n.style.cssText = "display:flex; align-items:center; gap:5px; padding:0 2px 5px 2px; flex-shrink:0; user-select:none;"; let r = document.createElement("span"); r.textContent = R("bottomFeed.cardSize", "Cards:"), r.style.cssText = "font-size:11px; opacity:0.65; white-space:nowrap; flex-shrink:0;", n.appendChild(r); let i = document.createElement("button"); i.type = "button", i.className = "mjr-feed-size-btn", i.textContent = "-", i.title = R("bottomFeed.cardSizeDecrease", "Decrease card size"), i.style.cssText = "width:20px; height:20px; padding:0; border:1px solid var(--mjr-border,#555); border-radius:4px; background:var(--mjr-surface,#2a2a2a); color:inherit; cursor:pointer; font-size:14px; line-height:1; flex-shrink:0; display:flex; align-items:center; justify-content:center;", n.appendChild(i); let a = document.createElement("input"); - a.type = "range", a.className = "mjr-feed-size-slider", a.min = String(Vd), a.max = String(Hd), a.step = String(Ud), a.value = String(t), a.title = R("bottomFeed.cardSizeSlider", "Card size"), a.style.cssText = "flex:1 1 auto; min-width:40px; max-width:180px; height:4px; cursor:pointer; accent-color:var(--mjr-accent,#64b5f6);", n.appendChild(a); + a.type = "range", a.className = "mjr-feed-size-slider", a.min = String(Ud), a.max = String(Wd), a.step = String(Gd), a.value = String(t), a.title = R("bottomFeed.cardSizeSlider", "Card size"), a.style.cssText = "flex:1 1 auto; min-width:40px; max-width:180px; height:4px; cursor:pointer; accent-color:var(--mjr-accent,#64b5f6);", n.appendChild(a); let o = document.createElement("button"); o.type = "button", o.className = "mjr-feed-size-btn", o.textContent = "+", o.title = R("bottomFeed.cardSizeIncrease", "Increase card size"), o.style.cssText = i.style.cssText, n.appendChild(o); let s = document.createElement("span"); s.className = "mjr-feed-size-display", s.textContent = `${t}px`, s.style.cssText = "font-size:11px; opacity:0.65; white-space:nowrap; min-width:36px; text-align:right; flex-shrink:0; font-variant-numeric:tabular-nums;", n.appendChild(s), i.addEventListener("click", () => { - Wd(e, Number(a.value) - Ud); + Kd(e, Number(a.value) - Gd); }), o.addEventListener("click", () => { - Wd(e, Number(a.value) + Ud); + Kd(e, Number(a.value) + Gd); }), a.addEventListener("input", () => { - Wd(e, Number(a.value)); + Kd(e, Number(a.value)); }), e.root.appendChild(n), e._sizeToolbar = n; } -function Kd(e, t = {}) { +function Jd(e, t = {}) { let n = document.createElement("div"); n.className = "mjr-assets-manager mjr-bottom-feed", n.style.cssText = "padding:6px; height:100%; min-height:0; box-sizing:border-box; display:flex; flex-direction:column; overflow:hidden;", e.replaceChildren(n); let r = { @@ -9377,13 +9377,13 @@ function Kd(e, t = {}) { assetsByKey: /* @__PURE__ */ new Map(), popoverManager: null }; - Gd(r), Nd(r), Id(r, t.gridWrapper ?? null), cd(r), r.popoverManager = Di(n), r._disposeContextMenu = Ia({ + qd(r), Fd(r), Rd(r, t.gridWrapper ?? null), ud(r), r.popoverManager = ki(n), r._disposeContextMenu = Ra({ gridContainer: r.grid, getState: () => ({ scope: "output" }) - }), Bd(r), Fd(r.grid); + }), Hd(r), Ld(r.grid); let i = () => { try { - Fd(r.grid); + Ld(r.grid); } catch (e) { console.debug?.(e); } @@ -9396,26 +9396,26 @@ function Kd(e, t = {}) { } }, r; } -function qd(e) { - let t = Od(e); - if (t) for (let e of Array.from(ld.hosts)) try { - if (!e?.grid || (vd(e, t), !e.loaded)) continue; - e.empty.style.display = "none", yd(e); +function Yd(e) { + let t = Ad(e); + if (t) for (let e of Array.from(dd.hosts)) try { + if (!e?.grid || (bd(e, t), !e.loaded)) continue; + e.empty.style.display = "none", xd(e); } catch (e) { console.debug?.(e); } } -function Jd(e, t = {}) { - Pd(e); - let n = Kd(e, t); +function Xd(e, t = {}) { + Id(e); + let n = Jd(e, t); try { e._mjrGeneratedFeedHost = n; } catch (e) { console.debug?.(e); } - return ld.hosts.add(n), Ad(n), n; + return dd.hosts.add(n), Md(n), n; } -function Yd(e) { +function Zd(e) { let t = e?._mjrGeneratedFeedHost || e || null; if (!t) return; let n = t.container || null; @@ -9429,7 +9429,7 @@ function Yd(e) { } console.debug?.(e); } - ld.hosts.delete(t); + dd.hosts.delete(t); try { t._disposeSelection?.(); } catch (e) { @@ -9476,7 +9476,7 @@ function Yd(e) { console.debug?.(e); } try { - vi(t.grid); + bi(t.grid); } catch (e) { console.debug?.(e); } @@ -9487,24 +9487,24 @@ function Yd(e) { } } // ui/features/stacks/executionAssetBuffer.ts -function Xd(e) { +function Qd(e) { return String(e || "").trim(); } -function Zd(e) { +function $d(e) { let t = String(e?.filename || "").trim(), n = String(e?.subfolder || "").trim(); return `${String(e?.type || "output").trim().toLowerCase()}|${String(e?.root_id || e?.custom_root_id || "").trim()}|${n}|${t}`; } -function Qd() { +function ef() { let e = /* @__PURE__ */ new Map(); function t(t, n) { - let r = Xd(t); + let r = Qd(t); if (!r) return []; let i = Array.isArray(n) ? n : []; if (!i.length) return []; let a = e.get(r); a || (a = /* @__PURE__ */ new Map(), e.set(r, a)); for (let e of i) { - let t = Zd(e); + let t = $d(e); t && a.set(t, { ...a.get(t) || {}, ...e || {} @@ -9513,13 +9513,13 @@ function Qd() { return Array.from(a.values()); } function n(t) { - let n = Xd(t); + let n = Qd(t); if (!n) return []; let r = e.get(n); return e.delete(n), Array.from(r?.values?.() || []); } function r(t) { - let n = Xd(t); + let n = Qd(t); n && e.delete(n); } return { @@ -9530,7 +9530,7 @@ function Qd() { }; } // ui/features/stacks/finalizeQueue.ts -function $d({ defaultDelayMs: e = 900, postJob: t } = {}) { +function tf({ defaultDelayMs: e = 900, postJob: t } = {}) { let n = /* @__PURE__ */ new Map(), r = /* @__PURE__ */ new Set(), i = !1; async function a() { if (!i) { @@ -9567,27 +9567,27 @@ function $d({ defaultDelayMs: e = 900, postJob: t } = {}) { }; } // ui/features/stacks/liveAssetGate.ts -function ef(e) { +function nf(e) { return String(e || "").trim(); } -function tf(e) { +function rf(e) { let t = String(e?.filename || "").trim(), n = String(e?.filepath || "").trim(), r = String(e?.subfolder || "").trim(); return `${String(e?.type || e?.source || "output").trim().toLowerCase()}|${String(e?.root_id || e?.custom_root_id || "").trim()}|${r}|${t || n}`; } -function nf(e, t) { +function af(e, t) { return !t || String(e?.job_id || "").trim() === t ? e : { ...e || {}, job_id: t }; } -function rf() { +function of() { let e = /* @__PURE__ */ new Map(); function t(t, { files: n = [], expectedCount: r = null } = {}) { - let i = ef(t); + let i = nf(t); if (!i) return; let a = /* @__PURE__ */ new Set(); for (let e of Array.isArray(n) ? n : []) { - let t = tf(e); + let t = rf(e); t && a.add(t); } e.set(i, { @@ -9597,13 +9597,13 @@ function rf() { }); } function n(t) { - let n = ef(t); + let n = nf(t); n && e.delete(n); } function r(t) { - let n = ef(t?.job_id); + let n = nf(t?.job_id); if (n) return n; - let r = tf(t); + let r = rf(t); if (!r) return ""; let i = "", a = Infinity; for (let [t, n] of e.entries()) n?.fileKeys?.has?.(r) && (n.markedAt ?? Infinity) < a && (a = n.markedAt ?? Infinity, i = t); @@ -9616,7 +9616,7 @@ function rf() { jobId: "", defer: !1 }; - let i = nf(t, n), a = e.get(n); + let i = af(t, n), a = e.get(n); if (!a) return { detail: i, jobId: n, @@ -9638,20 +9638,20 @@ function rf() { }; } // ui/features/stacks/executionRuntimeController.ts -var af = 2e3, of = 2e3, sf = /* @__PURE__ */ new Set([ +var sf = 2e3, cf = 2e3, lf = /* @__PURE__ */ new Set([ "DB_MAINTENANCE", "TIMEOUT", "NETWORK_ERROR", "SERVICE_UNAVAILABLE" -]), cf = 8, lf = 1200, uf = 15e3, df = 6e5, ff = 500, pf = 6, mf = 3e4, hf = 500; -function gf({ post: e, ENDPOINTS: t, reportError: n, extractOutputFiles: r, ensureExecutionRuntime: i, emitRuntimeStatus: a, refreshGeneratedFeedHosts: o, getActiveGridContainer: s }) { +]), uf = 8, df = 1200, ff = 15e3, pf = 6e5, mf = 500, hf = 6, gf = 3e4, _f = 500; +function vf({ post: e, ENDPOINTS: t, reportError: n, extractOutputFiles: r, ensureExecutionRuntime: i, emitRuntimeStatus: a, refreshGeneratedFeedHosts: o, getActiveGridContainer: s }) { let c = pe({ - ttlMs: af, - maxSize: of + ttlMs: sf, + maxSize: cf }), l = pe({ - ttlMs: df, - maxSize: ff - }), u = Math.max(0, Number(B.EXECUTION_IDLE_GRACE_MS) || 6e3), d = /* @__PURE__ */ new Map(), f = Qd(), p = rf(), m = "", h = 0, g = null; + ttlMs: pf, + maxSize: mf + }), u = Math.max(0, Number(B.EXECUTION_IDLE_GRACE_MS) || 6e3), d = /* @__PURE__ */ new Map(), f = ef(), p = of(), m = "", h = 0, g = null; function _() { try { return typeof window > "u" ? !1 : window.__MJR_DEBUG_JOB_TRACKING__ === !0 || String(window.localStorage?.getItem("mjr.debug.jobTracking") || "").trim() === "1"; @@ -9723,7 +9723,7 @@ function gf({ post: e, ENDPOINTS: t, reportError: n, extractOutputFiles: r, ensu console.debug?.(e); } } - let S = $d({ + let S = tf({ defaultDelayMs: 900, async postJob(r) { v("auto-stack:start", { job_id: r }); @@ -9761,7 +9761,7 @@ function gf({ post: e, ENDPOINTS: t, reportError: n, extractOutputFiles: r, ensu } function T(e) { let t = Math.max(1, Number(e) || 1), n = Math.min(6, t - 1); - return Math.min(uf, lf * 2 ** n); + return Math.min(ff, df * 2 ** n); } function E() { g &&= (clearTimeout(g), null); @@ -9779,7 +9779,7 @@ function gf({ post: e, ENDPOINTS: t, reportError: n, extractOutputFiles: r, ensu } function O(e) { let t = String(e?.code || "").trim().toUpperCase(); - return sf.has(t); + return lf.has(t); } function k(r, i = 1, a = {}) { let o = Array.isArray(r) ? r : []; @@ -9794,7 +9794,7 @@ function gf({ post: e, ENDPOINTS: t, reportError: n, extractOutputFiles: r, ensu files: o.map((e) => String(e?.filename || e?.filepath || "")) }), e(t.INDEX_FILES, s).then((e) => { if (!e?.ok) { - if (O(e) && i < cf) { + if (O(e) && i < uf) { let e = T(i); setTimeout(() => k(o, i + 1, a), e); } else try { @@ -9829,7 +9829,7 @@ function gf({ post: e, ENDPOINTS: t, reportError: n, extractOutputFiles: r, ensu let a = d.get(i); a?.timer && clearTimeout(a.timer); let o = a?.firstAttemptAt ?? Date.now(); - if (Date.now() - o >= mf) { + if (Date.now() - o >= gf) { k(r, 1, t); return; } @@ -9874,7 +9874,7 @@ function gf({ post: e, ENDPOINTS: t, reportError: n, extractOutputFiles: r, ensu file_count: Array.isArray(e) ? e.length : 0, files: Array.isArray(e) ? e.map((e) => String(e?.filename || e?.filepath || "")) : [] }), !r) { - if (n < pf) { + if (n < hf) { M(e, t, n); return; } @@ -10008,7 +10008,7 @@ function gf({ post: e, ENDPOINTS: t, reportError: n, extractOutputFiles: r, ensu reason: String(e?.type || "") }), E(), f.clear(r), n.allowLiveStackFinalize && p.clearPendingJob(r), P()), String(e?.type || "") === "execution_success" && D(() => { r && N(r), F(r); - }, I(r) ? Math.min(u, hf) : u); + }, I(r) ? Math.min(u, _f) : u); } function se(e) { if (!y()) return; @@ -10033,7 +10033,7 @@ function gf({ post: e, ENDPOINTS: t, reportError: n, extractOutputFiles: r, ensu }; } // ui/utils/extractOutputFiles.ts -function _f(e) { +function yf(e) { let t = [], n = /* @__PURE__ */ new Set(), r = 2e3, i = /\.(png|jpe?g|webp|gif|bmp|tiff?|avif|heic|heif|apng|hdr|svg|mp4|webm|mov|mkv|avi|m4v|mp3|wav|flac|ogg|glb|gltf|obj|fbx|ply|stl)$/i, a = typeof WeakSet < "u" ? /* @__PURE__ */ new WeakSet() : null, o = ({ type: e, subfolder: t, filename: n, path: r }) => r ? `path|${String(r).trim().toLowerCase()}` : `${e || ""}|${t || ""}|${n || ""}`.toLowerCase(), s = (e) => { if (!e) return; let r = e.path || e.filepath || e.fullpath || e.fullPath || e.full_path, i = e.filename; @@ -10114,15 +10114,15 @@ function _f(e) { return u(e, 0), t; } // ui/features/runtime/sidebarAssetBadge.ts -var vf = "mjr-sidebar-asset-badge", yf = "mjr-sidebar-tab-has-badge", bf = "mjr-sidebar-asset-badge-style", xf = 99, Sf = 0, Cf = "majoor-assets", wf = !1, Tf = /* @__PURE__ */ new Set(); -function Ef() { - if (typeof document > "u" || document.getElementById(bf)) return; +var bf = "mjr-sidebar-asset-badge", xf = "mjr-sidebar-tab-has-badge", Sf = "mjr-sidebar-asset-badge-style", Cf = 99, wf = 0, Tf = "majoor-assets", Ef = !1, Df = /* @__PURE__ */ new Set(); +function Of() { + if (typeof document > "u" || document.getElementById(Sf)) return; let e = document.createElement("style"); - e.id = bf, e.textContent = ` - .${yf} { + e.id = Sf, e.textContent = ` + .${xf} { position: relative !important; } - .${vf} { + .${bf} { position: absolute; top: 3px; right: 3px; @@ -10146,7 +10146,7 @@ function Ef() { } `, document.head?.appendChild(e); } -function Df(e) { +function kf(e) { let t = String(e || "").trim(); if (!t) return []; let n = (() => { @@ -10165,91 +10165,91 @@ function Df(e) { `[href="#${n}"]` ]; } -function Of(e) { +function Af(e) { let t = `${e?.textContent || ""} ${e?.title || ""} ${e?.getAttribute?.("aria-label") || ""}`; return /assets\s*manager|majoor/i.test(t); } -function kf(e) { +function jf(e) { return !e || typeof e != "object" ? !1 : typeof HTMLElement < "u" ? e instanceof HTMLElement : typeof e.querySelector == "function" && typeof e.appendChild == "function"; } -function Af() { +function Mf() { if (typeof document > "u") return null; - for (let e of Df(Cf)) { + for (let e of kf(Tf)) { let t = document.querySelector(e); - if (kf(t)) return t; + if (jf(t)) return t; } let e = Array.from(document.querySelectorAll(".pi-folder, .pi-folder-open")); for (let t of e) { let e = t.closest?.("button,[role='tab'],a,.p-button,.comfyui-button,.sidebar-tab"); - if (kf(e) && Of(e)) return e; + if (jf(e) && Af(e)) return e; } - return Array.from(document.querySelectorAll("button,[role='tab'],a,.p-button,.comfyui-button,.sidebar-tab")).find((e) => kf(e) && Of(e)) || null; -} -function jf() { - Ef(); - let e = Af(); - if (!e) return !1; - let t = e.querySelector(`:scope > .${vf}`); - return !Nf() || Sf <= 0 ? (t?.remove(), e.classList.remove(yf), !0) : (t || (t = document.createElement("span"), t.className = vf, t.setAttribute("aria-hidden", "true"), e.appendChild(t)), e.classList.add(yf), t.textContent = Sf > xf ? `${xf}+` : String(Sf), !0); -} -function Mf() { - jf(), typeof requestAnimationFrame == "function" && requestAnimationFrame(() => jf()), setTimeout(() => jf(), 250), setTimeout(() => jf(), 1e3); + return Array.from(document.querySelectorAll("button,[role='tab'],a,.p-button,.comfyui-button,.sidebar-tab")).find((e) => jf(e) && Af(e)) || null; } function Nf() { + Of(); + let e = Mf(); + if (!e) return !1; + let t = e.querySelector(`:scope > .${bf}`); + return !Ff() || wf <= 0 ? (t?.remove(), e.classList.remove(xf), !0) : (t || (t = document.createElement("span"), t.className = bf, t.setAttribute("aria-hidden", "true"), e.appendChild(t)), e.classList.add(xf), t.textContent = wf > Cf ? `${Cf}+` : String(wf), !0); +} +function Pf() { + Nf(), typeof requestAnimationFrame == "function" && requestAnimationFrame(() => Nf()), setTimeout(() => Nf(), 250), setTimeout(() => Nf(), 1e3); +} +function Ff() { return B.SIDEBAR_ASSET_BADGE_ENABLED !== !1; } -function Pf(e = null) { +function If(e = null) { let t = String(e?.id || e?.asset_id || "").trim(); if (t) return `id:${t}`; let n = String(e?.type || e?.source || "output").trim().toLowerCase(), r = String(e?.root_id || e?.custom_root_id || "").trim().toLowerCase(), i = String(e?.subfolder || e?.sub_folder || e?.subFolder || "").trim().toLowerCase(), a = String(e?.filename || "").trim().toLowerCase(), o = String(e?.filepath || e?.path || e?.fullpath || e?.full_path || "").trim().toLowerCase(), s = a || o; return s ? `file:${n}|${r}|${i}|${s}` : ""; } -function Ff(e) { +function Lf(e) { if (!e) return !0; - if (Tf.has(e)) return !1; - if (Tf.add(e), Tf.size > 1e3) { - let e = Array.from(Tf).slice(-500); - Tf.clear(); - for (let t of e) Tf.add(t); + if (Df.has(e)) return !1; + if (Df.add(e), Df.size > 1e3) { + let e = Array.from(Df).slice(-500); + Df.clear(); + for (let t of e) Df.add(t); } return !0; } -function If({ sidebarTabId: e } = {}) { +function Rf({ sidebarTabId: e } = {}) { let t = String(e || "").trim(); - t && (Cf = t), !wf && typeof window < "u" && (wf = !0, window.addEventListener?.("mjr-settings-changed", (e) => { - e?.detail?.key === "sidebar.assetBadgeEnabled" && (Nf() || (Sf = 0, Tf.clear()), Mf()); - })), Mf(); + t && (Tf = t), !Ef && typeof window < "u" && (Ef = !0, window.addEventListener?.("mjr-settings-changed", (e) => { + e?.detail?.key === "sidebar.assetBadgeEnabled" && (Ff() || (wf = 0, Df.clear()), Pf()); + })), Pf(); } -function Lf(e = null) { - Nf() && Ff(Pf(e)) && (Sf += 1, Mf()); +function zf(e = null) { + Ff() && Lf(If(e)) && (wf += 1, Pf()); } -function Rf() { - Sf = 0, Tf.clear(), Mf(); +function Bf() { + wf = 0, Df.clear(), Pf(); } // ui/features/runtime/pendingGeneratedAssets.ts -var zf = 0; -function Bf(e = 1) { +var Vf = 0; +function Hf(e = 1) { let t = Math.max(1, Number(e) || 1); - zf += t; + Vf += t; try { - window.__mjrPendingGeneratedAssetCount = zf; + window.__mjrPendingGeneratedAssetCount = Vf; } catch {} - return zf; + return Vf; } -function Vf() { - let e = zf; - zf = 0; +function Uf() { + let e = Vf; + Vf = 0; try { window.__mjrPendingGeneratedAssetCount = 0; } catch {} return e; } // ui/features/runtime/registerRealtimeListeners.ts -var Hf = 3e4, Uf = /* @__PURE__ */ new Map(), Wf = "live"; -function Gf(e) { +var Wf = 3e4, Gf = /* @__PURE__ */ new Map(), Kf = "live"; +function qf(e) { return e === !0 || e === 1 || e === "1" ? !0 : e === !1 || e === 0 || e === "0" ? !1 : null; } -function Kf(e) { +function Jf(e) { let t = [ e?.has_ai_vector, e?.hasAiVector, @@ -10259,25 +10259,25 @@ function Kf(e) { e?.vectorIndexed ]; for (let e of t) { - let t = Gf(e); + let t = qf(e); if (t !== null) return t; } return !1; } -function qf(e) { - let t = Date.now(), n = Number(Uf.get(e) || 0); - if (n > 0 && t - n < Hf) return !0; - if (Uf.set(e, t), Uf.size > 500) { - let e = t - 5 * Hf; - for (let [t, n] of Uf.entries()) Number(n) < e && Uf.delete(t); +function Yf(e) { + let t = Date.now(), n = Number(Gf.get(e) || 0); + if (n > 0 && t - n < Wf) return !0; + if (Gf.set(e, t), Gf.size > 500) { + let e = t - 5 * Wf; + for (let [t, n] of Gf.entries()) Number(n) < e && Gf.delete(t); } return !1; } -function Jf(e) { +function Xf(e) { let t = String(e?.id || "").trim(); - t && (Kf(e) || qf(t) || ge(t).catch((e) => console.debug?.("[Majoor] auto vector index failed", e))); + t && (Jf(e) || Yf(t) || ge(t).catch((e) => console.debug?.("[Majoor] auto vector index failed", e))); } -function Yf(e) { +function Zf(e) { let t = String(e?.kind || "").trim().toLowerCase(); if (t) return t; let n = String(e?.filename || e?.filepath || e?.path || e?.fullpath || "").trim(), r = n.includes(".") && n.split(".").pop()?.toLowerCase?.() || ""; @@ -10325,8 +10325,8 @@ function Yf(e) { "spz" ].includes(r) ? "model3d" : "unknown" : ""; } -function Xf(e, { jobId: t = "" } = {}) { - let n = String(e?.filename || "").trim(), r = String(e?.filepath || e?.path || e?.fullpath || e?.full_path || "").trim(), i = String(e?.subfolder || e?.sub_folder || e?.subFolder || "").trim(), a = String(e?.type || e?.source || "output").trim().toLowerCase(), o = String(e?.root_id || e?.custom_root_id || "").trim(), s = Yf(e); +function Qf(e, { jobId: t = "" } = {}) { + let n = String(e?.filename || "").trim(), r = String(e?.filepath || e?.path || e?.fullpath || e?.full_path || "").trim(), i = String(e?.subfolder || e?.sub_folder || e?.subFolder || "").trim(), a = String(e?.type || e?.source || "output").trim().toLowerCase(), o = String(e?.root_id || e?.custom_root_id || "").trim(), s = Zf(e); if (!s || !n && !r) return null; let c = n || r.split(/[/\\]/).filter(Boolean).pop() || ""; if (!c) return null; @@ -10337,7 +10337,7 @@ function Xf(e, { jobId: t = "" } = {}) { c ].map((e) => String(e || "").trim().toLowerCase()).join("|"), d = Date.now() / 1e3, f = String(e?.job_id || t || "").trim(); return { - id: `${Wf}:${u || l.toLowerCase()}`, + id: `${Kf}:${u || l.toLowerCase()}`, filename: c, filepath: l, path: l, @@ -10360,7 +10360,7 @@ function Xf(e, { jobId: t = "" } = {}) { _mjrLiveLabel: "In progress" }; } -function Zf(e) { +function $f(e) { let t = String(e || ""); try { if (typeof CSS < "u" && typeof CSS.escape == "function") return CSS.escape(t); @@ -10369,11 +10369,11 @@ function Zf(e) { } return t.replace(/([!"#$%&'()*+,./:;<=>?@[\\\]^`{|}~])/g, "\\$1"); } -function Qf(e, t) { +function ep(e, t) { let n = String(e || "").trim().toLowerCase(); return n === "delete_db" ? t("btn.deleteDb", "Delete DB") : n === "reset_index" ? t("btn.resetIndex", "Reset index") : n === "restore_db" ? t("btn.dbRestore", "Restore DB") : t("btn.maintenance", "Maintenance"); } -function $f(e, t) { +function tp(e, t) { let n = String(e || "").trim().toLowerCase(), r = String(t || "").trim().toLowerCase(), i = { delete_db: [ "started", @@ -10407,7 +10407,7 @@ function $f(e, t) { label: r.replace(/[_-]+/g, " ") }; } -async function ep({ api: e, runtime: t, executionRuntime: n, appRef: r, liveStreamModule: i, ensureExecutionRuntime: a, emitRuntimeStatus: o, getActiveGridContainer: s, pushGeneratedAsset: c, upsertAsset: l, upsertAssetNow: u, removeAssetsFromGrid: d, getEnrichmentState: f, setEnrichmentState: p, comfyToast: m, t: h, reportError: g, registerCleanableListener: _, syncExecutionBackendState: v }) { +async function np({ api: e, runtime: t, executionRuntime: n, appRef: r, liveStreamModule: i, ensureExecutionRuntime: a, emitRuntimeStatus: o, getActiveGridContainer: s, pushGeneratedAsset: c, upsertAsset: l, upsertAssetNow: u, removeAssetsFromGrid: d, getEnrichmentState: f, setEnrichmentState: p, comfyToast: m, t: h, reportError: g, registerCleanableListener: _, syncExecutionBackendState: v }) { e._mjrExecutedHandler = (e) => { try { n.handleExecutedEvent(e, { appRef: r }); @@ -10471,7 +10471,7 @@ async function ep({ api: e, runtime: t, executionRuntime: n, appRef: r, liveStre function b(e, t, { immediate: n = !1, force: r = !1 } = {}) { let i = String(t?.id || "").trim(), a = String(t?.kind || "").trim(), o = String(t?.filename || "").trim(), s = String(t?.filepath || "").trim(), c = !!a && (!!o || !!s), d = !1; if (i) try { - d = typeof e?._mjrHasAssetId == "function" ? !!e._mjrHasAssetId(i) : !!e.querySelector(`.mjr-asset-card[data-mjr-asset-id="${Zf(i)}"]`); + d = typeof e?._mjrHasAssetId == "function" ? !!e._mjrHasAssetId(i) : !!e.querySelector(`.mjr-asset-card[data-mjr-asset-id="${$f(i)}"]`); } catch (e) { console.debug?.(e); } @@ -10500,7 +10500,7 @@ async function ep({ api: e, runtime: t, executionRuntime: n, appRef: r, liveStre if (n !== "output" && n !== "all") return; let r = Array.isArray(e?.detail?.files) ? e.detail.files : [], i = String(e?.detail?.prompt_id || e?.detail?.promptId || "").trim(); for (let e of r) { - let n = Xf(e, { jobId: i }); + let n = Qf(e, { jobId: i }); n && b(t, n, { immediate: !0, force: !0 @@ -10515,19 +10515,19 @@ async function ep({ api: e, runtime: t, executionRuntime: n, appRef: r, liveStre let t = n.prepareLiveAssetEvent(e.detail), r = t?.detail || e.detail; if (t?.defer) return; let i = n.isRenderableLiveAsset(r); - i && c(r), Jf(r); + i && c(r), Xf(r); let a = s(); if (!a) { - i && Bf(); + i && Hf(); return; } let o = a.dataset?.mjrScope || "output"; if (o !== "output" && o !== "all") { - i && Bf(); + i && Hf(); return; } let l = a.dataset?.mjrQuery || "*"; - String(l).trim() === "*" && i ? b(a, r, { immediate: !0 }) || Bf() : i && Bf(); + String(l).trim() === "*" && i ? b(a, r, { immediate: !0 }) || Hf() : i && Hf(); } catch (e) { g(e, "entry.asset_added"); } @@ -10590,7 +10590,7 @@ async function ep({ api: e, runtime: t, executionRuntime: n, appRef: r, liveStre if (window.dispatchEvent(new CustomEvent(V.ASSET_INDEXED, { detail: t })), !t) return; let r = n.prepareLiveAssetEvent(t), i = r?.detail || t; if (r?.defer) return; - n.isRenderableLiveAsset(i) && (c(i), Lf(i)), Jf(i); + n.isRenderableLiveAsset(i) && (c(i), zf(i)), Xf(i); let a = s(); if (!a) return; b(a, i, { @@ -10625,11 +10625,11 @@ async function ep({ api: e, runtime: t, executionRuntime: n, appRef: r, liveStre if (!s) return; let c = r === "error" || n === "failed" ? "error" : n === "done" ? "success" : "info", l = { history: { trackId: `maintenance:${String(i || "db_restore").trim().toLowerCase() || "db_restore"}`, - title: Qf(i, h), + title: ep(i, h), detail: s, status: n, operation: String(i || "db_restore").trim().toLowerCase(), - progress: $f(i, n), + progress: tp(i, n), source: String(t?.name || "").trim() || "maintenance", forceStore: !0 } }; @@ -10659,7 +10659,7 @@ async function ep({ api: e, runtime: t, executionRuntime: n, appRef: r, liveStre _(t, window, V.ASSETS_DELETED, x), t && typeof t == "object" && (t.api = e, t.assetsDeletedHandler = x), console.debug("[Majoor] Real-time listener registered"); } // ui/features/runtime/entryDebugApi.ts -function tp({ resolveNodeStreamModule: e }) { +function rp({ resolveNodeStreamModule: e }) { typeof window < "u" && (window.MajoorDebug = { exportMetrics: () => window.MajoorMetrics?.exportMetrics?.(), getMetrics: () => window.MajoorMetrics?.getMetricsReport?.(), @@ -10674,16 +10674,16 @@ function tp({ resolveNodeStreamModule: e }) { }, console.debug?.("[Majoor] NodeStream API: window.MajoorNodeStream.mode, .listAdapters(), .getKnownNodeSets()")); } // ui/features/runtime/benignConsoleNoise.ts -var np = ["ResizeObserver loop completed with undelivered notifications.", "ResizeObserver loop limit exceeded"]; -function rp(e) { +var ip = ["ResizeObserver loop completed with undelivered notifications.", "ResizeObserver loop limit exceeded"]; +function ap(e) { try { let t = String(e?.message || e || ""); - return np.some((e) => t.includes(e)); + return ip.some((e) => t.includes(e)); } catch { return !1; } } -function ip() { +function op() { if (typeof window > "u") return null; try { window.__MJR_BENIGN_CONSOLE_NOISE_FILTER__?.abort?.(); @@ -10698,7 +10698,7 @@ function ip() { } let t = (e) => { try { - if (!rp(e?.message || e?.error)) return; + if (!ap(e?.message || e?.error)) return; e.preventDefault?.(), e.stopImmediatePropagation?.(); } catch (e) { console.debug?.(e); @@ -10723,7 +10723,7 @@ function ip() { return window.__MJR_BENIGN_CONSOLE_NOISE_FILTER__ = r, r; } // ui/features/geninfo/genInfoOverridePicker.ts -var ap = "Majoor.GenInfoOverridePicker", op = "MajoorGenInfoOverride", sp = R("genInfoOverride.autoFillFromWorkflow", "Auto fill from workflow"), cp = R("genInfoOverride.pick", "Pick"), lp = { +var sp = "Majoor.GenInfoOverridePicker", cp = "MajoorGenInfoOverride", lp = R("genInfoOverride.autoFillFromWorkflow", "Auto fill from workflow"), up = R("genInfoOverride.pick", "Pick"), dp = { positive_prompt: [ "positive_prompt", "prompt", @@ -10746,7 +10746,7 @@ var ap = "Majoor.GenInfoOverridePicker", op = "MajoorGenInfoOverride", sp = R("g ], vae: ["vae", "vae_name"], clip: ["clip", "clip_name"] -}, up = [ +}, fp = [ { field: "positive_prompt", label: "prompt" @@ -10791,14 +10791,14 @@ var ap = "Majoor.GenInfoOverridePicker", op = "MajoorGenInfoOverride", sp = R("g field: "denoise", label: "denoise" } -], dp = 0x10000000000000000, fp = !1, pp = !1; -function mp(e, t) { +], pp = 0x10000000000000000, mp = !1, hp = !1; +function gp(e, t) { let n = (e.widgets ?? []).find((e) => e?.name === t); if (n && n.value !== void 0 && n.value !== null && String(n.value).trim() !== "") return n.value; let r = Array.isArray(e.widgets_values) ? e.widgets_values : [], i = (Array.isArray(e.widgets) ? e.widgets : []).findIndex((e) => e?.name === t); return i >= 0 ? r[i] : void 0; } -function hp(e, t, n, r, i) { +function _p(e, t, n, r, i) { if (r == null || String(r).trim() === "") return; let a = `${n}:${String(r).trim()}`; t.has(a) || (t.add(a), e.push({ @@ -10808,42 +10808,42 @@ function hp(e, t, n, r, i) { source: i })); } -function gp(e, t, n) { +function vp(e, t, n) { let r = t.toLowerCase(); - return !!((lp[e] ?? [e]).some((e) => r === e || r.includes(e)) || e === "positive_prompt" && r === "text" && n.toLowerCase().includes("positive") || e === "negative_prompt" && (r.includes("negative") || n.toLowerCase().includes("negative"))); + return !!((dp[e] ?? [e]).some((e) => r === e || r.includes(e)) || e === "positive_prompt" && r === "text" && n.toLowerCase().includes("positive") || e === "negative_prompt" && (r.includes("negative") || n.toLowerCase().includes("negative"))); } -function _p(e, t = null) { +function yp(e, t = null) { let n = [], r = /* @__PURE__ */ new Set(); for (let { graph: i, label: a } of mt(e)) for (let e of ft(i)) { - if (String(e?.comfyClass || e?.type || "") === op) continue; + if (String(e?.comfyClass || e?.type || "") === cp) continue; let i = String(e?.title || e?.comfyClass || e?.type || `Node ${e?.id ?? ""}`).trim(), o = a === "Workflow" ? i : `${a} / ${i}`; - for (let [t, i] of Object.entries(lp)) for (let a of i) hp(n, r, t, mp(e, a), o); + for (let [t, i] of Object.entries(dp)) for (let a of i) _p(n, r, t, gp(e, a), o); let s = Array.isArray(e.widgets) ? e.widgets : [], c = Array.isArray(e.widgets_values) ? e.widgets_values : []; s.forEach((e, a) => { let s = String(e?.name || "").toLowerCase(), l = e?.value ?? c[a]; - s.includes("positive") || s === "text" && String(i).toLowerCase().includes("positive") ? hp(n, r, "positive_prompt", l, o) : s.includes("negative") && hp(n, r, "negative_prompt", l, o), t && gp(t, s, i) && hp(n, r, t, l, `${o} / ${e?.name || `widget ${a + 1}`}`); + s.includes("positive") || s === "text" && String(i).toLowerCase().includes("positive") ? _p(n, r, "positive_prompt", l, o) : s.includes("negative") && _p(n, r, "negative_prompt", l, o), t && vp(t, s, i) && _p(n, r, t, l, `${o} / ${e?.name || `widget ${a + 1}`}`); }); } return t ? n.filter((e) => e.field === t).slice(0, 120) : n.slice(0, 80); } -function vp(e, t) { +function bp(e, t) { return (e.widgets ?? []).find((e) => e?.name === t); } -function yp(e) { - let t = vp(e, "seed"); +function xp(e) { + let t = bp(e, "seed"); t && (t.options = { ...t.options ?? {}, min: -1, - max: dp, + max: pp, control_after_generate: !1 }); } -function bp(e, t) { +function Sp(e, t) { return t === "positive_prompt" ? e?.prompt ?? e?.positive_prompt : t === "negative_prompt" ? e?.negative_prompt ?? e?.negative : t === "loras_json" && Array.isArray(e?.loras) ? JSON.stringify(e.loras) : t === "custom_info_json" && Array.isArray(e?.custom_info) ? JSON.stringify(e.custom_info) : e?.[t]; } -function xp(e, t) { +function Cp(e, t) { if (!e || !t || typeof t != "object") return 0; - yp(e); + xp(e); let n = 0; for (let r of [ "positive_prompt", @@ -10861,16 +10861,16 @@ function xp(e, t) { "workflow_notes", "custom_info_json" ]) { - let i = bp(t, r); + let i = Sp(t, r); if (i == null) continue; - let a = vp(e, r); - a && (Sp(a, i, e, r), Cp(a, i), n += 1); + let a = bp(e, r); + a && (wp(a, i, e, r), Tp(a, i), n += 1); } return n; } -function Sp(e, t, n, r) { +function wp(e, t, n, r) { if (r !== "seed") { - Wn(e, t, n); + Kn(e, t, n); return; } let i = Number(t); @@ -10878,15 +10878,15 @@ function Sp(e, t, n, r) { e.options = { ...e.options ?? {}, min: -1, - max: dp, + max: pp, control_after_generate: !1 }, e.value = Math.trunc(i); try { - e.callback?.(e.value, $e()?.canvas ?? null, n, null, e); + e.callback?.(e.value, Ze()?.canvas ?? null, n, null, e); } catch {} } } -function Cp(e, t) { +function Tp(e, t) { let n = String(t ?? ""), r = [ e?.inputEl, e?.element, @@ -10899,26 +10899,26 @@ function Cp(e, t) { e.value = n; } catch {} } -function wp(e, t, n) { - let r = kp({ detail: { output: t } }); - if (r && xp(e, r)) try { +function Ep(e, t, n) { + let r = jp({ detail: { output: t } }); + if (r && Cp(e, r)) try { e.setSize?.(e.computeSize?.()), e.graph?.setDirtyCanvas?.(!0, !0), e.graph?.change?.(), n?.graph?.setDirtyCanvas?.(!0, !0), n?.graph?.change?.(), n?.canvas?.setDirty?.(!0, !0), n?.canvas?.draw?.(!0, !0); } catch {} } -function Tp(e, t, n = null) { - let r = n || t.field, i = vp(e, r); - i && (Sp(i, t.value, e, r), Cp(i, t.value)); +function Dp(e, t, n = null) { + let r = n || t.field, i = bp(e, r); + i && (wp(i, t.value, e, r), Tp(i, t.value)); } -function Ep(e) { +function Op(e) { return !e || e.value === void 0 || e.value === null || String(e.value).trim() === ""; } -function Dp(e, t) { - let n = _p(t), r = 0; - for (let t of Object.keys(lp)) { - let i = vp(e, t); - if (!i || !Ep(i)) continue; +function kp(e, t) { + let n = yp(t), r = 0; + for (let t of Object.keys(dp)) { + let i = bp(e, t); + if (!i || !Op(i)) continue; let a = n.find((e) => e.field === t); - a && (Sp(i, a.value, e, t), Cp(i, a.value), r += 1); + a && (wp(i, a.value, e, t), Tp(i, a.value), r += 1); } return t?.graph?.setDirtyCanvas?.(!0, !0), t?.graph?.change?.(), t?.extensionManager?.toast?.add?.({ severity: r ? "success" : "warn", @@ -10927,34 +10927,34 @@ function Dp(e, t) { life: 3e3 }), r; } -function Op(e, t) { - if (e && String(e?.comfyClass || e?.type || "") === op && (yp(e), !(e.widgets ?? []).some((e) => e?.name === sp) && typeof e.addWidget == "function")) { - e.addWidget("button", sp, null, () => Dp(e, t)); - for (let n of up) { - let r = `${cp} ${n.label}`; - (e.widgets ?? []).some((e) => e?.name === r) || e.addWidget("button", r, null, () => jp(e, t, n.field)); +function Ap(e, t) { + if (e && String(e?.comfyClass || e?.type || "") === cp && (xp(e), !(e.widgets ?? []).some((e) => e?.name === lp) && typeof e.addWidget == "function")) { + e.addWidget("button", lp, null, () => kp(e, t)); + for (let n of fp) { + let r = `${up} ${n.label}`; + (e.widgets ?? []).some((e) => e?.name === r) || e.addWidget("button", r, null, () => Np(e, t, n.field)); } try { e.setSize?.(e.computeSize?.()), t?.graph?.setDirtyCanvas?.(!0, !0); } catch {} } } -function kp(e) { +function jp(e) { let t = e?.detail?.output, n = t?.majoor_geninfo_override ?? t?.ui?.majoor_geninfo_override, r = Array.isArray(n) ? n[0] : n; return r && typeof r == "object" ? r : null; } -function Ap(e) { - if (pp) return; +function Mp(e) { + if (hp) return; let t = e?.api; - t && typeof t.addEventListener == "function" && (pp = !0, t.addEventListener("executed", (t) => { + t && typeof t.addEventListener == "function" && (hp = !0, t.addEventListener("executed", (t) => { let n = t?.detail?.node ?? t?.detail?.display_node; if (!n) return; let r = pt(e, n); - r && String(r?.comfyClass || r?.type || "") === op && wp(r, t?.detail?.output, e); + r && String(r?.comfyClass || r?.type || "") === cp && Ep(r, t?.detail?.output, e); })); } -function jp(e, t, n = null) { - let r = _p(t, n); +function Np(e, t, n = null) { + let r = yp(t, n); if (!r.length) { t?.extensionManager?.toast?.add?.({ severity: "warn", @@ -10977,60 +10977,60 @@ function jp(e, t, n = null) { for (let t of r) { let r = document.createElement("button"); r.type = "button", r.style.cssText = "width:100%;display:grid;grid-template-columns:130px 1fr 150px;gap:8px;text-align:left;background:#2b2b2b;color:#eee;border:1px solid #3d3d3d;border-radius:5px;padding:7px;margin:5px 0;cursor:pointer", r.innerHTML = `${t.label}`, r.children[1].textContent = String(t.value), r.children[2].textContent = t.source, r.onclick = () => { - Tp(e, t, n), i.remove(); + Dp(e, t, n), i.remove(); }, a.appendChild(r); } i.appendChild(a), a.querySelector("[data-close]")?.addEventListener("click", () => i.remove()), i.addEventListener("click", (e) => { e.target === i && i.remove(); }), document.body.appendChild(i); } -function Mp(e, t) { - if (String(e?.comfyClass || e?.type || "") !== op) return []; +function Pp(e, t) { + if (String(e?.comfyClass || e?.type || "") !== cp) return []; let n = [{ content: R("genInfoOverride.pickFromWorkflow", "Pick Gen Info from workflow"), - callback: () => jp(e, t) + callback: () => Np(e, t) }]; - for (let r of up) n.push({ + for (let r of fp) n.push({ content: `Pick ${r.label}`, - callback: () => jp(e, t, r.field) + callback: () => Np(e, t, r.field) }); return n.push({ - content: sp, - callback: () => Dp(e, t) + content: lp, + callback: () => kp(e, t) }), n; } -function Np(e = null) { - if (fp) return; - let t = e || $e(); - !t || typeof t.registerExtension != "function" ? setTimeout(() => Np(e), 100) : (fp = !0, Ap(t), t.registerExtension({ - name: ap, +function Fp(e = null) { + if (mp) return; + let t = e || Ze(); + !t || typeof t.registerExtension != "function" ? setTimeout(() => Fp(e), 100) : (mp = !0, Mp(t), t.registerExtension({ + name: sp, async nodeCreated(e) { - Op(e, t); + Ap(e, t); }, getNodeMenuItems(e) { - return Mp(e, t); + return Pp(e, t); } }), setTimeout(() => { - for (let { graph: e } of mt(t)) for (let n of ft(e)) Op(n, t); + for (let { graph: e } of mt(t)) for (let n of ft(e)) Ap(n, t); }, 0)); } // ui/vue/composables/useDragDrop.ts -function Pp() { +function Ip() { let e = null; - kr(() => { + jr(() => { try { - e = is() ?? null; + e = os() ?? null; } catch (e) { console.warn("[Majoor] useDragDrop: init failed", e); } - }), tr(() => { + }), rr(() => { try { e?.({ force: !0 }); } catch (e) { console.debug?.(e); } try { - as({ force: !0 }); + ss({ force: !0 }); } catch (e) { console.debug?.(e); } @@ -11038,10 +11038,10 @@ function Pp() { }); } // ui/vue/GlobalRuntime.vue -var Fp = /* @__PURE__ */ lr({ +var Lp = /* @__PURE__ */ dr({ __name: "GlobalRuntime", setup(e) { - let t = cr(() => import("./chunks/ViewerPortal-uNjS7OxV.js")), n = Q(!1), r = [ + let t = ur(() => import("./chunks/ViewerPortal-BStxU0ID.js")), n = Q(!1), r = [ V.OPEN_VIEWER, V.MFV_OPEN, V.MFV_TOGGLE, @@ -11054,7 +11054,7 @@ var Fp = /* @__PURE__ */ lr({ if (n.value) return; n.value = !0; let t = String(e?.type || ""), r = e?.detail ?? null; - t && t !== V.OPEN_VIEWER && sr(() => { + t && t !== V.OPEN_VIEWER && lr(() => { try { window.dispatchEvent(new CustomEvent(t, { detail: r })); } catch (e) { @@ -11062,21 +11062,21 @@ var Fp = /* @__PURE__ */ lr({ } }); } - return Pp(), kr(() => { + return Ip(), jr(() => { for (let e of r) try { window.addEventListener(e, i, { once: !1 }); } catch (e) { console.debug?.(e); } - }), tr(() => { + }), rr(() => { for (let e of r) try { window.removeEventListener(e, i); } catch (e) { console.debug?.(e); } - }), (e, r) => n.value ? (q(), nr(Z(t), { key: 0 })) : G("", !0); + }), (e, r) => n.value ? (q(), ir(Z(t), { key: 0 })) : G("", !0); } -}), Ip = { +}), Rp = { gridRenderCount: 0, gridRenderTotalMs: 0, searchQueryCount: 0, @@ -11087,20 +11087,20 @@ var Fp = /* @__PURE__ */ lr({ thumbnailLoadCount: 0, thumbnailLoadFailures: 0, errorCounts: {} -}, Lp = /* @__PURE__ */ new Map(); -function Rp(e) { +}, zp = /* @__PURE__ */ new Map(); +function Bp(e) { let t = performance.now(); - Lp.set(e, t); + zp.set(e, t); try { performance.mark(`${e}-start`); } catch {} } -function zp(e, t) { - let n = Lp.get(e); +function Vp(e, t) { + let n = zp.get(e); if (!n) return console.warn(`[Majoor Metrics] Timer not found: ${e}`), 0; let r = performance.now() - n; - if (Lp.delete(e), t) { - let e = `${t}Count`, n = `${t}TotalMs`, i = Ip; + if (zp.delete(e), t) { + let e = `${t}Count`, n = `${t}TotalMs`, i = Rp; typeof i[e] == "number" && (i[e]++, i[n] += r); } r > 100 && console.log(`[Majoor Metrics] ${e}: ${r.toFixed(2)}ms`); @@ -11109,15 +11109,15 @@ function zp(e, t) { } catch {} return r; } -function Bp(e) { - return Lp.has(e); +function Hp(e) { + return zp.has(e); } -function Vp(e) { +function Up(e) { try { performance.mark(`${e}-start`); } catch {} } -function Hp(e) { +function Wp(e) { try { performance.mark(`${e}-end`), performance.measure(e, `${e}-start`, `${e}-end`); let t = performance.getEntriesByName(e)[0]?.duration || 0; @@ -11126,47 +11126,47 @@ function Hp(e) { return null; } } -function Up(e, t = !1) { - Ip.apiCallCount++, Ip.apiCallTotalMs += e, t && Ip.apiErrorCount++; -} -function Wp(e) { - Ip.gridRenderCount++, Ip.gridRenderTotalMs += e; -} -function Gp(e) { - Ip.searchQueryCount++, Ip.searchQueryTotalMs += e; +function Gp(e, t = !1) { + Rp.apiCallCount++, Rp.apiCallTotalMs += e, t && Rp.apiErrorCount++; } function Kp(e) { - Ip.thumbnailLoadCount++, e || Ip.thumbnailLoadFailures++; + Rp.gridRenderCount++, Rp.gridRenderTotalMs += e; } -function qp(e, t) { - Ip.errorCounts[e] = (Ip.errorCounts[e] || 0) + 1; +function qp(e) { + Rp.searchQueryCount++, Rp.searchQueryTotalMs += e; } -function Jp() { +function Jp(e) { + Rp.thumbnailLoadCount++, e || Rp.thumbnailLoadFailures++; +} +function Yp(e, t) { + Rp.errorCounts[e] = (Rp.errorCounts[e] || 0) + 1; +} +function Xp() { return { - ...Ip, + ...Rp, averages: { - gridRenderMs: Ip.gridRenderCount > 0 ? Ip.gridRenderTotalMs / Ip.gridRenderCount : 0, - searchQueryMs: Ip.searchQueryCount > 0 ? Ip.searchQueryTotalMs / Ip.searchQueryCount : 0, - apiCallMs: Ip.apiCallCount > 0 ? Ip.apiCallTotalMs / Ip.apiCallCount : 0 + gridRenderMs: Rp.gridRenderCount > 0 ? Rp.gridRenderTotalMs / Rp.gridRenderCount : 0, + searchQueryMs: Rp.searchQueryCount > 0 ? Rp.searchQueryTotalMs / Rp.searchQueryCount : 0, + apiCallMs: Rp.apiCallCount > 0 ? Rp.apiCallTotalMs / Rp.apiCallCount : 0 }, rates: { - apiErrorRate: Ip.apiCallCount > 0 ? (Ip.apiErrorCount / Ip.apiCallCount * 100).toFixed(2) + "%" : "0%", - thumbnailFailureRate: Ip.thumbnailLoadCount > 0 ? (Ip.thumbnailLoadFailures / Ip.thumbnailLoadCount * 100).toFixed(2) + "%" : "0%" + apiErrorRate: Rp.apiCallCount > 0 ? (Rp.apiErrorCount / Rp.apiCallCount * 100).toFixed(2) + "%" : "0%", + thumbnailFailureRate: Rp.thumbnailLoadCount > 0 ? (Rp.thumbnailLoadFailures / Rp.thumbnailLoadCount * 100).toFixed(2) + "%" : "0%" } }; } -function Yp(e) { - let t = `${e}Count`, n = `${e}TotalMs`, r = Ip, i = r[t], a = r[n]; +function Zp(e) { + let t = `${e}Count`, n = `${e}TotalMs`, r = Rp, i = r[t], a = r[n]; return i > 0 ? a / i : 0; } -function Xp() { - let e = Ip; +function Qp() { + let e = Rp; Object.keys(e).forEach((t) => { typeof e[t] == "number" ? e[t] = 0 : typeof e[t] == "object" && (e[t] = {}); - }), Lp.clear(), console.log("[Majoor Metrics] Metrics reset"); + }), zp.clear(), console.log("[Majoor Metrics] Metrics reset"); } -function Zp() { - let e = Jp(); +function $p() { + let e = Xp(); console.group("[Majoor Assets Manager] Performance Metrics"), console.table({ "Grid Renders": e.gridRenderCount, "Avg Grid Render": `${e.averages.gridRenderMs.toFixed(2)}ms`, @@ -11179,26 +11179,26 @@ function Zp() { "Thumbnail Loads": e.thumbnailLoadCount, "Thumbnail Failures": e.thumbnailLoadFailures, "Failure Rate": e.rates.thumbnailFailureRate - }), Object.keys(Ip.errorCounts).length > 0 && console.log("Error Counts:", Ip.errorCounts), console.groupEnd(); + }), Object.keys(Rp.errorCounts).length > 0 && console.log("Error Counts:", Rp.errorCounts), console.groupEnd(); } typeof window < "u" && (window.MajoorMetrics = { - startTimer: Rp, - endTimer: zp, - hasTimer: Bp, - mark: Vp, - measure: Hp, - trackApiCall: Up, - trackGridRender: Wp, - trackSearchQuery: Gp, - trackThumbnailLoad: Kp, - trackError: qp, - getMetricsReport: Jp, - getAverageDuration: Yp, - resetMetrics: Xp, - exportMetrics: Zp + startTimer: Bp, + endTimer: Vp, + hasTimer: Hp, + mark: Up, + measure: Wp, + trackApiCall: Gp, + trackGridRender: Kp, + trackSearchQuery: qp, + trackThumbnailLoad: Jp, + trackError: Yp, + getMetricsReport: Xp, + getAverageDuration: Zp, + resetMetrics: Qp, + exportMetrics: $p }); // ui/features/status/StatusDot.ts -var Qp = [{ +var em = [{ key: "exiftool", labelKey: "tool.exiftool", hintKey: "tool.exiftool.hint" @@ -11206,24 +11206,24 @@ var Qp = [{ key: "ffprobe", labelKey: "tool.ffprobe", hintKey: "tool.ffprobe.hint" -}], $p = !1, em = null, tm = null, nm = "__MJR_STATUS_DOT_CACHE__", rm = { +}], tm = !1, nm = null, rm = null, im = "__MJR_STATUS_DOT_CACHE__", am = { ACTIVE: "active", COOLDOWN: "cooldown", IDLE: "idle" -}, im = { - [rm.ACTIVE]: 2e3, - [rm.COOLDOWN]: 1e4, - [rm.IDLE]: 6e4 +}, om = { + [am.ACTIVE]: 2e3, + [am.COOLDOWN]: 1e4, + [am.IDLE]: 6e4 }; -function am(e) { - $p = !!e; +function sm(e) { + tm = !!e; try { - globalThis._mjrMaintenanceActive = $p; + globalThis._mjrMaintenanceActive = tm; } catch (e) { console.debug?.(e); } } -function om(e) { +function cm(e) { let t = Number(e); if (!Number.isFinite(t) || t <= 0) return "0 B"; let n = [ @@ -11237,7 +11237,7 @@ function om(e) { let a = r >= 100 ? 0 : r >= 10 ? 1 : 2; return `${r.toFixed(a)} ${n[i]}`; } -function sm(e, t, n = null) { +function lm(e, t, n = null) { if (e && (e.replaceChildren(), (Array.isArray(t) ? t.filter((e) => e != null && String(e).trim() !== "") : []).forEach((t, n) => { n > 0 && e.appendChild(document.createElement("br")), e.appendChild(document.createTextNode(String(t))); }), n != null && String(n).trim() !== "")) { @@ -11246,7 +11246,7 @@ function sm(e, t, n = null) { t.style.fontSize = "11px", t.style.opacity = "0.6", t.textContent = String(n), e.appendChild(t); } } -function cm(e, t = []) { +function um(e, t = []) { if (!e) return; let n = Array.isArray(t) ? t.filter((e) => e && String(e.label || "").trim()) : []; if (!n.length) return; @@ -11266,7 +11266,7 @@ function cm(e, t = []) { } e.appendChild(r); } -function lm(e, { totalAssets: t = 0, withWorkflows: n = 0, withGenerationData: r = 0 } = {}) { +function dm(e, { totalAssets: t = 0, withWorkflows: n = 0, withGenerationData: r = 0 } = {}) { let i = Math.max(0, Number(t || e?.total_assets || 0) || 0); if (i <= 0) return []; let a = (e, t = i) => { @@ -11312,13 +11312,13 @@ function lm(e, { totalAssets: t = 0, withWorkflows: n = 0, withGenerationData: r } : null ].filter(Boolean); } -function um(e, t, n) { +function fm(e, t, n) { if (!e) return; e.replaceChildren(), e.appendChild(document.createTextNode(String(t || ""))), e.appendChild(document.createElement("br")); let r = document.createElement("span"); r.style.fontSize = "11px", r.style.opacity = "0.7", r.textContent = String(n || ""), e.appendChild(r); } -function dm(t, n = "neutral", r = {}) { +function pm(t, n = "neutral", r = {}) { if (!t) return; let i = r?.toast !== !1, a = { neutral: { @@ -11384,23 +11384,23 @@ function dm(t, n = "neutral", r = {}) { } } } -function fm(e) { +function mm(e) { let t = String(e || "").toLowerCase(); return t === "all" ? R("scope.allFull", "All (Inputs + Outputs)") : t === "input" || t === "inputs" ? R("scope.input", "Inputs") : t === "custom" ? R("scope.custom", "Browser") : t === "workflow" ? R("scope.workflow", "Workflow") : R("scope.output", "Outputs"); } -function pm(e, t = "") { - if (!e || typeof e != "object") return t ? R("status.watcher.disabledScoped", "Watcher: disabled ({scope})", { scope: fm(t) }) : R("status.watcher.disabled", "Watcher: disabled"); +function hm(e, t = "") { + if (!e || typeof e != "object") return t ? R("status.watcher.disabledScoped", "Watcher: disabled ({scope})", { scope: mm(t) }) : R("status.watcher.disabled", "Watcher: disabled"); let n = !!e.enabled, r = e.scope ? String(e.scope) : ""; - return n ? r ? R("status.watcher.enabledScoped", `Watcher: enabled (${r})`, { scope: fm(r) }) : R("status.watcher.enabled", "Watcher: enabled") : r || t ? R("status.watcher.disabledScoped", "Watcher: disabled ({scope})", { scope: fm(t && r && r !== t ? t : r || t) }) : R("status.watcher.disabled", "Watcher: disabled"); + return n ? r ? R("status.watcher.enabledScoped", `Watcher: enabled (${r})`, { scope: mm(r) }) : R("status.watcher.enabled", "Watcher: enabled") : r || t ? R("status.watcher.disabledScoped", "Watcher: disabled ({scope})", { scope: mm(t && r && r !== t ? t : r || t) }) : R("status.watcher.disabled", "Watcher: disabled"); } -function mm(e = "status-action") { +function gm(e = "status-action") { try { window?.dispatchEvent?.(new CustomEvent("mjr:reload-grid", { detail: { reason: String(e || "status-action") } })); } catch (e) { console.debug?.(e); } } -function hm(e = "status-action", t = {}) { +function _m(e = "status-action", t = {}) { try { window?.dispatchEvent?.(new CustomEvent("mjr-grid-dirty", { detail: { reason: String(e || "status-action"), @@ -11410,21 +11410,21 @@ function hm(e = "status-action", t = {}) { console.debug?.(e); } } -function gm(e = "") { +function vm(e = "") { try { window?.dispatchEvent?.(new CustomEvent(V.OPEN_MESSAGE_HISTORY, { detail: { reason: String(e || "status-action") } })); } catch (e) { console.debug?.(e); } } -async function _m(e = "") { +async function ym(e = "") { return await Ut(R("dialog.vectorsReset.keepQuestion", "Keep existing AI vectors?\n\nConfirm = keep vectors\nCancel = continue without vectors"), e || R("dialog.vectorsReset.title", "AI vectors")); } -function vm(t = {}) { +function bm(t = {}) { let n = typeof t?.getScanContext == "function" ? t.getScanContext : null; - am(!1); + sm(!1); let r = document.createElement("div"); - r.style.cssText = "margin-bottom: 20px; padding: 12px; background: var(--bg-color, #1a1a1a); border-radius: 6px; border: 1px solid var(--border-color, #333); cursor: pointer; transition: all 0.2s;", dm(r, "info", { toast: !1 }); + r.style.cssText = "margin-bottom: 20px; padding: 12px; background: var(--bg-color, #1a1a1a); border-radius: 6px; border: 1px solid var(--border-color, #333); cursor: pointer; transition: all 0.2s;", pm(r, "info", { toast: !1 }); let i = document.createElement("div"); i.style.cssText = "display: flex; align-items: center; gap: 10px; margin-bottom: 8px;"; let a = document.createElement("span"); @@ -11470,7 +11470,7 @@ function vm(t = {}) { for (let t of n) { let n = String(t?.name || ""); if (!n) continue; - let i = Number(t?.mtime || 0), a = Number(t?.size_bytes || 0), o = i > 0 ? (/* @__PURE__ */ new Date(i * 1e3)).toLocaleString() : "", s = `${n}${o ? ` (${o}` : ""}${a > 0 ? `, ${om(a)}` : ""}${o ? ")" : ""}`, c = document.createElement("option"); + let i = Number(t?.mtime || 0), a = Number(t?.size_bytes || 0), o = i > 0 ? (/* @__PURE__ */ new Date(i * 1e3)).toLocaleString() : "", s = `${n}${o ? ` (${o}` : ""}${a > 0 ? `, ${cm(a)}` : ""}${o ? ")" : ""}`, c = document.createElement("option"); c.value = n, c.textContent = s, e && e === n && (c.selected = !0, r = !0), h.appendChild(c); } g = h.childNodes.length > 0, h.disabled = !g, g && !r && h.childNodes[0] && (h.value = String(h.childNodes[0]?.value || "")), _ && (_.disabled = !g); @@ -11481,16 +11481,16 @@ function vm(t = {}) { y(), m.appendChild(h); let b = document.createElement("button"); b.type = "button", b.textContent = R("btn.dbSave", "Save DB"), b.title = R("status.dbSaveHint", "Save a DB snapshot into archive folder"), b.style.cssText = "\n padding: 5px 10px;\n font-size: 11px;\n border-radius: 6px;\n border: 1px solid rgba(120,200,255,0.35);\n background: transparent;\n color: inherit;\n cursor: pointer;\n ", b.onclick = async (t) => { - t.stopPropagation(), am(!0); + t.stopPropagation(), sm(!0); let i = b.textContent, o = !!_?.disabled; - b.disabled = !0, _ && (_.disabled = !0), b.textContent = R("btn.saving", "Saving..."), a.style.background = "var(--mjr-status-info, #64B5F6)", dm(r, "info"); + b.disabled = !0, _ && (_.disabled = !0), b.textContent = R("btn.saving", "Saving..."), a.style.background = "var(--mjr-status-info, #64B5F6)", pm(r, "info"); try { let t = await Te(); if (t?.ok) { let n = String(t?.data?.name || "").trim(), r = Number(t?.data?.size_bytes || 0); e(R("toast.dbSaveSuccess", "Database backup saved"), "success", 2200, { history: { title: R("btn.dbSave", "Save DB"), - detail: n ? `${n}${r > 0 ? ` | ${om(r)}` : ""}` : R("toast.dbSaveSuccess", "Database backup saved"), + detail: n ? `${n}${r > 0 ? ` | ${cm(r)}` : ""}` : R("toast.dbSaveSuccess", "Database backup saved"), operation: "save_db", source: n || "archive", forceStore: !0 @@ -11499,10 +11499,10 @@ function vm(t = {}) { } catch (t) { e(t?.message || R("toast.dbSaveFailed", "Failed to save DB backup"), "error"); } finally { - am(!1), b.disabled = !1, _ && (_.disabled = o || !g), b.textContent = i; + sm(!1), b.disabled = !1, _ && (_.disabled = o || !g), b.textContent = i; try { let e = n ? n() : null; - await Dm(a, d, f, e, null, { force: !0 }); + await km(a, d, f, e, null, { force: !0 }); } catch (e) { console.debug?.(e); } @@ -11523,9 +11523,9 @@ function vm(t = {}) { source: i, status: "started", forceStore: !0 - } }), am(!0); + } }), sm(!0); let o = _.textContent, s = !!b.disabled; - _.disabled = !0, b.disabled = !0, h.disabled = !0, _.textContent = R("btn.restoring", "Restoring..."), a.style.background = "var(--mjr-status-warning, #FFA726)", dm(r, "warning"); + _.disabled = !0, b.disabled = !0, h.disabled = !0, _.textContent = R("btn.restoring", "Restoring..."), a.style.background = "var(--mjr-status-warning, #FFA726)", pm(r, "warning"); try { let t = await M({ name: i, @@ -11535,10 +11535,10 @@ function vm(t = {}) { } catch (t) { e(t?.message || R("toast.dbRestoreFailed", "Failed to restore DB backup"), "error"); } finally { - am(!1), _.disabled = !g, b.disabled = s, h.disabled = !g, _.textContent = o, mm("db-restore"); + sm(!1), _.disabled = !g, b.disabled = s, h.disabled = !g, _.textContent = o, gm("db-restore"); try { let e = n ? n() : null; - await Dm(a, d, f, e, null, { force: !0 }); + await km(a, d, f, e, null, { force: !0 }); } catch (e) { console.debug?.(e); } @@ -11558,11 +11558,11 @@ function vm(t = {}) { D.style.borderColor = "rgba(255,255,255,0.25)", D.style.background = "transparent"; }, D.onclick = async (e) => { e.stopPropagation(); - let t = await _m(R("btn.resetIndex", "Reset index")); + let t = await ym(R("btn.resetIndex", "Reset index")); if (!await Ut(t ? R("dialog.resetIndex.confirmKeepVectors", "This will reset index data and rescan files while keeping existing AI vectors.\n\nContinue?") : R("dialog.resetIndex.msg", "This will delete the database and rescan all files. Continue?"), R("dialog.resetIndex.title", "Reset index?"))) return; - gm("reset-index"), am(!0); + vm("reset-index"), sm(!0); let i = D.textContent; - D.disabled = !0, E.disabled = !0, D.textContent = R("btn.resetting"), a.style.background = "var(--mjr-status-info, #64B5F6)", dm(r, "info"); + D.disabled = !0, E.disabled = !0, D.textContent = R("btn.resetting"), a.style.background = "var(--mjr-status-info, #64B5F6)", pm(r, "info"); try { let e = n ? n() : {}, i = String(e?.scope || "output").toLowerCase(), o = e?.customRootId || e?.custom_root_id || e?.root_id || null, s = i === "custom" && !o; (await De({ @@ -11577,14 +11577,14 @@ function vm(t = {}) { clear_assets: !t, preserve_vectors: t, rebuild_fts: !0 - }))?.ok ? (a.style.background = "var(--mjr-status-success, #4CAF50)", dm(r, "success")) : (a.style.background = "var(--mjr-status-error, #f44336)", dm(r, "error")); + }))?.ok ? (a.style.background = "var(--mjr-status-success, #4CAF50)", pm(r, "success")) : (a.style.background = "var(--mjr-status-error, #f44336)", pm(r, "error")); } catch { - a.style.background = "var(--mjr-status-error, #f44336)", dm(r, "error"); + a.style.background = "var(--mjr-status-error, #f44336)", pm(r, "error"); } finally { - am(!1), D.disabled = !1, E.disabled = !1, D.textContent = i, mm("index-reset"); + sm(!1), D.disabled = !1, E.disabled = !1, D.textContent = i, gm("index-reset"); try { let e = n ? n() : null; - await Dm(a, d, f, e, null, { force: !0 }); + await km(a, d, f, e, null, { force: !0 }); } catch (e) { console.debug?.(e); } @@ -11602,8 +11602,8 @@ function vm(t = {}) { e(R("status.customBrowserScanDisabledHint", "Use Outputs, Inputs, or All to run indexing scans"), "warning", 2600), T("Backfill skipped - Browser scope has no selected custom root.", "warning"); return; } - let c = o || "output", l = fm(c); - gm("vector-backfill"); + let c = o || "output", l = mm(c); + vm("vector-backfill"); let u = { history: { trackId: `vector-backfill:status:${c}:${s || "default"}`, title: "Vector Backfill", @@ -11611,7 +11611,7 @@ function vm(t = {}) { operation: "vector_backfill", forceStore: !0 } }; - am(!0); + sm(!0); let p = O.textContent, m = D.textContent; O.disabled = !0, D.disabled = !0, E.disabled = !0, O.textContent = "Backfilling...", T(`Backfill started (${l})...`, "info"), ee({ summary: "Vector Backfill", @@ -11620,7 +11620,7 @@ function vm(t = {}) { ...u.history, status: "started", detail: `Started (${l})` - } }), a.style.background = "var(--mjr-status-info, #64B5F6)", dm(r, "info"); + } }), a.style.background = "var(--mjr-status-info, #64B5F6)", pm(r, "info"); try { let t = { scope: c, @@ -11687,7 +11687,7 @@ function vm(t = {}) { errors: d, label: "running" } - } }), T(`Backfill running in background - candidates ${s}, indexed ${c}, skipped ${l}, errors ${d}`, "info"), a.style.background = "var(--mjr-status-info, #64B5F6)", dm(r, "info"); + } }), T(`Backfill running in background - candidates ${s}, indexed ${c}, skipped ${l}, errors ${d}`, "info"), a.style.background = "var(--mjr-status-info, #64B5F6)", pm(r, "info"); } else e(R("toast.vectorBackfillComplete", "Vector backfill complete! Processed: {processed}, Indexed: {indexed}, Skipped: {skipped}", { processed: s, indexed: c, @@ -11705,7 +11705,7 @@ function vm(t = {}) { errors: d, label: "done" } - } }), T(`Backfill OK - processed ${s}, indexed ${c}, skipped ${l}`, "success"), a.style.background = "var(--mjr-status-success, #4CAF50)", dm(r, "success"); + } }), T(`Backfill OK - processed ${s}, indexed ${c}, skipped ${l}`, "success"), a.style.background = "var(--mjr-status-success, #4CAF50)", pm(r, "success"); } else { let t = String(n?.error || R("toast.vectorBackfillFailedGeneric", "Backfill failed")), i = String(n?.code || "").trim(), o = Number(n?.status || 0) || 0, s = [ i ? `code=${i}` : "", @@ -11720,7 +11720,7 @@ function vm(t = {}) { label: "failed", errors: 1 } - } }), T(`Backfill ? - ${s}\nSee console for full payload.`, "error"), console.error("[Majoor] Vector backfill failed response", n), a.style.background = "var(--mjr-status-error, #f44336)", dm(r, "error"); + } }), T(`Backfill ? - ${s}\nSee console for full payload.`, "error"), console.error("[Majoor] Vector backfill failed response", n), a.style.background = "var(--mjr-status-error, #f44336)", pm(r, "error"); } } catch (t) { let n = String(t?.message || t || "Backfill failed"); @@ -11732,12 +11732,12 @@ function vm(t = {}) { label: "failed", errors: 1 } - } }), T(`Backfill EXCEPTION - ${n}\nSee console for stack trace.`, "error"), console.error("[Majoor] Vector backfill exception", t), a.style.background = "var(--mjr-status-error, #f44336)", dm(r, "error"); + } }), T(`Backfill EXCEPTION - ${n}\nSee console for stack trace.`, "error"), console.error("[Majoor] Vector backfill exception", t), a.style.background = "var(--mjr-status-error, #f44336)", pm(r, "error"); } finally { - am(!1), O.disabled = !1, D.disabled = !1, E.disabled = !1, O.textContent = p, D.textContent = m, mm("vector-backfill"); + sm(!1), O.disabled = !1, D.disabled = !1, E.disabled = !1, O.textContent = p, D.textContent = m, gm("vector-backfill"); try { let e = n ? n() : null; - await Dm(a, d, f, e, null, { force: !0 }); + await km(a, d, f, e, null, { force: !0 }); } catch (e) { console.debug?.(e); } @@ -11749,24 +11749,24 @@ function vm(t = {}) { }, E.onclick = async (t) => { t.stopPropagation(); let i = E.textContent; - E.disabled = !0, O.disabled = !0, D.disabled = !0, E.textContent = R("btn.memoryPurging", "Purging..."), T(R("status.memoryPurgeStarted", "Memory purge started..."), "info"), a.style.background = "var(--mjr-status-info, #64B5F6)", dm(r, "info"); + E.disabled = !0, O.disabled = !0, D.disabled = !0, E.textContent = R("btn.memoryPurging", "Purging..."), T(R("status.memoryPurgeStarted", "Memory purge started..."), "info"), a.style.background = "var(--mjr-status-info, #64B5F6)", pm(r, "info"); try { let t = await C(); if (t?.ok) { let n = t?.data?.comfy_models ? R("toast.memoryPurgeComplete", "Memory purge complete. Majoor AI and ComfyUI model caches were released.") : R("toast.memoryPurgeCompleteMajoorOnly", "Memory purge complete. Majoor AI caches were released."); - e(n, "success", 3200), T(n, "success"), a.style.background = "var(--mjr-status-success, #4CAF50)", dm(r, "success"); + e(n, "success", 3200), T(n, "success"), a.style.background = "var(--mjr-status-success, #4CAF50)", pm(r, "success"); } else { let n = String(t?.error || "Memory purge failed"); - e(n, "error", 4500), T(n, "error"), a.style.background = "var(--mjr-status-error, #f44336)", dm(r, "error"); + e(n, "error", 4500), T(n, "error"), a.style.background = "var(--mjr-status-error, #f44336)", pm(r, "error"); } } catch (t) { let n = String(t?.message || t || "Memory purge failed"); - e(n, "error", 4500), T(n, "error"), a.style.background = "var(--mjr-status-error, #f44336)", dm(r, "error"); + e(n, "error", 4500), T(n, "error"), a.style.background = "var(--mjr-status-error, #f44336)", pm(r, "error"); } finally { E.disabled = !1, O.disabled = !1, D.disabled = !1, E.textContent = i; try { let e = n ? n() : null; - await Dm(a, d, f, e, null, { force: !0 }); + await km(a, d, f, e, null, { force: !0 }); } catch (e) { console.debug?.(e); } @@ -11779,11 +11779,11 @@ function vm(t = {}) { k.style.borderColor = "rgba(255,80,80,0.4)", k.style.background = "transparent"; }, k.onclick = async (e) => { e.stopPropagation(); - let t = await _m(R("btn.deleteDb", "Delete DB")); + let t = await ym(R("btn.deleteDb", "Delete DB")); if (!await Ut(t ? R("dialog.dbDelete.keepVectorsConfirm", "This will reset index data and keep existing AI vectors. Database files will not be force-deleted.\n\nContinue?") : R("dialog.dbDelete.confirm", "This will permanently delete the index database and rebuild it from scratch. All ratings, tags, and cached metadata will be lost.\n\nContinue?"), R("btn.deleteDb", "Delete DB"))) return; - am(!0); + sm(!0); let i = k.textContent; - k.disabled = !0, k.textContent = t ? R("btn.resetting", "Resetting...") : R("btn.deletingDb"), D.disabled = !0, E.disabled = !0, a.style.background = "var(--mjr-status-info, #64B5F6)", dm(r, "info"); + k.disabled = !0, k.textContent = t ? R("btn.resetting", "Resetting...") : R("btn.deletingDb"), D.disabled = !0, E.disabled = !0, a.style.background = "var(--mjr-status-info, #64B5F6)", pm(r, "info"); try { (t ? await De({ scope: "all", @@ -11796,14 +11796,14 @@ function vm(t = {}) { clear_assets: !1, preserve_vectors: !0, rebuild_fts: !0 - }) : await c())?.ok ? (globalThis._mjrCorruptToastShown = !1, a.style.background = "var(--mjr-status-success, #4CAF50)", dm(r, "success")) : (a.style.background = "var(--mjr-status-error, #f44336)", dm(r, "error")); + }) : await c())?.ok ? (globalThis._mjrCorruptToastShown = !1, a.style.background = "var(--mjr-status-success, #4CAF50)", pm(r, "success")) : (a.style.background = "var(--mjr-status-error, #f44336)", pm(r, "error")); } catch { - a.style.background = "var(--mjr-status-error, #f44336)", dm(r, "error"); + a.style.background = "var(--mjr-status-error, #f44336)", pm(r, "error"); } finally { - am(!1), k.disabled = !1, k.textContent = i, D.disabled = !1, E.disabled = !1, mm(t ? "index-reset-preserve-vectors" : "db-force-delete"); + sm(!1), k.disabled = !1, k.textContent = i, D.disabled = !1, E.disabled = !1, gm(t ? "index-reset-preserve-vectors" : "db-force-delete"); try { let e = n ? n() : null; - await Dm(a, d, f, e, null, { force: !0 }); + await km(a, d, f, e, null, { force: !0 }); } catch (e) { console.debug?.(e); } @@ -11815,34 +11815,34 @@ function vm(t = {}) { let t = r.querySelector("#mjr-status-body"); if (!t) return; let n = t.style.display === "none"; - wm(r, !n); - }), wm(r, !0), r.onmouseenter = () => { + Em(r, !n); + }), Em(r, !0), r.onmouseenter = () => { r.style.transform = "translateY(-1px)"; }, r.onmouseleave = () => { - r.style.transform = "", dm(r, r.dataset?.mjrStatusTone || "neutral", { toast: !1 }); + r.style.transform = "", pm(r, r.dataset?.mjrStatusTone || "neutral", { toast: !1 }); }; let j = async (e) => { try { let t = e?.detail || {}, i = String(t?.step || ""); if (!i) return; let o = i === "started" || i === "stopping_workers" || i === "resetting_db" || i === "delete_db" || i === "recreate_db" || i === "replacing_files" || i === "restarting_scan"; - if (o ? am(!0) : (i === "failed" || i === "done") && am(!1), !r?.isConnected || !a?.isConnected || !d?.isConnected) return; + if (o ? sm(!0) : (i === "failed" || i === "done") && sm(!1), !r?.isConnected || !a?.isConnected || !d?.isConnected) return; if (o) { - a.style.background = "var(--mjr-status-info, #64B5F6)", dm(r, "info", { toast: !1 }), um(d, R("status.pending", "Pending..."), R("status.dbRestoreInProgress", "Database restore in progress")); + a.style.background = "var(--mjr-status-info, #64B5F6)", pm(r, "info", { toast: !1 }), fm(d, R("status.pending", "Pending..."), R("status.dbRestoreInProgress", "Database restore in progress")); return; } if (i === "failed") { - a.style.background = "var(--mjr-status-error, #f44336)", dm(r, "error", { toast: !1 }), sm(d, [R("status.error", "Error"), String(t?.message || R("toast.dbRestoreFailed", "Failed to restore DB backup"))]); + a.style.background = "var(--mjr-status-error, #f44336)", pm(r, "error", { toast: !1 }), lm(d, [R("status.error", "Error"), String(t?.message || R("toast.dbRestoreFailed", "Failed to restore DB backup"))]); return; } if (i === "done") { - a.style.background = "var(--mjr-status-success, #4CAF50)", dm(r, "success", { toast: !1 }); + a.style.background = "var(--mjr-status-success, #4CAF50)", pm(r, "success", { toast: !1 }); let e = String(t?.operation || ""), i = e === "delete_db" ? R("toast.dbDeleteSuccess", "Database deleted and rebuilt. Files are being reindexed.") : e === "reset_index" ? R("toast.resetStarted", "Index reset started. Files will be reindexed in the background.") : R("toast.dbRestoreSuccess", "Database backup restored"); - um(d, R("status.ready", "Ready"), i); + fm(d, R("status.ready", "Ready"), i); try { let e = n ? n() : null; setTimeout(() => { - Dm(a, d, f, e, null, { force: !0 }); + km(a, d, f, e, null, { force: !0 }); }, 600); } catch (e) { console.debug?.(e); @@ -11853,8 +11853,8 @@ function vm(t = {}) { } }; try { - let e = em; - typeof e == "function" && window.removeEventListener("mjr-db-restore-status", e), em = j, r._mjrDbRestoreStatusHandler = j, window.addEventListener("mjr-db-restore-status", j); + let e = nm; + typeof e == "function" && window.removeEventListener("mjr-db-restore-status", e), nm = j, r._mjrDbRestoreStatusHandler = j, window.addEventListener("mjr-db-restore-status", j); } catch (e) { console.debug?.(e); } @@ -11871,27 +11871,27 @@ function vm(t = {}) { ].filter(Boolean); if (!s.length) return; let c = d?.querySelector?.("span"); - c ? c.textContent = s.join(" | ") : um(d, R("status.ready", "Ready"), s.join(" | ")); + c ? c.textContent = s.join(" | ") : fm(d, R("status.ready", "Ready"), s.join(" | ")); } catch (e) { console.debug?.(e); } }; try { - let e = tm; - typeof e == "function" && window.removeEventListener(V.RUNTIME_STATUS, e), tm = N, window.addEventListener(V.RUNTIME_STATUS, N); + let e = rm; + typeof e == "function" && window.removeEventListener(V.RUNTIME_STATUS, e), rm = N, window.addEventListener(V.RUNTIME_STATUS, N); } catch (e) { console.debug?.(e); } return r; } -async function ym(t, n, r = null, i = null) { - if ($p) { +async function xm(t, n, r = null, i = null) { + if (tm) { e(R("status.maintenanceBusy", "Database maintenance in progress. Please wait."), "warning", 2200); return; } let a = n?.closest?.("#mjr-status-body")?.parentElement || n?.closest?.("div"), o = String(i?.scope || "output").toLowerCase(), s = i?.customRootId || i?.custom_root_id || i?.root_id || null; if (o === "custom" && !s) { - t.style.background = "var(--mjr-status-info, #64B5F6)", dm(a, "info"), um(n, R("status.customBrowserScanDisabled", "Custom browser mode: scan is disabled"), R("status.customBrowserScanDisabledHint", "Use Outputs, Inputs, or All to run indexing scans")); + t.style.background = "var(--mjr-status-info, #64B5F6)", pm(a, "info"), fm(n, R("status.customBrowserScanDisabled", "Custom browser mode: scan is disabled"), R("status.customBrowserScanDisabledHint", "Use Outputs, Inputs, or All to run indexing scans")); return; } try { @@ -11899,7 +11899,7 @@ async function ym(t, n, r = null, i = null) { if (t && typeof t == "object") { let r = e - Number(t.at || 0); if (r >= 0 && r < 6e5) { - um(n, R("status.scanInProgress", "Scan already running..."), R("status.scanInProgressHint", "Please wait for the current scan to finish")); + fm(n, R("status.scanInProgress", "Scan already running..."), R("status.scanInProgressHint", "Please wait for the current scan to finish")); return; } } @@ -11919,15 +11919,15 @@ async function ym(t, n, r = null, i = null) { } }, l = null; try { - let e = await re(st.ROOTS); + let e = await re(it.ROOTS); e.ok && (l = e.data); } catch (e) { console.debug?.(e); } if (!l) { - let e = await re(st.CONFIG); + let e = await re(it.CONFIG); if (!e.ok) { - t.style.background = "var(--mjr-status-error, #f44336)", dm(a, "error"), n.textContent = R("status.errorGetConfig"), c(); + t.style.background = "var(--mjr-status-error, #f44336)", pm(a, "error"), n.textContent = R("status.errorGetConfig"), c(); return; } l = { output_directory: e.data.output_directory }; @@ -11938,7 +11938,7 @@ async function ym(t, n, r = null, i = null) { let e = Array.isArray(l?.custom_roots) ? l.custom_roots : [], t = s ? e.find((e) => e?.id === s) : null; d = t?.path ? ` (${t.path})` : ""; } else o === "output" && (d = l?.output_directory ? ` (${l.output_directory})` : ""); - t.style.background = "var(--mjr-status-info, #64B5F6)", dm(a, "info"), um(n, R("status.scanningScope", `Scanning ${u}${d}...`, { + t.style.background = "var(--mjr-status-info, #64B5F6)", pm(a, "info"), fm(n, R("status.scanningScope", `Scanning ${u}${d}...`, { scope: u, detail: d }), R("status.scanningHint", "This may take a while")); @@ -11946,91 +11946,91 @@ async function ym(t, n, r = null, i = null) { scope: o, recursive: !0, incremental: !0, - fast: !!(Jt()?.scan?.fastMode ?? !0), + fast: !!(Vn()?.scan?.fastMode ?? !0), background_metadata: !0 }; if (o === "custom") { if (!s) { - t.style.background = "var(--mjr-status-error, #f44336)", dm(a, "error"), n.textContent = R("status.selectCustomFolder"), c(); + t.style.background = "var(--mjr-status-error, #f44336)", pm(a, "error"), n.textContent = R("status.selectCustomFolder"), c(); return; } f.custom_root_id = s; } let p; try { - p = await L(st.SCAN, f); + p = await L(it.SCAN, f); } finally { c(); } if (p?.ok) { let e = p.data; - t.style.background = "var(--mjr-status-success, #4CAF50)", dm(a, "success"), um(n, R("toast.scanComplete"), R("status.scanStats", `Added: ${e.added || 0} - Updated: ${e.updated || 0} - Skipped: ${e.skipped || 0}`, { + t.style.background = "var(--mjr-status-success, #4CAF50)", pm(a, "success"), fm(n, R("toast.scanComplete"), R("status.scanStats", `Added: ${e.added || 0} - Updated: ${e.updated || 0} - Skipped: ${e.skipped || 0}`, { added: e.added || 0, updated: e.updated || 0, skipped: e.skipped || 0 - })), hm("scan-complete", { stats: { + })), _m("scan-complete", { stats: { added: e.added || 0, updated: e.updated || 0, skipped: e.skipped || 0 } }), setTimeout(() => { - Dm(t, n, r); + km(t, n, r); }, 2e3); - } else t.style.background = "var(--mjr-status-error, #f44336)", dm(a, "error"), sm(n, [R("toast.scanFailed") + `: ${p?.error || "Unknown error"}`]), setTimeout(() => { - Dm(t, n, r); + } else t.style.background = "var(--mjr-status-error, #f44336)", pm(a, "error"), lm(n, [R("toast.scanFailed") + `: ${p?.error || "Unknown error"}`]), setTimeout(() => { + km(t, n, r); }, 3e3); } -function bm(e, t, n) { +function Sm(e, t, n) { let r = document.createElement("span"); return r.style.cssText = "\n display: inline-flex;\n align-items: center;\n gap: 4px;\n padding: 2px 6px;\n border-radius: 999px;\n background: rgba(255, 255, 255, 0.05);\n border: 1px solid rgba(255, 255, 255, 0.1);\n ", r.textContent = `${t ? "OK" : "ERR"} ${e}`, r.title = t ? R("status.toolAvailable", `${e} available`, { tool: e }) : n || R("status.toolUnavailable", `${e} unavailable`, { tool: e }), r.style.opacity = t ? "1" : "0.75", r; } -function xm(e, t = {}, n = {}) { +function Cm(e, t = {}, n = {}) { if (!e) return; if (e.replaceChildren(), !t || Object.keys(t).length === 0) { e.textContent = R("status.discoveringTools"); return; } let r = document.createElement("div"); - r.style.display = "flex", r.style.flexWrap = "wrap", r.style.gap = "10px", r.style.alignItems = "flex-start", Qp.forEach(({ key: e, labelKey: i, hintKey: a }) => { + r.style.display = "flex", r.style.flexWrap = "wrap", r.style.gap = "10px", r.style.alignItems = "flex-start", em.forEach(({ key: e, labelKey: i, hintKey: a }) => { let o = !!t[e], s = n[e], c = R(i, e), l = R(a, ""); - r.appendChild(Cm({ + r.appendChild(Tm({ label: c, hint: l }, o, s)); }), e.appendChild(r); } -function Sm(e, t = null, n = {}) { +function wm(e, t = null, n = {}) { if (!e) return; let r = e.parentElement; if (!r) return; let i = r.querySelector("#mjr-tools-status"); if (!i) return; let a = n && Object.keys(n).length > 0; - i.textContent = !t && !a ? R("status.toolStatusChecking", "Tool status: checking...") : Qp.map(({ key: e, labelKey: r }) => { + i.textContent = !t && !a ? R("status.toolStatusChecking", "Tool status: checking...") : em.map(({ key: e, labelKey: r }) => { let i = R(r, e), a = t && e in t ? t[e] : void 0, o = e in n ? n[e] : void 0, s = a === void 0 ? o : a, c = s == null ? R("status.unknown", "unknown") : s ? R("status.available", "available") : R("status.missing", "missing"), l = t?.versions?.[e]; return l ? `${i}: ${c} - ${l}` : `${i}: ${c}`; }).join(" | "); } -function Cm({ label: e, hint: t }, n, r) { +function Tm({ label: e, hint: t }, n, r) { let i = document.createElement("div"); i.style.cssText = "\n display: flex;\n flex-direction: column;\n gap: 3px;\n padding: 6px 8px;\n border-radius: 8px;\n background: rgba(255, 255, 255, 0.03);\n border: 1px solid rgba(255, 255, 255, 0.08);\n min-width: 170px;\n "; - let a = bm(e, n, t); + let a = Sm(e, n, t); a.style.fontWeight = "500", i.appendChild(a); let o = document.createElement("span"); return o.style.fontSize = "10px", o.style.opacity = "0.7", o.style.wordBreak = "break-all", o.textContent = R("status.path", "Path") + `: ${r || R("status.pathAuto", "auto / not configured")}`, i.appendChild(o), i; } -function wm(e, t) { +function Em(e, t) { let n = e.querySelector("#mjr-status-body"), r = e.querySelector("#mjr-status-title-indicator"); n && r && (t ? (n.style.display = "none", r.textContent = ">") : (n.style.display = "", r.textContent = "v")); } -function Tm(e, t) { +function Dm(e, t) { let n = !!e?.database?.available, r = t?.diagnostics || {}, i = !!r?.malformed, a = !!r?.locked; return !n || i ? R("status.dbHealthError", "DB health: error") : a ? R("status.dbHealthLocked", "DB health: locked") : R("status.dbHealthOk", "DB health: ok"); } -function Em(e, t) { +function Om(e, t) { let n = Number(e?.total_assets || 0), r = e?.last_index_end, i = e?.last_scan_end, a = t === "all" ? R("scope.all", "Inputs + Outputs") : t === "input" ? R("scope.input", "Inputs") : t === "custom" ? R("scope.custom", "Custom") : t === "workflow" ? R("scope.workflow", "Workflow") : R("scope.output", "Outputs"); return !Number.isFinite(n) || n <= 0 ? `${R("status.indexHealthEmpty", "Index health: empty")} (${a})` : !r && !i ? `${R("status.indexHealthPartial", "Index health: partial")} (${a})` : `${R("status.indexHealthOk", "Index health: ok")} (${a})`; } -async function Dm(t, n, r = null, i = null, a = null, o = {}) { +async function km(t, n, r = null, i = null, a = null, o = {}) { let s = n?.closest?.("#mjr-status-body")?.parentElement || n?.closest?.("div"), c = o?.signal || null, l = !!o?.force; try { if (!t?.isConnected || !n?.isConnected) return null; @@ -12038,17 +12038,17 @@ async function Dm(t, n, r = null, i = null, a = null, o = {}) { console.debug?.(e); } try { - if (!l && $p) return null; + if (!l && tm) return null; } catch (e) { console.debug?.(e); } a && typeof a == "object" && (a.lastCode = null, a.lastStatus = null); - let u = String(i?.scope || "output").toLowerCase(), d = u === "workflow" ? "all" : u, f = i?.customRootId || i?.custom_root_id || i?.root_id || null, p = u === "custom" && !f, m = p ? `${st.HEALTH_COUNTERS}?scope=all` : d === "custom" ? `${st.HEALTH_COUNTERS}?scope=custom&custom_root_id=${encodeURIComponent(String(f || ""))}` : `${st.HEALTH_COUNTERS}?scope=${encodeURIComponent(d || "output")}`, h = !!o?.lightweight, g = !(!l && a && typeof a == "object" && Number(a._scanAuxBackoffUntil || 0) > Date.now()) && (l || !h || !(a && typeof a == "object" && a._auxCached)), _, v, y, b = null; + let u = String(i?.scope || "output").toLowerCase(), d = u === "workflow" ? "all" : u, f = i?.customRootId || i?.custom_root_id || i?.root_id || null, p = u === "custom" && !f, m = p ? `${it.HEALTH_COUNTERS}?scope=all` : d === "custom" ? `${it.HEALTH_COUNTERS}?scope=custom&custom_root_id=${encodeURIComponent(String(f || ""))}` : `${it.HEALTH_COUNTERS}?scope=${encodeURIComponent(d || "output")}`, h = !!o?.lightweight, g = !(!l && a && typeof a == "object" && Number(a._scanAuxBackoffUntil || 0) > Date.now()) && (l || !h || !(a && typeof a == "object" && a._auxCached)), _, v, y, b = null; if (g) { let [e, t, n] = await Promise.all([ re(m, c ? { signal: c } : void 0), - re(st.HEALTH, c ? { signal: c } : void 0), - re(st.HEALTH_DB, c ? { signal: c } : void 0) + re(it.HEALTH, c ? { signal: c } : void 0), + re(it.HEALTH_DB, c ? { signal: c } : void 0) ]); _ = e, v = t, y = n; try { @@ -12072,8 +12072,8 @@ async function Dm(t, n, r = null, i = null, a = null, o = {}) { if (a && typeof a == "object" && (a.lastCode = _?.code || null, a.lastStatus = typeof _?.status == "number" ? _.status : null), _.ok) { let e = _.data; a && typeof a == "object" && (a._scanAuxBackoffUntil = e?.scan_active ? Date.now() + 3e4 : 0); - let i = e.total_assets || 0, o = e.with_workflows - 0, l = e.with_generation_data - 0, d = Math.max(0, Number(o || 0) || 0), m = e.last_scan_end, h = m ? new Date(m).toLocaleString() : "N/A", g = e.tool_availability || {}, x = e.tool_paths || {}, S = R("status.dbSize", "Database size: {size}", { size: om(e.db_size_bytes || 0) }), C = v?.ok && v?.data && v.data.vector || {}, w = C?.enabled !== !1, T = !!C?.loaded, E = !!C?.degraded, D = String(C?.last_error || "").trim(), O = w ? E ? `AI vector: degraded${D ? ` (${D})` : ""}` : T ? "AI vector: loaded" : "AI vector: initializing" : "AI vector: disabled", k = Tm(v?.data || null, y?.data || null), A = Em(e, p ? "all" : u), j = !!(v?.ok && v?.data?.database?.available), M = y?.ok && y?.data?.diagnostics || {}, N = !!M?.malformed, P = !!M?.locked, ee = !!M?.maintenance_active; - am(ee); + let i = e.total_assets || 0, o = e.with_workflows - 0, l = e.with_generation_data - 0, d = Math.max(0, Number(o || 0) || 0), m = e.last_scan_end, h = m ? new Date(m).toLocaleString() : "N/A", g = e.tool_availability || {}, x = e.tool_paths || {}, S = R("status.dbSize", "Database size: {size}", { size: cm(e.db_size_bytes || 0) }), C = v?.ok && v?.data && v.data.vector || {}, w = C?.enabled !== !1, T = !!C?.loaded, E = !!C?.degraded, D = String(C?.last_error || "").trim(), O = w ? E ? `AI vector: degraded${D ? ` (${D})` : ""}` : T ? "AI vector: loaded" : "AI vector: initializing" : "AI vector: disabled", k = Dm(v?.data || null, y?.data || null), A = Om(e, p ? "all" : u), j = !!(v?.ok && v?.data?.database?.available), M = y?.ok && y?.data?.diagnostics || {}, N = !!M?.malformed, P = !!M?.locked, ee = !!M?.maintenance_active; + sm(ee); let te = Math.max(0, Number(e?.enrichment_queue_length || 0) || 0), F = Ft().active || te > 0; xt(F, te); let I = Number(i) > 0, ne = !!(e?.last_index_end || e?.last_scan_end), re = I && ne, ie = "success"; @@ -12091,15 +12091,15 @@ async function Dm(t, n, r = null, i = null, a = null, o = {}) { } catch (e) { console.debug?.(e); } - let L = ae ? R("status.watcher.disabledScoped", "Watcher: disabled ({scope})", { scope: R("scope.workflow", "Workflow") }) : p ? R("status.watcher.disabledScoped", "Watcher: disabled ({scope})", { scope: R("scope.customBrowser", "Browser") }) : pm(se, u), ce = F ? R("status.enrichmentQueue", "Metadata enrichment queue: {count}", { count: te }) : R("status.enrichmentIdle", "Metadata enrichment: idle"); - xm(r, g, x), Sm(r, b, g); + let L = ae ? R("status.watcher.disabledScoped", "Watcher: disabled ({scope})", { scope: R("scope.workflow", "Workflow") }) : p ? R("status.watcher.disabledScoped", "Watcher: disabled ({scope})", { scope: R("scope.customBrowser", "Browser") }) : hm(se, u), ce = F ? R("status.enrichmentQueue", "Metadata enrichment queue: {count}", { count: te }) : R("status.enrichmentIdle", "Metadata enrichment: idle"); + Cm(r, g, x), wm(r, b, g); let le = u === "all" ? R("scope.allFull", "All (Inputs + Outputs)") : u === "input" ? R("scope.input", "Inputs") : u === "custom" ? R("scope.customBrowser", "Browser") : u === "workflow" ? R("scope.workflow", "Workflow") : R("scope.output", "Outputs"); - return ie === "error" ? (t.style.background = "var(--mjr-status-error, #f44336)", dm(s, "error"), um(n, R("status.dbCorrupted", "Database appears corrupted or unavailable."), [ + return ie === "error" ? (t.style.background = "var(--mjr-status-error, #f44336)", pm(s, "error"), fm(n, R("status.dbCorrupted", "Database appears corrupted or unavailable."), [ k, A, S, L - ].filter(Boolean).join(" | ")), e) : p ? (t.style.background = "var(--mjr-status-browser, #26A69A)", dm(s, "browser"), um(n, R("status.ready", "Ready"), [R("status.browserMetricsHidden", "Browser mode: global DB/index metrics hidden"), L].filter(Boolean).join(" | ")), e) : ae ? (t.style.background = "#d481c3", dm(s, oe), sm(n, [ + ].filter(Boolean).join(" | ")), e) : p ? (t.style.background = "var(--mjr-status-browser, #26A69A)", pm(s, "browser"), fm(n, R("status.ready", "Ready"), [R("status.browserMetricsHidden", "Browser mode: global DB/index metrics hidden"), L].filter(Boolean).join(" | ")), e) : ae ? (t.style.background = "#d481c3", pm(s, oe), lm(n, [ R("status.workflowsIndexed", `${d.toLocaleString()} workflows indexed (${le})`, { count: d.toLocaleString(), scope: le @@ -12111,19 +12111,19 @@ async function Dm(t, n, r = null, i = null, a = null, o = {}) { A, S, L - ], R("status.lastScan", `Last scan: ${h}`, { date: h })), e) : (i === 0 ? (t.style.background = oe === "browser" ? "var(--mjr-status-browser, #26A69A)" : ie === "info" ? "var(--mjr-status-info, #64B5F6)" : ie === "warning" ? "var(--mjr-status-warning, #FFA726)" : "var(--mjr-status-success, #4CAF50)", dm(s, oe), um(n, R("status.noAssets", `No assets indexed yet (${le})`, { scope: le }), [ + ], R("status.lastScan", `Last scan: ${h}`, { date: h })), e) : (i === 0 ? (t.style.background = oe === "browser" ? "var(--mjr-status-browser, #26A69A)" : ie === "info" ? "var(--mjr-status-info, #64B5F6)" : ie === "warning" ? "var(--mjr-status-warning, #FFA726)" : "var(--mjr-status-success, #4CAF50)", pm(s, oe), fm(n, R("status.noAssets", `No assets indexed yet (${le})`, { scope: le }), [ R("status.clickToScan", "Click the dot to start a scan"), O, k, A, S, L - ].filter(Boolean).join(" | "))) : (t.style.background = oe === "browser" ? "var(--mjr-status-browser, #26A69A)" : ie === "info" ? "var(--mjr-status-info, #64B5F6)" : ie === "warning" ? "var(--mjr-status-warning, #FFA726)" : "var(--mjr-status-success, #4CAF50)", dm(s, oe), sm(n, [ + ].filter(Boolean).join(" | "))) : (t.style.background = oe === "browser" ? "var(--mjr-status-browser, #26A69A)" : ie === "info" ? "var(--mjr-status-info, #64B5F6)" : ie === "warning" ? "var(--mjr-status-warning, #FFA726)" : "var(--mjr-status-success, #4CAF50)", pm(s, oe), lm(n, [ R("status.assetsIndexed", `${i.toLocaleString()} assets indexed (${le})`, { count: i.toLocaleString(), scope: le }), - Nm(e), + Fm(e), R("status.withWorkflows", `With workflows: ${o} - Generation data: ${l}`, { workflows: o, gendata: l @@ -12134,34 +12134,34 @@ async function Dm(t, n, r = null, i = null, a = null, o = {}) { A, S, L - ], R("status.lastScan", `Last scan: ${h}`, { date: h })), cm(n, lm(e, { + ], R("status.lastScan", `Last scan: ${h}`, { date: h })), um(n, dm(e, { totalAssets: i, withWorkflows: o, withGenerationData: l }))), e); } - if (xm(r, {}, {}), Sm(r, b), t.style.background = "var(--mjr-status-error, #f44336)", dm(s, "error"), _?.code === "INVALID_RESPONSE" && _?.status === 404) um(n, R("status.apiNotFound", "Majoor API endpoints not found (404)"), R("status.apiNotFoundHint", "Backend routes are not loaded. Restart ComfyUI and check the terminal for Majoor import errors.")); + if (Cm(r, {}, {}), wm(r, b), t.style.background = "var(--mjr-status-error, #f44336)", pm(s, "error"), _?.code === "INVALID_RESPONSE" && _?.status === 404) fm(n, R("status.apiNotFound", "Majoor API endpoints not found (404)"), R("status.apiNotFoundHint", "Backend routes are not loaded. Restart ComfyUI and check the terminal for Majoor import errors.")); else { let t = String(_?.error || "").toLowerCase(); - t.includes("malform") || t.includes("corrupt") || t.includes("disk image") ? (um(n, R("status.dbCorrupted"), R("status.dbCorruptedHint")), globalThis._mjrCorruptToastShown || (globalThis._mjrCorruptToastShown = !0, e(R("toast.resetFailedCorrupt"), "error", 8e3))) : sm(n, [_.error || R("status.errorChecking", "Error checking status")]); + t.includes("malform") || t.includes("corrupt") || t.includes("disk image") ? (fm(n, R("status.dbCorrupted"), R("status.dbCorruptedHint")), globalThis._mjrCorruptToastShown || (globalThis._mjrCorruptToastShown = !0, e(R("toast.resetFailedCorrupt"), "error", 8e3))) : lm(n, [_.error || R("status.errorChecking", "Error checking status")]); } if (_.code === "SERVICE_UNAVAILABLE") { - let e = Om(t, n, r, i); + let e = Am(t, n, r, i); n.appendChild(document.createElement("br")), n.appendChild(e); } return null; } -function Om(e, t, n = null, r = null) { +function Am(e, t, n = null, r = null) { let i = document.createElement("button"); return i.textContent = R("btn.retryServices"), i.style.cssText = "\n padding: 4px 10px;\n margin-top: 6px;\n font-size: 11px;\n border-radius: 4px;\n border: 1px solid rgba(255,255,255,0.3);\n background: transparent;\n color: white;\n cursor: pointer;\n ", i.onclick = async () => { i.disabled = !0, i.textContent = R("btn.retrying"); - let a = await L(st.RETRY_SERVICES, {}); - i.disabled = !1, i.textContent = R("btn.retryServices"), a.ok ? Dm(e, t, n, r) : (sm(t, [a.error || R("status.retryFailed", "Retry failed")]), t.appendChild(document.createElement("br")), t.appendChild(i)); + let a = await L(it.RETRY_SERVICES, {}); + i.disabled = !1, i.textContent = R("btn.retryServices"), a.ok ? km(e, t, n, r) : (lm(t, [a.error || R("status.retryFailed", "Retry failed")]), t.appendChild(document.createElement("br")), t.appendChild(i)); }, i; } -function km() { +function jm() { try { - let e = localStorage?.getItem?.(nm); + let e = localStorage?.getItem?.(im); if (!e) return null; let t = JSON.parse(e); return t && typeof t == "object" ? t : null; @@ -12169,15 +12169,15 @@ function km() { return console.debug?.(e), null; } } -function Am(e) { +function Mm(e) { try { if (!e || typeof e != "object") return; - localStorage?.setItem?.(nm, JSON.stringify(e)); + localStorage?.setItem?.(im, JSON.stringify(e)); } catch (e) { console.debug?.(e); } } -function jm(e) { +function Nm(e) { let t = [], n = (e, r = 0) => { if (!(!e || r > 2)) { if (typeof e == "number" && Number.isFinite(e)) t.push(e); @@ -12190,23 +12190,23 @@ function jm(e) { }; return n(e, 0), t; } -function Mm(e) { +function Pm(e) { if (!e || typeof e != "object") return !1; - if ($p) return !0; + if (tm) return !0; try { if (Ft()?.active) return !0; } catch (e) { console.debug?.(e); } - return jm(e).some((e) => Number(e) > 0); + return Nm(e).some((e) => Number(e) > 0); } -function Nm(e) { +function Fm(e) { let t = []; e.images && t.push(`Images: ${e.images}`), e.videos && t.push(`Videos: ${e.videos}`), e.audio && t.push(`Audio: ${e.audio}`); let n = e.model3d || e.by_kind?.model3d || 0; return n && t.push(`3D: ${n}`), t.length ? t.join(" - ") : "Images: 0 - Videos: 0"; } -function Pm(e) { +function Im(e) { if (!e || typeof e != "object") return ""; let t = (e) => e == null ? null : typeof e == "number" ? Number.isFinite(e) ? e : null : typeof e == "boolean" || typeof e == "string" ? e : null; return JSON.stringify({ @@ -12224,23 +12224,23 @@ function Pm(e) { } }); } -function Fm(e, t, n) { - let r = km(); +function Lm(e, t, n) { + let r = jm(); if (!r) return !1; try { - xm(n, r.tool_availability || {}, r.tool_paths || {}); + Cm(n, r.tool_availability || {}, r.tool_paths || {}); } catch (e) { console.debug?.(e); } try { - return e.style.background = "var(--mjr-status-info, #64B5F6)", um(t, R("status.cached", "Last known status"), R("status.checking", "Checking status...")), !0; + return e.style.background = "var(--mjr-status-info, #64B5F6)", fm(t, R("status.cached", "Last known status"), R("status.checking", "Checking status...")), !0; } catch (e) { return console.debug?.(e), !1; } } -function Im(e, t, n) { - let r = Pm(t), i = r && r !== String(n?.lastSignature || ""), a = Mm(t), o = e || rm.ACTIVE, s = Number(n?.cooldownStablePolls || 0) || 0; - return a || i ? (o = rm.ACTIVE, s = 0) : o === rm.ACTIVE ? (o = rm.COOLDOWN, s = 0) : o === rm.COOLDOWN ? (s += 1, s >= 3 && (o = rm.IDLE, s = 0)) : (o = i ? rm.ACTIVE : rm.IDLE, s = 0), { +function Rm(e, t, n) { + let r = Im(t), i = r && r !== String(n?.lastSignature || ""), a = Pm(t), o = e || am.ACTIVE, s = Number(n?.cooldownStablePolls || 0) || 0; + return a || i ? (o = am.ACTIVE, s = 0) : o === am.ACTIVE ? (o = am.COOLDOWN, s = 0) : o === am.COOLDOWN ? (s += 1, s >= 3 && (o = am.IDLE, s = 0)) : (o = i ? am.ACTIVE : am.IDLE, s = 0), { nextState: o, signature: r, hasChange: i, @@ -12248,14 +12248,14 @@ function Im(e, t, n) { cooldownStablePolls: s }; } -function Lm(e, t, n, r = null, i = null, a = null) { +function zm(e, t, n, r = null, i = null, a = null) { let o = "__MJR_STATUS_POLL_DISPOSE__", s = { lastCode: null, lastStatus: null, _pollTick: 0, _auxCached: !1 }, c = { - mode: rm.ACTIVE, + mode: am.ACTIVE, cooldownStablePolls: 0, lastSignature: "" }, l = typeof AbortController < "u" ? new AbortController() : null, u = async () => { @@ -12265,14 +12265,14 @@ function Lm(e, t, n, r = null, i = null, a = null) { console.debug?.(e); } s._pollTick = Number(s._pollTick || 0) + 1; - let n = s._pollTick > 1 && s._pollTick % 4 != 0, o = await Dm(e, t, r, typeof a == "function" ? a() : null, s, { + let n = s._pollTick > 1 && s._pollTick % 4 != 0, o = await km(e, t, r, typeof a == "function" ? a() : null, s, { signal: l?.signal || null, lightweight: n, - force: !!$p || s._pollTick <= 1 + force: !!tm || s._pollTick <= 1 }); if (o && typeof o == "object") { - Am(o); - let e = Im(c.mode, o, c); + Mm(o); + let e = Rm(c.mode, o, c); c.mode = e.nextState, c.lastSignature = e.signature, c.cooldownStablePolls = e.cooldownStablePolls; } if (o && typeof i == "function") try { @@ -12282,7 +12282,7 @@ function Lm(e, t, n, r = null, i = null, a = null) { } return o; }; - Fm(e, t, r), u(); + Lm(e, t, r), u(); try { n._mjrStatusPollDispose?.(); } catch (e) { @@ -12303,7 +12303,7 @@ function Lm(e, t, n, r = null, i = null, a = null) { } return 1; }, h = () => { - let e = im[c.mode] || Math.max(250, Number(B.STATUS_POLL_INTERVAL) || 2e3), t = p ? Math.max(3e4, e) : f > 0 ? Math.min(6e4, Math.round(e * Math.min(8, 1 + f))) : e, r = Math.min(12e4, Math.round(t * m())); + let e = om[c.mode] || Math.max(250, Number(B.STATUS_POLL_INTERVAL) || 2e3), t = p ? Math.max(3e4, e) : f > 0 ? Math.min(6e4, Math.round(e * Math.min(8, 1 + f))) : e, r = Math.min(12e4, Math.round(t * m())); d = setTimeout(async () => { try { if (l?.signal?.aborted) return; @@ -12311,7 +12311,7 @@ function Lm(e, t, n, r = null, i = null, a = null) { console.debug?.(e); } let e = await u(); - if (p = s.lastCode === "INVALID_RESPONSE" && s.lastStatus === 404, e ? f = 0 : p ? f = Math.min(999, f + 1) : (f = Math.min(999, f + 1), c.mode = rm.ACTIVE, c.cooldownStablePolls = 0), p && f >= 3) try { + if (p = s.lastCode === "INVALID_RESPONSE" && s.lastStatus === 404, e ? f = 0 : p ? f = Math.min(999, f + 1) : (f = Math.min(999, f + 1), c.mode = am.ACTIVE, c.cooldownStablePolls = 0), p && f >= 3) try { n._mjrStatusPollDispose?.(); } catch (e) { console.debug?.(e); @@ -12334,54 +12334,54 @@ function Lm(e, t, n, r = null, i = null, a = null) { } h(); for (let i of n.querySelectorAll("#mjr-status-dot, #mjr-status-scan")) i.onclick = (n) => { - n.stopPropagation(), ym(e, t, r, typeof a == "function" ? a() : null); + n.stopPropagation(), xm(e, t, r, typeof a == "function" ? a() : null); }, i.title = R("btn.scan", "Scan"); } // ui/vue/composables/useActiveAsset.ts -var Rm = gr(null), zm = gr(null); -function Bm() { +var Bm = vr(null), Vm = vr(null); +function Hm() { return { - activeAsset: Rm, - onUpdateCallback: zm + activeAsset: Bm, + onUpdateCallback: Vm }; } -function Vm(e, t) { - zm.value = typeof t == "function" ? t : null, Rm.value = e ?? null; -} -function Hm() { - Rm.value = null, zm.value = null; -} function Um(e, t) { - if (Rm.value && e) { - Rm.value = { - ...Rm.value, + Vm.value = typeof t == "function" ? t : null, Bm.value = e ?? null; +} +function Wm() { + Bm.value = null, Vm.value = null; +} +function Gm(e, t) { + if (Bm.value && e) { + Bm.value = { + ...Bm.value, ...e }; try { - let e = t ?? zm.value; - typeof e == "function" && e(Rm.value); + let e = t ?? Vm.value; + typeof e == "function" && e(Bm.value); } catch {} } } // ui/components/sidebar/SidebarView.ts -var Wm = 360, Gm = 240, Km = 640; -function qm() { +var Km = 360, qm = 240, Jm = 640; +function Ym() { try { - let e = Jt(), t = Number(e?.sidebar?.widthPx); - return Number.isFinite(t) ? Math.max(Gm, Math.min(Km, Math.round(t))) : Wm; + let e = Vn(), t = Number(e?.sidebar?.widthPx); + return Number.isFinite(t) ? Math.max(qm, Math.min(Jm, Math.round(t))) : Km; } catch { - return Wm; + return Km; } } -function Jm(e, t) { +function Xm(e, t) { if (!e) return; let n = String(e?.dataset?.position || "right").toLowerCase() === "left", r = "var(--mjr-border, rgba(255,255,255,0.12))"; if (t) { - let t = `${qm()}px`; + let t = `${Ym()}px`; e.style.flex = `0 0 ${t}`, e.style.width = t, e.style.maxWidth = t, e.style.minWidth = "0", e.style.overflow = "hidden", e.style.borderLeft = n ? "none" : `1px solid ${r}`, e.style.borderRight = n ? `1px solid ${r}` : "none"; } else e.style.flex = "0 0 0px", e.style.width = "0", e.style.maxWidth = "0", e.style.minWidth = "0", e.style.overflow = "hidden", e.style.borderLeft = "none", e.style.borderRight = "none"; } -function Ym(e) { +function Zm(e) { if (e == null) return !1; let t = e; if (typeof e == "string") { @@ -12400,10 +12400,10 @@ function Ym(e) { } return !1; } -function Xm(e) { - return e ? !!(e.geninfo || e.prompt || Ym(e.metadata_raw)) : !1; +function Qm(e) { + return e ? !!(e.geninfo || e.prompt || Zm(e.metadata_raw)) : !1; } -async function Zm(e, t, n) { +async function $m(e, t, n) { if (!e || !t) return; let r = String(t?.kind || "").toLowerCase() === "folder"; try { @@ -12412,7 +12412,7 @@ async function Zm(e, t, n) { console.debug?.(e); } let i = e._requestSeq = (e._requestSeq || 0) + 1; - e._currentFetchAbortController?.abort?.(), e._currentFetchAbortController = null, e.classList.add("is-open"), Jm(e, !0), e._currentAsset = t, e._currentFullAsset = t, e._ratingTagsSection = null, Vm(t, n); + e._currentFetchAbortController?.abort?.(), e._currentFetchAbortController = null, e.classList.add("is-open"), Xm(e, !0), e._currentAsset = t, e._currentFullAsset = t, e._ratingTagsSection = null, Um(t, n); let a = () => { e._currentFetchAbortController?.abort?.(); let t = typeof AbortController < "u" ? new AbortController() : null; @@ -12421,7 +12421,7 @@ async function Zm(e, t, n) { e._requestSeq === i && e._currentAsset === t && (e._currentFullAsset = { ...e._currentFullAsset ?? t, ...r - }, Um(r, n)); + }, Gm(r, n)); }; (async () => { if (e._requestSeq !== i || e._currentAsset !== t) return; @@ -12443,7 +12443,7 @@ async function Zm(e, t, n) { } let c = () => e._currentFullAsset ?? t; try { - if (t.id && !Xm(c())) { + if (t.id && !Qm(c())) { let e = await I(t.id, n); if (s?.aborted) return; e?.ok && e.data && o(e.data); @@ -12452,7 +12452,7 @@ async function Zm(e, t, n) { s?.aborted || console.warn("Failed to load full asset metadata:", e); } if (!s?.aborted) { - if (!Xm(c())) { + if (!Qm(c())) { let e = String(c()?.filename || "").trim(), t = String(c()?.type || "output").trim().toLowerCase(), r = String(c()?.subfolder || "").trim(), i = String(c()?.root_id || c()?.rootId || "").trim(); if (e) try { let a = await Ee({ @@ -12481,9 +12481,9 @@ async function Zm(e, t, n) { } })(); } -function Qm(e) { +function eh(e) { if (e) { - e._requestSeq = (e._requestSeq || 0) + 1, e.classList.remove("is-open"), Jm(e, !1), e._currentAsset = null, e._currentFullAsset = null, e._currentFetchAbortController?.abort?.(), e._currentFetchAbortController = null, Hm(); + e._requestSeq = (e._requestSeq || 0) + 1, e.classList.remove("is-open"), Xm(e, !1), e._currentAsset = null, e._currentFullAsset = null, e._currentFetchAbortController?.abort?.(), e._currentFetchAbortController = null, Wm(); try { e.dispatchEvent?.(new CustomEvent("mjr:sidebar-closed", { bubbles: !0 })); } catch (e) { @@ -12492,14 +12492,14 @@ function Qm(e) { } } // ui/stores/usePanelStore.ts -var $m = "mjr_panel_state", eh = /* @__PURE__ */ new Set([ +var th = "mjr_panel_state", nh = /* @__PURE__ */ new Set([ "output", "input", "all", "custom", "workflow" ]); -function th(e, t = !1) { +function rh(e, t = !1) { if (typeof e == "boolean") return e; if (typeof e == "string") { let t = e.trim().toLowerCase(); @@ -12518,71 +12518,71 @@ function th(e, t = !1) { } return !!t; } -function nh(e, t = 0) { +function ih(e, t = 0) { let n = Number(e); return Number.isFinite(n) ? n : t; } -function rh(e, t = "") { +function ah(e, t = "") { return e == null ? t : String(e); } -function ih(e, t = 0, n = Infinity) { - return Math.max(t, Math.min(n, Math.floor(nh(e, t)))); +function oh(e, t = 0, n = Infinity) { + return Math.max(t, Math.min(n, Math.floor(ih(e, t)))); } -function ah(e) { - let t = rh(e || "output").toLowerCase(), n = t === "outputs" ? "output" : t === "inputs" ? "input" : t; - return eh.has(n) ? n : "output"; +function sh(e) { + let t = ah(e || "output").toLowerCase(), n = t === "outputs" ? "output" : t === "inputs" ? "input" : t; + return nh.has(n) ? n : "output"; } -function oh(e) { +function ch(e) { if (!e || typeof e != "object") return {}; let t = e; return { - scope: ah(t.scope), - customRootId: rh(t.customRootId), - customRootLabel: rh(t.customRootLabel), - currentFolderRelativePath: rh(t.currentFolderRelativePath || t.subfolder), - collectionId: rh(t.collectionId), - collectionName: rh(t.collectionName), - kindFilter: rh(t.kindFilter), - dateRangeFilter: rh(t.dateRangeFilter), - dateExactFilter: rh(t.dateExactFilter), - workflowOnly: th(t.workflowOnly, !1), - minRating: ih(t.minRating, 0, 5), - minSizeMB: Math.max(0, nh(t.minSizeMB, 0)), - maxSizeMB: Math.max(0, nh(t.maxSizeMB, 0)), + scope: sh(t.scope), + customRootId: ah(t.customRootId), + customRootLabel: ah(t.customRootLabel), + currentFolderRelativePath: ah(t.currentFolderRelativePath || t.subfolder), + collectionId: ah(t.collectionId), + collectionName: ah(t.collectionName), + kindFilter: ah(t.kindFilter), + dateRangeFilter: ah(t.dateRangeFilter), + dateExactFilter: ah(t.dateExactFilter), + workflowOnly: rh(t.workflowOnly, !1), + minRating: oh(t.minRating, 0, 5), + minSizeMB: Math.max(0, ih(t.minSizeMB, 0)), + maxSizeMB: Math.max(0, ih(t.maxSizeMB, 0)), resolutionCompare: t.resolutionCompare === "lte" ? "lte" : "gte", - minWidth: ih(t.minWidth), - minHeight: ih(t.minHeight), - maxWidth: ih(t.maxWidth), - maxHeight: ih(t.maxHeight), - workflowType: rh(t.workflowType), - workflowId: rh(t.workflowId || t.workflow_id), - workflowModelFilter: rh(t.workflowModelFilter || t.workflowModel || t.workflow_model), - workflowRunsOnFilter: rh(t.workflowRunsOnFilter || t.workflowRunsOn || t.runs_on), - sort: rh(t.sort || "mtime_desc"), - searchQuery: rh(t.searchQuery), + minWidth: oh(t.minWidth), + minHeight: oh(t.minHeight), + maxWidth: oh(t.maxWidth), + maxHeight: oh(t.maxHeight), + workflowType: ah(t.workflowType), + workflowId: ah(t.workflowId || t.workflow_id), + workflowModelFilter: ah(t.workflowModelFilter || t.workflowModel || t.workflow_model), + workflowRunsOnFilter: ah(t.workflowRunsOnFilter || t.workflowRunsOn || t.runs_on), + sort: ah(t.sort || "mtime_desc"), + searchQuery: ah(t.searchQuery), metadataSearchMode: String(t.metadataSearchMode || "AND").toUpperCase() === "OR" ? "OR" : "AND", - scrollTop: ih(t.scrollTop), - activeAssetId: rh(t.activeAssetId), - selectedAssetIds: Array.isArray(t.selectedAssetIds) ? t.selectedAssetIds.map((e) => rh(e).trim()).filter(Boolean).slice(0, 5e3) : [], - sidebarOpen: th(t.sidebarOpen, !1) + scrollTop: oh(t.scrollTop), + activeAssetId: ah(t.activeAssetId), + selectedAssetIds: Array.isArray(t.selectedAssetIds) ? t.selectedAssetIds.map((e) => ah(e).trim()).filter(Boolean).slice(0, 5e3) : [], + sidebarOpen: rh(t.sidebarOpen, !1) }; } -function sh() { +function lh() { try { - let e = localStorage.getItem($m); - if (e) return oh(JSON.parse(e)); + let e = localStorage.getItem(th); + if (e) return ch(JSON.parse(e)); } catch {} return {}; } -function ch(e) { +function uh(e) { try { let t = { ...e }; - delete t.lastGridCount, delete t.lastGridTotal, delete t.viewScope, delete t.similarResults, delete t.similarTitle, delete t.similarSourceAssetId, localStorage.setItem($m, JSON.stringify(t)); + delete t.lastGridCount, delete t.lastGridTotal, delete t.viewScope, delete t.similarResults, delete t.similarTitle, delete t.similarSourceAssetId, localStorage.setItem(th, JSON.stringify(t)); } catch {} } -var lh = Ar("mjr-panel", () => { - let e = sh(), t = Q(e.scope || "output"), n = Q(e.customRootId || ""), r = Q(e.customRootLabel || ""), i = Q(e.currentFolderRelativePath || ""), a = Q(e.collectionId || ""), o = Q(e.collectionName || ""), s = Q(e.kindFilter || ""), c = Q(e.dateRangeFilter || ""), l = Q(e.dateExactFilter || ""), u = Q(e.workflowOnly || !1), d = Q(e.minRating || 0), f = Q(e.minSizeMB || 0), p = Q(e.maxSizeMB || 0), m = Q(e.resolutionCompare || "gte"), h = Q(e.minWidth || 0), g = Q(e.minHeight || 0), _ = Q(e.maxWidth || 0), v = Q(e.maxHeight || 0), y = Q(e.workflowType || ""), b = Q(e.workflowId || ""), x = Q(e.workflowModelFilter || ""), S = Q(e.workflowRunsOnFilter || ""), C = Q(e.sort || "mtime_desc"), w = Q(e.searchQuery || ""), T = Q(e.metadataSearchMode || "AND"), E = Q(e.scrollTop || 0), D = Q(e.activeAssetId || ""), O = Q(e.selectedAssetIds || []), k = Q(e.sidebarOpen || !1), A = Q(0), j = Q(0), M = Q(""), N = Q([]), P = Q(""), ee = Q(""), te = null; - or([ +var dh = Mr("mjr-panel", () => { + let e = lh(), t = Q(e.scope || "output"), n = Q(e.customRootId || ""), r = Q(e.customRootLabel || ""), i = Q(e.currentFolderRelativePath || ""), a = Q(e.collectionId || ""), o = Q(e.collectionName || ""), s = Q(e.kindFilter || ""), c = Q(e.dateRangeFilter || ""), l = Q(e.dateExactFilter || ""), u = Q(e.workflowOnly || !1), d = Q(e.minRating || 0), f = Q(e.minSizeMB || 0), p = Q(e.maxSizeMB || 0), m = Q(e.resolutionCompare || "gte"), h = Q(e.minWidth || 0), g = Q(e.minHeight || 0), _ = Q(e.maxWidth || 0), v = Q(e.maxHeight || 0), y = Q(e.workflowType || ""), b = Q(e.workflowId || ""), x = Q(e.workflowModelFilter || ""), S = Q(e.workflowRunsOnFilter || ""), C = Q(e.sort || "mtime_desc"), w = Q(e.searchQuery || ""), T = Q(e.metadataSearchMode || "AND"), E = Q(e.scrollTop || 0), D = Q(e.activeAssetId || ""), O = Q(e.selectedAssetIds || []), k = Q(e.sidebarOpen || !1), A = Q(0), j = Q(0), M = Q(""), N = Q([]), P = Q(""), ee = Q(""), te = null; + cr([ t, n, r, @@ -12614,7 +12614,7 @@ var lh = Ar("mjr-panel", () => { k ], () => { te && clearTimeout(te), te = setTimeout(() => { - te = null, ch({ + te = null, uh({ scope: t.value, customRootId: n.value, customRootLabel: r.value, @@ -12648,15 +12648,15 @@ var lh = Ar("mjr-panel", () => { }, 750); }, { deep: !0 }); let F = (e) => { - if (e.key === $m && e.newValue) try { - let n = oh(JSON.parse(e.newValue)); + if (e.key === th && e.newValue) try { + let n = ch(JSON.parse(e.newValue)); n.scope !== void 0 && (t.value = n.scope), n.customRootLabel !== void 0 && (r.value = n.customRootLabel), n.searchQuery !== void 0 && (w.value = n.searchQuery), n.metadataSearchMode !== void 0 && (T.value = n.metadataSearchMode), n.sort !== void 0 && (C.value = n.sort), n.sidebarOpen !== void 0 && (k.value = n.sidebarOpen); } catch {} }; try { window.addEventListener("storage", F); } catch {} - Cr(() => { + Tr(() => { try { window.removeEventListener("storage", F); } catch {} @@ -12729,16 +12729,16 @@ var lh = Ar("mjr-panel", () => { }; }); // ui/stores/getOptionalPanelStore.ts -function uh() { +function fh() { try { - return jr() ? lh() : null; + return Nr() ? dh() : null; } catch { return null; } } // ui/stores/panelStateBridge.ts -function dh(e, t = []) { - let n = uh(); +function ph(e, t = []) { + let n = fh(); return { panelStore: n, hydrateStoreFromLegacy: () => {}, @@ -12765,12 +12765,12 @@ function dh(e, t = []) { }; } // ui/features/panel/messages/messageCenter.ts -var fh = "mjr_panel_messages_v1", ph = "mjr_panel_messages_last_read_v1", mh = "mjr_panel_messages_dismissed_builtin_ids_v1", hh = 120, gh = "/mjr/am/user-guide", _h = /* @__PURE__ */ new Set([ +var mh = "mjr_panel_messages_v1", hh = "mjr_panel_messages_last_read_v1", gh = "mjr_panel_messages_dismissed_builtin_ids_v1", _h = 120, vh = "/mjr/am/user-guide", yh = /* @__PURE__ */ new Set([ "info", "success", "warning", "error" -]), vh = "mjr:panel-messages-changed", yh = !1, bh = [], xh = Object.freeze([ +]), bh = "mjr:panel-messages-changed", xh = !1, Sh = [], Ch = Object.freeze([ { id: "whats-new-2026-07-09-version-2-5-0", title: "New Version 2.5.0", @@ -12893,7 +12893,7 @@ var fh = "mjr_panel_messages_v1", ph = "mjr_panel_messages_last_read_v1", mh = " bodyKey: "msg.whatsNew.body.localUserGuide", actionLabel: "User Guide", actionLabelKey: "label.userGuide", - actionUrl: gh + actionUrl: vh }, { id: "tip-2026-04-07-output-folder-override", @@ -13075,27 +13075,27 @@ var fh = "mjr_panel_messages_v1", ph = "mjr_panel_messages_last_read_v1", mh = " actionLabelKey: "label.settingsGuide", actionUrl: "docs/SETTINGS_CONFIGURATION.md" } -]), Sh = new Set(xh.map((e) => String(e?.id || "").trim()).filter(Boolean)); -function Ch(e, t = 0) { +]), wh = new Set(Ch.map((e) => String(e?.id || "").trim()).filter(Boolean)); +function Th(e, t = 0) { let n = Number(e); return Number.isFinite(n) ? n : t; } -function wh() { +function Eh() { return Date.now(); } -function Th() { - return lt(`msg-${wh()}-`, 6); +function Dh() { + return Me(`msg-${Eh()}-`, 6); } -function Eh(e) { +function Oh(e) { let t = String(e || "").trim().toLowerCase(); - return t === "warn" ? "warning" : t === "danger" ? "error" : _h.has(t) ? t : "info"; + return t === "warn" ? "warning" : t === "danger" ? "error" : yh.has(t) ? t : "info"; } -function Dh(e) { - return Sh.has(String(e || "").trim()); +function kh(e) { + return wh.has(String(e || "").trim()); } -function Oh(e = {}) { +function Ah(e = {}) { return { - id: String(e?.id || "").trim() || Th(), + id: String(e?.id || "").trim() || Dh(), title: String(e?.title || "").trim() || "Info", titleKey: String(e?.titleKey || "").trim(), emoji: String(e?.emoji || "").trim(), @@ -13103,14 +13103,14 @@ function Oh(e = {}) { bodyKey: String(e?.bodyKey || "").trim(), category: String(e?.category || "").trim() || "Info", categoryKey: String(e?.categoryKey || "").trim(), - createdAt: Ch(e?.createdAt, wh()), - level: Eh(e?.level), + createdAt: Th(e?.createdAt, Eh()), + level: Oh(e?.level), actionLabel: String(e?.actionLabel || "").trim(), actionLabelKey: String(e?.actionLabelKey || "").trim(), actionUrl: String(e?.actionUrl || "").trim() }; } -function kh(e, t) { +function jh(e, t) { try { let n = localStorage.getItem(e); return n ? JSON.parse(n) : t; @@ -13118,87 +13118,87 @@ function kh(e, t) { return t; } } -function Ah(e, t) { +function Mh(e, t) { try { localStorage.setItem(e, JSON.stringify(t)); } catch {} } -function jh() { +function Nh() { try { - return Ch(localStorage.getItem(ph), 0); + return Th(localStorage.getItem(hh), 0); } catch { return 0; } } -function Mh(e) { +function Ph(e) { try { - localStorage.setItem(ph, String(Ch(e, wh()))); + localStorage.setItem(hh, String(Th(e, Eh()))); } catch {} } -function Nh() { - let e = kh(mh, []); - return new Set((Array.isArray(e) ? e : []).map((e) => String(e || "").trim()).filter((e) => Dh(e))); -} -function Ph() { - bh.sort((e, t) => Number(t.createdAt || 0) - Number(e.createdAt || 0)), bh.length > hh && (bh = bh.slice(0, hh)); -} function Fh() { - Ah(fh, bh); + let e = jh(gh, []); + return new Set((Array.isArray(e) ? e : []).map((e) => String(e || "").trim()).filter((e) => kh(e))); } function Ih() { - let e = Nh(), t = !1; - for (let n of xh) { - let r = Oh(n); - if (e.has(r.id)) continue; - let i = bh.findIndex((e) => e.id === r.id); - if (i < 0) { - bh.push(r), t = !0; - continue; - } - let a = bh[i], o = { - ...a, - ...r, - createdAt: Ch(a?.createdAt, r.createdAt) - }; - JSON.stringify(a) !== JSON.stringify(o) && (bh[i] = o, t = !0); - } - return t ? (Ph(), Fh(), !0) : !1; + Sh.sort((e, t) => Number(t.createdAt || 0) - Number(e.createdAt || 0)), Sh.length > _h && (Sh = Sh.slice(0, _h)); } function Lh() { + Mh(mh, Sh); +} +function Rh() { + let e = Fh(), t = !1; + for (let n of Ch) { + let r = Ah(n); + if (e.has(r.id)) continue; + let i = Sh.findIndex((e) => e.id === r.id); + if (i < 0) { + Sh.push(r), t = !0; + continue; + } + let a = Sh[i], o = { + ...a, + ...r, + createdAt: Th(a?.createdAt, r.createdAt) + }; + JSON.stringify(a) !== JSON.stringify(o) && (Sh[i] = o, t = !0); + } + return t ? (Ih(), Lh(), !0) : !1; +} +function zh() { try { - window.dispatchEvent(new CustomEvent(vh, { detail: { - total: bh.length, - unread: Vh() + window.dispatchEvent(new CustomEvent(bh, { detail: { + total: Sh.length, + unread: Uh() } })); } catch (e) { console.debug?.(e); } } -function Rh() { - if (yh) return; - yh = !0; - let e = kh(fh, []); - bh = (Array.isArray(e) ? e : []).map(Oh), Ph(); -} -function zh() { - Rh(), Ih() && Lh(); -} function Bh() { - return Rh(), bh.map((e) => ({ ...e })); + if (xh) return; + xh = !0; + let e = jh(mh, []); + Sh = (Array.isArray(e) ? e : []).map(Ah), Ih(); } function Vh() { - Rh(); - let e = jh(); - return bh.reduce((t, n) => t + +(Number(n.createdAt || 0) > e), 0); + Bh(), Rh() && zh(); } function Hh() { - return Rh(), jh(); + return Bh(), Sh.map((e) => ({ ...e })); } -function Uh({ upTo: e = wh() } = {}) { - Rh(), Mh(Ch(e, wh())), Lh(); +function Uh() { + Bh(); + let e = Nh(); + return Sh.reduce((t, n) => t + +(Number(n.createdAt || 0) > e), 0); +} +function Wh() { + return Bh(), Nh(); +} +function Gh({ upTo: e = Eh() } = {}) { + Bh(), Ph(Th(e, Eh())), zh(); } // ui/features/panel/messages/shortcutGuide.ts -var Wh = Object.freeze([ +var Kh = Object.freeze([ { id: "panel", titleKey: "msg.shortcuts.section.panel", @@ -13407,18 +13407,18 @@ var Wh = Object.freeze([ ]) } ]); -function Gh() { - return Wh.map((e) => ({ +function qh() { + return Kh.map((e) => ({ ...e, items: Array.isArray(e.items) ? e.items.map((e) => ({ ...e })) : [] })); } -function Kh() { +function Jh() { let e = document.createElement("div"); e.className = "mjr-shortcut-guide"; let t = document.createElement("div"); t.className = "mjr-shortcut-guide-intro", t.textContent = R("msg.shortcuts.intro", "Current keyboard shortcuts grouped by section for quick reference."), e.appendChild(t); - for (let t of Gh()) { + for (let t of qh()) { let n = document.createElement("section"); n.className = "mjr-shortcut-section"; let r = document.createElement("div"); @@ -13438,18 +13438,18 @@ function Kh() { return e; } // ui/features/panel/messages/messagePopoverController.ts -var qh = /* @__PURE__ */ new Set([ +var Yh = /* @__PURE__ */ new Set([ "info", "success", "warning", "error" -]), Jh = 2200, Yh = /* @__PURE__ */ new Set([ +]), Xh = 2200, Zh = /* @__PURE__ */ new Set([ "started", "queued", "running", "pending", "in_progress" -]), Xh = /* @__PURE__ */ new Set([ +]), Qh = /* @__PURE__ */ new Set([ "succeeded", "success", "complete", @@ -13460,7 +13460,7 @@ var qh = /* @__PURE__ */ new Set([ "cancelled", "canceled" ]); -function Zh(e) { +function $h(e) { let t = Number(e); if (!Number.isFinite(t) || t <= 0) return ""; try { @@ -13475,15 +13475,15 @@ function Zh(e) { return ""; } } -function Qh(e, t, n, r) { +function eg(e, t, n, r) { let i = String(e?.[t] || "").trim(), a = String(e?.[n] || r || "").trim() || String(r || ""); return i ? R(i, a) : a; } -function $h(e) { +function tg(e) { let t = String(e || "").trim().toLowerCase(); - return t === "warn" ? "warning" : t === "danger" ? "error" : qh.has(t) ? t : "info"; + return t === "warn" ? "warning" : t === "danger" ? "error" : Yh.has(t) ? t : "info"; } -function eg(e) { +function ng(e) { let t = String(e || "").trim(); if (!t) return ""; try { @@ -13493,13 +13493,13 @@ function eg(e) { return ""; } } -function tg(e) { +function rg(e) { let t = String(e?.emoji || "").trim(); if (t) return t; - let n = $h(e?.level); + let n = tg(e?.level); return n === "success" ? "OK" : n === "warning" ? "WARN" : n === "error" ? "ERR" : "INFO"; } -function ng(e) { +function ig(e) { switch (String(e || "").toLowerCase()) { case "success": return "OK"; case "warning": return "WARN"; @@ -13507,22 +13507,22 @@ function ng(e) { default: return "Tip"; } } -function rg(e) { +function ag(e) { if (e?.persistent) return "persistent"; let t = Number(e?.durationMs); return !Number.isFinite(t) || t <= 0 ? "" : t < 1e4 ? `${(t / 1e3).toFixed(1)}s` : `${Math.round(t / 1e3)}s`; } -function ig(e) { +function og(e) { let t = String(e || "").trim().toLowerCase(); return t ? t.replace(/[_-]+/g, " ") : ""; } -function ag(e) { +function sg(e) { let t = e?.progress; if (!t || typeof t != "object") return ""; let n = String(t.label || "").trim(), r = Number(t.current), i = Number(t.total), a = Number(t.indexed), o = Number(t.skipped), s = Number(t.errors), c = []; return n && c.push(n), Number.isFinite(r) && Number.isFinite(i) && i > 0 && c.push(`${r}/${i}`), Number.isFinite(a) && c.push(`indexed ${a}`), Number.isFinite(o) && c.push(`skipped ${o}`), Number.isFinite(s) && s > 0 && c.push(`errors ${s}`), c.join(" | "); } -function og(e) { +function cg(e) { let t = e?.progress; if (!t || typeof t != "object") return null; let n = Number(t.percent); @@ -13530,14 +13530,14 @@ function og(e) { let r = Number(t.current), i = Number(t.total); return Number.isFinite(r) && Number.isFinite(i) && i > 0 ? Math.max(0, Math.min(100, Math.round(r / i * 100))) : null; } -function sg(e) { +function lg(e) { return String(e?.trackId || "").trim() || [ String(e?.operation || "").trim(), String(e?.source || "").trim(), String(e?.title || "").trim() ].filter(Boolean).join(":"); } -function cg({ activeTab: e = "messages", title: t = null, messagePopover: n = null, messageTabBtn: r = null, historyTabBtn: i = null, shortcutsTabBtn: a = null, messageList: o = null, historyPanel: s = null, shortcutsPanel: c = null, markReadBtn: l = null } = {}) { +function ug({ activeTab: e = "messages", title: t = null, messagePopover: n = null, messageTabBtn: r = null, historyTabBtn: i = null, shortcutsTabBtn: a = null, messageList: o = null, historyPanel: s = null, shortcutsPanel: c = null, markReadBtn: l = null } = {}) { let u = e === "messages", d = e === "history", f = e === "shortcuts", p = u ? R("label.messages", "Messages") : d ? R("label.toastHistory", "History") : R("msg.shortcuts.title", "Shortcut Guide"); try { r?.classList.toggle("is-active", u), r?.setAttribute("aria-selected", u ? "true" : "false"), r?.setAttribute("tabindex", u ? "0" : "-1"), i?.classList.toggle("is-active", d), i?.setAttribute("aria-selected", d ? "true" : "false"), i?.setAttribute("tabindex", d ? "0" : "-1"), a?.classList.toggle("is-active", f), a?.setAttribute("aria-selected", f ? "true" : "false"), a?.setAttribute("tabindex", f ? "0" : "-1"); @@ -13550,8 +13550,8 @@ function cg({ activeTab: e = "messages", title: t = null, messagePopover: n = nu console.debug?.(e); } } -function lg({ messageBtn: e = null, messagePopover: t = null, title: n = null, messageList: r = null, historyTabBtn: i = null, historyTabBadge: a = null, historyTabCount: o = null, historyPanel: s = null, shortcutsPanel: c = null, messageTabBtn: l = null, messageTabBadge: u = null, shortcutsTabBtn: d = null, markReadBtn: f = null, popovers: p = null, onBeforeToggle: m = null, signal: h = null } = {}) { - zh(); +function dg({ messageBtn: e = null, messagePopover: t = null, title: n = null, messageList: r = null, historyTabBtn: i = null, historyTabBadge: a = null, historyTabCount: o = null, historyPanel: s = null, shortcutsPanel: c = null, messageTabBtn: l = null, messageTabBadge: u = null, shortcutsTabBtn: d = null, markReadBtn: f = null, popovers: p = null, onBeforeToggle: m = null, signal: h = null } = {}) { + Vh(); let g = "messages", _ = !1, v = null, y = /* @__PURE__ */ new Set(), b = () => { if (v) { try { @@ -13565,13 +13565,13 @@ function lg({ messageBtn: e = null, messagePopover: t = null, title: n = null, m if (!_ || g !== "history" || t?.style?.display !== "block") return; let e = ae(); for (let n of e) { - let e = sg(n); + let e = lg(n); if (!e || !y.has(e)) continue; let r = String(n?.status || "").trim().toLowerCase(); - if (Xh.has(r)) { + if (Qh.has(r)) { b(), v = setTimeout(() => { v = null, _ && g === "history" && t?.style?.display === "block" && (p?.close?.(t), _ = !1, y.clear(), S(), k()); - }, Jh); + }, Xh); return; } } @@ -13589,14 +13589,14 @@ function lg({ messageBtn: e = null, messagePopover: t = null, title: n = null, m } }, C = () => { if (!r) return; - let e = Bh(), t = Hh(); + let e = Hh(), t = Wh(); if (r.replaceChildren(), !e.length) { let e = document.createElement("div"); e.className = "mjr-messages-empty", e.textContent = R("msg.noMessages", "No messages for now."), r.appendChild(e); } else for (let n of e) { let e = document.createElement("article"); e.className = "mjr-message-item"; - let i = $h(n?.level); + let i = tg(n?.level); e.classList.add(`mjr-message-item--${i}`); let a = Number(n?.createdAt || 0); a > Number(t || 0) && e.classList.add("mjr-message-item--unread"); @@ -13605,16 +13605,16 @@ function lg({ messageBtn: e = null, messagePopover: t = null, title: n = null, m let s = document.createElement("div"); s.className = "mjr-message-item-title-wrap"; let c = document.createElement("span"); - c.className = "mjr-message-item-emoji", c.textContent = tg(n), c.setAttribute("aria-hidden", "true"); + c.className = "mjr-message-item-emoji", c.textContent = rg(n), c.setAttribute("aria-hidden", "true"); let l = document.createElement("div"); - l.className = "mjr-message-item-title", l.textContent = Qh(n, "titleKey", "title", R("label.info", "Info")); + l.className = "mjr-message-item-title", l.textContent = eg(n, "titleKey", "title", R("label.info", "Info")); let u = document.createElement("span"); - u.className = "mjr-message-item-category", u.textContent = Qh(n, "categoryKey", "category", R("label.info", "Info")), s.appendChild(c), s.appendChild(l), o.appendChild(s), o.appendChild(u); + u.className = "mjr-message-item-category", u.textContent = eg(n, "categoryKey", "category", R("label.info", "Info")), s.appendChild(c), s.appendChild(l), o.appendChild(s), o.appendChild(u); let d = document.createElement("div"); - d.className = "mjr-message-item-meta", d.textContent = Zh(a); + d.className = "mjr-message-item-meta", d.textContent = $h(a); let f = document.createElement("div"); - f.className = "mjr-message-item-body", f.textContent = Qh(n, "bodyKey", "body", ""), e.appendChild(o), d.textContent && e.appendChild(d), f.textContent && e.appendChild(f); - let p = eg(n?.actionUrl), m = Qh(n, "actionLabelKey", "actionLabel", R("label.readMe", "Read Me")); + f.className = "mjr-message-item-body", f.textContent = eg(n, "bodyKey", "body", ""), e.appendChild(o), d.textContent && e.appendChild(d), f.textContent && e.appendChild(f); + let p = ng(n?.actionUrl), m = eg(n, "actionLabelKey", "actionLabel", R("label.readMe", "Read Me")); if (p && m) { let t = document.createElement("a"); t.className = "mjr-message-item-action", t.href = p, t.target = "_blank", t.rel = "noopener noreferrer", t.textContent = m, e.appendChild(t); @@ -13641,7 +13641,7 @@ function lg({ messageBtn: e = null, messagePopover: t = null, title: n = null, m let e = document.createElement("div"); e.className = `mjr-history-item mjr-history-item--${String(n.type || "info")}`; let r = document.createElement("span"); - r.className = "mjr-history-item-icon", r.textContent = ng(n.type), r.setAttribute("aria-hidden", "true"); + r.className = "mjr-history-item-icon", r.textContent = ig(n.type), r.setAttribute("aria-hidden", "true"); let i = document.createElement("div"); i.className = "mjr-history-item-content"; let a = String(n.title || "").trim(), o = String(n.detail || "").trim(), s = String(n.message || "").trim(), c = a || s, l = a && o ? o : a ? "" : o, u = document.createElement("div"); @@ -13651,14 +13651,14 @@ function lg({ messageBtn: e = null, messagePopover: t = null, title: n = null, m let f = document.createElement("div"); f.className = "mjr-history-item-meta"; let p = document.createElement("span"); - p.className = "mjr-history-item-time", p.textContent = Zh(n.createdAt); + p.className = "mjr-history-item-time", p.textContent = $h(n.createdAt); let m = document.createElement("span"); - m.className = "mjr-history-item-chip", m.textContent = rg(n); + m.className = "mjr-history-item-chip", m.textContent = ag(n); let h = document.createElement("span"); h.className = "mjr-history-item-chip", h.textContent = String(n.source || "").trim(); let g = document.createElement("span"); - g.className = "mjr-history-item-chip", g.textContent = ig(n.status), i.appendChild(u), d.textContent && i.appendChild(d), p.textContent && f.appendChild(p), m.textContent && f.appendChild(m), g.textContent && f.appendChild(g), h.textContent && f.appendChild(h), f.childNodes.length && i.appendChild(f); - let _ = ag(n), v = og(n); + g.className = "mjr-history-item-chip", g.textContent = og(n.status), i.appendChild(u), d.textContent && i.appendChild(d), p.textContent && f.appendChild(p), m.textContent && f.appendChild(m), g.textContent && f.appendChild(g), h.textContent && f.appendChild(h), f.childNodes.length && i.appendChild(f); + let _ = sg(n), v = cg(n); if (_ || v !== null) { let e = document.createElement("div"); if (e.className = "mjr-history-item-progress", _) { @@ -13673,7 +13673,7 @@ function lg({ messageBtn: e = null, messagePopover: t = null, title: n = null, m } i.appendChild(e); } - let y = eg(n?.actionUrl), b = String(n?.actionLabel || "").trim(); + let y = ng(n?.actionUrl), b = String(n?.actionLabel || "").trim(); if (y && b) { let e = document.createElement("a"); e.className = "mjr-history-item-action", e.href = y, e.target = "_blank", e.rel = "noopener noreferrer", e.textContent = b, i.appendChild(e); @@ -13688,13 +13688,13 @@ function lg({ messageBtn: e = null, messagePopover: t = null, title: n = null, m let e = _e(); a && (a.style.display = e > 0 ? "inline-block" : "none"), T(o, e); }, D = () => { - c && (c.childNodes.length > 0 || c.replaceChildren(Kh())); + c && (c.childNodes.length > 0 || c.replaceChildren(Jh())); }, O = () => { if (!f) return; - let e = Math.max(0, Number(Vh() || 0) || 0); + let e = Math.max(0, Number(Uh() || 0) || 0); f.disabled = e <= 0, f.title = e > 0 ? R("tooltip.markMessagesRead", "Mark all messages as read") : R("tooltip.noUnreadMessages", "No unread messages"); }, k = () => { - let t = Math.max(0, Number(Vh() || 0) || 0); + let t = Math.max(0, Number(Uh() || 0) || 0); if (e) { let n = e.querySelector(".mjr-message-badge"), r = t > 0 ? R("tooltip.openMessagesUnread", "Messages ({count} unread)", { count: t }) : R("tooltip.openMessages", "Messages and updates"); e.classList.toggle("mjr-message-has-unread", t > 0), e.title = r, e.setAttribute("aria-label", r), n && (t <= 0 ? (n.style.display = "none", n.textContent = "") : (n.style.display = "inline-flex", n.textContent = t > 9 ? "9+" : String(t))); @@ -13704,7 +13704,7 @@ function lg({ messageBtn: e = null, messagePopover: t = null, title: n = null, m k(), E(), t?.style?.display === "block" && (g === "messages" && C(), g === "history" && w()); }, M = h ? { signal: h } : void 0; try { - window.addEventListener(vh, j, M); + window.addEventListener(bh, j, M); } catch (e) { console.debug?.(e); } @@ -13712,8 +13712,8 @@ function lg({ messageBtn: e = null, messagePopover: t = null, title: n = null, m window.addEventListener(be, () => { if (E(), t?.style?.display === "block" && g === "history" && w(), _) { for (let e of ae()) { - let t = String(e?.status || "").trim().toLowerCase(), n = sg(e); - n && Yh.has(t) && y.add(n); + let t = String(e?.status || "").trim().toLowerCase(), n = lg(e); + n && Zh.has(t) && y.add(n); } x(); } @@ -13740,7 +13740,7 @@ function lg({ messageBtn: e = null, messagePopover: t = null, title: n = null, m } catch (e) { console.debug?.(e); } - k(), E(), S(), cg({ + k(), E(), S(), ug({ activeTab: g, title: n, messagePopover: t, @@ -13753,7 +13753,7 @@ function lg({ messageBtn: e = null, messagePopover: t = null, title: n = null, m markReadBtn: f }); let P = () => { - g = "messages", cg({ + g = "messages", ug({ activeTab: g, title: n, messagePopover: t, @@ -13764,9 +13764,9 @@ function lg({ messageBtn: e = null, messagePopover: t = null, title: n = null, m historyPanel: s, shortcutsPanel: c, markReadBtn: f - }), C(), Uh(), k(); + }), C(), Gh(), k(); }, ee = () => { - g = "history", cg({ + g = "history", ug({ activeTab: g, title: n, messagePopover: t, @@ -13779,7 +13779,7 @@ function lg({ messageBtn: e = null, messagePopover: t = null, title: n = null, m markReadBtn: f }), w(), A(), E(); }, te = () => { - g = "shortcuts", cg({ + g = "shortcuts", ug({ activeTab: g, title: n, messagePopover: t, @@ -13805,8 +13805,8 @@ function lg({ messageBtn: e = null, messagePopover: t = null, title: n = null, m } ee(), _ = !0, b(), y.clear(); for (let e of ae()) { - let t = String(e?.status || "").trim().toLowerCase(), n = sg(e); - n && Yh.has(t) && y.add(n); + let t = String(e?.status || "").trim().toLowerCase(), n = lg(e); + n && Zh.has(t) && y.add(n); } x(), S(), k(); } @@ -13838,7 +13838,7 @@ function lg({ messageBtn: e = null, messagePopover: t = null, title: n = null, m }; return e?.addEventListener("click", (a) => { if (t && p && e) { - a.stopPropagation(), _ = !1, y.clear(), b(), g = "messages", C(), D(), cg({ + a.stopPropagation(), _ = !1, y.clear(), b(), g = "messages", C(), D(), ug({ activeTab: g, title: n, messagePopover: t, @@ -13855,7 +13855,7 @@ function lg({ messageBtn: e = null, messagePopover: t = null, title: n = null, m } catch (e) { console.debug?.(e); } - p.toggle(t, e), t?.style?.display === "block" && Uh(), S(), k(); + p.toggle(t, e), t?.style?.display === "block" && Gh(), S(), k(); } }, M), l?.addEventListener("click", (e) => { e.preventDefault(), e.stopPropagation(), P(); @@ -13864,7 +13864,7 @@ function lg({ messageBtn: e = null, messagePopover: t = null, title: n = null, m }, M), i?.addEventListener("keydown", (e) => re(e, "history"), M), d?.addEventListener("click", (e) => { e.preventDefault(), e.stopPropagation(), te(); }, M), d?.addEventListener("keydown", (e) => re(e, "shortcuts"), M), f?.addEventListener("click", (e) => { - e.preventDefault(), e.stopPropagation(), Uh(), C(), k(); + e.preventDefault(), e.stopPropagation(), Gh(), C(), k(); }, M), { refresh: j, render: C, @@ -13879,7 +13879,7 @@ function lg({ messageBtn: e = null, messagePopover: t = null, title: n = null, m }; } // ui/features/panel/controllers/query.ts -function ug(e) { +function fg(e) { let t = e; for (let e = 0; e < 3 && t && typeof t == "object" && "value" in t; e += 1) { let e = t.value; @@ -13888,8 +13888,8 @@ function ug(e) { } return t; } -function dg(e) { - let t = ug(e); +function pg(e) { + let t = fg(e); if (!t) return null; let n = String(t?.tagName || "").toUpperCase(); if (n === "INPUT" || n === "TEXTAREA") return t; @@ -13903,13 +13903,13 @@ function dg(e) { } return null; } -function fg(e) { - let t = dg(e), n = t ? t.value : typeof e?.value == "string" ? e.value : ""; +function mg(e) { + let t = pg(e), n = t ? t.value : typeof e?.value == "string" ? e.value : ""; return String(n || "").trim() || "*"; } // ui/features/panel/controllers/gridController.ts -function pg({ gridContainer: t, loadAssets: n, loadAssetsFromList: r, getCollectionAssets: i, disposeGrid: a, getQuery: o, searchInputEl: s, state: c }) { - let { read: l, write: u } = dh(c, /* @__PURE__ */ "scope.customRootId.currentFolderRelativePath.kindFilter.workflowOnly.minRating.minSizeMB.maxSizeMB.resolutionCompare.minWidth.minHeight.maxWidth.maxHeight.workflowType.workflowId.workflowModelFilter.workflowRunsOnFilter.dateRangeFilter.dateExactFilter.sort.activeAssetId.selectedAssetIds.collectionId.collectionName.viewScope.similarResults.similarTitle.similarSourceAssetId.lastGridCount.lastGridTotal".split(".")), f = !1, p = !1, m = {}, h = 0, g = 0, _ = 3e4, v = async (e, t = _) => { +function hg({ gridContainer: t, loadAssets: n, loadAssetsFromList: r, getCollectionAssets: i, disposeGrid: a, getQuery: o, searchInputEl: s, state: c }) { + let { read: l, write: u } = ph(c, /* @__PURE__ */ "scope.customRootId.currentFolderRelativePath.kindFilter.workflowOnly.minRating.minSizeMB.maxSizeMB.resolutionCompare.minWidth.minHeight.maxWidth.maxHeight.workflowType.workflowId.workflowModelFilter.workflowRunsOnFilter.dateRangeFilter.dateExactFilter.sort.activeAssetId.selectedAssetIds.collectionId.collectionName.viewScope.similarResults.similarTitle.similarSourceAssetId.lastGridCount.lastGridTotal".split(".")), f = !1, p = !1, m = {}, h = 0, g = 0, _ = 3e4, v = async (e, t = _) => { let n = null; try { let r = new Promise((e, r) => { @@ -13930,7 +13930,7 @@ function pg({ gridContainer: t, loadAssets: n, loadAssetsFromList: r, getCollect } }, b = () => { try { - return !!(Jt()?.ai?.vectorSearchEnabled ?? !0); + return !!(Vn()?.ai?.vectorSearchEnabled ?? !0); } catch { return !0; } @@ -14134,8 +14134,8 @@ function pg({ gridContainer: t, loadAssets: n, loadAssetsFromList: r, getCollect }) }; } // ui/features/panel/controllers/browserNavigationController.ts -function mg({ state: e, gridContainer: t, folderBreadcrumb: n, folderBreadcrumbController: r = null, customSelect: i, reloadGrid: a, clearSelection: o = null, onContextChanged: s = null, lifecycleSignal: c = null } = {}) { - let { read: l, write: u } = dh(e, [ +function gg({ state: e, gridContainer: t, folderBreadcrumb: n, folderBreadcrumbController: r = null, customSelect: i, reloadGrid: a, clearSelection: o = null, onContextChanged: s = null, lifecycleSignal: c = null } = {}) { + let { read: l, write: u } = ph(e, [ "scope", "customRootId", "currentFolderRelativePath" @@ -14368,8 +14368,8 @@ function mg({ state: e, gridContainer: t, folderBreadcrumb: n, folderBreadcrumbC }; } // ui/features/panel/controllers/scopeController.ts -function hg({ state: e, tabButtons: t, customMenuBtn: n, customPopover: r, popovers: i, reloadGrid: a, reconcileSelection: o = null, onChanged: s = null, onScopeChanged: c = null, onBeforeReload: l = null }) { - let u = 0, { panelStore: d, read: f, write: p, controllerState: m } = dh(e, [ +function _g({ state: e, tabButtons: t, customMenuBtn: n, customPopover: r, popovers: i, reloadGrid: a, reconcileSelection: o = null, onChanged: s = null, onScopeChanged: c = null, onBeforeReload: l = null }) { + let u = 0, { panelStore: d, read: f, write: p, controllerState: m } = ph(e, [ "scope", "customRootId", "currentFolderRelativePath", @@ -14484,21 +14484,21 @@ function hg({ state: e, tabButtons: t, customMenuBtn: n, customPopover: r, popov }; } // ui/features/panel/controllers/contextController.ts -var gg = (e, t) => { +var vg = (e, t) => { if (e) try { e.value = t; } catch (e) { console.debug?.(e); } -}, _g = (e, t) => { +}, yg = (e, t) => { if (e) try { e.checked = !!t; } catch (e) { console.debug?.(e); } }; -function vg({ state: e, gridContainer: t, filterBtn: n, sortBtn: r, collectionsBtn: i, searchInputEl: a, kindSelect: o, wfCheckbox: s, workflowTypeSelect: c, workflowIdInput: l, workflowModelInput: u, workflowRunsOnSelect: d, ratingSelect: f, minSizeInput: p, maxSizeInput: m, minWidthInput: h, minHeightInput: g, maxWidthInput: _, maxHeightInput: v, resolutionPresetSelect: y, dateRangeSelect: b, dateExactInput: x, scopeController: S, sortController: C, updateSummaryBar: w, reloadGrid: T, extraActions: E = null, getExtraContext: D = null } = {}) { - let O = e && typeof e == "object" ? e : {}, { read: k, write: A, controllerState: j } = dh(e, /* @__PURE__ */ "searchQuery.scope.collectionId.collectionName.customRootId.customRootLabel.currentFolderRelativePath.kindFilter.workflowOnly.minRating.minSizeMB.maxSizeMB.minWidth.minHeight.maxWidth.maxHeight.resolutionCompare.workflowType.workflowId.workflowModelFilter.workflowRunsOnFilter.dateRangeFilter.dateExactFilter.sort.viewScope.similarResults.similarTitle.similarSourceAssetId".split(".")), M = (e, t) => { +function bg({ state: e, gridContainer: t, filterBtn: n, sortBtn: r, collectionsBtn: i, searchInputEl: a, kindSelect: o, wfCheckbox: s, workflowTypeSelect: c, workflowIdInput: l, workflowModelInput: u, workflowRunsOnSelect: d, ratingSelect: f, minSizeInput: p, maxSizeInput: m, minWidthInput: h, minHeightInput: g, maxWidthInput: _, maxHeightInput: v, resolutionPresetSelect: y, dateRangeSelect: b, dateExactInput: x, scopeController: S, sortController: C, updateSummaryBar: w, reloadGrid: T, extraActions: E = null, getExtraContext: D = null } = {}) { + let O = e && typeof e == "object" ? e : {}, { read: k, write: A, controllerState: j } = ph(e, /* @__PURE__ */ "searchQuery.scope.collectionId.collectionName.customRootId.customRootLabel.currentFolderRelativePath.kindFilter.workflowOnly.minRating.minSizeMB.maxSizeMB.minWidth.minHeight.maxWidth.maxHeight.resolutionCompare.workflowType.workflowId.workflowModelFilter.workflowRunsOnFilter.dateRangeFilter.dateExactFilter.sort.viewScope.similarResults.similarTitle.similarSourceAssetId".split(".")), M = (e, t) => { A(e, t); }, N = (e, t = "") => k(e, t), P = () => ({ ...O || {}, @@ -14521,7 +14521,7 @@ function vg({ state: e, gridContainer: t, filterBtn: n, sortBtn: r, collectionsB }, F = { clearQuery: async () => { try { - gg(a, ""), M("searchQuery", ""); + vg(a, ""), M("searchQuery", ""); } catch (e) { console.debug?.(e); } @@ -14590,7 +14590,7 @@ function vg({ state: e, gridContainer: t, filterBtn: n, sortBtn: r, collectionsB }, clearKind: async () => { try { - M("kindFilter", ""), gg(o, ""); + M("kindFilter", ""), vg(o, ""); } catch (e) { console.debug?.(e); } @@ -14602,7 +14602,7 @@ function vg({ state: e, gridContainer: t, filterBtn: n, sortBtn: r, collectionsB }, clearMinRating: async () => { try { - M("minRating", 0), gg(f, "0"); + M("minRating", 0), vg(f, "0"); } catch (e) { console.debug?.(e); } @@ -14614,7 +14614,7 @@ function vg({ state: e, gridContainer: t, filterBtn: n, sortBtn: r, collectionsB }, clearWorkflowOnly: async () => { try { - M("workflowOnly", !1), _g(s, !1); + M("workflowOnly", !1), yg(s, !1); } catch (e) { console.debug?.(e); } @@ -14626,7 +14626,7 @@ function vg({ state: e, gridContainer: t, filterBtn: n, sortBtn: r, collectionsB }, clearWorkflowType: async () => { try { - M("workflowType", ""), gg(c, ""); + M("workflowType", ""), vg(c, ""); } catch (e) { console.debug?.(e); } @@ -14638,7 +14638,7 @@ function vg({ state: e, gridContainer: t, filterBtn: n, sortBtn: r, collectionsB }, clearWorkflowId: async () => { try { - M("workflowId", ""), gg(l, ""); + M("workflowId", ""), vg(l, ""); } catch (e) { console.debug?.(e); } @@ -14650,7 +14650,7 @@ function vg({ state: e, gridContainer: t, filterBtn: n, sortBtn: r, collectionsB }, clearWorkflowModel: async () => { try { - M("workflowModelFilter", ""), gg(u, ""); + M("workflowModelFilter", ""), vg(u, ""); } catch (e) { console.debug?.(e); } @@ -14662,7 +14662,7 @@ function vg({ state: e, gridContainer: t, filterBtn: n, sortBtn: r, collectionsB }, clearWorkflowRunsOn: async () => { try { - M("workflowRunsOnFilter", ""), gg(d, ""); + M("workflowRunsOnFilter", ""), vg(d, ""); } catch (e) { console.debug?.(e); } @@ -14674,7 +14674,7 @@ function vg({ state: e, gridContainer: t, filterBtn: n, sortBtn: r, collectionsB }, clearSize: async () => { try { - M("minSizeMB", 0), M("maxSizeMB", 0), gg(p, ""), gg(m, ""); + M("minSizeMB", 0), M("maxSizeMB", 0), vg(p, ""), vg(m, ""); } catch (e) { console.debug?.(e); } @@ -14686,7 +14686,7 @@ function vg({ state: e, gridContainer: t, filterBtn: n, sortBtn: r, collectionsB }, clearResolution: async () => { try { - M("minWidth", 0), M("minHeight", 0), M("maxWidth", 0), M("maxHeight", 0), gg(h, ""), gg(g, ""), gg(_, ""), gg(v, ""), gg(y, ""); + M("minWidth", 0), M("minHeight", 0), M("maxWidth", 0), M("maxHeight", 0), vg(h, ""), vg(g, ""), vg(_, ""), vg(v, ""), vg(y, ""); } catch (e) { console.debug?.(e); } @@ -14698,7 +14698,7 @@ function vg({ state: e, gridContainer: t, filterBtn: n, sortBtn: r, collectionsB }, clearDateRange: async () => { try { - M("dateRangeFilter", ""), gg(b, ""); + M("dateRangeFilter", ""), vg(b, ""); } catch (e) { console.debug?.(e); } @@ -14710,7 +14710,7 @@ function vg({ state: e, gridContainer: t, filterBtn: n, sortBtn: r, collectionsB }, clearDateExact: async () => { try { - M("dateExactFilter", ""), gg(x, ""); + M("dateExactFilter", ""), vg(x, ""); } catch (e) { console.debug?.(e); } @@ -14735,7 +14735,7 @@ function vg({ state: e, gridContainer: t, filterBtn: n, sortBtn: r, collectionsB clearAll: async () => { let e = !1; try { - gg(a, ""); + vg(a, ""); } catch (e) { console.debug?.(e); } @@ -14751,7 +14751,7 @@ function vg({ state: e, gridContainer: t, filterBtn: n, sortBtn: r, collectionsB console.debug?.(e); } try { - gg(o, ""), _g(s, !1), gg(c, ""), gg(l, ""), gg(u, ""), gg(d, ""), gg(f, "0"), gg(p, ""), gg(m, ""), gg(h, ""), gg(g, ""), gg(_, ""), gg(v, ""), gg(y, ""), gg(b, ""), gg(x, ""); + vg(o, ""), yg(s, !1), vg(c, ""), vg(l, ""), vg(u, ""), vg(d, ""), vg(f, "0"), vg(p, ""), vg(m, ""), vg(h, ""), vg(g, ""), vg(_, ""), vg(v, ""), vg(y, ""), vg(b, ""), vg(x, ""); } catch (e) { console.debug?.(e); } @@ -14777,7 +14777,7 @@ function vg({ state: e, gridContainer: t, filterBtn: n, sortBtn: r, collectionsB } return { update: () => { - let e = String(a?.value || "").trim(), o = fg(a), s = P(), c = !!(N("kindFilter", "") || N("workflowOnly", !1) || (Number(N("minRating", 0) || 0) || 0) > 0 || (Number(N("minSizeMB", 0) || 0) || 0) > 0 || (Number(N("maxSizeMB", 0) || 0) || 0) > 0 || (Number(N("minWidth", 0) || 0) || 0) > 0 || (Number(N("minHeight", 0) || 0) || 0) > 0 || (Number(N("maxWidth", 0) || 0) || 0) > 0 || (Number(N("maxHeight", 0) || 0) || 0) > 0 || String(N("workflowType", "") || "").trim().length > 0 || String(N("workflowId", "") || "").trim().length > 0 || String(N("workflowModelFilter", "") || "").trim().length > 0 || String(N("workflowRunsOnFilter", "") || "").trim().length > 0 || N("dateRangeFilter", "") || N("dateExactFilter", "")), l = String(N("sort", "mtime_desc") || "mtime_desc") !== "mtime_desc", u = !!N("collectionId", ""); + let e = String(a?.value || "").trim(), o = mg(a), s = P(), c = !!(N("kindFilter", "") || N("workflowOnly", !1) || (Number(N("minRating", 0) || 0) || 0) > 0 || (Number(N("minSizeMB", 0) || 0) || 0) > 0 || (Number(N("maxSizeMB", 0) || 0) || 0) > 0 || (Number(N("minWidth", 0) || 0) || 0) > 0 || (Number(N("minHeight", 0) || 0) || 0) > 0 || (Number(N("maxWidth", 0) || 0) || 0) > 0 || (Number(N("maxHeight", 0) || 0) || 0) > 0 || String(N("workflowType", "") || "").trim().length > 0 || String(N("workflowId", "") || "").trim().length > 0 || String(N("workflowModelFilter", "") || "").trim().length > 0 || String(N("workflowRunsOnFilter", "") || "").trim().length > 0 || N("dateRangeFilter", "") || N("dateExactFilter", "")), l = String(N("sort", "mtime_desc") || "mtime_desc") !== "mtime_desc", u = !!N("collectionId", ""); try { n?.classList?.toggle?.("mjr-context-active", c), r?.classList?.toggle?.("mjr-context-active", l), i?.classList?.toggle?.("mjr-context-active", u); } catch (e) { @@ -14803,8 +14803,8 @@ function vg({ state: e, gridContainer: t, filterBtn: n, sortBtn: r, collectionsB }; } // ui/features/panel/controllers/customRootsController.ts -function yg({ state: e, customSelect: t, customRemoveBtn: n, comfyConfirm: r, comfyPrompt: i, comfyToast: a, get: o, post: s, ENDPOINTS: c, reloadGrid: l, onRootChanged: u = null }) { - let d = e && typeof e == "object" ? e : {}, { read: f, write: p } = dh(e, [ +function xg({ state: e, customSelect: t, customRemoveBtn: n, comfyConfirm: r, comfyPrompt: i, comfyToast: a, get: o, post: s, ENDPOINTS: c, reloadGrid: l, onRootChanged: u = null }) { + let d = e && typeof e == "object" ? e : {}, { read: f, write: p } = ph(e, [ "customRootId", "customRootLabel", "currentFolderRelativePath" @@ -14936,8 +14936,8 @@ function yg({ state: e, customSelect: t, customRemoveBtn: n, comfyConfirm: r, co }; } // ui/features/panel/controllers/sortController.ts -function bg({ state: e, sortBtn: t, sortMenu: n, sortPopover: r, popovers: i, reloadGrid: a, onChanged: o = null }) { - let { read: s, write: c } = dh(e, ["sort"]), l = () => [ +function Sg({ state: e, sortBtn: t, sortMenu: n, sortPopover: r, popovers: i, reloadGrid: a, onChanged: o = null }) { + let { read: s, write: c } = ph(e, ["sort"]), l = () => [ { key: "mtime_desc", label: R("sort.newest") @@ -15022,13 +15022,13 @@ function bg({ state: e, sortBtn: t, sortMenu: n, sortPopover: r, popovers: i, re }; } // ui/features/panel/controllers/sidebarController.ts -var xg = "_mjrRescanning", Sg = 1500, Cg = (e) => /^\d+$/.test(String(e ?? "").trim()); -async function wg({ card: t, asset: n, sidebar: r, onAssetUpdated: i }) { +var Cg = "_mjrRescanning", wg = 1500, Tg = (e) => /^\d+$/.test(String(e ?? "").trim()); +async function Eg({ card: t, asset: n, sidebar: r, onAssetUpdated: i }) { if (!t || !n || globalThis._mjrMaintenanceActive) return; try { let e = Date.now(); - if (e - (Number(t[xg] || 0) || 0) < Sg) return; - t[xg] = e; + if (e - (Number(t[Cg] || 0) || 0) < wg) return; + t[Cg] = e; } catch (e) { console.debug?.(e); } @@ -15047,13 +15047,13 @@ async function wg({ card: t, asset: n, sidebar: r, onAssetUpdated: i }) { filename: n.filename, subfolder: n.subfolder || "", type: String(n.type || "output").toLowerCase(), - root_id: Me(n) || void 0 + root_id: ze(n) || void 0 }, s = null, c = !1, l = !1, u = !1; try { - if (c = !!(await L(st.INDEX_FILES, { + if (c = !!(await L(it.INDEX_FILES, { files: [o], incremental: !1 - }))?.ok, !c && a && (Ht(a, "error", "Error: metadata refresh failed", { asset: n }), a.classList.remove("mjr-pulse-animation"), a.style.cursor = ""), Cg(n?.id)) { + }))?.ok, !c && a && (Ht(a, "error", "Error: metadata refresh failed", { asset: n }), a.classList.remove("mjr-pulse-animation"), a.style.cursor = ""), Tg(n?.id)) { l = !0; try { u = !!(await ge(n.id))?.ok; @@ -15108,7 +15108,7 @@ async function wg({ card: t, asset: n, sidebar: r, onAssetUpdated: i }) { } return s; } -function Tg(e, t) { +function Dg(e, t) { if (e) { try { let n = e.querySelector(".mjr-asset-card.is-selected"); @@ -15144,7 +15144,7 @@ function Tg(e, t) { } } } -var Eg = (e) => { +var Og = (e) => { if (e == null) return ""; try { if (typeof CSS < "u" && typeof CSS.escape == "function") return CSS.escape(String(e)); @@ -15153,32 +15153,32 @@ var Eg = (e) => { } return String(e).replace(/([!"#$%&'()*+,./:;<=>?@[\\\]^`{|}~])/g, "\\$1"); }; -function Dg(e, t) { +function kg(e, t) { if (!e || !t) return null; try { - return e.querySelector(`.mjr-asset-card[data-mjr-asset-id="${Eg(t)}"]`); + return e.querySelector(`.mjr-asset-card[data-mjr-asset-id="${Og(t)}"]`); } catch (e) { console.debug?.(e); } try { - return e.querySelector(`.mjr-asset-card[data-mjr-asset-id="${Eg(t)}"]`); + return e.querySelector(`.mjr-asset-card[data-mjr-asset-id="${Og(t)}"]`); } catch (e) { console.debug?.(e); } return null; } -function Og(e) { +function Ag(e) { if (!e) return null; let t = e.dataset?.mjrSelectedAssetId; if (t) { - let n = Dg(e, t); + let n = kg(e, t); if (n) return n; } let n = e.dataset?.mjrSelectedAssetIds; if (n) try { let t = JSON.parse(n); if (Array.isArray(t) && t.length) { - let n = Dg(e, t[0]); + let n = kg(e, t[0]); if (n) return n; } } catch (e) { @@ -15186,7 +15186,7 @@ function Og(e) { } return e.querySelector(".mjr-asset-card.is-selected"); } -function kg(e, { preventScroll: t = !0 } = {}) { +function jg(e, { preventScroll: t = !0 } = {}) { if (e) try { e.focus?.({ preventScroll: t }); } catch { @@ -15197,14 +15197,14 @@ function kg(e, { preventScroll: t = !0 } = {}) { } } } -function Ag(e, { force: t = !1 } = {}) { +function Mg(e, { force: t = !1 } = {}) { if (!e || !t && !e._mjrFocusWithin) return; - let n = Og(e); - n && (kg(n), e._mjrFocusWithin = !0); + let n = Ag(e); + n && (jg(n), e._mjrFocusWithin = !0); } -function jg(e) { +function Ng(e) { if (e) try { - let t = Og(e); + let t = Ag(e); if (!t) return; let n = e.parentElement; if (n && typeof n.getBoundingClientRect == "function" && typeof t.getBoundingClientRect == "function") { @@ -15219,7 +15219,7 @@ function jg(e) { console.debug?.(e); } } -function Mg(e) { +function Pg(e) { if (e) try { e._mjrAutoRevealSelectionUntil = Date.now() + 900; } catch (e) { @@ -15227,12 +15227,12 @@ function Mg(e) { } let t = () => { try { - jg(e); + Ng(e); } catch (e) { console.debug?.(e); } try { - Ag(e); + Mg(e); } catch (e) { console.debug?.(e); } @@ -15247,10 +15247,10 @@ function Mg(e) { t(); } } -function Ng(e, t) { +function Fg(e, t) { e && (t ? (e.classList.add("is-selected"), e.setAttribute?.("aria-selected", "true")) : (e.classList.remove("is-selected"), e.setAttribute?.("aria-selected", "false"))); } -function Pg(e) { +function Ig(e) { try { if (typeof e?._mjrGetRenderedCards == "function") { let t = e._mjrGetRenderedCards(); @@ -15265,15 +15265,15 @@ function Pg(e) { return []; } } -function Fg(e) { +function Lg(e) { if (e) try { - let t = Pg(e).filter((e) => e?.classList?.contains?.("is-selected")).map((e) => e?.dataset?.mjrAssetId).filter(Boolean); + let t = Ig(e).filter((e) => e?.classList?.contains?.("is-selected")).map((e) => e?.dataset?.mjrAssetId).filter(Boolean); t.length ? (e.dataset.mjrSelectedAssetIds = JSON.stringify(t), !e.dataset.mjrSelectedAssetId && t[0] && (e.dataset.mjrSelectedAssetId = String(t[0]))) : (delete e.dataset.mjrSelectedAssetIds, delete e.dataset.mjrSelectedAssetId); } catch (e) { console.debug?.(e); } } -function Ig(e, t, n = "") { +function Rg(e, t, n = "") { if (!e) return []; let r = Array.from(t || []).map(String).filter(Boolean); try { @@ -15287,9 +15287,9 @@ function Ig(e, t, n = "") { console.debug?.(e); } try { - for (let t of Pg(e)) { + for (let t of Ig(e)) { let e = t?.dataset?.mjrAssetId; - Ng(t, !!(e && r.includes(String(e)))); + Fg(t, !!(e && r.includes(String(e)))); } } catch (e) { console.debug?.(e); @@ -15304,7 +15304,7 @@ function Ig(e, t, n = "") { } return r; } -function Lg({ gridContainer: e, state: t, activeId: n, readState: r = null, writeState: i = null } = {}) { +function zg({ gridContainer: e, state: t, activeId: n, readState: r = null, writeState: i = null } = {}) { if ((t || i) && e) try { let a = []; if (e.dataset?.mjrSelectedAssetIds) try { @@ -15313,7 +15313,7 @@ function Lg({ gridContainer: e, state: t, activeId: n, readState: r = null, writ } catch (e) { console.debug?.(e); } - else a = e.dataset?.mjrSelectedAssetId ? [String(e.dataset.mjrSelectedAssetId)].filter(Boolean) : Pg(e).filter((e) => e?.classList?.contains?.("is-selected")).map((e) => e?.dataset?.mjrAssetId).filter(Boolean).map(String); + else a = e.dataset?.mjrSelectedAssetId ? [String(e.dataset.mjrSelectedAssetId)].filter(Boolean) : Ig(e).filter((e) => e?.classList?.contains?.("is-selected")).map((e) => e?.dataset?.mjrAssetId).filter(Boolean).map(String); typeof i == "function" ? i("selectedAssetIds", a) : t.selectedAssetIds = a; let o = String(typeof r == "function" ? r("activeAssetId", "") || "" : t?.activeAssetId || ""); n == null ? o && a.includes(o) || (typeof i == "function" ? i("activeAssetId", a[0] || "") : t.activeAssetId = a[0] || "") : typeof i == "function" ? i("activeAssetId", String(n)) : t.activeAssetId = String(n); @@ -15321,8 +15321,8 @@ function Lg({ gridContainer: e, state: t, activeId: n, readState: r = null, writ console.debug?.(e); } } -function Rg({ gridContainer: e, sidebar: t, createRatingBadge: n, createTagsBadge: r, showAssetInSidebar: i, closeSidebar: a, state: o }) { - let { read: s, write: c } = dh(o, [ +function Bg({ gridContainer: e, sidebar: t, createRatingBadge: n, createTagsBadge: r, showAssetInSidebar: i, closeSidebar: a, state: o }) { + let { read: s, write: c } = ph(o, [ "activeAssetId", "selectedAssetIds", "sidebarOpen" @@ -15357,9 +15357,9 @@ function Rg({ gridContainer: e, sidebar: t, createRatingBadge: n, createTagsBadg } }, a = () => { n && cancelAnimationFrame(n), r && clearTimeout(r), n = requestAnimationFrame(() => { - n = null, i() && jg(e); + n = null, i() && Ng(e); }), r = setTimeout(() => { - r = null, i() && jg(e); + r = null, i() && Ng(e); }, 160); }, o = new ResizeObserver(() => a()); t && o.observe(t), o.observe(e), e._mjrSelectionResizeObserver = o; @@ -15399,14 +15399,14 @@ function Rg({ gridContainer: e, sidebar: t, createRatingBadge: n, createTagsBadg if (!a) return; n.preventDefault(), n.stopPropagation(); let l = r?.dataset?.mjrAssetId || ""; - Ig(e, l ? [l] : [], l), Lg({ + Rg(e, l ? [l] : [], l), zg({ gridContainer: e, state: o, activeId: l, readState: s, writeState: c }); - let u = await wg({ + let u = await Eg({ card: r, asset: a, sidebar: t, @@ -15425,7 +15425,7 @@ function Rg({ gridContainer: e, sidebar: t, createRatingBadge: n, createTagsBadg let u = r._mjrAsset; if (u) { if (e?._mjrSelectionManagedByVue) { - Lg({ + zg({ gridContainer: e, state: o, activeId: String(r?.dataset?.mjrAssetId || "").trim(), @@ -15445,7 +15445,7 @@ function Rg({ gridContainer: e, sidebar: t, createRatingBadge: n, createTagsBadg console.debug?.(e); } } else if (n.preventDefault(), n.stopPropagation(), n.ctrlKey || n.metaKey || n.shiftKey) { - let t = Pg(e), i = t.indexOf(r); + let t = Ig(e), i = t.indexOf(r); if (n.shiftKey) { let t = []; try { @@ -15457,7 +15457,7 @@ function Rg({ gridContainer: e, sidebar: t, createRatingBadge: n, createTagsBadg let n = r?.dataset?.mjrAssetId || "", i = t.findIndex((e) => String(e?.id || "") === String(n)), a = Number(e._mjrLastSelectedIndex), l = Number.isFinite(a) ? a : i; if (i >= 0 && l >= 0) { let r = Math.min(l, i), a = Math.max(l, i), u = t.slice(r, a + 1).map((e) => String(e?.id || "")).filter(Boolean); - Ig(e, u, n || u[0] || ""), e._mjrLastSelectedIndex = i, Lg({ + Rg(e, u, n || u[0] || ""), e._mjrLastSelectedIndex = i, zg({ gridContainer: e, state: o, activeId: n || "", @@ -15492,7 +15492,7 @@ function Rg({ gridContainer: e, sidebar: t, createRatingBadge: n, createTagsBadg } a && (l.has(a) ? l.delete(a) : l.add(a)); let u = Array.from(l), d = l.has(a) ? a : u[0] || ""; - Ig(e, u, d), Lg({ + Rg(e, u, d), zg({ gridContainer: e, state: o, activeId: d, @@ -15502,7 +15502,7 @@ function Rg({ gridContainer: e, sidebar: t, createRatingBadge: n, createTagsBadg } else { { if (r.classList.contains("is-selected")) { - Ig(e, [], ""), Lg({ + Rg(e, [], ""), zg({ gridContainer: e, state: o, activeId: "", @@ -15512,7 +15512,7 @@ function Rg({ gridContainer: e, sidebar: t, createRatingBadge: n, createTagsBadg return; } let n = r?.dataset?.mjrAssetId; - Ig(e, n ? [n] : [], n || ""), Lg({ + Rg(e, n ? [n] : [], n || ""), zg({ gridContainer: e, state: o, activeId: n || "", @@ -15526,7 +15526,7 @@ function Rg({ gridContainer: e, sidebar: t, createRatingBadge: n, createTagsBadg } } try { - jg(e), r?.focus?.({ preventScroll: !0 }); + Ng(e), r?.focus?.({ preventScroll: !0 }); } catch (e) { console.debug?.(e); } @@ -15537,10 +15537,10 @@ function Rg({ gridContainer: e, sidebar: t, createRatingBadge: n, createTagsBadg let p = async () => { let n = String(s("activeAssetId", "") || ""), r = null; if (n) try { - r = e.querySelector(`.mjr-asset-card[data-mjr-asset-id="${Eg(n)}"]`); + r = e.querySelector(`.mjr-asset-card[data-mjr-asset-id="${Og(n)}"]`); } catch { try { - r = e.querySelector(`.mjr-asset-card[data-mjr-asset-id="${Eg(n)}"]`); + r = e.querySelector(`.mjr-asset-card[data-mjr-asset-id="${Og(n)}"]`); } catch (e) { console.debug?.(e); } @@ -15548,7 +15548,7 @@ function Rg({ gridContainer: e, sidebar: t, createRatingBadge: n, createTagsBadg r ||= e.querySelector(".mjr-asset-card.is-selected"); let l = r?._mjrAsset; if (l) { - Tg(e, r), Fg(e), Lg({ + Dg(e, r), Lg(e), zg({ gridContainer: e, state: o, activeId: r?.dataset?.mjrAssetId, @@ -15564,7 +15564,7 @@ function Rg({ gridContainer: e, sidebar: t, createRatingBadge: n, createTagsBadg } catch (e) { console.debug?.(e); } - Ag(e, { force: !0 }), Mg(e); + Mg(e, { force: !0 }), Pg(e); return; } } catch (e) { @@ -15577,7 +15577,7 @@ function Rg({ gridContainer: e, sidebar: t, createRatingBadge: n, createTagsBadg } catch (e) { console.debug?.(e); } - Mg(e), r?.focus?.({ preventScroll: !0 }); + Pg(e), r?.focus?.({ preventScroll: !0 }); } catch (e) { console.debug?.(e); } @@ -15592,7 +15592,7 @@ function Rg({ gridContainer: e, sidebar: t, createRatingBadge: n, createTagsBadg if (!n) return !1; let r = null; try { - r = Dg(e, n); + r = kg(e, n); } catch (e) { console.debug?.(e); } @@ -15629,7 +15629,7 @@ function Rg({ gridContainer: e, sidebar: t, createRatingBadge: n, createTagsBadg let _ = (t) => { if (t.defaultPrevented || (t.key?.toLowerCase?.() || "") !== "d" || t.ctrlKey || t.metaKey || t.altKey || t.target?.isContentEditable || t.target?.closest?.("input, textarea, select, [contenteditable='true']")) return; let n = Mt(t.target, ".mjr-asset-card"); - n && n._mjrAsset && (t.preventDefault(), t.stopPropagation(), Tg(e, n), Fg(e), Lg({ + n && n._mjrAsset && (t.preventDefault(), t.stopPropagation(), Dg(e, n), Lg(e), zg({ gridContainer: e, state: o, activeId: n?.dataset?.mjrAssetId, @@ -15715,7 +15715,7 @@ function Rg({ gridContainer: e, sidebar: t, createRatingBadge: n, createTagsBadg }; } // ui/features/panel/controllers/panelHotkeysController.ts -function zg({ onTriggerScan: e, getScanContext: t, onToggleDetails: n, onToggleFloatingViewer: r, onFocusSearch: i, onClearSearch: a, allowListKeys: o } = {}) { +function Vg({ onTriggerScan: e, getScanContext: t, onToggleDetails: n, onToggleFloatingViewer: r, onFocusSearch: i, onClearSearch: a, allowListKeys: o } = {}) { let s = !1, c = !1, l = null, u = o instanceof Set ? o : /* @__PURE__ */ new Set([ " ", "ArrowUp", @@ -15750,7 +15750,7 @@ function zg({ onTriggerScan: e, getScanContext: t, onToggleDetails: n, onToggleF console.debug?.(e); } try { - let e = Xn(); + let e = Qn(); return e && (document.activeElement === document.body || e.contains?.(document.activeElement)) || !1; } catch (e) { return console.debug?.(e), !1; @@ -15869,17 +15869,17 @@ function zg({ onTriggerScan: e, getScanContext: t, onToggleDetails: n, onToggleF }; } // ui/vue/composables/useGridSelection.ts -function Bg(e) { +function Hg(e) { return Array.isArray(e) ? e.map((e) => String(e || "").trim()).filter(Boolean) : []; } -function Vg({ gridContainer: e, readSelectedAssetIds: t = () => [], readActiveAssetId: n = () => "", writeSelectedAssetIds: r = (e) => {}, writeActiveAssetId: i = (e) => {}, onSelectionChanged: a = () => {}, lifecycleSignal: o = null } = {}) { +function Ug({ gridContainer: e, readSelectedAssetIds: t = () => [], readActiveAssetId: n = () => "", writeSelectedAssetIds: r = (e) => {}, writeActiveAssetId: i = (e) => {}, onSelectionChanged: a = () => {}, lifecycleSignal: o = null } = {}) { if (!e) return { restoreSelectionState() {}, dispose() {} }; let s = (e) => { try { - let t = e?.detail || {}, n = Bg(t.selectedIds); + let t = e?.detail || {}, n = Hg(t.selectedIds); r(n), i(String(t.activeId || n[0] || "").trim()); } catch (e) { console.debug?.(e); @@ -15897,7 +15897,7 @@ function Vg({ gridContainer: e, readSelectedAssetIds: t = () => [], readActiveAs } return { restoreSelectionState: ({ scrollTop: r = 0 } = {}) => { - let i = Bg(t()), a = String(n() || i[0] || "").trim(); + let i = Hg(t()), a = String(n() || i[0] || "").trim(); if (i.length || a) { try { typeof e?._mjrSetSelection == "function" && e._mjrSetSelection(i, a); @@ -15914,7 +15914,7 @@ function Vg({ gridContainer: e, readSelectedAssetIds: t = () => [], readActiveAs console.debug?.(e); } try { - Rl(e, a)?.scrollIntoView?.({ + Bl(e, a)?.scrollIntoView?.({ block: "nearest", behavior: "instant" }); @@ -15934,7 +15934,7 @@ function Vg({ gridContainer: e, readSelectedAssetIds: t = () => [], readActiveAs }; } // ui/vue/composables/useAssetsQuery.ts -function Hg(e) { +function Wg(e) { try { if (typeof requestAnimationFrame == "function") { requestAnimationFrame(e); @@ -15945,13 +15945,13 @@ function Hg(e) { } setTimeout(e, 0); } -function Ug(e = {}, t = "*") { +function Gg(e = {}, t = "*") { return e.scope === "output" && !e.collectionId && t === "*" && !e.kindFilter && !e.workflowOnly && !(Number(e.minRating || 0) > 0) && !(Number(e.minSizeMB || 0) > 0) && !(Number(e.maxSizeMB || 0) > 0) && !(Number(e.minWidth || 0) > 0) && !(Number(e.minHeight || 0) > 0) && !(Number(e.maxWidth || 0) > 0) && !(Number(e.maxHeight || 0) > 0) && !String(e.workflowType || "").trim() && !String(e.workflowId || "").trim() && !e.dateRangeFilter && !e.dateExactFilter; } -function Wg({ gridContainer: e, gridWrapper: t, readScrollElement: n = () => null, gridController: r, captureAnchor: i, restoreAnchor: a, restoreGridUiState: o = null, readScrollTop: s = () => 0, restoreSelectionState: c = () => {}, readActiveAssetId: l = () => "", isSidebarOpen: u = () => !1, toggleSidebarDetails: d = () => {}, getQuery: f = () => "*", getScope: p = () => "output", loadAssets: m = null, lifecycleSignal: h = null } = {}) { +function Kg({ gridContainer: e, gridWrapper: t, readScrollElement: n = () => null, gridController: r, captureAnchor: i, restoreAnchor: a, restoreGridUiState: o = null, readScrollTop: s = () => 0, restoreSelectionState: c = () => {}, readActiveAssetId: l = () => "", isSidebarOpen: u = () => !1, toggleSidebarDetails: d = () => {}, getQuery: f = () => "*", getScope: p = () => "output", loadAssets: m = null, lifecycleSignal: h = null } = {}) { let g = 0, _ = !1, v = null, y = null, b = null, x = 0, S = !0, C = "", w = Date.now(), T = () => { try { - return gc(e, (typeof n == "function" ? n() : t) || t || null); + return vc(e, (typeof n == "function" ? n() : t) || t || null); } catch (e) { return console.debug?.(e), !1; } @@ -16040,7 +16040,7 @@ function Wg({ gridContainer: e, gridWrapper: t, readScrollElement: n = () => nul } catch (e) { console.debug?.(e); } - Hg(() => { + Wg(() => { let e = Number(s() || 0) || 0; if (e > 0) try { t.scrollTop = e; @@ -16067,7 +16067,7 @@ function Wg({ gridContainer: e, gridWrapper: t, readScrollElement: n = () => nul if (e && typeof m == "function" && !h?.aborted) { if (!E()) b = t, x = 50; else if (!D() && !O() && String(p() || "output") === "output" && String(f() || "*") === "*") try { - let t = await re(`${st.HEALTH_COUNTERS}?scope=output`, { signal: h || void 0 }); + let t = await re(`${it.HEALTH_COUNTERS}?scope=output`, { signal: h || void 0 }); t?.ok && (t.data?.total_assets || 0) > 0 && await m(e); } catch (e) { console.debug?.(e); @@ -16087,7 +16087,7 @@ function Wg({ gridContainer: e, gridWrapper: t, readScrollElement: n = () => nul c = !0, a = e.last_scan_end, o = e.last_index_end, s = Number(e.total_assets ?? null); return; } - let l = e.last_scan_end && e.last_scan_end !== a, u = e.last_index_end && e.last_index_end !== o, d = Number(e.total_assets ?? null), f = Ug(t, String(n() || "*").trim() || "*"), p = Date.now() - w < 8e3, m = Number.isFinite(d) && Number.isFinite(s) ? d - s : 0, h = Math.max(0, Number(i?.__mjrLastAssetUpsertCount || 0) || 0), g = m >= 20; + let l = e.last_scan_end && e.last_scan_end !== a, u = e.last_index_end && e.last_index_end !== o, d = Number(e.total_assets ?? null), f = Gg(t, String(n() || "*").trim() || "*"), p = Date.now() - w < 8e3, m = Number.isFinite(d) && Number.isFinite(s) ? d - s : 0, h = Math.max(0, Number(i?.__mjrLastAssetUpsertCount || 0) || 0), g = m >= 20; if (Number.isFinite(d) && (s = d), !f || p && D() && !u && !g) { a = e.last_scan_end, o = e.last_index_end; return; @@ -16197,7 +16197,7 @@ function Wg({ gridContainer: e, gridWrapper: t, readScrollElement: n = () => nul }; } // ui/features/panel/panelBootstrap.ts -function Gg(e, { useComfyThemeUI: t }) { +function qg(e, { useComfyThemeUI: t }) { t ? e.classList.add("mjr-assets-manager") : e.classList.remove("mjr-assets-manager"); let n = e.parentElement || null, r = n ? { height: n.style.height, @@ -16209,7 +16209,7 @@ function Gg(e, { useComfyThemeUI: t }) { } catch (e) { console.debug?.(e); } - Yn(); + Zn(); for (let t of [ () => e._eventCleanup?.(), () => e._mjrPopoverManager?.dispose?.(), @@ -16223,7 +16223,7 @@ function Gg(e, { useComfyThemeUI: t }) { console.debug?.(e); } e.replaceChildren(), e.classList.add("mjr-am-container"); - let i = Di(e); + let i = ki(e); try { e._mjrPopoverManager = i; } catch (e) { @@ -16236,10 +16236,10 @@ function Gg(e, { useComfyThemeUI: t }) { }; } // ui/features/panel/panelSettingsSync.ts -function Kg({ container: e, state: t, sidebar: n, browseSection: i, gridWrapper: a, similarBtn: o, setSemanticEnabled: s, similarEnabledTitle: c, similarDisabledTitle: l, refreshGridFn: u, isSidebarOpen: d, readActiveAssetId: f, getSidebarController: m, panelLifecycleAC: h }) { +function Jg({ container: e, state: t, sidebar: n, browseSection: i, gridWrapper: a, similarBtn: o, setSemanticEnabled: s, similarEnabledTitle: c, similarDisabledTitle: l, refreshGridFn: u, isSidebarOpen: d, readActiveAssetId: f, getSidebarController: m, panelLifecycleAC: h }) { let g = "", _ = () => { try { - return !!(Jt()?.ai?.vectorSearchEnabled ?? !0); + return !!(Vn()?.ai?.vectorSearchEnabled ?? !0); } catch { return !0; } @@ -16298,7 +16298,7 @@ function Kg({ container: e, state: t, sidebar: n, browseSection: i, gridWrapper: } } }, b = async (e) => { - let n = String(e || t.scope || "output").toLowerCase(), i = !!Jt()?.watcher?.enabled; + let n = String(e || t.scope || "output").toLowerCase(), i = !!Vn()?.watcher?.enabled; if (n === "custom") try { await r(!1); } catch (e) { @@ -16322,9 +16322,9 @@ function Kg({ container: e, state: t, sidebar: n, browseSection: i, gridWrapper: }, x = (e) => { let n = String(e?.detail?.key || "").trim(), r = n === "__init__", i = r || n.startsWith("grid.") || n.startsWith("infiniteScroll.") || n.startsWith("siblings.") || n.startsWith("search.") || n.startsWith("rtHydrate.") || n.startsWith("workflowMinimap."), a = r || n.startsWith("sidebar.") || n.startsWith("ai."), o = r || n.startsWith("watcher."); try { - let e = Jt(), t = !!(e?.ai?.vectorSearchEnabled ?? !0), o = String(e?.ui?.cardHoverColor || "").trim(), s = String(e?.ui?.cardSelectionColor || "").trim(), c = String(e?.ui?.ratingColor || "").trim(), l = String(e?.ui?.tagColor || "").trim(); + let e = Vn(), t = !!(e?.ai?.vectorSearchEnabled ?? !0), o = String(e?.ui?.cardHoverColor || "").trim(), s = String(e?.ui?.cardSelectionColor || "").trim(), c = String(e?.ui?.ratingColor || "").trim(), l = String(e?.ui?.tagColor || "").trim(); if (/^#[0-9a-fA-F]{3,8}$/.test(o) && document.documentElement.style.setProperty("--mjr-card-hover-color", o), /^#[0-9a-fA-F]{3,8}$/.test(s) && document.documentElement.style.setProperty("--mjr-card-selection-color", s), /^#[0-9a-fA-F]{3,8}$/.test(c) && document.documentElement.style.setProperty("--mjr-rating-color", c), /^#[0-9a-fA-F]{3,8}$/.test(l) && document.documentElement.style.setProperty("--mjr-tag-color", l), y(e.sidebar?.position || "right"), v(t), i) { - let e = Xn() || null; + let e = Qn() || null; if (!r && n.startsWith("siblings.")) try { e?.dispatchEvent(new CustomEvent("mjr:reload-grid")); } catch { @@ -16361,7 +16361,7 @@ function Kg({ container: e, state: t, sidebar: n, browseSection: i, gridWrapper: }; } // ui/features/panel/panelGridEventBindings.ts -function qg({ gridContainer: t, panelLifecycleAC: n, requestQueuedReload: r, notifyContextChanged: i, markUserInteraction: a, writePanelValue: o, popovers: s, collectionsPopover: c, gridController: l, registerSummaryDispose: u }) { +function Yg({ gridContainer: t, panelLifecycleAC: n, requestQueuedReload: r, notifyContextChanged: i, markUserInteraction: a, writePanelValue: o, popovers: s, collectionsPopover: c, gridController: l, registerSummaryDispose: u }) { let d = null; try { d = () => r(), t.addEventListener("mjr:reload-grid", d, { signal: n?.signal }), u(() => { @@ -16454,34 +16454,34 @@ function qg({ gridContainer: t, panelLifecycleAC: n, requestQueuedReload: r, not } } // ui/features/panel/panelSimilarSearch.ts -var Jg = 500; -function Yg(e) { +var Xg = 500; +function Zg(e) { return Number(e?.status || 0) === 404 && String(e?.error || "").toLowerCase().includes("non-json"); } -function Xg(e, t = "") { +function Qg(e, t = "") { let n = Array.isArray(e) ? e : []; - return n.length <= Jg ? { + return n.length <= Xg ? { list: n, title: t, truncated: !1, total: n.length } : { - list: n.slice(0, Jg), - title: `${String(t || "").trim() || "Generation group"} - showing first ${Jg}/${n.length}`, + list: n.slice(0, Xg), + title: `${String(t || "").trim() || "Generation group"} - showing first ${Xg}/${n.length}`, truncated: !0, total: n.length }; } -function Zg(e = {}) { +function $g(e = {}) { let t = String(e?.stackId || e?.stack_id || "").trim(); if (t) return `stack:${t}`; let n = String(e?.asset?.id || "").trim(); return e?.isDupGroup ? n ? `duplicates:${n}` : "duplicates" : n ? `group:${n}` : "group"; } -function Qg(e, t) { +function e_(e, t) { return String(e?.[t] ?? e?.file_info?.[t] ?? "").trim(); } -function $g({ similarBtn: t, similarPopover: n, similarFindBtn: r, similarDuplicatesBtn: i, similarSameNodeBtn: a, similarSameWorkflowBtn: o, gridContainer: s, state: c, panelLifecycleAC: l, isAiEnabled: u, similarDisabledTitle: d, readActiveAssetId: f, readSelectedAssetIds: p, readPanelValue: m, writePanelValue: h, scopeController: g, closePopovers: _, closePeerPopovers: v, popovers: y, workflowIdInput: b, reloadGrid: x, getDuplicatesAlert: S }) { +function t_({ similarBtn: t, similarPopover: n, similarFindBtn: r, similarDuplicatesBtn: i, similarSameNodeBtn: a, similarSameWorkflowBtn: o, gridContainer: s, state: c, panelLifecycleAC: l, isAiEnabled: u, similarDisabledTitle: d, readActiveAssetId: f, readSelectedAssetIds: p, readPanelValue: m, writePanelValue: h, scopeController: g, closePopovers: _, closePeerPopovers: v, popovers: y, workflowIdInput: b, reloadGrid: x, getDuplicatesAlert: S }) { let C = () => String(f() || p()[0] || "").trim(), w = () => { let e = Number(C()); return Number.isFinite(e) && e > 0 ? e : 0; @@ -16507,7 +16507,7 @@ function $g({ similarBtn: t, similarPopover: n, similarFindBtn: r, similarDuplic } catch (e) { return console.debug?.(e), null; } - }, k = async (e, t) => e && t.some((t) => Qg(e, t)) ? e : await O() || e, A = (e = {}) => (Array.isArray(e?.files) ? e.files : []).map((e) => ({ + }, k = async (e, t) => e && t.some((t) => e_(e, t)) ? e : await O() || e, A = (e = {}) => (Array.isArray(e?.files) ? e.files : []).map((e) => ({ filename: String(e?.filename || "").trim(), subfolder: String(e?.subfolder || "").trim().replace(/\\/g, "/"), type: String(e?.type || "").trim().toLowerCase() @@ -16516,7 +16516,7 @@ function $g({ similarBtn: t, similarPopover: n, similarFindBtn: r, similarDuplic for (let e of n.slice(0, 4)) { let t = e.type === "input" ? "input" : "output"; try { - let n = await re(et({ + let n = await re(Ke({ q: e.filename, scope: t, limit: 50, @@ -16555,13 +16555,13 @@ function $g({ similarBtn: t, similarPopover: n, similarFindBtn: r, similarDuplic } if (!n) await j(t, r); else try { - let i = await re(ct(n, { + let i = await re(Je(n, { jobId: t?.jobId || t?.job_id || "", latest: t?.latest !== !1, limit: 500 }), { timeoutMs: 3e4 }); if (!i?.ok) { - if (Yg(i)) { + if (Zg(i)) { if (r.length) { await j(t, r); return; @@ -16646,12 +16646,12 @@ function $g({ similarBtn: t, similarPopover: n, similarFindBtn: r, similarDuplic let i = (S?.() || {})?.firstGroup; i && Array.isArray(i.assets) && i.assets.length >= 2 ? (h("similarResults", i.assets), h("similarSourceAssetId", "duplicates"), h("similarTitle", R("search.duplicateResults", "Duplicates ({n} assets)", { n: i.assets.length })), await g?.setScope?.("similar")) : e(R("search.noKnownDuplicates", "No duplicate group is available yet. Run duplicate analysis from the duplicate alert first."), "info", 3200); }, ee = async () => { - let t = await k(await D(), ["source_node_id", "source_node_type"]), n = Qg(t, "source_node_id"); + let t = await k(await D(), ["source_node_id", "source_node_type"]), n = e_(t, "source_node_id"); n ? await M({ sourceNodeId: n, - sourceNodeType: Qg(t, "source_node_type"), - jobId: Qg(t, "job_id"), - title: Qg(t, "source_node_type") || n + sourceNodeType: e_(t, "source_node_type"), + jobId: e_(t, "job_id"), + title: e_(t, "source_node_type") || n }) : e(R("search.noSourceNode", "Selected asset has no persisted source node id."), "info", 2600); }, te = async () => { try { @@ -16659,7 +16659,7 @@ function $g({ similarBtn: t, similarPopover: n, similarFindBtn: r, similarDuplic } catch (e) { console.debug?.(e); } - let t = Qg(await k(await D(), ["workflow_id"]), "workflow_id"); + let t = e_(await k(await D(), ["workflow_id"]), "workflow_id"); if (!t) e(R("search.noWorkflowId", "Selected asset has no persisted workflow id."), "info", 2600); else { h("workflowId", t); @@ -16692,8 +16692,8 @@ function $g({ similarBtn: t, similarPopover: n, similarFindBtn: r, similarDuplic }; F(r, N), F(i, P), F(a, ee), F(o, te), s?.addEventListener(V.OPEN_STACK_GROUP, async (t) => { try { - let n = t?.detail || {}, r = Array.isArray(n?.members) ? n.members : [], i = `Generation group (${r.length} assets)`, a = Xg(r, String(n?.title || "").trim() || i); - a.truncated && e(`Large stack truncated to ${Jg}/${a.total} assets to keep the grid responsive.`, "warn", 5e3), h("similarResults", a.list), h("similarSourceAssetId", Zg(n)), h("similarTitle", a.title || i), await Promise.resolve(), await g?.setScope?.("similar"); + let n = t?.detail || {}, r = Array.isArray(n?.members) ? n.members : [], i = `Generation group (${r.length} assets)`, a = Qg(r, String(n?.title || "").trim() || i); + a.truncated && e(`Large stack truncated to ${Xg}/${a.total} assets to keep the grid responsive.`, "warn", 5e3), h("similarResults", a.list), h("similarSourceAssetId", $g(n)), h("similarTitle", a.title || i), await Promise.resolve(), await g?.setScope?.("similar"); } catch (e) { console.debug?.(e); } @@ -16716,7 +16716,7 @@ function $g({ similarBtn: t, similarPopover: n, similarFindBtn: r, similarDuplic } } // ui/features/panel/panelPinnedFolders.ts -function e_({ pinnedFoldersBtn: t, pinnedFoldersController: n = null, pinnedFoldersMenu: r = null, pinnedFoldersPopover: i, popovers: a, closeOtherPopovers: o, state: s, gridContainer: c, customSelect: l, scopeController: u, customRootsController: d, gridController: f, applyWatcherForScope: p, refreshDuplicateAlerts: m, notifyContextChanged: h, panelLifecycleAC: g }) { +function n_({ pinnedFoldersBtn: t, pinnedFoldersController: n = null, pinnedFoldersMenu: r = null, pinnedFoldersPopover: i, popovers: a, closeOtherPopovers: o, state: s, gridContainer: c, customSelect: l, scopeController: u, customRootsController: d, gridController: f, applyWatcherForScope: p, refreshDuplicateAlerts: m, notifyContextChanged: h, panelLifecycleAC: g }) { let _ = (e) => { let t = String(e?.id || "").trim(); if (!t) return null; @@ -16728,7 +16728,7 @@ function e_({ pinnedFoldersBtn: t, pinnedFoldersController: n = null, pinnedFold }; }, v = async () => { try { - let e = await re(st.CUSTOM_ROOTS, g?.signal ? { signal: g.signal } : void 0); + let e = await re(it.CUSTOM_ROOTS, g?.signal ? { signal: g.signal } : void 0); return e?.ok && Array.isArray(e.data) ? e.data.map(_).filter(Boolean) : []; } catch (e) { return console.debug?.(e), []; @@ -16776,7 +16776,7 @@ function e_({ pinnedFoldersBtn: t, pinnedFoldersController: n = null, pinnedFold if (!r) return; let i = String(t?.label || t?.path || r).trim(); if (!await Ut(R("dialog.unpinFolder", "Unpin folder \"{name}\"?", { name: i }))) return; - let a = await L(st.CUSTOM_ROOTS_REMOVE, { id: r }); + let a = await L(it.CUSTOM_ROOTS_REMOVE, { id: r }); if (!a?.ok) e(a?.error || R("toast.unpinFolderFailed", "Failed to unpin folder"), "error"); else { String(s.customRootId || "") === r && (s.customRootId = "", s.customRootLabel = "", s.currentFolderRelativePath = ""); @@ -16836,8 +16836,8 @@ function e_({ pinnedFoldersBtn: t, pinnedFoldersController: n = null, pinnedFold }, { signal: g?.signal }); } // ui/features/filters/calendar/AgendaCalendar.ts -var t_ = (e) => String(e).padStart(2, "0"); -function n_(e) { +var r_ = (e) => String(e).padStart(2, "0"); +function i_(e) { try { let t = String(e || "").trim(); if (!/^\d{4}-\d{2}-\d{2}$/.test(t)) return null; @@ -16849,50 +16849,50 @@ function n_(e) { return null; } } -function r_(e) { +function a_(e) { try { let t = e.getFullYear(), n = e.getMonth() + 1, r = e.getDate(); - return `${t}-${t_(n)}-${t_(r)}`; + return `${t}-${r_(n)}-${r_(r)}`; } catch { return ""; } } -function i_(e) { +function o_(e) { try { - return `${e.getFullYear()}-${t_(e.getMonth() + 1)}`; + return `${e.getFullYear()}-${r_(e.getMonth() + 1)}`; } catch { return ""; } } -function a_(e) { +function s_(e) { try { return new Date(e.getFullYear(), e.getMonth(), 1); } catch { return /* @__PURE__ */ new Date(); } } -function o_(e, t) { +function c_(e, t) { try { return new Date(e.getFullYear(), e.getMonth() + t, 1); } catch { return /* @__PURE__ */ new Date(); } } -function s_(e) { +function l_(e) { try { return new Date(e.getFullYear(), e.getMonth() + 1, 0).getDate(); } catch { return 31; } } -function c_(e) { +function u_(e) { try { return (e.getDay() + 6) % 7; } catch { return 0; } } -function l_(e, t) { +function d_(e, t) { if (e) try { let n = String(e.value || ""); e.value = t || "", n !== e.value && e.dispatchEvent?.(new Event("change", { bubbles: !0 })); @@ -16900,14 +16900,14 @@ function l_(e, t) { console.debug?.(e); } } -async function u_({ state: e, monthKey: t }) { +async function f_({ state: e, monthKey: t }) { try { let n = String(e?.scope || "output"); if (n === "collection") return { ok: !0, days: {} }; - let r = String(e?.currentFolderRelativePath || "").trim(), i = n === "custom" && !e?.customRootId ? null : r || null, a = at({ + let r = String(e?.currentFolderRelativePath || "").trim(), i = n === "custom" && !e?.customRootId ? null : r || null, a = Qe({ scope: n, customRootId: e?.customRootId || null, subfolder: i, @@ -16939,7 +16939,7 @@ async function u_({ state: e, monthKey: t }) { }; } } -function d_({ container: e, hiddenInput: t, state: n, onRequestReloadGrid: r = null } = {}) { +function p_({ container: e, hiddenInput: t, state: n, onRequestReloadGrid: r = null } = {}) { if (!e || !(e instanceof HTMLElement) || !t) return { dispose() {}, refresh() {} @@ -16962,7 +16962,7 @@ function d_({ container: e, hiddenInput: t, state: n, onRequestReloadGrid: r = n d.type = "button", d.className = "mjr-btn mjr-agenda-clear", d.textContent = R("action.clear", "Clear"); let f = document.createElement("button"); f.type = "button", f.className = "mjr-btn mjr-agenda-refresh", f.textContent = R("action.refresh", "Refresh"), u.appendChild(d), u.appendChild(f), i.appendChild(a), i.appendChild(l), i.appendChild(u), e.appendChild(i); - let p = a_(n_(t.value) || /* @__PURE__ */ new Date()), m = {}, h = 0, g = !1, _ = () => { + let p = s_(i_(t.value) || /* @__PURE__ */ new Date()), m = {}, h = 0, g = !1, _ = () => { if (g) return; let e = p.getFullYear(), n = p.getMonth(); s.textContent = p.toLocaleString(void 0, { @@ -16982,13 +16982,13 @@ function d_({ container: e, hiddenInput: t, state: n, onRequestReloadGrid: r = n let t = document.createElement("div"); t.className = "mjr-agenda-weekday", t.textContent = e, l.appendChild(t); } - let i = c_(new Date(e, n, 1)), a = s_(p), o = n_(t.value), c = o ? r_(o) : ""; + let i = u_(new Date(e, n, 1)), a = l_(p), o = i_(t.value), c = o ? a_(o) : ""; for (let e = 0; e < i; e++) { let e = document.createElement("div"); e.className = "mjr-agenda-day mjr-agenda-day--blank", l.appendChild(e); } for (let r = 1; r <= a; r++) { - let i = r_(new Date(e, n, r)), a = Number(m?.[i] || 0) || 0, o = document.createElement("button"); + let i = a_(new Date(e, n, r)), a = Number(m?.[i] || 0) || 0, o = document.createElement("button"); if (o.type = "button", o.className = "mjr-agenda-day", o.textContent = String(r), o.dataset.date = i, a > 0) { o.classList.add("mjr-agenda-day--has-assets"); let e = R(a === 1 ? "tooltip.assetsDaySingular" : "tooltip.assetsDayPlural", a === 1 ? "{count} asset" : "{count} assets", { count: a }); @@ -16997,26 +16997,26 @@ function d_({ container: e, hiddenInput: t, state: n, onRequestReloadGrid: r = n t.className = "mjr-agenda-day-badge", t.textContent = a > 99 ? "99+" : String(a), t.setAttribute("aria-label", e), o.appendChild(t); } else o.title = R("tooltip.noAssetsDay", "No assets on this day"); i === c && o.classList.add("mjr-agenda-day--selected"), o.addEventListener("click", () => { - l_(t, String(t.value || "").trim() === i ? "" : i); + d_(t, String(t.value || "").trim() === i ? "" : i); }), l.appendChild(o); } }, v = async () => { if (g) return; - let e = i_(p); + let e = o_(p); if (!e) return; h += 1; - let t = h, r = await u_({ + let t = h, r = await f_({ state: n, monthKey: e }); g || t === h && (m = r.ok && r.days || {}, _()); }; return o.addEventListener("click", async () => { - p = o_(p, -1), await v(); + p = c_(p, -1), await v(); }), c.addEventListener("click", async () => { - p = o_(p, 1), await v(); + p = c_(p, 1), await v(); }), d.addEventListener("click", () => { - l_(t, ""); + d_(t, ""); try { r?.(); } catch (e) { @@ -17025,9 +17025,9 @@ function d_({ container: e, hiddenInput: t, state: n, onRequestReloadGrid: r = n }), f.addEventListener("click", async () => { await v(); }), t.addEventListener("change", () => { - let e = n_(t.value); + let e = i_(t.value); if (e) { - let t = a_(e); + let t = s_(e); (t.getFullYear() !== p.getFullYear() || t.getMonth() !== p.getMonth()) && (p = t); } _(); @@ -17044,14 +17044,14 @@ function d_({ container: e, hiddenInput: t, state: n, onRequestReloadGrid: r = n }; } // ui/features/panel/controllers/filtersController.ts -var f_ = (e) => { +var m_ = (e) => { let t = String(e ?? "").trim(); if (!t) return 0; let n = t.replace(",", "."), r = Number(n); return Number.isFinite(r) ? r : 0; }; -function p_({ state: e, kindSelect: t, wfCheckbox: n, workflowTypeSelect: r, workflowIdInput: i, workflowModelInput: a, workflowRunsOnSelect: o, ratingSelect: s, minSizeInput: c, maxSizeInput: l, resolutionPresetSelect: u, minWidthInput: d, minHeightInput: f, maxWidthInput: p, maxHeightInput: m, dateRangeSelect: h, dateExactInput: g, reloadGrid: _, reconcileSelection: v = null, onFiltersChanged: y = null, lifecycleSignal: b = null }) { - let { write: x } = dh(e, [ +function h_({ state: e, kindSelect: t, wfCheckbox: n, workflowTypeSelect: r, workflowIdInput: i, workflowModelInput: a, workflowRunsOnSelect: o, ratingSelect: s, minSizeInput: c, maxSizeInput: l, resolutionPresetSelect: u, minWidthInput: d, minHeightInput: f, maxWidthInput: p, maxHeightInput: m, dateRangeSelect: h, dateExactInput: g, reloadGrid: _, reconcileSelection: v = null, onFiltersChanged: y = null, lifecycleSignal: b = null }) { + let { write: x } = ph(e, [ "kindFilter", "workflowOnly", "minRating", @@ -17163,7 +17163,7 @@ function p_({ state: e, kindSelect: t, wfCheckbox: n, workflowTypeSelect: r, wor C(); }, b ? { signal: b } : void 0); let E = () => { - let e = f_(c?.value || 0), t = f_(l?.value || 0), n = Number.isFinite(e) && e > 0 ? e : 0, r = Number.isFinite(t) && t > 0 ? t : 0; + let e = m_(c?.value || 0), t = m_(l?.value || 0), n = Number.isFinite(e) && e > 0 ? e : 0, r = Number.isFinite(t) && t > 0 ? t : 0; r > 0 && n > 0 && r < n && (r = n, l && (l.value = String(r))), x("minSizeMB", n), x("maxSizeMB", r); try { y?.(); @@ -17174,7 +17174,7 @@ function p_({ state: e, kindSelect: t, wfCheckbox: n, workflowTypeSelect: r, wor }; T(c, "change", E, b ? { signal: b } : void 0), T(l, "change", E, b ? { signal: b } : void 0); let D = () => { - let e = f_(d?.value || 0), t = f_(f?.value || 0), n = f_(p?.value || 0), r = f_(m?.value || 0), i = Number.isFinite(e) && e > 0 ? Math.round(e) : 0, a = Number.isFinite(t) && t > 0 ? Math.round(t) : 0, o = Number.isFinite(n) && n > 0 ? Math.round(n) : 0, s = Number.isFinite(r) && r > 0 ? Math.round(r) : 0; + let e = m_(d?.value || 0), t = m_(f?.value || 0), n = m_(p?.value || 0), r = m_(m?.value || 0), i = Number.isFinite(e) && e > 0 ? Math.round(e) : 0, a = Number.isFinite(t) && t > 0 ? Math.round(t) : 0, o = Number.isFinite(n) && n > 0 ? Math.round(n) : 0, s = Number.isFinite(r) && r > 0 ? Math.round(r) : 0; o > 0 && i > 0 && o < i && (o = i, p && (p.value = String(o))), s > 0 && a > 0 && s < a && (s = a, m && (m.value = String(s))), x("minWidth", i), x("minHeight", a), x("maxWidth", o), x("maxHeight", s); try { u && (u.value = { @@ -17258,7 +17258,7 @@ function p_({ state: e, kindSelect: t, wfCheckbox: n, workflowTypeSelect: r, wor }; } // ui/features/panel/panelFiltersInit.ts -function m_({ state: e, hasVueHeaderSection: t, kindSelect: n, wfCheckbox: r, workflowTypeSelect: i, workflowIdInput: a, workflowModelInput: o, workflowRunsOnSelect: s, ratingSelect: c, minSizeInput: l, maxSizeInput: u, resolutionPresetSelect: d, minWidthInput: f, minHeightInput: p, maxWidthInput: m, maxHeightInput: h, dateRangeSelect: g, dateExactInput: _, agendaContainer: v, gridController: y, reconcileVisibleSelection: b, exitSimilarViewIfActive: x, notifyContextChanged: S, panelLifecycleAC: C, popovers: w = null, filterPopover: T = null }) { +function g_({ state: e, hasVueHeaderSection: t, kindSelect: n, wfCheckbox: r, workflowTypeSelect: i, workflowIdInput: a, workflowModelInput: o, workflowRunsOnSelect: s, ratingSelect: c, minSizeInput: l, maxSizeInput: u, resolutionPresetSelect: d, minWidthInput: f, minHeightInput: p, maxWidthInput: m, maxHeightInput: h, dateRangeSelect: g, dateExactInput: _, agendaContainer: v, gridController: y, reconcileVisibleSelection: b, exitSimilarViewIfActive: x, notifyContextChanged: S, panelLifecycleAC: C, popovers: w = null, filterPopover: T = null }) { let E = null; try { try { @@ -17268,7 +17268,7 @@ function m_({ state: e, hasVueHeaderSection: t, kindSelect: n, wfCheckbox: r, wo } catch (e) { console.debug?.(e); } - E = d_({ + E = p_({ container: v, hiddenInput: _, state: e, @@ -17309,7 +17309,7 @@ function m_({ state: e, hasVueHeaderSection: t, kindSelect: n, wfCheckbox: r, wo D = () => { e &&= (clearTimeout(e), null); }; - } else D = p_({ + } else D = h_({ state: e, kindSelect: n, wfCheckbox: r, @@ -17346,7 +17346,7 @@ function m_({ state: e, hasVueHeaderSection: t, kindSelect: n, wfCheckbox: r, wo }; } // ui/features/panel/panelContextMenuExtraActions.ts -function h_({ state: t, scopeController: n, browserNav: r, gridController: i, getDuplicatesAlert: a, refreshDuplicateAlerts: o }) { +function __({ state: t, scopeController: n, browserNav: r, gridController: i, getDuplicatesAlert: a, refreshDuplicateAlerts: o }) { return { clearSimilarScope: async () => { try { @@ -17396,15 +17396,15 @@ function h_({ state: t, scopeController: n, browserNav: r, gridController: i, ge }; } // ui/features/panel/panelRuntime.ts -async function g_(e, { useComfyThemeUI: t = !0, external: n = {} } = {}) { - return __(e, { +async function v_(e, { useComfyThemeUI: t = !0, external: n = {} } = {}) { + return y_(e, { useComfyThemeUI: t, external: n }); } -async function __(t, { useComfyThemeUI: n = !0, external: r = {} } = {}) { - Rp("panelRender"), Vp("panelRender"); - let i = typeof AbortController < "u" ? new AbortController() : null, { popovers: a, hostWrapper: o, hostWrapperPrevStyle: s } = Gg(t, { useComfyThemeUI: n }), c = uh(); +async function y_(t, { useComfyThemeUI: n = !0, external: r = {} } = {}) { + Bp("panelRender"), Up("panelRender"); + let i = typeof AbortController < "u" ? new AbortController() : null, { popovers: a, hostWrapper: o, hostWrapperPrevStyle: s } = qg(t, { useComfyThemeUI: n }), c = fh(); if (!c) throw Error("[Majoor] mountAssetsManagerPanelRuntime requires an active Pinia panel store"); for (let e of [ "statusSection", @@ -17420,7 +17420,7 @@ async function __(t, { useComfyThemeUI: n = !0, external: r = {} } = {}) { "gridContainer", "sidebar" ]) if (!r?.[e]) throw Error(`[Majoor] mountAssetsManagerPanelRuntime now requires external.${e}`); - let l = dh(null, [ + let l = ph(null, [ "searchQuery", "scrollTop", "scope", @@ -17449,7 +17449,7 @@ async function __(t, { useComfyThemeUI: n = !0, external: r = {} } = {}) { l.write("searchQuery", e.target.value); }, { signal: i?.signal }); let Ue = r.summaryBar, We = r.updateSummaryBar, Ge = r.folderBreadcrumb, Ke = r.folderBreadcrumbController || null, qe = r.statusSection, Je = r.statusDot, Ye = r.statusText, Xe = r.capabilitiesSection, Ze = r.browseSection, Qe = r.gridWrapper, $e = r.sidebar; - Jt(); + Vn(); let et = document.createElement("div"); et.classList.add("mjr-am-content"); let z = null, B = null; @@ -17460,9 +17460,9 @@ async function __(t, { useComfyThemeUI: n = !0, external: r = {} } = {}) { } catch { nt = 0; } - }, it = typeof r?.bindGridHostState == "function" && typeof r?.restoreGridUiState == "function", at = !it; + }, at = typeof r?.bindGridHostState == "function" && typeof r?.restoreGridUiState == "function", ot = !at; Qe.addEventListener("scroll", () => { - rt(), at && (tt && clearTimeout(tt), tt = setTimeout(() => { + rt(), ot && (tt && clearTimeout(tt), tt = setTimeout(() => { try { l.write("scrollTop", Qe.scrollTop); } catch (e) { @@ -17472,17 +17472,17 @@ async function __(t, { useComfyThemeUI: n = !0, external: r = {} } = {}) { }, { passive: !0, signal: i?.signal - }), z = r.gridContainer, z.parentElement !== Qe && Qe.appendChild(z), $n(z); + }), z = r.gridContainer, z.parentElement !== Qe && Qe.appendChild(z), tr(z); try { z.dataset.mjrScope = String(d("scope", c.scope || "output") || "output"); } catch (e) { console.debug?.(e); } - let ot = [], ct = (e) => { - typeof e == "function" && ot.push(e); + let st = [], ct = (e) => { + typeof e == "function" && st.push(e); }; z._mjrSummaryBarDispose = () => { - for (let e of ot.splice(0)) try { + for (let e of st.splice(0)) try { e(); } catch (e) { console.debug?.(e); @@ -17509,17 +17509,17 @@ async function __(t, { useComfyThemeUI: n = !0, external: r = {} } = {}) { } catch (e) { console.debug?.(e); } - let lt = r.loadAssets ?? hi, ut = r.loadAssetsFromList ?? gi, dt = r.prepareGridForScopeSwitch ?? _i, ft = r.disposeGrid ?? vi, pt = r.refreshGrid ?? yi, mt = r.captureAnchor ?? bi, gt = r.restoreAnchor ?? xi, _t = r.hydrateGridFromSnapshot ?? mi; + let lt = r.loadAssets ?? _i, ut = r.loadAssetsFromList ?? vi, dt = r.prepareGridForScopeSwitch ?? yi, ft = r.disposeGrid ?? bi, pt = r.refreshGrid ?? xi, mt = r.captureAnchor ?? Si, gt = r.restoreAnchor ?? Ci, _t = r.hydrateGridFromSnapshot ?? gi; if (typeof r?.onGridContainerReady == "function") try { r.onGridContainerReady(z, { getState: () => c }); } catch (e) { console.debug?.(e); } - else t._mjrGridContextMenuUnbind = Ia({ + else t._mjrGridContextMenuUnbind = Ra({ gridContainer: z, getState: () => c }); - let vt = R("search.findSimilar", "Find Similar"), yt = R("search.similarDisabled", "AI features are disabled in settings"), { applyWatcherForScope: bt, isAiEnabled: xt } = Kg({ + let vt = R("search.findSimilar", "Find Similar"), yt = R("search.similarDisabled", "AI features are disabled in settings"), { applyWatcherForScope: bt, isAiEnabled: xt } = Jg({ container: t, state: c, sidebar: $e, @@ -17542,7 +17542,7 @@ async function __(t, { useComfyThemeUI: n = !0, external: r = {} } = {}) { console.debug?.(e); } t._mjrVersionUpdateCleanup = Ve || g._mjrVersionUpdateCleanup, t.appendChild(et); - let St = () => fg(Ne), Ct = pg({ + let St = () => mg(Ne), Ct = hg({ gridContainer: z, loadAssets: lt, loadAssetsFromList: ut, @@ -17583,7 +17583,7 @@ async function __(t, { useComfyThemeUI: n = !0, external: r = {} } = {}) { } It(); }; - it || (Mt = Vg({ + at || (Mt = Ug({ gridContainer: z, readSelectedAssetIds: p, readActiveAssetId: () => m(), @@ -17593,7 +17593,7 @@ async function __(t, { useComfyThemeUI: n = !0, external: r = {} } = {}) { rt(), Lt(); }, lifecycleSignal: i?.signal || null - })), At = mg({ + })), At = gg({ state: c, gridContainer: z, folderBreadcrumb: Ge, @@ -17643,7 +17643,7 @@ async function __(t, { useComfyThemeUI: n = !0, external: r = {} } = {}) { console.debug?.(e); } }, zt = null; - qg({ + Yg({ gridContainer: z, panelLifecycleAC: i, requestQueuedReload: () => { @@ -17653,7 +17653,7 @@ async function __(t, { useComfyThemeUI: n = !0, external: r = {} } = {}) { console.debug?.(e); } zt = setTimeout(() => { - zt = null, tn().catch((e) => { + zt = null, en().catch((e) => { try { console.warn("[Majoor] queuedReload failed", e); } catch (e) { @@ -17670,7 +17670,7 @@ async function __(t, { useComfyThemeUI: n = !0, external: r = {} } = {}) { gridController: Ct, registerSummaryDispose: ct }); - let Bt = yg({ + let Bt = xg({ state: c, customSelect: E, customRemoveBtn: O, @@ -17679,7 +17679,7 @@ async function __(t, { useComfyThemeUI: n = !0, external: r = {} } = {}) { comfyToast: e, get: re, post: L, - ENDPOINTS: st, + ENDPOINTS: it, reloadGrid: Ct.reloadGrid, onRootChanged: async () => { try { @@ -17722,7 +17722,7 @@ async function __(t, { useComfyThemeUI: n = !0, external: r = {} } = {}) { console.debug?.(e); } }; - Tt = hg({ + Tt = _g({ state: c, tabButtons: _, customMenuBtn: v, @@ -17763,7 +17763,7 @@ async function __(t, { useComfyThemeUI: n = !0, external: r = {} } = {}) { console.debug?.(e); } try { - await Dm(Je, Ye, Xe, { + await km(Je, Ye, Xe, { scope: d("scope", c.scope || "output"), customRootId: d("customRootId", c.customRootId || "") }, null, { signal: i?.signal || null }); @@ -17782,7 +17782,7 @@ async function __(t, { useComfyThemeUI: n = !0, external: r = {} } = {}) { }; Object.values(_).forEach((e) => { e.addEventListener("click", () => Tt.setScope(e.dataset.scope), { signal: i?.signal }); - }), lg({ + }), dg({ messageBtn: C, messagePopover: xe, title: be, @@ -17818,7 +17818,7 @@ async function __(t, { useComfyThemeUI: n = !0, external: r = {} } = {}) { Pe ]), a.setOnVisibilityChanged?.(() => It()); try { - window.addEventListener(Gn, (e) => { + window.addEventListener(qn, (e) => { Pt = !!e?.detail?.open, It(); }, { signal: i?.signal }); } catch (e) { @@ -17831,7 +17831,7 @@ async function __(t, { useComfyThemeUI: n = !0, external: r = {} } = {}) { }, { signal: i?.signal }), x.addEventListener("click", (e) => { e.stopPropagation(), a.close(T), a.close(k), a.close(pe), a.close(xe), a.close(Fe), a.toggle(ge, x); }, { signal: i?.signal }); - let Kt = He ? null : bg({ + let Kt = He ? null : Sg({ state: c, sortBtn: b, sortMenu: me, @@ -17844,7 +17844,7 @@ async function __(t, { useComfyThemeUI: n = !0, external: r = {} } = {}) { a.close(T), a.close(k), a.close(ge), a.close(xe), a.close(Fe); } }) : b.addEventListener("click", (e) => { e.stopPropagation(), a.close(T), a.close(k), a.close(ge), a.close(xe), a.close(Fe), a.toggle(pe, b); - }, { signal: i?.signal }), $g({ + }, { signal: i?.signal }), t_({ similarBtn: Pe, similarPopover: Fe, similarFindBtn: Ie, @@ -17871,7 +17871,7 @@ async function __(t, { useComfyThemeUI: n = !0, external: r = {} } = {}) { workflowIdInput: P, reloadGrid: () => Ct.reloadGrid(), getDuplicatesAlert: () => Dt - }), e_({ + }), n_({ pinnedFoldersBtn: S, pinnedFoldersController: ve, pinnedFoldersMenu: ye, @@ -17891,7 +17891,7 @@ async function __(t, { useComfyThemeUI: n = !0, external: r = {} } = {}) { notifyContextChanged: Lt, panelLifecycleAC: i }); - let { agendaCalendar: qt, disposeFilters: Yt } = m_({ + let { agendaCalendar: qt, disposeFilters: Jt } = g_({ state: c, hasVueHeaderSection: He, kindSelect: A, @@ -17918,7 +17918,7 @@ async function __(t, { useComfyThemeUI: n = !0, external: r = {} } = {}) { panelLifecycleAC: i, popovers: a, filterPopover: k - }), Xt = h_({ + }), Yt = __({ state: c, scopeController: Tt, browserNav: At, @@ -17927,7 +17927,7 @@ async function __(t, { useComfyThemeUI: n = !0, external: r = {} } = {}) { refreshDuplicateAlerts: Rt }); try { - Et = vg({ + Et = bg({ state: c, gridContainer: z, filterBtn: y, @@ -17955,13 +17955,13 @@ async function __(t, { useComfyThemeUI: n = !0, external: r = {} } = {}) { updateSummaryBar: We, reloadGrid: () => Ct.reloadGrid(), getExtraContext: () => ({ duplicatesAlert: Dt }), - extraActions: Xt + extraActions: Yt }); } catch (e) { console.debug?.(e); } try { - if (Lt(), it) ct(r.bindGridHostState({ + if (Lt(), at) ct(r.bindGridHostState({ onContextChanged: Lt, markUserInteraction: rt })); @@ -18001,20 +18001,20 @@ async function __(t, { useComfyThemeUI: n = !0, external: r = {} } = {}) { } catch (e) { console.debug?.(e); } - B = Rg({ + B = Bg({ gridContainer: z, sidebar: $e, createRatingBadge: ht, createTagsBadge: Vt, - showAssetInSidebar: Zm, - closeSidebar: Qm, + showAssetInSidebar: $m, + closeSidebar: eh, state: c }); - let Zt = { + let Xt = { gridController: Ct, captureAnchor: mt, restoreAnchor: gt, - restoreGridUiState: it ? (e) => r.restoreGridUiState(e, { onRestoreSidebar: () => { + restoreGridUiState: at ? (e) => r.restoreGridUiState(e, { onRestoreSidebar: () => { try { B?.toggleDetails?.(); } catch (e) { @@ -18035,14 +18035,14 @@ async function __(t, { useComfyThemeUI: n = !0, external: r = {} } = {}) { loadAssets: lt, lifecycleSignal: i?.signal || null }; - Nt = typeof r?.initAssetsQueryController == "function" ? r.initAssetsQueryController(Zt) : Wg({ + Nt = typeof r?.initAssetsQueryController == "function" ? r.initAssetsQueryController(Xt) : Kg({ gridContainer: z, gridWrapper: Qe, - ...Zt + ...Xt }); - let Qt = zg({ + let Zt = Vg({ onTriggerScan: (e) => { - ym(Je, Ye, Xe, e || {}); + xm(Je, Ye, Xe, e || {}); }, onToggleDetails: () => { B?.toggleDetails?.(); @@ -18075,18 +18075,18 @@ async function __(t, { useComfyThemeUI: n = !0, external: r = {} } = {}) { scope: l.read("scope", c.scope), customRootId: l.read("customRootId", c.customRootId) }) - }), $t = Ua({ + }), Qt = Ga({ gridContainer: z, createRatingBadge: ht - }), en = null; + }), $t = null; if (t._eventCleanup) try { t._eventCleanup(); } catch (e) { console.debug?.(e); } - Qt.bind(et), $t.bind(), N("grid"); + Zt.bind(et), Qt.bind(), N("grid"); try { - t._mjrHotkeys = Qt, t._mjrRatingHotkeys = $t, t._mjrSidebarController = B; + t._mjrHotkeys = Zt, t._mjrRatingHotkeys = Qt, t._mjrSidebarController = B; } catch (e) { console.debug?.(e); } @@ -18113,12 +18113,12 @@ async function __(t, { useComfyThemeUI: n = !0, external: r = {} } = {}) { console.debug?.(e); } try { - Qt.dispose(); + Zt.dispose(); } catch (e) { console.debug?.(e); } try { - $t.dispose(); + Qt.dispose(); } catch (e) { console.debug?.(e); } @@ -18129,16 +18129,16 @@ async function __(t, { useComfyThemeUI: n = !0, external: r = {} } = {}) { console.debug?.(e); } try { - Yt?.(); + Jt?.(); } catch (e) { console.debug?.(e); } try { - en?.(); + $t?.(); } catch (e) { console.debug?.(e); } - en = null; + $t = null; try { $e?.dispose?.(); } catch (e) { @@ -18201,7 +18201,7 @@ async function __(t, { useComfyThemeUI: n = !0, external: r = {} } = {}) { } catch (e) { console.debug?.(e); } - Yn(z), z = null; + Zn(z), z = null; try { a.dispose(); } catch (e) { @@ -18218,19 +18218,19 @@ async function __(t, { useComfyThemeUI: n = !0, external: r = {} } = {}) { console.debug?.(e); } }; - let tn = async () => { + let en = async () => { await Nt?.queuedReload?.(); }; - Lm(Je, Ye, qe, Xe, Nt?.createCountersUpdateHandler?.({ + zm(Je, Ye, qe, Xe, Nt?.createCountersUpdateHandler?.({ state: c, getStableQuery: () => String(z?.dataset?.mjrQuery || "*").trim() || "*", getRecentUserInteractionAt: () => Number(nt || 0) }) ?? (async () => { - await tn(); + await en(); }), () => ({ scope: l.read("scope", c.scope), customRootId: l.read("customRootId", c.customRootId) - })), Tt.setActiveTabStyles(), At?.renderBreadcrumb?.(), Bt.refreshCustomRoots().catch(() => {}), en = Nt?.bindSearchInput?.({ + })), Tt.setActiveTabStyles(), At?.renderBreadcrumb?.(), Bt.refreshCustomRoots().catch(() => {}), $t = Nt?.bindSearchInput?.({ searchInputEl: Ne, lifecycleSignal: i?.signal || null, debounceMs: 120, @@ -18241,17 +18241,17 @@ async function __(t, { useComfyThemeUI: n = !0, external: r = {} } = {}) { Gt({ reload: !1 }), Lt(); }, startSearchTimer: () => { - Rp("searchQuery"); + Bp("searchQuery"); }, reloadGrid: () => { Ct.reloadGrid(); } }); - let nn = !1; + let tn = !1; try { - nn = await _t(z, { + tn = await _t(z, { scope: d("scope", c.scope || "output") || "output", - query: String(fg(l.read("searchQuery", c.searchQuery || "*") || "*") || "*"), + query: String(mg(l.read("searchQuery", c.searchQuery || "*") || "*") || "*"), customRootId: d("customRootId", c.customRootId || "") || "", subfolder: d("currentFolderRelativePath", c.currentFolderRelativePath || "") || "", collectionId: d("collectionId", c.collectionId || "") || "", @@ -18277,21 +18277,21 @@ async function __(t, { useComfyThemeUI: n = !0, external: r = {} } = {}) { } catch (e) { console.debug?.(e); } - let rn = !1; + let nn = !1; try { - rn = !!z?.querySelector?.(".mjr-asset-card"); + nn = !!z?.querySelector?.(".mjr-asset-card"); } catch (e) { console.debug?.(e); } - let an = Vf(), on = !an && (nn || rn) ? Promise.resolve({ + let rn = Uf(), an = !rn && (tn || nn) ? Promise.resolve({ ok: !0, - hydrated: !!nn, - cached: !!rn + hydrated: !!tn, + cached: !!nn }) : Ct.reloadGrid({ - reason: an ? "pending-generated-assets" : "initial-load", - preserveVisibleUntilReady: !an + reason: rn ? "pending-generated-assets" : "initial-load", + preserveVisibleUntilReady: !rn }); - if (nn) try { + if (tn) try { setTimeout(() => { try { if (i?.signal?.aborted) return; @@ -18316,20 +18316,20 @@ async function __(t, { useComfyThemeUI: n = !0, external: r = {} } = {}) { } catch (e) { console.debug?.(e); } - Nt?.restoreUiState?.(on); + Nt?.restoreUiState?.(an); try { window.__mjrLastAssetUpsert = 0, window.__mjrLastAssetUpsertCount = 0; } catch (e) { console.debug?.(e); } - return Wp(zp("panelRender", "gridRender") ?? 0), { gridContainer: z }; + return Kp(Vp("panelRender", "gridRender") ?? 0), { gridContainer: z }; } // ui/vue/components/status/StatusSection.vue -var v_ = /* @__PURE__ */ lr({ +var b_ = /* @__PURE__ */ dr({ __name: "StatusSection", setup(e, { expose: t }) { - let n = vm({ getScanContext: null }), r = n.querySelector("#mjr-status-dot"), i = n.querySelector("#mjr-status-text"), a = n.querySelector("#mjr-status-capabilities"); - return tr(() => { + let n = bm({ getScanContext: null }), r = n.querySelector("#mjr-status-dot"), i = n.querySelector("#mjr-status-text"), a = n.querySelector("#mjr-status-capabilities"); + return rr(() => { try { n?._mjrStatusPollDispose?.(); } catch {} @@ -18340,25 +18340,25 @@ var v_ = /* @__PURE__ */ lr({ capabilitiesSection: a }), (e, t) => null; } -}), y_ = xr({ +}), x_ = Cr({ open: !1, initial: null, resolve: null }); -function b_(e = {}) { - return y_.open = !0, y_.initial = e || {}, new Promise((e) => { - y_.resolve = e; +function S_(e = {}) { + return x_.open = !0, x_.initial = e || {}, new Promise((e) => { + x_.resolve = e; }); } -function x_(e = null) { - let t = y_.resolve; - y_.open = !1, y_.initial = null, y_.resolve = null, t && t(e); +function C_(e = null) { + let t = x_.resolve; + x_.open = !1, x_.initial = null, x_.resolve = null, t && t(e); } // ui/vue/components/panel/SimilarSearchPopover.vue?vue&type=script&setup=true&lang.ts -var S_ = { +var w_ = { class: "mjr-popover mjr-similar-popover", style: { display: "none" } -}, C_ = { class: "mjr-menu mjr-similar-menu" }, w_ = { class: "mjr-menu-item-label mjr-menu-item-label--icon" }, T_ = { class: "mjr-menu-item-label mjr-menu-item-label--icon" }, E_ = { class: "mjr-menu-item-label mjr-menu-item-label--icon" }, D_ = { class: "mjr-menu-item-label mjr-menu-item-label--icon" }, O_ = /* @__PURE__ */ lr({ +}, T_ = { class: "mjr-menu mjr-similar-menu" }, E_ = { class: "mjr-menu-item-label mjr-menu-item-label--icon" }, D_ = { class: "mjr-menu-item-label mjr-menu-item-label--icon" }, O_ = { class: "mjr-menu-item-label mjr-menu-item-label--icon" }, k_ = { class: "mjr-menu-item-label mjr-menu-item-label--icon" }, A_ = /* @__PURE__ */ dr({ __name: "SimilarSearchPopover", setup(e, { expose: t }) { let n = Q(null), r = Q(null), i = Q(null), a = Q(null), o = (e) => e?.$el || e || null; @@ -18376,8 +18376,8 @@ var S_ = { return o(a.value); } }), (e, t) => { - let o = rr("MButton"); - return q(), X("div", S_, [U("div", C_, [ + let o = ar("MButton"); + return q(), X("div", w_, [U("div", T_, [ Y(o, { ref_key: "findSimilarBtnRef", ref: n, @@ -18387,7 +18387,7 @@ var S_ = { text: "", title: Z(R)("search.findSimilarWarning", "Find similar assets. This may be heavy on very large libraries.") }, { - default: W(() => [U("span", w_, [t[0] ||= U("i", { + default: W(() => [U("span", E_, [t[0] ||= U("i", { class: "pi pi-sparkles", "aria-hidden": "true" }, null, -1), U("span", null, J(Z(R)("search.findSimilar", "Find Similar")), 1)])]), @@ -18401,7 +18401,7 @@ var S_ = { severity: "secondary", text: "" }, { - default: W(() => [U("span", T_, [t[1] ||= U("i", { + default: W(() => [U("span", D_, [t[1] ||= U("i", { class: "pi pi-clone", "aria-hidden": "true" }, null, -1), U("span", null, J(Z(R)("search.findDuplicates", "Find Duplicate")), 1)])]), @@ -18416,7 +18416,7 @@ var S_ = { severity: "secondary", text: "" }, { - default: W(() => [U("span", E_, [t[2] ||= U("i", { + default: W(() => [U("span", O_, [t[2] ||= U("i", { class: "pi pi-share-alt", "aria-hidden": "true" }, null, -1), U("span", null, J(Z(R)("search.generatedWithSameSaveNode", "Generated with same save node")), 1)])]), @@ -18430,7 +18430,7 @@ var S_ = { severity: "secondary", text: "" }, { - default: W(() => [U("span", D_, [t[3] ||= U("i", { + default: W(() => [U("span", k_, [t[3] ||= U("i", { class: "pi pi-sitemap", "aria-hidden": "true" }, null, -1), U("span", null, J(Z(R)("search.generatedFromSameWorkflow", "Generated from same workflow")), 1)])]), @@ -18439,11 +18439,11 @@ var S_ = { ])]); }; } -}), k_ = { class: "mjr-am-search-pill" }, A_ = ["id"], j_ = { class: "mjr-am-search-tools" }, M_ = { class: "mjr-popover-anchor" }, N_ = { class: "mjr-popover-anchor" }, P_ = "Ctrl/Cmd+F, Ctrl/Cmd+K, Ctrl/Cmd+H", F_ = "AND", I_ = /* @__PURE__ */ lr({ +}), j_ = { class: "mjr-am-search-pill" }, M_ = ["id"], N_ = { class: "mjr-am-search-tools" }, P_ = { class: "mjr-popover-anchor" }, F_ = { class: "mjr-popover-anchor" }, I_ = "Ctrl/Cmd+F, Ctrl/Cmd+K, Ctrl/Cmd+H", L_ = "AND", R_ = /* @__PURE__ */ dr({ __name: "SearchBar", emits: ["search-change"], setup(e, { expose: t, emit: n }) { - let r = n, i = lh(), a = Q(null), o = Q(null), s = Q(null), c = Q(null), l = Q(null), u = Q(null), d = lt("mjr-search-autocomplete-", 8), f = (e) => e?.$el || e || null, p = () => f(o.value), m = Q(!1), h = Q(!0), g = Q(F_), _ = null, v = null, y = K(() => m.value ? R("search.semanticPlaceholder", "Describe what you're looking for...") : R("search.placeholder", "Search assets...")), b = K(() => m.value ? Bt(R("search.semanticTitle", "AI semantic search — describe your image in natural language"), P_) : Bt(R("search.title", "Search by filename, tags, or attributes (e.g. rating:5, ext:png)"), P_)), x = K(() => m.value ? { + let r = n, i = dh(), a = Q(null), o = Q(null), s = Q(null), c = Q(null), l = Q(null), u = Q(null), d = Me("mjr-search-autocomplete-", 8), f = (e) => e?.$el || e || null, p = () => f(o.value), m = Q(!1), h = Q(!0), g = Q(L_), _ = null, v = null, y = K(() => m.value ? R("search.semanticPlaceholder", "Describe what you're looking for...") : R("search.placeholder", "Search assets...")), b = K(() => m.value ? Bt(R("search.semanticTitle", "AI semantic search — describe your image in natural language"), I_) : Bt(R("search.title", "Search by filename, tags, or attributes (e.g. rating:5, ext:png)"), I_)), x = K(() => m.value ? { background: "rgba(0, 188, 212, 0.2)", borderColor: "rgba(0, 188, 212, 0.6)", color: "#00BCD4", @@ -18480,13 +18480,13 @@ var S_ = { } }, T = async (e) => { let t = e.target?.value || ""; - i.searchQuery = t, i.metadataSearchMode = F_, S(), C({ query: t }), await j(); + i.searchQuery = t, i.metadataSearchMode = L_, S(), C({ query: t }), await j(); }, E = (e) => { let t = String(e || "").split(/\s+/); return t[t.length - 1] || ""; }; async function D() { - return _ || (v ||= re(st.METADATA_KEYS, { limit: 600 }).then((e) => { + return _ || (v ||= re(it.METADATA_KEYS, { limit: 600 }).then((e) => { let t = e?.data || {}; return _ = t, t; }), v); @@ -18502,11 +18502,11 @@ var S_ = { return Object.keys(i).filter((e) => e.startsWith(t)).slice(0, 12).map((t) => O(e, `${n.startsWith("-") ? "-" : ""}${t}:`)); } let [a, o = ""] = r.split(/:(.*)/s); - if (!Fn(a)) return []; + if (!In(a)) return []; let s = o.toLowerCase(), c = Array.isArray(t?.keys) ? t.keys : [], l = t?.workflow_nodes || {}; return [...c, ...Object.keys(l).flatMap((e) => (l[e] || []).map((t) => `workflow_nodes.${e}.${t}`))].filter((e) => String(e || "").toLowerCase().includes(s)).slice(0, 16).map((t) => O(e, `${n.startsWith("-") ? "-" : ""}${a}:${t}`)); } - let A = 0, j = bn(async () => { + let A = 0, j = Jt(async () => { let e = (p()?.value || "").trim(); if (m.value || e.length < 1) return; let t = ++A; @@ -18526,19 +18526,19 @@ var S_ = { })); } catch {} }, 300); - return or(() => i.searchQuery, (e) => { + return cr(() => i.searchQuery, (e) => { let t = p(); t && t.value !== e && (t.value = e); - }), or(h, (e) => { + }), cr(h, (e) => { !e && m.value && (m.value = !1), S(); - }), or(m, () => { + }), cr(m, () => { S(); - }), or(() => i.metadataSearchMode, (e) => { - String(e || "").toUpperCase() !== F_ && (i.metadataSearchMode = F_), g.value !== F_ && (g.value = F_), S(); - }), kr(() => { + }), cr(() => i.metadataSearchMode, (e) => { + String(e || "").toUpperCase() !== L_ && (i.metadataSearchMode = L_), g.value !== L_ && (g.value = L_), S(); + }), jr(() => { try { let e = p(); - e && (e.value = i.searchQuery || ""), i.metadataSearchMode = F_; + e && (e.value = i.searchQuery || ""), i.metadataSearchMode = L_; } catch (e) { console.debug?.(e); } @@ -18575,12 +18575,12 @@ var S_ = { h.value = !!e, S(); } }), (e, t) => { - let n = rr("MInputText"), r = rr("MButton"); + let n = ar("MInputText"), r = ar("MButton"); return q(), X("div", { ref_key: "searchSectionRef", ref: a, class: "mjr-am-search" - }, [U("div", k_, [ + }, [U("div", j_, [ t[0] ||= U("span", { class: "mjr-am-search-icon" }, [U("i", { class: "pi pi-search" })], -1), Y(n, { ref_key: "searchInputRef", @@ -18601,9 +18601,9 @@ var S_ = { ref_key: "dataListRef", ref: s, id: Z(d) - }, null, 8, A_) - ]), U("div", j_, [ - U("div", M_, [Y(r, { + }, null, 8, M_) + ]), U("div", N_, [ + U("div", P_, [Y(r, { ref_key: "semanticBtnRef", ref: u, type: "button", @@ -18614,7 +18614,7 @@ var S_ = { disabled: !h.value, "aria-disabled": !h.value, title: h.value ? Z(R)("search.semanticToggle", "Toggle AI semantic search (CLIP-based)") : Z(R)("search.semanticDisabled", "AI semantic search is disabled in settings"), - style: yr(x.value), + style: xr(x.value), onClick: w }, { default: W(() => [...t[1] ||= [U("i", { class: "pi pi-sparkles" }, null, -1)]]), @@ -18625,7 +18625,7 @@ var S_ = { "title", "style" ])]), - U("div", N_, [Y(r, { + U("div", F_, [Y(r, { ref_key: "similarBtnRef", ref: c, type: "button", @@ -18637,24 +18637,24 @@ var S_ = { }, { default: W(() => [...t[2] ||= [U("i", { class: "pi pi-search" }, null, -1)]]), _: 1 - }, 8, ["title"]), Y(O_, { + }, 8, ["title"]), Y(A_, { ref_key: "similarPopoverRef", ref: l }, null, 512)]), - mr(e.$slots, "filter-anchor"), - mr(e.$slots, "sort-anchor"), - mr(e.$slots, "collections-anchor"), - mr(e.$slots, "pinned-folders-anchor") + gr(e.$slots, "filter-anchor"), + gr(e.$slots, "sort-anchor"), + gr(e.$slots, "collections-anchor"), + gr(e.$slots, "pinned-folders-anchor") ])], 512); }; } -}), L_ = { +}), z_ = { class: "mjr-popover mjr-sort-popover", style: { display: "none" } -}, R_ = { class: "mjr-menu-item-label" }, z_ = /* @__PURE__ */ lr({ +}, B_ = { class: "mjr-menu-item-label" }, V_ = /* @__PURE__ */ dr({ __name: "SortPopover", setup(e) { - let t = lh(), n = K(() => t.sort || "mtime_desc"), r = (e) => { + let t = dh(), n = K(() => t.sort || "mtime_desc"), r = (e) => { t.sort = e; try { window.dispatchEvent(new CustomEvent("mjr:sort-changed", { detail: { sort: e } })); @@ -18703,33 +18703,33 @@ var S_ = { command: () => r(e.key) }))); return (e, t) => { - let r = rr("MMenu"); - return q(), X("div", L_, [Y(r, { + let r = ar("MMenu"); + return q(), X("div", z_, [Y(r, { model: i.value, class: "mjr-menu mjr-prime-menu mjr-sort-menu", pt: { list: { class: "mjr-menu mjr-prime-menu-list" } } }, { - item: W(({ item: e }) => [U("div", { class: wr(["mjr-menu-item", { "is-active": n.value === e.key }]) }, [U("span", R_, J(e.label), 1), U("i", { - class: wr([e.icon, "mjr-menu-item-check"]), - style: yr({ opacity: +(n.value === e.key) }) + item: W(({ item: e }) => [U("div", { class: Er(["mjr-menu-item", { "is-active": n.value === e.key }]) }, [U("span", B_, J(e.label), 1), U("i", { + class: Er([e.icon, "mjr-menu-item-check"]), + style: xr({ opacity: +(n.value === e.key) }) }, null, 6)], 2)]), _: 1 }, 8, ["model"])]); }; } -}), B_ = { class: "mjr-popover mjr-filter-popover mjr-popover--hidden" }, V_ = { class: "mjr-filter-head" }, H_ = { class: "mjr-filter-head-left" }, U_ = { class: "mjr-filter-kicker" }, W_ = { class: "mjr-filter-subtitle" }, G_ = { class: "mjr-filter-head-actions" }, K_ = { class: "mjr-filter-active-count" }, q_ = { class: "mjr-filter-group-title" }, J_ = { +}), H_ = { class: "mjr-popover mjr-filter-popover mjr-popover--hidden" }, U_ = { class: "mjr-filter-head" }, W_ = { class: "mjr-filter-head-left" }, G_ = { class: "mjr-filter-kicker" }, K_ = { class: "mjr-filter-subtitle" }, q_ = { class: "mjr-filter-head-actions" }, J_ = { class: "mjr-filter-active-count" }, Y_ = { class: "mjr-filter-group-title" }, X_ = { class: "mjr-filter-group-chevron", "aria-hidden": "true" -}, Y_ = { class: "mjr-filter-group-body" }, X_ = { class: "mjr-filter-card" }, Z_ = { class: "mjr-popover-row" }, Q_ = { class: "mjr-popover-label" }, $_ = { class: "mjr-popover-row" }, ev = { class: "mjr-popover-label" }, tv = ["title"], nv = { class: "mjr-filter-card" }, rv = { class: "mjr-popover-row" }, iv = { class: "mjr-popover-label" }, av = { class: "mjr-popover-row" }, ov = { class: "mjr-popover-label" }, sv = { class: "mjr-popover-row" }, cv = { class: "mjr-popover-label" }, lv = { class: "mjr-filter-stack" }, uv = { class: "mjr-popover-row" }, dv = { class: "mjr-popover-label" }, fv = { class: "mjr-popover-row" }, pv = { class: "mjr-popover-label" }, mv = { class: "mjr-filter-group-title" }, hv = { +}, Z_ = { class: "mjr-filter-group-body" }, Q_ = { class: "mjr-filter-card" }, $_ = { class: "mjr-popover-row" }, ev = { class: "mjr-popover-label" }, tv = { class: "mjr-popover-row" }, nv = { class: "mjr-popover-label" }, rv = ["title"], iv = { class: "mjr-filter-card" }, av = { class: "mjr-popover-row" }, ov = { class: "mjr-popover-label" }, sv = { class: "mjr-popover-row" }, cv = { class: "mjr-popover-label" }, lv = { class: "mjr-popover-row" }, uv = { class: "mjr-popover-label" }, dv = { class: "mjr-filter-stack" }, fv = { class: "mjr-popover-row" }, pv = { class: "mjr-popover-label" }, mv = { class: "mjr-popover-row" }, hv = { class: "mjr-popover-label" }, gv = { class: "mjr-filter-group-title" }, _v = { class: "mjr-filter-group-chevron", "aria-hidden": "true" -}, gv = { class: "mjr-filter-group-body" }, _v = { class: "mjr-filter-card" }, vv = { class: "mjr-popover-row mjr-popover-row--3col" }, yv = { class: "mjr-popover-label" }, bv = { class: "mjr-popover-row" }, xv = { class: "mjr-popover-label" }, Sv = { class: "mjr-popover-row mjr-popover-row--3col" }, Cv = { class: "mjr-popover-label" }, wv = { class: "mjr-popover-row mjr-popover-row--3col" }, Tv = { class: "mjr-popover-label" }, Ev = { class: "mjr-filter-group-title" }, Dv = { +}, vv = { class: "mjr-filter-group-body" }, yv = { class: "mjr-filter-card" }, bv = { class: "mjr-popover-row mjr-popover-row--3col" }, xv = { class: "mjr-popover-label" }, Sv = { class: "mjr-popover-row" }, Cv = { class: "mjr-popover-label" }, wv = { class: "mjr-popover-row mjr-popover-row--3col" }, Tv = { class: "mjr-popover-label" }, Ev = { class: "mjr-popover-row mjr-popover-row--3col" }, Dv = { class: "mjr-popover-label" }, Ov = { class: "mjr-filter-group-title" }, kv = { class: "mjr-filter-group-chevron", "aria-hidden": "true" -}, Ov = { class: "mjr-filter-group-body" }, kv = { class: "mjr-filter-card mjr-filter-card--agenda" }, Av = { class: "mjr-popover-row" }, jv = { class: "mjr-popover-label" }, Mv = { class: "mjr-popover-row" }, Nv = { class: "mjr-popover-label" }, Pv = /* @__PURE__ */ lr({ +}, Av = { class: "mjr-filter-group-body" }, jv = { class: "mjr-filter-card mjr-filter-card--agenda" }, Mv = { class: "mjr-popover-row" }, Nv = { class: "mjr-popover-label" }, Pv = { class: "mjr-popover-row" }, Fv = { class: "mjr-popover-label" }, Iv = /* @__PURE__ */ dr({ __name: "FilterPopover", setup(e, { expose: t }) { - let n = lh(), r = Q(null), a = Q(null), o = Q(null), s = Q(null), c = Q(null), l = Q(null), u = Q(null), d = Q(null), f = Q(null), p = Q(null), m = Q([{ + let n = dh(), r = Q(null), a = Q(null), o = Q(null), s = Q(null), c = Q(null), l = Q(null), u = Q(null), d = Q(null), f = Q(null), p = Q(null), m = Q([{ label: R("filter.any", "Any"), value: "" }]), h = (e) => e?.$el || e || null, g = (e) => h(e.value)?.value || "", _ = (e, t) => { @@ -18939,7 +18939,7 @@ var S_ = { console.debug?.(e); } }; - kr(() => { + jr(() => { A(); }); let j = (e, { emit: t = !0 } = {}) => { @@ -19093,9 +19093,9 @@ var S_ = { return u.value; } }), (e, t) => { - let i = rr("MButton"), m = rr("MSelect"), h = rr("MCheckbox"), g = rr("MInputText"); - return q(), X("div", B_, [ - U("div", V_, [U("div", H_, [U("div", U_, J(Z(R)("label.filters", "Filters")), 1), U("div", W_, J(Z(R)("label.refineResults", "Refine your results")), 1)]), U("div", G_, [U("span", K_, J(ve.value), 1), Y(i, { + let i = ar("MButton"), m = ar("MSelect"), h = ar("MCheckbox"), g = ar("MInputText"); + return q(), X("div", H_, [ + U("div", U_, [U("div", W_, [U("div", G_, J(Z(R)("label.filters", "Filters")), 1), U("div", K_, J(Z(R)("label.refineResults", "Refine your results")), 1)]), U("div", q_, [U("span", J_, J(ve.value), 1), Y(i, { type: "button", class: "mjr-filter-clear-all", severity: "secondary", @@ -19103,10 +19103,10 @@ var S_ = { disabled: ve.value === 0, onClick: ye }, { - default: W(() => [er(J(Z(R)("action.clearAll", "Clear all")), 1)]), + default: W(() => [nr(J(Z(R)("action.clearAll", "Clear all")), 1)]), _: 1 }, 8, ["disabled"])])]), - U("div", { class: wr(["mjr-filter-group mjr-filter-group--core", { "is-open": se("core") }]) }, [Y(i, { + U("div", { class: Er(["mjr-filter-group mjr-filter-group--core", { "is-open": se("core") }]) }, [Y(i, { type: "button", class: "mjr-filter-group-toggle", severity: "secondary", @@ -19114,9 +19114,9 @@ var S_ = { "aria-expanded": String(se("core")), onClick: t[0] ||= (e) => oe("core") }, { - default: W(() => [U("span", q_, J(Z(R)("group.core", "Core")), 1), U("span", J_, J(se("core") ? "▾" : "▸"), 1)]), + default: W(() => [U("span", Y_, J(Z(R)("group.core", "Core")), 1), U("span", X_, J(se("core") ? "▾" : "▸"), 1)]), _: 1 - }, 8, ["aria-expanded"]), hr(U("div", Y_, [U("div", X_, [U("div", Z_, [U("div", Q_, J(Z(R)("label.type")), 1), Y(m, { + }, 8, ["aria-expanded"]), _r(U("div", Z_, [U("div", Q_, [U("div", $_, [U("div", ev, J(Z(R)("label.type")), 1), Y(m, { class: "mjr-select mjr-filter-select", "panel-class": "mjr-filter-select-panel", title: Z(R)("tooltip.filterByFileType", "Filter by file type"), @@ -19129,7 +19129,7 @@ var S_ = { "title", "model-value", "options" - ])]), U("div", $_, [U("div", ev, J(Z(R)("label.workflow")), 1), U("label", { + ])]), U("div", tv, [U("div", nv, J(Z(R)("label.workflow")), 1), U("label", { class: "mjr-popover-toggle", title: Z(R)("tooltip.filterWorkflowOnly", "Show only assets with embedded workflow data") }, [Y(h, { @@ -19137,8 +19137,8 @@ var S_ = { "model-value": !!Z(n).workflowOnly, binary: "", "onUpdate:modelValue": M - }, null, 8, ["model-value"]), U("span", null, J(Z(R)("filter.onlyWithWorkflow")), 1)], 8, tv)])]), U("div", nv, [ - U("div", rv, [U("div", iv, J(Z(R)("label.workflowType", "Workflow type")), 1), Y(m, { + }, null, 8, ["model-value"]), U("span", null, J(Z(R)("filter.onlyWithWorkflow")), 1)], 8, rv)])]), U("div", iv, [ + U("div", av, [U("div", ov, J(Z(R)("label.workflowType", "Workflow type")), 1), Y(m, { class: "mjr-select mjr-filter-select", "panel-class": "mjr-filter-select-panel", "model-value": String(Z(n).workflowType || "").trim().toUpperCase(), @@ -19147,7 +19147,7 @@ var S_ = { "option-value": "value", "onUpdate:modelValue": N }, null, 8, ["model-value", "options"])]), - U("div", av, [U("div", ov, J(Z(R)("label.sameWorkflow", "Generated with Same Workflow")), 1), Y(g, { + U("div", sv, [U("div", cv, J(Z(R)("label.sameWorkflow", "Generated with Same Workflow")), 1), Y(g, { ref_key: "workflowIdInputRef", ref: f, class: "mjr-input", @@ -19161,7 +19161,7 @@ var S_ = { "placeholder", "model-value" ])]), - U("div", sv, [U("div", cv, J(Z(R)("label.workflowModelFamily", "Model family")), 1), U("div", lv, [Y(m, { + U("div", lv, [U("div", uv, J(Z(R)("label.workflowModelFamily", "Model family")), 1), U("div", dv, [Y(m, { class: "mjr-select mjr-filter-select", "panel-class": "mjr-filter-select-panel", "model-value": String(Z(n).workflowModelFilter || ""), @@ -19178,7 +19178,7 @@ var S_ = { "onUpdate:modelValue": ee, onChange: t[2] ||= (e) => ee(e?.target?.value) }, null, 8, ["placeholder", "model-value"])])]), - U("div", uv, [U("div", dv, J(Z(R)("label.workflowRunsOn", "Runs on")), 1), Y(m, { + U("div", fv, [U("div", pv, J(Z(R)("label.workflowRunsOn", "Runs on")), 1), Y(m, { class: "mjr-select mjr-filter-select", "panel-class": "mjr-filter-select-panel", "model-value": String(Z(n).workflowRunsOnFilter || "").trim().toLowerCase(), @@ -19187,7 +19187,7 @@ var S_ = { "option-value": "value", "onUpdate:modelValue": te }, null, 8, ["model-value", "options"])]), - U("div", fv, [U("div", pv, J(Z(R)("label.rating")), 1), Y(m, { + U("div", mv, [U("div", hv, J(Z(R)("label.rating")), 1), Y(m, { class: "mjr-select mjr-filter-select", "panel-class": "mjr-filter-select-panel", title: Z(R)("tooltip.filterMinRating", "Filter by minimum rating"), @@ -19201,8 +19201,8 @@ var S_ = { "model-value", "options" ])]) - ])], 512), [[_r, se("core")]])], 2), - U("div", { class: wr(["mjr-filter-group mjr-filter-group--media", { "is-open": se("media") }]) }, [Y(i, { + ])], 512), [[yr, se("core")]])], 2), + U("div", { class: Er(["mjr-filter-group mjr-filter-group--media", { "is-open": se("media") }]) }, [Y(i, { type: "button", class: "mjr-filter-group-toggle", severity: "secondary", @@ -19210,11 +19210,11 @@ var S_ = { "aria-expanded": String(se("media")), onClick: t[3] ||= (e) => oe("media") }, { - default: W(() => [U("span", mv, J(Z(R)("group.media", "Media")), 1), U("span", hv, J(se("media") ? "▾" : "▸"), 1)]), + default: W(() => [U("span", gv, J(Z(R)("group.media", "Media")), 1), U("span", _v, J(se("media") ? "▾" : "▸"), 1)]), _: 1 - }, 8, ["aria-expanded"]), hr(U("div", gv, [U("div", _v, [ - U("div", vv, [ - U("div", yv, J(Z(R)("label.fileSizeMB", "File size (MB)")), 1), + }, 8, ["aria-expanded"]), _r(U("div", vv, [U("div", yv, [ + U("div", bv, [ + U("div", xv, J(Z(R)("label.fileSizeMB", "File size (MB)")), 1), Y(g, { ref_key: "minSizeInputRef", ref: r, @@ -19238,7 +19238,7 @@ var S_ = { onChange: I }, null, 8, ["placeholder", "value"]) ]), - U("div", bv, [U("div", xv, J(Z(R)("label.resolutionPx", "Resolution (px)")), 1), Y(m, { + U("div", Sv, [U("div", Cv, J(Z(R)("label.resolutionPx", "Resolution (px)")), 1), Y(m, { class: "mjr-select mjr-filter-select", "panel-class": "mjr-filter-select-panel", "model-value": E.value, @@ -19247,8 +19247,8 @@ var S_ = { "option-value": "value", "onUpdate:modelValue": re }, null, 8, ["model-value", "options"])]), - U("div", Sv, [ - U("div", Cv, J(Z(R)("label.resolutionMinWxH", "Min WxH (px)")), 1), + U("div", wv, [ + U("div", Tv, J(Z(R)("label.resolutionMinWxH", "Min WxH (px)")), 1), Y(g, { ref_key: "minWidthInputRef", ref: o, @@ -19282,8 +19282,8 @@ var S_ = { "value" ]) ]), - U("div", wv, [ - U("div", Tv, J(Z(R)("label.resolutionMaxWxH", "Max WxH (px)")), 1), + U("div", Ev, [ + U("div", Dv, J(Z(R)("label.resolutionMaxWxH", "Max WxH (px)")), 1), Y(g, { ref_key: "maxWidthInputRef", ref: c, @@ -19317,8 +19317,8 @@ var S_ = { "value" ]) ]) - ])], 512), [[_r, se("media")]])], 2), - U("div", { class: wr(["mjr-filter-group mjr-filter-group--time", { "is-open": se("time") }]) }, [Y(i, { + ])], 512), [[yr, se("media")]])], 2), + U("div", { class: Er(["mjr-filter-group mjr-filter-group--time", { "is-open": se("time") }]) }, [Y(i, { type: "button", class: "mjr-filter-group-toggle", severity: "secondary", @@ -19326,9 +19326,9 @@ var S_ = { "aria-expanded": String(se("time")), onClick: t[4] ||= (e) => oe("time") }, { - default: W(() => [U("span", Ev, J(Z(R)("group.time", "Time")), 1), U("span", Dv, J(se("time") ? "▾" : "▸"), 1)]), + default: W(() => [U("span", Ov, J(Z(R)("group.time", "Time")), 1), U("span", kv, J(se("time") ? "▾" : "▸"), 1)]), _: 1 - }, 8, ["aria-expanded"]), hr(U("div", Ov, [U("div", kv, [U("div", Av, [U("div", jv, J(Z(R)("label.dateRange")), 1), Y(m, { + }, 8, ["aria-expanded"]), _r(U("div", Av, [U("div", jv, [U("div", Mv, [U("div", Nv, J(Z(R)("label.dateRange")), 1), Y(m, { class: "mjr-select mjr-filter-select", "panel-class": "mjr-filter-select-panel", title: Z(R)("tooltip.filterByDateRange", "Filter by date range"), @@ -19341,7 +19341,7 @@ var S_ = { "title", "model-value", "options" - ])]), U("div", Mv, [U("div", Nv, J(Z(R)("label.agenda")), 1), U("div", { + ])]), U("div", Pv, [U("div", Fv, J(Z(R)("label.agenda")), 1), U("div", { ref_key: "agendaContainerRef", ref: u, class: "mjr-agenda-container" @@ -19349,14 +19349,14 @@ var S_ = { ref_key: "dateExactInputRef", ref: d, type: "date", - class: wr(["mjr-input mjr-agenda-input", D.value]), + class: Er(["mjr-input mjr-agenda-input", D.value]), value: Z(n).dateExactFilter, onChange: ae - }, null, 8, ["class", "value"])], 512)])])], 512), [[_r, se("time")]])], 2) + }, null, 8, ["class", "value"])], 512)])])], 512), [[yr, se("time")]])], 2) ]); }; } -}), Fv = 128, Iv = Object.freeze([ +}), Lv = 128, Rv = Object.freeze([ { key: "portraits", label: "Portraits", @@ -19394,10 +19394,10 @@ var S_ = { iconClass: "pi pi-circle" } ]); -function Lv(e) { +function zv(e) { try { let t = String(e ?? "").trim(); - if (!t || t.length > Fv || t.includes("\0")) return ""; + if (!t || t.length > Lv || t.includes("\0")) return ""; for (let e = 0; e < t.length; e += 1) { let n = t.charCodeAt(e); if (n <= 31 || n === 127) return ""; @@ -19407,7 +19407,7 @@ function Lv(e) { return ""; } } -function Rv(e) { +function Bv(e) { if (!e || typeof e != "object") return null; let t = String(e.filepath || "").trim(); return t ? { @@ -19419,10 +19419,10 @@ function Rv(e) { root_id: String(e.root_id || e.rootId || e.custom_root_id || "").trim() || void 0 } : null; } -function zv(e) { +function Vv(e) { let t = [], n = [], r = /* @__PURE__ */ new Set(); for (let i of Array.isArray(e) ? e : []) { - let e = Rv(i); + let e = Bv(i); if (e?.filepath) { let n = e.filepath.toLowerCase(); if (r.has(n)) continue; @@ -19437,7 +19437,7 @@ function zv(e) { missingIds: n }; } -async function Bv(e) { +async function Hv(e) { let t = Array.from(new Set((Array.isArray(e) ? e : []).map((e) => Number(e)).filter((e) => Number.isFinite(e) && e > 0))); if (!t.length) return { ok: !0, @@ -19448,13 +19448,13 @@ async function Bv(e) { ok: !1, error: String(n?.error || "Failed to fetch assets") }; - let { assets: r } = zv(Array.isArray(n?.data) ? n.data : Array.isArray(n?.data?.assets) ? n.data.assets : []); + let { assets: r } = Vv(Array.isArray(n?.data) ? n.data : Array.isArray(n?.data?.assets) ? n.data.assets : []); return { ok: !0, data: r }; } -function Vv(e) { +function Uv(e) { let t = String(e?.label || "").trim(); if (t && !/^group\b/i.test(t)) return t; let n = (Array.isArray(e?.dominant_tags) ? e.dominant_tags : []).map((e) => String(e || "").trim()).filter(Boolean); @@ -19472,43 +19472,43 @@ function Vv(e) { let s = Object.entries(o).sort((e, t) => t[1] - e[1])[0]?.[0] || "other", c = s === "image" ? "Images" : s === "video" ? "Videos" : s === "audio" ? "Audio" : "Media", l = Number(e?.cluster_id), u = Number.isFinite(l) ? ` ${l + 1}` : ""; return a ? `${a} - ${c}` : `${c} Cluster${u}`; } -function Hv() { +function Wv() { try { - return !!(Jt()?.ai?.vectorSearchEnabled ?? !0); + return !!(Vn()?.ai?.vectorSearchEnabled ?? !0); } catch { return !0; } } // ui/vue/components/panel/CollectionsPopover.vue?vue&type=script&setup=true&lang.ts -var Uv = { class: "mjr-menu mjr-collections-menu" }, Wv = { class: "mjr-menu-item-label" }, Gv = { class: "mjr-menu-item-label" }, Kv = { class: "mjr-menu-item-right" }, qv = { +var Gv = { class: "mjr-menu mjr-collections-menu" }, Kv = { class: "mjr-menu-item-label" }, qv = { class: "mjr-menu-item-label" }, Jv = { class: "mjr-menu-item-right" }, Yv = { key: 0, class: "mjr-menu-item-hint" -}, Jv = { +}, Xv = { key: 1, class: "mjr-muted" -}, Yv = { +}, Zv = { key: 2, class: "mjr-state-block is-error" -}, Xv = { +}, Qv = { key: 3, class: "mjr-muted" -}, Zv = { class: "mjr-collection-row" }, Qv = { class: "mjr-menu-item-label" }, $v = { class: "mjr-menu-item-right" }, ey = { +}, $v = { class: "mjr-collection-row" }, ey = { class: "mjr-menu-item-label" }, ty = { class: "mjr-menu-item-right" }, ny = { key: 0, class: "mjr-menu-item-hint" -}, ty = { class: "mjr-state-block" }, ny = { class: "mjr-section-title mjr-section-title--cyan" }, ry = { class: "mjr-section-hint" }, iy = { class: "mjr-menu-item-label mjr-menu-item-label--icon" }, ay = { class: "mjr-section-title mjr-section-title--violet" }, oy = { class: "mjr-section-hint" }, sy = { class: "mjr-menu-item-label mjr-menu-item-label--icon" }, cy = { +}, ry = { class: "mjr-state-block" }, iy = { class: "mjr-section-title mjr-section-title--cyan" }, ay = { class: "mjr-section-hint" }, oy = { class: "mjr-menu-item-label mjr-menu-item-label--icon" }, sy = { class: "mjr-section-title mjr-section-title--violet" }, cy = { class: "mjr-section-hint" }, ly = { class: "mjr-menu-item-label mjr-menu-item-label--icon" }, uy = { key: 0, class: "mjr-state-block is-error" -}, ly = { class: "mjr-cluster-thumbs" }, uy = ["src", "alt"], dy = { class: "mjr-cluster-info" }, fy = ["title"], py = { class: "mjr-cluster-count" }, my = "mjr:collections-changed", hy = /* @__PURE__ */ lr({ +}, dy = { class: "mjr-cluster-thumbs" }, fy = ["src", "alt"], py = { class: "mjr-cluster-info" }, my = ["title"], hy = { class: "mjr-cluster-count" }, gy = "mjr:collections-changed", _y = /* @__PURE__ */ dr({ __name: "CollectionsPopover", setup(t, { expose: n }) { - let r = lh(), i = Q(null), a = Q([]), o = Q(!1), s = Q(""), c = Q(!1), l = Q(!0), u = Q(!1), p = Q(!1), m = Q(!1), h = Q([]), g = Q(""), _ = Q(""), v = 0, y = null, b = !1, x = K(() => String(r.collectionId || "").trim()), C = K(() => String(r.collectionName || "").trim()), T = K(() => !!x.value), O = K(() => !l.value || p.value), k = K(() => l.value && u.value), A = K(() => `${Math.max(1, Math.min(a.value.length, 6)) * 48}px`); + let r = dh(), i = Q(null), a = Q([]), o = Q(!1), s = Q(""), c = Q(!1), l = Q(!0), u = Q(!1), p = Q(!1), m = Q(!1), h = Q([]), g = Q(""), _ = Q(""), v = 0, y = null, b = !1, x = K(() => String(r.collectionId || "").trim()), C = K(() => String(r.collectionName || "").trim()), T = K(() => !!x.value), O = K(() => !l.value || p.value), k = K(() => l.value && u.value), A = K(() => `${Math.max(1, Math.min(a.value.length, 6)) * 48}px`); function j() { let e = i.value; return !!e && String(e.style.display || "").toLowerCase() !== "none"; } function M({ collectionId: e = x.value, collectionName: t = C.value, close: n = !0, reload: r = !0 } = {}) { try { - window.dispatchEvent(new CustomEvent(my, { detail: { + window.dispatchEvent(new CustomEvent(gy, { detail: { collectionId: String(e || ""), collectionName: String(t || ""), close: n !== !1, @@ -19520,13 +19520,13 @@ var Uv = { class: "mjr-menu mjr-collections-menu" }, Wv = { class: "mjr-menu-ite } function N(e) { try { - return it(e) || ""; + return We(e) || ""; } catch (e) { return console.debug?.(e), ""; } } async function P() { - if (!Hv()) return { + if (!Wv()) return { enabled: !1, vectorAvailable: !1, vectorDisabled: !1 @@ -19583,7 +19583,7 @@ var Uv = { class: "mjr-menu mjr-collections-menu" }, Wv = { class: "mjr-menu-ite let I = F("create", async () => { let t = await wt(R("dialog.createCollection", "Create collection"), R("dialog.collectionPlaceholder", "Collection name")); if (!t) return; - let n = Lv(t); + let n = zv(t); if (!n) { e(R("toast.invalidCollectionName", "Invalid collection name"), "error"); return; @@ -19629,9 +19629,9 @@ var Uv = { class: "mjr-menu mjr-collections-menu" }, Wv = { class: "mjr-menu-ite if (!i) return; let a = await d(String(t?.query || ""), 50); if (a?.ok && Array.isArray(a?.data) && a.data.length > 0) { - let t = zv(a.data), r = t.assets; + let t = Vv(a.data), r = t.assets; if (t.missingIds.length) { - let e = await Bv(t.missingIds); + let e = await Hv(t.missingIds); e.ok && Array.isArray(e.data) && (r = ee(r, e.data)); } if (r.length) { @@ -19677,7 +19677,7 @@ var Uv = { class: "mjr-menu mjr-collections-menu" }, Wv = { class: "mjr-menu-ite } h.value = t.data.map((e) => ({ ...e, - _label: Vv(e) + _label: Uv(e) })); } catch (t) { console.error("[Majoor] Discover groups failed:", t), g.value = R("toast.clusterAnalysisFailed", "Cluster analysis failed"), e(R("toast.clusterAnalysisFailed", "Cluster analysis failed"), "error"); @@ -19691,7 +19691,7 @@ var Uv = { class: "mjr-menu mjr-collections-menu" }, Wv = { class: "mjr-menu-ite if (!_.value) { _.value = n; try { - let n = String(t?._label || Vv(t) || "").trim(); + let n = String(t?._label || Uv(t) || "").trim(); if (!n) return; let r = await S(n); if (!r?.ok) { @@ -19700,7 +19700,7 @@ var Uv = { class: "mjr-menu mjr-collections-menu" }, Wv = { class: "mjr-menu-ite } let i = String(r?.data?.id || ""), a = Array.isArray(t?.all_asset_ids) ? t.all_asset_ids : []; if (i && a.length) { - let t = await Bv(a); + let t = await Hv(a); if (!t.ok) { e(t.error || R("toast.failedLoadClusterAssets", "Failed to load cluster assets"), "error"); return; @@ -19731,12 +19731,12 @@ var Uv = { class: "mjr-menu mjr-collections-menu" }, Wv = { class: "mjr-menu-ite let e = j(); e && !b && te().catch(() => {}), b = e; } - return kr(() => { + return jr(() => { ce(), typeof MutationObserver < "u" && i.value && (y = new MutationObserver(() => ce()), y.observe(i.value, { attributes: !0, attributeFilter: ["style"] })); - }), tr(() => { + }), rr(() => { try { y?.disconnect?.(); } catch (e) { @@ -19744,13 +19744,13 @@ var Uv = { class: "mjr-menu mjr-collections-menu" }, Wv = { class: "mjr-menu-ite } y = null; }), n({ refresh: te }), (e, t) => { - let n = rr("MButton"), r = rr("MVirtualScroller"); + let n = ar("MButton"), r = ar("MVirtualScroller"); return q(), X("div", { ref_key: "rootRef", ref: i, class: "mjr-popover mjr-collections-popover", style: { display: "none" } - }, [U("div", Uv, [ + }, [U("div", Gv, [ Y(n, { type: "button", class: "mjr-menu-item", @@ -19759,10 +19759,10 @@ var Uv = { class: "mjr-menu mjr-collections-menu" }, Wv = { class: "mjr-menu-ite disabled: _.value !== "", onClick: Z(I) }, { - default: W(() => [U("span", Wv, J(Z(R)("ctx.createCollection", "Create collection")), 1), t[0] ||= U("i", { class: "pi pi-plus mjr-menu-item-check mjr-menu-item-check--visible" }, null, -1)]), + default: W(() => [U("span", Kv, J(Z(R)("ctx.createCollection", "Create collection")), 1), t[0] ||= U("i", { class: "pi pi-plus mjr-menu-item-check mjr-menu-item-check--visible" }, null, -1)]), _: 1 }, 8, ["disabled", "onClick"]), - T.value ? (q(), nr(n, { + T.value ? (q(), ir(n, { key: 0, type: "button", class: "mjr-menu-item", @@ -19771,11 +19771,11 @@ var Uv = { class: "mjr-menu mjr-collections-menu" }, Wv = { class: "mjr-menu-ite disabled: _.value !== "", onClick: Z(ne) }, { - default: W(() => [U("span", Gv, J(Z(R)("ctx.exitCollection", "Exit collection")), 1), U("span", Kv, [C.value ? (q(), X("span", qv, J(C.value), 1)) : G("", !0), t[1] ||= U("i", { class: "pi pi-times mjr-menu-item-check mjr-menu-item-check--visible" }, null, -1)])]), + default: W(() => [U("span", qv, J(Z(R)("ctx.exitCollection", "Exit collection")), 1), U("span", Jv, [C.value ? (q(), X("span", Yv, J(C.value), 1)) : G("", !0), t[1] ||= U("i", { class: "pi pi-times mjr-menu-item-check mjr-menu-item-check--visible" }, null, -1)])]), _: 1 }, 8, ["disabled", "onClick"])) : G("", !0), t[9] ||= U("div", { class: "mjr-menu-divider" }, null, -1), - o.value ? (q(), X("div", Jv, J(Z(R)("label.loading", "Loading...")), 1)) : s.value ? (q(), X("div", Yv, J(s.value), 1)) : a.value.length ? (q(), nr(r, { + o.value ? (q(), X("div", Xv, J(Z(R)("label.loading", "Loading...")), 1)) : s.value ? (q(), X("div", Zv, J(s.value), 1)) : a.value.length ? (q(), ir(r, { key: 4, items: a.value, "item-size": 48, @@ -19783,15 +19783,15 @@ var Uv = { class: "mjr-menu mjr-collections-menu" }, Wv = { class: "mjr-menu-ite "num-tolerated-items": 4, class: "mjr-collections-virtual-list" }, { - item: W(({ item: e }) => [U("div", Zv, [Y(n, { + item: W(({ item: e }) => [U("div", $v, [Y(n, { type: "button", - class: wr(["mjr-menu-item", { "is-active": x.value === String(e.id || "") }]), + class: Er(["mjr-menu-item", { "is-active": x.value === String(e.id || "") }]), severity: "secondary", text: "", disabled: _.value !== "", onClick: (t) => Z(re)(e) }, { - default: W(() => [U("span", Qv, J(e.name || e.id), 1), U("span", $v, [Number(e.count || 0) ? (q(), X("span", ey, J(Number(e.count || 0)), 1)) : G("", !0), t[2] ||= U("i", { class: "pi pi-check mjr-menu-item-check" }, null, -1)])]), + default: W(() => [U("span", ey, J(e.name || e.id), 1), U("span", ty, [Number(e.count || 0) ? (q(), X("span", ny, J(Number(e.count || 0)), 1)) : G("", !0), t[2] ||= U("i", { class: "pi pi-check mjr-menu-item-check" }, null, -1)])]), _: 2 }, 1032, [ "class", @@ -19804,7 +19804,7 @@ var Uv = { class: "mjr-menu mjr-collections-menu" }, Wv = { class: "mjr-menu-ite text: "", disabled: _.value !== "", title: Z(R)("tooltip.deleteCollection", "Delete collection"), - onClick: fr((t) => Z(ie)(e), ["stop", "prevent"]) + onClick: mr((t) => Z(ie)(e), ["stop", "prevent"]) }, { default: W(() => [...t[3] ||= [U("i", { class: "pi pi-trash" }, null, -1)]]), _: 1 @@ -19814,13 +19814,13 @@ var Uv = { class: "mjr-menu mjr-collections-menu" }, Wv = { class: "mjr-menu-ite "onClick" ])])]), _: 1 - }, 8, ["items", "scroll-height"])) : (q(), X("div", Xv, J(Z(R)("msg.noCollections", "No collections yet")), 1)), - !c.value && O.value ? (q(), X(H, { key: 5 }, [t[4] ||= U("div", { class: "mjr-menu-divider" }, null, -1), U("div", ty, J(l.value ? "AI Smart Collections are disabled (enable vector search env var)." : "AI Smart Collections are disabled in settings."), 1)], 64)) : G("", !0), + }, 8, ["items", "scroll-height"])) : (q(), X("div", Qv, J(Z(R)("msg.noCollections", "No collections yet")), 1)), + !c.value && O.value ? (q(), X(H, { key: 5 }, [t[4] ||= U("div", { class: "mjr-menu-divider" }, null, -1), U("div", ry, J(l.value ? "AI Smart Collections are disabled (enable vector search env var)." : "AI Smart Collections are disabled in settings."), 1)], 64)) : G("", !0), !c.value && k.value ? (q(), X(H, { key: 6 }, [ t[7] ||= U("div", { class: "mjr-menu-divider" }, null, -1), - U("div", ny, J(Z(R)("label.smartSuggestions", "Smart Suggestions")), 1), - U("div", ry, J(Z(R)("label.smartCollectionsHint", "Create collections from AI-detected themes")), 1), - (q(!0), X(H, null, pr(Z(Iv), (e) => (q(), nr(n, { + U("div", iy, J(Z(R)("label.smartSuggestions", "Smart Suggestions")), 1), + U("div", ay, J(Z(R)("label.smartCollectionsHint", "Create collections from AI-detected themes")), 1), + (q(!0), X(H, null, hr(Z(Rv), (e) => (q(), ir(n, { key: e.key, type: "button", class: "mjr-menu-item mjr-menu-item--smart", @@ -19829,12 +19829,12 @@ var Uv = { class: "mjr-menu mjr-collections-menu" }, Wv = { class: "mjr-menu-ite disabled: _.value !== "", onClick: (t) => oe(e) }, { - default: W(() => [U("span", iy, [U("i", { class: wr(e.iconClass) }, null, 2), U("span", null, J(e.label), 1)]), t[5] ||= U("i", { class: "pi pi-plus mjr-menu-item-check mjr-menu-item-check--visible" }, null, -1)]), + default: W(() => [U("span", oy, [U("i", { class: Er(e.iconClass) }, null, 2), U("span", null, J(e.label), 1)]), t[5] ||= U("i", { class: "pi pi-plus mjr-menu-item-check mjr-menu-item-check--visible" }, null, -1)]), _: 2 }, 1032, ["disabled", "onClick"]))), 128)), t[8] ||= U("div", { class: "mjr-menu-divider" }, null, -1), - U("div", ay, J(Z(R)("label.discoverGroups", "Discover Groups")), 1), - U("div", oy, J(Z(R)("label.discoverGroupsHint", "AI clusters assets by visual similarity")), 1), + U("div", sy, J(Z(R)("label.discoverGroups", "Discover Groups")), 1), + U("div", cy, J(Z(R)("label.discoverGroupsHint", "AI clusters assets by visual similarity")), 1), Y(n, { type: "button", class: "mjr-menu-item mjr-menu-item--cluster", @@ -19843,25 +19843,25 @@ var Uv = { class: "mjr-menu mjr-collections-menu" }, Wv = { class: "mjr-menu-ite disabled: m.value || _.value !== "", onClick: se }, { - default: W(() => [U("span", sy, [t[6] ||= U("i", { class: "pi pi-search" }, null, -1), U("span", null, J(m.value ? Z(R)("label.analyzing", "Analyzing...") : Z(R)("label.analyzeLibrary", "Analyze library")), 1)])]), + default: W(() => [U("span", ly, [t[6] ||= U("i", { class: "pi pi-search" }, null, -1), U("span", null, J(m.value ? Z(R)("label.analyzing", "Analyzing...") : Z(R)("label.analyzeLibrary", "Analyze library")), 1)])]), _: 1 }, 8, ["disabled"]), - g.value ? (q(), X("div", cy, J(g.value), 1)) : G("", !0), - (q(!0), X(H, null, pr(h.value, (e) => (q(), X("div", { + g.value ? (q(), X("div", uy, J(g.value), 1)) : G("", !0), + (q(!0), X(H, null, hr(h.value, (e) => (q(), X("div", { key: e.cluster_id, class: "mjr-cluster-row" }, [ - U("div", ly, [(q(!0), X(H, null, pr(Array.isArray(e.sample_assets) ? e.sample_assets.slice(0, 3) : [], (t, n) => (q(), X("img", { + U("div", dy, [(q(!0), X(H, null, hr(Array.isArray(e.sample_assets) ? e.sample_assets.slice(0, 3) : [], (t, n) => (q(), X("img", { key: `${e.cluster_id}-${n}`, class: "mjr-cluster-thumb", src: N(t), alt: String(t?.filename || e._label || ""), loading: "lazy" - }, null, 8, uy))), 128))]), - U("div", dy, [U("div", { + }, null, 8, fy))), 128))]), + U("div", py, [U("div", { class: "mjr-cluster-name", title: e._label - }, J(e._label), 9, fy), U("div", py, J(Number(e.size || 0)) + " " + J(Z(R)("label.assets", "assets")), 1)]), + }, J(e._label), 9, my), U("div", hy, J(Number(e.size || 0)) + " " + J(Z(R)("label.assets", "assets")), 1)]), Y(n, { type: "button", class: "mjr-cluster-create-btn", @@ -19870,7 +19870,7 @@ var Uv = { class: "mjr-menu mjr-collections-menu" }, Wv = { class: "mjr-menu-ite title: Z(R)("ctx.createCollection", "Create collection"), onClick: (t) => L(e) }, { - default: W(() => [er(J(_.value === `cluster:${String(e.cluster_id ?? "")}` ? Z(R)("label.loading", "Loading...") : Z(R)("label.create", "Create")), 1)]), + default: W(() => [nr(J(_.value === `cluster:${String(e.cluster_id ?? "")}` ? Z(R)("label.loading", "Loading...") : Z(R)("label.create", "Create")), 1)]), _: 2 }, 1032, [ "disabled", @@ -19882,16 +19882,16 @@ var Uv = { class: "mjr-menu mjr-collections-menu" }, Wv = { class: "mjr-menu-ite ])], 512); }; } -}), gy = { class: "mjr-popover mjr-pinned-folders-popover mjr-popover--hidden" }, _y = { +}), vy = { class: "mjr-popover mjr-pinned-folders-popover mjr-popover--hidden" }, yy = { key: 0, class: "mjr-muted mjr-pinned-folders-empty" -}, vy = { +}, by = { key: 1, class: "mjr-muted mjr-pinned-folders-empty" -}, yy = { class: "mjr-pinned-folder-label" }, by = { +}, xy = { class: "mjr-pinned-folder-label" }, Sy = { key: 0, class: "mjr-menu-item-hint mjr-pinned-folder-path" -}, xy = /* @__PURE__ */ lr({ +}, Cy = /* @__PURE__ */ dr({ __name: "PinnedFoldersPopover", setup(e, { expose: t }) { let n = Q(null), r = Q([]), i = Q(!1), a = Q("No pinned folders"), o = Q("Loading..."), s = Q("Unpin folder"), c = Q(null), l = Q(null); @@ -19922,13 +19922,13 @@ var Uv = { class: "mjr-menu mjr-collections-menu" }, Wv = { class: "mjr-menu-ite setPinnedFolders: d, setPinnedFoldersLoading: f }), (e, t) => { - let c = rr("MButton"); - return q(), X("div", gy, [U("div", { + let c = ar("MButton"); + return q(), X("div", vy, [U("div", { ref_key: "menuRef", ref: n, class: "mjr-menu mjr-pinned-folders-menu", role: "menu" - }, [i.value ? (q(), X("div", _y, J(o.value), 1)) : r.value.length ? (q(!0), X(H, { key: 2 }, pr(r.value, (e) => (q(), X("div", { + }, [i.value ? (q(), X("div", yy, J(o.value), 1)) : r.value.length ? (q(!0), X(H, { key: 2 }, hr(r.value, (e) => (q(), X("div", { key: e.id, class: "mjr-pinned-folder-row" }, [Y(c, { @@ -19938,7 +19938,7 @@ var Uv = { class: "mjr-menu mjr-collections-menu" }, Wv = { class: "mjr-menu-ite severity: "secondary", onClick: (t) => p(e) }, { - default: W(() => [U("span", yy, J(e.label), 1), e.path ? (q(), X("span", by, J(e.path), 1)) : G("", !0)]), + default: W(() => [U("span", xy, J(e.label), 1), e.path ? (q(), X("span", Sy, J(e.path), 1)) : G("", !0)]), _: 2 }, 1032, ["onClick"]), Y(c, { type: "button", @@ -19958,13 +19958,13 @@ var Uv = { class: "mjr-menu mjr-collections-menu" }, Wv = { class: "mjr-menu-ite "title", "aria-label", "onClick" - ])]))), 128)) : (q(), X("div", vy, J(a.value), 1))], 512)]); + ])]))), 128)) : (q(), X("div", by, J(a.value), 1))], 512)]); }; } -}), Sy = { +}), wy = { class: "mjr-popover mjr-custom-popover", style: { display: "none" } -}, Cy = { class: "mjr-popover-row" }, wy = { class: "mjr-popover-label" }, Ty = { class: "mjr-popover-row mjr-popover-row--actions" }, Ey = /* @__PURE__ */ lr({ +}, Ty = { class: "mjr-popover-row" }, Ey = { class: "mjr-popover-label" }, Dy = { class: "mjr-popover-row mjr-popover-row--actions" }, Oy = /* @__PURE__ */ dr({ __name: "CustomRootsPopover", setup(e, { expose: t }) { let n = Q([{ @@ -20047,8 +20047,8 @@ var Uv = { class: "mjr-menu mjr-collections-menu" }, Wv = { class: "mjr-menu-ite return s(o.value); } }), (e, t) => { - let s = rr("MSelect"), c = rr("MButton"); - return q(), X("div", Sy, [U("div", Cy, [U("div", wy, J(Z(R)("label.folder")), 1), Y(s, { + let s = ar("MSelect"), c = ar("MButton"); + return q(), X("div", wy, [U("div", Ty, [U("div", Ey, J(Z(R)("label.folder")), 1), Y(s, { class: "mjr-select", "model-value": r.value, options: n.value, @@ -20060,14 +20060,14 @@ var Uv = { class: "mjr-menu mjr-collections-menu" }, Wv = { class: "mjr-menu-ite "model-value", "options", "disabled" - ])]), U("div", Ty, [Y(c, { + ])]), U("div", Dy, [Y(c, { ref_key: "customAddBtnRef", ref: a, type: "button", class: "mjr-btn", severity: "secondary" }, { - default: W(() => [er(J(Z(R)("btn.add")), 1)]), + default: W(() => [nr(J(Z(R)("btn.add")), 1)]), _: 1 }, 512), Y(c, { ref_key: "customRemoveBtnRef", @@ -20077,15 +20077,15 @@ var Uv = { class: "mjr-menu mjr-collections-menu" }, Wv = { class: "mjr-menu-ite severity: "secondary", disabled: "" }, { - default: W(() => [er(J(Z(R)("btn.remove")), 1)]), + default: W(() => [nr(J(Z(R)("btn.remove")), 1)]), _: 1 }, 512)])]); }; } -}), Dy = ["aria-label"], Oy = { class: "mjr-messages-head" }, ky = { class: "mjr-messages-actions" }, Ay = ["title"], jy = { class: "mjr-messages-star-label" }, My = { +}), ky = ["aria-label"], Ay = { class: "mjr-messages-head" }, jy = { class: "mjr-messages-actions" }, My = ["title"], Ny = { class: "mjr-messages-star-label" }, Py = { class: "mjr-messages-tabs", role: "tablist" -}, Ny = { class: "mjr-messages-panels" }, Py = { class: "mjr-messages-empty" }, Fy = "https://github.com/MajoorWaldi/ComfyUI-Majoor-AssetsManager", Iy = /* @__PURE__ */ lr({ +}, Fy = { class: "mjr-messages-panels" }, Iy = { class: "mjr-messages-empty" }, Ly = "https://github.com/MajoorWaldi/ComfyUI-Majoor-AssetsManager", Ry = /* @__PURE__ */ dr({ __name: "MessagePopover", setup(e, { expose: t }) { let n = Q(null), r = Q(null), i = Q(null), a = Q(null), o = Q(null), s = Q(null), c = Q(null), l = Q(null), u = Q(null), d = Q(null), f = Q(null), p = (e) => e?.$el || e || null; @@ -20124,7 +20124,7 @@ var Uv = { class: "mjr-menu mjr-collections-menu" }, Wv = { class: "mjr-menu-ite return f.value; } }), (e, t) => { - let p = rr("MButton"), m = rr("MDialog"); + let p = ar("MButton"), m = ar("MDialog"); return q(), X("div", { class: "mjr-popover mjr-messages-popover", id: "mjr-messages-popover", @@ -20150,12 +20150,12 @@ var Uv = { class: "mjr-menu mjr-collections-menu" }, Wv = { class: "mjr-menu-ite } }, { default: W(() => [ - U("div", Oy, [U("div", { + U("div", Ay, [U("div", { ref_key: "titleRef", ref: n, class: "mjr-messages-title" - }, J(Z(R)("label.messages", "Messages")), 513), U("div", ky, [U("a", { - href: Fy, + }, J(Z(R)("label.messages", "Messages")), 513), U("div", jy, [U("a", { + href: Ly, target: "_blank", rel: "noopener noreferrer", class: "mjr-btn mjr-messages-star-link", @@ -20163,7 +20163,7 @@ var Uv = { class: "mjr-menu mjr-collections-menu" }, Wv = { class: "mjr-menu-ite }, [t[0] ||= U("span", { class: "mjr-messages-star-icon", "aria-hidden": "true" - }, "★", -1), U("span", jy, J(Z(R)("btn.giveStar", "Give a star")), 1)], 8, Ay), Y(p, { + }, "★", -1), U("span", Ny, J(Z(R)("btn.giveStar", "Give a star")), 1)], 8, My), Y(p, { ref_key: "markReadBtnRef", ref: r, type: "button", @@ -20171,10 +20171,10 @@ var Uv = { class: "mjr-menu mjr-collections-menu" }, Wv = { class: "mjr-menu-ite severity: "secondary", title: Z(R)("tooltip.markMessagesRead", "Mark all messages as read") }, { - default: W(() => [er(J(Z(R)("btn.markAllRead", "Mark all read")), 1)]), + default: W(() => [nr(J(Z(R)("btn.markAllRead", "Mark all read")), 1)]), _: 1 }, 8, ["title"])])]), - U("div", My, [ + U("div", Py, [ Y(p, { ref_key: "messageTabBtnRef", ref: i, @@ -20239,11 +20239,11 @@ var Uv = { class: "mjr-menu mjr-collections-menu" }, Wv = { class: "mjr-menu-ite "aria-controls": "mjr-shortcuts-panel", id: "mjr-shortcuts-tab" }, { - default: W(() => [er(J(Z(R)("msg.shortcuts.title", "Shortcut Guide")), 1)]), + default: W(() => [nr(J(Z(R)("msg.shortcuts.title", "Shortcut Guide")), 1)]), _: 1 }, 512) ]), - U("div", Ny, [ + U("div", Fy, [ U("div", { ref_key: "messageListRef", ref: u, @@ -20251,7 +20251,7 @@ var Uv = { class: "mjr-menu mjr-collections-menu" }, Wv = { class: "mjr-menu-ite id: "mjr-messages-panel", role: "tabpanel", "aria-labelledby": "mjr-messages-tab" - }, [U("div", Py, J(Z(R)("msg.noMessages", "No messages for now.")), 1)], 512), + }, [U("div", Iy, J(Z(R)("msg.noMessages", "No messages for now.")), 1)], 512), U("div", { ref_key: "historyPanelRef", ref: d, @@ -20273,13 +20273,13 @@ var Uv = { class: "mjr-menu mjr-collections-menu" }, Wv = { class: "mjr-menu-ite ]) ]), _: 1 - })], 8, Dy); + })], 8, ky); }; } -}), Ly = { class: "mjr-am-header-row" }, Ry = { class: "mjr-am-header-left" }, zy = { class: "mjr-am-header-title" }, By = ["data-mjr-version-channel", "title"], Vy = { class: "mjr-tabs" }, Hy = { class: "mjr-am-header-tools" }, Uy = { +}), zy = { class: "mjr-am-header-row" }, By = { class: "mjr-am-header-left" }, Vy = { class: "mjr-am-header-title" }, Hy = ["data-mjr-version-channel", "title"], Uy = { class: "mjr-tabs" }, Wy = { class: "mjr-am-header-tools" }, Gy = { class: "mjr-popover-anchor", style: { display: "none" } -}, Wy = { class: "mjr-popover-anchor" }, Gy = { class: "mjr-popover-anchor" }, Ky = { class: "mjr-popover-anchor" }, qy = { class: "mjr-popover-anchor" }, Jy = { class: "mjr-popover-anchor" }, Yy = "mjr-am-version-badge-label", Xy = "V", Zy = /* @__PURE__ */ lr({ +}, Ky = { class: "mjr-popover-anchor" }, qy = { class: "mjr-popover-anchor" }, Jy = { class: "mjr-popover-anchor" }, Yy = { class: "mjr-popover-anchor" }, Xy = { class: "mjr-popover-anchor" }, Zy = "mjr-am-version-badge-label", Qy = "V", $y = /* @__PURE__ */ dr({ __name: "HeaderSection", setup(n, { expose: r }) { let i = null; @@ -20317,7 +20317,7 @@ var Uv = { class: "mjr-menu mjr-collections-menu" }, Wv = { class: "mjr-menu-ite rating_desc: "pi pi-star-fill", size_desc: "pi pi-sort-numeric-down-alt", size_asc: "pi pi-sort-numeric-up-alt" - }, l = lh(), u = s() === "nightly", d = Q(null), f = Q(null), p = Q(null), m = Q(null), h = Q(null), g = Q(null), _ = Q(null), y = Q(null), b = Q(null), x = Q(null), S = Q(null), C = Q(null), w = Q(null), T = Q(null), E = Q(null), D = Q(null), O = Q(null), k = Q(null), A = Q(null), j = Q(null), M = Q(null), N = Q(null), P = Q(null), ee = Q(null), te = Q(null), F = Q(null), I = (e) => e?.$el || e || null, ne = Q(u ? "nightly" : "v?"), ie = Q(u ? "nightly" : "stable"), ae = Q(!1), oe = Q(!1), se = K(() => c[l.sort] ?? "pi pi-sort-amount-down"), ce = K(() => String(l.viewScope || l.scope || "output").toLowerCase()), le = K(() => ce.value === "similar" || Array.isArray(l.similarResults) && l.similarResults.length > 0 || !!l.similarTitle), ue = K(() => { + }, l = dh(), u = s() === "nightly", d = Q(null), f = Q(null), p = Q(null), m = Q(null), h = Q(null), g = Q(null), _ = Q(null), y = Q(null), b = Q(null), x = Q(null), S = Q(null), C = Q(null), w = Q(null), T = Q(null), E = Q(null), D = Q(null), O = Q(null), k = Q(null), A = Q(null), j = Q(null), M = Q(null), N = Q(null), P = Q(null), ee = Q(null), te = Q(null), F = Q(null), I = (e) => e?.$el || e || null, ne = Q(u ? "nightly" : "v?"), ie = Q(u ? "nightly" : "stable"), ae = Q(!1), oe = Q(!1), se = K(() => c[l.sort] ?? "pi pi-sort-amount-down"), ce = K(() => String(l.viewScope || l.scope || "output").toLowerCase()), le = K(() => ce.value === "similar" || Array.isArray(l.similarResults) && l.similarResults.length > 0 || !!l.similarTitle), ue = K(() => { let e = String(l.similarSourceAssetId || ""); return e.startsWith("stack:") || e.startsWith("duplicates:") || e.startsWith("group:") || e.startsWith("node:") ? "group" : "similar"; }), de = K(() => ue.value === "group" ? R("tab.group", "Group") : R("tab.similar", "Similar")), fe = K(() => ue.value === "group" ? R("tooltip.tab.group", "Browse current grouped assets") : R("tooltip.tab.similar", "Browse current similar findings")), pe = { @@ -20354,12 +20354,12 @@ var Uv = { class: "mjr-menu mjr-collections-menu" }, Wv = { class: "mjr-menu-ite verticalAlign: "middle" })), he = K(() => oe.value ? R("tooltip.closeMFV", "Close Majoor Floating Viewer") : R("tooltip.openMFV", "Open Majoor Floating Viewer")), ge = K(() => "pi pi-eye"), _e = K(() => R("tooltip.openMajoorSettings", "Open Majoor Assets Manager settings")); async function ve() { - let n = Pe(); + let n = rt(); if (!n || typeof n != "object") { e(R("toast.workflowSerializeFailed", "Could not read the current ComfyUI workflow."), "error"); return; } - let r = await b_({ + let r = await S_({ workflow: n, name: String(n?.name || n?.title || "workflow").trim() }), i = String(r?.name || "").trim(); @@ -20386,7 +20386,7 @@ var Uv = { class: "mjr-menu mjr-collections-menu" }, Wv = { class: "mjr-menu-ite async function ye() { let t = ""; try { - let e = await L(st.BROWSE_FOLDER, {}); + let e = await L(it.BROWSE_FOLDER, {}); e?.ok && (t = String(e?.data?.path || "").trim()); } catch (e) { console.debug?.(e); @@ -20400,8 +20400,8 @@ var Uv = { class: "mjr-menu mjr-collections-menu" }, Wv = { class: "mjr-menu-ite if (!n?.ok) e(n?.error || R("toast.failedSetWorkflowRoots", "Failed to set workflow roots"), "error"); else { try { - let e = Jt(); - e.paths = e.paths || {}, e.paths.workflowRoots = String(n?.data?.workflow_roots_text || t).trim(), Tn(e), window.dispatchEvent(new CustomEvent("mjr-settings-changed", { detail: { + let e = Vn(); + e.paths = e.paths || {}, e.paths.workflowRoots = String(n?.data?.workflow_roots_text || t).trim(), Fn(e), window.dispatchEvent(new CustomEvent("mjr-settings-changed", { detail: { key: "paths.workflowRoots", value: t } })), window.dispatchEvent(new CustomEvent("mjr:reload-grid", { detail: { reason: "workflow-root-pick" } })); @@ -20478,7 +20478,7 @@ var Uv = { class: "mjr-menu mjr-collections-menu" }, Wv = { class: "mjr-menu-ite } async function Te(e) { try { - let t = await re(st.VERSION, { cache: "no-cache" }); + let t = await re(it.VERSION, { cache: "no-cache" }); if (!t?.ok) return; let n = String(t.data?.version || "").trim(); if (o(n, String(t.data?.branch || "").trim().toLowerCase()) || e) { @@ -20490,7 +20490,7 @@ var Uv = { class: "mjr-menu mjr-collections-menu" }, Wv = { class: "mjr-menu-ite } function Ee() { try { - Lt(I(y.value), he.value, Xy); + Lt(I(y.value), he.value, Qy); } catch (e) { console.debug?.(e); } @@ -20510,7 +20510,7 @@ var Uv = { class: "mjr-menu mjr-collections-menu" }, Wv = { class: "mjr-menu-ite window.dispatchEvent(new CustomEvent(V.MFV_TOGGLE)); } function Ae() { - qn(); + Yn(); } function je() { try { @@ -20519,10 +20519,10 @@ var Uv = { class: "mjr-menu mjr-collections-menu" }, Wv = { class: "mjr-menu-ite console.debug?.(e); } } - return or(oe, () => { + return cr(oe, () => { Ee(); - }), kr(async () => { - await sr(), De(), Ee(), we(u), Te(u); + }), jr(async () => { + await lr(), De(), Ee(), we(u), Te(u); try { typeof window < "u" && window.addEventListener(V.MFV_VISIBILITY_CHANGED, Oe); } catch (e) { @@ -20533,7 +20533,7 @@ var Uv = { class: "mjr-menu mjr-collections-menu" }, Wv = { class: "mjr-menu-ite } catch (e) { console.debug?.(e); } - }), tr(() => { + }), rr(() => { je(); }), r({ isVueHeader: !0, @@ -20717,17 +20717,17 @@ var Uv = { class: "mjr-menu mjr-collections-menu" }, Wv = { class: "mjr-menu-ite }, _headerDispose: je }), (e, t) => { - let n = rr("MButton"); + let n = ar("MButton"); return q(), X(H, null, [U("div", { ref_key: "headerRef", ref: d, class: "mjr-am-header" - }, [U("div", Ly, [U("div", Ry, [ + }, [U("div", zy, [U("div", By, [ t[2] ||= U("i", { class: "mjr-am-header-icon pi pi-folder", "aria-hidden": "true" }, null, -1), - U("div", zy, J(Z(R)("manager.title")), 1), + U("div", Vy, J(Z(R)("manager.title")), 1), U("a", { href: "https://ko-fi.com/majoorwaldi", target: "_blank", @@ -20735,100 +20735,100 @@ var Uv = { class: "mjr-menu mjr-collections-menu" }, Wv = { class: "mjr-menu-ite class: "mjr-am-version-badge", "data-mjr-version-channel": ie.value, title: Z(R)("tooltip.supportKofi"), - style: yr(me.value), + style: xr(me.value), onMouseenter: t[0] ||= (e) => ae.value = !0, onMouseleave: t[1] ||= (e) => ae.value = !1 - }, [U("span", { class: wr(Yy) }, J(ne.value), 1)], 44, By) + }, [U("span", { class: Er(Zy) }, J(ne.value), 1)], 44, Hy) ]), U("div", { ref_key: "headerActionsRef", ref: f, class: "mjr-am-header-actions" - }, [U("div", Vy, [ + }, [U("div", Uy, [ Y(n, { ref_key: "tabAllRef", ref: M, type: "button", - class: wr(["mjr-tab", { "is-active": ce.value === "all" }]), + class: Er(["mjr-tab", { "is-active": ce.value === "all" }]), severity: "secondary", text: "", "data-scope": "all", title: Z(R)("tooltip.tab.all") }, { - default: W(() => [er(J(Z(R)("tab.all")), 1)]), + default: W(() => [nr(J(Z(R)("tab.all")), 1)]), _: 1 }, 8, ["class", "title"]), Y(n, { ref_key: "tabInputsRef", ref: N, type: "button", - class: wr(["mjr-tab", { "is-active": ce.value === "input" }]), + class: Er(["mjr-tab", { "is-active": ce.value === "input" }]), severity: "secondary", text: "", "data-scope": "input", title: Z(R)("tooltip.tab.input") }, { - default: W(() => [er(J(Z(R)("tab.input")), 1)]), + default: W(() => [nr(J(Z(R)("tab.input")), 1)]), _: 1 }, 8, ["class", "title"]), Y(n, { ref_key: "tabOutputsRef", ref: P, type: "button", - class: wr(["mjr-tab", { "is-active": ce.value === "output" }]), + class: Er(["mjr-tab", { "is-active": ce.value === "output" }]), severity: "secondary", text: "", "data-scope": "output", title: Z(R)("tooltip.tab.output") }, { - default: W(() => [er(J(Z(R)("tab.output")), 1)]), + default: W(() => [nr(J(Z(R)("tab.output")), 1)]), _: 1 }, 8, ["class", "title"]), Y(n, { ref_key: "tabCustomRef", ref: ee, type: "button", - class: wr(["mjr-tab", { "is-active": ce.value === "custom" }]), + class: Er(["mjr-tab", { "is-active": ce.value === "custom" }]), severity: "secondary", text: "", "data-scope": "custom", title: Z(R)("tooltip.tab.custom") }, { - default: W(() => [er(J(Z(R)("tab.custom")), 1)]), + default: W(() => [nr(J(Z(R)("tab.custom")), 1)]), _: 1 }, 8, ["class", "title"]), Y(n, { ref_key: "tabWorkflowRef", ref: te, type: "button", - class: wr(["mjr-tab", { "is-active": ce.value === "workflow" }]), + class: Er(["mjr-tab", { "is-active": ce.value === "workflow" }]), severity: "secondary", text: "", "data-scope": "workflow", title: Z(R)("tooltip.tab.workflow", "Browse saved workflows") }, { - default: W(() => [er(J(Z(R)("tab.workflow", "Workflow")), 1)]), + default: W(() => [nr(J(Z(R)("tab.workflow", "Workflow")), 1)]), _: 1 }, 8, ["class", "title"]), Y(n, { ref_key: "tabSimilarRef", ref: F, type: "button", - class: wr(["mjr-tab", { "is-active": ce.value === "similar" }]), + class: Er(["mjr-tab", { "is-active": ce.value === "similar" }]), severity: "secondary", text: "", "data-scope": "similar", - style: yr({ display: le.value ? "" : "none" }), + style: xr({ display: le.value ? "" : "none" }), title: fe.value }, { - default: W(() => [er(J(de.value), 1)]), + default: W(() => [nr(J(de.value), 1)]), _: 1 }, 8, [ "class", "style", "title" ]) - ]), U("div", Hy, [ - ce.value === "workflow" ? (q(), nr(n, { + ]), U("div", Wy, [ + ce.value === "workflow" ? (q(), ir(n, { key: 0, ref_key: "saveWorkflowBtnRef", ref: S, @@ -20847,7 +20847,7 @@ var Uv = { class: "mjr-menu mjr-collections-menu" }, Wv = { class: "mjr-menu-ite }, null, -1)]]), _: 1 }, 8, ["title", "aria-label"])) : G("", !0), - ce.value === "workflow" ? (q(), nr(n, { + ce.value === "workflow" ? (q(), ir(n, { key: 1, ref_key: "pickWorkflowRootBtnRef", ref: C, @@ -20866,7 +20866,7 @@ var Uv = { class: "mjr-menu mjr-collections-menu" }, Wv = { class: "mjr-menu-ite }, null, -1)]]), _: 1 }, 8, ["title", "aria-label"])) : G("", !0), - ce.value === "workflow" ? (q(), nr(n, { + ce.value === "workflow" ? (q(), ir(n, { key: 2, type: "button", class: "mjr-icon-btn mjr-import-workflow-btn", @@ -20892,7 +20892,7 @@ var Uv = { class: "mjr-menu mjr-collections-menu" }, Wv = { class: "mjr-menu-ite style: { display: "none" }, onChange: Se }, null, 544), - U("div", Uy, [Y(n, { + U("div", Gy, [Y(n, { ref_key: "customMenuBtnRef", ref: p, type: "button", @@ -20908,7 +20908,7 @@ var Uv = { class: "mjr-menu mjr-collections-menu" }, Wv = { class: "mjr-menu-ite "aria-hidden": "true" }, null, -1)]]), _: 1 - }, 8, ["title", "aria-label"]), Y(Ey, { + }, 8, ["title", "aria-label"]), Y(Oy, { ref_key: "customPopoverRef", ref: A }, null, 512)]), @@ -20916,7 +20916,7 @@ var Uv = { class: "mjr-menu mjr-collections-menu" }, Wv = { class: "mjr-menu-ite ref_key: "mfvBtnRef", ref: y, type: "button", - class: wr(["mjr-icon-btn", { "mjr-mfv-btn-active": oe.value }]), + class: Er(["mjr-icon-btn", { "mjr-mfv-btn-active": oe.value }]), severity: "secondary", text: "", rounded: "", @@ -20925,7 +20925,7 @@ var Uv = { class: "mjr-menu mjr-collections-menu" }, Wv = { class: "mjr-menu-ite onClick: ke }, { default: W(() => [U("i", { - class: wr(ge.value), + class: Er(ge.value), "aria-hidden": "true" }, null, 2)]), _: 1 @@ -20934,7 +20934,7 @@ var Uv = { class: "mjr-menu mjr-collections-menu" }, Wv = { class: "mjr-menu-ite "title", "aria-label" ]), - U("div", Wy, [Y(n, { + U("div", Ky, [Y(n, { ref_key: "messageBtnRef", ref: b, type: "button", @@ -20954,7 +20954,7 @@ var Uv = { class: "mjr-menu mjr-collections-menu" }, Wv = { class: "mjr-menu-ite "aria-hidden": "true" }, null, -1)]]), _: 1 - }, 8, ["title", "aria-label"]), Y(Iy, { + }, 8, ["title", "aria-label"]), Y(Ry, { ref_key: "messagePopoverRef", ref: j }, null, 512)]), @@ -20976,11 +20976,11 @@ var Uv = { class: "mjr-menu mjr-collections-menu" }, Wv = { class: "mjr-menu-ite }, null, -1)]]), _: 1 }, 8, ["title", "aria-label"]) - ])], 512)])], 512), Y(I_, { + ])], 512)])], 512), Y(R_, { ref_key: "searchBarRef", ref: T }, { - "filter-anchor": W(() => [U("div", Gy, [Y(n, { + "filter-anchor": W(() => [U("div", qy, [Y(n, { ref_key: "filterBtnRef", ref: m, type: "button", @@ -20996,11 +20996,11 @@ var Uv = { class: "mjr-menu mjr-collections-menu" }, Wv = { class: "mjr-menu-ite "aria-hidden": "true" }, null, -1)]]), _: 1 - }, 8, ["title", "aria-label"]), Y(Pv, { + }, 8, ["title", "aria-label"]), Y(Iv, { ref_key: "filterPopoverRef", ref: D }, null, 512)])]), - "sort-anchor": W(() => [U("div", Ky, [Y(n, { + "sort-anchor": W(() => [U("div", Jy, [Y(n, { ref_key: "sortBtnRef", ref: h, type: "button", @@ -21012,15 +21012,15 @@ var Uv = { class: "mjr-menu mjr-collections-menu" }, Wv = { class: "mjr-menu-ite "aria-label": Z(R)("label.sort") }, { default: W(() => [U("i", { - class: wr(se.value), + class: Er(se.value), "aria-hidden": "true" }, null, 2)]), _: 1 - }, 8, ["title", "aria-label"]), Y(z_, { + }, 8, ["title", "aria-label"]), Y(V_, { ref_key: "sortPopoverRef", ref: E }, null, 512)])]), - "collections-anchor": W(() => [U("div", qy, [Y(n, { + "collections-anchor": W(() => [U("div", Yy, [Y(n, { ref_key: "collectionsBtnRef", ref: g, type: "button", @@ -21036,11 +21036,11 @@ var Uv = { class: "mjr-menu mjr-collections-menu" }, Wv = { class: "mjr-menu-ite "aria-hidden": "true" }, null, -1)]]), _: 1 - }, 8, ["title", "aria-label"]), Y(hy, { + }, 8, ["title", "aria-label"]), Y(_y, { ref_key: "collectionsPopoverRef", ref: O }, null, 512)])]), - "pinned-folders-anchor": W(() => [U("div", Jy, [Y(n, { + "pinned-folders-anchor": W(() => [U("div", Xy, [Y(n, { ref_key: "pinnedFoldersBtnRef", ref: _, type: "button", @@ -21056,7 +21056,7 @@ var Uv = { class: "mjr-menu mjr-collections-menu" }, Wv = { class: "mjr-menu-ite "aria-hidden": "true" }, null, -1)]]), _: 1 - }, 8, ["title", "aria-label"]), Y(xy, { + }, 8, ["title", "aria-label"]), Y(Cy, { ref_key: "pinnedFoldersPopoverRef", ref: k }, null, 512)])]), @@ -21064,20 +21064,20 @@ var Uv = { class: "mjr-menu mjr-collections-menu" }, Wv = { class: "mjr-menu-ite }, 512)], 64); }; } -}), Qy = (e) => { +}), eb = (e) => { try { return String(e ?? ""); } catch { return ""; } -}, $y = (e) => { +}, tb = (e) => { let t = String(e || ""); return R(t === "name_asc" ? "sort.nameAZ" : t === "name_desc" ? "sort.nameZA" : t === "mtime_asc" ? "sort.oldest" : "sort.newest"); -}, eb = (e) => { +}, nb = (e) => { let t = String(e || "").toLowerCase(); return t === "similar" ? R("scope.similar", "Similar") : t === "custom" ? R("scope.customBrowser") : t === "workflow" ? R("scope.workflow", "Workflow") : R(t === "all" ? "tab.all" : t === "input" || t === "inputs" ? "scope.input" : "scope.output"); }; -function tb({ label: e, value: t, onClear: n } = {}) { +function rb({ label: e, value: t, onClear: n } = {}) { let r = document.createElement("div"); r.className = "mjr-context-pill"; let i = document.createElement("span"); @@ -21098,69 +21098,69 @@ function tb({ label: e, value: t, onClear: n } = {}) { } return r; } -function nb() { +function ib() { let e = document.createElement("div"); return e.className = "mjr-am-context-pills", { wrap: e, update: ({ state: t, rawQuery: n = "", actions: r = null } = {}) => { - let i = r && typeof r == "object" ? r : {}, a = Qy(n || "").trim(), o = a.length > 0 && a !== "*", s = !!(Qy(t?.kindFilter || "").trim() || t?.workflowOnly || (Number(t?.minRating || 0) || 0) > 0 || (Number(t?.minSizeMB || 0) || 0) > 0 || (Number(t?.maxSizeMB || 0) || 0) > 0 || (Number(t?.minWidth || 0) || 0) > 0 || (Number(t?.minHeight || 0) || 0) > 0 || (Number(t?.maxWidth || 0) || 0) > 0 || (Number(t?.maxHeight || 0) || 0) > 0 || Qy(t?.workflowType || "").trim() || Qy(t?.workflowId || "").trim() || Qy(t?.workflowModelFilter || "").trim() || Qy(t?.workflowRunsOnFilter || "").trim() || Qy(t?.dateRangeFilter || "").trim() || Qy(t?.dateExactFilter || "").trim()), c = Qy(t?.sort || "mtime_desc").trim() !== "mtime_desc", l = Qy(t?.collectionId || "").trim().length > 0, u = String(t?.viewScope || t?.scope || "output").toLowerCase(), d = u === "similar", f = u === "custom", p = u !== "output", m = Qy(t?.similarSourceAssetId || "").trim(); + let i = r && typeof r == "object" ? r : {}, a = eb(n || "").trim(), o = a.length > 0 && a !== "*", s = !!(eb(t?.kindFilter || "").trim() || t?.workflowOnly || (Number(t?.minRating || 0) || 0) > 0 || (Number(t?.minSizeMB || 0) || 0) > 0 || (Number(t?.maxSizeMB || 0) || 0) > 0 || (Number(t?.minWidth || 0) || 0) > 0 || (Number(t?.minHeight || 0) || 0) > 0 || (Number(t?.maxWidth || 0) || 0) > 0 || (Number(t?.maxHeight || 0) || 0) > 0 || eb(t?.workflowType || "").trim() || eb(t?.workflowId || "").trim() || eb(t?.workflowModelFilter || "").trim() || eb(t?.workflowRunsOnFilter || "").trim() || eb(t?.dateRangeFilter || "").trim() || eb(t?.dateExactFilter || "").trim()), c = eb(t?.sort || "mtime_desc").trim() !== "mtime_desc", l = eb(t?.collectionId || "").trim().length > 0, u = String(t?.viewScope || t?.scope || "output").toLowerCase(), d = u === "similar", f = u === "custom", p = u !== "output", m = eb(t?.similarSourceAssetId || "").trim(); if (o || s || c || l || p || d || e.childElementCount) { try { e.replaceChildren(); } catch (e) { console.debug?.(e); } - if (!f && l && e.appendChild(tb({ + if (!f && l && e.appendChild(rb({ label: R("label.collections"), - value: Qy(t?.collectionName || t?.collectionId || "").trim(), + value: eb(t?.collectionName || t?.collectionId || "").trim(), onClear: () => i?.clearCollection?.() - })), d && e.appendChild(tb({ + })), d && e.appendChild(rb({ label: R("search.findSimilar", "Find Similar"), value: m ? R("search.similarReference", "Reference #{id}", { id: m }) : R("scope.similar", "Similar"), onClear: () => i?.clearSimilarScope?.() - })), p && e.appendChild(tb({ + })), p && e.appendChild(rb({ label: R("label.scope"), - value: eb(u || "output"), + value: nb(u || "output"), onClear: () => d ? i?.clearSimilarScope?.() : i?.clearScope?.() - })), o && e.appendChild(tb({ + })), o && e.appendChild(rb({ label: R("label.query"), value: a, onClear: () => i?.clearQuery?.() - })), Qy(t?.kindFilter || "").trim() && e.appendChild(tb({ + })), eb(t?.kindFilter || "").trim() && e.appendChild(rb({ label: R("label.type"), - value: Qy(t?.kindFilter || "").trim(), + value: eb(t?.kindFilter || "").trim(), onClear: () => i?.clearKind?.() - })), Number(t?.minRating || 0) > 0 && e.appendChild(tb({ + })), Number(t?.minRating || 0) > 0 && e.appendChild(rb({ label: R("label.rating"), value: `>= ${Number(t?.minRating || 0)}`, onClear: () => i?.clearMinRating?.() - })), t?.workflowOnly && e.appendChild(tb({ + })), t?.workflowOnly && e.appendChild(rb({ label: R("label.workflow"), value: R("label.only"), onClear: () => i?.clearWorkflowOnly?.() - })), Qy(t?.workflowType || "").trim() && e.appendChild(tb({ + })), eb(t?.workflowType || "").trim() && e.appendChild(rb({ label: R("label.workflowType"), - value: Qy(t?.workflowType || "").trim(), + value: eb(t?.workflowType || "").trim(), onClear: () => i?.clearWorkflowType?.() - })), Qy(t?.workflowId || "").trim()) { - let n = Qy(t?.workflowId || "").trim(); - e.appendChild(tb({ + })), eb(t?.workflowId || "").trim()) { + let n = eb(t?.workflowId || "").trim(); + e.appendChild(rb({ label: R("label.sameWorkflow", "Generated with Same Workflow"), value: n.length > 18 ? `${n.slice(0, 8)}...${n.slice(-6)}` : n, onClear: () => i?.clearWorkflowId?.() })); } - if (Qy(t?.workflowModelFilter || "").trim() && e.appendChild(tb({ + if (eb(t?.workflowModelFilter || "").trim() && e.appendChild(rb({ label: R("label.workflowModelFamily", "Model family"), - value: Qy(t?.workflowModelFilter || "").trim(), + value: eb(t?.workflowModelFilter || "").trim(), onClear: () => i?.clearWorkflowModel?.() - })), Qy(t?.workflowRunsOnFilter || "").trim() && e.appendChild(tb({ + })), eb(t?.workflowRunsOnFilter || "").trim() && e.appendChild(rb({ label: R("label.workflowRunsOn", "Runs on"), - value: Qy(t?.workflowRunsOnFilter || "").trim(), + value: eb(t?.workflowRunsOnFilter || "").trim(), onClear: () => i?.clearWorkflowRunsOn?.() })), (Number(t?.minSizeMB || 0) || 0) > 0 || (Number(t?.maxSizeMB || 0) || 0) > 0) { let n = Number(t?.minSizeMB || 0) || 0, r = Number(t?.maxSizeMB || 0) || 0, a = n > 0 && r > 0 ? `${n}-${r} MB` : n > 0 ? `>= ${n} MB` : `<= ${r} MB`; - e.appendChild(tb({ + e.appendChild(rb({ label: R("sidebar.size"), value: a, onClear: () => i?.clearSize?.() @@ -21168,23 +21168,23 @@ function nb() { } if ((Number(t?.minWidth || 0) || 0) > 0 || (Number(t?.minHeight || 0) || 0) > 0 || (Number(t?.maxWidth || 0) || 0) > 0 || (Number(t?.maxHeight || 0) || 0) > 0) { let n = String(t?.resolutionCompare || "gte") === "lte", r = Number(n ? t?.maxWidth : t?.minWidth || 0) || 0, a = Number(n ? t?.maxHeight : t?.minHeight || 0) || 0; - e.appendChild(tb({ + e.appendChild(rb({ label: R("label.resolution"), value: `${n ? "<=" : ">="} ${r || 0}x${a || 0} px`, onClear: () => i?.clearResolution?.() })); } - Qy(t?.dateRangeFilter || "").trim() && e.appendChild(tb({ + eb(t?.dateRangeFilter || "").trim() && e.appendChild(rb({ label: R("sidebar.date"), - value: Qy(t?.dateRangeFilter || "").trim(), + value: eb(t?.dateRangeFilter || "").trim(), onClear: () => i?.clearDateRange?.() - })), Qy(t?.dateExactFilter || "").trim() && e.appendChild(tb({ + })), eb(t?.dateExactFilter || "").trim() && e.appendChild(rb({ label: R("label.day"), - value: Qy(t?.dateExactFilter || "").trim(), + value: eb(t?.dateExactFilter || "").trim(), onClear: () => i?.clearDateExact?.() - })), c && e.appendChild(tb({ + })), c && e.appendChild(rb({ label: R("label.sort"), - value: $y(t?.sort), + value: tb(t?.sort), onClear: () => i?.clearSort?.() })); } @@ -21192,17 +21192,17 @@ function nb() { }; } // ui/vue/components/panel/summaryBarState.ts -var rb = (e, t = "") => R(e, t, void 0), ib = (e) => { +var ab = (e, t = "") => R(e, t, void 0), ob = (e) => { try { return String(e ?? ""); } catch { return ""; } -}, ab = (e) => { +}, sb = (e) => { let t = String(e || "").toLowerCase(); - return t === "similar" ? rb("scope.similar", "Similar") : t === "workflow" ? rb("scope.workflow", "Workflow") : rb(t === "input" || t === "inputs" ? "scope.input" : t === "custom" ? "scope.customBrowser" : t === "all" ? "tab.all" : "scope.output"); + return t === "similar" ? ab("scope.similar", "Similar") : t === "workflow" ? ab("scope.workflow", "Workflow") : ab(t === "input" || t === "inputs" ? "scope.input" : t === "custom" ? "scope.customBrowser" : t === "all" ? "tab.all" : "scope.output"); }; -function ob(e) { +function cb(e) { try { let t = e?._mjrGetRenderedCards; if (typeof t == "function") { @@ -21214,7 +21214,7 @@ function ob(e) { } return []; } -function sb(e) { +function lb(e) { try { let t = String(e?.dataset?.mjrSelectedAssetIds || "").trim(); if (t) { @@ -21231,8 +21231,8 @@ function sb(e) { } return 0; } -function cb({ state: e, gridContainer: t, context: n = null } = {}) { - let r = ob(t), i = (() => { +function ub({ state: e, gridContainer: t, context: n = null } = {}) { + let r = cb(t), i = (() => { try { let e = 0; for (let t of r) String(t?._mjrAsset?.kind || "").toLowerCase() === "folder" && (e += 1); @@ -21253,12 +21253,12 @@ function cb({ state: e, gridContainer: t, context: n = null } = {}) { } catch (e) { console.debug?.(e); } - return sb(t); - })(), s = Number(t?.dataset?.mjrTotal || 0) || Math.max(0, Number(e?.lastGridTotal ?? 0) || 0), c = Number(t?.dataset?.mjrShown || 0) || Math.max(0, Number(e?.lastGridCount ?? 0) || 0) || a, l = String(e?.viewScope || e?.scope || t?.dataset?.mjrScope || "output").toLowerCase(), u = s && s >= c ? `${c}/${s}` : `${c}`, d = [`${c > 0 && i.total > 0 && i.folders === i.total ? rb("summary.folders") : rb("summary.assets")}: ${u}`]; - o > 0 && d.push(`${rb("summary.selected")}: ${o}`), d.push(ab(l)); + return lb(t); + })(), s = Number(t?.dataset?.mjrTotal || 0) || Math.max(0, Number(e?.lastGridTotal ?? 0) || 0), c = Number(t?.dataset?.mjrShown || 0) || Math.max(0, Number(e?.lastGridCount ?? 0) || 0) || a, l = String(e?.viewScope || e?.scope || t?.dataset?.mjrScope || "output").toLowerCase(), u = s && s >= c ? `${c}/${s}` : `${c}`, d = [`${c > 0 && i.total > 0 && i.folders === i.total ? ab("summary.folders") : ab("summary.assets")}: ${u}`]; + o > 0 && d.push(`${ab("summary.selected")}: ${o}`), d.push(sb(l)); try { let e = Number(t?.dataset?.mjrHiddenPngSiblings || 0) || 0; - String(t?.dataset?.mjrHidePngSiblingsEnabled || "") === "1" && e > 0 && d.push(`${rb("summary.hidden")}: ${e}`); + String(t?.dataset?.mjrHidePngSiblingsEnabled || "") === "1" && e > 0 && d.push(`${ab("summary.hidden")}: ${e}`); } catch (e) { console.debug?.(e); } @@ -21268,22 +21268,22 @@ function cb({ state: e, gridContainer: t, context: n = null } = {}) { total: s, activeScope: l, summaryText: d.filter(Boolean).join(" | "), - duplicateText: h ? `${rb("summary.duplicates")}: ${p} | ${rb("summary.similar")}: ${m}` : "", + duplicateText: h ? `${ab("summary.duplicates")}: ${p} | ${ab("summary.similar")}: ${m}` : "", showDuplicates: h, - rawQuery: ib(n?.rawQuery || "").trim() + rawQuery: ob(n?.rawQuery || "").trim() }; } // ui/vue/components/panel/SummaryBarSection.vue?vue&type=script&setup=true&lang.ts -var lb = { +var db = { key: 2, class: "mjr-folder-breadcrumb-separator" -}, ub = { +}, fb = { key: 0, class: "mjr-folder-breadcrumb-separator" -}, db = { class: "mjr-am-summary-left" }, fb = { class: "mjr-am-summary-text" }, pb = { class: "mjr-am-summary-right" }, mb = ["aria-label"], hb = /* @__PURE__ */ lr({ +}, pb = { class: "mjr-am-summary-left" }, mb = { class: "mjr-am-summary-text" }, hb = { class: "mjr-am-summary-right" }, gb = ["aria-label"], _b = /* @__PURE__ */ dr({ __name: "SummaryBarSection", setup(e, { expose: t }) { - let n = lh(), r = Q(null), i = Q(null), a = Q(null), o = Q(""), s = Q(""), c = Q(!1), l = Q(!1), u = Q(null), d = Q(null), f = Q([]), p = nb(), m = K(() => String(n.kindFilter || "").trim().toLowerCase()), h = K(() => { + let n = dh(), r = Q(null), i = Q(null), a = Q(null), o = Q(""), s = Q(""), c = Q(!1), l = Q(!1), u = Q(null), d = Q(null), f = Q([]), p = ib(), m = K(() => String(n.kindFilter || "").trim().toLowerCase()), h = K(() => { let e = R("label.type", "Type"); return [ { @@ -21330,7 +21330,7 @@ var lb = { t && (n.kindFilter = v(t) ? "" : t, y()); } function x({ state: e, gridContainer: t, context: r = null, actions: i = null } = {}) { - let a = cb({ + let a = ub({ state: e, gridContainer: t, context: r @@ -21368,7 +21368,7 @@ var lb = { console.debug?.(e); } } - return kr(() => { + return jr(() => { try { a.value?.appendChild?.(p.wrap); } catch (e) { @@ -21380,14 +21380,14 @@ var lb = { folderBreadcrumb: i, setFolderBreadcrumb: S }), (e, t) => { - let n = rr("MButton"); + let n = ar("MButton"); return q(), X(H, null, [U("div", { ref_key: "folderBreadcrumb", ref: i, - class: wr(["mjr-folder-breadcrumb", { "is-visible": l.value }]), + class: Er(["mjr-folder-breadcrumb", { "is-visible": l.value }]), "aria-label": "Folder breadcrumb" }, [ - u.value ? (q(), nr(n, { + u.value ? (q(), ir(n, { key: 0, type: "button", class: "mjr-btn-link mjr-folder-breadcrumb-action", @@ -21396,10 +21396,10 @@ var lb = { disabled: u.value.disabled, onClick: t[0] ||= (e) => C(u.value) }, { - default: W(() => [er(J(u.value.label), 1)]), + default: W(() => [nr(J(u.value.label), 1)]), _: 1 }, 8, ["disabled"])) : G("", !0), - d.value ? (q(), nr(n, { + d.value ? (q(), ir(n, { key: 1, type: "button", class: "mjr-btn-link mjr-folder-breadcrumb-action", @@ -21408,19 +21408,19 @@ var lb = { disabled: d.value.disabled, onClick: t[1] ||= (e) => C(d.value) }, { - default: W(() => [er(J(d.value.label), 1)]), + default: W(() => [nr(J(d.value.label), 1)]), _: 1 }, 8, ["disabled"])) : G("", !0), - u.value || d.value ? (q(), X("span", lb, " | ")) : G("", !0), - (q(!0), X(H, null, pr(f.value, (e, t) => (q(), X(H, { key: `${e.target}:${t}` }, [t > 0 ? (q(), X("span", ub, "/")) : G("", !0), Y(n, { + u.value || d.value ? (q(), X("span", db, " | ")) : G("", !0), + (q(!0), X(H, null, hr(f.value, (e, t) => (q(), X(H, { key: `${e.target}:${t}` }, [t > 0 ? (q(), X("span", fb, "/")) : G("", !0), Y(n, { type: "button", - class: wr(["mjr-btn-link mjr-folder-breadcrumb-segment", { "is-current": e.current }]), + class: Er(["mjr-btn-link mjr-folder-breadcrumb-segment", { "is-current": e.current }]), severity: "secondary", text: "", disabled: e.current, onClick: (t) => C(e) }, { - default: W(() => [er(J(e.label), 1)]), + default: W(() => [nr(J(e.label), 1)]), _: 2 }, 1032, [ "class", @@ -21432,15 +21432,15 @@ var lb = { ref: r, class: "mjr-am-summary", "aria-live": "polite" - }, [U("div", db, [U("div", fb, J(o.value), 1)]), U("div", pb, [ + }, [U("div", pb, [U("div", mb, J(o.value), 1)]), U("div", hb, [ U("div", { class: "mjr-media-shortcuts", "aria-label": Z(R)("label.type", "Type"), role: "group" - }, [(q(!0), X(H, null, pr(h.value, (e) => (q(), nr(n, { + }, [(q(!0), X(H, null, hr(h.value, (e) => (q(), ir(n, { key: e.kind, type: "button", - class: wr(["mjr-icon-btn mjr-media-shortcut-btn", { "mjr-context-active": v(e.kind) }]), + class: Er(["mjr-icon-btn mjr-media-shortcut-btn", { "mjr-context-active": v(e.kind) }]), severity: "secondary", text: "", rounded: "", @@ -21450,7 +21450,7 @@ var lb = { onClick: (t) => b(e.kind) }, { default: W(() => [U("i", { - class: wr(e.icon), + class: Er(e.icon), "aria-hidden": "true" }, null, 2)]), _: 2 @@ -21460,8 +21460,8 @@ var lb = { "aria-pressed", "class", "onClick" - ]))), 128))], 8, mb), - c.value ? (q(), nr(n, { + ]))), 128))], 8, gb), + c.value ? (q(), ir(n, { key: 0, type: "button", class: "mjr-am-dup-alert", @@ -21470,7 +21470,7 @@ var lb = { title: s.value, onClick: _ }, { - default: W(() => [er(J(s.value), 1)]), + default: W(() => [nr(J(s.value), 1)]), _: 1 }, 8, ["title"])) : G("", !0), U("div", { @@ -21482,11 +21482,11 @@ var lb = { } }); // ui/vue/composables/useGridContextMenu.ts -function gb(e, t) { +function vb(e, t) { let n = null; function r(e) { if (e && !e._mjrGridContextMenuBound) try { - n = Ia({ + n = Ra({ gridContainer: e, getState: t }); @@ -21500,16 +21500,16 @@ function gb(e, t) { } catch {} n = null; } - or(e, (e, t) => { + cr(e, (e, t) => { t && i(), e && r(e); - }, { immediate: !0 }), tr(i); + }, { immediate: !0 }), rr(i); } // ui/vue/composables/useGridKeyboard.ts -function _b(e) { +function yb(e) { if (!e) return () => {}; let t = e; try { - let n = Fi({ + let n = Li({ gridContainer: e, getState: () => t._mjrGetGridState?.() || {}, getSelectedAssets: () => t._mjrGetSelectedAssets?.() || [], @@ -21527,7 +21527,7 @@ function _b(e) { } catch (e) { console.debug?.("[useGridKeyboard] rect lookup failed", e); } - Fa(Math.round((i?.left || 0) + Math.min((i?.width || 0) * .5, 160)), Math.round((i?.top || 0) + Math.min((i?.height || 0) * .5, 120)), n, () => { + La(Math.round((i?.left || 0) + Math.min((i?.width || 0) * .5, 160)), Math.round((i?.top || 0) + Math.min((i?.height || 0) * .5, 120)), n, () => { t._mjrOnKeyboardAssetChanged?.(n); }); } @@ -21544,7 +21544,7 @@ function _b(e) { return console.debug?.("[useGridKeyboard] bind failed", e), () => {}; } } -function vb(e) { +function bb(e) { let t = null, n = () => { try { t?.(); @@ -21553,13 +21553,13 @@ function vb(e) { } t = null; }; - or(e, (e, r) => { - r && n(), e && (t = _b(e)); - }, { immediate: !0 }), tr(n); + cr(e, (e, r) => { + r && n(), e && (t = yb(e)); + }, { immediate: !0 }), rr(n); } // ui/vue/components/grid/assetsGridHostState.ts -function yb() {} -function bb() { +function xb() {} +function Sb() { return new Promise((e) => { try { if (typeof requestAnimationFrame == "function") { @@ -21572,7 +21572,7 @@ function bb() { e(); }); } -function xb(e, ...t) { +function Cb(e, ...t) { try { return typeof e == "function" ? e(...t) : void 0; } catch (e) { @@ -21580,21 +21580,21 @@ function xb(e, ...t) { return; } } -function Sb(e = {}) { +function wb(e = {}) { let t = Array.isArray(e.selectedIds) ? e.selectedIds.map(String).filter(Boolean) : []; return { ids: t, activeId: String(e.activeId || t[0] || "").trim() }; } -function Cb(e, t = {}, n = null) { +function Tb(e, t = {}, n = null) { return { count: Number(t.count ?? t.shown ?? e?.dataset?.mjrShown ?? n?.lastGridCount ?? 0) || 0, total: Number(t.total ?? e?.dataset?.mjrTotal ?? n?.lastGridTotal ?? 0) || 0 }; } -function wb(e, t = uh()) { - if (!e || !t) return yb; +function Eb(e, t = fh()) { + if (!e || !t) return xb; let n = 0, r = () => { if (!n) try { n = requestAnimationFrame(() => { @@ -21620,8 +21620,8 @@ function wb(e, t = uh()) { } }; } -function Tb(e, { panelStore: t = uh(), onContextChanged: n = null, markUserInteraction: r = null } = {}) { - if (!e) return yb; +function Db(e, { panelStore: t = fh(), onContextChanged: n = null, markUserInteraction: r = null } = {}) { + if (!e) return xb; let i = 0, a = () => { if (i) try { cancelAnimationFrame(i); @@ -21630,24 +21630,24 @@ function Tb(e, { panelStore: t = uh(), onContextChanged: n = null, markUserInter } try { i = requestAnimationFrame(() => { - i = 0, xb(n); + i = 0, Cb(n); }); } catch (e) { - console.debug?.(e), i = 0, xb(n); + console.debug?.(e), i = 0, Cb(n); } }, o = (r) => { let i = r?.detail || {}; if (t) { - let { count: n, total: r } = Cb(e, i, t); + let { count: n, total: r } = Tb(e, i, t); t.lastGridCount = n, t.lastGridTotal = r; } - xb(n); + Cb(n); }, s = (e) => { - if (xb(r), t) { - let { ids: n, activeId: r } = Sb(e?.detail || {}); + if (Cb(r), t) { + let { ids: n, activeId: r } = wb(e?.detail || {}); t.selectedAssetIds = n, t.activeAssetId = r; } - xb(n); + Cb(n); }; e.addEventListener("mjr:grid-stats", o), e.addEventListener("mjr:selection-changed", s); try { @@ -21695,14 +21695,14 @@ function Tb(e, { panelStore: t = uh(), onContextChanged: n = null, markUserInter } }; } -async function Eb({ initialLoadPromise: e, gridWrapper: t, gridContainer: n, panelStore: r = uh(), onRestoreSidebar: i = null } = {}) { +async function Ob({ initialLoadPromise: e, gridWrapper: t, gridContainer: n, panelStore: r = fh(), onRestoreSidebar: i = null } = {}) { if (!t || !n || !r) return; try { await e; } catch (e) { console.debug?.(e); } - await bb(); + await Sb(); let a = Number(r.scrollTop || 0) || 0; if (a > 0) try { t.scrollTop = a; @@ -21719,7 +21719,7 @@ async function Eb({ initialLoadPromise: e, gridWrapper: t, gridContainer: n, pan if (s) { let e = () => { try { - typeof n?._mjrScrollToAssetId == "function" ? n._mjrScrollToAssetId(s) : Rl(n, s)?.scrollIntoView?.({ + typeof n?._mjrScrollToAssetId == "function" ? n._mjrScrollToAssetId(s) : Bl(n, s)?.scrollIntoView?.({ block: "nearest", behavior: "instant" }); @@ -21730,13 +21730,13 @@ async function Eb({ initialLoadPromise: e, gridWrapper: t, gridContainer: n, pan e(), setTimeout(e, 160); } } - r.sidebarOpen && s && xb(i); + r.sidebarOpen && s && Cb(i); } // ui/vue/components/grid/AssetsGrid.vue -var Db = /* @__PURE__ */ lr({ +var kb = /* @__PURE__ */ dr({ __name: "AssetsGrid", setup(e, { expose: t }) { - let n = Q(null), r = Q(null), i = Q(null), a = lh(), o = K(() => i.value?.gridContainer ?? null), s = null, c = null, l = null, u = null; + let n = Q(null), r = Q(null), i = Q(null), a = dh(), o = K(() => i.value?.gridContainer ?? null), s = null, c = null, l = null, u = null; function d() { try { l?.setVisibility?.(); @@ -21747,7 +21747,7 @@ var Db = /* @__PURE__ */ lr({ function f() { try { let e = o.value; - e && $n(e); + e && tr(e); } catch (e) { console.debug?.(e); } @@ -21830,7 +21830,7 @@ var Db = /* @__PURE__ */ lr({ } }; } - ir("mjr-grid-container-ref", o), gb(o, () => a), vb(o); + or("mjr-grid-container-ref", o), vb(o, () => a), bb(o); function m() { return o.value || null; } @@ -21842,23 +21842,23 @@ var Db = /* @__PURE__ */ lr({ } catch (e) { console.debug?.(e); } - c = Tb(t, { + c = Db(t, { panelStore: a, ...e }); } } - return kr(() => { - s = wb(r.value, a), r.value && Number(a.scrollTop || 0) > 0 && (r.value.scrollTop = Number(a.scrollTop || 0)), p(); + return jr(() => { + s = Eb(r.value, a), r.value && Number(a.scrollTop || 0) > 0 && (r.value.scrollTop = Number(a.scrollTop || 0)), p(); try { window.addEventListener("mjr:keepalive-attached", f), document.addEventListener("visibilitychange", d); } catch (e) { console.debug?.(e); } d(); - }), dr(() => { + }), pr(() => { try { - Yn(m()); + Zn(m()); } catch (e) { console.debug?.(e); } @@ -21891,14 +21891,14 @@ var Db = /* @__PURE__ */ lr({ } catch (e) { console.debug?.(e); } - }), or(o, (e, t) => { + }), cr(o, (e, t) => { try { - t && t !== e && Yn(t); + t && t !== e && Zn(t); } catch (e) { console.debug?.(e); } try { - e && $n(e); + e && tr(e); } catch (e) { console.debug?.(e); } @@ -21926,7 +21926,7 @@ var Db = /* @__PURE__ */ lr({ }; }, restoreGridUiState(e, t = {}) { - return Eb({ + return Ob({ initialLoadPromise: e, gridWrapper: r.value, gridContainer: m(), @@ -21942,7 +21942,7 @@ var Db = /* @__PURE__ */ lr({ } catch (e) { console.debug?.(e); } - return l = Wg({ + return l = Kg({ gridContainer: t, gridWrapper: r.value, ...e @@ -21997,13 +21997,13 @@ var Db = /* @__PURE__ */ lr({ overflow: "auto", position: "relative" } - }, [Y(Zu, { + }, [Y($u, { ref_key: "gridHostRef", ref: i, "scroll-element": r.value }, null, 8, ["scroll-element"])], 512)], 512)); } -}), Ob = { +}), Ab = { class: "mjr-sidebar-header", style: { display: "flex", @@ -22014,15 +22014,15 @@ var Db = /* @__PURE__ */ lr({ "flex-shrink": "0", background: "var(--mjr-surface-2,#2e2e2e)" } -}, kb = ["title"], Ab = /* @__PURE__ */ lr({ +}, jb = ["title"], Mb = /* @__PURE__ */ dr({ __name: "SidebarHeaderSection", props: { asset: {} }, emits: ["close"], setup(e, { emit: t }) { let n = t; return (t, r) => { - let i = rr("MButton"); - return q(), X("div", Ob, [U("div", { + let i = ar("MButton"); + return q(), X("div", Ab, [U("div", { class: "mjr-sidebar-filename", title: e.asset.filename, style: { @@ -22035,7 +22035,7 @@ var Db = /* @__PURE__ */ lr({ "min-width": "0", "padding-right": "8px" } - }, J(e.asset.filename), 9, kb), Y(i, { + }, J(e.asset.filename), 9, jb), Y(i, { type: "button", class: "mjr-sidebar-close", severity: "secondary", @@ -22059,21 +22059,21 @@ var Db = /* @__PURE__ */ lr({ onMouseenter: r[1] ||= (e) => (e.currentTarget.style.background = "rgba(255,255,255,0.1)") && (e.currentTarget.style.borderColor = "rgba(255,255,255,0.2)"), onMouseleave: r[2] ||= (e) => (e.currentTarget.style.background = "none") && (e.currentTarget.style.borderColor = "transparent") }, { - default: W(() => [...r[3] ||= [er("x", -1)]]), + default: W(() => [...r[3] ||= [nr("x", -1)]]), _: 1 })]); }; } }); // ui/components/sidebar/utils/format.ts -function jb(e) { +function Nb(e) { if (!e) return "Unknown"; let t = e / 1024; if (t < 1024) return `${t.toFixed(1)} KB`; let n = t / 1024; return n < 1024 ? `${n.toFixed(1)} MB` : `${(n / 1024).toFixed(2)} GB`; } -function Mb(e) { +function Pb(e) { if (!e) return ""; let t = /* @__PURE__ */ new Date(Number(e) * 1e3); if (Number.isNaN(t.getTime())) return ""; @@ -22081,13 +22081,13 @@ function Mb(e) { return `${t.getFullYear()}-${n(t.getMonth() + 1)}-${n(t.getDate())} ${n(t.getHours())}:${n(t.getMinutes())}`; } // ui/vue/components/panel/sidebar/SidebarPreviewSection.vue?vue&type=script&setup=true&lang.ts -var Nb = { class: "mjr-sidebar-preview" }, Pb = ["src"], Fb = ["src"], Ib = ["src"], Lb = { +var Fb = { class: "mjr-sidebar-preview" }, Ib = ["src"], Lb = ["src"], Rb = ["src"], zb = { key: 3, style: { color: "rgba(255, 255, 255, 0.4)", "font-size": "14px" } -}, Rb = { +}, Bb = { class: "mjr-sidebar-preview-meta", style: { "margin-top": "10px", @@ -22101,7 +22101,7 @@ var Nb = { class: "mjr-sidebar-preview" }, Pb = ["src"], Fb = ["src"], Ib = ["sr "padding-bottom": "12px", "border-bottom": "1px solid var(--mjr-border, rgba(255, 255, 255, 0.12))" } -}, zb = /* @__PURE__ */ lr({ +}, Vb = /* @__PURE__ */ dr({ __name: "SidebarPreviewSection", props: { asset: {}, @@ -22111,15 +22111,15 @@ var Nb = { class: "mjr-sidebar-preview" }, Pb = ["src"], Fb = ["src"], Ib = ["sr } }, setup(e) { - let t = e, n = Q(null), r = null, i = K(() => it(t.asset) || ""), a = K(() => { + let t = e, n = Q(null), r = null, i = K(() => We(t.asset) || ""), a = K(() => { let e = String(t.asset?.filename || ""), n = e.lastIndexOf("."); return n === -1 ? "" : e.slice(n + 1).toUpperCase(); }), o = K(() => { let e = []; a.value && e.push(a.value), t.asset?.kind && e.push(String(t.asset.kind).toLowerCase()); - let n = jb(t.asset?.size); + let n = Nb(t.asset?.size); n && e.push(n); - let r = Mb(t.asset?.mtime); + let r = Pb(t.asset?.mtime); return r && e.push(r), e.join(" | "); }); function s() { @@ -22153,17 +22153,17 @@ var Nb = { class: "mjr-sidebar-preview" }, Pb = ["src"], Fb = ["src"], Ib = ["sr } } } - return or(() => [t.asset, t.showPreviewThumb], () => { + return cr(() => [t.asset, t.showPreviewThumb], () => { s(); - }, { flush: "post" }), or(i, () => { + }, { flush: "post" }), cr(i, () => { setTimeout(() => { l(); }, 0); - }), kr(() => { + }), jr(() => { l(); - }), dr(() => { + }), pr(() => { s(); - }), (t, r) => (q(), X("div", Nb, [e.showPreviewThumb ? (q(), X("div", { + }), (t, r) => (q(), X("div", Fb, [e.showPreviewThumb ? (q(), X("div", { key: 0, ref_key: "previewContainerRef", ref: n, @@ -22186,7 +22186,7 @@ var Nb = { class: "mjr-sidebar-preview" }, Pb = ["src"], Fb = ["src"], Ib = ["sr "max-height": "100%", "object-fit": "contain" } - }, null, 8, Pb)) : e.asset.kind === "video" ? (q(), X("video", { + }, null, 8, Ib)) : e.asset.kind === "video" ? (q(), X("video", { key: 1, src: i.value, muted: !0, @@ -22199,7 +22199,7 @@ var Nb = { class: "mjr-sidebar-preview" }, Pb = ["src"], Fb = ["src"], Ib = ["sr "max-height": "100%", "object-fit": "contain" } - }, null, 8, Fb)) : e.asset.kind === "audio" ? (q(), X("audio", { + }, null, 8, Lb)) : e.asset.kind === "audio" ? (q(), X("audio", { key: 2, src: i.value, controls: "", @@ -22208,9 +22208,9 @@ var Nb = { class: "mjr-sidebar-preview" }, Pb = ["src"], Fb = ["src"], Ib = ["sr width: "92%", "max-width": "560px" } - }, null, 8, Ib)) : (q(), X("div", Lb, J(String(e.asset.kind || "PREVIEW").toUpperCase()), 1))], 512)) : G("", !0), U("div", Rb, J(o.value), 1)])); + }, null, 8, Rb)) : (q(), X("div", zb, J(String(e.asset.kind || "PREVIEW").toUpperCase()), 1))], 512)) : G("", !0), U("div", Bb, J(o.value), 1)])); } -}), Bb = { +}), Hb = { class: "mjr-sidebar-section", style: { background: "rgba(255, 255, 255, 0.03)", @@ -22218,22 +22218,22 @@ var Nb = { class: "mjr-sidebar-preview" }, Pb = ["src"], Fb = ["src"], Ib = ["sr "border-radius": "8px", padding: "10px" } -}, Vb = { style: { +}, Ub = { style: { "font-size": "12px", "font-weight": "700", color: "#26a69a", "margin-bottom": "8px", "text-transform": "uppercase", "letter-spacing": "0.4px" -} }, Hb = { style: { +} }, Wb = { style: { display: "flex", "flex-direction": "column", gap: "6px" -} }, Ub = { style: { +} }, Gb = { style: { "font-size": "12px", opacity: "0.68", "min-width": "92px" -} }, Wb = ["title"], Gb = /* @__PURE__ */ lr({ +} }, Kb = ["title"], qb = /* @__PURE__ */ dr({ __name: "SidebarFolderSection", props: { asset: {} }, setup(e) { @@ -22276,17 +22276,17 @@ var Nb = { class: "mjr-sidebar-preview" }, Pb = ["src"], Fb = ["src"], Ib = ["sr ]; return u > 0 && f.push({ label: R("sidebar.folder.created", "Created"), - value: `${Rn(u) || "-"} ${Mn(u) || ""}`.trim() + value: `${zn(u) || "-"} ${Mn(u) || ""}`.trim() }), l > 0 && f.push({ label: R("sidebar.folder.modified", "Modified"), - value: `${Rn(l) || "-"} ${Mn(l) || ""}`.trim() + value: `${zn(l) || "-"} ${Mn(l) || ""}`.trim() }), d && f.push({ label: R("sidebar.folder.note", "Note"), value: R("sidebar.folder.scanTruncated", "Scan was truncated for performance"), valueStyle: "color:#FFB74D;font-weight:600;" }), f; }); - return (e, t) => (q(), X("div", Bb, [U("div", Vb, J(Z(R)("sidebar.folder.details", "Folder Details")), 1), U("div", Hb, [(q(!0), X(H, null, pr(r.value, (e) => (q(), X("div", { + return (e, t) => (q(), X("div", Hb, [U("div", Ub, J(Z(R)("sidebar.folder.details", "Folder Details")), 1), U("div", Wb, [(q(!0), X(H, null, hr(r.value, (e) => (q(), X("div", { key: e.label, style: { display: "flex", @@ -22294,18 +22294,18 @@ var Nb = { class: "mjr-sidebar-preview" }, Pb = ["src"], Fb = ["src"], Ib = ["sr "align-items": "flex-start", "justify-content": "space-between" } - }, [U("div", Ub, J(e.label), 1), U("div", { - style: yr(e.valueStyle || "font-size: 12px; text-align: right; word-break: break-word"), + }, [U("div", Gb, J(e.label), 1), U("div", { + style: xr(e.valueStyle || "font-size: 12px; text-align: right; word-break: break-word"), title: String(e.value || "") - }, J(e.value), 13, Wb)]))), 128))])])); + }, J(e.value), 13, Kb)]))), 128))])])); } -}), Kb = [ +}), Jb = [ "aria-busy", "aria-disabled", "aria-label", "aria-valuenow", "tabindex" -], qb = /* @__PURE__ */ lr({ +], Yb = /* @__PURE__ */ dr({ __name: "RatingEditor", props: { asset: {}, @@ -22357,7 +22357,7 @@ var Nb = { class: "mjr-sidebar-preview" }, Pb = ["src"], Fb = ["src"], Ib = ["sr } try { let e = l?.data?.asset_id ?? null; - e != null && !ze(i.asset.id) && (i.asset.id = e); + e != null && !lt(i.asset.id) && (i.asset.id = e); } catch (e) { console.debug?.(e); } @@ -22425,21 +22425,21 @@ var Nb = { class: "mjr-sidebar-preview" }, Pb = ["src"], Fb = ["src"], Ib = ["sr } t !== null && t !== s.value && C(t); } - return dr(() => { + return pr(() => { try { f?.abort?.(); } catch (e) { console.debug?.(e); } - }), or(() => i.modelValue, (e) => { + }), cr(() => i.modelValue, (e) => { b(e); - }), or(() => i.asset?.rating, (e) => { + }), cr(() => i.asset?.rating, (e) => { b(e); }), (e, n) => { - let r = rr("MButton"); + let r = ar("MButton"); return q(), X("div", { class: "mjr-rating-editor", - style: yr({ + style: xr({ display: "inline-flex", gap: "2px", pointerEvents: t.disabled ? "none" : "auto", @@ -22454,14 +22454,14 @@ var Nb = { class: "mjr-sidebar-preview" }, Pb = ["src"], Fb = ["src"], Ib = ["sr "aria-valuenow": s.value, tabindex: t.disabled ? -1 : 0, onKeydown: D - }, [(q(), X(H, null, pr(5, (e) => Y(r, { + }, [(q(), X(H, null, hr(5, (e) => Y(r, { key: e, type: "button", class: "mjr-rating-star", severity: "secondary", text: "", rounded: "", - style: yr({ + style: xr({ color: m(e), transform: h(e), fontSize: g.value, @@ -22478,7 +22478,7 @@ var Nb = { class: "mjr-sidebar-preview" }, Pb = ["src"], Fb = ["src"], Ib = ["sr onMouseenter: (t) => T(e), onMouseleave: E }, { - default: W(() => [...n[0] ||= [er(" ★ ", -1)]]), + default: W(() => [...n[0] ||= [nr(" ★ ", -1)]]), _: 1 }, 8, [ "style", @@ -22487,22 +22487,22 @@ var Nb = { class: "mjr-sidebar-preview" }, Pb = ["src"], Fb = ["src"], Ib = ["sr "disabled", "onClick", "onMouseenter" - ])), 64))], 44, Kb); + ])), 64))], 44, Jb); }; } -}), Jb = ["aria-label"], Yb = { class: "mjr-context-menu-title" }, Xb = { class: "mjr-context-menu-item-left" }, Zb = { +}), Xb = ["aria-label"], Zb = { class: "mjr-context-menu-title" }, Qb = { class: "mjr-context-menu-item-left" }, $b = { key: 0, class: "mjr-context-menu-note" -}, Qb = { +}, ex = { key: 1, class: "mjr-context-menu-note is-error" -}, $b = { +}, tx = { key: 2, class: "mjr-context-menu-note" -}, ex = { class: "mjr-context-menu-item-left" }, tx = { +}, nx = { class: "mjr-context-menu-item-left" }, rx = { key: 0, class: "mjr-context-menu-hint" -}, nx = /* @__PURE__ */ lr({ +}, ix = /* @__PURE__ */ dr({ __name: "AddToCollectionMenu", setup(t) { let n = Q(null), r = Q(!1), i = Q([]), a = Q(""), o = 0, s = null, c = K(() => ({ @@ -22537,7 +22537,7 @@ var Nb = { class: "mjr-sidebar-preview" }, Pb = ["src"], Fb = ["src"], Ib = ["sr i.value = [], a.value = R("toast.failedLoadCollections", "Failed to load collections."); } finally { if (e === o) { - r.value = !1, await sr(), p(); + r.value = !1, await lr(), p(); try { n.value?.querySelector?.(".mjr-context-menu-item:not([aria-disabled=\"true\"])")?.focus?.(); } catch (e) { @@ -22582,9 +22582,9 @@ var Nb = { class: "mjr-sidebar-preview" }, Pb = ["src"], Fb = ["src"], Ib = ["sr function y() { jt(); } - return or(() => Gt.open, async (e) => { + return cr(() => Gt.open, async (e) => { e && (i.value = [], await m()); - }), kr(() => { + }), jr(() => { s = new AbortController(); let e = { capture: !0, @@ -22598,7 +22598,7 @@ var Nb = { class: "mjr-sidebar-preview" }, Pb = ["src"], Fb = ["src"], Ib = ["sr passive: !0, signal: s.signal }), window.addEventListener("mjr-close-all-menus", y, { signal: s.signal }); - }), tr(() => { + }), rr(() => { try { s?.abort(); } catch (e) { @@ -22606,17 +22606,17 @@ var Nb = { class: "mjr-sidebar-preview" }, Pb = ["src"], Fb = ["src"], Ib = ["sr } s = null, jt(); }), (e, t) => { - let o = rr("MButton"); - return q(), nr(Er, { to: "body" }, [Z(Gt).open ? (q(), X("div", { + let o = ar("MButton"); + return q(), ir(Or, { to: "body" }, [Z(Gt).open ? (q(), X("div", { key: 0, ref_key: "menuRef", ref: n, class: "mjr-add-to-collection-menu mjr-context-menu", - style: yr(c.value), + style: xr(c.value), role: "menu", "aria-label": u.value }, [ - U("div", Yb, J(u.value), 1), + U("div", Zb, J(u.value), 1), Y(o, { type: "button", class: "mjr-context-menu-item", @@ -22625,12 +22625,12 @@ var Nb = { class: "mjr-sidebar-preview" }, Pb = ["src"], Fb = ["src"], Ib = ["sr role: "menuitem", onClick: g }, { - default: W(() => [U("span", Xb, [t[0] ||= U("i", { class: "pi pi-plus" }, null, -1), U("span", null, J(Z(R)("dialog.createCollection", "Create collection")) + "...", 1)])]), + default: W(() => [U("span", Qb, [t[0] ||= U("i", { class: "pi pi-plus" }, null, -1), U("span", null, J(Z(R)("dialog.createCollection", "Create collection")) + "...", 1)])]), _: 1 }), t[2] ||= U("div", { class: "mjr-context-menu-separator" }, null, -1), - r.value ? (q(), X("div", Zb, J(Z(R)("msg.loadingCollections", "Loading collections...")), 1)) : a.value ? (q(), X("div", Qb, J(a.value), 1)) : i.value.length ? G("", !0) : (q(), X("div", $b, J(Z(R)("msg.noCollections", "No collections yet.")), 1)), - (q(!0), X(H, null, pr(i.value, (e) => (q(), nr(o, { + r.value ? (q(), X("div", $b, J(Z(R)("msg.loadingCollections", "Loading collections...")), 1)) : a.value ? (q(), X("div", ex, J(a.value), 1)) : i.value.length ? G("", !0) : (q(), X("div", tx, J(Z(R)("msg.noCollections", "No collections yet.")), 1)), + (q(!0), X(H, null, hr(i.value, (e) => (q(), ir(o, { key: String(e?.id || ""), type: "button", class: "mjr-context-menu-item", @@ -22639,28 +22639,28 @@ var Nb = { class: "mjr-sidebar-preview" }, Pb = ["src"], Fb = ["src"], Ib = ["sr role: "menuitem", onClick: (t) => h(String(e?.id || ""), String(e?.name || e?.id || "")) }, { - default: W(() => [U("span", ex, [t[1] ||= U("i", { class: "pi pi-bookmark" }, null, -1), U("span", null, J(String(e?.name || e?.id || "")), 1)]), Number(e?.count || 0) > 0 ? (q(), X("span", tx, J(Number(e?.count || 0)), 1)) : G("", !0)]), + default: W(() => [U("span", nx, [t[1] ||= U("i", { class: "pi pi-bookmark" }, null, -1), U("span", null, J(String(e?.name || e?.id || "")), 1)]), Number(e?.count || 0) > 0 ? (q(), X("span", rx, J(Number(e?.count || 0)), 1)) : G("", !0)]), _: 2 }, 1032, ["onClick"]))), 128)) - ], 12, Jb)) : G("", !0)]); + ], 12, Xb)) : G("", !0)]); }; } -}), rx = { +}), ax = { key: 0, class: "mjr-context-menu-separator" -}, ix = { class: "mjr-context-menu-item-left" }, ax = { class: "mjr-context-menu-item-right" }, ox = { +}, ox = { class: "mjr-context-menu-item-left" }, sx = { class: "mjr-context-menu-item-right" }, cx = { key: 0, class: "mjr-context-menu-hint" -}, sx = { +}, lx = { key: 1, class: "mjr-context-menu-submenu-arrow" -}, cx = { +}, ux = { key: 0, class: "mjr-context-menu-separator" -}, lx = { class: "mjr-context-menu-item-left" }, ux = { +}, dx = { class: "mjr-context-menu-item-left" }, fx = { key: 0, class: "mjr-context-menu-hint" -}, dx = /* @__PURE__ */ lr({ +}, px = /* @__PURE__ */ dr({ __name: "GridContextMenu", setup(e) { let t = Q(null), n = Q(null), r = Q(null), i = null, a = null, o = K(() => l(hn.main, 10031)), s = K(() => l(hn.submenu, 10032)), c = K(() => l(hn.tags, 10033)); @@ -22687,7 +22687,7 @@ var Nb = { class: "mjr-sidebar-preview" }, Pb = ["src"], Fb = ["src"], Ib = ["sr a + n.width > r && (a = Math.max(8, r - n.width - 10)), o + n.height > i && (o = Math.max(8, i - n.height - 10)), a < 8 && (a = 8), o < 8 && (o = 8), e.x = a, e.y = o; } async function p(e, t) { - await sr(), f(e, t?.value || null); + await lr(), f(e, t?.value || null); } function m(e) { try { @@ -22760,13 +22760,13 @@ var Nb = { class: "mjr-sidebar-preview" }, Pb = ["src"], Fb = ["src"], Ib = ["sr console.debug?.(e); } } - return or(() => hn.main.open, async (e) => { + return cr(() => hn.main.open, async (e) => { e && (await p(hn.main, t), m(t)); - }), or(() => hn.submenu.open, async (e) => { + }), cr(() => hn.submenu.open, async (e) => { e && (await p(hn.submenu, n), m(n)); - }), or(() => hn.tags.open, async (e) => { + }), cr(() => hn.tags.open, async (e) => { e && await p(hn.tags, r); - }), kr(() => { + }), jr(() => { a = new AbortController(); let e = { capture: !0, @@ -22780,7 +22780,7 @@ var Nb = { class: "mjr-sidebar-preview" }, Pb = ["src"], Fb = ["src"], Ib = ["sr passive: !0, signal: a.signal }), window.addEventListener("mjr-close-all-menus", w, { signal: a.signal }); - }), tr(() => { + }), rr(() => { u(); try { a?.abort(); @@ -22789,20 +22789,20 @@ var Nb = { class: "mjr-sidebar-preview" }, Pb = ["src"], Fb = ["src"], Ib = ["sr } a = null, gn(); }), (e, i) => { - let a = rr("MButton"); - return q(), nr(Er, { to: "body" }, [ + let a = ar("MButton"); + return q(), ir(Or, { to: "body" }, [ Z(hn).main.open ? (q(), X("div", { key: 0, ref_key: "mainMenuRef", ref: t, class: "mjr-grid-context-menu mjr-context-menu", - style: yr(o.value), + style: xr(o.value), role: "menu", "aria-label": "Grid context menu" - }, [(q(!0), X(H, null, pr(Z(hn).main.items, (e) => (q(), X(H, { key: e.id }, [e.type === "separator" ? (q(), X("div", rx)) : (q(), nr(a, { + }, [(q(!0), X(H, null, hr(Z(hn).main.items, (e) => (q(), X(H, { key: e.id }, [e.type === "separator" ? (q(), X("div", ax)) : (q(), ir(a, { key: 1, type: "button", - class: wr(["mjr-context-menu-item", { + class: Er(["mjr-context-menu-item", { "is-disabled": e.disabled, "has-submenu": Array.isArray(e.submenu) && e.submenu.length, "is-tone-graph-map": e.tone === "graph-map", @@ -22819,10 +22819,10 @@ var Nb = { class: "mjr-sidebar-preview" }, Pb = ["src"], Fb = ["src"], Ib = ["sr onMouseenter: (t) => _(e, t), onMouseleave: (t) => v(e) }, { - default: W(() => [U("span", ix, [e.iconClass ? (q(), X("i", { + default: W(() => [U("span", ox, [e.iconClass ? (q(), X("i", { key: 0, - class: wr(e.iconClass) - }, null, 2)) : G("", !0), U("span", null, J(e.label), 1)]), U("span", ax, [e.rightHint ? (q(), X("span", ox, J(e.rightHint), 1)) : G("", !0), Array.isArray(e.submenu) && e.submenu.length ? (q(), X("span", sx, " > ")) : G("", !0)])]), + class: Er(e.iconClass) + }, null, 2)) : G("", !0), U("span", null, J(e.label), 1)]), U("span", sx, [e.rightHint ? (q(), X("span", cx, J(e.rightHint), 1)) : G("", !0), Array.isArray(e.submenu) && e.submenu.length ? (q(), X("span", lx, " > ")) : G("", !0)])]), _: 2 }, 1032, [ "class", @@ -22837,15 +22837,15 @@ var Nb = { class: "mjr-sidebar-preview" }, Pb = ["src"], Fb = ["src"], Ib = ["sr ref_key: "submenuRef", ref: n, class: "mjr-grid-rating-submenu mjr-context-menu", - style: yr(s.value), + style: xr(s.value), role: "menu", "aria-label": "Grid context submenu", onMouseenter: y, onMouseleave: b - }, [(q(!0), X(H, null, pr(Z(hn).submenu.items, (e) => (q(), X(H, { key: e.id }, [e.type === "separator" ? (q(), X("div", cx)) : (q(), nr(a, { + }, [(q(!0), X(H, null, hr(Z(hn).submenu.items, (e) => (q(), X(H, { key: e.id }, [e.type === "separator" ? (q(), X("div", ux)) : (q(), ir(a, { key: 1, type: "button", - class: wr(["mjr-context-menu-item", { + class: Er(["mjr-context-menu-item", { "is-disabled": e.disabled, "is-tone-graph-map": e.tone === "graph-map", "is-tone-rename": e.tone === "rename", @@ -22859,10 +22859,10 @@ var Nb = { class: "mjr-sidebar-preview" }, Pb = ["src"], Fb = ["src"], Ib = ["sr tabindex: e.disabled ? -1 : 0, onClick: (t) => g(e, t, "submenu") }, { - default: W(() => [U("span", lx, [e.iconClass ? (q(), X("i", { + default: W(() => [U("span", dx, [e.iconClass ? (q(), X("i", { key: 0, - class: wr(e.iconClass) - }, null, 2)) : G("", !0), U("span", null, J(e.label), 1)]), e.rightHint ? (q(), X("span", ux, J(e.rightHint), 1)) : G("", !0)]), + class: Er(e.iconClass) + }, null, 2)) : G("", !0), U("span", null, J(e.label), 1)]), e.rightHint ? (q(), X("span", fx, J(e.rightHint), 1)) : G("", !0)]), _: 2 }, 1032, [ "class", @@ -22875,8 +22875,8 @@ var Nb = { class: "mjr-sidebar-preview" }, Pb = ["src"], Fb = ["src"], Ib = ["sr ref_key: "tagsPopoverRef", ref: r, class: "mjr-grid-popover", - style: yr(c.value) - }, [Y(Mr, { + style: xr(c.value) + }, [Y(Pr, { asset: Z(hn).tags.asset, "model-value": Z(hn).tags.asset?.tags || [], "onUpdate:modelValue": T, @@ -22885,23 +22885,23 @@ var Nb = { class: "mjr-sidebar-preview" }, Pb = ["src"], Fb = ["src"], Ib = ["sr ]); }; } -}), fx = { class: "mjr-workflow-picker-dialog mjr-workflow-info-dialog" }, px = { class: "mjr-workflow-picker-header" }, mx = { class: "mjr-workflow-picker-title" }, hx = { class: "mjr-workflow-picker-subtitle" }, gx = { class: "mjr-workflow-info-form" }, _x = { class: "is-wide" }, vx = { class: "mjr-workflow-picker-footer" }, yx = /* @__PURE__ */ lr({ +}), mx = { class: "mjr-workflow-picker-dialog mjr-workflow-info-dialog" }, hx = { class: "mjr-workflow-picker-header" }, gx = { class: "mjr-workflow-picker-title" }, _x = { class: "mjr-workflow-picker-subtitle" }, vx = { class: "mjr-workflow-info-form" }, yx = { class: "is-wide" }, bx = { class: "mjr-workflow-picker-footer" }, xx = /* @__PURE__ */ dr({ __name: "WorkflowInfoDialog", setup(t) { - let n = xr({ + let n = Cr({ task: "", model_family: "", provider: "", runs_on: "", notes: "" - }), r = K(() => Li.workflow || null), i = K(() => String(r.value?.display_name || r.value?.filename || "Workflow")); - or(() => Li.open, (e) => { + }), r = K(() => zi.workflow || null), i = K(() => String(r.value?.display_name || r.value?.filename || "Workflow")); + cr(() => zi.open, (e) => { if (!e) return; let t = r.value || {}; n.task = String(t.user_task || t.task || ""), n.model_family = String(t.user_model_family || t.model_family || ""), n.provider = String(t.user_provider || t.provider || ""), n.runs_on = String(t.user_runs_on || t.runs_on || ""), n.notes = String(t.notes || ""); }); function a() { - zi(); + Vi(); } async function o() { let t = String(r.value?.filepath || "").trim(); @@ -22915,45 +22915,45 @@ var Nb = { class: "mjr-sidebar-preview" }, Pb = ["src"], Fb = ["src"], Ib = ["sr }, { timeoutMs: 2e4 }); i?.ok ? (e(R("toast.workflowUpdated", "Workflow updated"), "success", 1800), window?.dispatchEvent?.(new CustomEvent("mjr:reload-grid", { detail: { reason: "workflow-info" } })), a()) : e(i?.error || R("toast.workflowSaveFailed", "Failed to save workflow."), "error"); } - return (e, t) => (q(), nr(Er, { to: "body" }, [Z(Li).open ? (q(), X("div", { + return (e, t) => (q(), ir(Or, { to: "body" }, [Z(zi).open ? (q(), X("div", { key: 0, class: "mjr-workflow-picker-backdrop", - onClick: fr(a, ["self"]) - }, [U("section", fx, [ - U("header", px, [U("div", null, [U("div", mx, J(Z(R)("ctx.editWorkflowInfo", "Edit infos")), 1), U("div", hx, J(i.value), 1)]), U("button", { + onClick: mr(a, ["self"]) + }, [U("section", mx, [ + U("header", hx, [U("div", null, [U("div", gx, J(Z(R)("ctx.editWorkflowInfo", "Edit infos")), 1), U("div", _x, J(i.value), 1)]), U("button", { type: "button", class: "mjr-workflow-picker-close", onClick: a }, [...t[5] ||= [U("i", { class: "pi pi-times" }, null, -1)]])]), - U("div", gx, [ - U("label", null, [t[6] ||= U("span", null, "Task", -1), hr(U("input", { + U("div", vx, [ + U("label", null, [t[6] ||= U("span", null, "Task", -1), _r(U("input", { "onUpdate:modelValue": t[0] ||= (e) => n.task = e, type: "text", placeholder: "I2V, I2I, T2V, Image Edit..." - }, null, 512), [[Or, n.task]])]), - U("label", null, [t[7] ||= U("span", null, "Model family", -1), hr(U("input", { + }, null, 512), [[Ar, n.task]])]), + U("label", null, [t[7] ||= U("span", null, "Model family", -1), _r(U("input", { "onUpdate:modelValue": t[1] ||= (e) => n.model_family = e, type: "text", placeholder: "Flux, Qwen, Wan..." - }, null, 512), [[Or, n.model_family]])]), - U("label", null, [t[8] ||= U("span", null, "Provider", -1), hr(U("input", { + }, null, 512), [[Ar, n.model_family]])]), + U("label", null, [t[8] ||= U("span", null, "Provider", -1), _r(U("input", { "onUpdate:modelValue": t[2] ||= (e) => n.provider = e, type: "text", placeholder: "Google, ByteDance, local..." - }, null, 512), [[Or, n.provider]])]), - U("label", null, [t[10] ||= U("span", null, "Runs on", -1), hr(U("select", { "onUpdate:modelValue": t[3] ||= (e) => n.runs_on = e }, [...t[9] ||= [ + }, null, 512), [[Ar, n.provider]])]), + U("label", null, [t[10] ||= U("span", null, "Runs on", -1), _r(U("select", { "onUpdate:modelValue": t[3] ||= (e) => n.runs_on = e }, [...t[9] ||= [ U("option", { value: "" }, "Auto", -1), U("option", { value: "local" }, "local", -1), U("option", { value: "api" }, "api", -1), U("option", { value: "cloud" }, "cloud", -1) - ]], 512), [[Tr, n.runs_on]])]), - U("label", _x, [t[11] ||= U("span", null, "Notes", -1), hr(U("textarea", { + ]], 512), [[Dr, n.runs_on]])]), + U("label", yx, [t[11] ||= U("span", null, "Notes", -1), _r(U("textarea", { "onUpdate:modelValue": t[4] ||= (e) => n.notes = e, rows: "5", placeholder: "Notes displayed on workflow hover" - }, null, 512), [[Or, n.notes]])]) + }, null, 512), [[Ar, n.notes]])]) ]), - U("footer", vx, [U("button", { + U("footer", bx, [U("button", { type: "button", class: "mjr-workflow-picker-secondary", onClick: a @@ -22964,22 +22964,22 @@ var Nb = { class: "mjr-sidebar-preview" }, Pb = ["src"], Fb = ["src"], Ib = ["sr }, J(Z(R)("btn.apply", "Apply")), 1)]) ])])) : G("", !0)])); } -}), bx = { class: "mjr-workflow-picker-header" }, xx = { class: "mjr-workflow-picker-title" }, Sx = { +}), Sx = { class: "mjr-workflow-picker-header" }, Cx = { class: "mjr-workflow-picker-title" }, wx = { key: 0, class: "mjr-workflow-picker-source" -}, Cx = { class: "mjr-workflow-picker-toolbar" }, wx = { class: "mjr-workflow-picker-search" }, Tx = ["placeholder"], Ex = { value: "" }, Dx = ["value"], Ox = { value: "" }, kx = ["value"], Ax = { value: "" }, jx = ["value"], Mx = { class: "mjr-workflow-picker-body" }, Nx = { +}, Tx = { class: "mjr-workflow-picker-toolbar" }, Ex = { class: "mjr-workflow-picker-search" }, Dx = ["placeholder"], Ox = { value: "" }, kx = ["value"], Ax = { value: "" }, jx = ["value"], Mx = { value: "" }, Nx = ["value"], Px = { class: "mjr-workflow-picker-body" }, Fx = { key: 0, class: "mjr-workflow-picker-empty" -}, Px = { +}, Ix = { key: 1, class: "mjr-workflow-picker-empty is-error" -}, Fx = { +}, Lx = { key: 2, class: "mjr-workflow-picker-empty" -}, Ix = ["onClick"], Lx = { class: "mjr-workflow-picker-thumb" }, Rx = ["src", "alt"], zx = { +}, Rx = ["onClick"], zx = { class: "mjr-workflow-picker-thumb" }, Bx = ["src", "alt"], Vx = { key: 1, class: "pi pi-sitemap" -}, Bx = { class: "mjr-workflow-picker-card-info" }, Vx = ["disabled"], Hx = { class: "mjr-workflow-picker-card-info" }, Ux = { class: "mjr-workflow-picker-footer" }, Wx = ["disabled"], Gx = 120, Kx = /* @__PURE__ */ lr({ +}, Hx = { class: "mjr-workflow-picker-card-info" }, Ux = ["disabled"], Wx = { class: "mjr-workflow-picker-card-info" }, Gx = { class: "mjr-workflow-picker-footer" }, Kx = ["disabled"], qx = 120, Jx = /* @__PURE__ */ dr({ __name: "WorkflowPickerDialog", setup(e) { let t = Q(""), n = Q(!1), r = Q(!1), i = Q(""), a = Q([]), s = Q(""), c = Q(0), l = Q(!1), u = 0, d = K(() => xn.sourceAsset || null), f = K(() => xn.workflow || null), p = K(() => String(xn.mode || "") === "asset"), m = K(() => String(d.value?.filename || d.value?.display_name || f.value?.display_name || f.value?.filename || d.value?.filepath || f.value?.filepath || "")), h = K(() => x("task")), g = K(() => x("model_family")), _ = K(() => x("runs_on")), v = Q(""), y = Q(""), b = Q(""); @@ -23031,7 +23031,7 @@ var Nb = { class: "mjr-sidebar-preview" }, Pb = ["src"], Fb = ["src"], Ib = ["sr } let n = await o({ q: "*", - limit: Gx, + limit: qx, offset: d, sort: "mtime" }, { timeoutMs: 2e4 }); @@ -23041,7 +23041,7 @@ var Nb = { class: "mjr-sidebar-preview" }, Pb = ["src"], Fb = ["src"], Ib = ["sr return; } let r = (Array.isArray(n?.data?.assets) ? n.data.assets : Array.isArray(n?.data) ? n.data : []).filter((e) => String(e?.filepath || "").trim()); - a.value = e ? r : [...a.value, ...r], c.value = d + r.length, l.value = r.length >= Gx, !s.value && a.value[0]?.filepath && (s.value = String(a.value[0].filepath)); + a.value = e ? r : [...a.value, ...r], c.value = d + r.length, l.value = r.length >= qx, !s.value && a.value[0]?.filepath && (s.value = String(a.value[0].filepath)); } catch (e) { t === u && (i.value = String(e?.message || e || "Failed to load workflows"), a.value = []); } finally { @@ -23063,7 +23063,7 @@ var Nb = { class: "mjr-sidebar-preview" }, Pb = ["src"], Fb = ["src"], Ib = ["sr function M(e) { e.key === "Escape" && (e.preventDefault(), j()); } - return or(() => xn.open, (e) => { + return cr(() => xn.open, (e) => { if (e) { s.value = "", c.value = 0, l.value = !1, t.value = "", v.value = "", y.value = "", b.value = "", O(); try { @@ -23072,80 +23072,80 @@ var Nb = { class: "mjr-sidebar-preview" }, Pb = ["src"], Fb = ["src"], Ib = ["sr } else try { window.removeEventListener("keydown", M); } catch {} - }), dr(() => { + }), pr(() => { try { window.removeEventListener("keydown", M); } catch {} - }), (e, a) => (q(), nr(Er, { to: "body" }, [Z(xn).open ? (q(), X("div", { + }), (e, a) => (q(), ir(Or, { to: "body" }, [Z(xn).open ? (q(), X("div", { key: 0, class: "mjr-workflow-picker-backdrop", - onMousedown: fr(j, ["self"]) + onMousedown: mr(j, ["self"]) }, [U("section", { - class: wr(["mjr-workflow-picker-dialog", { "is-asset-mode": p.value }]), + class: Er(["mjr-workflow-picker-dialog", { "is-asset-mode": p.value }]), role: "dialog", "aria-modal": "true" }, [ - U("header", bx, [U("div", xx, [a[4] ||= U("i", { class: "pi pi-sitemap" }, null, -1), U("span", null, J(Z(xn).title), 1)]), U("button", { + U("header", Sx, [U("div", Cx, [a[4] ||= U("i", { class: "pi pi-sitemap" }, null, -1), U("span", null, J(Z(xn).title), 1)]), U("button", { class: "mjr-workflow-picker-icon-btn", type: "button", onClick: j }, [...a[5] ||= [U("i", { class: "pi pi-times" }, null, -1)]])]), - m.value ? (q(), X("div", Sx, [U("span", null, J(p.value ? Z(R)("tab.workflow", "Workflow") : Z(R)("dialog.workflowThumbnailSource", "Source")), 1), U("strong", null, J(m.value), 1)])) : G("", !0), - U("div", Cx, [ - U("label", wx, [a[6] ||= U("i", { class: "pi pi-search" }, null, -1), hr(U("input", { + m.value ? (q(), X("div", wx, [U("span", null, J(p.value ? Z(R)("tab.workflow", "Workflow") : Z(R)("dialog.workflowThumbnailSource", "Source")), 1), U("strong", null, J(m.value), 1)])) : G("", !0), + U("div", Tx, [ + U("label", Ex, [a[6] ||= U("i", { class: "pi pi-search" }, null, -1), _r(U("input", { "onUpdate:modelValue": a[0] ||= (e) => t.value = e, type: "search", placeholder: Z(R)("search.workflows", "Search workflows...") - }, null, 8, Tx), [[Or, t.value]])]), - p.value ? G("", !0) : hr((q(), X("select", { + }, null, 8, Dx), [[Ar, t.value]])]), + p.value ? G("", !0) : _r((q(), X("select", { key: 0, "onUpdate:modelValue": a[1] ||= (e) => v.value = e - }, [U("option", Ex, J(Z(R)("filter.task", "Task")), 1), (q(!0), X(H, null, pr(h.value, (e) => (q(), X("option", { + }, [U("option", Ox, J(Z(R)("filter.task", "Task")), 1), (q(!0), X(H, null, hr(h.value, (e) => (q(), X("option", { key: e, value: e - }, J(e), 9, Dx))), 128))], 512)), [[Tr, v.value]]), - p.value ? G("", !0) : hr((q(), X("select", { + }, J(e), 9, kx))), 128))], 512)), [[Dr, v.value]]), + p.value ? G("", !0) : _r((q(), X("select", { key: 1, "onUpdate:modelValue": a[2] ||= (e) => y.value = e - }, [U("option", Ox, J(Z(R)("filter.model", "Model")), 1), (q(!0), X(H, null, pr(g.value, (e) => (q(), X("option", { + }, [U("option", Ax, J(Z(R)("filter.model", "Model")), 1), (q(!0), X(H, null, hr(g.value, (e) => (q(), X("option", { key: e, value: e - }, J(e), 9, kx))), 128))], 512)), [[Tr, y.value]]), - p.value ? G("", !0) : hr((q(), X("select", { + }, J(e), 9, jx))), 128))], 512)), [[Dr, y.value]]), + p.value ? G("", !0) : _r((q(), X("select", { key: 2, "onUpdate:modelValue": a[3] ||= (e) => b.value = e - }, [U("option", Ax, J(Z(R)("filter.runsOn", "Runs on")), 1), (q(!0), X(H, null, pr(_.value, (e) => (q(), X("option", { + }, [U("option", Mx, J(Z(R)("filter.runsOn", "Runs on")), 1), (q(!0), X(H, null, hr(_.value, (e) => (q(), X("option", { key: e, value: e - }, J(e), 9, jx))), 128))], 512)), [[Tr, b.value]]) + }, J(e), 9, Nx))), 128))], 512)), [[Dr, b.value]]) ]), - U("div", Mx, [n.value ? (q(), X("div", Nx, J(Z(R)("status.loading", "Loading...")), 1)) : i.value ? (q(), X("div", Px, J(i.value), 1)) : S.value.length ? (q(), X(H, { key: 3 }, [(q(!0), X(H, null, pr(S.value, (e) => (q(), X("button", { + U("div", Px, [n.value ? (q(), X("div", Fx, J(Z(R)("status.loading", "Loading...")), 1)) : i.value ? (q(), X("div", Ix, J(i.value), 1)) : S.value.length ? (q(), X(H, { key: 3 }, [(q(!0), X(H, null, hr(S.value, (e) => (q(), X("button", { key: e.filepath, type: "button", - class: wr(["mjr-workflow-picker-card", { "is-selected": s.value === String(e.filepath || "") }]), + class: Er(["mjr-workflow-picker-card", { "is-selected": s.value === String(e.filepath || "") }]), onClick: (t) => s.value = String(e.filepath || ""), onDblclick: A - }, [U("div", Lx, [E(e) ? (q(), X("img", { + }, [U("div", zx, [E(e) ? (q(), X("img", { key: 0, src: E(e), alt: w(e), loading: "lazy" - }, null, 8, Rx)) : (q(), X("i", zx))]), U("div", Bx, [ + }, null, 8, Bx)) : (q(), X("i", Vx))]), U("div", Hx, [ U("strong", null, J(w(e)), 1), U("span", null, J(T(e)), 1), U("small", null, J(e.filename), 1) - ])], 42, Ix))), 128)), !p.value && l.value ? (q(), X("button", { + ])], 42, Rx))), 128)), !p.value && l.value ? (q(), X("button", { key: 0, type: "button", class: "mjr-workflow-picker-card mjr-workflow-picker-load-more", disabled: r.value, onClick: k - }, [a[7] ||= U("div", { class: "mjr-workflow-picker-thumb" }, [U("i", { class: "pi pi-angle-down" })], -1), U("div", Hx, [ + }, [a[7] ||= U("div", { class: "mjr-workflow-picker-thumb" }, [U("i", { class: "pi pi-angle-down" })], -1), U("div", Wx, [ U("strong", null, J(r.value ? Z(R)("status.loading", "Loading...") : Z(R)("action.loadMore", "Load more")), 1), U("span", null, J(Z(R)("tab.workflow", "Workflow")), 1), U("small", null, J(c.value) + " loaded", 1) - ])], 8, Vx)) : G("", !0)], 64)) : (q(), X("div", Fx, J(Z(R)("toast.noWorkflowsFound", "No workflows found.")), 1))]), - U("footer", Ux, [U("button", { + ])], 8, Ux)) : G("", !0)], 64)) : (q(), X("div", Lx, J(Z(R)("toast.noWorkflowsFound", "No workflows found.")), 1))]), + U("footer", Gx, [U("button", { type: "button", class: "mjr-workflow-picker-btn", onClick: j @@ -23154,31 +23154,31 @@ var Nb = { class: "mjr-sidebar-preview" }, Pb = ["src"], Fb = ["src"], Ib = ["sr class: "mjr-workflow-picker-btn is-primary", disabled: !C.value, onClick: A - }, J(Z(R)("action.apply", "Apply")), 9, Wx)]) + }, J(Z(R)("action.apply", "Apply")), 9, Kx)]) ], 2)], 32)) : G("", !0)])); } -}), qx = { class: "mjr-workflow-picker-dialog mjr-workflow-info-dialog" }, Jx = { class: "mjr-workflow-picker-header" }, Yx = { class: "mjr-workflow-picker-title" }, Xx = { class: "mjr-workflow-picker-subtitle" }, Zx = { class: "mjr-workflow-info-form" }, Qx = { class: "is-wide" }, $x = { class: "is-wide" }, eS = { class: "mjr-workflow-picker-footer" }, tS = /* @__PURE__ */ lr({ +}), Yx = { class: "mjr-workflow-picker-dialog mjr-workflow-info-dialog" }, Xx = { class: "mjr-workflow-picker-header" }, Zx = { class: "mjr-workflow-picker-title" }, Qx = { class: "mjr-workflow-picker-subtitle" }, $x = { class: "mjr-workflow-info-form" }, eS = { class: "is-wide" }, tS = { class: "is-wide" }, nS = { class: "mjr-workflow-picker-footer" }, rS = /* @__PURE__ */ dr({ __name: "WorkflowSaveInfoDialog", setup(e) { - let t = xr({ + let t = Cr({ name: "", task: "", model_family: "", provider: "", runs_on: "", notes: "" - }), n = K(() => y_.initial || {}), r = K(() => R("dialog.saveWorkflowWithInfo", "Save workflow")), i = K(() => R("dialog.workflowInfoAutoFallback", "Leave fields empty to use automatic workflow detection.")); - or(() => y_.open, (e) => { + }), n = K(() => x_.initial || {}), r = K(() => R("dialog.saveWorkflowWithInfo", "Save workflow")), i = K(() => R("dialog.workflowInfoAutoFallback", "Leave fields empty to use automatic workflow detection.")); + cr(() => x_.open, (e) => { if (!e) return; let r = n.value || {}; t.name = String(r.name || r.workflow?.name || r.workflow?.title || "workflow").trim(), t.task = String(r.task || ""), t.model_family = String(r.model_family || ""), t.provider = String(r.provider || ""), t.runs_on = String(r.runs_on || ""), t.notes = String(r.notes || ""); }); function a() { - x_(null); + C_(null); } function o() { let e = String(t.name || "").trim(); - e && x_({ + e && C_({ name: e, task: String(t.task || "").trim(), model_family: String(t.model_family || "").trim(), @@ -23188,13 +23188,13 @@ var Nb = { class: "mjr-sidebar-preview" }, Pb = ["src"], Fb = ["src"], Ib = ["sr }); } return (e, n) => { - let s = rr("MButton"), c = rr("MInputText"), l = rr("MSelect"), u = rr("MTextarea"); - return q(), nr(Er, { to: "body" }, [Z(y_).open ? (q(), X("div", { + let s = ar("MButton"), c = ar("MInputText"), l = ar("MSelect"), u = ar("MTextarea"); + return q(), ir(Or, { to: "body" }, [Z(x_).open ? (q(), X("div", { key: 0, class: "mjr-workflow-picker-backdrop", - onClick: fr(a, ["self"]) - }, [U("section", qx, [ - U("header", Jx, [U("div", null, [U("div", Yx, J(r.value), 1), U("div", Xx, J(i.value), 1)]), Y(s, { + onClick: mr(a, ["self"]) + }, [U("section", Yx, [ + U("header", Xx, [U("div", null, [U("div", Zx, J(r.value), 1), U("div", Qx, J(i.value), 1)]), Y(s, { type: "button", class: "mjr-workflow-picker-close", onClick: a @@ -23202,13 +23202,13 @@ var Nb = { class: "mjr-sidebar-preview" }, Pb = ["src"], Fb = ["src"], Ib = ["sr default: W(() => [...n[6] ||= [U("i", { class: "pi pi-times" }, null, -1)]]), _: 1 })]), - U("div", Zx, [ - U("label", Qx, [U("span", null, J(Z(R)("dialog.workflowSaveName", "Workflow name")), 1), Y(c, { + U("div", $x, [ + U("label", eS, [U("span", null, J(Z(R)("dialog.workflowSaveName", "Workflow name")), 1), Y(c, { modelValue: t.name, "onUpdate:modelValue": n[0] ||= (e) => t.name = e, type: "text", placeholder: "workflow", - onKeydown: Dr(fr(o, ["prevent"]), ["enter"]) + onKeydown: kr(mr(o, ["prevent"]), ["enter"]) }, null, 8, ["modelValue", "onKeydown"])]), U("label", null, [n[7] ||= U("span", null, "Task", -1), Y(c, { modelValue: t.task, @@ -23253,19 +23253,19 @@ var Nb = { class: "mjr-sidebar-preview" }, Pb = ["src"], Fb = ["src"], Ib = ["sr "option-value": "value", placeholder: "Auto" }, null, 8, ["modelValue"])]), - U("label", $x, [n[11] ||= U("span", null, "Notes", -1), Y(u, { + U("label", tS, [n[11] ||= U("span", null, "Notes", -1), Y(u, { modelValue: t.notes, "onUpdate:modelValue": n[5] ||= (e) => t.notes = e, rows: "5", placeholder: "Notes displayed on workflow hover" }, null, 8, ["modelValue"])]) ]), - U("footer", eS, [Y(s, { + U("footer", nS, [Y(s, { type: "button", class: "mjr-workflow-picker-secondary", onClick: a }, { - default: W(() => [er(J(Z(R)("btn.cancel", "Cancel")), 1)]), + default: W(() => [nr(J(Z(R)("btn.cancel", "Cancel")), 1)]), _: 1 }), Y(s, { type: "button", @@ -23273,29 +23273,29 @@ var Nb = { class: "mjr-sidebar-preview" }, Pb = ["src"], Fb = ["src"], Ib = ["sr disabled: !String(t.name || "").trim(), onClick: o }, { - default: W(() => [er(J(Z(R)("btn.save", "Save")), 1)]), + default: W(() => [nr(J(Z(R)("btn.save", "Save")), 1)]), _: 1 }, 8, ["disabled"])]) ])])) : G("", !0)]); }; } -}), nS = /* @__PURE__ */ lr({ +}), iS = /* @__PURE__ */ dr({ __name: "ContextMenuPortal", setup(e) { let t = Q(""), n = K(() => _n(t.value)); - return kr(() => { + return jr(() => { t.value = Xt(); - }), tr(() => { + }), rr(() => { an(t.value), t.value = ""; }), (e, t) => n.value ? (q(), X(H, { key: 0 }, [ - Y(dx), - Y(nx), - Y(Kx), - Y(yx), - Y(tS) + Y(px), + Y(ix), + Y(Jx), + Y(xx), + Y(rS) ], 64)) : G("", !0); } -}), rS = { +}), aS = { class: "mjr-sidebar-content", style: { flex: "1", @@ -23305,29 +23305,29 @@ var Nb = { class: "mjr-sidebar-preview" }, Pb = ["src"], Fb = ["src"], Ib = ["sr "flex-direction": "column", gap: "16px" } -}, iS = { +}, oS = { class: "mjr-sidebar-rating-tags", style: { display: "flex", "flex-direction": "column", gap: "10px" } -}, aS = { style: { +}, sS = { style: { display: "flex", "align-items": "center", gap: "8px" -} }, oS = { style: { +} }, cS = { style: { "font-size": "0.8em", opacity: "0.6", "min-width": "44px" -} }, sS = { style: { +} }, lS = { style: { display: "flex", "flex-direction": "column", gap: "4px" -} }, cS = { style: { +} }, uS = { style: { "font-size": "0.8em", opacity: "0.6" -} }, lS = /* @__PURE__ */ lr({ +} }, dS = /* @__PURE__ */ dr({ __name: "AssetSidebarContent", props: { asset: {}, @@ -23341,14 +23341,14 @@ var Nb = { class: "mjr-sidebar-preview" }, Pb = ["src"], Fb = ["src"], Ib = ["sr return e === "workflow" || t === "workflow" || n.endsWith(".json"); }), c = K(() => Number(i.asset?.rating) || 0), l = K(() => i.asset?.tags || []), u = K(() => { try { - return !!(Jt()?.sidebar?.showPreviewThumb ?? !0); + return !!(Vn()?.sidebar?.showPreviewThumb ?? !0); } catch { return !0; } }); function d() { if (i.sidebar) try { - Qm(i.sidebar); + eh(i.sidebar); } catch (e) { console.debug?.(e); } @@ -23378,30 +23378,30 @@ var Nb = { class: "mjr-sidebar-preview" }, Pb = ["src"], Fb = ["src"], Ib = ["sr } } return (e, n) => { - let r = rr("MButton"); + let r = ar("MButton"); return q(), X(H, null, [ - Y(Ab, { + Y(Mb, { asset: t.asset, onClose: d }, null, 8, ["asset"]), - U("div", rS, [o.value ? (q(), nr(Gb, { + U("div", aS, [o.value ? (q(), ir(qb, { key: 0, asset: t.asset }, null, 8, ["asset"])) : (q(), X(H, { key: 1 }, [s.value ? G("", !0) : (q(), X(H, { key: 0 }, [ - Y(zb, { + Y(Vb, { asset: t.asset, "show-preview-thumb": u.value }, null, 8, ["asset", "show-preview-thumb"]), - U("div", iS, [U("div", aS, [U("span", oS, J(Z(R)("sidebar.rating", "Rating")), 1), Y(qb, { + U("div", oS, [U("div", sS, [U("span", cS, J(Z(R)("sidebar.rating", "Rating")), 1), Y(Yb, { asset: t.asset, "model-value": c.value, size: 60 - }, null, 8, ["asset", "model-value"])]), U("div", sS, [U("span", cS, J(Z(R)("sidebar.tags", "Tags")), 1), Y(Mr, { + }, null, 8, ["asset", "model-value"])]), U("div", lS, [U("span", uS, J(Z(R)("sidebar.tags", "Tags")), 1), Y(Pr, { asset: t.asset, "model-value": l.value }, null, 8, ["asset", "model-value"])])]), Y(kn, { asset: t.asset }, null, 8, ["asset"]), - p.value ? (q(), nr(r, { + p.value ? (q(), ir(r, { key: 0, type: "button", class: "mjr-btn mjr-sidebar-collect-btn", @@ -23417,16 +23417,16 @@ var Nb = { class: "mjr-sidebar-preview" }, Pb = ["src"], Fb = ["src"], Ib = ["sr }, onClick: m }, { - default: W(() => [U("i", { class: wr(f.value ? "pi pi-spin pi-spinner" : "pi pi-box") }, null, 2), U("span", null, J(f.value ? Z(R)("sidebar.collectingFiles", "Collecting...") : Z(R)("sidebar.collectFiles", "Collect files")), 1)]), + default: W(() => [U("i", { class: Er(f.value ? "pi pi-spin pi-spinner" : "pi pi-box") }, null, 2), U("span", null, J(f.value ? Z(R)("sidebar.collectingFiles", "Collecting...") : Z(R)("sidebar.collectFiles", "Collect files")), 1)]), _: 1 }, 8, ["disabled", "title"])) : G("", !0), Y(Pn, { asset: t.asset }, null, 8, ["asset"]) - ], 64)), Y(zn, { asset: t.asset }, null, 8, ["asset"])], 64))]), - Y(nS) + ], 64)), Y(Bn, { asset: t.asset }, null, 8, ["asset"])], 64))]), + Y(iS) ], 64); }; } -}), uS = { +}), fS = { key: 1, class: "mjr-sidebar-placeholder", style: { @@ -23439,11 +23439,11 @@ var Nb = { class: "mjr-sidebar-preview" }, Pb = ["src"], Fb = ["src"], Ib = ["sr "font-size": "0.85em", "text-align": "center" } -}, dS = /* @__PURE__ */ lr({ +}, pS = /* @__PURE__ */ dr({ __name: "SidebarSection", setup(e, { expose: t }) { - let n = Q(null), { activeAsset: r, onUpdateCallback: i } = Bm(); - return kr(() => { + let n = Q(null), { activeAsset: r, onUpdateCallback: i } = Hm(); + return jr(() => { let e = n.value; if (!e) return; e.style.flex = "0 0 0px", e.style.width = "0", e.style.maxWidth = "0", e.style.minWidth = "0", e.style.overflow = "hidden", e.style.borderLeft = "none", e.style.borderRight = "none", e._requestSeq = 0, e._currentAsset = null, e._currentFullAsset = null, e._ratingTagsSection = null; @@ -23453,7 +23453,7 @@ var Nb = { class: "mjr-sidebar-preview" }, Pb = ["src"], Fb = ["src"], Ib = ["sr }, a = (n) => { let r = n?.detail || {}, a = r.assetId ?? r.id ?? null, o = Number(r.rating); if (t(a) && Number.isFinite(o)) { - Um({ rating: o }, i.value); + Gm({ rating: o }, i.value); try { e._currentAsset && (e._currentAsset.rating = o), e._currentFullAsset && (e._currentFullAsset.rating = o); } catch (e) { @@ -23463,7 +23463,7 @@ var Nb = { class: "mjr-sidebar-preview" }, Pb = ["src"], Fb = ["src"], Ib = ["sr }, o = (n) => { let r = n?.detail || {}, a = r.assetId ?? r.id ?? null, o = Array.isArray(r.tags) ? r.tags : null; if (t(a) && o) { - Um({ tags: o }, i.value); + Gm({ tags: o }, i.value); try { e._currentAsset && (e._currentAsset.tags = o), e._currentFullAsset && (e._currentFullAsset.tags = o); } catch (e) { @@ -23485,16 +23485,16 @@ var Nb = { class: "mjr-sidebar-preview" }, Pb = ["src"], Fb = ["src"], Ib = ["sr }, e._dispose = e.dispose; let l = c ? { signal: c.signal } : void 0; try { - window.addEventListener(ot, a, l), window.addEventListener(z, o, l); + window.addEventListener(ot, a, l), window.addEventListener(et, o, l); } catch (e) { console.debug?.(e); try { - window.addEventListener(ot, a), window.addEventListener(z, o), s.push(() => window.removeEventListener(ot, a)), s.push(() => window.removeEventListener(z, o)); + window.addEventListener(ot, a), window.addEventListener(et, o), s.push(() => window.removeEventListener(ot, a)), s.push(() => window.removeEventListener(et, o)); } catch (e) { console.debug?.(e); } } - }), tr(() => { + }), rr(() => { try { n.value?.dispose?.(); } catch {} @@ -23515,7 +23515,7 @@ var Nb = { class: "mjr-sidebar-preview" }, Pb = ["src"], Fb = ["src"], Ib = ["sr transition: "width 140ms ease,max-width 140ms ease,flex-basis 140ms ease,border-color 140ms ease", contain: "layout paint style" } - }, [Z(r) ? (q(), nr(lS, { + }, [Z(r) ? (q(), ir(dS, { key: 0, asset: Z(r), "on-update": Z(i), @@ -23524,18 +23524,18 @@ var Nb = { class: "mjr-sidebar-preview" }, Pb = ["src"], Fb = ["src"], Ib = ["sr "asset", "on-update", "sidebar" - ])) : (q(), X("div", uS, J(Z(R)("sidebar.placeholderSelectAsset", "Select an asset to view details")), 1))], 512)); + ])) : (q(), X("div", fS, J(Z(R)("sidebar.placeholderSelectAsset", "Select an asset to view details")), 1))], 512)); } -}), fS = /* @__PURE__ */ lr({ +}), mS = /* @__PURE__ */ dr({ __name: "App", setup(e) { let t = Q(null), n = Q(null), r = Q(null), i = Q(null), a = Q(null), o = Q(null), s = null; - return kr(async () => { + return jr(async () => { if (!t.value) return; let e = {}; n.value && (e.statusSection = n.value.statusSection, e.statusDot = n.value.statusDot, e.statusText = n.value.statusText, e.capabilitiesSection = n.value.capabilitiesSection), r.value && (e.headerSection = r.value), i.value && (e.summaryBar = i.value.summaryBar, e.updateSummaryBar = i.value.updateSummaryBar, e.folderBreadcrumb = i.value.folderBreadcrumb, e.folderBreadcrumbController = i.value), a.value && (e.browseSection = a.value.browseSection, e.gridWrapper = a.value.gridWrapper, e.gridContainer = a.value.gridContainer, e.onGridContainerReady = (...e) => a.value?.onGridContainerReady?.(...e), e.bindGridHostState = (...e) => a.value?.bindGridHostState?.(...e), e.restoreGridUiState = (...e) => a.value?.restoreGridUiState?.(...e), e.initAssetsQueryController = (...e) => a.value?.initAssetsQueryController?.(...e), e.loadAssets = (e, t = "*", n = {}) => a.value?.loadAssets?.(t, n), e.loadAssetsFromList = (e, t = [], n = {}) => a.value?.loadAssetsFromList?.(t, n), e.prepareGridForScopeSwitch = (e) => a.value?.prepareGridForScopeSwitch?.(), e.refreshGrid = (e) => a.value?.refreshGrid?.(), e.captureAnchor = (e) => a.value?.captureAnchor?.(), e.restoreAnchor = (e, t) => a.value?.restoreAnchor?.(t), e.hydrateGridFromSnapshot = (e, t = {}, n = {}) => a.value?.hydrateGridFromSnapshot?.(t, n), e.upsertAsset = (e, t) => a.value?.upsertAsset?.(t), e.removeAssets = (e, t = [], n = {}) => a.value?.removeAssets?.(t, n), e.disposeGrid = (e) => a.value?.disposeGrid?.()), o.value && (e.sidebar = o.value.sidebar); try { - s = await g_(t.value, { + s = await v_(t.value, { useComfyThemeUI: !0, external: e }); @@ -23543,35 +23543,35 @@ var Nb = { class: "mjr-sidebar-preview" }, Pb = ["src"], Fb = ["src"], Ib = ["sr console.warn("[Majoor] App.vue: mountAssetsManagerPanelRuntime failed", e); } try { - lh().validatePersistedCustomRoot?.(); + dh().validatePersistedCustomRoot?.(); } catch {} - }), tr(() => { + }), rr(() => { try { s?.dispose?.(); } catch {} s = null; }), (e, s) => (q(), X(H, null, [ - Y(v_, { + Y(b_, { ref_key: "statusSectionRef", ref: n }, null, 512), - Y(Zy, { + Y($y, { ref_key: "headerSectionRef", ref: r }, null, 512), - Y(hb, { + Y(_b, { ref_key: "summaryBarSectionRef", ref: i }, null, 512), - Y(Db, { + Y(kb, { ref_key: "assetsGridRef", ref: a }, null, 512), - Y(dS, { + Y(pS, { ref_key: "sidebarSectionRef", ref: o }, null, 512), - Y(nS), + Y(iS), U("div", { ref_key: "containerRef", ref: t, @@ -23585,7 +23585,7 @@ var Nb = { class: "mjr-sidebar-preview" }, Pb = ["src"], Fb = ["src"], Ib = ["sr }, null, 512) ], 64)); } -}), pS = /* @__PURE__ */ lr({ +}), hS = /* @__PURE__ */ dr({ __name: "GeneratedFeedApp", setup(e) { let t = Q(null), n = null; @@ -23605,18 +23605,18 @@ var Nb = { class: "mjr-sidebar-preview" }, Pb = ["src"], Fb = ["src"], Ib = ["sr } } } - return kr(() => { + return jr(() => { if (t.value) try { - r(t.value), n = Jd(t.value); + r(t.value), n = Xd(t.value); } catch (e) { console.warn("[Majoor] GeneratedFeedApp.vue: createGeneratedFeedHost failed", e); } - }), tr(() => { + }), rr(() => { try { - Yd(n); + Zd(n); } catch {} n = null; - }), (e, n) => (q(), X(H, null, [Y(nS), U("div", { + }), (e, n) => (q(), X(H, null, [Y(iS), U("div", { ref_key: "containerRef", ref: t, class: "mjr-vue-feed-root", @@ -23631,38 +23631,38 @@ var Nb = { class: "mjr-sidebar-preview" }, Pb = ["src"], Fb = ["src"], Ib = ["sr } }, null, 512)], 64)); } -}), mS = "data-mjr-topbar-mfv-host", hS = "data-mjr-topbar-mfv-button", gS = "data-mjr-topbar-mfv-slot", _S = "label.floatingViewer", vS = "Viewer", yS = "V", bS = "viewer.mfvTopbarButton", xS = null, SS = null, CS = null, wS = null, TS = null, ES = null, DS = null, OS = null, kS = !1, AS = null, jS = !1, MS = !1; -function NS(e) { +}), gS = "data-mjr-topbar-mfv-host", _S = "data-mjr-topbar-mfv-button", vS = "data-mjr-topbar-mfv-slot", yS = "label.floatingViewer", bS = "Viewer", xS = "V", SS = "viewer.mfvTopbarButton", CS = null, wS = null, TS = null, ES = null, DS = null, OS = null, kS = null, AS = null, jS = !1, MS = null, NS = !1, PS = !1; +function FS(e) { if (!e) { - !TS && typeof MutationObserver < "u" && (TS = new MutationObserver(() => { - PS() && (TS?.disconnect?.(), TS = null, JS()); - }), TS.observe(document.body, { + !DS && typeof MutationObserver < "u" && (DS = new MutationObserver(() => { + IS() && (DS?.disconnect?.(), DS = null, XS()); + }), DS.observe(document.body, { childList: !0, subtree: !0 })); return; } try { - TS?.disconnect?.(); + DS?.disconnect?.(); } catch {} - if (TS = null, SS !== e) { - try { - xS?.disconnect?.(); - } catch {} - xS = new MutationObserver(() => JS()), xS.observe(e, { childList: !0 }), SS = e; - } - let t = e.parentElement; - if (t && wS !== t) { + if (DS = null, wS !== e) { try { CS?.disconnect?.(); } catch {} - CS = new MutationObserver(() => JS()), CS.observe(t, { childList: !0 }), wS = t; + CS = new MutationObserver(() => XS()), CS.observe(e, { childList: !0 }), wS = e; + } + let t = e.parentElement; + if (t && ES !== t) { + try { + TS?.disconnect?.(); + } catch {} + TS = new MutationObserver(() => XS()), TS.observe(t, { childList: !0 }), ES = t; } } -function PS() { +function IS() { return typeof document > "u" ? null : document.querySelector(".actionbar-container"); } -function FS(e = PS()) { +function LS(e = IS()) { if (typeof document > "u") return; let t = document.documentElement?.style; if (!t) return; @@ -23673,90 +23673,84 @@ function FS(e = PS()) { let n = e.getBoundingClientRect(), r = Math.max(60, Math.ceil(n.bottom + 12)); t.setProperty("--mjr-mfv-top-offset", `${r}px`); } -function IS(e) { +function RS(e) { return e && e.querySelector(".queue-button-group") || null; } -function LS(e) { +function zS(e) { if (!e) return null; - let t = e.querySelector(`[${gS}]`); - t || (t = document.createElement("div"), t.setAttribute(gS, "1"), t.className = "flex h-full items-center pointer-events-auto", t.style.position = "relative", t.style.zIndex = "10030", t.style.padding = "0 4px"); - let n = IS(e), r = n?.parentElement || e; + let t = e.querySelector(`[${vS}]`); + t || (t = document.createElement("div"), t.setAttribute(vS, "1"), t.className = "flex h-full items-center pointer-events-auto", t.style.position = "relative", t.style.zIndex = "10030", t.style.padding = "0 4px"); + let n = RS(e), r = n?.parentElement || e; return t.parentElement === r ? n && r && t.previousElementSibling !== n ? r.insertBefore(t, n.nextSibling) : !n && t !== r.lastElementChild && r.appendChild(t) : n && r ? r.insertBefore(t, n.nextSibling) : r.appendChild(t), t; } -function RS(e = "pi pi-eye") { +function BS(e = "pi pi-eye") { let t = document.createElement("i"); return t.className = e, t.setAttribute("aria-hidden", "true"), t; } -function zS(e = "Viewer") { +function VS(e = "Viewer") { let t = document.createElement("span"); return t.className = "mjr-topbar-mfv-label", t.textContent = e, t; } -function BS(e) { +function HS(e) { if (!e) return; - let t = jS ? R("tooltip.closeMFV", "Close Floating Viewer") : R("tooltip.openMFV", "Open Floating Viewer"); - Lt(e, t, yS, { ariaLabel: t }), e.setAttribute("aria-pressed", jS ? "true" : "false"), e.classList.toggle("primary", jS), e.classList.toggle("mjr-topbar-mfv-active", jS), e.replaceChildren(RS(jS ? "pi pi-eye-slash" : "pi pi-eye"), zS(R(_S, vS))); + let t = NS ? R("tooltip.closeMFV", "Close Floating Viewer") : R("tooltip.openMFV", "Open Floating Viewer"); + Lt(e, t, xS, { ariaLabel: t }), e.setAttribute("aria-pressed", NS ? "true" : "false"), e.classList.toggle("primary", NS), e.classList.toggle("mjr-topbar-mfv-active", NS), e.replaceChildren(BS(NS ? "pi pi-eye-slash" : "pi pi-eye"), VS(R(yS, bS))); } -function VS() { +function US() { try { window.dispatchEvent(new Event(V.MFV_TOGGLE)); } catch (e) { console.debug?.("[Majoor] top bar MFV launch failed", e); } - JS(); -} -function HS() { - let e = document.createElement("button"); - return e.type = "button", e.setAttribute(hS, "1"), e.className = "comfyui-button mjr-topbar-mfv-button", e.style.position = "relative", e.style.zIndex = "10030", e.style.width = "auto", e.style.height = "32px", e.style.minWidth = "32px", e.style.padding = "0 10px", e.style.gap = "6px", e.style.display = "inline-flex", e.style.alignItems = "center", e.style.justifyContent = "center", e.style.whiteSpace = "nowrap", e.addEventListener("click", VS), BS(e), e; -} -function US() { - let e = document.createElement("div"); - return e.setAttribute(mS, "1"), e.className = "mjr-topbar-mfv-button-host", e.style.position = "relative", e.appendChild(HS()), e; + XS(); } function WS() { - if (typeof document > "u" || MS) return; - let e = !!document.querySelector(".mjr-mfv.is-visible"); - jS !== e && (jS = e); + let e = document.createElement("button"); + return e.type = "button", e.setAttribute(_S, "1"), e.className = "comfyui-button mjr-topbar-mfv-button", e.style.position = "relative", e.style.zIndex = "10030", e.style.width = "auto", e.style.height = "32px", e.style.minWidth = "32px", e.style.padding = "0 10px", e.style.gap = "6px", e.style.display = "inline-flex", e.style.alignItems = "center", e.style.justifyContent = "center", e.style.whiteSpace = "nowrap", e.addEventListener("click", US), HS(e), e; } function GS() { - return B.MFV_TOPBAR_BUTTON !== !1; + let e = document.createElement("div"); + return e.setAttribute(gS, "1"), e.className = "mjr-topbar-mfv-button-host", e.style.position = "relative", e.appendChild(WS()), e; } function KS() { - try { - document.querySelector(`[${mS}]`)?.remove?.(), document.querySelector(`[${gS}]`)?.remove?.(); - } catch (e) { - console.debug?.(e); - } + if (typeof document > "u" || PS) return; + let e = !!document.querySelector(".mjr-mfv.is-visible"); + NS !== e && (NS = e); } function qS() { - let e = PS(); - if (!e) return FS(null), null; - if (!GS()) return KS(), FS(e), null; - NS(e), WS(); - let t = LS(e); - if (!t) return FS(e), null; - let n = t.querySelector(`[${mS}]`); - return n ||= US(), n.parentElement !== t && t.replaceChildren(n), FS(e), BS(n.querySelector(`[${hS}]`)), t; + return B.MFV_TOPBAR_BUTTON !== !1; } function JS() { - kS || (kS = !0, AS = window.setTimeout(() => { - kS = !1, AS = null, qS(); - }, 32)); -} -function YS() { - return typeof window > "u" || typeof document > "u" || !document.body ? !1 : (JS(), ES || (ES = (e) => { - jS = !!e?.detail?.visible, MS = !0, JS(); - }, window.addEventListener(V.MFV_VISIBILITY_CHANGED, ES)), DS || (DS = () => JS(), window.addEventListener("resize", DS)), OS || (OS = (e) => { - let t = e?.detail?.key; - (t === bS || t === "storage") && JS(); - }, window.addEventListener("mjr-settings-changed", OS)), NS(PS()), !0); -} -function XS() { try { - xS?.disconnect?.(); + document.querySelector(`[${gS}]`)?.remove?.(), document.querySelector(`[${vS}]`)?.remove?.(); } catch (e) { console.debug?.(e); } - xS = null, SS = null; +} +function YS() { + let e = IS(); + if (!e) return LS(null), null; + if (!qS()) return JS(), LS(e), null; + FS(e), KS(); + let t = zS(e); + if (!t) return LS(e), null; + let n = t.querySelector(`[${gS}]`); + return n ||= GS(), n.parentElement !== t && t.replaceChildren(n), LS(e), HS(n.querySelector(`[${_S}]`)), t; +} +function XS() { + jS || (jS = !0, MS = window.setTimeout(() => { + jS = !1, MS = null, YS(); + }, 32)); +} +function ZS() { + return typeof window > "u" || typeof document > "u" || !document.body ? !1 : (XS(), OS || (OS = (e) => { + NS = !!e?.detail?.visible, PS = !0, XS(); + }, window.addEventListener(V.MFV_VISIBILITY_CHANGED, OS)), kS || (kS = () => XS(), window.addEventListener("resize", kS)), AS || (AS = (e) => { + let t = e?.detail?.key; + (t === SS || t === "storage") && XS(); + }, window.addEventListener("mjr-settings-changed", AS)), FS(IS()), !0); +} +function QS() { try { CS?.disconnect?.(); } catch (e) { @@ -23768,72 +23762,78 @@ function XS() { } catch (e) { console.debug?.(e); } - TS = null; + TS = null, ES = null; try { - AS && window.clearTimeout(AS); + DS?.disconnect?.(); } catch (e) { console.debug?.(e); } - AS = null, ES && typeof window < "u" && window.removeEventListener(V.MFV_VISIBILITY_CHANGED, ES), ES = null, DS && typeof window < "u" && window.removeEventListener("resize", DS), DS = null, OS && typeof window < "u" && window.removeEventListener("mjr-settings-changed", OS), OS = null, kS = !1, jS = !1, MS = !1; + DS = null; try { - document.documentElement?.style?.setProperty("--mjr-mfv-top-offset", "60px"), document.querySelector(`[${mS}]`)?.remove?.(), document.querySelector(`[${gS}]`)?.remove?.(); + MS && window.clearTimeout(MS); + } catch (e) { + console.debug?.(e); + } + MS = null, OS && typeof window < "u" && window.removeEventListener(V.MFV_VISIBILITY_CHANGED, OS), OS = null, kS && typeof window < "u" && window.removeEventListener("resize", kS), kS = null, AS && typeof window < "u" && window.removeEventListener("mjr-settings-changed", AS), AS = null, jS = !1, NS = !1, PS = !1; + try { + document.documentElement?.style?.setProperty("--mjr-mfv-top-offset", "60px"), document.querySelector(`[${gS}]`)?.remove?.(), document.querySelector(`[${vS}]`)?.remove?.(); } catch (e) { console.debug?.(e); } } // ui/features/runtime/entryUiRegistration.ts -var ZS = "mjr-global-runtime-root", QS = "_mjrGlobalRuntimeVueApp", $S = "_mjrSidebarVueApp", eC = "_mjrFeedVueApp", tC = "majoor-generated-feed", nC = null; -function rC() { +var $S = "mjr-global-runtime-root", eC = "_mjrGlobalRuntimeVueApp", tC = "_mjrSidebarVueApp", nC = "_mjrFeedVueApp", rC = "majoor-generated-feed", iC = null; +function aC() { if (typeof document > "u" || !document?.body) return null; - let e = document.getElementById(ZS); - return e || (e = document.createElement("div"), e.id = ZS, e.setAttribute("role", "presentation"), e.style.cssText = "position:fixed;inset:0;overflow:visible;pointer-events:none;z-index:10020;", document.body.appendChild(e), e); + let e = document.getElementById($S); + return e || (e = document.createElement("div"), e.id = $S, e.setAttribute("role", "presentation"), e.style.cssText = "position:fixed;inset:0;overflow:visible;pointer-events:none;z-index:10020;", document.body.appendChild(e), e); } -function iC() { +function oC() { try { - let e = rC(); + let e = aC(); if (!e) return !1; - let t = !!En(e, Fp, QS); - return YS(), t; + let t = !!En(e, Lp, eC); + return ZS(), t; } catch { return !1; } } -function aC() { +function sC() { try { - XS(); - let e = document.getElementById(ZS); + QS(); + let e = document.getElementById($S); if (!e) return; - In(e, QS), e.remove?.(); + Ln(e, eC), e.remove?.(); } catch {} } -function oC(e, t) { - let n = We(e, t); - if (Rf(), !n) try { +function cC(e, t) { + let n = Ue(e, t); + if (Bf(), !n) try { window.dispatchEvent(new Event(V.OPEN_ASSETS_MANAGER)); } catch (e) { console.debug?.(e); } return n; } -function sC() { +function lC() { try { window.dispatchEvent(new CustomEvent(V.RELOAD_GRID, { detail: { reason: "command" } })); } catch (e) { console.debug?.(e); } } -function cC(e) { - let t = Ze(e, tC); +function uC(e) { + let t = Ye(e, rC); if (!t) try { - Md(); + Pd(); } catch (e) { console.debug?.(e); } return t; } -async function lC() { +async function dC() { try { - let t = await L(st.BROWSE_FOLDER, {}); + let t = await L(it.BROWSE_FOLDER, {}); if (t?.ok) return String(t?.data?.path || "").trim(); let n = String(t?.code || "").trim(); n && n !== "CANCELLED" && e(t?.error || R("toast.nativeFolderBrowserUnavailable", "Native folder browser unavailable. Please enter path manually."), "warning", 3500); @@ -23842,14 +23842,14 @@ async function lC() { } return ""; } -async function uC(t, { settingId: n, settingsPathKey: r, save: i, successMessage: a, restartRequired: o = !1 }) { - let s = await lC(); +async function fC(t, { settingId: n, settingsPathKey: r, save: i, successMessage: a, restartRequired: o = !1 }) { + let s = await dC(); if (!s) return !1; let c = await i(s); if (!c?.ok) return e(c?.error || R("toast.settingsPathSaveFailed", "Failed to save path"), "error"), !1; try { - let e = Jt(); - e.paths = e.paths || {}, e.paths[r] = s, Tn(e), Ie(t, n, s), window.dispatchEvent(new CustomEvent(V.SETTINGS_CHANGED, { detail: { + let e = Vn(); + e.paths = e.paths || {}, e.paths[r] = s, Fn(e), Pe(t, n, s), window.dispatchEvent(new CustomEvent(V.SETTINGS_CHANGED, { detail: { key: `paths.${r}`, value: s } })); @@ -23858,10 +23858,10 @@ async function uC(t, { settingId: n, settingsPathKey: r, save: i, successMessage } return e(o ? `${a} ${R("toast.restartComfyUiToApply", "Restart ComfyUI to apply.")}` : a, "success", 2800), !0; } -function dC(e) { - return PC(e).find(NC) || null; +function pC(e) { + return IC(e).find(FC) || null; } -function fC(e) { +function mC(e) { let t = String(e?.id ?? e?.nodeId ?? e?.node_id ?? "").trim(); if (!t) return null; let n = String(e?.comfyClass || e?.type || e?.constructor?.type || "").trim(); @@ -23873,7 +23873,7 @@ function fC(e) { title: String(e?.title || e?.properties?.title || e?.properties?.name || n || "").trim() }; } -async function pC(e) { +async function hC(e) { if (!e) return []; try { let t = (await import("./chunks/NodeStreamController-CIKDDXJT.js")).extractNodeFileData?.(e), n = String(t?.filename || "").trim(); @@ -23887,7 +23887,7 @@ async function pC(e) { return console.debug?.(e), []; } } -function mC(e) { +function gC(e) { try { if (typeof window > "u") return; window.MajoorAssetsManager = window.MajoorAssetsManager || {}, window.MajoorAssetsManager.pendingNodeContext = e, window.dispatchEvent(new CustomEvent(V.OPEN_NODE_CONTEXT, { detail: e })); @@ -23895,18 +23895,18 @@ function mC(e) { console.debug?.(e); } } -async function hC(t, n, r) { - oC(t, n); - let i = fC(r) || {}, a = await pC(r); +async function _C(t, n, r) { + cC(t, n); + let i = mC(r) || {}, a = await hC(r); a.length && (i.files = a); let o = String(r?.comfyClass || r?.type || "").toLowerCase(); - return a.length && /load|upload/.test(o) && (delete i.source_node_id, delete i.sourceNodeId), !i.source_node_id && !a.length ? (e(R("toast.nodeContextMissing", "Select an output node first."), "info", 2200), !1) : (mC(i), !0); + return a.length && /load|upload/.test(o) && (delete i.source_node_id, delete i.sourceNodeId), !i.source_node_id && !a.length ? (e(R("toast.nodeContextMissing", "Select an output node first."), "info", 2200), !1) : (gC(i), !0); } -async function gC(e) { +async function vC(e) { try { - let t = await pC(e); + let t = await hC(e); if (t.length) { - let { floatingViewerManager: e } = await import("./chunks/floatingViewerManager-DKOeP6-T.js").then((e) => e.n); + let { floatingViewerManager: e } = await import("./chunks/floatingViewerManager-Gv7MTmpu.js").then((e) => e.n); if (await e.openAssets({ assets: t, index: 0 @@ -23922,11 +23922,11 @@ async function gC(e) { } return !1; } -function _C(t, n) { - let r = nC; - return r ? (hC(t, n, r), !0) : (e(R("toast.nodeContextMissing", "Select an output node first."), "info", 2200), !1); +function yC(t, n) { + let r = iC; + return r ? (_C(t, n, r), !0) : (e(R("toast.nodeContextMissing", "Select an output node first."), "info", 2200), !1); } -function vC(e, { sidebarTabId: t, triggerStartupScan: n }) { +function bC(e, { sidebarTabId: t, triggerStartupScan: n }) { return [ { id: "mjr.openAssetsManager", @@ -23935,7 +23935,7 @@ function vC(e, { sidebarTabId: t, triggerStartupScan: n }) { title: R("tooltip.openAssetsManager", "Open Majoor Assets Manager"), description: R("tooltip.openAssetsManager", "Open Majoor Assets Manager"), icon: "pi pi-folder-open", - function: () => oC(e, t) + function: () => cC(e, t) }, { id: "mjr.scanAssets", @@ -23959,7 +23959,7 @@ function vC(e, { sidebarTabId: t, triggerStartupScan: n }) { id: "mjr.refreshAssetsGrid", label: R("command.refreshAssetsGrid", "Refresh assets grid"), icon: "pi pi-sync", - function: () => sC() + function: () => lC() }, { id: "mjr.openFloatingViewer", @@ -23983,13 +23983,13 @@ function vC(e, { sidebarTabId: t, triggerStartupScan: n }) { title: R("tooltip.openGeneratedFeed", "Open the Majoor generated feed panel"), description: R("tooltip.openGeneratedFeed", "Open the Majoor generated feed panel"), icon: "pi pi-list", - function: () => cC(e) + function: () => uC(e) }, { id: "mjr.openSettings", label: R("command.openSettings", "Open Majoor settings"), icon: "pi pi-cog", - function: () => qn(e) + function: () => Yn(e) }, { id: "mjr.pickOutputDirectory", @@ -23998,7 +23998,7 @@ function vC(e, { sidebarTabId: t, triggerStartupScan: n }) { title: R("tooltip.pickOutputDirectory", "Use the native folder browser to set Majoor's generation output directory"), description: R("tooltip.pickOutputDirectory", "Use the native folder browser to set Majoor's generation output directory"), icon: "pi pi-folder", - function: () => uC(e, { + function: () => fC(e, { settingId: "Majoor.Paths.OutputDirectory", settingsPathKey: "outputDirectory", save: se, @@ -24012,7 +24012,7 @@ function vC(e, { sidebarTabId: t, triggerStartupScan: n }) { title: R("tooltip.pickIndexDirectory", "Use the native folder browser to set Majoor's index database directory"), description: R("tooltip.pickIndexDirectory", "Use the native folder browser to set Majoor's index database directory"), icon: "pi pi-database", - function: () => uC(e, { + function: () => fC(e, { settingId: "Majoor.Paths.IndexDirectory", settingsPathKey: "indexDirectory", save: s, @@ -24027,7 +24027,7 @@ function vC(e, { sidebarTabId: t, triggerStartupScan: n }) { title: R("tooltip.openNodeContext", "Show the latest indexed assets produced by this node"), description: R("tooltip.openNodeContext", "Show the latest indexed assets produced by this node"), icon: "pi pi-sitemap", - function: () => _C(e, t) + function: () => yC(e, t) }, { id: "mjr.openNodeInFloatingViewer", @@ -24037,12 +24037,12 @@ function vC(e, { sidebarTabId: t, triggerStartupScan: n }) { description: R("tooltip.openNodeInFloatingViewer", "Open this node's media in the Majoor floating viewer"), icon: "pi pi-window-maximize", function: () => { - gC(nC); + vC(iC); } } ]; } -function yC() { +function xC() { return [{ combo: { alt: !0, @@ -24059,7 +24059,7 @@ function yC() { commandId: "mjr.toggleFloatingViewer" }]; } -function bC() { +function SC() { return [{ path: ["Extensions", "Majoor Assets Manager"], commands: [ @@ -24074,13 +24074,13 @@ function bC() { ] }]; } -function xC(e, { sidebarTabId: t, triggerStartupScan: n }) { +function CC(e, { sidebarTabId: t, triggerStartupScan: n }) { return [null, { content: "Majoor Assets Manager", submenu: { options: [ { content: R("tooltip.openAssetsManager", "Open Majoor Assets Manager"), - callback: () => oC(e, t) + callback: () => cC(e, t) }, { content: R("command.openFloatingViewer", "Open floating viewer"), @@ -24094,12 +24094,12 @@ function xC(e, { sidebarTabId: t, triggerStartupScan: n }) { }, { content: R("command.openGeneratedFeed", "Open generated feed"), - callback: () => cC(e) + callback: () => uC(e) }, null, { content: R("command.refreshAssetsGrid", "Refresh assets grid"), - callback: () => sC() + callback: () => lC() }, { content: R("command.scanAssets", "Scan assets"), @@ -24107,12 +24107,12 @@ function xC(e, { sidebarTabId: t, triggerStartupScan: n }) { }, { content: R("command.openSettings", "Open Majoor settings"), - callback: () => qn(e) + callback: () => Yn(e) } ] } }]; } -function SC() { +function wC() { return [ { label: "Majoor Assets Manager", @@ -24129,14 +24129,20 @@ function SC() { } ]; } -function CC(e, t) { - for (let n of vC(e, t)) Fe(e, n); +function TC(e, t) { + for (let n of bC(e, t)) Be(e, n); } -function wC(e) { - for (let t of yC()) Be(e, t); +function EC(e) { + for (let t of xC()) Ve(e, t); } -function TC(e, { sidebarTabId: t }) { - return If({ sidebarTabId: t }), Ve(e, { +function DC(e, { sidebarTabId: t }) { + Rf({ sidebarTabId: t }); + try { + Vn()?.integration?.hideNativeAssetsTab && bn(!0); + } catch (e) { + console.debug?.(e); + } + return Fe(e, { id: t, icon: "pi pi-folder", title: R("manager.title"), @@ -24144,8 +24150,8 @@ function TC(e, { sidebarTabId: t }) { tooltip: R("tooltip.sidebarTab"), type: "custom", render(e) { - Rf(), ai({ idleOnly: !0 }).catch(() => null), En(e, fS, $S), setTimeout(() => { - let e = Vf(); + Bf(), si({ idleOnly: !0 }).catch(() => null), En(e, mS, tC), setTimeout(() => { + let e = Uf(); if (e) try { window.dispatchEvent(new CustomEvent(V.RELOAD_GRID, { detail: { reason: "pending-generated-assets", @@ -24159,77 +24165,80 @@ function TC(e, { sidebarTabId: t }) { destroy(e) {} }); } -function EC() { +function OC() { try { - In(null, $S); + fn(); } catch {} - DC = !1; try { - document.getElementById(OC)?.remove?.(); + Ln(null, tC); + } catch {} + kC = !1; + try { + document.getElementById(AC)?.remove?.(); } catch {} } -var DC = !1, OC = "mjr-sidebar-prewarm-host"; -function kC() { - if (DC || typeof document > "u" || !document?.body || wn($S)) return !1; - DC = !0; +var kC = !1, AC = "mjr-sidebar-prewarm-host"; +function jC() { + if (kC || typeof document > "u" || !document?.body || wn(tC)) return !1; + kC = !0; try { - let e = document.getElementById(OC); - return e || (e = document.createElement("div"), e.id = OC, e.style.cssText = "position:fixed;left:-99999px;top:0;width:360px;height:600px;overflow:hidden;visibility:hidden;pointer-events:none;contain:strict;", e.setAttribute("aria-hidden", "true"), document.body.appendChild(e)), En(e, fS, $S, { attachIfExists: !1 }), !0; + let e = document.getElementById(AC); + return e || (e = document.createElement("div"), e.id = AC, e.style.cssText = "position:fixed;left:-99999px;top:0;width:360px;height:600px;overflow:hidden;visibility:hidden;pointer-events:none;contain:strict;", e.setAttribute("aria-hidden", "true"), document.body.appendChild(e)), En(e, mS, tC, { attachIfExists: !1 }), !0; } catch (e) { - return console.debug?.(e), DC = !1, !1; + return console.debug?.(e), kC = !1, !1; } } -function AC() { +function MC() { return { - id: tC, + id: rC, title: R("bottomFeed.title", "Generated Feed"), icon: "pi pi-images", type: "custom", render(e) { - En(e, pS, eC); + En(e, hS, nC); }, destroy(e) {} }; } -function jC() { - return [AC()]; +function NC() { + return [MC()]; } -function MC() { +function PC() { try { - In(null, eC); + Ln(null, nC); } catch {} } -function NC(e) { +function FC(e) { let t = String(e?.comfyClass || e?.type || e?.constructor?.type || "").trim(); return t ? /save|load|preview/i.test(t) : !1; } -function PC(e) { +function IC(e) { return e ? Array.isArray(e) ? e.filter(Boolean) : e instanceof Set ? Array.from(e).filter(Boolean) : e instanceof Map ? Array.from(e.values()).filter(Boolean) : Array.isArray(e?.items) ? e.items.filter(Boolean) : Array.isArray(e?.nodes) ? e.nodes.filter(Boolean) : [e] : []; } -function FC(e) { - return nC = dC(e), nC ? [ +function LC(e) { + return iC = pC(e), iC ? [ "mjr.openNodeContext", "mjr.openAssetsManager", "mjr.openNodeInFloatingViewer" ] : []; } -function IC(e, t) { +function RC(e, t) { return { content: e, callback: t }; } -function LC(t, n, { sidebarTabId: r }) { - return NC(t) ? [ - IC("View in Assets Manager", () => { - hC(n, r, t); +function zC(t, n, { sidebarTabId: r }) { + return FC(t) ? [ + RC("View in Assets Manager", () => { + _C(n, r, t); }), - IC("Open in Floating Viewer", () => { - gC(t); + RC("Open in Floating Viewer", () => { + vC(t); }), - IC("Index Output", () => { + RC("Index Output", () => { try { - sC(), e(R("toast.rescanningFile", "Rescanning file..."), "info", 1800); + lC(), e(R("toast.rescanningFile", "Rescanning file..."), "info", 1800); } catch (e) { console.debug?.(e); } @@ -24237,15 +24246,15 @@ function LC(t, n, { sidebarTabId: r }) { ] : []; } // ui/features/runtime/entryRuntimeLifecycle.ts -var RC = "__MJR_ENTRY_RUNTIME__"; -function zC(e, t) { +var BC = "__MJR_ENTRY_RUNTIME__"; +function VC(e, t) { if (e) try { e._mjrAssetUpdateReloadTimer &&= (clearTimeout(e._mjrAssetUpdateReloadTimer), null), e._mjrExecutedHandler && e.removeEventListener("executed", e._mjrExecutedHandler), e._mjrAssetAddedHandler && e.removeEventListener("mjr-asset-added", e._mjrAssetAddedHandler), e._mjrAssetUpdatedHandler && e.removeEventListener("mjr-asset-updated", e._mjrAssetUpdatedHandler), e._mjrStructuredEventHandler && e.removeEventListener(V.STRUCTURED_EVENT, e._mjrStructuredEventHandler), e._mjrScanCompleteHandler && e.removeEventListener(V.SCAN_COMPLETE, e._mjrScanCompleteHandler), e._mjrScanProgressHandler && e.removeEventListener(V.SCAN_PROGRESS, e._mjrScanProgressHandler), e._mjrAssetIndexingHandler && e.removeEventListener(V.ASSET_INDEXING, e._mjrAssetIndexingHandler), e._mjrAssetIndexedHandler && e.removeEventListener(V.ASSET_INDEXED, e._mjrAssetIndexedHandler), e._mjrExecutionStartHandler && e.removeEventListener("execution_start", e._mjrExecutionStartHandler), e._mjrExecutionEndHandler && (e.removeEventListener("execution_success", e._mjrExecutionEndHandler), e.removeEventListener("execution_error", e._mjrExecutionEndHandler), e.removeEventListener("execution_interrupted", e._mjrExecutionEndHandler)), e._mjrStacksUpdatedHandler && e.removeEventListener("mjr.stacks.updated", e._mjrStacksUpdatedHandler), e._mjrEnrichmentStatusHandler && e.removeEventListener(V.ENRICHMENT_STATUS, e._mjrEnrichmentStatusHandler), e._mjrDbRestoreStatusHandler && e.removeEventListener(V.DB_RESTORE_STATUS, e._mjrDbRestoreStatusHandler), e._mjrRuntimeStatusHandler && (e.removeEventListener("progress", e._mjrRuntimeStatusHandler), e.removeEventListener("status", e._mjrRuntimeStatusHandler), e.removeEventListener(V.RUNTIME_STATUS, e._mjrRuntimeStatusHandler), e.removeEventListener("execution_cached", e._mjrExecutionCachedHandler)); } catch (e) { t?.(e, "entry.removeApiHandlers"); } } -function BC(e, t) { +function HC(e, t) { try { let t = e?.assetsDeletedHandler; t && typeof window < "u" && window.removeEventListener(V.ASSETS_DELETED, t); @@ -24253,7 +24262,7 @@ function BC(e, t) { t?.(e, "entry.removeRuntimeWindowHandlers"); } } -function VC(e, { reportError: t } = {}) { +function UC(e, { reportError: t } = {}) { if (e && typeof e == "object") { try { let t = Array.isArray(e._listenerCleanupFns) ? e._listenerCleanupFns : []; @@ -24278,13 +24287,13 @@ function VC(e, { reportError: t } = {}) { console.warn("[MJR teardown]", e); } try { - zC(e.api || null, t), BC(e, t); + VC(e.api || null, t), HC(e, t); } catch (e) { console.warn("[MJR teardown]", e); } } } -function HC(e, t, n, r, i = void 0) { +function WC(e, t, n, r, i = void 0) { if (!e || !t?.addEventListener || typeof r != "function") return null; let a = i && typeof i == "object" ? { ...i } : i; if (typeof AbortController < "u") try { @@ -24304,11 +24313,11 @@ function HC(e, t, n, r, i = void 0) { } }), null; } -function UC({ cleanupEntryRuntimeFn: e = VC, teardownLiveStreamTracker: t, teardownNodeStream: n, teardownFloatingViewerManager: r, teardownGeneratedFeed: i, teardownAssetsSidebar: a, teardownGlobalRuntime: o, teardownTopBarMfvButton: s, reportError: c }) { +function GC({ cleanupEntryRuntimeFn: e = UC, teardownLiveStreamTracker: t, teardownNodeStream: n, teardownFloatingViewerManager: r, teardownGeneratedFeed: i, teardownAssetsSidebar: a, teardownGlobalRuntime: o, teardownTopBarMfvButton: s, reportError: c }) { try { if (typeof window < "u") { try { - let t = window[RC]; + let t = window[BC]; e(t, { reportError: c }); } catch (e) { console.warn("[MJR teardown]", e); @@ -24348,7 +24357,7 @@ function UC({ cleanupEntryRuntimeFn: e = VC, teardownLiveStreamTracker: t, teard } catch (e) { console.warn("[MJR teardown]", e); } - window[RC] = { + window[BC] = { api: null, assetsDeletedHandler: null, _cleanupControllers: [], @@ -24360,42 +24369,42 @@ function UC({ cleanupEntryRuntimeFn: e = VC, teardownLiveStreamTracker: t, teard } } // ui/entry.ts -var WC = null, GC = null, KC = null; -function qC() { - return KC ||= import("./chunks/floatingViewerManager-DKOeP6-T.js").then((e) => e.n), KC; +var KC = null, qC = null, JC = null; +function YC() { + return JC ||= import("./chunks/floatingViewerManager-Gv7MTmpu.js").then((e) => e.n), JC; } -function JC() { - KC && KC.then((e) => e?.teardownFloatingViewerManager?.()).catch((e) => console.debug?.("[Majoor] MFV teardown skipped", e)); +function XC() { + JC && JC.then((e) => e?.teardownFloatingViewerManager?.()).catch((e) => console.debug?.("[Majoor] MFV teardown skipped", e)); } -var YC = "majoor-assets", XC = "__MJR_EXECUTION_RUNTIME__", ZC = "Majoor.AssetsManager", QC = { +var ZC = "majoor-assets", QC = "__MJR_EXECUTION_RUNTIME__", $C = "Majoor.AssetsManager", ew = { active: null, promptId: "" -}, $C = null, ew = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i, tw = /^[0-9a-f]{20,}$/i; -function nw(...e) { +}, tw = null, nw = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i, rw = /^[0-9a-f]{20,}$/i; +function iw(...e) { for (let t of e) { let e = String(t || "").trim(); if (e) return e; } return ""; } -function rw(e) { - let t = String(e || "").trim(); - return ew.test(t) || tw.test(t); -} -function iw(e) { - return nw(e?.title, e?.properties?.title, e?.properties?.name, e?.properties?.label, e?.name); -} function aw(e) { + let t = String(e || "").trim(); + return nw.test(t) || rw.test(t); +} +function ow(e) { + return iw(e?.title, e?.properties?.title, e?.properties?.name, e?.properties?.label, e?.name); +} +function sw(e) { if (!e || typeof e != "object") return []; if (Array.isArray(e.nodes)) return e.nodes.filter(Boolean); if (Array.isArray(e._nodes)) return e._nodes.filter(Boolean); let t = e._nodes_by_id ?? e.nodes_by_id ?? null; return t instanceof Map ? Array.from(t.values()).filter(Boolean) : t && typeof t == "object" ? Object.values(t).filter(Boolean) : []; } -function ow(e) { - return aw(e).length > 0; +function cw(e) { + return sw(e).length > 0; } -function sw(e) { +function lw(e) { return !e || typeof e != "object" ? !1 : [ e.subgraph, e._subgraph, @@ -24406,13 +24415,13 @@ function sw(e) { e.subgraph_instance?.graph, e.inner_graph, e.subgraph_graph - ].some(ow) || Array.isArray(e.nodes) && e.nodes.length > 0 && e.nodes !== e.graph?.nodes ? !0 : rw(e.type) && !!iw(e); + ].some(cw) || Array.isArray(e.nodes) && e.nodes.length > 0 && e.nodes !== e.graph?.nodes ? !0 : aw(e.type) && !!ow(e); } -function cw(e, t) { - let n = String(e?.type || t || "").trim(), r = iw(e); - return rw(n) ? r || "Subgraph" : n || r || "Node"; +function uw(e, t) { + let n = String(e?.type || t || "").trim(), r = ow(e); + return aw(n) ? r || "Subgraph" : n || r || "Node"; } -function lw() { +function dw() { try { return typeof window > "u" ? { active_prompt_id: null, @@ -24421,35 +24430,35 @@ function lw() { progress_value: null, progress_max: null, cached_nodes: [] - } : (window[XC] && typeof window[XC] == "object" || (window[XC] = { + } : (window[QC] && typeof window[QC] == "object" || (window[QC] = { active_prompt_id: null, queue_remaining: null, progress_node: null, progress_value: null, progress_max: null, cached_nodes: [] - }), window[XC]); + }), window[QC]); } catch (e) { return console.debug?.(e), {}; } } -function uw(e = {}) { +function fw(e = {}) { try { - let t = lw(); + let t = dw(); Object.assign(t, e || {}), window.dispatchEvent(new CustomEvent(V.RUNTIME_STATUS, { detail: { ...t } })); } catch (e) { console.debug?.(e); } } -async function dw({ active: e, promptId: t = "" } = {}) { +async function pw({ active: e, promptId: t = "" } = {}) { let n = !!e, r = String(t || "").trim(); - if (QC.active !== n || QC.promptId !== r) { - QC = { + if (ew.active !== n || ew.promptId !== r) { + ew = { active: n, promptId: r }; try { - await L(st.RUNTIME_EXECUTION, { + await L(it.RUNTIME_EXECUTION, { active: n, prompt_id: r || void 0, cooldown_ms: Number(B.EXECUTION_IDLE_GRACE_MS) || 6e3 @@ -24459,49 +24468,49 @@ async function dw({ active: e, promptId: t = "" } = {}) { } } } -function fw() { +function mw() { try { - return !!String(lw()?.active_prompt_id || "").trim(); + return !!String(dw()?.active_prompt_id || "").trim(); } catch (e) { return console.debug?.(e), !1; } } -function pw(e = 1200) { +function hw(e = 1200) { try { - $C && clearTimeout($C); + tw && clearTimeout(tw); } catch (e) { console.debug?.(e); } - $C = setTimeout(() => { - if ($C = null, fw()) { - pw(e); + tw = setTimeout(() => { + if (tw = null, mw()) { + hw(e); return; } - let t = Xn(); - t && hi(t); + let t = Qn(); + t && _i(t); }, Math.max(250, Number(e) || 0)); } -function mw(e) { - import("./chunks/LiveStreamTracker-CXkc1cyF.js").then((t) => { - WC = t; +function gw(e) { + import("./chunks/LiveStreamTracker-C8HwFSOT.js").then((t) => { + KC = t; try { t.initLiveStreamTracker(e); } catch (e) { console.warn("[MJR setup] initLiveStreamTracker failed:", e); } }).catch((e) => console.warn("[MJR setup] LiveStreamTracker load failed:", e)), import("./chunks/NodeStreamController-CIKDDXJT.js").then((t) => { - GC = t; + qC = t; try { t.initNodeStream({ app: e, onOutput: (e) => { - qC().then((t) => t?.floatingViewerManager?.feedNodeStream?.(e)).catch((e) => console.debug?.("[NodeStream] MFV output failed", e)); + YC().then((t) => t?.floatingViewerManager?.feedNodeStream?.(e)).catch((e) => console.debug?.("[NodeStream] MFV output failed", e)); }, onStatus: (t, n) => { try { - let r = (e?.graph ?? e?.canvas?.graph ?? null)?.getNodeById?.(Number(t)), i = sw(r), a = iw(r), o = i ? "Subgraph" : cw(r, n); - qC().then((e) => { - e?.floatingViewerManager?.setNodeStreamSelection?.(t, o, i ? a || cw(r, n) : a); + let r = (e?.graph ?? e?.canvas?.graph ?? null)?.getNodeById?.(Number(t)), i = lw(r), a = ow(r), o = i ? "Subgraph" : uw(r, n); + YC().then((e) => { + e?.floatingViewerManager?.setNodeStreamSelection?.(t, o, i ? a || uw(r, n) : a); }).catch((e) => console.debug?.("[NodeStream] MFV status failed", e)); } catch (e) { console.debug?.("[NodeStream] onStatus failed", e); @@ -24513,16 +24522,16 @@ function mw(e) { } }).catch((e) => console.warn("[MJR setup] NodeStream load failed:", e)); } -async function hw(t, n) { - let r = await Ae({ +async function _w(t, n) { + let r = await st({ app: t, timeoutMs: 4e3 - }) || He(t); - if (Ue(r || null), !r) { + }) || Le(t); + if (Ae(r || null), !r) { console.warn("Majoor API not available, real-time updates disabled"); return; } - Un({ + Gn({ api: r, app: t }).catch((e) => console.debug?.("[Majoor] MFV progress tracking init failed", e)); @@ -24532,78 +24541,78 @@ async function hw(t, n) { } catch (e) { console.debug?.(e); } - zC(i?.api || null, P), r !== i?.api && zC(r, P), BC(i, P), await ep({ + VC(i?.api || null, P), r !== i?.api && VC(r, P), HC(i, P), await np({ api: r, runtime: i, executionRuntime: n, - appRef: Nr, - liveStreamModule: WC, - ensureExecutionRuntime: lw, - emitRuntimeStatus: uw, - getActiveGridContainer: Xn, - pushGeneratedAsset: qd, - upsertAsset: Ci, - upsertAssetNow: wi, - removeAssetsFromGrid: Si, + appRef: Fr, + liveStreamModule: KC, + ensureExecutionRuntime: dw, + emitRuntimeStatus: fw, + getActiveGridContainer: Qn, + pushGeneratedAsset: Yd, + upsertAsset: Ti, + upsertAssetNow: Ei, + removeAssetsFromGrid: wi, getEnrichmentState: Ft, setEnrichmentState: xt, comfyToast: e, t: R, reportError: P, - registerCleanableListener: HC, - syncExecutionBackendState: dw + registerCleanableListener: WC, + syncExecutionBackendState: pw }); } -var gw = gf({ +var vw = vf({ post: L, - ENDPOINTS: st, + ENDPOINTS: it, reportError: P, - extractOutputFiles: _f, - ensureExecutionRuntime: lw, - emitRuntimeStatus: uw, - refreshGeneratedFeedHosts: Md, - getActiveGridContainer: Xn -}), _w = { - name: ZC, - settings: yn(Nr), - commands: vC(Nr, { - sidebarTabId: YC, - triggerStartupScan: ri + extractOutputFiles: yf, + ensureExecutionRuntime: dw, + emitRuntimeStatus: fw, + refreshGeneratedFeedHosts: Pd, + getActiveGridContainer: Qn +}), yw = { + name: $C, + settings: yn(Fr), + commands: bC(Fr, { + sidebarTabId: ZC, + triggerStartupScan: ai }), - keybindings: yC(), - menuCommands: bC(), - aboutPageBadges: SC(), - bottomPanelTabs: jC(), + keybindings: xC(), + menuCommands: SC(), + aboutPageBadges: wC(), + bottomPanelTabs: NC(), async setup() { - UC({ - cleanupEntryRuntimeFn: VC, - teardownLiveStreamTracker: (e) => WC?.teardownLiveStreamTracker(e), - teardownNodeStream: (e) => GC?.teardownNodeStream(e), - teardownFloatingViewerManager: JC, - teardownGeneratedFeed: MC, - teardownAssetsSidebar: EC, - teardownGlobalRuntime: aC, - teardownTopBarMfvButton: XS, + GC({ + cleanupEntryRuntimeFn: UC, + teardownLiveStreamTracker: (e) => KC?.teardownLiveStreamTracker(e), + teardownNodeStream: (e) => qC?.teardownNodeStream(e), + teardownFloatingViewerManager: XC, + teardownGeneratedFeed: PC, + teardownAssetsSidebar: OC, + teardownGlobalRuntime: sC, + teardownTopBarMfvButton: QS, reportError: P - }), ip(), Re(Nr); - let e = await Ye({ timeoutMs: 12e3 }) || Nr; - Re(e), Np(e); + }), op(), qe(Fr); + let e = await z({ timeoutMs: 12e3 }) || Fr; + qe(e), Fp(e); try { typeof window < "u" && (window.__MJR_RUNTIME_APP__ = e); } catch (e) { console.debug?.(e); } - si(), li({ enabled: !0 }), iC(), mw(e), vn(e, () => { - let e = Xn(); - e && (B.DEFER_GRID_FETCH_DURING_EXECUTION && fw() ? pw() : hi(e)); - }), CC(e, { - sidebarTabId: YC, - triggerStartupScan: ri - }), wC(e), hw(e, gw).catch((e) => P(e, "entry.api_setup")), TC(e, { sidebarTabId: YC }) ? xe("[Majoor] Sidebar tab registered (Vue)") : console.warn("Majoor Assets Manager: extensionManager.registerSidebarTab is unavailable"); + li(), di({ enabled: !0 }), oC(), gw(e), vn(e, () => { + let e = Qn(); + e && (B.DEFER_GRID_FETCH_DURING_EXECUTION && mw() ? hw() : _i(e)); + }), TC(e, { + sidebarTabId: ZC, + triggerStartupScan: ai + }), EC(e), _w(e, vw).catch((e) => P(e, "entry.api_setup")), DC(e, { sidebarTabId: ZC }) ? xe("[Majoor] Sidebar tab registered (Vue)") : console.warn("Majoor Assets Manager: extensionManager.registerSidebarTab is unavailable"); try { let e = typeof window < "u" ? window.requestIdleCallback : null, t = () => { try { - kC(); + jC(); } catch (e) { console.debug?.(e); } @@ -24612,30 +24621,30 @@ var gw = gf({ } catch (e) { console.debug?.(e); } - tp({ resolveNodeStreamModule: async () => (GC ||= await import("./chunks/NodeStreamController-CIKDDXJT.js"), GC) }); + rp({ resolveNodeStreamModule: async () => (qC ||= await import("./chunks/NodeStreamController-CIKDDXJT.js"), qC) }); }, onNodeOutputsUpdated(e) { try { - gw.handleNodeOutputsUpdated(e); + vw.handleNodeOutputsUpdated(e); } catch (e) { console.debug?.("[Majoor] onNodeOutputsUpdated error", e); } }, getNodeMenuItems(e) { - return LC(e, Nr, { sidebarTabId: YC }); + return zC(e, Fr, { sidebarTabId: ZC }); }, getCanvasMenuItems(e) { - return xC(Nr, { - sidebarTabId: YC, - triggerStartupScan: ri + return CC(Fr, { + sidebarTabId: ZC, + triggerStartupScan: ai }); }, getSelectionToolboxCommands(e) { - return FC(e); + return LC(e); } }; try { - Nr.registerExtension(_w); + Fr.registerExtension(yw); } catch (e) { - console.warn("[Majoor] registerExtension() threw (extension already registered) - re-running setup() directly", e), _w.setup().catch((e) => P(e, "entry.setup_after_duplicate_registration")); + console.warn("[Majoor] registerExtension() threw (extension already registered) - re-running setup() directly", e), yw.setup().catch((e) => P(e, "entry.setup_after_duplicate_registration")); } diff --git a/docs/API_REFERENCE.md b/docs/API_REFERENCE.md index e1468827..b11fa5f1 100644 --- a/docs/API_REFERENCE.md +++ b/docs/API_REFERENCE.md @@ -12,6 +12,7 @@ - **Current API**: `/mjr/am/*` (unversioned, stable) - **Version Alias**: `/mjr/am/v1/*` → redirects to `/mjr/am/*` (308 Permanent Redirect) - **Legacy Alias**: `/majoor/version` → redirects to `/mjr/am/version` +- **OpenAPI compat (read-only)**: `/mjr/am/compat/assets/*` mirrors the shape of ComfyUI core `/api/assets/*` (`GET /mjr/am/compat/assets`, `/{id}`, `/{id}/content`, `/{id}/tags`, `/tags/refine`, `/seed/status`, `HEAD /hash/{hash}`). The former `/api/v2/assets/*` paths are deprecated and only served when `MJR_AM_LEGACY_API_V2_ASSETS=1`. ### Authentication Most endpoints require authentication when ComfyUI auth is enabled: diff --git a/docs/COMFYUI_INTEGRATION_AUDIT.md b/docs/COMFYUI_INTEGRATION_AUDIT.md index ffcff843..bd64f38f 100644 --- a/docs/COMFYUI_INTEGRATION_AUDIT.md +++ b/docs/COMFYUI_INTEGRATION_AUDIT.md @@ -75,27 +75,26 @@ extensions sur l'objet requête partagé. Imports non triés dans 5 fichiers (`ruff --fix`) qui faisaient échouer `npm run quality:py`. -## 3. Risques de conflit restants (non modifiés, à décider) +## 3. Risques de conflit — état -| # | Risque | Gravité | Recommandation | -| --- | --- | --- | --- | -| R1 | La couche de compatibilité `/api/v2/assets/*` occupe un espace de noms qui appartient au core (`/api/...`). Si ComfyUI publie un jour `/api/v2/assets`, les routes du core (enregistrées en premier) masqueront silencieusement celles de Majoor. | Moyenne | Exposer la même surface sous `/mjr/am/compat/assets/*`, garder `/api/v2/assets` comme alias déprécié, puis le retirer. | -| R2 | `api.queuePrompt` est enveloppé (`floatingViewerProgress.ts`) pour suivre les prompts. Fonctionne, mais d'autres extensions font de même et l'ordre d'enveloppement n'est pas garanti. | Faible | Le frontend envoie déjà `execution_start` avec `prompt_id` ; à terme, s'appuyer uniquement sur les événements websocket et l'API Jobs du core (`adapters/comfy_core` détecte déjà `jobs`). | -| R3 | Les middlewares sont insérés en tête de `app.middlewares`. Ils filtrent bien les chemins Majoor, mais l'insertion échoue si l'app est déjà figée (`freeze()`), ce qui est rattrapé et signalé en « degraded » dans `/mjr/am/health`. | Faible | Garder ; surveiller l'étape `security_middlewares` dans le rapport de démarrage. | -| R4 | Doublon fonctionnel avec la barre latérale native « Assets » du frontend (onglet média du core). Les ID (`majoor-assets`) ne se chevauchent pas, mais deux panneaux similaires coexistent. | UX | Proposer un réglage « Remplacer l'onglet Assets natif » plutôt que masquer quoi que ce soit par défaut. | -| R5 | `requires-python = ">=3.10, <3.14"` : bloque les installations ComfyUI en Python 3.14 via le Registry/comfy-cli. | Moyenne | Vérifier les roues `av`, `blake3`, `pywin32` pour 3.14, lancer la CI sur 3.14, puis relever la borne. | -| R6 | `@comfyorg/litegraph@0.17.2` en devDependency : LiteGraph est désormais intégré au frontend et ses types sont exportés par `comfyui-frontend-types`. | Faible | Importer `LGraph`/`LGraphCanvas` depuis `@comfyorg/comfyui-frontend-types` et retirer le paquet séparé. | -| R7 | `import { app } from "../../scripts/app.js"` dans `ui/entry.ts` : shim encore supporté, mais le frontend pousse vers `window.comfyAPI` et a déjà déprécié d'autres modules `scripts/*`. | Faible | `comfyApiBridge` sait déjà attendre l'app ; préférer `window.comfyAPI?.app?.app` avec repli sur l'import. | -| R8 | 913 erreurs de typage dans `tsconfig.test.json` (script « advisory »). | Dette | Les réduire progressivement ; ne bloque pas le runtime. | +| # | Risque | Statut | +| --- | --- | --- | +| R1 | `/api/v2/assets/*` occupait l'espace de noms du core (`/api/...`) et pouvait être masqué sans erreur. | **Corrigé** : surface déplacée vers `/mjr/am/compat/assets/*` ; l'ancien chemin n'est enregistré que si `MJR_AM_LEGACY_API_V2_ASSETS=1` (déprécié, avertissement au démarrage). | +| R2 | `api.queuePrompt` était enveloppé pour suivre les prompts ; l'ordre d'enveloppement avec d'autres extensions n'est pas garanti. | **Corrigé** : plus aucune interception. Sur `execution_start` (websocket), le prompt est lu via l'API Jobs du core (`api.getJobDetail` → `GET /api/jobs/{id}`, champ `workflow.prompt`), puis `/queue` et `/history/{id}` pour les anciens cores. `wrapHostQueuePrompt` a été retiré. | +| R3 | Middlewares insérés en tête de `app.middlewares` (filtrés sur les chemins Majoor ; échec rattrapé si l'app est figée). | Inchangé, sans risque : surveiller l'étape `security_middlewares` dans `/mjr/am/health`. | +| R4 | Doublon fonctionnel avec l'onglet « Assets » natif. | **Corrigé (opt-in)** : réglage `Majoor.Integration.HideNativeAssetsTab` (désactivé par défaut) qui masque l'onglet natif via `getSidebarTabs`/`unregisterSidebarTab` et le restaure à l'identique quand on le désactive. | +| R5 | `requires-python <3.14` bloquait Python 3.14. | **Corrigé** : `>=3.10, <3.15` ; suite complète validée sous 3.14 (1931 tests OK) ; 3.14 ajouté à la matrice CI et à `tox`. | +| R6 | `@comfyorg/litegraph` séparé alors que le frontend exporte ses types. | Ouvert (faible). | +| R7 | `import { app } from "../../scripts/app.js"` (shim encore supporté). | Ouvert (faible). | +| R8 | 913 erreurs de typage dans `tsconfig.test.json`. | **Corrigé** : 0 erreur ; ajouté à la CI (`python-tests.yml`). Un vrai bug de test trouvé au passage (clé `stubs` dupliquée dans `asset_card_inner.vitest.ts`). | ## 4. Feuille de route d'évolution (meilleure intégration) 1. **Progression par nœud** — écouter l'événement websocket `progress_state` (déclaré dans `comfyui-frontend-types`) pour une progression fiable dans les sous-graphes et en exécution parallèle, en complément de `progress`. -2. **API Jobs du core** — utiliser l'historique/les jobs du core (déjà détectés - par `ComfyCoreCapabilities.jobs`) pour rattacher chaque sortie à son prompt, - au lieu de reconstruire cet état côté Majoor. +2. **API Jobs du core** — déjà utilisée pour la progression (R2) ; étendre à + `api.getJobAssets` pour rattacher chaque sortie à son prompt. 3. **API Assets du core** — quand `capabilities.assets` est vrai, synchroniser les tags/notes avec `/api/assets` (lecture seule d'abord), afin que les assets soient visibles dans les deux panneaux sans double indexation. diff --git a/docs/INSTALLATION.md b/docs/INSTALLATION.md index 3be5ae8e..41907421 100644 --- a/docs/INSTALLATION.md +++ b/docs/INSTALLATION.md @@ -12,7 +12,7 @@ This guide provides detailed instructions for installing and configuring the Maj ### System Requirements - ComfyUI installation (≥ 0.13.0 recommended) -- Python 3.10, 3.11, or 3.12 (3.13 compatible) +- Python 3.10 to 3.14 - At least 500MB free disk space for the extension and dependencies - Administrator privileges (for installation and optional tool installations) diff --git a/docs/SECURITY_ENV_VARS.md b/docs/SECURITY_ENV_VARS.md index a6a2622a..00a02c61 100644 --- a/docs/SECURITY_ENV_VARS.md +++ b/docs/SECURITY_ENV_VARS.md @@ -460,6 +460,14 @@ Environment variables provide secure configuration without code changes: - Options: `1`, `true`, `yes`, `on` to disable - Example: `MJR_AM_NO_AUTO_PIP=1` +### API Compatibility +- **MJR_AM_LEGACY_API_V2_ASSETS** + - Purpose: Also serve the deprecated `/api/v2/assets/*` alias of `/mjr/am/compat/assets/*` + - Default: Disabled (the `/api` namespace belongs to ComfyUI core) + - Security Impact: The alias sits behind the same auth/CSRF middlewares as `/mjr/am/*` + - Options: `1`, `true`, `yes`, `on` to enable + - Example: `MJR_AM_LEGACY_API_V2_ASSETS=1` + ## Security Testing ### Self-Assessment Checklist diff --git a/mjr_am_backend/routes/handlers/api_v2_assets.py b/mjr_am_backend/routes/handlers/api_v2_assets.py index ad1f899e..71fae126 100644 --- a/mjr_am_backend/routes/handlers/api_v2_assets.py +++ b/mjr_am_backend/routes/handlers/api_v2_assets.py @@ -1,19 +1,23 @@ """ -``/api/v2/assets/*`` — OpenAPI-aligned read-only compat layer (Phase 3.1). +``/mjr/am/compat/assets/*`` — OpenAPI-aligned read-only compat layer (Phase 3.1). + +Formerly served at ``/api/v2/assets/*``; that path sits in ComfyUI core's +``/api`` namespace and is now only an opt-in alias +(``MJR_AM_LEGACY_API_V2_ASSETS=1``). This module exposes a small, schema-stable REST surface that mirrors the ComfyUI core ``/api/assets/*`` endpoints defined in ``openapi.yaml`` (the -official spec used by Cloud and Desktop clients). We use the ``v2`` prefix -to avoid colliding with the core's own ``/api/assets/*`` routes when the -plugin is loaded alongside an asset-aware ComfyUI build. +official spec used by Cloud and Desktop clients). It lives under the +extension's own ``/mjr/am/`` prefix so it never collides with the core's +``/api/assets/*`` routes (or any future versioned core route). Scope of this first cut (read-only, additive): -* ``HEAD /api/v2/assets/hash/{hash}`` — existence check by content hash -* ``GET /api/v2/assets`` — paginated list with basic filters -* ``GET /api/v2/assets/{id}`` — single asset metadata -* ``GET /api/v2/assets/{id}/content`` — binary file stream -* ``GET /api/v2/assets/{id}/tags`` — tag list for one asset +* ``HEAD /hash/{hash}`` — existence check by content hash +* ``GET `` — paginated list with basic filters +* ``GET /{id}`` — single asset metadata +* ``GET /{id}/content`` — binary file stream +* ``GET /{id}/tags`` — tag list for one asset Mutations (POST/PUT/PATCH/DELETE) are intentionally *not* implemented yet: they would duplicate complex side-effecting flows already exposed under @@ -468,7 +472,7 @@ async def _list_assets(request: web.Request) -> web.Response: order=order, ) except Exception as exc: - logger.warning("api/v2/assets list failed: %s", exc, exc_info=True) + logger.warning("compat assets list failed: %s", exc, exc_info=True) return _api_error_response(Result.Err("DB_ERROR", "Asset listing failed")) assets = [_row_to_asset(row) for row in rows] @@ -505,7 +509,7 @@ async def _check_asset_by_hash(request: web.Request) -> web.Response: (hex_part, f"blake3:{hex_part}"), ) except Exception as exc: - logger.warning("api/v2/assets hash check failed: %s", exc, exc_info=True) + logger.warning("compat assets hash check failed: %s", exc, exc_info=True) return web.Response(status=500) found = bool(res.ok and res.data) @@ -524,7 +528,7 @@ async def _get_asset(request: web.Request) -> web.Response: try: row = await _query_one(services["db"], where, params) except Exception as exc: - logger.warning("api/v2/assets get failed: %s", exc, exc_info=True) + logger.warning("compat assets get failed: %s", exc, exc_info=True) return _api_error_response(Result.Err("DB_ERROR", "Asset lookup failed")) if row is None: @@ -542,7 +546,7 @@ async def _get_asset_content(request: web.Request) -> web.StreamResponse: try: row = await _query_one(services["db"], where, params) except Exception as exc: - logger.warning("api/v2/assets content lookup failed: %s", exc, exc_info=True) + logger.warning("compat assets content lookup failed: %s", exc, exc_info=True) return web.json_response({"error": "Asset lookup failed"}, status=500) if row is None: return web.json_response({"error": "Asset not found"}, status=404) @@ -573,7 +577,7 @@ async def _get_asset_tags(request: web.Request) -> web.Response: try: row = await _query_one(services["db"], where, params) except Exception as exc: - logger.warning("api/v2/assets tags lookup failed: %s", exc, exc_info=True) + logger.warning("compat assets tags lookup failed: %s", exc, exc_info=True) return _api_error_response(Result.Err("DB_ERROR", "Asset lookup failed")) if row is None: @@ -582,7 +586,7 @@ async def _get_asset_tags(request: web.Request) -> web.Response: async def _seed_status(request: web.Request) -> web.Response: - """Compat shim for ``GET /api/v2/assets/seed/status``. + """Compat shim for ``GET /seed/status``. We do not run a background "seeder" the way ComfyUI core does; our ingestion pipeline is the scanner + watcher loop. This endpoint reports @@ -604,7 +608,7 @@ async def _seed_status(request: web.Request) -> web.Response: "GROUP BY enrichment_level" ) except Exception as exc: - logger.warning("api/v2/assets seed/status failed: %s", exc, exc_info=True) + logger.warning("compat assets seed/status failed: %s", exc, exc_info=True) return _api_error_response(Result.Err("DB_ERROR", "Seed status lookup failed")) total = 0 @@ -639,9 +643,9 @@ async def _seed_status(request: web.Request) -> web.Response: async def _tags_refine(request: web.Request) -> web.Response: - """``GET /api/v2/assets/tags/refine`` — tag histogram for filtered subset. + """``GET /tags/refine`` — tag histogram for filtered subset. - Accepts the same filters as ``GET /api/v2/assets`` (``name_contains``, + Accepts the same filters as ``GET `` (``name_contains``, ``include_tags``, ``exclude_tags``) and returns the most-frequent tags among matching assets. Results are read from the normalized ``asset_tags`` + ``tags`` tables. @@ -692,7 +696,7 @@ async def _tags_refine(request: web.Request) -> web.Response: try: res = await db.aquery(sql, tuple([*params, limit])) except Exception as exc: - logger.warning("api/v2/assets tags/refine failed: %s", exc, exc_info=True) + logger.warning("compat assets tags/refine failed: %s", exc, exc_info=True) return _api_error_response(Result.Err("DB_ERROR", "Tag refine failed")) tags: list[dict[str, Any]] = [] @@ -711,14 +715,52 @@ async def _tags_refine(request: web.Request) -> web.Response: # --------------------------------------------------------------------------- # -def register_api_v2_asset_routes(routes: web.RouteTableDef) -> None: - """Register the ``/api/v2/assets/*`` compat surface.""" - routes.head("/api/v2/assets/hash/{hash}")(_check_asset_by_hash) +#: Canonical prefix. Lives under the extension's own ``/mjr/am/`` namespace so +#: it can never be shadowed by (or shadow) ComfyUI core routes. +COMPAT_ASSETS_PREFIX = "/mjr/am/compat/assets" + +#: Historical prefix. ``/api/...`` belongs to ComfyUI core: if core ever ships +#: ``/api/v2/assets`` its routes (registered first) would silently win. Kept +#: only as an opt-in alias for external clients that still call it. +LEGACY_COMPAT_ASSETS_PREFIX = "/api/v2/assets" +LEGACY_ALIAS_ENV = "MJR_AM_LEGACY_API_V2_ASSETS" + + +def legacy_alias_enabled() -> bool: + from mjr_am_backend.utils import env_bool + + return env_bool(LEGACY_ALIAS_ENV, False) + + +def _register_compat_asset_routes(routes: web.RouteTableDef, prefix: str) -> None: + routes.head(prefix + "/hash/{hash}")(_check_asset_by_hash) # Static-path routes MUST be declared before the catch-all ``/{id}`` # variants so aiohttp doesn't route ``seed`` / ``tags`` to ``_get_asset``. - routes.get("/api/v2/assets/seed/status")(_seed_status) - routes.get("/api/v2/assets/tags/refine")(_tags_refine) - routes.get("/api/v2/assets")(_list_assets) - routes.get("/api/v2/assets/{id}")(_get_asset) - routes.get("/api/v2/assets/{id}/content")(_get_asset_content) - routes.get("/api/v2/assets/{id}/tags")(_get_asset_tags) + routes.get(prefix + "/seed/status")(_seed_status) + routes.get(prefix + "/tags/refine")(_tags_refine) + routes.get(prefix)(_list_assets) + routes.get(prefix + "/{id}")(_get_asset) + routes.get(prefix + "/{id}/content")(_get_asset_content) + routes.get(prefix + "/{id}/tags")(_get_asset_tags) + + +def register_api_v2_asset_routes( + routes: web.RouteTableDef, *, include_legacy_alias: bool | None = None +) -> None: + """Register the OpenAPI-aligned compat surface. + + Always served under ``/mjr/am/compat/assets/*``. The legacy + ``/api/v2/assets/*`` alias is registered only when + ``MJR_AM_LEGACY_API_V2_ASSETS=1`` (or ``include_legacy_alias=True``). + """ + _register_compat_asset_routes(routes, COMPAT_ASSETS_PREFIX) + if include_legacy_alias is None: + include_legacy_alias = legacy_alias_enabled() + if include_legacy_alias: + logger.warning( + "Majoor: legacy /api/v2/assets alias enabled via %s; it is deprecated " + "and may be shadowed by ComfyUI core. Use %s instead.", + LEGACY_ALIAS_ENV, + COMPAT_ASSETS_PREFIX, + ) + _register_compat_asset_routes(routes, LEGACY_COMPAT_ASSETS_PREFIX) diff --git a/mjr_am_backend/routes/registry_middlewares.py b/mjr_am_backend/routes/registry_middlewares.py index 17a3a023..a44f87cc 100644 --- a/mjr_am_backend/routes/registry_middlewares.py +++ b/mjr_am_backend/routes/registry_middlewares.py @@ -21,9 +21,10 @@ logger = get_logger(__name__) API_PREFIX = "/mjr/am/" -# The OpenAPI-aligned read-only compat surface (routes/handlers/api_v2_assets.py). -# It is part of this extension's HTTP surface and must sit behind the same -# security boundary as API_PREFIX. +# Legacy, opt-in alias of the OpenAPI-aligned compat surface +# (routes/handlers/api_v2_assets.py; canonical path /mjr/am/compat/assets is +# already covered by API_PREFIX). When enabled it is part of this extension's +# HTTP surface and must sit behind the same security boundary as API_PREFIX. COMPAT_API_PREFIX = "/api/v2/assets" # ComfyUI's PromptServer mirrors EVERY registered route under an additional diff --git a/mjr_am_backend/routes/route_catalog.py b/mjr_am_backend/routes/route_catalog.py index 4e75216b..9832c19a 100644 --- a/mjr_am_backend/routes/route_catalog.py +++ b/mjr_am_backend/routes/route_catalog.py @@ -129,11 +129,11 @@ OPTIONAL_ROUTE_REGISTRATIONS: tuple[RouteRegistration, ...] = ( "api v2 assets (compat)", register_api_v2_asset_routes, ( - " HEAD /api/v2/assets/hash/{hash} (Added)", - " GET /api/v2/assets (Added)", - " GET /api/v2/assets/{id} (Added)", - " GET /api/v2/assets/{id}/content (Added)", - " GET /api/v2/assets/{id}/tags (Added)", + " HEAD /mjr/am/compat/assets/hash/{hash} (Added)", + " GET /mjr/am/compat/assets (Added)", + " GET /mjr/am/compat/assets/{id} (Added)", + " GET /mjr/am/compat/assets/{id}/content (Added)", + " GET /mjr/am/compat/assets/{id}/tags (Added)", ), ), ) diff --git a/pyproject.toml b/pyproject.toml index 62460263..dbafa25c 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -2,7 +2,7 @@ name = "majoor-assetsmanager" description = "Majoor Assets Manager is an advanced asset browser for ComfyUI that provides a comprehensive solution for managing, organizing, and viewing your generated assets. It integrates directly into ComfyUI, offering features like full-text search, metadata extraction, rating and tagging systems, and advanced viewing capabilities." version = "2.5.3" -requires-python = ">=3.10, <3.14" +requires-python = ">=3.10, <3.15" license = {file = "LICENSE"} authors = [ { name = "MajoorWaldi" }, @@ -96,7 +96,7 @@ includes = ["dist/", "locales/", "example_workflows/"] [tool.black] line-length = 100 -target-version = ["py310", "py311", "py312", "py313"] +target-version = ["py310", "py311", "py312", "py313", "py314"] include = '\.pyi?$' [tool.ruff] diff --git a/tests/features/test_api_v2_assets.py b/tests/features/test_api_v2_assets.py index 6920387f..39505e1c 100644 --- a/tests/features/test_api_v2_assets.py +++ b/tests/features/test_api_v2_assets.py @@ -1,4 +1,4 @@ -"""Tests for the ``/api/v2/assets/*`` OpenAPI compat layer.""" +"""Tests for the ``/mjr/am/compat/assets/*`` OpenAPI compat layer.""" import json @@ -143,7 +143,7 @@ async def test_list_endpoint_returns_paginated_payload(monkeypatch): monkeypatch.setattr(api_v2_assets, "_require_services", _services) app = _build_app() - req = make_mocked_request("GET", "/api/v2/assets?limit=2&offset=0", app=app) + req = make_mocked_request("GET", "/mjr/am/compat/assets?limit=2&offset=0", app=app) match = await app.router.resolve(req) resp = await match.handler(req) payload = json.loads(resp.text) @@ -166,7 +166,7 @@ async def test_get_endpoint_returns_404_when_missing(monkeypatch): monkeypatch.setattr(api_v2_assets, "_require_services", _services) app = _build_app() - req = make_mocked_request("GET", "/api/v2/assets/999", app=app) + req = make_mocked_request("GET", "/mjr/am/compat/assets/999", app=app) req.match_info["id"] = "999" resp = await api_v2_assets._get_asset(req) assert resp.status == 404 @@ -181,7 +181,7 @@ async def test_get_endpoint_returns_asset(monkeypatch): return {"db": _FakeDB(_handle)}, None monkeypatch.setattr(api_v2_assets, "_require_services", _services) - req = make_mocked_request("GET", "/api/v2/assets/1") + req = make_mocked_request("GET", "/mjr/am/compat/assets/1") req.match_info["id"] = "1" resp = await api_v2_assets._get_asset(req) assert resp.status == 200 @@ -199,7 +199,7 @@ async def test_hash_check_returns_200_on_match(monkeypatch): return {"db": _FakeDB(_handle)}, None monkeypatch.setattr(api_v2_assets, "_require_services", _services) - req = make_mocked_request("HEAD", f"/api/v2/assets/hash/{'a' * 64}") + req = make_mocked_request("HEAD", f"/mjr/am/compat/assets/hash/{'a' * 64}") req.match_info["hash"] = "a" * 64 resp = await api_v2_assets._check_asset_by_hash(req) assert resp.status == 200 @@ -214,7 +214,7 @@ async def test_hash_check_returns_404_when_missing(monkeypatch): return {"db": _FakeDB(_handle)}, None monkeypatch.setattr(api_v2_assets, "_require_services", _services) - req = make_mocked_request("HEAD", f"/api/v2/assets/hash/blake3:{'b' * 64}") + req = make_mocked_request("HEAD", f"/mjr/am/compat/assets/hash/blake3:{'b' * 64}") req.match_info["hash"] = "blake3:" + "b" * 64 resp = await api_v2_assets._check_asset_by_hash(req) assert resp.status == 404 @@ -226,7 +226,7 @@ async def test_hash_check_rejects_malformed_input(monkeypatch): return {"db": _FakeDB(lambda *_: Result.Ok([]))}, None monkeypatch.setattr(api_v2_assets, "_require_services", _services) - req = make_mocked_request("HEAD", "/api/v2/assets/hash/notahash") + req = make_mocked_request("HEAD", "/mjr/am/compat/assets/hash/notahash") req.match_info["hash"] = "notahash" resp = await api_v2_assets._check_asset_by_hash(req) assert resp.status == 404 @@ -241,7 +241,7 @@ async def test_tags_endpoint_returns_tags(monkeypatch): return {"db": _FakeDB(_handle)}, None monkeypatch.setattr(api_v2_assets, "_require_services", _services) - req = make_mocked_request("GET", "/api/v2/assets/1/tags") + req = make_mocked_request("GET", "/mjr/am/compat/assets/1/tags") req.match_info["id"] = "1" resp = await api_v2_assets._get_asset_tags(req) assert resp.status == 200 @@ -260,7 +260,7 @@ async def test_content_endpoint_returns_404_when_path_disallowed(monkeypatch): monkeypatch.setattr(api_v2_assets, "_require_services", _services) monkeypatch.setattr(api_v2_assets, "_is_path_allowed", lambda *a, **kw: False) - req = make_mocked_request("GET", "/api/v2/assets/1/content") + req = make_mocked_request("GET", "/mjr/am/compat/assets/1/content") req.match_info["id"] = "1" resp = await api_v2_assets._get_asset_content(req) assert resp.status == 404 @@ -289,7 +289,7 @@ def test_row_to_asset_omits_workflow_id_when_absent_everywhere(): # --------------------------------------------------------------------------- # -# /api/v2/assets/seed/status +# /mjr/am/compat/assets/seed/status # --------------------------------------------------------------------------- # @@ -310,7 +310,7 @@ async def test_seed_status_reports_totals_and_breakdown(monkeypatch): return {"db": _FakeDB(_handle)}, None monkeypatch.setattr(api_v2_assets, "_require_services", _services) - req = make_mocked_request("GET", "/api/v2/assets/seed/status") + req = make_mocked_request("GET", "/mjr/am/compat/assets/seed/status") resp = await api_v2_assets._seed_status(req) body = json.loads(resp.text) if resp.status != 200: @@ -340,7 +340,7 @@ async def test_seed_status_handles_empty_db(monkeypatch): return {"db": _FakeDB(_handle)}, None monkeypatch.setattr(api_v2_assets, "_require_services", _services) - req = make_mocked_request("GET", "/api/v2/assets/seed/status") + req = make_mocked_request("GET", "/mjr/am/compat/assets/seed/status") resp = await api_v2_assets._seed_status(req) body = json.loads(resp.text) if resp.status != 200: @@ -352,7 +352,7 @@ async def test_seed_status_handles_empty_db(monkeypatch): # --------------------------------------------------------------------------- # -# /api/v2/assets/tags/refine +# /mjr/am/compat/assets/tags/refine # --------------------------------------------------------------------------- # @@ -375,7 +375,7 @@ async def test_tags_refine_returns_histogram(monkeypatch): monkeypatch.setattr(api_v2_assets, "_require_services", _services) req = make_mocked_request( "GET", - "/api/v2/assets/tags/refine?include_tags=cat&exclude_tags=blurry&limit=10", + "/mjr/am/compat/assets/tags/refine?include_tags=cat&exclude_tags=blurry&limit=10", ) resp = await api_v2_assets._tags_refine(req) body = json.loads(resp.text) @@ -401,7 +401,7 @@ async def test_tags_refine_handles_no_filters(monkeypatch): return {"db": _FakeDB(_handle)}, None monkeypatch.setattr(api_v2_assets, "_require_services", _services) - req = make_mocked_request("GET", "/api/v2/assets/tags/refine") + req = make_mocked_request("GET", "/mjr/am/compat/assets/tags/refine") resp = await api_v2_assets._tags_refine(req) body = json.loads(resp.text) if resp.status != 200: @@ -424,7 +424,7 @@ async def test_seed_status_is_not_eaten_by_id_route(monkeypatch): monkeypatch.setattr(api_v2_assets, "_require_services", _services) app = _build_app() - req = make_mocked_request("GET", "/api/v2/assets/seed/status", app=app) + req = make_mocked_request("GET", "/mjr/am/compat/assets/seed/status", app=app) match = await app.router.resolve(req) if match.handler is not api_v2_assets._seed_status: pytest.fail(f"seed/status routed to {match.handler.__name__}") @@ -437,7 +437,7 @@ async def test_tags_refine_is_not_eaten_by_id_route(monkeypatch): monkeypatch.setattr(api_v2_assets, "_require_services", _services) app = _build_app() - req = make_mocked_request("GET", "/api/v2/assets/tags/refine", app=app) + req = make_mocked_request("GET", "/mjr/am/compat/assets/tags/refine", app=app) match = await app.router.resolve(req) if match.handler is not api_v2_assets._tags_refine: pytest.fail(f"tags/refine routed to {match.handler.__name__}") @@ -451,3 +451,29 @@ def test_api_error_response_maps_stable_codes_to_http_statuses(): assert invalid.status == 400 assert unavailable.status == 503 + + +# --------------------------------------------------------------------------- # +# Namespace: never squat ComfyUI core's /api space by default +# --------------------------------------------------------------------------- # + + +def _registered_paths(**kwargs) -> set[str]: + routes = web.RouteTableDef() + api_v2_assets.register_api_v2_asset_routes(routes, **kwargs) + return {r.path for r in routes} + + +def test_compat_routes_live_under_extension_namespace(monkeypatch): + monkeypatch.delenv(api_v2_assets.LEGACY_ALIAS_ENV, raising=False) + paths = _registered_paths() + assert paths + assert all(p.startswith("/mjr/am/compat/assets") for p in paths) + + +def test_legacy_alias_is_opt_in(monkeypatch): + monkeypatch.setenv(api_v2_assets.LEGACY_ALIAS_ENV, "1") + paths = _registered_paths() + assert "/api/v2/assets" in paths + assert "/mjr/am/compat/assets" in paths + assert "/api/v2/assets" not in _registered_paths(include_legacy_alias=False) diff --git a/tox.ini b/tox.ini index 8f6dd408..751b770f 100644 --- a/tox.ini +++ b/tox.ini @@ -1,5 +1,5 @@ [tox] -envlist = quality, py310, py311, py312, py313 +envlist = quality, py310, py311, py312, py313, py314 skipsdist = True skip_missing_interpreters = True diff --git a/tsconfig.test.json b/tsconfig.test.json index 73ec6027..f843759d 100644 --- a/tsconfig.test.json +++ b/tsconfig.test.json @@ -3,7 +3,8 @@ "compilerOptions": { "strict": false, "noImplicitAny": false, - "noEmit": true + "noEmit": true, + "allowImportingTsExtensions": true }, "include": [ "ui/tests/**/*.ts", diff --git a/ui/app/hostAdapter.ts b/ui/app/hostAdapter.ts index bd99593d..77c0bcac 100644 --- a/ui/app/hostAdapter.ts +++ b/ui/app/hostAdapter.ts @@ -48,7 +48,6 @@ import { findGraphNodeById, getHostRootGraph, walkGraphNodes } from "./graphTrav // -- internal state ------------------------------------------------------------ let _app: any = null; -const HOST_QUEUE_PROMPT_BINDING_KEY = Symbol.for("mjr.host.queuePromptBinding"); const HOST_CANVAS_SELECTION_EVENT_TYPES = [ "selectionchange", "selection-change", @@ -252,6 +251,32 @@ export function registerSidebarTab(tabDef: any): boolean { } } +/** + * List every sidebar tab currently registered with the host (core + extensions). + * Returns an empty array when the host predates `getSidebarTabs`. + */ +export function listHostSidebarTabs(app: any = null): any[] { + try { + const manager = getExtensionManager(app || _app || getComfyApp()); + const tabs = typeof manager?.getSidebarTabs === "function" ? manager.getSidebarTabs() : []; + return Array.isArray(tabs) ? tabs.filter(Boolean) : []; + } catch { + return []; + } +} + +/** Unregister a sidebar tab by id through the official extension manager API. */ +export function unregisterHostSidebarTab(id: string, app: any = null): boolean { + try { + const manager = getExtensionManager(app || _app || getComfyApp()); + if (!id || typeof manager?.unregisterSidebarTab !== "function") return false; + manager.unregisterSidebarTab(id); + return true; + } catch { + return false; + } +} + export function registerSidebarTabForApp(app: any, tabDef: any): boolean { try { return registerSidebarTabCompat(app || _app || getComfyApp(), tabDef); @@ -543,65 +568,6 @@ export function observeHostCanvasSelection( }; } -export function wrapHostQueuePrompt( - options: { - api?: any; - app?: any; - owner?: any; - createWrapper?: ((originalQueuePrompt: any, api: any) => any) | null; - } = {}, -): { - api: any; - owner: any; - originalQueuePrompt: any; - wrappedQueuePrompt: any; - restore: () => boolean; -} | null { - const api = options.api || getRawHostApi(options.app || _app || getComfyApp()); - const owner = options.owner || null; - const createWrapper = - typeof options.createWrapper === "function" ? options.createWrapper : null; - if (!api || typeof api.queuePrompt !== "function" || !createWrapper) return null; - - const existingBinding = api.queuePrompt?.[HOST_QUEUE_PROMPT_BINDING_KEY] || null; - if (existingBinding?.owner === owner) { - return existingBinding; - } - if (existingBinding?.owner && existingBinding.owner !== owner) { - return null; - } - - const originalQueuePrompt = api.queuePrompt; - const wrappedQueuePrompt = createWrapper(originalQueuePrompt, api); - if (typeof wrappedQueuePrompt !== "function") return null; - - const binding = { - api, - owner, - originalQueuePrompt, - wrappedQueuePrompt, - restore: () => { - try { - const activeBinding = api.queuePrompt?.[HOST_QUEUE_PROMPT_BINDING_KEY] || null; - if (activeBinding?.owner !== owner) return false; - api.queuePrompt = originalQueuePrompt; - return true; - } catch (e) { - console.debug?.(e); - return false; - } - }, - }; - - Object.defineProperty(wrappedQueuePrompt, HOST_QUEUE_PROMPT_BINDING_KEY, { - configurable: true, - value: binding, - }); - - api.queuePrompt = wrappedQueuePrompt; - return binding; -} - export async function interruptHostExecution(app: any = null): Promise { const runtimeApp = app || _app || getComfyApp(); const liveApi = runtimeApp?.api && typeof runtimeApp.api.interrupt === "function" ? runtimeApp.api : null; @@ -1242,7 +1208,6 @@ export const hostAdapter = { fetchHostApi, queueHostPrompt, observeHostCanvasSelection, - wrapHostQueuePrompt, interruptHostExecution, getSelectedHostCanvasNodes, getSelectedHostCanvasNodeIds, @@ -1255,6 +1220,8 @@ export const hostAdapter = { importWorkflowPreferHostTab, isHostWorkflowDirty, serializeCurrentHostWorkflow, + listHostSidebarTabs, + unregisterHostSidebarTab, addNodeToHostGraph, createHostNode, focusHostCanvasNode, diff --git a/ui/app/settings/settingsCore.ts b/ui/app/settings/settingsCore.ts index 5136cd27..b157949e 100644 --- a/ui/app/settings/settingsCore.ts +++ b/ui/app/settings/settingsCore.ts @@ -139,6 +139,11 @@ export const DEFAULT_SETTINGS = { widthPx: 360, assetBadgeEnabled: APP_DEFAULTS.SIDEBAR_ASSET_BADGE_ENABLED, }, + integration: { + // Opt-in: hide ComfyUI's native Assets sidebar tab so only one assets + // panel is shown. Never enabled by default (no surprise for users). + hideNativeAssetsTab: false, + }, probeBackend: { mode: "auto", }, diff --git a/ui/app/settings/settingsGrid.ts b/ui/app/settings/settingsGrid.ts index e101b9bb..ecd0f769 100644 --- a/ui/app/settings/settingsGrid.ts +++ b/ui/app/settings/settingsGrid.ts @@ -11,6 +11,7 @@ import { detectGridSizePreset, } from "./settingsUtils.js"; import { saveMajoorSettings, applySettingsToConfig } from "./settingsCore.js"; +import { setNativeAssetsTabHidden } from "../../features/runtime/nativeAssetsTab.js"; const SETTINGS_PREFIX = "Majoor"; const SETTINGS_CATEGORY = "Majoor Assets Manager"; @@ -531,6 +532,23 @@ export function registerGridSettings(safeAddSetting: (def: any) => void, setting }, }); + safeAddSetting({ + id: `${SETTINGS_PREFIX}.Integration.HideNativeAssetsTab`, + category: cat(t("cat.grid"), "Hide ComfyUI native Assets tab"), + name: "Hide ComfyUI's native Assets sidebar tab", + tooltip: + "Optional. Removes ComfyUI's built-in Assets tab from the sidebar so only Majoor Assets Manager is shown. Turning it off restores the native tab. Your files and the native tab's data are not affected.", + type: "boolean", + defaultValue: !!settings.integration?.hideNativeAssetsTab, + onChange: (value: any) => { + settings.integration = settings.integration || {}; + settings.integration.hideNativeAssetsTab = !!value; + saveMajoorSettings(settings); + setNativeAssetsTabHidden(!!value); + notifyApplied("integration.hideNativeAssetsTab"); + }, + }); + safeAddSetting({ id: `${SETTINGS_PREFIX}.Sidebar.WidthPx`, category: cat(t("cat.grid"), "Sidebar width"), diff --git a/ui/features/panel/messages/toastHistory.ts b/ui/features/panel/messages/toastHistory.ts index 1c6e729f..42ce8df4 100644 --- a/ui/features/panel/messages/toastHistory.ts +++ b/ui/features/panel/messages/toastHistory.ts @@ -165,7 +165,7 @@ function _writeLastRead(ts: any) { * @param {string} type - "info" | "success" | "warning" | "error" * @param {number} [duration] - Display duration in ms; used to filter ephemeral info toasts. */ -export function addToastHistory(message: any, type: string, duration?: number): void { +export function addToastHistory(message: any, type?: string, duration?: number): void { _load(); const entry = message && typeof message === "object" diff --git a/ui/features/runtime/entryUiRegistration.ts b/ui/features/runtime/entryUiRegistration.ts index 14c5c5e3..90956e72 100644 --- a/ui/features/runtime/entryUiRegistration.ts +++ b/ui/features/runtime/entryUiRegistration.ts @@ -40,6 +40,7 @@ import { mountTopBarMfvButton, teardownTopBarMfvButton } from "./topBarMfvButton import { startEarlyFetch, consumeEarlyFetch } from "./earlyFetch.js"; import { configureSidebarAssetBadge, resetSidebarAssetBadge } from "./sidebarAssetBadge.js"; import { consumePendingGeneratedAssets } from "./pendingGeneratedAssets.js"; +import { setNativeAssetsTabHidden, teardownNativeAssetsTab } from "./nativeAssetsTab.js"; import { refreshGeneratedFeedHosts } from "../bottomPanel/feed/feedHost.js"; // -- keep-alive mount keys ----------------------------------------------------- @@ -617,6 +618,12 @@ export function registerNativeKeybindings(runtimeApp: any): void { */ export function registerAssetsSidebar(runtimeApp: any, { sidebarTabId }: { sidebarTabId: string }): any { configureSidebarAssetBadge({ sidebarTabId }); + try { + // Opt-in only (default false): see Majoor.Integration.HideNativeAssetsTab. + if (loadMajoorSettings()?.integration?.hideNativeAssetsTab) setNativeAssetsTabHidden(true); + } catch (e) { + console.debug?.(e); + } return registerSidebarTabForApp(runtimeApp, { id: sidebarTabId, icon: "pi pi-folder", @@ -666,6 +673,11 @@ export function registerAssetsSidebar(runtimeApp: any, { sidebarTabId }: { sideb * controller on extension cleanup / ComfyUI reload). */ export function teardownAssetsSidebar(): void { + try { + teardownNativeAssetsTab(); + } catch { + /* ignore */ + } try { unmountKeepAlive(null, SIDEBAR_MOUNT_KEY); } catch { diff --git a/ui/features/runtime/nativeAssetsTab.ts b/ui/features/runtime/nativeAssetsTab.ts new file mode 100644 index 00000000..0f3e6136 --- /dev/null +++ b/ui/features/runtime/nativeAssetsTab.ts @@ -0,0 +1,91 @@ +/** + * Optional coexistence with ComfyUI's native "Assets" sidebar tab. + * + * Recent ComfyUI frontends ship their own media/assets sidebar tab. Majoor + * never touches it by default; users who prefer a single assets panel can opt + * in to hide the native one. Hiding goes through the official extension + * manager API (`getSidebarTabs` / `unregisterSidebarTab`) and the removed tab + * definition is kept so it can be re-registered verbatim when the option is + * turned off again. + */ + +import { + listHostSidebarTabs, + registerSidebarTab, + unregisterHostSidebarTab, +} from "../../app/hostAdapter.js"; + +/** Known ids of the core frontend's assets/media sidebar tab across releases. */ +const NATIVE_ASSETS_TAB_IDS = new Set(["assets", "media-assets", "assets-sidebar"]); + +/** + * Core sidebar tabs are registered when the graph view mounts, which can be + * after extensions finish `setup()`. Re-apply a few times so an early opt-in + * still takes effect. + */ +const RETRY_DELAYS_MS = [500, 2000, 6000]; + +let _hideRequested = false; +const _hiddenTabs = new Map(); +let _retryTimers: ReturnType[] = []; + +export function isNativeAssetsTab(tab: any): boolean { + const id = String(tab?.id || "") + .trim() + .toLowerCase(); + if (!id || id.startsWith("majoor") || id.startsWith("mjr")) return false; + return NATIVE_ASSETS_TAB_IDS.has(id); +} + +function _clearRetries(): void { + for (const timer of _retryTimers.splice(0)) clearTimeout(timer); +} + +function _hideNow(): number { + let hidden = 0; + for (const tab of listHostSidebarTabs()) { + if (!isNativeAssetsTab(tab)) continue; + const id = String(tab.id); + if (unregisterHostSidebarTab(id)) { + _hiddenTabs.set(id, tab); + hidden += 1; + } + } + return hidden; +} + +function _restoreNow(): void { + for (const [id, tab] of [..._hiddenTabs.entries()]) { + const alreadyBack = listHostSidebarTabs().some((t: any) => String(t?.id || "") === id); + if (alreadyBack || registerSidebarTab(tab)) _hiddenTabs.delete(id); + } +} + +/** Apply the user's preference. Safe to call repeatedly. */ +export function setNativeAssetsTabHidden(hidden: boolean): void { + _hideRequested = !!hidden; + _clearRetries(); + if (!_hideRequested) { + _restoreNow(); + return; + } + _hideNow(); + for (const delay of RETRY_DELAYS_MS) { + _retryTimers.push( + setTimeout(() => { + if (_hideRequested) _hideNow(); + }, delay), + ); + } +} + +/** Extension teardown: give the core tab back and stop pending retries. */ +export function teardownNativeAssetsTab(): void { + _hideRequested = false; + _clearRetries(); + _restoreNow(); +} + +export function getHiddenNativeAssetsTabIds(): string[] { + return [..._hiddenTabs.keys()]; +} diff --git a/ui/features/viewer/floatingViewerProgress.ts b/ui/features/viewer/floatingViewerProgress.ts index 95d3cf2c..aead4f27 100644 --- a/ui/features/viewer/floatingViewerProgress.ts +++ b/ui/features/viewer/floatingViewerProgress.ts @@ -3,7 +3,6 @@ import { getRawHostApi, getRawHostApp, waitForRawHostApi, - wrapHostQueuePrompt, } from "../../app/hostAdapter.js"; import { findGraphNodeById, getHostRootGraph } from "../../app/graphTraversal.js"; @@ -133,7 +132,7 @@ export class FloatingViewerProgressService extends EventTarget { this._api = null; this._listenerEntries = []; this._initPromise = null; - this._queuePromptBinding = null; + this._hydrations = new Map(); } getSnapshot() { @@ -188,48 +187,89 @@ export class FloatingViewerProgressService extends EventTarget { _attachApi(api: any) { if (!api || typeof api.addEventListener !== "function") return; if (this._api === api) return; - this.dispose({ resetPatchedQueuePrompt: false, keepState: true }); + this.dispose({ keepState: true }); this._api = api; - this._patchQueuePrompt(api); this._attachApiListeners(api); } - _patchQueuePrompt(api: any) { - const service = this; - this._queuePromptBinding = wrapHostQueuePrompt({ - api, - owner: this, - createWrapper(originalQueuePrompt: any) { - return async function (this: any, number: any, prompt: any, ...args: any[]) { - let response; - try { - response = await originalQueuePrompt.apply(this, [number, prompt, ...args]); - } catch (error: any) { - const promptExecution = service.getOrMakePrompt("error"); - promptExecution.error({ exception_type: "Unknown." }); - service.currentExecution = promptExecution; - service.dispatchProgressUpdate(); - throw error; - } + /** + * Resolve the API-format prompt (node ids -> class_type/_meta) for a + * prompt that the server just started, using ComfyUI's own read-only + * endpoints instead of intercepting `api.queuePrompt`. Wrapping + * queuePrompt is fragile: other extensions wrap it too and the order is + * not guaranteed. + * + * Order: core Jobs API (`api.getJobDetail` -> `GET /api/jobs/{id}`, whose + * `workflow` carries `{ prompt, extra_data }`), then `/queue` for older + * cores, then `/history/{id}` for prompts that already finished. + */ + async _hydratePrompt(api: any, promptExecution: any) { + const promptId = String(promptExecution?.id || "").trim(); + if (!promptId || promptId === "unknown" || promptExecution.promptApi) return; + if (!api) return; + if (this._hydrations.has(promptId)) return this._hydrations.get(promptId); - const promptId = String(response?.prompt_id || response?.promptId || "").trim(); - if (promptId) { - const promptExecution = service.getOrMakePrompt(promptId); - promptExecution.setPrompt(prompt); - if (!service.currentExecution) { - service.currentExecution = promptExecution; - } - service.dispatchEvent( - makeCustomEvent("queue-prompt", { - prompt: promptExecution, - }), - ); - service.dispatchProgressUpdate(); - } - return response; - }; - }, - }); + const task = (async () => { + const output = + (await this._findPromptInJob(api, promptId)) || + (await this._findPromptInQueue(api, promptId)) || + (await this._findPromptInHistory(api, promptId)); + if (output && !promptExecution.promptApi) { + promptExecution.setPrompt({ output }); + const current = promptExecution.currentlyExecuting; + if (current?.nodeId) { + current.nodeLabel = + promptExecution.getNodeLabel(current.nodeId) || current.nodeLabel; + } + if (this.promptsMap.get(promptId) === promptExecution) { + this.dispatchProgressUpdate(); + } + } + })() + .catch((e: any) => console.debug?.(e)) + .finally(() => this._hydrations.delete(promptId)); + this._hydrations.set(promptId, task); + return task; + } + + async _findPromptInJob(api: any, promptId: string) { + if (typeof api.getJobDetail !== "function") return null; + try { + const job = await api.getJobDetail(promptId); + const prompt = job?.workflow?.prompt; + return prompt && typeof prompt === "object" && !Array.isArray(prompt) ? prompt : null; + } catch (e: any) { + console.debug?.(e); + return null; + } + } + + async _fetchJson(api: any, route: string) { + if (typeof api.fetchApi !== "function") return null; + const resp = await api.fetchApi(route, { cache: "no-store" }); + if (!resp?.ok || typeof resp.json !== "function") return null; + return resp.json(); + } + + async _findPromptInQueue(api: any, promptId: string) { + const data = await this._fetchJson(api, "/queue"); + const items = [ + ...(Array.isArray(data?.queue_running) ? data.queue_running : []), + ...(Array.isArray(data?.queue_pending) ? data.queue_pending : []), + ]; + for (const item of items) { + // Queue entries are [number, prompt_id, prompt, extra_data, outputs_to_execute, ...] + if (Array.isArray(item) && String(item[1] || "") === promptId) { + return item[2] && typeof item[2] === "object" ? item[2] : null; + } + } + return null; + } + + async _findPromptInHistory(api: any, promptId: string) { + const data = await this._fetchJson(api, `/history/${encodeURIComponent(promptId)}`); + const prompt = data?.[promptId]?.prompt; + return Array.isArray(prompt) && prompt[2] && typeof prompt[2] === "object" ? prompt[2] : null; } _attachApiListeners(api: any) { @@ -246,6 +286,7 @@ export class FloatingViewerProgressService extends EventTarget { if (!promptId) return; this.currentExecution = this.getOrMakePrompt(promptId); this.dispatchProgressUpdate(); + void this._hydratePrompt(api, this.currentExecution); }); this._attachListener(api, "executing", (event: any) => { @@ -318,7 +359,7 @@ export class FloatingViewerProgressService extends EventTarget { this.dispatchEvent(makeCustomEvent(PROGRESS_UPDATE_EVENT, this.getSnapshot())); } - dispose({ resetPatchedQueuePrompt = false, keepState = false } = {}) { + dispose({ keepState = false }: { keepState?: boolean } = {}) { for (const { api, type, handler } of this._listenerEntries.splice(0)) { try { api?.removeEventListener?.(type, handler); @@ -327,15 +368,6 @@ export class FloatingViewerProgressService extends EventTarget { } } - if (resetPatchedQueuePrompt && this._queuePromptBinding?.owner === this) { - try { - this._queuePromptBinding.restore?.(); - } catch (e: any) { - console.debug?.(e); - } - } - - this._queuePromptBinding = null; this._api = null; if (!keepState) { this.promptsMap.clear(); diff --git a/ui/tests/api_client_dedupe.vitest.ts b/ui/tests/api_client_dedupe.vitest.ts index 849ff983..637695e8 100644 --- a/ui/tests/api_client_dedupe.vitest.ts +++ b/ui/tests/api_client_dedupe.vitest.ts @@ -24,28 +24,28 @@ function readHeader(headers, name) { describe("api client request deduplication", () => { beforeEach(() => { vi.resetModules(); - globalThis.localStorage = makeStorage(); - globalThis.sessionStorage = makeStorage(); + globalThis.localStorage = makeStorage() as any; + globalThis.sessionStorage = makeStorage() as any; const toastAdd = vi.fn(); globalThis.app = { ui: {}, extensionManager: { toast: { add: toastAdd } } }; globalThis.window = { addEventListener: vi.fn(), removeEventListener: vi.fn(), dispatchEvent: vi.fn(), - location: { origin: "http://localhost" }, + location: { origin: "http://localhost" } as any, app: globalThis.app, - }; + } as any; globalThis.CustomEvent = class { constructor(type, init) { - this.type = type; - this.detail = init?.detail; + (this as any).type = type; + (this as any).detail = init?.detail; } - }; + } as any; globalThis.fetch = vi.fn(async () => ({ status: 200, headers: { get: (name) => (name === "content-type" ? "application/json" : null) }, json: async () => ({ ok: true, data: { id: 7 } }), - })); + })) as any; }); afterEach(() => { @@ -57,7 +57,7 @@ describe("api client request deduplication", () => { const fetchPromise = new Promise((resolve) => { resolveFetch = resolve; }); - globalThis.fetch = vi.fn(() => fetchPromise); + globalThis.fetch = vi.fn(() => fetchPromise) as any; const client = await import("../api/client.js"); const first = client.getAssetMetadata(7); @@ -85,7 +85,7 @@ describe("api client request deduplication", () => { status: 500, headers: { get: (name) => (name === "content-type" ? "application/json" : null) }, json: async () => ({ ok: false, error: "server sad" }), - })); + })) as any; const client = await import("../api/client.js"); const first = await client.vectorFindSimilar(5, 10); @@ -121,7 +121,7 @@ describe("api client request deduplication", () => { headers: { get: (name) => (name === "content-type" ? "application/json" : null) }, json: async () => ({ ok: true, data: null }), }; - }); + }) as any; const client = await import("../api/client.js"); @@ -132,7 +132,7 @@ describe("api client request deduplication", () => { await client.updateAssetTags(7, []); await client.getAvailableTags(); - const tagFetches = globalThis.fetch.mock.calls.filter(([url]) => + const tagFetches = (globalThis.fetch as any).mock.calls.filter(([url]) => String(url).includes("/mjr/am/tags"), ); expect(tagFetches).toHaveLength(2); @@ -171,7 +171,7 @@ describe("api client request deduplication", () => { headers: { get: (name) => (name === "content-type" ? "application/json" : null) }, json: async () => ({ ok: true, data: null }), }; - }); + }) as any; const client = await import("../api/client.js"); const result = await client.updateAssetTags(7, ["remote"]); @@ -214,7 +214,7 @@ describe("api client request deduplication", () => { headers: { get: (name) => (name === "content-type" ? "application/json" : null) }, json: async () => ({ ok: true, data: null }), }; - }); + }) as any; const client = await import("../api/client.js"); const result = await client.updateAssetTags(7, ["remote"]); @@ -235,7 +235,7 @@ describe("api client request deduplication", () => { globalThis.window.dispatchEvent = vi.fn((event) => { const listener = listeners.get(String(event?.type || "")); if (typeof listener === "function") listener(event); - }); + }) as any; const token = "boot-token-1234567890"; globalThis.fetch = vi.fn(async (url, options = {}) => { @@ -270,13 +270,13 @@ describe("api client request deduplication", () => { headers: { get: (name) => (name === "content-type" ? "application/json" : null) }, json: async () => ({ ok: true, data: null }), }; - }); + }) as any; const client = await import("../api/client.js"); const result = await client.updateAssetTags(7, ["local"]); expect(result.ok).toBe(true); - const tagCall = globalThis.fetch.mock.calls.find(([url]) => + const tagCall = (globalThis.fetch as any).mock.calls.find(([url]) => String(url).includes("/mjr/am/asset/tags"), ); expect(readHeader(tagCall?.[1]?.headers, "X-MJR-Token")).toBe(token); @@ -326,7 +326,7 @@ describe("api client request deduplication", () => { headers: { get: (name) => (name === "content-type" ? "application/json" : null) }, json: async () => ({ ok: true, data: null }), }; - }); + }) as any; const client = await import("../api/client.js"); client.setRuntimeSecurityToken(staleToken); diff --git a/ui/tests/asset_card_inner.vitest.ts b/ui/tests/asset_card_inner.vitest.ts index 20ff0df8..2d7f02cd 100644 --- a/ui/tests/asset_card_inner.vitest.ts +++ b/ui/tests/asset_card_inner.vitest.ts @@ -24,19 +24,13 @@ const buttonStub = { function assetCardGlobal(overrides = {}) { return { provide: {}, - stubs: { - MButton: true, - RatingBadge: true, - TagsBadge: true, - GenTimeBadge: true, - }, ...overrides, stubs: { MButton: true, RatingBadge: true, TagsBadge: true, GenTimeBadge: true, - ...(overrides.stubs || {}), + ...((overrides as any).stubs || {}), }, }; } @@ -155,7 +149,7 @@ describe("AssetCardInner media display", () => { await Promise.resolve(); const video = wrapper.find("video.mjr-thumb-media").element; - expect(video.getAttribute("src") || video.src).toContain("/api/assets/clip-no-poster"); + expect(video.getAttribute("src") || (video as any).src).toContain("/api/assets/clip-no-poster"); }); it("releases and replaces the video source when a virtualized card changes asset", async () => { @@ -190,7 +184,7 @@ describe("AssetCardInner media display", () => { const video = wrapper.find("video.mjr-thumb-media").element; expect(MediaBlobCache.releaseUrl).toHaveBeenCalledWith("/api/assets/old"); - expect(video.getAttribute("src") || video.src).toContain("blob:new-video"); + expect(video.getAttribute("src") || (video as any).src).toContain("blob:new-video"); wrapper.unmount(); }); @@ -295,7 +289,7 @@ describe("AssetCardInner media display", () => { const actions = wrapper .emitted("workflow-action") - ?.map((eventArgs) => String(eventArgs?.[0]?.type || "")); + ?.map((eventArgs) => String((eventArgs?.[0] as any)?.type || "")); expect(actions).toEqual(["favorite"]); expect(buttons[0].classes()).toContain("is-active"); }); diff --git a/ui/tests/assets_grid_host_state.vitest.ts b/ui/tests/assets_grid_host_state.vitest.ts index faef38d3..ba4d6ec1 100644 --- a/ui/tests/assets_grid_host_state.vitest.ts +++ b/ui/tests/assets_grid_host_state.vitest.ts @@ -10,10 +10,10 @@ import { function createFakeElement() { const el = new EventTarget(); - el.dataset = {}; - el.scrollTop = 0; - el.scrollLeft = 0; - el.querySelector = vi.fn(() => null); + (el as any).dataset = {}; + (el as any).scrollTop = 0; + (el as any).scrollLeft = 0; + (el as any).querySelector = vi.fn(() => null); return el; } @@ -23,14 +23,14 @@ describe("assetsGridHostState", () => { vi.restoreAllMocks(); globalThis.CustomEvent = globalThis.CustomEvent || - class extends Event { + (class extends Event { constructor(type, init = {}) { super(type); - this.detail = init.detail; + (this as any).detail = (init as any).detail; } - }; + } as any); globalThis.requestAnimationFrame = (callback) => { - callback(); + (callback as any)(); return 1; }; globalThis.cancelAnimationFrame = () => {}; @@ -39,7 +39,7 @@ describe("assetsGridHostState", () => { it("syncs scroll, stats, and selection into the panel store", () => { const panelStore = usePanelStore(); const gridWrapper = createFakeElement(); - gridWrapper.scrollTop = 91; + (gridWrapper as any).scrollTop = 91; const disposeScroll = installGridScrollSync(gridWrapper, panelStore); gridWrapper.dispatchEvent(new Event("scroll")); @@ -85,8 +85,8 @@ describe("assetsGridHostState", () => { const gridWrapper = createFakeElement(); const gridContainer = createFakeElement(); - gridContainer._mjrSetSelection = vi.fn(); - gridContainer._mjrScrollToAssetId = vi.fn(); + (gridContainer as any)._mjrSetSelection = vi.fn(); + (gridContainer as any)._mjrScrollToAssetId = vi.fn(); const onRestoreSidebar = vi.fn(); @@ -98,12 +98,15 @@ describe("assetsGridHostState", () => { onRestoreSidebar, }); - expect(gridWrapper.scrollTop).toBe(33); - expect(gridContainer._mjrSetSelection).toHaveBeenCalledWith(["asset-7"], "asset-7"); + expect((gridWrapper as any).scrollTop).toBe(33); + expect((gridContainer as any)._mjrSetSelection).toHaveBeenCalledWith( + ["asset-7"], + "asset-7", + ); // scrollToAssetId is now always called so the selected card is scrolled into // view even when a saved scrollTop was restored (align:"auto" keeps the view // stable when the card is already visible). - expect(gridContainer._mjrScrollToAssetId).toHaveBeenCalledWith("asset-7"); + expect((gridContainer as any)._mjrScrollToAssetId).toHaveBeenCalledWith("asset-7"); expect(onRestoreSidebar).toHaveBeenCalledTimes(1); }); }); diff --git a/ui/tests/audio_visualizer.vitest.ts b/ui/tests/audio_visualizer.vitest.ts index 0804c306..36465698 100644 --- a/ui/tests/audio_visualizer.vitest.ts +++ b/ui/tests/audio_visualizer.vitest.ts @@ -48,7 +48,7 @@ describe("audio visualizer modes", () => { devicePixelRatio: 1, addEventListener: vi.fn(), removeEventListener: vi.fn(), - }; + } as any; APP_CONFIG.VIEWER_DISABLE_WEBGL_AUDIO = false; }); diff --git a/ui/tests/auth_refresh_race.vitest.ts b/ui/tests/auth_refresh_race.vitest.ts index 13d24717..968d2be8 100644 --- a/ui/tests/auth_refresh_race.vitest.ts +++ b/ui/tests/auth_refresh_race.vitest.ts @@ -29,20 +29,20 @@ function makeStorage() { beforeEach(() => { vi.resetModules(); - globalThis.localStorage = makeStorage(); - globalThis.sessionStorage = makeStorage(); + globalThis.localStorage = makeStorage() as any; + globalThis.sessionStorage = makeStorage() as any; globalThis.window = { addEventListener: vi.fn(), removeEventListener: vi.fn(), dispatchEvent: vi.fn(), - location: { origin: "http://localhost" }, - }; + location: { origin: "http://localhost" } as any, + } as any; globalThis.CustomEvent = class { constructor(type, init) { - this.type = type; - this.detail = init?.detail; + (this as any).type = type; + (this as any).detail = init?.detail; } - }; + } as any; globalThis.app = { extensionManager: { toast: { add: vi.fn() } } }; }); @@ -82,7 +82,7 @@ describe("concurrent auth bootstrap", () => { ? { ok: true, data: { asset_id: 1 } } : { ok: false, code: "AUTH_REQUIRED", error: "no token" }, }; - }); + }) as any; const { default: client } = await import("../api/client.js") .then((m) => ({ default: m })) @@ -107,7 +107,7 @@ describe("concurrent auth bootstrap", () => { // Still only one bootstrap call total expect(bootstrapCalls).toBe(1); - const sentTokens = globalThis.fetch.mock.calls + const sentTokens = (globalThis.fetch as any).mock.calls .filter(([url]) => String(url).includes("/asset/rating")) .map(([_url, options]) => options?.headers?.get?.("X-MJR-Token")); expect(sentTokens).toContain("race_token_abc"); @@ -131,7 +131,7 @@ describe("concurrent auth bootstrap", () => { headers: { get: (n) => (n === "content-type" ? "application/json" : null) }, json: async () => ({ ok: false, code: "AUTH_REQUIRED", error: "no token" }), }; - }); + }) as any; const c = await import("../api/client.js"); @@ -163,7 +163,7 @@ describe("concurrent tag writes", () => { status: 200, headers: { get: (n) => (n === "content-type" ? "application/json" : null) }, json: async () => ({ ok: true, data: { tags: [] } }), - })); + })) as any; const c = await import("../api/client.js"); c.setRuntimeSecurityToken(token); @@ -175,7 +175,7 @@ describe("concurrent tag writes", () => { ]); // POST requests are not deduplicated — 3 writes = 3 fetch calls - const tagCalls = globalThis.fetch.mock.calls.filter(([url]) => + const tagCalls = (globalThis.fetch as any).mock.calls.filter(([url]) => String(url).includes("/asset/tags"), ); expect(tagCalls).toHaveLength(3); diff --git a/ui/tests/browser_navigation_controller.vitest.ts b/ui/tests/browser_navigation_controller.vitest.ts index efea06bf..0d8500d5 100644 --- a/ui/tests/browser_navigation_controller.vitest.ts +++ b/ui/tests/browser_navigation_controller.vitest.ts @@ -48,10 +48,10 @@ function createNode() { describe("browserNavigationController", () => { it("syncs navigated folder path into Pinia", async () => { - globalThis.window = { addEventListener: vi.fn(), removeEventListener: vi.fn() }; + globalThis.window = { addEventListener: vi.fn(), removeEventListener: vi.fn() } as any; globalThis.document = { - createElement: () => createNode(), - }; + createElement: () => createNode() as any, + } as any; setActivePinia(createPinia()); const panelStore = usePanelStore(); @@ -85,7 +85,7 @@ describe("browserNavigationController", () => { }); expect(panelStore.currentFolderRelativePath).toBe("animals/cats"); - expect(gridContainer.dataset.mjrSubfolder).toBe("animals/cats"); + expect((gridContainer.dataset as any).mjrSubfolder).toBe("animals/cats"); expect(reloadGrid).toHaveBeenCalledTimes(1); expect(onContextChanged).toHaveBeenCalledTimes(1); expect(folderBreadcrumbController.setFolderBreadcrumb).toHaveBeenCalledWith( diff --git a/ui/tests/browser_perf_extended.vitest.ts b/ui/tests/browser_perf_extended.vitest.ts index 2883d06b..9ff96ead 100644 --- a/ui/tests/browser_perf_extended.vitest.ts +++ b/ui/tests/browser_perf_extended.vitest.ts @@ -29,15 +29,15 @@ function elapsed(fn) { /** Build a synthetic asset. */ function makeAsset(overrides = {}) { return { - id: overrides.id ?? Math.random().toString(36).slice(2), - filename: overrides.filename ?? "image.png", - kind: overrides.kind ?? "image", - mtime: overrides.mtime ?? Date.now(), - size: overrides.size ?? 1024, - has_generation_data: overrides.has_generation_data ?? 0, - subfolder: overrides.subfolder ?? "", - source: overrides.source ?? "output", - root_id: overrides.root_id ?? "root1", + id: (overrides as any).id ?? Math.random().toString(36).slice(2), + filename: (overrides as any).filename ?? "image.png", + kind: (overrides as any).kind ?? "image", + mtime: (overrides as any).mtime ?? Date.now(), + size: (overrides as any).size ?? 1024, + has_generation_data: (overrides as any).has_generation_data ?? 0, + subfolder: (overrides as any).subfolder ?? "", + source: (overrides as any).source ?? "output", + root_id: (overrides as any).root_id ?? "root1", ...overrides, }; } @@ -320,7 +320,7 @@ describe("imagePreloader – deduplication and cache eviction", () => { preloadImageForAsset(asset, "/view/dup-1.png"); // Only one key should be stored - expect(state._preloadedAssetKeys?.size).toBe(1); + expect((state as any)._preloadedAssetKeys?.size).toBe(1); }); it("clears cache after 250-item limit", async () => { @@ -332,7 +332,7 @@ describe("imagePreloader – deduplication and cache eviction", () => { preloadImageForAsset(asset, `/view/asset-${i}.png`); } // After clear the set is small (only items added since last clear) - expect(state._preloadedAssetKeys?.size).toBeLessThan(20); + expect((state as any)._preloadedAssetKeys?.size).toBeLessThan(20); }); it("ignores non-image assets", async () => { @@ -340,7 +340,7 @@ describe("imagePreloader – deduplication and cache eviction", () => { const { preloadImageForAsset } = await makePreloader(state); const video = makeAsset({ id: "v1", kind: "video", filename: "clip.mp4" }); preloadImageForAsset(video, "/view/v1.mp4"); - expect(state._preloadedAssetKeys?.size ?? 0).toBe(0); + expect((state as any)._preloadedAssetKeys?.size ?? 0).toBe(0); }); it("preloadAdjacentAssets skips out-of-bounds indices", async () => { @@ -349,7 +349,7 @@ describe("imagePreloader – deduplication and cache eviction", () => { const assets = [makeAsset({ id: "only", kind: "image" })]; preloadAdjacentAssets(assets, 0); // ±3 would go -3…+3 → all OOB except 0 // The center itself is NOT preloaded (only adjacents) - expect(state._preloadedAssetKeys?.size ?? 0).toBe(0); + expect((state as any)._preloadedAssetKeys?.size ?? 0).toBe(0); }); it("preloadAdjacentAssets preloads ±3 neighbours from a large list", async () => { @@ -360,7 +360,7 @@ describe("imagePreloader – deduplication and cache eviction", () => { ); preloadAdjacentAssets(assets, 10); // Expected: indices 7,8,9,11,12,13 → 6 assets - expect(state._preloadedAssetKeys?.size).toBe(6); + expect((state as any)._preloadedAssetKeys?.size).toBe(6); }); it("preloads 300 unique assets under 100 ms", async () => { @@ -398,7 +398,7 @@ describe("viewer/keyboard – rapid keydown dispatch", () => { makeAsset({ id: "k2", kind: "image" }), ], currentIndex: 0, - ...overrides.state, + ...(overrides as any).state, }; const VIEWER_MODES = { SINGLE: "SINGLE" }; const navigateCalls = []; diff --git a/ui/tests/client_auth_token.vitest.ts b/ui/tests/client_auth_token.vitest.ts index d9b91209..777b4512 100644 --- a/ui/tests/client_auth_token.vitest.ts +++ b/ui/tests/client_auth_token.vitest.ts @@ -33,25 +33,25 @@ async function loadAuth() { beforeEach(() => { vi.resetModules(); - globalThis.localStorage = makeStorage(); - globalThis.sessionStorage = makeStorage(); + globalThis.localStorage = makeStorage() as any; + globalThis.sessionStorage = makeStorage() as any; globalThis.window = { addEventListener: vi.fn(), removeEventListener: vi.fn(), dispatchEvent: vi.fn(), - location: { origin: "http://localhost" }, - }; + location: { origin: "http://localhost" } as any, + } as any; globalThis.CustomEvent = class { constructor(type, init) { - this.type = type; - this.detail = init?.detail; + (this as any).type = type; + (this as any).detail = init?.detail; } - }; + } as any; globalThis.fetch = vi.fn(async () => ({ status: 200, headers: { get: (name) => (name === "content-type" ? "application/json" : null) }, json: async () => ({ ok: true, data: {} }), - })); + })) as any; globalThis.app = { extensionManager: { toast: { add: vi.fn() } } }; }); @@ -145,7 +145,7 @@ describe("ensureWriteAuthToken with force=true clears stale runtime token", () = headers: { get: (name) => (name === "content-type" ? "application/json" : null) }, json: async () => ({ ok: true, data: null }), }; - }); + }) as any; const { ensureWriteAuthToken, setRuntimeSecurityToken, readAuthToken } = await loadAuth(); setRuntimeSecurityToken("stale_token"); diff --git a/ui/tests/comfy_api_bridge.vitest.ts b/ui/tests/comfy_api_bridge.vitest.ts index 8aa86a97..86aff600 100644 --- a/ui/tests/comfy_api_bridge.vitest.ts +++ b/ui/tests/comfy_api_bridge.vitest.ts @@ -2,8 +2,8 @@ import { beforeEach, describe, expect, it, vi } from "vitest"; beforeEach(() => { vi.resetModules(); - globalThis.window = {}; - globalThis.globalThis = globalThis; + globalThis.window = {} as any; + (globalThis as any).globalThis = globalThis; }); describe("comfyApiBridge", () => { @@ -231,7 +231,7 @@ describe("comfyApiBridge", () => { it("prefers ComfyUI api.fetchApi for HTTP calls and falls back to same-origin fetch", async () => { const fetchApi = vi.fn(() => Promise.resolve({ ok: true, source: "comfy" })); const fallbackFetch = vi.fn(() => Promise.resolve({ ok: true, source: "fallback" })); - globalThis.fetch = fallbackFetch; + globalThis.fetch = fallbackFetch as any; const mod = await import("../app/comfyApiBridge.js"); mod.setComfyApi({ fetchApi }); diff --git a/ui/tests/custom_roots_controller.vitest.ts b/ui/tests/custom_roots_controller.vitest.ts index e975352b..fbea64c3 100644 --- a/ui/tests/custom_roots_controller.vitest.ts +++ b/ui/tests/custom_roots_controller.vitest.ts @@ -6,59 +6,59 @@ import { usePanelStore } from "../stores/usePanelStore.js"; class SelectStub { constructor() { - this._innerHTML = ""; - this.value = ""; - this.disabled = false; - this.listeners = new Map(); - this.options = []; - this.selectedIndex = -1; + (this as any)._innerHTML = ""; + (this as any).value = ""; + (this as any).disabled = false; + (this as any).listeners = new Map(); + (this as any).options = []; + (this as any).selectedIndex = -1; } set innerHTML(value) { - this._innerHTML = value; - this.options = []; - this.selectedIndex = -1; + (this as any)._innerHTML = value; + (this as any).options = []; + (this as any).selectedIndex = -1; } get innerHTML() { - return this._innerHTML; + return (this as any)._innerHTML; } appendChild(option) { - this.options.push(option); - if (this.selectedIndex < 0) this.selectedIndex = 0; + (this as any).options.push(option); + if ((this as any).selectedIndex < 0) (this as any).selectedIndex = 0; return option; } querySelector(selector) { if (selector === 'option[value=""]') { - return this.options.find((option) => option.value === "") || null; + return (this as any).options.find((option) => option.value === "") || null; } return null; } addEventListener(type, handler) { - const list = this.listeners.get(type) || []; + const list = (this as any).listeners.get(type) || []; list.push(handler); - this.listeners.set(type, list); + (this as any).listeners.set(type, list); } removeEventListener(type, handler) { - const list = this.listeners.get(type) || []; - this.listeners.set( + const list = (this as any).listeners.get(type) || []; + (this as any).listeners.set( type, list.filter((item) => item !== handler), ); } dispatchEvent(event) { - for (const handler of this.listeners.get(event.type) || []) { + for (const handler of (this as any).listeners.get(event.type) || []) { handler(event); } } get selectedOptions() { - const selected = this.options[this.selectedIndex]; + const selected = (this as any).options[(this as any).selectedIndex]; return selected ? [selected] : []; } } @@ -66,18 +66,19 @@ class SelectStub { describe("customRootsController", () => { it("syncs the selected custom root into Pinia", async () => { globalThis.document = { - createElement: () => ({ - value: "", - textContent: "", - get text() { - return this.textContent; - }, - set text(value) { - this.textContent = value; - }, - disabled: false, - }), - }; + createElement: () => + ({ + value: "", + textContent: "", + get text() { + return this.textContent; + }, + set text(value) { + this.textContent = value; + }, + disabled: false, + }) as any, + } as any; setActivePinia(createPinia()); const panelStore = usePanelStore(); @@ -131,8 +132,8 @@ describe("customRootsController", () => { customRemoveBtn, }); - customSelect.value = "root-b"; - customSelect.selectedIndex = 2; + (customSelect as any).value = "root-b"; + (customSelect as any).selectedIndex = 2; await customSelect.dispatchEvent({ type: "change" }); expect(panelStore.customRootId).toBe("root-b"); diff --git a/ui/tests/dialog_templates.vitest.ts b/ui/tests/dialog_templates.vitest.ts index a328d3c8..64b525f2 100644 --- a/ui/tests/dialog_templates.vitest.ts +++ b/ui/tests/dialog_templates.vitest.ts @@ -21,10 +21,14 @@ beforeEach(() => { confirm: vi.fn(() => true), prompt: vi.fn(() => "fallback"), alert: vi.fn(), - }; + } as any; globalThis.document = { - createElement: vi.fn(() => ({ style: {}, appendChild: vi.fn(), setAttribute: vi.fn() })), - }; + createElement: vi.fn(() => ({ + style: {}, + appendChild: vi.fn(), + setAttribute: vi.fn(), + })) as any, + } as any; }); describe("DialogTemplates", () => { diff --git a/ui/tests/dialogs.vitest.ts b/ui/tests/dialogs.vitest.ts index 21d0f632..59e83656 100644 --- a/ui/tests/dialogs.vitest.ts +++ b/ui/tests/dialogs.vitest.ts @@ -24,10 +24,14 @@ beforeEach(() => { confirm: vi.fn(() => true), prompt: vi.fn(() => "fallback"), alert: vi.fn(), - }; + } as any; globalThis.document = { - createElement: vi.fn(() => ({ style: {}, appendChild: vi.fn(), setAttribute: vi.fn() })), - }; + createElement: vi.fn(() => ({ + style: {}, + appendChild: vi.fn(), + setAttribute: vi.fn(), + })) as any, + } as any; }); describe("dialogs", () => { diff --git a/ui/tests/dnd_model3d.vitest.ts b/ui/tests/dnd_model3d.vitest.ts index aed580d7..a2113d09 100644 --- a/ui/tests/dnd_model3d.vitest.ts +++ b/ui/tests/dnd_model3d.vitest.ts @@ -69,7 +69,7 @@ describe("3D drag and drop support", () => { const picked = pickBestMediaPathWidget(node, { kind: "model3d" }, "glb"); expect(picked).toBe(modelPath); - expect(modelPath.__mjrModel3DPickScore).toBeGreaterThan(0); + expect((modelPath as any).__mjrModel3DPickScore).toBeGreaterThan(0); }); it("prefers image-oriented widgets when dropping an image asset on a LoadImage node", () => { @@ -88,7 +88,7 @@ describe("3D drag and drop support", () => { const picked = pickBestMediaPathWidget(node, { kind: "image" }, "png"); expect(picked).toBe(imagePath); - expect(imagePath.__mjrImagePickScore).toBeGreaterThan(0); + expect((imagePath as any).__mjrImagePickScore).toBeGreaterThan(0); }); it("rejects button and hidden callback widgets when picking a path target", () => { @@ -117,7 +117,7 @@ describe("3D drag and drop support", () => { const picked = pickBestMediaPathWidget(node, { kind: "image" }, "png"); expect(picked).toBe(imagePath); - expect(buttonWidget.__mjrImagePickScore).toBeUndefined(); - expect(hiddenWidget.__mjrImagePickScore).toBeUndefined(); + expect((buttonWidget as any).__mjrImagePickScore).toBeUndefined(); + expect((hiddenWidget as any).__mjrImagePickScore).toBeUndefined(); }); }); diff --git a/ui/tests/drag_drop_canvas.vitest.ts b/ui/tests/drag_drop_canvas.vitest.ts index bd9a677f..2f8264c0 100644 --- a/ui/tests/drag_drop_canvas.vitest.ts +++ b/ui/tests/drag_drop_canvas.vitest.ts @@ -132,7 +132,7 @@ describe("canvas drag/drop loader creation", () => { }; const container = { _mjrGetSelectedAssets: () => [] }; - createAssetDragStartHandler(container)(makeDragStartEvent(card, dataTransfer)); + createAssetDragStartHandler((container as any))((makeDragStartEvent(card, dataTransfer) as any)); expect(JSON.parse(data.get("application/x-mjr-asset"))).toMatchObject({ filename: "clip.mp4", @@ -179,7 +179,7 @@ describe("canvas drag/drop loader creation", () => { }; const container = { _mjrGetSelectedAssets: () => [] }; - createAssetDragStartHandler(container)(makeDragStartEvent(card, dataTransfer)); + createAssetDragStartHandler((container as any))((makeDragStartEvent(card, dataTransfer) as any)); expect(JSON.parse(data.get("application/x-mjr-asset"))).toMatchObject({ filename: "ComfyUI_00690_.png", @@ -223,7 +223,7 @@ describe("canvas drag/drop loader creation", () => { }; const container = { _mjrGetSelectedAssets: () => [] }; - createAssetDragStartHandler(container)(makeDragStartEvent(card, dataTransfer)); + createAssetDragStartHandler((container as any))((makeDragStartEvent(card, dataTransfer) as any)); expect(sanitizeDraggedPayload({ filename: "preview.png", type: "temp" })).toMatchObject({ filename: "preview.png", @@ -269,7 +269,7 @@ describe("canvas drag/drop loader creation", () => { expect(app.loadGraphData).not.toHaveBeenCalled(); expect(globalThis.LiteGraph.createNode).toHaveBeenCalledWith("LoadImage"); expect(app.graph.add).toHaveBeenCalledWith(createdNode); - expect(createdNode.pos).toEqual([120, 80]); + expect((createdNode as any).pos).toEqual([120, 80]); expect(createdNode.widgets[0].value).toBe("assets/one.png"); }); @@ -382,7 +382,7 @@ describe("canvas drag/drop loader creation", () => { addEventListener: vi.fn(), }; - createAssetDragStartHandler({ _mjrGetSelectedAssets: () => [] })(makeDragStartEvent(card, dataTransfer)); + createAssetDragStartHandler({ _mjrGetSelectedAssets: () => [] } as any)((makeDragStartEvent(card, dataTransfer) as any)); const payload = JSON.parse(data.get("application/x-mjr-asset")); const handlers = createDragDropRuntimeHandlers(); await handlers.onDrop(makeDropEvent(payload)); @@ -431,7 +431,7 @@ describe("canvas drag/drop loader creation", () => { }); expect(created).toBe(1); - expect(createdNode.pos).toEqual([100, 100]); + expect((createdNode as any).pos).toEqual([100, 100]); }); it("L+drop creates loader nodes for the current multi-selection", async () => { @@ -446,7 +446,7 @@ describe("canvas drag/drop loader creation", () => { return node; }), }); - window.__MJR_LAST_SELECTION_GRID__ = { + (window as any).__MJR_LAST_SELECTION_GRID__ = { _mjrGetSelectedAssets: () => [ { filename: "one.png", type: "output", kind: "image" }, { filename: "two.png", type: "output", kind: "image" }, diff --git a/ui/tests/drag_out.vitest.ts b/ui/tests/drag_out.vitest.ts index 5df82355..518eb7dd 100644 --- a/ui/tests/drag_out.vitest.ts +++ b/ui/tests/drag_out.vitest.ts @@ -46,9 +46,9 @@ describe("drag-out to OS", () => { { id: "a", filename: "one.png", subfolder: "", type: "output" }, { id: "b", filename: "two.png", subfolder: "set", type: "output" }, ]; - container.dataset.mjrSelectedAssetIds = JSON.stringify(["a", "b"]); + (container.dataset as any).mjrSelectedAssetIds = JSON.stringify(["a", "b"]); container._mjrGetAssets = () => assets; - card.dataset.mjrAssetId = "a"; + (card.dataset as any).mjrAssetId = "a"; const dt = makeDataTransfer(); applyDragOutToOS({ @@ -147,9 +147,9 @@ describe("drag-out to OS", () => { const container = { dataset: {}, _mjrGetAssets: null }; const card = { dataset: {} }; const asset = { id: "a", filename: "one.png", type: "output" }; - container.dataset.mjrSelectedAssetIds = JSON.stringify(["b", "c"]); + (container.dataset as any).mjrSelectedAssetIds = JSON.stringify(["b", "c"]); container._mjrGetAssets = () => [asset]; - card.dataset.mjrAssetId = "a"; + (card.dataset as any).mjrAssetId = "a"; const dt = makeDataTransfer(); applyDragOutToOS({ diff --git a/ui/tests/entry_debug_api.vitest.ts b/ui/tests/entry_debug_api.vitest.ts index 539fc15d..cfa52e82 100644 --- a/ui/tests/entry_debug_api.vitest.ts +++ b/ui/tests/entry_debug_api.vitest.ts @@ -7,7 +7,7 @@ vi.mock("../features/viewer/nodeStream/nodeStreamFeatureFlag.js", () => ({ describe("entryDebugApi", () => { beforeEach(() => { vi.resetModules(); - globalThis.window = {}; + globalThis.window = {} as any; }); afterEach(() => { @@ -23,10 +23,10 @@ describe("entryDebugApi", () => { const { exposeDebugApis } = await import("../features/runtime/entryDebugApi.js"); exposeDebugApis({ resolveNodeStreamModule }); - expect(window.MajoorNodeStream.mode).toBe("selection-only"); - expect(window.MajoorNodeStream.registerAdapter).toBeUndefined(); - expect(window.MajoorNodeStream.createAdapter).toBeUndefined(); - await expect(window.MajoorNodeStream.listAdapters()).resolves.toEqual([ + expect((window as any).MajoorNodeStream.mode).toBe("selection-only"); + expect((window as any).MajoorNodeStream.registerAdapter).toBeUndefined(); + expect((window as any).MajoorNodeStream.createAdapter).toBeUndefined(); + await expect((window as any).MajoorNodeStream.listAdapters()).resolves.toEqual([ { name: "video-output", priority: 10 }, ]); }); diff --git a/ui/tests/execution_runtime_controller.vitest.ts b/ui/tests/execution_runtime_controller.vitest.ts index 72ee811c..662905ae 100644 --- a/ui/tests/execution_runtime_controller.vitest.ts +++ b/ui/tests/execution_runtime_controller.vitest.ts @@ -8,15 +8,15 @@ describe("createExecutionRuntimeController", () => { if (typeof globalThis.CustomEvent === "undefined") { globalThis.CustomEvent = class CustomEvent { constructor(type, init = {}) { - this.type = type; - this.detail = init.detail; + (this as any).type = type; + (this as any).detail = (init as any).detail; } - }; + } as any; } if (typeof globalThis.window === "undefined") { globalThis.window = { dispatchEvent: () => true, - }; + } as any; } }); diff --git a/ui/tests/fetch_utils.vitest.ts b/ui/tests/fetch_utils.vitest.ts index ce95775a..41a48182 100644 --- a/ui/tests/fetch_utils.vitest.ts +++ b/ui/tests/fetch_utils.vitest.ts @@ -108,7 +108,7 @@ describe("delay()", () => { describe("fetchAPI timeout", () => { it("returns TIMEOUT when the request exceeds timeoutMs", async () => { - globalThis.fetch = makeAbortableFetch(); + globalThis.fetch = makeAbortableFetch() as any; const mod = await importUtils(); const { fetchAPI } = makeClient(mod); @@ -131,7 +131,7 @@ describe("fetchAPI non-JSON response", () => { globalThis.fetch = vi.fn(async () => ({ status: 500, headers: { get: () => "text/plain" }, - })); + })) as any; const mod = await importUtils(); const { fetchAPI } = makeClient(mod); @@ -147,7 +147,7 @@ describe("fetchAPI non-JSON response", () => { status: 200, headers: { get: (name) => (name === "content-type" ? "application/json" : null) }, json: async () => null, - })); + })) as any; const mod = await importUtils(); const { fetchAPI } = makeClient(mod); @@ -164,7 +164,7 @@ describe("fetchAPI non-JSON response", () => { json: async () => { throw new SyntaxError("Unexpected token"); }, - })); + })) as any; const mod = await importUtils(); const { fetchAPI } = makeClient(mod); @@ -185,7 +185,7 @@ describe("fetchAPI non-JSON response", () => { }, }, json: async () => ({ ok: false, code: "INVALID_INPUT", error: "Invalid value" }), - })); + })) as any; const mod = await importUtils(); const { fetchAPI } = makeClient(mod); @@ -215,7 +215,7 @@ describe("fetchAPI retryable HTTP status", () => { ? { ok: false, code: "RATE_LIMIT", error: "Slow down" } : { ok: true, data: { recovered: true } }, }; - }); + }) as any; const mod = await importUtils(); const { get } = makeClient(mod); @@ -229,7 +229,7 @@ describe("fetchAPI retryable HTTP status", () => { globalThis.fetch = makeJsonFetch( { ok: false, code: "SERVICE_UNAVAILABLE", error: "Try later" }, 503, - ); + ) as any; const mod = await importUtils(); const { post } = makeClient(mod); @@ -255,7 +255,7 @@ describe("fetchAPI retry on network error", () => { headers: { get: (name) => (name === "content-type" ? "application/json" : null) }, json: async () => ({ ok: true, data: { retried: true } }), }; - }); + }) as any; const mod = await importUtils(); vi.spyOn(mod, "delay").mockResolvedValue(undefined); @@ -329,7 +329,7 @@ describe("get() request deduplication", () => { const blocker = new Promise((resolve) => { resolveFetch = resolve; }); - globalThis.fetch = vi.fn(() => blocker); + globalThis.fetch = vi.fn(() => blocker) as any; const mod = await importUtils(); const { get } = makeClient(mod); @@ -352,7 +352,7 @@ describe("get() request deduplication", () => { }); it("issues a second fetch after the first completes", async () => { - globalThis.fetch = makeJsonFetch({ ok: true, data: [] }); + globalThis.fetch = makeJsonFetch({ ok: true, data: [] }) as any; const mod = await importUtils(); const { get } = makeClient(mod); @@ -368,7 +368,7 @@ describe("get() request deduplication", () => { const blocker = new Promise((resolve) => { resolveFetch = resolve; }); - globalThis.fetch = vi.fn(() => blocker); + globalThis.fetch = vi.fn(() => blocker) as any; const mod = await importUtils(); const { get } = makeClient(mod); @@ -397,14 +397,14 @@ describe("get() request deduplication", () => { describe("post()", () => { it("sends a JSON body and returns the parsed response", async () => { - globalThis.fetch = makeJsonFetch({ ok: true, data: { created: true } }); + globalThis.fetch = makeJsonFetch({ ok: true, data: { created: true } }) as any; const mod = await importUtils(); const { post } = makeClient(mod); const result = await post("/mjr/am/asset/rating", { rating: 4 }); expect(result.ok).toBe(true); - const [, opts] = globalThis.fetch.mock.calls[0]; + const [, opts] = (globalThis.fetch as any).mock.calls[0]; expect(opts.method).toBe("POST"); expect(JSON.parse(opts.body)).toEqual({ rating: 4 }); expect(readHeader(opts.headers, "Content-Type")).toBe("application/json"); diff --git a/ui/tests/filters_controller.vitest.ts b/ui/tests/filters_controller.vitest.ts index 8f2e0774..f456dbb4 100644 --- a/ui/tests/filters_controller.vitest.ts +++ b/ui/tests/filters_controller.vitest.ts @@ -4,25 +4,25 @@ import { usePanelStore } from "../stores/usePanelStore.js"; class ElementStub { constructor() { - this.value = ""; - this.checked = false; - this.listeners = new Map(); - this.classList = { + (this as any).value = ""; + (this as any).checked = false; + (this as any).listeners = new Map(); + (this as any).classList = { toggle: vi.fn(), }; } addEventListener(type, handler) { const key = String(type); - const handlers = this.listeners.get(key) || []; + const handlers = (this as any).listeners.get(key) || []; handlers.push(handler); - this.listeners.set(key, handlers); + (this as any).listeners.set(key, handlers); } removeEventListener(type, handler) { const key = String(type); - const handlers = this.listeners.get(key) || []; - this.listeners.set( + const handlers = (this as any).listeners.get(key) || []; + (this as any).listeners.set( key, handlers.filter((item) => item !== handler), ); @@ -32,7 +32,7 @@ class ElementStub { const payload = event || {}; payload.type = String(payload.type || ""); payload.target = payload.target || this; - for (const handler of this.listeners.get(payload.type) || []) { + for (const handler of (this as any).listeners.get(payload.type) || []) { handler(payload); } } @@ -76,8 +76,8 @@ describe("filtersController", () => { const minHeightInput = createControl(); const maxWidthInput = createControl(); const maxHeightInput = createControl(); - maxWidthInput.value = "1280"; - maxHeightInput.value = "720"; + (maxWidthInput as any).value = "1280"; + (maxHeightInput as any).value = "720"; const reloadGrid = vi.fn(async () => ({})); const onFiltersChanged = vi.fn(); @@ -104,17 +104,17 @@ describe("filtersController", () => { lifecycleSignal: null, }); - resolutionPresetSelect.value = "fhd"; + (resolutionPresetSelect as any).value = "fhd"; resolutionPresetSelect.dispatchEvent({ type: "change" }); expect(panelStore.minWidth).toBe(1920); expect(panelStore.minHeight).toBe(1080); expect(panelStore.maxWidth).toBe(0); expect(panelStore.maxHeight).toBe(0); - expect(minWidthInput.value).toBe("1920"); - expect(minHeightInput.value).toBe("1080"); - expect(maxWidthInput.value).toBe(""); - expect(maxHeightInput.value).toBe(""); + expect((minWidthInput as any).value).toBe("1920"); + expect((minHeightInput as any).value).toBe("1080"); + expect((maxWidthInput as any).value).toBe(""); + expect((maxHeightInput as any).value).toBe(""); expect(onFiltersChanged).toHaveBeenCalledTimes(1); await vi.advanceTimersByTimeAsync(250); diff --git a/ui/tests/floating_viewer.vitest.ts b/ui/tests/floating_viewer.vitest.ts index 7c016d02..3d7515fc 100644 --- a/ui/tests/floating_viewer.vitest.ts +++ b/ui/tests/floating_viewer.vitest.ts @@ -46,31 +46,31 @@ describe("FloatingViewer", () => { installFollowerVideoSyncMock.mockClear(); globalThis.document = { adoptNode: vi.fn((node) => node), - querySelectorAll: vi.fn(() => []), + querySelectorAll: vi.fn(() => []) as any, documentElement: { className: "", - attributes: [], + attributes: [] as any, style: { cssText: "", setProperty: vi.fn(), - }, - }, + } as any, + } as any, body: { appendChild: vi.fn(), className: "", - attributes: [], + attributes: [] as any, style: { cssText: "", setProperty: vi.fn(), - }, - }, + } as any, + } as any, createElement: vi.fn(() => ({ className: "", setAttribute: vi.fn(), appendChild: vi.fn(), replaceChildren: vi.fn(), - })), - }; + })) as any, + } as any; }); it("rebinds panel interactions when popping back into the main document", async () => { @@ -200,42 +200,42 @@ describe("FloatingViewer", () => { expect(closeBtn.addEventListener).toHaveBeenCalledWith( "click", expect.any(Function), - expect.objectContaining({ signal: viewer._btnAC.signal }), + expect.objectContaining({ signal: (viewer._btnAC as any).signal }), ); expect(modeSelect.addEventListener).toHaveBeenCalledWith( "change", expect.any(Function), - expect.objectContaining({ signal: viewer._btnAC.signal }), + expect.objectContaining({ signal: (viewer._btnAC as any).signal }), ); expect(pinSelect.addEventListener).toHaveBeenCalledWith( "click", expect.any(Function), - expect.objectContaining({ signal: viewer._btnAC.signal }), + expect.objectContaining({ signal: (viewer._btnAC as any).signal }), ); expect(liveBtn.addEventListener).toHaveBeenCalledWith( "click", expect.any(Function), - expect.objectContaining({ signal: viewer._btnAC.signal }), + expect.objectContaining({ signal: (viewer._btnAC as any).signal }), ); expect(previewBtn.addEventListener).toHaveBeenCalledWith( "click", expect.any(Function), - expect.objectContaining({ signal: viewer._btnAC.signal }), + expect.objectContaining({ signal: (viewer._btnAC as any).signal }), ); expect(genBtn.addEventListener).toHaveBeenCalledWith( "click", expect.any(Function), - expect.objectContaining({ signal: viewer._btnAC.signal }), + expect.objectContaining({ signal: (viewer._btnAC as any).signal }), ); expect(popoutBtn.addEventListener).toHaveBeenCalledWith( "click", expect.any(Function), - expect.objectContaining({ signal: viewer._btnAC.signal }), + expect.objectContaining({ signal: (viewer._btnAC as any).signal }), ); expect(captureBtn.addEventListener).toHaveBeenCalledWith( "click", expect.any(Function), - expect.objectContaining({ signal: viewer._btnAC.signal }), + expect.objectContaining({ signal: (viewer._btnAC as any).signal }), ); }); @@ -276,8 +276,8 @@ describe("FloatingViewer", () => { return { overflowY: "auto", overflowX: "hidden" }; } return { overflowY: "visible", overflowX: "visible" }; - }), - }; + }) as any, + } as any; try { FloatingViewer.prototype._initPanZoom.call(viewer, contentEl); @@ -365,17 +365,17 @@ describe("FloatingViewer", () => { constructor(type, init = {}) { super(type, init); Object.defineProperties(this, { - key: { value: init.key || "" }, - code: { value: init.code || "" }, - keyCode: { value: init.keyCode || 0 }, - ctrlKey: { value: Boolean(init.ctrlKey) }, - shiftKey: { value: Boolean(init.shiftKey) }, - altKey: { value: Boolean(init.altKey) }, - metaKey: { value: Boolean(init.metaKey) }, - repeat: { value: Boolean(init.repeat) }, + key: { value: (init as any).key || "" }, + code: { value: (init as any).code || "" }, + keyCode: { value: (init as any).keyCode || 0 }, + ctrlKey: { value: Boolean((init as any).ctrlKey) }, + shiftKey: { value: Boolean((init as any).shiftKey) }, + altKey: { value: Boolean((init as any).altKey) }, + metaKey: { value: Boolean((init as any).metaKey) }, + repeat: { value: Boolean((init as any).repeat) }, }); } - }; + } as any; } if (typeof window.KeyboardEvent !== "function") { window.KeyboardEvent = globalThis.KeyboardEvent; @@ -432,10 +432,10 @@ describe("FloatingViewer", () => { const { FloatingViewer } = await import("../features/viewer/FloatingViewer.js"); const requestWindow = vi.fn(() => Promise.resolve()); - globalThis.window = { - documentPictureInPicture: { requestWindow }, + (globalThis as any).window = { + documentPictureInPicture: { requestWindow } as any, open: vi.fn(), - navigator: { userAgent: "Mozilla/5.0 Code/1.113.0 Electron/39.8.3" }, + navigator: { userAgent: "Mozilla/5.0 Code/1.113.0 Electron/39.8.3" } as any, screenX: 0, screenLeft: 0, screenY: 0, @@ -461,9 +461,9 @@ describe("FloatingViewer", () => { const { FloatingViewer } = await import("../features/viewer/FloatingViewer.js"); const requestWindow = vi.fn(() => new Promise(() => {})); - globalThis.window = { - documentPictureInPicture: { requestWindow }, - process: { versions: { electron: "39.8.3" } }, + (globalThis as any).window = { + documentPictureInPicture: { requestWindow } as any, + process: { versions: { electron: "39.8.3" } as any } as any, open: vi.fn(), screenX: 0, screenLeft: 0, @@ -495,9 +495,9 @@ describe("FloatingViewer", () => { const { FloatingViewer } = await import("../features/viewer/FloatingViewer.js"); const requestWindow = vi.fn(() => new Promise(() => {})); - globalThis.window = { - documentPictureInPicture: { requestWindow }, - navigator: { userAgent: "Mozilla/5.0 Electron/39.8.3 Safari/537.36" }, + (globalThis as any).window = { + documentPictureInPicture: { requestWindow } as any, + navigator: { userAgent: "Mozilla/5.0 Electron/39.8.3 Safari/537.36" } as any, open: vi.fn(), screenX: 0, screenLeft: 0, @@ -529,7 +529,7 @@ describe("FloatingViewer", () => { const { FloatingViewer } = await import("../features/viewer/FloatingViewer.js"); globalThis.window = { - navigator: { userAgent: "Mozilla/5.0 Electron/39.8.3 Safari/537.36" }, + navigator: { userAgent: "Mozilla/5.0 Electron/39.8.3 Safari/537.36" } as any, open: vi.fn(), screenX: 0, screenLeft: 0, @@ -537,7 +537,7 @@ describe("FloatingViewer", () => { screenTop: 0, outerWidth: 1280, outerHeight: 900, - }; + } as any; const viewer = { _isPopped: false, @@ -558,13 +558,13 @@ describe("FloatingViewer", () => { _tryElectronPopupFallback: FloatingViewer.prototype._tryElectronPopupFallback, }; - viewer.element.classList = { add: vi.fn(), remove: vi.fn(), toggle: vi.fn() }; - viewer.element.setAttribute = vi.fn(); - viewer.element.getAttribute = vi.fn(() => null); - viewer.element.removeAttribute = vi.fn(); - viewer.element.style = {}; - viewer.element.parentNode = null; - viewer.element.nextSibling = null; + (viewer.element as any).classList = { add: vi.fn(), remove: vi.fn(), toggle: vi.fn() }; + (viewer.element as any).setAttribute = vi.fn(); + (viewer.element as any).getAttribute = vi.fn(() => null); + (viewer.element as any).removeAttribute = vi.fn(); + (viewer.element as any).style = {}; + (viewer.element as any).parentNode = null; + (viewer.element as any).nextSibling = null; FloatingViewer.prototype.popOut.call(viewer); @@ -581,9 +581,9 @@ describe("FloatingViewer", () => { const { FloatingViewer } = await import("../features/viewer/FloatingViewer.js"); const requestWindow = vi.fn(() => new Promise(() => {})); - globalThis.window = { - documentPictureInPicture: { requestWindow }, - process: { versions: { electron: "39.8.3" } }, + (globalThis as any).window = { + documentPictureInPicture: { requestWindow } as any, + process: { versions: { electron: "39.8.3" } as any } as any, open: vi.fn(() => null), screenX: 0, screenLeft: 0, @@ -622,26 +622,26 @@ describe("FloatingViewer", () => { globalThis.document = { ...globalThis.document, - querySelectorAll: vi.fn(() => []), + querySelectorAll: vi.fn(() => []) as any, documentElement: { className: "comfy-theme dark-mode", - attributes: [{ name: "data-theme", value: "obsidian" }], + attributes: [{ name: "data-theme", value: "obsidian" }] as any, style: { cssText: "--inline-root: 1;", setProperty: vi.fn(), - }, + } as any, lang: "fr", dir: "ltr", - }, + } as any, body: { appendChild: vi.fn(), className: "app-shell", - attributes: [{ name: "data-layout", value: "desktop" }], + attributes: [{ name: "data-layout", value: "desktop" }] as any, style: { cssText: "", setProperty: vi.fn(), - }, - }, + } as any, + } as any, }; globalThis.window = { @@ -666,8 +666,8 @@ describe("FloatingViewer", () => { }[name] || "" ); }, - })), - }; + })) as any, + } as any; const popupDoc = { head: { @@ -796,9 +796,9 @@ describe("FloatingViewer", () => { class HTMLVideoElementMock extends HTMLMediaElementMock {} class HTMLAudioElementMock extends HTMLMediaElementMock {} - globalThis.HTMLMediaElement = HTMLMediaElementMock; - globalThis.HTMLVideoElement = HTMLVideoElementMock; - globalThis.HTMLAudioElement = HTMLAudioElementMock; + globalThis.HTMLMediaElement = HTMLMediaElementMock as any; + globalThis.HTMLVideoElement = HTMLVideoElementMock as any; + globalThis.HTMLAudioElement = HTMLAudioElementMock as any; const play = vi.fn(() => Promise.resolve()); const addEventListener = vi.fn(); diff --git a/ui/tests/floating_viewer_genfields_api.vitest.ts b/ui/tests/floating_viewer_genfields_api.vitest.ts index be612da5..b14d12bd 100644 --- a/ui/tests/floating_viewer_genfields_api.vitest.ts +++ b/ui/tests/floating_viewer_genfields_api.vitest.ts @@ -30,8 +30,8 @@ vi.mock("../features/viewer/nodeStream/nodeStreamFeatureFlag.js", () => ({ vi.mock("../features/viewer/workflowSidebar/WorkflowSidebar.js", () => ({ WorkflowSidebar: class { constructor() { - this.el = document.createElement("div"); - this.isVisible = false; + (this as any).el = document.createElement("div"); + (this as any).isVisible = false; } }, })); @@ -62,8 +62,8 @@ describe("floating viewer gen fields api summary", () => { }, }); - expect(fields.prompt).toBe("girl on a steampunk ship"); - expect(fields.seed).toBe("123"); - expect(fields.model).toBe("API Image-to-Video | Happy Horse | happyhorse-1.0-i2v"); + expect((fields as any).prompt).toBe("girl on a steampunk ship"); + expect((fields as any).seed).toBe("123"); + expect((fields as any).model).toBe("API Image-to-Video | Happy Horse | happyhorse-1.0-i2v"); }); }); diff --git a/ui/tests/floating_viewer_geninfo_overlap.vitest.ts b/ui/tests/floating_viewer_geninfo_overlap.vitest.ts index 611a1da6..9dbe8767 100644 --- a/ui/tests/floating_viewer_geninfo_overlap.vitest.ts +++ b/ui/tests/floating_viewer_geninfo_overlap.vitest.ts @@ -256,7 +256,7 @@ describe("floating viewer geninfo sidebar", () => { }); expect(getAssetMetadata).toHaveBeenCalledWith(10650, {}); - expect(hydrated.metadata_raw.geninfo.positive.value).toBe("real LTX prompt"); - expect(hydrated.metadata_raw.geninfo.seed.value).toBe(0); + expect((hydrated as any).metadata_raw.geninfo.positive.value).toBe("real LTX prompt"); + expect((hydrated as any).metadata_raw.geninfo.seed.value).toBe(0); }); }); diff --git a/ui/tests/floating_viewer_manager.vitest.ts b/ui/tests/floating_viewer_manager.vitest.ts index 03e77b65..07e04ab7 100644 --- a/ui/tests/floating_viewer_manager.vitest.ts +++ b/ui/tests/floating_viewer_manager.vitest.ts @@ -19,80 +19,81 @@ const state = vi.hoisted(() => { class FloatingViewerMock { constructor() { - this._mode = viewerMode; - this._mediaA = null; - this._mediaB = null; - this._pinnedSlots = + (this as any)._mode = viewerMode; + (this as any)._mediaA = null; + (this as any)._mediaB = null; + (this as any)._pinnedSlots = typeof pinnedSlot === "object" && pinnedSlot instanceof Set ? pinnedSlot : pinnedSlot ? new Set([pinnedSlot]) : new Set(); - this._isPopped = viewerPopped; - this.isVisible = false; - this.show = vi.fn(() => { - this.isVisible = true; + (this as any)._isPopped = viewerPopped; + (this as any).isVisible = false; + (this as any).show = vi.fn(() => { + (this as any).isVisible = true; }); - this.hide = vi.fn(() => { - this.isVisible = false; + (this as any).hide = vi.fn(() => { + (this as any).isVisible = false; }); - this.loadMediaA = vi.fn((asset, opts) => { - this._mediaA = asset; - this._lastLoadMediaA = [asset, opts]; + (this as any).loadMediaA = vi.fn((asset, opts) => { + (this as any)._mediaA = asset; + (this as any)._lastLoadMediaA = [asset, opts]; }); - this.loadMediaPair = vi.fn((assetA, assetB) => { - this._mediaA = assetA; - this._mediaB = assetB; - this._lastLoadMediaPair = [assetA, assetB]; + (this as any).loadMediaPair = vi.fn((assetA, assetB) => { + (this as any)._mediaA = assetA; + (this as any)._mediaB = assetB; + (this as any)._lastLoadMediaPair = [assetA, assetB]; }); - this.setMode = vi.fn((mode) => { - this._mode = mode; + (this as any).setMode = vi.fn((mode) => { + (this as any)._mode = mode; }); - this.setLiveActive = vi.fn(); - this.setPreviewActive = vi.fn(); - this.setNodeStreamActive = vi.fn(); - this.setNodeStreamSelection = vi.fn((selection) => { - this._nodeStreamSelection = selection || null; + (this as any).setLiveActive = vi.fn(); + (this as any).setPreviewActive = vi.fn(); + (this as any).setNodeStreamActive = vi.fn(); + (this as any).setNodeStreamSelection = vi.fn((selection) => { + (this as any)._nodeStreamSelection = selection || null; }); - this.loadPreviewBlob = vi.fn(); - this.dispose = vi.fn(() => { - this.isVisible = false; + (this as any).loadPreviewBlob = vi.fn(); + (this as any).dispose = vi.fn(() => { + (this as any).isVisible = false; }); - this._simplePlayerKeydown = vi.fn((event) => { + (this as any)._simplePlayerKeydown = vi.fn((event) => { event.preventDefault?.(); event.stopPropagation?.(); event.stopImmediatePropagation?.(); }); - this._simplePlayer = { - _mjrSimplePlayerHandleKeydown: this._simplePlayerKeydown, + (this as any)._simplePlayer = { + _mjrSimplePlayerHandleKeydown: (this as any)._simplePlayerKeydown, }; - this.element = { + (this as any).element = { isConnected: true, - contains: (target) => target === this._simplePlayer || target?._insideMfv === true, + contains: (target) => + target === (this as any)._simplePlayer || target?._insideMfv === true, querySelector: (selector) => - selector === ".mjr-mfv-simple-player" ? this._simplePlayer : null, + selector === ".mjr-mfv-simple-player" ? (this as any)._simplePlayer : null, }; lastViewer = this; } render() { - return this.element; + return (this as any).element; } get isPopped() { - return this._isPopped; + return (this as any)._isPopped; } getPinnedSlots() { - return this._pinnedSlots; + return (this as any)._pinnedSlots; } popOut = vi.fn(() => { - this._isPopped = true; + (this as any)._isPopped = true; }); popIn = vi.fn(() => { - this._isPopped = false; + (this as any)._isPopped = false; }); } @@ -167,7 +168,7 @@ function createWindowStub() { dispatchEvent(event) { const handlers = Array.from(listeners.get(event?.type) || []); for (const handler of handlers) { - handler(event); + (handler as any)(event); } return true; }, @@ -198,17 +199,17 @@ async function flushAsyncWork() { beforeEach(() => { vi.resetModules(); state.reset(); - globalThis.window = createWindowStub(); + globalThis.window = createWindowStub() as any; globalThis.requestAnimationFrame = (cb) => { - cb(); + (cb as any)(); return 1; }; globalThis.cancelAnimationFrame = vi.fn(); globalThis.document = { body: { appendChild: vi.fn(), - }, - }; + } as any, + } as any; globalThis.app = { canvas: { canvas: { @@ -221,10 +222,10 @@ beforeEach(() => { }; globalThis.CustomEvent = class { constructor(type, init = {}) { - this.type = type; - this.detail = init.detail; + (this as any).type = type; + (this as any).detail = (init as any).detail; } - }; + } as any; }); describe("floatingViewerManager", () => { @@ -391,7 +392,7 @@ describe("floatingViewerManager", () => { APP_CONFIG.MFV_LIVE_AUTO_OPEN = true; const seen = []; window.addEventListener("mjr:mfv-visibility-changed", (event) => { - seen.push(Boolean(event?.detail?.visible)); + seen.push(Boolean((event as any)?.detail?.visible)); }); const { floatingViewerManager } = @@ -531,7 +532,7 @@ describe("floatingViewerManager", () => { const seen = []; const blob = { fake: "blob" }; window.addEventListener("mjr:mfv-visibility-changed", (event) => { - seen.push(Boolean(event?.detail?.visible)); + seen.push(Boolean((event as any)?.detail?.visible)); }); const { floatingViewerManager } = @@ -584,7 +585,7 @@ describe("floatingViewerManager", () => { stopPropagation: vi.fn(), stopImmediatePropagation: vi.fn(), }; - window.dispatchEvent(event); + window.dispatchEvent(event as any); expect(viewer.setLiveActive).toHaveBeenLastCalledWith(false); expect(floatingViewerManager.getLiveActive()).toBe(false); @@ -611,7 +612,7 @@ describe("floatingViewerManager", () => { stopPropagation: vi.fn(), stopImmediatePropagation: vi.fn(), }; - window.dispatchEvent(event); + window.dispatchEvent(event as any); expect(viewer.hide).toHaveBeenCalledTimes(1); expect(viewer.isVisible).toBe(false); @@ -660,7 +661,7 @@ describe("floatingViewerManager", () => { stopPropagation: vi.fn(), stopImmediatePropagation: vi.fn(), }; - window.dispatchEvent(event); + window.dispatchEvent(event as any); expect(viewer.setPreviewActive).toHaveBeenLastCalledWith(false); expect(floatingViewerManager.getPreviewActive()).toBe(false); @@ -692,7 +693,7 @@ describe("floatingViewerManager", () => { stopPropagation: vi.fn(), stopImmediatePropagation: vi.fn(), }; - window.dispatchEvent(event); + window.dispatchEvent(event as any); expect(viewer._simplePlayerKeydown).toHaveBeenCalledWith(event); expect(event.preventDefault).toHaveBeenCalledTimes(1); @@ -776,14 +777,14 @@ describe("floatingViewerManager", () => { floatingViewerManager.close(); - const callsBefore = document.body.appendChild.mock.calls.length; + const callsBefore = (document.body.appendChild as any).mock.calls.length; viewer.element = { isConnected: false }; await floatingViewerManager.open(); await flushAsyncWork(); expect(state.getLastViewer()).toBe(viewer); - expect(document.body.appendChild.mock.calls.length).toBeGreaterThan(callsBefore); + expect((document.body.appendChild as any).mock.calls.length).toBeGreaterThan(callsBefore); }); it("cycles compare modes with C as A/B, side-by-side, then compare off without closing", async () => { @@ -815,7 +816,7 @@ describe("floatingViewerManager", () => { stopPropagation: vi.fn(), stopImmediatePropagation: vi.fn(), }; - window.dispatchEvent(toCompareEvent); + window.dispatchEvent(toCompareEvent as any); await flushAsyncWork(); expect(viewer.setMode).toHaveBeenLastCalledWith("ab"); @@ -835,7 +836,7 @@ describe("floatingViewerManager", () => { stopPropagation: vi.fn(), stopImmediatePropagation: vi.fn(), }; - window.dispatchEvent(toSimpleEvent); + window.dispatchEvent(toSimpleEvent as any); await flushAsyncWork(); expect(viewer.setMode).toHaveBeenLastCalledWith("side"); @@ -852,7 +853,7 @@ describe("floatingViewerManager", () => { stopPropagation: vi.fn(), stopImmediatePropagation: vi.fn(), }; - window.dispatchEvent(toOffEvent); + window.dispatchEvent(toOffEvent as any); await flushAsyncWork(); expect(viewer.setMode).toHaveBeenLastCalledWith("simple"); @@ -890,7 +891,7 @@ it("loads local assets from the grid when opening the viewer", async () => { filepath: "D:/renders/nested/image.png", }; const grid = createGrid([asset.id]); - grid._mjrGetAssets = () => [asset]; + (grid as any)._mjrGetAssets = () => [asset]; state.setActiveGrid(grid); state.getSelectedIdSetMock.mockReturnValue(new Set([asset.id])); const { floatingViewerManager } = await import("../features/viewer/floatingViewerManager.js"); diff --git a/ui/tests/floating_viewer_panel_interactions.vitest.ts b/ui/tests/floating_viewer_panel_interactions.vitest.ts index 73fd6d4f..72b169d9 100644 --- a/ui/tests/floating_viewer_panel_interactions.vitest.ts +++ b/ui/tests/floating_viewer_panel_interactions.vitest.ts @@ -14,7 +14,7 @@ describe("floating viewer panel interactions", () => { const handle = { ownerDocument: { defaultView: { addEventListener: addWindowListener } }, addEventListener: vi.fn((type, handler) => { - if (type === "pointerdown") handle._down = handler; + if (type === "pointerdown") (handle as any)._down = handler; }), setPointerCapture: vi.fn(), releasePointerCapture, @@ -31,10 +31,10 @@ describe("floating viewer panel interactions", () => { _getResizeDirectionFromPoint: () => "", }; - globalThis.window = { innerWidth: 800, innerHeight: 600 }; + globalThis.window = { innerWidth: 800, innerHeight: 600 } as any; - initFloatingViewerDrag(viewer, handle); - handle._down({ + initFloatingViewerDrag(viewer, handle as any); + (handle as any)._down({ button: 0, pointerId: 7, clientX: 50, @@ -50,8 +50,8 @@ describe("floating viewer panel interactions", () => { ); windowListeners.get("pointermove")({ clientX: 150, clientY: 180 }); - expect(el.style.left).toBe("130px"); - expect(el.style.top).toBe("160px"); + expect((el.style as any).left).toBe("130px"); + expect((el.style as any).top).toBe("160px"); windowListeners.get("pointerup")({}); expect(releasePointerCapture).toHaveBeenCalledWith(7); @@ -106,17 +106,17 @@ describe("floating viewer panel interactions", () => { }), }; const addElementListener = vi.fn((type, handler) => { - if (type === "pointerdown") element._down = handler; + if (type === "pointerdown") (element as any)._down = handler; }); - element.addEventListener = addElementListener; + (element as any).addEventListener = addElementListener; globalThis.window = { innerWidth: 1000, innerHeight: 800, - getComputedStyle: () => ({ minWidth: "120", minHeight: "100" }), - }; + getComputedStyle: () => ({ minWidth: "120", minHeight: "100" }) as any, + } as any; - initFloatingViewerEdgeResize(viewer, element); - element._down({ + initFloatingViewerEdgeResize(viewer, element as any); + (element as any)._down({ button: 0, pointerId: 11, clientX: 298, @@ -131,8 +131,8 @@ describe("floating viewer panel interactions", () => { expect.objectContaining({ signal: expect.any(AbortSignal) }), ); windowListeners.get("pointermove")({ pointerId: 11, clientX: 348, clientY: 288 }); - expect(element.style.width).toBe("250px"); - expect(element.style.height).toBe("190px"); + expect((element.style as any).width).toBe("250px"); + expect((element.style as any).height).toBe("190px"); }); it("does not steal clicks from toolbar buttons near a resize edge", () => { @@ -162,19 +162,19 @@ describe("floating viewer panel interactions", () => { _stopEdgeResize: vi.fn(), }; const addElementListener = vi.fn((type, handler) => { - if (type === "pointerdown") element._down = handler; + if (type === "pointerdown") (element as any)._down = handler; }); - element.addEventListener = addElementListener; + (element as any).addEventListener = addElementListener; globalThis.window = { innerWidth: 1000, innerHeight: 800, - getComputedStyle: () => ({ minWidth: "120", minHeight: "100" }), - }; + getComputedStyle: () => ({ minWidth: "120", minHeight: "100" }) as any, + } as any; const preventDefault = vi.fn(); const stopPropagation = vi.fn(); - initFloatingViewerEdgeResize(viewer, element); - element._down({ + initFloatingViewerEdgeResize(viewer, element as any); + (element as any)._down({ button: 0, pointerId: 12, clientX: 101, diff --git a/ui/tests/floating_viewer_progress.vitest.ts b/ui/tests/floating_viewer_progress.vitest.ts index 298e1d6c..bf72da8a 100644 --- a/ui/tests/floating_viewer_progress.vitest.ts +++ b/ui/tests/floating_viewer_progress.vitest.ts @@ -1,4 +1,4 @@ -import { beforeEach, describe, expect, it } from "vitest"; +import { beforeEach, describe, expect, it, vi } from "vitest"; import { FloatingViewerProgressService, @@ -10,14 +10,30 @@ function ensureCustomEventShim() { globalThis.CustomEvent = class CustomEvent extends Event { constructor(type, init = {}) { super(type); - this.detail = init.detail; + (this as any).detail = (init as any).detail; } - }; + } as any; } +const flush = () => new Promise((resolve) => setTimeout(resolve, 0)); + +/** + * Mimics ComfyUI's read-only `/queue` and `/history/{id}` endpoints. The + * service must learn the prompt graph from these, never by wrapping + * `api.queuePrompt`. + */ class FakeApi extends EventTarget { - async queuePrompt(_index, _prompt) { - return { prompt_id: "prompt-1" }; + queue: Record = { queue_running: [], queue_pending: [] }; + history: Record = {}; + queuePrompt = vi.fn(); + + run(promptId: string, output: Record) { + this.queue.queue_running = [[0, promptId, output, {}, []]]; + } + + async fetchApi(route: string) { + const json = route === "/queue" ? this.queue : this.history; + return { ok: true, json: async () => json }; } } @@ -42,11 +58,9 @@ describe("floating viewer progress service", () => { await service.ensureInitialized({ api }); - await api.queuePrompt(0, { - output: { - 1: { class_type: "KSampler", _meta: { title: "KSampler" } }, - 2: { class_type: "SaveImage" }, - }, + api.run("prompt-1", { + 1: { class_type: "KSampler", _meta: { title: "KSampler" } }, + 2: { class_type: "SaveImage" }, }); api.dispatchEvent( new CustomEvent("status", { @@ -58,6 +72,7 @@ describe("floating viewer progress service", () => { detail: { prompt_id: "prompt-1" }, }), ); + await flush(); api.dispatchEvent( new CustomEvent("progress", { detail: { @@ -89,7 +104,8 @@ describe("floating viewer progress service", () => { expect(snapshot.prompt.currentlyExecuting.nodeId).toBe("2"); expect(snapshot.prompt.currentlyExecuting.nodeLabel).toBe("SaveImage"); - service.dispose({ resetPatchedQueuePrompt: true }); + service.dispose(); + expect(api.queuePrompt).not.toHaveBeenCalled(); }); it("counts cached nodes as executed without replacing the active node", async () => { @@ -106,18 +122,17 @@ describe("floating viewer progress service", () => { }); await service.ensureInitialized({ api }); - await api.queuePrompt(0, { - output: { - 1: { class_type: "LoadImage" }, - 2: { class_type: "VAEDecode" }, - 3: { class_type: "KSampler" }, - }, + api.run("prompt-1", { + 1: { class_type: "LoadImage" }, + 2: { class_type: "VAEDecode" }, + 3: { class_type: "KSampler" }, }); api.dispatchEvent( new CustomEvent("execution_start", { detail: { prompt_id: "prompt-1" }, }), ); + await flush(); api.dispatchEvent( new CustomEvent("progress", { detail: { @@ -142,7 +157,8 @@ describe("floating viewer progress service", () => { expect(snapshot.prompt.currentlyExecuting.nodeId).toBe("3"); expect(snapshot.prompt.currentlyExecuting.nodeLabel).toBe("KSampler"); - service.dispose({ resetPatchedQueuePrompt: true }); + service.dispose(); + expect(api.queuePrompt).not.toHaveBeenCalled(); }); it("surfaces execution errors and resets to idle on success", async () => { @@ -153,11 +169,7 @@ describe("floating viewer progress service", () => { }); await service.ensureInitialized({ api }); - await api.queuePrompt(0, { - output: { - 1: { class_type: "KSampler" }, - }, - }); + api.run("prompt-1", { 1: { class_type: "KSampler" } }); api.dispatchEvent( new CustomEvent("execution_start", { detail: { prompt_id: "prompt-1" }, @@ -187,7 +199,58 @@ describe("floating viewer progress service", () => { snapshot = service.getSnapshot(); expect(snapshot.prompt).toBeNull(); - service.dispose({ resetPatchedQueuePrompt: true }); + service.dispose(); + expect(api.queuePrompt).not.toHaveBeenCalled(); + }); + + it("never wraps api.queuePrompt and falls back to /history for finished prompts", async () => { + const api = new FakeApi(); + const original = api.queuePrompt; + api.history = { + "prompt-9": { prompt: [0, "prompt-9", { 5: { class_type: "SaveImage" } }, {}, []] }, + }; + const service = new FloatingViewerProgressService({ + getApi: () => api, + getApp: () => ({ graph: { getNodeById: () => null } }), + }); + + await service.ensureInitialized({ api }); + expect(api.queuePrompt).toBe(original); + + api.dispatchEvent( + new CustomEvent("execution_start", { detail: { prompt_id: "prompt-9" } }), + ); + await flush(); + expect(service.getSnapshot().prompt.totalNodes).toBe(1); + expect(service.getSnapshot().prompt.getNodeLabel("5")).toBe("SaveImage"); + + service.dispose(); + }); + + it("prefers the core Jobs API when the frontend exposes getJobDetail", async () => { + const api: any = new FakeApi(); + api.getJobDetail = vi.fn(async (id: string) => ({ + id, + status: "in_progress", + workflow: { + prompt: { 7: { class_type: "VAEDecode" }, 8: { class_type: "SaveImage" } }, + }, + })); + const fetchSpy = vi.spyOn(api, "fetchApi"); + const service = new FloatingViewerProgressService({ + getApi: () => api, + getApp: () => ({ graph: { getNodeById: () => null } }), + }); + + await service.ensureInitialized({ api }); + api.dispatchEvent(new CustomEvent("execution_start", { detail: { prompt_id: "job-1" } })); + await flush(); + + expect(api.getJobDetail).toHaveBeenCalledWith("job-1"); + expect(fetchSpy).not.toHaveBeenCalled(); + expect(service.getSnapshot().prompt.totalNodes).toBe(2); + + service.dispose(); }); it("formats the media overlay label from current node and steps", () => { diff --git a/ui/tests/floating_viewer_simple_player_shortcuts.vitest.ts b/ui/tests/floating_viewer_simple_player_shortcuts.vitest.ts index 5cc86750..e7989bf4 100644 --- a/ui/tests/floating_viewer_simple_player_shortcuts.vitest.ts +++ b/ui/tests/floating_viewer_simple_player_shortcuts.vitest.ts @@ -35,7 +35,7 @@ describe("floatingViewerSimplePlayer keyboard shortcuts", () => { { filename: "clip.mp4" }, { kind: "video" }, ); - document.body.appendChild(root); + document.body.appendChild(root as any); root.dispatchEvent( new KeyboardEvent("keydown", { key: " ", bubbles: true, cancelable: true }), @@ -83,7 +83,7 @@ describe("floatingViewerSimplePlayer keyboard shortcuts", () => { { filename: "clip.mp4" }, { kind: "video" }, ); - document.body.appendChild(root); + document.body.appendChild(root as any); root.dispatchEvent( new KeyboardEvent("keydown", { key: "ArrowLeft", bubbles: true, cancelable: true }), @@ -122,7 +122,7 @@ describe("floatingViewerSimplePlayer keyboard shortcuts", () => { { filename: "clip.mp4" }, { kind: "video" }, ); - document.body.appendChild(root); + document.body.appendChild(root as any); const seek = root.querySelector(".mjr-mfv-simple-player-seek"); const event = new KeyboardEvent("keydown", { key: "ArrowLeft", @@ -181,7 +181,7 @@ describe("floatingViewerSimplePlayer keyboard shortcuts", () => { { filename: "clip.mp4" }, { kind: "video" }, ); - document.body.appendChild(root); + document.body.appendChild(root as any); const seek = root.querySelector(".mjr-mfv-simple-player-seek"); currentTime = 5; diff --git a/ui/tests/floating_viewer_toolbar_overlay_controls.vitest.ts b/ui/tests/floating_viewer_toolbar_overlay_controls.vitest.ts index 1c3c9758..892ea4e7 100644 --- a/ui/tests/floating_viewer_toolbar_overlay_controls.vitest.ts +++ b/ui/tests/floating_viewer_toolbar_overlay_controls.vitest.ts @@ -32,11 +32,11 @@ vi.mock("../features/viewer/nodeStream/nodeStreamFeatureFlag.js", () => ({ vi.mock("../features/viewer/workflowSidebar/WorkflowSidebar.js", () => ({ WorkflowSidebar: class { constructor() { - this.el = document.createElement("div"); - this.isVisible = false; + (this as any).el = document.createElement("div"); + (this as any).isVisible = false; } toggle() { - this.isVisible = !this.isVisible; + (this as any).isVisible = !(this as any).isVisible; } }, })); @@ -86,16 +86,16 @@ describe("floating viewer toolbar overlay controls", () => { expect(bar.querySelector(".mjr-mfv-guides-trigger")).toBeTruthy(); expect(bar.querySelector(".mjr-mfv-ch-trigger")).toBeTruthy(); - expect(viewer._guidesSelect).toBeTruthy(); - expect(viewer._channelSelect).toBeTruthy(); - expect(viewer._exposureCtl?.input).toBeTruthy(); - expect(viewer._formatSelect).toBeTruthy(); - expect(viewer._formatToggle).toBeTruthy(); - expect(viewer._maskOpacityCtl?.input).toBeTruthy(); - expect(viewer._guidesSelect.value).toBe("0"); - expect(viewer._channelSelect.value).toBe("rgb"); + expect((viewer as any)._guidesSelect).toBeTruthy(); + expect((viewer as any)._channelSelect).toBeTruthy(); + expect((viewer as any)._exposureCtl?.input).toBeTruthy(); + expect((viewer as any)._formatSelect).toBeTruthy(); + expect((viewer as any)._formatToggle).toBeTruthy(); + expect((viewer as any)._maskOpacityCtl?.input).toBeTruthy(); + expect((viewer as any)._guidesSelect.value).toBe("0"); + expect((viewer as any)._channelSelect.value).toBe("rgb"); // When _overlayMaskEnabled is false, format initialises to "off" - expect(viewer._formatSelect.value).toBe("off"); + expect((viewer as any)._formatSelect.value).toBe("off"); }); it("renders a Majoor settings shortcut beside the MFV stop controls", async () => { diff --git a/ui/tests/grid_controller_exit_similar_scope.vitest.ts b/ui/tests/grid_controller_exit_similar_scope.vitest.ts index 7e690de2..3cd6fd82 100644 --- a/ui/tests/grid_controller_exit_similar_scope.vitest.ts +++ b/ui/tests/grid_controller_exit_similar_scope.vitest.ts @@ -101,13 +101,13 @@ describe("gridController exiting similar scope", () => { lastGridCount: 0, lastGridTotal: 0, }; - globalThis.window = {}; + globalThis.window = {} as any; globalThis.CustomEvent = class { constructor(type, init = {}) { - this.type = type; - this.detail = init.detail; + (this as any).type = type; + (this as any).detail = (init as any).detail; } - }; + } as any; }); it("does not preserve stale similar cards when switching back to normal scope", async () => { diff --git a/ui/tests/grid_controller_semantic_mode.vitest.ts b/ui/tests/grid_controller_semantic_mode.vitest.ts index 3797cbfc..871f38b1 100644 --- a/ui/tests/grid_controller_semantic_mode.vitest.ts +++ b/ui/tests/grid_controller_semantic_mode.vitest.ts @@ -43,13 +43,13 @@ function createGridContainer() { describe("gridController semantic mode", () => { beforeEach(() => { vi.clearAllMocks(); - globalThis.window = {}; + globalThis.window = {} as any; globalThis.CustomEvent = class { constructor(type, init = {}) { - this.type = type; - this.detail = init.detail; + (this as any).type = type; + (this as any).detail = (init as any).detail; } - }; + } as any; }); it("does not show unavailable toast when AI search returns no results without errors", async () => { diff --git a/ui/tests/grid_controller_similar_fallback.vitest.ts b/ui/tests/grid_controller_similar_fallback.vitest.ts index 6c5b2708..4f4affe2 100644 --- a/ui/tests/grid_controller_similar_fallback.vitest.ts +++ b/ui/tests/grid_controller_similar_fallback.vitest.ts @@ -53,13 +53,13 @@ describe("gridController similar fallback", () => { similarSourceAssetId: "", similarTitle: "", }; - globalThis.window = {}; + globalThis.window = {} as any; globalThis.CustomEvent = class { constructor(type, init = {}) { - this.type = type; - this.detail = init.detail; + (this as any).type = type; + (this as any).detail = (init as any).detail; } - }; + } as any; }); it("uses state similar results when bridge results are empty", async () => { diff --git a/ui/tests/grid_dom_bridge.vitest.ts b/ui/tests/grid_dom_bridge.vitest.ts index ada9b9ae..f6fd6d5b 100644 --- a/ui/tests/grid_dom_bridge.vitest.ts +++ b/ui/tests/grid_dom_bridge.vitest.ts @@ -22,16 +22,16 @@ describe("gridDomBridge", () => { querySelectorAll: vi.fn((selector) => (selector === ".mjr-asset-card" ? cards : [])), }; - expect(readRenderedAssetCards(grid)).toEqual(cards); - expect(findSelectedAssetCard(grid)).toBe(selected); - expect(findAssetCardById(grid, "asset:1")).toBe(byId); - expect(readGridShownCount(grid, 0)).toBe(12); + expect(readRenderedAssetCards(grid as any)).toEqual(cards); + expect(findSelectedAssetCard(grid as any)).toBe(selected); + expect(findAssetCardById(grid as any, "asset:1")).toBe(byId); + expect(readGridShownCount(grid as any, 0)).toBe(12); }); it("falls back safely when the DOM is unavailable", () => { expect(readRenderedAssetCards(null)).toEqual([]); expect(findSelectedAssetCard(null)).toBeNull(); expect(findAssetCardById(null, "a")).toBeNull(); - expect(readGridShownCount({ dataset: { mjrShown: "NaN" } }, 7)).toBe(7); + expect(readGridShownCount({ dataset: { mjrShown: "NaN" } } as any, 7)).toBe(7); }); }); diff --git a/ui/tests/grid_keyboard_navigation.vitest.ts b/ui/tests/grid_keyboard_navigation.vitest.ts index d6e489ac..3e9c4342 100644 --- a/ui/tests/grid_keyboard_navigation.vitest.ts +++ b/ui/tests/grid_keyboard_navigation.vitest.ts @@ -50,33 +50,35 @@ function createGridContainer(assetIds) { grid.className = "mjr-grid"; const assets = assetIds.map((id) => ({ id })); - grid._mjrAssets = assets; - grid._mjrGetAssets = () => assets; - grid._mjrGetRenderedCards = () => + (grid as any)._mjrAssets = assets; + (grid as any)._mjrGetAssets = () => assets; + (grid as any)._mjrGetRenderedCards = () => assets.map((asset, index) => { const card = document.createElement("div"); card.className = "mjr-asset-card"; card.dataset.mjrAssetId = String(asset.id); - card._mjrAsset = asset; - card.getBoundingClientRect = () => ({ - top: 0, - width: 100, - left: index * 100, - height: 100, - right: index * 100 + 100, - bottom: 100, - }); + (card as any)._mjrAsset = asset; + card.getBoundingClientRect = () => + ({ + top: 0, + width: 100, + left: index * 100, + height: 100, + right: index * 100 + 100, + bottom: 100, + }) as any; return card; }); - grid.getBoundingClientRect = () => ({ - top: 0, - left: 0, - width: 220, - height: 100, - right: 220, - bottom: 100, - }); - grid._mjrSetSelection = (ids, activeId = "") => { + grid.getBoundingClientRect = () => + ({ + top: 0, + left: 0, + width: 220, + height: 100, + right: 220, + bottom: 100, + }) as any; + (grid as any)._mjrSetSelection = (ids, activeId = "") => { grid.dataset.mjrSelectedAssetIds = JSON.stringify(ids); if (activeId) grid.dataset.mjrSelectedAssetId = String(activeId); else delete grid.dataset.mjrSelectedAssetId; @@ -105,7 +107,7 @@ describe("GridKeyboard navigation", () => { configurable: true, get: () => document.body, }); - delete window.__MJR_LAST_SELECTION_GRID__; + delete (window as any).__MJR_LAST_SELECTION_GRID__; }); it("handles arrow keys only for the active grid when multiple listeners are installed", async () => { @@ -114,30 +116,30 @@ describe("GridKeyboard navigation", () => { const mainGrid = createGridContainer(["main-1", "main-2", "main-3"]); const feedGrid = createGridContainer(["feed-1", "feed-2", "feed-3"]); - mainGrid._mjrSetSelection(["main-1"], "main-1"); - feedGrid._mjrSetSelection(["feed-1"], "feed-1"); + (mainGrid as any)._mjrSetSelection(["main-1"], "main-1"); + (feedGrid as any)._mjrSetSelection(["feed-1"], "feed-1"); const mainKeyboard = installGridKeyboard({ gridContainer: mainGrid, - getState: () => ({ assets: mainGrid._mjrAssets }), + getState: () => ({ assets: (mainGrid as any)._mjrAssets }), getSelectedAssets: () => - mainGrid._mjrAssets.filter( + (mainGrid as any)._mjrAssets.filter( (asset) => asset.id === mainGrid.dataset.mjrSelectedAssetId, ), getActiveAsset: () => - mainGrid._mjrAssets.find( + (mainGrid as any)._mjrAssets.find( (asset) => asset.id === mainGrid.dataset.mjrSelectedAssetId, ) || null, }); const feedKeyboard = installGridKeyboard({ gridContainer: feedGrid, - getState: () => ({ assets: feedGrid._mjrAssets }), + getState: () => ({ assets: (feedGrid as any)._mjrAssets }), getSelectedAssets: () => - feedGrid._mjrAssets.filter( + (feedGrid as any)._mjrAssets.filter( (asset) => asset.id === feedGrid.dataset.mjrSelectedAssetId, ), getActiveAsset: () => - feedGrid._mjrAssets.find( + (feedGrid as any)._mjrAssets.find( (asset) => asset.id === feedGrid.dataset.mjrSelectedAssetId, ) || null, }); @@ -152,7 +154,7 @@ describe("GridKeyboard navigation", () => { expect(mainGrid.dataset.mjrSelectedAssetId).toBe("main-2"); expect(feedGrid.dataset.mjrSelectedAssetId).toBe("feed-1"); expect(panelRuntimeState.activeGrid).toBe(mainGrid); - expect(window.__MJR_LAST_SELECTION_GRID__).toBe(mainGrid); + expect((window as any).__MJR_LAST_SELECTION_GRID__).toBe(mainGrid); mainKeyboard.dispose(); feedKeyboard.dispose(); @@ -162,9 +164,9 @@ describe("GridKeyboard navigation", () => { const { installGridKeyboard } = await import("../features/grid/GridKeyboard.js"); const grid = createGridContainer(["asset-1"]); - grid._mjrAssets[0].filename = "one.png"; - grid._mjrAssets[0].filepath = "C:/out/one.png"; - grid._mjrSetSelection(["asset-1"], "asset-1"); + (grid as any)._mjrAssets[0].filename = "one.png"; + (grid as any)._mjrAssets[0].filepath = "C:/out/one.png"; + (grid as any)._mjrSetSelection(["asset-1"], "asset-1"); const clicks = []; const originalCreateElement = document.createElement.bind(document); @@ -178,9 +180,9 @@ describe("GridKeyboard navigation", () => { const keyboard = installGridKeyboard({ gridContainer: grid, - getState: () => ({ assets: grid._mjrAssets }), - getSelectedAssets: () => grid._mjrAssets, - getActiveAsset: () => grid._mjrAssets[0], + getState: () => ({ assets: (grid as any)._mjrAssets }), + getSelectedAssets: () => (grid as any)._mjrAssets, + getActiveAsset: () => (grid as any)._mjrAssets[0], }); keyboard.bind(); diff --git a/ui/tests/grid_loader_adaptive_paging.vitest.ts b/ui/tests/grid_loader_adaptive_paging.vitest.ts index e0fa3aa6..98dc502b 100644 --- a/ui/tests/grid_loader_adaptive_paging.vitest.ts +++ b/ui/tests/grid_loader_adaptive_paging.vitest.ts @@ -101,8 +101,8 @@ describe("useGridLoader adaptive paging", () => { vi.resetModules(); vi.clearAllMocks(); vi.useRealTimers(); - globalThis.sessionStorage = makeStorage(); - globalThis.localStorage = makeStorage(); + globalThis.sessionStorage = (makeStorage() as any); + globalThis.localStorage = (makeStorage() as any); ensureWindowStub(); }); @@ -407,7 +407,7 @@ describe("useGridLoader adaptive paging", () => { statusError: false, }; const scrollElement = createVisibleElement({ scrollTop: 420 }); - scrollElement.scrollHeight = 2000; + (scrollElement as any).scrollHeight = 2000; const resetAssets = vi.fn(); const reconcileSelection = vi.fn(); const setSelection = vi.fn((ids, activeId) => { @@ -469,12 +469,12 @@ describe("useGridLoader adaptive paging", () => { statusError: false, }; const scrollElement = new EventTarget(); - scrollElement.scrollTop = 420; - scrollElement.scrollHeight = 2000; - scrollElement.clientHeight = 500; - scrollElement.clientWidth = 320; - scrollElement.isConnected = true; - scrollElement.getClientRects = vi.fn(() => [{ width: 320, height: 500 }]); + (scrollElement as any).scrollTop = 420; + (scrollElement as any).scrollHeight = 2000; + (scrollElement as any).clientHeight = 500; + (scrollElement as any).clientWidth = 320; + (scrollElement as any).isConnected = true; + (scrollElement as any).getClientRects = vi.fn(() => [{ width: 320, height: 500 }]); const loader = useGridLoader({ gridContainerRef: { value: createVisibleElement({ dataset: {} }) }, @@ -492,7 +492,7 @@ describe("useGridLoader adaptive paging", () => { }); const pending = loader.appendNextPage(); - scrollElement.scrollTop = 900; + (scrollElement as any).scrollTop = 900; scrollElement.dispatchEvent(new Event("scroll")); resolvePage({ ok: true, @@ -504,7 +504,7 @@ describe("useGridLoader adaptive paging", () => { }); await pending; - expect(scrollElement.scrollTop).toBe(900); + expect((scrollElement as any).scrollTop).toBe(900); }); it("does not prune unloaded selections after a partial reload", async () => { @@ -594,7 +594,7 @@ describe("useGridLoader adaptive paging", () => { }, }); const scrollElement = createVisibleElement({ scrollTop: 64 }); - scrollElement.scrollHeight = 512; + (scrollElement as any).scrollHeight = 512; const loader = useGridLoader({ gridContainerRef: { value: gridContainer }, @@ -773,7 +773,7 @@ describe("useGridLoader adaptive paging", () => { statusError: false, }; const resetAssets = vi.fn(({ query = "*", total = null, done = false } = {}) => { - state2.query = query; + (state2 as any).query = query; state2.total = total; state2.done = done; state2.assets = []; diff --git a/ui/tests/grid_perf_budget.vitest.ts b/ui/tests/grid_perf_budget.vitest.ts index faefc550..842fc994 100644 --- a/ui/tests/grid_perf_budget.vitest.ts +++ b/ui/tests/grid_perf_budget.vitest.ts @@ -25,18 +25,20 @@ async function elapsedAsync(fn) { } function makeAsset(overrides = {}) { - const i = overrides.i ?? 0; + const i = (overrides as any).i ?? 0; return { - id: overrides.id ?? `asset-${i}`, - filename: overrides.filename ?? `ComfyUI_${String(i).padStart(5, "0")}_00001_.png`, - kind: overrides.kind ?? "image", - mtime: overrides.mtime ?? i, - size: overrides.size ?? 1024, - filepath: overrides.filepath ?? `output/ComfyUI_${String(i).padStart(5, "0")}_00001_.png`, - source: overrides.source ?? "output", - root_id: overrides.root_id ?? "root1", - subfolder: overrides.subfolder ?? "", - has_generation_data: overrides.has_generation_data ?? 0, + id: (overrides as any).id ?? `asset-${i}`, + filename: (overrides as any).filename ?? `ComfyUI_${String(i).padStart(5, "0")}_00001_.png`, + kind: (overrides as any).kind ?? "image", + mtime: (overrides as any).mtime ?? i, + size: (overrides as any).size ?? 1024, + filepath: + (overrides as any).filepath ?? + `output/ComfyUI_${String(i).padStart(5, "0")}_00001_.png`, + source: (overrides as any).source ?? "output", + root_id: (overrides as any).root_id ?? "root1", + subfolder: (overrides as any).subfolder ?? "", + has_generation_data: (overrides as any).has_generation_data ?? 0, ...overrides, }; } diff --git a/ui/tests/grid_scope_switch_cache.vitest.ts b/ui/tests/grid_scope_switch_cache.vitest.ts index f1bc886e..772501e8 100644 --- a/ui/tests/grid_scope_switch_cache.vitest.ts +++ b/ui/tests/grid_scope_switch_cache.vitest.ts @@ -105,13 +105,13 @@ describe("gridController scope switch cache behavior", () => { lastGridCount: 0, lastGridTotal: 0, }); - globalThis.window = {}; + globalThis.window = {} as any; globalThis.CustomEvent = class { constructor(type, init = {}) { - this.type = type; - this.detail = init.detail; + (this as any).type = type; + (this as any).detail = (init as any).detail; } - }; + } as any; }); it("writes mjrCollectionId to the dataset during reload", async () => { @@ -142,7 +142,7 @@ describe("gridController scope switch cache behavior", () => { await controller.reloadGrid(); - expect(gridContainer.dataset.mjrCollectionId).toBe("col-123"); + expect((gridContainer.dataset as any).mjrCollectionId).toBe("col-123"); }); it("loads collection assets when collectionId is set", async () => { @@ -276,7 +276,7 @@ describe("gridController scope switch cache behavior", () => { await controller.reloadGrid(); expect(gridContainer.dataset.mjrScope).toBe("custom"); - expect(gridContainer.dataset.mjrCustomRootId).toBe(""); + expect((gridContainer.dataset as any).mjrCustomRootId).toBe(""); expect(loadAssets).toHaveBeenCalled(); expect(disposeGrid).not.toHaveBeenCalled(); }); diff --git a/ui/tests/grid_selection_manager.vitest.ts b/ui/tests/grid_selection_manager.vitest.ts index 9b607ea8..ba93df72 100644 --- a/ui/tests/grid_selection_manager.vitest.ts +++ b/ui/tests/grid_selection_manager.vitest.ts @@ -47,15 +47,15 @@ describe("GridSelectionManager", () => { const events = []; globalThis.CustomEvent = class { constructor(type, init) { - this.type = type; - this.detail = init?.detail; + (this as any).type = type; + (this as any).detail = init?.detail; } - }; + } as any; globalThis.window = { dispatchEvent(evt) { events.push(evt); }, - }; + } as any; const grid = { dataset: {}, dispatchEvent(evt) { @@ -69,7 +69,7 @@ describe("GridSelectionManager", () => { const selected = setSelectionIds(grid, ["1", 3, "3"], { activeId: "3" }, () => cards); expect(selected.sort()).toEqual(["1", "3"]); - expect(grid.dataset.mjrSelectedAssetId).toBe("3"); + expect((grid.dataset as any).mjrSelectedAssetId).toBe("3"); expect(events.length).toBeGreaterThanOrEqual(1); }); @@ -83,15 +83,15 @@ describe("GridSelectionManager", () => { const events = []; globalThis.CustomEvent = class { constructor(type, init) { - this.type = type; - this.detail = init?.detail; + (this as any).type = type; + (this as any).detail = init?.detail; } - }; + } as any; globalThis.window = { dispatchEvent(evt) { events.push(evt); }, - }; + } as any; const grid = { dataset: { mjrSelectedAssetIds: JSON.stringify(["1", "2", "9"]), diff --git a/ui/tests/helpers/vitestEnvironment.ts b/ui/tests/helpers/vitestEnvironment.ts index 8885878b..ea65c132 100644 --- a/ui/tests/helpers/vitestEnvironment.ts +++ b/ui/tests/helpers/vitestEnvironment.ts @@ -64,7 +64,7 @@ export function ensureWindowStub(overrides = {}) { typeof current.addEventListener !== "function" || typeof current.removeEventListener !== "function" ) { - globalThis.window = createWindowStub(overrides); + globalThis.window = createWindowStub(overrides) as any; ensureNavigatorStub(); return globalThis.window; } diff --git a/ui/tests/hide_siblings.vitest.ts b/ui/tests/hide_siblings.vitest.ts index 8149f135..0950919d 100644 --- a/ui/tests/hide_siblings.vitest.ts +++ b/ui/tests/hide_siblings.vitest.ts @@ -241,7 +241,7 @@ describe("hide siblings", () => { expect(state.hiddenPngSiblings).toBe(1); expect(state.assets.map((asset) => asset.filename)).toEqual(["clip.mp4"]); expect(virtualGrid.items.map((asset) => asset.filename)).toEqual(["clip.mp4"]); - expect(gridContainer.dataset.mjrHiddenPngSiblings).toBe("1"); + expect((gridContainer.dataset as any).mjrHiddenPngSiblings).toBe("1"); }); it("does not leak a png when the png arrives before its webp sibling in the same batch", () => { @@ -287,7 +287,7 @@ describe("hide siblings", () => { expect(state.hiddenPngSiblings).toBe(1); expect(state.assets.map((asset) => asset.filename)).toEqual(["clip.webp"]); expect(virtualGrid.items.map((asset) => asset.filename)).toEqual(["clip.webp"]); - expect(gridContainer.dataset.mjrHiddenPngSiblings).toBe("1"); + expect((gridContainer.dataset as any).mjrHiddenPngSiblings).toBe("1"); }); it("rebuilds hidden sibling indexes from preserved visible assets", () => { @@ -337,6 +337,6 @@ describe("hide siblings", () => { expect(added).toBe(0); expect(state.assets.map((asset) => asset.filename)).toEqual(["clip.mp4"]); expect(state.hiddenPngSiblings).toBe(3); - expect(gridContainer.dataset.mjrHiddenPngSiblings).toBe("3"); + expect((gridContainer.dataset as any).mjrHiddenPngSiblings).toBe("3"); }); }); diff --git a/ui/tests/host_adapter_contract.vitest.ts b/ui/tests/host_adapter_contract.vitest.ts index b498c23e..2304678c 100644 --- a/ui/tests/host_adapter_contract.vitest.ts +++ b/ui/tests/host_adapter_contract.vitest.ts @@ -140,50 +140,6 @@ describe("hostAdapter contract", () => { expect(Object.prototype.hasOwnProperty.call(canvas, "onNodeDeselected")).toBe(false); }); - it("wrapHostQueuePrompt binds once per owner and restore returns original", async () => { - const mod = await import("../app/hostAdapter.js"); - - const original = vi.fn(async (count: number) => ({ prompt_id: String(count) })); - const api: any = { - queuePrompt: original, - }; - - const ownerA = { id: "A" }; - const ownerB = { id: "B" }; - - const binding = mod.wrapHostQueuePrompt({ - api, - owner: ownerA, - createWrapper(originalQueuePrompt: any) { - return async function (this: any, ...args: any[]) { - return originalQueuePrompt.apply(this, args); - }; - }, - }); - - expect(binding).toBeTruthy(); - expect(api.queuePrompt).not.toBe(original); - - const blockedBinding = mod.wrapHostQueuePrompt({ - api, - owner: ownerB, - createWrapper(originalQueuePrompt: any) { - return async function (this: any, ...args: any[]) { - return originalQueuePrompt.apply(this, args); - }; - }, - }); - - expect(blockedBinding).toBeNull(); - - const result = await api.queuePrompt(7); - expect(result.prompt_id).toBe("7"); - expect(original).toHaveBeenCalledTimes(1); - - expect(binding.restore()).toBe(true); - expect(api.queuePrompt).toBe(original); - }); - it("notifies node graph and root canvas graph through host helpers", async () => { const mod = await import("../app/hostAdapter.js"); diff --git a/ui/tests/hotkeys_state.vitest.ts b/ui/tests/hotkeys_state.vitest.ts index 8f3bd499..bfbfefc0 100644 --- a/ui/tests/hotkeys_state.vitest.ts +++ b/ui/tests/hotkeys_state.vitest.ts @@ -29,7 +29,7 @@ describe("hotkeysState", () => { }); it("coerces non-string values to string", () => { - setHotkeysScope(42); + setHotkeysScope(42 as any); expect(getHotkeysState().scope).toBe("42"); }); @@ -57,12 +57,12 @@ describe("hotkeysState", () => { }); it("coerces truthy values to boolean", () => { - setHotkeysSuspendedFlag(1); + setHotkeysSuspendedFlag(1 as any); expect(getHotkeysState().suspended).toBe(true); }); it("coerces falsy values to boolean", () => { - setHotkeysSuspendedFlag(0); + setHotkeysSuspendedFlag(0 as any); expect(getHotkeysState().suspended).toBe(false); }); }); diff --git a/ui/tests/infinite_scroll_upsert.vitest.ts b/ui/tests/infinite_scroll_upsert.vitest.ts index d2b18193..7397dd4d 100644 --- a/ui/tests/infinite_scroll_upsert.vitest.ts +++ b/ui/tests/infinite_scroll_upsert.vitest.ts @@ -79,9 +79,11 @@ describe("InfiniteScroll upsert", () => { await fetchPage(gridContainer, query, 100, offset, deps, { requestId: 1, }); - const lastCall = buildListURL.mock.calls[buildListURL.mock.calls.length - 1]?.[0]; + const lastCall = (buildListURL.mock.calls as any)[ + (buildListURL.mock.calls as any).length - 1 + ]?.[0]; expect(lastCall).toMatchObject({ - scope: gridContainer.dataset.mjrScope, + scope: (gridContainer as any).dataset.mjrScope, offset, includeTotal, }); @@ -197,7 +199,7 @@ describe("InfiniteScroll upsert", () => { expect(state.seenKeys.has("id:1")).toBe(false); expect(state.seenKeys.has("stack:stack-a")).toBe(true); expect(state.assets).toHaveLength(1); - expect(state.assets[0].stack_id).toBe("stack-a"); + expect((state.assets[0] as any).stack_id).toBe("stack-a"); expect(setItems).toHaveBeenCalledTimes(1); }); diff --git a/ui/tests/live_stream_tracker.vitest.ts b/ui/tests/live_stream_tracker.vitest.ts index 57855041..8488c410 100644 --- a/ui/tests/live_stream_tracker.vitest.ts +++ b/ui/tests/live_stream_tracker.vitest.ts @@ -72,7 +72,7 @@ function createWindowStub() { dispatchEvent(event) { const handlers = Array.from(listeners.get(event?.type) || []); for (const handler of handlers) { - handler(event); + (handler as any)(event); } return true; }, @@ -83,9 +83,9 @@ function installCustomEventShim() { globalThis.CustomEvent = class CustomEvent extends Event { constructor(type, init = {}) { super(type); - this.detail = init.detail; + (this as any).detail = (init as any).detail; } - }; + } as any; } class FakeApi extends EventTarget {} @@ -99,7 +99,7 @@ beforeEach(() => { vi.resetModules(); vi.useFakeTimers(); state.reset(); - globalThis.window = createWindowStub(); + globalThis.window = createWindowStub() as any; installCustomEventShim(); }); diff --git a/ui/tests/media_factory_model3d.vitest.ts b/ui/tests/media_factory_model3d.vitest.ts index 7e0cf190..66e7623f 100644 --- a/ui/tests/media_factory_model3d.vitest.ts +++ b/ui/tests/media_factory_model3d.vitest.ts @@ -40,8 +40,8 @@ describe("createViewerMediaFactory 3D", () => { beforeEach(() => { vi.clearAllMocks(); globalThis.document = { - createElement: vi.fn((tag) => createElement(tag)), - }; + createElement: vi.fn((tag) => createElement(tag)) as any, + } as any; }); it("routes model3d assets to the shared 3D renderer", async () => { @@ -63,7 +63,7 @@ describe("createViewerMediaFactory 3D", () => { expect(el).toEqual({ kind: "3d-host" }); expect(createModel3DMediaElement).toHaveBeenCalledTimes(1); - expect(createModel3DMediaElement.mock.calls[0][0]).toBe(asset); + expect((createModel3DMediaElement.mock.calls as any)[0][0]).toBe(asset); }); it("wraps audio assets in the enhanced audio preview shell", async () => { @@ -104,7 +104,7 @@ describe("createViewerMediaFactory 3D", () => { factory.applyTransformToVisibleMedia(); - expect(elA.style.transform).toBe("scale(2)"); - expect(elB.style.transform).toBeUndefined(); + expect((elA.style as any).transform).toBe("scale(2)"); + expect((elB.style as any).transform).toBeUndefined(); }); }); diff --git a/ui/tests/message_center.vitest.ts b/ui/tests/message_center.vitest.ts index 963d24f6..ecf9e9d9 100644 --- a/ui/tests/message_center.vitest.ts +++ b/ui/tests/message_center.vitest.ts @@ -2,37 +2,37 @@ import { beforeEach, describe, expect, it, vi } from "vitest"; class MemoryStorage { constructor() { - this.store = new Map(); + (this as any).store = new Map(); } clear() { - this.store.clear(); + (this as any).store.clear(); } getItem(key) { - return this.store.has(key) ? this.store.get(key) : null; + return (this as any).store.has(key) ? (this as any).store.get(key) : null; } removeItem(key) { - this.store.delete(key); + (this as any).store.delete(key); } setItem(key, value) { - this.store.set(key, String(value)); + (this as any).store.set(key, String(value)); } } function installRuntimeGlobals() { const eventTarget = new EventTarget(); - eventTarget.location = { href: "http://127.0.0.1:8188/" }; - globalThis.window = eventTarget; - globalThis.localStorage = new MemoryStorage(); + (eventTarget as any).location = { href: "http://127.0.0.1:8188/" }; + globalThis.window = eventTarget as any; + globalThis.localStorage = new MemoryStorage() as any; globalThis.CustomEvent = class CustomEvent extends Event { constructor(type, init = {}) { super(type); - this.detail = init.detail; + (this as any).detail = (init as any).detail; } - }; + } as any; } async function loadMessageCenter() { @@ -188,9 +188,9 @@ describe("messageCenter", () => { }); const stored = listPanelMessages().find((message) => message.id === "existing-message"); - expect(updated.createdAt).toBe(123456); - expect(updated.title).toBe("Updated title"); - expect(updated.level).toBe("success"); + expect((updated as any).createdAt).toBe(123456); + expect((updated as any).title).toBe("Updated title"); + expect((updated as any).level).toBe("success"); expect(stored).toMatchObject({ id: "existing-message", title: "Updated title", diff --git a/ui/tests/message_popover_controller.vitest.ts b/ui/tests/message_popover_controller.vitest.ts index c114d7d7..1b8f4983 100644 --- a/ui/tests/message_popover_controller.vitest.ts +++ b/ui/tests/message_popover_controller.vitest.ts @@ -74,8 +74,8 @@ describe("messagePopoverController", () => { beforeEach(() => { vi.useRealTimers(); const eventTarget = new EventTarget(); - eventTarget.location = { href: "http://127.0.0.1:8188/" }; - globalThis.window = eventTarget; + (eventTarget as any).location = { href: "http://127.0.0.1:8188/" }; + globalThis.window = eventTarget as any; globalThis.localStorage = { _data: new Map(), getItem(key) { @@ -87,16 +87,16 @@ describe("messagePopoverController", () => { clear() { this._data.clear(); }, - }; + } as any; globalThis.CustomEvent = class CustomEvent extends Event { constructor(type, init = {}) { super(type); - this.detail = init.detail; + (this as any).detail = (init as any).detail; } - }; + } as any; globalThis.document = { - createElement: vi.fn(() => createNode()), - }; + createElement: vi.fn(() => createNode()) as any, + } as any; }); it("shows only the shortcut panel in shortcut guide tab", async () => { @@ -140,10 +140,10 @@ describe("messagePopoverController", () => { expect(title.textContent).toBe("Shortcut Guide"); expect(messageList.hidden).toBe(true); - expect(messageList.style.display).toBe("none"); + expect((messageList.style as any).display).toBe("none"); expect(messageList.attributes.get("aria-hidden")).toBe("true"); expect(shortcutsPanel.hidden).toBe(false); - expect(shortcutsPanel.style.display).toBe(""); + expect((shortcutsPanel.style as any).display).toBe(""); expect(shortcutsPanel.attributes.get("aria-hidden")).toBe("false"); expect(markReadBtn.hidden).toBe(true); @@ -151,9 +151,9 @@ describe("messagePopoverController", () => { expect(title.textContent).toBe("Messages"); expect(messageList.hidden).toBe(false); - expect(messageList.style.display).toBe(""); + expect((messageList.style as any).display).toBe(""); expect(shortcutsPanel.hidden).toBe(true); - expect(shortcutsPanel.style.display).toBe("none"); + expect((shortcutsPanel.style as any).display).toBe("none"); expect(markReadBtn.hidden).toBe(false); }); @@ -301,7 +301,7 @@ describe("messagePopoverController", () => { window.dispatchEvent(new CustomEvent(EVENTS.OPEN_MESSAGE_HISTORY)); - expect(messagePopover.style.display).toBe("block"); + expect((messagePopover.style as any).display).toBe("block"); expect(title.textContent).toBe("History"); historyModule.addToastHistory({ @@ -316,11 +316,11 @@ describe("messagePopoverController", () => { forceStore: true, }); - expect(messagePopover.style.display).toBe("block"); + expect((messagePopover.style as any).display).toBe("block"); await vi.advanceTimersByTimeAsync(2200); expect(popovers.close).toHaveBeenCalledWith(messagePopover); - expect(messagePopover.style.display).toBe("none"); + expect((messagePopover.style as any).display).toBe("none"); vi.useRealTimers(); }); }); diff --git a/ui/tests/native_assets_tab.vitest.ts b/ui/tests/native_assets_tab.vitest.ts new file mode 100644 index 00000000..6bf2c8fe --- /dev/null +++ b/ui/tests/native_assets_tab.vitest.ts @@ -0,0 +1,74 @@ +import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; + +function makeApp(initialTabs: any[]) { + const tabs = [...initialTabs]; + const extensionManager = { + getSidebarTabs: vi.fn(() => [...tabs]), + unregisterSidebarTab: vi.fn((id: string) => { + const index = tabs.findIndex((tab) => tab.id === id); + if (index >= 0) tabs.splice(index, 1); + }), + registerSidebarTab: vi.fn((tab: any) => { + tabs.push(tab); + }), + }; + return { app: { extensionManager }, tabs, extensionManager }; +} + +describe("native assets tab coexistence", () => { + beforeEach(() => { + vi.resetModules(); + vi.useFakeTimers(); + }); + afterEach(() => { + vi.useRealTimers(); + }); + + async function load(app: any) { + const host = await import("../app/hostAdapter.js"); + host.init(app); + return import("../features/runtime/nativeAssetsTab.js"); + } + + it("only recognises the core assets tab, never Majoor's or unrelated tabs", async () => { + const mod = await load(makeApp([]).app); + expect(mod.isNativeAssetsTab({ id: "assets" })).toBe(true); + expect(mod.isNativeAssetsTab({ id: "majoor-assets" })).toBe(false); + expect(mod.isNativeAssetsTab({ id: "queue" })).toBe(false); + expect(mod.isNativeAssetsTab({ id: "node-library" })).toBe(false); + }); + + it("hides the native tab on opt-in and restores the same definition on opt-out", async () => { + const native = { id: "assets", title: "Assets", type: "vue" }; + const { app, tabs } = makeApp([native, { id: "majoor-assets" }, { id: "queue" }]); + const mod = await load(app); + + mod.setNativeAssetsTabHidden(true); + expect(tabs.map((tab) => tab.id)).toEqual(["majoor-assets", "queue"]); + expect(mod.getHiddenNativeAssetsTabIds()).toEqual(["assets"]); + + mod.setNativeAssetsTabHidden(false); + expect(tabs).toContain(native); + expect(mod.getHiddenNativeAssetsTabIds()).toEqual([]); + }); + + it("hides a native tab registered after setup thanks to delayed retries", async () => { + const { app, tabs } = makeApp([{ id: "majoor-assets" }]); + const mod = await load(app); + + mod.setNativeAssetsTabHidden(true); + tabs.push({ id: "assets" }); + vi.advanceTimersByTime(600); + expect(tabs.map((tab) => tab.id)).toEqual(["majoor-assets"]); + + mod.teardownNativeAssetsTab(); + expect(tabs.map((tab) => tab.id)).toContain("assets"); + }); + + it("is a no-op on hosts without getSidebarTabs", async () => { + const mod = await load({ extensionManager: {} }); + expect(() => mod.setNativeAssetsTabHidden(true)).not.toThrow(); + expect(mod.getHiddenNativeAssetsTabIds()).toEqual([]); + mod.teardownNativeAssetsTab(); + }); +}); diff --git a/ui/tests/node_stream_controller.vitest.ts b/ui/tests/node_stream_controller.vitest.ts index 4e14cd01..1c3f8132 100644 --- a/ui/tests/node_stream_controller.vitest.ts +++ b/ui/tests/node_stream_controller.vitest.ts @@ -3,9 +3,9 @@ import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; beforeEach(() => { vi.resetModules(); vi.useFakeTimers(); - globalThis.window = { - location: { href: "http://localhost/" }, - }; + globalThis.window = ({ + location: ({ href: "http://localhost/" } as any), + } as any); }); afterEach(() => { @@ -126,12 +126,12 @@ describe("NodeStreamController", () => { it("streams the ImageOps preview canvas as a cached data URL and re-emits only on signature change", async () => { class MockCanvas {} - globalThis.HTMLCanvasElement = MockCanvas; + globalThis.HTMLCanvasElement = (MockCanvas as any); const canvas = new MockCanvas(); - canvas.width = 320; - canvas.height = 180; - canvas.toDataURL = vi.fn(() => "data:image/png;base64,preview"); + (canvas as any).width = 320; + (canvas as any).height = 180; + (canvas as any).toDataURL = vi.fn(() => "data:image/png;base64,preview"); const onOutput = vi.fn(); const node = { @@ -170,19 +170,19 @@ describe("NodeStreamController", () => { _source: "imageops-live-preview", }), ); - expect(canvas.toDataURL).toHaveBeenCalledTimes(1); + expect((canvas as any).toDataURL).toHaveBeenCalledTimes(1); // Same signature → no re-emit and no re-encode. onOutput.mockClear(); await vi.advanceTimersByTimeAsync(250); expect(onOutput).not.toHaveBeenCalled(); - expect(canvas.toDataURL).toHaveBeenCalledTimes(1); + expect((canvas as any).toDataURL).toHaveBeenCalledTimes(1); // Signature changes → emit + encode again. node.__imageops_state.lastKey = "render-b"; await vi.advanceTimersByTimeAsync(250); expect(onOutput).toHaveBeenCalledTimes(1); - expect(canvas.toDataURL).toHaveBeenCalledTimes(2); + expect((canvas as any).toDataURL).toHaveBeenCalledTimes(2); mod.teardownNodeStream(app); }); @@ -228,7 +228,7 @@ describe("NodeStreamController", () => { mod.setNodeStreamActive(true); await vi.advanceTimersByTimeAsync(200); - app.canvas.selected_nodes = {}; + app.canvas.selected_nodes = ({} as any); await vi.advanceTimersByTimeAsync(200); expect(onStatus).toHaveBeenLastCalledWith("", ""); diff --git a/ui/tests/open_majoor_settings.vitest.ts b/ui/tests/open_majoor_settings.vitest.ts index 5db791d9..f82d6310 100644 --- a/ui/tests/open_majoor_settings.vitest.ts +++ b/ui/tests/open_majoor_settings.vitest.ts @@ -63,7 +63,7 @@ describe("openMajoorSettings", () => { expect(document.querySelector(".mjr-settings-group-meta")?.textContent).toBe( "2 settings", ); - expect(document.querySelector(".mjr-settings-group")?.open).toBe(false); + expect((document.querySelector(".mjr-settings-group") as any)?.open).toBe(false); expect(document.querySelector(".mjr-settings-name")?.textContent).toBe( "Show metadata panel", ); @@ -76,7 +76,7 @@ describe("openMajoorSettings", () => { openMajoorSettings({}); const checkbox = document.querySelector("input[type='checkbox']"); - checkbox.checked = false; + (checkbox as any).checked = false; checkbox.dispatchEvent(new Event("change", { bubbles: true })); expect(definitions[0].onChange).toHaveBeenCalledWith(false); @@ -102,7 +102,7 @@ describe("openMajoorSettings", () => { openMajoorSettings({}); const checkbox = document.querySelector("input[type='checkbox']"); - checkbox.checked = false; + (checkbox as any).checked = false; checkbox.dispatchEvent(new Event("change", { bubbles: true })); await Promise.resolve(); @@ -119,13 +119,13 @@ describe("openMajoorSettings", () => { openMajoorSettings({}); const search = document.querySelector(".mjr-settings-search"); - search.value = "card size"; + (search as any).value = "card size"; search.dispatchEvent(new Event("input", { bubbles: true })); const names = Array.from(document.querySelectorAll(".mjr-settings-name")).map((el) => el.textContent, ); expect(names).toEqual(["Card Size"]); - expect(document.querySelector(".mjr-settings-group")?.open).toBe(true); + expect((document.querySelector(".mjr-settings-group") as any)?.open).toBe(true); }); }); diff --git a/ui/tests/panel_cleanup_contract.vitest.ts b/ui/tests/panel_cleanup_contract.vitest.ts index 4b1a71d0..04ac524d 100644 --- a/ui/tests/panel_cleanup_contract.vitest.ts +++ b/ui/tests/panel_cleanup_contract.vitest.ts @@ -112,7 +112,7 @@ describe("panel cleanup contract", () => { const obj = {}; let threw = false; try { - obj?.dispose?.(); + (obj as any)?.dispose?.(); } catch { threw = true; } diff --git a/ui/tests/panel_hotkeys.vitest.ts b/ui/tests/panel_hotkeys.vitest.ts index 349e3608..469ec10d 100644 --- a/ui/tests/panel_hotkeys.vitest.ts +++ b/ui/tests/panel_hotkeys.vitest.ts @@ -27,7 +27,7 @@ function createWindowStub() { dispatchEvent(event) { const handlers = Array.from(listeners.get(event?.type) || []); for (const handler of handlers) { - handler(event); + (handler as any)(event); } return true; }, @@ -48,7 +48,7 @@ function createBoundElement() { emit(type, event = {}) { const handlers = Array.from(listeners.get(type) || []); for (const handler of handlers) { - handler(event); + (handler as any)(event); } }, contains(target) { @@ -72,11 +72,11 @@ function createKeyEvent(key, target = null, extras = {}) { } beforeEach(() => { - globalThis.window = createWindowStub(); + globalThis.window = createWindowStub() as any; globalThis.document = { - body: { nodeName: "BODY" }, + body: { nodeName: "BODY" } as any, activeElement: null, - }; + } as any; panelRuntimeState.activeGrid = null; setHotkeysSuspended(false); setHotkeysScope(null); @@ -92,7 +92,7 @@ describe("panelHotkeysController", () => { boundEl.emit("mouseenter"); const event = createKeyEvent("v", null, { ctrlKey: true }); - window.dispatchEvent({ type: "keydown", ...event }); + window.dispatchEvent({ type: "keydown", ...event } as any); expect(onToggleFloatingViewer).not.toHaveBeenCalled(); expect(event.preventDefault).not.toHaveBeenCalled(); @@ -104,14 +104,14 @@ describe("panelHotkeysController", () => { const onToggleFloatingViewer = vi.fn(); const controller = createPanelHotkeysController({ onToggleFloatingViewer }); const boundEl = createBoundElement(); - boundEl.isConnected = true; + (boundEl as any).isConnected = true; controller.bind(boundEl); boundEl.emit("mouseenter"); - document.activeElement = document.body; + (document as any).activeElement = document.body; const event = createKeyEvent("v"); - window.dispatchEvent({ type: "keydown", ...event }); + window.dispatchEvent({ type: "keydown", ...event } as any); expect(onToggleFloatingViewer).toHaveBeenCalledTimes(1); expect(event.preventDefault).toHaveBeenCalledTimes(1); @@ -121,13 +121,13 @@ describe("panelHotkeysController", () => { const onToggleFloatingViewer = vi.fn(); const controller = createPanelHotkeysController({ onToggleFloatingViewer }); const boundEl = createBoundElement(); - boundEl.isConnected = true; + (boundEl as any).isConnected = true; controller.bind(boundEl); - document.activeElement = document.body; + (document as any).activeElement = document.body; const event = createKeyEvent("v"); - window.dispatchEvent({ type: "keydown", ...event }); + window.dispatchEvent({ type: "keydown", ...event } as any); expect(onToggleFloatingViewer).not.toHaveBeenCalled(); expect(event.preventDefault).not.toHaveBeenCalled(); @@ -148,7 +148,7 @@ describe("panelHotkeysController", () => { closest: vi.fn(() => ({ tagName: "INPUT" })), }; const event = createKeyEvent("v", target, { ctrlKey: true }); - window.dispatchEvent({ type: "keydown", ...event }); + window.dispatchEvent({ type: "keydown", ...event } as any); expect(onToggleFloatingViewer).not.toHaveBeenCalled(); expect(event.preventDefault).not.toHaveBeenCalled(); @@ -163,7 +163,7 @@ describe("panelHotkeysController", () => { boundEl.emit("mouseenter"); const event = createKeyEvent("v", null, { ctrlKey: true, shiftKey: true }); - window.dispatchEvent({ type: "keydown", ...event }); + window.dispatchEvent({ type: "keydown", ...event } as any); expect(onToggleFloatingViewer).not.toHaveBeenCalled(); expect(event.preventDefault).not.toHaveBeenCalled(); @@ -176,15 +176,15 @@ describe("panelHotkeysController", () => { contains: vi.fn((target) => target === document.body), }; panelRuntimeState.activeGrid = activeGrid; - boundEl.isConnected = true; + (boundEl as any).isConnected = true; controller.bind(boundEl); - document.activeElement = document.body; + (document as any).activeElement = document.body; const event = createKeyEvent("ArrowRight", { closest: vi.fn(() => activeGrid), }); - window.dispatchEvent({ type: "keydown", ...event }); + window.dispatchEvent({ type: "keydown", ...event } as any); expect(event.preventDefault).not.toHaveBeenCalled(); expect(event.stopPropagation).not.toHaveBeenCalled(); diff --git a/ui/tests/panel_primevue_controls.vitest.ts b/ui/tests/panel_primevue_controls.vitest.ts index 9609503d..85fed07a 100644 --- a/ui/tests/panel_primevue_controls.vitest.ts +++ b/ui/tests/panel_primevue_controls.vitest.ts @@ -255,13 +255,13 @@ describe("PrimeVue-backed panel controls", () => { expect(wrapper.vm.minSizeInput).toBeInstanceOf(HTMLInputElement); expect(wrapper.vm.maxSizeInput).toBeInstanceOf(HTMLInputElement); - wrapper.vm.minSizeInput.value = "2.5"; - wrapper.vm.maxSizeInput.value = "1"; - wrapper.vm.minSizeInput.dispatchEvent(new Event("change", { bubbles: true })); + (wrapper.vm.minSizeInput as any).value = "2.5"; + (wrapper.vm.maxSizeInput as any).value = "1"; + (wrapper.vm.minSizeInput as any).dispatchEvent(new Event("change", { bubbles: true })); expect(panelStore.minSizeMB).toBe(2.5); expect(panelStore.maxSizeMB).toBe(2.5); - expect(wrapper.vm.maxSizeInput.value).toBe("2.5"); + expect((wrapper.vm.maxSizeInput as any).value).toBe("2.5"); expect(filterEvents.length).toBeGreaterThan(0); window.removeEventListener("mjr:filters-changed", listener); @@ -274,15 +274,15 @@ describe("PrimeVue-backed panel controls", () => { global: { stubs: GLOBAL_STUBS }, }); - expect(wrapper.vm.kindSelect.value).toBe(""); - expect(wrapper.vm.wfCheckbox.checked).toBe(false); + expect((wrapper.vm.kindSelect as any).value).toBe(""); + expect((wrapper.vm.wfCheckbox as any).checked).toBe(false); - wrapper.vm.kindSelect.value = "video"; - wrapper.vm.wfCheckbox.checked = true; - wrapper.vm.workflowTypeSelect.value = "i2i"; - wrapper.vm.ratingSelect.value = "4"; - wrapper.vm.resolutionPresetSelect.value = "fhd"; - wrapper.vm.dateRangeSelect.value = "today"; + (wrapper.vm.kindSelect as any).value = "video"; + (wrapper.vm.wfCheckbox as any).checked = true; + (wrapper.vm.workflowTypeSelect as any).value = "i2i"; + (wrapper.vm.ratingSelect as any).value = "4"; + (wrapper.vm.resolutionPresetSelect as any).value = "fhd"; + (wrapper.vm.dateRangeSelect as any).value = "today"; expect(panelStore.kindFilter).toBe("video"); expect(panelStore.workflowOnly).toBe(true); @@ -322,12 +322,12 @@ describe("PrimeVue-backed panel controls", () => { global: { stubs: GLOBAL_STUBS }, }); - wrapper.vm.dateExactInput.value = "2026-06-03"; - wrapper.vm.dateExactInput.dispatchEvent(new Event("change", { bubbles: true })); + (wrapper.vm.dateExactInput as any).value = "2026-06-03"; + (wrapper.vm.dateExactInput as any).dispatchEvent(new Event("change", { bubbles: true })); expect(panelStore.dateExactFilter).toBe("2026-06-03"); expect(panelStore.dateRangeFilter).toBe(""); - expect(wrapper.vm.dateRangeSelect.value).toBe(""); + expect((wrapper.vm.dateRangeSelect as any).value).toBe(""); wrapper.unmount(); }); @@ -386,21 +386,21 @@ describe("PrimeVue-backed panel controls", () => { global: { stubs: GLOBAL_STUBS }, }); - expect(wrapper.vm.customSelect.value).toBe(""); - expect(wrapper.vm.customSelect.options).toHaveLength(1); + expect((wrapper.vm.customSelect as any).value).toBe(""); + expect((wrapper.vm.customSelect as any).options).toHaveLength(1); expect(wrapper.vm.customAddBtn).toBeInstanceOf(HTMLButtonElement); expect(wrapper.vm.customRemoveBtn).toBeInstanceOf(HTMLButtonElement); - expect(wrapper.vm.customRemoveBtn.disabled).toBe(true); + expect((wrapper.vm.customRemoveBtn as any).disabled).toBe(true); const option = document.createElement("option"); option.value = "root-a"; option.textContent = "Root A"; - wrapper.vm.customSelect.innerHTML = ""; - wrapper.vm.customSelect.appendChild(option); - wrapper.vm.customSelect.value = "root-a"; + (wrapper.vm.customSelect as any).innerHTML = ""; + (wrapper.vm.customSelect as any).appendChild(option); + (wrapper.vm.customSelect as any).value = "root-a"; - expect(wrapper.vm.customSelect.selectedIndex).toBe(0); - expect(wrapper.vm.customSelect.selectedOptions[0].text).toBe("Root A"); + expect((wrapper.vm.customSelect as any).selectedIndex).toBe(0); + expect((wrapper.vm.customSelect as any).selectedOptions[0].text).toBe("Root A"); wrapper.unmount(); }); @@ -429,7 +429,7 @@ describe("PrimeVue-backed panel controls", () => { global: { stubs: GLOBAL_STUBS }, }); - wrapper.vm.setPinnedFolders({ + (wrapper.vm as any).setPinnedFolders({ roots: [{ id: "root-a", label: "Root A", path: "C:/assets/root-a" }], emptyLabel: "No pinned folders", unpinLabel: "Unpin folder", @@ -468,7 +468,7 @@ describe("PrimeVue-backed panel controls", () => { global: { stubs: GLOBAL_STUBS }, }); - wrapper.vm.setFolderBreadcrumb({ + (wrapper.vm as any).setFolderBreadcrumb({ visible: true, back: { label: "Back", disabled: false, onClick: back }, up: { label: "Up", disabled: true, onClick: vi.fn() }, diff --git a/ui/tests/pending_generated_assets.vitest.ts b/ui/tests/pending_generated_assets.vitest.ts index b46d91b1..74a779ac 100644 --- a/ui/tests/pending_generated_assets.vitest.ts +++ b/ui/tests/pending_generated_assets.vitest.ts @@ -3,7 +3,7 @@ import { beforeEach, describe, expect, it, vi } from "vitest"; describe("pendingGeneratedAssets", () => { beforeEach(() => { vi.resetModules(); - globalThis.window = {}; + globalThis.window = {} as any; }); it("tracks and consumes generated assets waiting for panel reload", async () => { @@ -14,9 +14,9 @@ describe("pendingGeneratedAssets", () => { mod.markPendingGeneratedAsset(5); expect(mod.getPendingGeneratedAssetCount()).toBe(6); - expect(globalThis.window.__mjrPendingGeneratedAssetCount).toBe(6); + expect((globalThis.window as any).__mjrPendingGeneratedAssetCount).toBe(6); expect(mod.consumePendingGeneratedAssets()).toBe(6); expect(mod.getPendingGeneratedAssetCount()).toBe(0); - expect(globalThis.window.__mjrPendingGeneratedAssetCount).toBe(0); + expect((globalThis.window as any).__mjrPendingGeneratedAssetCount).toBe(0); }); }); diff --git a/ui/tests/popover_manager.vitest.ts b/ui/tests/popover_manager.vitest.ts index 594dfbf7..9fc287c2 100644 --- a/ui/tests/popover_manager.vitest.ts +++ b/ui/tests/popover_manager.vitest.ts @@ -8,22 +8,22 @@ import { class FakeElement extends EventTarget { constructor() { super(); - this.style = {}; - this.id = ""; - this.className = ""; - this.attributes = {}; - this.queryMap = new Map(); - this.parentNode = null; - this.parentElement = null; - this.nextSibling = null; - this.children = []; - this.scrollTop = 0; - this.scrollLeft = 0; - this.scrollHeight = 0; - this.scrollWidth = 0; - this.clientHeight = 0; - this.clientWidth = 0; - this.classList = { + (this as any).style = {}; + (this as any).id = ""; + (this as any).className = ""; + (this as any).attributes = {}; + (this as any).queryMap = new Map(); + (this as any).parentNode = null; + (this as any).parentElement = null; + (this as any).nextSibling = null; + (this as any).children = []; + (this as any).scrollTop = 0; + (this as any).scrollLeft = 0; + (this as any).scrollHeight = 0; + (this as any).scrollWidth = 0; + (this as any).clientHeight = 0; + (this as any).clientWidth = 0; + (this as any).classList = { add: vi.fn(), remove: vi.fn(), }; @@ -32,7 +32,7 @@ class FakeElement extends EventTarget { appendChild(child) { child.parentNode = this; child.parentElement = this; - this.children.push(child); + (this as any).children.push(child); return child; } @@ -40,30 +40,30 @@ class FakeElement extends EventTarget { child.parentNode = this; child.parentElement = this; child.nextSibling = nextSibling ?? null; - this.children.push(child); + (this as any).children.push(child); return child; } contains(target) { if (target === this) return true; - return this.children.includes(target); + return (this as any).children.includes(target); } getAttribute(name) { - return this.attributes[name] ?? null; + return (this as any).attributes[name] ?? null; } setAttribute(name, value) { - this.attributes[name] = String(value); + (this as any).attributes[name] = String(value); } matches(selector) { - if (selector.includes("[data-pc-name]") && this.attributes["data-pc-name"]) return true; - if (selector.includes("[role='listbox']") && this.attributes.role === "listbox") return true; - if (selector.includes("[role='dialog']") && this.attributes.role === "dialog") return true; - if (selector.includes("[role='menu']") && this.attributes.role === "menu") return true; - if (selector.includes("[role='tree']") && this.attributes.role === "tree") return true; - if (selector.includes("[role='grid']") && this.attributes.role === "grid") return true; + if (selector.includes("[data-pc-name]") && (this as any).attributes["data-pc-name"]) return true; + if (selector.includes("[role='listbox']") && (this as any).attributes.role === "listbox") return true; + if (selector.includes("[role='dialog']") && (this as any).attributes.role === "dialog") return true; + if (selector.includes("[role='menu']") && (this as any).attributes.role === "menu") return true; + if (selector.includes("[role='tree']") && (this as any).attributes.role === "tree") return true; + if (selector.includes("[role='grid']") && (this as any).attributes.role === "grid") return true; return false; } @@ -71,13 +71,13 @@ class FakeElement extends EventTarget { let el = this; while (el) { if (typeof el.matches === "function" && el.matches(selector)) return el; - el = el.parentElement; + el = (el as any).parentElement; } return null; } querySelector(selector) { - return this.queryMap.get(selector) || null; + return (this as any).queryMap.get(selector) || null; } getBoundingClientRect() { @@ -96,34 +96,34 @@ describe("popoverManager", () => { let docTarget; beforeEach(() => { - globalThis.HTMLElement = FakeElement; - globalThis.getComputedStyle = (el) => ({ - overflow: el.style.overflow || "", - overflowX: el.style.overflowX || "", - overflowY: el.style.overflowY || "", - }); + globalThis.HTMLElement = (FakeElement as any); + globalThis.getComputedStyle = (((el) => ({ + overflow: (el as any).style.overflow || "", + overflowX: (el as any).style.overflowX || "", + overflowY: (el as any).style.overflowY || "", + })) as any); globalThis.requestAnimationFrame = (cb) => { - cb(); + (cb as any)(); return 1; }; globalThis.cancelAnimationFrame = () => {}; - globalThis.ResizeObserver = class { + globalThis.ResizeObserver = (class { observe() {} disconnect() {} - }; + } as any); docTarget = new EventTarget(); const body = new FakeElement(); - globalThis.document = { - body, + globalThis.document = ({ + body: body as any, addEventListener: docTarget.addEventListener.bind(docTarget), removeEventListener: docTarget.removeEventListener.bind(docTarget), - }; + } as any); const winTarget = new EventTarget(); - winTarget.innerWidth = 1280; - winTarget.innerHeight = 900; - globalThis.window = winTarget; + (winTarget as any).innerWidth = 1280; + (winTarget as any).innerHeight = 900; + globalThis.window = (winTarget as any); }); it("captures wheel scrolling inside a popover and scrolls the popover itself", () => { @@ -133,10 +133,10 @@ describe("popoverManager", () => { const parent = new FakeElement(); parent.appendChild(popover); - popover.scrollHeight = 900; - popover.clientHeight = 200; - popover.scrollWidth = 300; - popover.clientWidth = 300; + (popover as any).scrollHeight = 900; + (popover as any).clientHeight = 200; + (popover as any).scrollWidth = 300; + (popover as any).clientWidth = 300; const manager = createPopoverManager(container); manager.open(popover, anchor); @@ -149,7 +149,7 @@ describe("popoverManager", () => { popover.dispatchEvent(event); - expect(popover.scrollTop).toBe(120); + expect((popover as any).scrollTop).toBe(120); expect(event.defaultPrevented).toBe(true); expect(stopPropagation).toHaveBeenCalled(); }); @@ -161,10 +161,10 @@ describe("popoverManager", () => { const parent = new FakeElement(); parent.appendChild(popover); - popover.scrollHeight = 900; - popover.clientHeight = 200; - popover.scrollWidth = 300; - popover.clientWidth = 300; + (popover as any).scrollHeight = 900; + (popover as any).clientHeight = 200; + (popover as any).scrollWidth = 300; + (popover as any).clientWidth = 300; const appendSpy = vi.spyOn(globalThis.document.body, "appendChild"); const manager = createPopoverManager(container); @@ -193,19 +193,19 @@ describe("popoverManager", () => { const parent = new FakeElement(); const appRoot = new FakeElement(); parent.appendChild(popover); - globalThis.document.body.appendChild(appRoot); + globalThis.document.body.appendChild((appRoot as any)); - popover.queryMap.set("[data-pc-name][aria-expanded='true']", {}); + (popover as any).queryMap.set("[data-pc-name][aria-expanded='true']", {}); const manager = createPopoverManager(container); manager.open(popover, anchor); - popover.style.display = "block"; + (popover as any).style.display = "block"; const event = new Event("mousedown", { bubbles: true }); Object.defineProperty(event, "target", { value: appRoot }); docTarget.dispatchEvent(event); - expect(popover.style.display).toBe("none"); + expect((popover as any).style.display).toBe("none"); }); it("keeps an open popover when clicking a PrimeVue overlay portal owned by it", () => { @@ -214,21 +214,21 @@ describe("popoverManager", () => { const popover = new FakeElement(); const parent = new FakeElement(); const overlay = new FakeElement(); - overlay.className = "p-select-panel"; + (overlay as any).className = "p-select-panel"; parent.appendChild(popover); - globalThis.document.body.appendChild(overlay); + globalThis.document.body.appendChild((overlay as any)); - popover.queryMap.set("[data-pc-name][aria-expanded='true']", {}); + (popover as any).queryMap.set("[data-pc-name][aria-expanded='true']", {}); const manager = createPopoverManager(container); manager.open(popover, anchor); - popover.style.display = "block"; + (popover as any).style.display = "block"; const event = new Event("mousedown", { bubbles: true }); Object.defineProperty(event, "target", { value: overlay }); docTarget.dispatchEvent(event); - expect(popover.style.display).toBe("block"); + expect((popover as any).style.display).toBe("block"); }); it("notifies when popover visibility changes", () => { diff --git a/ui/tests/rating_tags_id_save.vitest.ts b/ui/tests/rating_tags_id_save.vitest.ts index cca76e42..2541e09d 100644 --- a/ui/tests/rating_tags_id_save.vitest.ts +++ b/ui/tests/rating_tags_id_save.vitest.ts @@ -61,7 +61,7 @@ describe("ID save-back after successful rating/tag update", () => { it("saves DB id when asset.id is undefined", () => { const asset = { filepath: "/output/img.png" }; applyIdSaveBack(asset, 456); - expect(asset.id).toBe(456); + expect((asset as any).id).toBe(456); }); it("saves DB id when asset.id is a synthetic string", () => { diff --git a/ui/tests/register_realtime_listeners.vitest.ts b/ui/tests/register_realtime_listeners.vitest.ts index 64e90069..7c27e183 100644 --- a/ui/tests/register_realtime_listeners.vitest.ts +++ b/ui/tests/register_realtime_listeners.vitest.ts @@ -10,19 +10,19 @@ import { function ensureBrowserShims() { if (typeof globalThis.CustomEvent === "undefined") { - globalThis.CustomEvent = class CustomEvent { + globalThis.CustomEvent = (class CustomEvent { constructor(type, init = {}) { - this.type = type; - this.detail = init.detail; + (this as any).type = type; + (this as any).detail = (init as any).detail; } - }; + } as any); } if (typeof globalThis.window === "undefined") { - globalThis.window = { + globalThis.window = ({ dispatchEvent: () => true, addEventListener: () => {}, removeEventListener: () => {}, - }; + } as any); } } @@ -98,7 +98,7 @@ describe("registerRealtimeListeners", () => { type: "output", }; - harness.api._mjrAssetIndexedHandler({ detail }); + (harness.api as any)._mjrAssetIndexedHandler({ detail }); expect(harness.pushGeneratedAsset).toHaveBeenCalledTimes(1); expect(harness.upsertAsset).toHaveBeenCalledTimes(1); @@ -132,7 +132,7 @@ describe("registerRealtimeListeners", () => { registerCleanableListener: () => {}, }); - harness.api._mjrAssetIndexedHandler({ + (harness.api as any)._mjrAssetIndexedHandler({ detail: { id: 43, kind: "image", @@ -148,8 +148,8 @@ describe("registerRealtimeListeners", () => { it("upsert apres generation puis indexation sur la grille active", async () => { ensureBrowserShims(); - window.__mjrLastAssetUpsert = 0; - window.__mjrLastAssetUpsertCount = 0; + (window as any).__mjrLastAssetUpsert = 0; + (window as any).__mjrLastAssetUpsertCount = 0; const harness = createRuntimeHarness(); harness.grid.dataset = { mjrScope: "output", mjrQuery: "portrait" }; @@ -183,20 +183,20 @@ describe("registerRealtimeListeners", () => { }; // Phase generation live: pousse au feed mais n'upsert pas directement quand la query n'est pas "*". - harness.api._mjrAssetAddedHandler({ detail }); + (harness.api as any)._mjrAssetAddedHandler({ detail }); expect(harness.pushGeneratedAsset).toHaveBeenCalledTimes(1); expect(harness.upsertAsset).toHaveBeenCalledTimes(0); expect(getSidebarAssetBadgeCount()).toBe(0); // Phase indexation: l'asset final est upsert dans la grille active. - harness.api._mjrAssetIndexedHandler({ detail }); + (harness.api as any)._mjrAssetIndexedHandler({ detail }); expect(harness.pushGeneratedAsset).toHaveBeenCalledTimes(2); expect(harness.upsertAsset).toHaveBeenCalledTimes(1); expect(harness.upsertAsset).toHaveBeenCalledWith( harness.grid, expect.objectContaining(detail), ); - expect(Number(window.__mjrLastAssetUpsertCount || 0)).toBeGreaterThan(0); + expect(Number((window as any).__mjrLastAssetUpsertCount || 0)).toBeGreaterThan(0); expect(getSidebarAssetBadgeCount()).toBe(1); }); @@ -232,7 +232,7 @@ describe("registerRealtimeListeners", () => { type: "output", }; - harness.api._mjrAssetIndexedHandler({ detail }); + (harness.api as any)._mjrAssetIndexedHandler({ detail }); expect(harness.pushGeneratedAsset).toHaveBeenCalledTimes(1); expect(harness.pushGeneratedAsset).toHaveBeenCalledWith(expect.objectContaining(detail)); @@ -385,8 +385,8 @@ describe("registerRealtimeListeners", () => { syncExecutionBackendState, }); - harness.api._mjrExecutionStartHandler({ detail: { prompt_id: "job-1" } }); - harness.api._mjrExecutionEndHandler({ detail: { prompt_id: "job-1" } }); + (harness.api as any)._mjrExecutionStartHandler({ detail: { prompt_id: "job-1" } }); + (harness.api as any)._mjrExecutionEndHandler({ detail: { prompt_id: "job-1" } }); expect(syncExecutionBackendState).toHaveBeenNthCalledWith(1, { active: true, @@ -429,7 +429,7 @@ describe("registerRealtimeListeners", () => { registerCleanableListener: () => {}, }); - harness.api._mjrCoreExecutionAssetsReadyHandler({ + (harness.api as any)._mjrCoreExecutionAssetsReadyHandler({ detail: { prompt_id: "job-2", indexed: 2 }, }); } finally { diff --git a/ui/tests/security_client_headers.vitest.ts b/ui/tests/security_client_headers.vitest.ts index d86d128e..cf31e2a3 100644 --- a/ui/tests/security_client_headers.vitest.ts +++ b/ui/tests/security_client_headers.vitest.ts @@ -26,28 +26,28 @@ describe("api client security headers", () => { beforeEach(async () => { vi.resetModules(); - globalThis.localStorage = makeStorage(); - globalThis.sessionStorage = makeStorage(); + globalThis.localStorage = makeStorage() as any; + globalThis.sessionStorage = makeStorage() as any; const toastAdd = vi.fn(); globalThis.app = { ui: {}, extensionManager: { toast: { add: toastAdd } } }; globalThis.window = { addEventListener: vi.fn(), removeEventListener: vi.fn(), dispatchEvent: vi.fn(), - location: { origin: "http://localhost" }, + location: { origin: "http://localhost" } as any, app: globalThis.app, - }; + } as any; globalThis.CustomEvent = class { constructor(type, init) { - this.type = type; - this.detail = init?.detail; + (this as any).type = type; + (this as any).detail = init?.detail; } - }; + } as any; globalThis.fetch = vi.fn(async () => ({ status: 200, headers: { get: (name) => (name === "content-type" ? "application/json" : null) }, json: async () => ({ ok: true, data: {} }), - })); + })) as any; client = await import("../api/client.js"); }); @@ -59,7 +59,7 @@ describe("api client security headers", () => { await client.post("/mjr/am/test", { foo: 1 }); // POST may trigger an auth bootstrap fetch before the actual request - const calls = globalThis.fetch.mock.calls; + const calls = (globalThis.fetch as any).mock.calls; const postCall = calls.find(([, opts]) => (opts?.method || "").toUpperCase() === "POST"); expect(postCall).toBeTruthy(); const xrw = readHeader(postCall[1].headers, "X-Requested-With"); @@ -70,7 +70,7 @@ describe("api client security headers", () => { await client.get("/mjr/am/test"); expect(globalThis.fetch).toHaveBeenCalledTimes(1); - const [, callOptions] = globalThis.fetch.mock.calls[0]; + const [, callOptions] = (globalThis.fetch as any).mock.calls[0]; const xrw = readHeader(callOptions.headers, "X-Requested-With"); expect(xrw).toBeNull(); }); @@ -82,7 +82,7 @@ describe("api client security headers", () => { await client.post("/mjr/am/test", {}); expect(globalThis.fetch).toHaveBeenCalledTimes(1); - const [, callOptions] = globalThis.fetch.mock.calls[0]; + const [, callOptions] = (globalThis.fetch as any).mock.calls[0]; const mjrToken = readHeader(callOptions.headers, "X-MJR-Token"); const authHeader = readHeader(callOptions.headers, "Authorization"); expect(mjrToken).toBe(token); @@ -95,7 +95,7 @@ describe("api client security headers", () => { await client.post("/mjr/am/test", {}); - const [, callOptions] = globalThis.fetch.mock.calls[0]; + const [, callOptions] = (globalThis.fetch as any).mock.calls[0]; const cookie = readHeader(callOptions.headers, "Cookie"); expect(cookie).toBeNull(); }); @@ -106,7 +106,7 @@ describe("api client security headers", () => { await client.get("/mjr/am/assets?page=1"); - const [callUrl] = globalThis.fetch.mock.calls[0]; + const [callUrl] = (globalThis.fetch as any).mock.calls[0]; expect(String(callUrl)).not.toContain(token); }); }); diff --git a/ui/tests/security_deep_merge.vitest.ts b/ui/tests/security_deep_merge.vitest.ts index 599fe312..8e9cab77 100644 --- a/ui/tests/security_deep_merge.vitest.ts +++ b/ui/tests/security_deep_merge.vitest.ts @@ -7,8 +7,8 @@ describe("deepMerge prototype-pollution resistance", () => { const malicious = JSON.parse('{"__proto__": {"polluted": true}}'); const merged = deepMerge(base, malicious); - expect(merged.polluted).toBeUndefined(); - expect({}.polluted).toBeUndefined(); + expect((merged as any).polluted).toBeUndefined(); + expect(({} as any).polluted).toBeUndefined(); expect(merged.a).toBe(1); }); @@ -18,7 +18,7 @@ describe("deepMerge prototype-pollution resistance", () => { const merged = deepMerge(base, malicious); expect(Object.hasOwn(merged, "constructor")).toBe(false); - expect({}.polluted).toBeUndefined(); + expect(({} as any).polluted).toBeUndefined(); }); it("rejects prototype key in the merge source", () => { @@ -26,7 +26,7 @@ describe("deepMerge prototype-pollution resistance", () => { const malicious = { prototype: { polluted: true } }; const merged = deepMerge(base, malicious); - expect(merged.prototype).toBeUndefined(); + expect((merged as any).prototype).toBeUndefined(); }); it("rejects nested __proto__ keys recursively", () => { @@ -34,14 +34,14 @@ describe("deepMerge prototype-pollution resistance", () => { const malicious = { nested: JSON.parse('{"__proto__": {"deep": true}}') }; const merged = deepMerge(base, malicious); - expect(merged.nested.deep).toBeUndefined(); - expect({}.deep).toBeUndefined(); + expect((merged.nested as any).deep).toBeUndefined(); + expect(({} as any).deep).toBeUndefined(); }); it("performs normal deep merge for safe keys", () => { const base = { a: 1, nested: { x: 10 } }; const patch = { b: 2, nested: { y: 20 } }; - const merged = deepMerge(base, patch); + const merged = deepMerge(base, patch as any); expect(merged).toEqual({ a: 1, b: 2, nested: { x: 10, y: 20 } }); }); @@ -55,7 +55,7 @@ describe("deepMerge prototype-pollution resistance", () => { it("does not mutate the original base object", () => { const base = { a: 1, nested: { x: 10 } }; const patch = { nested: { y: 20 } }; - deepMerge(base, patch); + deepMerge(base, patch as any); expect(base).toEqual({ a: 1, nested: { x: 10 } }); }); diff --git a/ui/tests/security_runtime_state.vitest.ts b/ui/tests/security_runtime_state.vitest.ts index 864a8099..e4959bb2 100644 --- a/ui/tests/security_runtime_state.vitest.ts +++ b/ui/tests/security_runtime_state.vitest.ts @@ -20,7 +20,7 @@ describe("runtimeState prototype-pollution resistance", () => { const patch = JSON.parse('{"__proto__": {"polluted": true}}'); setRuntimeStatePatch(patch); - expect({}.polluted).toBeUndefined(); + expect(({} as any).polluted).toBeUndefined(); expect(Object.getPrototypeOf({})).toBe(proto); }); diff --git a/ui/tests/settings_mfv_persistence.vitest.ts b/ui/tests/settings_mfv_persistence.vitest.ts index e009470c..9f4e8b88 100644 --- a/ui/tests/settings_mfv_persistence.vitest.ts +++ b/ui/tests/settings_mfv_persistence.vitest.ts @@ -50,12 +50,12 @@ describe("MFV settings persistence", () => { beforeEach(() => { vi.resetModules(); globalThis.window = { - localStorage: createStorage(), + localStorage: createStorage() as any, addEventListener: vi.fn(), - }; + } as any; globalThis.document = { - querySelectorAll: vi.fn(() => []), - }; + querySelectorAll: vi.fn(() => []) as any, + } as any; }); it("persists MFV stream and KJNodes preview defaults across reload-style reads", async () => { diff --git a/ui/tests/settings_panel.vitest.ts b/ui/tests/settings_panel.vitest.ts index d22442e3..23ba5f3f 100644 --- a/ui/tests/settings_panel.vitest.ts +++ b/ui/tests/settings_panel.vitest.ts @@ -112,7 +112,7 @@ describe("SettingsPanel", () => { watcher: { enabled: true }, grid: { sample: false }, }; - globalThis.window = createWindow(); + globalThis.window = createWindow() as any; }); it("builds normalized settings definitions without runtime bootstrap", async () => { diff --git a/ui/tests/settings_runtime.vitest.ts b/ui/tests/settings_runtime.vitest.ts index 87a8c18d..17be16b5 100644 --- a/ui/tests/settings_runtime.vitest.ts +++ b/ui/tests/settings_runtime.vitest.ts @@ -48,7 +48,7 @@ function createElement(tagName, registry) { function createDocument() { const registry = new Map(); const host = createElement("div", registry); - host.className = "mjr-assets-manager mjr-am-container"; + (host as any).className = "mjr-assets-manager mjr-am-container"; return { host, createElement: (tagName) => createElement(tagName, registry), @@ -77,7 +77,7 @@ describe("settingsRuntime", () => { vi.resetModules(); vi.clearAllMocks(); const document = createDocument(); - globalThis.document = document; + globalThis.document = document as any; globalThis.window = { __MJR_RUNTIME_STATUS_INTERVAL__: null, __MJR_RUNTIME_STATUS_INFLIGHT__: null, @@ -85,15 +85,15 @@ describe("settingsRuntime", () => { __MJR_RUNTIME_STATUS_HIDE_TIMEOUT__: null, __MJR_RUNTIME_STATUS_HIDDEN__: null, __MJR_RUNTIME_STATUS_SETTINGS_LISTENER__: null, - localStorage: createLocalStorage(), + localStorage: createLocalStorage() as any, addEventListener: vi.fn(), - }; + } as any; globalThis.sessionStorage = { getItem: vi.fn(() => "token_1234567890abcd"), - }; + } as any; hasRuntimeSecurityToken.mockReturnValue(true); - globalThis.getComputedStyle = vi.fn(() => ({ position: "static" })); - globalThis.setInterval = vi.fn(() => 1); + globalThis.getComputedStyle = vi.fn(() => ({ position: "static" })) as any; + globalThis.setInterval = vi.fn(() => 1) as any; globalThis.clearInterval = vi.fn(); }); @@ -125,11 +125,11 @@ describe("settingsRuntime", () => { const dashboard = globalThis.document.getElementById("mjr-runtime-status-dashboard"); expect(dashboard).toBeTruthy(); - expect(dashboard.__mjrMetricsLine.textContent).toBe( + expect((dashboard as any).__mjrMetricsLine.textContent).toBe( "DB active: 3 | Enrich Q: 4 | Watcher pending: 5", ); - expect(dashboard.__mjrAuthLine.textContent).toBe("Write auth: active ...abcd"); - expect(dashboard.__mjrAuthLine.style.color).toBe("#7ee0a0"); + expect((dashboard as any).__mjrAuthLine.textContent).toBe("Write auth: active ...abcd"); + expect((dashboard as any).__mjrAuthLine.style.color).toBe("#7ee0a0"); }); it("does not render the dashboard when the setting is hidden", async () => { @@ -142,7 +142,7 @@ describe("settingsRuntime", () => { }, }, }), - }); + }) as any; const mod = await import("../app/settings/settingsRuntime.js"); mod.startRuntimeStatusDashboard(); diff --git a/ui/tests/settings_security.vitest.ts b/ui/tests/settings_security.vitest.ts index 480b60c6..2589f07d 100644 --- a/ui/tests/settings_security.vitest.ts +++ b/ui/tests/settings_security.vitest.ts @@ -36,10 +36,10 @@ describe("settingsSecurity recommended remote LAN preset", () => { vi.resetModules(); vi.unstubAllGlobals(); vi.clearAllMocks(); - globalThis.location = { + globalThis.location = ({ protocol: "http:", hostname: "192.168.1.10", - }; + } as any); vi.stubGlobal("crypto", { getRandomValues: vi.fn((buffer) => { for (let index = 0; index < buffer.length; index += 1) { @@ -107,7 +107,7 @@ describe("settingsSecurity recommended remote LAN preset", () => { allow_insecure_token_transport: true, }), ); - expect(String(settings.security.apiToken)).toMatch(/^mjr_[0-9a-f]+$/); + expect(String((settings.security as any).apiToken)).toMatch(/^mjr_[0-9a-f]+$/); expect(notifyApplied).toHaveBeenCalledWith("security.remoteLanPreset"); expect(notifyApplied).toHaveBeenCalledWith("security.apiToken"); expect(syncBackendSecuritySettings).toHaveBeenCalledTimes(1); diff --git a/ui/tests/settings_store.vitest.ts b/ui/tests/settings_store.vitest.ts index 6d71688a..96a78e27 100644 --- a/ui/tests/settings_store.vitest.ts +++ b/ui/tests/settings_store.vitest.ts @@ -26,9 +26,9 @@ function createStorage() { describe("SettingsStore (Vitest)", () => { it("reads and writes settings through localStorage wrapper", () => { globalThis.window = { - localStorage: createStorage(), + localStorage: createStorage() as any, addEventListener() {}, - }; + } as any; expect(SettingsStore.get("missing")).toBe(null); expect(SettingsStore.set("k", "v")).toBe(true); diff --git a/ui/tests/sidebar_asset_badge.vitest.ts b/ui/tests/sidebar_asset_badge.vitest.ts index 67896a92..9d463cf9 100644 --- a/ui/tests/sidebar_asset_badge.vitest.ts +++ b/ui/tests/sidebar_asset_badge.vitest.ts @@ -58,12 +58,12 @@ describe("sidebarAssetBadge", () => { beforeEach(() => { vi.resetModules(); vi.useFakeTimers(); - globalThis.document = createDocument(); + globalThis.document = (createDocument() as any); globalThis.requestAnimationFrame = (fn) => { - fn(); + (fn as any)(); return 1; }; - globalThis.CSS = { escape: (value) => String(value) }; + globalThis.CSS = ({ escape: (value) => String(value) } as any); }); it("increments, deduplicates by asset id, and resets the sidebar badge", async () => { @@ -77,12 +77,12 @@ describe("sidebarAssetBadge", () => { mod.incrementSidebarAssetBadge({ id: 2 }); expect(mod.getSidebarAssetBadgeCount()).toBe(2); - expect(globalThis.document._tab.querySelector(":scope > .mjr-sidebar-asset-badge").textContent).toBe("2"); + expect((globalThis.document as any)._tab.querySelector(":scope > .mjr-sidebar-asset-badge").textContent).toBe("2"); mod.resetSidebarAssetBadge(); expect(mod.getSidebarAssetBadgeCount()).toBe(0); - expect(globalThis.document._tab.querySelector(":scope > .mjr-sidebar-asset-badge")).toBeNull(); + expect((globalThis.document as any)._tab.querySelector(":scope > .mjr-sidebar-asset-badge")).toBeNull(); }); it("does not show the badge when the sidebar asset badge setting is disabled", async () => { @@ -94,7 +94,7 @@ describe("sidebarAssetBadge", () => { mod.incrementSidebarAssetBadge({ id: 1 }); expect(mod.getSidebarAssetBadgeCount()).toBe(0); - expect(globalThis.document._tab.querySelector(":scope > .mjr-sidebar-asset-badge")).toBeNull(); + expect((globalThis.document as any)._tab.querySelector(":scope > .mjr-sidebar-asset-badge")).toBeNull(); }); it("deduplicates indexed asset events by file identity when no asset id is available", async () => { diff --git a/ui/tests/sidebar_controller.vitest.ts b/ui/tests/sidebar_controller.vitest.ts index da467bbc..e562a418 100644 --- a/ui/tests/sidebar_controller.vitest.ts +++ b/ui/tests/sidebar_controller.vitest.ts @@ -6,28 +6,29 @@ import { usePanelStore } from "../stores/usePanelStore.js"; class ElementStub { constructor() { - this.listeners = new Map(); - this.dataset = {}; - this.style = {}; - this.parentElement = null; - this.children = []; - this.classList = { + (this as any).listeners = new Map(); + (this as any).dataset = {}; + (this as any).style = {}; + (this as any).parentElement = null; + (this as any).children = []; + (this as any).classList = { _set: new Set(), - add: (...names) => names.forEach((name) => this.classList._set.add(name)), - remove: (...names) => names.forEach((name) => this.classList._set.delete(name)), - contains: (name) => this.classList._set.has(name), + add: (...names) => names.forEach((name) => (this as any).classList._set.add(name)), + remove: (...names) => + names.forEach((name) => (this as any).classList._set.delete(name)), + contains: (name) => (this as any).classList._set.has(name), }; } addEventListener(type, handler) { - const list = this.listeners.get(type) || []; + const list = (this as any).listeners.get(type) || []; list.push(handler); - this.listeners.set(type, list); + (this as any).listeners.set(type, list); } removeEventListener(type, handler) { - const list = this.listeners.get(type) || []; - this.listeners.set( + const list = (this as any).listeners.get(type) || []; + (this as any).listeners.set( type, list.filter((item) => item !== handler), ); @@ -42,46 +43,52 @@ class ElementStub { /* ignore readonly event payloads */ } } - for (const handler of this.listeners.get(payload.type) || []) { + for (const handler of (this as any).listeners.get(payload.type) || []) { handler(payload); } } contains(target) { - return target === this || this.children.includes(target); + return target === this || (this as any).children.includes(target); } appendChild(child) { - this.children.push(child); + (this as any).children.push(child); child.parentElement = this; return child; } querySelector(selector) { if (selector === ".mjr-asset-card.is-selected") { - return this.children.find((child) => child.classList?.contains("is-selected")) || null; + return ( + (this as any).children.find((child) => child.classList?.contains("is-selected")) || + null + ); } if (selector.includes('[data-mjr-asset-id="')) { const id = selector.split('[data-mjr-asset-id="')[1]?.split('"')[0] || ""; return ( - this.children.find((child) => String(child.dataset?.mjrAssetId || "") === id) || - null + (this as any).children.find( + (child) => String(child.dataset?.mjrAssetId || "") === id, + ) || null ); } return null; } querySelectorAll(selector) { - if (selector === ".mjr-asset-card") return [...this.children]; + if (selector === ".mjr-asset-card") return [...(this as any).children]; if (selector === ".mjr-asset-card.is-selected") { - return this.children.filter((child) => child.classList?.contains("is-selected")); + return (this as any).children.filter((child) => + child.classList?.contains("is-selected"), + ); } return []; } closest(selector) { if (selector === ".mjr-asset-card") { - return this.classList.contains("mjr-asset-card") ? this : null; + return (this as any).classList.contains("mjr-asset-card") ? this : null; } if (selector === ".mjr-workflow-dot") return null; if (selector === "a, button, input, textarea, select, label") return null; @@ -97,13 +104,13 @@ class ElementStub { describe("sidebarController", () => { it("syncs selected asset ids into Pinia on card click", async () => { - globalThis.Element = ElementStub; + globalThis.Element = ElementStub as any; globalThis.ResizeObserver = class { observe() {} disconnect() {} - }; + } as any; globalThis.requestAnimationFrame = (callback) => { - callback(); + (callback as any)(); return 1; }; globalThis.cancelAnimationFrame = vi.fn(); @@ -113,11 +120,11 @@ describe("sidebarController", () => { const gridContainer = new ElementStub(); const scrollRoot = new ElementStub(); - gridContainer.parentElement = scrollRoot; + (gridContainer as any).parentElement = scrollRoot; const card = new ElementStub(); - card.classList.add("mjr-asset-card"); - card.dataset.mjrAssetId = "42"; - card._mjrAsset = { id: 42, filename: "cat.png" }; + (card as any).classList.add("mjr-asset-card"); + (card as any).dataset.mjrAssetId = "42"; + (card as any)._mjrAsset = { id: 42, filename: "cat.png" }; gridContainer.appendChild(card); const sidebar = new ElementStub(); diff --git a/ui/tests/sidebar_run_button_execution.vitest.ts b/ui/tests/sidebar_run_button_execution.vitest.ts index 8f26687a..703e8a0e 100644 --- a/ui/tests/sidebar_run_button_execution.vitest.ts +++ b/ui/tests/sidebar_run_button_execution.vitest.ts @@ -42,7 +42,7 @@ vi.mock("../app/i18n.js", () => ({ vi.mock("../features/viewer/floatingViewerProgress.js", () => ({ ensureFloatingViewerProgressTracking: (...args) => - state.ensureFloatingViewerProgressTracking(...args), + (state.ensureFloatingViewerProgressTracking as any)(...args), floatingViewerProgressService: state.progressService, })); @@ -86,7 +86,7 @@ describe("sidebarRunButton execution failures", () => { const handle = createRunButton(); const runBtn = handle.el.querySelector(".mjr-mfv-run-btn"); - runBtn.click(); + (runBtn as any).click(); await flushMicrotasks(); diff --git a/ui/tests/sidebar_run_button_live_sync.vitest.ts b/ui/tests/sidebar_run_button_live_sync.vitest.ts index a9760980..1cab92ae 100644 --- a/ui/tests/sidebar_run_button_live_sync.vitest.ts +++ b/ui/tests/sidebar_run_button_live_sync.vitest.ts @@ -125,8 +125,8 @@ describe("sidebar run button live sync", () => { ensureTrackingMock.mockClear(); globalThis.document = { - createElement: vi.fn((tag) => makeElement(tag)), - }; + createElement: vi.fn((tag) => makeElement(tag)) as any, + } as any; bridgeState.app = { rootGraph: { nodes: [{ type: "KSampler" }] }, @@ -150,8 +150,8 @@ describe("sidebar run button live sync", () => { const runBtn = handle.el.children[0]; const stopBtn = handle.el.children[1]; - expect(runBtn.disabled).toBe(false); - expect(stopBtn.disabled).toBe(true); + expect((runBtn as any).disabled).toBe(false); + expect((stopBtn as any).disabled).toBe(true); expect(ensureTrackingMock).toHaveBeenCalledTimes(1); progressService.dispatch({ @@ -159,16 +159,16 @@ describe("sidebar run button live sync", () => { prompt: { currentlyExecuting: { nodeId: "11" }, errorDetails: null }, }); - expect(runBtn.disabled).toBe(true); + expect((runBtn as any).disabled).toBe(true); expect(runBtn.classList.contains("running")).toBe(true); - expect(stopBtn.disabled).toBe(false); + expect((stopBtn as any).disabled).toBe(false); expect(stopBtn.classList.contains("active")).toBe(true); progressService.dispatch({ queue: 0, prompt: null }); - expect(runBtn.disabled).toBe(false); + expect((runBtn as any).disabled).toBe(false); expect(runBtn.classList.contains("running")).toBe(false); - expect(stopBtn.disabled).toBe(true); + expect((stopBtn as any).disabled).toBe(true); handle.dispose(); }); @@ -181,16 +181,16 @@ describe("sidebar run button live sync", () => { const runBtn = handle.el.children[0]; const stopBtn = handle.el.children[1]; - runBtn.click(); + (runBtn as any).click(); await Promise.resolve(); expect(bridgeState.app.graphToPrompt).toHaveBeenCalledTimes(1); expect(bridgeState.api.queuePrompt).toHaveBeenCalledTimes(1); - expect(runBtn.disabled).toBe(true); + expect((runBtn as any).disabled).toBe(true); expect(runBtn.classList.contains("running")).toBe(true); - expect(stopBtn.disabled).toBe(false); + expect((stopBtn as any).disabled).toBe(false); - stopBtn.click(); + (stopBtn as any).click(); await Promise.resolve(); expect(bridgeState.api.interrupt).toHaveBeenCalledTimes(1); @@ -198,9 +198,9 @@ describe("sidebar run button live sync", () => { progressService.dispatch({ queue: 0, prompt: null }); - expect(runBtn.disabled).toBe(false); + expect((runBtn as any).disabled).toBe(false); expect(runBtn.classList.contains("stopping")).toBe(false); - expect(stopBtn.disabled).toBe(true); + expect((stopBtn as any).disabled).toBe(true); handle.dispose(); }); @@ -216,7 +216,7 @@ describe("sidebar run button live sync", () => { const handle = createRunButton(); const runBtn = handle.el.children[0]; - runBtn.click(); + (runBtn as any).click(); await Promise.resolve(); expect(bridgeState.app.queuePrompt).toHaveBeenCalledWith(0); diff --git a/ui/tests/sidebar_workflow_section.vitest.ts b/ui/tests/sidebar_workflow_section.vitest.ts index 3a5603fa..e1634026 100644 --- a/ui/tests/sidebar_workflow_section.vitest.ts +++ b/ui/tests/sidebar_workflow_section.vitest.ts @@ -109,11 +109,11 @@ describe("SidebarWorkflowSection", () => { canvasToWorld: (x, y) => ({ x: 100 + Number(x), y: 200 + Number(y) }), hitTestNode: () => null, })); - globalThis.ResizeObserver = class { + globalThis.ResizeObserver = (class { observe() {} disconnect() {} - }; - globalThis.PointerEvent = globalThis.PointerEvent || MouseEvent; + } as any); + globalThis.PointerEvent = (globalThis.PointerEvent || MouseEvent as any); moveWorkflow.mockReset(); moveWorkflow.mockImplementation(async () => ({ ok: true, @@ -124,19 +124,19 @@ describe("SidebarWorkflowSection", () => { }, })); comfyToast.mockReset(); - window.app = { - canvas: { - canvas: { width: 1000, height: 800, clientWidth: 1000, clientHeight: 800 }, - ds: { scale: 1, offset: [0, 0] }, + window.app = ({ + canvas: ({ + canvas: ({ width: 1000, height: 800, clientWidth: 1000, clientHeight: 800 } as any), + ds: ({ scale: 1, offset: [0, 0] } as any), setDirty: vi.fn(), - }, - graph: { + } as any), + graph: ({ setDirtyCanvas: vi.fn(), - }, - }; - HTMLCanvasElement.prototype.getContext = vi.fn(() => ({ + } as any), + } as any); + HTMLCanvasElement.prototype.getContext = (vi.fn(() => ({ setTransform: vi.fn(), - })); + })) as any); }); it("shows workflow stats and persists size and label toggles", async () => { @@ -215,14 +215,14 @@ describe("SidebarWorkflowSection", () => { }); const canvas = wrapper.find("canvas"); - canvas.element.getBoundingClientRect = () => ({ + canvas.element.getBoundingClientRect = (() => ({ left: 10, top: 20, width: 320, height: 160, right: 330, bottom: 180, - }); + }) as any); await canvas.trigger("pointerdown", { button: 0, @@ -325,7 +325,7 @@ describe("SidebarWorkflowSection", () => { expect(categoryBlock?.text()).not.toContain("PROJECTS"); const input = wrapper.find('input[placeholder="Workflow category"]'); - expect(input.element.value).toBe("PROJECTS/PERSONAL/02_OUT/VIDEOS/260513/Atopi"); + expect((input.element as any).value).toBe("PROJECTS/PERSONAL/02_OUT/VIDEOS/260513/Atopi"); wrapper.unmount(); }); diff --git a/ui/tests/sort_controller.vitest.ts b/ui/tests/sort_controller.vitest.ts index bc8a9da3..fd32949a 100644 --- a/ui/tests/sort_controller.vitest.ts +++ b/ui/tests/sort_controller.vitest.ts @@ -54,13 +54,13 @@ function createElementStub() { describe("sortController", () => { it("syncs sort choice to Pinia and reloads the grid", async () => { globalThis.document = { - createElement: () => createElementStub(), - }; + createElement: () => createElementStub() as any, + } as any; setActivePinia(createPinia()); const panelStore = usePanelStore(); const sortBtn = createElementStub(); - sortBtn._icon = { className: "" }; + (sortBtn as any)._icon = { className: "" }; const sortMenu = createElementStub(); const sortPopover = { style: { display: "" } }; const popovers = { close: vi.fn(), toggle: vi.fn() }; @@ -77,7 +77,7 @@ describe("sortController", () => { }); controller.bind(); - expect(sortBtn._icon.className).toBe("pi pi-sort-amount-down"); + expect((sortBtn as any)._icon.className).toBe("pi pi-sort-amount-down"); const nameAscButton = sortMenu.children.find( (child) => child.children?.[0]?.textContent === "A-Z", @@ -85,7 +85,7 @@ describe("sortController", () => { await nameAscButton.dispatchEvent({ type: "click" }); expect(panelStore.sort).toBe("name_asc"); - expect(sortBtn._icon.className).toBe("pi pi-sort-alpha-down"); + expect((sortBtn as any)._icon.className).toBe("pi pi-sort-alpha-down"); expect(popovers.close).toHaveBeenCalledWith(sortPopover); expect(reloadGrid).toHaveBeenCalledTimes(1); }); diff --git a/ui/tests/stack_group_cards.vitest.ts b/ui/tests/stack_group_cards.vitest.ts index ccb24c46..576ffd47 100644 --- a/ui/tests/stack_group_cards.vitest.ts +++ b/ui/tests/stack_group_cards.vitest.ts @@ -51,7 +51,7 @@ describe("StackGroupCards overlay buttons", () => { const button = card.querySelector(".mjr-stack-group-button"); expect(button).toBeTruthy(); - expect(button.draggable).toBe(false); + expect((button as any).draggable).toBe(false); const cardMouseDown = vi.fn(); card.addEventListener("mousedown", cardMouseDown); @@ -117,7 +117,7 @@ describe("StackGroupCards overlay buttons", () => { button.dispatchEvent(new MouseEvent("click", { bubbles: true, cancelable: true })); expect(getMock).toHaveBeenCalledTimes(1); - expect(button.disabled).toBe(true); + expect((button as any).disabled).toBe(true); resolveFetch({ ok: true, @@ -130,7 +130,7 @@ describe("StackGroupCards overlay buttons", () => { await Promise.resolve(); expect(openStackGroup).toHaveBeenCalledTimes(1); - expect(button.disabled).toBe(false); + expect((button as any).disabled).toBe(false); }); it("skips imperative button creation for Vue cards (_mjrIsVue guard)", async () => { @@ -141,7 +141,7 @@ describe("StackGroupCards overlay buttons", () => { grid.dataset.mjrGroupStacks = "1"; const card = document.createElement("div"); card.className = "mjr-asset-card"; - card._mjrIsVue = true; + (card as any)._mjrIsVue = true; grid.appendChild(card); const asset = { diff --git a/ui/tests/tags_editor.vitest.ts b/ui/tests/tags_editor.vitest.ts index afad5f08..ac945a77 100644 --- a/ui/tests/tags_editor.vitest.ts +++ b/ui/tests/tags_editor.vitest.ts @@ -35,50 +35,50 @@ vi.mock("../utils/events.js", () => ({ class ElementStub { constructor(tagName) { - this.tagName = String(tagName || "").toUpperCase(); - this.children = []; - this.parentNode = null; - this.className = ""; - this.style = {}; - this.attributes = new Map(); - this.listeners = new Map(); - this.textContent = ""; - this.value = ""; - this.type = ""; - this.placeholder = ""; - this.disabled = false; - this.dataset = {}; - this.isConnected = true; + (this as any).tagName = String(tagName || "").toUpperCase(); + (this as any).children = []; + (this as any).parentNode = null; + (this as any).className = ""; + (this as any).style = {}; + (this as any).attributes = new Map(); + (this as any).listeners = new Map(); + (this as any).textContent = ""; + (this as any).value = ""; + (this as any).type = ""; + (this as any).placeholder = ""; + (this as any).disabled = false; + (this as any).dataset = {}; + (this as any).isConnected = true; } appendChild(child) { child.parentNode = this; - this.children.push(child); + (this as any).children.push(child); return child; } removeChild(child) { - const index = this.children.indexOf(child); + const index = (this as any).children.indexOf(child); if (index >= 0) { - this.children.splice(index, 1); + (this as any).children.splice(index, 1); child.parentNode = null; } return child; } setAttribute(name, value) { - this.attributes.set(String(name), String(value)); + (this as any).attributes.set(String(name), String(value)); } getAttribute(name) { - return this.attributes.get(String(name)); + return (this as any).attributes.get(String(name)); } addEventListener(type, handler) { const key = String(type); - const handlers = this.listeners.get(key) || []; + const handlers = (this as any).listeners.get(key) || []; handlers.push(handler); - this.listeners.set(key, handlers); + (this as any).listeners.set(key, handlers); } dispatchEvent(event) { @@ -94,7 +94,7 @@ class ElementStub { }); payload.stopPropagation = payload.stopPropagation || (() => {}); - for (const handler of this.listeners.get(payload.type) || []) { + for (const handler of (this as any).listeners.get(payload.type) || []) { handler(payload); } return !payload.defaultPrevented; @@ -122,7 +122,7 @@ class ElementStub { } set innerHTML(_value) { - this.children = []; + (this as any).children = []; } } @@ -161,8 +161,8 @@ describe("TagsEditor", () => { eventsMock.safeDispatchCustomEvent.mockReset(); globalThis.document = { - createElement: vi.fn((tagName) => new ElementStub(tagName)), - }; + createElement: vi.fn((tagName) => new ElementStub(tagName)) as any, + } as any; }); afterEach(() => { @@ -179,7 +179,7 @@ describe("TagsEditor", () => { expect(asset.tags).toEqual(["Cat", "Dog"]); expect(editor.querySelectorAll(".mjr-tag-chip")).toHaveLength(2); - editor._mjrSetTags(["Bird", "bird", "Cat"]); + (editor as any)._mjrSetTags(["Bird", "bird", "Cat"]); expect(asset.tags).toEqual(["Bird", "Cat"]); expect(editor.querySelectorAll(".mjr-tag-chip")).toHaveLength(2); @@ -198,8 +198,8 @@ describe("TagsEditor", () => { const editor = createTagsEditor(asset, onUpdate); const input = editor.querySelector(".mjr-tag-input"); - input.value = "dog"; - input.dispatchEvent({ type: "keydown", key: "Enter" }); + (input as any).value = "dog"; + input.dispatchEvent({ type: "keydown", key: "Enter" } as any); await flushPromises(); expect(apiMock.updateAssetTags).toHaveBeenCalledTimes(1); @@ -212,8 +212,8 @@ describe("TagsEditor", () => { { warnPrefix: "[TagsEditor]" }, ); - input.value = "DOG"; - input.dispatchEvent({ type: "keydown", key: "Enter" }); + (input as any).value = "DOG"; + input.dispatchEvent({ type: "keydown", key: "Enter" } as any); await flushPromises(); expect(apiMock.updateAssetTags).toHaveBeenCalledTimes(1); @@ -231,8 +231,8 @@ describe("TagsEditor", () => { const editor = createTagsEditor(asset, vi.fn()); const input = editor.querySelector(".mjr-tag-input"); - input.value = "overflow"; - input.dispatchEvent({ type: "keydown", key: "Enter" }); + (input as any).value = "overflow"; + input.dispatchEvent({ type: "keydown", key: "Enter" } as any); await flushPromises(); expect(asset.tags).toHaveLength(50); diff --git a/ui/tests/toast.vitest.ts b/ui/tests/toast.vitest.ts index 3bf01137..7344b229 100644 --- a/ui/tests/toast.vitest.ts +++ b/ui/tests/toast.vitest.ts @@ -17,16 +17,16 @@ vi.mock("../app/i18n.js", () => ({ class MemoryStorage { constructor() { - this.store = new Map(); + (this as any).store = new Map(); } getItem(key) { - return this.store.has(key) ? this.store.get(key) : null; + return (this as any).store.has(key) ? (this as any).store.get(key) : null; } setItem(key, value) { - this.store.set(key, String(value)); + (this as any).store.set(key, String(value)); } clear() { - this.store.clear(); + (this as any).store.clear(); } } @@ -97,10 +97,10 @@ function installRuntimeGlobals() { const elementsById = new Map(); globalThis.document = { - body, - createElement: vi.fn((tag) => createElement(tag)), + body: body as any, + createElement: vi.fn((tag) => createElement(tag)) as any, getElementById: vi.fn((id) => elementsById.get(id) || null), - }; + } as any; const originalAppend = body.appendChild.bind(body); body.appendChild = (child) => { @@ -110,16 +110,16 @@ function installRuntimeGlobals() { return appended; }; - globalThis.window = new EventTarget(); - globalThis.localStorage = new MemoryStorage(); + globalThis.window = new EventTarget() as any; + globalThis.localStorage = new MemoryStorage() as any; globalThis.CustomEvent = class CustomEvent extends Event { constructor(type, init = {}) { super(type); - this.detail = init.detail; + (this as any).detail = (init as any).detail; } - }; + } as any; globalThis.requestAnimationFrame = (cb) => { - cb(); + (cb as any)(); return 1; }; } diff --git a/ui/tests/tooltip_shortcuts.vitest.ts b/ui/tests/tooltip_shortcuts.vitest.ts index b211c2a6..f2ce20c5 100644 --- a/ui/tests/tooltip_shortcuts.vitest.ts +++ b/ui/tests/tooltip_shortcuts.vitest.ts @@ -20,7 +20,7 @@ describe("tooltipShortcuts", () => { }, }; - const tooltip = setTooltipHint(button, "Close viewer", "Esc"); + const tooltip = setTooltipHint(button as any, "Close viewer", "Esc"); expect(tooltip).toBe("Close viewer (Esc)"); expect(button.title).toBe("Close viewer (Esc)"); diff --git a/ui/tests/topbar_mfv_button.vitest.ts b/ui/tests/topbar_mfv_button.vitest.ts index 44fe36a5..73d07fcd 100644 --- a/ui/tests/topbar_mfv_button.vitest.ts +++ b/ui/tests/topbar_mfv_button.vitest.ts @@ -24,7 +24,7 @@ describe("topBarMfvButton", () => { it("mounts after the queue group and toggles MFV without forcing live or preview", async () => { const actionbar = document.createElement("div"); actionbar.className = "actionbar-container"; - actionbar.getBoundingClientRect = () => ({ bottom: 88 }); + actionbar.getBoundingClientRect = () => ({ bottom: 88 }) as any; const queueGroup = document.createElement("div"); queueGroup.className = "queue-button-group"; @@ -52,7 +52,7 @@ describe("topBarMfvButton", () => { expect(slot.firstElementChild).toBe(host); expect(actionbar.lastElementChild).toBe(slot); - button.click(); + (button as any).click(); expect(dispatchSpy).toHaveBeenCalledWith( expect.objectContaining({ type: "mjr:mfv-toggle" }), @@ -70,7 +70,7 @@ describe("topBarMfvButton", () => { it("syncs pressed state from visibility events and fully tears down", async () => { const actionbar = document.createElement("div"); actionbar.className = "actionbar-container"; - actionbar.getBoundingClientRect = () => ({ bottom: 72 }); + actionbar.getBoundingClientRect = () => ({ bottom: 72 }) as any; document.body.appendChild(actionbar); const addSpy = vi.spyOn(window, "addEventListener"); @@ -111,7 +111,7 @@ describe("topBarMfvButton", () => { it("recreates a stable dedicated slot when the actionbar is rebuilt", async () => { const firstActionbar = document.createElement("div"); firstActionbar.className = "actionbar-container"; - firstActionbar.getBoundingClientRect = () => ({ bottom: 64 }); + firstActionbar.getBoundingClientRect = () => ({ bottom: 64 }) as any; document.body.appendChild(firstActionbar); const { mountTopBarMfvButton, teardownTopBarMfvButton } = @@ -126,7 +126,7 @@ describe("topBarMfvButton", () => { const secondActionbar = document.createElement("div"); secondActionbar.className = "actionbar-container"; - secondActionbar.getBoundingClientRect = () => ({ bottom: 96 }); + secondActionbar.getBoundingClientRect = () => ({ bottom: 96 }) as any; document.body.appendChild(secondActionbar); await Promise.resolve(); @@ -148,7 +148,7 @@ describe("topBarMfvButton", () => { it("mounts in the actionbar even when a nested queue group exists", async () => { const actionbar = document.createElement("div"); actionbar.className = "actionbar-container"; - actionbar.getBoundingClientRect = () => ({ bottom: 80 }); + actionbar.getBoundingClientRect = () => ({ bottom: 80 }) as any; const left = document.createElement("div"); left.className = "left items-center"; @@ -180,7 +180,7 @@ describe("topBarMfvButton", () => { it("keeps the slot as the last actionbar child after actionbar children change", async () => { const actionbar = document.createElement("div"); actionbar.className = "actionbar-container"; - actionbar.getBoundingClientRect = () => ({ bottom: 70 }); + actionbar.getBoundingClientRect = () => ({ bottom: 70 }) as any; const managerButton = document.createElement("button"); managerButton.type = "button"; @@ -225,7 +225,7 @@ describe("topBarMfvButton", () => { const actionbar = document.createElement("div"); actionbar.className = "actionbar-container"; - actionbar.getBoundingClientRect = () => ({ bottom: 74 }); + actionbar.getBoundingClientRect = () => ({ bottom: 74 }) as any; document.body.appendChild(actionbar); const { mountTopBarMfvButton, teardownTopBarMfvButton } = @@ -264,7 +264,7 @@ describe("topBarMfvButton", () => { it("does not toggle until the button click is committed", async () => { const actionbar = document.createElement("div"); actionbar.className = "actionbar-container"; - actionbar.getBoundingClientRect = () => ({ bottom: 88 }); + actionbar.getBoundingClientRect = () => ({ bottom: 88 }) as any; document.body.appendChild(actionbar); const dispatchSpy = vi.spyOn(window, "dispatchEvent"); @@ -296,7 +296,7 @@ describe("topBarMfvButton", () => { it("does not toggle when clicking the slot edge around the button", async () => { const actionbar = document.createElement("div"); actionbar.className = "actionbar-container"; - actionbar.getBoundingClientRect = () => ({ bottom: 88 }); + actionbar.getBoundingClientRect = () => ({ bottom: 88 }) as any; document.body.appendChild(actionbar); const dispatchSpy = vi.spyOn(window, "dispatchEvent"); diff --git a/ui/tests/ui_lifecycle_contract.vitest.ts b/ui/tests/ui_lifecycle_contract.vitest.ts index 9571f446..a0619c62 100644 --- a/ui/tests/ui_lifecycle_contract.vitest.ts +++ b/ui/tests/ui_lifecycle_contract.vitest.ts @@ -76,7 +76,7 @@ describe("mountKeepAlive — container styling", () => { const host = container.firstElementChild; expect(host).toBeTruthy(); - expect(host.dataset.mjrKeepAliveHost).toBe(KEY_A); + expect((host as any).dataset.mjrKeepAliveHost).toBe(KEY_A); }); }); diff --git a/ui/tests/ui_registration_lifecycle.vitest.ts b/ui/tests/ui_registration_lifecycle.vitest.ts index e11958a4..5dd13c1e 100644 --- a/ui/tests/ui_registration_lifecycle.vitest.ts +++ b/ui/tests/ui_registration_lifecycle.vitest.ts @@ -91,17 +91,17 @@ vi.mock("../app/bootstrap.js", () => ({ vi.mock("../app/config.js", async (importOriginal) => { const actual = await importOriginal(); return { - ...actual, - APP_CONFIG: { ...actual.APP_CONFIG, DEFAULT_PAGE_SIZE: 200 }, + ...(actual as any), + APP_CONFIG: { ...(actual as any).APP_CONFIG, DEFAULT_PAGE_SIZE: 200 }, }; }); vi.mock("../app/events.js", async (importOriginal) => { const actual = await importOriginal(); return { - ...actual, + ...(actual as any), EVENTS: { - ...actual.EVENTS, + ...(actual as any).EVENTS, OPEN_ASSETS_MANAGER: "mjr:open-assets-manager", RELOAD_GRID: "mjr:reload-grid", MFV_TOGGLE: "mjr:mfv-toggle", @@ -163,7 +163,7 @@ describe("render / destroy — keepalive contract", () => { tabDef.render(el); expect(mockMountKeepAlive).toHaveBeenCalledTimes(1); - expect(mockMountKeepAlive.mock.calls[0][0]).toBe(el); + expect((mockMountKeepAlive.mock.calls as any)[0][0]).toBe(el); }); it("destroy() is a no-op — does NOT call unmountKeepAlive", () => { @@ -187,7 +187,7 @@ describe("render / destroy — keepalive contract", () => { tabDef.destroy(el1); // no-op tabDef.render(el2); // re-render after tab switch - const [call1, call2] = mockMountKeepAlive.mock.calls; + const [call1, call2] = mockMountKeepAlive.mock.calls as any[]; expect(call1[2]).toBe(call2[2]); // same mount key both times }); @@ -253,7 +253,7 @@ describe("mountGlobalRuntime / teardownGlobalRuntime", () => { it("mountGlobalRuntime calls mountKeepAlive with the root element", () => { mountGlobalRuntime(); expect(mockMountKeepAlive).toHaveBeenCalledTimes(1); - const calledWithEl = mockMountKeepAlive.mock.calls[0][0]; + const calledWithEl = (mockMountKeepAlive.mock.calls as any)[0][0]; expect(calledWithEl?.id).toBe(ROOT_ID); }); @@ -316,9 +316,9 @@ describe("isMajoorTrackableNode — node classifier", () => { [undefined, false, "undefined node"], [{}, false, "empty object"], [{ comfyClass: "" }, false, "empty comfyClass"], - ])("(%s) → %s [%s]", (node, expected) => { + ])("(%s) → %s [%s]", ((node: any, expected: any) => { expect(isMajoorTrackableNode(node)).toBe(expected); - }); + }) as any); }); // ───────────────────────────────────────────────────────────────────────────── @@ -330,7 +330,7 @@ describe("native ComfyUI frontend registration payloads", () => { {}, { sidebarTabId: "majoor-assets", triggerStartupScan: vi.fn() }, ); - expect(commands.map((command) => command.id)).toEqual([ + expect(commands.map((command) => (command as any).id)).toEqual([ "mjr.openAssetsManager", "mjr.scanAssets", "mjr.toggleFloatingViewer", @@ -350,7 +350,7 @@ describe("native ComfyUI frontend registration payloads", () => { {}, { sidebarTabId: "majoor-assets", triggerStartupScan: vi.fn() }, ); - const byId = new Map(commands.map((command) => [command.id, command])); + const byId = new Map(commands.map((command) => [(command as any).id, command])); for (const id of [ "mjr.openNodeContext", @@ -360,9 +360,9 @@ describe("native ComfyUI frontend registration payloads", () => { "mjr.openGeneratedFeed", ]) { const command = byId.get(id); - expect(command.tooltip).toBeTruthy(); - expect(command.title).toBe(command.tooltip); - expect(command.description).toBe(command.tooltip); + expect((command as any).tooltip).toBeTruthy(); + expect((command as any).title).toBe((command as any).tooltip); + expect((command as any).description).toBe((command as any).tooltip); } }); @@ -385,8 +385,8 @@ describe("native ComfyUI frontend registration payloads", () => { registerNativeKeybindings(app); expect(mockRegisterKeybindingCompat).toHaveBeenCalledTimes(2); - expect(mockRegisterKeybindingCompat.mock.calls[0][0]).toBe(app); - expect(mockRegisterKeybindingCompat.mock.calls[0][1].commandId).toBe( + expect((mockRegisterKeybindingCompat.mock.calls as any)[0][0]).toBe(app); + expect((mockRegisterKeybindingCompat.mock.calls as any)[0][1].commandId).toBe( "mjr.openAssetsManager", ); }); @@ -394,11 +394,11 @@ describe("native ComfyUI frontend registration payloads", () => { it("builds topbar menu commands under Extensions / Majoor Assets Manager", () => { const menuCommands = buildNativeMenuCommands(); expect(menuCommands).toHaveLength(1); - expect(menuCommands[0].path).toEqual(["Extensions", "Majoor Assets Manager"]); - expect(menuCommands[0].commands).toContain("mjr.openSettings"); - expect(menuCommands[0].commands).toContain("mjr.openGeneratedFeed"); - expect(menuCommands[0].commands).toContain("mjr.pickOutputDirectory"); - expect(menuCommands[0].commands).toContain("mjr.pickIndexDirectory"); + expect((menuCommands[0] as any).path).toEqual(["Extensions", "Majoor Assets Manager"]); + expect((menuCommands[0] as any).commands).toContain("mjr.openSettings"); + expect((menuCommands[0] as any).commands).toContain("mjr.openGeneratedFeed"); + expect((menuCommands[0] as any).commands).toContain("mjr.pickOutputDirectory"); + expect((menuCommands[0] as any).commands).toContain("mjr.pickIndexDirectory"); }); it("builds official ComfyUI canvas context menu items with a declarative submenu", () => { @@ -409,8 +409,10 @@ describe("native ComfyUI frontend registration payloads", () => { ); expect(items[0]).toBeNull(); - expect(items[1].content).toBe("Majoor Assets Manager"); - expect(items[1].submenu.options.map((item) => item?.content).filter(Boolean)).toEqual([ + expect((items[1] as any).content).toBe("Majoor Assets Manager"); + expect( + (items[1] as any).submenu.options.map((item) => item?.content).filter(Boolean), + ).toEqual([ "Open Majoor Assets Manager", "Open floating viewer", "Open generated feed", diff --git a/ui/tests/use_assets_query.vitest.ts b/ui/tests/use_assets_query.vitest.ts index b5640a7f..740a8567 100644 --- a/ui/tests/use_assets_query.vitest.ts +++ b/ui/tests/use_assets_query.vitest.ts @@ -39,7 +39,7 @@ function createInputElement(initialValue = "") { class InputStub extends EventTarget { constructor(value = "") { super(); - this.value = value; + (this as any).value = value; } } return new InputStub(initialValue); @@ -50,12 +50,12 @@ describe("useAssetsQuery", () => { vi.clearAllMocks(); globalThis.CustomEvent = globalThis.CustomEvent || - class extends Event { + (class extends Event { constructor(type, init = {}) { super(type); - this.detail = init.detail; + (this as any).detail = (init as any).detail; } - }; + } as any); }); afterEach(() => { @@ -145,7 +145,7 @@ describe("useAssetsQuery", () => { const previousRaf = globalThis.requestAnimationFrame; globalThis.requestAnimationFrame = (callback) => { - callback(); + (callback as any)(); return 1; }; @@ -234,7 +234,7 @@ describe("useAssetsQuery", () => { }); const gridContainer = createGridContainer(); - gridContainer._mjrGetGridState = vi.fn(() => ({ loading: true, assets: [] })); + (gridContainer as any)._mjrGetGridState = vi.fn(() => ({ loading: true, assets: [] })); const loadAssets = vi.fn(async () => ({ ok: true })); const controller = createAssetsQueryController({ @@ -542,7 +542,7 @@ describe("useAssetsQuery", () => { reloadGrid, }); - searchInputEl.value = "dragon"; + (searchInputEl as any).value = "dragon"; searchInputEl.dispatchEvent(new Event("input")); expect(onQueryChanged).toHaveBeenCalledTimes(1); expect(reloadGrid).toHaveBeenCalledTimes(0); @@ -552,7 +552,7 @@ describe("useAssetsQuery", () => { expect(onBeforeReload).toHaveBeenCalledTimes(1); expect(reloadGrid).toHaveBeenCalledTimes(1); - searchInputEl.value = ""; + (searchInputEl as any).value = ""; searchInputEl.dispatchEvent(new Event("input")); expect(startSearchTimer).toHaveBeenCalledTimes(2); expect(onBeforeReload).toHaveBeenCalledTimes(2); diff --git a/ui/tests/use_grid_display_assets.vitest.ts b/ui/tests/use_grid_display_assets.vitest.ts index 71892b47..4a544470 100644 --- a/ui/tests/use_grid_display_assets.vitest.ts +++ b/ui/tests/use_grid_display_assets.vitest.ts @@ -27,10 +27,10 @@ describe("useGridDisplayAssets", () => { const output = buildDisplayAssets([first, second, third]); expect(output).toEqual([first, third]); - expect(first._mjrDupStack).toBe(true); - expect(first._mjrDupMembers.map((asset) => asset.id)).toEqual([1, 2]); - expect(second._mjrDupStack).toBe(false); - expect(third._mjrDupStack).toBe(false); + expect((first as any)._mjrDupStack).toBe(true); + expect((first as any)._mjrDupMembers.map((asset) => asset.id)).toEqual([1, 2]); + expect((second as any)._mjrDupStack).toBe(false); + expect((third as any)._mjrDupStack).toBe(false); }); it("rebuilds duplicate members from the current asset list only", () => { @@ -45,7 +45,7 @@ describe("useGridDisplayAssets", () => { buildDisplayAssets([first, second]); expect(first._mjrDupMembers.map((asset) => asset.id)).toEqual([1, 2]); - expect(first._mjrDupCount).toBe(2); + expect((first as any)._mjrDupCount).toBe(2); }); it("ignores stale duplicate-hidden flags left on asset objects", () => { diff --git a/ui/tests/use_grid_keyboard.vitest.ts b/ui/tests/use_grid_keyboard.vitest.ts index c9d64fff..b0cba89e 100644 --- a/ui/tests/use_grid_keyboard.vitest.ts +++ b/ui/tests/use_grid_keyboard.vitest.ts @@ -30,7 +30,7 @@ describe("useGridKeyboard", () => { _mjrOpenKeyboardDetails: vi.fn(), }; - const dispose = bindLegacyGridKeyboard(container); + const dispose = bindLegacyGridKeyboard(container as any); expect(keyboardState.installGridKeyboard).toHaveBeenCalledWith( expect.objectContaining({ @@ -43,7 +43,7 @@ describe("useGridKeyboard", () => { }), ); expect(keyboard.bind).toHaveBeenCalledTimes(1); - expect(container._mjrGridKeyboard).toBe(keyboard); + expect((container as any)._mjrGridKeyboard).toBe(keyboard); const options = keyboardState.installGridKeyboard.mock.calls[0][0]; expect(options.getState()).toEqual({ assets: [{ id: 1 }] }); @@ -61,6 +61,6 @@ describe("useGridKeyboard", () => { dispose(); expect(keyboard.dispose).toHaveBeenCalledTimes(1); - expect(container._mjrGridKeyboard).toBeNull(); + expect((container as any)._mjrGridKeyboard).toBeNull(); }); }); diff --git a/ui/tests/use_grid_query.vitest.ts b/ui/tests/use_grid_query.vitest.ts index edf26e79..df7dc1df 100644 --- a/ui/tests/use_grid_query.vitest.ts +++ b/ui/tests/use_grid_query.vitest.ts @@ -112,8 +112,8 @@ describe("useGridQuery helpers", () => { }; expect(readGridQueryFromElement(element)).toMatchObject({ q: "fox", sort: "name_desc" }); - expect(readGridQueryText(element, "*")).toBe("fox"); - expect(readGridSortKey(element, "mtime_desc")).toBe("name_desc"); + expect(readGridQueryText((element as any), "*")).toBe("fox"); + expect(readGridSortKey((element as any), "mtime_desc")).toBe("name_desc"); expect(readGridQueryText(null, "fallback")).toBe("fallback"); }); diff --git a/ui/tests/use_grid_selection.vitest.ts b/ui/tests/use_grid_selection.vitest.ts index e3e2e903..d5244a86 100644 --- a/ui/tests/use_grid_selection.vitest.ts +++ b/ui/tests/use_grid_selection.vitest.ts @@ -5,9 +5,9 @@ function createGridContainer() { return { dataset: {}, children: [], - addEventListener: (...args) => bus.addEventListener(...args), - removeEventListener: (...args) => bus.removeEventListener(...args), - dispatchEvent: (...args) => bus.dispatchEvent(...args), + addEventListener: (...args: any[]) => (bus.addEventListener as any)(...args), + removeEventListener: (...args: any[]) => (bus.removeEventListener as any)(...args), + dispatchEvent: (...args: any[]) => (bus.dispatchEvent as any)(...args), appendChild(child) { this.children.push(child); }, @@ -31,12 +31,12 @@ describe("useGridSelection", () => { vi.restoreAllMocks(); globalThis.CustomEvent = globalThis.CustomEvent || - class extends Event { + (class extends Event { constructor(type, init = {}) { super(type); - this.detail = init.detail; + (this as any).detail = (init as any).detail; } - }; + } as any); }); it("syncs selection events back to panel state writers", async () => { @@ -77,8 +77,8 @@ describe("useGridSelection", () => { const { bindGridSelectionState } = await import("../vue/composables/useGridSelection.js"); const gridContainer = createGridContainer(); - gridContainer._mjrSetSelection = vi.fn(); - gridContainer._mjrScrollToAssetId = vi.fn(); + (gridContainer as any)._mjrSetSelection = vi.fn(); + (gridContainer as any)._mjrScrollToAssetId = vi.fn(); const binding = bindGridSelectionState({ gridContainer, @@ -88,11 +88,11 @@ describe("useGridSelection", () => { binding.restoreSelectionState({ scrollTop: 0 }); - expect(gridContainer._mjrSetSelection).toHaveBeenCalledWith( + expect((gridContainer as any)._mjrSetSelection).toHaveBeenCalledWith( ["asset-1", "asset-2"], "asset-2", ); - expect(gridContainer._mjrScrollToAssetId).toHaveBeenCalledWith("asset-2"); + expect((gridContainer as any)._mjrScrollToAssetId).toHaveBeenCalledWith("asset-2"); }); it("falls back to scrolling the matching DOM card into view when needed", async () => { diff --git a/ui/tests/use_grid_snapshot_cache.vitest.ts b/ui/tests/use_grid_snapshot_cache.vitest.ts index 95ab99a4..8824a0e2 100644 --- a/ui/tests/use_grid_snapshot_cache.vitest.ts +++ b/ui/tests/use_grid_snapshot_cache.vitest.ts @@ -24,8 +24,8 @@ describe("useGridSnapshotCache", () => { beforeEach(() => { vi.useRealTimers(); resetGridSnapshotCacheForTests(); - globalThis.localStorage = makeStorage(); - globalThis.sessionStorage = makeStorage(); + globalThis.localStorage = makeStorage() as any; + globalThis.sessionStorage = makeStorage() as any; }); it("builds stable keys compatible with existing snapshot inputs", () => { diff --git a/ui/tests/use_grid_state.vitest.ts b/ui/tests/use_grid_state.vitest.ts index 3452f9f4..a0dc5db2 100644 --- a/ui/tests/use_grid_state.vitest.ts +++ b/ui/tests/use_grid_state.vitest.ts @@ -3,7 +3,7 @@ import { describe, expect, it, vi, beforeEach } from "vitest"; vi.mock("vue", async (importOriginal) => { const actual = await importOriginal(); return { - ...actual, + ...(actual as any), }; }); diff --git a/ui/tests/video_controls_audio.vitest.ts b/ui/tests/video_controls_audio.vitest.ts index b3e61901..9d029c99 100644 --- a/ui/tests/video_controls_audio.vitest.ts +++ b/ui/tests/video_controls_audio.vitest.ts @@ -8,8 +8,8 @@ vi.mock("../app/i18n.js", () => ({ describe("audio viewer controls", () => { it("uses the advanced viewer controls for audio media without frame-step controls", async () => { const window = new Window(); - globalThis.window = window; - globalThis.document = window.document; + globalThis.window = window as any; + globalThis.document = window.document as any; Object.defineProperty(globalThis, "navigator", { configurable: true, value: window.navigator, @@ -45,18 +45,18 @@ describe("audio viewer controls", () => { expect(mounted.controlsEl.querySelector(".mjr-video-btn--mark")).toBeTruthy(); expect(mounted.controlsEl.querySelector(".mjr-video-seek-mark")).toBeTruthy(); expect(mounted.controlsEl.querySelector(".mjr-video-seek-handle")).toBeTruthy(); - expect(mounted.setInPoint()).toBe(true); - expect(mounted.setOutPoint()).toBe(true); - expect(mounted.goToIn()).toBe(true); - expect(mounted.goToOut()).toBe(true); + expect((mounted as any).setInPoint()).toBe(true); + expect((mounted as any).setOutPoint()).toBe(true); + expect((mounted as any).goToIn()).toBe(true); + expect((mounted as any).goToOut()).toBe(true); mounted.destroy(); }); it("renders a time ruler for audio media", async () => { const window = new Window(); - globalThis.window = window; - globalThis.document = window.document; + globalThis.window = window as any; + globalThis.document = window.document as any; Object.defineProperty(globalThis, "navigator", { configurable: true, value: window.navigator, @@ -80,14 +80,16 @@ describe("audio viewer controls", () => { hostEl: host, }); - audio.dispatchEvent(new window.Event("loadedmetadata")); + audio.dispatchEvent(new window.Event("loadedmetadata") as any); const tickBar = mounted.controlsEl.querySelector(".mjr-video-seek-ticks"); const labels = [...mounted.controlsEl.querySelectorAll(".mjr-video-seek-label")].map( (label) => label.textContent, ); - expect(tickBar?.style.backgroundImage || "").toContain("repeating-linear-gradient"); + expect((tickBar as any)?.style.backgroundImage || "").toContain( + "repeating-linear-gradient", + ); expect(labels[0]).toBe("0:00"); expect(labels).toContain("2:05"); expect(mounted.controlsEl.querySelector(".mjr-video-seek-mark")).toBeTruthy(); @@ -98,8 +100,8 @@ describe("audio viewer controls", () => { it("keeps the viewerbar frame readout aligned with actual video frames", async () => { const window = new Window(); - globalThis.window = window; - globalThis.document = window.document; + globalThis.window = window as any; + globalThis.document = window.document as any; Object.defineProperty(globalThis, "navigator", { configurable: true, value: window.navigator, @@ -145,7 +147,7 @@ describe("audio viewer controls", () => { }); paused = false; - video.dispatchEvent(new window.Event("play")); + video.dispatchEvent(new window.Event("play") as any); currentTime = 0.5 / 24; rvfcCallback?.(0, { mediaTime: currentTime }); @@ -166,8 +168,8 @@ describe("audio viewer controls", () => { it("expands the frame stepping range when the real frame count arrives after metadata load", async () => { const window = new Window(); - globalThis.window = window; - globalThis.document = window.document; + globalThis.window = window as any; + globalThis.document = window.document as any; Object.defineProperty(globalThis, "navigator", { configurable: true, value: window.navigator, @@ -200,9 +202,9 @@ describe("audio viewer controls", () => { hostEl: host, }); - video.dispatchEvent(new window.Event("loadedmetadata")); - mounted.setMediaInfo({ frameCount: 41 }); - mounted.goToOut(); + video.dispatchEvent(new window.Event("loadedmetadata") as any); + (mounted as any).setMediaInfo({ frameCount: 41 }); + (mounted as any).goToOut(); const frameLabel = mounted.controlsEl.querySelector(".mjr-video-frame"); expect(frameLabel?.textContent || "").toContain("F: 41 / 41"); diff --git a/ui/tests/video_controls_fps_override.vitest.ts b/ui/tests/video_controls_fps_override.vitest.ts index c2b35889..02514c6a 100644 --- a/ui/tests/video_controls_fps_override.vitest.ts +++ b/ui/tests/video_controls_fps_override.vitest.ts @@ -38,16 +38,16 @@ describe("VideoControls FPS override state", () => { expect(Number(fpsInput?.value)).toBeCloseTo(23.976, 3); fpsInput!.value = "12"; - fpsInput!.dispatchEvent(new window.Event("change", { bubbles: true })); + fpsInput!.dispatchEvent(new window.Event("change", { bubbles: true }) as any); expect(fpsInput?.classList.contains("is-overridden")).toBe(true); expect(fpsInput?.value).toBe("12"); - mounted.setMediaInfo?.({ fps: 24 }); + (mounted as any).setMediaInfo?.({ fps: 24 }); expect(fpsInput?.classList.contains("is-overridden")).toBe(true); expect(fpsInput?.value).toBe("12"); fpsInput!.value = "24"; - fpsInput!.dispatchEvent(new window.Event("change", { bubbles: true })); + fpsInput!.dispatchEvent(new window.Event("change", { bubbles: true }) as any); expect(fpsInput?.classList.contains("is-overridden")).toBe(false); mounted.destroy(); @@ -86,7 +86,7 @@ describe("VideoControls FPS override state", () => { ) as HTMLInputElement | null; expect(fpsInput?.value).toBe("25"); - mounted.setMediaInfo?.({ fps: 17.321, fpsSource: "rvfc" }); + (mounted as any).setMediaInfo?.({ fps: 17.321, fpsSource: "rvfc" }); expect(fpsInput?.value).toBe("25"); expect(fpsInput?.classList.contains("is-overridden")).toBe(false); diff --git a/ui/tests/video_controls_responsive_layout.vitest.ts b/ui/tests/video_controls_responsive_layout.vitest.ts index 4da2762e..d52a1bcf 100644 --- a/ui/tests/video_controls_responsive_layout.vitest.ts +++ b/ui/tests/video_controls_responsive_layout.vitest.ts @@ -8,8 +8,8 @@ vi.mock("../app/i18n.js", () => ({ describe("video controls responsive layout", () => { it("switches to stacked layout when the host is narrow", async () => { const window = new Window(); - globalThis.window = window; - globalThis.document = window.document; + globalThis.window = window as any; + globalThis.document = window.document as any; Object.defineProperty(globalThis, "navigator", { configurable: true, value: window.navigator, @@ -18,12 +18,12 @@ describe("video controls responsive layout", () => { const resizeObservers = []; globalThis.ResizeObserver = class { constructor(cb) { - this.cb = cb; + (this as any).cb = cb; resizeObservers.push(this); } observe() {} disconnect() {} - }; + } as any; const { mountVideoControls } = await import("../components/VideoControls.js"); diff --git a/ui/tests/video_controls_seek_drag.vitest.ts b/ui/tests/video_controls_seek_drag.vitest.ts index 279f6f27..33b28419 100644 --- a/ui/tests/video_controls_seek_drag.vitest.ts +++ b/ui/tests/video_controls_seek_drag.vitest.ts @@ -21,8 +21,8 @@ function makePointerEvent(window, type, props = {}) { describe("video controls seek drag", () => { it("lets the MFV timeline scrub freely without playback sync overwriting the drag", async () => { const window = new Window(); - globalThis.window = window; - globalThis.document = window.document; + globalThis.window = window as any; + globalThis.document = window.document as any; Object.defineProperty(globalThis, "navigator", { configurable: true, value: window.navigator, @@ -56,7 +56,7 @@ describe("video controls seek drag", () => { const seekWrap = mounted.controlsEl.querySelector(".mjr-video-seek-wrap"); const seek = mounted.controlsEl.querySelector(".mjr-video-range--seek"); - seekWrap.getBoundingClientRect = () => ({ left: 10, width: 100 }); + seekWrap.getBoundingClientRect = () => ({ left: 10, width: 100 }) as any; seekWrap.dispatchEvent( makePointerEvent(window, "pointerdown", { @@ -68,11 +68,11 @@ describe("video controls seek drag", () => { ); expect(currentTime).toBeCloseTo(5, 5); - expect(seek.value).toBe("500"); + expect((seek as any).value).toBe("500"); currentTime = 1; - video.dispatchEvent(new window.Event("timeupdate")); - expect(seek.value).toBe("500"); + video.dispatchEvent(new window.Event("timeupdate") as any); + expect((seek as any).value).toBe("500"); window.dispatchEvent( makePointerEvent(window, "pointermove", { @@ -83,7 +83,7 @@ describe("video controls seek drag", () => { ); expect(currentTime).toBeCloseTo(9, 5); - expect(seek.value).toBe("900"); + expect((seek as any).value).toBe("900"); window.dispatchEvent( makePointerEvent(window, "pointerup", { @@ -94,16 +94,16 @@ describe("video controls seek drag", () => { ); currentTime = 2; - video.dispatchEvent(new window.Event("timeupdate")); - expect(seek.value).toBe("200"); + video.dispatchEvent(new window.Event("timeupdate") as any); + expect((seek as any).value).toBe("200"); mounted.destroy(); }); it("uses frame-count seek precision when metadata exceeds the legacy 1000-step range", async () => { const window = new Window(); - globalThis.window = window; - globalThis.document = window.document; + globalThis.window = window as any; + globalThis.document = window.document as any; Object.defineProperty(globalThis, "navigator", { configurable: true, value: window.navigator, @@ -139,13 +139,13 @@ describe("video controls seek drag", () => { const seek = mounted.controlsEl.querySelector(".mjr-video-range--seek"); currentTime = 30; - video.dispatchEvent(new window.Event("timeupdate")); + video.dispatchEvent(new window.Event("timeupdate") as any); - expect(seek.max).toBe("1800"); - expect(seek.value).toBe("900"); + expect((seek as any).max).toBe("1800"); + expect((seek as any).value).toBe("900"); - seek.value = "901"; - seek.dispatchEvent(new window.Event("input", { bubbles: true, cancelable: true })); + (seek as any).value = "901"; + seek.dispatchEvent(new window.Event("input", { bubbles: true, cancelable: true }) as any); expect(currentTime).toBeCloseTo((901 / 1800) * 60, 5); diff --git a/ui/tests/video_sync.vitest.ts b/ui/tests/video_sync.vitest.ts index 572015bf..33a2d9e6 100644 --- a/ui/tests/video_sync.vitest.ts +++ b/ui/tests/video_sync.vitest.ts @@ -89,7 +89,7 @@ describe("video sync", () => { const follower = makeMedia({ currentTime: 0, paused: false }); installFollowerVideoSync(leader, [follower], { threshold: 0.01 }); - follower.pause.mockClear(); + (follower.pause as any).mockClear(); leader.pause(); @@ -116,7 +116,7 @@ describe("video sync", () => { expect(follower.currentTime).toBeCloseTo(1.25, 5); expect(globalThis.requestAnimationFrame).toHaveBeenCalled(); - ac.abort(); + (ac as any).abort(); expect(globalThis.cancelAnimationFrame).toHaveBeenCalled(); }); }); diff --git a/ui/tests/viewer_ab_compare.vitest.ts b/ui/tests/viewer_ab_compare.vitest.ts index 4ce1fead..b4059bbe 100644 --- a/ui/tests/viewer_ab_compare.vitest.ts +++ b/ui/tests/viewer_ab_compare.vitest.ts @@ -25,18 +25,18 @@ function createMediaWithCanvas(canvas) { describe("viewer A/B compare", () => { beforeEach(() => { - globalThis.HTMLCanvasElement = CanvasMock; - globalThis.performance = { now: () => 1000 }; + globalThis.HTMLCanvasElement = CanvasMock as any; + globalThis.performance = { now: () => 1000 } as any; globalThis.requestAnimationFrame = (callback) => { - callback(); + (callback as any)(); return 1; }; globalThis.cancelAnimationFrame = vi.fn(); globalThis.window = { addEventListener: vi.fn(), removeEventListener: vi.fn(), - CSS: { supports: vi.fn(() => false) }, - }; + CSS: { supports: vi.fn(() => false) } as any, + } as any; }); it("renders subtract mode from both source canvases and restores context", async () => { @@ -79,8 +79,8 @@ describe("viewer A/B compare", () => { addEventListener: vi.fn(), setAttribute: vi.fn(), }; - }), - }; + }) as any, + } as any; const baseCanvas = createSourceCanvas([ 200, 150, 100, 255, 120, 90, 60, 255, 180, 140, 90, 255, 90, 70, 40, 255, diff --git a/ui/tests/viewer_compare_audio.vitest.ts b/ui/tests/viewer_compare_audio.vitest.ts index 191fdca4..c6f55885 100644 --- a/ui/tests/viewer_compare_audio.vitest.ts +++ b/ui/tests/viewer_compare_audio.vitest.ts @@ -28,14 +28,14 @@ describe("viewer compare audio safety", () => { setAttribute: vi.fn(), addEventListener: vi.fn(), remove: vi.fn(), - })), - }; + })) as any, + } as any; globalThis.window = { addEventListener: vi.fn(), removeEventListener: vi.fn(), - CSS: { supports: vi.fn(() => false) }, - }; - globalThis.HTMLCanvasElement = class {}; + CSS: { supports: vi.fn(() => false) } as any, + } as any; + globalThis.HTMLCanvasElement = class {} as any; }); it("mutes the secondary audio track in A/B compare", async () => { @@ -60,9 +60,9 @@ describe("viewer compare audio safety", () => { destroyMediaProcessorsIn: vi.fn(), }); - expect(a.audio.dataset.mjrCompareRole).toBe("A"); + expect((a.audio.dataset as any).mjrCompareRole).toBe("A"); expect(a.audio.muted).toBe(false); - expect(b.audio.dataset.mjrCompareRole).toBe("B"); + expect((b.audio.dataset as any).mjrCompareRole).toBe("B"); expect(b.audio.muted).toBe(true); expect(b.audio.pause).toHaveBeenCalledTimes(1); }); @@ -94,9 +94,9 @@ describe("viewer compare audio safety", () => { destroyMediaProcessorsIn: vi.fn(), }); - expect(a.audio.dataset.mjrCompareRole).toBe("A"); + expect((a.audio.dataset as any).mjrCompareRole).toBe("A"); expect(a.audio.muted).toBe(false); - expect(b.audio.dataset.mjrCompareRole).toBe("B"); + expect((b.audio.dataset as any).mjrCompareRole).toBe("B"); expect(b.audio.muted).toBe(true); expect(b.audio.pause).toHaveBeenCalledTimes(1); }); diff --git a/ui/tests/viewer_context_menu_vue.vitest.ts b/ui/tests/viewer_context_menu_vue.vitest.ts index 045eacae..733fb790 100644 --- a/ui/tests/viewer_context_menu_vue.vitest.ts +++ b/ui/tests/viewer_context_menu_vue.vitest.ts @@ -45,9 +45,9 @@ function ensureCustomEvent() { globalThis.CustomEvent = class CustomEvent extends Event { constructor(type, init = {}) { super(type, init); - this.detail = init.detail; + (this as any).detail = (init as any).detail; } - }; + } as any; } function resetViewerContextState(state, helpers) { diff --git a/ui/tests/viewer_keyboard.vitest.ts b/ui/tests/viewer_keyboard.vitest.ts index 4dea45bc..b618928f 100644 --- a/ui/tests/viewer_keyboard.vitest.ts +++ b/ui/tests/viewer_keyboard.vitest.ts @@ -38,7 +38,7 @@ function createWindowMock() { }, dispatch(type, event) { for (const handler of Array.from(listeners.get(type) || [])) { - handler(event); + (handler as any)(event); } }, }; @@ -72,12 +72,12 @@ function createPlayerbarInputEvent(key) { describe("viewer keyboard", () => { beforeEach(() => { const windowMock = createWindowMock(); - globalThis.window = windowMock; + globalThis.window = windowMock as any; globalThis.document = { fullscreenElement: null, exitFullscreen: vi.fn(), activeElement: null, - }; + } as any; Object.defineProperty(globalThis, "navigator", { configurable: true, value: { clipboard: { writeText: vi.fn() } }, @@ -122,12 +122,12 @@ describe("viewer keyboard", () => { }); keyboard.bind(); - window.dispatch("keydown", createKeyboardEvent("x")); + (window as any).dispatch("keydown", createKeyboardEvent("x")); expect(state.distractionFree).toBe(true); expect(applyDistractionFreeUI).toHaveBeenCalledTimes(1); keyboard.unbind(); - window.dispatch("keydown", createKeyboardEvent("x")); + (window as any).dispatch("keydown", createKeyboardEvent("x")); expect(state.distractionFree).toBe(true); expect(applyDistractionFreeUI).toHaveBeenCalledTimes(1); expect(closeViewer).not.toHaveBeenCalled(); @@ -169,11 +169,11 @@ describe("viewer keyboard", () => { }); keyboard.bind(); - window.dispatch("keydown", createKeyboardEvent("Escape")); + (window as any).dispatch("keydown", createKeyboardEvent("Escape")); expect(closeViewer).toHaveBeenCalledTimes(1); keyboard.unbind(); - window.dispatch("keydown", createKeyboardEvent("Escape")); + (window as any).dispatch("keydown", createKeyboardEvent("Escape")); expect(closeViewer).toHaveBeenCalledTimes(1); }); @@ -214,8 +214,8 @@ describe("viewer keyboard", () => { }); keyboard.bind(); - window.dispatch("keydown", createPlayerbarInputEvent("ArrowRight")); - window.dispatch("keydown", createPlayerbarInputEvent(" ")); + (window as any).dispatch("keydown", createPlayerbarInputEvent("ArrowRight")); + (window as any).dispatch("keydown", createPlayerbarInputEvent(" ")); expect(stepFrames).toHaveBeenCalledWith(1); expect(togglePlay).toHaveBeenCalledTimes(1); diff --git a/ui/tests/viewer_panzoom_performance.vitest.ts b/ui/tests/viewer_panzoom_performance.vitest.ts index 68da9b1a..5e8cc4a8 100644 --- a/ui/tests/viewer_panzoom_performance.vitest.ts +++ b/ui/tests/viewer_panzoom_performance.vitest.ts @@ -69,7 +69,7 @@ describe("viewer panzoom performance", () => { height: 600, right: 800, bottom: 600, - })); + })) as any; media.className = "mjr-viewer-media"; media._mjrNaturalW = 1600; media._mjrNaturalH = 900; diff --git a/ui/tests/viewer_player_bar_fps_sync.vitest.ts b/ui/tests/viewer_player_bar_fps_sync.vitest.ts index a6b4b369..f98c7af9 100644 --- a/ui/tests/viewer_player_bar_fps_sync.vitest.ts +++ b/ui/tests/viewer_player_bar_fps_sync.vitest.ts @@ -28,7 +28,7 @@ describe("playerBarManager FPS sync", () => { globalThis.window = { addEventListener: vi.fn(), removeEventListener: vi.fn(), - }; + } as any; globalThis.requestAnimationFrame = vi.fn(() => 1); state = { assets: [createAsset(1001, "25/2"), createAsset(1002, "25/1")], @@ -202,7 +202,7 @@ describe("playerBarManager FPS sync", () => { fpsHandler = handler; }), removeEventListener: vi.fn(), - }; + } as any; state.nativeFps = 25; const mounted = { destroy: vi.fn(), diff --git a/ui/tests/viewer_runtime_hosts.vitest.ts b/ui/tests/viewer_runtime_hosts.vitest.ts index 069024fc..b1d0c7d8 100644 --- a/ui/tests/viewer_runtime_hosts.vitest.ts +++ b/ui/tests/viewer_runtime_hosts.vitest.ts @@ -6,15 +6,15 @@ describe("viewerRuntimeHosts", () => { globalThis.document = { body: { appendChild: vi.fn(), - querySelectorAll: vi.fn(() => []), + querySelectorAll: vi.fn(() => []) as any, isConnected: true, - }, + } as any, documentElement: { appendChild: vi.fn(), - querySelectorAll: vi.fn(() => []), + querySelectorAll: vi.fn(() => []) as any, isConnected: true, - }, - }; + } as any, + } as any; }); it("appends the floating viewer to document.body even when a Vue host is registered", async () => { diff --git a/ui/tests/viewer_toolbar.vitest.ts b/ui/tests/viewer_toolbar.vitest.ts index dfc2cdfb..e7ec634f 100644 --- a/ui/tests/viewer_toolbar.vitest.ts +++ b/ui/tests/viewer_toolbar.vitest.ts @@ -11,8 +11,8 @@ vi.mock("../app/i18n.js", () => ({ describe("viewer toolbar", () => { it("reset restores all viewer tool defaults", async () => { const window = new Window(); - globalThis.window = window; - globalThis.document = window.document; + globalThis.window = window as any; + globalThis.document = window.document as any; Object.defineProperty(globalThis, "navigator", { configurable: true, value: window.navigator, @@ -63,12 +63,12 @@ describe("viewer toolbar", () => { toolbar.syncToolsUIFromState(); const resetButton = Array.from(toolbar.headerEl.querySelectorAll("button")).find( - (button) => (button.textContent || "").trim() === "Reset", + (button) => ((button as any).textContent || "").trim() === "Reset", ); expect(resetButton).toBeTruthy(); - resetButton.click(); + (resetButton as any).click(); expect(state.channel).toBe("rgb"); expect(state.exposureEV).toBe(0); diff --git a/ui/tests/workflow_api_client.vitest.ts b/ui/tests/workflow_api_client.vitest.ts index 3acaea5c..4d69a307 100644 --- a/ui/tests/workflow_api_client.vitest.ts +++ b/ui/tests/workflow_api_client.vitest.ts @@ -20,21 +20,21 @@ function makeStorage() { describe("workflow api client", () => { beforeEach(() => { vi.resetModules(); - globalThis.localStorage = makeStorage(); - globalThis.sessionStorage = makeStorage(); + globalThis.localStorage = (makeStorage() as any); + globalThis.sessionStorage = (makeStorage() as any); globalThis.app = { ui: {}, extensionManager: { toast: { add: vi.fn() } } }; - globalThis.window = { + globalThis.window = ({ addEventListener: vi.fn(), removeEventListener: vi.fn(), dispatchEvent: vi.fn(), - location: { origin: "http://localhost" }, + location: ({ origin: "http://localhost" } as any), app: globalThis.app, - }; - globalThis.fetch = vi.fn(async () => ({ + } as any); + globalThis.fetch = (vi.fn(async () => ({ status: 200, headers: { get: (name) => (name === "content-type" ? "application/json" : null) }, json: async () => ({ ok: true, data: {} }), - })); + })) as any); }); afterEach(() => { @@ -70,45 +70,45 @@ describe("workflow api client", () => { }); it("posts mark-loaded to the dedicated endpoint", async () => { - globalThis.fetch = vi.fn(async () => ({ + globalThis.fetch = (vi.fn(async () => ({ status: 200, headers: { get: (name) => (name === "content-type" ? "application/json" : null) }, json: async () => ({ ok: true, data: { updated: true } }), - })); + })) as any); const client = await import("../api/client.js"); const result = await client.markWorkflowLoaded({ filepath: "C:/tmp/wf.json" }); expect(result.ok).toBe(true); - const markLoadedCall = globalThis.fetch.mock.calls.find(([url]) => + const markLoadedCall = (globalThis.fetch as any).mock.calls.find(([url]) => String(url).includes("/mjr/am/workflows/mark-loaded"), ); expect(markLoadedCall).toBeTruthy(); }); it("fetches workflow validation diagnostics", async () => { - globalThis.fetch = vi.fn(async () => ({ + globalThis.fetch = (vi.fn(async () => ({ status: 200, headers: { get: (name) => (name === "content-type" ? "application/json" : null) }, json: async () => ({ ok: true, data: { valid: true, required_nodes: [] } }), - })); + })) as any); const client = await import("../api/client.js"); const result = await client.validateWorkflow("C:/tmp/wf.json"); expect(result.ok).toBe(true); - const validateCall = globalThis.fetch.mock.calls.find(([url]) => + const validateCall = (globalThis.fetch as any).mock.calls.find(([url]) => String(url).includes("/mjr/am/workflows/validate"), ); expect(validateCall).toBeTruthy(); }); it("fetches workflow versions and diff", async () => { - globalThis.fetch = vi.fn(async () => ({ + globalThis.fetch = (vi.fn(async () => ({ status: 200, headers: { get: (name) => (name === "content-type" ? "application/json" : null) }, json: async () => ({ ok: true, data: { versions: [], changed: [] } }), - })); + })) as any); const client = await import("../api/client.js"); const versions = await client.listWorkflowVersions("C:/tmp/wf.json"); @@ -116,84 +116,84 @@ describe("workflow api client", () => { expect(versions.ok).toBe(true); expect(diff.ok).toBe(true); - expect(globalThis.fetch.mock.calls.some(([url]) => String(url).includes("/mjr/am/workflows/versions"))).toBe(true); - expect(globalThis.fetch.mock.calls.some(([url]) => String(url).includes("/mjr/am/workflows/diff"))).toBe(true); + expect((globalThis.fetch as any).mock.calls.some(([url]) => String(url).includes("/mjr/am/workflows/versions"))).toBe(true); + expect((globalThis.fetch as any).mock.calls.some(([url]) => String(url).includes("/mjr/am/workflows/diff"))).toBe(true); }); it("posts favorite to the dedicated endpoint", async () => { - globalThis.fetch = vi.fn(async () => ({ + globalThis.fetch = (vi.fn(async () => ({ status: 200, headers: { get: (name) => (name === "content-type" ? "application/json" : null) }, json: async () => ({ ok: true, data: { updated: true, favorite: true } }), - })); + })) as any); const client = await import("../api/client.js"); const result = await client.setWorkflowFavorite({ filepath: "C:/tmp/wf.json", favorite: true }); expect(result.ok).toBe(true); - const favoriteCall = globalThis.fetch.mock.calls.find(([url]) => + const favoriteCall = (globalThis.fetch as any).mock.calls.find(([url]) => String(url).includes("/mjr/am/workflows/favorite"), ); expect(favoriteCall).toBeTruthy(); }); it("fetches linked workflow thumbnail candidates from the dedicated endpoint", async () => { - globalThis.fetch = vi.fn(async () => ({ + globalThis.fetch = (vi.fn(async () => ({ status: 200, headers: { get: (name) => (name === "content-type" ? "application/json" : null) }, json: async () => ({ ok: true, data: [] }), - })); + })) as any); const client = await import("../api/client.js"); const result = await client.listWorkflowThumbnailCandidates({ filepath: "C:/tmp/wf.json", limit: 3 }); expect(result.ok).toBe(true); - const candidatesCall = globalThis.fetch.mock.calls.find(([url]) => + const candidatesCall = (globalThis.fetch as any).mock.calls.find(([url]) => String(url).includes("/mjr/am/workflows/thumbnail-candidates"), ); expect(candidatesCall).toBeTruthy(); }); it("fetches indexed workflow model families from the dedicated endpoint", async () => { - globalThis.fetch = vi.fn(async () => ({ + globalThis.fetch = (vi.fn(async () => ({ status: 200, headers: { get: (name) => (name === "content-type" ? "application/json" : null) }, json: async () => ({ ok: true, data: { model_families: [{ label: "Flux", value: "Flux" }] } }), - })); + })) as any); const client = await import("../api/client.js"); const result = await client.listWorkflowModelFamilies(); expect(result.ok).toBe(true); - const familiesCall = globalThis.fetch.mock.calls.find(([url]) => + const familiesCall = (globalThis.fetch as any).mock.calls.find(([url]) => String(url).includes("/mjr/am/workflows/model-families"), ); expect(familiesCall).toBeTruthy(); }); it("fetches workflow scope cards from the list endpoint", async () => { - globalThis.fetch = vi.fn(async () => ({ + globalThis.fetch = (vi.fn(async () => ({ status: 200, headers: { get: (name) => (name === "content-type" ? "application/json" : null) }, json: async () => ({ ok: true, data: { assets: [] } }), - })); + })) as any); const client = await import("../api/client.js"); const result = await client.listWorkflows({ q: "*", limit: 25 }); expect(result.ok).toBe(true); - const listCall = globalThis.fetch.mock.calls.find(([url]) => + const listCall = (globalThis.fetch as any).mock.calls.find(([url]) => String(url).includes("/mjr/am/list") && String(url).includes("scope=workflow"), ); expect(listCall).toBeTruthy(); }); it("posts workflow thumbnail copy requests to the dedicated endpoint", async () => { - globalThis.fetch = vi.fn(async () => ({ + globalThis.fetch = (vi.fn(async () => ({ status: 200, headers: { get: (name) => (name === "content-type" ? "application/json" : null) }, json: async () => ({ ok: true, data: { updated: true } }), - })); + })) as any); const client = await import("../api/client.js"); const result = await client.setWorkflowThumbnail({ @@ -202,18 +202,18 @@ describe("workflow api client", () => { }); expect(result.ok).toBe(true); - const thumbCall = globalThis.fetch.mock.calls.find(([url]) => + const thumbCall = (globalThis.fetch as any).mock.calls.find(([url]) => String(url).includes("/mjr/am/workflows/thumbnail/set"), ); expect(thumbCall).toBeTruthy(); }); it("posts workflow tags updates to the workflow endpoint", async () => { - globalThis.fetch = vi.fn(async () => ({ + globalThis.fetch = (vi.fn(async () => ({ status: 200, headers: { get: (name) => (name === "content-type" ? "application/json" : null) }, json: async () => ({ ok: true, data: { updated: true, tags: ["cinematic"] } }), - })); + })) as any); const client = await import("../api/client.js"); const result = await client.updateAssetTags( @@ -222,7 +222,7 @@ describe("workflow api client", () => { ); expect(result.ok).toBe(true); - const tagsCall = globalThis.fetch.mock.calls.find(([url]) => + const tagsCall = (globalThis.fetch as any).mock.calls.find(([url]) => String(url).includes("/mjr/am/workflows/tags"), ); expect(tagsCall).toBeTruthy(); diff --git a/ui/tests/workflow_graph_map_actions.vitest.ts b/ui/tests/workflow_graph_map_actions.vitest.ts index 0faf1582..b4a32300 100644 --- a/ui/tests/workflow_graph_map_actions.vitest.ts +++ b/ui/tests/workflow_graph_map_actions.vitest.ts @@ -185,7 +185,7 @@ describe("workflow graph map actions", () => { widgets_values: [1, "fixed"], }), ); - expect(created.id).toBeUndefined(); + expect((created as any).id).toBeUndefined(); expect(graph.add).toHaveBeenCalledWith(created); }); }); diff --git a/ui/tests/workflow_graph_map_panel_preview.vitest.ts b/ui/tests/workflow_graph_map_panel_preview.vitest.ts index 25e4c73f..6fe6e4a5 100644 --- a/ui/tests/workflow_graph_map_panel_preview.vitest.ts +++ b/ui/tests/workflow_graph_map_panel_preview.vitest.ts @@ -6,7 +6,7 @@ const drawWorkflowMinimapMock = vi.fn(() => null); const buildFloatingViewerMediaElementMock = vi.fn((asset) => { const root = document.createElement("div"); root.className = `preview-${String(asset?.filename || "none")}`; - root._mjrMediaControlsHandle = { destroy: vi.fn() }; + (root as any)._mjrMediaControlsHandle = { destroy: vi.fn() }; const video = document.createElement("video"); video.pause = vi.fn(); root.appendChild(video); diff --git a/ui/tests/workflow_save_info_dialog.vitest.ts b/ui/tests/workflow_save_info_dialog.vitest.ts index 074ba9d9..09ffe101 100644 --- a/ui/tests/workflow_save_info_dialog.vitest.ts +++ b/ui/tests/workflow_save_info_dialog.vitest.ts @@ -68,7 +68,7 @@ describe("WorkflowSaveInfoDialog", () => { const name = document.body.querySelector("input[type='text']"); const notes = document.body.querySelector("textarea"); - expect(name?.value).toBe("starter workflow"); + expect((name as any)?.value).toBe("starter workflow"); notes.value = "Render the preview branch before publishing."; notes.dispatchEvent(new Event("input", { bubbles: true })); diff --git a/ui/tests/workflow_sidebar_live_sync.vitest.ts b/ui/tests/workflow_sidebar_live_sync.vitest.ts index ac208f4e..be0c6b18 100644 --- a/ui/tests/workflow_sidebar_live_sync.vitest.ts +++ b/ui/tests/workflow_sidebar_live_sync.vitest.ts @@ -19,27 +19,27 @@ vi.mock("../app/comfyApiBridge.js", () => ({ vi.mock("../features/viewer/workflowSidebar/NodeWidgetRenderer.js", () => ({ NodeWidgetRenderer: class NodeWidgetRendererMock { constructor(node, opts = {}) { - this._node = node; - this.node = node; - this.opts = opts; - this._expanded = opts.expanded !== false; - this.el = makeElement("section"); - this.el.dataset.nodeId = String(node?.id ?? ""); + (this as any)._node = node; + (this as any).node = node; + (this as any).opts = opts; + (this as any)._expanded = (opts as any).expanded !== false; + (this as any).el = makeElement("section"); + (this as any).el.dataset.nodeId = String(node?.id ?? ""); rendererState.constructed.push(node?.id ?? null); rendererState.instances.push(this); rendererState.options.push(opts); } setExpanded(expanded) { - this._expanded = Boolean(expanded); + (this as any)._expanded = Boolean(expanded); } syncFromGraph() { - rendererState.synced.push(this.node?.id ?? null); + rendererState.synced.push((this as any).node?.id ?? null); } dispose() { - rendererState.disposed.push(this.node?.id ?? null); + rendererState.disposed.push((this as any).node?.id ?? null); } }, })); @@ -144,14 +144,14 @@ describe("WorkflowSidebar live sync", () => { }, }; - globalThis.document = doc; - globalThis.window = { + globalThis.document = (doc as any); + globalThis.window = ({ ...(globalThis.window || {}), requestAnimationFrame: vi.fn(() => 1), cancelAnimationFrame: vi.fn(), setTimeout, clearTimeout, - }; + } as any); bridgeState.app = { canvas: { From b6f6082f4f5cdc7e70899e57bd7e83af01746f8e Mon Sep 17 00:00:00 2001 From: Ewald ALOEBOETOE <129623145+MajoorWaldi@users.noreply.github.com> Date: Wed, 4 Nov 2026 07:38:14 +0000 Subject: [PATCH 10/23] Move Majoor notifications onto ComfyUI core toasts - Use the typed ToastManager API (success/error/info/warning/loading) instead of the deprecated add(); add() stays as a fallback for older frontends. - Accept a toast manager without add() so toasts keep working once ComfyUI drops the deprecated methods. - Tracked operations (DB restore/reset, vector backfill) show one loading toast updated in place via its ToastId instead of stacking a toast per step; dismiss them on extension teardown. - Persistent toasts use the largest safe timer delay instead of Infinity; history action links become native toast action buttons (http(s) or same-origin paths only). - Route genInfoOverridePicker and comfyAlert through the core toast API; drop the app.ui.toast fallback, the no-op fallback dismisser and the unused .mjr-toast CSS. - Keep the Majoor message center as a read-only history; it no longer pops open by itself on reset/backfill. - Document the notification audit. --- CHANGELOG.md | 1 + ...Cccq5sHS.js => FloatingViewer-BlImyYVf.js} | 14 +- ...wFSOT.js => LiveStreamTracker-DhOEgG4Z.js} | 4 +- ....js => SidebarWorkflowSection-BR3ECa3i.js} | 360 +- ...tor-CPV0rYyM.js => TagsEditor-Dd6Rh_zi.js} | 6 +- ...{Viewer-geJFRz8N.js => Viewer-BvNSchxR.js} | 20 +- ...l-BStxU0ID.js => ViewerPortal-BxqCZGmO.js} | 10 +- ...{events-BRfpU-6M.js => events-ChGln7ff.js} | 2 +- ...u.js => floatingViewerManager-DGIaL-BQ.js} | 6 +- ...enInfo-BkEKNdy-.js => genInfo-CYK2drm1.js} | 6 +- ...dPKugXy.js => model3dRenderer-DcswIkFn.js} | 2 +- ...utru.js => openMajoorSettings-CdWVeKk-.js} | 4 +- ...ide-sOf24A5X.js => sideBySide-t394tgpD.js} | 2 +- ...9UWH5.js => viewerOpenRequest-POEAWUHf.js} | 4 +- ...fx0-.js => viewerRuntimeHosts-nMPP59FX.js} | 594 ++- dist/entry.js | 4428 ++++++++--------- docs/COMFYUI_INTEGRATION_AUDIT.md | 14 + ui/app/DialogTemplates.ts | 10 +- ui/app/comfyApiBridge.ts | 12 +- ui/app/dialogs.ts | 4 +- ui/app/toast.ts | 194 +- ui/features/geninfo/genInfoOverridePicker.ts | 29 +- ui/features/runtime/entryRuntimeLifecycle.ts | 7 + ui/features/status/StatusDot.ts | 14 - ui/tests/comfy_api_bridge.vitest.ts | 9 + ui/tests/toast.vitest.ts | 81 + ui/theme/theme-comfy.css | 97 - ui/types/comfyui-frontend.d.ts | 20 +- 28 files changed, 3070 insertions(+), 2884 deletions(-) rename dist/chunks/{FloatingViewer-Cccq5sHS.js => FloatingViewer-BlImyYVf.js} (99%) rename dist/chunks/{LiveStreamTracker-C8HwFSOT.js => LiveStreamTracker-DhOEgG4Z.js} (97%) rename dist/chunks/{SidebarWorkflowSection-BihItyAk.js => SidebarWorkflowSection-BR3ECa3i.js} (97%) rename dist/chunks/{TagsEditor-CPV0rYyM.js => TagsEditor-Dd6Rh_zi.js} (97%) rename dist/chunks/{Viewer-geJFRz8N.js => Viewer-BvNSchxR.js} (99%) rename dist/chunks/{ViewerPortal-BStxU0ID.js => ViewerPortal-BxqCZGmO.js} (97%) rename dist/chunks/{events-BRfpU-6M.js => events-ChGln7ff.js} (99%) rename dist/chunks/{floatingViewerManager-Gv7MTmpu.js => floatingViewerManager-DGIaL-BQ.js} (99%) rename dist/chunks/{genInfo-BkEKNdy-.js => genInfo-CYK2drm1.js} (99%) rename dist/chunks/{model3dRenderer-DdPKugXy.js => model3dRenderer-DcswIkFn.js} (99%) rename dist/chunks/{openMajoorSettings-Cd5Nutru.js => openMajoorSettings-CdWVeKk-.js} (99%) rename dist/chunks/{sideBySide-sOf24A5X.js => sideBySide-t394tgpD.js} (99%) rename dist/chunks/{viewerOpenRequest-Crw9UWH5.js => viewerOpenRequest-POEAWUHf.js} (90%) rename dist/chunks/{viewerRuntimeHosts-D3Jyfx0-.js => viewerRuntimeHosts-nMPP59FX.js} (84%) diff --git a/CHANGELOG.md b/CHANGELOG.md index 243d5eb0..8d6fc4d3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -37,6 +37,7 @@ All notable changes to this project are documented in this file. - **Optional: hide ComfyUI's native Assets tab** (`Majoor.Integration.HideNativeAssetsTab`, off by default). Uses the official `getSidebarTabs`/`unregisterSidebarTab` API and restores the tab when turned off. - **Workflow serialization** uses the root graph instead of the async `graphToPrompt()`; dirty state reads the frontend workflow store. - **Typed aiohttp request keys** (`web.RequestKey`) — no more `NotAppKeyWarning` on aiohttp ≥ 3.13. +- **Notifications on ComfyUI core toasts only**: Majoor now uses the typed ToastManager API (`success/error/info/warning/loading`) instead of the deprecated `add()` (kept as fallback for older frontends). Long operations (DB restore/reset, vector backfill) show one `loading` toast updated in place instead of stacking a toast per step; links become native toast action buttons; in-progress toasts are dismissed on teardown. Toasts no longer disappear if ComfyUI removes `add()`. The Majoor message center stays as a read-only history (release notes, toast log, shortcuts) and no longer pops open by itself. - **Frontend test typing**: `tsconfig.test.json` now type-checks with 0 errors (was 913) and runs in CI. ## [2.5.2] - 2026-09-27 diff --git a/dist/chunks/FloatingViewer-Cccq5sHS.js b/dist/chunks/FloatingViewer-BlImyYVf.js similarity index 99% rename from dist/chunks/FloatingViewer-Cccq5sHS.js rename to dist/chunks/FloatingViewer-BlImyYVf.js index 34e1d7db..76a6d385 100644 --- a/dist/chunks/FloatingViewer-Cccq5sHS.js +++ b/dist/chunks/FloatingViewer-BlImyYVf.js @@ -1,12 +1,12 @@ -import { $t as e, g as t, y as n } from "./viewerRuntimeHosts-D3Jyfx0-.js"; -import { C as r, H as i, I as a, M as o, O as s, P as c, V as l, at as u, j as d, m as f, o as p, r as m, v as h, w as g, x as _, z as v } from "./events-BRfpU-6M.js"; +import { $t as e, g as t, y as n } from "./viewerRuntimeHosts-nMPP59FX.js"; +import { C as r, H as i, I as a, M as o, O as s, P as c, V as l, at as u, j as d, m as f, o as p, r as m, v as h, w as g, x as _, z as v } from "./events-ChGln7ff.js"; import { a as y, i as b, o as x, s as S } from "./graphTraversal-DTdQWkn5.js"; -import { _ as C, g as w, m as T, n as E, p as ee, r as D, w as O } from "./Viewer-geJFRz8N.js"; -import { r as k, v as A } from "./SidebarWorkflowSection-BihItyAk.js"; -import { _ as j, a as M, c as N, d as P, f as F, g as I, h as L, i as te, l as R, m as z, o as ne, p as B, r as re, s as V, t as ie, u as H, v as U } from "./openMajoorSettings-Cd5Nutru.js"; -import { a as W, n as ae, r as oe } from "./model3dRenderer-DdPKugXy.js"; +import { _ as C, g as w, m as T, n as E, p as ee, r as D, w as O } from "./Viewer-BvNSchxR.js"; +import { r as k, v as A } from "./SidebarWorkflowSection-BR3ECa3i.js"; +import { _ as j, a as M, c as N, d as P, f as F, g as I, h as L, i as te, l as R, m as z, o as ne, p as B, r as re, s as V, t as ie, u as H, v as U } from "./openMajoorSettings-CdWVeKk-.js"; +import { a as W, n as ae, r as oe } from "./model3dRenderer-DcswIkFn.js"; import { i as se, o as ce, r as le, t as ue } from "./geninfoParser-CgHp-y-n.js"; -import { t as de } from "./genInfo-BkEKNdy-.js"; +import { t as de } from "./genInfo-CYK2drm1.js"; // ui/features/viewer/floatingViewerConstants.ts var G = Object.freeze({ SIMPLE: "simple", diff --git a/dist/chunks/LiveStreamTracker-C8HwFSOT.js b/dist/chunks/LiveStreamTracker-DhOEgG4Z.js similarity index 97% rename from dist/chunks/LiveStreamTracker-C8HwFSOT.js rename to dist/chunks/LiveStreamTracker-DhOEgG4Z.js index 56babecc..0af006fb 100644 --- a/dist/chunks/LiveStreamTracker-C8HwFSOT.js +++ b/dist/chunks/LiveStreamTracker-DhOEgG4Z.js @@ -1,5 +1,5 @@ -import { Z as e, o as t, r as n } from "./events-BRfpU-6M.js"; -import { t as r } from "./floatingViewerManager-Gv7MTmpu.js"; +import { Z as e, o as t, r as n } from "./events-ChGln7ff.js"; +import { t as r } from "./floatingViewerManager-DGIaL-BQ.js"; // ui/features/viewer/LiveStreamTracker.ts var i = !1, a = null, o = null, s = null, c = null, l = null, u = null, d = null, f = null, p = 0, m = 0, h = !1, g = 400, _ = "kj_preview_override", v = /* @__PURE__ */ new Set([ "image/jpeg", diff --git a/dist/chunks/SidebarWorkflowSection-BihItyAk.js b/dist/chunks/SidebarWorkflowSection-BR3ECa3i.js similarity index 97% rename from dist/chunks/SidebarWorkflowSection-BihItyAk.js rename to dist/chunks/SidebarWorkflowSection-BR3ECa3i.js index 37e8e2d9..6a7f798d 100644 --- a/dist/chunks/SidebarWorkflowSection-BihItyAk.js +++ b/dist/chunks/SidebarWorkflowSection-BR3ECa3i.js @@ -1,10 +1,10 @@ -import { $ as e, $t as t, At as n, Bt as r, Ct as i, Dt as a, Et as o, Ft as s, Gt as c, Ht as l, I as u, It as d, K as f, Kt as p, Mt as m, N as h, Nt as g, O as _, Ot as v, Pt as y, Q as b, Qt as x, R as S, Rt as C, S as ee, St as te, T as ne, Tt as w, Ut as T, Vt as E, X as re, Y as D, Yt as ie, Z as ae, Zt as oe, at as se, cn as ce, ct as le, dt as ue, en as de, et as fe, gt as pe, it as me, jt as he, k as ge, kt as _e, lt as ve, nt as ye, ot as be, p as xe, rt as Se, sn as Ce, tt as we, ut as Te, w as Ee, wt as De } from "./viewerRuntimeHosts-D3Jyfx0-.js"; -import { G as Oe, J as ke, N as Ae, R as je, T as Me, Tt as Ne, X as Pe, c as Fe, d as Ie, f as Le, h as Re, ht as ze, j as Be, l as Ve, m as O, o as k, p as He, rt as Ue, s as A, u as We, x as Ge, y as Ke } from "./events-BRfpU-6M.js"; -import { F as qe, K as Je, P as Ye, Y as Xe, f as Ze, m as Qe, p as $e } from "./Viewer-geJFRz8N.js"; -import { t as et } from "./floatingViewerManager-Gv7MTmpu.js"; +import { $ as e, $t as t, At as n, Bt as r, Ct as i, Dt as a, Et as o, Ft as s, Gt as c, Ht as l, I as u, It as d, K as f, Kt as p, Mt as m, N as h, Nt as g, O as _, Ot as v, Pt as y, Q as b, Qt as x, R as S, Rt as C, S as ee, St as te, T as ne, Tt as w, Ut as T, Vt as re, X as ie, Y as E, Yt as ae, Z as oe, Zt as se, at as ce, cn as le, ct as ue, dt as de, et as D, gt as fe, it as pe, jt as me, k as he, kt as ge, ln as _e, lt as ve, nt as ye, ot as be, p as xe, rt as Se, tn as Ce, tt as we, ut as Te, w as Ee, wt as De } from "./viewerRuntimeHosts-nMPP59FX.js"; +import { G as Oe, J as ke, N as Ae, R as je, T as Me, Tt as Ne, X as Pe, c as Fe, d as Ie, f as Le, h as Re, ht as ze, j as Be, l as Ve, m as O, o as k, p as He, rt as Ue, s as A, u as We, x as Ge, y as Ke } from "./events-ChGln7ff.js"; +import { F as qe, K as Je, P as Ye, Y as Xe, f as Ze, m as Qe, p as $e } from "./Viewer-BvNSchxR.js"; +import { t as et } from "./floatingViewerManager-DGIaL-BQ.js"; import { A as tt, C as j, D as nt, E as M, G as rt, J as it, K as at, N as ot, O as N, R as st, S as ct, T as P, U as F, V as I, Y as lt, _ as ut, a as dt, b as ft, c as pt, d as mt, dt as L, f as ht, ft as R, g as gt, h as _t, i as vt, j as yt, k as z, l as bt, lt as B, m as xt, n as St, nt as Ct, o as wt, p as Tt, r as Et, rt as V, s as Dt, t as Ot, u as kt, ut as At, y as jt, z as Mt } from "./mjr-primevue-BRqtdXzb.js"; import { t as Nt } from "./mjr-vue-vendor-mHY_eIVE.js"; -import { t as Pt } from "./viewerOpenRequest-Crw9UWH5.js"; +import { t as Pt } from "./viewerOpenRequest-POEAWUHf.js"; import { a as Ft, i as It, n as Lt, o as Rt, r as zt, t as Bt } from "./geninfoParser-CgHp-y-n.js"; // ui/app/settings/settingsUtils.ts var H = (e, t) => { @@ -216,7 +216,7 @@ var H = (e, t) => { } }, Xt = () => { try { - let e = Re.get(ce); + let e = Re.get(_e); if (!e) return { ...W }; let t = JSON.parse(e), n = t && typeof t == "object" && Number.isInteger(t.version) && t.data && typeof t.data == "object"; if (!n && (!t || typeof t != "object" || Array.isArray(t))) return { ...W }; @@ -307,7 +307,7 @@ var H = (e, t) => { }; async function Zt() { try { - let e = await se(); + let e = await ce(); if (!e?.ok) return; let t = e.data?.prefs; if (!t || typeof t != "object") return; @@ -325,7 +325,7 @@ async function Zt() { } async function Qt() { try { - let e = await le(); + let e = await ue(); if (!e?.ok) return; let t = e.data?.prefs; if (!t || typeof t != "object") return; @@ -337,7 +337,7 @@ async function Qt() { } async function $t() { try { - let e = await D(); + let e = await E(); if (!e?.ok) return; let t = e.data?.prefs; if (!t || typeof t != "object") return; @@ -382,7 +382,7 @@ function on(e, t) { return r.style.whiteSpace = "nowrap", r.style.lineHeight = "1.35", t === "auth" && (r.style.marginTop = "4px", r.style.fontWeight = "600"), e.appendChild(r), e[n] = r, r; } function sn(e) { - let t = String(e?.token_hint || "").trim(), n = oe(), r = t || (n ? "(session)" : ""), i = e?.allow_write !== !1, a = e?.require_auth === !0, o = e?.token_configured === !0; + let t = String(e?.token_hint || "").trim(), n = se(), r = t || (n ? "(session)" : ""), i = e?.allow_write !== !1, a = e?.require_auth === !0, o = e?.token_configured === !0; return i ? n ? { text: O("runtime.writeAuthActive", "Write auth: active {tokenHint}", { tokenHint: r || "(session)" }), color: "#7ee0a0" @@ -432,7 +432,7 @@ async function ln() { if (!e) return !1; let t = on(e, "metrics"), n = on(e, "auth"); try { - let [r, i] = await Promise.all([me(), se()]), a = O("runtime.unavailable", "Runtime: unavailable"); + let [r, i] = await Promise.all([pe(), ce()]), a = O("runtime.unavailable", "Runtime: unavailable"); if (!r?.ok || !r?.data) t.textContent = a; else { let e = r.data.db || {}, n = r.data.index || {}, i = r.data.watcher || {}, o = Number(e.active_connections || 0), s = Number(n.enrichment_queue_length || 0), c = Number(i.pending_files || 0); @@ -1104,7 +1104,7 @@ function On(e, n, r) { let i = !!e, a = !!n.viewer?.ltxavRgbFallback; n.viewer = n.viewer || {}, n.viewer.ltxavRgbFallback = i, G(n), K(n), r("viewer.ltxavRgbFallback"); try { - let e = await _e(i); + let e = await ge(i); if (!e?.ok) throw Error(e?.error || "Failed to update LTXAV RGB preview fallback setting"); } catch (e) { n.viewer.ltxavRgbFallback = a, G(n), K(n), r("viewer.ltxavRgbFallback"), t(e?.message || "Failed to update LTXAV RGB preview fallback setting", "error"); @@ -1112,7 +1112,7 @@ function On(e, n, r) { } }); try { - fe().then((e) => { + D().then((e) => { if (!e?.ok) return; let t = !!e?.data?.prefs?.enabled, i = Xt(); i.viewer = i.viewer || {}, !!i.viewer.ltxavRgbFallback !== t && (i.viewer.ltxavRgbFallback = t, Object.assign(n, i), G(i), K(i), r("viewer.ltxavRgbFallback")); @@ -1689,7 +1689,7 @@ function tr(e, r, i, c) { } h = typeof AbortController < "u" ? new AbortController() : null; try { - let t = await he(n, h ? { signal: h.signal } : {}); + let t = await me(n, h ? { signal: h.signal } : {}); if (e !== p) return; if (!t?.ok) throw Error(t?.error || O("toast.failedSetOutputDirectory", "Failed to set output directory")); let a = String(t?.data?.output_directory || n).trim(); @@ -1750,7 +1750,7 @@ function tr(e, r, i, c) { } catch (e) { console.debug?.(e); } - let ee = String(r.paths?.indexDirectory || ""), ne = null, E = 0, D = null; + let ee = String(r.paths?.indexDirectory || ""), ne = null, re = 0, E = null; e({ id: `${J}.Paths.IndexDirectory`, category: l(O("cat.advanced"), "Paths / Index"), @@ -1769,28 +1769,28 @@ function tr(e, r, i, c) { } ne = setTimeout(async () => { ne = null; - let e = ++E; + let e = ++re; try { - D?.abort?.(); + E?.abort?.(); } catch (e) { console.debug?.(e); } - D = typeof AbortController < "u" ? new AbortController() : null; + E = typeof AbortController < "u" ? new AbortController() : null; try { - let a = await o(n, D ? { signal: D.signal } : {}); - if (e !== E) return; + let a = await o(n, E ? { signal: E.signal } : {}); + if (e !== re) return; if (!a?.ok) throw Error(a?.error || O("toast.failedSetIndexDirectory", "Failed to set index directory")); let s = String(a?.data?.index_directory || n).trim(), c = s !== ee; r.paths.indexDirectory = s, ee = s, G(r), i("paths.indexDirectory"), c && t(O("toast.indexDirectorySavedRestart", "Index directory saved. Restart ComfyUI to apply."), "success", void 0, { history: { trackId: "settings:index-directory-saved" } }); } catch (n) { - if (e !== E || String(n?.name || "") === "AbortError" || String(n?.code || "") === "ABORTED") return; + if (e !== re || String(n?.name || "") === "AbortError" || String(n?.code || "") === "ABORTED") return; r.paths.indexDirectory = ee, G(r), i("paths.indexDirectory"), t(n?.message || O("toast.failedSetIndexDirectory", "Failed to set index directory"), "error"); } }, 700); } }); try { - ae().then((e) => { + oe().then((e) => { if (!e?.ok) return; let t = String(e?.data?.index_directory || "").trim(); r.paths = r.paths || {}, r.paths.indexDirectory !== t && (r.paths.indexDirectory = t, ee = t, G(r), i("paths.indexDirectory")); @@ -1798,7 +1798,7 @@ function tr(e, r, i, c) { } catch (e) { console.debug?.(e); } - let oe = String(r.paths?.workflowRoots || ""), se = null, ce = 0, le = null; + let se = String(r.paths?.workflowRoots || ""), ce = null, le = 0, ue = null; e({ id: `${J}.Paths.WorkflowRoots`, category: l(O("cat.advanced"), "Paths / Workflows"), @@ -1811,42 +1811,42 @@ function tr(e, r, i, c) { let n = String(e || "").trim(); r.paths = r.paths || {}, r.paths.workflowRoots = n, G(r); try { - se &&= (clearTimeout(se), null); + ce &&= (clearTimeout(ce), null); } catch (e) { console.debug?.(e); } - se = setTimeout(async () => { - se = null; - let e = ++ce; + ce = setTimeout(async () => { + ce = null; + let e = ++le; try { - le?.abort?.(); + ue?.abort?.(); } catch (e) { console.debug?.(e); } - le = typeof AbortController < "u" ? new AbortController() : null; + ue = typeof AbortController < "u" ? new AbortController() : null; try { - let a = await C(n, le ? { signal: le.signal } : {}); - if (e !== ce) return; + let a = await C(n, ue ? { signal: ue.signal } : {}); + if (e !== le) return; if (!a?.ok) throw Error(a?.error || O("toast.failedSetWorkflowRoots", "Failed to set workflow roots")); let o = String(a?.data?.workflow_roots_text || n).trim(); - r.paths.workflowRoots = o, oe = o, G(r), i("paths.workflowRoots"), t(O("toast.workflowRootsSaved", "Workflow roots saved"), "success", 1800); + r.paths.workflowRoots = o, se = o, G(r), i("paths.workflowRoots"), t(O("toast.workflowRootsSaved", "Workflow roots saved"), "success", 1800); } catch (n) { - if (e !== ce || String(n?.name || "") === "AbortError" || String(n?.code || "") === "ABORTED") return; - r.paths.workflowRoots = oe, G(r), i("paths.workflowRoots"), t(n?.message || O("toast.failedSetWorkflowRoots", "Failed to set workflow roots"), "error"); + if (e !== le || String(n?.name || "") === "AbortError" || String(n?.code || "") === "ABORTED") return; + r.paths.workflowRoots = se, G(r), i("paths.workflowRoots"), t(n?.message || O("toast.failedSetWorkflowRoots", "Failed to set workflow roots"), "error"); } }, 700); } }); try { - ue().then((e) => { + de().then((e) => { if (!e?.ok) return; let t = String(e?.data?.workflow_roots_text || "").trim(); - r.paths = r.paths || {}, r.paths.workflowRoots !== t && (r.paths.workflowRoots = t, oe = t, G(r), i("paths.workflowRoots")); + r.paths = r.paths || {}, r.paths.workflowRoots !== t && (r.paths.workflowRoots = t, se = t, G(r), i("paths.workflowRoots")); }).catch(() => {}); } catch (e) { console.debug?.(e); } - let fe = Ve().map((e) => e.code), pe = ["auto", ...fe]; + let D = Ve().map((e) => e.code), fe = ["auto", ...D]; e({ id: `${J}.Language`, category: l(O("cat.advanced"), O("setting.language.name", "Language")), @@ -1854,9 +1854,9 @@ function tr(e, r, i, c) { tooltip: "Use auto to detect and follow ComfyUI language. Or choose a fixed language for Majoor only.", type: "combo", defaultValue: r.i18n?.followComfyLanguage ? "auto" : Fe(), - options: pe, + options: fe, onChange: (e) => { - r.i18n = r.i18n || {}, e === "auto" ? (r.i18n.followComfyLanguage = !0, Ie(!0), We(c), G(r), i("language")) : fe.includes(e) && (r.i18n.followComfyLanguage = !1, Ie(!1), Le(e), G(r), i("language")); + r.i18n = r.i18n || {}, e === "auto" ? (r.i18n.followComfyLanguage = !0, Ie(!0), We(c), G(r), i("language")) : D.includes(e) && (r.i18n.followComfyLanguage = !1, Ie(!1), Le(e), G(r), i("language")); } }), e({ id: `${J}.ProbeBackend.Mode`, @@ -2142,7 +2142,7 @@ function tr(e, r, i, c) { } }), setTimeout(u, 0), (async () => { try { - let e = (await re())?.data?.prefs || {}, t = !!e?.has_token, n = String(e?.token_hint || "").trim(), r = t ? `Configured ${n || "(saved)"}` : "Paste HuggingFace token (hf_...)"; + let e = (await ie())?.data?.prefs || {}, t = !!e?.has_token, n = String(e?.token_hint || "").trim(), r = t ? `Configured ${n || "(saved)"}` : "Paste HuggingFace token (hf_...)"; d(r); } catch (e) { console.debug?.(e); @@ -2182,7 +2182,7 @@ function tr(e, r, i, c) { defaultValue: "Loading vector status..." }), (async () => { try { - let e = await ie(); + let e = await ae(); e?.ok ? console.debug?.("[Majoor] Vector status:", `${e.data?.total || 0} assets indexed | Model: ${e.data?.model || "N/A"}`) : console.debug?.("[Majoor] Vector status unavailable"); } catch (e) { console.debug?.("[Majoor] Vector status fetch failed", e); @@ -2212,7 +2212,7 @@ function tr(e, r, i, c) { } }); let e = await T(64, { onProgress: (e) => { let t = String(e?.status || "running").toLowerCase() || "running", r = e?.progress || e?.result || {}, i = Number(r?.candidates ?? r?.processed ?? 0), a = Number(r?.indexed ?? 0), o = Number(r?.skipped ?? 0), s = Number(r?.errors ?? 0), c = Math.max(i, a + o + s), l = c > 0 ? Math.round((a + o + s) / c * 100) : null, u = t === "queued" ? "Vector backfill queued" : `Candidates ${i}, indexed ${a}, skipped ${o}, errors ${s}`; - de({ + Ce({ summary: "Vector Backfill", detail: u }, t === "failed" ? "error" : t === "succeeded" ? "success" : "info", 0, { history: { @@ -2272,7 +2272,7 @@ function tr(e, r, i, c) { } }); } try { - let e = await ie(); + let e = await ae(); e?.ok && console.debug?.("[Majoor] Vector stats after backfill:", e.data); } catch (e) { console.debug?.("[Majoor] Failed to refresh vector stats:", e); @@ -2418,7 +2418,7 @@ function ir(e, n, r) { defaultValue: "Idle", onChange: async (e) => { if (String(e || "") === "Unload now") try { - let e = await E(); + let e = await re(); t(e?.ok ? "Majoor AI model cache unloaded" : e?.error || "Failed to unload Majoor AI model cache", e?.ok ? "info" : "error", 2600); } catch (e) { t(e?.message || "Failed to unload Majoor AI model cache", "error"); @@ -3509,19 +3509,19 @@ function va(e, t, n = null) { if (!m.length) return r.clearRect(0, 0, l, u), null; let v = m[0].x, y = m[0].y, b = m[0].x + m[0].w, x = m[0].y + m[0].h; for (let e of m) v = Math.min(v, e.x), y = Math.min(y, e.y), b = Math.max(b, e.x + e.w), x = Math.max(x, e.y + e.h); - let S = Math.max(1, b - v), C = Math.max(1, x - y), ee = v + S / 2, te = y + C / 2, ne = i.view && typeof i.view == "object" ? i.view : Object.create(null), w = ha(ne.zoom ?? 1, ua, da), T = Math.max(1, S / w), E = Math.max(1, C / w), re = T / 2, D = E / 2, ie = T >= S ? ee : ha(ne.centerX ?? ee, v + re, b - re), ae = E >= C ? te : ha(ne.centerY ?? te, y + D, x - D), oe = ie - re, se = ae - D, ce = la, le = Math.min((l - 12) / T, (u - 12) / E), ue = ne.hoveredNodeId !== null && ne.hoveredNodeId !== void 0 ? String(ne.hoveredNodeId) : null; + let S = Math.max(1, b - v), C = Math.max(1, x - y), ee = v + S / 2, te = y + C / 2, ne = i.view && typeof i.view == "object" ? i.view : Object.create(null), w = ha(ne.zoom ?? 1, ua, da), T = Math.max(1, S / w), re = Math.max(1, C / w), ie = T / 2, E = re / 2, ae = T >= S ? ee : ha(ne.centerX ?? ee, v + ie, b - ie), oe = re >= C ? te : ha(ne.centerY ?? te, y + E, x - E), se = ae - ie, ce = oe - E, le = la, ue = Math.min((l - 12) / T, (u - 12) / re), de = ne.hoveredNodeId !== null && ne.hoveredNodeId !== void 0 ? String(ne.hoveredNodeId) : null; r.clearRect(0, 0, l, u), r.fillStyle = "rgba(0,0,0,0.22)", r.fillRect(0, 0, l, u); - let de = (e, t) => ({ - x: ce + (e - oe) * le, - y: ce + (t - se) * le + let D = (e, t) => ({ + x: le + (e - se) * ue, + y: le + (t - ce) * ue }), fe = (e, t) => ({ - x: ha(oe + (Number(e) - ce) / le, v, b), - y: ha(se + (Number(t) - ce) / le, y, x) + x: ha(se + (Number(e) - le) / ue, v, b), + y: ha(ce + (Number(t) - le) / ue, y, x) }), pe = (e) => ({ - x: ce + (e.x - oe) * le, - y: ce + (e.y - se) * le, - w: Math.max(1, e.w * le), - h: Math.max(1, e.h * le) + x: le + (e.x - se) * ue, + y: le + (e.y - ce) * ue, + w: Math.max(1, e.w * ue), + h: Math.max(1, e.h * ue) }), me = (e) => Math.max(10, Math.min(24, Math.floor(Number(e) * .2))), he = (e, t, n) => { let r = pe(e), i = me(r.h), a = n === "output" ? e.outputs : e.inputs, o = Math.max(1, Array.isArray(a) ? a.length : Number(e[`${n}Count`]) || 0), s = ha(t, 0, Math.max(0, o - 1)); return r.y + i + (r.h - i) * (s + 1) / (o + 1); @@ -3597,7 +3597,7 @@ function va(e, t, n = null) { } r.strokeStyle = "rgba(244,67,54,0.95)", r.lineWidth = 1.5, r.strokeRect(t - .5, n - .5, a + 1, o + 1); } - if (s && ue && String(e.id || "") === ue) { + if (s && de && String(e.id || "") === de) { try { r.setLineDash([]); } catch (e) { @@ -3645,7 +3645,7 @@ function va(e, t, n = null) { if (i.showViewport) try { let e = Me(); if (e) { - let t = de(e.x0, e.y0), n = de(e.x1, e.y1), i = Math.min(t.x, n.x), a = Math.min(t.y, n.y), o = Math.abs(n.x - t.x), s = Math.abs(n.y - t.y); + let t = D(e.x0, e.y0), n = D(e.x1, e.y1), i = Math.min(t.x, n.x), a = Math.min(t.y, n.y), o = Math.abs(n.x - t.x), s = Math.abs(n.y - t.y); r.save(), r.globalAlpha = 1, r.strokeStyle = "rgba(255,255,255,0.9)", r.lineWidth = 1, r.strokeRect(i, a, o, s), r.restore(); } } catch (e) { @@ -3662,17 +3662,17 @@ function va(e, t, n = null) { }, resolvedView: { zoom: w, - centerX: ie, - centerY: ae, + centerX: ae, + centerY: oe, visibleW: T, - visibleH: E, - viewMinX: oe, - viewMinY: se, - pad: ce, - renderScale: le + visibleH: re, + viewMinX: se, + viewMinY: ce, + pad: le, + renderScale: ue }, canvasToWorld: fe, - worldToCanvas: de, + worldToCanvas: D, hitTestNode: (e, t) => { let n = fe(e, t); for (let e = m.length - 1; e >= 0; --e) { @@ -5064,7 +5064,7 @@ function Bo(e) { value: T, override: Io(o, "workflow_notes", "notes") }); - let E = Lo(r.custom_info), re = No(r, h, v, x), D = Po(r, x, E, l.workflowType), ie = jo(r, x), ae = Array.isArray(r.inputs) ? r.inputs.filter((e) => e && typeof e == "object" && e.filename).map((e, t) => ({ + let re = Lo(r.custom_info), ie = No(r, h, v, x), E = Po(r, x, re, l.workflowType), ae = jo(r, x), oe = Array.isArray(r.inputs) ? r.inputs.filter((e) => e && typeof e == "object" && e.filename).map((e, t) => ({ id: `${e.filename}-${t}`, filename: String(e.filename || "").trim(), subfolder: String(e.subfolder || "").trim(), @@ -5096,7 +5096,7 @@ function Bo(e) { lyrics: String(r.lyrics || "").trim(), modelFields: f, modelGroups: h, - branchCards: re, + branchCards: ie, pipelineTabs: x, samplingFields: v, ttsFields: S, @@ -5104,14 +5104,14 @@ function Bo(e) { ttsInstruction: String(r.instruct || "").trim(), ttsRuntimeFields: ee, audioFields: te, - seed: ie, + seed: ae, imageFields: ne, - inputFiles: ae, + inputFiles: oe, isOverride: c, overrideLabel: c ? "Gen Info Override" : "", notesFields: w, - customInfoBlocks: E, - moduleBlocks: D, + customInfoBlocks: re, + moduleBlocks: E, ltxDirector: i, ideogram: a }; @@ -5171,7 +5171,7 @@ var Vo = ["title"], Ho = ["src"], Uo = { setup(e) { let n = e, r = V(0), i = V(!1), a = null; function o() { - return a ||= import("./floatingViewerManager-Gv7MTmpu.js").then((e) => e.n), a; + return a ||= import("./floatingViewerManager-DGIaL-BQ.js").then((e) => e.n), a; } function s() { return (Array.isArray(n.inputFile?.previewCandidates) ? n.inputFile.previewCandidates : [])[r.value] || ""; @@ -5263,7 +5263,7 @@ var Vo = ["title"], Ho = ["src"], Uo = { } } async function v() { - let e = await pe(d()); + let e = await fe(d()); e?.ok ? t(O("toast.openedInFolder", "Opened in folder"), "info", 1600) : t(e?.error || O("toast.openFolderFailed", "Failed to open folder."), "error"); } async function y() { @@ -5274,7 +5274,7 @@ var Vo = ["title"], Ho = ["src"], Uo = { root_id: e.root_id || void 0, kind: e.kind }, r = await $i({ - post: ge, + post: he, endpoint: Ue.STAGE_TO_INPUT, payload: n, index: !1 @@ -5993,14 +5993,14 @@ var Vo = ["title"], Ho = ["src"], Uo = { function T(e) { return "#CE6DE0"; } - function E(e) { + function re(e) { let t = String(e?.key || "").toLowerCase(); return t.includes("high") ? "#FFC107" : t.includes("low") ? "#FFB300" : t.includes("base") ? "#FF9800" : t.includes("upscale") || t.includes("refine") ? "#FFCA28" : t.includes("pass") ? "#FDD835" : "#FF9800"; } - function re(e) { + function ie(e) { return e === "high_noise" ? "#FF7043" : e === "low_noise" ? "#29B6F6" : "#AB47BC"; } - async function D(e, t = null, n = "rgba(76, 175, 80, 0.35)") { + async function E(e, t = null, n = "rgba(76, 175, 80, 0.35)") { let r = String(e ?? "").trim(); if (r && r !== "-") try { await navigator.clipboard.writeText(r), ne(t, n); @@ -6008,7 +6008,7 @@ var Vo = ["title"], Ho = ["src"], Uo = { console.debug?.(e); } } - function ie() { + function ae() { l.value = { scoreText: "AI OFF", scoreColor: "#9E9E9E", @@ -6021,21 +6021,21 @@ var Vo = ["title"], Ho = ["src"], Uo = { aiStatusText: O("sidebar.generation.aiDisabledSettings", "AI features are disabled in settings.") }; } - function ae() { + function oe() { l.value = d(); } - async function oe() { + async function se() { u += 1; let e = u; - if (!_.value.showAlignment || !t.asset?.id) ae(); - else if (!v.value) ie(); + if (!_.value.showAlignment || !t.asset?.id) oe(); + else if (!v.value) ae(); else { - ae(); + oe(); try { let n = await p(t.asset.id); if (e !== u) return; if (!n?.ok && (String(n?.code || "").toUpperCase() === "SERVICE_UNAVAILABLE" || /vector search is not enabled/i.test(String(n?.error || "")))) { - ie(); + ae(); return; } let r = n?.ok && n.data != null ? Number(n.data) : null; @@ -6081,7 +6081,7 @@ var Vo = ["title"], Ho = ["src"], Uo = { } } } - async function se() { + async function ce() { if (x.value && !s.value) { s.value = !0, o.value = O("status.generating", "Generating..."); try { @@ -6094,7 +6094,7 @@ var Vo = ["title"], Ho = ["src"], Uo = { } } } - async function ce() { + async function le() { if (S.value) try { await navigator.clipboard.writeText(b.value), a.value = O("viewer.copySuccessShort", "Copied!"), setTimeout(() => { a.value = O("action.copy", "Copy"); @@ -6111,7 +6111,7 @@ var Vo = ["title"], Ho = ["src"], Uo = { _.value.showAlignment, v.value ], () => { - oe(); + se(); }, { immediate: !0 }), (e, t) => { let r = rt("MButton"); return _.value.kind === "empty" ? N("", !0) : (I(), z("div", Yo, [ @@ -6209,7 +6209,7 @@ var Vo = ["title"], Ho = ["src"], Uo = { "word-break": "break-word", cursor: "pointer" }, - onClick: t[0] ||= (e) => D(_.value.ltxDirector.globalPrompt, e.currentTarget) + onClick: t[0] ||= (e) => E(_.value.ltxDirector.globalPrompt, e.currentTarget) }, R(_.value.ltxDirector.globalPrompt), 9, ms)])) : N("", !0), _.value.ltxDirector.segments.length ? (I(), z("div", hs, [(I(!0), z(j, null, F(_.value.ltxDirector.segments, (e) => (I(), z("div", { key: e.key, @@ -6241,7 +6241,7 @@ var Vo = ["title"], Ho = ["src"], Uo = { "word-break": "break-word", cursor: "pointer" }, - onClick: (t) => D(e.prompt, t.currentTarget) + onClick: (t) => E(e.prompt, t.currentTarget) }, R(e.prompt), 9, Cs)) : N("", !0), e.filename || e.type ? (I(), z("div", ws, [e.type ? (I(), z("span", Ts, R(e.type), 1)) : N("", !0), e.filename ? (I(), z("span", Es, R(e.filename), 1)) : N("", !0)])) : N("", !0)])])]))), 128))])) : N("", !0) ], 4)) : N("", !0), _.value.ideogram ? (I(), z("div", { @@ -6288,7 +6288,7 @@ var Vo = ["title"], Ho = ["src"], Uo = { "word-break": "break-word", cursor: "pointer" }, - onClick: t[1] ||= (e) => D(_.value.ideogram.highLevelDescription, e.currentTarget) + onClick: t[1] ||= (e) => E(_.value.ideogram.highLevelDescription, e.currentTarget) }, R(_.value.ideogram.highLevelDescription), 9, Ns)])) : N("", !0), _.value.ideogram.background ? (I(), z("div", Ps, [t[12] ||= M("div", { style: { "font-size": "10px", @@ -6307,7 +6307,7 @@ var Vo = ["title"], Ho = ["src"], Uo = { "word-break": "break-word", cursor: "pointer" }, - onClick: t[2] ||= (e) => D(_.value.ideogram.background, e.currentTarget) + onClick: t[2] ||= (e) => E(_.value.ideogram.background, e.currentTarget) }, R(_.value.ideogram.background), 9, Fs)])) : N("", !0), _.value.ideogram.elements.length ? (I(), z("div", Is, [(I(!0), z(j, null, F(_.value.ideogram.elements, (e) => (I(), z("div", { key: e.key, @@ -6330,7 +6330,7 @@ var Vo = ["title"], Ho = ["src"], Uo = { "word-break": "break-word", cursor: "pointer" }, - onClick: (t) => D(e.description, t.currentTarget) + onClick: (t) => E(e.description, t.currentTarget) }, R(e.description), 9, Bs)) : N("", !0), e.palette.length ? (I(), z("div", Vs, [(I(!0), z(j, null, F(e.palette, (t) => (I(), z("span", { key: `${e.key}-${t}`, @@ -6342,7 +6342,7 @@ var Vo = ["title"], Ho = ["src"], Uo = { border: "1px solid rgba(255,255,255,0.28)", background: t }), - onClick: (e) => D(t, e.currentTarget) + onClick: (e) => E(t, e.currentTarget) }, null, 12, Hs))), 128))])) : N("", !0) ]))), 128))])) : N("", !0), M("details", Us, [t[13] ||= M("summary", { style: { @@ -6367,7 +6367,7 @@ var Vo = ["title"], Ho = ["src"], Uo = { "word-break": "break-word", cursor: "pointer" }, - onClick: t[3] ||= (e) => D(_.value.ideogram.json, e.currentTarget) + onClick: t[3] ||= (e) => E(_.value.ideogram.json, e.currentTarget) }, R(_.value.ideogram.json), 9, Ws)]) ], 4)) : N("", !0), !_.value.ltxDirector && !_.value.ideogram && _.value.promptTabs.length ? (I(), z("div", { @@ -6424,7 +6424,7 @@ var Vo = ["title"], Ho = ["src"], Uo = { "line-height": "1.35", cursor: "pointer" }, - onClick: (t) => D(e.positive, t.currentTarget) + onClick: (t) => E(e.positive, t.currentTarget) }, R(e.positive), 9, Js), e.negative ? (I(), z(j, { key: 0 }, [M("div", Ys, R(B(O)("sidebar.generation.negative", "NEGATIVE")), 1), M("div", { style: { @@ -6434,7 +6434,7 @@ var Vo = ["title"], Ho = ["src"], Uo = { "line-height": "1.35", cursor: "pointer" }, - onClick: (t) => D(e.negative, t.currentTarget) + onClick: (t) => E(e.negative, t.currentTarget) }, R(e.negative), 9, Xs)], 64)) : N("", !0) ])), [[ft, n.value === t]])), 128)) ], 4)) : !_.value.ltxDirector && !_.value.ideogram && _.value.positivePrompt ? (I(), z("div", { @@ -6458,7 +6458,7 @@ var Vo = ["title"], Ho = ["src"], Uo = { "word-break": "break-word", cursor: "pointer" }, - onClick: t[4] ||= (e) => D(_.value.positivePrompt, e.currentTarget) + onClick: t[4] ||= (e) => E(_.value.positivePrompt, e.currentTarget) }, R(_.value.positivePrompt), 9, $s)], 4)) : N("", !0), !_.value.ltxDirector && !_.value.ideogram && !_.value.promptTabs.length && _.value.negativePrompt ? (I(), z("div", { key: 4, @@ -6481,7 +6481,7 @@ var Vo = ["title"], Ho = ["src"], Uo = { "word-break": "break-word", cursor: "pointer" }, - onClick: t[5] ||= (e) => D(_.value.negativePrompt, e.currentTarget) + onClick: t[5] ||= (e) => E(_.value.negativePrompt, e.currentTarget) }, R(_.value.negativePrompt), 9, nc)], 4)) : N("", !0) ], 64)) : N("", !0), y.value ? (I(), z("div", { @@ -6547,7 +6547,7 @@ var Vo = ["title"], Ho = ["src"], Uo = { opacity: x.value ? "1" : "0.6", cursor: x.value ? "pointer" : "default" }]), - onClick: ct(se, ["stop"]) + onClick: ct(ce, ["stop"]) }, { default: it(() => [tt(R(o.value), 1)]), _: 1 @@ -6570,7 +6570,7 @@ var Vo = ["title"], Ho = ["src"], Uo = { opacity: S.value ? "1" : "0.6", cursor: S.value ? "pointer" : "default" }]), - onClick: ct(ce, ["stop"]) + onClick: ct(le, ["stop"]) }, { default: it(() => [tt(R(a.value), 1)]), _: 1 @@ -6590,7 +6590,7 @@ var Vo = ["title"], Ho = ["src"], Uo = { wordBreak: "break-word", cursor: S.value ? "copy" : "default" }), - onClick: ce + onClick: le }, R(b.value), 13, dc) ], 2)) : N("", !0), C.value.length ? (I(), z("div", { @@ -6627,7 +6627,7 @@ var Vo = ["title"], Ho = ["src"], Uo = { "word-break": "break-word", cursor: "pointer" }, - onClick: (e) => D(t.value, e.currentTarget) + onClick: (e) => E(t.value, e.currentTarget) }, R(t.value || "-"), 9, hc)]))), 128)), e.loras.length ? (I(), z("div", gc, [t[14] ||= M("span", { style: { "font-size": "10px", @@ -6648,7 +6648,7 @@ var Vo = ["title"], Ho = ["src"], Uo = { border: "1px solid rgba(255,255,255,0.08)", cursor: "pointer" }, - onClick: (e) => D(t, e.currentTarget) + onClick: (e) => E(t, e.currentTarget) }, R(t), 9, _c))), 128))])) : N("", !0) ], 4))), 128))])], 4)) : N("", !0), _.value.lyrics ? (I(), z("div", { @@ -6666,11 +6666,11 @@ var Vo = ["title"], Ho = ["src"], Uo = { })) }, [M("div", bc, R(B(O)("sidebar.generation.sampling", "Sampling")), 1), M("div", xc, [(I(!0), z(j, null, F(ee.value, (e) => (I(), z("div", { key: `sampling-${e.key}`, - style: L(w(E(e), !0)) + style: L(w(re(e), !0)) }, [M("div", { style: L({ fontSize: "10px", fontWeight: "800", - color: E(e), + color: re(e), letterSpacing: "0.6px", textTransform: "uppercase" }) }, R(e.label), 5), (I(!0), z(j, null, F(e.samplingFields, (t) => (I(), z("div", { @@ -6690,7 +6690,7 @@ var Vo = ["title"], Ho = ["src"], Uo = { "text-align": "right", cursor: "pointer" }, - onClick: (e) => D(t.value, e.currentTarget) + onClick: (e) => E(t.value, e.currentTarget) }, R(t.value), 9, Sc)]))), 128))], 4))), 128))])], 4)) : N("", !0), N("", !0) ], 64)) : _.value.modelGroups.length ? (I(), z("div", { @@ -6702,20 +6702,20 @@ var Vo = ["title"], Ho = ["src"], Uo = { })) }, [M("div", Cc, R(B(O)("sidebar.generation.models", "Models")), 1), M("div", wc, [(I(!0), z(j, null, F(_.value.modelGroups, (e) => (I(), z("div", { key: `model-group-${e.key}`, - style: L(w(re(e.key), !0)) + style: L(w(ie(e.key), !0)) }, [ M("div", Tc, [M("div", { style: L({ fontSize: "10px", fontWeight: "800", - color: re(e.key), + color: ie(e.key), letterSpacing: "0.6px", textTransform: "uppercase" }) }, R(e.label), 5), M("span", { style: L({ fontSize: "9px", fontWeight: "700", color: "#fff", - background: f(re(e.key), .22), - border: `1px solid ${f(re(e.key), .48)}`, + background: f(ie(e.key), .22), + border: `1px solid ${f(ie(e.key), .48)}`, borderRadius: "999px", padding: "2px 8px", letterSpacing: "0.4px", @@ -6735,7 +6735,7 @@ var Vo = ["title"], Ho = ["src"], Uo = { "word-break": "break-word", cursor: "pointer" }, - onClick: (t) => D(e.model, t.currentTarget) + onClick: (t) => E(e.model, t.currentTarget) }, R(e.model || "-"), 9, Dc)]), e.loras?.length ? (I(), z("div", Oc, [M("div", kc, R(B(O)("sidebar.generation.loraStack", "LoRA Stack")), 1), M("div", Ac, [(I(!0), z(j, null, F(e.loras, (t, n) => (I(), z("div", { key: `${e.key}-lora-${n}`, @@ -6750,7 +6750,7 @@ var Vo = ["title"], Ho = ["src"], Uo = { border: "1px solid rgba(255,255,255,0.08)", cursor: "pointer" }, - onClick: (e) => D(t, e.currentTarget) + onClick: (e) => E(t, e.currentTarget) }, R(t), 9, jc))), 128))])])) : N("", !0) ], 4))), 128))])], 4)) : N("", !0), (I(!0), z(j, null, F(te.value, (e) => (I(), z("div", { @@ -6786,7 +6786,7 @@ var Vo = ["title"], Ho = ["src"], Uo = { "white-space": "pre-wrap", cursor: "pointer" }, - onClick: (e) => D(t.value, e.currentTarget) + onClick: (e) => E(t.value, e.currentTarget) }, R(t.value), 9, Fc)], 64))), 128))])], 4))), 128)), _.value.notesFields.length ? (I(), z("div", { key: 10, @@ -6802,7 +6802,7 @@ var Vo = ["title"], Ho = ["src"], Uo = { "word-break": "break-word", cursor: "pointer" }, - onClick: (t) => D(e.value, t.currentTarget) + onClick: (t) => E(e.value, t.currentTarget) }, R(e.value), 9, Lc))), 128))], 4)) : N("", !0), _.value.moduleBlocks.length ? (I(), z("div", { key: 11, @@ -6838,7 +6838,7 @@ var Vo = ["title"], Ho = ["src"], Uo = { "word-break": "break-word", cursor: "pointer" }, - onClick: (e) => D(t.value, e.currentTarget) + onClick: (e) => E(t.value, e.currentTarget) }, R(t.value), 9, Vc)]))), 128))], 4))), 128))])], 4)) : N("", !0), _.value.ttsInstruction ? (I(), z("div", { key: 12, @@ -6853,7 +6853,7 @@ var Vo = ["title"], Ho = ["src"], Uo = { "word-break": "break-word", cursor: "pointer" }, - onClick: t[6] ||= (e) => D(_.value.ttsInstruction, e.currentTarget) + onClick: t[6] ||= (e) => E(_.value.ttsInstruction, e.currentTarget) }, R(_.value.ttsInstruction), 9, Uc)], 4)) : N("", !0), _.value.seed !== null && _.value.seed !== void 0 && _.value.seed !== "" ? (I(), z("div", { key: 13, @@ -6871,7 +6871,7 @@ var Vo = ["title"], Ho = ["src"], Uo = { "border-radius": "4px", transition: "background 0.2s" }, - onClick: t[7] ||= (e) => D(_.value.seed, e.currentTarget, "rgba(76, 175, 80, 0.4)") + onClick: t[7] ||= (e) => E(_.value.seed, e.currentTarget, "rgba(76, 175, 80, 0.4)") }, R(_.value.seed), 9, Gc)], 4)) : N("", !0), _.value.inputFiles.length ? (I(), z("div", { key: 14, @@ -7271,23 +7271,23 @@ var Vo = ["title"], Ho = ["src"], Uo = { label: "Expanded", height: 220 } - ]), o = V(null), s = V(""), c = V(!1), l = V(!1), d = V(null), f = V(!1), p = V(null), m = V([]), g = V(null), v = V(!1), y = V(!1), b = V(ce()), x = V({ ...i }), S = V("crosshair"), C = V(""), te = null, w = null, T = null; - function E(e, t, n) { + ]), o = V(null), s = V(""), c = V(!1), l = V(!1), d = V(null), f = V(!1), p = V(null), m = V([]), g = V(null), v = V(!1), y = V(!1), b = V(ue()), x = V({ ...i }), S = V("crosshair"), C = V(""), te = null, w = null, T = null; + function re(e, t, n) { let r = Number(e); return Number.isFinite(r) ? Math.max(t, Math.min(n, r)) : t; } - function re(e) { + function ie(e) { e && typeof e == "object" && (x.value = { ...x.value, - zoom: E(e.zoom ?? x.value.zoom, ou, su), + zoom: re(e.zoom ?? x.value.zoom, ou, su), centerX: Number.isFinite(Number(e.centerX)) ? Number(e.centerX) : null, centerY: Number.isFinite(Number(e.centerY)) ? Number(e.centerY) : null }); } - function D() { + function E() { x.value = { ...i }, C.value = ""; } - function ie(e) { + function ae(e) { let t = e?.metadata_raw ?? null; if (!t) return null; if (typeof t == "object") return t; @@ -7303,7 +7303,7 @@ var Vo = ["title"], Ho = ["src"], Uo = { } return null; } - function ae(e) { + function oe(e) { try { let t = Object.entries(e || {}); if (!t.length) return !1; @@ -7314,8 +7314,8 @@ var Vo = ["title"], Ho = ["src"], Uo = { } return !1; } - function oe(e) { - let t = ie(e), n = e?.workflow || e?.Workflow || e?.comfy_workflow || t?.workflow || t?.Workflow || t?.comfy_workflow || null; + function se(e) { + let t = ae(e), n = e?.workflow || e?.Workflow || e?.comfy_workflow || t?.workflow || t?.Workflow || t?.comfy_workflow || null; if (!n) return null; if (typeof n == "object") return n; if (typeof n == "string") { @@ -7329,23 +7329,23 @@ var Vo = ["title"], Ho = ["src"], Uo = { } return null; } - function se(e) { - let t = ie(e), n = e?.prompt || e?.Prompt || t?.prompt || t?.Prompt || null; + function ce(e) { + let t = ae(e), n = e?.prompt || e?.Prompt || t?.prompt || t?.Prompt || null; if (!n) return null; - if (typeof n == "object") return ae(n) ? n : null; + if (typeof n == "object") return oe(n) ? n : null; if (typeof n == "string") { let e = n.trim(); if (!e) return null; try { let t = JSON.parse(e); - return ae(t) ? t : null; + return oe(t) ? t : null; } catch { return null; } } return null; } - function ce() { + function ue() { try { let e = Xt?.()?.workflowMinimap; if (e && typeof e == "object") return { @@ -7356,7 +7356,7 @@ var Vo = ["title"], Ho = ["src"], Uo = { console.debug?.(e); } try { - let e = localStorage?.getItem?.(Ce); + let e = localStorage?.getItem?.(le); if (!e) return { ...r }; let t = JSON.parse(e); if (!t || typeof t != "object") return { ...r }; @@ -7369,7 +7369,7 @@ var Vo = ["title"], Ho = ["src"], Uo = { e.workflowMinimap = { ...e.workflowMinimap, ...n - }, G(e), localStorage?.removeItem?.(Ce); + }, G(e), localStorage?.removeItem?.(le); } catch (e) { console.debug?.(e); } @@ -7378,7 +7378,7 @@ var Vo = ["title"], Ho = ["src"], Uo = { return { ...r }; } } - function le(e) { + function de(e) { try { let t = Xt(); t.workflowMinimap = { @@ -7389,21 +7389,21 @@ var Vo = ["title"], Ho = ["src"], Uo = { console.debug?.(e); } } - let ue = P(() => { - let e = oe(n.asset) || oe(d.value), t = se(n.asset) || se(d.value); + let D = P(() => { + let e = se(n.asset) || se(d.value), t = ce(n.asset) || ce(d.value); return !e && !t ? null : e || Oa(t); - }), de = P(() => String(n.asset?.filepath || n.asset?.path || n.asset?.file_info?.filepath || "").trim()), fe = P(() => { - if (de.value.toLowerCase().endsWith(".json")) return !0; + }), fe = P(() => String(n.asset?.filepath || n.asset?.path || n.asset?.file_info?.filepath || "").trim()), pe = P(() => { + if (fe.value.toLowerCase().endsWith(".json")) return !0; let e = String(n.asset?.kind || "").trim().toLowerCase(), t = String(n.asset?.source || "").trim().toLowerCase(); return e === "workflow" || t === "workflow"; - }), pe = P(() => String(n.asset?.display_name || n.asset?.name || n.asset?.filename || n.asset?.title || "Workflow").trim()), me = P(() => String(n.asset?.task || n.asset?.workflow_task || "").trim()), he = P(() => String(n.asset?.model_family || n.asset?.workflow_model_family || "").trim()), ge = P(() => String(n.asset?.provider || n.asset?.workflow_provider || "").trim()), _e = P(() => String(n.asset?.runs_on || n.asset?.runsOn || "").trim().toLowerCase()), ve = P(() => { - let e = _e.value, t = ge.value; + }), me = P(() => String(n.asset?.display_name || n.asset?.name || n.asset?.filename || n.asset?.title || "Workflow").trim()), he = P(() => String(n.asset?.task || n.asset?.workflow_task || "").trim()), ge = P(() => String(n.asset?.model_family || n.asset?.workflow_model_family || "").trim()), _e = P(() => String(n.asset?.provider || n.asset?.workflow_provider || "").trim()), ve = P(() => String(n.asset?.runs_on || n.asset?.runsOn || "").trim().toLowerCase()), ye = P(() => { + let e = ve.value, t = _e.value; return e === "api" && t ? `API · ${t}` : e ? t && t.toLowerCase() !== e ? `${e} · ${t}` : e : t; - }), ye = P(() => String(n.asset?.notes || "").trim()), be = P(() => [ + }), be = P(() => String(n.asset?.notes || "").trim()), Se = P(() => [ n.asset?.detected_task ? `detected: ${n.asset.detected_task}` : "", n.asset?.detected_model_family ? n.asset.detected_model_family : "", n.asset?.detected_provider ? n.asset.detected_provider : "" - ].filter(Boolean).join(" · ")), Se = P(() => Be(n.asset?.missing_nodes || n.asset?.missingNodes)), we = P(() => Be(n.asset?.missing_models || n.asset?.missingModels)), Te = P(() => Be(n.asset?.tags || n.asset?.workflow_tags || n.asset?.tags_json)), De = P(() => Te.value.slice(0, 3)), Oe = P(() => Math.max(0, Te.value.length - De.value.length)), ke = P(() => Be(p.value?.missing_nodes)), Ae = P(() => Be(p.value?.missing_models)), je = P(() => Be(p.value?.warnings)), Me = P(() => { + ].filter(Boolean).join(" · ")), Ce = P(() => Be(n.asset?.missing_nodes || n.asset?.missingNodes)), we = P(() => Be(n.asset?.missing_models || n.asset?.missingModels)), Te = P(() => Be(n.asset?.tags || n.asset?.workflow_tags || n.asset?.tags_json)), De = P(() => Te.value.slice(0, 3)), Oe = P(() => Math.max(0, Te.value.length - De.value.length)), ke = P(() => Be(p.value?.missing_nodes)), Ae = P(() => Be(p.value?.missing_models)), je = P(() => Be(p.value?.warnings)), Me = P(() => { let e = p.value; return e ? `${Number(e.node_count || 0)} nodes | ${Number(e.subgraph_count || 0)} subgraphs | ${Array.isArray(e.required_nodes) ? e.required_nodes.length : 0} node types` : ""; }), Ne = P(() => { @@ -7475,8 +7475,8 @@ var Vo = ["title"], Ho = ["src"], Uo = { } } async function k() { - if (ue.value) return; - let e = de.value; + if (D.value) return; + let e = fe.value; if (e && !l.value) { l.value = !0; try { @@ -7495,7 +7495,7 @@ var Vo = ["title"], Ho = ["src"], Uo = { } } } - let He = P(() => n.asset?.has_generation_data ? "Complete" : "Partial"), Ue = P(() => ue.value ? JSON.stringify(ue.value, null, 2) : ""), A = P(() => String(n.asset?.category || n.asset?.subfolder || n.asset?.folder || "").trim().replace(/^\/+|\/+$/g, "")), We = P(() => A.value ? A.value.split(/[\\/]+/).filter(Boolean) : []), Ge = P(() => We.value.at(-1) || A.value || "Root"), qe = P(() => We.value.slice(-1)); + let He = P(() => n.asset?.has_generation_data ? "Complete" : "Partial"), Ue = P(() => D.value ? JSON.stringify(D.value, null, 2) : ""), A = P(() => String(n.asset?.category || n.asset?.subfolder || n.asset?.folder || "").trim().replace(/^\/+|\/+$/g, "")), We = P(() => A.value ? A.value.split(/[\\/]+/).filter(Boolean) : []), Ge = P(() => We.value.at(-1) || A.value || "Root"), qe = P(() => We.value.slice(-1)); function Je(e, t) { let n = e?.id ?? e?.key ?? t + 1; return String(e?.title || e?._meta?.title || e?.type || e?.class_type || e?.name || `Node ${n}`); @@ -7507,7 +7507,7 @@ var Vo = ["title"], Ho = ["src"], Uo = { s.value = A.value; } async function Ze() { - if (!fe.value) return; + if (!pe.value) return; let e = String(n.asset?.filepath || n.asset?.path || n.asset?.file_info?.filepath || "").trim(); if (!e) { t(O("toast.workflowMissingPath", "Workflow file path is missing."), "error"); @@ -7534,7 +7534,7 @@ var Vo = ["title"], Ho = ["src"], Uo = { } } async function Qe() { - let e = de.value; + let e = fe.value; if (!e) { t(O("toast.workflowMissingPath", "Workflow file path is missing."), "error"); return; @@ -7565,13 +7565,13 @@ var Vo = ["title"], Ho = ["src"], Uo = { o?.ok ? (t(O("toast.workflowUpdated", "Workflow updated"), "success", 1800), window?.dispatchEvent?.(new CustomEvent("mjr:reload-grid", { detail: { reason: "workflow-thumbnail-sidebar" } }))) : t(o?.error || O("toast.workflowSaveFailed", "Failed to save workflow."), "error"); } async function $e() { - if (await k(), !ue.value) t(O("toast.workflowLoadFailed", "Failed to load workflow."), "error"); + if (await k(), !D.value) t(O("toast.workflowLoadFailed", "Failed to load workflow."), "error"); else try { await et.openAssets({ assets: [{ ...n.asset, - workflow: ue.value, - Workflow: ue.value + workflow: D.value, + Workflow: D.value }], index: 0, mode: "graph" @@ -7581,7 +7581,7 @@ var Vo = ["title"], Ho = ["src"], Uo = { } } async function ot() { - let e = de.value; + let e = fe.value; if (!e) t(O("toast.workflowMissingPath", "Workflow file path is missing."), "error"); else { f.value = !0, p.value = null, m.value = [], g.value = null; @@ -7604,7 +7604,7 @@ var Vo = ["title"], Ho = ["src"], Uo = { } } } - let ct = P(() => (Array.isArray(ue.value?.nodes) ? ue.value.nodes : []).slice(0, cu).map((e, t) => { + let ct = P(() => (Array.isArray(D.value?.nodes) ? D.value.nodes : []).slice(0, cu).map((e, t) => { let n = e?.id ?? e?.key ?? t + 1, r = Ye(e); return { key: String(n), @@ -7616,7 +7616,7 @@ var Vo = ["title"], Ho = ["src"], Uo = { } }; })), ut = P(() => Math.max(0, Number(dt.value.nodes || 0) - ct.value.length)), dt = P(() => { - let e = ue.value; + let e = D.value; return e ? { nodes: Array.isArray(e?.nodes) ? e.nodes.length : 0, links: Array.isArray(e?.links) && e.links.length || Array.isArray(e?.extra?.links) && e.extra.links.length || 0, @@ -7669,7 +7669,7 @@ var Vo = ["title"], Ho = ["src"], Uo = { } ]); function ht() { - let e = o.value, t = ue.value; + let e = o.value, t = D.value; if (!e || !t) return; let n = Math.max(1, e.clientWidth || 320), r = Math.max(1, e.clientHeight || 120), i = Math.max(1, Math.min(2, window.devicePixelRatio || 1)); e.width = Math.floor(n * i), e.height = Math.floor(r * i); @@ -7677,7 +7677,7 @@ var Vo = ["title"], Ho = ["src"], Uo = { a && a.setTransform(i, 0, 0, i, 0, 0), w = va(e, t, { ...b.value, view: x.value - }) || null, re(w?.resolvedView); + }) || null, ie(w?.resolvedView); } function gt(e) { Ke(e); @@ -7732,12 +7732,12 @@ var Vo = ["title"], Ho = ["src"], Uo = { function Tt(e) { let t = vt(e), n = w?.resolvedView; if (!t || !n) return; - let r = E(Number(e?.deltaY) || 0, -240, 240), i = Math.exp(-r * .0025), a = E((Number(x.value.zoom) || 1) * i, ou, su); + let r = re(Number(e?.deltaY) || 0, -240, 240), i = Math.exp(-r * .0025), a = re((Number(x.value.zoom) || 1) * i, ou, su); if (Math.abs(a - (Number(x.value.zoom) || 1)) < .001) { e.preventDefault?.(), e.stopPropagation?.(); return; } - let o = Math.max(1, Number(w?.bounds?.width || 1) / a), s = Math.max(1, Number(w?.bounds?.height || 1) / a), c = E((Number(t.world.x) - Number(n.viewMinX || 0)) / Math.max(1, Number(n.visibleW || 1)), 0, 1), l = E((Number(t.world.y) - Number(n.viewMinY || 0)) / Math.max(1, Number(n.visibleH || 1)), 0, 1); + let o = Math.max(1, Number(w?.bounds?.width || 1) / a), s = Math.max(1, Number(w?.bounds?.height || 1) / a), c = re((Number(t.world.x) - Number(n.viewMinX || 0)) / Math.max(1, Number(n.visibleW || 1)), 0, 1), l = re((Number(t.world.y) - Number(n.viewMinY || 0)) / Math.max(1, Number(n.visibleH || 1)), 0, 1); x.value = { ...x.value, zoom: a, @@ -7747,25 +7747,25 @@ var Vo = ["title"], Ho = ["src"], Uo = { } function Et(e) { let t = vt(e); - D(), t && gt(t.world), ht(), e.preventDefault?.(), e.stopPropagation?.(); + E(), t && gt(t.world), ht(), e.preventDefault?.(), e.stopPropagation?.(); } function Dt(e) { b.value = { ...b.value, [e]: !b.value?.[e] - }, le(b.value); + }, de(b.value); } function Ot(e) { a.some((t) => t.key === e) && (b.value = { ...b.value, size: e - }, le(b.value)); + }, de(b.value)); } return Mt(() => { o.value && typeof ResizeObserver == "function" && (te = new ResizeObserver(() => ht()), te.observe(o.value)), Xe(), k(), ht(); - }), at(ue, () => { - D(), ht(); - }, { flush: "post" }), at(de, () => { + }), at(D, () => { + E(), ht(); + }, { flush: "post" }), at(fe, () => { d.value = null, k(); }, { immediate: !0 }), at(A, () => { Xe(); @@ -7785,7 +7785,7 @@ var Vo = ["title"], Ho = ["src"], Uo = { te = null, T = null; }), (e, t) => { let n = rt("MButton"), r = rt("MTree"); - return ue.value ? (I(), z("div", Yc, [ + return D.value ? (I(), z("div", Yc, [ t[18] ||= M("div", { style: { "font-size": "13px", "font-weight": "600", @@ -7795,8 +7795,8 @@ var Vo = ["title"], Ho = ["src"], Uo = { "letter-spacing": "0.5px" } }, " ComfyUI Workflow ", -1), M("div", Xc, [ - M("div", Zc, R(pe.value), 1), - de.value ? (I(), z("div", { + M("div", Zc, R(me.value), 1), + fe.value ? (I(), z("div", { key: 0, style: { "font-size": "11px", @@ -7806,8 +7806,8 @@ var Vo = ["title"], Ho = ["src"], Uo = { "text-overflow": "ellipsis", "white-space": "nowrap" }, - title: de.value - }, R(de.value), 9, Qc)) : N("", !0), + title: fe.value + }, R(fe.value), 9, Qc)) : N("", !0), Re.value.length ? (I(), z("div", $c, [(I(!0), z(j, null, F(Re.value, (e) => (I(), z("span", { key: e.key, style: L(ze(e.tone)), @@ -7822,27 +7822,27 @@ var Vo = ["title"], Ho = ["src"], Uo = { ]), M("div", nl, [M("div", rl, R(He.value), 1), dt.value.source ? (I(), z("div", il, R(dt.value.source), 1)) : N("", !0)]), M("div", al, [ - me.value ? (I(), z("div", ol, [t[3] ||= M("div", { style: { + he.value ? (I(), z("div", ol, [t[3] ||= M("div", { style: { "font-size": "10px", "font-weight": "700", color: "rgba(255,255,255,0.55)", "text-transform": "uppercase", "letter-spacing": "0.4px" - } }, "Task", -1), M("div", sl, R(me.value), 1)])) : N("", !0), - he.value ? (I(), z("div", cl, [t[4] ||= M("div", { style: { + } }, "Task", -1), M("div", sl, R(he.value), 1)])) : N("", !0), + ge.value ? (I(), z("div", cl, [t[4] ||= M("div", { style: { "font-size": "10px", "font-weight": "700", color: "rgba(255,255,255,0.55)", "text-transform": "uppercase", "letter-spacing": "0.4px" - } }, "Model", -1), M("div", ll, R(he.value), 1)])) : N("", !0), - ve.value ? (I(), z("div", ul, [t[5] ||= M("div", { style: { + } }, "Model", -1), M("div", ll, R(ge.value), 1)])) : N("", !0), + ye.value ? (I(), z("div", ul, [t[5] ||= M("div", { style: { "font-size": "10px", "font-weight": "700", color: "rgba(255,255,255,0.55)", "text-transform": "uppercase", "letter-spacing": "0.4px" - } }, "Runs on", -1), M("div", dl, R(ve.value), 1)])) : N("", !0), + } }, "Runs on", -1), M("div", dl, R(ye.value), 1)])) : N("", !0), Fe.value || Le.value ? (I(), z("div", fl, [ t[6] ||= M("div", { style: { "font-size": "10px", @@ -7855,7 +7855,7 @@ var Vo = ["title"], Ho = ["src"], Uo = { Fe.value && Le.value ? (I(), z("div", ml, R(Le.value), 1)) : N("", !0) ])) : N("", !0) ]), - Se.value.length || we.value.length ? (I(), z("div", hl, [ + Ce.value.length || we.value.length ? (I(), z("div", hl, [ t[7] ||= M("div", { style: { "font-size": "10px", "font-weight": "800", @@ -7864,7 +7864,7 @@ var Vo = ["title"], Ho = ["src"], Uo = { "letter-spacing": "0.4px", "margin-bottom": "6px" } }, "Missing dependencies", -1), - Se.value.length ? (I(), z("div", { + Ce.value.length ? (I(), z("div", { key: 0, style: L({ display: "flex", @@ -7872,7 +7872,7 @@ var Vo = ["title"], Ho = ["src"], Uo = { gap: "5px", marginBottom: we.value.length ? "7px" : "0" }) - }, [(I(!0), z(j, null, F(Se.value, (e) => (I(), z("span", { + }, [(I(!0), z(j, null, F(Ce.value, (e) => (I(), z("span", { key: `node-${e}`, style: { padding: "3px 7px", @@ -7895,14 +7895,14 @@ var Vo = ["title"], Ho = ["src"], Uo = { } }, R(e), 1))), 128))])) : N("", !0) ])) : N("", !0), - ye.value || be.value ? (I(), z("div", _l, [ye.value ? (I(), z("div", vl, R(ye.value), 1)) : N("", !0), be.value ? (I(), z("div", { + be.value || Se.value ? (I(), z("div", _l, [be.value ? (I(), z("div", vl, R(be.value), 1)) : N("", !0), Se.value ? (I(), z("div", { key: 1, style: L({ fontSize: "11px", color: "rgba(255,255,255,0.48)", - marginTop: ye.value ? "7px" : "0" + marginTop: be.value ? "7px" : "0" }) - }, R(be.value), 5)) : N("", !0)])) : N("", !0), + }, R(Se.value), 5)) : N("", !0)])) : N("", !0), M("div", yl, [ yt(n, { type: "button", @@ -8030,7 +8030,7 @@ var Vo = ["title"], Ho = ["src"], Uo = { "letter-spacing": "0.4px" } }, "Groups", -1), M("div", Il, R(dt.value.groups), 1)]) ]), - fe.value ? (I(), z("div", Ll, [M("div", Rl, [M("div", zl, [t[14] ||= M("div", { style: { + pe.value ? (I(), z("div", Ll, [M("div", Rl, [M("div", zl, [t[14] ||= M("div", { style: { "font-size": "10px", "font-weight": "700", color: "rgba(255,255,255,0.55)", diff --git a/dist/chunks/TagsEditor-CPV0rYyM.js b/dist/chunks/TagsEditor-Dd6Rh_zi.js similarity index 97% rename from dist/chunks/TagsEditor-CPV0rYyM.js rename to dist/chunks/TagsEditor-Dd6Rh_zi.js index a4fd667f..57c85146 100644 --- a/dist/chunks/TagsEditor-CPV0rYyM.js +++ b/dist/chunks/TagsEditor-Dd6Rh_zi.js @@ -1,6 +1,6 @@ -import { $t as e, F as t, v as n } from "./viewerRuntimeHosts-D3Jyfx0-.js"; -import { m as r, n as i, wt as a } from "./events-BRfpU-6M.js"; -import { Y as o } from "./Viewer-geJFRz8N.js"; +import { $t as e, F as t, v as n } from "./viewerRuntimeHosts-nMPP59FX.js"; +import { m as r, n as i, wt as a } from "./events-ChGln7ff.js"; +import { Y as o } from "./Viewer-BvNSchxR.js"; import { A as s, C as c, E as l, G as u, J as d, K as f, L as p, N as m, R as ee, T as h, U as te, V as g, Y as _, b as ne, ft as v, j as y, k as b, lt as x, rt as S, ut as C, z as w } from "./mjr-primevue-BRqtdXzb.js"; // ui/vue/components/common/TagsEditor.vue?vue&type=script&setup=true&lang.ts var T = ["aria-busy"], re = ["aria-label"], ie = { diff --git a/dist/chunks/Viewer-geJFRz8N.js b/dist/chunks/Viewer-BvNSchxR.js similarity index 99% rename from dist/chunks/Viewer-geJFRz8N.js rename to dist/chunks/Viewer-BvNSchxR.js index f60897c3..6f057fff 100644 --- a/dist/chunks/Viewer-geJFRz8N.js +++ b/dist/chunks/Viewer-BvNSchxR.js @@ -1,9 +1,9 @@ -import { $t as e, H as t, P as n, _ as r, c as i, d as a, g as o, gt as s, n as c, o as l, r as u, s as d, vt as f, x as p, y as m } from "./viewerRuntimeHosts-D3Jyfx0-.js"; -import { D as h, Tt as g, a as _, at as v, h as y, ht as b, i as x, j as S, k as C, m as w, n as T, o as E, r as D, t as O, ut as k } from "./events-BRfpU-6M.js"; +import { $t as e, H as t, P as n, _ as r, c as i, d as a, g as o, gt as s, n as c, o as l, r as u, s as d, vt as f, x as p, y as m } from "./viewerRuntimeHosts-nMPP59FX.js"; +import { D as h, Tt as g, a as _, at as v, h as y, ht as b, i as x, j as S, k as C, m as w, n as T, o as E, r as D, t as O, ut as k } from "./events-ChGln7ff.js"; import { T as A, nt as j, rt as M } from "./mjr-primevue-BRqtdXzb.js"; import { n as N, r as ee } from "./mjr-vue-vendor-mHY_eIVE.js"; import { n as P, r as te, t as F } from "./state-D0Gu1AgG.js"; -import { a as ne, c as re, i as ie, o as ae, r as oe, s as se } from "./model3dRenderer-DdPKugXy.js"; +import { a as ne, c as re, i as ie, o as ae, r as oe, s as se } from "./model3dRenderer-DcswIkFn.js"; // ui/utils/events.ts function ce(e, t, { target: n = null, warnPrefix: r = "[Majoor]" } = {}) { let i = n || (typeof window < "u" ? window : null); @@ -34,7 +34,11 @@ var le = async (e, t = "Majoor", n = {}) => { let i = R(); if (i) try { let n = String(e || ""); - typeof i.addAlert == "function" ? i.addAlert(n) : i.add({ + typeof i.info == "function" ? i.info(String(t || "Majoor"), { + description: n, + duration: 5e3, + closable: !0 + }) : typeof i.addAlert == "function" ? i.addAlert(n) : typeof i.add == "function" && i.add({ severity: "info", summary: String(t || "Majoor"), detail: n, @@ -356,7 +360,7 @@ var le = async (e, t = "Majoor", n = {}) => { }, R = () => { try { let e = C(); - if (e && typeof e.add == "function") return e; + if (e) return e; } catch (e) { console.debug?.(e); } @@ -9619,13 +9623,13 @@ var Wr = null, Gr = null, Kr = null, qr = null, Jr = null, Yr = null; function Xr() { Wr || import("./abCompare-BUrGm4-x.js").then((e) => { Wr = e; - }), Gr || import("./sideBySide-sOf24A5X.js").then((e) => { + }), Gr || import("./sideBySide-t394tgpD.js").then((e) => { Gr = e; - }), Kr || import("./model3dRenderer-DdPKugXy.js").then((e) => e.t).then((e) => { + }), Kr || import("./model3dRenderer-DcswIkFn.js").then((e) => e.t).then((e) => { Kr = e; }), qr || import("./scopes-bvTRS68K.js").then((e) => { qr = e; - }), Jr || import("./genInfo-BkEKNdy-.js").then((e) => e.n).then((e) => { + }), Jr || import("./genInfo-CYK2drm1.js").then((e) => e.n).then((e) => { Jr = e; }), Yr || import("./frameExport-CnNO7oN6.js").then((e) => { Yr = e; diff --git a/dist/chunks/ViewerPortal-BStxU0ID.js b/dist/chunks/ViewerPortal-BxqCZGmO.js similarity index 97% rename from dist/chunks/ViewerPortal-BStxU0ID.js rename to dist/chunks/ViewerPortal-BxqCZGmO.js index 85eee5b1..d099ffb9 100644 --- a/dist/chunks/ViewerPortal-BStxU0ID.js +++ b/dist/chunks/ViewerPortal-BxqCZGmO.js @@ -1,9 +1,9 @@ -import { a as e, i as t } from "./viewerRuntimeHosts-D3Jyfx0-.js"; -import { r as n } from "./events-BRfpU-6M.js"; -import { a as r, c as i, i as a, l as o, o as s, s as c, t as l, u } from "./Viewer-geJFRz8N.js"; -import { i as d, r as f } from "./floatingViewerManager-Gv7MTmpu.js"; +import { a as e, i as t } from "./viewerRuntimeHosts-nMPP59FX.js"; +import { r as n } from "./events-ChGln7ff.js"; +import { a as r, c as i, i as a, l as o, o as s, s as c, t as l, u } from "./Viewer-BvNSchxR.js"; +import { i as d, r as f } from "./floatingViewerManager-DGIaL-BQ.js"; import { B as p, C as m, D as h, E as g, G as _, J as v, K as y, L as b, N as x, O as S, T as C, U as w, V as T, dt as E, ft as D, j as O, k, lt as A, rt as j, ut as M, w as N, z as P } from "./mjr-primevue-BRqtdXzb.js"; -import { t as F } from "./TagsEditor-CPV0rYyM.js"; +import { t as F } from "./TagsEditor-Dd6Rh_zi.js"; // ui/vue/components/viewer/FloatingViewerHost.vue var I = /* @__PURE__ */ x({ __name: "FloatingViewerHost", diff --git a/dist/chunks/events-BRfpU-6M.js b/dist/chunks/events-ChGln7ff.js similarity index 99% rename from dist/chunks/events-BRfpU-6M.js rename to dist/chunks/events-ChGln7ff.js index fd1f95f0..72d6efde 100644 --- a/dist/chunks/events-BRfpU-6M.js +++ b/dist/chunks/events-ChGln7ff.js @@ -465,7 +465,7 @@ function ye(e) { } function be(e) { let t = M(e)?.toast || null; - return t && typeof t.add == "function" ? t : null; + return t && (typeof t.add == "function" || typeof t.success == "function" || typeof t.info == "function") ? t : null; } function xe(e) { let t = M(e)?.dialog || null; diff --git a/dist/chunks/floatingViewerManager-Gv7MTmpu.js b/dist/chunks/floatingViewerManager-DGIaL-BQ.js similarity index 99% rename from dist/chunks/floatingViewerManager-Gv7MTmpu.js rename to dist/chunks/floatingViewerManager-DGIaL-BQ.js index 3775a913..29ec7d2c 100644 --- a/dist/chunks/floatingViewerManager-Gv7MTmpu.js +++ b/dist/chunks/floatingViewerManager-DGIaL-BQ.js @@ -1,6 +1,6 @@ import { t as e } from "./rolldown-runtime-CGnMp29N.js"; -import { _ as t, d as n, o as r, s as i, t as a } from "./viewerRuntimeHosts-D3Jyfx0-.js"; -import { B as o, o as s, r as c } from "./events-BRfpU-6M.js"; +import { _ as t, d as n, o as r, s as i, t as a } from "./viewerRuntimeHosts-nMPP59FX.js"; +import { B as o, o as s, r as c } from "./events-ChGln7ff.js"; // ui/features/panel/panelRuntimeRefs.ts var l = null; function u(e) { @@ -96,7 +96,7 @@ var te = /* @__PURE__ */ e({ teardownFloatingViewerManager: () => we }), v = null, y = null; async function ne() { - return v || (y ||= import("./FloatingViewer-Cccq5sHS.js").then((e) => (v = e.FloatingViewer, v)), y); + return v || (y ||= import("./FloatingViewer-BlImyYVf.js").then((e) => (v = e.FloatingViewer, v)), y); } var b = null, re = null; async function ie() { diff --git a/dist/chunks/genInfo-BkEKNdy-.js b/dist/chunks/genInfo-CYK2drm1.js similarity index 99% rename from dist/chunks/genInfo-BkEKNdy-.js rename to dist/chunks/genInfo-CYK2drm1.js index 4fbbf7a3..6fac0e2f 100644 --- a/dist/chunks/genInfo-BkEKNdy-.js +++ b/dist/chunks/genInfo-CYK2drm1.js @@ -1,7 +1,7 @@ import { t as e } from "./rolldown-runtime-CGnMp29N.js"; -import { m as t, o as n } from "./events-BRfpU-6M.js"; -import { h as r } from "./Viewer-geJFRz8N.js"; -import { i, n as a, r as o, t as s, u as c } from "./SidebarWorkflowSection-BihItyAk.js"; +import { m as t, o as n } from "./events-ChGln7ff.js"; +import { h as r } from "./Viewer-BvNSchxR.js"; +import { i, n as a, r as o, t as s, u as c } from "./SidebarWorkflowSection-BR3ECa3i.js"; import { D as l, E as u, N as d, O as f, T as p, V as m, dt as h, ft as g, k as _, lt as v } from "./mjr-primevue-BRqtdXzb.js"; // ui/vue/components/viewer/ViewerMetadataBlock.vue?vue&type=script&setup=true&lang.ts var y = { style: { diff --git a/dist/chunks/model3dRenderer-DdPKugXy.js b/dist/chunks/model3dRenderer-DcswIkFn.js similarity index 99% rename from dist/chunks/model3dRenderer-DdPKugXy.js rename to dist/chunks/model3dRenderer-DcswIkFn.js index 67ce336c..d728cab0 100644 --- a/dist/chunks/model3dRenderer-DdPKugXy.js +++ b/dist/chunks/model3dRenderer-DcswIkFn.js @@ -1,5 +1,5 @@ import { t as e } from "./rolldown-runtime-CGnMp29N.js"; -import { gt as t, m as n, o as r, r as i } from "./events-BRfpU-6M.js"; +import { gt as t, m as n, o as r, r as i } from "./events-ChGln7ff.js"; import { n as a } from "./state-D0Gu1AgG.js"; // ui/features/viewer/model3dCore.ts function o(e, t) { diff --git a/dist/chunks/openMajoorSettings-Cd5Nutru.js b/dist/chunks/openMajoorSettings-CdWVeKk-.js similarity index 99% rename from dist/chunks/openMajoorSettings-Cd5Nutru.js rename to dist/chunks/openMajoorSettings-CdWVeKk-.js index 0635730a..c030b002 100644 --- a/dist/chunks/openMajoorSettings-Cd5Nutru.js +++ b/dist/chunks/openMajoorSettings-CdWVeKk-.js @@ -1,6 +1,6 @@ -import { A as e, E as t, S as n, Z as r, b as i, j as a, m as o, z as s } from "./events-BRfpU-6M.js"; +import { A as e, E as t, S as n, Z as r, b as i, j as a, m as o, z as s } from "./events-ChGln7ff.js"; import { a as c, n as l } from "./graphTraversal-DTdQWkn5.js"; -import { S as u, Y as d, b as f, x as p, y as m } from "./SidebarWorkflowSection-BihItyAk.js"; +import { S as u, Y as d, b as f, x as p, y as m } from "./SidebarWorkflowSection-BR3ECa3i.js"; // ui/features/viewer/floatingViewerProgress.ts var h = "progress-update", g = "__MJR_MFV_PROGRESS_SERVICE__"; function ee() { diff --git a/dist/chunks/sideBySide-sOf24A5X.js b/dist/chunks/sideBySide-t394tgpD.js similarity index 99% rename from dist/chunks/sideBySide-sOf24A5X.js rename to dist/chunks/sideBySide-t394tgpD.js index d9223df7..139a7a1a 100644 --- a/dist/chunks/sideBySide-sOf24A5X.js +++ b/dist/chunks/sideBySide-t394tgpD.js @@ -1,4 +1,4 @@ -import { i as e } from "./model3dRenderer-DdPKugXy.js"; +import { i as e } from "./model3dRenderer-DcswIkFn.js"; import { i as t, o as n } from "./geninfoParser-CgHp-y-n.js"; // ui/features/viewer/sideBySide.ts function r(e) { diff --git a/dist/chunks/viewerOpenRequest-Crw9UWH5.js b/dist/chunks/viewerOpenRequest-POEAWUHf.js similarity index 90% rename from dist/chunks/viewerOpenRequest-Crw9UWH5.js rename to dist/chunks/viewerOpenRequest-POEAWUHf.js index 66e81f13..46eca328 100644 --- a/dist/chunks/viewerOpenRequest-Crw9UWH5.js +++ b/dist/chunks/viewerOpenRequest-POEAWUHf.js @@ -1,6 +1,6 @@ import { t as e } from "./rolldown-runtime-CGnMp29N.js"; -import { r as t } from "./events-BRfpU-6M.js"; -import { t as n } from "./Viewer-geJFRz8N.js"; +import { r as t } from "./events-ChGln7ff.js"; +import { t as n } from "./Viewer-BvNSchxR.js"; // ui/features/viewer/viewerOpenRequest.ts var r = /* @__PURE__ */ e({ requestViewerOpen: () => o }); function i(e) { diff --git a/dist/chunks/viewerRuntimeHosts-D3Jyfx0-.js b/dist/chunks/viewerRuntimeHosts-nMPP59FX.js similarity index 84% rename from dist/chunks/viewerRuntimeHosts-D3Jyfx0-.js rename to dist/chunks/viewerRuntimeHosts-nMPP59FX.js index b7725742..828c88e5 100644 --- a/dist/chunks/viewerRuntimeHosts-D3Jyfx0-.js +++ b/dist/chunks/viewerRuntimeHosts-nMPP59FX.js @@ -1,4 +1,4 @@ -import { Ct as e, Tt as t, _t as n, bt as r, it as i, k as a, m as o, o as s, rt as c, vt as l, wt as u, yt as d } from "./events-BRfpU-6M.js"; +import { Ct as e, Tt as t, _t as n, bt as r, it as i, k as a, m as o, o as s, rt as c, vt as l, wt as u, yt as d } from "./events-ChGln7ff.js"; // ui/app/settingsStore.ts var f = "mjrSettings", p = "mjrMinimapSettings", m = /* @__PURE__ */ new Set([ "POST", @@ -700,52 +700,106 @@ function N(e, t = "info", n, r) { } catch {} let i = !(Number.isFinite(Number(n)) && Number(n) > 0); try { - let r = a(); - if (r && typeof r.add == "function") { - let a = t; - a === "warning" && (a = "warn"); - let s = o("manager.title"), c = e; - if (typeof e == "object" && e?.summary) s = e.summary, c = e.detail || ""; - else if (typeof e != "string") try { - c = e.message || String(e); - } catch (e) { - console.debug?.(e); - } - let l = { - severity: a, - summary: s, - detail: c - }; - i || (l.life = n), r.add(l); - return; - } + let o = a(); + if (o && ze(o, e, t, i ? 0 : Number(n), r)) return; } catch (e) { console.debug("Majoor: extensionManager.toast failed", e); } - let s = globalThis?.app || (typeof window < "u" ? window?.app : null); - if (s?.ui?.toast) try { - return s.ui.toast(e, t); - } catch (e) { - console.debug("Native app.ui.toast failed", e); - } console.warn("[Majoor Toast] Native toast API unavailable", { type: t, message: M(e), duration: i ? 0 : n }); } -// ui/api/clientAuth.ts -var Pe = 2e3, Fe = 15e3, Ie = 8e3, P = "token", F = null, I = null, Le = null, Re = "", L = E({ - ttlMs: Pe, - maxSize: 1 -}); -function ze() { - return String(Re || "").trim(); +var Pe = /* @__PURE__ */ new Set([ + "started", + "start", + "queued", + "pending", + "running", + "in_progress", + "progress", + "stopping_workers", + "resetting_db", + "restarting_scan", + "restoring", + "deleting" +]), Fe = 2147483647, P = /* @__PURE__ */ new Map(); +function Ie(e) { + if (e && typeof e == "object") { + let t = String(e.summary || "").trim(), n = String(e.detail || e.message || "").trim(); + return t ? { + title: t, + description: n + } : { + title: o("manager.title"), + description: n || M(e) + }; + } + return { + title: o("manager.title"), + description: M(e) + }; } -function R(e) { - return Re = String(e || "").trim(), !0; +function Le(e) { + return e?.history && typeof e.history == "object" ? e.history : {}; +} +function Re(e) { + let t = Le(e), n = String(t.actionLabel || "").trim(), r = String(t.actionUrl || "").trim(); + if (n && r && /^(https?:\/\/|\/(?!\/))/i.test(r)) return { + label: n, + onClick: () => { + try { + window.open(r, "_blank", "noopener,noreferrer"); + } catch (e) { + console.debug?.(e); + } + } + }; +} +function ze(e, t, n, r, i) { + let { title: a, description: o } = Ie(t), s = Le(i), c = String(s.trackId || "").trim(), l = String(s.status || "").trim().toLowerCase(), u = !!c && Pe.has(l), d = u ? "loading" : n, f = typeof e[d] == "function" ? e[d] : typeof e[n] == "function" ? e[n] : null; + if (f) { + let t = { closable: !0 }; + o && o !== a && (t.description = o), t.duration = r > 0 && !u ? r : Fe; + let n = Re(i); + n && (t.action = n); + let s = c ? P.get(c) : void 0; + s != null && (t.id = s); + let l = f.call(e, a, t); + return c && (u && l != null ? P.set(c, l) : P.delete(c)), !0; + } + if (typeof e.add == "function") { + let t = { + severity: n === "warning" ? "warn" : n, + summary: a, + detail: o + }; + return r > 0 && (t.life = r), e.add(t), !0; + } + return !1; } function Be() { + let e = a(); + for (let t of P.values()) try { + e?.dismiss?.(t); + } catch (e) { + console.debug?.(e); + } + P.clear(); +} +// ui/api/clientAuth.ts +var Ve = 2e3, He = 15e3, Ue = 8e3, F = "token", I = null, L = null, We = null, Ge = "", R = E({ + ttlMs: Ve, + maxSize: 1 +}); +function Ke() { + return String(Ge || "").trim(); +} +function z(e) { + return Ge = String(e || "").trim(), !0; +} +function qe() { try { let e = localStorage?.getItem?.(f), t = e ? JSON.parse(e) : {}, n = t && typeof t == "object" ? t : {}, r = n?.data && typeof n.data == "object" ? n.data : n; r?.security && typeof r.security == "object" && String(r.security.apiToken || "").trim() && (r.security.apiToken = "", localStorage?.setItem?.(f, JSON.stringify(n))); @@ -753,23 +807,23 @@ function Be() { console.debug?.(e); } } -function Ve() { +function Je() { try { - L.delete(P); + R.delete(F); } catch (e) { console.debug?.(e); } - R(""), Be(); + z(""), qe(); } -function z() { - let e = L.get(P); +function B() { + let e = R.get(F); if (e !== void 0) return e; - let t = Date.now(), n = ze(); - if (n) return L.set(P, n, { at: t }), n; + let t = Date.now(), n = Ke(); + if (n) return R.set(F, n, { at: t }), n; try { let e = localStorage?.getItem?.(f), n = e ? JSON.parse(e) : null, r = n?.data && typeof n.data == "object" ? n.data : n, i = String(r?.security?.apiToken || "").trim(); if (i) { - R(i); + z(i); try { let e = n && typeof n == "object" ? n : {}, t = e?.data && typeof e.data == "object" ? e.data : e; t?.security && typeof t.security == "object" && (t.security.apiToken = "", localStorage?.setItem?.(f, JSON.stringify(e)), window?.dispatchEvent?.(new CustomEvent("mjr-settings-changed", { detail: { key: "security.apiToken" } }))); @@ -777,16 +831,16 @@ function z() { console.debug?.(e); } } - return L.set(P, i, { at: t }), i; + return R.set(F, i, { at: t }), i; } catch { - return L.set(P, "", { at: t }), ""; + return R.set(F, "", { at: t }), ""; } } -function B(e) { +function V(e) { let t = String(e || "").trim(); if (!t) return !1; try { - L.set(P, t), I = null, R(t), Be(); + R.set(F, t), L = null, z(t), qe(); try { window?.dispatchEvent?.(new CustomEvent("mjr-settings-changed", { detail: { key: "security.apiToken" } })); } catch (e) { @@ -797,38 +851,38 @@ function B(e) { return !1; } } -var He = /^[A-Za-z0-9._\-~+/]+=*$/; -function Ue(e) { +var Ye = /^[A-Za-z0-9._\-~+/]+=*$/; +function Xe(e) { let t = String(e || "").trim(); - return t ? He.test(t) ? B(t) : (console.debug?.("[MJR auth] Rejected malformed security token (invalid characters)"), !1) : !1; + return t ? Ye.test(t) ? V(t) : (console.debug?.("[MJR auth] Rejected malformed security token (invalid characters)"), !1) : !1; } -function We() { - return !!z(); +function Ze() { + return !!B(); } -function V(e = {}) { - I = { +function H(e = {}) { + L = { code: String(e?.code || "").trim().toUpperCase(), error: String(e?.error || "").trim(), status: Number(e?.status || 0) || 0, at: Date.now() }; } -function Ge() { - let e = I; +function Qe() { + let e = L; if (!e) return null; let t = Date.now() - (Number(e.at || 0) || 0); - return t < 0 || t > Fe ? (I = null, null) : e; + return t < 0 || t > He ? (L = null, null) : e; } -function Ke(e) { - let t = Ge(), n = String(e?.code || "").trim().toUpperCase(), r = String(e?.error || "").trim(), i = String(t?.code || "").trim().toUpperCase(), a = String(t?.error || "").trim().toLowerCase(), s = r.toLowerCase(); +function $e(e) { + let t = Qe(), n = String(e?.code || "").trim().toUpperCase(), r = String(e?.error || "").trim(), i = String(t?.code || "").trim().toUpperCase(), a = String(t?.error || "").trim().toLowerCase(), s = r.toLowerCase(); return n === "FORBIDDEN" && (s.includes("api token over insecure transport") || s.includes("allow http token transport")) ? o("toast.writeAuthInsecureTransport", "Write access is blocked because the Majoor API token is being sent over plain HTTP from a remote machine. Use HTTPS, or enable Settings -> Security -> Allow HTTP Token Transport for a trusted LAN.") : i === "FORBIDDEN" && (a.includes("already configured") || a.includes("rotate-token")) ? o("toast.writeAuthConfiguredTokenRequired", "Write access requires the Majoor API token already configured on the server. Open Settings -> Security -> API Token and enter the matching token.") : i === "AUTH_REQUIRED" && (a.includes("sign in to comfyui") || a.includes("authenticated comfyui user")) ? o("toast.writeAuthSignInRequired", "Write access is blocked. Sign in to ComfyUI first, then retry so Majoor can bootstrap the remote session token automatically.") : i === "BOOTSTRAP_DISABLED" || i === "AUTH_REQUIRED" && a.includes("bootstrap") || n === "AUTH_REQUIRED" && s.includes("api token") ? o("toast.writeAuthBootstrapHelp", "Write access is blocked. Sign in to ComfyUI and retry so Majoor can bootstrap the remote session automatically, or set a Majoor API token in Settings -> Security.") : ""; } -function qe(e) { +function et(e) { let t = String(e || "").trim(); if (!t) return; - let n = Date.now(), r = Le; - if (!(r && r.message === t && n - (Number(r.at || 0) || 0) < Ie)) { - Le = { + let n = Date.now(), r = We; + if (!(r && r.message === t && n - (Number(r.at || 0) || 0) < Ue)) { + We = { message: t, at: n }; @@ -842,16 +896,16 @@ function qe(e) { } } } -function Je(e) { +function tt(e) { let t = String(e?.code || "").trim().toUpperCase(), n = String(e?.error || "").trim().toLowerCase(), r = t === "FORBIDDEN" && n.includes("write operation blocked"); if (t !== "AUTH_REQUIRED" && !r) return e; - let i = Ke(e); - return i ? (qe(i), { + let i = $e(e); + return i ? (et(i), { ...e, error: i }) : e; } -async function Ye() { +async function nt() { try { let e = await fetch("/mjr/am/settings/security/bootstrap-token", { method: "POST", @@ -861,7 +915,7 @@ async function Ye() { }, body: "{}" }); - if (!(e.headers.get("content-type") || "").includes("application/json")) return V({ + if (!(e.headers.get("content-type") || "").includes("application/json")) return H({ code: "INVALID_RESPONSE", error: `Bootstrap token request returned non-JSON response (${e.status})`, status: e.status @@ -870,7 +924,7 @@ async function Ye() { token: !1 }; let t = await e.json().catch((e) => (console.debug?.("[MJR auth] JSON parse error:", e), null)); - if (!t || typeof t != "object") return V({ + if (!t || typeof t != "object") return H({ code: "INVALID_RESPONSE", error: "Bootstrap token response was invalid.", status: e.status @@ -878,7 +932,7 @@ async function Ye() { ok: !1, token: !1 }; - if (!t.ok) return V({ + if (!t.ok) return H({ code: t?.code, error: t?.error, status: e.status @@ -888,14 +942,14 @@ async function Ye() { }; let n = String(t?.data?.token || "").trim(); return n ? { - ok: B(n), + ok: V(n), token: !0 - } : (I = null, { + } : (L = null, { ok: !0, token: !1 }); } catch (e) { - return V({ + return H({ code: "NETWORK_ERROR", error: e?.message || "Bootstrap token request failed.", status: 0 @@ -905,163 +959,163 @@ async function Ye() { }; } } -async function Xe({ force: e = !1, allowCookieRefresh: t = !1 } = {}) { - let n = z(); +async function rt({ force: e = !1, allowCookieRefresh: t = !1 } = {}) { + let n = B(); if (n && !e) return n; let r = { ok: !1, token: !1 }; - F ||= (async () => { + I ||= (async () => { try { - return await Ye(); + return await nt(); } finally { - F = null; + I = null; } })(); try { - r = await F || r; + r = await I || r; } catch (e) { console.debug?.(e); } - if (e && r?.ok && !r?.token && n) Ve(); + if (e && r?.ok && !r?.token && n) Je(); else if (e && !r?.ok) { - let e = Ge(), t = String(e?.code || "").trim().toUpperCase(); - t && ["NETWORK_ERROR", "INVALID_RESPONSE"].includes(t) || Ve(); + let e = Qe(), t = String(e?.code || "").trim().toUpperCase(); + t && ["NETWORK_ERROR", "INVALID_RESPONSE"].includes(t) || Je(); } - let i = z(); + let i = B(); return !i && t && r?.ok ? !0 : i; } -function Ze() { - L.clear(); +function it() { + R.clear(); } // ui/api/clientOps.ts -async function Qe(e) { +async function at(e) { return !e || typeof e != "string" ? { ok: !1, error: "Missing mode", code: "INVALID_INPUT" } : Y("/mjr/am/settings/probe-backend", { mode: e }); } -async function $e() { +async function ot() { return J(c.SETTINGS_METADATA_FALLBACK); } -async function et({ image: e, media: t } = {}) { +async function st({ image: e, media: t } = {}) { return Y(c.SETTINGS_METADATA_FALLBACK, { image: e, media: t }); } -async function tt() { +async function ct() { return J(c.SETTINGS_VECTOR_SEARCH); } -async function nt(e = !0) { +async function lt(e = !0) { if (e && typeof e == "object") { let t = {}; return "enabled" in e && (t.enabled = !!e.enabled), "caption_on_index" in e && (t.caption_on_index = !!e.caption_on_index), "captionOnIndex" in e && (t.caption_on_index = !!e.captionOnIndex), "index_on_scan" in e && (t.index_on_scan = !!e.index_on_scan), "indexOnScan" in e && (t.index_on_scan = !!e.indexOnScan), "unload_after_use" in e && (t.unload_after_use = !!e.unload_after_use), "unloadAfterUse" in e && (t.unload_after_use = !!e.unloadAfterUse), "concurrency" in e && (t.concurrency = Number(e.concurrency) || 1), "vectorConcurrency" in e && (t.concurrency = Number(e.vectorConcurrency) || 1), Y(c.SETTINGS_VECTOR_SEARCH, t); } return Y(c.SETTINGS_VECTOR_SEARCH, { enabled: !!e }); } -async function rt() { +async function ut() { return Y(c.SETTINGS_VECTOR_SEARCH_UNLOAD, {}); } -async function it() { +async function dt() { return J(c.SETTINGS_EXECUTION_GROUPING); } -async function at(e = !0) { +async function ft(e = !0) { return Y(c.SETTINGS_EXECUTION_GROUPING, { enabled: !!e }); } -async function ot(e = !0) { +async function pt(e = !0) { return Y(c.SETTINGS_BROWSER_SHOW_FOLDERS, { enabled: !!e }); } -async function st() { +async function mt() { return J(c.SETTINGS_HUGGINGFACE); } -async function ct(e = "") { +async function ht(e = "") { return Y(c.SETTINGS_HUGGINGFACE, { token: String(e ?? "").trim() }); } -async function lt() { +async function gt() { return J(c.SETTINGS_AI_LOGGING); } -async function ut(e = !1) { +async function _t(e = !1) { return Y(c.SETTINGS_AI_LOGGING, { enabled: !!e }); } -async function dt() { +async function vt() { return J(c.SETTINGS_ROUTE_LOGGING); } -async function ft(e = !1) { +async function yt(e = !1) { return Y(c.SETTINGS_ROUTE_LOGGING, { enabled: !!e }); } -async function pt() { +async function bt() { return J(c.SETTINGS_STARTUP_LOGGING); } -async function mt(e = !1) { +async function xt(e = !1) { return Y(c.SETTINGS_STARTUP_LOGGING, { enabled: !!e }); } -async function ht() { +async function St() { return J(c.SETTINGS_LTXAV_RGB_FALLBACK); } -async function gt(e = !1) { +async function Ct(e = !1) { return Y(c.SETTINGS_LTXAV_RGB_FALLBACK, { enabled: !!e }); } -async function _t() { +async function wt() { return J(c.SETTINGS_JXL); } -async function vt(e = !1) { +async function Tt(e = !1) { return Y(c.SETTINGS_JXL, { enabled: !!e }); } -async function yt() { +async function Et() { return J(c.SETTINGS_OUTPUT_DIRECTORY); } -async function bt() { +async function Dt() { return J(c.SETTINGS_INPUT_DIRECTORY); } -async function xt(e, t = {}) { +async function Ot(e, t = {}) { let n = String(e ?? "").trim(); return Y(c.SETTINGS_INPUT_DIRECTORY, { input_directory: n }, t); } -async function St(e, t = {}) { +async function kt(e, t = {}) { let n = String(e ?? "").trim(); return Y(c.SETTINGS_OUTPUT_DIRECTORY, { output_directory: n }, t); } -async function Ct() { +async function At() { return J(c.SETTINGS_INDEX_DIRECTORY); } -async function wt(e, t = {}) { +async function jt(e, t = {}) { let n = String(e ?? "").trim(); return Y(c.SETTINGS_INDEX_DIRECTORY, { index_directory: n }, t); } -async function Tt(e = {}) { +async function Mt(e = {}) { return J(c.SETTINGS_WORKFLOW_ROOTS, e); } -async function Et(e, t = {}) { +async function Nt(e, t = {}) { let n = Array.isArray(e) ? e.map((e) => String(e ?? "").trim()).filter(Boolean) : String(e ?? "").trim(); return Y(c.SETTINGS_WORKFLOW_ROOTS, { workflow_roots: n }, t); } -async function Dt() { +async function Pt() { return J("/mjr/am/settings/security"); } -async function Ot(e) { +async function Ft(e) { return Y("/mjr/am/settings/security", e && typeof e == "object" ? e : {}); } -async function kt() { +async function It() { let e = await Y("/mjr/am/settings/security/bootstrap-token", {}); if (e?.ok) try { let t = String(e?.data?.token || "").trim(); - t && B(t); + t && V(t); } catch (e) { console.debug?.(e); } return e; } -async function At(e) { +async function Lt(e) { if (e && typeof e == "object") { let t = String(e.filepath || e.path || e?.file_info?.filepath || "").trim(); return t ? Y("/mjr/am/open-in-folder", { filepath: t }) : Y("/mjr/am/open-in-folder", { asset_id: u(e.id) }); } return Y("/mjr/am/open-in-folder", { asset_id: u(e) }); } -async function jt(e) { +async function Rt(e) { let t = ""; return t = e && typeof e == "object" ? String(e.filepath || e.path || e?.file_info?.filepath || "").trim() : String(e || "").trim(), t ? Y(c.COLLECT_FILES, { filepath: t }) : { ok: !1, @@ -1070,14 +1124,14 @@ async function jt(e) { code: "INVALID_INPUT" }; } -async function Mt({ op: e = "", path: t = "", name: n = "", destination: r = "", recursive: i = !0 } = {}, a = {}) { +async function zt({ op: e = "", path: t = "", name: n = "", destination: r = "", recursive: i = !0 } = {}, a = {}) { let o = { op: String(e || "").trim().toLowerCase(), path: String(t || "").trim() }; return n != null && String(n).trim() && (o.name = String(n).trim()), r != null && String(r).trim() && (o.destination = String(r).trim()), o.op === "delete" && (o.recursive = !!i), Y(c.BROWSER_FOLDER_OP, o, a); } -async function Nt(e = {}) { +async function Bt(e = {}) { let t = (e, t) => e == null ? t : !!e, n = String(e.scope || "output").trim().toLowerCase() || "output", r = e.customRootId ?? e.custom_root_id ?? e.rootId ?? e.root_id ?? e.customRoot ?? null, i = { scope: n, reindex: t(e.reindex, !0), @@ -1095,55 +1149,55 @@ async function Nt(e = {}) { }; return r && (i.custom_root_id = String(r)), Y(c.INDEX_RESET, i); } -async function Pt({ scope: e = "output", customRootId: t = "" } = {}) { +async function Vt({ scope: e = "output", customRootId: t = "" } = {}) { let n = String(e || "output").trim().toLowerCase() || "output", r = String(t || "").trim(), i = { scope: n }; return r && (i.custom_root_id = r), Y(c.WATCHER_SCOPE, i); } -async function Ft(e = {}) { +async function Ht(e = {}) { return J(c.WATCHER_STATUS, e); } -async function It(e = !0) { +async function Ut(e = !0) { return Y(c.WATCHER_TOGGLE, { enabled: !!e }); } -async function Lt() { +async function Wt() { return J(c.WATCHER_SETTINGS); } -async function Rt(e = {}) { +async function Gt(e = {}) { return Y(c.WATCHER_SETTINGS, e); } -async function zt(e = {}) { +async function Kt(e = {}) { return J(c.TOOLS_STATUS, e); } -async function Bt(e = {}) { +async function qt(e = {}) { return J(c.STATUS, e); } -async function Vt() { +async function Jt() { return Y("/mjr/am/db/force-delete", {}); } -async function Ht(e = {}) { +async function Yt(e = {}) { return J(c.DB_BACKUPS, e); } -async function Ut() { +async function Xt() { return Y(c.DB_BACKUP_SAVE, {}); } -async function Wt({ name: e = "", useLatest: t = !1 } = {}) { +async function Zt({ name: e = "", useLatest: t = !1 } = {}) { let n = {}; return e && (n.name = String(e)), t && (n.use_latest = !0), Y(c.DB_BACKUP_RESTORE, n); } -async function Gt(e = 250) { +async function Qt(e = 250) { return Y("/mjr/am/duplicates/analyze", { limit: Math.max(10, Math.min(5e3, Number(e) || 250)) }); } -async function Kt({ scope: e = "output", customRootId: t = "", maxGroups: n = 6, maxPairs: r = 10 } = {}, i = {}) { +async function $t({ scope: e = "output", customRootId: t = "", maxGroups: n = 6, maxPairs: r = 10 } = {}, i = {}) { let a = `/mjr/am/duplicates/alerts?scope=${encodeURIComponent(String(e || "output"))}`; return t && (a += `&custom_root_id=${encodeURIComponent(String(t))}`), a += `&max_groups=${encodeURIComponent(String(Math.max(1, Number(n) || 6)))}`, a += `&max_pairs=${encodeURIComponent(String(Math.max(1, Number(r) || 10)))}`, J(a, i); } -async function qt(e, t = []) { +async function en(e, t = []) { return Y("/mjr/am/duplicates/merge-tags", { keep_asset_id: Number(e) || 0, merge_asset_ids: Array.isArray(t) ? t.map((e) => Number(e) || 0).filter((e) => e > 0) : [] }); } -async function Jt(e) { +async function tn(e) { let t, n; if (e && typeof e == "object") { t = u(e.id); @@ -1151,13 +1205,13 @@ async function Jt(e) { n = t ? { asset_id: t } : { filepath: r }; } else t = u(e), n = { asset_id: t }; let r = await Y("/mjr/am/asset/delete", n); - return r?.ok && t && Xt([t]), r; + return r?.ok && t && rn([t]), r; } -async function Yt(e) { +async function nn(e) { let t = Array.isArray(e) ? e.map((e) => u(e)).filter(Boolean) : [], n = await Y("/mjr/am/assets/delete", { ids: t }); - return n?.ok && Xt(t), n; + return n?.ok && rn(t), n; } -function Xt(e) { +function rn(e) { try { let t = (Array.isArray(e) ? e : [e]).map((e) => String(e || "").trim()).filter(Boolean); if (!t.length) return; @@ -1166,7 +1220,7 @@ function Xt(e) { console.debug?.(e); } } -async function Zt(e, t) { +async function an(e, t) { let n; if (e && typeof e == "object") { n = u(e.id); @@ -1178,7 +1232,7 @@ async function Zt(e, t) { new_name: t }); if (i?.ok && n) try { - let e = await In(n); + let e = await Wn(n); e?.ok && e?.data && (i.data = { ...i.data || {}, asset: e.data @@ -1194,7 +1248,7 @@ async function Zt(e, t) { new_name: t }); if (r?.ok && n) try { - let e = await In(n); + let e = await Wn(n); e?.ok && e?.data && (r.data = { ...r.data || {}, asset: e.data @@ -1204,7 +1258,7 @@ async function Zt(e, t) { } return r; } -async function Qt() { +async function on() { let e = typeof AbortController < "u" ? new AbortController() : null, t = null; try { return e && (t = setTimeout(() => e.abort(), 1e4)), await J("/mjr/am/collections", e ? { signal: e.signal } : {}); @@ -1212,26 +1266,26 @@ async function Qt() { t && clearTimeout(t); } } -async function $t(e) { +async function sn(e) { return Y("/mjr/am/collections", { name: String(e || "").trim() }); } -async function en(e) { +async function cn(e) { let t = String(e || "").trim(); return Y(`/mjr/am/collections/${encodeURIComponent(t)}/delete`, {}); } -async function tn(e, t) { +async function ln(e, t) { let n = String(e || "").trim(), r = Array.isArray(t) ? t : []; return Y(`/mjr/am/collections/${encodeURIComponent(n)}/add`, { assets: r }); } -async function nn(e, t) { +async function un(e, t) { let n = String(e || "").trim(), r = Array.isArray(t) ? t : []; return Y(`/mjr/am/collections/${encodeURIComponent(n)}/remove`, { filepaths: r }); } -async function rn(e) { +async function dn(e) { let t = String(e || "").trim(); return J(`/mjr/am/collections/${encodeURIComponent(t)}/assets`); } -async function an(e, t = 20) { +async function fn(e, t = 20) { let n = String(e || "").trim(); if (!n) return { ok: !1, @@ -1255,7 +1309,7 @@ async function an(e, t = 20) { dateExact: r?.dateExact ?? null }), J(l, { timeoutMs: 12e4 }); } -async function on(e, t = 20) { +async function pn(e, t = 20) { let n = String(e || "").trim(); if (!n) return { ok: !1, @@ -1264,24 +1318,24 @@ async function on(e, t = 20) { let r = t && typeof t == "object" ? t : { topK: Number(t) }, i = Math.max(1, Math.min(200, Number(r?.topK ?? 20) || 20)), a = String(r?.scope || "").trim(), o = String(r?.customRootId || "").trim(), s = `${c.VECTOR_SIMILAR}/${encodeURIComponent(n)}?top_k=${i}`; return a && (s += `&scope=${encodeURIComponent(a)}`), o && (s += `&custom_root_id=${encodeURIComponent(o)}`), J(s, { dedupeKey: `vec:${n}:${i}:${a}:${o}` }); } -async function sn(e) { +async function mn(e) { let t = String(e || "").trim(); return t ? J(`${c.VECTOR_ALIGNMENT}/${encodeURIComponent(t)}`) : { ok: !1, error: "Missing asset ID" }; } -async function cn(e) { +async function hn(e) { let t = String(e || "").trim(); return t ? Y(`${c.VECTOR_INDEX}/${encodeURIComponent(t)}`, {}) : { ok: !1, error: "Missing asset ID" }; } -async function ln() { +async function gn() { return J(c.VECTOR_STATS); } -async function un(e = 64, t = {}) { +async function _n(e = 64, t = {}) { let n = Math.max(1, Math.min(200, e)), r = typeof t?.onProgress == "function" ? t.onProgress : null, i = String(t?.scope || "").trim().toLowerCase(), a = String(t?.customRootId ?? t?.custom_root_id ?? "").trim(), o = `${c.VECTOR_BACKFILL}?batch_size=${n}&async=1`; i && (o += `&scope=${encodeURIComponent(i)}`), a && (o += `&custom_root_id=${encodeURIComponent(a)}`); let s = await Y(o, {}, { timeoutMs: 3e4 }); @@ -1297,7 +1351,7 @@ async function un(e = 64, t = {}) { "running", "pending" ].includes(u)) return s; - let f = Number(t?.pollIntervalMs), p = Number(t?.pollTimeoutMs), m = Number.isFinite(f) ? Math.max(500, Math.min(1e4, Math.floor(f))) : vn, h = Number.isFinite(p) ? Math.max(1e4, Math.min(bn, Math.floor(p))) : yn, ee = Date.now(), g = null; + let f = Number(t?.pollIntervalMs), p = Number(t?.pollTimeoutMs), m = Number.isFinite(f) ? Math.max(500, Math.min(1e4, Math.floor(f))) : Tn, h = Number.isFinite(p) ? Math.max(1e4, Math.min(Dn, Math.floor(p))) : En, ee = Date.now(), g = null; for (; Date.now() - ee < h;) { await S(m); let e = await J(`${c.VECTOR_BACKFILL_STATUS}?backfill_id=${encodeURIComponent(d)}`, { timeoutMs: 3e4 }); @@ -1366,14 +1420,14 @@ async function un(e = 64, t = {}) { status: 408 }; } -async function dn(e) { +async function vn(e) { let t = String(e || "").trim(); return t ? Y(`${c.VECTOR_CAPTION}/${encodeURIComponent(t)}`, {}) : { ok: !1, error: "Missing asset ID" }; } -async function fn(e, { topK: t = 50, scope: n = "output", customRootId: r = "", subfolder: a = null, kind: o = null, hasWorkflow: s = null, minRating: l = null, minSizeMB: u = null, maxSizeMB: d = null, minWidth: f = null, minHeight: p = null, maxWidth: m = null, maxHeight: h = null, workflowType: ee = null, workflowId: g = null, dateRange: _ = null, dateExact: v = null } = {}) { +async function yn(e, { topK: t = 50, scope: n = "output", customRootId: r = "", subfolder: a = null, kind: o = null, hasWorkflow: s = null, minRating: l = null, minSizeMB: u = null, maxSizeMB: d = null, minWidth: f = null, minHeight: p = null, maxWidth: m = null, maxHeight: h = null, workflowType: ee = null, workflowId: g = null, dateRange: _ = null, dateExact: v = null } = {}) { let y = String(e || "").trim(); if (!y) return { ok: !1, @@ -1397,123 +1451,123 @@ async function fn(e, { topK: t = 50, scope: n = "output", customRootId: r = "", dateExact: v }), J(b, { timeoutMs: 12e4 }); } -async function pn(e = 8) { +async function bn(e = 8) { return Y(c.VECTOR_SUGGEST_COLLECTIONS, { k: Math.max(2, Math.min(20, e)) }); } // ui/api/client.ts -var mn = 3e4, hn = "__MJR_API_CLIENT__", gn = 2e3, _n = 200, vn = 1e3, yn = 18e5, bn = 432e5, H = "settings", xn = "available-tags", U = E({ - ttlMs: gn, - maxSize: 1 -}), W = E({ - ttlMs: gn, +var xn = 3e4, Sn = "__MJR_API_CLIENT__", Cn = 2e3, wn = 200, Tn = 1e3, En = 18e5, Dn = 432e5, U = "settings", On = "available-tags", W = E({ + ttlMs: Cn, maxSize: 1 }), G = E({ - ttlMs: () => Tn(), + ttlMs: Cn, maxSize: 1 -}), Sn = /* @__PURE__ */ new Set([ +}), K = E({ + ttlMs: () => Mn(), + maxSize: 1 +}), kn = /* @__PURE__ */ new Set([ "1", "true", "yes", "on" -]), Cn = /* @__PURE__ */ new Set([ +]), An = /* @__PURE__ */ new Set([ "0", "false", "no", "off" ]); -function wn(e, t = !1) { +function jn(e, t = !1) { if (typeof e == "boolean") return e; if (typeof e == "number") return e !== 0; if (typeof e == "string") { let t = e.trim().toLowerCase(); - if (Sn.has(t)) return !0; - if (Cn.has(t)) return !1; + if (kn.has(t)) return !0; + if (An.has(t)) return !1; } return !!t; } -function Tn() { +function Mn() { try { let e = localStorage?.getItem?.("mjrSettings") || "{}", t = JSON.parse(e), n = t?.cache?.tagsTTLms ?? t?.cache?.tagsTTL ?? t?.cache?.tags_ttl_ms ?? null, r = Number(n); - return Number.isFinite(r) ? Math.max(1e3, Math.min(6e5, Math.floor(r))) : mn; + return Number.isFinite(r) ? Math.max(1e3, Math.min(6e5, Math.floor(r))) : xn; } catch { - return mn; + return xn; } } -function En() { - U.clear(); -} -function Dn() { +function Nn() { W.clear(); } -function K() { +function Pn() { G.clear(); } -function On(e) { +function q() { + K.clear(); +} +function Fn(e) { return String(e ?? "").trim().toLowerCase() || ""; } -function kn(e) { +function In(e) { let t = [], n = /* @__PURE__ */ new Set(); for (let r of Array.isArray(e) ? e : []) { let e = String(r ?? "").trim(); if (!e) continue; - let i = On(e); + let i = Fn(e); i && !n.has(i) && (n.add(i), t.push(e)); } return t; } try { let e = typeof window < "u" ? window : null; - e && !e[hn] && (e[hn] = { initialized: !0 }, e.addEventListener?.("storage", (e) => { + e && !e[Sn] && (e[Sn] = { initialized: !0 }, e.addEventListener?.("storage", (e) => { try { - e?.key === "mjrSettings" && (En(), Dn(), K(), Ze()); + e?.key === "mjrSettings" && (Nn(), Pn(), q(), it()); } catch (e) { console.debug?.(e); } }), e.addEventListener?.("mjr-settings-changed", () => { - En(), Dn(), K(), Ze(); + Nn(), Pn(), q(), it(); })); } catch (e) { console.debug?.(e); } -var An = () => { - let e = U.get(H); +var Ln = () => { + let e = W.get(U); if (e !== void 0) return e; let t = Date.now(); try { let e = localStorage?.getItem?.(f); - if (!e) return U.set(H, !1, { at: t }), !1; + if (!e) return W.set(U, !1, { at: t }), !1; let n = !!JSON.parse(e)?.observability?.enabled; - return U.set(H, n, { at: t }), n; + return W.set(U, n, { at: t }), n; } catch { - return U.set(H, !1, { at: t }), !1; + return W.set(U, !1, { at: t }), !1; } -}, jn = () => { - let e = W.get(H); +}, Rn = () => { + let e = G.get(U); if (e !== void 0) return e; let t = Date.now(); try { let e = localStorage?.getItem?.(f); - if (!e) return W.set(H, !0, { at: t }), !0; - let n = JSON.parse(e)?.ratingTagsSync?.enabled, r = n == null || wn(n, !0); - return W.set(H, r, { at: t }), r; + if (!e) return G.set(U, !0, { at: t }), !0; + let n = JSON.parse(e)?.ratingTagsSync?.enabled, r = n == null || jn(n, !0); + return G.set(U, r, { at: t }), r; } catch { - return W.set(H, !0, { at: t }), !0; + return G.set(U, !0, { at: t }), !0; } -}, q = fe({ - readObsEnabled: An, - readAuthToken: z, - ensureWriteAuthToken: Xe, - normalizeWriteAuthFailure: Je -}), Mn = q.fetchAPI; +}, zn = fe({ + readObsEnabled: Ln, + readAuthToken: B, + ensureWriteAuthToken: rt, + normalizeWriteAuthFailure: tt +}), Bn = zn.fetchAPI; async function J(e, t = {}) { - return q.get(e, t); + return zn.get(e, t); } async function Y(e, t, n = {}) { - return q.post(e, t, n); + return zn.post(e, t, n); } -async function Nn(e, n, r = {}) { - let i = jn(), a = e && typeof e == "object" ? e : null, o = a ? a.id : e, s = u(o), c = { rating: Math.max(0, Math.min(5, Number(n) || 0)) }; - return s ? c.asset_id = s : a && (c.filepath = a.filepath || a.path || a?.file_info?.filepath || "", c.type = a.type || "output", c.root_id = t(a)), Mn("/mjr/am/asset/rating", { +async function Vn(e, n, r = {}) { + let i = Rn(), a = e && typeof e == "object" ? e : null, o = a ? a.id : e, s = u(o), c = { rating: Math.max(0, Math.min(5, Number(n) || 0)) }; + return s ? c.asset_id = s : a && (c.filepath = a.filepath || a.path || a?.file_info?.filepath || "", c.type = a.type || "output", c.root_id = t(a)), Bn("/mjr/am/asset/rating", { ...r, method: "POST", headers: { @@ -1523,10 +1577,10 @@ async function Nn(e, n, r = {}) { body: JSON.stringify(c) }); } -async function Pn(e, n, r = {}) { - let i = jn(), a = e && typeof e == "object" ? e : null, o = a ? a.id : e, s = u(o), l = String(a?.kind || a?.type || "").trim().toLowerCase() === "workflow", d = String(a?.filepath || a?.path || a?.file_info?.filepath || "").trim(), f = { tags: Array.isArray(n) ? n : [] }; +async function Hn(e, n, r = {}) { + let i = Rn(), a = e && typeof e == "object" ? e : null, o = a ? a.id : e, s = u(o), l = String(a?.kind || a?.type || "").trim().toLowerCase() === "workflow", d = String(a?.filepath || a?.path || a?.file_info?.filepath || "").trim(), f = { tags: Array.isArray(n) ? n : [] }; l && d ? f.filepath = d : s ? f.asset_id = s : a && (f.filepath = a.filepath || a.path || a?.file_info?.filepath || "", f.type = a.type || "output", f.root_id = t(a)); - let p = await Mn(l && d ? c.WORKFLOWS_TAGS : "/mjr/am/asset/tags", { + let p = await Bn(l && d ? c.WORKFLOWS_TAGS : "/mjr/am/asset/tags", { ...r, method: "POST", headers: { @@ -1535,10 +1589,10 @@ async function Pn(e, n, r = {}) { }, body: JSON.stringify(f) }); - return p?.ok && K(), p; + return p?.ok && q(), p; } -async function Fn() { - let e = G.get(xn); +async function Un() { + let e = K.get(On); if (Array.isArray(e)) return { ok: !0, data: e, @@ -1548,22 +1602,22 @@ async function Fn() { }; let t = await J("/mjr/am/tags"); if (t?.ok && Array.isArray(t.data)) { - let e = kn(t.data); - return G.set(xn, e), { + let e = In(t.data); + return K.set(On, e), { ...t, data: e }; } return t; } -async function In(e, t = {}) { +async function Wn(e, t = {}) { let n = encodeURIComponent(u(e)); return J(`/mjr/am/asset/${n}`, { ...t, dedupeKey: t?.dedupeKey || `meta:${n}` }); } -async function Ln(e, t = {}) { +async function Gn(e, t = {}) { let n = u(e); if (!n) return { ok: !1, @@ -1576,11 +1630,11 @@ async function Ln(e, t = {}) { let { refresh: i, ...a } = t; return J(r, a); } -async function Rn(e, t = {}) { +async function Kn(e, t = {}) { let n = Array.isArray(e) ? e : [], r = []; for (let e of n) { let t = Number(e); - if (Number.isFinite(t) && (r.push(Math.trunc(t)), r.length >= _n)) break; + if (Number.isFinite(t) && (r.push(Math.trunc(t)), r.length >= wn)) break; } return r.length ? Y("/mjr/am/assets/batch", { asset_ids: r }, t) : { ok: !0, @@ -1589,7 +1643,7 @@ async function Rn(e, t = {}) { code: "OK" }; } -async function zn(e, t = {}) { +async function qn(e, t = {}) { let r = n(e); return r ? J(r, t) : { ok: !1, @@ -1598,7 +1652,7 @@ async function zn(e, t = {}) { code: "INVALID_INPUT" }; } -async function Bn(e, t = {}) { +async function Jn(e, t = {}) { let n = d(e); return n ? J(n, t) : { ok: !1, @@ -1607,7 +1661,7 @@ async function Bn(e, t = {}) { code: "INVALID_INPUT" }; } -async function Vn(e, t = {}) { +async function Yn(e, t = {}) { let n = r(e); return n ? J(n, t) : { ok: !1, @@ -1616,7 +1670,7 @@ async function Vn(e, t = {}) { code: "INVALID_INPUT" }; } -async function Hn(e, t = "", n = {}) { +async function Xn(e, t = "", n = {}) { let r = l(e, t); return r ? J(r, n) : { ok: !1, @@ -1625,7 +1679,7 @@ async function Hn(e, t = "", n = {}) { code: "INVALID_INPUT" }; } -async function Un({ workflow: e = null, name: t = "", category: n = "", overwrite: r = !1, filepath: i = "", task: a = "", model_family: o = "", provider: s = "", runs_on: l = "", notes: u = "" } = {}, d = {}) { +async function Zn({ workflow: e = null, name: t = "", category: n = "", overwrite: r = !1, filepath: i = "", task: a = "", model_family: o = "", provider: s = "", runs_on: l = "", notes: u = "" } = {}, d = {}) { return Y(c.WORKFLOWS_SAVE, { workflow: e, name: t, @@ -1639,32 +1693,32 @@ async function Un({ workflow: e = null, name: t = "", category: n = "", overwrit notes: u }, d); } -async function Wn({ filepath: e = "", name: t = "" } = {}, n = {}) { +async function Qn({ filepath: e = "", name: t = "" } = {}, n = {}) { return Y(c.WORKFLOWS_DUPLICATE, { filepath: e, name: t }, n); } -async function Gn({ filepath: e = "", name: t = "", category: n = "" } = {}, r = {}) { +async function $n({ filepath: e = "", name: t = "", category: n = "" } = {}, r = {}) { return Y(c.WORKFLOWS_MOVE, { filepath: e, name: t, category: n }, r); } -async function Kn({ filepath: e = "" } = {}, t = {}) { +async function er({ filepath: e = "" } = {}, t = {}) { return Y(c.WORKFLOWS_DELETE, { filepath: e }, t); } -async function qn({ filepath: e = "" } = {}, t = {}) { +async function tr({ filepath: e = "" } = {}, t = {}) { return Y(c.WORKFLOWS_MARK_LOADED, { filepath: e }, t); } -async function Jn({ filepath: e = "", favorite: t = !1 } = {}, n = {}) { +async function nr({ filepath: e = "", favorite: t = !1 } = {}, n = {}) { return Y(c.WORKFLOWS_FAVORITE, { filepath: e, favorite: !!t }, n); } -async function Yn({ filepath: e = "", task: t = "", model_family: n = "", provider: r = "", runs_on: i = "", notes: a = "" } = {}, o = {}) { +async function rr({ filepath: e = "", task: t = "", model_family: n = "", provider: r = "", runs_on: i = "", notes: a = "" } = {}, o = {}) { return Y(c.WORKFLOWS_INFO, { filepath: e, task: t, @@ -1674,24 +1728,24 @@ async function Yn({ filepath: e = "", task: t = "", model_family: n = "", provid notes: a }, o); } -async function Xn({ filepath: e = "", limit: t = 12 } = {}, n = {}) { +async function ir({ filepath: e = "", limit: t = 12 } = {}, n = {}) { let r = Math.max(1, Math.min(50, Number(t) || 12)); return J(`${c.WORKFLOWS_THUMBNAIL_CANDIDATES}?filepath=${encodeURIComponent(String(e || "").trim())}&limit=${encodeURIComponent(String(r))}`, n); } -async function Zn(e = {}) { +async function ar(e = {}) { return J(c.WORKFLOWS_MODEL_FAMILIES, e); } -async function Qn({ q: e = "*", limit: t = 100, offset: n = 0, sort: r = "mtime" } = {}, i = {}) { +async function or({ q: e = "*", limit: t = 100, offset: n = 0, sort: r = "mtime" } = {}, i = {}) { let a = Math.max(1, Math.min(500, Number(t) || 100)), o = Math.max(0, Number(n) || 0); return J(`${c.LIST}?scope=workflow&q=${encodeURIComponent(String(e || "*"))}&limit=${encodeURIComponent(String(a))}&offset=${encodeURIComponent(String(o))}&sort=${encodeURIComponent(String(r || "mtime"))}`, i); } -async function $n({ filepath: e = "", source_filepath: t = "" } = {}, n = {}) { +async function sr({ filepath: e = "", source_filepath: t = "" } = {}, n = {}) { return Y(c.WORKFLOWS_THUMBNAIL_SET, { filepath: e, source_filepath: t }, n); } -async function er({ type: e = "output", filename: t = "", subfolder: n = "", root_id: r = "", rootId: i = "", filepath: a = "" } = {}, o = {}) { +async function cr({ type: e = "output", filename: t = "", subfolder: n = "", root_id: r = "", rootId: i = "", filepath: a = "" } = {}, o = {}) { let s = String(e || "output").trim().toLowerCase() || "output", c = String(t || "").trim(), l = String(n || "").trim(), u = String(r || i || "").trim(), d = String(a || "").trim(); if (!c) return { ok: !1, @@ -1702,7 +1756,7 @@ async function er({ type: e = "output", filename: t = "", subfolder: n = "", roo let f = `/mjr/am/metadata?type=${encodeURIComponent(s)}&filename=${encodeURIComponent(c)}`; return d && (f += `&filepath=${encodeURIComponent(d)}`), l && (f += `&subfolder=${encodeURIComponent(l)}`), u && (f += `&root_id=${encodeURIComponent(u)}`), J(f, o); } -async function tr({ filepath: e = "", root_id: t = "", subfolder: n = "" } = {}, r = {}) { +async function lr({ filepath: e = "", root_id: t = "", subfolder: n = "" } = {}, r = {}) { try { if (globalThis.__mjrFolderInfoSupported === !1) return { ok: !1, @@ -1736,12 +1790,12 @@ async function tr({ filepath: e = "", root_id: t = "", subfolder: n = "" } = {}, return u; } // ui/utils/logging.ts -function nr(e, ...t) { +function ur(e, ...t) { try { s.DEBUG_VERBOSE_ERRORS && console.debug(e, ...t); } catch {} } -function rr(e, t = "Majoor", { showToast: n = !1, toastType: r = "error" } = {}) { +function dr(e, t = "Majoor", { showToast: n = !1, toastType: r = "error" } = {}) { let i = e?.message || String(e || "Unknown error"); try { s.DEBUG_VERBOSE_ERRORS ? console.error(`[Majoor][${t}]`, i, e) : console.debug(`[Majoor][${t}]`, i); @@ -1760,47 +1814,47 @@ var X = { scope: null, ratingHotkeysActive: !1 }; -function ir() { +function fr() { return X; } -function ar(e) { +function pr(e) { X.scope = e == null ? null : String(e); } -function or() { +function mr() { return !!X.suspended; } -function sr(e) { +function hr(e) { X.ratingHotkeysActive = !!e; } // ui/features/viewer/viewerRuntimeHosts.ts -var Z = null, Q = null, cr = ".mjr-viewer-overlay", lr = ".mjr-mfv"; -function ur(e) { +var Z = null, Q = null, gr = ".mjr-viewer-overlay", _r = ".mjr-mfv"; +function vr(e) { return !!e && typeof e.appendChild == "function"; } -function dr() { +function yr() { return typeof document > "u" ? null : document?.body || null; } -function fr() { +function br() { return typeof document > "u" ? null : document?.body || document?.documentElement || null; } -function pr(e) { - return ur(e) ? e === dr() || typeof e?.isConnected != "boolean" || e.isConnected : !1; +function xr(e) { + return vr(e) ? e === yr() || typeof e?.isConnected != "boolean" || e.isConnected : !1; } -function mr(e) { - return ur(e) ? e : null; +function Sr(e) { + return vr(e) ? e : null; } function $(e) { - return pr(e) ? e : dr(); + return xr(e) ? e : yr(); } -function hr(e) { - let t = fr(); - return pr(t) ? t : $(e); +function Cr(e) { + let t = br(); + return xr(t) ? t : $(e); } -function gr(e, t, n = $) { +function wr(e, t, n = $) { let r = [], i = /* @__PURE__ */ new Set(); for (let a of [ n(t), - dr(), + yr(), t ]) { if (!a || i.has(a)) continue; @@ -1815,29 +1869,29 @@ function gr(e, t, n = $) { } return r; } -function _r(e, t, n = $) { +function Tr(e, t, n = $) { let r = n(t); if (!r) return; - let i = gr(e, t, n); + let i = wr(e, t, n); for (let e of i) if (e && e.parentNode !== r) try { r.appendChild(e); } catch (e) { console.debug?.(e); } } -function vr(e) { - return Z = mr(e), _r(cr, Z), () => yr(e); +function Er(e) { + return Z = Sr(e), Tr(gr, Z), () => Dr(e); } -function yr(e) { +function Dr(e) { e && Z !== e || (Z = null); } -function br(e) { - return Q = mr(e), _r(lr, Q, hr), () => xr(e); +function Or(e) { + return Q = Sr(e), Tr(_r, Q, Cr), () => kr(e); } -function xr(e) { +function kr(e) { e && Q !== e || (Q = null); } -function Sr(e) { +function Ar(e) { let t = $(Z); try { t?.appendChild?.(e); @@ -1846,8 +1900,8 @@ function Sr(e) { } return t; } -function Cr(e) { - let t = hr(Q); +function jr(e) { + let t = Cr(Q); try { t?.appendChild?.(e); } catch (e) { @@ -1855,7 +1909,7 @@ function Cr(e) { } return t; } -function wr() { - return gr(cr, Z); +function Mr() { + return wr(gr, Z); } -export { _t as $, N as $t, Un as A, et as At, jt as B, It as Bt, Zn as C, ot as Ct, qn as D, xt as Dt, Qn as E, wt as Et, Pn as F, mt as Ft, Vt as G, dn as Gt, Jt as H, Rt as Ht, Bn as I, nt as It, Kt as J, an as Jt, lt as K, sn as Kt, tn as L, Pt as Lt, Yn as M, Qe as Mt, $n as N, ft as Nt, Gn as O, vt as Ot, Nn as P, Ot as Pt, bt as Q, Ue as Qt, kt as R, Et as Rt, zn as S, ut as St, Vn as T, ct as Tt, Yt as U, un as Ut, $t as V, rt as Vt, en as W, on as Wt, st as X, pn as Xt, it as Y, ln as Yt, Ct as Z, We as Zt, Rn as _, nn as _t, vr as a, De as an, Dt as at, tr as b, Wt as bt, ar as c, f as cn, tt as ct, rr as d, Tt as dt, je as en, ht as et, Kn as f, fn as ft, In as g, At as gt, J as h, qt as ht, br as i, Te as in, Bt as it, Jn as j, St as jt, Y as k, gt as kt, sr as l, Lt as lt, Wn as m, Ht as mt, Sr as n, Oe as nn, yt as nt, ir as o, E as on, pt as ot, Hn as p, Qt as pt, rn as q, cn as qt, wr as r, Ee as rn, dt as rt, or as s, p as sn, zt as st, Cr as t, ge as tn, $e as tt, nr as u, Ft as ut, Fn as v, Zt as vt, Xn as w, at as wt, Ln as x, Ut as xt, er as y, Nt as yt, Mt as z, Gt as zt }; +export { wt as $, N as $t, Zn as A, st as At, Rt as B, Ut as Bt, ar as C, pt as Ct, tr as D, Ot as Dt, or as E, jt as Et, Hn as F, xt as Ft, Jt as G, vn as Gt, tn as H, Gt as Ht, Jn as I, lt as It, $t as J, fn as Jt, gt as K, mn as Kt, ln as L, Vt as Lt, rr as M, at as Mt, sr as N, yt as Nt, $n as O, Tt as Ot, Vn as P, Ft as Pt, Dt as Q, Xe as Qt, It as R, Nt as Rt, qn as S, _t as St, Yn as T, ht as Tt, nn as U, _n as Ut, sn as V, ut as Vt, cn as W, pn as Wt, mt as X, bn as Xt, dt as Y, gn as Yt, At as Z, Ze as Zt, Kn as _, un as _t, Er as a, Te as an, Pt as at, lr as b, Zt as bt, pr as c, p as cn, ct, dr as d, Mt as dt, Be as en, St as et, er as f, yn as ft, Wn as g, Lt as gt, J as h, en as ht, Or as i, Ee as in, qt as it, nr as j, kt as jt, Y as k, Ct as kt, hr as l, f as ln, Wt as lt, Qn as m, Yt as mt, Ar as n, ge as nn, Et as nt, fr as o, De as on, bt as ot, Xn as p, on as pt, dn as q, hn as qt, Mr as r, Oe as rn, vt as rt, mr as s, E as sn, Kt as st, jr as t, je as tn, ot as tt, ur as u, Ht as ut, Un as v, an as vt, ir as w, ft as wt, Gn as x, Xt as xt, cr as y, Bt as yt, zt as z, Qt as zt }; diff --git a/dist/entry.js b/dist/entry.js index 77cea6da..f914cfbf 100644 --- a/dist/entry.js +++ b/dist/entry.js @@ -1,25 +1,25 @@ -import { $t as e, A as t, B as n, Bt as r, C as i, D as a, E as o, Et as s, G as c, H as l, J as u, Jt as d, L as f, Lt as p, M as m, N as h, O as g, P as _, Rt as v, S as y, U as b, Ut as x, V as S, Vt as C, W as w, Wt as T, Xt as E, Yt as D, _ as O, _t as k, an as A, b as j, bt as M, c as N, d as P, en as ee, f as te, ft as F, g as I, gt as ne, h as re, ht as ie, in as ae, j as oe, jt as se, k as L, l as ce, m as le, mt as ue, nn as de, o as fe, on as pe, pt as me, q as he, qt as ge, rn as _e, s as ve, st as ye, tn as be, u as xe, ut as Se, vt as Ce, w as we, xt as Te, y as Ee, yt as De, z as Oe, zt as ke } from "./chunks/viewerRuntimeHosts-D3Jyfx0-.js"; -import { $ as Ae, A as je, Ct as Me, F as Ne, J as Pe, K as Fe, L as Ie, Q as Le, St as Re, Tt as ze, U as Be, W as Ve, Y as He, _ as Ue, at as We, ct as Ge, dt as Ke, et as qe, ft as Je, g as Ye, ht as Xe, j as Ze, lt as Qe, m as R, mt as $e, n as et, nt as z, o as B, ot as tt, pt as nt, q as rt, r as V, rt as it, st as at, t as ot, tt as st, ut as ct, wt as lt, xt as ut } from "./chunks/events-BRfpU-6M.js"; -import { a as dt, i as ft, n as pt, t as mt } from "./chunks/graphTraversal-DTdQWkn5.js"; -import { A as ht, B as gt, C as _t, D as vt, E as yt, F as bt, G as xt, H as St, I as Ct, J as wt, L as Tt, M as Et, N as Dt, O as Ot, P as kt, R as At, S as jt, T as Mt, U as Nt, V as Pt, W as Ft, Y as It, _ as Lt, b as Rt, d as zt, g as Bt, j as Vt, k as Ht, q as Ut, v as Wt, x as Gt, y as Kt, z as qt } from "./chunks/Viewer-geJFRz8N.js"; -import { $ as Jt, A as Yt, B as Xt, C as Zt, D as Qt, E as $t, F as en, G as tn, H as nn, I as rn, J as an, K as on, L as sn, M as cn, N as ln, O as un, P as dn, Q as fn, R as pn, T as mn, U as hn, V as gn, W as _n, X as vn, Y as yn, Z as bn, _ as xn, a as Sn, c as Cn, d as wn, et as Tn, f as En, g as Dn, h as On, i as kn, j as An, k as jn, l as Mn, m as Nn, n as Pn, nt as Fn, o as In, p as Ln, q as Rn, s as zn, t as Bn, tt as Vn, u as Hn, w as Un, z as Wn } from "./chunks/SidebarWorkflowSection-BihItyAk.js"; -import { _ as Gn, i as Kn, n as qn, p as Jn, t as Yn } from "./chunks/openMajoorSettings-Cd5Nutru.js"; -import { a as Xn, c as Zn, l as Qn, o as $n, s as er, u as tr } from "./chunks/floatingViewerManager-Gv7MTmpu.js"; -import { A as nr, B as rr, C as H, D as ir, E as U, G as ar, H as or, I as sr, J as W, K as cr, L as lr, M as ur, N as dr, O as G, P as fr, R as pr, S as mr, T as K, U as hr, V as q, W as gr, Y as _r, at as vr, b as yr, ct as br, dt as xr, ft as J, it as Sr, j as Y, k as X, lt as Z, nt as Cr, q as wr, rt as Q, tt as Tr, ut as Er, v as Dr, w as Or, x as kr, y as Ar, z as jr } from "./chunks/mjr-primevue-BRqtdXzb.js"; -import { n as Mr, r as Nr } from "./chunks/mjr-vue-vendor-mHY_eIVE.js"; -import { t as Pr } from "./chunks/TagsEditor-CPV0rYyM.js"; -import { app as Fr } from "../../scripts/app.js"; -function Ir(e = null) { +import { $t as e, A as t, B as n, Bt as r, C as i, D as a, E as o, Et as s, G as c, H as l, J as u, Jt as d, L as f, Lt as p, M as m, N as h, O as g, P as _, Rt as v, S as y, U as b, Ut as x, V as S, Vt as C, W as w, Wt as T, Xt as E, Yt as D, _ as O, _t as k, an as A, b as j, bt as M, c as N, d as P, en as ee, f as te, ft as F, g as I, gt as ne, h as re, ht as ie, in as ae, j as oe, jt as se, k as L, l as ce, m as le, mt as ue, nn as de, o as fe, on as pe, pt as me, q as he, qt as ge, rn as _e, s as ve, sn as ye, st as be, tn as xe, u as Se, ut as Ce, vt as we, w as Te, xt as Ee, y as De, yt as Oe, z as ke, zt as Ae } from "./chunks/viewerRuntimeHosts-nMPP59FX.js"; +import { $ as je, A as Me, Ct as Ne, F as Pe, J as Fe, K as Ie, L as Le, Q as Re, St as ze, Tt as Be, U as Ve, W as He, Y as Ue, _ as We, at as Ge, ct as Ke, dt as qe, et as Je, ft as Ye, g as Xe, ht as Ze, j as Qe, lt as $e, m as R, mt as et, n as z, nt as tt, o as B, ot as nt, pt as rt, q as it, r as V, rt as at, st as ot, t as st, tt as ct, ut as lt, wt as ut, xt as dt } from "./chunks/events-ChGln7ff.js"; +import { a as ft, i as pt, n as mt, t as ht } from "./chunks/graphTraversal-DTdQWkn5.js"; +import { A as gt, B as _t, C as vt, D as yt, E as bt, F as xt, G as St, H as Ct, I as wt, J as Tt, L as Et, M as Dt, N as Ot, O as kt, P as At, R as jt, S as Mt, T as Nt, U as Pt, V as Ft, W as It, Y as Lt, _ as Rt, b as zt, d as Bt, g as Vt, j as Ht, k as Ut, q as Wt, v as Gt, x as Kt, y as qt, z as Jt } from "./chunks/Viewer-BvNSchxR.js"; +import { $ as Yt, A as Xt, B as Zt, C as Qt, D as $t, E as en, F as tn, G as nn, H as rn, I as an, J as on, K as sn, L as cn, M as ln, N as un, O as dn, P as fn, Q as pn, R as mn, T as hn, U as gn, V as _n, W as vn, X as yn, Y as bn, Z as xn, _ as Sn, a as Cn, c as wn, d as Tn, et as En, f as Dn, g as On, h as kn, i as An, j as jn, k as Mn, l as Nn, m as Pn, n as Fn, nt as In, o as Ln, p as Rn, q as zn, s as Bn, t as Vn, tt as Hn, u as Un, w as Wn, z as Gn } from "./chunks/SidebarWorkflowSection-BR3ECa3i.js"; +import { _ as Kn, i as qn, n as Jn, p as Yn, t as Xn } from "./chunks/openMajoorSettings-CdWVeKk-.js"; +import { a as Zn, c as Qn, l as $n, o as er, s as tr, u as nr } from "./chunks/floatingViewerManager-DGIaL-BQ.js"; +import { A as rr, B as ir, C as H, D as ar, E as U, G as or, H as sr, I as cr, J as W, K as lr, L as ur, M as dr, N as fr, O as G, P as pr, R as mr, S as hr, T as K, U as gr, V as q, W as _r, Y as vr, at as yr, b as br, ct as xr, dt as Sr, ft as J, it as Cr, j as Y, k as X, lt as Z, nt as wr, q as Tr, rt as Q, tt as Er, ut as Dr, v as Or, w as kr, x as Ar, y as jr, z as Mr } from "./chunks/mjr-primevue-BRqtdXzb.js"; +import { n as Nr, r as Pr } from "./chunks/mjr-vue-vendor-mHY_eIVE.js"; +import { t as Fr } from "./chunks/TagsEditor-Dd6Rh_zi.js"; +import { app as Ir } from "../../scripts/app.js"; +function Lr(e = null) { return null; } -function Lr() { +function Rr() { return null; } try { - typeof window < "u" && it && it.LIST; + typeof window < "u" && at && at.LIST; } catch {} // ui/integration/comfy_send_to_am.ts -var Rr = "MajoorAssetsManager.SendTo", zr = "Send to Asset Manager", Br = /* @__PURE__ */ new Set([ +var zr = "MajoorAssetsManager.SendTo", Br = "Send to Asset Manager", Vr = /* @__PURE__ */ new Set([ "SaveImage", "PreviewImage", "VHS_VideoCombine", @@ -29,11 +29,11 @@ var Rr = "MajoorAssetsManager.SendTo", zr = "Send to Asset Manager", Br = /* @__ "SaveAnimatedPNG", "SaveAudio" ]); -function Vr(e) { - let t = String(e?.comfyClass || e?.type || "").trim(); - return Br.has(t); -} function Hr(e) { + let t = String(e?.comfyClass || e?.type || "").trim(); + return Vr.has(t); +} +function Ur(e) { let t = []; try { let n = e?.imgs && Array.isArray(e.imgs) ? e.imgs : null, r = []; @@ -61,15 +61,15 @@ function Hr(e) { } catch {} return t; } -async function Ur(e) { - let t = Ze(), n = je(t); - if (!e.length) He({ +async function Wr(e) { + let t = Qe(), n = Me(t); + if (!e.length) Ue({ severity: "warn", summary: "Majoor Assets Manager", detail: "No output to send (run the node first).", life: 3500 }); - else if (!n || typeof n.fetchApi != "function") He({ + else if (!n || typeof n.fetchApi != "function") Ue({ severity: "error", summary: "Majoor Assets Manager", detail: "ComfyUI API unavailable.", @@ -82,14 +82,14 @@ async function Ur(e) { body: JSON.stringify({ items: e }) }); if (!r.ok && r.status !== 404) throw Error(`HTTP ${r.status}`); - Ue(t, "majoor-assets"), He({ + We(t, "majoor-assets"), Ue({ severity: "success", summary: "Majoor Assets Manager", detail: `Sent ${e.length} item(s) to the asset grid.`, life: 2500 }); } catch (e) { - He({ + Ue({ severity: "error", summary: "Majoor Assets Manager", detail: `Failed to send: ${e?.message || e}`, @@ -97,16 +97,16 @@ async function Ur(e) { }); } } -function Wr() { - let e = Ze(); - !e || typeof e.registerExtension != "function" ? setTimeout(Wr, 100) : e.registerExtension({ - name: Rr, +function Gr() { + let e = Qe(); + !e || typeof e.registerExtension != "function" ? setTimeout(Gr, 100) : e.registerExtension({ + name: zr, getNodeMenuItems(e) { try { - return Vr(e) ? [{ - content: zr, + return Hr(e) ? [{ + content: Br, callback: () => { - Ur(Hr(e)); + Wr(Ur(e)); } }] : []; } catch { @@ -115,11 +115,11 @@ function Wr() { } }); } -Wr(); +Gr(); // ui/integration/majoor_save_placeholders.ts -var Gr = "MajoorAssetsManager.SavePlaceholders", Kr = /* @__PURE__ */ new Set(["MajoorSaveImage", "MajoorSaveVideo"]), qr = /dd?|MM?|hh?|mm?|ss?|yyy?y?/g; -function Jr(e, t) { - return e.replace(qr, (e) => { +var Kr = "MajoorAssetsManager.SavePlaceholders", qr = /* @__PURE__ */ new Set(["MajoorSaveImage", "MajoorSaveVideo"]), Jr = /dd?|MM?|hh?|mm?|ss?|yyy?y?/g; +function Yr(e, t) { + return e.replace(Jr, (e) => { if (e === "yyyy") return String(t.getFullYear()); if (e === "yy") return String(t.getFullYear()).substring(2, 4); let n; @@ -144,51 +144,51 @@ function Jr(e, t) { return String(n).padStart(e.length, "0"); }); } -var Yr = /[/?<>\\:*|"\x00-\x1F\x7F]/g; -function Xr(e) { +var Xr = /[/?<>\\:*|"\x00-\x1F\x7F]/g; +function Zr(e) { let t = e?.nodes ?? e?._nodes; return Array.isArray(t) ? t : []; } -function Zr(e, t) { +function Qr(e, t) { return String(t ?? "").replace(/%([^%]+)%/g, (t, n) => { let r = String(n).split("."); - if (r.length !== 2) return r[0].startsWith("date:") ? Jr(r[0].substring(5), /* @__PURE__ */ new Date()) : t; - let i = Xr(e), a = i.filter((e) => e?.properties?.["Node name for S&R"] === r[0]); + if (r.length !== 2) return r[0].startsWith("date:") ? Yr(r[0].substring(5), /* @__PURE__ */ new Date()) : t; + let i = Zr(e), a = i.filter((e) => e?.properties?.["Node name for S&R"] === r[0]); a.length || (a = i.filter((e) => e?.title === r[0])); let o = a[0]; if (!o) return t; let s = Array.isArray(o.widgets) ? o.widgets.find((e) => e?.name === r[1]) : null; - return s ? String(s.value ?? "").replace(Yr, "_") : t; + return s ? String(s.value ?? "").replace(Xr, "_") : t; }); } -function Qr(e, t) { +function $r(e, t) { try { let n = Array.isArray(e?.widgets) ? e.widgets.find((e) => e?.name === "filename_prefix") : null; if (!n) return; let r = n.serializeValue; n.serializeValue = () => { let i = typeof r == "function" ? r.call(n) : n.value; - return Zr(e?.graph || t?.graph, i); + return Qr(e?.graph || t?.graph, i); }; } catch {} } -function $r() { - let e = Ze(); - !e || typeof e.registerExtension != "function" ? setTimeout($r, 100) : e.registerExtension({ - name: Gr, +function ei() { + let e = Qe(); + !e || typeof e.registerExtension != "function" ? setTimeout(ei, 100) : e.registerExtension({ + name: Kr, nodeCreated(t) { try { let n = String(t?.comfyClass || t?.type || ""); - if (!Kr.has(n)) return; - Qr(t, e); + if (!qr.has(n)) return; + $r(t, e); } catch {} } }); } -$r(); +ei(); // ui/app/bootstrap.ts -var ei = !1, ti = null, ni = !1, ri = null; -function ii() { +var ti = !1, ni = null, ri = !1, ii = null; +function ai() { try { let e = window?.__MJR_EXECUTION_RUNTIME__; return !String(e?.active_prompt_id || "").trim(); @@ -196,26 +196,26 @@ function ii() { return console.debug?.(e), !0; } } -async function ai(e = {}) { - if (!B || typeof B != "object" || !B.AUTO_SCAN_ON_STARTUP || ei) return; +async function oi(e = {}) { + if (!B || typeof B != "object" || !B.AUTO_SCAN_ON_STARTUP || ti) return; let t = Math.max(0, Number(e?.delayMs) || 0), n = e?.idleOnly !== !1; - if (t > 0) ti && clearTimeout(ti), ti = setTimeout(() => { - ti = null, ai({ + if (t > 0) ni && clearTimeout(ni), ni = setTimeout(() => { + ni = null, oi({ ...e, delayMs: 0 }); }, t); - else if (n && !ii()) ti && clearTimeout(ti), ti = setTimeout(() => { - ti = null, ai({ + else if (n && !ai()) ni && clearTimeout(ni), ni = setTimeout(() => { + ni = null, oi({ ...e, delayMs: 0 }); }, 5e3); else { - ei = !0; + ti = !0; try { - xe("[Majoor] Starting startup scan of output directory..."); - let e = await L(it.SCAN, { + Se("[Majoor] Starting startup scan of output directory..."); + let e = await L(at.SCAN, { recursive: !0, incremental: !0, fast: !0, @@ -223,30 +223,30 @@ async function ai(e = {}) { }); if (e.ok) { let t = e.data; - xe(`[Majoor] Startup scan complete - added: ${t.added}, updated: ${t.updated}, skipped: ${t.skipped}`); + Se(`[Majoor] Startup scan complete - added: ${t.added}, updated: ${t.updated}, skipped: ${t.skipped}`); } else console.warn("[Majoor] Majoor [WARN]: Startup scan failed:", e.error); } catch (e) { console.error("[Majoor] ERROR: Startup scan error:", e); } } } -async function oi() { +async function si() { try { await Promise.allSettled([ - re(it.HEALTH), - re(`${it.HEALTH_COUNTERS}?scope=output`), - re(it.HEALTH_DB) + re(at.HEALTH), + re(`${at.HEALTH_COUNTERS}?scope=output`), + re(at.HEALTH_DB) ]); } catch (e) { console.debug?.(e); } } -async function si(e = {}) { - return ni ? ri || Promise.resolve() : (ni = !0, ri = (async () => { - await ci(), await oi(), await ai(e); - })(), ri); +async function ci(e = {}) { + return ri ? ii || Promise.resolve() : (ri = !0, ii = (async () => { + await li(), await si(), await oi(e); + })(), ii); } -function ci() { +function li() { return new Promise((e) => { try { if (typeof window > "u") { @@ -265,28 +265,28 @@ function ci() { } }); } -async function li() { +async function ui() { try { - xe("[Majoor] Testing API connection..."); - let e = await re(it.HEALTH); - e?.ok ? xe("[Majoor] API connection successful, health:", e.data.overall) : console.error("[Majoor] ERROR: API health check failed:", e?.error); + Se("[Majoor] Testing API connection..."); + let e = await re(at.HEALTH); + e?.ok ? Se("[Majoor] API connection successful, health:", e.data.overall) : console.error("[Majoor] ERROR: API health check failed:", e?.error); } catch (e) { console.error("[Majoor] ERROR: Failed to connect to API:", e); } } // ui/app/style.ts -function ui() { +function di() { let e = "mjr-feed-selection-override"; if (typeof document > "u" || document.getElementById(e)) return; let t = document.createElement("style"); t.id = e, t.textContent = "\n .mjr-bottom-feed .mjr-asset-card.is-selected,\n .mjr-bottom-feed .mjr-card.is-selected {\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--mjr-accent, #5fb3ff) 78%, #ffffff 22%), 0 0 0 6px color-mix(in srgb, var(--mjr-accent, #5fb3ff) 34%, transparent), 0 0 24px color-mix(in srgb, var(--mjr-accent, #5fb3ff) 52%, transparent), 0 10px 28px rgba(0, 0, 0, 0.32) !important;\n outline: 2px solid color-mix(in srgb, var(--mjr-accent, #5fb3ff) 85%, #ffffff 15%) !important;\n outline-offset: 0 !important;\n border-color: color-mix(in srgb, var(--mjr-accent, #5fb3ff) 62%, var(--mjr-border, rgba(255, 255, 255, 0.12))) !important;\n overflow: visible !important;\n z-index: 12 !important;\n }\n ", document.head.appendChild(t); } -function di({ enabled: e = !0 } = {}) { +function fi({ enabled: e = !0 } = {}) { if (!e) return; let t = "mjr-theme-comfy-css"; - if (document.getElementById(t)) ui(); + if (document.getElementById(t)) di(); else try { - let e = new URL("data:text/css;base64,LyoqCiAqIE1ham9vciBBc3NldHMgTWFuYWdlciAtIENvbWZ5LWxpa2UgdGhlbWUgbGF5ZXIKICoKICogUlVMRVM6CiAqIC0gRG8gTk9UIGhhcmRjb2RlIGEgY3VzdG9tIHBhbGV0dGU7IHVzZSBleGlzdGluZyBDb21meVVJIENTUyB2YXJpYWJsZXMgdmlhIHZhciguLi4pLgogKiAtIEtlZXAgZXZlcnl0aGluZyBzY29wZWQgdW5kZXIgYC5tanItYXNzZXRzLW1hbmFnZXJgIHRvIGF2b2lkIGxlYWtpbmcgc3R5bGVzIHRvIENvbWZ5VUkgKGV4Y2VwdCBgLm1qci1wb3BvdmVyKmAgd2hpY2ggY2FuIGJlIHBvcnRhbGVkIHRvIGBkb2N1bWVudC5ib2R5YCkuCiAqLwoKLm1qci1hc3NldHMtbWFuYWdlciB7CiAgICAvKiBUeXBvZ3JhcGh5ICovCiAgICBmb250LWZhbWlseTogdmFyKAogICAgICAgIC0tY29tZnktZm9udCwKICAgICAgICB2YXIoCiAgICAgICAgICAgIC0tZm9udC1pbnRlciwKICAgICAgICAgICAgdWktc2Fucy1zZXJpZiwKICAgICAgICAgICAgc3lzdGVtLXVpLAogICAgICAgICAgICAtYXBwbGUtc3lzdGVtLAogICAgICAgICAgICAiU2Vnb2UgVUkiLAogICAgICAgICAgICBSb2JvdG8sCiAgICAgICAgICAgIEFyaWFsLAogICAgICAgICAgICBzYW5zLXNlcmlmCiAgICAgICAgKQogICAgKTsKICAgIGZvbnQtc2l6ZTogMTNweDsKICAgIGxpbmUtaGVpZ2h0OiAxLjM1OwogICAgY29sb3I6IHZhcigtLWZnLWNvbG9yLCB2YXIoLS1jb250ZW50LWZnLCB2YXIoLS1pbnB1dC10ZXh0LCAjZGRkKSkpOwoKICAgIC8qCiAgICAgKiBTdXJmYWNlcyAtIHByaW9yaXR5OiBDb21meVVJIHYxLjQyIGRlc2lnbi1zeXN0ZW0gdG9rZW4gLT4gbGVnYWN5IHRva2VuIC0+IGhhcmQgZmFsbGJhY2sKICAgICAqIE5ldyB0b2tlbnM6IC0taW50ZXJmYWNlLXBhbmVsLXN1cmZhY2UsIC0taW50ZXJmYWNlLW1lbnUtc3VyZmFjZSwgLS1pbnRlcmZhY2UtcGFuZWwtaG92ZXItc3VyZmFjZSwKICAgICAqICAgICAgICAgICAgIC0tbW9kYWwtY2FyZC1iYWNrZ3JvdW5kLCAtLWJ1dHRvbi1zdXJmYWNlLCAtLWJ1dHRvbi1ob3Zlci1zdXJmYWNlLAogICAgICogICAgICAgICAgICAgLS1pbnRlcmZhY2UtcGFuZWwtc2VsZWN0ZWQtc3VyZmFjZSwgLS1wcmltYXJ5LWJhY2tncm91bmQsIC0tbXV0ZWQtZm9yZWdyb3VuZCwKICAgICAqICAgICAgICAgICAgIC0tYm9yZGVyLWRlZmF1bHQsIC0tc3VjY2Vzcy1iYWNrZ3JvdW5kLCAtLXdhcm5pbmctYmFja2dyb3VuZCwgLS1kZXN0cnVjdGl2ZS1iYWNrZ3JvdW5kCiAgICAgKi8KICAgIC0tbWpyLXN1cmZhY2UtMDogdmFyKC0taW50ZXJmYWNlLXBhbmVsLXN1cmZhY2UsIHZhcigtLWNvbnRlbnQtYmcsICMxZTFlMWUpKTsKICAgIC0tbWpyLXN1cmZhY2UtMTogdmFyKC0taW50ZXJmYWNlLW1lbnUtc3VyZmFjZSwgdmFyKC0tY29tZnktbWVudS1iZywgIzJhMmEyYSkpOwogICAgLS1tanItc3VyZmFjZS0yOiB2YXIoLS1pbnRlcmZhY2UtcGFuZWwtaG92ZXItc3VyZmFjZSwgdmFyKC0tY29tZnktbWVudS1zZWNvbmRhcnktYmcsICMzMzMpKTsKICAgIC0tbWpyLXN1cmZhY2UtMzogdmFyKC0tbW9kYWwtY2FyZC1iYWNrZ3JvdW5kLCB2YXIoLS1jb21meS1tZW51LWJnLCAjMjIyKSk7CiAgICAtLW1qci1ib3JkZXI6IHZhcigtLWJvcmRlci1kZWZhdWx0LCB2YXIoLS1ib3JkZXItY29sb3IsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xMikpKTsKICAgIC0tbWpyLW11dGVkOiB2YXIoLS1tdXRlZC1mb3JlZ3JvdW5kLCB2YXIoLS1kZXNjcmlwLXRleHQsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC42NSkpKTsKICAgIC0tbWpyLWFjY2VudDogdmFyKC0tcHJpbWFyeS1iYWNrZ3JvdW5kLCB2YXIoLS1jb21meS1hY2NlbnQsICM1ZmIzZmYpKTsKICAgIC0tbWpyLWFjY2VudC1ob3ZlcjogdmFyKC0tcHJpbWFyeS1iYWNrZ3JvdW5kLWhvdmVyLCB2YXIoLS1jb21meS1hY2NlbnQsICM3ZWM4ZmYpKTsKICAgIC0tbWpyLWJ0bi1zdXJmYWNlOiB2YXIoLS1idXR0b24tc3VyZmFjZSwgdmFyKC0tbWpyLXN1cmZhY2UtMikpOwogICAgLS1tanItYnRuLWhvdmVyOiB2YXIoLS1idXR0b24taG92ZXItc3VyZmFjZSwgdmFyKC0tbWpyLXN1cmZhY2UtMikpOwogICAgLS1tanItc2VsZWN0ZWQtc3VyZmFjZTogdmFyKC0taW50ZXJmYWNlLXBhbmVsLXNlbGVjdGVkLXN1cmZhY2UsIHJnYmEoOTUsIDE3OSwgMjU1LCAwLjE1KSk7CgogICAgLyogUmFkaWkgLSB1c2UgQ29tZnlVSSBkZXNpZ24tc3lzdGVtIHJhZGl1cyB0b2tlbnMgd2hlbiBhdmFpbGFibGUgKi8KICAgIC0tbWpyLXItc206IHZhcigtLXJhZGl1cy1zbSwgOHB4KTsKICAgIC0tbWpyLXItbWQ6IHZhcigtLXJhZGl1cy1tZCwgMTBweCk7CiAgICAtLW1qci1yLWxnOiB2YXIoLS1yYWRpdXMtbGcsIDEycHgpOwoKICAgIC8qIFNwYWNpbmcgKi8KICAgIC0tbWpyLXBhZC1zbTogOHB4OwogICAgLS1tanItcGFkLW1kOiAxMnB4OwogICAgLS1tanItcGFkLWxnOiAxNnB4OwoKICAgIC8qIFNlbWFudGljIFN0YXR1cyBDb2xvcnMgLSBwcmVmZXIgQ29tZnlVSSB2MS40MiBzZW1hbnRpYyB0b2tlbnMgKi8KICAgIC0tbWpyLXN0YXR1cy1zdWNjZXNzOiB2YXIoLS1zdWNjZXNzLWJhY2tncm91bmQsIHZhcigtLWNvbWZ5LXN0YXR1cy1zdWNjZXNzLCAjNGNhZjUwKSk7CiAgICAtLW1qci1zdGF0dXMtd2FybmluZzogdmFyKC0td2FybmluZy1iYWNrZ3JvdW5kLCB2YXIoLS1jb21meS1zdGF0dXMtd2FybmluZywgI2ZmYTcyNikpOwogICAgLS1tanItc3RhdHVzLWVycm9yOiB2YXIoLS1kZXN0cnVjdGl2ZS1iYWNrZ3JvdW5kLCB2YXIoLS1jb21meS1zdGF0dXMtZXJyb3IsICNmNDQzMzYpKTsKICAgIC0tbWpyLXN0YXR1cy1pbmZvOiB2YXIoLS1jb21meS1zdGF0dXMtaW5mbywgIzIxOTZmMyk7CiAgICAtLW1qci1zdGF0dXMtbmV1dHJhbDogdmFyKC0tY29tZnktc3RhdHVzLW5ldXRyYWwsICM5ZTllOWUpOwogICAgLS1tanItc3Rhci1hY3RpdmU6ICNmZmQ0NWE7CgogICAgLyogQmFkZ2UgY29sb3JzIChvdmVycmlkZGVuIGJ5IHNldHRpbmdzKSAqLwogICAgLS1tanItYmFkZ2UtaW1hZ2U6ICMyMTk2ZjM7CiAgICAtLW1qci1iYWRnZS12aWRlbzogIzljMjdiMDsKICAgIC0tbWpyLWJhZGdlLWF1ZGlvOiAjZmY5ODAwOwogICAgLS1tanItYmFkZ2UtbW9kZWwzZDogIzRjYWY1MDsKICAgIC0tbWpyLWNhcmQtaG92ZXItY29sb3I6IHZhcigtLWludGVyZmFjZS1wYW5lbC1ob3Zlci1zdXJmYWNlLCAjM2QzZDNkKTsKICAgIC0tbWpyLWNhcmQtc2VsZWN0aW9uLWNvbG9yOiB2YXIoLS1pbnRlcmZhY2UtcGFuZWwtc2VsZWN0ZWQtc3VyZmFjZSwgIzRhOTBlMik7CiAgICAtLW1qci1yYXRpbmctY29sb3I6ICNmZjk1MDA7CiAgICAtLW1qci10YWctY29sb3I6ICM0YTkwZTI7Cn0KCi8qIE1ha2UgdGhlIHRoZW1lIHZpc2libHkgYXBwbHkgZXZlbiB3aXRoIGlubGluZSBzdHlsZXMgKi8KLm1qci1hc3NldHMtbWFuYWdlciAqIHsKICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIubWpyLWFtLWNvbnRhaW5lciB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgIGhlaWdodDogMTAwJTsKICAgIG92ZXJmbG93OiBoaWRkZW47Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hbS1oZWFkZXIgewogICAgcGFkZGluZzogMTRweCAxNnB4OwogICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHZhcigtLW1qci1ib3JkZXIpOwogICAgYmFja2dyb3VuZDogdmFyKC0tbWpyLXN1cmZhY2UtMSk7CiAgICBmbGV4OiAwIDAgYXV0bzsKICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgIHotaW5kZXg6IDI7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hbS1oZWFkZXItcm93IHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiAxMHB4OwogICAgbWluLWhlaWdodDogMjhweDsKICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsKICAgIGZsZXgtd3JhcDogd3JhcDsKICAgIHJvdy1nYXA6IDEwcHg7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hbS1oZWFkZXItbGVmdCB7CiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBnYXA6IDEwcHg7CiAgICBtaW4td2lkdGg6IDA7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hbS1oZWFkZXItYWN0aW9ucyB7CiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBnYXA6IDEwcHg7CiAgICBmbGV4OiAwIDAgYXV0bzsKICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgIGZsZXgtd3JhcDogd3JhcDsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFtLWhlYWRlci10b29scyB7CiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgIGdhcDogOHB4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLXRhYnMgewogICAgLyogUXVldWUtbGlrZSB0YWJzIChhY3RpdmUgcGlsbCwgb3RoZXJzIGFzIHRleHQpICovCiAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsKICAgIGJvcmRlcjogbm9uZTsKICAgIHBhZGRpbmc6IDA7CiAgICBnYXA6IDEwcHg7CiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBmbGV4OiAxIDEgYXV0bzsKICAgIG1pbi13aWR0aDogMDsKICAgIG92ZXJmbG93LXg6IGF1dG87CiAgICBvdmVyZmxvdy15OiBoaWRkZW47CiAgICBzY3JvbGxiYXItd2lkdGg6IG5vbmU7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci10YWJzOjotd2Via2l0LXNjcm9sbGJhciB7CiAgICB3aWR0aDogMDsKICAgIGhlaWdodDogMDsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLXRhYiB7CiAgICBwYWRkaW5nOiA2cHggMTJweDsKICAgIGJvcmRlci1yYWRpdXM6IDk5OXB4OwogICAgYm9yZGVyOiAxcHggc29saWQgdHJhbnNwYXJlbnQ7CiAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsKICAgIGNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tY29udGVudC1mZywgI2RkZCkgNjUlLCB0cmFuc3BhcmVudCk7CiAgICB0cmFuc2l0aW9uOgogICAgICAgIHRyYW5zZm9ybSAxMjBtcyBlYXNlLAogICAgICAgIGJhY2tncm91bmQtY29sb3IgMTIwbXMgZWFzZSwKICAgICAgICBjb2xvciAxMjBtcyBlYXNlLAogICAgICAgIGJvcmRlci1jb2xvciAxMjBtcyBlYXNlOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItdGFiOmhvdmVyIHsKICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtMXB4KTsKICAgIGNvbG9yOiB2YXIoLS1jb250ZW50LWZnLCAjZGRkKTsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0yKSA1NSUsIHRyYW5zcGFyZW50KTsKICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1ib3JkZXIpIDcwJSwgdHJhbnNwYXJlbnQpOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItdGFiLmlzLWFjdGl2ZSB7CiAgICBjb2xvcjogdmFyKC0tY29udGVudC1mZywgI2ZmZik7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMikgODAlLCB0cmFuc3BhcmVudCk7CiAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYm9yZGVyKSA4NSUsIHRyYW5zcGFyZW50KTsKICAgIGJveC1zaGFkb3c6IDAgNnB4IDE4cHggcmdiYSgwLCAwLCAwLCAwLjE4KTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWljb24tYnRuIHsKICAgIHdpZHRoOiAyOHB4OwogICAgaGVpZ2h0OiAyOHB4OwogICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1yYWRpdXMtbGcsIDAuNXJlbSk7CiAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1tanItYm9yZGVyKTsKICAgIGJhY2tncm91bmQ6IHZhcigtLW1qci1zdXJmYWNlLTIpOwogICAgY29sb3I6IHZhcigtLWNvbnRlbnQtZmcsICNkZGQpOwogICAgY3Vyc29yOiBwb2ludGVyOwogICAgcGFkZGluZzogMDsKICAgIHRyYW5zaXRpb246CiAgICAgICAgdHJhbnNmb3JtIDEyMG1zIGVhc2UsCiAgICAgICAgYmFja2dyb3VuZC1jb2xvciAxMjBtcyBlYXNlLAogICAgICAgIGJvcmRlci1jb2xvciAxMjBtcyBlYXNlOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItaWNvbi1idG46aG92ZXIgewogICAgYm9yZGVyLWNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWFjY2VudCkgNDUlLCB2YXIoLS1tanItYm9yZGVyKSk7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMikgODAlLCB2YXIoLS1tanItYWNjZW50KSA4JSk7CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTFweCk7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1pY29uLWJ0bi5tanItY29udGV4dC1hY3RpdmUsCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1pY29uLWJ0bi5tanItcG9wb3Zlci1vcGVuIHsKICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQpIDg1JSwgdmFyKC0tbWpyLWJvcmRlcikpOwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTIpIDU1JSwgdmFyKC0tbWpyLWFjY2VudCkgMTIlKTsKICAgIGJveC1zaGFkb3c6IDAgMCAwIDFweCBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWFjY2VudCkgMzUlLCB0cmFuc3BhcmVudCk7Cn0KCi8qIEZsb2F0aW5nIFZpZXdlciBidXR0b24gLSB0ZWFsIGdsb3cgd2hlbiB2aWV3ZXIgaXMgb3BlbiAqLwoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItaWNvbi1idG4ubWpyLW1mdi1idG4tYWN0aXZlIHsKICAgIGNvbG9yOiAjNGRkOWMwOwogICAgYm9yZGVyLWNvbG9yOiByZ2JhKDc3LCAyMTcsIDE5MiwgMC41NSk7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDc3LCAyMTcsIDE5MiwgMC4xKTsKICAgIGJveC1zaGFkb3c6IDAgMCAwIDFweCByZ2JhKDc3LCAyMTcsIDE5MiwgMC4yNSk7Cn0KLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWljb24tYnRuLm1qci1tZnYtYnRuLWFjdGl2ZSAucGkgewogICAgb3BhY2l0eTogMTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWljb24tYnRuLm1qci1tZXNzYWdlLWJ0biB7CiAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICBvdmVyZmxvdzogdmlzaWJsZTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWljb24tYnRuLm1qci1tZXNzYWdlLWhhcy11bnJlYWQgewogICAgYm9yZGVyLWNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWFjY2VudCkgNzUlLCB2YXIoLS1tanItYm9yZGVyKSk7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMikgNzIlLCB2YXIoLS1tanItYWNjZW50KSAxMSUpOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItbWVzc2FnZS1iYWRnZSB7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICB0b3A6IC01cHg7CiAgICByaWdodDogLTZweDsKICAgIG1pbi13aWR0aDogMTZweDsKICAgIGhlaWdodDogMTZweDsKICAgIHBhZGRpbmc6IDAgNHB4OwogICAgYm9yZGVyLXJhZGl1czogOTk5cHg7CiAgICBib3JkZXI6IDFweCBzb2xpZCBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMSkgNTUlLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMykpOwogICAgYmFja2dyb3VuZDogI2VmNTM1MDsKICAgIGNvbG9yOiAjZmZmOwogICAgZm9udC1zaXplOiAxMHB4OwogICAgZm9udC13ZWlnaHQ6IDcwMDsKICAgIGxpbmUtaGVpZ2h0OiAxOwogICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgIGJveC1zaGFkb3c6IDAgMnB4IDhweCByZ2JhKDAsIDAsIDAsIDAuMzUpOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItaWNvbi1idG4gLnBpIHsKICAgIGZvbnQtc2l6ZTogMTNweDsKICAgIGxpbmUtaGVpZ2h0OiAxOwogICAgb3BhY2l0eTogMC45Owp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItaWNvbi1idG46ZGlzYWJsZWQsCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1haS1jb250cm9sOmRpc2FibGVkIHsKICAgIG9wYWNpdHk6IDAuNTsKICAgIGN1cnNvcjogbm90LWFsbG93ZWQ7CiAgICB0cmFuc2Zvcm06IG5vbmU7CiAgICBmaWx0ZXI6IGdyYXlzY2FsZSgwLjQ1KTsKICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1ib3JkZXIpIDg4JSwgdHJhbnNwYXJlbnQpICFpbXBvcnRhbnQ7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMikgOTIlLCB0cmFuc3BhcmVudCkgIWltcG9ydGFudDsKICAgIGNvbG9yOiB2YXIoLS1tanItbXV0ZWQsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC42KSkgIWltcG9ydGFudDsKICAgIGJveC1zaGFkb3c6IG5vbmUgIWltcG9ydGFudDsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFpLWRpc2FibGVkIC5tanItYWktY29udHJvbDpob3ZlciB7CiAgICB0cmFuc2Zvcm06IG5vbmUgIWltcG9ydGFudDsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFpLWRpc2FibGVkLWJsb2NrIHsKICAgIG9wYWNpdHk6IDAuNTg7CiAgICBmaWx0ZXI6IGdyYXlzY2FsZSgwLjQ1KTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFpLWRpc2FibGVkLWJsb2NrIC5tanItYWktY29udHJvbCwKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFpLWRpc2FibGVkLWJsb2NrIGJ1dHRvbiB7CiAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKfQoKLyogUG9wb3ZlcnMgY2FuIGJlIG1vdmVkIHRvIGBkb2N1bWVudC5ib2R5YCAocG9ydGFsKSB0byBhdm9pZCBiZWluZyBjbGlwcGVkLiAqLwoubWpyLXBvcG92ZXIgewogICAgZm9udC1mYW1pbHk6IHZhcigKICAgICAgICAtLWNvbWZ5LWZvbnQsCiAgICAgICAgdmFyKAogICAgICAgICAgICAtLWZvbnQtaW50ZXIsCiAgICAgICAgICAgIHVpLXNhbnMtc2VyaWYsCiAgICAgICAgICAgIHN5c3RlbS11aSwKICAgICAgICAgICAgLWFwcGxlLXN5c3RlbSwKICAgICAgICAgICAgIlNlZ29lIFVJIiwKICAgICAgICAgICAgUm9ib3RvLAogICAgICAgICAgICBBcmlhbCwKICAgICAgICAgICAgc2Fucy1zZXJpZgogICAgICAgICkKICAgICk7CiAgICBmb250LXNpemU6IDEzcHg7CiAgICBsaW5lLWhlaWdodDogMS4zNTsKICAgIGNvbG9yOiB2YXIoLS1mZy1jb2xvciwgdmFyKC0tY29udGVudC1mZywgdmFyKC0taW5wdXQtdGV4dCwgI2RkZCkpKTsKCiAgICAvKiBQcm92aWRlIGZhbGxiYWNrcyB3aGVuIG91dHNpZGUgYC5tanItYXNzZXRzLW1hbmFnZXJgIHNjb3BlICovCiAgICAtLW1qci1zdXJmYWNlLTE6IHZhcigtLWludGVyZmFjZS1tZW51LXN1cmZhY2UsIHZhcigtLWNvbWZ5LW1lbnUtYmcsICMyYTJhMmEpKTsKICAgIC0tbWpyLWJvcmRlcjogdmFyKC0tYm9yZGVyLWRlZmF1bHQsIHZhcigtLWJvcmRlci1jb2xvciwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEyKSkpOwogICAgLS1tanItbXV0ZWQ6IHZhcigtLW11dGVkLWZvcmVncm91bmQsIHZhcigtLWRlc2NyaXAtdGV4dCwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjY1KSkpOwogICAgLS1tanItYWNjZW50OiB2YXIoLS1wcmltYXJ5LWJhY2tncm91bmQsIHZhcigtLWNvbWZ5LWFjY2VudCwgIzVmYjNmZikpOwogICAgLS1tanItcG9wb3Zlci16LWluZGV4OiAyMTQ3NDgzNjQ3OwoKICAgIHBvc2l0aW9uOiBmaXhlZDsKICAgIHRvcDogMDsKICAgIGxlZnQ6IDA7CiAgICBtaW4td2lkdGg6IDA7CiAgICB3aWR0aDogbWluKDI4MHB4LCBjYWxjKDEwMHZ3IC0gMjRweCkpOwogICAgbWF4LXdpZHRoOiBtaW4oMzYwcHgsIGNhbGMoMTAwdncgLSAyNHB4KSk7CiAgICBwYWRkaW5nOiAxMHB4OwogICAgYm9yZGVyLXJhZGl1czogdmFyKC0tcmFkaXVzLWxnLCAwLjVyZW0pOwogICAgYmFja2dyb3VuZDogdmFyKC0tbWpyLXN1cmZhY2UtMSwgdmFyKC0tY29tZnktbWVudS1iZywgIzJhMmEyYSkpOwogICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tbWpyLWJvcmRlciwgdmFyKC0tYm9yZGVyLWNvbG9yLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTIpKSk7CiAgICBib3gtc2hhZG93OiAwIDEycHggMjhweCByZ2JhKDAsIDAsIDAsIDAuMzUpOwogICAgei1pbmRleDogdmFyKC0tbWpyLXBvcG92ZXItei1pbmRleCk7CiAgICBtaW4taGVpZ2h0OiAwOwogICAgb3ZlcmZsb3cteDogaGlkZGVuOwogICAgb3ZlcmZsb3cteTogYXV0bzsKICAgIG92ZXJzY3JvbGwtYmVoYXZpb3I6IGNvbnRhaW47CiAgICAtd2Via2l0LW92ZXJmbG93LXNjcm9sbGluZzogdG91Y2g7CiAgICB0b3VjaC1hY3Rpb246IHBhbi15OwogICAgc2Nyb2xsYmFyLXdpZHRoOiB0aGluOwp9CgoubWpyLXBvcG92ZXItLWhpZGRlbiB7CiAgICBkaXNwbGF5OiBub25lOwp9CgoubWpyLWZpbHRlci1wb3BvdmVyIHsKICAgIG1pbi13aWR0aDogMzQwcHg7CiAgICB3aWR0aDogbWluKDM2MHB4LCBjYWxjKDEwMHZ3IC0gMjRweCkpOwogICAgcGFkZGluZzogMTJweDsKfQoKLm1qci1zb3J0LXBvcG92ZXIgewogICAgbWluLXdpZHRoOiAyMjBweDsKICAgIHdpZHRoOiBtaW4oMjYwcHgsIGNhbGMoMTAwdncgLSAyNHB4KSk7CiAgICBwYWRkaW5nOiAxMHB4Owp9CgoubWpyLWNvbGxlY3Rpb25zLXBvcG92ZXIgewogICAgbWluLXdpZHRoOiAyODBweDsKICAgIHdpZHRoOiBtaW4oMzIwcHgsIGNhbGMoMTAwdncgLSAyNHB4KSk7CiAgICBwYWRkaW5nOiAxMHB4Owp9CgoubWpyLXBpbm5lZC1mb2xkZXJzLXBvcG92ZXIgewogICAgbWluLXdpZHRoOiAyODBweDsKICAgIHdpZHRoOiBtaW4oMzQwcHgsIGNhbGMoMTAwdncgLSAyNHB4KSk7CiAgICBwYWRkaW5nOiAxMHB4Owp9CgoubWpyLXBpbm5lZC1mb2xkZXJzLXBvcG92ZXIgLm1qci1waW5uZWQtZm9sZGVycy1tZW51IHsKICAgIGRpc3BsYXk6IGdyaWQ7CiAgICBnYXA6IDZweDsKfQoKLm1qci1waW5uZWQtZm9sZGVycy1wb3BvdmVyIC5tanItcGlubmVkLWZvbGRlcnMtZW1wdHkgewogICAgcGFkZGluZzogMTBweCAxMnB4OwogICAgb3BhY2l0eTogMC43NTsKfQoKLm1qci1waW5uZWQtZm9sZGVycy1wb3BvdmVyIC5tanItcGlubmVkLWZvbGRlci1yb3cgewogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBzdHJldGNoOwogICAgd2lkdGg6IDEwMCU7Cn0KCi5tanItcGlubmVkLWZvbGRlcnMtcG9wb3ZlciAubWpyLXBpbm5lZC1mb2xkZXItb3BlbiB7CiAgICBmbGV4OiAxOwogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47CiAgICB3aWR0aDogMTAwJTsKICAgIGdhcDogMTBweDsKICAgIHBhZGRpbmc6IDlweCAxMHB4OwogICAgYm9yZGVyLXJhZGl1czogOXB4OwogICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgxMjAsIDE5MCwgMjU1LCAwLjE4KTsKICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgxMzVkZWcsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wMyksIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wMSkpOwogICAgdHJhbnNpdGlvbjoKICAgICAgICBib3JkZXItY29sb3IgMTIwbXMgZWFzZSwKICAgICAgICBiYWNrZ3JvdW5kIDEyMG1zIGVhc2U7Cn0KCi5tanItcGlubmVkLWZvbGRlcnMtcG9wb3ZlciAubWpyLXBpbm5lZC1mb2xkZXItb3Blbjpob3ZlciwKLm1qci1waW5uZWQtZm9sZGVycy1wb3BvdmVyIC5tanItcGlubmVkLWZvbGRlci1vcGVuOmZvY3VzLXZpc2libGUgewogICAgYm9yZGVyLWNvbG9yOiByZ2JhKDE0NSwgMjA1LCAyNTUsIDAuNCk7CiAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoMTM1ZGVnLCByZ2JhKDgwLCAxNDAsIDI1NSwgMC4xOCksIHJnYmEoMzIsIDEwMCwgMjAwLCAwLjE0KSk7Cn0KCi5tanItcGlubmVkLWZvbGRlcnMtcG9wb3ZlciAubWpyLXBpbm5lZC1mb2xkZXItbGFiZWwgewogICAgbWluLXdpZHRoOiAwOwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgIGZvbnQtd2VpZ2h0OiA2MDA7CiAgICBjb2xvcjogdmFyKC0tZmctY29sb3IsICNlNmVkZjcpOwp9CgoubWpyLXBpbm5lZC1mb2xkZXJzLXBvcG92ZXIgLm1qci1waW5uZWQtZm9sZGVyLXBhdGggewogICAgZmxleDogMCAxIGF1dG87CiAgICBtaW4td2lkdGg6IDA7CiAgICBtYXgtd2lkdGg6IDIyMHB4OwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgIG9wYWNpdHk6IDAuNjg7CiAgICBmb250LXNpemU6IDExcHg7Cn0KCi5tanItcGlubmVkLWZvbGRlcnMtcG9wb3ZlciAubWpyLXBpbm5lZC1mb2xkZXItdW5waW4gewogICAgd2lkdGg6IDQycHg7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgIHBhZGRpbmc6IDA7CiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDI1NSwgOTUsIDk1LCAwLjM1KTsKICAgIGJvcmRlci1yYWRpdXM6IDlweDsKICAgIG1hcmdpbi1sZWZ0OiA2cHg7CiAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoMTM1ZGVnLCByZ2JhKDI1NSwgNzAsIDcwLCAwLjE2KSwgcmdiYSgxNjAsIDIwLCAyMCwgMC4xMikpOwp9CgoubWpyLXBpbm5lZC1mb2xkZXJzLXBvcG92ZXIgLm1qci1waW5uZWQtZm9sZGVyLXVucGluIC5waSB7CiAgICBvcGFjaXR5OiAwLjg4OwogICAgY29sb3I6IHJnYmEoMjU1LCAxMzAsIDEzMCwgMC45Nik7Cn0KCi5tanItbWVzc2FnZXMtcG9wb3ZlciB7CiAgICBtaW4td2lkdGg6IDMyMHB4OwogICAgd2lkdGg6IG1pbig0NjBweCwgY2FsYygxMDB2dyAtIDI0cHgpKTsKICAgIHBhZGRpbmc6IDEwcHg7Cn0KCi5tanItaW5saW5lLWRpYWxvZy1tYXNrIHsKICAgIHBvc2l0aW9uOiBzdGF0aWMgIWltcG9ydGFudDsKICAgIGluc2V0OiBhdXRvICFpbXBvcnRhbnQ7CiAgICB3aWR0aDogYXV0byAhaW1wb3J0YW50OwogICAgaGVpZ2h0OiBhdXRvICFpbXBvcnRhbnQ7CiAgICBkaXNwbGF5OiBibG9jayAhaW1wb3J0YW50OwogICAgcG9pbnRlci1ldmVudHM6IGF1dG8gIWltcG9ydGFudDsKfQoKLm1qci1pbmxpbmUtZGlhbG9nLXJvb3QgewogICAgZGlzcGxheTogYmxvY2sgIWltcG9ydGFudDsKICAgIHdpZHRoOiAxMDAlOwogICAgcG9pbnRlci1ldmVudHM6IGF1dG87Cn0KCi5tanItaW5saW5lLWRpYWxvZy1jb250ZW50IHsKICAgIHBhZGRpbmc6IDA7Cn0KCi5tanItbWVzc2FnZXMtaGVhZCB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsKICAgIGdhcDogOHB4OwogICAgZmxleC13cmFwOiB3cmFwOwogICAgbWFyZ2luLWJvdHRvbTogOHB4Owp9CgoubWpyLW1lc3NhZ2VzLXRhYnMgewogICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiA2cHg7CiAgICBtYXJnaW4tYm90dG9tOiA4cHg7CiAgICBwYWRkaW5nOiAzcHg7CiAgICBib3JkZXItcmFkaXVzOiA5OTlweDsKICAgIGJvcmRlcjogMXB4IHNvbGlkIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYm9yZGVyKSA4OCUsIHRyYW5zcGFyZW50KTsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0yKSA3NCUsIHRyYW5zcGFyZW50KTsKfQoKLm1qci1tZXNzYWdlcy10YWIgewogICAgYXBwZWFyYW5jZTogbm9uZTsKICAgIGJvcmRlcjogMDsKICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50OwogICAgY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1jb250ZW50LWZnLCAjZjFmMWYxKSA3NiUsIHRyYW5zcGFyZW50KTsKICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogNnB4OwogICAgZm9udC1zaXplOiAxMXB4OwogICAgZm9udC13ZWlnaHQ6IDcwMDsKICAgIGxpbmUtaGVpZ2h0OiAxLjI7CiAgICBwYWRkaW5nOiA2cHggMTBweDsKICAgIGJvcmRlci1yYWRpdXM6IDk5OXB4OwogICAgY3Vyc29yOiBwb2ludGVyOwogICAgdHJhbnNpdGlvbjoKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yIDAuMTRzIGVhc2UsCiAgICAgICAgY29sb3IgMC4xNHMgZWFzZSwKICAgICAgICB0cmFuc2Zvcm0gMC4xNHMgZWFzZTsKfQoKLm1qci1tZXNzYWdlcy10YWI6aG92ZXIsCi5tanItbWVzc2FnZXMtdGFiOmZvY3VzLXZpc2libGUgewogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQpIDE0JSwgdHJhbnNwYXJlbnQpOwogICAgY29sb3I6IHZhcigtLWNvbnRlbnQtZmcsICNmMWYxZjEpOwogICAgb3V0bGluZTogbm9uZTsKfQoKLm1qci1tZXNzYWdlcy10YWIuaXMtYWN0aXZlIHsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYWNjZW50KSAyMiUsIHZhcigtLW1qci1zdXJmYWNlLTIpKTsKICAgIGNvbG9yOiB2YXIoLS1jb250ZW50LWZnLCAjZmZmKTsKICAgIGJveC1zaGFkb3c6IGluc2V0IDAgMCAwIDFweCBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWFjY2VudCkgMzQlLCB0cmFuc3BhcmVudCk7Cn0KCi5tanItbWVzc2FnZXMtcGFuZWxzIHsKICAgIGRpc3BsYXk6IGdyaWQ7CiAgICBnYXA6IDhweDsKICAgIG1heC1oZWlnaHQ6IG1pbig1MnZoLCA0MjBweCk7Cn0KCi5tanItbWVzc2FnZXMtbGlzdCwKLm1qci1tZXNzYWdlcy1zaG9ydGN1dHMtcGFuZWwgewogICAgb3ZlcmZsb3cteTogYXV0bzsKICAgIG92ZXJzY3JvbGwtYmVoYXZpb3I6IGNvbnRhaW47CiAgICBzY3JvbGxiYXItd2lkdGg6IHRoaW47Cn0KCi5tanItdGFiLWNvdW50LWJhZGdlIHsKICAgIG1pbi13aWR0aDogMTZweDsKICAgIGhlaWdodDogMTZweDsKICAgIHBhZGRpbmc6IDAgNXB4OwogICAgYm9yZGVyLXJhZGl1czogOTk5cHg7CiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgIGZvbnQtc2l6ZTogOXB4OwogICAgZm9udC13ZWlnaHQ6IDgwMDsKICAgIGxldHRlci1zcGFjaW5nOiAwLjAyZW07CiAgICBsaW5lLWhlaWdodDogMTsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYWNjZW50KSAyOCUsIHZhcigtLW1qci1zdXJmYWNlLTIpKTsKICAgIGNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tY29udGVudC1mZywgI2ZmZikgOTIlLCB0cmFuc3BhcmVudCk7CiAgICBib3gtc2hhZG93OiBpbnNldCAwIDAgMCAxcHggY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQpIDQ4JSwgdHJhbnNwYXJlbnQpOwp9CgoubWpyLW1lc3NhZ2VzLXRpdGxlIHsKICAgIGZsZXg6IDEgMSBhdXRvOwogICAgbWluLXdpZHRoOiAwOwogICAgZm9udC1zaXplOiAxMnB4OwogICAgZm9udC13ZWlnaHQ6IDcwMDsKICAgIGxldHRlci1zcGFjaW5nOiAwLjAzZW07CiAgICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOwogICAgY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1jb250ZW50LWZnLCAjZGRkKSA4MiUsIHZhcigtLW1qci1tdXRlZCkpOwp9CgoubWpyLW1lc3NhZ2VzLWFjdGlvbnMgewogICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBmbGV4LWVuZDsKICAgIGdhcDogNnB4OwogICAgZmxleC13cmFwOiB3cmFwOwp9CgoubWpyLW1lc3NhZ2VzLW1hcmstcmVhZC1idG4gewogICAgcGFkZGluZzogNHB4IDhweDsKICAgIGZvbnQtc2l6ZTogMTFweDsKICAgIGxpbmUtaGVpZ2h0OiAxLjI7Cn0KCi5tanItbWVzc2FnZXMtc3Rhci1saW5rIHsKICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogNnB4OwogICAgcGFkZGluZzogNHB4IDhweDsKICAgIGZvbnQtc2l6ZTogMTFweDsKICAgIGxpbmUtaGVpZ2h0OiAxLjI7CiAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7CiAgICBjb2xvcjogdmFyKC0tY29udGVudC1mZywgI2YxZjFmMSk7CiAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCAjZjNjODRiIDQyJSwgdmFyKC0tbWpyLWJvcmRlcikpOwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsICNmM2M4NGIgMTIlLCB2YXIoLS1tanItc3VyZmFjZS0yKSk7Cn0KCi5tanItbWVzc2FnZXMtc3Rhci1saW5rOmhvdmVyLAoubWpyLW1lc3NhZ2VzLXN0YXItbGluazpmb2N1cy12aXNpYmxlIHsKICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKfQoKLm1qci1tZXNzYWdlcy1zdGFyLWljb24gewogICAgY29sb3I6ICNmM2M4NGI7CiAgICBmb250LXNpemU6IDEycHg7CiAgICBsaW5lLWhlaWdodDogMTsKfQoKLm1qci1tZXNzYWdlcy1zdGFyLWxhYmVsIHsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7Cn0KCi5tanItbWVzc2FnZXMtbGlzdCB7CiAgICBkaXNwbGF5OiBncmlkOwogICAgZ2FwOiA4cHg7Cn0KCi5tanItbWVzc2FnZXMtZW1wdHkgewogICAgcGFkZGluZzogOHB4IDZweDsKICAgIGZvbnQtc2l6ZTogMTJweDsKICAgIG9wYWNpdHk6IDAuNzI7Cn0KCi5tanItbWVzc2FnZS1pdGVtIHsKICAgIGRpc3BsYXk6IGdyaWQ7CiAgICBnYXA6IDVweDsKICAgIGJvcmRlci1yYWRpdXM6IDEwcHg7CiAgICBib3JkZXI6IDFweCBzb2xpZCBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWJvcmRlcikgODYlLCB0cmFuc3BhcmVudCk7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMikgNTglLCB0cmFuc3BhcmVudCk7CiAgICBwYWRkaW5nOiA4cHg7Cn0KCi5tanItbWVzc2FnZS1pdGVtLS11bnJlYWQgewogICAgYm9yZGVyLWNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWFjY2VudCkgNTglLCB2YXIoLS1tanItYm9yZGVyKSk7CiAgICBib3gtc2hhZG93OiBpbnNldCAwIDAgMCAxcHggY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQpIDI2JSwgdHJhbnNwYXJlbnQpOwp9CgoubWpyLW1lc3NhZ2UtaXRlbS0td2FybmluZyB7CiAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCAjZjBiODVhIDYyJSwgdmFyKC0tbWpyLWJvcmRlcikpOwp9CgoubWpyLW1lc3NhZ2UtaXRlbS0tZXJyb3IgewogICAgYm9yZGVyLWNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgI2YzNmI2YiA2MiUsIHZhcigtLW1qci1ib3JkZXIpKTsKfQoKLm1qci1tZXNzYWdlLWl0ZW0tLXN1Y2Nlc3MgewogICAgYm9yZGVyLWNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgIzU4YzA3ZCA2MiUsIHZhcigtLW1qci1ib3JkZXIpKTsKfQoKLm1qci1tZXNzYWdlLWl0ZW0taGVhZCB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsKICAgIGdhcDogOHB4Owp9CgoubWpyLW1lc3NhZ2UtaXRlbS10aXRsZS13cmFwIHsKICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogOHB4OwogICAgbWluLXdpZHRoOiAwOwogICAgZmxleDogMSAxIGF1dG87Cn0KCi5tanItbWVzc2FnZS1pdGVtLWVtb2ppIHsKICAgIGZsZXg6IDAgMCBhdXRvOwogICAgZm9udC1zaXplOiAxNnB4OwogICAgbGluZS1oZWlnaHQ6IDE7Cn0KCi5tanItbWVzc2FnZS1pdGVtLXRpdGxlIHsKICAgIG1pbi13aWR0aDogMDsKICAgIGZvbnQtd2VpZ2h0OiA2MDA7CiAgICBjb2xvcjogdmFyKC0tY29udGVudC1mZywgI2YxZjFmMSk7Cn0KCi5tanItbWVzc2FnZS1pdGVtLWNhdGVnb3J5IHsKICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIHBhZGRpbmc6IDFweCA2cHg7CiAgICBib3JkZXItcmFkaXVzOiA5OTlweDsKICAgIGZvbnQtc2l6ZTogMTBweDsKICAgIGZvbnQtd2VpZ2h0OiA3MDA7CiAgICBsZXR0ZXItc3BhY2luZzogMC4wM2VtOwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQpIDIwJSwgdmFyKC0tbWpyLXN1cmZhY2UtMikpOwogICAgY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1jb250ZW50LWZnLCAjZmZmKSA4NiUsIHRyYW5zcGFyZW50KTsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7Cn0KCi5tanItbWVzc2FnZS1pdGVtLW1ldGEgewogICAgZm9udC1zaXplOiAxMXB4OwogICAgb3BhY2l0eTogMC43MjsKfQoKLm1qci1tZXNzYWdlLWl0ZW0tYm9keSB7CiAgICBmb250LXNpemU6IDEycHg7CiAgICBvcGFjaXR5OiAwLjkyOwogICAgbGluZS1oZWlnaHQ6IDEuNDU7CiAgICB3aGl0ZS1zcGFjZTogcHJlLXdyYXA7CiAgICB3b3JkLWJyZWFrOiBicmVhay13b3JkOwp9CgoubWpyLW1lc3NhZ2UtaXRlbS1hY3Rpb24gewogICAgZm9udC1zaXplOiAxMXB4OwogICAgZm9udC13ZWlnaHQ6IDYwMDsKICAgIGNvbG9yOiB2YXIoLS1tanItYWNjZW50LCB2YXIoLS1jb21meS1hY2NlbnQsICM1ZmIzZmYpKTsKICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKICAgIHdpZHRoOiBmaXQtY29udGVudDsKfQoKLm1qci1tZXNzYWdlLWl0ZW0tYWN0aW9uOmhvdmVyIHsKICAgIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOwp9CgovKiBUb2FzdCBIaXN0b3J5IHRhYiAtIHVucmVhZCBpbmRpY2F0b3IgZG90ICovCi5tanItdGFiLXVucmVhZC1kb3QgewogICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgd2lkdGg6IDZweDsKICAgIGhlaWdodDogNnB4OwogICAgYm9yZGVyLXJhZGl1czogNTAlOwogICAgYmFja2dyb3VuZDogdmFyKC0tbWpyLWFjY2VudCwgIzVmYjNmZik7CiAgICBtYXJnaW4tbGVmdDogNXB4OwogICAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsKICAgIGZsZXgtc2hyaW5rOiAwOwp9CgovKiBIaXN0b3J5IHBhbmVsICovCi5tanItbWVzc2FnZXMtaGlzdG9yeS1wYW5lbCB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgIG1pbi1oZWlnaHQ6IDA7CiAgICBvdmVyZmxvdzogaGlkZGVuOwp9CgoubWpyLWhpc3RvcnktaGVhZCB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsKICAgIHBhZGRpbmc6IDRweCAwIDZweDsKICAgIGZsZXgtc2hyaW5rOiAwOwp9CgoubWpyLWhpc3RvcnktaGVhZC1sYWJlbCB7CiAgICBmb250LXNpemU6IDExcHg7CiAgICBmb250LXdlaWdodDogNjAwOwogICAgb3BhY2l0eTogMC42MjsKICAgIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7CiAgICBsZXR0ZXItc3BhY2luZzogMC4wNWVtOwp9CgoubWpyLWhpc3RvcnktY2xlYXItYnRuIHsKICAgIGZvbnQtc2l6ZTogMTFweDsKICAgIHBhZGRpbmc6IDJweCA4cHg7CiAgICBib3JkZXItcmFkaXVzOiA0cHg7CiAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLW1qci1ib3JkZXIsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xMikpOwogICAgY29sb3I6IGluaGVyaXQ7CiAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICBvcGFjaXR5OiAwLjcyOwp9CgoubWpyLWhpc3RvcnktY2xlYXItYnRuOmhvdmVyIHsKICAgIG9wYWNpdHk6IDE7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWFjY2VudCkgMTIlLCB0cmFuc3BhcmVudCk7Cn0KCi5tanItaGlzdG9yeS1saXN0IHsKICAgIGRpc3BsYXk6IGdyaWQ7CiAgICBnYXA6IDRweDsKICAgIG92ZXJmbG93LXk6IGF1dG87CiAgICBvdmVyc2Nyb2xsLWJlaGF2aW9yOiBjb250YWluOwp9CgoubWpyLWhpc3RvcnktaXRlbSB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGZsZXgtc3RhcnQ7CiAgICBnYXA6IDhweDsKICAgIHBhZGRpbmc6IDZweCA4cHg7CiAgICBib3JkZXItcmFkaXVzOiA2cHg7CiAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1tanItYm9yZGVyLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDgpKTsKICAgIGJhY2tncm91bmQ6IHZhcigtLW1qci1zdXJmYWNlLTIsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wNCkpOwogICAgZm9udC1zaXplOiAxMnB4Owp9CgoubWpyLWhpc3RvcnktaXRlbS0tZXJyb3IgewogICAgYm9yZGVyLWNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgI2YzNmI2YiA1MCUsIHZhcigtLW1qci1ib3JkZXIpKTsKfQoKLm1qci1oaXN0b3J5LWl0ZW0tLXdhcm5pbmcgewogICAgYm9yZGVyLWNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgI2YwYjg1YSA1MCUsIHZhcigtLW1qci1ib3JkZXIpKTsKfQoKLm1qci1oaXN0b3J5LWl0ZW0tLXN1Y2Nlc3MgewogICAgYm9yZGVyLWNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgIzU4YzA3ZCA1MCUsIHZhcigtLW1qci1ib3JkZXIpKTsKfQoKLm1qci1oaXN0b3J5LWl0ZW0taWNvbiB7CiAgICBmbGV4LXNocmluazogMDsKICAgIGZvbnQtc2l6ZTogMTRweDsKICAgIGxpbmUtaGVpZ2h0OiAxLjQ7Cn0KCi5tanItaGlzdG9yeS1pdGVtLWNvbnRlbnQgewogICAgbWluLXdpZHRoOiAwOwogICAgZGlzcGxheTogZ3JpZDsKICAgIGdhcDogNHB4Owp9CgoubWpyLWhpc3RvcnktaXRlbS1tc2cgewogICAgb3BhY2l0eTogMC45MjsKICAgIHdoaXRlLXNwYWNlOiBwcmUtd3JhcDsKICAgIG92ZXJmbG93LXdyYXA6IGFueXdoZXJlOwogICAgd29yZC1icmVhazogYnJlYWstd29yZDsKfQoKLm1qci1oaXN0b3J5LWl0ZW0tdGl0bGUgewogICAgZm9udC13ZWlnaHQ6IDYwMDsKICAgIGxpbmUtaGVpZ2h0OiAxLjQ7CiAgICBvcGFjaXR5OiAwLjk2OwogICAgd2hpdGUtc3BhY2U6IHByZS13cmFwOwogICAgb3ZlcmZsb3ctd3JhcDogYW55d2hlcmU7Cn0KCi5tanItaGlzdG9yeS1pdGVtLWRldGFpbCB7CiAgICBvcGFjaXR5OiAwLjg0OwogICAgbGluZS1oZWlnaHQ6IDEuNDU7CiAgICB3aGl0ZS1zcGFjZTogcHJlLXdyYXA7CiAgICBvdmVyZmxvdy13cmFwOiBhbnl3aGVyZTsKICAgIHdvcmQtYnJlYWs6IGJyZWFrLXdvcmQ7Cn0KCi5tanItaGlzdG9yeS1pdGVtLW1ldGEgewogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBnYXA6IDZweDsKICAgIGZsZXgtd3JhcDogd3JhcDsKfQoKLm1qci1oaXN0b3J5LWl0ZW0tdGltZSB7CiAgICBmb250LXNpemU6IDEwcHg7CiAgICBvcGFjaXR5OiAwLjUyOwp9CgoubWpyLWhpc3RvcnktaXRlbS1jaGlwIHsKICAgIGZvbnQtc2l6ZTogMTBweDsKICAgIGxpbmUtaGVpZ2h0OiAxOwogICAgcGFkZGluZzogMnB4IDZweDsKICAgIGJvcmRlci1yYWRpdXM6IDk5OXB4OwogICAgYm9yZGVyOiAxcHggc29saWQgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1ib3JkZXIpIDgyJSwgdHJhbnNwYXJlbnQpOwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTMsIHZhcigtLW1qci1zdXJmYWNlLTIpKSA3OCUsIHRyYW5zcGFyZW50KTsKICAgIG9wYWNpdHk6IDAuNzY7Cn0KCi5tanItaGlzdG9yeS1pdGVtLWFjdGlvbiB7CiAgICBmb250LXNpemU6IDExcHg7CiAgICB3aWR0aDogZml0LWNvbnRlbnQ7CiAgICBjb2xvcjogdmFyKC0tbWpyLWFjY2VudCwgIzVmYjNmZik7CiAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7Cn0KCi5tanItaGlzdG9yeS1pdGVtLWFjdGlvbjpob3ZlciB7CiAgICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKfQoKLm1qci1oaXN0b3J5LWl0ZW0tcHJvZ3Jlc3MgewogICAgZGlzcGxheTogZ3JpZDsKICAgIGdhcDogNHB4Owp9CgoubWpyLWhpc3RvcnktaXRlbS1wcm9ncmVzcy1zdW1tYXJ5IHsKICAgIGZvbnQtc2l6ZTogMTFweDsKICAgIG9wYWNpdHk6IDAuNzQ7CiAgICBsaW5lLWhlaWdodDogMS4zNTsKICAgIHdoaXRlLXNwYWNlOiBwcmUtd3JhcDsKICAgIG92ZXJmbG93LXdyYXA6IGFueXdoZXJlOwp9CgoubWpyLWhpc3RvcnktaXRlbS1wcm9ncmVzcy1iYXIgewogICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgd2lkdGg6IDEwMCU7CiAgICBoZWlnaHQ6IDZweDsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICBib3JkZXItcmFkaXVzOiA5OTlweDsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYm9yZGVyKSA3NSUsIHRyYW5zcGFyZW50KTsKfQoKLm1qci1oaXN0b3J5LWl0ZW0tcHJvZ3Jlc3MtZmlsbCB7CiAgICBoZWlnaHQ6IDEwMCU7CiAgICBib3JkZXItcmFkaXVzOiBpbmhlcml0OwogICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KAogICAgICAgIDkwZGVnLAogICAgICAgIHZhcigtLW1qci1hY2NlbnQsICM1ZmIzZmYpLAogICAgICAgIGNvbG9yLW1peChpbiBzcmdiLCAjNThjMDdkIDcyJSwgdmFyKC0tbWpyLWFjY2VudCwgIzVmYjNmZikpCiAgICApOwp9CgoubWpyLXNob3J0Y3V0LWd1aWRlIHsKICAgIGRpc3BsYXk6IGdyaWQ7CiAgICBnYXA6IDhweDsKfQoKLm1qci1zaG9ydGN1dC1ndWlkZS1pbnRybyB7CiAgICBmb250LXNpemU6IDEycHg7CiAgICBsaW5lLWhlaWdodDogMS40NTsKICAgIG9wYWNpdHk6IDAuODQ7Cn0KCi5tanItc2hvcnRjdXQtc2VjdGlvbiB7CiAgICBkaXNwbGF5OiBncmlkOwogICAgZ2FwOiA2cHg7CiAgICBwYWRkaW5nOiA4cHg7CiAgICBib3JkZXItcmFkaXVzOiAxMHB4OwogICAgYm9yZGVyOiAxcHggc29saWQgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1ib3JkZXIpIDg0JSwgdHJhbnNwYXJlbnQpOwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTMsIHZhcigtLW1qci1zdXJmYWNlLTIpKSA3MiUsIHRyYW5zcGFyZW50KTsKfQoKLm1qci1zaG9ydGN1dC1zZWN0aW9uLXRpdGxlIHsKICAgIGZvbnQtc2l6ZTogMTFweDsKICAgIGZvbnQtd2VpZ2h0OiA3MDA7CiAgICBsZXR0ZXItc3BhY2luZzogMC4wNGVtOwogICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKICAgIGNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tY29udGVudC1mZywgI2YxZjFmMSkgODglLCB0cmFuc3BhcmVudCk7Cn0KCi5tanItc2hvcnRjdXQtbGlzdCB7CiAgICBkaXNwbGF5OiBncmlkOwogICAgZ2FwOiA2cHg7Cn0KCi5tanItc2hvcnRjdXQtcm93IHsKICAgIGRpc3BsYXk6IGdyaWQ7CiAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IG1pbm1heCgxMzJweCwgMTYwcHgpIG1pbm1heCgwLCAxZnIpOwogICAgZ2FwOiA4cHg7CiAgICBhbGlnbi1pdGVtczogc3RhcnQ7Cn0KCi5tanItc2hvcnRjdXQta2V5IHsKICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgbWluLWhlaWdodDogMjRweDsKICAgIHBhZGRpbmc6IDNweCA4cHg7CiAgICBib3JkZXItcmFkaXVzOiA5OTlweDsKICAgIGJvcmRlcjogMXB4IHNvbGlkIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYWNjZW50KSAzOCUsIHZhcigtLW1qci1ib3JkZXIpKTsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYWNjZW50KSAxMiUsIHZhcigtLW1qci1zdXJmYWNlLTIpKTsKICAgIGNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tY29udGVudC1mZywgI2ZmZikgOTAlLCB0cmFuc3BhcmVudCk7CiAgICBmb250LXNpemU6IDExcHg7CiAgICBmb250LXdlaWdodDogNzAwOwogICAgbGluZS1oZWlnaHQ6IDEuMjU7CiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgICB3aGl0ZS1zcGFjZTogbm9ybWFsOwp9CgoubWpyLXNob3J0Y3V0LWRlc2MgewogICAgbWluLXdpZHRoOiAwOwogICAgZm9udC1zaXplOiAxMnB4OwogICAgbGluZS1oZWlnaHQ6IDEuNDsKICAgIG9wYWNpdHk6IDAuOTI7Cn0KCkBtZWRpYSAobWF4LXdpZHRoOiA1NjBweCkgewogICAgLm1qci1zaG9ydGN1dC1yb3cgewogICAgICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogMWZyOwogICAgfQoKICAgIC5tanItc2hvcnRjdXQta2V5IHsKICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtc3RhcnQ7CiAgICB9Cn0KCi5tanItZmlsdGVyLXBvcG92ZXIgLm1qci1maWx0ZXItaGVhZCB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGZsZXgtc3RhcnQ7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47CiAgICBnYXA6IDEwcHg7CiAgICBtYXJnaW46IDAgMCAxMHB4OwogICAgcGFkZGluZzogNHB4IDJweCAxMHB4OwogICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYm9yZGVyKSA4NSUsIHRyYW5zcGFyZW50KTsKfQoKLm1qci1maWx0ZXItcG9wb3ZlciAubWpyLWZpbHRlci1oZWFkLWxlZnQgewogICAgbWluLXdpZHRoOiAwOwp9CgoubWpyLWZpbHRlci1wb3BvdmVyIC5tanItZmlsdGVyLWtpY2tlciB7CiAgICBmb250LXNpemU6IDExcHg7CiAgICBmb250LXdlaWdodDogODAwOwogICAgbGV0dGVyLXNwYWNpbmc6IDAuMDllbTsKICAgIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7CiAgICBjb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQsICM1ZmIzZmYpIDY1JSwgdmFyKC0tY29udGVudC1mZywgI2RkZCkpOwp9CgoubWpyLWZpbHRlci1wb3BvdmVyIC5tanItZmlsdGVyLXN1YnRpdGxlIHsKICAgIG1hcmdpbi10b3A6IDJweDsKICAgIGZvbnQtc2l6ZTogMTFweDsKICAgIGNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tY29udGVudC1mZywgI2RkZCkgNjIlLCB2YXIoLS1tanItbXV0ZWQsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC42NSkpKTsKfQoKLm1qci1maWx0ZXItcG9wb3ZlciAubWpyLWZpbHRlci1oZWFkLWFjdGlvbnMgewogICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiA4cHg7CiAgICBmbGV4OiAwIDAgYXV0bzsKfQoKLm1qci1maWx0ZXItcG9wb3ZlciAubWpyLWZpbHRlci1zdGFjayB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgIGdhcDogOHB4Owp9CgoubWpyLWZpbHRlci1wb3BvdmVyIC5tanItZmlsdGVyLWFjdGl2ZS1jb3VudCB7CiAgICBtaW4td2lkdGg6IDIycHg7CiAgICBoZWlnaHQ6IDIycHg7CiAgICBwYWRkaW5nOiAwIDZweDsKICAgIGJvcmRlci1yYWRpdXM6IDk5OXB4OwogICAgYm9yZGVyOiAxcHggc29saWQgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQsICM1ZmIzZmYpIDU1JSwgdmFyKC0tbWpyLWJvcmRlcikpOwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQsICM1ZmIzZmYpIDE4JSwgdmFyKC0tbWpyLXN1cmZhY2UtMikpOwogICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICBmb250LXNpemU6IDExcHg7CiAgICBmb250LXdlaWdodDogNzAwOwogICAgbGluZS1oZWlnaHQ6IDE7CiAgICBjb2xvcjogdmFyKC0tY29udGVudC1mZywgI2ZmZik7Cn0KCi5tanItZmlsdGVyLXBvcG92ZXIgLm1qci1maWx0ZXItY2xlYXItYWxsIHsKICAgIGhlaWdodDogMjRweDsKICAgIHBhZGRpbmc6IDAgOHB4OwogICAgYm9yZGVyLXJhZGl1czogOTk5cHg7CiAgICBib3JkZXI6IDFweCBzb2xpZCBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWJvcmRlcikgNzUlLCB0cmFuc3BhcmVudCk7CiAgICBmb250LXNpemU6IDExcHg7CiAgICBmb250LXdlaWdodDogNzAwOwp9CgoubWpyLWZpbHRlci1wb3BvdmVyIC5tanItcG9wb3Zlci1yb3cgewogICAgZGlzcGxheTogZ3JpZDsKICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogMWZyOwogICAgZ2FwOiA4cHg7CiAgICBhbGlnbi1pdGVtczogc3RhcnQ7CiAgICBtYXJnaW4tYm90dG9tOiAxMHB4Owp9CgoubWpyLWZpbHRlci1wb3BvdmVyIC5tanItcG9wb3Zlci1yb3ctLTNjb2wgewogICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiBtaW5tYXgoMCwgMWZyKSBtaW5tYXgoMCwgMWZyKTsKfQoKLm1qci1maWx0ZXItcG9wb3ZlciAubWpyLXBvcG92ZXItcm93LS0zY29sIC5tanItcG9wb3Zlci1sYWJlbCB7CiAgICBncmlkLWNvbHVtbjogMSAvIC0xOwp9CgoubWpyLWZpbHRlci1wb3BvdmVyIC5tanItcG9wb3Zlci1sYWJlbCB7CiAgICBmb250LXNpemU6IDEycHg7CiAgICBmb250LXdlaWdodDogNjAwOwogICAgY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1jb250ZW50LWZnLCAjZGRkKSA3MCUsIHZhcigtLW1qci1tdXRlZCwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjY1KSkpOwogICAgd2hpdGUtc3BhY2U6IG5vcm1hbDsKfQoKLm1qci1maWx0ZXItcG9wb3ZlciAubWpyLXBvcG92ZXItdG9nZ2xlIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiA2cHg7CiAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICBmb250LXNpemU6IDEycHg7CiAgICBjb2xvcjogdmFyKC0tZmctY29sb3IsICNlNmVkZjcpOwogICAgcGFkZGluZzogNnB4IDhweDsKICAgIGJvcmRlci1yYWRpdXM6IDhweDsKICAgIGJvcmRlcjogMXB4IHNvbGlkIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYm9yZGVyKSA4MCUsIHRyYW5zcGFyZW50KTsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0yKSA2NiUsIHRyYW5zcGFyZW50KTsKfQoKLm1qci1maWx0ZXItcG9wb3ZlciAubWpyLXBvcG92ZXItdG9nZ2xlIGlucHV0W3R5cGU9ImNoZWNrYm94Il0gewogICAgYWNjZW50LWNvbG9yOiB2YXIoLS1tanItYWNjZW50LCB2YXIoLS1jb21meS1hY2NlbnQsICM1ZmIzZmYpKTsKfQoKLm1qci1maWx0ZXItcG9wb3ZlciAubWpyLWZpbHRlci1ncm91cCB7CiAgICAtLW1qci1maWx0ZXItZ3JvdXAtYWNjZW50OiB2YXIoLS1tanItYWNjZW50LCAjN2FhMmZmKTsKICAgIHBhZGRpbmc6IDEwcHggMCA4cHg7CiAgICBtYXJnaW4tYm90dG9tOiA0cHg7CiAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgdmFyKC0tbWpyLWJvcmRlciwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEyKSk7Cn0KCi5tanItZmlsdGVyLXBvcG92ZXIgLm1qci1maWx0ZXItZ3JvdXA6bGFzdC1jaGlsZCB7CiAgICBtYXJnaW4tYm90dG9tOiAwOwogICAgYm9yZGVyLWJvdHRvbTogbm9uZTsKICAgIHBhZGRpbmctYm90dG9tOiAycHg7Cn0KCi5tanItZmlsdGVyLXBvcG92ZXIgLm1qci1maWx0ZXItZ3JvdXAtLWNvcmUgewogICAgLS1tanItZmlsdGVyLWdyb3VwLWFjY2VudDogIzU2YThmZjsKfQoKLm1qci1maWx0ZXItcG9wb3ZlciAubWpyLWZpbHRlci1ncm91cC0tbWVkaWEgewogICAgLS1tanItZmlsdGVyLWdyb3VwLWFjY2VudDogIzM1ZDA4YjsKfQoKLm1qci1maWx0ZXItcG9wb3ZlciAubWpyLWZpbHRlci1ncm91cC0tdGltZSB7CiAgICAtLW1qci1maWx0ZXItZ3JvdXAtYWNjZW50OiAjZjBiODRmOwp9CgoubWpyLWZpbHRlci1wb3BvdmVyIC5tanItZmlsdGVyLWdyb3VwLXRvZ2dsZSB7CiAgICB3aWR0aDogMTAwJTsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOwogICAgZ2FwOiAxMHB4OwogICAgbWFyZ2luOiAwIDAgMTBweDsKICAgIGJvcmRlcjogMDsKICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50OwogICAgY29sb3I6IGluaGVyaXQ7CiAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICB0ZXh0LWFsaWduOiBsZWZ0OwogICAgYm9yZGVyLXJhZGl1czogOHB4OwogICAgcGFkZGluZzogMnB4IDRweDsKfQoKLm1qci1maWx0ZXItcG9wb3ZlciAubWpyLWZpbHRlci1ncm91cC10aXRsZSB7CiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBnYXA6IDZweDsKICAgIGNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWZpbHRlci1ncm91cC1hY2NlbnQpIDYyJSwgdmFyKC0tY29udGVudC1mZywgI2RkZCkpOwogICAgZm9udC1zaXplOiAxMXB4OwogICAgZm9udC13ZWlnaHQ6IDcwMDsKICAgIGxldHRlci1zcGFjaW5nOiAwLjA4ZW07CiAgICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOwp9CgoubWpyLWZpbHRlci1wb3BvdmVyIC5tanItZmlsdGVyLWdyb3VwLXRpdGxlOjpiZWZvcmUgewogICAgY29udGVudDogIiI7CiAgICB3aWR0aDogNnB4OwogICAgaGVpZ2h0OiA2cHg7CiAgICBmbGV4OiAwIDAgNnB4OwogICAgYm9yZGVyLXJhZGl1czogOTk5cHg7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1tanItZmlsdGVyLWdyb3VwLWFjY2VudCk7Cn0KCi5tanItZmlsdGVyLXBvcG92ZXIgLm1qci1maWx0ZXItZ3JvdXAtY2hldnJvbiB7CiAgICBmb250LXNpemU6IDEycHg7CiAgICBsaW5lLWhlaWdodDogMTsKICAgIGNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWZpbHRlci1ncm91cC1hY2NlbnQpIDc4JSwgdmFyKC0tbWpyLW11dGVkLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNjUpKSk7Cn0KCi5tanItZmlsdGVyLXBvcG92ZXIgLm1qci1maWx0ZXItZ3JvdXAtYm9keSB7CiAgICBwYWRkaW5nLXRvcDogNHB4Owp9CgoubWpyLWZpbHRlci1wb3BvdmVyIC5tanItZmlsdGVyLWNhcmQgewogICAgYm9yZGVyOiAxcHggc29saWQgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1ib3JkZXIpIDg4JSwgdHJhbnNwYXJlbnQpOwogICAgYm9yZGVyLXJhZGl1czogMTBweDsKICAgIHBhZGRpbmc6IDEwcHg7CiAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoCiAgICAgICAgMTgwZGVnLAogICAgICAgIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0yKSA4NiUsIHRyYW5zcGFyZW50KSwKICAgICAgICBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMSkgODglLCB0cmFuc3BhcmVudCkKICAgICk7CiAgICBtYXJnaW4tYm90dG9tOiA4cHg7Cn0KCi5tanItZmlsdGVyLXBvcG92ZXIgLm1qci1maWx0ZXItY2FyZDpsYXN0LWNoaWxkIHsKICAgIG1hcmdpbi1ib3R0b206IDA7Cn0KCi5tanItZmlsdGVyLXBvcG92ZXIgLm1qci1maWx0ZXItY2FyZC0tYWdlbmRhIHsKICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgKICAgICAgICAxODBkZWcsCiAgICAgICAgY29sb3ItbWl4KGluIHNyZ2IsICNmMGI4NGYgOSUsIHZhcigtLW1qci1zdXJmYWNlLTIpKSwKICAgICAgICBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMSkgOTIlLCB0cmFuc3BhcmVudCkKICAgICk7Cn0KCi5tanItZmlsdGVyLXBvcG92ZXIgLm1qci1maWx0ZXItZ3JvdXA6bm90KC5pcy1vcGVuKSB7CiAgICBwYWRkaW5nLWJvdHRvbTogOHB4Owp9CgoubWpyLWZpbHRlci1wb3BvdmVyIC5tanItZmlsdGVyLWdyb3VwOm5vdCguaXMtb3BlbikgLm1qci1maWx0ZXItZ3JvdXAtdG9nZ2xlIHsKICAgIG1hcmdpbi1ib3R0b206IDA7Cn0KCkBtZWRpYSAobWF4LXdpZHRoOiA0NDBweCkgewogICAgLm1qci1maWx0ZXItcG9wb3ZlciAubWpyLWZpbHRlci1oZWFkIHsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICAgIGFsaWduLWl0ZW1zOiBzdHJldGNoOwogICAgfQoKICAgIC5tanItZmlsdGVyLXBvcG92ZXIgLm1qci1maWx0ZXItaGVhZC1hY3Rpb25zIHsKICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47CiAgICB9Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hbS1oZWFkZXItaWNvbiB7CiAgICBmb250LXNpemU6IDE2cHg7CiAgICBsaW5lLWhlaWdodDogMTsKICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgb3BhY2l0eTogMC45Owp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYW0taGVhZGVyLXRpdGxlIHsKICAgIG1hcmdpbjogMDsKICAgIGZvbnQtc2l6ZTogMTNweDsKICAgIGZvbnQtd2VpZ2h0OiA3MDA7CiAgICBsZXR0ZXItc3BhY2luZzogMC4wMWVtOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYW0tY29udGVudCB7CiAgICBmbGV4OiAxOwogICAgcGFkZGluZzogMTZweDsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgIG1pbi1oZWlnaHQ6IDA7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1mb2xkZXItYnJlYWRjcnVtYiB7CiAgICAtLW1qci1icmVhZGNydW1iLWFjY2VudDogIzU2YThmZjsKICAgIC0tbWpyLWJyZWFkY3J1bWItY3VycmVudDogIzM1ZDA4YjsKICAgIGRpc3BsYXk6IG5vbmU7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiA0cHg7CiAgICBwYWRkaW5nOiAzcHggNnB4OwogICAgbWFyZ2luOiAxcHggMCAzcHg7CiAgICBmb250LXNpemU6IDExcHg7CiAgICBvcGFjaXR5OiAwLjc4OwogICAgb3ZlcmZsb3c6IGF1dG87CiAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgYm9yZGVyLXJhZGl1czogOHB4OwogICAgYm9yZGVyOiAxcHggc29saWQgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1icmVhZGNydW1iLWFjY2VudCkgMjIlLCB0cmFuc3BhcmVudCk7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWJyZWFkY3J1bWItYWNjZW50KSA5JSwgdHJhbnNwYXJlbnQpOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItZm9sZGVyLWJyZWFkY3J1bWIuaXMtdmlzaWJsZSB7CiAgICBkaXNwbGF5OiBmbGV4Owp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItZm9sZGVyLWJyZWFkY3J1bWItYWN0aW9uIHsKICAgIHBhZGRpbmc6IDJweCA4cHg7CiAgICBib3JkZXI6IDFweCBzb2xpZCBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWJyZWFkY3J1bWItYWNjZW50KSA0MiUsIHRyYW5zcGFyZW50KTsKICAgIGJvcmRlci1yYWRpdXM6IDZweDsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYnJlYWRjcnVtYi1hY2NlbnQpIDE2JSwgdHJhbnNwYXJlbnQpOwogICAgY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYnJlYWRjcnVtYi1hY2NlbnQpIDc4JSwgI2ZmZmZmZik7CiAgICBmb250OiBpbmhlcml0OwogICAgY3Vyc29yOiBwb2ludGVyOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItZm9sZGVyLWJyZWFkY3J1bWItYWN0aW9uOmRpc2FibGVkIHsKICAgIGN1cnNvcjogZGVmYXVsdDsKICAgIG9wYWNpdHk6IDAuNTg7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1mb2xkZXItYnJlYWRjcnVtYi1hY3Rpb246bm90KDpkaXNhYmxlZCk6aG92ZXIgewogICAgYm9yZGVyLWNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWJyZWFkY3J1bWItYWNjZW50KSA2MiUsIHRyYW5zcGFyZW50KTsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYnJlYWRjcnVtYi1hY2NlbnQpIDI0JSwgdHJhbnNwYXJlbnQpOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItZm9sZGVyLWJyZWFkY3J1bWItc2VnbWVudCB7CiAgICBtYXgtd2lkdGg6IDIyMHB4OwogICAgbWluLXdpZHRoOiAwOwogICAgcGFkZGluZzogMXB4IDVweDsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHRyYW5zcGFyZW50OwogICAgYm9yZGVyLXJhZGl1czogNXB4OwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1icmVhZGNydW1iLWFjY2VudCkgOCUsIHRyYW5zcGFyZW50KTsKICAgIGNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWJyZWFkY3J1bWItYWNjZW50KSA3NiUsICNmZmZmZmYpOwogICAgZm9udDogaW5oZXJpdDsKICAgIGN1cnNvcjogcG9pbnRlcjsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWZvbGRlci1icmVhZGNydW1iLXNlZ21lbnQ6bm90KDpkaXNhYmxlZCk6aG92ZXIgewogICAgYm9yZGVyLWNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWJyZWFkY3J1bWItYWNjZW50KSAzOCUsIHRyYW5zcGFyZW50KTsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYnJlYWRjcnVtYi1hY2NlbnQpIDE2JSwgdHJhbnNwYXJlbnQpOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItZm9sZGVyLWJyZWFkY3J1bWItc2VnbWVudC5pcy1jdXJyZW50LAoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItZm9sZGVyLWJyZWFkY3J1bWItc2VnbWVudDpkaXNhYmxlZCB7CiAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYnJlYWRjcnVtYi1jdXJyZW50KSAzOCUsIHRyYW5zcGFyZW50KTsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYnJlYWRjcnVtYi1jdXJyZW50KSAxNCUsIHRyYW5zcGFyZW50KTsKICAgIGNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWJyZWFkY3J1bWItY3VycmVudCkgNzQlLCAjZmZmZmZmKTsKICAgIGN1cnNvcjogZGVmYXVsdDsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWZvbGRlci1icmVhZGNydW1iLXNlcGFyYXRvciB7CiAgICBjb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1icmVhZGNydW1iLWFjY2VudCkgNTglLCB2YXIoLS1tanItbXV0ZWQsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC42MikpKTsKICAgIG9wYWNpdHk6IDAuOTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLW1lZGlhLXNob3J0Y3V0cyB7CiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBnYXA6IDRweDsKICAgIGZsZXgtd3JhcDogd3JhcDsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLW1lZGlhLXNob3J0Y3V0LWJ0biB7CiAgICB3aWR0aDogMjRweDsKICAgIGhlaWdodDogMjRweDsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLW1lZGlhLXNob3J0Y3V0LWJ0biAucGkgewogICAgZm9udC1zaXplOiAxMXB4Owp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYW0tZHVwLWFsZXJ0IHsKICAgIHBhZGRpbmc6IDJweCA4cHg7CiAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXItY29sb3IsICM1NTUpOwogICAgYmFja2dyb3VuZDogdmFyKC0tY29tZnktbWVudS1iZywgIzIyMik7CiAgICBjb2xvcjogdmFyKC0taW5wdXQtdGV4dCwgI2VlZSk7CiAgICBib3JkZXItcmFkaXVzOiA5OTlweDsKICAgIGN1cnNvcjogcG9pbnRlcjsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFtLWJyb3dzZSB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IHN0cmV0Y2g7CiAgICBmbGV4OiAxOwogICAgbWluLWhlaWdodDogMDsKICAgIG1pbi13aWR0aDogMDsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICBib3JkZXItdG9wOiAxcHggc29saWQgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1ib3JkZXIpIDc1JSwgdHJhbnNwYXJlbnQpOwogICAgcGFkZGluZy10b3A6IDRweDsKfQoKLyogU2Nyb2xsYmFycyAobWF0Y2ggQ29tZnlVSSBmZWVsKSAqLwoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYW0tZ3JpZC1zY3JvbGwgewogICAgZmxleDogMSAxIGF1dG87CiAgICBtaW4td2lkdGg6IDA7CiAgICBtaW4taGVpZ2h0OiAwOwogICAgaGVpZ2h0OiAxMDAlOwogICAgb3ZlcmZsb3c6IGF1dG87CiAgICBvdmVyc2Nyb2xsLWJlaGF2aW9yOiBjb250YWluOwogICAgLXdlYmtpdC1vdmVyZmxvdy1zY3JvbGxpbmc6IHRvdWNoOwogICAgdG91Y2gtYWN0aW9uOiBwYW4teTsKICAgIHNjcm9sbGJhci13aWR0aDogdGhpbjsKICAgIHNjcm9sbGJhci1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1ib3JkZXIpIDg1JSwgdmFyKC0tY29udGVudC1mZywgI2RkZCkpIHRyYW5zcGFyZW50Owp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYW0tZ3JpZC1zY3JvbGw6Oi13ZWJraXQtc2Nyb2xsYmFyIHsKICAgIHdpZHRoOiAxMHB4OwogICAgaGVpZ2h0OiAxMHB4Owp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYW0tZ3JpZC1zY3JvbGw6Oi13ZWJraXQtc2Nyb2xsYmFyLXRyYWNrIHsKICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50Owp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYW0tZ3JpZC1zY3JvbGw6Oi13ZWJraXQtc2Nyb2xsYmFyLXRodW1iIHsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0yKSA1NSUsIHZhcigtLWNvbnRlbnQtZmcsICNkZGQpKTsKICAgIGJvcmRlcjogMnB4IHNvbGlkIHRyYW5zcGFyZW50OwogICAgYmFja2dyb3VuZC1jbGlwOiBwYWRkaW5nLWJveDsKICAgIGJvcmRlci1yYWRpdXM6IDk5OXB4Owp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYW0tZ3JpZC1zY3JvbGw6aG92ZXI6Oi13ZWJraXQtc2Nyb2xsYmFyLXRodW1iIHsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0yKSA3MCUsIHZhcigtLWNvbnRlbnQtZmcsICNkZGQpKTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFtLWdyaWQtc2Nyb2xsOjotd2Via2l0LXNjcm9sbGJhci1jb3JuZXIgewogICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hbS1jdXN0b20tY29udHJvbHMgewogICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICBmbGV4OiAxOwogICAgbWluLXdpZHRoOiAwOwogICAgZ2FwOiA4cHg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBmbGV4LWVuZDsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFtLXNlYXJjaCB7CiAgICBtYXJnaW4tYm90dG9tOiA4cHg7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogMTBweDsKICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFtLXNlYXJjaCB7CiAgICBwYWRkaW5nLWJvdHRvbTogNnB4OwogICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHZhcigtLW1qci1ib3JkZXIpOwogICAgbWFyZ2luLWJvdHRvbTogNnB4Owp9CgovKiBDYXJkIE1ldGFkYXRhIENvbG9ycyAqLwoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItbWV0YS1kdXJhdGlvbiB7CiAgICBjb2xvcjogI2ZmYTcyNjsgLyogT3JhbmdlIGZvciBkdXJhdGlvbiAqLwogICAgZm9udC13ZWlnaHQ6IDUwMDsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLW1ldGEtcmVzIHsKICAgIGNvbG9yOiAjNGZjM2Y3OyAvKiBMaWdodCBCbHVlIGZvciByZXNvbHV0aW9uICovCiAgICBmb250LXdlaWdodDogNTAwOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItbWV0YS1kYXRlIHsKICAgIGNvbG9yOiAjYjlmNmNhOyAvKiBQYWxlIEdyZWVuIGZvciBkYXRlICovCiAgICBmb250LXNpemU6IDAuOWVtOwogICAgZm9udC13ZWlnaHQ6IDUwMDsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLW1ldGEtdGltZSB7CiAgICBjb2xvcjogdmFyKC0tbWpyLW11dGVkLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNjUpKTsKICAgIGZvbnQtc2l6ZTogMC45ZW07Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hbS1zdW1tYXJ5IHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOwogICAgZ2FwOiAxMHB4OwogICAgbWFyZ2luOiAwIDAgNnB4IDA7CiAgICBwYWRkaW5nOiAwIDAgNHB4IDA7CiAgICBtaW4taGVpZ2h0OiAxNnB4OwogICAgZm9udC1zaXplOiAxMXB4OwogICAgY29sb3I6IHZhcigtLW1qci1tdXRlZCwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjY1KSk7CiAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1ib3JkZXIpIDY1JSwgdHJhbnNwYXJlbnQpOwogICAgZmxleDogMCAwIGF1dG87Cn0KCi8qIFRvYXN0cyAoZ2xvYmFsOiBjYW4gYmUgbW91bnRlZCB1bmRlciBkb2N1bWVudC5ib2R5KSAqLwoubWpyLXRvYXN0LWNvbnRhaW5lciB7CiAgICBwb3NpdGlvbjogZml4ZWQ7CiAgICB0b3A6IDE2cHg7CiAgICBsZWZ0OiA1MCU7CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLTUwJSk7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBnYXA6IDEwcHg7CiAgICB6LWluZGV4OiAxMDAwMDAxOwogICAgcG9pbnRlci1ldmVudHM6IG5vbmU7Cn0KCi5tanItdG9hc3QgewogICAgLS1tanItdG9hc3Qtc3RyaXA6IHZhcigtLW1qci1zdGF0dXMtaW5mbywgdmFyKC0tY29tZnktc3RhdHVzLWluZm8sICMyMTk2ZjMpKTsKICAgIC0tbWpyLXRvYXN0LWljb24tY29sb3I6IHZhcigtLW1qci1zdGF0dXMtaW5mbywgdmFyKC0tY29tZnktc3RhdHVzLWluZm8sICMyMTk2ZjMpKTsKICAgIGJhY2tncm91bmQ6IHZhcigtLWNvbWZ5LW1lbnUtYmcsICMyYTJhMmEpOwogICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyLWNvbG9yLCAjM2EzYTNhKTsKICAgIGJvcmRlci1sZWZ0OiA0cHggc29saWQgdmFyKC0tbWpyLXRvYXN0LXN0cmlwKTsKICAgIGJvcmRlci1yYWRpdXM6IDRweDsKICAgIHBhZGRpbmc6IDEycHggMTZweDsKICAgIGNvbG9yOiB2YXIoLS1mZy1jb2xvciwgI2VmZWZlZik7CiAgICBmb250LWZhbWlseTogdmFyKAogICAgICAgIC0tY29tZnktZm9udCwKICAgICAgICB1aS1zYW5zLXNlcmlmLAogICAgICAgIHN5c3RlbS11aSwKICAgICAgICAtYXBwbGUtc3lzdGVtLAogICAgICAgICJTZWdvZSBVSSIsCiAgICAgICAgUm9ib3RvLAogICAgICAgIEFyaWFsLAogICAgICAgIHNhbnMtc2VyaWYKICAgICk7CiAgICBmb250LXNpemU6IDE0cHg7CiAgICBib3gtc2hhZG93OiAwIDRweCAxNnB4IHJnYmEoMCwgMCwgMCwgMC41KTsKICAgIG9wYWNpdHk6IDA7CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTE1cHgpOwogICAgdHJhbnNpdGlvbjoKICAgICAgICBvcGFjaXR5IDAuMnMgZWFzZS1vdXQsCiAgICAgICAgdHJhbnNmb3JtIDAuMnMgZWFzZS1vdXQ7CiAgICBwb2ludGVyLWV2ZW50czogYXV0bzsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiAxMnB4OwogICAgd2hpdGUtc3BhY2U6IHByZS13cmFwOwogICAgd2lkdGg6IG1heC1jb250ZW50OwogICAgbWluLXdpZHRoOiBtaW4oMjUwcHgsIGNhbGMoMTAwdncgLSAyNHB4KSk7CiAgICBtYXgtd2lkdGg6IG1pbig0MDBweCwgY2FsYygxMDB2dyAtIDI0cHgpKTsKICAgIGJhY2tkcm9wLWZpbHRlcjogYmx1cig0cHgpOwogICAgY3Vyc29yOiBkZWZhdWx0OwogICAgdXNlci1zZWxlY3Q6IG5vbmU7Cn0KCi5tanItdG9hc3QuaXMtdmlzaWJsZSB7CiAgICBvcGFjaXR5OiAxOwogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDApOwp9CgoubWpyLXRvYXN0LXRleHQgewogICAgZmxleDogMTsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiA4cHg7Cn0KCi8qIFRvYXN0IGljb24gc3R5bGluZyAqLwoubWpyLXRvYXN0LXRleHQ6OmJlZm9yZSB7CiAgICBjb250ZW50OiBhdHRyKGRhdGEtaWNvbik7CiAgICBmb250LXNpemU6IDE2cHg7CiAgICBmb250LXdlaWdodDogYm9sZDsKICAgIGNvbG9yOiB2YXIoLS1tanItdG9hc3QtaWNvbi1jb2xvcik7CiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgIG1pbi13aWR0aDogMTZweDsKfQoKLm1qci10b2FzdC1zdWNjZXNzIHsKICAgIC0tbWpyLXRvYXN0LXN0cmlwOiB2YXIoLS1tanItc3RhdHVzLXN1Y2Nlc3MsIHZhcigtLWNvbWZ5LXN0YXR1cy1zdWNjZXNzLCAjNGNhZjUwKSk7CiAgICAtLW1qci10b2FzdC1pY29uLWNvbG9yOiB2YXIoLS1tanItc3RhdHVzLXN1Y2Nlc3MsIHZhcigtLWNvbWZ5LXN0YXR1cy1zdWNjZXNzLCAjNGNhZjUwKSk7Cn0KCi5tanItdG9hc3QtZXJyb3IgewogICAgLS1tanItdG9hc3Qtc3RyaXA6IHZhcigtLW1qci1zdGF0dXMtZXJyb3IsIHZhcigtLWNvbWZ5LXN0YXR1cy1lcnJvciwgI2Y0NDMzNikpOwogICAgLS1tanItdG9hc3QtaWNvbi1jb2xvcjogdmFyKC0tbWpyLXN0YXR1cy1lcnJvciwgdmFyKC0tY29tZnktc3RhdHVzLWVycm9yLCAjZjQ0MzM2KSk7Cn0KCi5tanItdG9hc3Qtd2FybmluZyB7CiAgICAtLW1qci10b2FzdC1zdHJpcDogdmFyKC0tbWpyLXN0YXR1cy13YXJuaW5nLCB2YXIoLS1jb21meS1zdGF0dXMtd2FybmluZywgI2ZmYTcyNikpOwogICAgLS1tanItdG9hc3QtaWNvbi1jb2xvcjogdmFyKC0tbWpyLXN0YXR1cy13YXJuaW5nLCB2YXIoLS1jb21meS1zdGF0dXMtd2FybmluZywgI2ZmYTcyNikpOwp9CgoubWpyLXRvYXN0LWluZm8gewogICAgLS1tanItdG9hc3Qtc3RyaXA6IHZhcigtLW1qci1zdGF0dXMtaW5mbywgdmFyKC0tY29tZnktc3RhdHVzLWluZm8sICMyMTk2ZjMpKTsKICAgIC0tbWpyLXRvYXN0LWljb24tY29sb3I6IHZhcigtLW1qci1zdGF0dXMtaW5mbywgdmFyKC0tY29tZnktc3RhdHVzLWluZm8sICMyMTk2ZjMpKTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFtLXN1bW1hcnktdGV4dCB7CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7CiAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYW0tc3VtbWFyeS1yaWdodCB7CiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBnYXA6IDZweDsKICAgIG1pbi13aWR0aDogMDsKICAgIGZsZXgtd3JhcDogd3JhcDsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFtLWNvbnRleHQtcGlsbHMgewogICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiA1cHg7CiAgICByb3ctZ2FwOiA0cHg7CiAgICBmbGV4LXdyYXA6IHdyYXA7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtZW5kOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItY29udGV4dC1waWxsIHsKICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogNnB4OwogICAgcGFkZGluZzogM3B4IDdweDsKICAgIGJvcmRlci1yYWRpdXM6IDk5OXB4OwogICAgYm9yZGVyOiAxcHggc29saWQgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQpIDU1JSwgdmFyKC0tbWpyLWJvcmRlcikpOwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTIpIDU1JSwgdmFyKC0tbWpyLWFjY2VudCkgMTAlKTsKICAgIGJveC1zaGFkb3c6IDAgMCAwIDFweCBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWFjY2VudCkgMTglLCB0cmFuc3BhcmVudCk7CiAgICBjb2xvcjogdmFyKC0tY29udGVudC1mZywgI2RkZCk7CiAgICBmb250LXNpemU6IDEwLjVweDsKICAgIGxpbmUtaGVpZ2h0OiAxOwogICAgbWluLWhlaWdodDogMjJweDsKICAgIG1heC13aWR0aDogMjIwcHg7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1jb250ZXh0LXBpbGw6aG92ZXIgewogICAgYm9yZGVyLWNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWFjY2VudCkgNzUlLCB2YXIoLS1tanItYm9yZGVyKSk7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMikgNTAlLCB2YXIoLS1tanItYWNjZW50KSAxNCUpOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItY29udGV4dC1waWxsLXRleHQgewogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgIG9wYWNpdHk6IDAuOTI7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1jb250ZXh0LXBpbGwteCB7CiAgICB3aWR0aDogMjBweDsKICAgIGhlaWdodDogMjBweDsKICAgIHBhZGRpbmc6IDA7CiAgICBib3JkZXI6IDFweCBzb2xpZCBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWJvcmRlcikgNzUlLCB0cmFuc3BhcmVudCk7CiAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsKICAgIGJvcmRlci1yYWRpdXM6IDk5OXB4OwogICAgY29sb3I6IHZhcigtLW1qci1tdXRlZCwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjY1KSk7CiAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICBsaW5lLWhlaWdodDogMTsKICAgIGZvbnQtc2l6ZTogMTRweDsKICAgIGZvbnQtZmFtaWx5OiBpbmhlcml0OwogICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICB0cmFuc2l0aW9uOgogICAgICAgIGJhY2tncm91bmQtY29sb3IgMTIwbXMgZWFzZSwKICAgICAgICBib3JkZXItY29sb3IgMTIwbXMgZWFzZTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWNvbnRleHQtcGlsbC14OmhvdmVyIHsKICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQpIDU1JSwgdmFyKC0tbWpyLWJvcmRlcikpOwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTIpIDcwJSwgdmFyKC0tbWpyLWFjY2VudCkgMTAlKTsKICAgIGNvbG9yOiB2YXIoLS1jb250ZW50LWZnLCAjZmZmKTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFtLXNlYXJjaC1waWxsIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiAxMHB4OwogICAgaGVpZ2h0OiAxLjc1cmVtOwogICAgcGFkZGluZzogMCAxMHB4OwogICAgd2lkdGg6IDEwMCU7CiAgICBtYXgtd2lkdGg6IG5vbmU7CiAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1yYWRpdXMtbGcsIDAuNXJlbSk7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1jb21meS1pbnB1dC1iZywgcmdiYSgwLCAwLCAwLCAwLjI1KSk7CiAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1tanItYm9yZGVyKTsKICAgIGZsZXg6IDEgMSBhdXRvOwogICAgbWluLXdpZHRoOiAwOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYW0tc2VhcmNoLXRvb2xzIHsKICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogOHB4OwogICAgZmxleDogMCAwIGF1dG87Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1wb3BvdmVyLWFuY2hvciB7CiAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7Cn0KCi5tanItYWdlbmRhLWlucHV0IHsKICAgIGRpc3BsYXk6IG5vbmU7CiAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1tanItYm9yZGVyKTsKICAgIGJhY2tncm91bmQ6IHZhcigtLWNvbWZ5LWlucHV0LWJnLCByZ2JhKDAsIDAsIDAsIDAuMjUpKTsKICAgIGNvbG9yOiB2YXIoLS1pbnB1dC10ZXh0LCAjZGRkKTsKICAgIHRyYW5zaXRpb246CiAgICAgICAgYmFja2dyb3VuZC1jb2xvciAwLjJzIGVhc2UsCiAgICAgICAgY29sb3IgMC4ycyBlYXNlLAogICAgICAgIGJvcmRlci1jb2xvciAwLjJzIGVhc2U7Cn0KLm1qci1hZ2VuZGEtaW5wdXQubWpyLWFnZW5kYS1maWxsZWQgewogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KAogICAgICAgIGluIHNyZ2IsCiAgICAgICAgdmFyKC0tbWpyLWFjY2VudCwgdmFyKC0tY29tZnktYWNjZW50LCAjNWZiM2ZmKSkgNDAlLAogICAgICAgIHZhcigtLW1qci1zdXJmYWNlLTIpIDYwJQogICAgKTsKICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KAogICAgICAgIGluIHNyZ2IsCiAgICAgICAgdmFyKC0tbWpyLWFjY2VudCwgdmFyKC0tY29tZnktYWNjZW50LCAjNWZiM2ZmKSkgODAlLAogICAgICAgIHZhcigtLW1qci1ib3JkZXIpCiAgICApOwogICAgY29sb3I6IHZhcigtLWNvbnRlbnQtZmcsICNmZmYpOwp9Ci5tanItYWdlbmRhLWlucHV0Lm1qci1hZ2VuZGEtZW1wdHkgewogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTIpIDg1JSwgdHJhbnNwYXJlbnQgMTUlKTsKICAgIGJvcmRlci1jb2xvcjogdmFyKC0tbWpyLWJvcmRlcik7CiAgICBjb2xvcjogdmFyKC0tbWpyLW11dGVkLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNjUpKTsKfQoKLm1qci1hZ2VuZGEtY29udGFpbmVyIHsKICAgIHdpZHRoOiAxMDAlOwp9CgoubWpyLWFnZW5kYS1jYWxlbmRhciB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgIGdhcDogOHB4OwogICAgd2lkdGg6IDEwMCU7CiAgICBtaW4td2lkdGg6IDA7Cn0KCi5tanItYWdlbmRhLWhlYWRlciB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogOHB4Owp9CgoubWpyLWFnZW5kYS1tb250aCB7CiAgICBmbGV4OiAxOwogICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgZm9udC13ZWlnaHQ6IDYwMDsKICAgIGZvbnQtc2l6ZTogMTJweDsKICAgIGNvbG9yOiB2YXIoLS1jb250ZW50LWZnLCAjZGRkKTsKICAgIHVzZXItc2VsZWN0OiBub25lOwp9CgoubWpyLWFnZW5kYS1uYXYgewogICAgd2lkdGg6IDMycHg7CiAgICBoZWlnaHQ6IDI4cHg7CiAgICBwYWRkaW5nOiAwOwogICAgYm9yZGVyLXJhZGl1czogMTBweDsKfQoKLm1qci1hZ2VuZGEtZ3JpZCB7CiAgICBkaXNwbGF5OiBncmlkOwogICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiByZXBlYXQoNywgbWlubWF4KDAsIDFmcikpOwogICAgZ2FwOiA2cHg7CiAgICB3aWR0aDogMTAwJTsKfQoKLm1qci1hZ2VuZGEtd2Vla2RheSB7CiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgICBmb250LXNpemU6IDExcHg7CiAgICBjb2xvcjogdmFyKC0tbWpyLW11dGVkLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNjUpKTsKICAgIHVzZXItc2VsZWN0OiBub25lOwp9CgoubWpyLWFnZW5kYS1kYXkgewogICAgaGVpZ2h0OiAzMHB4OwogICAgYm9yZGVyLXJhZGl1czogMTBweDsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLW1qci1ib3JkZXIpOwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTIpIDU1JSwgdHJhbnNwYXJlbnQpOwogICAgY29sb3I6IHZhcigtLWNvbnRlbnQtZmcsICNkZGQpOwogICAgY3Vyc29yOiBwb2ludGVyOwogICAgZm9udC1zaXplOiAxMnB4OwogICAgbGluZS1oZWlnaHQ6IDE7CiAgICBwYWRkaW5nOiAwOwogICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICB0cmFuc2l0aW9uOgogICAgICAgIGJhY2tncm91bmQtY29sb3IgMTIwbXMgZWFzZSwKICAgICAgICBib3JkZXItY29sb3IgMTIwbXMgZWFzZSwKICAgICAgICB0cmFuc2Zvcm0gODBtcyBlYXNlOwp9CgoubWpyLWFnZW5kYS1kYXktYmFkZ2UgewogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgdG9wOiAtNXB4OwogICAgcmlnaHQ6IC01cHg7CiAgICBtaW4td2lkdGg6IDE2cHg7CiAgICBoZWlnaHQ6IDE2cHg7CiAgICBwYWRkaW5nOiAwIDRweDsKICAgIGJvcmRlci1yYWRpdXM6IDk5OXB4OwogICAgYmFja2dyb3VuZDogI2U1MzkzNTsKICAgIGNvbG9yOiAjZmZmOwogICAgYm9yZGVyOiAxcHggc29saWQgY29sb3ItbWl4KGluIHNyZ2IsICNlNTM5MzUgNjUlLCAjZmZmZmZmIDM1JSk7CiAgICBmb250LXNpemU6IDEwcHg7CiAgICBmb250LXdlaWdodDogNzAwOwogICAgbGluZS1oZWlnaHQ6IDE0cHg7CiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7Cn0KCi5tanItYWdlbmRhLWRheTpob3ZlciB7CiAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peCgKICAgICAgICBpbiBzcmdiLAogICAgICAgIHZhcigtLW1qci1ib3JkZXIpIDU1JSwKICAgICAgICB2YXIoLS1tanItYWNjZW50LCB2YXIoLS1jb21meS1hY2NlbnQsICM1ZmIzZmYpKSA0NSUKICAgICk7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoCiAgICAgICAgaW4gc3JnYiwKICAgICAgICB2YXIoLS1tanItc3VyZmFjZS0yKSA0NSUsCiAgICAgICAgdmFyKC0tbWpyLWFjY2VudCwgdmFyKC0tY29tZnktYWNjZW50LCAjNWZiM2ZmKSkgMTAlCiAgICApOwp9CgoubWpyLWFnZW5kYS1kYXk6YWN0aXZlIHsKICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgxcHgpOwp9CgoubWpyLWFnZW5kYS1kYXktLWJsYW5rIHsKICAgIHZpc2liaWxpdHk6IGhpZGRlbjsKICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwp9CgoubWpyLWFnZW5kYS1kYXktLWhhcy1hc3NldHMgewogICAgYm9yZGVyLWNvbG9yOiBjb2xvci1taXgoCiAgICAgICAgaW4gc3JnYiwKICAgICAgICB2YXIoLS1tanItYWNjZW50LCB2YXIoLS1jb21meS1hY2NlbnQsICM1ZmIzZmYpKSA4MCUsCiAgICAgICAgdmFyKC0tbWpyLWJvcmRlcikKICAgICk7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoCiAgICAgICAgaW4gc3JnYiwKICAgICAgICB2YXIoLS1tanItYWNjZW50LCB2YXIoLS1jb21meS1hY2NlbnQsICM1ZmIzZmYpKSAxOCUsCiAgICAgICAgdmFyKC0tbWpyLXN1cmZhY2UtMikgODIlCiAgICApOwp9CgoubWpyLWFnZW5kYS1kYXktLXNlbGVjdGVkIHsKICAgIGJvcmRlci1jb2xvcjogdmFyKC0tbWpyLWFjY2VudCwgdmFyKC0tY29tZnktYWNjZW50LCAjNWZiM2ZmKSk7CiAgICBib3gtc2hhZG93OiAwIDAgMCAxcHgKICAgICAgICBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWFjY2VudCwgdmFyKC0tY29tZnktYWNjZW50LCAjNWZiM2ZmKSkgNTUlLCB0cmFuc3BhcmVudCk7Cn0KCi5tanItYWdlbmRhLWZvb3RlciB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZ2FwOiA4cHg7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47Cn0KCi5tanItYWdlbmRhLWNsZWFyLAoubWpyLWFnZW5kYS1yZWZyZXNoIHsKICAgIGZsZXg6IDE7Cn0KCi5tanItbWVudSwKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLW1lbnUgewogICAgZGlzcGxheTogZmxleDsKICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICBnYXA6IDRweDsKfQoKLm1qci1wcmltZS1tZW51LWxpc3QsCi5tanItc29ydC1tZW51IFtkYXRhLXBjLXNlY3Rpb249Imxpc3QiXSB7CiAgICBsaXN0LXN0eWxlOiBub25lOwogICAgbWFyZ2luOiAwOwogICAgcGFkZGluZzogMDsKICAgIGRpc3BsYXk6IGdyaWQ7CiAgICBnYXA6IDZweDsKfQoKLm1qci1wcmltZS1tZW51IFtkYXRhLXBjLXNlY3Rpb249Iml0ZW0iXSwKLm1qci1wcmltZS1tZW51LWxpc3QgW2RhdGEtcGMtc2VjdGlvbj0iaXRlbSJdIHsKICAgIGxpc3Qtc3R5bGU6IG5vbmU7Cn0KCi5tanItcHJpbWUtbWVudSBbZGF0YS1wYy1zZWN0aW9uPSJpdGVtY29udGVudCJdIHsKICAgIHdpZHRoOiAxMDAlOwp9CgoubWpyLW1lbnUtaXRlbSwKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLW1lbnUtaXRlbSB7CiAgICBhcHBlYXJhbmNlOiBub25lOwogICAgLXdlYmtpdC1hcHBlYXJhbmNlOiBub25lOwogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47CiAgICBnYXA6IDEwcHg7CiAgICB3aWR0aDogMTAwJTsKICAgIHBhZGRpbmc6IDhweCAxMHB4OwogICAgYm9yZGVyLXJhZGl1czogMTBweDsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHRyYW5zcGFyZW50OwogICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7CiAgICBjb2xvcjogdmFyKC0tY29udGVudC1mZywgI2RkZCk7CiAgICBmb250LWZhbWlseTogaW5oZXJpdDsKICAgIHRleHQtYWxpZ246IGxlZnQ7CiAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICB0cmFuc2l0aW9uOgogICAgICAgIGJhY2tncm91bmQtY29sb3IgMTIwbXMgZWFzZSwKICAgICAgICBib3JkZXItY29sb3IgMTIwbXMgZWFzZSwKICAgICAgICB0cmFuc2Zvcm0gODBtcyBlYXNlOwp9CgoubWpyLW1lbnUtaXRlbTpob3ZlciwKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLW1lbnUtaXRlbTpob3ZlciB7CiAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYm9yZGVyKSA4MCUsIHRyYW5zcGFyZW50KTsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0yKSA1NSUsIHRyYW5zcGFyZW50KTsKfQoKLm1qci1tZW51LWl0ZW06YWN0aXZlLAoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItbWVudS1pdGVtOmFjdGl2ZSB7CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoMXB4KTsKfQoKLm1qci1tZW51LWl0ZW0tbGFiZWwsCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1tZW51LWl0ZW0tbGFiZWwgewogICAgZmxleDogMSAxIGF1dG87CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7CiAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgbWluLXdpZHRoOiAwOwp9CgoubWpyLW1lbnUtaXRlbS1jaGVjaywKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLW1lbnUtaXRlbS1jaGVjayB7CiAgICBmb250LXNpemU6IDEycHg7CiAgICB3aWR0aDogMTZweDsKICAgIGZsZXg6IDAgMCAxNnB4OwogICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgb3BhY2l0eTogMDsKICAgIGNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWFjY2VudCkgNzIlLCB2YXIoLS1jb250ZW50LWZnKSk7CiAgICB0cmFuc2l0aW9uOgogICAgICAgIG9wYWNpdHkgMTIwbXMgZWFzZSwKICAgICAgICBjb2xvciAxMjBtcyBlYXNlOwp9CgoubWpyLW1lbnUtaXRlbSAucGksCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1tZW51LWl0ZW0gLnBpIHsKICAgIGZvbnQtc2l6ZTogMTNweDsKICAgIG9wYWNpdHk6IDAuOTsKfQoKLm1qci1jb2xsZWN0aW9ucy1tZW51IHsKICAgIGRpc3BsYXk6IGdyaWQ7CiAgICBnYXA6IDZweDsKfQoKLm1qci1tZW51LWl0ZW0tbGFiZWwtLWljb24gewogICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiA4cHg7CiAgICBmbGV4OiAxIDEgYXV0bzsKICAgIG1pbi13aWR0aDogMDsKfQoKLm1qci1tZW51LWl0ZW0tbGFiZWwtLWljb24gLnBpIHsKICAgIHdpZHRoOiAxNnB4OwogICAgZmxleDogMCAwIDE2cHg7CiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7Cn0KCi5tanItbWVudS1pdGVtLXJpZ2h0IHsKICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogMTBweDsKICAgIGZsZXg6IDAgMCBhdXRvOwogICAgbWluLXdpZHRoOiAxNnB4OwogICAgbWFyZ2luLWxlZnQ6IGF1dG87CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtZW5kOwp9CgoubWpyLW1lbnUtaXRlbS1oaW50IHsKICAgIGNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tY29udGVudC1mZykgNjIlLCB2YXIoLS1tanItbXV0ZWQpKTsKICAgIG9wYWNpdHk6IDAuNzI7CiAgICBmb250LXNpemU6IDExcHg7CiAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwp9CgoubWpyLW1lbnUtaXRlbS1jaGVjay0tdmlzaWJsZSwKLm1qci1tZW51LWl0ZW0uaXMtYWN0aXZlIC5tanItbWVudS1pdGVtLWNoZWNrIHsKICAgIG9wYWNpdHk6IDE7Cn0KCi5tanItbWVudS1kaXZpZGVyIHsKICAgIGhlaWdodDogMXB4OwogICAgbWFyZ2luOiA0cHggMDsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYm9yZGVyKSA4MCUsIHRyYW5zcGFyZW50KTsKfQoKLm1qci1tdXRlZCB7CiAgICBwYWRkaW5nOiAxMHB4IDEycHg7CiAgICBvcGFjaXR5OiAwLjc1Owp9CgoubWpyLXN0YXRlLWJsb2NrIHsKICAgIGZvbnQtc2l6ZTogMTBweDsKICAgIGxpbmUtaGVpZ2h0OiAxLjM1OwogICAgY29sb3I6IHZhcigtLW1qci1tdXRlZCk7CiAgICBib3JkZXI6IDFweCBkYXNoZWQgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1ib3JkZXIpIDg1JSwgdHJhbnNwYXJlbnQpOwogICAgYm9yZGVyLXJhZGl1czogdmFyKC0tbWpyLXItc20pOwogICAgcGFkZGluZzogOHB4IDEwcHg7CiAgICBtYXJnaW46IDRweCAwOwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTEpIDcwJSwgdHJhbnNwYXJlbnQpOwp9CgoubWpyLXN0YXRlLWJsb2NrLmlzLWVycm9yLAoubWpyLWNvbnRleHQtbWVudS1ub3RlLmlzLWVycm9yIHsKICAgIGNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN0YXR1cy1lcnJvcikgODIlLCB2YXIoLS1jb250ZW50LWZnKSk7CiAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3RhdHVzLWVycm9yKSA0NSUsIHZhcigtLW1qci1ib3JkZXIpKTsKfQoKLm1qci1jb2xsZWN0aW9uLXJvdyB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IHN0cmV0Y2g7CiAgICB3aWR0aDogMTAwJTsKICAgIG1pbi1oZWlnaHQ6IDQ4cHg7Cn0KCi5tanItY29sbGVjdGlvbnMtdmlydHVhbC1saXN0IHsKICAgIHdpZHRoOiAxMDAlOwogICAgb3ZlcmZsb3c6IGF1dG87CiAgICBzY3JvbGxiYXItd2lkdGg6IHRoaW47Cn0KCi5tanItZGVsZXRlLWJ0biB7CiAgICB3aWR0aDogNDJweDsKICAgIGZsZXg6IDAgMCA0MnB4OwogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICBwYWRkaW5nOiAwOwogICAgbWFyZ2luLWxlZnQ6IDZweDsKICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1ib3JkZXIpIDY1JSwgdmFyKC0tbWpyLXN0YXR1cy1lcnJvcikgNDUlKTsKfQoKLm1qci1kZWxldGUtYnRuOmhvdmVyOm5vdCg6ZGlzYWJsZWQpIHsKICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1ib3JkZXIpIDQwJSwgdmFyKC0tbWpyLXN0YXR1cy1lcnJvcikgNjUlKTsKfQoKLm1qci1kZWxldGUtYnRuIC5waSB7CiAgICBjb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdGF0dXMtZXJyb3IpIDc4JSwgdmFyKC0tY29udGVudC1mZykpOwp9CgoubWpyLXNlY3Rpb24tdGl0bGUgewogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBnYXA6IDZweDsKICAgIHBhZGRpbmc6IDZweCAxMHB4IDJweDsKICAgIGZvbnQtc2l6ZTogMTBweDsKICAgIGZvbnQtd2VpZ2h0OiA3MDA7CiAgICBsZXR0ZXItc3BhY2luZzogMC42cHg7CiAgICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOwogICAgb3BhY2l0eTogMC44ODsKICAgIGNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tY29udGVudC1mZykgNzIlLCB2YXIoLS1tanItbXV0ZWQpKTsKfQoKLm1qci1zZWN0aW9uLXRpdGxlLS1jeWFuIHsKICAgIGNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgIzZmZDRmZiA3OCUsIHZhcigtLWNvbnRlbnQtZmcpKTsKfQoKLm1qci1zZWN0aW9uLXRpdGxlLS12aW9sZXQgewogICAgY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCAjYzQ4ZGZmIDc4JSwgdmFyKC0tY29udGVudC1mZykpOwp9CgoubWpyLXNlY3Rpb24taGludCB7CiAgICBwYWRkaW5nOiAwIDEwcHggNHB4OwogICAgZm9udC1zaXplOiAxMHB4OwogICAgbGluZS1oZWlnaHQ6IDEuNDsKICAgIGNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tY29udGVudC1mZykgNTUlLCB2YXIoLS1tanItbXV0ZWQpKTsKfQoKLm1qci1tZW51LWl0ZW0tLXNtYXJ0LAoubWpyLW1lbnUtaXRlbS0tY2x1c3RlciB7CiAgICBib3JkZXItY29sb3I6IHRyYW5zcGFyZW50OwogICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7Cn0KCi5tanItbWVudS1pdGVtLS1jbHVzdGVyIHsKICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgY29sb3I6IHZhcigtLWNvbnRlbnQtZmcpOwp9CgoubWpyLW1lbnUtaXRlbS0tc21hcnQgLnBpIHsKICAgIGNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgIzZmZDRmZiA3NCUsIHZhcigtLWNvbnRlbnQtZmcpKTsKfQoKLm1qci1tZW51LWl0ZW0tLWNsdXN0ZXIgLnBpIHsKICAgIGNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgI2M0OGRmZiA3NCUsIHZhcigtLWNvbnRlbnQtZmcpKTsKfQoKLm1qci1tZW51LWl0ZW0tLXNtYXJ0OmhvdmVyOm5vdCg6ZGlzYWJsZWQpLAoubWpyLW1lbnUtaXRlbS0tY2x1c3Rlcjpob3Zlcjpub3QoOmRpc2FibGVkKSB7CiAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYm9yZGVyKSA4MCUsIHRyYW5zcGFyZW50KTsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0yKSA1NSUsIHRyYW5zcGFyZW50KTsKfQoKLm1qci1jbHVzdGVyLXJvdyB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogOHB4OwogICAgbWFyZ2luLWJvdHRvbTogNHB4OwogICAgcGFkZGluZzogNnB4IDhweDsKICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLW1qci1yLXNtKTsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLW1qci1ib3JkZXIpOwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTEpIDcwJSwgdHJhbnNwYXJlbnQpOwp9CgoubWpyLWNsdXN0ZXItdGh1bWJzIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBnYXA6IDNweDsKICAgIGZsZXgtc2hyaW5rOiAwOwp9CgoubWpyLWNsdXN0ZXItdGh1bWIgewogICAgd2lkdGg6IDI4cHg7CiAgICBoZWlnaHQ6IDI4cHg7CiAgICBib3JkZXItcmFkaXVzOiA0cHg7CiAgICBvYmplY3QtZml0OiBjb3ZlcjsKICAgIG9wYWNpdHk6IDAuODU7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMikgNjAlLCB0cmFuc3BhcmVudCk7Cn0KCi5tanItY2x1c3Rlci1pbmZvIHsKICAgIGZsZXg6IDE7CiAgICBtaW4td2lkdGg6IDA7Cn0KCi5tanItY2x1c3Rlci1uYW1lIHsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICBmb250LXNpemU6IDEycHg7CiAgICBmb250LXdlaWdodDogNjAwOwogICAgY29sb3I6IHZhcigtLWNvbnRlbnQtZmcpOwp9CgoubWpyLWNsdXN0ZXItY291bnQgewogICAgZm9udC1zaXplOiAxMHB4OwogICAgY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1jb250ZW50LWZnKSA1OCUsIHZhcigtLW1qci1tdXRlZCkpOwp9CgoubWpyLWNsdXN0ZXItY3JlYXRlLWJ0biB7CiAgICBmbGV4LXNocmluazogMDsKICAgIHBhZGRpbmc6IDNweCA4cHg7CiAgICBib3JkZXItcmFkaXVzOiA2cHg7CiAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1tanItYm9yZGVyKTsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0yKSA1NSUsIHRyYW5zcGFyZW50KTsKICAgIGNvbG9yOiB2YXIoLS1jb250ZW50LWZnKTsKICAgIGZvbnQtc2l6ZTogMTFweDsKICAgIGZvbnQtd2VpZ2h0OiA3MDA7CiAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICB0cmFuc2l0aW9uOgogICAgICAgIGJvcmRlci1jb2xvciAxMjBtcyBlYXNlLAogICAgICAgIGJhY2tncm91bmQgMTIwbXMgZWFzZSwKICAgICAgICBvcGFjaXR5IDEyMG1zIGVhc2U7Cn0KCi5tanItY2x1c3Rlci1jcmVhdGUtYnRuOmRpc2FibGVkIHsKICAgIG9wYWNpdHk6IDAuNjI7CiAgICBjdXJzb3I6IGRlZmF1bHQ7Cn0KCi5tanItY2x1c3Rlci1jcmVhdGUtYnRuOmhvdmVyOm5vdCg6ZGlzYWJsZWQpIHsKICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1ib3JkZXIpIDgwJSwgdHJhbnNwYXJlbnQpOwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTIpIDYyJSwgdHJhbnNwYXJlbnQpOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYW0tc2VhcmNoLWljb24gewogICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICBjb2xvcjogdmFyKC0tbWpyLW11dGVkKTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFtLXNlYXJjaC1pY29uIC5waSB7CiAgICBmb250LXNpemU6IDEycHg7CiAgICBsaW5lLWhlaWdodDogMTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFtLXNlYXJjaC1waWxsIC5tanItaW5wdXQgewogICAgcGFkZGluZzogMCAhaW1wb3J0YW50OwogICAgYm9yZGVyOiBub25lICFpbXBvcnRhbnQ7CiAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudCAhaW1wb3J0YW50OwogICAgYm94LXNoYWRvdzogbm9uZSAhaW1wb3J0YW50OwogICAgZm9udC1zaXplOiAxMnB4ICFpbXBvcnRhbnQ7CiAgICBsaW5lLWhlaWdodDogMS4yICFpbXBvcnRhbnQ7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hbS1zZWFyY2gtcGlsbDpmb2N1cy13aXRoaW4gewogICAgYm9yZGVyLWNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWFjY2VudCkgNjUlLCB2YXIoLS1tanItYm9yZGVyKSk7CiAgICBib3gtc2hhZG93OiAwIDAgMCAycHggY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQpIDE4JSwgdHJhbnNwYXJlbnQpOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYW0tYnJvd3NlIHsKICAgIG1hcmdpbi10b3A6IDA7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hbS1ncmlkLXNjcm9sbCB7CiAgICBwYWRkaW5nLXJpZ2h0OiA0cHg7CiAgICBzY3JvbGxiYXItZ3V0dGVyOiBzdGFibGU7Cn0KCi8qIEdyaWQgbGF5b3V0ICovCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1ncmlkIHsKICAgIGRpc3BsYXk6IGdyaWQ7CiAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAvKiBBdm9pZCBvdmVyZmxvdyB3aGVuIHRoZSBwYW5lbCBiZWNvbWVzIG5hcnJvd2VyIHRoYW4gdGhlIG1pbiBjYXJkIHNpemUgKi8KICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogcmVwZWF0KAogICAgICAgIGF1dG8tZmlsbCwKICAgICAgICBtaW5tYXgobWluKDEwMCUsIHZhcigtLW1qci1ncmlkLW1pbi1zaXplLCAxODBweCkpLCAxZnIpCiAgICApOwogICAgZ2FwOiB2YXIoLS1tanItZ3JpZC1nYXAsIDEwcHgpOwogICAgbWFyZ2luLXRvcDogNnB4OwogICAgbWluLWhlaWdodDogMDsKfQoKLyogQ2FyZCBzZWxlY3Rpb24gKyBmb2N1cyAoa2VlcHMgYSB2aXNpYmxlIGluZGljYXRvciB3aGVuIHNpZGViYXIgaXMgb3BlbikgKi8KLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFzc2V0LWNhcmQgewogICAgb3V0bGluZTogbm9uZTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFzc2V0LWNhcmQuaXMtc2VsZWN0ZWQgewogICAgYm94LXNoYWRvdzoKICAgICAgICAwIDAgMCAzcHggY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1jYXJkLXNlbGVjdGlvbi1jb2xvcikgODAlLCB2YXIoLS1jb250ZW50LWZnKSksCiAgICAgICAgMCAwIDAgNnB4IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItY2FyZC1zZWxlY3Rpb24tY29sb3IpIDMwJSwgdHJhbnNwYXJlbnQpLAogICAgICAgIDAgMCAyMHB4IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItY2FyZC1zZWxlY3Rpb24tY29sb3IpIDQwJSwgdHJhbnNwYXJlbnQpLAogICAgICAgIDAgMTBweCAyOHB4IHJnYmEoMCwgMCwgMCwgMC4yOCk7CiAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1tanItci1sZyk7CiAgICAvKiBzY2FsZSgwLjk3KSBpbnN0ZWFkIG9mIDAuOTI6IHN1YnRsZSBpbnNldCBmZWVsIHdpdGhvdXQgdGhlIGFnZ3Jlc3NpdmUKICAgICAgIHNocmluayB0aGF0IGNhdXNlZCBhIHZpc2libGUgYmxpbmsgb24gcmFwaWQgc2VsZWN0aW9uIGNoYW5nZXMuICovCiAgICB0cmFuc2Zvcm06IHNjYWxlKDAuOTcpICFpbXBvcnRhbnQ7CiAgICB6LWluZGV4OiAxMDsKICAgIG91dGxpbmU6IDJweCBzb2xpZCB2YXIoLS1tanItY2FyZC1zZWxlY3Rpb24tY29sb3IpOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYXNzZXQtY2FyZDpmb2N1cy12aXNpYmxlIHsKICAgIGJveC1zaGFkb3c6CiAgICAgICAgMCAwIDAgM3B4IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYWNjZW50KSA4MCUsIHZhcigtLWNvbnRlbnQtZmcpKSwKICAgICAgICAwIDAgMCA2cHggY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQpIDMwJSwgdHJhbnNwYXJlbnQpLAogICAgICAgIDAgMCAyMHB4IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYWNjZW50KSA0MCUsIHRyYW5zcGFyZW50KSwKICAgICAgICAwIDEwcHggMjhweCByZ2JhKDAsIDAsIDAsIDAuMjgpOwogICAgYm9yZGVyLXJhZGl1czogdmFyKC0tbWpyLXItbGcpOwogICAgdHJhbnNmb3JtOiBzY2FsZSgwLjk3KSAhaW1wb3J0YW50OwogICAgei1pbmRleDogMTA7Cn0KCkBrZXlmcmFtZXMgbWpyLWxpdmUtcGxhY2Vob2xkZXItc2hlZW4gewogICAgMCUgewogICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgtNTglKTsKICAgICAgICBvcGFjaXR5OiAwLjE4OwogICAgfQogICAgNTAlIHsKICAgICAgICBvcGFjaXR5OiAwLjM0OwogICAgfQogICAgMTAwJSB7CiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKDU4JSk7CiAgICAgICAgb3BhY2l0eTogMC4xODsKICAgIH0KfQoKQGtleWZyYW1lcyBtanItbGl2ZS1wbGFjZWhvbGRlci1wdWxzZSB7CiAgICAwJSwKICAgIDEwMCUgewogICAgICAgIGJveC1zaGFkb3c6CiAgICAgICAgICAgIDAgMCAwIDFweCByZ2JhKDExOCwgMjE0LCAyNTUsIDAuMzQpLAogICAgICAgICAgICAwIDEwcHggMjRweCByZ2JhKDAsIDAsIDAsIDAuMjQpOwogICAgfQogICAgNTAlIHsKICAgICAgICBib3gtc2hhZG93OgogICAgICAgICAgICAwIDAgMCAxcHggcmdiYSgxMTgsIDIxNCwgMjU1LCAwLjUyKSwKICAgICAgICAgICAgMCAwIDAgNHB4IHJnYmEoMTE4LCAyMTQsIDI1NSwgMC4xMiksCiAgICAgICAgICAgIDAgMTJweCAzMHB4IHJnYmEoMCwgMCwgMCwgMC4yOCk7CiAgICB9Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hc3NldC1jYXJkW2RhdGEtbWpyLWxpdmUtcGxhY2Vob2xkZXI9InRydWUiXSB7CiAgICBhbmltYXRpb246IG1qci1saXZlLXBsYWNlaG9sZGVyLXB1bHNlIDEuOXMgZWFzZS1pbi1vdXQgaW5maW5pdGU7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hc3NldC1jYXJkW2RhdGEtbWpyLWxpdmUtcGxhY2Vob2xkZXI9InRydWUiXSAubWpyLXRodW1iIHsKICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgIG92ZXJmbG93OiBoaWRkZW47Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1saXZlLXBsYWNlaG9sZGVyLXdhc2ggewogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgaW5zZXQ6IC04JTsKICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgei1pbmRleDogMTsKICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgKICAgICAgICAxMTVkZWcsCiAgICAgICAgcmdiYSg5OCwgMTk5LCAyNTUsIDApIDAlLAogICAgICAgIHJnYmEoOTgsIDE5OSwgMjU1LCAwLjA4KSAzMCUsCiAgICAgICAgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjI0KSA1MCUsCiAgICAgICAgcmdiYSg5OCwgMTk5LCAyNTUsIDAuMTIpIDcwJSwKICAgICAgICByZ2JhKDk4LCAxOTksIDI1NSwgMCkgMTAwJQogICAgKTsKICAgIGFuaW1hdGlvbjogbWpyLWxpdmUtcGxhY2Vob2xkZXItc2hlZW4gMi4ycyBsaW5lYXIgaW5maW5pdGU7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1saXZlLXBpbGwgewogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgdG9wOiA2cHg7CiAgICByaWdodDogNnB4OwogICAgei1pbmRleDogMTI7CiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBnYXA6IDZweDsKICAgIG1pbi1oZWlnaHQ6IDI0cHg7CiAgICBwYWRkaW5nOiAwIDhweDsKICAgIGJvcmRlci1yYWRpdXM6IDk5OXB4OwogICAgYmFja2dyb3VuZDogcmdiYSgxMCwgMTQsIDIwLCAwLjc4KTsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMTE4LCAyMTQsIDI1NSwgMC4zNCk7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjk2KTsKICAgIGZvbnQtc2l6ZTogMTBweDsKICAgIGZvbnQtd2VpZ2h0OiA3MDA7CiAgICBsZXR0ZXItc3BhY2luZzogMC4wMWVtOwogICAgYm94LXNoYWRvdzogMCAycHggOHB4IHJnYmEoMCwgMCwgMCwgMC4yNCk7CiAgICBiYWNrZHJvcC1maWx0ZXI6IGJsdXIoNnB4KTsKICAgIC13ZWJraXQtYmFja2Ryb3AtZmlsdGVyOiBibHVyKDZweCk7CiAgICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItbGl2ZS1waWxsLWRvdCB7CiAgICB3aWR0aDogN3B4OwogICAgaGVpZ2h0OiA3cHg7CiAgICBib3JkZXItcmFkaXVzOiA5OTlweDsKICAgIGJhY2tncm91bmQ6ICM3NmQ2ZmY7CiAgICBib3gtc2hhZG93OiAwIDAgMCA0cHggcmdiYSgxMTgsIDIxNCwgMjU1LCAwLjE2KTsKICAgIGZsZXg6IDAgMCBhdXRvOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYXNzZXQtY2FyZFtkYXRhLW1qci1saXZlLXBsYWNlaG9sZGVyPSJ0cnVlIl0gLm1qci1hc3NldC1zdGF0dXMtZG90IHsKICAgIGFuaW1hdGlvbjogbWpyLWxpdmUtcGxhY2Vob2xkZXItcHVsc2UgMS45cyBlYXNlLWluLW91dCBpbmZpbml0ZTsKfQoKLyogR3JpZCBsb2FkaW5nIG92ZXJsYXkgKi8KLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWdyaWQtbG9hZGluZy1vdmVybGF5IHsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIGluc2V0OiAwOwogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCAjMDAwIDM1JSwgdHJhbnNwYXJlbnQpOwogICAgY29sb3I6IHZhcigtLWNvbnRlbnQtZmcsICNmZmYpOwogICAgZm9udC1zaXplOiAxM3B4OwogICAgbGV0dGVyLXNwYWNpbmc6IDAuM3B4OwogICAgYm9yZGVyLXJhZGl1czogdmFyKC0tbWpyLXItbGcpOwogICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICBiYWNrZHJvcC1maWx0ZXI6IGJsdXIoMnB4KTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWdyaWQtc2tlbGV0b24tbGF5b3V0IHsKICAgIGRpc3BsYXk6IGdyaWQ7CiAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IHJlcGVhdChhdXRvLWZpbGwsIG1pbm1heCgxMzJweCwgMWZyKSk7CiAgICBnYXA6IDEycHg7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1ncmlkLXNrZWxldG9uLWNhcmQgewogICAgYm9yZGVyLXJhZGl1czogMTJweDsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4yMik7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDE5MiwgMTk4LCAyMDYsIDAuMik7CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgLyogbWluLWhlaWdodCByZW1vdmVkOiBWdWUgc2tlbGV0b25DYXJkU3R5bGUgc2V0cyBhbiBleHBsaWNpdCBoZWlnaHQgZGVyaXZlZAogICAgICAgZnJvbSBlc3RpbWF0ZVJvd0hlaWdodC4gQSBjb25mbGljdGluZyBtaW4taGVpZ2h0IGNhdXNlZCBza2VsZXRvbiBjYXJkcyB0bwogICAgICAgYmUgdGFsbGVyIHRoYW4gdGhlIGFjdHVhbCBjYXJkcyB0aGV5IHJlcGxhY2UsIGNhdXNpbmcgYSBsYXlvdXQganVtcCB3aGVuCiAgICAgICBhc3NldHMgZmlyc3QgbG9hZC4gKi8KICAgIGJveC1zaGFkb3c6IDAgNnB4IDE4cHggcmdiYSgwLCAwLCAwLCAwLjI0KTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWdyaWQtc2tlbGV0b24tdGh1bWIgewogICAgYXNwZWN0LXJhdGlvOiAxIC8gMTsKICAgIHdpZHRoOiAxMDAlOwogICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KAogICAgICAgIDkwZGVnLAogICAgICAgIHJnYmEoMTU2LCAxNjIsIDE3MSwgMC41MikgMCUsCiAgICAgICAgcmdiYSgyMjAsIDIyNSwgMjMyLCAwLjcyKSA0NSUsCiAgICAgICAgcmdiYSgxNTYsIDE2MiwgMTcxLCAwLjUyKSAxMDAlCiAgICApOwogICAgYmFja2dyb3VuZC1zaXplOiAyNDAlIDEwMCU7CiAgICBhbmltYXRpb246IG1qci1ncmlkLXNrZWxldG9uLXNoaW1tZXIgMS4ycyBsaW5lYXIgaW5maW5pdGU7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1ncmlkLXNrZWxldG9uLWxpbmUgewogICAgaGVpZ2h0OiAxMHB4OwogICAgbWFyZ2luOiA4cHggMTBweDsKICAgIGJvcmRlci1yYWRpdXM6IDhweDsKICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgKICAgICAgICA5MGRlZywKICAgICAgICByZ2JhKDE2NCwgMTcwLCAxNzksIDAuNDgpIDAlLAogICAgICAgIHJnYmEoMjE0LCAyMTksIDIyNiwgMC43KSA0NSUsCiAgICAgICAgcmdiYSgxNjQsIDE3MCwgMTc5LCAwLjQ4KSAxMDAlCiAgICApOwogICAgYmFja2dyb3VuZC1zaXplOiAyNDAlIDEwMCU7CiAgICBhbmltYXRpb246IG1qci1ncmlkLXNrZWxldG9uLXNoaW1tZXIgMS4ycyBsaW5lYXIgaW5maW5pdGU7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1ncmlkLXNrZWxldG9uLWxpbmUtLXRpdGxlIHsKICAgIHdpZHRoOiA3MiU7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1ncmlkLXNrZWxldG9uLWxpbmUtLW1ldGEgewogICAgd2lkdGg6IDQ4JTsKICAgIG1hcmdpbi10b3A6IDJweDsKICAgIG1hcmdpbi1ib3R0b206IDEwcHg7Cn0KCkBrZXlmcmFtZXMgbWpyLXNrZWxldG9uLXNoaW1tZXIgewogICAgMCUgewogICAgICAgIGJhY2tncm91bmQtcG9zaXRpb246IDEyMCUgMDsKICAgIH0KICAgIDEwMCUgewogICAgICAgIGJhY2tncm91bmQtcG9zaXRpb246IC0xMjAlIDA7CiAgICB9Cn0KCkBrZXlmcmFtZXMgbWpyLWdyaWQtc2tlbGV0b24tc2hpbW1lciB7CiAgICAwJSB7CiAgICAgICAgYmFja2dyb3VuZC1wb3NpdGlvbjogMTAwJSAwOwogICAgfQogICAgMTAwJSB7CiAgICAgICAgYmFja2dyb3VuZC1wb3NpdGlvbjogLTEwMCUgMDsKICAgIH0KfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWdyaWQtc2tlbGV0b24tc2hpbW1lciB7CiAgICB3aWxsLWNoYW5nZTogYmFja2dyb3VuZC1wb3NpdGlvbjsKfQoKLyogR2VuZXJpYyBoZWFkaW5ncyBpbnNpZGUgcGFuZWwgKi8KLm1qci1hc3NldHMtbWFuYWdlciBoMywKLm1qci1hc3NldHMtbWFuYWdlciBoNCB7CiAgICBmb250LWZhbWlseTogaW5oZXJpdDsKICAgIGxldHRlci1zcGFjaW5nOiAwLjAxZW07Cn0KCi8qIFBhbmVscyAqLwoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItcGFuZWwgewogICAgYmFja2dyb3VuZDogdmFyKC0tbWpyLXN1cmZhY2UtMSk7CiAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1tanItYm9yZGVyKTsKICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLW1qci1yLWxnKTsKICAgIGJveC1zaGFkb3c6IHZhcigtLWludGVyZmFjZS1wYW5lbC1ib3gtc2hhZG93LCAwIDhweCAyNHB4IHJnYmEoMCwgMCwgMCwgMC4yNSkpOwp9CgovKiBUb29sYmFyICovCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci10b29sYmFyIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiAxMHB4OwogICAgcGFkZGluZzogdmFyKC0tbWpyLXBhZC1tZCk7Cn0KCi8qIEJ1dHRvbnMgKi8KLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWJ0biB7CiAgICBhcHBlYXJhbmNlOiBub25lOwogICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tbWpyLWJvcmRlcik7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1tanItc3VyZmFjZS0yKTsKICAgIGNvbG9yOiB2YXIoLS1jb250ZW50LWZnLCAjZGRkKTsKICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLW1qci1yLW1kKTsKICAgIHBhZGRpbmc6IDdweCAxMHB4OwogICAgZm9udC1zaXplOiAxMnB4OwogICAgbGluZS1oZWlnaHQ6IDE7CiAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICB1c2VyLXNlbGVjdDogbm9uZTsKICAgIHRyYW5zaXRpb246CiAgICAgICAgYmFja2dyb3VuZCAxMjBtcyBlYXNlLAogICAgICAgIGJvcmRlci1jb2xvciAxMjBtcyBlYXNlLAogICAgICAgIHRyYW5zZm9ybSA4MG1zIGVhc2U7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1idG46aG92ZXIgewogICAgYm9yZGVyLWNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWFjY2VudCkgNTUlLCB2YXIoLS1tanItYm9yZGVyKSk7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMikgNzAlLCB2YXIoLS1tanItYWNjZW50KSAxMCUpOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYnRuOmFjdGl2ZSB7CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoMXB4KTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWJ0bjpkaXNhYmxlZCB7CiAgICBvcGFjaXR5OiAwLjU1OwogICAgY3Vyc29yOiBub3QtYWxsb3dlZDsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWJ0bi5tanItcHJpbWFyeSB7CiAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYWNjZW50KSA2MCUsIHZhcigtLW1qci1ib3JkZXIpKTsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYWNjZW50KSAxNCUsIHZhcigtLW1qci1zdXJmYWNlLTIpKTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWJ0biB7CiAgICAvKiBPdmVycmlkZSBpbmxpbmUgc3R5bGVzIGlmIHByZXNlbnQgKi8KICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLW1qci1ib3JkZXIpOwogICAgYmFja2dyb3VuZDogdmFyKC0tbWpyLXN1cmZhY2UtMik7CiAgICBjb2xvcjogdmFyKC0tY29udGVudC1mZywgI2RkZCk7CiAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1tanItci1tZCk7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1idG46aG92ZXIgewogICAgYm9yZGVyLWNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWFjY2VudCkgNTUlLCB2YXIoLS1tanItYm9yZGVyKSk7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMikgNzAlLCB2YXIoLS1tanItYWNjZW50KSAxMCUpOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYnRuLm1qci1zdGF0dXMtc2NhbiB7CiAgICBtYXJnaW4tbGVmdDogYXV0bzsKICAgIHBhZGRpbmc6IDRweCAxMHB4OwogICAgY29sb3I6IHZhcigtLW1qci1zdGF0dXMtY29sb3IsIHZhcigtLWNvbnRlbnQtZmcsICNkZGQpKTsKICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdGF0dXMtY29sb3IpIDYwJSwgdmFyKC0tbWpyLWJvcmRlcikpOwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdGF0dXMtY29sb3IpIDE0JSwgdmFyKC0tbWpyLXN1cmZhY2UtMikpOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYnRuLm1qci1zdGF0dXMtc2Nhbjpob3ZlciB7CiAgICBib3JkZXItY29sb3I6IHZhcigtLW1qci1zdGF0dXMtY29sb3IpOwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdGF0dXMtY29sb3IpIDI0JSwgdmFyKC0tbWpyLXN1cmZhY2UtMikpOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYnRuLm1qci1zdGF0dXMtc2Nhbjpmb2N1cy12aXNpYmxlIHsKICAgIG91dGxpbmU6IDJweCBzb2xpZCB2YXIoLS1tanItc3RhdHVzLWNvbG9yKTsKICAgIG91dGxpbmUtb2Zmc2V0OiAycHg7Cn0KCi8qIElucHV0cyAvIHNlbGVjdHMgKHVzZWQgaW5zaWRlIHBvcnRhbGVkIHBvcG92ZXJzIHRvbykgKi8KLm1qci1pbnB1dCwKLm1qci1zZWxlY3QsCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1pbnB1dCwKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLXNlbGVjdCB7CiAgICBhcHBlYXJhbmNlOiBub25lOwogICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tbWpyLWJvcmRlcik7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1jb21meS1pbnB1dC1iZywgcmdiYSgwLCAwLCAwLCAwLjI1KSk7CiAgICBjb2xvcjogdmFyKC0taW5wdXQtdGV4dCwgI2RkZCk7CiAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1tanItci1tZCk7CiAgICBwYWRkaW5nOiA4cHggMTBweDsKICAgIGZvbnQtc2l6ZTogMTNweDsKICAgIG91dGxpbmU6IG5vbmU7CiAgICB3aWR0aDogMTAwJTsKICAgIG1pbi13aWR0aDogMDsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWlucHV0OjpwbGFjZWhvbGRlciB7CiAgICBjb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1tdXRlZCkgODAlLCB0cmFuc3BhcmVudCk7Cn0KCi5tanItaW5wdXQ6Zm9jdXMsCi5tanItc2VsZWN0OmZvY3VzLAoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItaW5wdXQ6Zm9jdXMsCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1zZWxlY3Q6Zm9jdXMgewogICAgYm9yZGVyLWNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWFjY2VudCkgNjUlLCB2YXIoLS1tanItYm9yZGVyKSk7CiAgICBib3gtc2hhZG93OiAwIDAgMCAycHggY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQpIDIwJSwgdHJhbnNwYXJlbnQpOwp9CgoubWpyLWlucHV0LAoubWpyLXNlbGVjdCwKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWlucHV0LAoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItc2VsZWN0IHsKICAgIC8qIE92ZXJyaWRlIGlubGluZSBzdHlsZXMgaWYgcHJlc2VudCAqLwogICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tbWpyLWJvcmRlcik7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1jb21meS1pbnB1dC1iZywgcmdiYSgwLCAwLCAwLCAwLjI1KSk7CiAgICBjb2xvcjogdmFyKC0taW5wdXQtdGV4dCwgI2RkZCk7CiAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1tanItci1tZCk7CiAgICBwYWRkaW5nOiA4cHggMTBweDsKfQoKLm1qci1maWx0ZXItcG9wb3ZlciAubWpyLWZpbHRlci1zZWxlY3QgewogICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOwogICAgZ2FwOiA4cHg7CiAgICBtaW4taGVpZ2h0OiAzNHB4OwogICAgcGFkZGluZzogMCA5cHg7CiAgICBsaW5lLWhlaWdodDogMS4yOwp9CgoubWpyLWZpbHRlci1wb3BvdmVyIC5tanItZmlsdGVyLXNlbGVjdFtkYXRhLXAtZGlzYWJsZWQ9InRydWUiXSB7CiAgICBvcGFjaXR5OiAwLjU1OwogICAgY3Vyc29yOiBkZWZhdWx0Owp9CgoubWpyLWZpbHRlci1wb3BvdmVyIC5tanItZmlsdGVyLXNlbGVjdCBbZGF0YS1wYy1zZWN0aW9uPSJsYWJlbCJdIHsKICAgIGZsZXg6IDEgMSBhdXRvOwogICAgbWluLXdpZHRoOiAwOwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKfQoKLm1qci1maWx0ZXItcG9wb3ZlciAubWpyLWZpbHRlci1zZWxlY3QgW2RhdGEtcGMtc2VjdGlvbj0iZHJvcGRvd24iXSB7CiAgICBmbGV4OiAwIDAgYXV0bzsKICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgd2lkdGg6IDE4cHg7CiAgICBjb2xvcjogdmFyKC0tbWpyLW11dGVkLCB2YXIoLS1kZXNjcmlwLXRleHQsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC42NSkpKTsKfQoKLm1qci1maWx0ZXItc2VsZWN0LXBhbmVsIHsKICAgIG1pbi13aWR0aDogdmFyKC0tcC1zZWxlY3Qtb3ZlcmxheS13aWR0aCwgMTJyZW0pOwogICAgbWF4LXdpZHRoOiBtaW4oMzIwcHgsIGNhbGMoMTAwdncgLSAzMnB4KSk7CiAgICBtYXgtaGVpZ2h0OiBtaW4oMzIwcHgsIGNhbGMoMTAwdmggLSAzMnB4KSk7CiAgICBvdmVyZmxvdzogYXV0bzsKICAgIHBhZGRpbmc6IDRweDsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLW1qci1ib3JkZXIpOwogICAgYm9yZGVyLXJhZGl1czogdmFyKC0tbWpyLXItbWQpOwogICAgYmFja2dyb3VuZDogdmFyKC0tbWpyLXN1cmZhY2UtMSwgdmFyKC0tY29tZnktbWVudS1iZywgIzJhMmEyYSkpOwogICAgY29sb3I6IHZhcigtLWNvbnRlbnQtZmcsIHZhcigtLWlucHV0LXRleHQsICNkZGQpKTsKICAgIGJveC1zaGFkb3c6IDAgMTJweCAyOHB4IHJnYmEoMCwgMCwgMCwgMC4zOCk7CiAgICB6LWluZGV4OiBjYWxjKHZhcigtLW1qci1wb3BvdmVyLXotaW5kZXgsIDIxNDc0ODM2NDcpICsgMSk7Cn0KCi5tanItZmlsdGVyLXNlbGVjdC1wYW5lbCBbZGF0YS1wYy1zZWN0aW9uPSJsaXN0Il0gewogICAgZGlzcGxheTogZmxleDsKICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICBnYXA6IDJweDsKICAgIHBhZGRpbmc6IDA7CiAgICBtYXJnaW46IDA7CiAgICBsaXN0LXN0eWxlOiBub25lOwp9CgoubWpyLWZpbHRlci1zZWxlY3QtcGFuZWwgW2RhdGEtcGMtc2VjdGlvbj0ib3B0aW9uIl0gewogICAgbWluLWhlaWdodDogMjhweDsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgcGFkZGluZzogNnB4IDhweDsKICAgIGJvcmRlci1yYWRpdXM6IGNhbGModmFyKC0tbWpyLXItbWQpIC0gMnB4KTsKICAgIGZvbnQtc2l6ZTogMTJweDsKICAgIGxpbmUtaGVpZ2h0OiAxLjI1OwogICAgY3Vyc29yOiBwb2ludGVyOwogICAgY29sb3I6IHZhcigtLWNvbnRlbnQtZmcsIHZhcigtLWlucHV0LXRleHQsICNkZGQpKTsKfQoKLm1qci1maWx0ZXItc2VsZWN0LXBhbmVsIFtkYXRhLXBjLXNlY3Rpb249Im9wdGlvbiJdOmhvdmVyLAoubWpyLWZpbHRlci1zZWxlY3QtcGFuZWwgW2RhdGEtcC1oaWdobGlnaHQ9InRydWUiXSB7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWFjY2VudCkgMTglLCB0cmFuc3BhcmVudCk7CiAgICBjb2xvcjogdmFyKC0tY29udGVudC1mZywgI2ZmZik7Cn0KCi8qIFRhYnM6IG92ZXJyaWRkZW4gYWJvdmUgd2l0aCBxdWV1ZS1saWtlIHN0eWxlICovCgovKiBSZW1vdmVkIHJlZHVuZGFudCB0YWIgZGVjbGFyYXRpb25zIHRoYXQgd2VyZSB1c2luZyAhaW1wb3J0YW50ICovCgovKiBNdXRlZCB0ZXh0IGhlbHBlciAqLwoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItbXV0ZWQgewogICAgY29sb3I6IHZhcigtLW1qci1tdXRlZCk7Cn0KCi8qIEdyaWQgKyBjYXJkcyAob3ZlcnJpZGUgaW5saW5lIHN0eWxlcyBmcm9tIENhcmQuanMpICovCi5tanItYXNzZXRzLW1hbmFnZXIgI21qci1hc3NldHMtZ3JpZCB7CiAgICBnYXA6IDEwcHggIWltcG9ydGFudDsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFzc2V0LWNhcmQsCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1jYXJkIHsKICAgIGJhY2tncm91bmQ6IHZhcigtLW1qci1zdXJmYWNlLTEpICFpbXBvcnRhbnQ7CiAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1tanItYm9yZGVyKSAhaW1wb3J0YW50OwogICAgYm9yZGVyLXJhZGl1czogdmFyKC0tbWpyLXItbGcpICFpbXBvcnRhbnQ7CiAgICBvdmVyZmxvdzogaGlkZGVuICFpbXBvcnRhbnQ7CiAgICBtaW4td2lkdGg6IDA7CiAgICB0cmFuc2l0aW9uOgogICAgICAgIHRyYW5zZm9ybSAxMjBtcyBlYXNlLAogICAgICAgIGJvcmRlci1jb2xvciAxMjBtcyBlYXNlLAogICAgICAgIGJveC1zaGFkb3cgMTIwbXMgZWFzZSAhaW1wb3J0YW50Owp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYXNzZXQtY2FyZDpob3ZlciwKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWNhcmQ6aG92ZXIgewogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC0xcHgpICFpbXBvcnRhbnQ7CiAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peCgKICAgICAgICBpbiBzcmdiLAogICAgICAgIHZhcigtLW1qci1jYXJkLXNlbGVjdGlvbi1jb2xvcikgNTUlLAogICAgICAgIHZhcigtLW1qci1ib3JkZXIpCiAgICApICFpbXBvcnRhbnQ7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1tanItY2FyZC1ob3Zlci1jb2xvcikgIWltcG9ydGFudDsKICAgIGJveC1zaGFkb3c6IDAgOHB4IDIycHggcmdiYSgwLCAwLCAwLCAwLjI1KSAhaW1wb3J0YW50Owp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYXNzZXQtY2FyZCBpbWcsCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hc3NldC1jYXJkIHZpZGVvLAoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItdGh1bWItbWVkaWEgewogICAgZGlzcGxheTogYmxvY2s7CiAgICB3aWR0aDogMTAwJSAhaW1wb3J0YW50OwogICAgaGVpZ2h0OiAxMDAlICFpbXBvcnRhbnQ7CiAgICBvYmplY3QtZml0OiBjb3ZlciAhaW1wb3J0YW50Owp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItdGh1bWIgewogICAgZmxleDogMCAwIGF1dG87CiAgICB3aWR0aDogMTAwJTsKICAgIGFzcGVjdC1yYXRpbzogMSAvIDE7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMCkgODAlLCB0cmFuc3BhcmVudCk7CiAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICBvdmVyZmxvdzogaGlkZGVuOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYXVkaW8tdGh1bWIsCi5tanItYm90dG9tLWZlZWQgLm1qci1hdWRpby10aHVtYiB7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICBpbnNldDogMDsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOwogICAgZ2FwOiAxMHB4OwogICAgcGFkZGluZzogMTRweCAxMnB4IDEycHg7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjk0KTsKICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgYmFja2dyb3VuZDoKICAgICAgICByYWRpYWwtZ3JhZGllbnQoY2lyY2xlIGF0IDE4JSAyMCUsIHJnYmEoNzgsIDE4NCwgMjU1LCAwLjMyKSwgdHJhbnNwYXJlbnQgMzglKSwKICAgICAgICByYWRpYWwtZ3JhZGllbnQoY2lyY2xlIGF0IDg4JSA3MiUsIHJnYmEoODIsIDIyMCwgMTU2LCAwLjI0KSwgdHJhbnNwYXJlbnQgNDIlKSwKICAgICAgICBsaW5lYXItZ3JhZGllbnQoMTM1ZGVnLCByZ2JhKDE4LCAyNiwgMzYsIDAuOTgpLCByZ2JhKDgsIDEyLCAxOCwgMC45OCkpOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYXVkaW8tdGh1bWIuaGFzLXBvc3RlciwKLm1qci1ib3R0b20tZmVlZCAubWpyLWF1ZGlvLXRodW1iLmhhcy1wb3N0ZXIgewogICAgYmFja2dyb3VuZDoKICAgICAgICBsaW5lYXItZ3JhZGllbnQoMTgwZGVnLCByZ2JhKDQsIDYsIDEwLCAwLjI4KSwgcmdiYSg0LCA2LCAxMCwgMC44NikpLAogICAgICAgIHJhZGlhbC1ncmFkaWVudChjaXJjbGUgYXQgNTAlIDQyJSwgcmdiYSg3OCwgMTg0LCAyNTUsIDAuMiksIHRyYW5zcGFyZW50IDU0JSk7CiAgICBiYWNrZHJvcC1maWx0ZXI6IHNhdHVyYXRlKDEuMSk7CiAgICAtd2Via2l0LWJhY2tkcm9wLWZpbHRlcjogc2F0dXJhdGUoMS4xKTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWF1ZGlvLXRodW1iLWhlYWQsCi5tanItYm90dG9tLWZlZWQgLm1qci1hdWRpby10aHVtYi1oZWFkIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOwogICAgZ2FwOiA4cHg7CiAgICBtaW4td2lkdGg6IDA7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hdWRpby10aHVtYi1pY29uLAoubWpyLWJvdHRvbS1mZWVkIC5tanItYXVkaW8tdGh1bWItaWNvbiB7CiAgICB3aWR0aDogMjhweDsKICAgIGhlaWdodDogMjhweDsKICAgIGJvcmRlci1yYWRpdXM6IDk5OXB4OwogICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTIpOwogICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE4KTsKICAgIGJveC1zaGFkb3c6IDAgOHB4IDE4cHggcmdiYSgwLCAwLCAwLCAwLjIyKTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWF1ZGlvLXRodW1iLWtpbmQsCi5tanItYm90dG9tLWZlZWQgLm1qci1hdWRpby10aHVtYi1raW5kIHsKICAgIG1heC13aWR0aDogNjJweDsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICBwYWRkaW5nOiAzcHggN3B4OwogICAgYm9yZGVyLXJhZGl1czogOTk5cHg7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIDAuMjgpOwogICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEzKTsKICAgIGZvbnQtc2l6ZTogMTBweDsKICAgIGZvbnQtd2VpZ2h0OiA4MDA7CiAgICBsZXR0ZXItc3BhY2luZzogMDsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWF1ZGlvLXRodW1iLXdhdmVmb3JtLAoubWpyLWJvdHRvbS1mZWVkIC5tanItYXVkaW8tdGh1bWItd2F2ZWZvcm0gewogICAgZmxleDogMTsKICAgIG1pbi1oZWlnaHQ6IDQycHg7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgZ2FwOiBjbGFtcCgycHgsIDIuMiUsIDVweCk7CiAgICBwYWRkaW5nOiA0cHggMDsKICAgIGZpbHRlcjogZHJvcC1zaGFkb3coMCA0cHggMTRweCByZ2JhKDAsIDAsIDAsIDAuMzQpKTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWF1ZGlvLXRodW1iLXdhdmVmb3JtIHNwYW4sCi5tanItYm90dG9tLWZlZWQgLm1qci1hdWRpby10aHVtYi13YXZlZm9ybSBzcGFuIHsKICAgIHdpZHRoOiAzcHg7CiAgICBtaW4td2lkdGg6IDJweDsKICAgIG1heC13aWR0aDogNXB4OwogICAgYm9yZGVyLXJhZGl1czogOTk5cHg7CiAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoMTgwZGVnLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuOTgpLCByZ2JhKDE2MCwgMjI0LCAyNTUsIDAuNzIpKTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWF1ZGlvLXRodW1iLW1ldGEsCi5tanItYm90dG9tLWZlZWQgLm1qci1hdWRpby10aHVtYi1tZXRhIHsKICAgIG1pbi13aWR0aDogMDsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgZ2FwOiAycHg7CiAgICB0ZXh0LXNoYWRvdzogMCAycHggMTJweCByZ2JhKDAsIDAsIDAsIDAuNjIpOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYXVkaW8tdGh1bWItdGl0bGUsCi5tanItYm90dG9tLWZlZWQgLm1qci1hdWRpby10aHVtYi10aXRsZSB7CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7CiAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgZm9udC1zaXplOiAxMnB4OwogICAgZm9udC13ZWlnaHQ6IDgwMDsKICAgIGxpbmUtaGVpZ2h0OiAxLjI7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hdWRpby10aHVtYi1zdWJ0aXRsZSwKLm1qci1ib3R0b20tZmVlZCAubWpyLWF1ZGlvLXRodW1iLXN1YnRpdGxlIHsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjcpOwogICAgZm9udC1zaXplOiAxMHB4OwogICAgZm9udC13ZWlnaHQ6IDY1MDsKICAgIGxpbmUtaGVpZ2h0OiAxLjI7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hc3NldC1jYXJkIC5tanItd29ya2Zsb3ctdGh1bWIsCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1jYXJkIC5tanItd29ya2Zsb3ctdGh1bWIgewogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgaW5zZXQ6IDA7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgIGdhcDogN3B4OwogICAgcGFkZGluZzogMTRweCAxMnB4OwogICAgYmFja2dyb3VuZDoKICAgICAgICBsaW5lYXItZ3JhZGllbnQoMTM1ZGVnLCByZ2JhKDQ3LCA1OCwgNzYsIDAuOTQpLCByZ2JhKDE4LCAyMywgMzIsIDAuOTgpKSwKICAgICAgICByYWRpYWwtZ3JhZGllbnQoY2lyY2xlIGF0IDMwJSAyNSUsIHJnYmEoNzgsIDE4NCwgMjU1LCAwLjIyKSwgdHJhbnNwYXJlbnQgNDIlKTsKICAgIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuOSk7CiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgICB0ZXh0LXNoYWRvdzogMCAxcHggOHB4IHJnYmEoMCwgMCwgMCwgMC43Mik7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hc3NldC1jYXJkIC5tanItdGh1bWIubWpyLXRodW1iLXdvcmtmbG93LAoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItY2FyZCAubWpyLXRodW1iLm1qci10aHVtYi13b3JrZmxvdyB7CiAgICBhc3BlY3QtcmF0aW86IDEuMDggLyAxOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYXNzZXQtY2FyZCAubWpyLXdvcmtmbG93LWNhcmQtYWN0aW9ucywKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWNhcmQgLm1qci13b3JrZmxvdy1jYXJkLWFjdGlvbnMgewogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgdG9wOiA3cHg7CiAgICByaWdodDogN3B4OwogICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICBnYXA6IDRweDsKICAgIHotaW5kZXg6IDEyOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYXNzZXQtY2FyZCAubWpyLXdvcmtmbG93LWFjdGlvbi1idG4sCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1jYXJkIC5tanItd29ya2Zsb3ctYWN0aW9uLWJ0biB7CiAgICAtd2Via2l0LWFwcGVhcmFuY2U6IG5vbmU7CiAgICBhcHBlYXJhbmNlOiBub25lOwogICAgd2lkdGg6IDI0cHg7CiAgICBoZWlnaHQ6IDI0cHg7CiAgICBtaW4td2lkdGg6IDI0cHg7CiAgICBtaW4taGVpZ2h0OiAyNHB4OwogICAgcGFkZGluZzogMDsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4zNCk7CiAgICBib3JkZXItcmFkaXVzOiA3cHg7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDgsIDEyLCAxOCwgMC41OCk7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjkyKTsKICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgY3Vyc29yOiBwb2ludGVyOwogICAgbGluZS1oZWlnaHQ6IDE7CiAgICBiYWNrZHJvcC1maWx0ZXI6IGJsdXIoM3B4KTsKICAgIC13ZWJraXQtYmFja2Ryb3AtZmlsdGVyOiBibHVyKDNweCk7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hc3NldC1jYXJkIC5tanItd29ya2Zsb3ctYWN0aW9uLWJ0bjpob3ZlciwKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWNhcmQgLm1qci13b3JrZmxvdy1hY3Rpb24tYnRuOmhvdmVyIHsKICAgIGJhY2tncm91bmQ6IHJnYmEoMjksIDQwLCA1OCwgMC43OCk7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hc3NldC1jYXJkIC5tanItd29ya2Zsb3ctYWN0aW9uLWJ0bi5pcy1hY3RpdmUsCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1jYXJkIC5tanItd29ya2Zsb3ctYWN0aW9uLWJ0bi5pcy1hY3RpdmUgewogICAgY29sb3I6ICNmZmQ0NWE7CiAgICBib3JkZXItY29sb3I6IHJnYmEoMjU1LCAyMTIsIDkwLCAwLjcpOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYXNzZXQtY2FyZCAubWpyLXdvcmtmbG93LXRodW1iIC5waSwKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWNhcmQgLm1qci13b3JrZmxvdy10aHVtYiAucGkgewogICAgZm9udC1zaXplOiAxLjc1cmVtOwogICAgb3BhY2l0eTogMC43MjsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFzc2V0LWNhcmQgLm1qci13b3JrZmxvdy10aHVtYi5oYXMtdGh1bWJuYWlsLAoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItY2FyZCAubWpyLXdvcmtmbG93LXRodW1iLmhhcy10aHVtYm5haWwgewogICAganVzdGlmeS1jb250ZW50OiBmbGV4LWVuZDsKICAgIGJhY2tncm91bmQ6CiAgICAgICAgbGluZWFyLWdyYWRpZW50KDE4MGRlZywgdHJhbnNwYXJlbnQgMjQlLCByZ2JhKDAsIDAsIDAsIDAuMjgpIDU4JSwgcmdiYSgwLCAwLCAwLCAwLjc4KSksCiAgICAgICAgbGluZWFyLWdyYWRpZW50KDkwZGVnLCByZ2JhKDAsIDAsIDAsIDAuMzQpLCB0cmFuc3BhcmVudCAzNCUsIHRyYW5zcGFyZW50IDY2JSwgcmdiYSgwLCAwLCAwLCAwLjM0KSk7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hc3NldC1jYXJkIC5tanItdGh1bWItbWVkaWEubWpyLXdvcmtmbG93LWdyYXBoLW1hcC1wcmV2aWV3LAoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItY2FyZCAubWpyLXRodW1iLW1lZGlhLm1qci13b3JrZmxvdy1ncmFwaC1tYXAtcHJldmlldyB7CiAgICBvYmplY3QtZml0OiBjb3ZlciAhaW1wb3J0YW50OwogICAgb3BhY2l0eTogMC40NjsKICAgIGZpbHRlcjogc2F0dXJhdGUoMC43NSkgY29udHJhc3QoMC44MikgYnJpZ2h0bmVzcygwLjcpOwogICAgdHJhbnNmb3JtOiBzY2FsZSgxLjA2KTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFzc2V0LWNhcmQgLm1qci13b3JrZmxvdy10aHVtYi5oYXMtZ3JhcGgtbWFwLAoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItY2FyZCAubWpyLXdvcmtmbG93LXRodW1iLmhhcy1ncmFwaC1tYXAgewogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICBiYWNrZ3JvdW5kOgogICAgICAgIGxpbmVhci1ncmFkaWVudCgxODBkZWcsIHJnYmEoOCwgMTAsIDE0LCAwLjMpLCByZ2JhKDgsIDEwLCAxNCwgMC44MikpLAogICAgICAgIHJhZGlhbC1ncmFkaWVudChjaXJjbGUgYXQgNTAlIDQyJSwgcmdiYSgwLCAwLCAwLCAwLjE4KSwgcmdiYSgwLCAwLCAwLCAwLjY4KSA3MiUpOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYXNzZXQtY2FyZCAubWpyLXdvcmtmbG93LXRodW1iLmhhcy1ncmFwaC1tYXAgLm1qci13b3JrZmxvdy10aHVtYi10aXRsZSwKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWNhcmQgLm1qci13b3JrZmxvdy10aHVtYi5oYXMtZ3JhcGgtbWFwIC5tanItd29ya2Zsb3ctdGh1bWItdGl0bGUgewogICAgcGFkZGluZzogMnB4IDdweDsKICAgIGJvcmRlci1yYWRpdXM6IDVweDsKICAgIGJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgMC4zNik7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hc3NldC1jYXJkIC5tanItd29ya2Zsb3ctdGh1bWIuaGFzLXRodW1ibmFpbCAucGksCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1jYXJkIC5tanItd29ya2Zsb3ctdGh1bWIuaGFzLXRodW1ibmFpbCAucGkgewogICAgZGlzcGxheTogbm9uZTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFzc2V0LWNhcmQgLm1qci13b3JrZmxvdy10aHVtYi5oYXMtZ3JhcGgtbWFwIC5waSwKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWNhcmQgLm1qci13b3JrZmxvdy10aHVtYi5oYXMtZ3JhcGgtbWFwIC5waSB7CiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgIG1hcmdpbi1ib3R0b206IDJweDsKICAgIGZvbnQtc2l6ZTogMS4xNXJlbTsKICAgIG9wYWNpdHk6IDAuNTU7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hc3NldC1jYXJkIC5tanItd29ya2Zsb3ctdGh1bWItdGl0bGUsCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1jYXJkIC5tanItd29ya2Zsb3ctdGh1bWItdGl0bGUgewogICAgbWF4LXdpZHRoOiAxMDAlOwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgIGZvbnQtc2l6ZTogMC44NHJlbTsKICAgIGZvbnQtd2VpZ2h0OiA4MDA7CiAgICBsaW5lLWhlaWdodDogMS4xOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYXNzZXQtY2FyZCAubWpyLXdvcmtmbG93LXRodW1iLW1ldGEsCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1jYXJkIC5tanItd29ya2Zsb3ctdGh1bWItbWV0YSB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgbWF4LXdpZHRoOiAxMDAlOwogICAgZmxleC13cmFwOiB3cmFwOwogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICBnYXA6IDRweDsKICAgIGZvbnQtc2l6ZTogMC42OHJlbTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFzc2V0LWNhcmQgLm1qci13b3JrZmxvdy10aHVtYi1tZXRhIHNwYW4sCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1jYXJkIC5tanItd29ya2Zsb3ctdGh1bWItbWV0YSBzcGFuLAoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYXNzZXQtY2FyZCAubWpyLW1ldGEtd29ya2Zsb3ctdGFzaywKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWNhcmQgLm1qci1tZXRhLXdvcmtmbG93LXRhc2ssCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hc3NldC1jYXJkIC5tanItbWV0YS13b3JrZmxvdy1zdWJncmFwaHMsCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1jYXJkIC5tanItbWV0YS13b3JrZmxvdy1zdWJncmFwaHMgewogICAgYm9yZGVyLXJhZGl1czogNHB4OwogICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEyKTsKICAgIHBhZGRpbmc6IDJweCA1cHg7CiAgICBtYXgtd2lkdGg6IDEwMCU7CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7CiAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYXNzZXQtY2FyZCAubWpyLXdvcmtmbG93LXRodW1iLW1ldGEgc3BhbjpudGgtY2hpbGQobiArIDQpLAoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItY2FyZCAubWpyLXdvcmtmbG93LXRodW1iLW1ldGEgc3BhbjpudGgtY2hpbGQobiArIDQpIHsKICAgIGRpc3BsYXk6IG5vbmU7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hc3NldC1jYXJkIC5tanItY2FyZC1tZXRhW2RhdGEtbWpyLWtpbmQ9IndvcmtmbG93Il0sCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1jYXJkIC5tanItY2FyZC1tZXRhW2RhdGEtbWpyLWtpbmQ9IndvcmtmbG93Il0gewogICAgcGFkZGluZzogN3B4IDlweCAhaW1wb3J0YW50Owp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYXNzZXQtY2FyZCAubWpyLWNhcmQtbWV0YVtkYXRhLW1qci1raW5kPSJ3b3JrZmxvdyJdIC5tanItY2FyZC1maWxlbmFtZSwKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWNhcmQgLm1qci1jYXJkLW1ldGFbZGF0YS1tanIta2luZD0id29ya2Zsb3ciXSAubWpyLWNhcmQtZmlsZW5hbWUgewogICAgbWFyZ2luLWJvdHRvbTogM3B4ICFpbXBvcnRhbnQ7CiAgICBmb250LXNpemU6IDAuNzhyZW0gIWltcG9ydGFudDsKICAgIGxpbmUtaGVpZ2h0OiAxLjE1ICFpbXBvcnRhbnQ7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hc3NldC1jYXJkIC5tanItY2FyZC1tZXRhW2RhdGEtbWpyLWtpbmQ9IndvcmtmbG93Il0gLm1qci1jYXJkLW1ldGEtcm93LAoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItY2FyZCAubWpyLWNhcmQtbWV0YVtkYXRhLW1qci1raW5kPSJ3b3JrZmxvdyJdIC5tanItY2FyZC1tZXRhLXJvdyB7CiAgICBmb250LXNpemU6IDAuNzJyZW0gIWltcG9ydGFudDsKICAgIG9wYWNpdHk6IDAuNzQgIWltcG9ydGFudDsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFzc2V0LWNhcmQgLm1qci1jYXJkLW1ldGFbZGF0YS1tanIta2luZD0id29ya2Zsb3ciXSAubWpyLWNhcmQtbWV0YS1yb3cgLm1qci1tZXRhLXdvcmtmbG93LXRhc2ssCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1jYXJkIC5tanItY2FyZC1tZXRhW2RhdGEtbWpyLWtpbmQ9IndvcmtmbG93Il0gLm1qci1jYXJkLW1ldGEtcm93IC5tanItbWV0YS13b3JrZmxvdy10YXNrIHsKICAgIGRpc3BsYXk6IG5vbmU7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hc3NldC1jYXJkIC5tanItd29ya2Zsb3ctbWlzc2luZy1jaGlwLAoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItY2FyZCAubWpyLXdvcmtmbG93LW1pc3NpbmctY2hpcCwKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFzc2V0LWNhcmQgLm1qci1tZXRhLXdvcmtmbG93LW1pc3NpbmcsCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1jYXJkIC5tanItbWV0YS13b3JrZmxvdy1taXNzaW5nIHsKICAgIGJhY2tncm91bmQ6IHJnYmEoMjU1LCAxOTAsIDY2LCAwLjI4KTsKICAgIGNvbG9yOiByZ2JhKDI1NSwgMjM2LCAxODAsIDAuOTgpOwogICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgyNTUsIDIwNiwgMTAxLCAwLjQ1KTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWdyaWQgLm1qci1ncmlkLWdyb3VwLXNlcGFyYXRvciB7CiAgICAtd2Via2l0LWFwcGVhcmFuY2U6IG5vbmU7CiAgICBhcHBlYXJhbmNlOiBub25lOwogICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiA4cHg7CiAgICB3aWR0aDogMTAwJTsKICAgIG1pbi1oZWlnaHQ6IDMwcHg7CiAgICBtYXJnaW46IDAgMCA4cHg7CiAgICBwYWRkaW5nOiA1cHggOXB4OwogICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSh2YXIoLS1tanItd29ya2Zsb3ctZ3JvdXAtYWNjZW50LXJnYiwgOTUsIDE3OSwgMjU1KSwgMC40Mik7CiAgICBib3JkZXItcmFkaXVzOiA3cHg7CiAgICBiYWNrZ3JvdW5kOgogICAgICAgIGxpbmVhci1ncmFkaWVudCgKICAgICAgICAgICAgMTM1ZGVnLAogICAgICAgICAgICByZ2JhKHZhcigtLW1qci13b3JrZmxvdy1ncm91cC1hY2NlbnQtcmdiLCA5NSwgMTc5LCAyNTUpLCAwLjIyKSwKICAgICAgICAgICAgcmdiYSh2YXIoLS1tanItd29ya2Zsb3ctZ3JvdXAtYWNjZW50LXJnYiwgOTUsIDE3OSwgMjU1KSwgMC4wOCkKICAgICAgICApLAogICAgICAgIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0yKSA3OCUsIHRyYW5zcGFyZW50KTsKICAgIGNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tY29udGVudC1mZywgI2ZmZikgOTIlLCB0cmFuc3BhcmVudCk7CiAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICBmb250OiBpbmhlcml0OwogICAgbGluZS1oZWlnaHQ6IDE7CiAgICB0ZXh0LWFsaWduOiBsZWZ0OwogICAgYm94LXNoYWRvdzogaW5zZXQgMCAxcHggMCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDgpOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItZ3JpZCAubWpyLWdyaWQtZ3JvdXAtc2VwYXJhdG9yOmhvdmVyIHsKICAgIGJvcmRlci1jb2xvcjogcmdiYSh2YXIoLS1tanItd29ya2Zsb3ctZ3JvdXAtYWNjZW50LXJnYiwgOTUsIDE3OSwgMjU1KSwgMC42Nik7CiAgICBiYWNrZ3JvdW5kOgogICAgICAgIGxpbmVhci1ncmFkaWVudCgKICAgICAgICAgICAgMTM1ZGVnLAogICAgICAgICAgICByZ2JhKHZhcigtLW1qci13b3JrZmxvdy1ncm91cC1hY2NlbnQtcmdiLCA5NSwgMTc5LCAyNTUpLCAwLjMpLAogICAgICAgICAgICByZ2JhKHZhcigtLW1qci13b3JrZmxvdy1ncm91cC1hY2NlbnQtcmdiLCA5NSwgMTc5LCAyNTUpLCAwLjEyKQogICAgICAgICksCiAgICAgICAgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTIpIDg0JSwgdHJhbnNwYXJlbnQpOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItZ3JpZCAubWpyLWdyaWQtZ3JvdXAtc2VwYXJhdG9yOmZvY3VzLXZpc2libGUgewogICAgb3V0bGluZTogMnB4IHNvbGlkIHJnYmEodmFyKC0tbWpyLXdvcmtmbG93LWdyb3VwLWFjY2VudC1yZ2IsIDk1LCAxNzksIDI1NSksIDAuNTUpOwogICAgb3V0bGluZS1vZmZzZXQ6IDJweDsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWdyaWQgLm1qci1ncmlkLWdyb3VwLXNlcGFyYXRvci0tYWNjZW50LTAgewogICAgLS1tanItd29ya2Zsb3ctZ3JvdXAtYWNjZW50LXJnYjogOTUsIDE3OSwgMjU1Owp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItZ3JpZCAubWpyLWdyaWQtZ3JvdXAtc2VwYXJhdG9yLS1hY2NlbnQtMSB7CiAgICAtLW1qci13b3JrZmxvdy1ncm91cC1hY2NlbnQtcmdiOiA1NSwgMjExLCAxNTY7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1ncmlkIC5tanItZ3JpZC1ncm91cC1zZXBhcmF0b3ItLWFjY2VudC0yIHsKICAgIC0tbWpyLXdvcmtmbG93LWdyb3VwLWFjY2VudC1yZ2I6IDI0NiwgMTc3LCA3NTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWdyaWQgLm1qci1ncmlkLWdyb3VwLXNlcGFyYXRvci0tYWNjZW50LTMgewogICAgLS1tanItd29ya2Zsb3ctZ3JvdXAtYWNjZW50LXJnYjogMjM4LCAxMDQsIDEzNjsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWdyaWQgLm1qci1ncmlkLWdyb3VwLXNlcGFyYXRvci0tYWNjZW50LTQgewogICAgLS1tanItd29ya2Zsb3ctZ3JvdXAtYWNjZW50LXJnYjogMTU3LCAxMzIsIDIzODsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWdyaWQgLm1qci1ncmlkLWdyb3VwLXNlcGFyYXRvci0tYWNjZW50LTUgewogICAgLS1tanItd29ya2Zsb3ctZ3JvdXAtYWNjZW50LXJnYjogNzEsIDE5NywgMjIyOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItZ3JpZCAubWpyLWdyaWQtZ3JvdXAtc2VwYXJhdG9yLS1hY2NlbnQtNiB7CiAgICAtLW1qci13b3JrZmxvdy1ncm91cC1hY2NlbnQtcmdiOiAxNDksIDIwNywgODE7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1ncmlkIC5tanItZ3JpZC1ncm91cC1zZXBhcmF0b3ItLWFjY2VudC03IHsKICAgIC0tbWpyLXdvcmtmbG93LWdyb3VwLWFjY2VudC1yZ2I6IDI0MiwgMTMwLCA3ODsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWdyaWQgLm1qci1ncmlkLWdyb3VwLXNlcGFyYXRvci1jaGV2cm9uIHsKICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgZmxleDogMCAwIGF1dG87CiAgICB3aWR0aDogMThweDsKICAgIGhlaWdodDogMThweDsKICAgIGJvcmRlci1yYWRpdXM6IDk5OXB4OwogICAgY29sb3I6IHJnYih2YXIoLS1tanItd29ya2Zsb3ctZ3JvdXAtYWNjZW50LXJnYiwgOTUsIDE3OSwgMjU1KSk7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKHZhcigtLW1qci13b3JrZmxvdy1ncm91cC1hY2NlbnQtcmdiLCA5NSwgMTc5LCAyNTUpLCAwLjE0KTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWdyaWQgLm1qci1ncmlkLWdyb3VwLXNlcGFyYXRvci1jaGV2cm9uID4gLnBpIHsKICAgIGZvbnQtc2l6ZTogMTBweDsKICAgIGxpbmUtaGVpZ2h0OiAxOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItZ3JpZCAubWpyLWdyaWQtZ3JvdXAtc2VwYXJhdG9yLXRpdGxlIHsKICAgIG1pbi13aWR0aDogMDsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICBmb250LXNpemU6IDEycHg7CiAgICBmb250LXdlaWdodDogODAwOwp9CgoubWpyLXdvcmtmbG93LXBpY2tlci1iYWNrZHJvcCB7CiAgICBwb3NpdGlvbjogZml4ZWQ7CiAgICBpbnNldDogMDsKICAgIHotaW5kZXg6IDk5OTk5OTsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICBwYWRkaW5nOiAyNHB4OwogICAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjU4KTsKICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7Cn0KCi5tanItd29ya2Zsb3ctcGlja2VyLWRpYWxvZyB7CiAgICB3aWR0aDogbWluKDkyMHB4LCA5NnZ3KTsKICAgIG1heC1oZWlnaHQ6IG1pbig3NjBweCwgOTJ2aCk7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTQpOwogICAgYm9yZGVyLXJhZGl1czogMTBweDsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0wLCAjMTExNDE4KSA5NiUsICMwMDApOwogICAgY29sb3I6IHZhcigtLWNvbnRlbnQtZmcsICNmNWY1ZjUpOwogICAgYm94LXNoYWRvdzogMCAxOHB4IDYwcHggcmdiYSgwLCAwLCAwLCAwLjQ4KTsKfQoKLm1qci13b3JrZmxvdy1pbmZvLWRpYWxvZyB7CiAgICB3aWR0aDogbWluKDU2MHB4LCA5NnZ3KTsKfQoKLm1qci13b3JrZmxvdy1pbmZvLWZvcm0gewogICAgZGlzcGxheTogZ3JpZDsKICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogcmVwZWF0KDIsIG1pbm1heCgwLCAxZnIpKTsKICAgIGdhcDogMTJweDsKICAgIHBhZGRpbmc6IDE0cHggMThweCA0cHg7Cn0KCi5tanItd29ya2Zsb3ctaW5mby1mb3JtIGxhYmVsIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgZ2FwOiA2cHg7CiAgICBtaW4td2lkdGg6IDA7Cn0KCi5tanItd29ya2Zsb3ctaW5mby1mb3JtIGxhYmVsLmlzLXdpZGUgewogICAgZ3JpZC1jb2x1bW46IDEgLyAtMTsKfQoKLm1qci13b3JrZmxvdy1pbmZvLWZvcm0gc3BhbiB7CiAgICBjb2xvcjogcmdiYSgyNTUsMjU1LDI1NSwwLjY0KTsKICAgIGZvbnQtc2l6ZTogMTFweDsKICAgIGZvbnQtd2VpZ2h0OiA3NTA7CiAgICBsZXR0ZXItc3BhY2luZzogLjA0ZW07CiAgICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOwp9CgoubWpyLXdvcmtmbG93LWluZm8tZm9ybSBpbnB1dCwKLm1qci13b3JrZmxvdy1pbmZvLWZvcm0gc2VsZWN0LAoubWpyLXdvcmtmbG93LWluZm8tZm9ybSB0ZXh0YXJlYSB7CiAgICB3aWR0aDogMTAwJTsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjU1LDI1NSwyNTUsMC4xMik7CiAgICBib3JkZXItcmFkaXVzOiA4cHg7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDAsMCwwLDAuMjYpOwogICAgY29sb3I6IHJnYmEoMjU1LDI1NSwyNTUsMC45Mik7CiAgICBmb250OiBpbmhlcml0OwogICAgZm9udC1zaXplOiAxM3B4OwogICAgcGFkZGluZzogOXB4IDEwcHg7CiAgICBvdXRsaW5lOiBub25lOwp9CgoubWpyLXdvcmtmbG93LWluZm8tZm9ybSB0ZXh0YXJlYSB7CiAgICByZXNpemU6IHZlcnRpY2FsOwogICAgbWluLWhlaWdodDogOTZweDsKfQoKLm1qci13b3JrZmxvdy1waWNrZXItaGVhZGVyLAoubWpyLXdvcmtmbG93LXBpY2tlci1mb290ZXIgewogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47CiAgICBnYXA6IDEycHg7CiAgICBwYWRkaW5nOiAxMnB4IDE0cHg7CiAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEpOwp9CgoubWpyLXdvcmtmbG93LXBpY2tlci1mb290ZXIgewogICAganVzdGlmeS1jb250ZW50OiBmbGV4LWVuZDsKICAgIGJvcmRlci10b3A6IDFweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMSk7CiAgICBib3JkZXItYm90dG9tOiAwOwp9CgoubWpyLXdvcmtmbG93LXBpY2tlci10aXRsZSB7CiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBnYXA6IDlweDsKICAgIG1pbi13aWR0aDogMDsKICAgIGZvbnQtc2l6ZTogMTVweDsKICAgIGZvbnQtd2VpZ2h0OiA4MDA7Cn0KCi5tanItd29ya2Zsb3ctcGlja2VyLWljb24tYnRuLAoubWpyLXdvcmtmbG93LXBpY2tlci1idG4gewogICAgYXBwZWFyYW5jZTogbm9uZTsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xOCk7CiAgICBib3JkZXItcmFkaXVzOiA3cHg7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMiwgIzI1MjgyZCkgODglLCB0cmFuc3BhcmVudCk7CiAgICBjb2xvcjogdmFyKC0tY29udGVudC1mZywgI2Y1ZjVmNSk7CiAgICBjdXJzb3I6IHBvaW50ZXI7Cn0KCi5tanItd29ya2Zsb3ctcGlja2VyLWljb24tYnRuIHsKICAgIHdpZHRoOiAzMnB4OwogICAgaGVpZ2h0OiAzMnB4Owp9CgoubWpyLXdvcmtmbG93LXBpY2tlci1idG4gewogICAgbWluLWhlaWdodDogMzJweDsKICAgIHBhZGRpbmc6IDAgMTJweDsKICAgIGZvbnQtd2VpZ2h0OiA3MDA7Cn0KCi5tanItd29ya2Zsb3ctcGlja2VyLWJ0bi5pcy1wcmltYXJ5IHsKICAgIGJvcmRlci1jb2xvcjogcmdiYSg3NywgMTcxLCAyNDcsIDAuNyk7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDc3LCAxNzEsIDI0NywgMC4yMik7Cn0KCi5tanItd29ya2Zsb3ctcGlja2VyLWJ0bjpkaXNhYmxlZCB7CiAgICBjdXJzb3I6IG5vdC1hbGxvd2VkOwogICAgb3BhY2l0eTogMC40NTsKfQoKLm1qci13b3JrZmxvdy1waWNrZXItc291cmNlIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBnYXA6IDhweDsKICAgIHBhZGRpbmc6IDhweCAxNHB4OwogICAgY29sb3I6IHZhcigtLW1qci1tdXRlZCwgI2FlYjNiZCk7CiAgICBmb250LXNpemU6IDEycHg7CiAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA4KTsKfQoKLm1qci13b3JrZmxvdy1waWNrZXItc291cmNlIHN0cm9uZyB7CiAgICBtaW4td2lkdGg6IDA7CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7CiAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgY29sb3I6IHZhcigtLWNvbnRlbnQtZmcsICNmNWY1ZjUpOwp9CgoubWpyLXdvcmtmbG93LXBpY2tlci10b29sYmFyIHsKICAgIGRpc3BsYXk6IGdyaWQ7CiAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IG1pbm1heCgxODBweCwgMWZyKSByZXBlYXQoMywgbWlubWF4KDExMHB4LCAxNTBweCkpOwogICAgZ2FwOiA4cHg7CiAgICBwYWRkaW5nOiAxMnB4IDE0cHg7Cn0KCi5tanItd29ya2Zsb3ctcGlja2VyLWRpYWxvZy5pcy1hc3NldC1tb2RlIC5tanItd29ya2Zsb3ctcGlja2VyLXRvb2xiYXIgewogICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiBtaW5tYXgoMTgwcHgsIDFmcik7Cn0KCi5tanItd29ya2Zsb3ctcGlja2VyLXNlYXJjaCwKLm1qci13b3JrZmxvdy1waWNrZXItdG9vbGJhciBzZWxlY3QgewogICAgbWluLWhlaWdodDogMzRweDsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xNCk7CiAgICBib3JkZXItcmFkaXVzOiA3cHg7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMSwgIzE3MWExZikgOTIlLCAjMDAwKTsKICAgIGNvbG9yOiB2YXIoLS1jb250ZW50LWZnLCAjZjVmNWY1KTsKfQoKLm1qci13b3JrZmxvdy1waWNrZXItc2VhcmNoIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiA4cHg7CiAgICBwYWRkaW5nOiAwIDEwcHg7Cn0KCi5tanItd29ya2Zsb3ctcGlja2VyLXNlYXJjaCBpbnB1dCB7CiAgICB3aWR0aDogMTAwJTsKICAgIG1pbi13aWR0aDogMDsKICAgIGJvcmRlcjogMDsKICAgIG91dGxpbmU6IDA7CiAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsKICAgIGNvbG9yOiBpbmhlcml0Owp9CgoubWpyLXdvcmtmbG93LXBpY2tlci10b29sYmFyIHNlbGVjdCB7CiAgICBwYWRkaW5nOiAwIDhweDsKfQoKLm1qci13b3JrZmxvdy1waWNrZXItYm9keSB7CiAgICBmbGV4OiAxIDEgYXV0bzsKICAgIG1pbi1oZWlnaHQ6IDI2MHB4OwogICAgb3ZlcmZsb3c6IGF1dG87CiAgICBkaXNwbGF5OiBncmlkOwogICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiByZXBlYXQoYXV0by1maWxsLCBtaW5tYXgoMTgwcHgsIDFmcikpOwogICAgYWxpZ24tY29udGVudDogc3RhcnQ7CiAgICBnYXA6IDEwcHg7CiAgICBwYWRkaW5nOiAwIDE0cHggMTRweDsKfQoKLm1qci13b3JrZmxvdy1waWNrZXItY2FyZCB7CiAgICBhcHBlYXJhbmNlOiBub25lOwogICAgZGlzcGxheTogZ3JpZDsKICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogNjhweCBtaW5tYXgoMCwgMWZyKTsKICAgIGdhcDogMTBweDsKICAgIG1pbi1oZWlnaHQ6IDg0cHg7CiAgICBwYWRkaW5nOiA4cHg7CiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTIpOwogICAgYm9yZGVyLXJhZGl1czogOHB4OwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTEsICMxNzFhMWYpIDkyJSwgdHJhbnNwYXJlbnQpOwogICAgY29sb3I6IGluaGVyaXQ7CiAgICB0ZXh0LWFsaWduOiBsZWZ0OwogICAgY3Vyc29yOiBwb2ludGVyOwp9CgoubWpyLXdvcmtmbG93LXBpY2tlci1kaWFsb2cuaXMtYXNzZXQtbW9kZSAubWpyLXdvcmtmbG93LXBpY2tlci1jYXJkIHsKICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogNzZweCBtaW5tYXgoMCwgMWZyKTsKfQoKLm1qci13b3JrZmxvdy1waWNrZXItY2FyZDpob3ZlciwKLm1qci13b3JrZmxvdy1waWNrZXItY2FyZC5pcy1zZWxlY3RlZCB7CiAgICBib3JkZXItY29sb3I6IHJnYmEoNzcsIDE3MSwgMjQ3LCAwLjcyKTsKICAgIGJhY2tncm91bmQ6IHJnYmEoNzcsIDE3MSwgMjQ3LCAwLjEyKTsKfQoKLm1qci13b3JrZmxvdy1waWNrZXItdGh1bWIgewogICAgd2lkdGg6IDY4cHg7CiAgICBhc3BlY3QtcmF0aW86IDEgLyAxOwogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICBib3JkZXItcmFkaXVzOiA2cHg7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDYpOwp9CgoubWpyLXdvcmtmbG93LXBpY2tlci10aHVtYiBpbWcgewogICAgd2lkdGg6IDEwMCU7CiAgICBoZWlnaHQ6IDEwMCU7CiAgICBvYmplY3QtZml0OiBjb3ZlcjsKfQoKLm1qci13b3JrZmxvdy1waWNrZXItY2FyZC1pbmZvIHsKICAgIG1pbi13aWR0aDogMDsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICBnYXA6IDRweDsKfQoKLm1qci13b3JrZmxvdy1waWNrZXItY2FyZC1pbmZvIHN0cm9uZywKLm1qci13b3JrZmxvdy1waWNrZXItY2FyZC1pbmZvIHNwYW4sCi5tanItd29ya2Zsb3ctcGlja2VyLWNhcmQtaW5mbyBzbWFsbCB7CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7CiAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwp9CgoubWpyLXdvcmtmbG93LXBpY2tlci1jYXJkLWluZm8gc3Ryb25nIHsKICAgIGZvbnQtc2l6ZTogMTNweDsKfQoKLm1qci13b3JrZmxvdy1waWNrZXItY2FyZC1pbmZvIHNwYW4sCi5tanItd29ya2Zsb3ctcGlja2VyLWNhcmQtaW5mbyBzbWFsbCB7CiAgICBjb2xvcjogdmFyKC0tbWpyLW11dGVkLCAjYWViM2JkKTsKICAgIGZvbnQtc2l6ZTogMTFweDsKfQoKLm1qci13b3JrZmxvdy1waWNrZXItZW1wdHkgewogICAgZ3JpZC1jb2x1bW46IDEgLyAtMTsKICAgIHBhZGRpbmc6IDMycHg7CiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgICBjb2xvcjogdmFyKC0tbWpyLW11dGVkLCAjYWViM2JkKTsKfQoKLm1qci13b3JrZmxvdy1waWNrZXItZW1wdHkuaXMtZXJyb3IgewogICAgY29sb3I6ICNmZmI0YjQ7Cn0KCkBtZWRpYSAobWF4LXdpZHRoOiA3MjBweCkgewogICAgLm1qci13b3JrZmxvdy1waWNrZXItYmFja2Ryb3AgewogICAgICAgIHBhZGRpbmc6IDEwcHg7CiAgICB9CgogICAgLm1qci13b3JrZmxvdy1waWNrZXItdG9vbGJhciB7CiAgICAgICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiAxZnIgMWZyOwogICAgfQoKICAgIC5tanItd29ya2Zsb3ctcGlja2VyLXNlYXJjaCB7CiAgICAgICAgZ3JpZC1jb2x1bW46IDEgLyAtMTsKICAgIH0KfQoKLyogS2VlcCBnZW5lcmF0aW9uLXRpbWUgYmFkZ2UgcGlubmVkIHRvIHRoZSB0aHVtYm5haWwgY29ybmVyIGFjcm9zcyBncmlkL2ZlZWQgdmFyaWFudHMuICovCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci10aHVtYiA+IC5tanItZ2VudGltZS1iYWRnZSwKLm1qci1ib3R0b20tZmVlZCAubWpyLXRodW1iID4gLm1qci1nZW50aW1lLWJhZGdlIHsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZSAhaW1wb3J0YW50OwogICAgcmlnaHQ6IDZweCAhaW1wb3J0YW50OwogICAgYm90dG9tOiA2cHggIWltcG9ydGFudDsKICAgIGxlZnQ6IGF1dG8gIWltcG9ydGFudDsKICAgIHRvcDogYXV0byAhaW1wb3J0YW50OwogICAgei1pbmRleDogMTAgIWltcG9ydGFudDsKICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIHBhZGRpbmc6IDJweCA2cHggIWltcG9ydGFudDsKICAgIGJvcmRlci1yYWRpdXM6IDRweCAhaW1wb3J0YW50OwogICAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjU1KSAhaW1wb3J0YW50OwogICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEyKSAhaW1wb3J0YW50OwogICAgZm9udC1zaXplOiAxMHB4OwogICAgZm9udC13ZWlnaHQ6IDgwMCAhaW1wb3J0YW50OwogICAgbGV0dGVyLXNwYWNpbmc6IDAuMDE1ZW07CiAgICBsaW5lLWhlaWdodDogMS4xOwogICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICBib3gtc2hhZG93OiAwIDJweCA0cHggcmdiYSgwLCAwLCAwLCAwLjMpOwogICAgdGV4dC1zaGFkb3c6CiAgICAgICAgMCAxcHggMnB4IHJnYmEoMCwgMCwgMCwgMC45KSwKICAgICAgICAwIDAgMTBweCBjb2xvci1taXgoaW4gc3JnYiwgY3VycmVudENvbG9yIDM1JSwgdHJhbnNwYXJlbnQpOwogICAgYmFja2Ryb3AtZmlsdGVyOiBibHVyKDJweCk7CiAgICAtd2Via2l0LWJhY2tkcm9wLWZpbHRlcjogYmx1cigycHgpOwp9CgovKiBLZWVwIHJhdGluZy90YWdzIGJhZGdlcyBhbmNob3JlZC4gRG8gbm90IGZvcmNlIGRpc3BsYXkgaGVyZSBzbyBncmlkIHZpc2liaWxpdHkgdG9nZ2xlcyBzdGlsbCBjb250cm9sIHNob3cvaGlkZS4gKi8KLm1qci1hc3NldHMtbWFuYWdlciAubWpyLXRodW1iID4gLm1qci1yYXRpbmctYmFkZ2UsCi5tanItYm90dG9tLWZlZWQgLm1qci10aHVtYiA+IC5tanItcmF0aW5nLWJhZGdlIHsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZSAhaW1wb3J0YW50OwogICAgdG9wOiA2cHggIWltcG9ydGFudDsKICAgIHJpZ2h0OiA2cHggIWltcG9ydGFudDsKICAgIGxlZnQ6IGF1dG8gIWltcG9ydGFudDsKICAgIGJvdHRvbTogYXV0byAhaW1wb3J0YW50OwogICAgei1pbmRleDogMTAgIWltcG9ydGFudDsKICAgIGJvcmRlci1yYWRpdXM6IDZweDsKICAgIGJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgMC41NSk7CiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTIpOwogICAgcGFkZGluZzogMnB4IDZweDsKICAgIGZvbnQtc2l6ZTogMTNweDsKICAgIGxldHRlci1zcGFjaW5nOiAxcHg7CiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgYm94LXNoYWRvdzogMCA2cHggMThweCByZ2JhKDAsIDAsIDAsIDAuMjUpOwogICAgdGV4dC1zaGFkb3c6IDAgMnB4IDZweCByZ2JhKDAsIDAsIDAsIDAuNik7CiAgICBhbmltYXRpb246IG1qci1mYWRlLWluIDAuMnMgZWFzZS1vdXQ7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci10aHVtYiA+IC5tanItdGFncy1iYWRnZSwKLm1qci1ib3R0b20tZmVlZCAubWpyLXRodW1iID4gLm1qci10YWdzLWJhZGdlIHsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZSAhaW1wb3J0YW50OwogICAgbGVmdDogNnB4ICFpbXBvcnRhbnQ7CiAgICBib3R0b206IDZweCAhaW1wb3J0YW50OwogICAgcmlnaHQ6IGF1dG8gIWltcG9ydGFudDsKICAgIHRvcDogYXV0byAhaW1wb3J0YW50OwogICAgei1pbmRleDogMTAgIWltcG9ydGFudDsKICAgIHBhZGRpbmc6IDNweCA2cHg7CiAgICBmb250LXNpemU6IDlweDsKICAgIG1heC13aWR0aDogY2FsYygxMDAlIC0gNTZweCk7CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7CiAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICBib3JkZXItcmFkaXVzOiA0cHg7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIDAuOCk7CiAgICBib3gtc2hhZG93OiAwIDJweCA0cHggcmdiYSgwLCAwLCAwLCAwLjMpOwogICAgYW5pbWF0aW9uOiBtanItZmFkZS1pbiAwLjJzIGVhc2Utb3V0Owp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItdGh1bWItcGxheSB7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICBpbnNldDogMDsKICAgIGRpc3BsYXk6IGdyaWQ7CiAgICBwbGFjZS1pdGVtczogY2VudGVyOwogICAgZm9udC1zaXplOiAyOHB4OwogICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC45KTsKICAgIHRleHQtc2hhZG93OiAwIDAgMTBweCByZ2JhKDAsIDAsIDAsIDAuNyk7CiAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgIHRyYW5zaXRpb246IG9wYWNpdHkgMTIwbXMgZWFzZTsKfQoKLyogLS0tIEhvdmVyIGluZm8gb3ZlcmxheSAocG9zaXRpdmUgcHJvbXB0ICsgZ2VuIHRpbWUpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgIFNsaWRlcyB1cCBmcm9tIHRoZSBib3R0b20gb2YgLm1qci10aHVtYiBvbiBjYXJkIGhvdmVyLgogICBwb2ludGVyLWV2ZW50czogbm9uZSAgLT4gbmV2ZXIgYmxvY2tzIHZpZGVvIG1vdXNlZW50ZXIgLyBwbGF5LW9uLWhvdmVyLgogICB6LWluZGV4OiAyICAgICAgICAgICAtPiBzaXRzIGFib3ZlIHRoZSB0aHVtYm5haWwgaW1hZ2UsIGJlbG93IHRoZSBwbGF5IGljb24uCiAgIENvbnRyb2xsZWQgYnkgdGhlIC5tanItc2hvdy1ob3Zlci1pbmZvIGNsYXNzIG9uIHRoZSBncmlkIGNvbnRhaW5lciwgd2hpY2gKICAgaXMgdG9nZ2xlZCB2aWEgdGhlICJTaG93IHByb21wdCBvbiBob3ZlciIgc2V0dGluZy4KICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1jYXJkLWhvdmVyLWluZm8gewogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgYm90dG9tOiAwOwogICAgbGVmdDogMDsKICAgIHJpZ2h0OiAwOwogICAgcGFkZGluZzogMjJweCA4cHggN3B4OwogICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KHRvIGJvdHRvbSwgdHJhbnNwYXJlbnQgMCUsIHJnYmEoMCwgMCwgMCwgMC43OCkgMTAwJSk7CiAgICBjb2xvcjogI2ZmZjsKICAgIGZvbnQtc2l6ZTogMTBweDsKICAgIGxpbmUtaGVpZ2h0OiAxLjQ7CiAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgIG9wYWNpdHk6IDA7CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoNXB4KTsKICAgIHRyYW5zaXRpb246CiAgICAgICAgb3BhY2l0eSAxNTBtcyBlYXNlLAogICAgICAgIHRyYW5zZm9ybSAxNTBtcyBlYXNlOwogICAgZGlzcGxheTogZmxleDsKICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICBnYXA6IDNweDsKICAgIHotaW5kZXg6IDI7Cn0KLyogT25seSByZXZlYWwgb24gaG92ZXIgd2hlbiB0aGUgc2V0dGluZyBpcyBlbmFibGVkIChjbGFzcyBvbiBncmlkIGNvbnRhaW5lcikgKi8KLm1qci1ncmlkLm1qci1zaG93LWhvdmVyLWluZm8gLm1qci1jYXJkOmhvdmVyIC5tanItY2FyZC1ob3Zlci1pbmZvIHsKICAgIG9wYWNpdHk6IDE7CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoMCk7Cn0KLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWNhcmQtaG92ZXItaW5mbyAubWpyLWhvdmVyLXByb21wdCB7CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgZGlzcGxheTogLXdlYmtpdC1ib3g7CiAgICAtd2Via2l0LWxpbmUtY2xhbXA6IDI7CiAgICAtd2Via2l0LWJveC1vcmllbnQ6IHZlcnRpY2FsOwogICAgd29yZC1icmVhazogYnJlYWstd29yZDsKICAgIG9wYWNpdHk6IDAuOTsKICAgIGZvbnQtc2l6ZTogOS41cHg7Cn0KLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWNhcmQtaG92ZXItaW5mbyAubWpyLWhvdmVyLWdlbnRpbWUgewogICAgY29sb3I6IHJnYmEoMjU1LCAyMTAsIDEyMCwgMC45NSk7CiAgICBmb250LXdlaWdodDogNjAwOwogICAgZm9udC1zaXplOiA5cHg7CiAgICBsZXR0ZXItc3BhY2luZzogMC4wMmVtOwp9CkBtZWRpYSAocHJlZmVycy1yZWR1Y2VkLW1vdGlvbjogcmVkdWNlKSB7CiAgICAubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItY2FyZC1ob3Zlci1pbmZvIHsKICAgICAgICB0cmFuc2l0aW9uOiBvcGFjaXR5IDBtczsKICAgICAgICB0cmFuc2Zvcm06IG5vbmU7CiAgICB9Cn0KCi8qIC0tLSBDYXJkIGRldGFpbHMgcGFuZWwgc2hvdy9oaWRlIHZpYSBncmlkIGNvbnRhaW5lciBjbGFzcyAtLS0tLS0tLS0tLS0tLS0tCiAgIC5tanItc2hvdy1kZXRhaWxzIGlzIHRvZ2dsZWQgYnkgYXBwbHlHcmlkU2V0dGluZ3NDbGFzc2VzKCkgd2hlbiB0aGUKICAgIlNob3cgbWV0YWRhdGEgcGFuZWwiIHNldHRpbmcgY2hhbmdlcy4gIERlZmF1bHQgPSBPRkYg4oaSIHBhbmVsIGhpZGRlbi4KICAgSGlkaW5nIGhlcmUga2VlcHMgYWN0dWFsIHJvdyBoZWlnaHQgPSBlc3RpbWF0ZVJvd0hlaWdodChtZXRhSGVpZ2h0PTApLAogICBwcmV2ZW50aW5nIHRoZSB2aXJ0dWFsaXplciBmcm9tIHJlcG9zaXRpb25pbmcgYWxsIHJvd3Mgb24gbWVhc3VyZQogICAod2hpY2ggd2FzIHRoZSByb290IGNhdXNlIG9mIHRoZSAicmVsb2FkIGltcHJlc3Npb24iIGJsaW5rKS4KICAgTWF0Y2ggdGhlIGJvdHRvbS1mZWVkIHBhdHRlcm4gYXQgLm1qci1ib3R0b20tZmVlZCAubWpyLWNhcmQtaW5mby4KICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1ncmlkIC5tanItY2FyZC1pbmZvIHsKICAgIGRpc3BsYXk6IG5vbmU7Cn0KLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWdyaWQubWpyLXNob3ctZGV0YWlscyAubWpyLWNhcmQtaW5mbyB7CiAgICBkaXNwbGF5OiBibG9jazsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWNhcmQtbWV0YSB7CiAgICBwYWRkaW5nOiA4cHggMTBweDsKICAgIGZvbnQtc2l6ZTogMTFweDsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWNhcmQtZmlsZW5hbWUgewogICAgZm9udC13ZWlnaHQ6IDYwMDsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogOHB4OwogICAgbWluLXdpZHRoOiAwOwogICAgbWFyZ2luLWJvdHRvbTogMnB4Owp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItY2FyZC1kZXRhaWxzIHsKICAgIGNvbG9yOiB2YXIoLS1tanItbXV0ZWQpOwogICAgZm9udC1zaXplOiAxMHB4OwogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKICAgIG9wYWNpdHk6IDAuODsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWNhcmQtZmlsZW5hbWUtdGV4dCB7CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7CiAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgbWluLXdpZHRoOiAwOwp9CgovKiBSYXRpbmcgJiBUYWdzIEVkaXRvcnMgKi8KQGtleWZyYW1lcyBmYWRlSW4gewogICAgZnJvbSB7CiAgICAgICAgb3BhY2l0eTogMDsKICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTRweCk7CiAgICB9CiAgICB0byB7CiAgICAgICAgb3BhY2l0eTogMTsKICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoMCk7CiAgICB9Cn0KLyoqCiAqIEFyY2hpdmVkIENTUyBTdHlsZXMgLSBSYXRpbmcgYW5kIFRhZ3MKICogVGhlc2Ugc3R5bGVzIHdlcmUgcmVtb3ZlZCBmcm9tIHRoZW1lLWNvbWZ5LmNzcwogKi8KCi8qIEFuaW1hdGlvbnMgKi8KQGtleWZyYW1lcyBzbGlkZUluUmlnaHQgewogICAgZnJvbSB7CiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKDEwMCUpOwogICAgICAgIG9wYWNpdHk6IDA7CiAgICB9CiAgICB0byB7CiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKDApOwogICAgICAgIG9wYWNpdHk6IDE7CiAgICB9Cn0KCi8qIFBvcG92ZXJzICovCi5tanItcmF0aW5nLXBvcG92ZXIsCi5tanItdGFncy1wb3BvdmVyIHsKICAgIGFuaW1hdGlvbjogZmFkZUluIDAuMnMgZWFzZTsKfQoKLm1qci1yYXRpbmctcG9wb3ZlciwKLm1qci10YWdzLXBvcG92ZXIgewogICAgYmFja2dyb3VuZDogdmFyKC0tY29tZnktbWVudS1iZywgIzJhMmEyYSk7CiAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXItY29sb3IsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xMikpOwogICAgYm9yZGVyLXJhZGl1czogdmFyKC0tcmFkaXVzLWxnLCAwLjVyZW0pOwogICAgYm94LXNoYWRvdzogMCAxMnB4IDI4cHggcmdiYSgwLCAwLCAwLCAwLjM1KTsKICAgIHBhZGRpbmc6IDhweDsKfQoKLyogUmF0aW5nIEVkaXRvciAqLwoubWpyLXJhdGluZy1lZGl0b3IgewogICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiA0cHg7CiAgICBwYWRkaW5nOiAycHg7Cn0KCi5tanItcmF0aW5nLXN0YXIgewogICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7CiAgICBib3JkZXI6IDFweCBzb2xpZCB0cmFuc3BhcmVudDsKICAgIGJvcmRlci1yYWRpdXM6IDhweDsKICAgIGZvbnQtc2l6ZTogMjBweDsKICAgIGN1cnNvcjogcG9pbnRlcjsKICAgIHBhZGRpbmc6IDRweCA2cHg7CiAgICBsaW5lLWhlaWdodDogMTsKICAgIGNvbG9yOiB2YXIoLS1pbnB1dC10ZXh0LCAjZGRkKTsKICAgIHRyYW5zaXRpb246CiAgICAgICAgdHJhbnNmb3JtIDEyMG1zIGVhc2UsCiAgICAgICAgYmFja2dyb3VuZC1jb2xvciAxMjBtcyBlYXNlLAogICAgICAgIGJvcmRlci1jb2xvciAxMjBtcyBlYXNlLAogICAgICAgIGNvbG9yIDEyMG1zIGVhc2U7CiAgICBvdXRsaW5lOiBub25lOwp9CgoubWpyLXJhdGluZy1zdGFyOmhvdmVyIHsKICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLWNvbWZ5LWFjY2VudCwgIzVmYjNmZikgMzUlLCB0cmFuc3BhcmVudCk7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tY29tZnktbWVudS1zZWNvbmRhcnktYmcsICMzMzMpIDY1JSwgdHJhbnNwYXJlbnQpOwp9CgoubWpyLXJhdGluZy1lZGl0b3IgLm1qci1yYXRpbmctc3Rhcjpob3ZlciB7CiAgICB0cmFuc2Zvcm06IHNjYWxlKDEuMikgIWltcG9ydGFudDsKfQoKLm1qci1yYXRpbmctZWRpdG9yIC5tanItcmF0aW5nLXN0YXI6Zm9jdXMtdmlzaWJsZSB7CiAgICBvdXRsaW5lOiAycHggc29saWQgdmFyKC0tZm9jdXMtb3V0bGluZS1jb2xvciwgIzRkYWJmNyk7CiAgICBvdXRsaW5lLW9mZnNldDogMnB4OwogICAgYm9yZGVyLXJhZGl1czogMnB4Owp9CgoubWpyLXJhdGluZy1lZGl0b3IgLm1qci1yYXRpbmctc3RhcjphY3RpdmUgewogICAgdHJhbnNmb3JtOiBzY2FsZSgwLjk1KSAhaW1wb3J0YW50Owp9CgovKiBUYWdzIEVkaXRvciAqLwoubWpyLXRhZ3MtZWRpdG9yIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgZ2FwOiA4cHg7CiAgICBwYWRkaW5nOiAxMnB4OwogICAgYmFja2dyb3VuZDogdmFyKC0tbWpyLXN1cmZhY2UtMSwgdmFyKC0tY29tZnktbWVudS1iZywgIzJhMmEyYSkpOwogICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tbWpyLWJvcmRlcik7CiAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1tanItci1zbSk7CiAgICBib3gtc2hhZG93OiAwIDEycHggMjhweCByZ2JhKDAsIDAsIDAsIDAuNDUpOwogICAgbWluLXdpZHRoOiAyNTBweDsKICAgIG1heC13aWR0aDogbWluKDM1MHB4LCBjYWxjKDEwMHZ3IC0gMjBweCkpOwogICAgZm9udC1mYW1pbHk6IGluaGVyaXQ7Cn0KCi5tanItdGFncy1lZGl0b3IuaXMtZGlzYWJsZWQgewogICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICBvcGFjaXR5OiAwLjc7Cn0KCi5tanItdGFncy1kaXNwbGF5IHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBmbGV4LXdyYXA6IHdyYXA7CiAgICBnYXA6IDZweDsKICAgIG1pbi1oZWlnaHQ6IDMycHg7Cn0KCi5tanItdGFncy1lbXB0eSB7CiAgICBjb2xvcjogdmFyKC0tbWpyLW11dGVkKTsKICAgIGZvbnQtc2l6ZTogMTJweDsKICAgIGZvbnQtc3R5bGU6IGl0YWxpYzsKfQoKLm1qci10YWctY2hpcCB7CiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBnYXA6IDRweDsKICAgIHBhZGRpbmc6IDRweCA4cHg7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXRhZy1jb2xvcikgMjQlLCB0cmFuc3BhcmVudCk7CiAgICBib3JkZXI6IDFweCBzb2xpZCBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXRhZy1jb2xvcikgNDAlLCB2YXIoLS1tanItYm9yZGVyKSk7CiAgICBib3JkZXItcmFkaXVzOiAxMnB4OwogICAgZm9udC1zaXplOiAxMXB4OwogICAgY29sb3I6IHZhcigtLW1qci10YWctY29sb3IpOwogICAgdHJhbnNpdGlvbjogYWxsIDAuMnMgZWFzZTsKfQoKLm1qci10YWctY2hpcC1yZW1vdmUgewogICAgYXBwZWFyYW5jZTogbm9uZTsKICAgIC13ZWJraXQtYXBwZWFyYW5jZTogbm9uZTsKICAgIGJhY2tncm91bmQ6IG5vbmU7CiAgICBib3JkZXI6IDA7CiAgICBib3JkZXItcmFkaXVzOiAwOwogICAgYm94LXNoYWRvdzogbm9uZTsKICAgIGNvbG9yOiBpbmhlcml0OwogICAgY3Vyc29yOiBwb2ludGVyOwogICAgbWFyZ2luOiAwOwogICAgcGFkZGluZzogMDsKICAgIGZvbnQtc2l6ZTogMTRweDsKICAgIGxpbmUtaGVpZ2h0OiAxOwogICAgb3BhY2l0eTogMC43Owp9CgoubWpyLXRhZy1jaGlwLXJlbW92ZTpkaXNhYmxlZCB7CiAgICBjdXJzb3I6IGRlZmF1bHQ7Cn0KCi5tanItdGFncy1pbnB1dC13cmFwIHsKICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKfQoKLm1qci10YWctaW5wdXQgewogICAgd2lkdGg6IDEwMCU7CiAgICBwYWRkaW5nOiA2cHggOHB4OwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTIpIDc1JSwgdHJhbnNwYXJlbnQpOwogICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tbWpyLWJvcmRlcik7CiAgICBib3JkZXItcmFkaXVzOiA0cHg7CiAgICBjb2xvcjogdmFyKC0tY29udGVudC1mZyk7CiAgICBmb250LXNpemU6IDEzcHg7CiAgICBvdXRsaW5lOiBub25lOwp9CgoubWpyLXRhZy1pbnB1dDpmb2N1cyB7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMikgODglLCB0cmFuc3BhcmVudCkgIWltcG9ydGFudDsKICAgIGJvcmRlci1jb2xvcjogdmFyKC0tbWpyLWFjY2VudCkgIWltcG9ydGFudDsKfQoKLm1qci10YWctY2hpcDpob3ZlciB7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXRhZy1jb2xvcikgMzQlLCB0cmFuc3BhcmVudCkgIWltcG9ydGFudDsKICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci10YWctY29sb3IpIDYwJSwgdmFyKC0tbWpyLWJvcmRlcikpICFpbXBvcnRhbnQ7Cn0KCi5tanItdGFncy1kcm9wZG93biB7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICB0b3A6IDEwMCU7CiAgICBsZWZ0OiAwOwogICAgcmlnaHQ6IDA7CiAgICBtYXJnaW4tdG9wOiA0cHg7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1tanItc3VyZmFjZS0xLCB2YXIoLS1jb21meS1tZW51LWJnLCAjMmEyYTJhKSk7CiAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1tanItYm9yZGVyKTsKICAgIGJvcmRlci1yYWRpdXM6IDRweDsKICAgIG1heC1oZWlnaHQ6IDE1MHB4OwogICAgb3ZlcmZsb3cteTogYXV0bzsKICAgIHotaW5kZXg6IDEwMDA7Cn0KCi5tanItdGFncy1kcm9wZG93biBbZGF0YS1wYy1zZWN0aW9uPSJsaXN0Il0gewogICAgbGlzdC1zdHlsZTogbm9uZTsKICAgIG1hcmdpbjogMDsKICAgIHBhZGRpbmc6IDA7Cn0KCi5tanItdGFncy1kcm9wZG93biBbZGF0YS1wYy1zZWN0aW9uPSJvcHRpb24iXSB7CiAgICBsaXN0LXN0eWxlOiBub25lOwp9CgoubWpyLXRhZy1zdWdnZXN0aW9uIHsKICAgIHBhZGRpbmc6IDZweCA4cHg7CiAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsKICAgIGNvbG9yOiB2YXIoLS1tanItdGFnLWNvbG9yKTsKICAgIGZvbnQtc2l6ZTogMTJweDsKfQoKLm1qci10YWctc3VnZ2VzdGlvbi5pcy1hY3RpdmUsCi5tanItdGFnLXN1Z2dlc3Rpb246aG92ZXIgewogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci10YWctY29sb3IpIDI4JSwgdHJhbnNwYXJlbnQpICFpbXBvcnRhbnQ7Cn0KCi8qIEJhZGdlcyBJbnRlcmFjdGl2ZSAqLwoubWpyLXJhdGluZy1iYWRnZSwKLm1qci10YWdzLWJhZGdlIHsKICAgIHRyYW5zaXRpb246IGFsbCAwLjJzIGVhc2U7Cn0KCi5tanItcmF0aW5nLWJhZGdlIHsKICAgIGNvbG9yOiB2YXIoLS1tanItcmF0aW5nLWNvbG9yKSAhaW1wb3J0YW50Owp9CgoubWpyLXRhZ3MtYmFkZ2UgewogICAgY29sb3I6IHZhcigtLW1qci10YWctY29sb3IpICFpbXBvcnRhbnQ7Cn0KCi5tanItcmF0aW5nLWJhZGdlOmhvdmVyLAoubWpyLXRhZ3MtYmFkZ2U6aG92ZXIgewogICAgdHJhbnNmb3JtOiBzY2FsZSgxLjA1KTsKICAgIGJveC1zaGFkb3c6IDAgNHB4IDhweCByZ2JhKDAsIDAsIDAsIDAuNSk7Cn0KCi8qIFNjcm9sbGJhciBmb3IgdGFncyBkcm9wZG93biAqLwoubWpyLXRhZ3MtZHJvcGRvd246Oi13ZWJraXQtc2Nyb2xsYmFyIHsKICAgIHdpZHRoOiA2cHg7Cn0KCi5tanItdGFncy1kcm9wZG93bjo6LXdlYmtpdC1zY3JvbGxiYXItdHJhY2sgewogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTIpIDY1JSwgdHJhbnNwYXJlbnQpOwogICAgYm9yZGVyLXJhZGl1czogM3B4Owp9CgoubWpyLXRhZ3MtZHJvcGRvd246Oi13ZWJraXQtc2Nyb2xsYmFyLXRodW1iIHsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItdGFnLWNvbG9yKSA0OCUsIHZhcigtLW1qci1ib3JkZXIpKTsKICAgIGJvcmRlci1yYWRpdXM6IDNweDsKfQoKLm1qci10YWdzLWRyb3Bkb3duOjotd2Via2l0LXNjcm9sbGJhci10aHVtYjpob3ZlciB7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXRhZy1jb2xvcikgNjUlLCB2YXIoLS1tanItYm9yZGVyKSk7Cn0KCi8qIFNpZGViYXIgKGNhbiBiZSBsZWZ0IG9yIHJpZ2h0KSAqLwoubWpyLXNpZGViYXIgewogICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgei1pbmRleDogMzsKICAgIGZsZXg6IDAgMCBhdXRvOwogICAgdHJhbnNpdGlvbjogYWxsIDAuM3MgZWFzZTsKfQoKLm1qci13b3JrZmxvdy10cmVlLXdyYXAgewogICAgbWFyZ2luOiAwIDAgMTJweDsKICAgIGJvcmRlcjogMXB4IHNvbGlkIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYm9yZGVyKSA4MiUsIHRyYW5zcGFyZW50KTsKICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLW1qci1yLW1kLCA4cHgpOwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTEpIDcyJSwgdHJhbnNwYXJlbnQpOwp9CgoubWpyLXdvcmtmbG93LXRyZWUgewogICAgY29sb3I6IHZhcigtLWNvbnRlbnQtZmcsICNlYWVhZWEpOwogICAgZm9udC1zaXplOiAxMnB4Owp9CgoubWpyLXdvcmtmbG93LXRyZWUtc2Nyb2xsIHsKICAgIG92ZXJmbG93OiBhdXRvOwogICAgcGFkZGluZzogMnB4IDRweCA2cHg7Cn0KCi5tanItd29ya2Zsb3ctdHJlZS1saXN0IHsKICAgIGxpc3Qtc3R5bGU6IG5vbmU7CiAgICBtYXJnaW46IDA7CiAgICBwYWRkaW5nOiAwOwp9CgoubWpyLXdvcmtmbG93LXRyZWUtbm9kZS1jb250ZW50IHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiA2cHg7CiAgICBtaW4taGVpZ2h0OiAyOHB4OwogICAgcGFkZGluZzogNHB4IDZweDsKICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLW1qci1yLXNtLCA2cHgpOwp9CgoubWpyLXdvcmtmbG93LXRyZWUtbm9kZS1jb250ZW50OmhvdmVyIHsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0yKSA1OCUsIHRyYW5zcGFyZW50KTsKfQoKLm1qci13b3JrZmxvdy10cmVlLXRvZ2dsZSB7CiAgICB3aWR0aDogMTRweDsKICAgIGhlaWdodDogMjBweDsKICAgIHBhZGRpbmc6IDA7CiAgICBib3JkZXI6IDA7CiAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsKICAgIGNvbG9yOiB2YXIoLS1tanItbXV0ZWQsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC42NCkpOwp9CgoubWpyLXdvcmtmbG93LXRyZWUtdG9nZ2xlW2RhdGEtcC1sZWFmPSJ0cnVlIl0gewogICAgdmlzaWJpbGl0eTogaGlkZGVuOwp9CgoubWpyLXdvcmtmbG93LXRyZWUtaWNvbiB7CiAgICB3aWR0aDogOHB4OwogICAgZmxleDogMCAwIDhweDsKICAgIGNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWFjY2VudCkgNzAlLCB2YXIoLS1jb250ZW50LWZnKSk7CiAgICBmb250LXNpemU6IDdweDsKfQoKLm1qci13b3JrZmxvdy10cmVlLWxhYmVsIHsKICAgIG1pbi13aWR0aDogMDsKICAgIGZsZXg6IDEgMSBhdXRvOwp9CgoubWpyLXdvcmtmbG93LXRyZWUtbm9kZSB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogOHB4OwogICAgbWluLXdpZHRoOiAwOwp9CgoubWpyLXdvcmtmbG93LXRyZWUtbm9kZS1uYW1lIHsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7Cn0KCi5tanItd29ya2Zsb3ctdHJlZS1ub2RlLXR5cGUgewogICAgY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItbXV0ZWQpIDc1JSwgdmFyKC0tY29udGVudC1mZykpOwogICAgZm9udC1zaXplOiAxMXB4OwogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKfQoKLm1qci1zaWRlYmFyLmlzLW9wZW4gewogICAgLyogQm9yZGVyIGlzIHNldCBkeW5hbWljYWxseSBiYXNlZCBvbiBwb3NpdGlvbiAqLwp9CgoubWpyLXNpZGViYXIgLm1qci1zaWRlYmFyLWhlYWRlciB7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1tanItc3VyZmFjZS0yLCAjMzMzKTsKICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCB2YXIoLS1tanItYm9yZGVyLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTIpKTsKfQoKLm1qci1zaWRlYmFyIC5tanItc2lkZWJhci1jb250ZW50IHsKICAgIGJhY2tncm91bmQ6IHZhcigtLW1qci1zdXJmYWNlLTEsICMyYTJhMmEpOwp9CgoubWpyLXNpZGViYXIgLm1qci1zaWRlYmFyLWNvbnRlbnQ6Oi13ZWJraXQtc2Nyb2xsYmFyIHsKICAgIHdpZHRoOiA4cHg7Cn0KCi5tanItc2lkZWJhciAubWpyLXNpZGViYXItY29udGVudDo6LXdlYmtpdC1zY3JvbGxiYXItdHJhY2sgewogICAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjMpOwp9CgoubWpyLXNpZGViYXIgLm1qci1zaWRlYmFyLWNvbnRlbnQ6Oi13ZWJraXQtc2Nyb2xsYmFyLXRodW1iIHsKICAgIGJhY2tncm91bmQ6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4yKTsKICAgIGJvcmRlci1yYWRpdXM6IDRweDsKfQoKLm1qci1zaWRlYmFyIC5tanItc2lkZWJhci1jb250ZW50Ojotd2Via2l0LXNjcm9sbGJhci10aHVtYjpob3ZlciB7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMyk7Cn0KCi8qIEN1c3RvbSBSb290cyBQb3BvdmVyIFN0eWxpbmcgKi8KLm1qci1jdXN0b20tcG9wb3ZlciB7CiAgICBtaW4td2lkdGg6IDMwMHB4OwogICAgYmFja2dyb3VuZDogdmFyKC0tbWpyLXN1cmZhY2UtMSwgdmFyKC0tY29tZnktbWVudS1iZywgIzJhMmEyYSkpOwogICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tbWpyLWJvcmRlciwgdmFyKC0tYm9yZGVyLWNvbG9yLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTIpKSk7CiAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1yYWRpdXMtbGcsIDAuNXJlbSk7CiAgICBib3gtc2hhZG93OiAwIDEycHggMjhweCByZ2JhKDAsIDAsIDAsIDAuMzUpOwogICAgei1pbmRleDogdmFyKC0tbWpyLXBvcG92ZXItei1pbmRleCk7CiAgICBwYWRkaW5nOiAxMnB4Owp9CgoubWpyLWN1c3RvbS1wb3BvdmVyIC5tanItcG9wb3Zlci1yb3cgewogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBnYXA6IDEwcHg7CiAgICBtYXJnaW4tYm90dG9tOiAxMnB4OwogICAgZmxleC13cmFwOiB3cmFwOwp9CgoubWpyLWN1c3RvbS1wb3BvdmVyIC5tanItcG9wb3Zlci1yb3c6bGFzdC1jaGlsZCB7CiAgICBtYXJnaW4tYm90dG9tOiAwOwp9CgoubWpyLWN1c3RvbS1wb3BvdmVyIC5tanItcG9wb3Zlci1sYWJlbCB7CiAgICB3aWR0aDogNjBweDsKICAgIGNvbG9yOiB2YXIoLS1tanItbXV0ZWQsIHZhcigtLWRlc2NyaXAtdGV4dCwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjY1KSkpOwogICAgZm9udC1zaXplOiAxMnB4OwogICAgZm9udC13ZWlnaHQ6IDUwMDsKfQoKLm1qci1jdXN0b20tcG9wb3ZlciAubWpyLXNlbGVjdCB7CiAgICBmbGV4OiAxOwogICAgbWluLXdpZHRoOiAwOwp9CgoubWpyLWN1c3RvbS1wb3BvdmVyIC5tanItYnRuIHsKICAgIGZsZXg6IDE7CiAgICBtaW4td2lkdGg6IDA7CiAgICBtYXJnaW4tcmlnaHQ6IDVweDsKfQoKLm1qci1jdXN0b20tcG9wb3ZlciAubWpyLWJ0bjpsYXN0LWNoaWxkIHsKICAgIG1hcmdpbi1yaWdodDogMDsKfQoKLm1qci1jdXN0b20tcG9wb3ZlciAubWpyLWJ0bi5tanItcHJpbWFyeSB7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWFjY2VudCkgMTglLCB2YXIoLS1tanItc3VyZmFjZS0yKSk7CiAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYWNjZW50KSA2MCUsIHZhcigtLW1qci1ib3JkZXIpKTsKfQoKLm1qci1jdXN0b20tcG9wb3ZlciAubWpyLWJ0bi5tanItcHJpbWFyeTpob3ZlciB7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWFjY2VudCkgMjUlLCB2YXIoLS1tanItc3VyZmFjZS0yKSk7CiAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYWNjZW50KSA4MCUsIHZhcigtLW1qci1ib3JkZXIpKTsKfQoKLm1qci1zaWRlYmFyIC5tanItc2lkZWJhci1zZWN0aW9uIHsKICAgIHRyYW5zaXRpb246IGFsbCAwLjJzIGVhc2U7Cn0KCi5tanItc2lkZWJhciAubWpyLXNpZGViYXItc2VjdGlvbjpob3ZlciB7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIDAuMykgIWltcG9ydGFudDsKfQoKLyogSW5saW5lIFNpZGViYXIgKHdpZHRoLWJhc2VkIHRyYW5zaXRpb25zIGxpa2UgYXJjaGl2ZWQgdmVyc2lvbikgKi8KLm1qci1pbmxpbmUtc2lkZWJhciB7CiAgICB3aWR0aDogMDsKICAgIG1pbi13aWR0aDogMDsKICAgIG1heC13aWR0aDogNDgwcHg7CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgYmFja2dyb3VuZDogdmFyKC0tbWpyLXN1cmZhY2UtMSwgIzJhMmEyYSk7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgIHRyYW5zaXRpb246CiAgICAgICAgd2lkdGggMC4zcyBlYXNlLAogICAgICAgIG1pbi13aWR0aCAwLjNzIGVhc2U7Cn0KCi5tanItaW5saW5lLXNpZGViYXIuaXMtb3BlbiB7CiAgICB3aWR0aDogNDAwcHg7CiAgICBtaW4td2lkdGg6IDI2MHB4Owp9CgovKiBTcGFjZSBiZXR3ZWVuIHNpZGViYXIgYW5kIGdyaWQgKi8KLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFtLWJyb3dzZSB7CiAgICBnYXA6IDA7Cn0KCi8qIEJvcmRlciBiYXNlZCBvbiBwb3NpdGlvbiAqLwoubWpyLWlubGluZS1zaWRlYmFyW2RhdGEtcG9zaXRpb249ImxlZnQiXSB7CiAgICBib3JkZXItcmlnaHQ6IDFweCBzb2xpZCB2YXIoLS1tanItYm9yZGVyLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTIpKTsKfQoKLm1qci1pbmxpbmUtc2lkZWJhcltkYXRhLXBvc2l0aW9uPSJyaWdodCJdIHsKICAgIGJvcmRlci1sZWZ0OiAxcHggc29saWQgdmFyKC0tbWpyLWJvcmRlciwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEyKSk7Cn0KCi8qIFNpZGViYXIgcGxhY2Vob2xkZXIgKi8KLm1qci1zaWRlYmFyLXBsYWNlaG9sZGVyIHsKICAgIHBhZGRpbmc6IDIwcHg7CiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgICBjb2xvcjogdmFyKC0tbWpyLW11dGVkLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNjUpKTsKICAgIGZvbnQtc2l6ZTogMTRweDsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7Cn0KCi8qID09PT09PT09PT0gVmlld2VyIENvbXBvbmVudCA9PT09PT09PT09ICovCi5tanItdmlld2VyLW92ZXJsYXkgewogICAgcG9zaXRpb246IGZpeGVkOwogICAgdG9wOiAwOwogICAgbGVmdDogMDsKICAgIHJpZ2h0OiAwOwogICAgYm90dG9tOiAwOwogICAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjk1KTsKICAgIC8qIFNpdCBhYm92ZSBNRlYgKDEwMDAwKSBzbyB0aGUgZnVsbCB2aWV3ZXIgYWx3YXlzIGNvdmVycyB0aGUgZmxvYXRpbmcgcGFuZWwgKi8KICAgIHotaW5kZXg6IDEwMDAxOwogICAgcG9pbnRlci1ldmVudHM6IGF1dG87CiAgICBkaXNwbGF5OiBub25lOwogICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKfQovKiBGYWRlLWluOiBhbmltYXRpb24gcmUtdHJpZ2dlcnMgZWFjaCB0aW1lIEpTIHN3aXRjaGVzIGRpc3BsYXkgYmFjayB0byBmbGV4ICovCi5tanItdmlld2VyLW92ZXJsYXlbc3R5bGUqPSJmbGV4Il0gewogICAgYW5pbWF0aW9uOiBtanItZmFkZS1pbiAwLjE4cyBlYXNlLW91dDsKfQoKQGtleWZyYW1lcyBtanItZmFkZS1pbiB7CiAgICBmcm9tIHsKICAgICAgICBvcGFjaXR5OiAwOwogICAgICAgIHRyYW5zZm9ybTogc2NhbGUoMC45OTUpOwogICAgfQogICAgdG8gewogICAgICAgIG9wYWNpdHk6IDE7CiAgICAgICAgdHJhbnNmb3JtOiBzY2FsZSgxKTsKICAgIH0KfQoKLm1qci12aWV3ZXItaGVhZGVyIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgcGFkZGluZzogMTJweCAyMHB4OwogICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KDE3MGRlZywgcmdiYSgyNCwgMjcsIDMzLCAwLjk2KSwgcmdiYSgxNywgMTksIDI1LCAwLjk3KSk7CiAgICBib3JkZXItYm90dG9tOiAwLjhweCBzb2xpZCByZ2JhKDE5NiwgMjAyLCAyMTAsIDAuMik7CiAgICBjb2xvcjogd2hpdGU7Cn0KCi5tanItdmlld2VyLWZpbGVuYW1lIHsKICAgIGZvbnQtc2l6ZTogMTRweDsKICAgIGZvbnQtd2VpZ2h0OiA1MDA7CiAgICBtYXgtd2lkdGg6IDQwMHB4OwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKfQoKLm1qci12aWV3ZXItbW9kZS1idXR0b25zIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBnYXA6IDZweDsKfQoKLm1qci12aWV3ZXItbW9kZS1idXR0b25zIGJ1dHRvbiB7CiAgICBwYWRkaW5nOiA0cHggMTJweDsKICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgxODBkZWcsIHJnYmEoMjA2LCAyMTEsIDIxOCwgMC4xKSwgcmdiYSgyMDYsIDIxMSwgMjE4LCAwLjAzKSk7CiAgICBib3JkZXI6IDAuOHB4IHNvbGlkIHJnYmEoMTk2LCAyMDIsIDIxMCwgMC4zKTsKICAgIGNvbG9yOiByZ2JhKDIzMCwgMjMzLCAyMzgsIDAuOTUpOwogICAgYm9yZGVyLXJhZGl1czogNHB4OwogICAgY3Vyc29yOiBwb2ludGVyOwogICAgZm9udC1zaXplOiAxMnB4OwogICAgdHJhbnNpdGlvbjogYWxsIDAuMTZzOwp9CgoubWpyLXZpZXdlci1tb2RlLWJ1dHRvbnMgYnV0dG9uOmhvdmVyIHsKICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgxODBkZWcsIHJnYmEoMjEwLCAyMTQsIDIyMCwgMC4xNCksIHJnYmEoMjEwLCAyMTQsIDIyMCwgMC4wNikpOwogICAgYm9yZGVyLWNvbG9yOiByZ2JhKDIxNCwgMjE4LCAyMjQsIDAuNDIpOwp9CgovKiBWaWV3ZXIgY2xvc2UgYnV0dG9uIHBpbm5lZCB0byBvdmVybGF5IGNvcm5lciAqLwoubWpyLXZpZXdlci1jbG9zZSwKLm1qci12aWV3ZXItZnMgewogICAgYm9yZGVyLWNvbG9yOiByZ2JhKDE5NiwgMjAyLCAyMTAsIDAuMjYpICFpbXBvcnRhbnQ7CiAgICBib3JkZXItd2lkdGg6IDAuOHB4ICFpbXBvcnRhbnQ7CiAgICBiYWNrZ3JvdW5kOgogICAgICAgIGxpbmVhci1ncmFkaWVudCgxODBkZWcsIHJnYmEoMjA2LCAyMTEsIDIxOCwgMC4wOCksIHJnYmEoMjA2LCAyMTEsIDIxOCwgMC4wMikpLAogICAgICAgIHJnYmEoMjAsIDIzLCAyOSwgMC45NCkgIWltcG9ydGFudDsKICAgIGJveC1zaGFkb3c6IGluc2V0IDAgMXB4IDAgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA4KSAhaW1wb3J0YW50Owp9CgoubWpyLXZpZXdlci1jbG9zZSB7CiAgICBjb2xvcjogI2ZmZjRmNCAhaW1wb3J0YW50OwogICAgYm9yZGVyLWNvbG9yOiByZ2JhKDIwNSwgODIsIDgyLCAwLjUpICFpbXBvcnRhbnQ7CiAgICBiYWNrZ3JvdW5kOgogICAgICAgIGxpbmVhci1ncmFkaWVudCgxODBkZWcsIHJnYmEoMjA1LCA4MiwgODIsIDAuMyksIHJnYmEoMjA1LCA4MiwgODIsIDAuMTIpKSwKICAgICAgICByZ2JhKDU4LCAxOCwgMTgsIDAuOTQpICFpbXBvcnRhbnQ7CiAgICBib3gtc2hhZG93OgogICAgICAgIGluc2V0IDAgMXB4IDAgcmdiYSgyNTUsIDIxOSwgMjE5LCAwLjE2KSwKICAgICAgICAwIDAgMCAxcHggcmdiYSgyMDUsIDgyLCA4MiwgMC4wOCkgIWltcG9ydGFudDsKfQoKLm1qci12aWV3ZXItY2xvc2U6aG92ZXIgewogICAgYmFja2dyb3VuZDoKICAgICAgICBsaW5lYXItZ3JhZGllbnQoMTgwZGVnLCByZ2JhKDIzNSwgMTEwLCAxMTAsIDAuMzgpLCByZ2JhKDIzNSwgMTEwLCAxMTAsIDAuMTYpKSwKICAgICAgICByZ2JhKDcwLCAxOCwgMTgsIDAuOTcpICFpbXBvcnRhbnQ7CiAgICBib3JkZXItY29sb3I6IHJnYmEoMjM1LCAxMzgsIDEzOCwgMC42NCkgIWltcG9ydGFudDsKfQoKLm1qci12aWV3ZXItZnM6aG92ZXIgewogICAgYmFja2dyb3VuZDoKICAgICAgICBsaW5lYXItZ3JhZGllbnQoMTgwZGVnLCByZ2JhKDIxMCwgMjE0LCAyMjAsIDAuMTQpLCByZ2JhKDIxMCwgMjE0LCAyMjAsIDAuMDYpKSwKICAgICAgICByZ2JhKDIzLCAyNiwgMzIsIDAuOTUpICFpbXBvcnRhbnQ7CiAgICBib3JkZXItY29sb3I6IHJnYmEoMjE0LCAyMTgsIDIyNCwgMC4zOCkgIWltcG9ydGFudDsKfQoKLm1qci12aWV3ZXItY2xvc2UgLnBpIHsKICAgIGZvbnQtc2l6ZTogMTZweDsKICAgIGxpbmUtaGVpZ2h0OiAxOwp9CgoubWpyLXZpZXdlci1jb250ZW50IHsKICAgIGZsZXg6IDE7CiAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKfQoKLm1qci12aWV3ZXItc2luZ2xlLAoubWpyLXZpZXdlci1hYiwKLm1qci12aWV3ZXItc2lkZWJ5c2lkZSB7CiAgICB3aWR0aDogMTAwJTsKICAgIGhlaWdodDogMTAwJTsKfQoKLm1qci12aWV3ZXItc2luZ2xlIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7Cn0KCi5tanItdmlld2VyLXNpbmdsZSBpbWcsCi5tanItdmlld2VyLXNpbmdsZSB2aWRlbyB7CiAgICBtYXgtd2lkdGg6IDEwMCU7CiAgICBtYXgtaGVpZ2h0OiAxMDAlOwogICAgb2JqZWN0LWZpdDogY29udGFpbjsKICAgIHRyYW5zaXRpb246IHRyYW5zZm9ybSAwLjJzOwp9CgoubWpyLXZpZXdlci1hdWRpby1zaGVsbCB7CiAgICB3aWR0aDogMTAwJTsKICAgIGhlaWdodDogMTAwJTsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgZ2FwOiAxNHB4OwogICAgcGFkZGluZzogMThweDsKICAgIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuOSk7CiAgICBiYWNrZ3JvdW5kOgogICAgICAgIHJhZGlhbC1ncmFkaWVudChjaXJjbGUgYXQgMTglIDIyJSwgcmdiYSg3OCwgMTg0LCAyNTUsIDAuMiksIHRyYW5zcGFyZW50IDMyJSksCiAgICAgICAgcmFkaWFsLWdyYWRpZW50KGNpcmNsZSBhdCA4MiUgNzQlLCByZ2JhKDgyLCAyMjAsIDE1NiwgMC4xNSksIHRyYW5zcGFyZW50IDM2JSksCiAgICAgICAgbGluZWFyLWdyYWRpZW50KDEzNWRlZywgcmdiYSgxMiwgMTgsIDI2LCAwLjk4KSwgcmdiYSg0LCA3LCAxMSwgMC45OSkpOwp9CgoubWpyLXZpZXdlci1hdWRpby1oZWFkZXIgewogICAgd2lkdGg6IG1pbigxMDgwcHgsIDg4JSk7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgZ2FwOiAxMXB4OwogICAgbWluLXdpZHRoOiAwOwogICAgcGFkZGluZzogMCA4cHg7Cn0KCi5tanItdmlld2VyLWF1ZGlvLWljb24gewogICAgd2lkdGg6IDM0cHg7CiAgICBoZWlnaHQ6IDM0cHg7CiAgICBmbGV4OiAwIDAgYXV0bzsKICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgYm9yZGVyLXJhZGl1czogOTk5cHg7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMSk7CiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTYpOwogICAgYm94LXNoYWRvdzogMCA4cHggMjJweCByZ2JhKDAsIDAsIDAsIDAuMjYpOwp9CgoubWpyLXZpZXdlci1hdWRpby10aXRsZS13cmFwIHsKICAgIG1pbi13aWR0aDogMDsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgZ2FwOiAycHg7Cn0KCi5tanItdmlld2VyLWF1ZGlvLXRpdGxlIHsKICAgIG1heC13aWR0aDogbWluKDc2MHB4LCA3MnZ3KTsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICBmb250LXNpemU6IDEzcHg7CiAgICBmb250LXdlaWdodDogODAwOwogICAgbGluZS1oZWlnaHQ6IDEuMjU7Cn0KCi5tanItdmlld2VyLWF1ZGlvLW1ldGEgewogICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC41OCk7CiAgICBmb250LXNpemU6IDEwcHg7CiAgICBmb250LXdlaWdodDogODAwOwogICAgbGV0dGVyLXNwYWNpbmc6IDA7Cn0KCi5tanItdmlld2VyLWF1ZGlvLXZpeiB7CiAgICB3aWR0aDogbWluKDE5MjBweCwgOTYlKTsKICAgIGFzcGVjdC1yYXRpbzogMTYgLyA5OwogICAgaGVpZ2h0OiBhdXRvOwogICAgbWF4LWhlaWdodDogbWluKDEwODBweCwgNjh2aCk7CiAgICBtaW4taGVpZ2h0OiAyNjBweDsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wOSk7CiAgICBib3JkZXItcmFkaXVzOiAxNnB4OwogICAgYmFja2dyb3VuZDoKICAgICAgICBsaW5lYXItZ3JhZGllbnQoMTgwZGVnLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDQpLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDEpKSwKICAgICAgICByZ2JhKDIsIDUsIDksIDAuMjIpOwogICAgYm94LXNoYWRvdzoKICAgICAgICBpbnNldCAwIDFweCAwIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wNSksCiAgICAgICAgMCAxOHB4IDcwcHggcmdiYSgwLCAwLCAwLCAwLjMpOwp9CgoubWpyLXZpZXdlci1hdWRpby1zcmMgewogICAgd2lkdGg6IG1pbig2ODBweCwgOTAlKTsKfQoKLm1qci12aWV3ZXItYWIgewogICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgZGlzcGxheTogbm9uZTsKfQoKLm1qci12aWV3ZXItc2lkZWJ5c2lkZSB7CiAgICBkaXNwbGF5OiBub25lOwogICAgZmxleC1kaXJlY3Rpb246IHJvdzsKICAgIGdhcDogMnB4Owp9CgoubWpyLXZpZXdlci1zaWRlYnlzaWRlID4gZGl2IHsKICAgIGZsZXg6IDE7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA1KTsKfQoKLm1qci12aWV3ZXItc2lkZWJ5c2lkZSBpbWcsCi5tanItdmlld2VyLXNpZGVieXNpZGUgdmlkZW8gewogICAgbWF4LXdpZHRoOiAxMDAlOwogICAgbWF4LWhlaWdodDogMTAwJTsKICAgIG9iamVjdC1maXQ6IGNvbnRhaW47Cn0KCi5tanItdmlld2VyLWZvb3RlciB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgcGFkZGluZzogMTJweCAyMHB4OwogICAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjgpOwogICAgYm9yZGVyLXRvcDogMXB4IHNvbGlkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xKTsKICAgIGNvbG9yOiB3aGl0ZTsKICAgIGdhcDogMjBweDsKfQoKLm1qci12aWV3ZXItZm9vdGVyIGJ1dHRvbiB7CiAgICBwYWRkaW5nOiA2cHggMTJweDsKICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50OwogICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjMpOwogICAgY29sb3I6IHdoaXRlOwogICAgYm9yZGVyLXJhZGl1czogNHB4OwogICAgY3Vyc29yOiBwb2ludGVyOwogICAgZm9udC1zaXplOiAxNHB4OwogICAgdHJhbnNpdGlvbjogYWxsIDAuMnM7Cn0KCi5tanItdmlld2VyLWZvb3RlciBidXR0b246aG92ZXIgewogICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEpOwp9CgoubWpyLXZpZXdlci1uYXYgewogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBnYXA6IDE0cHg7Cn0KCi5tanItdmlld2VyLW5hdi1idG4gewogICAgd2lkdGg6IDQwcHggIWltcG9ydGFudDsKICAgIGhlaWdodDogNDBweCAhaW1wb3J0YW50OwogICAgcGFkZGluZzogMCAhaW1wb3J0YW50OwogICAgYm9yZGVyLXJhZGl1czogMTBweCAhaW1wb3J0YW50OwogICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgxOTYsIDIwMiwgMjEwLCAwLjQyKSAhaW1wb3J0YW50OwogICAgYmFja2dyb3VuZDoKICAgICAgICBsaW5lYXItZ3JhZGllbnQoMTgwZGVnLCByZ2JhKDE5NCwgMjAwLCAyMDgsIDAuMTgpLCByZ2JhKDE5NCwgMjAwLCAyMDgsIDAuMDcpKSwKICAgICAgICByZ2JhKDM0LCAzOCwgNDQsIDAuOTIpICFpbXBvcnRhbnQ7CiAgICBjb2xvcjogcmdiYSgyMzQsIDIzNiwgMjQwLCAwLjk2KSAhaW1wb3J0YW50OwogICAgZm9udC1zaXplOiAyMHB4ICFpbXBvcnRhbnQ7CiAgICBmb250LXdlaWdodDogNzAwICFpbXBvcnRhbnQ7CiAgICBsaW5lLWhlaWdodDogMSAhaW1wb3J0YW50OwogICAgdGV4dC1zaGFkb3c6IG5vbmU7CiAgICBib3gtc2hhZG93OiBpbnNldCAwIDFweCAwIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xNCk7CiAgICB0cmFuc2l0aW9uOgogICAgICAgIHRyYW5zZm9ybSAwLjE0cyBlYXNlLAogICAgICAgIGJhY2tncm91bmQtY29sb3IgMC4xNHMgZWFzZSwKICAgICAgICBib3JkZXItY29sb3IgMC4xNHMgZWFzZSAhaW1wb3J0YW50Owp9CgoubWpyLXZpZXdlci1uYXYtYnRuOmhvdmVyOm5vdCg6ZGlzYWJsZWQpIHsKICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtMXB4KTsKICAgIGJvcmRlci1jb2xvcjogcmdiYSgyMTQsIDIxOCwgMjI0LCAwLjU2KSAhaW1wb3J0YW50OwogICAgYmFja2dyb3VuZDoKICAgICAgICBsaW5lYXItZ3JhZGllbnQoMTgwZGVnLCByZ2JhKDIwNywgMjEyLCAyMTksIDAuMiksIHJnYmEoMjA3LCAyMTIsIDIxOSwgMC4xKSksCiAgICAgICAgcmdiYSgzOSwgNDMsIDQ5LCAwLjk0KSAhaW1wb3J0YW50OwogICAgYm94LXNoYWRvdzogaW5zZXQgMCAxcHggMCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMik7Cn0KCi5tanItdmlld2VyLW5hdi1idG46YWN0aXZlOm5vdCg6ZGlzYWJsZWQpIHsKICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgwKSBzY2FsZSgwLjk4KTsKICAgIGZpbHRlcjogbm9uZTsKfQoKLm1qci12aWV3ZXItbmF2LWJ0bjpkaXNhYmxlZCB7CiAgICBvcGFjaXR5OiAwLjM0ICFpbXBvcnRhbnQ7CiAgICBmaWx0ZXI6IGdyYXlzY2FsZSgwLjI1KTsKICAgIGJveC1zaGFkb3c6IG5vbmU7CiAgICBib3JkZXItY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xNCkgIWltcG9ydGFudDsKfQoKLm1qci12aWV3ZXItaW5kZXggewogICAgZm9udC1zaXplOiAxM3B4OwogICAgbWluLXdpZHRoOiA3NHB4OwogICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgZm9udC12YXJpYW50LW51bWVyaWM6IHRhYnVsYXItbnVtczsKICAgIGxldHRlci1zcGFjaW5nOiAwLjA0ZW07CiAgICBjb2xvcjogcmdiYSgyMjYsIDIyOCwgMjMzLCAwLjk0KTsKICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgxODBkZWcsIHJnYmEoMTk3LCAyMDMsIDIxMSwgMC4xNSksIHJnYmEoMTk3LCAyMDMsIDIxMSwgMC4wNikpOwogICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgxOTcsIDIwMywgMjExLCAwLjM0KTsKICAgIGJvcmRlci1yYWRpdXM6IDk5OXB4OwogICAgcGFkZGluZzogNXB4IDExcHg7CiAgICB0ZXh0LXNoYWRvdzogbm9uZTsKICAgIGJveC1zaGFkb3c6IGluc2V0IDAgMXB4IDAgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE4KTsKfQoKLm1qci12aWV3ZXItcGxheWVyYmFyIHsKICAgIGJvcmRlci1yYWRpdXM6IDE4cHg7CiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDE5NCwgMjAwLCAyMDgsIDAuMTYpOwogICAgYmFja2dyb3VuZDoKICAgICAgICByYWRpYWwtZ3JhZGllbnQoY2lyY2xlIGF0IHRvcCBsZWZ0LCByZ2JhKDkwLCAxNTAsIDI1NSwgMC4wOCksIHRyYW5zcGFyZW50IDM2JSksCiAgICAgICAgbGluZWFyLWdyYWRpZW50KDE2MGRlZywgcmdiYSgyMCwgMjQsIDMwLCAwLjk0KSwgcmdiYSgxMiwgMTUsIDIxLCAwLjk4KSk7CiAgICBib3gtc2hhZG93OgogICAgICAgIGluc2V0IDAgMXB4IDAgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA1KSwKICAgICAgICAwIDE2cHggMzZweCByZ2JhKDAsIDAsIDAsIDAuMjIpOwogICAgLyogb3ZlcmZsb3cgbXVzdCBzdGF5IHZpc2libGUgc28gdGhlIHNlZWsgcnVsZXIgdGlja3MvbGFiZWxzICh0b3A6LTE2cHggLyB0b3A6LTM0cHgpCiAgICAgICB0aGF0IGFyZSBhYnNvbHV0ZWx5IHBvc2l0aW9uZWQgYWJvdmUgdGhlIHNlZWsgYmFyIGFyZSBub3QgY2xpcHBlZC4gKi8KICAgIG92ZXJmbG93OiB2aXNpYmxlOwp9CgoubWpyLXZpZXdlci10b29scyB7CiAgICBhbGlnbi1pdGVtczogc3RhcnQ7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IHN0cmV0Y2g7CiAgICBnYXA6IDhweDsKfQoKLm1qci12aWV3ZXItaGVhZGVyIHsKICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKfQoKLm1qci12aWV3ZXItaGVhZGVyOjphZnRlciB7CiAgICBjb250ZW50OiAiIjsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIGxlZnQ6IDE4cHg7CiAgICByaWdodDogMThweDsKICAgIHRvcDogNDRweDsKICAgIGhlaWdodDogMXB4OwogICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KDkwZGVnLCB0cmFuc3BhcmVudCwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA4KSwgdHJhbnNwYXJlbnQpOwogICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICBvcGFjaXR5OiAwLjc7Cn0KCi5tanItdmlld2VyLWhlYWRlci1tZXRhIHsKICAgIG1pbi1oZWlnaHQ6IDMwcHg7CiAgICBwYWRkaW5nOiA0cHggOHB4OwogICAgYm9yZGVyLXJhZGl1czogMTBweDsKICAgIGJhY2tncm91bmQ6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wMzUpOwogICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA2KTsKfQoKLm1qci12aWV3ZXItaGVhZGVyLXRvcCB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgZ2FwOiAxMHB4OwogICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgcGFkZGluZy1yaWdodDogODRweDsKICAgIHBhZGRpbmctbGVmdDogMTJweDsKfQoKLm1qci12aWV3ZXItaGVhZGVyLWFyZWEtLWxlZnQgewogICAgZGlzcGxheTogbm9uZTsKICAgIGZsZXg6IDEgMSAwOwogICAgbWluLXdpZHRoOiAwOwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKfQoKLm1qci12aWV3ZXItaGVhZGVyLWFyZWEtLWNlbnRlciB7CiAgICBtaW4td2lkdGg6IDA7CiAgICBmbGV4OiAxIDEgYXV0bzsKfQoKLm1qci12aWV3ZXItaGVhZGVyLWFyZWEtLXJpZ2h0IHsKICAgIGp1c3RpZnktY29udGVudDogZmxleC1lbmQ7CiAgICBmbGV4OiAxIDEgMDsKICAgIG1pbi13aWR0aDogMDsKICAgIG92ZXJmbG93OiBoaWRkZW47Cn0KCi5tanItdmlld2VyLXRpdGxlLXdyYXAgewogICAgd2lkdGg6IGF1dG87CiAgICBtaW4td2lkdGg6IDA7CiAgICBtYXgtd2lkdGg6IG1pbigxMDAlLCBjYWxjKDEwMHZ3IC0gMjIwcHgpKTsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICBnYXA6IDEycHg7Cn0KCi5tanItdmlld2VyLXRpdGxlLWxpbmUgewogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgIGdhcDogNnB4OwogICAgbWluLXdpZHRoOiAwOwogICAgZmxleC13cmFwOiBub3dyYXA7CiAgICBvdmVyZmxvdzogaGlkZGVuOwp9CgoubWpyLXZpZXdlci1maWxlbmFtZSB7CiAgICBmb250LXNpemU6IDEzcHg7CiAgICBmb250LXdlaWdodDogNjAwOwogICAgbGV0dGVyLXNwYWNpbmc6IDAuMDFlbTsKICAgIGRpc3BsYXk6IGJsb2NrOwogICAgbWFyZ2luOiAwIGF1dG87CiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7Cn0KCi5tanItdmlld2VyLWJhZGdlcyB7CiAgICBnYXA6IDRweDsKfQoKLm1qci12aWV3ZXItdGl0bGUtbGluZSAubWpyLXZpZXdlci1iYWRnZXMgewogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICBmbGV4LXdyYXA6IG5vd3JhcDsKICAgIG1pbi13aWR0aDogMDsKfQoKLm1qci12aWV3ZXItaGVhZGVyLW1ldGEtLWxlZnQgewogICAganVzdGlmeS1jb250ZW50OiBmbGV4LXN0YXJ0OwogICAgd2lkdGg6IGZpdC1jb250ZW50OwogICAgbWF4LXdpZHRoOiAxMDAlOwp9CgoubWpyLXZpZXdlci1oZWFkZXItbWV0YS0tbGVmdDplbXB0eSB7CiAgICBkaXNwbGF5OiBub25lOwp9CgoubWpyLXZpZXdlci1oZWFkZXItbWV0YS0tcmlnaHQgewogICAganVzdGlmeS1zZWxmOiBlbmQ7CiAgICB3aWR0aDogZml0LWNvbnRlbnQ7CiAgICBtYXgtd2lkdGg6IDEwMCU7Cn0KCi5tanItdmlld2VyLW1vZGUtYnV0dG9ucyB7CiAgICBmbGV4OiAwIDAgYXV0bzsKICAgIHBhZGRpbmc6IDNweDsKICAgIGJvcmRlci1yYWRpdXM6IDk5OXB4OwogICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA0KTsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wOCk7CiAgICBib3gtc2hhZG93OiBpbnNldCAwIDFweCAwIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wNCk7Cn0KCi5tanItdmlld2VyLXRvb2xzLWRlY2sgewogICAgZGlzcGxheTogZmxleDsKICAgIGZsZXgtd3JhcDogbm93cmFwOwogICAgZ2FwOiA4cHg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgbWluLXdpZHRoOiAwOwogICAgb3ZlcmZsb3cteDogYXV0bzsKICAgIG92ZXJmbG93LXk6IGhpZGRlbjsKICAgIHNjcm9sbGJhci13aWR0aDogdGhpbjsKfQoKLm1qci12aWV3ZXItdG9vbHMtcGFuZWwgewogICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgbWluLXdpZHRoOiBhdXRvOwogICAgbWluLWhlaWdodDogMDsKICAgIGJvcmRlci1yYWRpdXM6IDEwcHg7CiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDgpOwogICAgYmFja2dyb3VuZDoKICAgICAgICBsaW5lYXItZ3JhZGllbnQoMTgwZGVnLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDUpLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDIpKSwKICAgICAgICByZ2JhKDEwLCAxMiwgMTYsIDAuMjQpOwogICAgYm94LXNoYWRvdzoKICAgICAgICBpbnNldCAwIDFweCAwIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wNCksCiAgICAgICAgMCA2cHggMTZweCByZ2JhKDAsIDAsIDAsIDAuMTIpOwogICAgcGFkZGluZzogNXB4IDZweDsKICAgIGZsZXg6IDAgMCBhdXRvOwp9CgoubWpyLXZpZXdlci10b29scy1wYW5lbDo6YmVmb3JlIHsKICAgIGNvbnRlbnQ6ICIiOwogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgaW5zZXQ6IDAgMCBhdXRvIDA7CiAgICBoZWlnaHQ6IDFweDsKICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCg5MGRlZywgdHJhbnNwYXJlbnQsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xNiksIHRyYW5zcGFyZW50KTsKICAgIG9wYWNpdHk6IDAuNzsKICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwp9CgoubWpyLXZpZXdlci10b29scy1wYW5lbC1oZWFkIHsKICAgIGRpc3BsYXk6IG5vbmU7Cn0KCi5tanItdmlld2VyLXRvb2xzLXBhbmVsLWhlYWRpbmcgewogICAgZGlzcGxheTogZmxleDsKICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICBnYXA6IDFweDsKICAgIG1pbi13aWR0aDogMDsKfQoKLm1qci12aWV3ZXItdG9vbHMtcGFuZWwtZXllYnJvdyB7CiAgICBmb250LXNpemU6IDlweDsKICAgIGZvbnQtd2VpZ2h0OiA3MDA7CiAgICBsZXR0ZXItc3BhY2luZzogMC4xNGVtOwogICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKICAgIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNDYpOwp9CgoubWpyLXZpZXdlci10b29scy1wYW5lbC10aXRsZSB7CiAgICBmb250LXNpemU6IDEycHg7CiAgICBmb250LXdlaWdodDogNjAwOwogICAgbGV0dGVyLXNwYWNpbmc6IDAuMDFlbTsKICAgIGNvbG9yOiByZ2JhKDI0OCwgMjUwLCAyNTIsIDAuOTYpOwp9CgoubWpyLXZpZXdlci10b29scy1wYW5lbC1ib2R5IHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZmxleC13cmFwOiBub3dyYXA7CiAgICBnYXA6IDZweDsKICAgIG1pbi13aWR0aDogMDsKfQoKLm1qci12aWV3ZXItdG9vbHMtcGFuZWxbZGF0YS1wYW5lbD0iZ3JhZGUiXSAubWpyLXZpZXdlci10b29scy1wYW5lbC1ib2R5IHsKICAgIGRpc3BsYXk6IGZsZXg7Cn0KCi5tanItdmlld2VyLXRvb2xzLXBhbmVsW2RhdGEtcGFuZWw9Im92ZXJsYXkiXSAubWpyLXZpZXdlci10b29scy1wYW5lbC1ib2R5IHsKICAgIGRpc3BsYXk6IGZsZXg7Cn0KCi5tanItdmlld2VyLXRvb2xzLXBhbmVsW2RhdGEtcGFuZWw9Imluc3BlY3QiXSAubWpyLXZpZXdlci10b29scy1wYW5lbC1ib2R5LAoubWpyLXZpZXdlci10b29scy1wYW5lbFtkYXRhLXBhbmVsPSJhY3Rpb25zIl0gLm1qci12aWV3ZXItdG9vbHMtcGFuZWwtYm9keSwKLm1qci12aWV3ZXItdG9vbHMtcGFuZWxbZGF0YS1wYW5lbD0iaW5mbyJdIC5tanItdmlld2VyLXRvb2xzLXBhbmVsLWJvZHkgewogICAgZGlzcGxheTogZmxleDsKfQoKLm1qci12aWV3ZXItdG9vbHMtZ3JvdXAgewogICAgd2lkdGg6IGF1dG87CiAgICBtaW4taGVpZ2h0OiAzMHB4OwogICAgcGFkZGluZzogNXB4IDdweDsKICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogZmxleC1zdGFydDsKICAgIGdhcDogNnB4OwogICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgxOTYsIDIwMiwgMjEwLCAwLjEyKTsKICAgIGJvcmRlci1yYWRpdXM6IDEwcHg7CiAgICBiYWNrZ3JvdW5kOgogICAgICAgIGxpbmVhci1ncmFkaWVudCgxODBkZWcsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wMzUpLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDIpKSwKICAgICAgICByZ2JhKDEwLCAxMiwgMTYsIDAuMTgpOwogICAgYm94LXNoYWRvdzogaW5zZXQgMCAxcHggMCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDMpOwogICAgbWluLXdpZHRoOiBmaXQtY29udGVudDsKfQoKLm1qci12aWV3ZXItdG9vbHMtZ3JvdXAtbGFiZWwgewogICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC43NSk7CiAgICBsZXR0ZXItc3BhY2luZzogMC4xNXB4OwogICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgbWFyZ2luLXJpZ2h0OiA1cHg7CiAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgZm9udC1zaXplOiAxMHB4Owp9CgoubWpyLXZpZXdlci10b29scy1ncm91cFtzdHlsZSo9Ii0tbWpyLWdyb3VwLWFjY2VudCJdIC5tanItdmlld2VyLXRvb2xzLWdyb3VwLWxhYmVsIHsKICAgIGNvbG9yOiByZ2JhKHZhcigtLW1qci1ncm91cC1hY2NlbnQpLCAwLjkpOwp9CgoubWpyLXZpZXdlci10b29scy1ncm91cFtzdHlsZSo9Ii0tbWpyLWdyb3VwLWFjY2VudCJdIHsKICAgIGJvcmRlci1jb2xvcjogcmdiYSh2YXIoLS1tanItZ3JvdXAtYWNjZW50KSwgMC4zNSk7Cn0KCi5tanItdmlld2VyLXRvb2xzLWdyb3VwW2RhdGEtZ3JvdXA9ImNoYW5uZWwiXSAubWpyLXZpZXdlci10b29scy1ncm91cC1sYWJlbCwKLm1qci12aWV3ZXItdG9vbHMtZ3JvdXBbZGF0YS1ncm91cD0iYW5hbHlzaXMiXSAubWpyLXZpZXdlci10b29scy1ncm91cC1sYWJlbCwKLm1qci12aWV3ZXItdG9vbHMtZ3JvdXBbZGF0YS1ncm91cD0ib3ZlcmxheS1ndWlkZXMiXSAubWpyLXZpZXdlci10b29scy1ncm91cC1sYWJlbCwKLm1qci12aWV3ZXItdG9vbHMtZ3JvdXBbZGF0YS1ncm91cD0ib3ZlcmxheS1pbnNwZWN0Il0gLm1qci12aWV3ZXItdG9vbHMtZ3JvdXAtbGFiZWwgewogICAgbWluLXdpZHRoOiA0MnB4Owp9CgoubWpyLXZpZXdlci10b29scy1wYW5lbFtkYXRhLXBhbmVsPSJvdmVybGF5Il0gLm1qci12aWV3ZXItdG9vbHMtZ3JvdXBbZGF0YS1ncm91cD0ib3ZlcmxheS1ndWlkZXMiXSB7CiAgICBmbGV4OiAwIDAgYXV0bzsKfQoKLm1qci12aWV3ZXItdG9vbHMtZ3JvdXBbZGF0YS1ncm91cD0ib3ZlcmxheS1ndWlkZXMiXSwKLm1qci12aWV3ZXItdG9vbHMtZ3JvdXBbZGF0YS1ncm91cD0ib3ZlcmxheS1pbnNwZWN0Il0gewogICAgZmxleC13cmFwOiB3cmFwOwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogZmxleC1zdGFydDsKICAgIGFsaWduLWNvbnRlbnQ6IGNlbnRlcjsKfQoKLm1qci12aWV3ZXItdG9vbHMtZ3JvdXBbZGF0YS1ncm91cD0iY2hhbm5lbCJdLAoubWpyLXZpZXdlci10b29scy1ncm91cFtkYXRhLWdyb3VwPSJleHBvc3VyZSJdLAoubWpyLXZpZXdlci10b29scy1ncm91cFtkYXRhLWdyb3VwPSJnYW1tYSJdLAoubWpyLXZpZXdlci10b29scy1ncm91cFtkYXRhLWdyb3VwPSJhbmFseXNpcyJdLAoubWpyLXZpZXdlci10b29scy1ncm91cFtkYXRhLWdyb3VwPSJjb21wYXJlIl0sCi5tanItdmlld2VyLXRvb2xzLWdyb3VwW2RhdGEtZ3JvdXA9ImF1ZGlvLXZpeiJdIHsKICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsKfQoKLm1qci12aWV3ZXItdG9vbHMtYWN0aW9ucywKLm1qci12aWV3ZXItdG9vbHMtbWV0YSB7CiAgICB3aWR0aDogYXV0bzsKICAgIG1pbi1oZWlnaHQ6IDMwcHg7CiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94OwogICAgcGFkZGluZzogNXB4IDdweDsKICAgIGJvcmRlci1yYWRpdXM6IDEwcHg7CiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDYpOwogICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjAzKTsKfQoKLm1qci12aWV3ZXItdG9vbHMtYWN0aW9ucyB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogZmxleC1zdGFydDsKICAgIGdhcDogNnB4OwogICAgZmxleC13cmFwOiB3cmFwOwogICAgbWluLXdpZHRoOiAwOwp9CgoubWpyLXZpZXdlci10b29scy1tZXRhIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOwogICAgZ2FwOiA2cHg7CiAgICBmbGV4LXdyYXA6IHdyYXA7CiAgICBtaW4td2lkdGg6IDA7Cn0KCi5tanItdmlld2VyLXRvb2xzLWFjdGlvbi0tcHJpbWFyeSB7CiAgICBtYXJnaW4tbGVmdDogMDsKfQoKLm1qci12aWV3ZXItdG9vbHMtYWN0aW9uICsgLm1qci12aWV3ZXItdG9vbHMtYWN0aW9uIHsKICAgIG1hcmdpbi1sZWZ0OiA0cHg7Cn0KCi5tanItdmlld2VyLXRvb2xzLXNlbGVjdCB7CiAgICBtaW4taGVpZ2h0OiAyNHB4Owp9CgoubWpyLXZpZXdlci10b29scy1yYW5nZS1pbnB1dCB7CiAgICB3aWR0aDogOTJweCAhaW1wb3J0YW50Owp9CgoubWpyLXZpZXdlci10b29scy1yYW5nZSBzcGFuIHsKICAgIGZvbnQtc2l6ZTogMTFweDsKfQoKQG1lZGlhIChtYXgtd2lkdGg6IDE0ODBweCkgewogICAgLm1qci12aWV3ZXItdG9vbHMtZGVjayB7CiAgICAgICAgZ2FwOiA2cHg7CiAgICB9Cn0KCkBtZWRpYSAobWF4LXdpZHRoOiAxMjIwcHgpIHsKICAgIC5tanItdmlld2VyLWhlYWRlci10b3AgewogICAgICAgIGZsZXgtd3JhcDogd3JhcDsKICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgICAgICBwYWRkaW5nLXJpZ2h0OiA4NHB4OwogICAgICAgIHBhZGRpbmctbGVmdDogMDsKICAgIH0KCiAgICAubWpyLXZpZXdlci1oZWFkZXItYXJlYS0tY2VudGVyLAogICAgLm1qci12aWV3ZXItaGVhZGVyLWFyZWEtLXJpZ2h0IHsKICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgIH0KCiAgICAubWpyLXZpZXdlci1oZWFkZXItYXJlYS0tY2VudGVyIHsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBmbGV4OiAxIDEgMTAwJTsKICAgIH0KCiAgICAubWpyLXZpZXdlci1oZWFkZXItYXJlYS0tcmlnaHQgewogICAgICAgIHBvc2l0aW9uOiBzdGF0aWM7CiAgICAgICAgdHJhbnNmb3JtOiBub25lOwogICAgICAgIG1heC13aWR0aDogMTAwJTsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBmbGV4OiAxIDEgMTAwJTsKICAgIH0KCiAgICAubWpyLXZpZXdlci1oZWFkZXItbWV0YS0tcmlnaHQgewogICAgICAgIGp1c3RpZnktc2VsZjogY2VudGVyOwogICAgfQoKICAgIC5tanItdmlld2VyLXRvb2xzLWRlY2sgewogICAgICAgIGZsZXgtd3JhcDogd3JhcDsKICAgICAgICBvdmVyZmxvdy14OiB2aXNpYmxlOwogICAgfQoKICAgIC5tanItdmlld2VyLXRvb2xzLXBhbmVsLAogICAgLm1qci12aWV3ZXItdG9vbHMtYWN0aW9ucywKICAgIC5tanItdmlld2VyLXRvb2xzLW1ldGEsCiAgICAubWpyLXZpZXdlci10b29scy1wYW5lbC1ib2R5IHsKICAgICAgICBmbGV4LXdyYXA6IHdyYXA7CiAgICB9CgogICAgLm1qci12aWV3ZXItdG9vbHMtbWV0YSB7CiAgICAgICAganVzdGlmeS1jb250ZW50OiBmbGV4LXN0YXJ0OwogICAgfQp9CgoubWpyLXZpZXdlci10b29scy1ncm91cFtkYXRhLWdyb3VwPSJjb21wYXJlIl1bZGF0YS1hY3RpdmU9IjEiXSB7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKHZhcigtLW1qci1ncm91cC1hY2NlbnQpLCAwLjEpOwogICAgYm9yZGVyLWxlZnQtY29sb3I6IHJnYmEodmFyKC0tbWpyLWdyb3VwLWFjY2VudCksIDAuNik7CiAgICBib3JkZXItcmFkaXVzOiAxMHB4OwogICAgcGFkZGluZzogNnB4IDEwcHg7CiAgICBib3gtc2hhZG93OiBpbnNldCAwIDAgMCAxcHggcmdiYSh2YXIoLS1tanItZ3JvdXAtYWNjZW50KSwgMC4yMik7Cn0KCi5tanItdmlld2VyLXRvb2xzLWdyb3VwW2RhdGEtZ3JvdXA9ImNvbXBhcmUiXVtkYXRhLWFjdGl2ZT0iMSJdIC5tanItdmlld2VyLXRvb2xzLXNlbGVjdCB7CiAgICBib3JkZXItY29sb3I6IHJnYmEodmFyKC0tbWpyLWdyb3VwLWFjY2VudCksIDAuNik7CiAgICBib3gtc2hhZG93OiAwIDAgMCAycHggcmdiYSh2YXIoLS1tanItZ3JvdXAtYWNjZW50KSwgMC4xOCk7Cn0KCi5tanItdmlld2VyLXRvb2xzLXNlbGVjdDpmb2N1cyB7CiAgICBvdXRsaW5lOiBub25lOwogICAgYm94LXNoYWRvdzogMCAwIDAgMnB4IHJnYmEoNjQsIDE2MCwgMjU1LCAwLjIyKTsKfQoKLyogTmF0aXZlIGRyb3Bkb3duczogaGludCBkYXJrIFVJIGFuZCBzdHlsZSBvcHRpb25zIHdoZW4gdGhlIGJyb3dzZXIgYWxsb3dzIGl0LiAqLwoubWpyLXZpZXdlci1oZWFkZXIgewogICAgY29sb3Itc2NoZW1lOiBkYXJrOwp9CgoubWpyLXZpZXdlci10b29scy1zZWxlY3QgewogICAgbWluLWhlaWdodDogMjRweDsKICAgIGJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgMC40NikgIWltcG9ydGFudDsKICAgIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuOTIpICFpbXBvcnRhbnQ7CiAgICBib3JkZXItY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xNCkgIWltcG9ydGFudDsKICAgIGJvcmRlci1yYWRpdXM6IDhweCAhaW1wb3J0YW50Owp9CgoubWpyLXZpZXdlci10b29scy1zZWxlY3Qgb3B0aW9uIHsKICAgIGJhY2tncm91bmQ6IHZhcigtLWNvbWZ5LW1lbnUtYmcsICMyYTJhMmEpOwogICAgY29sb3I6IHZhcigtLWNvbnRlbnQtZmcsIHZhcigtLWlucHV0LXRleHQsICNkZGQpKTsKfQoKLm1qci12aWV3ZXItdG9vbHMtcmFuZ2UtaW5wdXQ6Zm9jdXMgewogICAgb3V0bGluZTogbm9uZTsKfQoKLm1qci12aWV3ZXItdG9vbC1idG4tLXJlc2V0IHsKICAgIGJvcmRlci1jb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjIyKSAhaW1wb3J0YW50Owp9CgoubWpyLXZpZXdlci10b29sLWJ0biB7CiAgICBtaW4taGVpZ2h0OiAyNHB4ICFpbXBvcnRhbnQ7CiAgICBib3JkZXItcmFkaXVzOiA4cHggIWltcG9ydGFudDsKICAgIGJvcmRlci13aWR0aDogMXB4ICFpbXBvcnRhbnQ7CiAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoCiAgICAgICAgMTgwZGVnLAogICAgICAgIHJnYmEoMjEwLCAyMTQsIDIyMCwgMC4wNzUpLAogICAgICAgIHJnYmEoMjEwLCAyMTQsIDIyMCwgMC4wMjUpCiAgICApICFpbXBvcnRhbnQ7CiAgICBib3JkZXItY29sb3I6IHJnYmEoMTk2LCAyMDIsIDIxMCwgMC4xNikgIWltcG9ydGFudDsKICAgIGJveC1zaGFkb3c6IGluc2V0IDAgMXB4IDAgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA1KTsKICAgIGZvbnQtc2l6ZTogMTFweCAhaW1wb3J0YW50OwogICAgcGFkZGluZzogMCA4cHggIWltcG9ydGFudDsKfQoKLm1qci12aWV3ZXItdG9vbC1idG46aG92ZXIgewogICAgYm9yZGVyLWNvbG9yOiByZ2JhKDIyMCwgMjI0LCAyMzAsIDAuMjQpICFpbXBvcnRhbnQ7CiAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoCiAgICAgICAgMTgwZGVnLAogICAgICAgIHJnYmEoMjIwLCAyMjQsIDIzMCwgMC4xKSwKICAgICAgICByZ2JhKDIyMCwgMjI0LCAyMzAsIDAuMDM1KQogICAgKSAhaW1wb3J0YW50Owp9CgoubWpyLXZpZXdlci10b29scy1ncm91cFtkYXRhLWdyb3VwPSJhbmFseXNpcyJdIC5tanItdmlld2VyLXRvb2wtYnRuW2RhdGEtYWN0aXZlPSIxIl0gewogICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KAogICAgICAgIDE4MGRlZywKICAgICAgICByZ2JhKDI1NSwgMTY2LCA5MiwgMC4yMiksCiAgICAgICAgcmdiYSgyNTUsIDExNiwgNjQsIDAuMDgpCiAgICApICFpbXBvcnRhbnQ7CiAgICBib3JkZXItY29sb3I6IHJnYmEoMjU1LCAxNjAsIDkyLCAwLjM0KSAhaW1wb3J0YW50OwogICAgY29sb3I6IHJnYmEoMjU1LCAyMzYsIDIyNCwgMC45NikgIWltcG9ydGFudDsKfQoKLm1qci12aWV3ZXItdG9vbHMtZ3JvdXBbZGF0YS1ncm91cD0iYW5hbHlzaXMiXSAubWpyLXZpZXdlci10b29sLWJ0bltkYXRhLWFjdGl2ZT0iMSJdOmhvdmVyIHsKICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgKICAgICAgICAxODBkZWcsCiAgICAgICAgcmdiYSgyNTUsIDE4MCwgMTA4LCAwLjI4KSwKICAgICAgICByZ2JhKDI1NSwgMTI4LCA3MiwgMC4xNCkKICAgICkgIWltcG9ydGFudDsKICAgIGJvcmRlci1jb2xvcjogcmdiYSgyNTUsIDE4NCwgMTE2LCAwLjQ2KSAhaW1wb3J0YW50Owp9CgoubWpyLXZpZXdlci10b29scy1ncm91cFtkYXRhLWdyb3VwPSJvdmVybGF5LWd1aWRlcyJdIC5tanItdmlld2VyLXRvb2wtYnRuW2RhdGEtYWN0aXZlPSIxIl0gewogICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KAogICAgICAgIDE4MGRlZywKICAgICAgICByZ2JhKDkyLCAyMTksIDE4NiwgMC4yMiksCiAgICAgICAgcmdiYSg0NCwgMTcwLCAxNDQsIDAuMDgpCiAgICApICFpbXBvcnRhbnQ7CiAgICBib3JkZXItY29sb3I6IHJnYmEoOTIsIDIxOSwgMTg2LCAwLjM0KSAhaW1wb3J0YW50OwogICAgY29sb3I6IHJnYmEoMjI0LCAyNTUsIDI0OCwgMC45NikgIWltcG9ydGFudDsKfQoKLm1qci12aWV3ZXItdG9vbHMtZ3JvdXBbZGF0YS1ncm91cD0ib3ZlcmxheS1ndWlkZXMiXSAubWpyLXZpZXdlci10b29sLWJ0bltkYXRhLWFjdGl2ZT0iMSJdOmhvdmVyIHsKICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgKICAgICAgICAxODBkZWcsCiAgICAgICAgcmdiYSgxMDIsIDIzMCwgMTk2LCAwLjI4KSwKICAgICAgICByZ2JhKDUyLCAxODIsIDE1NiwgMC4xNCkKICAgICkgIWltcG9ydGFudDsKICAgIGJvcmRlci1jb2xvcjogcmdiYSgxMTAsIDIzNiwgMjAyLCAwLjQ2KSAhaW1wb3J0YW50Owp9CgoubWpyLXZpZXdlci10b29scy1ncm91cFtkYXRhLWdyb3VwPSJvdmVybGF5LWluc3BlY3QiXSAubWpyLXZpZXdlci10b29sLWJ0bltkYXRhLWFjdGl2ZT0iMSJdIHsKICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgKICAgICAgICAxODBkZWcsCiAgICAgICAgcmdiYSgxMjQsIDE2NiwgMjU1LCAwLjIyKSwKICAgICAgICByZ2JhKDEwOSwgODgsIDIyMiwgMC4wOCkKICAgICkgIWltcG9ydGFudDsKICAgIGJvcmRlci1jb2xvcjogcmdiYSgxMzIsIDE3MCwgMjU1LCAwLjM2KSAhaW1wb3J0YW50OwogICAgY29sb3I6IHJnYmEoMjM2LCAyNDIsIDI1NSwgMC45NykgIWltcG9ydGFudDsKfQoKLm1qci12aWV3ZXItdG9vbHMtZ3JvdXBbZGF0YS1ncm91cD0ib3ZlcmxheS1pbnNwZWN0Il0gLm1qci12aWV3ZXItdG9vbC1idG5bZGF0YS1hY3RpdmU9IjEiXTpob3ZlciB7CiAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoCiAgICAgICAgMTgwZGVnLAogICAgICAgIHJnYmEoMTM4LCAxODAsIDI1NSwgMC4zKSwKICAgICAgICByZ2JhKDEyNCwgMTAwLCAyMzIsIDAuMTQpCiAgICApICFpbXBvcnRhbnQ7CiAgICBib3JkZXItY29sb3I6IHJnYmEoMTQ4LCAxODgsIDI1NSwgMC40OCkgIWltcG9ydGFudDsKfQoKLm1qci12aWV3ZXItdG9vbC1idG5bZGF0YS1hY3RpdmU9IjEiXSB7CiAgICBmaWx0ZXI6IHNhdHVyYXRlKDEuMTIpIGJyaWdodG5lc3MoMS4wNCk7CiAgICBib3gtc2hhZG93OgogICAgICAgIGluc2V0IDAgMXB4IDAgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEpLAogICAgICAgIDAgMCAwIDFweCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDYpLAogICAgICAgIDAgOHB4IDE4cHggcmdiYSgwLCAwLCAwLCAwLjE2KSAhaW1wb3J0YW50Owp9CgoubWpyLXZpZXdlci1oZWxwIHsKICAgIGJvcmRlci1yYWRpdXM6IDE0cHggIWltcG9ydGFudDsKICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgxODBkZWcsIHJnYmEoMTMsIDE3LCAyMiwgMC45NiksIHJnYmEoOCwgMTEsIDE2LCAwLjk4KSkgIWltcG9ydGFudDsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xMikgIWltcG9ydGFudDsKICAgIGJveC1zaGFkb3c6IDAgMThweCAzNHB4IHJnYmEoMCwgMCwgMCwgMC4zNCkgIWltcG9ydGFudDsKfQoKQG1lZGlhIChtYXgtd2lkdGg6IDEyMjBweCkgewogICAgLm1qci12aWV3ZXItdG9vbHMgewogICAgICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogMWZyOwogICAgfQoKICAgIC5tanItdmlld2VyLXRvb2xzLWFjdGlvbnMgewogICAgICAgIGp1c3RpZnktY29udGVudDogZmxleC1zdGFydDsKICAgIH0KCiAgICAubWpyLXZpZXdlci1oZWFkZXItdG9wIHsKICAgICAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IDFmcjsKICAgICAgICBqdXN0aWZ5LWl0ZW1zOiBjZW50ZXI7CiAgICB9CgogICAgLm1qci12aWV3ZXItaGVhZGVyLWFyZWEtLWxlZnQsCiAgICAubWpyLXZpZXdlci1oZWFkZXItYXJlYS0tY2VudGVyLAogICAgLm1qci12aWV3ZXItaGVhZGVyLWFyZWEtLXJpZ2h0IHsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgIH0KCiAgICAubWpyLXZpZXdlci1oZWFkZXItbWV0YS0tbGVmdCwKICAgIC5tanItdmlld2VyLWhlYWRlci1tZXRhLS1yaWdodCB7CiAgICAgICAganVzdGlmeS1zZWxmOiBjZW50ZXI7CiAgICB9CgogICAgLm1qci12aWV3ZXItdG9vbHMtYm9keSB7CiAgICAgICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiByZXBlYXQoYXV0by1maXQsIG1pbm1heCgyMjBweCwgMWZyKSk7CiAgICB9Cn0KCi8qID09PT09PT09PT0gQ3VzdG9tIFZpZGVvIENvbnRyb2xzIChubyBuYXRpdmUgYmFyKSA9PT09PT09PT09ICovCi5tanItdmlkZW8taG9zdCB7CiAgICBwb3NpdGlvbjogcmVsYXRpdmU7Cn0KCi5tanItdmlkZW8tY29udHJvbHMgewogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgbGVmdDogMTJweDsKICAgIHJpZ2h0OiAxMnB4OwogICAgYm90dG9tOiAxMnB4OwogICAgZGlzcGxheTogZmxleDsKICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICBnYXA6IDhweDsKICAgIHBhZGRpbmc6IDhweCAxMHB4OwogICAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjYpOwogICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE0KTsKICAgIGJvcmRlci1yYWRpdXM6IDEwcHg7CiAgICBiYWNrZHJvcC1maWx0ZXI6IGJsdXIoMTBweCk7CiAgICBvcGFjaXR5OiAwOwogICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICB0cmFuc2l0aW9uOiBvcGFjaXR5IDAuMTVzIGVhc2U7CiAgICB6LWluZGV4OiA1Owp9CgoubWpyLXZpZGVvLXJvdyB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogMTBweDsKICAgIG1pbi13aWR0aDogMDsKfQoKLm1qci12aWRlby1yb3ctLXRvcCB7CiAgICBnYXA6IDEycHg7CiAgICBkaXNwbGF5OiBncmlkOwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogYXV0byBhdXRvIDFmciBhdXRvIGF1dG87Cn0KCi5tanItdmlkZW8tY29udHJvbHMtLXZpZXdlcmJhciAubWpyLXZpZGVvLXJvdy0tdG9wIHsKICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogYXV0byBhdXRvIDFmciBhdXRvIGF1dG87Cn0KCi5tanItdmlkZW8tY29udHJvbHMtLXByZXZpZXcgLm1qci12aWRlby1yb3ctLXRvcCB7CiAgICBkaXNwbGF5OiBmbGV4Owp9CgoubWpyLXZpZGVvLXJvdy0tYm90dG9tIHsKICAgIGdhcDogOHB4Owp9CgoubWpyLXZpZGVvLWdyb3VwIHsKICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogNnB4OwogICAgbWluLXdpZHRoOiAwOwogICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC44NSk7CiAgICBmb250LXNpemU6IDEycHg7CiAgICB1c2VyLXNlbGVjdDogbm9uZTsKfQoKLm1qci12aWRlby1udW0gewogICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA2KTsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xOCk7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjk1KTsKICAgIGJvcmRlci1yYWRpdXM6IDhweDsKICAgIHBhZGRpbmc6IDVweCA4cHg7CiAgICBmb250LXNpemU6IDEycHg7CiAgICBsaW5lLWhlaWdodDogMTsKICAgIG91dGxpbmU6IG5vbmU7Cn0KCi5tanItdmlkZW8tbnVtOmZvY3VzIHsKICAgIGJvcmRlci1jb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjM4KTsKfQoKLm1qci12aWRlby1udW0tLWZwcy5pcy1vdmVycmlkZGVuIHsKICAgIGJvcmRlci1jb2xvcjogcmdiYSgyNDUsIDE1OCwgMTEsIDAuODIpOwogICAgY29sb3I6ICNmYmJmMjQ7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDI0NSwgMTU4LCAxMSwgMC4xNCk7Cn0KCi5tanItdmlkZW8tbnVtLS1mcHMuaXMtb3ZlcnJpZGRlbjpmb2N1cyB7CiAgICBib3JkZXItY29sb3I6IHJnYmEoMjUxLCAxOTEsIDM2LCAwLjk2KTsKfQoKLm1qci12aWRlby1udW0tLXNwZWVkIHsKICAgIGNvbG9yLXNjaGVtZTogZGFyazsKICAgIGJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgMC42Mik7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjk1KTsKfQoKLm1qci12aWRlby1udW0tLXNwZWVkIG9wdGlvbiB7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1jb21meS1tZW51LWJnLCAjMmEyYTJhKTsKICAgIGNvbG9yOiB2YXIoLS1jb250ZW50LWZnLCAjZGRkKTsKfQoKLm1qci12aWRlby1mcmFtZSB7CiAgICBmb250LXNpemU6IDEycHg7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjkpOwogICAgbWluLXdpZHRoOiA1MnB4OwogICAgdGV4dC1hbGlnbjogcmlnaHQ7CiAgICB1c2VyLXNlbGVjdDogbm9uZTsKfQoKLm1qci12aWRlby1mcmFtZS5pcy1zdGVwIHsKICAgIGNvbG9yOiAjZmZkMjRkOwp9CgoubWpyLXZpZGVvLWJvdHRvbSB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogOHB4OwogICAgbWluLXdpZHRoOiAwOwogICAgZmxleDogMTsKfQoKLm1qci12aWRlby1ib3R0b20tLWxlZnQgewogICAganVzdGlmeS1jb250ZW50OiBmbGV4LXN0YXJ0Owp9CgoubWpyLXZpZGVvLWJvdHRvbS0tcmlnaHQgewogICAganVzdGlmeS1jb250ZW50OiBmbGV4LWVuZDsKfQoKLm1qci12aWRlby10cmFuc3BvcnQgewogICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICBnYXA6IDhweDsKICAgIGZsZXg6IDAgMCBhdXRvOwp9CgovKiBTaG93IGNvbnRyb2xzIG9uIGhvdmVyL2ZvY3VzICh2aWV3ZXIpLiAqLwoubWpyLXZpZGVvLWhvc3Q6aG92ZXIgLm1qci12aWRlby1jb250cm9scywKLm1qci12aWRlby1jb250cm9sczpmb2N1cy13aXRoaW4gewogICAgb3BhY2l0eTogMTsKICAgIHBvaW50ZXItZXZlbnRzOiBhdXRvOwp9CgovKiBQcmV2aWV3OiBrZWVwIGNvbnRyb2xzIHZpc2libGUgYmVjYXVzZSB0aGUgYXJlYSBpcyBzbWFsbC4gKi8KLm1qci12aWRlby1jb250cm9scy0tcHJldmlldyB7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICBsZWZ0OiBhdXRvOwogICAgcmlnaHQ6IDEwcHg7CiAgICB0b3A6IGF1dG87CiAgICBib3R0b206IDEwcHg7CiAgICBvcGFjaXR5OiAxOwogICAgcG9pbnRlci1ldmVudHM6IGF1dG87CiAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsKICAgIGJvcmRlcjogbm9uZTsKICAgIHBhZGRpbmc6IDA7CiAgICBkaXNwbGF5OiBibG9jazsKICAgIHdpZHRoOiBhdXRvOwogICAgaGVpZ2h0OiBhdXRvOwogICAgYmFja2Ryb3AtZmlsdGVyOiBub25lOwogICAgLXdlYmtpdC1iYWNrZHJvcC1maWx0ZXI6IG5vbmU7Cn0KCi5tanItdmlkZW8tcHJldmlldy1idG4gewogICAgd2lkdGg6IDM4cHg7CiAgICBoZWlnaHQ6IDM4cHg7CiAgICBib3JkZXItcmFkaXVzOiA5OTlweDsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4yMik7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIDAuNDIpOwogICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC45Mik7CiAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKfQoKLm1qci12aWRlby1wcmV2aWV3LWJ0bjpob3ZlciB7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIDAuNSk7CiAgICBib3JkZXItY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4yOCk7Cn0KCi5tanItdmlkZW8tcHJldmlldy1idG4gLnBpIHsKICAgIGZvbnQtc2l6ZTogMTZweDsKICAgIGxpbmUtaGVpZ2h0OiAxOwp9CgoubWpyLXZpZGVvLWJ0biB7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDgpOwogICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE4KTsKICAgIGNvbG9yOiAjZmZmOwogICAgYm9yZGVyLXJhZGl1czogOHB4OwogICAgcGFkZGluZzogNnB4IDEwcHg7CiAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICBmb250LXNpemU6IDEzcHg7CiAgICBsaW5lLWhlaWdodDogMTsKfQoKLm1qci12aWRlby1idG46aG92ZXIgewogICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE0KTsKfQoKLm1qci12aWRlby1idG4uaXMtb24gewogICAgYmFja2dyb3VuZDogcmdiYSg2NCwgMTYwLCAyNTUsIDAuMjUpOwogICAgYm9yZGVyLWNvbG9yOiByZ2JhKDY0LCAxNjAsIDI1NSwgMC41NSk7Cn0KCi5tanItdmlkZW8tYnRuLS1pbiB7CiAgICBib3JkZXItY29sb3I6IHJnYmEoNzAsIDI1NSwgMTIwLCAwLjU1KTsKICAgIGJhY2tncm91bmQ6IHJnYmEoNzAsIDI1NSwgMTIwLCAwLjEyKTsKfQoKLm1qci12aWRlby1idG4tLWluOmhvdmVyIHsKICAgIGJhY2tncm91bmQ6IHJnYmEoNzAsIDI1NSwgMTIwLCAwLjE4KTsKfQoKLm1qci12aWRlby1idG4tLW91dCB7CiAgICBib3JkZXItY29sb3I6IHJnYmEoMjU1LCA3MCwgNzAsIDAuNTUpOwogICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDcwLCA3MCwgMC4xKTsKfQoKLm1qci12aWRlby1idG4tLW91dDpob3ZlciB7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgNzAsIDcwLCAwLjE2KTsKfQoKLm1qci12aWRlby10aW1lIHsKICAgIGZvbnQtc2l6ZTogMTJweDsKICAgIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuOSk7CiAgICBtaW4td2lkdGg6IDkycHg7CiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgICB1c2VyLXNlbGVjdDogbm9uZTsKfQoKLm1qci12aWRlby10aW1lZ3JvdXAgewogICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBmbGV4LWVuZDsKICAgIGdhcDogMTBweDsKICAgIG1pbi13aWR0aDogMDsKfQoKLm1qci12aWRlby1yYW5nZS1jb3VudCB7CiAgICBmb250LXNpemU6IDEycHg7CiAgICBjb2xvcjogcmdiYSg2NCwgMTkwLCAyNTUsIDAuOTIpOwogICAgYmFja2dyb3VuZDogcmdiYSg2NCwgMTkwLCAyNTUsIDAuMSk7CiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDY0LCAxOTAsIDI1NSwgMC4yNSk7CiAgICBib3JkZXItcmFkaXVzOiA5OTlweDsKICAgIHBhZGRpbmc6IDFweCA4cHg7CiAgICBsaW5lLWhlaWdodDogMTZweDsKICAgIGZvbnQtdmFyaWFudC1udW1lcmljOiB0YWJ1bGFyLW51bXM7CiAgICB1c2VyLXNlbGVjdDogbm9uZTsKfQoKLm1qci12aWRlby1yYW5nZSB7CiAgICBhY2NlbnQtY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC45KTsKfQoKLm1qci12aWRlby1yYW5nZS0tc2VlayB7CiAgICBmbGV4OiAxOwogICAgbWluLXdpZHRoOiA4MHB4OwogICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgei1pbmRleDogMTsKICAgIC8qIFdlIGRyYXcgb3VyIG93biBwbGF5aGVhZC9tYXJrZXJzOyBoaWRlIHRoZSBuYXRpdmUgdGh1bWIgImRvdCIuICovCiAgICAtd2Via2l0LWFwcGVhcmFuY2U6IG5vbmU7CiAgICBhcHBlYXJhbmNlOiBub25lOwp9CgoubWpyLXZpZGVvLXJhbmdlLS1zZWVrOjotd2Via2l0LXNsaWRlci10aHVtYiB7CiAgICAtd2Via2l0LWFwcGVhcmFuY2U6IG5vbmU7CiAgICBhcHBlYXJhbmNlOiBub25lOwogICAgd2lkdGg6IDA7CiAgICBoZWlnaHQ6IDA7CiAgICBib3JkZXI6IDA7CiAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsKICAgIGJveC1zaGFkb3c6IG5vbmU7Cn0KCi5tanItdmlkZW8tcmFuZ2UtLXNlZWs6Oi1tb3otcmFuZ2UtdGh1bWIgewogICAgd2lkdGg6IDA7CiAgICBoZWlnaHQ6IDA7CiAgICBib3JkZXI6IDA7CiAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsKICAgIGJveC1zaGFkb3c6IG5vbmU7Cn0KCi5tanItdmlkZW8tc2Vlay13cmFwIHsKICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgIG1pbi13aWR0aDogODBweDsKICAgIGZsZXg6IDE7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKfQoKLm1qci12aWRlby1zZWVrLXpvbmVzIHsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIGxlZnQ6IDA7CiAgICByaWdodDogMDsKICAgIHRvcDogNTAlOwogICAgaGVpZ2h0OiAxMHB4OwogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC01MCUpOwogICAgYm9yZGVyLXJhZGl1czogOTk5cHg7CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICB6LWluZGV4OiAyOwp9CgoubWpyLXZpZGVvLXNlZWstem9uZSB7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICB0b3A6IDA7CiAgICBib3R0b206IDA7Cn0KCi8qIDAuLkluOiB0cmltbWVkLW91dCByYW5nZS4gKi8KLm1qci12aWRlby1zZWVrLXpvbmUtLWxlZnRUcmltIHsKICAgIGJhY2tncm91bmQ6IHJnYmEoMjU1LCA3MCwgNzAsIDAuMTgpOwp9CgovKiBJbi4uT3V0OiBzZWxlY3RlZCBwbGF5YmFjayByYW5nZSBoaWdobGlnaHQuICovCi5tanItdmlkZW8tc2Vlay16b25lLS1zZWxlY3RlZCB7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDY0LCAxOTAsIDI1NSwgMC41NSk7Cn0KCi5tanItdmlkZW8tc2Vlay16b25lcy5pcy1mdWxscmFuZ2UgLm1qci12aWRlby1zZWVrLXpvbmUtLXNlbGVjdGVkIHsKICAgIGJhY2tncm91bmQ6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xMik7Cn0KCi8qIE91dC4uRW5kOiBzaG93IG91dC1vZi1yYW5nZSBmcmFtZXMgYXMgYSBkaWZmZXJlbnQgY29sb3IuICovCi5tanItdmlkZW8tc2Vlay16b25lLS1yaWdodFRyaW0gewogICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDcwLCA3MCwgMC4yKTsKfQoKLm1qci12aWRlby1zZWVrLW92ZXJsYXkgewogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgbGVmdDogMDsKICAgIHJpZ2h0OiAwOwogICAgdG9wOiA1MCU7CiAgICBoZWlnaHQ6IDA7CiAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgIHotaW5kZXg6IDM7Cn0KCi5tanItdmlkZW8tc2Vlay1oYW5kbGUgewogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgdG9wOiA1MCU7CiAgICB3aWR0aDogMTZweDsKICAgIGhlaWdodDogMzJweDsKICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUsIC01MCUpOwogICAgY3Vyc29yOiBldy1yZXNpemU7CiAgICBwb2ludGVyLWV2ZW50czogYXV0bzsKICAgIHRvdWNoLWFjdGlvbjogbm9uZTsKICAgIHVzZXItc2VsZWN0OiBub25lOwogICAgei1pbmRleDogNDsKICAgIGJvcmRlci1yYWRpdXM6IDZweDsKICAgIGJhY2tncm91bmQ6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wNik7CiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTQpOwogICAgYm94LXNoYWRvdzogMCA0cHggMTBweCByZ2JhKDAsIDAsIDAsIDAuMzUpOwp9CgoubWpyLXZpZGVvLXNlZWstaGFuZGxlOmhvdmVyIHsKICAgIGJhY2tncm91bmQ6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xKTsKICAgIGJvcmRlci1jb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjI0KTsKfQoKLm1qci12aWRlby1zZWVrLWhhbmRsZS0taW46OmFmdGVyLAoubWpyLXZpZGVvLXNlZWstaGFuZGxlLS1vdXQ6OmFmdGVyIHsKICAgIGNvbnRlbnQ6ICIiOwogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgbGVmdDogNTAlOwogICAgdG9wOiA1MCU7CiAgICB3aWR0aDogMnB4OwogICAgaGVpZ2h0OiAxOHB4OwogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTUwJSwgLTUwJSk7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgNzAsIDcwLCAwLjk1KTsKICAgIGJvcmRlci1yYWRpdXM6IDJweDsKfQoKLm1qci12aWRlby1zZWVrLWhhbmRsZS0taW46OmFmdGVyIHsKICAgIGJhY2tncm91bmQ6IHJnYmEoNzAsIDI1NSwgMTIwLCAwLjk1KTsKfQoKLm1qci12aWRlby1zZWVrLWhhbmRsZS0taW46OmJlZm9yZSwKLm1qci12aWRlby1zZWVrLWhhbmRsZS0tb3V0OjpiZWZvcmUgewogICAgY29udGVudDogIiI7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICBsZWZ0OiA1MCU7CiAgICB3aWR0aDogMDsKICAgIGhlaWdodDogMDsKICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgtNTAlKTsKfQoKLm1qci12aWRlby1zZWVrLWhhbmRsZS0taW46OmJlZm9yZSB7CiAgICB0b3A6IDRweDsKICAgIGJvcmRlci1sZWZ0OiA1cHggc29saWQgdHJhbnNwYXJlbnQ7CiAgICBib3JkZXItcmlnaHQ6IDVweCBzb2xpZCB0cmFuc3BhcmVudDsKICAgIGJvcmRlci1ib3R0b206IDZweCBzb2xpZCByZ2JhKDcwLCAyNTUsIDEyMCwgMC45NSk7Cn0KCi5tanItdmlkZW8tc2Vlay1oYW5kbGUtLW91dDo6YmVmb3JlIHsKICAgIGJvdHRvbTogNHB4OwogICAgYm9yZGVyLWxlZnQ6IDVweCBzb2xpZCB0cmFuc3BhcmVudDsKICAgIGJvcmRlci1yaWdodDogNXB4IHNvbGlkIHRyYW5zcGFyZW50OwogICAgYm9yZGVyLXRvcDogNnB4IHNvbGlkIHJnYmEoMjU1LCA3MCwgNzAsIDAuOTUpOwp9CgoubWpyLXZpZGVvLXNlZWstdGlja3MgewogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgbGVmdDogMDsKICAgIHJpZ2h0OiAwOwogICAgdG9wOiAtMTZweDsKICAgIGhlaWdodDogMTJweDsKICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMSk7CiAgICBvcGFjaXR5OiAwLjk7Cn0KCi5tanItdmlkZW8tc2Vlay1sYWJlbHMgewogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgbGVmdDogMDsKICAgIHJpZ2h0OiAwOwogICAgdG9wOiAtMzRweDsKICAgIGhlaWdodDogMTRweDsKICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgZm9udC1zaXplOiAxMHB4OwogICAgbGluZS1oZWlnaHQ6IDE0cHg7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjcyKTsKICAgIGZvbnQtdmFyaWFudC1udW1lcmljOiB0YWJ1bGFyLW51bXM7CiAgICB0ZXh0LXNoYWRvdzogMCAxcHggMCByZ2JhKDAsIDAsIDAsIDAuNTUpOwp9CgoubWpyLXZpZGVvLXNlZWstbGFiZWwgewogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKC01MCUpOwogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKfQoKLm1qci12aWRlby1zZWVrLXBsYXloZWFkLWxhYmVsIHsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIHRvcDogMTJweDsKICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgtNTAlKTsKICAgIHBhZGRpbmc6IDFweCA2cHg7CiAgICBib3JkZXItcmFkaXVzOiA5OTlweDsKICAgIGJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgMC41NSk7CiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTQpOwogICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC45Mik7CiAgICBmb250LXNpemU6IDEwcHg7CiAgICBsaW5lLWhlaWdodDogMTRweDsKICAgIGZvbnQtdmFyaWFudC1udW1lcmljOiB0YWJ1bGFyLW51bXM7CiAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKfQoKLm1qci12aWRlby1zZWVrLW1hcmsgewogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgdG9wOiAtMTBweDsKICAgIHdpZHRoOiAxNHB4OwogICAgaGVpZ2h0OiAyMHB4OwogICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLTUwJSk7CiAgICBjdXJzb3I6IGV3LXJlc2l6ZTsKICAgIHBvaW50ZXItZXZlbnRzOiBhdXRvOwogICAgdG91Y2gtYWN0aW9uOiBub25lOwogICAgei1pbmRleDogNDsKICAgIC0tbWpyLW1hcmstY29sb3I6IHJnYmEoMjU1LCA3MCwgNzAsIDAuOTUpOwp9CgoubWpyLXZpZGVvLXNlZWstbWFyay0taW4gewogICAgLS1tanItbWFyay1jb2xvcjogcmdiYSg3MCwgMjU1LCAxMjAsIDAuOTUpOwp9CgoubWpyLXZpZGVvLXNlZWstbWFyazo6YmVmb3JlIHsKICAgIGNvbnRlbnQ6ICIiOwogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgbGVmdDogNTAlOwogICAgdG9wOiAwOwogICAgYm90dG9tOiAwOwogICAgd2lkdGg6IDJweDsKICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgtNTAlKTsKICAgIGJhY2tncm91bmQ6IHZhcigtLW1qci1tYXJrLWNvbG9yKTsKICAgIGJvcmRlci1yYWRpdXM6IDJweDsKICAgIGJveC1zaGFkb3c6IDAgMCAwIDFweCByZ2JhKDAsIDAsIDAsIDAuMzUpOwp9CgoubWpyLXZpZGVvLXNlZWstbWFyazo6YWZ0ZXIgewogICAgY29udGVudDogIiI7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICB0b3A6IC01cHg7CiAgICBsZWZ0OiA1MCU7CiAgICB3aWR0aDogMDsKICAgIGhlaWdodDogMDsKICAgIGJvcmRlci1sZWZ0OiA1cHggc29saWQgdHJhbnNwYXJlbnQ7CiAgICBib3JkZXItcmlnaHQ6IDVweCBzb2xpZCB0cmFuc3BhcmVudDsKICAgIGJvcmRlci1ib3R0b206IDZweCBzb2xpZCB2YXIoLS1tanItbWFyay1jb2xvcik7CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLTUwJSk7Cn0KCi5tanItdmlkZW8tc2Vlay1tYXJrLS1pbjo6YWZ0ZXIgewogICAgYm9yZGVyLWJvdHRvbS1jb2xvcjogdmFyKC0tbWpyLW1hcmstY29sb3IpOwp9CgoubWpyLXZpZGVvLXNlZWstbWFyay0tb3V0OjphZnRlciB7CiAgICB0b3A6IGF1dG87CiAgICBib3R0b206IC01cHg7CiAgICBib3JkZXItYm90dG9tOiBub25lOwogICAgYm9yZGVyLXRvcDogNnB4IHNvbGlkIHZhcigtLW1qci1tYXJrLWNvbG9yKTsKfQoKLm1qci12aWRlby1zZWVrLXBsYXloZWFkIHsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIHRvcDogLTEycHg7CiAgICB3aWR0aDogMnB4OwogICAgaGVpZ2h0OiAyNHB4OwogICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDIwMCwgNzAsIDAuOTUpOwogICAgYm94LXNoYWRvdzogMCAwIDAgMXB4IHJnYmEoMCwgMCwgMCwgMC4zNSk7CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLTFweCk7Cn0KCi5tanItdmlkZW8tY29udHJvbHMtLXZpZXdlcmJhciB7CiAgICBwb3NpdGlvbjogc3RhdGljOwogICAgbGVmdDogYXV0bzsKICAgIHJpZ2h0OiBhdXRvOwogICAgYm90dG9tOiBhdXRvOwogICAgb3BhY2l0eTogMTsKICAgIHBvaW50ZXItZXZlbnRzOiBhdXRvOwogICAgd2lkdGg6IDEwMCU7CiAgICBtYXgtd2lkdGg6IG5vbmU7CiAgICBtYXJnaW46IDA7CiAgICBwYWRkaW5nOiAxNHB4OwogICAgYm9yZGVyLXJhZGl1czogMThweDsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMTk2LCAyMDIsIDIxMCwgMC4xMik7CiAgICBiYWNrZ3JvdW5kOgogICAgICAgIHJhZGlhbC1ncmFkaWVudChjaXJjbGUgYXQgdG9wIGxlZnQsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wMyksIHRyYW5zcGFyZW50IDM0JSksCiAgICAgICAgbGluZWFyLWdyYWRpZW50KDE4MGRlZywgcmdiYSgxOTgsIDIwMywgMjEwLCAwLjAyNSksIHJnYmEoMTk4LCAyMDMsIDIxMCwgMC4wMDgpKSwKICAgICAgICBsaW5lYXItZ3JhZGllbnQoMTY1ZGVnLCByZ2JhKDE4LCAyMiwgMjgsIDAuODIpLCByZ2JhKDEyLCAxNSwgMjEsIDAuOSkpOwogICAgYm94LXNoYWRvdzoKICAgICAgICBpbnNldCAwIDFweCAwIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wNCksCiAgICAgICAgMCAxMHB4IDMwcHggcmdiYSgwLCAwLCAwLCAwLjE0KTsKICAgIGJhY2tkcm9wLWZpbHRlcjogbm9uZTsKICAgIC13ZWJraXQtYmFja2Ryb3AtZmlsdGVyOiBub25lOwogICAgZ2FwOiAxMnB4Owp9CgoubWpyLXZpZGVvLWNvbnRyb2xzLS12aWV3ZXJiYXIgLm1qci12aWRlby1idG4gewogICAgbWluLWhlaWdodDogMzhweDsKICAgIHBhZGRpbmc6IDhweCAxMnB4OwogICAgZm9udC1zaXplOiAxMnB4OwogICAgYm9yZGVyLXJhZGl1czogMTJweDsKICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgxODBkZWcsIHJnYmEoMjEwLCAyMTQsIDIyMCwgMC4wNyksIHJnYmEoMjEwLCAyMTQsIDIyMCwgMC4wMikpOwogICAgYm9yZGVyLWNvbG9yOiByZ2JhKDE5NCwgMjAxLCAyMDgsIDAuMTgpOwogICAgYm9yZGVyLXdpZHRoOiAxcHg7CiAgICBib3gtc2hhZG93OiBpbnNldCAwIDFweCAwIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wNik7CiAgICB0cmFuc2l0aW9uOgogICAgICAgIHRyYW5zZm9ybSAwLjEycyBlYXNlLAogICAgICAgIGJhY2tncm91bmQtY29sb3IgMC4xMnMgZWFzZSwKICAgICAgICBib3JkZXItY29sb3IgMC4xMnMgZWFzZSwKICAgICAgICBib3gtc2hhZG93IDAuMTJzIGVhc2U7Cn0KCi5tanItdmlkZW8tY29udHJvbHMtLXZpZXdlcmJhciAubWpyLXZpZGVvLWJ0bjpob3ZlciB7CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTFweCk7CiAgICBib3JkZXItY29sb3I6IHJnYmEoMjIwLCAyMjQsIDIzMCwgMC4yNik7CiAgICBib3gtc2hhZG93OgogICAgICAgIGluc2V0IDAgMXB4IDAgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA4KSwKICAgICAgICAwIDhweCAxOHB4IHJnYmEoMCwgMCwgMCwgMC4xNCk7Cn0KCi5tanItdmlkZW8tY29udHJvbHMtLXZpZXdlcmJhciAubWpyLXZpZGVvLWJ0bi5pcy1vbiB7CiAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoMTgwZGVnLCByZ2JhKDEwMCwgMTcwLCAyNTUsIDAuMiksIHJnYmEoMTAwLCAxNzAsIDI1NSwgMC4wOCkpOwogICAgYm9yZGVyLWNvbG9yOiByZ2JhKDEyMCwgMTg2LCAyNTUsIDAuNDIpOwogICAgYm94LXNoYWRvdzogMCAwIDAgMXB4IHJnYmEoMTIwLCAxODYsIDI1NSwgMC4xMikgaW5zZXQ7Cn0KCi5tanItdmlkZW8tY29udHJvbHMtLXZpZXdlcmJhciAubWpyLXZpZGVvLWJ0biAucGkgewogICAgZm9udC1zaXplOiAxNHB4OwogICAgbGluZS1oZWlnaHQ6IDE7Cn0KCi5tanItdmlkZW8tY29udHJvbHMtLXZpZXdlcmJhciAubWpyLXZpZGVvLWJhci1oZWFkLAoubWpyLXZpZGVvLWNvbnRyb2xzLS12aWV3ZXJiYXIgLm1qci12aWRlby1iYXItYWN0aW9ucyB7CiAgICBkaXNwbGF5OiBncmlkOwogICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiBtaW5tYXgoMCwgMWZyKSBhdXRvIG1pbm1heCgwLCAxZnIpOwogICAgZ2FwOiAxMnB4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKfQoKLm1qci12aWRlby1jb250cm9scy0tdmlld2VyYmFyIC5tanItdmlkZW8tYmFyLXN0YXR1cywKLm1qci12aWRlby1jb250cm9scy0tdmlld2VyYmFyIC5tanItdmlkZW8tYmFyLXNpZGUgewogICAgbWluLXdpZHRoOiAwOwogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBnYXA6IDEwcHg7CiAgICBmbGV4LXdyYXA6IHdyYXA7Cn0KCi5tanItdmlkZW8tY29udHJvbHMtLXZpZXdlcmJhciAubWpyLXZpZGVvLWJhci1jZW50ZXIgewogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKfQoKLm1qci12aWRlby1jb250cm9scy0tdmlld2VyYmFyIC5tanItdmlkZW8tYmFyLWhlYWQgewogICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiBtaW5tYXgoMCwgMWZyKTsKfQoKLm1qci12aWRlby1jb250cm9scy0tdmlld2VyYmFyIC5tanItdmlkZW8tYmFyLXNpZGUtLXJpZ2h0IHsKICAgIGp1c3RpZnktY29udGVudDogZmxleC1lbmQ7Cn0KCi5tanItdmlkZW8tY29udHJvbHMtLXZpZXdlcmJhciAubWpyLXZpZGVvLWJhci10aW1lbGluZSB7CiAgICBkaXNwbGF5OiBncmlkOwogICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiBhdXRvIG1pbm1heCgwLCAxZnIpIGF1dG87CiAgICBnYXA6IDEycHg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgcGFkZGluZzogMTBweCAxMnB4OwogICAgYm9yZGVyLXJhZGl1czogMTZweDsKICAgIGJhY2tncm91bmQ6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wNCk7CiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDYpOwp9CgoubWpyLXZpZGVvLWNvbnRyb2xzLS12aWV3ZXJiYXIubWpyLXZpZGVvLWNvbnRyb2xzLS1hdWRpbyAubWpyLXZpZGVvLWJhci10aW1lbGluZSB7CiAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IG1pbm1heCgwLCAxZnIpIGF1dG8gYXV0bzsKfQoKLm1qci12aWRlby1jb250cm9scy0tdmlld2VyYmFyLm1qci12aWRlby1jb250cm9scy0tYXVkaW8gLm1qci12aWRlby1zZWVrLXdyYXAgewogICAgZ3JpZC1jb2x1bW46IDEgLyAtMTsKICAgIGdyaWQtcm93OiAxOwogICAgd2lkdGg6IDEwMCU7Cn0KCi5tanItdmlkZW8tY29udHJvbHMtLXZpZXdlcmJhci5tanItdmlkZW8tY29udHJvbHMtLWF1ZGlvIC5tanItdmlkZW8tZ3JvdXAtLWluLAoubWpyLXZpZGVvLWNvbnRyb2xzLS12aWV3ZXJiYXIubWpyLXZpZGVvLWNvbnRyb2xzLS1hdWRpbyAubWpyLXZpZGVvLWdyb3VwLS1vdXQgewogICAgZ3JpZC1yb3c6IDI7CiAgICB3aWR0aDogbWF4LWNvbnRlbnQ7CiAgICBtYXgtd2lkdGg6IDEwMCU7Cn0KCi5tanItdmlkZW8tY29udHJvbHMtLXZpZXdlcmJhciAubWpyLXZpZGVvLW1lZGlhLWJhZGdlIHsKICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgbWluLWhlaWdodDogMjhweDsKICAgIHBhZGRpbmc6IDAgMTBweDsKICAgIGJvcmRlci1yYWRpdXM6IDk5OXB4OwogICAgYmFja2dyb3VuZDogcmdiYSg3OCwgMjI0LCAxOTYsIDAuMTIpOwogICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSg3OCwgMjI0LCAxOTYsIDAuMjIpOwogICAgY29sb3I6IHJnYmEoMjIwLCAyNDcsIDI0MSwgMC45Nik7CiAgICBmb250LXNpemU6IDExcHg7CiAgICBmb250LXdlaWdodDogNjAwOwogICAgbGV0dGVyLXNwYWNpbmc6IDAuMDhlbTsKICAgIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7Cn0KCi5tanItdmlkZW8tY29udHJvbHMtLXZpZXdlcmJhciAubWpyLXZpZGVvLXRpbWVncm91cCB7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtc3RhcnQ7CiAgICBnYXA6IDhweDsKICAgIHBhZGRpbmc6IDVweCAxMHB4OwogICAgYm9yZGVyLXJhZGl1czogOTk5cHg7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDQ1KTsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wOCk7Cn0KCi5tanItdmlkZW8tY29udHJvbHMtLXZpZXdlcmJhciAubWpyLXZpZGVvLXRpbWUsCi5tanItdmlkZW8tY29udHJvbHMtLXZpZXdlcmJhciAubWpyLXZpZGVvLWZyYW1lIHsKICAgIGZvbnQtdmFyaWFudC1udW1lcmljOiB0YWJ1bGFyLW51bXM7CiAgICBjb2xvcjogcmdiYSgyMjgsIDIzMCwgMjM0LCAwLjkyKTsKICAgIHRleHQtc2hhZG93OiBub25lOwp9CgoubWpyLXZpZGVvLWNvbnRyb2xzLS12aWV3ZXJiYXIgLm1qci12aWRlby1mcmFtZSB7CiAgICBtaW4td2lkdGg6IDk0cHg7CiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgICBwYWRkaW5nOiA1cHggMTBweDsKICAgIGJvcmRlci1yYWRpdXM6IDk5OXB4OwogICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA0NSk7CiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDgpOwp9CgoubWpyLXZpZGVvLWNvbnRyb2xzLS12aWV3ZXJiYXIgLm1qci12aWRlby10aW1lIHsKICAgIG1pbi13aWR0aDogYXV0bzsKICAgIHRleHQtYWxpZ246IGxlZnQ7Cn0KCi5tanItdmlkZW8tY29udHJvbHMtLXZpZXdlcmJhciAubWpyLXZpZGVvLXJhbmdlLS1zZWVrIHsKICAgIGhlaWdodDogMjJweDsKICAgIGFjY2VudC1jb2xvcjogcmdiYSgyMTQsIDIxOCwgMjI0LCAwLjkyKTsKfQoKLm1qci12aWRlby1jb250cm9scy0tdmlld2VyYmFyIC5tanItdmlkZW8tcmFuZ2UtY291bnQgewogICAgY29sb3I6IHJnYmEoMjIyLCAyMjUsIDIzMCwgMC45NSk7CiAgICBib3JkZXItY29sb3I6IHJnYmEoMTk0LCAyMDEsIDIwOSwgMC4yNik7CiAgICBib3JkZXItd2lkdGg6IDAuOHB4OwogICAgYmFja2dyb3VuZDogcmdiYSgxOTQsIDIwMSwgMjA5LCAwLjA4KTsKICAgIHRleHQtc2hhZG93OiBub25lOwp9CgoubWpyLXZpZGVvLWNvbnRyb2xzLS12aWV3ZXJiYXIgLm1qci12aWRlby1ncm91cCB7CiAgICBtaW4taGVpZ2h0OiAzNnB4OwogICAgcGFkZGluZzogNHB4IDhweDsKICAgIGJvcmRlci1yYWRpdXM6IDEycHg7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDM1KTsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wNik7Cn0KCi5tanItdmlkZW8tY29udHJvbHMtLXZpZXdlcmJhciAubWpyLXZpZGVvLWdyb3VwLS1hZGp1c3QtbGVmdCwKLm1qci12aWRlby1jb250cm9scy0tdmlld2VyYmFyIC5tanItdmlkZW8tZ3JvdXAtLWFkanVzdC1yaWdodCwKLm1qci12aWRlby1jb250cm9scy0tdmlld2VyYmFyIC5tanItdmlkZW8tZ3JvdXAtLXNwZWVkIHsKICAgIGdhcDogOHB4Owp9CgoubWpyLXZpZGVvLWNvbnRyb2xzLS12aWV3ZXJiYXIgLm1qci12aWRlby1udW0gewogICAgbWluLWhlaWdodDogMzRweDsKICAgIGJvcmRlci1yYWRpdXM6IDEwcHg7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDksIDEyLCAxNiwgMC41NSk7CiAgICBib3JkZXItY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xKTsKfQoKLm1qci12aWRlby1jb250cm9scy0tdmlld2VyYmFyIC5tanItdmlkZW8tdHJhbnNwb3J0IHsKICAgIGdhcDogMTBweDsKICAgIHBhZGRpbmc6IDZweDsKICAgIGJvcmRlci1yYWRpdXM6IDk5OXB4OwogICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA0NSk7CiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDgpOwp9CgoubWpyLXZpZGVvLWNvbnRyb2xzLS12aWV3ZXJiYXIgLm1qci12aWRlby1idG4tLXBsYXkgewogICAgbWluLXdpZHRoOiA4OHB4OwogICAgZm9udC13ZWlnaHQ6IDYwMDsKfQoKLm1qci12aWRlby1jb250cm9scy0tdmlld2VyYmFyIC5tanItdmlkZW8tc2Vlay13cmFwIHsKICAgIG1pbi1oZWlnaHQ6IDQ0cHg7Cn0KCi5tanItdmlkZW8tY29udHJvbHMtLXZpZXdlcmJhciAubWpyLXZpZGVvLXNlZWstem9uZXMgewogICAgaGVpZ2h0OiAxMnB4Owp9CgoubWpyLXZpZGVvLWNvbnRyb2xzLS12aWV3ZXJiYXIgLm1qci12aWRlby1zZWVrLWhhbmRsZSB7CiAgICB3aWR0aDogMThweDsKICAgIGhlaWdodDogMzRweDsKICAgIGJvcmRlci1yYWRpdXM6IDhweDsKfQoKLm1qci12aWRlby1jb250cm9scy0tdmlld2VyYmFyIC5tanItdmlkZW8tdm9sdW1lLXdyYXAgewogICAgcGFkZGluZzogMCA0cHg7Cn0KCi5tanItdmlkZW8tcmFuZ2UtLXZvbHVtZSB7CiAgICB3aWR0aDogOTBweDsKfQoKQG1lZGlhIChtYXgtd2lkdGg6IDk4MHB4KSB7CiAgICAubWpyLXZpZGVvLWNvbnRyb2xzLS12aWV3ZXJiYXIgLm1qci12aWRlby1iYXItaGVhZCwKICAgIC5tanItdmlkZW8tY29udHJvbHMtLXZpZXdlcmJhciAubWpyLXZpZGVvLWJhci1hY3Rpb25zLAogICAgLm1qci12aWRlby1jb250cm9scy0tdmlld2VyYmFyIC5tanItdmlkZW8tYmFyLXRpbWVsaW5lIHsKICAgICAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IDFmcjsKICAgIH0KCiAgICAubWpyLXZpZGVvLWNvbnRyb2xzLS12aWV3ZXJiYXIgLm1qci12aWRlby1iYXItY2VudGVyLAogICAgLm1qci12aWRlby1jb250cm9scy0tdmlld2VyYmFyIC5tanItdmlkZW8tYmFyLXNpZGUtLXJpZ2h0IHsKICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgIH0KCiAgICAubWpyLXZpZGVvLWNvbnRyb2xzLS12aWV3ZXJiYXIgLm1qci12aWRlby1iYXItdGltZWxpbmUgewogICAgICAgIGdhcDogMTBweDsKICAgIH0KCiAgICAubWpyLXZpZGVvLWNvbnRyb2xzLS12aWV3ZXJiYXIgLm1qci12aWRlby10cmFuc3BvcnQgewogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgICAgIGZsZXgtd3JhcDogd3JhcDsKICAgICAgICBib3JkZXItcmFkaXVzOiAxNnB4OwogICAgfQp9CgovKiA9PT09PT09PT09IENvbnRleHQgTWVudSBDb21wb25lbnQgPT09PT09PT09PSAqLwoubWpyLWNvbnRleHQtbWVudSB7CiAgICBwb3NpdGlvbjogZml4ZWQ7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1jb21meS1tZW51LWJnKTsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJvcmRlci1jb2xvcik7CiAgICBib3JkZXItcmFkaXVzOiA2cHg7CiAgICBib3gtc2hhZG93OiAwIDRweCAxMnB4IHJnYmEoMCwgMCwgMCwgMC4zKTsKICAgIG1pbi13aWR0aDogMjAwcHg7CiAgICAvKiBBYm92ZSB2aWV3ZXIgb3ZlcmxheSAoMTAwMDEpIGFuZCBNRlYgZGlhbG9nICgxMDAwMCkgKi8KICAgIHotaW5kZXg6IDEwMDAyOwogICAgZGlzcGxheTogbm9uZTsKICAgIHBhZGRpbmc6IDRweCAwOwogICAgYW5pbWF0aW9uOiBtanItY29udGV4dC1tZW51LWluIDAuMTVzIGVhc2Utb3V0Owp9CgoubWpyLWNvbnRleHQtbWVudSwKLm1qci1jb250ZXh0LW1lbnUgKiB7CiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94Owp9CgpAa2V5ZnJhbWVzIG1qci1jb250ZXh0LW1lbnUtaW4gewogICAgZnJvbSB7CiAgICAgICAgb3BhY2l0eTogMDsKICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTVweCk7CiAgICB9CiAgICB0byB7CiAgICAgICAgb3BhY2l0eTogMTsKICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoMCk7CiAgICB9Cn0KCi5tanItY29udGV4dC1tZW51LWl0ZW0gewogICAgYXBwZWFyYW5jZTogbm9uZTsKICAgIC13ZWJraXQtYXBwZWFyYW5jZTogbm9uZTsKICAgIHBhZGRpbmc6IDhweCAxNHB4OwogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47CiAgICB3aWR0aDogMTAwJTsKICAgIGJvcmRlcjogMDsKICAgIGJvcmRlci1yYWRpdXM6IDA7CiAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsKICAgIGJveC1zaGFkb3c6IG5vbmU7CiAgICBtYXJnaW46IDA7CiAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICBjb2xvcjogdmFyKC0tZmctY29sb3IpOwogICAgZm9udC1zaXplOiAxM3B4OwogICAgZm9udC1mYW1pbHk6IGluaGVyaXQ7CiAgICBmb250LXdlaWdodDogNDAwOwogICAgbGV0dGVyLXNwYWNpbmc6IG5vcm1hbDsKICAgIGxpbmUtaGVpZ2h0OiAxLjM1OwogICAgdGV4dC1hbGlnbjogbGVmdDsKICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKICAgIHRleHQtdHJhbnNmb3JtOiBub25lOwogICAgdHJhbnNpdGlvbjogYmFja2dyb3VuZCAwLjE1czsKICAgIHVzZXItc2VsZWN0OiBub25lOwp9CgoubWpyLWNvbnRleHQtbWVudS1pdGVtOjotbW96LWZvY3VzLWlubmVyIHsKICAgIGJvcmRlcjogMDsKICAgIHBhZGRpbmc6IDA7Cn0KCi5tanItY29udGV4dC1tZW51LWl0ZW06aG92ZXIsCi5tanItY29udGV4dC1tZW51LWl0ZW06Zm9jdXMtdmlzaWJsZSB7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1jb21meS1pbnB1dC1iZyk7CiAgICBvdXRsaW5lOiBub25lOwp9CgoubWpyLWNvbnRleHQtbWVudS1pdGVtLmlzLXRvbmUtZ3JhcGgtbWFwIHsKICAgIGNvbG9yOiAjZjVjNTQyOwp9CgoubWpyLWNvbnRleHQtbWVudS1pdGVtLmlzLXRvbmUtcmVuYW1lIHsKICAgIGNvbG9yOiAjNWRhOWZmOwp9CgoubWpyLWNvbnRleHQtbWVudS1pdGVtLmlzLXRvbmUtZGVsZXRlIHsKICAgIGNvbG9yOiAjZmY1ZjVmOwp9CgoubWpyLWNvbnRleHQtbWVudS1pdGVtLmlzLXRvbmUtZmxvYXRpbmctdmlld2VyIHsKICAgIGNvbG9yOiAjNWZkMzhkOwp9CgoubWpyLWNvbnRleHQtbWVudS1pdGVtLmlzLXRvbmUtZ3JhcGgtbWFwOmhvdmVyLAoubWpyLWNvbnRleHQtbWVudS1pdGVtLmlzLXRvbmUtZ3JhcGgtbWFwOmZvY3VzLXZpc2libGUgewogICAgYmFja2dyb3VuZDogcmdiYSgyNDUsIDE5NywgNjYsIDAuMTQpOwp9CgoubWpyLWNvbnRleHQtbWVudS1pdGVtLmlzLXRvbmUtcmVuYW1lOmhvdmVyLAoubWpyLWNvbnRleHQtbWVudS1pdGVtLmlzLXRvbmUtcmVuYW1lOmZvY3VzLXZpc2libGUgewogICAgYmFja2dyb3VuZDogcmdiYSg5MywgMTY5LCAyNTUsIDAuMTQpOwp9CgoubWpyLWNvbnRleHQtbWVudS1pdGVtLmlzLXRvbmUtZGVsZXRlOmhvdmVyLAoubWpyLWNvbnRleHQtbWVudS1pdGVtLmlzLXRvbmUtZGVsZXRlOmZvY3VzLXZpc2libGUgewogICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDk1LCA5NSwgMC4xNCk7Cn0KCi5tanItY29udGV4dC1tZW51LWl0ZW0uaXMtdG9uZS1mbG9hdGluZy12aWV3ZXI6aG92ZXIsCi5tanItY29udGV4dC1tZW51LWl0ZW0uaXMtdG9uZS1mbG9hdGluZy12aWV3ZXI6Zm9jdXMtdmlzaWJsZSB7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDk1LCAyMTEsIDE0MSwgMC4xNCk7Cn0KCi5tanItY29udGV4dC1tZW51LWl0ZW0uaXMtZGlzYWJsZWQgewogICAgY3Vyc29yOiBkZWZhdWx0OwogICAgb3BhY2l0eTogMC40NTsKfQoKLm1qci1jb250ZXh0LW1lbnUtaXRlbS5pcy1kaXNhYmxlZDpob3ZlciwKLm1qci1jb250ZXh0LW1lbnUtaXRlbS5pcy1kaXNhYmxlZDpmb2N1cy12aXNpYmxlIHsKICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50Owp9CgoubWpyLWNvbnRleHQtbWVudS1zZXBhcmF0b3IgewogICAgaGVpZ2h0OiAxcHg7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1ib3JkZXItY29sb3IpOwogICAgbWFyZ2luOiA0cHggMDsKfQoKLm1qci1jb250ZXh0LW1lbnUtaXRlbS1sZWZ0LAoubWpyLWNvbnRleHQtbWVudS1pdGVtLXJpZ2h0IHsKICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogMTBweDsKfQoKLm1qci1jb250ZXh0LW1lbnUtaXRlbS1sZWZ0IHsKICAgIGZsZXg6IDEgMSBhdXRvOwogICAgbWluLXdpZHRoOiAwOwp9CgoubWpyLWNvbnRleHQtbWVudS1pdGVtLXJpZ2h0IHsKICAgIGZsZXg6IDAgMCBhdXRvOwogICAgbWFyZ2luLWxlZnQ6IDE2cHg7Cn0KCi5tanItY29udGV4dC1tZW51LWl0ZW0tbGVmdCBpIHsKICAgIHdpZHRoOiAxNnB4OwogICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgb3BhY2l0eTogMC44MjsKfQoKLm1qci1jb250ZXh0LW1lbnUtaGludCB7CiAgICBvcGFjaXR5OiAwLjU4OwogICAgZm9udC1zaXplOiAxMXB4OwogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKfQoKLm1qci1jb250ZXh0LW1lbnUtc3VibWVudS1hcnJvdyB7CiAgICBvcGFjaXR5OiAwLjcyOwogICAgZm9udC1zaXplOiAxNnB4OwogICAgbGluZS1oZWlnaHQ6IDE7Cn0KCi5tanItYWRkLXRvLWNvbGxlY3Rpb24tbWVudSB7CiAgICBtaW4td2lkdGg6IDI2MHB4OwogICAgbWF4LXdpZHRoOiBtaW4oMzYwcHgsIGNhbGMoMTAwdncgLSAxNnB4KSk7CiAgICBiYWNrZHJvcC1maWx0ZXI6IGJsdXIoMTJweCk7Cn0KCi5tanItY29udGV4dC1tZW51LXRpdGxlIHsKICAgIHBhZGRpbmc6IDhweCAxNHB4IDEwcHg7CiAgICBmb250LXNpemU6IDEycHg7CiAgICBmb250LXdlaWdodDogNzAwOwogICAgY29sb3I6IHZhcigtLWZnLWNvbG9yKTsKICAgIG9wYWNpdHk6IDAuOTI7Cn0KCi5tanItY29udGV4dC1tZW51LW5vdGUgewogICAgcGFkZGluZzogMTBweCAxNHB4OwogICAgZm9udC1zaXplOiAxMnB4OwogICAgY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1jb250ZW50LWZnKSA3MiUsIHZhcigtLW1qci1tdXRlZCkpOwogICAgbGluZS1oZWlnaHQ6IDEuNDU7Cn0KCi5tanItZ3JpZC1wb3BvdmVyLAoubWpyLXZpZXdlci1wb3BvdmVyIHsKICAgIG1pbi13aWR0aDogMjUwcHg7CiAgICBtYXgtd2lkdGg6IG1pbigzNjBweCwgY2FsYygxMDB2dyAtIDE2cHgpKTsKICAgIGJhY2tncm91bmQ6IHZhcigtLW1qci1zdXJmYWNlLTEpOwogICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tbWpyLWJvcmRlcik7CiAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1tanItci1zbSk7CiAgICBib3gtc2hhZG93OiAwIDEycHggMjhweCByZ2JhKDAsIDAsIDAsIDAuMzUpOwp9CgpAbWVkaWEgKHByZWZlcnMtcmVkdWNlZC1tb3Rpb246IHJlZHVjZSkgewogICAgLm1qci12aWV3ZXItb3ZlcmxheSAqLAogICAgLm1qci12aWRlby1jb250cm9scywKICAgIC5tanItY29udGV4dC1tZW51IHsKICAgICAgICBhbmltYXRpb246IG5vbmUgIWltcG9ydGFudDsKICAgICAgICB0cmFuc2l0aW9uOiBub25lICFpbXBvcnRhbnQ7CiAgICAgICAgc2Nyb2xsLWJlaGF2aW9yOiBhdXRvICFpbXBvcnRhbnQ7CiAgICB9Cn0KCi8qIEhpZGUgaGVhZGVyICh0b29sYmFyKSB3aGVuIHZpZXdlciBvdmVybGF5IGlzIGluIGZ1bGxzY3JlZW4gKi8KLm1qci12aWV3ZXItb3ZlcmxheTpmdWxsc2NyZWVuIC5tanItdmlld2VyLWhlYWRlciB7CiAgICBkaXNwbGF5OiBub25lOwp9CgovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICBNYWpvb3IgRmxvYXRpbmcgVmlld2VyIChNRlYpIC0gcG9ydGFsZWQgdG8gZG9jdW1lbnQuYm9keQogICBSZWRlY2xhcmVzIENTUyB2YXJpYWJsZXMgc28gdGhlIHBhbmVsIHdvcmtzIG91dHNpZGUgLm1qci1hc3NldHMtbWFuYWdlcgogICAoc2FtZSBwYXR0ZXJuIGFzIC5tanItcG9wb3ZlcikKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCi5tanItbWZ2IHsKICAgIC0tbWpyLXN1cmZhY2UtMDogdmFyKC0tY29udGVudC1iZywgIzFlMWUxZSk7CiAgICAtLW1qci1zdXJmYWNlLTE6IHZhcigtLWNvbWZ5LW1lbnUtYmcsICMyYTJhMmEpOwogICAgLS1tanItc3VyZmFjZS0yOiB2YXIoLS1jb21meS1tZW51LXNlY29uZGFyeS1iZywgIzMzMyk7CiAgICAtLW1qci1ib3JkZXI6IHZhcigtLWJvcmRlci1jb2xvciwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEyKSk7CiAgICAtLW1qci1tdXRlZDogdmFyKC0tZGVzY3JpcC10ZXh0LCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNjUpKTsKICAgIC0tbWpyLWFjY2VudDogdmFyKC0tY29tZnktYWNjZW50LCAjNWZiM2ZmKTsKICAgIC0tbWpyLXN0YXR1cy1zdWNjZXNzOiB2YXIoLS1jb21meS1zdGF0dXMtc3VjY2VzcywgIzRjYWY1MCk7CgogICAgZm9udC1mYW1pbHk6IHZhcigKICAgICAgICAtLWNvbWZ5LWZvbnQsCiAgICAgICAgdWktc2Fucy1zZXJpZiwKICAgICAgICBzeXN0ZW0tdWksCiAgICAgICAgLWFwcGxlLXN5c3RlbSwKICAgICAgICAiU2Vnb2UgVUkiLAogICAgICAgIFJvYm90bywKICAgICAgICBBcmlhbCwKICAgICAgICBzYW5zLXNlcmlmCiAgICApOwogICAgZm9udC1zaXplOiAxM3B4OwogICAgbGluZS1oZWlnaHQ6IDEuMzU7CiAgICBjb2xvcjogdmFyKC0tY29udGVudC1mZywgdmFyKC0taW5wdXQtdGV4dCwgI2RkZCkpOwogICAgYm94LXNpemluZzogYm9yZGVyLWJveDsKCiAgICAvKiBWaXN1YWwgY2hyb21lICovCiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1tanItc3VyZmFjZS0xKTsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLW1qci1ib3JkZXIpOwogICAgYm9yZGVyLXJhZGl1czogOHB4OwogICAgYm94LXNoYWRvdzoKICAgICAgICAwIDhweCAzMnB4IHJnYmEoMCwgMCwgMCwgMC41NSksCiAgICAgICAgMCAycHggOHB4IHJnYmEoMCwgMCwgMCwgMC4zKTsKfQoKLm1qci1tZnYgKiB7CiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94Owp9CgpodG1sLm1qci1tZnYtcG9wb3V0LWRvY3VtZW50IHsKICAgIGJhY2tncm91bmQ6CiAgICAgICAgcmFkaWFsLWdyYWRpZW50KAogICAgICAgICAgICAxMjAwcHggNDIwcHggYXQgNTAlIDAlLAogICAgICAgICAgICBjb2xvci1taXgoCiAgICAgICAgICAgICAgICBpbiBzcmdiLAogICAgICAgICAgICAgICAgdmFyKC0tcHJpbWFyeS1iYWNrZ3JvdW5kLCB2YXIoLS1jb21meS1hY2NlbnQsICM1ZmIzZmYpKSAxMCUsCiAgICAgICAgICAgICAgICB0cmFuc3BhcmVudAogICAgICAgICAgICApLAogICAgICAgICAgICB0cmFuc3BhcmVudCA2MiUKICAgICAgICApLAogICAgICAgIGxpbmVhci1ncmFkaWVudCgKICAgICAgICAgICAgMTgwZGVnLAogICAgICAgICAgICBjb2xvci1taXgoCiAgICAgICAgICAgICAgICBpbiBzcmdiLAogICAgICAgICAgICAgICAgdmFyKC0taW50ZXJmYWNlLXBhbmVsLXN1cmZhY2UsIHZhcigtLWNvbnRlbnQtYmcsICMxNjE5MWYpKSA4MiUsCiAgICAgICAgICAgICAgICAjMDAwIDE4JQogICAgICAgICAgICApLAogICAgICAgICAgICBjb2xvci1taXgoCiAgICAgICAgICAgICAgICBpbiBzcmdiLAogICAgICAgICAgICAgICAgdmFyKC0taW50ZXJmYWNlLW1lbnUtc3VyZmFjZSwgdmFyKC0tY29tZnktbWVudS1iZywgIzFmMjIyNykpIDg0JSwKICAgICAgICAgICAgICAgICMwMDAgMTYlCiAgICAgICAgICAgICkKICAgICAgICApOwp9Cgpib2R5Lm1qci1tZnYtcG9wb3V0LWJvZHkgewogICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7Cn0KCiNtanItbWZ2LXBvcG91dC1yb290LAoubWpyLW1mdi1wb3BvdXQtcm9vdCB7CiAgICBpc29sYXRpb246IGlzb2xhdGU7Cn0KCi8qIC0tIEhlYWRlciAoZHJhZyBoYW5kbGUpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi5tanItbWZ2LWhlYWRlciB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsKICAgIHBhZGRpbmc6IDZweCAxMHB4OwogICAgYmFja2dyb3VuZDogdmFyKC0tbWpyLXN1cmZhY2UtMSk7CiAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgdmFyKC0tbWpyLWJvcmRlcik7CiAgICBjdXJzb3I6IG1vdmU7CiAgICB1c2VyLXNlbGVjdDogbm9uZTsKICAgIGZsZXgtc2hyaW5rOiAwOwogICAgZ2FwOiA2cHg7CiAgICBtaW4taGVpZ2h0OiAzNHB4Owp9CgoubWpyLW1mdi1oZWFkZXItdGl0bGUgewogICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiAxMHB4OwogICAgZm9udC1zaXplOiAxMnB4OwogICAgZm9udC13ZWlnaHQ6IDYwMDsKICAgIG9wYWNpdHk6IDAuNzg7CiAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7CiAgICBmbGV4OiAxOwogICAgbGV0dGVyLXNwYWNpbmc6IDAuMjhweDsKfQoKLyogLS0gVG9vbGJhciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoubWpyLW1mdi10b29sYmFyIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiA0cHg7CiAgICBwYWRkaW5nOiA0cHggOHB4OwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTApIDUwJSwgdmFyKC0tbWpyLXN1cmZhY2UtMSkgNTAlKTsKICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCB2YXIoLS1tanItYm9yZGVyKTsKICAgIGZsZXgtc2hyaW5rOiAwOwogICAgbWluLWhlaWdodDogMzZweDsKICAgIGZsZXgtd3JhcDogbm93cmFwOwogICAgb3ZlcmZsb3cteDogYXV0bzsKICAgIG92ZXJmbG93LXk6IGhpZGRlbjsKICAgIHNjcm9sbGJhci13aWR0aDogbm9uZTsKfQoubWpyLW1mdi10b29sYmFyOjotd2Via2l0LXNjcm9sbGJhciB7CiAgICBkaXNwbGF5OiBub25lOwp9CgoubWpyLW1mdi10b29sYmFyLXNlcCB7CiAgICB3aWR0aDogMXB4OwogICAgaGVpZ2h0OiAxOHB4OwogICAgYmFja2dyb3VuZDogdmFyKC0tbWpyLWJvcmRlcik7CiAgICBtYXJnaW46IDAgM3B4OwogICAgZmxleC1zaHJpbms6IDA7Cn0KCi5tanItbWZ2LXByb2dyZXNzIHsKICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICBoZWlnaHQ6IDIycHg7CiAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgdmFyKC0tbWpyLWJvcmRlcik7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMCkgNzIlLCAjMDAwIDI4JSk7CiAgICBmbGV4LXNocmluazogMDsKICAgIGN1cnNvcjogZGVmYXVsdDsKfQoKLm1qci1tZnYtcHJvZ3Jlc3MuaXMtY2xpY2thYmxlIHsKICAgIGN1cnNvcjogcG9pbnRlcjsKfQoKLm1qci1tZnYtcHJvZ3Jlc3MuaXMtY2xpY2thYmxlOmhvdmVyIHsKICAgIGZpbHRlcjogYnJpZ2h0bmVzcygxLjAzKTsKfQoKLm1qci1tZnYtcHJvZ3Jlc3MtYmFyIHsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIGxlZnQ6IDA7CiAgICB3aWR0aDogMCU7CiAgICB0cmFuc2l0aW9uOiB3aWR0aCA3MG1zIGVhc2UtaW4tb3V0Owp9CgoubWpyLW1mdi1wcm9ncmVzcy1iYXItLW5vZGVzIHsKICAgIHRvcDogMDsKICAgIGhlaWdodDogNTAlOwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdGF0dXMtc3VjY2VzcykgNjglLCAjMGIzNTEzIDMyJSk7Cn0KCi5tanItbWZ2LXByb2dyZXNzLWJhci0tc3RlcHMgewogICAgdG9wOiA1MCU7CiAgICBoZWlnaHQ6IDUwJTsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYWNjZW50KSA2NCUsICMwYjIzNDAgMzYlKTsKfQoKLm1qci1tZnYtcHJvZ3Jlc3MuaXMtZXJyb3IgLm1qci1tZnYtcHJvZ3Jlc3MtYmFyLS1ub2RlcywKLm1qci1tZnYtcHJvZ3Jlc3MuaXMtZXJyb3IgLm1qci1tZnYtcHJvZ3Jlc3MtYmFyLS1zdGVwcyB7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgI2Q5NTM0ZiA3OCUsICM0YTE0MTQgMjIlKTsKfQoKLm1qci1tZnYtcHJvZ3Jlc3Mtb3ZlcmxheSB7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICBpbnNldDogMDsKICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCh0byBib3R0b20sIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xOCksIHJnYmEoMCwgMCwgMCwgMC4xOCkpOwogICAgbWl4LWJsZW5kLW1vZGU6IHNjcmVlbjsKICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwp9CgoubWpyLW1mdi1wcm9ncmVzcy10ZXh0IHsKICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgIHotaW5kZXg6IDI7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGhlaWdodDogMTAwJTsKICAgIHBhZGRpbmc6IDAgOHB4OwogICAgY29sb3I6IHZhcigtLWNvbnRlbnQtZmcsICNkZGQpOwogICAgZm9udC1zaXplOiAxMXB4OwogICAgZm9udC13ZWlnaHQ6IDYwMDsKICAgIHRleHQtc2hhZG93OiAwIDAgMnB4IHJnYmEoMCwgMCwgMCwgMC45KTsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7Cn0KCi5tanItbWZ2LXBpbi1ncm91cCB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZ2FwOiAycHg7CiAgICBmbGV4LXNocmluazogMDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7Cn0KLm1qci1tZnYtcGluLWJ0biB7CiAgICB3aWR0aDogMjZweDsKICAgIGhlaWdodDogMjZweDsKICAgIGJvcmRlci1yYWRpdXM6IDVweDsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLW1qci1ib3JkZXIpOwogICAgYmFja2dyb3VuZDogdmFyKC0tbWpyLXN1cmZhY2UtMik7CiAgICBjb2xvcjogdmFyKC0tY29udGVudC1mZywgI2RkZCk7CiAgICBmb250LXNpemU6IDExcHg7CiAgICBmb250LXdlaWdodDogNjAwOwogICAgY3Vyc29yOiBwb2ludGVyOwogICAgcGFkZGluZzogMDsKICAgIGxpbmUtaGVpZ2h0OiAyNHB4OwogICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgdHJhbnNpdGlvbjoKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yIDEyMG1zIGVhc2UsCiAgICAgICAgYm9yZGVyLWNvbG9yIDEyMG1zIGVhc2UsCiAgICAgICAgY29sb3IgMTIwbXMgZWFzZSwKICAgICAgICBib3gtc2hhZG93IDEyMG1zIGVhc2U7Cn0KLm1qci1tZnYtcGluLWJ0bjpob3ZlciB7CiAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYWNjZW50KSA0NSUsIHZhcigtLW1qci1ib3JkZXIpKTsKICAgIGJhY2tncm91bmQtY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0yKSA4MCUsIHZhcigtLW1qci1hY2NlbnQpIDglKTsKfQoubWpyLW1mdi1waW4tYnRuLmlzLXBpbm5lZCB7CiAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYWNjZW50KSA1OCUsICNmZmZmZmYgMTIlKTsKICAgIGJhY2tncm91bmQtY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0yKSA0MiUsIHZhcigtLW1qci1hY2NlbnQpIDU4JSk7CiAgICBjb2xvcjogI2VlZjdmZjsKICAgIGJveC1zaGFkb3c6IGluc2V0IDAgMCAwIDFweCBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWFjY2VudCkgMjQlLCB0cmFuc3BhcmVudCk7Cn0KCi8qIC0tIFBpbiBncm91cDogbm93IGEgZHJvcGRvd24gbWVudSAoZGlzcGxheTpub25lIGJ5IGRlZmF1bHQsIGZsZXggd2hlbiAuaXMtb3BlbikgLS0gKi8KLm1qci1tZnYtcGluLWdyb3VwIHsKICAgIGRpc3BsYXk6IG5vbmU7CiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgZ2FwOiAycHg7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICB0b3A6IGNhbGMoMTAwJSArIDRweCk7CiAgICBsZWZ0OiAwOwogICAgei1pbmRleDogMTAwMTA7CiAgICBtaW4td2lkdGg6IDcwcHg7CiAgICBwYWRkaW5nOiA0cHg7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1jb21meS1tZW51LWJnLCAjMmEyYTJhKTsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLW1qci1ib3JkZXIsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xMikpOwogICAgYm9yZGVyLXJhZGl1czogOHB4OwogICAgYm94LXNoYWRvdzogMCA4cHggMjRweCByZ2JhKDAsIDAsIDAsIDAuNTUpOwp9Ci5tanItbWZ2LXBpbi1ncm91cC5pcy1vcGVuIHsKICAgIGRpc3BsYXk6IGZsZXg7Cn0KLm1qci1tZnYtcGluLWJ0biB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgd2lkdGg6IDEwMCU7CiAgICBoZWlnaHQ6IDMwcHg7CiAgICBib3JkZXItcmFkaXVzOiA2cHg7CiAgICBib3JkZXI6IDFweCBzb2xpZCB0cmFuc3BhcmVudDsKICAgIGJhY2tncm91bmQ6IG5vbmU7CiAgICBjb2xvcjogdmFyKC0tY29udGVudC1mZywgI2RkZCk7CiAgICBmb250LXNpemU6IDEycHg7CiAgICBmb250LXdlaWdodDogNjAwOwogICAgY3Vyc29yOiBwb2ludGVyOwogICAgcGFkZGluZzogMCAxMHB4OwogICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgdHJhbnNpdGlvbjoKICAgICAgICBiYWNrZ3JvdW5kIDEyMG1zIGVhc2UsCiAgICAgICAgYm9yZGVyLWNvbG9yIDEyMG1zIGVhc2UsCiAgICAgICAgY29sb3IgMTIwbXMgZWFzZTsKfQoubWpyLW1mdi1waW4tYnRuOmhvdmVyIHsKICAgIGJhY2tncm91bmQ6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wOCk7CiAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYWNjZW50KSAzNSUsIHRyYW5zcGFyZW50KTsKfQoubWpyLW1mdi1waW4tYnRuLmlzLXBpbm5lZCB7CiAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYWNjZW50KSA1OCUsICNmZmZmZmYgMTIlKTsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0yLCAjMzMzKSA0MiUsIHZhcigtLW1qci1hY2NlbnQsICM1ZmIzZmYpIDU4JSk7CiAgICBjb2xvcjogI2VlZjdmZjsKfQoKLyogLS0gSWNvbiBEcm9wZG93biBjb21wb25lbnQgKC5tanItbWZ2LWlkcm9wKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLm1qci1tZnYtaWRyb3AgewogICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZmxleC1zaHJpbms6IDA7Cn0KCi5tanItbWZ2LWlkcm9wLW1lbnUgewogICAgZGlzcGxheTogbm9uZTsKICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICBnYXA6IDJweDsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIHotaW5kZXg6IDEwMDEwOwogICAgbWluLXdpZHRoOiAxMTBweDsKICAgIHBhZGRpbmc6IDRweDsKICAgIGJhY2tncm91bmQ6IHZhcigtLWNvbWZ5LW1lbnUtYmcsICMyYTJhMmEpOwogICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tbWpyLWJvcmRlciwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEyKSk7CiAgICBib3JkZXItcmFkaXVzOiA4cHg7CiAgICBib3gtc2hhZG93OiAwIDhweCAyNHB4IHJnYmEoMCwgMCwgMCwgMC41NSk7CiAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwp9Ci5tanItbWZ2LWlkcm9wLW1lbnUuaXMtb3BlbiB7CiAgICBkaXNwbGF5OiBmbGV4Owp9CgoubWpyLW1mdi1pZHJvcC1pdGVtIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiA4cHg7CiAgICB3aWR0aDogMTAwJTsKICAgIHBhZGRpbmc6IDZweCAxMHB4OwogICAgYmFja2dyb3VuZDogbm9uZTsKICAgIGJvcmRlcjogbm9uZTsKICAgIGJvcmRlci1yYWRpdXM6IDZweDsKICAgIGNvbG9yOiB2YXIoLS1pbnB1dC10ZXh0LCAjZGRkKTsKICAgIGZvbnQtc2l6ZTogMTJweDsKICAgIGZvbnQtZmFtaWx5OiBpbmhlcml0OwogICAgdGV4dC1hbGlnbjogbGVmdDsKICAgIGN1cnNvcjogcG9pbnRlcjsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICB0cmFuc2l0aW9uOiBiYWNrZ3JvdW5kIDAuMXMgZWFzZTsKfQoubWpyLW1mdi1pZHJvcC1pdGVtOmhvdmVyIHsKICAgIGJhY2tncm91bmQ6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wOCk7Cn0KLm1qci1tZnYtaWRyb3AtaXRlbS5pcy1zZWxlY3RlZCB7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDk1LCAxNzksIDI1NSwgMC4xNik7CiAgICBjb2xvcjogI2E4ZDhmZjsKfQoubWpyLW1mdi1pZHJvcC10cmlnZ2VyW2FyaWEtZXhwYW5kZWQ9InRydWUiXSB7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMSkgIWltcG9ydGFudDsKICAgIGJvcmRlci1jb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjIpICFpbXBvcnRhbnQ7Cn0KLyogQ2hhbm5lbCB0cmlnZ2VyOiBzbGlnaHRseSB3aWRlciB0byBmaXQgIlJHQiIgKi8KLm1qci1tZnYtY2gtbGFiZWwgewogICAgZm9udC1zaXplOiAxMnB4OwogICAgbGV0dGVyLXNwYWNpbmc6IDAuMDRlbTsKICAgIGxpbmUtaGVpZ2h0OiAxOwp9CgovKiBUb29sYmFyIGljb24tYnV0dG9uIHBvcG92ZXJzIChjaGFubmVsLCBndWlkZXMsIHBpbiwgZm9ybWF0IC0gc29ydC1zdHlsZSBjb250ZXh0IG1lbnVzKSAqLwoubWpyLW1mdi1jaC1wb3BvdmVyLAoubWpyLW1mdi1ndWlkZXMtcG9wb3ZlciwKLm1qci1tZnYtcGluLXBvcG92ZXIsCi5tanItbWZ2LWZvcm1hdC1wb3BvdmVyIHsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIG1pbi13aWR0aDogMTIwcHg7CiAgICBwYWRkaW5nOiA2cHg7CiAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1yYWRpdXMtbGcsIDAuNXJlbSk7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1tanItc3VyZmFjZS0xLCB2YXIoLS1jb21meS1tZW51LWJnLCAjMmEyYTJhKSk7CiAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1tanItYm9yZGVyLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTIpKTsKICAgIGJveC1zaGFkb3c6IDAgOHB4IDI0cHggcmdiYSgwLCAwLCAwLCAwLjU1KTsKICAgIHotaW5kZXg6IDEwMDEwOwogICAgZGlzcGxheTogbm9uZTsKfQoubWpyLW1mdi1jaC1wb3BvdmVyLmlzLW9wZW4sCi5tanItbWZ2LWd1aWRlcy1wb3BvdmVyLmlzLW9wZW4sCi5tanItbWZ2LXBpbi1wb3BvdmVyLmlzLW9wZW4sCi5tanItbWZ2LWZvcm1hdC1wb3BvdmVyLmlzLW9wZW4gewogICAgZGlzcGxheTogYmxvY2s7Cn0KLyogVG9vbGJhciBpY29uIGltYWdlcyAtIGNoIGljb24gaXMgYmxhY2sgKGludmVydGVkKSwgZ3VpZGVzIGljb24gaXMgbmF0aXZlIHdoaXRlICovCi5tanItbWZ2LWNoLWljb24gewogICAgd2lkdGg6IDE4cHg7CiAgICBoZWlnaHQ6IDE4cHg7CiAgICBmaWx0ZXI6IGludmVydCgxKTsKICAgIG9wYWNpdHk6IDAuODU7CiAgICBkaXNwbGF5OiBibG9jazsKfQoubWpyLW1mdi1ndWlkZXMtaWNvbiB7CiAgICB3aWR0aDogMThweDsKICAgIGhlaWdodDogMThweDsKICAgIG9wYWNpdHk6IDAuODU7CiAgICBkaXNwbGF5OiBibG9jazsKfQoubWpyLW1mdi1jaC10cmlnZ2VyW2FyaWEtZXhwYW5kZWQ9InRydWUiXSwKLm1qci1tZnYtZ3VpZGVzLXRyaWdnZXJbYXJpYS1leHBhbmRlZD0idHJ1ZSJdLAoubWpyLW1mdi1waW4tdHJpZ2dlclthcmlhLWV4cGFuZGVkPSJ0cnVlIl0sCi5tanItbWZ2LWZvcm1hdC10cmlnZ2VyW2FyaWEtZXhwYW5kZWQ9InRydWUiXSB7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMSkgIWltcG9ydGFudDsKICAgIGJvcmRlci1jb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjIpICFpbXBvcnRhbnQ7Cn0KLyogUGluIHNsb3QgYWN0aXZlIHN0YXRlICovCi5tanItbWZ2LXBpbi1wb3BvdmVyIC5tanItbWVudS1pdGVtLmlzLXBpbm5lZCB7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDk1LCAxNzksIDI1NSwgMC4xNik7CiAgICBjb2xvcjogI2E4ZDhmZjsKfQoubWpyLW1mdi1waW4tcG9wb3ZlciAubWpyLW1lbnUtaXRlbS5pcy1waW5uZWQgLm1qci1tZW51LWl0ZW0tY2hlY2sgewogICAgb3BhY2l0eTogMSAhaW1wb3J0YW50Owp9Ci8qIEZvcm1hdCBwb3BvdmVyOiBzZXBhcmF0b3IgKyBvcGFjaXR5IHNsaWRlciByb3cgKi8KLm1qci1tZnYtZm9ybWF0LXNlcCB7CiAgICBoZWlnaHQ6IDFweDsKICAgIGJhY2tncm91bmQ6IHZhcigtLW1qci1ib3JkZXIsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xKSk7CiAgICBtYXJnaW46IDRweCAycHg7Cn0KLm1qci1tZnYtZm9ybWF0LXNsaWRlci1yb3cgewogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBnYXA6IDZweDsKICAgIHBhZGRpbmc6IDRweCA4cHggMnB4Owp9Ci5tanItbWZ2LWZvcm1hdC1zbGlkZXItbGFiZWwgewogICAgZm9udC1zaXplOiAxMXB4OwogICAgY29sb3I6IHZhcigtLWlucHV0LXRleHQsICNkZGQpOwogICAgb3BhY2l0eTogMC42NTsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICBmbGV4LXNocmluazogMDsKfQoubWpyLW1mdi1mb3JtYXQtcG9wb3ZlciBpbnB1dFt0eXBlPSJyYW5nZSJdIHsKICAgIGZsZXg6IDE7CiAgICBtaW4td2lkdGg6IDcwcHg7CiAgICBhY2NlbnQtY29sb3I6IHZhcigtLW1qci1hY2NlbnQsICM1ZmIzZmYpOwp9Ci5tanItbWZ2LWZvcm1hdC1wb3BvdmVyIC5tanItbWZ2LXRvb2xiYXItcmFuZ2Utb3V0IHsKICAgIGZvbnQtc2l6ZTogMTFweDsKICAgIGNvbG9yOiB2YXIoLS1pbnB1dC10ZXh0LCAjZGRkKTsKICAgIG9wYWNpdHk6IDAuNjU7CiAgICBtaW4td2lkdGg6IDMwcHg7CiAgICB0ZXh0LWFsaWduOiByaWdodDsKICAgIGZsZXgtc2hyaW5rOiAwOwp9CgoubWpyLW1mdiAubWpyLWljb24tYnRuIHsKICAgIHdpZHRoOiAzMHB4OwogICAgaGVpZ2h0OiAzMHB4OwogICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICBib3JkZXItcmFkaXVzOiA3cHg7CiAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1tanItYm9yZGVyKTsKICAgIGJhY2tncm91bmQ6IHZhcigtLW1qci1zdXJmYWNlLTIpOwogICAgY29sb3I6IHZhcigtLWNvbnRlbnQtZmcsICNkZGQpOwogICAgY3Vyc29yOiBwb2ludGVyOwogICAgcGFkZGluZzogMDsKICAgIGZsZXgtc2hyaW5rOiAwOwogICAgdHJhbnNpdGlvbjoKICAgICAgICB0cmFuc2Zvcm0gMTIwbXMgZWFzZSwKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yIDEyMG1zIGVhc2UsCiAgICAgICAgYm9yZGVyLWNvbG9yIDEyMG1zIGVhc2UsCiAgICAgICAgY29sb3IgMTIwbXMgZWFzZSwKICAgICAgICBib3gtc2hhZG93IDEyMG1zIGVhc2U7Cn0KCi5tanItbWZ2IC5tanItaWNvbi1idG46aG92ZXIgewogICAgYm9yZGVyLWNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWFjY2VudCkgNDUlLCB2YXIoLS1tanItYm9yZGVyKSk7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMikgODAlLCB2YXIoLS1tanItYWNjZW50KSA4JSk7CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTFweCk7Cn0KCi5tanItbWZ2IC5tanItaWNvbi1idG46Zm9jdXMtdmlzaWJsZSB7CiAgICBvdXRsaW5lOiBub25lOwogICAgYm9yZGVyLWNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWFjY2VudCkgNTglLCB2YXIoLS1tanItYm9yZGVyKSk7CiAgICBib3gtc2hhZG93OiAwIDAgMCAycHggY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQpIDI0JSwgdHJhbnNwYXJlbnQpOwp9CgoubWpyLW1mdiAubWpyLWljb24tYnRuIC5waSB7CiAgICBmb250LXNpemU6IDEzcHg7CiAgICBsaW5lLWhlaWdodDogMTsKICAgIG9wYWNpdHk6IDAuOTsKfQoKLyogVW5pdmVyc2FsIGFjdGl2ZSBoaWdobGlnaHQgLSBhbnkgYXJpYS1wcmVzc2VkPSJ0cnVlIiBidXR0b24gZ2V0cyBhY2NlbnQgZ2xvdy4KICAgUGxhY2VkIGJlZm9yZSB0aGUgY29sb3JlZCBhY3RpdmUgY2xhc3NlcyBzbyB0aGV5IGNhbiBvdmVycmlkZSB3aXRoIHRoZWlyIG93biBjb2xvci4gKi8KLm1qci1tZnYgLm1qci1pY29uLWJ0blthcmlhLXByZXNzZWQ9InRydWUiXSB7CiAgICBib3JkZXItY29sb3I6IHJnYmEoOTUsIDE3OSwgMjU1LCAwLjU1KTsKICAgIGNvbG9yOiB2YXIoLS1tanItYWNjZW50LCAjNWZiM2ZmKTsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0yLCAjMzMzKSA4MCUsIHZhcigtLW1qci1hY2NlbnQsICM1ZmIzZmYpIDE1JSk7CiAgICBib3gtc2hhZG93OiAwIDAgMCAxcHggY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQsICM1ZmIzZmYpIDI1JSwgdHJhbnNwYXJlbnQpOwp9Ci5tanItbWZ2IC5tanItaWNvbi1idG5bYXJpYS1wcmVzc2VkPSJ0cnVlIl0gLnBpIHsKICAgIG9wYWNpdHk6IDE7Cn0KCi5tanItbWZ2IC5tanItaWNvbi1idG4ubWpyLWxpdmUtYWN0aXZlIHsKICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdGF0dXMtc3VjY2VzcykgNjAlLCB2YXIoLS1tanItYm9yZGVyKSk7CiAgICBjb2xvcjogdmFyKC0tbWpyLXN0YXR1cy1zdWNjZXNzKTsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0yKSA4MCUsIHZhcigtLW1qci1zdGF0dXMtc3VjY2VzcykgMTIlKTsKICAgIGJveC1zaGFkb3c6IDAgMCAwIDFweCBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN0YXR1cy1zdWNjZXNzKSAyNSUsIHRyYW5zcGFyZW50KTsKfQoKLm1qci1tZnYgLm1qci1pY29uLWJ0bi5tanItbGl2ZS1hY3RpdmUgLnBpIHsKICAgIG9wYWNpdHk6IDE7Cn0KCi5tanItbWZ2IC5tanItaWNvbi1idG4ubWpyLXByZXZpZXctYWN0aXZlIHsKICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQpIDYwJSwgdmFyKC0tbWpyLWJvcmRlcikpOwogICAgY29sb3I6IHZhcigtLW1qci1hY2NlbnQpOwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTIpIDgwJSwgdmFyKC0tbWpyLWFjY2VudCkgMTIlKTsKICAgIGJveC1zaGFkb3c6IDAgMCAwIDFweCBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWFjY2VudCkgMjUlLCB0cmFuc3BhcmVudCk7Cn0KCi5tanItbWZ2IC5tanItaWNvbi1idG4ubWpyLXByZXZpZXctYWN0aXZlIC5waSB7CiAgICBvcGFjaXR5OiAxOwp9CgoubWpyLW1mdiAubWpyLWljb24tYnRuLm1qci1ub2Rlc3RyZWFtLWFjdGl2ZSB7CiAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3RhdHVzLXdhcm5pbmcsICNmZjk4MDApIDYwJSwgdmFyKC0tbWpyLWJvcmRlcikpOwogICAgY29sb3I6IHZhcigtLW1qci1zdGF0dXMtd2FybmluZywgI2ZmOTgwMCk7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoCiAgICAgICAgaW4gc3JnYiwKICAgICAgICB2YXIoLS1tanItc3VyZmFjZS0yKSA4MCUsCiAgICAgICAgdmFyKC0tbWpyLXN0YXR1cy13YXJuaW5nLCAjZmY5ODAwKSAxMiUKICAgICk7CiAgICBib3gtc2hhZG93OiAwIDAgMCAxcHggY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdGF0dXMtd2FybmluZywgI2ZmOTgwMCkgMjUlLCB0cmFuc3BhcmVudCk7Cn0KCi5tanItbWZ2IC5tanItaWNvbi1idG4ubWpyLW5vZGVzdHJlYW0tYWN0aXZlIC5waSB7CiAgICBvcGFjaXR5OiAxOwp9CgovKiBQb3AtaW4gbW9kZSAodmlld2VyIHBvcHBlZCBvdXQpOiByYWlzZSBidXR0b24gY29udHJhc3QvYnJpZ2h0bmVzcyAqLwoubWpyLW1mdi5tanItbWZ2LS1wb3BwZWQgewogICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KAogICAgICAgIDE4MGRlZywKICAgICAgICBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMSkgOTIlLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDQpKSwKICAgICAgICBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMCkgOTIlLCByZ2JhKDAsIDAsIDAsIDAuMTgpKQogICAgKTsKICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1ib3JkZXIpIDc0JSwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE4KSk7CiAgICBib3gtc2hhZG93OgogICAgICAgIGluc2V0IDAgMXB4IDAgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA1KSwKICAgICAgICAwIDI0cHggNTZweCByZ2JhKDAsIDAsIDAsIDAuNDIpOwp9CgoubWpyLW1mdi5tanItbWZ2LS1wb3BwZWQgLm1qci1tZnYtaGVhZGVyIHsKICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgKICAgICAgICAxODBkZWcsCiAgICAgICAgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTIpIDg4JSwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA4KSksCiAgICAgICAgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTEpIDkwJSwgcmdiYSgwLCAwLCAwLCAwLjI0KSkKICAgICk7CiAgICBib3JkZXItYm90dG9tLWNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWJvcmRlcikgNzglLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTQpKTsKICAgIGJveC1zaGFkb3c6IGluc2V0IDAgMXB4IDAgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA0KTsKfQoKLm1qci1tZnYubWpyLW1mdi0tcG9wcGVkIC5tanItbWZ2LWhlYWRlci10aXRsZSB7CiAgICBvcGFjaXR5OiAwLjk4OwogICAgY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1jb250ZW50LWZnLCAjZWVmNGZmKSA5NCUsICNmZmZmZmYgNiUpOwp9CgoubWpyLW1mdi5tanItbWZ2LS1wb3BwZWQgLm1qci1tZnYtdG9vbGJhciB7CiAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoCiAgICAgICAgMTgwZGVnLAogICAgICAgIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0xKSA4OCUsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wNCkpLAogICAgICAgIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0wKSA5MCUsIHJnYmEoMCwgMCwgMCwgMC4yNCkpCiAgICApOwogICAgYm9yZGVyLWJvdHRvbS1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1ib3JkZXIpIDc4JSwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE0KSk7Cn0KCi5tanItbWZ2Lm1qci1tZnYtLXBvcHBlZCAubWpyLW1mdi10b29sYmFyLXNlcCB7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWJvcmRlcikgNzglLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTgpKTsKfQoKLm1qci1tZnYubWpyLW1mdi0tcG9wcGVkIC5tanItbWZ2LXByb2dyZXNzIHsKICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgKICAgICAgICAxODBkZWcsCiAgICAgICAgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTApIDgyJSwgIzBhMTExOCAxOCUpLAogICAgICAgIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0wKSA5MiUsICMwMDAgOCUpCiAgICApOwogICAgYm9yZGVyLWJvdHRvbS1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1ib3JkZXIpIDc4JSwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE0KSk7Cn0KCi5tanItbWZ2Lm1qci1tZnYtLXBvcHBlZCAubWpyLW1mdi1wcm9ncmVzcy10ZXh0IHsKICAgIGNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tY29udGVudC1mZywgI2VlZjRmZikgOTQlLCAjZmZmZmZmIDYlKTsKfQoKLm1qci1tZnYubWpyLW1mdi0tcG9wcGVkIC5tanItbWZ2LWNvbnRlbnQgewogICAgYmFja2dyb3VuZDoKICAgICAgICByYWRpYWwtZ3JhZGllbnQoCiAgICAgICAgICAgIGNpcmNsZSBhdCB0b3AsCiAgICAgICAgICAgIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYWNjZW50KSAxMCUsIHRyYW5zcGFyZW50KSAwJSwKICAgICAgICAgICAgdHJhbnNwYXJlbnQgNDIlCiAgICAgICAgKSwKICAgICAgICBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMCkgODIlLCAjMDAwIDE4JSk7Cn0KCi5tanItbWZ2Lm1qci1tZnYtLXBvcHBlZCAubWpyLWljb24tYnRuIHsKICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1ib3JkZXIpIDc2JSwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE2KSk7CiAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoCiAgICAgICAgMTgwZGVnLAogICAgICAgIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0yKSA4NiUsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wOCkpLAogICAgICAgIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0xKSA5MiUsIHJnYmEoMCwgMCwgMCwgMC4xOCkpCiAgICApOwogICAgY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1jb250ZW50LWZnLCAjZGRkKSA5MiUsICNmZmZmZmYgOCUpICFpbXBvcnRhbnQ7CiAgICBib3gtc2hhZG93OgogICAgICAgIGluc2V0IDAgMXB4IDAgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA1KSwKICAgICAgICAwIDhweCAxOHB4IHJnYmEoMCwgMCwgMCwgMC4xOCk7Cn0KCi5tanItbWZ2Lm1qci1tZnYtLXBvcHBlZCAubWpyLWljb24tYnRuOmhvdmVyIHsKICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQpIDUyJSwgdmFyKC0tbWpyLWJvcmRlcikpOwogICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KAogICAgICAgIDE4MGRlZywKICAgICAgICBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMikgNTglLCB2YXIoLS1tanItYWNjZW50KSA0MiUpLAogICAgICAgIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0xKSA2MiUsIHZhcigtLW1qci1hY2NlbnQpIDM4JSkKICAgICk7CiAgICBjb2xvcjogI2Y0ZjhmZiAhaW1wb3J0YW50Owp9CgoubWpyLW1mdi5tanItbWZ2LS1wb3BwZWQgLm1qci1pY29uLWJ0biAucGkgewogICAgb3BhY2l0eTogMTsKICAgIGNvbG9yOiBpbmhlcml0ICFpbXBvcnRhbnQ7Cn0KCi5tanItbWZ2Lm1qci1tZnYtLXBvcHBlZCAubWpyLWljb24tYnRuLm1qci1saXZlLWFjdGl2ZSB7CiAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3RhdHVzLXN1Y2Nlc3MpIDYwJSwgI2ZmZmZmZiA0MCUpOwogICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KAogICAgICAgIDE4MGRlZywKICAgICAgICBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN0YXR1cy1zdWNjZXNzKSA2MiUsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wOCkpLAogICAgICAgIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3RhdHVzLXN1Y2Nlc3MpIDM2JSwgdmFyKC0tbWpyLXN1cmZhY2UtMSkgNjQlKQogICAgKTsKICAgIGNvbG9yOiAjZmZmZmZmICFpbXBvcnRhbnQ7CiAgICBib3gtc2hhZG93OgogICAgICAgIGluc2V0IDAgMXB4IDAgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEyKSwKICAgICAgICAwIDAgMCAxcHggY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdGF0dXMtc3VjY2VzcykgMjQlLCB0cmFuc3BhcmVudCksCiAgICAgICAgMCAwIDE4cHggcmdiYSg3NiwgMTc1LCA4MCwgMC4xOCk7Cn0KCi5tanItbWZ2Lm1qci1tZnYtLXBvcHBlZCAubWpyLWljb24tYnRuLm1qci1wcmV2aWV3LWFjdGl2ZSB7CiAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYWNjZW50KSA1OCUsICNmZmZmZmYgNDIlKTsKICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgKICAgICAgICAxODBkZWcsCiAgICAgICAgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQpIDYyJSwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA4KSksCiAgICAgICAgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQpIDM2JSwgdmFyKC0tbWpyLXN1cmZhY2UtMSkgNjQlKQogICAgKTsKICAgIGNvbG9yOiAjZmZmZmZmICFpbXBvcnRhbnQ7CiAgICBib3gtc2hhZG93OgogICAgICAgIGluc2V0IDAgMXB4IDAgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEyKSwKICAgICAgICAwIDAgMCAxcHggY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQpIDI0JSwgdHJhbnNwYXJlbnQpLAogICAgICAgIDAgMCAxOHB4IHJnYmEoOTUsIDE3OSwgMjU1LCAwLjE4KTsKfQoKLm1qci1tZnYubWpyLW1mdi0tcG9wcGVkIC5tanItaWNvbi1idG4ubWpyLW5vZGVzdHJlYW0tYWN0aXZlIHsKICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdGF0dXMtd2FybmluZywgI2ZmOTgwMCkgNTglLCAjZmZmZmZmIDQyJSk7CiAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoCiAgICAgICAgMTgwZGVnLAogICAgICAgIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3RhdHVzLXdhcm5pbmcsICNmZjk4MDApIDYyJSwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA4KSksCiAgICAgICAgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdGF0dXMtd2FybmluZywgI2ZmOTgwMCkgMzYlLCB2YXIoLS1tanItc3VyZmFjZS0xKSA2NCUpCiAgICApOwogICAgY29sb3I6ICNmZmZmZmYgIWltcG9ydGFudDsKICAgIGJveC1zaGFkb3c6CiAgICAgICAgaW5zZXQgMCAxcHggMCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTIpLAogICAgICAgIDAgMCAwIDFweCBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN0YXR1cy13YXJuaW5nLCAjZmY5ODAwKSAyNCUsIHRyYW5zcGFyZW50KSwKICAgICAgICAwIDAgMThweCByZ2JhKDI1NSwgMTUyLCAwLCAwLjE4KTsKfQoKLm1qci1tZnYubWpyLW1mdi0tcG9wcGVkIC5tanItbWZ2LXBpbi1idG4gewogICAgYm9yZGVyLWNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWJvcmRlcikgNzYlLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTYpKTsKICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgKICAgICAgICAxODBkZWcsCiAgICAgICAgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTIpIDg0JSwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA4KSksCiAgICAgICAgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTEpIDkyJSwgcmdiYSgwLCAwLCAwLCAwLjE4KSkKICAgICk7CiAgICBjb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLWNvbnRlbnQtZmcsICNkZGQpIDkyJSwgI2ZmZmZmZiA4JSk7CiAgICBib3gtc2hhZG93OiBpbnNldCAwIDFweCAwIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wNCk7Cn0KCi5tanItbWZ2Lm1qci1tZnYtLXBvcHBlZCAubWpyLW1mdi1waW4tYnRuOmhvdmVyIHsKICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQpIDUyJSwgdmFyKC0tbWpyLWJvcmRlcikpOwogICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KAogICAgICAgIDE4MGRlZywKICAgICAgICBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMikgNTYlLCB2YXIoLS1tanItYWNjZW50KSA0NCUpLAogICAgICAgIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0xKSA2NCUsIHZhcigtLW1qci1hY2NlbnQpIDM2JSkKICAgICk7Cn0KCi5tanItbWZ2Lm1qci1tZnYtLXBvcHBlZCAubWpyLW1mdi1waW4tYnRuLmlzLXBpbm5lZCB7CiAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYWNjZW50KSA1OCUsICNmZmZmZmYgNDIlKTsKICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgKICAgICAgICAxODBkZWcsCiAgICAgICAgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQpIDYyJSwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA4KSksCiAgICAgICAgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQpIDM2JSwgdmFyKC0tbWpyLXN1cmZhY2UtMSkgNjQlKQogICAgKTsKICAgIGNvbG9yOiAjZmZmZmZmOwp9CgoubWpyLW1mdi5tanItbWZ2LS1wb3BwZWQgLm1qci13cy1zaWRlYmFyIHsKICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgKICAgICAgICAxODBkZWcsCiAgICAgICAgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTEpIDk0JSwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA0KSksCiAgICAgICAgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTApIDk0JSwgcmdiYSgwLCAwLCAwLCAwLjE4KSkKICAgICk7CiAgICBib3JkZXItbGVmdC1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1ib3JkZXIpIDc4JSwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE2KSk7CiAgICBib3gtc2hhZG93OiBpbnNldCAxcHggMCAwIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wMyk7Cn0KCi5tanItbWZ2Lm1qci1tZnYtLXBvcHBlZCAubWpyLW1mdi1jb250ZW50LXdyYXBwZXJbZGF0YS1zaWRlYmFyLXBvcz0ibGVmdCJdIC5tanItd3Mtc2lkZWJhciB7CiAgICBib3JkZXItcmlnaHQtY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYm9yZGVyKSA3OCUsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xNikpOwp9CgoubWpyLW1mdi5tanItbWZ2LS1wb3BwZWQgLm1qci13cy1zaWRlYmFyLWhlYWRlciB7CiAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoCiAgICAgICAgMTgwZGVnLAogICAgICAgIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0yKSA4NCUsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wNSkpLAogICAgICAgIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0xKSA5MiUsIHJnYmEoMCwgMCwgMCwgMC4xOCkpCiAgICApOwogICAgYm9yZGVyLWJvdHRvbS1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1ib3JkZXIpIDc2JSwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE0KSk7Cn0KCi5tanItbWZ2Lm1qci1tZnYtLXBvcHBlZCAubWpyLXdzLXNpZGViYXItdGl0bGUgewogICAgY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1jb250ZW50LWZnLCAjZWVmNGZmKSA4MiUsIHZhcigtLW1qci1tdXRlZCkgMTglKTsKICAgIG9wYWNpdHk6IDAuODg7Cn0KCi5tanItbWZ2Lm1qci1tZnYtLXBvcHBlZCAubWpyLXdzLW5vZGUgewogICAgYm9yZGVyLWJvdHRvbS1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1ib3JkZXIpIDcyJSwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEyKSk7Cn0KCi5tanItbWZ2Lm1qci1tZnYtLXBvcHBlZCAubWpyLXdzLW5vZGUtaGVhZGVyIHsKICAgIGJhY2tncm91bmQ6CiAgICAgICAgbGluZWFyLWdyYWRpZW50KDE4MGRlZywgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA0KSwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwKSksCiAgICAgICAgbGluZWFyLWdyYWRpZW50KAogICAgICAgICAgICAxODBkZWcsCiAgICAgICAgICAgIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0xKSA4NiUsIHZhcigtLW1qci1hY2NlbnQpIDE0JSksCiAgICAgICAgICAgIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0wKSA4NiUsIHJnYmEoMCwgMCwgMCwgMC4xNCkpCiAgICAgICAgKTsKICAgIGJveC1zaGFkb3c6IGluc2V0IDAgMXB4IDAgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA0KTsKfQoKLm1qci1tZnYubWpyLW1mdi0tcG9wcGVkIC5tanItd3Mtbm9kZS10aXRsZSB7CiAgICBjb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLWNvbnRlbnQtZmcsICNlZWY0ZmYpIDk0JSwgI2ZmZmZmZiA2JSk7Cn0KCi5tanItbWZ2Lm1qci1tZnYtLXBvcHBlZCAubWpyLXdzLXdpZGdldC1sYWJlbCwKLm1qci1tZnYubWpyLW1mdi0tcG9wcGVkIC5tanItd3Mtc2lkZWJhci1lbXB0eSwKLm1qci1tZnYubWpyLW1mdi0tcG9wcGVkIC5tanItd3Mtbm9kZS1lbXB0eSB7CiAgICBjb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1tdXRlZCkgODQlLCAjZmZmZmZmIDE2JSk7Cn0KCi5tanItbWZ2Lm1qci1tZnYtLXBvcHBlZCAubWpyLXdzLWlucHV0IHsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0wKSA3NCUsICMwNTA3MGEgMjYlKTsKICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1ib3JkZXIpIDc0JSwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE4KSk7CiAgICBib3JkZXItcmFkaXVzOiA2cHg7CiAgICBib3gtc2hhZG93OiBpbnNldCAwIDFweCAwIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wNCk7Cn0KCi5tanItbWZ2Lm1qci1tZnYtLXBvcHBlZCAubWpyLXdzLWlucHV0OmZvY3VzIHsKICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQpIDU4JSwgI2ZmZmZmZiAxMCUpOwogICAgYm94LXNoYWRvdzoKICAgICAgICBpbnNldCAwIDFweCAwIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wNCksCiAgICAgICAgMCAwIDAgMnB4IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYWNjZW50KSAxOCUsIHRyYW5zcGFyZW50KTsKfQoKLm1qci1tZnYgLm1qci1pY29uLWJ0bi5tanItcG9waW4tYWN0aXZlIHsKICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQpIDU4JSwgI2ZmZmZmZiA0MiUpOwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTIpIDQ1JSwgdmFyKC0tbWpyLWFjY2VudCkgNTUlKTsKICAgIGNvbG9yOiAjZWVmN2ZmOwp9CgovKiAtLSBDb250ZW50IHdyYXBwZXIgKGhvcml6b250YWwgZmxleDogY29udGVudCArIHNpZGViYXIpIC0tLS0tLS0tLS0tLS0tICovCi5tanItbWZ2LWNvbnRlbnQtd3JhcHBlciB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZmxleDogMTsKICAgIG1pbi1oZWlnaHQ6IDA7CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgY29udGFpbmVyLXR5cGU6IGlubGluZS1zaXplOwp9CgovKiAtLSBTaWRlYmFyIHBvc2l0aW9uIHZhcmlhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLm1qci1tZnYtY29udGVudC13cmFwcGVyW2RhdGEtc2lkZWJhci1wb3M9ImxlZnQiXSB7CiAgICBmbGV4LWRpcmVjdGlvbjogcm93Owp9Ci5tanItbWZ2LWNvbnRlbnQtd3JhcHBlcltkYXRhLXNpZGViYXItcG9zPSJsZWZ0Il0gLm1qci13cy1zaWRlYmFyIHsKICAgIGJvcmRlci1sZWZ0OiBub25lOwogICAgYm9yZGVyLXJpZ2h0OiAxcHggc29saWQgdmFyKC0tbWpyLWJvcmRlciwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEyKSk7Cn0KLm1qci1tZnYtY29udGVudC13cmFwcGVyW2RhdGEtc2lkZWJhci1wb3M9ImJvdHRvbSJdIHsKICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47Cn0KLm1qci1tZnYtY29udGVudC13cmFwcGVyW2RhdGEtc2lkZWJhci1wb3M9ImJvdHRvbSJdIC5tanItd3Mtc2lkZWJhciB7CiAgICBib3JkZXItbGVmdDogbm9uZTsKICAgIGJvcmRlci10b3A6IDFweCBzb2xpZCB2YXIoLS1tanItYm9yZGVyLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTIpKTsKICAgIHdpZHRoOiAxMDAlOwogICAgaGVpZ2h0OiAwOwogICAgdHJhbnNpdGlvbjoKICAgICAgICBoZWlnaHQgMC4ycyBlYXNlLAogICAgICAgIHdpZHRoIDBzOwp9Ci5tanItbWZ2LWNvbnRlbnQtd3JhcHBlcltkYXRhLXNpZGViYXItcG9zPSJib3R0b20iXSAubWpyLXdzLXNpZGViYXIub3BlbiB7CiAgICB3aWR0aDogMTAwJTsKICAgIGhlaWdodDogMjIwcHg7CiAgICBvdmVyZmxvdy15OiBhdXRvOwogICAgbWluLWhlaWdodDogMTIwcHg7CiAgICBtYXgtaGVpZ2h0OiA2NSU7Cn0KCi8qIC0tIENvbnRlbnQgYXJlYSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLm1qci1tZnYtY29udGVudCB7CiAgICBmbGV4OiAxOwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgIGJhY2tncm91bmQ6ICMwZDBkMGQ7CiAgICBtaW4taGVpZ2h0OiAwOwp9CgoubWpyLW1mdi1nZW4tc2lkZWJhciB7CiAgICBkaXNwbGF5OiBub25lOwogICAgZmxleDogMCAwIDMyMHB4OwogICAgd2lkdGg6IDMyMHB4OwogICAgbWluLXdpZHRoOiAyMTBweDsKICAgIG1heC13aWR0aDogbWluKDQyJSwgNDIwcHgpOwogICAgb3ZlcmZsb3cteTogYXV0bzsKICAgIG92ZXJmbG93LXg6IGhpZGRlbjsKICAgIHBhZGRpbmc6IDEwcHg7CiAgICBib3JkZXItbGVmdDogMXB4IHNvbGlkIHZhcigtLW1qci1ib3JkZXIsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xMikpOwogICAgYmFja2dyb3VuZDogcmdiYSgxOCwgMTgsIDIwLCAwLjk2KTsKICAgIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuODgpOwp9CgoubWpyLW1mdi1nZW4tc2lkZWJhci5vcGVuIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgZ2FwOiAxMHB4Owp9CgoubWpyLW1mdi1jb250ZW50LXdyYXBwZXJbZGF0YS1zaWRlYmFyLXBvcz0ibGVmdCJdIC5tanItbWZ2LWdlbi1zaWRlYmFyIHsKICAgIGJvcmRlci1sZWZ0OiAxcHggc29saWQgdmFyKC0tbWpyLWJvcmRlciwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEyKSk7CiAgICBib3JkZXItcmlnaHQ6IG5vbmU7Cn0KCi5tanItbWZ2LWNvbnRlbnQtd3JhcHBlcltkYXRhLXNpZGViYXItcG9zPSJib3R0b20iXSAubWpyLW1mdi1nZW4tc2lkZWJhciB7CiAgICBmbGV4OiAwIDAgY2xhbXAoMTkwcHgsIDMyJSwgMjgwcHgpOwogICAgd2lkdGg6IDEwMCU7CiAgICBtYXgtd2lkdGg6IG5vbmU7CiAgICBtaW4td2lkdGg6IDA7CiAgICBtYXgtaGVpZ2h0OiA0NiU7CiAgICBib3JkZXItbGVmdDogbm9uZTsKICAgIGJvcmRlci10b3A6IDFweCBzb2xpZCB2YXIoLS1tanItYm9yZGVyLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTIpKTsKfQoKLm1qci1tZnYtZ2VuLXNpZGViYXItdGl0bGUgewogICAgZm9udC1zaXplOiAxMnB4OwogICAgZm9udC13ZWlnaHQ6IDcwMDsKICAgIGxldHRlci1zcGFjaW5nOiAwOwogICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC45NCk7Cn0KCi5tanItbWZ2LWdlbi1zaWRlYmFyLXNlY3Rpb24gewogICAgZGlzcGxheTogZmxleDsKICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICBnYXA6IDZweDsKICAgIHBhZGRpbmctdG9wOiA4cHg7CiAgICBib3JkZXItdG9wOiAxcHggc29saWQgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEpOwp9CgoubWpyLW1mdi1nZW4tc2lkZWJhci1zZWN0aW9uOmZpcnN0LW9mLXR5cGUgewogICAgcGFkZGluZy10b3A6IDA7CiAgICBib3JkZXItdG9wOiBub25lOwp9CgoubWpyLW1mdi1nZW4tc2lkZWJhci1oZWFkaW5nIHsKICAgIGZvbnQtc2l6ZTogMTFweDsKICAgIGZvbnQtd2VpZ2h0OiA3MDA7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjcyKTsKfQoKLm1qci1tZnYtZ2VuLXNpZGViYXItYm9keSB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgIGdhcDogMTBweDsKICAgIGZvbnQtc2l6ZTogMTJweDsKICAgIGxpbmUtaGVpZ2h0OiAxLjQ1OwogICAgd29yZC1icmVhazogYnJlYWstd29yZDsKfQoKLm1qci1tZnYtY29udGVudC13cmFwcGVyW2RhdGEtc2lkZWJhci1wb3M9ImJvdHRvbSJdIC5tanItbWZ2LWdlbi1zaWRlYmFyLm9wZW4gewogICAgZ2FwOiA2cHg7Cn0KCi5tanItbWZ2LWNvbnRlbnQtd3JhcHBlcltkYXRhLXNpZGViYXItcG9zPSJib3R0b20iXSAubWpyLW1mdi1nZW4tc2lkZWJhci10aXRsZSB7CiAgICBmbGV4OiAwIDAgYXV0bzsKfQoKLm1qci1tZnYtY29udGVudC13cmFwcGVyW2RhdGEtc2lkZWJhci1wb3M9ImJvdHRvbSJdIC5tanItbWZ2LWdlbi1zaWRlYmFyLXNlY3Rpb24gewogICAgZmxleDogMCAwIGF1dG87CiAgICBtaW4taGVpZ2h0OiBhdXRvOwogICAgcGFkZGluZy10b3A6IDRweDsKfQoKLm1qci1tZnYtY29udGVudC13cmFwcGVyW2RhdGEtc2lkZWJhci1wb3M9ImJvdHRvbSJdIC5tanItbWZ2LWdlbi1zaWRlYmFyLWhlYWRpbmcgewogICAgZGlzcGxheTogbm9uZTsKfQoKLm1qci1tZnYtY29udGVudC13cmFwcGVyW2RhdGEtc2lkZWJhci1wb3M9ImJvdHRvbSJdIC5tanItbWZ2LWdlbi1zaWRlYmFyLWJvZHkgewogICAgZGlzcGxheTogYmxvY2s7CiAgICBjb2x1bW5zOiAzIDE3MHB4OwogICAgY29sdW1uLWdhcDogMTBweDsKICAgIGNvbHVtbi1maWxsOiBiYWxhbmNlOwogICAgbWluLWhlaWdodDogYXV0bzsKICAgIG92ZXJmbG93LXg6IGhpZGRlbjsKICAgIG92ZXJmbG93LXk6IHZpc2libGU7CiAgICBwYWRkaW5nLXJpZ2h0OiAycHg7CiAgICBzY3JvbGxiYXItd2lkdGg6IHRoaW47Cn0KCi5tanItbWZ2LWNvbnRlbnQtd3JhcHBlcltkYXRhLXNpZGViYXItcG9zPSJib3R0b20iXSAubWpyLW1mdi1nZW4tc2lkZWJhci1ib2R5ID4gKiB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYnJlYWstaW5zaWRlOiBhdm9pZDsKICAgIHBhZ2UtYnJlYWstaW5zaWRlOiBhdm9pZDsKICAgIG1pbi13aWR0aDogMDsKICAgIG1pbi1oZWlnaHQ6IDA7CiAgICBtYXJnaW4tYmxvY2s6IDAgMTBweDsKfQoKLm1qci1tZnYtZ2VuLXRpbWUtYmFkZ2UgewogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47CiAgICBnYXA6IDEycHg7CiAgICBwYWRkaW5nOiA4cHggMTBweDsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjI0LCAyNTUsIDEyMiwgMC40Mik7CiAgICBib3JkZXItcmFkaXVzOiA5OTlweDsKICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgxMzVkZWcsIHJnYmEoMjI0LCAyNTUsIDEyMiwgMC4xNiksIHJnYmEoNzYsIDE3NSwgODAsIDAuMSkpOwogICAgYm94LXNoYWRvdzogMCAwIDAgMXB4IHJnYmEoMjI0LCAyNTUsIDEyMiwgMC4xMikgaW5zZXQ7CiAgICBjdXJzb3I6IGNvcHk7CiAgICB0cmFuc2l0aW9uOgogICAgICAgIGJhY2tncm91bmQgMC4xNnMgZWFzZSwKICAgICAgICBib3JkZXItY29sb3IgMC4xNnMgZWFzZSwKICAgICAgICBib3gtc2hhZG93IDAuMTZzIGVhc2U7Cn0KCi5tanItbWZ2LWNvbnRlbnQtd3JhcHBlcltkYXRhLXNpZGViYXItcG9zPSJib3R0b20iXSAubWpyLW1mdi1nZW4tdGltZS1iYWRnZSB7CiAgICBhbGlnbi1pdGVtczogc3RyZXRjaDsKICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47CiAgICBib3JkZXItcmFkaXVzOiA2cHg7Cn0KCi5tanItbWZ2LWdlbi10aW1lLWxhYmVsIHsKICAgIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNzIpOwogICAgZm9udC1zaXplOiAxMHB4OwogICAgZm9udC13ZWlnaHQ6IDcwMDsKICAgIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7CiAgICBsZXR0ZXItc3BhY2luZzogMC41cHg7Cn0KCi5tanItbWZ2LWdlbi10aW1lLXZhbHVlIHsKICAgIGNvbG9yOiAjZTBmZjdhOwogICAgZm9udC1zaXplOiAxM3B4OwogICAgZm9udC13ZWlnaHQ6IDgwMDsKICAgIGZvbnQtZmFtaWx5OiBDb25zb2xhcywgTW9uYWNvLCBtb25vc3BhY2U7Cn0KCi5tanItbWZ2LWdlbi1jYXJkIHsKICAgIC0tbWpyLW1mdi1nZW4tYWNjZW50OiAjMjE5NmYzOwogICAgZGlzcGxheTogZmxleDsKICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICBnYXA6IDhweDsKICAgIHBhZGRpbmc6IDEycHg7CiAgICBib3JkZXI6IDFweCBzb2xpZCBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLW1mdi1nZW4tYWNjZW50KSA0NSUsIHRyYW5zcGFyZW50KTsKICAgIGJvcmRlci1yYWRpdXM6IDZweDsKICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgKICAgICAgICAxMzVkZWcsCiAgICAgICAgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1tZnYtZ2VuLWFjY2VudCkgMTYlLCB0cmFuc3BhcmVudCkgMCUsCiAgICAgICAgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1tZnYtZ2VuLWFjY2VudCkgOCUsIHRyYW5zcGFyZW50KSAxMDAlCiAgICApOwogICAgYm94LXNoYWRvdzogMCAwIDAgMXB4IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItbWZ2LWdlbi1hY2NlbnQpIDE0JSwgdHJhbnNwYXJlbnQpIGluc2V0OwogICAgY3Vyc29yOiBjb3B5OwogICAgdHJhbnNpdGlvbjoKICAgICAgICBiYWNrZ3JvdW5kIDAuMTZzIGVhc2UsCiAgICAgICAgYm9yZGVyLWNvbG9yIDAuMTZzIGVhc2UsCiAgICAgICAgYm94LXNoYWRvdyAwLjE2cyBlYXNlOwp9CgoubWpyLW1mdi1jb250ZW50LXdyYXBwZXJbZGF0YS1zaWRlYmFyLXBvcz0iYm90dG9tIl0gLm1qci1tZnYtZ2VuLWNhcmQgewogICAgbWluLWhlaWdodDogMDsKICAgIHBhZGRpbmc6IDEwcHg7Cn0KCi5tanItbWZ2LWNvbnRlbnQtd3JhcHBlcltkYXRhLXNpZGViYXItcG9zPSJib3R0b20iXSAubWpyLW1mdi1nZW4tY2FyZC0tcG9zaXRpdmUtcHJvbXB0LAoubWpyLW1mdi1jb250ZW50LXdyYXBwZXJbZGF0YS1zaWRlYmFyLXBvcz0iYm90dG9tIl0gLm1qci1tZnYtZ2VuLWNhcmQtLW5lZ2F0aXZlLXByb21wdCwKLm1qci1tZnYtY29udGVudC13cmFwcGVyW2RhdGEtc2lkZWJhci1wb3M9ImJvdHRvbSJdIC5tanItbWZ2LWdlbi1jYXJkLS1wcm9tcHQgewogICAgbWluLWhlaWdodDogMTEwcHg7Cn0KCi5tanItbWZ2LWNvbnRlbnQtd3JhcHBlcltkYXRhLXNpZGViYXItcG9zPSJib3R0b20iXSAubWpyLW1mdi1nZW4tY2FyZC0td29ya2Zsb3cgewogICAgbWluLWhlaWdodDogNThweDsKfQoKLm1qci1tZnYtY29udGVudC13cmFwcGVyW2RhdGEtc2lkZWJhci1wb3M9ImJvdHRvbSJdIC5tanItbWZ2LWdlbi1jYXJkLS1tb2RlbC1hbmQtbG9yYSwKLm1qci1tZnYtY29udGVudC13cmFwcGVyW2RhdGEtc2lkZWJhci1wb3M9ImJvdHRvbSJdIC5tanItbWZ2LWdlbi1jYXJkLS1tb2RlbHMsCi5tanItbWZ2LWNvbnRlbnQtd3JhcHBlcltkYXRhLXNpZGViYXItcG9zPSJib3R0b20iXSAubWpyLW1mdi1nZW4tY2FyZC0tc2FtcGxpbmcsCi5tanItbWZ2LWNvbnRlbnQtd3JhcHBlcltkYXRhLXNpZGViYXItcG9zPSJib3R0b20iXSAubWpyLW1mdi1nZW4tY2FyZC0tZ2VuZXJhdGlvbi1waXBlbGluZSwKLm1qci1tZnYtY29udGVudC13cmFwcGVyW2RhdGEtc2lkZWJhci1wb3M9ImJvdHRvbSJdIC5tanItbWZ2LWdlbi1jYXJkLS10ZXh0LXRvLWltYWdlLAoubWpyLW1mdi1jb250ZW50LXdyYXBwZXJbZGF0YS1zaWRlYmFyLXBvcz0iYm90dG9tIl0gLm1qci1tZnYtZ2VuLWNhcmQtLWltYWdlLXRvLWltYWdlLAoubWpyLW1mdi1jb250ZW50LXdyYXBwZXJbZGF0YS1zaWRlYmFyLXBvcz0iYm90dG9tIl0gLm1qci1tZnYtZ2VuLWNhcmQtLWlucGFpbnQsCi5tanItbWZ2LWNvbnRlbnQtd3JhcHBlcltkYXRhLXNpZGViYXItcG9zPSJib3R0b20iXSAubWpyLW1mdi1nZW4tY2FyZC0tdXBzY2FsZSwKLm1qci1tZnYtY29udGVudC13cmFwcGVyW2RhdGEtc2lkZWJhci1wb3M9ImJvdHRvbSJdIC5tanItbWZ2LWdlbi1jYXJkLS1yZWZpbmUgewogICAgbWluLWhlaWdodDogODZweDsKfQoKLm1qci1tZnYtZ2VuLWNhcmQtLXNlZWQgewogICAgZmxleC1kaXJlY3Rpb246IHJvdzsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47CiAgICBib3JkZXItd2lkdGg6IDJweDsKfQoKLm1qci1tZnYtZ2VuLWNhcmQtLWNvbXBhY3QgewogICAgZmxleC1kaXJlY3Rpb246IHJvdzsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47CiAgICBnYXA6IDEycHg7Cn0KCi5tanItbWZ2LWNvbnRlbnQtd3JhcHBlcltkYXRhLXNpZGViYXItcG9zPSJib3R0b20iXSAubWpyLW1mdi1nZW4tY2FyZC0tY29tcGFjdCB7CiAgICBhbGlnbi1pdGVtczogc3RyZXRjaDsKICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47Cn0KCi5tanItbWZ2LWdlbi1jYXJkLS1jb21wYWN0IC5tanItbWZ2LWdlbi1jYXJkLXRpdGxlLAoubWpyLW1mdi1nZW4tY2FyZC0tY29tcGFjdCAubWpyLW1mdi1nZW4tY2FyZC12YWx1ZSB7CiAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwp9CgoubWpyLW1mdi1nZW4tY2FyZDpob3ZlciwKLm1qci1tZnYtZ2VuLXRpbWUtYmFkZ2U6aG92ZXIgewogICAgYm9yZGVyLWNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLW1mdi1nZW4tYWNjZW50LCAjZTBmZjdhKSA3MCUsIHRyYW5zcGFyZW50KTsKICAgIGJveC1zaGFkb3c6IDAgMCAwIDFweCBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLW1mdi1nZW4tYWNjZW50LCAjZTBmZjdhKSAyNCUsIHRyYW5zcGFyZW50KQogICAgICAgIGluc2V0Owp9CgoubWpyLW1mdi1nZW4tY29weS1mbGFzaCB7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDc2LCAxNzUsIDgwLCAwLjI4KSAhaW1wb3J0YW50Owp9CgoubWpyLW1mdi1nZW4tY2FyZC10aXRsZSB7CiAgICBjb2xvcjogdmFyKC0tbWpyLW1mdi1nZW4tYWNjZW50KTsKICAgIGZvbnQtc2l6ZTogMTFweDsKICAgIGZvbnQtd2VpZ2h0OiA3MDA7CiAgICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOwogICAgbGV0dGVyLXNwYWNpbmc6IDAuNXB4Owp9CgoubWpyLW1mdi1nZW4tY2FyZC12YWx1ZSB7CiAgICBjb2xvcjogdmFyKC0tZmctY29sb3IsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC45MikpOwogICAgZm9udC1zaXplOiAxMnB4OwogICAgbWluLXdpZHRoOiAwOwogICAgd29yZC1icmVhazogYnJlYWstd29yZDsKfQoKLm1qci1tZnYtY29udGVudC13cmFwcGVyW2RhdGEtc2lkZWJhci1wb3M9ImJvdHRvbSJdIC5tanItbWZ2LWdlbi1jYXJkLXZhbHVlIHsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICBkaXNwbGF5OiAtd2Via2l0LWJveDsKICAgIC13ZWJraXQtbGluZS1jbGFtcDogNTsKICAgIC13ZWJraXQtYm94LW9yaWVudDogdmVydGljYWw7Cn0KCi5tanItbWZ2LWdlbi1jYXJkLXZhbHVlLmlzLWNvbXBhY3QgewogICAgdGV4dC1hbGlnbjogcmlnaHQ7CiAgICBmb250LXdlaWdodDogNzAwOwp9CgoubWpyLW1mdi1jb250ZW50LXdyYXBwZXJbZGF0YS1zaWRlYmFyLXBvcz0iYm90dG9tIl0gLm1qci1tZnYtZ2VuLWNhcmQtdmFsdWUuaXMtY29tcGFjdCB7CiAgICB0ZXh0LWFsaWduOiBsZWZ0Owp9CgoubWpyLW1mdi1nZW4tY2FyZC12YWx1ZS5pcy1tdWx0aWxpbmUgewogICAgd2hpdGUtc3BhY2U6IHByZS13cmFwOwp9CgoubWpyLW1mdi1nZW4tY2FyZC0tc2VlZCAubWpyLW1mdi1nZW4tY2FyZC12YWx1ZSB7CiAgICBmb250LXNpemU6IDE4cHg7CiAgICBmb250LXdlaWdodDogNzAwOwogICAgZm9udC1mYW1pbHk6IENvbnNvbGFzLCBNb25hY28sIG1vbm9zcGFjZTsKICAgIGxldHRlci1zcGFjaW5nOiAxcHg7CiAgICBjb2xvcjogI2ZmZjsKfQoKLm1qci1tZnYtZ2VuLWNhcmQtdmFsdWUuaXMtZmllbGRzIHsKICAgIGRpc3BsYXk6IGdyaWQ7CiAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IDFmcjsKICAgIGdhcDogOHB4Owp9CgoubWpyLW1mdi1jb250ZW50LXdyYXBwZXJbZGF0YS1zaWRlYmFyLXBvcz0iYm90dG9tIl0gLm1qci1tZnYtZ2VuLWNhcmQtdmFsdWUuaXMtZmllbGRzIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgZ2FwOiA3cHg7CiAgICAtd2Via2l0LWxpbmUtY2xhbXA6IHVuc2V0Owp9CgoubWpyLW1mdi1nZW4tY2FyZC12YWx1ZS5pcy1icmFuY2gtZ3JvdXBzIHsKICAgIGdhcDogMTBweDsKfQoKLm1qci1tZnYtZ2VuLWJyYW5jaC1ncm91cCB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgIGdhcDogN3B4OwogICAgbWluLXdpZHRoOiAwOwogICAgcGFkZGluZzogOHB4OwogICAgYm9yZGVyLXJhZGl1czogNnB4OwogICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEpOwogICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA0NSk7Cn0KCi5tanItbWZ2LWdlbi1icmFuY2gtdGl0bGUgewogICAgY29sb3I6IHZhcigtLW1qci1tZnYtZ2VuLWFjY2VudCk7CiAgICBmb250LXNpemU6IDEwcHg7CiAgICBmb250LXdlaWdodDogODAwOwogICAgbGV0dGVyLXNwYWNpbmc6IDAuNnB4OwogICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKfQoKLm1qci1tZnYtZ2VuLWZpZWxkIHsKICAgIGRpc3BsYXk6IGdyaWQ7CiAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IG1pbm1heCg3OHB4LCBhdXRvKSAxZnI7CiAgICBnYXA6IDEwcHg7CiAgICBhbGlnbi1pdGVtczogc3RhcnQ7CiAgICBtaW4td2lkdGg6IDA7Cn0KCi5tanItbWZ2LWNvbnRlbnQtd3JhcHBlcltkYXRhLXNpZGViYXItcG9zPSJib3R0b20iXSAubWpyLW1mdi1nZW4tZmllbGQgewogICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiBtaW5tYXgoNTRweCwgYXV0bykgbWlubWF4KDAsIDFmcik7Cn0KCi5tanItbWZ2LWNvbnRlbnQtd3JhcHBlcltkYXRhLXNpZGViYXItcG9zPSJib3R0b20iXSAubWpyLW1mdi1nZW4tZmllbGQtdmFsdWUgewogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKfQoKLm1qci1tZnYtZ2VuLWZpZWxkLWxhYmVsIHsKICAgIGNvbG9yOiB2YXIoLS1tanItbXV0ZWQsIHJnYmEoMTgwLCAxODAsIDE4MCwgMC43MikpOwogICAgZm9udC1zaXplOiAxMXB4OwogICAgZm9udC13ZWlnaHQ6IDYwMDsKfQoKLm1qci1tZnYtZ2VuLWZpZWxkLXZhbHVlIHsKICAgIGNvbG9yOiB2YXIoLS1mZy1jb2xvciwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjk1KSk7CiAgICBtaW4td2lkdGg6IDA7CiAgICB3aGl0ZS1zcGFjZTogcHJlLXdyYXA7CiAgICB3b3JkLWJyZWFrOiBicmVhay13b3JkOwp9CgoubWpyLW1mdi1nZW4tc2lkZWJhci1ib2R5IHN0cm9uZyB7CiAgICBmb250LXdlaWdodDogNjAwOwogICAgbWFyZ2luLXJpZ2h0OiA0cHg7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjk1KTsKfQoKLm1qci1tZnYtZ2VuLXNpZGViYXItYm9keSBbZGF0YS1maWVsZD0icHJvbXB0Il0gc3Ryb25nIHsKICAgIGNvbG9yOiAjN2VjOGZmOwp9Ci5tanItbWZ2LWdlbi1zaWRlYmFyLWJvZHkgW2RhdGEtZmllbGQ9InNlZWQiXSBzdHJvbmcgewogICAgY29sb3I6ICNmZmQ0N2E7Cn0KLm1qci1tZnYtZ2VuLXNpZGViYXItYm9keSBbZGF0YS1maWVsZD0ibW9kZWwiXSBzdHJvbmcgewogICAgY29sb3I6ICM3ZGRhOGE7Cn0KLm1qci1tZnYtZ2VuLXNpZGViYXItYm9keSBbZGF0YS1maWVsZD0ibG9yYSJdIHN0cm9uZyB7CiAgICBjb2xvcjogI2Q0OGNmZjsKfQoubWpyLW1mdi1nZW4tc2lkZWJhci1ib2R5IFtkYXRhLWZpZWxkPSJzYW1wbGVyIl0gc3Ryb25nIHsKICAgIGNvbG9yOiAjZmY5ZjdhOwp9Ci5tanItbWZ2LWdlbi1zaWRlYmFyLWJvZHkgW2RhdGEtZmllbGQ9InNjaGVkdWxlciJdIHN0cm9uZyB7CiAgICBjb2xvcjogI2ZmN2E5ZjsKfQoubWpyLW1mdi1nZW4tc2lkZWJhci1ib2R5IFtkYXRhLWZpZWxkPSJjZmciXSBzdHJvbmcgewogICAgY29sb3I6ICM3YTlmZmY7Cn0KLm1qci1tZnYtZ2VuLXNpZGViYXItYm9keSBbZGF0YS1maWVsZD0ic3RlcCJdIHN0cm9uZyB7CiAgICBjb2xvcjogIzdhZmZkNDsKfQoubWpyLW1mdi1nZW4tc2lkZWJhci1ib2R5IFtkYXRhLWZpZWxkPSJnZW5UaW1lIl0gc3Ryb25nIHsKICAgIGNvbG9yOiAjZTBmZjdhOwp9CgoubWpyLW1mdi1nZW4tc2lkZWJhci1ib2R5IGRpdiB7CiAgICBtYXJnaW4tYm90dG9tOiA1cHg7Cn0KCi5tanItbWZ2LWNvbnRlbnQtd3JhcHBlcltkYXRhLXNpZGViYXItcG9zPSJib3R0b20iXSAubWpyLW1mdi1nZW4tc2lkZWJhci1ib2R5IGRpdiB7CiAgICBtYXJnaW4tYm90dG9tOiAwOwp9CgoubWpyLW1mdi1jb250ZW50LXdyYXBwZXJbZGF0YS1zaWRlYmFyLXBvcz0iYm90dG9tIl0gLm1qci1tZnYtZ2VuLXNpZGViYXItYm9keSA+IGRpdiwKLm1qci1tZnYtY29udGVudC13cmFwcGVyW2RhdGEtc2lkZWJhci1wb3M9ImJvdHRvbSJdIC5tanItbWZ2LWdlbi1zaWRlYmFyLWJvZHkgPiBzZWN0aW9uIHsKICAgIG1hcmdpbi1ibG9jazogMCAxMHB4Owp9CgoubWpyLW1mdi1nZW4tc2lkZWJhci1ib2R5IGRpdjpsYXN0LWNoaWxkIHsKICAgIG1hcmdpbi1ib3R0b206IDA7Cn0KCkBjb250YWluZXIgKG1heC13aWR0aDogNzYwcHgpIHsKICAgIC5tanItbWZ2LWNvbnRlbnQtd3JhcHBlcltkYXRhLXNpZGViYXItcG9zPSJib3R0b20iXSAubWpyLW1mdi1nZW4tc2lkZWJhci1ib2R5IHsKICAgICAgICBjb2x1bW5zOiBhdXRvOwogICAgICAgIGNvbHVtbi1jb3VudDogMTsKICAgICAgICBjb2x1bW4td2lkdGg6IGF1dG87CiAgICB9CgogICAgLm1qci1tZnYtY29udGVudC13cmFwcGVyW2RhdGEtc2lkZWJhci1wb3M9ImJvdHRvbSJdIC5tanItbWZ2LWdlbi1zaWRlYmFyLWJvZHkgPiAqIHsKICAgICAgICB3aWR0aDogMTAwJTsKICAgIH0KfQoKLm1qci1tZnYtb3ZlcmxheS1jYW52YXMgewogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgaW5zZXQ6IDA7CiAgICB3aWR0aDogMTAwJTsKICAgIGhlaWdodDogMTAwJTsKICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgei1pbmRleDogMTI7Cn0KCi5tanItbWZ2LXRvb2xiYXItc2VsZWN0IHsKICAgIGhlaWdodDogMjRweDsKICAgIHBhZGRpbmc6IDAgNnB4OwogICAgYm9yZGVyLXJhZGl1czogNnB4OwogICAgYm9yZGVyOiAwLjhweCBzb2xpZCByZ2JhKDE5NiwgMjAyLCAyMTAsIDAuMjQpOwogICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KDE4MGRlZywgcmdiYSgyMTAsIDIxNCwgMjIwLCAwLjA2KSwgcmdiYSgyMTAsIDIxNCwgMjIwLCAwLjAyKSk7CiAgICBjb2xvcjogcmdiYSgyMzAsIDIzMywgMjM4LCAwLjkyKTsKICAgIGZvbnQtc2l6ZTogMTFweDsKICAgIG91dGxpbmU6IG5vbmU7Cn0KCi5tanItbWZ2LXRvb2xiYXItcmFuZ2UgewogICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiA2cHg7Cn0KCi5tanItbWZ2LXRvb2xiYXItcmFuZ2UgaW5wdXRbdHlwZT0icmFuZ2UiXSB7CiAgICB3aWR0aDogNzJweDsKICAgIGFjY2VudC1jb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjg1KTsKfQoKLm1qci1tZnYtdG9vbGJhci1yYW5nZS1vdXQgewogICAgbWluLXdpZHRoOiAzMHB4OwogICAgdGV4dC1hbGlnbjogcmlnaHQ7CiAgICBmb250LXNpemU6IDExcHg7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjkpOwp9CgovKiBFViBzbGlkZXIgYWN0aXZlIHN0YXRlICh2YWx1ZSAhPSAwKSAqLwoubWpyLW1mdi10b29sYmFyLXJhbmdlLmlzLWFjdGl2ZSBpbnB1dFt0eXBlPSJyYW5nZSJdIHsKICAgIGFjY2VudC1jb2xvcjogI2Y1Yzg0MjsKfQoubWpyLW1mdi10b29sYmFyLXJhbmdlLmlzLWFjdGl2ZSAubWpyLW1mdi10b29sYmFyLXJhbmdlLW91dCB7CiAgICBjb2xvcjogI2Y1Yzg0MjsKICAgIGZvbnQtd2VpZ2h0OiA2MDA7Cn0KCi5tanItbWZ2LW1lZGlhLXByb2dyZXNzIHsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIHRvcDogMTBweDsKICAgIGxlZnQ6IDEwcHg7CiAgICB6LWluZGV4OiA2OwogICAgbWF4LXdpZHRoOiBjYWxjKDEwMCUgLSAyMHB4KTsKICAgIHBhZGRpbmc6IDVweCA5cHg7CiAgICBib3JkZXItcmFkaXVzOiA2cHg7CiAgICBib3JkZXI6IDFweCBzb2xpZAogICAgICAgIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYm9yZGVyLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTgpKSA4OCUsIHRyYW5zcGFyZW50KTsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCByZ2JhKDUsIDgsIDE0LCAwLjg2KSA4NiUsIHZhcigtLW1qci1zdXJmYWNlLTAsICMxMTEpIDE0JSk7CiAgICBjb2xvcjogdmFyKC0tY29udGVudC1mZywgI2Y1ZjdmYSk7CiAgICBib3gtc2hhZG93OiAwIDJweCAxMHB4IHJnYmEoMCwgMCwgMCwgMC4yOCk7CiAgICBiYWNrZHJvcC1maWx0ZXI6IGJsdXIoNnB4KTsKICAgIC13ZWJraXQtYmFja2Ryb3AtZmlsdGVyOiBibHVyKDZweCk7CiAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgIG9wYWNpdHk6IDA7CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTRweCk7CiAgICB0cmFuc2l0aW9uOgogICAgICAgIG9wYWNpdHkgMC4xNnMgZWFzZSwKICAgICAgICB0cmFuc2Zvcm0gMC4xNnMgZWFzZTsKfQoKLm1qci1tZnYtbWVkaWEtcHJvZ3Jlc3MuaXMtdmlzaWJsZSB7CiAgICBvcGFjaXR5OiAxOwogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDApOwp9CgoubWpyLW1mdi1tZWRpYS1wcm9ncmVzcy5pcy1lcnJvciB7CiAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3RhdHVzLWVycm9yLCAjZmY1YzdhKSA3MiUsIHRyYW5zcGFyZW50KTsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCByZ2JhKDYwLCAxMCwgMTgsIDAuOSkgODIlLCB2YXIoLS1tanItc3VyZmFjZS0wLCAjMTExKSAxOCUpOwp9CgoubWpyLW1mdi1tZWRpYS1wcm9ncmVzcy10ZXh0IHsKICAgIGRpc3BsYXk6IGJsb2NrOwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgIGZvbnQtc2l6ZTogMTFweDsKICAgIGZvbnQtd2VpZ2h0OiA2MDA7CiAgICBsaW5lLWhlaWdodDogMS4yOwp9CgovKiAtLSBXb3JrZmxvdyBTaWRlYmFyIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi5tanItd3Mtc2lkZWJhciB7CiAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgIHdpZHRoOiAwOwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIGJhY2tncm91bmQ6IHZhcigtLW1qci1zdXJmYWNlLTEsICMyYTJhMmEpOwogICAgYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCB2YXIoLS1tanItYm9yZGVyLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTIpKTsKICAgIHRyYW5zaXRpb246IHdpZHRoIDAuMnMgZWFzZTsKICAgIGZsZXgtc2hyaW5rOiAwOwp9CgoubWpyLXdzLXNpZGViYXIub3BlbiB7CiAgICB3aWR0aDogMjYwcHg7CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgbWluLXdpZHRoOiAxODBweDsKICAgIG1heC13aWR0aDogNjUlOwogICAgdHJhbnNpdGlvbjogbm9uZTsKfQoKLm1qci13cy1zaWRlYmFyLWhlYWRlciB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsKICAgIHBhZGRpbmc6IDZweCAxMHB4OwogICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHZhcigtLW1qci1ib3JkZXIsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xMikpOwogICAgZmxleC1zaHJpbms6IDA7CiAgICBtaW4taGVpZ2h0OiAzNHB4Owp9Ci5tanItd3Mtc2lkZWJhci10aXRsZSB7CiAgICBmb250LXNpemU6IDExcHg7CiAgICBmb250LXdlaWdodDogNjAwOwogICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKICAgIGxldHRlci1zcGFjaW5nOiAwLjVweDsKICAgIG9wYWNpdHk6IDAuNjU7Cn0KLm1qci13cy1zaWRlYmFyLWJvZHkgewogICAgZmxleDogMTsKICAgIG1pbi1oZWlnaHQ6IDA7CiAgICBvdmVyZmxvdy15OiBhdXRvOwogICAgcGFkZGluZzogMDsKfQoubWpyLXdzLXNpZGViYXItZW1wdHkgewogICAgcGFkZGluZzogMjRweCAxNnB4OwogICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4yNSk7CiAgICBmb250LXNpemU6IDExcHg7CiAgICBsaW5lLWhlaWdodDogMS41Owp9CgovKiAtLSBUYWIgYmFyIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoubWpyLXdzLXRhYi1iYXIgewogICAgZGlzcGxheTogZmxleDsKICAgIGZsZXgtc2hyaW5rOiAwOwogICAgZ2FwOiAycHg7CiAgICBwYWRkaW5nOiA0cHggOHB4OwogICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHZhcigtLW1qci1ib3JkZXIsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xMikpOwogICAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjE4KTsKfQoKLm1qci13cy10YWIgewogICAgZmxleDogMTsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICBnYXA6IDVweDsKICAgIHBhZGRpbmc6IDRweCA4cHg7CiAgICBib3JkZXI6IG5vbmU7CiAgICBib3JkZXItcmFkaXVzOiA0cHg7CiAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsKICAgIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNDUpOwogICAgZm9udC1zaXplOiAxMXB4OwogICAgZm9udC13ZWlnaHQ6IDUwMDsKICAgIGN1cnNvcjogcG9pbnRlcjsKICAgIHRyYW5zaXRpb246CiAgICAgICAgYmFja2dyb3VuZCAwLjE1cywKICAgICAgICBjb2xvciAwLjE1czsKfQoKLm1qci13cy10YWI6aG92ZXIgewogICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA3KTsKICAgIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNzUpOwp9CgoubWpyLXdzLXRhYi5pcy1hY3RpdmUgewogICAgYmFja2dyb3VuZDogcmdiYSg5OSwgMTU1LCAyNTUsIDAuMTUpOwogICAgY29sb3I6ICM2MzliZmY7Cn0KCi8qIC0tIE5vZGVzIHRhYiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi5tanItd3Mtbm9kZXMtdGFiIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgZmxleDogMTsKICAgIG1pbi1oZWlnaHQ6IDA7CiAgICBvdmVyZmxvdzogaGlkZGVuOwp9CgovKiBHcmFwaCBNYXAgdGFiICovCi5tanItd2dtIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgbWluLWhlaWdodDogMTAwJTsKICAgIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuODIpOwp9CgoubWpyLXdnbS1tYXAtd3JhcCB7CiAgICBoZWlnaHQ6IDE5MHB4OwogICAgbWluLWhlaWdodDogMTUwcHg7CiAgICBtYXJnaW46IDhweDsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xMik7CiAgICBib3JkZXItcmFkaXVzOiA2cHg7CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjIyKTsKfQoKLm1qci13Z20tcHJldmlldyB7CiAgICB3aWR0aDogMTAwJTsKICAgIGhlaWdodDogMTAwJTsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIDAuMzIpOwp9CgoubWpyLXdnbS1wcmV2aWV3IC5tanItbWZ2LW1lZGlhLAoubWpyLXdnbS1wcmV2aWV3IC5tanItbWZ2LXBsYXllci1ob3N0LAoubWpyLXdnbS1wcmV2aWV3IC5tanItbW9kZWwzZC1ob3N0LAoubWpyLXdnbS1wcmV2aWV3LW1lZGlhIHsKICAgIG1heC13aWR0aDogMTAwJTsKICAgIG1heC1oZWlnaHQ6IDEwMCU7CiAgICB3aWR0aDogMTAwJTsKICAgIGhlaWdodDogMTAwJTsKICAgIG9iamVjdC1maXQ6IGNvbnRhaW47Cn0KCi5tanItd2dtLXByZXZpZXctZW1wdHkgewogICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4zNCk7CiAgICBmb250LXNpemU6IDExcHg7Cn0KCi5tanItd2dtLWNhbnZhcyB7CiAgICBkaXNwbGF5OiBibG9jazsKICAgIHdpZHRoOiAxMDAlOwogICAgaGVpZ2h0OiAxMDAlOwogICAgY3Vyc29yOiBncmFiOwogICAgdG91Y2gtYWN0aW9uOiBub25lOwp9CgoubWpyLXdnbS1jYW52YXM6YWN0aXZlIHsKICAgIGN1cnNvcjogZ3JhYmJpbmc7Cn0KCi5tanItd2dtLS1sYXJnZSB7CiAgICB3aWR0aDogMTAwJTsKICAgIGhlaWdodDogMTAwJTsKICAgIG1pbi1oZWlnaHQ6IDA7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIDAuMTgpOwp9CgoubWpyLXdnbS0tbGFyZ2UgLm1qci13Z20tbWFwLXdyYXAgewogICAgZmxleDogMTsKICAgIGhlaWdodDogYXV0bzsKICAgIG1pbi1oZWlnaHQ6IDA7CiAgICBtYXJnaW46IDA7CiAgICBib3JkZXI6IG5vbmU7CiAgICBib3JkZXItcmFkaXVzOiAwOwp9CgoubWpyLXdnbS0tbGFyZ2UgLm1qci13Z20tc3RhdHVzIHsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIGxlZnQ6IDEwcHg7CiAgICB0b3A6IDEwcHg7CiAgICB6LWluZGV4OiAyOwogICAgbWF4LXdpZHRoOiBtaW4oNDIwcHgsIGNhbGMoMTAwJSAtIDIwcHgpKTsKICAgIHBhZGRpbmc6IDVweCA4cHg7CiAgICBib3JkZXItcmFkaXVzOiA1cHg7CiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTIpOwogICAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjUyKTsKICAgIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNzQpOwogICAgYmFja2Ryb3AtZmlsdGVyOiBibHVyKDhweCk7Cn0KCi5tanItd2dtLXRvb2xiYXIgewogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgbGVmdDogMTBweDsKICAgIHRvcDogNDZweDsKICAgIHotaW5kZXg6IDI7CiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgIGdhcDogNnB4OwogICAgbWF4LXdpZHRoOiBtaW4oNDIwcHgsIGNhbGMoMTAwJSAtIDIwcHgpKTsKfQoKLm1qci13Z20tbW9kZSB7CiAgICBtaW4taGVpZ2h0OiAyNnB4OwogICAgcGFkZGluZzogM3B4IDhweDsKICAgIGJvcmRlci1yYWRpdXM6IDk5OXB4OwogICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEyKTsKICAgIGJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgMC41KTsKICAgIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNzIpOwogICAgZm9udC1zaXplOiAxMHB4OwogICAgY3Vyc29yOiBwb2ludGVyOwp9CgoubWpyLXdnbS1tb2RlOmhvdmVyIHsKICAgIGJvcmRlci1jb2xvcjogcmdiYSgxNDksIDE4MywgMjU1LCAwLjQ1KTsKICAgIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuOSk7Cn0KCi5tanItd2dtLW1vZGUuaXMtYWN0aXZlIHsKICAgIGJvcmRlci1jb2xvcjogcmdiYSgxMjQsIDE4NiwgMjU1LCAwLjYyKTsKICAgIGJhY2tncm91bmQ6IHJnYmEoNzksIDEyMywgMjE0LCAwLjI2KTsKICAgIGNvbG9yOiByZ2JhKDIzNSwgMjQ1LCAyNTUsIDAuOTYpOwp9CgoubWpyLXdnbS0tbGFyZ2UgLm1qci13Z20tZGV0YWlscyB7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICByaWdodDogMTBweDsKICAgIHRvcDogMTBweDsKICAgIGJvdHRvbTogMTBweDsKICAgIHotaW5kZXg6IDI7CiAgICB3aWR0aDogbWluKDMyMHB4LCAzOCUpOwogICAgb3ZlcmZsb3cteTogYXV0bzsKICAgIHBhZGRpbmc6IDEwcHg7CiAgICBib3JkZXItcmFkaXVzOiA2cHg7CiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTIpOwogICAgYmFja2dyb3VuZDogcmdiYSgxOCwgMjAsIDI2LCAwLjg0KTsKICAgIGJhY2tkcm9wLWZpbHRlcjogYmx1cigxMHB4KTsKfQoKLm1qci13Z20tLWxhcmdlIC5tanItd2dtLWFjdGlvbiB7CiAgICBtaW4taGVpZ2h0OiAzMHB4Owp9CgoubWpyLXdnbS0tbGFyZ2UgLm1qci13Z20tcGFyYW0gewogICAgZm9udC1zaXplOiAxMXB4Owp9CgoubWpyLXdnbS1zdGF0dXMgewogICAgcGFkZGluZzogMCAxMHB4IDhweDsKICAgIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNDIpOwogICAgZm9udC1zaXplOiAxMHB4OwogICAgbGluZS1oZWlnaHQ6IDEuMzU7Cn0KCi5tanItd2dtLWRldGFpbHMgewogICAgZGlzcGxheTogZmxleDsKICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICBnYXA6IDZweDsKICAgIHBhZGRpbmc6IDAgOHB4IDEwcHg7Cn0KCi5tanItd2dtLW5vZGUtdGl0bGUgewogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgIGZvbnQtc2l6ZTogMTJweDsKICAgIGZvbnQtd2VpZ2h0OiA3MDA7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjkpOwp9CgoubWpyLXdnbS1ub2RlLW1ldGEgewogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgIG1hcmdpbi10b3A6IC00cHg7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjQyKTsKICAgIGZvbnQtc2l6ZTogMTBweDsKfQoKLm1qci13Z20tYnJlYWRjcnVtYiB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogNXB4OwogICAgbWluLXdpZHRoOiAwOwogICAgbWFyZ2luOiAtMnB4IDAgMnB4OwogICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC41OCk7CiAgICBmb250LXNpemU6IDExcHg7Cn0KCi5tanItd2dtLWJyZWFkY3J1bWItaXRlbSB7CiAgICBtaW4td2lkdGg6IDA7CiAgICBtYXgtd2lkdGg6IDE0MHB4OwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKfQoKLm1qci13Z20tYnJlYWRjcnVtYi1zZXAgewogICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4zMik7Cn0KCi5tanItd2dtLWFjdGlvbnMgewogICAgZGlzcGxheTogZ3JpZDsKICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogMWZyOwogICAgZ2FwOiA0cHg7Cn0KCi5tanItd2dtLWFjdGlvbiB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogN3B4OwogICAgbWluLWhlaWdodDogMjhweDsKICAgIHBhZGRpbmc6IDVweCA4cHg7CiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTIpOwogICAgYm9yZGVyLXJhZGl1czogNXB4OwogICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA0KTsKICAgIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNzYpOwogICAgZm9udC1zaXplOiAxMXB4OwogICAgY3Vyc29yOiBwb2ludGVyOwp9CgoubWpyLXdnbS1hY3Rpb246aG92ZXIgewogICAgYm9yZGVyLWNvbG9yOiByZ2JhKDk5LCAxNTUsIDI1NSwgMC40NSk7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDk5LCAxNTUsIDI1NSwgMC4xMik7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjkyKTsKfQoKLm1qci13Z20tYWN0aW9uLmlzLW9rIHsKICAgIGJvcmRlci1jb2xvcjogcmdiYSg3NiwgMTc1LCA4MCwgMC41NSk7CiAgICBjb2xvcjogcmdiYSgxOTAsIDI1NSwgMTk2LCAwLjk2KTsKfQoKLm1qci13Z20tcGFyYW1zIHsKICAgIGRpc3BsYXk6IGdyaWQ7CiAgICBnYXA6IDRweDsKICAgIG1hcmdpbi10b3A6IDJweDsKfQoKLm1qci13Z20tcGFyYW0gewogICAgZGlzcGxheTogZ3JpZDsKICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogbWlubWF4KDY0cHgsIDAuNDJmcikgbWlubWF4KDAsIDFmcik7CiAgICBnYXA6IDhweDsKICAgIHBhZGRpbmc6IDVweCA3cHg7CiAgICBib3JkZXItcmFkaXVzOiA0cHg7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIDAuMTgpOwogICAgZm9udC1zaXplOiAxMHB4OwogICAgbGluZS1oZWlnaHQ6IDEuMzU7CiAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICBib3JkZXI6IDFweCBzb2xpZCB0cmFuc3BhcmVudDsKICAgIHRyYW5zaXRpb246CiAgICAgICAgYmFja2dyb3VuZCAxMjBtcyBlYXNlLAogICAgICAgIGJvcmRlci1jb2xvciAxMjBtcyBlYXNlOwp9CgoubWpyLXdnbS1wYXJhbTpob3ZlciwKLm1qci13Z20tcGFyYW06Zm9jdXMtdmlzaWJsZSB7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDgpOwogICAgYm9yZGVyLWNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTgpOwogICAgb3V0bGluZTogbm9uZTsKfQoKLm1qci13Z20tcGFyYW0uaXMtb2sgewogICAgYm9yZGVyLWNvbG9yOiByZ2JhKDc5LCAyMTAsIDEyNSwgMC43KTsKICAgIGJhY2tncm91bmQ6IHJnYmEoNzksIDIxMCwgMTI1LCAwLjE2KTsKfQoKLm1qci13Z20tcGFyYW0uaXMtZXJyb3IgewogICAgYm9yZGVyLWNvbG9yOiByZ2JhKDI1NSwgOTAsIDkwLCAwLjcpOwogICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDkwLCA5MCwgMC4xNik7Cn0KCi5tanItd2dtLXBhcmFtLWtleSB7CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7CiAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC40OCk7Cn0KCi5tanItd2dtLXBhcmFtLXZhbHVlIHsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjgyKTsKfQoKLm1qci13Z20tbm9kZS12aXN1YWwgewogICAgLS1tanItd2dtLW5vZGUtYWNjZW50OiByZ2JhKDExNSwgMTU1LCAyNTUsIDAuODgpOwogICAgLS1tanItd2dtLW5vZGUtYWNjZW50LXNvZnQ6IHJnYmEoMTE1LCAxNTUsIDI1NSwgMC4yMik7CiAgICBkaXNwbGF5OiBncmlkOwogICAgZ2FwOiA4cHg7CiAgICBtYXJnaW4tdG9wOiAycHg7CiAgICBwYWRkaW5nOiA4cHg7CiAgICBib3JkZXItcmFkaXVzOiA2cHg7CiAgICBib3JkZXI6IDFweCBzb2xpZCBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXdnbS1ub2RlLWFjY2VudCkgMzQlLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMSkpOwogICAgYm94LXNoYWRvdzoKICAgICAgICBpbnNldCAwIDFweCAwIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wOCksCiAgICAgICAgMCAxMHB4IDI0cHggcmdiYSgwLCAwLCAwLCAwLjI0KTsKICAgIGJhY2tncm91bmQ6CiAgICAgICAgbGluZWFyLWdyYWRpZW50KDE4MGRlZywgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci13Z20tbm9kZS1hY2NlbnQtc29mdCkgMTAwJSwgdHJhbnNwYXJlbnQpLCByZ2JhKDQ0LCA1NiwgODgsIDAuMikpLAogICAgICAgIHJnYmEoMTMsIDE2LCAyNCwgMC44NSk7Cn0KCi5tanItd2dtLW5vZGUtdmlzdWFsOjpiZWZvcmUgewogICAgY29udGVudDogIiI7CiAgICBkaXNwbGF5OiBibG9jazsKICAgIGhlaWdodDogMnB4OwogICAgbWFyZ2luOiAtOHB4IC04cHggNnB4OwogICAgYm9yZGVyLXJhZGl1czogNnB4IDZweCAwIDA7CiAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoOTBkZWcsIHZhcigtLW1qci13Z20tbm9kZS1hY2NlbnQpLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTIpKTsKfQoKLm1qci13Z20tbm9kZS12aXN1YWwuaXMtbW9kZWwgewogICAgLS1tanItd2dtLW5vZGUtYWNjZW50OiByZ2JhKDEyNCwgMTg2LCAyNTUsIDAuOSk7CiAgICAtLW1qci13Z20tbm9kZS1hY2NlbnQtc29mdDogcmdiYSg3MCwgMTIzLCAxODEsIDAuMzQpOwp9CgoubWpyLXdnbS1ub2RlLXZpc3VhbC5pcy1zYW1wbGVyIHsKICAgIC0tbWpyLXdnbS1ub2RlLWFjY2VudDogcmdiYSgxNDMsIDIyOCwgMTY3LCAwLjkpOwogICAgLS1tanItd2dtLW5vZGUtYWNjZW50LXNvZnQ6IHJnYmEoNjQsIDEzMywgODgsIDAuMzQpOwp9CgoubWpyLXdnbS1ub2RlLXZpc3VhbC5pcy10ZXh0IHsKICAgIC0tbWpyLXdnbS1ub2RlLWFjY2VudDogcmdiYSgyNTUsIDE5MiwgMTE0LCAwLjkpOwogICAgLS1tanItd2dtLW5vZGUtYWNjZW50LXNvZnQ6IHJnYmEoMTU0LCAxMDIsIDQ5LCAwLjM0KTsKfQoKLm1qci13Z20tbm9kZS12aXN1YWwuaXMtbWVkaWEgewogICAgLS1tanItd2dtLW5vZGUtYWNjZW50OiByZ2JhKDE1NCwgMTcwLCAyNTUsIDAuOSk7CiAgICAtLW1qci13Z20tbm9kZS1hY2NlbnQtc29mdDogcmdiYSg4MywgOTMsIDE2NSwgMC4zNCk7Cn0KCi5tanItd2dtLW5vZGUtdmlzdWFsLmlzLWNvbnRyb2wgewogICAgLS1tanItd2dtLW5vZGUtYWNjZW50OiByZ2JhKDI1NSwgMTM5LCAxNjksIDAuOSk7CiAgICAtLW1qci13Z20tbm9kZS1hY2NlbnQtc29mdDogcmdiYSgxNDUsIDcwLCA5NSwgMC4zNCk7Cn0KCi5tanItd2dtLW5vZGUtdmlzdWFsLmlzLWxvZ2ljIHsKICAgIC0tbWpyLXdnbS1ub2RlLWFjY2VudDogcmdiYSgxODgsIDE2OCwgMjU1LCAwLjkpOwogICAgLS1tanItd2dtLW5vZGUtYWNjZW50LXNvZnQ6IHJnYmEoMTA1LCA4NiwgMTUzLCAwLjM0KTsKfQoKLm1qci13Z20tbm9kZS12aXN1YWwtaGVhZGVyIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOwogICAgZ2FwOiA4cHg7CiAgICBwYWRkaW5nLWJvdHRvbTogNnB4OwogICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItd2dtLW5vZGUtYWNjZW50KSAyNSUsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xNCkpOwp9CgoubWpyLXdnbS1ub2RlLXZpc3VhbC10eXBlIHsKICAgIGZvbnQtc2l6ZTogMTFweDsKICAgIGZvbnQtd2VpZ2h0OiA3MDA7CiAgICBjb2xvcjogcmdiYSgyMzYsIDI0NCwgMjU1LCAwLjk0KTsKICAgIHRleHQtc2hhZG93OiAwIDFweCAwIHJnYmEoMCwgMCwgMCwgMC4zNSk7Cn0KCi5tanItd2dtLW5vZGUtdmlzdWFsLWlkIHsKICAgIGZvbnQtc2l6ZTogMTBweDsKICAgIGNvbG9yOiByZ2JhKDE5NCwgMjEzLCAyNTUsIDAuNzgpOwp9CgoubWpyLXdnbS1ub2RlLXBvcnRzIHsKICAgIGRpc3BsYXk6IGdyaWQ7CiAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IDFmciAxZnI7CiAgICBnYXA6IDhweDsKfQoKLm1qci13Z20tbm9kZS1wb3J0cy1jb2wgewogICAgbWluLXdpZHRoOiAwOwp9CgoubWpyLXdnbS1ub2RlLXBvcnRzLXRpdGxlIHsKICAgIG1hcmdpbi1ib3R0b206IDRweDsKICAgIGZvbnQtc2l6ZTogMTBweDsKICAgIGxldHRlci1zcGFjaW5nOiAwLjAyZW07CiAgICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOwogICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC40NSk7Cn0KCi5tanItd2dtLW5vZGUtcG9ydHMtbGlzdCB7CiAgICBkaXNwbGF5OiBncmlkOwogICAgZ2FwOiAzcHg7Cn0KCi5tanItd2dtLW5vZGUtcG9ydCwKLm1qci13Z20tbm9kZS1wb3J0LWVtcHR5IHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiA2cHg7CiAgICBtaW4taGVpZ2h0OiAxOHB4OwogICAgcGFkZGluZzogMnB4IDZweDsKICAgIGJvcmRlci1yYWRpdXM6IDRweDsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wNik7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIDAuMjQpOwp9CgoubWpyLXdnbS1ub2RlLXBvcnQtZW1wdHkgewogICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4yNik7Cn0KCi5tanItd2dtLW5vZGUtcG9ydC1kb3QgewogICAgd2lkdGg6IDhweDsKICAgIGhlaWdodDogOHB4OwogICAgYm9yZGVyLXJhZGl1czogOTk5cHg7CiAgICBmbGV4OiAwIDAgYXV0bzsKICAgIGJveC1zaGFkb3c6IDAgMCAwIDFweCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTgpIGluc2V0Owp9CgoubWpyLXdnbS1ub2RlLXBvcnQtZG90LmlzLWluIHsKICAgIGJhY2tncm91bmQ6IHJnYmEoMTM1LCAxOTYsIDI1NSwgMC45KTsKfQoKLm1qci13Z20tbm9kZS1wb3J0LWRvdC5pcy1vdXQgewogICAgYmFja2dyb3VuZDogcmdiYSgxNDQsIDIzOCwgMTc0LCAwLjkpOwp9CgoubWpyLXdnbS1ub2RlLXBvcnQtbmFtZSB7CiAgICBmbGV4OiAxOwogICAgbWluLXdpZHRoOiAwOwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgIGZvbnQtc2l6ZTogMTBweDsKICAgIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNzgpOwp9CgoubWpyLXdnbS1ub2RlLXBvcnQtdHlwZSB7CiAgICBmbGV4OiAwIDAgYXV0bzsKICAgIG1heC13aWR0aDogNDUlOwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgIGZvbnQtc2l6ZTogOXB4OwogICAgbGV0dGVyLXNwYWNpbmc6IDAuMDJlbTsKICAgIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7CiAgICBwYWRkaW5nOiAxcHggNXB4OwogICAgYm9yZGVyLXJhZGl1czogOTk5cHg7CiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTQpOwogICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA4KTsKICAgIGNvbG9yOiByZ2JhKDIyNCwgMjM2LCAyNTUsIDAuOSk7Cn0KCi5tanItd2dtLW5vZGUtd2lkZ2V0cyB7CiAgICBkaXNwbGF5OiBncmlkOwogICAgZ2FwOiA0cHg7Cn0KCi5tanItd2dtLW5vZGUtd2lkZ2V0cy10aXRsZSB7CiAgICBtYXJnaW4tYm90dG9tOiAycHg7CiAgICBmb250LXNpemU6IDEwcHg7CiAgICBsZXR0ZXItc3BhY2luZzogMC4wMmVtOwogICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKICAgIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNDUpOwp9CgoubWpyLXdnbS1ub2RlLXdpZGdldCwKLm1qci13Z20tbm9kZS13aWRnZXQtZW1wdHkgewogICAgZGlzcGxheTogZ3JpZDsKICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogbWlubWF4KDcwcHgsIDAuNDJmcikgbWlubWF4KDAsIDFmcik7CiAgICBnYXA6IDhweDsKICAgIHBhZGRpbmc6IDRweCA2cHg7CiAgICBib3JkZXItcmFkaXVzOiA0cHg7CiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDYpOwogICAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjIpOwp9CgoubWpyLXdnbS1ub2RlLXdpZGdldCB7CiAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICB0cmFuc2l0aW9uOgogICAgICAgIGJhY2tncm91bmQgMTIwbXMgZWFzZSwKICAgICAgICBib3JkZXItY29sb3IgMTIwbXMgZWFzZTsKfQoKLm1qci13Z20tbm9kZS13aWRnZXQ6aG92ZXIsCi5tanItd2dtLW5vZGUtd2lkZ2V0OmZvY3VzLXZpc2libGUgewogICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA5KTsKICAgIGJvcmRlci1jb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjIpOwogICAgb3V0bGluZTogbm9uZTsKfQoKLm1qci13Z20tbm9kZS13aWRnZXQuaXMtb2sgewogICAgYm9yZGVyLWNvbG9yOiByZ2JhKDc5LCAyMTAsIDEyNSwgMC43KTsKICAgIGJhY2tncm91bmQ6IHJnYmEoNzksIDIxMCwgMTI1LCAwLjE2KTsKfQoKLm1qci13Z20tbm9kZS13aWRnZXQuaXMtZXJyb3IgewogICAgYm9yZGVyLWNvbG9yOiByZ2JhKDI1NSwgOTAsIDkwLCAwLjcpOwogICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDkwLCA5MCwgMC4xNik7Cn0KCi5tanItd2dtLW5vZGUtd2lkZ2V0LWVtcHR5IHsKICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogMWZyOwogICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4zNCk7Cn0KCi5tanItd2dtLW5vZGUtd2lkZ2V0LWtleSB7CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7CiAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgZm9udC1zaXplOiAxMHB4OwogICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC41Mik7Cn0KCi5tanItd2dtLW5vZGUtd2lkZ2V0LXZhbHVlIHsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICBmb250LXNpemU6IDEwcHg7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjg4KTsKfQoKLm1qci13Z20tbm9kZS13aWRnZXQuaXMtbXVsdGlsaW5lIHsKICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogMWZyOwogICAgYWxpZ24taXRlbXM6IHN0YXJ0OwogICAgZ2FwOiA0cHg7Cn0KCi5tanItd2dtLW5vZGUtd2lkZ2V0LmlzLW11bHRpbGluZSAubWpyLXdnbS1ub2RlLXdpZGdldC1rZXkgewogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKfQoKLm1qci13Z20tbm9kZS13aWRnZXQuaXMtbXVsdGlsaW5lIC5tanItd2dtLW5vZGUtd2lkZ2V0LXZhbHVlIHsKICAgIHdoaXRlLXNwYWNlOiBwcmUtd3JhcDsKICAgIHdvcmQtYnJlYWs6IGJyZWFrLXdvcmQ7CiAgICBvdmVyZmxvdy13cmFwOiBhbnl3aGVyZTsKICAgIGxpbmUtaGVpZ2h0OiAxLjM1OwogICAgbWF4LWhlaWdodDogOS4yZW07CiAgICBvdmVyZmxvdy15OiBhdXRvOwogICAgcGFkZGluZy1yaWdodDogMnB4Owp9CgoubWpyLXdnbS1ub2RlLXdpZGdldC5pcy1tdWx0aWxpbmUuaXMtdGV4dC1maWVsZCAubWpyLXdnbS1ub2RlLXdpZGdldC12YWx1ZSB7CiAgICBtYXgtaGVpZ2h0OiAxNmVtOwogICAgbGluZS1oZWlnaHQ6IDEuNDsKfQoKLm1qci13Z20tbm9kZS13aWRnZXQtbW9yZSB7CiAgICBmb250LXNpemU6IDEwcHg7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjQ2KTsKICAgIHRleHQtYWxpZ246IHJpZ2h0Owp9CgpAbWVkaWEgKG1heC13aWR0aDogODIwcHgpIHsKICAgIC5tanItd2dtLS1sYXJnZSAubWpyLXdnbS1kZXRhaWxzIHsKICAgICAgICB3aWR0aDogbWluKDM4MHB4LCBjYWxjKDEwMCUgLSAyMHB4KSk7CiAgICB9CgogICAgLm1qci13Z20tbm9kZS1wb3J0cyB7CiAgICAgICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiAxZnI7CiAgICB9Cn0KCi5tanItd3Mtc2VhcmNoLXdyYXAgewogICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBmbGV4LXNocmluazogMDsKICAgIHBhZGRpbmc6IDZweCA4cHg7CiAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgdmFyKC0tbWpyLWJvcmRlciwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEyKSk7Cn0KCi5tanItd3Mtc2VhcmNoLWljb24gewogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgbGVmdDogMTZweDsKICAgIGZvbnQtc2l6ZTogMTFweDsKICAgIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMyk7CiAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKfQoKLm1qci13cy1zZWFyY2ggewogICAgZmxleDogMTsKICAgIHBhZGRpbmc6IDRweCAyOHB4IDRweCAyNnB4OwogICAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjM1KTsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xMik7CiAgICBib3JkZXItcmFkaXVzOiA0cHg7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjg1KTsKICAgIGZvbnQtc2l6ZTogMTFweDsKICAgIG91dGxpbmU6IG5vbmU7Cn0KCi5tanItd3Mtc2VhcmNoOjpwbGFjZWhvbGRlciB7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjI4KTsKfQoKLm1qci13cy1zZWFyY2g6Zm9jdXMgewogICAgYm9yZGVyLWNvbG9yOiByZ2JhKDk5LCAxNTUsIDI1NSwgMC41KTsKfQoKLm1qci13cy1zZWFyY2gtY2xlYXIgewogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgcmlnaHQ6IDE0cHg7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgd2lkdGg6IDE4cHg7CiAgICBoZWlnaHQ6IDE4cHg7CiAgICBwYWRkaW5nOiAwOwogICAgYm9yZGVyOiBub25lOwogICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjMpOwogICAgZm9udC1zaXplOiAxMHB4OwogICAgY3Vyc29yOiBwb2ludGVyOwogICAgYm9yZGVyLXJhZGl1czogM3B4Owp9CgoubWpyLXdzLXNlYXJjaC1jbGVhcjpob3ZlciB7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjcpOwogICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA4KTsKfQoKLm1qci13cy1ub2Rlcy1saXN0IHsKICAgIGZsZXg6IDE7CiAgICBvdmVyZmxvdy15OiBhdXRvOwogICAgcGFkZGluZzogNHB4IDA7Cn0KCi5tanItd3Mtbm9kZS1yb3cgewogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBnYXA6IDZweDsKICAgIHBhZGRpbmc6IDVweCAxMHB4IDVweCAxMnB4OwogICAgY3Vyc29yOiBwb2ludGVyOwogICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wNSk7CiAgICBtaW4taGVpZ2h0OiAzMnB4OwogICAgdHJhbnNpdGlvbjogYmFja2dyb3VuZCAwLjFzOwp9CgoubWpyLXdzLW5vZGUtcm93OmhvdmVyIHsKICAgIGJhY2tncm91bmQ6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wNik7Cn0KCi5tanItd3Mtbm9kZS1yb3ctdHlwZSB7CiAgICBmbGV4OiAxOwogICAgZm9udC1zaXplOiAxMXB4OwogICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC43OCk7CiAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwp9CgoubWpyLXdzLW5vZGUtcm93LXRpdGxlIHsKICAgIGZvbnQtc2l6ZTogMTBweDsKICAgIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNCk7CiAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwogICAgbWF4LXdpZHRoOiA4MHB4OwogICAgZmxleC1zaHJpbms6IDA7Cn0KCi5tanItd3Mtbm9kZS1sb2NhdGUgewogICAgZmxleC1zaHJpbms6IDA7CiAgICB3aWR0aDogMjJweDsKICAgIGhlaWdodDogMjJweDsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICBwYWRkaW5nOiAwOwogICAgYm9yZGVyOiBub25lOwogICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjMpOwogICAgZm9udC1zaXplOiAxMXB4OwogICAgYm9yZGVyLXJhZGl1czogM3B4OwogICAgY3Vyc29yOiBwb2ludGVyOwogICAgb3BhY2l0eTogMDsKICAgIHRyYW5zaXRpb246CiAgICAgICAgb3BhY2l0eSAwLjFzLAogICAgICAgIGNvbG9yIDAuMXMsCiAgICAgICAgYmFja2dyb3VuZCAwLjFzOwp9CgoubWpyLXdzLW5vZGUtcm93OmhvdmVyIC5tanItd3Mtbm9kZS1sb2NhdGUgewogICAgb3BhY2l0eTogMTsKfQoKLm1qci13cy1ub2RlLWxvY2F0ZTpob3ZlciB7CiAgICBjb2xvcjogIzYzOWJmZjsKICAgIGJhY2tncm91bmQ6IHJnYmEoOTksIDE1NSwgMjU1LCAwLjE1KTsKfQoKLyogLS0gTm9kZSBzZWN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLm1qci13cy10cmVlLWl0ZW0gewogICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHZhcigtLW1qci1ib3JkZXIsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xMikpOwp9Ci5tanItd3MtdHJlZS1pdGVtID4gLm1qci13cy1ub2RlIHsKICAgIGJvcmRlci1ib3R0b206IG5vbmU7Cn0KLm1qci13cy10cmVlLWl0ZW0tLXN1YmdyYXBoIHsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYWNjZW50LCAjNWI4YWYwKSA0JSwgdHJhbnNwYXJlbnQgOTYlKTsKfQoubWpyLXdzLW5vZGUgewogICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHZhcigtLW1qci1ib3JkZXIsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xMikpOwp9Ci8qIFN1YnRsZSBoaWdobGlnaHQgd2hlbiB0aGlzIG5vZGUgbWF0Y2hlcyB0aGUgY3VycmVudCBncmFwaCBzZWxlY3Rpb24uICovCi5tanItd3Mtbm9kZS5pcy1zZWxlY3RlZC1mcm9tLWdyYXBoIHsKICAgIGJhY2tncm91bmQ6IHJnYmEoMjU1LCAyMTAsIDkwLCAwLjA4KTsKICAgIGJveC1zaGFkb3c6IGluc2V0IDJweCAwIDAgMCByZ2JhKDI1NSwgMjEwLCA5MCwgMC43NSk7Cn0KLm1qci13cy1ub2RlLmlzLXNlbGVjdGVkLWZyb20tZ3JhcGggLm1qci13cy1ub2RlLWhlYWRlciB7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgI2ZmZDQ1YSAxOCUsIHZhcigtLW1qci1zdXJmYWNlLTEsICMyYTJhMmEpIDgyJSk7Cn0KLm1qci13cy1ub2RlLmlzLXNlbGVjdGVkLWZyb20tZ3JhcGggLm1qci13cy1ub2RlLXR5cGUgewogICAgY29sb3I6ICNmZmQ0NWE7Cn0KLm1qci13cy1ub2RlLmlzLXNlbGVjdGVkLWZyb20tZ3JhcGggLm1qci13cy1ub2RlLXRpdGxlIHsKICAgIGNvbG9yOiByZ2JhKDI1NSwgMjI0LCAxMzAsIDAuODgpOwp9Ci5tanItd3Mtbm9kZS5pcy1zZWxlY3RlZC1mcm9tLWdyYXBoIC5tanItd3Mtbm9kZS10b2dnbGUsCi5tanItd3Mtbm9kZS5pcy1zZWxlY3RlZC1mcm9tLWdyYXBoIC5tanItd3MtbG9jYXRlLAoubWpyLXdzLW5vZGUuaXMtc2VsZWN0ZWQtZnJvbS1ncmFwaCAubWpyLXdzLW5vZGUta2luZCB7CiAgICBjb2xvcjogI2ZmZDQ1YTsKfQoubWpyLXdzLXNpZGViYXItcmVzaXplciB7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICB0b3A6IDA7CiAgICBib3R0b206IDA7CiAgICB3aWR0aDogMTRweDsKICAgIHotaW5kZXg6IDI7CiAgICBjdXJzb3I6IGV3LXJlc2l6ZTsKICAgIHBvaW50ZXItZXZlbnRzOiBhdXRvOwp9CgoubWpyLXdzLXNpZGViYXItcmVzaXplcjo6YmVmb3JlIHsKICAgIGNvbnRlbnQ6ICIiOwogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgdG9wOiA1MCU7CiAgICBsZWZ0OiA1MCU7CiAgICB3aWR0aDogNHB4OwogICAgaGVpZ2h0OiA1NnB4OwogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTUwJSwgLTUwJSk7CiAgICBib3JkZXItcmFkaXVzOiA5OTlweDsKICAgIGJhY2tncm91bmQ6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xOCk7CiAgICBib3gtc2hhZG93OiAwIDAgMCAxcHggcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA2KTsKICAgIG9wYWNpdHk6IDA7CiAgICB0cmFuc2l0aW9uOgogICAgICAgIG9wYWNpdHkgMC4xNXMgZWFzZSwKICAgICAgICBiYWNrZ3JvdW5kIDAuMTVzIGVhc2U7Cn0KCi5tanItd3Mtc2lkZWJhci5vcGVuOmhvdmVyIC5tanItd3Mtc2lkZWJhci1yZXNpemVyOjpiZWZvcmUsCi5tanItd3Mtc2lkZWJhci5pcy1yZXNpemluZyAubWpyLXdzLXNpZGViYXItcmVzaXplcjo6YmVmb3JlLAoubWpyLXdzLXNpZGViYXItcmVzaXplci5pcy1kcmFnZ2luZzo6YmVmb3JlIHsKICAgIG9wYWNpdHk6IDE7Cn0KCi5tanItd3Mtc2lkZWJhci5pcy1yZXNpemluZyAubWpyLXdzLXNpZGViYXItcmVzaXplcjo6YmVmb3JlLAoubWpyLXdzLXNpZGViYXItcmVzaXplcjpob3Zlcjo6YmVmb3JlLAoubWpyLXdzLXNpZGViYXItcmVzaXplci5pcy1kcmFnZ2luZzo6YmVmb3JlIHsKICAgIGJhY2tncm91bmQ6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4zNCk7Cn0KCi5tanItbWZ2LWNvbnRlbnQtd3JhcHBlcltkYXRhLXNpZGViYXItcG9zPSJyaWdodCJdIC5tanItd3Mtc2lkZWJhci1yZXNpemVyIHsKICAgIHJpZ2h0OiAwOwp9CgoubWpyLW1mdi1jb250ZW50LXdyYXBwZXJbZGF0YS1zaWRlYmFyLXBvcz0ibGVmdCJdIC5tanItd3Mtc2lkZWJhci1yZXNpemVyIHsKICAgIGxlZnQ6IDA7Cn0KCi5tanItbWZ2LWNvbnRlbnQtd3JhcHBlcltkYXRhLXNpZGViYXItcG9zPSJib3R0b20iXSAubWpyLXdzLXNpZGViYXItcmVzaXplciB7CiAgICBkaXNwbGF5OiBub25lOwp9Ci5tanItd3Mtbm9kZS1oZWFkZXIgewogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBnYXA6IDhweDsKICAgIHBhZGRpbmc6IDZweCAxMHB4OwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KAogICAgICAgIGluIHNyZ2IsCiAgICAgICAgdmFyKC0tbWpyLXN1cmZhY2UtMCwgIzFlMWUxZSkgNDAlLAogICAgICAgIHZhcigtLW1qci1zdXJmYWNlLTEsICMyYTJhMmEpIDYwJQogICAgKTsKICAgIGN1cnNvcjogZGVmYXVsdDsKICAgIHVzZXItc2VsZWN0OiBub25lOwogICAgdHJhbnNpdGlvbjogYmFja2dyb3VuZCAwLjEycyBlYXNlOwp9Ci5tanItd3Mtbm9kZS5pcy1jb2xsYXBzaWJsZSAubWpyLXdzLW5vZGUtaGVhZGVyIHsKICAgIGN1cnNvcjogcG9pbnRlcjsKfQoubWpyLXdzLW5vZGUuaXMtY29sbGFwc2libGUgLm1qci13cy1ub2RlLWhlYWRlcjpob3ZlciB7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoCiAgICAgICAgaW4gc3JnYiwKICAgICAgICB2YXIoLS1tanItc3VyZmFjZS0wLCAjMWUxZTFlKSAyOCUsCiAgICAgICAgdmFyKC0tbWpyLXN1cmZhY2UtMSwgIzJhMmEyYSkgNzIlCiAgICApOwp9Ci5tanItd3Mtbm9kZS5pcy1jb2xsYXBzaWJsZS5pcy1jb2xsYXBzZWQgLm1qci13cy1ub2RlLWhlYWRlcjpob3ZlciB7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoCiAgICAgICAgaW4gc3JnYiwKICAgICAgICB2YXIoLS1tanItYWNjZW50LCAjNWI4YWYwKSA4JSwKICAgICAgICB2YXIoLS1tanItc3VyZmFjZS0xLCAjMmEyYTJhKSA5MiUKICAgICk7Cn0KLm1qci13cy1ub2RlLXRvZ2dsZSB7CiAgICBmbGV4OiAwIDAgYXV0bzsKfQoubWpyLXdzLW5vZGUtdGl0bGUtd3JhcCB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZmxleDogMTsKICAgIG1pbi13aWR0aDogMDsKICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICBnYXA6IDFweDsKfQoubWpyLXdzLW5vZGUtdHlwZSB7CiAgICBmb250LXdlaWdodDogNjAwOwogICAgZm9udC1zaXplOiAxMnB4OwogICAgY29sb3I6IHZhcigtLWNvbnRlbnQtZmcsICNkZGQpOwogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKfQoubWpyLXdzLW5vZGUtdGl0bGUgewogICAgZm9udC1zaXplOiAxMHB4OwogICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC40OCk7CiAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwp9Ci5tanItd3Mtbm9kZS1raW5kIHsKICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogNHB4OwogICAgZmxleDogMCAwIGF1dG87CiAgICBtYXgtd2lkdGg6IDExMHB4OwogICAgcGFkZGluZzogMnB4IDZweDsKICAgIGJvcmRlcjogMXB4IHNvbGlkIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYWNjZW50LCAjNWI4YWYwKSAzOCUsIHRyYW5zcGFyZW50IDYyJSk7CiAgICBib3JkZXItcmFkaXVzOiA5OTlweDsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYWNjZW50LCAjNWI4YWYwKSAxMiUsIHRyYW5zcGFyZW50IDg4JSk7CiAgICBjb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQsICM1YjhhZjApIDc4JSwgI2ZmZmZmZiAyMiUpOwogICAgZm9udC1zaXplOiAxMHB4OwogICAgZm9udC13ZWlnaHQ6IDcwMDsKICAgIGxpbmUtaGVpZ2h0OiAxLjI7CiAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwp9Ci5tanItd3Mtbm9kZS1raW5kIC5waSB7CiAgICBmb250LXNpemU6IDEwcHg7Cn0KLm1qci13cy1ub2RlLWtpbmQtY291bnQgewogICAgbWluLXdpZHRoOiAxNHB4OwogICAgcGFkZGluZzogMCAzcHg7CiAgICBib3JkZXItcmFkaXVzOiA5OTlweDsKICAgIGJhY2tncm91bmQ6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xMik7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjgyKTsKICAgIHRleHQtYWxpZ246IGNlbnRlcjsKfQoubWpyLXdzLW5vZGUuaXMtY29sbGFwc2VkIC5tanItd3Mtbm9kZS1ib2R5IHsKICAgIGRpc3BsYXk6IG5vbmU7Cn0KLm1qci13cy1ub2RlLWJvZHkgewogICAgZGlzcGxheTogZmxleDsKICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICBnYXA6IDRweDsKICAgIHBhZGRpbmc6IDZweCAxMHB4Owp9Ci5tanItd3Mtbm9kZS1lbXB0eSB7CiAgICBmb250LXNpemU6IDExcHg7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjMpOwogICAgcGFkZGluZzogNHB4IDA7Cn0KCi8qIC0tIE5lc3RlZCBub2RlcyAoaW5zaWRlIHN1YmdyYXBocykgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLm1qci13cy1ub2RlLS1uZXN0ZWQgewogICAgYm9yZGVyLWxlZnQ6IDJweCBzb2xpZCByZ2JhKDkxLCAxMzgsIDI0MCwgMC4zNSk7Cn0KLm1qci13cy1ub2RlLS1uZXN0ZWQgLm1qci13cy1ub2RlLWhlYWRlciB7CiAgICBwYWRkaW5nLWxlZnQ6IDE2cHg7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoCiAgICAgICAgaW4gc3JnYiwKICAgICAgICB2YXIoLS1tanItYWNjZW50LCAjNWI4YWYwKSA1JSwKICAgICAgICB2YXIoLS1tanItc3VyZmFjZS0xLCAjMmEyYTJhKSA5NSUKICAgICk7Cn0KLm1qci13cy1ub2RlLS1uZXN0ZWQuaXMtY29sbGFwc2libGUgLm1qci13cy1ub2RlLWhlYWRlcjpob3ZlciB7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoCiAgICAgICAgaW4gc3JnYiwKICAgICAgICB2YXIoLS1tanItYWNjZW50LCAjNWI4YWYwKSAxMCUsCiAgICAgICAgdmFyKC0tbWpyLXN1cmZhY2UtMSwgIzJhMmEyYSkgOTAlCiAgICApOwp9CgovKiAtLSBTdWJncmFwaCBjaGlsZHJlbiBncm91cCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoubWpyLXdzLWNoaWxkcmVuLXRvZ2dsZSB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogNnB4OwogICAgd2lkdGg6IDEwMCU7CiAgICBwYWRkaW5nOiA1cHggMTBweCA1cHggMjBweDsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peCgKICAgICAgICBpbiBzcmdiLAogICAgICAgIHZhcigtLW1qci1hY2NlbnQsICM1YjhhZjApIDYlLAogICAgICAgIHZhcigtLW1qci1zdXJmYWNlLTAsICMxZTFlMWUpIDk0JQogICAgKTsKICAgIGJvcmRlcjogbm9uZTsKICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCB2YXIoLS1tanItYm9yZGVyLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTIpKTsKICAgIGNvbG9yOiB2YXIoLS1tanItYWNjZW50LCAjNWI4YWYwKTsKICAgIGZvbnQtc2l6ZTogMTFweDsKICAgIGN1cnNvcjogcG9pbnRlcjsKICAgIHRleHQtYWxpZ246IGxlZnQ7CiAgICBvcGFjaXR5OiAwLjg7CiAgICB0cmFuc2l0aW9uOgogICAgICAgIG9wYWNpdHkgMC4xcyBlYXNlLAogICAgICAgIGJhY2tncm91bmQgMC4xcyBlYXNlOwp9Ci5tanItd3MtY2hpbGRyZW4tdG9nZ2xlLS1uZXN0ZWQgewogICAgcGFkZGluZy1sZWZ0OiAyOHB4Owp9Ci5tanItd3MtY2hpbGRyZW4tdG9nZ2xlOmhvdmVyIHsKICAgIG9wYWNpdHk6IDE7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoCiAgICAgICAgaW4gc3JnYiwKICAgICAgICB2YXIoLS1tanItYWNjZW50LCAjNWI4YWYwKSAxMiUsCiAgICAgICAgdmFyKC0tbWpyLXN1cmZhY2UtMCwgIzFlMWUxZSkgODglCiAgICApOwp9Ci5tanItd3MtY2hpbGRyZW4tdG9nZ2xlW2FyaWEtZXhwYW5kZWQ9InRydWUiXSB7CiAgICBvcGFjaXR5OiAxOwp9Ci5tanItd3MtY2hpbGRyZW4gewogICAgYm9yZGVyLWxlZnQ6IDJweCBzb2xpZCByZ2JhKDkxLCAxMzgsIDI0MCwgMC4yNSk7CiAgICBtYXJnaW4tbGVmdDogNnB4OwogICAgcGFkZGluZy1sZWZ0OiA2cHg7Cn0KCi5tanItd3Mtd2lkZ2V0LXJvdyB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGZsZXgtc3RhcnQ7CiAgICBnYXA6IDhweDsKfQoubWpyLXdzLXdpZGdldC1yb3ctLWJsb2NrIHsKICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICBnYXA6IDJweDsKfQoubWpyLXdzLXdpZGdldC1yb3ctLWJsb2NrIC5tanItd3Mtd2lkZ2V0LWxhYmVsIHsKICAgIGZsZXg6IG5vbmU7CiAgICBwYWRkaW5nLXRvcDogMDsKfQoubWpyLXdzLXdpZGdldC1yb3ctLWJsb2NrIC5tanItd3Mtd2lkZ2V0LWlucHV0IHsKICAgIHdpZHRoOiAxMDAlOwp9Ci5tanItd3Mtd2lkZ2V0LWxhYmVsIHsKICAgIGZsZXg6IDAgMCA4MHB4OwogICAgZm9udC1zaXplOiAxMXB4OwogICAgY29sb3I6IHZhcigtLWRlc2NyaXAtdGV4dCwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjU1KSk7CiAgICBwYWRkaW5nLXRvcDogNXB4OwogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKfQoubWpyLXdzLXdpZGdldC1pbnB1dCB7CiAgICBmbGV4OiAxOwogICAgbWluLXdpZHRoOiAwOwp9Ci5tanItd3MtaW5wdXQgewogICAgd2lkdGg6IDEwMCU7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1jb21meS1pbnB1dC1iZywgIzIyMik7CiAgICBjb2xvcjogdmFyKC0taW5wdXQtdGV4dCwgI2RkZCk7CiAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1tanItYm9yZGVyLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTIpKTsKICAgIGJvcmRlci1yYWRpdXM6IDRweDsKICAgIHBhZGRpbmc6IDRweCA2cHg7CiAgICBmb250LXNpemU6IDEycHg7CiAgICBmb250LWZhbWlseTogaW5oZXJpdDsKICAgIG91dGxpbmU6IG5vbmU7CiAgICB0cmFuc2l0aW9uOiBib3JkZXItY29sb3IgMTIwbXMgZWFzZTsKfQoubWpyLXdzLWlucHV0OmZvY3VzIHsKICAgIGJvcmRlci1jb2xvcjogdmFyKC0tbWpyLWFjY2VudCwgIzVmYjNmZik7Cn0KLm1qci13cy10ZXh0YXJlYSB7CiAgICByZXNpemU6IG5vbmU7CiAgICBtaW4taGVpZ2h0OiAyOHB4OwogICAgbGluZS1oZWlnaHQ6IDEuNDsKICAgIG92ZXJmbG93LXk6IGhpZGRlbjsKfQoubWpyLXdzLXRleHQtd3JhcHBlciB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgIGdhcDogMnB4OwogICAgZmxleDogMTsKICAgIG1pbi13aWR0aDogMDsKfQoubWpyLXdzLXRleHQtd3JhcHBlciAubWpyLXdzLXRleHRhcmVhIHsKICAgIHdpZHRoOiAxMDAlOwp9Ci5tanItd3MtZXhwYW5kLWJ0biB7CiAgICBhbGlnbi1zZWxmOiBmbGV4LWVuZDsKICAgIGJhY2tncm91bmQ6IG5vbmU7CiAgICBib3JkZXI6IG5vbmU7CiAgICBjb2xvcjogdmFyKC0tbWpyLWFjY2VudCwgIzVmYjNmZik7CiAgICBmb250LXNpemU6IDEwcHg7CiAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICBwYWRkaW5nOiAwIDRweDsKICAgIG9wYWNpdHk6IDAuODsKfQoubWpyLXdzLWV4cGFuZC1idG46aG92ZXIgewogICAgb3BhY2l0eTogMTsKICAgIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOwp9Ci5tanItd3MtcmVhZG9ubHkgewogICAgb3BhY2l0eTogMC41OwogICAgY3Vyc29yOiBkZWZhdWx0Owp9Ci5tanItd3MtY2hlY2tib3ggewogICAgYWNjZW50LWNvbG9yOiB2YXIoLS1tanItYWNjZW50LCAjNWZiM2ZmKTsKICAgIHdpZHRoOiAxNnB4OwogICAgaGVpZ2h0OiAxNnB4OwogICAgbWFyZ2luLXRvcDogNHB4Owp9Ci5tanItd3MtdG9nZ2xlLWxhYmVsIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwp9CgovKiAtLSBMb2NhdGUgYnV0dG9uIGluc2lkZSBub2RlIGhlYWRlciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoubWpyLXdzLWxvY2F0ZSB7CiAgICB3aWR0aDogMjRweCAhaW1wb3J0YW50OwogICAgaGVpZ2h0OiAyNHB4ICFpbXBvcnRhbnQ7CiAgICBib3JkZXI6IG5vbmUgIWltcG9ydGFudDsKICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50ICFpbXBvcnRhbnQ7CiAgICBvcGFjaXR5OiAwLjU7Cn0KLm1qci13cy1sb2NhdGU6aG92ZXIgewogICAgb3BhY2l0eTogMTsKfQoKLyogLS0gUnVuIGJ1dHRvbiBzdGF0ZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLm1qci1tZnYtcnVuLWNvbnRyb2xzIHsKICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogNHB4Owp9Ci5tanItbWZ2LXJ1bi1idG4gLnBpIHsKICAgIGNvbG9yOiB2YXIoLS1tanItc3RhdHVzLXN1Y2Nlc3MsICM0Y2FmNTApOwp9Ci5tanItbWZ2LXJ1bi1idG4ucnVubmluZyAucGkgewogICAgY29sb3I6IHZhcigtLW1qci1tdXRlZCwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjY1KSk7Cn0KLm1qci1tZnYtcnVuLWJ0bi5zdG9wcGluZyAucGkgewogICAgY29sb3I6IHZhcigtLW1qci1zdGF0dXMtd2FybmluZywgI2ZmYTcyNik7Cn0KLm1qci1tZnYtcnVuLWJ0bi5lcnJvciAucGkgewogICAgY29sb3I6ICNmNDQzMzY7Cn0KCi5tanItbWZ2LXN0b3AtYnRuIC5waSB7CiAgICBjb2xvcjogI2VmNTM1MDsKfQoubWpyLW1mdi1zdG9wLWJ0bi5hY3RpdmUgLnBpIHsKICAgIGNvbG9yOiAjZmY4YTY1Owp9Ci5tanItbWZ2LXN0b3AtYnRuLnN0b3BwaW5nIC5waSB7CiAgICBjb2xvcjogdmFyKC0tbWpyLXN0YXR1cy13YXJuaW5nLCAjZmZhNzI2KTsKfQoKLyogLS0gRmxvYXRpbmcgVmlld2VyIHNpbXBsZSB2aWRlbyBwbGF5ZXIgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoubWpyLW1mdi1zaW1wbGUtcGxheWVyIHsKICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgIHdpZHRoOiAxMDAlOwogICAgaGVpZ2h0OiAxMDAlOwogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgIG92ZXJmbG93OiBoaWRkZW47Cn0KCi5tanItbWZ2LXNpbXBsZS1wbGF5ZXIuaXMtYXVkaW8gewogICAgYmFja2dyb3VuZDogcmFkaWFsLWdyYWRpZW50KGNpcmNsZSBhdCAyMCUgMjAlLCByZ2JhKDk1LCAxNzksIDI1NSwgMC4yKSwgcmdiYSgxOCwgMjAsIDI4LCAwLjk1KSk7Cn0KCi5tanItbWZ2LXNpbXBsZS1wbGF5ZXItYXVkaW8tYmFja2Ryb3AgewogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgaW5zZXQ6IDA7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC45KTsKICAgIGZvbnQtc2l6ZTogMTNweDsKICAgIGZvbnQtd2VpZ2h0OiA2MDA7CiAgICBsZXR0ZXItc3BhY2luZzogMC4ycHg7CiAgICB0ZXh0LXNoYWRvdzogMCAycHggMTJweCByZ2JhKDAsIDAsIDAsIDAuNDUpOwogICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICBwYWRkaW5nOiAxOHB4OwogICAgdGV4dC1hbGlnbjogY2VudGVyOwp9CgoubWpyLW1mdi1zaW1wbGUtcGxheWVyLWNvbnRyb2xzIHsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIGxlZnQ6IDEycHg7CiAgICByaWdodDogMTJweDsKICAgIGJvdHRvbTogMTJweDsKICAgIHotaW5kZXg6IDMwOwogICAgZGlzcGxheTogZmxleDsKICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICBnYXA6IDhweDsKICAgIHBhZGRpbmc6IDlweCAxMHB4OwogICAgYm9yZGVyLXJhZGl1czogMTRweDsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xNik7CiAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQodG8gdG9wLCByZ2JhKDEwLCAxMCwgMTQsIDAuNzYpLCByZ2JhKDE2LCAxNiwgMjQsIDAuNTUpKTsKICAgIGJhY2tkcm9wLWZpbHRlcjogYmx1cigxMHB4KTsKICAgIC13ZWJraXQtYmFja2Ryb3AtZmlsdGVyOiBibHVyKDEwcHgpOwogICAgcG9pbnRlci1ldmVudHM6IGF1dG87Cn0KCi5tanItbWZ2LXNpbXBsZS1wbGF5ZXItcm93IHsKICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogOHB4Owp9CgoubWpyLW1mdi1zaW1wbGUtcGxheWVyLXNlZWsgewogICAgLS1tanItc2Vlay1wY3Q6IDAlOwogICAgYXBwZWFyYW5jZTogbm9uZTsKICAgIC13ZWJraXQtYXBwZWFyYW5jZTogbm9uZTsKICAgIHdpZHRoOiAxMDAlOwogICAgaGVpZ2h0OiA2cHg7CiAgICBib3JkZXItcmFkaXVzOiA5OTlweDsKICAgIG91dGxpbmU6IG5vbmU7CiAgICBib3JkZXI6IG5vbmU7CiAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoCiAgICAgICAgdG8gcmlnaHQsCiAgICAgICAgI2ZmMmY1MiAwJSwKICAgICAgICAjZmYyZjUyIHZhcigtLW1qci1zZWVrLXBjdCksCiAgICAgICAgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjI0KSB2YXIoLS1tanItc2Vlay1wY3QpLAogICAgICAgIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4yNCkgMTAwJQogICAgKTsKICAgIGN1cnNvcjogcG9pbnRlcjsKfQoKLm1qci1tZnYtc2ltcGxlLXBsYXllci1zZWVrOjotd2Via2l0LXNsaWRlci10aHVtYiB7CiAgICAtd2Via2l0LWFwcGVhcmFuY2U6IG5vbmU7CiAgICB3aWR0aDogMTJweDsKICAgIGhlaWdodDogMTJweDsKICAgIGJvcmRlci1yYWRpdXM6IDk5OXB4OwogICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjM1KTsKICAgIGJhY2tncm91bmQ6ICNmZjJmNTI7Cn0KCi5tanItbWZ2LXNpbXBsZS1wbGF5ZXItc2Vlazo6LW1vei1yYW5nZS10aHVtYiB7CiAgICB3aWR0aDogMTJweDsKICAgIGhlaWdodDogMTJweDsKICAgIGJvcmRlci1yYWRpdXM6IDk5OXB4OwogICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjM1KTsKICAgIGJhY2tncm91bmQ6ICNmZjJmNTI7Cn0KCi5tanItbWZ2LXNpbXBsZS1wbGF5ZXItYnRuIHsKICAgIHdpZHRoOiAzMHB4OwogICAgaGVpZ2h0OiAzMHB4OwogICAgbWluLXdpZHRoOiAzMHB4OwogICAgYm9yZGVyLXJhZGl1czogOTk5cHg7CiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMjIpOwogICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA4KTsKfQoKLm1qci1tZnYtc2ltcGxlLXBsYXllci1idG4gLnBpIHsKICAgIGZvbnQtc2l6ZTogMTNweDsKICAgIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuOTUpOwp9CgoubWpyLW1mdi1zaW1wbGUtcGxheWVyLWJ0bi5pcy1kaXNhYmxlZCwKLm1qci1tZnYtc2ltcGxlLXBsYXllci1zZWVrLmlzLWRpc2FibGVkIHsKICAgIG9wYWNpdHk6IDAuNDU7CiAgICBjdXJzb3I6IGRlZmF1bHQ7Cn0KCi5tanItbWZ2LXNpbXBsZS1wbGF5ZXItdGltZSB7CiAgICBtYXJnaW4tbGVmdDogYXV0bzsKICAgIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuOTIpOwogICAgZm9udC1zaXplOiAxMXB4OwogICAgbGluZS1oZWlnaHQ6IDE7CiAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgZm9udC12YXJpYW50LW51bWVyaWM6IHRhYnVsYXItbnVtczsKfQoKLm1qci1tZnYtc2ltcGxlLXBsYXllci1mcmFtZSB7CiAgICBtYXJnaW4tcmlnaHQ6IDJweDsKICAgIHBhZGRpbmc6IDNweCA4cHg7CiAgICBib3JkZXItcmFkaXVzOiA5OTlweDsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xNik7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDYpOwogICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC45KTsKICAgIGZvbnQtc2l6ZTogMTFweDsKICAgIGxpbmUtaGVpZ2h0OiAxOwogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgIGZvbnQtdmFyaWFudC1udW1lcmljOiB0YWJ1bGFyLW51bXM7Cn0KCi5tanItbWZ2LXBsYXllci1ob3N0IHsKICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgIHdpZHRoOiAxMDAlOwogICAgaGVpZ2h0OiAxMDAlOwogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICBjb250YWluZXItdHlwZTogaW5saW5lLXNpemU7Cn0KCi5tanItbWZ2LXBsYXllci1ob3N0LS1hdWRpbyB7CiAgICBiYWNrZ3JvdW5kOiByYWRpYWwtZ3JhZGllbnQoY2lyY2xlIGF0IDIwJSAyMCUsIHJnYmEoOTUsIDE3OSwgMjU1LCAwLjIpLCByZ2JhKDE4LCAyMCwgMjgsIDAuOTUpKTsKfQoKLm1qci1tZnYtcGxheWVyLWF1ZGlvLWJhY2tkcm9wIHsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIGluc2V0OiAwOwogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuOSk7CiAgICBmb250LXNpemU6IDEzcHg7CiAgICBmb250LXdlaWdodDogNjAwOwogICAgbGV0dGVyLXNwYWNpbmc6IDAuMnB4OwogICAgdGV4dC1zaGFkb3c6IDAgMnB4IDEycHggcmdiYSgwLCAwLCAwLCAwLjQ1KTsKICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgcGFkZGluZzogMThweDsKICAgIHRleHQtYWxpZ246IGNlbnRlcjsKICAgIG92ZXJmbG93LXdyYXA6IGFueXdoZXJlOwp9CgoubWpyLW1mdi1wbGF5ZXItaG9zdCAubWpyLXZpZGVvLWNvbnRyb2xzIHsKICAgIHotaW5kZXg6IDMwOwp9CgoubWpyLW1mdi1wbGF5ZXItaG9zdCAubWpyLXZpZGVvLWNvbnRyb2xzW2RhdGEtbWpyLWxheW91dD0iY29tcGFjdCJdLAoubWpyLW1mdi1wbGF5ZXItaG9zdCAubWpyLXZpZGVvLWNvbnRyb2xzW2RhdGEtbWpyLWxheW91dD0ic3RhY2tlZCJdIHsKICAgIGxlZnQ6IDhweDsKICAgIHJpZ2h0OiA4cHg7CiAgICBib3R0b206IDhweDsKICAgIHBhZGRpbmc6IDhweDsKICAgIGdhcDogNnB4Owp9CgoubWpyLW1mdi1wbGF5ZXItaG9zdCAubWpyLXZpZGVvLWNvbnRyb2xzW2RhdGEtbWpyLWxheW91dD0iY29tcGFjdCJdIC5tanItdmlkZW8tcm93LS10b3AsCi5tanItbWZ2LXBsYXllci1ob3N0IC5tanItdmlkZW8tY29udHJvbHNbZGF0YS1tanItbGF5b3V0PSJzdGFja2VkIl0gLm1qci12aWRlby1yb3ctLXRvcCB7CiAgICBnYXA6IDhweDsKfQoKLm1qci1tZnYtcGxheWVyLWhvc3QgLm1qci12aWRlby1jb250cm9sc1tkYXRhLW1qci1sYXlvdXQ9ImNvbXBhY3QiXSAubWpyLXZpZGVvLXRpbWVncm91cCwKLm1qci1tZnYtcGxheWVyLWhvc3QgLm1qci12aWRlby1jb250cm9sc1tkYXRhLW1qci1sYXlvdXQ9InN0YWNrZWQiXSAubWpyLXZpZGVvLXRpbWVncm91cCB7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtc3RhcnQ7CiAgICBnYXA6IDZweDsKfQoKLm1qci1tZnYtcGxheWVyLWhvc3QgLm1qci12aWRlby1jb250cm9sc1tkYXRhLW1qci1sYXlvdXQ9ImNvbXBhY3QiXSAubWpyLXZpZGVvLXJvdy0tYm90dG9tLAoubWpyLW1mdi1wbGF5ZXItaG9zdCAubWpyLXZpZGVvLWNvbnRyb2xzW2RhdGEtbWpyLWxheW91dD0ic3RhY2tlZCJdIC5tanItdmlkZW8tcm93LS1ib3R0b20gewogICAgZmxleC13cmFwOiBub3dyYXA7CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgZ2FwOiA2cHg7Cn0KCi5tanItbWZ2LXBsYXllci1ob3N0IC5tanItdmlkZW8tY29udHJvbHNbZGF0YS1tanItbGF5b3V0PSJjb21wYWN0Il0gLm1qci12aWRlby1ib3R0b20sCi5tanItbWZ2LXBsYXllci1ob3N0IC5tanItdmlkZW8tY29udHJvbHNbZGF0YS1tanItbGF5b3V0PSJzdGFja2VkIl0gLm1qci12aWRlby1ib3R0b20gewogICAgZmxleC1zaHJpbms6IDE7CiAgICBmbGV4LXdyYXA6IG5vd3JhcDsKfQoKLm1qci1tZnYtcGxheWVyLWhvc3QgLm1qci12aWRlby1jb250cm9sc1tkYXRhLW1qci1sYXlvdXQ9ImNvbXBhY3QiXSAubWpyLXZpZGVvLXRyYW5zcG9ydCwKLm1qci1tZnYtcGxheWVyLWhvc3QgLm1qci12aWRlby1jb250cm9sc1tkYXRhLW1qci1sYXlvdXQ9InN0YWNrZWQiXSAubWpyLXZpZGVvLXRyYW5zcG9ydCB7CiAgICBmbGV4LXdyYXA6IG5vd3JhcDsKfQoKLm1qci1tZnYtcGxheWVyLWhvc3QgLm1qci12aWRlby1jb250cm9sc1tkYXRhLW1qci1sYXlvdXQ9ImNvbXBhY3QiXSAubWpyLXZpZGVvLWdyb3VwLAoubWpyLW1mdi1wbGF5ZXItaG9zdCAubWpyLXZpZGVvLWNvbnRyb2xzW2RhdGEtbWpyLWxheW91dD0ic3RhY2tlZCJdIC5tanItdmlkZW8tZ3JvdXAgewogICAgZmxleC13cmFwOiBub3dyYXA7Cn0KCi5tanItbWZ2LXBsYXllci1ob3N0IC5tanItdmlkZW8tY29udHJvbHNbZGF0YS1tanItbGF5b3V0PSJjb21wYWN0Il0gLm1qci12aWRlby1zZWVrLXdyYXAsCi5tanItbWZ2LXBsYXllci1ob3N0IC5tanItdmlkZW8tY29udHJvbHNbZGF0YS1tanItbGF5b3V0PSJzdGFja2VkIl0gLm1qci12aWRlby1zZWVrLXdyYXAgewogICAgbWluLXdpZHRoOiAwOwp9CgovKiBUaGUgTUZWIHVzZXMgdGhlICItLXZpZXdlciIgY29udHJvbCB2YXJpYW50LCB3aGljaCAodW5saWtlICItLXZpZXdlcmJhciIpCiAgIGRvZXMgbm90IHNpemUgdGhlIG5hdGl2ZSBzZWVrIGlucHV0IGFuZCBwYWNrcyBmcmFtZS9pbi9zZWVrL291dC90aW1lIGludG8gYQogICBzaW5nbGUgcm93LiBJbiB0aGUgbmFycm93IE1GViB0aGUgc2VlayB3cmFwIHRoZW4gY29sbGFwc2VzIHRvIH4wcHggd2lkZSBhbmQKICAgdGhlIG5hdGl2ZSBpbnB1dCB0byAwcHggdGFsbCwgbGVhdmluZyBhbG1vc3Qgbm8gY2xpY2sgLyBkcmFnIHRhcmdldCBmb3IKICAgc2NydWJiaW5nLiBHaXZlIHRoZSBzZWVrIGl0cyBvd24gZnVsbC13aWR0aCByb3cgd2l0aCBhIHVzYWJsZSBoaXQgYXJlYS4gKi8KLm1qci1tZnYtcGxheWVyLWhvc3QgLm1qci12aWRlby1jb250cm9scy0tdmlld2VyIC5tanItdmlkZW8tcm93LS10b3AgewogICAgZGlzcGxheTogZmxleDsKICAgIGZsZXgtd3JhcDogd3JhcDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICByb3ctZ2FwOiA0MnB4Owp9CgoubWpyLW1mdi1wbGF5ZXItaG9zdCAubWpyLXZpZGVvLWNvbnRyb2xzLS12aWV3ZXIgLm1qci12aWRlby1yb3ctLXRvcCAubWpyLXZpZGVvLXNlZWstd3JhcCB7CiAgICBvcmRlcjogMTA7CiAgICBmbGV4OiAxIDEgMTAwJTsKICAgIHdpZHRoOiAxMDAlOwogICAgbWluLXdpZHRoOiAwOwogICAgbWluLWhlaWdodDogNDJweDsKICAgIHBhZGRpbmctdG9wOiA2cHg7Cn0KCi5tanItbWZ2LXBsYXllci1ob3N0IC5tanItdmlkZW8tY29udHJvbHMtLXZpZXdlciAubWpyLXZpZGVvLXJhbmdlLS1zZWVrIHsKICAgIGhlaWdodDogMjBweDsKICAgIGFjY2VudC1jb2xvcjogcmdiYSgyMTQsIDIxOCwgMjI0LCAwLjkyKTsKfQoKLm1qci1tZnYtcGxheWVyLWhvc3QgLm1qci12aWRlby1jb250cm9scy0tdmlld2VyIC5tanItdmlkZW8tc2Vlay16b25lcyB7CiAgICBoZWlnaHQ6IDEwcHg7Cn0KCi5tanItbWZ2LXBsYXllci1ob3N0IC5tanItdmlkZW8tY29udHJvbHMtLXZpZXdlciAubWpyLXZpZGVvLXNlZWstaGFuZGxlIHsKICAgIHdpZHRoOiAxNnB4OwogICAgaGVpZ2h0OiAyOHB4OwogICAgdG9wOiAyMHB4Owp9CgoubWpyLW1mdi1wbGF5ZXItaG9zdCAubWpyLXZpZGVvLWNvbnRyb2xzW2RhdGEtbWpyLWxheW91dD0iY29tcGFjdCJdIC5tanItdmlkZW8tYmFyLXRpbWVsaW5lLAoubWpyLW1mdi1wbGF5ZXItaG9zdCAubWpyLXZpZGVvLWNvbnRyb2xzW2RhdGEtbWpyLWxheW91dD0ic3RhY2tlZCJdIC5tanItdmlkZW8tYmFyLXRpbWVsaW5lIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBmbGV4LXdyYXA6IHdyYXA7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwp9CgoubWpyLW1mdi1wbGF5ZXItaG9zdAogICAgLm1qci12aWRlby1jb250cm9sc1tkYXRhLW1qci1sYXlvdXQ9ImNvbXBhY3QiXQogICAgLm1qci12aWRlby1iYXItdGltZWxpbmUKICAgIC5tanItdmlkZW8tc2Vlay13cmFwLAoubWpyLW1mdi1wbGF5ZXItaG9zdAogICAgLm1qci12aWRlby1jb250cm9sc1tkYXRhLW1qci1sYXlvdXQ9InN0YWNrZWQiXQogICAgLm1qci12aWRlby1iYXItdGltZWxpbmUKICAgIC5tanItdmlkZW8tc2Vlay13cmFwIHsKICAgIG9yZGVyOiAtMTsKICAgIGZsZXg6IDEgMSAxMDAlOwogICAgd2lkdGg6IDEwMCU7Cn0KCi5tanItbWZ2LXBsYXllci1ob3N0CiAgICAubWpyLXZpZGVvLWNvbnRyb2xzW2RhdGEtbWpyLWxheW91dD0iY29tcGFjdCJdCiAgICAubWpyLXZpZGVvLWJhci10aW1lbGluZQogICAgLm1qci12aWRlby1ncm91cC0taW4sCi5tanItbWZ2LXBsYXllci1ob3N0CiAgICAubWpyLXZpZGVvLWNvbnRyb2xzW2RhdGEtbWpyLWxheW91dD0iY29tcGFjdCJdCiAgICAubWpyLXZpZGVvLWJhci10aW1lbGluZQogICAgLm1qci12aWRlby1ncm91cC0tb3V0LAoubWpyLW1mdi1wbGF5ZXItaG9zdAogICAgLm1qci12aWRlby1jb250cm9sc1tkYXRhLW1qci1sYXlvdXQ9InN0YWNrZWQiXQogICAgLm1qci12aWRlby1iYXItdGltZWxpbmUKICAgIC5tanItdmlkZW8tZ3JvdXAtLWluLAoubWpyLW1mdi1wbGF5ZXItaG9zdAogICAgLm1qci12aWRlby1jb250cm9sc1tkYXRhLW1qci1sYXlvdXQ9InN0YWNrZWQiXQogICAgLm1qci12aWRlby1iYXItdGltZWxpbmUKICAgIC5tanItdmlkZW8tZ3JvdXAtLW91dCB7CiAgICBmbGV4OiAwIDEgYXV0bzsKfQoKLm1qci1tZnYtcGxheWVyLWhvc3QgLm1qci12aWRlby1jb250cm9sc1tkYXRhLW1qci1sYXlvdXQ9ImNvbXBhY3QiXSAubWpyLXZpZGVvLXJhbmdlLWNvdW50LAoubWpyLW1mdi1wbGF5ZXItaG9zdCAubWpyLXZpZGVvLWNvbnRyb2xzW2RhdGEtbWpyLWxheW91dD0iY29tcGFjdCJdIC5tanItdmlkZW8tZnJhbWUgewogICAgbWluLXdpZHRoOiBhdXRvOwp9CgoubWpyLW1mdi1wbGF5ZXItaG9zdCAubWpyLXZpZGVvLWNvbnRyb2xzW2RhdGEtbWpyLWxheW91dD0ic3RhY2tlZCJdIC5tanItdmlkZW8tcmFuZ2UtY291bnQgewogICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50Owp9CgoubWpyLW1mdi1wbGF5ZXItaG9zdCAubWpyLXZpZGVvLWNvbnRyb2xzW2RhdGEtbWpyLWxheW91dD0ic3RhY2tlZCJdIC5tanItdmlkZW8tZnJhbWUgewogICAgbWluLXdpZHRoOiBhdXRvOwogICAgcGFkZGluZzogM3B4IDZweDsKfQoKLm1qci1tZnYtcGxheWVyLWhvc3QgLm1qci12aWRlby1jb250cm9sc1tkYXRhLW1qci1sYXlvdXQ9InN0YWNrZWQiXSAubWpyLXZpZGVvLWJ0bi0taW4sCi5tanItbWZ2LXBsYXllci1ob3N0IC5tanItdmlkZW8tY29udHJvbHNbZGF0YS1tanItbGF5b3V0PSJzdGFja2VkIl0gLm1qci12aWRlby1idG4tLW91dCwKLm1qci1tZnYtcGxheWVyLWhvc3QgLm1qci12aWRlby1jb250cm9sc1tkYXRhLW1qci1sYXlvdXQ9InN0YWNrZWQiXSAubWpyLXZpZGVvLWJ0bi0tbWFyayB7CiAgICBtaW4td2lkdGg6IDMycHg7Cn0KCkBjb250YWluZXIgKG1heC13aWR0aDogOTAwcHgpIHsKICAgIC5tanItbWZ2LXBsYXllci1ob3N0IC5tanItdmlkZW8tY29udHJvbHMgewogICAgICAgIGxlZnQ6IDhweDsKICAgICAgICByaWdodDogOHB4OwogICAgICAgIGJvdHRvbTogOHB4OwogICAgICAgIHBhZGRpbmc6IDhweDsKICAgICAgICBnYXA6IDZweDsKICAgIH0KCiAgICAubWpyLW1mdi1wbGF5ZXItaG9zdCAubWpyLXZpZGVvLXJvdy0tdG9wIHsKICAgICAgICBnYXA6IDhweDsKICAgIH0KCiAgICAubWpyLW1mdi1wbGF5ZXItaG9zdCAubWpyLXZpZGVvLXRpbWVncm91cCB7CiAgICAgICAganVzdGlmeS1jb250ZW50OiBmbGV4LXN0YXJ0OwogICAgICAgIGdhcDogNnB4OwogICAgfQoKICAgIC5tanItbWZ2LXBsYXllci1ob3N0IC5tanItdmlkZW8tcm93LS1ib3R0b20gewogICAgICAgIGZsZXgtd3JhcDogbm93cmFwOwogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgICAgZ2FwOiA2cHg7CiAgICB9CgogICAgLm1qci1tZnYtcGxheWVyLWhvc3QgLm1qci12aWRlby1ib3R0b20gewogICAgICAgIGZsZXgtc2hyaW5rOiAxOwogICAgICAgIGZsZXgtd3JhcDogbm93cmFwOwogICAgfQoKICAgIC5tanItbWZ2LXBsYXllci1ob3N0IC5tanItdmlkZW8tdHJhbnNwb3J0IHsKICAgICAgICBmbGV4LXdyYXA6IG5vd3JhcDsKICAgIH0KCiAgICAubWpyLW1mdi1wbGF5ZXItaG9zdCAubWpyLXZpZGVvLWdyb3VwIHsKICAgICAgICBmbGV4LXdyYXA6IG5vd3JhcDsKICAgIH0KCiAgICAubWpyLW1mdi1wbGF5ZXItaG9zdCAubWpyLXZpZGVvLXNlZWstd3JhcCB7CiAgICAgICAgbWluLXdpZHRoOiAwOwogICAgfQoKICAgIC5tanItbWZ2LXBsYXllci1ob3N0IC5tanItdmlkZW8tY29udHJvbHMtLXZpZXdlcmJhciAubWpyLXZpZGVvLWJhci10aW1lbGluZSB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmbGV4LXdyYXA6IHdyYXA7CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIH0KCiAgICAubWpyLW1mdi1wbGF5ZXItaG9zdAogICAgICAgIC5tanItdmlkZW8tY29udHJvbHMtLXZpZXdlcmJhcgogICAgICAgIC5tanItdmlkZW8tYmFyLXRpbWVsaW5lCiAgICAgICAgLm1qci12aWRlby1zZWVrLXdyYXAgewogICAgICAgIG9yZGVyOiAtMTsKICAgICAgICBmbGV4OiAxIDEgMTAwJTsKICAgICAgICB3aWR0aDogMTAwJTsKICAgIH0KfQoKQGNvbnRhaW5lciAobWF4LXdpZHRoOiA2ODBweCkgewogICAgLm1qci1tZnYtcGxheWVyLWhvc3QgLm1qci12aWRlby1jb250cm9scyB7CiAgICAgICAgcGFkZGluZzogNnB4OwogICAgfQoKICAgIC5tanItbWZ2LXBsYXllci1ob3N0IC5tanItdmlkZW8tYnRuIHsKICAgICAgICBwYWRkaW5nOiA1cHggOHB4OwogICAgICAgIGZvbnQtc2l6ZTogMTJweDsKICAgIH0KCiAgICAubWpyLW1mdi1wbGF5ZXItaG9zdCAubWpyLXZpZGVvLW51bSB7CiAgICAgICAgcGFkZGluZzogNHB4IDZweDsKICAgICAgICBmb250LXNpemU6IDExcHg7CiAgICB9CgogICAgLm1qci1tZnYtcGxheWVyLWhvc3QgLm1qci12aWRlby10aW1lLAogICAgLm1qci1tZnYtcGxheWVyLWhvc3QgLm1qci12aWRlby1mcmFtZSwKICAgIC5tanItbWZ2LXBsYXllci1ob3N0IC5tanItdmlkZW8tcmFuZ2UtY291bnQgewogICAgICAgIGZvbnQtc2l6ZTogMTFweDsKICAgIH0KfQoKLyogLS0gU2V0dGluZ3MgYnV0dG9uIGFjdGl2ZSBzdGF0ZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLm1qci1tZnYtc2V0dGluZ3MtYnRuLmFjdGl2ZSB7CiAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peCgKICAgICAgICBpbiBzcmdiLAogICAgICAgIHZhcigtLW1qci1hY2NlbnQsICM1ZmIzZmYpIDU1JSwKICAgICAgICB2YXIoLS1tanItYm9yZGVyLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTIpKQogICAgKTsKICAgIGJhY2tncm91bmQtY29sb3I6IGNvbG9yLW1peCgKICAgICAgICBpbiBzcmdiLAogICAgICAgIHZhcigtLW1qci1zdXJmYWNlLTIsICMzMzMpIDcwJSwKICAgICAgICB2YXIoLS1tanItYWNjZW50LCAjNWZiM2ZmKSAxOCUKICAgICk7Cn0KLm1qci1tZnYtc2V0dGluZ3MtYnRuLmFjdGl2ZSAucGkgewogICAgY29sb3I6IHZhcigtLW1qci1hY2NlbnQsICM1ZmIzZmYpOwp9CgovKiAtLSBDbG9zZSBidXR0b24gKHJlZCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi5tanItbWZ2IC5tanItbWZ2LWNsb3NlLWJ0biB7CiAgICBjb2xvcjogI2U4NTA1MDsKfQoubWpyLW1mdiAubWpyLW1mdi1jbG9zZS1idG46aG92ZXIgewogICAgY29sb3I6ICNmZjZiNmI7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDIzMiwgODAsIDgwLCAwLjE1KTsKfQoKLyogLS0gRW1wdHkgc3RhdGUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoubWpyLW1mdi1lbXB0eSB7CiAgICB3aWR0aDogMTAwJTsKICAgIGhlaWdodDogMTAwJTsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjI1KTsKICAgIGZvbnQtc2l6ZTogMTFweDsKICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgcGFkZGluZzogMTJweDsKfQoKLyogLS0gQ29tcGFyZSBsYWJlbHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoubWpyLW1mdi1sYWJlbCB7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICB0b3A6IDhweDsKICAgIGJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgMC41OCk7CiAgICBjb2xvcjogI2ZmZjsKICAgIGZvbnQtc2l6ZTogMTBweDsKICAgIGZvbnQtd2VpZ2h0OiA3MDA7CiAgICBwYWRkaW5nOiAycHggN3B4OwogICAgYm9yZGVyLXJhZGl1czogNHB4OwogICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICB6LWluZGV4OiAyMDsKICAgIGxldHRlci1zcGFjaW5nOiAwLjRweDsKfQoKLm1qci1tZnYtbGFiZWwubGFiZWwtbGVmdCB7CiAgICBsZWZ0OiA4cHg7Cn0KLm1qci1tZnYtbGFiZWwubGFiZWwtcmlnaHQgewogICAgcmlnaHQ6IDhweDsKfQoKLyogLS0gQUIgZGl2aWRlciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoubWpyLW1mdi1hYi1kaXZpZGVyIHsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIHRvcDogMDsKICAgIGJvdHRvbTogMDsKICAgIHdpZHRoOiAwLjVweDsKICAgIGN1cnNvcjogY29sLXJlc2l6ZTsKICAgIHotaW5kZXg6IDEwOwogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKC01MCUpOwogICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjg4KTsKICAgIGJveC1zaGFkb3c6CiAgICAgICAgMCAwIDAgMC41cHggcmdiYSgwLCAwLCAwLCAwLjQpLAogICAgICAgIDAgMnB4IDhweCByZ2JhKDAsIDAsIDAsIDAuNCk7CiAgICB0cmFuc2l0aW9uOiBiYWNrZ3JvdW5kIDEwMG1zIGVhc2U7Cn0KCi5tanItbWZ2LWFiLWRpdmlkZXI6OmJlZm9yZSB7CiAgICBjb250ZW50OiAiIjsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIHRvcDogMDsKICAgIGJvdHRvbTogMDsKICAgIGxlZnQ6IDUwJTsKICAgIHdpZHRoOiAxMnB4OwogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKC01MCUpOwp9CgoubWpyLW1mdi1hYi1kaXZpZGVyOmhvdmVyLAoubWpyLW1mdi1hYi1kaXZpZGVyOmFjdGl2ZSB7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1tanItYWNjZW50LCAjNWZiM2ZmKTsKfQoKLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgTUZWIEdlb21ldHJ5ICYgTGF5b3V0IENsYXNzZXMgKHJlcGxhY2VzIGlubGluZSBzdHlsZXMgaW4gRmxvYXRpbmdWaWV3ZXIuanMpCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgovKiBNYWluIE1GViBjb250YWluZXIgZ2VvbWV0cnkgKi8KLm1qci1tZnYgewogICAgcG9zaXRpb246IGZpeGVkOwogICAgdG9wOiB2YXIoLS1tanItbWZ2LXRvcC1vZmZzZXQsIDYwcHgpOwogICAgcmlnaHQ6IDIwcHg7CiAgICB3aWR0aDogNjQwcHg7CiAgICBoZWlnaHQ6IDM2MHB4OwogICAgbWluLXdpZHRoOiAyMjBweDsKICAgIG1pbi1oZWlnaHQ6IDE2MHB4OwogICAgLyogQWx3YXlzIGZsZXg7IHZpc2liaWxpdHkgKyBvcGFjaXR5IGNvbnRyb2wgc2hvdy9oaWRlIHNvIENTUyB0cmFuc2l0aW9ucyB3b3JrLgogICAgICAgcG9pbnRlci1ldmVudHM6bm9uZSB3aGlsZSBoaWRkZW4gcHJldmVudHMgYWNjaWRlbnRhbCBpbnRlcmFjdGlvbi4gKi8KICAgIGRpc3BsYXk6IGZsZXg7CiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgcmVzaXplOiBib3RoOwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIHotaW5kZXg6IDEwMDAwOwogICAgLyogSGlkZGVuIHN0YXRlICovCiAgICBvcGFjaXR5OiAwOwogICAgdmlzaWJpbGl0eTogaGlkZGVuOwogICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTZweCkgc2NhbGUoMC45OCk7CiAgICB0cmFuc2Zvcm0tb3JpZ2luOiB0b3AgcmlnaHQ7CiAgICB0cmFuc2l0aW9uOgogICAgICAgIG9wYWNpdHkgMC4xOHMgZWFzZS1vdXQsCiAgICAgICAgdHJhbnNmb3JtIDAuMThzIGVhc2Utb3V0LAogICAgICAgIHZpc2liaWxpdHkgMHMgbGluZWFyIDAuMThzOwp9CgoubWpyLW1mdi5tanItbWZ2LS1yZXNpemluZyB7CiAgICB1c2VyLXNlbGVjdDogbm9uZTsKfQoKLm1qci1tZnYuaXMtdmlzaWJsZSB7CiAgICBvcGFjaXR5OiAxOwogICAgdmlzaWJpbGl0eTogdmlzaWJsZTsKICAgIHBvaW50ZXItZXZlbnRzOiBhdXRvOwogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDApIHNjYWxlKDEpOwogICAgdHJhbnNpdGlvbjoKICAgICAgICBvcGFjaXR5IDAuMThzIGVhc2Utb3V0LAogICAgICAgIHRyYW5zZm9ybSAwLjE4cyBlYXNlLW91dCwKICAgICAgICB2aXNpYmlsaXR5IDBzIGxpbmVhciAwczsKfQoKLyogTWVkaWEgZWxlbWVudHMgKGltZy92aWRlbykgc2l6aW5nIHZhcmlhbnRzICovCi5tanItbWZ2LW1lZGlhIHsKICAgIGRpc3BsYXk6IGJsb2NrOwogICAgd2lkdGg6IDEwMCU7CiAgICBoZWlnaHQ6IDEwMCU7CiAgICBtYXgtd2lkdGg6IDEwMCU7CiAgICBtYXgtaGVpZ2h0OiAxMDAlOwogICAgb2JqZWN0LWZpdDogY29udGFpbjsKICAgIG9iamVjdC1wb3NpdGlvbjogY2VudGVyOwp9CgoubWpyLW1mdi1tZWRpYS0tZml0LWhlaWdodCB7CiAgICB3aWR0aDogMTAwJTsKICAgIGhlaWdodDogMTAwJTsKICAgIG1heC13aWR0aDogMTAwJTsKICAgIG1heC1oZWlnaHQ6IDEwMCU7CiAgICBvYmplY3QtZml0OiBjb250YWluOwogICAgb2JqZWN0LXBvc2l0aW9uOiBjZW50ZXI7Cn0KCi5tanItbWZ2LW1lZGlhLS1maWxsIHsKICAgIHdpZHRoOiAxMDAlOwogICAgaGVpZ2h0OiAxMDAlOwogICAgbWF4LXdpZHRoOiAxMDAlOwogICAgbWF4LWhlaWdodDogMTAwJTsKICAgIG9iamVjdC1maXQ6IGNvbnRhaW47CiAgICBvYmplY3QtcG9zaXRpb246IGNlbnRlcjsKICAgIGRpc3BsYXk6IGJsb2NrOwp9CgovKiBBdWRpbyBjYXJkIGluc2lkZSBNRlYgKi8KLm1qci1tZnYtYXVkaW8tY2FyZCB7CiAgICB3aWR0aDogbWluKDkyJSwgNTYwcHgpOwogICAgbWF4LXdpZHRoOiAxMDAlOwogICAgZGlzcGxheTogZmxleDsKICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICBnYXA6IDEwcHg7CiAgICBwYWRkaW5nOiAxMnB4OwogICAgYm9yZGVyLXJhZGl1czogMTBweDsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xOCk7CiAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoMTYwZGVnLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDYpLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDIpKTsKICAgIGJveC1zaGFkb3c6IDAgNnB4IDE2cHggcmdiYSgwLCAwLCAwLCAwLjM1KTsKfQoKLm1qci1tZnYtYXVkaW8taGVhZCB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogOHB4OwogICAgbWluLXdpZHRoOiAwOwp9CgoubWpyLW1mdi1hdWRpby1pY29uIHsKICAgIGNvbG9yOiB2YXIoLS1tanItYmFkZ2UtYXVkaW8sICNmZjk4MDApOwogICAgb3BhY2l0eTogMC45NTsKfQoKLm1qci1tZnYtYXVkaW8tdGl0bGUgewogICAgbWluLXdpZHRoOiAwOwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgIGZvbnQtc2l6ZTogMTJweDsKICAgIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuOSk7Cn0KCi5tanItbWZ2LWF1ZGlvLXBsYXllciB7CiAgICB3aWR0aDogMTAwJTsKfQoKLm1qci1tZnYtc2lkZS1wYW5lbCAubWpyLW1mdi1hdWRpby1jYXJkLAoubWpyLW1mdi1hYi1sYXllciAubWpyLW1mdi1hdWRpby1jYXJkLAoubWpyLW1mdi1ncmlkLWNlbGwgLm1qci1tZnYtYXVkaW8tY2FyZCB7CiAgICB3aWR0aDogY2FsYygxMDAlIC0gMjBweCk7Cn0KCi8qIFZpZGVvIGVsZW1lbnQgc3BlY2lmaWMgc3R5bGVzICovCi5tanItbWZ2LW1lZGlhLXZpZGVvIHsKICAgIC8qIEluaGVyaXRzIGZyb20gLm1qci1tZnYtbWVkaWEgb3IgLm1qci1tZnYtbWVkaWEtLWZpbGwgKi8KfQoKLyogTm9kZSBTdHJlYW0gLSBjdXJyZW50bHktc3RyZWFtZWQgbm9kZSBiYWRnZSAodG9wLWxlZnQgb2YgY29udGVudCBhcmVhLAogICBmb2xsb3dpbmcgdGhlIHNhbWUgb3ZlcmxheSBwYXR0ZXJuIGFzIC5tanItbWZ2LWdlbmluZm8pLiAqLwoubWpyLW1mdi1ub2RlLW92ZXJsYXkgewogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgdG9wOiA4cHg7CiAgICBsZWZ0OiA4cHg7CiAgICB6LWluZGV4OiAxMjsKICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgcGFkZGluZzogNHB4IDhweDsKICAgIGJvcmRlci1yYWRpdXM6IDZweDsKICAgIGZvbnQtc2l6ZTogMTFweDsKICAgIGZvbnQtd2VpZ2h0OiA2MDA7CiAgICBsaW5lLWhlaWdodDogMS4zOwogICAgY29sb3I6ICNlNmYzZmY7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIDAuNjUpOwogICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgxMjAsIDE3MCwgMjQwLCAwLjQ1KTsKICAgIGJveC1zaGFkb3c6IDAgMnB4IDhweCByZ2JhKDAsIDAsIDAsIDAuNCk7CiAgICBiYWNrZHJvcC1maWx0ZXI6IGJsdXIoNnB4KTsKICAgIC13ZWJraXQtYmFja2Ryb3AtZmlsdGVyOiBibHVyKDZweCk7CiAgICBtYXgtd2lkdGg6IGNhbGMoMTAwJSAtIDE2cHgpOwogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKfQovKiBHZW4gaW5mbyBvdmVybGF5IC0gYWxsIG1vZGVzIHNoYXJlIGJhc2UgbGF5b3V0ICovCi5tanItbWZ2LWdlbmluZm8sCi5tanItbWZ2LWdlbmluZm8tYSwKLm1qci1tZnYtZ2VuaW5mby1iIHsKICAgIGRpc3BsYXk6IG5vbmU7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICBsZWZ0OiA4cHg7CiAgICByaWdodDogOHB4OwogICAgYm90dG9tOiA4cHg7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIDAuNjUpOwogICAgY29sb3I6ICNmZmY7CiAgICBwYWRkaW5nOiA4cHggMTBweDsKICAgIGJvcmRlci1yYWRpdXM6IDZweDsKICAgIGZvbnQtc2l6ZTogMTFweDsKICAgIG1heC1oZWlnaHQ6IDQwJTsKICAgIG92ZXJmbG93LXk6IGF1dG87CiAgICBvdmVyZmxvdy14OiBoaWRkZW47CiAgICBvdmVyc2Nyb2xsLWJlaGF2aW9yLXk6IGNvbnRhaW47CiAgICAtd2Via2l0LW92ZXJmbG93LXNjcm9sbGluZzogdG91Y2g7CiAgICB0b3VjaC1hY3Rpb246IHBhbi15OwogICAgd29yZC1icmVhazogYnJlYWstd29yZDsKICAgIGJhY2tkcm9wLWZpbHRlcjogYmx1cig2cHgpOwogICAgLXdlYmtpdC1iYWNrZHJvcC1maWx0ZXI6IGJsdXIoNnB4KTsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xMik7CiAgICBib3gtc2hhZG93OiAwIDJweCA4cHggcmdiYSgwLCAwLCAwLCAwLjQpOwp9CgovKiBLZWVwIEdlbiBJbmZvIGFib3ZlIGN1c3RvbSBzaW1wbGUtcGxheWVyIGNvbnRyb2xzIHdoZW4gcHJlc2VudC4gKi8KLm1qci1tZnYtZ2VuaW5mby5tanItbWZ2LWdlbmluZm8tLWFib3ZlLXBsYXllciwKLm1qci1tZnYtZ2VuaW5mby1hLm1qci1tZnYtZ2VuaW5mby0tYWJvdmUtcGxheWVyLAoubWpyLW1mdi1nZW5pbmZvLWIubWpyLW1mdi1nZW5pbmZvLS1hYm92ZS1wbGF5ZXIgewogICAgdG9wOiA4cHg7CiAgICBib3R0b206IGF1dG87CiAgICBtYXgtaGVpZ2h0OiBtaW4oNDUlLCBjYWxjKDEwMCUgLSAxMjRweCkpOwp9CgovKiBGYWxsYmFjazogd2hlbiBzaW1wbGUtcGxheWVyIGlzIGltbWVkaWF0ZWx5IGZvbGxvd2VkIGJ5IGEgZ2VuaW5mbyBvdmVybGF5LAogICBtb3ZlIGl0IHVwIGV2ZW4gaWYgdGhlIG1vZGlmaWVyIGNsYXNzIHdhcyBub3QgYXR0YWNoZWQuICovCi5tanItbWZ2LXNpbXBsZS1wbGF5ZXIgKyAubWpyLW1mdi1nZW5pbmZvLAoubWpyLW1mdi1zaW1wbGUtcGxheWVyICsgLm1qci1tZnYtZ2VuaW5mby1hLAoubWpyLW1mdi1zaW1wbGUtcGxheWVyICsgLm1qci1tZnYtZ2VuaW5mby1iIHsKICAgIHRvcDogOHB4OwogICAgYm90dG9tOiBhdXRvOwogICAgbWF4LWhlaWdodDogbWluKDQ1JSwgY2FsYygxMDAlIC0gMTI0cHgpKTsKfQoKLyogQUIgbW9kZSBvdmVybGF5cyBhcmUgYXR0YWNoZWQgYXQgY29udGFpbmVyIGxldmVsOyBzaGlmdCB0aGVtIHdoZW4gQUIgbGF5ZXJzIHVzZSBzaW1wbGUtcGxheWVyLiAqLwoubWpyLW1mdi1hYi1jb250YWluZXI6aGFzKC5tanItbWZ2LWFiLWxheWVyIC5tanItbWZ2LXNpbXBsZS1wbGF5ZXIpIC5tanItbWZ2LWdlbmluZm8tYSwKLm1qci1tZnYtYWItY29udGFpbmVyOmhhcygubWpyLW1mdi1hYi1sYXllciAubWpyLW1mdi1zaW1wbGUtcGxheWVyKSAubWpyLW1mdi1nZW5pbmZvLWIgewogICAgdG9wOiA4cHg7CiAgICBib3R0b206IGF1dG87CiAgICBtYXgtaGVpZ2h0OiBtaW4oNDUlLCBjYWxjKDEwMCUgLSAxMjRweCkpOwp9CgovKiBTaGFyZWQgc3R5bGUgZm9yIGFsbCBnZW4gaW5mbyBvdmVybGF5IHZhcmlhbnRzICovCi5tanItbWZ2LWdlbmluZm8gc3Ryb25nLAoubWpyLW1mdi1nZW5pbmZvLWEgc3Ryb25nLAoubWpyLW1mdi1nZW5pbmZvLWIgc3Ryb25nIHsKICAgIGZvbnQtd2VpZ2h0OiA2MDA7CiAgICBtYXJnaW4tcmlnaHQ6IDRweDsKICAgIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuOTUpOyAvKiBkZWZhdWx0IC0gb3ZlcnJpZGRlbiBwZXIgZmllbGQgYmVsb3cgKi8KfQoKLyogUGVyLWZpZWxkIGxhYmVsIGNvbG9ycyAqLwoubWpyLW1mdi1nZW5pbmZvIFtkYXRhLWZpZWxkPSJwcm9tcHQiXSBzdHJvbmcsCi5tanItbWZ2LWdlbmluZm8tYSBbZGF0YS1maWVsZD0icHJvbXB0Il0gc3Ryb25nLAoubWpyLW1mdi1nZW5pbmZvLWIgW2RhdGEtZmllbGQ9InByb21wdCJdIHN0cm9uZyB7CiAgICBjb2xvcjogIzdlYzhmZjsKfSAvKiBibHVlICAgLSBQcm9tcHQgKi8KCi5tanItbWZ2LWdlbmluZm8gW2RhdGEtZmllbGQ9InNlZWQiXSBzdHJvbmcsCi5tanItbWZ2LWdlbmluZm8tYSBbZGF0YS1maWVsZD0ic2VlZCJdIHN0cm9uZywKLm1qci1tZnYtZ2VuaW5mby1iIFtkYXRhLWZpZWxkPSJzZWVkIl0gc3Ryb25nIHsKICAgIGNvbG9yOiAjZmZkNDdhOwp9IC8qIGFtYmVyICAtIFNlZWQgICAqLwoKLm1qci1tZnYtZ2VuaW5mbyBbZGF0YS1maWVsZD0ibW9kZWwiXSBzdHJvbmcsCi5tanItbWZ2LWdlbmluZm8tYSBbZGF0YS1maWVsZD0ibW9kZWwiXSBzdHJvbmcsCi5tanItbWZ2LWdlbmluZm8tYiBbZGF0YS1maWVsZD0ibW9kZWwiXSBzdHJvbmcgewogICAgY29sb3I6ICM3ZGRhOGE7Cn0gLyogZ3JlZW4gIC0gTW9kZWwgICovCgoubWpyLW1mdi1nZW5pbmZvIFtkYXRhLWZpZWxkPSJsb3JhIl0gc3Ryb25nLAoubWpyLW1mdi1nZW5pbmZvLWEgW2RhdGEtZmllbGQ9ImxvcmEiXSBzdHJvbmcsCi5tanItbWZ2LWdlbmluZm8tYiBbZGF0YS1maWVsZD0ibG9yYSJdIHN0cm9uZyB7CiAgICBjb2xvcjogI2Q0OGNmZjsKfSAvKiB2aW9sZXQgLSBMb1JBICAgKi8KCi5tanItbWZ2LWdlbmluZm8gW2RhdGEtZmllbGQ9InNhbXBsZXIiXSBzdHJvbmcsCi5tanItbWZ2LWdlbmluZm8tYSBbZGF0YS1maWVsZD0ic2FtcGxlciJdIHN0cm9uZywKLm1qci1tZnYtZ2VuaW5mby1iIFtkYXRhLWZpZWxkPSJzYW1wbGVyIl0gc3Ryb25nIHsKICAgIGNvbG9yOiAjZmY5ZjdhOwp9IC8qIG9yYW5nZSAtIFNhbXBsZXIgKi8KCi5tanItbWZ2LWdlbmluZm8gW2RhdGEtZmllbGQ9InNjaGVkdWxlciJdIHN0cm9uZywKLm1qci1tZnYtZ2VuaW5mby1hIFtkYXRhLWZpZWxkPSJzY2hlZHVsZXIiXSBzdHJvbmcsCi5tanItbWZ2LWdlbmluZm8tYiBbZGF0YS1maWVsZD0ic2NoZWR1bGVyIl0gc3Ryb25nIHsKICAgIGNvbG9yOiAjZmY3YTlmOwp9IC8qIHBpbmsgICAtIFNjaGVkdWxlciAqLwoKLm1qci1tZnYtZ2VuaW5mbyBbZGF0YS1maWVsZD0iY2ZnIl0gc3Ryb25nLAoubWpyLW1mdi1nZW5pbmZvLWEgW2RhdGEtZmllbGQ9ImNmZyJdIHN0cm9uZywKLm1qci1tZnYtZ2VuaW5mby1iIFtkYXRhLWZpZWxkPSJjZmciXSBzdHJvbmcgewogICAgY29sb3I6ICM3YTlmZmY7Cn0gLyogaW5kaWdvIC0gQ0ZHICovCgoubWpyLW1mdi1nZW5pbmZvIFtkYXRhLWZpZWxkPSJzdGVwIl0gc3Ryb25nLAoubWpyLW1mdi1nZW5pbmZvLWEgW2RhdGEtZmllbGQ9InN0ZXAiXSBzdHJvbmcsCi5tanItbWZ2LWdlbmluZm8tYiBbZGF0YS1maWVsZD0ic3RlcCJdIHN0cm9uZyB7CiAgICBjb2xvcjogIzdhZmZkNDsKfSAvKiB0ZWFsICAgLSBTdGVwICovCgoubWpyLW1mdi1nZW5pbmZvIFtkYXRhLWZpZWxkPSJnZW5UaW1lIl0gc3Ryb25nLAoubWpyLW1mdi1nZW5pbmZvLWEgW2RhdGEtZmllbGQ9ImdlblRpbWUiXSBzdHJvbmcsCi5tanItbWZ2LWdlbmluZm8tYiBbZGF0YS1maWVsZD0iZ2VuVGltZSJdIHN0cm9uZyB7CiAgICBjb2xvcjogI2UwZmY3YTsKfSAvKiBsaW1lICAgLSBHZW4gVGltZSAqLwoKLm1qci1tZnYtZ2VuaW5mbyBkaXYsCi5tanItbWZ2LWdlbmluZm8tYSBkaXYsCi5tanItbWZ2LWdlbmluZm8tYiBkaXYgewogICAgbGluZS1oZWlnaHQ6IDEuMzU7CiAgICBtYXJnaW4tYm90dG9tOiAzcHg7Cn0KCi5tanItbWZ2LWdlbmluZm8gZGl2Omxhc3QtY2hpbGQsCi5tanItbWZ2LWdlbmluZm8tYSBkaXY6bGFzdC1jaGlsZCwKLm1qci1tZnYtZ2VuaW5mby1iIGRpdjpsYXN0LWNoaWxkIHsKICAgIG1hcmdpbi1ib3R0b206IDA7Cn0KCi8qIFNpbXBsZSBtb2RlIGNvbnRhaW5lciAqLwoubWpyLW1mdi1zaW1wbGUtY29udGFpbmVyIHsKICAgIHdpZHRoOiAxMDAlOwogICAgaGVpZ2h0OiAxMDAlOwogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICBwb3NpdGlvbjogcmVsYXRpdmU7Cn0KCi8qIEFCIG1vZGUgY29udGFpbmVyICovCi5tanItbWZ2LWFiLWNvbnRhaW5lciB7CiAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICB3aWR0aDogMTAwJTsKICAgIGhlaWdodDogMTAwJTsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICBiYWNrZ3JvdW5kOiAjMDAwOwp9CgovKiBBQiBtb2RlIGxheWVycyAqLwoubWpyLW1mdi1hYi1sYXllciB7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICBpbnNldDogMDsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7Cn0KCi5tanItbWZ2LWFiLWxheWVyLS1iIHsKICAgIC8qIGNsaXAtcGF0aCBhcHBsaWVkIGlubGluZSBmb3IgZHluYW1pYyBkaXZpZGVyIHBvc2l0aW9uICovCn0KCi8qIFNpZGUtYnktc2lkZSBtb2RlIGNvbnRhaW5lciAqLwoubWpyLW1mdi1zaWRlLWNvbnRhaW5lciB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgd2lkdGg6IDEwMCU7CiAgICBoZWlnaHQ6IDEwMCU7CiAgICBnYXA6IDJweDsKICAgIGJhY2tncm91bmQ6ICMxMTE7CiAgICBvdmVyZmxvdzogaGlkZGVuOwp9CgovKiBTaWRlLWJ5LXNpZGUgaGFsZiBwYW5lbHMgKi8KLm1qci1tZnYtc2lkZS1wYW5lbCB7CiAgICBmbGV4OiAxOwogICAgbWluLXdpZHRoOiAwOwogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICBiYWNrZ3JvdW5kOiAjMGQwZDBkOwp9CgovKiBHcmlkIGNvbXBhcmUgKDItMikgY29udGFpbmVyICovCi5tanItbWZ2LWdyaWQtY29udGFpbmVyIHsKICAgIGRpc3BsYXk6IGdyaWQ7CiAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IDFmciAxZnI7CiAgICBncmlkLXRlbXBsYXRlLXJvd3M6IDFmciAxZnI7CiAgICB3aWR0aDogMTAwJTsKICAgIGhlaWdodDogMTAwJTsKICAgIGdhcDogMnB4OwogICAgYmFja2dyb3VuZDogIzExMTsKICAgIG92ZXJmbG93OiBoaWRkZW47Cn0KCi8qIEdyaWQgY2VsbHMgKi8KLm1qci1tZnYtZ3JpZC1jZWxsIHsKICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgYmFja2dyb3VuZDogIzBkMGQwZDsKICAgIG1pbi13aWR0aDogMDsKICAgIG1pbi1oZWlnaHQ6IDA7Cn0KCi8qIEdlbiBpbmZvIG92ZXJsYXlzIGZvciBncmlkIGNlbGxzIEMgYW5kIEQgKi8KLm1qci1tZnYtZ2VuaW5mby1jLAoubWpyLW1mdi1nZW5pbmZvLWQgewogICAgZGlzcGxheTogbm9uZTsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIGxlZnQ6IDhweDsKICAgIHJpZ2h0OiA4cHg7CiAgICBib3R0b206IDhweDsKICAgIGJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgMC42NSk7CiAgICBjb2xvcjogI2ZmZjsKICAgIHBhZGRpbmc6IDhweCAxMHB4OwogICAgYm9yZGVyLXJhZGl1czogNnB4OwogICAgZm9udC1zaXplOiAxMXB4OwogICAgbWF4LWhlaWdodDogNDAlOwogICAgb3ZlcmZsb3cteTogYXV0bzsKICAgIG92ZXJmbG93LXg6IGhpZGRlbjsKICAgIG92ZXJzY3JvbGwtYmVoYXZpb3IteTogY29udGFpbjsKICAgIC13ZWJraXQtb3ZlcmZsb3ctc2Nyb2xsaW5nOiB0b3VjaDsKICAgIHRvdWNoLWFjdGlvbjogcGFuLXk7CiAgICB3b3JkLWJyZWFrOiBicmVhay13b3JkOwogICAgYmFja2Ryb3AtZmlsdGVyOiBibHVyKDZweCk7CiAgICAtd2Via2l0LWJhY2tkcm9wLWZpbHRlcjogYmx1cig2cHgpOwogICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEyKTsKICAgIGJveC1zaGFkb3c6IDAgMnB4IDhweCByZ2JhKDAsIDAsIDAsIDAuNCk7Cn0KCi5tanItbWZ2LWdlbmluZm8tYyBzdHJvbmcsCi5tanItbWZ2LWdlbmluZm8tZCBzdHJvbmcgewogICAgZm9udC13ZWlnaHQ6IDYwMDsKICAgIG1hcmdpbi1yaWdodDogNHB4OwogICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC45NSk7Cn0KCi8qIFBlci1maWVsZCBsYWJlbCBjb2xvcnMgZm9yIEMvRCBnZW4gaW5mbyBvdmVybGF5cyAqLwoubWpyLW1mdi1nZW5pbmZvLWMgW2RhdGEtZmllbGQ9InByb21wdCJdIHN0cm9uZywKLm1qci1tZnYtZ2VuaW5mby1kIFtkYXRhLWZpZWxkPSJwcm9tcHQiXSBzdHJvbmcgewogICAgY29sb3I6ICM3ZWM4ZmY7Cn0KLm1qci1tZnYtZ2VuaW5mby1jIFtkYXRhLWZpZWxkPSJzZWVkIl0gc3Ryb25nLAoubWpyLW1mdi1nZW5pbmZvLWQgW2RhdGEtZmllbGQ9InNlZWQiXSBzdHJvbmcgewogICAgY29sb3I6ICNmZmQ0N2E7Cn0KLm1qci1tZnYtZ2VuaW5mby1jIFtkYXRhLWZpZWxkPSJtb2RlbCJdIHN0cm9uZywKLm1qci1tZnYtZ2VuaW5mby1kIFtkYXRhLWZpZWxkPSJtb2RlbCJdIHN0cm9uZyB7CiAgICBjb2xvcjogIzdkZGE4YTsKfQoubWpyLW1mdi1nZW5pbmZvLWMgW2RhdGEtZmllbGQ9ImxvcmEiXSBzdHJvbmcsCi5tanItbWZ2LWdlbmluZm8tZCBbZGF0YS1maWVsZD0ibG9yYSJdIHN0cm9uZyB7CiAgICBjb2xvcjogI2Q0OGNmZjsKfQoubWpyLW1mdi1nZW5pbmZvLWMgW2RhdGEtZmllbGQ9InNhbXBsZXIiXSBzdHJvbmcsCi5tanItbWZ2LWdlbmluZm8tZCBbZGF0YS1maWVsZD0ic2FtcGxlciJdIHN0cm9uZyB7CiAgICBjb2xvcjogI2ZmOWY3YTsKfQoubWpyLW1mdi1nZW5pbmZvLWMgW2RhdGEtZmllbGQ9InNjaGVkdWxlciJdIHN0cm9uZywKLm1qci1tZnYtZ2VuaW5mby1kIFtkYXRhLWZpZWxkPSJzY2hlZHVsZXIiXSBzdHJvbmcgewogICAgY29sb3I6ICNmZjdhOWY7Cn0KLm1qci1tZnYtZ2VuaW5mby1jIFtkYXRhLWZpZWxkPSJjZmciXSBzdHJvbmcsCi5tanItbWZ2LWdlbmluZm8tZCBbZGF0YS1maWVsZD0iY2ZnIl0gc3Ryb25nIHsKICAgIGNvbG9yOiAjN2E5ZmZmOwp9Ci5tanItbWZ2LWdlbmluZm8tYyBbZGF0YS1maWVsZD0ic3RlcCJdIHN0cm9uZywKLm1qci1tZnYtZ2VuaW5mby1kIFtkYXRhLWZpZWxkPSJzdGVwIl0gc3Ryb25nIHsKICAgIGNvbG9yOiAjN2FmZmQ0Owp9CgovKiBHZW4gaW5mbyBhY3RpdmUgc3RhdGUgLSBidXR0b24gZ2xvd3Mgd2hlbiBhdCBsZWFzdCBvbmUgZmllbGQgaXMgc2VsZWN0ZWQgKi8KLm1qci1tZnYgLm1qci1pY29uLWJ0bi5pcy1vbiB7CiAgICBib3JkZXItY29sb3I6IHJnYmEodmFyKC0tbWpyLWdyb3VwLWFjY2VudCwgOTUsIDE3OSwgMjU1KSwgMC41NSk7CiAgICBjb2xvcjogdmFyKC0tbWpyLWFjY2VudCwgIzVmYjNmZik7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMiwgIzMzMykgODAlLCB2YXIoLS1tanItYWNjZW50LCAjNWZiM2ZmKSAxNSUpOwogICAgYm94LXNoYWRvdzogMCAwIDAgMXB4IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYWNjZW50LCAjNWZiM2ZmKSAyNSUsIHRyYW5zcGFyZW50KTsKfQoKLm1qci1tZnYgLm1qci1pY29uLWJ0bi5pcy1vcGVuIHsKICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQsICM1ZmIzZmYpIDYyJSwgI2ZmZmZmZiAxMiUpOwogICAgY29sb3I6ICNlZWY3ZmY7CiAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoMTgwZGVnLCByZ2JhKDk1LCAxNzksIDI1NSwgMC4yOCksIHJnYmEoOTUsIDE3OSwgMjU1LCAwLjE0KSk7CiAgICBib3gtc2hhZG93OgogICAgICAgIGluc2V0IDAgMCAwIDFweCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDgpLAogICAgICAgIDAgMCAwIDFweCBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWFjY2VudCwgIzVmYjNmZikgMjYlLCB0cmFuc3BhcmVudCk7Cn0KCi5tanItbWZ2Lm1qci1tZnYtLXBvcHBlZCAubWpyLWljb24tYnRuLmlzLW9wZW4gewogICAgY29sb3I6ICNmZmZmZmYgIWltcG9ydGFudDsKfQoKLyogR2VuIGluZm8gZHJvcGRvd24gcGFuZWwgKi8KLm1qci1tZnYtZ2VuLWRyb3Bkb3duIHsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIHotaW5kZXg6IDEwMDAxOwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTEsICMyYTJhMmEpIDk2JSwgdHJhbnNwYXJlbnQpOwogICAgY29sb3I6IHZhcigtLWNvbnRlbnQtZmcsICNkZGQpOwogICAgcGFkZGluZzogNnB4IDRweDsKICAgIGJvcmRlci1yYWRpdXM6IDhweDsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMTk2LCAyMDIsIDIxMCwgMC4xOCk7CiAgICBib3gtc2hhZG93OgogICAgICAgIDAgOHB4IDI0cHggcmdiYSgwLCAwLCAwLCAwLjU1KSwKICAgICAgICAwIDJweCA2cHggcmdiYSgwLCAwLCAwLCAwLjMpOwogICAgZGlzcGxheTogbm9uZTsKICAgIG1pbi13aWR0aDogMTUwcHg7CiAgICBiYWNrZHJvcC1maWx0ZXI6IGJsdXIoOHB4KTsKICAgIC13ZWJraXQtYmFja2Ryb3AtZmlsdGVyOiBibHVyKDhweCk7Cn0KCi5tanItbWZ2LWdlbi1kcm9wZG93bjo6YmVmb3JlIHsKICAgIGNvbnRlbnQ6ICJHRU4gSU5GTyI7CiAgICBkaXNwbGF5OiBibG9jazsKICAgIGZvbnQtc2l6ZTogOXB4OwogICAgZm9udC13ZWlnaHQ6IDcwMDsKICAgIGxldHRlci1zcGFjaW5nOiAwLjhweDsKICAgIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMzUpOwogICAgcGFkZGluZzogMnB4IDEwcHggNnB4OwogICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHJnYmEoMTk2LCAyMDIsIDIxMCwgMC4xKTsKICAgIG1hcmdpbi1ib3R0b206IDRweDsKfQoKLm1qci1tZnYtZ2VuLWRyb3Bkb3duLmlzLXZpc2libGUgewogICAgZGlzcGxheTogYmxvY2s7Cn0KCi5tanItbWZ2LWdlbi1kcm9wZG93bi1yb3cgewogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBnYXA6IDhweDsKICAgIGZvbnQtc2l6ZTogMTJweDsKICAgIHBhZGRpbmc6IDVweCAxMHB4OwogICAgYm9yZGVyLXJhZGl1czogNXB4OwogICAgY3Vyc29yOiBwb2ludGVyOwogICAgdHJhbnNpdGlvbjogYmFja2dyb3VuZCAxMDBtcyBlYXNlOwogICAgdXNlci1zZWxlY3Q6IG5vbmU7Cn0KCi5tanItbWZ2LWdlbi1kcm9wZG93bi1yb3c6aG92ZXIgewogICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA3KTsKfQoKLm1qci1tZnYtZ2VuLWRyb3Bkb3duLXJvdyBpbnB1dFt0eXBlPSJjaGVja2JveCJdIHsKICAgIHdpZHRoOiAxM3B4OwogICAgaGVpZ2h0OiAxM3B4OwogICAgYWNjZW50LWNvbG9yOiB2YXIoLS1tanItYWNjZW50LCAjNWZiM2ZmKTsKICAgIGN1cnNvcjogcG9pbnRlcjsKICAgIGZsZXgtc2hyaW5rOiAwOwp9CgovKiBUcmFuc2Zvcm0gZm9yIHBhbi96b29tIC0gYXBwbGllZCBpbmxpbmUgZm9yIGR5bmFtaWMgdmFsdWVzICovCi5tanItbWZ2LW1lZGlhLS10cmFuc2Zvcm0gewogICAgdHJhbnNmb3JtLW9yaWdpbjogY2VudGVyOwp9CgovKiBDdXJzb3IgZmVlZGJhY2sgZm9yIHBhbi96b29tIGludGVyYWN0aW9ucyAqLwoubWpyLW1mdi1jb250ZW50LS1ncmFiIHsKICAgIGN1cnNvcjogZ3JhYjsKfQoKLm1qci1tZnYtY29udGVudC0tZ3JhYmJpbmcgewogICAgY3Vyc29yOiBncmFiYmluZzsKfQoKLyogU2lkZWJhciB0YWIgYnV0dG9uOiBhbGxvdyAyLWxpbmUgbGFiZWwgdmlhIFxuIGluIGxhYmVsIHN0cmluZyAqLwoubWFqb29yLWFzc2V0cy10YWItYnV0dG9uIC5zaWRlLWJhci1idXR0b24tbGFiZWwgewogICAgd2hpdGUtc3BhY2U6IHByZS1saW5lOwp9CgovKiBCb3R0b20tcGFuZWwgZ2VuZXJhdGVkIGZlZWQ6IGNvbXBhY3QgY2FyZHMgd2l0aCBvbmx5IHRoZSBnZW5lcmF0aW9uLXRpbWUgcGlsbCAqLwoubWpyLWJvdHRvbS1mZWVkIHsKICAgIG1pbi1oZWlnaHQ6IDA7CiAgICBvdmVyZmxvdzogaGlkZGVuOwp9CgoubWpyLWJvdHRvbS1mZWVkIC5tanItYW0tZ3JpZC1zY3JvbGwgewogICAgZmxleDogMSAxIGF1dG87CiAgICBtaW4taGVpZ2h0OiAwOwogICAgaGVpZ2h0OiAxMDAlOwogICAgb3ZlcmZsb3c6IGF1dG87CiAgICBzY3JvbGxiYXItZ3V0dGVyOiBzdGFibGU7CiAgICBvdmVyc2Nyb2xsLWJlaGF2aW9yLXk6IGNvbnRhaW47CiAgICAtd2Via2l0LW92ZXJmbG93LXNjcm9sbGluZzogdG91Y2g7CiAgICB0b3VjaC1hY3Rpb246IHBhbi15OwogICAgc2Nyb2xsLWJlaGF2aW9yOiBzbW9vdGg7CiAgICBzY3JvbGxiYXItd2lkdGg6IHRoaW47CiAgICBzY3JvbGxiYXItY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0yLCAjMmYzNTQwKSA3MCUsICM3ZjhlYTMgMzAlKQogICAgICAgIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0wLCAjMTYxOTFmKSA4OCUsICMwMDAgMTIlKTsKfQoKLm1qci1ib3R0b20tZmVlZCAubWpyLWFtLWdyaWQtc2Nyb2xsOjotd2Via2l0LXNjcm9sbGJhciwKLm1qci1mZWVkLWdyb3VwLXBvcG92ZXItZ3JpZDo6LXdlYmtpdC1zY3JvbGxiYXIgewogICAgd2lkdGg6IDEwcHg7CiAgICBoZWlnaHQ6IDEwcHg7Cn0KCi5tanItYm90dG9tLWZlZWQgLm1qci1hbS1ncmlkLXNjcm9sbDo6LXdlYmtpdC1zY3JvbGxiYXItdGh1bWIsCi5tanItZmVlZC1ncm91cC1wb3BvdmVyLWdyaWQ6Oi13ZWJraXQtc2Nyb2xsYmFyLXRodW1iIHsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0yLCAjMmYzNTQwKSA3MCUsICM3ZjhlYTMgMzAlKTsKICAgIGJvcmRlci1yYWRpdXM6IDk5OXB4OwogICAgYm9yZGVyOiAycHggc29saWQgdHJhbnNwYXJlbnQ7CiAgICBiYWNrZ3JvdW5kLWNsaXA6IHBhZGRpbmctYm94Owp9CgoubWpyLWJvdHRvbS1mZWVkIC5tanItYW0tZ3JpZC1zY3JvbGw6Oi13ZWJraXQtc2Nyb2xsYmFyLXRyYWNrLAoubWpyLWZlZWQtZ3JvdXAtcG9wb3Zlci1ncmlkOjotd2Via2l0LXNjcm9sbGJhci10cmFjayB7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMCwgIzE2MTkxZikgODglLCAjMDAwIDEyJSk7CiAgICBib3JkZXItcmFkaXVzOiA5OTlweDsKfQoKLm1qci1ib3R0b20tZmVlZCAubWpyLWdyaWQgewogICAgZ2FwOiA2cHggIWltcG9ydGFudDsKICAgIG1hcmdpbi10b3A6IDAgIWltcG9ydGFudDsKICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogcmVwZWF0KGF1dG8tZmlsbCwgbWlubWF4KG1pbigxMDAlLCAxMzJweCksIDFmcikpICFpbXBvcnRhbnQ7CiAgICBtaW4taGVpZ2h0OiAwOwogICAgaGVpZ2h0OiBhdXRvOwogICAgYWxpZ24tY29udGVudDogc3RhcnQ7Cn0KCi5tanItYm90dG9tLWZlZWQgLm1qci1jYXJkLAoubWpyLWJvdHRvbS1mZWVkIC5tanItYXNzZXQtY2FyZCB7CiAgICBib3JkZXItcmFkaXVzOiAxMnB4ICFpbXBvcnRhbnQ7CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTEpIDkyJSwgIzAwMCA4JSkgIWltcG9ydGFudDsKICAgIGJveC1zaGFkb3c6IDAgNnB4IDE4cHggcmdiYSgwLCAwLCAwLCAwLjIyKSAhaW1wb3J0YW50OwogICAgdHJhbnNmb3JtOiBub25lICFpbXBvcnRhbnQ7Cn0KCi5tanItYm90dG9tLWZlZWQgLm1qci1jYXJkOmhvdmVyLAoubWpyLWJvdHRvbS1mZWVkIC5tanItYXNzZXQtY2FyZDpob3ZlciB7CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTFweCkgIWltcG9ydGFudDsKICAgIGJveC1zaGFkb3c6IDAgMTBweCAyNHB4IHJnYmEoMCwgMCwgMCwgMC4yOCkgIWltcG9ydGFudDsKCiAgICAubWpyLWJvdHRvbS1mZWVkIC5tanItYXNzZXQtY2FyZC5pcy1zZWxlY3RlZCB7CiAgICAgICAgYm94LXNoYWRvdzoKICAgICAgICAgICAgMCAwIDAgM3B4IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItY2FyZC1zZWxlY3Rpb24tY29sb3IpIDgwJSwgdmFyKC0tY29udGVudC1mZykpLAogICAgICAgICAgICAwIDAgMCA2cHggY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1jYXJkLXNlbGVjdGlvbi1jb2xvcikgMzAlLCB0cmFuc3BhcmVudCksCiAgICAgICAgICAgIDAgMCAyMHB4IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItY2FyZC1zZWxlY3Rpb24tY29sb3IpIDQwJSwgdHJhbnNwYXJlbnQpLAogICAgICAgICAgICAwIDEwcHggMjhweCByZ2JhKDAsIDAsIDAsIDAuMjgpICFpbXBvcnRhbnQ7CiAgICAgICAgb3V0bGluZTogMnB4IHNvbGlkIHZhcigtLW1qci1jYXJkLXNlbGVjdGlvbi1jb2xvcikgIWltcG9ydGFudDsKICAgICAgICBvdmVyZmxvdzogdmlzaWJsZSAhaW1wb3J0YW50OwogICAgfQp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYXNzZXQtY2FyZFtkYXRhLW1qci1zdGFja2VkPSJ0cnVlIl0sCi5tanItYm90dG9tLWZlZWQgLm1qci1hc3NldC1jYXJkW2RhdGEtbWpyLXN0YWNrZWQ9InRydWUiXSB7CiAgICBvdmVyZmxvdzogdmlzaWJsZSAhaW1wb3J0YW50Owp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYXNzZXQtY2FyZFtkYXRhLW1qci1zdGFja2VkPSJ0cnVlIl0gLm1qci10aHVtYiwKLm1qci1ib3R0b20tZmVlZCAubWpyLWFzc2V0LWNhcmRbZGF0YS1tanItc3RhY2tlZD0idHJ1ZSJdIC5tanItdGh1bWIgewogICAgb3ZlcmZsb3c6IHZpc2libGUgIWltcG9ydGFudDsKICAgIGlzb2xhdGlvbjogaXNvbGF0ZTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFzc2V0LWNhcmRbZGF0YS1tanItc3RhY2tlZD0idHJ1ZSJdIC5tanItdGh1bWI6OmJlZm9yZSwKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFzc2V0LWNhcmRbZGF0YS1tanItc3RhY2tlZD0idHJ1ZSJdIC5tanItdGh1bWI6OmFmdGVyLAoubWpyLWJvdHRvbS1mZWVkIC5tanItYXNzZXQtY2FyZFtkYXRhLW1qci1zdGFja2VkPSJ0cnVlIl0gLm1qci10aHVtYjo6YmVmb3JlLAoubWpyLWJvdHRvbS1mZWVkIC5tanItYXNzZXQtY2FyZFtkYXRhLW1qci1zdGFja2VkPSJ0cnVlIl0gLm1qci10aHVtYjo6YWZ0ZXIgewogICAgY29udGVudDogIiI7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICBpbnNldDogMDsKICAgIGJvcmRlci1yYWRpdXM6IGluaGVyaXQ7CiAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgIHotaW5kZXg6IC0xOwogICAgdHJhbnNpdGlvbjoKICAgICAgICB0cmFuc2Zvcm0gMTQwbXMgZWFzZSwKICAgICAgICBvcGFjaXR5IDE0MG1zIGVhc2U7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hc3NldC1jYXJkW2RhdGEtbWpyLXN0YWNrZWQ9InRydWUiXSAubWpyLXRodW1iOjpiZWZvcmUsCi5tanItYm90dG9tLWZlZWQgLm1qci1hc3NldC1jYXJkW2RhdGEtbWpyLXN0YWNrZWQ9InRydWUiXSAubWpyLXRodW1iOjpiZWZvcmUgewogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoNXB4LCA1cHgpIHNjYWxlKDAuOTg1KTsKICAgIGJhY2tncm91bmQ6CiAgICAgICAgbGluZWFyLWdyYWRpZW50KDE4MGRlZywgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEpLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDMpKSwKICAgICAgICBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMSwgIzIwMjQyYikgODQlLCAjMDAwIDE2JSk7CiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDgpOwogICAgYm94LXNoYWRvdzogMCA4cHggMThweCByZ2JhKDAsIDAsIDAsIDAuMTYpOwogICAgb3BhY2l0eTogMC45Owp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYXNzZXQtY2FyZFtkYXRhLW1qci1zdGFja2VkPSJ0cnVlIl0gLm1qci10aHVtYjo6YWZ0ZXIsCi5tanItYm90dG9tLWZlZWQgLm1qci1hc3NldC1jYXJkW2RhdGEtbWpyLXN0YWNrZWQ9InRydWUiXSAubWpyLXRodW1iOjphZnRlciB7CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgxMHB4LCAxMHB4KSBzY2FsZSgwLjk3KTsKICAgIGJhY2tncm91bmQ6CiAgICAgICAgbGluZWFyLWdyYWRpZW50KDE4MGRlZywgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA2KSwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjAyKSksCiAgICAgICAgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTAsICMxNjE5MWYpIDgyJSwgIzAwMCAxOCUpOwogICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA2KTsKICAgIGJveC1zaGFkb3c6IDAgMTJweCAyMnB4IHJnYmEoMCwgMCwgMCwgMC4xNCk7CiAgICBvcGFjaXR5OiAwLjc1Owp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYXNzZXQtY2FyZFtkYXRhLW1qci1zdGFja2VkPSJ0cnVlIl06aG92ZXIgLm1qci10aHVtYjo6YmVmb3JlLAoubWpyLWJvdHRvbS1mZWVkIC5tanItYXNzZXQtY2FyZFtkYXRhLW1qci1zdGFja2VkPSJ0cnVlIl06aG92ZXIgLm1qci10aHVtYjo6YmVmb3JlIHsKICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlKDZweCwgNnB4KSBzY2FsZSgwLjk4NSk7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hc3NldC1jYXJkW2RhdGEtbWpyLXN0YWNrZWQ9InRydWUiXTpob3ZlciAubWpyLXRodW1iOjphZnRlciwKLm1qci1ib3R0b20tZmVlZCAubWpyLWFzc2V0LWNhcmRbZGF0YS1tanItc3RhY2tlZD0idHJ1ZSJdOmhvdmVyIC5tanItdGh1bWI6OmFmdGVyIHsKICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlKDEycHgsIDEycHgpIHNjYWxlKDAuOTcpOwp9CgoubWpyLWJvdHRvbS1mZWVkIC5tanItdGh1bWIgewogICAgYXNwZWN0LXJhdGlvOiAwLjk1IC8gMSAhaW1wb3J0YW50OwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTApIDcyJSwgIzAwMCAyOCUpICFpbXBvcnRhbnQ7Cn0KCi5tanItYm90dG9tLWZlZWQgLm1qci10aHVtYi1wbGF5IHsKICAgIGJhY2tncm91bmQ6IHJhZGlhbC1ncmFkaWVudCgKICAgICAgICBjaXJjbGUgYXQgY2VudGVyLAogICAgICAgIHJnYmEoMCwgMCwgMCwgMC4xOCksCiAgICAgICAgcmdiYSgwLCAwLCAwLCAwLjA0KSAzOCUsCiAgICAgICAgdHJhbnNwYXJlbnQgNzAlCiAgICApOwp9CgoubWpyLWJvdHRvbS1mZWVkIC5tanItYmFkZ2UtZXh0LAoubWpyLWJvdHRvbS1mZWVkIC5tanItYmFkZ2UtcmF0aW5nLAoubWpyLWJvdHRvbS1mZWVkIC5tanItYmFkZ2UtdGFncyB7CiAgICB0cmFuc2Zvcm06IHNjYWxlKDAuOTIpOwogICAgdHJhbnNmb3JtLW9yaWdpbjogdG9wIGxlZnQ7Cn0KCi8qIC0tIEZlZWQgY2FyZCBpbmZvOiBkZWZhdWx0IGhpZGRlbiwgdG9nZ2xlZCB2aWEgbWpyLWZlZWQtc2hvdy0qIGNsYXNzZXMgb24gLm1qci1ncmlkIC0tICovCi5tanItYm90dG9tLWZlZWQgLm1qci1jYXJkLWluZm8gewogICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50OwogICAgcGFkZGluZzogNHB4IDZweCAhaW1wb3J0YW50OwogICAgbWluLXdpZHRoOiAwOwp9Ci5tanItYm90dG9tLWZlZWQgLm1qci1ncmlkLm1qci1mZWVkLXNob3ctaW5mbyAubWpyLWNhcmQtaW5mbyB7CiAgICBkaXNwbGF5OiBibG9jayAhaW1wb3J0YW50Owp9CgovKiBGZWVkIGZpbGVuYW1lICovCi5tanItYm90dG9tLWZlZWQgLm1qci1jYXJkLWZpbGVuYW1lIHsKICAgIGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDsKfQoubWpyLWJvdHRvbS1mZWVkIC5tanItZ3JpZC5tanItZmVlZC1zaG93LWZpbGVuYW1lIC5tanItY2FyZC1maWxlbmFtZSB7CiAgICBkaXNwbGF5OiBibG9jayAhaW1wb3J0YW50Owp9CgovKiBGZWVkIGRpbWVuc2lvbnMgLyBkdXJhdGlvbiAqLwoubWpyLWJvdHRvbS1mZWVkIC5tanItbWV0YS1yZXMsCi5tanItYm90dG9tLWZlZWQgLm1qci1tZXRhLWR1cmF0aW9uIHsKICAgIGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDsKfQoubWpyLWJvdHRvbS1mZWVkIC5tanItZ3JpZC5tanItZmVlZC1zaG93LWRpbWVuc2lvbnMgLm1qci1tZXRhLXJlcywKLm1qci1ib3R0b20tZmVlZCAubWpyLWdyaWQubWpyLWZlZWQtc2hvdy1kaW1lbnNpb25zIC5tanItbWV0YS1kdXJhdGlvbiB7CiAgICBkaXNwbGF5OiBpbmxpbmUgIWltcG9ydGFudDsKfQoKLyogRmVlZCBkYXRlL3RpbWUgKi8KLm1qci1ib3R0b20tZmVlZCAubWpyLW1ldGEtZGF0ZSwKLm1qci1ib3R0b20tZmVlZCAubWpyLW1ldGEtdGltZS12YWwgewogICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50Owp9Ci5tanItYm90dG9tLWZlZWQgLm1qci1ncmlkLm1qci1mZWVkLXNob3ctZGF0ZSAubWpyLW1ldGEtZGF0ZSwKLm1qci1ib3R0b20tZmVlZCAubWpyLWdyaWQubWpyLWZlZWQtc2hvdy1kYXRlIC5tanItbWV0YS10aW1lLXZhbCB7CiAgICBkaXNwbGF5OiBpbmxpbmUgIWltcG9ydGFudDsKfQoKLyogRmVlZCBnZW5lcmF0aW9uIHRpbWUgYmFkZ2UgKi8KLm1qci1ib3R0b20tZmVlZCAubWpyLW1ldGEtZ2VudGltZSB7CiAgICBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7Cn0KLm1qci1ib3R0b20tZmVlZCAubWpyLWdyaWQubWpyLWZlZWQtc2hvdy1nZW50aW1lIC5tanItbWV0YS1nZW50aW1lIHsKICAgIGRpc3BsYXk6IGlubGluZS1mbGV4ICFpbXBvcnRhbnQ7Cn0KCi8qIEZlZWQgd29ya2Zsb3cgZG90ICovCi5tanItYm90dG9tLWZlZWQgLm1qci1jYXJkLWRvdC13cmFwcGVyIHsKICAgIGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDsKfQoubWpyLWJvdHRvbS1mZWVkIC5tanItZ3JpZC5tanItZmVlZC1zaG93LWRvdCAubWpyLWNhcmQtZG90LXdyYXBwZXIgewogICAgZGlzcGxheTogaW5saW5lLWZsZXggIWltcG9ydGFudDsKfQoKLyogRmVlZCBiYWRnZXMgKi8KLm1qci1ib3R0b20tZmVlZCAubWpyLWJhZGdlLWV4dCB7CiAgICBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7Cn0KLm1qci1ib3R0b20tZmVlZCAubWpyLWdyaWQubWpyLWZlZWQtc2hvdy1iYWRnZXMtZXh0IC5tanItYmFkZ2UtZXh0IHsKICAgIGRpc3BsYXk6IGZsZXggIWltcG9ydGFudDsKfQoKLm1qci1ib3R0b20tZmVlZCAubWpyLWJhZGdlLXJhdGluZyB7CiAgICBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7Cn0KLm1qci1ib3R0b20tZmVlZCAubWpyLWdyaWQubWpyLWZlZWQtc2hvdy1iYWRnZXMtcmF0aW5nIC5tanItYmFkZ2UtcmF0aW5nIHsKICAgIGRpc3BsYXk6IGZsZXggIWltcG9ydGFudDsKfQoKLm1qci1ib3R0b20tZmVlZCAubWpyLWJhZGdlLXRhZ3MgewogICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50Owp9Ci5tanItYm90dG9tLWZlZWQgLm1qci1ncmlkLm1qci1mZWVkLXNob3ctYmFkZ2VzLXRhZ3MgLm1qci1iYWRnZS10YWdzIHsKICAgIGRpc3BsYXk6IGZsZXggIWltcG9ydGFudDsKfQoKLyogRmVlZCBtZXRhIHJvdyBzdHlsaW5nIC0gZmxleCBsYXlvdXQgc28gdmlzaWJsZSBpdGVtcyBzdGF5IHNlcGFyYXRlZCAqLwoubWpyLWJvdHRvbS1mZWVkIC5tanItY2FyZC1tZXRhLXJvdyB7CiAgICBkaXNwbGF5OiBmbGV4ICFpbXBvcnRhbnQ7CiAgICBmbGV4LXdyYXA6IG5vd3JhcCAhaW1wb3J0YW50OwogICAgYWxpZ24taXRlbXM6IGNlbnRlciAhaW1wb3J0YW50OwogICAgZ2FwOiA1cHggIWltcG9ydGFudDsKICAgIG92ZXJmbG93OiBoaWRkZW4gIWltcG9ydGFudDsKICAgIG1pbi13aWR0aDogMCAhaW1wb3J0YW50OwogICAgcGFkZGluZy1yaWdodDogMCAhaW1wb3J0YW50OwogICAgbGluZS1oZWlnaHQ6IDEuMyAhaW1wb3J0YW50OwogICAgb3BhY2l0eTogMC43OCAhaW1wb3J0YW50OwogICAgZm9udC1zaXplOiAwLjhlbSAhaW1wb3J0YW50OwogICAgLyogdGV4dC1vdmVyZmxvdyBlbGxpcHNpcyBkb2Vzbid0IGFwcGx5IG9uIGEgZmxleCBjb250YWluZXIgaXRzZWxmICovCn0KLyogRWFjaCBtZXRhIHNwYW4gdHJ1bmNhdGVzIGluZGl2aWR1YWxseSBpZiB0b28gbG9uZyAqLwoubWpyLWJvdHRvbS1mZWVkIC5tanItY2FyZC1tZXRhLXJvdyA+IHNwYW4gewogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKICAgIG1pbi13aWR0aDogMDsKICAgIGZsZXgtc2hyaW5rOiAxOwp9Ci8qIEdlbnRpbWUgYmFkZ2UgYW5kIHRpbWUgdmFsdWUgc2hvdWxkIHN0YXkgdmlzaWJsZSAoZG9uJ3Qgc2hyaW5rIGF3YXkpICovCi5tanItYm90dG9tLWZlZWQgLm1qci1jYXJkLW1ldGEtcm93ID4gLm1qci1tZXRhLWdlbnRpbWUsCi5tanItYm90dG9tLWZlZWQgLm1qci1jYXJkLW1ldGEtcm93ID4gLm1qci1tZXRhLXRpbWUtdmFsIHsKICAgIGZsZXgtc2hyaW5rOiAwOwp9CgoubWpyLWJvdHRvbS1mZWVkIC5tanItZ3JpZC5tanItZmVlZC1zaG93LWdlbnRpbWUgLm1qci1tZXRhLWdlbnRpbWUgewogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogM3B4OwogICAgcGFkZGluZzogM3B4IDdweDsKICAgIGJvcmRlci1yYWRpdXM6IDk5OXB4OwogICAgYmFja2dyb3VuZDogcmdiYSgxMCwgMTQsIDIwLCAwLjc0KTsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xMik7CiAgICBib3gtc2hhZG93OiAwIDJweCA4cHggcmdiYSgwLCAwLCAwLCAwLjIyKTsKICAgIGZvbnQtc2l6ZTogMTBweDsKICAgIGZvbnQtd2VpZ2h0OiA4MDAgIWltcG9ydGFudDsKICAgIGxldHRlci1zcGFjaW5nOiAwLjAxNWVtOwogICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC45OCk7CiAgICB0ZXh0LXNoYWRvdzoKICAgICAgICAwIDFweCAycHggcmdiYSgwLCAwLCAwLCAwLjkpLAogICAgICAgIDAgMCAxMHB4IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xNik7CiAgICBiYWNrZHJvcC1maWx0ZXI6IGJsdXIoNnB4KTsKICAgIC13ZWJraXQtYmFja2Ryb3AtZmlsdGVyOiBibHVyKDZweCk7Cn0KCi8qIC0tIEF1ZGlvIC8gM0QgcGxhY2Vob2xkZXIgdGh1bWJuYWlscyBpbiB0aGUgZmVlZCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgovKiBBdWRpbyBjYXJkcyBzaG93IHRoZSB3YXZlZm9ybSBzcHJpdGU7IGdpdmUgaXQgYSBkaXN0aW5jdCBiYWNrZ3JvdW5kIHNvIGl0CiAgIGRvZXNuJ3QgbG9vayBsaWtlIGEgYnJva2VuIGltYWdlIHBsYWNlaG9sZGVyIGluIHRoZSBmZWVkLiAqLwoubWpyLWJvdHRvbS1mZWVkIC5tanItYXNzZXQtY2FyZFtkYXRhLW1qci1raW5kPSJhdWRpbyJdIC5tanItdGh1bWIsCi5tanItYm90dG9tLWZlZWQgLm1qci1hc3NldC1jYXJkW2RhdGEtbWpyLWV4dD0ibXAzIl0gLm1qci10aHVtYiwKLm1qci1ib3R0b20tZmVlZCAubWpyLWFzc2V0LWNhcmRbZGF0YS1tanItZXh0PSJ3YXYiXSAubWpyLXRodW1iLAoubWpyLWJvdHRvbS1mZWVkIC5tanItYXNzZXQtY2FyZFtkYXRhLW1qci1leHQ9Im9nZyJdIC5tanItdGh1bWIsCi5tanItYm90dG9tLWZlZWQgLm1qci1hc3NldC1jYXJkW2RhdGEtbWpyLWV4dD0iZmxhYyJdIC5tanItdGh1bWIgewogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTApIDYwJSwgIzFhMWYyYiA0MCUpICFpbXBvcnRhbnQ7Cn0KCi8qIDNEIG1vZGVsIGNhcmRzIHVzZSBhbiBpY29uIHBsYWNlaG9sZGVyIC0gYWRkIGEgc3VidGxlIGdyYWRpZW50IHNvIHRoZXkgcmVhZAogICBhcyBpbnRlbnRpb25hbCByYXRoZXIgdGhhbiBtaXNzaW5nLiAqLwoubWpyLWJvdHRvbS1mZWVkIC5tanItYXNzZXQtY2FyZFtkYXRhLW1qci1raW5kPSJtb2RlbDNkIl0gLm1qci10aHVtYiwKLm1qci1ib3R0b20tZmVlZCAubWpyLWFzc2V0LWNhcmRbZGF0YS1tanItZXh0PSJnbGIiXSAubWpyLXRodW1iLAoubWpyLWJvdHRvbS1mZWVkIC5tanItYXNzZXQtY2FyZFtkYXRhLW1qci1leHQ9ImdsdGYiXSAubWpyLXRodW1iLAoubWpyLWJvdHRvbS1mZWVkIC5tanItYXNzZXQtY2FyZFtkYXRhLW1qci1leHQ9Im9iaiJdIC5tanItdGh1bWIsCi5tanItYm90dG9tLWZlZWQgLm1qci1hc3NldC1jYXJkW2RhdGEtbWpyLWV4dD0iZmJ4Il0gLm1qci10aHVtYiB7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMCkgNTAlLCAjMGQxMTE3IDUwJSkgIWltcG9ydGFudDsKfQoKLyogLS0gRmVlZCBncm91cCBidXR0b24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgoubWpyLWJvdHRvbS1mZWVkIC5tanItZmVlZC1ncm91cC1idXR0b24gewogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgdG9wOiAzNHB4OwogICAgcmlnaHQ6IDZweDsKICAgIHotaW5kZXg6IDExOwogICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICBnYXA6IDRweDsKICAgIG1pbi13aWR0aDogMjhweDsKICAgIG1pbi1oZWlnaHQ6IDI4cHg7CiAgICBwYWRkaW5nOiA0cHggOHB4OwogICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE0KTsKICAgIGJvcmRlci1yYWRpdXM6IDk5OXB4OwogICAgYmFja2dyb3VuZDogcmdiYSgxMCwgMTQsIDIwLCAwLjc0KTsKICAgIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuOTYpOwogICAgZm9udC1zaXplOiAxMHB4OwogICAgZm9udC13ZWlnaHQ6IDcwMDsKICAgIGxpbmUtaGVpZ2h0OiAxOwogICAgYm94LXNoYWRvdzogMCAycHggOHB4IHJnYmEoMCwgMCwgMCwgMC4yNCk7CiAgICBiYWNrZHJvcC1maWx0ZXI6IGJsdXIoNnB4KTsKICAgIC13ZWJraXQtYmFja2Ryb3AtZmlsdGVyOiBibHVyKDZweCk7CiAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICB0b3VjaC1hY3Rpb246IG1hbmlwdWxhdGlvbjsKICAgIHRyYW5zaXRpb246CiAgICAgICAgYmFja2dyb3VuZCAxMjBtcyBlYXNlLAogICAgICAgIHRyYW5zZm9ybSA4MG1zIGVhc2U7Cn0KCi5tanItYm90dG9tLWZlZWQgLm1qci1mZWVkLWdyb3VwLWJ1dHRvbjpob3ZlciB7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDE4LCAyNCwgMzQsIDAuOSk7Cn0KCi5tanItZmVlZC1ncm91cC1idXR0b24taWNvbiB7CiAgICBmb250LXNpemU6IDExcHg7CiAgICBvcGFjaXR5OiAwLjk7Cn0KCi5tanItZmVlZC1ncm91cC1idXR0b24tY291bnQgewogICAgZm9udC1zaXplOiAxMHB4OwogICAgZm9udC13ZWlnaHQ6IDcwMDsKICAgIGxpbmUtaGVpZ2h0OiAxOwp9CgovKiAtLSBGZWVkIGdyb3VwIHBvcG92ZXIgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCi5tanItZmVlZC1ncm91cC1wb3BvdmVyIHsKICAgIGJhY2tncm91bmQ6IHZhcigtLWNvbWZ5LW1lbnUtYmcsICMyMjIpOwogICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyLWNvbG9yLCAjM2EzYTNhKTsKICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLW1qci1yLWxnLCA4cHgpOwogICAgYm94LXNoYWRvdzogMCA4cHggMjhweCByZ2JhKDAsIDAsIDAsIDAuNDUpOwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKfQoKLm1qci1mZWVkLWdyb3VwLXBvcG92ZXItdGl0bGUgewogICAgcGFkZGluZzogOHB4IDEwcHggNHB4OwogICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wNik7CiAgICBtYXJnaW4tYm90dG9tOiA4cHg7Cn0KCi5tanItZmVlZC1ncm91cC1wb3BvdmVyLWdyaWQgewogICAgcGFkZGluZzogNHB4IDhweCAxMHB4OwogICAgbWF4LWhlaWdodDogMzYwcHg7CiAgICBvdmVyZmxvdy15OiBhdXRvOwogICAgb3ZlcnNjcm9sbC1iZWhhdmlvcjogY29udGFpbjsKICAgIHNjcm9sbGJhci1ndXR0ZXI6IHN0YWJsZTsKICAgIHNjcm9sbGJhci13aWR0aDogdGhpbjsKICAgIHNjcm9sbGJhci1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTIsICMyZjM1NDApIDcwJSwgIzdmOGVhMyAzMCUpCiAgICAgICAgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTAsICMxNjE5MWYpIDg4JSwgIzAwMCAxMiUpOwp9CgoubWpyLWZlZWQtZ3JvdXAtYnV0dG9uLWljb24sCi5tanItZmVlZC1ncm91cC1idXR0b24tY291bnQgewogICAgcG9pbnRlci1ldmVudHM6IG5vbmU7Cn0KCi5tanItZmVlZC1ncm91cC1tZW1iZXItY2FyZCB7CiAgICBtaW4td2lkdGg6IDA7Cn0KCi5tanItZmVlZC1ncm91cC1tZW1iZXItY2FyZCAubWpyLXRodW1iIHsKICAgIGFzcGVjdC1yYXRpbzogMSAvIDEgIWltcG9ydGFudDsKfQoKLm1qci1mZWVkLWdyb3VwLW1lbWJlci1jYXJkIC5tanItY2FyZC1pbmZvIHsKICAgIGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLXN0YWNrLWdyb3VwLWJ1dHRvbiB7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICB0b3A6IDM0cHg7CiAgICByaWdodDogNnB4OwogICAgei1pbmRleDogMTE7CiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgIGdhcDogNHB4OwogICAgbWluLXdpZHRoOiAyOHB4OwogICAgbWluLWhlaWdodDogMjhweDsKICAgIHBhZGRpbmc6IDRweCA4cHg7CiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTQpOwogICAgYm9yZGVyLXJhZGl1czogOTk5cHg7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDEwLCAxNCwgMjAsIDAuNzQpOwogICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC45Nik7CiAgICBsaW5lLWhlaWdodDogMTsKICAgIGJveC1zaGFkb3c6IDAgMnB4IDhweCByZ2JhKDAsIDAsIDAsIDAuMjQpOwogICAgYmFja2Ryb3AtZmlsdGVyOiBibHVyKDZweCk7CiAgICAtd2Via2l0LWJhY2tkcm9wLWZpbHRlcjogYmx1cig2cHgpOwogICAgY3Vyc29yOiBwb2ludGVyOwogICAgdG91Y2gtYWN0aW9uOiBtYW5pcHVsYXRpb247CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVooMCk7CiAgICB0cmFuc2l0aW9uOgogICAgICAgIGJhY2tncm91bmQgMTIwbXMgZWFzZSwKICAgICAgICB0cmFuc2Zvcm0gODBtcyBlYXNlOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItc3RhY2stZ3JvdXAtYnV0dG9uOmhvdmVyIHsKICAgIGJhY2tncm91bmQ6IHJnYmEoMTgsIDI0LCAzNCwgMC45KTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLXN0YWNrLWdyb3VwLWJ1dHRvbiA+ICogewogICAgcG9pbnRlci1ldmVudHM6IG5vbmU7Cn0KCi5tanItZmlsbXN0cmlwOjotd2Via2l0LXNjcm9sbGJhciB7CiAgICB3aWR0aDogNHB4OwogICAgaGVpZ2h0OiA0cHg7Cn0KCi5tanItZmlsbXN0cmlwOjotd2Via2l0LXNjcm9sbGJhci10cmFjayB7CiAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsKfQoKLm1qci1maWxtc3RyaXA6Oi13ZWJraXQtc2Nyb2xsYmFyLXRodW1iIHsKICAgIGJvcmRlci1yYWRpdXM6IDk5OXB4OwogICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE0KTsKfQoKLm1qci1maWxtc3RyaXA6aG92ZXI6Oi13ZWJraXQtc2Nyb2xsYmFyLXRodW1iIHsKICAgIGJhY2tncm91bmQ6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4yMik7Cn0KCi5tanItZmlsbXN0cmlwLWF1ZGlvLXRodW1iIHsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIGluc2V0OiAwOwogICAgZGlzcGxheTogZmxleDsKICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICBnYXA6IDVweDsKICAgIHBhZGRpbmc6IDdweDsKICAgIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuODIpOwogICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICBiYWNrZ3JvdW5kOgogICAgICAgIHJhZGlhbC1ncmFkaWVudChjaXJjbGUgYXQgMjQlIDI0JSwgcmdiYSg3OCwgMTg0LCAyNTUsIDAuMjgpLCB0cmFuc3BhcmVudCA0MiUpLAogICAgICAgIHJhZGlhbC1ncmFkaWVudChjaXJjbGUgYXQgODQlIDcwJSwgcmdiYSg4MiwgMjIwLCAxNTYsIDAuMTgpLCB0cmFuc3BhcmVudCA0MCUpLAogICAgICAgIGxpbmVhci1ncmFkaWVudCgxMzVkZWcsIHJnYmEoMTgsIDI1LCAzNSwgMC45NiksIHJnYmEoNywgMTAsIDE1LCAwLjk4KSk7Cn0KCi5tanItZmlsbXN0cmlwLWF1ZGlvLXdhdmVmb3JtIHsKICAgIHdpZHRoOiA3NiU7CiAgICBoZWlnaHQ6IDI0cHg7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgZ2FwOiAycHg7Cn0KCi5tanItZmlsbXN0cmlwLWF1ZGlvLXdhdmVmb3JtIHNwYW4gewogICAgd2lkdGg6IDJweDsKICAgIG1pbi1oZWlnaHQ6IDRweDsKICAgIGJvcmRlci1yYWRpdXM6IDk5OXB4OwogICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KDE4MGRlZywgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjk0KSwgcmdiYSgxNDgsIDIxOCwgMjU1LCAwLjY4KSk7Cn0KCi5tanItZmlsbXN0cmlwLWF1ZGlvLWxhYmVsIHsKICAgIG1heC13aWR0aDogMTAwJTsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICBwYWRkaW5nOiAycHggNXB4OwogICAgYm9yZGVyLXJhZGl1czogOTk5cHg7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIDAuMjgpOwogICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEpOwogICAgZm9udC1zaXplOiA3cHg7CiAgICBmb250LXdlaWdodDogODAwOwogICAgbGluZS1oZWlnaHQ6IDE7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1zdGFjay1ncm91cC1idXR0b24tY291bnQgewogICAgZm9udC1zaXplOiAxMHB4OwogICAgZm9udC13ZWlnaHQ6IDcwMDsKICAgIGxpbmUtaGVpZ2h0OiAxOwp9CgovKiAtLSBEdXBsaWNhdGUgc3RhY2sgYnV0dG9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwovKiBTaG93cyBvbiB0aGUgcHJpbWFyeSBjYXJkIHdoZW4gc2FtZS1maWxlbmFtZSBkdXBsaWNhdGVzIGV4aXN0LiAgICAgICAgICAgICAqLwovKiBQb3NpdGlvbmVkIGF0IGJvdHRvbS1yaWdodCB0byBub3Qgb3ZlcmxhcCB0aGUgc3RhY2stZ3JvdXAgYnV0dG9uICh0b3AtcmlnaHQpLiAqLwoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItZHVwLXN0YWNrLWJ1dHRvbiB7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICBib3R0b206IDMwcHg7CiAgICByaWdodDogNnB4OwogICAgei1pbmRleDogMTE7CiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgIGdhcDogNHB4OwogICAgbWluLXdpZHRoOiAyOHB4OwogICAgbWluLWhlaWdodDogMjhweDsKICAgIHBhZGRpbmc6IDRweCA4cHg7CiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDI1NSwgMTgwLCAwLCAwLjM4KTsKICAgIGJvcmRlci1yYWRpdXM6IDk5OXB4OwogICAgYmFja2dyb3VuZDogcmdiYSgzMCwgMTgsIDAsIDAuODIpOwogICAgY29sb3I6IHJnYmEoMjU1LCAyMDAsIDYwLCAwLjk2KTsKICAgIGJveC1zaGFkb3c6IDAgMnB4IDhweCByZ2JhKDAsIDAsIDAsIDAuMzIpOwogICAgYmFja2Ryb3AtZmlsdGVyOiBibHVyKDZweCk7CiAgICAtd2Via2l0LWJhY2tkcm9wLWZpbHRlcjogYmx1cig2cHgpOwogICAgY3Vyc29yOiBwb2ludGVyOwogICAgZm9udC1zaXplOiAxMXB4OwogICAgbGluZS1oZWlnaHQ6IDE7CiAgICB0b3VjaC1hY3Rpb246IG1hbmlwdWxhdGlvbjsKICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWigwKTsKICAgIHRyYW5zaXRpb246CiAgICAgICAgYmFja2dyb3VuZCAwLjE1cywKICAgICAgICB0cmFuc2Zvcm0gODBtcyBlYXNlOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItZHVwLXN0YWNrLWJ1dHRvbjpob3ZlciB7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDUwLCAzMCwgMCwgMC45NCk7CiAgICBib3JkZXItY29sb3I6IHJnYmEoMjU1LCAxODAsIDAsIDAuNik7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1kdXAtc3RhY2stYnV0dG9uID4gKiB7CiAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWR1cC1zdGFjay1jb3VudCB7CiAgICBmb250LXNpemU6IDEwcHg7CiAgICBmb250LXdlaWdodDogNzAwOwogICAgbGluZS1oZWlnaHQ6IDE7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hc3NldC1jYXJkW2RhdGEtbWpyLWR1cC1zdGFja2VkPSJ0cnVlIl0gLm1qci1kdXAtc3RhY2stYnV0dG9uIHsKICAgIGJveC1zaGFkb3c6CiAgICAgICAgMCAycHggOHB4IHJnYmEoMCwgMCwgMCwgMC4zMiksCiAgICAgICAgMCAwIDAgMXB4IHJnYmEoMjU1LCAxODAsIDAsIDAuMik7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hc3NldC1jYXJkW2RhdGEtbWpyLXN0YWNrZWQ9InRydWUiXSAubWpyLXN0YWNrLWdyb3VwLWJ1dHRvbiwKLm1qci1ib3R0b20tZmVlZCAubWpyLWFzc2V0LWNhcmRbZGF0YS1tanItc3RhY2tlZD0idHJ1ZSJdIC5tanItZmVlZC1ncm91cC1idXR0b24gewogICAgYm94LXNoYWRvdzoKICAgICAgICAwIDJweCA4cHggcmdiYSgwLCAwLCAwLCAwLjI0KSwKICAgICAgICAwIDAgMCAxcHggcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA0KTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFzc2V0LWNhcmRbZGF0YS1tanItc3RhY2tlZD0idHJ1ZSJdOmhvdmVyLAoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYXNzZXQtY2FyZFtkYXRhLW1qci1kdXAtc3RhY2tlZD0idHJ1ZSJdOmhvdmVyIHsKICAgIHRyYW5zZm9ybTogbm9uZSAhaW1wb3J0YW50Owp9CgovKiAtLSBWaXN1YWwgc3RhY2tpbmcgZWZmZWN0IC0gbGF5ZXJlZCBjYXJkcyBiZWhpbmQgdGhlIG1haW4gY2FyZCAtLS0tLS0tLS0tLS0gKi8KLyogQ3JlYXRlcyBwc2V1ZG8tZWxlbWVudCAiY2FyZHMiIG9mZnNldCBiZWhpbmQgdGhlIHByaW1hcnkgY2FyZCB0byB2aXN1YWxseSAgICAqLwovKiBjb21tdW5pY2F0ZSB0aGF0IHRoaXMgY2FyZCByZXByZXNlbnRzIGEgZ3JvdXAgb2YgbXVsdGlwbGUgaW1hZ2VzLiAgICAgICAgICAgICovCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hc3NldC1jYXJkW2RhdGEtbWpyLXN0YWNrZWQ9InRydWUiXSB7CiAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICB6LWluZGV4OiAxOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYXNzZXQtY2FyZFtkYXRhLW1qci1zdGFja2VkPSJ0cnVlIl06OmJlZm9yZSwKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFzc2V0LWNhcmRbZGF0YS1tanItc3RhY2tlZD0idHJ1ZSJdOjphZnRlciB7CiAgICBjb250ZW50OiAiIjsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIGluc2V0OiAwOwogICAgYm9yZGVyLXJhZGl1czogaW5oZXJpdDsKICAgIGJhY2tncm91bmQ6IHZhcigtLWNvbWZ5LW1lbnUtYmcsICMxYTFhMmUpOwogICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA2KTsKICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgei1pbmRleDogLTE7CiAgICB0cmFuc2l0aW9uOgogICAgICAgIHRyYW5zZm9ybSAxODBtcyBlYXNlLAogICAgICAgIG9wYWNpdHkgMTgwbXMgZWFzZTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFzc2V0LWNhcmRbZGF0YS1tanItc3RhY2tlZD0idHJ1ZSJdOjpiZWZvcmUgewogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoM3B4LCAzcHgpIHJvdGF0ZSgxZGVnKTsKICAgIG9wYWNpdHk6IDAuNDU7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hc3NldC1jYXJkW2RhdGEtbWpyLXN0YWNrZWQ9InRydWUiXTo6YWZ0ZXIgewogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoNnB4LCA2cHgpIHJvdGF0ZSgyLjJkZWcpOwogICAgb3BhY2l0eTogMC4yNTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFzc2V0LWNhcmRbZGF0YS1tanItc3RhY2tlZD0idHJ1ZSJdOmhvdmVyOjpiZWZvcmUgewogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoNHB4LCA0cHgpIHJvdGF0ZSgxLjVkZWcpOwogICAgb3BhY2l0eTogMC41NTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFzc2V0LWNhcmRbZGF0YS1tanItc3RhY2tlZD0idHJ1ZSJdOmhvdmVyOjphZnRlciB7CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSg4cHgsIDhweCkgcm90YXRlKDNkZWcpOwogICAgb3BhY2l0eTogMC4zNTsKfQoKLm1qci1zdGFjay1ncm91cC1wb3BvdmVyIHsKICAgIHdpZHRoOiBtaW4oNDQwcHgsIDkydncpOwp9CgoubWpyLXN0YWNrLWdyb3VwLW1lbWJlci1jYXJkIHsKICAgIG1pbi13aWR0aDogMDsKfQoKLm1qci1zdGFjay1ncm91cC1tZW1iZXItY2FyZCAubWpyLXRodW1iIHsKICAgIGFzcGVjdC1yYXRpbzogMSAvIDEgIWltcG9ydGFudDsKfQoKLm1qci1zdGFjay1ncm91cC1tZW1iZXItY2FyZCAubWpyLWNhcmQtaW5mbyB7CiAgICBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7Cn0KCi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogKiBMaWdodCBtb2RlIG92ZXJyaWRlcyAoQ29tZnlVSSB2MS40MisgaW1wcm92ZWQgbGlnaHQgdGhlbWUpCiAqIFVzZXMgQ29tZnlVSSBkYXRhLXRoZW1lIGF0dHJpYnV0ZSB3aGVuIHNldCwgd2l0aAogKiBwcmVmZXJzLWNvbG9yLXNjaGVtZSBhcyBhIGZhbGxiYWNrIGZvciBvbGRlciB2ZXJzaW9ucy4KICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCgovKiBDb21meVVJIHNldHMgZGF0YS10aGVtZT0ibGlnaHQiIG9uIDxodG1sPiBvciA8Ym9keT4gKi8KOmlzKFtkYXRhLXRoZW1lPSJsaWdodCJdLCBbZGF0YS1jb2xvci1zY2hlbWU9ImxpZ2h0Il0pIC5tanItYXNzZXRzLW1hbmFnZXIsCjppcyhbZGF0YS10aGVtZT0ibGlnaHQiXSwgW2RhdGEtY29sb3Itc2NoZW1lPSJsaWdodCJdKSAubWpyLXBvcG92ZXIgewogICAgLS1tanItc3VyZmFjZS0wOiB2YXIoLS1pbnRlcmZhY2UtcGFuZWwtc3VyZmFjZSwgI2YwZjBmMCk7CiAgICAtLW1qci1zdXJmYWNlLTE6IHZhcigtLWludGVyZmFjZS1tZW51LXN1cmZhY2UsICNmYWZhZmEpOwogICAgLS1tanItc3VyZmFjZS0yOiB2YXIoLS1pbnRlcmZhY2UtcGFuZWwtaG92ZXItc3VyZmFjZSwgI2U4ZThlOCk7CiAgICAtLW1qci1zdXJmYWNlLTM6IHZhcigtLW1vZGFsLWNhcmQtYmFja2dyb3VuZCwgI2ZmZmZmZik7CiAgICAtLW1qci1ib3JkZXI6IHZhcigtLWJvcmRlci1kZWZhdWx0LCByZ2JhKDAsIDAsIDAsIDAuMTQpKTsKICAgIC0tbWpyLW11dGVkOiB2YXIoLS1tdXRlZC1mb3JlZ3JvdW5kLCByZ2JhKDAsIDAsIDAsIDAuNTUpKTsKICAgIC0tbWpyLWNhcmQtaG92ZXItY29sb3I6IHZhcigtLWludGVyZmFjZS1wYW5lbC1ob3Zlci1zdXJmYWNlLCAjZTBlMGUwKTsKfQoKQG1lZGlhIChwcmVmZXJzLWNvbG9yLXNjaGVtZTogbGlnaHQpIHsKICAgIC8qIEZhbGxiYWNrOiBvbmx5IGFwcGx5IGlmIENvbWZ5VUkgaGFzbid0IHNldCBhbiBleHBsaWNpdCBkYXRhLXRoZW1lICovCiAgICAubWpyLWFzc2V0cy1tYW5hZ2VyOm5vdChbZGF0YS10aGVtZS1hcHBsaWVkXSksCiAgICAubWpyLXBvcG92ZXI6bm90KFtkYXRhLXRoZW1lLWFwcGxpZWRdKSB7CiAgICAgICAgLS1tanItc3VyZmFjZS0wOiB2YXIoLS1pbnRlcmZhY2UtcGFuZWwtc3VyZmFjZSwgI2YwZjBmMCk7CiAgICAgICAgLS1tanItc3VyZmFjZS0xOiB2YXIoLS1pbnRlcmZhY2UtbWVudS1zdXJmYWNlLCAjZmFmYWZhKTsKICAgICAgICAtLW1qci1zdXJmYWNlLTI6IHZhcigtLWludGVyZmFjZS1wYW5lbC1ob3Zlci1zdXJmYWNlLCAjZThlOGU4KTsKICAgICAgICAtLW1qci1zdXJmYWNlLTM6IHZhcigtLW1vZGFsLWNhcmQtYmFja2dyb3VuZCwgI2ZmZmZmZik7CiAgICAgICAgLS1tanItYm9yZGVyOiB2YXIoLS1ib3JkZXItZGVmYXVsdCwgcmdiYSgwLCAwLCAwLCAwLjE0KSk7CiAgICAgICAgLS1tanItbXV0ZWQ6IHZhcigtLW11dGVkLWZvcmVncm91bmQsIHJnYmEoMCwgMCwgMCwgMC41NSkpOwogICAgICAgIC0tbWpyLWNhcmQtaG92ZXItY29sb3I6IHZhcigtLWludGVyZmFjZS1wYW5lbC1ob3Zlci1zdXJmYWNlLCAjZTBlMGUwKTsKICAgIH0KfQoKLyogLS0tIFNrZWxldG9uIGxvYWRlcnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCi5tanItY2FyZC1za2VsZXRvbiB7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1tanItc3VyZmFjZS0xLCAjMmEyYTJhKTsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLW1qci1ib3JkZXIsICMzYTNhM2EpOwogICAgYm9yZGVyLXJhZGl1czogdmFyKC0tbWpyLXItbGcsIDhweCk7CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgLyogTWF0Y2ggLm1qci10aHVtYiBhc3BlY3QgcmF0aW8gc28gc2tlbGV0b25zIGhhdmUgdGhlIHNhbWUgZm9vdHByaW50IGFzIHJlYWwgY2FyZHMuICovCiAgICBhc3BlY3QtcmF0aW86IDEgLyAxOwp9CgovKiBTaGltbWVyIHN3ZWVwICovCi5tanItY2FyZC1za2VsZXRvbjo6YWZ0ZXIgewogICAgY29udGVudDogIiI7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICBpbnNldDogMDsKICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgKICAgICAgICA5MGRlZywKICAgICAgICB0cmFuc3BhcmVudCAwJSwKICAgICAgICBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMiwgIzNhM2EzYSkgODAlLCB0cmFuc3BhcmVudCkgNTAlLAogICAgICAgIHRyYW5zcGFyZW50IDEwMCUKICAgICk7CiAgICBhbmltYXRpb246IG1qci1zaGltbWVyIDEuNHMgZWFzZS1pbi1vdXQgaW5maW5pdGU7CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLTEwMCUpOwp9CgpAa2V5ZnJhbWVzIG1qci1zaGltbWVyIHsKICAgIGZyb20gewogICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgtMTAwJSk7CiAgICB9CiAgICB0byB7CiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKDEwMCUpOwogICAgfQp9CgpAbWVkaWEgKHByZWZlcnMtcmVkdWNlZC1tb3Rpb246IHJlZHVjZSkgewogICAgLm1qci1jYXJkLXNrZWxldG9uOjphZnRlciB7CiAgICAgICAgYW5pbWF0aW9uOiBub25lOwogICAgfQp9CgovKiAtLS0gUmVzcG9uc2l2ZSBzdW1tYXJ5IGJhciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoKLyoKICogRW5hYmxlIGNvbnRhaW5lciBxdWVyaWVzIG9uIHRoZSBzdW1tYXJ5IGJhciBzbyBjaGlsZHJlbiBjYW4gcmVzcG9uZCB0byBpdHMKICogYWN0dWFsIHJlbmRlcmVkIHdpZHRoIChlLmcuIHdoZW4gdGhlIHBhbmVsIGlzIGRvY2tlZCBpbiBhIG5hcnJvdyBzaWRlYmFyKS4KICovCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hbS1zdW1tYXJ5IHsKICAgIGNvbnRhaW5lci10eXBlOiBpbmxpbmUtc2l6ZTsKICAgIGNvbnRhaW5lci1uYW1lOiBtanItc3VtbWFyeS1iYXI7Cn0KCi8qIEJlbG93IH4zODAgcHg6IGhpZGUgdGhlIHBpbGxzL3JpZ2h0IHNlY3Rpb24gdG8gcHJldmVudCBvdmVyZmxvdy4gKi8KQGNvbnRhaW5lciBtanItc3VtbWFyeS1iYXIgKG1heC13aWR0aDogMzgwcHgpIHsKICAgIC5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hbS1zdW1tYXJ5LXJpZ2h0IHsKICAgICAgICBkaXNwbGF5OiBub25lOwogICAgfQogICAgLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFtLXN1bW1hcnktdGV4dCB7CiAgICAgICAgbWF4LXdpZHRoOiAxMDAlOwogICAgfQp9Cg==", "" + import.meta.url).toString(), n = document.createElement("link"); + let e = new URL("data:text/css;base64,LyoqCiAqIE1ham9vciBBc3NldHMgTWFuYWdlciAtIENvbWZ5LWxpa2UgdGhlbWUgbGF5ZXIKICoKICogUlVMRVM6CiAqIC0gRG8gTk9UIGhhcmRjb2RlIGEgY3VzdG9tIHBhbGV0dGU7IHVzZSBleGlzdGluZyBDb21meVVJIENTUyB2YXJpYWJsZXMgdmlhIHZhciguLi4pLgogKiAtIEtlZXAgZXZlcnl0aGluZyBzY29wZWQgdW5kZXIgYC5tanItYXNzZXRzLW1hbmFnZXJgIHRvIGF2b2lkIGxlYWtpbmcgc3R5bGVzIHRvIENvbWZ5VUkgKGV4Y2VwdCBgLm1qci1wb3BvdmVyKmAgd2hpY2ggY2FuIGJlIHBvcnRhbGVkIHRvIGBkb2N1bWVudC5ib2R5YCkuCiAqLwoKLm1qci1hc3NldHMtbWFuYWdlciB7CiAgICAvKiBUeXBvZ3JhcGh5ICovCiAgICBmb250LWZhbWlseTogdmFyKAogICAgICAgIC0tY29tZnktZm9udCwKICAgICAgICB2YXIoCiAgICAgICAgICAgIC0tZm9udC1pbnRlciwKICAgICAgICAgICAgdWktc2Fucy1zZXJpZiwKICAgICAgICAgICAgc3lzdGVtLXVpLAogICAgICAgICAgICAtYXBwbGUtc3lzdGVtLAogICAgICAgICAgICAiU2Vnb2UgVUkiLAogICAgICAgICAgICBSb2JvdG8sCiAgICAgICAgICAgIEFyaWFsLAogICAgICAgICAgICBzYW5zLXNlcmlmCiAgICAgICAgKQogICAgKTsKICAgIGZvbnQtc2l6ZTogMTNweDsKICAgIGxpbmUtaGVpZ2h0OiAxLjM1OwogICAgY29sb3I6IHZhcigtLWZnLWNvbG9yLCB2YXIoLS1jb250ZW50LWZnLCB2YXIoLS1pbnB1dC10ZXh0LCAjZGRkKSkpOwoKICAgIC8qCiAgICAgKiBTdXJmYWNlcyAtIHByaW9yaXR5OiBDb21meVVJIHYxLjQyIGRlc2lnbi1zeXN0ZW0gdG9rZW4gLT4gbGVnYWN5IHRva2VuIC0+IGhhcmQgZmFsbGJhY2sKICAgICAqIE5ldyB0b2tlbnM6IC0taW50ZXJmYWNlLXBhbmVsLXN1cmZhY2UsIC0taW50ZXJmYWNlLW1lbnUtc3VyZmFjZSwgLS1pbnRlcmZhY2UtcGFuZWwtaG92ZXItc3VyZmFjZSwKICAgICAqICAgICAgICAgICAgIC0tbW9kYWwtY2FyZC1iYWNrZ3JvdW5kLCAtLWJ1dHRvbi1zdXJmYWNlLCAtLWJ1dHRvbi1ob3Zlci1zdXJmYWNlLAogICAgICogICAgICAgICAgICAgLS1pbnRlcmZhY2UtcGFuZWwtc2VsZWN0ZWQtc3VyZmFjZSwgLS1wcmltYXJ5LWJhY2tncm91bmQsIC0tbXV0ZWQtZm9yZWdyb3VuZCwKICAgICAqICAgICAgICAgICAgIC0tYm9yZGVyLWRlZmF1bHQsIC0tc3VjY2Vzcy1iYWNrZ3JvdW5kLCAtLXdhcm5pbmctYmFja2dyb3VuZCwgLS1kZXN0cnVjdGl2ZS1iYWNrZ3JvdW5kCiAgICAgKi8KICAgIC0tbWpyLXN1cmZhY2UtMDogdmFyKC0taW50ZXJmYWNlLXBhbmVsLXN1cmZhY2UsIHZhcigtLWNvbnRlbnQtYmcsICMxZTFlMWUpKTsKICAgIC0tbWpyLXN1cmZhY2UtMTogdmFyKC0taW50ZXJmYWNlLW1lbnUtc3VyZmFjZSwgdmFyKC0tY29tZnktbWVudS1iZywgIzJhMmEyYSkpOwogICAgLS1tanItc3VyZmFjZS0yOiB2YXIoLS1pbnRlcmZhY2UtcGFuZWwtaG92ZXItc3VyZmFjZSwgdmFyKC0tY29tZnktbWVudS1zZWNvbmRhcnktYmcsICMzMzMpKTsKICAgIC0tbWpyLXN1cmZhY2UtMzogdmFyKC0tbW9kYWwtY2FyZC1iYWNrZ3JvdW5kLCB2YXIoLS1jb21meS1tZW51LWJnLCAjMjIyKSk7CiAgICAtLW1qci1ib3JkZXI6IHZhcigtLWJvcmRlci1kZWZhdWx0LCB2YXIoLS1ib3JkZXItY29sb3IsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xMikpKTsKICAgIC0tbWpyLW11dGVkOiB2YXIoLS1tdXRlZC1mb3JlZ3JvdW5kLCB2YXIoLS1kZXNjcmlwLXRleHQsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC42NSkpKTsKICAgIC0tbWpyLWFjY2VudDogdmFyKC0tcHJpbWFyeS1iYWNrZ3JvdW5kLCB2YXIoLS1jb21meS1hY2NlbnQsICM1ZmIzZmYpKTsKICAgIC0tbWpyLWFjY2VudC1ob3ZlcjogdmFyKC0tcHJpbWFyeS1iYWNrZ3JvdW5kLWhvdmVyLCB2YXIoLS1jb21meS1hY2NlbnQsICM3ZWM4ZmYpKTsKICAgIC0tbWpyLWJ0bi1zdXJmYWNlOiB2YXIoLS1idXR0b24tc3VyZmFjZSwgdmFyKC0tbWpyLXN1cmZhY2UtMikpOwogICAgLS1tanItYnRuLWhvdmVyOiB2YXIoLS1idXR0b24taG92ZXItc3VyZmFjZSwgdmFyKC0tbWpyLXN1cmZhY2UtMikpOwogICAgLS1tanItc2VsZWN0ZWQtc3VyZmFjZTogdmFyKC0taW50ZXJmYWNlLXBhbmVsLXNlbGVjdGVkLXN1cmZhY2UsIHJnYmEoOTUsIDE3OSwgMjU1LCAwLjE1KSk7CgogICAgLyogUmFkaWkgLSB1c2UgQ29tZnlVSSBkZXNpZ24tc3lzdGVtIHJhZGl1cyB0b2tlbnMgd2hlbiBhdmFpbGFibGUgKi8KICAgIC0tbWpyLXItc206IHZhcigtLXJhZGl1cy1zbSwgOHB4KTsKICAgIC0tbWpyLXItbWQ6IHZhcigtLXJhZGl1cy1tZCwgMTBweCk7CiAgICAtLW1qci1yLWxnOiB2YXIoLS1yYWRpdXMtbGcsIDEycHgpOwoKICAgIC8qIFNwYWNpbmcgKi8KICAgIC0tbWpyLXBhZC1zbTogOHB4OwogICAgLS1tanItcGFkLW1kOiAxMnB4OwogICAgLS1tanItcGFkLWxnOiAxNnB4OwoKICAgIC8qIFNlbWFudGljIFN0YXR1cyBDb2xvcnMgLSBwcmVmZXIgQ29tZnlVSSB2MS40MiBzZW1hbnRpYyB0b2tlbnMgKi8KICAgIC0tbWpyLXN0YXR1cy1zdWNjZXNzOiB2YXIoLS1zdWNjZXNzLWJhY2tncm91bmQsIHZhcigtLWNvbWZ5LXN0YXR1cy1zdWNjZXNzLCAjNGNhZjUwKSk7CiAgICAtLW1qci1zdGF0dXMtd2FybmluZzogdmFyKC0td2FybmluZy1iYWNrZ3JvdW5kLCB2YXIoLS1jb21meS1zdGF0dXMtd2FybmluZywgI2ZmYTcyNikpOwogICAgLS1tanItc3RhdHVzLWVycm9yOiB2YXIoLS1kZXN0cnVjdGl2ZS1iYWNrZ3JvdW5kLCB2YXIoLS1jb21meS1zdGF0dXMtZXJyb3IsICNmNDQzMzYpKTsKICAgIC0tbWpyLXN0YXR1cy1pbmZvOiB2YXIoLS1jb21meS1zdGF0dXMtaW5mbywgIzIxOTZmMyk7CiAgICAtLW1qci1zdGF0dXMtbmV1dHJhbDogdmFyKC0tY29tZnktc3RhdHVzLW5ldXRyYWwsICM5ZTllOWUpOwogICAgLS1tanItc3Rhci1hY3RpdmU6ICNmZmQ0NWE7CgogICAgLyogQmFkZ2UgY29sb3JzIChvdmVycmlkZGVuIGJ5IHNldHRpbmdzKSAqLwogICAgLS1tanItYmFkZ2UtaW1hZ2U6ICMyMTk2ZjM7CiAgICAtLW1qci1iYWRnZS12aWRlbzogIzljMjdiMDsKICAgIC0tbWpyLWJhZGdlLWF1ZGlvOiAjZmY5ODAwOwogICAgLS1tanItYmFkZ2UtbW9kZWwzZDogIzRjYWY1MDsKICAgIC0tbWpyLWNhcmQtaG92ZXItY29sb3I6IHZhcigtLWludGVyZmFjZS1wYW5lbC1ob3Zlci1zdXJmYWNlLCAjM2QzZDNkKTsKICAgIC0tbWpyLWNhcmQtc2VsZWN0aW9uLWNvbG9yOiB2YXIoLS1pbnRlcmZhY2UtcGFuZWwtc2VsZWN0ZWQtc3VyZmFjZSwgIzRhOTBlMik7CiAgICAtLW1qci1yYXRpbmctY29sb3I6ICNmZjk1MDA7CiAgICAtLW1qci10YWctY29sb3I6ICM0YTkwZTI7Cn0KCi8qIE1ha2UgdGhlIHRoZW1lIHZpc2libHkgYXBwbHkgZXZlbiB3aXRoIGlubGluZSBzdHlsZXMgKi8KLm1qci1hc3NldHMtbWFuYWdlciAqIHsKICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIubWpyLWFtLWNvbnRhaW5lciB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgIGhlaWdodDogMTAwJTsKICAgIG92ZXJmbG93OiBoaWRkZW47Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hbS1oZWFkZXIgewogICAgcGFkZGluZzogMTRweCAxNnB4OwogICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHZhcigtLW1qci1ib3JkZXIpOwogICAgYmFja2dyb3VuZDogdmFyKC0tbWpyLXN1cmZhY2UtMSk7CiAgICBmbGV4OiAwIDAgYXV0bzsKICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgIHotaW5kZXg6IDI7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hbS1oZWFkZXItcm93IHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiAxMHB4OwogICAgbWluLWhlaWdodDogMjhweDsKICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsKICAgIGZsZXgtd3JhcDogd3JhcDsKICAgIHJvdy1nYXA6IDEwcHg7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hbS1oZWFkZXItbGVmdCB7CiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBnYXA6IDEwcHg7CiAgICBtaW4td2lkdGg6IDA7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hbS1oZWFkZXItYWN0aW9ucyB7CiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBnYXA6IDEwcHg7CiAgICBmbGV4OiAwIDAgYXV0bzsKICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgIGZsZXgtd3JhcDogd3JhcDsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFtLWhlYWRlci10b29scyB7CiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgIGdhcDogOHB4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLXRhYnMgewogICAgLyogUXVldWUtbGlrZSB0YWJzIChhY3RpdmUgcGlsbCwgb3RoZXJzIGFzIHRleHQpICovCiAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsKICAgIGJvcmRlcjogbm9uZTsKICAgIHBhZGRpbmc6IDA7CiAgICBnYXA6IDEwcHg7CiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBmbGV4OiAxIDEgYXV0bzsKICAgIG1pbi13aWR0aDogMDsKICAgIG92ZXJmbG93LXg6IGF1dG87CiAgICBvdmVyZmxvdy15OiBoaWRkZW47CiAgICBzY3JvbGxiYXItd2lkdGg6IG5vbmU7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci10YWJzOjotd2Via2l0LXNjcm9sbGJhciB7CiAgICB3aWR0aDogMDsKICAgIGhlaWdodDogMDsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLXRhYiB7CiAgICBwYWRkaW5nOiA2cHggMTJweDsKICAgIGJvcmRlci1yYWRpdXM6IDk5OXB4OwogICAgYm9yZGVyOiAxcHggc29saWQgdHJhbnNwYXJlbnQ7CiAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsKICAgIGNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tY29udGVudC1mZywgI2RkZCkgNjUlLCB0cmFuc3BhcmVudCk7CiAgICB0cmFuc2l0aW9uOgogICAgICAgIHRyYW5zZm9ybSAxMjBtcyBlYXNlLAogICAgICAgIGJhY2tncm91bmQtY29sb3IgMTIwbXMgZWFzZSwKICAgICAgICBjb2xvciAxMjBtcyBlYXNlLAogICAgICAgIGJvcmRlci1jb2xvciAxMjBtcyBlYXNlOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItdGFiOmhvdmVyIHsKICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtMXB4KTsKICAgIGNvbG9yOiB2YXIoLS1jb250ZW50LWZnLCAjZGRkKTsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0yKSA1NSUsIHRyYW5zcGFyZW50KTsKICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1ib3JkZXIpIDcwJSwgdHJhbnNwYXJlbnQpOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItdGFiLmlzLWFjdGl2ZSB7CiAgICBjb2xvcjogdmFyKC0tY29udGVudC1mZywgI2ZmZik7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMikgODAlLCB0cmFuc3BhcmVudCk7CiAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYm9yZGVyKSA4NSUsIHRyYW5zcGFyZW50KTsKICAgIGJveC1zaGFkb3c6IDAgNnB4IDE4cHggcmdiYSgwLCAwLCAwLCAwLjE4KTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWljb24tYnRuIHsKICAgIHdpZHRoOiAyOHB4OwogICAgaGVpZ2h0OiAyOHB4OwogICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1yYWRpdXMtbGcsIDAuNXJlbSk7CiAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1tanItYm9yZGVyKTsKICAgIGJhY2tncm91bmQ6IHZhcigtLW1qci1zdXJmYWNlLTIpOwogICAgY29sb3I6IHZhcigtLWNvbnRlbnQtZmcsICNkZGQpOwogICAgY3Vyc29yOiBwb2ludGVyOwogICAgcGFkZGluZzogMDsKICAgIHRyYW5zaXRpb246CiAgICAgICAgdHJhbnNmb3JtIDEyMG1zIGVhc2UsCiAgICAgICAgYmFja2dyb3VuZC1jb2xvciAxMjBtcyBlYXNlLAogICAgICAgIGJvcmRlci1jb2xvciAxMjBtcyBlYXNlOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItaWNvbi1idG46aG92ZXIgewogICAgYm9yZGVyLWNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWFjY2VudCkgNDUlLCB2YXIoLS1tanItYm9yZGVyKSk7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMikgODAlLCB2YXIoLS1tanItYWNjZW50KSA4JSk7CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTFweCk7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1pY29uLWJ0bi5tanItY29udGV4dC1hY3RpdmUsCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1pY29uLWJ0bi5tanItcG9wb3Zlci1vcGVuIHsKICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQpIDg1JSwgdmFyKC0tbWpyLWJvcmRlcikpOwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTIpIDU1JSwgdmFyKC0tbWpyLWFjY2VudCkgMTIlKTsKICAgIGJveC1zaGFkb3c6IDAgMCAwIDFweCBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWFjY2VudCkgMzUlLCB0cmFuc3BhcmVudCk7Cn0KCi8qIEZsb2F0aW5nIFZpZXdlciBidXR0b24gLSB0ZWFsIGdsb3cgd2hlbiB2aWV3ZXIgaXMgb3BlbiAqLwoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItaWNvbi1idG4ubWpyLW1mdi1idG4tYWN0aXZlIHsKICAgIGNvbG9yOiAjNGRkOWMwOwogICAgYm9yZGVyLWNvbG9yOiByZ2JhKDc3LCAyMTcsIDE5MiwgMC41NSk7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDc3LCAyMTcsIDE5MiwgMC4xKTsKICAgIGJveC1zaGFkb3c6IDAgMCAwIDFweCByZ2JhKDc3LCAyMTcsIDE5MiwgMC4yNSk7Cn0KLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWljb24tYnRuLm1qci1tZnYtYnRuLWFjdGl2ZSAucGkgewogICAgb3BhY2l0eTogMTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWljb24tYnRuLm1qci1tZXNzYWdlLWJ0biB7CiAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICBvdmVyZmxvdzogdmlzaWJsZTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWljb24tYnRuLm1qci1tZXNzYWdlLWhhcy11bnJlYWQgewogICAgYm9yZGVyLWNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWFjY2VudCkgNzUlLCB2YXIoLS1tanItYm9yZGVyKSk7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMikgNzIlLCB2YXIoLS1tanItYWNjZW50KSAxMSUpOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItbWVzc2FnZS1iYWRnZSB7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICB0b3A6IC01cHg7CiAgICByaWdodDogLTZweDsKICAgIG1pbi13aWR0aDogMTZweDsKICAgIGhlaWdodDogMTZweDsKICAgIHBhZGRpbmc6IDAgNHB4OwogICAgYm9yZGVyLXJhZGl1czogOTk5cHg7CiAgICBib3JkZXI6IDFweCBzb2xpZCBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMSkgNTUlLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMykpOwogICAgYmFja2dyb3VuZDogI2VmNTM1MDsKICAgIGNvbG9yOiAjZmZmOwogICAgZm9udC1zaXplOiAxMHB4OwogICAgZm9udC13ZWlnaHQ6IDcwMDsKICAgIGxpbmUtaGVpZ2h0OiAxOwogICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgIGJveC1zaGFkb3c6IDAgMnB4IDhweCByZ2JhKDAsIDAsIDAsIDAuMzUpOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItaWNvbi1idG4gLnBpIHsKICAgIGZvbnQtc2l6ZTogMTNweDsKICAgIGxpbmUtaGVpZ2h0OiAxOwogICAgb3BhY2l0eTogMC45Owp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItaWNvbi1idG46ZGlzYWJsZWQsCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1haS1jb250cm9sOmRpc2FibGVkIHsKICAgIG9wYWNpdHk6IDAuNTsKICAgIGN1cnNvcjogbm90LWFsbG93ZWQ7CiAgICB0cmFuc2Zvcm06IG5vbmU7CiAgICBmaWx0ZXI6IGdyYXlzY2FsZSgwLjQ1KTsKICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1ib3JkZXIpIDg4JSwgdHJhbnNwYXJlbnQpICFpbXBvcnRhbnQ7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMikgOTIlLCB0cmFuc3BhcmVudCkgIWltcG9ydGFudDsKICAgIGNvbG9yOiB2YXIoLS1tanItbXV0ZWQsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC42KSkgIWltcG9ydGFudDsKICAgIGJveC1zaGFkb3c6IG5vbmUgIWltcG9ydGFudDsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFpLWRpc2FibGVkIC5tanItYWktY29udHJvbDpob3ZlciB7CiAgICB0cmFuc2Zvcm06IG5vbmUgIWltcG9ydGFudDsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFpLWRpc2FibGVkLWJsb2NrIHsKICAgIG9wYWNpdHk6IDAuNTg7CiAgICBmaWx0ZXI6IGdyYXlzY2FsZSgwLjQ1KTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFpLWRpc2FibGVkLWJsb2NrIC5tanItYWktY29udHJvbCwKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFpLWRpc2FibGVkLWJsb2NrIGJ1dHRvbiB7CiAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKfQoKLyogUG9wb3ZlcnMgY2FuIGJlIG1vdmVkIHRvIGBkb2N1bWVudC5ib2R5YCAocG9ydGFsKSB0byBhdm9pZCBiZWluZyBjbGlwcGVkLiAqLwoubWpyLXBvcG92ZXIgewogICAgZm9udC1mYW1pbHk6IHZhcigKICAgICAgICAtLWNvbWZ5LWZvbnQsCiAgICAgICAgdmFyKAogICAgICAgICAgICAtLWZvbnQtaW50ZXIsCiAgICAgICAgICAgIHVpLXNhbnMtc2VyaWYsCiAgICAgICAgICAgIHN5c3RlbS11aSwKICAgICAgICAgICAgLWFwcGxlLXN5c3RlbSwKICAgICAgICAgICAgIlNlZ29lIFVJIiwKICAgICAgICAgICAgUm9ib3RvLAogICAgICAgICAgICBBcmlhbCwKICAgICAgICAgICAgc2Fucy1zZXJpZgogICAgICAgICkKICAgICk7CiAgICBmb250LXNpemU6IDEzcHg7CiAgICBsaW5lLWhlaWdodDogMS4zNTsKICAgIGNvbG9yOiB2YXIoLS1mZy1jb2xvciwgdmFyKC0tY29udGVudC1mZywgdmFyKC0taW5wdXQtdGV4dCwgI2RkZCkpKTsKCiAgICAvKiBQcm92aWRlIGZhbGxiYWNrcyB3aGVuIG91dHNpZGUgYC5tanItYXNzZXRzLW1hbmFnZXJgIHNjb3BlICovCiAgICAtLW1qci1zdXJmYWNlLTE6IHZhcigtLWludGVyZmFjZS1tZW51LXN1cmZhY2UsIHZhcigtLWNvbWZ5LW1lbnUtYmcsICMyYTJhMmEpKTsKICAgIC0tbWpyLWJvcmRlcjogdmFyKC0tYm9yZGVyLWRlZmF1bHQsIHZhcigtLWJvcmRlci1jb2xvciwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEyKSkpOwogICAgLS1tanItbXV0ZWQ6IHZhcigtLW11dGVkLWZvcmVncm91bmQsIHZhcigtLWRlc2NyaXAtdGV4dCwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjY1KSkpOwogICAgLS1tanItYWNjZW50OiB2YXIoLS1wcmltYXJ5LWJhY2tncm91bmQsIHZhcigtLWNvbWZ5LWFjY2VudCwgIzVmYjNmZikpOwogICAgLS1tanItcG9wb3Zlci16LWluZGV4OiAyMTQ3NDgzNjQ3OwoKICAgIHBvc2l0aW9uOiBmaXhlZDsKICAgIHRvcDogMDsKICAgIGxlZnQ6IDA7CiAgICBtaW4td2lkdGg6IDA7CiAgICB3aWR0aDogbWluKDI4MHB4LCBjYWxjKDEwMHZ3IC0gMjRweCkpOwogICAgbWF4LXdpZHRoOiBtaW4oMzYwcHgsIGNhbGMoMTAwdncgLSAyNHB4KSk7CiAgICBwYWRkaW5nOiAxMHB4OwogICAgYm9yZGVyLXJhZGl1czogdmFyKC0tcmFkaXVzLWxnLCAwLjVyZW0pOwogICAgYmFja2dyb3VuZDogdmFyKC0tbWpyLXN1cmZhY2UtMSwgdmFyKC0tY29tZnktbWVudS1iZywgIzJhMmEyYSkpOwogICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tbWpyLWJvcmRlciwgdmFyKC0tYm9yZGVyLWNvbG9yLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTIpKSk7CiAgICBib3gtc2hhZG93OiAwIDEycHggMjhweCByZ2JhKDAsIDAsIDAsIDAuMzUpOwogICAgei1pbmRleDogdmFyKC0tbWpyLXBvcG92ZXItei1pbmRleCk7CiAgICBtaW4taGVpZ2h0OiAwOwogICAgb3ZlcmZsb3cteDogaGlkZGVuOwogICAgb3ZlcmZsb3cteTogYXV0bzsKICAgIG92ZXJzY3JvbGwtYmVoYXZpb3I6IGNvbnRhaW47CiAgICAtd2Via2l0LW92ZXJmbG93LXNjcm9sbGluZzogdG91Y2g7CiAgICB0b3VjaC1hY3Rpb246IHBhbi15OwogICAgc2Nyb2xsYmFyLXdpZHRoOiB0aGluOwp9CgoubWpyLXBvcG92ZXItLWhpZGRlbiB7CiAgICBkaXNwbGF5OiBub25lOwp9CgoubWpyLWZpbHRlci1wb3BvdmVyIHsKICAgIG1pbi13aWR0aDogMzQwcHg7CiAgICB3aWR0aDogbWluKDM2MHB4LCBjYWxjKDEwMHZ3IC0gMjRweCkpOwogICAgcGFkZGluZzogMTJweDsKfQoKLm1qci1zb3J0LXBvcG92ZXIgewogICAgbWluLXdpZHRoOiAyMjBweDsKICAgIHdpZHRoOiBtaW4oMjYwcHgsIGNhbGMoMTAwdncgLSAyNHB4KSk7CiAgICBwYWRkaW5nOiAxMHB4Owp9CgoubWpyLWNvbGxlY3Rpb25zLXBvcG92ZXIgewogICAgbWluLXdpZHRoOiAyODBweDsKICAgIHdpZHRoOiBtaW4oMzIwcHgsIGNhbGMoMTAwdncgLSAyNHB4KSk7CiAgICBwYWRkaW5nOiAxMHB4Owp9CgoubWpyLXBpbm5lZC1mb2xkZXJzLXBvcG92ZXIgewogICAgbWluLXdpZHRoOiAyODBweDsKICAgIHdpZHRoOiBtaW4oMzQwcHgsIGNhbGMoMTAwdncgLSAyNHB4KSk7CiAgICBwYWRkaW5nOiAxMHB4Owp9CgoubWpyLXBpbm5lZC1mb2xkZXJzLXBvcG92ZXIgLm1qci1waW5uZWQtZm9sZGVycy1tZW51IHsKICAgIGRpc3BsYXk6IGdyaWQ7CiAgICBnYXA6IDZweDsKfQoKLm1qci1waW5uZWQtZm9sZGVycy1wb3BvdmVyIC5tanItcGlubmVkLWZvbGRlcnMtZW1wdHkgewogICAgcGFkZGluZzogMTBweCAxMnB4OwogICAgb3BhY2l0eTogMC43NTsKfQoKLm1qci1waW5uZWQtZm9sZGVycy1wb3BvdmVyIC5tanItcGlubmVkLWZvbGRlci1yb3cgewogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBzdHJldGNoOwogICAgd2lkdGg6IDEwMCU7Cn0KCi5tanItcGlubmVkLWZvbGRlcnMtcG9wb3ZlciAubWpyLXBpbm5lZC1mb2xkZXItb3BlbiB7CiAgICBmbGV4OiAxOwogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47CiAgICB3aWR0aDogMTAwJTsKICAgIGdhcDogMTBweDsKICAgIHBhZGRpbmc6IDlweCAxMHB4OwogICAgYm9yZGVyLXJhZGl1czogOXB4OwogICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgxMjAsIDE5MCwgMjU1LCAwLjE4KTsKICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgxMzVkZWcsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wMyksIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wMSkpOwogICAgdHJhbnNpdGlvbjoKICAgICAgICBib3JkZXItY29sb3IgMTIwbXMgZWFzZSwKICAgICAgICBiYWNrZ3JvdW5kIDEyMG1zIGVhc2U7Cn0KCi5tanItcGlubmVkLWZvbGRlcnMtcG9wb3ZlciAubWpyLXBpbm5lZC1mb2xkZXItb3Blbjpob3ZlciwKLm1qci1waW5uZWQtZm9sZGVycy1wb3BvdmVyIC5tanItcGlubmVkLWZvbGRlci1vcGVuOmZvY3VzLXZpc2libGUgewogICAgYm9yZGVyLWNvbG9yOiByZ2JhKDE0NSwgMjA1LCAyNTUsIDAuNCk7CiAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoMTM1ZGVnLCByZ2JhKDgwLCAxNDAsIDI1NSwgMC4xOCksIHJnYmEoMzIsIDEwMCwgMjAwLCAwLjE0KSk7Cn0KCi5tanItcGlubmVkLWZvbGRlcnMtcG9wb3ZlciAubWpyLXBpbm5lZC1mb2xkZXItbGFiZWwgewogICAgbWluLXdpZHRoOiAwOwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgIGZvbnQtd2VpZ2h0OiA2MDA7CiAgICBjb2xvcjogdmFyKC0tZmctY29sb3IsICNlNmVkZjcpOwp9CgoubWpyLXBpbm5lZC1mb2xkZXJzLXBvcG92ZXIgLm1qci1waW5uZWQtZm9sZGVyLXBhdGggewogICAgZmxleDogMCAxIGF1dG87CiAgICBtaW4td2lkdGg6IDA7CiAgICBtYXgtd2lkdGg6IDIyMHB4OwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgIG9wYWNpdHk6IDAuNjg7CiAgICBmb250LXNpemU6IDExcHg7Cn0KCi5tanItcGlubmVkLWZvbGRlcnMtcG9wb3ZlciAubWpyLXBpbm5lZC1mb2xkZXItdW5waW4gewogICAgd2lkdGg6IDQycHg7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgIHBhZGRpbmc6IDA7CiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDI1NSwgOTUsIDk1LCAwLjM1KTsKICAgIGJvcmRlci1yYWRpdXM6IDlweDsKICAgIG1hcmdpbi1sZWZ0OiA2cHg7CiAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoMTM1ZGVnLCByZ2JhKDI1NSwgNzAsIDcwLCAwLjE2KSwgcmdiYSgxNjAsIDIwLCAyMCwgMC4xMikpOwp9CgoubWpyLXBpbm5lZC1mb2xkZXJzLXBvcG92ZXIgLm1qci1waW5uZWQtZm9sZGVyLXVucGluIC5waSB7CiAgICBvcGFjaXR5OiAwLjg4OwogICAgY29sb3I6IHJnYmEoMjU1LCAxMzAsIDEzMCwgMC45Nik7Cn0KCi5tanItbWVzc2FnZXMtcG9wb3ZlciB7CiAgICBtaW4td2lkdGg6IDMyMHB4OwogICAgd2lkdGg6IG1pbig0NjBweCwgY2FsYygxMDB2dyAtIDI0cHgpKTsKICAgIHBhZGRpbmc6IDEwcHg7Cn0KCi5tanItaW5saW5lLWRpYWxvZy1tYXNrIHsKICAgIHBvc2l0aW9uOiBzdGF0aWMgIWltcG9ydGFudDsKICAgIGluc2V0OiBhdXRvICFpbXBvcnRhbnQ7CiAgICB3aWR0aDogYXV0byAhaW1wb3J0YW50OwogICAgaGVpZ2h0OiBhdXRvICFpbXBvcnRhbnQ7CiAgICBkaXNwbGF5OiBibG9jayAhaW1wb3J0YW50OwogICAgcG9pbnRlci1ldmVudHM6IGF1dG8gIWltcG9ydGFudDsKfQoKLm1qci1pbmxpbmUtZGlhbG9nLXJvb3QgewogICAgZGlzcGxheTogYmxvY2sgIWltcG9ydGFudDsKICAgIHdpZHRoOiAxMDAlOwogICAgcG9pbnRlci1ldmVudHM6IGF1dG87Cn0KCi5tanItaW5saW5lLWRpYWxvZy1jb250ZW50IHsKICAgIHBhZGRpbmc6IDA7Cn0KCi5tanItbWVzc2FnZXMtaGVhZCB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsKICAgIGdhcDogOHB4OwogICAgZmxleC13cmFwOiB3cmFwOwogICAgbWFyZ2luLWJvdHRvbTogOHB4Owp9CgoubWpyLW1lc3NhZ2VzLXRhYnMgewogICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiA2cHg7CiAgICBtYXJnaW4tYm90dG9tOiA4cHg7CiAgICBwYWRkaW5nOiAzcHg7CiAgICBib3JkZXItcmFkaXVzOiA5OTlweDsKICAgIGJvcmRlcjogMXB4IHNvbGlkIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYm9yZGVyKSA4OCUsIHRyYW5zcGFyZW50KTsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0yKSA3NCUsIHRyYW5zcGFyZW50KTsKfQoKLm1qci1tZXNzYWdlcy10YWIgewogICAgYXBwZWFyYW5jZTogbm9uZTsKICAgIGJvcmRlcjogMDsKICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50OwogICAgY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1jb250ZW50LWZnLCAjZjFmMWYxKSA3NiUsIHRyYW5zcGFyZW50KTsKICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogNnB4OwogICAgZm9udC1zaXplOiAxMXB4OwogICAgZm9udC13ZWlnaHQ6IDcwMDsKICAgIGxpbmUtaGVpZ2h0OiAxLjI7CiAgICBwYWRkaW5nOiA2cHggMTBweDsKICAgIGJvcmRlci1yYWRpdXM6IDk5OXB4OwogICAgY3Vyc29yOiBwb2ludGVyOwogICAgdHJhbnNpdGlvbjoKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yIDAuMTRzIGVhc2UsCiAgICAgICAgY29sb3IgMC4xNHMgZWFzZSwKICAgICAgICB0cmFuc2Zvcm0gMC4xNHMgZWFzZTsKfQoKLm1qci1tZXNzYWdlcy10YWI6aG92ZXIsCi5tanItbWVzc2FnZXMtdGFiOmZvY3VzLXZpc2libGUgewogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQpIDE0JSwgdHJhbnNwYXJlbnQpOwogICAgY29sb3I6IHZhcigtLWNvbnRlbnQtZmcsICNmMWYxZjEpOwogICAgb3V0bGluZTogbm9uZTsKfQoKLm1qci1tZXNzYWdlcy10YWIuaXMtYWN0aXZlIHsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYWNjZW50KSAyMiUsIHZhcigtLW1qci1zdXJmYWNlLTIpKTsKICAgIGNvbG9yOiB2YXIoLS1jb250ZW50LWZnLCAjZmZmKTsKICAgIGJveC1zaGFkb3c6IGluc2V0IDAgMCAwIDFweCBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWFjY2VudCkgMzQlLCB0cmFuc3BhcmVudCk7Cn0KCi5tanItbWVzc2FnZXMtcGFuZWxzIHsKICAgIGRpc3BsYXk6IGdyaWQ7CiAgICBnYXA6IDhweDsKICAgIG1heC1oZWlnaHQ6IG1pbig1MnZoLCA0MjBweCk7Cn0KCi5tanItbWVzc2FnZXMtbGlzdCwKLm1qci1tZXNzYWdlcy1zaG9ydGN1dHMtcGFuZWwgewogICAgb3ZlcmZsb3cteTogYXV0bzsKICAgIG92ZXJzY3JvbGwtYmVoYXZpb3I6IGNvbnRhaW47CiAgICBzY3JvbGxiYXItd2lkdGg6IHRoaW47Cn0KCi5tanItdGFiLWNvdW50LWJhZGdlIHsKICAgIG1pbi13aWR0aDogMTZweDsKICAgIGhlaWdodDogMTZweDsKICAgIHBhZGRpbmc6IDAgNXB4OwogICAgYm9yZGVyLXJhZGl1czogOTk5cHg7CiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgIGZvbnQtc2l6ZTogOXB4OwogICAgZm9udC13ZWlnaHQ6IDgwMDsKICAgIGxldHRlci1zcGFjaW5nOiAwLjAyZW07CiAgICBsaW5lLWhlaWdodDogMTsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYWNjZW50KSAyOCUsIHZhcigtLW1qci1zdXJmYWNlLTIpKTsKICAgIGNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tY29udGVudC1mZywgI2ZmZikgOTIlLCB0cmFuc3BhcmVudCk7CiAgICBib3gtc2hhZG93OiBpbnNldCAwIDAgMCAxcHggY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQpIDQ4JSwgdHJhbnNwYXJlbnQpOwp9CgoubWpyLW1lc3NhZ2VzLXRpdGxlIHsKICAgIGZsZXg6IDEgMSBhdXRvOwogICAgbWluLXdpZHRoOiAwOwogICAgZm9udC1zaXplOiAxMnB4OwogICAgZm9udC13ZWlnaHQ6IDcwMDsKICAgIGxldHRlci1zcGFjaW5nOiAwLjAzZW07CiAgICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOwogICAgY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1jb250ZW50LWZnLCAjZGRkKSA4MiUsIHZhcigtLW1qci1tdXRlZCkpOwp9CgoubWpyLW1lc3NhZ2VzLWFjdGlvbnMgewogICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBmbGV4LWVuZDsKICAgIGdhcDogNnB4OwogICAgZmxleC13cmFwOiB3cmFwOwp9CgoubWpyLW1lc3NhZ2VzLW1hcmstcmVhZC1idG4gewogICAgcGFkZGluZzogNHB4IDhweDsKICAgIGZvbnQtc2l6ZTogMTFweDsKICAgIGxpbmUtaGVpZ2h0OiAxLjI7Cn0KCi5tanItbWVzc2FnZXMtc3Rhci1saW5rIHsKICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogNnB4OwogICAgcGFkZGluZzogNHB4IDhweDsKICAgIGZvbnQtc2l6ZTogMTFweDsKICAgIGxpbmUtaGVpZ2h0OiAxLjI7CiAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7CiAgICBjb2xvcjogdmFyKC0tY29udGVudC1mZywgI2YxZjFmMSk7CiAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCAjZjNjODRiIDQyJSwgdmFyKC0tbWpyLWJvcmRlcikpOwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsICNmM2M4NGIgMTIlLCB2YXIoLS1tanItc3VyZmFjZS0yKSk7Cn0KCi5tanItbWVzc2FnZXMtc3Rhci1saW5rOmhvdmVyLAoubWpyLW1lc3NhZ2VzLXN0YXItbGluazpmb2N1cy12aXNpYmxlIHsKICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKfQoKLm1qci1tZXNzYWdlcy1zdGFyLWljb24gewogICAgY29sb3I6ICNmM2M4NGI7CiAgICBmb250LXNpemU6IDEycHg7CiAgICBsaW5lLWhlaWdodDogMTsKfQoKLm1qci1tZXNzYWdlcy1zdGFyLWxhYmVsIHsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7Cn0KCi5tanItbWVzc2FnZXMtbGlzdCB7CiAgICBkaXNwbGF5OiBncmlkOwogICAgZ2FwOiA4cHg7Cn0KCi5tanItbWVzc2FnZXMtZW1wdHkgewogICAgcGFkZGluZzogOHB4IDZweDsKICAgIGZvbnQtc2l6ZTogMTJweDsKICAgIG9wYWNpdHk6IDAuNzI7Cn0KCi5tanItbWVzc2FnZS1pdGVtIHsKICAgIGRpc3BsYXk6IGdyaWQ7CiAgICBnYXA6IDVweDsKICAgIGJvcmRlci1yYWRpdXM6IDEwcHg7CiAgICBib3JkZXI6IDFweCBzb2xpZCBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWJvcmRlcikgODYlLCB0cmFuc3BhcmVudCk7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMikgNTglLCB0cmFuc3BhcmVudCk7CiAgICBwYWRkaW5nOiA4cHg7Cn0KCi5tanItbWVzc2FnZS1pdGVtLS11bnJlYWQgewogICAgYm9yZGVyLWNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWFjY2VudCkgNTglLCB2YXIoLS1tanItYm9yZGVyKSk7CiAgICBib3gtc2hhZG93OiBpbnNldCAwIDAgMCAxcHggY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQpIDI2JSwgdHJhbnNwYXJlbnQpOwp9CgoubWpyLW1lc3NhZ2UtaXRlbS0td2FybmluZyB7CiAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCAjZjBiODVhIDYyJSwgdmFyKC0tbWpyLWJvcmRlcikpOwp9CgoubWpyLW1lc3NhZ2UtaXRlbS0tZXJyb3IgewogICAgYm9yZGVyLWNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgI2YzNmI2YiA2MiUsIHZhcigtLW1qci1ib3JkZXIpKTsKfQoKLm1qci1tZXNzYWdlLWl0ZW0tLXN1Y2Nlc3MgewogICAgYm9yZGVyLWNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgIzU4YzA3ZCA2MiUsIHZhcigtLW1qci1ib3JkZXIpKTsKfQoKLm1qci1tZXNzYWdlLWl0ZW0taGVhZCB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsKICAgIGdhcDogOHB4Owp9CgoubWpyLW1lc3NhZ2UtaXRlbS10aXRsZS13cmFwIHsKICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogOHB4OwogICAgbWluLXdpZHRoOiAwOwogICAgZmxleDogMSAxIGF1dG87Cn0KCi5tanItbWVzc2FnZS1pdGVtLWVtb2ppIHsKICAgIGZsZXg6IDAgMCBhdXRvOwogICAgZm9udC1zaXplOiAxNnB4OwogICAgbGluZS1oZWlnaHQ6IDE7Cn0KCi5tanItbWVzc2FnZS1pdGVtLXRpdGxlIHsKICAgIG1pbi13aWR0aDogMDsKICAgIGZvbnQtd2VpZ2h0OiA2MDA7CiAgICBjb2xvcjogdmFyKC0tY29udGVudC1mZywgI2YxZjFmMSk7Cn0KCi5tanItbWVzc2FnZS1pdGVtLWNhdGVnb3J5IHsKICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIHBhZGRpbmc6IDFweCA2cHg7CiAgICBib3JkZXItcmFkaXVzOiA5OTlweDsKICAgIGZvbnQtc2l6ZTogMTBweDsKICAgIGZvbnQtd2VpZ2h0OiA3MDA7CiAgICBsZXR0ZXItc3BhY2luZzogMC4wM2VtOwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQpIDIwJSwgdmFyKC0tbWpyLXN1cmZhY2UtMikpOwogICAgY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1jb250ZW50LWZnLCAjZmZmKSA4NiUsIHRyYW5zcGFyZW50KTsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7Cn0KCi5tanItbWVzc2FnZS1pdGVtLW1ldGEgewogICAgZm9udC1zaXplOiAxMXB4OwogICAgb3BhY2l0eTogMC43MjsKfQoKLm1qci1tZXNzYWdlLWl0ZW0tYm9keSB7CiAgICBmb250LXNpemU6IDEycHg7CiAgICBvcGFjaXR5OiAwLjkyOwogICAgbGluZS1oZWlnaHQ6IDEuNDU7CiAgICB3aGl0ZS1zcGFjZTogcHJlLXdyYXA7CiAgICB3b3JkLWJyZWFrOiBicmVhay13b3JkOwp9CgoubWpyLW1lc3NhZ2UtaXRlbS1hY3Rpb24gewogICAgZm9udC1zaXplOiAxMXB4OwogICAgZm9udC13ZWlnaHQ6IDYwMDsKICAgIGNvbG9yOiB2YXIoLS1tanItYWNjZW50LCB2YXIoLS1jb21meS1hY2NlbnQsICM1ZmIzZmYpKTsKICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKICAgIHdpZHRoOiBmaXQtY29udGVudDsKfQoKLm1qci1tZXNzYWdlLWl0ZW0tYWN0aW9uOmhvdmVyIHsKICAgIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOwp9CgovKiBUb2FzdCBIaXN0b3J5IHRhYiAtIHVucmVhZCBpbmRpY2F0b3IgZG90ICovCi5tanItdGFiLXVucmVhZC1kb3QgewogICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgd2lkdGg6IDZweDsKICAgIGhlaWdodDogNnB4OwogICAgYm9yZGVyLXJhZGl1czogNTAlOwogICAgYmFja2dyb3VuZDogdmFyKC0tbWpyLWFjY2VudCwgIzVmYjNmZik7CiAgICBtYXJnaW4tbGVmdDogNXB4OwogICAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsKICAgIGZsZXgtc2hyaW5rOiAwOwp9CgovKiBIaXN0b3J5IHBhbmVsICovCi5tanItbWVzc2FnZXMtaGlzdG9yeS1wYW5lbCB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgIG1pbi1oZWlnaHQ6IDA7CiAgICBvdmVyZmxvdzogaGlkZGVuOwp9CgoubWpyLWhpc3RvcnktaGVhZCB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsKICAgIHBhZGRpbmc6IDRweCAwIDZweDsKICAgIGZsZXgtc2hyaW5rOiAwOwp9CgoubWpyLWhpc3RvcnktaGVhZC1sYWJlbCB7CiAgICBmb250LXNpemU6IDExcHg7CiAgICBmb250LXdlaWdodDogNjAwOwogICAgb3BhY2l0eTogMC42MjsKICAgIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7CiAgICBsZXR0ZXItc3BhY2luZzogMC4wNWVtOwp9CgoubWpyLWhpc3RvcnktY2xlYXItYnRuIHsKICAgIGZvbnQtc2l6ZTogMTFweDsKICAgIHBhZGRpbmc6IDJweCA4cHg7CiAgICBib3JkZXItcmFkaXVzOiA0cHg7CiAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLW1qci1ib3JkZXIsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xMikpOwogICAgY29sb3I6IGluaGVyaXQ7CiAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICBvcGFjaXR5OiAwLjcyOwp9CgoubWpyLWhpc3RvcnktY2xlYXItYnRuOmhvdmVyIHsKICAgIG9wYWNpdHk6IDE7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWFjY2VudCkgMTIlLCB0cmFuc3BhcmVudCk7Cn0KCi5tanItaGlzdG9yeS1saXN0IHsKICAgIGRpc3BsYXk6IGdyaWQ7CiAgICBnYXA6IDRweDsKICAgIG92ZXJmbG93LXk6IGF1dG87CiAgICBvdmVyc2Nyb2xsLWJlaGF2aW9yOiBjb250YWluOwp9CgoubWpyLWhpc3RvcnktaXRlbSB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGZsZXgtc3RhcnQ7CiAgICBnYXA6IDhweDsKICAgIHBhZGRpbmc6IDZweCA4cHg7CiAgICBib3JkZXItcmFkaXVzOiA2cHg7CiAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1tanItYm9yZGVyLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDgpKTsKICAgIGJhY2tncm91bmQ6IHZhcigtLW1qci1zdXJmYWNlLTIsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wNCkpOwogICAgZm9udC1zaXplOiAxMnB4Owp9CgoubWpyLWhpc3RvcnktaXRlbS0tZXJyb3IgewogICAgYm9yZGVyLWNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgI2YzNmI2YiA1MCUsIHZhcigtLW1qci1ib3JkZXIpKTsKfQoKLm1qci1oaXN0b3J5LWl0ZW0tLXdhcm5pbmcgewogICAgYm9yZGVyLWNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgI2YwYjg1YSA1MCUsIHZhcigtLW1qci1ib3JkZXIpKTsKfQoKLm1qci1oaXN0b3J5LWl0ZW0tLXN1Y2Nlc3MgewogICAgYm9yZGVyLWNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgIzU4YzA3ZCA1MCUsIHZhcigtLW1qci1ib3JkZXIpKTsKfQoKLm1qci1oaXN0b3J5LWl0ZW0taWNvbiB7CiAgICBmbGV4LXNocmluazogMDsKICAgIGZvbnQtc2l6ZTogMTRweDsKICAgIGxpbmUtaGVpZ2h0OiAxLjQ7Cn0KCi5tanItaGlzdG9yeS1pdGVtLWNvbnRlbnQgewogICAgbWluLXdpZHRoOiAwOwogICAgZGlzcGxheTogZ3JpZDsKICAgIGdhcDogNHB4Owp9CgoubWpyLWhpc3RvcnktaXRlbS1tc2cgewogICAgb3BhY2l0eTogMC45MjsKICAgIHdoaXRlLXNwYWNlOiBwcmUtd3JhcDsKICAgIG92ZXJmbG93LXdyYXA6IGFueXdoZXJlOwogICAgd29yZC1icmVhazogYnJlYWstd29yZDsKfQoKLm1qci1oaXN0b3J5LWl0ZW0tdGl0bGUgewogICAgZm9udC13ZWlnaHQ6IDYwMDsKICAgIGxpbmUtaGVpZ2h0OiAxLjQ7CiAgICBvcGFjaXR5OiAwLjk2OwogICAgd2hpdGUtc3BhY2U6IHByZS13cmFwOwogICAgb3ZlcmZsb3ctd3JhcDogYW55d2hlcmU7Cn0KCi5tanItaGlzdG9yeS1pdGVtLWRldGFpbCB7CiAgICBvcGFjaXR5OiAwLjg0OwogICAgbGluZS1oZWlnaHQ6IDEuNDU7CiAgICB3aGl0ZS1zcGFjZTogcHJlLXdyYXA7CiAgICBvdmVyZmxvdy13cmFwOiBhbnl3aGVyZTsKICAgIHdvcmQtYnJlYWs6IGJyZWFrLXdvcmQ7Cn0KCi5tanItaGlzdG9yeS1pdGVtLW1ldGEgewogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBnYXA6IDZweDsKICAgIGZsZXgtd3JhcDogd3JhcDsKfQoKLm1qci1oaXN0b3J5LWl0ZW0tdGltZSB7CiAgICBmb250LXNpemU6IDEwcHg7CiAgICBvcGFjaXR5OiAwLjUyOwp9CgoubWpyLWhpc3RvcnktaXRlbS1jaGlwIHsKICAgIGZvbnQtc2l6ZTogMTBweDsKICAgIGxpbmUtaGVpZ2h0OiAxOwogICAgcGFkZGluZzogMnB4IDZweDsKICAgIGJvcmRlci1yYWRpdXM6IDk5OXB4OwogICAgYm9yZGVyOiAxcHggc29saWQgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1ib3JkZXIpIDgyJSwgdHJhbnNwYXJlbnQpOwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTMsIHZhcigtLW1qci1zdXJmYWNlLTIpKSA3OCUsIHRyYW5zcGFyZW50KTsKICAgIG9wYWNpdHk6IDAuNzY7Cn0KCi5tanItaGlzdG9yeS1pdGVtLWFjdGlvbiB7CiAgICBmb250LXNpemU6IDExcHg7CiAgICB3aWR0aDogZml0LWNvbnRlbnQ7CiAgICBjb2xvcjogdmFyKC0tbWpyLWFjY2VudCwgIzVmYjNmZik7CiAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7Cn0KCi5tanItaGlzdG9yeS1pdGVtLWFjdGlvbjpob3ZlciB7CiAgICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKfQoKLm1qci1oaXN0b3J5LWl0ZW0tcHJvZ3Jlc3MgewogICAgZGlzcGxheTogZ3JpZDsKICAgIGdhcDogNHB4Owp9CgoubWpyLWhpc3RvcnktaXRlbS1wcm9ncmVzcy1zdW1tYXJ5IHsKICAgIGZvbnQtc2l6ZTogMTFweDsKICAgIG9wYWNpdHk6IDAuNzQ7CiAgICBsaW5lLWhlaWdodDogMS4zNTsKICAgIHdoaXRlLXNwYWNlOiBwcmUtd3JhcDsKICAgIG92ZXJmbG93LXdyYXA6IGFueXdoZXJlOwp9CgoubWpyLWhpc3RvcnktaXRlbS1wcm9ncmVzcy1iYXIgewogICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgd2lkdGg6IDEwMCU7CiAgICBoZWlnaHQ6IDZweDsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICBib3JkZXItcmFkaXVzOiA5OTlweDsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYm9yZGVyKSA3NSUsIHRyYW5zcGFyZW50KTsKfQoKLm1qci1oaXN0b3J5LWl0ZW0tcHJvZ3Jlc3MtZmlsbCB7CiAgICBoZWlnaHQ6IDEwMCU7CiAgICBib3JkZXItcmFkaXVzOiBpbmhlcml0OwogICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KAogICAgICAgIDkwZGVnLAogICAgICAgIHZhcigtLW1qci1hY2NlbnQsICM1ZmIzZmYpLAogICAgICAgIGNvbG9yLW1peChpbiBzcmdiLCAjNThjMDdkIDcyJSwgdmFyKC0tbWpyLWFjY2VudCwgIzVmYjNmZikpCiAgICApOwp9CgoubWpyLXNob3J0Y3V0LWd1aWRlIHsKICAgIGRpc3BsYXk6IGdyaWQ7CiAgICBnYXA6IDhweDsKfQoKLm1qci1zaG9ydGN1dC1ndWlkZS1pbnRybyB7CiAgICBmb250LXNpemU6IDEycHg7CiAgICBsaW5lLWhlaWdodDogMS40NTsKICAgIG9wYWNpdHk6IDAuODQ7Cn0KCi5tanItc2hvcnRjdXQtc2VjdGlvbiB7CiAgICBkaXNwbGF5OiBncmlkOwogICAgZ2FwOiA2cHg7CiAgICBwYWRkaW5nOiA4cHg7CiAgICBib3JkZXItcmFkaXVzOiAxMHB4OwogICAgYm9yZGVyOiAxcHggc29saWQgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1ib3JkZXIpIDg0JSwgdHJhbnNwYXJlbnQpOwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTMsIHZhcigtLW1qci1zdXJmYWNlLTIpKSA3MiUsIHRyYW5zcGFyZW50KTsKfQoKLm1qci1zaG9ydGN1dC1zZWN0aW9uLXRpdGxlIHsKICAgIGZvbnQtc2l6ZTogMTFweDsKICAgIGZvbnQtd2VpZ2h0OiA3MDA7CiAgICBsZXR0ZXItc3BhY2luZzogMC4wNGVtOwogICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKICAgIGNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tY29udGVudC1mZywgI2YxZjFmMSkgODglLCB0cmFuc3BhcmVudCk7Cn0KCi5tanItc2hvcnRjdXQtbGlzdCB7CiAgICBkaXNwbGF5OiBncmlkOwogICAgZ2FwOiA2cHg7Cn0KCi5tanItc2hvcnRjdXQtcm93IHsKICAgIGRpc3BsYXk6IGdyaWQ7CiAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IG1pbm1heCgxMzJweCwgMTYwcHgpIG1pbm1heCgwLCAxZnIpOwogICAgZ2FwOiA4cHg7CiAgICBhbGlnbi1pdGVtczogc3RhcnQ7Cn0KCi5tanItc2hvcnRjdXQta2V5IHsKICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgbWluLWhlaWdodDogMjRweDsKICAgIHBhZGRpbmc6IDNweCA4cHg7CiAgICBib3JkZXItcmFkaXVzOiA5OTlweDsKICAgIGJvcmRlcjogMXB4IHNvbGlkIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYWNjZW50KSAzOCUsIHZhcigtLW1qci1ib3JkZXIpKTsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYWNjZW50KSAxMiUsIHZhcigtLW1qci1zdXJmYWNlLTIpKTsKICAgIGNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tY29udGVudC1mZywgI2ZmZikgOTAlLCB0cmFuc3BhcmVudCk7CiAgICBmb250LXNpemU6IDExcHg7CiAgICBmb250LXdlaWdodDogNzAwOwogICAgbGluZS1oZWlnaHQ6IDEuMjU7CiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgICB3aGl0ZS1zcGFjZTogbm9ybWFsOwp9CgoubWpyLXNob3J0Y3V0LWRlc2MgewogICAgbWluLXdpZHRoOiAwOwogICAgZm9udC1zaXplOiAxMnB4OwogICAgbGluZS1oZWlnaHQ6IDEuNDsKICAgIG9wYWNpdHk6IDAuOTI7Cn0KCkBtZWRpYSAobWF4LXdpZHRoOiA1NjBweCkgewogICAgLm1qci1zaG9ydGN1dC1yb3cgewogICAgICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogMWZyOwogICAgfQoKICAgIC5tanItc2hvcnRjdXQta2V5IHsKICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtc3RhcnQ7CiAgICB9Cn0KCi5tanItZmlsdGVyLXBvcG92ZXIgLm1qci1maWx0ZXItaGVhZCB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGZsZXgtc3RhcnQ7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47CiAgICBnYXA6IDEwcHg7CiAgICBtYXJnaW46IDAgMCAxMHB4OwogICAgcGFkZGluZzogNHB4IDJweCAxMHB4OwogICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYm9yZGVyKSA4NSUsIHRyYW5zcGFyZW50KTsKfQoKLm1qci1maWx0ZXItcG9wb3ZlciAubWpyLWZpbHRlci1oZWFkLWxlZnQgewogICAgbWluLXdpZHRoOiAwOwp9CgoubWpyLWZpbHRlci1wb3BvdmVyIC5tanItZmlsdGVyLWtpY2tlciB7CiAgICBmb250LXNpemU6IDExcHg7CiAgICBmb250LXdlaWdodDogODAwOwogICAgbGV0dGVyLXNwYWNpbmc6IDAuMDllbTsKICAgIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7CiAgICBjb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQsICM1ZmIzZmYpIDY1JSwgdmFyKC0tY29udGVudC1mZywgI2RkZCkpOwp9CgoubWpyLWZpbHRlci1wb3BvdmVyIC5tanItZmlsdGVyLXN1YnRpdGxlIHsKICAgIG1hcmdpbi10b3A6IDJweDsKICAgIGZvbnQtc2l6ZTogMTFweDsKICAgIGNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tY29udGVudC1mZywgI2RkZCkgNjIlLCB2YXIoLS1tanItbXV0ZWQsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC42NSkpKTsKfQoKLm1qci1maWx0ZXItcG9wb3ZlciAubWpyLWZpbHRlci1oZWFkLWFjdGlvbnMgewogICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiA4cHg7CiAgICBmbGV4OiAwIDAgYXV0bzsKfQoKLm1qci1maWx0ZXItcG9wb3ZlciAubWpyLWZpbHRlci1zdGFjayB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgIGdhcDogOHB4Owp9CgoubWpyLWZpbHRlci1wb3BvdmVyIC5tanItZmlsdGVyLWFjdGl2ZS1jb3VudCB7CiAgICBtaW4td2lkdGg6IDIycHg7CiAgICBoZWlnaHQ6IDIycHg7CiAgICBwYWRkaW5nOiAwIDZweDsKICAgIGJvcmRlci1yYWRpdXM6IDk5OXB4OwogICAgYm9yZGVyOiAxcHggc29saWQgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQsICM1ZmIzZmYpIDU1JSwgdmFyKC0tbWpyLWJvcmRlcikpOwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQsICM1ZmIzZmYpIDE4JSwgdmFyKC0tbWpyLXN1cmZhY2UtMikpOwogICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICBmb250LXNpemU6IDExcHg7CiAgICBmb250LXdlaWdodDogNzAwOwogICAgbGluZS1oZWlnaHQ6IDE7CiAgICBjb2xvcjogdmFyKC0tY29udGVudC1mZywgI2ZmZik7Cn0KCi5tanItZmlsdGVyLXBvcG92ZXIgLm1qci1maWx0ZXItY2xlYXItYWxsIHsKICAgIGhlaWdodDogMjRweDsKICAgIHBhZGRpbmc6IDAgOHB4OwogICAgYm9yZGVyLXJhZGl1czogOTk5cHg7CiAgICBib3JkZXI6IDFweCBzb2xpZCBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWJvcmRlcikgNzUlLCB0cmFuc3BhcmVudCk7CiAgICBmb250LXNpemU6IDExcHg7CiAgICBmb250LXdlaWdodDogNzAwOwp9CgoubWpyLWZpbHRlci1wb3BvdmVyIC5tanItcG9wb3Zlci1yb3cgewogICAgZGlzcGxheTogZ3JpZDsKICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogMWZyOwogICAgZ2FwOiA4cHg7CiAgICBhbGlnbi1pdGVtczogc3RhcnQ7CiAgICBtYXJnaW4tYm90dG9tOiAxMHB4Owp9CgoubWpyLWZpbHRlci1wb3BvdmVyIC5tanItcG9wb3Zlci1yb3ctLTNjb2wgewogICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiBtaW5tYXgoMCwgMWZyKSBtaW5tYXgoMCwgMWZyKTsKfQoKLm1qci1maWx0ZXItcG9wb3ZlciAubWpyLXBvcG92ZXItcm93LS0zY29sIC5tanItcG9wb3Zlci1sYWJlbCB7CiAgICBncmlkLWNvbHVtbjogMSAvIC0xOwp9CgoubWpyLWZpbHRlci1wb3BvdmVyIC5tanItcG9wb3Zlci1sYWJlbCB7CiAgICBmb250LXNpemU6IDEycHg7CiAgICBmb250LXdlaWdodDogNjAwOwogICAgY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1jb250ZW50LWZnLCAjZGRkKSA3MCUsIHZhcigtLW1qci1tdXRlZCwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjY1KSkpOwogICAgd2hpdGUtc3BhY2U6IG5vcm1hbDsKfQoKLm1qci1maWx0ZXItcG9wb3ZlciAubWpyLXBvcG92ZXItdG9nZ2xlIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiA2cHg7CiAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICBmb250LXNpemU6IDEycHg7CiAgICBjb2xvcjogdmFyKC0tZmctY29sb3IsICNlNmVkZjcpOwogICAgcGFkZGluZzogNnB4IDhweDsKICAgIGJvcmRlci1yYWRpdXM6IDhweDsKICAgIGJvcmRlcjogMXB4IHNvbGlkIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYm9yZGVyKSA4MCUsIHRyYW5zcGFyZW50KTsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0yKSA2NiUsIHRyYW5zcGFyZW50KTsKfQoKLm1qci1maWx0ZXItcG9wb3ZlciAubWpyLXBvcG92ZXItdG9nZ2xlIGlucHV0W3R5cGU9ImNoZWNrYm94Il0gewogICAgYWNjZW50LWNvbG9yOiB2YXIoLS1tanItYWNjZW50LCB2YXIoLS1jb21meS1hY2NlbnQsICM1ZmIzZmYpKTsKfQoKLm1qci1maWx0ZXItcG9wb3ZlciAubWpyLWZpbHRlci1ncm91cCB7CiAgICAtLW1qci1maWx0ZXItZ3JvdXAtYWNjZW50OiB2YXIoLS1tanItYWNjZW50LCAjN2FhMmZmKTsKICAgIHBhZGRpbmc6IDEwcHggMCA4cHg7CiAgICBtYXJnaW4tYm90dG9tOiA0cHg7CiAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgdmFyKC0tbWpyLWJvcmRlciwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEyKSk7Cn0KCi5tanItZmlsdGVyLXBvcG92ZXIgLm1qci1maWx0ZXItZ3JvdXA6bGFzdC1jaGlsZCB7CiAgICBtYXJnaW4tYm90dG9tOiAwOwogICAgYm9yZGVyLWJvdHRvbTogbm9uZTsKICAgIHBhZGRpbmctYm90dG9tOiAycHg7Cn0KCi5tanItZmlsdGVyLXBvcG92ZXIgLm1qci1maWx0ZXItZ3JvdXAtLWNvcmUgewogICAgLS1tanItZmlsdGVyLWdyb3VwLWFjY2VudDogIzU2YThmZjsKfQoKLm1qci1maWx0ZXItcG9wb3ZlciAubWpyLWZpbHRlci1ncm91cC0tbWVkaWEgewogICAgLS1tanItZmlsdGVyLWdyb3VwLWFjY2VudDogIzM1ZDA4YjsKfQoKLm1qci1maWx0ZXItcG9wb3ZlciAubWpyLWZpbHRlci1ncm91cC0tdGltZSB7CiAgICAtLW1qci1maWx0ZXItZ3JvdXAtYWNjZW50OiAjZjBiODRmOwp9CgoubWpyLWZpbHRlci1wb3BvdmVyIC5tanItZmlsdGVyLWdyb3VwLXRvZ2dsZSB7CiAgICB3aWR0aDogMTAwJTsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOwogICAgZ2FwOiAxMHB4OwogICAgbWFyZ2luOiAwIDAgMTBweDsKICAgIGJvcmRlcjogMDsKICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50OwogICAgY29sb3I6IGluaGVyaXQ7CiAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICB0ZXh0LWFsaWduOiBsZWZ0OwogICAgYm9yZGVyLXJhZGl1czogOHB4OwogICAgcGFkZGluZzogMnB4IDRweDsKfQoKLm1qci1maWx0ZXItcG9wb3ZlciAubWpyLWZpbHRlci1ncm91cC10aXRsZSB7CiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBnYXA6IDZweDsKICAgIGNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWZpbHRlci1ncm91cC1hY2NlbnQpIDYyJSwgdmFyKC0tY29udGVudC1mZywgI2RkZCkpOwogICAgZm9udC1zaXplOiAxMXB4OwogICAgZm9udC13ZWlnaHQ6IDcwMDsKICAgIGxldHRlci1zcGFjaW5nOiAwLjA4ZW07CiAgICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOwp9CgoubWpyLWZpbHRlci1wb3BvdmVyIC5tanItZmlsdGVyLWdyb3VwLXRpdGxlOjpiZWZvcmUgewogICAgY29udGVudDogIiI7CiAgICB3aWR0aDogNnB4OwogICAgaGVpZ2h0OiA2cHg7CiAgICBmbGV4OiAwIDAgNnB4OwogICAgYm9yZGVyLXJhZGl1czogOTk5cHg7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1tanItZmlsdGVyLWdyb3VwLWFjY2VudCk7Cn0KCi5tanItZmlsdGVyLXBvcG92ZXIgLm1qci1maWx0ZXItZ3JvdXAtY2hldnJvbiB7CiAgICBmb250LXNpemU6IDEycHg7CiAgICBsaW5lLWhlaWdodDogMTsKICAgIGNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWZpbHRlci1ncm91cC1hY2NlbnQpIDc4JSwgdmFyKC0tbWpyLW11dGVkLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNjUpKSk7Cn0KCi5tanItZmlsdGVyLXBvcG92ZXIgLm1qci1maWx0ZXItZ3JvdXAtYm9keSB7CiAgICBwYWRkaW5nLXRvcDogNHB4Owp9CgoubWpyLWZpbHRlci1wb3BvdmVyIC5tanItZmlsdGVyLWNhcmQgewogICAgYm9yZGVyOiAxcHggc29saWQgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1ib3JkZXIpIDg4JSwgdHJhbnNwYXJlbnQpOwogICAgYm9yZGVyLXJhZGl1czogMTBweDsKICAgIHBhZGRpbmc6IDEwcHg7CiAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoCiAgICAgICAgMTgwZGVnLAogICAgICAgIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0yKSA4NiUsIHRyYW5zcGFyZW50KSwKICAgICAgICBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMSkgODglLCB0cmFuc3BhcmVudCkKICAgICk7CiAgICBtYXJnaW4tYm90dG9tOiA4cHg7Cn0KCi5tanItZmlsdGVyLXBvcG92ZXIgLm1qci1maWx0ZXItY2FyZDpsYXN0LWNoaWxkIHsKICAgIG1hcmdpbi1ib3R0b206IDA7Cn0KCi5tanItZmlsdGVyLXBvcG92ZXIgLm1qci1maWx0ZXItY2FyZC0tYWdlbmRhIHsKICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgKICAgICAgICAxODBkZWcsCiAgICAgICAgY29sb3ItbWl4KGluIHNyZ2IsICNmMGI4NGYgOSUsIHZhcigtLW1qci1zdXJmYWNlLTIpKSwKICAgICAgICBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMSkgOTIlLCB0cmFuc3BhcmVudCkKICAgICk7Cn0KCi5tanItZmlsdGVyLXBvcG92ZXIgLm1qci1maWx0ZXItZ3JvdXA6bm90KC5pcy1vcGVuKSB7CiAgICBwYWRkaW5nLWJvdHRvbTogOHB4Owp9CgoubWpyLWZpbHRlci1wb3BvdmVyIC5tanItZmlsdGVyLWdyb3VwOm5vdCguaXMtb3BlbikgLm1qci1maWx0ZXItZ3JvdXAtdG9nZ2xlIHsKICAgIG1hcmdpbi1ib3R0b206IDA7Cn0KCkBtZWRpYSAobWF4LXdpZHRoOiA0NDBweCkgewogICAgLm1qci1maWx0ZXItcG9wb3ZlciAubWpyLWZpbHRlci1oZWFkIHsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICAgIGFsaWduLWl0ZW1zOiBzdHJldGNoOwogICAgfQoKICAgIC5tanItZmlsdGVyLXBvcG92ZXIgLm1qci1maWx0ZXItaGVhZC1hY3Rpb25zIHsKICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47CiAgICB9Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hbS1oZWFkZXItaWNvbiB7CiAgICBmb250LXNpemU6IDE2cHg7CiAgICBsaW5lLWhlaWdodDogMTsKICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgb3BhY2l0eTogMC45Owp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYW0taGVhZGVyLXRpdGxlIHsKICAgIG1hcmdpbjogMDsKICAgIGZvbnQtc2l6ZTogMTNweDsKICAgIGZvbnQtd2VpZ2h0OiA3MDA7CiAgICBsZXR0ZXItc3BhY2luZzogMC4wMWVtOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYW0tY29udGVudCB7CiAgICBmbGV4OiAxOwogICAgcGFkZGluZzogMTZweDsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgIG1pbi1oZWlnaHQ6IDA7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1mb2xkZXItYnJlYWRjcnVtYiB7CiAgICAtLW1qci1icmVhZGNydW1iLWFjY2VudDogIzU2YThmZjsKICAgIC0tbWpyLWJyZWFkY3J1bWItY3VycmVudDogIzM1ZDA4YjsKICAgIGRpc3BsYXk6IG5vbmU7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiA0cHg7CiAgICBwYWRkaW5nOiAzcHggNnB4OwogICAgbWFyZ2luOiAxcHggMCAzcHg7CiAgICBmb250LXNpemU6IDExcHg7CiAgICBvcGFjaXR5OiAwLjc4OwogICAgb3ZlcmZsb3c6IGF1dG87CiAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgYm9yZGVyLXJhZGl1czogOHB4OwogICAgYm9yZGVyOiAxcHggc29saWQgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1icmVhZGNydW1iLWFjY2VudCkgMjIlLCB0cmFuc3BhcmVudCk7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWJyZWFkY3J1bWItYWNjZW50KSA5JSwgdHJhbnNwYXJlbnQpOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItZm9sZGVyLWJyZWFkY3J1bWIuaXMtdmlzaWJsZSB7CiAgICBkaXNwbGF5OiBmbGV4Owp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItZm9sZGVyLWJyZWFkY3J1bWItYWN0aW9uIHsKICAgIHBhZGRpbmc6IDJweCA4cHg7CiAgICBib3JkZXI6IDFweCBzb2xpZCBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWJyZWFkY3J1bWItYWNjZW50KSA0MiUsIHRyYW5zcGFyZW50KTsKICAgIGJvcmRlci1yYWRpdXM6IDZweDsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYnJlYWRjcnVtYi1hY2NlbnQpIDE2JSwgdHJhbnNwYXJlbnQpOwogICAgY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYnJlYWRjcnVtYi1hY2NlbnQpIDc4JSwgI2ZmZmZmZik7CiAgICBmb250OiBpbmhlcml0OwogICAgY3Vyc29yOiBwb2ludGVyOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItZm9sZGVyLWJyZWFkY3J1bWItYWN0aW9uOmRpc2FibGVkIHsKICAgIGN1cnNvcjogZGVmYXVsdDsKICAgIG9wYWNpdHk6IDAuNTg7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1mb2xkZXItYnJlYWRjcnVtYi1hY3Rpb246bm90KDpkaXNhYmxlZCk6aG92ZXIgewogICAgYm9yZGVyLWNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWJyZWFkY3J1bWItYWNjZW50KSA2MiUsIHRyYW5zcGFyZW50KTsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYnJlYWRjcnVtYi1hY2NlbnQpIDI0JSwgdHJhbnNwYXJlbnQpOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItZm9sZGVyLWJyZWFkY3J1bWItc2VnbWVudCB7CiAgICBtYXgtd2lkdGg6IDIyMHB4OwogICAgbWluLXdpZHRoOiAwOwogICAgcGFkZGluZzogMXB4IDVweDsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHRyYW5zcGFyZW50OwogICAgYm9yZGVyLXJhZGl1czogNXB4OwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1icmVhZGNydW1iLWFjY2VudCkgOCUsIHRyYW5zcGFyZW50KTsKICAgIGNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWJyZWFkY3J1bWItYWNjZW50KSA3NiUsICNmZmZmZmYpOwogICAgZm9udDogaW5oZXJpdDsKICAgIGN1cnNvcjogcG9pbnRlcjsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWZvbGRlci1icmVhZGNydW1iLXNlZ21lbnQ6bm90KDpkaXNhYmxlZCk6aG92ZXIgewogICAgYm9yZGVyLWNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWJyZWFkY3J1bWItYWNjZW50KSAzOCUsIHRyYW5zcGFyZW50KTsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYnJlYWRjcnVtYi1hY2NlbnQpIDE2JSwgdHJhbnNwYXJlbnQpOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItZm9sZGVyLWJyZWFkY3J1bWItc2VnbWVudC5pcy1jdXJyZW50LAoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItZm9sZGVyLWJyZWFkY3J1bWItc2VnbWVudDpkaXNhYmxlZCB7CiAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYnJlYWRjcnVtYi1jdXJyZW50KSAzOCUsIHRyYW5zcGFyZW50KTsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYnJlYWRjcnVtYi1jdXJyZW50KSAxNCUsIHRyYW5zcGFyZW50KTsKICAgIGNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWJyZWFkY3J1bWItY3VycmVudCkgNzQlLCAjZmZmZmZmKTsKICAgIGN1cnNvcjogZGVmYXVsdDsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWZvbGRlci1icmVhZGNydW1iLXNlcGFyYXRvciB7CiAgICBjb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1icmVhZGNydW1iLWFjY2VudCkgNTglLCB2YXIoLS1tanItbXV0ZWQsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC42MikpKTsKICAgIG9wYWNpdHk6IDAuOTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLW1lZGlhLXNob3J0Y3V0cyB7CiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBnYXA6IDRweDsKICAgIGZsZXgtd3JhcDogd3JhcDsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLW1lZGlhLXNob3J0Y3V0LWJ0biB7CiAgICB3aWR0aDogMjRweDsKICAgIGhlaWdodDogMjRweDsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLW1lZGlhLXNob3J0Y3V0LWJ0biAucGkgewogICAgZm9udC1zaXplOiAxMXB4Owp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYW0tZHVwLWFsZXJ0IHsKICAgIHBhZGRpbmc6IDJweCA4cHg7CiAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXItY29sb3IsICM1NTUpOwogICAgYmFja2dyb3VuZDogdmFyKC0tY29tZnktbWVudS1iZywgIzIyMik7CiAgICBjb2xvcjogdmFyKC0taW5wdXQtdGV4dCwgI2VlZSk7CiAgICBib3JkZXItcmFkaXVzOiA5OTlweDsKICAgIGN1cnNvcjogcG9pbnRlcjsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFtLWJyb3dzZSB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IHN0cmV0Y2g7CiAgICBmbGV4OiAxOwogICAgbWluLWhlaWdodDogMDsKICAgIG1pbi13aWR0aDogMDsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICBib3JkZXItdG9wOiAxcHggc29saWQgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1ib3JkZXIpIDc1JSwgdHJhbnNwYXJlbnQpOwogICAgcGFkZGluZy10b3A6IDRweDsKfQoKLyogU2Nyb2xsYmFycyAobWF0Y2ggQ29tZnlVSSBmZWVsKSAqLwoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYW0tZ3JpZC1zY3JvbGwgewogICAgZmxleDogMSAxIGF1dG87CiAgICBtaW4td2lkdGg6IDA7CiAgICBtaW4taGVpZ2h0OiAwOwogICAgaGVpZ2h0OiAxMDAlOwogICAgb3ZlcmZsb3c6IGF1dG87CiAgICBvdmVyc2Nyb2xsLWJlaGF2aW9yOiBjb250YWluOwogICAgLXdlYmtpdC1vdmVyZmxvdy1zY3JvbGxpbmc6IHRvdWNoOwogICAgdG91Y2gtYWN0aW9uOiBwYW4teTsKICAgIHNjcm9sbGJhci13aWR0aDogdGhpbjsKICAgIHNjcm9sbGJhci1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1ib3JkZXIpIDg1JSwgdmFyKC0tY29udGVudC1mZywgI2RkZCkpIHRyYW5zcGFyZW50Owp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYW0tZ3JpZC1zY3JvbGw6Oi13ZWJraXQtc2Nyb2xsYmFyIHsKICAgIHdpZHRoOiAxMHB4OwogICAgaGVpZ2h0OiAxMHB4Owp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYW0tZ3JpZC1zY3JvbGw6Oi13ZWJraXQtc2Nyb2xsYmFyLXRyYWNrIHsKICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50Owp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYW0tZ3JpZC1zY3JvbGw6Oi13ZWJraXQtc2Nyb2xsYmFyLXRodW1iIHsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0yKSA1NSUsIHZhcigtLWNvbnRlbnQtZmcsICNkZGQpKTsKICAgIGJvcmRlcjogMnB4IHNvbGlkIHRyYW5zcGFyZW50OwogICAgYmFja2dyb3VuZC1jbGlwOiBwYWRkaW5nLWJveDsKICAgIGJvcmRlci1yYWRpdXM6IDk5OXB4Owp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYW0tZ3JpZC1zY3JvbGw6aG92ZXI6Oi13ZWJraXQtc2Nyb2xsYmFyLXRodW1iIHsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0yKSA3MCUsIHZhcigtLWNvbnRlbnQtZmcsICNkZGQpKTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFtLWdyaWQtc2Nyb2xsOjotd2Via2l0LXNjcm9sbGJhci1jb3JuZXIgewogICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hbS1jdXN0b20tY29udHJvbHMgewogICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICBmbGV4OiAxOwogICAgbWluLXdpZHRoOiAwOwogICAgZ2FwOiA4cHg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBmbGV4LWVuZDsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFtLXNlYXJjaCB7CiAgICBtYXJnaW4tYm90dG9tOiA4cHg7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogMTBweDsKICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFtLXNlYXJjaCB7CiAgICBwYWRkaW5nLWJvdHRvbTogNnB4OwogICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHZhcigtLW1qci1ib3JkZXIpOwogICAgbWFyZ2luLWJvdHRvbTogNnB4Owp9CgovKiBDYXJkIE1ldGFkYXRhIENvbG9ycyAqLwoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItbWV0YS1kdXJhdGlvbiB7CiAgICBjb2xvcjogI2ZmYTcyNjsgLyogT3JhbmdlIGZvciBkdXJhdGlvbiAqLwogICAgZm9udC13ZWlnaHQ6IDUwMDsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLW1ldGEtcmVzIHsKICAgIGNvbG9yOiAjNGZjM2Y3OyAvKiBMaWdodCBCbHVlIGZvciByZXNvbHV0aW9uICovCiAgICBmb250LXdlaWdodDogNTAwOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItbWV0YS1kYXRlIHsKICAgIGNvbG9yOiAjYjlmNmNhOyAvKiBQYWxlIEdyZWVuIGZvciBkYXRlICovCiAgICBmb250LXNpemU6IDAuOWVtOwogICAgZm9udC13ZWlnaHQ6IDUwMDsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLW1ldGEtdGltZSB7CiAgICBjb2xvcjogdmFyKC0tbWpyLW11dGVkLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNjUpKTsKICAgIGZvbnQtc2l6ZTogMC45ZW07Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hbS1zdW1tYXJ5IHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOwogICAgZ2FwOiAxMHB4OwogICAgbWFyZ2luOiAwIDAgNnB4IDA7CiAgICBwYWRkaW5nOiAwIDAgNHB4IDA7CiAgICBtaW4taGVpZ2h0OiAxNnB4OwogICAgZm9udC1zaXplOiAxMXB4OwogICAgY29sb3I6IHZhcigtLW1qci1tdXRlZCwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjY1KSk7CiAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1ib3JkZXIpIDY1JSwgdHJhbnNwYXJlbnQpOwogICAgZmxleDogMCAwIGF1dG87Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hbS1zdW1tYXJ5LXRleHQgewogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFtLXN1bW1hcnktcmlnaHQgewogICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiA2cHg7CiAgICBtaW4td2lkdGg6IDA7CiAgICBmbGV4LXdyYXA6IHdyYXA7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hbS1jb250ZXh0LXBpbGxzIHsKICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogNXB4OwogICAgcm93LWdhcDogNHB4OwogICAgZmxleC13cmFwOiB3cmFwOwogICAganVzdGlmeS1jb250ZW50OiBmbGV4LWVuZDsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWNvbnRleHQtcGlsbCB7CiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBnYXA6IDZweDsKICAgIHBhZGRpbmc6IDNweCA3cHg7CiAgICBib3JkZXItcmFkaXVzOiA5OTlweDsKICAgIGJvcmRlcjogMXB4IHNvbGlkIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYWNjZW50KSA1NSUsIHZhcigtLW1qci1ib3JkZXIpKTsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0yKSA1NSUsIHZhcigtLW1qci1hY2NlbnQpIDEwJSk7CiAgICBib3gtc2hhZG93OiAwIDAgMCAxcHggY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQpIDE4JSwgdHJhbnNwYXJlbnQpOwogICAgY29sb3I6IHZhcigtLWNvbnRlbnQtZmcsICNkZGQpOwogICAgZm9udC1zaXplOiAxMC41cHg7CiAgICBsaW5lLWhlaWdodDogMTsKICAgIG1pbi1oZWlnaHQ6IDIycHg7CiAgICBtYXgtd2lkdGg6IDIyMHB4Owp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItY29udGV4dC1waWxsOmhvdmVyIHsKICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQpIDc1JSwgdmFyKC0tbWpyLWJvcmRlcikpOwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTIpIDUwJSwgdmFyKC0tbWpyLWFjY2VudCkgMTQlKTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWNvbnRleHQtcGlsbC10ZXh0IHsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICBvcGFjaXR5OiAwLjkyOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItY29udGV4dC1waWxsLXggewogICAgd2lkdGg6IDIwcHg7CiAgICBoZWlnaHQ6IDIwcHg7CiAgICBwYWRkaW5nOiAwOwogICAgYm9yZGVyOiAxcHggc29saWQgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1ib3JkZXIpIDc1JSwgdHJhbnNwYXJlbnQpOwogICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7CiAgICBib3JkZXItcmFkaXVzOiA5OTlweDsKICAgIGNvbG9yOiB2YXIoLS1tanItbXV0ZWQsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC42NSkpOwogICAgY3Vyc29yOiBwb2ludGVyOwogICAgbGluZS1oZWlnaHQ6IDE7CiAgICBmb250LXNpemU6IDE0cHg7CiAgICBmb250LWZhbWlseTogaW5oZXJpdDsKICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgdHJhbnNpdGlvbjoKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yIDEyMG1zIGVhc2UsCiAgICAgICAgYm9yZGVyLWNvbG9yIDEyMG1zIGVhc2U7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1jb250ZXh0LXBpbGwteDpob3ZlciB7CiAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYWNjZW50KSA1NSUsIHZhcigtLW1qci1ib3JkZXIpKTsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0yKSA3MCUsIHZhcigtLW1qci1hY2NlbnQpIDEwJSk7CiAgICBjb2xvcjogdmFyKC0tY29udGVudC1mZywgI2ZmZik7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hbS1zZWFyY2gtcGlsbCB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogMTBweDsKICAgIGhlaWdodDogMS43NXJlbTsKICAgIHBhZGRpbmc6IDAgMTBweDsKICAgIHdpZHRoOiAxMDAlOwogICAgbWF4LXdpZHRoOiBub25lOwogICAgYm9yZGVyLXJhZGl1czogdmFyKC0tcmFkaXVzLWxnLCAwLjVyZW0pOwogICAgYmFja2dyb3VuZDogdmFyKC0tY29tZnktaW5wdXQtYmcsIHJnYmEoMCwgMCwgMCwgMC4yNSkpOwogICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tbWpyLWJvcmRlcik7CiAgICBmbGV4OiAxIDEgYXV0bzsKICAgIG1pbi13aWR0aDogMDsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFtLXNlYXJjaC10b29scyB7CiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBnYXA6IDhweDsKICAgIGZsZXg6IDAgMCBhdXRvOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItcG9wb3Zlci1hbmNob3IgewogICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwp9CgoubWpyLWFnZW5kYS1pbnB1dCB7CiAgICBkaXNwbGF5OiBub25lOwogICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tbWpyLWJvcmRlcik7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1jb21meS1pbnB1dC1iZywgcmdiYSgwLCAwLCAwLCAwLjI1KSk7CiAgICBjb2xvcjogdmFyKC0taW5wdXQtdGV4dCwgI2RkZCk7CiAgICB0cmFuc2l0aW9uOgogICAgICAgIGJhY2tncm91bmQtY29sb3IgMC4ycyBlYXNlLAogICAgICAgIGNvbG9yIDAuMnMgZWFzZSwKICAgICAgICBib3JkZXItY29sb3IgMC4ycyBlYXNlOwp9Ci5tanItYWdlbmRhLWlucHV0Lm1qci1hZ2VuZGEtZmlsbGVkIHsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peCgKICAgICAgICBpbiBzcmdiLAogICAgICAgIHZhcigtLW1qci1hY2NlbnQsIHZhcigtLWNvbWZ5LWFjY2VudCwgIzVmYjNmZikpIDQwJSwKICAgICAgICB2YXIoLS1tanItc3VyZmFjZS0yKSA2MCUKICAgICk7CiAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peCgKICAgICAgICBpbiBzcmdiLAogICAgICAgIHZhcigtLW1qci1hY2NlbnQsIHZhcigtLWNvbWZ5LWFjY2VudCwgIzVmYjNmZikpIDgwJSwKICAgICAgICB2YXIoLS1tanItYm9yZGVyKQogICAgKTsKICAgIGNvbG9yOiB2YXIoLS1jb250ZW50LWZnLCAjZmZmKTsKfQoubWpyLWFnZW5kYS1pbnB1dC5tanItYWdlbmRhLWVtcHR5IHsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0yKSA4NSUsIHRyYW5zcGFyZW50IDE1JSk7CiAgICBib3JkZXItY29sb3I6IHZhcigtLW1qci1ib3JkZXIpOwogICAgY29sb3I6IHZhcigtLW1qci1tdXRlZCwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjY1KSk7Cn0KCi5tanItYWdlbmRhLWNvbnRhaW5lciB7CiAgICB3aWR0aDogMTAwJTsKfQoKLm1qci1hZ2VuZGEtY2FsZW5kYXIgewogICAgZGlzcGxheTogZmxleDsKICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICBnYXA6IDhweDsKICAgIHdpZHRoOiAxMDAlOwogICAgbWluLXdpZHRoOiAwOwp9CgoubWpyLWFnZW5kYS1oZWFkZXIgewogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBnYXA6IDhweDsKfQoKLm1qci1hZ2VuZGEtbW9udGggewogICAgZmxleDogMTsKICAgIHRleHQtYWxpZ246IGNlbnRlcjsKICAgIGZvbnQtd2VpZ2h0OiA2MDA7CiAgICBmb250LXNpemU6IDEycHg7CiAgICBjb2xvcjogdmFyKC0tY29udGVudC1mZywgI2RkZCk7CiAgICB1c2VyLXNlbGVjdDogbm9uZTsKfQoKLm1qci1hZ2VuZGEtbmF2IHsKICAgIHdpZHRoOiAzMnB4OwogICAgaGVpZ2h0OiAyOHB4OwogICAgcGFkZGluZzogMDsKICAgIGJvcmRlci1yYWRpdXM6IDEwcHg7Cn0KCi5tanItYWdlbmRhLWdyaWQgewogICAgZGlzcGxheTogZ3JpZDsKICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogcmVwZWF0KDcsIG1pbm1heCgwLCAxZnIpKTsKICAgIGdhcDogNnB4OwogICAgd2lkdGg6IDEwMCU7Cn0KCi5tanItYWdlbmRhLXdlZWtkYXkgewogICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgZm9udC1zaXplOiAxMXB4OwogICAgY29sb3I6IHZhcigtLW1qci1tdXRlZCwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjY1KSk7CiAgICB1c2VyLXNlbGVjdDogbm9uZTsKfQoKLm1qci1hZ2VuZGEtZGF5IHsKICAgIGhlaWdodDogMzBweDsKICAgIGJvcmRlci1yYWRpdXM6IDEwcHg7CiAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1tanItYm9yZGVyKTsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0yKSA1NSUsIHRyYW5zcGFyZW50KTsKICAgIGNvbG9yOiB2YXIoLS1jb250ZW50LWZnLCAjZGRkKTsKICAgIGN1cnNvcjogcG9pbnRlcjsKICAgIGZvbnQtc2l6ZTogMTJweDsKICAgIGxpbmUtaGVpZ2h0OiAxOwogICAgcGFkZGluZzogMDsKICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgdHJhbnNpdGlvbjoKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yIDEyMG1zIGVhc2UsCiAgICAgICAgYm9yZGVyLWNvbG9yIDEyMG1zIGVhc2UsCiAgICAgICAgdHJhbnNmb3JtIDgwbXMgZWFzZTsKfQoKLm1qci1hZ2VuZGEtZGF5LWJhZGdlIHsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIHRvcDogLTVweDsKICAgIHJpZ2h0OiAtNXB4OwogICAgbWluLXdpZHRoOiAxNnB4OwogICAgaGVpZ2h0OiAxNnB4OwogICAgcGFkZGluZzogMCA0cHg7CiAgICBib3JkZXItcmFkaXVzOiA5OTlweDsKICAgIGJhY2tncm91bmQ6ICNlNTM5MzU7CiAgICBjb2xvcjogI2ZmZjsKICAgIGJvcmRlcjogMXB4IHNvbGlkIGNvbG9yLW1peChpbiBzcmdiLCAjZTUzOTM1IDY1JSwgI2ZmZmZmZiAzNSUpOwogICAgZm9udC1zaXplOiAxMHB4OwogICAgZm9udC13ZWlnaHQ6IDcwMDsKICAgIGxpbmUtaGVpZ2h0OiAxNHB4OwogICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94Owp9CgoubWpyLWFnZW5kYS1kYXk6aG92ZXIgewogICAgYm9yZGVyLWNvbG9yOiBjb2xvci1taXgoCiAgICAgICAgaW4gc3JnYiwKICAgICAgICB2YXIoLS1tanItYm9yZGVyKSA1NSUsCiAgICAgICAgdmFyKC0tbWpyLWFjY2VudCwgdmFyKC0tY29tZnktYWNjZW50LCAjNWZiM2ZmKSkgNDUlCiAgICApOwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KAogICAgICAgIGluIHNyZ2IsCiAgICAgICAgdmFyKC0tbWpyLXN1cmZhY2UtMikgNDUlLAogICAgICAgIHZhcigtLW1qci1hY2NlbnQsIHZhcigtLWNvbWZ5LWFjY2VudCwgIzVmYjNmZikpIDEwJQogICAgKTsKfQoKLm1qci1hZ2VuZGEtZGF5OmFjdGl2ZSB7CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoMXB4KTsKfQoKLm1qci1hZ2VuZGEtZGF5LS1ibGFuayB7CiAgICB2aXNpYmlsaXR5OiBoaWRkZW47CiAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKfQoKLm1qci1hZ2VuZGEtZGF5LS1oYXMtYXNzZXRzIHsKICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KAogICAgICAgIGluIHNyZ2IsCiAgICAgICAgdmFyKC0tbWpyLWFjY2VudCwgdmFyKC0tY29tZnktYWNjZW50LCAjNWZiM2ZmKSkgODAlLAogICAgICAgIHZhcigtLW1qci1ib3JkZXIpCiAgICApOwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KAogICAgICAgIGluIHNyZ2IsCiAgICAgICAgdmFyKC0tbWpyLWFjY2VudCwgdmFyKC0tY29tZnktYWNjZW50LCAjNWZiM2ZmKSkgMTglLAogICAgICAgIHZhcigtLW1qci1zdXJmYWNlLTIpIDgyJQogICAgKTsKfQoKLm1qci1hZ2VuZGEtZGF5LS1zZWxlY3RlZCB7CiAgICBib3JkZXItY29sb3I6IHZhcigtLW1qci1hY2NlbnQsIHZhcigtLWNvbWZ5LWFjY2VudCwgIzVmYjNmZikpOwogICAgYm94LXNoYWRvdzogMCAwIDAgMXB4CiAgICAgICAgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQsIHZhcigtLWNvbWZ5LWFjY2VudCwgIzVmYjNmZikpIDU1JSwgdHJhbnNwYXJlbnQpOwp9CgoubWpyLWFnZW5kYS1mb290ZXIgewogICAgZGlzcGxheTogZmxleDsKICAgIGdhcDogOHB4OwogICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOwp9CgoubWpyLWFnZW5kYS1jbGVhciwKLm1qci1hZ2VuZGEtcmVmcmVzaCB7CiAgICBmbGV4OiAxOwp9CgoubWpyLW1lbnUsCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1tZW51IHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgZ2FwOiA0cHg7Cn0KCi5tanItcHJpbWUtbWVudS1saXN0LAoubWpyLXNvcnQtbWVudSBbZGF0YS1wYy1zZWN0aW9uPSJsaXN0Il0gewogICAgbGlzdC1zdHlsZTogbm9uZTsKICAgIG1hcmdpbjogMDsKICAgIHBhZGRpbmc6IDA7CiAgICBkaXNwbGF5OiBncmlkOwogICAgZ2FwOiA2cHg7Cn0KCi5tanItcHJpbWUtbWVudSBbZGF0YS1wYy1zZWN0aW9uPSJpdGVtIl0sCi5tanItcHJpbWUtbWVudS1saXN0IFtkYXRhLXBjLXNlY3Rpb249Iml0ZW0iXSB7CiAgICBsaXN0LXN0eWxlOiBub25lOwp9CgoubWpyLXByaW1lLW1lbnUgW2RhdGEtcGMtc2VjdGlvbj0iaXRlbWNvbnRlbnQiXSB7CiAgICB3aWR0aDogMTAwJTsKfQoKLm1qci1tZW51LWl0ZW0sCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1tZW51LWl0ZW0gewogICAgYXBwZWFyYW5jZTogbm9uZTsKICAgIC13ZWJraXQtYXBwZWFyYW5jZTogbm9uZTsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOwogICAgZ2FwOiAxMHB4OwogICAgd2lkdGg6IDEwMCU7CiAgICBwYWRkaW5nOiA4cHggMTBweDsKICAgIGJvcmRlci1yYWRpdXM6IDEwcHg7CiAgICBib3JkZXI6IDFweCBzb2xpZCB0cmFuc3BhcmVudDsKICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50OwogICAgY29sb3I6IHZhcigtLWNvbnRlbnQtZmcsICNkZGQpOwogICAgZm9udC1mYW1pbHk6IGluaGVyaXQ7CiAgICB0ZXh0LWFsaWduOiBsZWZ0OwogICAgY3Vyc29yOiBwb2ludGVyOwogICAgdHJhbnNpdGlvbjoKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yIDEyMG1zIGVhc2UsCiAgICAgICAgYm9yZGVyLWNvbG9yIDEyMG1zIGVhc2UsCiAgICAgICAgdHJhbnNmb3JtIDgwbXMgZWFzZTsKfQoKLm1qci1tZW51LWl0ZW06aG92ZXIsCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1tZW51LWl0ZW06aG92ZXIgewogICAgYm9yZGVyLWNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWJvcmRlcikgODAlLCB0cmFuc3BhcmVudCk7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMikgNTUlLCB0cmFuc3BhcmVudCk7Cn0KCi5tanItbWVudS1pdGVtOmFjdGl2ZSwKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLW1lbnUtaXRlbTphY3RpdmUgewogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDFweCk7Cn0KCi5tanItbWVudS1pdGVtLWxhYmVsLAoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItbWVudS1pdGVtLWxhYmVsIHsKICAgIGZsZXg6IDEgMSBhdXRvOwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgIG1pbi13aWR0aDogMDsKfQoKLm1qci1tZW51LWl0ZW0tY2hlY2ssCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1tZW51LWl0ZW0tY2hlY2sgewogICAgZm9udC1zaXplOiAxMnB4OwogICAgd2lkdGg6IDE2cHg7CiAgICBmbGV4OiAwIDAgMTZweDsKICAgIHRleHQtYWxpZ246IGNlbnRlcjsKICAgIG9wYWNpdHk6IDA7CiAgICBjb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQpIDcyJSwgdmFyKC0tY29udGVudC1mZykpOwogICAgdHJhbnNpdGlvbjoKICAgICAgICBvcGFjaXR5IDEyMG1zIGVhc2UsCiAgICAgICAgY29sb3IgMTIwbXMgZWFzZTsKfQoKLm1qci1tZW51LWl0ZW0gLnBpLAoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItbWVudS1pdGVtIC5waSB7CiAgICBmb250LXNpemU6IDEzcHg7CiAgICBvcGFjaXR5OiAwLjk7Cn0KCi5tanItY29sbGVjdGlvbnMtbWVudSB7CiAgICBkaXNwbGF5OiBncmlkOwogICAgZ2FwOiA2cHg7Cn0KCi5tanItbWVudS1pdGVtLWxhYmVsLS1pY29uIHsKICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogOHB4OwogICAgZmxleDogMSAxIGF1dG87CiAgICBtaW4td2lkdGg6IDA7Cn0KCi5tanItbWVudS1pdGVtLWxhYmVsLS1pY29uIC5waSB7CiAgICB3aWR0aDogMTZweDsKICAgIGZsZXg6IDAgMCAxNnB4OwogICAgdGV4dC1hbGlnbjogY2VudGVyOwp9CgoubWpyLW1lbnUtaXRlbS1yaWdodCB7CiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBnYXA6IDEwcHg7CiAgICBmbGV4OiAwIDAgYXV0bzsKICAgIG1pbi13aWR0aDogMTZweDsKICAgIG1hcmdpbi1sZWZ0OiBhdXRvOwogICAganVzdGlmeS1jb250ZW50OiBmbGV4LWVuZDsKfQoKLm1qci1tZW51LWl0ZW0taGludCB7CiAgICBjb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLWNvbnRlbnQtZmcpIDYyJSwgdmFyKC0tbWpyLW11dGVkKSk7CiAgICBvcGFjaXR5OiAwLjcyOwogICAgZm9udC1zaXplOiAxMXB4OwogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKfQoKLm1qci1tZW51LWl0ZW0tY2hlY2stLXZpc2libGUsCi5tanItbWVudS1pdGVtLmlzLWFjdGl2ZSAubWpyLW1lbnUtaXRlbS1jaGVjayB7CiAgICBvcGFjaXR5OiAxOwp9CgoubWpyLW1lbnUtZGl2aWRlciB7CiAgICBoZWlnaHQ6IDFweDsKICAgIG1hcmdpbjogNHB4IDA7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWJvcmRlcikgODAlLCB0cmFuc3BhcmVudCk7Cn0KCi5tanItbXV0ZWQgewogICAgcGFkZGluZzogMTBweCAxMnB4OwogICAgb3BhY2l0eTogMC43NTsKfQoKLm1qci1zdGF0ZS1ibG9jayB7CiAgICBmb250LXNpemU6IDEwcHg7CiAgICBsaW5lLWhlaWdodDogMS4zNTsKICAgIGNvbG9yOiB2YXIoLS1tanItbXV0ZWQpOwogICAgYm9yZGVyOiAxcHggZGFzaGVkIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYm9yZGVyKSA4NSUsIHRyYW5zcGFyZW50KTsKICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLW1qci1yLXNtKTsKICAgIHBhZGRpbmc6IDhweCAxMHB4OwogICAgbWFyZ2luOiA0cHggMDsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0xKSA3MCUsIHRyYW5zcGFyZW50KTsKfQoKLm1qci1zdGF0ZS1ibG9jay5pcy1lcnJvciwKLm1qci1jb250ZXh0LW1lbnUtbm90ZS5pcy1lcnJvciB7CiAgICBjb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdGF0dXMtZXJyb3IpIDgyJSwgdmFyKC0tY29udGVudC1mZykpOwogICAgYm9yZGVyLWNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN0YXR1cy1lcnJvcikgNDUlLCB2YXIoLS1tanItYm9yZGVyKSk7Cn0KCi5tanItY29sbGVjdGlvbi1yb3cgewogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBzdHJldGNoOwogICAgd2lkdGg6IDEwMCU7CiAgICBtaW4taGVpZ2h0OiA0OHB4Owp9CgoubWpyLWNvbGxlY3Rpb25zLXZpcnR1YWwtbGlzdCB7CiAgICB3aWR0aDogMTAwJTsKICAgIG92ZXJmbG93OiBhdXRvOwogICAgc2Nyb2xsYmFyLXdpZHRoOiB0aGluOwp9CgoubWpyLWRlbGV0ZS1idG4gewogICAgd2lkdGg6IDQycHg7CiAgICBmbGV4OiAwIDAgNDJweDsKICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgcGFkZGluZzogMDsKICAgIG1hcmdpbi1sZWZ0OiA2cHg7CiAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYm9yZGVyKSA2NSUsIHZhcigtLW1qci1zdGF0dXMtZXJyb3IpIDQ1JSk7Cn0KCi5tanItZGVsZXRlLWJ0bjpob3Zlcjpub3QoOmRpc2FibGVkKSB7CiAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYm9yZGVyKSA0MCUsIHZhcigtLW1qci1zdGF0dXMtZXJyb3IpIDY1JSk7Cn0KCi5tanItZGVsZXRlLWJ0biAucGkgewogICAgY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3RhdHVzLWVycm9yKSA3OCUsIHZhcigtLWNvbnRlbnQtZmcpKTsKfQoKLm1qci1zZWN0aW9uLXRpdGxlIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiA2cHg7CiAgICBwYWRkaW5nOiA2cHggMTBweCAycHg7CiAgICBmb250LXNpemU6IDEwcHg7CiAgICBmb250LXdlaWdodDogNzAwOwogICAgbGV0dGVyLXNwYWNpbmc6IDAuNnB4OwogICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKICAgIG9wYWNpdHk6IDAuODg7CiAgICBjb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLWNvbnRlbnQtZmcpIDcyJSwgdmFyKC0tbWpyLW11dGVkKSk7Cn0KCi5tanItc2VjdGlvbi10aXRsZS0tY3lhbiB7CiAgICBjb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsICM2ZmQ0ZmYgNzglLCB2YXIoLS1jb250ZW50LWZnKSk7Cn0KCi5tanItc2VjdGlvbi10aXRsZS0tdmlvbGV0IHsKICAgIGNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgI2M0OGRmZiA3OCUsIHZhcigtLWNvbnRlbnQtZmcpKTsKfQoKLm1qci1zZWN0aW9uLWhpbnQgewogICAgcGFkZGluZzogMCAxMHB4IDRweDsKICAgIGZvbnQtc2l6ZTogMTBweDsKICAgIGxpbmUtaGVpZ2h0OiAxLjQ7CiAgICBjb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLWNvbnRlbnQtZmcpIDU1JSwgdmFyKC0tbWpyLW11dGVkKSk7Cn0KCi5tanItbWVudS1pdGVtLS1zbWFydCwKLm1qci1tZW51LWl0ZW0tLWNsdXN0ZXIgewogICAgYm9yZGVyLWNvbG9yOiB0cmFuc3BhcmVudDsKICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50Owp9CgoubWpyLW1lbnUtaXRlbS0tY2x1c3RlciB7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgIGNvbG9yOiB2YXIoLS1jb250ZW50LWZnKTsKfQoKLm1qci1tZW51LWl0ZW0tLXNtYXJ0IC5waSB7CiAgICBjb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsICM2ZmQ0ZmYgNzQlLCB2YXIoLS1jb250ZW50LWZnKSk7Cn0KCi5tanItbWVudS1pdGVtLS1jbHVzdGVyIC5waSB7CiAgICBjb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsICNjNDhkZmYgNzQlLCB2YXIoLS1jb250ZW50LWZnKSk7Cn0KCi5tanItbWVudS1pdGVtLS1zbWFydDpob3Zlcjpub3QoOmRpc2FibGVkKSwKLm1qci1tZW51LWl0ZW0tLWNsdXN0ZXI6aG92ZXI6bm90KDpkaXNhYmxlZCkgewogICAgYm9yZGVyLWNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWJvcmRlcikgODAlLCB0cmFuc3BhcmVudCk7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMikgNTUlLCB0cmFuc3BhcmVudCk7Cn0KCi5tanItY2x1c3Rlci1yb3cgewogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBnYXA6IDhweDsKICAgIG1hcmdpbi1ib3R0b206IDRweDsKICAgIHBhZGRpbmc6IDZweCA4cHg7CiAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1tanItci1zbSk7CiAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1tanItYm9yZGVyKTsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0xKSA3MCUsIHRyYW5zcGFyZW50KTsKfQoKLm1qci1jbHVzdGVyLXRodW1icyB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZ2FwOiAzcHg7CiAgICBmbGV4LXNocmluazogMDsKfQoKLm1qci1jbHVzdGVyLXRodW1iIHsKICAgIHdpZHRoOiAyOHB4OwogICAgaGVpZ2h0OiAyOHB4OwogICAgYm9yZGVyLXJhZGl1czogNHB4OwogICAgb2JqZWN0LWZpdDogY292ZXI7CiAgICBvcGFjaXR5OiAwLjg1OwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTIpIDYwJSwgdHJhbnNwYXJlbnQpOwp9CgoubWpyLWNsdXN0ZXItaW5mbyB7CiAgICBmbGV4OiAxOwogICAgbWluLXdpZHRoOiAwOwp9CgoubWpyLWNsdXN0ZXItbmFtZSB7CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7CiAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgZm9udC1zaXplOiAxMnB4OwogICAgZm9udC13ZWlnaHQ6IDYwMDsKICAgIGNvbG9yOiB2YXIoLS1jb250ZW50LWZnKTsKfQoKLm1qci1jbHVzdGVyLWNvdW50IHsKICAgIGZvbnQtc2l6ZTogMTBweDsKICAgIGNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tY29udGVudC1mZykgNTglLCB2YXIoLS1tanItbXV0ZWQpKTsKfQoKLm1qci1jbHVzdGVyLWNyZWF0ZS1idG4gewogICAgZmxleC1zaHJpbms6IDA7CiAgICBwYWRkaW5nOiAzcHggOHB4OwogICAgYm9yZGVyLXJhZGl1czogNnB4OwogICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tbWpyLWJvcmRlcik7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMikgNTUlLCB0cmFuc3BhcmVudCk7CiAgICBjb2xvcjogdmFyKC0tY29udGVudC1mZyk7CiAgICBmb250LXNpemU6IDExcHg7CiAgICBmb250LXdlaWdodDogNzAwOwogICAgY3Vyc29yOiBwb2ludGVyOwogICAgdHJhbnNpdGlvbjoKICAgICAgICBib3JkZXItY29sb3IgMTIwbXMgZWFzZSwKICAgICAgICBiYWNrZ3JvdW5kIDEyMG1zIGVhc2UsCiAgICAgICAgb3BhY2l0eSAxMjBtcyBlYXNlOwp9CgoubWpyLWNsdXN0ZXItY3JlYXRlLWJ0bjpkaXNhYmxlZCB7CiAgICBvcGFjaXR5OiAwLjYyOwogICAgY3Vyc29yOiBkZWZhdWx0Owp9CgoubWpyLWNsdXN0ZXItY3JlYXRlLWJ0bjpob3Zlcjpub3QoOmRpc2FibGVkKSB7CiAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYm9yZGVyKSA4MCUsIHRyYW5zcGFyZW50KTsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0yKSA2MiUsIHRyYW5zcGFyZW50KTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFtLXNlYXJjaC1pY29uIHsKICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgY29sb3I6IHZhcigtLW1qci1tdXRlZCk7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hbS1zZWFyY2gtaWNvbiAucGkgewogICAgZm9udC1zaXplOiAxMnB4OwogICAgbGluZS1oZWlnaHQ6IDE7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hbS1zZWFyY2gtcGlsbCAubWpyLWlucHV0IHsKICAgIHBhZGRpbmc6IDAgIWltcG9ydGFudDsKICAgIGJvcmRlcjogbm9uZSAhaW1wb3J0YW50OwogICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQgIWltcG9ydGFudDsKICAgIGJveC1zaGFkb3c6IG5vbmUgIWltcG9ydGFudDsKICAgIGZvbnQtc2l6ZTogMTJweCAhaW1wb3J0YW50OwogICAgbGluZS1oZWlnaHQ6IDEuMiAhaW1wb3J0YW50Owp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYW0tc2VhcmNoLXBpbGw6Zm9jdXMtd2l0aGluIHsKICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQpIDY1JSwgdmFyKC0tbWpyLWJvcmRlcikpOwogICAgYm94LXNoYWRvdzogMCAwIDAgMnB4IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYWNjZW50KSAxOCUsIHRyYW5zcGFyZW50KTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFtLWJyb3dzZSB7CiAgICBtYXJnaW4tdG9wOiAwOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYW0tZ3JpZC1zY3JvbGwgewogICAgcGFkZGluZy1yaWdodDogNHB4OwogICAgc2Nyb2xsYmFyLWd1dHRlcjogc3RhYmxlOwp9CgovKiBHcmlkIGxheW91dCAqLwoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItZ3JpZCB7CiAgICBkaXNwbGF5OiBncmlkOwogICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgLyogQXZvaWQgb3ZlcmZsb3cgd2hlbiB0aGUgcGFuZWwgYmVjb21lcyBuYXJyb3dlciB0aGFuIHRoZSBtaW4gY2FyZCBzaXplICovCiAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IHJlcGVhdCgKICAgICAgICBhdXRvLWZpbGwsCiAgICAgICAgbWlubWF4KG1pbigxMDAlLCB2YXIoLS1tanItZ3JpZC1taW4tc2l6ZSwgMTgwcHgpKSwgMWZyKQogICAgKTsKICAgIGdhcDogdmFyKC0tbWpyLWdyaWQtZ2FwLCAxMHB4KTsKICAgIG1hcmdpbi10b3A6IDZweDsKICAgIG1pbi1oZWlnaHQ6IDA7Cn0KCi8qIENhcmQgc2VsZWN0aW9uICsgZm9jdXMgKGtlZXBzIGEgdmlzaWJsZSBpbmRpY2F0b3Igd2hlbiBzaWRlYmFyIGlzIG9wZW4pICovCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hc3NldC1jYXJkIHsKICAgIG91dGxpbmU6IG5vbmU7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hc3NldC1jYXJkLmlzLXNlbGVjdGVkIHsKICAgIGJveC1zaGFkb3c6CiAgICAgICAgMCAwIDAgM3B4IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItY2FyZC1zZWxlY3Rpb24tY29sb3IpIDgwJSwgdmFyKC0tY29udGVudC1mZykpLAogICAgICAgIDAgMCAwIDZweCBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWNhcmQtc2VsZWN0aW9uLWNvbG9yKSAzMCUsIHRyYW5zcGFyZW50KSwKICAgICAgICAwIDAgMjBweCBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWNhcmQtc2VsZWN0aW9uLWNvbG9yKSA0MCUsIHRyYW5zcGFyZW50KSwKICAgICAgICAwIDEwcHggMjhweCByZ2JhKDAsIDAsIDAsIDAuMjgpOwogICAgYm9yZGVyLXJhZGl1czogdmFyKC0tbWpyLXItbGcpOwogICAgLyogc2NhbGUoMC45NykgaW5zdGVhZCBvZiAwLjkyOiBzdWJ0bGUgaW5zZXQgZmVlbCB3aXRob3V0IHRoZSBhZ2dyZXNzaXZlCiAgICAgICBzaHJpbmsgdGhhdCBjYXVzZWQgYSB2aXNpYmxlIGJsaW5rIG9uIHJhcGlkIHNlbGVjdGlvbiBjaGFuZ2VzLiAqLwogICAgdHJhbnNmb3JtOiBzY2FsZSgwLjk3KSAhaW1wb3J0YW50OwogICAgei1pbmRleDogMTA7CiAgICBvdXRsaW5lOiAycHggc29saWQgdmFyKC0tbWpyLWNhcmQtc2VsZWN0aW9uLWNvbG9yKTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFzc2V0LWNhcmQ6Zm9jdXMtdmlzaWJsZSB7CiAgICBib3gtc2hhZG93OgogICAgICAgIDAgMCAwIDNweCBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWFjY2VudCkgODAlLCB2YXIoLS1jb250ZW50LWZnKSksCiAgICAgICAgMCAwIDAgNnB4IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYWNjZW50KSAzMCUsIHRyYW5zcGFyZW50KSwKICAgICAgICAwIDAgMjBweCBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWFjY2VudCkgNDAlLCB0cmFuc3BhcmVudCksCiAgICAgICAgMCAxMHB4IDI4cHggcmdiYSgwLCAwLCAwLCAwLjI4KTsKICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLW1qci1yLWxnKTsKICAgIHRyYW5zZm9ybTogc2NhbGUoMC45NykgIWltcG9ydGFudDsKICAgIHotaW5kZXg6IDEwOwp9CgpAa2V5ZnJhbWVzIG1qci1saXZlLXBsYWNlaG9sZGVyLXNoZWVuIHsKICAgIDAlIHsKICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLTU4JSk7CiAgICAgICAgb3BhY2l0eTogMC4xODsKICAgIH0KICAgIDUwJSB7CiAgICAgICAgb3BhY2l0eTogMC4zNDsKICAgIH0KICAgIDEwMCUgewogICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWCg1OCUpOwogICAgICAgIG9wYWNpdHk6IDAuMTg7CiAgICB9Cn0KCkBrZXlmcmFtZXMgbWpyLWxpdmUtcGxhY2Vob2xkZXItcHVsc2UgewogICAgMCUsCiAgICAxMDAlIHsKICAgICAgICBib3gtc2hhZG93OgogICAgICAgICAgICAwIDAgMCAxcHggcmdiYSgxMTgsIDIxNCwgMjU1LCAwLjM0KSwKICAgICAgICAgICAgMCAxMHB4IDI0cHggcmdiYSgwLCAwLCAwLCAwLjI0KTsKICAgIH0KICAgIDUwJSB7CiAgICAgICAgYm94LXNoYWRvdzoKICAgICAgICAgICAgMCAwIDAgMXB4IHJnYmEoMTE4LCAyMTQsIDI1NSwgMC41MiksCiAgICAgICAgICAgIDAgMCAwIDRweCByZ2JhKDExOCwgMjE0LCAyNTUsIDAuMTIpLAogICAgICAgICAgICAwIDEycHggMzBweCByZ2JhKDAsIDAsIDAsIDAuMjgpOwogICAgfQp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYXNzZXQtY2FyZFtkYXRhLW1qci1saXZlLXBsYWNlaG9sZGVyPSJ0cnVlIl0gewogICAgYW5pbWF0aW9uOiBtanItbGl2ZS1wbGFjZWhvbGRlci1wdWxzZSAxLjlzIGVhc2UtaW4tb3V0IGluZmluaXRlOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYXNzZXQtY2FyZFtkYXRhLW1qci1saXZlLXBsYWNlaG9sZGVyPSJ0cnVlIl0gLm1qci10aHVtYiB7CiAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICBvdmVyZmxvdzogaGlkZGVuOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItbGl2ZS1wbGFjZWhvbGRlci13YXNoIHsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIGluc2V0OiAtOCU7CiAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgIHotaW5kZXg6IDE7CiAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoCiAgICAgICAgMTE1ZGVnLAogICAgICAgIHJnYmEoOTgsIDE5OSwgMjU1LCAwKSAwJSwKICAgICAgICByZ2JhKDk4LCAxOTksIDI1NSwgMC4wOCkgMzAlLAogICAgICAgIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4yNCkgNTAlLAogICAgICAgIHJnYmEoOTgsIDE5OSwgMjU1LCAwLjEyKSA3MCUsCiAgICAgICAgcmdiYSg5OCwgMTk5LCAyNTUsIDApIDEwMCUKICAgICk7CiAgICBhbmltYXRpb246IG1qci1saXZlLXBsYWNlaG9sZGVyLXNoZWVuIDIuMnMgbGluZWFyIGluZmluaXRlOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItbGl2ZS1waWxsIHsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIHRvcDogNnB4OwogICAgcmlnaHQ6IDZweDsKICAgIHotaW5kZXg6IDEyOwogICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiA2cHg7CiAgICBtaW4taGVpZ2h0OiAyNHB4OwogICAgcGFkZGluZzogMCA4cHg7CiAgICBib3JkZXItcmFkaXVzOiA5OTlweDsKICAgIGJhY2tncm91bmQ6IHJnYmEoMTAsIDE0LCAyMCwgMC43OCk7CiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDExOCwgMjE0LCAyNTUsIDAuMzQpOwogICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC45Nik7CiAgICBmb250LXNpemU6IDEwcHg7CiAgICBmb250LXdlaWdodDogNzAwOwogICAgbGV0dGVyLXNwYWNpbmc6IDAuMDFlbTsKICAgIGJveC1zaGFkb3c6IDAgMnB4IDhweCByZ2JhKDAsIDAsIDAsIDAuMjQpOwogICAgYmFja2Ryb3AtZmlsdGVyOiBibHVyKDZweCk7CiAgICAtd2Via2l0LWJhY2tkcm9wLWZpbHRlcjogYmx1cig2cHgpOwogICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWxpdmUtcGlsbC1kb3QgewogICAgd2lkdGg6IDdweDsKICAgIGhlaWdodDogN3B4OwogICAgYm9yZGVyLXJhZGl1czogOTk5cHg7CiAgICBiYWNrZ3JvdW5kOiAjNzZkNmZmOwogICAgYm94LXNoYWRvdzogMCAwIDAgNHB4IHJnYmEoMTE4LCAyMTQsIDI1NSwgMC4xNik7CiAgICBmbGV4OiAwIDAgYXV0bzsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFzc2V0LWNhcmRbZGF0YS1tanItbGl2ZS1wbGFjZWhvbGRlcj0idHJ1ZSJdIC5tanItYXNzZXQtc3RhdHVzLWRvdCB7CiAgICBhbmltYXRpb246IG1qci1saXZlLXBsYWNlaG9sZGVyLXB1bHNlIDEuOXMgZWFzZS1pbi1vdXQgaW5maW5pdGU7Cn0KCi8qIEdyaWQgbG9hZGluZyBvdmVybGF5ICovCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1ncmlkLWxvYWRpbmctb3ZlcmxheSB7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICBpbnNldDogMDsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgIzAwMCAzNSUsIHRyYW5zcGFyZW50KTsKICAgIGNvbG9yOiB2YXIoLS1jb250ZW50LWZnLCAjZmZmKTsKICAgIGZvbnQtc2l6ZTogMTNweDsKICAgIGxldHRlci1zcGFjaW5nOiAwLjNweDsKICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLW1qci1yLWxnKTsKICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgYmFja2Ryb3AtZmlsdGVyOiBibHVyKDJweCk7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1ncmlkLXNrZWxldG9uLWxheW91dCB7CiAgICBkaXNwbGF5OiBncmlkOwogICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiByZXBlYXQoYXV0by1maWxsLCBtaW5tYXgoMTMycHgsIDFmcikpOwogICAgZ2FwOiAxMnB4Owp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItZ3JpZC1za2VsZXRvbi1jYXJkIHsKICAgIGJvcmRlci1yYWRpdXM6IDEycHg7CiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMjIpOwogICAgYmFja2dyb3VuZDogcmdiYSgxOTIsIDE5OCwgMjA2LCAwLjIpOwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIC8qIG1pbi1oZWlnaHQgcmVtb3ZlZDogVnVlIHNrZWxldG9uQ2FyZFN0eWxlIHNldHMgYW4gZXhwbGljaXQgaGVpZ2h0IGRlcml2ZWQKICAgICAgIGZyb20gZXN0aW1hdGVSb3dIZWlnaHQuIEEgY29uZmxpY3RpbmcgbWluLWhlaWdodCBjYXVzZWQgc2tlbGV0b24gY2FyZHMgdG8KICAgICAgIGJlIHRhbGxlciB0aGFuIHRoZSBhY3R1YWwgY2FyZHMgdGhleSByZXBsYWNlLCBjYXVzaW5nIGEgbGF5b3V0IGp1bXAgd2hlbgogICAgICAgYXNzZXRzIGZpcnN0IGxvYWQuICovCiAgICBib3gtc2hhZG93OiAwIDZweCAxOHB4IHJnYmEoMCwgMCwgMCwgMC4yNCk7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1ncmlkLXNrZWxldG9uLXRodW1iIHsKICAgIGFzcGVjdC1yYXRpbzogMSAvIDE7CiAgICB3aWR0aDogMTAwJTsKICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgKICAgICAgICA5MGRlZywKICAgICAgICByZ2JhKDE1NiwgMTYyLCAxNzEsIDAuNTIpIDAlLAogICAgICAgIHJnYmEoMjIwLCAyMjUsIDIzMiwgMC43MikgNDUlLAogICAgICAgIHJnYmEoMTU2LCAxNjIsIDE3MSwgMC41MikgMTAwJQogICAgKTsKICAgIGJhY2tncm91bmQtc2l6ZTogMjQwJSAxMDAlOwogICAgYW5pbWF0aW9uOiBtanItZ3JpZC1za2VsZXRvbi1zaGltbWVyIDEuMnMgbGluZWFyIGluZmluaXRlOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItZ3JpZC1za2VsZXRvbi1saW5lIHsKICAgIGhlaWdodDogMTBweDsKICAgIG1hcmdpbjogOHB4IDEwcHg7CiAgICBib3JkZXItcmFkaXVzOiA4cHg7CiAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoCiAgICAgICAgOTBkZWcsCiAgICAgICAgcmdiYSgxNjQsIDE3MCwgMTc5LCAwLjQ4KSAwJSwKICAgICAgICByZ2JhKDIxNCwgMjE5LCAyMjYsIDAuNykgNDUlLAogICAgICAgIHJnYmEoMTY0LCAxNzAsIDE3OSwgMC40OCkgMTAwJQogICAgKTsKICAgIGJhY2tncm91bmQtc2l6ZTogMjQwJSAxMDAlOwogICAgYW5pbWF0aW9uOiBtanItZ3JpZC1za2VsZXRvbi1zaGltbWVyIDEuMnMgbGluZWFyIGluZmluaXRlOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItZ3JpZC1za2VsZXRvbi1saW5lLS10aXRsZSB7CiAgICB3aWR0aDogNzIlOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItZ3JpZC1za2VsZXRvbi1saW5lLS1tZXRhIHsKICAgIHdpZHRoOiA0OCU7CiAgICBtYXJnaW4tdG9wOiAycHg7CiAgICBtYXJnaW4tYm90dG9tOiAxMHB4Owp9CgpAa2V5ZnJhbWVzIG1qci1za2VsZXRvbi1zaGltbWVyIHsKICAgIDAlIHsKICAgICAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAxMjAlIDA7CiAgICB9CiAgICAxMDAlIHsKICAgICAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTIwJSAwOwogICAgfQp9CgpAa2V5ZnJhbWVzIG1qci1ncmlkLXNrZWxldG9uLXNoaW1tZXIgewogICAgMCUgewogICAgICAgIGJhY2tncm91bmQtcG9zaXRpb246IDEwMCUgMDsKICAgIH0KICAgIDEwMCUgewogICAgICAgIGJhY2tncm91bmQtcG9zaXRpb246IC0xMDAlIDA7CiAgICB9Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1ncmlkLXNrZWxldG9uLXNoaW1tZXIgewogICAgd2lsbC1jaGFuZ2U6IGJhY2tncm91bmQtcG9zaXRpb247Cn0KCi8qIEdlbmVyaWMgaGVhZGluZ3MgaW5zaWRlIHBhbmVsICovCi5tanItYXNzZXRzLW1hbmFnZXIgaDMsCi5tanItYXNzZXRzLW1hbmFnZXIgaDQgewogICAgZm9udC1mYW1pbHk6IGluaGVyaXQ7CiAgICBsZXR0ZXItc3BhY2luZzogMC4wMWVtOwp9CgovKiBQYW5lbHMgKi8KLm1qci1hc3NldHMtbWFuYWdlciAubWpyLXBhbmVsIHsKICAgIGJhY2tncm91bmQ6IHZhcigtLW1qci1zdXJmYWNlLTEpOwogICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tbWpyLWJvcmRlcik7CiAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1tanItci1sZyk7CiAgICBib3gtc2hhZG93OiB2YXIoLS1pbnRlcmZhY2UtcGFuZWwtYm94LXNoYWRvdywgMCA4cHggMjRweCByZ2JhKDAsIDAsIDAsIDAuMjUpKTsKfQoKLyogVG9vbGJhciAqLwoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItdG9vbGJhciB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogMTBweDsKICAgIHBhZGRpbmc6IHZhcigtLW1qci1wYWQtbWQpOwp9CgovKiBCdXR0b25zICovCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1idG4gewogICAgYXBwZWFyYW5jZTogbm9uZTsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLW1qci1ib3JkZXIpOwogICAgYmFja2dyb3VuZDogdmFyKC0tbWpyLXN1cmZhY2UtMik7CiAgICBjb2xvcjogdmFyKC0tY29udGVudC1mZywgI2RkZCk7CiAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1tanItci1tZCk7CiAgICBwYWRkaW5nOiA3cHggMTBweDsKICAgIGZvbnQtc2l6ZTogMTJweDsKICAgIGxpbmUtaGVpZ2h0OiAxOwogICAgY3Vyc29yOiBwb2ludGVyOwogICAgdXNlci1zZWxlY3Q6IG5vbmU7CiAgICB0cmFuc2l0aW9uOgogICAgICAgIGJhY2tncm91bmQgMTIwbXMgZWFzZSwKICAgICAgICBib3JkZXItY29sb3IgMTIwbXMgZWFzZSwKICAgICAgICB0cmFuc2Zvcm0gODBtcyBlYXNlOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYnRuOmhvdmVyIHsKICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQpIDU1JSwgdmFyKC0tbWpyLWJvcmRlcikpOwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTIpIDcwJSwgdmFyKC0tbWpyLWFjY2VudCkgMTAlKTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWJ0bjphY3RpdmUgewogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDFweCk7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1idG46ZGlzYWJsZWQgewogICAgb3BhY2l0eTogMC41NTsKICAgIGN1cnNvcjogbm90LWFsbG93ZWQ7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1idG4ubWpyLXByaW1hcnkgewogICAgYm9yZGVyLWNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWFjY2VudCkgNjAlLCB2YXIoLS1tanItYm9yZGVyKSk7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWFjY2VudCkgMTQlLCB2YXIoLS1tanItc3VyZmFjZS0yKSk7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1idG4gewogICAgLyogT3ZlcnJpZGUgaW5saW5lIHN0eWxlcyBpZiBwcmVzZW50ICovCiAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1tanItYm9yZGVyKTsKICAgIGJhY2tncm91bmQ6IHZhcigtLW1qci1zdXJmYWNlLTIpOwogICAgY29sb3I6IHZhcigtLWNvbnRlbnQtZmcsICNkZGQpOwogICAgYm9yZGVyLXJhZGl1czogdmFyKC0tbWpyLXItbWQpOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYnRuOmhvdmVyIHsKICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQpIDU1JSwgdmFyKC0tbWpyLWJvcmRlcikpOwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTIpIDcwJSwgdmFyKC0tbWpyLWFjY2VudCkgMTAlKTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWJ0bi5tanItc3RhdHVzLXNjYW4gewogICAgbWFyZ2luLWxlZnQ6IGF1dG87CiAgICBwYWRkaW5nOiA0cHggMTBweDsKICAgIGNvbG9yOiB2YXIoLS1tanItc3RhdHVzLWNvbG9yLCB2YXIoLS1jb250ZW50LWZnLCAjZGRkKSk7CiAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3RhdHVzLWNvbG9yKSA2MCUsIHZhcigtLW1qci1ib3JkZXIpKTsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3RhdHVzLWNvbG9yKSAxNCUsIHZhcigtLW1qci1zdXJmYWNlLTIpKTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWJ0bi5tanItc3RhdHVzLXNjYW46aG92ZXIgewogICAgYm9yZGVyLWNvbG9yOiB2YXIoLS1tanItc3RhdHVzLWNvbG9yKTsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3RhdHVzLWNvbG9yKSAyNCUsIHZhcigtLW1qci1zdXJmYWNlLTIpKTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWJ0bi5tanItc3RhdHVzLXNjYW46Zm9jdXMtdmlzaWJsZSB7CiAgICBvdXRsaW5lOiAycHggc29saWQgdmFyKC0tbWpyLXN0YXR1cy1jb2xvcik7CiAgICBvdXRsaW5lLW9mZnNldDogMnB4Owp9CgovKiBJbnB1dHMgLyBzZWxlY3RzICh1c2VkIGluc2lkZSBwb3J0YWxlZCBwb3BvdmVycyB0b28pICovCi5tanItaW5wdXQsCi5tanItc2VsZWN0LAoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItaW5wdXQsCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1zZWxlY3QgewogICAgYXBwZWFyYW5jZTogbm9uZTsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLW1qci1ib3JkZXIpOwogICAgYmFja2dyb3VuZDogdmFyKC0tY29tZnktaW5wdXQtYmcsIHJnYmEoMCwgMCwgMCwgMC4yNSkpOwogICAgY29sb3I6IHZhcigtLWlucHV0LXRleHQsICNkZGQpOwogICAgYm9yZGVyLXJhZGl1czogdmFyKC0tbWpyLXItbWQpOwogICAgcGFkZGluZzogOHB4IDEwcHg7CiAgICBmb250LXNpemU6IDEzcHg7CiAgICBvdXRsaW5lOiBub25lOwogICAgd2lkdGg6IDEwMCU7CiAgICBtaW4td2lkdGg6IDA7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1pbnB1dDo6cGxhY2Vob2xkZXIgewogICAgY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItbXV0ZWQpIDgwJSwgdHJhbnNwYXJlbnQpOwp9CgoubWpyLWlucHV0OmZvY3VzLAoubWpyLXNlbGVjdDpmb2N1cywKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWlucHV0OmZvY3VzLAoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItc2VsZWN0OmZvY3VzIHsKICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQpIDY1JSwgdmFyKC0tbWpyLWJvcmRlcikpOwogICAgYm94LXNoYWRvdzogMCAwIDAgMnB4IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYWNjZW50KSAyMCUsIHRyYW5zcGFyZW50KTsKfQoKLm1qci1pbnB1dCwKLm1qci1zZWxlY3QsCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1pbnB1dCwKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLXNlbGVjdCB7CiAgICAvKiBPdmVycmlkZSBpbmxpbmUgc3R5bGVzIGlmIHByZXNlbnQgKi8KICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLW1qci1ib3JkZXIpOwogICAgYmFja2dyb3VuZDogdmFyKC0tY29tZnktaW5wdXQtYmcsIHJnYmEoMCwgMCwgMCwgMC4yNSkpOwogICAgY29sb3I6IHZhcigtLWlucHV0LXRleHQsICNkZGQpOwogICAgYm9yZGVyLXJhZGl1czogdmFyKC0tbWpyLXItbWQpOwogICAgcGFkZGluZzogOHB4IDEwcHg7Cn0KCi5tanItZmlsdGVyLXBvcG92ZXIgLm1qci1maWx0ZXItc2VsZWN0IHsKICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsKICAgIGdhcDogOHB4OwogICAgbWluLWhlaWdodDogMzRweDsKICAgIHBhZGRpbmc6IDAgOXB4OwogICAgbGluZS1oZWlnaHQ6IDEuMjsKfQoKLm1qci1maWx0ZXItcG9wb3ZlciAubWpyLWZpbHRlci1zZWxlY3RbZGF0YS1wLWRpc2FibGVkPSJ0cnVlIl0gewogICAgb3BhY2l0eTogMC41NTsKICAgIGN1cnNvcjogZGVmYXVsdDsKfQoKLm1qci1maWx0ZXItcG9wb3ZlciAubWpyLWZpbHRlci1zZWxlY3QgW2RhdGEtcGMtc2VjdGlvbj0ibGFiZWwiXSB7CiAgICBmbGV4OiAxIDEgYXV0bzsKICAgIG1pbi13aWR0aDogMDsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7Cn0KCi5tanItZmlsdGVyLXBvcG92ZXIgLm1qci1maWx0ZXItc2VsZWN0IFtkYXRhLXBjLXNlY3Rpb249ImRyb3Bkb3duIl0gewogICAgZmxleDogMCAwIGF1dG87CiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgIHdpZHRoOiAxOHB4OwogICAgY29sb3I6IHZhcigtLW1qci1tdXRlZCwgdmFyKC0tZGVzY3JpcC10ZXh0LCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNjUpKSk7Cn0KCi5tanItZmlsdGVyLXNlbGVjdC1wYW5lbCB7CiAgICBtaW4td2lkdGg6IHZhcigtLXAtc2VsZWN0LW92ZXJsYXktd2lkdGgsIDEycmVtKTsKICAgIG1heC13aWR0aDogbWluKDMyMHB4LCBjYWxjKDEwMHZ3IC0gMzJweCkpOwogICAgbWF4LWhlaWdodDogbWluKDMyMHB4LCBjYWxjKDEwMHZoIC0gMzJweCkpOwogICAgb3ZlcmZsb3c6IGF1dG87CiAgICBwYWRkaW5nOiA0cHg7CiAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1tanItYm9yZGVyKTsKICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLW1qci1yLW1kKTsKICAgIGJhY2tncm91bmQ6IHZhcigtLW1qci1zdXJmYWNlLTEsIHZhcigtLWNvbWZ5LW1lbnUtYmcsICMyYTJhMmEpKTsKICAgIGNvbG9yOiB2YXIoLS1jb250ZW50LWZnLCB2YXIoLS1pbnB1dC10ZXh0LCAjZGRkKSk7CiAgICBib3gtc2hhZG93OiAwIDEycHggMjhweCByZ2JhKDAsIDAsIDAsIDAuMzgpOwogICAgei1pbmRleDogY2FsYyh2YXIoLS1tanItcG9wb3Zlci16LWluZGV4LCAyMTQ3NDgzNjQ3KSArIDEpOwp9CgoubWpyLWZpbHRlci1zZWxlY3QtcGFuZWwgW2RhdGEtcGMtc2VjdGlvbj0ibGlzdCJdIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgZ2FwOiAycHg7CiAgICBwYWRkaW5nOiAwOwogICAgbWFyZ2luOiAwOwogICAgbGlzdC1zdHlsZTogbm9uZTsKfQoKLm1qci1maWx0ZXItc2VsZWN0LXBhbmVsIFtkYXRhLXBjLXNlY3Rpb249Im9wdGlvbiJdIHsKICAgIG1pbi1oZWlnaHQ6IDI4cHg7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIHBhZGRpbmc6IDZweCA4cHg7CiAgICBib3JkZXItcmFkaXVzOiBjYWxjKHZhcigtLW1qci1yLW1kKSAtIDJweCk7CiAgICBmb250LXNpemU6IDEycHg7CiAgICBsaW5lLWhlaWdodDogMS4yNTsKICAgIGN1cnNvcjogcG9pbnRlcjsKICAgIGNvbG9yOiB2YXIoLS1jb250ZW50LWZnLCB2YXIoLS1pbnB1dC10ZXh0LCAjZGRkKSk7Cn0KCi5tanItZmlsdGVyLXNlbGVjdC1wYW5lbCBbZGF0YS1wYy1zZWN0aW9uPSJvcHRpb24iXTpob3ZlciwKLm1qci1maWx0ZXItc2VsZWN0LXBhbmVsIFtkYXRhLXAtaGlnaGxpZ2h0PSJ0cnVlIl0gewogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQpIDE4JSwgdHJhbnNwYXJlbnQpOwogICAgY29sb3I6IHZhcigtLWNvbnRlbnQtZmcsICNmZmYpOwp9CgovKiBUYWJzOiBvdmVycmlkZGVuIGFib3ZlIHdpdGggcXVldWUtbGlrZSBzdHlsZSAqLwoKLyogUmVtb3ZlZCByZWR1bmRhbnQgdGFiIGRlY2xhcmF0aW9ucyB0aGF0IHdlcmUgdXNpbmcgIWltcG9ydGFudCAqLwoKLyogTXV0ZWQgdGV4dCBoZWxwZXIgKi8KLm1qci1hc3NldHMtbWFuYWdlciAubWpyLW11dGVkIHsKICAgIGNvbG9yOiB2YXIoLS1tanItbXV0ZWQpOwp9CgovKiBHcmlkICsgY2FyZHMgKG92ZXJyaWRlIGlubGluZSBzdHlsZXMgZnJvbSBDYXJkLmpzKSAqLwoubWpyLWFzc2V0cy1tYW5hZ2VyICNtanItYXNzZXRzLWdyaWQgewogICAgZ2FwOiAxMHB4ICFpbXBvcnRhbnQ7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hc3NldC1jYXJkLAoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItY2FyZCB7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1tanItc3VyZmFjZS0xKSAhaW1wb3J0YW50OwogICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tbWpyLWJvcmRlcikgIWltcG9ydGFudDsKICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLW1qci1yLWxnKSAhaW1wb3J0YW50OwogICAgb3ZlcmZsb3c6IGhpZGRlbiAhaW1wb3J0YW50OwogICAgbWluLXdpZHRoOiAwOwogICAgdHJhbnNpdGlvbjoKICAgICAgICB0cmFuc2Zvcm0gMTIwbXMgZWFzZSwKICAgICAgICBib3JkZXItY29sb3IgMTIwbXMgZWFzZSwKICAgICAgICBib3gtc2hhZG93IDEyMG1zIGVhc2UgIWltcG9ydGFudDsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFzc2V0LWNhcmQ6aG92ZXIsCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1jYXJkOmhvdmVyIHsKICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtMXB4KSAhaW1wb3J0YW50OwogICAgYm9yZGVyLWNvbG9yOiBjb2xvci1taXgoCiAgICAgICAgaW4gc3JnYiwKICAgICAgICB2YXIoLS1tanItY2FyZC1zZWxlY3Rpb24tY29sb3IpIDU1JSwKICAgICAgICB2YXIoLS1tanItYm9yZGVyKQogICAgKSAhaW1wb3J0YW50OwogICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tbWpyLWNhcmQtaG92ZXItY29sb3IpICFpbXBvcnRhbnQ7CiAgICBib3gtc2hhZG93OiAwIDhweCAyMnB4IHJnYmEoMCwgMCwgMCwgMC4yNSkgIWltcG9ydGFudDsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFzc2V0LWNhcmQgaW1nLAoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYXNzZXQtY2FyZCB2aWRlbywKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLXRodW1iLW1lZGlhIHsKICAgIGRpc3BsYXk6IGJsb2NrOwogICAgd2lkdGg6IDEwMCUgIWltcG9ydGFudDsKICAgIGhlaWdodDogMTAwJSAhaW1wb3J0YW50OwogICAgb2JqZWN0LWZpdDogY292ZXIgIWltcG9ydGFudDsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLXRodW1iIHsKICAgIGZsZXg6IDAgMCBhdXRvOwogICAgd2lkdGg6IDEwMCU7CiAgICBhc3BlY3QtcmF0aW86IDEgLyAxOwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTApIDgwJSwgdHJhbnNwYXJlbnQpOwogICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWF1ZGlvLXRodW1iLAoubWpyLWJvdHRvbS1mZWVkIC5tanItYXVkaW8tdGh1bWIgewogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgaW5zZXQ6IDA7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsKICAgIGdhcDogMTBweDsKICAgIHBhZGRpbmc6IDE0cHggMTJweCAxMnB4OwogICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC45NCk7CiAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgIGJhY2tncm91bmQ6CiAgICAgICAgcmFkaWFsLWdyYWRpZW50KGNpcmNsZSBhdCAxOCUgMjAlLCByZ2JhKDc4LCAxODQsIDI1NSwgMC4zMiksIHRyYW5zcGFyZW50IDM4JSksCiAgICAgICAgcmFkaWFsLWdyYWRpZW50KGNpcmNsZSBhdCA4OCUgNzIlLCByZ2JhKDgyLCAyMjAsIDE1NiwgMC4yNCksIHRyYW5zcGFyZW50IDQyJSksCiAgICAgICAgbGluZWFyLWdyYWRpZW50KDEzNWRlZywgcmdiYSgxOCwgMjYsIDM2LCAwLjk4KSwgcmdiYSg4LCAxMiwgMTgsIDAuOTgpKTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWF1ZGlvLXRodW1iLmhhcy1wb3N0ZXIsCi5tanItYm90dG9tLWZlZWQgLm1qci1hdWRpby10aHVtYi5oYXMtcG9zdGVyIHsKICAgIGJhY2tncm91bmQ6CiAgICAgICAgbGluZWFyLWdyYWRpZW50KDE4MGRlZywgcmdiYSg0LCA2LCAxMCwgMC4yOCksIHJnYmEoNCwgNiwgMTAsIDAuODYpKSwKICAgICAgICByYWRpYWwtZ3JhZGllbnQoY2lyY2xlIGF0IDUwJSA0MiUsIHJnYmEoNzgsIDE4NCwgMjU1LCAwLjIpLCB0cmFuc3BhcmVudCA1NCUpOwogICAgYmFja2Ryb3AtZmlsdGVyOiBzYXR1cmF0ZSgxLjEpOwogICAgLXdlYmtpdC1iYWNrZHJvcC1maWx0ZXI6IHNhdHVyYXRlKDEuMSk7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hdWRpby10aHVtYi1oZWFkLAoubWpyLWJvdHRvbS1mZWVkIC5tanItYXVkaW8tdGh1bWItaGVhZCB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsKICAgIGdhcDogOHB4OwogICAgbWluLXdpZHRoOiAwOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYXVkaW8tdGh1bWItaWNvbiwKLm1qci1ib3R0b20tZmVlZCAubWpyLWF1ZGlvLXRodW1iLWljb24gewogICAgd2lkdGg6IDI4cHg7CiAgICBoZWlnaHQ6IDI4cHg7CiAgICBib3JkZXItcmFkaXVzOiA5OTlweDsKICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEyKTsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xOCk7CiAgICBib3gtc2hhZG93OiAwIDhweCAxOHB4IHJnYmEoMCwgMCwgMCwgMC4yMik7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hdWRpby10aHVtYi1raW5kLAoubWpyLWJvdHRvbS1mZWVkIC5tanItYXVkaW8tdGh1bWIta2luZCB7CiAgICBtYXgtd2lkdGg6IDYycHg7CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7CiAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgcGFkZGluZzogM3B4IDdweDsKICAgIGJvcmRlci1yYWRpdXM6IDk5OXB4OwogICAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjI4KTsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xMyk7CiAgICBmb250LXNpemU6IDEwcHg7CiAgICBmb250LXdlaWdodDogODAwOwogICAgbGV0dGVyLXNwYWNpbmc6IDA7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hdWRpby10aHVtYi13YXZlZm9ybSwKLm1qci1ib3R0b20tZmVlZCAubWpyLWF1ZGlvLXRodW1iLXdhdmVmb3JtIHsKICAgIGZsZXg6IDE7CiAgICBtaW4taGVpZ2h0OiA0MnB4OwogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgIGdhcDogY2xhbXAoMnB4LCAyLjIlLCA1cHgpOwogICAgcGFkZGluZzogNHB4IDA7CiAgICBmaWx0ZXI6IGRyb3Atc2hhZG93KDAgNHB4IDE0cHggcmdiYSgwLCAwLCAwLCAwLjM0KSk7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hdWRpby10aHVtYi13YXZlZm9ybSBzcGFuLAoubWpyLWJvdHRvbS1mZWVkIC5tanItYXVkaW8tdGh1bWItd2F2ZWZvcm0gc3BhbiB7CiAgICB3aWR0aDogM3B4OwogICAgbWluLXdpZHRoOiAycHg7CiAgICBtYXgtd2lkdGg6IDVweDsKICAgIGJvcmRlci1yYWRpdXM6IDk5OXB4OwogICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KDE4MGRlZywgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjk4KSwgcmdiYSgxNjAsIDIyNCwgMjU1LCAwLjcyKSk7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hdWRpby10aHVtYi1tZXRhLAoubWpyLWJvdHRvbS1mZWVkIC5tanItYXVkaW8tdGh1bWItbWV0YSB7CiAgICBtaW4td2lkdGg6IDA7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgIGdhcDogMnB4OwogICAgdGV4dC1zaGFkb3c6IDAgMnB4IDEycHggcmdiYSgwLCAwLCAwLCAwLjYyKTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWF1ZGlvLXRodW1iLXRpdGxlLAoubWpyLWJvdHRvbS1mZWVkIC5tanItYXVkaW8tdGh1bWItdGl0bGUgewogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgIGZvbnQtc2l6ZTogMTJweDsKICAgIGZvbnQtd2VpZ2h0OiA4MDA7CiAgICBsaW5lLWhlaWdodDogMS4yOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYXVkaW8tdGh1bWItc3VidGl0bGUsCi5tanItYm90dG9tLWZlZWQgLm1qci1hdWRpby10aHVtYi1zdWJ0aXRsZSB7CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7CiAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC43KTsKICAgIGZvbnQtc2l6ZTogMTBweDsKICAgIGZvbnQtd2VpZ2h0OiA2NTA7CiAgICBsaW5lLWhlaWdodDogMS4yOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYXNzZXQtY2FyZCAubWpyLXdvcmtmbG93LXRodW1iLAoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItY2FyZCAubWpyLXdvcmtmbG93LXRodW1iIHsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIGluc2V0OiAwOwogICAgZGlzcGxheTogZmxleDsKICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICBnYXA6IDdweDsKICAgIHBhZGRpbmc6IDE0cHggMTJweDsKICAgIGJhY2tncm91bmQ6CiAgICAgICAgbGluZWFyLWdyYWRpZW50KDEzNWRlZywgcmdiYSg0NywgNTgsIDc2LCAwLjk0KSwgcmdiYSgxOCwgMjMsIDMyLCAwLjk4KSksCiAgICAgICAgcmFkaWFsLWdyYWRpZW50KGNpcmNsZSBhdCAzMCUgMjUlLCByZ2JhKDc4LCAxODQsIDI1NSwgMC4yMiksIHRyYW5zcGFyZW50IDQyJSk7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjkpOwogICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgdGV4dC1zaGFkb3c6IDAgMXB4IDhweCByZ2JhKDAsIDAsIDAsIDAuNzIpOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYXNzZXQtY2FyZCAubWpyLXRodW1iLm1qci10aHVtYi13b3JrZmxvdywKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWNhcmQgLm1qci10aHVtYi5tanItdGh1bWItd29ya2Zsb3cgewogICAgYXNwZWN0LXJhdGlvOiAxLjA4IC8gMTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFzc2V0LWNhcmQgLm1qci13b3JrZmxvdy1jYXJkLWFjdGlvbnMsCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1jYXJkIC5tanItd29ya2Zsb3ctY2FyZC1hY3Rpb25zIHsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIHRvcDogN3B4OwogICAgcmlnaHQ6IDdweDsKICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgZ2FwOiA0cHg7CiAgICB6LWluZGV4OiAxMjsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFzc2V0LWNhcmQgLm1qci13b3JrZmxvdy1hY3Rpb24tYnRuLAoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItY2FyZCAubWpyLXdvcmtmbG93LWFjdGlvbi1idG4gewogICAgLXdlYmtpdC1hcHBlYXJhbmNlOiBub25lOwogICAgYXBwZWFyYW5jZTogbm9uZTsKICAgIHdpZHRoOiAyNHB4OwogICAgaGVpZ2h0OiAyNHB4OwogICAgbWluLXdpZHRoOiAyNHB4OwogICAgbWluLWhlaWdodDogMjRweDsKICAgIHBhZGRpbmc6IDA7CiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMzQpOwogICAgYm9yZGVyLXJhZGl1czogN3B4OwogICAgYmFja2dyb3VuZDogcmdiYSg4LCAxMiwgMTgsIDAuNTgpOwogICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC45Mik7CiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgIGN1cnNvcjogcG9pbnRlcjsKICAgIGxpbmUtaGVpZ2h0OiAxOwogICAgYmFja2Ryb3AtZmlsdGVyOiBibHVyKDNweCk7CiAgICAtd2Via2l0LWJhY2tkcm9wLWZpbHRlcjogYmx1cigzcHgpOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYXNzZXQtY2FyZCAubWpyLXdvcmtmbG93LWFjdGlvbi1idG46aG92ZXIsCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1jYXJkIC5tanItd29ya2Zsb3ctYWN0aW9uLWJ0bjpob3ZlciB7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDI5LCA0MCwgNTgsIDAuNzgpOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYXNzZXQtY2FyZCAubWpyLXdvcmtmbG93LWFjdGlvbi1idG4uaXMtYWN0aXZlLAoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItY2FyZCAubWpyLXdvcmtmbG93LWFjdGlvbi1idG4uaXMtYWN0aXZlIHsKICAgIGNvbG9yOiAjZmZkNDVhOwogICAgYm9yZGVyLWNvbG9yOiByZ2JhKDI1NSwgMjEyLCA5MCwgMC43KTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFzc2V0LWNhcmQgLm1qci13b3JrZmxvdy10aHVtYiAucGksCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1jYXJkIC5tanItd29ya2Zsb3ctdGh1bWIgLnBpIHsKICAgIGZvbnQtc2l6ZTogMS43NXJlbTsKICAgIG9wYWNpdHk6IDAuNzI7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hc3NldC1jYXJkIC5tanItd29ya2Zsb3ctdGh1bWIuaGFzLXRodW1ibmFpbCwKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWNhcmQgLm1qci13b3JrZmxvdy10aHVtYi5oYXMtdGh1bWJuYWlsIHsKICAgIGp1c3RpZnktY29udGVudDogZmxleC1lbmQ7CiAgICBiYWNrZ3JvdW5kOgogICAgICAgIGxpbmVhci1ncmFkaWVudCgxODBkZWcsIHRyYW5zcGFyZW50IDI0JSwgcmdiYSgwLCAwLCAwLCAwLjI4KSA1OCUsIHJnYmEoMCwgMCwgMCwgMC43OCkpLAogICAgICAgIGxpbmVhci1ncmFkaWVudCg5MGRlZywgcmdiYSgwLCAwLCAwLCAwLjM0KSwgdHJhbnNwYXJlbnQgMzQlLCB0cmFuc3BhcmVudCA2NiUsIHJnYmEoMCwgMCwgMCwgMC4zNCkpOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYXNzZXQtY2FyZCAubWpyLXRodW1iLW1lZGlhLm1qci13b3JrZmxvdy1ncmFwaC1tYXAtcHJldmlldywKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWNhcmQgLm1qci10aHVtYi1tZWRpYS5tanItd29ya2Zsb3ctZ3JhcGgtbWFwLXByZXZpZXcgewogICAgb2JqZWN0LWZpdDogY292ZXIgIWltcG9ydGFudDsKICAgIG9wYWNpdHk6IDAuNDY7CiAgICBmaWx0ZXI6IHNhdHVyYXRlKDAuNzUpIGNvbnRyYXN0KDAuODIpIGJyaWdodG5lc3MoMC43KTsKICAgIHRyYW5zZm9ybTogc2NhbGUoMS4wNik7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hc3NldC1jYXJkIC5tanItd29ya2Zsb3ctdGh1bWIuaGFzLWdyYXBoLW1hcCwKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWNhcmQgLm1qci13b3JrZmxvdy10aHVtYi5oYXMtZ3JhcGgtbWFwIHsKICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgYmFja2dyb3VuZDoKICAgICAgICBsaW5lYXItZ3JhZGllbnQoMTgwZGVnLCByZ2JhKDgsIDEwLCAxNCwgMC4zKSwgcmdiYSg4LCAxMCwgMTQsIDAuODIpKSwKICAgICAgICByYWRpYWwtZ3JhZGllbnQoY2lyY2xlIGF0IDUwJSA0MiUsIHJnYmEoMCwgMCwgMCwgMC4xOCksIHJnYmEoMCwgMCwgMCwgMC42OCkgNzIlKTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFzc2V0LWNhcmQgLm1qci13b3JrZmxvdy10aHVtYi5oYXMtZ3JhcGgtbWFwIC5tanItd29ya2Zsb3ctdGh1bWItdGl0bGUsCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1jYXJkIC5tanItd29ya2Zsb3ctdGh1bWIuaGFzLWdyYXBoLW1hcCAubWpyLXdvcmtmbG93LXRodW1iLXRpdGxlIHsKICAgIHBhZGRpbmc6IDJweCA3cHg7CiAgICBib3JkZXItcmFkaXVzOiA1cHg7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIDAuMzYpOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYXNzZXQtY2FyZCAubWpyLXdvcmtmbG93LXRodW1iLmhhcy10aHVtYm5haWwgLnBpLAoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItY2FyZCAubWpyLXdvcmtmbG93LXRodW1iLmhhcy10aHVtYm5haWwgLnBpIHsKICAgIGRpc3BsYXk6IG5vbmU7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hc3NldC1jYXJkIC5tanItd29ya2Zsb3ctdGh1bWIuaGFzLWdyYXBoLW1hcCAucGksCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1jYXJkIC5tanItd29ya2Zsb3ctdGh1bWIuaGFzLWdyYXBoLW1hcCAucGkgewogICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICBtYXJnaW4tYm90dG9tOiAycHg7CiAgICBmb250LXNpemU6IDEuMTVyZW07CiAgICBvcGFjaXR5OiAwLjU1Owp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYXNzZXQtY2FyZCAubWpyLXdvcmtmbG93LXRodW1iLXRpdGxlLAoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItY2FyZCAubWpyLXdvcmtmbG93LXRodW1iLXRpdGxlIHsKICAgIG1heC13aWR0aDogMTAwJTsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICBmb250LXNpemU6IDAuODRyZW07CiAgICBmb250LXdlaWdodDogODAwOwogICAgbGluZS1oZWlnaHQ6IDEuMTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFzc2V0LWNhcmQgLm1qci13b3JrZmxvdy10aHVtYi1tZXRhLAoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItY2FyZCAubWpyLXdvcmtmbG93LXRodW1iLW1ldGEgewogICAgZGlzcGxheTogZmxleDsKICAgIG1heC13aWR0aDogMTAwJTsKICAgIGZsZXgtd3JhcDogd3JhcDsKICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgZ2FwOiA0cHg7CiAgICBmb250LXNpemU6IDAuNjhyZW07Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hc3NldC1jYXJkIC5tanItd29ya2Zsb3ctdGh1bWItbWV0YSBzcGFuLAoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItY2FyZCAubWpyLXdvcmtmbG93LXRodW1iLW1ldGEgc3BhbiwKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFzc2V0LWNhcmQgLm1qci1tZXRhLXdvcmtmbG93LXRhc2ssCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1jYXJkIC5tanItbWV0YS13b3JrZmxvdy10YXNrLAoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYXNzZXQtY2FyZCAubWpyLW1ldGEtd29ya2Zsb3ctc3ViZ3JhcGhzLAoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItY2FyZCAubWpyLW1ldGEtd29ya2Zsb3ctc3ViZ3JhcGhzIHsKICAgIGJvcmRlci1yYWRpdXM6IDRweDsKICAgIGJhY2tncm91bmQ6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xMik7CiAgICBwYWRkaW5nOiAycHggNXB4OwogICAgbWF4LXdpZHRoOiAxMDAlOwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFzc2V0LWNhcmQgLm1qci13b3JrZmxvdy10aHVtYi1tZXRhIHNwYW46bnRoLWNoaWxkKG4gKyA0KSwKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWNhcmQgLm1qci13b3JrZmxvdy10aHVtYi1tZXRhIHNwYW46bnRoLWNoaWxkKG4gKyA0KSB7CiAgICBkaXNwbGF5OiBub25lOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYXNzZXQtY2FyZCAubWpyLWNhcmQtbWV0YVtkYXRhLW1qci1raW5kPSJ3b3JrZmxvdyJdLAoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItY2FyZCAubWpyLWNhcmQtbWV0YVtkYXRhLW1qci1raW5kPSJ3b3JrZmxvdyJdIHsKICAgIHBhZGRpbmc6IDdweCA5cHggIWltcG9ydGFudDsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFzc2V0LWNhcmQgLm1qci1jYXJkLW1ldGFbZGF0YS1tanIta2luZD0id29ya2Zsb3ciXSAubWpyLWNhcmQtZmlsZW5hbWUsCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1jYXJkIC5tanItY2FyZC1tZXRhW2RhdGEtbWpyLWtpbmQ9IndvcmtmbG93Il0gLm1qci1jYXJkLWZpbGVuYW1lIHsKICAgIG1hcmdpbi1ib3R0b206IDNweCAhaW1wb3J0YW50OwogICAgZm9udC1zaXplOiAwLjc4cmVtICFpbXBvcnRhbnQ7CiAgICBsaW5lLWhlaWdodDogMS4xNSAhaW1wb3J0YW50Owp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYXNzZXQtY2FyZCAubWpyLWNhcmQtbWV0YVtkYXRhLW1qci1raW5kPSJ3b3JrZmxvdyJdIC5tanItY2FyZC1tZXRhLXJvdywKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWNhcmQgLm1qci1jYXJkLW1ldGFbZGF0YS1tanIta2luZD0id29ya2Zsb3ciXSAubWpyLWNhcmQtbWV0YS1yb3cgewogICAgZm9udC1zaXplOiAwLjcycmVtICFpbXBvcnRhbnQ7CiAgICBvcGFjaXR5OiAwLjc0ICFpbXBvcnRhbnQ7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hc3NldC1jYXJkIC5tanItY2FyZC1tZXRhW2RhdGEtbWpyLWtpbmQ9IndvcmtmbG93Il0gLm1qci1jYXJkLW1ldGEtcm93IC5tanItbWV0YS13b3JrZmxvdy10YXNrLAoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItY2FyZCAubWpyLWNhcmQtbWV0YVtkYXRhLW1qci1raW5kPSJ3b3JrZmxvdyJdIC5tanItY2FyZC1tZXRhLXJvdyAubWpyLW1ldGEtd29ya2Zsb3ctdGFzayB7CiAgICBkaXNwbGF5OiBub25lOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYXNzZXQtY2FyZCAubWpyLXdvcmtmbG93LW1pc3NpbmctY2hpcCwKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWNhcmQgLm1qci13b3JrZmxvdy1taXNzaW5nLWNoaXAsCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hc3NldC1jYXJkIC5tanItbWV0YS13b3JrZmxvdy1taXNzaW5nLAoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItY2FyZCAubWpyLW1ldGEtd29ya2Zsb3ctbWlzc2luZyB7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMTkwLCA2NiwgMC4yOCk7CiAgICBjb2xvcjogcmdiYSgyNTUsIDIzNiwgMTgwLCAwLjk4KTsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjU1LCAyMDYsIDEwMSwgMC40NSk7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1ncmlkIC5tanItZ3JpZC1ncm91cC1zZXBhcmF0b3IgewogICAgLXdlYmtpdC1hcHBlYXJhbmNlOiBub25lOwogICAgYXBwZWFyYW5jZTogbm9uZTsKICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogOHB4OwogICAgd2lkdGg6IDEwMCU7CiAgICBtaW4taGVpZ2h0OiAzMHB4OwogICAgbWFyZ2luOiAwIDAgOHB4OwogICAgcGFkZGluZzogNXB4IDlweDsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEodmFyKC0tbWpyLXdvcmtmbG93LWdyb3VwLWFjY2VudC1yZ2IsIDk1LCAxNzksIDI1NSksIDAuNDIpOwogICAgYm9yZGVyLXJhZGl1czogN3B4OwogICAgYmFja2dyb3VuZDoKICAgICAgICBsaW5lYXItZ3JhZGllbnQoCiAgICAgICAgICAgIDEzNWRlZywKICAgICAgICAgICAgcmdiYSh2YXIoLS1tanItd29ya2Zsb3ctZ3JvdXAtYWNjZW50LXJnYiwgOTUsIDE3OSwgMjU1KSwgMC4yMiksCiAgICAgICAgICAgIHJnYmEodmFyKC0tbWpyLXdvcmtmbG93LWdyb3VwLWFjY2VudC1yZ2IsIDk1LCAxNzksIDI1NSksIDAuMDgpCiAgICAgICAgKSwKICAgICAgICBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMikgNzglLCB0cmFuc3BhcmVudCk7CiAgICBjb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLWNvbnRlbnQtZmcsICNmZmYpIDkyJSwgdHJhbnNwYXJlbnQpOwogICAgY3Vyc29yOiBwb2ludGVyOwogICAgZm9udDogaW5oZXJpdDsKICAgIGxpbmUtaGVpZ2h0OiAxOwogICAgdGV4dC1hbGlnbjogbGVmdDsKICAgIGJveC1zaGFkb3c6IGluc2V0IDAgMXB4IDAgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA4KTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWdyaWQgLm1qci1ncmlkLWdyb3VwLXNlcGFyYXRvcjpob3ZlciB7CiAgICBib3JkZXItY29sb3I6IHJnYmEodmFyKC0tbWpyLXdvcmtmbG93LWdyb3VwLWFjY2VudC1yZ2IsIDk1LCAxNzksIDI1NSksIDAuNjYpOwogICAgYmFja2dyb3VuZDoKICAgICAgICBsaW5lYXItZ3JhZGllbnQoCiAgICAgICAgICAgIDEzNWRlZywKICAgICAgICAgICAgcmdiYSh2YXIoLS1tanItd29ya2Zsb3ctZ3JvdXAtYWNjZW50LXJnYiwgOTUsIDE3OSwgMjU1KSwgMC4zKSwKICAgICAgICAgICAgcmdiYSh2YXIoLS1tanItd29ya2Zsb3ctZ3JvdXAtYWNjZW50LXJnYiwgOTUsIDE3OSwgMjU1KSwgMC4xMikKICAgICAgICApLAogICAgICAgIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0yKSA4NCUsIHRyYW5zcGFyZW50KTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWdyaWQgLm1qci1ncmlkLWdyb3VwLXNlcGFyYXRvcjpmb2N1cy12aXNpYmxlIHsKICAgIG91dGxpbmU6IDJweCBzb2xpZCByZ2JhKHZhcigtLW1qci13b3JrZmxvdy1ncm91cC1hY2NlbnQtcmdiLCA5NSwgMTc5LCAyNTUpLCAwLjU1KTsKICAgIG91dGxpbmUtb2Zmc2V0OiAycHg7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1ncmlkIC5tanItZ3JpZC1ncm91cC1zZXBhcmF0b3ItLWFjY2VudC0wIHsKICAgIC0tbWpyLXdvcmtmbG93LWdyb3VwLWFjY2VudC1yZ2I6IDk1LCAxNzksIDI1NTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWdyaWQgLm1qci1ncmlkLWdyb3VwLXNlcGFyYXRvci0tYWNjZW50LTEgewogICAgLS1tanItd29ya2Zsb3ctZ3JvdXAtYWNjZW50LXJnYjogNTUsIDIxMSwgMTU2Owp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItZ3JpZCAubWpyLWdyaWQtZ3JvdXAtc2VwYXJhdG9yLS1hY2NlbnQtMiB7CiAgICAtLW1qci13b3JrZmxvdy1ncm91cC1hY2NlbnQtcmdiOiAyNDYsIDE3NywgNzU7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1ncmlkIC5tanItZ3JpZC1ncm91cC1zZXBhcmF0b3ItLWFjY2VudC0zIHsKICAgIC0tbWpyLXdvcmtmbG93LWdyb3VwLWFjY2VudC1yZ2I6IDIzOCwgMTA0LCAxMzY7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1ncmlkIC5tanItZ3JpZC1ncm91cC1zZXBhcmF0b3ItLWFjY2VudC00IHsKICAgIC0tbWpyLXdvcmtmbG93LWdyb3VwLWFjY2VudC1yZ2I6IDE1NywgMTMyLCAyMzg7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1ncmlkIC5tanItZ3JpZC1ncm91cC1zZXBhcmF0b3ItLWFjY2VudC01IHsKICAgIC0tbWpyLXdvcmtmbG93LWdyb3VwLWFjY2VudC1yZ2I6IDcxLCAxOTcsIDIyMjsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWdyaWQgLm1qci1ncmlkLWdyb3VwLXNlcGFyYXRvci0tYWNjZW50LTYgewogICAgLS1tanItd29ya2Zsb3ctZ3JvdXAtYWNjZW50LXJnYjogMTQ5LCAyMDcsIDgxOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItZ3JpZCAubWpyLWdyaWQtZ3JvdXAtc2VwYXJhdG9yLS1hY2NlbnQtNyB7CiAgICAtLW1qci13b3JrZmxvdy1ncm91cC1hY2NlbnQtcmdiOiAyNDIsIDEzMCwgNzg7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1ncmlkIC5tanItZ3JpZC1ncm91cC1zZXBhcmF0b3ItY2hldnJvbiB7CiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgIGZsZXg6IDAgMCBhdXRvOwogICAgd2lkdGg6IDE4cHg7CiAgICBoZWlnaHQ6IDE4cHg7CiAgICBib3JkZXItcmFkaXVzOiA5OTlweDsKICAgIGNvbG9yOiByZ2IodmFyKC0tbWpyLXdvcmtmbG93LWdyb3VwLWFjY2VudC1yZ2IsIDk1LCAxNzksIDI1NSkpOwogICAgYmFja2dyb3VuZDogcmdiYSh2YXIoLS1tanItd29ya2Zsb3ctZ3JvdXAtYWNjZW50LXJnYiwgOTUsIDE3OSwgMjU1KSwgMC4xNCk7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1ncmlkIC5tanItZ3JpZC1ncm91cC1zZXBhcmF0b3ItY2hldnJvbiA+IC5waSB7CiAgICBmb250LXNpemU6IDEwcHg7CiAgICBsaW5lLWhlaWdodDogMTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWdyaWQgLm1qci1ncmlkLWdyb3VwLXNlcGFyYXRvci10aXRsZSB7CiAgICBtaW4td2lkdGg6IDA7CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7CiAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgZm9udC1zaXplOiAxMnB4OwogICAgZm9udC13ZWlnaHQ6IDgwMDsKfQoKLm1qci13b3JrZmxvdy1waWNrZXItYmFja2Ryb3AgewogICAgcG9zaXRpb246IGZpeGVkOwogICAgaW5zZXQ6IDA7CiAgICB6LWluZGV4OiA5OTk5OTk7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgcGFkZGluZzogMjRweDsKICAgIGJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgMC41OCk7CiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94Owp9CgoubWpyLXdvcmtmbG93LXBpY2tlci1kaWFsb2cgewogICAgd2lkdGg6IG1pbig5MjBweCwgOTZ2dyk7CiAgICBtYXgtaGVpZ2h0OiBtaW4oNzYwcHgsIDkydmgpOwogICAgZGlzcGxheTogZmxleDsKICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE0KTsKICAgIGJvcmRlci1yYWRpdXM6IDEwcHg7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMCwgIzExMTQxOCkgOTYlLCAjMDAwKTsKICAgIGNvbG9yOiB2YXIoLS1jb250ZW50LWZnLCAjZjVmNWY1KTsKICAgIGJveC1zaGFkb3c6IDAgMThweCA2MHB4IHJnYmEoMCwgMCwgMCwgMC40OCk7Cn0KCi5tanItd29ya2Zsb3ctaW5mby1kaWFsb2cgewogICAgd2lkdGg6IG1pbig1NjBweCwgOTZ2dyk7Cn0KCi5tanItd29ya2Zsb3ctaW5mby1mb3JtIHsKICAgIGRpc3BsYXk6IGdyaWQ7CiAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IHJlcGVhdCgyLCBtaW5tYXgoMCwgMWZyKSk7CiAgICBnYXA6IDEycHg7CiAgICBwYWRkaW5nOiAxNHB4IDE4cHggNHB4Owp9CgoubWpyLXdvcmtmbG93LWluZm8tZm9ybSBsYWJlbCB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgIGdhcDogNnB4OwogICAgbWluLXdpZHRoOiAwOwp9CgoubWpyLXdvcmtmbG93LWluZm8tZm9ybSBsYWJlbC5pcy13aWRlIHsKICAgIGdyaWQtY29sdW1uOiAxIC8gLTE7Cn0KCi5tanItd29ya2Zsb3ctaW5mby1mb3JtIHNwYW4gewogICAgY29sb3I6IHJnYmEoMjU1LDI1NSwyNTUsMC42NCk7CiAgICBmb250LXNpemU6IDExcHg7CiAgICBmb250LXdlaWdodDogNzUwOwogICAgbGV0dGVyLXNwYWNpbmc6IC4wNGVtOwogICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKfQoKLm1qci13b3JrZmxvdy1pbmZvLWZvcm0gaW5wdXQsCi5tanItd29ya2Zsb3ctaW5mby1mb3JtIHNlbGVjdCwKLm1qci13b3JrZmxvdy1pbmZvLWZvcm0gdGV4dGFyZWEgewogICAgd2lkdGg6IDEwMCU7CiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDI1NSwyNTUsMjU1LDAuMTIpOwogICAgYm9yZGVyLXJhZGl1czogOHB4OwogICAgYmFja2dyb3VuZDogcmdiYSgwLDAsMCwwLjI2KTsKICAgIGNvbG9yOiByZ2JhKDI1NSwyNTUsMjU1LDAuOTIpOwogICAgZm9udDogaW5oZXJpdDsKICAgIGZvbnQtc2l6ZTogMTNweDsKICAgIHBhZGRpbmc6IDlweCAxMHB4OwogICAgb3V0bGluZTogbm9uZTsKfQoKLm1qci13b3JrZmxvdy1pbmZvLWZvcm0gdGV4dGFyZWEgewogICAgcmVzaXplOiB2ZXJ0aWNhbDsKICAgIG1pbi1oZWlnaHQ6IDk2cHg7Cn0KCi5tanItd29ya2Zsb3ctcGlja2VyLWhlYWRlciwKLm1qci13b3JrZmxvdy1waWNrZXItZm9vdGVyIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOwogICAgZ2FwOiAxMnB4OwogICAgcGFkZGluZzogMTJweCAxNHB4OwogICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xKTsKfQoKLm1qci13b3JrZmxvdy1waWNrZXItZm9vdGVyIHsKICAgIGp1c3RpZnktY29udGVudDogZmxleC1lbmQ7CiAgICBib3JkZXItdG9wOiAxcHggc29saWQgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEpOwogICAgYm9yZGVyLWJvdHRvbTogMDsKfQoKLm1qci13b3JrZmxvdy1waWNrZXItdGl0bGUgewogICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiA5cHg7CiAgICBtaW4td2lkdGg6IDA7CiAgICBmb250LXNpemU6IDE1cHg7CiAgICBmb250LXdlaWdodDogODAwOwp9CgoubWpyLXdvcmtmbG93LXBpY2tlci1pY29uLWJ0biwKLm1qci13b3JrZmxvdy1waWNrZXItYnRuIHsKICAgIGFwcGVhcmFuY2U6IG5vbmU7CiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTgpOwogICAgYm9yZGVyLXJhZGl1czogN3B4OwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTIsICMyNTI4MmQpIDg4JSwgdHJhbnNwYXJlbnQpOwogICAgY29sb3I6IHZhcigtLWNvbnRlbnQtZmcsICNmNWY1ZjUpOwogICAgY3Vyc29yOiBwb2ludGVyOwp9CgoubWpyLXdvcmtmbG93LXBpY2tlci1pY29uLWJ0biB7CiAgICB3aWR0aDogMzJweDsKICAgIGhlaWdodDogMzJweDsKfQoKLm1qci13b3JrZmxvdy1waWNrZXItYnRuIHsKICAgIG1pbi1oZWlnaHQ6IDMycHg7CiAgICBwYWRkaW5nOiAwIDEycHg7CiAgICBmb250LXdlaWdodDogNzAwOwp9CgoubWpyLXdvcmtmbG93LXBpY2tlci1idG4uaXMtcHJpbWFyeSB7CiAgICBib3JkZXItY29sb3I6IHJnYmEoNzcsIDE3MSwgMjQ3LCAwLjcpOwogICAgYmFja2dyb3VuZDogcmdiYSg3NywgMTcxLCAyNDcsIDAuMjIpOwp9CgoubWpyLXdvcmtmbG93LXBpY2tlci1idG46ZGlzYWJsZWQgewogICAgY3Vyc29yOiBub3QtYWxsb3dlZDsKICAgIG9wYWNpdHk6IDAuNDU7Cn0KCi5tanItd29ya2Zsb3ctcGlja2VyLXNvdXJjZSB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZ2FwOiA4cHg7CiAgICBwYWRkaW5nOiA4cHggMTRweDsKICAgIGNvbG9yOiB2YXIoLS1tanItbXV0ZWQsICNhZWIzYmQpOwogICAgZm9udC1zaXplOiAxMnB4OwogICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wOCk7Cn0KCi5tanItd29ya2Zsb3ctcGlja2VyLXNvdXJjZSBzdHJvbmcgewogICAgbWluLXdpZHRoOiAwOwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgIGNvbG9yOiB2YXIoLS1jb250ZW50LWZnLCAjZjVmNWY1KTsKfQoKLm1qci13b3JrZmxvdy1waWNrZXItdG9vbGJhciB7CiAgICBkaXNwbGF5OiBncmlkOwogICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiBtaW5tYXgoMTgwcHgsIDFmcikgcmVwZWF0KDMsIG1pbm1heCgxMTBweCwgMTUwcHgpKTsKICAgIGdhcDogOHB4OwogICAgcGFkZGluZzogMTJweCAxNHB4Owp9CgoubWpyLXdvcmtmbG93LXBpY2tlci1kaWFsb2cuaXMtYXNzZXQtbW9kZSAubWpyLXdvcmtmbG93LXBpY2tlci10b29sYmFyIHsKICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogbWlubWF4KDE4MHB4LCAxZnIpOwp9CgoubWpyLXdvcmtmbG93LXBpY2tlci1zZWFyY2gsCi5tanItd29ya2Zsb3ctcGlja2VyLXRvb2xiYXIgc2VsZWN0IHsKICAgIG1pbi1oZWlnaHQ6IDM0cHg7CiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTQpOwogICAgYm9yZGVyLXJhZGl1czogN3B4OwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTEsICMxNzFhMWYpIDkyJSwgIzAwMCk7CiAgICBjb2xvcjogdmFyKC0tY29udGVudC1mZywgI2Y1ZjVmNSk7Cn0KCi5tanItd29ya2Zsb3ctcGlja2VyLXNlYXJjaCB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogOHB4OwogICAgcGFkZGluZzogMCAxMHB4Owp9CgoubWpyLXdvcmtmbG93LXBpY2tlci1zZWFyY2ggaW5wdXQgewogICAgd2lkdGg6IDEwMCU7CiAgICBtaW4td2lkdGg6IDA7CiAgICBib3JkZXI6IDA7CiAgICBvdXRsaW5lOiAwOwogICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7CiAgICBjb2xvcjogaW5oZXJpdDsKfQoKLm1qci13b3JrZmxvdy1waWNrZXItdG9vbGJhciBzZWxlY3QgewogICAgcGFkZGluZzogMCA4cHg7Cn0KCi5tanItd29ya2Zsb3ctcGlja2VyLWJvZHkgewogICAgZmxleDogMSAxIGF1dG87CiAgICBtaW4taGVpZ2h0OiAyNjBweDsKICAgIG92ZXJmbG93OiBhdXRvOwogICAgZGlzcGxheTogZ3JpZDsKICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogcmVwZWF0KGF1dG8tZmlsbCwgbWlubWF4KDE4MHB4LCAxZnIpKTsKICAgIGFsaWduLWNvbnRlbnQ6IHN0YXJ0OwogICAgZ2FwOiAxMHB4OwogICAgcGFkZGluZzogMCAxNHB4IDE0cHg7Cn0KCi5tanItd29ya2Zsb3ctcGlja2VyLWNhcmQgewogICAgYXBwZWFyYW5jZTogbm9uZTsKICAgIGRpc3BsYXk6IGdyaWQ7CiAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IDY4cHggbWlubWF4KDAsIDFmcik7CiAgICBnYXA6IDEwcHg7CiAgICBtaW4taGVpZ2h0OiA4NHB4OwogICAgcGFkZGluZzogOHB4OwogICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEyKTsKICAgIGJvcmRlci1yYWRpdXM6IDhweDsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0xLCAjMTcxYTFmKSA5MiUsIHRyYW5zcGFyZW50KTsKICAgIGNvbG9yOiBpbmhlcml0OwogICAgdGV4dC1hbGlnbjogbGVmdDsKICAgIGN1cnNvcjogcG9pbnRlcjsKfQoKLm1qci13b3JrZmxvdy1waWNrZXItZGlhbG9nLmlzLWFzc2V0LW1vZGUgLm1qci13b3JrZmxvdy1waWNrZXItY2FyZCB7CiAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IDc2cHggbWlubWF4KDAsIDFmcik7Cn0KCi5tanItd29ya2Zsb3ctcGlja2VyLWNhcmQ6aG92ZXIsCi5tanItd29ya2Zsb3ctcGlja2VyLWNhcmQuaXMtc2VsZWN0ZWQgewogICAgYm9yZGVyLWNvbG9yOiByZ2JhKDc3LCAxNzEsIDI0NywgMC43Mik7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDc3LCAxNzEsIDI0NywgMC4xMik7Cn0KCi5tanItd29ya2Zsb3ctcGlja2VyLXRodW1iIHsKICAgIHdpZHRoOiA2OHB4OwogICAgYXNwZWN0LXJhdGlvOiAxIC8gMTsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgYm9yZGVyLXJhZGl1czogNnB4OwogICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA2KTsKfQoKLm1qci13b3JrZmxvdy1waWNrZXItdGh1bWIgaW1nIHsKICAgIHdpZHRoOiAxMDAlOwogICAgaGVpZ2h0OiAxMDAlOwogICAgb2JqZWN0LWZpdDogY292ZXI7Cn0KCi5tanItd29ya2Zsb3ctcGlja2VyLWNhcmQtaW5mbyB7CiAgICBtaW4td2lkdGg6IDA7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgZ2FwOiA0cHg7Cn0KCi5tanItd29ya2Zsb3ctcGlja2VyLWNhcmQtaW5mbyBzdHJvbmcsCi5tanItd29ya2Zsb3ctcGlja2VyLWNhcmQtaW5mbyBzcGFuLAoubWpyLXdvcmtmbG93LXBpY2tlci1jYXJkLWluZm8gc21hbGwgewogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKfQoKLm1qci13b3JrZmxvdy1waWNrZXItY2FyZC1pbmZvIHN0cm9uZyB7CiAgICBmb250LXNpemU6IDEzcHg7Cn0KCi5tanItd29ya2Zsb3ctcGlja2VyLWNhcmQtaW5mbyBzcGFuLAoubWpyLXdvcmtmbG93LXBpY2tlci1jYXJkLWluZm8gc21hbGwgewogICAgY29sb3I6IHZhcigtLW1qci1tdXRlZCwgI2FlYjNiZCk7CiAgICBmb250LXNpemU6IDExcHg7Cn0KCi5tanItd29ya2Zsb3ctcGlja2VyLWVtcHR5IHsKICAgIGdyaWQtY29sdW1uOiAxIC8gLTE7CiAgICBwYWRkaW5nOiAzMnB4OwogICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgY29sb3I6IHZhcigtLW1qci1tdXRlZCwgI2FlYjNiZCk7Cn0KCi5tanItd29ya2Zsb3ctcGlja2VyLWVtcHR5LmlzLWVycm9yIHsKICAgIGNvbG9yOiAjZmZiNGI0Owp9CgpAbWVkaWEgKG1heC13aWR0aDogNzIwcHgpIHsKICAgIC5tanItd29ya2Zsb3ctcGlja2VyLWJhY2tkcm9wIHsKICAgICAgICBwYWRkaW5nOiAxMHB4OwogICAgfQoKICAgIC5tanItd29ya2Zsb3ctcGlja2VyLXRvb2xiYXIgewogICAgICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogMWZyIDFmcjsKICAgIH0KCiAgICAubWpyLXdvcmtmbG93LXBpY2tlci1zZWFyY2ggewogICAgICAgIGdyaWQtY29sdW1uOiAxIC8gLTE7CiAgICB9Cn0KCi8qIEtlZXAgZ2VuZXJhdGlvbi10aW1lIGJhZGdlIHBpbm5lZCB0byB0aGUgdGh1bWJuYWlsIGNvcm5lciBhY3Jvc3MgZ3JpZC9mZWVkIHZhcmlhbnRzLiAqLwoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItdGh1bWIgPiAubWpyLWdlbnRpbWUtYmFkZ2UsCi5tanItYm90dG9tLWZlZWQgLm1qci10aHVtYiA+IC5tanItZ2VudGltZS1iYWRnZSB7CiAgICBwb3NpdGlvbjogYWJzb2x1dGUgIWltcG9ydGFudDsKICAgIHJpZ2h0OiA2cHggIWltcG9ydGFudDsKICAgIGJvdHRvbTogNnB4ICFpbXBvcnRhbnQ7CiAgICBsZWZ0OiBhdXRvICFpbXBvcnRhbnQ7CiAgICB0b3A6IGF1dG8gIWltcG9ydGFudDsKICAgIHotaW5kZXg6IDEwICFpbXBvcnRhbnQ7CiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBwYWRkaW5nOiAycHggNnB4ICFpbXBvcnRhbnQ7CiAgICBib3JkZXItcmFkaXVzOiA0cHggIWltcG9ydGFudDsKICAgIGJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgMC41NSkgIWltcG9ydGFudDsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xMikgIWltcG9ydGFudDsKICAgIGZvbnQtc2l6ZTogMTBweDsKICAgIGZvbnQtd2VpZ2h0OiA4MDAgIWltcG9ydGFudDsKICAgIGxldHRlci1zcGFjaW5nOiAwLjAxNWVtOwogICAgbGluZS1oZWlnaHQ6IDEuMTsKICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgYm94LXNoYWRvdzogMCAycHggNHB4IHJnYmEoMCwgMCwgMCwgMC4zKTsKICAgIHRleHQtc2hhZG93OgogICAgICAgIDAgMXB4IDJweCByZ2JhKDAsIDAsIDAsIDAuOSksCiAgICAgICAgMCAwIDEwcHggY29sb3ItbWl4KGluIHNyZ2IsIGN1cnJlbnRDb2xvciAzNSUsIHRyYW5zcGFyZW50KTsKICAgIGJhY2tkcm9wLWZpbHRlcjogYmx1cigycHgpOwogICAgLXdlYmtpdC1iYWNrZHJvcC1maWx0ZXI6IGJsdXIoMnB4KTsKfQoKLyogS2VlcCByYXRpbmcvdGFncyBiYWRnZXMgYW5jaG9yZWQuIERvIG5vdCBmb3JjZSBkaXNwbGF5IGhlcmUgc28gZ3JpZCB2aXNpYmlsaXR5IHRvZ2dsZXMgc3RpbGwgY29udHJvbCBzaG93L2hpZGUuICovCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci10aHVtYiA+IC5tanItcmF0aW5nLWJhZGdlLAoubWpyLWJvdHRvbS1mZWVkIC5tanItdGh1bWIgPiAubWpyLXJhdGluZy1iYWRnZSB7CiAgICBwb3NpdGlvbjogYWJzb2x1dGUgIWltcG9ydGFudDsKICAgIHRvcDogNnB4ICFpbXBvcnRhbnQ7CiAgICByaWdodDogNnB4ICFpbXBvcnRhbnQ7CiAgICBsZWZ0OiBhdXRvICFpbXBvcnRhbnQ7CiAgICBib3R0b206IGF1dG8gIWltcG9ydGFudDsKICAgIHotaW5kZXg6IDEwICFpbXBvcnRhbnQ7CiAgICBib3JkZXItcmFkaXVzOiA2cHg7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIDAuNTUpOwogICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEyKTsKICAgIHBhZGRpbmc6IDJweCA2cHg7CiAgICBmb250LXNpemU6IDEzcHg7CiAgICBsZXR0ZXItc3BhY2luZzogMXB4OwogICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgIGJveC1zaGFkb3c6IDAgNnB4IDE4cHggcmdiYSgwLCAwLCAwLCAwLjI1KTsKICAgIHRleHQtc2hhZG93OiAwIDJweCA2cHggcmdiYSgwLCAwLCAwLCAwLjYpOwogICAgYW5pbWF0aW9uOiBtanItZmFkZS1pbiAwLjJzIGVhc2Utb3V0Owp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItdGh1bWIgPiAubWpyLXRhZ3MtYmFkZ2UsCi5tanItYm90dG9tLWZlZWQgLm1qci10aHVtYiA+IC5tanItdGFncy1iYWRnZSB7CiAgICBwb3NpdGlvbjogYWJzb2x1dGUgIWltcG9ydGFudDsKICAgIGxlZnQ6IDZweCAhaW1wb3J0YW50OwogICAgYm90dG9tOiA2cHggIWltcG9ydGFudDsKICAgIHJpZ2h0OiBhdXRvICFpbXBvcnRhbnQ7CiAgICB0b3A6IGF1dG8gIWltcG9ydGFudDsKICAgIHotaW5kZXg6IDEwICFpbXBvcnRhbnQ7CiAgICBwYWRkaW5nOiAzcHggNnB4OwogICAgZm9udC1zaXplOiA5cHg7CiAgICBtYXgtd2lkdGg6IGNhbGMoMTAwJSAtIDU2cHgpOwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgYm9yZGVyLXJhZGl1czogNHB4OwogICAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjgpOwogICAgYm94LXNoYWRvdzogMCAycHggNHB4IHJnYmEoMCwgMCwgMCwgMC4zKTsKICAgIGFuaW1hdGlvbjogbWpyLWZhZGUtaW4gMC4ycyBlYXNlLW91dDsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLXRodW1iLXBsYXkgewogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgaW5zZXQ6IDA7CiAgICBkaXNwbGF5OiBncmlkOwogICAgcGxhY2UtaXRlbXM6IGNlbnRlcjsKICAgIGZvbnQtc2l6ZTogMjhweDsKICAgIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuOSk7CiAgICB0ZXh0LXNoYWRvdzogMCAwIDEwcHggcmdiYSgwLCAwLCAwLCAwLjcpOwogICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICB0cmFuc2l0aW9uOiBvcGFjaXR5IDEyMG1zIGVhc2U7Cn0KCi8qIC0tLSBIb3ZlciBpbmZvIG92ZXJsYXkgKHBvc2l0aXZlIHByb21wdCArIGdlbiB0aW1lKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICBTbGlkZXMgdXAgZnJvbSB0aGUgYm90dG9tIG9mIC5tanItdGh1bWIgb24gY2FyZCBob3Zlci4KICAgcG9pbnRlci1ldmVudHM6IG5vbmUgIC0+IG5ldmVyIGJsb2NrcyB2aWRlbyBtb3VzZWVudGVyIC8gcGxheS1vbi1ob3Zlci4KICAgei1pbmRleDogMiAgICAgICAgICAgLT4gc2l0cyBhYm92ZSB0aGUgdGh1bWJuYWlsIGltYWdlLCBiZWxvdyB0aGUgcGxheSBpY29uLgogICBDb250cm9sbGVkIGJ5IHRoZSAubWpyLXNob3ctaG92ZXItaW5mbyBjbGFzcyBvbiB0aGUgZ3JpZCBjb250YWluZXIsIHdoaWNoCiAgIGlzIHRvZ2dsZWQgdmlhIHRoZSAiU2hvdyBwcm9tcHQgb24gaG92ZXIiIHNldHRpbmcuCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItY2FyZC1ob3Zlci1pbmZvIHsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIGJvdHRvbTogMDsKICAgIGxlZnQ6IDA7CiAgICByaWdodDogMDsKICAgIHBhZGRpbmc6IDIycHggOHB4IDdweDsKICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCh0byBib3R0b20sIHRyYW5zcGFyZW50IDAlLCByZ2JhKDAsIDAsIDAsIDAuNzgpIDEwMCUpOwogICAgY29sb3I6ICNmZmY7CiAgICBmb250LXNpemU6IDEwcHg7CiAgICBsaW5lLWhlaWdodDogMS40OwogICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICBvcGFjaXR5OiAwOwogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDVweCk7CiAgICB0cmFuc2l0aW9uOgogICAgICAgIG9wYWNpdHkgMTUwbXMgZWFzZSwKICAgICAgICB0cmFuc2Zvcm0gMTUwbXMgZWFzZTsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgZ2FwOiAzcHg7CiAgICB6LWluZGV4OiAyOwp9Ci8qIE9ubHkgcmV2ZWFsIG9uIGhvdmVyIHdoZW4gdGhlIHNldHRpbmcgaXMgZW5hYmxlZCAoY2xhc3Mgb24gZ3JpZCBjb250YWluZXIpICovCi5tanItZ3JpZC5tanItc2hvdy1ob3Zlci1pbmZvIC5tanItY2FyZDpob3ZlciAubWpyLWNhcmQtaG92ZXItaW5mbyB7CiAgICBvcGFjaXR5OiAxOwogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDApOwp9Ci5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1jYXJkLWhvdmVyLWluZm8gLm1qci1ob3Zlci1wcm9tcHQgewogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIGRpc3BsYXk6IC13ZWJraXQtYm94OwogICAgLXdlYmtpdC1saW5lLWNsYW1wOiAyOwogICAgLXdlYmtpdC1ib3gtb3JpZW50OiB2ZXJ0aWNhbDsKICAgIHdvcmQtYnJlYWs6IGJyZWFrLXdvcmQ7CiAgICBvcGFjaXR5OiAwLjk7CiAgICBmb250LXNpemU6IDkuNXB4Owp9Ci5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1jYXJkLWhvdmVyLWluZm8gLm1qci1ob3Zlci1nZW50aW1lIHsKICAgIGNvbG9yOiByZ2JhKDI1NSwgMjEwLCAxMjAsIDAuOTUpOwogICAgZm9udC13ZWlnaHQ6IDYwMDsKICAgIGZvbnQtc2l6ZTogOXB4OwogICAgbGV0dGVyLXNwYWNpbmc6IDAuMDJlbTsKfQpAbWVkaWEgKHByZWZlcnMtcmVkdWNlZC1tb3Rpb246IHJlZHVjZSkgewogICAgLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWNhcmQtaG92ZXItaW5mbyB7CiAgICAgICAgdHJhbnNpdGlvbjogb3BhY2l0eSAwbXM7CiAgICAgICAgdHJhbnNmb3JtOiBub25lOwogICAgfQp9CgovKiAtLS0gQ2FyZCBkZXRhaWxzIHBhbmVsIHNob3cvaGlkZSB2aWEgZ3JpZCBjb250YWluZXIgY2xhc3MgLS0tLS0tLS0tLS0tLS0tLQogICAubWpyLXNob3ctZGV0YWlscyBpcyB0b2dnbGVkIGJ5IGFwcGx5R3JpZFNldHRpbmdzQ2xhc3NlcygpIHdoZW4gdGhlCiAgICJTaG93IG1ldGFkYXRhIHBhbmVsIiBzZXR0aW5nIGNoYW5nZXMuICBEZWZhdWx0ID0gT0ZGIOKGkiBwYW5lbCBoaWRkZW4uCiAgIEhpZGluZyBoZXJlIGtlZXBzIGFjdHVhbCByb3cgaGVpZ2h0ID0gZXN0aW1hdGVSb3dIZWlnaHQobWV0YUhlaWdodD0wKSwKICAgcHJldmVudGluZyB0aGUgdmlydHVhbGl6ZXIgZnJvbSByZXBvc2l0aW9uaW5nIGFsbCByb3dzIG9uIG1lYXN1cmUKICAgKHdoaWNoIHdhcyB0aGUgcm9vdCBjYXVzZSBvZiB0aGUgInJlbG9hZCBpbXByZXNzaW9uIiBibGluaykuCiAgIE1hdGNoIHRoZSBib3R0b20tZmVlZCBwYXR0ZXJuIGF0IC5tanItYm90dG9tLWZlZWQgLm1qci1jYXJkLWluZm8uCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItZ3JpZCAubWpyLWNhcmQtaW5mbyB7CiAgICBkaXNwbGF5OiBub25lOwp9Ci5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1ncmlkLm1qci1zaG93LWRldGFpbHMgLm1qci1jYXJkLWluZm8gewogICAgZGlzcGxheTogYmxvY2s7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1jYXJkLW1ldGEgewogICAgcGFkZGluZzogOHB4IDEwcHg7CiAgICBmb250LXNpemU6IDExcHg7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1jYXJkLWZpbGVuYW1lIHsKICAgIGZvbnQtd2VpZ2h0OiA2MDA7CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7CiAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBnYXA6IDhweDsKICAgIG1pbi13aWR0aDogMDsKICAgIG1hcmdpbi1ib3R0b206IDJweDsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWNhcmQtZGV0YWlscyB7CiAgICBjb2xvcjogdmFyKC0tbWpyLW11dGVkKTsKICAgIGZvbnQtc2l6ZTogMTBweDsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7CiAgICBvcGFjaXR5OiAwLjg7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1jYXJkLWZpbGVuYW1lLXRleHQgewogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgIG1pbi13aWR0aDogMDsKfQoKLyogUmF0aW5nICYgVGFncyBFZGl0b3JzICovCkBrZXlmcmFtZXMgZmFkZUluIHsKICAgIGZyb20gewogICAgICAgIG9wYWNpdHk6IDA7CiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC00cHgpOwogICAgfQogICAgdG8gewogICAgICAgIG9wYWNpdHk6IDE7CiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDApOwogICAgfQp9Ci8qKgogKiBBcmNoaXZlZCBDU1MgU3R5bGVzIC0gUmF0aW5nIGFuZCBUYWdzCiAqIFRoZXNlIHN0eWxlcyB3ZXJlIHJlbW92ZWQgZnJvbSB0aGVtZS1jb21meS5jc3MKICovCgovKiBBbmltYXRpb25zICovCkBrZXlmcmFtZXMgc2xpZGVJblJpZ2h0IHsKICAgIGZyb20gewogICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgxMDAlKTsKICAgICAgICBvcGFjaXR5OiAwOwogICAgfQogICAgdG8gewogICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgwKTsKICAgICAgICBvcGFjaXR5OiAxOwogICAgfQp9CgovKiBQb3BvdmVycyAqLwoubWpyLXJhdGluZy1wb3BvdmVyLAoubWpyLXRhZ3MtcG9wb3ZlciB7CiAgICBhbmltYXRpb246IGZhZGVJbiAwLjJzIGVhc2U7Cn0KCi5tanItcmF0aW5nLXBvcG92ZXIsCi5tanItdGFncy1wb3BvdmVyIHsKICAgIGJhY2tncm91bmQ6IHZhcigtLWNvbWZ5LW1lbnUtYmcsICMyYTJhMmEpOwogICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyLWNvbG9yLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTIpKTsKICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLXJhZGl1cy1sZywgMC41cmVtKTsKICAgIGJveC1zaGFkb3c6IDAgMTJweCAyOHB4IHJnYmEoMCwgMCwgMCwgMC4zNSk7CiAgICBwYWRkaW5nOiA4cHg7Cn0KCi8qIFJhdGluZyBFZGl0b3IgKi8KLm1qci1yYXRpbmctZWRpdG9yIHsKICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogNHB4OwogICAgcGFkZGluZzogMnB4Owp9CgoubWpyLXJhdGluZy1zdGFyIHsKICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50OwogICAgYm9yZGVyOiAxcHggc29saWQgdHJhbnNwYXJlbnQ7CiAgICBib3JkZXItcmFkaXVzOiA4cHg7CiAgICBmb250LXNpemU6IDIwcHg7CiAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICBwYWRkaW5nOiA0cHggNnB4OwogICAgbGluZS1oZWlnaHQ6IDE7CiAgICBjb2xvcjogdmFyKC0taW5wdXQtdGV4dCwgI2RkZCk7CiAgICB0cmFuc2l0aW9uOgogICAgICAgIHRyYW5zZm9ybSAxMjBtcyBlYXNlLAogICAgICAgIGJhY2tncm91bmQtY29sb3IgMTIwbXMgZWFzZSwKICAgICAgICBib3JkZXItY29sb3IgMTIwbXMgZWFzZSwKICAgICAgICBjb2xvciAxMjBtcyBlYXNlOwogICAgb3V0bGluZTogbm9uZTsKfQoKLm1qci1yYXRpbmctc3Rhcjpob3ZlciB7CiAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1jb21meS1hY2NlbnQsICM1ZmIzZmYpIDM1JSwgdHJhbnNwYXJlbnQpOwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLWNvbWZ5LW1lbnUtc2Vjb25kYXJ5LWJnLCAjMzMzKSA2NSUsIHRyYW5zcGFyZW50KTsKfQoKLm1qci1yYXRpbmctZWRpdG9yIC5tanItcmF0aW5nLXN0YXI6aG92ZXIgewogICAgdHJhbnNmb3JtOiBzY2FsZSgxLjIpICFpbXBvcnRhbnQ7Cn0KCi5tanItcmF0aW5nLWVkaXRvciAubWpyLXJhdGluZy1zdGFyOmZvY3VzLXZpc2libGUgewogICAgb3V0bGluZTogMnB4IHNvbGlkIHZhcigtLWZvY3VzLW91dGxpbmUtY29sb3IsICM0ZGFiZjcpOwogICAgb3V0bGluZS1vZmZzZXQ6IDJweDsKICAgIGJvcmRlci1yYWRpdXM6IDJweDsKfQoKLm1qci1yYXRpbmctZWRpdG9yIC5tanItcmF0aW5nLXN0YXI6YWN0aXZlIHsKICAgIHRyYW5zZm9ybTogc2NhbGUoMC45NSkgIWltcG9ydGFudDsKfQoKLyogVGFncyBFZGl0b3IgKi8KLm1qci10YWdzLWVkaXRvciB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgIGdhcDogOHB4OwogICAgcGFkZGluZzogMTJweDsKICAgIGJhY2tncm91bmQ6IHZhcigtLW1qci1zdXJmYWNlLTEsIHZhcigtLWNvbWZ5LW1lbnUtYmcsICMyYTJhMmEpKTsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLW1qci1ib3JkZXIpOwogICAgYm9yZGVyLXJhZGl1czogdmFyKC0tbWpyLXItc20pOwogICAgYm94LXNoYWRvdzogMCAxMnB4IDI4cHggcmdiYSgwLCAwLCAwLCAwLjQ1KTsKICAgIG1pbi13aWR0aDogMjUwcHg7CiAgICBtYXgtd2lkdGg6IG1pbigzNTBweCwgY2FsYygxMDB2dyAtIDIwcHgpKTsKICAgIGZvbnQtZmFtaWx5OiBpbmhlcml0Owp9CgoubWpyLXRhZ3MtZWRpdG9yLmlzLWRpc2FibGVkIHsKICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgb3BhY2l0eTogMC43Owp9CgoubWpyLXRhZ3MtZGlzcGxheSB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZmxleC13cmFwOiB3cmFwOwogICAgZ2FwOiA2cHg7CiAgICBtaW4taGVpZ2h0OiAzMnB4Owp9CgoubWpyLXRhZ3MtZW1wdHkgewogICAgY29sb3I6IHZhcigtLW1qci1tdXRlZCk7CiAgICBmb250LXNpemU6IDEycHg7CiAgICBmb250LXN0eWxlOiBpdGFsaWM7Cn0KCi5tanItdGFnLWNoaXAgewogICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiA0cHg7CiAgICBwYWRkaW5nOiA0cHggOHB4OwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci10YWctY29sb3IpIDI0JSwgdHJhbnNwYXJlbnQpOwogICAgYm9yZGVyOiAxcHggc29saWQgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci10YWctY29sb3IpIDQwJSwgdmFyKC0tbWpyLWJvcmRlcikpOwogICAgYm9yZGVyLXJhZGl1czogMTJweDsKICAgIGZvbnQtc2l6ZTogMTFweDsKICAgIGNvbG9yOiB2YXIoLS1tanItdGFnLWNvbG9yKTsKICAgIHRyYW5zaXRpb246IGFsbCAwLjJzIGVhc2U7Cn0KCi5tanItdGFnLWNoaXAtcmVtb3ZlIHsKICAgIGFwcGVhcmFuY2U6IG5vbmU7CiAgICAtd2Via2l0LWFwcGVhcmFuY2U6IG5vbmU7CiAgICBiYWNrZ3JvdW5kOiBub25lOwogICAgYm9yZGVyOiAwOwogICAgYm9yZGVyLXJhZGl1czogMDsKICAgIGJveC1zaGFkb3c6IG5vbmU7CiAgICBjb2xvcjogaW5oZXJpdDsKICAgIGN1cnNvcjogcG9pbnRlcjsKICAgIG1hcmdpbjogMDsKICAgIHBhZGRpbmc6IDA7CiAgICBmb250LXNpemU6IDE0cHg7CiAgICBsaW5lLWhlaWdodDogMTsKICAgIG9wYWNpdHk6IDAuNzsKfQoKLm1qci10YWctY2hpcC1yZW1vdmU6ZGlzYWJsZWQgewogICAgY3Vyc29yOiBkZWZhdWx0Owp9CgoubWpyLXRhZ3MtaW5wdXQtd3JhcCB7CiAgICBwb3NpdGlvbjogcmVsYXRpdmU7Cn0KCi5tanItdGFnLWlucHV0IHsKICAgIHdpZHRoOiAxMDAlOwogICAgcGFkZGluZzogNnB4IDhweDsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0yKSA3NSUsIHRyYW5zcGFyZW50KTsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLW1qci1ib3JkZXIpOwogICAgYm9yZGVyLXJhZGl1czogNHB4OwogICAgY29sb3I6IHZhcigtLWNvbnRlbnQtZmcpOwogICAgZm9udC1zaXplOiAxM3B4OwogICAgb3V0bGluZTogbm9uZTsKfQoKLm1qci10YWctaW5wdXQ6Zm9jdXMgewogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTIpIDg4JSwgdHJhbnNwYXJlbnQpICFpbXBvcnRhbnQ7CiAgICBib3JkZXItY29sb3I6IHZhcigtLW1qci1hY2NlbnQpICFpbXBvcnRhbnQ7Cn0KCi5tanItdGFnLWNoaXA6aG92ZXIgewogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci10YWctY29sb3IpIDM0JSwgdHJhbnNwYXJlbnQpICFpbXBvcnRhbnQ7CiAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItdGFnLWNvbG9yKSA2MCUsIHZhcigtLW1qci1ib3JkZXIpKSAhaW1wb3J0YW50Owp9CgoubWpyLXRhZ3MtZHJvcGRvd24gewogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgdG9wOiAxMDAlOwogICAgbGVmdDogMDsKICAgIHJpZ2h0OiAwOwogICAgbWFyZ2luLXRvcDogNHB4OwogICAgYmFja2dyb3VuZDogdmFyKC0tbWpyLXN1cmZhY2UtMSwgdmFyKC0tY29tZnktbWVudS1iZywgIzJhMmEyYSkpOwogICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tbWpyLWJvcmRlcik7CiAgICBib3JkZXItcmFkaXVzOiA0cHg7CiAgICBtYXgtaGVpZ2h0OiAxNTBweDsKICAgIG92ZXJmbG93LXk6IGF1dG87CiAgICB6LWluZGV4OiAxMDAwOwp9CgoubWpyLXRhZ3MtZHJvcGRvd24gW2RhdGEtcGMtc2VjdGlvbj0ibGlzdCJdIHsKICAgIGxpc3Qtc3R5bGU6IG5vbmU7CiAgICBtYXJnaW46IDA7CiAgICBwYWRkaW5nOiAwOwp9CgoubWpyLXRhZ3MtZHJvcGRvd24gW2RhdGEtcGMtc2VjdGlvbj0ib3B0aW9uIl0gewogICAgbGlzdC1zdHlsZTogbm9uZTsKfQoKLm1qci10YWctc3VnZ2VzdGlvbiB7CiAgICBwYWRkaW5nOiA2cHggOHB4OwogICAgY3Vyc29yOiBwb2ludGVyOwogICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7CiAgICBjb2xvcjogdmFyKC0tbWpyLXRhZy1jb2xvcik7CiAgICBmb250LXNpemU6IDEycHg7Cn0KCi5tanItdGFnLXN1Z2dlc3Rpb24uaXMtYWN0aXZlLAoubWpyLXRhZy1zdWdnZXN0aW9uOmhvdmVyIHsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItdGFnLWNvbG9yKSAyOCUsIHRyYW5zcGFyZW50KSAhaW1wb3J0YW50Owp9CgovKiBCYWRnZXMgSW50ZXJhY3RpdmUgKi8KLm1qci1yYXRpbmctYmFkZ2UsCi5tanItdGFncy1iYWRnZSB7CiAgICB0cmFuc2l0aW9uOiBhbGwgMC4ycyBlYXNlOwp9CgoubWpyLXJhdGluZy1iYWRnZSB7CiAgICBjb2xvcjogdmFyKC0tbWpyLXJhdGluZy1jb2xvcikgIWltcG9ydGFudDsKfQoKLm1qci10YWdzLWJhZGdlIHsKICAgIGNvbG9yOiB2YXIoLS1tanItdGFnLWNvbG9yKSAhaW1wb3J0YW50Owp9CgoubWpyLXJhdGluZy1iYWRnZTpob3ZlciwKLm1qci10YWdzLWJhZGdlOmhvdmVyIHsKICAgIHRyYW5zZm9ybTogc2NhbGUoMS4wNSk7CiAgICBib3gtc2hhZG93OiAwIDRweCA4cHggcmdiYSgwLCAwLCAwLCAwLjUpOwp9CgovKiBTY3JvbGxiYXIgZm9yIHRhZ3MgZHJvcGRvd24gKi8KLm1qci10YWdzLWRyb3Bkb3duOjotd2Via2l0LXNjcm9sbGJhciB7CiAgICB3aWR0aDogNnB4Owp9CgoubWpyLXRhZ3MtZHJvcGRvd246Oi13ZWJraXQtc2Nyb2xsYmFyLXRyYWNrIHsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0yKSA2NSUsIHRyYW5zcGFyZW50KTsKICAgIGJvcmRlci1yYWRpdXM6IDNweDsKfQoKLm1qci10YWdzLWRyb3Bkb3duOjotd2Via2l0LXNjcm9sbGJhci10aHVtYiB7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXRhZy1jb2xvcikgNDglLCB2YXIoLS1tanItYm9yZGVyKSk7CiAgICBib3JkZXItcmFkaXVzOiAzcHg7Cn0KCi5tanItdGFncy1kcm9wZG93bjo6LXdlYmtpdC1zY3JvbGxiYXItdGh1bWI6aG92ZXIgewogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci10YWctY29sb3IpIDY1JSwgdmFyKC0tbWpyLWJvcmRlcikpOwp9CgovKiBTaWRlYmFyIChjYW4gYmUgbGVmdCBvciByaWdodCkgKi8KLm1qci1zaWRlYmFyIHsKICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgIHotaW5kZXg6IDM7CiAgICBmbGV4OiAwIDAgYXV0bzsKICAgIHRyYW5zaXRpb246IGFsbCAwLjNzIGVhc2U7Cn0KCi5tanItd29ya2Zsb3ctdHJlZS13cmFwIHsKICAgIG1hcmdpbjogMCAwIDEycHg7CiAgICBib3JkZXI6IDFweCBzb2xpZCBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWJvcmRlcikgODIlLCB0cmFuc3BhcmVudCk7CiAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1tanItci1tZCwgOHB4KTsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0xKSA3MiUsIHRyYW5zcGFyZW50KTsKfQoKLm1qci13b3JrZmxvdy10cmVlIHsKICAgIGNvbG9yOiB2YXIoLS1jb250ZW50LWZnLCAjZWFlYWVhKTsKICAgIGZvbnQtc2l6ZTogMTJweDsKfQoKLm1qci13b3JrZmxvdy10cmVlLXNjcm9sbCB7CiAgICBvdmVyZmxvdzogYXV0bzsKICAgIHBhZGRpbmc6IDJweCA0cHggNnB4Owp9CgoubWpyLXdvcmtmbG93LXRyZWUtbGlzdCB7CiAgICBsaXN0LXN0eWxlOiBub25lOwogICAgbWFyZ2luOiAwOwogICAgcGFkZGluZzogMDsKfQoKLm1qci13b3JrZmxvdy10cmVlLW5vZGUtY29udGVudCB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogNnB4OwogICAgbWluLWhlaWdodDogMjhweDsKICAgIHBhZGRpbmc6IDRweCA2cHg7CiAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1tanItci1zbSwgNnB4KTsKfQoKLm1qci13b3JrZmxvdy10cmVlLW5vZGUtY29udGVudDpob3ZlciB7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMikgNTglLCB0cmFuc3BhcmVudCk7Cn0KCi5tanItd29ya2Zsb3ctdHJlZS10b2dnbGUgewogICAgd2lkdGg6IDE0cHg7CiAgICBoZWlnaHQ6IDIwcHg7CiAgICBwYWRkaW5nOiAwOwogICAgYm9yZGVyOiAwOwogICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7CiAgICBjb2xvcjogdmFyKC0tbWpyLW11dGVkLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNjQpKTsKfQoKLm1qci13b3JrZmxvdy10cmVlLXRvZ2dsZVtkYXRhLXAtbGVhZj0idHJ1ZSJdIHsKICAgIHZpc2liaWxpdHk6IGhpZGRlbjsKfQoKLm1qci13b3JrZmxvdy10cmVlLWljb24gewogICAgd2lkdGg6IDhweDsKICAgIGZsZXg6IDAgMCA4cHg7CiAgICBjb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQpIDcwJSwgdmFyKC0tY29udGVudC1mZykpOwogICAgZm9udC1zaXplOiA3cHg7Cn0KCi5tanItd29ya2Zsb3ctdHJlZS1sYWJlbCB7CiAgICBtaW4td2lkdGg6IDA7CiAgICBmbGV4OiAxIDEgYXV0bzsKfQoKLm1qci13b3JrZmxvdy10cmVlLW5vZGUgewogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBnYXA6IDhweDsKICAgIG1pbi13aWR0aDogMDsKfQoKLm1qci13b3JrZmxvdy10cmVlLW5vZGUtbmFtZSB7CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7CiAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwp9CgoubWpyLXdvcmtmbG93LXRyZWUtbm9kZS10eXBlIHsKICAgIGNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLW11dGVkKSA3NSUsIHZhcigtLWNvbnRlbnQtZmcpKTsKICAgIGZvbnQtc2l6ZTogMTFweDsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7Cn0KCi5tanItc2lkZWJhci5pcy1vcGVuIHsKICAgIC8qIEJvcmRlciBpcyBzZXQgZHluYW1pY2FsbHkgYmFzZWQgb24gcG9zaXRpb24gKi8KfQoKLm1qci1zaWRlYmFyIC5tanItc2lkZWJhci1oZWFkZXIgewogICAgYmFja2dyb3VuZDogdmFyKC0tbWpyLXN1cmZhY2UtMiwgIzMzMyk7CiAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgdmFyKC0tbWpyLWJvcmRlciwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEyKSk7Cn0KCi5tanItc2lkZWJhciAubWpyLXNpZGViYXItY29udGVudCB7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1tanItc3VyZmFjZS0xLCAjMmEyYTJhKTsKfQoKLm1qci1zaWRlYmFyIC5tanItc2lkZWJhci1jb250ZW50Ojotd2Via2l0LXNjcm9sbGJhciB7CiAgICB3aWR0aDogOHB4Owp9CgoubWpyLXNpZGViYXIgLm1qci1zaWRlYmFyLWNvbnRlbnQ6Oi13ZWJraXQtc2Nyb2xsYmFyLXRyYWNrIHsKICAgIGJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgMC4zKTsKfQoKLm1qci1zaWRlYmFyIC5tanItc2lkZWJhci1jb250ZW50Ojotd2Via2l0LXNjcm9sbGJhci10aHVtYiB7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMik7CiAgICBib3JkZXItcmFkaXVzOiA0cHg7Cn0KCi5tanItc2lkZWJhciAubWpyLXNpZGViYXItY29udGVudDo6LXdlYmtpdC1zY3JvbGxiYXItdGh1bWI6aG92ZXIgewogICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjMpOwp9CgovKiBDdXN0b20gUm9vdHMgUG9wb3ZlciBTdHlsaW5nICovCi5tanItY3VzdG9tLXBvcG92ZXIgewogICAgbWluLXdpZHRoOiAzMDBweDsKICAgIGJhY2tncm91bmQ6IHZhcigtLW1qci1zdXJmYWNlLTEsIHZhcigtLWNvbWZ5LW1lbnUtYmcsICMyYTJhMmEpKTsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLW1qci1ib3JkZXIsIHZhcigtLWJvcmRlci1jb2xvciwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEyKSkpOwogICAgYm9yZGVyLXJhZGl1czogdmFyKC0tcmFkaXVzLWxnLCAwLjVyZW0pOwogICAgYm94LXNoYWRvdzogMCAxMnB4IDI4cHggcmdiYSgwLCAwLCAwLCAwLjM1KTsKICAgIHotaW5kZXg6IHZhcigtLW1qci1wb3BvdmVyLXotaW5kZXgpOwogICAgcGFkZGluZzogMTJweDsKfQoKLm1qci1jdXN0b20tcG9wb3ZlciAubWpyLXBvcG92ZXItcm93IHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiAxMHB4OwogICAgbWFyZ2luLWJvdHRvbTogMTJweDsKICAgIGZsZXgtd3JhcDogd3JhcDsKfQoKLm1qci1jdXN0b20tcG9wb3ZlciAubWpyLXBvcG92ZXItcm93Omxhc3QtY2hpbGQgewogICAgbWFyZ2luLWJvdHRvbTogMDsKfQoKLm1qci1jdXN0b20tcG9wb3ZlciAubWpyLXBvcG92ZXItbGFiZWwgewogICAgd2lkdGg6IDYwcHg7CiAgICBjb2xvcjogdmFyKC0tbWpyLW11dGVkLCB2YXIoLS1kZXNjcmlwLXRleHQsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC42NSkpKTsKICAgIGZvbnQtc2l6ZTogMTJweDsKICAgIGZvbnQtd2VpZ2h0OiA1MDA7Cn0KCi5tanItY3VzdG9tLXBvcG92ZXIgLm1qci1zZWxlY3QgewogICAgZmxleDogMTsKICAgIG1pbi13aWR0aDogMDsKfQoKLm1qci1jdXN0b20tcG9wb3ZlciAubWpyLWJ0biB7CiAgICBmbGV4OiAxOwogICAgbWluLXdpZHRoOiAwOwogICAgbWFyZ2luLXJpZ2h0OiA1cHg7Cn0KCi5tanItY3VzdG9tLXBvcG92ZXIgLm1qci1idG46bGFzdC1jaGlsZCB7CiAgICBtYXJnaW4tcmlnaHQ6IDA7Cn0KCi5tanItY3VzdG9tLXBvcG92ZXIgLm1qci1idG4ubWpyLXByaW1hcnkgewogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQpIDE4JSwgdmFyKC0tbWpyLXN1cmZhY2UtMikpOwogICAgYm9yZGVyLWNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWFjY2VudCkgNjAlLCB2YXIoLS1tanItYm9yZGVyKSk7Cn0KCi5tanItY3VzdG9tLXBvcG92ZXIgLm1qci1idG4ubWpyLXByaW1hcnk6aG92ZXIgewogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQpIDI1JSwgdmFyKC0tbWpyLXN1cmZhY2UtMikpOwogICAgYm9yZGVyLWNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWFjY2VudCkgODAlLCB2YXIoLS1tanItYm9yZGVyKSk7Cn0KCi5tanItc2lkZWJhciAubWpyLXNpZGViYXItc2VjdGlvbiB7CiAgICB0cmFuc2l0aW9uOiBhbGwgMC4ycyBlYXNlOwp9CgoubWpyLXNpZGViYXIgLm1qci1zaWRlYmFyLXNlY3Rpb246aG92ZXIgewogICAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjMpICFpbXBvcnRhbnQ7Cn0KCi8qIElubGluZSBTaWRlYmFyICh3aWR0aC1iYXNlZCB0cmFuc2l0aW9ucyBsaWtlIGFyY2hpdmVkIHZlcnNpb24pICovCi5tanItaW5saW5lLXNpZGViYXIgewogICAgd2lkdGg6IDA7CiAgICBtaW4td2lkdGg6IDA7CiAgICBtYXgtd2lkdGg6IDQ4MHB4OwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIGJhY2tncm91bmQ6IHZhcigtLW1qci1zdXJmYWNlLTEsICMyYTJhMmEpOwogICAgZGlzcGxheTogZmxleDsKICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICB0cmFuc2l0aW9uOgogICAgICAgIHdpZHRoIDAuM3MgZWFzZSwKICAgICAgICBtaW4td2lkdGggMC4zcyBlYXNlOwp9CgoubWpyLWlubGluZS1zaWRlYmFyLmlzLW9wZW4gewogICAgd2lkdGg6IDQwMHB4OwogICAgbWluLXdpZHRoOiAyNjBweDsKfQoKLyogU3BhY2UgYmV0d2VlbiBzaWRlYmFyIGFuZCBncmlkICovCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hbS1icm93c2UgewogICAgZ2FwOiAwOwp9CgovKiBCb3JkZXIgYmFzZWQgb24gcG9zaXRpb24gKi8KLm1qci1pbmxpbmUtc2lkZWJhcltkYXRhLXBvc2l0aW9uPSJsZWZ0Il0gewogICAgYm9yZGVyLXJpZ2h0OiAxcHggc29saWQgdmFyKC0tbWpyLWJvcmRlciwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEyKSk7Cn0KCi5tanItaW5saW5lLXNpZGViYXJbZGF0YS1wb3NpdGlvbj0icmlnaHQiXSB7CiAgICBib3JkZXItbGVmdDogMXB4IHNvbGlkIHZhcigtLW1qci1ib3JkZXIsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xMikpOwp9CgovKiBTaWRlYmFyIHBsYWNlaG9sZGVyICovCi5tanItc2lkZWJhci1wbGFjZWhvbGRlciB7CiAgICBwYWRkaW5nOiAyMHB4OwogICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgY29sb3I6IHZhcigtLW1qci1tdXRlZCwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjY1KSk7CiAgICBmb250LXNpemU6IDE0cHg7CiAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwp9CgovKiA9PT09PT09PT09IFZpZXdlciBDb21wb25lbnQgPT09PT09PT09PSAqLwoubWpyLXZpZXdlci1vdmVybGF5IHsKICAgIHBvc2l0aW9uOiBmaXhlZDsKICAgIHRvcDogMDsKICAgIGxlZnQ6IDA7CiAgICByaWdodDogMDsKICAgIGJvdHRvbTogMDsKICAgIGJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgMC45NSk7CiAgICAvKiBTaXQgYWJvdmUgTUZWICgxMDAwMCkgc28gdGhlIGZ1bGwgdmlld2VyIGFsd2F5cyBjb3ZlcnMgdGhlIGZsb2F0aW5nIHBhbmVsICovCiAgICB6LWluZGV4OiAxMDAwMTsKICAgIHBvaW50ZXItZXZlbnRzOiBhdXRvOwogICAgZGlzcGxheTogbm9uZTsKICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47Cn0KLyogRmFkZS1pbjogYW5pbWF0aW9uIHJlLXRyaWdnZXJzIGVhY2ggdGltZSBKUyBzd2l0Y2hlcyBkaXNwbGF5IGJhY2sgdG8gZmxleCAqLwoubWpyLXZpZXdlci1vdmVybGF5W3N0eWxlKj0iZmxleCJdIHsKICAgIGFuaW1hdGlvbjogbWpyLWZhZGUtaW4gMC4xOHMgZWFzZS1vdXQ7Cn0KCkBrZXlmcmFtZXMgbWpyLWZhZGUtaW4gewogICAgZnJvbSB7CiAgICAgICAgb3BhY2l0eTogMDsKICAgICAgICB0cmFuc2Zvcm06IHNjYWxlKDAuOTk1KTsKICAgIH0KICAgIHRvIHsKICAgICAgICBvcGFjaXR5OiAxOwogICAgICAgIHRyYW5zZm9ybTogc2NhbGUoMSk7CiAgICB9Cn0KCi5tanItdmlld2VyLWhlYWRlciB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIHBhZGRpbmc6IDEycHggMjBweDsKICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgxNzBkZWcsIHJnYmEoMjQsIDI3LCAzMywgMC45NiksIHJnYmEoMTcsIDE5LCAyNSwgMC45NykpOwogICAgYm9yZGVyLWJvdHRvbTogMC44cHggc29saWQgcmdiYSgxOTYsIDIwMiwgMjEwLCAwLjIpOwogICAgY29sb3I6IHdoaXRlOwp9CgoubWpyLXZpZXdlci1maWxlbmFtZSB7CiAgICBmb250LXNpemU6IDE0cHg7CiAgICBmb250LXdlaWdodDogNTAwOwogICAgbWF4LXdpZHRoOiA0MDBweDsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7Cn0KCi5tanItdmlld2VyLW1vZGUtYnV0dG9ucyB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZ2FwOiA2cHg7Cn0KCi5tanItdmlld2VyLW1vZGUtYnV0dG9ucyBidXR0b24gewogICAgcGFkZGluZzogNHB4IDEycHg7CiAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoMTgwZGVnLCByZ2JhKDIwNiwgMjExLCAyMTgsIDAuMSksIHJnYmEoMjA2LCAyMTEsIDIxOCwgMC4wMykpOwogICAgYm9yZGVyOiAwLjhweCBzb2xpZCByZ2JhKDE5NiwgMjAyLCAyMTAsIDAuMyk7CiAgICBjb2xvcjogcmdiYSgyMzAsIDIzMywgMjM4LCAwLjk1KTsKICAgIGJvcmRlci1yYWRpdXM6IDRweDsKICAgIGN1cnNvcjogcG9pbnRlcjsKICAgIGZvbnQtc2l6ZTogMTJweDsKICAgIHRyYW5zaXRpb246IGFsbCAwLjE2czsKfQoKLm1qci12aWV3ZXItbW9kZS1idXR0b25zIGJ1dHRvbjpob3ZlciB7CiAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoMTgwZGVnLCByZ2JhKDIxMCwgMjE0LCAyMjAsIDAuMTQpLCByZ2JhKDIxMCwgMjE0LCAyMjAsIDAuMDYpKTsKICAgIGJvcmRlci1jb2xvcjogcmdiYSgyMTQsIDIxOCwgMjI0LCAwLjQyKTsKfQoKLyogVmlld2VyIGNsb3NlIGJ1dHRvbiBwaW5uZWQgdG8gb3ZlcmxheSBjb3JuZXIgKi8KLm1qci12aWV3ZXItY2xvc2UsCi5tanItdmlld2VyLWZzIHsKICAgIGJvcmRlci1jb2xvcjogcmdiYSgxOTYsIDIwMiwgMjEwLCAwLjI2KSAhaW1wb3J0YW50OwogICAgYm9yZGVyLXdpZHRoOiAwLjhweCAhaW1wb3J0YW50OwogICAgYmFja2dyb3VuZDoKICAgICAgICBsaW5lYXItZ3JhZGllbnQoMTgwZGVnLCByZ2JhKDIwNiwgMjExLCAyMTgsIDAuMDgpLCByZ2JhKDIwNiwgMjExLCAyMTgsIDAuMDIpKSwKICAgICAgICByZ2JhKDIwLCAyMywgMjksIDAuOTQpICFpbXBvcnRhbnQ7CiAgICBib3gtc2hhZG93OiBpbnNldCAwIDFweCAwIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wOCkgIWltcG9ydGFudDsKfQoKLm1qci12aWV3ZXItY2xvc2UgewogICAgY29sb3I6ICNmZmY0ZjQgIWltcG9ydGFudDsKICAgIGJvcmRlci1jb2xvcjogcmdiYSgyMDUsIDgyLCA4MiwgMC41KSAhaW1wb3J0YW50OwogICAgYmFja2dyb3VuZDoKICAgICAgICBsaW5lYXItZ3JhZGllbnQoMTgwZGVnLCByZ2JhKDIwNSwgODIsIDgyLCAwLjMpLCByZ2JhKDIwNSwgODIsIDgyLCAwLjEyKSksCiAgICAgICAgcmdiYSg1OCwgMTgsIDE4LCAwLjk0KSAhaW1wb3J0YW50OwogICAgYm94LXNoYWRvdzoKICAgICAgICBpbnNldCAwIDFweCAwIHJnYmEoMjU1LCAyMTksIDIxOSwgMC4xNiksCiAgICAgICAgMCAwIDAgMXB4IHJnYmEoMjA1LCA4MiwgODIsIDAuMDgpICFpbXBvcnRhbnQ7Cn0KCi5tanItdmlld2VyLWNsb3NlOmhvdmVyIHsKICAgIGJhY2tncm91bmQ6CiAgICAgICAgbGluZWFyLWdyYWRpZW50KDE4MGRlZywgcmdiYSgyMzUsIDExMCwgMTEwLCAwLjM4KSwgcmdiYSgyMzUsIDExMCwgMTEwLCAwLjE2KSksCiAgICAgICAgcmdiYSg3MCwgMTgsIDE4LCAwLjk3KSAhaW1wb3J0YW50OwogICAgYm9yZGVyLWNvbG9yOiByZ2JhKDIzNSwgMTM4LCAxMzgsIDAuNjQpICFpbXBvcnRhbnQ7Cn0KCi5tanItdmlld2VyLWZzOmhvdmVyIHsKICAgIGJhY2tncm91bmQ6CiAgICAgICAgbGluZWFyLWdyYWRpZW50KDE4MGRlZywgcmdiYSgyMTAsIDIxNCwgMjIwLCAwLjE0KSwgcmdiYSgyMTAsIDIxNCwgMjIwLCAwLjA2KSksCiAgICAgICAgcmdiYSgyMywgMjYsIDMyLCAwLjk1KSAhaW1wb3J0YW50OwogICAgYm9yZGVyLWNvbG9yOiByZ2JhKDIxNCwgMjE4LCAyMjQsIDAuMzgpICFpbXBvcnRhbnQ7Cn0KCi5tanItdmlld2VyLWNsb3NlIC5waSB7CiAgICBmb250LXNpemU6IDE2cHg7CiAgICBsaW5lLWhlaWdodDogMTsKfQoKLm1qci12aWV3ZXItY29udGVudCB7CiAgICBmbGV4OiAxOwogICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7Cn0KCi5tanItdmlld2VyLXNpbmdsZSwKLm1qci12aWV3ZXItYWIsCi5tanItdmlld2VyLXNpZGVieXNpZGUgewogICAgd2lkdGg6IDEwMCU7CiAgICBoZWlnaHQ6IDEwMCU7Cn0KCi5tanItdmlld2VyLXNpbmdsZSB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwp9CgoubWpyLXZpZXdlci1zaW5nbGUgaW1nLAoubWpyLXZpZXdlci1zaW5nbGUgdmlkZW8gewogICAgbWF4LXdpZHRoOiAxMDAlOwogICAgbWF4LWhlaWdodDogMTAwJTsKICAgIG9iamVjdC1maXQ6IGNvbnRhaW47CiAgICB0cmFuc2l0aW9uOiB0cmFuc2Zvcm0gMC4yczsKfQoKLm1qci12aWV3ZXItYXVkaW8tc2hlbGwgewogICAgd2lkdGg6IDEwMCU7CiAgICBoZWlnaHQ6IDEwMCU7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgIGdhcDogMTRweDsKICAgIHBhZGRpbmc6IDE4cHg7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjkpOwogICAgYmFja2dyb3VuZDoKICAgICAgICByYWRpYWwtZ3JhZGllbnQoY2lyY2xlIGF0IDE4JSAyMiUsIHJnYmEoNzgsIDE4NCwgMjU1LCAwLjIpLCB0cmFuc3BhcmVudCAzMiUpLAogICAgICAgIHJhZGlhbC1ncmFkaWVudChjaXJjbGUgYXQgODIlIDc0JSwgcmdiYSg4MiwgMjIwLCAxNTYsIDAuMTUpLCB0cmFuc3BhcmVudCAzNiUpLAogICAgICAgIGxpbmVhci1ncmFkaWVudCgxMzVkZWcsIHJnYmEoMTIsIDE4LCAyNiwgMC45OCksIHJnYmEoNCwgNywgMTEsIDAuOTkpKTsKfQoKLm1qci12aWV3ZXItYXVkaW8taGVhZGVyIHsKICAgIHdpZHRoOiBtaW4oMTA4MHB4LCA4OCUpOwogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgIGdhcDogMTFweDsKICAgIG1pbi13aWR0aDogMDsKICAgIHBhZGRpbmc6IDAgOHB4Owp9CgoubWpyLXZpZXdlci1hdWRpby1pY29uIHsKICAgIHdpZHRoOiAzNHB4OwogICAgaGVpZ2h0OiAzNHB4OwogICAgZmxleDogMCAwIGF1dG87CiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgIGJvcmRlci1yYWRpdXM6IDk5OXB4OwogICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEpOwogICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE2KTsKICAgIGJveC1zaGFkb3c6IDAgOHB4IDIycHggcmdiYSgwLCAwLCAwLCAwLjI2KTsKfQoKLm1qci12aWV3ZXItYXVkaW8tdGl0bGUtd3JhcCB7CiAgICBtaW4td2lkdGg6IDA7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgIGdhcDogMnB4Owp9CgoubWpyLXZpZXdlci1hdWRpby10aXRsZSB7CiAgICBtYXgtd2lkdGg6IG1pbig3NjBweCwgNzJ2dyk7CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7CiAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgZm9udC1zaXplOiAxM3B4OwogICAgZm9udC13ZWlnaHQ6IDgwMDsKICAgIGxpbmUtaGVpZ2h0OiAxLjI1Owp9CgoubWpyLXZpZXdlci1hdWRpby1tZXRhIHsKICAgIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNTgpOwogICAgZm9udC1zaXplOiAxMHB4OwogICAgZm9udC13ZWlnaHQ6IDgwMDsKICAgIGxldHRlci1zcGFjaW5nOiAwOwp9CgoubWpyLXZpZXdlci1hdWRpby12aXogewogICAgd2lkdGg6IG1pbigxOTIwcHgsIDk2JSk7CiAgICBhc3BlY3QtcmF0aW86IDE2IC8gOTsKICAgIGhlaWdodDogYXV0bzsKICAgIG1heC1oZWlnaHQ6IG1pbigxMDgwcHgsIDY4dmgpOwogICAgbWluLWhlaWdodDogMjYwcHg7CiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDkpOwogICAgYm9yZGVyLXJhZGl1czogMTZweDsKICAgIGJhY2tncm91bmQ6CiAgICAgICAgbGluZWFyLWdyYWRpZW50KDE4MGRlZywgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA0KSwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjAxKSksCiAgICAgICAgcmdiYSgyLCA1LCA5LCAwLjIyKTsKICAgIGJveC1zaGFkb3c6CiAgICAgICAgaW5zZXQgMCAxcHggMCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDUpLAogICAgICAgIDAgMThweCA3MHB4IHJnYmEoMCwgMCwgMCwgMC4zKTsKfQoKLm1qci12aWV3ZXItYXVkaW8tc3JjIHsKICAgIHdpZHRoOiBtaW4oNjgwcHgsIDkwJSk7Cn0KCi5tanItdmlld2VyLWFiIHsKICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgIGRpc3BsYXk6IG5vbmU7Cn0KCi5tanItdmlld2VyLXNpZGVieXNpZGUgewogICAgZGlzcGxheTogbm9uZTsKICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7CiAgICBnYXA6IDJweDsKfQoKLm1qci12aWV3ZXItc2lkZWJ5c2lkZSA+IGRpdiB7CiAgICBmbGV4OiAxOwogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgIGJhY2tncm91bmQ6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wNSk7Cn0KCi5tanItdmlld2VyLXNpZGVieXNpZGUgaW1nLAoubWpyLXZpZXdlci1zaWRlYnlzaWRlIHZpZGVvIHsKICAgIG1heC13aWR0aDogMTAwJTsKICAgIG1heC1oZWlnaHQ6IDEwMCU7CiAgICBvYmplY3QtZml0OiBjb250YWluOwp9CgoubWpyLXZpZXdlci1mb290ZXIgewogICAgZGlzcGxheTogZmxleDsKICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIHBhZGRpbmc6IDEycHggMjBweDsKICAgIGJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgMC44KTsKICAgIGJvcmRlci10b3A6IDFweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMSk7CiAgICBjb2xvcjogd2hpdGU7CiAgICBnYXA6IDIwcHg7Cn0KCi5tanItdmlld2VyLWZvb3RlciBidXR0b24gewogICAgcGFkZGluZzogNnB4IDEycHg7CiAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4zKTsKICAgIGNvbG9yOiB3aGl0ZTsKICAgIGJvcmRlci1yYWRpdXM6IDRweDsKICAgIGN1cnNvcjogcG9pbnRlcjsKICAgIGZvbnQtc2l6ZTogMTRweDsKICAgIHRyYW5zaXRpb246IGFsbCAwLjJzOwp9CgoubWpyLXZpZXdlci1mb290ZXIgYnV0dG9uOmhvdmVyIHsKICAgIGJhY2tncm91bmQ6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xKTsKfQoKLm1qci12aWV3ZXItbmF2IHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiAxNHB4Owp9CgoubWpyLXZpZXdlci1uYXYtYnRuIHsKICAgIHdpZHRoOiA0MHB4ICFpbXBvcnRhbnQ7CiAgICBoZWlnaHQ6IDQwcHggIWltcG9ydGFudDsKICAgIHBhZGRpbmc6IDAgIWltcG9ydGFudDsKICAgIGJvcmRlci1yYWRpdXM6IDEwcHggIWltcG9ydGFudDsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMTk2LCAyMDIsIDIxMCwgMC40MikgIWltcG9ydGFudDsKICAgIGJhY2tncm91bmQ6CiAgICAgICAgbGluZWFyLWdyYWRpZW50KDE4MGRlZywgcmdiYSgxOTQsIDIwMCwgMjA4LCAwLjE4KSwgcmdiYSgxOTQsIDIwMCwgMjA4LCAwLjA3KSksCiAgICAgICAgcmdiYSgzNCwgMzgsIDQ0LCAwLjkyKSAhaW1wb3J0YW50OwogICAgY29sb3I6IHJnYmEoMjM0LCAyMzYsIDI0MCwgMC45NikgIWltcG9ydGFudDsKICAgIGZvbnQtc2l6ZTogMjBweCAhaW1wb3J0YW50OwogICAgZm9udC13ZWlnaHQ6IDcwMCAhaW1wb3J0YW50OwogICAgbGluZS1oZWlnaHQ6IDEgIWltcG9ydGFudDsKICAgIHRleHQtc2hhZG93OiBub25lOwogICAgYm94LXNoYWRvdzogaW5zZXQgMCAxcHggMCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTQpOwogICAgdHJhbnNpdGlvbjoKICAgICAgICB0cmFuc2Zvcm0gMC4xNHMgZWFzZSwKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yIDAuMTRzIGVhc2UsCiAgICAgICAgYm9yZGVyLWNvbG9yIDAuMTRzIGVhc2UgIWltcG9ydGFudDsKfQoKLm1qci12aWV3ZXItbmF2LWJ0bjpob3Zlcjpub3QoOmRpc2FibGVkKSB7CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTFweCk7CiAgICBib3JkZXItY29sb3I6IHJnYmEoMjE0LCAyMTgsIDIyNCwgMC41NikgIWltcG9ydGFudDsKICAgIGJhY2tncm91bmQ6CiAgICAgICAgbGluZWFyLWdyYWRpZW50KDE4MGRlZywgcmdiYSgyMDcsIDIxMiwgMjE5LCAwLjIpLCByZ2JhKDIwNywgMjEyLCAyMTksIDAuMSkpLAogICAgICAgIHJnYmEoMzksIDQzLCA0OSwgMC45NCkgIWltcG9ydGFudDsKICAgIGJveC1zaGFkb3c6IGluc2V0IDAgMXB4IDAgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjIpOwp9CgoubWpyLXZpZXdlci1uYXYtYnRuOmFjdGl2ZTpub3QoOmRpc2FibGVkKSB7CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoMCkgc2NhbGUoMC45OCk7CiAgICBmaWx0ZXI6IG5vbmU7Cn0KCi5tanItdmlld2VyLW5hdi1idG46ZGlzYWJsZWQgewogICAgb3BhY2l0eTogMC4zNCAhaW1wb3J0YW50OwogICAgZmlsdGVyOiBncmF5c2NhbGUoMC4yNSk7CiAgICBib3gtc2hhZG93OiBub25lOwogICAgYm9yZGVyLWNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTQpICFpbXBvcnRhbnQ7Cn0KCi5tanItdmlld2VyLWluZGV4IHsKICAgIGZvbnQtc2l6ZTogMTNweDsKICAgIG1pbi13aWR0aDogNzRweDsKICAgIHRleHQtYWxpZ246IGNlbnRlcjsKICAgIGZvbnQtdmFyaWFudC1udW1lcmljOiB0YWJ1bGFyLW51bXM7CiAgICBsZXR0ZXItc3BhY2luZzogMC4wNGVtOwogICAgY29sb3I6IHJnYmEoMjI2LCAyMjgsIDIzMywgMC45NCk7CiAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoMTgwZGVnLCByZ2JhKDE5NywgMjAzLCAyMTEsIDAuMTUpLCByZ2JhKDE5NywgMjAzLCAyMTEsIDAuMDYpKTsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMTk3LCAyMDMsIDIxMSwgMC4zNCk7CiAgICBib3JkZXItcmFkaXVzOiA5OTlweDsKICAgIHBhZGRpbmc6IDVweCAxMXB4OwogICAgdGV4dC1zaGFkb3c6IG5vbmU7CiAgICBib3gtc2hhZG93OiBpbnNldCAwIDFweCAwIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xOCk7Cn0KCi5tanItdmlld2VyLXBsYXllcmJhciB7CiAgICBib3JkZXItcmFkaXVzOiAxOHB4OwogICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgxOTQsIDIwMCwgMjA4LCAwLjE2KTsKICAgIGJhY2tncm91bmQ6CiAgICAgICAgcmFkaWFsLWdyYWRpZW50KGNpcmNsZSBhdCB0b3AgbGVmdCwgcmdiYSg5MCwgMTUwLCAyNTUsIDAuMDgpLCB0cmFuc3BhcmVudCAzNiUpLAogICAgICAgIGxpbmVhci1ncmFkaWVudCgxNjBkZWcsIHJnYmEoMjAsIDI0LCAzMCwgMC45NCksIHJnYmEoMTIsIDE1LCAyMSwgMC45OCkpOwogICAgYm94LXNoYWRvdzoKICAgICAgICBpbnNldCAwIDFweCAwIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wNSksCiAgICAgICAgMCAxNnB4IDM2cHggcmdiYSgwLCAwLCAwLCAwLjIyKTsKICAgIC8qIG92ZXJmbG93IG11c3Qgc3RheSB2aXNpYmxlIHNvIHRoZSBzZWVrIHJ1bGVyIHRpY2tzL2xhYmVscyAodG9wOi0xNnB4IC8gdG9wOi0zNHB4KQogICAgICAgdGhhdCBhcmUgYWJzb2x1dGVseSBwb3NpdGlvbmVkIGFib3ZlIHRoZSBzZWVrIGJhciBhcmUgbm90IGNsaXBwZWQuICovCiAgICBvdmVyZmxvdzogdmlzaWJsZTsKfQoKLm1qci12aWV3ZXItdG9vbHMgewogICAgYWxpZ24taXRlbXM6IHN0YXJ0OwogICAganVzdGlmeS1jb250ZW50OiBzdHJldGNoOwogICAgZ2FwOiA4cHg7Cn0KCi5tanItdmlld2VyLWhlYWRlciB7CiAgICBwb3NpdGlvbjogcmVsYXRpdmU7Cn0KCi5tanItdmlld2VyLWhlYWRlcjo6YWZ0ZXIgewogICAgY29udGVudDogIiI7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICBsZWZ0OiAxOHB4OwogICAgcmlnaHQ6IDE4cHg7CiAgICB0b3A6IDQ0cHg7CiAgICBoZWlnaHQ6IDFweDsKICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCg5MGRlZywgdHJhbnNwYXJlbnQsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wOCksIHRyYW5zcGFyZW50KTsKICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgb3BhY2l0eTogMC43Owp9CgoubWpyLXZpZXdlci1oZWFkZXItbWV0YSB7CiAgICBtaW4taGVpZ2h0OiAzMHB4OwogICAgcGFkZGluZzogNHB4IDhweDsKICAgIGJvcmRlci1yYWRpdXM6IDEwcHg7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDM1KTsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wNik7Cn0KCi5tanItdmlld2VyLWhlYWRlci10b3AgewogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgIGdhcDogMTBweDsKICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgIHBhZGRpbmctcmlnaHQ6IDg0cHg7CiAgICBwYWRkaW5nLWxlZnQ6IDEycHg7Cn0KCi5tanItdmlld2VyLWhlYWRlci1hcmVhLS1sZWZ0IHsKICAgIGRpc3BsYXk6IG5vbmU7CiAgICBmbGV4OiAxIDEgMDsKICAgIG1pbi13aWR0aDogMDsKICAgIG92ZXJmbG93OiBoaWRkZW47Cn0KCi5tanItdmlld2VyLWhlYWRlci1hcmVhLS1jZW50ZXIgewogICAgbWluLXdpZHRoOiAwOwogICAgZmxleDogMSAxIGF1dG87Cn0KCi5tanItdmlld2VyLWhlYWRlci1hcmVhLS1yaWdodCB7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtZW5kOwogICAgZmxleDogMSAxIDA7CiAgICBtaW4td2lkdGg6IDA7CiAgICBvdmVyZmxvdzogaGlkZGVuOwp9CgoubWpyLXZpZXdlci10aXRsZS13cmFwIHsKICAgIHdpZHRoOiBhdXRvOwogICAgbWluLXdpZHRoOiAwOwogICAgbWF4LXdpZHRoOiBtaW4oMTAwJSwgY2FsYygxMDB2dyAtIDIyMHB4KSk7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgZ2FwOiAxMnB4Owp9CgoubWpyLXZpZXdlci10aXRsZS1saW5lIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICBnYXA6IDZweDsKICAgIG1pbi13aWR0aDogMDsKICAgIGZsZXgtd3JhcDogbm93cmFwOwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKfQoKLm1qci12aWV3ZXItZmlsZW5hbWUgewogICAgZm9udC1zaXplOiAxM3B4OwogICAgZm9udC13ZWlnaHQ6IDYwMDsKICAgIGxldHRlci1zcGFjaW5nOiAwLjAxZW07CiAgICBkaXNwbGF5OiBibG9jazsKICAgIG1hcmdpbjogMCBhdXRvOwogICAgdGV4dC1hbGlnbjogY2VudGVyOwp9CgoubWpyLXZpZXdlci1iYWRnZXMgewogICAgZ2FwOiA0cHg7Cn0KCi5tanItdmlld2VyLXRpdGxlLWxpbmUgLm1qci12aWV3ZXItYmFkZ2VzIHsKICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgZmxleC13cmFwOiBub3dyYXA7CiAgICBtaW4td2lkdGg6IDA7Cn0KCi5tanItdmlld2VyLWhlYWRlci1tZXRhLS1sZWZ0IHsKICAgIGp1c3RpZnktY29udGVudDogZmxleC1zdGFydDsKICAgIHdpZHRoOiBmaXQtY29udGVudDsKICAgIG1heC13aWR0aDogMTAwJTsKfQoKLm1qci12aWV3ZXItaGVhZGVyLW1ldGEtLWxlZnQ6ZW1wdHkgewogICAgZGlzcGxheTogbm9uZTsKfQoKLm1qci12aWV3ZXItaGVhZGVyLW1ldGEtLXJpZ2h0IHsKICAgIGp1c3RpZnktc2VsZjogZW5kOwogICAgd2lkdGg6IGZpdC1jb250ZW50OwogICAgbWF4LXdpZHRoOiAxMDAlOwp9CgoubWpyLXZpZXdlci1tb2RlLWJ1dHRvbnMgewogICAgZmxleDogMCAwIGF1dG87CiAgICBwYWRkaW5nOiAzcHg7CiAgICBib3JkZXItcmFkaXVzOiA5OTlweDsKICAgIGJhY2tncm91bmQ6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wNCk7CiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDgpOwogICAgYm94LXNoYWRvdzogaW5zZXQgMCAxcHggMCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDQpOwp9CgoubWpyLXZpZXdlci10b29scy1kZWNrIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBmbGV4LXdyYXA6IG5vd3JhcDsKICAgIGdhcDogOHB4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIG1pbi13aWR0aDogMDsKICAgIG92ZXJmbG93LXg6IGF1dG87CiAgICBvdmVyZmxvdy15OiBoaWRkZW47CiAgICBzY3JvbGxiYXItd2lkdGg6IHRoaW47Cn0KCi5tanItdmlld2VyLXRvb2xzLXBhbmVsIHsKICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgIG1pbi13aWR0aDogYXV0bzsKICAgIG1pbi1oZWlnaHQ6IDA7CiAgICBib3JkZXItcmFkaXVzOiAxMHB4OwogICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA4KTsKICAgIGJhY2tncm91bmQ6CiAgICAgICAgbGluZWFyLWdyYWRpZW50KDE4MGRlZywgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA1KSwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjAyKSksCiAgICAgICAgcmdiYSgxMCwgMTIsIDE2LCAwLjI0KTsKICAgIGJveC1zaGFkb3c6CiAgICAgICAgaW5zZXQgMCAxcHggMCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDQpLAogICAgICAgIDAgNnB4IDE2cHggcmdiYSgwLCAwLCAwLCAwLjEyKTsKICAgIHBhZGRpbmc6IDVweCA2cHg7CiAgICBmbGV4OiAwIDAgYXV0bzsKfQoKLm1qci12aWV3ZXItdG9vbHMtcGFuZWw6OmJlZm9yZSB7CiAgICBjb250ZW50OiAiIjsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIGluc2V0OiAwIDAgYXV0byAwOwogICAgaGVpZ2h0OiAxcHg7CiAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoOTBkZWcsIHRyYW5zcGFyZW50LCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTYpLCB0cmFuc3BhcmVudCk7CiAgICBvcGFjaXR5OiAwLjc7CiAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKfQoKLm1qci12aWV3ZXItdG9vbHMtcGFuZWwtaGVhZCB7CiAgICBkaXNwbGF5OiBub25lOwp9CgoubWpyLXZpZXdlci10b29scy1wYW5lbC1oZWFkaW5nIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgZ2FwOiAxcHg7CiAgICBtaW4td2lkdGg6IDA7Cn0KCi5tanItdmlld2VyLXRvb2xzLXBhbmVsLWV5ZWJyb3cgewogICAgZm9udC1zaXplOiA5cHg7CiAgICBmb250LXdlaWdodDogNzAwOwogICAgbGV0dGVyLXNwYWNpbmc6IDAuMTRlbTsKICAgIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjQ2KTsKfQoKLm1qci12aWV3ZXItdG9vbHMtcGFuZWwtdGl0bGUgewogICAgZm9udC1zaXplOiAxMnB4OwogICAgZm9udC13ZWlnaHQ6IDYwMDsKICAgIGxldHRlci1zcGFjaW5nOiAwLjAxZW07CiAgICBjb2xvcjogcmdiYSgyNDgsIDI1MCwgMjUyLCAwLjk2KTsKfQoKLm1qci12aWV3ZXItdG9vbHMtcGFuZWwtYm9keSB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGZsZXgtd3JhcDogbm93cmFwOwogICAgZ2FwOiA2cHg7CiAgICBtaW4td2lkdGg6IDA7Cn0KCi5tanItdmlld2VyLXRvb2xzLXBhbmVsW2RhdGEtcGFuZWw9ImdyYWRlIl0gLm1qci12aWV3ZXItdG9vbHMtcGFuZWwtYm9keSB7CiAgICBkaXNwbGF5OiBmbGV4Owp9CgoubWpyLXZpZXdlci10b29scy1wYW5lbFtkYXRhLXBhbmVsPSJvdmVybGF5Il0gLm1qci12aWV3ZXItdG9vbHMtcGFuZWwtYm9keSB7CiAgICBkaXNwbGF5OiBmbGV4Owp9CgoubWpyLXZpZXdlci10b29scy1wYW5lbFtkYXRhLXBhbmVsPSJpbnNwZWN0Il0gLm1qci12aWV3ZXItdG9vbHMtcGFuZWwtYm9keSwKLm1qci12aWV3ZXItdG9vbHMtcGFuZWxbZGF0YS1wYW5lbD0iYWN0aW9ucyJdIC5tanItdmlld2VyLXRvb2xzLXBhbmVsLWJvZHksCi5tanItdmlld2VyLXRvb2xzLXBhbmVsW2RhdGEtcGFuZWw9ImluZm8iXSAubWpyLXZpZXdlci10b29scy1wYW5lbC1ib2R5IHsKICAgIGRpc3BsYXk6IGZsZXg7Cn0KCi5tanItdmlld2VyLXRvb2xzLWdyb3VwIHsKICAgIHdpZHRoOiBhdXRvOwogICAgbWluLWhlaWdodDogMzBweDsKICAgIHBhZGRpbmc6IDVweCA3cHg7CiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94OwogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtc3RhcnQ7CiAgICBnYXA6IDZweDsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMTk2LCAyMDIsIDIxMCwgMC4xMik7CiAgICBib3JkZXItcmFkaXVzOiAxMHB4OwogICAgYmFja2dyb3VuZDoKICAgICAgICBsaW5lYXItZ3JhZGllbnQoMTgwZGVnLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDM1KSwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjAyKSksCiAgICAgICAgcmdiYSgxMCwgMTIsIDE2LCAwLjE4KTsKICAgIGJveC1zaGFkb3c6IGluc2V0IDAgMXB4IDAgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjAzKTsKICAgIG1pbi13aWR0aDogZml0LWNvbnRlbnQ7Cn0KCi5tanItdmlld2VyLXRvb2xzLWdyb3VwLWxhYmVsIHsKICAgIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNzUpOwogICAgbGV0dGVyLXNwYWNpbmc6IDAuMTVweDsKICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIG1hcmdpbi1yaWdodDogNXB4OwogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgIGZvbnQtc2l6ZTogMTBweDsKfQoKLm1qci12aWV3ZXItdG9vbHMtZ3JvdXBbc3R5bGUqPSItLW1qci1ncm91cC1hY2NlbnQiXSAubWpyLXZpZXdlci10b29scy1ncm91cC1sYWJlbCB7CiAgICBjb2xvcjogcmdiYSh2YXIoLS1tanItZ3JvdXAtYWNjZW50KSwgMC45KTsKfQoKLm1qci12aWV3ZXItdG9vbHMtZ3JvdXBbc3R5bGUqPSItLW1qci1ncm91cC1hY2NlbnQiXSB7CiAgICBib3JkZXItY29sb3I6IHJnYmEodmFyKC0tbWpyLWdyb3VwLWFjY2VudCksIDAuMzUpOwp9CgoubWpyLXZpZXdlci10b29scy1ncm91cFtkYXRhLWdyb3VwPSJjaGFubmVsIl0gLm1qci12aWV3ZXItdG9vbHMtZ3JvdXAtbGFiZWwsCi5tanItdmlld2VyLXRvb2xzLWdyb3VwW2RhdGEtZ3JvdXA9ImFuYWx5c2lzIl0gLm1qci12aWV3ZXItdG9vbHMtZ3JvdXAtbGFiZWwsCi5tanItdmlld2VyLXRvb2xzLWdyb3VwW2RhdGEtZ3JvdXA9Im92ZXJsYXktZ3VpZGVzIl0gLm1qci12aWV3ZXItdG9vbHMtZ3JvdXAtbGFiZWwsCi5tanItdmlld2VyLXRvb2xzLWdyb3VwW2RhdGEtZ3JvdXA9Im92ZXJsYXktaW5zcGVjdCJdIC5tanItdmlld2VyLXRvb2xzLWdyb3VwLWxhYmVsIHsKICAgIG1pbi13aWR0aDogNDJweDsKfQoKLm1qci12aWV3ZXItdG9vbHMtcGFuZWxbZGF0YS1wYW5lbD0ib3ZlcmxheSJdIC5tanItdmlld2VyLXRvb2xzLWdyb3VwW2RhdGEtZ3JvdXA9Im92ZXJsYXktZ3VpZGVzIl0gewogICAgZmxleDogMCAwIGF1dG87Cn0KCi5tanItdmlld2VyLXRvb2xzLWdyb3VwW2RhdGEtZ3JvdXA9Im92ZXJsYXktZ3VpZGVzIl0sCi5tanItdmlld2VyLXRvb2xzLWdyb3VwW2RhdGEtZ3JvdXA9Im92ZXJsYXktaW5zcGVjdCJdIHsKICAgIGZsZXgtd3JhcDogd3JhcDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtc3RhcnQ7CiAgICBhbGlnbi1jb250ZW50OiBjZW50ZXI7Cn0KCi5tanItdmlld2VyLXRvb2xzLWdyb3VwW2RhdGEtZ3JvdXA9ImNoYW5uZWwiXSwKLm1qci12aWV3ZXItdG9vbHMtZ3JvdXBbZGF0YS1ncm91cD0iZXhwb3N1cmUiXSwKLm1qci12aWV3ZXItdG9vbHMtZ3JvdXBbZGF0YS1ncm91cD0iZ2FtbWEiXSwKLm1qci12aWV3ZXItdG9vbHMtZ3JvdXBbZGF0YS1ncm91cD0iYW5hbHlzaXMiXSwKLm1qci12aWV3ZXItdG9vbHMtZ3JvdXBbZGF0YS1ncm91cD0iY29tcGFyZSJdLAoubWpyLXZpZXdlci10b29scy1ncm91cFtkYXRhLWdyb3VwPSJhdWRpby12aXoiXSB7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47Cn0KCi5tanItdmlld2VyLXRvb2xzLWFjdGlvbnMsCi5tanItdmlld2VyLXRvb2xzLW1ldGEgewogICAgd2lkdGg6IGF1dG87CiAgICBtaW4taGVpZ2h0OiAzMHB4OwogICAgYm94LXNpemluZzogYm9yZGVyLWJveDsKICAgIHBhZGRpbmc6IDVweCA3cHg7CiAgICBib3JkZXItcmFkaXVzOiAxMHB4OwogICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA2KTsKICAgIGJhY2tncm91bmQ6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wMyk7Cn0KCi5tanItdmlld2VyLXRvb2xzLWFjdGlvbnMgewogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtc3RhcnQ7CiAgICBnYXA6IDZweDsKICAgIGZsZXgtd3JhcDogd3JhcDsKICAgIG1pbi13aWR0aDogMDsKfQoKLm1qci12aWV3ZXItdG9vbHMtbWV0YSB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsKICAgIGdhcDogNnB4OwogICAgZmxleC13cmFwOiB3cmFwOwogICAgbWluLXdpZHRoOiAwOwp9CgoubWpyLXZpZXdlci10b29scy1hY3Rpb24tLXByaW1hcnkgewogICAgbWFyZ2luLWxlZnQ6IDA7Cn0KCi5tanItdmlld2VyLXRvb2xzLWFjdGlvbiArIC5tanItdmlld2VyLXRvb2xzLWFjdGlvbiB7CiAgICBtYXJnaW4tbGVmdDogNHB4Owp9CgoubWpyLXZpZXdlci10b29scy1zZWxlY3QgewogICAgbWluLWhlaWdodDogMjRweDsKfQoKLm1qci12aWV3ZXItdG9vbHMtcmFuZ2UtaW5wdXQgewogICAgd2lkdGg6IDkycHggIWltcG9ydGFudDsKfQoKLm1qci12aWV3ZXItdG9vbHMtcmFuZ2Ugc3BhbiB7CiAgICBmb250LXNpemU6IDExcHg7Cn0KCkBtZWRpYSAobWF4LXdpZHRoOiAxNDgwcHgpIHsKICAgIC5tanItdmlld2VyLXRvb2xzLWRlY2sgewogICAgICAgIGdhcDogNnB4OwogICAgfQp9CgpAbWVkaWEgKG1heC13aWR0aDogMTIyMHB4KSB7CiAgICAubWpyLXZpZXdlci1oZWFkZXItdG9wIHsKICAgICAgICBmbGV4LXdyYXA6IHdyYXA7CiAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICAgICAgcGFkZGluZy1yaWdodDogODRweDsKICAgICAgICBwYWRkaW5nLWxlZnQ6IDA7CiAgICB9CgogICAgLm1qci12aWV3ZXItaGVhZGVyLWFyZWEtLWNlbnRlciwKICAgIC5tanItdmlld2VyLWhlYWRlci1hcmVhLS1yaWdodCB7CiAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICB9CgogICAgLm1qci12aWV3ZXItaGVhZGVyLWFyZWEtLWNlbnRlciB7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgZmxleDogMSAxIDEwMCU7CiAgICB9CgogICAgLm1qci12aWV3ZXItaGVhZGVyLWFyZWEtLXJpZ2h0IHsKICAgICAgICBwb3NpdGlvbjogc3RhdGljOwogICAgICAgIHRyYW5zZm9ybTogbm9uZTsKICAgICAgICBtYXgtd2lkdGg6IDEwMCU7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgZmxleDogMSAxIDEwMCU7CiAgICB9CgogICAgLm1qci12aWV3ZXItaGVhZGVyLW1ldGEtLXJpZ2h0IHsKICAgICAgICBqdXN0aWZ5LXNlbGY6IGNlbnRlcjsKICAgIH0KCiAgICAubWpyLXZpZXdlci10b29scy1kZWNrIHsKICAgICAgICBmbGV4LXdyYXA6IHdyYXA7CiAgICAgICAgb3ZlcmZsb3cteDogdmlzaWJsZTsKICAgIH0KCiAgICAubWpyLXZpZXdlci10b29scy1wYW5lbCwKICAgIC5tanItdmlld2VyLXRvb2xzLWFjdGlvbnMsCiAgICAubWpyLXZpZXdlci10b29scy1tZXRhLAogICAgLm1qci12aWV3ZXItdG9vbHMtcGFuZWwtYm9keSB7CiAgICAgICAgZmxleC13cmFwOiB3cmFwOwogICAgfQoKICAgIC5tanItdmlld2VyLXRvb2xzLW1ldGEgewogICAgICAgIGp1c3RpZnktY29udGVudDogZmxleC1zdGFydDsKICAgIH0KfQoKLm1qci12aWV3ZXItdG9vbHMtZ3JvdXBbZGF0YS1ncm91cD0iY29tcGFyZSJdW2RhdGEtYWN0aXZlPSIxIl0gewogICAgYmFja2dyb3VuZDogcmdiYSh2YXIoLS1tanItZ3JvdXAtYWNjZW50KSwgMC4xKTsKICAgIGJvcmRlci1sZWZ0LWNvbG9yOiByZ2JhKHZhcigtLW1qci1ncm91cC1hY2NlbnQpLCAwLjYpOwogICAgYm9yZGVyLXJhZGl1czogMTBweDsKICAgIHBhZGRpbmc6IDZweCAxMHB4OwogICAgYm94LXNoYWRvdzogaW5zZXQgMCAwIDAgMXB4IHJnYmEodmFyKC0tbWpyLWdyb3VwLWFjY2VudCksIDAuMjIpOwp9CgoubWpyLXZpZXdlci10b29scy1ncm91cFtkYXRhLWdyb3VwPSJjb21wYXJlIl1bZGF0YS1hY3RpdmU9IjEiXSAubWpyLXZpZXdlci10b29scy1zZWxlY3QgewogICAgYm9yZGVyLWNvbG9yOiByZ2JhKHZhcigtLW1qci1ncm91cC1hY2NlbnQpLCAwLjYpOwogICAgYm94LXNoYWRvdzogMCAwIDAgMnB4IHJnYmEodmFyKC0tbWpyLWdyb3VwLWFjY2VudCksIDAuMTgpOwp9CgoubWpyLXZpZXdlci10b29scy1zZWxlY3Q6Zm9jdXMgewogICAgb3V0bGluZTogbm9uZTsKICAgIGJveC1zaGFkb3c6IDAgMCAwIDJweCByZ2JhKDY0LCAxNjAsIDI1NSwgMC4yMik7Cn0KCi8qIE5hdGl2ZSBkcm9wZG93bnM6IGhpbnQgZGFyayBVSSBhbmQgc3R5bGUgb3B0aW9ucyB3aGVuIHRoZSBicm93c2VyIGFsbG93cyBpdC4gKi8KLm1qci12aWV3ZXItaGVhZGVyIHsKICAgIGNvbG9yLXNjaGVtZTogZGFyazsKfQoKLm1qci12aWV3ZXItdG9vbHMtc2VsZWN0IHsKICAgIG1pbi1oZWlnaHQ6IDI0cHg7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIDAuNDYpICFpbXBvcnRhbnQ7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjkyKSAhaW1wb3J0YW50OwogICAgYm9yZGVyLWNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTQpICFpbXBvcnRhbnQ7CiAgICBib3JkZXItcmFkaXVzOiA4cHggIWltcG9ydGFudDsKfQoKLm1qci12aWV3ZXItdG9vbHMtc2VsZWN0IG9wdGlvbiB7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1jb21meS1tZW51LWJnLCAjMmEyYTJhKTsKICAgIGNvbG9yOiB2YXIoLS1jb250ZW50LWZnLCB2YXIoLS1pbnB1dC10ZXh0LCAjZGRkKSk7Cn0KCi5tanItdmlld2VyLXRvb2xzLXJhbmdlLWlucHV0OmZvY3VzIHsKICAgIG91dGxpbmU6IG5vbmU7Cn0KCi5tanItdmlld2VyLXRvb2wtYnRuLS1yZXNldCB7CiAgICBib3JkZXItY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4yMikgIWltcG9ydGFudDsKfQoKLm1qci12aWV3ZXItdG9vbC1idG4gewogICAgbWluLWhlaWdodDogMjRweCAhaW1wb3J0YW50OwogICAgYm9yZGVyLXJhZGl1czogOHB4ICFpbXBvcnRhbnQ7CiAgICBib3JkZXItd2lkdGg6IDFweCAhaW1wb3J0YW50OwogICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KAogICAgICAgIDE4MGRlZywKICAgICAgICByZ2JhKDIxMCwgMjE0LCAyMjAsIDAuMDc1KSwKICAgICAgICByZ2JhKDIxMCwgMjE0LCAyMjAsIDAuMDI1KQogICAgKSAhaW1wb3J0YW50OwogICAgYm9yZGVyLWNvbG9yOiByZ2JhKDE5NiwgMjAyLCAyMTAsIDAuMTYpICFpbXBvcnRhbnQ7CiAgICBib3gtc2hhZG93OiBpbnNldCAwIDFweCAwIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wNSk7CiAgICBmb250LXNpemU6IDExcHggIWltcG9ydGFudDsKICAgIHBhZGRpbmc6IDAgOHB4ICFpbXBvcnRhbnQ7Cn0KCi5tanItdmlld2VyLXRvb2wtYnRuOmhvdmVyIHsKICAgIGJvcmRlci1jb2xvcjogcmdiYSgyMjAsIDIyNCwgMjMwLCAwLjI0KSAhaW1wb3J0YW50OwogICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KAogICAgICAgIDE4MGRlZywKICAgICAgICByZ2JhKDIyMCwgMjI0LCAyMzAsIDAuMSksCiAgICAgICAgcmdiYSgyMjAsIDIyNCwgMjMwLCAwLjAzNSkKICAgICkgIWltcG9ydGFudDsKfQoKLm1qci12aWV3ZXItdG9vbHMtZ3JvdXBbZGF0YS1ncm91cD0iYW5hbHlzaXMiXSAubWpyLXZpZXdlci10b29sLWJ0bltkYXRhLWFjdGl2ZT0iMSJdIHsKICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgKICAgICAgICAxODBkZWcsCiAgICAgICAgcmdiYSgyNTUsIDE2NiwgOTIsIDAuMjIpLAogICAgICAgIHJnYmEoMjU1LCAxMTYsIDY0LCAwLjA4KQogICAgKSAhaW1wb3J0YW50OwogICAgYm9yZGVyLWNvbG9yOiByZ2JhKDI1NSwgMTYwLCA5MiwgMC4zNCkgIWltcG9ydGFudDsKICAgIGNvbG9yOiByZ2JhKDI1NSwgMjM2LCAyMjQsIDAuOTYpICFpbXBvcnRhbnQ7Cn0KCi5tanItdmlld2VyLXRvb2xzLWdyb3VwW2RhdGEtZ3JvdXA9ImFuYWx5c2lzIl0gLm1qci12aWV3ZXItdG9vbC1idG5bZGF0YS1hY3RpdmU9IjEiXTpob3ZlciB7CiAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoCiAgICAgICAgMTgwZGVnLAogICAgICAgIHJnYmEoMjU1LCAxODAsIDEwOCwgMC4yOCksCiAgICAgICAgcmdiYSgyNTUsIDEyOCwgNzIsIDAuMTQpCiAgICApICFpbXBvcnRhbnQ7CiAgICBib3JkZXItY29sb3I6IHJnYmEoMjU1LCAxODQsIDExNiwgMC40NikgIWltcG9ydGFudDsKfQoKLm1qci12aWV3ZXItdG9vbHMtZ3JvdXBbZGF0YS1ncm91cD0ib3ZlcmxheS1ndWlkZXMiXSAubWpyLXZpZXdlci10b29sLWJ0bltkYXRhLWFjdGl2ZT0iMSJdIHsKICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgKICAgICAgICAxODBkZWcsCiAgICAgICAgcmdiYSg5MiwgMjE5LCAxODYsIDAuMjIpLAogICAgICAgIHJnYmEoNDQsIDE3MCwgMTQ0LCAwLjA4KQogICAgKSAhaW1wb3J0YW50OwogICAgYm9yZGVyLWNvbG9yOiByZ2JhKDkyLCAyMTksIDE4NiwgMC4zNCkgIWltcG9ydGFudDsKICAgIGNvbG9yOiByZ2JhKDIyNCwgMjU1LCAyNDgsIDAuOTYpICFpbXBvcnRhbnQ7Cn0KCi5tanItdmlld2VyLXRvb2xzLWdyb3VwW2RhdGEtZ3JvdXA9Im92ZXJsYXktZ3VpZGVzIl0gLm1qci12aWV3ZXItdG9vbC1idG5bZGF0YS1hY3RpdmU9IjEiXTpob3ZlciB7CiAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoCiAgICAgICAgMTgwZGVnLAogICAgICAgIHJnYmEoMTAyLCAyMzAsIDE5NiwgMC4yOCksCiAgICAgICAgcmdiYSg1MiwgMTgyLCAxNTYsIDAuMTQpCiAgICApICFpbXBvcnRhbnQ7CiAgICBib3JkZXItY29sb3I6IHJnYmEoMTEwLCAyMzYsIDIwMiwgMC40NikgIWltcG9ydGFudDsKfQoKLm1qci12aWV3ZXItdG9vbHMtZ3JvdXBbZGF0YS1ncm91cD0ib3ZlcmxheS1pbnNwZWN0Il0gLm1qci12aWV3ZXItdG9vbC1idG5bZGF0YS1hY3RpdmU9IjEiXSB7CiAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoCiAgICAgICAgMTgwZGVnLAogICAgICAgIHJnYmEoMTI0LCAxNjYsIDI1NSwgMC4yMiksCiAgICAgICAgcmdiYSgxMDksIDg4LCAyMjIsIDAuMDgpCiAgICApICFpbXBvcnRhbnQ7CiAgICBib3JkZXItY29sb3I6IHJnYmEoMTMyLCAxNzAsIDI1NSwgMC4zNikgIWltcG9ydGFudDsKICAgIGNvbG9yOiByZ2JhKDIzNiwgMjQyLCAyNTUsIDAuOTcpICFpbXBvcnRhbnQ7Cn0KCi5tanItdmlld2VyLXRvb2xzLWdyb3VwW2RhdGEtZ3JvdXA9Im92ZXJsYXktaW5zcGVjdCJdIC5tanItdmlld2VyLXRvb2wtYnRuW2RhdGEtYWN0aXZlPSIxIl06aG92ZXIgewogICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KAogICAgICAgIDE4MGRlZywKICAgICAgICByZ2JhKDEzOCwgMTgwLCAyNTUsIDAuMyksCiAgICAgICAgcmdiYSgxMjQsIDEwMCwgMjMyLCAwLjE0KQogICAgKSAhaW1wb3J0YW50OwogICAgYm9yZGVyLWNvbG9yOiByZ2JhKDE0OCwgMTg4LCAyNTUsIDAuNDgpICFpbXBvcnRhbnQ7Cn0KCi5tanItdmlld2VyLXRvb2wtYnRuW2RhdGEtYWN0aXZlPSIxIl0gewogICAgZmlsdGVyOiBzYXR1cmF0ZSgxLjEyKSBicmlnaHRuZXNzKDEuMDQpOwogICAgYm94LXNoYWRvdzoKICAgICAgICBpbnNldCAwIDFweCAwIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xKSwKICAgICAgICAwIDAgMCAxcHggcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA2KSwKICAgICAgICAwIDhweCAxOHB4IHJnYmEoMCwgMCwgMCwgMC4xNikgIWltcG9ydGFudDsKfQoKLm1qci12aWV3ZXItaGVscCB7CiAgICBib3JkZXItcmFkaXVzOiAxNHB4ICFpbXBvcnRhbnQ7CiAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoMTgwZGVnLCByZ2JhKDEzLCAxNywgMjIsIDAuOTYpLCByZ2JhKDgsIDExLCAxNiwgMC45OCkpICFpbXBvcnRhbnQ7CiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTIpICFpbXBvcnRhbnQ7CiAgICBib3gtc2hhZG93OiAwIDE4cHggMzRweCByZ2JhKDAsIDAsIDAsIDAuMzQpICFpbXBvcnRhbnQ7Cn0KCkBtZWRpYSAobWF4LXdpZHRoOiAxMjIwcHgpIHsKICAgIC5tanItdmlld2VyLXRvb2xzIHsKICAgICAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IDFmcjsKICAgIH0KCiAgICAubWpyLXZpZXdlci10b29scy1hY3Rpb25zIHsKICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtc3RhcnQ7CiAgICB9CgogICAgLm1qci12aWV3ZXItaGVhZGVyLXRvcCB7CiAgICAgICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiAxZnI7CiAgICAgICAganVzdGlmeS1pdGVtczogY2VudGVyOwogICAgfQoKICAgIC5tanItdmlld2VyLWhlYWRlci1hcmVhLS1sZWZ0LAogICAgLm1qci12aWV3ZXItaGVhZGVyLWFyZWEtLWNlbnRlciwKICAgIC5tanItdmlld2VyLWhlYWRlci1hcmVhLS1yaWdodCB7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICB9CgogICAgLm1qci12aWV3ZXItaGVhZGVyLW1ldGEtLWxlZnQsCiAgICAubWpyLXZpZXdlci1oZWFkZXItbWV0YS0tcmlnaHQgewogICAgICAgIGp1c3RpZnktc2VsZjogY2VudGVyOwogICAgfQoKICAgIC5tanItdmlld2VyLXRvb2xzLWJvZHkgewogICAgICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogcmVwZWF0KGF1dG8tZml0LCBtaW5tYXgoMjIwcHgsIDFmcikpOwogICAgfQp9CgovKiA9PT09PT09PT09IEN1c3RvbSBWaWRlbyBDb250cm9scyAobm8gbmF0aXZlIGJhcikgPT09PT09PT09PSAqLwoubWpyLXZpZGVvLWhvc3QgewogICAgcG9zaXRpb246IHJlbGF0aXZlOwp9CgoubWpyLXZpZGVvLWNvbnRyb2xzIHsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIGxlZnQ6IDEycHg7CiAgICByaWdodDogMTJweDsKICAgIGJvdHRvbTogMTJweDsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgZ2FwOiA4cHg7CiAgICBwYWRkaW5nOiA4cHggMTBweDsKICAgIGJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgMC42KTsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xNCk7CiAgICBib3JkZXItcmFkaXVzOiAxMHB4OwogICAgYmFja2Ryb3AtZmlsdGVyOiBibHVyKDEwcHgpOwogICAgb3BhY2l0eTogMDsKICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgdHJhbnNpdGlvbjogb3BhY2l0eSAwLjE1cyBlYXNlOwogICAgei1pbmRleDogNTsKfQoKLm1qci12aWRlby1yb3cgewogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBnYXA6IDEwcHg7CiAgICBtaW4td2lkdGg6IDA7Cn0KCi5tanItdmlkZW8tcm93LS10b3AgewogICAgZ2FwOiAxMnB4OwogICAgZGlzcGxheTogZ3JpZDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IGF1dG8gYXV0byAxZnIgYXV0byBhdXRvOwp9CgoubWpyLXZpZGVvLWNvbnRyb2xzLS12aWV3ZXJiYXIgLm1qci12aWRlby1yb3ctLXRvcCB7CiAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IGF1dG8gYXV0byAxZnIgYXV0byBhdXRvOwp9CgoubWpyLXZpZGVvLWNvbnRyb2xzLS1wcmV2aWV3IC5tanItdmlkZW8tcm93LS10b3AgewogICAgZGlzcGxheTogZmxleDsKfQoKLm1qci12aWRlby1yb3ctLWJvdHRvbSB7CiAgICBnYXA6IDhweDsKfQoKLm1qci12aWRlby1ncm91cCB7CiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBnYXA6IDZweDsKICAgIG1pbi13aWR0aDogMDsKICAgIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuODUpOwogICAgZm9udC1zaXplOiAxMnB4OwogICAgdXNlci1zZWxlY3Q6IG5vbmU7Cn0KCi5tanItdmlkZW8tbnVtIHsKICAgIGJhY2tncm91bmQ6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wNik7CiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTgpOwogICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC45NSk7CiAgICBib3JkZXItcmFkaXVzOiA4cHg7CiAgICBwYWRkaW5nOiA1cHggOHB4OwogICAgZm9udC1zaXplOiAxMnB4OwogICAgbGluZS1oZWlnaHQ6IDE7CiAgICBvdXRsaW5lOiBub25lOwp9CgoubWpyLXZpZGVvLW51bTpmb2N1cyB7CiAgICBib3JkZXItY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4zOCk7Cn0KCi5tanItdmlkZW8tbnVtLS1mcHMuaXMtb3ZlcnJpZGRlbiB7CiAgICBib3JkZXItY29sb3I6IHJnYmEoMjQ1LCAxNTgsIDExLCAwLjgyKTsKICAgIGNvbG9yOiAjZmJiZjI0OwogICAgYmFja2dyb3VuZDogcmdiYSgyNDUsIDE1OCwgMTEsIDAuMTQpOwp9CgoubWpyLXZpZGVvLW51bS0tZnBzLmlzLW92ZXJyaWRkZW46Zm9jdXMgewogICAgYm9yZGVyLWNvbG9yOiByZ2JhKDI1MSwgMTkxLCAzNiwgMC45Nik7Cn0KCi5tanItdmlkZW8tbnVtLS1zcGVlZCB7CiAgICBjb2xvci1zY2hlbWU6IGRhcms7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIDAuNjIpOwogICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC45NSk7Cn0KCi5tanItdmlkZW8tbnVtLS1zcGVlZCBvcHRpb24gewogICAgYmFja2dyb3VuZDogdmFyKC0tY29tZnktbWVudS1iZywgIzJhMmEyYSk7CiAgICBjb2xvcjogdmFyKC0tY29udGVudC1mZywgI2RkZCk7Cn0KCi5tanItdmlkZW8tZnJhbWUgewogICAgZm9udC1zaXplOiAxMnB4OwogICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC45KTsKICAgIG1pbi13aWR0aDogNTJweDsKICAgIHRleHQtYWxpZ246IHJpZ2h0OwogICAgdXNlci1zZWxlY3Q6IG5vbmU7Cn0KCi5tanItdmlkZW8tZnJhbWUuaXMtc3RlcCB7CiAgICBjb2xvcjogI2ZmZDI0ZDsKfQoKLm1qci12aWRlby1ib3R0b20gewogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBnYXA6IDhweDsKICAgIG1pbi13aWR0aDogMDsKICAgIGZsZXg6IDE7Cn0KCi5tanItdmlkZW8tYm90dG9tLS1sZWZ0IHsKICAgIGp1c3RpZnktY29udGVudDogZmxleC1zdGFydDsKfQoKLm1qci12aWRlby1ib3R0b20tLXJpZ2h0IHsKICAgIGp1c3RpZnktY29udGVudDogZmxleC1lbmQ7Cn0KCi5tanItdmlkZW8tdHJhbnNwb3J0IHsKICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgZ2FwOiA4cHg7CiAgICBmbGV4OiAwIDAgYXV0bzsKfQoKLyogU2hvdyBjb250cm9scyBvbiBob3Zlci9mb2N1cyAodmlld2VyKS4gKi8KLm1qci12aWRlby1ob3N0OmhvdmVyIC5tanItdmlkZW8tY29udHJvbHMsCi5tanItdmlkZW8tY29udHJvbHM6Zm9jdXMtd2l0aGluIHsKICAgIG9wYWNpdHk6IDE7CiAgICBwb2ludGVyLWV2ZW50czogYXV0bzsKfQoKLyogUHJldmlldzoga2VlcCBjb250cm9scyB2aXNpYmxlIGJlY2F1c2UgdGhlIGFyZWEgaXMgc21hbGwuICovCi5tanItdmlkZW8tY29udHJvbHMtLXByZXZpZXcgewogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgbGVmdDogYXV0bzsKICAgIHJpZ2h0OiAxMHB4OwogICAgdG9wOiBhdXRvOwogICAgYm90dG9tOiAxMHB4OwogICAgb3BhY2l0eTogMTsKICAgIHBvaW50ZXItZXZlbnRzOiBhdXRvOwogICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7CiAgICBib3JkZXI6IG5vbmU7CiAgICBwYWRkaW5nOiAwOwogICAgZGlzcGxheTogYmxvY2s7CiAgICB3aWR0aDogYXV0bzsKICAgIGhlaWdodDogYXV0bzsKICAgIGJhY2tkcm9wLWZpbHRlcjogbm9uZTsKICAgIC13ZWJraXQtYmFja2Ryb3AtZmlsdGVyOiBub25lOwp9CgoubWpyLXZpZGVvLXByZXZpZXctYnRuIHsKICAgIHdpZHRoOiAzOHB4OwogICAgaGVpZ2h0OiAzOHB4OwogICAgYm9yZGVyLXJhZGl1czogOTk5cHg7CiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMjIpOwogICAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjQyKTsKICAgIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuOTIpOwogICAgY3Vyc29yOiBwb2ludGVyOwogICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7Cn0KCi5tanItdmlkZW8tcHJldmlldy1idG46aG92ZXIgewogICAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjUpOwogICAgYm9yZGVyLWNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMjgpOwp9CgoubWpyLXZpZGVvLXByZXZpZXctYnRuIC5waSB7CiAgICBmb250LXNpemU6IDE2cHg7CiAgICBsaW5lLWhlaWdodDogMTsKfQoKLm1qci12aWRlby1idG4gewogICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA4KTsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xOCk7CiAgICBjb2xvcjogI2ZmZjsKICAgIGJvcmRlci1yYWRpdXM6IDhweDsKICAgIHBhZGRpbmc6IDZweCAxMHB4OwogICAgY3Vyc29yOiBwb2ludGVyOwogICAgZm9udC1zaXplOiAxM3B4OwogICAgbGluZS1oZWlnaHQ6IDE7Cn0KCi5tanItdmlkZW8tYnRuOmhvdmVyIHsKICAgIGJhY2tncm91bmQ6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xNCk7Cn0KCi5tanItdmlkZW8tYnRuLmlzLW9uIHsKICAgIGJhY2tncm91bmQ6IHJnYmEoNjQsIDE2MCwgMjU1LCAwLjI1KTsKICAgIGJvcmRlci1jb2xvcjogcmdiYSg2NCwgMTYwLCAyNTUsIDAuNTUpOwp9CgoubWpyLXZpZGVvLWJ0bi0taW4gewogICAgYm9yZGVyLWNvbG9yOiByZ2JhKDcwLCAyNTUsIDEyMCwgMC41NSk7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDcwLCAyNTUsIDEyMCwgMC4xMik7Cn0KCi5tanItdmlkZW8tYnRuLS1pbjpob3ZlciB7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDcwLCAyNTUsIDEyMCwgMC4xOCk7Cn0KCi5tanItdmlkZW8tYnRuLS1vdXQgewogICAgYm9yZGVyLWNvbG9yOiByZ2JhKDI1NSwgNzAsIDcwLCAwLjU1KTsKICAgIGJhY2tncm91bmQ6IHJnYmEoMjU1LCA3MCwgNzAsIDAuMSk7Cn0KCi5tanItdmlkZW8tYnRuLS1vdXQ6aG92ZXIgewogICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDcwLCA3MCwgMC4xNik7Cn0KCi5tanItdmlkZW8tdGltZSB7CiAgICBmb250LXNpemU6IDEycHg7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjkpOwogICAgbWluLXdpZHRoOiA5MnB4OwogICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgdXNlci1zZWxlY3Q6IG5vbmU7Cn0KCi5tanItdmlkZW8tdGltZWdyb3VwIHsKICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogZmxleC1lbmQ7CiAgICBnYXA6IDEwcHg7CiAgICBtaW4td2lkdGg6IDA7Cn0KCi5tanItdmlkZW8tcmFuZ2UtY291bnQgewogICAgZm9udC1zaXplOiAxMnB4OwogICAgY29sb3I6IHJnYmEoNjQsIDE5MCwgMjU1LCAwLjkyKTsKICAgIGJhY2tncm91bmQ6IHJnYmEoNjQsIDE5MCwgMjU1LCAwLjEpOwogICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSg2NCwgMTkwLCAyNTUsIDAuMjUpOwogICAgYm9yZGVyLXJhZGl1czogOTk5cHg7CiAgICBwYWRkaW5nOiAxcHggOHB4OwogICAgbGluZS1oZWlnaHQ6IDE2cHg7CiAgICBmb250LXZhcmlhbnQtbnVtZXJpYzogdGFidWxhci1udW1zOwogICAgdXNlci1zZWxlY3Q6IG5vbmU7Cn0KCi5tanItdmlkZW8tcmFuZ2UgewogICAgYWNjZW50LWNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuOSk7Cn0KCi5tanItdmlkZW8tcmFuZ2UtLXNlZWsgewogICAgZmxleDogMTsKICAgIG1pbi13aWR0aDogODBweDsKICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgIHotaW5kZXg6IDE7CiAgICAvKiBXZSBkcmF3IG91ciBvd24gcGxheWhlYWQvbWFya2VyczsgaGlkZSB0aGUgbmF0aXZlIHRodW1iICJkb3QiLiAqLwogICAgLXdlYmtpdC1hcHBlYXJhbmNlOiBub25lOwogICAgYXBwZWFyYW5jZTogbm9uZTsKfQoKLm1qci12aWRlby1yYW5nZS0tc2Vlazo6LXdlYmtpdC1zbGlkZXItdGh1bWIgewogICAgLXdlYmtpdC1hcHBlYXJhbmNlOiBub25lOwogICAgYXBwZWFyYW5jZTogbm9uZTsKICAgIHdpZHRoOiAwOwogICAgaGVpZ2h0OiAwOwogICAgYm9yZGVyOiAwOwogICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7CiAgICBib3gtc2hhZG93OiBub25lOwp9CgoubWpyLXZpZGVvLXJhbmdlLS1zZWVrOjotbW96LXJhbmdlLXRodW1iIHsKICAgIHdpZHRoOiAwOwogICAgaGVpZ2h0OiAwOwogICAgYm9yZGVyOiAwOwogICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7CiAgICBib3gtc2hhZG93OiBub25lOwp9CgoubWpyLXZpZGVvLXNlZWstd3JhcCB7CiAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICBtaW4td2lkdGg6IDgwcHg7CiAgICBmbGV4OiAxOwogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7Cn0KCi5tanItdmlkZW8tc2Vlay16b25lcyB7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICBsZWZ0OiAwOwogICAgcmlnaHQ6IDA7CiAgICB0b3A6IDUwJTsKICAgIGhlaWdodDogMTBweDsKICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtNTAlKTsKICAgIGJvcmRlci1yYWRpdXM6IDk5OXB4OwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgei1pbmRleDogMjsKfQoKLm1qci12aWRlby1zZWVrLXpvbmUgewogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgdG9wOiAwOwogICAgYm90dG9tOiAwOwp9CgovKiAwLi5JbjogdHJpbW1lZC1vdXQgcmFuZ2UuICovCi5tanItdmlkZW8tc2Vlay16b25lLS1sZWZ0VHJpbSB7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgNzAsIDcwLCAwLjE4KTsKfQoKLyogSW4uLk91dDogc2VsZWN0ZWQgcGxheWJhY2sgcmFuZ2UgaGlnaGxpZ2h0LiAqLwoubWpyLXZpZGVvLXNlZWstem9uZS0tc2VsZWN0ZWQgewogICAgYmFja2dyb3VuZDogcmdiYSg2NCwgMTkwLCAyNTUsIDAuNTUpOwp9CgoubWpyLXZpZGVvLXNlZWstem9uZXMuaXMtZnVsbHJhbmdlIC5tanItdmlkZW8tc2Vlay16b25lLS1zZWxlY3RlZCB7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTIpOwp9CgovKiBPdXQuLkVuZDogc2hvdyBvdXQtb2YtcmFuZ2UgZnJhbWVzIGFzIGEgZGlmZmVyZW50IGNvbG9yLiAqLwoubWpyLXZpZGVvLXNlZWstem9uZS0tcmlnaHRUcmltIHsKICAgIGJhY2tncm91bmQ6IHJnYmEoMjU1LCA3MCwgNzAsIDAuMik7Cn0KCi5tanItdmlkZW8tc2Vlay1vdmVybGF5IHsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIGxlZnQ6IDA7CiAgICByaWdodDogMDsKICAgIHRvcDogNTAlOwogICAgaGVpZ2h0OiAwOwogICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICB6LWluZGV4OiAzOwp9CgoubWpyLXZpZGVvLXNlZWstaGFuZGxlIHsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIHRvcDogNTAlOwogICAgd2lkdGg6IDE2cHg7CiAgICBoZWlnaHQ6IDMycHg7CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtNTAlLCAtNTAlKTsKICAgIGN1cnNvcjogZXctcmVzaXplOwogICAgcG9pbnRlci1ldmVudHM6IGF1dG87CiAgICB0b3VjaC1hY3Rpb246IG5vbmU7CiAgICB1c2VyLXNlbGVjdDogbm9uZTsKICAgIHotaW5kZXg6IDQ7CiAgICBib3JkZXItcmFkaXVzOiA2cHg7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDYpOwogICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE0KTsKICAgIGJveC1zaGFkb3c6IDAgNHB4IDEwcHggcmdiYSgwLCAwLCAwLCAwLjM1KTsKfQoKLm1qci12aWRlby1zZWVrLWhhbmRsZTpob3ZlciB7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMSk7CiAgICBib3JkZXItY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4yNCk7Cn0KCi5tanItdmlkZW8tc2Vlay1oYW5kbGUtLWluOjphZnRlciwKLm1qci12aWRlby1zZWVrLWhhbmRsZS0tb3V0OjphZnRlciB7CiAgICBjb250ZW50OiAiIjsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIGxlZnQ6IDUwJTsKICAgIHRvcDogNTAlOwogICAgd2lkdGg6IDJweDsKICAgIGhlaWdodDogMThweDsKICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUsIC01MCUpOwogICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDcwLCA3MCwgMC45NSk7CiAgICBib3JkZXItcmFkaXVzOiAycHg7Cn0KCi5tanItdmlkZW8tc2Vlay1oYW5kbGUtLWluOjphZnRlciB7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDcwLCAyNTUsIDEyMCwgMC45NSk7Cn0KCi5tanItdmlkZW8tc2Vlay1oYW5kbGUtLWluOjpiZWZvcmUsCi5tanItdmlkZW8tc2Vlay1oYW5kbGUtLW91dDo6YmVmb3JlIHsKICAgIGNvbnRlbnQ6ICIiOwogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgbGVmdDogNTAlOwogICAgd2lkdGg6IDA7CiAgICBoZWlnaHQ6IDA7CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLTUwJSk7Cn0KCi5tanItdmlkZW8tc2Vlay1oYW5kbGUtLWluOjpiZWZvcmUgewogICAgdG9wOiA0cHg7CiAgICBib3JkZXItbGVmdDogNXB4IHNvbGlkIHRyYW5zcGFyZW50OwogICAgYm9yZGVyLXJpZ2h0OiA1cHggc29saWQgdHJhbnNwYXJlbnQ7CiAgICBib3JkZXItYm90dG9tOiA2cHggc29saWQgcmdiYSg3MCwgMjU1LCAxMjAsIDAuOTUpOwp9CgoubWpyLXZpZGVvLXNlZWstaGFuZGxlLS1vdXQ6OmJlZm9yZSB7CiAgICBib3R0b206IDRweDsKICAgIGJvcmRlci1sZWZ0OiA1cHggc29saWQgdHJhbnNwYXJlbnQ7CiAgICBib3JkZXItcmlnaHQ6IDVweCBzb2xpZCB0cmFuc3BhcmVudDsKICAgIGJvcmRlci10b3A6IDZweCBzb2xpZCByZ2JhKDI1NSwgNzAsIDcwLCAwLjk1KTsKfQoKLm1qci12aWRlby1zZWVrLXRpY2tzIHsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIGxlZnQ6IDA7CiAgICByaWdodDogMDsKICAgIHRvcDogLTE2cHg7CiAgICBoZWlnaHQ6IDEycHg7CiAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEpOwogICAgb3BhY2l0eTogMC45Owp9CgoubWpyLXZpZGVvLXNlZWstbGFiZWxzIHsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIGxlZnQ6IDA7CiAgICByaWdodDogMDsKICAgIHRvcDogLTM0cHg7CiAgICBoZWlnaHQ6IDE0cHg7CiAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgIGZvbnQtc2l6ZTogMTBweDsKICAgIGxpbmUtaGVpZ2h0OiAxNHB4OwogICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC43Mik7CiAgICBmb250LXZhcmlhbnQtbnVtZXJpYzogdGFidWxhci1udW1zOwogICAgdGV4dC1zaGFkb3c6IDAgMXB4IDAgcmdiYSgwLCAwLCAwLCAwLjU1KTsKfQoKLm1qci12aWRlby1zZWVrLWxhYmVsIHsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgtNTAlKTsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7Cn0KCi5tanItdmlkZW8tc2Vlay1wbGF5aGVhZC1sYWJlbCB7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICB0b3A6IDEycHg7CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLTUwJSk7CiAgICBwYWRkaW5nOiAxcHggNnB4OwogICAgYm9yZGVyLXJhZGl1czogOTk5cHg7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIDAuNTUpOwogICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE0KTsKICAgIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuOTIpOwogICAgZm9udC1zaXplOiAxMHB4OwogICAgbGluZS1oZWlnaHQ6IDE0cHg7CiAgICBmb250LXZhcmlhbnQtbnVtZXJpYzogdGFidWxhci1udW1zOwogICAgcG9pbnRlci1ldmVudHM6IG5vbmU7Cn0KCi5tanItdmlkZW8tc2Vlay1tYXJrIHsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIHRvcDogLTEwcHg7CiAgICB3aWR0aDogMTRweDsKICAgIGhlaWdodDogMjBweDsKICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50OwogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKC01MCUpOwogICAgY3Vyc29yOiBldy1yZXNpemU7CiAgICBwb2ludGVyLWV2ZW50czogYXV0bzsKICAgIHRvdWNoLWFjdGlvbjogbm9uZTsKICAgIHotaW5kZXg6IDQ7CiAgICAtLW1qci1tYXJrLWNvbG9yOiByZ2JhKDI1NSwgNzAsIDcwLCAwLjk1KTsKfQoKLm1qci12aWRlby1zZWVrLW1hcmstLWluIHsKICAgIC0tbWpyLW1hcmstY29sb3I6IHJnYmEoNzAsIDI1NSwgMTIwLCAwLjk1KTsKfQoKLm1qci12aWRlby1zZWVrLW1hcms6OmJlZm9yZSB7CiAgICBjb250ZW50OiAiIjsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIGxlZnQ6IDUwJTsKICAgIHRvcDogMDsKICAgIGJvdHRvbTogMDsKICAgIHdpZHRoOiAycHg7CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLTUwJSk7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1tanItbWFyay1jb2xvcik7CiAgICBib3JkZXItcmFkaXVzOiAycHg7CiAgICBib3gtc2hhZG93OiAwIDAgMCAxcHggcmdiYSgwLCAwLCAwLCAwLjM1KTsKfQoKLm1qci12aWRlby1zZWVrLW1hcms6OmFmdGVyIHsKICAgIGNvbnRlbnQ6ICIiOwogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgdG9wOiAtNXB4OwogICAgbGVmdDogNTAlOwogICAgd2lkdGg6IDA7CiAgICBoZWlnaHQ6IDA7CiAgICBib3JkZXItbGVmdDogNXB4IHNvbGlkIHRyYW5zcGFyZW50OwogICAgYm9yZGVyLXJpZ2h0OiA1cHggc29saWQgdHJhbnNwYXJlbnQ7CiAgICBib3JkZXItYm90dG9tOiA2cHggc29saWQgdmFyKC0tbWpyLW1hcmstY29sb3IpOwogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKC01MCUpOwp9CgoubWpyLXZpZGVvLXNlZWstbWFyay0taW46OmFmdGVyIHsKICAgIGJvcmRlci1ib3R0b20tY29sb3I6IHZhcigtLW1qci1tYXJrLWNvbG9yKTsKfQoKLm1qci12aWRlby1zZWVrLW1hcmstLW91dDo6YWZ0ZXIgewogICAgdG9wOiBhdXRvOwogICAgYm90dG9tOiAtNXB4OwogICAgYm9yZGVyLWJvdHRvbTogbm9uZTsKICAgIGJvcmRlci10b3A6IDZweCBzb2xpZCB2YXIoLS1tanItbWFyay1jb2xvcik7Cn0KCi5tanItdmlkZW8tc2Vlay1wbGF5aGVhZCB7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICB0b3A6IC0xMnB4OwogICAgd2lkdGg6IDJweDsKICAgIGhlaWdodDogMjRweDsKICAgIGJhY2tncm91bmQ6IHJnYmEoMjU1LCAyMDAsIDcwLCAwLjk1KTsKICAgIGJveC1zaGFkb3c6IDAgMCAwIDFweCByZ2JhKDAsIDAsIDAsIDAuMzUpOwogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKC0xcHgpOwp9CgoubWpyLXZpZGVvLWNvbnRyb2xzLS12aWV3ZXJiYXIgewogICAgcG9zaXRpb246IHN0YXRpYzsKICAgIGxlZnQ6IGF1dG87CiAgICByaWdodDogYXV0bzsKICAgIGJvdHRvbTogYXV0bzsKICAgIG9wYWNpdHk6IDE7CiAgICBwb2ludGVyLWV2ZW50czogYXV0bzsKICAgIHdpZHRoOiAxMDAlOwogICAgbWF4LXdpZHRoOiBub25lOwogICAgbWFyZ2luOiAwOwogICAgcGFkZGluZzogMTRweDsKICAgIGJvcmRlci1yYWRpdXM6IDE4cHg7CiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDE5NiwgMjAyLCAyMTAsIDAuMTIpOwogICAgYmFja2dyb3VuZDoKICAgICAgICByYWRpYWwtZ3JhZGllbnQoY2lyY2xlIGF0IHRvcCBsZWZ0LCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDMpLCB0cmFuc3BhcmVudCAzNCUpLAogICAgICAgIGxpbmVhci1ncmFkaWVudCgxODBkZWcsIHJnYmEoMTk4LCAyMDMsIDIxMCwgMC4wMjUpLCByZ2JhKDE5OCwgMjAzLCAyMTAsIDAuMDA4KSksCiAgICAgICAgbGluZWFyLWdyYWRpZW50KDE2NWRlZywgcmdiYSgxOCwgMjIsIDI4LCAwLjgyKSwgcmdiYSgxMiwgMTUsIDIxLCAwLjkpKTsKICAgIGJveC1zaGFkb3c6CiAgICAgICAgaW5zZXQgMCAxcHggMCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDQpLAogICAgICAgIDAgMTBweCAzMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCk7CiAgICBiYWNrZHJvcC1maWx0ZXI6IG5vbmU7CiAgICAtd2Via2l0LWJhY2tkcm9wLWZpbHRlcjogbm9uZTsKICAgIGdhcDogMTJweDsKfQoKLm1qci12aWRlby1jb250cm9scy0tdmlld2VyYmFyIC5tanItdmlkZW8tYnRuIHsKICAgIG1pbi1oZWlnaHQ6IDM4cHg7CiAgICBwYWRkaW5nOiA4cHggMTJweDsKICAgIGZvbnQtc2l6ZTogMTJweDsKICAgIGJvcmRlci1yYWRpdXM6IDEycHg7CiAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoMTgwZGVnLCByZ2JhKDIxMCwgMjE0LCAyMjAsIDAuMDcpLCByZ2JhKDIxMCwgMjE0LCAyMjAsIDAuMDIpKTsKICAgIGJvcmRlci1jb2xvcjogcmdiYSgxOTQsIDIwMSwgMjA4LCAwLjE4KTsKICAgIGJvcmRlci13aWR0aDogMXB4OwogICAgYm94LXNoYWRvdzogaW5zZXQgMCAxcHggMCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDYpOwogICAgdHJhbnNpdGlvbjoKICAgICAgICB0cmFuc2Zvcm0gMC4xMnMgZWFzZSwKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yIDAuMTJzIGVhc2UsCiAgICAgICAgYm9yZGVyLWNvbG9yIDAuMTJzIGVhc2UsCiAgICAgICAgYm94LXNoYWRvdyAwLjEycyBlYXNlOwp9CgoubWpyLXZpZGVvLWNvbnRyb2xzLS12aWV3ZXJiYXIgLm1qci12aWRlby1idG46aG92ZXIgewogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC0xcHgpOwogICAgYm9yZGVyLWNvbG9yOiByZ2JhKDIyMCwgMjI0LCAyMzAsIDAuMjYpOwogICAgYm94LXNoYWRvdzoKICAgICAgICBpbnNldCAwIDFweCAwIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wOCksCiAgICAgICAgMCA4cHggMThweCByZ2JhKDAsIDAsIDAsIDAuMTQpOwp9CgoubWpyLXZpZGVvLWNvbnRyb2xzLS12aWV3ZXJiYXIgLm1qci12aWRlby1idG4uaXMtb24gewogICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KDE4MGRlZywgcmdiYSgxMDAsIDE3MCwgMjU1LCAwLjIpLCByZ2JhKDEwMCwgMTcwLCAyNTUsIDAuMDgpKTsKICAgIGJvcmRlci1jb2xvcjogcmdiYSgxMjAsIDE4NiwgMjU1LCAwLjQyKTsKICAgIGJveC1zaGFkb3c6IDAgMCAwIDFweCByZ2JhKDEyMCwgMTg2LCAyNTUsIDAuMTIpIGluc2V0Owp9CgoubWpyLXZpZGVvLWNvbnRyb2xzLS12aWV3ZXJiYXIgLm1qci12aWRlby1idG4gLnBpIHsKICAgIGZvbnQtc2l6ZTogMTRweDsKICAgIGxpbmUtaGVpZ2h0OiAxOwp9CgoubWpyLXZpZGVvLWNvbnRyb2xzLS12aWV3ZXJiYXIgLm1qci12aWRlby1iYXItaGVhZCwKLm1qci12aWRlby1jb250cm9scy0tdmlld2VyYmFyIC5tanItdmlkZW8tYmFyLWFjdGlvbnMgewogICAgZGlzcGxheTogZ3JpZDsKICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogbWlubWF4KDAsIDFmcikgYXV0byBtaW5tYXgoMCwgMWZyKTsKICAgIGdhcDogMTJweDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7Cn0KCi5tanItdmlkZW8tY29udHJvbHMtLXZpZXdlcmJhciAubWpyLXZpZGVvLWJhci1zdGF0dXMsCi5tanItdmlkZW8tY29udHJvbHMtLXZpZXdlcmJhciAubWpyLXZpZGVvLWJhci1zaWRlIHsKICAgIG1pbi13aWR0aDogMDsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiAxMHB4OwogICAgZmxleC13cmFwOiB3cmFwOwp9CgoubWpyLXZpZGVvLWNvbnRyb2xzLS12aWV3ZXJiYXIgLm1qci12aWRlby1iYXItY2VudGVyIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7Cn0KCi5tanItdmlkZW8tY29udHJvbHMtLXZpZXdlcmJhciAubWpyLXZpZGVvLWJhci1oZWFkIHsKICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogbWlubWF4KDAsIDFmcik7Cn0KCi5tanItdmlkZW8tY29udHJvbHMtLXZpZXdlcmJhciAubWpyLXZpZGVvLWJhci1zaWRlLS1yaWdodCB7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtZW5kOwp9CgoubWpyLXZpZGVvLWNvbnRyb2xzLS12aWV3ZXJiYXIgLm1qci12aWRlby1iYXItdGltZWxpbmUgewogICAgZGlzcGxheTogZ3JpZDsKICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogYXV0byBtaW5tYXgoMCwgMWZyKSBhdXRvOwogICAgZ2FwOiAxMnB4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIHBhZGRpbmc6IDEwcHggMTJweDsKICAgIGJvcmRlci1yYWRpdXM6IDE2cHg7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDQpOwogICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA2KTsKfQoKLm1qci12aWRlby1jb250cm9scy0tdmlld2VyYmFyLm1qci12aWRlby1jb250cm9scy0tYXVkaW8gLm1qci12aWRlby1iYXItdGltZWxpbmUgewogICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiBtaW5tYXgoMCwgMWZyKSBhdXRvIGF1dG87Cn0KCi5tanItdmlkZW8tY29udHJvbHMtLXZpZXdlcmJhci5tanItdmlkZW8tY29udHJvbHMtLWF1ZGlvIC5tanItdmlkZW8tc2Vlay13cmFwIHsKICAgIGdyaWQtY29sdW1uOiAxIC8gLTE7CiAgICBncmlkLXJvdzogMTsKICAgIHdpZHRoOiAxMDAlOwp9CgoubWpyLXZpZGVvLWNvbnRyb2xzLS12aWV3ZXJiYXIubWpyLXZpZGVvLWNvbnRyb2xzLS1hdWRpbyAubWpyLXZpZGVvLWdyb3VwLS1pbiwKLm1qci12aWRlby1jb250cm9scy0tdmlld2VyYmFyLm1qci12aWRlby1jb250cm9scy0tYXVkaW8gLm1qci12aWRlby1ncm91cC0tb3V0IHsKICAgIGdyaWQtcm93OiAyOwogICAgd2lkdGg6IG1heC1jb250ZW50OwogICAgbWF4LXdpZHRoOiAxMDAlOwp9CgoubWpyLXZpZGVvLWNvbnRyb2xzLS12aWV3ZXJiYXIgLm1qci12aWRlby1tZWRpYS1iYWRnZSB7CiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgIG1pbi1oZWlnaHQ6IDI4cHg7CiAgICBwYWRkaW5nOiAwIDEwcHg7CiAgICBib3JkZXItcmFkaXVzOiA5OTlweDsKICAgIGJhY2tncm91bmQ6IHJnYmEoNzgsIDIyNCwgMTk2LCAwLjEyKTsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoNzgsIDIyNCwgMTk2LCAwLjIyKTsKICAgIGNvbG9yOiByZ2JhKDIyMCwgMjQ3LCAyNDEsIDAuOTYpOwogICAgZm9udC1zaXplOiAxMXB4OwogICAgZm9udC13ZWlnaHQ6IDYwMDsKICAgIGxldHRlci1zcGFjaW5nOiAwLjA4ZW07CiAgICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOwp9CgoubWpyLXZpZGVvLWNvbnRyb2xzLS12aWV3ZXJiYXIgLm1qci12aWRlby10aW1lZ3JvdXAgewogICAganVzdGlmeS1jb250ZW50OiBmbGV4LXN0YXJ0OwogICAgZ2FwOiA4cHg7CiAgICBwYWRkaW5nOiA1cHggMTBweDsKICAgIGJvcmRlci1yYWRpdXM6IDk5OXB4OwogICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA0NSk7CiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDgpOwp9CgoubWpyLXZpZGVvLWNvbnRyb2xzLS12aWV3ZXJiYXIgLm1qci12aWRlby10aW1lLAoubWpyLXZpZGVvLWNvbnRyb2xzLS12aWV3ZXJiYXIgLm1qci12aWRlby1mcmFtZSB7CiAgICBmb250LXZhcmlhbnQtbnVtZXJpYzogdGFidWxhci1udW1zOwogICAgY29sb3I6IHJnYmEoMjI4LCAyMzAsIDIzNCwgMC45Mik7CiAgICB0ZXh0LXNoYWRvdzogbm9uZTsKfQoKLm1qci12aWRlby1jb250cm9scy0tdmlld2VyYmFyIC5tanItdmlkZW8tZnJhbWUgewogICAgbWluLXdpZHRoOiA5NHB4OwogICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgcGFkZGluZzogNXB4IDEwcHg7CiAgICBib3JkZXItcmFkaXVzOiA5OTlweDsKICAgIGJhY2tncm91bmQ6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wNDUpOwogICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA4KTsKfQoKLm1qci12aWRlby1jb250cm9scy0tdmlld2VyYmFyIC5tanItdmlkZW8tdGltZSB7CiAgICBtaW4td2lkdGg6IGF1dG87CiAgICB0ZXh0LWFsaWduOiBsZWZ0Owp9CgoubWpyLXZpZGVvLWNvbnRyb2xzLS12aWV3ZXJiYXIgLm1qci12aWRlby1yYW5nZS0tc2VlayB7CiAgICBoZWlnaHQ6IDIycHg7CiAgICBhY2NlbnQtY29sb3I6IHJnYmEoMjE0LCAyMTgsIDIyNCwgMC45Mik7Cn0KCi5tanItdmlkZW8tY29udHJvbHMtLXZpZXdlcmJhciAubWpyLXZpZGVvLXJhbmdlLWNvdW50IHsKICAgIGNvbG9yOiByZ2JhKDIyMiwgMjI1LCAyMzAsIDAuOTUpOwogICAgYm9yZGVyLWNvbG9yOiByZ2JhKDE5NCwgMjAxLCAyMDksIDAuMjYpOwogICAgYm9yZGVyLXdpZHRoOiAwLjhweDsKICAgIGJhY2tncm91bmQ6IHJnYmEoMTk0LCAyMDEsIDIwOSwgMC4wOCk7CiAgICB0ZXh0LXNoYWRvdzogbm9uZTsKfQoKLm1qci12aWRlby1jb250cm9scy0tdmlld2VyYmFyIC5tanItdmlkZW8tZ3JvdXAgewogICAgbWluLWhlaWdodDogMzZweDsKICAgIHBhZGRpbmc6IDRweCA4cHg7CiAgICBib3JkZXItcmFkaXVzOiAxMnB4OwogICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjAzNSk7CiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDYpOwp9CgoubWpyLXZpZGVvLWNvbnRyb2xzLS12aWV3ZXJiYXIgLm1qci12aWRlby1ncm91cC0tYWRqdXN0LWxlZnQsCi5tanItdmlkZW8tY29udHJvbHMtLXZpZXdlcmJhciAubWpyLXZpZGVvLWdyb3VwLS1hZGp1c3QtcmlnaHQsCi5tanItdmlkZW8tY29udHJvbHMtLXZpZXdlcmJhciAubWpyLXZpZGVvLWdyb3VwLS1zcGVlZCB7CiAgICBnYXA6IDhweDsKfQoKLm1qci12aWRlby1jb250cm9scy0tdmlld2VyYmFyIC5tanItdmlkZW8tbnVtIHsKICAgIG1pbi1oZWlnaHQ6IDM0cHg7CiAgICBib3JkZXItcmFkaXVzOiAxMHB4OwogICAgYmFja2dyb3VuZDogcmdiYSg5LCAxMiwgMTYsIDAuNTUpOwogICAgYm9yZGVyLWNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMSk7Cn0KCi5tanItdmlkZW8tY29udHJvbHMtLXZpZXdlcmJhciAubWpyLXZpZGVvLXRyYW5zcG9ydCB7CiAgICBnYXA6IDEwcHg7CiAgICBwYWRkaW5nOiA2cHg7CiAgICBib3JkZXItcmFkaXVzOiA5OTlweDsKICAgIGJhY2tncm91bmQ6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wNDUpOwogICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA4KTsKfQoKLm1qci12aWRlby1jb250cm9scy0tdmlld2VyYmFyIC5tanItdmlkZW8tYnRuLS1wbGF5IHsKICAgIG1pbi13aWR0aDogODhweDsKICAgIGZvbnQtd2VpZ2h0OiA2MDA7Cn0KCi5tanItdmlkZW8tY29udHJvbHMtLXZpZXdlcmJhciAubWpyLXZpZGVvLXNlZWstd3JhcCB7CiAgICBtaW4taGVpZ2h0OiA0NHB4Owp9CgoubWpyLXZpZGVvLWNvbnRyb2xzLS12aWV3ZXJiYXIgLm1qci12aWRlby1zZWVrLXpvbmVzIHsKICAgIGhlaWdodDogMTJweDsKfQoKLm1qci12aWRlby1jb250cm9scy0tdmlld2VyYmFyIC5tanItdmlkZW8tc2Vlay1oYW5kbGUgewogICAgd2lkdGg6IDE4cHg7CiAgICBoZWlnaHQ6IDM0cHg7CiAgICBib3JkZXItcmFkaXVzOiA4cHg7Cn0KCi5tanItdmlkZW8tY29udHJvbHMtLXZpZXdlcmJhciAubWpyLXZpZGVvLXZvbHVtZS13cmFwIHsKICAgIHBhZGRpbmc6IDAgNHB4Owp9CgoubWpyLXZpZGVvLXJhbmdlLS12b2x1bWUgewogICAgd2lkdGg6IDkwcHg7Cn0KCkBtZWRpYSAobWF4LXdpZHRoOiA5ODBweCkgewogICAgLm1qci12aWRlby1jb250cm9scy0tdmlld2VyYmFyIC5tanItdmlkZW8tYmFyLWhlYWQsCiAgICAubWpyLXZpZGVvLWNvbnRyb2xzLS12aWV3ZXJiYXIgLm1qci12aWRlby1iYXItYWN0aW9ucywKICAgIC5tanItdmlkZW8tY29udHJvbHMtLXZpZXdlcmJhciAubWpyLXZpZGVvLWJhci10aW1lbGluZSB7CiAgICAgICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiAxZnI7CiAgICB9CgogICAgLm1qci12aWRlby1jb250cm9scy0tdmlld2VyYmFyIC5tanItdmlkZW8tYmFyLWNlbnRlciwKICAgIC5tanItdmlkZW8tY29udHJvbHMtLXZpZXdlcmJhciAubWpyLXZpZGVvLWJhci1zaWRlLS1yaWdodCB7CiAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICB9CgogICAgLm1qci12aWRlby1jb250cm9scy0tdmlld2VyYmFyIC5tanItdmlkZW8tYmFyLXRpbWVsaW5lIHsKICAgICAgICBnYXA6IDEwcHg7CiAgICB9CgogICAgLm1qci12aWRlby1jb250cm9scy0tdmlld2VyYmFyIC5tanItdmlkZW8tdHJhbnNwb3J0IHsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgICAgICBmbGV4LXdyYXA6IHdyYXA7CiAgICAgICAgYm9yZGVyLXJhZGl1czogMTZweDsKICAgIH0KfQoKLyogPT09PT09PT09PSBDb250ZXh0IE1lbnUgQ29tcG9uZW50ID09PT09PT09PT0gKi8KLm1qci1jb250ZXh0LW1lbnUgewogICAgcG9zaXRpb246IGZpeGVkOwogICAgYmFja2dyb3VuZDogdmFyKC0tY29tZnktbWVudS1iZyk7CiAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXItY29sb3IpOwogICAgYm9yZGVyLXJhZGl1czogNnB4OwogICAgYm94LXNoYWRvdzogMCA0cHggMTJweCByZ2JhKDAsIDAsIDAsIDAuMyk7CiAgICBtaW4td2lkdGg6IDIwMHB4OwogICAgLyogQWJvdmUgdmlld2VyIG92ZXJsYXkgKDEwMDAxKSBhbmQgTUZWIGRpYWxvZyAoMTAwMDApICovCiAgICB6LWluZGV4OiAxMDAwMjsKICAgIGRpc3BsYXk6IG5vbmU7CiAgICBwYWRkaW5nOiA0cHggMDsKICAgIGFuaW1hdGlvbjogbWpyLWNvbnRleHQtbWVudS1pbiAwLjE1cyBlYXNlLW91dDsKfQoKLm1qci1jb250ZXh0LW1lbnUsCi5tanItY29udGV4dC1tZW51ICogewogICAgYm94LXNpemluZzogYm9yZGVyLWJveDsKfQoKQGtleWZyYW1lcyBtanItY29udGV4dC1tZW51LWluIHsKICAgIGZyb20gewogICAgICAgIG9wYWNpdHk6IDA7CiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC01cHgpOwogICAgfQogICAgdG8gewogICAgICAgIG9wYWNpdHk6IDE7CiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDApOwogICAgfQp9CgoubWpyLWNvbnRleHQtbWVudS1pdGVtIHsKICAgIGFwcGVhcmFuY2U6IG5vbmU7CiAgICAtd2Via2l0LWFwcGVhcmFuY2U6IG5vbmU7CiAgICBwYWRkaW5nOiA4cHggMTRweDsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOwogICAgd2lkdGg6IDEwMCU7CiAgICBib3JkZXI6IDA7CiAgICBib3JkZXItcmFkaXVzOiAwOwogICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7CiAgICBib3gtc2hhZG93OiBub25lOwogICAgbWFyZ2luOiAwOwogICAgY3Vyc29yOiBwb2ludGVyOwogICAgY29sb3I6IHZhcigtLWZnLWNvbG9yKTsKICAgIGZvbnQtc2l6ZTogMTNweDsKICAgIGZvbnQtZmFtaWx5OiBpbmhlcml0OwogICAgZm9udC13ZWlnaHQ6IDQwMDsKICAgIGxldHRlci1zcGFjaW5nOiBub3JtYWw7CiAgICBsaW5lLWhlaWdodDogMS4zNTsKICAgIHRleHQtYWxpZ246IGxlZnQ7CiAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7CiAgICB0ZXh0LXRyYW5zZm9ybTogbm9uZTsKICAgIHRyYW5zaXRpb246IGJhY2tncm91bmQgMC4xNXM7CiAgICB1c2VyLXNlbGVjdDogbm9uZTsKfQoKLm1qci1jb250ZXh0LW1lbnUtaXRlbTo6LW1vei1mb2N1cy1pbm5lciB7CiAgICBib3JkZXI6IDA7CiAgICBwYWRkaW5nOiAwOwp9CgoubWpyLWNvbnRleHQtbWVudS1pdGVtOmhvdmVyLAoubWpyLWNvbnRleHQtbWVudS1pdGVtOmZvY3VzLXZpc2libGUgewogICAgYmFja2dyb3VuZDogdmFyKC0tY29tZnktaW5wdXQtYmcpOwogICAgb3V0bGluZTogbm9uZTsKfQoKLm1qci1jb250ZXh0LW1lbnUtaXRlbS5pcy10b25lLWdyYXBoLW1hcCB7CiAgICBjb2xvcjogI2Y1YzU0MjsKfQoKLm1qci1jb250ZXh0LW1lbnUtaXRlbS5pcy10b25lLXJlbmFtZSB7CiAgICBjb2xvcjogIzVkYTlmZjsKfQoKLm1qci1jb250ZXh0LW1lbnUtaXRlbS5pcy10b25lLWRlbGV0ZSB7CiAgICBjb2xvcjogI2ZmNWY1ZjsKfQoKLm1qci1jb250ZXh0LW1lbnUtaXRlbS5pcy10b25lLWZsb2F0aW5nLXZpZXdlciB7CiAgICBjb2xvcjogIzVmZDM4ZDsKfQoKLm1qci1jb250ZXh0LW1lbnUtaXRlbS5pcy10b25lLWdyYXBoLW1hcDpob3ZlciwKLm1qci1jb250ZXh0LW1lbnUtaXRlbS5pcy10b25lLWdyYXBoLW1hcDpmb2N1cy12aXNpYmxlIHsKICAgIGJhY2tncm91bmQ6IHJnYmEoMjQ1LCAxOTcsIDY2LCAwLjE0KTsKfQoKLm1qci1jb250ZXh0LW1lbnUtaXRlbS5pcy10b25lLXJlbmFtZTpob3ZlciwKLm1qci1jb250ZXh0LW1lbnUtaXRlbS5pcy10b25lLXJlbmFtZTpmb2N1cy12aXNpYmxlIHsKICAgIGJhY2tncm91bmQ6IHJnYmEoOTMsIDE2OSwgMjU1LCAwLjE0KTsKfQoKLm1qci1jb250ZXh0LW1lbnUtaXRlbS5pcy10b25lLWRlbGV0ZTpob3ZlciwKLm1qci1jb250ZXh0LW1lbnUtaXRlbS5pcy10b25lLWRlbGV0ZTpmb2N1cy12aXNpYmxlIHsKICAgIGJhY2tncm91bmQ6IHJnYmEoMjU1LCA5NSwgOTUsIDAuMTQpOwp9CgoubWpyLWNvbnRleHQtbWVudS1pdGVtLmlzLXRvbmUtZmxvYXRpbmctdmlld2VyOmhvdmVyLAoubWpyLWNvbnRleHQtbWVudS1pdGVtLmlzLXRvbmUtZmxvYXRpbmctdmlld2VyOmZvY3VzLXZpc2libGUgewogICAgYmFja2dyb3VuZDogcmdiYSg5NSwgMjExLCAxNDEsIDAuMTQpOwp9CgoubWpyLWNvbnRleHQtbWVudS1pdGVtLmlzLWRpc2FibGVkIHsKICAgIGN1cnNvcjogZGVmYXVsdDsKICAgIG9wYWNpdHk6IDAuNDU7Cn0KCi5tanItY29udGV4dC1tZW51LWl0ZW0uaXMtZGlzYWJsZWQ6aG92ZXIsCi5tanItY29udGV4dC1tZW51LWl0ZW0uaXMtZGlzYWJsZWQ6Zm9jdXMtdmlzaWJsZSB7CiAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsKfQoKLm1qci1jb250ZXh0LW1lbnUtc2VwYXJhdG9yIHsKICAgIGhlaWdodDogMXB4OwogICAgYmFja2dyb3VuZDogdmFyKC0tYm9yZGVyLWNvbG9yKTsKICAgIG1hcmdpbjogNHB4IDA7Cn0KCi5tanItY29udGV4dC1tZW51LWl0ZW0tbGVmdCwKLm1qci1jb250ZXh0LW1lbnUtaXRlbS1yaWdodCB7CiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBnYXA6IDEwcHg7Cn0KCi5tanItY29udGV4dC1tZW51LWl0ZW0tbGVmdCB7CiAgICBmbGV4OiAxIDEgYXV0bzsKICAgIG1pbi13aWR0aDogMDsKfQoKLm1qci1jb250ZXh0LW1lbnUtaXRlbS1yaWdodCB7CiAgICBmbGV4OiAwIDAgYXV0bzsKICAgIG1hcmdpbi1sZWZ0OiAxNnB4Owp9CgoubWpyLWNvbnRleHQtbWVudS1pdGVtLWxlZnQgaSB7CiAgICB3aWR0aDogMTZweDsKICAgIHRleHQtYWxpZ246IGNlbnRlcjsKICAgIG9wYWNpdHk6IDAuODI7Cn0KCi5tanItY29udGV4dC1tZW51LWhpbnQgewogICAgb3BhY2l0eTogMC41ODsKICAgIGZvbnQtc2l6ZTogMTFweDsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7Cn0KCi5tanItY29udGV4dC1tZW51LXN1Ym1lbnUtYXJyb3cgewogICAgb3BhY2l0eTogMC43MjsKICAgIGZvbnQtc2l6ZTogMTZweDsKICAgIGxpbmUtaGVpZ2h0OiAxOwp9CgoubWpyLWFkZC10by1jb2xsZWN0aW9uLW1lbnUgewogICAgbWluLXdpZHRoOiAyNjBweDsKICAgIG1heC13aWR0aDogbWluKDM2MHB4LCBjYWxjKDEwMHZ3IC0gMTZweCkpOwogICAgYmFja2Ryb3AtZmlsdGVyOiBibHVyKDEycHgpOwp9CgoubWpyLWNvbnRleHQtbWVudS10aXRsZSB7CiAgICBwYWRkaW5nOiA4cHggMTRweCAxMHB4OwogICAgZm9udC1zaXplOiAxMnB4OwogICAgZm9udC13ZWlnaHQ6IDcwMDsKICAgIGNvbG9yOiB2YXIoLS1mZy1jb2xvcik7CiAgICBvcGFjaXR5OiAwLjkyOwp9CgoubWpyLWNvbnRleHQtbWVudS1ub3RlIHsKICAgIHBhZGRpbmc6IDEwcHggMTRweDsKICAgIGZvbnQtc2l6ZTogMTJweDsKICAgIGNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tY29udGVudC1mZykgNzIlLCB2YXIoLS1tanItbXV0ZWQpKTsKICAgIGxpbmUtaGVpZ2h0OiAxLjQ1Owp9CgoubWpyLWdyaWQtcG9wb3ZlciwKLm1qci12aWV3ZXItcG9wb3ZlciB7CiAgICBtaW4td2lkdGg6IDI1MHB4OwogICAgbWF4LXdpZHRoOiBtaW4oMzYwcHgsIGNhbGMoMTAwdncgLSAxNnB4KSk7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1tanItc3VyZmFjZS0xKTsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLW1qci1ib3JkZXIpOwogICAgYm9yZGVyLXJhZGl1czogdmFyKC0tbWpyLXItc20pOwogICAgYm94LXNoYWRvdzogMCAxMnB4IDI4cHggcmdiYSgwLCAwLCAwLCAwLjM1KTsKfQoKQG1lZGlhIChwcmVmZXJzLXJlZHVjZWQtbW90aW9uOiByZWR1Y2UpIHsKICAgIC5tanItdmlld2VyLW92ZXJsYXkgKiwKICAgIC5tanItdmlkZW8tY29udHJvbHMsCiAgICAubWpyLWNvbnRleHQtbWVudSB7CiAgICAgICAgYW5pbWF0aW9uOiBub25lICFpbXBvcnRhbnQ7CiAgICAgICAgdHJhbnNpdGlvbjogbm9uZSAhaW1wb3J0YW50OwogICAgICAgIHNjcm9sbC1iZWhhdmlvcjogYXV0byAhaW1wb3J0YW50OwogICAgfQp9CgovKiBIaWRlIGhlYWRlciAodG9vbGJhcikgd2hlbiB2aWV3ZXIgb3ZlcmxheSBpcyBpbiBmdWxsc2NyZWVuICovCi5tanItdmlld2VyLW92ZXJsYXk6ZnVsbHNjcmVlbiAubWpyLXZpZXdlci1oZWFkZXIgewogICAgZGlzcGxheTogbm9uZTsKfQoKLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgTWFqb29yIEZsb2F0aW5nIFZpZXdlciAoTUZWKSAtIHBvcnRhbGVkIHRvIGRvY3VtZW50LmJvZHkKICAgUmVkZWNsYXJlcyBDU1MgdmFyaWFibGVzIHNvIHRoZSBwYW5lbCB3b3JrcyBvdXRzaWRlIC5tanItYXNzZXRzLW1hbmFnZXIKICAgKHNhbWUgcGF0dGVybiBhcyAubWpyLXBvcG92ZXIpCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgoubWpyLW1mdiB7CiAgICAtLW1qci1zdXJmYWNlLTA6IHZhcigtLWNvbnRlbnQtYmcsICMxZTFlMWUpOwogICAgLS1tanItc3VyZmFjZS0xOiB2YXIoLS1jb21meS1tZW51LWJnLCAjMmEyYTJhKTsKICAgIC0tbWpyLXN1cmZhY2UtMjogdmFyKC0tY29tZnktbWVudS1zZWNvbmRhcnktYmcsICMzMzMpOwogICAgLS1tanItYm9yZGVyOiB2YXIoLS1ib3JkZXItY29sb3IsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xMikpOwogICAgLS1tanItbXV0ZWQ6IHZhcigtLWRlc2NyaXAtdGV4dCwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjY1KSk7CiAgICAtLW1qci1hY2NlbnQ6IHZhcigtLWNvbWZ5LWFjY2VudCwgIzVmYjNmZik7CiAgICAtLW1qci1zdGF0dXMtc3VjY2VzczogdmFyKC0tY29tZnktc3RhdHVzLXN1Y2Nlc3MsICM0Y2FmNTApOwoKICAgIGZvbnQtZmFtaWx5OiB2YXIoCiAgICAgICAgLS1jb21meS1mb250LAogICAgICAgIHVpLXNhbnMtc2VyaWYsCiAgICAgICAgc3lzdGVtLXVpLAogICAgICAgIC1hcHBsZS1zeXN0ZW0sCiAgICAgICAgIlNlZ29lIFVJIiwKICAgICAgICBSb2JvdG8sCiAgICAgICAgQXJpYWwsCiAgICAgICAgc2Fucy1zZXJpZgogICAgKTsKICAgIGZvbnQtc2l6ZTogMTNweDsKICAgIGxpbmUtaGVpZ2h0OiAxLjM1OwogICAgY29sb3I6IHZhcigtLWNvbnRlbnQtZmcsIHZhcigtLWlucHV0LXRleHQsICNkZGQpKTsKICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7CgogICAgLyogVmlzdWFsIGNocm9tZSAqLwogICAgYmFja2dyb3VuZDogdmFyKC0tbWpyLXN1cmZhY2UtMSk7CiAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1tanItYm9yZGVyKTsKICAgIGJvcmRlci1yYWRpdXM6IDhweDsKICAgIGJveC1zaGFkb3c6CiAgICAgICAgMCA4cHggMzJweCByZ2JhKDAsIDAsIDAsIDAuNTUpLAogICAgICAgIDAgMnB4IDhweCByZ2JhKDAsIDAsIDAsIDAuMyk7Cn0KCi5tanItbWZ2ICogewogICAgYm94LXNpemluZzogYm9yZGVyLWJveDsKfQoKaHRtbC5tanItbWZ2LXBvcG91dC1kb2N1bWVudCB7CiAgICBiYWNrZ3JvdW5kOgogICAgICAgIHJhZGlhbC1ncmFkaWVudCgKICAgICAgICAgICAgMTIwMHB4IDQyMHB4IGF0IDUwJSAwJSwKICAgICAgICAgICAgY29sb3ItbWl4KAogICAgICAgICAgICAgICAgaW4gc3JnYiwKICAgICAgICAgICAgICAgIHZhcigtLXByaW1hcnktYmFja2dyb3VuZCwgdmFyKC0tY29tZnktYWNjZW50LCAjNWZiM2ZmKSkgMTAlLAogICAgICAgICAgICAgICAgdHJhbnNwYXJlbnQKICAgICAgICAgICAgKSwKICAgICAgICAgICAgdHJhbnNwYXJlbnQgNjIlCiAgICAgICAgKSwKICAgICAgICBsaW5lYXItZ3JhZGllbnQoCiAgICAgICAgICAgIDE4MGRlZywKICAgICAgICAgICAgY29sb3ItbWl4KAogICAgICAgICAgICAgICAgaW4gc3JnYiwKICAgICAgICAgICAgICAgIHZhcigtLWludGVyZmFjZS1wYW5lbC1zdXJmYWNlLCB2YXIoLS1jb250ZW50LWJnLCAjMTYxOTFmKSkgODIlLAogICAgICAgICAgICAgICAgIzAwMCAxOCUKICAgICAgICAgICAgKSwKICAgICAgICAgICAgY29sb3ItbWl4KAogICAgICAgICAgICAgICAgaW4gc3JnYiwKICAgICAgICAgICAgICAgIHZhcigtLWludGVyZmFjZS1tZW51LXN1cmZhY2UsIHZhcigtLWNvbWZ5LW1lbnUtYmcsICMxZjIyMjcpKSA4NCUsCiAgICAgICAgICAgICAgICAjMDAwIDE2JQogICAgICAgICAgICApCiAgICAgICAgKTsKfQoKYm9keS5tanItbWZ2LXBvcG91dC1ib2R5IHsKICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50Owp9CgojbWpyLW1mdi1wb3BvdXQtcm9vdCwKLm1qci1tZnYtcG9wb3V0LXJvb3QgewogICAgaXNvbGF0aW9uOiBpc29sYXRlOwp9CgovKiAtLSBIZWFkZXIgKGRyYWcgaGFuZGxlKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoubWpyLW1mdi1oZWFkZXIgewogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47CiAgICBwYWRkaW5nOiA2cHggMTBweDsKICAgIGJhY2tncm91bmQ6IHZhcigtLW1qci1zdXJmYWNlLTEpOwogICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHZhcigtLW1qci1ib3JkZXIpOwogICAgY3Vyc29yOiBtb3ZlOwogICAgdXNlci1zZWxlY3Q6IG5vbmU7CiAgICBmbGV4LXNocmluazogMDsKICAgIGdhcDogNnB4OwogICAgbWluLWhlaWdodDogMzRweDsKfQoKLm1qci1tZnYtaGVhZGVyLXRpdGxlIHsKICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogMTBweDsKICAgIGZvbnQtc2l6ZTogMTJweDsKICAgIGZvbnQtd2VpZ2h0OiA2MDA7CiAgICBvcGFjaXR5OiAwLjc4OwogICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwogICAgZmxleDogMTsKICAgIGxldHRlci1zcGFjaW5nOiAwLjI4cHg7Cn0KCi8qIC0tIFRvb2xiYXIgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLm1qci1tZnYtdG9vbGJhciB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogNHB4OwogICAgcGFkZGluZzogNHB4IDhweDsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0wKSA1MCUsIHZhcigtLW1qci1zdXJmYWNlLTEpIDUwJSk7CiAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgdmFyKC0tbWpyLWJvcmRlcik7CiAgICBmbGV4LXNocmluazogMDsKICAgIG1pbi1oZWlnaHQ6IDM2cHg7CiAgICBmbGV4LXdyYXA6IG5vd3JhcDsKICAgIG92ZXJmbG93LXg6IGF1dG87CiAgICBvdmVyZmxvdy15OiBoaWRkZW47CiAgICBzY3JvbGxiYXItd2lkdGg6IG5vbmU7Cn0KLm1qci1tZnYtdG9vbGJhcjo6LXdlYmtpdC1zY3JvbGxiYXIgewogICAgZGlzcGxheTogbm9uZTsKfQoKLm1qci1tZnYtdG9vbGJhci1zZXAgewogICAgd2lkdGg6IDFweDsKICAgIGhlaWdodDogMThweDsKICAgIGJhY2tncm91bmQ6IHZhcigtLW1qci1ib3JkZXIpOwogICAgbWFyZ2luOiAwIDNweDsKICAgIGZsZXgtc2hyaW5rOiAwOwp9CgoubWpyLW1mdi1wcm9ncmVzcyB7CiAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgaGVpZ2h0OiAyMnB4OwogICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHZhcigtLW1qci1ib3JkZXIpOwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTApIDcyJSwgIzAwMCAyOCUpOwogICAgZmxleC1zaHJpbms6IDA7CiAgICBjdXJzb3I6IGRlZmF1bHQ7Cn0KCi5tanItbWZ2LXByb2dyZXNzLmlzLWNsaWNrYWJsZSB7CiAgICBjdXJzb3I6IHBvaW50ZXI7Cn0KCi5tanItbWZ2LXByb2dyZXNzLmlzLWNsaWNrYWJsZTpob3ZlciB7CiAgICBmaWx0ZXI6IGJyaWdodG5lc3MoMS4wMyk7Cn0KCi5tanItbWZ2LXByb2dyZXNzLWJhciB7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICBsZWZ0OiAwOwogICAgd2lkdGg6IDAlOwogICAgdHJhbnNpdGlvbjogd2lkdGggNzBtcyBlYXNlLWluLW91dDsKfQoKLm1qci1tZnYtcHJvZ3Jlc3MtYmFyLS1ub2RlcyB7CiAgICB0b3A6IDA7CiAgICBoZWlnaHQ6IDUwJTsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3RhdHVzLXN1Y2Nlc3MpIDY4JSwgIzBiMzUxMyAzMiUpOwp9CgoubWpyLW1mdi1wcm9ncmVzcy1iYXItLXN0ZXBzIHsKICAgIHRvcDogNTAlOwogICAgaGVpZ2h0OiA1MCU7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWFjY2VudCkgNjQlLCAjMGIyMzQwIDM2JSk7Cn0KCi5tanItbWZ2LXByb2dyZXNzLmlzLWVycm9yIC5tanItbWZ2LXByb2dyZXNzLWJhci0tbm9kZXMsCi5tanItbWZ2LXByb2dyZXNzLmlzLWVycm9yIC5tanItbWZ2LXByb2dyZXNzLWJhci0tc3RlcHMgewogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsICNkOTUzNGYgNzglLCAjNGExNDE0IDIyJSk7Cn0KCi5tanItbWZ2LXByb2dyZXNzLW92ZXJsYXkgewogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgaW5zZXQ6IDA7CiAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQodG8gYm90dG9tLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTgpLCByZ2JhKDAsIDAsIDAsIDAuMTgpKTsKICAgIG1peC1ibGVuZC1tb2RlOiBzY3JlZW47CiAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKfQoKLm1qci1tZnYtcHJvZ3Jlc3MtdGV4dCB7CiAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICB6LWluZGV4OiAyOwogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBoZWlnaHQ6IDEwMCU7CiAgICBwYWRkaW5nOiAwIDhweDsKICAgIGNvbG9yOiB2YXIoLS1jb250ZW50LWZnLCAjZGRkKTsKICAgIGZvbnQtc2l6ZTogMTFweDsKICAgIGZvbnQtd2VpZ2h0OiA2MDA7CiAgICB0ZXh0LXNoYWRvdzogMCAwIDJweCByZ2JhKDAsIDAsIDAsIDAuOSk7CiAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwp9CgoubWpyLW1mdi1waW4tZ3JvdXAgewogICAgZGlzcGxheTogZmxleDsKICAgIGdhcDogMnB4OwogICAgZmxleC1zaHJpbms6IDA7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwp9Ci5tanItbWZ2LXBpbi1idG4gewogICAgd2lkdGg6IDI2cHg7CiAgICBoZWlnaHQ6IDI2cHg7CiAgICBib3JkZXItcmFkaXVzOiA1cHg7CiAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1tanItYm9yZGVyKTsKICAgIGJhY2tncm91bmQ6IHZhcigtLW1qci1zdXJmYWNlLTIpOwogICAgY29sb3I6IHZhcigtLWNvbnRlbnQtZmcsICNkZGQpOwogICAgZm9udC1zaXplOiAxMXB4OwogICAgZm9udC13ZWlnaHQ6IDYwMDsKICAgIGN1cnNvcjogcG9pbnRlcjsKICAgIHBhZGRpbmc6IDA7CiAgICBsaW5lLWhlaWdodDogMjRweDsKICAgIHRleHQtYWxpZ246IGNlbnRlcjsKICAgIHRyYW5zaXRpb246CiAgICAgICAgYmFja2dyb3VuZC1jb2xvciAxMjBtcyBlYXNlLAogICAgICAgIGJvcmRlci1jb2xvciAxMjBtcyBlYXNlLAogICAgICAgIGNvbG9yIDEyMG1zIGVhc2UsCiAgICAgICAgYm94LXNoYWRvdyAxMjBtcyBlYXNlOwp9Ci5tanItbWZ2LXBpbi1idG46aG92ZXIgewogICAgYm9yZGVyLWNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWFjY2VudCkgNDUlLCB2YXIoLS1tanItYm9yZGVyKSk7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMikgODAlLCB2YXIoLS1tanItYWNjZW50KSA4JSk7Cn0KLm1qci1tZnYtcGluLWJ0bi5pcy1waW5uZWQgewogICAgYm9yZGVyLWNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWFjY2VudCkgNTglLCAjZmZmZmZmIDEyJSk7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMikgNDIlLCB2YXIoLS1tanItYWNjZW50KSA1OCUpOwogICAgY29sb3I6ICNlZWY3ZmY7CiAgICBib3gtc2hhZG93OiBpbnNldCAwIDAgMCAxcHggY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQpIDI0JSwgdHJhbnNwYXJlbnQpOwp9CgovKiAtLSBQaW4gZ3JvdXA6IG5vdyBhIGRyb3Bkb3duIG1lbnUgKGRpc3BsYXk6bm9uZSBieSBkZWZhdWx0LCBmbGV4IHdoZW4gLmlzLW9wZW4pIC0tICovCi5tanItbWZ2LXBpbi1ncm91cCB7CiAgICBkaXNwbGF5OiBub25lOwogICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgIGdhcDogMnB4OwogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgdG9wOiBjYWxjKDEwMCUgKyA0cHgpOwogICAgbGVmdDogMDsKICAgIHotaW5kZXg6IDEwMDEwOwogICAgbWluLXdpZHRoOiA3MHB4OwogICAgcGFkZGluZzogNHB4OwogICAgYmFja2dyb3VuZDogdmFyKC0tY29tZnktbWVudS1iZywgIzJhMmEyYSk7CiAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1tanItYm9yZGVyLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTIpKTsKICAgIGJvcmRlci1yYWRpdXM6IDhweDsKICAgIGJveC1zaGFkb3c6IDAgOHB4IDI0cHggcmdiYSgwLCAwLCAwLCAwLjU1KTsKfQoubWpyLW1mdi1waW4tZ3JvdXAuaXMtb3BlbiB7CiAgICBkaXNwbGF5OiBmbGV4Owp9Ci5tanItbWZ2LXBpbi1idG4gewogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgIHdpZHRoOiAxMDAlOwogICAgaGVpZ2h0OiAzMHB4OwogICAgYm9yZGVyLXJhZGl1czogNnB4OwogICAgYm9yZGVyOiAxcHggc29saWQgdHJhbnNwYXJlbnQ7CiAgICBiYWNrZ3JvdW5kOiBub25lOwogICAgY29sb3I6IHZhcigtLWNvbnRlbnQtZmcsICNkZGQpOwogICAgZm9udC1zaXplOiAxMnB4OwogICAgZm9udC13ZWlnaHQ6IDYwMDsKICAgIGN1cnNvcjogcG9pbnRlcjsKICAgIHBhZGRpbmc6IDAgMTBweDsKICAgIHRleHQtYWxpZ246IGNlbnRlcjsKICAgIHRyYW5zaXRpb246CiAgICAgICAgYmFja2dyb3VuZCAxMjBtcyBlYXNlLAogICAgICAgIGJvcmRlci1jb2xvciAxMjBtcyBlYXNlLAogICAgICAgIGNvbG9yIDEyMG1zIGVhc2U7Cn0KLm1qci1tZnYtcGluLWJ0bjpob3ZlciB7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDgpOwogICAgYm9yZGVyLWNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWFjY2VudCkgMzUlLCB0cmFuc3BhcmVudCk7Cn0KLm1qci1tZnYtcGluLWJ0bi5pcy1waW5uZWQgewogICAgYm9yZGVyLWNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWFjY2VudCkgNTglLCAjZmZmZmZmIDEyJSk7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMiwgIzMzMykgNDIlLCB2YXIoLS1tanItYWNjZW50LCAjNWZiM2ZmKSA1OCUpOwogICAgY29sb3I6ICNlZWY3ZmY7Cn0KCi8qIC0tIEljb24gRHJvcGRvd24gY29tcG9uZW50ICgubWpyLW1mdi1pZHJvcCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi5tanItbWZ2LWlkcm9wIHsKICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGZsZXgtc2hyaW5rOiAwOwp9CgoubWpyLW1mdi1pZHJvcC1tZW51IHsKICAgIGRpc3BsYXk6IG5vbmU7CiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgZ2FwOiAycHg7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICB6LWluZGV4OiAxMDAxMDsKICAgIG1pbi13aWR0aDogMTEwcHg7CiAgICBwYWRkaW5nOiA0cHg7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1jb21meS1tZW51LWJnLCAjMmEyYTJhKTsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLW1qci1ib3JkZXIsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xMikpOwogICAgYm9yZGVyLXJhZGl1czogOHB4OwogICAgYm94LXNoYWRvdzogMCA4cHggMjRweCByZ2JhKDAsIDAsIDAsIDAuNTUpOwogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKfQoubWpyLW1mdi1pZHJvcC1tZW51LmlzLW9wZW4gewogICAgZGlzcGxheTogZmxleDsKfQoKLm1qci1tZnYtaWRyb3AtaXRlbSB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogOHB4OwogICAgd2lkdGg6IDEwMCU7CiAgICBwYWRkaW5nOiA2cHggMTBweDsKICAgIGJhY2tncm91bmQ6IG5vbmU7CiAgICBib3JkZXI6IG5vbmU7CiAgICBib3JkZXItcmFkaXVzOiA2cHg7CiAgICBjb2xvcjogdmFyKC0taW5wdXQtdGV4dCwgI2RkZCk7CiAgICBmb250LXNpemU6IDEycHg7CiAgICBmb250LWZhbWlseTogaW5oZXJpdDsKICAgIHRleHQtYWxpZ246IGxlZnQ7CiAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgdHJhbnNpdGlvbjogYmFja2dyb3VuZCAwLjFzIGVhc2U7Cn0KLm1qci1tZnYtaWRyb3AtaXRlbTpob3ZlciB7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDgpOwp9Ci5tanItbWZ2LWlkcm9wLWl0ZW0uaXMtc2VsZWN0ZWQgewogICAgYmFja2dyb3VuZDogcmdiYSg5NSwgMTc5LCAyNTUsIDAuMTYpOwogICAgY29sb3I6ICNhOGQ4ZmY7Cn0KLm1qci1tZnYtaWRyb3AtdHJpZ2dlclthcmlhLWV4cGFuZGVkPSJ0cnVlIl0gewogICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEpICFpbXBvcnRhbnQ7CiAgICBib3JkZXItY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4yKSAhaW1wb3J0YW50Owp9Ci8qIENoYW5uZWwgdHJpZ2dlcjogc2xpZ2h0bHkgd2lkZXIgdG8gZml0ICJSR0IiICovCi5tanItbWZ2LWNoLWxhYmVsIHsKICAgIGZvbnQtc2l6ZTogMTJweDsKICAgIGxldHRlci1zcGFjaW5nOiAwLjA0ZW07CiAgICBsaW5lLWhlaWdodDogMTsKfQoKLyogVG9vbGJhciBpY29uLWJ1dHRvbiBwb3BvdmVycyAoY2hhbm5lbCwgZ3VpZGVzLCBwaW4sIGZvcm1hdCAtIHNvcnQtc3R5bGUgY29udGV4dCBtZW51cykgKi8KLm1qci1tZnYtY2gtcG9wb3ZlciwKLm1qci1tZnYtZ3VpZGVzLXBvcG92ZXIsCi5tanItbWZ2LXBpbi1wb3BvdmVyLAoubWpyLW1mdi1mb3JtYXQtcG9wb3ZlciB7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICBtaW4td2lkdGg6IDEyMHB4OwogICAgcGFkZGluZzogNnB4OwogICAgYm9yZGVyLXJhZGl1czogdmFyKC0tcmFkaXVzLWxnLCAwLjVyZW0pOwogICAgYmFja2dyb3VuZDogdmFyKC0tbWpyLXN1cmZhY2UtMSwgdmFyKC0tY29tZnktbWVudS1iZywgIzJhMmEyYSkpOwogICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tbWpyLWJvcmRlciwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEyKSk7CiAgICBib3gtc2hhZG93OiAwIDhweCAyNHB4IHJnYmEoMCwgMCwgMCwgMC41NSk7CiAgICB6LWluZGV4OiAxMDAxMDsKICAgIGRpc3BsYXk6IG5vbmU7Cn0KLm1qci1tZnYtY2gtcG9wb3Zlci5pcy1vcGVuLAoubWpyLW1mdi1ndWlkZXMtcG9wb3Zlci5pcy1vcGVuLAoubWpyLW1mdi1waW4tcG9wb3Zlci5pcy1vcGVuLAoubWpyLW1mdi1mb3JtYXQtcG9wb3Zlci5pcy1vcGVuIHsKICAgIGRpc3BsYXk6IGJsb2NrOwp9Ci8qIFRvb2xiYXIgaWNvbiBpbWFnZXMgLSBjaCBpY29uIGlzIGJsYWNrIChpbnZlcnRlZCksIGd1aWRlcyBpY29uIGlzIG5hdGl2ZSB3aGl0ZSAqLwoubWpyLW1mdi1jaC1pY29uIHsKICAgIHdpZHRoOiAxOHB4OwogICAgaGVpZ2h0OiAxOHB4OwogICAgZmlsdGVyOiBpbnZlcnQoMSk7CiAgICBvcGFjaXR5OiAwLjg1OwogICAgZGlzcGxheTogYmxvY2s7Cn0KLm1qci1tZnYtZ3VpZGVzLWljb24gewogICAgd2lkdGg6IDE4cHg7CiAgICBoZWlnaHQ6IDE4cHg7CiAgICBvcGFjaXR5OiAwLjg1OwogICAgZGlzcGxheTogYmxvY2s7Cn0KLm1qci1tZnYtY2gtdHJpZ2dlclthcmlhLWV4cGFuZGVkPSJ0cnVlIl0sCi5tanItbWZ2LWd1aWRlcy10cmlnZ2VyW2FyaWEtZXhwYW5kZWQ9InRydWUiXSwKLm1qci1tZnYtcGluLXRyaWdnZXJbYXJpYS1leHBhbmRlZD0idHJ1ZSJdLAoubWpyLW1mdi1mb3JtYXQtdHJpZ2dlclthcmlhLWV4cGFuZGVkPSJ0cnVlIl0gewogICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEpICFpbXBvcnRhbnQ7CiAgICBib3JkZXItY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4yKSAhaW1wb3J0YW50Owp9Ci8qIFBpbiBzbG90IGFjdGl2ZSBzdGF0ZSAqLwoubWpyLW1mdi1waW4tcG9wb3ZlciAubWpyLW1lbnUtaXRlbS5pcy1waW5uZWQgewogICAgYmFja2dyb3VuZDogcmdiYSg5NSwgMTc5LCAyNTUsIDAuMTYpOwogICAgY29sb3I6ICNhOGQ4ZmY7Cn0KLm1qci1tZnYtcGluLXBvcG92ZXIgLm1qci1tZW51LWl0ZW0uaXMtcGlubmVkIC5tanItbWVudS1pdGVtLWNoZWNrIHsKICAgIG9wYWNpdHk6IDEgIWltcG9ydGFudDsKfQovKiBGb3JtYXQgcG9wb3Zlcjogc2VwYXJhdG9yICsgb3BhY2l0eSBzbGlkZXIgcm93ICovCi5tanItbWZ2LWZvcm1hdC1zZXAgewogICAgaGVpZ2h0OiAxcHg7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1tanItYm9yZGVyLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMSkpOwogICAgbWFyZ2luOiA0cHggMnB4Owp9Ci5tanItbWZ2LWZvcm1hdC1zbGlkZXItcm93IHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiA2cHg7CiAgICBwYWRkaW5nOiA0cHggOHB4IDJweDsKfQoubWpyLW1mdi1mb3JtYXQtc2xpZGVyLWxhYmVsIHsKICAgIGZvbnQtc2l6ZTogMTFweDsKICAgIGNvbG9yOiB2YXIoLS1pbnB1dC10ZXh0LCAjZGRkKTsKICAgIG9wYWNpdHk6IDAuNjU7CiAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgZmxleC1zaHJpbms6IDA7Cn0KLm1qci1tZnYtZm9ybWF0LXBvcG92ZXIgaW5wdXRbdHlwZT0icmFuZ2UiXSB7CiAgICBmbGV4OiAxOwogICAgbWluLXdpZHRoOiA3MHB4OwogICAgYWNjZW50LWNvbG9yOiB2YXIoLS1tanItYWNjZW50LCAjNWZiM2ZmKTsKfQoubWpyLW1mdi1mb3JtYXQtcG9wb3ZlciAubWpyLW1mdi10b29sYmFyLXJhbmdlLW91dCB7CiAgICBmb250LXNpemU6IDExcHg7CiAgICBjb2xvcjogdmFyKC0taW5wdXQtdGV4dCwgI2RkZCk7CiAgICBvcGFjaXR5OiAwLjY1OwogICAgbWluLXdpZHRoOiAzMHB4OwogICAgdGV4dC1hbGlnbjogcmlnaHQ7CiAgICBmbGV4LXNocmluazogMDsKfQoKLm1qci1tZnYgLm1qci1pY29uLWJ0biB7CiAgICB3aWR0aDogMzBweDsKICAgIGhlaWdodDogMzBweDsKICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgYm9yZGVyLXJhZGl1czogN3B4OwogICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tbWpyLWJvcmRlcik7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1tanItc3VyZmFjZS0yKTsKICAgIGNvbG9yOiB2YXIoLS1jb250ZW50LWZnLCAjZGRkKTsKICAgIGN1cnNvcjogcG9pbnRlcjsKICAgIHBhZGRpbmc6IDA7CiAgICBmbGV4LXNocmluazogMDsKICAgIHRyYW5zaXRpb246CiAgICAgICAgdHJhbnNmb3JtIDEyMG1zIGVhc2UsCiAgICAgICAgYmFja2dyb3VuZC1jb2xvciAxMjBtcyBlYXNlLAogICAgICAgIGJvcmRlci1jb2xvciAxMjBtcyBlYXNlLAogICAgICAgIGNvbG9yIDEyMG1zIGVhc2UsCiAgICAgICAgYm94LXNoYWRvdyAxMjBtcyBlYXNlOwp9CgoubWpyLW1mdiAubWpyLWljb24tYnRuOmhvdmVyIHsKICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQpIDQ1JSwgdmFyKC0tbWpyLWJvcmRlcikpOwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTIpIDgwJSwgdmFyKC0tbWpyLWFjY2VudCkgOCUpOwogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC0xcHgpOwp9CgoubWpyLW1mdiAubWpyLWljb24tYnRuOmZvY3VzLXZpc2libGUgewogICAgb3V0bGluZTogbm9uZTsKICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQpIDU4JSwgdmFyKC0tbWpyLWJvcmRlcikpOwogICAgYm94LXNoYWRvdzogMCAwIDAgMnB4IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYWNjZW50KSAyNCUsIHRyYW5zcGFyZW50KTsKfQoKLm1qci1tZnYgLm1qci1pY29uLWJ0biAucGkgewogICAgZm9udC1zaXplOiAxM3B4OwogICAgbGluZS1oZWlnaHQ6IDE7CiAgICBvcGFjaXR5OiAwLjk7Cn0KCi8qIFVuaXZlcnNhbCBhY3RpdmUgaGlnaGxpZ2h0IC0gYW55IGFyaWEtcHJlc3NlZD0idHJ1ZSIgYnV0dG9uIGdldHMgYWNjZW50IGdsb3cuCiAgIFBsYWNlZCBiZWZvcmUgdGhlIGNvbG9yZWQgYWN0aXZlIGNsYXNzZXMgc28gdGhleSBjYW4gb3ZlcnJpZGUgd2l0aCB0aGVpciBvd24gY29sb3IuICovCi5tanItbWZ2IC5tanItaWNvbi1idG5bYXJpYS1wcmVzc2VkPSJ0cnVlIl0gewogICAgYm9yZGVyLWNvbG9yOiByZ2JhKDk1LCAxNzksIDI1NSwgMC41NSk7CiAgICBjb2xvcjogdmFyKC0tbWpyLWFjY2VudCwgIzVmYjNmZik7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMiwgIzMzMykgODAlLCB2YXIoLS1tanItYWNjZW50LCAjNWZiM2ZmKSAxNSUpOwogICAgYm94LXNoYWRvdzogMCAwIDAgMXB4IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYWNjZW50LCAjNWZiM2ZmKSAyNSUsIHRyYW5zcGFyZW50KTsKfQoubWpyLW1mdiAubWpyLWljb24tYnRuW2FyaWEtcHJlc3NlZD0idHJ1ZSJdIC5waSB7CiAgICBvcGFjaXR5OiAxOwp9CgoubWpyLW1mdiAubWpyLWljb24tYnRuLm1qci1saXZlLWFjdGl2ZSB7CiAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3RhdHVzLXN1Y2Nlc3MpIDYwJSwgdmFyKC0tbWpyLWJvcmRlcikpOwogICAgY29sb3I6IHZhcigtLW1qci1zdGF0dXMtc3VjY2Vzcyk7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMikgODAlLCB2YXIoLS1tanItc3RhdHVzLXN1Y2Nlc3MpIDEyJSk7CiAgICBib3gtc2hhZG93OiAwIDAgMCAxcHggY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdGF0dXMtc3VjY2VzcykgMjUlLCB0cmFuc3BhcmVudCk7Cn0KCi5tanItbWZ2IC5tanItaWNvbi1idG4ubWpyLWxpdmUtYWN0aXZlIC5waSB7CiAgICBvcGFjaXR5OiAxOwp9CgoubWpyLW1mdiAubWpyLWljb24tYnRuLm1qci1wcmV2aWV3LWFjdGl2ZSB7CiAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYWNjZW50KSA2MCUsIHZhcigtLW1qci1ib3JkZXIpKTsKICAgIGNvbG9yOiB2YXIoLS1tanItYWNjZW50KTsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0yKSA4MCUsIHZhcigtLW1qci1hY2NlbnQpIDEyJSk7CiAgICBib3gtc2hhZG93OiAwIDAgMCAxcHggY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQpIDI1JSwgdHJhbnNwYXJlbnQpOwp9CgoubWpyLW1mdiAubWpyLWljb24tYnRuLm1qci1wcmV2aWV3LWFjdGl2ZSAucGkgewogICAgb3BhY2l0eTogMTsKfQoKLm1qci1tZnYgLm1qci1pY29uLWJ0bi5tanItbm9kZXN0cmVhbS1hY3RpdmUgewogICAgYm9yZGVyLWNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN0YXR1cy13YXJuaW5nLCAjZmY5ODAwKSA2MCUsIHZhcigtLW1qci1ib3JkZXIpKTsKICAgIGNvbG9yOiB2YXIoLS1tanItc3RhdHVzLXdhcm5pbmcsICNmZjk4MDApOwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KAogICAgICAgIGluIHNyZ2IsCiAgICAgICAgdmFyKC0tbWpyLXN1cmZhY2UtMikgODAlLAogICAgICAgIHZhcigtLW1qci1zdGF0dXMtd2FybmluZywgI2ZmOTgwMCkgMTIlCiAgICApOwogICAgYm94LXNoYWRvdzogMCAwIDAgMXB4IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3RhdHVzLXdhcm5pbmcsICNmZjk4MDApIDI1JSwgdHJhbnNwYXJlbnQpOwp9CgoubWpyLW1mdiAubWpyLWljb24tYnRuLm1qci1ub2Rlc3RyZWFtLWFjdGl2ZSAucGkgewogICAgb3BhY2l0eTogMTsKfQoKLyogUG9wLWluIG1vZGUgKHZpZXdlciBwb3BwZWQgb3V0KTogcmFpc2UgYnV0dG9uIGNvbnRyYXN0L2JyaWdodG5lc3MgKi8KLm1qci1tZnYubWpyLW1mdi0tcG9wcGVkIHsKICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgKICAgICAgICAxODBkZWcsCiAgICAgICAgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTEpIDkyJSwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA0KSksCiAgICAgICAgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTApIDkyJSwgcmdiYSgwLCAwLCAwLCAwLjE4KSkKICAgICk7CiAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYm9yZGVyKSA3NCUsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xOCkpOwogICAgYm94LXNoYWRvdzoKICAgICAgICBpbnNldCAwIDFweCAwIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wNSksCiAgICAgICAgMCAyNHB4IDU2cHggcmdiYSgwLCAwLCAwLCAwLjQyKTsKfQoKLm1qci1tZnYubWpyLW1mdi0tcG9wcGVkIC5tanItbWZ2LWhlYWRlciB7CiAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoCiAgICAgICAgMTgwZGVnLAogICAgICAgIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0yKSA4OCUsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wOCkpLAogICAgICAgIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0xKSA5MCUsIHJnYmEoMCwgMCwgMCwgMC4yNCkpCiAgICApOwogICAgYm9yZGVyLWJvdHRvbS1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1ib3JkZXIpIDc4JSwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE0KSk7CiAgICBib3gtc2hhZG93OiBpbnNldCAwIDFweCAwIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wNCk7Cn0KCi5tanItbWZ2Lm1qci1tZnYtLXBvcHBlZCAubWpyLW1mdi1oZWFkZXItdGl0bGUgewogICAgb3BhY2l0eTogMC45ODsKICAgIGNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tY29udGVudC1mZywgI2VlZjRmZikgOTQlLCAjZmZmZmZmIDYlKTsKfQoKLm1qci1tZnYubWpyLW1mdi0tcG9wcGVkIC5tanItbWZ2LXRvb2xiYXIgewogICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KAogICAgICAgIDE4MGRlZywKICAgICAgICBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMSkgODglLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDQpKSwKICAgICAgICBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMCkgOTAlLCByZ2JhKDAsIDAsIDAsIDAuMjQpKQogICAgKTsKICAgIGJvcmRlci1ib3R0b20tY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYm9yZGVyKSA3OCUsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xNCkpOwp9CgoubWpyLW1mdi5tanItbWZ2LS1wb3BwZWQgLm1qci1tZnYtdG9vbGJhci1zZXAgewogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1ib3JkZXIpIDc4JSwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE4KSk7Cn0KCi5tanItbWZ2Lm1qci1tZnYtLXBvcHBlZCAubWpyLW1mdi1wcm9ncmVzcyB7CiAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoCiAgICAgICAgMTgwZGVnLAogICAgICAgIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0wKSA4MiUsICMwYTExMTggMTglKSwKICAgICAgICBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMCkgOTIlLCAjMDAwIDglKQogICAgKTsKICAgIGJvcmRlci1ib3R0b20tY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYm9yZGVyKSA3OCUsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xNCkpOwp9CgoubWpyLW1mdi5tanItbWZ2LS1wb3BwZWQgLm1qci1tZnYtcHJvZ3Jlc3MtdGV4dCB7CiAgICBjb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLWNvbnRlbnQtZmcsICNlZWY0ZmYpIDk0JSwgI2ZmZmZmZiA2JSk7Cn0KCi5tanItbWZ2Lm1qci1tZnYtLXBvcHBlZCAubWpyLW1mdi1jb250ZW50IHsKICAgIGJhY2tncm91bmQ6CiAgICAgICAgcmFkaWFsLWdyYWRpZW50KAogICAgICAgICAgICBjaXJjbGUgYXQgdG9wLAogICAgICAgICAgICBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWFjY2VudCkgMTAlLCB0cmFuc3BhcmVudCkgMCUsCiAgICAgICAgICAgIHRyYW5zcGFyZW50IDQyJQogICAgICAgICksCiAgICAgICAgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTApIDgyJSwgIzAwMCAxOCUpOwp9CgoubWpyLW1mdi5tanItbWZ2LS1wb3BwZWQgLm1qci1pY29uLWJ0biB7CiAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYm9yZGVyKSA3NiUsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xNikpOwogICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KAogICAgICAgIDE4MGRlZywKICAgICAgICBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMikgODYlLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDgpKSwKICAgICAgICBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMSkgOTIlLCByZ2JhKDAsIDAsIDAsIDAuMTgpKQogICAgKTsKICAgIGNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tY29udGVudC1mZywgI2RkZCkgOTIlLCAjZmZmZmZmIDglKSAhaW1wb3J0YW50OwogICAgYm94LXNoYWRvdzoKICAgICAgICBpbnNldCAwIDFweCAwIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wNSksCiAgICAgICAgMCA4cHggMThweCByZ2JhKDAsIDAsIDAsIDAuMTgpOwp9CgoubWpyLW1mdi5tanItbWZ2LS1wb3BwZWQgLm1qci1pY29uLWJ0bjpob3ZlciB7CiAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYWNjZW50KSA1MiUsIHZhcigtLW1qci1ib3JkZXIpKTsKICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgKICAgICAgICAxODBkZWcsCiAgICAgICAgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTIpIDU4JSwgdmFyKC0tbWpyLWFjY2VudCkgNDIlKSwKICAgICAgICBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMSkgNjIlLCB2YXIoLS1tanItYWNjZW50KSAzOCUpCiAgICApOwogICAgY29sb3I6ICNmNGY4ZmYgIWltcG9ydGFudDsKfQoKLm1qci1tZnYubWpyLW1mdi0tcG9wcGVkIC5tanItaWNvbi1idG4gLnBpIHsKICAgIG9wYWNpdHk6IDE7CiAgICBjb2xvcjogaW5oZXJpdCAhaW1wb3J0YW50Owp9CgoubWpyLW1mdi5tanItbWZ2LS1wb3BwZWQgLm1qci1pY29uLWJ0bi5tanItbGl2ZS1hY3RpdmUgewogICAgYm9yZGVyLWNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN0YXR1cy1zdWNjZXNzKSA2MCUsICNmZmZmZmYgNDAlKTsKICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgKICAgICAgICAxODBkZWcsCiAgICAgICAgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdGF0dXMtc3VjY2VzcykgNjIlLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDgpKSwKICAgICAgICBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN0YXR1cy1zdWNjZXNzKSAzNiUsIHZhcigtLW1qci1zdXJmYWNlLTEpIDY0JSkKICAgICk7CiAgICBjb2xvcjogI2ZmZmZmZiAhaW1wb3J0YW50OwogICAgYm94LXNoYWRvdzoKICAgICAgICBpbnNldCAwIDFweCAwIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xMiksCiAgICAgICAgMCAwIDAgMXB4IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3RhdHVzLXN1Y2Nlc3MpIDI0JSwgdHJhbnNwYXJlbnQpLAogICAgICAgIDAgMCAxOHB4IHJnYmEoNzYsIDE3NSwgODAsIDAuMTgpOwp9CgoubWpyLW1mdi5tanItbWZ2LS1wb3BwZWQgLm1qci1pY29uLWJ0bi5tanItcHJldmlldy1hY3RpdmUgewogICAgYm9yZGVyLWNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWFjY2VudCkgNTglLCAjZmZmZmZmIDQyJSk7CiAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoCiAgICAgICAgMTgwZGVnLAogICAgICAgIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYWNjZW50KSA2MiUsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wOCkpLAogICAgICAgIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYWNjZW50KSAzNiUsIHZhcigtLW1qci1zdXJmYWNlLTEpIDY0JSkKICAgICk7CiAgICBjb2xvcjogI2ZmZmZmZiAhaW1wb3J0YW50OwogICAgYm94LXNoYWRvdzoKICAgICAgICBpbnNldCAwIDFweCAwIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xMiksCiAgICAgICAgMCAwIDAgMXB4IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYWNjZW50KSAyNCUsIHRyYW5zcGFyZW50KSwKICAgICAgICAwIDAgMThweCByZ2JhKDk1LCAxNzksIDI1NSwgMC4xOCk7Cn0KCi5tanItbWZ2Lm1qci1tZnYtLXBvcHBlZCAubWpyLWljb24tYnRuLm1qci1ub2Rlc3RyZWFtLWFjdGl2ZSB7CiAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3RhdHVzLXdhcm5pbmcsICNmZjk4MDApIDU4JSwgI2ZmZmZmZiA0MiUpOwogICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KAogICAgICAgIDE4MGRlZywKICAgICAgICBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN0YXR1cy13YXJuaW5nLCAjZmY5ODAwKSA2MiUsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wOCkpLAogICAgICAgIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3RhdHVzLXdhcm5pbmcsICNmZjk4MDApIDM2JSwgdmFyKC0tbWpyLXN1cmZhY2UtMSkgNjQlKQogICAgKTsKICAgIGNvbG9yOiAjZmZmZmZmICFpbXBvcnRhbnQ7CiAgICBib3gtc2hhZG93OgogICAgICAgIGluc2V0IDAgMXB4IDAgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEyKSwKICAgICAgICAwIDAgMCAxcHggY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdGF0dXMtd2FybmluZywgI2ZmOTgwMCkgMjQlLCB0cmFuc3BhcmVudCksCiAgICAgICAgMCAwIDE4cHggcmdiYSgyNTUsIDE1MiwgMCwgMC4xOCk7Cn0KCi5tanItbWZ2Lm1qci1tZnYtLXBvcHBlZCAubWpyLW1mdi1waW4tYnRuIHsKICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1ib3JkZXIpIDc2JSwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE2KSk7CiAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoCiAgICAgICAgMTgwZGVnLAogICAgICAgIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0yKSA4NCUsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wOCkpLAogICAgICAgIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0xKSA5MiUsIHJnYmEoMCwgMCwgMCwgMC4xOCkpCiAgICApOwogICAgY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1jb250ZW50LWZnLCAjZGRkKSA5MiUsICNmZmZmZmYgOCUpOwogICAgYm94LXNoYWRvdzogaW5zZXQgMCAxcHggMCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDQpOwp9CgoubWpyLW1mdi5tanItbWZ2LS1wb3BwZWQgLm1qci1tZnYtcGluLWJ0bjpob3ZlciB7CiAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYWNjZW50KSA1MiUsIHZhcigtLW1qci1ib3JkZXIpKTsKICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgKICAgICAgICAxODBkZWcsCiAgICAgICAgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTIpIDU2JSwgdmFyKC0tbWpyLWFjY2VudCkgNDQlKSwKICAgICAgICBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMSkgNjQlLCB2YXIoLS1tanItYWNjZW50KSAzNiUpCiAgICApOwp9CgoubWpyLW1mdi5tanItbWZ2LS1wb3BwZWQgLm1qci1tZnYtcGluLWJ0bi5pcy1waW5uZWQgewogICAgYm9yZGVyLWNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWFjY2VudCkgNTglLCAjZmZmZmZmIDQyJSk7CiAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoCiAgICAgICAgMTgwZGVnLAogICAgICAgIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYWNjZW50KSA2MiUsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wOCkpLAogICAgICAgIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYWNjZW50KSAzNiUsIHZhcigtLW1qci1zdXJmYWNlLTEpIDY0JSkKICAgICk7CiAgICBjb2xvcjogI2ZmZmZmZjsKfQoKLm1qci1tZnYubWpyLW1mdi0tcG9wcGVkIC5tanItd3Mtc2lkZWJhciB7CiAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoCiAgICAgICAgMTgwZGVnLAogICAgICAgIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0xKSA5NCUsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wNCkpLAogICAgICAgIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0wKSA5NCUsIHJnYmEoMCwgMCwgMCwgMC4xOCkpCiAgICApOwogICAgYm9yZGVyLWxlZnQtY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYm9yZGVyKSA3OCUsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xNikpOwogICAgYm94LXNoYWRvdzogaW5zZXQgMXB4IDAgMCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDMpOwp9CgoubWpyLW1mdi5tanItbWZ2LS1wb3BwZWQgLm1qci1tZnYtY29udGVudC13cmFwcGVyW2RhdGEtc2lkZWJhci1wb3M9ImxlZnQiXSAubWpyLXdzLXNpZGViYXIgewogICAgYm9yZGVyLXJpZ2h0LWNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWJvcmRlcikgNzglLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTYpKTsKfQoKLm1qci1tZnYubWpyLW1mdi0tcG9wcGVkIC5tanItd3Mtc2lkZWJhci1oZWFkZXIgewogICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KAogICAgICAgIDE4MGRlZywKICAgICAgICBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMikgODQlLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDUpKSwKICAgICAgICBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMSkgOTIlLCByZ2JhKDAsIDAsIDAsIDAuMTgpKQogICAgKTsKICAgIGJvcmRlci1ib3R0b20tY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYm9yZGVyKSA3NiUsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xNCkpOwp9CgoubWpyLW1mdi5tanItbWZ2LS1wb3BwZWQgLm1qci13cy1zaWRlYmFyLXRpdGxlIHsKICAgIGNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tY29udGVudC1mZywgI2VlZjRmZikgODIlLCB2YXIoLS1tanItbXV0ZWQpIDE4JSk7CiAgICBvcGFjaXR5OiAwLjg4Owp9CgoubWpyLW1mdi5tanItbWZ2LS1wb3BwZWQgLm1qci13cy1ub2RlIHsKICAgIGJvcmRlci1ib3R0b20tY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYm9yZGVyKSA3MiUsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xMikpOwp9CgoubWpyLW1mdi5tanItbWZ2LS1wb3BwZWQgLm1qci13cy1ub2RlLWhlYWRlciB7CiAgICBiYWNrZ3JvdW5kOgogICAgICAgIGxpbmVhci1ncmFkaWVudCgxODBkZWcsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wNCksIHJnYmEoMjU1LCAyNTUsIDI1NSwgMCkpLAogICAgICAgIGxpbmVhci1ncmFkaWVudCgKICAgICAgICAgICAgMTgwZGVnLAogICAgICAgICAgICBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMSkgODYlLCB2YXIoLS1tanItYWNjZW50KSAxNCUpLAogICAgICAgICAgICBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMCkgODYlLCByZ2JhKDAsIDAsIDAsIDAuMTQpKQogICAgICAgICk7CiAgICBib3gtc2hhZG93OiBpbnNldCAwIDFweCAwIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wNCk7Cn0KCi5tanItbWZ2Lm1qci1tZnYtLXBvcHBlZCAubWpyLXdzLW5vZGUtdGl0bGUgewogICAgY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1jb250ZW50LWZnLCAjZWVmNGZmKSA5NCUsICNmZmZmZmYgNiUpOwp9CgoubWpyLW1mdi5tanItbWZ2LS1wb3BwZWQgLm1qci13cy13aWRnZXQtbGFiZWwsCi5tanItbWZ2Lm1qci1tZnYtLXBvcHBlZCAubWpyLXdzLXNpZGViYXItZW1wdHksCi5tanItbWZ2Lm1qci1tZnYtLXBvcHBlZCAubWpyLXdzLW5vZGUtZW1wdHkgewogICAgY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItbXV0ZWQpIDg0JSwgI2ZmZmZmZiAxNiUpOwp9CgoubWpyLW1mdi5tanItbWZ2LS1wb3BwZWQgLm1qci13cy1pbnB1dCB7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMCkgNzQlLCAjMDUwNzBhIDI2JSk7CiAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYm9yZGVyKSA3NCUsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xOCkpOwogICAgYm9yZGVyLXJhZGl1czogNnB4OwogICAgYm94LXNoYWRvdzogaW5zZXQgMCAxcHggMCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDQpOwp9CgoubWpyLW1mdi5tanItbWZ2LS1wb3BwZWQgLm1qci13cy1pbnB1dDpmb2N1cyB7CiAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYWNjZW50KSA1OCUsICNmZmZmZmYgMTAlKTsKICAgIGJveC1zaGFkb3c6CiAgICAgICAgaW5zZXQgMCAxcHggMCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDQpLAogICAgICAgIDAgMCAwIDJweCBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWFjY2VudCkgMTglLCB0cmFuc3BhcmVudCk7Cn0KCi5tanItbWZ2IC5tanItaWNvbi1idG4ubWpyLXBvcGluLWFjdGl2ZSB7CiAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYWNjZW50KSA1OCUsICNmZmZmZmYgNDIlKTsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0yKSA0NSUsIHZhcigtLW1qci1hY2NlbnQpIDU1JSk7CiAgICBjb2xvcjogI2VlZjdmZjsKfQoKLyogLS0gQ29udGVudCB3cmFwcGVyIChob3Jpem9udGFsIGZsZXg6IGNvbnRlbnQgKyBzaWRlYmFyKSAtLS0tLS0tLS0tLS0tLSAqLwoubWpyLW1mdi1jb250ZW50LXdyYXBwZXIgewogICAgZGlzcGxheTogZmxleDsKICAgIGZsZXg6IDE7CiAgICBtaW4taGVpZ2h0OiAwOwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIGNvbnRhaW5lci10eXBlOiBpbmxpbmUtc2l6ZTsKfQoKLyogLS0gU2lkZWJhciBwb3NpdGlvbiB2YXJpYW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi5tanItbWZ2LWNvbnRlbnQtd3JhcHBlcltkYXRhLXNpZGViYXItcG9zPSJsZWZ0Il0gewogICAgZmxleC1kaXJlY3Rpb246IHJvdzsKfQoubWpyLW1mdi1jb250ZW50LXdyYXBwZXJbZGF0YS1zaWRlYmFyLXBvcz0ibGVmdCJdIC5tanItd3Mtc2lkZWJhciB7CiAgICBib3JkZXItbGVmdDogbm9uZTsKICAgIGJvcmRlci1yaWdodDogMXB4IHNvbGlkIHZhcigtLW1qci1ib3JkZXIsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xMikpOwp9Ci5tanItbWZ2LWNvbnRlbnQtd3JhcHBlcltkYXRhLXNpZGViYXItcG9zPSJib3R0b20iXSB7CiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwp9Ci5tanItbWZ2LWNvbnRlbnQtd3JhcHBlcltkYXRhLXNpZGViYXItcG9zPSJib3R0b20iXSAubWpyLXdzLXNpZGViYXIgewogICAgYm9yZGVyLWxlZnQ6IG5vbmU7CiAgICBib3JkZXItdG9wOiAxcHggc29saWQgdmFyKC0tbWpyLWJvcmRlciwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEyKSk7CiAgICB3aWR0aDogMTAwJTsKICAgIGhlaWdodDogMDsKICAgIHRyYW5zaXRpb246CiAgICAgICAgaGVpZ2h0IDAuMnMgZWFzZSwKICAgICAgICB3aWR0aCAwczsKfQoubWpyLW1mdi1jb250ZW50LXdyYXBwZXJbZGF0YS1zaWRlYmFyLXBvcz0iYm90dG9tIl0gLm1qci13cy1zaWRlYmFyLm9wZW4gewogICAgd2lkdGg6IDEwMCU7CiAgICBoZWlnaHQ6IDIyMHB4OwogICAgb3ZlcmZsb3cteTogYXV0bzsKICAgIG1pbi1oZWlnaHQ6IDEyMHB4OwogICAgbWF4LWhlaWdodDogNjUlOwp9CgovKiAtLSBDb250ZW50IGFyZWEgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi5tanItbWZ2LWNvbnRlbnQgewogICAgZmxleDogMTsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICBiYWNrZ3JvdW5kOiAjMGQwZDBkOwogICAgbWluLWhlaWdodDogMDsKfQoKLm1qci1tZnYtZ2VuLXNpZGViYXIgewogICAgZGlzcGxheTogbm9uZTsKICAgIGZsZXg6IDAgMCAzMjBweDsKICAgIHdpZHRoOiAzMjBweDsKICAgIG1pbi13aWR0aDogMjEwcHg7CiAgICBtYXgtd2lkdGg6IG1pbig0MiUsIDQyMHB4KTsKICAgIG92ZXJmbG93LXk6IGF1dG87CiAgICBvdmVyZmxvdy14OiBoaWRkZW47CiAgICBwYWRkaW5nOiAxMHB4OwogICAgYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCB2YXIoLS1tanItYm9yZGVyLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTIpKTsKICAgIGJhY2tncm91bmQ6IHJnYmEoMTgsIDE4LCAyMCwgMC45Nik7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjg4KTsKfQoKLm1qci1tZnYtZ2VuLXNpZGViYXIub3BlbiB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgIGdhcDogMTBweDsKfQoKLm1qci1tZnYtY29udGVudC13cmFwcGVyW2RhdGEtc2lkZWJhci1wb3M9ImxlZnQiXSAubWpyLW1mdi1nZW4tc2lkZWJhciB7CiAgICBib3JkZXItbGVmdDogMXB4IHNvbGlkIHZhcigtLW1qci1ib3JkZXIsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xMikpOwogICAgYm9yZGVyLXJpZ2h0OiBub25lOwp9CgoubWpyLW1mdi1jb250ZW50LXdyYXBwZXJbZGF0YS1zaWRlYmFyLXBvcz0iYm90dG9tIl0gLm1qci1tZnYtZ2VuLXNpZGViYXIgewogICAgZmxleDogMCAwIGNsYW1wKDE5MHB4LCAzMiUsIDI4MHB4KTsKICAgIHdpZHRoOiAxMDAlOwogICAgbWF4LXdpZHRoOiBub25lOwogICAgbWluLXdpZHRoOiAwOwogICAgbWF4LWhlaWdodDogNDYlOwogICAgYm9yZGVyLWxlZnQ6IG5vbmU7CiAgICBib3JkZXItdG9wOiAxcHggc29saWQgdmFyKC0tbWpyLWJvcmRlciwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEyKSk7Cn0KCi5tanItbWZ2LWdlbi1zaWRlYmFyLXRpdGxlIHsKICAgIGZvbnQtc2l6ZTogMTJweDsKICAgIGZvbnQtd2VpZ2h0OiA3MDA7CiAgICBsZXR0ZXItc3BhY2luZzogMDsKICAgIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuOTQpOwp9CgoubWpyLW1mdi1nZW4tc2lkZWJhci1zZWN0aW9uIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgZ2FwOiA2cHg7CiAgICBwYWRkaW5nLXRvcDogOHB4OwogICAgYm9yZGVyLXRvcDogMXB4IHNvbGlkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xKTsKfQoKLm1qci1tZnYtZ2VuLXNpZGViYXItc2VjdGlvbjpmaXJzdC1vZi10eXBlIHsKICAgIHBhZGRpbmctdG9wOiAwOwogICAgYm9yZGVyLXRvcDogbm9uZTsKfQoKLm1qci1tZnYtZ2VuLXNpZGViYXItaGVhZGluZyB7CiAgICBmb250LXNpemU6IDExcHg7CiAgICBmb250LXdlaWdodDogNzAwOwogICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC43Mik7Cn0KCi5tanItbWZ2LWdlbi1zaWRlYmFyLWJvZHkgewogICAgZGlzcGxheTogZmxleDsKICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICBnYXA6IDEwcHg7CiAgICBmb250LXNpemU6IDEycHg7CiAgICBsaW5lLWhlaWdodDogMS40NTsKICAgIHdvcmQtYnJlYWs6IGJyZWFrLXdvcmQ7Cn0KCi5tanItbWZ2LWNvbnRlbnQtd3JhcHBlcltkYXRhLXNpZGViYXItcG9zPSJib3R0b20iXSAubWpyLW1mdi1nZW4tc2lkZWJhci5vcGVuIHsKICAgIGdhcDogNnB4Owp9CgoubWpyLW1mdi1jb250ZW50LXdyYXBwZXJbZGF0YS1zaWRlYmFyLXBvcz0iYm90dG9tIl0gLm1qci1tZnYtZ2VuLXNpZGViYXItdGl0bGUgewogICAgZmxleDogMCAwIGF1dG87Cn0KCi5tanItbWZ2LWNvbnRlbnQtd3JhcHBlcltkYXRhLXNpZGViYXItcG9zPSJib3R0b20iXSAubWpyLW1mdi1nZW4tc2lkZWJhci1zZWN0aW9uIHsKICAgIGZsZXg6IDAgMCBhdXRvOwogICAgbWluLWhlaWdodDogYXV0bzsKICAgIHBhZGRpbmctdG9wOiA0cHg7Cn0KCi5tanItbWZ2LWNvbnRlbnQtd3JhcHBlcltkYXRhLXNpZGViYXItcG9zPSJib3R0b20iXSAubWpyLW1mdi1nZW4tc2lkZWJhci1oZWFkaW5nIHsKICAgIGRpc3BsYXk6IG5vbmU7Cn0KCi5tanItbWZ2LWNvbnRlbnQtd3JhcHBlcltkYXRhLXNpZGViYXItcG9zPSJib3R0b20iXSAubWpyLW1mdi1nZW4tc2lkZWJhci1ib2R5IHsKICAgIGRpc3BsYXk6IGJsb2NrOwogICAgY29sdW1uczogMyAxNzBweDsKICAgIGNvbHVtbi1nYXA6IDEwcHg7CiAgICBjb2x1bW4tZmlsbDogYmFsYW5jZTsKICAgIG1pbi1oZWlnaHQ6IGF1dG87CiAgICBvdmVyZmxvdy14OiBoaWRkZW47CiAgICBvdmVyZmxvdy15OiB2aXNpYmxlOwogICAgcGFkZGluZy1yaWdodDogMnB4OwogICAgc2Nyb2xsYmFyLXdpZHRoOiB0aGluOwp9CgoubWpyLW1mdi1jb250ZW50LXdyYXBwZXJbZGF0YS1zaWRlYmFyLXBvcz0iYm90dG9tIl0gLm1qci1tZnYtZ2VuLXNpZGViYXItYm9keSA+ICogewogICAgZGlzcGxheTogZmxleDsKICAgIGJyZWFrLWluc2lkZTogYXZvaWQ7CiAgICBwYWdlLWJyZWFrLWluc2lkZTogYXZvaWQ7CiAgICBtaW4td2lkdGg6IDA7CiAgICBtaW4taGVpZ2h0OiAwOwogICAgbWFyZ2luLWJsb2NrOiAwIDEwcHg7Cn0KCi5tanItbWZ2LWdlbi10aW1lLWJhZGdlIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOwogICAgZ2FwOiAxMnB4OwogICAgcGFkZGluZzogOHB4IDEwcHg7CiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDIyNCwgMjU1LCAxMjIsIDAuNDIpOwogICAgYm9yZGVyLXJhZGl1czogOTk5cHg7CiAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoMTM1ZGVnLCByZ2JhKDIyNCwgMjU1LCAxMjIsIDAuMTYpLCByZ2JhKDc2LCAxNzUsIDgwLCAwLjEpKTsKICAgIGJveC1zaGFkb3c6IDAgMCAwIDFweCByZ2JhKDIyNCwgMjU1LCAxMjIsIDAuMTIpIGluc2V0OwogICAgY3Vyc29yOiBjb3B5OwogICAgdHJhbnNpdGlvbjoKICAgICAgICBiYWNrZ3JvdW5kIDAuMTZzIGVhc2UsCiAgICAgICAgYm9yZGVyLWNvbG9yIDAuMTZzIGVhc2UsCiAgICAgICAgYm94LXNoYWRvdyAwLjE2cyBlYXNlOwp9CgoubWpyLW1mdi1jb250ZW50LXdyYXBwZXJbZGF0YS1zaWRlYmFyLXBvcz0iYm90dG9tIl0gLm1qci1tZnYtZ2VuLXRpbWUtYmFkZ2UgewogICAgYWxpZ24taXRlbXM6IHN0cmV0Y2g7CiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOwogICAgYm9yZGVyLXJhZGl1czogNnB4Owp9CgoubWpyLW1mdi1nZW4tdGltZS1sYWJlbCB7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjcyKTsKICAgIGZvbnQtc2l6ZTogMTBweDsKICAgIGZvbnQtd2VpZ2h0OiA3MDA7CiAgICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOwogICAgbGV0dGVyLXNwYWNpbmc6IDAuNXB4Owp9CgoubWpyLW1mdi1nZW4tdGltZS12YWx1ZSB7CiAgICBjb2xvcjogI2UwZmY3YTsKICAgIGZvbnQtc2l6ZTogMTNweDsKICAgIGZvbnQtd2VpZ2h0OiA4MDA7CiAgICBmb250LWZhbWlseTogQ29uc29sYXMsIE1vbmFjbywgbW9ub3NwYWNlOwp9CgoubWpyLW1mdi1nZW4tY2FyZCB7CiAgICAtLW1qci1tZnYtZ2VuLWFjY2VudDogIzIxOTZmMzsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgZ2FwOiA4cHg7CiAgICBwYWRkaW5nOiAxMnB4OwogICAgYm9yZGVyOiAxcHggc29saWQgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1tZnYtZ2VuLWFjY2VudCkgNDUlLCB0cmFuc3BhcmVudCk7CiAgICBib3JkZXItcmFkaXVzOiA2cHg7CiAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoCiAgICAgICAgMTM1ZGVnLAogICAgICAgIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItbWZ2LWdlbi1hY2NlbnQpIDE2JSwgdHJhbnNwYXJlbnQpIDAlLAogICAgICAgIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItbWZ2LWdlbi1hY2NlbnQpIDglLCB0cmFuc3BhcmVudCkgMTAwJQogICAgKTsKICAgIGJveC1zaGFkb3c6IDAgMCAwIDFweCBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLW1mdi1nZW4tYWNjZW50KSAxNCUsIHRyYW5zcGFyZW50KSBpbnNldDsKICAgIGN1cnNvcjogY29weTsKICAgIHRyYW5zaXRpb246CiAgICAgICAgYmFja2dyb3VuZCAwLjE2cyBlYXNlLAogICAgICAgIGJvcmRlci1jb2xvciAwLjE2cyBlYXNlLAogICAgICAgIGJveC1zaGFkb3cgMC4xNnMgZWFzZTsKfQoKLm1qci1tZnYtY29udGVudC13cmFwcGVyW2RhdGEtc2lkZWJhci1wb3M9ImJvdHRvbSJdIC5tanItbWZ2LWdlbi1jYXJkIHsKICAgIG1pbi1oZWlnaHQ6IDA7CiAgICBwYWRkaW5nOiAxMHB4Owp9CgoubWpyLW1mdi1jb250ZW50LXdyYXBwZXJbZGF0YS1zaWRlYmFyLXBvcz0iYm90dG9tIl0gLm1qci1tZnYtZ2VuLWNhcmQtLXBvc2l0aXZlLXByb21wdCwKLm1qci1tZnYtY29udGVudC13cmFwcGVyW2RhdGEtc2lkZWJhci1wb3M9ImJvdHRvbSJdIC5tanItbWZ2LWdlbi1jYXJkLS1uZWdhdGl2ZS1wcm9tcHQsCi5tanItbWZ2LWNvbnRlbnQtd3JhcHBlcltkYXRhLXNpZGViYXItcG9zPSJib3R0b20iXSAubWpyLW1mdi1nZW4tY2FyZC0tcHJvbXB0IHsKICAgIG1pbi1oZWlnaHQ6IDExMHB4Owp9CgoubWpyLW1mdi1jb250ZW50LXdyYXBwZXJbZGF0YS1zaWRlYmFyLXBvcz0iYm90dG9tIl0gLm1qci1tZnYtZ2VuLWNhcmQtLXdvcmtmbG93IHsKICAgIG1pbi1oZWlnaHQ6IDU4cHg7Cn0KCi5tanItbWZ2LWNvbnRlbnQtd3JhcHBlcltkYXRhLXNpZGViYXItcG9zPSJib3R0b20iXSAubWpyLW1mdi1nZW4tY2FyZC0tbW9kZWwtYW5kLWxvcmEsCi5tanItbWZ2LWNvbnRlbnQtd3JhcHBlcltkYXRhLXNpZGViYXItcG9zPSJib3R0b20iXSAubWpyLW1mdi1nZW4tY2FyZC0tbW9kZWxzLAoubWpyLW1mdi1jb250ZW50LXdyYXBwZXJbZGF0YS1zaWRlYmFyLXBvcz0iYm90dG9tIl0gLm1qci1tZnYtZ2VuLWNhcmQtLXNhbXBsaW5nLAoubWpyLW1mdi1jb250ZW50LXdyYXBwZXJbZGF0YS1zaWRlYmFyLXBvcz0iYm90dG9tIl0gLm1qci1tZnYtZ2VuLWNhcmQtLWdlbmVyYXRpb24tcGlwZWxpbmUsCi5tanItbWZ2LWNvbnRlbnQtd3JhcHBlcltkYXRhLXNpZGViYXItcG9zPSJib3R0b20iXSAubWpyLW1mdi1nZW4tY2FyZC0tdGV4dC10by1pbWFnZSwKLm1qci1tZnYtY29udGVudC13cmFwcGVyW2RhdGEtc2lkZWJhci1wb3M9ImJvdHRvbSJdIC5tanItbWZ2LWdlbi1jYXJkLS1pbWFnZS10by1pbWFnZSwKLm1qci1tZnYtY29udGVudC13cmFwcGVyW2RhdGEtc2lkZWJhci1wb3M9ImJvdHRvbSJdIC5tanItbWZ2LWdlbi1jYXJkLS1pbnBhaW50LAoubWpyLW1mdi1jb250ZW50LXdyYXBwZXJbZGF0YS1zaWRlYmFyLXBvcz0iYm90dG9tIl0gLm1qci1tZnYtZ2VuLWNhcmQtLXVwc2NhbGUsCi5tanItbWZ2LWNvbnRlbnQtd3JhcHBlcltkYXRhLXNpZGViYXItcG9zPSJib3R0b20iXSAubWpyLW1mdi1nZW4tY2FyZC0tcmVmaW5lIHsKICAgIG1pbi1oZWlnaHQ6IDg2cHg7Cn0KCi5tanItbWZ2LWdlbi1jYXJkLS1zZWVkIHsKICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOwogICAgYm9yZGVyLXdpZHRoOiAycHg7Cn0KCi5tanItbWZ2LWdlbi1jYXJkLS1jb21wYWN0IHsKICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOwogICAgZ2FwOiAxMnB4Owp9CgoubWpyLW1mdi1jb250ZW50LXdyYXBwZXJbZGF0YS1zaWRlYmFyLXBvcz0iYm90dG9tIl0gLm1qci1tZnYtZ2VuLWNhcmQtLWNvbXBhY3QgewogICAgYWxpZ24taXRlbXM6IHN0cmV0Y2g7CiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOwp9CgoubWpyLW1mdi1nZW4tY2FyZC0tY29tcGFjdCAubWpyLW1mdi1nZW4tY2FyZC10aXRsZSwKLm1qci1tZnYtZ2VuLWNhcmQtLWNvbXBhY3QgLm1qci1tZnYtZ2VuLWNhcmQtdmFsdWUgewogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKfQoKLm1qci1tZnYtZ2VuLWNhcmQ6aG92ZXIsCi5tanItbWZ2LWdlbi10aW1lLWJhZGdlOmhvdmVyIHsKICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1tZnYtZ2VuLWFjY2VudCwgI2UwZmY3YSkgNzAlLCB0cmFuc3BhcmVudCk7CiAgICBib3gtc2hhZG93OiAwIDAgMCAxcHggY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1tZnYtZ2VuLWFjY2VudCwgI2UwZmY3YSkgMjQlLCB0cmFuc3BhcmVudCkKICAgICAgICBpbnNldDsKfQoKLm1qci1tZnYtZ2VuLWNvcHktZmxhc2ggewogICAgYmFja2dyb3VuZDogcmdiYSg3NiwgMTc1LCA4MCwgMC4yOCkgIWltcG9ydGFudDsKfQoKLm1qci1tZnYtZ2VuLWNhcmQtdGl0bGUgewogICAgY29sb3I6IHZhcigtLW1qci1tZnYtZ2VuLWFjY2VudCk7CiAgICBmb250LXNpemU6IDExcHg7CiAgICBmb250LXdlaWdodDogNzAwOwogICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKICAgIGxldHRlci1zcGFjaW5nOiAwLjVweDsKfQoKLm1qci1tZnYtZ2VuLWNhcmQtdmFsdWUgewogICAgY29sb3I6IHZhcigtLWZnLWNvbG9yLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuOTIpKTsKICAgIGZvbnQtc2l6ZTogMTJweDsKICAgIG1pbi13aWR0aDogMDsKICAgIHdvcmQtYnJlYWs6IGJyZWFrLXdvcmQ7Cn0KCi5tanItbWZ2LWNvbnRlbnQtd3JhcHBlcltkYXRhLXNpZGViYXItcG9zPSJib3R0b20iXSAubWpyLW1mdi1nZW4tY2FyZC12YWx1ZSB7CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgZGlzcGxheTogLXdlYmtpdC1ib3g7CiAgICAtd2Via2l0LWxpbmUtY2xhbXA6IDU7CiAgICAtd2Via2l0LWJveC1vcmllbnQ6IHZlcnRpY2FsOwp9CgoubWpyLW1mdi1nZW4tY2FyZC12YWx1ZS5pcy1jb21wYWN0IHsKICAgIHRleHQtYWxpZ246IHJpZ2h0OwogICAgZm9udC13ZWlnaHQ6IDcwMDsKfQoKLm1qci1tZnYtY29udGVudC13cmFwcGVyW2RhdGEtc2lkZWJhci1wb3M9ImJvdHRvbSJdIC5tanItbWZ2LWdlbi1jYXJkLXZhbHVlLmlzLWNvbXBhY3QgewogICAgdGV4dC1hbGlnbjogbGVmdDsKfQoKLm1qci1tZnYtZ2VuLWNhcmQtdmFsdWUuaXMtbXVsdGlsaW5lIHsKICAgIHdoaXRlLXNwYWNlOiBwcmUtd3JhcDsKfQoKLm1qci1tZnYtZ2VuLWNhcmQtLXNlZWQgLm1qci1tZnYtZ2VuLWNhcmQtdmFsdWUgewogICAgZm9udC1zaXplOiAxOHB4OwogICAgZm9udC13ZWlnaHQ6IDcwMDsKICAgIGZvbnQtZmFtaWx5OiBDb25zb2xhcywgTW9uYWNvLCBtb25vc3BhY2U7CiAgICBsZXR0ZXItc3BhY2luZzogMXB4OwogICAgY29sb3I6ICNmZmY7Cn0KCi5tanItbWZ2LWdlbi1jYXJkLXZhbHVlLmlzLWZpZWxkcyB7CiAgICBkaXNwbGF5OiBncmlkOwogICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiAxZnI7CiAgICBnYXA6IDhweDsKfQoKLm1qci1tZnYtY29udGVudC13cmFwcGVyW2RhdGEtc2lkZWJhci1wb3M9ImJvdHRvbSJdIC5tanItbWZ2LWdlbi1jYXJkLXZhbHVlLmlzLWZpZWxkcyB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgIGdhcDogN3B4OwogICAgLXdlYmtpdC1saW5lLWNsYW1wOiB1bnNldDsKfQoKLm1qci1tZnYtZ2VuLWNhcmQtdmFsdWUuaXMtYnJhbmNoLWdyb3VwcyB7CiAgICBnYXA6IDEwcHg7Cn0KCi5tanItbWZ2LWdlbi1icmFuY2gtZ3JvdXAgewogICAgZGlzcGxheTogZmxleDsKICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICBnYXA6IDdweDsKICAgIG1pbi13aWR0aDogMDsKICAgIHBhZGRpbmc6IDhweDsKICAgIGJvcmRlci1yYWRpdXM6IDZweDsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xKTsKICAgIGJhY2tncm91bmQ6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wNDUpOwp9CgoubWpyLW1mdi1nZW4tYnJhbmNoLXRpdGxlIHsKICAgIGNvbG9yOiB2YXIoLS1tanItbWZ2LWdlbi1hY2NlbnQpOwogICAgZm9udC1zaXplOiAxMHB4OwogICAgZm9udC13ZWlnaHQ6IDgwMDsKICAgIGxldHRlci1zcGFjaW5nOiAwLjZweDsKICAgIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7Cn0KCi5tanItbWZ2LWdlbi1maWVsZCB7CiAgICBkaXNwbGF5OiBncmlkOwogICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiBtaW5tYXgoNzhweCwgYXV0bykgMWZyOwogICAgZ2FwOiAxMHB4OwogICAgYWxpZ24taXRlbXM6IHN0YXJ0OwogICAgbWluLXdpZHRoOiAwOwp9CgoubWpyLW1mdi1jb250ZW50LXdyYXBwZXJbZGF0YS1zaWRlYmFyLXBvcz0iYm90dG9tIl0gLm1qci1tZnYtZ2VuLWZpZWxkIHsKICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogbWlubWF4KDU0cHgsIGF1dG8pIG1pbm1heCgwLCAxZnIpOwp9CgoubWpyLW1mdi1jb250ZW50LXdyYXBwZXJbZGF0YS1zaWRlYmFyLXBvcz0iYm90dG9tIl0gLm1qci1tZnYtZ2VuLWZpZWxkLXZhbHVlIHsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7Cn0KCi5tanItbWZ2LWdlbi1maWVsZC1sYWJlbCB7CiAgICBjb2xvcjogdmFyKC0tbWpyLW11dGVkLCByZ2JhKDE4MCwgMTgwLCAxODAsIDAuNzIpKTsKICAgIGZvbnQtc2l6ZTogMTFweDsKICAgIGZvbnQtd2VpZ2h0OiA2MDA7Cn0KCi5tanItbWZ2LWdlbi1maWVsZC12YWx1ZSB7CiAgICBjb2xvcjogdmFyKC0tZmctY29sb3IsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC45NSkpOwogICAgbWluLXdpZHRoOiAwOwogICAgd2hpdGUtc3BhY2U6IHByZS13cmFwOwogICAgd29yZC1icmVhazogYnJlYWstd29yZDsKfQoKLm1qci1tZnYtZ2VuLXNpZGViYXItYm9keSBzdHJvbmcgewogICAgZm9udC13ZWlnaHQ6IDYwMDsKICAgIG1hcmdpbi1yaWdodDogNHB4OwogICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC45NSk7Cn0KCi5tanItbWZ2LWdlbi1zaWRlYmFyLWJvZHkgW2RhdGEtZmllbGQ9InByb21wdCJdIHN0cm9uZyB7CiAgICBjb2xvcjogIzdlYzhmZjsKfQoubWpyLW1mdi1nZW4tc2lkZWJhci1ib2R5IFtkYXRhLWZpZWxkPSJzZWVkIl0gc3Ryb25nIHsKICAgIGNvbG9yOiAjZmZkNDdhOwp9Ci5tanItbWZ2LWdlbi1zaWRlYmFyLWJvZHkgW2RhdGEtZmllbGQ9Im1vZGVsIl0gc3Ryb25nIHsKICAgIGNvbG9yOiAjN2RkYThhOwp9Ci5tanItbWZ2LWdlbi1zaWRlYmFyLWJvZHkgW2RhdGEtZmllbGQ9ImxvcmEiXSBzdHJvbmcgewogICAgY29sb3I6ICNkNDhjZmY7Cn0KLm1qci1tZnYtZ2VuLXNpZGViYXItYm9keSBbZGF0YS1maWVsZD0ic2FtcGxlciJdIHN0cm9uZyB7CiAgICBjb2xvcjogI2ZmOWY3YTsKfQoubWpyLW1mdi1nZW4tc2lkZWJhci1ib2R5IFtkYXRhLWZpZWxkPSJzY2hlZHVsZXIiXSBzdHJvbmcgewogICAgY29sb3I6ICNmZjdhOWY7Cn0KLm1qci1tZnYtZ2VuLXNpZGViYXItYm9keSBbZGF0YS1maWVsZD0iY2ZnIl0gc3Ryb25nIHsKICAgIGNvbG9yOiAjN2E5ZmZmOwp9Ci5tanItbWZ2LWdlbi1zaWRlYmFyLWJvZHkgW2RhdGEtZmllbGQ9InN0ZXAiXSBzdHJvbmcgewogICAgY29sb3I6ICM3YWZmZDQ7Cn0KLm1qci1tZnYtZ2VuLXNpZGViYXItYm9keSBbZGF0YS1maWVsZD0iZ2VuVGltZSJdIHN0cm9uZyB7CiAgICBjb2xvcjogI2UwZmY3YTsKfQoKLm1qci1tZnYtZ2VuLXNpZGViYXItYm9keSBkaXYgewogICAgbWFyZ2luLWJvdHRvbTogNXB4Owp9CgoubWpyLW1mdi1jb250ZW50LXdyYXBwZXJbZGF0YS1zaWRlYmFyLXBvcz0iYm90dG9tIl0gLm1qci1tZnYtZ2VuLXNpZGViYXItYm9keSBkaXYgewogICAgbWFyZ2luLWJvdHRvbTogMDsKfQoKLm1qci1tZnYtY29udGVudC13cmFwcGVyW2RhdGEtc2lkZWJhci1wb3M9ImJvdHRvbSJdIC5tanItbWZ2LWdlbi1zaWRlYmFyLWJvZHkgPiBkaXYsCi5tanItbWZ2LWNvbnRlbnQtd3JhcHBlcltkYXRhLXNpZGViYXItcG9zPSJib3R0b20iXSAubWpyLW1mdi1nZW4tc2lkZWJhci1ib2R5ID4gc2VjdGlvbiB7CiAgICBtYXJnaW4tYmxvY2s6IDAgMTBweDsKfQoKLm1qci1tZnYtZ2VuLXNpZGViYXItYm9keSBkaXY6bGFzdC1jaGlsZCB7CiAgICBtYXJnaW4tYm90dG9tOiAwOwp9CgpAY29udGFpbmVyIChtYXgtd2lkdGg6IDc2MHB4KSB7CiAgICAubWpyLW1mdi1jb250ZW50LXdyYXBwZXJbZGF0YS1zaWRlYmFyLXBvcz0iYm90dG9tIl0gLm1qci1tZnYtZ2VuLXNpZGViYXItYm9keSB7CiAgICAgICAgY29sdW1uczogYXV0bzsKICAgICAgICBjb2x1bW4tY291bnQ6IDE7CiAgICAgICAgY29sdW1uLXdpZHRoOiBhdXRvOwogICAgfQoKICAgIC5tanItbWZ2LWNvbnRlbnQtd3JhcHBlcltkYXRhLXNpZGViYXItcG9zPSJib3R0b20iXSAubWpyLW1mdi1nZW4tc2lkZWJhci1ib2R5ID4gKiB7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICB9Cn0KCi5tanItbWZ2LW92ZXJsYXktY2FudmFzIHsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIGluc2V0OiAwOwogICAgd2lkdGg6IDEwMCU7CiAgICBoZWlnaHQ6IDEwMCU7CiAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgIHotaW5kZXg6IDEyOwp9CgoubWpyLW1mdi10b29sYmFyLXNlbGVjdCB7CiAgICBoZWlnaHQ6IDI0cHg7CiAgICBwYWRkaW5nOiAwIDZweDsKICAgIGJvcmRlci1yYWRpdXM6IDZweDsKICAgIGJvcmRlcjogMC44cHggc29saWQgcmdiYSgxOTYsIDIwMiwgMjEwLCAwLjI0KTsKICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgxODBkZWcsIHJnYmEoMjEwLCAyMTQsIDIyMCwgMC4wNiksIHJnYmEoMjEwLCAyMTQsIDIyMCwgMC4wMikpOwogICAgY29sb3I6IHJnYmEoMjMwLCAyMzMsIDIzOCwgMC45Mik7CiAgICBmb250LXNpemU6IDExcHg7CiAgICBvdXRsaW5lOiBub25lOwp9CgoubWpyLW1mdi10b29sYmFyLXJhbmdlIHsKICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogNnB4Owp9CgoubWpyLW1mdi10b29sYmFyLXJhbmdlIGlucHV0W3R5cGU9InJhbmdlIl0gewogICAgd2lkdGg6IDcycHg7CiAgICBhY2NlbnQtY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC44NSk7Cn0KCi5tanItbWZ2LXRvb2xiYXItcmFuZ2Utb3V0IHsKICAgIG1pbi13aWR0aDogMzBweDsKICAgIHRleHQtYWxpZ246IHJpZ2h0OwogICAgZm9udC1zaXplOiAxMXB4OwogICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC45KTsKfQoKLyogRVYgc2xpZGVyIGFjdGl2ZSBzdGF0ZSAodmFsdWUgIT0gMCkgKi8KLm1qci1tZnYtdG9vbGJhci1yYW5nZS5pcy1hY3RpdmUgaW5wdXRbdHlwZT0icmFuZ2UiXSB7CiAgICBhY2NlbnQtY29sb3I6ICNmNWM4NDI7Cn0KLm1qci1tZnYtdG9vbGJhci1yYW5nZS5pcy1hY3RpdmUgLm1qci1tZnYtdG9vbGJhci1yYW5nZS1vdXQgewogICAgY29sb3I6ICNmNWM4NDI7CiAgICBmb250LXdlaWdodDogNjAwOwp9CgoubWpyLW1mdi1tZWRpYS1wcm9ncmVzcyB7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICB0b3A6IDEwcHg7CiAgICBsZWZ0OiAxMHB4OwogICAgei1pbmRleDogNjsKICAgIG1heC13aWR0aDogY2FsYygxMDAlIC0gMjBweCk7CiAgICBwYWRkaW5nOiA1cHggOXB4OwogICAgYm9yZGVyLXJhZGl1czogNnB4OwogICAgYm9yZGVyOiAxcHggc29saWQKICAgICAgICBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWJvcmRlciwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE4KSkgODglLCB0cmFuc3BhcmVudCk7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgcmdiYSg1LCA4LCAxNCwgMC44NikgODYlLCB2YXIoLS1tanItc3VyZmFjZS0wLCAjMTExKSAxNCUpOwogICAgY29sb3I6IHZhcigtLWNvbnRlbnQtZmcsICNmNWY3ZmEpOwogICAgYm94LXNoYWRvdzogMCAycHggMTBweCByZ2JhKDAsIDAsIDAsIDAuMjgpOwogICAgYmFja2Ryb3AtZmlsdGVyOiBibHVyKDZweCk7CiAgICAtd2Via2l0LWJhY2tkcm9wLWZpbHRlcjogYmx1cig2cHgpOwogICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICBvcGFjaXR5OiAwOwogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC00cHgpOwogICAgdHJhbnNpdGlvbjoKICAgICAgICBvcGFjaXR5IDAuMTZzIGVhc2UsCiAgICAgICAgdHJhbnNmb3JtIDAuMTZzIGVhc2U7Cn0KCi5tanItbWZ2LW1lZGlhLXByb2dyZXNzLmlzLXZpc2libGUgewogICAgb3BhY2l0eTogMTsKICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgwKTsKfQoKLm1qci1tZnYtbWVkaWEtcHJvZ3Jlc3MuaXMtZXJyb3IgewogICAgYm9yZGVyLWNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN0YXR1cy1lcnJvciwgI2ZmNWM3YSkgNzIlLCB0cmFuc3BhcmVudCk7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgcmdiYSg2MCwgMTAsIDE4LCAwLjkpIDgyJSwgdmFyKC0tbWpyLXN1cmZhY2UtMCwgIzExMSkgMTglKTsKfQoKLm1qci1tZnYtbWVkaWEtcHJvZ3Jlc3MtdGV4dCB7CiAgICBkaXNwbGF5OiBibG9jazsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICBmb250LXNpemU6IDExcHg7CiAgICBmb250LXdlaWdodDogNjAwOwogICAgbGluZS1oZWlnaHQ6IDEuMjsKfQoKLyogLS0gV29ya2Zsb3cgU2lkZWJhciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoubWpyLXdzLXNpZGViYXIgewogICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgZGlzcGxheTogZmxleDsKICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICB3aWR0aDogMDsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1tanItc3VyZmFjZS0xLCAjMmEyYTJhKTsKICAgIGJvcmRlci1sZWZ0OiAxcHggc29saWQgdmFyKC0tbWpyLWJvcmRlciwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEyKSk7CiAgICB0cmFuc2l0aW9uOiB3aWR0aCAwLjJzIGVhc2U7CiAgICBmbGV4LXNocmluazogMDsKfQoKLm1qci13cy1zaWRlYmFyLm9wZW4gewogICAgd2lkdGg6IDI2MHB4OwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIG1pbi13aWR0aDogMTgwcHg7CiAgICBtYXgtd2lkdGg6IDY1JTsKICAgIHRyYW5zaXRpb246IG5vbmU7Cn0KCi5tanItd3Mtc2lkZWJhci1oZWFkZXIgewogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47CiAgICBwYWRkaW5nOiA2cHggMTBweDsKICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCB2YXIoLS1tanItYm9yZGVyLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTIpKTsKICAgIGZsZXgtc2hyaW5rOiAwOwogICAgbWluLWhlaWdodDogMzRweDsKfQoubWpyLXdzLXNpZGViYXItdGl0bGUgewogICAgZm9udC1zaXplOiAxMXB4OwogICAgZm9udC13ZWlnaHQ6IDYwMDsKICAgIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7CiAgICBsZXR0ZXItc3BhY2luZzogMC41cHg7CiAgICBvcGFjaXR5OiAwLjY1Owp9Ci5tanItd3Mtc2lkZWJhci1ib2R5IHsKICAgIGZsZXg6IDE7CiAgICBtaW4taGVpZ2h0OiAwOwogICAgb3ZlcmZsb3cteTogYXV0bzsKICAgIHBhZGRpbmc6IDA7Cn0KLm1qci13cy1zaWRlYmFyLWVtcHR5IHsKICAgIHBhZGRpbmc6IDI0cHggMTZweDsKICAgIHRleHQtYWxpZ246IGNlbnRlcjsKICAgIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMjUpOwogICAgZm9udC1zaXplOiAxMXB4OwogICAgbGluZS1oZWlnaHQ6IDEuNTsKfQoKLyogLS0gVGFiIGJhciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLm1qci13cy10YWItYmFyIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBmbGV4LXNocmluazogMDsKICAgIGdhcDogMnB4OwogICAgcGFkZGluZzogNHB4IDhweDsKICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCB2YXIoLS1tanItYm9yZGVyLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTIpKTsKICAgIGJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgMC4xOCk7Cn0KCi5tanItd3MtdGFiIHsKICAgIGZsZXg6IDE7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgZ2FwOiA1cHg7CiAgICBwYWRkaW5nOiA0cHggOHB4OwogICAgYm9yZGVyOiBub25lOwogICAgYm9yZGVyLXJhZGl1czogNHB4OwogICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjQ1KTsKICAgIGZvbnQtc2l6ZTogMTFweDsKICAgIGZvbnQtd2VpZ2h0OiA1MDA7CiAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICB0cmFuc2l0aW9uOgogICAgICAgIGJhY2tncm91bmQgMC4xNXMsCiAgICAgICAgY29sb3IgMC4xNXM7Cn0KCi5tanItd3MtdGFiOmhvdmVyIHsKICAgIGJhY2tncm91bmQ6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wNyk7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjc1KTsKfQoKLm1qci13cy10YWIuaXMtYWN0aXZlIHsKICAgIGJhY2tncm91bmQ6IHJnYmEoOTksIDE1NSwgMjU1LCAwLjE1KTsKICAgIGNvbG9yOiAjNjM5YmZmOwp9CgovKiAtLSBOb2RlcyB0YWIgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoubWpyLXdzLW5vZGVzLXRhYiB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgIGZsZXg6IDE7CiAgICBtaW4taGVpZ2h0OiAwOwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKfQoKLyogR3JhcGggTWFwIHRhYiAqLwoubWpyLXdnbSB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgIG1pbi1oZWlnaHQ6IDEwMCU7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjgyKTsKfQoKLm1qci13Z20tbWFwLXdyYXAgewogICAgaGVpZ2h0OiAxOTBweDsKICAgIG1pbi1oZWlnaHQ6IDE1MHB4OwogICAgbWFyZ2luOiA4cHg7CiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTIpOwogICAgYm9yZGVyLXJhZGl1czogNnB4OwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIGJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgMC4yMik7Cn0KCi5tanItd2dtLXByZXZpZXcgewogICAgd2lkdGg6IDEwMCU7CiAgICBoZWlnaHQ6IDEwMCU7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjMyKTsKfQoKLm1qci13Z20tcHJldmlldyAubWpyLW1mdi1tZWRpYSwKLm1qci13Z20tcHJldmlldyAubWpyLW1mdi1wbGF5ZXItaG9zdCwKLm1qci13Z20tcHJldmlldyAubWpyLW1vZGVsM2QtaG9zdCwKLm1qci13Z20tcHJldmlldy1tZWRpYSB7CiAgICBtYXgtd2lkdGg6IDEwMCU7CiAgICBtYXgtaGVpZ2h0OiAxMDAlOwogICAgd2lkdGg6IDEwMCU7CiAgICBoZWlnaHQ6IDEwMCU7CiAgICBvYmplY3QtZml0OiBjb250YWluOwp9CgoubWpyLXdnbS1wcmV2aWV3LWVtcHR5IHsKICAgIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMzQpOwogICAgZm9udC1zaXplOiAxMXB4Owp9CgoubWpyLXdnbS1jYW52YXMgewogICAgZGlzcGxheTogYmxvY2s7CiAgICB3aWR0aDogMTAwJTsKICAgIGhlaWdodDogMTAwJTsKICAgIGN1cnNvcjogZ3JhYjsKICAgIHRvdWNoLWFjdGlvbjogbm9uZTsKfQoKLm1qci13Z20tY2FudmFzOmFjdGl2ZSB7CiAgICBjdXJzb3I6IGdyYWJiaW5nOwp9CgoubWpyLXdnbS0tbGFyZ2UgewogICAgd2lkdGg6IDEwMCU7CiAgICBoZWlnaHQ6IDEwMCU7CiAgICBtaW4taGVpZ2h0OiAwOwogICAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjE4KTsKfQoKLm1qci13Z20tLWxhcmdlIC5tanItd2dtLW1hcC13cmFwIHsKICAgIGZsZXg6IDE7CiAgICBoZWlnaHQ6IGF1dG87CiAgICBtaW4taGVpZ2h0OiAwOwogICAgbWFyZ2luOiAwOwogICAgYm9yZGVyOiBub25lOwogICAgYm9yZGVyLXJhZGl1czogMDsKfQoKLm1qci13Z20tLWxhcmdlIC5tanItd2dtLXN0YXR1cyB7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICBsZWZ0OiAxMHB4OwogICAgdG9wOiAxMHB4OwogICAgei1pbmRleDogMjsKICAgIG1heC13aWR0aDogbWluKDQyMHB4LCBjYWxjKDEwMCUgLSAyMHB4KSk7CiAgICBwYWRkaW5nOiA1cHggOHB4OwogICAgYm9yZGVyLXJhZGl1czogNXB4OwogICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEyKTsKICAgIGJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgMC41Mik7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjc0KTsKICAgIGJhY2tkcm9wLWZpbHRlcjogYmx1cig4cHgpOwp9CgoubWpyLXdnbS10b29sYmFyIHsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIGxlZnQ6IDEwcHg7CiAgICB0b3A6IDQ2cHg7CiAgICB6LWluZGV4OiAyOwogICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICBnYXA6IDZweDsKICAgIG1heC13aWR0aDogbWluKDQyMHB4LCBjYWxjKDEwMCUgLSAyMHB4KSk7Cn0KCi5tanItd2dtLW1vZGUgewogICAgbWluLWhlaWdodDogMjZweDsKICAgIHBhZGRpbmc6IDNweCA4cHg7CiAgICBib3JkZXItcmFkaXVzOiA5OTlweDsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xMik7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIDAuNSk7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjcyKTsKICAgIGZvbnQtc2l6ZTogMTBweDsKICAgIGN1cnNvcjogcG9pbnRlcjsKfQoKLm1qci13Z20tbW9kZTpob3ZlciB7CiAgICBib3JkZXItY29sb3I6IHJnYmEoMTQ5LCAxODMsIDI1NSwgMC40NSk7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjkpOwp9CgoubWpyLXdnbS1tb2RlLmlzLWFjdGl2ZSB7CiAgICBib3JkZXItY29sb3I6IHJnYmEoMTI0LCAxODYsIDI1NSwgMC42Mik7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDc5LCAxMjMsIDIxNCwgMC4yNik7CiAgICBjb2xvcjogcmdiYSgyMzUsIDI0NSwgMjU1LCAwLjk2KTsKfQoKLm1qci13Z20tLWxhcmdlIC5tanItd2dtLWRldGFpbHMgewogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgcmlnaHQ6IDEwcHg7CiAgICB0b3A6IDEwcHg7CiAgICBib3R0b206IDEwcHg7CiAgICB6LWluZGV4OiAyOwogICAgd2lkdGg6IG1pbigzMjBweCwgMzglKTsKICAgIG92ZXJmbG93LXk6IGF1dG87CiAgICBwYWRkaW5nOiAxMHB4OwogICAgYm9yZGVyLXJhZGl1czogNnB4OwogICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEyKTsKICAgIGJhY2tncm91bmQ6IHJnYmEoMTgsIDIwLCAyNiwgMC44NCk7CiAgICBiYWNrZHJvcC1maWx0ZXI6IGJsdXIoMTBweCk7Cn0KCi5tanItd2dtLS1sYXJnZSAubWpyLXdnbS1hY3Rpb24gewogICAgbWluLWhlaWdodDogMzBweDsKfQoKLm1qci13Z20tLWxhcmdlIC5tanItd2dtLXBhcmFtIHsKICAgIGZvbnQtc2l6ZTogMTFweDsKfQoKLm1qci13Z20tc3RhdHVzIHsKICAgIHBhZGRpbmc6IDAgMTBweCA4cHg7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjQyKTsKICAgIGZvbnQtc2l6ZTogMTBweDsKICAgIGxpbmUtaGVpZ2h0OiAxLjM1Owp9CgoubWpyLXdnbS1kZXRhaWxzIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgZ2FwOiA2cHg7CiAgICBwYWRkaW5nOiAwIDhweCAxMHB4Owp9CgoubWpyLXdnbS1ub2RlLXRpdGxlIHsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICBmb250LXNpemU6IDEycHg7CiAgICBmb250LXdlaWdodDogNzAwOwogICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC45KTsKfQoKLm1qci13Z20tbm9kZS1tZXRhIHsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICBtYXJnaW4tdG9wOiAtNHB4OwogICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC40Mik7CiAgICBmb250LXNpemU6IDEwcHg7Cn0KCi5tanItd2dtLWJyZWFkY3J1bWIgewogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBnYXA6IDVweDsKICAgIG1pbi13aWR0aDogMDsKICAgIG1hcmdpbjogLTJweCAwIDJweDsKICAgIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNTgpOwogICAgZm9udC1zaXplOiAxMXB4Owp9CgoubWpyLXdnbS1icmVhZGNydW1iLWl0ZW0gewogICAgbWluLXdpZHRoOiAwOwogICAgbWF4LXdpZHRoOiAxNDBweDsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7Cn0KCi5tanItd2dtLWJyZWFkY3J1bWItc2VwIHsKICAgIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMzIpOwp9CgoubWpyLXdnbS1hY3Rpb25zIHsKICAgIGRpc3BsYXk6IGdyaWQ7CiAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IDFmcjsKICAgIGdhcDogNHB4Owp9CgoubWpyLXdnbS1hY3Rpb24gewogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBnYXA6IDdweDsKICAgIG1pbi1oZWlnaHQ6IDI4cHg7CiAgICBwYWRkaW5nOiA1cHggOHB4OwogICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEyKTsKICAgIGJvcmRlci1yYWRpdXM6IDVweDsKICAgIGJhY2tncm91bmQ6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wNCk7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjc2KTsKICAgIGZvbnQtc2l6ZTogMTFweDsKICAgIGN1cnNvcjogcG9pbnRlcjsKfQoKLm1qci13Z20tYWN0aW9uOmhvdmVyIHsKICAgIGJvcmRlci1jb2xvcjogcmdiYSg5OSwgMTU1LCAyNTUsIDAuNDUpOwogICAgYmFja2dyb3VuZDogcmdiYSg5OSwgMTU1LCAyNTUsIDAuMTIpOwogICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC45Mik7Cn0KCi5tanItd2dtLWFjdGlvbi5pcy1vayB7CiAgICBib3JkZXItY29sb3I6IHJnYmEoNzYsIDE3NSwgODAsIDAuNTUpOwogICAgY29sb3I6IHJnYmEoMTkwLCAyNTUsIDE5NiwgMC45Nik7Cn0KCi5tanItd2dtLXBhcmFtcyB7CiAgICBkaXNwbGF5OiBncmlkOwogICAgZ2FwOiA0cHg7CiAgICBtYXJnaW4tdG9wOiAycHg7Cn0KCi5tanItd2dtLXBhcmFtIHsKICAgIGRpc3BsYXk6IGdyaWQ7CiAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IG1pbm1heCg2NHB4LCAwLjQyZnIpIG1pbm1heCgwLCAxZnIpOwogICAgZ2FwOiA4cHg7CiAgICBwYWRkaW5nOiA1cHggN3B4OwogICAgYm9yZGVyLXJhZGl1czogNHB4OwogICAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjE4KTsKICAgIGZvbnQtc2l6ZTogMTBweDsKICAgIGxpbmUtaGVpZ2h0OiAxLjM1OwogICAgY3Vyc29yOiBwb2ludGVyOwogICAgYm9yZGVyOiAxcHggc29saWQgdHJhbnNwYXJlbnQ7CiAgICB0cmFuc2l0aW9uOgogICAgICAgIGJhY2tncm91bmQgMTIwbXMgZWFzZSwKICAgICAgICBib3JkZXItY29sb3IgMTIwbXMgZWFzZTsKfQoKLm1qci13Z20tcGFyYW06aG92ZXIsCi5tanItd2dtLXBhcmFtOmZvY3VzLXZpc2libGUgewogICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA4KTsKICAgIGJvcmRlci1jb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE4KTsKICAgIG91dGxpbmU6IG5vbmU7Cn0KCi5tanItd2dtLXBhcmFtLmlzLW9rIHsKICAgIGJvcmRlci1jb2xvcjogcmdiYSg3OSwgMjEwLCAxMjUsIDAuNyk7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDc5LCAyMTAsIDEyNSwgMC4xNik7Cn0KCi5tanItd2dtLXBhcmFtLmlzLWVycm9yIHsKICAgIGJvcmRlci1jb2xvcjogcmdiYSgyNTUsIDkwLCA5MCwgMC43KTsKICAgIGJhY2tncm91bmQ6IHJnYmEoMjU1LCA5MCwgOTAsIDAuMTYpOwp9CgoubWpyLXdnbS1wYXJhbS1rZXkgewogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNDgpOwp9CgoubWpyLXdnbS1wYXJhbS12YWx1ZSB7CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7CiAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC44Mik7Cn0KCi5tanItd2dtLW5vZGUtdmlzdWFsIHsKICAgIC0tbWpyLXdnbS1ub2RlLWFjY2VudDogcmdiYSgxMTUsIDE1NSwgMjU1LCAwLjg4KTsKICAgIC0tbWpyLXdnbS1ub2RlLWFjY2VudC1zb2Z0OiByZ2JhKDExNSwgMTU1LCAyNTUsIDAuMjIpOwogICAgZGlzcGxheTogZ3JpZDsKICAgIGdhcDogOHB4OwogICAgbWFyZ2luLXRvcDogMnB4OwogICAgcGFkZGluZzogOHB4OwogICAgYm9yZGVyLXJhZGl1czogNnB4OwogICAgYm9yZGVyOiAxcHggc29saWQgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci13Z20tbm9kZS1hY2NlbnQpIDM0JSwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEpKTsKICAgIGJveC1zaGFkb3c6CiAgICAgICAgaW5zZXQgMCAxcHggMCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDgpLAogICAgICAgIDAgMTBweCAyNHB4IHJnYmEoMCwgMCwgMCwgMC4yNCk7CiAgICBiYWNrZ3JvdW5kOgogICAgICAgIGxpbmVhci1ncmFkaWVudCgxODBkZWcsIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItd2dtLW5vZGUtYWNjZW50LXNvZnQpIDEwMCUsIHRyYW5zcGFyZW50KSwgcmdiYSg0NCwgNTYsIDg4LCAwLjIpKSwKICAgICAgICByZ2JhKDEzLCAxNiwgMjQsIDAuODUpOwp9CgoubWpyLXdnbS1ub2RlLXZpc3VhbDo6YmVmb3JlIHsKICAgIGNvbnRlbnQ6ICIiOwogICAgZGlzcGxheTogYmxvY2s7CiAgICBoZWlnaHQ6IDJweDsKICAgIG1hcmdpbjogLThweCAtOHB4IDZweDsKICAgIGJvcmRlci1yYWRpdXM6IDZweCA2cHggMCAwOwogICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KDkwZGVnLCB2YXIoLS1tanItd2dtLW5vZGUtYWNjZW50KSwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEyKSk7Cn0KCi5tanItd2dtLW5vZGUtdmlzdWFsLmlzLW1vZGVsIHsKICAgIC0tbWpyLXdnbS1ub2RlLWFjY2VudDogcmdiYSgxMjQsIDE4NiwgMjU1LCAwLjkpOwogICAgLS1tanItd2dtLW5vZGUtYWNjZW50LXNvZnQ6IHJnYmEoNzAsIDEyMywgMTgxLCAwLjM0KTsKfQoKLm1qci13Z20tbm9kZS12aXN1YWwuaXMtc2FtcGxlciB7CiAgICAtLW1qci13Z20tbm9kZS1hY2NlbnQ6IHJnYmEoMTQzLCAyMjgsIDE2NywgMC45KTsKICAgIC0tbWpyLXdnbS1ub2RlLWFjY2VudC1zb2Z0OiByZ2JhKDY0LCAxMzMsIDg4LCAwLjM0KTsKfQoKLm1qci13Z20tbm9kZS12aXN1YWwuaXMtdGV4dCB7CiAgICAtLW1qci13Z20tbm9kZS1hY2NlbnQ6IHJnYmEoMjU1LCAxOTIsIDExNCwgMC45KTsKICAgIC0tbWpyLXdnbS1ub2RlLWFjY2VudC1zb2Z0OiByZ2JhKDE1NCwgMTAyLCA0OSwgMC4zNCk7Cn0KCi5tanItd2dtLW5vZGUtdmlzdWFsLmlzLW1lZGlhIHsKICAgIC0tbWpyLXdnbS1ub2RlLWFjY2VudDogcmdiYSgxNTQsIDE3MCwgMjU1LCAwLjkpOwogICAgLS1tanItd2dtLW5vZGUtYWNjZW50LXNvZnQ6IHJnYmEoODMsIDkzLCAxNjUsIDAuMzQpOwp9CgoubWpyLXdnbS1ub2RlLXZpc3VhbC5pcy1jb250cm9sIHsKICAgIC0tbWpyLXdnbS1ub2RlLWFjY2VudDogcmdiYSgyNTUsIDEzOSwgMTY5LCAwLjkpOwogICAgLS1tanItd2dtLW5vZGUtYWNjZW50LXNvZnQ6IHJnYmEoMTQ1LCA3MCwgOTUsIDAuMzQpOwp9CgoubWpyLXdnbS1ub2RlLXZpc3VhbC5pcy1sb2dpYyB7CiAgICAtLW1qci13Z20tbm9kZS1hY2NlbnQ6IHJnYmEoMTg4LCAxNjgsIDI1NSwgMC45KTsKICAgIC0tbWpyLXdnbS1ub2RlLWFjY2VudC1zb2Z0OiByZ2JhKDEwNSwgODYsIDE1MywgMC4zNCk7Cn0KCi5tanItd2dtLW5vZGUtdmlzdWFsLWhlYWRlciB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsKICAgIGdhcDogOHB4OwogICAgcGFkZGluZy1ib3R0b206IDZweDsKICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXdnbS1ub2RlLWFjY2VudCkgMjUlLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTQpKTsKfQoKLm1qci13Z20tbm9kZS12aXN1YWwtdHlwZSB7CiAgICBmb250LXNpemU6IDExcHg7CiAgICBmb250LXdlaWdodDogNzAwOwogICAgY29sb3I6IHJnYmEoMjM2LCAyNDQsIDI1NSwgMC45NCk7CiAgICB0ZXh0LXNoYWRvdzogMCAxcHggMCByZ2JhKDAsIDAsIDAsIDAuMzUpOwp9CgoubWpyLXdnbS1ub2RlLXZpc3VhbC1pZCB7CiAgICBmb250LXNpemU6IDEwcHg7CiAgICBjb2xvcjogcmdiYSgxOTQsIDIxMywgMjU1LCAwLjc4KTsKfQoKLm1qci13Z20tbm9kZS1wb3J0cyB7CiAgICBkaXNwbGF5OiBncmlkOwogICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiAxZnIgMWZyOwogICAgZ2FwOiA4cHg7Cn0KCi5tanItd2dtLW5vZGUtcG9ydHMtY29sIHsKICAgIG1pbi13aWR0aDogMDsKfQoKLm1qci13Z20tbm9kZS1wb3J0cy10aXRsZSB7CiAgICBtYXJnaW4tYm90dG9tOiA0cHg7CiAgICBmb250LXNpemU6IDEwcHg7CiAgICBsZXR0ZXItc3BhY2luZzogMC4wMmVtOwogICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKICAgIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNDUpOwp9CgoubWpyLXdnbS1ub2RlLXBvcnRzLWxpc3QgewogICAgZGlzcGxheTogZ3JpZDsKICAgIGdhcDogM3B4Owp9CgoubWpyLXdnbS1ub2RlLXBvcnQsCi5tanItd2dtLW5vZGUtcG9ydC1lbXB0eSB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogNnB4OwogICAgbWluLWhlaWdodDogMThweDsKICAgIHBhZGRpbmc6IDJweCA2cHg7CiAgICBib3JkZXItcmFkaXVzOiA0cHg7CiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDYpOwogICAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjI0KTsKfQoKLm1qci13Z20tbm9kZS1wb3J0LWVtcHR5IHsKICAgIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMjYpOwp9CgoubWpyLXdnbS1ub2RlLXBvcnQtZG90IHsKICAgIHdpZHRoOiA4cHg7CiAgICBoZWlnaHQ6IDhweDsKICAgIGJvcmRlci1yYWRpdXM6IDk5OXB4OwogICAgZmxleDogMCAwIGF1dG87CiAgICBib3gtc2hhZG93OiAwIDAgMCAxcHggcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE4KSBpbnNldDsKfQoKLm1qci13Z20tbm9kZS1wb3J0LWRvdC5pcy1pbiB7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDEzNSwgMTk2LCAyNTUsIDAuOSk7Cn0KCi5tanItd2dtLW5vZGUtcG9ydC1kb3QuaXMtb3V0IHsKICAgIGJhY2tncm91bmQ6IHJnYmEoMTQ0LCAyMzgsIDE3NCwgMC45KTsKfQoKLm1qci13Z20tbm9kZS1wb3J0LW5hbWUgewogICAgZmxleDogMTsKICAgIG1pbi13aWR0aDogMDsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICBmb250LXNpemU6IDEwcHg7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjc4KTsKfQoKLm1qci13Z20tbm9kZS1wb3J0LXR5cGUgewogICAgZmxleDogMCAwIGF1dG87CiAgICBtYXgtd2lkdGg6IDQ1JTsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICBmb250LXNpemU6IDlweDsKICAgIGxldHRlci1zcGFjaW5nOiAwLjAyZW07CiAgICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOwogICAgcGFkZGluZzogMXB4IDVweDsKICAgIGJvcmRlci1yYWRpdXM6IDk5OXB4OwogICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE0KTsKICAgIGJhY2tncm91bmQ6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wOCk7CiAgICBjb2xvcjogcmdiYSgyMjQsIDIzNiwgMjU1LCAwLjkpOwp9CgoubWpyLXdnbS1ub2RlLXdpZGdldHMgewogICAgZGlzcGxheTogZ3JpZDsKICAgIGdhcDogNHB4Owp9CgoubWpyLXdnbS1ub2RlLXdpZGdldHMtdGl0bGUgewogICAgbWFyZ2luLWJvdHRvbTogMnB4OwogICAgZm9udC1zaXplOiAxMHB4OwogICAgbGV0dGVyLXNwYWNpbmc6IDAuMDJlbTsKICAgIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjQ1KTsKfQoKLm1qci13Z20tbm9kZS13aWRnZXQsCi5tanItd2dtLW5vZGUtd2lkZ2V0LWVtcHR5IHsKICAgIGRpc3BsYXk6IGdyaWQ7CiAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IG1pbm1heCg3MHB4LCAwLjQyZnIpIG1pbm1heCgwLCAxZnIpOwogICAgZ2FwOiA4cHg7CiAgICBwYWRkaW5nOiA0cHggNnB4OwogICAgYm9yZGVyLXJhZGl1czogNHB4OwogICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA2KTsKICAgIGJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgMC4yKTsKfQoKLm1qci13Z20tbm9kZS13aWRnZXQgewogICAgY3Vyc29yOiBwb2ludGVyOwogICAgdHJhbnNpdGlvbjoKICAgICAgICBiYWNrZ3JvdW5kIDEyMG1zIGVhc2UsCiAgICAgICAgYm9yZGVyLWNvbG9yIDEyMG1zIGVhc2U7Cn0KCi5tanItd2dtLW5vZGUtd2lkZ2V0OmhvdmVyLAoubWpyLXdnbS1ub2RlLXdpZGdldDpmb2N1cy12aXNpYmxlIHsKICAgIGJhY2tncm91bmQ6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wOSk7CiAgICBib3JkZXItY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4yKTsKICAgIG91dGxpbmU6IG5vbmU7Cn0KCi5tanItd2dtLW5vZGUtd2lkZ2V0LmlzLW9rIHsKICAgIGJvcmRlci1jb2xvcjogcmdiYSg3OSwgMjEwLCAxMjUsIDAuNyk7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDc5LCAyMTAsIDEyNSwgMC4xNik7Cn0KCi5tanItd2dtLW5vZGUtd2lkZ2V0LmlzLWVycm9yIHsKICAgIGJvcmRlci1jb2xvcjogcmdiYSgyNTUsIDkwLCA5MCwgMC43KTsKICAgIGJhY2tncm91bmQ6IHJnYmEoMjU1LCA5MCwgOTAsIDAuMTYpOwp9CgoubWpyLXdnbS1ub2RlLXdpZGdldC1lbXB0eSB7CiAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IDFmcjsKICAgIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMzQpOwp9CgoubWpyLXdnbS1ub2RlLXdpZGdldC1rZXkgewogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgIGZvbnQtc2l6ZTogMTBweDsKICAgIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNTIpOwp9CgoubWpyLXdnbS1ub2RlLXdpZGdldC12YWx1ZSB7CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7CiAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgZm9udC1zaXplOiAxMHB4OwogICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC44OCk7Cn0KCi5tanItd2dtLW5vZGUtd2lkZ2V0LmlzLW11bHRpbGluZSB7CiAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IDFmcjsKICAgIGFsaWduLWl0ZW1zOiBzdGFydDsKICAgIGdhcDogNHB4Owp9CgoubWpyLXdnbS1ub2RlLXdpZGdldC5pcy1tdWx0aWxpbmUgLm1qci13Z20tbm9kZS13aWRnZXQta2V5IHsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7Cn0KCi5tanItd2dtLW5vZGUtd2lkZ2V0LmlzLW11bHRpbGluZSAubWpyLXdnbS1ub2RlLXdpZGdldC12YWx1ZSB7CiAgICB3aGl0ZS1zcGFjZTogcHJlLXdyYXA7CiAgICB3b3JkLWJyZWFrOiBicmVhay13b3JkOwogICAgb3ZlcmZsb3ctd3JhcDogYW55d2hlcmU7CiAgICBsaW5lLWhlaWdodDogMS4zNTsKICAgIG1heC1oZWlnaHQ6IDkuMmVtOwogICAgb3ZlcmZsb3cteTogYXV0bzsKICAgIHBhZGRpbmctcmlnaHQ6IDJweDsKfQoKLm1qci13Z20tbm9kZS13aWRnZXQuaXMtbXVsdGlsaW5lLmlzLXRleHQtZmllbGQgLm1qci13Z20tbm9kZS13aWRnZXQtdmFsdWUgewogICAgbWF4LWhlaWdodDogMTZlbTsKICAgIGxpbmUtaGVpZ2h0OiAxLjQ7Cn0KCi5tanItd2dtLW5vZGUtd2lkZ2V0LW1vcmUgewogICAgZm9udC1zaXplOiAxMHB4OwogICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC40Nik7CiAgICB0ZXh0LWFsaWduOiByaWdodDsKfQoKQG1lZGlhIChtYXgtd2lkdGg6IDgyMHB4KSB7CiAgICAubWpyLXdnbS0tbGFyZ2UgLm1qci13Z20tZGV0YWlscyB7CiAgICAgICAgd2lkdGg6IG1pbigzODBweCwgY2FsYygxMDAlIC0gMjBweCkpOwogICAgfQoKICAgIC5tanItd2dtLW5vZGUtcG9ydHMgewogICAgICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogMWZyOwogICAgfQp9CgoubWpyLXdzLXNlYXJjaC13cmFwIHsKICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZmxleC1zaHJpbms6IDA7CiAgICBwYWRkaW5nOiA2cHggOHB4OwogICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHZhcigtLW1qci1ib3JkZXIsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xMikpOwp9CgoubWpyLXdzLXNlYXJjaC1pY29uIHsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIGxlZnQ6IDE2cHg7CiAgICBmb250LXNpemU6IDExcHg7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjMpOwogICAgcG9pbnRlci1ldmVudHM6IG5vbmU7Cn0KCi5tanItd3Mtc2VhcmNoIHsKICAgIGZsZXg6IDE7CiAgICBwYWRkaW5nOiA0cHggMjhweCA0cHggMjZweDsKICAgIGJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgMC4zNSk7CiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTIpOwogICAgYm9yZGVyLXJhZGl1czogNHB4OwogICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC44NSk7CiAgICBmb250LXNpemU6IDExcHg7CiAgICBvdXRsaW5lOiBub25lOwp9CgoubWpyLXdzLXNlYXJjaDo6cGxhY2Vob2xkZXIgewogICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4yOCk7Cn0KCi5tanItd3Mtc2VhcmNoOmZvY3VzIHsKICAgIGJvcmRlci1jb2xvcjogcmdiYSg5OSwgMTU1LCAyNTUsIDAuNSk7Cn0KCi5tanItd3Mtc2VhcmNoLWNsZWFyIHsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIHJpZ2h0OiAxNHB4OwogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgIHdpZHRoOiAxOHB4OwogICAgaGVpZ2h0OiAxOHB4OwogICAgcGFkZGluZzogMDsKICAgIGJvcmRlcjogbm9uZTsKICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50OwogICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4zKTsKICAgIGZvbnQtc2l6ZTogMTBweDsKICAgIGN1cnNvcjogcG9pbnRlcjsKICAgIGJvcmRlci1yYWRpdXM6IDNweDsKfQoKLm1qci13cy1zZWFyY2gtY2xlYXI6aG92ZXIgewogICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC43KTsKICAgIGJhY2tncm91bmQ6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wOCk7Cn0KCi5tanItd3Mtbm9kZXMtbGlzdCB7CiAgICBmbGV4OiAxOwogICAgb3ZlcmZsb3cteTogYXV0bzsKICAgIHBhZGRpbmc6IDRweCAwOwp9CgoubWpyLXdzLW5vZGUtcm93IHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiA2cHg7CiAgICBwYWRkaW5nOiA1cHggMTBweCA1cHggMTJweDsKICAgIGN1cnNvcjogcG9pbnRlcjsKICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDUpOwogICAgbWluLWhlaWdodDogMzJweDsKICAgIHRyYW5zaXRpb246IGJhY2tncm91bmQgMC4xczsKfQoKLm1qci13cy1ub2RlLXJvdzpob3ZlciB7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDYpOwp9CgoubWpyLXdzLW5vZGUtcm93LXR5cGUgewogICAgZmxleDogMTsKICAgIGZvbnQtc2l6ZTogMTFweDsKICAgIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNzgpOwogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKfQoKLm1qci13cy1ub2RlLXJvdy10aXRsZSB7CiAgICBmb250LXNpemU6IDEwcHg7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjQpOwogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKICAgIG1heC13aWR0aDogODBweDsKICAgIGZsZXgtc2hyaW5rOiAwOwp9CgoubWpyLXdzLW5vZGUtbG9jYXRlIHsKICAgIGZsZXgtc2hyaW5rOiAwOwogICAgd2lkdGg6IDIycHg7CiAgICBoZWlnaHQ6IDIycHg7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgcGFkZGluZzogMDsKICAgIGJvcmRlcjogbm9uZTsKICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50OwogICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4zKTsKICAgIGZvbnQtc2l6ZTogMTFweDsKICAgIGJvcmRlci1yYWRpdXM6IDNweDsKICAgIGN1cnNvcjogcG9pbnRlcjsKICAgIG9wYWNpdHk6IDA7CiAgICB0cmFuc2l0aW9uOgogICAgICAgIG9wYWNpdHkgMC4xcywKICAgICAgICBjb2xvciAwLjFzLAogICAgICAgIGJhY2tncm91bmQgMC4xczsKfQoKLm1qci13cy1ub2RlLXJvdzpob3ZlciAubWpyLXdzLW5vZGUtbG9jYXRlIHsKICAgIG9wYWNpdHk6IDE7Cn0KCi5tanItd3Mtbm9kZS1sb2NhdGU6aG92ZXIgewogICAgY29sb3I6ICM2MzliZmY7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDk5LCAxNTUsIDI1NSwgMC4xNSk7Cn0KCi8qIC0tIE5vZGUgc2VjdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi5tanItd3MtdHJlZS1pdGVtIHsKICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCB2YXIoLS1tanItYm9yZGVyLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTIpKTsKfQoubWpyLXdzLXRyZWUtaXRlbSA+IC5tanItd3Mtbm9kZSB7CiAgICBib3JkZXItYm90dG9tOiBub25lOwp9Ci5tanItd3MtdHJlZS1pdGVtLS1zdWJncmFwaCB7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWFjY2VudCwgIzViOGFmMCkgNCUsIHRyYW5zcGFyZW50IDk2JSk7Cn0KLm1qci13cy1ub2RlIHsKICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCB2YXIoLS1tanItYm9yZGVyLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTIpKTsKfQovKiBTdWJ0bGUgaGlnaGxpZ2h0IHdoZW4gdGhpcyBub2RlIG1hdGNoZXMgdGhlIGN1cnJlbnQgZ3JhcGggc2VsZWN0aW9uLiAqLwoubWpyLXdzLW5vZGUuaXMtc2VsZWN0ZWQtZnJvbS1ncmFwaCB7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjEwLCA5MCwgMC4wOCk7CiAgICBib3gtc2hhZG93OiBpbnNldCAycHggMCAwIDAgcmdiYSgyNTUsIDIxMCwgOTAsIDAuNzUpOwp9Ci5tanItd3Mtbm9kZS5pcy1zZWxlY3RlZC1mcm9tLWdyYXBoIC5tanItd3Mtbm9kZS1oZWFkZXIgewogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsICNmZmQ0NWEgMTglLCB2YXIoLS1tanItc3VyZmFjZS0xLCAjMmEyYTJhKSA4MiUpOwp9Ci5tanItd3Mtbm9kZS5pcy1zZWxlY3RlZC1mcm9tLWdyYXBoIC5tanItd3Mtbm9kZS10eXBlIHsKICAgIGNvbG9yOiAjZmZkNDVhOwp9Ci5tanItd3Mtbm9kZS5pcy1zZWxlY3RlZC1mcm9tLWdyYXBoIC5tanItd3Mtbm9kZS10aXRsZSB7CiAgICBjb2xvcjogcmdiYSgyNTUsIDIyNCwgMTMwLCAwLjg4KTsKfQoubWpyLXdzLW5vZGUuaXMtc2VsZWN0ZWQtZnJvbS1ncmFwaCAubWpyLXdzLW5vZGUtdG9nZ2xlLAoubWpyLXdzLW5vZGUuaXMtc2VsZWN0ZWQtZnJvbS1ncmFwaCAubWpyLXdzLWxvY2F0ZSwKLm1qci13cy1ub2RlLmlzLXNlbGVjdGVkLWZyb20tZ3JhcGggLm1qci13cy1ub2RlLWtpbmQgewogICAgY29sb3I6ICNmZmQ0NWE7Cn0KLm1qci13cy1zaWRlYmFyLXJlc2l6ZXIgewogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgdG9wOiAwOwogICAgYm90dG9tOiAwOwogICAgd2lkdGg6IDE0cHg7CiAgICB6LWluZGV4OiAyOwogICAgY3Vyc29yOiBldy1yZXNpemU7CiAgICBwb2ludGVyLWV2ZW50czogYXV0bzsKfQoKLm1qci13cy1zaWRlYmFyLXJlc2l6ZXI6OmJlZm9yZSB7CiAgICBjb250ZW50OiAiIjsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIHRvcDogNTAlOwogICAgbGVmdDogNTAlOwogICAgd2lkdGg6IDRweDsKICAgIGhlaWdodDogNTZweDsKICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUsIC01MCUpOwogICAgYm9yZGVyLXJhZGl1czogOTk5cHg7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTgpOwogICAgYm94LXNoYWRvdzogMCAwIDAgMXB4IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wNik7CiAgICBvcGFjaXR5OiAwOwogICAgdHJhbnNpdGlvbjoKICAgICAgICBvcGFjaXR5IDAuMTVzIGVhc2UsCiAgICAgICAgYmFja2dyb3VuZCAwLjE1cyBlYXNlOwp9CgoubWpyLXdzLXNpZGViYXIub3Blbjpob3ZlciAubWpyLXdzLXNpZGViYXItcmVzaXplcjo6YmVmb3JlLAoubWpyLXdzLXNpZGViYXIuaXMtcmVzaXppbmcgLm1qci13cy1zaWRlYmFyLXJlc2l6ZXI6OmJlZm9yZSwKLm1qci13cy1zaWRlYmFyLXJlc2l6ZXIuaXMtZHJhZ2dpbmc6OmJlZm9yZSB7CiAgICBvcGFjaXR5OiAxOwp9CgoubWpyLXdzLXNpZGViYXIuaXMtcmVzaXppbmcgLm1qci13cy1zaWRlYmFyLXJlc2l6ZXI6OmJlZm9yZSwKLm1qci13cy1zaWRlYmFyLXJlc2l6ZXI6aG92ZXI6OmJlZm9yZSwKLm1qci13cy1zaWRlYmFyLXJlc2l6ZXIuaXMtZHJhZ2dpbmc6OmJlZm9yZSB7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMzQpOwp9CgoubWpyLW1mdi1jb250ZW50LXdyYXBwZXJbZGF0YS1zaWRlYmFyLXBvcz0icmlnaHQiXSAubWpyLXdzLXNpZGViYXItcmVzaXplciB7CiAgICByaWdodDogMDsKfQoKLm1qci1tZnYtY29udGVudC13cmFwcGVyW2RhdGEtc2lkZWJhci1wb3M9ImxlZnQiXSAubWpyLXdzLXNpZGViYXItcmVzaXplciB7CiAgICBsZWZ0OiAwOwp9CgoubWpyLW1mdi1jb250ZW50LXdyYXBwZXJbZGF0YS1zaWRlYmFyLXBvcz0iYm90dG9tIl0gLm1qci13cy1zaWRlYmFyLXJlc2l6ZXIgewogICAgZGlzcGxheTogbm9uZTsKfQoubWpyLXdzLW5vZGUtaGVhZGVyIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiA4cHg7CiAgICBwYWRkaW5nOiA2cHggMTBweDsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peCgKICAgICAgICBpbiBzcmdiLAogICAgICAgIHZhcigtLW1qci1zdXJmYWNlLTAsICMxZTFlMWUpIDQwJSwKICAgICAgICB2YXIoLS1tanItc3VyZmFjZS0xLCAjMmEyYTJhKSA2MCUKICAgICk7CiAgICBjdXJzb3I6IGRlZmF1bHQ7CiAgICB1c2VyLXNlbGVjdDogbm9uZTsKICAgIHRyYW5zaXRpb246IGJhY2tncm91bmQgMC4xMnMgZWFzZTsKfQoubWpyLXdzLW5vZGUuaXMtY29sbGFwc2libGUgLm1qci13cy1ub2RlLWhlYWRlciB7CiAgICBjdXJzb3I6IHBvaW50ZXI7Cn0KLm1qci13cy1ub2RlLmlzLWNvbGxhcHNpYmxlIC5tanItd3Mtbm9kZS1oZWFkZXI6aG92ZXIgewogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KAogICAgICAgIGluIHNyZ2IsCiAgICAgICAgdmFyKC0tbWpyLXN1cmZhY2UtMCwgIzFlMWUxZSkgMjglLAogICAgICAgIHZhcigtLW1qci1zdXJmYWNlLTEsICMyYTJhMmEpIDcyJQogICAgKTsKfQoubWpyLXdzLW5vZGUuaXMtY29sbGFwc2libGUuaXMtY29sbGFwc2VkIC5tanItd3Mtbm9kZS1oZWFkZXI6aG92ZXIgewogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KAogICAgICAgIGluIHNyZ2IsCiAgICAgICAgdmFyKC0tbWpyLWFjY2VudCwgIzViOGFmMCkgOCUsCiAgICAgICAgdmFyKC0tbWpyLXN1cmZhY2UtMSwgIzJhMmEyYSkgOTIlCiAgICApOwp9Ci5tanItd3Mtbm9kZS10b2dnbGUgewogICAgZmxleDogMCAwIGF1dG87Cn0KLm1qci13cy1ub2RlLXRpdGxlLXdyYXAgewogICAgZGlzcGxheTogZmxleDsKICAgIGZsZXg6IDE7CiAgICBtaW4td2lkdGg6IDA7CiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgZ2FwOiAxcHg7Cn0KLm1qci13cy1ub2RlLXR5cGUgewogICAgZm9udC13ZWlnaHQ6IDYwMDsKICAgIGZvbnQtc2l6ZTogMTJweDsKICAgIGNvbG9yOiB2YXIoLS1jb250ZW50LWZnLCAjZGRkKTsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7Cn0KLm1qci13cy1ub2RlLXRpdGxlIHsKICAgIGZvbnQtc2l6ZTogMTBweDsKICAgIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNDgpOwogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKfQoubWpyLXdzLW5vZGUta2luZCB7CiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBnYXA6IDRweDsKICAgIGZsZXg6IDAgMCBhdXRvOwogICAgbWF4LXdpZHRoOiAxMTBweDsKICAgIHBhZGRpbmc6IDJweCA2cHg7CiAgICBib3JkZXI6IDFweCBzb2xpZCBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWFjY2VudCwgIzViOGFmMCkgMzglLCB0cmFuc3BhcmVudCA2MiUpOwogICAgYm9yZGVyLXJhZGl1czogOTk5cHg7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWFjY2VudCwgIzViOGFmMCkgMTIlLCB0cmFuc3BhcmVudCA4OCUpOwogICAgY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYWNjZW50LCAjNWI4YWYwKSA3OCUsICNmZmZmZmYgMjIlKTsKICAgIGZvbnQtc2l6ZTogMTBweDsKICAgIGZvbnQtd2VpZ2h0OiA3MDA7CiAgICBsaW5lLWhlaWdodDogMS4yOwogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKfQoubWpyLXdzLW5vZGUta2luZCAucGkgewogICAgZm9udC1zaXplOiAxMHB4Owp9Ci5tanItd3Mtbm9kZS1raW5kLWNvdW50IHsKICAgIG1pbi13aWR0aDogMTRweDsKICAgIHBhZGRpbmc6IDAgM3B4OwogICAgYm9yZGVyLXJhZGl1czogOTk5cHg7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTIpOwogICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC44Mik7CiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7Cn0KLm1qci13cy1ub2RlLmlzLWNvbGxhcHNlZCAubWpyLXdzLW5vZGUtYm9keSB7CiAgICBkaXNwbGF5OiBub25lOwp9Ci5tanItd3Mtbm9kZS1ib2R5IHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgZ2FwOiA0cHg7CiAgICBwYWRkaW5nOiA2cHggMTBweDsKfQoubWpyLXdzLW5vZGUtZW1wdHkgewogICAgZm9udC1zaXplOiAxMXB4OwogICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4zKTsKICAgIHBhZGRpbmc6IDRweCAwOwp9CgovKiAtLSBOZXN0ZWQgbm9kZXMgKGluc2lkZSBzdWJncmFwaHMpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi5tanItd3Mtbm9kZS0tbmVzdGVkIHsKICAgIGJvcmRlci1sZWZ0OiAycHggc29saWQgcmdiYSg5MSwgMTM4LCAyNDAsIDAuMzUpOwp9Ci5tanItd3Mtbm9kZS0tbmVzdGVkIC5tanItd3Mtbm9kZS1oZWFkZXIgewogICAgcGFkZGluZy1sZWZ0OiAxNnB4OwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KAogICAgICAgIGluIHNyZ2IsCiAgICAgICAgdmFyKC0tbWpyLWFjY2VudCwgIzViOGFmMCkgNSUsCiAgICAgICAgdmFyKC0tbWpyLXN1cmZhY2UtMSwgIzJhMmEyYSkgOTUlCiAgICApOwp9Ci5tanItd3Mtbm9kZS0tbmVzdGVkLmlzLWNvbGxhcHNpYmxlIC5tanItd3Mtbm9kZS1oZWFkZXI6aG92ZXIgewogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KAogICAgICAgIGluIHNyZ2IsCiAgICAgICAgdmFyKC0tbWpyLWFjY2VudCwgIzViOGFmMCkgMTAlLAogICAgICAgIHZhcigtLW1qci1zdXJmYWNlLTEsICMyYTJhMmEpIDkwJQogICAgKTsKfQoKLyogLS0gU3ViZ3JhcGggY2hpbGRyZW4gZ3JvdXAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLm1qci13cy1jaGlsZHJlbi10b2dnbGUgewogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBnYXA6IDZweDsKICAgIHdpZHRoOiAxMDAlOwogICAgcGFkZGluZzogNXB4IDEwcHggNXB4IDIwcHg7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoCiAgICAgICAgaW4gc3JnYiwKICAgICAgICB2YXIoLS1tanItYWNjZW50LCAjNWI4YWYwKSA2JSwKICAgICAgICB2YXIoLS1tanItc3VyZmFjZS0wLCAjMWUxZTFlKSA5NCUKICAgICk7CiAgICBib3JkZXI6IG5vbmU7CiAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgdmFyKC0tbWpyLWJvcmRlciwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEyKSk7CiAgICBjb2xvcjogdmFyKC0tbWpyLWFjY2VudCwgIzViOGFmMCk7CiAgICBmb250LXNpemU6IDExcHg7CiAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICB0ZXh0LWFsaWduOiBsZWZ0OwogICAgb3BhY2l0eTogMC44OwogICAgdHJhbnNpdGlvbjoKICAgICAgICBvcGFjaXR5IDAuMXMgZWFzZSwKICAgICAgICBiYWNrZ3JvdW5kIDAuMXMgZWFzZTsKfQoubWpyLXdzLWNoaWxkcmVuLXRvZ2dsZS0tbmVzdGVkIHsKICAgIHBhZGRpbmctbGVmdDogMjhweDsKfQoubWpyLXdzLWNoaWxkcmVuLXRvZ2dsZTpob3ZlciB7CiAgICBvcGFjaXR5OiAxOwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KAogICAgICAgIGluIHNyZ2IsCiAgICAgICAgdmFyKC0tbWpyLWFjY2VudCwgIzViOGFmMCkgMTIlLAogICAgICAgIHZhcigtLW1qci1zdXJmYWNlLTAsICMxZTFlMWUpIDg4JQogICAgKTsKfQoubWpyLXdzLWNoaWxkcmVuLXRvZ2dsZVthcmlhLWV4cGFuZGVkPSJ0cnVlIl0gewogICAgb3BhY2l0eTogMTsKfQoubWpyLXdzLWNoaWxkcmVuIHsKICAgIGJvcmRlci1sZWZ0OiAycHggc29saWQgcmdiYSg5MSwgMTM4LCAyNDAsIDAuMjUpOwogICAgbWFyZ2luLWxlZnQ6IDZweDsKICAgIHBhZGRpbmctbGVmdDogNnB4Owp9CgoubWpyLXdzLXdpZGdldC1yb3cgewogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBmbGV4LXN0YXJ0OwogICAgZ2FwOiA4cHg7Cn0KLm1qci13cy13aWRnZXQtcm93LS1ibG9jayB7CiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgZ2FwOiAycHg7Cn0KLm1qci13cy13aWRnZXQtcm93LS1ibG9jayAubWpyLXdzLXdpZGdldC1sYWJlbCB7CiAgICBmbGV4OiBub25lOwogICAgcGFkZGluZy10b3A6IDA7Cn0KLm1qci13cy13aWRnZXQtcm93LS1ibG9jayAubWpyLXdzLXdpZGdldC1pbnB1dCB7CiAgICB3aWR0aDogMTAwJTsKfQoubWpyLXdzLXdpZGdldC1sYWJlbCB7CiAgICBmbGV4OiAwIDAgODBweDsKICAgIGZvbnQtc2l6ZTogMTFweDsKICAgIGNvbG9yOiB2YXIoLS1kZXNjcmlwLXRleHQsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC41NSkpOwogICAgcGFkZGluZy10b3A6IDVweDsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7Cn0KLm1qci13cy13aWRnZXQtaW5wdXQgewogICAgZmxleDogMTsKICAgIG1pbi13aWR0aDogMDsKfQoubWpyLXdzLWlucHV0IHsKICAgIHdpZHRoOiAxMDAlOwogICAgYmFja2dyb3VuZDogdmFyKC0tY29tZnktaW5wdXQtYmcsICMyMjIpOwogICAgY29sb3I6IHZhcigtLWlucHV0LXRleHQsICNkZGQpOwogICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tbWpyLWJvcmRlciwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEyKSk7CiAgICBib3JkZXItcmFkaXVzOiA0cHg7CiAgICBwYWRkaW5nOiA0cHggNnB4OwogICAgZm9udC1zaXplOiAxMnB4OwogICAgZm9udC1mYW1pbHk6IGluaGVyaXQ7CiAgICBvdXRsaW5lOiBub25lOwogICAgdHJhbnNpdGlvbjogYm9yZGVyLWNvbG9yIDEyMG1zIGVhc2U7Cn0KLm1qci13cy1pbnB1dDpmb2N1cyB7CiAgICBib3JkZXItY29sb3I6IHZhcigtLW1qci1hY2NlbnQsICM1ZmIzZmYpOwp9Ci5tanItd3MtdGV4dGFyZWEgewogICAgcmVzaXplOiBub25lOwogICAgbWluLWhlaWdodDogMjhweDsKICAgIGxpbmUtaGVpZ2h0OiAxLjQ7CiAgICBvdmVyZmxvdy15OiBoaWRkZW47Cn0KLm1qci13cy10ZXh0LXdyYXBwZXIgewogICAgZGlzcGxheTogZmxleDsKICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICBnYXA6IDJweDsKICAgIGZsZXg6IDE7CiAgICBtaW4td2lkdGg6IDA7Cn0KLm1qci13cy10ZXh0LXdyYXBwZXIgLm1qci13cy10ZXh0YXJlYSB7CiAgICB3aWR0aDogMTAwJTsKfQoubWpyLXdzLWV4cGFuZC1idG4gewogICAgYWxpZ24tc2VsZjogZmxleC1lbmQ7CiAgICBiYWNrZ3JvdW5kOiBub25lOwogICAgYm9yZGVyOiBub25lOwogICAgY29sb3I6IHZhcigtLW1qci1hY2NlbnQsICM1ZmIzZmYpOwogICAgZm9udC1zaXplOiAxMHB4OwogICAgY3Vyc29yOiBwb2ludGVyOwogICAgcGFkZGluZzogMCA0cHg7CiAgICBvcGFjaXR5OiAwLjg7Cn0KLm1qci13cy1leHBhbmQtYnRuOmhvdmVyIHsKICAgIG9wYWNpdHk6IDE7CiAgICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKfQoubWpyLXdzLXJlYWRvbmx5IHsKICAgIG9wYWNpdHk6IDAuNTsKICAgIGN1cnNvcjogZGVmYXVsdDsKfQoubWpyLXdzLWNoZWNrYm94IHsKICAgIGFjY2VudC1jb2xvcjogdmFyKC0tbWpyLWFjY2VudCwgIzVmYjNmZik7CiAgICB3aWR0aDogMTZweDsKICAgIGhlaWdodDogMTZweDsKICAgIG1hcmdpbi10b3A6IDRweDsKfQoubWpyLXdzLXRvZ2dsZS1sYWJlbCB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKfQoKLyogLS0gTG9jYXRlIGJ1dHRvbiBpbnNpZGUgbm9kZSBoZWFkZXIgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLm1qci13cy1sb2NhdGUgewogICAgd2lkdGg6IDI0cHggIWltcG9ydGFudDsKICAgIGhlaWdodDogMjRweCAhaW1wb3J0YW50OwogICAgYm9yZGVyOiBub25lICFpbXBvcnRhbnQ7CiAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudCAhaW1wb3J0YW50OwogICAgb3BhY2l0eTogMC41Owp9Ci5tanItd3MtbG9jYXRlOmhvdmVyIHsKICAgIG9wYWNpdHk6IDE7Cn0KCi8qIC0tIFJ1biBidXR0b24gc3RhdGUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi5tanItbWZ2LXJ1bi1jb250cm9scyB7CiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBnYXA6IDRweDsKfQoubWpyLW1mdi1ydW4tYnRuIC5waSB7CiAgICBjb2xvcjogdmFyKC0tbWpyLXN0YXR1cy1zdWNjZXNzLCAjNGNhZjUwKTsKfQoubWpyLW1mdi1ydW4tYnRuLnJ1bm5pbmcgLnBpIHsKICAgIGNvbG9yOiB2YXIoLS1tanItbXV0ZWQsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC42NSkpOwp9Ci5tanItbWZ2LXJ1bi1idG4uc3RvcHBpbmcgLnBpIHsKICAgIGNvbG9yOiB2YXIoLS1tanItc3RhdHVzLXdhcm5pbmcsICNmZmE3MjYpOwp9Ci5tanItbWZ2LXJ1bi1idG4uZXJyb3IgLnBpIHsKICAgIGNvbG9yOiAjZjQ0MzM2Owp9CgoubWpyLW1mdi1zdG9wLWJ0biAucGkgewogICAgY29sb3I6ICNlZjUzNTA7Cn0KLm1qci1tZnYtc3RvcC1idG4uYWN0aXZlIC5waSB7CiAgICBjb2xvcjogI2ZmOGE2NTsKfQoubWpyLW1mdi1zdG9wLWJ0bi5zdG9wcGluZyAucGkgewogICAgY29sb3I6IHZhcigtLW1qci1zdGF0dXMtd2FybmluZywgI2ZmYTcyNik7Cn0KCi8qIC0tIEZsb2F0aW5nIFZpZXdlciBzaW1wbGUgdmlkZW8gcGxheWVyIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLm1qci1tZnYtc2ltcGxlLXBsYXllciB7CiAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICB3aWR0aDogMTAwJTsKICAgIGhlaWdodDogMTAwJTsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICBvdmVyZmxvdzogaGlkZGVuOwp9CgoubWpyLW1mdi1zaW1wbGUtcGxheWVyLmlzLWF1ZGlvIHsKICAgIGJhY2tncm91bmQ6IHJhZGlhbC1ncmFkaWVudChjaXJjbGUgYXQgMjAlIDIwJSwgcmdiYSg5NSwgMTc5LCAyNTUsIDAuMiksIHJnYmEoMTgsIDIwLCAyOCwgMC45NSkpOwp9CgoubWpyLW1mdi1zaW1wbGUtcGxheWVyLWF1ZGlvLWJhY2tkcm9wIHsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIGluc2V0OiAwOwogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuOSk7CiAgICBmb250LXNpemU6IDEzcHg7CiAgICBmb250LXdlaWdodDogNjAwOwogICAgbGV0dGVyLXNwYWNpbmc6IDAuMnB4OwogICAgdGV4dC1zaGFkb3c6IDAgMnB4IDEycHggcmdiYSgwLCAwLCAwLCAwLjQ1KTsKICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgcGFkZGluZzogMThweDsKICAgIHRleHQtYWxpZ246IGNlbnRlcjsKfQoKLm1qci1tZnYtc2ltcGxlLXBsYXllci1jb250cm9scyB7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICBsZWZ0OiAxMnB4OwogICAgcmlnaHQ6IDEycHg7CiAgICBib3R0b206IDEycHg7CiAgICB6LWluZGV4OiAzMDsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgZ2FwOiA4cHg7CiAgICBwYWRkaW5nOiA5cHggMTBweDsKICAgIGJvcmRlci1yYWRpdXM6IDE0cHg7CiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTYpOwogICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KHRvIHRvcCwgcmdiYSgxMCwgMTAsIDE0LCAwLjc2KSwgcmdiYSgxNiwgMTYsIDI0LCAwLjU1KSk7CiAgICBiYWNrZHJvcC1maWx0ZXI6IGJsdXIoMTBweCk7CiAgICAtd2Via2l0LWJhY2tkcm9wLWZpbHRlcjogYmx1cigxMHB4KTsKICAgIHBvaW50ZXItZXZlbnRzOiBhdXRvOwp9CgoubWpyLW1mdi1zaW1wbGUtcGxheWVyLXJvdyB7CiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBnYXA6IDhweDsKfQoKLm1qci1tZnYtc2ltcGxlLXBsYXllci1zZWVrIHsKICAgIC0tbWpyLXNlZWstcGN0OiAwJTsKICAgIGFwcGVhcmFuY2U6IG5vbmU7CiAgICAtd2Via2l0LWFwcGVhcmFuY2U6IG5vbmU7CiAgICB3aWR0aDogMTAwJTsKICAgIGhlaWdodDogNnB4OwogICAgYm9yZGVyLXJhZGl1czogOTk5cHg7CiAgICBvdXRsaW5lOiBub25lOwogICAgYm9yZGVyOiBub25lOwogICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KAogICAgICAgIHRvIHJpZ2h0LAogICAgICAgICNmZjJmNTIgMCUsCiAgICAgICAgI2ZmMmY1MiB2YXIoLS1tanItc2Vlay1wY3QpLAogICAgICAgIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4yNCkgdmFyKC0tbWpyLXNlZWstcGN0KSwKICAgICAgICByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMjQpIDEwMCUKICAgICk7CiAgICBjdXJzb3I6IHBvaW50ZXI7Cn0KCi5tanItbWZ2LXNpbXBsZS1wbGF5ZXItc2Vlazo6LXdlYmtpdC1zbGlkZXItdGh1bWIgewogICAgLXdlYmtpdC1hcHBlYXJhbmNlOiBub25lOwogICAgd2lkdGg6IDEycHg7CiAgICBoZWlnaHQ6IDEycHg7CiAgICBib3JkZXItcmFkaXVzOiA5OTlweDsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4zNSk7CiAgICBiYWNrZ3JvdW5kOiAjZmYyZjUyOwp9CgoubWpyLW1mdi1zaW1wbGUtcGxheWVyLXNlZWs6Oi1tb3otcmFuZ2UtdGh1bWIgewogICAgd2lkdGg6IDEycHg7CiAgICBoZWlnaHQ6IDEycHg7CiAgICBib3JkZXItcmFkaXVzOiA5OTlweDsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4zNSk7CiAgICBiYWNrZ3JvdW5kOiAjZmYyZjUyOwp9CgoubWpyLW1mdi1zaW1wbGUtcGxheWVyLWJ0biB7CiAgICB3aWR0aDogMzBweDsKICAgIGhlaWdodDogMzBweDsKICAgIG1pbi13aWR0aDogMzBweDsKICAgIGJvcmRlci1yYWRpdXM6IDk5OXB4OwogICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjIyKTsKICAgIGJhY2tncm91bmQ6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wOCk7Cn0KCi5tanItbWZ2LXNpbXBsZS1wbGF5ZXItYnRuIC5waSB7CiAgICBmb250LXNpemU6IDEzcHg7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjk1KTsKfQoKLm1qci1tZnYtc2ltcGxlLXBsYXllci1idG4uaXMtZGlzYWJsZWQsCi5tanItbWZ2LXNpbXBsZS1wbGF5ZXItc2Vlay5pcy1kaXNhYmxlZCB7CiAgICBvcGFjaXR5OiAwLjQ1OwogICAgY3Vyc29yOiBkZWZhdWx0Owp9CgoubWpyLW1mdi1zaW1wbGUtcGxheWVyLXRpbWUgewogICAgbWFyZ2luLWxlZnQ6IGF1dG87CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjkyKTsKICAgIGZvbnQtc2l6ZTogMTFweDsKICAgIGxpbmUtaGVpZ2h0OiAxOwogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgIGZvbnQtdmFyaWFudC1udW1lcmljOiB0YWJ1bGFyLW51bXM7Cn0KCi5tanItbWZ2LXNpbXBsZS1wbGF5ZXItZnJhbWUgewogICAgbWFyZ2luLXJpZ2h0OiAycHg7CiAgICBwYWRkaW5nOiAzcHggOHB4OwogICAgYm9yZGVyLXJhZGl1czogOTk5cHg7CiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTYpOwogICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA2KTsKICAgIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuOSk7CiAgICBmb250LXNpemU6IDExcHg7CiAgICBsaW5lLWhlaWdodDogMTsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICBmb250LXZhcmlhbnQtbnVtZXJpYzogdGFidWxhci1udW1zOwp9CgoubWpyLW1mdi1wbGF5ZXItaG9zdCB7CiAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICB3aWR0aDogMTAwJTsKICAgIGhlaWdodDogMTAwJTsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgY29udGFpbmVyLXR5cGU6IGlubGluZS1zaXplOwp9CgoubWpyLW1mdi1wbGF5ZXItaG9zdC0tYXVkaW8gewogICAgYmFja2dyb3VuZDogcmFkaWFsLWdyYWRpZW50KGNpcmNsZSBhdCAyMCUgMjAlLCByZ2JhKDk1LCAxNzksIDI1NSwgMC4yKSwgcmdiYSgxOCwgMjAsIDI4LCAwLjk1KSk7Cn0KCi5tanItbWZ2LXBsYXllci1hdWRpby1iYWNrZHJvcCB7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICBpbnNldDogMDsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjkpOwogICAgZm9udC1zaXplOiAxM3B4OwogICAgZm9udC13ZWlnaHQ6IDYwMDsKICAgIGxldHRlci1zcGFjaW5nOiAwLjJweDsKICAgIHRleHQtc2hhZG93OiAwIDJweCAxMnB4IHJnYmEoMCwgMCwgMCwgMC40NSk7CiAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgIHBhZGRpbmc6IDE4cHg7CiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgICBvdmVyZmxvdy13cmFwOiBhbnl3aGVyZTsKfQoKLm1qci1tZnYtcGxheWVyLWhvc3QgLm1qci12aWRlby1jb250cm9scyB7CiAgICB6LWluZGV4OiAzMDsKfQoKLm1qci1tZnYtcGxheWVyLWhvc3QgLm1qci12aWRlby1jb250cm9sc1tkYXRhLW1qci1sYXlvdXQ9ImNvbXBhY3QiXSwKLm1qci1tZnYtcGxheWVyLWhvc3QgLm1qci12aWRlby1jb250cm9sc1tkYXRhLW1qci1sYXlvdXQ9InN0YWNrZWQiXSB7CiAgICBsZWZ0OiA4cHg7CiAgICByaWdodDogOHB4OwogICAgYm90dG9tOiA4cHg7CiAgICBwYWRkaW5nOiA4cHg7CiAgICBnYXA6IDZweDsKfQoKLm1qci1tZnYtcGxheWVyLWhvc3QgLm1qci12aWRlby1jb250cm9sc1tkYXRhLW1qci1sYXlvdXQ9ImNvbXBhY3QiXSAubWpyLXZpZGVvLXJvdy0tdG9wLAoubWpyLW1mdi1wbGF5ZXItaG9zdCAubWpyLXZpZGVvLWNvbnRyb2xzW2RhdGEtbWpyLWxheW91dD0ic3RhY2tlZCJdIC5tanItdmlkZW8tcm93LS10b3AgewogICAgZ2FwOiA4cHg7Cn0KCi5tanItbWZ2LXBsYXllci1ob3N0IC5tanItdmlkZW8tY29udHJvbHNbZGF0YS1tanItbGF5b3V0PSJjb21wYWN0Il0gLm1qci12aWRlby10aW1lZ3JvdXAsCi5tanItbWZ2LXBsYXllci1ob3N0IC5tanItdmlkZW8tY29udHJvbHNbZGF0YS1tanItbGF5b3V0PSJzdGFja2VkIl0gLm1qci12aWRlby10aW1lZ3JvdXAgewogICAganVzdGlmeS1jb250ZW50OiBmbGV4LXN0YXJ0OwogICAgZ2FwOiA2cHg7Cn0KCi5tanItbWZ2LXBsYXllci1ob3N0IC5tanItdmlkZW8tY29udHJvbHNbZGF0YS1tanItbGF5b3V0PSJjb21wYWN0Il0gLm1qci12aWRlby1yb3ctLWJvdHRvbSwKLm1qci1tZnYtcGxheWVyLWhvc3QgLm1qci12aWRlby1jb250cm9sc1tkYXRhLW1qci1sYXlvdXQ9InN0YWNrZWQiXSAubWpyLXZpZGVvLXJvdy0tYm90dG9tIHsKICAgIGZsZXgtd3JhcDogbm93cmFwOwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIGdhcDogNnB4Owp9CgoubWpyLW1mdi1wbGF5ZXItaG9zdCAubWpyLXZpZGVvLWNvbnRyb2xzW2RhdGEtbWpyLWxheW91dD0iY29tcGFjdCJdIC5tanItdmlkZW8tYm90dG9tLAoubWpyLW1mdi1wbGF5ZXItaG9zdCAubWpyLXZpZGVvLWNvbnRyb2xzW2RhdGEtbWpyLWxheW91dD0ic3RhY2tlZCJdIC5tanItdmlkZW8tYm90dG9tIHsKICAgIGZsZXgtc2hyaW5rOiAxOwogICAgZmxleC13cmFwOiBub3dyYXA7Cn0KCi5tanItbWZ2LXBsYXllci1ob3N0IC5tanItdmlkZW8tY29udHJvbHNbZGF0YS1tanItbGF5b3V0PSJjb21wYWN0Il0gLm1qci12aWRlby10cmFuc3BvcnQsCi5tanItbWZ2LXBsYXllci1ob3N0IC5tanItdmlkZW8tY29udHJvbHNbZGF0YS1tanItbGF5b3V0PSJzdGFja2VkIl0gLm1qci12aWRlby10cmFuc3BvcnQgewogICAgZmxleC13cmFwOiBub3dyYXA7Cn0KCi5tanItbWZ2LXBsYXllci1ob3N0IC5tanItdmlkZW8tY29udHJvbHNbZGF0YS1tanItbGF5b3V0PSJjb21wYWN0Il0gLm1qci12aWRlby1ncm91cCwKLm1qci1tZnYtcGxheWVyLWhvc3QgLm1qci12aWRlby1jb250cm9sc1tkYXRhLW1qci1sYXlvdXQ9InN0YWNrZWQiXSAubWpyLXZpZGVvLWdyb3VwIHsKICAgIGZsZXgtd3JhcDogbm93cmFwOwp9CgoubWpyLW1mdi1wbGF5ZXItaG9zdCAubWpyLXZpZGVvLWNvbnRyb2xzW2RhdGEtbWpyLWxheW91dD0iY29tcGFjdCJdIC5tanItdmlkZW8tc2Vlay13cmFwLAoubWpyLW1mdi1wbGF5ZXItaG9zdCAubWpyLXZpZGVvLWNvbnRyb2xzW2RhdGEtbWpyLWxheW91dD0ic3RhY2tlZCJdIC5tanItdmlkZW8tc2Vlay13cmFwIHsKICAgIG1pbi13aWR0aDogMDsKfQoKLyogVGhlIE1GViB1c2VzIHRoZSAiLS12aWV3ZXIiIGNvbnRyb2wgdmFyaWFudCwgd2hpY2ggKHVubGlrZSAiLS12aWV3ZXJiYXIiKQogICBkb2VzIG5vdCBzaXplIHRoZSBuYXRpdmUgc2VlayBpbnB1dCBhbmQgcGFja3MgZnJhbWUvaW4vc2Vlay9vdXQvdGltZSBpbnRvIGEKICAgc2luZ2xlIHJvdy4gSW4gdGhlIG5hcnJvdyBNRlYgdGhlIHNlZWsgd3JhcCB0aGVuIGNvbGxhcHNlcyB0byB+MHB4IHdpZGUgYW5kCiAgIHRoZSBuYXRpdmUgaW5wdXQgdG8gMHB4IHRhbGwsIGxlYXZpbmcgYWxtb3N0IG5vIGNsaWNrIC8gZHJhZyB0YXJnZXQgZm9yCiAgIHNjcnViYmluZy4gR2l2ZSB0aGUgc2VlayBpdHMgb3duIGZ1bGwtd2lkdGggcm93IHdpdGggYSB1c2FibGUgaGl0IGFyZWEuICovCi5tanItbWZ2LXBsYXllci1ob3N0IC5tanItdmlkZW8tY29udHJvbHMtLXZpZXdlciAubWpyLXZpZGVvLXJvdy0tdG9wIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBmbGV4LXdyYXA6IHdyYXA7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgcm93LWdhcDogNDJweDsKfQoKLm1qci1tZnYtcGxheWVyLWhvc3QgLm1qci12aWRlby1jb250cm9scy0tdmlld2VyIC5tanItdmlkZW8tcm93LS10b3AgLm1qci12aWRlby1zZWVrLXdyYXAgewogICAgb3JkZXI6IDEwOwogICAgZmxleDogMSAxIDEwMCU7CiAgICB3aWR0aDogMTAwJTsKICAgIG1pbi13aWR0aDogMDsKICAgIG1pbi1oZWlnaHQ6IDQycHg7CiAgICBwYWRkaW5nLXRvcDogNnB4Owp9CgoubWpyLW1mdi1wbGF5ZXItaG9zdCAubWpyLXZpZGVvLWNvbnRyb2xzLS12aWV3ZXIgLm1qci12aWRlby1yYW5nZS0tc2VlayB7CiAgICBoZWlnaHQ6IDIwcHg7CiAgICBhY2NlbnQtY29sb3I6IHJnYmEoMjE0LCAyMTgsIDIyNCwgMC45Mik7Cn0KCi5tanItbWZ2LXBsYXllci1ob3N0IC5tanItdmlkZW8tY29udHJvbHMtLXZpZXdlciAubWpyLXZpZGVvLXNlZWstem9uZXMgewogICAgaGVpZ2h0OiAxMHB4Owp9CgoubWpyLW1mdi1wbGF5ZXItaG9zdCAubWpyLXZpZGVvLWNvbnRyb2xzLS12aWV3ZXIgLm1qci12aWRlby1zZWVrLWhhbmRsZSB7CiAgICB3aWR0aDogMTZweDsKICAgIGhlaWdodDogMjhweDsKICAgIHRvcDogMjBweDsKfQoKLm1qci1tZnYtcGxheWVyLWhvc3QgLm1qci12aWRlby1jb250cm9sc1tkYXRhLW1qci1sYXlvdXQ9ImNvbXBhY3QiXSAubWpyLXZpZGVvLWJhci10aW1lbGluZSwKLm1qci1tZnYtcGxheWVyLWhvc3QgLm1qci12aWRlby1jb250cm9sc1tkYXRhLW1qci1sYXlvdXQ9InN0YWNrZWQiXSAubWpyLXZpZGVvLWJhci10aW1lbGluZSB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZmxleC13cmFwOiB3cmFwOwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKfQoKLm1qci1tZnYtcGxheWVyLWhvc3QKICAgIC5tanItdmlkZW8tY29udHJvbHNbZGF0YS1tanItbGF5b3V0PSJjb21wYWN0Il0KICAgIC5tanItdmlkZW8tYmFyLXRpbWVsaW5lCiAgICAubWpyLXZpZGVvLXNlZWstd3JhcCwKLm1qci1tZnYtcGxheWVyLWhvc3QKICAgIC5tanItdmlkZW8tY29udHJvbHNbZGF0YS1tanItbGF5b3V0PSJzdGFja2VkIl0KICAgIC5tanItdmlkZW8tYmFyLXRpbWVsaW5lCiAgICAubWpyLXZpZGVvLXNlZWstd3JhcCB7CiAgICBvcmRlcjogLTE7CiAgICBmbGV4OiAxIDEgMTAwJTsKICAgIHdpZHRoOiAxMDAlOwp9CgoubWpyLW1mdi1wbGF5ZXItaG9zdAogICAgLm1qci12aWRlby1jb250cm9sc1tkYXRhLW1qci1sYXlvdXQ9ImNvbXBhY3QiXQogICAgLm1qci12aWRlby1iYXItdGltZWxpbmUKICAgIC5tanItdmlkZW8tZ3JvdXAtLWluLAoubWpyLW1mdi1wbGF5ZXItaG9zdAogICAgLm1qci12aWRlby1jb250cm9sc1tkYXRhLW1qci1sYXlvdXQ9ImNvbXBhY3QiXQogICAgLm1qci12aWRlby1iYXItdGltZWxpbmUKICAgIC5tanItdmlkZW8tZ3JvdXAtLW91dCwKLm1qci1tZnYtcGxheWVyLWhvc3QKICAgIC5tanItdmlkZW8tY29udHJvbHNbZGF0YS1tanItbGF5b3V0PSJzdGFja2VkIl0KICAgIC5tanItdmlkZW8tYmFyLXRpbWVsaW5lCiAgICAubWpyLXZpZGVvLWdyb3VwLS1pbiwKLm1qci1tZnYtcGxheWVyLWhvc3QKICAgIC5tanItdmlkZW8tY29udHJvbHNbZGF0YS1tanItbGF5b3V0PSJzdGFja2VkIl0KICAgIC5tanItdmlkZW8tYmFyLXRpbWVsaW5lCiAgICAubWpyLXZpZGVvLWdyb3VwLS1vdXQgewogICAgZmxleDogMCAxIGF1dG87Cn0KCi5tanItbWZ2LXBsYXllci1ob3N0IC5tanItdmlkZW8tY29udHJvbHNbZGF0YS1tanItbGF5b3V0PSJjb21wYWN0Il0gLm1qci12aWRlby1yYW5nZS1jb3VudCwKLm1qci1tZnYtcGxheWVyLWhvc3QgLm1qci12aWRlby1jb250cm9sc1tkYXRhLW1qci1sYXlvdXQ9ImNvbXBhY3QiXSAubWpyLXZpZGVvLWZyYW1lIHsKICAgIG1pbi13aWR0aDogYXV0bzsKfQoKLm1qci1tZnYtcGxheWVyLWhvc3QgLm1qci12aWRlby1jb250cm9sc1tkYXRhLW1qci1sYXlvdXQ9InN0YWNrZWQiXSAubWpyLXZpZGVvLXJhbmdlLWNvdW50IHsKICAgIGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDsKfQoKLm1qci1tZnYtcGxheWVyLWhvc3QgLm1qci12aWRlby1jb250cm9sc1tkYXRhLW1qci1sYXlvdXQ9InN0YWNrZWQiXSAubWpyLXZpZGVvLWZyYW1lIHsKICAgIG1pbi13aWR0aDogYXV0bzsKICAgIHBhZGRpbmc6IDNweCA2cHg7Cn0KCi5tanItbWZ2LXBsYXllci1ob3N0IC5tanItdmlkZW8tY29udHJvbHNbZGF0YS1tanItbGF5b3V0PSJzdGFja2VkIl0gLm1qci12aWRlby1idG4tLWluLAoubWpyLW1mdi1wbGF5ZXItaG9zdCAubWpyLXZpZGVvLWNvbnRyb2xzW2RhdGEtbWpyLWxheW91dD0ic3RhY2tlZCJdIC5tanItdmlkZW8tYnRuLS1vdXQsCi5tanItbWZ2LXBsYXllci1ob3N0IC5tanItdmlkZW8tY29udHJvbHNbZGF0YS1tanItbGF5b3V0PSJzdGFja2VkIl0gLm1qci12aWRlby1idG4tLW1hcmsgewogICAgbWluLXdpZHRoOiAzMnB4Owp9CgpAY29udGFpbmVyIChtYXgtd2lkdGg6IDkwMHB4KSB7CiAgICAubWpyLW1mdi1wbGF5ZXItaG9zdCAubWpyLXZpZGVvLWNvbnRyb2xzIHsKICAgICAgICBsZWZ0OiA4cHg7CiAgICAgICAgcmlnaHQ6IDhweDsKICAgICAgICBib3R0b206IDhweDsKICAgICAgICBwYWRkaW5nOiA4cHg7CiAgICAgICAgZ2FwOiA2cHg7CiAgICB9CgogICAgLm1qci1tZnYtcGxheWVyLWhvc3QgLm1qci12aWRlby1yb3ctLXRvcCB7CiAgICAgICAgZ2FwOiA4cHg7CiAgICB9CgogICAgLm1qci1tZnYtcGxheWVyLWhvc3QgLm1qci12aWRlby10aW1lZ3JvdXAgewogICAgICAgIGp1c3RpZnktY29udGVudDogZmxleC1zdGFydDsKICAgICAgICBnYXA6IDZweDsKICAgIH0KCiAgICAubWpyLW1mdi1wbGF5ZXItaG9zdCAubWpyLXZpZGVvLXJvdy0tYm90dG9tIHsKICAgICAgICBmbGV4LXdyYXA6IG5vd3JhcDsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICAgIGdhcDogNnB4OwogICAgfQoKICAgIC5tanItbWZ2LXBsYXllci1ob3N0IC5tanItdmlkZW8tYm90dG9tIHsKICAgICAgICBmbGV4LXNocmluazogMTsKICAgICAgICBmbGV4LXdyYXA6IG5vd3JhcDsKICAgIH0KCiAgICAubWpyLW1mdi1wbGF5ZXItaG9zdCAubWpyLXZpZGVvLXRyYW5zcG9ydCB7CiAgICAgICAgZmxleC13cmFwOiBub3dyYXA7CiAgICB9CgogICAgLm1qci1tZnYtcGxheWVyLWhvc3QgLm1qci12aWRlby1ncm91cCB7CiAgICAgICAgZmxleC13cmFwOiBub3dyYXA7CiAgICB9CgogICAgLm1qci1tZnYtcGxheWVyLWhvc3QgLm1qci12aWRlby1zZWVrLXdyYXAgewogICAgICAgIG1pbi13aWR0aDogMDsKICAgIH0KCiAgICAubWpyLW1mdi1wbGF5ZXItaG9zdCAubWpyLXZpZGVvLWNvbnRyb2xzLS12aWV3ZXJiYXIgLm1qci12aWRlby1iYXItdGltZWxpbmUgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC13cmFwOiB3cmFwOwogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICB9CgogICAgLm1qci1tZnYtcGxheWVyLWhvc3QKICAgICAgICAubWpyLXZpZGVvLWNvbnRyb2xzLS12aWV3ZXJiYXIKICAgICAgICAubWpyLXZpZGVvLWJhci10aW1lbGluZQogICAgICAgIC5tanItdmlkZW8tc2Vlay13cmFwIHsKICAgICAgICBvcmRlcjogLTE7CiAgICAgICAgZmxleDogMSAxIDEwMCU7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICB9Cn0KCkBjb250YWluZXIgKG1heC13aWR0aDogNjgwcHgpIHsKICAgIC5tanItbWZ2LXBsYXllci1ob3N0IC5tanItdmlkZW8tY29udHJvbHMgewogICAgICAgIHBhZGRpbmc6IDZweDsKICAgIH0KCiAgICAubWpyLW1mdi1wbGF5ZXItaG9zdCAubWpyLXZpZGVvLWJ0biB7CiAgICAgICAgcGFkZGluZzogNXB4IDhweDsKICAgICAgICBmb250LXNpemU6IDEycHg7CiAgICB9CgogICAgLm1qci1tZnYtcGxheWVyLWhvc3QgLm1qci12aWRlby1udW0gewogICAgICAgIHBhZGRpbmc6IDRweCA2cHg7CiAgICAgICAgZm9udC1zaXplOiAxMXB4OwogICAgfQoKICAgIC5tanItbWZ2LXBsYXllci1ob3N0IC5tanItdmlkZW8tdGltZSwKICAgIC5tanItbWZ2LXBsYXllci1ob3N0IC5tanItdmlkZW8tZnJhbWUsCiAgICAubWpyLW1mdi1wbGF5ZXItaG9zdCAubWpyLXZpZGVvLXJhbmdlLWNvdW50IHsKICAgICAgICBmb250LXNpemU6IDExcHg7CiAgICB9Cn0KCi8qIC0tIFNldHRpbmdzIGJ1dHRvbiBhY3RpdmUgc3RhdGUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi5tanItbWZ2LXNldHRpbmdzLWJ0bi5hY3RpdmUgewogICAgYm9yZGVyLWNvbG9yOiBjb2xvci1taXgoCiAgICAgICAgaW4gc3JnYiwKICAgICAgICB2YXIoLS1tanItYWNjZW50LCAjNWZiM2ZmKSA1NSUsCiAgICAgICAgdmFyKC0tbWpyLWJvcmRlciwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEyKSkKICAgICk7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiBjb2xvci1taXgoCiAgICAgICAgaW4gc3JnYiwKICAgICAgICB2YXIoLS1tanItc3VyZmFjZS0yLCAjMzMzKSA3MCUsCiAgICAgICAgdmFyKC0tbWpyLWFjY2VudCwgIzVmYjNmZikgMTglCiAgICApOwp9Ci5tanItbWZ2LXNldHRpbmdzLWJ0bi5hY3RpdmUgLnBpIHsKICAgIGNvbG9yOiB2YXIoLS1tanItYWNjZW50LCAjNWZiM2ZmKTsKfQoKLyogLS0gQ2xvc2UgYnV0dG9uIChyZWQpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoubWpyLW1mdiAubWpyLW1mdi1jbG9zZS1idG4gewogICAgY29sb3I6ICNlODUwNTA7Cn0KLm1qci1tZnYgLm1qci1tZnYtY2xvc2UtYnRuOmhvdmVyIHsKICAgIGNvbG9yOiAjZmY2YjZiOwogICAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgyMzIsIDgwLCA4MCwgMC4xNSk7Cn0KCi8qIC0tIEVtcHR5IHN0YXRlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLm1qci1tZnYtZW1wdHkgewogICAgd2lkdGg6IDEwMCU7CiAgICBoZWlnaHQ6IDEwMCU7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4yNSk7CiAgICBmb250LXNpemU6IDExcHg7CiAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgIHRleHQtYWxpZ246IGNlbnRlcjsKICAgIHBhZGRpbmc6IDEycHg7Cn0KCi8qIC0tIENvbXBhcmUgbGFiZWxzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLm1qci1tZnYtbGFiZWwgewogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgdG9wOiA4cHg7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIDAuNTgpOwogICAgY29sb3I6ICNmZmY7CiAgICBmb250LXNpemU6IDEwcHg7CiAgICBmb250LXdlaWdodDogNzAwOwogICAgcGFkZGluZzogMnB4IDdweDsKICAgIGJvcmRlci1yYWRpdXM6IDRweDsKICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgei1pbmRleDogMjA7CiAgICBsZXR0ZXItc3BhY2luZzogMC40cHg7Cn0KCi5tanItbWZ2LWxhYmVsLmxhYmVsLWxlZnQgewogICAgbGVmdDogOHB4Owp9Ci5tanItbWZ2LWxhYmVsLmxhYmVsLXJpZ2h0IHsKICAgIHJpZ2h0OiA4cHg7Cn0KCi8qIC0tIEFCIGRpdmlkZXIgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLm1qci1tZnYtYWItZGl2aWRlciB7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICB0b3A6IDA7CiAgICBib3R0b206IDA7CiAgICB3aWR0aDogMC41cHg7CiAgICBjdXJzb3I6IGNvbC1yZXNpemU7CiAgICB6LWluZGV4OiAxMDsKICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgtNTAlKTsKICAgIGJhY2tncm91bmQ6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC44OCk7CiAgICBib3gtc2hhZG93OgogICAgICAgIDAgMCAwIDAuNXB4IHJnYmEoMCwgMCwgMCwgMC40KSwKICAgICAgICAwIDJweCA4cHggcmdiYSgwLCAwLCAwLCAwLjQpOwogICAgdHJhbnNpdGlvbjogYmFja2dyb3VuZCAxMDBtcyBlYXNlOwp9CgoubWpyLW1mdi1hYi1kaXZpZGVyOjpiZWZvcmUgewogICAgY29udGVudDogIiI7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICB0b3A6IDA7CiAgICBib3R0b206IDA7CiAgICBsZWZ0OiA1MCU7CiAgICB3aWR0aDogMTJweDsKICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgtNTAlKTsKfQoKLm1qci1tZnYtYWItZGl2aWRlcjpob3ZlciwKLm1qci1tZnYtYWItZGl2aWRlcjphY3RpdmUgewogICAgYmFja2dyb3VuZDogdmFyKC0tbWpyLWFjY2VudCwgIzVmYjNmZik7Cn0KCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgIE1GViBHZW9tZXRyeSAmIExheW91dCBDbGFzc2VzIChyZXBsYWNlcyBpbmxpbmUgc3R5bGVzIGluIEZsb2F0aW5nVmlld2VyLmpzKQogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoKLyogTWFpbiBNRlYgY29udGFpbmVyIGdlb21ldHJ5ICovCi5tanItbWZ2IHsKICAgIHBvc2l0aW9uOiBmaXhlZDsKICAgIHRvcDogdmFyKC0tbWpyLW1mdi10b3Atb2Zmc2V0LCA2MHB4KTsKICAgIHJpZ2h0OiAyMHB4OwogICAgd2lkdGg6IDY0MHB4OwogICAgaGVpZ2h0OiAzNjBweDsKICAgIG1pbi13aWR0aDogMjIwcHg7CiAgICBtaW4taGVpZ2h0OiAxNjBweDsKICAgIC8qIEFsd2F5cyBmbGV4OyB2aXNpYmlsaXR5ICsgb3BhY2l0eSBjb250cm9sIHNob3cvaGlkZSBzbyBDU1MgdHJhbnNpdGlvbnMgd29yay4KICAgICAgIHBvaW50ZXItZXZlbnRzOm5vbmUgd2hpbGUgaGlkZGVuIHByZXZlbnRzIGFjY2lkZW50YWwgaW50ZXJhY3Rpb24uICovCiAgICBkaXNwbGF5OiBmbGV4OwogICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgIHJlc2l6ZTogYm90aDsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICB6LWluZGV4OiAxMDAwMDsKICAgIC8qIEhpZGRlbiBzdGF0ZSAqLwogICAgb3BhY2l0eTogMDsKICAgIHZpc2liaWxpdHk6IGhpZGRlbjsKICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC02cHgpIHNjYWxlKDAuOTgpOwogICAgdHJhbnNmb3JtLW9yaWdpbjogdG9wIHJpZ2h0OwogICAgdHJhbnNpdGlvbjoKICAgICAgICBvcGFjaXR5IDAuMThzIGVhc2Utb3V0LAogICAgICAgIHRyYW5zZm9ybSAwLjE4cyBlYXNlLW91dCwKICAgICAgICB2aXNpYmlsaXR5IDBzIGxpbmVhciAwLjE4czsKfQoKLm1qci1tZnYubWpyLW1mdi0tcmVzaXppbmcgewogICAgdXNlci1zZWxlY3Q6IG5vbmU7Cn0KCi5tanItbWZ2LmlzLXZpc2libGUgewogICAgb3BhY2l0eTogMTsKICAgIHZpc2liaWxpdHk6IHZpc2libGU7CiAgICBwb2ludGVyLWV2ZW50czogYXV0bzsKICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgwKSBzY2FsZSgxKTsKICAgIHRyYW5zaXRpb246CiAgICAgICAgb3BhY2l0eSAwLjE4cyBlYXNlLW91dCwKICAgICAgICB0cmFuc2Zvcm0gMC4xOHMgZWFzZS1vdXQsCiAgICAgICAgdmlzaWJpbGl0eSAwcyBsaW5lYXIgMHM7Cn0KCi8qIE1lZGlhIGVsZW1lbnRzIChpbWcvdmlkZW8pIHNpemluZyB2YXJpYW50cyAqLwoubWpyLW1mdi1tZWRpYSB7CiAgICBkaXNwbGF5OiBibG9jazsKICAgIHdpZHRoOiAxMDAlOwogICAgaGVpZ2h0OiAxMDAlOwogICAgbWF4LXdpZHRoOiAxMDAlOwogICAgbWF4LWhlaWdodDogMTAwJTsKICAgIG9iamVjdC1maXQ6IGNvbnRhaW47CiAgICBvYmplY3QtcG9zaXRpb246IGNlbnRlcjsKfQoKLm1qci1tZnYtbWVkaWEtLWZpdC1oZWlnaHQgewogICAgd2lkdGg6IDEwMCU7CiAgICBoZWlnaHQ6IDEwMCU7CiAgICBtYXgtd2lkdGg6IDEwMCU7CiAgICBtYXgtaGVpZ2h0OiAxMDAlOwogICAgb2JqZWN0LWZpdDogY29udGFpbjsKICAgIG9iamVjdC1wb3NpdGlvbjogY2VudGVyOwp9CgoubWpyLW1mdi1tZWRpYS0tZmlsbCB7CiAgICB3aWR0aDogMTAwJTsKICAgIGhlaWdodDogMTAwJTsKICAgIG1heC13aWR0aDogMTAwJTsKICAgIG1heC1oZWlnaHQ6IDEwMCU7CiAgICBvYmplY3QtZml0OiBjb250YWluOwogICAgb2JqZWN0LXBvc2l0aW9uOiBjZW50ZXI7CiAgICBkaXNwbGF5OiBibG9jazsKfQoKLyogQXVkaW8gY2FyZCBpbnNpZGUgTUZWICovCi5tanItbWZ2LWF1ZGlvLWNhcmQgewogICAgd2lkdGg6IG1pbig5MiUsIDU2MHB4KTsKICAgIG1heC13aWR0aDogMTAwJTsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgZ2FwOiAxMHB4OwogICAgcGFkZGluZzogMTJweDsKICAgIGJvcmRlci1yYWRpdXM6IDEwcHg7CiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTgpOwogICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KDE2MGRlZywgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA2KSwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjAyKSk7CiAgICBib3gtc2hhZG93OiAwIDZweCAxNnB4IHJnYmEoMCwgMCwgMCwgMC4zNSk7Cn0KCi5tanItbWZ2LWF1ZGlvLWhlYWQgewogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBnYXA6IDhweDsKICAgIG1pbi13aWR0aDogMDsKfQoKLm1qci1tZnYtYXVkaW8taWNvbiB7CiAgICBjb2xvcjogdmFyKC0tbWpyLWJhZGdlLWF1ZGlvLCAjZmY5ODAwKTsKICAgIG9wYWNpdHk6IDAuOTU7Cn0KCi5tanItbWZ2LWF1ZGlvLXRpdGxlIHsKICAgIG1pbi13aWR0aDogMDsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICBmb250LXNpemU6IDEycHg7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjkpOwp9CgoubWpyLW1mdi1hdWRpby1wbGF5ZXIgewogICAgd2lkdGg6IDEwMCU7Cn0KCi5tanItbWZ2LXNpZGUtcGFuZWwgLm1qci1tZnYtYXVkaW8tY2FyZCwKLm1qci1tZnYtYWItbGF5ZXIgLm1qci1tZnYtYXVkaW8tY2FyZCwKLm1qci1tZnYtZ3JpZC1jZWxsIC5tanItbWZ2LWF1ZGlvLWNhcmQgewogICAgd2lkdGg6IGNhbGMoMTAwJSAtIDIwcHgpOwp9CgovKiBWaWRlbyBlbGVtZW50IHNwZWNpZmljIHN0eWxlcyAqLwoubWpyLW1mdi1tZWRpYS12aWRlbyB7CiAgICAvKiBJbmhlcml0cyBmcm9tIC5tanItbWZ2LW1lZGlhIG9yIC5tanItbWZ2LW1lZGlhLS1maWxsICovCn0KCi8qIE5vZGUgU3RyZWFtIC0gY3VycmVudGx5LXN0cmVhbWVkIG5vZGUgYmFkZ2UgKHRvcC1sZWZ0IG9mIGNvbnRlbnQgYXJlYSwKICAgZm9sbG93aW5nIHRoZSBzYW1lIG92ZXJsYXkgcGF0dGVybiBhcyAubWpyLW1mdi1nZW5pbmZvKS4gKi8KLm1qci1tZnYtbm9kZS1vdmVybGF5IHsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIHRvcDogOHB4OwogICAgbGVmdDogOHB4OwogICAgei1pbmRleDogMTI7CiAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgIHBhZGRpbmc6IDRweCA4cHg7CiAgICBib3JkZXItcmFkaXVzOiA2cHg7CiAgICBmb250LXNpemU6IDExcHg7CiAgICBmb250LXdlaWdodDogNjAwOwogICAgbGluZS1oZWlnaHQ6IDEuMzsKICAgIGNvbG9yOiAjZTZmM2ZmOwogICAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjY1KTsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMTIwLCAxNzAsIDI0MCwgMC40NSk7CiAgICBib3gtc2hhZG93OiAwIDJweCA4cHggcmdiYSgwLCAwLCAwLCAwLjQpOwogICAgYmFja2Ryb3AtZmlsdGVyOiBibHVyKDZweCk7CiAgICAtd2Via2l0LWJhY2tkcm9wLWZpbHRlcjogYmx1cig2cHgpOwogICAgbWF4LXdpZHRoOiBjYWxjKDEwMCUgLSAxNnB4KTsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7Cn0KLyogR2VuIGluZm8gb3ZlcmxheSAtIGFsbCBtb2RlcyBzaGFyZSBiYXNlIGxheW91dCAqLwoubWpyLW1mdi1nZW5pbmZvLAoubWpyLW1mdi1nZW5pbmZvLWEsCi5tanItbWZ2LWdlbmluZm8tYiB7CiAgICBkaXNwbGF5OiBub25lOwogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgbGVmdDogOHB4OwogICAgcmlnaHQ6IDhweDsKICAgIGJvdHRvbTogOHB4OwogICAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjY1KTsKICAgIGNvbG9yOiAjZmZmOwogICAgcGFkZGluZzogOHB4IDEwcHg7CiAgICBib3JkZXItcmFkaXVzOiA2cHg7CiAgICBmb250LXNpemU6IDExcHg7CiAgICBtYXgtaGVpZ2h0OiA0MCU7CiAgICBvdmVyZmxvdy15OiBhdXRvOwogICAgb3ZlcmZsb3cteDogaGlkZGVuOwogICAgb3ZlcnNjcm9sbC1iZWhhdmlvci15OiBjb250YWluOwogICAgLXdlYmtpdC1vdmVyZmxvdy1zY3JvbGxpbmc6IHRvdWNoOwogICAgdG91Y2gtYWN0aW9uOiBwYW4teTsKICAgIHdvcmQtYnJlYWs6IGJyZWFrLXdvcmQ7CiAgICBiYWNrZHJvcC1maWx0ZXI6IGJsdXIoNnB4KTsKICAgIC13ZWJraXQtYmFja2Ryb3AtZmlsdGVyOiBibHVyKDZweCk7CiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTIpOwogICAgYm94LXNoYWRvdzogMCAycHggOHB4IHJnYmEoMCwgMCwgMCwgMC40KTsKfQoKLyogS2VlcCBHZW4gSW5mbyBhYm92ZSBjdXN0b20gc2ltcGxlLXBsYXllciBjb250cm9scyB3aGVuIHByZXNlbnQuICovCi5tanItbWZ2LWdlbmluZm8ubWpyLW1mdi1nZW5pbmZvLS1hYm92ZS1wbGF5ZXIsCi5tanItbWZ2LWdlbmluZm8tYS5tanItbWZ2LWdlbmluZm8tLWFib3ZlLXBsYXllciwKLm1qci1tZnYtZ2VuaW5mby1iLm1qci1tZnYtZ2VuaW5mby0tYWJvdmUtcGxheWVyIHsKICAgIHRvcDogOHB4OwogICAgYm90dG9tOiBhdXRvOwogICAgbWF4LWhlaWdodDogbWluKDQ1JSwgY2FsYygxMDAlIC0gMTI0cHgpKTsKfQoKLyogRmFsbGJhY2s6IHdoZW4gc2ltcGxlLXBsYXllciBpcyBpbW1lZGlhdGVseSBmb2xsb3dlZCBieSBhIGdlbmluZm8gb3ZlcmxheSwKICAgbW92ZSBpdCB1cCBldmVuIGlmIHRoZSBtb2RpZmllciBjbGFzcyB3YXMgbm90IGF0dGFjaGVkLiAqLwoubWpyLW1mdi1zaW1wbGUtcGxheWVyICsgLm1qci1tZnYtZ2VuaW5mbywKLm1qci1tZnYtc2ltcGxlLXBsYXllciArIC5tanItbWZ2LWdlbmluZm8tYSwKLm1qci1tZnYtc2ltcGxlLXBsYXllciArIC5tanItbWZ2LWdlbmluZm8tYiB7CiAgICB0b3A6IDhweDsKICAgIGJvdHRvbTogYXV0bzsKICAgIG1heC1oZWlnaHQ6IG1pbig0NSUsIGNhbGMoMTAwJSAtIDEyNHB4KSk7Cn0KCi8qIEFCIG1vZGUgb3ZlcmxheXMgYXJlIGF0dGFjaGVkIGF0IGNvbnRhaW5lciBsZXZlbDsgc2hpZnQgdGhlbSB3aGVuIEFCIGxheWVycyB1c2Ugc2ltcGxlLXBsYXllci4gKi8KLm1qci1tZnYtYWItY29udGFpbmVyOmhhcygubWpyLW1mdi1hYi1sYXllciAubWpyLW1mdi1zaW1wbGUtcGxheWVyKSAubWpyLW1mdi1nZW5pbmZvLWEsCi5tanItbWZ2LWFiLWNvbnRhaW5lcjpoYXMoLm1qci1tZnYtYWItbGF5ZXIgLm1qci1tZnYtc2ltcGxlLXBsYXllcikgLm1qci1tZnYtZ2VuaW5mby1iIHsKICAgIHRvcDogOHB4OwogICAgYm90dG9tOiBhdXRvOwogICAgbWF4LWhlaWdodDogbWluKDQ1JSwgY2FsYygxMDAlIC0gMTI0cHgpKTsKfQoKLyogU2hhcmVkIHN0eWxlIGZvciBhbGwgZ2VuIGluZm8gb3ZlcmxheSB2YXJpYW50cyAqLwoubWpyLW1mdi1nZW5pbmZvIHN0cm9uZywKLm1qci1tZnYtZ2VuaW5mby1hIHN0cm9uZywKLm1qci1tZnYtZ2VuaW5mby1iIHN0cm9uZyB7CiAgICBmb250LXdlaWdodDogNjAwOwogICAgbWFyZ2luLXJpZ2h0OiA0cHg7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjk1KTsgLyogZGVmYXVsdCAtIG92ZXJyaWRkZW4gcGVyIGZpZWxkIGJlbG93ICovCn0KCi8qIFBlci1maWVsZCBsYWJlbCBjb2xvcnMgKi8KLm1qci1tZnYtZ2VuaW5mbyBbZGF0YS1maWVsZD0icHJvbXB0Il0gc3Ryb25nLAoubWpyLW1mdi1nZW5pbmZvLWEgW2RhdGEtZmllbGQ9InByb21wdCJdIHN0cm9uZywKLm1qci1tZnYtZ2VuaW5mby1iIFtkYXRhLWZpZWxkPSJwcm9tcHQiXSBzdHJvbmcgewogICAgY29sb3I6ICM3ZWM4ZmY7Cn0gLyogYmx1ZSAgIC0gUHJvbXB0ICovCgoubWpyLW1mdi1nZW5pbmZvIFtkYXRhLWZpZWxkPSJzZWVkIl0gc3Ryb25nLAoubWpyLW1mdi1nZW5pbmZvLWEgW2RhdGEtZmllbGQ9InNlZWQiXSBzdHJvbmcsCi5tanItbWZ2LWdlbmluZm8tYiBbZGF0YS1maWVsZD0ic2VlZCJdIHN0cm9uZyB7CiAgICBjb2xvcjogI2ZmZDQ3YTsKfSAvKiBhbWJlciAgLSBTZWVkICAgKi8KCi5tanItbWZ2LWdlbmluZm8gW2RhdGEtZmllbGQ9Im1vZGVsIl0gc3Ryb25nLAoubWpyLW1mdi1nZW5pbmZvLWEgW2RhdGEtZmllbGQ9Im1vZGVsIl0gc3Ryb25nLAoubWpyLW1mdi1nZW5pbmZvLWIgW2RhdGEtZmllbGQ9Im1vZGVsIl0gc3Ryb25nIHsKICAgIGNvbG9yOiAjN2RkYThhOwp9IC8qIGdyZWVuICAtIE1vZGVsICAqLwoKLm1qci1tZnYtZ2VuaW5mbyBbZGF0YS1maWVsZD0ibG9yYSJdIHN0cm9uZywKLm1qci1tZnYtZ2VuaW5mby1hIFtkYXRhLWZpZWxkPSJsb3JhIl0gc3Ryb25nLAoubWpyLW1mdi1nZW5pbmZvLWIgW2RhdGEtZmllbGQ9ImxvcmEiXSBzdHJvbmcgewogICAgY29sb3I6ICNkNDhjZmY7Cn0gLyogdmlvbGV0IC0gTG9SQSAgICovCgoubWpyLW1mdi1nZW5pbmZvIFtkYXRhLWZpZWxkPSJzYW1wbGVyIl0gc3Ryb25nLAoubWpyLW1mdi1nZW5pbmZvLWEgW2RhdGEtZmllbGQ9InNhbXBsZXIiXSBzdHJvbmcsCi5tanItbWZ2LWdlbmluZm8tYiBbZGF0YS1maWVsZD0ic2FtcGxlciJdIHN0cm9uZyB7CiAgICBjb2xvcjogI2ZmOWY3YTsKfSAvKiBvcmFuZ2UgLSBTYW1wbGVyICovCgoubWpyLW1mdi1nZW5pbmZvIFtkYXRhLWZpZWxkPSJzY2hlZHVsZXIiXSBzdHJvbmcsCi5tanItbWZ2LWdlbmluZm8tYSBbZGF0YS1maWVsZD0ic2NoZWR1bGVyIl0gc3Ryb25nLAoubWpyLW1mdi1nZW5pbmZvLWIgW2RhdGEtZmllbGQ9InNjaGVkdWxlciJdIHN0cm9uZyB7CiAgICBjb2xvcjogI2ZmN2E5ZjsKfSAvKiBwaW5rICAgLSBTY2hlZHVsZXIgKi8KCi5tanItbWZ2LWdlbmluZm8gW2RhdGEtZmllbGQ9ImNmZyJdIHN0cm9uZywKLm1qci1tZnYtZ2VuaW5mby1hIFtkYXRhLWZpZWxkPSJjZmciXSBzdHJvbmcsCi5tanItbWZ2LWdlbmluZm8tYiBbZGF0YS1maWVsZD0iY2ZnIl0gc3Ryb25nIHsKICAgIGNvbG9yOiAjN2E5ZmZmOwp9IC8qIGluZGlnbyAtIENGRyAqLwoKLm1qci1tZnYtZ2VuaW5mbyBbZGF0YS1maWVsZD0ic3RlcCJdIHN0cm9uZywKLm1qci1tZnYtZ2VuaW5mby1hIFtkYXRhLWZpZWxkPSJzdGVwIl0gc3Ryb25nLAoubWpyLW1mdi1nZW5pbmZvLWIgW2RhdGEtZmllbGQ9InN0ZXAiXSBzdHJvbmcgewogICAgY29sb3I6ICM3YWZmZDQ7Cn0gLyogdGVhbCAgIC0gU3RlcCAqLwoKLm1qci1tZnYtZ2VuaW5mbyBbZGF0YS1maWVsZD0iZ2VuVGltZSJdIHN0cm9uZywKLm1qci1tZnYtZ2VuaW5mby1hIFtkYXRhLWZpZWxkPSJnZW5UaW1lIl0gc3Ryb25nLAoubWpyLW1mdi1nZW5pbmZvLWIgW2RhdGEtZmllbGQ9ImdlblRpbWUiXSBzdHJvbmcgewogICAgY29sb3I6ICNlMGZmN2E7Cn0gLyogbGltZSAgIC0gR2VuIFRpbWUgKi8KCi5tanItbWZ2LWdlbmluZm8gZGl2LAoubWpyLW1mdi1nZW5pbmZvLWEgZGl2LAoubWpyLW1mdi1nZW5pbmZvLWIgZGl2IHsKICAgIGxpbmUtaGVpZ2h0OiAxLjM1OwogICAgbWFyZ2luLWJvdHRvbTogM3B4Owp9CgoubWpyLW1mdi1nZW5pbmZvIGRpdjpsYXN0LWNoaWxkLAoubWpyLW1mdi1nZW5pbmZvLWEgZGl2Omxhc3QtY2hpbGQsCi5tanItbWZ2LWdlbmluZm8tYiBkaXY6bGFzdC1jaGlsZCB7CiAgICBtYXJnaW4tYm90dG9tOiAwOwp9CgovKiBTaW1wbGUgbW9kZSBjb250YWluZXIgKi8KLm1qci1tZnYtc2ltcGxlLWNvbnRhaW5lciB7CiAgICB3aWR0aDogMTAwJTsKICAgIGhlaWdodDogMTAwJTsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgcG9zaXRpb246IHJlbGF0aXZlOwp9CgovKiBBQiBtb2RlIGNvbnRhaW5lciAqLwoubWpyLW1mdi1hYi1jb250YWluZXIgewogICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgd2lkdGg6IDEwMCU7CiAgICBoZWlnaHQ6IDEwMCU7CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgYmFja2dyb3VuZDogIzAwMDsKfQoKLyogQUIgbW9kZSBsYXllcnMgKi8KLm1qci1tZnYtYWItbGF5ZXIgewogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgaW5zZXQ6IDA7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwp9CgoubWpyLW1mdi1hYi1sYXllci0tYiB7CiAgICAvKiBjbGlwLXBhdGggYXBwbGllZCBpbmxpbmUgZm9yIGR5bmFtaWMgZGl2aWRlciBwb3NpdGlvbiAqLwp9CgovKiBTaWRlLWJ5LXNpZGUgbW9kZSBjb250YWluZXIgKi8KLm1qci1tZnYtc2lkZS1jb250YWluZXIgewogICAgZGlzcGxheTogZmxleDsKICAgIHdpZHRoOiAxMDAlOwogICAgaGVpZ2h0OiAxMDAlOwogICAgZ2FwOiAycHg7CiAgICBiYWNrZ3JvdW5kOiAjMTExOwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKfQoKLyogU2lkZS1ieS1zaWRlIGhhbGYgcGFuZWxzICovCi5tanItbWZ2LXNpZGUtcGFuZWwgewogICAgZmxleDogMTsKICAgIG1pbi13aWR0aDogMDsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgYmFja2dyb3VuZDogIzBkMGQwZDsKfQoKLyogR3JpZCBjb21wYXJlICgyLTIpIGNvbnRhaW5lciAqLwoubWpyLW1mdi1ncmlkLWNvbnRhaW5lciB7CiAgICBkaXNwbGF5OiBncmlkOwogICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiAxZnIgMWZyOwogICAgZ3JpZC10ZW1wbGF0ZS1yb3dzOiAxZnIgMWZyOwogICAgd2lkdGg6IDEwMCU7CiAgICBoZWlnaHQ6IDEwMCU7CiAgICBnYXA6IDJweDsKICAgIGJhY2tncm91bmQ6ICMxMTE7CiAgICBvdmVyZmxvdzogaGlkZGVuOwp9CgovKiBHcmlkIGNlbGxzICovCi5tanItbWZ2LWdyaWQtY2VsbCB7CiAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIGJhY2tncm91bmQ6ICMwZDBkMGQ7CiAgICBtaW4td2lkdGg6IDA7CiAgICBtaW4taGVpZ2h0OiAwOwp9CgovKiBHZW4gaW5mbyBvdmVybGF5cyBmb3IgZ3JpZCBjZWxscyBDIGFuZCBEICovCi5tanItbWZ2LWdlbmluZm8tYywKLm1qci1tZnYtZ2VuaW5mby1kIHsKICAgIGRpc3BsYXk6IG5vbmU7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICBsZWZ0OiA4cHg7CiAgICByaWdodDogOHB4OwogICAgYm90dG9tOiA4cHg7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIDAuNjUpOwogICAgY29sb3I6ICNmZmY7CiAgICBwYWRkaW5nOiA4cHggMTBweDsKICAgIGJvcmRlci1yYWRpdXM6IDZweDsKICAgIGZvbnQtc2l6ZTogMTFweDsKICAgIG1heC1oZWlnaHQ6IDQwJTsKICAgIG92ZXJmbG93LXk6IGF1dG87CiAgICBvdmVyZmxvdy14OiBoaWRkZW47CiAgICBvdmVyc2Nyb2xsLWJlaGF2aW9yLXk6IGNvbnRhaW47CiAgICAtd2Via2l0LW92ZXJmbG93LXNjcm9sbGluZzogdG91Y2g7CiAgICB0b3VjaC1hY3Rpb246IHBhbi15OwogICAgd29yZC1icmVhazogYnJlYWstd29yZDsKICAgIGJhY2tkcm9wLWZpbHRlcjogYmx1cig2cHgpOwogICAgLXdlYmtpdC1iYWNrZHJvcC1maWx0ZXI6IGJsdXIoNnB4KTsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xMik7CiAgICBib3gtc2hhZG93OiAwIDJweCA4cHggcmdiYSgwLCAwLCAwLCAwLjQpOwp9CgoubWpyLW1mdi1nZW5pbmZvLWMgc3Ryb25nLAoubWpyLW1mdi1nZW5pbmZvLWQgc3Ryb25nIHsKICAgIGZvbnQtd2VpZ2h0OiA2MDA7CiAgICBtYXJnaW4tcmlnaHQ6IDRweDsKICAgIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuOTUpOwp9CgovKiBQZXItZmllbGQgbGFiZWwgY29sb3JzIGZvciBDL0QgZ2VuIGluZm8gb3ZlcmxheXMgKi8KLm1qci1tZnYtZ2VuaW5mby1jIFtkYXRhLWZpZWxkPSJwcm9tcHQiXSBzdHJvbmcsCi5tanItbWZ2LWdlbmluZm8tZCBbZGF0YS1maWVsZD0icHJvbXB0Il0gc3Ryb25nIHsKICAgIGNvbG9yOiAjN2VjOGZmOwp9Ci5tanItbWZ2LWdlbmluZm8tYyBbZGF0YS1maWVsZD0ic2VlZCJdIHN0cm9uZywKLm1qci1tZnYtZ2VuaW5mby1kIFtkYXRhLWZpZWxkPSJzZWVkIl0gc3Ryb25nIHsKICAgIGNvbG9yOiAjZmZkNDdhOwp9Ci5tanItbWZ2LWdlbmluZm8tYyBbZGF0YS1maWVsZD0ibW9kZWwiXSBzdHJvbmcsCi5tanItbWZ2LWdlbmluZm8tZCBbZGF0YS1maWVsZD0ibW9kZWwiXSBzdHJvbmcgewogICAgY29sb3I6ICM3ZGRhOGE7Cn0KLm1qci1tZnYtZ2VuaW5mby1jIFtkYXRhLWZpZWxkPSJsb3JhIl0gc3Ryb25nLAoubWpyLW1mdi1nZW5pbmZvLWQgW2RhdGEtZmllbGQ9ImxvcmEiXSBzdHJvbmcgewogICAgY29sb3I6ICNkNDhjZmY7Cn0KLm1qci1tZnYtZ2VuaW5mby1jIFtkYXRhLWZpZWxkPSJzYW1wbGVyIl0gc3Ryb25nLAoubWpyLW1mdi1nZW5pbmZvLWQgW2RhdGEtZmllbGQ9InNhbXBsZXIiXSBzdHJvbmcgewogICAgY29sb3I6ICNmZjlmN2E7Cn0KLm1qci1tZnYtZ2VuaW5mby1jIFtkYXRhLWZpZWxkPSJzY2hlZHVsZXIiXSBzdHJvbmcsCi5tanItbWZ2LWdlbmluZm8tZCBbZGF0YS1maWVsZD0ic2NoZWR1bGVyIl0gc3Ryb25nIHsKICAgIGNvbG9yOiAjZmY3YTlmOwp9Ci5tanItbWZ2LWdlbmluZm8tYyBbZGF0YS1maWVsZD0iY2ZnIl0gc3Ryb25nLAoubWpyLW1mdi1nZW5pbmZvLWQgW2RhdGEtZmllbGQ9ImNmZyJdIHN0cm9uZyB7CiAgICBjb2xvcjogIzdhOWZmZjsKfQoubWpyLW1mdi1nZW5pbmZvLWMgW2RhdGEtZmllbGQ9InN0ZXAiXSBzdHJvbmcsCi5tanItbWZ2LWdlbmluZm8tZCBbZGF0YS1maWVsZD0ic3RlcCJdIHN0cm9uZyB7CiAgICBjb2xvcjogIzdhZmZkNDsKfQoKLyogR2VuIGluZm8gYWN0aXZlIHN0YXRlIC0gYnV0dG9uIGdsb3dzIHdoZW4gYXQgbGVhc3Qgb25lIGZpZWxkIGlzIHNlbGVjdGVkICovCi5tanItbWZ2IC5tanItaWNvbi1idG4uaXMtb24gewogICAgYm9yZGVyLWNvbG9yOiByZ2JhKHZhcigtLW1qci1ncm91cC1hY2NlbnQsIDk1LCAxNzksIDI1NSksIDAuNTUpOwogICAgY29sb3I6IHZhcigtLW1qci1hY2NlbnQsICM1ZmIzZmYpOwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTIsICMzMzMpIDgwJSwgdmFyKC0tbWpyLWFjY2VudCwgIzVmYjNmZikgMTUlKTsKICAgIGJveC1zaGFkb3c6IDAgMCAwIDFweCBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWFjY2VudCwgIzVmYjNmZikgMjUlLCB0cmFuc3BhcmVudCk7Cn0KCi5tanItbWZ2IC5tanItaWNvbi1idG4uaXMtb3BlbiB7CiAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYWNjZW50LCAjNWZiM2ZmKSA2MiUsICNmZmZmZmYgMTIlKTsKICAgIGNvbG9yOiAjZWVmN2ZmOwogICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KDE4MGRlZywgcmdiYSg5NSwgMTc5LCAyNTUsIDAuMjgpLCByZ2JhKDk1LCAxNzksIDI1NSwgMC4xNCkpOwogICAgYm94LXNoYWRvdzoKICAgICAgICBpbnNldCAwIDAgMCAxcHggcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA4KSwKICAgICAgICAwIDAgMCAxcHggY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQsICM1ZmIzZmYpIDI2JSwgdHJhbnNwYXJlbnQpOwp9CgoubWpyLW1mdi5tanItbWZ2LS1wb3BwZWQgLm1qci1pY29uLWJ0bi5pcy1vcGVuIHsKICAgIGNvbG9yOiAjZmZmZmZmICFpbXBvcnRhbnQ7Cn0KCi8qIEdlbiBpbmZvIGRyb3Bkb3duIHBhbmVsICovCi5tanItbWZ2LWdlbi1kcm9wZG93biB7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICB6LWluZGV4OiAxMDAwMTsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0xLCAjMmEyYTJhKSA5NiUsIHRyYW5zcGFyZW50KTsKICAgIGNvbG9yOiB2YXIoLS1jb250ZW50LWZnLCAjZGRkKTsKICAgIHBhZGRpbmc6IDZweCA0cHg7CiAgICBib3JkZXItcmFkaXVzOiA4cHg7CiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDE5NiwgMjAyLCAyMTAsIDAuMTgpOwogICAgYm94LXNoYWRvdzoKICAgICAgICAwIDhweCAyNHB4IHJnYmEoMCwgMCwgMCwgMC41NSksCiAgICAgICAgMCAycHggNnB4IHJnYmEoMCwgMCwgMCwgMC4zKTsKICAgIGRpc3BsYXk6IG5vbmU7CiAgICBtaW4td2lkdGg6IDE1MHB4OwogICAgYmFja2Ryb3AtZmlsdGVyOiBibHVyKDhweCk7CiAgICAtd2Via2l0LWJhY2tkcm9wLWZpbHRlcjogYmx1cig4cHgpOwp9CgoubWpyLW1mdi1nZW4tZHJvcGRvd246OmJlZm9yZSB7CiAgICBjb250ZW50OiAiR0VOIElORk8iOwogICAgZGlzcGxheTogYmxvY2s7CiAgICBmb250LXNpemU6IDlweDsKICAgIGZvbnQtd2VpZ2h0OiA3MDA7CiAgICBsZXR0ZXItc3BhY2luZzogMC44cHg7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjM1KTsKICAgIHBhZGRpbmc6IDJweCAxMHB4IDZweDsKICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCByZ2JhKDE5NiwgMjAyLCAyMTAsIDAuMSk7CiAgICBtYXJnaW4tYm90dG9tOiA0cHg7Cn0KCi5tanItbWZ2LWdlbi1kcm9wZG93bi5pcy12aXNpYmxlIHsKICAgIGRpc3BsYXk6IGJsb2NrOwp9CgoubWpyLW1mdi1nZW4tZHJvcGRvd24tcm93IHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiA4cHg7CiAgICBmb250LXNpemU6IDEycHg7CiAgICBwYWRkaW5nOiA1cHggMTBweDsKICAgIGJvcmRlci1yYWRpdXM6IDVweDsKICAgIGN1cnNvcjogcG9pbnRlcjsKICAgIHRyYW5zaXRpb246IGJhY2tncm91bmQgMTAwbXMgZWFzZTsKICAgIHVzZXItc2VsZWN0OiBub25lOwp9CgoubWpyLW1mdi1nZW4tZHJvcGRvd24tcm93OmhvdmVyIHsKICAgIGJhY2tncm91bmQ6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wNyk7Cn0KCi5tanItbWZ2LWdlbi1kcm9wZG93bi1yb3cgaW5wdXRbdHlwZT0iY2hlY2tib3giXSB7CiAgICB3aWR0aDogMTNweDsKICAgIGhlaWdodDogMTNweDsKICAgIGFjY2VudC1jb2xvcjogdmFyKC0tbWpyLWFjY2VudCwgIzVmYjNmZik7CiAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICBmbGV4LXNocmluazogMDsKfQoKLyogVHJhbnNmb3JtIGZvciBwYW4vem9vbSAtIGFwcGxpZWQgaW5saW5lIGZvciBkeW5hbWljIHZhbHVlcyAqLwoubWpyLW1mdi1tZWRpYS0tdHJhbnNmb3JtIHsKICAgIHRyYW5zZm9ybS1vcmlnaW46IGNlbnRlcjsKfQoKLyogQ3Vyc29yIGZlZWRiYWNrIGZvciBwYW4vem9vbSBpbnRlcmFjdGlvbnMgKi8KLm1qci1tZnYtY29udGVudC0tZ3JhYiB7CiAgICBjdXJzb3I6IGdyYWI7Cn0KCi5tanItbWZ2LWNvbnRlbnQtLWdyYWJiaW5nIHsKICAgIGN1cnNvcjogZ3JhYmJpbmc7Cn0KCi8qIFNpZGViYXIgdGFiIGJ1dHRvbjogYWxsb3cgMi1saW5lIGxhYmVsIHZpYSBcbiBpbiBsYWJlbCBzdHJpbmcgKi8KLm1ham9vci1hc3NldHMtdGFiLWJ1dHRvbiAuc2lkZS1iYXItYnV0dG9uLWxhYmVsIHsKICAgIHdoaXRlLXNwYWNlOiBwcmUtbGluZTsKfQoKLyogQm90dG9tLXBhbmVsIGdlbmVyYXRlZCBmZWVkOiBjb21wYWN0IGNhcmRzIHdpdGggb25seSB0aGUgZ2VuZXJhdGlvbi10aW1lIHBpbGwgKi8KLm1qci1ib3R0b20tZmVlZCB7CiAgICBtaW4taGVpZ2h0OiAwOwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKfQoKLm1qci1ib3R0b20tZmVlZCAubWpyLWFtLWdyaWQtc2Nyb2xsIHsKICAgIGZsZXg6IDEgMSBhdXRvOwogICAgbWluLWhlaWdodDogMDsKICAgIGhlaWdodDogMTAwJTsKICAgIG92ZXJmbG93OiBhdXRvOwogICAgc2Nyb2xsYmFyLWd1dHRlcjogc3RhYmxlOwogICAgb3ZlcnNjcm9sbC1iZWhhdmlvci15OiBjb250YWluOwogICAgLXdlYmtpdC1vdmVyZmxvdy1zY3JvbGxpbmc6IHRvdWNoOwogICAgdG91Y2gtYWN0aW9uOiBwYW4teTsKICAgIHNjcm9sbC1iZWhhdmlvcjogc21vb3RoOwogICAgc2Nyb2xsYmFyLXdpZHRoOiB0aGluOwogICAgc2Nyb2xsYmFyLWNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMiwgIzJmMzU0MCkgNzAlLCAjN2Y4ZWEzIDMwJSkKICAgICAgICBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMCwgIzE2MTkxZikgODglLCAjMDAwIDEyJSk7Cn0KCi5tanItYm90dG9tLWZlZWQgLm1qci1hbS1ncmlkLXNjcm9sbDo6LXdlYmtpdC1zY3JvbGxiYXIsCi5tanItZmVlZC1ncm91cC1wb3BvdmVyLWdyaWQ6Oi13ZWJraXQtc2Nyb2xsYmFyIHsKICAgIHdpZHRoOiAxMHB4OwogICAgaGVpZ2h0OiAxMHB4Owp9CgoubWpyLWJvdHRvbS1mZWVkIC5tanItYW0tZ3JpZC1zY3JvbGw6Oi13ZWJraXQtc2Nyb2xsYmFyLXRodW1iLAoubWpyLWZlZWQtZ3JvdXAtcG9wb3Zlci1ncmlkOjotd2Via2l0LXNjcm9sbGJhci10aHVtYiB7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMiwgIzJmMzU0MCkgNzAlLCAjN2Y4ZWEzIDMwJSk7CiAgICBib3JkZXItcmFkaXVzOiA5OTlweDsKICAgIGJvcmRlcjogMnB4IHNvbGlkIHRyYW5zcGFyZW50OwogICAgYmFja2dyb3VuZC1jbGlwOiBwYWRkaW5nLWJveDsKfQoKLm1qci1ib3R0b20tZmVlZCAubWpyLWFtLWdyaWQtc2Nyb2xsOjotd2Via2l0LXNjcm9sbGJhci10cmFjaywKLm1qci1mZWVkLWdyb3VwLXBvcG92ZXItZ3JpZDo6LXdlYmtpdC1zY3JvbGxiYXItdHJhY2sgewogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTAsICMxNjE5MWYpIDg4JSwgIzAwMCAxMiUpOwogICAgYm9yZGVyLXJhZGl1czogOTk5cHg7Cn0KCi5tanItYm90dG9tLWZlZWQgLm1qci1ncmlkIHsKICAgIGdhcDogNnB4ICFpbXBvcnRhbnQ7CiAgICBtYXJnaW4tdG9wOiAwICFpbXBvcnRhbnQ7CiAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IHJlcGVhdChhdXRvLWZpbGwsIG1pbm1heChtaW4oMTAwJSwgMTMycHgpLCAxZnIpKSAhaW1wb3J0YW50OwogICAgbWluLWhlaWdodDogMDsKICAgIGhlaWdodDogYXV0bzsKICAgIGFsaWduLWNvbnRlbnQ6IHN0YXJ0Owp9CgoubWpyLWJvdHRvbS1mZWVkIC5tanItY2FyZCwKLm1qci1ib3R0b20tZmVlZCAubWpyLWFzc2V0LWNhcmQgewogICAgYm9yZGVyLXJhZGl1czogMTJweCAhaW1wb3J0YW50OwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0xKSA5MiUsICMwMDAgOCUpICFpbXBvcnRhbnQ7CiAgICBib3gtc2hhZG93OiAwIDZweCAxOHB4IHJnYmEoMCwgMCwgMCwgMC4yMikgIWltcG9ydGFudDsKICAgIHRyYW5zZm9ybTogbm9uZSAhaW1wb3J0YW50Owp9CgoubWpyLWJvdHRvbS1mZWVkIC5tanItY2FyZDpob3ZlciwKLm1qci1ib3R0b20tZmVlZCAubWpyLWFzc2V0LWNhcmQ6aG92ZXIgewogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC0xcHgpICFpbXBvcnRhbnQ7CiAgICBib3gtc2hhZG93OiAwIDEwcHggMjRweCByZ2JhKDAsIDAsIDAsIDAuMjgpICFpbXBvcnRhbnQ7CgogICAgLm1qci1ib3R0b20tZmVlZCAubWpyLWFzc2V0LWNhcmQuaXMtc2VsZWN0ZWQgewogICAgICAgIGJveC1zaGFkb3c6CiAgICAgICAgICAgIDAgMCAwIDNweCBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWNhcmQtc2VsZWN0aW9uLWNvbG9yKSA4MCUsIHZhcigtLWNvbnRlbnQtZmcpKSwKICAgICAgICAgICAgMCAwIDAgNnB4IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItY2FyZC1zZWxlY3Rpb24tY29sb3IpIDMwJSwgdHJhbnNwYXJlbnQpLAogICAgICAgICAgICAwIDAgMjBweCBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWNhcmQtc2VsZWN0aW9uLWNvbG9yKSA0MCUsIHRyYW5zcGFyZW50KSwKICAgICAgICAgICAgMCAxMHB4IDI4cHggcmdiYSgwLCAwLCAwLCAwLjI4KSAhaW1wb3J0YW50OwogICAgICAgIG91dGxpbmU6IDJweCBzb2xpZCB2YXIoLS1tanItY2FyZC1zZWxlY3Rpb24tY29sb3IpICFpbXBvcnRhbnQ7CiAgICAgICAgb3ZlcmZsb3c6IHZpc2libGUgIWltcG9ydGFudDsKICAgIH0KfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFzc2V0LWNhcmRbZGF0YS1tanItc3RhY2tlZD0idHJ1ZSJdLAoubWpyLWJvdHRvbS1mZWVkIC5tanItYXNzZXQtY2FyZFtkYXRhLW1qci1zdGFja2VkPSJ0cnVlIl0gewogICAgb3ZlcmZsb3c6IHZpc2libGUgIWltcG9ydGFudDsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFzc2V0LWNhcmRbZGF0YS1tanItc3RhY2tlZD0idHJ1ZSJdIC5tanItdGh1bWIsCi5tanItYm90dG9tLWZlZWQgLm1qci1hc3NldC1jYXJkW2RhdGEtbWpyLXN0YWNrZWQ9InRydWUiXSAubWpyLXRodW1iIHsKICAgIG92ZXJmbG93OiB2aXNpYmxlICFpbXBvcnRhbnQ7CiAgICBpc29sYXRpb246IGlzb2xhdGU7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hc3NldC1jYXJkW2RhdGEtbWpyLXN0YWNrZWQ9InRydWUiXSAubWpyLXRodW1iOjpiZWZvcmUsCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hc3NldC1jYXJkW2RhdGEtbWpyLXN0YWNrZWQ9InRydWUiXSAubWpyLXRodW1iOjphZnRlciwKLm1qci1ib3R0b20tZmVlZCAubWpyLWFzc2V0LWNhcmRbZGF0YS1tanItc3RhY2tlZD0idHJ1ZSJdIC5tanItdGh1bWI6OmJlZm9yZSwKLm1qci1ib3R0b20tZmVlZCAubWpyLWFzc2V0LWNhcmRbZGF0YS1tanItc3RhY2tlZD0idHJ1ZSJdIC5tanItdGh1bWI6OmFmdGVyIHsKICAgIGNvbnRlbnQ6ICIiOwogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgaW5zZXQ6IDA7CiAgICBib3JkZXItcmFkaXVzOiBpbmhlcml0OwogICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICB6LWluZGV4OiAtMTsKICAgIHRyYW5zaXRpb246CiAgICAgICAgdHJhbnNmb3JtIDE0MG1zIGVhc2UsCiAgICAgICAgb3BhY2l0eSAxNDBtcyBlYXNlOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYXNzZXQtY2FyZFtkYXRhLW1qci1zdGFja2VkPSJ0cnVlIl0gLm1qci10aHVtYjo6YmVmb3JlLAoubWpyLWJvdHRvbS1mZWVkIC5tanItYXNzZXQtY2FyZFtkYXRhLW1qci1zdGFja2VkPSJ0cnVlIl0gLm1qci10aHVtYjo6YmVmb3JlIHsKICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlKDVweCwgNXB4KSBzY2FsZSgwLjk4NSk7CiAgICBiYWNrZ3JvdW5kOgogICAgICAgIGxpbmVhci1ncmFkaWVudCgxODBkZWcsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xKSwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjAzKSksCiAgICAgICAgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTEsICMyMDI0MmIpIDg0JSwgIzAwMCAxNiUpOwogICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA4KTsKICAgIGJveC1zaGFkb3c6IDAgOHB4IDE4cHggcmdiYSgwLCAwLCAwLCAwLjE2KTsKICAgIG9wYWNpdHk6IDAuOTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFzc2V0LWNhcmRbZGF0YS1tanItc3RhY2tlZD0idHJ1ZSJdIC5tanItdGh1bWI6OmFmdGVyLAoubWpyLWJvdHRvbS1mZWVkIC5tanItYXNzZXQtY2FyZFtkYXRhLW1qci1zdGFja2VkPSJ0cnVlIl0gLm1qci10aHVtYjo6YWZ0ZXIgewogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoMTBweCwgMTBweCkgc2NhbGUoMC45Nyk7CiAgICBiYWNrZ3JvdW5kOgogICAgICAgIGxpbmVhci1ncmFkaWVudCgxODBkZWcsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wNiksIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wMikpLAogICAgICAgIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0wLCAjMTYxOTFmKSA4MiUsICMwMDAgMTglKTsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wNik7CiAgICBib3gtc2hhZG93OiAwIDEycHggMjJweCByZ2JhKDAsIDAsIDAsIDAuMTQpOwogICAgb3BhY2l0eTogMC43NTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFzc2V0LWNhcmRbZGF0YS1tanItc3RhY2tlZD0idHJ1ZSJdOmhvdmVyIC5tanItdGh1bWI6OmJlZm9yZSwKLm1qci1ib3R0b20tZmVlZCAubWpyLWFzc2V0LWNhcmRbZGF0YS1tanItc3RhY2tlZD0idHJ1ZSJdOmhvdmVyIC5tanItdGh1bWI6OmJlZm9yZSB7CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSg2cHgsIDZweCkgc2NhbGUoMC45ODUpOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYXNzZXQtY2FyZFtkYXRhLW1qci1zdGFja2VkPSJ0cnVlIl06aG92ZXIgLm1qci10aHVtYjo6YWZ0ZXIsCi5tanItYm90dG9tLWZlZWQgLm1qci1hc3NldC1jYXJkW2RhdGEtbWpyLXN0YWNrZWQ9InRydWUiXTpob3ZlciAubWpyLXRodW1iOjphZnRlciB7CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgxMnB4LCAxMnB4KSBzY2FsZSgwLjk3KTsKfQoKLm1qci1ib3R0b20tZmVlZCAubWpyLXRodW1iIHsKICAgIGFzcGVjdC1yYXRpbzogMC45NSAvIDEgIWltcG9ydGFudDsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0wKSA3MiUsICMwMDAgMjglKSAhaW1wb3J0YW50Owp9CgoubWpyLWJvdHRvbS1mZWVkIC5tanItdGh1bWItcGxheSB7CiAgICBiYWNrZ3JvdW5kOiByYWRpYWwtZ3JhZGllbnQoCiAgICAgICAgY2lyY2xlIGF0IGNlbnRlciwKICAgICAgICByZ2JhKDAsIDAsIDAsIDAuMTgpLAogICAgICAgIHJnYmEoMCwgMCwgMCwgMC4wNCkgMzglLAogICAgICAgIHRyYW5zcGFyZW50IDcwJQogICAgKTsKfQoKLm1qci1ib3R0b20tZmVlZCAubWpyLWJhZGdlLWV4dCwKLm1qci1ib3R0b20tZmVlZCAubWpyLWJhZGdlLXJhdGluZywKLm1qci1ib3R0b20tZmVlZCAubWpyLWJhZGdlLXRhZ3MgewogICAgdHJhbnNmb3JtOiBzY2FsZSgwLjkyKTsKICAgIHRyYW5zZm9ybS1vcmlnaW46IHRvcCBsZWZ0Owp9CgovKiAtLSBGZWVkIGNhcmQgaW5mbzogZGVmYXVsdCBoaWRkZW4sIHRvZ2dsZWQgdmlhIG1qci1mZWVkLXNob3ctKiBjbGFzc2VzIG9uIC5tanItZ3JpZCAtLSAqLwoubWpyLWJvdHRvbS1mZWVkIC5tanItY2FyZC1pbmZvIHsKICAgIGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDsKICAgIHBhZGRpbmc6IDRweCA2cHggIWltcG9ydGFudDsKICAgIG1pbi13aWR0aDogMDsKfQoubWpyLWJvdHRvbS1mZWVkIC5tanItZ3JpZC5tanItZmVlZC1zaG93LWluZm8gLm1qci1jYXJkLWluZm8gewogICAgZGlzcGxheTogYmxvY2sgIWltcG9ydGFudDsKfQoKLyogRmVlZCBmaWxlbmFtZSAqLwoubWpyLWJvdHRvbS1mZWVkIC5tanItY2FyZC1maWxlbmFtZSB7CiAgICBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7Cn0KLm1qci1ib3R0b20tZmVlZCAubWpyLWdyaWQubWpyLWZlZWQtc2hvdy1maWxlbmFtZSAubWpyLWNhcmQtZmlsZW5hbWUgewogICAgZGlzcGxheTogYmxvY2sgIWltcG9ydGFudDsKfQoKLyogRmVlZCBkaW1lbnNpb25zIC8gZHVyYXRpb24gKi8KLm1qci1ib3R0b20tZmVlZCAubWpyLW1ldGEtcmVzLAoubWpyLWJvdHRvbS1mZWVkIC5tanItbWV0YS1kdXJhdGlvbiB7CiAgICBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7Cn0KLm1qci1ib3R0b20tZmVlZCAubWpyLWdyaWQubWpyLWZlZWQtc2hvdy1kaW1lbnNpb25zIC5tanItbWV0YS1yZXMsCi5tanItYm90dG9tLWZlZWQgLm1qci1ncmlkLm1qci1mZWVkLXNob3ctZGltZW5zaW9ucyAubWpyLW1ldGEtZHVyYXRpb24gewogICAgZGlzcGxheTogaW5saW5lICFpbXBvcnRhbnQ7Cn0KCi8qIEZlZWQgZGF0ZS90aW1lICovCi5tanItYm90dG9tLWZlZWQgLm1qci1tZXRhLWRhdGUsCi5tanItYm90dG9tLWZlZWQgLm1qci1tZXRhLXRpbWUtdmFsIHsKICAgIGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDsKfQoubWpyLWJvdHRvbS1mZWVkIC5tanItZ3JpZC5tanItZmVlZC1zaG93LWRhdGUgLm1qci1tZXRhLWRhdGUsCi5tanItYm90dG9tLWZlZWQgLm1qci1ncmlkLm1qci1mZWVkLXNob3ctZGF0ZSAubWpyLW1ldGEtdGltZS12YWwgewogICAgZGlzcGxheTogaW5saW5lICFpbXBvcnRhbnQ7Cn0KCi8qIEZlZWQgZ2VuZXJhdGlvbiB0aW1lIGJhZGdlICovCi5tanItYm90dG9tLWZlZWQgLm1qci1tZXRhLWdlbnRpbWUgewogICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50Owp9Ci5tanItYm90dG9tLWZlZWQgLm1qci1ncmlkLm1qci1mZWVkLXNob3ctZ2VudGltZSAubWpyLW1ldGEtZ2VudGltZSB7CiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleCAhaW1wb3J0YW50Owp9CgovKiBGZWVkIHdvcmtmbG93IGRvdCAqLwoubWpyLWJvdHRvbS1mZWVkIC5tanItY2FyZC1kb3Qtd3JhcHBlciB7CiAgICBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7Cn0KLm1qci1ib3R0b20tZmVlZCAubWpyLWdyaWQubWpyLWZlZWQtc2hvdy1kb3QgLm1qci1jYXJkLWRvdC13cmFwcGVyIHsKICAgIGRpc3BsYXk6IGlubGluZS1mbGV4ICFpbXBvcnRhbnQ7Cn0KCi8qIEZlZWQgYmFkZ2VzICovCi5tanItYm90dG9tLWZlZWQgLm1qci1iYWRnZS1leHQgewogICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50Owp9Ci5tanItYm90dG9tLWZlZWQgLm1qci1ncmlkLm1qci1mZWVkLXNob3ctYmFkZ2VzLWV4dCAubWpyLWJhZGdlLWV4dCB7CiAgICBkaXNwbGF5OiBmbGV4ICFpbXBvcnRhbnQ7Cn0KCi5tanItYm90dG9tLWZlZWQgLm1qci1iYWRnZS1yYXRpbmcgewogICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50Owp9Ci5tanItYm90dG9tLWZlZWQgLm1qci1ncmlkLm1qci1mZWVkLXNob3ctYmFkZ2VzLXJhdGluZyAubWpyLWJhZGdlLXJhdGluZyB7CiAgICBkaXNwbGF5OiBmbGV4ICFpbXBvcnRhbnQ7Cn0KCi5tanItYm90dG9tLWZlZWQgLm1qci1iYWRnZS10YWdzIHsKICAgIGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDsKfQoubWpyLWJvdHRvbS1mZWVkIC5tanItZ3JpZC5tanItZmVlZC1zaG93LWJhZGdlcy10YWdzIC5tanItYmFkZ2UtdGFncyB7CiAgICBkaXNwbGF5OiBmbGV4ICFpbXBvcnRhbnQ7Cn0KCi8qIEZlZWQgbWV0YSByb3cgc3R5bGluZyAtIGZsZXggbGF5b3V0IHNvIHZpc2libGUgaXRlbXMgc3RheSBzZXBhcmF0ZWQgKi8KLm1qci1ib3R0b20tZmVlZCAubWpyLWNhcmQtbWV0YS1yb3cgewogICAgZGlzcGxheTogZmxleCAhaW1wb3J0YW50OwogICAgZmxleC13cmFwOiBub3dyYXAgIWltcG9ydGFudDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXIgIWltcG9ydGFudDsKICAgIGdhcDogNXB4ICFpbXBvcnRhbnQ7CiAgICBvdmVyZmxvdzogaGlkZGVuICFpbXBvcnRhbnQ7CiAgICBtaW4td2lkdGg6IDAgIWltcG9ydGFudDsKICAgIHBhZGRpbmctcmlnaHQ6IDAgIWltcG9ydGFudDsKICAgIGxpbmUtaGVpZ2h0OiAxLjMgIWltcG9ydGFudDsKICAgIG9wYWNpdHk6IDAuNzggIWltcG9ydGFudDsKICAgIGZvbnQtc2l6ZTogMC44ZW0gIWltcG9ydGFudDsKICAgIC8qIHRleHQtb3ZlcmZsb3cgZWxsaXBzaXMgZG9lc24ndCBhcHBseSBvbiBhIGZsZXggY29udGFpbmVyIGl0c2VsZiAqLwp9Ci8qIEVhY2ggbWV0YSBzcGFuIHRydW5jYXRlcyBpbmRpdmlkdWFsbHkgaWYgdG9vIGxvbmcgKi8KLm1qci1ib3R0b20tZmVlZCAubWpyLWNhcmQtbWV0YS1yb3cgPiBzcGFuIHsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7CiAgICBtaW4td2lkdGg6IDA7CiAgICBmbGV4LXNocmluazogMTsKfQovKiBHZW50aW1lIGJhZGdlIGFuZCB0aW1lIHZhbHVlIHNob3VsZCBzdGF5IHZpc2libGUgKGRvbid0IHNocmluayBhd2F5KSAqLwoubWpyLWJvdHRvbS1mZWVkIC5tanItY2FyZC1tZXRhLXJvdyA+IC5tanItbWV0YS1nZW50aW1lLAoubWpyLWJvdHRvbS1mZWVkIC5tanItY2FyZC1tZXRhLXJvdyA+IC5tanItbWV0YS10aW1lLXZhbCB7CiAgICBmbGV4LXNocmluazogMDsKfQoKLm1qci1ib3R0b20tZmVlZCAubWpyLWdyaWQubWpyLWZlZWQtc2hvdy1nZW50aW1lIC5tanItbWV0YS1nZW50aW1lIHsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBnYXA6IDNweDsKICAgIHBhZGRpbmc6IDNweCA3cHg7CiAgICBib3JkZXItcmFkaXVzOiA5OTlweDsKICAgIGJhY2tncm91bmQ6IHJnYmEoMTAsIDE0LCAyMCwgMC43NCk7CiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTIpOwogICAgYm94LXNoYWRvdzogMCAycHggOHB4IHJnYmEoMCwgMCwgMCwgMC4yMik7CiAgICBmb250LXNpemU6IDEwcHg7CiAgICBmb250LXdlaWdodDogODAwICFpbXBvcnRhbnQ7CiAgICBsZXR0ZXItc3BhY2luZzogMC4wMTVlbTsKICAgIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuOTgpOwogICAgdGV4dC1zaGFkb3c6CiAgICAgICAgMCAxcHggMnB4IHJnYmEoMCwgMCwgMCwgMC45KSwKICAgICAgICAwIDAgMTBweCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTYpOwogICAgYmFja2Ryb3AtZmlsdGVyOiBibHVyKDZweCk7CiAgICAtd2Via2l0LWJhY2tkcm9wLWZpbHRlcjogYmx1cig2cHgpOwp9CgovKiAtLSBBdWRpbyAvIDNEIHBsYWNlaG9sZGVyIHRodW1ibmFpbHMgaW4gdGhlIGZlZWQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoKLyogQXVkaW8gY2FyZHMgc2hvdyB0aGUgd2F2ZWZvcm0gc3ByaXRlOyBnaXZlIGl0IGEgZGlzdGluY3QgYmFja2dyb3VuZCBzbyBpdAogICBkb2Vzbid0IGxvb2sgbGlrZSBhIGJyb2tlbiBpbWFnZSBwbGFjZWhvbGRlciBpbiB0aGUgZmVlZC4gKi8KLm1qci1ib3R0b20tZmVlZCAubWpyLWFzc2V0LWNhcmRbZGF0YS1tanIta2luZD0iYXVkaW8iXSAubWpyLXRodW1iLAoubWpyLWJvdHRvbS1mZWVkIC5tanItYXNzZXQtY2FyZFtkYXRhLW1qci1leHQ9Im1wMyJdIC5tanItdGh1bWIsCi5tanItYm90dG9tLWZlZWQgLm1qci1hc3NldC1jYXJkW2RhdGEtbWpyLWV4dD0id2F2Il0gLm1qci10aHVtYiwKLm1qci1ib3R0b20tZmVlZCAubWpyLWFzc2V0LWNhcmRbZGF0YS1tanItZXh0PSJvZ2ciXSAubWpyLXRodW1iLAoubWpyLWJvdHRvbS1mZWVkIC5tanItYXNzZXQtY2FyZFtkYXRhLW1qci1leHQ9ImZsYWMiXSAubWpyLXRodW1iIHsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0wKSA2MCUsICMxYTFmMmIgNDAlKSAhaW1wb3J0YW50Owp9CgovKiAzRCBtb2RlbCBjYXJkcyB1c2UgYW4gaWNvbiBwbGFjZWhvbGRlciAtIGFkZCBhIHN1YnRsZSBncmFkaWVudCBzbyB0aGV5IHJlYWQKICAgYXMgaW50ZW50aW9uYWwgcmF0aGVyIHRoYW4gbWlzc2luZy4gKi8KLm1qci1ib3R0b20tZmVlZCAubWpyLWFzc2V0LWNhcmRbZGF0YS1tanIta2luZD0ibW9kZWwzZCJdIC5tanItdGh1bWIsCi5tanItYm90dG9tLWZlZWQgLm1qci1hc3NldC1jYXJkW2RhdGEtbWpyLWV4dD0iZ2xiIl0gLm1qci10aHVtYiwKLm1qci1ib3R0b20tZmVlZCAubWpyLWFzc2V0LWNhcmRbZGF0YS1tanItZXh0PSJnbHRmIl0gLm1qci10aHVtYiwKLm1qci1ib3R0b20tZmVlZCAubWpyLWFzc2V0LWNhcmRbZGF0YS1tanItZXh0PSJvYmoiXSAubWpyLXRodW1iLAoubWpyLWJvdHRvbS1mZWVkIC5tanItYXNzZXQtY2FyZFtkYXRhLW1qci1leHQ9ImZieCJdIC5tanItdGh1bWIgewogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTApIDUwJSwgIzBkMTExNyA1MCUpICFpbXBvcnRhbnQ7Cn0KCi8qIC0tIEZlZWQgZ3JvdXAgYnV0dG9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoKLm1qci1ib3R0b20tZmVlZCAubWpyLWZlZWQtZ3JvdXAtYnV0dG9uIHsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIHRvcDogMzRweDsKICAgIHJpZ2h0OiA2cHg7CiAgICB6LWluZGV4OiAxMTsKICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgZ2FwOiA0cHg7CiAgICBtaW4td2lkdGg6IDI4cHg7CiAgICBtaW4taGVpZ2h0OiAyOHB4OwogICAgcGFkZGluZzogNHB4IDhweDsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xNCk7CiAgICBib3JkZXItcmFkaXVzOiA5OTlweDsKICAgIGJhY2tncm91bmQ6IHJnYmEoMTAsIDE0LCAyMCwgMC43NCk7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjk2KTsKICAgIGZvbnQtc2l6ZTogMTBweDsKICAgIGZvbnQtd2VpZ2h0OiA3MDA7CiAgICBsaW5lLWhlaWdodDogMTsKICAgIGJveC1zaGFkb3c6IDAgMnB4IDhweCByZ2JhKDAsIDAsIDAsIDAuMjQpOwogICAgYmFja2Ryb3AtZmlsdGVyOiBibHVyKDZweCk7CiAgICAtd2Via2l0LWJhY2tkcm9wLWZpbHRlcjogYmx1cig2cHgpOwogICAgY3Vyc29yOiBwb2ludGVyOwogICAgdG91Y2gtYWN0aW9uOiBtYW5pcHVsYXRpb247CiAgICB0cmFuc2l0aW9uOgogICAgICAgIGJhY2tncm91bmQgMTIwbXMgZWFzZSwKICAgICAgICB0cmFuc2Zvcm0gODBtcyBlYXNlOwp9CgoubWpyLWJvdHRvbS1mZWVkIC5tanItZmVlZC1ncm91cC1idXR0b246aG92ZXIgewogICAgYmFja2dyb3VuZDogcmdiYSgxOCwgMjQsIDM0LCAwLjkpOwp9CgoubWpyLWZlZWQtZ3JvdXAtYnV0dG9uLWljb24gewogICAgZm9udC1zaXplOiAxMXB4OwogICAgb3BhY2l0eTogMC45Owp9CgoubWpyLWZlZWQtZ3JvdXAtYnV0dG9uLWNvdW50IHsKICAgIGZvbnQtc2l6ZTogMTBweDsKICAgIGZvbnQtd2VpZ2h0OiA3MDA7CiAgICBsaW5lLWhlaWdodDogMTsKfQoKLyogLS0gRmVlZCBncm91cCBwb3BvdmVyIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgoubWpyLWZlZWQtZ3JvdXAtcG9wb3ZlciB7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1jb21meS1tZW51LWJnLCAjMjIyKTsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJvcmRlci1jb2xvciwgIzNhM2EzYSk7CiAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1tanItci1sZywgOHB4KTsKICAgIGJveC1zaGFkb3c6IDAgOHB4IDI4cHggcmdiYSgwLCAwLCAwLCAwLjQ1KTsKICAgIG92ZXJmbG93OiBoaWRkZW47Cn0KCi5tanItZmVlZC1ncm91cC1wb3BvdmVyLXRpdGxlIHsKICAgIHBhZGRpbmc6IDhweCAxMHB4IDRweDsKICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDYpOwogICAgbWFyZ2luLWJvdHRvbTogOHB4Owp9CgoubWpyLWZlZWQtZ3JvdXAtcG9wb3Zlci1ncmlkIHsKICAgIHBhZGRpbmc6IDRweCA4cHggMTBweDsKICAgIG1heC1oZWlnaHQ6IDM2MHB4OwogICAgb3ZlcmZsb3cteTogYXV0bzsKICAgIG92ZXJzY3JvbGwtYmVoYXZpb3I6IGNvbnRhaW47CiAgICBzY3JvbGxiYXItZ3V0dGVyOiBzdGFibGU7CiAgICBzY3JvbGxiYXItd2lkdGg6IHRoaW47CiAgICBzY3JvbGxiYXItY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0yLCAjMmYzNTQwKSA3MCUsICM3ZjhlYTMgMzAlKQogICAgICAgIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0wLCAjMTYxOTFmKSA4OCUsICMwMDAgMTIlKTsKfQoKLm1qci1mZWVkLWdyb3VwLWJ1dHRvbi1pY29uLAoubWpyLWZlZWQtZ3JvdXAtYnV0dG9uLWNvdW50IHsKICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwp9CgoubWpyLWZlZWQtZ3JvdXAtbWVtYmVyLWNhcmQgewogICAgbWluLXdpZHRoOiAwOwp9CgoubWpyLWZlZWQtZ3JvdXAtbWVtYmVyLWNhcmQgLm1qci10aHVtYiB7CiAgICBhc3BlY3QtcmF0aW86IDEgLyAxICFpbXBvcnRhbnQ7Cn0KCi5tanItZmVlZC1ncm91cC1tZW1iZXItY2FyZCAubWpyLWNhcmQtaW5mbyB7CiAgICBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1zdGFjay1ncm91cC1idXR0b24gewogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgdG9wOiAzNHB4OwogICAgcmlnaHQ6IDZweDsKICAgIHotaW5kZXg6IDExOwogICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICBnYXA6IDRweDsKICAgIG1pbi13aWR0aDogMjhweDsKICAgIG1pbi1oZWlnaHQ6IDI4cHg7CiAgICBwYWRkaW5nOiA0cHggOHB4OwogICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE0KTsKICAgIGJvcmRlci1yYWRpdXM6IDk5OXB4OwogICAgYmFja2dyb3VuZDogcmdiYSgxMCwgMTQsIDIwLCAwLjc0KTsKICAgIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuOTYpOwogICAgbGluZS1oZWlnaHQ6IDE7CiAgICBib3gtc2hhZG93OiAwIDJweCA4cHggcmdiYSgwLCAwLCAwLCAwLjI0KTsKICAgIGJhY2tkcm9wLWZpbHRlcjogYmx1cig2cHgpOwogICAgLXdlYmtpdC1iYWNrZHJvcC1maWx0ZXI6IGJsdXIoNnB4KTsKICAgIGN1cnNvcjogcG9pbnRlcjsKICAgIHRvdWNoLWFjdGlvbjogbWFuaXB1bGF0aW9uOwogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVaKDApOwogICAgdHJhbnNpdGlvbjoKICAgICAgICBiYWNrZ3JvdW5kIDEyMG1zIGVhc2UsCiAgICAgICAgdHJhbnNmb3JtIDgwbXMgZWFzZTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLXN0YWNrLWdyb3VwLWJ1dHRvbjpob3ZlciB7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDE4LCAyNCwgMzQsIDAuOSk7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1zdGFjay1ncm91cC1idXR0b24gPiAqIHsKICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwp9CgoubWpyLWZpbG1zdHJpcDo6LXdlYmtpdC1zY3JvbGxiYXIgewogICAgd2lkdGg6IDRweDsKICAgIGhlaWdodDogNHB4Owp9CgoubWpyLWZpbG1zdHJpcDo6LXdlYmtpdC1zY3JvbGxiYXItdHJhY2sgewogICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7Cn0KCi5tanItZmlsbXN0cmlwOjotd2Via2l0LXNjcm9sbGJhci10aHVtYiB7CiAgICBib3JkZXItcmFkaXVzOiA5OTlweDsKICAgIGJhY2tncm91bmQ6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xNCk7Cn0KCi5tanItZmlsbXN0cmlwOmhvdmVyOjotd2Via2l0LXNjcm9sbGJhci10aHVtYiB7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMjIpOwp9CgoubWpyLWZpbG1zdHJpcC1hdWRpby10aHVtYiB7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICBpbnNldDogMDsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgZ2FwOiA1cHg7CiAgICBwYWRkaW5nOiA3cHg7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjgyKTsKICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgYmFja2dyb3VuZDoKICAgICAgICByYWRpYWwtZ3JhZGllbnQoY2lyY2xlIGF0IDI0JSAyNCUsIHJnYmEoNzgsIDE4NCwgMjU1LCAwLjI4KSwgdHJhbnNwYXJlbnQgNDIlKSwKICAgICAgICByYWRpYWwtZ3JhZGllbnQoY2lyY2xlIGF0IDg0JSA3MCUsIHJnYmEoODIsIDIyMCwgMTU2LCAwLjE4KSwgdHJhbnNwYXJlbnQgNDAlKSwKICAgICAgICBsaW5lYXItZ3JhZGllbnQoMTM1ZGVnLCByZ2JhKDE4LCAyNSwgMzUsIDAuOTYpLCByZ2JhKDcsIDEwLCAxNSwgMC45OCkpOwp9CgoubWpyLWZpbG1zdHJpcC1hdWRpby13YXZlZm9ybSB7CiAgICB3aWR0aDogNzYlOwogICAgaGVpZ2h0OiAyNHB4OwogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgIGdhcDogMnB4Owp9CgoubWpyLWZpbG1zdHJpcC1hdWRpby13YXZlZm9ybSBzcGFuIHsKICAgIHdpZHRoOiAycHg7CiAgICBtaW4taGVpZ2h0OiA0cHg7CiAgICBib3JkZXItcmFkaXVzOiA5OTlweDsKICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgxODBkZWcsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC45NCksIHJnYmEoMTQ4LCAyMTgsIDI1NSwgMC42OCkpOwp9CgoubWpyLWZpbG1zdHJpcC1hdWRpby1sYWJlbCB7CiAgICBtYXgtd2lkdGg6IDEwMCU7CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7CiAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgcGFkZGluZzogMnB4IDVweDsKICAgIGJvcmRlci1yYWRpdXM6IDk5OXB4OwogICAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjI4KTsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xKTsKICAgIGZvbnQtc2l6ZTogN3B4OwogICAgZm9udC13ZWlnaHQ6IDgwMDsKICAgIGxpbmUtaGVpZ2h0OiAxOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItc3RhY2stZ3JvdXAtYnV0dG9uLWNvdW50IHsKICAgIGZvbnQtc2l6ZTogMTBweDsKICAgIGZvbnQtd2VpZ2h0OiA3MDA7CiAgICBsaW5lLWhlaWdodDogMTsKfQoKLyogLS0gRHVwbGljYXRlIHN0YWNrIGJ1dHRvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLyogU2hvd3Mgb24gdGhlIHByaW1hcnkgY2FyZCB3aGVuIHNhbWUtZmlsZW5hbWUgZHVwbGljYXRlcyBleGlzdC4gICAgICAgICAgICAgKi8KLyogUG9zaXRpb25lZCBhdCBib3R0b20tcmlnaHQgdG8gbm90IG92ZXJsYXAgdGhlIHN0YWNrLWdyb3VwIGJ1dHRvbiAodG9wLXJpZ2h0KS4gKi8KLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWR1cC1zdGFjay1idXR0b24gewogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgYm90dG9tOiAzMHB4OwogICAgcmlnaHQ6IDZweDsKICAgIHotaW5kZXg6IDExOwogICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICBnYXA6IDRweDsKICAgIG1pbi13aWR0aDogMjhweDsKICAgIG1pbi1oZWlnaHQ6IDI4cHg7CiAgICBwYWRkaW5nOiA0cHggOHB4OwogICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgyNTUsIDE4MCwgMCwgMC4zOCk7CiAgICBib3JkZXItcmFkaXVzOiA5OTlweDsKICAgIGJhY2tncm91bmQ6IHJnYmEoMzAsIDE4LCAwLCAwLjgyKTsKICAgIGNvbG9yOiByZ2JhKDI1NSwgMjAwLCA2MCwgMC45Nik7CiAgICBib3gtc2hhZG93OiAwIDJweCA4cHggcmdiYSgwLCAwLCAwLCAwLjMyKTsKICAgIGJhY2tkcm9wLWZpbHRlcjogYmx1cig2cHgpOwogICAgLXdlYmtpdC1iYWNrZHJvcC1maWx0ZXI6IGJsdXIoNnB4KTsKICAgIGN1cnNvcjogcG9pbnRlcjsKICAgIGZvbnQtc2l6ZTogMTFweDsKICAgIGxpbmUtaGVpZ2h0OiAxOwogICAgdG91Y2gtYWN0aW9uOiBtYW5pcHVsYXRpb247CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVooMCk7CiAgICB0cmFuc2l0aW9uOgogICAgICAgIGJhY2tncm91bmQgMC4xNXMsCiAgICAgICAgdHJhbnNmb3JtIDgwbXMgZWFzZTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWR1cC1zdGFjay1idXR0b246aG92ZXIgewogICAgYmFja2dyb3VuZDogcmdiYSg1MCwgMzAsIDAsIDAuOTQpOwogICAgYm9yZGVyLWNvbG9yOiByZ2JhKDI1NSwgMTgwLCAwLCAwLjYpOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItZHVwLXN0YWNrLWJ1dHRvbiA+ICogewogICAgcG9pbnRlci1ldmVudHM6IG5vbmU7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1kdXAtc3RhY2stY291bnQgewogICAgZm9udC1zaXplOiAxMHB4OwogICAgZm9udC13ZWlnaHQ6IDcwMDsKICAgIGxpbmUtaGVpZ2h0OiAxOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYXNzZXQtY2FyZFtkYXRhLW1qci1kdXAtc3RhY2tlZD0idHJ1ZSJdIC5tanItZHVwLXN0YWNrLWJ1dHRvbiB7CiAgICBib3gtc2hhZG93OgogICAgICAgIDAgMnB4IDhweCByZ2JhKDAsIDAsIDAsIDAuMzIpLAogICAgICAgIDAgMCAwIDFweCByZ2JhKDI1NSwgMTgwLCAwLCAwLjIpOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYXNzZXQtY2FyZFtkYXRhLW1qci1zdGFja2VkPSJ0cnVlIl0gLm1qci1zdGFjay1ncm91cC1idXR0b24sCi5tanItYm90dG9tLWZlZWQgLm1qci1hc3NldC1jYXJkW2RhdGEtbWpyLXN0YWNrZWQ9InRydWUiXSAubWpyLWZlZWQtZ3JvdXAtYnV0dG9uIHsKICAgIGJveC1zaGFkb3c6CiAgICAgICAgMCAycHggOHB4IHJnYmEoMCwgMCwgMCwgMC4yNCksCiAgICAgICAgMCAwIDAgMXB4IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wNCk7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hc3NldC1jYXJkW2RhdGEtbWpyLXN0YWNrZWQ9InRydWUiXTpob3ZlciwKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFzc2V0LWNhcmRbZGF0YS1tanItZHVwLXN0YWNrZWQ9InRydWUiXTpob3ZlciB7CiAgICB0cmFuc2Zvcm06IG5vbmUgIWltcG9ydGFudDsKfQoKLyogLS0gVmlzdWFsIHN0YWNraW5nIGVmZmVjdCAtIGxheWVyZWQgY2FyZHMgYmVoaW5kIHRoZSBtYWluIGNhcmQgLS0tLS0tLS0tLS0tICovCi8qIENyZWF0ZXMgcHNldWRvLWVsZW1lbnQgImNhcmRzIiBvZmZzZXQgYmVoaW5kIHRoZSBwcmltYXJ5IGNhcmQgdG8gdmlzdWFsbHkgICAgKi8KLyogY29tbXVuaWNhdGUgdGhhdCB0aGlzIGNhcmQgcmVwcmVzZW50cyBhIGdyb3VwIG9mIG11bHRpcGxlIGltYWdlcy4gICAgICAgICAgICAqLwoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYXNzZXQtY2FyZFtkYXRhLW1qci1zdGFja2VkPSJ0cnVlIl0gewogICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgei1pbmRleDogMTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFzc2V0LWNhcmRbZGF0YS1tanItc3RhY2tlZD0idHJ1ZSJdOjpiZWZvcmUsCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hc3NldC1jYXJkW2RhdGEtbWpyLXN0YWNrZWQ9InRydWUiXTo6YWZ0ZXIgewogICAgY29udGVudDogIiI7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICBpbnNldDogMDsKICAgIGJvcmRlci1yYWRpdXM6IGluaGVyaXQ7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1jb21meS1tZW51LWJnLCAjMWExYTJlKTsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wNik7CiAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgIHotaW5kZXg6IC0xOwogICAgdHJhbnNpdGlvbjoKICAgICAgICB0cmFuc2Zvcm0gMTgwbXMgZWFzZSwKICAgICAgICBvcGFjaXR5IDE4MG1zIGVhc2U7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hc3NldC1jYXJkW2RhdGEtbWpyLXN0YWNrZWQ9InRydWUiXTo6YmVmb3JlIHsKICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlKDNweCwgM3B4KSByb3RhdGUoMWRlZyk7CiAgICBvcGFjaXR5OiAwLjQ1Owp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYXNzZXQtY2FyZFtkYXRhLW1qci1zdGFja2VkPSJ0cnVlIl06OmFmdGVyIHsKICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlKDZweCwgNnB4KSByb3RhdGUoMi4yZGVnKTsKICAgIG9wYWNpdHk6IDAuMjU7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hc3NldC1jYXJkW2RhdGEtbWpyLXN0YWNrZWQ9InRydWUiXTpob3Zlcjo6YmVmb3JlIHsKICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlKDRweCwgNHB4KSByb3RhdGUoMS41ZGVnKTsKICAgIG9wYWNpdHk6IDAuNTU7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hc3NldC1jYXJkW2RhdGEtbWpyLXN0YWNrZWQ9InRydWUiXTpob3Zlcjo6YWZ0ZXIgewogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoOHB4LCA4cHgpIHJvdGF0ZSgzZGVnKTsKICAgIG9wYWNpdHk6IDAuMzU7Cn0KCi5tanItc3RhY2stZ3JvdXAtcG9wb3ZlciB7CiAgICB3aWR0aDogbWluKDQ0MHB4LCA5MnZ3KTsKfQoKLm1qci1zdGFjay1ncm91cC1tZW1iZXItY2FyZCB7CiAgICBtaW4td2lkdGg6IDA7Cn0KCi5tanItc3RhY2stZ3JvdXAtbWVtYmVyLWNhcmQgLm1qci10aHVtYiB7CiAgICBhc3BlY3QtcmF0aW86IDEgLyAxICFpbXBvcnRhbnQ7Cn0KCi5tanItc3RhY2stZ3JvdXAtbWVtYmVyLWNhcmQgLm1qci1jYXJkLWluZm8gewogICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50Owp9CgovKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICogTGlnaHQgbW9kZSBvdmVycmlkZXMgKENvbWZ5VUkgdjEuNDIrIGltcHJvdmVkIGxpZ2h0IHRoZW1lKQogKiBVc2VzIENvbWZ5VUkgZGF0YS10aGVtZSBhdHRyaWJ1dGUgd2hlbiBzZXQsIHdpdGgKICogcHJlZmVycy1jb2xvci1zY2hlbWUgYXMgYSBmYWxsYmFjayBmb3Igb2xkZXIgdmVyc2lvbnMuCiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwoKLyogQ29tZnlVSSBzZXRzIGRhdGEtdGhlbWU9ImxpZ2h0IiBvbiA8aHRtbD4gb3IgPGJvZHk+ICovCjppcyhbZGF0YS10aGVtZT0ibGlnaHQiXSwgW2RhdGEtY29sb3Itc2NoZW1lPSJsaWdodCJdKSAubWpyLWFzc2V0cy1tYW5hZ2VyLAo6aXMoW2RhdGEtdGhlbWU9ImxpZ2h0Il0sIFtkYXRhLWNvbG9yLXNjaGVtZT0ibGlnaHQiXSkgLm1qci1wb3BvdmVyIHsKICAgIC0tbWpyLXN1cmZhY2UtMDogdmFyKC0taW50ZXJmYWNlLXBhbmVsLXN1cmZhY2UsICNmMGYwZjApOwogICAgLS1tanItc3VyZmFjZS0xOiB2YXIoLS1pbnRlcmZhY2UtbWVudS1zdXJmYWNlLCAjZmFmYWZhKTsKICAgIC0tbWpyLXN1cmZhY2UtMjogdmFyKC0taW50ZXJmYWNlLXBhbmVsLWhvdmVyLXN1cmZhY2UsICNlOGU4ZTgpOwogICAgLS1tanItc3VyZmFjZS0zOiB2YXIoLS1tb2RhbC1jYXJkLWJhY2tncm91bmQsICNmZmZmZmYpOwogICAgLS1tanItYm9yZGVyOiB2YXIoLS1ib3JkZXItZGVmYXVsdCwgcmdiYSgwLCAwLCAwLCAwLjE0KSk7CiAgICAtLW1qci1tdXRlZDogdmFyKC0tbXV0ZWQtZm9yZWdyb3VuZCwgcmdiYSgwLCAwLCAwLCAwLjU1KSk7CiAgICAtLW1qci1jYXJkLWhvdmVyLWNvbG9yOiB2YXIoLS1pbnRlcmZhY2UtcGFuZWwtaG92ZXItc3VyZmFjZSwgI2UwZTBlMCk7Cn0KCkBtZWRpYSAocHJlZmVycy1jb2xvci1zY2hlbWU6IGxpZ2h0KSB7CiAgICAvKiBGYWxsYmFjazogb25seSBhcHBseSBpZiBDb21meVVJIGhhc24ndCBzZXQgYW4gZXhwbGljaXQgZGF0YS10aGVtZSAqLwogICAgLm1qci1hc3NldHMtbWFuYWdlcjpub3QoW2RhdGEtdGhlbWUtYXBwbGllZF0pLAogICAgLm1qci1wb3BvdmVyOm5vdChbZGF0YS10aGVtZS1hcHBsaWVkXSkgewogICAgICAgIC0tbWpyLXN1cmZhY2UtMDogdmFyKC0taW50ZXJmYWNlLXBhbmVsLXN1cmZhY2UsICNmMGYwZjApOwogICAgICAgIC0tbWpyLXN1cmZhY2UtMTogdmFyKC0taW50ZXJmYWNlLW1lbnUtc3VyZmFjZSwgI2ZhZmFmYSk7CiAgICAgICAgLS1tanItc3VyZmFjZS0yOiB2YXIoLS1pbnRlcmZhY2UtcGFuZWwtaG92ZXItc3VyZmFjZSwgI2U4ZThlOCk7CiAgICAgICAgLS1tanItc3VyZmFjZS0zOiB2YXIoLS1tb2RhbC1jYXJkLWJhY2tncm91bmQsICNmZmZmZmYpOwogICAgICAgIC0tbWpyLWJvcmRlcjogdmFyKC0tYm9yZGVyLWRlZmF1bHQsIHJnYmEoMCwgMCwgMCwgMC4xNCkpOwogICAgICAgIC0tbWpyLW11dGVkOiB2YXIoLS1tdXRlZC1mb3JlZ3JvdW5kLCByZ2JhKDAsIDAsIDAsIDAuNTUpKTsKICAgICAgICAtLW1qci1jYXJkLWhvdmVyLWNvbG9yOiB2YXIoLS1pbnRlcmZhY2UtcGFuZWwtaG92ZXItc3VyZmFjZSwgI2UwZTBlMCk7CiAgICB9Cn0KCi8qIC0tLSBTa2VsZXRvbiBsb2FkZXJzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgoubWpyLWNhcmQtc2tlbGV0b24gewogICAgYmFja2dyb3VuZDogdmFyKC0tbWpyLXN1cmZhY2UtMSwgIzJhMmEyYSk7CiAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1tanItYm9yZGVyLCAjM2EzYTNhKTsKICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLW1qci1yLWxnLCA4cHgpOwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgIC8qIE1hdGNoIC5tanItdGh1bWIgYXNwZWN0IHJhdGlvIHNvIHNrZWxldG9ucyBoYXZlIHRoZSBzYW1lIGZvb3RwcmludCBhcyByZWFsIGNhcmRzLiAqLwogICAgYXNwZWN0LXJhdGlvOiAxIC8gMTsKfQoKLyogU2hpbW1lciBzd2VlcCAqLwoubWpyLWNhcmQtc2tlbGV0b246OmFmdGVyIHsKICAgIGNvbnRlbnQ6ICIiOwogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgaW5zZXQ6IDA7CiAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoCiAgICAgICAgOTBkZWcsCiAgICAgICAgdHJhbnNwYXJlbnQgMCUsCiAgICAgICAgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTIsICMzYTNhM2EpIDgwJSwgdHJhbnNwYXJlbnQpIDUwJSwKICAgICAgICB0cmFuc3BhcmVudCAxMDAlCiAgICApOwogICAgYW5pbWF0aW9uOiBtanItc2hpbW1lciAxLjRzIGVhc2UtaW4tb3V0IGluZmluaXRlOwogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKC0xMDAlKTsKfQoKQGtleWZyYW1lcyBtanItc2hpbW1lciB7CiAgICBmcm9tIHsKICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLTEwMCUpOwogICAgfQogICAgdG8gewogICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgxMDAlKTsKICAgIH0KfQoKQG1lZGlhIChwcmVmZXJzLXJlZHVjZWQtbW90aW9uOiByZWR1Y2UpIHsKICAgIC5tanItY2FyZC1za2VsZXRvbjo6YWZ0ZXIgewogICAgICAgIGFuaW1hdGlvbjogbm9uZTsKICAgIH0KfQoKLyogLS0tIFJlc3BvbnNpdmUgc3VtbWFyeSBiYXIgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCi8qCiAqIEVuYWJsZSBjb250YWluZXIgcXVlcmllcyBvbiB0aGUgc3VtbWFyeSBiYXIgc28gY2hpbGRyZW4gY2FuIHJlc3BvbmQgdG8gaXRzCiAqIGFjdHVhbCByZW5kZXJlZCB3aWR0aCAoZS5nLiB3aGVuIHRoZSBwYW5lbCBpcyBkb2NrZWQgaW4gYSBuYXJyb3cgc2lkZWJhcikuCiAqLwoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYW0tc3VtbWFyeSB7CiAgICBjb250YWluZXItdHlwZTogaW5saW5lLXNpemU7CiAgICBjb250YWluZXItbmFtZTogbWpyLXN1bW1hcnktYmFyOwp9CgovKiBCZWxvdyB+MzgwIHB4OiBoaWRlIHRoZSBwaWxscy9yaWdodCBzZWN0aW9uIHRvIHByZXZlbnQgb3ZlcmZsb3cuICovCkBjb250YWluZXIgbWpyLXN1bW1hcnktYmFyIChtYXgtd2lkdGg6IDM4MHB4KSB7CiAgICAubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYW0tc3VtbWFyeS1yaWdodCB7CiAgICAgICAgZGlzcGxheTogbm9uZTsKICAgIH0KICAgIC5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hbS1zdW1tYXJ5LXRleHQgewogICAgICAgIG1heC13aWR0aDogMTAwJTsKICAgIH0KfQo=", "" + import.meta.url).toString(), n = document.createElement("link"); n.id = t, n.rel = "stylesheet", n.type = "text/css", n.href = e, n.onerror = () => { try { n.remove(); @@ -295,7 +295,7 @@ function di({ enabled: e = !0 } = {}) { } }, document.head.appendChild(n), n.onload = () => { try { - document.documentElement.dataset.mjrThemeComfy = "1", ui(); + document.documentElement.dataset.mjrThemeComfy = "1", di(); } catch (e) { console.debug?.(e); } @@ -304,29 +304,29 @@ function di({ enabled: e = !0 } = {}) { console.warn("Majoor: failed to load Comfy theme CSS", e); } } -ui(); +di(); // ui/features/grid/gridApi.ts -function fi() { +function pi() { let e = "mjr-grid-settings-styles"; if (document.getElementById(e)) return; let t = document.createElement("style"); t.id = e, t.textContent = "\n .mjr-grid .mjr-asset-card,\n .mjr-grid .mjr-card {\n display: flex;\n flex-direction: column;\n }\n .mjr-grid .mjr-thumb {\n flex: 0 0 auto;\n width: 100%;\n aspect-ratio: 1 / 1;\n min-height: 0;\n position: relative;\n overflow: hidden;\n }\n .mjr-grid .mjr-thumb-media {\n width: 100%;\n height: 100%;\n object-fit: cover;\n display: block;\n }\n\n .mjr-grid .mjr-asset-card:hover {\n background-color: var(--mjr-card-hover-color) !important;\n }\n\n .mjr-grid .mjr-asset-card.is-selected {\n outline: 2px solid var(--mjr-card-selection-color) !important;\n box-shadow: 0 0 0 2px var(--mjr-card-selection-color) !important;\n }\n\n .mjr-grid .mjr-card-filename { display: none; }\n .mjr-grid.mjr-show-filename .mjr-card-filename { display: block; }\n\n .mjr-grid .mjr-card-dot-wrapper { display: none; }\n .mjr-grid.mjr-show-dot .mjr-card-dot-wrapper { display: inline-flex; }\n .mjr-grid .mjr-asset-status-dot {\n transition: color 0.3s ease, opacity 0.3s ease;\n }\n .mjr-grid .mjr-asset-status-dot.mjr-pulse-animation {\n animation: mjr-pulse 1.5s infinite;\n }\n @keyframes mjr-pulse {\n 0% { opacity: 1; }\n 50% { opacity: 0.4; }\n 100% { opacity: 1; }\n }\n\n .mjr-grid .mjr-meta-res { display: none; }\n .mjr-grid.mjr-show-dimensions .mjr-meta-res { display: inline; }\n\n .mjr-grid .mjr-meta-duration { display: none; }\n .mjr-grid.mjr-show-dimensions .mjr-meta-duration { display: inline; }\n\n .mjr-grid .mjr-meta-date { display: none; }\n .mjr-grid.mjr-show-date .mjr-meta-date { display: inline; }\n\n .mjr-grid .mjr-meta-gentime { display: none; }\n .mjr-grid.mjr-show-gentime .mjr-meta-gentime { display: inline; }\n\n .mjr-grid .mjr-badge-ext { display: none !important; }\n .mjr-grid.mjr-show-badges-ext .mjr-badge-ext { display: flex !important; }\n\n .mjr-grid .mjr-badge-rating { display: none !important; }\n .mjr-grid.mjr-show-badges-rating .mjr-badge-rating { display: flex !important; }\n\n .mjr-grid .mjr-badge-tags { display: none !important; }\n .mjr-grid.mjr-show-badges-tags .mjr-badge-tags { display: flex !important; }\n\n .mjr-grid .mjr-card-info { display: none !important; }\n .mjr-grid.mjr-show-details .mjr-card-info { display: block !important; }\n\n .mjr-card-meta-row > span + span::before {\n content: \" \"¢ \";\n opacity: 0.5;\n margin: 0 4px;\n }\n .mjr-card-meta-row > span[style*=\"display: none\"] + span::before {\n display: none;\n }\n ", document.head.appendChild(t); } -function pi(e) { +function mi(e) { if (!e) return; - fi(); + pi(); let t = (t, n) => { n ? e.classList.add(t) : e.classList.remove(t); }; t("mjr-show-filename", B.GRID_SHOW_DETAILS_FILENAME), t("mjr-show-dimensions", B.GRID_SHOW_DETAILS_DIMENSIONS), t("mjr-show-date", B.GRID_SHOW_DETAILS_DATE), t("mjr-show-gentime", B.GRID_SHOW_DETAILS_GENTIME), t("mjr-show-hover-info", B.GRID_SHOW_HOVER_INFO), t("mjr-show-dot", B.GRID_SHOW_WORKFLOW_DOT), t("mjr-show-badges-ext", B.GRID_SHOW_BADGES_EXTENSION), t("mjr-show-badges-rating", B.GRID_SHOW_BADGES_RATING), t("mjr-show-badges-tags", B.GRID_SHOW_BADGES_TAGS), t("mjr-show-details", B.GRID_SHOW_DETAILS), e.style.setProperty("--mjr-grid-min-size", `${B.GRID_MIN_SIZE}px`), e.style.setProperty("--mjr-grid-gap", `${B.GRID_GAP}px`), e.style.setProperty("--mjr-star-active", B.BADGE_STAR_COLOR), e.style.setProperty("--mjr-badge-image", B.BADGE_IMAGE_COLOR), e.style.setProperty("--mjr-badge-video", B.BADGE_VIDEO_COLOR), e.style.setProperty("--mjr-badge-audio", B.BADGE_AUDIO_COLOR), e.style.setProperty("--mjr-badge-model3d", B.BADGE_MODEL3D_COLOR), e.style.setProperty("--mjr-badge-duplicate-alert", B.BADGE_DUPLICATE_ALERT_COLOR), e.style.setProperty("--mjr-card-hover-color", B.UI_CARD_HOVER_COLOR), e.style.setProperty("--mjr-card-selection-color", B.UI_CARD_SELECTION_COLOR), e.style.setProperty("--mjr-rating-color", B.UI_RATING_COLOR), e.style.setProperty("--mjr-tag-color", B.UI_TAG_COLOR); } -function mi(e, { applySettingsClasses: t = !0 } = {}) { +function hi(e, { applySettingsClasses: t = !0 } = {}) { if (!e) return null; if (e.id = "mjr-assets-grid", e.classList.add("mjr-grid"), e.tabIndex = 0, e.setAttribute("role", "grid"), t) { - pi(e); + mi(e); let t = () => { requestAnimationFrame(() => { - pi(e); + mi(e); }); }; try { @@ -344,7 +344,7 @@ function mi(e, { applySettingsClasses: t = !0 } = {}) { } return e; } -function hi(e, t, ...n) { +function gi(e, t, ...n) { let r = { _mjrCaptureAnchor: "captureAnchor", _mjrDispose: "dispose", @@ -367,56 +367,56 @@ function hi(e, t, ...n) { console.debug?.(e); } } -function gi(e, t = {}, n = {}) { - return hi(e, "_mjrHydrateFromSnapshot", t, n) ?? !1; +function _i(e, t = {}, n = {}) { + return gi(e, "_mjrHydrateFromSnapshot", t, n) ?? !1; } -function _i(e, t = "*", n = {}) { - return hi(e, "_mjrLoadAssets", t, n) ?? Promise.resolve({ +function vi(e, t = "*", n = {}) { + return gi(e, "_mjrLoadAssets", t, n) ?? Promise.resolve({ ok: !1, error: "Grid API unavailable" }); } -function vi(e, t, n = {}) { - return hi(e, "_mjrLoadAssetsFromList", t, n) ?? Promise.resolve({ +function yi(e, t, n = {}) { + return gi(e, "_mjrLoadAssetsFromList", t, n) ?? Promise.resolve({ ok: !1, error: "Grid API unavailable" }); } -function yi(e) { - return hi(e, "_mjrPrepareForScopeSwitch"); -} function bi(e) { + return gi(e, "_mjrPrepareForScopeSwitch"); +} +function xi(e) { try { e?._mjrSettingsChangedCleanup?.(); } catch (e) { console.debug?.(e); } - return hi(e, "_mjrDispose"); -} -function xi(e) { - return hi(e, "_mjrRefreshGrid"); + return gi(e, "_mjrDispose"); } function Si(e) { - return hi(e, "_mjrCaptureAnchor") ?? null; + return gi(e, "_mjrRefreshGrid"); } -function Ci(e, t) { - return hi(e, "_mjrRestoreAnchor", t); +function Ci(e) { + return gi(e, "_mjrCaptureAnchor") ?? null; } -function wi(e, t, n = {}) { - return hi(e, "_mjrRemoveAssets", t, n) ?? { +function wi(e, t) { + return gi(e, "_mjrRestoreAnchor", t); +} +function Ti(e, t, n = {}) { + return gi(e, "_mjrRemoveAssets", t, n) ?? { ok: !1, removed: 0, selectedIds: [] }; } -function Ti(e, t) { - return !!hi(e, "_mjrUpsertAsset", t); -} function Ei(e, t) { - return !!hi(e, "_mjrUpsertAssetNow", t); + return !!gi(e, "_mjrUpsertAsset", t); +} +function Di(e, t) { + return !!gi(e, "_mjrUpsertAssetNow", t); } // ui/features/panel/views/popoverManager.ts -function Di(e, t) { +function Oi(e, t) { if (!e || !t?.size) return !1; for (let n of t.values()) { let t = n?.popover || null; @@ -431,7 +431,7 @@ function Di(e, t) { } return !1; } -function Oi(e) { +function ki(e) { if (!e || e === document?.body) return !1; try { if (typeof e.matches == "function" && e.matches("[data-pc-name],[role='listbox'],[role='dialog'],[role='menu'],[role='tree'],[role='grid']")) return !0; @@ -445,7 +445,7 @@ function Oi(e) { ].join(" ").toLowerCase(); return /\b(p-|p_)?(select|listbox|multiselect|datepicker|calendar|overlay|panel|menu|dialog|tooltip|popover)\b/.test(t); } -function ki(e) { +function Ai(e) { let t = /* @__PURE__ */ new Map(), n = null, r = 0, i = [], a = !1, o = !1, s = !1, c = new AbortController(), l = new AbortController(), u = !1, d = null, f = (e, t = "y") => { if (!e) return !1; let n = globalThis.getComputedStyle?.(e), r = String(t === "x" ? n?.overflowX || n?.overflow || "" : n?.overflowY || n?.overflow || ""); @@ -531,7 +531,7 @@ function ki(e) { for (let e of t.values()) _(e.popover, e.anchor); })); }, y = (e) => { - Di(e?.target, t) || v(); + Oi(e?.target, t) || v(); }, b = () => { if (t.size) { try { @@ -689,7 +689,7 @@ function ki(e) { try { let e = n; for (; e && e !== document.body && e.parentNode && e.parentNode !== document.body;) e = e.parentNode; - if (e && e !== document.body && e.parentNode === document.body && Oi(e)) for (let e of t.values()) try { + if (e && e !== document.body && e.parentNode === document.body && ki(e)) for (let e of t.values()) try { if (!e?.popover) continue; if (e.popover.querySelector("[data-pc-name][aria-expanded='true']") || e.popover.querySelector("[aria-expanded='true'][role='combobox']")) return; } catch (e) { @@ -751,7 +751,7 @@ function ki(e) { }; } // ui/features/grid/GridKeyboard.ts -var Ai = { +var ji = { OPEN_VIEWER: { key: "Enter", description: "Open selected in viewer" @@ -867,29 +867,29 @@ var Ai = { key: "ArrowRight", description: "Navigate right" } -}, ji = null; -function Mi() { - return ji ||= import("./chunks/viewerOpenRequest-Crw9UWH5.js").then((e) => e.n), ji; +}, Mi = null; +function Ni() { + return Mi ||= import("./chunks/viewerOpenRequest-POEAWUHf.js").then((e) => e.n), Mi; } -function Ni(e) { +function Pi(e) { if (!e) return ""; let t = []; e.ctrl && t.push("Ctrl"), e.shift && t.push("Shift"), e.alt && t.push("Alt"); let n = e.key; return n === " " && (n = "Space"), n === "Delete" && (n = "Del"), n === "ArrowUp" && (n = "<-‘"), n === "ArrowDown" && (n = "<-“"), n === "ArrowLeft" && (n = "<-"), n === "ArrowRight" && (n = "->"), t.push(n.length === 1 ? n.toUpperCase() : n), t.join("+"); } -function Pi(e, t) { +function Fi(e, t) { if (!t || !e) return !1; let n = e.key.toLowerCase() === t.key.toLowerCase() || e.key === t.key, r = !!t.ctrl === (e.ctrlKey || e.metaKey), i = !!t.shift === e.shiftKey, a = !!t.alt === e.altKey; return n && r && i && a; } -var Fi = /* @__PURE__ */ new Map(); -function Ii(t, n, r) { +var Ii = /* @__PURE__ */ new Map(); +function Li(t, n, r) { let i = t?.id; if (!i) return; let a = String(i); try { - let e = Fi.get(a); + let e = Ii.get(a); e && clearTimeout(e); } catch (e) { console.debug?.(e); @@ -901,13 +901,13 @@ function Ii(t, n, r) { } let o = setTimeout(async () => { try { - Fi.delete(a); + Ii.delete(a); let t = await _(i, n); if (!t?.ok) { e(t?.error || R("toast.ratingUpdateFailed"), "error"); return; } - e(R("toast.ratingSetN", { n }), "success", 1500), It(ot, { + e(R("toast.ratingSetN", { n }), "success", 1500), Lt(st, { assetId: String(i), rating: n }, { warnPrefix: "[GridKeyboard]" }); @@ -915,23 +915,23 @@ function Ii(t, n, r) { console.error("[GridKeyboard] Rating update failed:", t), e(R("toast.ratingUpdateError"), "error"); } }, 350); - Fi.set(a, o); + Ii.set(a, o); } -function Li({ gridContainer: t, getState: n = () => ({}), getSelectedAssets: r = () => [], getActiveAsset: i = () => null, onOpenDetails: a = () => {}, onOpenTagsEditor: o = () => {}, onSelectionChanged: s = () => {}, onAssetChanged: c = () => {} } = {}) { +function Ri({ gridContainer: t, getState: n = () => ({}), getSelectedAssets: r = () => [], getActiveAsset: i = () => null, onOpenDetails: a = () => {}, onOpenTagsEditor: o = () => {}, onSelectionChanged: s = () => {}, onAssetChanged: c = () => {} } = {}) { if (!t) return { bind: () => {}, unbind: () => {}, dispose: () => {} }; let u = null, d = null, f = null, p = null, m = !1, h = !1, g = ({ assets: e = [], index: t = 0, mode: n = "" } = {}) => { - Mi().then((r) => r.requestViewerOpen({ + Ni().then((r) => r.requestViewerOpen({ assets: e, index: t, mode: n })).catch((e) => console.debug?.(e)); }, _ = () => { try { - tr(t); + nr(t); } catch (e) { console.debug?.(e); } @@ -968,7 +968,7 @@ function Li({ gridContainer: t, getState: n = () => ({}), getSelectedAssets: r = } }, x = (t) => { if (!t?.filepath) return !1; - let n = ct(t.filepath), r = document.createElement("a"); + let n = lt(t.filepath), r = document.createElement("a"); return r.href = n, r.download = t.filename || "download", document.body.appendChild(r), r.click(), document.body.removeChild(r), e(R("toast.downloadingFile", "Downloading {filename}...", { filename: t.filename }), "info", 3e3), !0; }, S = () => { try { @@ -1069,7 +1069,7 @@ function Li({ gridContainer: t, getState: n = () => ({}), getSelectedAssets: r = let e = document.activeElement, n = t.contains(e), r = e && e.contains && e.contains(t), i = e?.closest?.(".mjr-asset-card"); if (!n && !r && !i) return; } else { - let e = Qn(); + let e = $n(); if (e && e !== t) return; } let u = () => { @@ -1084,38 +1084,38 @@ function Li({ gridContainer: t, getState: n = () => ({}), getSelectedAssets: r = console.debug?.(e); } let d = v(), f = b(), p = n(); - if (Pi(r, Ai.DOWNLOAD) && f?.filepath) { + if (Fi(r, ji.DOWNLOAD) && f?.filepath) { u(), h = !0; return; } let m = !!fe().ratingHotkeysActive; if (!r.ctrlKey && !r.altKey && !r.metaKey && !r.shiftKey) { - if (!m && Pi(r, Ai.RATING_1) && f?.id) { - u(), Ii(f, 1, c); + if (!m && Fi(r, ji.RATING_1) && f?.id) { + u(), Li(f, 1, c); return; } - if (!m && Pi(r, Ai.RATING_2) && f?.id) { - u(), Ii(f, 2, c); + if (!m && Fi(r, ji.RATING_2) && f?.id) { + u(), Li(f, 2, c); return; } - if (!m && Pi(r, Ai.RATING_3) && f?.id) { - u(), Ii(f, 3, c); + if (!m && Fi(r, ji.RATING_3) && f?.id) { + u(), Li(f, 3, c); return; } - if (!m && Pi(r, Ai.RATING_4) && f?.id) { - u(), Ii(f, 4, c); + if (!m && Fi(r, ji.RATING_4) && f?.id) { + u(), Li(f, 4, c); return; } - if (!m && Pi(r, Ai.RATING_5) && f?.id) { - u(), Ii(f, 5, c); + if (!m && Fi(r, ji.RATING_5) && f?.id) { + u(), Li(f, 5, c); return; } - if (!m && Pi(r, Ai.RATING_RESET) && f?.id) { - u(), Ii(f, 0, c); + if (!m && Fi(r, ji.RATING_RESET) && f?.id) { + u(), Li(f, 0, c); return; } } - if ((Pi(r, Ai.OPEN_VIEWER) || Pi(r, Ai.OPEN_VIEWER_ALT)) && d.length > 0) { + if ((Fi(r, ji.OPEN_VIEWER) || Fi(r, ji.OPEN_VIEWER_ALT)) && d.length > 0) { u(); try { if (d.length >= 2 && d.length <= 4) g({ @@ -1138,8 +1138,8 @@ function Li({ gridContainer: t, getState: n = () => ({}), getSelectedAssets: r = } catch (e) { console.error("[GridKeyboard] Open viewer failed:", e); } - } else if (Pi(r, Ai.METADATA_PANEL) && f) u(), a(f); - else if (Pi(r, Ai.COMPARE_AB) && d.length === 2) { + } else if (Fi(r, ji.METADATA_PANEL) && f) u(), a(f); + else if (Fi(r, ji.COMPARE_AB) && d.length === 2) { u(); try { g({ @@ -1150,7 +1150,7 @@ function Li({ gridContainer: t, getState: n = () => ({}), getSelectedAssets: r = } catch (e) { console.debug?.(e); } - } else if (Pi(r, Ai.SIDE_BY_SIDE) && d.length >= 2 && d.length <= 4) { + } else if (Fi(r, ji.SIDE_BY_SIDE) && d.length >= 2 && d.length <= 4) { u(); try { g({ @@ -1161,17 +1161,17 @@ function Li({ gridContainer: t, getState: n = () => ({}), getSelectedAssets: r = } catch (e) { console.debug?.(e); } - } else if (Pi(r, Ai.EDIT_TAGS) && f?.id) u(), o(f); - else if (Pi(r, Ai.ADD_TO_COLLECTION) && (d.length > 0 || f)) { + } else if (Fi(r, ji.EDIT_TAGS) && f?.id) u(), o(f); + else if (Fi(r, ji.ADD_TO_COLLECTION) && (d.length > 0 || f)) { u(); let e = d.length > 0 ? d : [f], n = t.getBoundingClientRect(); - await Rt({ + await zt({ x: n.left + n.width / 2, y: n.top + n.height / 2, assets: e }); } else { - if (Pi(r, Ai.REMOVE_FROM_COLLECTION)) { + if (Fi(r, ji.REMOVE_FROM_COLLECTION)) { let t = p?.collectionId; if (t && (d.length > 0 || f)) { u(); @@ -1198,28 +1198,28 @@ function Li({ gridContainer: t, getState: n = () => ({}), getSelectedAssets: r = return; } } - if (Pi(r, Ai.COPY_PATH) && f?.filepath) { + if (Fi(r, ji.COPY_PATH) && f?.filepath) { u(); try { await navigator.clipboard.writeText(f.filepath), e(R("toast.pathCopied"), "success", 2e3); } catch { e(R("toast.pathCopyFailed"), "error"); } - } else if (Pi(r, Ai.OPEN_IN_FOLDER) && f?.id) { + } else if (Fi(r, ji.OPEN_IN_FOLDER) && f?.id) { u(); let t = await ne(f.id); t?.ok ? e(R("toast.openedInFolder"), "info", 2e3) : e(t?.error || R("toast.openFolderFailed"), "error"); - } else if (Pi(r, Ai.RENAME) && f?.id) { + } else if (Fi(r, ji.RENAME) && f?.id) { u(); - let t = f.filename || "", n = await wt(R("dialog.rename.title", "Rename file"), t), r = vt(n, t); + let t = f.filename || "", n = await Tt(R("dialog.rename.title", "Rename file"), t), r = yt(n, t); if (r && r !== t) { - let t = Ot(r); + let t = kt(r); if (!t.valid) { e(t.reason, "error"); return; } try { - let t = await Ce(f, r); + let t = await we(f, r); if (t?.ok) { let n = t?.data?.asset; n && typeof n == "object" ? Object.assign(f, n) : (f.filename = r, f.filepath = f.filepath?.replace(/[^\\/]+$/, r), f.path &&= String(f.path).replace(/[^\\/]+$/, r), f.file_info && typeof f.file_info == "object" && (f.file_info.filename = r, f.file_info.filepath && (f.file_info.filepath = String(f.file_info.filepath).replace(/[^\\/]+$/, r)), f.file_info.path && (f.file_info.path = String(f.file_info.path).replace(/[^\\/]+$/, r)))), e(R("toast.fileRenamedSuccess"), "success"); @@ -1234,7 +1234,7 @@ function Li({ gridContainer: t, getState: n = () => ({}), getSelectedAssets: r = e(R("toast.errorRenaming", "Error renaming file: {error}", { error: t?.message || String(t || "") }), "error"); } } - } else if ((Pi(r, Ai.DELETE) || Pi(r, Ai.DELETE_ALT)) && (f?.id || d.length > 0)) { + } else if ((Fi(r, ji.DELETE) || Fi(r, ji.DELETE_ALT)) && (f?.id || d.length > 0)) { u(); let n = d.length > 0 ? d : [f], r = 0, i = 0, a = []; for (let e of n) if (e?.id) try { @@ -1262,7 +1262,7 @@ function Li({ gridContainer: t, getState: n = () => ({}), getSelectedAssets: r = console.debug?.(e); } s(); - } else if (Pi(r, Ai.SELECT_ALL)) { + } else if (Fi(r, ji.SELECT_ALL)) { u(); let e = []; try { @@ -1287,7 +1287,7 @@ function Li({ gridContainer: t, getState: n = () => ({}), getSelectedAssets: r = console.debug?.(e); } s(); - } else if (Pi(r, Ai.DESELECT_ALL)) { + } else if (Fi(r, ji.DESELECT_ALL)) { u(); try { typeof t?._mjrSetSelection == "function" ? t._mjrSetSelection([], "") : (y().filter((e) => e?.classList?.contains?.("is-selected")).forEach((e) => { @@ -1311,7 +1311,7 @@ function Li({ gridContainer: t, getState: n = () => ({}), getSelectedAssets: r = if (m && u) { document.removeEventListener("keydown", u, !0), d && document.removeEventListener("keyup", d, !0), f && document.removeEventListener("dragstart", f, !0), p && (t.removeEventListener("pointerdown", p, !0), t.removeEventListener("focusin", p, !0)), u = null, d = null, f = null, p = null, h = !1; try { - Zn(t); + Qn(t); } catch (e) { console.debug?.(e); } @@ -1321,12 +1321,12 @@ function Li({ gridContainer: t, getState: n = () => ({}), getSelectedAssets: r = console.debug?.(e); } m = !1; - for (let e of Fi.values()) try { + for (let e of Ii.values()) try { clearTimeout(e); } catch (e) { console.debug?.(e); } - Fi.clear(); + Ii.clear(); } }; return { @@ -1334,63 +1334,63 @@ function Li({ gridContainer: t, getState: n = () => ({}), getSelectedAssets: r = unbind: M, dispose: () => { M(); - for (let e of Fi.values()) try { + for (let e of Ii.values()) try { clearTimeout(e); } catch (e) { console.debug?.(e); } - Fi.clear(); + Ii.clear(); } }; } -function Ri(e) { - let t = Ai[e]; - return t ? Ni(t) : ""; +function zi(e) { + let t = ji[e]; + return t ? Pi(t) : ""; } // ui/features/workflows/workflowInfoState.ts -var zi = Cr({ +var Bi = wr({ open: !1, workflow: null }); -function Bi(e) { - zi.workflow = e || null, zi.open = !0; +function Vi(e) { + Bi.workflow = e || null, Bi.open = !0; } -function Vi() { - zi.open = !1, zi.workflow = null; +function Hi() { + Bi.open = !1, Bi.workflow = null; } // ui/features/contextmenu/GridContextMenu.ts -var Hi = 1, Ui = null, Wi = null; -function Gi() { - return Ui ||= import("./chunks/viewerOpenRequest-Crw9UWH5.js").then((e) => e.n), Ui; -} +var Ui = 1, Wi = null, Gi = null; function Ki() { - return Wi ||= import("./chunks/floatingViewerManager-Gv7MTmpu.js").then((e) => e.n), Wi; + return Wi ||= import("./chunks/viewerOpenRequest-POEAWUHf.js").then((e) => e.n), Wi; } -function qi(e) { +function qi() { + return Gi ||= import("./chunks/floatingViewerManager-DGIaL-BQ.js").then((e) => e.n), Gi; +} +function Ji(e) { let t = String(e || "").trim().toLowerCase(); return t ? t.includes("open graph map") ? "graph-map" : t.includes("open in floating viewer") || t.includes("open floating viewer") ? "floating-viewer" : t.includes("rename") ? "rename" : t.includes("delete") ? "delete" : "" : ""; } function $(e, t, n, r, { disabled: i = !1, closeOnSelect: a = !0, submenu: o = null } = {}) { return { - id: `mjr-grid-menu-item-${Hi++}`, + id: `mjr-grid-menu-item-${Ui++}`, type: "item", label: String(e || ""), iconClass: t ? String(t) : "", rightHint: n ? String(n) : "", - tone: qi(e), + tone: Ji(e), disabled: !!i, closeOnSelect: a, submenu: Array.isArray(o) && o.length ? o : null, action: typeof r == "function" ? r : null }; } -function Ji() { +function Yi() { return { - id: `mjr-grid-menu-separator-${Hi++}`, + id: `mjr-grid-menu-separator-${Ui++}`, type: "separator" }; } -var Yi = (e) => { +var Xi = (e) => { let t = /* @__PURE__ */ new Set(); if (!e) return t; try { @@ -1412,7 +1412,7 @@ var Yi = (e) => { console.debug?.(e); } return t; -}, Xi = (e) => { +}, Zi = (e) => { let t = []; if (!e) return t; try { @@ -1448,7 +1448,7 @@ var Yi = (e) => { } return t; }; -async function Zi(e) { +async function Qi(e) { let t = String(e?.filepath || e?.path || e?.full_path || "").trim(); if (!t) return e; try { @@ -1467,53 +1467,53 @@ async function Zi(e) { return console.debug?.(t), e; } } -var Qi = (e) => { +var $i = (e) => { try { let t = e?.filepath || e?.path || e?.file_info?.filepath || ""; return t ? String(t) : ""; } catch { return ""; } -}, $i = (e) => { +}, ea = (e) => { if (!e || typeof e != "object") return null; let t = String(e.filename || "").trim(); return t ? { filename: t, subfolder: e.subfolder || "", type: String(e.type || e.source || "output").toLowerCase(), - root_id: ze(e) || void 0, + root_id: Be(e) || void 0, kind: String(e.kind || "").toLowerCase() } : null; -}, ea = (e) => { +}, ta = (e) => { if (!e || typeof e != "object") return null; let t = String(e.filename || e.name || "").trim(); return t ? { filename: t, subfolder: e.subfolder || "", type: String(e.type || e.source || "output").toLowerCase(), - root_id: ze(e) || void 0 + root_id: Be(e) || void 0 } : null; }; -function ta(e, t = "") { +function na(e, t = "") { if (!e) return; let n = document.createElement("a"); n.href = e, t && (n.download = t), document.body.appendChild(n), n.click(), document.body.removeChild(n); } -async function na(t) { - let n = (Array.isArray(t) ? t.filter((e) => !ga(e)) : []).map(ea).filter(Boolean); +async function ra(t) { + let n = (Array.isArray(t) ? t.filter((e) => !_a(e)) : []).map(ta).filter(Boolean); if (n.length < 2) { e("Select at least two files to download a ZIP.", "warning", 2600); return; } let r = ""; try { - r = Re("mjr_", 24); + r = ze("mjr_", 24); } catch (t) { P(t, "[GridContextMenu] Batch ZIP token", { showToast: B.DEBUG_VERBOSE_ERRORS }), e("Could not create a secure ZIP token.", "error"); return; } e(`Preparing ZIP for ${n.length} files...`, "info", 1800); - let i = await L(it.BATCH_ZIP_CREATE, { + let i = await L(at.BATCH_ZIP_CREATE, { token: r, items: n, strip_metadata: !1 @@ -1523,15 +1523,15 @@ async function na(t) { return; } let a = i?.data?.filename || `Majoor_Batch_${n.length}.zip`; - ta(tt(r), a), e(`Downloading ${a}...`, "info", 3e3); + na(nt(r), a), e(`Downloading ${a}...`, "info", 3e3); } -async function ra(e) { +async function ia(e) { let t = Array.isArray(e) ? e.filter(Boolean) : [], n = await Promise.all(t.map(async (e) => { - let t = $i(e); + let t = ea(e); if (!t) return null; - let n = (await Un({ + let n = (await Wn({ post: L, - endpoint: it.STAGE_TO_INPUT, + endpoint: at.STAGE_TO_INPUT, payload: t, index: !1 }))?.relativePath; @@ -1541,13 +1541,13 @@ async function ra(e) { droppedExt: String(t.filename || "").split(".").pop() || "" } : null; })); - return mn({ - app: Ze(), + return hn({ + app: Qe(), items: n.filter(Boolean), event: null }); } -var ia = (e) => { +var aa = (e) => { if (e) { try { if (typeof e?._mjrSetSelection == "function") e._mjrSetSelection([], ""); @@ -1559,15 +1559,15 @@ var ia = (e) => { } catch (e) { console.debug?.(e); } - It("mjr:selection-changed", { selectedIds: [] }, { + Lt("mjr:selection-changed", { selectedIds: [] }, { target: e, warnPrefix: "[GridContextMenu]" }); } -}, aa = (e, t, n, r) => { +}, oa = (e, t, n, r) => { if (!e) return; try { - ia(e); + aa(e); } catch (e) { console.debug?.(e); } @@ -1587,7 +1587,7 @@ var ia = (e) => { } catch (e) { console.debug?.(e); } -}, oa = (e) => { +}, sa = (e) => { let t = []; if (!e) return t; try { @@ -1609,7 +1609,7 @@ var ia = (e) => { console.debug?.(e); } return t; -}, sa = (e, t) => { +}, ca = (e, t) => { try { let n = String(t ?? ""); return (e || []).findIndex((e) => String(e?.id ?? "") === n); @@ -1617,16 +1617,16 @@ var ia = (e) => { return -1; } }; -function ca(e) { +function la(e) { if (e == null) return null; try { - return document.querySelector(`[data-mjr-asset-id="${yt(e)}"]`); + return document.querySelector(`[data-mjr-asset-id="${bt(e)}"]`); } catch (e) { return console.debug?.(e), null; } } -function la(e, t = null) { - let n = ca(e?.id); +function ua(e, t = null) { + let n = la(e?.id); if (!n || !n._mjrAsset || typeof n._mjrAsset != "object") return n; try { t && typeof t == "object" ? Object.assign(n._mjrAsset, t) : e && typeof e == "object" && Object.assign(n._mjrAsset, e); @@ -1635,7 +1635,7 @@ function la(e, t = null) { } return n; } -var ua = (e) => { +var da = (e) => { try { let t = e ? "grid-contextmenu" : "grid-contextmenu-global"; window?.dispatchEvent?.(new CustomEvent("mjr:reload-grid", { detail: { reason: t } })); @@ -1643,7 +1643,7 @@ var ua = (e) => { console.debug?.(e); } }; -async function da(e, t) { +async function fa(e, t) { if (!e) return { ok: !1, error: "Missing asset" @@ -1658,7 +1658,7 @@ async function da(e, t) { ok: !1, error: "Missing filename" }; - let r = await L(it.INDEX_FILES, { + let r = await L(at.INDEX_FILES, { files: [n], incremental: !1 }); @@ -1670,21 +1670,21 @@ async function da(e, t) { let t = await I(e.id); if (t?.ok && t?.data && typeof t.data == "object") { Object.assign(e, t.data); - let n = la(e, t.data), r = n?.querySelector?.(".mjr-workflow-dot"); + let n = ua(e, t.data), r = n?.querySelector?.(".mjr-workflow-dot"); if (r) { - let e = Et(n._mjrAsset); + let e = Dt(n._mjrAsset); e && r.replaceWith(e); } } } catch (e) { console.debug?.(e); } - return ua(t), { + return da(t), { ok: !0, data: { refreshed: !0 } }; } -function fa(e, t, n) { +function pa(e, t, n) { let r = e?.id; try { e.rating = t; @@ -1696,12 +1696,12 @@ function fa(e, t, n) { } catch (e) { console.debug?.(e); } - r ? Kt(String(r), t, { + r ? qt(String(r), t, { successMessage: t > 0 ? `Rating set to ${t} stars` : "Rating cleared", errorMessage: "Failed to update rating", warnPrefix: "[GridContextMenu]", onSuccess: () => { - It(ot, { + Lt(st, { assetId: String(r), rating: t }, { warnPrefix: "[GridContextMenu]" }); @@ -1713,29 +1713,29 @@ function fa(e, t, n) { P(e, "[GridContextMenu] Rating update", { showToast: B.DEBUG_VERBOSE_ERRORS }); }); } -function pa(e) { +function ma(e) { let t = String(e?.scope || "").toLowerCase(); return t === "custom" || t === "input" || t === "output"; } -function ma() { +function ha() { try { - return !!(Vn()?.browser?.showFolders ?? !1); + return !!(Hn()?.browser?.showFolders ?? !1); } catch { return !1; } } -function ha(e) { +function ga(e) { return String(e?.scope || "").toLowerCase() === "workflow"; } -function ga(e) { +function _a(e) { return String(e?.kind || "").toLowerCase() === "folder"; } -function _a(e) { +function va(e) { return String(e?.kind || "").toLowerCase() === "workflow"; } -function va(e) { - if (!e || ga(e) || _a(e)) return !1; - let t = Qi(e); +function ya(e) { + if (!e || _a(e) || va(e)) return !1; + let t = $i(e); if (!t) return !1; let n = String(e?.kind || "").toLowerCase(); if (n === "image" || n === "video") return !0; @@ -1754,27 +1754,27 @@ function va(e) { "m4v" ].includes(r); } -async function ya(e) { - if (!e || ga(e)) return null; - let t = Jn(e); +async function ba(e) { + if (!e || _a(e)) return null; + let t = Yn(e); if (t) return t; let n = e?.id; if (n == null || n === "") return null; try { let t = await I(n, { timeoutMs: 3e4 }), r = t?.data; - if (t?.ok && r && typeof r == "object") return Object.assign(e, r), Jn(e); + if (t?.ok && r && typeof r == "object") return Object.assign(e, r), Yn(e); } catch (e) { console.debug?.(e); } return null; } -async function ba(t) { - let n = await ya(t); +async function xa(t) { + let n = await ba(t); if (!n || typeof n != "object") { e(R("toast.assetWorkflowMissing", "No embedded ComfyUI workflow was found for this asset."), "warn", 2600); return; } - let r = Ze(), i = Ne(n, r); + let r = Qe(), i = Pe(n, r); if (!i.ok) { e(R("toast.workflowImportUnavailable", "ComfyUI workflow import is unavailable in this frontend."), "error"); return; @@ -1782,20 +1782,20 @@ async function ba(t) { let a = i.mode === "new-tab" ? R("toast.workflowLoadedNewTab", "Workflow loaded in a new ComfyUI tab.") : R("toast.workflowLoaded", "Workflow loaded"); e(a, "success", 1800); } -async function xa(t) { +async function Sa(t) { let n = String(t?.filepath || t?.path || t?.full_path || "").trim(); if (!n) { e(R("toast.workflowMissingPath", "Workflow file path is missing."), "error"); return; } - let r = Ze(); - if (Ie(r) === !0 && !await Ut(R("dialog.workflowLoadReplaceDirty", "Current canvas has unsaved changes. Replace it with this workflow?"), R("tab.workflow", "Workflow"))) return; + let r = Qe(); + if (Le(r) === !0 && !await Wt(R("dialog.workflowLoadReplaceDirty", "Current canvas has unsaved changes. Replace it with this workflow?"), R("tab.workflow", "Workflow"))) return; let i = await y(n, { timeoutMs: 3e4 }), o = i?.data?.workflow || i?.workflow || null; if (!i?.ok || !o || typeof o != "object") { e(i?.error || R("toast.workflowLoadFailed", "Failed to load workflow."), "error"); return; } - let s = Ne(o, r); + let s = Pe(o, r); if (s.ok) { try { await a({ filepath: n }, { timeoutMs: 1e4 }); @@ -1804,7 +1804,7 @@ async function xa(t) { } e(R("toast.workflowLoaded", "Workflow loaded"), "success", 1800); } else { - let t = ct(n, { inline: !0 }); + let t = lt(n, { inline: !0 }); try { t && typeof window < "u" && window.open(t, "_blank", "noopener,noreferrer"); } catch (e) { @@ -1813,42 +1813,42 @@ async function xa(t) { e(R("toast.workflowImportFallback", "ComfyUI workflow import is unavailable in this frontend. Opened workflow JSON for manual import."), "warn"), s.mode === "new-tab" && e(R("toast.workflowLoadedNewTab", "Workflow loaded in a new ComfyUI tab."), "success"); } } -function Sa(e) { +function Ca(e) { try { window.dispatchEvent(new CustomEvent("mjr:reload-grid", { detail: { reason: e } })); } catch (e) { console.debug?.(e); } } -async function Ca(t) { - let n = String(t?.filepath || "").trim(), r = await le({ filepath: n }, { timeoutMs: 3e4 }); - r?.ok ? (e(R("toast.workflowSaved", "Workflow saved"), "success", 1800), Sa("workflow-duplicate")) : e(r?.error || R("toast.workflowSaveFailed", "Failed to save workflow."), "error"); -} async function wa(t) { - let n = String(t?.filepath || "").trim(), r = String(t?.display_name || t?.filename || "").replace(/\.json$/i, ""), i = await wt(R("ctx.renameWorkflow", "Rename workflow"), r, R("tab.workflow", "Workflow")), a = String(i || "").trim(); + let n = String(t?.filepath || "").trim(), r = await le({ filepath: n }, { timeoutMs: 3e4 }); + r?.ok ? (e(R("toast.workflowSaved", "Workflow saved"), "success", 1800), Ca("workflow-duplicate")) : e(r?.error || R("toast.workflowSaveFailed", "Failed to save workflow."), "error"); +} +async function Ta(t) { + let n = String(t?.filepath || "").trim(), r = String(t?.display_name || t?.filename || "").replace(/\.json$/i, ""), i = await Tt(R("ctx.renameWorkflow", "Rename workflow"), r, R("tab.workflow", "Workflow")), a = String(i || "").trim(); if (!a) return; let o = await g({ filepath: n, name: a }, { timeoutMs: 3e4 }); - o?.ok ? (e(R("toast.workflowUpdated", "Workflow updated"), "success", 1800), Sa("workflow-rename")) : e(o?.error || R("toast.workflowSaveFailed", "Failed to save workflow."), "error"); + o?.ok ? (e(R("toast.workflowUpdated", "Workflow updated"), "success", 1800), Ca("workflow-rename")) : e(o?.error || R("toast.workflowSaveFailed", "Failed to save workflow."), "error"); } -async function Ta(t) { - let n = String(t?.filepath || "").trim(), r = String(t?.subfolder || "").trim(), i = await wt(R("dialog.workflowCategory", "Workflow category"), r, R("tab.workflow", "Workflow")); +async function Ea(t) { + let n = String(t?.filepath || "").trim(), r = String(t?.subfolder || "").trim(), i = await Tt(R("dialog.workflowCategory", "Workflow category"), r, R("tab.workflow", "Workflow")); if (i == null) return; let a = await g({ filepath: n, category: String(i || "") }, { timeoutMs: 3e4 }); - a?.ok ? (e(R("toast.workflowUpdated", "Workflow updated"), "success", 1800), Sa("workflow-categorize")) : e(a?.error || R("toast.workflowSaveFailed", "Failed to save workflow."), "error"); + a?.ok ? (e(R("toast.workflowUpdated", "Workflow updated"), "success", 1800), Ca("workflow-categorize")) : e(a?.error || R("toast.workflowSaveFailed", "Failed to save workflow."), "error"); } -async function Ea(t) { +async function Da(t) { let n = String(t?.filepath || "").trim(); if (!n) { e(R("toast.noFilePath"), "error"); return; } - let r = await we({ + let r = await Te({ filepath: n, limit: 12 }, { timeoutMs: 15e3 }); @@ -1861,7 +1861,7 @@ async function Ea(t) { e(R("toast.workflowThumbnailNoCandidates", "No linked outputs are available for this workflow yet."), "warning", 2600); return; } - let a = await On({ + let a = await kn({ title: R("ctx.setWorkflowThumbnail", "Set workflow thumbnail"), workflow: t, items: i @@ -1871,9 +1871,9 @@ async function Ea(t) { filepath: n, source_filepath: a.filepath }, { timeoutMs: 3e4 }); - o?.ok ? (e(R("toast.workflowUpdated", "Workflow updated"), "success", 1800), Sa("workflow-thumbnail")) : e(o?.error || R("toast.workflowSaveFailed", "Failed to save workflow."), "error"); + o?.ok ? (e(R("toast.workflowUpdated", "Workflow updated"), "success", 1800), Ca("workflow-thumbnail")) : e(o?.error || R("toast.workflowSaveFailed", "Failed to save workflow."), "error"); } -async function Da(t) { +async function Oa(t) { let n = String(t?.filepath || "").trim(); if (!n) { e(R("toast.workflowMissingPath", "Workflow file path is missing."), "error"); @@ -1897,7 +1897,7 @@ async function Da(t) { setTimeout(() => URL.revokeObjectURL(s), 5e3); } } -async function Oa(t) { +async function ka(t) { let n = String(t?.filepath || "").trim(); if (!n) { e(R("toast.workflowMissingPath", "Workflow file path is missing."), "error"); @@ -1906,13 +1906,13 @@ async function Oa(t) { let r = await ne({ filepath: n }); r?.ok ? e(R("toast.openedInFolder", "Opened in folder"), "success", 1600) : e(r?.error || R("toast.openFolderFailed", "Failed to open folder."), "error"); } -async function ka(t) { - let n = Qi(t); +async function Aa(t) { + let n = $i(t); if (!n) { e(R("toast.noFilePath"), "error"); return; } - let r = await Dn({ + let r = await On({ title: R("ctx.assignAsWorkflowThumbnail", "Use as workflow thumbnail"), sourceAsset: t }), i = String(r?.filepath || "").trim(); @@ -1923,16 +1923,16 @@ async function ka(t) { filepath: i, source_filepath: n }, { timeoutMs: a ? 75e3 : 3e4 }); - o?.ok ? (e(R("toast.workflowUpdated", "Workflow updated"), "success", 1800), Sa("workflow-thumbnail-assign")) : e(o?.error || R("toast.workflowSaveFailed", "Failed to save workflow."), "error"); + o?.ok ? (e(R("toast.workflowUpdated", "Workflow updated"), "success", 1800), Ca("workflow-thumbnail-assign")) : e(o?.error || R("toast.workflowSaveFailed", "Failed to save workflow."), "error"); } -async function Aa(t) { +async function ja(t) { let n = String(t?.filepath || "").trim(); - if (!await Ut(R("dialog.deleteWorkflowConfirm", "Delete this workflow JSON and its adjacent thumbnail files?"), R("ctx.deleteWorkflow", "Delete workflow"))) return; + if (!await Wt(R("dialog.deleteWorkflowConfirm", "Delete this workflow JSON and its adjacent thumbnail files?"), R("ctx.deleteWorkflow", "Delete workflow"))) return; let r = await te({ filepath: n }, { timeoutMs: 3e4 }); - r?.ok ? (e(R("toast.workflowDeleted", "Workflow deleted"), "success", 1800), Sa("workflow-delete")) : e(r?.error || R("toast.fileDeleteFailed", "Failed to delete file."), "error"); + r?.ok ? (e(R("toast.workflowDeleted", "Workflow deleted"), "success", 1800), Ca("workflow-delete")) : e(r?.error || R("toast.fileDeleteFailed", "Failed to delete file."), "error"); } -function ja(e) { - let t = Yi(e), n = Xi(e), r = n.length || t.size; +function Ma(e) { + let t = Xi(e), n = Zi(e), r = n.length || t.size; return { selectedIds: t, selectedAssetsNow: n, @@ -1941,59 +1941,59 @@ function ja(e) { hasSelection: r > 0 }; } -function Ma(e, t) { +function Na(e, t) { let n = (e) => "*".repeat(e) + "o".repeat(Math.max(0, 5 - e)), r = (t) => { - la(e, { rating: t }); + ua(e, { rating: t }); }; return [ $(n(5), "pi pi-star", null, async () => { - fa(e, 5, () => r(5)); + pa(e, 5, () => r(5)); }, { disabled: !t }), $(n(4), "pi pi-star", null, async () => { - fa(e, 4, () => r(4)); + pa(e, 4, () => r(4)); }, { disabled: !t }), $(n(3), "pi pi-star", null, async () => { - fa(e, 3, () => r(3)); + pa(e, 3, () => r(3)); }, { disabled: !t }), $(n(2), "pi pi-star", null, async () => { - fa(e, 2, () => r(2)); + pa(e, 2, () => r(2)); }, { disabled: !t }), $(n(1), "pi pi-star", null, async () => { - fa(e, 1, () => r(1)); + pa(e, 1, () => r(1)); }, { disabled: !t }), - Ji(), + Yi(), $(R("ctx.resetRating", "Reset rating"), "pi pi-star", "0", async () => { - fa(e, 0, () => r(0)); + pa(e, 0, () => r(0)); }, { disabled: !t }) ]; } -function Na(e, t) { +function Pa(e, t) { let n = String(t?.dataset?.mjrScope || "").toLowerCase(); if (n !== "input" && n !== "output") return e; let r = String(e || "").trim().replaceAll("\\", "/"); return r ? `mjr://${n}/${r}` : `mjr://${n}`; } -function Pa({ currentPath: t, gridContainer: n } = {}) { +function Fa({ currentPath: t, gridContainer: n } = {}) { return [$(R("ctx.createFolderHere", "Create folder here..."), "pi pi-plus", null, async () => { try { - let r = await wt(R("dialog.newFolderName", "New folder name"), ""), i = String(r || "").trim(); + let r = await Tt(R("dialog.newFolderName", "New folder name"), ""), i = String(r || "").trim(); if (!i) return; - let a = await Oe({ + let a = await ke({ op: "create", - path: Na(t, n), + path: Pa(t, n), name: i }); if (!a?.ok) { e(a?.error || "Failed to create folder", "error"); return; } - ua(n), e(R("toast.folderCreated", "Folder created: {name}", { name: i }), "success"); + da(n), e(R("toast.folderCreated", "Folder created: {name}", { name: i }), "success"); } catch (t) { e(R("toast.createFolderFailedDetail", "Create folder failed: {error}", { error: t?.message || String(t || "") }), "error"); } })]; } -function Fa({ asset: t, gridContainer: n, panelState: r } = {}) { +function Ia({ asset: t, gridContainer: n, panelState: r } = {}) { let i = String(t?.filepath || "").trim(), a = [$(R("ctx.openFolder", "Open folder"), "pi pi-folder-open", null, () => { try { n.dispatchEvent(new CustomEvent("mjr:open-folder-asset", { @@ -2008,7 +2008,7 @@ function Fa({ asset: t, gridContainer: n, panelState: r } = {}) { e(R("toast.unableResolveFolderPath"), "error"); return; } - let n = await wt(R("dialog.browserRootLabelOptional"), String(t?.filename || "")), r = await L(it.CUSTOM_ROOTS, { + let n = await Tt(R("dialog.browserRootLabelOptional"), String(t?.filename || "")), r = await L(at.CUSTOM_ROOTS, { path: i, label: String(n || "").trim() || void 0 }); @@ -2022,11 +2022,11 @@ function Fa({ asset: t, gridContainer: n, panelState: r } = {}) { } } })]; - return pa(r) && i && a.push(Ji(), $(R("ctx.createFolderHere"), "pi pi-plus", null, async () => { + return ma(r) && i && a.push(Yi(), $(R("ctx.createFolderHere"), "pi pi-plus", null, async () => { try { - let t = await wt(R("dialog.newFolderName"), ""), r = String(t || "").trim(); + let t = await Tt(R("dialog.newFolderName"), ""), r = String(t || "").trim(); if (!r) return; - let a = await Oe({ + let a = await ke({ op: "create", path: i, name: r @@ -2035,15 +2035,15 @@ function Fa({ asset: t, gridContainer: n, panelState: r } = {}) { e(a?.error || R("toast.createFolderFailed"), "error"); return; } - ua(n), e(R("toast.folderCreated", { name: r }), "success"); + da(n), e(R("toast.folderCreated", { name: r }), "success"); } catch (t) { e(R("toast.createFolderFailedDetail", { error: t?.message || String(t || "") }), "error"); } }), $(R("ctx.renameFolder"), "pi pi-pencil", null, async () => { try { - let r = String(t?.filename || "").trim(), a = await wt(R("dialog.renameFolder"), r), o = String(a || "").trim(); + let r = String(t?.filename || "").trim(), a = await Tt(R("dialog.renameFolder"), r), o = String(a || "").trim(); if (!o || o === r) return; - let s = await Oe({ + let s = await ke({ op: "rename", path: i, name: o @@ -2052,15 +2052,15 @@ function Fa({ asset: t, gridContainer: n, panelState: r } = {}) { e(s?.error || R("toast.renameFolderFailed"), "error"); return; } - ua(n), e(R("toast.folderRenamed"), "success"); + da(n), e(R("toast.folderRenamed"), "success"); } catch (t) { e(R("toast.renameFolderFailedDetail", { error: t?.message || String(t || "") }), "error"); } }), $(R("ctx.moveFolder"), "pi pi-arrow-right", null, async () => { try { - let t = await wt(R("dialog.destinationDirectoryPath"), ""), r = String(t || "").trim(); + let t = await Tt(R("dialog.destinationDirectoryPath"), ""), r = String(t || "").trim(); if (!r) return; - let a = await Oe({ + let a = await ke({ op: "move", path: i, destination: r @@ -2069,15 +2069,15 @@ function Fa({ asset: t, gridContainer: n, panelState: r } = {}) { e(a?.error || R("toast.moveFolderFailed"), "error"); return; } - ua(n), e(R("toast.folderMoved"), "success"); + da(n), e(R("toast.folderMoved"), "success"); } catch (t) { e(R("toast.moveFolderFailedDetail", { error: t?.message || String(t || "") }), "error"); } }), $(R("ctx.deleteFolder"), "pi pi-trash", null, async () => { try { let r = String(t?.filename || R("label.thisFolder", "this folder")); - if (!await Ut(R("dialog.deleteFolderRecursive", { name: r }))) return; - let a = await Oe({ + if (!await Wt(R("dialog.deleteFolderRecursive", { name: r }))) return; + let a = await ke({ op: "delete", path: i, recursive: !0 @@ -2086,22 +2086,22 @@ function Fa({ asset: t, gridContainer: n, panelState: r } = {}) { e(a?.error || R("toast.deleteFolderFailed"), "error"); return; } - ua(n), e(R("toast.folderDeleted"), "success"); + da(n), e(R("toast.folderDeleted"), "success"); } catch (t) { e(R("toast.deleteFolderFailedDetail", { error: t?.message || String(t || "") }), "error"); } })), a; } -function Ia({ asset: t, card: r, gridContainer: i, panelState: a, pointerX: o, pointerY: s, selection: c } = {}) { - let { selectedAssetsNow: u, effectiveSelectionCount: d, isMultiSelected: f, hasSelection: p } = c, m = [], h = ha(a), g = ({ assets: e = [], index: t = 0, mode: n = "" } = {}) => Gi().then((r) => r.requestViewerOpen({ +function La({ asset: t, card: r, gridContainer: i, panelState: a, pointerX: o, pointerY: s, selection: c } = {}) { + let { selectedAssetsNow: u, effectiveSelectionCount: d, isMultiSelected: f, hasSelection: p } = c, m = [], h = ga(a), g = ({ assets: e = [], index: t = 0, mode: n = "" } = {}) => Ki().then((r) => r.requestViewerOpen({ assets: e, index: t, mode: n })).catch((e) => console.debug?.(e)); - if (_a(t)) { - if (m.push($(R("ctx.loadWorkflow", "Load workflow"), "pi pi-sitemap", null, () => xa(t)), $(R("ctx.duplicateWorkflow", "Duplicate workflow"), "pi pi-copy", null, () => Ca(t)), $(R("ctx.renameWorkflow", "Rename workflow"), "pi pi-pencil", null, () => wa(t)), $(R("ctx.categorizeWorkflow", "Set workflow category"), "pi pi-folder", null, () => Ta(t)), $(R("ctx.setWorkflowThumbnail", "Set workflow thumbnail"), "pi pi-image", null, () => Ea(t)), $(R("ctx.editWorkflowInfo", "Edit infos"), "pi pi-info-circle", null, () => Bi(t)), $(R("ctx.exportWorkflow", "Export workflow"), "pi pi-download", null, () => Da(t)), $(R("ctx.showInExplorer", "Show in Explorer"), "pi pi-folder-open", null, () => Oa(t)), $(R("ctx.deleteWorkflow", "Delete workflow"), "pi pi-trash", null, () => Aa(t)), Ji()), h) return m.push($("Open Graph Map", "pi pi-sitemap", null, async () => { + if (va(t)) { + if (m.push($(R("ctx.loadWorkflow", "Load workflow"), "pi pi-sitemap", null, () => Sa(t)), $(R("ctx.duplicateWorkflow", "Duplicate workflow"), "pi pi-copy", null, () => wa(t)), $(R("ctx.renameWorkflow", "Rename workflow"), "pi pi-pencil", null, () => Ta(t)), $(R("ctx.categorizeWorkflow", "Set workflow category"), "pi pi-folder", null, () => Ea(t)), $(R("ctx.setWorkflowThumbnail", "Set workflow thumbnail"), "pi pi-image", null, () => Da(t)), $(R("ctx.editWorkflowInfo", "Edit infos"), "pi pi-info-circle", null, () => Vi(t)), $(R("ctx.exportWorkflow", "Export workflow"), "pi pi-download", null, () => Oa(t)), $(R("ctx.showInExplorer", "Show in Explorer"), "pi pi-folder-open", null, () => ka(t)), $(R("ctx.deleteWorkflow", "Delete workflow"), "pi pi-trash", null, () => ja(t)), Yi()), h) return m.push($("Open Graph Map", "pi pi-sitemap", null, async () => { try { - let e = await Zi(t), { floatingViewerManager: n } = await Ki(); + let e = await Qi(t), { floatingViewerManager: n } = await qi(); await n.openAssets({ assets: [e], index: 0, @@ -2112,9 +2112,9 @@ function Ia({ asset: t, card: r, gridContainer: i, panelState: a, pointerX: o, p } })), m; } else if (h) return m; - m.push($("Open As New Tab", "pi pi-external-link", null, () => ba(t)), $("Open Viewer", "pi pi-image", Ri("OPEN_VIEWER"), () => { + m.push($("Open As New Tab", "pi pi-external-link", null, () => xa(t)), $("Open Viewer", "pi pi-image", zi("OPEN_VIEWER"), () => { try { - let e = (p ? Xi(i) : []).filter((e) => !ga(e)), n = e.length; + let e = (p ? Zi(i) : []).filter((e) => !_a(e)), n = e.length; if (n >= 2 && n <= 4) { g({ assets: e, @@ -2122,7 +2122,7 @@ function Ia({ asset: t, card: r, gridContainer: i, panelState: a, pointerX: o, p }); return; } - let r = oa(i).filter((e) => !ga(e)), a = sa(r, t?.id); + let r = sa(i).filter((e) => !_a(e)), a = ca(r, t?.id); if (!r.length || a < 0) return; g({ assets: r, @@ -2131,9 +2131,9 @@ function Ia({ asset: t, card: r, gridContainer: i, panelState: a, pointerX: o, p } catch (e) { console.debug?.(e); } - }), $("Open in Floating Viewer", "pi pi-window-maximize", Ri("OPEN_FLOATING_VIEWER"), async () => { + }), $("Open in Floating Viewer", "pi pi-window-maximize", zi("OPEN_FLOATING_VIEWER"), async () => { try { - let { floatingViewerManager: e } = await Ki(), n = (p ? Xi(i) : []).filter((e) => !ga(e)); + let { floatingViewerManager: e } = await qi(), n = (p ? Zi(i) : []).filter((e) => !_a(e)); if (n.length) { await e.openAssets({ assets: n, @@ -2149,11 +2149,11 @@ function Ia({ asset: t, card: r, gridContainer: i, panelState: a, pointerX: o, p console.debug?.(e); } }), $("Load Asset", "pi pi-upload", "L / L+Drop", async () => { - let n = (p ? Xi(i) : []).filter((e) => !ga(e)); - await ra(n.length ? n : [t]) || e("Failed to create a loader node for this asset.", "error"); + let n = (p ? Zi(i) : []).filter((e) => !_a(e)); + await ia(n.length ? n : [t]) || e("Failed to create a loader node for this asset.", "error"); }), $("Open Graph Map", "pi pi-sitemap", null, async () => { try { - let e = await Zi(t), { floatingViewerManager: n } = await Ki(); + let e = await Qi(t), { floatingViewerManager: n } = await qi(); await n.openAssets({ assets: [e], index: 0, @@ -2162,17 +2162,17 @@ function Ia({ asset: t, card: r, gridContainer: i, panelState: a, pointerX: o, p } catch (e) { console.debug?.(e); } - }), $(R("ctx.showMetadataPanel", "Show metadata panel"), "pi pi-info-circle", Ri("METADATA_PANEL"), () => { + }), $(R("ctx.showMetadataPanel", "Show metadata panel"), "pi pi-info-circle", zi("METADATA_PANEL"), () => { try { - aa(i, r, t, a); + oa(i, r, t, a); let e = i?._mjrOpenDetails; typeof e == "function" && e(); } catch (e) { console.debug?.(e); } - })), va(t) && m.push($(R("ctx.assignAsWorkflowThumbnail", "Use as workflow thumbnail"), "pi pi-image", null, () => ka(t))); - let _ = (p ? u : []).filter((e) => !ga(e)), v = _.length; - v === 2 && m.push($("Compare A/B (2 selected)", "pi pi-clone", Ri("COMPARE_AB"), () => { + })), ya(t) && m.push($(R("ctx.assignAsWorkflowThumbnail", "Use as workflow thumbnail"), "pi pi-image", null, () => Aa(t))); + let _ = (p ? u : []).filter((e) => !_a(e)), v = _.length; + v === 2 && m.push($("Compare A/B (2 selected)", "pi pi-clone", zi("COMPARE_AB"), () => { try { g({ assets: _, @@ -2182,7 +2182,7 @@ function Ia({ asset: t, card: r, gridContainer: i, panelState: a, pointerX: o, p } catch (e) { console.debug?.(e); } - })), v >= 2 && v <= 4 && m.push($(`Side-by-side (2x2) (${v} selected)`, "pi pi-table", Ri("SIDE_BY_SIDE"), () => { + })), v >= 2 && v <= 4 && m.push($(`Side-by-side (2x2) (${v} selected)`, "pi pi-table", zi("SIDE_BY_SIDE"), () => { try { g({ assets: _, @@ -2192,10 +2192,10 @@ function Ia({ asset: t, card: r, gridContainer: i, panelState: a, pointerX: o, p } catch (e) { console.debug?.(e); } - })), m.push($(R("ctx.openInFolder", "Open in folder"), "pi pi-folder-open", Ri("OPEN_IN_FOLDER"), async () => { + })), m.push($(R("ctx.openInFolder", "Open in folder"), "pi pi-folder-open", zi("OPEN_IN_FOLDER"), async () => { let n = await ne(t); n?.ok ? e(R("toast.openedInFolder"), "info", 2e3) : e(n?.error || R("toast.openFolderFailed"), "error"); - }, { disabled: !(t?.id || Qi(t)) }), $(R("ctx.collectFiles", "Collect files"), "pi pi-box", null, async () => { + }, { disabled: !(t?.id || $i(t)) }), $(R("ctx.collectFiles", "Collect files"), "pi pi-box", null, async () => { e(R("toast.collectingFiles", "Collecting files..."), "info", 2500); let r = await n(t); if (!r?.ok) { @@ -2207,7 +2207,7 @@ function Ia({ asset: t, card: r, gridContainer: i, panelState: a, pointerX: o, p where: o }); a > 0 && (s += ` — ${a} ${R("toast.collectMissingInputs", "input(s) missing")}`), e(s, a > 0 ? "warning" : "success", 6e3); - }, { disabled: !Qi(t) }), $(R("ctx.copyPath", "Copy path"), "pi pi-copy", Ri("COPY_PATH"), async () => { + }, { disabled: !$i(t) }), $(R("ctx.copyPath", "Copy path"), "pi pi-copy", zi("COPY_PATH"), async () => { let n = t?.filepath ? String(t.filepath) : ""; if (!n) e(R("toast.noFilePath"), "error"); else try { @@ -2215,15 +2215,15 @@ function Ia({ asset: t, card: r, gridContainer: i, panelState: a, pointerX: o, p } catch (t) { console.warn(R("log.clipboardCopyFailed", "Clipboard copy failed"), t), e(R("toast.pathCopyFailed"), "error"); } - }), $(R("ctx.download", "Download"), "pi pi-download", Ri("DOWNLOAD"), () => { + }), $(R("ctx.download", "Download"), "pi pi-download", zi("DOWNLOAD"), () => { if (!t?.filepath) return; - let n = ct(t.filepath), r = t.filename || "download"; - ta(n, r), e(R("toast.downloadingFile", "Downloading {filename}...", { filename: r }), "info", 3e3); + let n = lt(t.filepath), r = t.filename || "download"; + na(n, r), e(R("toast.downloadingFile", "Downloading {filename}...", { filename: r }), "info", 3e3); }, { disabled: !t?.filepath }), $(`Download selected as ZIP (${v})`, "pi pi-file-zip", null, async () => { - await na(_); - }, { disabled: v < 2 }), $("Add to collection...", "pi pi-bookmark", Ri("ADD_TO_COLLECTION"), async () => { - let e = Xi(i), n = e.length ? e : [t]; - await Rt({ + await ra(_); + }, { disabled: v < 2 }), $("Add to collection...", "pi pi-bookmark", zi("ADD_TO_COLLECTION"), async () => { + let e = Zi(i), n = e.length ? e : [t]; + await zt({ x: o, y: s, assets: n @@ -2231,100 +2231,100 @@ function Ia({ asset: t, card: r, gridContainer: i, panelState: a, pointerX: o, p })); let y = String(a?.collectionId || "").trim(); if (y) { - let n = Xi(i), r = (n.length ? n : [t]).map(Qi).filter(Boolean), a = r.length > 1 ? `Remove from collection (${r.length})` : "Remove from collection"; + let n = Zi(i), r = (n.length ? n : [t]).map($i).filter(Boolean), a = r.length > 1 ? `Remove from collection (${r.length})` : "Remove from collection"; m.push($(a, "pi pi-bookmark", null, async () => { if (!r.length) { e(R("toast.noFilePath"), "error"); return; } let t = await k(y, r); - t?.ok ? ua(i) : e(t?.error || R("toast.removeFromCollectionFailed"), "error"); + t?.ok ? da(i) : e(t?.error || R("toast.removeFromCollectionFailed"), "error"); })); } - let b = !!(t?.id || Qi(t)); - return m.push(Ji(), $(R("ctx.editTags", "Edit tags"), "pi pi-tags", Ri("EDIT_TAGS"), () => { - La(o + 6, s + 6, t, () => { - la(t, { tags: Array.isArray(t?.tags) ? [...t.tags] : [] }); + let b = !!(t?.id || $i(t)); + return m.push(Yi(), $(R("ctx.editTags", "Edit tags"), "pi pi-tags", zi("EDIT_TAGS"), () => { + Ra(o + 6, s + 6, t, () => { + ua(t, { tags: Array.isArray(t?.tags) ? [...t.tags] : [] }); }); - }, { closeOnSelect: !1 }), Ji(), $(R("ctx.setRating", "Set rating"), "pi pi-star", "1-5 >", null, { + }, { closeOnSelect: !1 }), Yi(), $(R("ctx.setRating", "Set rating"), "pi pi-star", "1-5 >", null, { disabled: !b, closeOnSelect: !1, - submenu: Ma(t, b) - }), Ji(), $(R("ctx.resetIndexFile", "Reset index (this file)"), "pi pi-refresh", null, async () => { + submenu: Na(t, b) + }), Yi(), $(R("ctx.resetIndexFile", "Reset index (this file)"), "pi pi-refresh", null, async () => { if (t?.filename || t?.id) { e(R("toast.rescanningFile", "Rescanning file..."), "info", 1600); try { - let n = await da(t, i); + let n = await fa(t, i); n?.ok ? e(R("toast.metadataRefreshed", "Metadata refreshed{suffix}", { suffix: "" }), "success", 1800) : e(n?.error || R("toast.resetFailed", "Failed to reset index"), "error"); } catch (t) { e(`${R("toast.resetFailed", "Failed to reset index")}: ${t?.message || String(t || "")}`, "error"); } } - }, { disabled: !(t?.filename || t?.id) }), $("Rename...", "pi pi-pencil", Ri("RENAME"), async () => { - if (!(t?.id || Qi(t))) return; - let n = t.filename || "", r = await wt(R("dialog.rename.title", "Rename file"), n), a = vt(r, n); + }, { disabled: !(t?.filename || t?.id) }), $("Rename...", "pi pi-pencil", zi("RENAME"), async () => { + if (!(t?.id || $i(t))) return; + let n = t.filename || "", r = await Tt(R("dialog.rename.title", "Rename file"), n), a = yt(r, n); if (!a || a === n) return; - let o = Ot(a); + let o = kt(a); if (!o.valid) e(o.reason, "error"); else try { - let n = await Ce(t, a); + let n = await we(t, a); if (!n?.ok) { e(n?.error || R("toast.fileRenameFailed"), "error"); return; } let r = n?.data?.asset; - r && typeof r == "object" ? (Object.assign(t, r), la(t, r)) : (t.filename = a, t.filepath &&= String(t.filepath).replace(/[^\\/]+$/, a), t.path &&= String(t.path).replace(/[^\\/]+$/, a), t.file_info && typeof t.file_info == "object" && (t.file_info.filename = a, t.file_info.filepath && (t.file_info.filepath = String(t.file_info.filepath).replace(/[^\\/]+$/, a)), t.file_info.path && (t.file_info.path = String(t.file_info.path).replace(/[^\\/]+$/, a))), la(t, { + r && typeof r == "object" ? (Object.assign(t, r), ua(t, r)) : (t.filename = a, t.filepath &&= String(t.filepath).replace(/[^\\/]+$/, a), t.path &&= String(t.path).replace(/[^\\/]+$/, a), t.file_info && typeof t.file_info == "object" && (t.file_info.filename = a, t.file_info.filepath && (t.file_info.filepath = String(t.file_info.filepath).replace(/[^\\/]+$/, a)), t.file_info.path && (t.file_info.path = String(t.file_info.path).replace(/[^\\/]+$/, a))), ua(t, { filename: t.filename, filepath: t.filepath, path: t.path, file_info: t.file_info })); - let o = ca(t.id)?.querySelector?.(".mjr-filename"); - o && (o.textContent = t.filename || a), e(R("toast.fileRenamedSuccess"), "success"), ua(i); + let o = la(t.id)?.querySelector?.(".mjr-filename"); + o && (o.textContent = t.filename || a), e(R("toast.fileRenamedSuccess"), "success"), da(i); } catch (t) { e(R("toast.errorRenaming", "Error renaming file: {error}", { error: t?.message || String(t || "") }), "error"); } - }, { disabled: !(t?.id || Qi(t)) })), f ? m.push($(`Delete ${d} files...`, "pi pi-trash", Ri("DELETE"), async () => { - if (await _t(Number(d) || 0)) try { + }, { disabled: !(t?.id || $i(t)) })), f ? m.push($(`Delete ${d} files...`, "pi pi-trash", zi("DELETE"), async () => { + if (await vt(Number(d) || 0)) try { let n = 0, r = 0, o = [], s = 0, c = u.length ? u : [t]; for (let e of c) (await l(e))?.ok ? (n += 1, e?.id == null ? s += 1 : o.push(String(e.id))) : r += 1; if (o.length) { - let e = wi(i, o); + let e = Ti(i, o); a && Array.isArray(e?.selectedIds) && (a.selectedAssetIds = e.selectedIds, a.activeAssetId = e.selectedIds[0] || ""); } - s > 0 && ua(i), r === 0 ? e(R("toast.filesDeletedSuccessN", "{n} files deleted successfully!", { n }), "success") : e(R("toast.filesDeletedPartial", "{success} files deleted, {failed} failed.", { + s > 0 && da(i), r === 0 ? e(R("toast.filesDeletedSuccessN", "{n} files deleted successfully!", { n }), "success") : e(R("toast.filesDeletedPartial", "{success} files deleted, {failed} failed.", { success: n, failed: r }), "warning"); } catch (t) { e(R("toast.errorDeleting", "Error deleting file: {error}", { error: t?.message || String(t || "") }), "error"); } - })) : m.push($(R("ctx.delete", "Delete"), "pi pi-trash", Ri("DELETE"), async () => { - if (await _t(1, t?.filename)) try { + })) : m.push($(R("ctx.delete", "Delete"), "pi pi-trash", zi("DELETE"), async () => { + if (await vt(1, t?.filename)) try { let n = await l(t); if (!n?.ok) { e(n?.error || R("toast.fileDeleteFailed"), "error"); return; } if (t?.id) { - let e = wi(i, [String(t.id)]); + let e = Ti(i, [String(t.id)]); a && Array.isArray(e?.selectedIds) && (a.selectedAssetIds = e.selectedIds, a.activeAssetId = e.selectedIds[0] || ""); - } else ua(i); + } else da(i); e(R("toast.fileDeletedSuccess"), "success"); } catch (t) { e(R("toast.errorDeleting", "Error deleting file: {error}", { error: t?.message || String(t || "") }), "error"); } - }, { disabled: !(t?.id || Qi(t)) })), m; + }, { disabled: !(t?.id || $i(t)) })), m; } -function La(e, t, n, r) { - n && Rn({ +function Ra(e, t, n, r) { + n && zn({ x: e, y: t, asset: n, onChanged: r }); } -function Ra({ gridContainer: e, getState: t = () => ({}) } = {}) { +function za({ gridContainer: e, getState: t = () => ({}) } = {}) { if (!e) return; if (e._mjrGridContextMenuBound && typeof e._mjrGridContextMenuUnbind == "function") return e._mjrGridContextMenuUnbind; let n = async (n) => { @@ -2334,15 +2334,15 @@ function Ra({ gridContainer: e, getState: t = () => ({}) } = {}) { } catch { return {}; } - })(), i = Mt(n.target, ".mjr-asset-card"); + })(), i = Nt(n.target, ".mjr-asset-card"); if (!i) { - if (!pa(r)) return; - let t = String(e?.dataset?.mjrScope || "").toLowerCase(), i = String(e?.dataset?.mjrSubfolder || "").trim(), a = (t === "input" || t === "output") && ma(); + if (!ma(r)) return; + let t = String(e?.dataset?.mjrScope || "").toLowerCase(), i = String(e?.dataset?.mjrSubfolder || "").trim(), a = (t === "input" || t === "output") && ha(); if (!i && !a) return; - n.preventDefault(), n.stopPropagation(), tn({ + n.preventDefault(), n.stopPropagation(), nn({ x: n.clientX, y: n.clientY, - items: Pa({ + items: Fa({ currentPath: i, gridContainer: e }) @@ -2352,11 +2352,11 @@ function Ra({ gridContainer: e, getState: t = () => ({}) } = {}) { n.preventDefault(), n.stopPropagation(); let a = i._mjrAsset; if (!a) return; - let o = ja(e), s = ga(a) ? Fa({ + let o = Ma(e), s = _a(a) ? Ia({ asset: a, gridContainer: e, panelState: r - }) : Ia({ + }) : La({ asset: a, card: i, gridContainer: e, @@ -2365,7 +2365,7 @@ function Ra({ gridContainer: e, getState: t = () => ({}) } = {}) { pointerY: n.clientY, selection: o }); - tn({ + nn({ x: n.clientX, y: n.clientY, items: s @@ -2394,12 +2394,12 @@ function Ra({ gridContainer: e, getState: t = () => ({}) } = {}) { console.debug?.(e); } try { - Wt(); + Gt(); } catch (e) { console.debug?.(e); } try { - gn(); + _n(); } catch (e) { console.debug?.(e); } @@ -2407,8 +2407,8 @@ function Ra({ gridContainer: e, getState: t = () => ({}) } = {}) { return e._mjrGridContextMenuUnbind = r, r; } // ui/features/panel/controllers/ratingHotkeysController.ts -var za = ot; -function Ba(e) { +var Ba = st; +function Va(e) { let t = String(e ?? ""); try { if (typeof CSS < "u" && typeof CSS.escape == "function") return CSS.escape(t); @@ -2417,10 +2417,10 @@ function Ba(e) { } return t.replace(/([!"#$%&'()*+,./:;<=>?@[\\\]^`{|}~])/g, "\\$1"); } -function Va(e, t = null) { +function Ha(e, t = null) { if (!e) return []; try { - let t = Array.from(Xn(e)); + let t = Array.from(Zn(e)); if (t.length) return t; } catch (e) { console.debug?.(e); @@ -2433,14 +2433,14 @@ function Va(e, t = null) { } return []; } -function Ha(e, t) { +function Ua(e, t) { try { - return e?.querySelector?.(`.mjr-asset-card[data-mjr-asset-id="${Ba(t)}"]`); + return e?.querySelector?.(`.mjr-asset-card[data-mjr-asset-id="${Va(t)}"]`); } catch (e) { return console.debug?.(e), null; } } -function Ua(e, t, n) { +function Wa(e, t, n) { if (!e) return; let r = e._mjrAsset; r && (r.rating = n); @@ -2453,7 +2453,7 @@ function Ua(e, t, n) { console.debug?.(e); } } -async function Wa(e, t, n = 5) { +async function Ga(e, t, n = 5) { let r = Math.max(1, Number(n) || 1), i = 0, a = [], o = async () => { for (; i < e.length;) { let n = i; @@ -2468,7 +2468,7 @@ async function Wa(e, t, n = 5) { for (let t = 0; t < Math.min(r, e.length); t += 1) a.push(o()); await Promise.all(a); } -function Ga({ gridContainer: t, createRatingBadge: n } = {}) { +function Ka({ gridContainer: t, createRatingBadge: n } = {}) { let r = !1, i = null, a = null, o = async (t, n) => { if (t != null) { try { @@ -2483,7 +2483,7 @@ function Ga({ gridContainer: t, createRatingBadge: n } = {}) { return; } try { - window.dispatchEvent(new CustomEvent(za, { detail: { + window.dispatchEvent(new CustomEvent(Ba, { detail: { assetId: String(t), rating: n } })); @@ -2507,13 +2507,13 @@ function Ga({ gridContainer: t, createRatingBadge: n } = {}) { if (!a && !s && !c) return; let l = r === "0" ? 0 : Number(r); if (!Number.isFinite(l)) return; - let u = Va(t, e.target); - u.length && (e.preventDefault(), e.stopPropagation(), e.stopImmediatePropagation?.(), await Wa(u, (e) => o(e, l), 5)); + let u = Ha(t, e.target); + u.length && (e.preventDefault(), e.stopPropagation(), e.stopImmediatePropagation?.(), await Ga(u, (e) => o(e, l), 5)); }, a = (e) => { let r = e?.detail || {}, i = r.assetId ?? r.id ?? null, a = Number(r.rating); if (!i || !Number.isFinite(a)) return; - let o = Ha(t, i); - o && Ua(o, n, a); + let o = Ua(t, i); + o && Wa(o, n, a); }; try { window.addEventListener("keydown", i, { capture: !0 }); @@ -2521,7 +2521,7 @@ function Ga({ gridContainer: t, createRatingBadge: n } = {}) { console.debug?.(e); } try { - window.addEventListener(za, a); + window.addEventListener(Ba, a); } catch (e) { console.debug?.(e); } @@ -2536,7 +2536,7 @@ function Ga({ gridContainer: t, createRatingBadge: n } = {}) { console.debug?.(e); } try { - window.removeEventListener(za, a); + window.removeEventListener(Ba, a); } catch (e) { console.debug?.(e); } @@ -2546,7 +2546,7 @@ function Ga({ gridContainer: t, createRatingBadge: n } = {}) { }; } // ui/features/grid/StackGroupCards.ts -function Ka(e) { +function qa(e) { if (!e || e.dataset?.mjrOverlayButtonBound === "1") return e; try { e.dataset.mjrOverlayButtonBound = "1"; @@ -2565,7 +2565,7 @@ function Ka(e) { }; return e.addEventListener("pointerdown", t), e.addEventListener("mousedown", n), e.addEventListener("touchstart", t, { passive: !0 }), e.addEventListener("dblclick", t), e.addEventListener("keydown", t), e.addEventListener("dragstart", n), e; } -function qa(e, t, n = null, r = "mjr-stack-group-button-count") { +function Ja(e, t, n = null, r = "mjr-stack-group-button-count") { e.textContent = ""; let i = document.createElement("span"); if (i.className = t, e.appendChild(i), n != null) { @@ -2573,24 +2573,24 @@ function qa(e, t, n = null, r = "mjr-stack-group-button-count") { t.className = r, t.textContent = String(n), e.appendChild(t); } } -function Ja(e) { +function Ya(e) { return String(e?.dataset?.mjrGroupStacks || "") === "1"; } -function Ya(e) { +function Xa(e) { let t = String(e?.stack_id || "").trim(); return t ? `stack:${t}` : ""; } -function Xa(e, t, n) { - return Ja(e) && Ya(t) || n; +function Za(e, t, n) { + return Ya(e) && Xa(t) || n; } -function Za(e) { +function Qa(e) { try { e._mjrStackMembersCache?.clear?.(); } catch (e) { console.debug?.(e); } } -function Qa(e, t, n) { +function $a(e, t, n) { if (!t || !n || t._mjrIsVue) return; let r = !!n._mjrDupStack, i = Number(n._mjrDupCount || 0) || 0; if (!r || i < 2) { @@ -2600,7 +2600,7 @@ function Qa(e, t, n) { } t.dataset.mjrDupStacked = "true", t.dataset.mjrDupCount = String(i); let a = t.querySelector(".mjr-dup-stack-button"); - a || (a = document.createElement("button"), a.type = "button", a.className = "mjr-dup-stack-button", a.setAttribute("aria-label", "Show all duplicates"), Ka(a), a.addEventListener("click", (e) => { + a || (a = document.createElement("button"), a.type = "button", a.className = "mjr-dup-stack-button", a.setAttribute("aria-label", "Show all duplicates"), qa(a), a.addEventListener("click", (e) => { if (e.preventDefault(), e.stopPropagation(), a.dataset?.mjrStackOpening !== "1") try { a.dataset.mjrStackOpening = "1", a.disabled = !0; let e = a?._mjrGridContainer, t = a?._mjrAsset; @@ -2626,21 +2626,21 @@ function Qa(e, t, n) { } }), t.appendChild(a)), a._mjrGridContainer = e, a._mjrAsset = n; let o = `${i} duplicate${i > 1 ? "s" : ""}`; - a.title = `${o} - click to compare all copies`, qa(a, "pi pi-copy", i, "mjr-dup-stack-count"); + a.title = `${o} - click to compare all copies`, Ja(a, "pi pi-copy", i, "mjr-dup-stack-count"); } // ui/features/dnd/utils/log.ts -var $a = () => { +var eo = () => { try { return !!window?.MJR_DND_DEBUG; } catch { return !1; } -}, eo = (...e) => { - $a() && console.debug("[Majoor.DnD]", ...e); -}, to = (e, { buildCustomViewURL: t, buildViewURL: n }) => { +}, to = (...e) => { + eo() && console.debug("[Majoor.DnD]", ...e); +}, no = (e, { buildCustomViewURL: t, buildViewURL: n }) => { let r = String(e?.type || "output").toLowerCase(); - return r === "custom" ? t(e?.filename || "", e?.subfolder || "", ze(e)) : r === "input" ? n(e?.filename || "", e?.subfolder || "", "input") : r === "temp" ? n(e?.filename || "", e?.subfolder || "", "temp") : n(e?.filename || "", e?.subfolder || "", "output"); -}, no = (e) => { + return r === "custom" ? t(e?.filename || "", e?.subfolder || "", Be(e)) : r === "input" ? n(e?.filename || "", e?.subfolder || "", "input") : r === "temp" ? n(e?.filename || "", e?.subfolder || "", "temp") : n(e?.filename || "", e?.subfolder || "", "output"); +}, ro = (e) => { if (!e || typeof e != "object") return null; let t = String(e.filename || "").trim(); if (!t || t.includes("/") || t.includes("\\") || t.includes("\0")) return null; @@ -2653,41 +2653,41 @@ var $a = () => { kind: o || void 0, filepath: o === "workflow" && s ? s : void 0 }; -}, ro = no, io = (e, t) => { +}, io = ro, ao = (e, t) => { let n = e?.dataTransfer?.getData?.(t); if (!n) return null; try { - return no(JSON.parse(n)); + return ro(JSON.parse(n)); } catch { return null; } -}, ao = /* @__PURE__ */ new WeakMap(), oo = !1; -function so(e) { - return e && ao.get(e) || null; +}, oo = /* @__PURE__ */ new WeakMap(), so = !1; +function co(e) { + return e && oo.get(e) || null; } -function co(e, t) { - return e ? typeof t == "function" ? (ao.set(e, t), t) : (ao.delete(e), null) : null; +function lo(e, t) { + return e ? typeof t == "function" ? (oo.set(e, t), t) : (oo.delete(e), null) : null; } -function lo(e) { - e && ao.delete(e); -} -function uo() { - oo = !0; +function uo(e) { + e && oo.delete(e); } function fo() { - return oo ? (oo = !1, !0) : !1; + so = !0; } function po() { - oo = !1; + return so ? (so = !1, !0) : !1; +} +function mo() { + so = !1; } // ui/features/dnd/out/DragOut.ts -var mo = (e) => { +var ho = (e) => { try { return new URL(String(e || ""), window.location.href).href; } catch { return String(e || ""); } -}, ho = () => Re("mjr_", 24), go = (e) => { +}, go = () => ze("mjr_", 24), _o = (e) => { let t = e && typeof e == "object" ? e : null; if (!t) return null; let n = t.filename || t.name; @@ -2695,9 +2695,9 @@ var mo = (e) => { filename: n, subfolder: t.subfolder || "", type: String(t.type || "output").toLowerCase(), - root_id: ze(t) || void 0 + root_id: Be(t) || void 0 } : null; -}, _o = (e, t) => { +}, vo = (e, t) => { let n = []; if (!e || !t) return n; let r = t?.dataset?.mjrAssetId ? String(t.dataset.mjrAssetId) : ""; @@ -2747,25 +2747,25 @@ var mo = (e) => { t && typeof t == "object" && n.push(t); } return n; -}, vo = (e) => { +}, yo = (e) => { if (!e || typeof e != "object") return ""; let t = e.filepath || e.path || e?.file_info?.filepath || ""; return t ? String(t) : ""; -}, yo = ({ dt: e, asset: t, containerEl: n, card: r, viewUrl: i, stripMetadata: a = !1 }) => { +}, bo = ({ dt: e, asset: t, containerEl: n, card: r, viewUrl: i, stripMetadata: a = !1 }) => { if (!e || !t) return; - let o = _o(n, r); + let o = vo(n, r); if (Array.isArray(o) && o.length > 1) { - let t = o.map(go).filter(Boolean); + let t = o.map(_o).filter(Boolean); if (t.length > 1) { let n = ""; try { - n = ho(); + n = go(); } catch (e) { console.warn("[DragOut] failed to create secure batch token", e); } if (n) { try { - L(it.BATCH_ZIP_CREATE, { + L(at.BATCH_ZIP_CREATE, { token: n, items: t, strip_metadata: !!a @@ -2773,7 +2773,7 @@ var mo = (e) => { } catch (e) { console.debug?.(e); } - let r = mo(tt(n)), i = a ? `Majoor_Clean_Batch_${t.length}.zip` : `Majoor_Batch_${t.length}.zip`; + let r = ho(nt(n)), i = a ? `Majoor_Clean_Batch_${t.length}.zip` : `Majoor_Batch_${t.length}.zip`; try { e.setData("text/uri-list", r), e.setData("DownloadURL", `application/zip:${i}:${r}`), e.effectAllowed = "copyMove"; } catch (e) { @@ -2785,40 +2785,40 @@ var mo = (e) => { } let s = t.filename || t.name; if (!s) return; - let c = a ? vo(t) : "", l = mo((c ? at(c) : "") || i), u = en(s); + let c = a ? yo(t) : "", l = ho((c ? ot(c) : "") || i), u = tn(s); try { e.setData("text/uri-list", l), e.setData("DownloadURL", `${u}:${s}:${l}`), e.effectAllowed = "copyMove"; } catch (e) { console.debug?.(e); } -}, bo = (e, { asset: t, containerEl: n, card: r }) => { +}, xo = (e, { asset: t, containerEl: n, card: r }) => { if (e && t) try { let t = e?.dataTransfer?.dropEffect; - !t || t === "none" || fo(); + !t || t === "none" || po(); return; } catch (e) { console.debug?.(e); } -}, xo = () => { - let e = Ze(); +}, So = () => { + let e = Qe(); return e && typeof e == "object" ? e : null; -}, So = (e) => to(e, { - buildCustomViewURL: Ge, - buildViewURL: Xe -}), Co = !1, wo = !1, To = (e) => { +}, Co = (e) => no(e, { + buildCustomViewURL: Ke, + buildViewURL: Ze +}), wo = !1, To = !1, Eo = (e) => { try { return !!e?.closest?.("input, textarea, select, [contenteditable='true']"); } catch { return !1; } -}, Eo = () => Co === !0, Do = () => wo === !0, Oo = (e) => [ +}, Do = () => wo === !0, Oo = () => To === !0, ko = (e) => [ String(e?.type || "output"), String(e?.filename || ""), String(e?.subfolder || ""), - String(ze(e) || "") -].join("\n"), ko = (e, t) => { + String(Be(e) || "") +].join("\n"), Ao = (e, t) => { if (String(e?.type || e?.file_info?.type || "").toLowerCase() === "custom") return null; - let n = ut(String(e?.filepath || e?.path || e?.fullpath || e?.full_path || e?.file_info?.filepath || e?.file_info?.path || "")).trim(); + let n = dt(String(e?.filepath || e?.path || e?.fullpath || e?.full_path || e?.file_info?.filepath || e?.file_info?.path || "")).trim(); if (!n || !t) return null; let r = n.toLowerCase(), i = t.toLowerCase(); for (let e of [ @@ -2846,20 +2846,20 @@ var mo = (e) => { }; } return null; -}, Ao = (e) => { +}, jo = (e) => { if (!e || typeof e != "object") return null; let t = String(e.filename || "").trim(); if (!t) return null; - let n = ko(e, t); + let n = Ao(e, t); return { filename: t, subfolder: n?.subfolder ?? e.subfolder ?? "", type: n?.type ?? String(e.type || "output").toLowerCase(), - root_id: ze(e) || void 0, + root_id: Be(e) || void 0, kind: String(e.kind || "").toLowerCase(), filepath: String(e.filepath || e.path || e?.file_info?.filepath || "").trim() || void 0 }; -}, jo = (e, t, n) => { +}, Mo = (e, t, n) => { if (!e || !t || n == null) return !1; let r = String(n); try { @@ -2873,10 +2873,10 @@ var mo = (e) => { console.debug?.(e); } return !1; -}, Mo = ({ dt: e, asset: t, payload: n, viewUrl: r }) => { +}, No = ({ dt: e, asset: t, payload: n, viewUrl: r }) => { if (!e || !t || !n) return; let i = String(n.kind || "").toLowerCase() === "model3d" ? "3D" : n.kind, a = { - id: t.id == null ? Oo(n) : String(t.id), + id: t.id == null ? ko(n) : String(t.id), name: t.filename || n.filename, display_name: t.filename || n.filename, filename: n.filename, @@ -2892,46 +2892,46 @@ var mo = (e) => { }, tags: Array.isArray(t.tags) ? t.tags : [] }; - jo(e, sn, JSON.stringify(a)), r && jo(e, "text/uri-list", r); -}, No = (e) => { + Mo(e, cn, JSON.stringify(a)), r && Mo(e, "text/uri-list", r); +}, Po = (e) => { let t = e && typeof e == "object" ? e : null; if (!t) return []; try { let e = window?.__MJR_LAST_SELECTION_GRID__, n = typeof e?._mjrGetSelectedAssets == "function" ? e._mjrGetSelectedAssets() : []; if (Array.isArray(n) && n.length > 1) { - let e = n.map(Ao).filter(rn), r = Oo(t); - if (e.some((e) => Oo(e) === r)) return e; + let e = n.map(jo).filter(an), r = ko(t); + if (e.some((e) => ko(e) === r)) return e; } } catch (e) { console.debug?.(e); } return [t]; -}, Po = (e, t) => { +}, Fo = (e, t) => { try { let n = typeof e?._mjrGetSelectedAssets == "function" ? e._mjrGetSelectedAssets() : []; if (!Array.isArray(n) || n.length <= 1) return []; - let r = n.map(Ao).filter(rn), i = Oo(t); - return r.some((e) => Oo(e) === i) ? r : []; + let r = n.map(jo).filter(an), i = ko(t); + return r.some((e) => ko(e) === i) ? r : []; } catch (e) { return console.debug?.(e), []; } -}, Fo = (e, t) => { +}, Io = (e, t) => { try { let t = e?.dataTransfer?.getData?.("application/x-mjr-assets") || ""; if (t) { - let e = JSON.parse(t), n = (Array.isArray(e?.items) ? e.items : Array.isArray(e) ? e : []).map(ro).filter(rn); + let e = JSON.parse(t), n = (Array.isArray(e?.items) ? e.items : Array.isArray(e) ? e : []).map(io).filter(an); if (n.length) return n; } } catch (e) { console.debug?.(e); } - return No(t); -}, Io = async (e) => { + return Po(t); +}, Lo = async (e) => { let t = Array.isArray(e) ? e.filter(Boolean) : []; return t.length ? (await Promise.all(t.map(async (e) => { - let t = (await Un({ + let t = (await Wn({ post: L, - endpoint: it.STAGE_TO_INPUT, + endpoint: at.STAGE_TO_INPUT, payload: e, index: !1 }))?.relativePath; @@ -2941,43 +2941,43 @@ var mo = (e) => { droppedExt: String(e?.filename || "").split(".").pop() || "" } : null; }))).filter(Boolean) : []; -}, Lo = /* @__PURE__ */ new Map(), Ro = 6e4, zo = 20, Bo = 5242880, Vo = 5e3, Ho = 2e4, Uo = 256, Wo = 5e5, Go = /[\u0000-\u001f\u007f]/, Ko = /\u0000/, qo = (e) => Go.test(String(e || "")), Jo = (e) => Ko.test(String(e || "")), Yo = (e) => { +}, Ro = /* @__PURE__ */ new Map(), zo = 6e4, Bo = 20, Vo = 5242880, Ho = 5e3, Uo = 2e4, Wo = 256, Go = 5e5, Ko = /[\u0000-\u001f\u007f]/, qo = /\u0000/, Jo = (e) => Ko.test(String(e || "")), Yo = (e) => qo.test(String(e || "")), Xo = (e) => { if (!e || typeof e != "object" || Array.isArray(e)) return !1; let t = Number(e.id); if (!Number.isFinite(t)) return !1; let n = e.type == null ? "" : String(e.type); - if (n && (n.length > Uo || qo(n))) return !1; + if (n && (n.length > Wo || Jo(n))) return !1; let r = e.widgets_values; if (Array.isArray(r)) { - for (let e of r) if (typeof e == "string" && (e.length > Wo || Jo(e))) return !1; + for (let e of r) if (typeof e == "string" && (e.length > Go || Yo(e))) return !1; } return !0; -}, Xo = (e) => { +}, Zo = (e) => { if (Array.isArray(e)) return e.length >= 4; if (e && typeof e == "object") { let t = Number(e.id); return !!Number.isFinite(t); } return !1; -}, Zo = (e) => { - if (!e || typeof e != "object" || !Array.isArray(e.nodes) || !Array.isArray(e.links) || e.nodes.length > Vo || e.links.length > Ho || !e.nodes.every(Yo) || !e.links.every(Xo)) return !1; +}, Qo = (e) => { + if (!e || typeof e != "object" || !Array.isArray(e.nodes) || !Array.isArray(e.links) || e.nodes.length > Ho || e.links.length > Uo || !e.nodes.every(Xo) || !e.links.every(Zo)) return !1; try { let t = JSON.stringify(e).length; - if (!Number.isFinite(t) || t <= 0 || t > Bo) return !1; + if (!Number.isFinite(t) || t <= 0 || t > Vo) return !1; } catch { return !1; } return !0; -}, Qo = () => { +}, $o = () => { let e = Date.now(); - for (let [t, n] of Lo.entries()) e - (n?.at || 0) > Ro && Lo.delete(t); - Lo.size > zo && Array.from(Lo.entries()).sort((e, t) => (e[1]?.at || 0) - (t[1]?.at || 0)).slice(0, Lo.size - zo).forEach(([e]) => Lo.delete(e)); -}, $o = async (e, t = null) => { - let n = e && typeof e == "object" ? e : null, r = ze(n), i = xo(), a = n?.filename ? `${n.type || "output"}:${n.filename}:${n.subfolder || ""}:${r}` : t ? `path:${t}` : null; + for (let [t, n] of Ro.entries()) e - (n?.at || 0) > zo && Ro.delete(t); + Ro.size > Bo && Array.from(Ro.entries()).sort((e, t) => (e[1]?.at || 0) - (t[1]?.at || 0)).slice(0, Ro.size - Bo).forEach(([e]) => Ro.delete(e)); +}, es = async (e, t = null) => { + let n = e && typeof e == "object" ? e : null, r = Be(n), i = So(), a = n?.filename ? `${n.type || "output"}:${n.filename}:${n.subfolder || ""}:${r}` : t ? `path:${t}` : null; if (a) { - let e = Lo.get(a); - if (e && Date.now() - (e.at || 0) < Ro) { - if (e.workflow && Zo(e.workflow)) try { + let e = Ro.get(a); + if (e && Date.now() - (e.at || 0) < zo) { + if (e.workflow && Qo(e.workflow)) try { if (typeof i?.loadGraphData == "function") return i.loadGraphData(e.workflow), !0; if (typeof i?.canvas?.graph?.configure == "function") { i.canvas.graph.configure(e.workflow); @@ -3001,19 +3001,19 @@ var mo = (e) => { let e = await y(String(n.filepath), { timeoutMs: 3e4 }); o = e?.ok && (e?.data?.workflow || e?.workflow) || null; } else if (n?.filename) { - let t = `${it.WORKFLOW_QUICK}?type=${encodeURIComponent(n.type || "output")}&filename=${encodeURIComponent(n.filename)}&subfolder=${encodeURIComponent(n.subfolder || "")}` + (r ? `&root_id=${encodeURIComponent(r)}` : ""), i = await re(t); - i?.ok && i.workflow && (o = i.workflow), o || (e = `${it.METADATA}?workflow_only=1&type=${encodeURIComponent(n.type || "output")}&filename=${encodeURIComponent(n.filename)}&subfolder=${encodeURIComponent(n.subfolder || "")}&root_id=${encodeURIComponent(r)}`); - } else t && (e = `${it.METADATA}?workflow_only=1&path=${encodeURIComponent(String(t))}`); + let t = `${at.WORKFLOW_QUICK}?type=${encodeURIComponent(n.type || "output")}&filename=${encodeURIComponent(n.filename)}&subfolder=${encodeURIComponent(n.subfolder || "")}` + (r ? `&root_id=${encodeURIComponent(r)}` : ""), i = await re(t); + i?.ok && i.workflow && (o = i.workflow), o || (e = `${at.METADATA}?workflow_only=1&type=${encodeURIComponent(n.type || "output")}&filename=${encodeURIComponent(n.filename)}&subfolder=${encodeURIComponent(n.subfolder || "")}&root_id=${encodeURIComponent(r)}`); + } else t && (e = `${at.METADATA}?workflow_only=1&path=${encodeURIComponent(String(t))}`); if (!o && e) { let t = await re(e); if (!t?.ok || !t.data) return !1; o = t.data?.workflow; } - if (!Zo(o)) return !1; - if (a && (Lo.set(a, { + if (!Qo(o)) return !1; + if (a && (Ro.set(a, { workflow: o, at: Date.now() - }), Qo()), typeof i?.loadGraphData == "function") return i.loadGraphData(o), !0; + }), $o()), typeof i?.loadGraphData == "function") return i.loadGraphData(o), !0; if (typeof i?.canvas?.graph?.configure == "function") { i.canvas.graph.configure(o); try { @@ -3029,7 +3029,7 @@ var mo = (e) => { } return !1; }; -function es(e) { +function ts(e) { return (t) => { let n = t?.dataTransfer; if (!n) return; @@ -3037,26 +3037,26 @@ function es(e) { if (!r) return; let i = r._mjrAsset; if (!i || typeof i != "object") return; - let a = String(i?.kind || "").toLowerCase(), o = ko(i, String(i.filename || "")), s = o?.type ?? String(i?.type || "output").toLowerCase(), c = { + let a = String(i?.kind || "").toLowerCase(), o = Ao(i, String(i.filename || "")), s = o?.type ?? String(i?.type || "output").toLowerCase(), c = { filename: i.filename, subfolder: o?.subfolder ?? i.subfolder ?? "", type: s, - root_id: ze(i) || void 0, + root_id: Be(i) || void 0, kind: a, filepath: String(i.filepath || i.path || i?.file_info?.filepath || "").trim() || void 0 }; try { - let t = Eo(); - jo(n, pn, JSON.stringify(c)); - let o = Po(e, c); - o.length > 1 && jo(n, Wn, JSON.stringify({ items: o })), jo(n, "text/plain", String(i.filename || "")); - let s = a === "workflow" ? "" : So(c); - Mo({ + let t = Do(); + Mo(n, mn, JSON.stringify(c)); + let o = Fo(e, c); + o.length > 1 && Mo(n, Gn, JSON.stringify({ items: o })), Mo(n, "text/plain", String(i.filename || "")); + let s = a === "workflow" ? "" : Co(c); + No({ dt: n, asset: i, payload: c, viewUrl: s - }), yo({ + }), bo({ dt: n, asset: i, containerEl: e, @@ -3069,7 +3069,7 @@ function es(e) { } try { r.addEventListener("dragend", (t) => { - bo(t, { + xo(t, { asset: i, containerEl: e, card: r @@ -3086,30 +3086,30 @@ function es(e) { } }; } -var ts = (e) => { +var ns = (e) => { if (!e) return () => {}; - let t = so(e); + let t = co(e); if (typeof t == "function") return t; - let n = es(e); - return e.addEventListener("dragstart", n, !0), co(e, () => { + let n = ts(e); + return e.addEventListener("dragstart", n, !0), lo(e, () => { try { e.removeEventListener("dragstart", n, !0); } catch (e) { console.debug?.(e); } - lo(e); + uo(e); }); -}, ns = null, rs = 0; -function is() { +}, rs = null, is = 0; +function as() { let t = (e) => { - if (To(e?.target)) return; + if (Eo(e?.target)) return; let t = String(e?.key || "").toLowerCase(); - t === "s" ? Co = !0 : t === "l" && (wo = !0); + t === "s" ? wo = !0 : t === "l" && (To = !0); }, n = (e) => { let t = String(e?.key || "").toLowerCase(); - t === "s" ? Co = !1 : t === "l" && (wo = !1); + t === "s" ? wo = !1 : t === "l" && (To = !1); }, r = () => { - Co = !1, wo = !1; + wo = !1, To = !1; }, i = /* @__PURE__ */ new Set([ "mp3", "wav", @@ -3183,9 +3183,9 @@ function is() { e && (a = e.resolvedStart === void 0 ? e.start : e.resolvedStart); } t._ghostSegmentId = null, t._ghostTrack = null, t._ghostInitialTimeline = null, t._previewSegments = null, t.render?.(); - let c = String(r || "").toLowerCase(), l = i.has(c), u = await Un({ + let c = String(r || "").toLowerCase(), l = i.has(c), u = await Wn({ post: L, - endpoint: it.STAGE_TO_INPUT, + endpoint: at.STAGE_TO_INPUT, payload: n, index: !1 }); @@ -3228,10 +3228,10 @@ function is() { waveformPeaks: u }; if (!t.timeline?.audioSegments) { - eo("ltxdirector inject: no audioSegments", {}); + to("ltxdirector inject: no audioSegments", {}); return; } - t.timeline.audioSegments.push(g), t.timeline.audioSegments.sort((e, t) => e.start - t.start), t.selectionType = "audio", t.selectedIndex = t.timeline.audioSegments.findIndex((e) => e.id === h), t.updateUIFromSelection?.(), t.commitChanges?.(!0), t.render?.(), e(`Added audio to LTX Director: ${d}`, "success", 3e3), eo("drop ltxdirector inject audio", { + t.timeline.audioSegments.push(g), t.timeline.audioSegments.sort((e, t) => e.start - t.start), t.selectionType = "audio", t.selectedIndex = t.timeline.audioSegments.findIndex((e) => e.id === h), t.updateUIFromSelection?.(), t.commitChanges?.(!0), t.render?.(), e(`Added audio to LTX Director: ${d}`, "success", 3e3), to("drop ltxdirector inject audio", { file: d, start: f }); @@ -3274,7 +3274,7 @@ function is() { imageB64: m }; if (!t.timeline?.segments) { - eo("ltxdirector inject: no timeline", {}); + to("ltxdirector inject: no timeline", {}); return; } if (t.timeline.segments.push(b), t.timeline.segments.sort((e, t) => e.start - t.start), g) try { @@ -3289,7 +3289,7 @@ function is() { }, e.src = m; } let x = t.timeline.segments.findIndex((e) => e.id === y), S = g ? t.timeline.segments.findIndex((e) => e.id === b.id) : x; - S >= 0 && (t.selectionType = "image", t.selectedIndex = S, t.updateUIFromSelection?.()), t.commitChanges?.(!0), t.render?.(), e(`Added ${g ? "video" : "image"} to LTX Director: ${d}`, "success", 3e3), eo("drop ltxdirector inject", { + S >= 0 && (t.selectionType = "image", t.selectedIndex = S, t.updateUIFromSelection?.()), t.commitChanges?.(!0), t.render?.(), e(`Added ${g ? "video" : "image"} to LTX Director: ${d}`, "success", 3e3), to("drop ltxdirector inject", { file: d, start: v, ext: c, @@ -3301,39 +3301,39 @@ function is() { onKeyUp: n, onWindowBlur: r, onDragOver: (e) => { - let t = xo(); + let t = So(); if (!Array.from(e?.dataTransfer?.types || []).includes("application/x-mjr-asset")) return; - let n = io(e, pn); - if (!rn(n)) return; - let r = ln(t, e.clientX, e.clientY), i = r ? cn(t, r, e.clientX, e.clientY) : null, a = String(n?.filename || "").split(".").pop() || "", o = r && !i ? dn(r, n, a) : null, s = r && !i && !o && !!r._timelineEditor; - r && (i || o || s) ? (e.preventDefault(), s || (e.stopImmediatePropagation?.(), e.stopPropagation()), Yt(t, r, jn), e.dataTransfer.dropEffect = "copy", i ? eo("dragover slot", { + let n = ao(e, mn); + if (!an(n)) return; + let r = un(t, e.clientX, e.clientY), i = r ? ln(t, r, e.clientX, e.clientY) : null, a = String(n?.filename || "").split(".").pop() || "", o = r && !i ? fn(r, n, a) : null, s = r && !i && !o && !!r._timelineEditor; + r && (i || o || s) ? (e.preventDefault(), s || (e.stopImmediatePropagation?.(), e.stopPropagation()), Xt(t, r, Mn), e.dataTransfer.dropEffect = "copy", i ? to("dragover slot", { node: r?.title, slot: i.input?.name - }) : s ? eo("dragover ltxdirector", { node: r?.title }) : eo("dragover widget", { + }) : s ? to("dragover ltxdirector", { node: r?.title }) : to("dragover widget", { node: r?.title, widget: o?.name - })) : (An(t, jn), un(t, e) && (e.preventDefault(), e.dataTransfer.dropEffect = "copy")); + })) : (jn(t, Mn), dn(t, e) && (e.preventDefault(), e.dataTransfer.dropEffect = "copy")); }, onDrop: async (t) => { - let n = xo(); + let n = So(); if (!Array.from(t?.dataTransfer?.types || []).includes("application/x-mjr-asset")) return; try { if ((t?.target)?.closest?.(".mjr-folder-card")) return; } catch {} - let r = io(t, pn); - if (!rn(r) || !un(n, t)) return; - uo(); - let i = Do(), a = i ? Fo(t, r) : [r], o = ln(n, t.clientX, t.clientY), s = o ? cn(n, o, t.clientX, t.clientY) : null, l = String(r?.filename || "").split(".").pop() || "", u = o && !s ? dn(o, r, l) : null; + let r = ao(t, mn); + if (!an(r) || !dn(n, t)) return; + fo(); + let i = Oo(), a = i ? Io(t, r) : [r], o = un(n, t.clientX, t.clientY), s = o ? ln(n, o, t.clientX, t.clientY) : null, l = String(r?.filename || "").split(".").pop() || "", u = o && !s ? fn(o, r, l) : null; if (o && s) { - t.preventDefault(), t.stopImmediatePropagation?.(), t.stopPropagation(), An(n, jn); - let i = await Zt({ + t.preventDefault(), t.stopImmediatePropagation?.(), t.stopPropagation(), jn(n, Mn); + let i = await Qt({ post: L, - endpoint: it.STAGE_TO_INPUT, + endpoint: at.STAGE_TO_INPUT, payload: r, index: !1 }); if (!i) return; - if ($t({ + if (en({ app: n, payload: r, relativePath: i, @@ -3341,7 +3341,7 @@ function is() { inputSlotIndex: s.index, event: t })) { - eo("drop slot created and connected loader", { + to("drop slot created and connected loader", { node: o?.title, slot: s.input?.name, value: i @@ -3352,47 +3352,47 @@ function is() { return; } if (o && !s && !u && o._timelineEditor && !i) { - t.preventDefault(), t.stopImmediatePropagation?.(), t.stopPropagation(), An(n, jn), await c(o._timelineEditor, r, l); + t.preventDefault(), t.stopImmediatePropagation?.(), t.stopPropagation(), jn(n, Mn), await c(o._timelineEditor, r, l); return; } if (!o || !u) { - if (An(n, jn), t.preventDefault(), t.stopImmediatePropagation?.(), t.stopPropagation(), i) { - let i = await Io(a), o = mn({ + if (jn(n, Mn), t.preventDefault(), t.stopImmediatePropagation?.(), t.stopPropagation(), i) { + let i = await Lo(a), o = hn({ app: n, items: i, event: t }); if (o > 0) { - eo("drop canvas created loaders", { count: o }); + to("drop canvas created loaders", { count: o }); return; } e(`Failed to load file: "${r?.filename}". Staging failed.`, "error"); return; } if (String(r?.kind || "").toLowerCase() === "workflow") { - if (await $o(r)) { - eo("drop canvas loaded workflow", { file: r?.filename }); + if (await es(r)) { + to("drop canvas loaded workflow", { file: r?.filename }); return; } e(`Failed to load workflow: "${r?.filename}".`, "error"); return; } - let s = !o && !i, c = Un({ + let s = !o && !i, c = Wn({ post: L, - endpoint: it.STAGE_TO_INPUT, + endpoint: at.STAGE_TO_INPUT, payload: r, index: !1 - }), u = s ? $o(r) : Promise.resolve(!1), [d, f] = await Promise.all([u, c]); + }), u = s ? es(r) : Promise.resolve(!1), [d, f] = await Promise.all([u, c]); if (d) { - eo("drop canvas loaded workflow", { file: r?.filename }); + to("drop canvas loaded workflow", { file: r?.filename }); return; } let p = f?.relativePath; if (!p) { - eo("drop canvas stage failed"), e(`Failed to load file: "${r?.filename}". Staging failed.`, "error"); + to("drop canvas stage failed"), e(`Failed to load file: "${r?.filename}". Staging failed.`, "error"); return; } - if (eo("drop canvas staged", { value: p }), mn({ + if (to("drop canvas staged", { value: p }), hn({ app: n, items: [{ payload: r, @@ -3401,71 +3401,71 @@ function is() { }], event: t })) { - eo("drop canvas created loader", { value: p }); + to("drop canvas created loader", { value: p }); return; } e(`Staged to input: ${p}`, "success", 4e3); return; } - t.preventDefault(), t.stopImmediatePropagation?.(), t.stopPropagation(), An(n, jn); - let d = await Zt({ + t.preventDefault(), t.stopImmediatePropagation?.(), t.stopPropagation(), jn(n, Mn); + let d = await Qt({ post: L, - endpoint: it.STAGE_TO_INPUT, + endpoint: at.STAGE_TO_INPUT, payload: r, index: !1 }); - d && (Qt(u, d), jn(n), eo("drop inject", { + d && ($t(u, d), Mn(n), to("drop inject", { node: o?.title, widget: u?.name, value: d })); }, onDragLeave: () => { - let e = xo(); - An(e, jn), eo("dragleave"); + let e = So(); + jn(e, Mn), to("dragleave"); } }; } -function as() { +function os() { if (typeof window > "u" || !window?.addEventListener) return { dispose() {} }; - let { onKeyDown: e, onKeyUp: t, onWindowBlur: n, onDragOver: r, onDrop: i, onDragLeave: a } = is(); + let { onKeyDown: e, onKeyUp: t, onWindowBlur: n, onDragOver: r, onDrop: i, onDragLeave: a } = as(); return window.addEventListener("keydown", e, !0), window.addEventListener("keyup", t, !0), window.addEventListener("blur", n, !0), window.addEventListener("dragover", r, !0), window.addEventListener("drop", i, !0), window.addEventListener("dragleave", a, !0), { dispose: () => { try { window.removeEventListener("keydown", e, !0), window.removeEventListener("keyup", t, !0), window.removeEventListener("blur", n, !0), window.removeEventListener("dragover", r, !0), window.removeEventListener("drop", i, !0), window.removeEventListener("dragleave", a, !0); } catch (e) { console.debug?.(e); } - Co = !1, wo = !1; + wo = !1, To = !1; try { - An(xo(), jn); + jn(So(), Mn); } catch (e) { console.debug?.(e); } } }; } -function os() { - ns || (ns = as(), rs = 0), rs += 1; +function ss() { + rs || (rs = os(), is = 0), is += 1; let e = !1; return ({ force: t = !1 } = {}) => { - e || (e = !0, ss({ force: t })); + e || (e = !0, cs({ force: t })); }; } -function ss({ force: e = !1 } = {}) { - if (!ns) rs = 0, po(); - else if (!e && rs > 1) --rs; +function cs({ force: e = !1 } = {}) { + if (!rs) is = 0, mo(); + else if (!e && is > 1) --is; else { - rs = 0; + is = 0; try { - ns.dispose?.(); + rs.dispose?.(); } catch (e) { console.debug?.(e); } - ns = null, po(); + rs = null, mo(); } } // ui/features/grid/MediaBlobCache.ts -var cs = "__MJR_MEDIA_BLOB_CACHE__", ls = 384, us = 3e5, ds = 3e4, fs = 15e3, ps = 6, ms = 192, hs = 3; -function gs() { +var ls = "__MJR_MEDIA_BLOB_CACHE__", us = 384, ds = 3e5, fs = 3e4, ps = 15e3, ms = 6, hs = 192, gs = 3; +function _s() { let e = /* @__PURE__ */ new Map(), t = null, n = 0, r = []; function i() { try { @@ -3477,10 +3477,10 @@ function gs() { return !1; } function a() { - return i() ? ms : ls; + return i() ? hs : us; } function o() { - return i() ? hs : ps; + return i() ? gs : ms; } async function s(e) { n >= o() && await new Promise((e) => r.push(e)), n += 1; @@ -3493,7 +3493,7 @@ function gs() { } } function c() { - t ||= setInterval(l, fs); + t ||= setInterval(l, ps); } function l() { try { @@ -3515,7 +3515,7 @@ function gs() { for (let [r, i] of e) i.refcount > 0 || i.expiresAt < n && (n = i.expiresAt, t = r); t && (u(e.get(t)), e.delete(t)); } - function f(e, t = us) { + function f(e, t = ds) { e.expiresAt = Date.now() + t; } function p() { @@ -3539,7 +3539,7 @@ function gs() { r ? (r.hasError = !0, f(r)) : (e.size >= a() && d(), e.set(n, { blobUrl: null, refcount: 0, - expiresAt: Date.now() + ds, + expiresAt: Date.now() + fs, hasError: !0 }), p(), c()); } catch (e) { @@ -3573,7 +3573,7 @@ function gs() { return e.size >= a() && d(), e.set(r, { blobUrl: g, refcount: 1, - expiresAt: Date.now() + us, + expiresAt: Date.now() + ds, hasError: !1 }), p(), c(), g; } catch (e) { @@ -3585,7 +3585,7 @@ function gs() { let n = m(t); if (!n) return; let r = e.get(n); - r && (r.refcount = Math.max(0, r.refcount - 1), r.refcount <= 0 && f(r, ds)), l(), p(); + r && (r.refcount = Math.max(0, r.refcount - 1), r.refcount <= 0 && f(r, fs)), l(), p(); } catch (e) { console.debug?.(e); } @@ -3612,26 +3612,26 @@ function gs() { dispose: y }; } -function _s() { +function vs() { try { - if (window[cs]) return window[cs]; + if (window[ls]) return window[ls]; } catch (e) { console.debug?.(e); } try { - window[cs]?.dispose?.(); + window[ls]?.dispose?.(); } catch (e) { console.debug?.(e); } - let e = gs(); + let e = _s(); try { - window[cs] = e; + window[ls] = e; } catch (e) { console.debug?.(e); } return e; } -var vs = _s(), ys = ["title"], bs = /* @__PURE__ */ dr({ +var ys = vs(), bs = ["title"], xs = /* @__PURE__ */ fr({ __name: "RatingBadge", props: { rating: { type: [Number, String], @@ -3647,15 +3647,15 @@ var vs = _s(), ys = ["title"], bs = /* @__PURE__ */ dr({ key: 0, class: "mjr-rating-badge", title: i.value - }, [(q(!0), X(H, null, hr(n.value, (e) => (q(), X("span", { + }, [(q(!0), X(H, null, gr(n.value, (e) => (q(), X("span", { key: e, - style: xr({ + style: Sr({ color: "var(--mjr-rating-color, var(--mjr-star-active, #FFD45A))", marginRight: e < n.value ? "2px" : "0" }) - }, " ★ ", 4))), 128))], 8, ys)) : G("", !0); + }, " ★ ", 4))), 128))], 8, bs)) : G("", !0); } -}), xs = ["title"], Ss = /* @__PURE__ */ dr({ +}), Ss = ["title"], Cs = /* @__PURE__ */ fr({ __name: "TagsBadge", props: { tags: { type: [Array, String], @@ -3684,34 +3684,34 @@ var vs = _s(), ys = ["title"], bs = /* @__PURE__ */ dr({ class: "mjr-tags-badge", title: i.value, style: { color: "var(--mjr-tag-color, #90CAF9)" } - }, J(a.value), 9, xs)) : G("", !0); + }, J(a.value), 9, Ss)) : G("", !0); } -}), Cs = ["title"], ws = /* @__PURE__ */ dr({ +}), ws = ["title"], Ts = /* @__PURE__ */ fr({ __name: "GenTimeBadge", props: { genTimeMs: { default: 0 } }, setup(e) { - let t = e, n = K(() => bt(t.genTimeMs)), r = K(() => n.value > 0), i = K(() => Dt(n.value)), a = K(() => kt(n.value)); + let t = e, n = K(() => xt(t.genTimeMs)), r = K(() => n.value > 0), i = K(() => Ot(n.value)), a = K(() => At(n.value)); return (e, t) => r.value ? (q(), X("div", { key: 0, class: "mjr-gentime-badge", title: i.value.title, - style: xr({ color: a.value }) - }, J(i.value.text), 13, Cs)) : G("", !0); + style: Sr({ color: a.value }) + }, J(i.value.text), 13, ws)) : G("", !0); } -}), Ts = { +}), Es = { key: 0, class: "mjr-live-placeholder-wash", "aria-hidden": "true" -}, Es = ["title", "aria-label"], Ds = ["alt", "src"], Os = { class: "mjr-workflow-thumb-title" }, ks = { class: "mjr-workflow-thumb-meta" }, As = { key: 0 }, js = { key: 1 }, Ms = { key: 2 }, Ns = { +}, Ds = ["title", "aria-label"], Os = ["alt", "src"], ks = { class: "mjr-workflow-thumb-title" }, As = { class: "mjr-workflow-thumb-meta" }, js = { key: 0 }, Ms = { key: 1 }, Ns = { key: 2 }, Ps = { key: 3, class: "mjr-workflow-missing-chip" -}, Ps = ["alt", "src"], Fs = { +}, Fs = ["alt", "src"], Is = { key: 1, class: "mjr-media-error-placeholder" -}, Is = ["data-src", "poster"], Ls = ["src"], Rs = { class: "mjr-audio-thumb-head" }, zs = { class: "mjr-audio-thumb-kind" }, Bs = { +}, Ls = ["data-src", "poster"], Rs = ["src"], zs = { class: "mjr-audio-thumb-head" }, Bs = { class: "mjr-audio-thumb-kind" }, Vs = { class: "mjr-audio-thumb-waveform", "aria-hidden": "true" -}, Vs = { class: "mjr-audio-thumb-meta" }, Hs = { class: "mjr-audio-thumb-title" }, Us = { class: "mjr-audio-thumb-subtitle" }, Ws = ["src", "alt"], Gs = { +}, Hs = { class: "mjr-audio-thumb-meta" }, Us = { class: "mjr-audio-thumb-title" }, Ws = { class: "mjr-audio-thumb-subtitle" }, Gs = ["src", "alt"], Ks = { key: 1, class: "mjr-model3d-thumb-icon", style: { @@ -3722,23 +3722,23 @@ var vs = _s(), ys = ["title"], bs = /* @__PURE__ */ dr({ "justify-content": "center", color: "rgba(255,255,255,0.7)" } -}, Ks = [ +}, qs = [ "data-mjr-ext", "data-mjr-badge-bg", "title" -], qs = ["title"], Js = { +], Js = ["title"], Ys = { key: 7, class: "mjr-card-hover-info" -}, Ys = { +}, Xs = { key: 0, class: "mjr-hover-prompt" -}, Xs = { +}, Zs = { key: 1, class: "mjr-hover-prompt mjr-hover-workflow-notes" -}, Zs = { +}, Qs = { key: 2, class: "mjr-hover-gentime" -}, Qs = ["data-mjr-kind"], $s = ["title"], ec = { +}, $s = ["data-mjr-kind"], ec = ["title"], tc = { class: "mjr-card-meta-row", style: { "font-size": "0.85em", @@ -3749,7 +3749,7 @@ var vs = _s(), ys = ["title"], bs = /* @__PURE__ */ dr({ "text-overflow": "ellipsis", "padding-right": "16px" } -}, tc = ["title"], nc = ["title"], rc = ["title"], ic = { +}, nc = ["title"], rc = ["title"], ic = ["title"], ac = { key: 0, class: "mjr-meta-separator", "aria-hidden": "true", @@ -3757,7 +3757,7 @@ var vs = _s(), ys = ["title"], bs = /* @__PURE__ */ dr({ opacity: "0.55", margin: "0 3px" } -}, ac = ["title"], oc = { class: "mjr-stack-group-button-count" }, sc = { class: "mjr-dup-stack-count" }, cc = /* @__PURE__ */ dr({ +}, oc = ["title"], sc = { class: "mjr-stack-group-button-count" }, cc = { class: "mjr-dup-stack-count" }, lc = /* @__PURE__ */ fr({ __name: "AssetCardInner", props: { asset: {} }, emits: ["workflow-action"], @@ -3782,7 +3782,7 @@ var vs = _s(), ys = ["title"], bs = /* @__PURE__ */ dr({ async function i(e, t = {}) { if (!e) return null; try { - return vs.hasError(e) ? null : await vs.acquireUrl(e, t) || null; + return ys.hasError(e) ? null : await ys.acquireUrl(e, t) || null; } catch { return null; } @@ -3795,13 +3795,13 @@ var vs = _s(), ys = ["title"], bs = /* @__PURE__ */ dr({ let t = String(e.dataset?.src || "").trim(); if (!t || e.getAttribute("src")) return; let n = (Number(e._mjrVideoLoadRequestId || 0) || 0) + 1; - if (e._mjrVideoLoadRequestId = n, vs.hasError(t)) { + if (e._mjrVideoLoadRequestId = n, ys.hasError(t)) { e.src = t, e._mjrSourceKey = t; return; } - let r = await vs.acquireUrl(t); + let r = await ys.acquireUrl(t); if (e._mjrVideoLoadRequestId !== n || !e.isConnected) { - r && vs.releaseUrl(t); + r && ys.releaseUrl(t); return; } r ? (e.src = r, e._mjrCachedSrc = t, e._mjrSourceKey = t) : (e.src = t, e._mjrSourceKey = t), e.load?.(); @@ -3822,7 +3822,7 @@ var vs = _s(), ys = ["title"], bs = /* @__PURE__ */ dr({ } try { let t = String(e._mjrCachedSrc || "").trim(); - t && vs.releaseUrl(t), e._mjrCachedSrc = "", e._mjrSourceKey = ""; + t && ys.releaseUrl(t), e._mjrCachedSrc = "", e._mjrSourceKey = ""; } catch (e) { console.debug?.(e); } @@ -3893,7 +3893,7 @@ var vs = _s(), ys = ["title"], bs = /* @__PURE__ */ dr({ function f(e) { e && (u(e), s(e)); } - let p = e, m = t, h = K(() => String(p.asset.kind || "image").toLowerCase()), g = K(() => h.value === "workflow"), _ = K(() => h.value === "image"), v = K(() => h.value === "video"), y = K(() => h.value === "audio"), b = K(() => h.value === "model3d"), x = K(() => We(p.asset) || ""), S = K(() => String(p.asset.thumbnail_url || p.asset.graph_map_thumbnail_url || p.asset.thumb_url || p.asset.poster || "").trim()), C = K(() => !!String(p.asset.thumbnail_url || p.asset.thumb_url || p.asset.poster || "").trim()), w = K(() => g.value && !C.value && !!String(p.asset.graph_map_thumbnail_url || "").trim()), T = K(() => String(p.asset.preview_url || p.asset.previewUrl || p.asset.url || "").trim()), E = K(() => x.value), D = K(() => T.value || x.value), O = K(() => !v.value && !g.value ? "" : $e(p.asset, 384)), k = K(() => S.value || O.value), A = K(() => String(p.asset.filename || "")), j = K(() => String(p.asset.display_name || p.asset.displayName || p.asset.name || A.value || "").trim()), M = K(() => { + let p = e, m = t, h = K(() => String(p.asset.kind || "image").toLowerCase()), g = K(() => h.value === "workflow"), _ = K(() => h.value === "image"), v = K(() => h.value === "video"), y = K(() => h.value === "audio"), b = K(() => h.value === "model3d"), x = K(() => Ge(p.asset) || ""), S = K(() => String(p.asset.thumbnail_url || p.asset.graph_map_thumbnail_url || p.asset.thumb_url || p.asset.poster || "").trim()), C = K(() => !!String(p.asset.thumbnail_url || p.asset.thumb_url || p.asset.poster || "").trim()), w = K(() => g.value && !C.value && !!String(p.asset.graph_map_thumbnail_url || "").trim()), T = K(() => String(p.asset.preview_url || p.asset.previewUrl || p.asset.url || "").trim()), E = K(() => x.value), D = K(() => T.value || x.value), O = K(() => !v.value && !g.value ? "" : et(p.asset, 384)), k = K(() => S.value || O.value), A = K(() => String(p.asset.filename || "")), j = K(() => String(p.asset.display_name || p.asset.displayName || p.asset.name || A.value || "").trim()), M = K(() => { let e = A.value; return e.includes(".") ? e.split(".").pop().toUpperCase() : ""; }), N = K(() => { @@ -3904,15 +3904,15 @@ var vs = _s(), ys = ["title"], bs = /* @__PURE__ */ dr({ return t && e.push(`Subfolder: ${t}`), n && e.push(`Type: ${n}`), P.value && e.push(`Notes: ${P.value}`), e.filter(Boolean).join("\n"); }), ne = K(() => Number(p.asset.rating) || 0), re = K(() => p.asset.tags || []), ie = K(() => { let e = p.asset.generation_time_ms ?? p.asset.metadata?.generation_time_ms ?? 0; - return bt(e); - }), ae = K(() => ie.value > 0), oe = K(() => Dt(ie.value)), se = K(() => kt(ie.value)), L = K(() => String(p.asset.positive_prompt || "").trim()), ce = K(() => p.asset?._mjrLivePlaceholder === !0 || p.asset?.is_live_placeholder === !0 || String(p.asset?.id || "").trim().toLowerCase().startsWith("live:")), le = K(() => String(p.asset?._mjrLiveLabel || "In progress").trim() || "In progress"), ue = K(() => `${le.value}: waiting for indexed asset data`), de = K(() => { + return xt(e); + }), ae = K(() => ie.value > 0), oe = K(() => Ot(ie.value)), se = K(() => At(ie.value)), L = K(() => String(p.asset.positive_prompt || "").trim()), ce = K(() => p.asset?._mjrLivePlaceholder === !0 || p.asset?.is_live_placeholder === !0 || String(p.asset?.id || "").trim().toLowerCase().startsWith("live:")), le = K(() => String(p.asset?._mjrLiveLabel || "In progress").trim() || "In progress"), ue = K(() => `${le.value}: waiting for indexed asset data`), de = K(() => { let { width: e, height: t } = p.asset; return e && t ? `${e}x${t}` : ""; - }), fe = K(() => p.asset.duration ? Cn(p.asset.duration) : ""), pe = K(() => String(p.asset.task || p.asset.workflow_task || "").trim()), me = K(() => String(p.asset.model_family || p.asset.modelFamily || "").trim()), he = K(() => String(p.asset.runs_on || p.asset.runsOn || "").trim()), ge = K(() => Number(p.asset.node_count || p.asset.nodeCount || 0) || 0), _e = K(() => !!p.asset.favorite), ve = K(() => Number(p.asset.subgraph_count || p.asset.subgraphCount || 0) || 0), ye = K(() => Number(p.asset.missing_nodes_count || p.asset.missingNodesCount || 0) || 0), be = K(() => Number(p.asset.missing_models_count || p.asset.missingModelsCount || 0) || 0), xe = K(() => ye.value > 0 || be.value > 0), Se = K(() => { + }), fe = K(() => p.asset.duration ? wn(p.asset.duration) : ""), pe = K(() => String(p.asset.task || p.asset.workflow_task || "").trim()), me = K(() => String(p.asset.model_family || p.asset.modelFamily || "").trim()), he = K(() => String(p.asset.runs_on || p.asset.runsOn || "").trim()), ge = K(() => Number(p.asset.node_count || p.asset.nodeCount || 0) || 0), _e = K(() => !!p.asset.favorite), ve = K(() => Number(p.asset.subgraph_count || p.asset.subgraphCount || 0) || 0), ye = K(() => Number(p.asset.missing_nodes_count || p.asset.missingNodesCount || 0) || 0), be = K(() => Number(p.asset.missing_models_count || p.asset.missingModelsCount || 0) || 0), xe = K(() => ye.value > 0 || be.value > 0), Se = K(() => { if (!xe.value) return ""; let e = []; return ye.value > 0 && e.push(`${ye.value} node`), be.value > 0 && e.push(`${be.value} model`), `Missing: ${e.join(" / ")}`; - }), Ce = K(() => p.asset.generation_time || p.asset.file_creation_time || p.asset.mtime || p.asset.created_at), we = K(() => Ce.value ? zn(Ce.value) : ""), Te = K(() => Ce.value ? Mn(Ce.value) : ""), Ee = K(() => [ + }), Ce = K(() => p.asset.generation_time || p.asset.file_creation_time || p.asset.mtime || p.asset.created_at), we = K(() => Ce.value ? Bn(Ce.value) : ""), Te = K(() => Ce.value ? Nn(Ce.value) : ""), Ee = K(() => [ de.value ? { key: "resolution", className: "mjr-meta-res", @@ -3952,7 +3952,7 @@ var vs = _s(), ys = ["title"], bs = /* @__PURE__ */ dr({ video: "var(--mjr-badge-video, #F44336)", audio: "var(--mjr-badge-audio, #4CAF50)", model3d: "var(--mjr-badge-model3d, #9C27B0)" - }[h.value] || "var(--mjr-badge-image, #888)"), ke = sr("mjrStackService", null), Ae = K(() => !ke || !String(p.asset.stack_id || "").trim() ? !1 : Number(p.asset.stack_asset_count || p.asset._mjrFeedGroupCount || 0) > 1), je = K(() => Number(p.asset.stack_asset_count || p.asset._mjrFeedGroupCount || 0) || 0), Me = K(() => !!p.asset._mjrDupStack && Number(p.asset._mjrDupCount || 0) >= 2), Ne = K(() => Number(p.asset._mjrDupCount || 0) || 0), Pe = K(() => Me.value && !Ae.value), Fe = Q(!1), Ie = Q(!1); + }[h.value] || "var(--mjr-badge-image, #888)"), ke = cr("mjrStackService", null), Ae = K(() => !ke || !String(p.asset.stack_id || "").trim() ? !1 : Number(p.asset.stack_asset_count || p.asset._mjrFeedGroupCount || 0) > 1), je = K(() => Number(p.asset.stack_asset_count || p.asset._mjrFeedGroupCount || 0) || 0), Me = K(() => !!p.asset._mjrDupStack && Number(p.asset._mjrDupCount || 0) >= 2), Ne = K(() => Number(p.asset._mjrDupCount || 0) || 0), Pe = K(() => Me.value && !Ae.value), Fe = Q(!1), Ie = Q(!1); async function Le(e) { if (e.preventDefault(), e.stopPropagation(), !Fe.value) { Fe.value = !0; @@ -3977,22 +3977,22 @@ var vs = _s(), ys = ["title"], bs = /* @__PURE__ */ dr({ } } } - let ze = Q(null), Be = Q(null), Ve = Q(null), He = Q(null), Ue = Q(!1), Ge = Q(!1), Ke = Q(""), qe = 0, Je = "", Ye = "", Xe = ""; + let ze = Q(null), Be = Q(null), Ve = Q(null), He = Q(null), Ue = Q(!1), We = Q(!1), Ke = Q(""), qe = 0, Je = "", Ye = "", Xe = ""; function Ze() { try { - Je && vs.releaseUrl(Je); + Je && ys.releaseUrl(Je); } catch (e) { console.debug?.(e); } Je = ""; } - cr(() => g.value ? S.value : _.value ? E.value : "", (e) => { + lr(() => g.value ? S.value : _.value ? E.value : "", (e) => { let t = String(e || "").trim(); t && t !== Ye && (Ue.value = !1, Ye = ""); - }, { immediate: !0 }), cr(() => b.value ? k.value : "", (e) => { + }, { immediate: !0 }), lr(() => b.value ? k.value : "", (e) => { let t = String(e || "").trim(); - t && t !== Xe && (Ge.value = !1, Xe = ""); - }, { immediate: !0 }), cr(() => [_.value ? Ve.value : null, _.value ? E.value : ""], async ([e, t], n, r) => { + t && t !== Xe && (We.value = !1, Xe = ""); + }, { immediate: !0 }), lr(() => [_.value ? Ve.value : null, _.value ? E.value : ""], async ([e, t], n, r) => { if (!e || !t || Ue.value) return; let o = qe += 1, s = new AbortController(), c = !1; r(() => { @@ -4003,63 +4003,63 @@ var vs = _s(), ys = ["title"], bs = /* @__PURE__ */ dr({ if (Ke.value && n === t || (e.dataset.mjrSourceKey = t, await a(), c || o !== qe || !e.isConnected)) return; let r = await i(t, { signal: s.signal }); if (c || o !== qe || !e.isConnected) { - r && r !== t && vs.releaseUrl(t); + r && r !== t && ys.releaseUrl(t); return; } if (r && r !== Ke.value) { let e = Je; - Ke.value = r, Je = r === t ? "" : t, e && e !== Je && vs.releaseUrl(e); + Ke.value = r, Je = r === t ? "" : t, e && e !== Je && ys.releaseUrl(e); } else !r && Je && Je !== t && (Ze(), Ke.value = ""); } catch {} }, { immediate: !0 }); let Qe = Q(B.GRID_VIDEO_AUTOPLAY_MODE || "hover"); - function R() { + function $e() { Qe.value = B.GRID_VIDEO_AUTOPLAY_MODE || "hover"; } - jr(() => { - window.addEventListener("mjr-settings-changed", R); - }), cr(Be, (e, t) => { + Mr(() => { + window.addEventListener("mjr-settings-changed", $e); + }), lr(Be, (e, t) => { if (t) try { f(t); } catch {} if (e && ze.value) try { d(ze.value, e, Qe.value); } catch {} - }), cr(Qe, (e) => { + }), lr(Qe, (e) => { let t = Be.value, n = ze.value; t && n && d(n, t, e); - }), cr(D, (e, t) => { + }), lr(D, (e, t) => { if (e === t) return; let n = Be.value, r = ze.value; n && r && (f(n), d(r, n, Qe.value)); - }, { flush: "post" }), pr(() => { - window.removeEventListener("mjr-settings-changed", R), qe += 1, Ze(); + }, { flush: "post" }), mr(() => { + window.removeEventListener("mjr-settings-changed", $e), qe += 1, Ze(); let e = Be.value; if (e) try { f(e); } catch {} - }), rr(() => { - window.removeEventListener("mjr-settings-changed", R); - }), wr(() => { + }), ir(() => { + window.removeEventListener("mjr-settings-changed", $e); + }), Tr(() => { let e = He.value; if (!e) return; let t = p.asset; t?.has_workflow ?? t?.hasWorkflow, t?.has_generation_data ?? t?.hasGenerationData, t?.has_ai_info ?? t?.hasAiInfo ?? t?.ai_indexed, t?.has_ai_auto_tags ?? t?.hasAiAutoTags ?? t?.auto_tags ?? t?.autoTags, t?.has_ai_enhanced_caption ?? t?.hasAiEnhancedCaption ?? t?.enhanced_caption ?? t?.enhancedCaption, t?.has_ai_vector ?? t?.hasAiVector ?? t?.vector_indexed ?? t?.vectorIndexed; try { e.textContent = ""; - let n = Et(t); + let n = Dt(t); n && e.appendChild(n); } catch {} }); - function et(e) { + function R(e) { Ue.value = !0; try { let e = g.value ? S.value : E.value; - Ye = String(e || "").trim(), vs.markError(e); + Ye = String(e || "").trim(), ys.markError(e); } catch {} } function z() { - Ge.value = !0, Xe = String(k.value || "").trim(); + We.value = !0, Xe = String(k.value || "").trim(); } function tt(e) { if (!De.value) return; @@ -4088,46 +4088,46 @@ var vs = _s(), ys = ["title"], bs = /* @__PURE__ */ dr({ }); } return (t, n) => { - let r = ar("MButton"); + let r = or("MButton"); return q(), X(H, null, [ U("div", { - class: Er(["mjr-thumb", { "mjr-thumb-workflow": g.value }]), + class: Dr(["mjr-thumb", { "mjr-thumb-workflow": g.value }]), ref_key: "thumbRef", ref: ze }, [ - ce.value ? (q(), X("div", Ts)) : G("", !0), + ce.value ? (q(), X("div", Es)) : G("", !0), g.value ? (q(), X(H, { key: 1 }, [ U("div", { class: "mjr-workflow-card-actions", - onClick: n[1] ||= mr(() => {}, ["stop"]), - onDblclick: n[2] ||= mr(() => {}, ["stop"]) + onClick: n[1] ||= hr(() => {}, ["stop"]), + onDblclick: n[2] ||= hr(() => {}, ["stop"]) }, [U("button", { type: "button", - class: Er(["mjr-workflow-action-btn", { "is-active": _e.value }]), + class: Dr(["mjr-workflow-action-btn", { "is-active": _e.value }]), title: _e.value ? "Remove favorite" : "Add favorite", "aria-label": _e.value ? "Remove favorite" : "Add favorite", onClick: n[0] ||= (e) => nt("favorite", e) - }, [U("i", { class: Er(_e.value ? "pi pi-star-fill" : "pi pi-star") }, null, 2)], 10, Es)], 32), + }, [U("i", { class: Dr(_e.value ? "pi pi-star-fill" : "pi pi-star") }, null, 2)], 10, Ds)], 32), k.value && !Ue.value ? (q(), X("img", { key: 0, - class: Er(["mjr-thumb-media", { "mjr-workflow-graph-map-preview": w.value }]), + class: Dr(["mjr-thumb-media", { "mjr-workflow-graph-map-preview": w.value }]), alt: A.value, decoding: "async", loading: "lazy", src: k.value, - onError: et - }, null, 42, Ds)) : G("", !0), - U("div", { class: Er(["mjr-workflow-thumb", { + onError: R + }, null, 42, Os)) : G("", !0), + U("div", { class: Dr(["mjr-workflow-thumb", { "has-thumbnail": k.value && !Ue.value, "has-graph-map": w.value && !Ue.value }]) }, [ n[15] ||= U("i", { class: "pi pi-sitemap" }, null, -1), - U("div", Os, J(pe.value || "Workflow"), 1), - U("div", ks, [ - me.value ? (q(), X("span", As, J(me.value), 1)) : G("", !0), - he.value ? (q(), X("span", js, J(he.value), 1)) : G("", !0), - ge.value ? (q(), X("span", Ms, J(ge.value) + " nodes", 1)) : G("", !0), - xe.value ? (q(), X("span", Ns, J(Se.value), 1)) : G("", !0) + U("div", ks, J(pe.value || "Workflow"), 1), + U("div", As, [ + me.value ? (q(), X("span", js, J(me.value), 1)) : G("", !0), + he.value ? (q(), X("span", Ms, J(he.value), 1)) : G("", !0), + ge.value ? (q(), X("span", Ns, J(ge.value) + " nodes", 1)) : G("", !0), + xe.value ? (q(), X("span", Ps, J(Se.value), 1)) : G("", !0) ]) ], 2) ], 64)) : _.value ? (q(), X(H, { key: 2 }, [Ue.value ? G("", !0) : (q(), X("img", { @@ -4139,8 +4139,8 @@ var vs = _s(), ys = ["title"], bs = /* @__PURE__ */ dr({ decoding: "async", loading: "lazy", src: Ke.value || E.value || void 0, - onError: et - }, null, 40, Ps)), Ue.value ? (q(), X("div", Fs, [...n[16] ||= [U("i", { class: "pi pi-image" }, null, -1)]])) : G("", !0)], 64)) : v.value ? (q(), X(H, { key: 3 }, [U("video", { + onError: R + }, null, 40, Fs)), Ue.value ? (q(), X("div", Is, [...n[16] ||= [U("i", { class: "pi pi-image" }, null, -1)]])) : G("", !0)], 64)) : v.value ? (q(), X(H, { key: 3 }, [U("video", { ref_key: "videoRef", ref: Be, class: "mjr-thumb-media", @@ -4154,30 +4154,30 @@ var vs = _s(), ys = ["title"], bs = /* @__PURE__ */ dr({ draggable: !1, tabindex: -1, style: { "pointer-events": "none" } - }, null, 8, Is), n[17] ||= U("div", { class: "mjr-thumb-play" }, [U("i", { class: "pi pi-play" })], -1)], 64)) : y.value ? (q(), X(H, { key: 4 }, [k.value ? (q(), X("img", { + }, null, 8, Ls), n[17] ||= U("div", { class: "mjr-thumb-play" }, [U("i", { class: "pi pi-play" })], -1)], 64)) : y.value ? (q(), X(H, { key: 4 }, [k.value ? (q(), X("img", { key: 0, class: "mjr-thumb-media", src: k.value, draggable: !1, alt: "" - }, null, 8, Ls)) : G("", !0), U("div", { class: Er(["mjr-audio-thumb", { "has-poster": k.value }]) }, [ - U("div", Rs, [n[18] ||= U("span", { class: "mjr-audio-thumb-icon" }, [U("i", { class: "pi pi-volume-up" })], -1), U("span", zs, J(M.value || "AUDIO"), 1)]), - U("div", Bs, [(q(!0), X(H, null, hr(ee.value, (e, t) => (q(), X("span", { + }, null, 8, Rs)) : G("", !0), U("div", { class: Dr(["mjr-audio-thumb", { "has-poster": k.value }]) }, [ + U("div", zs, [n[18] ||= U("span", { class: "mjr-audio-thumb-icon" }, [U("i", { class: "pi pi-volume-up" })], -1), U("span", Bs, J(M.value || "AUDIO"), 1)]), + U("div", Vs, [(q(!0), X(H, null, gr(ee.value, (e, t) => (q(), X("span", { key: t, - style: xr({ + style: Sr({ height: `${e.height}%`, opacity: e.opacity }) }, null, 4))), 128))]), - U("div", Vs, [U("span", Hs, J(te.value), 1), U("span", Us, J(F.value), 1)]) - ], 2)], 64)) : b.value ? (q(), X(H, { key: 5 }, [k.value && !Ge.value ? (q(), X("img", { + U("div", Hs, [U("span", Us, J(te.value), 1), U("span", Ws, J(F.value), 1)]) + ], 2)], 64)) : b.value ? (q(), X(H, { key: 5 }, [k.value && !We.value ? (q(), X("img", { key: 0, class: "mjr-thumb-media", src: k.value, draggable: !1, alt: A.value, onError: z - }, null, 40, Ws)) : (q(), X("div", Gs, [...n[19] ||= [U("i", { + }, null, 40, Gs)) : (q(), X("div", Ks, [...n[19] ||= [U("i", { class: "pi pi-box", style: { "font-size": "2.5rem" } }, null, -1)]]))], 64)) : G("", !0), @@ -4185,7 +4185,7 @@ var vs = _s(), ys = ["title"], bs = /* @__PURE__ */ dr({ class: "mjr-file-badge mjr-badge-ext", "data-mjr-ext": M.value, "data-mjr-badge-bg": Oe.value, - style: xr({ + style: Sr({ position: "absolute", top: "6px", left: "6px", @@ -4201,16 +4201,16 @@ var vs = _s(), ys = ["title"], bs = /* @__PURE__ */ dr({ }), title: De.value ? `${M.value} - duplicate filename (${e.asset._mjrNameCollisionCount || 2} files)` : `${M.value} file`, onClick: tt - }, J(M.value) + J(De.value ? "+" : ""), 13, Ks), - Y(bs, { + }, J(M.value) + J(De.value ? "+" : ""), 13, qs), + Y(xs, { rating: ne.value, class: "mjr-badge-rating" }, null, 8, ["rating"]), - Y(Ss, { + Y(Cs, { tags: re.value, class: "mjr-badge-tags" }, null, 8, ["tags"]), - Y(ws, { "gen-time-ms": ie.value }, null, 8, ["gen-time-ms"]), + Y(Ts, { "gen-time-ms": ie.value }, null, 8, ["gen-time-ms"]), ce.value ? (q(), X("div", { key: 6, class: "mjr-live-pill", @@ -4218,11 +4218,11 @@ var vs = _s(), ys = ["title"], bs = /* @__PURE__ */ dr({ }, [n[20] ||= U("span", { class: "mjr-live-pill-dot", "aria-hidden": "true" - }, null, -1), U("span", null, J(le.value), 1)], 8, qs)) : G("", !0), - L.value || g.value && P.value || ae.value ? (q(), X("div", Js, [ - L.value ? (q(), X("div", Ys, J(L.value), 1)) : G("", !0), - g.value && P.value ? (q(), X("div", Xs, J(P.value), 1)) : G("", !0), - ae.value ? (q(), X("div", Zs, "Time " + J(oe.value.text), 1)) : G("", !0) + }, null, -1), U("span", null, J(le.value), 1)], 8, Js)) : G("", !0), + L.value || g.value && P.value || ae.value ? (q(), X("div", Ys, [ + L.value ? (q(), X("div", Xs, J(L.value), 1)) : G("", !0), + g.value && P.value ? (q(), X("div", Zs, J(P.value), 1)) : G("", !0), + ae.value ? (q(), X("div", Qs, "Time " + J(oe.value.text), 1)) : G("", !0) ])) : G("", !0) ], 2), U("div", { @@ -4244,28 +4244,28 @@ var vs = _s(), ys = ["title"], bs = /* @__PURE__ */ dr({ "margin-bottom": "4px", "padding-right": "12px" } - }, J(N.value), 9, $s), - U("div", ec, [g.value ? (q(), X(H, { key: 0 }, [ + }, J(N.value), 9, ec), + U("div", tc, [g.value ? (q(), X(H, { key: 0 }, [ pe.value ? (q(), X("span", { key: 0, class: "mjr-meta-workflow-task", title: `Task: ${pe.value}` - }, J(pe.value), 9, tc)) : G("", !0), + }, J(pe.value), 9, nc)) : G("", !0), ve.value ? (q(), X("span", { key: 1, class: "mjr-meta-workflow-subgraphs", title: `${ve.value} subgraph${ve.value > 1 ? "s" : ""}` - }, J(ve.value) + " sub", 9, nc)) : G("", !0), + }, J(ve.value) + " sub", 9, rc)) : G("", !0), xe.value ? (q(), X("span", { key: 2, class: "mjr-meta-workflow-missing", title: Se.value - }, J(Se.value), 9, rc)) : G("", !0) - ], 64)) : G("", !0), (q(!0), X(H, null, hr(Ee.value, (e, t) => (q(), X(H, { key: e.key }, [t > 0 ? (q(), X("span", ic, "/")) : G("", !0), U("span", { - class: Er(e.className), - style: xr(e.style || null), + }, J(Se.value), 9, ic)) : G("", !0) + ], 64)) : G("", !0), (q(!0), X(H, null, gr(Ee.value, (e, t) => (q(), X(H, { key: e.key }, [t > 0 ? (q(), X("span", ac, "/")) : G("", !0), U("span", { + class: Dr(e.className), + style: Sr(e.style || null), title: e.title - }, J(e.text), 15, ac)], 64))), 128))]), + }, J(e.text), 15, oc)], 64))), 128))]), U("div", { ref_key: "dotWrapperRef", ref: He, @@ -4277,8 +4277,8 @@ var vs = _s(), ys = ["title"], bs = /* @__PURE__ */ dr({ "z-index": "2" } }, null, 512) - ], 8, Qs), - Ae.value ? (q(), ir(r, { + ], 8, $s), + Ae.value ? (q(), ar(r, { key: 0, type: "button", class: "mjr-stack-group-button", @@ -4290,14 +4290,14 @@ var vs = _s(), ys = ["title"], bs = /* @__PURE__ */ dr({ "aria-label": `Open generation group in grid (${je.value} assets)`, title: `Open generation group in grid (${je.value} assets)`, onClick: Le, - onPointerdown: n[3] ||= mr(() => {}, ["stop"]), - onMousedown: n[4] ||= mr(() => {}, ["stop", "prevent"]), - onTouchstartPassive: n[5] ||= mr(() => {}, ["stop"]), - onDblclick: n[6] ||= mr(() => {}, ["stop"]), - onKeydown: n[7] ||= mr(() => {}, ["stop"]), - onDragstart: n[8] ||= mr(() => {}, ["stop", "prevent"]) + onPointerdown: n[3] ||= hr(() => {}, ["stop"]), + onMousedown: n[4] ||= hr(() => {}, ["stop", "prevent"]), + onTouchstartPassive: n[5] ||= hr(() => {}, ["stop"]), + onDblclick: n[6] ||= hr(() => {}, ["stop"]), + onKeydown: n[7] ||= hr(() => {}, ["stop"]), + onDragstart: n[8] ||= hr(() => {}, ["stop", "prevent"]) }, { - default: W(() => [n[21] ||= U("span", { class: "pi pi-clone" }, null, -1), U("span", oc, J(je.value), 1)]), + default: W(() => [n[21] ||= U("span", { class: "pi pi-clone" }, null, -1), U("span", sc, J(je.value), 1)]), _: 1 }, 8, [ "disabled", @@ -4305,7 +4305,7 @@ var vs = _s(), ys = ["title"], bs = /* @__PURE__ */ dr({ "aria-label", "title" ])) : G("", !0), - Pe.value ? (q(), ir(r, { + Pe.value ? (q(), ar(r, { key: 1, type: "button", class: "mjr-dup-stack-button", @@ -4317,14 +4317,14 @@ var vs = _s(), ys = ["title"], bs = /* @__PURE__ */ dr({ "aria-label": `${Ne.value} duplicate${Ne.value > 1 ? "s" : ""} - click to compare all copies`, title: `${Ne.value} duplicate${Ne.value > 1 ? "s" : ""} - click to compare all copies`, onClick: Re, - onPointerdown: n[9] ||= mr(() => {}, ["stop"]), - onMousedown: n[10] ||= mr(() => {}, ["stop", "prevent"]), - onTouchstartPassive: n[11] ||= mr(() => {}, ["stop"]), - onDblclick: n[12] ||= mr(() => {}, ["stop"]), - onKeydown: n[13] ||= mr(() => {}, ["stop"]), - onDragstart: n[14] ||= mr(() => {}, ["stop", "prevent"]) + onPointerdown: n[9] ||= hr(() => {}, ["stop"]), + onMousedown: n[10] ||= hr(() => {}, ["stop", "prevent"]), + onTouchstartPassive: n[11] ||= hr(() => {}, ["stop"]), + onDblclick: n[12] ||= hr(() => {}, ["stop"]), + onKeydown: n[13] ||= hr(() => {}, ["stop"]), + onDragstart: n[14] ||= hr(() => {}, ["stop", "prevent"]) }, { - default: W(() => [n[22] ||= U("span", { class: "pi pi-copy" }, null, -1), U("span", sc, J(Ne.value), 1)]), + default: W(() => [n[22] ||= U("span", { class: "pi pi-copy" }, null, -1), U("span", cc, J(Ne.value), 1)]), _: 1 }, 8, [ "disabled", @@ -4335,23 +4335,23 @@ var vs = _s(), ys = ["title"], bs = /* @__PURE__ */ dr({ ], 64); }; } -}), lc = [ +}), uc = [ "data-mjr-asset-id", "data-mjr-filename-key", "data-mjr-stem", "aria-label", "aria-selected" -], uc = { +], dc = { class: "mjr-card-info mjr-card-meta", style: { padding: "6px 8px", "min-width": "0" } -}, dc = ["title"], fc = /*#__PURE__*/ ((e, t) => { +}, fc = ["title"], pc = /*#__PURE__*/ ((e, t) => { let n = e.__vccOpts || e; for (let [e, r] of t) n[e] = r; return n; -})(/* @__PURE__ */ dr({ +})(/* @__PURE__ */ fr({ __name: "FolderCard", props: { asset: {}, @@ -4381,16 +4381,16 @@ var vs = _s(), ys = ["title"], bs = /* @__PURE__ */ dr({ }); } return (t, n) => (q(), X("div", { - class: Er(["mjr-asset-card mjr-card mjr-folder-card", { + class: Dr(["mjr-asset-card mjr-card mjr-folder-card", { "is-selected": e.selected, "drop-active": i.value }]), role: "button", tabindex: 0, draggable: "true", - onDragover: mr(a, ["prevent"]), + onDragover: hr(a, ["prevent"]), onDragleave: o, - onDrop: mr(s, ["stop", "prevent"]), + onDrop: hr(s, ["stop", "prevent"]), "data-mjr-asset-id": String(e.asset.id ?? ""), "data-mjr-filename-key": String(e.asset.filename || "").toLowerCase(), "data-mjr-ext": "FOLDER", @@ -4416,7 +4416,7 @@ var vs = _s(), ys = ["title"], bs = /* @__PURE__ */ dr({ }), U("path", { fill: "#D9A730", d: "M20 6H4c-1.1 0-2 .9-2 2v10c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V8c0-1.1-.9-2-2-2z" - })])], -1), U("div", uc, [U("div", { + })])], -1), U("div", dc, [U("div", { class: "mjr-card-filename", title: e.asset.filename, style: { @@ -4425,15 +4425,15 @@ var vs = _s(), ys = ["title"], bs = /* @__PURE__ */ dr({ "white-space": "nowrap", "margin-bottom": "4px" } - }, J(e.asset.filename), 9, dc), n[0] ||= U("div", { class: "mjr-card-meta-row" }, null, -1)])], 42, lc)); + }, J(e.asset.filename), 9, fc), n[0] ||= U("div", { class: "mjr-card-meta-row" }, null, -1)])], 42, uc)); } }), [["__scopeId", "data-v-252fa951"]]); // ui/vue/composables/useGridState.ts -function pc(e) { +function mc(e) { return Array.from(e || []).map((e) => String(e || "").trim()).filter(Boolean); } -function mc() { - let e = Sr({ +function hc() { + let e = Cr({ query: "*", offset: 0, cursor: null, @@ -4462,7 +4462,7 @@ function mc() { e.virtualGrid = { setItems(t) { e.assets = Array.isArray(t) ? t.slice() : []; } }; - let t = K(() => new Set(pc(e.selectedIds))); + let t = K(() => new Set(mc(e.selectedIds))); function n(t = "", { error: n = !1 } = {}) { e.statusMessage = String(t || ""), e.statusError = !!n; } @@ -4482,14 +4482,14 @@ function mc() { e.query = String(t || "*") || "*", e.offset = 0, e.cursor = null, e.total = n == null ? null : Number(n) || 0, e.done = !!r, e.assets = [], o(); } function c(t, n = "", { preserveAnchor: r = !1 } = {}) { - let i = Array.from(new Set(pc(t))), a = String(n || i[0] || "").trim(); + let i = Array.from(new Set(mc(t))), a = String(n || i[0] || "").trim(); return e.selectedIds = i, e.activeId = a, r || (a ? e.selectionAnchorId = a : i.length || (e.selectionAnchorId = "")), { selectedIds: i, activeId: a }; } function l(t, { activeId: n = "" } = {}) { - let r = new Set(pc(t)), i = pc(e.selectedIds).filter((e) => r.has(e)), a = String(n || e.activeId || i[0] || "").trim(); + let r = new Set(mc(t)), i = mc(e.selectedIds).filter((e) => r.has(e)), a = String(n || e.activeId || i[0] || "").trim(); return c(i, r.has(a) ? a : i[0] || "", { preserveAnchor: !0 }); } function u() { @@ -4520,14 +4520,14 @@ function mc() { }; } // ui/vue/composables/gridVisibility.ts -function hc(e) { +function gc(e) { try { return typeof e?.getClientRects != "function" || e.getClientRects().length > 0; } catch (e) { return console.debug?.(e), !1; } } -function gc(e, { requireClientRect: t = !0 } = {}) { +function _c(e, { requireClientRect: t = !0 } = {}) { if (!e || typeof e != "object") return !1; try { if (typeof document < "u" && document.hidden) return !1; @@ -4552,14 +4552,14 @@ function gc(e, { requireClientRect: t = !0 } = {}) { } catch (e) { console.debug?.(e); } - return !t || hc(e); + return !t || gc(e); } -function _c(e) { - return gc(e, { requireClientRect: !0 }); +function vc(e) { + return _c(e, { requireClientRect: !0 }); } -function vc(e, t = null) { +function yc(e, t = null) { let n = t || e; - if (!_c(n) || e && e !== n && !gc(e, { requireClientRect: !1 })) return !1; + if (!vc(n) || e && e !== n && !_c(e, { requireClientRect: !1 })) return !1; try { let e = Number(n?.clientWidth || 0) || 0, t = Number(n?.clientHeight || 0) || 0; return e > 0 && t > 0; @@ -4568,50 +4568,50 @@ function vc(e, t = null) { } } // ui/vue/grid/useGridQuery.ts -function yc(e, t = "") { +function bc(e, t = "") { return String(e ?? t).trim() || String(t); } -function bc(e, t = 0) { +function xc(e, t = 0) { let n = Number(e); return Number.isFinite(n) ? n : t; } -function xc(e) { +function Sc(e) { return e === !0 || e === 1 || String(e || "") === "1"; } -function Sc(e = {}) { - let t = yc(e.q ?? e.query, "*") || "*", n = Object.prototype.hasOwnProperty.call(e, "resolutionCompare") ? String(e.resolutionCompare ?? "").trim().toLowerCase() : "gte", r = n === "lte" ? "lte" : n ? "gte" : ""; +function Cc(e = {}) { + let t = bc(e.q ?? e.query, "*") || "*", n = Object.prototype.hasOwnProperty.call(e, "resolutionCompare") ? String(e.resolutionCompare ?? "").trim().toLowerCase() : "gte", r = n === "lte" ? "lte" : n ? "gte" : ""; return Object.freeze({ - scope: yc(e.scope, "output").toLowerCase(), + scope: bc(e.scope, "output").toLowerCase(), q: t, query: t, - customRootId: yc(e.customRootId), - subfolder: yc(e.subfolder), - collectionId: yc(e.collectionId), - viewScope: yc(e.viewScope), - kind: yc(e.kind).toLowerCase(), - workflowOnly: xc(e.workflowOnly), - minRating: bc(e.minRating, 0), - minSizeMB: bc(e.minSizeMB, 0), - maxSizeMB: bc(e.maxSizeMB, 0), + customRootId: bc(e.customRootId), + subfolder: bc(e.subfolder), + collectionId: bc(e.collectionId), + viewScope: bc(e.viewScope), + kind: bc(e.kind).toLowerCase(), + workflowOnly: Sc(e.workflowOnly), + minRating: xc(e.minRating, 0), + minSizeMB: xc(e.minSizeMB, 0), + maxSizeMB: xc(e.maxSizeMB, 0), resolutionCompare: r, - minWidth: bc(e.minWidth, 0), - minHeight: bc(e.minHeight, 0), - maxWidth: bc(e.maxWidth, 0), - maxHeight: bc(e.maxHeight, 0), - workflowType: yc(e.workflowType).toUpperCase(), - workflowId: yc(e.workflowId), - workflowModel: yc(e.workflowModel), - workflowRunsOn: yc(e.workflowRunsOn).toLowerCase(), - dateRange: yc(e.dateRange).toLowerCase(), - dateExact: yc(e.dateExact), - metadataSearchMode: yc(e.metadataSearchMode), - sort: yc(e.sort, "mtime_desc").toLowerCase(), - semanticMode: e.semanticMode === void 0 || e.semanticMode === null ? void 0 : xc(e.semanticMode), - groupStacks: e.groupStacks === void 0 || e.groupStacks === null ? void 0 : xc(e.groupStacks) + minWidth: xc(e.minWidth, 0), + minHeight: xc(e.minHeight, 0), + maxWidth: xc(e.maxWidth, 0), + maxHeight: xc(e.maxHeight, 0), + workflowType: bc(e.workflowType).toUpperCase(), + workflowId: bc(e.workflowId), + workflowModel: bc(e.workflowModel), + workflowRunsOn: bc(e.workflowRunsOn).toLowerCase(), + dateRange: bc(e.dateRange).toLowerCase(), + dateExact: bc(e.dateExact), + metadataSearchMode: bc(e.metadataSearchMode), + sort: bc(e.sort, "mtime_desc").toLowerCase(), + semanticMode: e.semanticMode === void 0 || e.semanticMode === null ? void 0 : Sc(e.semanticMode), + groupStacks: e.groupStacks === void 0 || e.groupStacks === null ? void 0 : Sc(e.groupStacks) }); } -function Cc(e = {}, t = {}) { - return Sc({ +function wc(e = {}, t = {}) { + return Cc({ scope: e.mjrScope, q: e.mjrQuery, customRootId: e.mjrCustomRootId, @@ -4641,16 +4641,16 @@ function Cc(e = {}, t = {}) { ...t }); } -function wc(e = null, t = "*") { +function Tc(e = null, t = "*") { let n = e?.dataset || {}; - return Cc(n, { q: n.mjrQuery ?? t }).q; + return wc(n, { q: n.mjrQuery ?? t }).q; } -function Tc(e = null, t = "mtime_desc") { +function Ec(e = null, t = "mtime_desc") { let n = e?.dataset || {}; - return Cc(n, { sort: n.mjrSort ?? t }).sort; + return wc(n, { sort: n.mjrSort ?? t }).sort; } -function Ec(e = {}) { - let t = Sc(e); +function Dc(e = {}) { + let t = Cc(e); return [ t.scope, t.q, @@ -4676,30 +4676,30 @@ function Ec(e = {}) { t.dateExact ].join("|"); } -function Dc(e = {}) { - let t = Sc(e), n = t.viewScope && t.viewScope !== t.scope ? t.viewScope : ""; +function Oc(e = {}) { + let t = Cc(e), n = t.viewScope && t.viewScope !== t.scope ? t.viewScope : ""; return !!(t.subfolder || t.customRootId || t.collectionId || n || t.kind || t.workflowOnly || t.minRating > 0 || t.minSizeMB > 0 || t.maxSizeMB > 0 || t.minWidth > 0 || t.minHeight > 0 || t.maxWidth > 0 || t.maxHeight > 0 || t.workflowType || t.workflowId || t.workflowModel || t.workflowRunsOn || t.dateRange || t.dateExact); } -function Oc(e = {}) { - let t = Sc(e); - return t.scope === "output" && t.q === "*" && t.sort === "mtime_desc" && !Dc(t); +function kc(e = {}) { + let t = Cc(e); + return t.scope === "output" && t.q === "*" && t.sort === "mtime_desc" && !Oc(t); } // ui/features/grid/PersistentAssetCache.ts -var kc = "mjr-asset-cache", Ac = 1, jc = "snapshots", Mc = 24, Nc = 500, Pc = 27e5, Fc = null; -function Ic() { - return Fc || (Fc = new Promise((e) => { +var Ac = "mjr-asset-cache", jc = 1, Mc = "snapshots", Nc = 24, Pc = 500, Fc = 27e5, Ic = null; +function Lc() { + return Ic || (Ic = new Promise((e) => { try { - let t = indexedDB.open(kc, Ac); + let t = indexedDB.open(Ac, jc); t.onupgradeneeded = () => { let e = t.result; - e.objectStoreNames.contains(jc) || e.createObjectStore(jc, { keyPath: "key" }); + e.objectStoreNames.contains(Mc) || e.createObjectStore(Mc, { keyPath: "key" }); }, t.onsuccess = () => e(t.result), t.onerror = () => e(null); } catch { e(null); } - }), Fc); + }), Ic); } -function Lc(e) { +function Rc(e) { return !e || typeof e != "object" ? null : { id: e.id, filename: e.filename, @@ -4724,39 +4724,39 @@ function Lc(e) { positive_prompt: e.positive_prompt }; } -function Rc(e) { +function zc(e) { if (!e || typeof e != "object") return null; let t = Number(e.at || 0); - if (!t || Date.now() - t > Pc) return null; - let n = Array.isArray(e.assets) ? e.assets.map(Lc).filter(Boolean) : []; + if (!t || Date.now() - t > Fc) return null; + let n = Array.isArray(e.assets) ? e.assets.map(Rc).filter(Boolean) : []; return n.length ? { ...e, assets: n } : null; } -async function zc(e) { - let t = await Ic(); +async function Bc(e) { + let t = await Lc(); if (!t) return null; try { - return t.transaction(jc, e).objectStore(jc); + return t.transaction(Mc, e).objectStore(Mc); } catch { return null; } } -var Bc = { +var Vc = { async get(e) { - let t = await zc("readonly"); + let t = await Bc("readonly"); return !t || !e ? null : await new Promise((n) => { let r = t.get(e); - r.onsuccess = () => n(Rc(r.result)), r.onerror = () => n(null); + r.onsuccess = () => n(zc(r.result)), r.onerror = () => n(null); }); }, async put(e, t) { - let n = await zc("readwrite"), r = Rc({ + let n = await Bc("readwrite"), r = zc({ ...t, key: e, at: t?.at || Date.now(), - assets: Array.isArray(t?.assets) ? t.assets.slice(0, Nc) : [] + assets: Array.isArray(t?.assets) ? t.assets.slice(0, Pc) : [] }); return !n || !e || !r ? !1 : (await new Promise((e) => { let t = n.put(r); @@ -4764,7 +4764,7 @@ var Bc = { }), this.prune(), !0); }, async prune() { - let e = await zc("readwrite"); + let e = await Bc("readwrite"); if (!e) return; let t = await new Promise((t) => { let n = [], r = e.openCursor(); @@ -4773,175 +4773,175 @@ var Bc = { if (!e) return t(n); n.push(e.value), e.continue(); }, r.onerror = () => t(n); - }), n = t.filter((e) => !Rc(e)).map((e) => e.key), r = t.filter((e) => !n.includes(e.key)).sort((e, t) => Number(e.at || 0) - Number(t.at || 0)).slice(0, Math.max(0, t.length - Mc)).map((e) => e.key); + }), n = t.filter((e) => !zc(e)).map((e) => e.key), r = t.filter((e) => !n.includes(e.key)).sort((e, t) => Number(e.at || 0) - Number(t.at || 0)).slice(0, Math.max(0, t.length - Nc)).map((e) => e.key); for (let t of [...n, ...r]) e.delete(t); } -}, Vc = /* @__PURE__ */ new Map(), Hc = !0, Uc = 8, Wc = 200, Gc = "mjr_grid_snapshot_cache_v2", Kc = 18e5, qc = 1500, Jc = !1, Yc = null, Xc = !1; -function Zc() { - return Hc; -} +}, Hc = /* @__PURE__ */ new Map(), Uc = !0, Wc = 8, Gc = 200, Kc = "mjr_grid_snapshot_cache_v2", qc = 18e5, Jc = 1500, Yc = !1, Xc = null, Zc = !1; function Qc() { + return Uc; +} +function $c() { try { - Vc.clear(), il()?.removeItem?.(Gc), globalThis?.sessionStorage?.removeItem?.(Gc); + Hc.clear(), al()?.removeItem?.(Kc), globalThis?.sessionStorage?.removeItem?.(Kc); } catch (e) { console.debug?.(e); } } -var $c = /* @__PURE__ */ "id.filename.name.display_name.filepath.path.fullpath.full_path.file_info.subfolder.source.type.root_id.custom_root_id.kind.ext.size.mtime.generation_time.file_creation_time.created_at.updated_at.indexed_at.width.height.duration.thumbnail_url.thumb_url.preview_url.poster.url.rating.tags.has_workflow.hasWorkflow.has_generation_data.hasGenerationData.workflow_type.workflowType.workflow_id.workflowId.generation_time_ms.positive_prompt.enhanced_caption.auto_tags.has_ai_info.has_ai_vector.has_ai_auto_tags.has_ai_enhanced_caption.job_id.stack_id.source_node_id.source_node_type.date.date_exact".split("."); -function el(e, t = "") { +var el = /* @__PURE__ */ "id.filename.name.display_name.filepath.path.fullpath.full_path.file_info.subfolder.source.type.root_id.custom_root_id.kind.ext.size.mtime.generation_time.file_creation_time.created_at.updated_at.indexed_at.width.height.duration.thumbnail_url.thumb_url.preview_url.poster.url.rating.tags.has_workflow.hasWorkflow.has_generation_data.hasGenerationData.workflow_type.workflowType.workflow_id.workflowId.generation_time_ms.positive_prompt.enhanced_caption.auto_tags.has_ai_info.has_ai_vector.has_ai_auto_tags.has_ai_enhanced_caption.job_id.stack_id.source_node_id.source_node_type.date.date_exact".split("."); +function tl(e, t = "") { try { return String(e ?? t).trim(); } catch { return String(t); } } -function tl(e = {}) { +function nl(e = {}) { return JSON.stringify({ - scope: el(e.scope || "output", "output"), - query: el(e.query || e.q || "*", "*"), - customRootId: el(e.customRootId || ""), - subfolder: el(e.subfolder || ""), - collectionId: el(e.collectionId || ""), - viewScope: el(e.viewScope || ""), - kind: el(e.kind || ""), - workflowOnly: el(e.workflowOnly ? "1" : ""), - minRating: el(e.minRating || ""), - minSizeMB: el(e.minSizeMB || ""), - maxSizeMB: el(e.maxSizeMB || ""), - resolutionCompare: el(e.resolutionCompare || ""), - minWidth: el(e.minWidth || ""), - minHeight: el(e.minHeight || ""), - maxWidth: el(e.maxWidth || ""), - maxHeight: el(e.maxHeight || ""), - workflowType: el(e.workflowType || "").toUpperCase(), - workflowId: el(e.workflowId || ""), - workflowModel: el(e.workflowModel || ""), - workflowRunsOn: el(e.workflowRunsOn || "").toLowerCase(), - dateRange: el(e.dateRange || ""), - dateExact: el(e.dateExact || ""), - sort: el(e.sort || "mtime_desc", "mtime_desc"), - semanticMode: el(e.semanticMode ? "1" : "") + scope: tl(e.scope || "output", "output"), + query: tl(e.query || e.q || "*", "*"), + customRootId: tl(e.customRootId || ""), + subfolder: tl(e.subfolder || ""), + collectionId: tl(e.collectionId || ""), + viewScope: tl(e.viewScope || ""), + kind: tl(e.kind || ""), + workflowOnly: tl(e.workflowOnly ? "1" : ""), + minRating: tl(e.minRating || ""), + minSizeMB: tl(e.minSizeMB || ""), + maxSizeMB: tl(e.maxSizeMB || ""), + resolutionCompare: tl(e.resolutionCompare || ""), + minWidth: tl(e.minWidth || ""), + minHeight: tl(e.minHeight || ""), + maxWidth: tl(e.maxWidth || ""), + maxHeight: tl(e.maxHeight || ""), + workflowType: tl(e.workflowType || "").toUpperCase(), + workflowId: tl(e.workflowId || ""), + workflowModel: tl(e.workflowModel || ""), + workflowRunsOn: tl(e.workflowRunsOn || "").toLowerCase(), + dateRange: tl(e.dateRange || ""), + dateExact: tl(e.dateExact || ""), + sort: tl(e.sort || "mtime_desc", "mtime_desc"), + semanticMode: tl(e.semanticMode ? "1" : "") }); } -function nl(e) { - if (!e || typeof e != "object") return null; - let t = {}; - for (let n of $c) e[n] !== void 0 && (t[n] = e[n]); - return !t.type && t.source && (t.type = t.source), !t.source && t.type && (t.source = t.type), t.kind ||= e.kind || "image", Array.isArray(t.tags) && (t.tags = t.tags.slice(0, 80)), Array.isArray(t.auto_tags) && (t.auto_tags = t.auto_tags.slice(0, 80)), t; -} function rl(e) { + if (!e || typeof e != "object") return null; + let t = {}; + for (let n of el) e[n] !== void 0 && (t[n] = e[n]); + return !t.type && t.source && (t.type = t.source), !t.source && t.type && (t.source = t.type), t.kind ||= e.kind || "image", Array.isArray(t.tags) && (t.tags = t.tags.slice(0, 80)), Array.isArray(t.auto_tags) && (t.auto_tags = t.auto_tags.slice(0, 80)), t; +} +function il(e) { if (!e || typeof e != "object") return null; let t = Number(e.at || 0) || 0; - if (!t || Date.now() - t > Kc) return null; - let n = Array.isArray(e.assets) ? e.assets.map(nl).filter(Boolean) : []; + if (!t || Date.now() - t > qc) return null; + let n = Array.isArray(e.assets) ? e.assets.map(rl).filter(Boolean) : []; if (!n.length) return null; let r = Number(e.total ?? n.length), i = Number(e.offset ?? n.length); return { assets: n, - title: el(e.title || "Cached", "Cached"), + title: tl(e.title || "Cached", "Cached"), at: t, total: Number.isFinite(r) ? Math.max(0, r) : n.length, offset: Number.isFinite(i) ? Math.max(n.length, i) : n.length, done: !!e.done, - query: el(e.query || "*", "*") + query: tl(e.query || "*", "*") }; } -function il() { +function al() { try { return globalThis?.localStorage || null; } catch { return null; } } -Zc() || Qc(); -function al(e) { +Qc() || $c(); +function ol(e) { try { let t = globalThis?.sessionStorage; if (!t || !e) return; - let n = t.getItem?.(Gc); + let n = t.getItem?.(Kc); if (!n) return; - e.getItem?.(Gc) || e.setItem(Gc, n), t.removeItem(Gc); + e.getItem?.(Kc) || e.setItem(Kc, n), t.removeItem(Kc); } catch (e) { console.debug?.(e); } } -function ol() { +function sl() { let e = Date.now(); - for (let [t, n] of Vc.entries()) { + for (let [t, n] of Hc.entries()) { let r = Number(n?.at || 0) || 0; - (!r || e - r > Kc) && Vc.delete(t); + (!r || e - r > qc) && Hc.delete(t); } - for (; Vc.size > Uc;) { - let e = Vc.keys().next().value; + for (; Hc.size > Wc;) { + let e = Hc.keys().next().value; if (!e) break; - Vc.delete(e); + Hc.delete(e); } } -function sl() { - if (!Zc()) Jc = !0, Qc(); - else if (!Jc) { - Jc = !0; +function cl() { + if (!Qc()) Yc = !0, $c(); + else if (!Yc) { + Yc = !0; try { - let e = il(); - al(e); - let t = e?.getItem?.(Gc); + let e = al(); + ol(e); + let t = e?.getItem?.(Kc); if (!t) return; let n = JSON.parse(t), r = Array.isArray(n?.entries) ? n.entries : []; for (let e of r) { if (!Array.isArray(e) || e.length < 2) continue; - let t = String(e[0] || ""), n = rl(e[1]); - t && n && Vc.set(t, n); + let t = String(e[0] || ""), n = il(e[1]); + t && n && Hc.set(t, n); } - ol(); + sl(); } catch (e) { console.debug?.(e); } } } -function cl() { - if (!Zc()) Qc(); +function ll() { + if (!Qc()) $c(); else try { - ol(); - let e = il(); + sl(); + let e = al(); if (!e) return; - let t = Array.from(Vc.entries()).map(([e, t]) => [e, { + let t = Array.from(Hc.entries()).map(([e, t]) => [e, { ...t, - assets: Array.isArray(t?.assets) ? t.assets.slice(0, Wc) : [] + assets: Array.isArray(t?.assets) ? t.assets.slice(0, Gc) : [] }]); - e.setItem(Gc, JSON.stringify({ entries: t })); + e.setItem(Kc, JSON.stringify({ entries: t })); } catch (e) { console.debug?.(e); } } -function ll() { - Zc() ? (Xc = !0, !Yc && (Yc = setTimeout(() => { - Yc = null, Xc && (Xc = !1, cl()); - }, qc))) : (Qc(), Xc = !1); -} function ul() { - Yc &&= (clearTimeout(Yc), null), Xc && (Xc = !1, cl()); + Qc() ? (Zc = !0, !Xc && (Xc = setTimeout(() => { + Xc = null, Zc && (Zc = !1, ll()); + }, Jc))) : ($c(), Zc = !1); } -function dl(e) { - if (!Zc()) return null; - sl(); - let t = rl(Vc.get(e)); - return t ? (Vc.delete(e), Vc.set(e, t), ll(), t) : (Vc.delete(e), ll(), null); +function dl() { + Xc &&= (clearTimeout(Xc), null), Zc && (Zc = !1, ll()); } function fl(e) { - return Zc() ? (sl(), !!rl(Vc.get(e))) : !1; + if (!Qc()) return null; + cl(); + let t = il(Hc.get(e)); + return t ? (Hc.delete(e), Hc.set(e, t), ul(), t) : (Hc.delete(e), ul(), null); } -function pl(e, t) { - if (!Zc() || !e || !t || typeof t != "object") return !1; - let n = rl({ +function pl(e) { + return Qc() ? (cl(), !!il(Hc.get(e))) : !1; +} +function ml(e, t) { + if (!Qc() || !e || !t || typeof t != "object") return !1; + let n = il({ ...t, at: t.at || Date.now() }); - return n ? (Vc.delete(e), Vc.set(e, n), ll(), Bc.put(String(e || ""), n).catch((e) => { + return n ? (Hc.delete(e), Hc.set(e, n), ul(), Vc.put(String(e || ""), n).catch((e) => { console.debug?.(e); }), !0) : !1; } // ui/vue/grid/useAssetCollection.ts -function ml(e) { +function hl(e) { return !e || typeof e != "object" ? "" : [ e.source || e.type || "output", e.root_id || e.custom_root_id || "", @@ -4949,7 +4949,7 @@ function ml(e) { e.filename || e.filepath || e.path || e.fullpath || e.full_path || "" ].join("|").trim().toLowerCase(); } -function hl(e = [], { assetKey: t = ml } = {}) { +function gl(e = [], { assetKey: t = hl } = {}) { let n = /* @__PURE__ */ new Map(), r = /* @__PURE__ */ new Map(); for (let i of Array.isArray(e) ? e : []) { if (!i || typeof i != "object") continue; @@ -4961,12 +4961,12 @@ function hl(e = [], { assetKey: t = ml } = {}) { byKey: r }; } -function gl(e, { assetKey: t = ml } = {}) { +function _l(e, { assetKey: t = hl } = {}) { if (!e || typeof e != "object") return e; - let n = hl(Array.isArray(e.assets) ? e.assets : [], { assetKey: t }); + let n = gl(Array.isArray(e.assets) ? e.assets : [], { assetKey: t }); return e.assetIdSet = new Set(n.byId.keys()), e.seenKeys = new Set(n.byKey.keys()), e; } -function _l(e, t = [], { assetKey: n = ml } = {}) { +function vl(e, t = [], { assetKey: n = hl } = {}) { if (!e || typeof e != "object") return 0; let r = new Set((Array.isArray(t) ? t : [t]).map((e) => e == null ? "" : typeof e == "object" && e?.id != null ? String(e.id) : String(e)).map((e) => e.trim()).filter(Boolean)); if (!r.size) return 0; @@ -4974,10 +4974,10 @@ function _l(e, t = [], { assetKey: n = ml } = {}) { return e.assets = (Array.isArray(e.assets) ? e.assets : []).filter((e) => { let t = e?.id == null ? "" : String(e.id); return !t || !r.has(t) || (i += 1, !1); - }), i > 0 && gl(e, { assetKey: n }), i; + }), i > 0 && _l(e, { assetKey: n }), i; } // ui/vue/grid/usePagedAssets.ts -function vl({ assets: e = [], count: t = null, limit: n = 0, offset: r = 0, total: i = null } = {}) { +function yl({ assets: e = [], count: t = null, limit: n = 0, offset: r = 0, total: i = null } = {}) { let a = Array.isArray(e) ? e.length : 0, o = t == null ? a : Math.max(0, Number(t) || 0); if (o <= 0) return 0; let s = Math.max(0, Number(n) || 0), c = Math.max(0, Number(r) || 0), l = i == null ? null : Math.max(0, Number(i) || 0), u = l == null ? null : Math.max(0, l - c); @@ -4986,7 +4986,7 @@ function vl({ assets: e = [], count: t = null, limit: n = 0, offset: r = 0, tota let d = Math.min(s, u ?? 0); return d <= 0 ? o : Math.max(o, d); } -async function yl({ fetchPage: e, applyPage: t, getLimit: n, canContinue: r = null, beforeApplyPage: i = null, onEmptyPage: a = null, maxEmptyPages: o = 6 } = {}) { +async function bl({ fetchPage: e, applyPage: t, getLimit: n, canContinue: r = null, beforeApplyPage: i = null, onEmptyPage: a = null, maxEmptyPages: o = 6 } = {}) { if (typeof e != "function" || typeof t != "function") return { ok: !1, error: /* @__PURE__ */ Error("fetchPage and applyPage are required") @@ -5042,8 +5042,8 @@ async function yl({ fetchPage: e, applyPage: t, getLimit: n, canContinue: r = nu lastResult: l }; } -function bl({ query: e, collection: t, fetchPage: n, pageSize: r = 80, getPageSize: i = null } = {}) { - let a = Cr({ +function xl({ query: e, collection: t, fetchPage: n, pageSize: r = 80, getPageSize: i = null } = {}) { + let a = wr({ offset: 0, cursor: null, total: null, @@ -5073,7 +5073,7 @@ function bl({ query: e, collection: t, fetchPage: n, pageSize: r = 80, getPageSi }; } function f(e, { limit: n = l() } = {}) { - let r = Array.isArray(e?.assets) ? e.assets : [], i = e?.total == null ? null : Number(e.total) || 0, o = vl({ + let r = Array.isArray(e?.assets) ? e.assets : [], i = e?.total == null ? null : Number(e.total) || 0, o = yl({ assets: r, count: e?.count, limit: Number(e?.limit || n) || n, @@ -5138,7 +5138,7 @@ function bl({ query: e, collection: t, fetchPage: n, pageSize: r = 80, getPageSi let u = a.requestId; a.loading = !0, a.error = null; try { - let n = await yl({ + let n = await bl({ maxEmptyPages: o, canContinue: t, getLimit: e, @@ -5198,12 +5198,12 @@ function bl({ query: e, collection: t, fetchPage: n, pageSize: r = 80, getPageSi }; } // ui/vue/composables/useVirtualGrid.ts -function xl(e, t) { +function Sl(e, t) { if (!t || typeof t != "object") return !1; - let n = Cc(e?.dataset || {}), r = n.scope, i = n.subfolder.toLowerCase(), a = n.kind, o = n.workflowOnly, s = n.minRating, c = n.workflowType.toLowerCase(), l = String(n.workflowId || "").trim(), u = n.dateExact, d = String(t?.subfolder || "").trim().toLowerCase(), f = String(t?.type || t?.source || "output").trim().toLowerCase(), p = String(t?.kind || "").trim().toLowerCase(), m = String(t?.workflow_type || t?.workflowType || "").trim().toLowerCase(), h = String(t?.workflow_id || t?.workflowId || t?.metadata?.workflow_id || t?.metadata?.workflow?.id || "").trim(), g = String(t?.date_exact || t?.date || "").trim(), _ = t?.has_workflow ?? t?.hasWorkflow ?? null; + let n = wc(e?.dataset || {}), r = n.scope, i = n.subfolder.toLowerCase(), a = n.kind, o = n.workflowOnly, s = n.minRating, c = n.workflowType.toLowerCase(), l = String(n.workflowId || "").trim(), u = n.dateExact, d = String(t?.subfolder || "").trim().toLowerCase(), f = String(t?.type || t?.source || "output").trim().toLowerCase(), p = String(t?.kind || "").trim().toLowerCase(), m = String(t?.workflow_type || t?.workflowType || "").trim().toLowerCase(), h = String(t?.workflow_id || t?.workflowId || t?.metadata?.workflow_id || t?.metadata?.workflow?.id || "").trim(), g = String(t?.date_exact || t?.date || "").trim(), _ = t?.has_workflow ?? t?.hasWorkflow ?? null; return !(r && r !== "all" && f && f !== r || i && d !== i || a && p && p !== a || o && _ !== null && !_ || s > 0 && (Number(t?.rating || 0) || 0) < s || c && m !== c || l && h && h !== l || u && g && g !== u); } -async function Sl(e, t, n, r, i, { requestId: a = 0, signal: o = null, cursor: s = null } = {}) { +async function Cl(e, t, n, r, i, { requestId: a = 0, signal: o = null, cursor: s = null } = {}) { let c = (e) => { if (typeof e == "string") return e; if (e && typeof e == "object") { @@ -5211,9 +5211,9 @@ async function Sl(e, t, n, r, i, { requestId: a = 0, signal: o = null, cursor: s if (typeof e.target?.value == "string") return e.target.value; } return String(e || ""); - }, l = Cc(e?.dataset || {}), { scope: u, customRootId: d, subfolder: f, kind: p, workflowOnly: m, minRating: h, minSizeMB: g, maxSizeMB: _, resolutionCompare: v, minWidth: y, minHeight: b, maxWidth: x, maxHeight: S, workflowType: C, workflowId: w, workflowModel: T, workflowRunsOn: E, dateRange: D, dateExact: O, metadataSearchMode: k } = l, A = l.sort || "mtime_desc", j = c(t).trim() || "*", M = /^\[object\s+HTML.*Element\]$/i.test(j) ? "*" : j, N = i.sanitizeQuery(M) || M; + }, l = wc(e?.dataset || {}), { scope: u, customRootId: d, subfolder: f, kind: p, workflowOnly: m, minRating: h, minSizeMB: g, maxSizeMB: _, resolutionCompare: v, minWidth: y, minHeight: b, maxWidth: x, maxHeight: S, workflowType: C, workflowId: w, workflowModel: T, workflowRunsOn: E, dateRange: D, dateExact: O, metadataSearchMode: k } = l, A = l.sort || "mtime_desc", j = c(t).trim() || "*", M = /^\[object\s+HTML.*Element\]$/i.test(j) ? "*" : j, N = i.sanitizeQuery(M) || M; try { - let t = String(u || "").toLowerCase() === "output", c = Dc({ + let t = String(u || "").toLowerCase() === "output", c = Oc({ ...l, q: N }), j = t && Number(r ?? 0) === 0 && N === "*" && !c && String(A || "mtime_desc").toLowerCase() === "mtime_desc", M = !(t && (Number(r ?? 0) > 0 || j)), P = !!l.groupStacks, ee = Number(r ?? 0) > 0 ? null : s || null, te = i.buildListURL({ @@ -5302,7 +5302,7 @@ async function Sl(e, t, n, r, i, { requestId: a = 0, signal: o = null, cursor: s }; } } -function Cl(e, t) { +function wl(e, t) { switch (t) { case "mtime_desc": return -(Number(e?.mtime) || 0); case "mtime_asc": return Number(e?.mtime) || 0; @@ -5311,23 +5311,23 @@ function Cl(e, t) { default: return -(Number(e?.mtime) || 0); } } -function wl(e, t, n) { +function Tl(e, t, n) { if (n === "name_desc") { let n = String(e?.filename || "").toLowerCase(), r = String(t?.filename || "").toLowerCase(); return n > r ? -1 : +(n < r); } - let r = Cl(e, n), i = Cl(t, n); + let r = wl(e, n), i = wl(t, n); return r < i ? -1 : +(r > i); } -function Tl(e, t, n) { +function El(e, t, n) { return n === "name_asc" ? String(e) < String(t) : n === "name_desc" ? String(e) > String(t) : Number(e) < Number(t); } -function El(e, t, n) { - let r = Cl(t, n); - for (let t = 0; t < e.length; t++) if (Tl(r, Cl(e[t], n), n)) return t; +function Dl(e, t, n) { + let r = wl(t, n); + for (let t = 0; t < e.length; t++) if (El(r, wl(e[t], n), n)) return t; return e.length; } -function Dl(e, t) { +function Ol(e, t) { let n = t.get(e); return n || (n = { pending: /* @__PURE__ */ new Map(), @@ -5335,13 +5335,13 @@ function Dl(e, t) { flushing: !1 }, t.set(e, n)), n; } -function Ol(e) { +function kl(e) { return String(e ?? "").trim().toLowerCase(); } -function kl(e) { +function Al(e) { return e?._mjrLivePlaceholder === !0 || e?.is_live_placeholder === !0 || String(e?.id || "").trim().toLowerCase().startsWith("live:"); } -function Al(e) { +function jl(e) { if (!e || typeof e != "object") return e; try { delete e._mjrLivePlaceholder, delete e._mjrLiveStatus, delete e._mjrLiveLabel, delete e.is_live_placeholder; @@ -5350,24 +5350,24 @@ function Al(e) { } return e; } -function jl(e) { +function Ml(e) { if (!e || typeof e != "object") return ""; - let t = Ol(e?.type || e?.source || "output"), n = Ol(e?.root_id || e?.custom_root_id || ""), r = Ol(e?.subfolder || ""), i = Ol(e?.filename || ""); + let t = kl(e?.type || e?.source || "output"), n = kl(e?.root_id || e?.custom_root_id || ""), r = kl(e?.subfolder || ""), i = kl(e?.filename || ""); if (i) return `${t}|${n}|${r}|${i}`; - let a = Ol(e?.filepath || e?.path || e?.fullpath || e?.full_path || ""); + let a = kl(e?.filepath || e?.path || e?.fullpath || e?.full_path || ""); return a ? `${t}|${n}|path|${a}` : ""; } -function Ml(e, t, n) { +function Nl(e, t, n) { let r = Array.isArray(e?.assets) ? e.assets : []; if (t) { let e = r.findIndex((e) => String(e?.id || "") === t); if (e > -1) return e; } - let i = jl(n); - return i ? r.findIndex((e) => jl(e) === i) : -1; + let i = Ml(n); + return i ? r.findIndex((e) => Ml(e) === i) : -1; } -function Nl(e, t) { - return !t || typeof t != "object" || !e || typeof e != "object" ? !1 : kl(t) ? !0 : ![ +function Pl(e, t) { + return !t || typeof t != "object" || !e || typeof e != "object" ? !1 : Al(t) ? !0 : ![ "filename", "filepath", "path", @@ -5386,10 +5386,10 @@ function Nl(e, t) { "date" ].some((t) => Object.prototype.hasOwnProperty.call(e, t)); } -function Pl(e, t) { +function Fl(e, t) { let n = /* @__PURE__ */ new Set(), r = /* @__PURE__ */ new Set(), i = /* @__PURE__ */ new Map(), a = []; for (let o of Array.isArray(e?.assets) ? e.assets : []) { - let e = o?.id == null ? "" : String(o.id), s = t.assetKey(o), c = At(o?.filename); + let e = o?.id == null ? "" : String(o.id), s = t.assetKey(o), c = jt(o?.filename); if (!(e && n.has(e)) && !(s && r.has(s))) { if (c) { let e = i.get(c); @@ -5402,9 +5402,9 @@ function Pl(e, t) { e && n.add(e), s && r.add(s), c && i.set(c, o), o._mjrNameCollision = !1, delete o._mjrNameCollisionCount, delete o._mjrNameCollisionPaths, a.push(o); } } - e.assets = a, gl(e, { assetKey: t.assetKey }); + e.assets = a, _l(e, { assetKey: t.assetKey }); } -function Fl(e, t) { +function Il(e, t) { let n = t.upsertState.get(e); if (!n || n.pending.size === 0 || n.flushing) return; n.flushing = !0, n.timer &&= (clearTimeout(n.timer), null); @@ -5414,14 +5414,14 @@ function Fl(e, t) { try { let n = !1; for (let [a, o] of r.entries()) { - let r = kl(o); + let r = Al(o); i.assetKeyFn = t.assetKey; - let s = St(o, i, t.loadMajoorSettings); + let s = Ct(o, i, t.loadMajoorSettings); if (Array.isArray(s?.removed) && s.removed.length) { let e = new Set(s.removed); i.assets = i.assets.filter((t) => { let n = !e.has(t); - return n || Nt(i, t, i), n; + return n || Pt(i, t, i), n; }); try { i.hiddenPngSiblings = (Number(i.hiddenPngSiblings || 0) || 0) + s.removed.length; @@ -5441,31 +5441,31 @@ function Fl(e, t) { let c = i.assets.findIndex((e) => String(e.id) === a), l = c > -1 ? i.assets[c] : null, u = l ? { ...l, ...o - } : o, d = c > -1 ? c : Ml(i, a, u), f = d > -1 ? i.assets[d] : null, p = f ? { + } : o, d = c > -1 ? c : Nl(i, a, u), f = d > -1 ? i.assets[d] : null, p = f ? { ...f, ...o } : u, m = t.assetKey(u); - if (!xl(e, p)) { + if (!Sl(e, p)) { if (d > -1) { - if (Nl(o, f)) { - Object.assign(f, o), r || Al(f), i.assets[d] = { ...f }, n = !0; + if (Pl(o, f)) { + Object.assign(f, o), r || jl(f), i.assets[d] = { ...f }, n = !0; continue; } let [e] = i.assets.splice(d, 1); - Nt(i, e, i), n = !0; + Pt(i, e, i), n = !0; } } else if (d > -1) { let e = t.assetKey(f); - Object.assign(f, o), r || Al(f); + Object.assign(f, o), r || jl(f); let a = { ...f }, s = t.assetKey(a); i.assets[d] = a, e && e !== s && (i.seenKeys?.delete?.(e), s && i.seenKeys?.add?.(s)), n = !0; } else if (!(i.seenKeys.has(m) || o.id != null && i.assetIdSet?.has?.(a))) { - let t = Cc(e?.dataset || {}).sort || "mtime_desc", s = r ? u : Al({ ...u }), c = El(i.assets, s, t); + let t = wc(e?.dataset || {}).sort || "mtime_desc", s = r ? u : jl({ ...u }), c = Dl(i.assets, s, t); i.seenKeys.add(m), o.id != null && i.assetIdSet?.add?.(a), i.assets.splice(c, 0, s), n = !0; } } if (n && a) { - Pl(i, t); + Fl(i, t); try { e.dataset.mjrHiddenPngSiblings = String(Number(i.hiddenPngSiblings || 0) || 0); } catch (e) { @@ -5477,22 +5477,22 @@ function Fl(e, t) { if (n.flushing = !1, n.pending.size > 0 && !n.timer) { let r = Math.min(16, t.debounceMs); n.timer = setTimeout(() => { - n.timer = null, Fl(e, t); + n.timer = null, Il(e, t); }, r); } } } -function Il(e, t, n) { +function Ll(e, t, n) { if (!t || !t.id) return !1; let r = n.getOrCreateState(e), i = String(t.id); if (!n.ensureVirtualGrid(e, r)) return !1; - let a = Dl(e, n.upsertState); - return a.pending.set(i, t), a.pending.size >= n.maxBatchSize ? Fl(e, n) : !a.timer && !a.flushing && (a.timer = setTimeout(() => { - a.timer = null, Fl(e, n); + let a = Ol(e, n.upsertState); + return a.pending.set(i, t), a.pending.size >= n.maxBatchSize ? Il(e, n) : !a.timer && !a.flushing && (a.timer = setTimeout(() => { + a.timer = null, Il(e, n); }, n.debounceMs)), !0; } // ui/vue/components/grid/gridDomBridge.ts -function Ll(e) { +function Rl(e) { let t = String(e ?? ""); try { if (typeof CSS < "u" && typeof CSS.escape == "function") return CSS.escape(t); @@ -5501,7 +5501,7 @@ function Ll(e) { } return t.replace(/([!"#$%&'()*+,./:;<=>?@[\\\]^`{|}~])/g, "\\$1"); } -function Rl(e) { +function zl(e) { if (!e) return []; try { return Array.from(e.querySelectorAll?.(".mjr-asset-card") || []); @@ -5509,7 +5509,7 @@ function Rl(e) { return console.debug?.(e), []; } } -function zl(e) { +function Bl(e) { if (!e) return null; try { return e.querySelector?.(".mjr-asset-card.is-selected") || null; @@ -5517,46 +5517,46 @@ function zl(e) { return console.debug?.(e), null; } } -function Bl(e, t) { +function Vl(e, t) { if (!e) return null; let n = String(t || "").trim(); if (!n) return null; try { - return e.querySelector?.(`.mjr-asset-card[data-mjr-asset-id="${Ll(n)}"]`) || null; + return e.querySelector?.(`.mjr-asset-card[data-mjr-asset-id="${Rl(n)}"]`) || null; } catch (e) { return console.debug?.(e), null; } } -function Vl(e, t = 0) { +function Hl(e, t = 0) { let n = e?.dataset?.mjrShown, r = Number(n); return Number.isFinite(r) ? Math.max(0, r) : Math.max(0, Number(t) || 0); } // ui/vue/composables/useGridLoader.ts -var Hl = 200, Ul = 50, Wl = /* @__PURE__ */ new WeakMap(), Gl = /* @__PURE__ */ new Set([ +var Ul = 200, Wl = 50, Gl = /* @__PURE__ */ new WeakMap(), Kl = /* @__PURE__ */ new Set([ "collection", "filter", "initial", "scope", "search", "sort" -]), Kl = 0; -function ql(e) { +]), ql = 0; +function Jl(e) { return new Promise((t) => setTimeout(t, Math.max(0, Number(e) || 0))); } -function Jl(e) { +function Yl(e) { if (!e || typeof e != "object") return ""; if (e.id != null && String(e.id).trim()) return `id:${String(e.id).trim()}`; - let t = String(e?.type || e?.source || "output").trim().toLowerCase(), n = String(ze(e) || "").trim().toLowerCase(), r = String(e?.subfolder || "").trim().toLowerCase(), i = String(e?.filename || "").trim().toLowerCase(); + let t = String(e?.type || e?.source || "output").trim().toLowerCase(), n = String(Be(e) || "").trim().toLowerCase(), r = String(e?.subfolder || "").trim().toLowerCase(), i = String(e?.filename || "").trim().toLowerCase(); if (i) return `${t}|${n}|${r}|${i}`; let a = String(e?.filepath || e?.path || e?.fullpath || e?.full_path || "").trim().toLowerCase(); return a ? `${t}|${n}|path|${a}` : ""; } -function Yl(e) { +function Xl(e) { if (e == null) return e; let t = String(e); return t.trim() === "" ? t : t.trim() === "*" ? "*" : t.replace(/[\u0000-\u001f\u007f]+/g, " ").replace(/[<>]/g, " ").replace(/\s+/g, " ").trim() || t; } -function Xl(e) { +function Zl(e) { if (typeof e == "string") return e; if (e && typeof e == "object") { if (typeof e.value == "string") return e.value; @@ -5572,13 +5572,13 @@ function Xl(e) { } return String(e || ""); } -function Zl(e) { +function Ql(e) { return e ? typeof e == "object" && "value" in e ? e.value || null : e : null; } -async function Ql() { - await lr(); +async function $l() { + await ur(); } -function $l(e, t) { +function eu(e, t) { let n = String(e || "Failed to load"); try { let e = String(t?.message || t || "").trim(), r = e.toLowerCase(); @@ -5587,13 +5587,13 @@ function $l(e, t) { return n; } } -function eu(e, t) { +function tu(e, t) { let n = Math.max(1, Math.min(B.MAX_PAGE_SIZE, Number(e) || 1)), r = Math.max(0, Number(t) || 0); if (r <= 0) return n; let i = 2 ** Math.min(r, 5); return Math.max(1, Math.min(B.MAX_PAGE_SIZE, n * i)); } -function tu() { +function nu() { try { let e = typeof navigator < "u" ? navigator : null, t = Number(e?.deviceMemory || 0) || 0; if (t > 0 && t <= 4 || e?.connection?.saveData === !0) return !0; @@ -5602,20 +5602,20 @@ function tu() { } return !1; } -function nu() { - return B.PREFETCH_NEXT_PAGE ? !tu() : !1; +function ru() { + return B.PREFETCH_NEXT_PAGE ? !nu() : !1; } -function ru(e, t = {}) { +function iu(e, t = {}) { let n = Array.isArray(e.assets) ? e.assets : []; - t.rebuildFromVisible && n.length ? gt(e, n, { + t.rebuildFromVisible && n.length ? _t(e, n, { assetKey: t.assetKey || e.assetKeyFn, preserveHiddenCount: !!t.preserveHiddenCount - }) : gt(e, [], { + }) : _t(e, [], { assetKey: t.assetKey || e.assetKeyFn, preserveHiddenCount: !1 }); } -function iu({ gridContainerRef: e, state: t, setLoadingMessage: n, clearLoadingMessage: r, setStatusMessage: i, clearStatusMessage: a, resetAssets: o, setSelection: s, reconcileSelection: c, readScrollElement: l = () => null, readRenderedCards: u = () => [], scrollToAssetId: d = () => {}, canLoadMore: f = null } = {}) { +function au({ gridContainerRef: e, state: t, setLoadingMessage: n, clearLoadingMessage: r, setStatusMessage: i, clearStatusMessage: a, resetAssets: o, setSelection: s, reconcileSelection: c, readScrollElement: l = () => null, readRenderedCards: u = () => [], scrollToAssetId: d = () => {}, canLoadMore: f = null } = {}) { let p = !1, m = null, h = null, g = { pagesRequested: 0, assetsReceived: 0, @@ -5642,7 +5642,7 @@ function iu({ gridContainerRef: e, state: t, setLoadingMessage: n, clearLoadingM g.lastOperation = String(e || ""), t.reloadReason && (g.lastReloadReason = String(t.reloadReason || "")), t.appendReason && (g.lastAppendReason = String(t.appendReason || "")); } function y() { - return Zl(e); + return Ql(e); } function b() { return C(); @@ -5678,7 +5678,7 @@ function iu({ gridContainerRef: e, state: t, setLoadingMessage: n, clearLoadingM ...e, counts: { loaded: e.assets.length, - visible: Vl(y(), e.assets.length), + visible: Hl(y(), e.assets.length), total: e.pagination.total }, metrics: { ...g } @@ -5686,8 +5686,8 @@ function iu({ gridContainerRef: e, state: t, setLoadingMessage: n, clearLoadingM } function C() { let e = y(); - return Cc(e?.dataset || {}, { - q: wc(e, t.query || "*"), + return wc(e?.dataset || {}, { + q: Tc(e, t.query || "*"), resolutionCompare: e?.dataset?.mjrFilterResolutionCompare || "" }); } @@ -5725,7 +5725,7 @@ function iu({ gridContainerRef: e, state: t, setLoadingMessage: n, clearLoadingM }; } function D(e) { - return Gl.has(String(e || "").toLowerCase()); + return Kl.has(String(e || "").toLowerCase()); } function O(e = null) { try { @@ -5743,7 +5743,7 @@ function iu({ gridContainerRef: e, state: t, setLoadingMessage: n, clearLoadingM } catch (e) { console.debug?.(e); } - return vc(y(), l()); + return yc(y(), l()); } function j() { if (!B.DEFER_GRID_FETCH_DURING_EXECUTION) return !1; @@ -5780,7 +5780,7 @@ function iu({ gridContainerRef: e, state: t, setLoadingMessage: n, clearLoadingM h = null; } function P(e, n = B.PREFETCH_NEXT_PAGE_DELAY_MS) { - if (!nu()) return; + if (!ru()) return; N(); let r = Math.max(0, Number(n) || 0); h = setTimeout(() => { @@ -5793,7 +5793,7 @@ function iu({ gridContainerRef: e, state: t, setLoadingMessage: n, clearLoadingM M(); let n = (() => { try { - return tl(C()); + return nl(C()); } catch (e) { return console.debug?.(e), null; } @@ -5814,16 +5814,16 @@ function iu({ gridContainerRef: e, state: t, setLoadingMessage: n, clearLoadingM if (n) { let e = null; try { - e = tl(C()); + e = nl(C()); } catch (e) { console.debug?.(e); } if (e && e !== n) { - xe("[Grid] Deferred execution reload skipped - scope/filter changed during execution"); + Se("[Grid] Deferred execution reload skipped - scope/filter changed during execution"); return; } } - let a = wc(i, e); + let a = Tc(i, e); Promise.resolve().then(() => _e(a, { ...t || {}, reset: !0, @@ -5844,16 +5844,16 @@ function iu({ gridContainerRef: e, state: t, setLoadingMessage: n, clearLoadingM } function te(e, t = null) { if (!e || typeof e != "object") return ""; - let n = e.id == null ? `${e.type || ""}|${ze(e)}|${e.filepath || ""}|${e.subfolder || ""}|${e.filename || ""}` : `id:${e.id}`; + let n = e.id == null ? `${e.type || ""}|${Be(e)}|${e.filepath || ""}|${e.subfolder || ""}|${e.filename || ""}` : `id:${e.id}`; try { - return Xa(t || y() || globalThis?.__MJR_LAST_ASSETKEY_GRID__, e, n); + return Za(t || y() || globalThis?.__MJR_LAST_ASSETKEY_GRID__, e, n); } catch (e) { return console.debug?.(e), n; } } function F() { try { - let e = Vn?.() || {}, t = e.grid || {}; + let e = Hn?.() || {}, t = e.grid || {}; return t.snapshotCacheEnabled === !0 || t.enableSnapshotCache === !0 || e.snapshotCacheEnabled === !0 || e.enableSnapshotCache === !0; } catch (e) { return console.debug?.(e), !1; @@ -5864,14 +5864,14 @@ function iu({ gridContainerRef: e, state: t, setLoadingMessage: n, clearLoadingM if (!F()) return; let n = y(), r = Array.isArray(t.assets) ? t.assets : []; if (!n || !r.length) return; - let i = r.map(nl).filter(Boolean); + let i = r.map(rl).filter(Boolean); if (!i.length) return; - let a = i.length < r.length, o = Number(t.offset || i.length) || i.length, s = Number(t.total ?? i.length), c = Cc(n.dataset || {}, { - q: wc(n, t.query || "*"), + let a = i.length < r.length, o = Number(t.offset || i.length) || i.length, s = Number(t.total ?? i.length), c = wc(n.dataset || {}, { + q: Tc(n, t.query || "*"), resolutionCompare: n.dataset?.mjrFilterResolutionCompare || "" - }), l = tl(c); + }), l = nl(c); if (!l) return; - pl(l, { + ml(l, { assets: i, title: String(e || "").trim(), query: String(t.query || c.query || "*").trim() || "*", @@ -5886,7 +5886,7 @@ function iu({ gridContainerRef: e, state: t, setLoadingMessage: n, clearLoadingM function ne() { let e = y(); if (e) try { - let t = Wl.get(e); + let t = Gl.get(e); if (!t) return; t.timer &&= (clearTimeout(t.timer), null), t.pending.clear(), t.flushing = !1; } catch (e) { @@ -5894,25 +5894,25 @@ function iu({ gridContainerRef: e, state: t, setLoadingMessage: n, clearLoadingM } } function ie(e, n) { - let r = _(), i = Array.isArray(n) ? n.length : 0, o = Tt(e, n, t, { - loadMajoorSettings: Vn, + let r = _(), i = Array.isArray(n) ? n.length : 0, o = Et(e, n, t, { + loadMajoorSettings: Hn, clearGridMessage: () => { a(); }, ensureVirtualGrid: () => t.virtualGrid, - setFileBadgeCollision: Ct, + setFileBadgeCollision: wt, assetKey: (t) => te(t, e), - ensureDupStackCard: (e, t, n) => Qa(e, t, n) + ensureDupStackCard: (e, t, n) => $a(e, t, n) }); return g.renderTimeMs += Math.max(0, _() - r), g.assetsReceived += i, g.visibleAssetsAdded += Number(o || 0) || 0, g.hiddenOrDedupedAssets += Math.max(0, i - (Number(o || 0) || 0)), o; } function ae(e, t) { let n = String(t || "*").trim() || "*"; - return Ec(Cc(e?.dataset || {}, { q: n })); + return Dc(wc(e?.dataset || {}, { q: n })); } function oe(e) { - let t = C(), n = Yl(Xl(e).trim() || "*") || "*"; - return Oc({ + let t = C(), n = Xl(Zl(e).trim() || "*") || "*"; + return kc({ ...t, q: n }); @@ -5932,9 +5932,9 @@ function iu({ gridContainerRef: e, state: t, setLoadingMessage: n, clearLoadingM error: "Grid unavailable" }; if (r === 0) { - let s = ae(o, e), c = Lr(); + let s = ae(o, e), c = Rr(); if (c && c === s) { - let o = Ir(s); + let o = Lr(s); if (o) try { let s = await o; if (Number(t.requestId) !== Number(i)) return { @@ -5949,7 +5949,7 @@ function iu({ gridContainerRef: e, state: t, setLoadingMessage: n, clearLoadingM }; let c = s?.data?.assets; if (s?.ok && Array.isArray(c)) { - xe("[Grid] Using early-fetched data:", c.length, "assets"); + Se("[Grid] Using early-fetched data:", c.length, "assets"); let t = s.data?.total ?? s.meta?.total ?? null; return se({ ok: !0, @@ -5966,13 +5966,13 @@ function iu({ gridContainerRef: e, state: t, setLoadingMessage: n, clearLoadingM }); } } catch (e) { - xe("[Grid] Early fetch failed, falling back to normal fetch", e); + Se("[Grid] Early fetch failed, falling back to normal fetch", e); } } } - return se(await Sl(o, e, n, r, { - sanitizeQuery: Yl, - buildListURL: Ke, + return se(await Cl(o, e, n, r, { + sanitizeQuery: Xl, + buildListURL: qe, get: re, getGridState: () => t }, { @@ -5985,7 +5985,7 @@ function iu({ gridContainerRef: e, state: t, setLoadingMessage: n, clearLoadingM offset: r }); } - let ce = bl({ + let ce = xl({ query: { get value() { return t.query || "*"; @@ -6056,7 +6056,7 @@ function iu({ gridContainerRef: e, state: t, setLoadingMessage: n, clearLoadingM console.debug?.(e); } let f = Array.isArray(t.selectedIds) ? t.selectedIds.join("|") : "", m = String(t.activeId || ""); - if (v("appendNextPage", { appendReason: "pagination" }), !A()) return !t.assets.length && !t.loading && nu() && P(t.requestId, 400), { + if (v("appendNextPage", { appendReason: "pagination" }), !A()) return !t.assets.length && !t.loading && ru() && P(t.requestId, 400), { ok: !0, skipped: !0, hidden: !0 @@ -6079,7 +6079,7 @@ function iu({ gridContainerRef: e, state: t, setLoadingMessage: n, clearLoadingM let n = t.requestId, r = await ce.loadUntilVisible({ maxEmptyPages: 6, canContinue: () => A(), - getLimit: (e) => eu(h, e), + getLimit: (e) => tu(h, e), beforeApplyPage: (e) => { if (t.requestId !== n) return { ok: !1, @@ -6097,7 +6097,7 @@ function iu({ gridContainerRef: e, state: t, setLoadingMessage: n, clearLoadingM cursor: null, total: null, done: !1 - }), ru(t), g.resetCount += 1, p = !1, null) : Array.isArray(t.assets) && t.assets.length ? (xe("[Grid LoadPage] empty response with cached visible assets - preserving cached view", { + }), iu(t), g.resetCount += 1, p = !1, null) : Array.isArray(t.assets) && t.assets.length ? (Se("[Grid LoadPage] empty response with cached visible assets - preserving cached view", { offset: t.offset, query: t.query }), { @@ -6108,18 +6108,18 @@ function iu({ gridContainerRef: e, state: t, setLoadingMessage: n, clearLoadingM }) : null; }, onEmptyPage: (e) => { - e.emptyPageIndex <= 0 || xe(`[Grid LoadPage] fetched adaptive page with no visible additions: offset=${t.offset}, fetched=${e.count}, consumed=${e.advanced}, added=${e.added}, limit=${e.limit}, done=${t.done}, visibleCount=${t.assets.length}, total=${t.total}`); + e.emptyPageIndex <= 0 || Se(`[Grid LoadPage] fetched adaptive page with no visible additions: offset=${t.offset}, fetched=${e.count}, consumed=${e.advanced}, added=${e.added}, limit=${e.limit}, done=${t.done}, visibleCount=${t.assets.length}, total=${t.total}`); } }); - if (de(), fe(), !r.ok) return r.aborted || r.stale || (ue({ done: !0 }), i($l("Failed to load assets", r?.error || "Unknown error"), { error: !0 })), r; + if (de(), fe(), !r.ok) return r.aborted || r.stale || (ue({ done: !0 }), i(eu("Failed to load assets", r?.error || "Unknown error"), { error: !0 })), r; if (r.preservedCached) return r; - if (t.done || r.added > 0) return I(t.query || wc(e, "*")), { + if (t.done || r.added > 0) return I(t.query || Tc(e, "*")), { ok: !0, count: r.count, total: t.total }; let a = r.lastResult || r.firstResult || r; - return xe(`[Grid LoadPage] fetched one page with no visible additions: offset=${t.offset}, fetched=${r.count}, consumed=${a.advanced}, added=${a.added}, limit=${a.limit || h}, done=${t.done}, visibleCount=${t.assets.length}, total=${t.total}`), !t.done && nu() && P(Number(t.requestId ?? 0) || 0, Math.min(B.PREFETCH_NEXT_PAGE_DELAY_MS ?? 700, 250)), { + return Se(`[Grid LoadPage] fetched one page with no visible additions: offset=${t.offset}, fetched=${r.count}, consumed=${a.advanced}, added=${a.added}, limit=${a.limit || h}, done=${t.done}, visibleCount=${t.assets.length}, total=${t.total}`), !t.done && ru() && P(Number(t.requestId ?? 0) || 0, Math.min(B.PREFETCH_NEXT_PAGE_DELAY_MS ?? 700, 250)), { ok: !0, count: r.count, total: t.total, @@ -6141,7 +6141,7 @@ function iu({ gridContainerRef: e, state: t, setLoadingMessage: n, clearLoadingM } catch (e) { console.debug?.(e); } - return i($l("Failed to load assets", e), { error: !0 }), { + return i(eu("Failed to load assets", e), { error: !0 }), { ok: !1, error: e?.message || String(e) }; @@ -6163,7 +6163,7 @@ function iu({ gridContainerRef: e, state: t, setLoadingMessage: n, clearLoadingM } try { let e = Date.now() - _; - e < Kl && await ql(Kl - e); + e < ql && await Jl(ql - e); } catch (e) { console.debug?.(e); } @@ -6180,7 +6180,7 @@ function iu({ gridContainerRef: e, state: t, setLoadingMessage: n, clearLoadingM } let n = t.requestId, r = null; try { - r = tl(C()); + r = nl(C()); } catch (e) { console.debug?.(e); } @@ -6189,12 +6189,12 @@ function iu({ gridContainerRef: e, state: t, setLoadingMessage: n, clearLoadingM if (r) { let e = null; try { - e = tl(C()); + e = nl(C()); } catch (e) { console.debug?.(e); } if (e && e !== r) { - xe("[Grid] Snapshot head refresh skipped - context changed"); + Se("[Grid] Snapshot head refresh skipped - context changed"); return; } } @@ -6208,12 +6208,12 @@ function iu({ gridContainerRef: e, state: t, setLoadingMessage: n, clearLoadingM if (r) { let e = null; try { - e = tl(C()); + e = nl(C()); } catch (e) { console.debug?.(e); } if (e && e !== r) { - xe("[Grid] Snapshot head refresh discarded - context changed mid-fetch"); + Se("[Grid] Snapshot head refresh discarded - context changed mid-fetch"); return; } } @@ -6222,7 +6222,7 @@ function iu({ gridContainerRef: e, state: t, setLoadingMessage: n, clearLoadingM if (i.total != null && ue({ total: i.total }), !a.length) return; let o = 0; for (let e of a) e && e.id != null && De(e) && (o += 1); - o > 0 && (I(t.query || "*"), xe("[Grid] Snapshot head refresh: inserted", o, "new asset(s)")); + o > 0 && (I(t.query || "*"), Se("[Grid] Snapshot head refresh: inserted", o, "new asset(s)")); } catch (e) { console.debug?.("[Grid] Snapshot head refresh failed", e); } @@ -6243,7 +6243,7 @@ function iu({ gridContainerRef: e, state: t, setLoadingMessage: n, clearLoadingM } catch (e) { console.debug?.(e); } - let d = Xl(e).trim() || "*", f = /^\[object\s+HTML.*Element\]$/i.test(d) ? "*" : d, m = Yl(f) || f; + let d = Zl(e).trim() || "*", f = /^\[object\s+HTML.*Element\]$/i.test(d) ? "*" : d, m = Xl(f) || f; t.query = m; let h = c ? E(m, i) : { reason: "append", @@ -6254,8 +6254,8 @@ function iu({ gridContainerRef: e, state: t, setLoadingMessage: n, clearLoadingM try { let n = C(); n.query = m; - let r = tl(n); - if (F() && fl(r) && (e = await Te(n, { allowReplaceExisting: !0 }), t.requestId > s + +!!e)) return console.debug?.("[Grid] loadAssets aborted during deferral due to scope switch"), { + let r = nl(n); + if (F() && pl(r) && (e = await Te(n, { allowReplaceExisting: !0 }), t.requestId > s + +!!e)) return console.debug?.("[Grid] loadAssets aborted during deferral due to scope switch"), { ok: !1, aborted: !0 }; @@ -6294,7 +6294,7 @@ function iu({ gridContainerRef: e, state: t, setLoadingMessage: n, clearLoadingM cursor: null, total: null, done: !1 - }), ru(t, { + }), iu(t, { rebuildFromVisible: !0, preserveHiddenCount: !0, assetKey: (e) => te(e, u) @@ -6307,10 +6307,10 @@ function iu({ gridContainerRef: e, state: t, setLoadingMessage: n, clearLoadingM cursor: null, total: null, done: !1 - }), ru(t), g.resetCount += 1), n(m === "*" ? "Loading assets..." : `Searching for "${m}"...`); + }), iu(t), g.resetCount += 1), n(m === "*" ? "Loading assets..." : `Searching for "${m}"...`); } let _ = await me(); - return fe(), nu() && _?.ok && !_?.skipped && !t.done && !_?.aborted && P(t.requestId), c && (pe({ + return fe(), ru() && _?.ok && !_?.skipped && !t.done && !_?.aborted && P(t.requestId), c && (pe({ title: m, showEmptyMessage: !(_?.skipped || _?.hidden || _?.aborted || _?.stale || _?.preservedCached || _?.busy) }), O(h.nextContext)), { @@ -6359,15 +6359,15 @@ function iu({ gridContainerRef: e, state: t, setLoadingMessage: n, clearLoadingM cursor: null, total: p.length, done: !0 - }), ru(t), g.resetCount += 1), u ? (n(p.length ? `Loading ${c}...` : `${c} is empty`), t.loading = !0) : (r(), t.loading = !1); + }), iu(t), g.resetCount += 1), u ? (n(p.length ? `Loading ${c}...` : `${c} is empty`), t.loading = !0) : (r(), t.loading = !1); } try { - let e = Tc(f, "mtime_desc"), n = p.sort((t, n) => wl(t, n, e)); + let e = Ec(f, "mtime_desc"), n = p.sort((t, n) => Tl(t, n, e)); return l && h && (o({ query: String(c || "Collection"), total: p.length, done: !0 - }), ru(t), g.resetCount += 1), ie(f, n), ue({ + }), iu(t), g.resetCount += 1), ie(f, n), ue({ offset: n.length, cursor: null, total: n.length, @@ -6378,14 +6378,14 @@ function iu({ gridContainerRef: e, state: t, setLoadingMessage: n, clearLoadingM total: n.length }; } catch (e) { - return i($l("Failed to load collection", e), { error: !0 }), { + return i(eu("Failed to load collection", e), { error: !0 }), { ok: !1, error: e?.message || String(e) }; } finally { if (u) try { let e = Date.now() - m; - e < Kl && await ql(Kl - e); + e < ql && await Jl(ql - e); } catch (e) { console.debug?.(e); } @@ -6395,7 +6395,7 @@ function iu({ gridContainerRef: e, state: t, setLoadingMessage: n, clearLoadingM function ye() { v("reload", { reloadReason: "scopeSwitch" }); try { - Za(y()); + Qa(y()); } catch (e) { console.debug?.(e); } @@ -6414,8 +6414,8 @@ function iu({ gridContainerRef: e, state: t, setLoadingMessage: n, clearLoadingM function be() { t.virtualGrid?.setItems?.(t.assets || []); } - function Se(e, { updateSelection: n = !0 } = {}) { - let r = _l(t, e, { assetKey: (e) => te(e, y()) }); + function xe(e, { updateSelection: n = !0 } = {}) { + let r = vl(t, e, { assetKey: (e) => te(e, y()) }); return r ? (Number.isFinite(Number(t.total)) && ue({ total: Math.max(0, Number(t.total || 0) - r) }), n && c(t.assets.map((e) => String(e?.id || "")).filter(Boolean), { activeId: t.activeId }), !t.assets.length && !t.loading && i("No assets found"), { ok: !0, removed: r, @@ -6437,7 +6437,7 @@ function iu({ gridContainerRef: e, state: t, setLoadingMessage: n, clearLoadingM } catch { return !1; } - }, r = zl(e), i = u(), a = i.find((e) => n(e)) || i[0] || null, o = n(r) ? r : a; + }, r = Bl(e), i = u(), a = i.find((e) => n(e)) || i[0] || null, o = n(r) ? r : a; if (!o) return null; try { let e = o.getBoundingClientRect(), n = t.getBoundingClientRect(); @@ -6453,14 +6453,14 @@ function iu({ gridContainerRef: e, state: t, setLoadingMessage: n, clearLoadingM async function we(e) { let t = y(), n = l(); if (!t || !n || !e) return; - await Ql(); + await $l(); let r = String(e.id || "").trim(); if (!r) { n.scrollTop = Number(e.scrollTop || 0) || 0, g.scrollRestoreCount += 1; return; } - d(r, { align: "start" }), await Ql(); - let i = Bl(t, r); + d(r, { align: "start" }), await $l(); + let i = Vl(t, r); if (!i) n.scrollTop = Number(e.scrollTop || 0) || 0, g.scrollRestoreCount += 1; else try { let t = i.getBoundingClientRect(), r = n.getBoundingClientRect(), a = t.top - r.top - Number(e.top || 0); @@ -6472,7 +6472,7 @@ function iu({ gridContainerRef: e, state: t, setLoadingMessage: n, clearLoadingM async function Te(e = {}, n = {}) { let i = y(); if (!i || !F()) return !1; - let s = tl(e), c = dl(s); + let s = nl(e), c = fl(s); if (!c || !Array.isArray(c.assets) || !c.assets.length || !n.allowReplaceExisting && Array.isArray(t.assets) && t.assets.length) return !1; g.lastResetReason = "snapshot"; try { @@ -6489,7 +6489,7 @@ function iu({ gridContainerRef: e, state: t, setLoadingMessage: n, clearLoadingM query: c.query || n.title || "Cached", total: Number(c.total ?? c.assets.length) || c.assets.length, done: !!c.done - }), ru(t), g.resetCount += 1, a(), r(), t.loading = !1, ie(i, c.assets), ue({ + }), iu(t), g.resetCount += 1, a(), r(), t.loading = !1, ie(i, c.assets), ue({ offset: Math.max(Number(c.assets.length || 0) || 0, Number(c.offset || c.assets.length) || c.assets.length), cursor: c.cursor || null, total: Number(c.total ?? c.assets.length) || c.assets.length, @@ -6503,34 +6503,34 @@ function iu({ gridContainerRef: e, state: t, setLoadingMessage: n, clearLoadingM return { getOrCreateState: () => t, ensureVirtualGrid: () => t.virtualGrid, - upsertState: Wl, - maxBatchSize: Ul, - debounceMs: Hl, - assetKey: (t) => Jl(t) || te(t, e), - loadMajoorSettings: Vn + upsertState: Gl, + maxBatchSize: Wl, + debounceMs: Ul, + assetKey: (t) => Yl(t) || te(t, e), + loadMajoorSettings: Hn }; } function De(e) { v("upsertRealtime", { appendReason: "realtime" }); let t = y(); - return !t || !e || !e.id ? !1 : Il(t, e, Ee(t)); + return !t || !e || !e.id ? !1 : Ll(t, e, Ee(t)); } let Oe = !1; function ke(e) { v("upsertRealtime", { appendReason: "realtimeImmediate" }); let t = y(); if (!t || !e || !e.id) return !1; - let n = Il(t, e, Ee(t)); + let n = Ll(t, e, Ee(t)); return n && !Oe && (Oe = !0, queueMicrotask(() => { Oe = !1; let e = y(); - e && Fl(e, Ee(e)); + e && Il(e, Ee(e)); })), n; } function Ae() { I(t.query || "Cached"); try { - ul(); + dl(); } catch (e) { console.debug?.(e); } @@ -6542,7 +6542,7 @@ function iu({ gridContainerRef: e, state: t, setLoadingMessage: n, clearLoadingM } let e = y(); if (e) try { - let t = Dl(e, Wl); + let t = Ol(e, Gl); t?.timer && (clearTimeout(t.timer), t.timer = null), t?.pending?.clear?.(); } catch (e) { console.debug?.(e); @@ -6568,7 +6568,7 @@ function iu({ gridContainerRef: e, state: t, setLoadingMessage: n, clearLoadingM loadNextPage: me, prepareGridForScopeSwitch: ye, refreshGrid: be, - removeAssets: Se, + removeAssets: xe, captureAnchor: Ce, restoreAnchor: we, hydrateFromSnapshot: Te, @@ -6580,10 +6580,10 @@ function iu({ gridContainerRef: e, state: t, setLoadingMessage: n, clearLoadingM }; } // node_modules/@tanstack/virtual-core/dist/esm/lazy-measurements.js -function au(e) { +function ou(e) { return typeof e == "object" ? e.key : e; } -function ou(e, t) { +function su(e, t) { let n = e.length; return new Proxy(e, { get(e, r, i) { if (typeof r == "string") { @@ -6612,7 +6612,7 @@ function ou(e, t) { } }); } // node_modules/@tanstack/virtual-core/dist/esm/utils.js -function su(e, t, n) { +function cu(e, t, n) { let r = n.initialDeps ?? [], i, a = !0; function o() { let o = e(); @@ -6622,34 +6622,34 @@ function su(e, t, n) { r = e; }, o; } -function cu(e, t) { +function lu(e, t) { if (e === void 0) throw Error(`Unexpected undefined${t ? `: ${t}` : ""}`); return e; } -var lu = (e, t) => Math.abs(e - t) < 1.01, uu = (e, t, n) => { +var uu = (e, t) => Math.abs(e - t) < 1.01, du = (e, t, n) => { let r; return Object.assign(function(...i) { e.clearTimeout(r), r = e.setTimeout(() => t.apply(this, i), n); }, { cancel: () => { e.clearTimeout(r); } }); -}, du, fu = () => { - if (du !== void 0) return du; - if (typeof navigator > "u") return du = !1; - if (/iP(hone|od|ad)/.test(navigator.userAgent)) return du = !0; +}, fu, pu = () => { + if (fu !== void 0) return fu; + if (typeof navigator > "u") return fu = !1; + if (/iP(hone|od|ad)/.test(navigator.userAgent)) return fu = !0; let e = navigator.maxTouchPoints; - return du = navigator.platform === "MacIntel" && e !== void 0 && e > 0; -}, pu = (e) => { + return fu = navigator.platform === "MacIntel" && e !== void 0 && e > 0; +}, mu = (e) => { let { offsetWidth: t, offsetHeight: n } = e; return { width: t, height: n }; -}, mu = (e) => e, hu = (e) => { +}, hu = (e) => e, gu = (e) => { let t = Math.max(e.startIndex - e.overscan, 0), n = Math.min(e.endIndex + e.overscan, e.count - 1) - t + 1, r = Array(n); for (let e = 0; e < n; e++) r[e] = t + e; return r; -}, gu = (e, t) => { +}, _u = (e, t) => { let n = e.scrollElement; if (!n) return; let r = e.targetWindow; @@ -6661,7 +6661,7 @@ var lu = (e, t) => Math.abs(e - t) < 1.01, uu = (e, t, n) => { height: Math.round(r) }); }; - if (i(pu(n)), !r.ResizeObserver) return () => {}; + if (i(mu(n)), !r.ResizeObserver) return () => {}; let a = new r.ResizeObserver((t) => { let r = () => { let e = t[0]; @@ -6675,28 +6675,28 @@ var lu = (e, t) => Math.abs(e - t) < 1.01, uu = (e, t, n) => { return; } } - i(pu(n)); + i(mu(n)); }; e.options.useAnimationFrameWithResizeObserver ? requestAnimationFrame(r) : r(); }); return a.observe(n, { box: "border-box" }), () => { a.unobserve(n); }; -}, _u = { passive: !0 }, vu = typeof window > "u" || "onscrollend" in window, yu = (e, t, n) => { +}, vu = { passive: !0 }, yu = typeof window > "u" || "onscrollend" in window, bu = (e, t, n) => { let r = e.scrollElement; if (!r) return; let i = e.targetWindow; if (!i) return; - let a = e.options.useScrollendEvent && vu, o = 0, s = a ? null : uu(i, () => t(n(r), !1), e.options.isScrollingResetDelay), c = (e) => () => { + let a = e.options.useScrollendEvent && yu, o = 0, s = a ? null : du(i, () => t(n(r), !1), e.options.isScrollingResetDelay), c = (e) => () => { o = n(r), s?.(), t(o, e); }, l = c(!0), u = c(!1); - return r.addEventListener("scroll", l, _u), a && r.addEventListener("scrollend", u, _u), () => { + return r.addEventListener("scroll", l, vu), a && r.addEventListener("scrollend", u, vu), () => { r.removeEventListener("scroll", l), a && r.removeEventListener("scrollend", u), s?.cancel(); }; -}, bu = (e, t) => yu(e, t, (t) => { +}, xu = (e, t) => bu(e, t, (t) => { let { horizontal: n, isRtl: r } = e.options; return n ? t.scrollLeft * (r && -1 || 1) : t.scrollTop; -}), xu = (e, t, n) => { +}), Su = (e, t, n) => { if (n.options.useCachedMeasurements) { let t = n.indexFromElement(e), r = n.options.getItemKey(t); return n.itemSizeCache.get(r) ?? n.options.estimateSize(t); @@ -6710,14 +6710,14 @@ var lu = (e, t) => Math.abs(e - t) < 1.01, uu = (e, t, n) => { if (i !== void 0) return i; } return e[n.options.horizontal ? "offsetWidth" : "offsetHeight"]; -}, Su = (e, { adjustments: t = 0, behavior: n }, r) => { +}, Cu = (e, { adjustments: t = 0, behavior: n }, r) => { var i, a; (a = (i = r.scrollElement)?.scrollTo) == null || a.call(i, { [r.options.horizontal ? "left" : "top"]: e + t, behavior: n }); }; -function Cu(e, t, n, r) { +function wu(e, t, n, r) { if (t === 0) return !1; let i = r(0), a = /* @__PURE__ */ new Set(), o = 0; for (; o < e;) { @@ -6731,7 +6731,7 @@ function Cu(e, t, n, r) { for (let e = s; e < t; e++) if (a.has(r(e))) return !1; return !0; } -var wu = class { +var Tu = class { constructor(e) { this.unsubs = [], this.scrollElement = null, this.targetWindow = null, this.isScrolling = !1, this.scrollState = null, this.measurementsCache = [], this._singleLaneMeasurements = null, this.itemSizeCache = /* @__PURE__ */ new Map(), this.itemSizeCacheVersion = 0, this.laneAssignments = /* @__PURE__ */ new Map(), this.pendingMin = null, this.prevLanes = void 0, this.lanesChangedFlag = !1, this.lanesSettling = !1, this.pendingScrollAnchor = null, this.scrollRect = null, this.scrollOffset = null, this.scrollDirection = null, this.scrollAdjustments = 0, this._iosDeferredAdjustment = 0, this._iosTouching = !1, this._iosJustTouchEnded = !1, this._iosTouchEndTimerId = null, this._intendedScrollOffset = null, this._clampedAdjustment = null, this.elementsCache = /* @__PURE__ */ new Map(), this.now = () => { var e; @@ -6771,10 +6771,10 @@ var wu = class { scrollPaddingStart: 0, scrollPaddingEnd: 0, horizontal: !1, - getItemKey: mu, - rangeExtractor: hu, + getItemKey: hu, + rangeExtractor: gu, onChange: () => {}, - measureElement: xu, + measureElement: Su, initialRect: { width: 0, height: 0 @@ -6801,13 +6801,13 @@ var wu = class { } let n = this.options, r = null, i = null, a = !1; if (n !== void 0 && n.enabled && t.enabled && t.anchorTo === "end" && this.scrollElement !== null) { - let e = n.count, o = t.count, s = this.getMeasurements(), c = this._singleLaneMeasurements?.items ?? s, l = (e) => au(c[e]), u = e > 0 ? l(0) : null, d = e > 0 ? l(e - 1) : null; + let e = n.count, o = t.count, s = this.getMeasurements(), c = this._singleLaneMeasurements?.items ?? s, l = (e) => ou(c[e]), u = e > 0 ? l(0) : null, d = e > 0 ? l(e - 1) : null; if (o !== e || e > 0 && o > 0 && (t.getItemKey(0) !== u || t.getItemKey(o - 1) !== d)) { a = !0; let c = e > 0 ? this.getVirtualItemForOffset(this.getScrollOffset()) ?? s[0] : null; c && (r = [c.key, this.getScrollOffset() - c.start]); let u = t.followOnAppend === !0 ? "auto" : t.followOnAppend || null; - u && o > 0 && this.isAtEnd(n.scrollEndThreshold) && (e === 0 || t.getItemKey(o - 1) !== d) && (o > e || Cu(e, o, l, t.getItemKey)) && (i = u); + u && o > 0 && this.isAtEnd(n.scrollEndThreshold) && (e === 0 || t.getItemKey(o - 1) !== d) && (o > e || wu(e, o, l, t.getItemKey)) && (i = u); } } this.options = t, a && (this.pendingMin = 0, this.itemSizeCacheVersion++); @@ -6832,7 +6832,7 @@ var wu = class { }, this.notify = (e) => { var t, n; (n = (t = this.options).onChange) == null || n.call(t, this, e); - }, this.maybeNotify = su(() => (this.calculateRange(), [ + }, this.maybeNotify = cu(() => (this.calculateRange(), [ this.isScrolling, this.range ? this.range.startIndex : null, this.range ? this.range.endIndex : null @@ -6870,11 +6870,11 @@ var wu = class { let e = this.scrollElement, t = () => { this._iosTouching = !0, this._iosJustTouchEnded = !1, this._iosTouchEndTimerId !== null && this.targetWindow != null && (this.targetWindow.clearTimeout(this._iosTouchEndTimerId), this._iosTouchEndTimerId = null); }, n = () => { - this._iosTouching = !1, fu() && this.targetWindow != null && (this._iosJustTouchEnded = !0, this._iosTouchEndTimerId = this.targetWindow.setTimeout(() => { + this._iosTouching = !1, pu() && this.targetWindow != null && (this._iosJustTouchEnded = !0, this._iosTouchEndTimerId = this.targetWindow.setTimeout(() => { this._iosJustTouchEnded = !1, this._iosTouchEndTimerId = null, this._flushIosDeferredIfReady(); }, 150)); }; - e.addEventListener("touchstart", t, _u), e.addEventListener("touchend", n, _u), this.unsubs.push(() => { + e.addEventListener("touchstart", t, vu), e.addEventListener("touchend", n, vu), this.unsubs.push(() => { e.removeEventListener("touchstart", t), e.removeEventListener("touchend", n), this._iosTouchEndTimerId !== null && this.targetWindow != null && (this.targetWindow.clearTimeout(this._iosTouchEndTimerId), this._iosTouchEndTimerId = null); }); } @@ -6886,7 +6886,7 @@ var wu = class { let t = this.pendingScrollAnchor; if (this.pendingScrollAnchor = null, t && this.scrollElement && this.options.enabled) { let [e, n, r, i] = t; - e !== null && !r && (fu() && (this.isScrolling || this._iosTouching || this._iosJustTouchEnded) ? i !== 0 && (this._iosDeferredAdjustment += i) : this.scrollState?.behavior === "smooth" && !lu(this.getScrollOffset() - i, this.scrollState.lastTargetOffset) || this._scrollToOffset(this.getScrollOffset(), { + e !== null && !r && (pu() && (this.isScrolling || this._iosTouching || this._iosJustTouchEnded) ? i !== 0 && (this._iosDeferredAdjustment += i) : this.scrollState?.behavior === "smooth" && !uu(this.getScrollOffset() - i, this.scrollState.lastTargetOffset) || this._scrollToOffset(this.getScrollOffset(), { adjustments: void 0, behavior: void 0 })), r && this.scrollToEnd({ behavior: r }); @@ -6915,7 +6915,7 @@ var wu = class { adjustments: this.scrollAdjustments += n, behavior: void 0 }); - }, this.rafId = null, this.getSize = () => this.options.enabled ? (this.scrollRect = this.scrollRect ?? this.options.initialRect, this.scrollRect[this.options.horizontal ? "width" : "height"]) : (this.scrollRect = null, 0), this.getScrollOffset = () => this.options.enabled ? (this.scrollOffset = this.scrollOffset ?? (typeof this.options.initialOffset == "function" ? this.options.initialOffset() : this.options.initialOffset), this.scrollOffset) : (this.scrollOffset = null, 0), this.getMeasurementOptions = su(() => [ + }, this.rafId = null, this.getSize = () => this.options.enabled ? (this.scrollRect = this.scrollRect ?? this.options.initialRect, this.scrollRect[this.options.horizontal ? "width" : "height"]) : (this.scrollRect = null, 0), this.getScrollOffset = () => this.options.enabled ? (this.scrollOffset = this.scrollOffset ?? (typeof this.options.initialOffset == "function" ? this.options.initialOffset() : this.options.initialOffset), this.scrollOffset) : (this.scrollOffset = null, 0), this.getMeasurementOptions = cu(() => [ this.options.count, this.options.paddingStart, this.options.scrollMargin, @@ -6933,7 +6933,7 @@ var wu = class { lanes: a, laneAssignmentMode: o, gap: s - }), { key: !1 }), this.isIndexInRange = (e) => e >= 0 && e < this.options.count, this.getMeasurements = su(() => [this.getMeasurementOptions(), this.itemSizeCacheVersion], ({ count: e, paddingStart: t, scrollMargin: n, getItemKey: r, enabled: i, lanes: a, laneAssignmentMode: o, gap: s }, c) => { + }), { key: !1 }), this.isIndexInRange = (e) => e >= 0 && e < this.options.count, this.getMeasurements = cu(() => [this.getMeasurementOptions(), this.itemSizeCacheVersion], ({ count: e, paddingStart: t, scrollMargin: n, getItemKey: r, enabled: i, lanes: a, laneAssignmentMode: o, gap: s }, c) => { let l = this.itemSizeCache; if (!i) return this.measurementsCache = [], this._singleLaneMeasurements = null, this.itemSizeCache.clear(), this.laneAssignments.clear(), []; if (this.laneAssignments.size > e) for (let t of this.laneAssignments.keys()) t >= e && this.laneAssignments.delete(t); @@ -6963,7 +6963,7 @@ var wu = class { flat: a, items: o }; - let d = ou(o, a); + let d = su(o, a); return this.measurementsCache = d, d; } let d = this.measurementsCache.slice(0, u), f = Array(a).fill(void 0), p = new Float64Array(a), m = 0; @@ -6999,15 +6999,15 @@ var wu = class { }, { key: !1, debug: () => this.options.debug - }), this.calculateRange = su(() => [ + }), this.calculateRange = cu(() => [ this.getMeasurements(), this.getSize(), this.getScrollOffset(), this.options.lanes - ], (e, t, n, r) => e.length === 0 || t === 0 ? (this.range = null, null) : (this.range = Du(e, t, n, r, r === 1 && this._singleLaneMeasurements !== null ? this._singleLaneMeasurements.flat : null), this.range), { + ], (e, t, n, r) => e.length === 0 || t === 0 ? (this.range = null, null) : (this.range = Ou(e, t, n, r, r === 1 && this._singleLaneMeasurements !== null ? this._singleLaneMeasurements.flat : null), this.range), { key: !1, debug: () => this.options.debug - }), this.getVirtualIndexes = su(() => { + }), this.getVirtualIndexes = cu(() => { let e = null, t = null, n = this.calculateRange(); return n && (e = n.startIndex, t = n.endIndex), this.maybeNotify.updateDeps([ this.isScrolling, @@ -7073,7 +7073,7 @@ var wu = class { let f = !1; a ? f = this.applyScrollAdjustment(this.getTotalSize() - c) : d && (f = this.applyScrollAdjustment(s)), this.notify(f), this._retryClampedAdjustment(); } - }, this.getVirtualItems = su(() => [this.getVirtualIndexes(), this.getMeasurements()], (e, t) => { + }, this.getVirtualItems = cu(() => [this.getVirtualIndexes(), this.getMeasurements()], (e, t) => { let n = []; for (let r = 0, i = e.length; r < i; r++) { let i = t[e[r]]; @@ -7087,7 +7087,7 @@ var wu = class { let t = this.getMeasurements(); if (t.length === 0) return; let n = this._singleLaneMeasurements?.flat, r = this.options.lanes === 1 && n != null; - return cu(t[Tu(0, t.length - 1, r ? (e) => n[e * 2] : (e) => cu(t[e]).start, e)]); + return lu(t[Eu(0, t.length - 1, r ? (e) => n[e * 2] : (e) => lu(t[e]).start, e)]); }, this.getMaxScrollOffset = () => { if (!this.scrollElement) return 0; if ("scrollHeight" in this.scrollElement) return this.options.horizontal ? this.scrollElement.scrollWidth - this.scrollElement.clientWidth : this.scrollElement.scrollHeight - this.scrollElement.clientHeight; @@ -7200,7 +7200,7 @@ var wu = class { } applyScrollAdjustment(e, t) { if (e === 0) return !1; - if (fu() && (this.isScrolling || this._iosTouching || this._iosJustTouchEnded)) return this._iosDeferredAdjustment += e, !1; + if (pu() && (this.isScrolling || this._iosTouching || this._iosJustTouchEnded)) return this._iosDeferredAdjustment += e, !1; { let n = this.getScrollOffset() + this.scrollAdjustments + e, r = this.scrollElement, i = r !== null && ("scrollHeight" in r || "document" in r) ? this.getMaxScrollOffset() : null; return this._clampedAdjustment = i !== null && n > i + .5 ? { @@ -7224,7 +7224,7 @@ var wu = class { return; } let e = this.scrollState.index == null ? void 0 : this.getOffsetForIndex(this.scrollState.index, this.scrollState.align), t = e ? e[0] : this.scrollState.lastTargetOffset, n = t !== this.scrollState.lastTargetOffset; - if (!n && lu(t, this.getScrollOffset())) { + if (!n && uu(t, this.getScrollOffset())) { if (this.scrollState.stableFrames++, this.scrollState.stableFrames >= 1) { this.getScrollOffset() !== t && this._scrollToOffset(t, { adjustments: void 0, @@ -7241,7 +7241,7 @@ var wu = class { } this.scheduleScrollReconcile(); } -}, Tu = (e, t, n, r) => { +}, Eu = (e, t, n, r) => { for (; e <= t;) { let i = (e + t) / 2 | 0, a = n(i); if (a < r) e = i + 1; @@ -7250,7 +7250,7 @@ var wu = class { } return e > 0 ? e - 1 : 0; }; -function Eu(e, t, n) { +function Du(e, t, n) { let r = 0; for (; r <= t;) { let i = (r + t) / 2 | 0, a = e[i * 2]; @@ -7260,21 +7260,21 @@ function Eu(e, t, n) { } return r > 0 ? r - 1 : 0; } -function Du(e, t, n, r, i) { +function Ou(e, t, n, r, i) { let a = e.length - 1; if (e.length <= r) return { startIndex: 0, endIndex: a }; if (r === 1 && i !== null) { - let e = Eu(i, a, n), r = e, o = n + t; + let e = Du(i, a, n), r = e, o = n + t; for (; r < a && i[r * 2] + i[r * 2 + 1] < o;) r++; return { startIndex: e, endIndex: r }; } - let o = Tu(0, a, (t) => e[t].start, n), s = o; + let o = Eu(0, a, (t) => e[t].start, n), s = o; if (r === 1) for (; s < a && e[s].end < n + t;) s++; else if (r > 1) { let i = Array(r).fill(0); @@ -7295,34 +7295,34 @@ function Du(e, t, n, r, i) { }; } // node_modules/@tanstack/vue-virtual/dist/esm/index.js -function Ou(e) { - let t = new wu(Z(e)), n = vr(t), r = t._didMount(); - return cr(() => Z(e).getScrollElement(), (e) => { +function ku(e) { + let t = new Tu(Z(e)), n = yr(t), r = t._didMount(); + return lr(() => Z(e).getScrollElement(), (e) => { e && t._willUpdate(); - }, { immediate: !0 }), cr(() => Z(e), (e) => { + }, { immediate: !0 }), lr(() => Z(e), (e) => { t.setOptions({ ...e, onChange: (t, r) => { var i; - br(n), (i = e.onChange) == null || i.call(e, t, r); + xr(n), (i = e.onChange) == null || i.call(e, t, r); } - }), t._willUpdate(), br(n); - }, { immediate: !0 }), Tr(r), n; + }), t._willUpdate(), xr(n); + }, { immediate: !0 }), Er(r), n; } -function ku(e) { - return Ou(K(() => ({ - observeElementRect: gu, - observeElementOffset: bu, - scrollToFn: Su, +function Au(e) { + return ku(K(() => ({ + observeElementRect: _u, + observeElementOffset: xu, + scrollToFn: Cu, ...Z(e) }))); } // ui/vue/grid/useGridVirtualRows.ts -function Au(e, t = 0) { +function ju(e, t = 0) { let n = Number(Z(e)); return Number.isFinite(n) ? n : t; } -function ju(e = [], t = 1) { +function Mu(e = [], t = 1) { let n = Array.isArray(e) ? e : [], r = Math.max(1, Number(t) || 1), i = []; for (let e = 0; e < n.length; e += r) i.push({ index: Math.floor(e / r), @@ -7330,22 +7330,22 @@ function ju(e = [], t = 1) { }); return i; } -function Mu(e = [], t = 0, n = 1) { +function Nu(e = [], t = 0, n = 1) { let r = Array.isArray(e) ? e : [], i = Math.max(1, Number(n) || 1), a = Math.max(0, Number(t) || 0) * i; return r.slice(a, a + i); } -function Nu({ scrollRef: e, items: t, rows: n, columnCount: r, estimateRowHeight: i, overscan: a = 8, enabled: o = !0, measure: s = xu } = {}) { +function Pu({ scrollRef: e, items: t, rows: n, columnCount: r, estimateRowHeight: i, overscan: a = 8, enabled: o = !0, measure: s = Su } = {}) { let c = K(() => { if (!Z(o)) return 0; let e = Z(n); if (Array.isArray(e)) return e.length; - let i = Z(t) || [], a = Math.max(1, Au(r, 1)); + let i = Z(t) || [], a = Math.max(1, ju(r, 1)); return Math.ceil((Array.isArray(i) ? i.length : 0) / a); - }), l = ku(K(() => ({ + }), l = Au(K(() => ({ count: c.value, getScrollElement: () => Z(e) || null, - estimateSize: () => Math.max(1, Au(i, 120)), - overscan: Math.max(0, Au(a, 8)), + estimateSize: () => Math.max(1, ju(i, 120)), + overscan: Math.max(0, ju(a, 8)), measureElement: s }))); return { @@ -7365,27 +7365,27 @@ function Nu({ scrollRef: e, items: t, rows: n, columnCount: r, estimateRowHeight groupKey: String(n?.groupKey || "") }; }); - let i = Z(t) || [], a = Math.max(1, Au(r, 1)); + let i = Z(t) || [], a = Math.max(1, ju(r, 1)); return l.value.getVirtualItems().map((e) => ({ key: e.key, index: e.index, virtual: e, - items: Mu(i, e.index, a), + items: Nu(i, e.index, a), kind: "assets", title: "", groupKey: "" })); }), totalSize: K(() => l.value.getTotalSize()), - getRowItems: (e) => Mu(Z(t) || [], e, Au(r, 1)) + getRowItems: (e) => Nu(Z(t) || [], e, ju(r, 1)) }; } // ui/vue/grid/useInfiniteTrigger.ts -function Pu(e, t = !0) { +function Fu(e, t = !0) { let n = Z(e); return n == null ? t : !!n; } -function Fu({ rootRef: e, enabled: t = !0, canLoad: n = !0, loadMore: r, rootMargin: i = "900px", threshold: a = .01 } = {}) { +function Iu({ rootRef: e, enabled: t = !0, canLoad: n = !0, loadMore: r, rootMargin: i = "900px", threshold: a = .01 } = {}) { let o = Q(null), s = null, c = !1; function l() { try { @@ -7396,7 +7396,7 @@ function Fu({ rootRef: e, enabled: t = !0, canLoad: n = !0, loadMore: r, rootMar s = null; } async function u() { - if (!c && Pu(t, !0) && Pu(n, !0) && typeof r == "function") { + if (!c && Fu(t, !0) && Fu(n, !0) && typeof r == "function") { c = !0; try { await r(); @@ -7416,7 +7416,7 @@ function Fu({ rootRef: e, enabled: t = !0, canLoad: n = !0, loadMore: r, rootMar threshold: a }), s.observe(t)); } - return fr() && (jr(d), pr(l), cr(() => [Z(e), o.value], () => d(), { flush: "post" })), { + return pr() && (Mr(d), mr(l), lr(() => [Z(e), o.value], () => d(), { flush: "post" })), { sentinelRef: o, connect: d, disconnect: l, @@ -7424,18 +7424,18 @@ function Fu({ rootRef: e, enabled: t = !0, canLoad: n = !0, loadMore: r, rootMar }; } // ui/vue/grid/useGridDisplayAssets.ts -function Iu(e) { - let t = At(e?.filename); +function Lu(e) { + let t = jt(e?.filename); return t ? `${String(e?.source || e?.type || "").trim().toLowerCase()}|${String(e?.root_id || e?.custom_root_id || "").trim().toLowerCase()}|${String(e?.subfolder || "").trim().toLowerCase()}|${t}` : ""; } -function Lu(e) { +function Ru(e) { return !!e; } -function Ru(e) { +function zu(e) { let t = Array.isArray(e) ? e : [], n = /* @__PURE__ */ new Map(), r = []; for (let e of t) { if (!e) continue; - let t = Iu(e); + let t = Lu(e); if (!t) { e._mjrNameCollision = !1, delete e._mjrNameCollisionCount, delete e._mjrNameCollisionPaths, e._mjrDupStack = !1, e._mjrDupMembers = null, e._mjrDupCount = 0, r.push(e); continue; @@ -7453,7 +7453,7 @@ function Ru(e) { return r; } // ui/vue/components/grid/VirtualAssetGridHost.vue?vue&type=script&setup=true&lang.ts -var zu = { +var Bu = { key: 0, class: "mjr-grid-loading-overlay", style: { @@ -7468,19 +7468,19 @@ var zu = { background: "rgba(20,22,28,0.55)", "backdrop-filter": "blur(2px)" } -}, Bu = { style: { width: "100%" } }, Vu = { style: { +}, Vu = { style: { width: "100%" } }, Hu = { style: { "margin-top": "10px", "font-size": "12px", opacity: "0.68", "text-align": "center" -} }, Hu = ["data-index"], Uu = [ +} }, Uu = ["data-index"], Wu = [ "aria-expanded", "title", "onClick" -], Wu = { +], Gu = { class: "mjr-grid-group-separator-chevron", "aria-hidden": "true" -}, Gu = { class: "mjr-grid-group-separator-title" }, Ku = [ +}, Ku = { class: "mjr-grid-group-separator-title" }, qu = [ "data-mjr-asset-id", "data-mjr-filename-key", "data-mjr-ext", @@ -7496,21 +7496,21 @@ var zu = { "onMousedown", "onClick", "onDblclick" -], qu = { +], Ju = { key: 3, style: { display: "flex", "flex-direction": "column", width: "100%" } -}, Ju = [ +}, Yu = [ "aria-expanded", "title", "onClick" -], Yu = { +], Xu = { class: "mjr-grid-group-separator-chevron", "aria-hidden": "true" -}, Xu = { class: "mjr-grid-group-separator-title" }, Zu = [ +}, Zu = { class: "mjr-grid-group-separator-title" }, Qu = [ "data-mjr-asset-id", "data-mjr-filename-key", "data-mjr-ext", @@ -7526,7 +7526,7 @@ var zu = { "onMousedown", "onClick", "onDblclick" -], Qu = 501, $u = /* @__PURE__ */ dr({ +], $u = 501, ed = /* @__PURE__ */ fr({ __name: "VirtualAssetGridHost", props: { scrollElement: { default: null }, @@ -7556,10 +7556,10 @@ var zu = { Q(!0); let s = Q(0), c = Q(0), l = /* @__PURE__ */ new WeakMap(), u = 0, d = 0, f = 0, p = 0, m = 0, h = /* @__PURE__ */ new Map(), g = null, _ = null; function v() { - return g ||= import("./chunks/viewerOpenRequest-Crw9UWH5.js").then((e) => e.n), g; + return g ||= import("./chunks/viewerOpenRequest-POEAWUHf.js").then((e) => e.n), g; } function b() { - return _ ||= import("./chunks/floatingViewerManager-Gv7MTmpu.js").then((e) => e.n), _; + return _ ||= import("./chunks/floatingViewerManager-DGIaL-BQ.js").then((e) => e.n), _; } function x(e) { return (Array.isArray(e) ? e : []).slice().sort((e, t) => { @@ -7567,7 +7567,7 @@ var zu = { return (Number(t?.mtime || t?.created_at || 0) || 0) - n; }); } - or("mjrStackService", { + sr("mjrStackService", { openStackGroup: async (e) => { let t = i.value; if (!t || !e) return; @@ -7578,7 +7578,7 @@ var zu = { let a = t._mjrStackMembersCache.get(r); if (!Array.isArray(a)) { let e = h.get(r); - e || (e = re(nt(n, { limit: Qu }), { timeoutMs: 3e4 }).finally(() => { + e || (e = re(rt(n, { limit: $u }), { timeoutMs: 3e4 }).finally(() => { h.delete(r); }), h.set(r, e)); let i = await e; @@ -7611,13 +7611,13 @@ var zu = { })); } }); - let { state: S, selectedIdSet: C, setLoadingMessage: w, clearLoadingMessage: T, setStatusMessage: E, clearStatusMessage: D, resetAssets: O, setSelection: k, reconcileSelection: A, getSelectedAssets: j, getActiveAsset: M } = mc(); + let { state: S, selectedIdSet: C, setLoadingMessage: w, clearLoadingMessage: T, setStatusMessage: E, clearStatusMessage: D, resetAssets: O, setSelection: k, reconcileSelection: A, getSelectedAssets: j, getActiveAsset: M } = hc(); function N(e) { return e ? typeof e == "object" && "value" in e ? e.value || null : e : null; } let P = K(() => N(r.scrollElement)); function ee() { - return Rl(i.value); + return zl(i.value); } function te(e, { align: t = "auto" } = {}) { let n = String(e || "").trim(); @@ -7642,9 +7642,9 @@ var zu = { } } function F() { - return vc(i.value, P.value); + return yc(i.value, P.value); } - let I = iu({ + let I = au({ gridContainerRef: i, state: S, setLoadingMessage: w, @@ -7658,7 +7658,7 @@ var zu = { readRenderedCards: ee, scrollToAssetId: te, canLoadMore: F - }), { sentinelRef: ne } = Fu({ + }), { sentinelRef: ne } = Iu({ rootRef: P, enabled: !0, canLoad: K(() => !S.loading && !S.done && F()), @@ -7751,7 +7751,7 @@ var zu = { let e = i.value; if (!e) return; let t = new Set((Array.isArray(S.selectedIds) ? S.selectedIds : []).map((e) => String(e || "").trim()).filter(Boolean)); - $n(e, t, S.activeId || ""); + er(e, t, S.activeId || ""); try { t.size ? e.dataset.mjrSelectedAssetId = String(S.activeId || Array.from(t)[0] || "") : delete e.dataset.mjrSelectedAssetId; } catch (e) { @@ -7781,7 +7781,7 @@ var zu = { } } ve._lastSelectionKey = ""; - let ye = K(() => Ru(S.assets)), be = K(() => (Array.isArray(ye.value) ? ye.value : []).filter((e) => Lu(e))), xe = Q(/* @__PURE__ */ new Set()), Se = Q(""), Ce = K(() => { + let ye = K(() => zu(S.assets)), be = K(() => (Array.isArray(ye.value) ? ye.value : []).filter((e) => Ru(e))), xe = Q(/* @__PURE__ */ new Set()), Se = Q(""), Ce = K(() => { s.value; let e = ue(B.WORKFLOW_GRID_GROUP_BY); return e === "none" || Se.value !== "workflow" ? "none" : e; @@ -7791,7 +7791,7 @@ var zu = { let t = Ce.value; return t === "none" ? [] : me(e, ze.value, t); }); - cr(() => `${Ce.value}::${we.value.map((e) => `${e.kind}:${e.groupKey}`).join("|")}`, () => { + lr(() => `${Ce.value}::${we.value.map((e) => `${e.kind}:${e.groupKey}`).join("|")}`, () => { if (Ce.value === "none") { xe.value = /* @__PURE__ */ new Set(); return; @@ -7819,10 +7819,10 @@ var zu = { for (let e = 0; e < t.length; e += 1) n = (n << 5) - n + t.charCodeAt(e) | 0; return `mjr-grid-group-separator--accent-${Math.abs(n) % 8}`; } - let ke = K(() => { + let Oe = K(() => { let e = Array.isArray(be.value) ? be.value : []; if (!e.length) return []; - if (Ce.value === "none") return ju(e, ze.value); + if (Ce.value === "none") return Mu(e, ze.value); let t = Array.isArray(we.value) ? we.value : [], n = []; for (let e of t) e?.kind === "header" ? n.push(e) : Te(String(e?.groupKey || "")) || n.push(e); return n; @@ -7861,20 +7861,20 @@ var zu = { console.debug?.(e); } } - function Pe(e, t = 6) { + function Ne(e, t = 6) { let n = S.cardElements.get(e); if (n) try { n.focus?.({ preventScroll: !0 }); } catch (e) { console.debug?.(e); } - else t <= 0 || requestAnimationFrame(() => Pe(e, t - 1)); + else t <= 0 || requestAnimationFrame(() => Ne(e, t - 1)); } function Fe(e) { let t = e?.detail || {}, n = String(t.assetId ?? t.id ?? "").trim(); - n && (Array.isArray(be.value) ? be.value : []).some((e) => String(e?.id || "") === n) && (k([n], n), _e(), ve(), te(n, { align: "center" }), setTimeout(() => Pe(n), 0)); + n && (Array.isArray(be.value) ? be.value : []).some((e) => String(e?.id || "") === n) && (k([n], n), _e(), ve(), te(n, { align: "center" }), setTimeout(() => Ne(n), 0)); } - function Le(e) { + function Ie(e) { if (!e) return; e._mjrSelectionManagedByVue = !0; try { @@ -7887,9 +7887,9 @@ var zu = { } catch (e) { console.debug?.(e); } - mi(e, { applySettingsClasses: r.applyDefaultSettingsClasses }); + hi(e, { applySettingsClasses: r.applyDefaultSettingsClasses }); try { - pt = ts(e); + pt = ns(e); } catch (e) { console.debug?.(e), pt = null; } @@ -7904,7 +7904,7 @@ var zu = { e._mjrRemoveAssets = t, e._mjrGetRenderedCards = () => ee(), e._mjrScrollToAssetId = (e, t = {}) => { te(e, t); }, e._mjrHasAssetId = (e) => (Array.isArray(S.assets) ? S.assets : []).some((t) => String(t?.id || "") === String(e || "")), e._mjrGetGridState = () => S, e._mjrGetSelectedAssets = () => j(), e._mjrGetActiveAsset = () => M(), e._mjrOnKeyboardAssetChanged = (e) => je(e), e._mjrOpenKeyboardDetails = () => Me(); - let n = () => (r.applyDefaultSettingsClasses && (pi(e), s.value += 1), I.refreshGrid()), i = () => { + let n = () => (r.applyDefaultSettingsClasses && (mi(e), s.value += 1), I.refreshGrid()), i = () => { I.prepareGridForScopeSwitch(), I.dispose(), S.cardElements.clear(), e._mjrGridApi = null; }; e._mjrGridApi = { @@ -7925,11 +7925,11 @@ var zu = { getDebugSnapshot: () => I.getDebugSnapshot() }, e._mjrLoadAssets = (...e) => I.loadAssets(...e), e._mjrLoadAssetsFromList = (...e) => I.loadAssetsFromList(...e), e._mjrPrepareForScopeSwitch = () => I.prepareGridForScopeSwitch(), e._mjrRefreshGrid = n, e._mjrCaptureAnchor = () => I.captureAnchor(), e._mjrRestoreAnchor = (e) => I.restoreAnchor(e), e._mjrHydrateFromSnapshot = (...e) => I.hydrateFromSnapshot(...e), e._mjrUpsertAsset = (e) => I.upsertAsset(e), e._mjrUpsertAssetNow = (e) => I.upsertAssetNow(e), e._mjrGetCanonicalState = () => I.getCanonicalState(), e._mjrGetDebugSnapshot = () => I.getDebugSnapshot(), e._mjrDispose = i; } - cr(i, (e) => { - e && (Le(e), _e(), Ae()); - }, { immediate: !0 }), cr(() => `${(S.selectedIds || []).join("|")}::${String(S.activeId || "")}`, () => { + lr(i, (e) => { + e && (Ie(e), _e(), Ae()); + }, { immediate: !0 }), lr(() => `${(S.selectedIds || []).join("|")}::${String(S.activeId || "")}`, () => { i.value && (_e(), ve()); - }, { flush: "post" }), cr(() => `${Array.isArray(be.value) ? be.value.length : 0}::${Number(S.total || 0)}::${Number(S.hiddenPngSiblings || 0)}`, () => { + }, { flush: "post" }), lr(() => `${Array.isArray(be.value) ? be.value.length : 0}::${Number(S.total || 0)}::${Number(S.hiddenPngSiblings || 0)}`, () => { i.value && Ae(); }, { flush: "post", @@ -7950,7 +7950,7 @@ var zu = { s.value; let e = !!B.GRID_SHOW_DETAILS, t = He.value, n = e ? 82 : 0; return Ce.value === "none" ? t + n + Ve.value : Math.max(48, t + n + Ve.value); - }), We = K(() => r.virtualize ? [] : Array.isArray(ke.value) ? ke.value : []); + }), We = K(() => r.virtualize ? [] : Array.isArray(Oe.value) ? Oe.value : []); function Ge(e) { if (!d) try { d = requestAnimationFrame(() => { @@ -7987,10 +7987,10 @@ var zu = { } c.value = 0; } - let qe = Nu({ + let qe = Pu({ scrollRef: P, items: be, - rows: ke, + rows: Oe, columnCount: ze, estimateRowHeight: Ue, overscan: K(() => { @@ -8000,14 +8000,14 @@ var zu = { return Math.max(3, Math.min(30, n + r)); }), enabled: K(() => r.virtualize) - }), Je = qe.rowCount, Ye = qe.virtualizer, Xe = qe.virtualRows, Qe = qe.totalSize, $e = K(() => { + }), Je = qe.rowCount, Ye = qe.virtualizer, Xe = qe.virtualRows, Ze = qe.totalSize, $e = K(() => { let e = /* @__PURE__ */ new Map(); for (let t of Xe.value) e.set(t.index, t.virtual || t); return e; }), et = K(() => (s.value, !!B.GRID_SHOW_DETAILS)), z = K(() => { let e = Math.max(1, Number(ze.value || 1)); return Math.max(12, Math.min(36, e * 4)); - }), tt = K(() => Array.from({ length: Number(z.value || 12) }, (e, t) => t)), rt = K(() => { + }), tt = K(() => Array.from({ length: Number(z.value || 12) }, (e, t) => t)), nt = K(() => { let e = Math.max(80, Number(Ue.value || 0) - Number(Ve.value || 0)), t = Math.max(80, Number(He.value || 0)); return Math.max(0, e - t); }), it = K(() => ({ @@ -8050,7 +8050,7 @@ var zu = { animation: "mjr-skeleton-shimmer 2.2s ease-in-out infinite" })), lt = K(() => ({ display: et.value ? "block" : "none", - minHeight: `${Math.max(0, Number(rt.value || 0))}px` + minHeight: `${Math.max(0, Number(nt.value || 0))}px` })); function ut() { let e = Number(P.value?.clientWidth || 0) || Number(i.value?.clientWidth || 0) || 0; @@ -8079,9 +8079,9 @@ var zu = { 400 ]) setTimeout(e, t); } - jr(() => { + Mr(() => { gt(), window.addEventListener(V.VIEWER_ACTIVE_ASSET_CHANGED, Fe); - }), cr(i, (e) => { + }), lr(i, (e) => { try { ft?.disconnect?.(); } catch (e) { @@ -8100,7 +8100,7 @@ var zu = { console.debug?.(e), ft = null; } } - }, { immediate: !0 }), cr(P, (e, t) => { + }, { immediate: !0 }), lr(P, (e, t) => { try { dt?.disconnect?.(); } catch (e) { @@ -8116,14 +8116,14 @@ var zu = { console.debug?.(e), dt = null; } } - }, { immediate: !0 }), cr(() => Je.value, async () => { - Be.value && (await lr(), bt(), Bt()); - }), cr(() => S.assets, async (e) => { + }, { immediate: !0 }), lr(() => Je.value, async () => { + Be.value && (await ur(), bt(), Bt()); + }), lr(() => S.assets, async (e) => { if (!Array.isArray(e) || e.length === 0) { let e = i.value; e?._mjrStackMembersCache && e._mjrStackMembersCache.clear(); } - await lr(), bt(); + await ur(), bt(); }); function _t(e, t) { let n = String(t?.filename || "").trim().toLowerCase(), r = l.get(e); @@ -8150,11 +8150,11 @@ var zu = { if (!t) return; let n = S.renderedFilenameMap.get(t), r = Array.from(n || []); if (!r.length) return; - let i = (Array.isArray(S.assets) ? S.assets : []).filter((e) => String(e?.filename || "").trim().toLowerCase() === t), a = Math.max(Number(S.filenameCounts?.get?.(t) || 0) || 0, i.length), o = Pt(i), s = r.find((e) => { + let i = (Array.isArray(S.assets) ? S.assets : []).filter((e) => String(e?.filename || "").trim().toLowerCase() === t), a = Math.max(Number(S.filenameCounts?.get?.(t) || 0) || 0, i.length), o = Ft(i), s = r.find((e) => { let t = String(e._mjrAsset?.id || ""), n = String(o?.id || ""); return t && n && t === n; }) || r[0] || r[0] || null, c = s?._mjrAsset || o || i[0] || null; - qt(c, i); + Jt(c, i); for (let e of r) { delete e.dataset.mjrDupHidden; let t = e._mjrAsset; @@ -8327,11 +8327,11 @@ var zu = { e(R("toast.workflowMissingPath", "Workflow file path is missing."), "error"); return; } - let r = Ze(); - if (Ie(r) === !0 && !await Ut(R("dialog.workflowLoadReplaceDirty", "Current canvas has unsaved changes. Replace it with this workflow?"), R("tab.workflow", "Workflow"))) return; + let r = Qe(); + if (Le(r) === !0 && !await Wt(R("dialog.workflowLoadReplaceDirty", "Current canvas has unsaved changes. Replace it with this workflow?"), R("tab.workflow", "Workflow"))) return; let i = await y(n, { timeoutMs: 3e4 }), o = i?.data?.workflow || i?.workflow || null; if (!i?.ok || !o || typeof o != "object") e(i?.error || R("toast.workflowLoadFailed", "Failed to load workflow."), "error"); - else if (!Ne(o, r).ok) e(R("toast.workflowImportUnavailable", "ComfyUI workflow import is unavailable in this frontend."), "error"); + else if (!Pe(o, r).ok) e(R("toast.workflowImportUnavailable", "ComfyUI workflow import is unavailable in this frontend."), "error"); else { try { await a({ filepath: n }, { timeoutMs: 1e4 }); @@ -8367,7 +8367,7 @@ var zu = { async function Nt({ asset: t, folderPath: n }) { let r = String(t?.filepath || "").trim(); if (r && n) try { - let t = await Oe({ + let t = await ke({ op: "move_file", path: r, destination: n @@ -8377,7 +8377,7 @@ var zu = { e(t?.message || "Failed to move file", "error"); } } - let Ft = null, It = null, Lt = 0, Rt = ""; + let Pt = null, It = null, Lt = 0, Rt = ""; function zt() { ut(); try { @@ -8438,15 +8438,15 @@ var zu = { Ke(); }; } - cr(P, (e) => { + lr(P, (e) => { try { - Ft?.(); + Pt?.(); } catch (e) { console.debug?.(e); } - Ft = Ht(e); + Pt = Ht(e); }, { immediate: !0 }); - function Wt(e) { + function Ut(e) { let t = Number(e?.clientHeight || 0) || 0; if (t > 0) return t; let n = Number(i.value?.clientHeight || 0) || 0; @@ -8462,7 +8462,7 @@ var zu = { let e = P.value; if (!e) return; let t = Array.isArray(S.assets) ? S.assets.length : 0, n = `${t}::${ze.value}`; - if (!It && !(n === Rt && Date.now() - Lt < 500) && (await lr(), (Number(e.scrollHeight || 0) || 0) <= Wt(e) + 40)) { + if (!It && !(n === Rt && Date.now() - Lt < 500) && (await ur(), (Number(e.scrollHeight || 0) || 0) <= Ut(e) + 40)) { let e = t; It = Promise.resolve(I.loadNextPage()).catch((e) => console.debug?.(e)).finally(() => { let t = Array.isArray(S.assets) ? S.assets.length : 0; @@ -8472,7 +8472,7 @@ var zu = { }); } } - cr(() => `${Array.isArray(S.assets) ? S.assets.length : 0}::${ze.value}::${S.loading}::${S.done}`, () => { + lr(() => `${Array.isArray(S.assets) ? S.assets.length : 0}::${ze.value}::${S.loading}::${S.done}`, () => { Gt(); }, { flush: "post" }); function Kt(e) { @@ -8482,7 +8482,7 @@ var zu = { console.debug?.(e); } } - function Jt() { + function qt() { return { width: `${He.value}px`, flex: `0 0 ${He.value}px`, @@ -8515,11 +8515,11 @@ var zu = { }; } function Qt() { - s.value += 1, r.applyDefaultSettingsClasses && i.value && pi(i.value); + s.value += 1, r.applyDefaultSettingsClasses && i.value && mi(i.value); } - return cr(() => r.applyDefaultSettingsClasses, () => { - i.value && r.applyDefaultSettingsClasses && pi(i.value); - }, { immediate: !0 }), pr(() => { + return lr(() => r.applyDefaultSettingsClasses, () => { + i.value && r.applyDefaultSettingsClasses && mi(i.value); + }, { immediate: !0 }), mr(() => { try { window.removeEventListener(V.VIEWER_ACTIVE_ASSET_CHANGED, Fe); } catch (e) { @@ -8546,7 +8546,7 @@ var zu = { console.debug?.(e); } try { - Ft?.(); + Pt?.(); } catch (e) { console.debug?.(e); } @@ -8577,7 +8577,7 @@ var zu = { } catch (e) { console.debug?.(e); } - }), cr(i, (e) => { + }), lr(i, (e) => { e && (mt ||= (window.addEventListener("mjr-settings-changed", Qt), window.addEventListener("mjr:keepalive-attached", Vt), !0)); }, { immediate: !0 }), n({ get gridContainer() { @@ -8645,27 +8645,27 @@ var zu = { "min-height": "100%" } }, [ - Z(S).loading && !Z(S).assets.length ? (q(), X("div", zu, [U("div", Bu, [U("div", { + Z(S).loading && !Z(S).assets.length ? (q(), X("div", Bu, [U("div", Vu, [U("div", { class: "mjr-grid-skeleton-layout", - style: xr(it.value) - }, [(q(!0), X(H, null, hr(tt.value, (e) => (q(), X("div", { + style: Sr(it.value) + }, [(q(!0), X(H, null, gr(tt.value, (e) => (q(), X("div", { key: `sk-${e}`, class: "mjr-grid-skeleton-card", - style: xr(at.value) + style: Sr(at.value) }, [U("div", { class: "mjr-grid-skeleton-thumb mjr-grid-skeleton-shimmer", - style: xr(ot.value) - }, null, 4), U("div", { style: xr(lt.value) }, [U("div", { + style: Sr(ot.value) + }, null, 4), U("div", { style: Sr(lt.value) }, [U("div", { class: "mjr-grid-skeleton-line mjr-grid-skeleton-line--title mjr-grid-skeleton-shimmer", - style: xr(st.value) + style: Sr(st.value) }, null, 4), U("div", { class: "mjr-grid-skeleton-line mjr-grid-skeleton-line--meta mjr-grid-skeleton-shimmer", - style: xr(ct.value) - }, null, 4)], 4)], 4))), 128))], 4), U("div", Vu, J(Z(S).loadingMessage || "Loading assets..."), 1)])])) : G("", !0), + style: Sr(ct.value) + }, null, 4)], 4)], 4))), 128))], 4), U("div", Hu, J(Z(S).loadingMessage || "Loading assets..."), 1)])])) : G("", !0), Z(S).statusMessage && !Z(S).assets.length && !Z(S).loading ? (q(), X("div", { key: 1, class: "mjr-grid-message", - style: xr({ + style: Sr({ position: "absolute", inset: "0", zIndex: 3, @@ -8683,35 +8683,35 @@ var zu = { }, J(Z(S).statusMessage), 5)) : G("", !0), t.virtualize ? (q(), X("div", { key: 2, - style: xr({ - height: `${Z(Qe)}px`, + style: Sr({ + height: `${Z(Ze)}px`, position: "relative", width: "100%", gridColumn: "1 / -1" }) - }, [(q(!0), X(H, null, hr(Z(Xe), (e) => (q(), X("div", { + }, [(q(!0), X(H, null, gr(Z(Xe), (e) => (q(), X("div", { key: e.key, ref_for: !0, ref: Kt, "data-index": e.index, - style: xr(Xt(e.index)) + style: Sr(Xt(e.index)) }, [e.kind === "header" ? (q(), X("button", { key: 0, type: "button", - class: Er(["mjr-grid-group-separator", De(e)]), + class: Dr(["mjr-grid-group-separator", De(e)]), "aria-expanded": Te(e.groupKey) ? "false" : "true", title: `${Te(e.groupKey) ? "Open" : "Close"} group`, onClick: (t) => Ee(e.groupKey) - }, [U("span", Wu, [U("i", { class: Er(["pi", Te(e.groupKey) ? "pi-chevron-down" : "pi-chevron-up"]) }, null, 2)]), U("span", Gu, J(e.title), 1)], 10, Uu)) : e.items.length ? (q(!0), X(H, { key: 1 }, hr(e.items, (e) => (q(), X(H, { key: String(e.id) }, [L(e) ? (q(), ir(fc, { + }, [U("span", Gu, [U("i", { class: Dr(["pi", Te(e.groupKey) ? "pi-chevron-down" : "pi-chevron-up"]) }, null, 2)]), U("span", Ku, J(e.title), 1)], 10, Wu)) : e.items.length ? (q(!0), X(H, { key: 1 }, gr(e.items, (e) => (q(), X(H, { key: String(e.id) }, [L(e) ? (q(), ar(pc, { key: 0, ref_for: !0, ref: St(e), asset: e, selected: se(e), - style: xr(Jt()), - onMousedown: mr((t) => Et(t, e), ["left"]), + style: Sr(qt()), + onMousedown: hr((t) => Et(t, e), ["left"]), onClick: (t) => Tt(t, e), - onDblclick: mr((t) => Mt(e), ["stop"]), + onDblclick: hr((t) => Mt(e), ["stop"]), onDropAsset: Nt }, null, 8, [ "asset", @@ -8724,14 +8724,14 @@ var zu = { key: 1, ref_for: !0, ref: St(e), - class: Er(["mjr-asset-card mjr-card", { + class: Dr(["mjr-asset-card mjr-card", { "is-selected": se(e), "mjr-live-placeholder": ge(e) }]), role: "button", tabindex: "0", draggable: "true", - style: xr(Jt()), + style: Sr(qt()), "data-mjr-asset-id": String(e.id ?? ""), "data-mjr-filename-key": String(e.filename || "").toLowerCase(), "data-mjr-ext": ie(e), @@ -8744,32 +8744,32 @@ var zu = { "data-mjr-dup-count": e._mjrDupStack ? String(e._mjrDupCount || 0) : void 0, "aria-label": `Asset ${e.filename || ""}`, "aria-selected": se(e) ? "true" : "false", - onMousedown: mr((t) => Et(t, e), ["left"]), + onMousedown: hr((t) => Et(t, e), ["left"]), onClick: (t) => Tt(t, e), - onDblclick: mr((t) => Mt(e), ["stop"]) - }, [Y(cc, { + onDblclick: hr((t) => Mt(e), ["stop"]) + }, [Y(lc, { asset: e, onWorkflowAction: (t) => At(t, e) - }, null, 8, ["asset", "onWorkflowAction"])], 46, Ku))], 64))), 128)) : G("", !0)], 12, Hu))), 128))], 4)) : (q(), X("div", qu, [(q(!0), X(H, null, hr(We.value, (e) => (q(), X("div", { + }, null, 8, ["asset", "onWorkflowAction"])], 46, qu))], 64))), 128)) : G("", !0)], 12, Uu))), 128))], 4)) : (q(), X("div", Ju, [(q(!0), X(H, null, gr(We.value, (e) => (q(), X("div", { key: `${e.kind || "assets"}-${e.groupKey || ""}-${e.index ?? ""}`, - style: xr(Zt()) + style: Sr(Zt()) }, [e.kind === "header" ? (q(), X("button", { key: 0, type: "button", - class: Er(["mjr-grid-group-separator", De(e)]), + class: Dr(["mjr-grid-group-separator", De(e)]), "aria-expanded": Te(e.groupKey) ? "false" : "true", title: `${Te(e.groupKey) ? "Open" : "Close"} group`, onClick: (t) => Ee(e.groupKey) - }, [U("span", Yu, [U("i", { class: Er(["pi", Te(e.groupKey) ? "pi-chevron-down" : "pi-chevron-up"]) }, null, 2)]), U("span", Xu, J(e.title), 1)], 10, Ju)) : (q(!0), X(H, { key: 1 }, hr(e.items, (e) => (q(), X(H, { key: String(e.id) }, [L(e) ? (q(), ir(fc, { + }, [U("span", Xu, [U("i", { class: Dr(["pi", Te(e.groupKey) ? "pi-chevron-down" : "pi-chevron-up"]) }, null, 2)]), U("span", Zu, J(e.title), 1)], 10, Yu)) : (q(!0), X(H, { key: 1 }, gr(e.items, (e) => (q(), X(H, { key: String(e.id) }, [L(e) ? (q(), ar(pc, { key: 0, ref_for: !0, ref: St(e), asset: e, selected: se(e), - style: xr(Jt()), - onMousedown: mr((t) => Et(t, e), ["left"]), + style: Sr(qt()), + onMousedown: hr((t) => Et(t, e), ["left"]), onClick: (t) => Tt(t, e), - onDblclick: mr((t) => Mt(e), ["stop"]), + onDblclick: hr((t) => Mt(e), ["stop"]), onDropAsset: Nt }, null, 8, [ "asset", @@ -8782,14 +8782,14 @@ var zu = { key: 1, ref_for: !0, ref: St(e), - class: Er(["mjr-asset-card mjr-card", { + class: Dr(["mjr-asset-card mjr-card", { "is-selected": se(e), "mjr-live-placeholder": ge(e) }]), role: "button", tabindex: "0", draggable: "true", - style: xr(Jt()), + style: Sr(qt()), "data-mjr-asset-id": String(e.id ?? ""), "data-mjr-filename-key": String(e.filename || "").toLowerCase(), "data-mjr-ext": ie(e), @@ -8802,13 +8802,13 @@ var zu = { "data-mjr-dup-count": e._mjrDupStack ? String(e._mjrDupCount || 0) : void 0, "aria-label": `Asset ${e.filename || ""}`, "aria-selected": se(e) ? "true" : "false", - onMousedown: mr((t) => Et(t, e), ["left"]), + onMousedown: hr((t) => Et(t, e), ["left"]), onClick: (t) => Tt(t, e), - onDblclick: mr((t) => Mt(e), ["stop"]) - }, [Y(cc, { + onDblclick: hr((t) => Mt(e), ["stop"]) + }, [Y(lc, { asset: e, onWorkflowAction: (t) => At(t, e) - }, null, 8, ["asset", "onWorkflowAction"])], 46, Zu))], 64))), 128))], 4))), 128))])), + }, null, 8, ["asset", "onWorkflowAction"])], 46, Qu))], 64))), 128))], 4))), 128))])), U("div", { ref_key: "infiniteSentinelRef", ref: ne, @@ -8822,14 +8822,14 @@ var zu = { }, null, 512) ], 512)); } -}), ed = 240, td = 120, nd = 80, rd = null, id = null; -function ad() { - return rd ||= import("./chunks/viewerOpenRequest-Crw9UWH5.js").then((e) => e.n), rd; -} +}), td = 240, nd = 120, rd = 80, id = null, ad = null; function od() { - return id ||= import("./chunks/floatingViewerManager-Gv7MTmpu.js").then((e) => e.n), id; + return id ||= import("./chunks/viewerOpenRequest-POEAWUHf.js").then((e) => e.n), id; } -function sd(e) { +function sd() { + return ad ||= import("./chunks/floatingViewerManager-DGIaL-BQ.js").then((e) => e.n), ad; +} +function cd(e) { let t = document.createElement("button"); t.type = "button", t.className = "mjr-asset-card mjr-card mjr-feed-group-member-card", t.style.cssText = "display:flex;flex-direction:column;align-items:flex-start;justify-content:flex-end;min-height:110px;padding:8px;border:1px solid var(--mjr-border,#444);border-radius:8px;background:var(--mjr-surface,#202020);color:inherit;text-align:left;overflow:hidden;"; try { @@ -8840,7 +8840,7 @@ function sd(e) { let n = document.createElement("div"); return n.className = "mjr-feed-group-member-name", n.style.cssText = "font-size:11px;font-weight:600;line-height:1.3;word-break:break-word;", n.textContent = String(e?.filename || "Asset"), t.appendChild(n), t; } -function cd(e) { +function ld(e) { try { if (typeof e?._mjrGetRenderedCards == "function") { let t = e._mjrGetRenderedCards(); @@ -8855,11 +8855,11 @@ function cd(e) { return console.debug?.(e), []; } } -function ld(e, t, n = "") { +function ud(e, t, n = "") { let r = Array.isArray(t) ? t.map(String).filter(Boolean) : []; - return er(e, r, { activeId: n || r[0] || "" }, cd); + return tr(e, r, { activeId: n || r[0] || "" }, ld); } -function ud(e) { +function dd(e) { let t = e?.grid; if (!t) return; let n = (e) => { @@ -8875,16 +8875,16 @@ function ud(e) { } catch (e) { console.debug?.(e); } - let a = cd(t), o = a.indexOf(n), s = Xn(t); + let a = ld(t), o = a.indexOf(n), s = Zn(t); if (e.shiftKey && o >= 0) { let n = Number.isFinite(Number(t._mjrLastSelectedIndex)) ? Number(t._mjrLastSelectedIndex) : o, r = Math.min(n, o), s = Math.max(n, o), c = a.slice(r, s + 1).map((e) => String(e?.dataset?.mjrAssetId || "").trim()).filter(Boolean); - ld(t, c, i), t._mjrLastSelectedIndex = o, e.preventDefault(), e.stopPropagation(); + ud(t, c, i), t._mjrLastSelectedIndex = o, e.preventDefault(), e.stopPropagation(); } else if (e.ctrlKey || e.metaKey) { s.has(i) ? s.delete(i) : s.add(i); let n = Array.from(s); - ld(t, n, s.has(i) ? i : n[0] || ""), o >= 0 && (t._mjrLastSelectedIndex = o), e.preventDefault(), e.stopPropagation(); + ud(t, n, s.has(i) ? i : n[0] || ""), o >= 0 && (t._mjrLastSelectedIndex = o), e.preventDefault(), e.stopPropagation(); } else { - ld(t, [i], i), o >= 0 && (t._mjrLastSelectedIndex = o); + ud(t, [i], i), o >= 0 && (t._mjrLastSelectedIndex = o); try { n.focus?.({ preventScroll: !0 }); } catch (e) { @@ -8901,23 +8901,23 @@ function ud(e) { } }; } -var dd = { +var fd = { hosts: /* @__PURE__ */ new Set(), pendingAssets: /* @__PURE__ */ new Map() }; -function fd(e) { - if (!B.EXECUTION_GROUPING_ENABLED) return Dd(e); +function pd(e) { + if (!B.EXECUTION_GROUPING_ENABLED) return Od(e); let t = String(e?.stack_id || "").trim(); if (t) return `stack:${t}`; let n = String(e?.job_id || "").trim(); - return n ? `job:${n}` : Dd(e); + return n ? `job:${n}` : Od(e); } -function pd(e) { +function md(e) { let t = /* @__PURE__ */ new Map(); for (let n of Array.isArray(e) ? e : []) { - let e = kd(n); + let e = Ad(n); if (!e) continue; - let r = fd(e), i = t.get(r); + let r = pd(e), i = t.get(r); i || (i = { key: r, members: [] @@ -8942,16 +8942,16 @@ function pd(e) { return (Number(t?.mtime || t?.created_at || 0) || 0) - n; }), n; } -function md(e) { +function hd(e) { return Array.from(e?.assetsByKey?.values?.() || []); } -function hd(e) { +function gd(e) { return String(e ?? "").trim().toLowerCase(); } -function gd(e) { +function _d(e) { return e?._mjrLivePlaceholder === !0 || e?.is_live_placeholder === !0 || String(e?.id || "").trim().toLowerCase().startsWith("live:"); } -function _d(e) { +function vd(e) { if (!e || typeof e != "object") return e; try { delete e._mjrLivePlaceholder, delete e._mjrLiveStatus, delete e._mjrLiveLabel, delete e.is_live_placeholder; @@ -8960,19 +8960,19 @@ function _d(e) { } return e; } -function vd(e) { +function yd(e) { if (!e || typeof e != "object") return ""; - let t = hd(e?.type || e?.source || "output"), n = hd(e?.root_id || e?.custom_root_id || ""), r = hd(e?.subfolder || ""), i = hd(e?.filename || ""); + let t = gd(e?.type || e?.source || "output"), n = gd(e?.root_id || e?.custom_root_id || ""), r = gd(e?.subfolder || ""), i = gd(e?.filename || ""); if (i) return `${t}|${n}|${r}|${i}`; - let a = hd(e?.filepath || e?.path || e?.fullpath || e?.full_path || ""); + let a = gd(e?.filepath || e?.path || e?.fullpath || e?.full_path || ""); return a ? `${t}|${n}|path|${a}` : ""; } -function yd(e, t) { - let n = kd(t); +function bd(e, t) { + let n = Ad(t); if (!e || typeof e.set != "function" || !n) return null; - let r = Dd(n), i = vd(n), a = ""; + let r = Od(n), i = yd(n), a = ""; if (i) { - for (let [t, n] of e.entries()) if (vd(n) === i) { + for (let [t, n] of e.entries()) if (yd(n) === i) { a = t; break; } @@ -8981,17 +8981,17 @@ function yd(e, t) { ...o, ...n } : n; - return gd(n) || _d(s), a && a !== r && e.delete(a), e.set(r, s), s; + return _d(n) || vd(s), a && a !== r && e.delete(a), e.set(r, s), s; } -function bd(e, t) { - return e ? (e.assetsByKey ||= /* @__PURE__ */ new Map(), yd(e.assetsByKey, t)) : null; +function xd(e, t) { + return e ? (e.assetsByKey ||= /* @__PURE__ */ new Map(), bd(e.assetsByKey, t)) : null; } -function xd(e) { +function Sd(e) { e?.grid && e.loaded && (e._renderTimer ||= setTimeout(() => { - e._renderTimer = null, Ed(e); - }, nd)); + e._renderTimer = null, Dd(e); + }, rd)); } -function Sd(e, t, n = 0) { +function Cd(e, t, n = 0) { let r = Array.isArray(t?._mjrFeedGroupAssets) ? t._mjrFeedGroupAssets.filter(Boolean) : [t].filter(Boolean); if (!r.length) return; let i = Math.max(0, Math.min(n, r.length - 1)), a = r[i] || null, o = String(a?.id || "").trim(); @@ -9001,14 +9001,14 @@ function Sd(e, t, n = 0) { } catch (e) { console.debug?.(e); } - ld(e.grid, [o], o); + ud(e.grid, [o], o); } - ad().then((e) => e.requestViewerOpen({ + od().then((e) => e.requestViewerOpen({ assets: r, index: i })).catch((e) => console.debug?.(e)); } -function Cd(e, t) { +function wd(e, t) { let n = document.createElement("div"); n.className = "mjr-popover mjr-feed-group-popover", n.style.cssText = "display:none; width:min(440px, 92vw); padding:10px;"; let r = document.createElement("div"); @@ -9017,14 +9017,14 @@ function Cd(e, t) { i.className = "mjr-feed-group-popover-grid", i.style.cssText = "display:grid; grid-template-columns:repeat(auto-fill, minmax(110px, 1fr)); gap:8px; max-height:360px; overflow-y:auto; overscroll-behavior:contain;"; let a = Array.isArray(t?._mjrFeedGroupAssets) ? t._mjrFeedGroupAssets : []; for (let r = 0; r < a.length; r += 1) { - let o = a[r], s = sd(o); + let o = a[r], s = cd(o); s.classList.add("mjr-feed-group-member-card"), r === 0 && s.classList.add("mjr-feed-group-member-card--cover"), s.addEventListener("click", (i) => { - i.preventDefault(), i.stopPropagation(), e.popoverManager?.close?.(n), Sd(e, t, r); + i.preventDefault(), i.stopPropagation(), e.popoverManager?.close?.(n), Cd(e, t, r); }), i.appendChild(s); } return n.appendChild(i), e.root.appendChild(n), n; } -function wd(e, t, n) { +function Td(e, t, n) { if (!t || !n) return; let r = Number(n?._mjrFeedGroupCount || 0) || 0; if (r <= 1 || (t.dataset.mjrFeedGrouped = "true", t.dataset.mjrFeedGroupCount = String(r), t.dataset.mjrStacked = "true", t.dataset.mjrStackCount = String(r), t.querySelector(".mjr-feed-group-button"))) return; @@ -9033,20 +9033,20 @@ function wd(e, t, n) { let a = document.createElement("span"); a.className = "mjr-feed-group-button-icon pi pi-clone", i.appendChild(a); let o = document.createElement("span"); - o.className = "mjr-feed-group-button-count", o.textContent = String(r), i.appendChild(o), i.style.cssText = "position:absolute; top:34px; right:6px; z-index:11;", Ka(i); - let s = Cd(e, n); + o.className = "mjr-feed-group-button-count", o.textContent = String(r), i.appendChild(o), i.style.cssText = "position:absolute; top:34px; right:6px; z-index:11;", qa(i); + let s = wd(e, n); i.addEventListener("click", (t) => { t.preventDefault(), t.stopPropagation(), e.popoverManager?.toggle?.(s, i); }), t.appendChild(i); } -function Td(e, t) { +function Ed(e, t) { let n = new Map((Array.isArray(t) ? t : []).map((e) => [String(e?.id || "").trim(), e]).filter(([e]) => !!e)); - for (let t of cd(e?.grid)) { + for (let t of ld(e?.grid)) { let r = String(t?.dataset?.mjrAssetId || "").trim(), i = n.get(r); - i && wd(e, t, i); + i && Td(e, t, i); } } -async function Ed(e) { +async function Dd(e) { if (!e?.grid) return; try { e.popoverManager?.closeAll?.(); @@ -9059,19 +9059,19 @@ async function Ed(e) { } catch (e) { console.debug?.(e); } - let t = pd(md(e)), n = await vi(e.grid, t, { + let t = md(hd(e)), n = await yi(e.grid, t, { title: R("bottomFeed.title", "Generated Feed"), reset: !0 }); - Td(e, t), Number(n?.count || 0) <= 0 ? (e.empty.textContent = R("bottomFeed.empty", "No generated assets yet."), e.empty.style.display = "") : e.empty.style.display = "none"; + Ed(e, t), Number(n?.count || 0) <= 0 ? (e.empty.textContent = R("bottomFeed.empty", "No generated assets yet."), e.empty.style.display = "") : e.empty.style.display = "none"; } -function Dd(e) { +function Od(e) { let t = String(e?.id || "").trim(); if (t) return `id:${t}`; let n = String(e?.filename || "").trim(), r = String(e?.subfolder || "").trim(); return `file:${String(e?.source || e?.type || "").trim()}:${r}:${n}`; } -function Od(e) { +function kd(e) { let t = String(e || "").split(".").pop()?.toUpperCase() ?? "", n = /* @__PURE__ */ new Set([ "MP4", "WEBM", @@ -9098,41 +9098,41 @@ function Od(e) { ]); return n.has(t) ? "video" : r.has(t) ? "audio" : i.has(t) ? "model3d" : "image"; } -function kd(e) { +function Ad(e) { if (!e || typeof e != "object") return null; let t = { ...e }; - return !t.type && t.source && (t.type = t.source), !t.source && t.type && (t.source = t.type), t.kind ||= Od(t.ext || t.filename || ""), t; + return !t.type && t.source && (t.type = t.source), !t.source && t.type && (t.source = t.type), t.kind ||= kd(t.ext || t.filename || ""), t; } -function Ad(e) { - let t = kd(e); +function jd(e) { + let t = Ad(e); if (!t) return null; - let n = Dd(t); + let n = Od(t); if (!n) return null; - let r = vd(t), i = null; - if (r) for (let [e, t] of dd.pendingAssets.entries()) e !== n && vd(t) === r && (i = t, dd.pendingAssets.delete(e)); - let a = dd.pendingAssets.get(n) || i || null, o = a ? { + let r = yd(t), i = null; + if (r) for (let [e, t] of fd.pendingAssets.entries()) e !== n && yd(t) === r && (i = t, fd.pendingAssets.delete(e)); + let a = fd.pendingAssets.get(n) || i || null, o = a ? { ...a, ...t } : t; - if (gd(t) || _d(o), dd.pendingAssets.set(n, o), dd.pendingAssets.size > 64) { - let e = dd.pendingAssets.keys().next().value; - e && dd.pendingAssets.delete(e); + if (_d(t) || vd(o), fd.pendingAssets.set(n, o), fd.pendingAssets.size > 64) { + let e = fd.pendingAssets.keys().next().value; + e && fd.pendingAssets.delete(e); } return o; } -function jd() { - return Array.from(dd.pendingAssets.values()); +function Md() { + return Array.from(fd.pendingAssets.values()); } -async function Md(e) { +async function Nd(e) { if (e?.grid) { e.empty.style.display = "none", e.empty.textContent = R("bottomFeed.loading", "Loading recent assets..."); try { e.assetsByKey = /* @__PURE__ */ new Map(); let t = [], n = 0; - for (; n < ed;) { - let r = Ke({ + for (; n < td;) { + let r = qe({ q: "*", - limit: Math.min(td, ed - n), + limit: Math.min(nd, td - n), offset: n, scope: "output", sort: "mtime_desc", @@ -9142,19 +9142,19 @@ async function Md(e) { let a = Array.isArray(i?.data?.assets) ? i.data.assets : []; if (!a.length) break; for (let n of a) { - let r = bd(e, n); + let r = xd(e, n); r && t.push(r); } - if (a.length < td) break; + if (a.length < nd) break; n += a.length; } - for (let t of jd()) bd(e, t); - dd.pendingAssets.clear(); - let r = pd(md(e)), i = await vi(e.grid, r, { + for (let t of Md()) xd(e, t); + fd.pendingAssets.clear(); + let r = md(hd(e)), i = await yi(e.grid, r, { title: R("bottomFeed.title", "Generated Feed"), reset: !0 }); - Td(e, r), Number(i?.count || 0) <= 0 ? (e.empty.textContent = R("bottomFeed.empty", "No generated assets yet."), e.empty.style.display = "") : e.empty.style.display = "none"; + Ed(e, r), Number(i?.count || 0) <= 0 ? (e.empty.textContent = R("bottomFeed.empty", "No generated assets yet."), e.empty.style.display = "") : e.empty.style.display = "none"; } catch (t) { console.debug?.(t), e.empty.textContent = R("bottomFeed.loadFailed", "Failed to load generated assets."), e.empty.style.display = ""; } finally { @@ -9162,21 +9162,21 @@ async function Md(e) { } } } -async function Nd() { - for (let e of Array.from(dd.hosts)) try { - await Md(e); +async function Pd() { + for (let e of Array.from(fd.hosts)) try { + await Nd(e); } catch (e) { console.debug?.(e); } } -function Pd() { - Nd(); +function Fd() { + Pd(); } -function Fd(e) { +function Id(e) { let t = document.createElement("div"); t.textContent = R("bottomFeed.loading", "Loading recent assets..."), t.style.cssText = "font-size:11px; opacity:0.65; padding:4px 2px 8px 2px;", e.root.appendChild(t), e.empty = t; } -function Id(e) { +function Ld(e) { if (!e) return; let t = [ e, @@ -9194,14 +9194,14 @@ function Id(e) { console.debug?.(e); } } -function Ld(e) { +function Rd(e) { if (!e) return; let t = (t, n) => { n ? e.classList.add(t) : e.classList.remove(t); }; t("mjr-feed-show-info", B.FEED_SHOW_INFO), t("mjr-feed-show-filename", B.FEED_SHOW_FILENAME), t("mjr-feed-show-dimensions", B.FEED_SHOW_DIMENSIONS), t("mjr-feed-show-date", B.FEED_SHOW_DATE), t("mjr-feed-show-gentime", B.FEED_SHOW_GENTIME), t("mjr-show-hover-info", B.GRID_SHOW_HOVER_INFO), t("mjr-feed-show-dot", B.FEED_SHOW_WORKFLOW_DOT), t("mjr-feed-show-badges-ext", B.FEED_SHOW_BADGES_EXTENSION), t("mjr-feed-show-badges-rating", B.FEED_SHOW_BADGES_RATING), t("mjr-feed-show-badges-tags", B.FEED_SHOW_BADGES_TAGS); } -function Rd(e, t = null) { +function zd(e, t = null) { let n = t || document.createElement("div"); n.classList.add("mjr-am-grid-scroll"), n.style.position = "relative", n.style.flex = "1 1 auto", n.style.minHeight = "0", n.style.height = "100%", n.style.overflow = "auto", n.style.scrollbarGutter = "stable", n.style.overscrollBehavior = "contain", n.style.webkitOverflowScrolling = "touch"; let r = () => { @@ -9219,14 +9219,14 @@ function Rd(e, t = null) { } }, a = document.createElement("div"); n.appendChild(a), e.root.appendChild(n); - let { app: o } = Hn($u, { + let { app: o } = Un(ed, { scrollElement: n, virtualize: !1, applyDefaultSettingsClasses: !1, emitWindowSelectionEvents: !0, onCardRendered: (t, n) => { try { - wd(e, t, n); + Td(e, t, n); } catch (e) { console.debug?.(e); } @@ -9245,7 +9245,7 @@ function Rd(e, t = null) { else if (t === "c") { e.preventDefault?.(), e.stopPropagation?.(), r(); try { - od().then(async ({ floatingViewerManager: e }) => { + sd().then(async ({ floatingViewerManager: e }) => { await e.open(), e.toggleCompareAB(); }).catch((e) => console.debug?.(e)); } catch (e) { @@ -9266,19 +9266,19 @@ function Rd(e, t = null) { } }; } -function zd(e) { +function Bd(e) { let t = e?.grid; if (!t) return []; - let n = Xn(t); - return n.size ? md(e).filter((e) => n.has(String(e?.id || ""))) : []; + let n = Zn(t); + return n.size ? hd(e).filter((e) => n.has(String(e?.id || ""))) : []; } -function Bd(e) { +function Vd(e) { let t = e?.grid; if (!t) return null; let n = String(t.dataset?.mjrSelectedAssetId || "").trim(); - return n ? md(e).find((e) => String(e?.id || "") === n) || null : zd(e)[0] || null; + return n ? hd(e).find((e) => String(e?.id || "") === n) || null : Bd(e)[0] || null; } -function Vd(e) { +function Hd(e) { let t = String(e ?? ""); try { if (typeof CSS < "u" && typeof CSS.escape == "function") return CSS.escape(t); @@ -9287,39 +9287,39 @@ function Vd(e) { } return t.replace(/([!"#$%&'()*+,./:;<=>?@[\\\]^`{|}~])/g, "\\$1"); } -function Hd(e) { +function Ud(e) { let t = e?.grid; if (!t) return; let n = () => { try { - xd(e); + Sd(e); } catch (e) { console.debug?.(e); } }; - e.keyboard = Li({ + e.keyboard = Ri({ gridContainer: t, - getState: () => ({ assets: pd(md(e)) }), - getSelectedAssets: () => zd(e), - getActiveAsset: () => Bd(e), + getState: () => ({ assets: md(hd(e)) }), + getSelectedAssets: () => Bd(e), + getActiveAsset: () => Vd(e), onOpenTagsEditor: (e) => { - let r = t.querySelector?.(`.mjr-asset-card[data-mjr-asset-id="${Vd(e?.id || "")}"]`) || null, i = null; + let r = t.querySelector?.(`.mjr-asset-card[data-mjr-asset-id="${Hd(e?.id || "")}"]`) || null, i = null; try { i = r?.getBoundingClientRect?.() || t.getBoundingClientRect(); } catch (e) { console.debug?.(e); } - La(Math.round((i?.left || 0) + Math.min((i?.width || 0) * .5, 160)), Math.round((i?.top || 0) + Math.min((i?.height || 0) * .5, 120)), e, n); + Ra(Math.round((i?.left || 0) + Math.min((i?.width || 0) * .5, 160)), Math.round((i?.top || 0) + Math.min((i?.height || 0) * .5, 120)), e, n); }, onAssetChanged: n - }), e.keyboard.bind(), e.ratingHotkeys = Ga({ + }), e.keyboard.bind(), e.ratingHotkeys = Ka({ gridContainer: t, - createRatingBadge: ht + createRatingBadge: gt }), e.ratingHotkeys.bind(); } -var Ud = 60, Wd = 600, Gd = 10; -function Kd(e, t) { - let n = Math.max(Ud, Math.min(Wd, Math.round(Number(t) / Gd) * Gd)); +var Wd = 60, Gd = 600, Kd = 10; +function qd(e, t) { + let n = Math.max(Wd, Math.min(Gd, Math.round(Number(t) / Kd) * Kd)); if (e?.grid) try { e.grid.style.setProperty("--mjr-grid-min-size", `${n}px`); } catch (e) { @@ -9327,8 +9327,8 @@ function Kd(e, t) { } B.FEED_GRID_MIN_SIZE = n; try { - let e = Vn(); - e.feed.minSize = n, Fn(e), Tn(e); + let e = Hn(); + e.feed.minSize = n, In(e), En(e); } catch (e) { console.debug?.(e); } @@ -9345,27 +9345,27 @@ function Kd(e, t) { } return n; } -function qd(e) { - let t = Math.max(Ud, Number(B.FEED_GRID_MIN_SIZE || 120) || 120), n = document.createElement("div"); +function Jd(e) { + let t = Math.max(Wd, Number(B.FEED_GRID_MIN_SIZE || 120) || 120), n = document.createElement("div"); n.className = "mjr-feed-toolbar", n.style.cssText = "display:flex; align-items:center; gap:5px; padding:0 2px 5px 2px; flex-shrink:0; user-select:none;"; let r = document.createElement("span"); r.textContent = R("bottomFeed.cardSize", "Cards:"), r.style.cssText = "font-size:11px; opacity:0.65; white-space:nowrap; flex-shrink:0;", n.appendChild(r); let i = document.createElement("button"); i.type = "button", i.className = "mjr-feed-size-btn", i.textContent = "-", i.title = R("bottomFeed.cardSizeDecrease", "Decrease card size"), i.style.cssText = "width:20px; height:20px; padding:0; border:1px solid var(--mjr-border,#555); border-radius:4px; background:var(--mjr-surface,#2a2a2a); color:inherit; cursor:pointer; font-size:14px; line-height:1; flex-shrink:0; display:flex; align-items:center; justify-content:center;", n.appendChild(i); let a = document.createElement("input"); - a.type = "range", a.className = "mjr-feed-size-slider", a.min = String(Ud), a.max = String(Wd), a.step = String(Gd), a.value = String(t), a.title = R("bottomFeed.cardSizeSlider", "Card size"), a.style.cssText = "flex:1 1 auto; min-width:40px; max-width:180px; height:4px; cursor:pointer; accent-color:var(--mjr-accent,#64b5f6);", n.appendChild(a); + a.type = "range", a.className = "mjr-feed-size-slider", a.min = String(Wd), a.max = String(Gd), a.step = String(Kd), a.value = String(t), a.title = R("bottomFeed.cardSizeSlider", "Card size"), a.style.cssText = "flex:1 1 auto; min-width:40px; max-width:180px; height:4px; cursor:pointer; accent-color:var(--mjr-accent,#64b5f6);", n.appendChild(a); let o = document.createElement("button"); o.type = "button", o.className = "mjr-feed-size-btn", o.textContent = "+", o.title = R("bottomFeed.cardSizeIncrease", "Increase card size"), o.style.cssText = i.style.cssText, n.appendChild(o); let s = document.createElement("span"); s.className = "mjr-feed-size-display", s.textContent = `${t}px`, s.style.cssText = "font-size:11px; opacity:0.65; white-space:nowrap; min-width:36px; text-align:right; flex-shrink:0; font-variant-numeric:tabular-nums;", n.appendChild(s), i.addEventListener("click", () => { - Kd(e, Number(a.value) - Gd); + qd(e, Number(a.value) - Kd); }), o.addEventListener("click", () => { - Kd(e, Number(a.value) + Gd); + qd(e, Number(a.value) + Kd); }), a.addEventListener("input", () => { - Kd(e, Number(a.value)); + qd(e, Number(a.value)); }), e.root.appendChild(n), e._sizeToolbar = n; } -function Jd(e, t = {}) { +function Yd(e, t = {}) { let n = document.createElement("div"); n.className = "mjr-assets-manager mjr-bottom-feed", n.style.cssText = "padding:6px; height:100%; min-height:0; box-sizing:border-box; display:flex; flex-direction:column; overflow:hidden;", e.replaceChildren(n); let r = { @@ -9377,13 +9377,13 @@ function Jd(e, t = {}) { assetsByKey: /* @__PURE__ */ new Map(), popoverManager: null }; - qd(r), Fd(r), Rd(r, t.gridWrapper ?? null), ud(r), r.popoverManager = ki(n), r._disposeContextMenu = Ra({ + Jd(r), Id(r), zd(r, t.gridWrapper ?? null), dd(r), r.popoverManager = Ai(n), r._disposeContextMenu = za({ gridContainer: r.grid, getState: () => ({ scope: "output" }) - }), Hd(r), Ld(r.grid); + }), Ud(r), Rd(r.grid); let i = () => { try { - Ld(r.grid); + Rd(r.grid); } catch (e) { console.debug?.(e); } @@ -9396,26 +9396,26 @@ function Jd(e, t = {}) { } }, r; } -function Yd(e) { - let t = Ad(e); - if (t) for (let e of Array.from(dd.hosts)) try { - if (!e?.grid || (bd(e, t), !e.loaded)) continue; - e.empty.style.display = "none", xd(e); +function Xd(e) { + let t = jd(e); + if (t) for (let e of Array.from(fd.hosts)) try { + if (!e?.grid || (xd(e, t), !e.loaded)) continue; + e.empty.style.display = "none", Sd(e); } catch (e) { console.debug?.(e); } } -function Xd(e, t = {}) { - Id(e); - let n = Jd(e, t); +function Zd(e, t = {}) { + Ld(e); + let n = Yd(e, t); try { e._mjrGeneratedFeedHost = n; } catch (e) { console.debug?.(e); } - return dd.hosts.add(n), Md(n), n; + return fd.hosts.add(n), Nd(n), n; } -function Zd(e) { +function Qd(e) { let t = e?._mjrGeneratedFeedHost || e || null; if (!t) return; let n = t.container || null; @@ -9429,7 +9429,7 @@ function Zd(e) { } console.debug?.(e); } - dd.hosts.delete(t); + fd.hosts.delete(t); try { t._disposeSelection?.(); } catch (e) { @@ -9476,7 +9476,7 @@ function Zd(e) { console.debug?.(e); } try { - bi(t.grid); + xi(t.grid); } catch (e) { console.debug?.(e); } @@ -9487,24 +9487,24 @@ function Zd(e) { } } // ui/features/stacks/executionAssetBuffer.ts -function Qd(e) { +function $d(e) { return String(e || "").trim(); } -function $d(e) { +function ef(e) { let t = String(e?.filename || "").trim(), n = String(e?.subfolder || "").trim(); return `${String(e?.type || "output").trim().toLowerCase()}|${String(e?.root_id || e?.custom_root_id || "").trim()}|${n}|${t}`; } -function ef() { +function tf() { let e = /* @__PURE__ */ new Map(); function t(t, n) { - let r = Qd(t); + let r = $d(t); if (!r) return []; let i = Array.isArray(n) ? n : []; if (!i.length) return []; let a = e.get(r); a || (a = /* @__PURE__ */ new Map(), e.set(r, a)); for (let e of i) { - let t = $d(e); + let t = ef(e); t && a.set(t, { ...a.get(t) || {}, ...e || {} @@ -9513,13 +9513,13 @@ function ef() { return Array.from(a.values()); } function n(t) { - let n = Qd(t); + let n = $d(t); if (!n) return []; let r = e.get(n); return e.delete(n), Array.from(r?.values?.() || []); } function r(t) { - let n = Qd(t); + let n = $d(t); n && e.delete(n); } return { @@ -9530,7 +9530,7 @@ function ef() { }; } // ui/features/stacks/finalizeQueue.ts -function tf({ defaultDelayMs: e = 900, postJob: t } = {}) { +function nf({ defaultDelayMs: e = 900, postJob: t } = {}) { let n = /* @__PURE__ */ new Map(), r = /* @__PURE__ */ new Set(), i = !1; async function a() { if (!i) { @@ -9567,27 +9567,27 @@ function tf({ defaultDelayMs: e = 900, postJob: t } = {}) { }; } // ui/features/stacks/liveAssetGate.ts -function nf(e) { +function rf(e) { return String(e || "").trim(); } -function rf(e) { +function af(e) { let t = String(e?.filename || "").trim(), n = String(e?.filepath || "").trim(), r = String(e?.subfolder || "").trim(); return `${String(e?.type || e?.source || "output").trim().toLowerCase()}|${String(e?.root_id || e?.custom_root_id || "").trim()}|${r}|${t || n}`; } -function af(e, t) { +function of(e, t) { return !t || String(e?.job_id || "").trim() === t ? e : { ...e || {}, job_id: t }; } -function of() { +function sf() { let e = /* @__PURE__ */ new Map(); function t(t, { files: n = [], expectedCount: r = null } = {}) { - let i = nf(t); + let i = rf(t); if (!i) return; let a = /* @__PURE__ */ new Set(); for (let e of Array.isArray(n) ? n : []) { - let t = rf(e); + let t = af(e); t && a.add(t); } e.set(i, { @@ -9597,13 +9597,13 @@ function of() { }); } function n(t) { - let n = nf(t); + let n = rf(t); n && e.delete(n); } function r(t) { - let n = nf(t?.job_id); + let n = rf(t?.job_id); if (n) return n; - let r = rf(t); + let r = af(t); if (!r) return ""; let i = "", a = Infinity; for (let [t, n] of e.entries()) n?.fileKeys?.has?.(r) && (n.markedAt ?? Infinity) < a && (a = n.markedAt ?? Infinity, i = t); @@ -9616,7 +9616,7 @@ function of() { jobId: "", defer: !1 }; - let i = af(t, n), a = e.get(n); + let i = of(t, n), a = e.get(n); if (!a) return { detail: i, jobId: n, @@ -9638,20 +9638,20 @@ function of() { }; } // ui/features/stacks/executionRuntimeController.ts -var sf = 2e3, cf = 2e3, lf = /* @__PURE__ */ new Set([ +var cf = 2e3, lf = 2e3, uf = /* @__PURE__ */ new Set([ "DB_MAINTENANCE", "TIMEOUT", "NETWORK_ERROR", "SERVICE_UNAVAILABLE" -]), uf = 8, df = 1200, ff = 15e3, pf = 6e5, mf = 500, hf = 6, gf = 3e4, _f = 500; -function vf({ post: e, ENDPOINTS: t, reportError: n, extractOutputFiles: r, ensureExecutionRuntime: i, emitRuntimeStatus: a, refreshGeneratedFeedHosts: o, getActiveGridContainer: s }) { - let c = pe({ - ttlMs: sf, - maxSize: cf - }), l = pe({ - ttlMs: pf, - maxSize: mf - }), u = Math.max(0, Number(B.EXECUTION_IDLE_GRACE_MS) || 6e3), d = /* @__PURE__ */ new Map(), f = ef(), p = of(), m = "", h = 0, g = null; +]), df = 8, ff = 1200, pf = 15e3, mf = 6e5, hf = 500, gf = 6, _f = 3e4, vf = 500; +function yf({ post: e, ENDPOINTS: t, reportError: n, extractOutputFiles: r, ensureExecutionRuntime: i, emitRuntimeStatus: a, refreshGeneratedFeedHosts: o, getActiveGridContainer: s }) { + let c = ye({ + ttlMs: cf, + maxSize: lf + }), l = ye({ + ttlMs: mf, + maxSize: hf + }), u = Math.max(0, Number(B.EXECUTION_IDLE_GRACE_MS) || 6e3), d = /* @__PURE__ */ new Map(), f = tf(), p = sf(), m = "", h = 0, g = null; function _() { try { return typeof window > "u" ? !1 : window.__MJR_DEBUG_JOB_TRACKING__ === !0 || String(window.localStorage?.getItem("mjr.debug.jobTracking") || "").trim() === "1"; @@ -9723,7 +9723,7 @@ function vf({ post: e, ENDPOINTS: t, reportError: n, extractOutputFiles: r, ensu console.debug?.(e); } } - let S = tf({ + let S = nf({ defaultDelayMs: 900, async postJob(r) { v("auto-stack:start", { job_id: r }); @@ -9761,7 +9761,7 @@ function vf({ post: e, ENDPOINTS: t, reportError: n, extractOutputFiles: r, ensu } function T(e) { let t = Math.max(1, Number(e) || 1), n = Math.min(6, t - 1); - return Math.min(ff, df * 2 ** n); + return Math.min(pf, ff * 2 ** n); } function E() { g &&= (clearTimeout(g), null); @@ -9779,7 +9779,7 @@ function vf({ post: e, ENDPOINTS: t, reportError: n, extractOutputFiles: r, ensu } function O(e) { let t = String(e?.code || "").trim().toUpperCase(); - return lf.has(t); + return uf.has(t); } function k(r, i = 1, a = {}) { let o = Array.isArray(r) ? r : []; @@ -9794,7 +9794,7 @@ function vf({ post: e, ENDPOINTS: t, reportError: n, extractOutputFiles: r, ensu files: o.map((e) => String(e?.filename || e?.filepath || "")) }), e(t.INDEX_FILES, s).then((e) => { if (!e?.ok) { - if (O(e) && i < uf) { + if (O(e) && i < df) { let e = T(i); setTimeout(() => k(o, i + 1, a), e); } else try { @@ -9829,7 +9829,7 @@ function vf({ post: e, ENDPOINTS: t, reportError: n, extractOutputFiles: r, ensu let a = d.get(i); a?.timer && clearTimeout(a.timer); let o = a?.firstAttemptAt ?? Date.now(); - if (Date.now() - o >= gf) { + if (Date.now() - o >= _f) { k(r, 1, t); return; } @@ -9874,7 +9874,7 @@ function vf({ post: e, ENDPOINTS: t, reportError: n, extractOutputFiles: r, ensu file_count: Array.isArray(e) ? e.length : 0, files: Array.isArray(e) ? e.map((e) => String(e?.filename || e?.filepath || "")) : [] }), !r) { - if (n < hf) { + if (n < gf) { M(e, t, n); return; } @@ -9948,7 +9948,7 @@ function vf({ post: e, ENDPOINTS: t, reportError: n, extractOutputFiles: r, ensu let i = e?.detail?.prompt_id || e?.detail?.promptId, a = String(e?.detail?.node || e?.detail?.display_node || "").trim(), o = i ? l.get(String(i)) : null, s = o ? Math.max(0, Date.now() - o) : 0, c = ""; try { if (a && t !== void 0) { - let e = pt(dt(t), a); + let e = mt(ft(t), a); e && (c = String(e.type || e.comfyClass || "").trim()); } } catch (e) { @@ -10008,7 +10008,7 @@ function vf({ post: e, ENDPOINTS: t, reportError: n, extractOutputFiles: r, ensu reason: String(e?.type || "") }), E(), f.clear(r), n.allowLiveStackFinalize && p.clearPendingJob(r), P()), String(e?.type || "") === "execution_success" && D(() => { r && N(r), F(r); - }, I(r) ? Math.min(u, _f) : u); + }, I(r) ? Math.min(u, vf) : u); } function se(e) { if (!y()) return; @@ -10033,7 +10033,7 @@ function vf({ post: e, ENDPOINTS: t, reportError: n, extractOutputFiles: r, ensu }; } // ui/utils/extractOutputFiles.ts -function yf(e) { +function bf(e) { let t = [], n = /* @__PURE__ */ new Set(), r = 2e3, i = /\.(png|jpe?g|webp|gif|bmp|tiff?|avif|heic|heif|apng|hdr|svg|mp4|webm|mov|mkv|avi|m4v|mp3|wav|flac|ogg|glb|gltf|obj|fbx|ply|stl)$/i, a = typeof WeakSet < "u" ? /* @__PURE__ */ new WeakSet() : null, o = ({ type: e, subfolder: t, filename: n, path: r }) => r ? `path|${String(r).trim().toLowerCase()}` : `${e || ""}|${t || ""}|${n || ""}`.toLowerCase(), s = (e) => { if (!e) return; let r = e.path || e.filepath || e.fullpath || e.fullPath || e.full_path, i = e.filename; @@ -10114,15 +10114,15 @@ function yf(e) { return u(e, 0), t; } // ui/features/runtime/sidebarAssetBadge.ts -var bf = "mjr-sidebar-asset-badge", xf = "mjr-sidebar-tab-has-badge", Sf = "mjr-sidebar-asset-badge-style", Cf = 99, wf = 0, Tf = "majoor-assets", Ef = !1, Df = /* @__PURE__ */ new Set(); -function Of() { - if (typeof document > "u" || document.getElementById(Sf)) return; +var xf = "mjr-sidebar-asset-badge", Sf = "mjr-sidebar-tab-has-badge", Cf = "mjr-sidebar-asset-badge-style", wf = 99, Tf = 0, Ef = "majoor-assets", Df = !1, Of = /* @__PURE__ */ new Set(); +function kf() { + if (typeof document > "u" || document.getElementById(Cf)) return; let e = document.createElement("style"); - e.id = Sf, e.textContent = ` - .${xf} { + e.id = Cf, e.textContent = ` + .${Sf} { position: relative !important; } - .${bf} { + .${xf} { position: absolute; top: 3px; right: 3px; @@ -10146,7 +10146,7 @@ function Of() { } `, document.head?.appendChild(e); } -function kf(e) { +function Af(e) { let t = String(e || "").trim(); if (!t) return []; let n = (() => { @@ -10165,91 +10165,91 @@ function kf(e) { `[href="#${n}"]` ]; } -function Af(e) { +function jf(e) { let t = `${e?.textContent || ""} ${e?.title || ""} ${e?.getAttribute?.("aria-label") || ""}`; return /assets\s*manager|majoor/i.test(t); } -function jf(e) { +function Mf(e) { return !e || typeof e != "object" ? !1 : typeof HTMLElement < "u" ? e instanceof HTMLElement : typeof e.querySelector == "function" && typeof e.appendChild == "function"; } -function Mf() { +function Nf() { if (typeof document > "u") return null; - for (let e of kf(Tf)) { + for (let e of Af(Ef)) { let t = document.querySelector(e); - if (jf(t)) return t; + if (Mf(t)) return t; } let e = Array.from(document.querySelectorAll(".pi-folder, .pi-folder-open")); for (let t of e) { let e = t.closest?.("button,[role='tab'],a,.p-button,.comfyui-button,.sidebar-tab"); - if (jf(e) && Af(e)) return e; + if (Mf(e) && jf(e)) return e; } - return Array.from(document.querySelectorAll("button,[role='tab'],a,.p-button,.comfyui-button,.sidebar-tab")).find((e) => jf(e) && Af(e)) || null; -} -function Nf() { - Of(); - let e = Mf(); - if (!e) return !1; - let t = e.querySelector(`:scope > .${bf}`); - return !Ff() || wf <= 0 ? (t?.remove(), e.classList.remove(xf), !0) : (t || (t = document.createElement("span"), t.className = bf, t.setAttribute("aria-hidden", "true"), e.appendChild(t)), e.classList.add(xf), t.textContent = wf > Cf ? `${Cf}+` : String(wf), !0); + return Array.from(document.querySelectorAll("button,[role='tab'],a,.p-button,.comfyui-button,.sidebar-tab")).find((e) => Mf(e) && jf(e)) || null; } function Pf() { - Nf(), typeof requestAnimationFrame == "function" && requestAnimationFrame(() => Nf()), setTimeout(() => Nf(), 250), setTimeout(() => Nf(), 1e3); + kf(); + let e = Nf(); + if (!e) return !1; + let t = e.querySelector(`:scope > .${xf}`); + return !If() || Tf <= 0 ? (t?.remove(), e.classList.remove(Sf), !0) : (t || (t = document.createElement("span"), t.className = xf, t.setAttribute("aria-hidden", "true"), e.appendChild(t)), e.classList.add(Sf), t.textContent = Tf > wf ? `${wf}+` : String(Tf), !0); } function Ff() { + Pf(), typeof requestAnimationFrame == "function" && requestAnimationFrame(() => Pf()), setTimeout(() => Pf(), 250), setTimeout(() => Pf(), 1e3); +} +function If() { return B.SIDEBAR_ASSET_BADGE_ENABLED !== !1; } -function If(e = null) { +function Lf(e = null) { let t = String(e?.id || e?.asset_id || "").trim(); if (t) return `id:${t}`; let n = String(e?.type || e?.source || "output").trim().toLowerCase(), r = String(e?.root_id || e?.custom_root_id || "").trim().toLowerCase(), i = String(e?.subfolder || e?.sub_folder || e?.subFolder || "").trim().toLowerCase(), a = String(e?.filename || "").trim().toLowerCase(), o = String(e?.filepath || e?.path || e?.fullpath || e?.full_path || "").trim().toLowerCase(), s = a || o; return s ? `file:${n}|${r}|${i}|${s}` : ""; } -function Lf(e) { +function Rf(e) { if (!e) return !0; - if (Df.has(e)) return !1; - if (Df.add(e), Df.size > 1e3) { - let e = Array.from(Df).slice(-500); - Df.clear(); - for (let t of e) Df.add(t); + if (Of.has(e)) return !1; + if (Of.add(e), Of.size > 1e3) { + let e = Array.from(Of).slice(-500); + Of.clear(); + for (let t of e) Of.add(t); } return !0; } -function Rf({ sidebarTabId: e } = {}) { +function zf({ sidebarTabId: e } = {}) { let t = String(e || "").trim(); - t && (Tf = t), !Ef && typeof window < "u" && (Ef = !0, window.addEventListener?.("mjr-settings-changed", (e) => { - e?.detail?.key === "sidebar.assetBadgeEnabled" && (Ff() || (wf = 0, Df.clear()), Pf()); - })), Pf(); + t && (Ef = t), !Df && typeof window < "u" && (Df = !0, window.addEventListener?.("mjr-settings-changed", (e) => { + e?.detail?.key === "sidebar.assetBadgeEnabled" && (If() || (Tf = 0, Of.clear()), Ff()); + })), Ff(); } -function zf(e = null) { - Ff() && Lf(If(e)) && (wf += 1, Pf()); +function Bf(e = null) { + If() && Rf(Lf(e)) && (Tf += 1, Ff()); } -function Bf() { - wf = 0, Df.clear(), Pf(); +function Vf() { + Tf = 0, Of.clear(), Ff(); } // ui/features/runtime/pendingGeneratedAssets.ts -var Vf = 0; -function Hf(e = 1) { +var Hf = 0; +function Uf(e = 1) { let t = Math.max(1, Number(e) || 1); - Vf += t; + Hf += t; try { - window.__mjrPendingGeneratedAssetCount = Vf; + window.__mjrPendingGeneratedAssetCount = Hf; } catch {} - return Vf; + return Hf; } -function Uf() { - let e = Vf; - Vf = 0; +function Wf() { + let e = Hf; + Hf = 0; try { window.__mjrPendingGeneratedAssetCount = 0; } catch {} return e; } // ui/features/runtime/registerRealtimeListeners.ts -var Wf = 3e4, Gf = /* @__PURE__ */ new Map(), Kf = "live"; -function qf(e) { +var Gf = 3e4, Kf = /* @__PURE__ */ new Map(), qf = "live"; +function Jf(e) { return e === !0 || e === 1 || e === "1" ? !0 : e === !1 || e === 0 || e === "0" ? !1 : null; } -function Jf(e) { +function Yf(e) { let t = [ e?.has_ai_vector, e?.hasAiVector, @@ -10259,25 +10259,25 @@ function Jf(e) { e?.vectorIndexed ]; for (let e of t) { - let t = qf(e); + let t = Jf(e); if (t !== null) return t; } return !1; } -function Yf(e) { - let t = Date.now(), n = Number(Gf.get(e) || 0); - if (n > 0 && t - n < Wf) return !0; - if (Gf.set(e, t), Gf.size > 500) { - let e = t - 5 * Wf; - for (let [t, n] of Gf.entries()) Number(n) < e && Gf.delete(t); +function Xf(e) { + let t = Date.now(), n = Number(Kf.get(e) || 0); + if (n > 0 && t - n < Gf) return !0; + if (Kf.set(e, t), Kf.size > 500) { + let e = t - 5 * Gf; + for (let [t, n] of Kf.entries()) Number(n) < e && Kf.delete(t); } return !1; } -function Xf(e) { - let t = String(e?.id || "").trim(); - t && (Jf(e) || Yf(t) || ge(t).catch((e) => console.debug?.("[Majoor] auto vector index failed", e))); -} function Zf(e) { + let t = String(e?.id || "").trim(); + t && (Yf(e) || Xf(t) || ge(t).catch((e) => console.debug?.("[Majoor] auto vector index failed", e))); +} +function Qf(e) { let t = String(e?.kind || "").trim().toLowerCase(); if (t) return t; let n = String(e?.filename || e?.filepath || e?.path || e?.fullpath || "").trim(), r = n.includes(".") && n.split(".").pop()?.toLowerCase?.() || ""; @@ -10325,8 +10325,8 @@ function Zf(e) { "spz" ].includes(r) ? "model3d" : "unknown" : ""; } -function Qf(e, { jobId: t = "" } = {}) { - let n = String(e?.filename || "").trim(), r = String(e?.filepath || e?.path || e?.fullpath || e?.full_path || "").trim(), i = String(e?.subfolder || e?.sub_folder || e?.subFolder || "").trim(), a = String(e?.type || e?.source || "output").trim().toLowerCase(), o = String(e?.root_id || e?.custom_root_id || "").trim(), s = Zf(e); +function $f(e, { jobId: t = "" } = {}) { + let n = String(e?.filename || "").trim(), r = String(e?.filepath || e?.path || e?.fullpath || e?.full_path || "").trim(), i = String(e?.subfolder || e?.sub_folder || e?.subFolder || "").trim(), a = String(e?.type || e?.source || "output").trim().toLowerCase(), o = String(e?.root_id || e?.custom_root_id || "").trim(), s = Qf(e); if (!s || !n && !r) return null; let c = n || r.split(/[/\\]/).filter(Boolean).pop() || ""; if (!c) return null; @@ -10337,7 +10337,7 @@ function Qf(e, { jobId: t = "" } = {}) { c ].map((e) => String(e || "").trim().toLowerCase()).join("|"), d = Date.now() / 1e3, f = String(e?.job_id || t || "").trim(); return { - id: `${Kf}:${u || l.toLowerCase()}`, + id: `${qf}:${u || l.toLowerCase()}`, filename: c, filepath: l, path: l, @@ -10360,7 +10360,7 @@ function Qf(e, { jobId: t = "" } = {}) { _mjrLiveLabel: "In progress" }; } -function $f(e) { +function ep(e) { let t = String(e || ""); try { if (typeof CSS < "u" && typeof CSS.escape == "function") return CSS.escape(t); @@ -10369,11 +10369,11 @@ function $f(e) { } return t.replace(/([!"#$%&'()*+,./:;<=>?@[\\\]^`{|}~])/g, "\\$1"); } -function ep(e, t) { +function tp(e, t) { let n = String(e || "").trim().toLowerCase(); return n === "delete_db" ? t("btn.deleteDb", "Delete DB") : n === "reset_index" ? t("btn.resetIndex", "Reset index") : n === "restore_db" ? t("btn.dbRestore", "Restore DB") : t("btn.maintenance", "Maintenance"); } -function tp(e, t) { +function np(e, t) { let n = String(e || "").trim().toLowerCase(), r = String(t || "").trim().toLowerCase(), i = { delete_db: [ "started", @@ -10407,7 +10407,7 @@ function tp(e, t) { label: r.replace(/[_-]+/g, " ") }; } -async function np({ api: e, runtime: t, executionRuntime: n, appRef: r, liveStreamModule: i, ensureExecutionRuntime: a, emitRuntimeStatus: o, getActiveGridContainer: s, pushGeneratedAsset: c, upsertAsset: l, upsertAssetNow: u, removeAssetsFromGrid: d, getEnrichmentState: f, setEnrichmentState: p, comfyToast: m, t: h, reportError: g, registerCleanableListener: _, syncExecutionBackendState: v }) { +async function rp({ api: e, runtime: t, executionRuntime: n, appRef: r, liveStreamModule: i, ensureExecutionRuntime: a, emitRuntimeStatus: o, getActiveGridContainer: s, pushGeneratedAsset: c, upsertAsset: l, upsertAssetNow: u, removeAssetsFromGrid: d, getEnrichmentState: f, setEnrichmentState: p, comfyToast: m, t: h, reportError: g, registerCleanableListener: _, syncExecutionBackendState: v }) { e._mjrExecutedHandler = (e) => { try { n.handleExecutedEvent(e, { appRef: r }); @@ -10471,7 +10471,7 @@ async function np({ api: e, runtime: t, executionRuntime: n, appRef: r, liveStre function b(e, t, { immediate: n = !1, force: r = !1 } = {}) { let i = String(t?.id || "").trim(), a = String(t?.kind || "").trim(), o = String(t?.filename || "").trim(), s = String(t?.filepath || "").trim(), c = !!a && (!!o || !!s), d = !1; if (i) try { - d = typeof e?._mjrHasAssetId == "function" ? !!e._mjrHasAssetId(i) : !!e.querySelector(`.mjr-asset-card[data-mjr-asset-id="${$f(i)}"]`); + d = typeof e?._mjrHasAssetId == "function" ? !!e._mjrHasAssetId(i) : !!e.querySelector(`.mjr-asset-card[data-mjr-asset-id="${ep(i)}"]`); } catch (e) { console.debug?.(e); } @@ -10500,7 +10500,7 @@ async function np({ api: e, runtime: t, executionRuntime: n, appRef: r, liveStre if (n !== "output" && n !== "all") return; let r = Array.isArray(e?.detail?.files) ? e.detail.files : [], i = String(e?.detail?.prompt_id || e?.detail?.promptId || "").trim(); for (let e of r) { - let n = Qf(e, { jobId: i }); + let n = $f(e, { jobId: i }); n && b(t, n, { immediate: !0, force: !0 @@ -10515,19 +10515,19 @@ async function np({ api: e, runtime: t, executionRuntime: n, appRef: r, liveStre let t = n.prepareLiveAssetEvent(e.detail), r = t?.detail || e.detail; if (t?.defer) return; let i = n.isRenderableLiveAsset(r); - i && c(r), Xf(r); + i && c(r), Zf(r); let a = s(); if (!a) { - i && Hf(); + i && Uf(); return; } let o = a.dataset?.mjrScope || "output"; if (o !== "output" && o !== "all") { - i && Hf(); + i && Uf(); return; } let l = a.dataset?.mjrQuery || "*"; - String(l).trim() === "*" && i ? b(a, r, { immediate: !0 }) || Hf() : i && Hf(); + String(l).trim() === "*" && i ? b(a, r, { immediate: !0 }) || Uf() : i && Uf(); } catch (e) { g(e, "entry.asset_added"); } @@ -10590,7 +10590,7 @@ async function np({ api: e, runtime: t, executionRuntime: n, appRef: r, liveStre if (window.dispatchEvent(new CustomEvent(V.ASSET_INDEXED, { detail: t })), !t) return; let r = n.prepareLiveAssetEvent(t), i = r?.detail || t; if (r?.defer) return; - n.isRenderableLiveAsset(i) && (c(i), zf(i)), Xf(i); + n.isRenderableLiveAsset(i) && (c(i), Bf(i)), Zf(i); let a = s(); if (!a) return; b(a, i, { @@ -10625,11 +10625,11 @@ async function np({ api: e, runtime: t, executionRuntime: n, appRef: r, liveStre if (!s) return; let c = r === "error" || n === "failed" ? "error" : n === "done" ? "success" : "info", l = { history: { trackId: `maintenance:${String(i || "db_restore").trim().toLowerCase() || "db_restore"}`, - title: ep(i, h), + title: tp(i, h), detail: s, status: n, operation: String(i || "db_restore").trim().toLowerCase(), - progress: tp(i, n), + progress: np(i, n), source: String(t?.name || "").trim() || "maintenance", forceStore: !0 } }; @@ -10638,7 +10638,7 @@ async function np({ api: e, runtime: t, executionRuntime: n, appRef: r, liveStre "done", "failed" ].includes(n)) { - ee(s, c, 0, l); + xe(s, c, 0, l); return; } m(s, c, n === "done" || n === "failed" ? 2800 : 1800, l); @@ -10659,7 +10659,7 @@ async function np({ api: e, runtime: t, executionRuntime: n, appRef: r, liveStre _(t, window, V.ASSETS_DELETED, x), t && typeof t == "object" && (t.api = e, t.assetsDeletedHandler = x), console.debug("[Majoor] Real-time listener registered"); } // ui/features/runtime/entryDebugApi.ts -function rp({ resolveNodeStreamModule: e }) { +function ip({ resolveNodeStreamModule: e }) { typeof window < "u" && (window.MajoorDebug = { exportMetrics: () => window.MajoorMetrics?.exportMetrics?.(), getMetrics: () => window.MajoorMetrics?.getMetricsReport?.(), @@ -10674,16 +10674,16 @@ function rp({ resolveNodeStreamModule: e }) { }, console.debug?.("[Majoor] NodeStream API: window.MajoorNodeStream.mode, .listAdapters(), .getKnownNodeSets()")); } // ui/features/runtime/benignConsoleNoise.ts -var ip = ["ResizeObserver loop completed with undelivered notifications.", "ResizeObserver loop limit exceeded"]; -function ap(e) { +var ap = ["ResizeObserver loop completed with undelivered notifications.", "ResizeObserver loop limit exceeded"]; +function op(e) { try { let t = String(e?.message || e || ""); - return ip.some((e) => t.includes(e)); + return ap.some((e) => t.includes(e)); } catch { return !1; } } -function op() { +function sp() { if (typeof window > "u") return null; try { window.__MJR_BENIGN_CONSOLE_NOISE_FILTER__?.abort?.(); @@ -10698,7 +10698,7 @@ function op() { } let t = (e) => { try { - if (!ap(e?.message || e?.error)) return; + if (!op(e?.message || e?.error)) return; e.preventDefault?.(), e.stopImmediatePropagation?.(); } catch (e) { console.debug?.(e); @@ -10723,7 +10723,7 @@ function op() { return window.__MJR_BENIGN_CONSOLE_NOISE_FILTER__ = r, r; } // ui/features/geninfo/genInfoOverridePicker.ts -var sp = "Majoor.GenInfoOverridePicker", cp = "MajoorGenInfoOverride", lp = R("genInfoOverride.autoFillFromWorkflow", "Auto fill from workflow"), up = R("genInfoOverride.pick", "Pick"), dp = { +var cp = "Majoor.GenInfoOverridePicker", lp = "MajoorGenInfoOverride", up = R("genInfoOverride.autoFillFromWorkflow", "Auto fill from workflow"), dp = R("genInfoOverride.pick", "Pick"), fp = { positive_prompt: [ "positive_prompt", "prompt", @@ -10746,7 +10746,7 @@ var sp = "Majoor.GenInfoOverridePicker", cp = "MajoorGenInfoOverride", lp = R("g ], vae: ["vae", "vae_name"], clip: ["clip", "clip_name"] -}, fp = [ +}, pp = [ { field: "positive_prompt", label: "prompt" @@ -10791,14 +10791,14 @@ var sp = "Majoor.GenInfoOverridePicker", cp = "MajoorGenInfoOverride", lp = R("g field: "denoise", label: "denoise" } -], pp = 0x10000000000000000, mp = !1, hp = !1; -function gp(e, t) { +], mp = 0x10000000000000000, hp = !1, gp = !1; +function _p(e, t) { let n = (e.widgets ?? []).find((e) => e?.name === t); if (n && n.value !== void 0 && n.value !== null && String(n.value).trim() !== "") return n.value; let r = Array.isArray(e.widgets_values) ? e.widgets_values : [], i = (Array.isArray(e.widgets) ? e.widgets : []).findIndex((e) => e?.name === t); return i >= 0 ? r[i] : void 0; } -function _p(e, t, n, r, i) { +function vp(e, t, n, r, i) { if (r == null || String(r).trim() === "") return; let a = `${n}:${String(r).trim()}`; t.has(a) || (t.add(a), e.push({ @@ -10808,42 +10808,42 @@ function _p(e, t, n, r, i) { source: i })); } -function vp(e, t, n) { +function yp(e, t, n) { let r = t.toLowerCase(); - return !!((dp[e] ?? [e]).some((e) => r === e || r.includes(e)) || e === "positive_prompt" && r === "text" && n.toLowerCase().includes("positive") || e === "negative_prompt" && (r.includes("negative") || n.toLowerCase().includes("negative"))); + return !!((fp[e] ?? [e]).some((e) => r === e || r.includes(e)) || e === "positive_prompt" && r === "text" && n.toLowerCase().includes("positive") || e === "negative_prompt" && (r.includes("negative") || n.toLowerCase().includes("negative"))); } -function yp(e, t = null) { +function bp(e, t = null) { let n = [], r = /* @__PURE__ */ new Set(); - for (let { graph: i, label: a } of mt(e)) for (let e of ft(i)) { - if (String(e?.comfyClass || e?.type || "") === cp) continue; + for (let { graph: i, label: a } of ht(e)) for (let e of pt(i)) { + if (String(e?.comfyClass || e?.type || "") === lp) continue; let i = String(e?.title || e?.comfyClass || e?.type || `Node ${e?.id ?? ""}`).trim(), o = a === "Workflow" ? i : `${a} / ${i}`; - for (let [t, i] of Object.entries(dp)) for (let a of i) _p(n, r, t, gp(e, a), o); + for (let [t, i] of Object.entries(fp)) for (let a of i) vp(n, r, t, _p(e, a), o); let s = Array.isArray(e.widgets) ? e.widgets : [], c = Array.isArray(e.widgets_values) ? e.widgets_values : []; s.forEach((e, a) => { let s = String(e?.name || "").toLowerCase(), l = e?.value ?? c[a]; - s.includes("positive") || s === "text" && String(i).toLowerCase().includes("positive") ? _p(n, r, "positive_prompt", l, o) : s.includes("negative") && _p(n, r, "negative_prompt", l, o), t && vp(t, s, i) && _p(n, r, t, l, `${o} / ${e?.name || `widget ${a + 1}`}`); + s.includes("positive") || s === "text" && String(i).toLowerCase().includes("positive") ? vp(n, r, "positive_prompt", l, o) : s.includes("negative") && vp(n, r, "negative_prompt", l, o), t && yp(t, s, i) && vp(n, r, t, l, `${o} / ${e?.name || `widget ${a + 1}`}`); }); } return t ? n.filter((e) => e.field === t).slice(0, 120) : n.slice(0, 80); } -function bp(e, t) { +function xp(e, t) { return (e.widgets ?? []).find((e) => e?.name === t); } -function xp(e) { - let t = bp(e, "seed"); +function Sp(e) { + let t = xp(e, "seed"); t && (t.options = { ...t.options ?? {}, min: -1, - max: pp, + max: mp, control_after_generate: !1 }); } -function Sp(e, t) { +function Cp(e, t) { return t === "positive_prompt" ? e?.prompt ?? e?.positive_prompt : t === "negative_prompt" ? e?.negative_prompt ?? e?.negative : t === "loras_json" && Array.isArray(e?.loras) ? JSON.stringify(e.loras) : t === "custom_info_json" && Array.isArray(e?.custom_info) ? JSON.stringify(e.custom_info) : e?.[t]; } -function Cp(e, t) { +function wp(e, t) { if (!e || !t || typeof t != "object") return 0; - xp(e); + Sp(e); let n = 0; for (let r of [ "positive_prompt", @@ -10861,16 +10861,16 @@ function Cp(e, t) { "workflow_notes", "custom_info_json" ]) { - let i = Sp(t, r); + let i = Cp(t, r); if (i == null) continue; - let a = bp(e, r); - a && (wp(a, i, e, r), Tp(a, i), n += 1); + let a = xp(e, r); + a && (Tp(a, i, e, r), Ep(a, i), n += 1); } return n; } -function wp(e, t, n, r) { +function Tp(e, t, n, r) { if (r !== "seed") { - Kn(e, t, n); + qn(e, t, n); return; } let i = Number(t); @@ -10878,15 +10878,15 @@ function wp(e, t, n, r) { e.options = { ...e.options ?? {}, min: -1, - max: pp, + max: mp, control_after_generate: !1 }, e.value = Math.trunc(i); try { - e.callback?.(e.value, Ze()?.canvas ?? null, n, null, e); + e.callback?.(e.value, Qe()?.canvas ?? null, n, null, e); } catch {} } } -function Tp(e, t) { +function Ep(e, t) { let n = String(t ?? ""), r = [ e?.inputEl, e?.element, @@ -10899,138 +10899,134 @@ function Tp(e, t) { e.value = n; } catch {} } -function Ep(e, t, n) { - let r = jp({ detail: { output: t } }); - if (r && Cp(e, r)) try { +function Dp(e, t, n) { + let r = Mp({ detail: { output: t } }); + if (r && wp(e, r)) try { e.setSize?.(e.computeSize?.()), e.graph?.setDirtyCanvas?.(!0, !0), e.graph?.change?.(), n?.graph?.setDirtyCanvas?.(!0, !0), n?.graph?.change?.(), n?.canvas?.setDirty?.(!0, !0), n?.canvas?.draw?.(!0, !0); } catch {} } -function Dp(e, t, n = null) { - let r = n || t.field, i = bp(e, r); - i && (wp(i, t.value, e, r), Tp(i, t.value)); +function Op(e, t, n = null) { + let r = n || t.field, i = xp(e, r); + i && (Tp(i, t.value, e, r), Ep(i, t.value)); } -function Op(e) { +function kp(e) { return !e || e.value === void 0 || e.value === null || String(e.value).trim() === ""; } -function kp(e, t) { - let n = yp(t), r = 0; - for (let t of Object.keys(dp)) { - let i = bp(e, t); - if (!i || !Op(i)) continue; - let a = n.find((e) => e.field === t); - a && (wp(i, a.value, e, t), Tp(i, a.value), r += 1); +function Ap(t, n) { + let r = bp(n), i = 0; + for (let e of Object.keys(fp)) { + let n = xp(t, e); + if (!n || !kp(n)) continue; + let a = r.find((t) => t.field === e); + a && (Tp(n, a.value, t, e), Ep(n, a.value), i += 1); } - return t?.graph?.setDirtyCanvas?.(!0, !0), t?.graph?.change?.(), t?.extensionManager?.toast?.add?.({ - severity: r ? "success" : "warn", + return n?.graph?.setDirtyCanvas?.(!0, !0), n?.graph?.change?.(), e({ summary: "Majoor Gen Info", - detail: r ? `Filled ${r} empty override fields.` : "No empty matching fields found.", - life: 3e3 - }), r; + detail: i ? `Filled ${i} empty override fields.` : "No empty matching fields found." + }, i ? "success" : "warning", 3e3), i; } -function Ap(e, t) { - if (e && String(e?.comfyClass || e?.type || "") === cp && (xp(e), !(e.widgets ?? []).some((e) => e?.name === lp) && typeof e.addWidget == "function")) { - e.addWidget("button", lp, null, () => kp(e, t)); - for (let n of fp) { - let r = `${up} ${n.label}`; - (e.widgets ?? []).some((e) => e?.name === r) || e.addWidget("button", r, null, () => Np(e, t, n.field)); +function jp(e, t) { + if (e && String(e?.comfyClass || e?.type || "") === lp && (Sp(e), !(e.widgets ?? []).some((e) => e?.name === up) && typeof e.addWidget == "function")) { + e.addWidget("button", up, null, () => Ap(e, t)); + for (let n of pp) { + let r = `${dp} ${n.label}`; + (e.widgets ?? []).some((e) => e?.name === r) || e.addWidget("button", r, null, () => Pp(e, t, n.field)); } try { e.setSize?.(e.computeSize?.()), t?.graph?.setDirtyCanvas?.(!0, !0); } catch {} } } -function jp(e) { +function Mp(e) { let t = e?.detail?.output, n = t?.majoor_geninfo_override ?? t?.ui?.majoor_geninfo_override, r = Array.isArray(n) ? n[0] : n; return r && typeof r == "object" ? r : null; } -function Mp(e) { - if (hp) return; +function Np(e) { + if (gp) return; let t = e?.api; - t && typeof t.addEventListener == "function" && (hp = !0, t.addEventListener("executed", (t) => { + t && typeof t.addEventListener == "function" && (gp = !0, t.addEventListener("executed", (t) => { let n = t?.detail?.node ?? t?.detail?.display_node; if (!n) return; - let r = pt(e, n); - r && String(r?.comfyClass || r?.type || "") === cp && Ep(r, t?.detail?.output, e); + let r = mt(e, n); + r && String(r?.comfyClass || r?.type || "") === lp && Dp(r, t?.detail?.output, e); })); } -function Np(e, t, n = null) { - let r = yp(t, n); - if (!r.length) { - t?.extensionManager?.toast?.add?.({ - severity: "warn", +function Pp(t, n, r = null) { + let i = bp(n, r); + if (!i.length) { + e({ summary: "Majoor Gen Info", - detail: n ? `No widget value found for ${n}.` : "No workflow parameters found.", - life: 3e3 - }); + detail: r ? `No widget value found for ${r}.` : "No workflow parameters found." + }, "warning", 3e3); return; } - let i = document.createElement("div"); - i.style.cssText = "position:fixed;inset:0;z-index:1000000;background:rgba(0,0,0,.45);display:flex;align-items:center;justify-content:center"; let a = document.createElement("div"); - a.style.cssText = "width:min(720px,92vw);max-height:80vh;overflow:auto;background:#202020;color:#eee;border:1px solid #555;border-radius:8px;padding:12px;box-shadow:0 16px 48px rgba(0,0,0,.55);font:12px sans-serif"; - let o = n ? R("genInfoOverride.pickField", "Pick {field}", { field: n.replace(/_/g, " ") }) : R("genInfoOverride.pickFromWorkflow", "Pick Gen Info from workflow"); - a.innerHTML = "
"; - let s = a.querySelector("strong"); - s && (s.textContent = o); - let c = a.querySelector("[data-close]"); - c && (c.textContent = R("dialog.close", "Close")); - for (let t of r) { - let r = document.createElement("button"); - r.type = "button", r.style.cssText = "width:100%;display:grid;grid-template-columns:130px 1fr 150px;gap:8px;text-align:left;background:#2b2b2b;color:#eee;border:1px solid #3d3d3d;border-radius:5px;padding:7px;margin:5px 0;cursor:pointer", r.innerHTML = `${t.label}`, r.children[1].textContent = String(t.value), r.children[2].textContent = t.source, r.onclick = () => { - Dp(e, t, n), i.remove(); - }, a.appendChild(r); + a.style.cssText = "position:fixed;inset:0;z-index:1000000;background:rgba(0,0,0,.45);display:flex;align-items:center;justify-content:center"; + let o = document.createElement("div"); + o.style.cssText = "width:min(720px,92vw);max-height:80vh;overflow:auto;background:#202020;color:#eee;border:1px solid #555;border-radius:8px;padding:12px;box-shadow:0 16px 48px rgba(0,0,0,.55);font:12px sans-serif"; + let s = r ? R("genInfoOverride.pickField", "Pick {field}", { field: r.replace(/_/g, " ") }) : R("genInfoOverride.pickFromWorkflow", "Pick Gen Info from workflow"); + o.innerHTML = "
"; + let c = o.querySelector("strong"); + c && (c.textContent = s); + let l = o.querySelector("[data-close]"); + l && (l.textContent = R("dialog.close", "Close")); + for (let e of i) { + let n = document.createElement("button"); + n.type = "button", n.style.cssText = "width:100%;display:grid;grid-template-columns:130px 1fr 150px;gap:8px;text-align:left;background:#2b2b2b;color:#eee;border:1px solid #3d3d3d;border-radius:5px;padding:7px;margin:5px 0;cursor:pointer", n.innerHTML = `${e.label}`, n.children[1].textContent = String(e.value), n.children[2].textContent = e.source, n.onclick = () => { + Op(t, e, r), a.remove(); + }, o.appendChild(n); } - i.appendChild(a), a.querySelector("[data-close]")?.addEventListener("click", () => i.remove()), i.addEventListener("click", (e) => { - e.target === i && i.remove(); - }), document.body.appendChild(i); + a.appendChild(o), o.querySelector("[data-close]")?.addEventListener("click", () => a.remove()), a.addEventListener("click", (e) => { + e.target === a && a.remove(); + }), document.body.appendChild(a); } -function Pp(e, t) { - if (String(e?.comfyClass || e?.type || "") !== cp) return []; +function Fp(e, t) { + if (String(e?.comfyClass || e?.type || "") !== lp) return []; let n = [{ content: R("genInfoOverride.pickFromWorkflow", "Pick Gen Info from workflow"), - callback: () => Np(e, t) + callback: () => Pp(e, t) }]; - for (let r of fp) n.push({ + for (let r of pp) n.push({ content: `Pick ${r.label}`, - callback: () => Np(e, t, r.field) + callback: () => Pp(e, t, r.field) }); return n.push({ - content: lp, - callback: () => kp(e, t) + content: up, + callback: () => Ap(e, t) }), n; } -function Fp(e = null) { - if (mp) return; - let t = e || Ze(); - !t || typeof t.registerExtension != "function" ? setTimeout(() => Fp(e), 100) : (mp = !0, Mp(t), t.registerExtension({ - name: sp, +function Ip(e = null) { + if (hp) return; + let t = e || Qe(); + !t || typeof t.registerExtension != "function" ? setTimeout(() => Ip(e), 100) : (hp = !0, Np(t), t.registerExtension({ + name: cp, async nodeCreated(e) { - Ap(e, t); + jp(e, t); }, getNodeMenuItems(e) { - return Pp(e, t); + return Fp(e, t); } }), setTimeout(() => { - for (let { graph: e } of mt(t)) for (let n of ft(e)) Ap(n, t); + for (let { graph: e } of ht(t)) for (let n of pt(e)) jp(n, t); }, 0)); } // ui/vue/composables/useDragDrop.ts -function Ip() { +function Lp() { let e = null; - jr(() => { + Mr(() => { try { - e = os() ?? null; + e = ss() ?? null; } catch (e) { console.warn("[Majoor] useDragDrop: init failed", e); } - }), rr(() => { + }), ir(() => { try { e?.({ force: !0 }); } catch (e) { console.debug?.(e); } try { - ss({ force: !0 }); + cs({ force: !0 }); } catch (e) { console.debug?.(e); } @@ -11038,10 +11034,10 @@ function Ip() { }); } // ui/vue/GlobalRuntime.vue -var Lp = /* @__PURE__ */ dr({ +var Rp = /* @__PURE__ */ fr({ __name: "GlobalRuntime", setup(e) { - let t = ur(() => import("./chunks/ViewerPortal-BStxU0ID.js")), n = Q(!1), r = [ + let t = dr(() => import("./chunks/ViewerPortal-BxqCZGmO.js")), n = Q(!1), r = [ V.OPEN_VIEWER, V.MFV_OPEN, V.MFV_TOGGLE, @@ -11054,7 +11050,7 @@ var Lp = /* @__PURE__ */ dr({ if (n.value) return; n.value = !0; let t = String(e?.type || ""), r = e?.detail ?? null; - t && t !== V.OPEN_VIEWER && lr(() => { + t && t !== V.OPEN_VIEWER && ur(() => { try { window.dispatchEvent(new CustomEvent(t, { detail: r })); } catch (e) { @@ -11062,21 +11058,21 @@ var Lp = /* @__PURE__ */ dr({ } }); } - return Ip(), jr(() => { + return Lp(), Mr(() => { for (let e of r) try { window.addEventListener(e, i, { once: !1 }); } catch (e) { console.debug?.(e); } - }), rr(() => { + }), ir(() => { for (let e of r) try { window.removeEventListener(e, i); } catch (e) { console.debug?.(e); } - }), (e, r) => n.value ? (q(), ir(Z(t), { key: 0 })) : G("", !0); + }), (e, r) => n.value ? (q(), ar(Z(t), { key: 0 })) : G("", !0); } -}), Rp = { +}), zp = { gridRenderCount: 0, gridRenderTotalMs: 0, searchQueryCount: 0, @@ -11087,20 +11083,20 @@ var Lp = /* @__PURE__ */ dr({ thumbnailLoadCount: 0, thumbnailLoadFailures: 0, errorCounts: {} -}, zp = /* @__PURE__ */ new Map(); -function Bp(e) { +}, Bp = /* @__PURE__ */ new Map(); +function Vp(e) { let t = performance.now(); - zp.set(e, t); + Bp.set(e, t); try { performance.mark(`${e}-start`); } catch {} } -function Vp(e, t) { - let n = zp.get(e); +function Hp(e, t) { + let n = Bp.get(e); if (!n) return console.warn(`[Majoor Metrics] Timer not found: ${e}`), 0; let r = performance.now() - n; - if (zp.delete(e), t) { - let e = `${t}Count`, n = `${t}TotalMs`, i = Rp; + if (Bp.delete(e), t) { + let e = `${t}Count`, n = `${t}TotalMs`, i = zp; typeof i[e] == "number" && (i[e]++, i[n] += r); } r > 100 && console.log(`[Majoor Metrics] ${e}: ${r.toFixed(2)}ms`); @@ -11109,15 +11105,15 @@ function Vp(e, t) { } catch {} return r; } -function Hp(e) { - return zp.has(e); -} function Up(e) { + return Bp.has(e); +} +function Wp(e) { try { performance.mark(`${e}-start`); } catch {} } -function Wp(e) { +function Gp(e) { try { performance.mark(`${e}-end`), performance.measure(e, `${e}-start`, `${e}-end`); let t = performance.getEntriesByName(e)[0]?.duration || 0; @@ -11126,47 +11122,47 @@ function Wp(e) { return null; } } -function Gp(e, t = !1) { - Rp.apiCallCount++, Rp.apiCallTotalMs += e, t && Rp.apiErrorCount++; -} -function Kp(e) { - Rp.gridRenderCount++, Rp.gridRenderTotalMs += e; +function Kp(e, t = !1) { + zp.apiCallCount++, zp.apiCallTotalMs += e, t && zp.apiErrorCount++; } function qp(e) { - Rp.searchQueryCount++, Rp.searchQueryTotalMs += e; + zp.gridRenderCount++, zp.gridRenderTotalMs += e; } function Jp(e) { - Rp.thumbnailLoadCount++, e || Rp.thumbnailLoadFailures++; + zp.searchQueryCount++, zp.searchQueryTotalMs += e; } -function Yp(e, t) { - Rp.errorCounts[e] = (Rp.errorCounts[e] || 0) + 1; +function Yp(e) { + zp.thumbnailLoadCount++, e || zp.thumbnailLoadFailures++; } -function Xp() { +function Xp(e, t) { + zp.errorCounts[e] = (zp.errorCounts[e] || 0) + 1; +} +function Zp() { return { - ...Rp, + ...zp, averages: { - gridRenderMs: Rp.gridRenderCount > 0 ? Rp.gridRenderTotalMs / Rp.gridRenderCount : 0, - searchQueryMs: Rp.searchQueryCount > 0 ? Rp.searchQueryTotalMs / Rp.searchQueryCount : 0, - apiCallMs: Rp.apiCallCount > 0 ? Rp.apiCallTotalMs / Rp.apiCallCount : 0 + gridRenderMs: zp.gridRenderCount > 0 ? zp.gridRenderTotalMs / zp.gridRenderCount : 0, + searchQueryMs: zp.searchQueryCount > 0 ? zp.searchQueryTotalMs / zp.searchQueryCount : 0, + apiCallMs: zp.apiCallCount > 0 ? zp.apiCallTotalMs / zp.apiCallCount : 0 }, rates: { - apiErrorRate: Rp.apiCallCount > 0 ? (Rp.apiErrorCount / Rp.apiCallCount * 100).toFixed(2) + "%" : "0%", - thumbnailFailureRate: Rp.thumbnailLoadCount > 0 ? (Rp.thumbnailLoadFailures / Rp.thumbnailLoadCount * 100).toFixed(2) + "%" : "0%" + apiErrorRate: zp.apiCallCount > 0 ? (zp.apiErrorCount / zp.apiCallCount * 100).toFixed(2) + "%" : "0%", + thumbnailFailureRate: zp.thumbnailLoadCount > 0 ? (zp.thumbnailLoadFailures / zp.thumbnailLoadCount * 100).toFixed(2) + "%" : "0%" } }; } -function Zp(e) { - let t = `${e}Count`, n = `${e}TotalMs`, r = Rp, i = r[t], a = r[n]; +function Qp(e) { + let t = `${e}Count`, n = `${e}TotalMs`, r = zp, i = r[t], a = r[n]; return i > 0 ? a / i : 0; } -function Qp() { - let e = Rp; +function $p() { + let e = zp; Object.keys(e).forEach((t) => { typeof e[t] == "number" ? e[t] = 0 : typeof e[t] == "object" && (e[t] = {}); - }), zp.clear(), console.log("[Majoor Metrics] Metrics reset"); + }), Bp.clear(), console.log("[Majoor Metrics] Metrics reset"); } -function $p() { - let e = Xp(); +function em() { + let e = Zp(); console.group("[Majoor Assets Manager] Performance Metrics"), console.table({ "Grid Renders": e.gridRenderCount, "Avg Grid Render": `${e.averages.gridRenderMs.toFixed(2)}ms`, @@ -11179,26 +11175,26 @@ function $p() { "Thumbnail Loads": e.thumbnailLoadCount, "Thumbnail Failures": e.thumbnailLoadFailures, "Failure Rate": e.rates.thumbnailFailureRate - }), Object.keys(Rp.errorCounts).length > 0 && console.log("Error Counts:", Rp.errorCounts), console.groupEnd(); + }), Object.keys(zp.errorCounts).length > 0 && console.log("Error Counts:", zp.errorCounts), console.groupEnd(); } typeof window < "u" && (window.MajoorMetrics = { - startTimer: Bp, - endTimer: Vp, - hasTimer: Hp, - mark: Up, - measure: Wp, - trackApiCall: Gp, - trackGridRender: Kp, - trackSearchQuery: qp, - trackThumbnailLoad: Jp, - trackError: Yp, - getMetricsReport: Xp, - getAverageDuration: Zp, - resetMetrics: Qp, - exportMetrics: $p + startTimer: Vp, + endTimer: Hp, + hasTimer: Up, + mark: Wp, + measure: Gp, + trackApiCall: Kp, + trackGridRender: qp, + trackSearchQuery: Jp, + trackThumbnailLoad: Yp, + trackError: Xp, + getMetricsReport: Zp, + getAverageDuration: Qp, + resetMetrics: $p, + exportMetrics: em }); // ui/features/status/StatusDot.ts -var em = [{ +var tm = [{ key: "exiftool", labelKey: "tool.exiftool", hintKey: "tool.exiftool.hint" @@ -11206,24 +11202,24 @@ var em = [{ key: "ffprobe", labelKey: "tool.ffprobe", hintKey: "tool.ffprobe.hint" -}], tm = !1, nm = null, rm = null, im = "__MJR_STATUS_DOT_CACHE__", am = { +}], nm = !1, rm = null, im = null, am = "__MJR_STATUS_DOT_CACHE__", om = { ACTIVE: "active", COOLDOWN: "cooldown", IDLE: "idle" -}, om = { - [am.ACTIVE]: 2e3, - [am.COOLDOWN]: 1e4, - [am.IDLE]: 6e4 +}, sm = { + [om.ACTIVE]: 2e3, + [om.COOLDOWN]: 1e4, + [om.IDLE]: 6e4 }; -function sm(e) { - tm = !!e; +function cm(e) { + nm = !!e; try { - globalThis._mjrMaintenanceActive = tm; + globalThis._mjrMaintenanceActive = nm; } catch (e) { console.debug?.(e); } } -function cm(e) { +function lm(e) { let t = Number(e); if (!Number.isFinite(t) || t <= 0) return "0 B"; let n = [ @@ -11237,7 +11233,7 @@ function cm(e) { let a = r >= 100 ? 0 : r >= 10 ? 1 : 2; return `${r.toFixed(a)} ${n[i]}`; } -function lm(e, t, n = null) { +function um(e, t, n = null) { if (e && (e.replaceChildren(), (Array.isArray(t) ? t.filter((e) => e != null && String(e).trim() !== "") : []).forEach((t, n) => { n > 0 && e.appendChild(document.createElement("br")), e.appendChild(document.createTextNode(String(t))); }), n != null && String(n).trim() !== "")) { @@ -11246,7 +11242,7 @@ function lm(e, t, n = null) { t.style.fontSize = "11px", t.style.opacity = "0.6", t.textContent = String(n), e.appendChild(t); } } -function um(e, t = []) { +function dm(e, t = []) { if (!e) return; let n = Array.isArray(t) ? t.filter((e) => e && String(e.label || "").trim()) : []; if (!n.length) return; @@ -11266,7 +11262,7 @@ function um(e, t = []) { } e.appendChild(r); } -function dm(e, { totalAssets: t = 0, withWorkflows: n = 0, withGenerationData: r = 0 } = {}) { +function fm(e, { totalAssets: t = 0, withWorkflows: n = 0, withGenerationData: r = 0 } = {}) { let i = Math.max(0, Number(t || e?.total_assets || 0) || 0); if (i <= 0) return []; let a = (e, t = i) => { @@ -11312,13 +11308,13 @@ function dm(e, { totalAssets: t = 0, withWorkflows: n = 0, withGenerationData: r } : null ].filter(Boolean); } -function fm(e, t, n) { +function pm(e, t, n) { if (!e) return; e.replaceChildren(), e.appendChild(document.createTextNode(String(t || ""))), e.appendChild(document.createElement("br")); let r = document.createElement("span"); r.style.fontSize = "11px", r.style.opacity = "0.7", r.textContent = String(n || ""), e.appendChild(r); } -function pm(t, n = "neutral", r = {}) { +function mm(t, n = "neutral", r = {}) { if (!t) return; let i = r?.toast !== !1, a = { neutral: { @@ -11384,23 +11380,23 @@ function pm(t, n = "neutral", r = {}) { } } } -function mm(e) { +function hm(e) { let t = String(e || "").toLowerCase(); return t === "all" ? R("scope.allFull", "All (Inputs + Outputs)") : t === "input" || t === "inputs" ? R("scope.input", "Inputs") : t === "custom" ? R("scope.custom", "Browser") : t === "workflow" ? R("scope.workflow", "Workflow") : R("scope.output", "Outputs"); } -function hm(e, t = "") { - if (!e || typeof e != "object") return t ? R("status.watcher.disabledScoped", "Watcher: disabled ({scope})", { scope: mm(t) }) : R("status.watcher.disabled", "Watcher: disabled"); +function gm(e, t = "") { + if (!e || typeof e != "object") return t ? R("status.watcher.disabledScoped", "Watcher: disabled ({scope})", { scope: hm(t) }) : R("status.watcher.disabled", "Watcher: disabled"); let n = !!e.enabled, r = e.scope ? String(e.scope) : ""; - return n ? r ? R("status.watcher.enabledScoped", `Watcher: enabled (${r})`, { scope: mm(r) }) : R("status.watcher.enabled", "Watcher: enabled") : r || t ? R("status.watcher.disabledScoped", "Watcher: disabled ({scope})", { scope: mm(t && r && r !== t ? t : r || t) }) : R("status.watcher.disabled", "Watcher: disabled"); + return n ? r ? R("status.watcher.enabledScoped", `Watcher: enabled (${r})`, { scope: hm(r) }) : R("status.watcher.enabled", "Watcher: enabled") : r || t ? R("status.watcher.disabledScoped", "Watcher: disabled ({scope})", { scope: hm(t && r && r !== t ? t : r || t) }) : R("status.watcher.disabled", "Watcher: disabled"); } -function gm(e = "status-action") { +function _m(e = "status-action") { try { window?.dispatchEvent?.(new CustomEvent("mjr:reload-grid", { detail: { reason: String(e || "status-action") } })); } catch (e) { console.debug?.(e); } } -function _m(e = "status-action", t = {}) { +function vm(e = "status-action", t = {}) { try { window?.dispatchEvent?.(new CustomEvent("mjr-grid-dirty", { detail: { reason: String(e || "status-action"), @@ -11410,21 +11406,14 @@ function _m(e = "status-action", t = {}) { console.debug?.(e); } } -function vm(e = "") { - try { - window?.dispatchEvent?.(new CustomEvent(V.OPEN_MESSAGE_HISTORY, { detail: { reason: String(e || "status-action") } })); - } catch (e) { - console.debug?.(e); - } -} async function ym(e = "") { - return await Ut(R("dialog.vectorsReset.keepQuestion", "Keep existing AI vectors?\n\nConfirm = keep vectors\nCancel = continue without vectors"), e || R("dialog.vectorsReset.title", "AI vectors")); + return await Wt(R("dialog.vectorsReset.keepQuestion", "Keep existing AI vectors?\n\nConfirm = keep vectors\nCancel = continue without vectors"), e || R("dialog.vectorsReset.title", "AI vectors")); } function bm(t = {}) { let n = typeof t?.getScanContext == "function" ? t.getScanContext : null; - sm(!1); + cm(!1); let r = document.createElement("div"); - r.style.cssText = "margin-bottom: 20px; padding: 12px; background: var(--bg-color, #1a1a1a); border-radius: 6px; border: 1px solid var(--border-color, #333); cursor: pointer; transition: all 0.2s;", pm(r, "info", { toast: !1 }); + r.style.cssText = "margin-bottom: 20px; padding: 12px; background: var(--bg-color, #1a1a1a); border-radius: 6px; border: 1px solid var(--border-color, #333); cursor: pointer; transition: all 0.2s;", mm(r, "info", { toast: !1 }); let i = document.createElement("div"); i.style.cssText = "display: flex; align-items: center; gap: 10px; margin-bottom: 8px;"; let a = document.createElement("span"); @@ -11470,7 +11459,7 @@ function bm(t = {}) { for (let t of n) { let n = String(t?.name || ""); if (!n) continue; - let i = Number(t?.mtime || 0), a = Number(t?.size_bytes || 0), o = i > 0 ? (/* @__PURE__ */ new Date(i * 1e3)).toLocaleString() : "", s = `${n}${o ? ` (${o}` : ""}${a > 0 ? `, ${cm(a)}` : ""}${o ? ")" : ""}`, c = document.createElement("option"); + let i = Number(t?.mtime || 0), a = Number(t?.size_bytes || 0), o = i > 0 ? (/* @__PURE__ */ new Date(i * 1e3)).toLocaleString() : "", s = `${n}${o ? ` (${o}` : ""}${a > 0 ? `, ${lm(a)}` : ""}${o ? ")" : ""}`, c = document.createElement("option"); c.value = n, c.textContent = s, e && e === n && (c.selected = !0, r = !0), h.appendChild(c); } g = h.childNodes.length > 0, h.disabled = !g, g && !r && h.childNodes[0] && (h.value = String(h.childNodes[0]?.value || "")), _ && (_.disabled = !g); @@ -11481,16 +11470,16 @@ function bm(t = {}) { y(), m.appendChild(h); let b = document.createElement("button"); b.type = "button", b.textContent = R("btn.dbSave", "Save DB"), b.title = R("status.dbSaveHint", "Save a DB snapshot into archive folder"), b.style.cssText = "\n padding: 5px 10px;\n font-size: 11px;\n border-radius: 6px;\n border: 1px solid rgba(120,200,255,0.35);\n background: transparent;\n color: inherit;\n cursor: pointer;\n ", b.onclick = async (t) => { - t.stopPropagation(), sm(!0); + t.stopPropagation(), cm(!0); let i = b.textContent, o = !!_?.disabled; - b.disabled = !0, _ && (_.disabled = !0), b.textContent = R("btn.saving", "Saving..."), a.style.background = "var(--mjr-status-info, #64B5F6)", pm(r, "info"); + b.disabled = !0, _ && (_.disabled = !0), b.textContent = R("btn.saving", "Saving..."), a.style.background = "var(--mjr-status-info, #64B5F6)", mm(r, "info"); try { - let t = await Te(); + let t = await Ee(); if (t?.ok) { let n = String(t?.data?.name || "").trim(), r = Number(t?.data?.size_bytes || 0); e(R("toast.dbSaveSuccess", "Database backup saved"), "success", 2200, { history: { title: R("btn.dbSave", "Save DB"), - detail: n ? `${n}${r > 0 ? ` | ${cm(r)}` : ""}` : R("toast.dbSaveSuccess", "Database backup saved"), + detail: n ? `${n}${r > 0 ? ` | ${lm(r)}` : ""}` : R("toast.dbSaveSuccess", "Database backup saved"), operation: "save_db", source: n || "archive", forceStore: !0 @@ -11499,7 +11488,7 @@ function bm(t = {}) { } catch (t) { e(t?.message || R("toast.dbSaveFailed", "Failed to save DB backup"), "error"); } finally { - sm(!1), b.disabled = !1, _ && (_.disabled = o || !g), b.textContent = i; + cm(!1), b.disabled = !1, _ && (_.disabled = o || !g), b.textContent = i; try { let e = n ? n() : null; await km(a, d, f, e, null, { force: !0 }); @@ -11514,7 +11503,7 @@ function bm(t = {}) { e(R("toast.dbRestoreSelect", "Select a DB backup first"), "warning", 2e3); return; } - if (!await Ut(`${R("dialog.dbRestore.confirm", "Restore selected DB backup? Current DB will be replaced.")}\n\n${i}`, R("btn.dbRestore", "Restore DB"))) return; + if (!await Wt(`${R("dialog.dbRestore.confirm", "Restore selected DB backup? Current DB will be replaced.")}\n\n${i}`, R("btn.dbRestore", "Restore DB"))) return; e(R("toast.dbRestoreStarted", "DB restore started"), "info", 1800, { history: { trackId: "maintenance:restore_db", title: R("btn.dbRestore", "Restore DB"), @@ -11523,9 +11512,9 @@ function bm(t = {}) { source: i, status: "started", forceStore: !0 - } }), sm(!0); + } }), cm(!0); let o = _.textContent, s = !!b.disabled; - _.disabled = !0, b.disabled = !0, h.disabled = !0, _.textContent = R("btn.restoring", "Restoring..."), a.style.background = "var(--mjr-status-warning, #FFA726)", pm(r, "warning"); + _.disabled = !0, b.disabled = !0, h.disabled = !0, _.textContent = R("btn.restoring", "Restoring..."), a.style.background = "var(--mjr-status-warning, #FFA726)", mm(r, "warning"); try { let t = await M({ name: i, @@ -11535,7 +11524,7 @@ function bm(t = {}) { } catch (t) { e(t?.message || R("toast.dbRestoreFailed", "Failed to restore DB backup"), "error"); } finally { - sm(!1), _.disabled = !g, b.disabled = s, h.disabled = !g, _.textContent = o, gm("db-restore"); + cm(!1), _.disabled = !g, b.disabled = s, h.disabled = !g, _.textContent = o, _m("db-restore"); try { let e = n ? n() : null; await km(a, d, f, e, null, { force: !0 }); @@ -11559,13 +11548,13 @@ function bm(t = {}) { }, D.onclick = async (e) => { e.stopPropagation(); let t = await ym(R("btn.resetIndex", "Reset index")); - if (!await Ut(t ? R("dialog.resetIndex.confirmKeepVectors", "This will reset index data and rescan files while keeping existing AI vectors.\n\nContinue?") : R("dialog.resetIndex.msg", "This will delete the database and rescan all files. Continue?"), R("dialog.resetIndex.title", "Reset index?"))) return; - vm("reset-index"), sm(!0); + if (!await Wt(t ? R("dialog.resetIndex.confirmKeepVectors", "This will reset index data and rescan files while keeping existing AI vectors.\n\nContinue?") : R("dialog.resetIndex.msg", "This will delete the database and rescan all files. Continue?"), R("dialog.resetIndex.title", "Reset index?"))) return; + cm(!0); let i = D.textContent; - D.disabled = !0, E.disabled = !0, D.textContent = R("btn.resetting"), a.style.background = "var(--mjr-status-info, #64B5F6)", pm(r, "info"); + D.disabled = !0, E.disabled = !0, D.textContent = R("btn.resetting"), a.style.background = "var(--mjr-status-info, #64B5F6)", mm(r, "info"); try { let e = n ? n() : {}, i = String(e?.scope || "output").toLowerCase(), o = e?.customRootId || e?.custom_root_id || e?.root_id || null, s = i === "custom" && !o; - (await De({ + (await Oe({ scope: s ? "all" : i, customRootId: s ? null : o, reindex: !0, @@ -11577,11 +11566,11 @@ function bm(t = {}) { clear_assets: !t, preserve_vectors: t, rebuild_fts: !0 - }))?.ok ? (a.style.background = "var(--mjr-status-success, #4CAF50)", pm(r, "success")) : (a.style.background = "var(--mjr-status-error, #f44336)", pm(r, "error")); + }))?.ok ? (a.style.background = "var(--mjr-status-success, #4CAF50)", mm(r, "success")) : (a.style.background = "var(--mjr-status-error, #f44336)", mm(r, "error")); } catch { - a.style.background = "var(--mjr-status-error, #f44336)", pm(r, "error"); + a.style.background = "var(--mjr-status-error, #f44336)", mm(r, "error"); } finally { - sm(!1), D.disabled = !1, E.disabled = !1, D.textContent = i, gm("index-reset"); + cm(!1), D.disabled = !1, E.disabled = !1, D.textContent = i, _m("index-reset"); try { let e = n ? n() : null; await km(a, d, f, e, null, { force: !0 }); @@ -11602,31 +11591,29 @@ function bm(t = {}) { e(R("status.customBrowserScanDisabledHint", "Use Outputs, Inputs, or All to run indexing scans"), "warning", 2600), T("Backfill skipped - Browser scope has no selected custom root.", "warning"); return; } - let c = o || "output", l = mm(c); - vm("vector-backfill"); - let u = { history: { + let c = o || "output", l = hm(c), u = { history: { trackId: `vector-backfill:status:${c}:${s || "default"}`, title: "Vector Backfill", source: l, operation: "vector_backfill", forceStore: !0 } }; - sm(!0); + cm(!0); let p = O.textContent, m = D.textContent; - O.disabled = !0, D.disabled = !0, E.disabled = !0, O.textContent = "Backfilling...", T(`Backfill started (${l})...`, "info"), ee({ + O.disabled = !0, D.disabled = !0, E.disabled = !0, O.textContent = "Backfilling...", T(`Backfill started (${l})...`, "info"), xe({ summary: "Vector Backfill", detail: `Started (${l})` }, "info", 0, { history: { ...u.history, status: "started", detail: `Started (${l})` - } }), a.style.background = "var(--mjr-status-info, #64B5F6)", pm(r, "info"); + } }), a.style.background = "var(--mjr-status-info, #64B5F6)", mm(r, "info"); try { let t = { scope: c, onProgress: (e) => { let t = String(e?.status || "").toLowerCase(), n = e?.progress || e?.result || {}, r = Number(n?.candidates || n?.processed || 0), i = Number(n?.candidate_total || r || 0), a = Number(n?.eligible_total || n?.total_assets || 0), o = Number(n?.indexed || 0), s = Number(n?.skipped || 0), c = Number(n?.errors || 0); - if (t === "queued") T("Backfill queued...", "info"), ee({ + if (t === "queued") T("Backfill queued...", "info"), xe({ summary: "Vector Backfill", detail: `Queued (${l})` }, "info", 0, { history: { @@ -11642,7 +11629,7 @@ function bm(t = {}) { } }); else if (t === "running" || r > 0 || i > 0 || a > 0 || o > 0 || s > 0 || c > 0) { let e = a > 0 ? `Indexed ${o}/${a} assets, candidates ${i}, skipped ${s}, errors ${c}` : `Candidates ${r}, indexed ${o}, skipped ${s}, errors ${c}`; - T(a > 0 ? `Backfill running - indexed ${o}/${a} assets, candidates ${i}, skipped ${s}, errors ${c}` : `Backfill running - candidates ${r}, indexed ${o}, skipped ${s}, errors ${c}`, "info"), ee({ + T(a > 0 ? `Backfill running - indexed ${o}/${a} assets, candidates ${i}, skipped ${s}, errors ${c}` : `Backfill running - candidates ${r}, indexed ${o}, skipped ${s}, errors ${c}`, "info"), xe({ summary: "Vector Backfill", detail: e }, "info", 0, { history: { @@ -11687,7 +11674,7 @@ function bm(t = {}) { errors: d, label: "running" } - } }), T(`Backfill running in background - candidates ${s}, indexed ${c}, skipped ${l}, errors ${d}`, "info"), a.style.background = "var(--mjr-status-info, #64B5F6)", pm(r, "info"); + } }), T(`Backfill running in background - candidates ${s}, indexed ${c}, skipped ${l}, errors ${d}`, "info"), a.style.background = "var(--mjr-status-info, #64B5F6)", mm(r, "info"); } else e(R("toast.vectorBackfillComplete", "Vector backfill complete! Processed: {processed}, Indexed: {indexed}, Skipped: {skipped}", { processed: s, indexed: c, @@ -11705,7 +11692,7 @@ function bm(t = {}) { errors: d, label: "done" } - } }), T(`Backfill OK - processed ${s}, indexed ${c}, skipped ${l}`, "success"), a.style.background = "var(--mjr-status-success, #4CAF50)", pm(r, "success"); + } }), T(`Backfill OK - processed ${s}, indexed ${c}, skipped ${l}`, "success"), a.style.background = "var(--mjr-status-success, #4CAF50)", mm(r, "success"); } else { let t = String(n?.error || R("toast.vectorBackfillFailedGeneric", "Backfill failed")), i = String(n?.code || "").trim(), o = Number(n?.status || 0) || 0, s = [ i ? `code=${i}` : "", @@ -11720,7 +11707,7 @@ function bm(t = {}) { label: "failed", errors: 1 } - } }), T(`Backfill ? - ${s}\nSee console for full payload.`, "error"), console.error("[Majoor] Vector backfill failed response", n), a.style.background = "var(--mjr-status-error, #f44336)", pm(r, "error"); + } }), T(`Backfill ? - ${s}\nSee console for full payload.`, "error"), console.error("[Majoor] Vector backfill failed response", n), a.style.background = "var(--mjr-status-error, #f44336)", mm(r, "error"); } } catch (t) { let n = String(t?.message || t || "Backfill failed"); @@ -11732,9 +11719,9 @@ function bm(t = {}) { label: "failed", errors: 1 } - } }), T(`Backfill EXCEPTION - ${n}\nSee console for stack trace.`, "error"), console.error("[Majoor] Vector backfill exception", t), a.style.background = "var(--mjr-status-error, #f44336)", pm(r, "error"); + } }), T(`Backfill EXCEPTION - ${n}\nSee console for stack trace.`, "error"), console.error("[Majoor] Vector backfill exception", t), a.style.background = "var(--mjr-status-error, #f44336)", mm(r, "error"); } finally { - sm(!1), O.disabled = !1, D.disabled = !1, E.disabled = !1, O.textContent = p, D.textContent = m, gm("vector-backfill"); + cm(!1), O.disabled = !1, D.disabled = !1, E.disabled = !1, O.textContent = p, D.textContent = m, _m("vector-backfill"); try { let e = n ? n() : null; await km(a, d, f, e, null, { force: !0 }); @@ -11749,19 +11736,19 @@ function bm(t = {}) { }, E.onclick = async (t) => { t.stopPropagation(); let i = E.textContent; - E.disabled = !0, O.disabled = !0, D.disabled = !0, E.textContent = R("btn.memoryPurging", "Purging..."), T(R("status.memoryPurgeStarted", "Memory purge started..."), "info"), a.style.background = "var(--mjr-status-info, #64B5F6)", pm(r, "info"); + E.disabled = !0, O.disabled = !0, D.disabled = !0, E.textContent = R("btn.memoryPurging", "Purging..."), T(R("status.memoryPurgeStarted", "Memory purge started..."), "info"), a.style.background = "var(--mjr-status-info, #64B5F6)", mm(r, "info"); try { let t = await C(); if (t?.ok) { let n = t?.data?.comfy_models ? R("toast.memoryPurgeComplete", "Memory purge complete. Majoor AI and ComfyUI model caches were released.") : R("toast.memoryPurgeCompleteMajoorOnly", "Memory purge complete. Majoor AI caches were released."); - e(n, "success", 3200), T(n, "success"), a.style.background = "var(--mjr-status-success, #4CAF50)", pm(r, "success"); + e(n, "success", 3200), T(n, "success"), a.style.background = "var(--mjr-status-success, #4CAF50)", mm(r, "success"); } else { let n = String(t?.error || "Memory purge failed"); - e(n, "error", 4500), T(n, "error"), a.style.background = "var(--mjr-status-error, #f44336)", pm(r, "error"); + e(n, "error", 4500), T(n, "error"), a.style.background = "var(--mjr-status-error, #f44336)", mm(r, "error"); } } catch (t) { let n = String(t?.message || t || "Memory purge failed"); - e(n, "error", 4500), T(n, "error"), a.style.background = "var(--mjr-status-error, #f44336)", pm(r, "error"); + e(n, "error", 4500), T(n, "error"), a.style.background = "var(--mjr-status-error, #f44336)", mm(r, "error"); } finally { E.disabled = !1, O.disabled = !1, D.disabled = !1, E.textContent = i; try { @@ -11780,12 +11767,12 @@ function bm(t = {}) { }, k.onclick = async (e) => { e.stopPropagation(); let t = await ym(R("btn.deleteDb", "Delete DB")); - if (!await Ut(t ? R("dialog.dbDelete.keepVectorsConfirm", "This will reset index data and keep existing AI vectors. Database files will not be force-deleted.\n\nContinue?") : R("dialog.dbDelete.confirm", "This will permanently delete the index database and rebuild it from scratch. All ratings, tags, and cached metadata will be lost.\n\nContinue?"), R("btn.deleteDb", "Delete DB"))) return; - sm(!0); + if (!await Wt(t ? R("dialog.dbDelete.keepVectorsConfirm", "This will reset index data and keep existing AI vectors. Database files will not be force-deleted.\n\nContinue?") : R("dialog.dbDelete.confirm", "This will permanently delete the index database and rebuild it from scratch. All ratings, tags, and cached metadata will be lost.\n\nContinue?"), R("btn.deleteDb", "Delete DB"))) return; + cm(!0); let i = k.textContent; - k.disabled = !0, k.textContent = t ? R("btn.resetting", "Resetting...") : R("btn.deletingDb"), D.disabled = !0, E.disabled = !0, a.style.background = "var(--mjr-status-info, #64B5F6)", pm(r, "info"); + k.disabled = !0, k.textContent = t ? R("btn.resetting", "Resetting...") : R("btn.deletingDb"), D.disabled = !0, E.disabled = !0, a.style.background = "var(--mjr-status-info, #64B5F6)", mm(r, "info"); try { - (t ? await De({ + (t ? await Oe({ scope: "all", reindex: !0, maintenance_force: !0, @@ -11796,11 +11783,11 @@ function bm(t = {}) { clear_assets: !1, preserve_vectors: !0, rebuild_fts: !0 - }) : await c())?.ok ? (globalThis._mjrCorruptToastShown = !1, a.style.background = "var(--mjr-status-success, #4CAF50)", pm(r, "success")) : (a.style.background = "var(--mjr-status-error, #f44336)", pm(r, "error")); + }) : await c())?.ok ? (globalThis._mjrCorruptToastShown = !1, a.style.background = "var(--mjr-status-success, #4CAF50)", mm(r, "success")) : (a.style.background = "var(--mjr-status-error, #f44336)", mm(r, "error")); } catch { - a.style.background = "var(--mjr-status-error, #f44336)", pm(r, "error"); + a.style.background = "var(--mjr-status-error, #f44336)", mm(r, "error"); } finally { - sm(!1), k.disabled = !1, k.textContent = i, D.disabled = !1, E.disabled = !1, gm(t ? "index-reset-preserve-vectors" : "db-force-delete"); + cm(!1), k.disabled = !1, k.textContent = i, D.disabled = !1, E.disabled = !1, _m(t ? "index-reset-preserve-vectors" : "db-force-delete"); try { let e = n ? n() : null; await km(a, d, f, e, null, { force: !0 }); @@ -11819,26 +11806,26 @@ function bm(t = {}) { }), Em(r, !0), r.onmouseenter = () => { r.style.transform = "translateY(-1px)"; }, r.onmouseleave = () => { - r.style.transform = "", pm(r, r.dataset?.mjrStatusTone || "neutral", { toast: !1 }); + r.style.transform = "", mm(r, r.dataset?.mjrStatusTone || "neutral", { toast: !1 }); }; let j = async (e) => { try { let t = e?.detail || {}, i = String(t?.step || ""); if (!i) return; let o = i === "started" || i === "stopping_workers" || i === "resetting_db" || i === "delete_db" || i === "recreate_db" || i === "replacing_files" || i === "restarting_scan"; - if (o ? sm(!0) : (i === "failed" || i === "done") && sm(!1), !r?.isConnected || !a?.isConnected || !d?.isConnected) return; + if (o ? cm(!0) : (i === "failed" || i === "done") && cm(!1), !r?.isConnected || !a?.isConnected || !d?.isConnected) return; if (o) { - a.style.background = "var(--mjr-status-info, #64B5F6)", pm(r, "info", { toast: !1 }), fm(d, R("status.pending", "Pending..."), R("status.dbRestoreInProgress", "Database restore in progress")); + a.style.background = "var(--mjr-status-info, #64B5F6)", mm(r, "info", { toast: !1 }), pm(d, R("status.pending", "Pending..."), R("status.dbRestoreInProgress", "Database restore in progress")); return; } if (i === "failed") { - a.style.background = "var(--mjr-status-error, #f44336)", pm(r, "error", { toast: !1 }), lm(d, [R("status.error", "Error"), String(t?.message || R("toast.dbRestoreFailed", "Failed to restore DB backup"))]); + a.style.background = "var(--mjr-status-error, #f44336)", mm(r, "error", { toast: !1 }), um(d, [R("status.error", "Error"), String(t?.message || R("toast.dbRestoreFailed", "Failed to restore DB backup"))]); return; } if (i === "done") { - a.style.background = "var(--mjr-status-success, #4CAF50)", pm(r, "success", { toast: !1 }); + a.style.background = "var(--mjr-status-success, #4CAF50)", mm(r, "success", { toast: !1 }); let e = String(t?.operation || ""), i = e === "delete_db" ? R("toast.dbDeleteSuccess", "Database deleted and rebuilt. Files are being reindexed.") : e === "reset_index" ? R("toast.resetStarted", "Index reset started. Files will be reindexed in the background.") : R("toast.dbRestoreSuccess", "Database backup restored"); - fm(d, R("status.ready", "Ready"), i); + pm(d, R("status.ready", "Ready"), i); try { let e = n ? n() : null; setTimeout(() => { @@ -11853,8 +11840,8 @@ function bm(t = {}) { } }; try { - let e = nm; - typeof e == "function" && window.removeEventListener("mjr-db-restore-status", e), nm = j, r._mjrDbRestoreStatusHandler = j, window.addEventListener("mjr-db-restore-status", j); + let e = rm; + typeof e == "function" && window.removeEventListener("mjr-db-restore-status", e), rm = j, r._mjrDbRestoreStatusHandler = j, window.addEventListener("mjr-db-restore-status", j); } catch (e) { console.debug?.(e); } @@ -11871,27 +11858,27 @@ function bm(t = {}) { ].filter(Boolean); if (!s.length) return; let c = d?.querySelector?.("span"); - c ? c.textContent = s.join(" | ") : fm(d, R("status.ready", "Ready"), s.join(" | ")); + c ? c.textContent = s.join(" | ") : pm(d, R("status.ready", "Ready"), s.join(" | ")); } catch (e) { console.debug?.(e); } }; try { - let e = rm; - typeof e == "function" && window.removeEventListener(V.RUNTIME_STATUS, e), rm = N, window.addEventListener(V.RUNTIME_STATUS, N); + let e = im; + typeof e == "function" && window.removeEventListener(V.RUNTIME_STATUS, e), im = N, window.addEventListener(V.RUNTIME_STATUS, N); } catch (e) { console.debug?.(e); } return r; } async function xm(t, n, r = null, i = null) { - if (tm) { + if (nm) { e(R("status.maintenanceBusy", "Database maintenance in progress. Please wait."), "warning", 2200); return; } let a = n?.closest?.("#mjr-status-body")?.parentElement || n?.closest?.("div"), o = String(i?.scope || "output").toLowerCase(), s = i?.customRootId || i?.custom_root_id || i?.root_id || null; if (o === "custom" && !s) { - t.style.background = "var(--mjr-status-info, #64B5F6)", pm(a, "info"), fm(n, R("status.customBrowserScanDisabled", "Custom browser mode: scan is disabled"), R("status.customBrowserScanDisabledHint", "Use Outputs, Inputs, or All to run indexing scans")); + t.style.background = "var(--mjr-status-info, #64B5F6)", mm(a, "info"), pm(n, R("status.customBrowserScanDisabled", "Custom browser mode: scan is disabled"), R("status.customBrowserScanDisabledHint", "Use Outputs, Inputs, or All to run indexing scans")); return; } try { @@ -11899,7 +11886,7 @@ async function xm(t, n, r = null, i = null) { if (t && typeof t == "object") { let r = e - Number(t.at || 0); if (r >= 0 && r < 6e5) { - fm(n, R("status.scanInProgress", "Scan already running..."), R("status.scanInProgressHint", "Please wait for the current scan to finish")); + pm(n, R("status.scanInProgress", "Scan already running..."), R("status.scanInProgressHint", "Please wait for the current scan to finish")); return; } } @@ -11919,15 +11906,15 @@ async function xm(t, n, r = null, i = null) { } }, l = null; try { - let e = await re(it.ROOTS); + let e = await re(at.ROOTS); e.ok && (l = e.data); } catch (e) { console.debug?.(e); } if (!l) { - let e = await re(it.CONFIG); + let e = await re(at.CONFIG); if (!e.ok) { - t.style.background = "var(--mjr-status-error, #f44336)", pm(a, "error"), n.textContent = R("status.errorGetConfig"), c(); + t.style.background = "var(--mjr-status-error, #f44336)", mm(a, "error"), n.textContent = R("status.errorGetConfig"), c(); return; } l = { output_directory: e.data.output_directory }; @@ -11938,7 +11925,7 @@ async function xm(t, n, r = null, i = null) { let e = Array.isArray(l?.custom_roots) ? l.custom_roots : [], t = s ? e.find((e) => e?.id === s) : null; d = t?.path ? ` (${t.path})` : ""; } else o === "output" && (d = l?.output_directory ? ` (${l.output_directory})` : ""); - t.style.background = "var(--mjr-status-info, #64B5F6)", pm(a, "info"), fm(n, R("status.scanningScope", `Scanning ${u}${d}...`, { + t.style.background = "var(--mjr-status-info, #64B5F6)", mm(a, "info"), pm(n, R("status.scanningScope", `Scanning ${u}${d}...`, { scope: u, detail: d }), R("status.scanningHint", "This may take a while")); @@ -11946,36 +11933,36 @@ async function xm(t, n, r = null, i = null) { scope: o, recursive: !0, incremental: !0, - fast: !!(Vn()?.scan?.fastMode ?? !0), + fast: !!(Hn()?.scan?.fastMode ?? !0), background_metadata: !0 }; if (o === "custom") { if (!s) { - t.style.background = "var(--mjr-status-error, #f44336)", pm(a, "error"), n.textContent = R("status.selectCustomFolder"), c(); + t.style.background = "var(--mjr-status-error, #f44336)", mm(a, "error"), n.textContent = R("status.selectCustomFolder"), c(); return; } f.custom_root_id = s; } let p; try { - p = await L(it.SCAN, f); + p = await L(at.SCAN, f); } finally { c(); } if (p?.ok) { let e = p.data; - t.style.background = "var(--mjr-status-success, #4CAF50)", pm(a, "success"), fm(n, R("toast.scanComplete"), R("status.scanStats", `Added: ${e.added || 0} - Updated: ${e.updated || 0} - Skipped: ${e.skipped || 0}`, { + t.style.background = "var(--mjr-status-success, #4CAF50)", mm(a, "success"), pm(n, R("toast.scanComplete"), R("status.scanStats", `Added: ${e.added || 0} - Updated: ${e.updated || 0} - Skipped: ${e.skipped || 0}`, { added: e.added || 0, updated: e.updated || 0, skipped: e.skipped || 0 - })), _m("scan-complete", { stats: { + })), vm("scan-complete", { stats: { added: e.added || 0, updated: e.updated || 0, skipped: e.skipped || 0 } }), setTimeout(() => { km(t, n, r); }, 2e3); - } else t.style.background = "var(--mjr-status-error, #f44336)", pm(a, "error"), lm(n, [R("toast.scanFailed") + `: ${p?.error || "Unknown error"}`]), setTimeout(() => { + } else t.style.background = "var(--mjr-status-error, #f44336)", mm(a, "error"), um(n, [R("toast.scanFailed") + `: ${p?.error || "Unknown error"}`]), setTimeout(() => { km(t, n, r); }, 3e3); } @@ -11990,7 +11977,7 @@ function Cm(e, t = {}, n = {}) { return; } let r = document.createElement("div"); - r.style.display = "flex", r.style.flexWrap = "wrap", r.style.gap = "10px", r.style.alignItems = "flex-start", em.forEach(({ key: e, labelKey: i, hintKey: a }) => { + r.style.display = "flex", r.style.flexWrap = "wrap", r.style.gap = "10px", r.style.alignItems = "flex-start", tm.forEach(({ key: e, labelKey: i, hintKey: a }) => { let o = !!t[e], s = n[e], c = R(i, e), l = R(a, ""); r.appendChild(Tm({ label: c, @@ -12005,7 +11992,7 @@ function wm(e, t = null, n = {}) { let i = r.querySelector("#mjr-tools-status"); if (!i) return; let a = n && Object.keys(n).length > 0; - i.textContent = !t && !a ? R("status.toolStatusChecking", "Tool status: checking...") : em.map(({ key: e, labelKey: r }) => { + i.textContent = !t && !a ? R("status.toolStatusChecking", "Tool status: checking...") : tm.map(({ key: e, labelKey: r }) => { let i = R(r, e), a = t && e in t ? t[e] : void 0, o = e in n ? n[e] : void 0, s = a === void 0 ? o : a, c = s == null ? R("status.unknown", "unknown") : s ? R("status.available", "available") : R("status.missing", "missing"), l = t?.versions?.[e]; return l ? `${i}: ${c} - ${l}` : `${i}: ${c}`; }).join(" | "); @@ -12038,21 +12025,21 @@ async function km(t, n, r = null, i = null, a = null, o = {}) { console.debug?.(e); } try { - if (!l && tm) return null; + if (!l && nm) return null; } catch (e) { console.debug?.(e); } a && typeof a == "object" && (a.lastCode = null, a.lastStatus = null); - let u = String(i?.scope || "output").toLowerCase(), d = u === "workflow" ? "all" : u, f = i?.customRootId || i?.custom_root_id || i?.root_id || null, p = u === "custom" && !f, m = p ? `${it.HEALTH_COUNTERS}?scope=all` : d === "custom" ? `${it.HEALTH_COUNTERS}?scope=custom&custom_root_id=${encodeURIComponent(String(f || ""))}` : `${it.HEALTH_COUNTERS}?scope=${encodeURIComponent(d || "output")}`, h = !!o?.lightweight, g = !(!l && a && typeof a == "object" && Number(a._scanAuxBackoffUntil || 0) > Date.now()) && (l || !h || !(a && typeof a == "object" && a._auxCached)), _, v, y, b = null; + let u = String(i?.scope || "output").toLowerCase(), d = u === "workflow" ? "all" : u, f = i?.customRootId || i?.custom_root_id || i?.root_id || null, p = u === "custom" && !f, m = p ? `${at.HEALTH_COUNTERS}?scope=all` : d === "custom" ? `${at.HEALTH_COUNTERS}?scope=custom&custom_root_id=${encodeURIComponent(String(f || ""))}` : `${at.HEALTH_COUNTERS}?scope=${encodeURIComponent(d || "output")}`, h = !!o?.lightweight, g = !(!l && a && typeof a == "object" && Number(a._scanAuxBackoffUntil || 0) > Date.now()) && (l || !h || !(a && typeof a == "object" && a._auxCached)), _, v, y, b = null; if (g) { let [e, t, n] = await Promise.all([ re(m, c ? { signal: c } : void 0), - re(it.HEALTH, c ? { signal: c } : void 0), - re(it.HEALTH_DB, c ? { signal: c } : void 0) + re(at.HEALTH, c ? { signal: c } : void 0), + re(at.HEALTH_DB, c ? { signal: c } : void 0) ]); _ = e, v = t, y = n; try { - let e = await ye(c ? { signal: c } : void 0); + let e = await be(c ? { signal: c } : void 0); e?.ok && (b = e.data); } catch (e) { console.debug?.(e); @@ -12072,16 +12059,16 @@ async function km(t, n, r = null, i = null, a = null, o = {}) { if (a && typeof a == "object" && (a.lastCode = _?.code || null, a.lastStatus = typeof _?.status == "number" ? _.status : null), _.ok) { let e = _.data; a && typeof a == "object" && (a._scanAuxBackoffUntil = e?.scan_active ? Date.now() + 3e4 : 0); - let i = e.total_assets || 0, o = e.with_workflows - 0, l = e.with_generation_data - 0, d = Math.max(0, Number(o || 0) || 0), m = e.last_scan_end, h = m ? new Date(m).toLocaleString() : "N/A", g = e.tool_availability || {}, x = e.tool_paths || {}, S = R("status.dbSize", "Database size: {size}", { size: cm(e.db_size_bytes || 0) }), C = v?.ok && v?.data && v.data.vector || {}, w = C?.enabled !== !1, T = !!C?.loaded, E = !!C?.degraded, D = String(C?.last_error || "").trim(), O = w ? E ? `AI vector: degraded${D ? ` (${D})` : ""}` : T ? "AI vector: loaded" : "AI vector: initializing" : "AI vector: disabled", k = Dm(v?.data || null, y?.data || null), A = Om(e, p ? "all" : u), j = !!(v?.ok && v?.data?.database?.available), M = y?.ok && y?.data?.diagnostics || {}, N = !!M?.malformed, P = !!M?.locked, ee = !!M?.maintenance_active; - sm(ee); - let te = Math.max(0, Number(e?.enrichment_queue_length || 0) || 0), F = Ft().active || te > 0; - xt(F, te); + let i = e.total_assets || 0, o = e.with_workflows - 0, l = e.with_generation_data - 0, d = Math.max(0, Number(o || 0) || 0), m = e.last_scan_end, h = m ? new Date(m).toLocaleString() : "N/A", g = e.tool_availability || {}, x = e.tool_paths || {}, S = R("status.dbSize", "Database size: {size}", { size: lm(e.db_size_bytes || 0) }), C = v?.ok && v?.data && v.data.vector || {}, w = C?.enabled !== !1, T = !!C?.loaded, E = !!C?.degraded, D = String(C?.last_error || "").trim(), O = w ? E ? `AI vector: degraded${D ? ` (${D})` : ""}` : T ? "AI vector: loaded" : "AI vector: initializing" : "AI vector: disabled", k = Dm(v?.data || null, y?.data || null), A = Om(e, p ? "all" : u), j = !!(v?.ok && v?.data?.database?.available), M = y?.ok && y?.data?.diagnostics || {}, N = !!M?.malformed, P = !!M?.locked, ee = !!M?.maintenance_active; + cm(ee); + let te = Math.max(0, Number(e?.enrichment_queue_length || 0) || 0), F = It().active || te > 0; + St(F, te); let I = Number(i) > 0, ne = !!(e?.last_index_end || e?.last_scan_end), re = I && ne, ie = "success"; ee || F ? ie = "info" : !j || N ? ie = "error" : (P || !re || E) && (ie = "warning"); let ae = u === "workflow", oe = p && ie !== "error" ? "browser" : ae && ie !== "error" ? "workflow" : ie, se = e.watcher; try { if (!se || typeof se.enabled != "boolean") { - let t = await Se(c ? { signal: c } : void 0); + let t = await Ce(c ? { signal: c } : void 0); t?.ok && t.data && (se = { enabled: !!t.data.enabled, scope: e?.watcher?.scope || u, @@ -12091,15 +12078,15 @@ async function km(t, n, r = null, i = null, a = null, o = {}) { } catch (e) { console.debug?.(e); } - let L = ae ? R("status.watcher.disabledScoped", "Watcher: disabled ({scope})", { scope: R("scope.workflow", "Workflow") }) : p ? R("status.watcher.disabledScoped", "Watcher: disabled ({scope})", { scope: R("scope.customBrowser", "Browser") }) : hm(se, u), ce = F ? R("status.enrichmentQueue", "Metadata enrichment queue: {count}", { count: te }) : R("status.enrichmentIdle", "Metadata enrichment: idle"); + let L = ae ? R("status.watcher.disabledScoped", "Watcher: disabled ({scope})", { scope: R("scope.workflow", "Workflow") }) : p ? R("status.watcher.disabledScoped", "Watcher: disabled ({scope})", { scope: R("scope.customBrowser", "Browser") }) : gm(se, u), ce = F ? R("status.enrichmentQueue", "Metadata enrichment queue: {count}", { count: te }) : R("status.enrichmentIdle", "Metadata enrichment: idle"); Cm(r, g, x), wm(r, b, g); let le = u === "all" ? R("scope.allFull", "All (Inputs + Outputs)") : u === "input" ? R("scope.input", "Inputs") : u === "custom" ? R("scope.customBrowser", "Browser") : u === "workflow" ? R("scope.workflow", "Workflow") : R("scope.output", "Outputs"); - return ie === "error" ? (t.style.background = "var(--mjr-status-error, #f44336)", pm(s, "error"), fm(n, R("status.dbCorrupted", "Database appears corrupted or unavailable."), [ + return ie === "error" ? (t.style.background = "var(--mjr-status-error, #f44336)", mm(s, "error"), pm(n, R("status.dbCorrupted", "Database appears corrupted or unavailable."), [ k, A, S, L - ].filter(Boolean).join(" | ")), e) : p ? (t.style.background = "var(--mjr-status-browser, #26A69A)", pm(s, "browser"), fm(n, R("status.ready", "Ready"), [R("status.browserMetricsHidden", "Browser mode: global DB/index metrics hidden"), L].filter(Boolean).join(" | ")), e) : ae ? (t.style.background = "#d481c3", pm(s, oe), lm(n, [ + ].filter(Boolean).join(" | ")), e) : p ? (t.style.background = "var(--mjr-status-browser, #26A69A)", mm(s, "browser"), pm(n, R("status.ready", "Ready"), [R("status.browserMetricsHidden", "Browser mode: global DB/index metrics hidden"), L].filter(Boolean).join(" | ")), e) : ae ? (t.style.background = "#d481c3", mm(s, oe), um(n, [ R("status.workflowsIndexed", `${d.toLocaleString()} workflows indexed (${le})`, { count: d.toLocaleString(), scope: le @@ -12111,14 +12098,14 @@ async function km(t, n, r = null, i = null, a = null, o = {}) { A, S, L - ], R("status.lastScan", `Last scan: ${h}`, { date: h })), e) : (i === 0 ? (t.style.background = oe === "browser" ? "var(--mjr-status-browser, #26A69A)" : ie === "info" ? "var(--mjr-status-info, #64B5F6)" : ie === "warning" ? "var(--mjr-status-warning, #FFA726)" : "var(--mjr-status-success, #4CAF50)", pm(s, oe), fm(n, R("status.noAssets", `No assets indexed yet (${le})`, { scope: le }), [ + ], R("status.lastScan", `Last scan: ${h}`, { date: h })), e) : (i === 0 ? (t.style.background = oe === "browser" ? "var(--mjr-status-browser, #26A69A)" : ie === "info" ? "var(--mjr-status-info, #64B5F6)" : ie === "warning" ? "var(--mjr-status-warning, #FFA726)" : "var(--mjr-status-success, #4CAF50)", mm(s, oe), pm(n, R("status.noAssets", `No assets indexed yet (${le})`, { scope: le }), [ R("status.clickToScan", "Click the dot to start a scan"), O, k, A, S, L - ].filter(Boolean).join(" | "))) : (t.style.background = oe === "browser" ? "var(--mjr-status-browser, #26A69A)" : ie === "info" ? "var(--mjr-status-info, #64B5F6)" : ie === "warning" ? "var(--mjr-status-warning, #FFA726)" : "var(--mjr-status-success, #4CAF50)", pm(s, oe), lm(n, [ + ].filter(Boolean).join(" | "))) : (t.style.background = oe === "browser" ? "var(--mjr-status-browser, #26A69A)" : ie === "info" ? "var(--mjr-status-info, #64B5F6)" : ie === "warning" ? "var(--mjr-status-warning, #FFA726)" : "var(--mjr-status-success, #4CAF50)", mm(s, oe), um(n, [ R("status.assetsIndexed", `${i.toLocaleString()} assets indexed (${le})`, { count: i.toLocaleString(), scope: le @@ -12134,16 +12121,16 @@ async function km(t, n, r = null, i = null, a = null, o = {}) { A, S, L - ], R("status.lastScan", `Last scan: ${h}`, { date: h })), um(n, dm(e, { + ], R("status.lastScan", `Last scan: ${h}`, { date: h })), dm(n, fm(e, { totalAssets: i, withWorkflows: o, withGenerationData: l }))), e); } - if (Cm(r, {}, {}), wm(r, b), t.style.background = "var(--mjr-status-error, #f44336)", pm(s, "error"), _?.code === "INVALID_RESPONSE" && _?.status === 404) fm(n, R("status.apiNotFound", "Majoor API endpoints not found (404)"), R("status.apiNotFoundHint", "Backend routes are not loaded. Restart ComfyUI and check the terminal for Majoor import errors.")); + if (Cm(r, {}, {}), wm(r, b), t.style.background = "var(--mjr-status-error, #f44336)", mm(s, "error"), _?.code === "INVALID_RESPONSE" && _?.status === 404) pm(n, R("status.apiNotFound", "Majoor API endpoints not found (404)"), R("status.apiNotFoundHint", "Backend routes are not loaded. Restart ComfyUI and check the terminal for Majoor import errors.")); else { let t = String(_?.error || "").toLowerCase(); - t.includes("malform") || t.includes("corrupt") || t.includes("disk image") ? (fm(n, R("status.dbCorrupted"), R("status.dbCorruptedHint")), globalThis._mjrCorruptToastShown || (globalThis._mjrCorruptToastShown = !0, e(R("toast.resetFailedCorrupt"), "error", 8e3))) : lm(n, [_.error || R("status.errorChecking", "Error checking status")]); + t.includes("malform") || t.includes("corrupt") || t.includes("disk image") ? (pm(n, R("status.dbCorrupted"), R("status.dbCorruptedHint")), globalThis._mjrCorruptToastShown || (globalThis._mjrCorruptToastShown = !0, e(R("toast.resetFailedCorrupt"), "error", 8e3))) : um(n, [_.error || R("status.errorChecking", "Error checking status")]); } if (_.code === "SERVICE_UNAVAILABLE") { let e = Am(t, n, r, i); @@ -12155,13 +12142,13 @@ function Am(e, t, n = null, r = null) { let i = document.createElement("button"); return i.textContent = R("btn.retryServices"), i.style.cssText = "\n padding: 4px 10px;\n margin-top: 6px;\n font-size: 11px;\n border-radius: 4px;\n border: 1px solid rgba(255,255,255,0.3);\n background: transparent;\n color: white;\n cursor: pointer;\n ", i.onclick = async () => { i.disabled = !0, i.textContent = R("btn.retrying"); - let a = await L(it.RETRY_SERVICES, {}); - i.disabled = !1, i.textContent = R("btn.retryServices"), a.ok ? km(e, t, n, r) : (lm(t, [a.error || R("status.retryFailed", "Retry failed")]), t.appendChild(document.createElement("br")), t.appendChild(i)); + let a = await L(at.RETRY_SERVICES, {}); + i.disabled = !1, i.textContent = R("btn.retryServices"), a.ok ? km(e, t, n, r) : (um(t, [a.error || R("status.retryFailed", "Retry failed")]), t.appendChild(document.createElement("br")), t.appendChild(i)); }, i; } function jm() { try { - let e = localStorage?.getItem?.(im); + let e = localStorage?.getItem?.(am); if (!e) return null; let t = JSON.parse(e); return t && typeof t == "object" ? t : null; @@ -12172,7 +12159,7 @@ function jm() { function Mm(e) { try { if (!e || typeof e != "object") return; - localStorage?.setItem?.(im, JSON.stringify(e)); + localStorage?.setItem?.(am, JSON.stringify(e)); } catch (e) { console.debug?.(e); } @@ -12192,9 +12179,9 @@ function Nm(e) { } function Pm(e) { if (!e || typeof e != "object") return !1; - if (tm) return !0; + if (nm) return !0; try { - if (Ft()?.active) return !0; + if (It()?.active) return !0; } catch (e) { console.debug?.(e); } @@ -12233,14 +12220,14 @@ function Lm(e, t, n) { console.debug?.(e); } try { - return e.style.background = "var(--mjr-status-info, #64B5F6)", fm(t, R("status.cached", "Last known status"), R("status.checking", "Checking status...")), !0; + return e.style.background = "var(--mjr-status-info, #64B5F6)", pm(t, R("status.cached", "Last known status"), R("status.checking", "Checking status...")), !0; } catch (e) { return console.debug?.(e), !1; } } function Rm(e, t, n) { - let r = Im(t), i = r && r !== String(n?.lastSignature || ""), a = Pm(t), o = e || am.ACTIVE, s = Number(n?.cooldownStablePolls || 0) || 0; - return a || i ? (o = am.ACTIVE, s = 0) : o === am.ACTIVE ? (o = am.COOLDOWN, s = 0) : o === am.COOLDOWN ? (s += 1, s >= 3 && (o = am.IDLE, s = 0)) : (o = i ? am.ACTIVE : am.IDLE, s = 0), { + let r = Im(t), i = r && r !== String(n?.lastSignature || ""), a = Pm(t), o = e || om.ACTIVE, s = Number(n?.cooldownStablePolls || 0) || 0; + return a || i ? (o = om.ACTIVE, s = 0) : o === om.ACTIVE ? (o = om.COOLDOWN, s = 0) : o === om.COOLDOWN ? (s += 1, s >= 3 && (o = om.IDLE, s = 0)) : (o = i ? om.ACTIVE : om.IDLE, s = 0), { nextState: o, signature: r, hasChange: i, @@ -12255,7 +12242,7 @@ function zm(e, t, n, r = null, i = null, a = null) { _pollTick: 0, _auxCached: !1 }, c = { - mode: am.ACTIVE, + mode: om.ACTIVE, cooldownStablePolls: 0, lastSignature: "" }, l = typeof AbortController < "u" ? new AbortController() : null, u = async () => { @@ -12268,7 +12255,7 @@ function zm(e, t, n, r = null, i = null, a = null) { let n = s._pollTick > 1 && s._pollTick % 4 != 0, o = await km(e, t, r, typeof a == "function" ? a() : null, s, { signal: l?.signal || null, lightweight: n, - force: !!tm || s._pollTick <= 1 + force: !!nm || s._pollTick <= 1 }); if (o && typeof o == "object") { Mm(o); @@ -12303,7 +12290,7 @@ function zm(e, t, n, r = null, i = null, a = null) { } return 1; }, h = () => { - let e = om[c.mode] || Math.max(250, Number(B.STATUS_POLL_INTERVAL) || 2e3), t = p ? Math.max(3e4, e) : f > 0 ? Math.min(6e4, Math.round(e * Math.min(8, 1 + f))) : e, r = Math.min(12e4, Math.round(t * m())); + let e = sm[c.mode] || Math.max(250, Number(B.STATUS_POLL_INTERVAL) || 2e3), t = p ? Math.max(3e4, e) : f > 0 ? Math.min(6e4, Math.round(e * Math.min(8, 1 + f))) : e, r = Math.min(12e4, Math.round(t * m())); d = setTimeout(async () => { try { if (l?.signal?.aborted) return; @@ -12311,7 +12298,7 @@ function zm(e, t, n, r = null, i = null, a = null) { console.debug?.(e); } let e = await u(); - if (p = s.lastCode === "INVALID_RESPONSE" && s.lastStatus === 404, e ? f = 0 : p ? f = Math.min(999, f + 1) : (f = Math.min(999, f + 1), c.mode = am.ACTIVE, c.cooldownStablePolls = 0), p && f >= 3) try { + if (p = s.lastCode === "INVALID_RESPONSE" && s.lastStatus === 404, e ? f = 0 : p ? f = Math.min(999, f + 1) : (f = Math.min(999, f + 1), c.mode = om.ACTIVE, c.cooldownStablePolls = 0), p && f >= 3) try { n._mjrStatusPollDispose?.(); } catch (e) { console.debug?.(e); @@ -12338,7 +12325,7 @@ function zm(e, t, n, r = null, i = null, a = null) { }, i.title = R("btn.scan", "Scan"); } // ui/vue/composables/useActiveAsset.ts -var Bm = vr(null), Vm = vr(null); +var Bm = yr(null), Vm = yr(null); function Hm() { return { activeAsset: Bm, @@ -12367,7 +12354,7 @@ function Gm(e, t) { var Km = 360, qm = 240, Jm = 640; function Ym() { try { - let e = Vn(), t = Number(e?.sidebar?.widthPx); + let e = Hn(), t = Number(e?.sidebar?.widthPx); return Number.isFinite(t) ? Math.max(qm, Math.min(Jm, Math.round(t))) : Km; } catch { return Km; @@ -12455,7 +12442,7 @@ async function $m(e, t, n) { if (!Qm(c())) { let e = String(c()?.filename || "").trim(), t = String(c()?.type || "output").trim().toLowerCase(), r = String(c()?.subfolder || "").trim(), i = String(c()?.root_id || c()?.rootId || "").trim(); if (e) try { - let a = await Ee({ + let a = await De({ type: t, filename: e, subfolder: r, @@ -12580,9 +12567,9 @@ function uh(e) { delete t.lastGridCount, delete t.lastGridTotal, delete t.viewScope, delete t.similarResults, delete t.similarTitle, delete t.similarSourceAssetId, localStorage.setItem(th, JSON.stringify(t)); } catch {} } -var dh = Mr("mjr-panel", () => { +var dh = Nr("mjr-panel", () => { let e = lh(), t = Q(e.scope || "output"), n = Q(e.customRootId || ""), r = Q(e.customRootLabel || ""), i = Q(e.currentFolderRelativePath || ""), a = Q(e.collectionId || ""), o = Q(e.collectionName || ""), s = Q(e.kindFilter || ""), c = Q(e.dateRangeFilter || ""), l = Q(e.dateExactFilter || ""), u = Q(e.workflowOnly || !1), d = Q(e.minRating || 0), f = Q(e.minSizeMB || 0), p = Q(e.maxSizeMB || 0), m = Q(e.resolutionCompare || "gte"), h = Q(e.minWidth || 0), g = Q(e.minHeight || 0), _ = Q(e.maxWidth || 0), v = Q(e.maxHeight || 0), y = Q(e.workflowType || ""), b = Q(e.workflowId || ""), x = Q(e.workflowModelFilter || ""), S = Q(e.workflowRunsOnFilter || ""), C = Q(e.sort || "mtime_desc"), w = Q(e.searchQuery || ""), T = Q(e.metadataSearchMode || "AND"), E = Q(e.scrollTop || 0), D = Q(e.activeAssetId || ""), O = Q(e.selectedAssetIds || []), k = Q(e.sidebarOpen || !1), A = Q(0), j = Q(0), M = Q(""), N = Q([]), P = Q(""), ee = Q(""), te = null; - cr([ + lr([ t, n, r, @@ -12656,7 +12643,7 @@ var dh = Mr("mjr-panel", () => { try { window.addEventListener("storage", F); } catch {} - Tr(() => { + Er(() => { try { window.removeEventListener("storage", F); } catch {} @@ -12731,7 +12718,7 @@ var dh = Mr("mjr-panel", () => { // ui/stores/getOptionalPanelStore.ts function fh() { try { - return Nr() ? dh() : null; + return Pr() ? dh() : null; } catch { return null; } @@ -13084,7 +13071,7 @@ function Eh() { return Date.now(); } function Dh() { - return Me(`msg-${Eh()}-`, 6); + return Ne(`msg-${Eh()}-`, 6); } function Oh(e) { let t = String(e || "").trim().toLowerCase(); @@ -13563,7 +13550,7 @@ function dg({ messageBtn: e = null, messagePopover: t = null, title: n = null, m } }, x = () => { if (!_ || g !== "history" || t?.style?.display !== "block") return; - let e = ae(); + let e = A(); for (let n of e) { let e = lg(n); if (!e || !y.has(e)) continue; @@ -13623,7 +13610,7 @@ function dg({ messageBtn: e = null, messagePopover: t = null, title: n = null, m } }, w = () => { if (!s) return; - let e = ae(), t = s.querySelector(".mjr-history-list"); + let e = A(), t = s.querySelector(".mjr-history-list"); if (!t) { let e = document.createElement("div"); e.className = "mjr-history-head"; @@ -13631,7 +13618,7 @@ function dg({ messageBtn: e = null, messagePopover: t = null, title: n = null, m n.className = "mjr-history-head-label", n.textContent = R("label.recentActivity", "Recent activity"); let r = document.createElement("button"); r.type = "button", r.className = "mjr-btn mjr-history-clear-btn", r.textContent = R("btn.clearHistory", "Clear"), r.title = R("tooltip.clearToastHistory", "Clear toast history"), r.addEventListener("click", (e) => { - e.stopPropagation(), de(), w(); + e.stopPropagation(), _e(), w(); }, h ? { signal: h } : void 0), e.appendChild(n), e.appendChild(r), t = document.createElement("div"), t.className = "mjr-history-list", s.replaceChildren(e, t); } if (t.replaceChildren(), !e.length) { @@ -13685,7 +13672,7 @@ function dg({ messageBtn: e = null, messagePopover: t = null, title: n = null, m let n = Math.max(0, Number(t || 0) || 0); n <= 0 ? (e.style.display = "none", e.textContent = "") : (e.style.display = "inline-flex", e.textContent = n > 99 ? "99+" : String(n)); }, E = () => { - let e = _e(); + let e = ae(); a && (a.style.display = e > 0 ? "inline-block" : "none"), T(o, e); }, D = () => { c && (c.childNodes.length > 0 || c.replaceChildren(Jh())); @@ -13709,9 +13696,9 @@ function dg({ messageBtn: e = null, messagePopover: t = null, title: n = null, m console.debug?.(e); } try { - window.addEventListener(be, () => { + window.addEventListener(de, () => { if (E(), t?.style?.display === "block" && g === "history" && w(), _) { - for (let e of ae()) { + for (let e of A()) { let t = String(e?.status || "").trim().toLowerCase(), n = lg(e); n && Zh.has(t) && y.add(n); } @@ -13777,7 +13764,7 @@ function dg({ messageBtn: e = null, messagePopover: t = null, title: n = null, m historyPanel: s, shortcutsPanel: c, markReadBtn: f - }), w(), A(), E(); + }), w(), pe(), E(); }, te = () => { g = "shortcuts", ug({ activeTab: g, @@ -13804,7 +13791,7 @@ function dg({ messageBtn: e = null, messagePopover: t = null, title: n = null, m p.toggle(t, e); } ee(), _ = !0, b(), y.clear(); - for (let e of ae()) { + for (let e of A()) { let t = String(e?.status || "").trim().toLowerCase(), n = lg(e); n && Zh.has(t) && y.add(n); } @@ -13930,7 +13917,7 @@ function hg({ gridContainer: t, loadAssets: n, loadAssetsFromList: r, getCollect } }, b = () => { try { - return !!(Vn()?.ai?.vectorSearchEnabled ?? !0); + return !!(Hn()?.ai?.vectorSearchEnabled ?? !0); } catch { return !0; } @@ -15034,7 +15021,7 @@ async function Eg({ card: t, asset: n, sidebar: r, onAssetUpdated: i }) { } let a = t.querySelector(".mjr-workflow-dot"); try { - a && (Ht(a, "pending", "Pending: metadata refresh in progress", { asset: n }), a.classList.add("mjr-pulse-animation"), a.style.cursor = "progress", a.title = R("tooltip.pendingRefresh", "Pending: metadata refresh in progress")); + a && (Ut(a, "pending", "Pending: metadata refresh in progress", { asset: n }), a.classList.add("mjr-pulse-animation"), a.style.cursor = "progress", a.title = R("tooltip.pendingRefresh", "Pending: metadata refresh in progress")); } catch (e) { console.debug?.(e); } @@ -15047,13 +15034,13 @@ async function Eg({ card: t, asset: n, sidebar: r, onAssetUpdated: i }) { filename: n.filename, subfolder: n.subfolder || "", type: String(n.type || "output").toLowerCase(), - root_id: ze(n) || void 0 + root_id: Be(n) || void 0 }, s = null, c = !1, l = !1, u = !1; try { - if (c = !!(await L(it.INDEX_FILES, { + if (c = !!(await L(at.INDEX_FILES, { files: [o], incremental: !1 - }))?.ok, !c && a && (Ht(a, "error", "Error: metadata refresh failed", { asset: n }), a.classList.remove("mjr-pulse-animation"), a.style.cursor = ""), Tg(n?.id)) { + }))?.ok, !c && a && (Ut(a, "error", "Error: metadata refresh failed", { asset: n }), a.classList.remove("mjr-pulse-animation"), a.style.cursor = ""), Tg(n?.id)) { l = !0; try { u = !!(await ge(n.id))?.ok; @@ -15070,7 +15057,7 @@ async function Eg({ card: t, asset: n, sidebar: r, onAssetUpdated: i }) { } } catch { try { - a && (Ht(a, "error", "Error: metadata refresh failed", { asset: n }), a.classList.remove("mjr-pulse-animation"), a.style.cursor = ""); + a && (Ut(a, "error", "Error: metadata refresh failed", { asset: n }), a.classList.remove("mjr-pulse-animation"), a.style.cursor = ""); } catch (e) { console.debug?.(e); } @@ -15090,7 +15077,7 @@ async function Eg({ card: t, asset: n, sidebar: r, onAssetUpdated: i }) { } finally { try { if (a && a.isConnected) { - let e = Et(s || n); + let e = Dt(s || n); e && a.replaceWith(e); } } catch { @@ -15332,7 +15319,7 @@ function Bg({ gridContainer: e, sidebar: t, createRatingBadge: n, createTagsBadg e._mjrSidebarOpenBound = !0; let l = (t) => { e._mjrFocusWithin = !0; - let n = Mt(t.target, ".mjr-asset-card"); + let n = Nt(t.target, ".mjr-asset-card"); if (n) try { e._mjrLastFocusedCardId = n.dataset?.mjrAssetId || ""; } catch (e) { @@ -15371,7 +15358,7 @@ function Bg({ gridContainer: e, sidebar: t, createRatingBadge: n, createTagsBadg try { let n = i?.has_workflow ?? i?.hasWorkflow ?? t.has_workflow, r = i?.has_generation_data ?? i?.hasGenerationData ?? t.has_generation_data; n !== void 0 && (t.has_workflow = n), r !== void 0 && (t.has_generation_data = r); - let a = e.querySelector(".mjr-workflow-dot"), o = Et(t); + let a = e.querySelector(".mjr-workflow-dot"), o = Dt(t); a && o && a.replaceWith(o); } catch (e) { console.debug?.(e); @@ -15391,9 +15378,9 @@ function Bg({ gridContainer: e, sidebar: t, createRatingBadge: n, createTagsBadg } }, f = async (n) => { if (n.defaultPrevented) return; - let r = Mt(n.target, ".mjr-asset-card"); + let r = Nt(n.target, ".mjr-asset-card"); if (!r) return; - let a = Mt(n.target, ".mjr-workflow-dot"); + let a = Nt(n.target, ".mjr-workflow-dot"); if (a && r.contains(a)) { let a = r._mjrAsset; if (!a) return; @@ -15420,7 +15407,7 @@ function Bg({ gridContainer: e, sidebar: t, createRatingBadge: n, createTagsBadg } return; } - let l = Mt(n.target, "a, button, input, textarea, select, label"); + let l = Nt(n.target, "a, button, input, textarea, select, label"); if (l && r.contains(l)) return; let u = r._mjrAsset; if (u) { @@ -15628,7 +15615,7 @@ function Bg({ gridContainer: e, sidebar: t, createRatingBadge: n, createTagsBadg e.addEventListener("mjr:selection-changed", g); let _ = (t) => { if (t.defaultPrevented || (t.key?.toLowerCase?.() || "") !== "d" || t.ctrlKey || t.metaKey || t.altKey || t.target?.isContentEditable || t.target?.closest?.("input, textarea, select, [contenteditable='true']")) return; - let n = Mt(t.target, ".mjr-asset-card"); + let n = Nt(t.target, ".mjr-asset-card"); n && n._mjrAsset && (t.preventDefault(), t.stopPropagation(), Dg(e, n), Lg(e), zg({ gridContainer: e, state: o, @@ -15750,7 +15737,7 @@ function Vg({ onTriggerScan: e, getScanContext: t, onToggleDetails: n, onToggleF console.debug?.(e); } try { - let e = Qn(); + let e = $n(); return e && (document.activeElement === document.body || e.contains?.(document.activeElement)) || !1; } catch (e) { return console.debug?.(e), !1; @@ -15914,7 +15901,7 @@ function Ug({ gridContainer: e, readSelectedAssetIds: t = () => [], readActiveAs console.debug?.(e); } try { - Bl(e, a)?.scrollIntoView?.({ + Vl(e, a)?.scrollIntoView?.({ block: "nearest", behavior: "instant" }); @@ -15951,7 +15938,7 @@ function Gg(e = {}, t = "*") { function Kg({ gridContainer: e, gridWrapper: t, readScrollElement: n = () => null, gridController: r, captureAnchor: i, restoreAnchor: a, restoreGridUiState: o = null, readScrollTop: s = () => 0, restoreSelectionState: c = () => {}, readActiveAssetId: l = () => "", isSidebarOpen: u = () => !1, toggleSidebarDetails: d = () => {}, getQuery: f = () => "*", getScope: p = () => "output", loadAssets: m = null, lifecycleSignal: h = null } = {}) { let g = 0, _ = !1, v = null, y = null, b = null, x = 0, S = !0, C = "", w = Date.now(), T = () => { try { - return vc(e, (typeof n == "function" ? n() : t) || t || null); + return yc(e, (typeof n == "function" ? n() : t) || t || null); } catch (e) { return console.debug?.(e), !1; } @@ -16067,7 +16054,7 @@ function Kg({ gridContainer: e, gridWrapper: t, readScrollElement: n = () => nul if (e && typeof m == "function" && !h?.aborted) { if (!E()) b = t, x = 50; else if (!D() && !O() && String(p() || "output") === "output" && String(f() || "*") === "*") try { - let t = await re(`${it.HEALTH_COUNTERS}?scope=output`, { signal: h || void 0 }); + let t = await re(`${at.HEALTH_COUNTERS}?scope=output`, { signal: h || void 0 }); t?.ok && (t.data?.total_assets || 0) > 0 && await m(e); } catch (e) { console.debug?.(e); @@ -16209,7 +16196,7 @@ function qg(e, { useComfyThemeUI: t }) { } catch (e) { console.debug?.(e); } - Zn(); + Qn(); for (let t of [ () => e._eventCleanup?.(), () => e._mjrPopoverManager?.dispose?.(), @@ -16223,7 +16210,7 @@ function qg(e, { useComfyThemeUI: t }) { console.debug?.(e); } e.replaceChildren(), e.classList.add("mjr-am-container"); - let i = ki(e); + let i = Ai(e); try { e._mjrPopoverManager = i; } catch (e) { @@ -16239,7 +16226,7 @@ function qg(e, { useComfyThemeUI: t }) { function Jg({ container: e, state: t, sidebar: n, browseSection: i, gridWrapper: a, similarBtn: o, setSemanticEnabled: s, similarEnabledTitle: c, similarDisabledTitle: l, refreshGridFn: u, isSidebarOpen: d, readActiveAssetId: f, getSidebarController: m, panelLifecycleAC: h }) { let g = "", _ = () => { try { - return !!(Vn()?.ai?.vectorSearchEnabled ?? !0); + return !!(Hn()?.ai?.vectorSearchEnabled ?? !0); } catch { return !0; } @@ -16298,7 +16285,7 @@ function Jg({ container: e, state: t, sidebar: n, browseSection: i, gridWrapper: } } }, b = async (e) => { - let n = String(e || t.scope || "output").toLowerCase(), i = !!Vn()?.watcher?.enabled; + let n = String(e || t.scope || "output").toLowerCase(), i = !!Hn()?.watcher?.enabled; if (n === "custom") try { await r(!1); } catch (e) { @@ -16322,9 +16309,9 @@ function Jg({ container: e, state: t, sidebar: n, browseSection: i, gridWrapper: }, x = (e) => { let n = String(e?.detail?.key || "").trim(), r = n === "__init__", i = r || n.startsWith("grid.") || n.startsWith("infiniteScroll.") || n.startsWith("siblings.") || n.startsWith("search.") || n.startsWith("rtHydrate.") || n.startsWith("workflowMinimap."), a = r || n.startsWith("sidebar.") || n.startsWith("ai."), o = r || n.startsWith("watcher."); try { - let e = Vn(), t = !!(e?.ai?.vectorSearchEnabled ?? !0), o = String(e?.ui?.cardHoverColor || "").trim(), s = String(e?.ui?.cardSelectionColor || "").trim(), c = String(e?.ui?.ratingColor || "").trim(), l = String(e?.ui?.tagColor || "").trim(); + let e = Hn(), t = !!(e?.ai?.vectorSearchEnabled ?? !0), o = String(e?.ui?.cardHoverColor || "").trim(), s = String(e?.ui?.cardSelectionColor || "").trim(), c = String(e?.ui?.ratingColor || "").trim(), l = String(e?.ui?.tagColor || "").trim(); if (/^#[0-9a-fA-F]{3,8}$/.test(o) && document.documentElement.style.setProperty("--mjr-card-hover-color", o), /^#[0-9a-fA-F]{3,8}$/.test(s) && document.documentElement.style.setProperty("--mjr-card-selection-color", s), /^#[0-9a-fA-F]{3,8}$/.test(c) && document.documentElement.style.setProperty("--mjr-rating-color", c), /^#[0-9a-fA-F]{3,8}$/.test(l) && document.documentElement.style.setProperty("--mjr-tag-color", l), y(e.sidebar?.position || "right"), v(t), i) { - let e = Qn() || null; + let e = $n() || null; if (!r && n.startsWith("siblings.")) try { e?.dispatchEvent(new CustomEvent("mjr:reload-grid")); } catch { @@ -16516,7 +16503,7 @@ function t_({ similarBtn: t, similarPopover: n, similarFindBtn: r, similarDuplic for (let e of n.slice(0, 4)) { let t = e.type === "input" ? "input" : "output"; try { - let n = await re(Ke({ + let n = await re(qe({ q: e.filename, scope: t, limit: 50, @@ -16555,7 +16542,7 @@ function t_({ similarBtn: t, similarPopover: n, similarFindBtn: r, similarDuplic } if (!n) await j(t, r); else try { - let i = await re(Je(n, { + let i = await re(Ye(n, { jobId: t?.jobId || t?.job_id || "", latest: t?.latest !== !1, limit: 500 @@ -16728,7 +16715,7 @@ function n_({ pinnedFoldersBtn: t, pinnedFoldersController: n = null, pinnedFold }; }, v = async () => { try { - let e = await re(it.CUSTOM_ROOTS, g?.signal ? { signal: g.signal } : void 0); + let e = await re(at.CUSTOM_ROOTS, g?.signal ? { signal: g.signal } : void 0); return e?.ok && Array.isArray(e.data) ? e.data.map(_).filter(Boolean) : []; } catch (e) { return console.debug?.(e), []; @@ -16775,8 +16762,8 @@ function n_({ pinnedFoldersBtn: t, pinnedFoldersController: n = null, pinnedFold let r = String(t?.id || "").trim(); if (!r) return; let i = String(t?.label || t?.path || r).trim(); - if (!await Ut(R("dialog.unpinFolder", "Unpin folder \"{name}\"?", { name: i }))) return; - let a = await L(it.CUSTOM_ROOTS_REMOVE, { id: r }); + if (!await Wt(R("dialog.unpinFolder", "Unpin folder \"{name}\"?", { name: i }))) return; + let a = await L(at.CUSTOM_ROOTS_REMOVE, { id: r }); if (!a?.ok) e(a?.error || R("toast.unpinFolderFailed", "Failed to unpin folder"), "error"); else { String(s.customRootId || "") === r && (s.customRootId = "", s.customRootLabel = "", s.currentFolderRelativePath = ""); @@ -16907,7 +16894,7 @@ async function f_({ state: e, monthKey: t }) { ok: !0, days: {} }; - let r = String(e?.currentFolderRelativePath || "").trim(), i = n === "custom" && !e?.customRootId ? null : r || null, a = Qe({ + let r = String(e?.currentFolderRelativePath || "").trim(), i = n === "custom" && !e?.customRootId ? null : r || null, a = $e({ scope: n, customRootId: e?.customRootId || null, subfolder: i, @@ -17374,14 +17361,14 @@ function __({ state: t, scopeController: n, browserNav: r, gridController: i, ge if (n && Array.isArray(n.assets) && n.assets.length >= 2) { let t = n.assets[0] || {}, r = n.assets.slice(1).map((e) => Number(e?.id || 0)).filter((e) => e > 0); if (r.length) { - if (await Ut(R("dialog.mergeDuplicateTags", "Exact duplicates detected ({count}). Merge tags into \"{target}\"?", { + if (await Wt(R("dialog.mergeDuplicateTags", "Exact duplicates detected ({count}). Merge tags into \"{target}\"?", { count: n.assets.length, target: t?.filename || t?.id }))) { let n = await ie(Number(t?.id || 0), r); n?.ok ? e(R("toast.tagsMerged", "Tags merged"), "success", 2200) : e(R("toast.tagMergeFailed", "Tag merge failed: {error}", { error: n?.error || "error" }), "warning", 3500); } - if (await Ut(R("dialog.deleteExactDuplicates", "Delete {count} exact duplicate(s)?", { count: r.length }))) { + if (await Wt(R("dialog.deleteExactDuplicates", "Delete {count} exact duplicate(s)?", { count: r.length }))) { let t = await b(r); t?.ok ? (e(R("toast.duplicatesDeleted", "Duplicates deleted"), "success", 2200), await i.reloadGrid()) : e(R("toast.deleteFailed", "Delete failed: {error}", { error: t?.error || "error" }), "warning", 3500); } @@ -17389,8 +17376,8 @@ function __({ state: t, scopeController: n, browserNav: r, gridController: i, ge return; } } - if (!await Ut(R("dialog.startDuplicateAnalysis", "Start duplicate analysis in background?"))) return; - let r = await ke(500); + if (!await Wt(R("dialog.startDuplicateAnalysis", "Start duplicate analysis in background?"))) return; + let r = await Ae(500); r?.ok ? e(R("toast.dupAnalysisStarted", "Duplicate analysis started"), "info", 2200) : e(R("toast.analysisNotStarted", "Analysis not started: {error}", { error: r?.error || "error" }), "warning", 3500), await o(); } }; @@ -17403,7 +17390,7 @@ async function v_(e, { useComfyThemeUI: t = !0, external: n = {} } = {}) { }); } async function y_(t, { useComfyThemeUI: n = !0, external: r = {} } = {}) { - Bp("panelRender"), Up("panelRender"); + Vp("panelRender"), Wp("panelRender"); let i = typeof AbortController < "u" ? new AbortController() : null, { popovers: a, hostWrapper: o, hostWrapperPrevStyle: s } = qg(t, { useComfyThemeUI: n }), c = fh(); if (!c) throw Error("[Majoor] mountAssetsManagerPanelRuntime requires an active Pinia panel store"); for (let e of [ @@ -17449,20 +17436,20 @@ async function y_(t, { useComfyThemeUI: n = !0, external: r = {} } = {}) { l.write("searchQuery", e.target.value); }, { signal: i?.signal }); let Ue = r.summaryBar, We = r.updateSummaryBar, Ge = r.folderBreadcrumb, Ke = r.folderBreadcrumbController || null, qe = r.statusSection, Je = r.statusDot, Ye = r.statusText, Xe = r.capabilitiesSection, Ze = r.browseSection, Qe = r.gridWrapper, $e = r.sidebar; - Vn(); + Hn(); let et = document.createElement("div"); et.classList.add("mjr-am-content"); - let z = null, B = null; + let z = null, tt = null; t.tabIndex = -1; - let tt = null, nt = 0, rt = () => { + let B = null, nt = 0, rt = () => { try { nt = Date.now(); } catch { nt = 0; } - }, at = typeof r?.bindGridHostState == "function" && typeof r?.restoreGridUiState == "function", ot = !at; + }, it = typeof r?.bindGridHostState == "function" && typeof r?.restoreGridUiState == "function", ot = !it; Qe.addEventListener("scroll", () => { - rt(), ot && (tt && clearTimeout(tt), tt = setTimeout(() => { + rt(), ot && (B && clearTimeout(B), B = setTimeout(() => { try { l.write("scrollTop", Qe.scrollTop); } catch (e) { @@ -17472,7 +17459,7 @@ async function y_(t, { useComfyThemeUI: n = !0, external: r = {} } = {}) { }, { passive: !0, signal: i?.signal - }), z = r.gridContainer, z.parentElement !== Qe && Qe.appendChild(z), tr(z); + }), z = r.gridContainer, z.parentElement !== Qe && Qe.appendChild(z), nr(z); try { z.dataset.mjrScope = String(d("scope", c.scope || "output") || "output"); } catch (e) { @@ -17509,13 +17496,13 @@ async function y_(t, { useComfyThemeUI: n = !0, external: r = {} } = {}) { } catch (e) { console.debug?.(e); } - let lt = r.loadAssets ?? _i, ut = r.loadAssetsFromList ?? vi, dt = r.prepareGridForScopeSwitch ?? yi, ft = r.disposeGrid ?? bi, pt = r.refreshGrid ?? xi, mt = r.captureAnchor ?? Si, gt = r.restoreAnchor ?? Ci, _t = r.hydrateGridFromSnapshot ?? gi; + let lt = r.loadAssets ?? vi, ut = r.loadAssetsFromList ?? yi, dt = r.prepareGridForScopeSwitch ?? bi, ft = r.disposeGrid ?? xi, pt = r.refreshGrid ?? Si, mt = r.captureAnchor ?? Ci, ht = r.restoreAnchor ?? wi, _t = r.hydrateGridFromSnapshot ?? _i; if (typeof r?.onGridContainerReady == "function") try { r.onGridContainerReady(z, { getState: () => c }); } catch (e) { console.debug?.(e); } - else t._mjrGridContextMenuUnbind = Ra({ + else t._mjrGridContextMenuUnbind = za({ gridContainer: z, getState: () => c }); @@ -17532,7 +17519,7 @@ async function y_(t, { useComfyThemeUI: n = !0, external: r = {} } = {}) { refreshGridFn: pt, isSidebarOpen: h, readActiveAssetId: m, - getSidebarController: () => B, + getSidebarController: () => tt, panelLifecycleAC: i }); et.appendChild(qe), et.appendChild(Me), et.appendChild(Ge), et.appendChild(Ue), et.appendChild(Ze), t.appendChild(g); @@ -17551,7 +17538,7 @@ async function y_(t, { useComfyThemeUI: n = !0, external: r = {} } = {}) { getQuery: St, searchInputEl: Ne, state: c - }), Tt = null, Et = null, Dt = null, Ot = null, kt = null, At = null, jt = null, Mt = null, Nt = null, Pt = !1, Ft = (e) => !!e && String(e?.style?.display || "").toLowerCase() === "block", It = () => { + }), wt = null, Et = null, Dt = null, Ot = null, kt = null, At = null, jt = null, Mt = null, Nt = null, Pt = !1, Ft = (e) => !!e && String(e?.style?.display || "").toLowerCase() === "block", It = () => { let e = [ [y, k], [b, pe], @@ -17583,7 +17570,7 @@ async function y_(t, { useComfyThemeUI: n = !0, external: r = {} } = {}) { } It(); }; - at || (Mt = Ug({ + it || (Mt = Ug({ gridContainer: z, readSelectedAssetIds: p, readActiveAssetId: () => m(), @@ -17674,12 +17661,12 @@ async function y_(t, { useComfyThemeUI: n = !0, external: r = {} } = {}) { state: c, customSelect: E, customRemoveBtn: O, - comfyConfirm: Ut, - comfyPrompt: wt, + comfyConfirm: Wt, + comfyPrompt: Tt, comfyToast: e, get: re, post: L, - ENDPOINTS: it, + ENDPOINTS: at, reloadGrid: Ct.reloadGrid, onRootChanged: async () => { try { @@ -17698,7 +17685,7 @@ async function y_(t, { useComfyThemeUI: n = !0, external: r = {} } = {}) { console.debug?.(e); } } - }), Ht = Bt.bind({ + }), Vt = Bt.bind({ customAddBtn: D, customRemoveBtn: O }); @@ -17710,7 +17697,7 @@ async function y_(t, { useComfyThemeUI: n = !0, external: r = {} } = {}) { } catch (e) { console.debug?.(e); } - let Wt = () => { + let Ut = () => { try { let t = z?._mjrGetAssets, n = z?._mjrSetSelection; if (typeof t != "function" || typeof n != "function") return; @@ -17722,7 +17709,7 @@ async function y_(t, { useComfyThemeUI: n = !0, external: r = {} } = {}) { console.debug?.(e); } }; - Tt = _g({ + wt = _g({ state: c, tabButtons: _, customMenuBtn: v, @@ -17730,7 +17717,7 @@ async function y_(t, { useComfyThemeUI: n = !0, external: r = {} } = {}) { popovers: a, refreshCustomRoots: Bt.refreshCustomRoots, reloadGrid: Ct.reloadGrid, - reconcileSelection: Wt, + reconcileSelection: Ut, onChanged: () => { try { z && (z.dataset.mjrScope = String(d("scope", c.scope || "output") || "output")); @@ -17775,13 +17762,13 @@ async function y_(t, { useComfyThemeUI: n = !0, external: r = {} } = {}) { let Gt = async ({ reload: e = !1 } = {}) => { try { if (String(d("viewScope", c.viewScope || "") || "").trim().toLowerCase() !== "similar") return; - await Tt?.clearSimilarScope?.({ reload: e }); + await wt?.clearSimilarScope?.({ reload: e }); } catch (e) { console.debug?.(e); } }; Object.values(_).forEach((e) => { - e.addEventListener("click", () => Tt.setScope(e.dataset.scope), { signal: i?.signal }); + e.addEventListener("click", () => wt.setScope(e.dataset.scope), { signal: i?.signal }); }), dg({ messageBtn: C, messagePopover: xe, @@ -17818,7 +17805,7 @@ async function y_(t, { useComfyThemeUI: n = !0, external: r = {} } = {}) { Pe ]), a.setOnVisibilityChanged?.(() => It()); try { - window.addEventListener(qn, (e) => { + window.addEventListener(Jn, (e) => { Pt = !!e?.detail?.open, It(); }, { signal: i?.signal }); } catch (e) { @@ -17860,7 +17847,7 @@ async function y_(t, { useComfyThemeUI: n = !0, external: r = {} } = {}) { readSelectedAssetIds: p, readPanelValue: d, writePanelValue: f, - scopeController: Tt, + scopeController: wt, closePopovers: () => { a.close(T), a.close(k), a.close(pe), a.close(ge), a.close(xe), a.close(Fe); }, @@ -17883,7 +17870,7 @@ async function y_(t, { useComfyThemeUI: n = !0, external: r = {} } = {}) { state: c, gridContainer: z, customSelect: E, - scopeController: Tt, + scopeController: wt, customRootsController: Bt, gridController: Ct, applyWatcherForScope: bt, @@ -17912,7 +17899,7 @@ async function y_(t, { useComfyThemeUI: n = !0, external: r = {} } = {}) { dateExactInput: ue, agendaContainer: de, gridController: Ct, - reconcileVisibleSelection: Wt, + reconcileVisibleSelection: Ut, exitSimilarViewIfActive: Gt, notifyContextChanged: Lt, panelLifecycleAC: i, @@ -17920,7 +17907,7 @@ async function y_(t, { useComfyThemeUI: n = !0, external: r = {} } = {}) { filterPopover: k }), Yt = __({ state: c, - scopeController: Tt, + scopeController: wt, browserNav: At, gridController: Ct, getDuplicatesAlert: () => Dt, @@ -17950,7 +17937,7 @@ async function y_(t, { useComfyThemeUI: n = !0, external: r = {} } = {}) { resolutionPresetSelect: ie, dateRangeSelect: le, dateExactInput: ue, - scopeController: Tt, + scopeController: wt, sortController: Kt, updateSummaryBar: We, reloadGrid: () => Ct.reloadGrid(), @@ -17961,7 +17948,7 @@ async function y_(t, { useComfyThemeUI: n = !0, external: r = {} } = {}) { console.debug?.(e); } try { - if (Lt(), at) ct(r.bindGridHostState({ + if (Lt(), it) ct(r.bindGridHostState({ onContextChanged: Lt, markUserInteraction: rt })); @@ -18001,11 +17988,11 @@ async function y_(t, { useComfyThemeUI: n = !0, external: r = {} } = {}) { } catch (e) { console.debug?.(e); } - B = Bg({ + tt = Bg({ gridContainer: z, sidebar: $e, - createRatingBadge: ht, - createTagsBadge: Vt, + createRatingBadge: gt, + createTagsBadge: Ht, showAssetInSidebar: $m, closeSidebar: eh, state: c @@ -18013,10 +18000,10 @@ async function y_(t, { useComfyThemeUI: n = !0, external: r = {} } = {}) { let Xt = { gridController: Ct, captureAnchor: mt, - restoreAnchor: gt, - restoreGridUiState: at ? (e) => r.restoreGridUiState(e, { onRestoreSidebar: () => { + restoreAnchor: ht, + restoreGridUiState: it ? (e) => r.restoreGridUiState(e, { onRestoreSidebar: () => { try { - B?.toggleDetails?.(); + tt?.toggleDetails?.(); } catch (e) { console.debug?.(e); } @@ -18028,7 +18015,7 @@ async function y_(t, { useComfyThemeUI: n = !0, external: r = {} } = {}) { readActiveAssetId: m, isSidebarOpen: h, toggleSidebarDetails: () => { - B?.toggleDetails?.(); + tt?.toggleDetails?.(); }, getQuery: St, getScope: () => l.read("scope", c.scope), @@ -18045,7 +18032,7 @@ async function y_(t, { useComfyThemeUI: n = !0, external: r = {} } = {}) { xm(Je, Ye, Xe, e || {}); }, onToggleDetails: () => { - B?.toggleDetails?.(); + tt?.toggleDetails?.(); }, onToggleFloatingViewer: () => { try { @@ -18075,9 +18062,9 @@ async function y_(t, { useComfyThemeUI: n = !0, external: r = {} } = {}) { scope: l.read("scope", c.scope), customRootId: l.read("customRootId", c.customRootId) }) - }), Qt = Ga({ + }), Qt = Ka({ gridContainer: z, - createRatingBadge: ht + createRatingBadge: gt }), $t = null; if (t._eventCleanup) try { t._eventCleanup(); @@ -18086,7 +18073,7 @@ async function y_(t, { useComfyThemeUI: n = !0, external: r = {} } = {}) { } Zt.bind(et), Qt.bind(), N("grid"); try { - t._mjrHotkeys = Zt, t._mjrRatingHotkeys = Qt, t._mjrSidebarController = B; + t._mjrHotkeys = Zt, t._mjrRatingHotkeys = Qt, t._mjrSidebarController = tt; } catch (e) { console.debug?.(e); } @@ -18108,7 +18095,7 @@ async function y_(t, { useComfyThemeUI: n = !0, external: r = {} } = {}) { } t._mjrVersionUpdateCleanup = null; try { - tt && clearTimeout(tt), tt = null; + B && clearTimeout(B), B = null; } catch (e) { console.debug?.(e); } @@ -18145,7 +18132,7 @@ async function y_(t, { useComfyThemeUI: n = !0, external: r = {} } = {}) { console.debug?.(e); } try { - B?.dispose?.(); + tt?.dispose?.(); } catch (e) { console.debug?.(e); } @@ -18187,7 +18174,7 @@ async function y_(t, { useComfyThemeUI: n = !0, external: r = {} } = {}) { console.debug?.(e); } try { - Ht?.(); + Vt?.(); } catch (e) { console.debug?.(e); } @@ -18201,7 +18188,7 @@ async function y_(t, { useComfyThemeUI: n = !0, external: r = {} } = {}) { } catch (e) { console.debug?.(e); } - Zn(z), z = null; + Qn(z), z = null; try { a.dispose(); } catch (e) { @@ -18230,7 +18217,7 @@ async function y_(t, { useComfyThemeUI: n = !0, external: r = {} } = {}) { }), () => ({ scope: l.read("scope", c.scope), customRootId: l.read("customRootId", c.customRootId) - })), Tt.setActiveTabStyles(), At?.renderBreadcrumb?.(), Bt.refreshCustomRoots().catch(() => {}), $t = Nt?.bindSearchInput?.({ + })), wt.setActiveTabStyles(), At?.renderBreadcrumb?.(), Bt.refreshCustomRoots().catch(() => {}), $t = Nt?.bindSearchInput?.({ searchInputEl: Ne, lifecycleSignal: i?.signal || null, debounceMs: 120, @@ -18241,7 +18228,7 @@ async function y_(t, { useComfyThemeUI: n = !0, external: r = {} } = {}) { Gt({ reload: !1 }), Lt(); }, startSearchTimer: () => { - Bp("searchQuery"); + Vp("searchQuery"); }, reloadGrid: () => { Ct.reloadGrid(); @@ -18283,7 +18270,7 @@ async function y_(t, { useComfyThemeUI: n = !0, external: r = {} } = {}) { } catch (e) { console.debug?.(e); } - let rn = Uf(), an = !rn && (tn || nn) ? Promise.resolve({ + let rn = Wf(), an = !rn && (tn || nn) ? Promise.resolve({ ok: !0, hydrated: !!tn, cached: !!nn @@ -18322,14 +18309,14 @@ async function y_(t, { useComfyThemeUI: n = !0, external: r = {} } = {}) { } catch (e) { console.debug?.(e); } - return Kp(Vp("panelRender", "gridRender") ?? 0), { gridContainer: z }; + return qp(Hp("panelRender", "gridRender") ?? 0), { gridContainer: z }; } // ui/vue/components/status/StatusSection.vue -var b_ = /* @__PURE__ */ dr({ +var b_ = /* @__PURE__ */ fr({ __name: "StatusSection", setup(e, { expose: t }) { let n = bm({ getScanContext: null }), r = n.querySelector("#mjr-status-dot"), i = n.querySelector("#mjr-status-text"), a = n.querySelector("#mjr-status-capabilities"); - return rr(() => { + return ir(() => { try { n?._mjrStatusPollDispose?.(); } catch {} @@ -18340,7 +18327,7 @@ var b_ = /* @__PURE__ */ dr({ capabilitiesSection: a }), (e, t) => null; } -}), x_ = Cr({ +}), x_ = wr({ open: !1, initial: null, resolve: null @@ -18358,7 +18345,7 @@ function C_(e = null) { var w_ = { class: "mjr-popover mjr-similar-popover", style: { display: "none" } -}, T_ = { class: "mjr-menu mjr-similar-menu" }, E_ = { class: "mjr-menu-item-label mjr-menu-item-label--icon" }, D_ = { class: "mjr-menu-item-label mjr-menu-item-label--icon" }, O_ = { class: "mjr-menu-item-label mjr-menu-item-label--icon" }, k_ = { class: "mjr-menu-item-label mjr-menu-item-label--icon" }, A_ = /* @__PURE__ */ dr({ +}, T_ = { class: "mjr-menu mjr-similar-menu" }, E_ = { class: "mjr-menu-item-label mjr-menu-item-label--icon" }, D_ = { class: "mjr-menu-item-label mjr-menu-item-label--icon" }, O_ = { class: "mjr-menu-item-label mjr-menu-item-label--icon" }, k_ = { class: "mjr-menu-item-label mjr-menu-item-label--icon" }, A_ = /* @__PURE__ */ fr({ __name: "SimilarSearchPopover", setup(e, { expose: t }) { let n = Q(null), r = Q(null), i = Q(null), a = Q(null), o = (e) => e?.$el || e || null; @@ -18376,7 +18363,7 @@ var w_ = { return o(a.value); } }), (e, t) => { - let o = ar("MButton"); + let o = or("MButton"); return q(), X("div", w_, [U("div", T_, [ Y(o, { ref_key: "findSimilarBtnRef", @@ -18439,11 +18426,11 @@ var w_ = { ])]); }; } -}), j_ = { class: "mjr-am-search-pill" }, M_ = ["id"], N_ = { class: "mjr-am-search-tools" }, P_ = { class: "mjr-popover-anchor" }, F_ = { class: "mjr-popover-anchor" }, I_ = "Ctrl/Cmd+F, Ctrl/Cmd+K, Ctrl/Cmd+H", L_ = "AND", R_ = /* @__PURE__ */ dr({ +}), j_ = { class: "mjr-am-search-pill" }, M_ = ["id"], N_ = { class: "mjr-am-search-tools" }, P_ = { class: "mjr-popover-anchor" }, F_ = { class: "mjr-popover-anchor" }, I_ = "Ctrl/Cmd+F, Ctrl/Cmd+K, Ctrl/Cmd+H", L_ = "AND", R_ = /* @__PURE__ */ fr({ __name: "SearchBar", emits: ["search-change"], setup(e, { expose: t, emit: n }) { - let r = n, i = dh(), a = Q(null), o = Q(null), s = Q(null), c = Q(null), l = Q(null), u = Q(null), d = Me("mjr-search-autocomplete-", 8), f = (e) => e?.$el || e || null, p = () => f(o.value), m = Q(!1), h = Q(!0), g = Q(L_), _ = null, v = null, y = K(() => m.value ? R("search.semanticPlaceholder", "Describe what you're looking for...") : R("search.placeholder", "Search assets...")), b = K(() => m.value ? Bt(R("search.semanticTitle", "AI semantic search — describe your image in natural language"), I_) : Bt(R("search.title", "Search by filename, tags, or attributes (e.g. rating:5, ext:png)"), I_)), x = K(() => m.value ? { + let r = n, i = dh(), a = Q(null), o = Q(null), s = Q(null), c = Q(null), l = Q(null), u = Q(null), d = Ne("mjr-search-autocomplete-", 8), f = (e) => e?.$el || e || null, p = () => f(o.value), m = Q(!1), h = Q(!0), g = Q(L_), _ = null, v = null, y = K(() => m.value ? R("search.semanticPlaceholder", "Describe what you're looking for...") : R("search.placeholder", "Search assets...")), b = K(() => m.value ? Vt(R("search.semanticTitle", "AI semantic search — describe your image in natural language"), I_) : Vt(R("search.title", "Search by filename, tags, or attributes (e.g. rating:5, ext:png)"), I_)), x = K(() => m.value ? { background: "rgba(0, 188, 212, 0.2)", borderColor: "rgba(0, 188, 212, 0.6)", color: "#00BCD4", @@ -18486,7 +18473,7 @@ var w_ = { return t[t.length - 1] || ""; }; async function D() { - return _ || (v ||= re(it.METADATA_KEYS, { limit: 600 }).then((e) => { + return _ || (v ||= re(at.METADATA_KEYS, { limit: 600 }).then((e) => { let t = e?.data || {}; return _ = t, t; }), v); @@ -18496,17 +18483,17 @@ var w_ = { return `${n ? n[1] : ""}${t}`.trimStart(); } function k(e, t) { - let n = E(e), r = n.replace(/^-/, ""), i = Sn(); + let n = E(e), r = n.replace(/^-/, ""), i = Cn(); if (!r.includes(":")) { let t = r.toLowerCase(); return Object.keys(i).filter((e) => e.startsWith(t)).slice(0, 12).map((t) => O(e, `${n.startsWith("-") ? "-" : ""}${t}:`)); } let [a, o = ""] = r.split(/:(.*)/s); - if (!In(a)) return []; + if (!Ln(a)) return []; let s = o.toLowerCase(), c = Array.isArray(t?.keys) ? t.keys : [], l = t?.workflow_nodes || {}; return [...c, ...Object.keys(l).flatMap((e) => (l[e] || []).map((t) => `workflow_nodes.${e}.${t}`))].filter((e) => String(e || "").toLowerCase().includes(s)).slice(0, 16).map((t) => O(e, `${n.startsWith("-") ? "-" : ""}${a}:${t}`)); } - let A = 0, j = Jt(async () => { + let A = 0, j = Yt(async () => { let e = (p()?.value || "").trim(); if (m.value || e.length < 1) return; let t = ++A; @@ -18526,16 +18513,16 @@ var w_ = { })); } catch {} }, 300); - return cr(() => i.searchQuery, (e) => { + return lr(() => i.searchQuery, (e) => { let t = p(); t && t.value !== e && (t.value = e); - }), cr(h, (e) => { + }), lr(h, (e) => { !e && m.value && (m.value = !1), S(); - }), cr(m, () => { + }), lr(m, () => { S(); - }), cr(() => i.metadataSearchMode, (e) => { + }), lr(() => i.metadataSearchMode, (e) => { String(e || "").toUpperCase() !== L_ && (i.metadataSearchMode = L_), g.value !== L_ && (g.value = L_), S(); - }), jr(() => { + }), Mr(() => { try { let e = p(); e && (e.value = i.searchQuery || ""), i.metadataSearchMode = L_; @@ -18575,7 +18562,7 @@ var w_ = { h.value = !!e, S(); } }), (e, t) => { - let n = ar("MInputText"), r = ar("MButton"); + let n = or("MInputText"), r = or("MButton"); return q(), X("div", { ref_key: "searchSectionRef", ref: a, @@ -18614,7 +18601,7 @@ var w_ = { disabled: !h.value, "aria-disabled": !h.value, title: h.value ? Z(R)("search.semanticToggle", "Toggle AI semantic search (CLIP-based)") : Z(R)("search.semanticDisabled", "AI semantic search is disabled in settings"), - style: xr(x.value), + style: Sr(x.value), onClick: w }, { default: W(() => [...t[1] ||= [U("i", { class: "pi pi-sparkles" }, null, -1)]]), @@ -18641,17 +18628,17 @@ var w_ = { ref_key: "similarPopoverRef", ref: l }, null, 512)]), - gr(e.$slots, "filter-anchor"), - gr(e.$slots, "sort-anchor"), - gr(e.$slots, "collections-anchor"), - gr(e.$slots, "pinned-folders-anchor") + _r(e.$slots, "filter-anchor"), + _r(e.$slots, "sort-anchor"), + _r(e.$slots, "collections-anchor"), + _r(e.$slots, "pinned-folders-anchor") ])], 512); }; } }), z_ = { class: "mjr-popover mjr-sort-popover", style: { display: "none" } -}, B_ = { class: "mjr-menu-item-label" }, V_ = /* @__PURE__ */ dr({ +}, B_ = { class: "mjr-menu-item-label" }, V_ = /* @__PURE__ */ fr({ __name: "SortPopover", setup(e) { let t = dh(), n = K(() => t.sort || "mtime_desc"), r = (e) => { @@ -18703,15 +18690,15 @@ var w_ = { command: () => r(e.key) }))); return (e, t) => { - let r = ar("MMenu"); + let r = or("MMenu"); return q(), X("div", z_, [Y(r, { model: i.value, class: "mjr-menu mjr-prime-menu mjr-sort-menu", pt: { list: { class: "mjr-menu mjr-prime-menu-list" } } }, { - item: W(({ item: e }) => [U("div", { class: Er(["mjr-menu-item", { "is-active": n.value === e.key }]) }, [U("span", B_, J(e.label), 1), U("i", { - class: Er([e.icon, "mjr-menu-item-check"]), - style: xr({ opacity: +(n.value === e.key) }) + item: W(({ item: e }) => [U("div", { class: Dr(["mjr-menu-item", { "is-active": n.value === e.key }]) }, [U("span", B_, J(e.label), 1), U("i", { + class: Dr([e.icon, "mjr-menu-item-check"]), + style: Sr({ opacity: +(n.value === e.key) }) }, null, 6)], 2)]), _: 1 }, 8, ["model"])]); @@ -18726,7 +18713,7 @@ var w_ = { }, vv = { class: "mjr-filter-group-body" }, yv = { class: "mjr-filter-card" }, bv = { class: "mjr-popover-row mjr-popover-row--3col" }, xv = { class: "mjr-popover-label" }, Sv = { class: "mjr-popover-row" }, Cv = { class: "mjr-popover-label" }, wv = { class: "mjr-popover-row mjr-popover-row--3col" }, Tv = { class: "mjr-popover-label" }, Ev = { class: "mjr-popover-row mjr-popover-row--3col" }, Dv = { class: "mjr-popover-label" }, Ov = { class: "mjr-filter-group-title" }, kv = { class: "mjr-filter-group-chevron", "aria-hidden": "true" -}, Av = { class: "mjr-filter-group-body" }, jv = { class: "mjr-filter-card mjr-filter-card--agenda" }, Mv = { class: "mjr-popover-row" }, Nv = { class: "mjr-popover-label" }, Pv = { class: "mjr-popover-row" }, Fv = { class: "mjr-popover-label" }, Iv = /* @__PURE__ */ dr({ +}, Av = { class: "mjr-filter-group-body" }, jv = { class: "mjr-filter-card mjr-filter-card--agenda" }, Mv = { class: "mjr-popover-row" }, Nv = { class: "mjr-popover-label" }, Pv = { class: "mjr-popover-row" }, Fv = { class: "mjr-popover-label" }, Iv = /* @__PURE__ */ fr({ __name: "FilterPopover", setup(e, { expose: t }) { let n = dh(), r = Q(null), a = Q(null), o = Q(null), s = Q(null), c = Q(null), l = Q(null), u = Q(null), d = Q(null), f = Q(null), p = Q(null), m = Q([{ @@ -18939,7 +18926,7 @@ var w_ = { console.debug?.(e); } }; - jr(() => { + Mr(() => { A(); }); let j = (e, { emit: t = !0 } = {}) => { @@ -19093,7 +19080,7 @@ var w_ = { return u.value; } }), (e, t) => { - let i = ar("MButton"), m = ar("MSelect"), h = ar("MCheckbox"), g = ar("MInputText"); + let i = or("MButton"), m = or("MSelect"), h = or("MCheckbox"), g = or("MInputText"); return q(), X("div", H_, [ U("div", U_, [U("div", W_, [U("div", G_, J(Z(R)("label.filters", "Filters")), 1), U("div", K_, J(Z(R)("label.refineResults", "Refine your results")), 1)]), U("div", q_, [U("span", J_, J(ve.value), 1), Y(i, { type: "button", @@ -19103,10 +19090,10 @@ var w_ = { disabled: ve.value === 0, onClick: ye }, { - default: W(() => [nr(J(Z(R)("action.clearAll", "Clear all")), 1)]), + default: W(() => [rr(J(Z(R)("action.clearAll", "Clear all")), 1)]), _: 1 }, 8, ["disabled"])])]), - U("div", { class: Er(["mjr-filter-group mjr-filter-group--core", { "is-open": se("core") }]) }, [Y(i, { + U("div", { class: Dr(["mjr-filter-group mjr-filter-group--core", { "is-open": se("core") }]) }, [Y(i, { type: "button", class: "mjr-filter-group-toggle", severity: "secondary", @@ -19116,7 +19103,7 @@ var w_ = { }, { default: W(() => [U("span", Y_, J(Z(R)("group.core", "Core")), 1), U("span", X_, J(se("core") ? "▾" : "▸"), 1)]), _: 1 - }, 8, ["aria-expanded"]), _r(U("div", Z_, [U("div", Q_, [U("div", $_, [U("div", ev, J(Z(R)("label.type")), 1), Y(m, { + }, 8, ["aria-expanded"]), vr(U("div", Z_, [U("div", Q_, [U("div", $_, [U("div", ev, J(Z(R)("label.type")), 1), Y(m, { class: "mjr-select mjr-filter-select", "panel-class": "mjr-filter-select-panel", title: Z(R)("tooltip.filterByFileType", "Filter by file type"), @@ -19201,8 +19188,8 @@ var w_ = { "model-value", "options" ])]) - ])], 512), [[yr, se("core")]])], 2), - U("div", { class: Er(["mjr-filter-group mjr-filter-group--media", { "is-open": se("media") }]) }, [Y(i, { + ])], 512), [[br, se("core")]])], 2), + U("div", { class: Dr(["mjr-filter-group mjr-filter-group--media", { "is-open": se("media") }]) }, [Y(i, { type: "button", class: "mjr-filter-group-toggle", severity: "secondary", @@ -19212,7 +19199,7 @@ var w_ = { }, { default: W(() => [U("span", gv, J(Z(R)("group.media", "Media")), 1), U("span", _v, J(se("media") ? "▾" : "▸"), 1)]), _: 1 - }, 8, ["aria-expanded"]), _r(U("div", vv, [U("div", yv, [ + }, 8, ["aria-expanded"]), vr(U("div", vv, [U("div", yv, [ U("div", bv, [ U("div", xv, J(Z(R)("label.fileSizeMB", "File size (MB)")), 1), Y(g, { @@ -19317,8 +19304,8 @@ var w_ = { "value" ]) ]) - ])], 512), [[yr, se("media")]])], 2), - U("div", { class: Er(["mjr-filter-group mjr-filter-group--time", { "is-open": se("time") }]) }, [Y(i, { + ])], 512), [[br, se("media")]])], 2), + U("div", { class: Dr(["mjr-filter-group mjr-filter-group--time", { "is-open": se("time") }]) }, [Y(i, { type: "button", class: "mjr-filter-group-toggle", severity: "secondary", @@ -19328,7 +19315,7 @@ var w_ = { }, { default: W(() => [U("span", Ov, J(Z(R)("group.time", "Time")), 1), U("span", kv, J(se("time") ? "▾" : "▸"), 1)]), _: 1 - }, 8, ["aria-expanded"]), _r(U("div", Av, [U("div", jv, [U("div", Mv, [U("div", Nv, J(Z(R)("label.dateRange")), 1), Y(m, { + }, 8, ["aria-expanded"]), vr(U("div", Av, [U("div", jv, [U("div", Mv, [U("div", Nv, J(Z(R)("label.dateRange")), 1), Y(m, { class: "mjr-select mjr-filter-select", "panel-class": "mjr-filter-select-panel", title: Z(R)("tooltip.filterByDateRange", "Filter by date range"), @@ -19349,10 +19336,10 @@ var w_ = { ref_key: "dateExactInputRef", ref: d, type: "date", - class: Er(["mjr-input mjr-agenda-input", D.value]), + class: Dr(["mjr-input mjr-agenda-input", D.value]), value: Z(n).dateExactFilter, onChange: ae - }, null, 8, ["class", "value"])], 512)])])], 512), [[yr, se("time")]])], 2) + }, null, 8, ["class", "value"])], 512)])])], 512), [[br, se("time")]])], 2) ]); }; } @@ -19474,7 +19461,7 @@ function Uv(e) { } function Wv() { try { - return !!(Vn()?.ai?.vectorSearchEnabled ?? !0); + return !!(Hn()?.ai?.vectorSearchEnabled ?? !0); } catch { return !0; } @@ -19498,7 +19485,7 @@ var Gv = { class: "mjr-menu mjr-collections-menu" }, Kv = { class: "mjr-menu-ite }, ry = { class: "mjr-state-block" }, iy = { class: "mjr-section-title mjr-section-title--cyan" }, ay = { class: "mjr-section-hint" }, oy = { class: "mjr-menu-item-label mjr-menu-item-label--icon" }, sy = { class: "mjr-section-title mjr-section-title--violet" }, cy = { class: "mjr-section-hint" }, ly = { class: "mjr-menu-item-label mjr-menu-item-label--icon" }, uy = { key: 0, class: "mjr-state-block is-error" -}, dy = { class: "mjr-cluster-thumbs" }, fy = ["src", "alt"], py = { class: "mjr-cluster-info" }, my = ["title"], hy = { class: "mjr-cluster-count" }, gy = "mjr:collections-changed", _y = /* @__PURE__ */ dr({ +}, dy = { class: "mjr-cluster-thumbs" }, fy = ["src", "alt"], py = { class: "mjr-cluster-info" }, my = ["title"], hy = { class: "mjr-cluster-count" }, gy = "mjr:collections-changed", _y = /* @__PURE__ */ fr({ __name: "CollectionsPopover", setup(t, { expose: n }) { let r = dh(), i = Q(null), a = Q([]), o = Q(!1), s = Q(""), c = Q(!1), l = Q(!0), u = Q(!1), p = Q(!1), m = Q(!1), h = Q([]), g = Q(""), _ = Q(""), v = 0, y = null, b = !1, x = K(() => String(r.collectionId || "").trim()), C = K(() => String(r.collectionName || "").trim()), T = K(() => !!x.value), O = K(() => !l.value || p.value), k = K(() => l.value && u.value), A = K(() => `${Math.max(1, Math.min(a.value.length, 6)) * 48}px`); @@ -19520,7 +19507,7 @@ var Gv = { class: "mjr-menu mjr-collections-menu" }, Kv = { class: "mjr-menu-ite } function N(e) { try { - return We(e) || ""; + return Ge(e) || ""; } catch (e) { return console.debug?.(e), ""; } @@ -19581,7 +19568,7 @@ var Gv = { class: "mjr-menu mjr-collections-menu" }, Kv = { class: "mjr-menu-ite }; } let I = F("create", async () => { - let t = await wt(R("dialog.createCollection", "Create collection"), R("dialog.collectionPlaceholder", "Collection name")); + let t = await Tt(R("dialog.createCollection", "Create collection"), R("dialog.collectionPlaceholder", "Collection name")); if (!t) return; let n = zv(t); if (!n) { @@ -19610,7 +19597,7 @@ var Gv = { class: "mjr-menu mjr-collections-menu" }, Kv = { class: "mjr-menu-ite })); }), ie = F("delete", async (t) => { let n = String(t?.id || ""), r = String(t?.name || n); - if (!n || !await Ut(R("dialog.deleteCollection", "Delete collection \"{name}\"?", { name: r }))) return; + if (!n || !await Wt(R("dialog.deleteCollection", "Delete collection \"{name}\"?", { name: r }))) return; let i = await w(n); i?.ok ? n === x.value ? M({ collectionId: "", @@ -19731,12 +19718,12 @@ var Gv = { class: "mjr-menu mjr-collections-menu" }, Kv = { class: "mjr-menu-ite let e = j(); e && !b && te().catch(() => {}), b = e; } - return jr(() => { + return Mr(() => { ce(), typeof MutationObserver < "u" && i.value && (y = new MutationObserver(() => ce()), y.observe(i.value, { attributes: !0, attributeFilter: ["style"] })); - }), rr(() => { + }), ir(() => { try { y?.disconnect?.(); } catch (e) { @@ -19744,7 +19731,7 @@ var Gv = { class: "mjr-menu mjr-collections-menu" }, Kv = { class: "mjr-menu-ite } y = null; }), n({ refresh: te }), (e, t) => { - let n = ar("MButton"), r = ar("MVirtualScroller"); + let n = or("MButton"), r = or("MVirtualScroller"); return q(), X("div", { ref_key: "rootRef", ref: i, @@ -19762,7 +19749,7 @@ var Gv = { class: "mjr-menu mjr-collections-menu" }, Kv = { class: "mjr-menu-ite default: W(() => [U("span", Kv, J(Z(R)("ctx.createCollection", "Create collection")), 1), t[0] ||= U("i", { class: "pi pi-plus mjr-menu-item-check mjr-menu-item-check--visible" }, null, -1)]), _: 1 }, 8, ["disabled", "onClick"]), - T.value ? (q(), ir(n, { + T.value ? (q(), ar(n, { key: 0, type: "button", class: "mjr-menu-item", @@ -19775,7 +19762,7 @@ var Gv = { class: "mjr-menu mjr-collections-menu" }, Kv = { class: "mjr-menu-ite _: 1 }, 8, ["disabled", "onClick"])) : G("", !0), t[9] ||= U("div", { class: "mjr-menu-divider" }, null, -1), - o.value ? (q(), X("div", Xv, J(Z(R)("label.loading", "Loading...")), 1)) : s.value ? (q(), X("div", Zv, J(s.value), 1)) : a.value.length ? (q(), ir(r, { + o.value ? (q(), X("div", Xv, J(Z(R)("label.loading", "Loading...")), 1)) : s.value ? (q(), X("div", Zv, J(s.value), 1)) : a.value.length ? (q(), ar(r, { key: 4, items: a.value, "item-size": 48, @@ -19785,7 +19772,7 @@ var Gv = { class: "mjr-menu mjr-collections-menu" }, Kv = { class: "mjr-menu-ite }, { item: W(({ item: e }) => [U("div", $v, [Y(n, { type: "button", - class: Er(["mjr-menu-item", { "is-active": x.value === String(e.id || "") }]), + class: Dr(["mjr-menu-item", { "is-active": x.value === String(e.id || "") }]), severity: "secondary", text: "", disabled: _.value !== "", @@ -19804,7 +19791,7 @@ var Gv = { class: "mjr-menu mjr-collections-menu" }, Kv = { class: "mjr-menu-ite text: "", disabled: _.value !== "", title: Z(R)("tooltip.deleteCollection", "Delete collection"), - onClick: mr((t) => Z(ie)(e), ["stop", "prevent"]) + onClick: hr((t) => Z(ie)(e), ["stop", "prevent"]) }, { default: W(() => [...t[3] ||= [U("i", { class: "pi pi-trash" }, null, -1)]]), _: 1 @@ -19820,7 +19807,7 @@ var Gv = { class: "mjr-menu mjr-collections-menu" }, Kv = { class: "mjr-menu-ite t[7] ||= U("div", { class: "mjr-menu-divider" }, null, -1), U("div", iy, J(Z(R)("label.smartSuggestions", "Smart Suggestions")), 1), U("div", ay, J(Z(R)("label.smartCollectionsHint", "Create collections from AI-detected themes")), 1), - (q(!0), X(H, null, hr(Z(Rv), (e) => (q(), ir(n, { + (q(!0), X(H, null, gr(Z(Rv), (e) => (q(), ar(n, { key: e.key, type: "button", class: "mjr-menu-item mjr-menu-item--smart", @@ -19829,7 +19816,7 @@ var Gv = { class: "mjr-menu mjr-collections-menu" }, Kv = { class: "mjr-menu-ite disabled: _.value !== "", onClick: (t) => oe(e) }, { - default: W(() => [U("span", oy, [U("i", { class: Er(e.iconClass) }, null, 2), U("span", null, J(e.label), 1)]), t[5] ||= U("i", { class: "pi pi-plus mjr-menu-item-check mjr-menu-item-check--visible" }, null, -1)]), + default: W(() => [U("span", oy, [U("i", { class: Dr(e.iconClass) }, null, 2), U("span", null, J(e.label), 1)]), t[5] ||= U("i", { class: "pi pi-plus mjr-menu-item-check mjr-menu-item-check--visible" }, null, -1)]), _: 2 }, 1032, ["disabled", "onClick"]))), 128)), t[8] ||= U("div", { class: "mjr-menu-divider" }, null, -1), @@ -19847,11 +19834,11 @@ var Gv = { class: "mjr-menu mjr-collections-menu" }, Kv = { class: "mjr-menu-ite _: 1 }, 8, ["disabled"]), g.value ? (q(), X("div", uy, J(g.value), 1)) : G("", !0), - (q(!0), X(H, null, hr(h.value, (e) => (q(), X("div", { + (q(!0), X(H, null, gr(h.value, (e) => (q(), X("div", { key: e.cluster_id, class: "mjr-cluster-row" }, [ - U("div", dy, [(q(!0), X(H, null, hr(Array.isArray(e.sample_assets) ? e.sample_assets.slice(0, 3) : [], (t, n) => (q(), X("img", { + U("div", dy, [(q(!0), X(H, null, gr(Array.isArray(e.sample_assets) ? e.sample_assets.slice(0, 3) : [], (t, n) => (q(), X("img", { key: `${e.cluster_id}-${n}`, class: "mjr-cluster-thumb", src: N(t), @@ -19870,7 +19857,7 @@ var Gv = { class: "mjr-menu mjr-collections-menu" }, Kv = { class: "mjr-menu-ite title: Z(R)("ctx.createCollection", "Create collection"), onClick: (t) => L(e) }, { - default: W(() => [nr(J(_.value === `cluster:${String(e.cluster_id ?? "")}` ? Z(R)("label.loading", "Loading...") : Z(R)("label.create", "Create")), 1)]), + default: W(() => [rr(J(_.value === `cluster:${String(e.cluster_id ?? "")}` ? Z(R)("label.loading", "Loading...") : Z(R)("label.create", "Create")), 1)]), _: 2 }, 1032, [ "disabled", @@ -19891,7 +19878,7 @@ var Gv = { class: "mjr-menu mjr-collections-menu" }, Kv = { class: "mjr-menu-ite }, xy = { class: "mjr-pinned-folder-label" }, Sy = { key: 0, class: "mjr-menu-item-hint mjr-pinned-folder-path" -}, Cy = /* @__PURE__ */ dr({ +}, Cy = /* @__PURE__ */ fr({ __name: "PinnedFoldersPopover", setup(e, { expose: t }) { let n = Q(null), r = Q([]), i = Q(!1), a = Q("No pinned folders"), o = Q("Loading..."), s = Q("Unpin folder"), c = Q(null), l = Q(null); @@ -19922,13 +19909,13 @@ var Gv = { class: "mjr-menu mjr-collections-menu" }, Kv = { class: "mjr-menu-ite setPinnedFolders: d, setPinnedFoldersLoading: f }), (e, t) => { - let c = ar("MButton"); + let c = or("MButton"); return q(), X("div", vy, [U("div", { ref_key: "menuRef", ref: n, class: "mjr-menu mjr-pinned-folders-menu", role: "menu" - }, [i.value ? (q(), X("div", yy, J(o.value), 1)) : r.value.length ? (q(!0), X(H, { key: 2 }, hr(r.value, (e) => (q(), X("div", { + }, [i.value ? (q(), X("div", yy, J(o.value), 1)) : r.value.length ? (q(!0), X(H, { key: 2 }, gr(r.value, (e) => (q(), X("div", { key: e.id, class: "mjr-pinned-folder-row" }, [Y(c, { @@ -19964,7 +19951,7 @@ var Gv = { class: "mjr-menu mjr-collections-menu" }, Kv = { class: "mjr-menu-ite }), wy = { class: "mjr-popover mjr-custom-popover", style: { display: "none" } -}, Ty = { class: "mjr-popover-row" }, Ey = { class: "mjr-popover-label" }, Dy = { class: "mjr-popover-row mjr-popover-row--actions" }, Oy = /* @__PURE__ */ dr({ +}, Ty = { class: "mjr-popover-row" }, Ey = { class: "mjr-popover-label" }, Dy = { class: "mjr-popover-row mjr-popover-row--actions" }, Oy = /* @__PURE__ */ fr({ __name: "CustomRootsPopover", setup(e, { expose: t }) { let n = Q([{ @@ -20047,7 +20034,7 @@ var Gv = { class: "mjr-menu mjr-collections-menu" }, Kv = { class: "mjr-menu-ite return s(o.value); } }), (e, t) => { - let s = ar("MSelect"), c = ar("MButton"); + let s = or("MSelect"), c = or("MButton"); return q(), X("div", wy, [U("div", Ty, [U("div", Ey, J(Z(R)("label.folder")), 1), Y(s, { class: "mjr-select", "model-value": r.value, @@ -20067,7 +20054,7 @@ var Gv = { class: "mjr-menu mjr-collections-menu" }, Kv = { class: "mjr-menu-ite class: "mjr-btn", severity: "secondary" }, { - default: W(() => [nr(J(Z(R)("btn.add")), 1)]), + default: W(() => [rr(J(Z(R)("btn.add")), 1)]), _: 1 }, 512), Y(c, { ref_key: "customRemoveBtnRef", @@ -20077,7 +20064,7 @@ var Gv = { class: "mjr-menu mjr-collections-menu" }, Kv = { class: "mjr-menu-ite severity: "secondary", disabled: "" }, { - default: W(() => [nr(J(Z(R)("btn.remove")), 1)]), + default: W(() => [rr(J(Z(R)("btn.remove")), 1)]), _: 1 }, 512)])]); }; @@ -20085,7 +20072,7 @@ var Gv = { class: "mjr-menu mjr-collections-menu" }, Kv = { class: "mjr-menu-ite }), ky = ["aria-label"], Ay = { class: "mjr-messages-head" }, jy = { class: "mjr-messages-actions" }, My = ["title"], Ny = { class: "mjr-messages-star-label" }, Py = { class: "mjr-messages-tabs", role: "tablist" -}, Fy = { class: "mjr-messages-panels" }, Iy = { class: "mjr-messages-empty" }, Ly = "https://github.com/MajoorWaldi/ComfyUI-Majoor-AssetsManager", Ry = /* @__PURE__ */ dr({ +}, Fy = { class: "mjr-messages-panels" }, Iy = { class: "mjr-messages-empty" }, Ly = "https://github.com/MajoorWaldi/ComfyUI-Majoor-AssetsManager", Ry = /* @__PURE__ */ fr({ __name: "MessagePopover", setup(e, { expose: t }) { let n = Q(null), r = Q(null), i = Q(null), a = Q(null), o = Q(null), s = Q(null), c = Q(null), l = Q(null), u = Q(null), d = Q(null), f = Q(null), p = (e) => e?.$el || e || null; @@ -20124,7 +20111,7 @@ var Gv = { class: "mjr-menu mjr-collections-menu" }, Kv = { class: "mjr-menu-ite return f.value; } }), (e, t) => { - let p = ar("MButton"), m = ar("MDialog"); + let p = or("MButton"), m = or("MDialog"); return q(), X("div", { class: "mjr-popover mjr-messages-popover", id: "mjr-messages-popover", @@ -20171,7 +20158,7 @@ var Gv = { class: "mjr-menu mjr-collections-menu" }, Kv = { class: "mjr-menu-ite severity: "secondary", title: Z(R)("tooltip.markMessagesRead", "Mark all messages as read") }, { - default: W(() => [nr(J(Z(R)("btn.markAllRead", "Mark all read")), 1)]), + default: W(() => [rr(J(Z(R)("btn.markAllRead", "Mark all read")), 1)]), _: 1 }, 8, ["title"])])]), U("div", Py, [ @@ -20239,7 +20226,7 @@ var Gv = { class: "mjr-menu mjr-collections-menu" }, Kv = { class: "mjr-menu-ite "aria-controls": "mjr-shortcuts-panel", id: "mjr-shortcuts-tab" }, { - default: W(() => [nr(J(Z(R)("msg.shortcuts.title", "Shortcut Guide")), 1)]), + default: W(() => [rr(J(Z(R)("msg.shortcuts.title", "Shortcut Guide")), 1)]), _: 1 }, 512) ]), @@ -20279,7 +20266,7 @@ var Gv = { class: "mjr-menu mjr-collections-menu" }, Kv = { class: "mjr-menu-ite }), zy = { class: "mjr-am-header-row" }, By = { class: "mjr-am-header-left" }, Vy = { class: "mjr-am-header-title" }, Hy = ["data-mjr-version-channel", "title"], Uy = { class: "mjr-tabs" }, Wy = { class: "mjr-am-header-tools" }, Gy = { class: "mjr-popover-anchor", style: { display: "none" } -}, Ky = { class: "mjr-popover-anchor" }, qy = { class: "mjr-popover-anchor" }, Jy = { class: "mjr-popover-anchor" }, Yy = { class: "mjr-popover-anchor" }, Xy = { class: "mjr-popover-anchor" }, Zy = "mjr-am-version-badge-label", Qy = "V", $y = /* @__PURE__ */ dr({ +}, Ky = { class: "mjr-popover-anchor" }, qy = { class: "mjr-popover-anchor" }, Jy = { class: "mjr-popover-anchor" }, Yy = { class: "mjr-popover-anchor" }, Xy = { class: "mjr-popover-anchor" }, Zy = "mjr-am-version-badge-label", Qy = "V", $y = /* @__PURE__ */ fr({ __name: "HeaderSection", setup(n, { expose: r }) { let i = null; @@ -20354,7 +20341,7 @@ var Gv = { class: "mjr-menu mjr-collections-menu" }, Kv = { class: "mjr-menu-ite verticalAlign: "middle" })), he = K(() => oe.value ? R("tooltip.closeMFV", "Close Majoor Floating Viewer") : R("tooltip.openMFV", "Open Majoor Floating Viewer")), ge = K(() => "pi pi-eye"), _e = K(() => R("tooltip.openMajoorSettings", "Open Majoor Assets Manager settings")); async function ve() { - let n = rt(); + let n = it(); if (!n || typeof n != "object") { e(R("toast.workflowSerializeFailed", "Could not read the current ComfyUI workflow."), "error"); return; @@ -20386,13 +20373,13 @@ var Gv = { class: "mjr-menu mjr-collections-menu" }, Kv = { class: "mjr-menu-ite async function ye() { let t = ""; try { - let e = await L(it.BROWSE_FOLDER, {}); + let e = await L(at.BROWSE_FOLDER, {}); e?.ok && (t = String(e?.data?.path || "").trim()); } catch (e) { console.debug?.(e); } if (!t) { - let e = await wt(R("dialog.enterWorkflowRootPath", "Workflow root folder"), "", R("tab.workflow", "Workflow")); + let e = await Tt(R("dialog.enterWorkflowRootPath", "Workflow root folder"), "", R("tab.workflow", "Workflow")); t = String(e || "").trim(); } if (!t) return; @@ -20400,8 +20387,8 @@ var Gv = { class: "mjr-menu mjr-collections-menu" }, Kv = { class: "mjr-menu-ite if (!n?.ok) e(n?.error || R("toast.failedSetWorkflowRoots", "Failed to set workflow roots"), "error"); else { try { - let e = Vn(); - e.paths = e.paths || {}, e.paths.workflowRoots = String(n?.data?.workflow_roots_text || t).trim(), Fn(e), window.dispatchEvent(new CustomEvent("mjr-settings-changed", { detail: { + let e = Hn(); + e.paths = e.paths || {}, e.paths.workflowRoots = String(n?.data?.workflow_roots_text || t).trim(), In(e), window.dispatchEvent(new CustomEvent("mjr-settings-changed", { detail: { key: "paths.workflowRoots", value: t } })), window.dispatchEvent(new CustomEvent("mjr:reload-grid", { detail: { reason: "workflow-root-pick" } })); @@ -20478,7 +20465,7 @@ var Gv = { class: "mjr-menu mjr-collections-menu" }, Kv = { class: "mjr-menu-ite } async function Te(e) { try { - let t = await re(it.VERSION, { cache: "no-cache" }); + let t = await re(at.VERSION, { cache: "no-cache" }); if (!t?.ok) return; let n = String(t.data?.version || "").trim(); if (o(n, String(t.data?.branch || "").trim().toLowerCase()) || e) { @@ -20490,7 +20477,7 @@ var Gv = { class: "mjr-menu mjr-collections-menu" }, Kv = { class: "mjr-menu-ite } function Ee() { try { - Lt(I(y.value), he.value, Qy); + Rt(I(y.value), he.value, Qy); } catch (e) { console.debug?.(e); } @@ -20510,7 +20497,7 @@ var Gv = { class: "mjr-menu mjr-collections-menu" }, Kv = { class: "mjr-menu-ite window.dispatchEvent(new CustomEvent(V.MFV_TOGGLE)); } function Ae() { - Yn(); + Xn(); } function je() { try { @@ -20519,10 +20506,10 @@ var Gv = { class: "mjr-menu mjr-collections-menu" }, Kv = { class: "mjr-menu-ite console.debug?.(e); } } - return cr(oe, () => { + return lr(oe, () => { Ee(); - }), jr(async () => { - await lr(), De(), Ee(), we(u), Te(u); + }), Mr(async () => { + await ur(), De(), Ee(), we(u), Te(u); try { typeof window < "u" && window.addEventListener(V.MFV_VISIBILITY_CHANGED, Oe); } catch (e) { @@ -20533,7 +20520,7 @@ var Gv = { class: "mjr-menu mjr-collections-menu" }, Kv = { class: "mjr-menu-ite } catch (e) { console.debug?.(e); } - }), rr(() => { + }), ir(() => { je(); }), r({ isVueHeader: !0, @@ -20717,7 +20704,7 @@ var Gv = { class: "mjr-menu mjr-collections-menu" }, Kv = { class: "mjr-menu-ite }, _headerDispose: je }), (e, t) => { - let n = ar("MButton"); + let n = or("MButton"); return q(), X(H, null, [U("div", { ref_key: "headerRef", ref: d, @@ -20735,10 +20722,10 @@ var Gv = { class: "mjr-menu mjr-collections-menu" }, Kv = { class: "mjr-menu-ite class: "mjr-am-version-badge", "data-mjr-version-channel": ie.value, title: Z(R)("tooltip.supportKofi"), - style: xr(me.value), + style: Sr(me.value), onMouseenter: t[0] ||= (e) => ae.value = !0, onMouseleave: t[1] ||= (e) => ae.value = !1 - }, [U("span", { class: Er(Zy) }, J(ne.value), 1)], 44, Hy) + }, [U("span", { class: Dr(Zy) }, J(ne.value), 1)], 44, Hy) ]), U("div", { ref_key: "headerActionsRef", ref: f, @@ -20748,79 +20735,79 @@ var Gv = { class: "mjr-menu mjr-collections-menu" }, Kv = { class: "mjr-menu-ite ref_key: "tabAllRef", ref: M, type: "button", - class: Er(["mjr-tab", { "is-active": ce.value === "all" }]), + class: Dr(["mjr-tab", { "is-active": ce.value === "all" }]), severity: "secondary", text: "", "data-scope": "all", title: Z(R)("tooltip.tab.all") }, { - default: W(() => [nr(J(Z(R)("tab.all")), 1)]), + default: W(() => [rr(J(Z(R)("tab.all")), 1)]), _: 1 }, 8, ["class", "title"]), Y(n, { ref_key: "tabInputsRef", ref: N, type: "button", - class: Er(["mjr-tab", { "is-active": ce.value === "input" }]), + class: Dr(["mjr-tab", { "is-active": ce.value === "input" }]), severity: "secondary", text: "", "data-scope": "input", title: Z(R)("tooltip.tab.input") }, { - default: W(() => [nr(J(Z(R)("tab.input")), 1)]), + default: W(() => [rr(J(Z(R)("tab.input")), 1)]), _: 1 }, 8, ["class", "title"]), Y(n, { ref_key: "tabOutputsRef", ref: P, type: "button", - class: Er(["mjr-tab", { "is-active": ce.value === "output" }]), + class: Dr(["mjr-tab", { "is-active": ce.value === "output" }]), severity: "secondary", text: "", "data-scope": "output", title: Z(R)("tooltip.tab.output") }, { - default: W(() => [nr(J(Z(R)("tab.output")), 1)]), + default: W(() => [rr(J(Z(R)("tab.output")), 1)]), _: 1 }, 8, ["class", "title"]), Y(n, { ref_key: "tabCustomRef", ref: ee, type: "button", - class: Er(["mjr-tab", { "is-active": ce.value === "custom" }]), + class: Dr(["mjr-tab", { "is-active": ce.value === "custom" }]), severity: "secondary", text: "", "data-scope": "custom", title: Z(R)("tooltip.tab.custom") }, { - default: W(() => [nr(J(Z(R)("tab.custom")), 1)]), + default: W(() => [rr(J(Z(R)("tab.custom")), 1)]), _: 1 }, 8, ["class", "title"]), Y(n, { ref_key: "tabWorkflowRef", ref: te, type: "button", - class: Er(["mjr-tab", { "is-active": ce.value === "workflow" }]), + class: Dr(["mjr-tab", { "is-active": ce.value === "workflow" }]), severity: "secondary", text: "", "data-scope": "workflow", title: Z(R)("tooltip.tab.workflow", "Browse saved workflows") }, { - default: W(() => [nr(J(Z(R)("tab.workflow", "Workflow")), 1)]), + default: W(() => [rr(J(Z(R)("tab.workflow", "Workflow")), 1)]), _: 1 }, 8, ["class", "title"]), Y(n, { ref_key: "tabSimilarRef", ref: F, type: "button", - class: Er(["mjr-tab", { "is-active": ce.value === "similar" }]), + class: Dr(["mjr-tab", { "is-active": ce.value === "similar" }]), severity: "secondary", text: "", "data-scope": "similar", - style: xr({ display: le.value ? "" : "none" }), + style: Sr({ display: le.value ? "" : "none" }), title: fe.value }, { - default: W(() => [nr(J(de.value), 1)]), + default: W(() => [rr(J(de.value), 1)]), _: 1 }, 8, [ "class", @@ -20828,7 +20815,7 @@ var Gv = { class: "mjr-menu mjr-collections-menu" }, Kv = { class: "mjr-menu-ite "title" ]) ]), U("div", Wy, [ - ce.value === "workflow" ? (q(), ir(n, { + ce.value === "workflow" ? (q(), ar(n, { key: 0, ref_key: "saveWorkflowBtnRef", ref: S, @@ -20847,7 +20834,7 @@ var Gv = { class: "mjr-menu mjr-collections-menu" }, Kv = { class: "mjr-menu-ite }, null, -1)]]), _: 1 }, 8, ["title", "aria-label"])) : G("", !0), - ce.value === "workflow" ? (q(), ir(n, { + ce.value === "workflow" ? (q(), ar(n, { key: 1, ref_key: "pickWorkflowRootBtnRef", ref: C, @@ -20866,7 +20853,7 @@ var Gv = { class: "mjr-menu mjr-collections-menu" }, Kv = { class: "mjr-menu-ite }, null, -1)]]), _: 1 }, 8, ["title", "aria-label"])) : G("", !0), - ce.value === "workflow" ? (q(), ir(n, { + ce.value === "workflow" ? (q(), ar(n, { key: 2, type: "button", class: "mjr-icon-btn mjr-import-workflow-btn", @@ -20916,7 +20903,7 @@ var Gv = { class: "mjr-menu mjr-collections-menu" }, Kv = { class: "mjr-menu-ite ref_key: "mfvBtnRef", ref: y, type: "button", - class: Er(["mjr-icon-btn", { "mjr-mfv-btn-active": oe.value }]), + class: Dr(["mjr-icon-btn", { "mjr-mfv-btn-active": oe.value }]), severity: "secondary", text: "", rounded: "", @@ -20925,7 +20912,7 @@ var Gv = { class: "mjr-menu mjr-collections-menu" }, Kv = { class: "mjr-menu-ite onClick: ke }, { default: W(() => [U("i", { - class: Er(ge.value), + class: Dr(ge.value), "aria-hidden": "true" }, null, 2)]), _: 1 @@ -21012,7 +20999,7 @@ var Gv = { class: "mjr-menu mjr-collections-menu" }, Kv = { class: "mjr-menu-ite "aria-label": Z(R)("label.sort") }, { default: W(() => [U("i", { - class: Er(se.value), + class: Dr(se.value), "aria-hidden": "true" }, null, 2)]), _: 1 @@ -21280,7 +21267,7 @@ var db = { }, fb = { key: 0, class: "mjr-folder-breadcrumb-separator" -}, pb = { class: "mjr-am-summary-left" }, mb = { class: "mjr-am-summary-text" }, hb = { class: "mjr-am-summary-right" }, gb = ["aria-label"], _b = /* @__PURE__ */ dr({ +}, pb = { class: "mjr-am-summary-left" }, mb = { class: "mjr-am-summary-text" }, hb = { class: "mjr-am-summary-right" }, gb = ["aria-label"], _b = /* @__PURE__ */ fr({ __name: "SummaryBarSection", setup(e, { expose: t }) { let n = dh(), r = Q(null), i = Q(null), a = Q(null), o = Q(""), s = Q(""), c = Q(!1), l = Q(!1), u = Q(null), d = Q(null), f = Q([]), p = ib(), m = K(() => String(n.kindFilter || "").trim().toLowerCase()), h = K(() => { @@ -21368,7 +21355,7 @@ var db = { console.debug?.(e); } } - return jr(() => { + return Mr(() => { try { a.value?.appendChild?.(p.wrap); } catch (e) { @@ -21380,14 +21367,14 @@ var db = { folderBreadcrumb: i, setFolderBreadcrumb: S }), (e, t) => { - let n = ar("MButton"); + let n = or("MButton"); return q(), X(H, null, [U("div", { ref_key: "folderBreadcrumb", ref: i, - class: Er(["mjr-folder-breadcrumb", { "is-visible": l.value }]), + class: Dr(["mjr-folder-breadcrumb", { "is-visible": l.value }]), "aria-label": "Folder breadcrumb" }, [ - u.value ? (q(), ir(n, { + u.value ? (q(), ar(n, { key: 0, type: "button", class: "mjr-btn-link mjr-folder-breadcrumb-action", @@ -21396,10 +21383,10 @@ var db = { disabled: u.value.disabled, onClick: t[0] ||= (e) => C(u.value) }, { - default: W(() => [nr(J(u.value.label), 1)]), + default: W(() => [rr(J(u.value.label), 1)]), _: 1 }, 8, ["disabled"])) : G("", !0), - d.value ? (q(), ir(n, { + d.value ? (q(), ar(n, { key: 1, type: "button", class: "mjr-btn-link mjr-folder-breadcrumb-action", @@ -21408,19 +21395,19 @@ var db = { disabled: d.value.disabled, onClick: t[1] ||= (e) => C(d.value) }, { - default: W(() => [nr(J(d.value.label), 1)]), + default: W(() => [rr(J(d.value.label), 1)]), _: 1 }, 8, ["disabled"])) : G("", !0), u.value || d.value ? (q(), X("span", db, " | ")) : G("", !0), - (q(!0), X(H, null, hr(f.value, (e, t) => (q(), X(H, { key: `${e.target}:${t}` }, [t > 0 ? (q(), X("span", fb, "/")) : G("", !0), Y(n, { + (q(!0), X(H, null, gr(f.value, (e, t) => (q(), X(H, { key: `${e.target}:${t}` }, [t > 0 ? (q(), X("span", fb, "/")) : G("", !0), Y(n, { type: "button", - class: Er(["mjr-btn-link mjr-folder-breadcrumb-segment", { "is-current": e.current }]), + class: Dr(["mjr-btn-link mjr-folder-breadcrumb-segment", { "is-current": e.current }]), severity: "secondary", text: "", disabled: e.current, onClick: (t) => C(e) }, { - default: W(() => [nr(J(e.label), 1)]), + default: W(() => [rr(J(e.label), 1)]), _: 2 }, 1032, [ "class", @@ -21437,10 +21424,10 @@ var db = { class: "mjr-media-shortcuts", "aria-label": Z(R)("label.type", "Type"), role: "group" - }, [(q(!0), X(H, null, hr(h.value, (e) => (q(), ir(n, { + }, [(q(!0), X(H, null, gr(h.value, (e) => (q(), ar(n, { key: e.kind, type: "button", - class: Er(["mjr-icon-btn mjr-media-shortcut-btn", { "mjr-context-active": v(e.kind) }]), + class: Dr(["mjr-icon-btn mjr-media-shortcut-btn", { "mjr-context-active": v(e.kind) }]), severity: "secondary", text: "", rounded: "", @@ -21450,7 +21437,7 @@ var db = { onClick: (t) => b(e.kind) }, { default: W(() => [U("i", { - class: Er(e.icon), + class: Dr(e.icon), "aria-hidden": "true" }, null, 2)]), _: 2 @@ -21461,7 +21448,7 @@ var db = { "class", "onClick" ]))), 128))], 8, gb), - c.value ? (q(), ir(n, { + c.value ? (q(), ar(n, { key: 0, type: "button", class: "mjr-am-dup-alert", @@ -21470,7 +21457,7 @@ var db = { title: s.value, onClick: _ }, { - default: W(() => [nr(J(s.value), 1)]), + default: W(() => [rr(J(s.value), 1)]), _: 1 }, 8, ["title"])) : G("", !0), U("div", { @@ -21486,7 +21473,7 @@ function vb(e, t) { let n = null; function r(e) { if (e && !e._mjrGridContextMenuBound) try { - n = Ra({ + n = za({ gridContainer: e, getState: t }); @@ -21500,16 +21487,16 @@ function vb(e, t) { } catch {} n = null; } - cr(e, (e, t) => { + lr(e, (e, t) => { t && i(), e && r(e); - }, { immediate: !0 }), rr(i); + }, { immediate: !0 }), ir(i); } // ui/vue/composables/useGridKeyboard.ts function yb(e) { if (!e) return () => {}; let t = e; try { - let n = Li({ + let n = Ri({ gridContainer: e, getState: () => t._mjrGetGridState?.() || {}, getSelectedAssets: () => t._mjrGetSelectedAssets?.() || [], @@ -21527,7 +21514,7 @@ function yb(e) { } catch (e) { console.debug?.("[useGridKeyboard] rect lookup failed", e); } - La(Math.round((i?.left || 0) + Math.min((i?.width || 0) * .5, 160)), Math.round((i?.top || 0) + Math.min((i?.height || 0) * .5, 120)), n, () => { + Ra(Math.round((i?.left || 0) + Math.min((i?.width || 0) * .5, 160)), Math.round((i?.top || 0) + Math.min((i?.height || 0) * .5, 120)), n, () => { t._mjrOnKeyboardAssetChanged?.(n); }); } @@ -21553,9 +21540,9 @@ function bb(e) { } t = null; }; - cr(e, (e, r) => { + lr(e, (e, r) => { r && n(), e && (t = yb(e)); - }, { immediate: !0 }), rr(n); + }, { immediate: !0 }), ir(n); } // ui/vue/components/grid/assetsGridHostState.ts function xb() {} @@ -21719,7 +21706,7 @@ async function Ob({ initialLoadPromise: e, gridWrapper: t, gridContainer: n, pan if (s) { let e = () => { try { - typeof n?._mjrScrollToAssetId == "function" ? n._mjrScrollToAssetId(s) : Bl(n, s)?.scrollIntoView?.({ + typeof n?._mjrScrollToAssetId == "function" ? n._mjrScrollToAssetId(s) : Vl(n, s)?.scrollIntoView?.({ block: "nearest", behavior: "instant" }); @@ -21733,7 +21720,7 @@ async function Ob({ initialLoadPromise: e, gridWrapper: t, gridContainer: n, pan r.sidebarOpen && s && Cb(i); } // ui/vue/components/grid/AssetsGrid.vue -var kb = /* @__PURE__ */ dr({ +var kb = /* @__PURE__ */ fr({ __name: "AssetsGrid", setup(e, { expose: t }) { let n = Q(null), r = Q(null), i = Q(null), a = dh(), o = K(() => i.value?.gridContainer ?? null), s = null, c = null, l = null, u = null; @@ -21747,7 +21734,7 @@ var kb = /* @__PURE__ */ dr({ function f() { try { let e = o.value; - e && tr(e); + e && nr(e); } catch (e) { console.debug?.(e); } @@ -21830,7 +21817,7 @@ var kb = /* @__PURE__ */ dr({ } }; } - or("mjr-grid-container-ref", o), vb(o, () => a), bb(o); + sr("mjr-grid-container-ref", o), vb(o, () => a), bb(o); function m() { return o.value || null; } @@ -21848,7 +21835,7 @@ var kb = /* @__PURE__ */ dr({ }); } } - return jr(() => { + return Mr(() => { s = Eb(r.value, a), r.value && Number(a.scrollTop || 0) > 0 && (r.value.scrollTop = Number(a.scrollTop || 0)), p(); try { window.addEventListener("mjr:keepalive-attached", f), document.addEventListener("visibilitychange", d); @@ -21856,9 +21843,9 @@ var kb = /* @__PURE__ */ dr({ console.debug?.(e); } d(); - }), pr(() => { + }), mr(() => { try { - Zn(m()); + Qn(m()); } catch (e) { console.debug?.(e); } @@ -21891,14 +21878,14 @@ var kb = /* @__PURE__ */ dr({ } catch (e) { console.debug?.(e); } - }), cr(o, (e, t) => { + }), lr(o, (e, t) => { try { - t && t !== e && Zn(t); + t && t !== e && Qn(t); } catch (e) { console.debug?.(e); } try { - e && tr(e); + e && nr(e); } catch (e) { console.debug?.(e); } @@ -21997,7 +21984,7 @@ var kb = /* @__PURE__ */ dr({ overflow: "auto", position: "relative" } - }, [Y($u, { + }, [Y(ed, { ref_key: "gridHostRef", ref: i, "scroll-element": r.value @@ -22014,14 +22001,14 @@ var kb = /* @__PURE__ */ dr({ "flex-shrink": "0", background: "var(--mjr-surface-2,#2e2e2e)" } -}, jb = ["title"], Mb = /* @__PURE__ */ dr({ +}, jb = ["title"], Mb = /* @__PURE__ */ fr({ __name: "SidebarHeaderSection", props: { asset: {} }, emits: ["close"], setup(e, { emit: t }) { let n = t; return (t, r) => { - let i = ar("MButton"); + let i = or("MButton"); return q(), X("div", Ab, [U("div", { class: "mjr-sidebar-filename", title: e.asset.filename, @@ -22059,7 +22046,7 @@ var kb = /* @__PURE__ */ dr({ onMouseenter: r[1] ||= (e) => (e.currentTarget.style.background = "rgba(255,255,255,0.1)") && (e.currentTarget.style.borderColor = "rgba(255,255,255,0.2)"), onMouseleave: r[2] ||= (e) => (e.currentTarget.style.background = "none") && (e.currentTarget.style.borderColor = "transparent") }, { - default: W(() => [...r[3] ||= [nr("x", -1)]]), + default: W(() => [...r[3] ||= [rr("x", -1)]]), _: 1 })]); }; @@ -22101,7 +22088,7 @@ var Fb = { class: "mjr-sidebar-preview" }, Ib = ["src"], Lb = ["src"], Rb = ["sr "padding-bottom": "12px", "border-bottom": "1px solid var(--mjr-border, rgba(255, 255, 255, 0.12))" } -}, Vb = /* @__PURE__ */ dr({ +}, Vb = /* @__PURE__ */ fr({ __name: "SidebarPreviewSection", props: { asset: {}, @@ -22111,7 +22098,7 @@ var Fb = { class: "mjr-sidebar-preview" }, Ib = ["src"], Lb = ["src"], Rb = ["sr } }, setup(e) { - let t = e, n = Q(null), r = null, i = K(() => We(t.asset) || ""), a = K(() => { + let t = e, n = Q(null), r = null, i = K(() => Ge(t.asset) || ""), a = K(() => { let e = String(t.asset?.filename || ""), n = e.lastIndexOf("."); return n === -1 ? "" : e.slice(n + 1).toUpperCase(); }), o = K(() => { @@ -22144,7 +22131,7 @@ var Fb = { class: "mjr-sidebar-preview" }, Ib = ["src"], Lb = ["src"], Rb = ["sr if (e && i) { c(i); try { - r = zt(i, { + r = Bt(i, { variant: "preview", hostEl: e }); @@ -22153,15 +22140,15 @@ var Fb = { class: "mjr-sidebar-preview" }, Ib = ["src"], Lb = ["src"], Rb = ["sr } } } - return cr(() => [t.asset, t.showPreviewThumb], () => { + return lr(() => [t.asset, t.showPreviewThumb], () => { s(); - }, { flush: "post" }), cr(i, () => { + }, { flush: "post" }), lr(i, () => { setTimeout(() => { l(); }, 0); - }), jr(() => { + }), Mr(() => { l(); - }), pr(() => { + }), mr(() => { s(); }), (t, r) => (q(), X("div", Fb, [e.showPreviewThumb ? (q(), X("div", { key: 0, @@ -22233,7 +22220,7 @@ var Fb = { class: "mjr-sidebar-preview" }, Ib = ["src"], Lb = ["src"], Rb = ["sr "font-size": "12px", opacity: "0.68", "min-width": "92px" -} }, Kb = ["title"], qb = /* @__PURE__ */ dr({ +} }, Kb = ["title"], qb = /* @__PURE__ */ fr({ __name: "SidebarFolderSection", props: { asset: {} }, setup(e) { @@ -22276,17 +22263,17 @@ var Fb = { class: "mjr-sidebar-preview" }, Ib = ["src"], Lb = ["src"], Rb = ["sr ]; return u > 0 && f.push({ label: R("sidebar.folder.created", "Created"), - value: `${zn(u) || "-"} ${Mn(u) || ""}`.trim() + value: `${Bn(u) || "-"} ${Nn(u) || ""}`.trim() }), l > 0 && f.push({ label: R("sidebar.folder.modified", "Modified"), - value: `${zn(l) || "-"} ${Mn(l) || ""}`.trim() + value: `${Bn(l) || "-"} ${Nn(l) || ""}`.trim() }), d && f.push({ label: R("sidebar.folder.note", "Note"), value: R("sidebar.folder.scanTruncated", "Scan was truncated for performance"), valueStyle: "color:#FFB74D;font-weight:600;" }), f; }); - return (e, t) => (q(), X("div", Hb, [U("div", Ub, J(Z(R)("sidebar.folder.details", "Folder Details")), 1), U("div", Wb, [(q(!0), X(H, null, hr(r.value, (e) => (q(), X("div", { + return (e, t) => (q(), X("div", Hb, [U("div", Ub, J(Z(R)("sidebar.folder.details", "Folder Details")), 1), U("div", Wb, [(q(!0), X(H, null, gr(r.value, (e) => (q(), X("div", { key: e.label, style: { display: "flex", @@ -22295,7 +22282,7 @@ var Fb = { class: "mjr-sidebar-preview" }, Ib = ["src"], Lb = ["src"], Rb = ["sr "justify-content": "space-between" } }, [U("div", Gb, J(e.label), 1), U("div", { - style: xr(e.valueStyle || "font-size: 12px; text-align: right; word-break: break-word"), + style: Sr(e.valueStyle || "font-size: 12px; text-align: right; word-break: break-word"), title: String(e.value || "") }, J(e.value), 13, Kb)]))), 128))])])); } @@ -22305,7 +22292,7 @@ var Fb = { class: "mjr-sidebar-preview" }, Ib = ["src"], Lb = ["src"], Rb = ["sr "aria-label", "aria-valuenow", "tabindex" -], Yb = /* @__PURE__ */ dr({ +], Yb = /* @__PURE__ */ fr({ __name: "RatingEditor", props: { asset: {}, @@ -22357,7 +22344,7 @@ var Fb = { class: "mjr-sidebar-preview" }, Ib = ["src"], Lb = ["src"], Rb = ["sr } try { let e = l?.data?.asset_id ?? null; - e != null && !lt(i.asset.id) && (i.asset.id = e); + e != null && !ut(i.asset.id) && (i.asset.id = e); } catch (e) { console.debug?.(e); } @@ -22370,7 +22357,7 @@ var Fb = { class: "mjr-sidebar-preview" }, Ib = ["src"], Lb = ["src"], Rb = ["sr if (a("update:modelValue", o), a("rating-change", { assetId: i.asset?.id, rating: o - }), It(ot, { + }), Lt(st, { assetId: i.asset?.id == null ? "" : String(i.asset.id), rating: o }), d === o) { @@ -22425,21 +22412,21 @@ var Fb = { class: "mjr-sidebar-preview" }, Ib = ["src"], Lb = ["src"], Rb = ["sr } t !== null && t !== s.value && C(t); } - return pr(() => { + return mr(() => { try { f?.abort?.(); } catch (e) { console.debug?.(e); } - }), cr(() => i.modelValue, (e) => { + }), lr(() => i.modelValue, (e) => { b(e); - }), cr(() => i.asset?.rating, (e) => { + }), lr(() => i.asset?.rating, (e) => { b(e); }), (e, n) => { - let r = ar("MButton"); + let r = or("MButton"); return q(), X("div", { class: "mjr-rating-editor", - style: xr({ + style: Sr({ display: "inline-flex", gap: "2px", pointerEvents: t.disabled ? "none" : "auto", @@ -22454,14 +22441,14 @@ var Fb = { class: "mjr-sidebar-preview" }, Ib = ["src"], Lb = ["src"], Rb = ["sr "aria-valuenow": s.value, tabindex: t.disabled ? -1 : 0, onKeydown: D - }, [(q(), X(H, null, hr(5, (e) => Y(r, { + }, [(q(), X(H, null, gr(5, (e) => Y(r, { key: e, type: "button", class: "mjr-rating-star", severity: "secondary", text: "", rounded: "", - style: xr({ + style: Sr({ color: m(e), transform: h(e), fontSize: g.value, @@ -22478,7 +22465,7 @@ var Fb = { class: "mjr-sidebar-preview" }, Ib = ["src"], Lb = ["src"], Rb = ["sr onMouseenter: (t) => T(e), onMouseleave: E }, { - default: W(() => [...n[0] ||= [nr(" ★ ", -1)]]), + default: W(() => [...n[0] ||= [rr(" ★ ", -1)]]), _: 1 }, 8, [ "style", @@ -22502,16 +22489,16 @@ var Fb = { class: "mjr-sidebar-preview" }, Ib = ["src"], Lb = ["src"], Rb = ["sr }, nx = { class: "mjr-context-menu-item-left" }, rx = { key: 0, class: "mjr-context-menu-hint" -}, ix = /* @__PURE__ */ dr({ +}, ix = /* @__PURE__ */ fr({ __name: "AddToCollectionMenu", setup(t) { let n = Q(null), r = Q(!1), i = Q([]), a = Q(""), o = 0, s = null, c = K(() => ({ position: "fixed", - left: `${Math.round(Number(Gt.x) || 0)}px`, - top: `${Math.round(Number(Gt.y) || 0)}px`, + left: `${Math.round(Number(Kt.x) || 0)}px`, + top: `${Math.round(Number(Kt.y) || 0)}px`, display: "block", zIndex: "10004" - })), l = K(() => Gt.assets.length || 0), u = K(() => R("ctx.addToCollection", "Add to collection") + (l.value > 1 ? ` (${l.value})` : "")); + })), l = K(() => Kt.assets.length || 0), u = K(() => R("ctx.addToCollection", "Add to collection") + (l.value > 1 ? ` (${l.value})` : "")); function d({ collectionName: e, selectedCount: t, addRes: n }) { let r = Number(n?.data?.added ?? 0) || 0, i = Number(n?.data?.skipped_existing ?? 0) || 0, a = Number(n?.data?.skipped_duplicate ?? 0) || 0, o = String(e || "").trim() || R("label.collection", "collection"), s = R("msg.collectionAdd.added", "Added {added} item(s) to \"{name}\".", { added: r, @@ -22521,9 +22508,9 @@ var Fb = { class: "mjr-sidebar-preview" }, Ib = ["src"], Lb = ["src"], Rb = ["sr } function p() { let e = n.value; - if (!Gt.open || !e) return; - let t = e.getBoundingClientRect(), r = Number(window.innerWidth || 0), i = Number(window.innerHeight || 0), a = Number(Gt.x) || 0, o = Number(Gt.y) || 0; - a + t.width > r && (a = Math.max(8, r - t.width - 10)), o + t.height > i && (o = Math.max(8, i - t.height - 10)), a < 8 && (a = 8), o < 8 && (o = 8), Gt.x = a, Gt.y = o; + if (!Kt.open || !e) return; + let t = e.getBoundingClientRect(), r = Number(window.innerWidth || 0), i = Number(window.innerHeight || 0), a = Number(Kt.x) || 0, o = Number(Kt.y) || 0; + a + t.width > r && (a = Math.max(8, r - t.width - 10)), o + t.height > i && (o = Math.max(8, i - t.height - 10)), a < 8 && (a = 8), o < 8 && (o = 8), Kt.x = a, Kt.y = o; } async function m() { let e = ++o; @@ -22537,7 +22524,7 @@ var Fb = { class: "mjr-sidebar-preview" }, Ib = ["src"], Lb = ["src"], Rb = ["sr i.value = [], a.value = R("toast.failedLoadCollections", "Failed to load collections."); } finally { if (e === o) { - r.value = !1, await lr(), p(); + r.value = !1, await ur(), p(); try { n.value?.querySelector?.(".mjr-context-menu-item:not([aria-disabled=\"true\"])")?.focus?.(); } catch (e) { @@ -22547,8 +22534,8 @@ var Fb = { class: "mjr-sidebar-preview" }, Ib = ["src"], Lb = ["src"], Rb = ["sr } } async function h(t, n) { - let r = Array.isArray(Gt.assets) ? Gt.assets : []; - jt(); + let r = Array.isArray(Kt.assets) ? Kt.assets : []; + Mt(); let i = await f(t, r); i?.ok ? e(d({ collectionName: n, @@ -22557,9 +22544,9 @@ var Fb = { class: "mjr-sidebar-preview" }, Ib = ["src"], Lb = ["src"], Rb = ["sr }), "success", 4e3) : e(i?.error || R("toast.failedAddAssetsToCollection", "Failed to add assets to collection."), "error"); } async function g() { - let t = Array.isArray(Gt.assets) ? Gt.assets : []; - jt(); - let n = await wt(R("dialog.createCollection", "Create collection"), R("dialog.collectionPlaceholder", "My collection")); + let t = Array.isArray(Kt.assets) ? Kt.assets : []; + Mt(); + let n = await Tt(R("dialog.createCollection", "Create collection"), R("dialog.collectionPlaceholder", "My collection")); if (!n) return; let r = await S(n); if (!r?.ok) { @@ -22574,17 +22561,17 @@ var Fb = { class: "mjr-sidebar-preview" }, Ib = ["src"], Lb = ["src"], Rb = ["sr }), "success", 4e3) : e(a?.error || R("toast.failedAddAssetsToCollection", "Failed to add assets to collection."), "error"); } function _(e) { - n.value?.contains?.(e?.target) || jt(); + n.value?.contains?.(e?.target) || Mt(); } function v(e) { - e?.key === "Escape" && jt(); + e?.key === "Escape" && Mt(); } function y() { - jt(); + Mt(); } - return cr(() => Gt.open, async (e) => { + return lr(() => Kt.open, async (e) => { e && (i.value = [], await m()); - }), jr(() => { + }), Mr(() => { s = new AbortController(); let e = { capture: !0, @@ -22598,21 +22585,21 @@ var Fb = { class: "mjr-sidebar-preview" }, Ib = ["src"], Lb = ["src"], Rb = ["sr passive: !0, signal: s.signal }), window.addEventListener("mjr-close-all-menus", y, { signal: s.signal }); - }), rr(() => { + }), ir(() => { try { s?.abort(); } catch (e) { console.debug?.(e); } - s = null, jt(); + s = null, Mt(); }), (e, t) => { - let o = ar("MButton"); - return q(), ir(Or, { to: "body" }, [Z(Gt).open ? (q(), X("div", { + let o = or("MButton"); + return q(), ar(kr, { to: "body" }, [Z(Kt).open ? (q(), X("div", { key: 0, ref_key: "menuRef", ref: n, class: "mjr-add-to-collection-menu mjr-context-menu", - style: xr(c.value), + style: Sr(c.value), role: "menu", "aria-label": u.value }, [ @@ -22630,7 +22617,7 @@ var Fb = { class: "mjr-sidebar-preview" }, Ib = ["src"], Lb = ["src"], Rb = ["sr }), t[2] ||= U("div", { class: "mjr-context-menu-separator" }, null, -1), r.value ? (q(), X("div", $b, J(Z(R)("msg.loadingCollections", "Loading collections...")), 1)) : a.value ? (q(), X("div", ex, J(a.value), 1)) : i.value.length ? G("", !0) : (q(), X("div", tx, J(Z(R)("msg.noCollections", "No collections yet.")), 1)), - (q(!0), X(H, null, hr(i.value, (e) => (q(), ir(o, { + (q(!0), X(H, null, gr(i.value, (e) => (q(), ar(o, { key: String(e?.id || ""), type: "button", class: "mjr-context-menu-item", @@ -22660,10 +22647,10 @@ var Fb = { class: "mjr-sidebar-preview" }, Ib = ["src"], Lb = ["src"], Rb = ["sr }, dx = { class: "mjr-context-menu-item-left" }, fx = { key: 0, class: "mjr-context-menu-hint" -}, px = /* @__PURE__ */ dr({ +}, px = /* @__PURE__ */ fr({ __name: "GridContextMenu", setup(e) { - let t = Q(null), n = Q(null), r = Q(null), i = null, a = null, o = K(() => l(hn.main, 10031)), s = K(() => l(hn.submenu, 10032)), c = K(() => l(hn.tags, 10033)); + let t = Q(null), n = Q(null), r = Q(null), i = null, a = null, o = K(() => l(gn.main, 10031)), s = K(() => l(gn.submenu, 10032)), c = K(() => l(gn.tags, 10033)); function l(e, t) { return { position: "fixed", @@ -22678,7 +22665,7 @@ var Fb = { class: "mjr-sidebar-preview" }, Ib = ["src"], Lb = ["src"], Rb = ["sr } function d() { u(), i = setTimeout(() => { - nn(); + rn(); }, 180); } function f(e, t) { @@ -22687,7 +22674,7 @@ var Fb = { class: "mjr-sidebar-preview" }, Ib = ["src"], Lb = ["src"], Rb = ["sr a + n.width > r && (a = Math.max(8, r - n.width - 10)), o + n.height > i && (o = Math.max(8, i - n.height - 10)), a < 8 && (a = 8), o < 8 && (o = 8), e.x = a, e.y = o; } async function p(e, t) { - await lr(), f(e, t?.value || null); + await ur(), f(e, t?.value || null); } function m(e) { try { @@ -22698,14 +22685,14 @@ var Fb = { class: "mjr-sidebar-preview" }, Ib = ["src"], Lb = ["src"], Rb = ["sr } function h(e, t) { if (!Array.isArray(e?.submenu) || !e.submenu.length) { - nn(); + rn(); return; } u(); let n = (t?.currentTarget)?.getBoundingClientRect?.(); - on({ - x: Math.round((n?.right || hn.main.x || 0) + 6), - y: Math.round((n?.top || hn.main.y || 0) - 4), + sn({ + x: Math.round((n?.right || gn.main.x || 0) + 6), + y: Math.round((n?.top || gn.main.y || 0) - 4), items: e.submenu, title: e.label || "" }); @@ -22718,12 +22705,12 @@ var Fb = { class: "mjr-sidebar-preview" }, Ib = ["src"], Lb = ["src"], Rb = ["sr } catch (e) { console.error("[GridContextMenu.vue] Action failed:", e); } finally { - e.closeOnSelect === !1 ? n === "submenu" && nn() : gn(); + e.closeOnSelect === !1 ? n === "submenu" && rn() : _n(); } } } function _(e, t) { - Array.isArray(e?.submenu) && e.submenu.length ? h(e, t) : nn(); + Array.isArray(e?.submenu) && e.submenu.length ? h(e, t) : rn(); } function v(e) { Array.isArray(e?.submenu) && e.submenu.length && d(); @@ -22736,37 +22723,37 @@ var Fb = { class: "mjr-sidebar-preview" }, Ib = ["src"], Lb = ["src"], Rb = ["sr } function x(e) { let i = e?.target; - t.value?.contains?.(i) || n.value?.contains?.(i) || r.value?.contains?.(i) || gn(); + t.value?.contains?.(i) || n.value?.contains?.(i) || r.value?.contains?.(i) || _n(); } function S(e) { - e?.key === "Escape" && gn(); + e?.key === "Escape" && _n(); } function C() { - gn(); + _n(); } function w(e) { let t = e?.detail; - String(t?.source || "") !== "grid" && gn(); + String(t?.source || "") !== "grid" && _n(); } function T(e) { - let t = hn.tags.asset; + let t = gn.tags.asset; t && (t.tags = Array.isArray(e) ? [...e] : []); } function E(e) { let t = Array.isArray(e?.tags) ? e.tags : []; try { - hn.tags.onChanged?.(t); + gn.tags.onChanged?.(t); } catch (e) { console.debug?.(e); } } - return cr(() => hn.main.open, async (e) => { - e && (await p(hn.main, t), m(t)); - }), cr(() => hn.submenu.open, async (e) => { - e && (await p(hn.submenu, n), m(n)); - }), cr(() => hn.tags.open, async (e) => { - e && await p(hn.tags, r); - }), jr(() => { + return lr(() => gn.main.open, async (e) => { + e && (await p(gn.main, t), m(t)); + }), lr(() => gn.submenu.open, async (e) => { + e && (await p(gn.submenu, n), m(n)); + }), lr(() => gn.tags.open, async (e) => { + e && await p(gn.tags, r); + }), Mr(() => { a = new AbortController(); let e = { capture: !0, @@ -22780,29 +22767,29 @@ var Fb = { class: "mjr-sidebar-preview" }, Ib = ["src"], Lb = ["src"], Rb = ["sr passive: !0, signal: a.signal }), window.addEventListener("mjr-close-all-menus", w, { signal: a.signal }); - }), rr(() => { + }), ir(() => { u(); try { a?.abort(); } catch (e) { console.debug?.(e); } - a = null, gn(); + a = null, _n(); }), (e, i) => { - let a = ar("MButton"); - return q(), ir(Or, { to: "body" }, [ - Z(hn).main.open ? (q(), X("div", { + let a = or("MButton"); + return q(), ar(kr, { to: "body" }, [ + Z(gn).main.open ? (q(), X("div", { key: 0, ref_key: "mainMenuRef", ref: t, class: "mjr-grid-context-menu mjr-context-menu", - style: xr(o.value), + style: Sr(o.value), role: "menu", "aria-label": "Grid context menu" - }, [(q(!0), X(H, null, hr(Z(hn).main.items, (e) => (q(), X(H, { key: e.id }, [e.type === "separator" ? (q(), X("div", ax)) : (q(), ir(a, { + }, [(q(!0), X(H, null, gr(Z(gn).main.items, (e) => (q(), X(H, { key: e.id }, [e.type === "separator" ? (q(), X("div", ax)) : (q(), ar(a, { key: 1, type: "button", - class: Er(["mjr-context-menu-item", { + class: Dr(["mjr-context-menu-item", { "is-disabled": e.disabled, "has-submenu": Array.isArray(e.submenu) && e.submenu.length, "is-tone-graph-map": e.tone === "graph-map", @@ -22821,7 +22808,7 @@ var Fb = { class: "mjr-sidebar-preview" }, Ib = ["src"], Lb = ["src"], Rb = ["sr }, { default: W(() => [U("span", ox, [e.iconClass ? (q(), X("i", { key: 0, - class: Er(e.iconClass) + class: Dr(e.iconClass) }, null, 2)) : G("", !0), U("span", null, J(e.label), 1)]), U("span", sx, [e.rightHint ? (q(), X("span", cx, J(e.rightHint), 1)) : G("", !0), Array.isArray(e.submenu) && e.submenu.length ? (q(), X("span", lx, " > ")) : G("", !0)])]), _: 2 }, 1032, [ @@ -22832,20 +22819,20 @@ var Fb = { class: "mjr-sidebar-preview" }, Ib = ["src"], Lb = ["src"], Rb = ["sr "onMouseenter", "onMouseleave" ]))], 64))), 128))], 4)) : G("", !0), - Z(hn).submenu.open ? (q(), X("div", { + Z(gn).submenu.open ? (q(), X("div", { key: 1, ref_key: "submenuRef", ref: n, class: "mjr-grid-rating-submenu mjr-context-menu", - style: xr(s.value), + style: Sr(s.value), role: "menu", "aria-label": "Grid context submenu", onMouseenter: y, onMouseleave: b - }, [(q(!0), X(H, null, hr(Z(hn).submenu.items, (e) => (q(), X(H, { key: e.id }, [e.type === "separator" ? (q(), X("div", ux)) : (q(), ir(a, { + }, [(q(!0), X(H, null, gr(Z(gn).submenu.items, (e) => (q(), X(H, { key: e.id }, [e.type === "separator" ? (q(), X("div", ux)) : (q(), ar(a, { key: 1, type: "button", - class: Er(["mjr-context-menu-item", { + class: Dr(["mjr-context-menu-item", { "is-disabled": e.disabled, "is-tone-graph-map": e.tone === "graph-map", "is-tone-rename": e.tone === "rename", @@ -22861,7 +22848,7 @@ var Fb = { class: "mjr-sidebar-preview" }, Ib = ["src"], Lb = ["src"], Rb = ["sr }, { default: W(() => [U("span", dx, [e.iconClass ? (q(), X("i", { key: 0, - class: Er(e.iconClass) + class: Dr(e.iconClass) }, null, 2)) : G("", !0), U("span", null, J(e.label), 1)]), e.rightHint ? (q(), X("span", fx, J(e.rightHint), 1)) : G("", !0)]), _: 2 }, 1032, [ @@ -22870,38 +22857,38 @@ var Fb = { class: "mjr-sidebar-preview" }, Ib = ["src"], Lb = ["src"], Rb = ["sr "tabindex", "onClick" ]))], 64))), 128))], 36)) : G("", !0), - Z(hn).tags.open && Z(hn).tags.asset ? (q(), X("div", { + Z(gn).tags.open && Z(gn).tags.asset ? (q(), X("div", { key: 2, ref_key: "tagsPopoverRef", ref: r, class: "mjr-grid-popover", - style: xr(c.value) - }, [Y(Pr, { - asset: Z(hn).tags.asset, - "model-value": Z(hn).tags.asset?.tags || [], + style: Sr(c.value) + }, [Y(Fr, { + asset: Z(gn).tags.asset, + "model-value": Z(gn).tags.asset?.tags || [], "onUpdate:modelValue": T, onTagsChange: E }, null, 8, ["asset", "model-value"])], 4)) : G("", !0) ]); }; } -}), mx = { class: "mjr-workflow-picker-dialog mjr-workflow-info-dialog" }, hx = { class: "mjr-workflow-picker-header" }, gx = { class: "mjr-workflow-picker-title" }, _x = { class: "mjr-workflow-picker-subtitle" }, vx = { class: "mjr-workflow-info-form" }, yx = { class: "is-wide" }, bx = { class: "mjr-workflow-picker-footer" }, xx = /* @__PURE__ */ dr({ +}), mx = { class: "mjr-workflow-picker-dialog mjr-workflow-info-dialog" }, hx = { class: "mjr-workflow-picker-header" }, gx = { class: "mjr-workflow-picker-title" }, _x = { class: "mjr-workflow-picker-subtitle" }, vx = { class: "mjr-workflow-info-form" }, yx = { class: "is-wide" }, bx = { class: "mjr-workflow-picker-footer" }, xx = /* @__PURE__ */ fr({ __name: "WorkflowInfoDialog", setup(t) { - let n = Cr({ + let n = wr({ task: "", model_family: "", provider: "", runs_on: "", notes: "" - }), r = K(() => zi.workflow || null), i = K(() => String(r.value?.display_name || r.value?.filename || "Workflow")); - cr(() => zi.open, (e) => { + }), r = K(() => Bi.workflow || null), i = K(() => String(r.value?.display_name || r.value?.filename || "Workflow")); + lr(() => Bi.open, (e) => { if (!e) return; let t = r.value || {}; n.task = String(t.user_task || t.task || ""), n.model_family = String(t.user_model_family || t.model_family || ""), n.provider = String(t.user_provider || t.provider || ""), n.runs_on = String(t.user_runs_on || t.runs_on || ""), n.notes = String(t.notes || ""); }); function a() { - Vi(); + Hi(); } async function o() { let t = String(r.value?.filepath || "").trim(); @@ -22915,10 +22902,10 @@ var Fb = { class: "mjr-sidebar-preview" }, Ib = ["src"], Lb = ["src"], Rb = ["sr }, { timeoutMs: 2e4 }); i?.ok ? (e(R("toast.workflowUpdated", "Workflow updated"), "success", 1800), window?.dispatchEvent?.(new CustomEvent("mjr:reload-grid", { detail: { reason: "workflow-info" } })), a()) : e(i?.error || R("toast.workflowSaveFailed", "Failed to save workflow."), "error"); } - return (e, t) => (q(), ir(Or, { to: "body" }, [Z(zi).open ? (q(), X("div", { + return (e, t) => (q(), ar(kr, { to: "body" }, [Z(Bi).open ? (q(), X("div", { key: 0, class: "mjr-workflow-picker-backdrop", - onClick: mr(a, ["self"]) + onClick: hr(a, ["self"]) }, [U("section", mx, [ U("header", hx, [U("div", null, [U("div", gx, J(Z(R)("ctx.editWorkflowInfo", "Edit infos")), 1), U("div", _x, J(i.value), 1)]), U("button", { type: "button", @@ -22926,32 +22913,32 @@ var Fb = { class: "mjr-sidebar-preview" }, Ib = ["src"], Lb = ["src"], Rb = ["sr onClick: a }, [...t[5] ||= [U("i", { class: "pi pi-times" }, null, -1)]])]), U("div", vx, [ - U("label", null, [t[6] ||= U("span", null, "Task", -1), _r(U("input", { + U("label", null, [t[6] ||= U("span", null, "Task", -1), vr(U("input", { "onUpdate:modelValue": t[0] ||= (e) => n.task = e, type: "text", placeholder: "I2V, I2I, T2V, Image Edit..." - }, null, 512), [[Ar, n.task]])]), - U("label", null, [t[7] ||= U("span", null, "Model family", -1), _r(U("input", { + }, null, 512), [[jr, n.task]])]), + U("label", null, [t[7] ||= U("span", null, "Model family", -1), vr(U("input", { "onUpdate:modelValue": t[1] ||= (e) => n.model_family = e, type: "text", placeholder: "Flux, Qwen, Wan..." - }, null, 512), [[Ar, n.model_family]])]), - U("label", null, [t[8] ||= U("span", null, "Provider", -1), _r(U("input", { + }, null, 512), [[jr, n.model_family]])]), + U("label", null, [t[8] ||= U("span", null, "Provider", -1), vr(U("input", { "onUpdate:modelValue": t[2] ||= (e) => n.provider = e, type: "text", placeholder: "Google, ByteDance, local..." - }, null, 512), [[Ar, n.provider]])]), - U("label", null, [t[10] ||= U("span", null, "Runs on", -1), _r(U("select", { "onUpdate:modelValue": t[3] ||= (e) => n.runs_on = e }, [...t[9] ||= [ + }, null, 512), [[jr, n.provider]])]), + U("label", null, [t[10] ||= U("span", null, "Runs on", -1), vr(U("select", { "onUpdate:modelValue": t[3] ||= (e) => n.runs_on = e }, [...t[9] ||= [ U("option", { value: "" }, "Auto", -1), U("option", { value: "local" }, "local", -1), U("option", { value: "api" }, "api", -1), U("option", { value: "cloud" }, "cloud", -1) - ]], 512), [[Dr, n.runs_on]])]), - U("label", yx, [t[11] ||= U("span", null, "Notes", -1), _r(U("textarea", { + ]], 512), [[Or, n.runs_on]])]), + U("label", yx, [t[11] ||= U("span", null, "Notes", -1), vr(U("textarea", { "onUpdate:modelValue": t[4] ||= (e) => n.notes = e, rows: "5", placeholder: "Notes displayed on workflow hover" - }, null, 512), [[Ar, n.notes]])]) + }, null, 512), [[jr, n.notes]])]) ]), U("footer", bx, [U("button", { type: "button", @@ -22979,10 +22966,10 @@ var Fb = { class: "mjr-sidebar-preview" }, Ib = ["src"], Lb = ["src"], Rb = ["sr }, Rx = ["onClick"], zx = { class: "mjr-workflow-picker-thumb" }, Bx = ["src", "alt"], Vx = { key: 1, class: "pi pi-sitemap" -}, Hx = { class: "mjr-workflow-picker-card-info" }, Ux = ["disabled"], Wx = { class: "mjr-workflow-picker-card-info" }, Gx = { class: "mjr-workflow-picker-footer" }, Kx = ["disabled"], qx = 120, Jx = /* @__PURE__ */ dr({ +}, Hx = { class: "mjr-workflow-picker-card-info" }, Ux = ["disabled"], Wx = { class: "mjr-workflow-picker-card-info" }, Gx = { class: "mjr-workflow-picker-footer" }, Kx = ["disabled"], qx = 120, Jx = /* @__PURE__ */ fr({ __name: "WorkflowPickerDialog", setup(e) { - let t = Q(""), n = Q(!1), r = Q(!1), i = Q(""), a = Q([]), s = Q(""), c = Q(0), l = Q(!1), u = 0, d = K(() => xn.sourceAsset || null), f = K(() => xn.workflow || null), p = K(() => String(xn.mode || "") === "asset"), m = K(() => String(d.value?.filename || d.value?.display_name || f.value?.display_name || f.value?.filename || d.value?.filepath || f.value?.filepath || "")), h = K(() => x("task")), g = K(() => x("model_family")), _ = K(() => x("runs_on")), v = Q(""), y = Q(""), b = Q(""); + let t = Q(""), n = Q(!1), r = Q(!1), i = Q(""), a = Q([]), s = Q(""), c = Q(0), l = Q(!1), u = 0, d = K(() => Sn.sourceAsset || null), f = K(() => Sn.workflow || null), p = K(() => String(Sn.mode || "") === "asset"), m = K(() => String(d.value?.filename || d.value?.display_name || f.value?.display_name || f.value?.filename || d.value?.filepath || f.value?.filepath || "")), h = K(() => x("task")), g = K(() => x("model_family")), _ = K(() => x("runs_on")), v = Q(""), y = Q(""), b = Q(""); function x(e) { let t = /* @__PURE__ */ new Set(); for (let n of a.value || []) { @@ -23026,7 +23013,7 @@ var Fb = { class: "mjr-sidebar-preview" }, Ib = ["src"], Lb = ["src"], Rb = ["sr e ? n.value = !0 : r.value = !0, i.value = ""; try { if (p.value) { - a.value = Array.isArray(xn.items) ? xn.items.filter((e) => String(e?.filepath || "").trim()) : [], !s.value && a.value[0]?.filepath && (s.value = String(a.value[0].filepath)); + a.value = Array.isArray(Sn.items) ? Sn.items.filter((e) => String(e?.filepath || "").trim()) : [], !s.value && a.value[0]?.filepath && (s.value = String(a.value[0].filepath)); return; } let n = await o({ @@ -23055,15 +23042,15 @@ var Fb = { class: "mjr-sidebar-preview" }, Ib = ["src"], Lb = ["src"], Rb = ["sr if (!(n.value || r.value || !l.value)) return D({ reset: !1 }); } function A() { - C.value && Nn(C.value); + C.value && Pn(C.value); } function j() { - Nn(null); + Pn(null); } function M(e) { e.key === "Escape" && (e.preventDefault(), j()); } - return cr(() => xn.open, (e) => { + return lr(() => Sn.open, (e) => { if (e) { s.value = "", c.value = 0, l.value = !1, t.value = "", v.value = "", y.value = "", b.value = "", O(); try { @@ -23072,57 +23059,57 @@ var Fb = { class: "mjr-sidebar-preview" }, Ib = ["src"], Lb = ["src"], Rb = ["sr } else try { window.removeEventListener("keydown", M); } catch {} - }), pr(() => { + }), mr(() => { try { window.removeEventListener("keydown", M); } catch {} - }), (e, a) => (q(), ir(Or, { to: "body" }, [Z(xn).open ? (q(), X("div", { + }), (e, a) => (q(), ar(kr, { to: "body" }, [Z(Sn).open ? (q(), X("div", { key: 0, class: "mjr-workflow-picker-backdrop", - onMousedown: mr(j, ["self"]) + onMousedown: hr(j, ["self"]) }, [U("section", { - class: Er(["mjr-workflow-picker-dialog", { "is-asset-mode": p.value }]), + class: Dr(["mjr-workflow-picker-dialog", { "is-asset-mode": p.value }]), role: "dialog", "aria-modal": "true" }, [ - U("header", Sx, [U("div", Cx, [a[4] ||= U("i", { class: "pi pi-sitemap" }, null, -1), U("span", null, J(Z(xn).title), 1)]), U("button", { + U("header", Sx, [U("div", Cx, [a[4] ||= U("i", { class: "pi pi-sitemap" }, null, -1), U("span", null, J(Z(Sn).title), 1)]), U("button", { class: "mjr-workflow-picker-icon-btn", type: "button", onClick: j }, [...a[5] ||= [U("i", { class: "pi pi-times" }, null, -1)]])]), m.value ? (q(), X("div", wx, [U("span", null, J(p.value ? Z(R)("tab.workflow", "Workflow") : Z(R)("dialog.workflowThumbnailSource", "Source")), 1), U("strong", null, J(m.value), 1)])) : G("", !0), U("div", Tx, [ - U("label", Ex, [a[6] ||= U("i", { class: "pi pi-search" }, null, -1), _r(U("input", { + U("label", Ex, [a[6] ||= U("i", { class: "pi pi-search" }, null, -1), vr(U("input", { "onUpdate:modelValue": a[0] ||= (e) => t.value = e, type: "search", placeholder: Z(R)("search.workflows", "Search workflows...") - }, null, 8, Dx), [[Ar, t.value]])]), - p.value ? G("", !0) : _r((q(), X("select", { + }, null, 8, Dx), [[jr, t.value]])]), + p.value ? G("", !0) : vr((q(), X("select", { key: 0, "onUpdate:modelValue": a[1] ||= (e) => v.value = e - }, [U("option", Ox, J(Z(R)("filter.task", "Task")), 1), (q(!0), X(H, null, hr(h.value, (e) => (q(), X("option", { + }, [U("option", Ox, J(Z(R)("filter.task", "Task")), 1), (q(!0), X(H, null, gr(h.value, (e) => (q(), X("option", { key: e, value: e - }, J(e), 9, kx))), 128))], 512)), [[Dr, v.value]]), - p.value ? G("", !0) : _r((q(), X("select", { + }, J(e), 9, kx))), 128))], 512)), [[Or, v.value]]), + p.value ? G("", !0) : vr((q(), X("select", { key: 1, "onUpdate:modelValue": a[2] ||= (e) => y.value = e - }, [U("option", Ax, J(Z(R)("filter.model", "Model")), 1), (q(!0), X(H, null, hr(g.value, (e) => (q(), X("option", { + }, [U("option", Ax, J(Z(R)("filter.model", "Model")), 1), (q(!0), X(H, null, gr(g.value, (e) => (q(), X("option", { key: e, value: e - }, J(e), 9, jx))), 128))], 512)), [[Dr, y.value]]), - p.value ? G("", !0) : _r((q(), X("select", { + }, J(e), 9, jx))), 128))], 512)), [[Or, y.value]]), + p.value ? G("", !0) : vr((q(), X("select", { key: 2, "onUpdate:modelValue": a[3] ||= (e) => b.value = e - }, [U("option", Mx, J(Z(R)("filter.runsOn", "Runs on")), 1), (q(!0), X(H, null, hr(_.value, (e) => (q(), X("option", { + }, [U("option", Mx, J(Z(R)("filter.runsOn", "Runs on")), 1), (q(!0), X(H, null, gr(_.value, (e) => (q(), X("option", { key: e, value: e - }, J(e), 9, Nx))), 128))], 512)), [[Dr, b.value]]) + }, J(e), 9, Nx))), 128))], 512)), [[Or, b.value]]) ]), - U("div", Px, [n.value ? (q(), X("div", Fx, J(Z(R)("status.loading", "Loading...")), 1)) : i.value ? (q(), X("div", Ix, J(i.value), 1)) : S.value.length ? (q(), X(H, { key: 3 }, [(q(!0), X(H, null, hr(S.value, (e) => (q(), X("button", { + U("div", Px, [n.value ? (q(), X("div", Fx, J(Z(R)("status.loading", "Loading...")), 1)) : i.value ? (q(), X("div", Ix, J(i.value), 1)) : S.value.length ? (q(), X(H, { key: 3 }, [(q(!0), X(H, null, gr(S.value, (e) => (q(), X("button", { key: e.filepath, type: "button", - class: Er(["mjr-workflow-picker-card", { "is-selected": s.value === String(e.filepath || "") }]), + class: Dr(["mjr-workflow-picker-card", { "is-selected": s.value === String(e.filepath || "") }]), onClick: (t) => s.value = String(e.filepath || ""), onDblclick: A }, [U("div", zx, [E(e) ? (q(), X("img", { @@ -23157,10 +23144,10 @@ var Fb = { class: "mjr-sidebar-preview" }, Ib = ["src"], Lb = ["src"], Rb = ["sr }, J(Z(R)("action.apply", "Apply")), 9, Kx)]) ], 2)], 32)) : G("", !0)])); } -}), Yx = { class: "mjr-workflow-picker-dialog mjr-workflow-info-dialog" }, Xx = { class: "mjr-workflow-picker-header" }, Zx = { class: "mjr-workflow-picker-title" }, Qx = { class: "mjr-workflow-picker-subtitle" }, $x = { class: "mjr-workflow-info-form" }, eS = { class: "is-wide" }, tS = { class: "is-wide" }, nS = { class: "mjr-workflow-picker-footer" }, rS = /* @__PURE__ */ dr({ +}), Yx = { class: "mjr-workflow-picker-dialog mjr-workflow-info-dialog" }, Xx = { class: "mjr-workflow-picker-header" }, Zx = { class: "mjr-workflow-picker-title" }, Qx = { class: "mjr-workflow-picker-subtitle" }, $x = { class: "mjr-workflow-info-form" }, eS = { class: "is-wide" }, tS = { class: "is-wide" }, nS = { class: "mjr-workflow-picker-footer" }, rS = /* @__PURE__ */ fr({ __name: "WorkflowSaveInfoDialog", setup(e) { - let t = Cr({ + let t = wr({ name: "", task: "", model_family: "", @@ -23168,7 +23155,7 @@ var Fb = { class: "mjr-sidebar-preview" }, Ib = ["src"], Lb = ["src"], Rb = ["sr runs_on: "", notes: "" }), n = K(() => x_.initial || {}), r = K(() => R("dialog.saveWorkflowWithInfo", "Save workflow")), i = K(() => R("dialog.workflowInfoAutoFallback", "Leave fields empty to use automatic workflow detection.")); - cr(() => x_.open, (e) => { + lr(() => x_.open, (e) => { if (!e) return; let r = n.value || {}; t.name = String(r.name || r.workflow?.name || r.workflow?.title || "workflow").trim(), t.task = String(r.task || ""), t.model_family = String(r.model_family || ""), t.provider = String(r.provider || ""), t.runs_on = String(r.runs_on || ""), t.notes = String(r.notes || ""); @@ -23188,11 +23175,11 @@ var Fb = { class: "mjr-sidebar-preview" }, Ib = ["src"], Lb = ["src"], Rb = ["sr }); } return (e, n) => { - let s = ar("MButton"), c = ar("MInputText"), l = ar("MSelect"), u = ar("MTextarea"); - return q(), ir(Or, { to: "body" }, [Z(x_).open ? (q(), X("div", { + let s = or("MButton"), c = or("MInputText"), l = or("MSelect"), u = or("MTextarea"); + return q(), ar(kr, { to: "body" }, [Z(x_).open ? (q(), X("div", { key: 0, class: "mjr-workflow-picker-backdrop", - onClick: mr(a, ["self"]) + onClick: hr(a, ["self"]) }, [U("section", Yx, [ U("header", Xx, [U("div", null, [U("div", Zx, J(r.value), 1), U("div", Qx, J(i.value), 1)]), Y(s, { type: "button", @@ -23208,7 +23195,7 @@ var Fb = { class: "mjr-sidebar-preview" }, Ib = ["src"], Lb = ["src"], Rb = ["sr "onUpdate:modelValue": n[0] ||= (e) => t.name = e, type: "text", placeholder: "workflow", - onKeydown: kr(mr(o, ["prevent"]), ["enter"]) + onKeydown: Ar(hr(o, ["prevent"]), ["enter"]) }, null, 8, ["modelValue", "onKeydown"])]), U("label", null, [n[7] ||= U("span", null, "Task", -1), Y(c, { modelValue: t.task, @@ -23265,7 +23252,7 @@ var Fb = { class: "mjr-sidebar-preview" }, Ib = ["src"], Lb = ["src"], Rb = ["sr class: "mjr-workflow-picker-secondary", onClick: a }, { - default: W(() => [nr(J(Z(R)("btn.cancel", "Cancel")), 1)]), + default: W(() => [rr(J(Z(R)("btn.cancel", "Cancel")), 1)]), _: 1 }), Y(s, { type: "button", @@ -23273,20 +23260,20 @@ var Fb = { class: "mjr-sidebar-preview" }, Ib = ["src"], Lb = ["src"], Rb = ["sr disabled: !String(t.name || "").trim(), onClick: o }, { - default: W(() => [nr(J(Z(R)("btn.save", "Save")), 1)]), + default: W(() => [rr(J(Z(R)("btn.save", "Save")), 1)]), _: 1 }, 8, ["disabled"])]) ])])) : G("", !0)]); }; } -}), iS = /* @__PURE__ */ dr({ +}), iS = /* @__PURE__ */ fr({ __name: "ContextMenuPortal", setup(e) { - let t = Q(""), n = K(() => _n(t.value)); - return jr(() => { - t.value = Xt(); - }), rr(() => { - an(t.value), t.value = ""; + let t = Q(""), n = K(() => vn(t.value)); + return Mr(() => { + t.value = Zt(); + }), ir(() => { + on(t.value), t.value = ""; }), (e, t) => n.value ? (q(), X(H, { key: 0 }, [ Y(px), Y(ix), @@ -23327,7 +23314,7 @@ var Fb = { class: "mjr-sidebar-preview" }, Ib = ["src"], Lb = ["src"], Rb = ["sr } }, uS = { style: { "font-size": "0.8em", opacity: "0.6" -} }, dS = /* @__PURE__ */ dr({ +} }, dS = /* @__PURE__ */ fr({ __name: "AssetSidebarContent", props: { asset: {}, @@ -23341,7 +23328,7 @@ var Fb = { class: "mjr-sidebar-preview" }, Ib = ["src"], Lb = ["src"], Rb = ["sr return e === "workflow" || t === "workflow" || n.endsWith(".json"); }), c = K(() => Number(i.asset?.rating) || 0), l = K(() => i.asset?.tags || []), u = K(() => { try { - return !!(Vn()?.sidebar?.showPreviewThumb ?? !0); + return !!(Hn()?.sidebar?.showPreviewThumb ?? !0); } catch { return !0; } @@ -23378,13 +23365,13 @@ var Fb = { class: "mjr-sidebar-preview" }, Ib = ["src"], Lb = ["src"], Rb = ["sr } } return (e, n) => { - let r = ar("MButton"); + let r = or("MButton"); return q(), X(H, null, [ Y(Mb, { asset: t.asset, onClose: d }, null, 8, ["asset"]), - U("div", aS, [o.value ? (q(), ir(qb, { + U("div", aS, [o.value ? (q(), ar(qb, { key: 0, asset: t.asset }, null, 8, ["asset"])) : (q(), X(H, { key: 1 }, [s.value ? G("", !0) : (q(), X(H, { key: 0 }, [ @@ -23396,12 +23383,12 @@ var Fb = { class: "mjr-sidebar-preview" }, Ib = ["src"], Lb = ["src"], Rb = ["sr asset: t.asset, "model-value": c.value, size: 60 - }, null, 8, ["asset", "model-value"])]), U("div", lS, [U("span", uS, J(Z(R)("sidebar.tags", "Tags")), 1), Y(Pr, { + }, null, 8, ["asset", "model-value"])]), U("div", lS, [U("span", uS, J(Z(R)("sidebar.tags", "Tags")), 1), Y(Fr, { asset: t.asset, "model-value": l.value }, null, 8, ["asset", "model-value"])])]), - Y(kn, { asset: t.asset }, null, 8, ["asset"]), - p.value ? (q(), ir(r, { + Y(An, { asset: t.asset }, null, 8, ["asset"]), + p.value ? (q(), ar(r, { key: 0, type: "button", class: "mjr-btn mjr-sidebar-collect-btn", @@ -23417,11 +23404,11 @@ var Fb = { class: "mjr-sidebar-preview" }, Ib = ["src"], Lb = ["src"], Rb = ["sr }, onClick: m }, { - default: W(() => [U("i", { class: Er(f.value ? "pi pi-spin pi-spinner" : "pi pi-box") }, null, 2), U("span", null, J(f.value ? Z(R)("sidebar.collectingFiles", "Collecting...") : Z(R)("sidebar.collectFiles", "Collect files")), 1)]), + default: W(() => [U("i", { class: Dr(f.value ? "pi pi-spin pi-spinner" : "pi pi-box") }, null, 2), U("span", null, J(f.value ? Z(R)("sidebar.collectingFiles", "Collecting...") : Z(R)("sidebar.collectFiles", "Collect files")), 1)]), _: 1 }, 8, ["disabled", "title"])) : G("", !0), - Y(Pn, { asset: t.asset }, null, 8, ["asset"]) - ], 64)), Y(Bn, { asset: t.asset }, null, 8, ["asset"])], 64))]), + Y(Fn, { asset: t.asset }, null, 8, ["asset"]) + ], 64)), Y(Vn, { asset: t.asset }, null, 8, ["asset"])], 64))]), Y(iS) ], 64); }; @@ -23439,11 +23426,11 @@ var Fb = { class: "mjr-sidebar-preview" }, Ib = ["src"], Lb = ["src"], Rb = ["sr "font-size": "0.85em", "text-align": "center" } -}, pS = /* @__PURE__ */ dr({ +}, pS = /* @__PURE__ */ fr({ __name: "SidebarSection", setup(e, { expose: t }) { let n = Q(null), { activeAsset: r, onUpdateCallback: i } = Hm(); - return jr(() => { + return Mr(() => { let e = n.value; if (!e) return; e.style.flex = "0 0 0px", e.style.width = "0", e.style.maxWidth = "0", e.style.minWidth = "0", e.style.overflow = "hidden", e.style.borderLeft = "none", e.style.borderRight = "none", e._requestSeq = 0, e._currentAsset = null, e._currentFullAsset = null, e._ratingTagsSection = null; @@ -23485,16 +23472,16 @@ var Fb = { class: "mjr-sidebar-preview" }, Ib = ["src"], Lb = ["src"], Rb = ["sr }, e._dispose = e.dispose; let l = c ? { signal: c.signal } : void 0; try { - window.addEventListener(ot, a, l), window.addEventListener(et, o, l); + window.addEventListener(st, a, l), window.addEventListener(z, o, l); } catch (e) { console.debug?.(e); try { - window.addEventListener(ot, a), window.addEventListener(et, o), s.push(() => window.removeEventListener(ot, a)), s.push(() => window.removeEventListener(et, o)); + window.addEventListener(st, a), window.addEventListener(z, o), s.push(() => window.removeEventListener(st, a)), s.push(() => window.removeEventListener(z, o)); } catch (e) { console.debug?.(e); } } - }), rr(() => { + }), ir(() => { try { n.value?.dispose?.(); } catch {} @@ -23515,7 +23502,7 @@ var Fb = { class: "mjr-sidebar-preview" }, Ib = ["src"], Lb = ["src"], Rb = ["sr transition: "width 140ms ease,max-width 140ms ease,flex-basis 140ms ease,border-color 140ms ease", contain: "layout paint style" } - }, [Z(r) ? (q(), ir(dS, { + }, [Z(r) ? (q(), ar(dS, { key: 0, asset: Z(r), "on-update": Z(i), @@ -23526,11 +23513,11 @@ var Fb = { class: "mjr-sidebar-preview" }, Ib = ["src"], Lb = ["src"], Rb = ["sr "sidebar" ])) : (q(), X("div", fS, J(Z(R)("sidebar.placeholderSelectAsset", "Select an asset to view details")), 1))], 512)); } -}), mS = /* @__PURE__ */ dr({ +}), mS = /* @__PURE__ */ fr({ __name: "App", setup(e) { let t = Q(null), n = Q(null), r = Q(null), i = Q(null), a = Q(null), o = Q(null), s = null; - return jr(async () => { + return Mr(async () => { if (!t.value) return; let e = {}; n.value && (e.statusSection = n.value.statusSection, e.statusDot = n.value.statusDot, e.statusText = n.value.statusText, e.capabilitiesSection = n.value.capabilitiesSection), r.value && (e.headerSection = r.value), i.value && (e.summaryBar = i.value.summaryBar, e.updateSummaryBar = i.value.updateSummaryBar, e.folderBreadcrumb = i.value.folderBreadcrumb, e.folderBreadcrumbController = i.value), a.value && (e.browseSection = a.value.browseSection, e.gridWrapper = a.value.gridWrapper, e.gridContainer = a.value.gridContainer, e.onGridContainerReady = (...e) => a.value?.onGridContainerReady?.(...e), e.bindGridHostState = (...e) => a.value?.bindGridHostState?.(...e), e.restoreGridUiState = (...e) => a.value?.restoreGridUiState?.(...e), e.initAssetsQueryController = (...e) => a.value?.initAssetsQueryController?.(...e), e.loadAssets = (e, t = "*", n = {}) => a.value?.loadAssets?.(t, n), e.loadAssetsFromList = (e, t = [], n = {}) => a.value?.loadAssetsFromList?.(t, n), e.prepareGridForScopeSwitch = (e) => a.value?.prepareGridForScopeSwitch?.(), e.refreshGrid = (e) => a.value?.refreshGrid?.(), e.captureAnchor = (e) => a.value?.captureAnchor?.(), e.restoreAnchor = (e, t) => a.value?.restoreAnchor?.(t), e.hydrateGridFromSnapshot = (e, t = {}, n = {}) => a.value?.hydrateGridFromSnapshot?.(t, n), e.upsertAsset = (e, t) => a.value?.upsertAsset?.(t), e.removeAssets = (e, t = [], n = {}) => a.value?.removeAssets?.(t, n), e.disposeGrid = (e) => a.value?.disposeGrid?.()), o.value && (e.sidebar = o.value.sidebar); @@ -23545,7 +23532,7 @@ var Fb = { class: "mjr-sidebar-preview" }, Ib = ["src"], Lb = ["src"], Rb = ["sr try { dh().validatePersistedCustomRoot?.(); } catch {} - }), rr(() => { + }), ir(() => { try { s?.dispose?.(); } catch {} @@ -23585,7 +23572,7 @@ var Fb = { class: "mjr-sidebar-preview" }, Ib = ["src"], Lb = ["src"], Rb = ["sr }, null, 512) ], 64)); } -}), hS = /* @__PURE__ */ dr({ +}), hS = /* @__PURE__ */ fr({ __name: "GeneratedFeedApp", setup(e) { let t = Q(null), n = null; @@ -23605,15 +23592,15 @@ var Fb = { class: "mjr-sidebar-preview" }, Ib = ["src"], Lb = ["src"], Rb = ["sr } } } - return jr(() => { + return Mr(() => { if (t.value) try { - r(t.value), n = Xd(t.value); + r(t.value), n = Zd(t.value); } catch (e) { console.warn("[Majoor] GeneratedFeedApp.vue: createGeneratedFeedHost failed", e); } - }), rr(() => { + }), ir(() => { try { - Zd(n); + Qd(n); } catch {} n = null; }), (e, n) => (q(), X(H, null, [Y(iS), U("div", { @@ -23694,7 +23681,7 @@ function VS(e = "Viewer") { function HS(e) { if (!e) return; let t = NS ? R("tooltip.closeMFV", "Close Floating Viewer") : R("tooltip.openMFV", "Open Floating Viewer"); - Lt(e, t, xS, { ariaLabel: t }), e.setAttribute("aria-pressed", NS ? "true" : "false"), e.classList.toggle("primary", NS), e.classList.toggle("mjr-topbar-mfv-active", NS), e.replaceChildren(BS(NS ? "pi pi-eye-slash" : "pi pi-eye"), VS(R(yS, bS))); + Rt(e, t, xS, { ariaLabel: t }), e.setAttribute("aria-pressed", NS ? "true" : "false"), e.classList.toggle("primary", NS), e.classList.toggle("mjr-topbar-mfv-active", NS), e.replaceChildren(BS(NS ? "pi pi-eye-slash" : "pi pi-eye"), VS(R(yS, bS))); } function US() { try { @@ -23792,7 +23779,7 @@ function oC() { try { let e = aC(); if (!e) return !1; - let t = !!En(e, Lp, eC); + let t = !!Dn(e, Rp, eC); return ZS(), t; } catch { return !1; @@ -23803,12 +23790,12 @@ function sC() { QS(); let e = document.getElementById($S); if (!e) return; - Ln(e, eC), e.remove?.(); + Rn(e, eC), e.remove?.(); } catch {} } function cC(e, t) { - let n = Ue(e, t); - if (Bf(), !n) try { + let n = We(e, t); + if (Vf(), !n) try { window.dispatchEvent(new Event(V.OPEN_ASSETS_MANAGER)); } catch (e) { console.debug?.(e); @@ -23823,9 +23810,9 @@ function lC() { } } function uC(e) { - let t = Ye(e, rC); + let t = Xe(e, rC); if (!t) try { - Pd(); + Fd(); } catch (e) { console.debug?.(e); } @@ -23833,7 +23820,7 @@ function uC(e) { } async function dC() { try { - let t = await L(it.BROWSE_FOLDER, {}); + let t = await L(at.BROWSE_FOLDER, {}); if (t?.ok) return String(t?.data?.path || "").trim(); let n = String(t?.code || "").trim(); n && n !== "CANCELLED" && e(t?.error || R("toast.nativeFolderBrowserUnavailable", "Native folder browser unavailable. Please enter path manually."), "warning", 3500); @@ -23848,8 +23835,8 @@ async function fC(t, { settingId: n, settingsPathKey: r, save: i, successMessage let c = await i(s); if (!c?.ok) return e(c?.error || R("toast.settingsPathSaveFailed", "Failed to save path"), "error"), !1; try { - let e = Vn(); - e.paths = e.paths || {}, e.paths[r] = s, Fn(e), Pe(t, n, s), window.dispatchEvent(new CustomEvent(V.SETTINGS_CHANGED, { detail: { + let e = Hn(); + e.paths = e.paths || {}, e.paths[r] = s, In(e), Fe(t, n, s), window.dispatchEvent(new CustomEvent(V.SETTINGS_CHANGED, { detail: { key: `paths.${r}`, value: s } })); @@ -23906,7 +23893,7 @@ async function vC(e) { try { let t = await hC(e); if (t.length) { - let { floatingViewerManager: e } = await import("./chunks/floatingViewerManager-Gv7MTmpu.js").then((e) => e.n); + let { floatingViewerManager: e } = await import("./chunks/floatingViewerManager-DGIaL-BQ.js").then((e) => e.n); if (await e.openAssets({ assets: t, index: 0 @@ -23989,7 +23976,7 @@ function bC(e, { sidebarTabId: t, triggerStartupScan: n }) { id: "mjr.openSettings", label: R("command.openSettings", "Open Majoor settings"), icon: "pi pi-cog", - function: () => Yn(e) + function: () => Xn(e) }, { id: "mjr.pickOutputDirectory", @@ -24107,7 +24094,7 @@ function CC(e, { sidebarTabId: t, triggerStartupScan: n }) { }, { content: R("command.openSettings", "Open Majoor settings"), - callback: () => Yn(e) + callback: () => Xn(e) } ] } }]; @@ -24130,19 +24117,19 @@ function wC() { ]; } function TC(e, t) { - for (let n of bC(e, t)) Be(e, n); + for (let n of bC(e, t)) Ve(e, n); } function EC(e) { - for (let t of xC()) Ve(e, t); + for (let t of xC()) He(e, t); } function DC(e, { sidebarTabId: t }) { - Rf({ sidebarTabId: t }); + zf({ sidebarTabId: t }); try { - Vn()?.integration?.hideNativeAssetsTab && bn(!0); + Hn()?.integration?.hideNativeAssetsTab && xn(!0); } catch (e) { console.debug?.(e); } - return Fe(e, { + return Ie(e, { id: t, icon: "pi pi-folder", title: R("manager.title"), @@ -24150,8 +24137,8 @@ function DC(e, { sidebarTabId: t }) { tooltip: R("tooltip.sidebarTab"), type: "custom", render(e) { - Bf(), si({ idleOnly: !0 }).catch(() => null), En(e, mS, tC), setTimeout(() => { - let e = Uf(); + Vf(), ci({ idleOnly: !0 }).catch(() => null), Dn(e, mS, tC), setTimeout(() => { + let e = Wf(); if (e) try { window.dispatchEvent(new CustomEvent(V.RELOAD_GRID, { detail: { reason: "pending-generated-assets", @@ -24167,10 +24154,10 @@ function DC(e, { sidebarTabId: t }) { } function OC() { try { - fn(); + pn(); } catch {} try { - Ln(null, tC); + Rn(null, tC); } catch {} kC = !1; try { @@ -24179,11 +24166,11 @@ function OC() { } var kC = !1, AC = "mjr-sidebar-prewarm-host"; function jC() { - if (kC || typeof document > "u" || !document?.body || wn(tC)) return !1; + if (kC || typeof document > "u" || !document?.body || Tn(tC)) return !1; kC = !0; try { let e = document.getElementById(AC); - return e || (e = document.createElement("div"), e.id = AC, e.style.cssText = "position:fixed;left:-99999px;top:0;width:360px;height:600px;overflow:hidden;visibility:hidden;pointer-events:none;contain:strict;", e.setAttribute("aria-hidden", "true"), document.body.appendChild(e)), En(e, mS, tC, { attachIfExists: !1 }), !0; + return e || (e = document.createElement("div"), e.id = AC, e.style.cssText = "position:fixed;left:-99999px;top:0;width:360px;height:600px;overflow:hidden;visibility:hidden;pointer-events:none;contain:strict;", e.setAttribute("aria-hidden", "true"), document.body.appendChild(e)), Dn(e, mS, tC, { attachIfExists: !1 }), !0; } catch (e) { return console.debug?.(e), kC = !1, !1; } @@ -24195,7 +24182,7 @@ function MC() { icon: "pi pi-images", type: "custom", render(e) { - En(e, hS, nC); + Dn(e, hS, nC); }, destroy(e) {} }; @@ -24205,7 +24192,7 @@ function NC() { } function PC() { try { - Ln(null, nC); + Rn(null, nC); } catch {} } function FC(e) { @@ -24264,6 +24251,11 @@ function HC(e, t) { } function UC(e, { reportError: t } = {}) { if (e && typeof e == "object") { + try { + ee(); + } catch (e) { + console.debug?.(e); + } try { let t = Array.isArray(e._listenerCleanupFns) ? e._listenerCleanupFns : []; for (let e of t) try { @@ -24371,7 +24363,7 @@ function GC({ cleanupEntryRuntimeFn: e = UC, teardownLiveStreamTracker: t, teard // ui/entry.ts var KC = null, qC = null, JC = null; function YC() { - return JC ||= import("./chunks/floatingViewerManager-Gv7MTmpu.js").then((e) => e.n), JC; + return JC ||= import("./chunks/floatingViewerManager-DGIaL-BQ.js").then((e) => e.n), JC; } function XC() { JC && JC.then((e) => e?.teardownFloatingViewerManager?.()).catch((e) => console.debug?.("[Majoor] MFV teardown skipped", e)); @@ -24458,7 +24450,7 @@ async function pw({ active: e, promptId: t = "" } = {}) { promptId: r }; try { - await L(it.RUNTIME_EXECUTION, { + await L(at.RUNTIME_EXECUTION, { active: n, prompt_id: r || void 0, cooldown_ms: Number(B.EXECUTION_IDLE_GRACE_MS) || 6e3 @@ -24486,12 +24478,12 @@ function hw(e = 1200) { hw(e); return; } - let t = Qn(); - t && _i(t); + let t = $n(); + t && vi(t); }, Math.max(250, Number(e) || 0)); } function gw(e) { - import("./chunks/LiveStreamTracker-C8HwFSOT.js").then((t) => { + import("./chunks/LiveStreamTracker-DhOEgG4Z.js").then((t) => { KC = t; try { t.initLiveStreamTracker(e); @@ -24523,15 +24515,15 @@ function gw(e) { }).catch((e) => console.warn("[MJR setup] NodeStream load failed:", e)); } async function _w(t, n) { - let r = await st({ + let r = await ct({ app: t, timeoutMs: 4e3 - }) || Le(t); - if (Ae(r || null), !r) { + }) || Re(t); + if (je(r || null), !r) { console.warn("Majoor API not available, real-time updates disabled"); return; } - Gn({ + Kn({ api: r, app: t }).catch((e) => console.debug?.("[Majoor] MFV progress tracking init failed", e)); @@ -24541,21 +24533,21 @@ async function _w(t, n) { } catch (e) { console.debug?.(e); } - VC(i?.api || null, P), r !== i?.api && VC(r, P), HC(i, P), await np({ + VC(i?.api || null, P), r !== i?.api && VC(r, P), HC(i, P), await rp({ api: r, runtime: i, executionRuntime: n, - appRef: Fr, + appRef: Ir, liveStreamModule: KC, ensureExecutionRuntime: dw, emitRuntimeStatus: fw, - getActiveGridContainer: Qn, - pushGeneratedAsset: Yd, - upsertAsset: Ti, - upsertAssetNow: Ei, - removeAssetsFromGrid: wi, - getEnrichmentState: Ft, - setEnrichmentState: xt, + getActiveGridContainer: $n, + pushGeneratedAsset: Xd, + upsertAsset: Ei, + upsertAssetNow: Di, + removeAssetsFromGrid: Ti, + getEnrichmentState: It, + setEnrichmentState: St, comfyToast: e, t: R, reportError: P, @@ -24563,21 +24555,21 @@ async function _w(t, n) { syncExecutionBackendState: pw }); } -var vw = vf({ +var vw = yf({ post: L, - ENDPOINTS: it, + ENDPOINTS: at, reportError: P, - extractOutputFiles: yf, + extractOutputFiles: bf, ensureExecutionRuntime: dw, emitRuntimeStatus: fw, - refreshGeneratedFeedHosts: Pd, - getActiveGridContainer: Qn + refreshGeneratedFeedHosts: Fd, + getActiveGridContainer: $n }), yw = { name: $C, - settings: yn(Fr), - commands: bC(Fr, { + settings: bn(Ir), + commands: bC(Ir, { sidebarTabId: ZC, - triggerStartupScan: ai + triggerStartupScan: oi }), keybindings: xC(), menuCommands: SC(), @@ -24594,21 +24586,21 @@ var vw = vf({ teardownGlobalRuntime: sC, teardownTopBarMfvButton: QS, reportError: P - }), op(), qe(Fr); - let e = await z({ timeoutMs: 12e3 }) || Fr; - qe(e), Fp(e); + }), sp(), Je(Ir); + let e = await tt({ timeoutMs: 12e3 }) || Ir; + Je(e), Ip(e); try { typeof window < "u" && (window.__MJR_RUNTIME_APP__ = e); } catch (e) { console.debug?.(e); } - li(), di({ enabled: !0 }), oC(), gw(e), vn(e, () => { - let e = Qn(); - e && (B.DEFER_GRID_FETCH_DURING_EXECUTION && mw() ? hw() : _i(e)); + ui(), fi({ enabled: !0 }), oC(), gw(e), yn(e, () => { + let e = $n(); + e && (B.DEFER_GRID_FETCH_DURING_EXECUTION && mw() ? hw() : vi(e)); }), TC(e, { sidebarTabId: ZC, - triggerStartupScan: ai - }), EC(e), _w(e, vw).catch((e) => P(e, "entry.api_setup")), DC(e, { sidebarTabId: ZC }) ? xe("[Majoor] Sidebar tab registered (Vue)") : console.warn("Majoor Assets Manager: extensionManager.registerSidebarTab is unavailable"); + triggerStartupScan: oi + }), EC(e), _w(e, vw).catch((e) => P(e, "entry.api_setup")), DC(e, { sidebarTabId: ZC }) ? Se("[Majoor] Sidebar tab registered (Vue)") : console.warn("Majoor Assets Manager: extensionManager.registerSidebarTab is unavailable"); try { let e = typeof window < "u" ? window.requestIdleCallback : null, t = () => { try { @@ -24621,7 +24613,7 @@ var vw = vf({ } catch (e) { console.debug?.(e); } - rp({ resolveNodeStreamModule: async () => (qC ||= await import("./chunks/NodeStreamController-CIKDDXJT.js"), qC) }); + ip({ resolveNodeStreamModule: async () => (qC ||= await import("./chunks/NodeStreamController-CIKDDXJT.js"), qC) }); }, onNodeOutputsUpdated(e) { try { @@ -24631,12 +24623,12 @@ var vw = vf({ } }, getNodeMenuItems(e) { - return zC(e, Fr, { sidebarTabId: ZC }); + return zC(e, Ir, { sidebarTabId: ZC }); }, getCanvasMenuItems(e) { - return CC(Fr, { + return CC(Ir, { sidebarTabId: ZC, - triggerStartupScan: ai + triggerStartupScan: oi }); }, getSelectionToolboxCommands(e) { @@ -24644,7 +24636,7 @@ var vw = vf({ } }; try { - Fr.registerExtension(yw); + Ir.registerExtension(yw); } catch (e) { console.warn("[Majoor] registerExtension() threw (extension already registered) - re-running setup() directly", e), yw.setup().catch((e) => P(e, "entry.setup_after_duplicate_registration")); } diff --git a/docs/COMFYUI_INTEGRATION_AUDIT.md b/docs/COMFYUI_INTEGRATION_AUDIT.md index bd64f38f..2f4f5e1b 100644 --- a/docs/COMFYUI_INTEGRATION_AUDIT.md +++ b/docs/COMFYUI_INTEGRATION_AUDIT.md @@ -88,6 +88,20 @@ Imports non triés dans 5 fichiers (`ruff --fix`) qui faisaient échouer | R7 | `import { app } from "../../scripts/app.js"` (shim encore supporté). | Ouvert (faible). | | R8 | 913 erreurs de typage dans `tsconfig.test.json`. | **Corrigé** : 0 erreur ; ajouté à la CI (`python-tests.yml`). Un vrai bug de test trouvé au passage (clé `stubs` dupliquée dans `asset_card_inner.vitest.ts`). | +## 3 bis. Audit du système de notifications + +| Constat | Avant | Après | +| --- | --- | --- | +| API utilisée | `extensionManager.toast.add()` uniquement, **dépréciée** par ComfyUI (`ToastManager` 1.60). | API typée `success/error/info/warning/loading(title, {description, duration, action, closable, id})` ; `add()` seulement en repli pour les anciens frontends. | +| Détection | `getExtensionToastApi` exigeait `toast.add` : le jour où ComfyUI le retire, **tous les toasts Majoor disparaissent en silence**. | Accepte l'API typée ou `add()`. Test dédié. | +| Opérations longues (restauration/réinitialisation de la base, backfill vectoriel) | Chaque étape (`started`, `running`, …) **empilait un nouveau toast**. | Un seul toast `loading`, mis à jour en place via le même `ToastId`, puis remplacé par le résultat final (succès ou erreur). | +| Toasts persistants | `life` omis. | Durée maximale sûre (2³¹−1 ms) au lieu de `Infinity`, qui serait ramené à 0 par `setTimeout` et fermerait le toast immédiatement. | +| Liens d'action (`actionUrl`) | Ignorés dans le toast. | Bouton d'action natif, limité aux liens `http(s)` et aux chemins relatifs du même site (`javascript:` refusé). | +| Contournements | `genInfoOverridePicker.ts` appelait `toast.add()` directement ; `comfyAlert` utilisait `addAlert`/`add`. | Tout passe par `comfyToast` ou l'API typée. | +| Code mort | Repli `app.ui.toast` (API inexistante dans le frontend actuel), `_dismissAllFallbackErrorToasts` vide, CSS `.mjr-toast*` des anciens toasts DOM. | Supprimés. | +| Démontage | Les toasts en cours restaient affichés. | `dismissTrackedToasts()` à l'arrêt de l'extension. | +| Centre de messages (cloche) | S'ouvrait tout seul lors d'une réinitialisation ou d'un backfill. | Conservé comme **historique consultable** (notes de version, journal, raccourcis), car ComfyUI n'offre pas de boîte de réception aux extensions ; il ne s'ouvre plus de lui-même. | + ## 4. Feuille de route d'évolution (meilleure intégration) 1. **Progression par nœud** — écouter l'événement websocket `progress_state` diff --git a/ui/app/DialogTemplates.ts b/ui/app/DialogTemplates.ts index fb32fa85..54e44548 100644 --- a/ui/app/DialogTemplates.ts +++ b/ui/app/DialogTemplates.ts @@ -35,9 +35,15 @@ export const comfyAlert = async (message: any, title = "Majoor", options: Record if (extensionToast) { try { const detail = String(message || ""); - if (typeof extensionToast.addAlert === "function") { + if (typeof extensionToast.info === "function") { + extensionToast.info(String(title || "Majoor"), { + description: detail, + duration: 5000, + closable: true, + }); + } else if (typeof extensionToast.addAlert === "function") { extensionToast.addAlert(detail); - } else { + } else if (typeof extensionToast.add === "function") { extensionToast.add({ severity: "info", summary: String(title || "Majoor"), diff --git a/ui/app/comfyApiBridge.ts b/ui/app/comfyApiBridge.ts index 0894ce3b..925a7144 100644 --- a/ui/app/comfyApiBridge.ts +++ b/ui/app/comfyApiBridge.ts @@ -210,7 +210,17 @@ function _getBottomPanelController(manager: any | undefined): any { export function getExtensionToastApi(app?: any): any { const manager = getExtensionManager(app); const toastApi = manager?.toast || null; - if (toastApi && typeof toastApi.add === "function") return toastApi; + if (!toastApi) return null; + // Current ToastManager exposes success/error/info/warning/loading and marks + // add()/addAlert() deprecated; accept either so toasts keep working once + // the deprecated methods are removed. + if ( + typeof toastApi.add === "function" || + typeof toastApi.success === "function" || + typeof toastApi.info === "function" + ) { + return toastApi; + } return null; } diff --git a/ui/app/dialogs.ts b/ui/app/dialogs.ts index 7af7d97f..29aac85d 100644 --- a/ui/app/dialogs.ts +++ b/ui/app/dialogs.ts @@ -37,9 +37,7 @@ export const getExtensionManagerDialog = (): MajoorExtensionDialog | null => { export const getExtensionManagerToast = (): MajoorExtensionToast | null => { try { const toast = getHostToastApi(); - if (toast && typeof toast.add === "function") { - return toast; - } + if (toast) return toast; } catch (e) { console.debug?.(e); } diff --git a/ui/app/toast.ts b/ui/app/toast.ts index ce95bf1d..53b20823 100644 --- a/ui/app/toast.ts +++ b/ui/app/toast.ts @@ -1,19 +1,13 @@ /** * Toast Element - Majoor Assets Manager * - * Provides transient notification messages (Toasts) that mimic ComfyUI native style. - * Supports: success, error, warning, info. - * - * Priority integration with ComfyUI extensionManager.toast API (ComfyUI v1.3+). + * Thin bridge to ComfyUI's core toast manager. Supports success, error, + * warning, info, plus `loading` toasts updated in place for tracked operations. */ import { getHostToastApi } from "./hostAdapter.js"; import { t } from "./i18n.js"; import { addToastHistory } from "../features/panel/messages/toastHistory.js"; -function _dismissAllFallbackErrorToasts() { - // Legacy compatibility: no-op since DOM fallback toasts were removed. -} - function normalizeToastType(type: any): string { const raw = String(type || "info") .trim() @@ -421,8 +415,9 @@ function translateToastMessage(message: any) { /** * Shows a toast notification. - * Integrates with ComfyUI extensionManager.toast when available. - * Falls back to ComfyUI app.ui.toast for older runtime variants. + * Routes to ComfyUI's core toast manager (`app.extensionManager.toast`): + * the typed `success/error/info/warning/loading` API on current frontends, + * the deprecated `add()` on older ones. Majoor renders no toast of its own. * * @param {string|object} message - The message to display (or object with summary/detail) * @param {'info'|'success'|'warning'|'error'} type - The type of message @@ -455,51 +450,16 @@ export function comfyToast(message: any, type = "info", duration?: number | null // Treat as persistent only when caller explicitly passes 0 or a non-finite value. const persistent = !(Number.isFinite(Number(duration)) && Number(duration) > 0); - // 1. Try ComfyUI extensionManager toast (ComfyUI v1.3+ standard) + // ComfyUI core toast is the only notification surface (no Majoor DOM toasts). try { const toastApi = getHostToastApi(); - if (toastApi && typeof toastApi.add === "function") { - let severity = type; - if (severity === "warning") severity = "warn"; // PrimeVue uses "warn" not "warning" - - // Allow passing an object { summary, detail } as message - let summary = t("manager.title"); - let detail = message; - - if (typeof message === "object" && message?.summary) { - summary = message.summary; - detail = message.detail || ""; - } else if (typeof message !== "string") { - try { - detail = message.message || String(message); - } catch (e) { - console.debug?.(e); - } - } - - // NOTE: Do NOT set `group` - PrimeVue only shows a toast in the component - // that matches its group. ComfyUI has no custom group component, so any group value - // other than the default silently drops the message. - const payload: Record = { severity, summary, detail }; - if (!persistent) payload.life = duration; - toastApi.add(payload); + if (toastApi && emitCoreToast(toastApi, message, type, persistent ? 0 : Number(duration), opts)) { return; } } catch (e) { console.debug("Majoor: extensionManager.toast failed", e); } - // 2. Try generic ComfyUI app.ui.toast (Older or alternative implementations) - const legacyApp = (globalThis as any)?.app || (typeof window !== "undefined" ? (window as any)?.app : null); - if (legacyApp?.ui?.toast) { - try { - return legacyApp.ui.toast(message, type); - } catch (e) { - console.debug("Native app.ui.toast failed", e); - } - } - - // No custom DOM toast fallback: keep notifications on Comfy native channels only. console.warn("[Majoor Toast] Native toast API unavailable", { type, message: serializeToastMessage(message), @@ -507,6 +467,144 @@ export function comfyToast(message: any, type = "info", duration?: number | null }); } +// -- ComfyUI core toast bridge ------------------------------------------------- + +/** Statuses of a tracked operation that are still in progress -> `loading` toast. */ +const IN_PROGRESS_STATUSES = new Set([ + "started", + "start", + "queued", + "pending", + "running", + "in_progress", + "progress", + "stopping_workers", + "resetting_db", + "restarting_scan", + "restoring", + "deleting", +]); + +/** + * "No auto-dismiss" duration. Not `Infinity`: a toast store built on a plain + * `setTimeout(duration)` treats values above 2^31-1 as 0 and would close the + * toast immediately. 2^31-1 ms (~24.8 days) is the largest safe timer delay. + */ +const PERSISTENT_TOAST_MS = 2_147_483_647; + +/** trackId -> ToastId of the core toast currently showing that operation. */ +const _trackedToastIds = new Map(); + +function _toastTitleAndDescription(message: any): { title: string; description: string } { + if (message && typeof message === "object") { + const summary = String(message.summary || "").trim(); + const detail = String(message.detail || message.message || "").trim(); + if (summary) return { title: summary, description: detail }; + return { title: t("manager.title"), description: detail || serializeToastMessage(message) }; + } + return { title: t("manager.title"), description: serializeToastMessage(message) }; +} + +function _historyMeta(opts: Record | null | undefined): Record { + return opts?.history && typeof opts.history === "object" ? opts.history : {}; +} + +function _buildToastAction(opts: Record | null | undefined): any { + const history = _historyMeta(opts); + const label = String(history.actionLabel || "").trim(); + const url = String(history.actionUrl || "").trim(); + if (!label || !url) return undefined; + // Only http(s) links or same-origin absolute paths; never javascript: & co. + if (!/^(https?:\/\/|\/(?!\/))/i.test(url)) return undefined; + return { + label, + onClick: () => { + try { + window.open(url, "_blank", "noopener,noreferrer"); + } catch (e) { + console.debug?.(e); + } + }, + }; +} + +/** + * Emit through ComfyUI's toast manager. + * + * - Current frontends (ToastManager with `success/error/info/warning/loading`): + * typed API, native action button and, for tracked operations + * (`opts.history.trackId`), the same ToastId reused so each step updates one + * toast in place instead of stacking a new one per step. + * - Older frontends: the deprecated `add({severity, summary, detail, life})`. + * + * @returns true when a core toast was shown. + */ +function emitCoreToast( + toastApi: any, + message: any, + type: string, + durationMs: number, + opts: Record | null | undefined, +): boolean { + const { title, description } = _toastTitleAndDescription(message); + const history = _historyMeta(opts); + const trackId = String(history.trackId || "").trim(); + const status = String(history.status || "").trim().toLowerCase(); + const inProgress = !!trackId && IN_PROGRESS_STATUSES.has(status); + const method = inProgress ? "loading" : type; + const fn = + typeof toastApi[method] === "function" + ? toastApi[method] + : typeof toastApi[type] === "function" + ? toastApi[type] + : null; + + if (fn) { + const options: Record = { closable: true }; + if (description && description !== title) options.description = description; + // Persistent = no auto-dismiss; in-progress steps stay until the final step. + options.duration = durationMs > 0 && !inProgress ? durationMs : PERSISTENT_TOAST_MS; + const action = _buildToastAction(opts); + if (action) options.action = action; + const previousId = trackId ? _trackedToastIds.get(trackId) : undefined; + if (previousId != null) options.id = previousId; + + const id = fn.call(toastApi, title, options); + if (trackId) { + if (inProgress && id != null) _trackedToastIds.set(trackId, id); + else _trackedToastIds.delete(trackId); + } + return true; + } + + if (typeof toastApi.add === "function") { + // NOTE: Do NOT set `group` - PrimeVue only shows a toast in the component + // that matches its group; any other value silently drops the message. + const payload: Record = { + severity: type === "warning" ? "warn" : type, + summary: title, + detail: description, + }; + if (durationMs > 0) payload.life = durationMs; + toastApi.add(payload); + return true; + } + return false; +} + +/** Dismiss every core toast Majoor is currently tracking (e.g. on teardown). */ +export function dismissTrackedToasts(): void { + const toastApi = getHostToastApi(); + for (const id of _trackedToastIds.values()) { + try { + toastApi?.dismiss?.(id); + } catch (e) { + console.debug?.(e); + } + } + _trackedToastIds.clear(); +} + /** * Standard toast duration constants for consistent usage. */ @@ -557,5 +655,5 @@ export const __toastTestUtils = { buildToastHistoryPayload, normalizeToastType, serializeToastMessage, - _dismissAllFallbackErrorToasts, + emitCoreToast, }; diff --git a/ui/features/geninfo/genInfoOverridePicker.ts b/ui/features/geninfo/genInfoOverridePicker.ts index 65b2dc0c..d51f0e3d 100644 --- a/ui/features/geninfo/genInfoOverridePicker.ts +++ b/ui/features/geninfo/genInfoOverridePicker.ts @@ -1,6 +1,7 @@ import { getRawHostApp } from "../../app/hostAdapter.js"; import { collectGraphVisits, findGraphNodeById, getGraphNodes } from "../../app/graphTraversal.js"; import { t } from "../../app/i18n.js"; +import { comfyToast } from "../../app/toast.js"; import { writeWidgetValue } from "../viewer/workflowSidebar/widgetAdapters.js"; type LooseRecord = Record; @@ -239,12 +240,14 @@ function autoFillFromWorkflow(node: LooseRecord, runtimeApp: any): number { } runtimeApp?.graph?.setDirtyCanvas?.(true, true); runtimeApp?.graph?.change?.(); - runtimeApp?.extensionManager?.toast?.add?.({ - severity: count ? "success" : "warn", - summary: "Majoor Gen Info", - detail: count ? `Filled ${count} empty override fields.` : "No empty matching fields found.", - life: 3000, - }); + comfyToast( + { + summary: "Majoor Gen Info", + detail: count ? `Filled ${count} empty override fields.` : "No empty matching fields found.", + }, + count ? "success" : "warning", + 3000, + ); return count; } @@ -291,12 +294,14 @@ function registerExecutedVisualSync(runtimeApp: any): void { function showPicker(node: LooseRecord, runtimeApp: any, targetField: string | null = null): void { const candidates = collectCandidates(runtimeApp, targetField); if (!candidates.length) { - runtimeApp?.extensionManager?.toast?.add?.({ - severity: "warn", - summary: "Majoor Gen Info", - detail: targetField ? `No widget value found for ${targetField}.` : "No workflow parameters found.", - life: 3000, - }); + comfyToast( + { + summary: "Majoor Gen Info", + detail: targetField ? `No widget value found for ${targetField}.` : "No workflow parameters found.", + }, + "warning", + 3000, + ); return; } const overlay = document.createElement("div"); diff --git a/ui/features/runtime/entryRuntimeLifecycle.ts b/ui/features/runtime/entryRuntimeLifecycle.ts index e97f013b..8be8c884 100644 --- a/ui/features/runtime/entryRuntimeLifecycle.ts +++ b/ui/features/runtime/entryRuntimeLifecycle.ts @@ -1,4 +1,5 @@ import { EVENTS } from "../../app/events.js"; +import { dismissTrackedToasts } from "../../app/toast.js"; export const ENTRY_RUNTIME_KEY = "__MJR_ENTRY_RUNTIME__"; @@ -74,6 +75,12 @@ export function removeRuntimeWindowHandlers(runtime: any, reportError: (e: any, export function cleanupEntryRuntime(runtime: any, { reportError }: { reportError?: (e: any, ctx?: string) => void } = {}): void { if (!runtime || typeof runtime !== "object") return; + try { + // Close in-progress core toasts we own (e.g. a running DB maintenance). + dismissTrackedToasts(); + } catch (e) { + console.debug?.(e); + } try { const cleanups = Array.isArray(runtime._listenerCleanupFns) ? runtime._listenerCleanupFns diff --git a/ui/features/status/StatusDot.ts b/ui/features/status/StatusDot.ts index 86e97546..c196ac26 100644 --- a/ui/features/status/StatusDot.ts +++ b/ui/features/status/StatusDot.ts @@ -371,18 +371,6 @@ function markGridDirty(reason = "status-action", detail = {}) { } } -function requestOpenMessageHistory(reason = "") { - try { - window?.dispatchEvent?.( - new CustomEvent(EVENTS.OPEN_MESSAGE_HISTORY, { - detail: { reason: String(reason || "status-action") }, - }), - ); - } catch (e) { - console.debug?.(e); - } -} - async function askKeepVectors(actionLabel = "") { return await comfyConfirm( t( @@ -772,7 +760,6 @@ export function createStatusIndicator(options: Record = {}): any { t("dialog.resetIndex.title", "Reset index?"), ); if (!confirmed) return; - requestOpenMessageHistory("reset-index"); setMaintenanceActive(true); const originalText = resetBtn.textContent; @@ -879,7 +866,6 @@ export function createStatusIndicator(options: Record = {}): any { } const backfillScope = desiredScope || "output"; const backfillScopeLabel = formatWatcherScopeLabel(backfillScope); - requestOpenMessageHistory("vector-backfill"); const historyBase = { history: { trackId: `vector-backfill:status:${backfillScope}:${desiredCustomRootId || "default"}`, diff --git a/ui/tests/comfy_api_bridge.vitest.ts b/ui/tests/comfy_api_bridge.vitest.ts index 86aff600..d9744a1d 100644 --- a/ui/tests/comfy_api_bridge.vitest.ts +++ b/ui/tests/comfy_api_bridge.vitest.ts @@ -7,6 +7,15 @@ beforeEach(() => { }); describe("comfyApiBridge", () => { + it("accepts a toast manager that only has the typed (non-deprecated) API", async () => { + const toast = { success: vi.fn(), error: vi.fn(), info: vi.fn(), warning: vi.fn() }; + const mod = await import("../app/comfyApiBridge.js"); + const app = { ui: {}, extensionManager: { toast } }; + mod.setComfyApp(app); + expect(mod.getExtensionToastApi(app)).toBe(toast); + expect(mod.getExtensionToastApi({ ui: {}, extensionManager: { toast: {} } })).toBeNull(); + }); + it("discovers extension manager native surfaces from the app", async () => { const toast = { add: vi.fn() }; const dialog = { confirm: vi.fn(), prompt: vi.fn() }; diff --git a/ui/tests/toast.vitest.ts b/ui/tests/toast.vitest.ts index 7344b229..95dbff7a 100644 --- a/ui/tests/toast.vitest.ts +++ b/ui/tests/toast.vitest.ts @@ -270,4 +270,85 @@ describe("toast", () => { }); expect(document.getElementById("mjr-toast-container")).toBeNull(); }); + it("uses the typed ToastManager API on current frontends", async () => { + const api = { success: vi.fn(() => 1), add: vi.fn() }; + getExtensionToastApi.mockReturnValue(api as any); + const { toastModule } = await loadToastModules(); + + toastModule.comfyToast({ summary: "Saved", detail: "3 files" }, "success", 1500); + + expect(api.success).toHaveBeenCalledWith( + "Saved", + expect.objectContaining({ description: "3 files", duration: 1500, closable: true }), + ); + expect(api.add).not.toHaveBeenCalled(); + }); + + it("updates one loading toast in place for a tracked operation", async () => { + let next = 40; + const api = { + loading: vi.fn(() => next++), + success: vi.fn(() => next++), + info: vi.fn(), + }; + getExtensionToastApi.mockReturnValue(api as any); + const { toastModule } = await loadToastModules(); + const track = (status: string) => ({ + history: { trackId: "maintenance:db_restore", status, title: "DB" }, + }); + + toastModule.comfyToast("Restoring", "info", 0, track("started")); + toastModule.comfyToast("Still restoring", "info", 0, track("running")); + toastModule.comfyToast("Restored", "success", 2000, track("done")); + + expect(api.loading).toHaveBeenCalledTimes(2); + expect((api.loading.mock.calls as any)[1][1].id).toBe(40); + expect((api.success.mock.calls as any)[0][1]).toMatchObject({ id: 41, duration: 2000 }); + expect(api.info).not.toHaveBeenCalled(); + + // Finished: a new run of the same operation starts a fresh toast. + toastModule.comfyToast("Restoring again", "info", 0, track("started")); + expect((api.loading.mock.calls as any)[2][1].id).toBeUndefined(); + }); + + it("never auto-dismisses persistent toasts with an unsafe timer value", async () => { + const api = { error: vi.fn() }; + getExtensionToastApi.mockReturnValue(api as any); + const { toastModule } = await loadToastModules(); + + toastModule.comfyToast("Broken", "error", 0); + + const duration = (api.error.mock.calls as any)[0][1].duration; + expect(Number.isFinite(duration)).toBe(true); + expect(duration).toBeLessThanOrEqual(2 ** 31 - 1); + }); + + it("adds a native action button only for safe links", async () => { + const api = { info: vi.fn() }; + getExtensionToastApi.mockReturnValue(api as any); + const { toastModule } = await loadToastModules(); + + toastModule.comfyToast("Guide", "info", 3000, { + history: { actionLabel: "Open", actionUrl: "/mjr/am/user-guide" }, + }); + toastModule.comfyToast("Bad", "info", 3000, { + history: { actionLabel: "Open", actionUrl: "javascript:alert(1)" }, + }); + + expect((api.info.mock.calls as any)[0][1].action).toMatchObject({ label: "Open" }); + expect((api.info.mock.calls as any)[1][1].action).toBeUndefined(); + }); + + it("dismisses tracked in-progress toasts on teardown", async () => { + const api = { loading: vi.fn(() => 7), dismiss: vi.fn() }; + getExtensionToastApi.mockReturnValue(api as any); + const { toastModule } = await loadToastModules(); + + toastModule.comfyToast("Working", "info", 0, { + history: { trackId: "vector-backfill:x", status: "running" }, + }); + toastModule.dismissTrackedToasts(); + + expect(api.dismiss).toHaveBeenCalledWith(7); + }); }); diff --git a/ui/theme/theme-comfy.css b/ui/theme/theme-comfy.css index bd65b045..1d52b583 100644 --- a/ui/theme/theme-comfy.css +++ b/ui/theme/theme-comfy.css @@ -1395,103 +1395,6 @@ flex: 0 0 auto; } -/* Toasts (global: can be mounted under document.body) */ -.mjr-toast-container { - position: fixed; - top: 16px; - left: 50%; - transform: translateX(-50%); - display: flex; - flex-direction: column; - align-items: center; - gap: 10px; - z-index: 1000001; - pointer-events: none; -} - -.mjr-toast { - --mjr-toast-strip: var(--mjr-status-info, var(--comfy-status-info, #2196f3)); - --mjr-toast-icon-color: var(--mjr-status-info, var(--comfy-status-info, #2196f3)); - background: var(--comfy-menu-bg, #2a2a2a); - border: 1px solid var(--border-color, #3a3a3a); - border-left: 4px solid var(--mjr-toast-strip); - border-radius: 4px; - padding: 12px 16px; - color: var(--fg-color, #efefef); - font-family: var( - --comfy-font, - ui-sans-serif, - system-ui, - -apple-system, - "Segoe UI", - Roboto, - Arial, - sans-serif - ); - font-size: 14px; - box-shadow: 0 4px 16px rgba(0, 0, 0, 0.5); - opacity: 0; - transform: translateY(-15px); - transition: - opacity 0.2s ease-out, - transform 0.2s ease-out; - pointer-events: auto; - display: flex; - align-items: center; - gap: 12px; - white-space: pre-wrap; - width: max-content; - min-width: min(250px, calc(100vw - 24px)); - max-width: min(400px, calc(100vw - 24px)); - backdrop-filter: blur(4px); - cursor: default; - user-select: none; -} - -.mjr-toast.is-visible { - opacity: 1; - transform: translateY(0); -} - -.mjr-toast-text { - flex: 1; - display: flex; - align-items: center; - gap: 8px; -} - -/* Toast icon styling */ -.mjr-toast-text::before { - content: attr(data-icon); - font-size: 16px; - font-weight: bold; - color: var(--mjr-toast-icon-color); - display: inline-flex; - align-items: center; - justify-content: center; - min-width: 16px; -} - -.mjr-toast-success { - --mjr-toast-strip: var(--mjr-status-success, var(--comfy-status-success, #4caf50)); - --mjr-toast-icon-color: var(--mjr-status-success, var(--comfy-status-success, #4caf50)); -} - -.mjr-toast-error { - --mjr-toast-strip: var(--mjr-status-error, var(--comfy-status-error, #f44336)); - --mjr-toast-icon-color: var(--mjr-status-error, var(--comfy-status-error, #f44336)); -} - -.mjr-toast-warning { - --mjr-toast-strip: var(--mjr-status-warning, var(--comfy-status-warning, #ffa726)); - --mjr-toast-icon-color: var(--mjr-status-warning, var(--comfy-status-warning, #ffa726)); -} - -.mjr-toast-info { - --mjr-toast-strip: var(--mjr-status-info, var(--comfy-status-info, #2196f3)); - --mjr-toast-icon-color: var(--mjr-status-info, var(--comfy-status-info, #2196f3)); -} - .mjr-assets-manager .mjr-am-summary-text { overflow: hidden; text-overflow: ellipsis; diff --git a/ui/types/comfyui-frontend.d.ts b/ui/types/comfyui-frontend.d.ts index 1d39dda0..910009d4 100644 --- a/ui/types/comfyui-frontend.d.ts +++ b/ui/types/comfyui-frontend.d.ts @@ -22,9 +22,27 @@ export interface MajoorSettingDefinition { onChange?: (value: unknown, oldValue?: unknown) => void | Promise; } +export interface MajoorToastOptions { + description?: string; + duration?: number; + closable?: boolean; + id?: unknown; + action?: { label: string; onClick: () => unknown }; +} + +/** ComfyUI ToastManager: typed methods on current frontends, add() on older ones. */ export interface MajoorExtensionToast { - add(message: unknown): void; + /** @deprecated by ComfyUI; kept for older frontends. */ + add?(message: unknown): void; + /** @deprecated by ComfyUI; kept for older frontends. */ addAlert?(message: string): void; + success?(title: string, options?: MajoorToastOptions): unknown; + error?(title: string, options?: MajoorToastOptions): unknown; + info?(title: string, options?: MajoorToastOptions): unknown; + warning?(title: string, options?: MajoorToastOptions): unknown; + loading?(title: string, options?: MajoorToastOptions): unknown; + dismiss?(id: unknown): boolean; + dismissAll?(): void; } export interface MajoorExtensionDialog { From 49bf32063192401f50f818117f378b6311d15cd0 Mon Sep 17 00:00:00 2001 From: Ewald ALOEBOETOE <129623145+MajoorWaldi@users.noreply.github.com> Date: Wed, 4 Nov 2026 08:01:26 +0000 Subject: [PATCH 11/23] Fix asset sync for new, moved and deleted files - Fix assets_fts triggers: the external-content FTS5 table was updated with plain UPDATE/DELETE, so every rename or move failed with "database disk image is malformed" and the watcher fell back to delete + re-index, losing ratings, tags and collections. Use the FTS5 'delete' command, limit the update trigger to filename/subfolder and repair existing databases (plus an FTS rebuild) at startup. - Wait for the prompt history entry before post-execution ingestion: ComfyUI fires on_prompt_end before task_done() stores history, so outputs of prompts queued from the API or another client could be missed. - Scan prune only removes assets whose absence is confirmed; a stat error or an unreadable scan root no longer deletes user data. Report pruned assets instead of SQLite change counts. - Emit mjr-assets-removed for watcher deletes and scan prunes and mjr-asset-updated for moves so open grids update in place. - Annotate mjr-scan-complete with origin and needs_refresh; reload the grid once when live events cannot cover a change and summarise a finished directory scan in one ComfyUI core toast. - Document the comparison with ComfyUI core's asset system. --- CHANGELOG.md | 7 + ...BlImyYVf.js => FloatingViewer-Bw0UgjBJ.js} | 14 +- ...EgG4Z.js => LiveStreamTracker-CUeCguVd.js} | 4 +- ....js => SidebarWorkflowSection-BjUgGET_.js} | 12 +- ...tor-Dd6Rh_zi.js => TagsEditor-gpBsG4si.js} | 6 +- ...{Viewer-BvNSchxR.js => Viewer-BEptWhbV.js} | 12 +- ...l-BxqCZGmO.js => ViewerPortal-CeOkTVnX.js} | 10 +- ...{events-ChGln7ff.js => events-B9CSrqJ_.js} | 4 + ...Q.js => floatingViewerManager-DI520cRz.js} | 6 +- ...enInfo-CYK2drm1.js => genInfo-C3ZF_agc.js} | 6 +- ...cswIkFn.js => model3dRenderer-BsJ9YHaZ.js} | 2 +- ...eKk-.js => openMajoorSettings-BZtL8v_l.js} | 4 +- ...ide-t394tgpD.js => sideBySide-DEEkMdvW.js} | 2 +- ...AWUHf.js => viewerOpenRequest-B8IT-KHd.js} | 4 +- ...59FX.js => viewerRuntimeHosts-CkUqwo6l.js} | 2 +- dist/entry.js | 77 ++++-- docs/COMFYUI_INTEGRATION_AUDIT.md | 25 ++ mjr_am_backend/adapters/comfy_core.py | 11 + mjr_am_backend/adapters/db/schema_fts.py | 32 ++- mjr_am_backend/adapters/db/schema_sql.py | 16 +- mjr_am_backend/features/index/scan_prune.py | 80 +++++- mjr_am_backend/features/index/service.py | 81 +++++- .../features/runtime/post_execution.py | 21 ++ tests/features/test_asset_change_events.py | 232 ++++++++++++++++++ .../features/test_post_execution_ingestion.py | 64 +++++ ui/app/events.ts | 2 + ui/app/i18n.ts | 3 + ui/features/runtime/entryRuntimeLifecycle.ts | 3 + .../runtime/registerRealtimeListeners.ts | 59 +++++ .../register_realtime_listeners.vitest.ts | 86 +++++++ 30 files changed, 797 insertions(+), 90 deletions(-) rename dist/chunks/{FloatingViewer-BlImyYVf.js => FloatingViewer-Bw0UgjBJ.js} (99%) rename dist/chunks/{LiveStreamTracker-DhOEgG4Z.js => LiveStreamTracker-CUeCguVd.js} (97%) rename dist/chunks/{SidebarWorkflowSection-BR3ECa3i.js => SidebarWorkflowSection-BjUgGET_.js} (99%) rename dist/chunks/{TagsEditor-Dd6Rh_zi.js => TagsEditor-gpBsG4si.js} (97%) rename dist/chunks/{Viewer-BvNSchxR.js => Viewer-BEptWhbV.js} (99%) rename dist/chunks/{ViewerPortal-BxqCZGmO.js => ViewerPortal-CeOkTVnX.js} (97%) rename dist/chunks/{events-ChGln7ff.js => events-B9CSrqJ_.js} (99%) rename dist/chunks/{floatingViewerManager-DGIaL-BQ.js => floatingViewerManager-DI520cRz.js} (99%) rename dist/chunks/{genInfo-CYK2drm1.js => genInfo-C3ZF_agc.js} (99%) rename dist/chunks/{model3dRenderer-DcswIkFn.js => model3dRenderer-BsJ9YHaZ.js} (99%) rename dist/chunks/{openMajoorSettings-CdWVeKk-.js => openMajoorSettings-BZtL8v_l.js} (99%) rename dist/chunks/{sideBySide-t394tgpD.js => sideBySide-DEEkMdvW.js} (99%) rename dist/chunks/{viewerOpenRequest-POEAWUHf.js => viewerOpenRequest-B8IT-KHd.js} (90%) rename dist/chunks/{viewerRuntimeHosts-nMPP59FX.js => viewerRuntimeHosts-CkUqwo6l.js} (99%) create mode 100644 tests/features/test_asset_change_events.py diff --git a/CHANGELOG.md b/CHANGELOG.md index 8d6fc4d3..59ec464a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -30,6 +30,13 @@ All notable changes to this project are documented in this file. ### Fixed - **`mjr_am_backend.adapters.tools` missing from Registry installs**: `.comfyignore`'s unanchored `tools/` pattern also matched `mjr_am_backend/adapters/tools/`, stripping the ExifTool/FFProbe adapters out of every Registry-published package and causing `ModuleNotFoundError: No module named 'mjr_am_backend.adapters.tools'` at startup. The pattern is now anchored to the repo-root `/tools/` dev-scripts folder only. +### Fixed (asset sync) +- **Renamed / moved files lost their ratings, tags and collections**: the `assets_fts` triggers ran a plain `UPDATE`/`DELETE` on an external-content FTS5 table, so every filename/subfolder change failed with "database disk image is malformed" (and could start a needless DB recovery). The watcher then fell back to delete + re-index, creating a new asset id. Triggers now use FTS5's `'delete'` command (update trigger limited to `filename, subfolder`); existing databases are repaired and the FTS index rebuilt automatically at startup. +- **Outputs missed after a generation**: ComfyUI calls `on_prompt_end` before it stores the prompt history, so post-execution ingestion could read an empty history and index nothing (prompts queued from the API, another tab or another device). Ingestion now waits briefly for the history entry. +- **Scan prune could wipe user data**: a stat error (offline share, permission hiccup) counted as "file deleted". Like ComfyUI core's reconciler, only a confirmed absence removes an asset, and an unreadable scan root is never pruned. The `pruned` count no longer includes cascade/trigger rows. +- **Stale cards after external deletes/moves**: files removed or moved outside Majoor (watcher, scan prune) now emit `mjr-assets-removed` / `mjr-asset-updated`, so open grids update in place. +- **Background scans never refreshed the grid**: `mjr-scan-complete` now carries `origin` and `needs_refresh`; the grid reloads once when live events could not cover the change, and a finished directory scan shows one ComfyUI core toast ("N new, M removed"). Per-generation index runs stay silent (live cards + sidebar badge). + ### Changed (ComfyUI integration) - **Compat assets API moved to `/mjr/am/compat/assets/*`**: the read-only OpenAPI-aligned surface no longer squats ComfyUI core's `/api` namespace. The old `/api/v2/assets/*` paths are only registered when `MJR_AM_LEGACY_API_V2_ASSETS=1` (deprecated). - **Python 3.14**: `requires-python` is now `>=3.10, <3.15`; CI runs the full suite on 3.14. diff --git a/dist/chunks/FloatingViewer-BlImyYVf.js b/dist/chunks/FloatingViewer-Bw0UgjBJ.js similarity index 99% rename from dist/chunks/FloatingViewer-BlImyYVf.js rename to dist/chunks/FloatingViewer-Bw0UgjBJ.js index 76a6d385..7be922e7 100644 --- a/dist/chunks/FloatingViewer-BlImyYVf.js +++ b/dist/chunks/FloatingViewer-Bw0UgjBJ.js @@ -1,12 +1,12 @@ -import { $t as e, g as t, y as n } from "./viewerRuntimeHosts-nMPP59FX.js"; -import { C as r, H as i, I as a, M as o, O as s, P as c, V as l, at as u, j as d, m as f, o as p, r as m, v as h, w as g, x as _, z as v } from "./events-ChGln7ff.js"; +import { $t as e, g as t, y as n } from "./viewerRuntimeHosts-CkUqwo6l.js"; +import { C as r, H as i, I as a, M as o, O as s, P as c, V as l, at as u, j as d, m as f, o as p, r as m, v as h, w as g, x as _, z as v } from "./events-B9CSrqJ_.js"; import { a as y, i as b, o as x, s as S } from "./graphTraversal-DTdQWkn5.js"; -import { _ as C, g as w, m as T, n as E, p as ee, r as D, w as O } from "./Viewer-BvNSchxR.js"; -import { r as k, v as A } from "./SidebarWorkflowSection-BR3ECa3i.js"; -import { _ as j, a as M, c as N, d as P, f as F, g as I, h as L, i as te, l as R, m as z, o as ne, p as B, r as re, s as V, t as ie, u as H, v as U } from "./openMajoorSettings-CdWVeKk-.js"; -import { a as W, n as ae, r as oe } from "./model3dRenderer-DcswIkFn.js"; +import { _ as C, g as w, m as T, n as E, p as ee, r as D, w as O } from "./Viewer-BEptWhbV.js"; +import { r as k, v as A } from "./SidebarWorkflowSection-BjUgGET_.js"; +import { _ as j, a as M, c as N, d as P, f as F, g as I, h as L, i as te, l as R, m as z, o as ne, p as B, r as re, s as V, t as ie, u as H, v as U } from "./openMajoorSettings-BZtL8v_l.js"; +import { a as W, n as ae, r as oe } from "./model3dRenderer-BsJ9YHaZ.js"; import { i as se, o as ce, r as le, t as ue } from "./geninfoParser-CgHp-y-n.js"; -import { t as de } from "./genInfo-CYK2drm1.js"; +import { t as de } from "./genInfo-C3ZF_agc.js"; // ui/features/viewer/floatingViewerConstants.ts var G = Object.freeze({ SIMPLE: "simple", diff --git a/dist/chunks/LiveStreamTracker-DhOEgG4Z.js b/dist/chunks/LiveStreamTracker-CUeCguVd.js similarity index 97% rename from dist/chunks/LiveStreamTracker-DhOEgG4Z.js rename to dist/chunks/LiveStreamTracker-CUeCguVd.js index 0af006fb..8dbaaa24 100644 --- a/dist/chunks/LiveStreamTracker-DhOEgG4Z.js +++ b/dist/chunks/LiveStreamTracker-CUeCguVd.js @@ -1,5 +1,5 @@ -import { Z as e, o as t, r as n } from "./events-ChGln7ff.js"; -import { t as r } from "./floatingViewerManager-DGIaL-BQ.js"; +import { Z as e, o as t, r as n } from "./events-B9CSrqJ_.js"; +import { t as r } from "./floatingViewerManager-DI520cRz.js"; // ui/features/viewer/LiveStreamTracker.ts var i = !1, a = null, o = null, s = null, c = null, l = null, u = null, d = null, f = null, p = 0, m = 0, h = !1, g = 400, _ = "kj_preview_override", v = /* @__PURE__ */ new Set([ "image/jpeg", diff --git a/dist/chunks/SidebarWorkflowSection-BR3ECa3i.js b/dist/chunks/SidebarWorkflowSection-BjUgGET_.js similarity index 99% rename from dist/chunks/SidebarWorkflowSection-BR3ECa3i.js rename to dist/chunks/SidebarWorkflowSection-BjUgGET_.js index 6a7f798d..c27ca268 100644 --- a/dist/chunks/SidebarWorkflowSection-BR3ECa3i.js +++ b/dist/chunks/SidebarWorkflowSection-BjUgGET_.js @@ -1,10 +1,10 @@ -import { $ as e, $t as t, At as n, Bt as r, Ct as i, Dt as a, Et as o, Ft as s, Gt as c, Ht as l, I as u, It as d, K as f, Kt as p, Mt as m, N as h, Nt as g, O as _, Ot as v, Pt as y, Q as b, Qt as x, R as S, Rt as C, S as ee, St as te, T as ne, Tt as w, Ut as T, Vt as re, X as ie, Y as E, Yt as ae, Z as oe, Zt as se, at as ce, cn as le, ct as ue, dt as de, et as D, gt as fe, it as pe, jt as me, k as he, kt as ge, ln as _e, lt as ve, nt as ye, ot as be, p as xe, rt as Se, tn as Ce, tt as we, ut as Te, w as Ee, wt as De } from "./viewerRuntimeHosts-nMPP59FX.js"; -import { G as Oe, J as ke, N as Ae, R as je, T as Me, Tt as Ne, X as Pe, c as Fe, d as Ie, f as Le, h as Re, ht as ze, j as Be, l as Ve, m as O, o as k, p as He, rt as Ue, s as A, u as We, x as Ge, y as Ke } from "./events-ChGln7ff.js"; -import { F as qe, K as Je, P as Ye, Y as Xe, f as Ze, m as Qe, p as $e } from "./Viewer-BvNSchxR.js"; -import { t as et } from "./floatingViewerManager-DGIaL-BQ.js"; +import { $ as e, $t as t, At as n, Bt as r, Ct as i, Dt as a, Et as o, Ft as s, Gt as c, Ht as l, I as u, It as d, K as f, Kt as p, Mt as m, N as h, Nt as g, O as _, Ot as v, Pt as y, Q as b, Qt as x, R as S, Rt as C, S as ee, St as te, T as ne, Tt as w, Ut as T, Vt as re, X as ie, Y as E, Yt as ae, Z as oe, Zt as se, at as ce, cn as le, ct as ue, dt as de, et as D, gt as fe, it as pe, jt as me, k as he, kt as ge, ln as _e, lt as ve, nt as ye, ot as be, p as xe, rt as Se, tn as Ce, tt as we, ut as Te, w as Ee, wt as De } from "./viewerRuntimeHosts-CkUqwo6l.js"; +import { G as Oe, J as ke, N as Ae, R as je, T as Me, Tt as Ne, X as Pe, c as Fe, d as Ie, f as Le, h as Re, ht as ze, j as Be, l as Ve, m as O, o as k, p as He, rt as Ue, s as A, u as We, x as Ge, y as Ke } from "./events-B9CSrqJ_.js"; +import { F as qe, K as Je, P as Ye, Y as Xe, f as Ze, m as Qe, p as $e } from "./Viewer-BEptWhbV.js"; +import { t as et } from "./floatingViewerManager-DI520cRz.js"; import { A as tt, C as j, D as nt, E as M, G as rt, J as it, K as at, N as ot, O as N, R as st, S as ct, T as P, U as F, V as I, Y as lt, _ as ut, a as dt, b as ft, c as pt, d as mt, dt as L, f as ht, ft as R, g as gt, h as _t, i as vt, j as yt, k as z, l as bt, lt as B, m as xt, n as St, nt as Ct, o as wt, p as Tt, r as Et, rt as V, s as Dt, t as Ot, u as kt, ut as At, y as jt, z as Mt } from "./mjr-primevue-BRqtdXzb.js"; import { t as Nt } from "./mjr-vue-vendor-mHY_eIVE.js"; -import { t as Pt } from "./viewerOpenRequest-POEAWUHf.js"; +import { t as Pt } from "./viewerOpenRequest-B8IT-KHd.js"; import { a as Ft, i as It, n as Lt, o as Rt, r as zt, t as Bt } from "./geninfoParser-CgHp-y-n.js"; // ui/app/settings/settingsUtils.ts var H = (e, t) => { @@ -5171,7 +5171,7 @@ var Vo = ["title"], Ho = ["src"], Uo = { setup(e) { let n = e, r = V(0), i = V(!1), a = null; function o() { - return a ||= import("./floatingViewerManager-DGIaL-BQ.js").then((e) => e.n), a; + return a ||= import("./floatingViewerManager-DI520cRz.js").then((e) => e.n), a; } function s() { return (Array.isArray(n.inputFile?.previewCandidates) ? n.inputFile.previewCandidates : [])[r.value] || ""; diff --git a/dist/chunks/TagsEditor-Dd6Rh_zi.js b/dist/chunks/TagsEditor-gpBsG4si.js similarity index 97% rename from dist/chunks/TagsEditor-Dd6Rh_zi.js rename to dist/chunks/TagsEditor-gpBsG4si.js index 57c85146..07a7afb6 100644 --- a/dist/chunks/TagsEditor-Dd6Rh_zi.js +++ b/dist/chunks/TagsEditor-gpBsG4si.js @@ -1,6 +1,6 @@ -import { $t as e, F as t, v as n } from "./viewerRuntimeHosts-nMPP59FX.js"; -import { m as r, n as i, wt as a } from "./events-ChGln7ff.js"; -import { Y as o } from "./Viewer-BvNSchxR.js"; +import { $t as e, F as t, v as n } from "./viewerRuntimeHosts-CkUqwo6l.js"; +import { m as r, n as i, wt as a } from "./events-B9CSrqJ_.js"; +import { Y as o } from "./Viewer-BEptWhbV.js"; import { A as s, C as c, E as l, G as u, J as d, K as f, L as p, N as m, R as ee, T as h, U as te, V as g, Y as _, b as ne, ft as v, j as y, k as b, lt as x, rt as S, ut as C, z as w } from "./mjr-primevue-BRqtdXzb.js"; // ui/vue/components/common/TagsEditor.vue?vue&type=script&setup=true&lang.ts var T = ["aria-busy"], re = ["aria-label"], ie = { diff --git a/dist/chunks/Viewer-BvNSchxR.js b/dist/chunks/Viewer-BEptWhbV.js similarity index 99% rename from dist/chunks/Viewer-BvNSchxR.js rename to dist/chunks/Viewer-BEptWhbV.js index 6f057fff..ebdde935 100644 --- a/dist/chunks/Viewer-BvNSchxR.js +++ b/dist/chunks/Viewer-BEptWhbV.js @@ -1,9 +1,9 @@ -import { $t as e, H as t, P as n, _ as r, c as i, d as a, g as o, gt as s, n as c, o as l, r as u, s as d, vt as f, x as p, y as m } from "./viewerRuntimeHosts-nMPP59FX.js"; -import { D as h, Tt as g, a as _, at as v, h as y, ht as b, i as x, j as S, k as C, m as w, n as T, o as E, r as D, t as O, ut as k } from "./events-ChGln7ff.js"; +import { $t as e, H as t, P as n, _ as r, c as i, d as a, g as o, gt as s, n as c, o as l, r as u, s as d, vt as f, x as p, y as m } from "./viewerRuntimeHosts-CkUqwo6l.js"; +import { D as h, Tt as g, a as _, at as v, h as y, ht as b, i as x, j as S, k as C, m as w, n as T, o as E, r as D, t as O, ut as k } from "./events-B9CSrqJ_.js"; import { T as A, nt as j, rt as M } from "./mjr-primevue-BRqtdXzb.js"; import { n as N, r as ee } from "./mjr-vue-vendor-mHY_eIVE.js"; import { n as P, r as te, t as F } from "./state-D0Gu1AgG.js"; -import { a as ne, c as re, i as ie, o as ae, r as oe, s as se } from "./model3dRenderer-DcswIkFn.js"; +import { a as ne, c as re, i as ie, o as ae, r as oe, s as se } from "./model3dRenderer-BsJ9YHaZ.js"; // ui/utils/events.ts function ce(e, t, { target: n = null, warnPrefix: r = "[Majoor]" } = {}) { let i = n || (typeof window < "u" ? window : null); @@ -9623,13 +9623,13 @@ var Wr = null, Gr = null, Kr = null, qr = null, Jr = null, Yr = null; function Xr() { Wr || import("./abCompare-BUrGm4-x.js").then((e) => { Wr = e; - }), Gr || import("./sideBySide-t394tgpD.js").then((e) => { + }), Gr || import("./sideBySide-DEEkMdvW.js").then((e) => { Gr = e; - }), Kr || import("./model3dRenderer-DcswIkFn.js").then((e) => e.t).then((e) => { + }), Kr || import("./model3dRenderer-BsJ9YHaZ.js").then((e) => e.t).then((e) => { Kr = e; }), qr || import("./scopes-bvTRS68K.js").then((e) => { qr = e; - }), Jr || import("./genInfo-CYK2drm1.js").then((e) => e.n).then((e) => { + }), Jr || import("./genInfo-C3ZF_agc.js").then((e) => e.n).then((e) => { Jr = e; }), Yr || import("./frameExport-CnNO7oN6.js").then((e) => { Yr = e; diff --git a/dist/chunks/ViewerPortal-BxqCZGmO.js b/dist/chunks/ViewerPortal-CeOkTVnX.js similarity index 97% rename from dist/chunks/ViewerPortal-BxqCZGmO.js rename to dist/chunks/ViewerPortal-CeOkTVnX.js index d099ffb9..d2c6e89e 100644 --- a/dist/chunks/ViewerPortal-BxqCZGmO.js +++ b/dist/chunks/ViewerPortal-CeOkTVnX.js @@ -1,9 +1,9 @@ -import { a as e, i as t } from "./viewerRuntimeHosts-nMPP59FX.js"; -import { r as n } from "./events-ChGln7ff.js"; -import { a as r, c as i, i as a, l as o, o as s, s as c, t as l, u } from "./Viewer-BvNSchxR.js"; -import { i as d, r as f } from "./floatingViewerManager-DGIaL-BQ.js"; +import { a as e, i as t } from "./viewerRuntimeHosts-CkUqwo6l.js"; +import { r as n } from "./events-B9CSrqJ_.js"; +import { a as r, c as i, i as a, l as o, o as s, s as c, t as l, u } from "./Viewer-BEptWhbV.js"; +import { i as d, r as f } from "./floatingViewerManager-DI520cRz.js"; import { B as p, C as m, D as h, E as g, G as _, J as v, K as y, L as b, N as x, O as S, T as C, U as w, V as T, dt as E, ft as D, j as O, k, lt as A, rt as j, ut as M, w as N, z as P } from "./mjr-primevue-BRqtdXzb.js"; -import { t as F } from "./TagsEditor-Dd6Rh_zi.js"; +import { t as F } from "./TagsEditor-gpBsG4si.js"; // ui/vue/components/viewer/FloatingViewerHost.vue var I = /* @__PURE__ */ x({ __name: "FloatingViewerHost", diff --git a/dist/chunks/events-ChGln7ff.js b/dist/chunks/events-B9CSrqJ_.js similarity index 99% rename from dist/chunks/events-ChGln7ff.js rename to dist/chunks/events-B9CSrqJ_.js index 72d6efde..3cd5e445 100644 --- a/dist/chunks/events-ChGln7ff.js +++ b/dist/chunks/events-B9CSrqJ_.js @@ -2190,6 +2190,7 @@ var W = { "dialog.dbDelete.keepVectorsConfirm": "This will reset index data and keep existing AI vectors. Database files will not be force-deleted.\n\nContinue?", "toast.scanStarted": "Scan started", "toast.scanComplete": "Scan complete", + "toast.scanCompleteSummary": "{added} new, {removed} removed", "toast.scanFailed": "Scan failed", "toast.resetTriggered": "Reset triggered: Reindexing all files...", "toast.resetStarted": "Index reset started. Files will be reindexed in the background.", @@ -2427,6 +2428,8 @@ var W = { "dialog.workflowSaveName": "Nom du workflow", "dialog.workflowCategory": "Categorie du workflow", "dialog.deleteWorkflowConfirm": "Supprimer ce JSON workflow et ses thumbnails adjacents ?", + "toast.scanComplete": "Scan terminé", + "toast.scanCompleteSummary": "{added} nouveau(x), {removed} retiré(s)", "toast.workflowSaved": "Workflow enregistre", "toast.workflowSaveFailed": "Echec de l'enregistrement du workflow.", "toast.workflowSerializeFailed": "Impossible de lire le workflow ComfyUI courant.", @@ -3230,6 +3233,7 @@ var Vt = (e) => { ENRICHMENT_STATUS: "mjr-enrichment-status", DB_RESTORE_STATUS: "mjr-db-restore-status", ASSETS_DELETED: "mjr:assets-deleted", + ASSETS_REMOVED: "mjr-assets-removed", SETTINGS_CHANGED: "mjr-settings-changed", SELECTION_CHANGED: "mjr:selection-changed", RELOAD_GRID: "mjr:reload-grid", diff --git a/dist/chunks/floatingViewerManager-DGIaL-BQ.js b/dist/chunks/floatingViewerManager-DI520cRz.js similarity index 99% rename from dist/chunks/floatingViewerManager-DGIaL-BQ.js rename to dist/chunks/floatingViewerManager-DI520cRz.js index 29ec7d2c..75bfc430 100644 --- a/dist/chunks/floatingViewerManager-DGIaL-BQ.js +++ b/dist/chunks/floatingViewerManager-DI520cRz.js @@ -1,6 +1,6 @@ import { t as e } from "./rolldown-runtime-CGnMp29N.js"; -import { _ as t, d as n, o as r, s as i, t as a } from "./viewerRuntimeHosts-nMPP59FX.js"; -import { B as o, o as s, r as c } from "./events-ChGln7ff.js"; +import { _ as t, d as n, o as r, s as i, t as a } from "./viewerRuntimeHosts-CkUqwo6l.js"; +import { B as o, o as s, r as c } from "./events-B9CSrqJ_.js"; // ui/features/panel/panelRuntimeRefs.ts var l = null; function u(e) { @@ -96,7 +96,7 @@ var te = /* @__PURE__ */ e({ teardownFloatingViewerManager: () => we }), v = null, y = null; async function ne() { - return v || (y ||= import("./FloatingViewer-BlImyYVf.js").then((e) => (v = e.FloatingViewer, v)), y); + return v || (y ||= import("./FloatingViewer-Bw0UgjBJ.js").then((e) => (v = e.FloatingViewer, v)), y); } var b = null, re = null; async function ie() { diff --git a/dist/chunks/genInfo-CYK2drm1.js b/dist/chunks/genInfo-C3ZF_agc.js similarity index 99% rename from dist/chunks/genInfo-CYK2drm1.js rename to dist/chunks/genInfo-C3ZF_agc.js index 6fac0e2f..e5912971 100644 --- a/dist/chunks/genInfo-CYK2drm1.js +++ b/dist/chunks/genInfo-C3ZF_agc.js @@ -1,7 +1,7 @@ import { t as e } from "./rolldown-runtime-CGnMp29N.js"; -import { m as t, o as n } from "./events-ChGln7ff.js"; -import { h as r } from "./Viewer-BvNSchxR.js"; -import { i, n as a, r as o, t as s, u as c } from "./SidebarWorkflowSection-BR3ECa3i.js"; +import { m as t, o as n } from "./events-B9CSrqJ_.js"; +import { h as r } from "./Viewer-BEptWhbV.js"; +import { i, n as a, r as o, t as s, u as c } from "./SidebarWorkflowSection-BjUgGET_.js"; import { D as l, E as u, N as d, O as f, T as p, V as m, dt as h, ft as g, k as _, lt as v } from "./mjr-primevue-BRqtdXzb.js"; // ui/vue/components/viewer/ViewerMetadataBlock.vue?vue&type=script&setup=true&lang.ts var y = { style: { diff --git a/dist/chunks/model3dRenderer-DcswIkFn.js b/dist/chunks/model3dRenderer-BsJ9YHaZ.js similarity index 99% rename from dist/chunks/model3dRenderer-DcswIkFn.js rename to dist/chunks/model3dRenderer-BsJ9YHaZ.js index d728cab0..d618496f 100644 --- a/dist/chunks/model3dRenderer-DcswIkFn.js +++ b/dist/chunks/model3dRenderer-BsJ9YHaZ.js @@ -1,5 +1,5 @@ import { t as e } from "./rolldown-runtime-CGnMp29N.js"; -import { gt as t, m as n, o as r, r as i } from "./events-ChGln7ff.js"; +import { gt as t, m as n, o as r, r as i } from "./events-B9CSrqJ_.js"; import { n as a } from "./state-D0Gu1AgG.js"; // ui/features/viewer/model3dCore.ts function o(e, t) { diff --git a/dist/chunks/openMajoorSettings-CdWVeKk-.js b/dist/chunks/openMajoorSettings-BZtL8v_l.js similarity index 99% rename from dist/chunks/openMajoorSettings-CdWVeKk-.js rename to dist/chunks/openMajoorSettings-BZtL8v_l.js index c030b002..888211a0 100644 --- a/dist/chunks/openMajoorSettings-CdWVeKk-.js +++ b/dist/chunks/openMajoorSettings-BZtL8v_l.js @@ -1,6 +1,6 @@ -import { A as e, E as t, S as n, Z as r, b as i, j as a, m as o, z as s } from "./events-ChGln7ff.js"; +import { A as e, E as t, S as n, Z as r, b as i, j as a, m as o, z as s } from "./events-B9CSrqJ_.js"; import { a as c, n as l } from "./graphTraversal-DTdQWkn5.js"; -import { S as u, Y as d, b as f, x as p, y as m } from "./SidebarWorkflowSection-BR3ECa3i.js"; +import { S as u, Y as d, b as f, x as p, y as m } from "./SidebarWorkflowSection-BjUgGET_.js"; // ui/features/viewer/floatingViewerProgress.ts var h = "progress-update", g = "__MJR_MFV_PROGRESS_SERVICE__"; function ee() { diff --git a/dist/chunks/sideBySide-t394tgpD.js b/dist/chunks/sideBySide-DEEkMdvW.js similarity index 99% rename from dist/chunks/sideBySide-t394tgpD.js rename to dist/chunks/sideBySide-DEEkMdvW.js index 139a7a1a..8f3be2d9 100644 --- a/dist/chunks/sideBySide-t394tgpD.js +++ b/dist/chunks/sideBySide-DEEkMdvW.js @@ -1,4 +1,4 @@ -import { i as e } from "./model3dRenderer-DcswIkFn.js"; +import { i as e } from "./model3dRenderer-BsJ9YHaZ.js"; import { i as t, o as n } from "./geninfoParser-CgHp-y-n.js"; // ui/features/viewer/sideBySide.ts function r(e) { diff --git a/dist/chunks/viewerOpenRequest-POEAWUHf.js b/dist/chunks/viewerOpenRequest-B8IT-KHd.js similarity index 90% rename from dist/chunks/viewerOpenRequest-POEAWUHf.js rename to dist/chunks/viewerOpenRequest-B8IT-KHd.js index 46eca328..0f66beed 100644 --- a/dist/chunks/viewerOpenRequest-POEAWUHf.js +++ b/dist/chunks/viewerOpenRequest-B8IT-KHd.js @@ -1,6 +1,6 @@ import { t as e } from "./rolldown-runtime-CGnMp29N.js"; -import { r as t } from "./events-ChGln7ff.js"; -import { t as n } from "./Viewer-BvNSchxR.js"; +import { r as t } from "./events-B9CSrqJ_.js"; +import { t as n } from "./Viewer-BEptWhbV.js"; // ui/features/viewer/viewerOpenRequest.ts var r = /* @__PURE__ */ e({ requestViewerOpen: () => o }); function i(e) { diff --git a/dist/chunks/viewerRuntimeHosts-nMPP59FX.js b/dist/chunks/viewerRuntimeHosts-CkUqwo6l.js similarity index 99% rename from dist/chunks/viewerRuntimeHosts-nMPP59FX.js rename to dist/chunks/viewerRuntimeHosts-CkUqwo6l.js index 828c88e5..c1d327bc 100644 --- a/dist/chunks/viewerRuntimeHosts-nMPP59FX.js +++ b/dist/chunks/viewerRuntimeHosts-CkUqwo6l.js @@ -1,4 +1,4 @@ -import { Ct as e, Tt as t, _t as n, bt as r, it as i, k as a, m as o, o as s, rt as c, vt as l, wt as u, yt as d } from "./events-ChGln7ff.js"; +import { Ct as e, Tt as t, _t as n, bt as r, it as i, k as a, m as o, o as s, rt as c, vt as l, wt as u, yt as d } from "./events-B9CSrqJ_.js"; // ui/app/settingsStore.ts var f = "mjrSettings", p = "mjrMinimapSettings", m = /* @__PURE__ */ new Set([ "POST", diff --git a/dist/entry.js b/dist/entry.js index f914cfbf..e2779a56 100644 --- a/dist/entry.js +++ b/dist/entry.js @@ -1,13 +1,13 @@ -import { $t as e, A as t, B as n, Bt as r, C as i, D as a, E as o, Et as s, G as c, H as l, J as u, Jt as d, L as f, Lt as p, M as m, N as h, O as g, P as _, Rt as v, S as y, U as b, Ut as x, V as S, Vt as C, W as w, Wt as T, Xt as E, Yt as D, _ as O, _t as k, an as A, b as j, bt as M, c as N, d as P, en as ee, f as te, ft as F, g as I, gt as ne, h as re, ht as ie, in as ae, j as oe, jt as se, k as L, l as ce, m as le, mt as ue, nn as de, o as fe, on as pe, pt as me, q as he, qt as ge, rn as _e, s as ve, sn as ye, st as be, tn as xe, u as Se, ut as Ce, vt as we, w as Te, xt as Ee, y as De, yt as Oe, z as ke, zt as Ae } from "./chunks/viewerRuntimeHosts-nMPP59FX.js"; -import { $ as je, A as Me, Ct as Ne, F as Pe, J as Fe, K as Ie, L as Le, Q as Re, St as ze, Tt as Be, U as Ve, W as He, Y as Ue, _ as We, at as Ge, ct as Ke, dt as qe, et as Je, ft as Ye, g as Xe, ht as Ze, j as Qe, lt as $e, m as R, mt as et, n as z, nt as tt, o as B, ot as nt, pt as rt, q as it, r as V, rt as at, st as ot, t as st, tt as ct, ut as lt, wt as ut, xt as dt } from "./chunks/events-ChGln7ff.js"; +import { $t as e, A as t, B as n, Bt as r, C as i, D as a, E as o, Et as s, G as c, H as l, J as u, Jt as d, L as f, Lt as p, M as m, N as h, O as g, P as _, Rt as v, S as y, U as b, Ut as x, V as S, Vt as C, W as w, Wt as T, Xt as E, Yt as D, _ as O, _t as k, an as A, b as j, bt as M, c as N, d as P, en as ee, f as te, ft as F, g as I, gt as ne, h as re, ht as ie, in as ae, j as oe, jt as se, k as L, l as ce, m as le, mt as ue, nn as de, o as fe, on as pe, pt as me, q as he, qt as ge, rn as _e, s as ve, sn as ye, st as be, tn as xe, u as Se, ut as Ce, vt as we, w as Te, xt as Ee, y as De, yt as Oe, z as ke, zt as Ae } from "./chunks/viewerRuntimeHosts-CkUqwo6l.js"; +import { $ as je, A as Me, Ct as Ne, F as Pe, J as Fe, K as Ie, L as Le, Q as Re, St as ze, Tt as Be, U as Ve, W as He, Y as Ue, _ as We, at as Ge, ct as Ke, dt as qe, et as Je, ft as Ye, g as Xe, ht as Ze, j as Qe, lt as $e, m as R, mt as et, n as z, nt as tt, o as B, ot as nt, pt as rt, q as it, r as V, rt as at, st as ot, t as st, tt as ct, ut as lt, wt as ut, xt as dt } from "./chunks/events-B9CSrqJ_.js"; import { a as ft, i as pt, n as mt, t as ht } from "./chunks/graphTraversal-DTdQWkn5.js"; -import { A as gt, B as _t, C as vt, D as yt, E as bt, F as xt, G as St, H as Ct, I as wt, J as Tt, L as Et, M as Dt, N as Ot, O as kt, P as At, R as jt, S as Mt, T as Nt, U as Pt, V as Ft, W as It, Y as Lt, _ as Rt, b as zt, d as Bt, g as Vt, j as Ht, k as Ut, q as Wt, v as Gt, x as Kt, y as qt, z as Jt } from "./chunks/Viewer-BvNSchxR.js"; -import { $ as Yt, A as Xt, B as Zt, C as Qt, D as $t, E as en, F as tn, G as nn, H as rn, I as an, J as on, K as sn, L as cn, M as ln, N as un, O as dn, P as fn, Q as pn, R as mn, T as hn, U as gn, V as _n, W as vn, X as yn, Y as bn, Z as xn, _ as Sn, a as Cn, c as wn, d as Tn, et as En, f as Dn, g as On, h as kn, i as An, j as jn, k as Mn, l as Nn, m as Pn, n as Fn, nt as In, o as Ln, p as Rn, q as zn, s as Bn, t as Vn, tt as Hn, u as Un, w as Wn, z as Gn } from "./chunks/SidebarWorkflowSection-BR3ECa3i.js"; -import { _ as Kn, i as qn, n as Jn, p as Yn, t as Xn } from "./chunks/openMajoorSettings-CdWVeKk-.js"; -import { a as Zn, c as Qn, l as $n, o as er, s as tr, u as nr } from "./chunks/floatingViewerManager-DGIaL-BQ.js"; +import { A as gt, B as _t, C as vt, D as yt, E as bt, F as xt, G as St, H as Ct, I as wt, J as Tt, L as Et, M as Dt, N as Ot, O as kt, P as At, R as jt, S as Mt, T as Nt, U as Pt, V as Ft, W as It, Y as Lt, _ as Rt, b as zt, d as Bt, g as Vt, j as Ht, k as Ut, q as Wt, v as Gt, x as Kt, y as qt, z as Jt } from "./chunks/Viewer-BEptWhbV.js"; +import { $ as Yt, A as Xt, B as Zt, C as Qt, D as $t, E as en, F as tn, G as nn, H as rn, I as an, J as on, K as sn, L as cn, M as ln, N as un, O as dn, P as fn, Q as pn, R as mn, T as hn, U as gn, V as _n, W as vn, X as yn, Y as bn, Z as xn, _ as Sn, a as Cn, c as wn, d as Tn, et as En, f as Dn, g as On, h as kn, i as An, j as jn, k as Mn, l as Nn, m as Pn, n as Fn, nt as In, o as Ln, p as Rn, q as zn, s as Bn, t as Vn, tt as Hn, u as Un, w as Wn, z as Gn } from "./chunks/SidebarWorkflowSection-BjUgGET_.js"; +import { _ as Kn, i as qn, n as Jn, p as Yn, t as Xn } from "./chunks/openMajoorSettings-BZtL8v_l.js"; +import { a as Zn, c as Qn, l as $n, o as er, s as tr, u as nr } from "./chunks/floatingViewerManager-DI520cRz.js"; import { A as rr, B as ir, C as H, D as ar, E as U, G as or, H as sr, I as cr, J as W, K as lr, L as ur, M as dr, N as fr, O as G, P as pr, R as mr, S as hr, T as K, U as gr, V as q, W as _r, Y as vr, at as yr, b as br, ct as xr, dt as Sr, ft as J, it as Cr, j as Y, k as X, lt as Z, nt as wr, q as Tr, rt as Q, tt as Er, ut as Dr, v as Or, w as kr, x as Ar, y as jr, z as Mr } from "./chunks/mjr-primevue-BRqtdXzb.js"; import { n as Nr, r as Pr } from "./chunks/mjr-vue-vendor-mHY_eIVE.js"; -import { t as Fr } from "./chunks/TagsEditor-Dd6Rh_zi.js"; +import { t as Fr } from "./chunks/TagsEditor-gpBsG4si.js"; import { app as Ir } from "../../scripts/app.js"; function Lr(e = null) { return null; @@ -869,7 +869,7 @@ var ji = { } }, Mi = null; function Ni() { - return Mi ||= import("./chunks/viewerOpenRequest-POEAWUHf.js").then((e) => e.n), Mi; + return Mi ||= import("./chunks/viewerOpenRequest-B8IT-KHd.js").then((e) => e.n), Mi; } function Pi(e) { if (!e) return ""; @@ -1361,10 +1361,10 @@ function Hi() { // ui/features/contextmenu/GridContextMenu.ts var Ui = 1, Wi = null, Gi = null; function Ki() { - return Wi ||= import("./chunks/viewerOpenRequest-POEAWUHf.js").then((e) => e.n), Wi; + return Wi ||= import("./chunks/viewerOpenRequest-B8IT-KHd.js").then((e) => e.n), Wi; } function qi() { - return Gi ||= import("./chunks/floatingViewerManager-DGIaL-BQ.js").then((e) => e.n), Gi; + return Gi ||= import("./chunks/floatingViewerManager-DI520cRz.js").then((e) => e.n), Gi; } function Ji(e) { let t = String(e || "").trim().toLowerCase(); @@ -7556,10 +7556,10 @@ var Bu = { Q(!0); let s = Q(0), c = Q(0), l = /* @__PURE__ */ new WeakMap(), u = 0, d = 0, f = 0, p = 0, m = 0, h = /* @__PURE__ */ new Map(), g = null, _ = null; function v() { - return g ||= import("./chunks/viewerOpenRequest-POEAWUHf.js").then((e) => e.n), g; + return g ||= import("./chunks/viewerOpenRequest-B8IT-KHd.js").then((e) => e.n), g; } function b() { - return _ ||= import("./chunks/floatingViewerManager-DGIaL-BQ.js").then((e) => e.n), _; + return _ ||= import("./chunks/floatingViewerManager-DI520cRz.js").then((e) => e.n), _; } function x(e) { return (Array.isArray(e) ? e : []).slice().sort((e, t) => { @@ -8824,10 +8824,10 @@ var Bu = { } }), td = 240, nd = 120, rd = 80, id = null, ad = null; function od() { - return id ||= import("./chunks/viewerOpenRequest-POEAWUHf.js").then((e) => e.n), id; + return id ||= import("./chunks/viewerOpenRequest-B8IT-KHd.js").then((e) => e.n), id; } function sd() { - return ad ||= import("./chunks/floatingViewerManager-DGIaL-BQ.js").then((e) => e.n), ad; + return ad ||= import("./chunks/floatingViewerManager-DI520cRz.js").then((e) => e.n), ad; } function cd(e) { let t = document.createElement("button"); @@ -10553,11 +10553,42 @@ async function rp({ api: e, runtime: t, executionRuntime: n, appRef: r, liveStre }, _(t, e, V.STRUCTURED_EVENT, e._mjrStructuredEventHandler), e._mjrScanCompleteHandler = (e) => { try { let t = e?.detail || {}; - window.dispatchEvent(new CustomEvent(V.SCAN_COMPLETE, { detail: t })); + window.dispatchEvent(new CustomEvent(V.SCAN_COMPLETE, { detail: t })), x(t); } catch (e) { console.debug?.(e); } - }, _(t, e, V.SCAN_COMPLETE, e._mjrScanCompleteHandler), e._mjrCoreExecutionAssetsReadyHandler = (e) => { + }, _(t, e, V.SCAN_COMPLETE, e._mjrScanCompleteHandler); + function x(e) { + if (globalThis?._mjrMaintenanceActive) return; + let t = Math.max(0, Number(e?.added) || 0), n = Math.max(0, Number(e?.pruned) || 0); + e?.needs_refresh && window.dispatchEvent(new CustomEvent(V.RELOAD_GRID, { detail: { + reason: "scan-complete", + added: t, + removed: n + } })), String(e?.origin || "") === "directory_scan" && (t || n) && m({ + summary: h("toast.scanComplete", "Scan complete"), + detail: h("toast.scanCompleteSummary", "{added} new, {removed} removed", { + added: t, + removed: n + }) + }, "success", 3500, { history: { + source: "scan", + operation: "scan", + status: "done" + } }); + } + e._mjrAssetsRemovedHandler = (e) => { + try { + let t = e?.detail || {}, n = Array.isArray(t?.ids) ? t.ids.map((e) => String(e ?? "").trim()).filter(Boolean) : []; + n.length && window.dispatchEvent(new CustomEvent(V.ASSETS_DELETED, { detail: { + ids: n, + source: "backend", + reason: t?.reason || "" + } })), t?.truncated && window.dispatchEvent(new CustomEvent(V.RELOAD_GRID, { detail: { reason: "assets-removed" } })); + } catch (e) { + console.debug?.(e); + } + }, _(t, e, V.ASSETS_REMOVED, e._mjrAssetsRemovedHandler), e._mjrCoreExecutionAssetsReadyHandler = (e) => { try { let t = e?.detail || {}; window.dispatchEvent(new CustomEvent(V.CORE_EXECUTION_ASSETS_READY, { detail: t })); @@ -10646,7 +10677,7 @@ async function rp({ api: e, runtime: t, executionRuntime: n, appRef: r, liveStre console.debug?.(e); } }, _(t, e, V.DB_RESTORE_STATUS, e._mjrDbRestoreStatusHandler); - let x = (e) => { + let S = (e) => { try { let t = Array.isArray(e?.detail?.ids) ? e.detail.ids.map((e) => String(e || "")).filter(Boolean) : []; if (!t.length) return; @@ -10656,7 +10687,7 @@ async function rp({ api: e, runtime: t, executionRuntime: n, appRef: r, liveStre console.debug?.(e); } }; - _(t, window, V.ASSETS_DELETED, x), t && typeof t == "object" && (t.api = e, t.assetsDeletedHandler = x), console.debug("[Majoor] Real-time listener registered"); + _(t, window, V.ASSETS_DELETED, S), t && typeof t == "object" && (t.api = e, t.assetsDeletedHandler = S), console.debug("[Majoor] Real-time listener registered"); } // ui/features/runtime/entryDebugApi.ts function ip({ resolveNodeStreamModule: e }) { @@ -11037,7 +11068,7 @@ function Lp() { var Rp = /* @__PURE__ */ fr({ __name: "GlobalRuntime", setup(e) { - let t = dr(() => import("./chunks/ViewerPortal-BxqCZGmO.js")), n = Q(!1), r = [ + let t = dr(() => import("./chunks/ViewerPortal-CeOkTVnX.js")), n = Q(!1), r = [ V.OPEN_VIEWER, V.MFV_OPEN, V.MFV_TOGGLE, @@ -23893,7 +23924,7 @@ async function vC(e) { try { let t = await hC(e); if (t.length) { - let { floatingViewerManager: e } = await import("./chunks/floatingViewerManager-DGIaL-BQ.js").then((e) => e.n); + let { floatingViewerManager: e } = await import("./chunks/floatingViewerManager-DI520cRz.js").then((e) => e.n); if (await e.openAssets({ assets: t, index: 0 @@ -24236,7 +24267,7 @@ function zC(t, n, { sidebarTabId: r }) { var BC = "__MJR_ENTRY_RUNTIME__"; function VC(e, t) { if (e) try { - e._mjrAssetUpdateReloadTimer &&= (clearTimeout(e._mjrAssetUpdateReloadTimer), null), e._mjrExecutedHandler && e.removeEventListener("executed", e._mjrExecutedHandler), e._mjrAssetAddedHandler && e.removeEventListener("mjr-asset-added", e._mjrAssetAddedHandler), e._mjrAssetUpdatedHandler && e.removeEventListener("mjr-asset-updated", e._mjrAssetUpdatedHandler), e._mjrStructuredEventHandler && e.removeEventListener(V.STRUCTURED_EVENT, e._mjrStructuredEventHandler), e._mjrScanCompleteHandler && e.removeEventListener(V.SCAN_COMPLETE, e._mjrScanCompleteHandler), e._mjrScanProgressHandler && e.removeEventListener(V.SCAN_PROGRESS, e._mjrScanProgressHandler), e._mjrAssetIndexingHandler && e.removeEventListener(V.ASSET_INDEXING, e._mjrAssetIndexingHandler), e._mjrAssetIndexedHandler && e.removeEventListener(V.ASSET_INDEXED, e._mjrAssetIndexedHandler), e._mjrExecutionStartHandler && e.removeEventListener("execution_start", e._mjrExecutionStartHandler), e._mjrExecutionEndHandler && (e.removeEventListener("execution_success", e._mjrExecutionEndHandler), e.removeEventListener("execution_error", e._mjrExecutionEndHandler), e.removeEventListener("execution_interrupted", e._mjrExecutionEndHandler)), e._mjrStacksUpdatedHandler && e.removeEventListener("mjr.stacks.updated", e._mjrStacksUpdatedHandler), e._mjrEnrichmentStatusHandler && e.removeEventListener(V.ENRICHMENT_STATUS, e._mjrEnrichmentStatusHandler), e._mjrDbRestoreStatusHandler && e.removeEventListener(V.DB_RESTORE_STATUS, e._mjrDbRestoreStatusHandler), e._mjrRuntimeStatusHandler && (e.removeEventListener("progress", e._mjrRuntimeStatusHandler), e.removeEventListener("status", e._mjrRuntimeStatusHandler), e.removeEventListener(V.RUNTIME_STATUS, e._mjrRuntimeStatusHandler), e.removeEventListener("execution_cached", e._mjrExecutionCachedHandler)); + e._mjrAssetUpdateReloadTimer &&= (clearTimeout(e._mjrAssetUpdateReloadTimer), null), e._mjrExecutedHandler && e.removeEventListener("executed", e._mjrExecutedHandler), e._mjrAssetAddedHandler && e.removeEventListener("mjr-asset-added", e._mjrAssetAddedHandler), e._mjrAssetUpdatedHandler && e.removeEventListener("mjr-asset-updated", e._mjrAssetUpdatedHandler), e._mjrStructuredEventHandler && e.removeEventListener(V.STRUCTURED_EVENT, e._mjrStructuredEventHandler), e._mjrScanCompleteHandler && e.removeEventListener(V.SCAN_COMPLETE, e._mjrScanCompleteHandler), e._mjrAssetsRemovedHandler && e.removeEventListener(V.ASSETS_REMOVED, e._mjrAssetsRemovedHandler), e._mjrScanProgressHandler && e.removeEventListener(V.SCAN_PROGRESS, e._mjrScanProgressHandler), e._mjrAssetIndexingHandler && e.removeEventListener(V.ASSET_INDEXING, e._mjrAssetIndexingHandler), e._mjrAssetIndexedHandler && e.removeEventListener(V.ASSET_INDEXED, e._mjrAssetIndexedHandler), e._mjrExecutionStartHandler && e.removeEventListener("execution_start", e._mjrExecutionStartHandler), e._mjrExecutionEndHandler && (e.removeEventListener("execution_success", e._mjrExecutionEndHandler), e.removeEventListener("execution_error", e._mjrExecutionEndHandler), e.removeEventListener("execution_interrupted", e._mjrExecutionEndHandler)), e._mjrStacksUpdatedHandler && e.removeEventListener("mjr.stacks.updated", e._mjrStacksUpdatedHandler), e._mjrEnrichmentStatusHandler && e.removeEventListener(V.ENRICHMENT_STATUS, e._mjrEnrichmentStatusHandler), e._mjrDbRestoreStatusHandler && e.removeEventListener(V.DB_RESTORE_STATUS, e._mjrDbRestoreStatusHandler), e._mjrRuntimeStatusHandler && (e.removeEventListener("progress", e._mjrRuntimeStatusHandler), e.removeEventListener("status", e._mjrRuntimeStatusHandler), e.removeEventListener(V.RUNTIME_STATUS, e._mjrRuntimeStatusHandler), e.removeEventListener("execution_cached", e._mjrExecutionCachedHandler)); } catch (e) { t?.(e, "entry.removeApiHandlers"); } @@ -24363,7 +24394,7 @@ function GC({ cleanupEntryRuntimeFn: e = UC, teardownLiveStreamTracker: t, teard // ui/entry.ts var KC = null, qC = null, JC = null; function YC() { - return JC ||= import("./chunks/floatingViewerManager-DGIaL-BQ.js").then((e) => e.n), JC; + return JC ||= import("./chunks/floatingViewerManager-DI520cRz.js").then((e) => e.n), JC; } function XC() { JC && JC.then((e) => e?.teardownFloatingViewerManager?.()).catch((e) => console.debug?.("[Majoor] MFV teardown skipped", e)); @@ -24483,7 +24514,7 @@ function hw(e = 1200) { }, Math.max(250, Number(e) || 0)); } function gw(e) { - import("./chunks/LiveStreamTracker-DhOEgG4Z.js").then((t) => { + import("./chunks/LiveStreamTracker-CUeCguVd.js").then((t) => { KC = t; try { t.initLiveStreamTracker(e); diff --git a/docs/COMFYUI_INTEGRATION_AUDIT.md b/docs/COMFYUI_INTEGRATION_AUDIT.md index 2f4f5e1b..f94be79d 100644 --- a/docs/COMFYUI_INTEGRATION_AUDIT.md +++ b/docs/COMFYUI_INTEGRATION_AUDIT.md @@ -102,6 +102,31 @@ Imports non triés dans 5 fichiers (`ruff --fix`) qui faisaient échouer | Démontage | Les toasts en cours restaient affichés. | `dismissTrackedToasts()` à l'arrêt de l'extension. | | Centre de messages (cloche) | S'ouvrait tout seul lors d'une réinitialisation ou d'un backfill. | Conservé comme **historique consultable** (notes de version, journal, raccourcis), car ComfyUI n'offre pas de boîte de réception aux extensions ; il ne s'ouvre plus de lui-même. | +## 3 ter. Nouveaux assets, suppressions et scans (comparaison avec ComfyUI core) + +Comment fait le core (`app/assets`, `comfy_execution/asset_enrichment.py`) : +- il enregistre les sorties **au moment où `executed` est émis**, y compris pour les exécutions servies depuis le cache, sans attendre de scan disque ; +- un fichier disparu est marqué `is_missing` et **récupéré** s'il revient avec le même hash ; un état illisible est « instable » et ne supprime rien ; +- les scans de fond sont mis en pause pendant une génération et signalés par les événements `assets.seed.*`. + +| Constat Majoor | Gravité | Correctif | +| --- | --- | --- | +| Triggers `assets_fts` (FTS5 à contenu externe) écrits avec `UPDATE`/`DELETE` : **chaque renommage ou déplacement échouait** (« database disk image is malformed »). Le watcher retombait sur supprimer + réindexer, d'où un nouvel id et la **perte des notes, tags et collections**, plus une fausse « récupération de base corrompue ». | Critique | Triggers avec la commande FTS5 `'delete'`, mise à jour limitée à `filename, subfolder` ; réparation automatique des bases existantes au démarrage, avec reconstruction de l'index (`'rebuild'`). | +| `on_prompt_end` est appelé **avant** `PromptQueue.task_done()` (`main.py` du core) : l'ingestion post-génération pouvait lire un historique vide et n'indexer rien. Le frontend ne couvre que le client qui a lancé le prompt (`executed` n'est envoyé qu'à lui). | Haute | Attente de l'entrée d'historique (backoff 0,05 à 3,2 s, environ 6 s au maximum). | +| Prune de scan : une erreur de `stat` (partage réseau, permission) comptait comme « fichier supprimé », et les données utilisateur étaient effacées. | Haute | Existence à trois états (présent / absent / inconnu) ; racine illisible = aucun prune. | +| Suppressions et déplacements détectés par le watcher ou le prune : aucun événement, cartes périmées dans la grille. | Moyenne | `mjr-assets-removed` (ids) et `mjr-asset-updated` (nouveau chemin) ; le frontend réutilise le retrait en place des suppressions faites depuis l'interface. | +| Scan de fond terminé : aucun rafraîchissement de grille ni notification ; compteur `pruned` gonflé par les cascades. | Moyenne | `mjr-scan-complete` porte `origin` et `needs_refresh` ; un seul rechargement si nécessaire ; un toast natif « N nouveaux, M retirés » pour un scan de dossier ; silence pour les indexations par génération, déjà couvertes par les cartes en direct et le badge. | + +Vérifié sans changement : +- le badge de la barre latérale et le flux de génération dédupliquent chaque asset ; +- l'indexation vectorielle automatique est dédupliquée ; +- le rechargement après `mjr-core-execution-assets-ready` sert à finaliser les piles d'exécution et il est différé quand la grille est cachée. + +Pistes restantes : +- marquage « manquant » réversible façon core, plutôt qu'une suppression définitive, pour récupérer un fichier qui revient ; cela demande une migration de schéma ; +- retirer aussi du flux de génération les éléments supprimés hors de l'interface ; +- un seul événement par nouvel asset au lieu de `mjr-asset-added` plus `mjr.asset.indexed` (chacun doublé par l'enveloppe `mjr.event`). + ## 4. Feuille de route d'évolution (meilleure intégration) 1. **Progression par nœud** — écouter l'événement websocket `progress_state` diff --git a/mjr_am_backend/adapters/comfy_core.py b/mjr_am_backend/adapters/comfy_core.py index 4b5ba7dc..1f75c322 100644 --- a/mjr_am_backend/adapters/comfy_core.py +++ b/mjr_am_backend/adapters/comfy_core.py @@ -533,6 +533,17 @@ def get_prompt_output_files(prompt_id: str) -> list[PromptOutputFile]: return _ADAPTER.output_files_from_history(prompt_id) +def has_prompt_history_entry(prompt_id: str) -> bool: + """True once ComfyUI has stored the history entry for ``prompt_id``.""" + safe_prompt_id = str(prompt_id or "").strip() + if not safe_prompt_id: + return False + try: + return isinstance(_ADAPTER.get_prompt_history(safe_prompt_id).get(safe_prompt_id), dict) + except Exception: + return False + + def get_workflow_id_for_prompt(prompt_id: str) -> str | None: """Best-effort extraction of the workflow id associated with a prompt. diff --git a/mjr_am_backend/adapters/db/schema_fts.py b/mjr_am_backend/adapters/db/schema_fts.py index 2a5fdce2..1e329425 100644 --- a/mjr_am_backend/adapters/db/schema_fts.py +++ b/mjr_am_backend/adapters/db/schema_fts.py @@ -212,7 +212,16 @@ async def _assets_fts_needs_rebuild(db) -> bool: ddl_lower = (await _sqlite_object_sql(db, "table", "assets_fts")).lower() trig_row = await db.aquery("SELECT name FROM sqlite_master WHERE type='trigger' AND name LIKE 'assets_fts_%'") triggers_exist = bool(trig_row.ok and trig_row.data) - return bool((not ddl_lower) or ("fts5" not in ddl_lower) or (not triggers_exist)) + if (not ddl_lower) or ("fts5" not in ddl_lower) or (not triggers_exist): + return True + # Databases created before the fix carry delete/update triggers that issue a + # plain DELETE/UPDATE on this external-content table; that corrupts the + # index on every rename/move. Replace them (and rebuild the index) once. + for trigger in ("assets_fts_delete", "assets_fts_update"): + sql_lower = " ".join((await _sqlite_object_sql(db, "trigger", trigger)).lower().split()) + if "'delete'" not in sql_lower: + return True + return False async def _drop_assets_fts_objects(db) -> None: @@ -248,25 +257,24 @@ async def _create_assets_fts_triggers(db) -> None: END; CREATE TRIGGER IF NOT EXISTS assets_fts_delete AFTER DELETE ON assets BEGIN - DELETE FROM assets_fts WHERE rowid = old.id; + INSERT INTO assets_fts(assets_fts, rowid, filename, subfolder) + VALUES ('delete', old.id, old.filename, old.subfolder); END; - CREATE TRIGGER IF NOT EXISTS assets_fts_update AFTER UPDATE ON assets BEGIN - UPDATE assets_fts SET filename = new.filename, subfolder = new.subfolder - WHERE rowid = new.id; + CREATE TRIGGER IF NOT EXISTS assets_fts_update AFTER UPDATE OF filename, subfolder ON assets BEGIN + INSERT INTO assets_fts(assets_fts, rowid, filename, subfolder) + VALUES ('delete', old.id, old.filename, old.subfolder); + INSERT INTO assets_fts(rowid, filename, subfolder) + VALUES (new.id, new.filename, new.subfolder); END; """ ) async def _rebuild_assets_fts_content(db) -> None: - await db.aexecutescript( - """ - DELETE FROM assets_fts; - INSERT INTO assets_fts(rowid, filename, subfolder) - SELECT id, COALESCE(filename, ''), COALESCE(subfolder, '') FROM assets; - """ - ) + # External-content FTS5: 'rebuild' re-reads every row of ``assets``; a plain + # DELETE FROM would go through the content table and is not allowed here. + await db.aexecutescript("INSERT INTO assets_fts(assets_fts) VALUES('rebuild');") async def repair_assets_fts(db) -> Result[bool]: diff --git a/mjr_am_backend/adapters/db/schema_sql.py b/mjr_am_backend/adapters/db/schema_sql.py index 7a90af9e..1724d6b7 100644 --- a/mjr_am_backend/adapters/db/schema_sql.py +++ b/mjr_am_backend/adapters/db/schema_sql.py @@ -242,13 +242,21 @@ CREATE TRIGGER IF NOT EXISTS assets_fts_insert AFTER INSERT ON assets BEGIN VALUES (new.id, new.filename, new.subfolder); END; +-- assets_fts is an external-content FTS5 table (content='assets'): rows must be +-- removed with the special 'delete' command carrying the OLD values. A plain +-- DELETE/UPDATE on it makes FTS5 re-read the content table, which an AFTER +-- trigger has already changed, and fails with "database disk image is +-- malformed" whenever filename/subfolder change (rename, move). CREATE TRIGGER IF NOT EXISTS assets_fts_delete AFTER DELETE ON assets BEGIN - DELETE FROM assets_fts WHERE rowid = old.id; + INSERT INTO assets_fts(assets_fts, rowid, filename, subfolder) + VALUES ('delete', old.id, old.filename, old.subfolder); END; -CREATE TRIGGER IF NOT EXISTS assets_fts_update AFTER UPDATE ON assets BEGIN - UPDATE assets_fts SET filename = new.filename, subfolder = new.subfolder - WHERE rowid = new.id; +CREATE TRIGGER IF NOT EXISTS assets_fts_update AFTER UPDATE OF filename, subfolder ON assets BEGIN + INSERT INTO assets_fts(assets_fts, rowid, filename, subfolder) + VALUES ('delete', old.id, old.filename, old.subfolder); + INSERT INTO assets_fts(rowid, filename, subfolder) + VALUES (new.id, new.filename, new.subfolder); END; CREATE TRIGGER IF NOT EXISTS asset_metadata_fts_insert AFTER INSERT ON asset_metadata BEGIN diff --git a/mjr_am_backend/features/index/scan_prune.py b/mjr_am_backend/features/index/scan_prune.py index 9c44094d..3aa2ae6b 100644 --- a/mjr_am_backend/features/index/scan_prune.py +++ b/mjr_am_backend/features/index/scan_prune.py @@ -1,4 +1,13 @@ -"""Prune indexed assets that disappeared from disk during a directory scan.""" +"""Prune indexed assets that disappeared from disk during a directory scan. + +Like ComfyUI core's asset reconciler (``app/assets/scanner_changes.py``), a +file is only treated as gone when the filesystem positively says so. A stat +that fails for any other reason (permission error, network share hiccup, +unmounted drive) is "unknown" and never deletes a row -- deleting it would +throw away the user's ratings, tags and collections for a file that is +still there. Removed ids are announced with a ``mjr-assets-removed`` event so +open grids drop the cards without a full reload. +""" from __future__ import annotations @@ -30,16 +39,60 @@ def _is_direct_child(filepath: str, root: str) -> bool: return False -def _path_exists(filepath: str) -> bool: +_MAX_REMOVED_IDS_IN_EVENT = 1000 + + +def _path_state(filepath: str) -> bool | None: + """True = on disk, False = definitely gone, None = could not tell.""" try: - return Path(filepath).exists() + os.stat(filepath) + return True + except (FileNotFoundError, NotADirectoryError): + return False + except OSError: + return None + except Exception: + return None + + +def _path_exists(filepath: str) -> bool: + """Backward-compatible helper: only a *confirmed* absence returns False.""" + return _path_state(filepath) is not False + + +def _root_is_readable(directory: str) -> bool: + """A scan root that cannot be listed (unmounted, offline share) must not be pruned.""" + try: + with os.scandir(directory) as entries: + next(entries, None) + return True except OSError: return False def _find_missing_filepaths(candidates: list[tuple[int, str]]) -> list[int]: - """Stat every candidate off the event loop; return asset ids missing from disk.""" - return [asset_id for asset_id, filepath in candidates if not _path_exists(filepath)] + """Stat every candidate off the event loop; return asset ids confirmed missing.""" + return [asset_id for asset_id, filepath in candidates if _path_state(filepath) is False] + + +def _emit_removed(asset_ids: list[int], *, reason: str, directory: str = "") -> None: + if not asset_ids: + return + try: + from ...adapters.comfy_events import emit_event + + emit_event( + "mjr-assets-removed", + { + "ids": [int(i) for i in asset_ids[:_MAX_REMOVED_IDS_IN_EVENT]], + "count": len(asset_ids), + "truncated": len(asset_ids) > _MAX_REMOVED_IDS_IN_EVENT, + "reason": reason, + "directory": directory, + }, + ) + except Exception: + logger.debug("_emit_removed: suppressed exception", exc_info=True) def _source_root_clause(source: str, root_id: str | None) -> tuple[str, list[Any]]: @@ -92,10 +145,13 @@ async def _delete_asset_ids(scanner: Any, asset_ids: list[int]) -> Result[int]: ) if not res.ok: return Result.Err("DB_ERROR", res.error or "Failed to prune stale assets") + # ``res.data`` is SQLite's change count, which also includes rows touched + # by ON DELETE CASCADE and FTS triggers; report assets, not rows. try: - total += int(res.data or 0) + changed = int(res.data or 0) except Exception: - total += len(batch) + changed = len(batch) + total += min(len(batch), changed) if changed > 0 else 0 return Result.Ok(total) @@ -134,6 +190,15 @@ async def prune_missing_assets_after_scan( if not candidates: return Result.Ok(0) + if not await asyncio.to_thread(_root_is_readable, directory): + logger.warning( + "Skipping prune: scan root %s is not readable (offline or unmounted?); " + "%s indexed asset(s) kept", + directory, + len(candidates), + ) + return Result.Ok(0) + stale_ids = await asyncio.to_thread(_find_missing_filepaths, candidates) if not stale_ids: return Result.Ok(0) @@ -145,6 +210,7 @@ async def prune_missing_assets_after_scan( int(deleted_res.data or 0), directory, ) + _emit_removed(stale_ids, reason="scan_prune", directory=directory) return deleted_res diff --git a/mjr_am_backend/features/index/service.py b/mjr_am_backend/features/index/service.py index 784d9bb2..4b47de73 100644 --- a/mjr_am_backend/features/index/service.py +++ b/mjr_am_backend/features/index/service.py @@ -319,6 +319,7 @@ class IndexService: """ # ON DELETE CASCADE handles asset_metadata, scan_journal, etc. where_sql, where_params = _filepath_match_clause(filepath, column="filepath") + removed_ids = await self._asset_ids_where(where_sql, where_params) res = await self.db.aexecute( f"DELETE FROM assets WHERE {where_sql}", where_params, @@ -333,8 +334,56 @@ class IndexService: if deleted_rows <= 0: return Result.Err("NOT_FOUND", "Asset not found") logger.debug(f"Removed from index: {filepath}") + self._emit_assets_removed(removed_ids, reason="file_deleted") return Result.Ok(True) + async def _asset_ids_where(self, where_sql: str, where_params: Any) -> list[int]: + try: + res = await self.db.aquery(f"SELECT id FROM assets WHERE {where_sql}", where_params) + except Exception: + return [] + if not res.ok or not res.data: + return [] + ids: list[int] = [] + for row in res.data: + try: + ids.append(int(row["id"] if isinstance(row, dict) else row[0])) + except Exception: + continue + return ids + + @staticmethod + def _emit_assets_removed(asset_ids: list[int], *, reason: str) -> None: + """Tell open grids that files vanished outside Majoor (watcher, external delete).""" + if not asset_ids: + return + try: + from ...adapters.comfy_events import emit_event + + emit_event( + "mjr-assets-removed", + {"ids": list(asset_ids), "count": len(asset_ids), "reason": reason}, + ) + except Exception as exc: + logger.debug("Failed to emit mjr-assets-removed: %s", exc) + + async def _emit_asset_moved(self, new_filepath: str) -> None: + """A move keeps the asset id; push the new path so cards update in place.""" + try: + from ...adapters.comfy_events import emit_event + + where_sql, where_params = _filepath_match_clause(new_filepath, column="filepath") + ids = await self._asset_ids_where(where_sql, where_params) + if not ids: + return + batch_res = await self.get_assets_batch(ids[:BATCH_ASSET_PUSH_LIMIT]) + if not batch_res.ok or not batch_res.data: + return + for asset in batch_res.data: + emit_event("mjr-asset-updated", sanitize_for_json(dict(asset))) + except Exception as exc: + logger.debug("Failed to emit moved asset update: %s", exc) + async def rename_file(self, old_filepath: str, new_filepath: str) -> Result[bool]: """ Rename/move a file path in index tables without rescanning directories. @@ -355,13 +404,41 @@ class IndexService: return Result.Err("DB_ERROR", str(exc)) logger.debug("Renamed in index: %s -> %s", old_fp, new_fp) + await self._emit_asset_moved(new_fp) return Result.Ok(True) + @staticmethod + def _scan_complete_payload(data: Any, *, origin: str) -> Any: + """Annotate scan stats for the UI. + + ``needs_refresh`` is true when the change cannot be shown with live + per-asset events: a directory scan pushes none, and ``index_paths`` only + pushes the first ``BATCH_ASSET_PUSH_LIMIT`` new assets. Pruned rows are + announced separately with ``mjr-assets-removed``. + """ + if not isinstance(data, dict): + return data + payload = dict(data) + try: + added = int(payload.get("added") or 0) + except (TypeError, ValueError): + added = 0 + try: + pruned = int(payload.get("pruned") or 0) + except (TypeError, ValueError): + pruned = 0 + live_limit = 0 if origin == "directory_scan" else BATCH_ASSET_PUSH_LIMIT + payload["origin"] = origin + payload["needs_refresh"] = added > live_limit or pruned > 0 + payload.pop("added_ids", None) + payload.pop("to_enrich", None) + return payload + def _emit_scan_complete_event(self, data: Any) -> None: try: from ...adapters.comfy_events import emit_event - emit_event("mjr-scan-complete", data) + emit_event("mjr-scan-complete", self._scan_complete_payload(data, origin="directory_scan")) except Exception as exc: logger.debug("Failed to emit scan-complete event: %s", exc) @@ -386,7 +463,7 @@ class IndexService: except Exception: return try: - emit_event("mjr-scan-complete", data) + emit_event("mjr-scan-complete", self._scan_complete_payload(data, origin="index_paths")) emit_event( "mjr.scan.progress", sanitize_for_json( diff --git a/mjr_am_backend/features/runtime/post_execution.py b/mjr_am_backend/features/runtime/post_execution.py index f477f0a1..3bcdbe93 100644 --- a/mjr_am_backend/features/runtime/post_execution.py +++ b/mjr_am_backend/features/runtime/post_execution.py @@ -2,6 +2,7 @@ from __future__ import annotations +import asyncio import os from pathlib import Path from typing import Any @@ -12,6 +13,7 @@ from ...adapters.comfy_core import ( get_prompt_output_files, get_temp_directory, get_workflow_id_for_prompt, + has_prompt_history_entry, send_event, ) from ...adapters.core_assets import fetch_by_job_id @@ -22,6 +24,24 @@ from ..index.metadata_helpers import MetadataHelpers logger = get_logger(__name__) +# ComfyUI calls cache providers' ``on_prompt_end`` from the ``finally`` of +# ``PromptExecutor.execute()``, i.e. *before* the prompt worker stores the +# result with ``PromptQueue.task_done()`` (see ComfyUI ``main.py``). Ingestion +# scheduled from that hook can therefore read history before the entry exists +# and silently index nothing. Wait for the entry with a short backoff first. +_HISTORY_WAIT_DELAYS_S: tuple[float, ...] = (0.05, 0.1, 0.2, 0.4, 0.8, 1.6, 3.2) + + +async def _wait_for_history_entry(prompt_id: str) -> bool: + if has_prompt_history_entry(prompt_id): + return True + for delay in _HISTORY_WAIT_DELAYS_S: + await asyncio.sleep(delay) + if has_prompt_history_entry(prompt_id): + return True + logger.debug("History entry for prompt_id=%s not available after waiting", prompt_id) + return False + def _existing_refs(refs: list[PromptOutputFile]) -> list[tuple[Path, PromptOutputFile]]: out: list[tuple[Path, PromptOutputFile]] = [] @@ -90,6 +110,7 @@ async def ingest_prompt_outputs(index_service: Any, prompt_id: str) -> Result[di if not safe_prompt_id: return Result.Err("INVALID_INPUT", "prompt_id is required") + await _wait_for_history_entry(safe_prompt_id) refs = _existing_refs(await _collect_prompt_output_files(safe_prompt_id)) if not refs: payload = {"prompt_id": safe_prompt_id, "indexed": 0, "paths": []} diff --git a/tests/features/test_asset_change_events.py b/tests/features/test_asset_change_events.py new file mode 100644 index 00000000..1771ed1a --- /dev/null +++ b/tests/features/test_asset_change_events.py @@ -0,0 +1,232 @@ +"""Live change events for files added, moved or removed outside the Majoor UI. + +Mirrors ComfyUI core's reconciler rules: only a confirmed absence removes an +indexed asset, an unreadable scan root is never pruned, and every removal or +move is announced so open grids update without a full reload. +""" + +from __future__ import annotations + +import os +from pathlib import Path + +import pytest +from mjr_am_backend import deps +from mjr_am_backend.adapters import comfy_core +from mjr_am_backend.features.index import scan_prune + + +@pytest.fixture +def emitted(monkeypatch): + events: list[tuple[str, dict]] = [] + + def _send_event(event, payload, *_args): + events.append((event, payload)) + return True + + monkeypatch.setattr(comfy_core, "send_event", _send_event) + return events + + +def _payloads(events, name): + return [payload for event, payload in events if event == name] + + +async def _services(tmp_path: Path, monkeypatch): + monkeypatch.setattr(deps, "WATCHER_ENABLED", False) + res = await deps.build_services(str(tmp_path / "events.sqlite")) + assert res.ok, res.error + return res.data + + +async def _close(services): + worker = services.get("rating_tags_sync") + if worker is not None: + try: + worker.stop() + except Exception: + pass + await services["db"].aclose() + + +async def _scan(index, root: Path): + res = await index.scan_directory( + directory=str(root), recursive=False, incremental=True, source="output", root_id=None + ) + assert res.ok, res.error + return res.data + + +async def _asset_id(index, path: Path) -> int: + res = await index.db.aquery("SELECT id FROM assets WHERE filename = ?", (path.name,)) + assert res.ok and res.data, res.error + return int(res.data[0]["id"]) + + +def test_path_state_distinguishes_missing_from_unreadable(tmp_path: Path, monkeypatch): + present = tmp_path / "a.png" + present.write_bytes(b"x") + assert scan_prune._path_state(str(present)) is True + assert scan_prune._path_state(str(tmp_path / "gone.png")) is False + + def _boom(_path): + raise PermissionError("share offline") + + monkeypatch.setattr(scan_prune.os, "stat", _boom) + assert scan_prune._path_state(str(present)) is None + assert scan_prune._find_missing_filepaths([(1, str(present))]) == [] + + +@pytest.mark.asyncio +async def test_scan_prune_announces_removed_ids(tmp_path: Path, monkeypatch, emitted): + root = tmp_path / "root" + root.mkdir() + keep, gone = root / "keep.png", root / "gone.png" + keep.write_bytes(b"x") + gone.write_bytes(b"y") + services = await _services(tmp_path, monkeypatch) + try: + index = services["index"] + await _scan(index, root) + gone_id = await _asset_id(index, gone) + gone.unlink() + emitted.clear() + + stats = await _scan(index, root) + + assert stats["pruned"] == 1 + removed = _payloads(emitted, "mjr-assets-removed") + assert removed and removed[0]["ids"] == [gone_id] + assert removed[0]["reason"] == "scan_prune" + complete = _payloads(emitted, "mjr-scan-complete")[-1] + assert complete["origin"] == "directory_scan" + assert complete["needs_refresh"] is True + assert "added_ids" not in complete + finally: + await _close(services) + + +@pytest.mark.asyncio +async def test_unreadable_scan_root_is_never_pruned(tmp_path: Path, monkeypatch, emitted): + root = tmp_path / "root" + root.mkdir() + (root / "a.png").write_bytes(b"x") + services = await _services(tmp_path, monkeypatch) + try: + index = services["index"] + await _scan(index, root) + monkeypatch.setattr(scan_prune, "_root_is_readable", lambda _d: False) + monkeypatch.setattr(scan_prune, "_path_state", lambda _p: False) + + res = await scan_prune.prune_missing_assets_after_scan( + index._scanner, directory=str(root), recursive=False, source="output", root_id=None + ) + + assert res.ok and res.data == 0 + assert not _payloads(emitted, "mjr-assets-removed") + count = await index.db.aquery("SELECT COUNT(*) AS n FROM assets", ()) + assert int(count.data[0]["n"]) == 1 + finally: + await _close(services) + + +@pytest.mark.asyncio +async def test_watcher_delete_and_move_emit_live_events(tmp_path: Path, monkeypatch, emitted): + root = tmp_path / "root" + root.mkdir() + deleted, moved = root / "deleted.png", root / "moved.png" + deleted.write_bytes(b"x") + moved.write_bytes(b"y") + services = await _services(tmp_path, monkeypatch) + try: + index = services["index"] + await _scan(index, root) + deleted_id = await _asset_id(index, deleted) + moved_id = await _asset_id(index, moved) + emitted.clear() + + deleted.unlink() + assert (await index.remove_file(str(deleted))).ok + target = root / "renamed.png" + os.replace(moved, target) + rn = await index.rename_file(str(moved), str(target)) + assert rn.ok, (rn.code, rn.error) + + removed = _payloads(emitted, "mjr-assets-removed") + assert removed and removed[0]["ids"] == [deleted_id] + assert removed[0]["reason"] == "file_deleted" + updated = _payloads(emitted, "mjr-asset-updated") + assert any(int(p.get("id")) == moved_id and p.get("filename") == "renamed.png" for p in updated) + finally: + await _close(services) + + +_OLD_BUGGY_TRIGGERS = """ +DROP TRIGGER IF EXISTS assets_fts_delete; +DROP TRIGGER IF EXISTS assets_fts_update; +CREATE TRIGGER assets_fts_delete AFTER DELETE ON assets BEGIN + DELETE FROM assets_fts WHERE rowid = old.id; +END; +CREATE TRIGGER assets_fts_update AFTER UPDATE ON assets BEGIN + UPDATE assets_fts SET filename = new.filename, subfolder = new.subfolder + WHERE rowid = new.id; +END; +""" + + +async def _fts_ids(db, term: str) -> set[int]: + res = await db.aquery("SELECT rowid AS id FROM assets_fts WHERE assets_fts MATCH ?", (term,)) + assert res.ok, res.error + return {int(r["id"]) for r in res.data or []} + + +@pytest.mark.asyncio +async def test_rename_keeps_full_text_index_consistent(tmp_path: Path, monkeypatch, emitted): + root = tmp_path / "root" + root.mkdir() + src = root / "oldname.png" + src.write_bytes(b"x") + services = await _services(tmp_path, monkeypatch) + try: + index = services["index"] + await _scan(index, root) + asset_id = await _asset_id(index, src) + target = root / "freshname.png" + os.replace(src, target) + + res = await index.rename_file(str(src), str(target)) + + assert res.ok, res.error + assert asset_id in await _fts_ids(index.db, "freshname") + assert asset_id not in await _fts_ids(index.db, "oldname") + finally: + await _close(services) + + +@pytest.mark.asyncio +async def test_startup_repairs_legacy_external_content_fts_triggers(tmp_path: Path, monkeypatch, emitted): + from mjr_am_backend.adapters.db.schema import ensure_indexes_and_triggers + + root = tmp_path / "root" + root.mkdir() + src = root / "legacy.png" + src.write_bytes(b"x") + services = await _services(tmp_path, monkeypatch) + try: + index = services["index"] + await _scan(index, root) + assert (await index.db.aexecutescript(_OLD_BUGGY_TRIGGERS)).ok + + assert (await ensure_indexes_and_triggers(index.db)).ok + + trig = await index.db.aquery( + "SELECT sql FROM sqlite_master WHERE type='trigger' AND name='assets_fts_update'", () + ) + assert "'delete'" in str(trig.data[0]["sql"]).lower() + target = root / "migrated.png" + os.replace(src, target) + res = await index.rename_file(str(src), str(target)) + assert res.ok, res.error + assert await _fts_ids(index.db, "migrated") + finally: + await _close(services) diff --git a/tests/features/test_post_execution_ingestion.py b/tests/features/test_post_execution_ingestion.py index f77fdfa8..92fb2594 100644 --- a/tests/features/test_post_execution_ingestion.py +++ b/tests/features/test_post_execution_ingestion.py @@ -6,6 +6,12 @@ from mjr_am_backend.features.runtime import post_execution as mod from mjr_am_backend.shared import Result +@pytest.fixture(autouse=True) +def _history_entry_present(monkeypatch): + """Most tests stub history directly; don't wait for a real entry.""" + monkeypatch.setattr(mod, "has_prompt_history_entry", lambda _prompt_id: True) + + class _DB: def __init__(self): self.executed = [] @@ -285,3 +291,61 @@ async def test_ingest_prompt_outputs_assigns_rodin_package_context(monkeypatch, ] assert len(rodin_updates) == 2 assert all(params[0] == "prompt-rodin" for params in rodin_updates) + + +@pytest.mark.asyncio +async def test_ingest_waits_for_history_written_after_on_prompt_end(monkeypatch, tmp_path: Path): + """ComfyUI fires on_prompt_end before task_done() stores history: retry, don't index nothing.""" + output = tmp_path / "out" + output.mkdir() + file_path = output / "late.png" + file_path.write_bytes(b"png") + state = {"checks": 0} + + def _has_entry(_prompt_id): + state["checks"] += 1 + return state["checks"] >= 3 # history appears on the 3rd check + + def _outputs(_prompt_id): + if state["checks"] < 3: + return [] + return [PromptOutputFile(path=str(file_path), node_id="9", node_type="SaveImage", item_type="output")] + + sleeps = [] + + async def _fake_sleep(delay): + sleeps.append(delay) + + monkeypatch.setattr(mod, "has_prompt_history_entry", _has_entry) + monkeypatch.setattr(mod, "get_prompt_output_files", _outputs) + monkeypatch.setattr(mod.asyncio, "sleep", _fake_sleep) + monkeypatch.setattr(mod, "send_event", lambda *_a, **_k: True) + monkeypatch.setattr(mod, "get_runtime_output_root", lambda: str(output)) + + async def _no_core(_prompt_id): + return [] + + monkeypatch.setattr(mod, "fetch_by_job_id", _no_core) + index = _Index() + + res = await mod.ingest_prompt_outputs(index, "late-prompt") + + assert res.ok + assert res.data["indexed"] == 1 + assert len(sleeps) == 2 + assert index.calls and index.calls[0][0] == [file_path.resolve()] + + +@pytest.mark.asyncio +async def test_wait_for_history_gives_up_without_blocking_forever(monkeypatch): + sleeps = [] + + async def _fake_sleep(delay): + sleeps.append(delay) + + monkeypatch.setattr(mod, "has_prompt_history_entry", lambda _prompt_id: False) + monkeypatch.setattr(mod.asyncio, "sleep", _fake_sleep) + + assert await mod._wait_for_history_entry("never") is False + assert len(sleeps) == len(mod._HISTORY_WAIT_DELAYS_S) + assert sum(sleeps) < 10 diff --git a/ui/app/events.ts b/ui/app/events.ts index 685b09e6..06cc87e2 100644 --- a/ui/app/events.ts +++ b/ui/app/events.ts @@ -13,6 +13,8 @@ export const EVENTS = Object.freeze({ ENRICHMENT_STATUS: "mjr-enrichment-status", DB_RESTORE_STATUS: "mjr-db-restore-status", ASSETS_DELETED: "mjr:assets-deleted", + /** WS: assets removed outside the UI (watcher delete, scan prune). detail: { ids, count, truncated?, reason } */ + ASSETS_REMOVED: "mjr-assets-removed", SETTINGS_CHANGED: "mjr-settings-changed", SELECTION_CHANGED: "mjr:selection-changed", RELOAD_GRID: "mjr:reload-grid", diff --git a/ui/app/i18n.ts b/ui/app/i18n.ts index 97317f82..fd0cf60a 100644 --- a/ui/app/i18n.ts +++ b/ui/app/i18n.ts @@ -1122,6 +1122,7 @@ const DICTIONARY: Record> = { // --- Toasts --- "toast.scanStarted": "Scan started", "toast.scanComplete": "Scan complete", + "toast.scanCompleteSummary": "{added} new, {removed} removed", "toast.scanFailed": "Scan failed", "toast.resetTriggered": "Reset triggered: Reindexing all files...", "toast.resetStarted": "Index reset started. Files will be reindexed in the background.", @@ -1388,6 +1389,8 @@ const DICTIONARY: Record> = { "dialog.workflowSaveName": "Nom du workflow", "dialog.workflowCategory": "Categorie du workflow", "dialog.deleteWorkflowConfirm": "Supprimer ce JSON workflow et ses thumbnails adjacents ?", + "toast.scanComplete": "Scan terminé", + "toast.scanCompleteSummary": "{added} nouveau(x), {removed} retiré(s)", "toast.workflowSaved": "Workflow enregistre", "toast.workflowSaveFailed": "Echec de l'enregistrement du workflow.", "toast.workflowSerializeFailed": "Impossible de lire le workflow ComfyUI courant.", diff --git a/ui/features/runtime/entryRuntimeLifecycle.ts b/ui/features/runtime/entryRuntimeLifecycle.ts index 8be8c884..33733b4b 100644 --- a/ui/features/runtime/entryRuntimeLifecycle.ts +++ b/ui/features/runtime/entryRuntimeLifecycle.ts @@ -25,6 +25,9 @@ export function removeApiHandlers(api: any, reportError: (e: any, ctx?: string) if (api._mjrScanCompleteHandler) { api.removeEventListener(EVENTS.SCAN_COMPLETE, api._mjrScanCompleteHandler); } + if (api._mjrAssetsRemovedHandler) { + api.removeEventListener(EVENTS.ASSETS_REMOVED, api._mjrAssetsRemovedHandler); + } if (api._mjrScanProgressHandler) { api.removeEventListener(EVENTS.SCAN_PROGRESS, api._mjrScanProgressHandler); } diff --git a/ui/features/runtime/registerRealtimeListeners.ts b/ui/features/runtime/registerRealtimeListeners.ts index 0b760a0b..8305f021 100644 --- a/ui/features/runtime/registerRealtimeListeners.ts +++ b/ui/features/runtime/registerRealtimeListeners.ts @@ -497,12 +497,71 @@ export async function registerRealtimeListeners({ try { const detail = event?.detail || {}; window.dispatchEvent(new CustomEvent(EVENTS.SCAN_COMPLETE, { detail })); + handleScanCompleteSurface(detail); } catch (e) { console.debug?.(e); } }; registerCleanableListener(runtime, api, EVENTS.SCAN_COMPLETE, api._mjrScanCompleteHandler); + /** + * Directory scans push no per-asset events, and index_paths only pushes the + * first N new assets: the backend flags `needs_refresh` so the grid reloads + * once (deferred while hidden). A finished directory scan that changed + * something is summarised in one ComfyUI core toast; index_paths runs (each + * generation, watcher batches) stay silent - live cards + badge cover them. + */ + function handleScanCompleteSurface(detail: any) { + if ((globalThis as any)?._mjrMaintenanceActive) return; + const added = Math.max(0, Number(detail?.added) || 0); + const removed = Math.max(0, Number(detail?.pruned) || 0); + if (detail?.needs_refresh) { + window.dispatchEvent( + new CustomEvent(EVENTS.RELOAD_GRID, { + detail: { reason: "scan-complete", added, removed }, + }), + ); + } + if (String(detail?.origin || "") !== "directory_scan" || (!added && !removed)) return; + comfyToast( + { + summary: t("toast.scanComplete", "Scan complete"), + detail: t("toast.scanCompleteSummary", "{added} new, {removed} removed", { + added, + removed, + }), + }, + "success", + 3500, + { history: { source: "scan", operation: "scan", status: "done" } }, + ); + } + + api._mjrAssetsRemovedHandler = (event: any) => { + try { + const detail = event?.detail || {}; + const ids = Array.isArray(detail?.ids) + ? detail.ids.map((x: any) => String(x ?? "").trim()).filter(Boolean) + : []; + if (ids.length) { + // Same path as a delete from the UI: cards disappear in place. + window.dispatchEvent( + new CustomEvent(EVENTS.ASSETS_DELETED, { + detail: { ids, source: "backend", reason: detail?.reason || "" }, + }), + ); + } + if (detail?.truncated) { + window.dispatchEvent( + new CustomEvent(EVENTS.RELOAD_GRID, { detail: { reason: "assets-removed" } }), + ); + } + } catch (e) { + console.debug?.(e); + } + }; + registerCleanableListener(runtime, api, EVENTS.ASSETS_REMOVED, api._mjrAssetsRemovedHandler); + api._mjrCoreExecutionAssetsReadyHandler = (event: any) => { try { const detail = event?.detail || {}; diff --git a/ui/tests/register_realtime_listeners.vitest.ts b/ui/tests/register_realtime_listeners.vitest.ts index 7c27e183..50a721fe 100644 --- a/ui/tests/register_realtime_listeners.vitest.ts +++ b/ui/tests/register_realtime_listeners.vitest.ts @@ -450,4 +450,90 @@ describe("registerRealtimeListeners", () => { }), ); }); + describe("scan and removal surfaces", () => { + let dispatched: any[]; + let toast: any; + let harness: any; + + beforeEach(async () => { + ensureBrowserShims(); + dispatched = []; + (globalThis as any).window.dispatchEvent = (event: any) => { + dispatched.push(event); + return true; + }; + (globalThis as any)._mjrMaintenanceActive = false; + toast = vi.fn(); + harness = createRuntimeHarness(); + await registerRealtimeListeners({ + api: harness.api, + runtime: harness.runtime, + executionRuntime: harness.executionRuntime, + appRef: {}, + liveStreamModule: null, + ensureExecutionRuntime: () => ({ queue_remaining: 0, active_prompt_id: null }), + emitRuntimeStatus: () => {}, + getActiveGridContainer: () => harness.grid, + pushGeneratedAsset: harness.pushGeneratedAsset, + upsertAsset: harness.upsertAsset, + removeAssetsFromGrid: () => {}, + getEnrichmentState: () => ({ active: false }), + setEnrichmentState: () => {}, + comfyToast: toast, + t: (_k: any, fallback: any, params: any) => + String(fallback).replace(/\{(\w+)\}/g, (_m: any, k: any) => String(params?.[k] ?? "")), + reportError: () => {}, + registerCleanableListener: () => {}, + }); + }); + + const ofType = (type: string) => dispatched.filter((e) => e?.type === type); + + it("summarises a directory scan in one core toast and reloads the grid once", () => { + (harness.api as any)._mjrScanCompleteHandler({ + detail: { origin: "directory_scan", added: 12, pruned: 3, needs_refresh: true }, + }); + + expect(ofType(EVENTS.RELOAD_GRID)).toHaveLength(1); + expect(toast).toHaveBeenCalledTimes(1); + expect(toast.mock.calls[0][0]).toMatchObject({ detail: "12 new, 3 removed" }); + expect(toast.mock.calls[0][1]).toBe("success"); + }); + + it("stays silent for per-generation index_paths runs covered by live events", () => { + (harness.api as any)._mjrScanCompleteHandler({ + detail: { origin: "index_paths", added: 1, pruned: 0, needs_refresh: false }, + }); + + expect(ofType(EVENTS.RELOAD_GRID)).toHaveLength(0); + expect(toast).not.toHaveBeenCalled(); + }); + + it("does not toast or reload during DB maintenance", () => { + (globalThis as any)._mjrMaintenanceActive = true; + (harness.api as any)._mjrScanCompleteHandler({ + detail: { origin: "directory_scan", added: 50, needs_refresh: true }, + }); + (globalThis as any)._mjrMaintenanceActive = false; + + expect(ofType(EVENTS.RELOAD_GRID)).toHaveLength(0); + expect(toast).not.toHaveBeenCalled(); + }); + + it("turns backend removals into the same in-place card removal as UI deletes", () => { + (harness.api as any)._mjrAssetsRemovedHandler({ + detail: { ids: [7, 9], count: 2, reason: "file_deleted" }, + }); + + const deleted = ofType(EVENTS.ASSETS_DELETED); + expect(deleted).toHaveLength(1); + expect(deleted[0].detail.ids).toEqual(["7", "9"]); + expect(ofType(EVENTS.RELOAD_GRID)).toHaveLength(0); + + (harness.api as any)._mjrAssetsRemovedHandler({ + detail: { ids: [1], count: 5000, truncated: true, reason: "scan_prune" }, + }); + expect(ofType(EVENTS.RELOAD_GRID)).toHaveLength(1); + }); + }); }); From 4407289e429be82bda87f267bc98feb1518ebbbd Mon Sep 17 00:00:00 2001 From: Ewald ALOEBOETOE <129623145+MajoorWaldi@users.noreply.github.com> Date: Wed, 4 Nov 2026 08:11:01 +0000 Subject: [PATCH 12/23] Fix duplicate-stack render loop and wrong duplicate grouping - Clicking a duplicate-stack badge could freeze ComfyUI: displayAssets, the per-card ref callback (syncRenderedDuplicateCards) and the live upsert dedupe each rewrote _mjrDupStack/_mjrDupMembers on reactive assets read by the grid template, with a new array every pass and conflicting representatives. The ref callback ran on every render, so each write scheduled another render (no recursion limit in prod Vue). - Compute duplicate stacks only in buildDisplayAssets with change-guarded writes and stable member arrays; keep one ref callback per card; stop the other passes from touching duplicate fields. - A duplicate is now the same name in the same source/root/subfolder: files sharing a name in different folders are no longer stacked, hidden from the grid or given another file's generation time. - The duplicates view lists every copy using cycle-free member copies. - Add regression tests (render-loop idempotence, folder scoping). --- CHANGELOG.md | 5 + ...Bw0UgjBJ.js => FloatingViewer-DjWZOB3Z.js} | 8 +- ...CguVd.js => LiveStreamTracker-B3HhmLvE.js} | 2 +- ....js => SidebarWorkflowSection-BMRq92Vq.js} | 24 +- ...tor-gpBsG4si.js => TagsEditor-BydzUbtv.js} | 2 +- ...{Viewer-BEptWhbV.js => Viewer-DCWIIJQl.js} | 2351 +++++---- ...l-CeOkTVnX.js => ViewerPortal-D964vdje.js} | 6 +- ...z.js => floatingViewerManager-B_1xQj1m.js} | 2 +- ...enInfo-C3ZF_agc.js => genInfo-B60U6rEQ.js} | 4 +- ...8v_l.js => openMajoorSettings-D92RuxBO.js} | 2 +- ...T-KHd.js => viewerOpenRequest-DaR0P9Y2.js} | 2 +- dist/entry.js | 4458 +++++++++-------- docs/COMFYUI_INTEGRATION_AUDIT.md | 28 + ui/features/grid/AssetCardRenderer.ts | 99 +- ui/features/panel/panelSimilarSearch.ts | 7 +- ui/tests/grid_display_duplicates.vitest.ts | 92 + .../components/grid/VirtualAssetGridHost.vue | 108 +- ui/vue/composables/useVirtualGrid.ts | 49 +- ui/vue/grid/useGridDisplayAssets.ts | 144 +- 19 files changed, 3720 insertions(+), 3673 deletions(-) rename dist/chunks/{FloatingViewer-Bw0UgjBJ.js => FloatingViewer-DjWZOB3Z.js} (99%) rename dist/chunks/{LiveStreamTracker-CUeCguVd.js => LiveStreamTracker-B3HhmLvE.js} (98%) rename dist/chunks/{SidebarWorkflowSection-BjUgGET_.js => SidebarWorkflowSection-BMRq92Vq.js} (99%) rename dist/chunks/{TagsEditor-gpBsG4si.js => TagsEditor-BydzUbtv.js} (99%) rename dist/chunks/{Viewer-BEptWhbV.js => Viewer-DCWIIJQl.js} (86%) rename dist/chunks/{ViewerPortal-CeOkTVnX.js => ViewerPortal-D964vdje.js} (98%) rename dist/chunks/{floatingViewerManager-DI520cRz.js => floatingViewerManager-B_1xQj1m.js} (99%) rename dist/chunks/{genInfo-C3ZF_agc.js => genInfo-B60U6rEQ.js} (99%) rename dist/chunks/{openMajoorSettings-BZtL8v_l.js => openMajoorSettings-D92RuxBO.js} (99%) rename dist/chunks/{viewerOpenRequest-B8IT-KHd.js => viewerOpenRequest-DaR0P9Y2.js} (95%) create mode 100644 ui/tests/grid_display_duplicates.vitest.ts diff --git a/CHANGELOG.md b/CHANGELOG.md index 59ec464a..6d76e98c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -30,6 +30,11 @@ All notable changes to this project are documented in this file. ### Fixed - **`mjr_am_backend.adapters.tools` missing from Registry installs**: `.comfyignore`'s unanchored `tools/` pattern also matched `mjr_am_backend/adapters/tools/`, stripping the ExifTool/FFProbe adapters out of every Registry-published package and causing `ModuleNotFoundError: No module named 'mjr_am_backend.adapters.tools'` at startup. The pattern is now anchored to the repo-root `/tools/` dev-scripts folder only. +### Fixed (duplicate stacks) +- **Clicking a duplicate-stack badge froze ComfyUI**: three passes (`displayAssets`, the per-card ref callback `syncRenderedDuplicateCards`, the live-upsert dedupe) each rewrote `_mjrDupStack` / `_mjrDupMembers` on reactive assets read by the grid template, with a fresh array on every pass and conflicting representatives. The ref callback ran on every render (a new closure each time), so every write scheduled another render: an endless update loop (production Vue has no recursion limit). Duplicate stacks are now computed in one place with change-guarded writes, card refs are stable, and the other passes no longer touch these fields. +- **"Corrupted" duplicate stacks**: stacks were also built from the file name alone across folders, so unrelated files sharing a name (e.g. frame grabs `at-7.958s.png` from different videos) were stacked, hidden from the grid and given another file's generation time. A duplicate is now the same name in the same source/root/subfolder only. +- **Duplicates view collapsed back to one card**: the "Duplicates - N copies" view re-grouped its own members; it now lists every copy, using cycle-free copies of the members. + ### Fixed (asset sync) - **Renamed / moved files lost their ratings, tags and collections**: the `assets_fts` triggers ran a plain `UPDATE`/`DELETE` on an external-content FTS5 table, so every filename/subfolder change failed with "database disk image is malformed" (and could start a needless DB recovery). The watcher then fell back to delete + re-index, creating a new asset id. Triggers now use FTS5's `'delete'` command (update trigger limited to `filename, subfolder`); existing databases are repaired and the FTS index rebuilt automatically at startup. - **Outputs missed after a generation**: ComfyUI calls `on_prompt_end` before it stores the prompt history, so post-execution ingestion could read an empty history and index nothing (prompts queued from the API, another tab or another device). Ingestion now waits briefly for the history entry. diff --git a/dist/chunks/FloatingViewer-Bw0UgjBJ.js b/dist/chunks/FloatingViewer-DjWZOB3Z.js similarity index 99% rename from dist/chunks/FloatingViewer-Bw0UgjBJ.js rename to dist/chunks/FloatingViewer-DjWZOB3Z.js index 7be922e7..a84def20 100644 --- a/dist/chunks/FloatingViewer-Bw0UgjBJ.js +++ b/dist/chunks/FloatingViewer-DjWZOB3Z.js @@ -1,12 +1,12 @@ import { $t as e, g as t, y as n } from "./viewerRuntimeHosts-CkUqwo6l.js"; import { C as r, H as i, I as a, M as o, O as s, P as c, V as l, at as u, j as d, m as f, o as p, r as m, v as h, w as g, x as _, z as v } from "./events-B9CSrqJ_.js"; import { a as y, i as b, o as x, s as S } from "./graphTraversal-DTdQWkn5.js"; -import { _ as C, g as w, m as T, n as E, p as ee, r as D, w as O } from "./Viewer-BEptWhbV.js"; -import { r as k, v as A } from "./SidebarWorkflowSection-BjUgGET_.js"; -import { _ as j, a as M, c as N, d as P, f as F, g as I, h as L, i as te, l as R, m as z, o as ne, p as B, r as re, s as V, t as ie, u as H, v as U } from "./openMajoorSettings-BZtL8v_l.js"; +import { _ as C, g as w, m as T, n as E, p as ee, r as D, w as O } from "./Viewer-DCWIIJQl.js"; +import { r as k, v as A } from "./SidebarWorkflowSection-BMRq92Vq.js"; +import { _ as j, a as M, c as N, d as P, f as F, g as I, h as L, i as te, l as R, m as z, o as ne, p as B, r as re, s as V, t as ie, u as H, v as U } from "./openMajoorSettings-D92RuxBO.js"; import { a as W, n as ae, r as oe } from "./model3dRenderer-BsJ9YHaZ.js"; import { i as se, o as ce, r as le, t as ue } from "./geninfoParser-CgHp-y-n.js"; -import { t as de } from "./genInfo-C3ZF_agc.js"; +import { t as de } from "./genInfo-B60U6rEQ.js"; // ui/features/viewer/floatingViewerConstants.ts var G = Object.freeze({ SIMPLE: "simple", diff --git a/dist/chunks/LiveStreamTracker-CUeCguVd.js b/dist/chunks/LiveStreamTracker-B3HhmLvE.js similarity index 98% rename from dist/chunks/LiveStreamTracker-CUeCguVd.js rename to dist/chunks/LiveStreamTracker-B3HhmLvE.js index 8dbaaa24..c359d141 100644 --- a/dist/chunks/LiveStreamTracker-CUeCguVd.js +++ b/dist/chunks/LiveStreamTracker-B3HhmLvE.js @@ -1,5 +1,5 @@ import { Z as e, o as t, r as n } from "./events-B9CSrqJ_.js"; -import { t as r } from "./floatingViewerManager-DI520cRz.js"; +import { t as r } from "./floatingViewerManager-B_1xQj1m.js"; // ui/features/viewer/LiveStreamTracker.ts var i = !1, a = null, o = null, s = null, c = null, l = null, u = null, d = null, f = null, p = 0, m = 0, h = !1, g = 400, _ = "kj_preview_override", v = /* @__PURE__ */ new Set([ "image/jpeg", diff --git a/dist/chunks/SidebarWorkflowSection-BjUgGET_.js b/dist/chunks/SidebarWorkflowSection-BMRq92Vq.js similarity index 99% rename from dist/chunks/SidebarWorkflowSection-BjUgGET_.js rename to dist/chunks/SidebarWorkflowSection-BMRq92Vq.js index c27ca268..8a7ed4d3 100644 --- a/dist/chunks/SidebarWorkflowSection-BjUgGET_.js +++ b/dist/chunks/SidebarWorkflowSection-BMRq92Vq.js @@ -1,10 +1,10 @@ import { $ as e, $t as t, At as n, Bt as r, Ct as i, Dt as a, Et as o, Ft as s, Gt as c, Ht as l, I as u, It as d, K as f, Kt as p, Mt as m, N as h, Nt as g, O as _, Ot as v, Pt as y, Q as b, Qt as x, R as S, Rt as C, S as ee, St as te, T as ne, Tt as w, Ut as T, Vt as re, X as ie, Y as E, Yt as ae, Z as oe, Zt as se, at as ce, cn as le, ct as ue, dt as de, et as D, gt as fe, it as pe, jt as me, k as he, kt as ge, ln as _e, lt as ve, nt as ye, ot as be, p as xe, rt as Se, tn as Ce, tt as we, ut as Te, w as Ee, wt as De } from "./viewerRuntimeHosts-CkUqwo6l.js"; import { G as Oe, J as ke, N as Ae, R as je, T as Me, Tt as Ne, X as Pe, c as Fe, d as Ie, f as Le, h as Re, ht as ze, j as Be, l as Ve, m as O, o as k, p as He, rt as Ue, s as A, u as We, x as Ge, y as Ke } from "./events-B9CSrqJ_.js"; -import { F as qe, K as Je, P as Ye, Y as Xe, f as Ze, m as Qe, p as $e } from "./Viewer-BEptWhbV.js"; -import { t as et } from "./floatingViewerManager-DI520cRz.js"; +import { F as qe, G as Je, J as Ye, P as Xe, f as Ze, m as Qe, p as $e } from "./Viewer-DCWIIJQl.js"; +import { t as et } from "./floatingViewerManager-B_1xQj1m.js"; import { A as tt, C as j, D as nt, E as M, G as rt, J as it, K as at, N as ot, O as N, R as st, S as ct, T as P, U as F, V as I, Y as lt, _ as ut, a as dt, b as ft, c as pt, d as mt, dt as L, f as ht, ft as R, g as gt, h as _t, i as vt, j as yt, k as z, l as bt, lt as B, m as xt, n as St, nt as Ct, o as wt, p as Tt, r as Et, rt as V, s as Dt, t as Ot, u as kt, ut as At, y as jt, z as Mt } from "./mjr-primevue-BRqtdXzb.js"; import { t as Nt } from "./mjr-vue-vendor-mHY_eIVE.js"; -import { t as Pt } from "./viewerOpenRequest-B8IT-KHd.js"; +import { t as Pt } from "./viewerOpenRequest-DaR0P9Y2.js"; import { a as Ft, i as It, n as Lt, o as Rt, r as zt, t as Bt } from "./geninfoParser-CgHp-y-n.js"; // ui/app/settings/settingsUtils.ts var H = (e, t) => { @@ -251,7 +251,7 @@ var H = (e, t) => { console.debug?.(e); } try { - Xe("mjr-settings-save-failed", { error: String(e?.message || e || "") }, { warnPrefix: "[Majoor]" }); + Ye("mjr-settings-save-failed", { error: String(e?.message || e || "") }, { warnPrefix: "[Majoor]" }); } catch (e) { console.debug?.(e); } @@ -318,7 +318,7 @@ async function Zt() { } catch (e) { console.debug?.(e); } - G(n), K(n), Xe("mjr-settings-changed", { key: "security" }, { warnPrefix: "[Majoor]" }); + G(n), K(n), Ye("mjr-settings-changed", { key: "security" }, { warnPrefix: "[Majoor]" }); } catch (e) { console.warn("[Majoor] failed to sync backend security settings", e); } @@ -330,7 +330,7 @@ async function Qt() { let t = e.data?.prefs; if (!t || typeof t != "object") return; let n = Xt(); - n.ai = n.ai || {}, n.ai.vectorSearchEnabled = H(t.enabled, n.ai.vectorSearchEnabled ?? !0), n.ai.vectorCaptionOnIndex = H(t.caption_on_index ?? t.captionOnIndex, n.ai.vectorCaptionOnIndex ?? !1), n.ai.vectorIndexOnScan = H(t.index_on_scan ?? t.indexOnScan, n.ai.vectorIndexOnScan ?? !1), n.ai.vectorUnloadAfterUse = H(t.unload_after_use ?? t.unloadAfterUse, n.ai.vectorUnloadAfterUse ?? !1), n.ai.vectorConcurrency = Math.max(1, Math.min(16, Math.floor(Number(t.concurrency ?? n.ai.vectorConcurrency ?? 1) || 1))), G(n), K(n), Xe("mjr-settings-changed", { key: "ai.vectorSearch" }, { warnPrefix: "[Majoor]" }); + n.ai = n.ai || {}, n.ai.vectorSearchEnabled = H(t.enabled, n.ai.vectorSearchEnabled ?? !0), n.ai.vectorCaptionOnIndex = H(t.caption_on_index ?? t.captionOnIndex, n.ai.vectorCaptionOnIndex ?? !1), n.ai.vectorIndexOnScan = H(t.index_on_scan ?? t.indexOnScan, n.ai.vectorIndexOnScan ?? !1), n.ai.vectorUnloadAfterUse = H(t.unload_after_use ?? t.unloadAfterUse, n.ai.vectorUnloadAfterUse ?? !1), n.ai.vectorConcurrency = Math.max(1, Math.min(16, Math.floor(Number(t.concurrency ?? n.ai.vectorConcurrency ?? 1) || 1))), G(n), K(n), Ye("mjr-settings-changed", { key: "ai.vectorSearch" }, { warnPrefix: "[Majoor]" }); } catch (e) { console.warn("[Majoor] failed to sync backend vector search settings", e); } @@ -342,7 +342,7 @@ async function $t() { let t = e.data?.prefs; if (!t || typeof t != "object") return; let n = Xt(); - n.executionGrouping = n.executionGrouping || {}, n.executionGrouping.enabled = H(t.enabled, n.executionGrouping.enabled ?? A.EXECUTION_GROUPING_ENABLED), G(n), K(n), Xe("mjr-settings-changed", { key: "executionGrouping.enabled" }, { warnPrefix: "[Majoor]" }); + n.executionGrouping = n.executionGrouping || {}, n.executionGrouping.enabled = H(t.enabled, n.executionGrouping.enabled ?? A.EXECUTION_GROUPING_ENABLED), G(n), K(n), Ye("mjr-settings-changed", { key: "executionGrouping.enabled" }, { warnPrefix: "[Majoor]" }); } catch (e) { console.warn("[Majoor] failed to sync backend execution grouping settings", e); } @@ -2602,12 +2602,12 @@ function Mr(e, t, { initRuntime: n = !1 } = {}) { if (!i.size) return; let e = Array.from(i); i.clear(); - for (let t of e) Xe("mjr-settings-changed", { key: t }, { warnPrefix: "[Majoor]" }); + for (let t of e) Ye("mjr-settings-changed", { key: t }, { warnPrefix: "[Majoor]" }); }, s = () => { if (!a.size) return; let e = Array.from(a); a.clear(); - for (let t of e) Xe("mjr-settings-changed", { key: t }, { warnPrefix: "[Majoor]" }); + for (let t of e) Ye("mjr-settings-changed", { key: t }, { warnPrefix: "[Majoor]" }); }, c = fn(o, 120), l = fn(s, 450), u = (e) => { typeof e == "string" && i.add(e), c(); }, d = (e) => { @@ -2672,7 +2672,7 @@ try { let e = Xt(); e?.watcher && typeof e.watcher.enabled == "boolean" && Te().then((e) => { let t = !!e?.ok && !!e?.data?.enabled, n = Xt(); - n.watcher = n.watcher || {}, typeof t == "boolean" && t !== !!n.watcher.enabled && (n.watcher.enabled = t, G(n), Xe("mjr-settings-changed", { key: "watcher.enabled" }, { warnPrefix: "[Majoor]" })); + n.watcher = n.watcher || {}, typeof t == "boolean" && t !== !!n.watcher.enabled && (n.watcher.enabled = t, G(n), Ye("mjr-settings-changed", { key: "watcher.enabled" }, { warnPrefix: "[Majoor]" })); }).catch(() => {}); } catch (e) { console.debug?.(e); @@ -4256,7 +4256,7 @@ var Xa = { label: "Generation Time", value: `${(Number(h) / 1e3).toFixed(1)}s`, tooltip: "Time taken to generate this asset (workflow execution time)", - valueStyle: `color: ${Ye(h)}; font-weight: 600;` + valueStyle: `color: ${Xe(h)}; font-weight: 600;` }); let g = e.generation_time || e.file_creation_time || e.mtime || e.created_at; if (g) { @@ -5171,7 +5171,7 @@ var Vo = ["title"], Ho = ["src"], Uo = { setup(e) { let n = e, r = V(0), i = V(!1), a = null; function o() { - return a ||= import("./floatingViewerManager-DI520cRz.js").then((e) => e.n), a; + return a ||= import("./floatingViewerManager-B_1xQj1m.js").then((e) => e.n), a; } function s() { return (Array.isArray(n.inputFile?.previewCandidates) ? n.inputFile.previewCandidates : [])[r.value] || ""; diff --git a/dist/chunks/TagsEditor-gpBsG4si.js b/dist/chunks/TagsEditor-BydzUbtv.js similarity index 99% rename from dist/chunks/TagsEditor-gpBsG4si.js rename to dist/chunks/TagsEditor-BydzUbtv.js index 07a7afb6..c9c9c37b 100644 --- a/dist/chunks/TagsEditor-gpBsG4si.js +++ b/dist/chunks/TagsEditor-BydzUbtv.js @@ -1,6 +1,6 @@ import { $t as e, F as t, v as n } from "./viewerRuntimeHosts-CkUqwo6l.js"; import { m as r, n as i, wt as a } from "./events-B9CSrqJ_.js"; -import { Y as o } from "./Viewer-BEptWhbV.js"; +import { J as o } from "./Viewer-DCWIIJQl.js"; import { A as s, C as c, E as l, G as u, J as d, K as f, L as p, N as m, R as ee, T as h, U as te, V as g, Y as _, b as ne, ft as v, j as y, k as b, lt as x, rt as S, ut as C, z as w } from "./mjr-primevue-BRqtdXzb.js"; // ui/vue/components/common/TagsEditor.vue?vue&type=script&setup=true&lang.ts var T = ["aria-busy"], re = ["aria-label"], ie = { diff --git a/dist/chunks/Viewer-BEptWhbV.js b/dist/chunks/Viewer-DCWIIJQl.js similarity index 86% rename from dist/chunks/Viewer-BEptWhbV.js rename to dist/chunks/Viewer-DCWIIJQl.js index ebdde935..0c9e7254 100644 --- a/dist/chunks/Viewer-BEptWhbV.js +++ b/dist/chunks/Viewer-DCWIIJQl.js @@ -51,7 +51,7 @@ var le = async (e, t = "Majoor", n = {}) => { if (n?.native !== !1) { let n = z(); if (n) try { - n.show(fe(e, t)); + n.show(B(e, t)); try { n.element?.style?.setProperty?.("z-index", "1100"); } catch (e) { @@ -62,21 +62,21 @@ var le = async (e, t = "Majoor", n = {}) => { console.debug?.(e); } } - let a = me(); + let a = pe(); if (a) return new Promise((n) => { let r = new a(); - W(r); - let i = U("div", { style: { + G(r); + let i = W("div", { style: { display: "flex", flexDirection: "column", gap: "18px", padding: "18px 20px 18px 20px" } }, [ - U("div", { style: { + W("div", { style: { display: "flex", alignItems: "center", justifyContent: "flex-start" - } }, [U("div", { + } }, [W("div", { textContent: t, style: { fontWeight: "700", @@ -85,7 +85,7 @@ var le = async (e, t = "Majoor", n = {}) => { lineHeight: "1.2" } })]), - U("div", { + W("div", { textContent: String(e || ""), style: { fontSize: "22px", @@ -94,11 +94,11 @@ var le = async (e, t = "Majoor", n = {}) => { lineHeight: "1.45" } }), - U("div", { style: { + W("div", { style: { display: "flex", justifyContent: "flex-end", gap: "10px" - } }, [U("button", { + } }, [W("button", { textContent: w("dialog.confirm", "Confirm"), onclick: () => { try { @@ -120,7 +120,7 @@ var le = async (e, t = "Majoor", n = {}) => { })]) ]); try { - r.show(i), setTimeout(() => G(r), 0); + r.show(i), setTimeout(() => K(r), 0); } catch { try { window.alert(e); @@ -146,7 +146,7 @@ var le = async (e, t = "Majoor", n = {}) => { } catch (e) { console.debug?.(e); } - let r = me(); + let r = pe(); if (!r) try { return window.confirm(e); } catch { @@ -154,7 +154,7 @@ var le = async (e, t = "Majoor", n = {}) => { } return new Promise((n) => { let i = new r(); - W(i); + G(i); let a = (e) => { try { i.close(); @@ -162,17 +162,17 @@ var le = async (e, t = "Majoor", n = {}) => { console.debug?.(e); } n(!!e); - }, o = U("div", { style: { + }, o = W("div", { style: { display: "flex", flexDirection: "column", gap: "18px", padding: "18px 20px 18px 20px" } }, [ - U("div", { style: { + W("div", { style: { display: "flex", alignItems: "center", justifyContent: "flex-start" - } }, [U("div", { + } }, [W("div", { textContent: t, style: { fontWeight: "700", @@ -181,7 +181,7 @@ var le = async (e, t = "Majoor", n = {}) => { lineHeight: "1.2" } })]), - U("div", { + W("div", { textContent: String(e || ""), style: { fontSize: "22px", @@ -190,11 +190,11 @@ var le = async (e, t = "Majoor", n = {}) => { lineHeight: "1.45" } }), - U("div", { style: { + W("div", { style: { display: "flex", justifyContent: "flex-end", gap: "10px" - } }, [U("button", { + } }, [W("button", { textContent: w("dialog.cancel", "Cancel"), onclick: () => a(!1), style: { @@ -206,7 +206,7 @@ var le = async (e, t = "Majoor", n = {}) => { fontWeight: "600", cursor: "pointer" } - }), U("button", { + }), W("button", { textContent: w("dialog.confirm", "Confirm"), onclick: () => a(!0), style: { @@ -221,7 +221,7 @@ var le = async (e, t = "Majoor", n = {}) => { })]) ]); try { - i.show(o), setTimeout(() => G(i), 0); + i.show(o), setTimeout(() => K(i), 0); } catch { try { n(!!window.confirm(e)); @@ -242,7 +242,7 @@ var le = async (e, t = "Majoor", n = {}) => { } catch (e) { console.debug?.(e); } - let i = me(); + let i = pe(); if (!i) try { return window.prompt(e, t); } catch { @@ -250,7 +250,7 @@ var le = async (e, t = "Majoor", n = {}) => { } return new Promise((r) => { let a = new i(); - W(a); + G(a); let o = (e) => { try { a.close(); @@ -258,7 +258,7 @@ var le = async (e, t = "Majoor", n = {}) => { console.debug?.(e); } r(e ?? null); - }, s = U("input", { + }, s = W("input", { type: "text", value: String(t ?? ""), style: { @@ -274,13 +274,13 @@ var le = async (e, t = "Majoor", n = {}) => { onkeydown: (e) => { e.key === "Enter" && o(s.value), e.key === "Escape" && o(null), e.stopPropagation(); } - }), c = U("div", { style: { + }), c = W("div", { style: { display: "flex", flexDirection: "column", gap: "12px", padding: "16px" } }, [ - U("div", { + W("div", { textContent: n, style: { fontWeight: "600", @@ -288,7 +288,7 @@ var le = async (e, t = "Majoor", n = {}) => { color: "rgba(255,255,255,0.95)" } }), - U("div", { + W("div", { textContent: String(e || ""), style: { fontSize: "13px", @@ -298,11 +298,11 @@ var le = async (e, t = "Majoor", n = {}) => { } }), s, - U("div", { style: { + W("div", { style: { display: "flex", justifyContent: "flex-end", gap: "10px" - } }, [U("button", { + } }, [W("button", { textContent: w("dialog.cancel", "Cancel"), onclick: () => o(null), style: { @@ -313,7 +313,7 @@ var le = async (e, t = "Majoor", n = {}) => { color: "rgba(255,255,255,0.85)", cursor: "pointer" } - }), U("button", { + }), W("button", { textContent: w("dialog.ok", "OK"), onclick: () => o(s.value), style: { @@ -327,7 +327,7 @@ var le = async (e, t = "Majoor", n = {}) => { })]) ]); try { - a.show(c), setTimeout(() => G(a), 0), setTimeout(() => { + a.show(c), setTimeout(() => K(a), 0), setTimeout(() => { try { s.focus(), s.select(); } catch (e) { @@ -373,10 +373,10 @@ var le = async (e, t = "Majoor", n = {}) => { console.debug?.(e); } return null; -}, fe = (e, t = "Majoor") => { +}, B = (e, t = "Majoor") => { let n = String(e ?? ""), r = String(t ?? "").trim(); return !r || r.toLowerCase() === "majoor" ? n : `${r}

${n}`; -}, B = /* @__PURE__ */ new Set(/* @__PURE__ */ "abort.blur.change.click.close.contextmenu.dblclick.dragend.dragenter.dragleave.dragover.dragstart.drop.error.focus.input.keydown.keypress.keyup.load.mousedown.mouseenter.mouseleave.mousemove.mouseout.mouseover.mouseup.reset.resize.scroll.select.submit.touchcancel.touchend.touchmove.touchstart.transitionend.unload.wheel".split(".")), V = /* @__PURE__ */ new Set([ +}, V = /* @__PURE__ */ new Set(/* @__PURE__ */ "abort.blur.change.click.close.contextmenu.dblclick.dragend.dragenter.dragleave.dragover.dragstart.drop.error.focus.input.keydown.keypress.keyup.load.mousedown.mouseenter.mouseleave.mousemove.mouseout.mouseover.mouseup.reset.resize.scroll.select.submit.touchcancel.touchend.touchmove.touchstart.transitionend.unload.wheel".split(".")), H = /* @__PURE__ */ new Set([ "__proto__", "constructor", "prototype", @@ -387,7 +387,7 @@ var le = async (e, t = "Majoor", n = {}) => { "__defineSetter__", "__lookupGetter__", "__lookupSetter__" -]), H = /* @__PURE__ */ new Set([ +]), U = /* @__PURE__ */ new Set([ "id", "name", "value", @@ -400,20 +400,20 @@ var le = async (e, t = "Majoor", n = {}) => { "htmlFor", "role", "tabIndex" -]), pe = (e, t = {}, n = []) => { +]), fe = (e, t = {}, n = []) => { let r = document.createElement(e); return Object.entries(t || {}).forEach(([e, t]) => { let n = String(e || ""); - if (n && !V.has(n)) { + if (n && !H.has(n)) { if (e === "style" && t && typeof t == "object") Object.assign(r.style, t); else if (e === "className") r.className = String(t); else if (n.startsWith("on")) { if (typeof t == "function") { let e = n.slice(2).toLowerCase(); - B.has(e) && r.addEventListener(e, t); + V.has(e) && r.addEventListener(e, t); } } else { - if (H.has(n)) try { + if (U.has(n)) try { r[n] = t; return; } catch (e) { @@ -433,19 +433,19 @@ var le = async (e, t = "Majoor", n = {}) => { r.appendChild(document.createTextNode(String(e))); } }), r; -}, U = (e, t, n) => { +}, W = (e, t, n) => { let r = ue(); if (r?.$el) try { return r.$el(e, t, n); } catch {} - return pe(e, t, n); -}, me = () => ue()?.ComfyDialog || null, he = 999999, ge = 560, _e = 12, W = (e) => { + return fe(e, t, n); +}, pe = () => ue()?.ComfyDialog || null, me = 999999, he = 560, ge = 12, G = (e) => { try { - e.element.style.zIndex = String(he), e.element.style.width = `${ge}px`, e.element.style.padding = "0", e.element.style.backgroundColor = "var(--comfy-menu-bg, #131722)", e.element.style.border = "1px solid rgba(255,255,255,0.14)", e.element.style.borderRadius = `${_e}px`, e.element.style.boxSizing = "border-box", e.element.style.overflow = "hidden", e.element.style.boxShadow = "0 18px 48px rgba(0,0,0,0.48)"; + e.element.style.zIndex = String(me), e.element.style.width = `${he}px`, e.element.style.padding = "0", e.element.style.backgroundColor = "var(--comfy-menu-bg, #131722)", e.element.style.border = "1px solid rgba(255,255,255,0.14)", e.element.style.borderRadius = `${ge}px`, e.element.style.boxSizing = "border-box", e.element.style.overflow = "hidden", e.element.style.boxShadow = "0 18px 48px rgba(0,0,0,0.48)"; } catch (e) { console.debug?.(e); } -}, G = (e) => { +}, K = (e) => { try { let t = e?.element; if (!t) return; @@ -463,28 +463,28 @@ var le = async (e, t = "Majoor", n = {}) => { } }; // ui/features/status/AssetStatusDotTheme.ts -function K(e) { +function q(e) { return String(e || "").trim().toLowerCase(); } -function ve({ dot: e = null, asset: t = null, scope: n = "" } = {}) { - let r = K(n); +function _e({ dot: e = null, asset: t = null, scope: n = "" } = {}) { + let r = q(n); if (r) return r === "custom"; - let i = K(t?.type || t?.scope); + let i = q(t?.type || t?.scope); if (i) return i === "custom"; try { - let t = K(e?.closest?.(".mjr-grid")?.dataset?.mjrScope); + let t = q(e?.closest?.(".mjr-grid")?.dataset?.mjrScope); if (t) return t === "custom"; } catch (e) { console.debug?.(e); } return !1; } -function ye(e, t = {}) { - let n = K(e); - return ve(t) ? n === "pending" || n === "info" ? "var(--mjr-browser-status-info, #4DB6AC)" : n === "success" ? "var(--mjr-browser-status-success, #2E7D32)" : n === "warning" ? "var(--mjr-browser-status-warning, #FFB74D)" : n === "error" ? "var(--mjr-browser-status-error, #EF5350)" : "var(--mjr-browser-status-neutral, #90A4AE)" : n === "pending" || n === "info" ? "var(--mjr-status-info, #64B5F6)" : n === "success" ? "var(--mjr-status-success, #4CAF50)" : n === "warning" ? "var(--mjr-status-warning, #FFA726)" : n === "error" ? "var(--mjr-status-error, #f44336)" : "var(--mjr-status-neutral, #666)"; +function ve(e, t = {}) { + let n = q(e); + return _e(t) ? n === "pending" || n === "info" ? "var(--mjr-browser-status-info, #4DB6AC)" : n === "success" ? "var(--mjr-browser-status-success, #2E7D32)" : n === "warning" ? "var(--mjr-browser-status-warning, #FFB74D)" : n === "error" ? "var(--mjr-browser-status-error, #EF5350)" : "var(--mjr-browser-status-neutral, #90A4AE)" : n === "pending" || n === "info" ? "var(--mjr-status-info, #64B5F6)" : n === "success" ? "var(--mjr-status-success, #4CAF50)" : n === "warning" ? "var(--mjr-status-warning, #FFA726)" : n === "error" ? "var(--mjr-status-error, #f44336)" : "var(--mjr-status-neutral, #666)"; } // ui/stores/useRuntimeStore.ts -var q = N("mjr-runtime", () => { +var J = N("mjr-runtime", () => { let e = M(null), t = M(null), n = M(!1), r = M(0), i = M(null), a = M(null), o = M(null), s = M(null), c = M(null), l = M([]), u = A(() => !!i.value), d = A(() => { let e = s.value, t = c.value; return !t || t <= 0 || e == null ? 0 : Math.round(e / t * 100); @@ -532,16 +532,16 @@ var q = N("mjr-runtime", () => { }; }); // ui/stores/getOptionalRuntimeStore.ts -function be() { +function ye() { try { - return ee() ? q() : null; + return ee() ? J() : null; } catch { return null; } } // ui/stores/runtimeEnrichmentState.ts -var xe = Symbol.for("majoor.assets_manager.runtime_state"); -function Se() { +var be = Symbol.for("majoor.assets_manager.runtime_state"); +function xe() { return { api: null, assetsDeletedHandler: null, @@ -549,48 +549,48 @@ function Se() { enrichmentQueueLength: 0 }; } -function Ce() { +function Se() { try { let e = typeof globalThis < "u" ? globalThis : {}; - return e[xe] && typeof e[xe] == "object" || (e[xe] = Se()), e[xe]; + return e[be] && typeof e[be] == "object" || (e[be] = xe()), e[be]; } catch { - return Se(); + return xe(); } } -function we(e, t) { - let n = be(); +function Ce(e, t) { + let n = ye(); if (n) { n.setEnrichmentState(e, t); return; } - let r = Ce(); + let r = Se(); r.enrichmentActive = !!e, r.enrichmentQueueLength = Math.max(0, Number(t || 0) || 0); } -function Te() { - let e = be(); +function we() { + let e = ye(); if (e) return e.getEnrichmentState(); - let t = Ce(); + let t = Se(); return { active: !!t.enrichmentActive, queueLength: Math.max(0, Number(t.enrichmentQueueLength || 0) || 0) }; } // ui/features/grid/AssetCardRenderer.ts -function Ee(e) { +function Te(e) { try { return String(e || "").trim().toLowerCase(); } catch { return ""; } } -function De(e) { +function Ee(e) { try { return (String(e || "").split(".").pop() || "").toUpperCase(); } catch { return ""; } } -function Oe(e) { +function De(e) { try { let t = String(e || ""), n = t.lastIndexOf("."), r = n > 0 ? t.slice(0, n) : t; return String(r || "").trim().toLowerCase(); @@ -598,60 +598,14 @@ function Oe(e) { return ""; } } -function ke(e) { - try { - if (String(e?.kind || "").toLowerCase() !== "video") return !1; - let t = String(e?.filename || "").toLowerCase(); - return t.includes("-audio") || t.includes("_audio"); - } catch { - return !1; - } -} -function Ae(e) { - try { - let t = String(e?.kind || "").toLowerCase(), n = 0; - ke(e) ? n = 2 : t === "video" && (n = 1); - let r = +(Number(e?.has_generation_data || 0) > 0), i = Number(e?.size || 0), a = Number(e?.mtime || 0); - return [ - n, - a, - r, - i - ]; - } catch { - return [ - 0, - 0, - 0, - 0 - ]; - } -} -function je(e, t) { - for (let n = 0; n < Math.max(e.length, t.length); n++) { - let r = (e[n] || 0) - (t[n] || 0); - if (r !== 0) return r; - } - return 0; -} -function Me(e) { - if (!Array.isArray(e) || e.length === 0) return null; - if (e.length === 1) return e[0]; - let t = e[0], n = Ae(t); - for (let r = 1; r < e.length; r++) { - let i = e[r], a = Ae(i); - je(a, n) > 0 && (t = i, n = a); - } - return t; -} -function Ne(e, t) { +function Oe(e, t) { if (!e || !Array.isArray(t) || t.length === 0 || (Number(e?.generation_time_ms ?? e?.metadata?.generation_time_ms ?? 0) || 0) > 0) return e; let n = t.find((e) => (Number(e?.generation_time_ms ?? e?.metadata?.generation_time_ms ?? 0) || 0) > 0); if (!n) return e; let r = Number(n?.generation_time_ms ?? n?.metadata?.generation_time_ms ?? 0) || 0; return r <= 0 || (e.generation_time_ms = r, !e.has_generation_data && n?.has_generation_data && (e.has_generation_data = n.has_generation_data)), e; } -function Pe(e, t) { +function ke(e, t) { let n = String(e?.kind || "").toLowerCase(); if (n) return n; let r = /* @__PURE__ */ new Set([ @@ -687,29 +641,29 @@ function Pe(e, t) { ]); return r.has(t) ? "image" : i.has(t) ? "video" : a.has(t) ? "audio" : o.has(t) ? "model3d" : "unknown"; } -function Fe(e) { +function Ae(e) { try { return !!e()?.siblings?.hidePngSiblings; } catch { return !1; } } -function Ie(e) { +function je(e) { return `${String(e?.source || e?.type || "").trim().toLowerCase()}|${String(e?.root_id || e?.custom_root_id || "").trim().toLowerCase()}|${String(e?.subfolder || "").trim().toLowerCase()}`; } -function J(e) { - let t = Ee(e?.filename); - return t ? `${Ie(e)}|${t}` : ""; +function Me(e) { + let t = Te(e?.filename); + return t ? `${je(e)}|${t}` : ""; } -function Le(e, t = De(e?.filename || "")) { - let n = Pe(e, t), r = String(e?.filename || "").trim(); +function Ne(e, t = Ee(e?.filename || "")) { + let n = ke(e, t), r = String(e?.filename || "").trim(); if (!r) return ""; - let i = Ie(e); + let i = je(e); if (n === "model3d") return `${i}|model3d|${r.toLowerCase()}`; - let a = Oe(r); + let a = De(r); return a ? `${i}|media|${a}` : ""; } -function Re(e) { +function Pe(e) { let t = e.nonImageSiblingKeys || /* @__PURE__ */ new Set(); e.nonImageSiblingKeys = t; let n = e.stemMap || /* @__PURE__ */ new Map(); @@ -724,10 +678,10 @@ function Re(e) { seenKeys: i }; } -function ze(e, t = [], { assetKey: n = null, preserveHiddenCount: r = !1 } = {}) { +function Fe(e, t = [], { assetKey: n = null, preserveHiddenCount: r = !1 } = {}) { let i = Number(e?.hiddenPngSiblings || 0) || 0; e.seenKeys = /* @__PURE__ */ new Set(), e.assetIdSet = /* @__PURE__ */ new Set(), e.filenameCounts = /* @__PURE__ */ new Map(), e.nonImageSiblingKeys = /* @__PURE__ */ new Set(), e.stemMap = /* @__PURE__ */ new Map(), e.renderedFilenameMap = /* @__PURE__ */ new Map(), e.hiddenPngSiblings = r ? i : 0, typeof n == "function" && (e.assetKeyFn = n); - let a = Re(e); + let a = Pe(e); for (let r of Array.isArray(t) ? t : []) if (r && typeof r == "object") { try { let e = r?.id == null ? "" : String(r.id); @@ -742,24 +696,24 @@ function ze(e, t = [], { assetKey: n = null, preserveHiddenCount: r = !1 } = {}) console.debug?.(e); } try { - let t = J(r); + let t = Me(r); t && e.filenameCounts.set(t, (Number(e.filenameCounts.get(t) || 0) || 0) + 1); } catch (e) { console.debug?.(e); } try { - let e = De(r?.filename || ""), t = Le(r, e); + let e = Ee(r?.filename || ""), t = Ne(r, e); if (!t) continue; let n = a.stemMap.get(t); n || (n = [], a.stemMap.set(t, n)), n.push(r); - let i = Pe(r, e); + let i = ke(r, e); (i === "video" || i === "audio" || i === "model3d" || e === "WEBP") && a.nonImageSiblingKeys.add(t); } catch (e) { console.debug?.(e); } } } -function Be(e, t, n) { +function Y(e, t, n) { try { t?.id != null && n.assetIdSet.delete(String(t.id)); } catch (e) { @@ -772,20 +726,20 @@ function Be(e, t, n) { console.debug?.(e); } } -function Ve(e, t, n, r) { +function Ie(e, t, n, r) { let i = n.stemMap.get(t); if (!i?.length) return []; let a = []; for (let e = i.length - 1; e >= 0; e--) r(i[e]) && (a.push(i[e]), i.splice(e, 1)); return i.length || n.stemMap.delete(t), a; } -function He(e, t, n) { - if (!Fe(n)) return { +function Le(e, t, n) { + if (!Ae(n)) return { hidden: !1, hideEnabled: !1, removed: [] }; - let r = Re(t), i = String(e?.filename || ""), a = De(i), o = Pe(e, a), s = Le(e, a); + let r = Pe(t), i = String(e?.filename || ""), a = Ee(i), o = ke(e, a), s = Ne(e, a); if (!s) return { hidden: !1, hideEnabled: !0, @@ -794,10 +748,10 @@ function He(e, t, n) { if (o === "video" || o === "audio" || o === "model3d" || a === "WEBP") return r.nonImageSiblingKeys.add(s), { hidden: !1, hideEnabled: !0, - removed: Ve(t, s, r, (e) => De(e?.filename || "") === "PNG") + removed: Ie(t, s, r, (e) => Ee(e?.filename || "") === "PNG") }; if (a === "PNG") { - let t = `${Ie(e)}|model3d|${Oe(i)}`; + let t = `${je(e)}|model3d|${De(i)}`; if (r.nonImageSiblingKeys.has(s) || r.nonImageSiblingKeys.has(t)) return { hidden: !0, hideEnabled: !0, @@ -810,59 +764,28 @@ function He(e, t, n) { removed: [] }; } -function Ue(e, t, n, r) { - let i = Fe(r.loadMajoorSettings), a = n.filenameCounts || /* @__PURE__ */ new Map(); +function Re(e, t, n, r) { + let i = Ae(r.loadMajoorSettings), a = n.filenameCounts || /* @__PURE__ */ new Map(); n.filenameCounts = a, r.clearGridMessage(e); let o = r.ensureVirtualGrid(e, n); if (!o) return 0; i || (n.hiddenPngSiblings = 0), n.assetKeyFn = r.assetKey; - let s = Re(n), c = /* @__PURE__ */ new Map(); + let s = Pe(n), c = /* @__PURE__ */ new Map(); for (let e of n.assets || []) { - let t = J(e); + let t = Me(e); if (!t) continue; let n = c.get(t); n || (n = [], c.set(t, n)), n.push(e); } let l = 0, u = !1, d = [], f = /* @__PURE__ */ new Set(), p = () => { try { - let t = new Set((Array.isArray(n.assets) ? n.assets : []).map((e) => String(e?.id || "")).filter(Boolean)); - for (let [i, o] of c.entries()) { - let s = (Array.isArray(o) ? o : []).filter((e) => { - let n = String(e?.id || ""); - return n ? t.has(n) : !1; - }), c = s.length; - if (a.set(i, c), c < 2) { - for (let e of s) e._mjrNameCollision = !1, delete e._mjrNameCollisionCount, delete e._mjrNameCollisionPaths, e._mjrDupStack && (e._mjrDupStack = !1, e._mjrDupMembers = null, e._mjrDupCount = 0); - let t = n.renderedFilenameMap?.get(i); - if (t) for (let n of t) { - let t = n.querySelector?.(".mjr-file-badge"); - r.setFileBadgeCollision(t, !1); - try { - r.ensureDupStackCard?.(e, n, n._mjrAsset); - } catch (e) { - console.debug?.(e); - } - } - continue; - } - let l = Ne(Me(s), s), u = s.filter((e) => e !== l); - for (let e of s) e._mjrNameCollision = !1, delete e._mjrNameCollisionCount, delete e._mjrNameCollisionPaths, e !== l && (e._mjrDupStack = !1, e._mjrDupMembers = null, e._mjrDupCount = 0); - let d = Array.isArray(l._mjrDupMembers) ? l._mjrDupMembers : [], f = new Set(d.map((e) => String(e?.id || ""))), p = [...d, ...s.filter((e) => !f.has(String(e?.id || "")))]; - l._mjrDupStack = !0, l._mjrDupMembers = p, l._mjrDupCount = p.length, l._mjrNameCollision = !1; - let m = new Set(u.map((e) => String(e?.id || ""))); - m.size > 0 && (n.assets = n.assets.filter((e) => !m.has(String(e?.id || "")))); - let h = n.renderedFilenameMap?.get(i); - if (h) for (let t of h) { - let n = t._mjrAsset, i = t.querySelector?.(".mjr-file-badge"); - if (n === l || String(n?.id || "") === String(l?.id || "")) { - r.setFileBadgeCollision(i, !1); - try { - r.ensureDupStackCard?.(e, t, l); - } catch (e) { - console.debug?.(e); - } - } - } + let e = new Set((Array.isArray(n.assets) ? n.assets : []).map((e) => String(e?.id || "")).filter(Boolean)); + for (let [t, n] of c.entries()) { + let r = (Array.isArray(n) ? n : []).filter((t) => { + let n = String(t?.id || ""); + return n ? e.has(n) : !1; + }).length; + a.set(t, r); } } catch (e) { console.debug?.(e); @@ -877,13 +800,13 @@ function Ue(e, t, n, r) { } catch (e) { console.debug?.(e); } - let t = De(String(e?.filename || "")), i = He(e, n, r.loadMajoorSettings); + let t = Ee(String(e?.filename || "")), i = Le(e, n, r.loadMajoorSettings); for (let e of i.removed || []) f.add(e); if (i.hidden) { n.hiddenPngSiblings += 1; continue; } - let a = J(e); + let a = Me(e); if (a) { let t = c.get(a); t || (t = [], c.set(a, t)), t.push(e); @@ -891,7 +814,7 @@ function Ue(e, t, n, r) { let o = r.assetKey(e); if (!o || s.seenKeys.has(o) || e.id != null && s.assetIdSet.has(String(e.id))) continue; s.seenKeys.add(o), e.id != null && s.assetIdSet.add(String(e.id)), d.push(e); - let u = Le(e, t); + let u = Ne(e, t); if (u) { let t = s.stemMap.get(u); t || (t = [], s.stemMap.set(u, t)), t.push(e); @@ -901,10 +824,10 @@ function Ue(e, t, n, r) { if (f.size > 0) { n.hiddenPngSiblings += f.size, n.assets = n.assets.filter((e) => !f.has(e)); for (let e = d.length - 1; e >= 0; e--) f.has(d[e]) && (d.splice(e, 1), l = Math.max(0, l - 1)); - for (let e of f) Be(n, e, s); + for (let e of f) Y(n, e, s); try { for (let e of f) { - let t = J(e); + let t = Me(e); if (!t) continue; let n = c.get(t); if (!n) continue; @@ -925,7 +848,7 @@ function Ue(e, t, n, r) { return l; } // ui/components/Badges.ts -function We({ ext: e = "", filename: t = "", count: n = 0, paths: r = [] } = {}) { +function ze({ ext: e = "", filename: t = "", count: n = 0, paths: r = [] } = {}) { let i = String(e || "").trim(), a = String(t || "").trim(), o = Math.max(0, Number(n) || 0), s = Array.isArray(r) ? r.map((e) => String(e || "").trim()).filter(Boolean) : []; if (o < 2) return `${i} file`; let c = [`${i}+ name collision in current view (${o})`]; @@ -936,7 +859,7 @@ function We({ ext: e = "", filename: t = "", count: n = 0, paths: r = [] } = {}) } return c.push("Click to select collisions in current view"), c.join("\n"); } -function Ge(e, t, n = !1, r = null) { +function Be(e, t, n = !1, r = null) { let i = document.createElement("div"); i.className = "mjr-file-badge"; let a = String(e || "").split(".").pop()?.toUpperCase?.() || ""; @@ -950,8 +873,8 @@ function Ge(e, t, n = !1, r = null) { video: "--mjr-badge-video", audio: "--mjr-badge-audio", model3d: "--mjr-badge-model3d" - }[Pe({ kind: t }, a)], s = o ? `var(${o}, #607D8B)` : "#607D8B", c = n ? "var(--mjr-badge-duplicate-alert, #ff1744)" : s; - i.textContent = a + (n ? "+" : ""), i.title = n ? We({ + }[ke({ kind: t }, a)], s = o ? `var(${o}, #607D8B)` : "#607D8B", c = n ? "var(--mjr-badge-duplicate-alert, #ff1744)" : s; + i.textContent = a + (n ? "+" : ""), i.title = n ? ze({ ext: a, filename: e, count: r?.count, @@ -981,10 +904,10 @@ function Ge(e, t, n = !1, r = null) { } return i; } -function Ke(e, t, n = null) { +function Ve(e, t, n = null) { if (e) try { let r = e.dataset?.mjrExt || "", i = e.dataset?.mjrBadgeBg || "var(--mjr-badge-image, #607D8B)"; - e.textContent = String(r || "") + (t ? "+" : ""), e.title = t ? We({ + e.textContent = String(r || "") + (t ? "+" : ""), e.title = t ? ze({ ext: r, filename: n?.filename || "", count: n?.count, @@ -994,18 +917,18 @@ function Ke(e, t, n = null) { console.debug?.(e); } } -function qe(e) { +function He(e) { return e === !0 ? !0 : e === !1 ? !1 : e === 1 || e === "1" ? !0 : e === 0 || e === "0" ? !1 : null; } -function Je(e, t = []) { +function Ue(e, t = []) { if (!e || typeof e != "object") return null; for (let n of t) if (e[n] != null) return e[n]; return null; } -function Ye(e) { +function We(e) { return typeof e == "string" && e.trim().length > 0; } -function Xe(e) { +function Ge(e) { if (Array.isArray(e)) return e.some((e) => String(e ?? "").trim().length > 0); if (e && typeof e == "object") return Object.keys(e).length > 0; if (typeof e != "string") return !1; @@ -1019,44 +942,44 @@ function Xe(e) { } return !0; } -function Y(e) { - let t = Je(e, [ +function Ke(e) { + let t = Ue(e, [ "auto_tags", "autoTags", "ai_auto_tags", "aiAutoTags", "suggested_tags", "suggestedTags" - ]), n = Je(e, [ + ]), n = Ue(e, [ "enhanced_caption", "enhancedCaption", "enhanced_prompt", "enhancedPrompt", "ai_enhanced_prompt", "aiEnhancedPrompt" - ]), r = qe(Je(e, [ + ]), r = He(Ue(e, [ "has_ai_auto_tags", "hasAiAutoTags", "ai_has_auto_tags", "aiHasAutoTags" - ])), i = qe(Je(e, [ + ])), i = He(Ue(e, [ "has_ai_enhanced_caption", "hasAiEnhancedCaption", "ai_has_enhanced_caption", "aiHasEnhancedCaption" - ])), a = qe(Je(e, [ + ])), a = He(Ue(e, [ "has_ai_vector", "hasAiVector", "has_vector_embedding", "hasVectorEmbedding", "vector_indexed", "vectorIndexed" - ])), o = qe(Je(e, [ + ])), o = He(Ue(e, [ "has_ai_info", "hasAiInfo", "ai_indexed", "aiIndexed" - ])), s = r === !0 || r === null && Xe(t), c = i === !0 || i === null && Ye(n), l = a === !0 || o === !0; + ])), s = r === !0 || r === null && Ge(t), c = i === !0 || i === null && We(n), l = a === !0 || o === !0; return { hasAiInfo: o === !0 || s || c || l, hasAutoTags: s, @@ -1064,14 +987,14 @@ function Y(e) { hasVectorIndexed: l }; } -function Ze(e) { +function qe(e) { let t = document.createElement("span"); t.className = "mjr-workflow-dot mjr-asset-status-dot"; - let n = qe(e?.has_workflow ?? e?.hasWorkflow), r = qe(e?.has_generation_data ?? e?.hasGenerationData), i = Te(), a = i.queueLength, o = i.active || a > 0, s = "Pending: parsing metadata...", c = n === !0 || r === !0, l = n === !1 || r === !1, u = n === null || r === null; + let n = He(e?.has_workflow ?? e?.hasWorkflow), r = He(e?.has_generation_data ?? e?.hasGenerationData), i = we(), a = i.queueLength, o = i.active || a > 0, s = "Pending: parsing metadata...", c = n === !0 || r === !0, l = n === !1 || r === !1, u = n === null || r === null; n === !0 && r === !0 ? s = "Complete: workflow + generation data detected" : c ? s = n === !0 ? "Partial: workflow only (generation data missing)" : "Partial: generation data only (workflow missing)" : l && !c && !u ? s = "None: no workflow or generation data found" : u && (s = "Pending: metadata not parsed yet"); let d = u ? "pending" : n === !0 && r === !0 ? "success" : c ? "warning" : "error"; - o && d !== "success" && (d = "pending", s = a > 0 ? `Pending: database metadata enrichment in progress (${a} queued)` : "Pending: database metadata enrichment in progress"), Qe(t, d, s, { asset: e }); - let f = Y(e); + o && d !== "success" && (d = "pending", s = a > 0 ? `Pending: database metadata enrichment in progress (${a} queued)` : "Pending: database metadata enrichment in progress"), Je(t, d, s, { asset: e }); + let f = Ke(e); if (f.hasAiInfo) { let e = []; f.hasVectorIndexed && e.push("vector indexed"), f.hasAutoTags && e.push("AI tag suggestions"), f.hasEnhancedPrompt && e.push("enhanced prompt"), t.textContent = ""; @@ -1093,9 +1016,9 @@ function Ze(e) { } return t; } -function Qe(e, t, n = "", r = {}) { +function Je(e, t, n = "", r = {}) { if (!e) return; - let i = String(t || "").toLowerCase(), a = ye(i, { + let i = String(t || "").toLowerCase(), a = ve(i, { dot: e, ...r || {} }); @@ -1120,7 +1043,7 @@ function Qe(e, t, n = "", r = {}) { console.debug?.(e); } } -function $e(e) { +function Ye(e) { let t = Math.max(0, Math.min(5, Number(e) || 0)); if (t <= 0) return null; let n = document.createElement("div"); @@ -1131,7 +1054,7 @@ function $e(e) { } return n; } -function et(e) { +function Xe(e) { if (Array.isArray(e)) return e.map((e) => String(e ?? "").trim()).filter(Boolean); if (typeof e == "string") { let t = e.trim(); @@ -1144,11 +1067,11 @@ function et(e) { } return []; } -function tt(e) { +function Ze(e) { let t = Number(e) / 1e3; return t >= 60 ? "#FF9800" : t >= 30 ? "#FFC107" : t >= 10 ? "#8BC34A" : "#4CAF50"; } -function nt(e) { +function Qe(e) { let t = e / 1e3; if (t >= 60) { let e = (t / 60).toFixed(1); @@ -1163,7 +1086,7 @@ function nt(e) { title: `Generation time: ${n} seconds` }; } -function rt(e, { maxMs: t = 864e5 } = {}) { +function $e(e, { maxMs: t = 864e5 } = {}) { let n; if (e == null) return 0; if (typeof e == "string") { @@ -1178,14 +1101,14 @@ function rt(e, { maxMs: t = 864e5 } = {}) { } else n = Number(e); return !Number.isFinite(n) || n <= 0 || n >= Number(t) ? 0 : n; } -function it(e) { +function et(e) { let t = document.createElement("div"); t.className = "mjr-tags-badge"; - let n = et(e); + let n = Xe(e); return n.length === 0 ? (t.style.display = "none", t) : (t.textContent = n.join(", "), t.title = `Tags: ${n.join(", ")}`, t.style.cssText = "\n position: absolute;\n bottom: 6px;\n left: 6px;\n padding: 3px 6px;\n border-radius: 4px;\n background: rgba(0,0,0,0.8);\n color: var(--mjr-tag-color, #90CAF9);\n font-size: 9px;\n max-width: 80%;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n pointer-events: none;\n z-index: 10;\n box-shadow: 0 2px 4px rgba(0,0,0,0.3);\n ", t); } // ui/utils/filenames.ts -var at = /* @__PURE__ */ new Set([ +var tt = /* @__PURE__ */ new Set([ "CON", "PRN", "AUX", @@ -1208,17 +1131,17 @@ var at = /* @__PURE__ */ new Set([ "LPT7", "LPT8", "LPT9" -]), ot = 255; -function st(e) { +]), nt = 255; +function rt(e) { try { let t = String(e ?? "").trim(); if (!t) return { valid: !1, reason: "Filename cannot be empty" }; - if (t.length > ot) return { + if (t.length > nt) return { valid: !1, - reason: `Filename is too long (max ${ot} characters)` + reason: `Filename is too long (max ${nt} characters)` }; if (t.includes("/") || t.includes("\\")) return { valid: !1, @@ -1241,7 +1164,7 @@ function st(e) { reason: "Filename cannot end with a dot or space" }; let n = t.split(".")[0].toUpperCase(); - return at.has(n) ? { + return tt.has(n) ? { valid: !1, reason: "Filename uses a reserved Windows name" } : { @@ -1255,15 +1178,15 @@ function st(e) { }; } } -function ct(e) { +function it(e) { try { return String(e ?? "").trim(); } catch { return ""; } } -function lt(e) { - let t = ct(e); +function at(e) { + let t = it(e); if (!t) return { stem: "", ext: "" @@ -1277,14 +1200,14 @@ function lt(e) { ext: t.slice(n) }; } -function ut(e, t) { - let n = ct(e); +function ot(e, t) { + let n = it(e); if (!n) return ""; - let r = lt(t); - return !lt(n).ext && r.ext ? `${n}${r.ext}` : n; + let r = at(t); + return !at(n).ext && r.ext ? `${n}${r.ext}` : n; } // ui/utils/dom.ts -function dt(e, t) { +function st(e, t) { if (!t) return null; try { if (!e) return null; @@ -1296,7 +1219,7 @@ function dt(e, t) { } return null; } -function ft(e) { +function ct(e) { let t = String(e ?? ""); try { if (typeof CSS?.escape == "function") return CSS.escape(t); @@ -1305,7 +1228,7 @@ function ft(e) { } return t.replace(/([!"#$%&'()*+,./:;<=>?@[\\\]^`{|}~])/g, "\\$1"); } -async function pt(e) { +async function lt(e) { try { return navigator?.clipboard?.writeText ? (await navigator.clipboard.writeText(String(e ?? "")), !0) : !1; } catch { @@ -1313,31 +1236,31 @@ async function pt(e) { } } // ui/utils/deleteGuard.ts -async function mt(e, t) { +async function ut(e, t) { return !E.DELETE_CONFIRMATION || !!await I(e > 1 ? w("dialog.deleteSelectedFiles", "Delete {count} selected files?", { count: e }) : w("dialog.deleteSingleFile", "Delete \"{label}\"?", { label: String(t || w("label.thisFile", "this file")) }), w("dialog.confirmDeleteTitle", "Majoor: Confirm delete")); } // ui/features/collections/contextmenu/addToCollectionMenuState.ts -var ht = j({ +var dt = j({ open: !1, x: 0, y: 0, assets: [] }); -function gt() { +function ft() { try { window.dispatchEvent(new CustomEvent("mjr-close-all-menus")); } catch (e) { console.debug?.(e); } } -function _t({ x: e = 0, y: t = 0, assets: n = [] } = {}) { - gt(), ht.open = Array.isArray(n) && n.length > 0, ht.x = Number(e) || 0, ht.y = Number(t) || 0, ht.assets = Array.isArray(n) ? [...n] : []; +function pt({ x: e = 0, y: t = 0, assets: n = [] } = {}) { + ft(), dt.open = Array.isArray(n) && n.length > 0, dt.x = Number(e) || 0, dt.y = Number(t) || 0, dt.assets = Array.isArray(n) ? [...n] : []; } -function vt() { - ht.open = !1, ht.x = 0, ht.y = 0, ht.assets = []; +function mt() { + dt.open = !1, dt.x = 0, dt.y = 0, dt.assets = []; } // ui/features/collections/contextmenu/addToCollectionMenu.ts -function yt(e) { +function ht(e) { if (!e || typeof e != "object") return null; let t = e.filepath || e.path || e?.file_info?.filepath || ""; return t ? { @@ -1349,18 +1272,18 @@ function yt(e) { kind: e.kind || "" } : null; } -async function bt({ x: t, y: n, assets: r }) { - let i = Array.isArray(r) ? r.map(yt).filter(Boolean) : []; - i.length ? _t({ +async function gt({ x: t, y: n, assets: r }) { + let i = Array.isArray(r) ? r.map(ht).filter(Boolean) : []; + i.length ? pt({ x: Number(t) || 0, y: Number(n) || 0, assets: i }) : e(w("toast.noValidAssetsSelected", "No valid assets selected."), "warning"); } // ui/features/contextmenu/ratingUpdater.ts -var xt = 350, St = /* @__PURE__ */ new Map(); -function Ct(e) { - let t = St.get(e); +var _t = 350, vt = /* @__PURE__ */ new Map(); +function yt(e) { + let t = vt.get(e); if (t) { try { clearTimeout(t.timer); @@ -1372,20 +1295,20 @@ function Ct(e) { } catch (e) { console.debug?.(e); } - St.delete(e); + vt.delete(e); } } -function wt(e) { - e && Ct(String(e)); +function bt(e) { + e && yt(String(e)); } -function Tt() { - for (let e of Array.from(St.keys())) wt(e); +function xt() { + for (let e of Array.from(vt.keys())) bt(e); } -function Et(t, r, { onSuccess: i, onFailure: o, successMessage: s = null, errorMessage: c = null, warnPrefix: l = "[RatingUpdater]" } = {}) { +function St(t, r, { onSuccess: i, onFailure: o, successMessage: s = null, errorMessage: c = null, warnPrefix: l = "[RatingUpdater]" } = {}) { if (!t) return; - wt(t); + bt(t); let u = new AbortController(), d = setTimeout(async () => { - St.delete(String(t)); + vt.delete(String(t)); try { let a = await n(t, r, { signal: u.signal }); if (!a?.ok) { @@ -1396,14 +1319,14 @@ function Et(t, r, { onSuccess: i, onFailure: o, successMessage: s = null, errorM } catch (e) { a(e, l, { showToast: !0 }), o?.(e); } - }, xt); - St.set(String(t), { + }, _t); + vt.set(String(t), { timer: d, controller: u }); } // ui/utils/tooltipShortcuts.ts -function Dt(e, t) { +function Ct(e, t) { let n = String(e || "").trim(), r = String(t || "").trim(); if (!r) return n; if (!n) return r; @@ -1413,25 +1336,25 @@ function Dt(e, t) { } else if (n.toLowerCase().includes(r.toLowerCase())) return n; return `${n} (${r})`; } -function Ot(e, t, n, { setAriaLabel: r = !0, ariaLabel: i = null } = {}) { +function wt(e, t, n, { setAriaLabel: r = !0, ariaLabel: i = null } = {}) { if (!e) return ""; - let a = Dt(t, n); + let a = Ct(t, n); if (e.title = a, r) { let r = i ?? t; - e.setAttribute("aria-label", Dt(r, n)); + e.setAttribute("aria-label", Ct(r, n)); } return a; } // ui/utils/safeCall.ts -var kt = () => {}; -function At(e) { +var Tt = () => {}; +function Et(e) { try { return !!E?.[e]; } catch { return !1; } } -function jt(e, t) { +function Dt(e, t) { try { console.warn(`[Majoor] ${e}`, t); } catch (e) { @@ -1442,7 +1365,7 @@ function X(e, t = "safeCall") { try { return e?.(); } catch (e) { - At("DEBUG_SAFE_CALL") && jt(t, e); + Et("DEBUG_SAFE_CALL") && Dt(t, e); return; } } @@ -1452,15 +1375,15 @@ function Z(e, t, n, r, i = "safeAddListener") { try { e?.removeEventListener?.(t, n, r); } catch (e) { - At("DEBUG_SAFE_LISTENERS") && jt(`${i}:remove:${String(t || "")}`, e); + Et("DEBUG_SAFE_LISTENERS") && Dt(`${i}:remove:${String(t || "")}`, e); } }; } catch (e) { - return At("DEBUG_SAFE_LISTENERS") && jt(`${i}:add:${String(t || "")}`, e), kt; + return Et("DEBUG_SAFE_LISTENERS") && Dt(`${i}:add:${String(t || "")}`, e), Tt; } } // ui/utils/mediaFps.ts -function Mt(e) { +function Ot(e) { try { let t = Number(e); if (Number.isFinite(t) && t > 0) return t; @@ -1479,15 +1402,15 @@ function Mt(e) { return null; } } -function Nt(e) { +function kt(e) { try { let t = e, n = t.metadata_raw || {}, r = (n.raw_ffprobe || {}).video_stream || {}; - return Mt(r.avg_frame_rate) ?? Mt(r.r_frame_rate) ?? Mt(n.fps_raw) ?? Mt(n.fps) ?? Mt(n.frame_rate) ?? Mt(t.fps); + return Ot(r.avg_frame_rate) ?? Ot(r.r_frame_rate) ?? Ot(n.fps_raw) ?? Ot(n.fps) ?? Ot(n.frame_rate) ?? Ot(t.fps); } catch { return null; } } -function Pt(e, t) { +function At(e, t) { try { let n = e, r = n.metadata_raw || {}, i = (r.raw_ffprobe || {}).video_stream || {}, a = Number(n.frame_count) || Number(r.frame_count) || Number(r.frames) || Number(i.nb_frames) || Number(i.nb_read_frames) || 0; if (Number.isFinite(a) && a > 0) return Math.floor(a); @@ -1498,27 +1421,27 @@ function Pt(e, t) { } return null; } -function Ft(e) { +function jt(e) { let t = Number(e); return !Number.isFinite(t) || t <= 0 ? "" : Math.abs(t - Math.round(t)) < .001 ? `${Math.round(t)} fps` : `${t.toFixed(3).replace(/\.?0+$/, "")} fps`; } -function It(e, t = 30) { - let n = Mt(e); +function Mt(e, t = 30) { + let n = Ot(e); if (n != null) return Math.max(1, Math.round(n * 1e3) / 1e3); - let r = Mt(t); + let r = Ot(t); return r == null ? 30 : Math.max(1, Math.round(r * 1e3) / 1e3); } // ui/components/VideoControls.ts -var Lt = 400, Rt = 1e3, zt = 220, Bt = .001; -function Vt(e, t) { +var Nt = 400, Pt = 1e3, Ft = 220, It = .001; +function Lt(e, t) { let n = Number(e), r = Math.max(1, Number(t) || 1); if (!Number.isFinite(n) || n <= 0) return 1; let i = n / r, a = 10 ** Math.floor(Math.log10(Math.max(i, .001))), o = i / a; return Math.max(.001, (o <= 1 ? 1 : o <= 2 ? 2 : o <= 5 ? 5 : 10) * a); } -function Ht(e, t, n) { +function Rt(e, t, n) { try { - if (e?.aborted) return kt; + if (e?.aborted) return Tt; let r = setTimeout(() => { try { if (e?.aborted) return; @@ -1551,20 +1474,20 @@ function Ht(e, t, n) { } }; } catch { - return kt; + return Tt; } } -function Ut(e) { +function zt(e) { let t = Math.floor(Number(e) || 0); return t < 10 ? `0${t}` : String(t); } -function Wt(e) { +function Bt(e) { let t = Number(e); if (!Number.isFinite(t) || t < 0) return "0:00"; let n = Math.floor(t), r = Math.floor(n / 3600), i = Math.floor(n % 3600 / 60), a = n % 60; - return r > 0 ? `${r}:${Ut(i)}:${Ut(a)}` : `${i}:${Ut(a)}`; + return r > 0 ? `${r}:${zt(i)}:${zt(a)}` : `${i}:${zt(a)}`; } -function Gt(e, t, n) { +function Vt(e, t, n) { let r = document.createElement("button"); r.type = "button", r.className = `mjr-video-btn ${e || ""}`.trim(), n && (r.title = n); try { @@ -1574,7 +1497,7 @@ function Gt(e, t, n) { } return r.textContent = t, r; } -function Kt(e, t, n, r) { +function Ht(e, t, n, r) { let i = document.createElement("button"); i.type = "button", i.className = `mjr-video-btn ${e || ""}`.trim(), n && (i.title = n); try { @@ -1588,18 +1511,18 @@ function Kt(e, t, n, r) { icon: a }; } -function qt(e, { min: t, max: n, step: r, value: i, title: a, ariaLabel: o, widthPx: s } = {}) { +function Ut(e, { min: t, max: n, step: r, value: i, title: a, ariaLabel: o, widthPx: s } = {}) { let c = document.createElement("input"); return c.type = "number", c.className = `mjr-video-num ${e || ""}`.trim(), a && (c.title = a), o && c.setAttribute("aria-label", o), t != null && (c.min = String(t)), n != null && (c.max = String(n)), r != null && (c.step = String(r)), i != null && (c.value = String(i)), s != null && (c.style.width = `${s}px`), c; } -function Jt(e) { +function Wt(e) { try { return e?.variant === "preview" ? "preview" : e?.variant === "viewerbar" ? "viewerbar" : "viewer"; } catch { return "viewer"; } } -function Yt(e) { +function Gt(e) { try { let t = Number(e?.initialFps); return Number.isFinite(t) && t > 0 ? t : null; @@ -1607,11 +1530,11 @@ function Yt(e) { return null; } } -function Xt(e, t) { +function Kt(e, t) { let n = Number(e), r = Number(t); - return Number.isFinite(n) && Number.isFinite(r) && Math.abs(n - r) <= Bt; + return Number.isFinite(n) && Number.isFinite(r) && Math.abs(n - r) <= It; } -function Zt(e, t) { +function qt(e, t) { let n = []; try { e.controls = !1, e.loop = !0, e.muted = !0, e.playsInline = !0, e.autoplay = !0; @@ -1699,14 +1622,14 @@ function Zt(e, t) { } }; } -function Qt(e, t = {}) { +function Jt(e, t = {}) { try { - let n = Jt(t), r = String(t?.mediaKind || "video").toLowerCase() === "audio", i = n === "viewerbar", a = n !== "preview", o = a, s = Yt(t), c = t?.hostEl || e?.parentElement; + let n = Wt(t), r = String(t?.mediaKind || "video").toLowerCase() === "audio", i = n === "viewerbar", a = n !== "preview", o = a, s = Gt(t), c = t?.hostEl || e?.parentElement; if (!e || !c) return { controlsEl: null, - destroy: kt + destroy: Tt }; - if (n === "preview") return Zt(e, c); + if (n === "preview") return qt(e, c); try { e.loop = !1; } catch (e) { @@ -1724,7 +1647,7 @@ function Qt(e, t = {}) { let f = document.createElement("div"); f.className = "mjr-video-seek-wrap"; let p = document.createElement("input"); - p.className = "mjr-video-range mjr-video-range--seek", p.type = "range", p.min = "0", p.max = String(Rt), p.step = "1", p.value = "0", p.setAttribute("aria-label", w("video.seek", "Seek")), p.title = r ? w("video.seekThroughAudio", "Seek through audio") : w("video.seekThrough", "Seek through video"); + p.className = "mjr-video-range mjr-video-range--seek", p.type = "range", p.min = "0", p.max = String(Pt), p.step = "1", p.value = "0", p.setAttribute("aria-label", w("video.seek", "Seek")), p.title = r ? w("video.seekThroughAudio", "Seek through audio") : w("video.seekThrough", "Seek through video"); let m = document.createElement("div"); m.className = "mjr-video-seek-overlay"; let h = null, g = null, _ = null, v = null; @@ -1758,31 +1681,31 @@ function Qt(e, t = {}) { A.className = "mjr-video-timegroup", A.appendChild(O), o && A.appendChild(k); let j = document.createElement("span"); j.className = "mjr-video-frame", j.textContent = "F: 0", j.title = w("video.currentFrame", "Current frame number"); - let M = Gt("mjr-video-btn--play", w("btn.play", "Play"), w("video.playPauseSpace", "Play/Pause (Space)")), N = Gt("mjr-video-btn--step", "<", w("video.stepBack", "Step back")), ee = Gt("mjr-video-btn--step", ">", w("video.stepForward", "Step forward")), te = Gt("mjr-video-btn--jump mjr-video-btn--in", "|<", w("video.goToIn", "Go to In")), ne = Gt("mjr-video-btn--jump mjr-video-btn--out", ">|", w("video.goToOut", "Go to Out")), re = Gt("mjr-video-btn--mark mjr-video-btn--in", "I", w("video.setInFromCurrent", "Set In from current frame")), ie = Gt("mjr-video-btn--mark mjr-video-btn--out", "O", w("video.setOutFromCurrent", "Set Out from current frame")), ae = Kt("mjr-video-btn--toggle", "pi-refresh", w("video.loopPlaybackInRange", "Loop playback in range"), w("video.loop", "Loop")), oe = ae.btn, se = qt("mjr-video-num--in", { + let M = Vt("mjr-video-btn--play", w("btn.play", "Play"), w("video.playPauseSpace", "Play/Pause (Space)")), N = Vt("mjr-video-btn--step", "<", w("video.stepBack", "Step back")), ee = Vt("mjr-video-btn--step", ">", w("video.stepForward", "Step forward")), te = Vt("mjr-video-btn--jump mjr-video-btn--in", "|<", w("video.goToIn", "Go to In")), ne = Vt("mjr-video-btn--jump mjr-video-btn--out", ">|", w("video.goToOut", "Go to Out")), re = Vt("mjr-video-btn--mark mjr-video-btn--in", "I", w("video.setInFromCurrent", "Set In from current frame")), ie = Vt("mjr-video-btn--mark mjr-video-btn--out", "O", w("video.setOutFromCurrent", "Set Out from current frame")), ae = Ht("mjr-video-btn--toggle", "pi-refresh", w("video.loopPlaybackInRange", "Loop playback in range"), w("video.loop", "Loop")), oe = ae.btn, se = Ut("mjr-video-num--in", { min: 0, step: 1, value: 0, title: w("video.inFrame", "In frame"), ariaLabel: w("video.inFrame", "In frame"), widthPx: 72 - }), ce = qt("mjr-video-num--out", { + }), ce = Ut("mjr-video-num--out", { min: 0, step: 1, value: 0, title: w("video.outFrame", "Out frame"), ariaLabel: w("video.outFrame", "Out frame"), widthPx: 72 - }), le = qt("mjr-video-num--step", { + }), le = Ut("mjr-video-num--step", { min: 1, step: 1, value: 1, title: w("video.frameIncrement", "Frame increment"), ariaLabel: w("video.frameIncrement", "Frame increment"), widthPx: 56 - }), I = qt("mjr-video-num--fps", { + }), I = Ut("mjr-video-num--fps", { min: 1, step: .001, - value: It(s || 30), + value: Mt(s || 30), title: w("video.fpsStepping", "FPS (used for frame stepping)"), ariaLabel: w("video.fps", "FPS"), widthPx: 56 @@ -1803,7 +1726,7 @@ function Qt(e, t = {}) { let t = document.createElement("option"); t.value = String(e), t.textContent = `${e}x`, L.appendChild(t); } - let ue = Kt("mjr-video-btn--mute", "pi-volume-up", w("video.mute", "Mute"), w("video.mute", "Mute")), de = ue.btn, R = document.createElement("div"); + let ue = Ht("mjr-video-btn--mute", "pi-volume-up", w("video.mute", "Mute"), w("video.mute", "Mute")), de = ue.btn, R = document.createElement("div"); R.className = "mjr-video-volume-wrap", R.style.cssText = "display:none; align-items:center; position:relative;"; let z = null; z = document.createElement("input"), z.className = "mjr-video-range mjr-video-range--volume", z.type = "range", z.min = "0", z.max = "1", z.step = "0.02", z.value = String(P(Number(e.volume) || 0)), z.setAttribute("aria-label", w("video.volume", "Volume")), z.title = w("video.volume", "Volume"); @@ -1813,72 +1736,72 @@ function Qt(e, t = {}) { console.debug?.(e); } R.appendChild(z); + let B = document.createElement("div"); + B.className = "mjr-video-group mjr-video-group--in"; + let V = document.createElement("span"); + V.textContent = "In", V.title = w("video.resetInToStart", "Reset In to start"), V.style.cssText = "cursor:pointer; user-select:none;", o && (B.appendChild(V), B.appendChild(se)); + let H = document.createElement("div"); + H.className = "mjr-video-group mjr-video-group--out"; + let U = document.createElement("span"); + U.textContent = "Out", U.title = w("video.resetOutToEnd", "Reset Out to end"), U.style.cssText = "cursor:pointer; user-select:none;", o && (H.appendChild(U), H.appendChild(ce)); let fe = document.createElement("div"); - fe.className = "mjr-video-group mjr-video-group--in"; - let B = document.createElement("span"); - B.textContent = "In", B.title = w("video.resetInToStart", "Reset In to start"), B.style.cssText = "cursor:pointer; user-select:none;", o && (fe.appendChild(B), fe.appendChild(se)); - let V = document.createElement("div"); - V.className = "mjr-video-group mjr-video-group--out"; - let H = document.createElement("span"); - H.textContent = "Out", H.title = w("video.resetOutToEnd", "Reset Out to end"), H.style.cssText = "cursor:pointer; user-select:none;", o && (V.appendChild(H), V.appendChild(ce)); + fe.className = "mjr-video-group mjr-video-group--adjust-left", o && (fe.appendChild(re), r || (fe.appendChild(document.createTextNode(w("video.step", "Step"))), fe.appendChild(le), fe.appendChild(document.createTextNode(w("video.fps", "FPS"))), fe.appendChild(I)), fe.appendChild(j)); + let W = document.createElement("div"); + W.className = "mjr-video-group mjr-video-group--adjust-right", o && (W.appendChild(A), W.appendChild(oe)); let pe = document.createElement("div"); - pe.className = "mjr-video-group mjr-video-group--adjust-left", o && (pe.appendChild(re), r || (pe.appendChild(document.createTextNode(w("video.step", "Step"))), pe.appendChild(le), pe.appendChild(document.createTextNode(w("video.fps", "FPS"))), pe.appendChild(I)), pe.appendChild(j)); - let U = document.createElement("div"); - U.className = "mjr-video-group mjr-video-group--adjust-right", o && (U.appendChild(A), U.appendChild(oe)); + pe.className = "mjr-video-group mjr-video-group--speed", pe.appendChild(document.createTextNode(w("video.speed", "Speed"))), pe.appendChild(L); let me = document.createElement("div"); - me.className = "mjr-video-group mjr-video-group--speed", me.appendChild(document.createTextNode(w("video.speed", "Speed"))), me.appendChild(L); + me.className = "mjr-video-bottom mjr-video-bottom--left"; let he = document.createElement("div"); - he.className = "mjr-video-bottom mjr-video-bottom--left"; + he.className = "mjr-video-transport"; let ge = document.createElement("div"); - ge.className = "mjr-video-transport"; - let _e = document.createElement("div"); - if (_e.className = "mjr-video-bottom mjr-video-bottom--right", ge.appendChild(te), r || ge.appendChild(N), ge.appendChild(M), r || ge.appendChild(ee), ge.appendChild(ne), o && he.appendChild(pe), o && _e.appendChild(U), _e.appendChild(me), _e.appendChild(de), o && _e.appendChild(ie), z && _e.appendChild(R), i) { + if (ge.className = "mjr-video-bottom mjr-video-bottom--right", he.appendChild(te), r || he.appendChild(N), he.appendChild(M), r || he.appendChild(ee), he.appendChild(ne), o && me.appendChild(fe), o && ge.appendChild(W), ge.appendChild(pe), ge.appendChild(de), o && ge.appendChild(ie), z && ge.appendChild(R), i) { let e = document.createElement("div"); - e.className = "mjr-video-bar-timeline", o && e.appendChild(fe), e.appendChild(f), o && e.appendChild(V); + e.className = "mjr-video-bar-timeline", o && e.appendChild(B), e.appendChild(f), o && e.appendChild(H); let t = document.createElement("div"); t.className = "mjr-video-bar-actions"; let n = document.createElement("div"); - n.className = "mjr-video-bar-side mjr-video-bar-side--left", o && n.appendChild(pe); + n.className = "mjr-video-bar-side mjr-video-bar-side--left", o && n.appendChild(fe); let r = document.createElement("div"); - r.className = "mjr-video-bar-center", r.appendChild(ge); + r.className = "mjr-video-bar-center", r.appendChild(he); let i = document.createElement("div"); - i.className = "mjr-video-bar-side mjr-video-bar-side--right", o && i.appendChild(U), i.appendChild(me), i.appendChild(de), o && i.appendChild(ie), z && i.appendChild(R), t.appendChild(n), t.appendChild(r), t.appendChild(i), l.replaceChildren(e, t); - } else o && u.appendChild(j), o && u.appendChild(fe), u.appendChild(f), o && u.appendChild(V), u.appendChild(A), d.appendChild(he), d.appendChild(ge), d.appendChild(_e); - let W = (e) => { + i.className = "mjr-video-bar-side mjr-video-bar-side--right", o && i.appendChild(W), i.appendChild(pe), i.appendChild(de), o && i.appendChild(ie), z && i.appendChild(R), t.appendChild(n), t.appendChild(r), t.appendChild(i), l.replaceChildren(e, t); + } else o && u.appendChild(j), o && u.appendChild(B), u.appendChild(f), o && u.appendChild(H), u.appendChild(A), d.appendChild(me), d.appendChild(he), d.appendChild(ge); + let G = (e) => { try { e.stopPropagation?.(); } catch (e) { console.debug?.(e); } - }, G = (e) => { + }, K = (e) => { try { e.preventDefault?.(); } catch (e) { console.debug?.(e); } - W(e); - }, K = [], ve = (() => { + G(e); + }, q = [], _e = (() => { try { return new AbortController(); } catch { return { signal: { aborted: !1, - addEventListener: kt, - removeEventListener: kt + addEventListener: Tt, + removeEventListener: Tt }, - abort: kt + abort: Tt }; } })(); - K.push(() => { + q.push(() => { try { - ve.abort(); + _e.abort(); } catch (e) { console.debug?.(e); } }); - let ye = () => { + let ve = () => { try { let e = Number(c?.clientWidth) || Number(l?.clientWidth) || 0, t = "regular"; e > 0 && e < 560 ? t = "stacked" : e > 0 && e < 860 && (t = "compact"), l.dataset.mjrLayout = t; @@ -1886,15 +1809,15 @@ function Qt(e, t = {}) { console.debug?.(e); } }; - ye(); + ve(); try { if (typeof ResizeObserver == "function" && c) { let e = typeof requestAnimationFrame == "function" ? requestAnimationFrame : null, t = typeof cancelAnimationFrame == "function" ? cancelAnimationFrame : null, n = 0, r = new ResizeObserver(e ? () => { n ||= e(() => { - n = 0, ye(); + n = 0, ve(); }); - } : () => ye()); - r.observe(c), K.push(() => { + } : () => ve()); + r.observe(c), q.push(() => { try { n && t && t(n), r.disconnect(); } catch (e) { @@ -1905,18 +1828,18 @@ function Qt(e, t = {}) { } catch (e) { console.debug?.(e); } - K.push(Z(l, "pointerdown", W)), K.push(Z(l, "dblclick", G, { capture: !0 })), K.push(Z(l, "wheel", G, { + q.push(Z(l, "pointerdown", G)), q.push(Z(l, "dblclick", K, { capture: !0 })), q.push(Z(l, "wheel", K, { capture: !0, passive: !1 - })), K.push(Z(window, "dblclick", (e) => { + })), q.push(Z(window, "dblclick", (e) => { try { - l.contains?.(e?.target) && G(e); + l.contains?.(e?.target) && K(e); } catch (e) { console.debug?.(e); } - }, { capture: !0 })), K.push(Z(window, "wheel", (e) => { + }, { capture: !0 })), q.push(Z(window, "wheel", (e) => { try { - l.contains?.(e?.target) && G(e); + l.contains?.(e?.target) && K(e); } catch (e) { console.debug?.(e); } @@ -1924,7 +1847,7 @@ function Qt(e, t = {}) { capture: !0, passive: !1 })); - let q = { + let J = { outFrame: null, frameCount: null, loop: o, @@ -1936,38 +1859,38 @@ function Qt(e, t = {}) { _ppRafId: null, _userInteracted: !1 }; - q.nativeFps = s ? It(s, 30) : null, q.fps = q.nativeFps || It(I.value, 30); - let be = () => { - let e = Number(q.nativeFps), t = Number(q.fps); - return Number.isFinite(e) && e > 0 && !Xt(t, e); - }, xe = (e = !1) => { + J.nativeFps = s ? Mt(s, 30) : null, J.fps = J.nativeFps || Mt(I.value, 30); + let ye = () => { + let e = Number(J.nativeFps), t = Number(J.fps); + return Number.isFinite(e) && e > 0 && !Kt(t, e); + }, be = (e = !1) => { try { if (!I || r) return; - let t = Number(q.nativeFps), n = be(), i = w("video.fpsStepping", "FPS (used for frame stepping)"); - I.classList.toggle("is-overridden", n), Number.isFinite(t) && t > 0 ? (I.dataset.defaultFps = String(t), I.title = `${i} - Source FPS: ${t}`, n && (I.title += " - Modified")) : (delete I.dataset.defaultFps, I.title = i), e && !I.matches?.(":focus") && (I.value = String(It(q.fps, q.nativeFps || 30))); + let t = Number(J.nativeFps), n = ye(), i = w("video.fpsStepping", "FPS (used for frame stepping)"); + I.classList.toggle("is-overridden", n), Number.isFinite(t) && t > 0 ? (I.dataset.defaultFps = String(t), I.title = `${i} - Source FPS: ${t}`, n && (I.title += " - Modified")) : (delete I.dataset.defaultFps, I.title = i), e && !I.matches?.(":focus") && (I.value = String(Mt(J.fps, J.nativeFps || 30))); } catch (e) { console.debug?.(e); } }; - xe(!0); - let Se = () => { - if (!q._userInteracted) { - q._userInteracted = !0; + be(!0); + let xe = () => { + if (!J._userInteracted) { + J._userInteracted = !0; try { - e.muted && (e.muted = !1, Ge?.()); + e.muted && (e.muted = !1, We?.()); } catch (e) { console.debug?.(e); } } - }, Ce = null, we = () => { + }, Se = null, Ce = () => { if (o) try { j.classList.add("is-step"); try { - Ce?.(); + Se?.(); } catch (e) { console.debug?.(e); } - Ce = Ht(ve.signal, zt, () => { + Se = Rt(_e.signal, Ft, () => { try { j.classList.remove("is-step"); } catch (e) { @@ -1978,32 +1901,32 @@ function Qt(e, t = {}) { console.debug?.(e); } }; - K.push(() => { + q.push(() => { try { - Ce?.(); + Se?.(); } catch (e) { console.debug?.(e); } - Ce = null; + Se = null; try { j?.classList?.remove?.("is-step"); } catch (e) { console.debug?.(e); } }); - let Te = (e, t) => { + let we = (e, t) => { try { if (!e) return; t ? e.classList.add("is-on") : e.classList.remove("is-on"); } catch (e) { console.debug?.(e); } - }, Ee = (t) => { + }, Te = (t) => { try { let n = Number(t); - if (!Number.isFinite(n) || n <= 0) return q.playbackRate; + if (!Number.isFinite(n) || n <= 0) return J.playbackRate; let r = Math.max(.25, Math.min(10, Math.round(n * 100) / 100)); - q.playbackRate = r; + J.playbackRate = r; try { e.playbackRate = r; } catch (e) { @@ -2016,53 +1939,53 @@ function Qt(e, t = {}) { } return r; } catch { - return q.playbackRate; + return J.playbackRate; } - }, De = () => { + }, Ee = () => { try { - Te(oe, !!(q.loop || q.pingpong)); + we(oe, !!(J.loop || J.pingpong)); try { - ae?.icon && (q.pingpong ? (ae.icon.className = "pi pi-sort-alt", oe.title = w("video.pingpongPlayback", "Ping-pong playback (forward then reverse)")) : (ae.icon.className = "pi pi-refresh", oe.title = w("video.loopPlaybackInRange", "Loop playback in range"))); + ae?.icon && (J.pingpong ? (ae.icon.className = "pi pi-sort-alt", oe.title = w("video.pingpongPlayback", "Ping-pong playback (forward then reverse)")) : (ae.icon.className = "pi pi-refresh", oe.title = w("video.loopPlaybackInRange", "Loop playback in range"))); } catch (e) { console.debug?.(e); } } catch (e) { console.debug?.(e); } - }, Oe = () => { + }, De = () => { try { - let t = Number(q.frameCount); + let t = Number(J.frameCount); if (Number.isFinite(t) && t > 0) return Math.max(1, Math.floor(t)); - let n = Number(e?.duration), r = It(q.fps, 30); + let n = Number(e?.duration), r = Mt(J.fps, 30); return !Number.isFinite(n) || n <= 0 ? 0 : Math.max(0, Math.floor(n * r)); } catch { return 0; } - }, ke = (t = null) => { + }, Oe = (t = null) => { try { - let n = t ?? e?.currentTime, r = Number(n), i = It(q.fps, 30); + let n = t ?? e?.currentTime, r = Number(n), i = Mt(J.fps, 30); return !Number.isFinite(r) || r < 0 ? 0 : Math.max(0, Math.floor(r * i + 1e-6)); } catch { return 0; } - }, Ae = (e) => { - let t = It(q.fps, 30); + }, ke = (e) => { + let t = Mt(J.fps, 30); return Math.max(0, Number(e) || 0) / t; - }, je = () => { + }, Ae = () => { try { - let e = Oe(); + let e = De(); if (e <= 0) return; - let t = q.inFrame == null ? 0 : F(q.inFrame, 0, e), n = q.outFrame == null ? e : F(q.outFrame, 0, e); - n < t ? (q.inFrame = n, q.outFrame = t) : (q.inFrame = t, q.outFrame = n); + let t = J.inFrame == null ? 0 : F(J.inFrame, 0, e), n = J.outFrame == null ? e : F(J.outFrame, 0, e); + n < t ? (J.inFrame = n, J.outFrame = t) : (J.inFrame = t, J.outFrame = n); } catch (e) { console.debug?.(e); } - }, Me = () => { + }, je = () => { try { - let e = Oe(); + let e = De(); return { - inF: q.inFrame == null ? 0 : F(q.inFrame, 0, e), - outF: q.outFrame == null ? e : F(q.outFrame, 0, e), + inF: J.inFrame == null ? 0 : F(J.inFrame, 0, e), + outF: J.outFrame == null ? e : F(J.outFrame, 0, e), maxF: e }; } catch { @@ -2072,29 +1995,29 @@ function Qt(e, t = {}) { maxF: 0 }; } + }, Me = () => { + try { + if (!o || r) return Pt; + let e = De(); + if (Number.isFinite(e) && e > Pt) return Math.max(Pt, Math.floor(e)); + } catch (e) { + console.debug?.(e); + } + return Pt; }, Ne = () => { try { - if (!o || r) return Rt; - let e = Oe(); - if (Number.isFinite(e) && e > Rt) return Math.max(Rt, Math.floor(e)); + p.max = String(Me()); } catch (e) { console.debug?.(e); } - return Rt; }, Pe = () => { try { - p.max = String(Ne()); - } catch (e) { - console.debug?.(e); - } - }, Fe = () => { - try { - let t = !e?.paused || q._ppReverse; + let t = !e?.paused || J._ppReverse; M.textContent = t ? w("video.pause", "Pause") : w("video.play", "Play"); } catch (e) { console.debug?.(e); } - }, Ie = () => { + }, Fe = () => { try { let t = !!e?.muted || (Number(e?.volume) || 0) <= .001; try { @@ -2107,14 +2030,14 @@ function Qt(e, t = {}) { } catch (e) { console.debug?.(e); } - }, J = (t = null) => { + }, Y = (t = null) => { try { let n = Number(e?.duration), i = t ?? e?.currentTime, s = Number(i), c = Number.isFinite(n) && n > 0; - if (O.textContent = `${Wt(s)} / ${c ? Wt(n) : "0:00"}`, p.disabled = !c, c) { + if (O.textContent = `${Bt(s)} / ${c ? Bt(n) : "0:00"}`, p.disabled = !c, c) { let e = P((s || 0) / n); - Pe(); - let t = Math.round(e * Ne()); - Number.isNaN(t) || q._seeking || p.matches?.(":active") || (p.value = String(t)); + Ne(); + let t = Math.round(e * Me()); + Number.isNaN(t) || J._seeking || p.matches?.(":active") || (p.value = String(t)); try { C.style.left = `${e * 100}%`; } catch (e) { @@ -2128,23 +2051,23 @@ function Qt(e, t = {}) { console.debug?.(e); } } - let l = o ? Oe() : 0, u = o ? ke(s) : 0; + let l = o ? De() : 0, u = o ? Oe(s) : 0; if (a) { - o && (j.textContent = r ? `T: ${Wt(s)} / ${Wt(n)}` : `F: ${u} / ${l}`); + o && (j.textContent = r ? `T: ${Bt(s)} / ${Bt(n)}` : `F: ${u} / ${l}`); try { if (Number.isFinite(n) && n > 0) { let e = P((s || 0) / n); - T.style.left = `${e * 100}%`, T.textContent = r ? Wt(s) : String(u), T.style.display = ""; + T.style.left = `${e * 100}%`, T.textContent = r ? Bt(s) : String(u), T.style.display = ""; } else T.style.display = "none"; } catch (e) { console.debug?.(e); } } if (o) { - se.matches?.(":focus") || (se.value = String(q.inFrame ?? 0)), ce.matches?.(":focus") || (ce.value = String(q.outFrame ?? l)); + se.matches?.(":focus") || (se.value = String(J.inFrame ?? 0)), ce.matches?.(":focus") || (ce.value = String(J.outFrame ?? l)); try { - let { inF: e, outF: t, maxF: n } = Me(), i = e <= 0 && t >= n, a = Math.max(0, Math.floor(t) - Math.floor(e) + 1); - !i && n > 0 ? (k.textContent = r ? `R: ${Wt(a / It(q.fps, 30))}` : `R: ${a}f`, k.style.display = "") : k.style.display = "none"; + let { inF: e, outF: t, maxF: n } = je(), i = e <= 0 && t >= n, a = Math.max(0, Math.floor(t) - Math.floor(e) + 1); + !i && n > 0 ? (k.textContent = r ? `R: ${Bt(a / Mt(J.fps, 30))}` : `R: ${a}f`, k.style.display = "") : k.style.display = "none"; } catch (e) { console.debug?.(e); } @@ -2152,7 +2075,7 @@ function Qt(e, t = {}) { } catch (e) { console.debug?.(e); } - }, Le = () => { + }, Ie = () => { if (a && r) try { let t = Number(e?.duration); if (!Number.isFinite(t) || t <= 0) { @@ -2164,7 +2087,7 @@ function Qt(e, t = {}) { } return; } - let n = Vt(t, 80), r = Vt(t, 8), i = n / t * 100, a = r / t * 100; + let n = Lt(t, 80), r = Lt(t, 8), i = n / t * 100, a = r / t * 100; if (Number.isFinite(i) && i > .02) { let e = `repeating-linear-gradient(to right, rgba(255,255,255,0.16) 0, rgba(255,255,255,0.16) 1px, transparent 1px, transparent ${i}%)`, t = `repeating-linear-gradient(to right, rgba(255,255,255,0.3) 0, rgba(255,255,255,0.3) 1px, transparent 1px, transparent ${a}%)`; y.style.backgroundImage = `${t}, ${e}`; @@ -2176,7 +2099,7 @@ function Qt(e, t = {}) { let n = document.createElement("span"); n.className = "mjr-video-seek-label"; let r = Math.max(0, Math.min(t, Number(e) || 0)); - return n.style.left = `${P(r / t) * 100}%`, n.textContent = Wt(r), n; + return n.style.left = `${P(r / t) * 100}%`, n.textContent = Bt(r), n; }; b.appendChild(s(0)); for (let e = r; e < t; e += r) b.appendChild(s(e)); @@ -2184,10 +2107,10 @@ function Qt(e, t = {}) { } catch (e) { console.debug?.(e); } - }, Re = () => { - if (!o) Le(); + }, Le = () => { + if (!o) Ie(); else try { - let { inF: e, outF: t, maxF: n } = Me(); + let { inF: e, outF: t, maxF: n } = je(); if (!Number.isFinite(n) || n <= 0) return; let i = P(e / n) * 100, a = P(t / n) * 100, o = e <= 0 && t >= n; try { @@ -2219,11 +2142,11 @@ function Qt(e, t = {}) { console.debug?.(e); } if (r) { - Le(); + Ie(); return; } try { - let e = Math.max(1, Math.floor(n / Lt)), t = Math.max(e, Math.floor(Number(q.step) || 1)), r = t / n * 100, i = r * 10; + let e = Math.max(1, Math.floor(n / Nt)), t = Math.max(e, Math.floor(Number(J.step) || 1)), r = t / n * 100, i = r * 10; if (Number.isFinite(r) && r > .02) { let e = `repeating-linear-gradient(to right, rgba(255,255,255,0.16) 0, rgba(255,255,255,0.16) 1px, transparent 1px, transparent ${r}%)`, t = `repeating-linear-gradient(to right, rgba(255,255,255,0.28) 0, rgba(255,255,255,0.28) 1px, transparent 1px, transparent ${i}%)`; y.style.backgroundImage = `${t}, ${e}`; @@ -2275,70 +2198,70 @@ function Qt(e, t = {}) { } catch (e) { console.debug?.(e); } - }, ze = ({ prefer: e = null } = {}) => { + }, Re = ({ prefer: e = null } = {}) => { if (o) try { - je(); - let { inF: t, outF: n } = Me(), r = ke(); - e === "in" ? Ke(t) : e === "out" ? r > n && Ke(n) : r < t ? Ke(t) : r > n && Ke(n); + Ae(); + let { inF: t, outF: n } = je(), r = Oe(); + e === "in" ? Ge(t) : e === "out" ? r > n && Ge(n) : r < t ? Ge(t) : r > n && Ge(n); + } catch (e) { + console.debug?.(e); + } + }, ze = () => { + try { + J.inFrame = 0, Ae(), Y(), Le(), Re({ prefer: "in" }); } catch (e) { console.debug?.(e); } }, Be = () => { try { - q.inFrame = 0, je(), J(), Re(), ze({ prefer: "in" }); + let { maxF: e } = je(); + J.outFrame = Math.max(0, Number(e) || 0), Ae(), Y(), Le(), Re({ prefer: "out" }); } catch (e) { console.debug?.(e); } }, Ve = () => { try { - let { maxF: e } = Me(); - q.outFrame = Math.max(0, Number(e) || 0), je(), J(), Re(), ze({ prefer: "out" }); - } catch (e) { - console.debug?.(e); - } - }, He = () => { - try { - q._ppRafId != null && (cancelAnimationFrame(q._ppRafId), q._ppRafId = null); + J._ppRafId != null && (cancelAnimationFrame(J._ppRafId), J._ppRafId = null); } catch (e) { console.debug?.(e); } }; - K.push(He); - let Ue = () => { + q.push(Ve); + let He = () => { try { - He(), q._ppReverse = !0, e.pause?.(), Fe(); - let t = 1e3 / (It(q.fps, 30) * Math.max(.25, Number(q.playbackRate) || 1)), n = performance.now(), r = (i) => { + Ve(), J._ppReverse = !0, e.pause?.(), Pe(); + let t = 1e3 / (Mt(J.fps, 30) * Math.max(.25, Number(J.playbackRate) || 1)), n = performance.now(), r = (i) => { try { - if (!q._ppReverse || !q.pingpong) { - q._ppReverse = !1, Fe(); + if (!J._ppReverse || !J.pingpong) { + J._ppReverse = !1, Pe(); return; } let a = i - n; if (a >= t) { n = i - a % t; - let { inF: r } = Me(), o = ke(); + let { inF: r } = je(), o = Oe(); if (o <= r) { - q._ppReverse = !1, Ke(r); + J._ppReverse = !1, Ge(r); let t = e.play?.(); - t && typeof t.catch == "function" && t.catch(() => {}), Fe(), J(); + t && typeof t.catch == "function" && t.catch(() => {}), Pe(), Y(); return; } - let s = Math.max(1, Math.floor(Number(q.step) || 1)); - Ke(o - s), J(); + let s = Math.max(1, Math.floor(Number(J.step) || 1)); + Ge(o - s), Y(); } - q._ppRafId = requestAnimationFrame(r); + J._ppRafId = requestAnimationFrame(r); } catch (e) { - console.debug?.(e), q._ppReverse = !1, Fe(); + console.debug?.(e), J._ppReverse = !1, Pe(); } }; - q._ppRafId = requestAnimationFrame(r); + J._ppRafId = requestAnimationFrame(r); } catch (e) { - console.debug?.(e), q._ppReverse = !1; + console.debug?.(e), J._ppReverse = !1; } - }, We = () => { + }, Ue = () => { try { - let e = Oe(); - q.inFrame = 0, q.outFrame = e > 0 ? e : null, q.step = 1, q.loop = !!o, q.pingpong = !1, q._ppReverse = !1, He(), q.once = !1, Ee(1); + let e = De(); + J.inFrame = 0, J.outFrame = e > 0 ? e : null, J.step = 1, J.loop = !!o, J.pingpong = !1, J._ppReverse = !1, Ve(), J.once = !1, Te(1); try { le.value = "1"; } catch (e) { @@ -2349,11 +2272,11 @@ function Qt(e, t = {}) { } catch (e) { console.debug?.(e); } - je(), De(), J(), Re(), ze({ prefer: "in" }); + Ae(), Ee(), Y(), Le(), Re({ prefer: "in" }); } catch (e) { console.debug?.(e); } - }, Ge = () => { + }, We = () => { try { let t = P(Number(e?.volume) || 0); try { @@ -2361,133 +2284,133 @@ function Qt(e, t = {}) { } catch (e) { console.debug?.(e); } - Ie(); + Fe(); } catch (e) { console.debug?.(e); } + }, Ge = (t) => { + try { + let { maxF: n } = je(), r = F(t, 0, n > 0 ? n : Infinity); + e.currentTime = ke(r); + } catch (e) { + console.debug?.(e); + } + Y(); }, Ke = (t) => { + xe(); try { - let { maxF: n } = Me(), r = F(t, 0, n > 0 ? n : Infinity); - e.currentTime = Ae(r); - } catch (e) { - console.debug?.(e); - } - J(); - }, qe = (t) => { - Se(); - try { - let n = Math.max(1, Math.floor(Number(q.step) || 1)), { inF: r, outF: i } = Me(), a = ke() + t * n; - q.loop ? (a < r && (a = i), a > i && (a = r)) : a = F(a, r, i); + let n = Math.max(1, Math.floor(Number(J.step) || 1)), { inF: r, outF: i } = je(), a = Oe() + t * n; + J.loop ? (a < r && (a = i), a > i && (a = r)) : a = F(a, r, i); try { e.pause?.(); } catch (e) { console.debug?.(e); } - Ke(a), we(); + Ge(a), Ce(); + } catch (e) { + console.debug?.(e); + } + }, qe = () => { + if (o) try { + Ae(); + let { inF: e, outF: t } = je(), n = Oe(); + (n < e || n > t) && Ge(e); } catch (e) { console.debug?.(e); } }, Je = () => { - if (o) try { - je(); - let { inF: e, outF: t } = Me(), n = ke(); - (n < e || n > t) && Ke(e); - } catch (e) { - console.debug?.(e); - } - }, Ye = () => { - Se(); + xe(); try { - if (q._ppReverse) { - q._ppReverse = !1, He(), Fe(); + if (J._ppReverse) { + J._ppReverse = !1, Ve(), Pe(); return; } if (e.paused) { - Je(); + qe(); let t = e.play?.(); t && typeof t.catch == "function" && t.catch(() => {}); } else e.pause?.(); } catch (e) { console.debug?.(e); } - Fe(); + Pe(); }; - K.push(Z(e, "click", (t) => { + q.push(Z(e, "click", (t) => { try { if (t?.target !== e) return; } catch (e) { console.debug?.(e); } - Ye(); - })), K.push(Z(M, "click", (e) => { - W(e), Ye(); - })), K.push(Z(N, "click", (e) => { - W(e), qe(-1); - })), K.push(Z(ee, "click", (e) => { - W(e), qe(1); - })), K.push(Z(te, "click", (e) => { - W(e); - let { inF: t } = Me(); - Ke(t), we(); - })), K.push(Z(ne, "click", (e) => { - W(e); - let { outF: t } = Me(); - Ke(t), we(); + Je(); + })), q.push(Z(M, "click", (e) => { + G(e), Je(); + })), q.push(Z(N, "click", (e) => { + G(e), Ke(-1); + })), q.push(Z(ee, "click", (e) => { + G(e), Ke(1); + })), q.push(Z(te, "click", (e) => { + G(e); + let { inF: t } = je(); + Ge(t), Ce(); + })), q.push(Z(ne, "click", (e) => { + G(e); + let { outF: t } = je(); + Ge(t), Ce(); })); - let Xe = (t) => { + let Ye = (t) => { try { let n = Number(e?.duration); if (!Number.isFinite(n) || n <= 0) return !1; let r = f.getBoundingClientRect?.(), i = Number(r?.width) || 0; if (!(i > 0)) return !1; let a = F((Number(t) || 0) - Number(r.left || 0), 0, i), o = P(a / i), s = o * n; - return e.currentTime = s, Pe(), p.value = String(Math.round(o * Ne())), J(s), !0; + return e.currentTime = s, Ne(), p.value = String(Math.round(o * Me())), Y(s), !0; } catch (e) { return console.debug?.(e), !1; } - }, Y = { + }, Xe = { active: !1, pointerId: null, ac: null }, Ze = (e = null) => { - if (Y.active) { - e && G(e), Y.active = !1, q._seeking = !1; + if (Xe.active) { + e && K(e), Xe.active = !1, J._seeking = !1; try { - f.releasePointerCapture?.(Y.pointerId); + f.releasePointerCapture?.(Xe.pointerId); } catch (e) { console.debug?.(e); } - Y.pointerId = null; + Xe.pointerId = null; try { - Y.ac?.abort?.(); + Xe.ac?.abort?.(); } catch (e) { console.debug?.(e); } - Y.ac = null, J(); + Xe.ac = null, Y(); } }, Qe = (e) => { - Y.active && (G(e), Xe(e.clientX)); + Xe.active && (K(e), Ye(e.clientX)); }; - if (K.push(() => Ze()), K.push(Z(f, "pointerdown", (e) => { + if (q.push(() => Ze()), q.push(Z(f, "pointerdown", (e) => { try { if (e?.button != null && e.button !== 0 || e?.target?.closest?.(".mjr-video-seek-handle, .mjr-video-seek-mark")) return; } catch (e) { console.debug?.(e); } - G(e), Se(), q._seeking = !0, Y.active = !0, Y.pointerId = e?.pointerId ?? null, Xe(e?.clientX); + K(e), xe(), J._seeking = !0, Xe.active = !0, Xe.pointerId = e?.pointerId ?? null, Ye(e?.clientX); try { - f.setPointerCapture?.(Y.pointerId); + f.setPointerCapture?.(Xe.pointerId); } catch (e) { console.debug?.(e); } try { - Y.ac?.abort?.(); + Xe.ac?.abort?.(); } catch (e) { console.debug?.(e); } try { let e = new AbortController(); - Y.ac = e, window.addEventListener("pointermove", Qe, { + Xe.ac = e, window.addEventListener("pointermove", Qe, { passive: !1, capture: !0, signal: e.signal @@ -2503,69 +2426,69 @@ function Qt(e, t = {}) { } catch (e) { console.debug?.(e); } - }, { passive: !1 })), K.push(Z(p, "pointerdown", () => { - q._seeking = !0; - })), K.push(Z(p, "pointerup", () => { - Y.active || (q._seeking = !1); - })), K.push(Z(p, "pointercancel", () => { - Y.active || (q._seeking = !1); - })), K.push(Z(p, "input", (t) => { - W(t), Se(); + }, { passive: !1 })), q.push(Z(p, "pointerdown", () => { + J._seeking = !0; + })), q.push(Z(p, "pointerup", () => { + Xe.active || (J._seeking = !1); + })), q.push(Z(p, "pointercancel", () => { + Xe.active || (J._seeking = !1); + })), q.push(Z(p, "input", (t) => { + G(t), xe(); try { let t = Number(e?.duration); if (!Number.isFinite(t) || t <= 0) return; let n = Number(p.value); - e.currentTime = P((Number.isFinite(n) ? n : 0) / Ne()) * t; + e.currentTime = P((Number.isFinite(n) ? n : 0) / Me()) * t; } catch (e) { console.debug?.(e); } - J(); + Y(); })), o) { - K.push(Z(re, "click", (e) => { - W(e), q.inFrame = ke(), je(), J(), Re(), ze({ prefer: "in" }); - })), K.push(Z(ie, "click", (e) => { - W(e), q.outFrame = ke(), je(), J(), Re(), ze({ prefer: "out" }); - })), K.push(Z(se, "change", (e) => { - W(e); + q.push(Z(re, "click", (e) => { + G(e), J.inFrame = Oe(), Ae(), Y(), Le(), Re({ prefer: "in" }); + })), q.push(Z(ie, "click", (e) => { + G(e), J.outFrame = Oe(), Ae(), Y(), Le(), Re({ prefer: "out" }); + })), q.push(Z(se, "change", (e) => { + G(e); try { let e = Number(se.value); - q.inFrame = Number.isFinite(e) ? Math.max(0, Math.floor(e)) : null, je(); + J.inFrame = Number.isFinite(e) ? Math.max(0, Math.floor(e)) : null, Ae(); } catch (e) { console.debug?.(e); } - J(), Re(), ze({ prefer: "in" }); - })), K.push(Z(ce, "change", (e) => { - W(e); + Y(), Le(), Re({ prefer: "in" }); + })), q.push(Z(ce, "change", (e) => { + G(e); try { let e = Number(ce.value); - q.outFrame = Number.isFinite(e) ? Math.max(0, Math.floor(e)) : null, je(); + J.outFrame = Number.isFinite(e) ? Math.max(0, Math.floor(e)) : null, Ae(); } catch (e) { console.debug?.(e); } - J(), Re(), ze({ prefer: "out" }); - })), K.push(Z(le, "change", (e) => { - W(e); + Y(), Le(), Re({ prefer: "out" }); + })), q.push(Z(le, "change", (e) => { + G(e); try { - q.step = Math.max(1, Math.floor(Number(le.value) || 1)), le.value = String(q.step); + J.step = Math.max(1, Math.floor(Number(le.value) || 1)), le.value = String(J.step); } catch (e) { console.debug?.(e); } - })), K.push(Z(I, "change", (e) => { - W(e); + })), q.push(Z(I, "change", (e) => { + G(e); try { - q.fps = It(I.value, 30), I.value = String(q.fps), xe(!1), je(); + J.fps = Mt(I.value, 30), I.value = String(J.fps), be(!1), Ae(); } catch (e) { console.debug?.(e); } - J(), Re(); - })), K.push(Z(oe, "click", (e) => { - W(e), !q.loop && !q.pingpong ? (q.loop = !0, q.pingpong = !1) : q.loop && !q.pingpong ? (q.loop = !1, q.pingpong = !0) : (q.loop = !1, q.pingpong = !1), (q.loop || q.pingpong) && (q.once = !1), q.pingpong || (q._ppReverse = !1, He()), De(); - })), K.push(Z(B, "click", (e) => { - W(e), Be(); - })), K.push(Z(H, "click", (e) => { - W(e), Ve(); - })), K.push(Z(k, "click", (e) => { - W(e), We(); + Y(), Le(); + })), q.push(Z(oe, "click", (e) => { + G(e), !J.loop && !J.pingpong ? (J.loop = !0, J.pingpong = !1) : J.loop && !J.pingpong ? (J.loop = !1, J.pingpong = !0) : (J.loop = !1, J.pingpong = !1), (J.loop || J.pingpong) && (J.once = !1), J.pingpong || (J._ppReverse = !1, Ve()), Ee(); + })), q.push(Z(V, "click", (e) => { + G(e), ze(); + })), q.push(Z(U, "click", (e) => { + G(e), Be(); + })), q.push(Z(k, "click", (e) => { + G(e), Ue(); })); try { k.title = w("video.resetPlayerControls", "Reset player controls"), k.style.cursor = "pointer", k.style.userSelect = "none"; @@ -2573,16 +2496,16 @@ function Qt(e, t = {}) { console.debug?.(e); } } - K.push(Z(de, "click", (t) => { - W(t); + q.push(Z(de, "click", (t) => { + G(t); try { e.muted = !e.muted, R && (R.style.display = e.muted ? "none" : "inline-flex"); } catch (e) { console.debug?.(e); } - Ge(); - })), K.push(Z(de, "contextmenu", (e) => { - G(e); + We(); + })), q.push(Z(de, "contextmenu", (e) => { + K(e); try { if (!R) return; let e = R.style.display !== "none"; @@ -2590,27 +2513,27 @@ function Qt(e, t = {}) { } catch (e) { console.debug?.(e); } - Ge(); - })), K.push(Z(window, "pointerdown", (e) => { + We(); + })), q.push(Z(window, "pointerdown", (e) => { try { if (!R || R.style.display === "none" || de.contains?.(e?.target) || R.contains?.(e?.target)) return; R.style.display = "none"; } catch (e) { console.debug?.(e); } - }, { capture: !0 })), z && K.push(Z(z, "input", (t) => { - W(t); + }, { capture: !0 })), z && q.push(Z(z, "input", (t) => { + G(t); try { let t = P(Number(z.value) || 0); e.volume = t, t > .001 && (e.muted = !1); } catch (e) { console.debug?.(e); } - Ge(); - })), K.push(Z(L, "change", (e) => { - W(e); + We(); + })), q.push(Z(L, "change", (e) => { + G(e); try { - Ee(Number(L.value) || 1); + Te(Number(L.value) || 1); } catch (e) { console.debug?.(e); } @@ -2619,48 +2542,48 @@ function Qt(e, t = {}) { } catch (e) { console.debug?.(e); } - })), K.push(Z(e, "ratechange", () => { + })), q.push(Z(e, "ratechange", () => { try { - Ee(Number(e.playbackRate) || q.playbackRate || 1); + Te(Number(e.playbackRate) || J.playbackRate || 1); } catch (e) { console.debug?.(e); } })); let $e = () => { if (o) try { - if (q._seeking || e?.paused) return; - let { inF: t, outF: n, maxF: r } = Me(); - if (r <= 0 || t <= 0 && n >= r && !q.loop && !q.pingpong && !q.once || q._ppReverse) return; - let i = ke(); - if (i >= n - Math.max(1, Math.floor(Number(q.step) || 1))) { - if (q.pingpong) { - Ue(); + if (J._seeking || e?.paused) return; + let { inF: t, outF: n, maxF: r } = je(); + if (r <= 0 || t <= 0 && n >= r && !J.loop && !J.pingpong && !J.once || J._ppReverse) return; + let i = Oe(); + if (i >= n - Math.max(1, Math.floor(Number(J.step) || 1))) { + if (J.pingpong) { + He(); return; } - if (q.loop) { - Ke(t); + if (J.loop) { + Ge(t); try { let t = e.play?.(); t && typeof t.catch == "function" && t.catch(() => {}); } catch (e) { console.debug?.(e); } - } else if (q.once) { + } else if (J.once) { try { e.pause?.(); } catch (e) { console.debug?.(e); } - Ke(n); + Ge(n); } else { try { e.pause?.(); } catch (e) { console.debug?.(e); } - Ke(n); + Ge(n); } - } else i < t && Ke(t); + } else i < t && Ge(t); } catch (e) { console.debug?.(e); } @@ -2683,13 +2606,13 @@ function Qt(e, t = {}) { }, nt = (t = 0, n = null) => { et.rafId = null, et.rvfcId = null; try { - X(J, n?.mediaTime), X($e); + X(Y, n?.mediaTime), X($e); } catch (e) { console.debug?.(e); } - if (!(!q._ppReverse && e?.paused || ve.signal?.aborted)) { + if (!(!J._ppReverse && e?.paused || _e.signal?.aborted)) { try { - if (typeof e?.requestVideoFrameCallback == "function" && !q._ppReverse) { + if (typeof e?.requestVideoFrameCallback == "function" && !J._ppReverse) { et.rvfcId = e.requestVideoFrameCallback(nt); return; } @@ -2705,29 +2628,29 @@ function Qt(e, t = {}) { } } }, rt = () => { - tt(), !(!q._ppReverse && e?.paused || ve.signal?.aborted) && nt(0, { mediaTime: Number(e?.currentTime) || 0 }); + tt(), !(!J._ppReverse && e?.paused || _e.signal?.aborted) && nt(0, { mediaTime: Number(e?.currentTime) || 0 }); }; - K.push(tt), K.push(Z(e, "play", () => { - X(Fe), rt(); + q.push(tt), q.push(Z(e, "play", () => { + X(Pe), rt(); })); - for (let t of ["pause", "ended"]) K.push(Z(e, t, () => { - tt(), X(Fe), X(J); + for (let t of ["pause", "ended"]) q.push(Z(e, t, () => { + tt(), X(Pe), X(Y); })); for (let t of [ "timeupdate", "loadedmetadata", "durationchange", "seeked" - ]) K.push(Z(e, t, () => X(J))); - K.push(Z(e, "timeupdate", $e)), K.push(Z(e, "ended", () => { + ]) q.push(Z(e, t, () => X(Y))); + q.push(Z(e, "timeupdate", $e)), q.push(Z(e, "ended", () => { if (o) try { - let { inF: t, outF: n, maxF: r } = Me(), i = t <= 0 && n >= r; - if (q.pingpong && !q._ppReverse) { - Ue(); + let { inF: t, outF: n, maxF: r } = je(), i = t <= 0 && n >= r; + if (J.pingpong && !J._ppReverse) { + He(); return; } - if (!q.loop && !i) return; - Ke(t); + if (!J.loop && !i) return; + Ge(t); try { let t = e.play?.(); t && typeof t.catch == "function" && t.catch(() => {}); @@ -2737,47 +2660,47 @@ function Qt(e, t = {}) { } catch (e) { console.debug?.(e); } - }, { passive: !0 })), a && (K.push(Z(e, "loadedmetadata", () => { - if (!o) Re(); + }, { passive: !0 })), a && (q.push(Z(e, "loadedmetadata", () => { + if (!o) Le(); else { try { - let e = Oe(); - e > 0 && q.inFrame == null && q.outFrame == null && (q.inFrame = 0, q.outFrame = e, je()); + let e = De(); + e > 0 && J.inFrame == null && J.outFrame == null && (J.inFrame = 0, J.outFrame = e, Ae()); } catch (e) { console.debug?.(e); } - Re(); + Le(); } - })), K.push(Z(e, "durationchange", () => X(Re)))), o && K.push(Z(e, "mjr:frameStep", () => { - X(we); + })), q.push(Z(e, "durationchange", () => X(Le)))), o && q.push(Z(e, "mjr:frameStep", () => { + X(Ce); })); - for (let t of ["volumechange"]) K.push(Z(e, t, () => X(Ge))); + for (let t of ["volumechange"]) q.push(Z(e, t, () => X(We))); try { - q.fps = It(I.value, q.nativeFps || 30), xe(!0), q.step = Math.max(1, Math.floor(Number(le.value) || 1)), je(), De(), Ee(q.playbackRate); + J.fps = Mt(I.value, J.nativeFps || 30), be(!0), J.step = Math.max(1, Math.floor(Number(le.value) || 1)), Ae(), Ee(), Te(J.playbackRate); } catch (e) { console.debug?.(e); } - X(Fe), X(J), X(Re), X(Ge); + X(Pe), X(Y), X(Le), X(We); try { - (!e?.paused || q._ppReverse) && rt(); + (!e?.paused || J._ppReverse) && rt(); } catch (e) { console.debug?.(e); } let it = (e = {}) => { let t = 0, n = !1; try { - t = Math.max(0, Oe()), n = t > 0 && q.outFrame != null && q.outFrame >= t - 1; + t = Math.max(0, De()), n = t > 0 && J.outFrame != null && J.outFrame >= t - 1; } catch (e) { console.debug?.(e); } try { let t = Number(e?.fps); if (Number.isFinite(t) && t > 0) { - if (String(e?.fpsSource || e?.source || "") === "rvfc" && Number(q.nativeFps) > 0) return; - let n = be(); - q.nativeFps = It(t, q.nativeFps || 30), n || (q.fps = q.nativeFps); + if (String(e?.fpsSource || e?.source || "") === "rvfc" && Number(J.nativeFps) > 0) return; + let n = ye(); + J.nativeFps = Mt(t, J.nativeFps || 30), n || (J.fps = J.nativeFps); try { - xe(!0); + be(!0); } catch (e) { console.debug?.(e); } @@ -2787,13 +2710,13 @@ function Qt(e, t = {}) { } try { let t = Number(e?.frameCount); - q.frameCount = Number.isFinite(t) && t > 0 ? Math.floor(t) : null; + J.frameCount = Number.isFinite(t) && t > 0 ? Math.floor(t) : null; } catch { - q.frameCount = null; + J.frameCount = null; } try { - let e = Math.max(0, Oe()); - n && e > t + .5 && (q.outFrame = null), je(), De(), J(), Re(); + let e = Math.max(0, De()); + n && e > t + .5 && (J.outFrame = null), Ae(), Ee(), Y(), Le(); } catch (e) { console.debug?.(e); } @@ -2818,13 +2741,13 @@ function Qt(e, t = {}) { captureEl: null }, t = (e) => { try { - let t = f.getBoundingClientRect(), n = F((Number(e) || 0) - t.left, 0, t.width || 1), r = t.width > 0 ? n / t.width : 0, { maxF: i } = Me(); + let t = f.getBoundingClientRect(), n = F((Number(e) || 0) - t.left, 0, t.width || 1), r = t.width > 0 ? n / t.width : 0, { maxF: i } = je(); return F(Math.round(r * i), 0, i); } catch { return 0; } }, n = (n, a) => { - G(n); + K(n); try { e.ac?.abort?.(); } catch (e) { @@ -2865,15 +2788,15 @@ function Qt(e, t = {}) { console.debug?.(e); } let o = t(n.clientX); - a === "in" ? q.inFrame = o : q.outFrame = o, je(), J(), Re(), ze({ prefer: a }); + a === "in" ? J.inFrame = o : J.outFrame = o, Ae(), Y(), Le(), Re({ prefer: a }); }, r = (n) => { if (!e.active) return; - G(n); + K(n); let r = t(n.clientX); - e.which === "in" ? q.inFrame = r : q.outFrame = r, je(), J(), Re(); + e.which === "in" ? J.inFrame = r : J.outFrame = r, Ae(), Y(), Le(); }, i = (t) => { if (e.active) { - G(t), e.active = !1; + K(t), e.active = !1; try { f.releasePointerCapture?.(e.pointerId); } catch (e) { @@ -2886,7 +2809,7 @@ function Qt(e, t = {}) { } e.captureEl = null, e.pointerId = null; try { - ze({ prefer: e.which }); + Re({ prefer: e.which }); } catch (e) { console.debug?.(e); } @@ -2898,21 +2821,21 @@ function Qt(e, t = {}) { e.ac = null; } }; - K.push(Z(E, "pointerdown", (e) => n(e, "in"), { passive: !1 })), K.push(Z(D, "pointerdown", (e) => n(e, "out"), { passive: !1 })), K.push(Z(x, "pointerdown", (e) => n(e, "in"), { passive: !1 })), K.push(Z(S, "pointerdown", (e) => n(e, "out"), { passive: !1 })), K.push(Z(f, "pointermove", r, { passive: !1 })), K.push(Z(f, "pointerup", i, { passive: !1 })), K.push(Z(f, "pointercancel", i, { passive: !1 })); + q.push(Z(E, "pointerdown", (e) => n(e, "in"), { passive: !1 })), q.push(Z(D, "pointerdown", (e) => n(e, "out"), { passive: !1 })), q.push(Z(x, "pointerdown", (e) => n(e, "in"), { passive: !1 })), q.push(Z(S, "pointerdown", (e) => n(e, "out"), { passive: !1 })), q.push(Z(f, "pointermove", r, { passive: !1 })), q.push(Z(f, "pointerup", i, { passive: !1 })), q.push(Z(f, "pointercancel", i, { passive: !1 })); } return X(() => c.appendChild(l)), { controlsEl: l, setMediaInfo: it, setPlaybackRate: (e) => { try { - return Ee(e); + return Te(e); } catch { - return q.playbackRate || 1; + return J.playbackRate || 1; } }, getPlaybackRate: () => { try { - return Number(q.playbackRate) || 1; + return Number(J.playbackRate) || 1; } catch { return 1; } @@ -2920,21 +2843,21 @@ function Qt(e, t = {}) { adjustPlaybackRate: (e) => { try { let t = Number(e); - return Number.isFinite(t) ? Ee((Number(q.playbackRate) || 1) + t) : q.playbackRate || 1; + return Number.isFinite(t) ? Te((Number(J.playbackRate) || 1) + t) : J.playbackRate || 1; } catch { - return q.playbackRate || 1; + return J.playbackRate || 1; } }, togglePlay: () => { try { - return Ye(), !0; + return Je(), !0; } catch { return !1; } }, stepFrames: (e) => { try { - return qe(e), !0; + return Ke(e), !0; } catch { return !1; } @@ -2942,7 +2865,7 @@ function Qt(e, t = {}) { setInPoint: () => { if (!o) return !1; try { - return q.inFrame = ke(), je(), J(), Re(), ze({ prefer: "in" }), !0; + return J.inFrame = Oe(), Ae(), Y(), Le(), Re({ prefer: "in" }), !0; } catch { return !1; } @@ -2950,7 +2873,7 @@ function Qt(e, t = {}) { setOutPoint: () => { if (!o) return !1; try { - return q.outFrame = ke(), je(), J(), Re(), ze({ prefer: "out" }), !0; + return J.outFrame = Oe(), Ae(), Y(), Le(), Re({ prefer: "out" }), !0; } catch { return !1; } @@ -2958,8 +2881,8 @@ function Qt(e, t = {}) { goToIn: () => { if (!o) return !1; try { - let { inF: e } = Me(); - return Ke(e), we(), !0; + let { inF: e } = je(); + return Ge(e), Ce(), !0; } catch { return !1; } @@ -2967,26 +2890,26 @@ function Qt(e, t = {}) { goToOut: () => { if (!o) return !1; try { - let { outF: e } = Me(); - return Ke(e), we(), !0; + let { outF: e } = je(); + return Ge(e), Ce(), !0; } catch { return !1; } }, destroy: () => { - for (let e of K) X(e); + for (let e of q) X(e); X(() => l.remove()); } }; } catch { return { controlsEl: null, - destroy: kt + destroy: Tt }; } } // ui/features/contextmenu/viewerContextMenuState.ts -function $t() { +function Yt() { return { open: !1, x: 0, @@ -2998,8 +2921,8 @@ function $t() { var Q = j({ portalOwnerId: "", mountedPortalIds: [], - main: $t(), - submenu: $t(), + main: Yt(), + submenu: Yt(), tags: { open: !1, x: 0, @@ -3007,51 +2930,51 @@ var Q = j({ asset: null, onChanged: null } -}), en = 1; -function tn(e) { +}), Xt = 1; +function Zt(e) { e && (e.open = !1, e.x = 0, e.y = 0, e.items = [], e.title = ""); } -function nn(e = "") { +function Qt(e = "") { try { window.dispatchEvent(new CustomEvent("mjr-close-all-menus", { detail: { source: String(e || "") } })); } catch (e) { console.debug?.(e); } } -function rn() { - let e = `mjr-viewer-context-menu-portal-${en++}`; +function $t() { + let e = `mjr-viewer-context-menu-portal-${Xt++}`; return Q.mountedPortalIds.push(e), Q.portalOwnerId ||= e, e; } -function an(e) { +function en(e) { let t = Q.mountedPortalIds.filter((t) => t !== e); Q.mountedPortalIds.splice(0, Q.mountedPortalIds.length, ...t), Q.portalOwnerId === e && (Q.portalOwnerId = Q.mountedPortalIds[0] || ""); } -function on(e) { +function tn(e) { return String(Q.portalOwnerId || "") === String(e || ""); } -function sn({ x: e = 0, y: t = 0, items: n = [], title: r = "" } = {}) { - nn("viewer"), fn(), un(), Q.main.open = !0, Q.main.x = Number(e) || 0, Q.main.y = Number(t) || 0, Q.main.items = Array.isArray(n) ? n.filter(Boolean) : [], Q.main.title = String(r || ""); +function nn({ x: e = 0, y: t = 0, items: n = [], title: r = "" } = {}) { + Qt("viewer"), cn(), on(), Q.main.open = !0, Q.main.x = Number(e) || 0, Q.main.y = Number(t) || 0, Q.main.items = Array.isArray(n) ? n.filter(Boolean) : [], Q.main.title = String(r || ""); } -function cn() { - tn(Q.main), un(); +function rn() { + Zt(Q.main), on(); } -function ln({ x: e = 0, y: t = 0, items: n = [], title: r = "" } = {}) { +function an({ x: e = 0, y: t = 0, items: n = [], title: r = "" } = {}) { Q.submenu.open = !0, Q.submenu.x = Number(e) || 0, Q.submenu.y = Number(t) || 0, Q.submenu.items = Array.isArray(n) ? n.filter(Boolean) : [], Q.submenu.title = String(r || ""); } -function un() { - tn(Q.submenu); +function on() { + Zt(Q.submenu); } -function dn({ x: e = 0, y: t = 0, asset: n = null, onChanged: r = null } = {}) { - cn(), Q.tags.open = !!n, Q.tags.x = Number(e) || 0, Q.tags.y = Number(t) || 0, Q.tags.asset = n || null, Q.tags.onChanged = typeof r == "function" ? r : null; +function sn({ x: e = 0, y: t = 0, asset: n = null, onChanged: r = null } = {}) { + rn(), Q.tags.open = !!n, Q.tags.x = Number(e) || 0, Q.tags.y = Number(t) || 0, Q.tags.asset = n || null, Q.tags.onChanged = typeof r == "function" ? r : null; } -function fn() { +function cn() { Q.tags.open = !1, Q.tags.x = 0, Q.tags.y = 0, Q.tags.asset = null, Q.tags.onChanged = null; } -function pn() { - cn(), fn(); +function ln() { + rn(), cn(); } // ui/features/viewer/ViewerContextMenu.ts -var mn = { +var un = { COPY_PATH: "Ctrl+Shift+C", DOWNLOAD: "S", OPEN_IN_FOLDER: "Ctrl+Shift+E", @@ -3060,19 +2983,19 @@ var mn = { RATING_SUBMENU: "1-5", RENAME: "F2", DELETE: "Del" -}, hn = [ +}, dn = [ "B", "KB", "MB", "GB", "TB" -], gn = /* @__PURE__ */ new WeakMap(), _n = 1; -function vn(e = "viewer-menu-item") { - return `${e}-${_n++}`; +], fn = /* @__PURE__ */ new WeakMap(), pn = 1; +function mn(e = "viewer-menu-item") { + return `${e}-${pn++}`; } -function yn(e, t, n, r, i = {}) { +function hn(e, t, n, r, i = {}) { return { - id: vn(), + id: mn(), type: "item", label: String(e || ""), iconClass: t ? String(t) : "", @@ -3083,13 +3006,13 @@ function yn(e, t, n, r, i = {}) { submenu: Array.isArray(i.submenu) ? i.submenu.filter(Boolean) : null }; } -function bn() { +function gn() { return { - id: vn("viewer-menu-separator"), + id: mn("viewer-menu-separator"), type: "separator" }; } -function xn(e) { +function _n(e) { let t = String(e || "").trim(); if (!t) return !1; if (t.startsWith("/")) return !0; @@ -3100,7 +3023,7 @@ function xn(e) { return !1; } } -function Sn(e, t, r) { +function vn(e, t, r) { let i = e?.id; try { e.rating = t; @@ -3112,7 +3035,7 @@ function Sn(e, t, r) { } catch (e) { console.debug?.(e); } - i ? Et(String(i), t, { + i ? St(String(i), t, { successMessage: t > 0 ? `Rating set to ${t} stars` : "Rating cleared", errorMessage: "Failed to update rating", warnPrefix: "[ViewerContextMenu]", @@ -3129,34 +3052,34 @@ function Sn(e, t, r) { a(e, "[ViewerContextMenu] Rating update", { showToast: !0 }); }); } -function Cn(e) { +function yn(e) { let t = Number(e); if (!Number.isFinite(t) || t < 0) return ""; let n = 0; - for (; t >= 1024 && n < hn.length - 1;) t /= 1024, n += 1; - return `${n === 0 ? `${Math.round(t)}` : t.toFixed(2)} ${hn[n]}`; + for (; t >= 1024 && n < dn.length - 1;) t /= 1024, n += 1; + return `${n === 0 ? `${Math.round(t)}` : t.toFixed(2)} ${dn[n]}`; } -function wn(e, t, n) { +function bn(e, t, n) { let r = [ 5, 4, 3, 2, 1 - ].map((r) => yn(`${r} Stars`, "pi pi-star", null, async () => { - Sn(e, r, t); + ].map((r) => hn(`${r} Stars`, "pi pi-star", null, async () => { + vn(e, r, t); }, { disabled: !n })); - return r.push(bn()), r.push(yn(w("ctx.resetRating", "Reset rating"), "pi pi-star", "0", async () => { - Sn(e, 0, t); + return r.push(gn()), r.push(hn(w("ctx.resetRating", "Reset rating"), "pi pi-star", "0", async () => { + vn(e, 0, t); }, { disabled: !n })), r; } -function Tn({ asset: n, event: r, getCurrentViewUrl: i, onAssetChanged: o }) { +function xn({ asset: n, event: r, getCurrentViewUrl: i, onAssetChanged: o }) { let c = typeof i == "function" ? i(n) : v(n), l = !!(n?.id || n?.filepath); return [ - yn(w("ctx.openInNewTab", "Open in New Tab"), "pi pi-external-link", null, async () => { - xn(c) && window.open(c, "_blank", "noopener,noreferrer"); + hn(w("ctx.openInNewTab", "Open in New Tab"), "pi pi-external-link", null, async () => { + _n(c) && window.open(c, "_blank", "noopener,noreferrer"); }), - yn(w("ctx.copyPath", "Copy path"), "pi pi-copy", mn.COPY_PATH, async () => { + hn(w("ctx.copyPath", "Copy path"), "pi pi-copy", un.COPY_PATH, async () => { let t = n?.filepath ? String(n.filepath) : ""; if (!t) e(w("toast.noFilePath"), "error"); else try { @@ -3165,18 +3088,18 @@ function Tn({ asset: n, event: r, getCurrentViewUrl: i, onAssetChanged: o }) { console.error("[ViewerContextMenu] Copy failed:", t), e(w("toast.pathCopyFailed"), "error"); } }), - yn(w("ctx.downloadOriginal", "Download Original"), "pi pi-download", mn.DOWNLOAD, async () => { + hn(w("ctx.downloadOriginal", "Download Original"), "pi pi-download", un.DOWNLOAD, async () => { if (!n || !n.filepath) return; let t = k(n.filepath), r = document.createElement("a"); r.href = t, r.download = n.filename, document.body.appendChild(r), r.click(), document.body.removeChild(r), e(w("toast.downloadingFile", "Downloading {filename}...", { filename: n.filename }), "info", 3e3); }, { disabled: !n?.filepath }), - yn(w("ctx.openInFolder", "Open in folder"), "pi pi-folder-open", mn.OPEN_IN_FOLDER, async () => { + hn(w("ctx.openInFolder", "Open in folder"), "pi pi-folder-open", un.OPEN_IN_FOLDER, async () => { let t = await s(n); t?.ok ? e(w("toast.openedInFolder"), "info", 2e3) : e(t?.error || w("toast.openFolderFailed"), "error"); }, { disabled: !(n?.id || n?.filepath) }), - yn(w("ctx.addToCollection", "Add to collection"), "pi pi-bookmark", mn.ADD_TO_COLLECTION, async () => { + hn(w("ctx.addToCollection", "Add to collection"), "pi pi-bookmark", un.ADD_TO_COLLECTION, async () => { try { - await bt({ + await gt({ x: r?.clientX, y: r?.clientY, assets: [n] @@ -3185,9 +3108,9 @@ function Tn({ asset: n, event: r, getCurrentViewUrl: i, onAssetChanged: o }) { console.error("[ViewerContextMenu] Add to collection failed:", e); } }), - bn(), - yn(w("ctx.editTags", "Edit tags"), "pi pi-tags", mn.EDIT_TAGS, async () => { - dn({ + gn(), + hn(w("ctx.editTags", "Edit tags"), "pi pi-tags", un.EDIT_TAGS, async () => { + sn({ x: (Number(r?.clientX) || 0) + 6, y: (Number(r?.clientY) || 0) + 6, asset: n, @@ -3205,13 +3128,13 @@ function Tn({ asset: n, event: r, getCurrentViewUrl: i, onAssetChanged: o }) { }) }); }, { closeOnSelect: !1 }), - bn(), - yn(w("ctx.setRating", "Set rating"), "pi pi-star", `${mn.RATING_SUBMENU} >`, null, { + gn(), + hn(w("ctx.setRating", "Set rating"), "pi pi-star", `${un.RATING_SUBMENU} >`, null, { disabled: !l, closeOnSelect: !1, - submenu: wn(n, o, l) + submenu: bn(n, o, l) }), - yn(w("ctx.refreshMetadata", "Refresh metadata"), "pi pi-sync", "R", async () => { + hn(w("ctx.refreshMetadata", "Refresh metadata"), "pi pi-sync", "R", async () => { if (n?.id) try { let t = await p(n.id, { refresh: !0 }); if (!t?.ok || !t?.data) { @@ -3227,7 +3150,7 @@ function Tn({ asset: n, event: r, getCurrentViewUrl: i, onAssetChanged: o }) { } catch (e) { console.debug?.(e); } - let i = [], a = Cn(r?.size_bytes); + let i = [], a = yn(r?.size_bytes); a && i.push(a), r?.mime && i.push(r.mime); let o = i.length ? ` (${i.join(", ")})` : ""; e(w("toast.metadataRefreshed", "Metadata refreshed{suffix}", { suffix: o }), "success", 3e3); @@ -3235,12 +3158,12 @@ function Tn({ asset: n, event: r, getCurrentViewUrl: i, onAssetChanged: o }) { a(e, "[ViewerContextMenu] Metadata refresh", { showToast: !0 }); } }, { disabled: !n?.id }), - bn(), - yn(w("ctx.rename", "Rename"), "pi pi-pencil", mn.RENAME, async () => { + gn(), + hn(w("ctx.rename", "Rename"), "pi pi-pencil", un.RENAME, async () => { if (!(n?.id || n?.filepath)) return; - let t = n.filename || "", r = ut(await L(w("dialog.rename.title", "Rename file"), t), t); + let t = n.filename || "", r = ot(await L(w("dialog.rename.title", "Rename file"), t), t); if (!r || r === t) return; - let i = st(r); + let i = rt(r); if (!i.valid) e(i.reason, "error"); else try { let t = await f(n, r); @@ -3258,8 +3181,8 @@ function Tn({ asset: n, event: r, getCurrentViewUrl: i, onAssetChanged: o }) { e(w("toast.errorRenaming", "Error renaming file: {error}", { error: t?.message || String(t || "") }), "error"); } }, { disabled: !(n?.id || n?.filepath) }), - yn(w("ctx.delete", "Delete"), "pi pi-trash", mn.DELETE, async () => { - if ((n?.id || n?.filepath) && await mt(1, n?.filename)) try { + hn(w("ctx.delete", "Delete"), "pi pi-trash", un.DELETE, async () => { + if ((n?.id || n?.filepath) && await ut(1, n?.filename)) try { let r = await t(n); r?.ok ? (e(w("toast.fileDeletedSuccess"), "success"), o?.()) : e(r?.error || w("toast.fileDeleteFailed"), "error"); } catch (t) { @@ -3268,18 +3191,18 @@ function Tn({ asset: n, event: r, getCurrentViewUrl: i, onAssetChanged: o }) { }, { disabled: !(n?.id || n?.filepath) }) ]; } -function En({ overlayEl: e, getCurrentAsset: t, getCurrentViewUrl: n, onAssetChanged: r } = {}) { +function Sn({ overlayEl: e, getCurrentAsset: t, getCurrentViewUrl: n, onAssetChanged: r } = {}) { if (!e || typeof t != "function") return; - let i = gn.get(e); + let i = fn.get(e); if (typeof i?.unbind == "function") return i.unbind; let a = async (i) => { if (!e.contains(i.target)) return; i.preventDefault(), i.stopPropagation(); let a = t(); - a && sn({ + a && nn({ x: i.clientX, y: i.clientY, - items: Tn({ + items: xn({ asset: a, event: i, getCurrentViewUrl: n, @@ -3299,23 +3222,23 @@ function En({ overlayEl: e, getCurrentAsset: t, getCurrentViewUrl: n, onAssetCha console.debug?.(e); } try { - Tt(); + xt(); let e = globalThis?._ratingDebounceTimers; e && typeof e.clear == "function" && e.clear(); } catch (e) { console.debug?.(e); } try { - pn(); + ln(); } catch (e) { console.debug?.(e); } - gn.delete(e); + fn.delete(e); }; - return gn.set(e, { unbind: o }), o; + return fn.set(e, { unbind: o }), o; } -function Dn(e) { - let t = e ? gn.get(e) : null; +function Cn(e) { + let t = e ? fn.get(e) : null; try { t?.unbind?.(); } catch (e) { @@ -3323,11 +3246,11 @@ function Dn(e) { } } // ui/features/viewer/mediaPlayer.ts -function On(e) { +function wn(e) { let t = String(e || "").toLowerCase(); return t === "video" || t === "audio"; } -function kn({ mode: e, VIEWER_MODES: t, singleView: n, abView: r, sideView: i } = {}) { +function Tn({ mode: e, VIEWER_MODES: t, singleView: n, abView: r, sideView: i } = {}) { try { let a = n; return e === t?.AB_COMPARE ? a = r : e === t?.SIDE_BY_SIDE && (a = i), a ? Array.from(a.querySelectorAll?.(".mjr-viewer-video-src, .mjr-viewer-audio-src") || []) : []; @@ -3335,7 +3258,7 @@ function kn({ mode: e, VIEWER_MODES: t, singleView: n, abView: r, sideView: i } return []; } } -function An(e) { +function En(e) { try { let t = Array.isArray(e) ? e : []; return t.find((e) => String(e?.dataset?.mjrCompareRole || "") === "A") || t[0] || null; @@ -3343,11 +3266,11 @@ function An(e) { return null; } } -function jn(e, t = {}) { +function Dn(e, t = {}) { try { if (!e) return null; let n = String(t?.mediaKind || "").toLowerCase(); - return Qt(e, { + return Jt(e, { ...t, mediaKind: n }); @@ -3356,10 +3279,10 @@ function jn(e, t = {}) { } } // ui/features/viewer/ViewerState.ts -var Mn = "mjr_viewer_prefs_v1"; -function Nn() { +var On = "mjr_viewer_prefs_v1"; +function kn() { try { - let e = y.get(Mn); + let e = y.get(On); if (!e) return {}; let t = JSON.parse(e); return t && typeof t == "object" ? t : {}; @@ -3367,7 +3290,7 @@ function Nn() { return {}; } } -function Pn(e) { +function An(e) { try { if (!e) return; let t = { @@ -3379,13 +3302,13 @@ function Pn(e) { audioVisualizerMode: String(e.audioVisualizerMode || "artistic"), abWipePercent: Number.isFinite(Number(e._abWipePercent)) ? Number(e._abWipePercent) : 50 }; - y.set(Mn, JSON.stringify(t)); + y.set(On, JSON.stringify(t)); } catch (e) { console.debug?.(e); } } // ui/features/viewer/lifecycle.ts -function Fn(e) { +function jn(e) { if (e) { try { e._mjrSyncAbort?.abort?.(); @@ -3458,7 +3381,7 @@ function Fn(e) { } } } -function In(e) { +function Mn(e) { let t = []; try { e._mjrViewerUnsubs = t; @@ -3469,7 +3392,7 @@ function In(e) { unsubs: t, safeAddListener: Z, safeCall: X, - destroyMediaProcessorsIn: Fn, + destroyMediaProcessorsIn: jn, _observer: null, disposeAll: () => { try { @@ -3518,7 +3441,7 @@ function In(e) { return n; } // ui/components/buttons.ts -function Ln(e, t) { +function Nn(e, t) { let n = document.createElement("button"); n.textContent = e, n.title = t || ""; try { @@ -3532,7 +3455,7 @@ function Ln(e, t) { n.disabled || (n.style.background = "transparent"); }, n; } -function Rn(e, t) { +function Pn(e, t) { let n = document.createElement("button"); n.textContent = e, n.dataset.mode = t; try { @@ -3543,7 +3466,7 @@ function Rn(e, t) { return n.style.cssText = "\n padding: 4px 12px;\n background: linear-gradient(180deg, rgba(206, 211, 218, 0.1), rgba(206, 211, 218, 0.03));\n border: 0.8px solid rgba(196, 202, 210, 0.3);\n color: rgba(230, 233, 238, 0.95);\n border-radius: 4px;\n cursor: pointer;\n font-size: 12px;\n transition: all 0.16s;\n ", n; } // ui/features/viewer/toolbarControls.ts -function zn({ VIEWER_MODES: e, state: t, onToolsChanged: n, onCompareModeChanged: r, onExportFrame: i, onCopyFrame: a, onAudioVizModeChanged: o, getCanAB: s } = {}) { +function Fn({ VIEWER_MODES: e, state: t, onToolsChanged: n, onCompareModeChanged: r, onExportFrame: i, onCopyFrame: a, onAudioVizModeChanged: o, getCanAB: s } = {}) { let c = { channel: "rgb", exposureEV: 0, @@ -3837,7 +3760,7 @@ function zn({ VIEWER_MODES: e, state: t, onToolsChanged: n, onCompareModeChanged label: "Golden" } ]); - F.title = Dt(w("tooltip.gridOverlay", "Grid overlay (rule of thirds, center)"), "G"); + F.title = Ct(w("tooltip.gridOverlay", "Grid overlay (rule of thirds, center)"), "G"); let ne = S("Mask", "Format mask (dim outside)", { iconClass: "pi-stop", accentRgb: D.overlay @@ -3885,7 +3808,7 @@ function zn({ VIEWER_MODES: e, state: t, onToolsChanged: n, onCompareModeChanged }), ce = S("Focus", "Distraction-free mode (X)", { iconClass: "pi-window-maximize", accentRgb: D.overlay - }), le = S("Gen", Dt("Generation info (prompt/model)", "D"), { + }), le = S("Gen", Ct("Generation info (prompt/model)", "D"), { iconClass: "pi-book", accentRgb: D.geninfo }), I = b("A/B Compare Mode", [ @@ -3931,7 +3854,7 @@ function zn({ VIEWER_MODES: e, state: t, onToolsChanged: n, onCompareModeChanged label: "Artistic" }]); L.title = w("tooltip.audioVisualizer", "Audio visualizer mode"); - let ue = Ln("Reset", w("tooltip.resetPlayerControls", "Reset all viewer controls")); + let ue = Nn("Reset", w("tooltip.resetPlayerControls", "Reset all viewer controls")); ue.style.height = "26px", ue.style.fontSize = "11px", ue.style.padding = "0 8px", ue.classList?.add?.("mjr-viewer-tool-btn", "mjr-viewer-tool-btn--reset"), ue.classList?.add?.("mjr-viewer-tools-action", "mjr-viewer-tools-action--primary"), ue.style.marginLeft = "auto"; let de = document.createElement("button"); de.type = "button", de.title = w("tooltip.exportFrame", "Save current frame as PNG"), de.setAttribute("aria-label", w("tooltip.exportFrame", "Save frame as PNG")), de.className = "mjr-viewer-tool-btn mjr-viewer-tool-btn--reset", de.style.cssText = "height:24px; padding:0 8px; display:inline-flex; align-items:center; justify-content:center;"; @@ -3944,32 +3867,32 @@ function zn({ VIEWER_MODES: e, state: t, onToolsChanged: n, onCompareModeChanged } let z = document.createElement("button"); z.type = "button", z.title = w("tooltip.copyFrame", "Copy current frame to clipboard"), z.setAttribute("aria-label", w("tooltip.copyFrame", "Copy frame to clipboard")), z.className = "mjr-viewer-tool-btn mjr-viewer-tool-btn--reset", z.style.cssText = "height:24px; padding:0 8px; display:inline-flex; align-items:center; justify-content:center;"; - let fe = document.createElement("span"); - fe.className = "pi pi-copy", fe.setAttribute("aria-hidden", "true"), fe.style.fontSize = "14px", z.appendChild(fe), z.classList?.add?.("mjr-viewer-tools-action"); + let B = document.createElement("span"); + B.className = "pi pi-copy", B.setAttribute("aria-hidden", "true"), B.style.fontSize = "14px", z.appendChild(B), z.classList?.add?.("mjr-viewer-tools-action"); try { z.style.display = "none"; } catch (e) { console.debug?.(e); } - let B = y({ + let V = y({ key: "channel", label: "Channel", accentRgb: D.channel }); - B.appendChild(C), f.body.appendChild(B); - let V = y({ + V.appendChild(C), f.body.appendChild(V); + let H = y({ key: "exposure", label: "EV", accentRgb: D.exposure }); - V.appendChild(T.wrap), f.body.appendChild(V); - let H = y({ + H.appendChild(T.wrap), f.body.appendChild(H); + let U = y({ key: "gamma", label: "Gamma", accentRgb: D.gamma }); - H.appendChild(E.wrap), f.body.appendChild(H); - let pe = () => { + U.appendChild(E.wrap), f.body.appendChild(U); + let fe = () => { try { t.exposureEV = 0; } catch (e) { @@ -3981,7 +3904,7 @@ function zn({ VIEWER_MODES: e, state: t, onToolsChanged: n, onCompareModeChanged console.debug?.(e); } X(n); - }, U = () => { + }, W = () => { try { t.gamma = 1; } catch (e) { @@ -3993,7 +3916,7 @@ function zn({ VIEWER_MODES: e, state: t, onToolsChanged: n, onCompareModeChanged console.debug?.(e); } X(n); - }, me = () => { + }, pe = () => { try { Object.assign(t, c); } catch (e) { @@ -4002,7 +3925,7 @@ function zn({ VIEWER_MODES: e, state: t, onToolsChanged: n, onCompareModeChanged X(r), X(o), X(n); }; try { - let e = V.querySelector?.(".mjr-viewer-tools-group-label"); + let e = H.querySelector?.(".mjr-viewer-tools-group-label"); e && (e.title = w("tooltip.resetExposure", "Reset EV to 0"), e.style.cursor = "pointer", e.style.userSelect = "none"); } catch (e) { console.debug?.(e); @@ -4013,7 +3936,7 @@ function zn({ VIEWER_MODES: e, state: t, onToolsChanged: n, onCompareModeChanged console.debug?.(e); } try { - let e = H.querySelector?.(".mjr-viewer-tools-group-label"); + let e = U.querySelector?.(".mjr-viewer-tools-group-label"); e && (e.title = w("tooltip.resetGamma", "Reset Gamma to 1.00"), e.style.cursor = "pointer", e.style.userSelect = "none"); } catch (e) { console.debug?.(e); @@ -4023,19 +3946,19 @@ function zn({ VIEWER_MODES: e, state: t, onToolsChanged: n, onCompareModeChanged } catch (e) { console.debug?.(e); } - let he = y({ + let me = y({ key: "analysis", label: "Analysis", accentRgb: D.analysis }); - he.appendChild(N.b), he.appendChild(ee.b), he.appendChild(P), f.body.appendChild(he); - let ge = y({ + me.appendChild(N.b), me.appendChild(ee.b), me.appendChild(P), f.body.appendChild(me); + let he = y({ key: "overlay-guides", label: "Guides", accentRgb: D.overlay }); - ge.appendChild(te.b), ge.appendChild(F), ge.appendChild(ne.b), ge.appendChild(re), ge.appendChild(ie.wrap), p.body.appendChild(ge); - let _e = y({ + he.appendChild(te.b), he.appendChild(F), he.appendChild(ne.b), he.appendChild(re), he.appendChild(ie.wrap), p.body.appendChild(he); + let ge = y({ key: "overlay-inspect", label: "Inspect", accentRgb: D.overlay @@ -4047,30 +3970,30 @@ function zn({ VIEWER_MODES: e, state: t, onToolsChanged: n, onCompareModeChanged ce.b, le.b ].forEach((e, t) => { - t > 0 && (e.style.marginLeft = "4px"), _e.appendChild(e); - }), m.body.appendChild(_e); - let W = y({ + t > 0 && (e.style.marginLeft = "4px"), ge.appendChild(e); + }), m.body.appendChild(ge); + let G = y({ key: "compare", label: "Compare", accentRgb: D.compare }); - W.style.borderRadius = "8px", W.style.padding = "4px 6px", W.style.border = "1px solid transparent", W.style.transition = "background 0.15s ease, border-color 0.15s ease, box-shadow 0.15s ease", W.appendChild(I), p.body.appendChild(W); - let G = y({ + G.style.borderRadius = "8px", G.style.padding = "4px 6px", G.style.border = "1px solid transparent", G.style.transition = "background 0.15s ease, border-color 0.15s ease, box-shadow 0.15s ease", G.appendChild(I), p.body.appendChild(G); + let K = y({ key: "audio-viz", label: "Audio Viz", accentRgb: D.audioviz }); - G.appendChild(L), p.body.appendChild(G), _.appendChild(ue), _.appendChild(de), _.appendChild(z); - let K = document.createElement("div"); - K.className = "mjr-viewer-tools-group mjr-viewer-tools-group--3d", K.textContent = "LMB rotate | RMB pan | Scroll zoom", K.style.cssText = "display:none;align-items:center;padding:2px 8px;border-radius:999px;border:1px solid rgba(255,255,255,0.12);background:rgba(255,255,255,0.06);color:rgba(255,255,255,0.55);font-size:10px;font-weight:400;letter-spacing:0.01em", v.appendChild(K); - let ve = document.createElement("div"); - ve.style.cssText = "position: relative; display:inline-flex; align-items:center;", ve.className = "mjr-viewer-tools-action", ve.style.marginLeft = "4px"; - let ye = document.createElement("button"); - ye.type = "button", ye.title = w("tooltip.viewerShortcuts", "Viewer shortcuts"), ye.setAttribute("aria-label", w("tooltip.viewerShortcuts", "Viewer shortcuts")), ye.style.cssText = "\n height: 24px;\n padding: 0 8px;\n border-radius: 6px;\n border: 1px solid rgba(255,255,255,0.14);\n background: rgba(255,255,255,0.08);\n color: rgba(255,255,255,0.92);\n cursor: pointer;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n "; - let q = document.createElement("span"); - q.className = "pi pi-question-circle", q.setAttribute("aria-hidden", "true"), q.style.fontSize = "14px", ye.appendChild(q); - let be = document.createElement("div"); - be.className = "mjr-viewer-help", be.style.cssText = "\n position: absolute;\n right: 0;\n top: 32px;\n min-width: 260px;\n max-width: 360px;\n padding: 10px 12px;\n border-radius: 8px;\n background: rgba(0,0,0,0.88);\n border: 1px solid rgba(255,255,255,0.16);\n color: rgba(255,255,255,0.92);\n font-size: 12px;\n line-height: 1.4;\n box-shadow: 0 8px 24px rgba(0,0,0,0.35);\n display: none;\n z-index: 10002;\n "; + K.appendChild(L), p.body.appendChild(K), _.appendChild(ue), _.appendChild(de), _.appendChild(z); + let q = document.createElement("div"); + q.className = "mjr-viewer-tools-group mjr-viewer-tools-group--3d", q.textContent = "LMB rotate | RMB pan | Scroll zoom", q.style.cssText = "display:none;align-items:center;padding:2px 8px;border-radius:999px;border:1px solid rgba(255,255,255,0.12);background:rgba(255,255,255,0.06);color:rgba(255,255,255,0.55);font-size:10px;font-weight:400;letter-spacing:0.01em", v.appendChild(q); + let _e = document.createElement("div"); + _e.style.cssText = "position: relative; display:inline-flex; align-items:center;", _e.className = "mjr-viewer-tools-action", _e.style.marginLeft = "4px"; + let ve = document.createElement("button"); + ve.type = "button", ve.title = w("tooltip.viewerShortcuts", "Viewer shortcuts"), ve.setAttribute("aria-label", w("tooltip.viewerShortcuts", "Viewer shortcuts")), ve.style.cssText = "\n height: 24px;\n padding: 0 8px;\n border-radius: 6px;\n border: 1px solid rgba(255,255,255,0.14);\n background: rgba(255,255,255,0.08);\n color: rgba(255,255,255,0.92);\n cursor: pointer;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n "; + let J = document.createElement("span"); + J.className = "pi pi-question-circle", J.setAttribute("aria-hidden", "true"), J.style.fontSize = "14px", ve.appendChild(J); + let ye = document.createElement("div"); + ye.className = "mjr-viewer-help", ye.style.cssText = "\n position: absolute;\n right: 0;\n top: 32px;\n min-width: 260px;\n max-width: 360px;\n padding: 10px 12px;\n border-radius: 8px;\n background: rgba(0,0,0,0.88);\n border: 1px solid rgba(255,255,255,0.16);\n color: rgba(255,255,255,0.92);\n font-size: 12px;\n line-height: 1.4;\n box-shadow: 0 8px 24px rgba(0,0,0,0.35);\n display: none;\n z-index: 10002;\n "; try { let e = document.createElement("div"); e.textContent = "Shortcuts", e.style.cssText = "font-weight:600; margin-bottom:6px;"; @@ -4080,11 +4003,11 @@ function zn({ VIEWER_MODES: e, state: t, onToolsChanged: n, onCompareModeChanged let r = document.createElement("div"), i = document.createElement("span"); i.style.cssText = "opacity:.75;", i.textContent = String(e || ""), r.appendChild(i), r.appendChild(document.createTextNode(` ${String(n || "")}`)), t.appendChild(r); }; - n("Esc", "Close"), n("Space", "Play/Pause"), n("+", "Zoom In"), n("-", "Zoom Out"), n("Alt+1", "1:1 Zoom"), n("G", "Grid"), n("D", "Gen Info"), n("Z", "Zebra"), n("I", "Probe"), n("L", "Loupe"), n("X", "Focus Mode"), n("C", "Copy Color"), n("[ / ]", "Speed -/+"), n("\\", "Speed 1x"), n("< / >", "Prev/Next"), n("0-5", "Rating"), be.appendChild(e), be.appendChild(t); + n("Esc", "Close"), n("Space", "Play/Pause"), n("+", "Zoom In"), n("-", "Zoom Out"), n("Alt+1", "1:1 Zoom"), n("G", "Grid"), n("D", "Gen Info"), n("Z", "Zebra"), n("I", "Probe"), n("L", "Loupe"), n("X", "Focus Mode"), n("C", "Copy Color"), n("[ / ]", "Speed -/+"), n("\\", "Speed 1x"), n("< / >", "Prev/Next"), n("0-5", "Rating"), ye.appendChild(e), ye.appendChild(t); } catch (e) { console.debug?.(e); } - return ve.appendChild(ye), ve.appendChild(be), v.appendChild(ve), h.body.appendChild(_), g.body.appendChild(v), u.appendChild(f.panel), u.appendChild(p.panel), u.appendChild(m.panel), u.appendChild(h.panel), u.appendChild(g.panel), l.appendChild(u), { + return _e.appendChild(ve), _e.appendChild(ye), v.appendChild(_e), h.body.appendChild(_), g.body.appendChild(v), u.appendChild(f.panel), u.appendChild(p.panel), u.appendChild(m.panel), u.appendChild(h.panel), u.appendChild(g.panel), l.appendChild(u), { toolsRow: l, gradePanel: f, overlayPanel: p, @@ -4093,18 +4016,18 @@ function zn({ VIEWER_MODES: e, state: t, onToolsChanged: n, onCompareModeChanged infoPanel: g, toolsActions: _, toolsMeta: v, - chGroup: B, - expGroup: V, - gamGroup: H, - anaGroup: he, - ovGuidesGroup: ge, - ovInspectGroup: _e, - cmpGroup: W, - audGroup: G, - model3dHint: K, - helpWrap: ve, - helpBtn: ye, - helpPop: be, + chGroup: V, + expGroup: H, + gamGroup: U, + anaGroup: me, + ovGuidesGroup: he, + ovInspectGroup: ge, + cmpGroup: G, + audGroup: K, + model3dHint: q, + helpWrap: _e, + helpBtn: ve, + helpPop: ye, channelsSelect: C, exposureCtl: T, gammaCtl: E, @@ -4126,9 +4049,9 @@ function zn({ VIEWER_MODES: e, state: t, onToolsChanged: n, onCompareModeChanged resetGradeBtn: ue, exportBtn: de, copyBtn: z, - resetExposure: pe, - resetGamma: U, - resetViewerTools: me, + resetExposure: fe, + resetGamma: W, + resetViewerTools: pe, ACCENT: D, setSelectHighlighted: k, setChannelSelectStyle: A, @@ -4138,7 +4061,7 @@ function zn({ VIEWER_MODES: e, state: t, onToolsChanged: n, onCompareModeChanged }; } // ui/features/viewer/toolbarActions.ts -function Bn({ unsubs: e, state: t, VIEWER_MODES: n, onMode: r, onClose: i, onToolsChanged: a, onCompareModeChanged: o, onAudioVizModeChanged: s, onExportFrame: c, onCopyFrame: l, singleBtn: u, abBtn: d, sideBtn: f, closeBtn: p, channelsSelect: m, compareModeSelect: h, audioVizModeSelect: g, exposureCtl: _, gammaCtl: v, zebraToggle: y, scopesToggle: b, scopesSelect: x, gridToggle: S, gridModeSelect: C, maskToggle: w, formatSelect: T, maskOpacityCtl: E, probeToggle: D, loupeToggle: O, hudToggle: k, focusToggle: A, genInfoToggle: j, resetGradeBtn: M, exportBtn: N, copyBtn: ee, resetExposure: P, resetGamma: te, resetViewerTools: F, expGroup: ne, gamGroup: re }) { +function In({ unsubs: e, state: t, VIEWER_MODES: n, onMode: r, onClose: i, onToolsChanged: a, onCompareModeChanged: o, onAudioVizModeChanged: s, onExportFrame: c, onCopyFrame: l, singleBtn: u, abBtn: d, sideBtn: f, closeBtn: p, channelsSelect: m, compareModeSelect: h, audioVizModeSelect: g, exposureCtl: _, gammaCtl: v, zebraToggle: y, scopesToggle: b, scopesSelect: x, gridToggle: S, gridModeSelect: C, maskToggle: w, formatSelect: T, maskOpacityCtl: E, probeToggle: D, loupeToggle: O, hudToggle: k, focusToggle: A, genInfoToggle: j, resetGradeBtn: M, exportBtn: N, copyBtn: ee, resetExposure: P, resetGamma: te, resetViewerTools: F, expGroup: ne, gamGroup: re }) { e.push(Z(u, "click", () => r?.(n.SINGLE))), e.push(Z(d, "click", () => r?.(n.AB_COMPARE))), e.push(Z(f, "click", () => r?.(n.SIDE_BY_SIDE))), e.push(Z(p, "click", () => i?.())), e.push(Z(m, "change", () => { try { t.channel = String(m.value || "rgb"); @@ -4275,7 +4198,7 @@ function Bn({ unsubs: e, state: t, VIEWER_MODES: n, onMode: r, onClose: i, onToo } })); } -function Vn({ state: e, VIEWER_MODES: t, getCanAB: n, header: r, toolsRow: i, chGroup: a, expGroup: o, gamGroup: s, anaGroup: c, gradePanel: l, overlayPanel: u, inspectPanel: d, infoPanel: f, actionPanel: p, ovGuidesGroup: m, ovInspectGroup: h, model3dHint: g, helpWrap: _, channelsSelect: v, compareModeSelect: y, audioVizModeSelect: b, exposureCtl: x, gammaCtl: S, zebraToggle: C, scopesToggle: w, scopesSelect: T, gridToggle: E, gridModeSelect: D, maskToggle: O, formatSelect: k, maskOpacityCtl: A, probeToggle: j, loupeToggle: M, hudToggle: N, focusToggle: ee, genInfoToggle: P, exportBtn: te, copyBtn: F, resetGradeBtn: ne, cmpGroup: re, audGroup: ie, ACCENT: ae, setSelectHighlighted: oe, setChannelSelectStyle: se, setValueHighlighted: ce, setGroupHighlighted: le }) { +function Ln({ state: e, VIEWER_MODES: t, getCanAB: n, header: r, toolsRow: i, chGroup: a, expGroup: o, gamGroup: s, anaGroup: c, gradePanel: l, overlayPanel: u, inspectPanel: d, infoPanel: f, actionPanel: p, ovGuidesGroup: m, ovInspectGroup: h, model3dHint: g, helpWrap: _, channelsSelect: v, compareModeSelect: y, audioVizModeSelect: b, exposureCtl: x, gammaCtl: S, zebraToggle: C, scopesToggle: w, scopesSelect: T, gridToggle: E, gridModeSelect: D, maskToggle: O, formatSelect: k, maskOpacityCtl: A, probeToggle: j, loupeToggle: M, hudToggle: N, focusToggle: ee, genInfoToggle: P, exportBtn: te, copyBtn: F, resetGradeBtn: ne, cmpGroup: re, audGroup: ie, ACCENT: ae, setSelectHighlighted: oe, setChannelSelectStyle: se, setValueHighlighted: ce, setGroupHighlighted: le }) { let I = e?.assets?.[e?.currentIndex] || null, L = String(I?.kind || "").toLowerCase() === "model3d"; try { let e = L ? "none" : ""; @@ -4485,7 +4408,7 @@ function Vn({ state: e, VIEWER_MODES: t, getCanAB: n, header: r, toolsRow: i, ch console.debug?.(e); } } -function Hn({ state: e, VIEWER_MODES: t, singleBtn: n, abBtn: r, sideBtn: i, canAB: a, canSide: o }) { +function Rn({ state: e, VIEWER_MODES: t, singleBtn: n, abBtn: r, sideBtn: i, canAB: a, canSide: o }) { try { let s = !!a?.(), c = !!o?.(); r.disabled = !s, i.disabled = !c, r.style.opacity = r.disabled ? "0.35" : e.mode === t.AB_COMPARE ? "1" : "0.6", i.style.opacity = i.disabled ? "0.35" : e.mode === t.SIDE_BY_SIDE ? "1" : "0.6", n.style.opacity = e.mode === t.SINGLE ? "1" : "0.6", n.style.fontWeight = e.mode === t.SINGLE ? "600" : "400"; @@ -4499,7 +4422,7 @@ function Hn({ state: e, VIEWER_MODES: t, singleBtn: n, abBtn: r, sideBtn: i, can } } // ui/features/viewer/toolbar.ts -function Un({ VIEWER_MODES: e, state: t, lifecycle: n, onClose: r, _onZoomIn: i, _onZoomOut: a, _onZoomReset: o, _onZoomOneToOne: s, onMode: c, onToolsChanged: l, onCompareModeChanged: u, onExportFrame: d, onCopyFrame: f, onAudioVizModeChanged: p, onToggleFullscreen: m, getCanAB: h } = {}) { +function zn({ VIEWER_MODES: e, state: t, lifecycle: n, onClose: r, _onZoomIn: i, _onZoomOut: a, _onZoomReset: o, _onZoomOneToOne: s, onMode: c, onToolsChanged: l, onCompareModeChanged: u, onExportFrame: d, onCopyFrame: f, onAudioVizModeChanged: p, onToggleFullscreen: m, getCanAB: h } = {}) { let g = n?.unsubs || [], _ = document.createElement("div"); _.className = "mjr-viewer-header", _.style.cssText = "\n display: flex;\n flex-direction: column;\n gap: 6px;\n padding: 8px 16px;\n background: linear-gradient(170deg, rgba(24, 27, 33, 0.96), rgba(17, 19, 25, 0.97));\n border-bottom: 0.8px solid rgba(196, 202, 210, 0.2);\n color: white;\n box-sizing: border-box;\n "; let v = document.createElement("div"); @@ -4522,13 +4445,13 @@ function Un({ VIEWER_MODES: e, state: t, lifecycle: n, onClose: r, _onZoomIn: i, D.className = "mjr-viewer-badges mjr-viewer-badges--right", D.style.cssText = "display:flex; gap:8px; align-items:center; flex-wrap:wrap; justify-content:flex-end;", b.appendChild(S), b.appendChild(C), x.appendChild(b), T.appendChild(D), T.appendChild(E); let O = document.createElement("div"); O.className = "mjr-viewer-mode-buttons", O.style.cssText = "display: flex; gap: 4px;"; - let k = Rn("Single", e.SINGLE); + let k = Pn("Single", e.SINGLE); k.title = w("tooltip.singleViewMode", "Single view mode (one image)"); - let A = Rn("A/B", e.AB_COMPARE); + let A = Pn("A/B", e.AB_COMPARE); A.title = w("tooltip.compareOverlayMode", "A/B compare mode (overlay)"); - let j = Rn("Side", e.SIDE_BY_SIDE); + let j = Pn("Side", e.SIDE_BY_SIDE); j.title = w("tooltip.compareSideBySide", "Side-by-side comparison mode"), O.appendChild(k), O.appendChild(A), O.appendChild(j); - let M = Ln("X", "Close (Esc)"); + let M = Nn("X", "Close (Esc)"); M.style.fontSize = "18px"; try { M.classList.add("mjr-viewer-close"), M.textContent = ""; @@ -4537,7 +4460,7 @@ function Un({ VIEWER_MODES: e, state: t, lifecycle: n, onClose: r, _onZoomIn: i, } catch (e) { console.debug?.(e); } - let N = Ln("[ ]", "Toggle Fullscreen (F)"); + let N = Nn("[ ]", "Toggle Fullscreen (F)"); try { N.classList.add("mjr-viewer-fs"); } catch (e) { @@ -4588,7 +4511,7 @@ function Un({ VIEWER_MODES: e, state: t, lifecycle: n, onClose: r, _onZoomIn: i, console.debug?.(e); } _.appendChild(v), _.appendChild(N), _.appendChild(M); - let { toolsRow: F, gradePanel: ne, overlayPanel: re, inspectPanel: ie, actionPanel: ae, infoPanel: oe, toolsActions: se, toolsMeta: ce, chGroup: le, expGroup: I, gamGroup: L, anaGroup: ue, ovGuidesGroup: de, ovInspectGroup: R, cmpGroup: z, audGroup: fe, model3dHint: B, helpWrap: V, helpBtn: H, helpPop: pe, channelsSelect: U, exposureCtl: me, gammaCtl: he, zebraToggle: ge, scopesToggle: _e, scopesSelect: W, gridToggle: G, gridModeSelect: K, maskToggle: ve, formatSelect: ye, maskOpacityCtl: q, probeToggle: be, loupeToggle: xe, hudToggle: Se, focusToggle: Ce, genInfoToggle: we, compareModeSelect: Te, audioVizModeSelect: Ee, resetGradeBtn: De, exportBtn: Oe, copyBtn: ke, resetExposure: Ae, resetGamma: je, resetViewerTools: Me, ACCENT: Ne, setSelectHighlighted: Pe, setChannelSelectStyle: Fe, setValueHighlighted: Ie, setGroupHighlighted: J } = zn({ + let { toolsRow: F, gradePanel: ne, overlayPanel: re, inspectPanel: ie, actionPanel: ae, infoPanel: oe, toolsActions: se, toolsMeta: ce, chGroup: le, expGroup: I, gamGroup: L, anaGroup: ue, ovGuidesGroup: de, ovInspectGroup: R, cmpGroup: z, audGroup: B, model3dHint: V, helpWrap: H, helpBtn: U, helpPop: fe, channelsSelect: W, exposureCtl: pe, gammaCtl: me, zebraToggle: he, scopesToggle: ge, scopesSelect: G, gridToggle: K, gridModeSelect: q, maskToggle: _e, formatSelect: ve, maskOpacityCtl: J, probeToggle: ye, loupeToggle: be, hudToggle: xe, focusToggle: Se, genInfoToggle: Ce, compareModeSelect: we, audioVizModeSelect: Te, resetGradeBtn: Ee, exportBtn: De, copyBtn: Oe, resetExposure: ke, resetGamma: Ae, resetViewerTools: je, ACCENT: Me, setSelectHighlighted: Ne, setChannelSelectStyle: Pe, setValueHighlighted: Fe, setGroupHighlighted: Y } = Fn({ VIEWER_MODES: e, state: t, onToolsChanged: l, @@ -4598,7 +4521,7 @@ function Un({ VIEWER_MODES: e, state: t, lifecycle: n, onClose: r, _onZoomIn: i, onAudioVizModeChanged: p, getCanAB: h }); - _.appendChild(F), Bn({ + _.appendChild(F), In({ unsubs: g, state: t, VIEWER_MODES: e, @@ -4613,34 +4536,34 @@ function Un({ VIEWER_MODES: e, state: t, lifecycle: n, onClose: r, _onZoomIn: i, abBtn: A, sideBtn: j, closeBtn: M, - channelsSelect: U, - compareModeSelect: Te, - audioVizModeSelect: Ee, - exposureCtl: me, - gammaCtl: he, - zebraToggle: ge, - scopesToggle: _e, - scopesSelect: W, - gridToggle: G, - gridModeSelect: K, - maskToggle: ve, - formatSelect: ye, - maskOpacityCtl: q, - probeToggle: be, - loupeToggle: xe, - hudToggle: Se, - focusToggle: Ce, - genInfoToggle: we, - resetGradeBtn: De, - exportBtn: Oe, - copyBtn: ke, - resetExposure: Ae, - resetGamma: je, - resetViewerTools: Me, + channelsSelect: W, + compareModeSelect: we, + audioVizModeSelect: Te, + exposureCtl: pe, + gammaCtl: me, + zebraToggle: he, + scopesToggle: ge, + scopesSelect: G, + gridToggle: K, + gridModeSelect: q, + maskToggle: _e, + formatSelect: ve, + maskOpacityCtl: J, + probeToggle: ye, + loupeToggle: be, + hudToggle: xe, + focusToggle: Se, + genInfoToggle: Ce, + resetGradeBtn: Ee, + exportBtn: De, + copyBtn: Oe, + resetExposure: ke, + resetGamma: Ae, + resetViewerTools: je, expGroup: I, gamGroup: L }); - let Le = () => Vn({ + let Ie = () => Ln({ state: t, VIEWER_MODES: e, getCanAB: h, @@ -4657,37 +4580,37 @@ function Un({ VIEWER_MODES: e, state: t, lifecycle: n, onClose: r, _onZoomIn: i, actionPanel: ae, ovGuidesGroup: de, ovInspectGroup: R, - model3dHint: B, - helpWrap: V, - channelsSelect: U, - compareModeSelect: Te, - audioVizModeSelect: Ee, - exposureCtl: me, - gammaCtl: he, - zebraToggle: ge, - scopesToggle: _e, - scopesSelect: W, - gridToggle: G, - gridModeSelect: K, - maskToggle: ve, - formatSelect: ye, - maskOpacityCtl: q, - probeToggle: be, - loupeToggle: xe, - hudToggle: Se, - focusToggle: Ce, - genInfoToggle: we, - exportBtn: Oe, - copyBtn: ke, - resetGradeBtn: De, + model3dHint: V, + helpWrap: H, + channelsSelect: W, + compareModeSelect: we, + audioVizModeSelect: Te, + exposureCtl: pe, + gammaCtl: me, + zebraToggle: he, + scopesToggle: ge, + scopesSelect: G, + gridToggle: K, + gridModeSelect: q, + maskToggle: _e, + formatSelect: ve, + maskOpacityCtl: J, + probeToggle: ye, + loupeToggle: be, + hudToggle: xe, + focusToggle: Se, + genInfoToggle: Ce, + exportBtn: De, + copyBtn: Oe, + resetGradeBtn: Ee, cmpGroup: z, - audGroup: fe, - ACCENT: Ne, - setSelectHighlighted: Pe, - setChannelSelectStyle: Fe, - setValueHighlighted: Ie, - setGroupHighlighted: J - }), Re = ({ canAB: n, canSide: r } = {}) => Hn({ + audGroup: B, + ACCENT: Me, + setSelectHighlighted: Ne, + setChannelSelectStyle: Pe, + setValueHighlighted: Fe, + setGroupHighlighted: Y + }), Le = ({ canAB: n, canSide: r } = {}) => Rn({ state: t, VIEWER_MODES: e, singleBtn: k, @@ -4705,20 +4628,20 @@ function Un({ VIEWER_MODES: e, state: t, lifecycle: n, onClose: r, _onZoomIn: i, } e = null; try { - pe.style.display = "none"; + fe.style.display = "none"; } catch (e) { console.debug?.(e); } }, n = () => { t(), e = new AbortController(); try { - pe.style.display = ""; + fe.style.display = ""; } catch (e) { console.debug?.(e); } try { document.addEventListener("mousedown", (e) => { - V.contains(e.target) || t(); + H.contains(e.target) || t(); }, { capture: !0, signal: e.signal @@ -4736,8 +4659,8 @@ function Un({ VIEWER_MODES: e, state: t, lifecycle: n, onClose: r, _onZoomIn: i, console.debug?.(e); } }; - g.push(() => t()), g.push(Z(H, "click", () => { - pe.style.display === "none" ? n() : t(); + g.push(() => t()), g.push(Z(U, "click", () => { + fe.style.display === "none" ? n() : t(); })); } catch (e) { console.debug?.(e); @@ -4757,12 +4680,12 @@ function Un({ VIEWER_MODES: e, state: t, lifecycle: n, onClose: r, _onZoomIn: i, titleLineEl: b, titleWrapEl: x, modeButtonsEl: O, - syncToolsUIFromState: Le, - syncModeButtons: Re + syncToolsUIFromState: Ie, + syncModeButtons: Le }; } // ui/features/viewer/keyboard.ts -function Wn(e) { +function Bn(e) { if (!e) return null; try { if (typeof e.prompt == "string" && e.prompt.trim()) return e.prompt.trim(); @@ -4792,7 +4715,7 @@ function Wn(e) { } return null; } -function Gn({ overlay: t, _content: n, singleView: r, state: i, VIEWER_MODES: a, computeOneToOneZoom: o, setZoom: s, scheduleOverlayRedraw: c, scheduleApplyGrade: l, syncToolsUIFromState: u, applyDistractionFreeUI: f, navigateViewerAssets: p, closeViewer: m, renderBadges: h, updateAssetRating: g, safeDispatchCustomEvent: _, ASSET_RATING_CHANGED_EVENT: v, probeTooltip: y, loupeWrap: b, getVideoControls: x, lifecycle: S, renderGenInfoPanel: C } = {}) { +function Vn({ overlay: t, _content: n, singleView: r, state: i, VIEWER_MODES: a, computeOneToOneZoom: o, setZoom: s, scheduleOverlayRedraw: c, scheduleApplyGrade: l, syncToolsUIFromState: u, applyDistractionFreeUI: f, navigateViewerAssets: p, closeViewer: m, renderBadges: h, updateAssetRating: g, safeDispatchCustomEvent: _, ASSET_RATING_CHANGED_EVENT: v, probeTooltip: y, loupeWrap: b, getVideoControls: x, lifecycle: S, renderGenInfoPanel: C } = {}) { let E = S?.unsubs || [], D = null, O = null, k = () => { try { D && clearTimeout(D); @@ -4856,7 +4779,7 @@ function Gn({ overlay: t, _content: n, singleView: r, state: i, VIEWER_MODES: a, g(), j(); return; } - n.key === "Escape" && (g(), Q.tags.open ? fn() : X(m)); + n.key === "Escape" && (g(), Q.tags.open ? cn() : X(m)); return; } } catch (e) { @@ -4923,7 +4846,7 @@ function Gn({ overlay: t, _content: n, singleView: r, state: i, VIEWER_MODES: a, } }; if ((n.ctrlKey || n.metaKey) && (n.key === "c" || n.key === "C")) try { - let t = Wn(S); + let t = Bn(S); if (t) { g(), navigator.clipboard?.writeText?.(t).then(() => e(w("toast.promptCopied", "Prompt copied to clipboard"), "success", 1500)).catch(() => e(w("toast.copyFailed", "Copy failed"), "error", 1500)); return; @@ -4976,7 +4899,7 @@ function Gn({ overlay: t, _content: n, singleView: r, state: i, VIEWER_MODES: a, case "t": case "T": if (!S?.id) break; - g(), dn({ + g(), sn({ x: Number(i?._lastPointerX) || Math.round((t?.clientWidth || 0) / 2), y: Number(i?._lastPointerY) || Math.round((t?.clientHeight || 0) / 2), asset: S, @@ -5115,7 +5038,7 @@ function Gn({ overlay: t, _content: n, singleView: r, state: i, VIEWER_MODES: a, } break; case "Escape": - g(), Q.tags.open ? fn() : X(m); + g(), Q.tags.open ? cn() : X(m); break; case "ArrowLeft": if (v && n.target?.closest?.(".mjr-viewer-playerbar")) { @@ -5191,14 +5114,14 @@ function Gn({ overlay: t, _content: n, singleView: r, state: i, VIEWER_MODES: a, }; } // ui/features/viewer/videoSync.ts -var Kn = () => { +var Hn = () => { try { return !!E?.DEBUG_VIEWER; } catch { return !1; } }; -function qn(e, t, { threshold: n = .15, correctionCooldownMs: r = 250 } = {}) { +function Un(e, t, { threshold: n = .15, correctionCooldownMs: r = 250 } = {}) { let i = new AbortController(); try { if (!e) return i; @@ -5428,7 +5351,7 @@ function qn(e, t, { threshold: n = .15, correctionCooldownMs: r = 250 } = {}) { console.debug?.(e); } } catch (e) { - if (Kn()) try { + if (Hn()) try { console.warn("[Viewer] follower video sync setup failed", e); } catch (e) { console.debug?.(e); @@ -5437,7 +5360,7 @@ function qn(e, t, { threshold: n = .15, correctionCooldownMs: r = 250 } = {}) { return i; } // ui/features/viewer/grid.ts -function Jn({ gridCanvas: e, content: t, state: n, VIEWER_MODES: r, getPrimaryMedia: i, getViewportRect: a, clearCanvas: o } = {}) { +function Wn({ gridCanvas: e, content: t, state: n, VIEWER_MODES: r, getPrimaryMedia: i, getViewportRect: a, clearCanvas: o } = {}) { let s = () => { try { let e = n?.mode; @@ -5850,7 +5773,7 @@ function Jn({ gridCanvas: e, content: t, state: n, VIEWER_MODES: r, getPrimaryMe }; } // ui/features/viewer/probe.ts -function Yn({ overlay: e, content: t, state: n, VIEWER_MODES: r, getPrimaryMedia: i, getMediaNaturalSize: a, _getViewportRect: o, positionOverlayBox: s, probeTooltip: c, loupeWrap: l, onLoupeRedraw: u, lifecycle: d } = {}) { +function Gn({ overlay: e, content: t, state: n, VIEWER_MODES: r, getPrimaryMedia: i, getMediaNaturalSize: a, _getViewportRect: o, positionOverlayBox: s, probeTooltip: c, loupeWrap: l, onLoupeRedraw: u, lifecycle: d } = {}) { let f = d?.unsubs || [], p = document.createElement("canvas"); p.width = 1, p.height = 1; let m = null; @@ -6027,7 +5950,7 @@ function Yn({ overlay: e, content: t, state: n, VIEWER_MODES: r, getPrimaryMedia }; } // ui/features/viewer/loupe.ts -function Xn({ state: e, loupeCanvas: t, loupeWrap: n, getMediaNaturalSize: r, positionOverlayBox: i } = {}) { +function Kn({ state: e, loupeCanvas: t, loupeWrap: n, getMediaNaturalSize: r, positionOverlayBox: i } = {}) { let a = null; try { a = t?.getContext?.("2d", { willReadFrequently: !0 }); @@ -6080,7 +6003,7 @@ function Xn({ state: e, loupeCanvas: t, loupeWrap: n, getMediaNaturalSize: r, po }; } // ui/features/viewer/metadata.ts -function Zn({ state: e, VIEWER_MODES: t, APP_CONFIG: n, getAssetMetadata: r, getAssetsBatch: i } = {}) { +function qn({ state: e, VIEWER_MODES: t, APP_CONFIG: n, getAssetMetadata: r, getAssetsBatch: i } = {}) { let a = /* @__PURE__ */ new Map(), o = n?.VIEWER_META_TTL_MS ?? 3e4, s = n?.VIEWER_META_MAX_ENTRIES ?? 500, c = 0, l = null, u = () => { if (a.size <= s) return; let e = Date.now(); @@ -6212,16 +6135,16 @@ function Zn({ state: e, VIEWER_MODES: t, APP_CONFIG: n, getAssetMetadata: r, get cleanupCache: () => { X(u); }, - _noop: kt + _noop: Tt }; } // ui/features/viewer/constants.ts -var Qn = Object.freeze({ +var Jn = Object.freeze({ MIN: .1, MAX: 16 }); // ui/features/viewer/panzoom.ts -function $n({ overlay: e, content: t, singleView: n, abView: r, sideView: i, state: a, VIEWER_MODES: o, scheduleOverlayRedraw: s, lifecycle: c } = {}) { +function Yn({ overlay: e, content: t, singleView: n, abView: r, sideView: i, state: a, VIEWER_MODES: o, scheduleOverlayRedraw: s, lifecycle: c } = {}) { let l = c?.safeCall || X, u = c?.safeAddListener || Z, d = c?.unsubs || [], f = () => { try { return a?.mode === o?.SINGLE && n?.querySelector?.(".mjr-viewer-media") || null; @@ -6300,7 +6223,7 @@ function $n({ overlay: e, content: t, singleView: n, abView: r, sideView: i, sta }, _ = () => { try { if (!e || e.style.display === "none") return; - let s = Math.max(Qn.MIN, Math.min(Qn.MAX, Number(a?.zoom) || 1)), c = a?.assets?.[a?.currentIndex], l = Number(c?.width) || 0, u = Number(c?.height) || 0; + let s = Math.max(Jn.MIN, Math.min(Jn.MAX, Number(a?.zoom) || 1)), c = a?.assets?.[a?.currentIndex], l = Number(c?.width) || 0, u = Number(c?.height) || 0; if (l > 0 && u > 0 || (h(), l = Number(a?._mediaW) || 0, u = Number(a?._mediaH) || 0), !(l > 0 && u > 0)) return; let d = l / u; if (!Number.isFinite(d) || d <= 0) return; @@ -6365,7 +6288,7 @@ function $n({ overlay: e, content: t, singleView: n, abView: r, sideView: i, sta console.debug?.(e); } }, v = () => { - let e = Math.max(Qn.MIN, Math.min(Qn.MAX, Number(a?.zoom) || 1)), t = Number(a?.panX) || 0, n = Number(a?.panY) || 0; + let e = Math.max(Jn.MIN, Math.min(Jn.MAX, Number(a?.zoom) || 1)), t = Number(a?.panX) || 0, n = Number(a?.panY) || 0; return `translate3d(${t / e}px, ${n / e}px, 0) scale(${e})`; }, y = () => { try { @@ -6422,7 +6345,7 @@ function $n({ overlay: e, content: t, singleView: n, abView: r, sideView: i, sta } }, x = (e, { clientX: n = null, clientY: r = null } = {}) => { try { - let i = Math.max(Qn.MIN, Math.min(Qn.MAX, Number(a?.zoom) || 1)), o = Math.max(Qn.MIN, Math.min(Qn.MAX, Number(e) || i)); + let i = Math.max(Jn.MIN, Math.min(Jn.MAX, Number(a?.zoom) || 1)), o = Math.max(Jn.MIN, Math.min(Jn.MAX, Number(e) || i)); try { a._userInteracted = !0; } catch (e) { @@ -6494,7 +6417,7 @@ function $n({ overlay: e, content: t, singleView: n, abView: r, sideView: i, sta try { let a = S(e, t, n, r); if (!(a.w > 0 && a.h > 0)) return !1; - let o = Math.max(Qn.MIN, Math.min(Qn.MAX, Number(i) || 1)), s = a.w * o, c = a.h * o; + let o = Math.max(Jn.MIN, Math.min(Jn.MAX, Number(i) || 1)), s = a.w * o, c = a.h * o; return s > (Number(n) || 0) + 1 || c > (Number(r) || 0) + 1; } catch { return !1; @@ -6510,7 +6433,7 @@ function $n({ overlay: e, content: t, singleView: n, abView: r, sideView: i, sta let i = S(t, n, r.width, r.height); if (!(i.w > 0 && i.h > 0)) return null; let a = t / i.w; - return !Number.isFinite(a) || a <= 0 ? null : Math.max(Qn.MIN, Math.min(Qn.MAX, a)); + return !Number.isFinite(a) || a <= 0 ? null : Math.max(Jn.MIN, Math.min(Jn.MAX, a)); } catch { return null; } @@ -6631,7 +6554,7 @@ function $n({ overlay: e, content: t, singleView: n, abView: r, sideView: i, sta } catch (e) { console.debug?.(e); } - let t = (Number(e.clientX) || 0) - O.startX, n = (Number(e.clientY) || 0) - O.startY, r = Math.max(Qn.MIN, Math.min(Qn.MAX, Number(a?.zoom) || 1)), i = Math.max(1, r); + let t = (Number(e.clientX) || 0) - O.startX, n = (Number(e.clientY) || 0) - O.startY, r = Math.max(Jn.MIN, Math.min(Jn.MAX, Number(a?.zoom) || 1)), i = Math.max(1, r); a.panX = O.startPanX + t * i, a.panY = O.startPanY + n * i; try { a._lastPointerX = e.clientX, a._lastPointerY = e.clientY; @@ -6726,12 +6649,12 @@ function $n({ overlay: e, content: t, singleView: n, abView: r, sideView: i, sta }; } // ui/features/viewer/videoProcessorWebGL.ts -var er = "\nattribute vec2 a_position;\nvarying vec2 v_uv;\nvoid main() {\n // Quad covers -1..1\n gl_Position = vec4(a_position, 0, 1);\n // Map -1..1 to 0..1\n v_uv = a_position * 0.5 + 0.5;\n // In WebGL, textures are usually flipped relative to Image/Video elements if not handled.\n // We'll flip Y in fragment shader or here.\n v_uv.y = 1.0 - v_uv.y;\n}\n", tr = "\nprecision mediump float;\nvarying vec2 v_uv;\nuniform sampler2D u_image;\nuniform float u_exposure_scale;\nuniform float u_gamma_inv;\nuniform int u_channel; // 0=RGB, 1=R, 2=G, 3=B\nuniform int u_analysis; // 0=None, 1=Zebra\nuniform float u_zebra_threshold;\nuniform vec2 u_resolution;\n\nfloat getLuma(vec3 c) { return dot(c, vec3(0.2126, 0.7152, 0.0722)); }\n\nvoid main() {\n vec4 texColor = texture2D(u_image, v_uv);\n vec3 color = texColor.rgb;\n\n // Exposure\n color *= u_exposure_scale;\n\n // Analysis (Zebra) or Gamma\n bool isZebra = false;\n if (u_analysis == 1) {\n float luma = getLuma(color);\n if (luma >= u_zebra_threshold) {\n isZebra = true;\n // Stripe pattern: (x + y) % 16 < 8\n // gl_FragCoord is in window pixels\n float stripe = mod(gl_FragCoord.x + gl_FragCoord.y, 32.0);\n if (stripe < 16.0) {\n gl_FragColor = vec4(0.0, 0.0, 0.0, 1.0); // Black\n } else {\n gl_FragColor = vec4(1.0, 1.0, 1.0, 1.0); // White\n }\n }\n }\n\n if (!isZebra) {\n // Gamma\n // fast pow?\n color = pow(clamp(color, 0.0, 1.0), vec3(u_gamma_inv));\n\n // Channel Selector\n if (u_channel == 1) color = vec3(color.r);\n else if (u_channel == 2) color = vec3(color.g);\n else if (u_channel == 3) color = vec3(color.b);\n\n gl_FragColor = vec4(color, texColor.a);\n }\n}\n"; -function nr(e, t, n) { +var Xn = "\nattribute vec2 a_position;\nvarying vec2 v_uv;\nvoid main() {\n // Quad covers -1..1\n gl_Position = vec4(a_position, 0, 1);\n // Map -1..1 to 0..1\n v_uv = a_position * 0.5 + 0.5;\n // In WebGL, textures are usually flipped relative to Image/Video elements if not handled.\n // We'll flip Y in fragment shader or here.\n v_uv.y = 1.0 - v_uv.y;\n}\n", Zn = "\nprecision mediump float;\nvarying vec2 v_uv;\nuniform sampler2D u_image;\nuniform float u_exposure_scale;\nuniform float u_gamma_inv;\nuniform int u_channel; // 0=RGB, 1=R, 2=G, 3=B\nuniform int u_analysis; // 0=None, 1=Zebra\nuniform float u_zebra_threshold;\nuniform vec2 u_resolution;\n\nfloat getLuma(vec3 c) { return dot(c, vec3(0.2126, 0.7152, 0.0722)); }\n\nvoid main() {\n vec4 texColor = texture2D(u_image, v_uv);\n vec3 color = texColor.rgb;\n\n // Exposure\n color *= u_exposure_scale;\n\n // Analysis (Zebra) or Gamma\n bool isZebra = false;\n if (u_analysis == 1) {\n float luma = getLuma(color);\n if (luma >= u_zebra_threshold) {\n isZebra = true;\n // Stripe pattern: (x + y) % 16 < 8\n // gl_FragCoord is in window pixels\n float stripe = mod(gl_FragCoord.x + gl_FragCoord.y, 32.0);\n if (stripe < 16.0) {\n gl_FragColor = vec4(0.0, 0.0, 0.0, 1.0); // Black\n } else {\n gl_FragColor = vec4(1.0, 1.0, 1.0, 1.0); // White\n }\n }\n }\n\n if (!isZebra) {\n // Gamma\n // fast pow?\n color = pow(clamp(color, 0.0, 1.0), vec3(u_gamma_inv));\n\n // Channel Selector\n if (u_channel == 1) color = vec3(color.r);\n else if (u_channel == 2) color = vec3(color.g);\n else if (u_channel == 3) color = vec3(color.b);\n\n gl_FragColor = vec4(color, texColor.a);\n }\n}\n"; +function Qn(e, t, n) { let r = e.createShader(t); return e.shaderSource(r, n), e.compileShader(r), e.getShaderParameter(r, e.COMPILE_STATUS) ? r : (console.warn("WebGL Shader Error:", e.getShaderInfoLog(r)), e.deleteShader(r), null); } -function rr(e, t, n) { +function $n(e, t, n) { let r = e.createProgram(); if (e.attachShader(r, t), e.attachShader(r, n), e.linkProgram(r), !e.getProgramParameter(r, e.LINK_STATUS)) { console.warn("WebGL Program Error:", e.getProgramInfoLog(r)); @@ -6744,7 +6667,7 @@ function rr(e, t, n) { } return r; } -function ir() { +function er() { try { let e = document.createElement("canvas"); return !!(window.WebGLRenderingContext && (e.getContext("webgl") || e.getContext("experimental-webgl"))); @@ -6752,7 +6675,7 @@ function ir() { return !1; } } -function ar(e) { +function tr(e) { let { canvas: t, videoEl: n, getGradeParams: r } = e, i = null, a = null, o = 4096, s = !1, c = { type: "webgl", ready: !1, @@ -6823,9 +6746,9 @@ function ar(e) { }, f = () => { if (!i) return null; d(); - let e = nr(i, i.VERTEX_SHADER, er), t = nr(i, i.FRAGMENT_SHADER, tr); + let e = Qn(i, i.VERTEX_SHADER, Xn), t = Qn(i, i.FRAGMENT_SHADER, Zn); if (!e || !t) return e && i.deleteShader(e), t && i.deleteShader(t), null; - let n = rr(i, e, t); + let n = $n(i, e, t); if (i.deleteShader(e), i.deleteShader(t), !n) return null; u("setupResources:createProgram"); let r = { @@ -6901,10 +6824,10 @@ function ar(e) { }; } // ui/features/viewer/videoProcessor.ts -function or({ canvas: e, videoEl: t, disableWebGL: n, pauseDuringExecution: r = null, getGradeParams: i, isDefaultGrade: a, _tonemap: o, maxProcPixelsVideo: s, throttleFps: c, safeAddListener: l, safeCall: u, onReady: d } = {}) { +function nr({ canvas: e, videoEl: t, disableWebGL: n, pauseDuringExecution: r = null, getGradeParams: i, isDefaultGrade: a, _tonemap: o, maxProcPixelsVideo: s, throttleFps: c, safeAddListener: l, safeCall: u, onReady: d } = {}) { let f = r == null ? !!E?.VIEWER_PAUSE_DURING_EXECUTION : !!r, p = null; - if (!n && ir()) try { - p = ar({ + if (!n && er()) try { + p = tr({ canvas: e, videoEl: t, getGradeParams: i, @@ -7399,11 +7322,11 @@ function or({ canvas: e, videoEl: t, disableWebGL: n, pauseDuringExecution: r = }; } // ui/features/viewer/audioVisualizer.ts -function sr(e, t, n) { +function rr(e, t, n) { let r = Number(e); return Number.isFinite(r) ? Math.max(t, Math.min(n, r)) : t; } -function cr(e) { +function ir(e) { try { let t = String(e || "").toLowerCase(); if (t === "simple" || t === "artistic") return t; @@ -7420,7 +7343,7 @@ function cr(e) { } return "simple"; } -function lr(e) { +function ar(e) { let t = e.getContext("2d"); if (!t) return null; let n = (e, t) => { @@ -7470,7 +7393,7 @@ function lr(e) { destroy() {} }; } -function ur(e, { pseudo3d: t = !1 } = {}) { +function or(e, { pseudo3d: t = !1 } = {}) { let n = null; try { n = e.getContext("webgl", { @@ -7517,7 +7440,7 @@ function ur(e, { pseudo3d: t = !1 } = {}) { n.viewport(0, 0, e.width || 1, e.height || 1), n.clearColor(0, 0, 0, 0), n.clear(n.COLOR_BUFFER_BIT); let i = Math.max(48, Math.min(180, Math.floor((e.width || 640) / 7))), o = Number(a) * .001, s = new Float32Array(i * 2); for (let e = 0; e < i; e++) { - let n = e / Math.max(1, i - 1), a = n * 2 - 1, c = f(r, n), l = t ? Math.sin(n * Math.PI * 4 + o * 1.1) * .18 : 0, u = t ? 1 / (1 + Math.max(-.7, l) * .8) : 1, d = sr((.18 + c * .32) * u, -.95, .95); + let n = e / Math.max(1, i - 1), a = n * 2 - 1, c = f(r, n), l = t ? Math.sin(n * Math.PI * 4 + o * 1.1) * .18 : 0, u = t ? 1 / (1 + Math.max(-.7, l) * .8) : 1, d = rr((.18 + c * .32) * u, -.95, .95); s[e * 2] = a, s[e * 2 + 1] = d; } u(s, [ @@ -7528,7 +7451,7 @@ function ur(e, { pseudo3d: t = !1 } = {}) { ]); let c = new Float32Array(i * 2); for (let e = 0; e < i; e++) { - let n = e / Math.max(1, i - 1), a = n * 2 - 1, s = p(r, n), l = m(r, n), u = s * .62 + l * .38, d = t ? Math.sin(n * Math.PI * 3 + o * 1) * .14 : 0, f = t ? 1 / (1 + Math.max(-.7, d) * .8) : 1, h = sr(-u * .62 * f, -.95, 0); + let n = e / Math.max(1, i - 1), a = n * 2 - 1, s = p(r, n), l = m(r, n), u = s * .62 + l * .38, d = t ? Math.sin(n * Math.PI * 3 + o * 1) * .14 : 0, f = t ? 1 / (1 + Math.max(-.7, d) * .8) : 1, h = rr(-u * .62 * f, -.95, 0); c[e * 2] = a, c[e * 2 + 1] = h; } u(c, [ @@ -7565,17 +7488,17 @@ function ur(e, { pseudo3d: t = !1 } = {}) { } }; } -function dr({ canvas: e, audioEl: t, mode: n, pauseDuringExecution: r = null } = {}) { +function sr({ canvas: e, audioEl: t, mode: n, pauseDuringExecution: r = null } = {}) { if (!e || !t) return { destroy() {} }; - let i = r == null ? !!E?.VIEWER_PAUSE_DURING_EXECUTION : !!r, a = null, o = !1, s = null, c = null, l = null, u = null, d = null, f = null, p = 0, m = !1, h = 1e3 / sr(E?.VIEWER_AUDIO_VIS_FPS ?? 24, 8, 60), g = cr(n), _ = () => { + let i = r == null ? !!E?.VIEWER_PAUSE_DURING_EXECUTION : !!r, a = null, o = !1, s = null, c = null, l = null, u = null, d = null, f = null, p = 0, m = !1, h = 1e3 / rr(E?.VIEWER_AUDIO_VIS_FPS ?? 24, 8, 60), g = ir(n), _ = () => { try { - let t = sr(window.devicePixelRatio || 1, 1, 2), n = Math.max(32, Math.floor((e.clientWidth || 640) * t)), r = Math.max(24, Math.floor((e.clientHeight || 140) * t)); + let t = rr(window.devicePixelRatio || 1, 1, 2), n = Math.max(32, Math.floor((e.clientWidth || 640) * t)), r = Math.max(24, Math.floor((e.clientHeight || 140) * t)); e.width !== n && (e.width = n), e.height !== r && (e.height = r); } catch (e) { console.debug?.(e); } }, v = (t = g) => { - g = cr(t); + g = ir(t); try { f?.destroy?.(); } catch (e) { @@ -7588,12 +7511,12 @@ function dr({ canvas: e, audioEl: t, mode: n, pauseDuringExecution: r = null } = console.debug?.(e); } try { - g === "artistic" && !E?.VIEWER_DISABLE_WEBGL_AUDIO && (f = ur(e, { pseudo3d: !0 })); + g === "artistic" && !E?.VIEWER_DISABLE_WEBGL_AUDIO && (f = or(e, { pseudo3d: !0 })); } catch (e) { console.debug?.(e); } if (!f) try { - f = lr(e); + f = ar(e); } catch (e) { console.debug?.(e), f = null; } @@ -7695,7 +7618,7 @@ function dr({ canvas: e, audioEl: t, mode: n, pauseDuringExecution: r = null } = }; } // ui/features/viewer/mediaFactory.ts -function fr({ overlay: e, state: t, mediaTransform: n, updateMediaNaturalSize: r, clampPanToBounds: i, applyTransform: a, scheduleOverlayRedraw: o, getGradeParams: s, isDefaultGrade: c, tonemap: l, maxProcPixels: u, maxProcPixelsVideo: d, disableWebGL: f, videoGradeThrottleFps: p, safeAddListener: m, safeCall: h } = {}) { +function cr({ overlay: e, state: t, mediaTransform: n, updateMediaNaturalSize: r, clampPanToBounds: i, applyTransform: a, scheduleOverlayRedraw: o, getGradeParams: s, isDefaultGrade: c, tonemap: l, maxProcPixels: u, maxProcPixelsVideo: d, disableWebGL: f, videoGradeThrottleFps: p, safeAddListener: m, safeCall: h } = {}) { let g = h || X, _ = m || Z, v = (e) => { try { let t = String(e?.ext || "").trim().toLowerCase(); @@ -7803,7 +7726,7 @@ function fr({ overlay: e, state: t, mediaTransform: n, updateMediaNaturalSize: r } }, S = (e) => { try { - return Nt(e); + return kt(e); } catch { return null; } @@ -7890,7 +7813,7 @@ function fr({ overlay: e, state: t, mediaTransform: n, updateMediaNaturalSize: r let o = document.createElement("audio"); o.className = "mjr-viewer-audio-src", o.src = n, o.controls = !1, o.autoplay = !0, o.preload = "metadata"; try { - let e = dr({ + let e = sr({ canvas: a, audioEl: o, mode: t?.audioVisualizerMode, @@ -7976,7 +7899,7 @@ function fr({ overlay: e, state: t, mediaTransform: n, updateMediaNaturalSize: r } catch {} v.style.cssText = "position:absolute; width:1px; height:1px; opacity:0; pointer-events:none;", w(v, e); try { - u._mjrProc = or({ + u._mjrProc = nr({ canvas: u, videoEl: v, disableWebGL: f || !!E.VIEWER_DISABLE_WEBGL_VIDEO, @@ -8156,7 +8079,7 @@ function fr({ overlay: e, state: t, mediaTransform: n, updateMediaNaturalSize: r } catch {} h.style.cssText = "position:absolute; width:1px; height:1px; opacity:0; pointer-events:none;", w(h, e); try { - m._mjrProc = or({ + m._mjrProc = nr({ canvas: m, videoEl: h, pauseDuringExecution: E.VIEWER_PAUSE_DURING_EXECUTION, @@ -8257,7 +8180,7 @@ function fr({ overlay: e, state: t, mediaTransform: n, updateMediaNaturalSize: r }; } // ui/features/viewer/imagePreloader.ts -function pr({ buildAssetViewURL: e, IMAGE_PRELOAD_EXTENSIONS: t, state: n }) { +function lr({ buildAssetViewURL: e, IMAGE_PRELOAD_EXTENSIONS: t, state: n }) { function r(e) { if (!e) return null; if (e.id != null) return `id:${e.id}`; @@ -8340,7 +8263,7 @@ function pr({ buildAssetViewURL: e, IMAGE_PRELOAD_EXTENSIONS: t, state: n }) { }; } // ui/features/metadata/genInfoCompare.ts -function mr(e, t) { +function ur(e, t) { for (let n of t) { let t = n.split("."), r = e; for (let e of t) { @@ -8351,7 +8274,7 @@ function mr(e, t) { } return ""; } -function hr(e) { +function dr(e) { if (e == null) return ""; if (typeof e == "string") return e.trim(); if (typeof e == "number" || typeof e == "boolean") return String(e); @@ -8361,7 +8284,7 @@ function hr(e) { return String(e); } } -var gr = [ +var fr = [ { key: "positive", label: "Positive Prompt", @@ -8430,9 +8353,9 @@ var gr = [ paths: ["geninfo.workflow_nodes", "workflow.nodes"] } ]; -function _r(e, t) { - return gr.map((n) => { - let r = hr(mr(e, n.paths)), i = hr(mr(t, n.paths)); +function pr(e, t) { + return fr.map((n) => { + let r = dr(ur(e, n.paths)), i = dr(ur(t, n.paths)); return { key: n.key, label: n.label, @@ -8443,12 +8366,12 @@ function _r(e, t) { }).filter((e) => e.left || e.right); } // ui/features/viewer/metadataCompare.ts -function vr(e) { +function mr(e) { return String(e ?? "").trim() || "-"; } -function yr(e, t) { +function hr(e, t) { let n = document.createElement("div"); - return n.textContent = vr(e), n.style.cssText = [ + return n.textContent = mr(e), n.style.cssText = [ "min-width:0", "white-space:pre-wrap", "overflow-wrap:anywhere", @@ -8461,8 +8384,8 @@ function yr(e, t) { "padding:6px 7px" ].join(";"), n; } -function br(e, t) { - let n = _r(e, t).filter((e) => vr(e?.left) !== "-" || vr(e?.right) !== "-"); +function gr(e, t) { + let n = pr(e, t).filter((e) => mr(e?.left) !== "-" || mr(e?.right) !== "-"); if (!n.length) return null; let r = document.createElement("div"); r.style.cssText = "display:flex;flex-direction:column;gap:8px;margin:0 0 14px 0;padding:10px;border:1px solid rgba(144,220,220,0.22);border-radius:10px;background:rgba(90,220,220,0.06);"; @@ -8474,12 +8397,12 @@ function br(e, t) { let n = document.createElement("div"); n.textContent = String(e?.label || e?.key || "").trim(), n.style.cssText = "font-size:11px;font-weight:650;color:rgba(255,255,255,0.70);padding-top:6px;overflow-wrap:anywhere", t.appendChild(n); let i = !!e?.changed; - t.appendChild(yr(e?.left, i)), t.appendChild(yr(e?.right, i)), r.appendChild(t); + t.appendChild(hr(e?.left, i)), t.appendChild(hr(e?.right, i)), r.appendChild(t); } return r; } // ui/features/viewer/viewerInstanceManager.ts -function xr(e) { +function _r(e) { let t = u(); if (t.length) { let e = t[t.length - 1]; @@ -8506,7 +8429,7 @@ function xr(e) { return c(n), n._mjrViewerAPI; } // ui/features/viewer/playerBarManager.ts -function Sr({ state: e, APP_CONFIG: t, VIEWER_MODES: n, overlay: r, navBar: i, playerBarHost: a, singleView: o, abView: s, sideView: c, metadataHydrator: l, isPlayableViewerKind: u, collectPlayableMediaElements: d, pickPrimaryPlayableMedia: f, mountUnifiedMediaControls: p, installFollowerVideoSync: m, getViewerInfo: h, scheduleOverlayRedraw: g, viewerInfoCacheGet: _, viewerInfoCacheSet: v }) { +function vr({ state: e, APP_CONFIG: t, VIEWER_MODES: n, overlay: r, navBar: i, playerBarHost: a, singleView: o, abView: s, sideView: c, metadataHydrator: l, isPlayableViewerKind: u, collectPlayableMediaElements: d, pickPrimaryPlayableMedia: f, mountUnifiedMediaControls: p, installFollowerVideoSync: m, getViewerInfo: h, scheduleOverlayRedraw: g, viewerInfoCacheGet: _, viewerInfoCacheSet: v }) { function y() { try { e._videoControlsDestroy && e._videoControlsDestroy(); @@ -8611,10 +8534,10 @@ function Sr({ state: e, APP_CONFIG: t, VIEWER_MODES: n, overlay: r, navBar: i, p try { let e = (e) => { try { - let t = Nt(e); + let t = kt(e); return { fps: t, - frameCount: Pt(e, t) + frameCount: At(e, t) }; } catch { return { @@ -8774,7 +8697,7 @@ function Sr({ state: e, APP_CONFIG: t, VIEWER_MODES: n, overlay: r, navBar: i, p } if (E === "video") { try { - let t = (e) => Mt(e), n = (e) => { + let t = (e) => Ot(e), n = (e) => { let t = Number(e); return !Number.isFinite(t) || t <= 0 ? null : Math.floor(t); }, r = (r) => { @@ -8870,12 +8793,12 @@ function Sr({ state: e, APP_CONFIG: t, VIEWER_MODES: n, overlay: r, navBar: i, p }; } // ui/features/viewer/viewerThemeStyles.ts -var Cr = "min(400px, 42vw)", wr = `calc(${Cr} + 24px)`, Tr = "mjr-viewer-modern-theme"; -function Er() { +var yr = "min(400px, 42vw)", br = `calc(${yr} + 24px)`, xr = "mjr-viewer-modern-theme"; +function Sr() { try { - if (document.getElementById(Tr)) return; + if (document.getElementById(xr)) return; let e = document.createElement("style"); - e.id = Tr, e.textContent = ` + e.id = xr, e.textContent = ` .mjr-viewer-overlay { --mjr-viewer-surface: rgba(14, 18, 24, 0.78); --mjr-viewer-surface-strong: rgba(10, 13, 18, 0.9); @@ -8978,7 +8901,7 @@ function Er() { } .mjr-viewer-geninfo { - width: ${Cr} !important; + width: ${yr} !important; top: 16px !important; bottom: 16px !important; border-radius: 20px; @@ -9076,16 +8999,16 @@ function Er() { } } // ui/features/viewer/filmstrip.ts -var Dr = 84, Or = 56, kr = 74, Ar = .45, jr = "0px 240px 0px 240px", Mr = 3500; -function Nr(e) { +var Cr = 84, wr = 56, Tr = 74, Er = .45, Dr = "0px 240px 0px 240px", Or = 3500; +function kr(e) { let t = 2166136261, n = String(e || ""); for (let e = 0; e < n.length; e += 1) t ^= n.charCodeAt(e), t = Math.imul(t, 16777619); return t >>> 0; } -function Pr(e, t, n = 18) { +function Ar(e, t, n = 18) { let r = document.createElement("div"); r.className = "mjr-filmstrip-audio-waveform"; - let i = Nr(t) || 1; + let i = kr(t) || 1; for (let e = 0; e < n; e += 1) { i = Math.imul(i ^ i >>> 15, 2246822519) >>> 0; let t = i % 1e3 / 1e3, a = Math.sin(e / Math.max(1, n - 1) * Math.PI), o = document.createElement("span"); @@ -9093,14 +9016,14 @@ function Pr(e, t, n = 18) { } e.appendChild(r); } -function Fr(e) { +function jr(e) { try { e?._mjrFilmstripReleaseTimer && (clearTimeout(e._mjrFilmstripReleaseTimer), e._mjrFilmstripReleaseTimer = null); } catch (e) { console.debug?.(e); } } -function Ir(e) { +function Mr(e) { if (!e) return; let t = String(e.dataset.lazySrc || "").trim(); if (t) try { @@ -9109,7 +9032,7 @@ function Ir(e) { console.debug?.(e); } } -function Lr(e) { +function Nr(e) { if (e) try { let t = e.play?.(); t && typeof t.catch == "function" && t.catch(() => {}); @@ -9117,16 +9040,16 @@ function Lr(e) { console.debug?.(e); } } -function Rr(e) { +function Pr(e) { if (e) try { e.pause?.(); } catch (e) { console.debug?.(e); } } -function zr(e, { releaseSrc: t = !0 } = {}) { +function Fr(e, { releaseSrc: t = !0 } = {}) { if (e) { - Fr(e), Rr(e); + jr(e), Pr(e); try { e._mjrFilmstripInView = !1; } catch (e) { @@ -9139,11 +9062,11 @@ function zr(e, { releaseSrc: t = !0 } = {}) { } } } -function Br({ state: e, buildAssetViewURL: t, onNavigate: n, onCompare: r }) { +function Ir({ state: e, buildAssetViewURL: t, onNavigate: n, onCompare: r }) { let i = document.createElement("div"); i.className = "mjr-filmstrip", i.style.cssText = ` width: 100%; - height: ${kr}px; + height: ${Tr}px; overflow-x: auto; overflow-y: hidden; background: linear-gradient(180deg, rgba(16, 20, 27, 0.82), rgba(10, 13, 18, 0.92)); @@ -9171,20 +9094,20 @@ function Br({ state: e, buildAssetViewURL: t, onNavigate: n, onCompare: r }) { } catch (e) { console.debug?.(e); } - if (i && (Fr(e), Ir(e)), i && r.intersectionRatio >= Ar && t && n ? Lr(e) : Rr(e), !i) { - Fr(e); + if (i && (jr(e), Mr(e)), i && r.intersectionRatio >= Er && t && n ? Nr(e) : Pr(e), !i) { + jr(e); try { e._mjrFilmstripReleaseTimer = setTimeout(() => { try { if (!e.isConnected) { - zr(e, { releaseSrc: !0 }); + Fr(e, { releaseSrc: !0 }); return; } - e._mjrFilmstripInView || zr(e, { releaseSrc: !0 }); + e._mjrFilmstripInView || Fr(e, { releaseSrc: !0 }); } catch (e) { console.debug?.(e); } - }, Mr); + }, Or); } catch (e) { console.debug?.(e); } @@ -9192,8 +9115,8 @@ function Br({ state: e, buildAssetViewURL: t, onNavigate: n, onCompare: r }) { } }, { root: i, - rootMargin: jr, - threshold: [0, Ar] + rootMargin: Dr, + threshold: [0, Er] }); } catch { return null; @@ -9213,11 +9136,11 @@ function Br({ state: e, buildAssetViewURL: t, onNavigate: n, onCompare: r }) { } } }, p = ({ releaseSrc: e = !1 } = {}) => { - for (let t of Array.from(c)) zr(t, { releaseSrc: e }); + for (let t of Array.from(c)) Fr(t, { releaseSrc: e }); }, m = () => { for (let e of Array.from(c)) try { if (!e?._mjrFilmstripInView || !e?.isConnected) continue; - Ir(e), Lr(e); + Mr(e), Nr(e); } catch (e) { console.debug?.(e); } @@ -9267,8 +9190,8 @@ function Br({ state: e, buildAssetViewURL: t, onNavigate: n, onCompare: r }) { let r = document.createElement("div"); r.className = "mjr-filmstrip-item", r.dataset.fidx = String(n), r._mjrAsset = e, r.style.cssText = ` position: relative; - width: ${Dr}px; - height: ${Or}px; + width: ${Cr}px; + height: ${wr}px; border-radius: 14px; overflow: hidden; cursor: pointer; @@ -9291,7 +9214,7 @@ function Br({ state: e, buildAssetViewURL: t, onNavigate: n, onCompare: r }) { } return e.addEventListener("loadeddata", () => { try { - e._mjrFilmstripInView && i.style.display !== "none" && !document.hidden && Lr(e); + e._mjrFilmstripInView && i.style.display !== "none" && !document.hidden && Nr(e); } catch (e) { console.debug?.(e); } @@ -9301,7 +9224,7 @@ function Br({ state: e, buildAssetViewURL: t, onNavigate: n, onCompare: r }) { } catch (e) { console.debug?.(e); } - zr(e, { releaseSrc: !0 }), y(r); + Fr(e, { releaseSrc: !0 }), y(r); }, { once: !0 }), r.appendChild(e), C(r), f(e), r; } if (a === "audio") { @@ -9372,7 +9295,7 @@ function Br({ state: e, buildAssetViewURL: t, onNavigate: n, onCompare: r }) { let t = document.createElement("div"); t.className = "mjr-filmstrip-audio-thumb"; let n = document.createElement("span"); - n.className = "mjr-filmstrip-audio-label", n.textContent = "AUDIO", Pr(t, e?._mjrAsset?.filename || e?.dataset?.mjrId || "audio"), t.appendChild(n); + n.className = "mjr-filmstrip-audio-label", n.textContent = "AUDIO", Ar(t, e?._mjrAsset?.filename || e?.dataset?.mjrId || "audio"), t.appendChild(n); try { e.appendChild(t); } catch (e) { @@ -9476,11 +9399,11 @@ function Br({ state: e, buildAssetViewURL: t, onNavigate: n, onCompare: r }) { }; } // ui/features/viewer/viewerShell.ts -function Vr() { +function Lr() { let e = document.createElement("div"); return e.className = "mjr-viewer-overlay mjr-assets-manager", e.style.cssText = "\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: linear-gradient(180deg, rgba(6, 8, 12, 0.94), rgba(5, 7, 10, 0.985));\n z-index: 10000;\n pointer-events: auto;\n display: none;\n flex-direction: column;\n box-sizing: border-box;\n overflow: hidden;\n ", e.tabIndex = -1, e.setAttribute("role", "dialog"), e; } -function Hr({ state: e, buildAssetViewURL: t, onNavigate: n, onCompare: r }) { +function Rr({ state: e, buildAssetViewURL: t, onNavigate: n, onCompare: r }) { let i = document.createElement("div"); i.className = "mjr-viewer-content-row", i.style.cssText = "\n flex: 1;\n display: flex;\n min-height: 0;\n overflow: hidden;\n min-width: 0;\n "; let a = document.createElement("div"); @@ -9507,7 +9430,7 @@ function Hr({ state: e, buildAssetViewURL: t, onNavigate: n, onCompare: r }) { top: 16px; right: 16px; bottom: 16px; - width: ${Cr}; + width: ${yr}; display: none; flex-direction: column; overflow: hidden; @@ -9529,7 +9452,7 @@ function Hr({ state: e, buildAssetViewURL: t, onNavigate: n, onCompare: r }) { top: 16px; left: 16px; bottom: 16px; - width: ${Cr}; + width: ${yr}; display: none; flex-direction: column; overflow: hidden; @@ -9547,11 +9470,11 @@ function Hr({ state: e, buildAssetViewURL: t, onNavigate: n, onCompare: r }) { x.style.cssText = "\n flex: 1;\n overflow: auto;\n padding: 14px;\n color: rgba(255,255,255,0.92);\n ", v.appendChild(y), v.appendChild(x), i.appendChild(a); let S = document.createElement("div"); S.className = "mjr-viewer-footer", S.style.cssText = "\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 12px 20px;\n background: rgba(13, 16, 22, 0.78);\n border-top: 1px solid rgba(255, 255, 255, 0.1);\n color: white;\n gap: 14px 20px;\n flex-wrap: wrap;\n "; - let C = Ln("<", "Previous (Left Arrow)"); + let C = Nn("<", "Previous (Left Arrow)"); C.classList.add("mjr-viewer-nav-btn", "mjr-viewer-nav-btn--prev"), C.style.fontSize = "24px"; let w = document.createElement("span"); w.className = "mjr-viewer-index", w.style.cssText = "font-size: 14px; font-weight: 500;"; - let T = Ln(">", "Next (Right Arrow)"); + let T = Nn(">", "Next (Right Arrow)"); T.classList.add("mjr-viewer-nav-btn", "mjr-viewer-nav-btn--next"), T.style.fontSize = "24px"; let E = document.createElement("div"); E.className = "mjr-viewer-nav", E.style.cssText = "display:flex; align-items:center; gap:20px;", E.appendChild(C), E.appendChild(w), E.appendChild(T); @@ -9579,7 +9502,7 @@ function Hr({ state: e, buildAssetViewURL: t, onNavigate: n, onCompare: r }) { nextBtn: T, navBar: E, playerBarHost: D, - filmstrip: Br({ + filmstrip: Ir({ state: e, buildAssetViewURL: t, onNavigate: n, @@ -9588,7 +9511,7 @@ function Hr({ state: e, buildAssetViewURL: t, onNavigate: n, onCompare: r }) { }; } // ui/features/viewer/viewerOverlayDismiss.ts -function Ur({ overlay: e, requestClose: t }) { +function zr({ overlay: e, requestClose: t }) { try { let n = null; e.addEventListener("pointerdown", (e) => { @@ -9608,7 +9531,7 @@ function Ur({ overlay: e, requestClose: t }) { if (Math.hypot(t, r) > 6 || Date.now() - n.t > 600) return; } let r = e.target; - if (dt(r, ".mjr-viewer-header") || dt(r, ".mjr-viewer-footer") || dt(r, ".mjr-viewer-geninfo") || dt(r, ".mjr-video-controls") || dt(r, ".mjr-context-menu") || dt(r, ".mjr-ab-slider") || dt(r, ".mjr-viewer-loupe") || dt(r, ".mjr-viewer-probe") || dt(r, ".mjr-viewer-media") || r && (r.tagName === "IMG" || r.tagName === "VIDEO" || r.tagName === "CANVAS")) return; + if (st(r, ".mjr-viewer-header") || st(r, ".mjr-viewer-footer") || st(r, ".mjr-viewer-geninfo") || st(r, ".mjr-video-controls") || st(r, ".mjr-context-menu") || st(r, ".mjr-ab-slider") || st(r, ".mjr-viewer-loupe") || st(r, ".mjr-viewer-probe") || st(r, ".mjr-viewer-media") || r && (r.tagName === "IMG" || r.tagName === "VIDEO" || r.tagName === "CANVAS")) return; t?.(); } catch (e) { console.debug?.(e); @@ -9619,20 +9542,20 @@ function Ur({ overlay: e, requestClose: t }) { } } // ui/components/ViewerRuntime.ts -var Wr = null, Gr = null, Kr = null, qr = null, Jr = null, Yr = null; -function Xr() { - Wr || import("./abCompare-BUrGm4-x.js").then((e) => { +var Br = null, Vr = null, Hr = null, Ur = null, Wr = null, Gr = null; +function Kr() { + Br || import("./abCompare-BUrGm4-x.js").then((e) => { + Br = e; + }), Vr || import("./sideBySide-DEEkMdvW.js").then((e) => { + Vr = e; + }), Hr || import("./model3dRenderer-BsJ9YHaZ.js").then((e) => e.t).then((e) => { + Hr = e; + }), Ur || import("./scopes-bvTRS68K.js").then((e) => { + Ur = e; + }), Wr || import("./genInfo-B60U6rEQ.js").then((e) => e.n).then((e) => { Wr = e; - }), Gr || import("./sideBySide-DEEkMdvW.js").then((e) => { + }), Gr || import("./frameExport-CnNO7oN6.js").then((e) => { Gr = e; - }), Kr || import("./model3dRenderer-BsJ9YHaZ.js").then((e) => e.t).then((e) => { - Kr = e; - }), qr || import("./scopes-bvTRS68K.js").then((e) => { - qr = e; - }), Jr || import("./genInfo-C3ZF_agc.js").then((e) => e.n).then((e) => { - Jr = e; - }), Yr || import("./frameExport-CnNO7oN6.js").then((e) => { - Yr = e; }); } var $ = { @@ -9640,12 +9563,12 @@ var $ = { AB_COMPARE: "ab", SIDE_BY_SIDE: "sidebyside" }; -function Zr() { - Xr(), Er(); - let e = Vr(), t = In(e), a = t.unsubs || [], s = te(); +function qr() { + Kr(), Sr(); + let e = Lr(), t = Mn(e), a = t.unsubs || [], s = te(); s.mode = $.SINGLE; try { - let e = Nn(); + let e = kn(); e && typeof e == "object" && (typeof e.analysisMode == "string" && (s.analysisMode = e.analysisMode || "none"), typeof e.loupeEnabled == "boolean" && (s.loupeEnabled = e.loupeEnabled), typeof e.probeEnabled == "boolean" && (s.probeEnabled = e.probeEnabled), typeof e.hudEnabled == "boolean" && (s.hudEnabled = e.hudEnabled), typeof e.genInfoOpen == "boolean" && (s.genInfoOpen = e.genInfoOpen), typeof e.audioVisualizerMode == "string" && (s.audioVisualizerMode = e.audioVisualizerMode || "artistic"), typeof e.abWipePercent == "number" && Number.isFinite(e.abWipePercent) && e.abWipePercent >= 0 && e.abWipePercent <= 100 && (s._abWipePercent = e.abWipePercent)); } catch (e) { console.debug?.(e); @@ -9758,7 +9681,7 @@ function Zr() { function M() { let e = !1; try { - let t = s.mode === $.AB_COMPARE ? V : s.mode === $.SIDE_BY_SIDE ? H : B, n = Array.from(t?.querySelectorAll?.(".mjr-viewer-audio-viz") || []); + let t = s.mode === $.AB_COMPARE ? H : s.mode === $.SIDE_BY_SIDE ? U : V, n = Array.from(t?.querySelectorAll?.(".mjr-viewer-audio-viz") || []); for (let t of n) try { let n = t?._mjrProc || null; if (!n?.setMode) continue; @@ -9784,7 +9707,7 @@ function Zr() { console.debug?.(e); } try { - N = Un({ + N = zn({ VIEWER_MODES: $, state: s, lifecycle: t, @@ -9808,8 +9731,8 @@ function Zr() { onClose: () => ee?.(), onMode: (e) => { try { - if (e === $.AB_COMPARE && !Xe() || e === $.SIDE_BY_SIDE && !Y()) return; - s.mode = e, Qe(); + if (e === $.AB_COMPARE && !Xe() || e === $.SIDE_BY_SIDE && !Ze()) return; + s.mode = e, $e(); try { N?.syncToolsUIFromState?.(); } catch (e) { @@ -9878,21 +9801,21 @@ function Zr() { }, onCompareModeChanged: () => { try { - s.mode === $.AB_COMPARE && (et(), st()); + s.mode === $.AB_COMPARE && (tt(), st()); } catch (e) { console.debug?.(e); } }, onExportFrame: () => { try { - Je({ toClipboard: !1 }); + qe({ toClipboard: !1 }); } catch (e) { console.debug?.(e); } }, onCopyFrame: () => { try { - Je({ toClipboard: !0 }); + qe({ toClipboard: !0 }); } catch (e) { console.debug?.(e); } @@ -9901,7 +9824,7 @@ function Zr() { try { let e = s.assets[s.currentIndex]; if (String(e?.kind || "") !== "audio") return; - M() || (et(), st()); + M() || (tt(), st()); } catch (e) { console.debug?.(e); } @@ -9913,35 +9836,35 @@ function Zr() { console.debug?.(e); } try { - Pn(s); + An(s); } catch (e) { console.debug?.(e); } try { - Ze(); + Qe(); } catch (e) { console.debug?.(e); } try { if (s.mode === $.AB_COMPARE) { let e = String(s.abCompareMode || "wipe"); - e !== "wipe" && e !== "wipeV" && V?._mjrDiffRequest?.(); + e !== "wipe" && e !== "wipeV" && H?._mjrDiffRequest?.(); } } catch (e) { console.debug?.(e); } try { - s.probeEnabled || (me.style.display = "none"); + s.probeEnabled || (pe.style.display = "none"); } catch (e) { console.debug?.(e); } try { - s.loupeEnabled || (he.style.display = "none"); + s.loupeEnabled || (me.style.display = "none"); } catch (e) { console.debug?.(e); } try { - J(); + Y(); } catch (e) { console.debug?.(e); } @@ -9951,7 +9874,7 @@ function Zr() { console.debug?.(e); } try { - Ke(); + Ge(); } catch (e) { console.debug?.(e); } @@ -9960,12 +9883,12 @@ function Zr() { } catch (e) { console.debug?.(e); } - let { contentRow: z, content: fe, singleView: B, abView: V, sideView: H, overlayLayer: pe, gridCanvas: U, probeTooltip: me, loupeWrap: he, loupeCanvas: ge, genInfoOverlay: _e, genInfoTitle: W, genInfoBody: G, genInfoOverlayLeft: K, genInfoTitleLeft: ve, genInfoBodyLeft: ye, footer: q, prevBtn: be, indexInfo: xe, nextBtn: Se, navBar: Ce, playerBarHost: we, filmstrip: Te } = Hr({ + let { contentRow: z, content: B, singleView: V, abView: H, sideView: U, overlayLayer: fe, gridCanvas: W, probeTooltip: pe, loupeWrap: me, loupeCanvas: he, genInfoOverlay: ge, genInfoTitle: G, genInfoBody: K, genInfoOverlayLeft: q, genInfoTitleLeft: _e, genInfoBodyLeft: ve, footer: J, prevBtn: ye, indexInfo: be, nextBtn: xe, navBar: Se, playerBarHost: Ce, filmstrip: we } = Rr({ state: s, buildAssetViewURL: v, onNavigate: (e) => { try { - s.compareAsset != null && (s.compareAsset = null, s.mode = $.SINGLE), s.currentIndex = e, Qe(); + s.compareAsset != null && (s.compareAsset = null, s.mode = $.SINGLE), s.currentIndex = e, $e(); } catch (e) { console.debug?.(e); } @@ -9975,17 +9898,17 @@ function Zr() { let t = Array.isArray(s.assets) ? s.assets : [], n = t[e]; if (!n || n === t[s.currentIndex]) return; if (n === s.compareAsset) { - s.compareAsset = null, s.mode = $.SINGLE, Qe(); + s.compareAsset = null, s.mode = $.SINGLE, $e(); return; } - t.length === 2 ? (s.compareAsset = t[1 - s.currentIndex], s.mode = De() ? $.SIDE_BY_SIDE : $.AB_COMPARE) : (s.compareAsset = n, s.mode = Y() ? $.SIDE_BY_SIDE : $.AB_COMPARE), Qe(); + t.length === 2 ? (s.compareAsset = t[1 - s.currentIndex], s.mode = Ee() ? $.SIDE_BY_SIDE : $.AB_COMPARE) : (s.compareAsset = n, s.mode = Ze() ? $.SIDE_BY_SIDE : $.AB_COMPARE), $e(); } catch (e) { console.debug?.(e); } } }); e.appendChild(P), e.appendChild(z); - function Ee() { + function Te() { try { if (s.compareAsset) return s.compareAsset; let e = Array.isArray(s.assets) ? s.assets : []; @@ -9995,109 +9918,109 @@ function Zr() { } return null; } - function De() { + function Ee() { try { let e = s.assets?.[s.currentIndex] || null; - return (Kr?.isModel3DAsset?.(e) ?? !1) || (Kr?.isModel3DAsset?.(Ee()) ?? !1); + return (Hr?.isModel3DAsset?.(e) ?? !1) || (Hr?.isModel3DAsset?.(Te()) ?? !1); } catch (e) { console.debug?.(e); } return !1; } - e.appendChild(Te.el), e.appendChild(q), e.appendChild(_e), e.appendChild(K), Ur({ + e.appendChild(we.el), e.appendChild(J), e.appendChild(ge), e.appendChild(q), zr({ overlay: e, requestClose: () => ee() }); - let Oe = Zn({ + let De = qn({ state: s, VIEWER_MODES: $, APP_CONFIG: E, getAssetMetadata: o, getAssetsBatch: r - }), ke = 3e5, Ae = /* @__PURE__ */ new Map(), je = () => { + }), Oe = 3e5, ke = /* @__PURE__ */ new Map(), Ae = () => { try { let e = Date.now(); - for (let [t, n] of Ae.entries()) { + for (let [t, n] of ke.entries()) { let r = Number(n?.at) || 0; - (!r || e - r > ke) && Ae.delete(t); + (!r || e - r > Oe) && ke.delete(t); } - if (Ae.size <= 256) return; - let t = Array.from(Ae.entries()).sort((e, t) => (Number(e?.[1]?.at) || 0) - (Number(t?.[1]?.at) || 0)), n = Ae.size - 256; + if (ke.size <= 256) return; + let t = Array.from(ke.entries()).sort((e, t) => (Number(e?.[1]?.at) || 0) - (Number(t?.[1]?.at) || 0)), n = ke.size - 256; for (let e = 0; e < n; e += 1) { let n = t?.[e]?.[0]; - n != null && Ae.delete(n); + n != null && ke.delete(n); } } catch (e) { console.debug?.(e); } - }, Me = (e) => { + }, je = (e) => { try { let t = String(e ?? ""); if (!t) return null; - let n = Ae.get(t); + let n = ke.get(t); if (!n || typeof n != "object") return null; let r = Number(n?.at) || 0; - return !r || Date.now() - r > ke ? (Ae.delete(t), null) : n?.data || null; + return !r || Date.now() - r > Oe ? (ke.delete(t), null) : n?.data || null; } catch { return null; } - }, Ne = (e, t) => { + }, Me = (e, t) => { try { let n = String(e ?? ""); if (!n || !t) return; - Ae.set(n, { + ke.set(n, { data: t, at: Date.now() - }), je(); + }), Ae(); } catch (e) { console.debug?.(e); } - }, Pe = async () => { + }, Ne = async () => { try { - await Oe?.hydrateVisibleMetadata?.(); + await De?.hydrateVisibleMetadata?.(); } catch (e) { console.debug?.(e); } }; try { - u = $n({ + u = Yn({ overlay: e, - content: fe, - singleView: B, - abView: V, - sideView: H, + content: B, + singleView: V, + abView: H, + sideView: U, state: s, VIEWER_MODES: $, - scheduleOverlayRedraw: J, + scheduleOverlayRedraw: Y, lifecycle: t }); } catch { u = null; } - let Fe = (e, t, n) => { + let Pe = (e, t, n) => { try { e.clearRect(0, 0, t, n); } catch (e) { console.debug?.(e); } - }, Ie = null; - function J(t) { + }, Fe = null; + function Y(t) { try { if (e.style.display === "none") return; if (t === !0) { - Ie != null && (cancelAnimationFrame(Ie), Ie = null); + Fe != null && (cancelAnimationFrame(Fe), Fe = null); try { - Re(); + Le(); } catch (e) { console.debug?.(e); } return; } - if (Ie != null) return; - Ie = requestAnimationFrame(() => { - Ie = null; + if (Fe != null) return; + Fe = requestAnimationFrame(() => { + Fe = null; try { - Re(); + Le(); } catch (e) { console.debug?.(e); } @@ -10106,24 +10029,24 @@ function Zr() { console.debug?.(e); } } - let Le = Jn({ - gridCanvas: U, - content: fe, + let Ie = Wn({ + gridCanvas: W, + content: B, state: s, VIEWER_MODES: $, getPrimaryMedia: () => { try { - if (s?.mode === $.SINGLE) return B?.querySelector?.(".mjr-viewer-media") || null; - if (s?.mode === $.AB_COMPARE) return V?.querySelector?.(".mjr-viewer-media") || null; - if (s?.mode === $.SIDE_BY_SIDE) return H?.querySelector?.(".mjr-viewer-media") || null; + if (s?.mode === $.SINGLE) return V?.querySelector?.(".mjr-viewer-media") || null; + if (s?.mode === $.AB_COMPARE) return H?.querySelector?.(".mjr-viewer-media") || null; + if (s?.mode === $.SIDE_BY_SIDE) return U?.querySelector?.(".mjr-viewer-media") || null; } catch (e) { console.debug?.(e); } return null; }, getViewportRect: C, - clearCanvas: Fe - }), Re = () => { + clearCanvas: Pe + }), Le = () => { let t = (() => { try { let e = Number(s?._panHintAt) || 0; @@ -10134,26 +10057,26 @@ function Zr() { })(); try { let e = s?.mode === $.SINGLE && !!s?.hudEnabled, n = String(s?.scopesMode || "off") !== "off", r = !!s?.overlayMaskEnabled; - U.style.display = s.gridMode === 0 && !r && !t && !e && !n ? "none" : ""; + W.style.display = s.gridMode === 0 && !r && !t && !e && !n ? "none" : ""; } catch (e) { console.debug?.(e); } - let n = Le.ensureCanvasSize(); + let n = Ie.ensureCanvasSize(); if (n.w > 0 && n.h > 0) { if ((() => { let e = s?.mode === $.SINGLE && !!s?.hudEnabled; return (Number(s.gridMode) || 0) !== 0 || !!s?.overlayMaskEnabled || e; - })()) Le.redrawGrid(n); + })()) Ie.redrawGrid(n); else try { - let e = U.getContext("2d"); - e && Fe(e, n.w, n.h); + let e = W.getContext("2d"); + e && Pe(e, n.w, n.h); } catch (e) { console.debug?.(e); } if (t) try { - let e = U.getContext("2d"); + let e = W.getContext("2d"); if (e) { - let t = fe?.getBoundingClientRect?.(), r = Number(s?._panHintX), i = Number(s?._panHintY), a = t && Number.isFinite(r) ? r - t.left : n.w / 2, o = t && Number.isFinite(i) ? i - t.top : n.h * .78, c = Math.max(10, Math.min(n.w - 10, a)), l = Math.max(10, Math.min(n.h - 10, o)); + let t = B?.getBoundingClientRect?.(), r = Number(s?._panHintX), i = Number(s?._panHintY), a = t && Number.isFinite(r) ? r - t.left : n.w / 2, o = t && Number.isFinite(i) ? i - t.top : n.h * .78, c = Math.max(10, Math.min(n.w - 10, a)), l = Math.max(10, Math.min(n.h - 10, o)); e.save(), e.font = "12px var(--comfy-font, ui-sans-serif, system-ui)", e.textAlign = "center", e.textBaseline = "middle"; let u = "Zoom in to pan", d = e.measureText(u), f = Math.min(n.w - 20, Math.max(140, d.width + 26)); e.fillStyle = "rgba(0,0,0,0.65)", e.strokeStyle = "rgba(255,255,255,0.18)", e.lineWidth = 1, e.beginPath(); @@ -10166,12 +10089,12 @@ function Zr() { try { let t = String(s?.scopesMode || "off"); if (t !== "off") { - let r = U.getContext("2d"); + let r = W.getContext("2d"); if (r) { - let i = B; - s?.mode === $.AB_COMPARE ? i = V : s?.mode === $.SIDE_BY_SIDE && (i = H); + let i = V; + s?.mode === $.AB_COMPARE ? i = H : s?.mode === $.SIDE_BY_SIDE && (i = U); let a = i?.querySelector?.("canvas.mjr-viewer-media") || e?.querySelector?.("canvas.mjr-viewer-media"); - a && a instanceof HTMLCanvasElement && qr?.drawScopesLight?.(r, { + a && a instanceof HTMLCanvasElement && Ur?.drawScopesLight?.(r, { w: n.w, h: n.h }, a, { @@ -10185,18 +10108,18 @@ function Zr() { } if (s.mode !== $.SINGLE) { try { - me.style.display = "none"; + pe.style.display = "none"; } catch (e) { console.debug?.(e); } try { - he.style.display = "none"; + me.style.display = "none"; } catch (e) { console.debug?.(e); } } } - }, ze = (e) => { + }, Re = (e) => { if (e) { try { for (let t of Array.from(e.childNodes || [])) try { @@ -10213,7 +10136,7 @@ function Zr() { console.debug?.(e); } } - }, Be = () => { + }, ze = () => { try { s._genInfoAbort?.abort?.(); } catch (e) { @@ -10227,10 +10150,10 @@ function Zr() { } }, Ve = async (e, { signal: t } = {}) => { try { - return await Jr?.ensureViewerMetadataAsset?.(e, { + return await Wr?.ensureViewerMetadataAsset?.(e, { getAssetMetadata: o, getFileMetadataScoped: m, - metadataCache: Oe, + metadataCache: De, signal: t }); } catch { @@ -10266,27 +10189,27 @@ function Zr() { } }, We = () => { try { - return !!(G?.childNodes?.length || ye?.childNodes?.length); + return !!(K?.childNodes?.length || ve?.childNodes?.length); } catch { return !1; } - }, Ke = async () => { - let t = Xe(), n = Y(), r = s.mode, i = !!s?.genInfoOpen && !s?.distractionFree, a = s?.assets?.[s?.currentIndex] || null, o = i && (r === $.AB_COMPARE && t || r === $.SIDE_BY_SIDE && n), c = o && r === $.SIDE_BY_SIDE && !s?.compareAsset && (s?.assets?.length ?? 0) > 2; + }, Ge = async () => { + let t = Xe(), n = Ze(), r = s.mode, i = !!s?.genInfoOpen && !s?.distractionFree, a = s?.assets?.[s?.currentIndex] || null, o = i && (r === $.AB_COMPARE && t || r === $.SIDE_BY_SIDE && n), c = o && r === $.SIDE_BY_SIDE && !s?.compareAsset && (s?.assets?.length ?? 0) > 2; try { - if (_e.style.display = i ? "flex" : "none", K.style.display = o ? "flex" : "none", e.style.paddingRight = i ? wr : "0px", e.style.paddingLeft = o ? wr : "0px", !i) { - Be(); + if (ge.style.display = i ? "flex" : "none", q.style.display = o ? "flex" : "none", e.style.paddingRight = i ? br : "0px", e.style.paddingLeft = o ? br : "0px", !i) { + ze(); try { s._genInfoRenderSignature = ""; } catch (e) { console.debug?.(e); } try { - ze(G); + Re(K); } catch (e) { console.debug?.(e); } try { - ze(ye); + Re(ve); } catch (e) { console.debug?.(e); } @@ -10314,7 +10237,7 @@ function Zr() { } catch (e) { console.debug?.(e); } - Be(); + ze(); let u = (Number(s?._genInfoReqId) || 0) + 1; try { s._genInfoReqId = u; @@ -10326,27 +10249,27 @@ function Zr() { let f = ({ left: e = null, leftExtra: t = null, right: n = null, rightExtra: r = null, single: i = null } = {}) => { try { if (s._genInfoReqId !== u) return; - ze(G); + Re(K); } catch (e) { console.debug?.(e); } try { if (s._genInfoReqId !== u) return; - ze(ye); + Re(ve); } catch (e) { console.debug?.(e); } if (s._genInfoReqId !== u) return; let a = () => { try { - s?.genInfoOpen || (s.genInfoOpen = !0), s._genInfoRenderSignature = "", Ke(); + s?.genInfoOpen || (s.genInfoOpen = !0), s._genInfoRenderSignature = "", Ge(); } catch (e) { console.debug?.(e); } }, l = (e, t, n, r) => { if (e) try { try { - let i = Jr?.buildViewerMetadataBlocks?.({ + let i = Wr?.buildViewerMetadataBlocks?.({ title: t, asset: n, ui: { @@ -10394,13 +10317,13 @@ function Zr() { } }; if (o) { - if (e && (ve.textContent = e.title || "Asset A", l(ye, t ? "Asset A" : "", e.asset, e.loading)), t && l(ye, "Asset C", t.asset, t.loading), n && (W.textContent = n.title || "Asset B", l(G, r ? "Asset B" : "", n.asset, n.loading)), r && l(G, "Asset D", r.asset, r.loading), !c && e?.asset && n?.asset && !e.loading && !n.loading) try { - let t = br(e.asset, n.asset); - t && G.insertBefore(t, G.firstChild || null); + if (e && (_e.textContent = e.title || "Asset A", l(ve, t ? "Asset A" : "", e.asset, e.loading)), t && l(ve, "Asset C", t.asset, t.loading), n && (G.textContent = n.title || "Asset B", l(K, r ? "Asset B" : "", n.asset, n.loading)), r && l(K, "Asset D", r.asset, r.loading), !c && e?.asset && n?.asset && !e.loading && !n.loading) try { + let t = gr(e.asset, n.asset); + t && K.insertBefore(t, K.firstChild || null); } catch (e) { console.debug?.(e); } - } else i && (W.textContent = i.title || "Generation Info", l(G, "", i.asset, i.loading)); + } else i && (G.textContent = i.title || "Generation Info", l(K, "", i.asset, i.loading)); }; try { if (!a) { @@ -10409,7 +10332,7 @@ function Zr() { } let e = null, t = null, n = null, i = null, l = null; o ? r === $.SIDE_BY_SIDE ? s?.compareAsset ? (e = a, t = s.compareAsset) : (e = s.assets[0] || null, t = s.assets[1] || null, c && (n = s.assets[2] || null, i = s.assets[3] || null)) : (e = a, t = s?.compareAsset || (s.assets.length === 2 ? s.assets[1 - s.currentIndex] : null)) : l = a; - let p = (e) => e ? Oe?.getCached?.(e.id)?.data || e : null; + let p = (e) => e ? De?.getCached?.(e.id)?.data || e : null; if (f({ left: o ? { title: c ? "Assets A & C" : "Asset A", @@ -10470,21 +10393,21 @@ function Zr() { } catch (e) { console.debug?.(e); } - }, qe = null; - function Je(e) { + }, Ke = null; + function qe(e) { try { - return !qe && Yr && (qe = Yr.createFrameExporter({ + return !Ke && Gr && (Ke = Gr.createFrameExporter({ state: s, VIEWER_MODES: $, - singleView: B, - abView: V, - sideView: H - })), qe?.exportCurrentFrame?.(e); + singleView: V, + abView: H, + sideView: U + })), Ke?.exportCurrentFrame?.(e); } catch (e) { console.debug?.(e); } } - let Ye = () => { + let Je = () => { let e = (e) => { try { e && e.replaceChildren(); @@ -10499,19 +10422,19 @@ function Zr() { n.className = "mjr-viewer-asset-pill", n.style.cssText = "\n display: inline-flex;\n align-items: center;\n gap: 8px;\n padding: 2px 8px;\n border-radius: 999px;\n border: 1px solid rgba(255,255,255,0.14);\n background: rgba(255,255,255,0.08);\n font-size: 12px;\n max-width: 360px;\n overflow: hidden;\n "; let r = document.createElement("span"); r.textContent = String(e.filename || ""), r.style.cssText = "max-width:200px; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; opacity:0.95;"; - let i = Ge(e.filename, e.kind, !!e?._mjrNameCollision); + let i = Be(e.filename, e.kind, !!e?._mjrNameCollision); try { i.style.position = "static", i.style.top = "", i.style.left = "", i.style.padding = "2px 6px", i.style.fontSize = "10px", i.style.borderRadius = "6px", i.style.pointerEvents = "none"; } catch (e) { console.debug?.(e); } - let a = $e(e.rating || 0); + let a = Ye(e.rating || 0); if (a) try { a.style.position = "static", a.style.top = "", a.style.right = "", a.style.padding = "2px 6px", a.style.fontSize = "12px"; } catch (e) { console.debug?.(e); } - let o = it(Array.isArray(e.tags) ? e.tags : []); + let o = et(Array.isArray(e.tags) ? e.tags : []); if (o) try { o.style.position = "static", o.style.bottom = "", o.style.left = "", o.style.maxWidth = "220px", o.style.pointerEvents = "none"; } catch (e) { @@ -10524,7 +10447,7 @@ function Zr() { console.debug?.(e); } return n; - }, n = s.mode === $.SINGLE, r = s.mode === $.AB_COMPARE && Xe(), i = s.mode === $.SIDE_BY_SIDE && Y(); + }, n = s.mode === $.SINGLE, r = s.mode === $.AB_COMPARE && Xe(), i = s.mode === $.SIDE_BY_SIDE && Ze(); if ((r || i) && ie) { let e = s.assets?.[s.currentIndex] || null, n = i && s.compareAsset != null, a = r ? s.compareAsset == null ? s.assets?.[0] || null : e : n ? e : s.assets?.[0] || null, o = r ? s.compareAsset == null ? s.assets?.[1] || null : s.compareAsset : n ? s.compareAsset : s.assets?.[Math.max(0, (s.assets?.length || 1) - 1)] || null, c = t(a, { showName: !1 }), l = t(o, { showName: !1 }); try { @@ -10550,13 +10473,13 @@ function Zr() { } }; function Xe() { - return (s.assets.length === 2 || s.compareAsset != null) && !De(); + return (s.assets.length === 2 || s.compareAsset != null) && !Ee(); } - function Y() { + function Ze() { let e = s.assets.length; return e >= 2 && e <= 4 || e >= 1 && s.compareAsset != null; } - function Ze() { + function Qe() { let t = !!s?.distractionFree; try { P.style.display = t ? "none" : ""; @@ -10564,7 +10487,7 @@ function Zr() { console.debug?.(e); } try { - q.style.display = t ? "none" : ""; + J.style.display = t ? "none" : ""; } catch (e) { console.debug?.(e); } @@ -10574,19 +10497,19 @@ function Zr() { console.debug?.(e); } try { - t && (e.style.paddingRight = "0px", e.style.paddingLeft = "0px", _e.style.display = "none", K.style.display = "none"); + t && (e.style.paddingRight = "0px", e.style.paddingLeft = "0px", ge.style.display = "none", q.style.display = "none"); } catch (e) { console.debug?.(e); } } - function Qe() { + function $e() { s.zoom = 1, s.panX = 0, s.panY = 0, s.targetZoom = 1; try { s.mode !== $.AB_COMPARE && s.mode !== $.SIDE_BY_SIDE && s.compareAsset != null && (s.compareAsset = null); } catch (e) { console.debug?.(e); } - let e = s.assets[s.currentIndex], t = s.mode === $.AB_COMPARE && Xe(), n = s.mode === $.SIDE_BY_SIDE && Y(), r = t && s.compareAsset != null, i = n && s.compareAsset != null, a = t ? (r ? e : s.assets?.[0]) || null : n ? (i ? e : s.assets?.[0]) || null : e || null, o = t ? (r ? s.compareAsset : s.assets?.[1]) || null : n ? i ? s.compareAsset : Array.isArray(s.assets) && s.assets.length >= 2 ? s.assets[s.assets.length - 1] : null : null; + let e = s.assets[s.currentIndex], t = s.mode === $.AB_COMPARE && Xe(), n = s.mode === $.SIDE_BY_SIDE && Ze(), r = t && s.compareAsset != null, i = n && s.compareAsset != null, a = t ? (r ? e : s.assets?.[0]) || null : n ? (i ? e : s.assets?.[0]) || null : e || null, o = t ? (r ? s.compareAsset : s.assets?.[1]) || null : n ? i ? s.compareAsset : Array.isArray(s.assets) && s.assets.length >= 2 ? s.assets[s.assets.length - 1] : null : null; try { F.textContent = a?.filename || ""; } catch (e) { @@ -10597,46 +10520,46 @@ function Zr() { } catch (e) { console.debug?.(e); } - s.mode === $.AB_COMPARE && Xe() ? xe.textContent = "2 selected" : s.mode === $.SIDE_BY_SIDE && Y() ? xe.textContent = s.compareAsset == null ? `${s.assets.length} selected` : "2 selected" : xe.textContent = `${s.currentIndex + 1} / ${s.assets.length}`, s.mode === $.AB_COMPARE && !Xe() && (s.mode = Y() ? $.SIDE_BY_SIDE : $.SINGLE), s.mode === $.SIDE_BY_SIDE && !Y() && (s.mode = $.SINGLE); + s.mode === $.AB_COMPARE && Xe() ? be.textContent = "2 selected" : s.mode === $.SIDE_BY_SIDE && Ze() ? be.textContent = s.compareAsset == null ? `${s.assets.length} selected` : "2 selected" : be.textContent = `${s.currentIndex + 1} / ${s.assets.length}`, s.mode === $.AB_COMPARE && !Xe() && (s.mode = Ze() ? $.SIDE_BY_SIDE : $.SINGLE), s.mode === $.SIDE_BY_SIDE && !Ze() && (s.mode = $.SINGLE); try { N?.syncModeButtons?.({ canAB: Xe, - canSide: Y + canSide: Ze }); } catch (e) { console.debug?.(e); } - B.style.display = s.mode === $.SINGLE ? "flex" : "none", V.style.display = s.mode === $.AB_COMPARE ? "block" : "none", H.style.display = s.mode === $.SIDE_BY_SIDE ? "flex" : "none"; + V.style.display = s.mode === $.SINGLE ? "flex" : "none", H.style.display = s.mode === $.AB_COMPARE ? "block" : "none", U.style.display = s.mode === $.SIDE_BY_SIDE ? "flex" : "none"; try { - s.mode !== $.SINGLE && (Fn(B), B.replaceChildren()); + s.mode !== $.SINGLE && (jn(V), V.replaceChildren()); } catch (e) { console.debug?.(e); } try { - s.mode !== $.AB_COMPARE && (Fn(V), V.replaceChildren()); + s.mode !== $.AB_COMPARE && (jn(H), H.replaceChildren()); } catch (e) { console.debug?.(e); } try { - s.mode !== $.SIDE_BY_SIDE && (Fn(H), H.replaceChildren()); + s.mode !== $.SIDE_BY_SIDE && (jn(U), U.replaceChildren()); } catch (e) { console.debug?.(e); } - Ye(); - let c = s.mode === $.AB_COMPARE && Xe() || s.mode === $.SIDE_BY_SIDE && Y(); + Je(); + let c = s.mode === $.AB_COMPARE && Xe() || s.mode === $.SIDE_BY_SIDE && Ze(); try { - be.style.display = c ? "none" : "", Se.style.display = c ? "none" : ""; + ye.style.display = c ? "none" : "", xe.style.display = c ? "none" : ""; } catch (e) { console.debug?.(e); } - et(), tt(s.assets, s.currentIndex), st(); + tt(), nt(s.assets, s.currentIndex), st(); try { N?.syncToolsUIFromState?.(); } catch (e) { console.debug?.(e); } try { - Ze(); + Qe(); } catch (e) { console.debug?.(e); } @@ -10645,16 +10568,16 @@ function Zr() { } catch (e) { console.debug?.(e); } - J(); + Y(); try { - Ke(); + Ge(); } catch (e) { console.debug?.(e); } try { - Pe().then(() => { + Ne().then(() => { try { - Ye(); + Je(); } catch (e) { console.debug?.(e); } @@ -10664,82 +10587,82 @@ function Zr() { } try { let e = s.mode === $.SINGLE; - Te.sync({ isSingle: e }); + we.sync({ isSingle: e }); } catch (e) { console.debug?.(e); } } - function et() { + function tt() { let e = s.assets[s.currentIndex]; if (!e) return; let t = v(e); if (t) { if (s.mode === $.SINGLE) { try { - Fn(B); + jn(V); } catch (e) { console.debug?.(e); } - B.innerHTML = "", s._mediaW = 0, s._mediaH = 0; + V.innerHTML = "", s._mediaW = 0, s._mediaH = 0; let n = A(e, t); - B.appendChild(n); - } else s.mode === $.AB_COMPARE ? Xe() && Wr?.renderABCompareView?.({ - abView: V, + V.appendChild(n); + } else s.mode === $.AB_COMPARE ? Xe() && Br?.renderABCompareView?.({ + abView: H, state: s, currentAsset: e, viewUrl: t, buildAssetViewURL: v, createCompareMediaElement: j, - destroyMediaProcessorsIn: Fn - }) : s.mode === $.SIDE_BY_SIDE && Y() && Gr?.renderSideBySideView?.({ - sideView: H, + destroyMediaProcessorsIn: jn + }) : s.mode === $.SIDE_BY_SIDE && Ze() && Vr?.renderSideBySideView?.({ + sideView: U, state: s, currentAsset: e, viewUrl: t, buildAssetViewURL: v, createMediaElement: A, - destroyMediaProcessorsIn: Fn + destroyMediaProcessorsIn: jn }); g(), y(); } else { try { - Fn(B); + jn(V); } catch (e) { console.debug?.(e); } try { - B.replaceChildren(); + V.replaceChildren(); let e = document.createElement("div"); - e.className = "mjr-viewer-media", e.style.cssText = "color:#ff9a9a; font-size:13px; padding:16px; text-align:center;", e.textContent = "Cannot open asset: missing or invalid filename/path.", B.appendChild(e); + e.className = "mjr-viewer-media", e.style.cssText = "color:#ff9a9a; font-size:13px; padding:16px; text-align:center;", e.textContent = "Cannot open asset: missing or invalid filename/path.", V.appendChild(e); } catch (e) { console.debug?.(e); } } } - let { preloadAdjacentAssets: tt, preloadImageForAsset: nt, trackPreloadRef: rt } = pr({ + let { preloadAdjacentAssets: nt, preloadImageForAsset: rt, trackPreloadRef: it } = lr({ buildAssetViewURL: v, IMAGE_PRELOAD_EXTENSIONS: c, state: s - }), { destroyPlayerBar: at, syncPlayerBar: ot } = Sr({ + }), { destroyPlayerBar: at, syncPlayerBar: ot } = vr({ state: s, APP_CONFIG: E, VIEWER_MODES: $, overlay: e, - navBar: Ce, - playerBarHost: we, - singleView: B, - abView: V, - sideView: H, - metadataHydrator: Oe, - isPlayableViewerKind: On, - collectPlayableMediaElements: kn, - pickPrimaryPlayableMedia: An, - mountUnifiedMediaControls: jn, - installFollowerVideoSync: qn, + navBar: Se, + playerBarHost: Ce, + singleView: V, + abView: H, + sideView: U, + metadataHydrator: De, + isPlayableViewerKind: wn, + collectPlayableMediaElements: Tn, + pickPrimaryPlayableMedia: En, + mountUnifiedMediaControls: Dn, + installFollowerVideoSync: Un, getViewerInfo: p, - scheduleOverlayRedraw: J, - viewerInfoCacheGet: Me, - viewerInfoCacheSet: Ne + scheduleOverlayRedraw: Y, + viewerInfoCacheGet: je, + viewerInfoCacheSet: Me }), st = () => ot(), ct = E.VIEWER_MAX_PROC_PIXELS ?? 12e6, lt = () => ({ exposureEV: Number(s.exposureEV) || 0, gamma: Math.max(.1, Math.min(3, Number(s.gamma) || 1)), @@ -10760,7 +10683,7 @@ function Zr() { console.debug?.(e); } try { - s?.mode === $.AB_COMPARE && V?._mjrDiffRequest?.(); + s?.mode === $.AB_COMPARE && H?._mjrDiffRequest?.(); } catch (e) { console.debug?.(e); } @@ -10774,14 +10697,14 @@ function Zr() { } }, ft = E.VIEWER_MAX_PROC_PIXELS_VIDEO ?? 3e6, pt = E.VIEWER_VIDEO_GRADE_THROTTLE_FPS ?? 15; try { - d = fr({ + d = cr({ overlay: e, state: s, mediaTransform: f, updateMediaNaturalSize: k, clampPanToBounds: h, applyTransform: g, - scheduleOverlayRedraw: J, + scheduleOverlayRedraw: Y, getGradeParams: lt, isDefaultGrade: dt, tonemap: null, @@ -10795,10 +10718,10 @@ function Zr() { } catch { d = null; } - a.push(Z(be, "click", () => { - s.currentIndex > 0 && (s.currentIndex--, Qe()); - })), a.push(Z(Se, "click", () => { - s.currentIndex < s.assets.length - 1 && (s.currentIndex++, Qe()); + a.push(Z(ye, "click", () => { + s.currentIndex > 0 && (s.currentIndex--, $e()); + })), a.push(Z(xe, "click", () => { + s.currentIndex < s.assets.length - 1 && (s.currentIndex++, $e()); })); let mt = null, ht = () => { try { @@ -10823,7 +10746,7 @@ function Zr() { }, _t = (e) => { if (!Array.isArray(s.assets) || s.assets.length === 0) return !1; let t = s.currentIndex + e; - return t < 0 || t >= s.assets.length ? !1 : (s.currentIndex = t, Qe(), !0); + return t < 0 || t >= s.assets.length ? !1 : (s.currentIndex = t, $e(), !0); }, vt = (t) => { if (e.style.display === "none") return; try { @@ -10833,12 +10756,12 @@ function Zr() { console.debug?.(e); } try { - if (!fe.contains(t.target)) return; + if (!B.contains(t.target)) return; } catch (e) { console.debug?.(e); } try { - if (Kr?.isModel3DInteractionTarget?.(t?.target)) return; + if (Hr?.isModel3DInteractionTarget?.(t?.target)) return; } catch (e) { console.debug?.(e); } @@ -10858,33 +10781,33 @@ function Zr() { try { let a = C(); if (!a) return; - let o = fe.getBoundingClientRect(), s = (Number(t) || 0) - o.left, c = (Number(n) || 0) - o.top, l = Number(e.offsetWidth) || 0, u = Number(e.offsetHeight) || 0, d = s + r, f = c + i; + let o = B.getBoundingClientRect(), s = (Number(t) || 0) - o.left, c = (Number(n) || 0) - o.top, l = Number(e.offsetWidth) || 0, u = Number(e.offsetHeight) || 0, d = s + r, f = c + i; d = Math.max(10, Math.min(d, a.width - l - 10)), f = Math.max(10, Math.min(f, a.height - u - 10)), e.style.left = `${Math.round(d)}px`, e.style.top = `${Math.round(f)}px`; } catch (e) { console.debug?.(e); } - }, bt = Yn({ + }, bt = Gn({ overlay: e, - content: fe, + content: B, state: s, VIEWER_MODES: $, getPrimaryMedia: b, getMediaNaturalSize: S, getViewportRect: C, positionOverlayBox: yt, - probeTooltip: me, - loupeWrap: he, - onLoupeRedraw: Xn({ + probeTooltip: pe, + loupeWrap: me, + onLoupeRedraw: Kn({ state: s, - loupeCanvas: ge, - loupeWrap: he, + loupeCanvas: he, + loupeWrap: me, getMediaNaturalSize: S, positionOverlayBox: yt }).redraw, lifecycle: t }); try { - if (!fe._mjrOverlayResizeBound && "ResizeObserver" in window) { + if (!B._mjrOverlayResizeBound && "ResizeObserver" in window) { try { e._mjrResizeObserver?.disconnect?.(); } catch (e) { @@ -10896,10 +10819,10 @@ function Zr() { } catch (e) { console.debug?.(e); } - J(); + Y(); }); try { - t.observe(fe); + t.observe(B); } catch (e) { console.debug?.(e); } @@ -10909,32 +10832,32 @@ function Zr() { } catch (e) { console.debug?.(e); } - }), fe._mjrOverlayResizeBound = !0; + }), B._mjrOverlayResizeBound = !0; } } catch (e) { console.debug?.(e); } - let xt = Gn({ + let xt = Vn({ overlay: e, - content: fe, - singleView: B, + content: B, + singleView: V, state: s, VIEWER_MODES: $, computeOneToOneZoom: D, setZoom: _, - scheduleOverlayRedraw: J, + scheduleOverlayRedraw: Y, scheduleApplyGrade: ht, syncToolsUIFromState: gt, - applyDistractionFreeUI: Ze, + applyDistractionFreeUI: Qe, navigateViewerAssets: _t, closeViewer: Tt, - renderBadges: Ye, + renderBadges: Je, updateAssetRating: n, safeDispatchCustomEvent: ce, ASSET_RATING_CHANGED_EVENT: O, - probeTooltip: me, - loupeWrap: he, - renderGenInfoPanel: Ke, + probeTooltip: pe, + loupeWrap: me, + renderGenInfoPanel: Ge, getVideoControls: () => { try { return s?._videoControlsMounted || null; @@ -10970,7 +10893,7 @@ function Zr() { console.debug?.(e); } try { - St.push(Z(fe, "wheel", vt, { + St.push(Z(B, "wheel", vt, { passive: !1, capture: !0 })); @@ -10979,7 +10902,7 @@ function Zr() { } try { let e = null; - St.push(Z(fe, "touchstart", (t) => { + St.push(Z(B, "touchstart", (t) => { try { if (t.touches?.length !== 1) return; let n = t.touches[0]; @@ -10991,7 +10914,7 @@ function Zr() { } catch (e) { console.debug?.(e); } - }, { passive: !0 })), St.push(Z(fe, "touchend", (t) => { + }, { passive: !0 })), St.push(Z(B, "touchend", (t) => { try { if (!e) return; if (t.changedTouches?.length !== 1) { @@ -11004,14 +10927,14 @@ function Zr() { } catch (e) { console.debug?.(e); } - }, { passive: !0 })), St.push(Z(fe, "touchcancel", () => { + }, { passive: !0 })), St.push(Z(B, "touchcancel", () => { e = null; }, { passive: !0 })); } catch (e) { console.debug?.(e); } try { - St.push(Z(fe, "mousemove", (e) => { + St.push(Z(B, "mousemove", (e) => { try { s._lastPointerX = e.clientX, s._lastPointerY = e.clientY; } catch (e) { @@ -11037,11 +10960,11 @@ function Zr() { if (t == null) return; for (let e of s.assets || []) e?.id != null && String(e.id) === String(t) && (e.rating = n); try { - Oe?.deleteCached?.(t); + De?.deleteCached?.(t); } catch (e) { console.debug?.(e); } - Ye(); + Je(); } catch (e) { console.debug?.(e); } @@ -11051,11 +10974,11 @@ function Zr() { if (t == null) return; for (let e of s.assets || []) e?.id != null && String(e.id) === String(t) && (e.tags = n); try { - Oe?.deleteCached?.(t); + De?.deleteCached?.(t); } catch (e) { console.debug?.(e); } - Ye(); + Je(); } catch (e) { console.debug?.(e); } @@ -11071,12 +10994,12 @@ function Zr() { console.debug?.(e); } try { - s.distractionFree = !1, Ze(); + s.distractionFree = !1, Qe(); } catch (e) { console.debug?.(e); } try { - Oe?.abort?.(); + De?.abort?.(); } catch (e) { console.debug?.(e); } @@ -11102,43 +11025,43 @@ function Zr() { } catch (e) { console.debug?.(e); } - try { - V?._mjrSyncAbort?.abort?.(); - } catch (e) { - console.debug?.(e); - } - try { - V?._mjrDiffAbort?.abort?.(); - } catch (e) { - console.debug?.(e); - } - try { - V._mjrSyncAbort = null; - } catch (e) { - console.debug?.(e); - } - try { - V._mjrDiffAbort = null; - } catch (e) { - console.debug?.(e); - } try { H?._mjrSyncAbort?.abort?.(); } catch (e) { console.debug?.(e); } + try { + H?._mjrDiffAbort?.abort?.(); + } catch (e) { + console.debug?.(e); + } try { H._mjrSyncAbort = null; } catch (e) { console.debug?.(e); } try { - V?._mjrSliderAbort?.abort?.(); + H._mjrDiffAbort = null; } catch (e) { console.debug?.(e); } try { - V._mjrSliderAbort = null; + U?._mjrSyncAbort?.abort?.(); + } catch (e) { + console.debug?.(e); + } + try { + U._mjrSyncAbort = null; + } catch (e) { + console.debug?.(e); + } + try { + H?._mjrSliderAbort?.abort?.(); + } catch (e) { + console.debug?.(e); + } + try { + H._mjrSliderAbort = null; } catch (e) { console.debug?.(e); } @@ -11185,17 +11108,17 @@ function Zr() { console.debug?.(e); } try { - Fn(B), B.replaceChildren(); + jn(V), V.replaceChildren(); } catch (e) { console.debug?.(e); } try { - Fn(V), V.replaceChildren(); + jn(H), H.replaceChildren(); } catch (e) { console.debug?.(e); } try { - Fn(H), H.replaceChildren(); + jn(U), U.replaceChildren(); } catch (e) { console.debug?.(e); } @@ -11205,17 +11128,17 @@ function Zr() { console.debug?.(e); } try { - Be(); + ze(); } catch (e) { console.debug?.(e); } try { - _e.style.display = "none", ze(G); + ge.style.display = "none", Re(K); } catch (e) { console.debug?.(e); } try { - K.style.display = "none", ze(ye); + q.style.display = "none", Re(ve); } catch (e) { console.debug?.(e); } @@ -11237,7 +11160,7 @@ function Zr() { open(t, n = 0, r = null) { wt(), s.assets = Array.isArray(t) ? t : [t], s.currentIndex = Math.max(0, Math.min(n, s.assets.length - 1)), s.distractionFree = !1; try { - Te.rebuild(); + we.rebuild(); } catch (e) { console.debug?.(e); } @@ -11247,14 +11170,14 @@ function Zr() { } catch (e) { console.debug?.(e); } - s._panHintTimer = null, s._lastPointerX = null, s._lastPointerY = null, s._mediaW = 0, s._mediaH = 0, s.compareAsset = r, s.gridMode = 0, Be(), s._probe = null; + s._panHintTimer = null, s._lastPointerX = null, s._lastPointerY = null, s._mediaW = 0, s._mediaH = 0, s.compareAsset = r, s.gridMode = 0, ze(), s._probe = null; try { - me.style.display = "none"; + pe.style.display = "none"; } catch (e) { console.debug?.(e); } try { - he.style.display = "none"; + me.style.display = "none"; } catch (e) { console.debug?.(e); } @@ -11270,7 +11193,7 @@ function Zr() { } catch { s._prevBodyOverflow = ""; } - document.body.style.overflow = "hidden", s._prevHotkeyScope = l().scope || null, i("viewer"), Qe(); + document.body.style.overflow = "hidden", s._prevHotkeyScope = l().scope || null, i("viewer"), $e(); try { gt(); } catch (e) { @@ -11281,16 +11204,16 @@ function Zr() { } catch (e) { console.debug?.(e); } - J(); + Y(); }, close() { Tt(); }, setMode(e) { - Object.values($).includes(e) && (s.mode = e, Qe()); + Object.values($).includes(e) && (s.mode = e, $e()); }, setCompareAsset(e) { - s.compareAsset = e, Qe(); + s.compareAsset = e, $e(); }, dispose() { try { @@ -11299,27 +11222,27 @@ function Zr() { console.debug?.(e); } try { - Ae.clear(); + ke.clear(); } catch (e) { console.debug?.(e); } try { - Fn(B); + jn(V); } catch (e) { console.debug?.(e); } try { - Fn(V); + jn(H); } catch (e) { console.debug?.(e); } try { - Fn(H); + jn(U); } catch (e) { console.debug?.(e); } try { - Ie != null && cancelAnimationFrame(Ie); + Fe != null && cancelAnimationFrame(Fe); } catch (e) { console.debug?.(e); } @@ -11349,12 +11272,12 @@ function Zr() { console.debug?.(e); } try { - Oe?.dispose?.(); + De?.dispose?.(); } catch (e) { console.debug?.(e); } try { - Dn(e); + Cn(e); } catch (e) { console.debug?.(e); } @@ -11392,13 +11315,13 @@ function Zr() { } e._mjrViewerAPI = Et; try { - En({ + Sn({ overlayEl: e, getCurrentAsset: () => s.assets[s.currentIndex], getCurrentViewUrl: (e) => v(e), onAssetChanged: () => { try { - Ye(); + Je(); } catch (e) { console.debug?.(e); } @@ -11409,7 +11332,7 @@ function Zr() { } return e; } -function Qr() { - return xr(Zr); +function Jr() { + return _r(qr); } -export { $e as A, ze as B, mt as C, ut as D, ft as E, rt as F, we as G, He as H, Ke as I, L as J, le as K, Ue as L, Ze as M, nt as N, st as O, tt as P, Ee as R, vt as S, dt as T, Be as U, Me as V, Te as W, ce as Y, Ot as _, pn as a, bt as b, ln as c, Qt as d, Ft as f, Dt as g, X as h, rn as i, it as j, Qe as k, an as l, Pt as m, qn as n, un as o, Nt as p, I as q, jn as r, on as s, Qr as t, Q as u, Tt as v, pt as w, ht as x, Et as y, Ne as z }; +export { Ye as A, Fe as B, ut as C, ot as D, ct as E, $e as F, le as G, Y as H, Ve as I, ce as J, I as K, Re as L, qe as M, Qe as N, rt as O, Ze as P, Te as R, mt as S, st as T, we as U, Le as V, Ce as W, wt as _, ln as a, gt as b, an as c, Jt as d, jt as f, Ct as g, X as h, $t as i, et as j, Je as k, en as l, At as m, Un as n, on as o, kt as p, L as q, Dn as r, tn as s, Jr as t, Q as u, xt as v, lt as w, dt as x, St as y, Oe as z }; diff --git a/dist/chunks/ViewerPortal-CeOkTVnX.js b/dist/chunks/ViewerPortal-D964vdje.js similarity index 98% rename from dist/chunks/ViewerPortal-CeOkTVnX.js rename to dist/chunks/ViewerPortal-D964vdje.js index d2c6e89e..5e865bbe 100644 --- a/dist/chunks/ViewerPortal-CeOkTVnX.js +++ b/dist/chunks/ViewerPortal-D964vdje.js @@ -1,9 +1,9 @@ import { a as e, i as t } from "./viewerRuntimeHosts-CkUqwo6l.js"; import { r as n } from "./events-B9CSrqJ_.js"; -import { a as r, c as i, i as a, l as o, o as s, s as c, t as l, u } from "./Viewer-BEptWhbV.js"; -import { i as d, r as f } from "./floatingViewerManager-DI520cRz.js"; +import { a as r, c as i, i as a, l as o, o as s, s as c, t as l, u } from "./Viewer-DCWIIJQl.js"; +import { i as d, r as f } from "./floatingViewerManager-B_1xQj1m.js"; import { B as p, C as m, D as h, E as g, G as _, J as v, K as y, L as b, N as x, O as S, T as C, U as w, V as T, dt as E, ft as D, j as O, k, lt as A, rt as j, ut as M, w as N, z as P } from "./mjr-primevue-BRqtdXzb.js"; -import { t as F } from "./TagsEditor-gpBsG4si.js"; +import { t as F } from "./TagsEditor-BydzUbtv.js"; // ui/vue/components/viewer/FloatingViewerHost.vue var I = /* @__PURE__ */ x({ __name: "FloatingViewerHost", diff --git a/dist/chunks/floatingViewerManager-DI520cRz.js b/dist/chunks/floatingViewerManager-B_1xQj1m.js similarity index 99% rename from dist/chunks/floatingViewerManager-DI520cRz.js rename to dist/chunks/floatingViewerManager-B_1xQj1m.js index 75bfc430..f7ce721a 100644 --- a/dist/chunks/floatingViewerManager-DI520cRz.js +++ b/dist/chunks/floatingViewerManager-B_1xQj1m.js @@ -96,7 +96,7 @@ var te = /* @__PURE__ */ e({ teardownFloatingViewerManager: () => we }), v = null, y = null; async function ne() { - return v || (y ||= import("./FloatingViewer-Bw0UgjBJ.js").then((e) => (v = e.FloatingViewer, v)), y); + return v || (y ||= import("./FloatingViewer-DjWZOB3Z.js").then((e) => (v = e.FloatingViewer, v)), y); } var b = null, re = null; async function ie() { diff --git a/dist/chunks/genInfo-C3ZF_agc.js b/dist/chunks/genInfo-B60U6rEQ.js similarity index 99% rename from dist/chunks/genInfo-C3ZF_agc.js rename to dist/chunks/genInfo-B60U6rEQ.js index e5912971..c8b4c4f5 100644 --- a/dist/chunks/genInfo-C3ZF_agc.js +++ b/dist/chunks/genInfo-B60U6rEQ.js @@ -1,7 +1,7 @@ import { t as e } from "./rolldown-runtime-CGnMp29N.js"; import { m as t, o as n } from "./events-B9CSrqJ_.js"; -import { h as r } from "./Viewer-BEptWhbV.js"; -import { i, n as a, r as o, t as s, u as c } from "./SidebarWorkflowSection-BjUgGET_.js"; +import { h as r } from "./Viewer-DCWIIJQl.js"; +import { i, n as a, r as o, t as s, u as c } from "./SidebarWorkflowSection-BMRq92Vq.js"; import { D as l, E as u, N as d, O as f, T as p, V as m, dt as h, ft as g, k as _, lt as v } from "./mjr-primevue-BRqtdXzb.js"; // ui/vue/components/viewer/ViewerMetadataBlock.vue?vue&type=script&setup=true&lang.ts var y = { style: { diff --git a/dist/chunks/openMajoorSettings-BZtL8v_l.js b/dist/chunks/openMajoorSettings-D92RuxBO.js similarity index 99% rename from dist/chunks/openMajoorSettings-BZtL8v_l.js rename to dist/chunks/openMajoorSettings-D92RuxBO.js index 888211a0..0afceb27 100644 --- a/dist/chunks/openMajoorSettings-BZtL8v_l.js +++ b/dist/chunks/openMajoorSettings-D92RuxBO.js @@ -1,6 +1,6 @@ import { A as e, E as t, S as n, Z as r, b as i, j as a, m as o, z as s } from "./events-B9CSrqJ_.js"; import { a as c, n as l } from "./graphTraversal-DTdQWkn5.js"; -import { S as u, Y as d, b as f, x as p, y as m } from "./SidebarWorkflowSection-BjUgGET_.js"; +import { S as u, Y as d, b as f, x as p, y as m } from "./SidebarWorkflowSection-BMRq92Vq.js"; // ui/features/viewer/floatingViewerProgress.ts var h = "progress-update", g = "__MJR_MFV_PROGRESS_SERVICE__"; function ee() { diff --git a/dist/chunks/viewerOpenRequest-B8IT-KHd.js b/dist/chunks/viewerOpenRequest-DaR0P9Y2.js similarity index 95% rename from dist/chunks/viewerOpenRequest-B8IT-KHd.js rename to dist/chunks/viewerOpenRequest-DaR0P9Y2.js index 0f66beed..a4769ebb 100644 --- a/dist/chunks/viewerOpenRequest-B8IT-KHd.js +++ b/dist/chunks/viewerOpenRequest-DaR0P9Y2.js @@ -1,6 +1,6 @@ import { t as e } from "./rolldown-runtime-CGnMp29N.js"; import { r as t } from "./events-B9CSrqJ_.js"; -import { t as n } from "./Viewer-BEptWhbV.js"; +import { t as n } from "./Viewer-DCWIIJQl.js"; // ui/features/viewer/viewerOpenRequest.ts var r = /* @__PURE__ */ e({ requestViewerOpen: () => o }); function i(e) { diff --git a/dist/entry.js b/dist/entry.js index e2779a56..9e4628d3 100644 --- a/dist/entry.js +++ b/dist/entry.js @@ -1,13 +1,13 @@ import { $t as e, A as t, B as n, Bt as r, C as i, D as a, E as o, Et as s, G as c, H as l, J as u, Jt as d, L as f, Lt as p, M as m, N as h, O as g, P as _, Rt as v, S as y, U as b, Ut as x, V as S, Vt as C, W as w, Wt as T, Xt as E, Yt as D, _ as O, _t as k, an as A, b as j, bt as M, c as N, d as P, en as ee, f as te, ft as F, g as I, gt as ne, h as re, ht as ie, in as ae, j as oe, jt as se, k as L, l as ce, m as le, mt as ue, nn as de, o as fe, on as pe, pt as me, q as he, qt as ge, rn as _e, s as ve, sn as ye, st as be, tn as xe, u as Se, ut as Ce, vt as we, w as Te, xt as Ee, y as De, yt as Oe, z as ke, zt as Ae } from "./chunks/viewerRuntimeHosts-CkUqwo6l.js"; import { $ as je, A as Me, Ct as Ne, F as Pe, J as Fe, K as Ie, L as Le, Q as Re, St as ze, Tt as Be, U as Ve, W as He, Y as Ue, _ as We, at as Ge, ct as Ke, dt as qe, et as Je, ft as Ye, g as Xe, ht as Ze, j as Qe, lt as $e, m as R, mt as et, n as z, nt as tt, o as B, ot as nt, pt as rt, q as it, r as V, rt as at, st as ot, t as st, tt as ct, ut as lt, wt as ut, xt as dt } from "./chunks/events-B9CSrqJ_.js"; import { a as ft, i as pt, n as mt, t as ht } from "./chunks/graphTraversal-DTdQWkn5.js"; -import { A as gt, B as _t, C as vt, D as yt, E as bt, F as xt, G as St, H as Ct, I as wt, J as Tt, L as Et, M as Dt, N as Ot, O as kt, P as At, R as jt, S as Mt, T as Nt, U as Pt, V as Ft, W as It, Y as Lt, _ as Rt, b as zt, d as Bt, g as Vt, j as Ht, k as Ut, q as Wt, v as Gt, x as Kt, y as qt, z as Jt } from "./chunks/Viewer-BEptWhbV.js"; -import { $ as Yt, A as Xt, B as Zt, C as Qt, D as $t, E as en, F as tn, G as nn, H as rn, I as an, J as on, K as sn, L as cn, M as ln, N as un, O as dn, P as fn, Q as pn, R as mn, T as hn, U as gn, V as _n, W as vn, X as yn, Y as bn, Z as xn, _ as Sn, a as Cn, c as wn, d as Tn, et as En, f as Dn, g as On, h as kn, i as An, j as jn, k as Mn, l as Nn, m as Pn, n as Fn, nt as In, o as Ln, p as Rn, q as zn, s as Bn, t as Vn, tt as Hn, u as Un, w as Wn, z as Gn } from "./chunks/SidebarWorkflowSection-BjUgGET_.js"; -import { _ as Kn, i as qn, n as Jn, p as Yn, t as Xn } from "./chunks/openMajoorSettings-BZtL8v_l.js"; -import { a as Zn, c as Qn, l as $n, o as er, s as tr, u as nr } from "./chunks/floatingViewerManager-DI520cRz.js"; -import { A as rr, B as ir, C as H, D as ar, E as U, G as or, H as sr, I as cr, J as W, K as lr, L as ur, M as dr, N as fr, O as G, P as pr, R as mr, S as hr, T as K, U as gr, V as q, W as _r, Y as vr, at as yr, b as br, ct as xr, dt as Sr, ft as J, it as Cr, j as Y, k as X, lt as Z, nt as wr, q as Tr, rt as Q, tt as Er, ut as Dr, v as Or, w as kr, x as Ar, y as jr, z as Mr } from "./chunks/mjr-primevue-BRqtdXzb.js"; +import { A as gt, B as _t, C as vt, D as yt, E as bt, F as xt, H as St, I as Ct, J as wt, K as Tt, L as Et, M as Dt, N as Ot, O as kt, P as At, R as jt, S as Mt, T as Nt, U as Pt, V as Ft, W as It, _ as Lt, b as Rt, d as zt, g as Bt, j as Vt, k as Ht, q as Ut, v as Wt, x as Gt, y as Kt, z as qt } from "./chunks/Viewer-DCWIIJQl.js"; +import { $ as Jt, A as Yt, B as Xt, C as Zt, D as Qt, E as $t, F as en, G as tn, H as nn, I as rn, J as an, K as on, L as sn, M as cn, N as ln, O as un, P as dn, Q as fn, R as pn, T as mn, U as hn, V as gn, W as _n, X as vn, Y as yn, Z as bn, _ as xn, a as Sn, c as Cn, d as wn, et as Tn, f as En, g as Dn, h as On, i as kn, j as An, k as jn, l as Mn, m as Nn, n as Pn, nt as Fn, o as In, p as Ln, q as Rn, s as zn, t as Bn, tt as Vn, u as Hn, w as Un, z as Wn } from "./chunks/SidebarWorkflowSection-BMRq92Vq.js"; +import { _ as Gn, i as Kn, n as qn, p as Jn, t as Yn } from "./chunks/openMajoorSettings-D92RuxBO.js"; +import { a as Xn, c as Zn, l as Qn, o as $n, s as er, u as tr } from "./chunks/floatingViewerManager-B_1xQj1m.js"; +import { A as nr, B as rr, C as H, D as ir, E as U, G as ar, H as or, I as sr, J as W, K as cr, L as lr, M as ur, N as dr, O as G, P as fr, R as pr, S as mr, T as K, U as hr, V as q, W as gr, Y as _r, at as vr, b as yr, ct as br, dt as xr, ft as J, it as Sr, j as Y, k as X, lt as Z, nt as Cr, ot as wr, q as Tr, rt as Q, tt as Er, ut as Dr, v as Or, w as kr, x as Ar, y as jr, z as Mr } from "./chunks/mjr-primevue-BRqtdXzb.js"; import { n as Nr, r as Pr } from "./chunks/mjr-vue-vendor-mHY_eIVE.js"; -import { t as Fr } from "./chunks/TagsEditor-gpBsG4si.js"; +import { t as Fr } from "./chunks/TagsEditor-BydzUbtv.js"; import { app as Ir } from "../../scripts/app.js"; function Lr(e = null) { return null; @@ -869,7 +869,7 @@ var ji = { } }, Mi = null; function Ni() { - return Mi ||= import("./chunks/viewerOpenRequest-B8IT-KHd.js").then((e) => e.n), Mi; + return Mi ||= import("./chunks/viewerOpenRequest-DaR0P9Y2.js").then((e) => e.n), Mi; } function Pi(e) { if (!e) return ""; @@ -907,7 +907,7 @@ function Li(t, n, r) { e(t?.error || R("toast.ratingUpdateFailed"), "error"); return; } - e(R("toast.ratingSetN", { n }), "success", 1500), Lt(st, { + e(R("toast.ratingSetN", { n }), "success", 1500), wt(st, { assetId: String(i), rating: n }, { warnPrefix: "[GridKeyboard]" }); @@ -931,7 +931,7 @@ function Ri({ gridContainer: t, getState: n = () => ({}), getSelectedAssets: r = })).catch((e) => console.debug?.(e)); }, _ = () => { try { - nr(t); + tr(t); } catch (e) { console.debug?.(e); } @@ -1069,7 +1069,7 @@ function Ri({ gridContainer: t, getState: n = () => ({}), getSelectedAssets: r = let e = document.activeElement, n = t.contains(e), r = e && e.contains && e.contains(t), i = e?.closest?.(".mjr-asset-card"); if (!n && !r && !i) return; } else { - let e = $n(); + let e = Qn(); if (e && e !== t) return; } let u = () => { @@ -1165,7 +1165,7 @@ function Ri({ gridContainer: t, getState: n = () => ({}), getSelectedAssets: r = else if (Fi(r, ji.ADD_TO_COLLECTION) && (d.length > 0 || f)) { u(); let e = d.length > 0 ? d : [f], n = t.getBoundingClientRect(); - await zt({ + await Rt({ x: n.left + n.width / 2, y: n.top + n.height / 2, assets: e @@ -1211,7 +1211,7 @@ function Ri({ gridContainer: t, getState: n = () => ({}), getSelectedAssets: r = t?.ok ? e(R("toast.openedInFolder"), "info", 2e3) : e(t?.error || R("toast.openFolderFailed"), "error"); } else if (Fi(r, ji.RENAME) && f?.id) { u(); - let t = f.filename || "", n = await Tt(R("dialog.rename.title", "Rename file"), t), r = yt(n, t); + let t = f.filename || "", n = await Ut(R("dialog.rename.title", "Rename file"), t), r = yt(n, t); if (r && r !== t) { let t = kt(r); if (!t.valid) { @@ -1311,7 +1311,7 @@ function Ri({ gridContainer: t, getState: n = () => ({}), getSelectedAssets: r = if (m && u) { document.removeEventListener("keydown", u, !0), d && document.removeEventListener("keyup", d, !0), f && document.removeEventListener("dragstart", f, !0), p && (t.removeEventListener("pointerdown", p, !0), t.removeEventListener("focusin", p, !0)), u = null, d = null, f = null, p = null, h = !1; try { - Qn(t); + Zn(t); } catch (e) { console.debug?.(e); } @@ -1348,7 +1348,7 @@ function zi(e) { return t ? Pi(t) : ""; } // ui/features/workflows/workflowInfoState.ts -var Bi = wr({ +var Bi = Cr({ open: !1, workflow: null }); @@ -1361,10 +1361,10 @@ function Hi() { // ui/features/contextmenu/GridContextMenu.ts var Ui = 1, Wi = null, Gi = null; function Ki() { - return Wi ||= import("./chunks/viewerOpenRequest-B8IT-KHd.js").then((e) => e.n), Wi; + return Wi ||= import("./chunks/viewerOpenRequest-DaR0P9Y2.js").then((e) => e.n), Wi; } function qi() { - return Gi ||= import("./chunks/floatingViewerManager-DI520cRz.js").then((e) => e.n), Gi; + return Gi ||= import("./chunks/floatingViewerManager-B_1xQj1m.js").then((e) => e.n), Gi; } function Ji(e) { let t = String(e || "").trim().toLowerCase(); @@ -1529,7 +1529,7 @@ async function ia(e) { let t = Array.isArray(e) ? e.filter(Boolean) : [], n = await Promise.all(t.map(async (e) => { let t = ea(e); if (!t) return null; - let n = (await Wn({ + let n = (await Un({ post: L, endpoint: at.STAGE_TO_INPUT, payload: t, @@ -1541,7 +1541,7 @@ async function ia(e) { droppedExt: String(t.filename || "").split(".").pop() || "" } : null; })); - return hn({ + return mn({ app: Qe(), items: n.filter(Boolean), event: null @@ -1559,7 +1559,7 @@ var aa = (e) => { } catch (e) { console.debug?.(e); } - Lt("mjr:selection-changed", { selectedIds: [] }, { + wt("mjr:selection-changed", { selectedIds: [] }, { target: e, warnPrefix: "[GridContextMenu]" }); @@ -1696,12 +1696,12 @@ function pa(e, t, n) { } catch (e) { console.debug?.(e); } - r ? qt(String(r), t, { + r ? Kt(String(r), t, { successMessage: t > 0 ? `Rating set to ${t} stars` : "Rating cleared", errorMessage: "Failed to update rating", warnPrefix: "[GridContextMenu]", onSuccess: () => { - Lt(st, { + wt(st, { assetId: String(r), rating: t }, { warnPrefix: "[GridContextMenu]" }); @@ -1719,7 +1719,7 @@ function ma(e) { } function ha() { try { - return !!(Hn()?.browser?.showFolders ?? !1); + return !!(Vn()?.browser?.showFolders ?? !1); } catch { return !1; } @@ -1756,13 +1756,13 @@ function ya(e) { } async function ba(e) { if (!e || _a(e)) return null; - let t = Yn(e); + let t = Jn(e); if (t) return t; let n = e?.id; if (n == null || n === "") return null; try { let t = await I(n, { timeoutMs: 3e4 }), r = t?.data; - if (t?.ok && r && typeof r == "object") return Object.assign(e, r), Yn(e); + if (t?.ok && r && typeof r == "object") return Object.assign(e, r), Jn(e); } catch (e) { console.debug?.(e); } @@ -1789,7 +1789,7 @@ async function Sa(t) { return; } let r = Qe(); - if (Le(r) === !0 && !await Wt(R("dialog.workflowLoadReplaceDirty", "Current canvas has unsaved changes. Replace it with this workflow?"), R("tab.workflow", "Workflow"))) return; + if (Le(r) === !0 && !await Tt(R("dialog.workflowLoadReplaceDirty", "Current canvas has unsaved changes. Replace it with this workflow?"), R("tab.workflow", "Workflow"))) return; let i = await y(n, { timeoutMs: 3e4 }), o = i?.data?.workflow || i?.workflow || null; if (!i?.ok || !o || typeof o != "object") { e(i?.error || R("toast.workflowLoadFailed", "Failed to load workflow."), "error"); @@ -1825,7 +1825,7 @@ async function wa(t) { r?.ok ? (e(R("toast.workflowSaved", "Workflow saved"), "success", 1800), Ca("workflow-duplicate")) : e(r?.error || R("toast.workflowSaveFailed", "Failed to save workflow."), "error"); } async function Ta(t) { - let n = String(t?.filepath || "").trim(), r = String(t?.display_name || t?.filename || "").replace(/\.json$/i, ""), i = await Tt(R("ctx.renameWorkflow", "Rename workflow"), r, R("tab.workflow", "Workflow")), a = String(i || "").trim(); + let n = String(t?.filepath || "").trim(), r = String(t?.display_name || t?.filename || "").replace(/\.json$/i, ""), i = await Ut(R("ctx.renameWorkflow", "Rename workflow"), r, R("tab.workflow", "Workflow")), a = String(i || "").trim(); if (!a) return; let o = await g({ filepath: n, @@ -1834,7 +1834,7 @@ async function Ta(t) { o?.ok ? (e(R("toast.workflowUpdated", "Workflow updated"), "success", 1800), Ca("workflow-rename")) : e(o?.error || R("toast.workflowSaveFailed", "Failed to save workflow."), "error"); } async function Ea(t) { - let n = String(t?.filepath || "").trim(), r = String(t?.subfolder || "").trim(), i = await Tt(R("dialog.workflowCategory", "Workflow category"), r, R("tab.workflow", "Workflow")); + let n = String(t?.filepath || "").trim(), r = String(t?.subfolder || "").trim(), i = await Ut(R("dialog.workflowCategory", "Workflow category"), r, R("tab.workflow", "Workflow")); if (i == null) return; let a = await g({ filepath: n, @@ -1861,7 +1861,7 @@ async function Da(t) { e(R("toast.workflowThumbnailNoCandidates", "No linked outputs are available for this workflow yet."), "warning", 2600); return; } - let a = await kn({ + let a = await On({ title: R("ctx.setWorkflowThumbnail", "Set workflow thumbnail"), workflow: t, items: i @@ -1912,7 +1912,7 @@ async function Aa(t) { e(R("toast.noFilePath"), "error"); return; } - let r = await On({ + let r = await Dn({ title: R("ctx.assignAsWorkflowThumbnail", "Use as workflow thumbnail"), sourceAsset: t }), i = String(r?.filepath || "").trim(); @@ -1927,7 +1927,7 @@ async function Aa(t) { } async function ja(t) { let n = String(t?.filepath || "").trim(); - if (!await Wt(R("dialog.deleteWorkflowConfirm", "Delete this workflow JSON and its adjacent thumbnail files?"), R("ctx.deleteWorkflow", "Delete workflow"))) return; + if (!await Tt(R("dialog.deleteWorkflowConfirm", "Delete this workflow JSON and its adjacent thumbnail files?"), R("ctx.deleteWorkflow", "Delete workflow"))) return; let r = await te({ filepath: n }, { timeoutMs: 3e4 }); r?.ok ? (e(R("toast.workflowDeleted", "Workflow deleted"), "success", 1800), Ca("workflow-delete")) : e(r?.error || R("toast.fileDeleteFailed", "Failed to delete file."), "error"); } @@ -1976,7 +1976,7 @@ function Pa(e, t) { function Fa({ currentPath: t, gridContainer: n } = {}) { return [$(R("ctx.createFolderHere", "Create folder here..."), "pi pi-plus", null, async () => { try { - let r = await Tt(R("dialog.newFolderName", "New folder name"), ""), i = String(r || "").trim(); + let r = await Ut(R("dialog.newFolderName", "New folder name"), ""), i = String(r || "").trim(); if (!i) return; let a = await ke({ op: "create", @@ -2008,7 +2008,7 @@ function Ia({ asset: t, gridContainer: n, panelState: r } = {}) { e(R("toast.unableResolveFolderPath"), "error"); return; } - let n = await Tt(R("dialog.browserRootLabelOptional"), String(t?.filename || "")), r = await L(at.CUSTOM_ROOTS, { + let n = await Ut(R("dialog.browserRootLabelOptional"), String(t?.filename || "")), r = await L(at.CUSTOM_ROOTS, { path: i, label: String(n || "").trim() || void 0 }); @@ -2024,7 +2024,7 @@ function Ia({ asset: t, gridContainer: n, panelState: r } = {}) { })]; return ma(r) && i && a.push(Yi(), $(R("ctx.createFolderHere"), "pi pi-plus", null, async () => { try { - let t = await Tt(R("dialog.newFolderName"), ""), r = String(t || "").trim(); + let t = await Ut(R("dialog.newFolderName"), ""), r = String(t || "").trim(); if (!r) return; let a = await ke({ op: "create", @@ -2041,7 +2041,7 @@ function Ia({ asset: t, gridContainer: n, panelState: r } = {}) { } }), $(R("ctx.renameFolder"), "pi pi-pencil", null, async () => { try { - let r = String(t?.filename || "").trim(), a = await Tt(R("dialog.renameFolder"), r), o = String(a || "").trim(); + let r = String(t?.filename || "").trim(), a = await Ut(R("dialog.renameFolder"), r), o = String(a || "").trim(); if (!o || o === r) return; let s = await ke({ op: "rename", @@ -2058,7 +2058,7 @@ function Ia({ asset: t, gridContainer: n, panelState: r } = {}) { } }), $(R("ctx.moveFolder"), "pi pi-arrow-right", null, async () => { try { - let t = await Tt(R("dialog.destinationDirectoryPath"), ""), r = String(t || "").trim(); + let t = await Ut(R("dialog.destinationDirectoryPath"), ""), r = String(t || "").trim(); if (!r) return; let a = await ke({ op: "move", @@ -2076,7 +2076,7 @@ function Ia({ asset: t, gridContainer: n, panelState: r } = {}) { }), $(R("ctx.deleteFolder"), "pi pi-trash", null, async () => { try { let r = String(t?.filename || R("label.thisFolder", "this folder")); - if (!await Wt(R("dialog.deleteFolderRecursive", { name: r }))) return; + if (!await Tt(R("dialog.deleteFolderRecursive", { name: r }))) return; let a = await ke({ op: "delete", path: i, @@ -2223,7 +2223,7 @@ function La({ asset: t, card: r, gridContainer: i, panelState: a, pointerX: o, p await ra(_); }, { disabled: v < 2 }), $("Add to collection...", "pi pi-bookmark", zi("ADD_TO_COLLECTION"), async () => { let e = Zi(i), n = e.length ? e : [t]; - await zt({ + await Rt({ x: o, y: s, assets: n @@ -2262,7 +2262,7 @@ function La({ asset: t, card: r, gridContainer: i, panelState: a, pointerX: o, p } }, { disabled: !(t?.filename || t?.id) }), $("Rename...", "pi pi-pencil", zi("RENAME"), async () => { if (!(t?.id || $i(t))) return; - let n = t.filename || "", r = await Tt(R("dialog.rename.title", "Rename file"), n), a = yt(r, n); + let n = t.filename || "", r = await Ut(R("dialog.rename.title", "Rename file"), n), a = yt(r, n); if (!a || a === n) return; let o = kt(a); if (!o.valid) e(o.reason, "error"); @@ -2317,7 +2317,7 @@ function La({ asset: t, card: r, gridContainer: i, panelState: a, pointerX: o, p }, { disabled: !(t?.id || $i(t)) })), m; } function Ra(e, t, n, r) { - n && zn({ + n && Rn({ x: e, y: t, asset: n, @@ -2339,7 +2339,7 @@ function za({ gridContainer: e, getState: t = () => ({}) } = {}) { if (!ma(r)) return; let t = String(e?.dataset?.mjrScope || "").toLowerCase(), i = String(e?.dataset?.mjrSubfolder || "").trim(), a = (t === "input" || t === "output") && ha(); if (!i && !a) return; - n.preventDefault(), n.stopPropagation(), nn({ + n.preventDefault(), n.stopPropagation(), tn({ x: n.clientX, y: n.clientY, items: Fa({ @@ -2365,7 +2365,7 @@ function za({ gridContainer: e, getState: t = () => ({}) } = {}) { pointerY: n.clientY, selection: o }); - nn({ + tn({ x: n.clientX, y: n.clientY, items: s @@ -2394,12 +2394,12 @@ function za({ gridContainer: e, getState: t = () => ({}) } = {}) { console.debug?.(e); } try { - Gt(); + Wt(); } catch (e) { console.debug?.(e); } try { - _n(); + gn(); } catch (e) { console.debug?.(e); } @@ -2420,7 +2420,7 @@ function Va(e) { function Ha(e, t = null) { if (!e) return []; try { - let t = Array.from(Zn(e)); + let t = Array.from(Xn(e)); if (t.length) return t; } catch (e) { console.debug?.(e); @@ -2785,7 +2785,7 @@ var ho = (e) => { } let s = t.filename || t.name; if (!s) return; - let c = a ? yo(t) : "", l = ho((c ? ot(c) : "") || i), u = tn(s); + let c = a ? yo(t) : "", l = ho((c ? ot(c) : "") || i), u = en(s); try { e.setData("text/uri-list", l), e.setData("DownloadURL", `${u}:${s}:${l}`), e.effectAllowed = "copyMove"; } catch (e) { @@ -2892,14 +2892,14 @@ var ho = (e) => { }, tags: Array.isArray(t.tags) ? t.tags : [] }; - Mo(e, cn, JSON.stringify(a)), r && Mo(e, "text/uri-list", r); + Mo(e, sn, JSON.stringify(a)), r && Mo(e, "text/uri-list", r); }, Po = (e) => { let t = e && typeof e == "object" ? e : null; if (!t) return []; try { let e = window?.__MJR_LAST_SELECTION_GRID__, n = typeof e?._mjrGetSelectedAssets == "function" ? e._mjrGetSelectedAssets() : []; if (Array.isArray(n) && n.length > 1) { - let e = n.map(jo).filter(an), r = ko(t); + let e = n.map(jo).filter(rn), r = ko(t); if (e.some((e) => ko(e) === r)) return e; } } catch (e) { @@ -2910,7 +2910,7 @@ var ho = (e) => { try { let n = typeof e?._mjrGetSelectedAssets == "function" ? e._mjrGetSelectedAssets() : []; if (!Array.isArray(n) || n.length <= 1) return []; - let r = n.map(jo).filter(an), i = ko(t); + let r = n.map(jo).filter(rn), i = ko(t); return r.some((e) => ko(e) === i) ? r : []; } catch (e) { return console.debug?.(e), []; @@ -2919,7 +2919,7 @@ var ho = (e) => { try { let t = e?.dataTransfer?.getData?.("application/x-mjr-assets") || ""; if (t) { - let e = JSON.parse(t), n = (Array.isArray(e?.items) ? e.items : Array.isArray(e) ? e : []).map(io).filter(an); + let e = JSON.parse(t), n = (Array.isArray(e?.items) ? e.items : Array.isArray(e) ? e : []).map(io).filter(rn); if (n.length) return n; } } catch (e) { @@ -2929,7 +2929,7 @@ var ho = (e) => { }, Lo = async (e) => { let t = Array.isArray(e) ? e.filter(Boolean) : []; return t.length ? (await Promise.all(t.map(async (e) => { - let t = (await Wn({ + let t = (await Un({ post: L, endpoint: at.STAGE_TO_INPUT, payload: e, @@ -3047,9 +3047,9 @@ function ts(e) { }; try { let t = Do(); - Mo(n, mn, JSON.stringify(c)); + Mo(n, pn, JSON.stringify(c)); let o = Fo(e, c); - o.length > 1 && Mo(n, Gn, JSON.stringify({ items: o })), Mo(n, "text/plain", String(i.filename || "")); + o.length > 1 && Mo(n, Wn, JSON.stringify({ items: o })), Mo(n, "text/plain", String(i.filename || "")); let s = a === "workflow" ? "" : Co(c); No({ dt: n, @@ -3183,7 +3183,7 @@ function as() { e && (a = e.resolvedStart === void 0 ? e.start : e.resolvedStart); } t._ghostSegmentId = null, t._ghostTrack = null, t._ghostInitialTimeline = null, t._previewSegments = null, t.render?.(); - let c = String(r || "").toLowerCase(), l = i.has(c), u = await Wn({ + let c = String(r || "").toLowerCase(), l = i.has(c), u = await Un({ post: L, endpoint: at.STAGE_TO_INPUT, payload: n, @@ -3303,16 +3303,16 @@ function as() { onDragOver: (e) => { let t = So(); if (!Array.from(e?.dataTransfer?.types || []).includes("application/x-mjr-asset")) return; - let n = ao(e, mn); - if (!an(n)) return; - let r = un(t, e.clientX, e.clientY), i = r ? ln(t, r, e.clientX, e.clientY) : null, a = String(n?.filename || "").split(".").pop() || "", o = r && !i ? fn(r, n, a) : null, s = r && !i && !o && !!r._timelineEditor; - r && (i || o || s) ? (e.preventDefault(), s || (e.stopImmediatePropagation?.(), e.stopPropagation()), Xt(t, r, Mn), e.dataTransfer.dropEffect = "copy", i ? to("dragover slot", { + let n = ao(e, pn); + if (!rn(n)) return; + let r = ln(t, e.clientX, e.clientY), i = r ? cn(t, r, e.clientX, e.clientY) : null, a = String(n?.filename || "").split(".").pop() || "", o = r && !i ? dn(r, n, a) : null, s = r && !i && !o && !!r._timelineEditor; + r && (i || o || s) ? (e.preventDefault(), s || (e.stopImmediatePropagation?.(), e.stopPropagation()), Yt(t, r, jn), e.dataTransfer.dropEffect = "copy", i ? to("dragover slot", { node: r?.title, slot: i.input?.name }) : s ? to("dragover ltxdirector", { node: r?.title }) : to("dragover widget", { node: r?.title, widget: o?.name - })) : (jn(t, Mn), dn(t, e) && (e.preventDefault(), e.dataTransfer.dropEffect = "copy")); + })) : (An(t, jn), un(t, e) && (e.preventDefault(), e.dataTransfer.dropEffect = "copy")); }, onDrop: async (t) => { let n = So(); @@ -3320,20 +3320,20 @@ function as() { try { if ((t?.target)?.closest?.(".mjr-folder-card")) return; } catch {} - let r = ao(t, mn); - if (!an(r) || !dn(n, t)) return; + let r = ao(t, pn); + if (!rn(r) || !un(n, t)) return; fo(); - let i = Oo(), a = i ? Io(t, r) : [r], o = un(n, t.clientX, t.clientY), s = o ? ln(n, o, t.clientX, t.clientY) : null, l = String(r?.filename || "").split(".").pop() || "", u = o && !s ? fn(o, r, l) : null; + let i = Oo(), a = i ? Io(t, r) : [r], o = ln(n, t.clientX, t.clientY), s = o ? cn(n, o, t.clientX, t.clientY) : null, l = String(r?.filename || "").split(".").pop() || "", u = o && !s ? dn(o, r, l) : null; if (o && s) { - t.preventDefault(), t.stopImmediatePropagation?.(), t.stopPropagation(), jn(n, Mn); - let i = await Qt({ + t.preventDefault(), t.stopImmediatePropagation?.(), t.stopPropagation(), An(n, jn); + let i = await Zt({ post: L, endpoint: at.STAGE_TO_INPUT, payload: r, index: !1 }); if (!i) return; - if (en({ + if ($t({ app: n, payload: r, relativePath: i, @@ -3352,12 +3352,12 @@ function as() { return; } if (o && !s && !u && o._timelineEditor && !i) { - t.preventDefault(), t.stopImmediatePropagation?.(), t.stopPropagation(), jn(n, Mn), await c(o._timelineEditor, r, l); + t.preventDefault(), t.stopImmediatePropagation?.(), t.stopPropagation(), An(n, jn), await c(o._timelineEditor, r, l); return; } if (!o || !u) { - if (jn(n, Mn), t.preventDefault(), t.stopImmediatePropagation?.(), t.stopPropagation(), i) { - let i = await Lo(a), o = hn({ + if (An(n, jn), t.preventDefault(), t.stopImmediatePropagation?.(), t.stopPropagation(), i) { + let i = await Lo(a), o = mn({ app: n, items: i, event: t @@ -3377,7 +3377,7 @@ function as() { e(`Failed to load workflow: "${r?.filename}".`, "error"); return; } - let s = !o && !i, c = Wn({ + let s = !o && !i, c = Un({ post: L, endpoint: at.STAGE_TO_INPUT, payload: r, @@ -3392,7 +3392,7 @@ function as() { to("drop canvas stage failed"), e(`Failed to load file: "${r?.filename}". Staging failed.`, "error"); return; } - if (to("drop canvas staged", { value: p }), hn({ + if (to("drop canvas staged", { value: p }), mn({ app: n, items: [{ payload: r, @@ -3407,14 +3407,14 @@ function as() { e(`Staged to input: ${p}`, "success", 4e3); return; } - t.preventDefault(), t.stopImmediatePropagation?.(), t.stopPropagation(), jn(n, Mn); - let d = await Qt({ + t.preventDefault(), t.stopImmediatePropagation?.(), t.stopPropagation(), An(n, jn); + let d = await Zt({ post: L, endpoint: at.STAGE_TO_INPUT, payload: r, index: !1 }); - d && ($t(u, d), Mn(n), to("drop inject", { + d && (Qt(u, d), jn(n), to("drop inject", { node: o?.title, widget: u?.name, value: d @@ -3422,7 +3422,7 @@ function as() { }, onDragLeave: () => { let e = So(); - jn(e, Mn), to("dragleave"); + An(e, jn), to("dragleave"); } }; } @@ -3437,7 +3437,7 @@ function os() { } wo = !1, To = !1; try { - jn(So(), Mn); + An(So(), jn); } catch (e) { console.debug?.(e); } @@ -3631,7 +3631,7 @@ function vs() { } return e; } -var ys = vs(), bs = ["title"], xs = /* @__PURE__ */ fr({ +var ys = vs(), bs = ["title"], xs = /* @__PURE__ */ dr({ __name: "RatingBadge", props: { rating: { type: [Number, String], @@ -3647,15 +3647,15 @@ var ys = vs(), bs = ["title"], xs = /* @__PURE__ */ fr({ key: 0, class: "mjr-rating-badge", title: i.value - }, [(q(!0), X(H, null, gr(n.value, (e) => (q(), X("span", { + }, [(q(!0), X(H, null, hr(n.value, (e) => (q(), X("span", { key: e, - style: Sr({ + style: xr({ color: "var(--mjr-rating-color, var(--mjr-star-active, #FFD45A))", marginRight: e < n.value ? "2px" : "0" }) }, " ★ ", 4))), 128))], 8, bs)) : G("", !0); } -}), Ss = ["title"], Cs = /* @__PURE__ */ fr({ +}), Ss = ["title"], Cs = /* @__PURE__ */ dr({ __name: "TagsBadge", props: { tags: { type: [Array, String], @@ -3686,7 +3686,7 @@ var ys = vs(), bs = ["title"], xs = /* @__PURE__ */ fr({ style: { color: "var(--mjr-tag-color, #90CAF9)" } }, J(a.value), 9, Ss)) : G("", !0); } -}), ws = ["title"], Ts = /* @__PURE__ */ fr({ +}), ws = ["title"], Ts = /* @__PURE__ */ dr({ __name: "GenTimeBadge", props: { genTimeMs: { default: 0 } }, setup(e) { @@ -3695,7 +3695,7 @@ var ys = vs(), bs = ["title"], xs = /* @__PURE__ */ fr({ key: 0, class: "mjr-gentime-badge", title: i.value.title, - style: Sr({ color: a.value }) + style: xr({ color: a.value }) }, J(i.value.text), 13, ws)) : G("", !0); } }), Es = { @@ -3757,7 +3757,7 @@ var ys = vs(), bs = ["title"], xs = /* @__PURE__ */ fr({ opacity: "0.55", margin: "0 3px" } -}, oc = ["title"], sc = { class: "mjr-stack-group-button-count" }, cc = { class: "mjr-dup-stack-count" }, lc = /* @__PURE__ */ fr({ +}, oc = ["title"], sc = { class: "mjr-stack-group-button-count" }, cc = { class: "mjr-dup-stack-count" }, lc = /* @__PURE__ */ dr({ __name: "AssetCardInner", props: { asset: {} }, emits: ["workflow-action"], @@ -3908,11 +3908,11 @@ var ys = vs(), bs = ["title"], xs = /* @__PURE__ */ fr({ }), ae = K(() => ie.value > 0), oe = K(() => Ot(ie.value)), se = K(() => At(ie.value)), L = K(() => String(p.asset.positive_prompt || "").trim()), ce = K(() => p.asset?._mjrLivePlaceholder === !0 || p.asset?.is_live_placeholder === !0 || String(p.asset?.id || "").trim().toLowerCase().startsWith("live:")), le = K(() => String(p.asset?._mjrLiveLabel || "In progress").trim() || "In progress"), ue = K(() => `${le.value}: waiting for indexed asset data`), de = K(() => { let { width: e, height: t } = p.asset; return e && t ? `${e}x${t}` : ""; - }), fe = K(() => p.asset.duration ? wn(p.asset.duration) : ""), pe = K(() => String(p.asset.task || p.asset.workflow_task || "").trim()), me = K(() => String(p.asset.model_family || p.asset.modelFamily || "").trim()), he = K(() => String(p.asset.runs_on || p.asset.runsOn || "").trim()), ge = K(() => Number(p.asset.node_count || p.asset.nodeCount || 0) || 0), _e = K(() => !!p.asset.favorite), ve = K(() => Number(p.asset.subgraph_count || p.asset.subgraphCount || 0) || 0), ye = K(() => Number(p.asset.missing_nodes_count || p.asset.missingNodesCount || 0) || 0), be = K(() => Number(p.asset.missing_models_count || p.asset.missingModelsCount || 0) || 0), xe = K(() => ye.value > 0 || be.value > 0), Se = K(() => { + }), fe = K(() => p.asset.duration ? Cn(p.asset.duration) : ""), pe = K(() => String(p.asset.task || p.asset.workflow_task || "").trim()), me = K(() => String(p.asset.model_family || p.asset.modelFamily || "").trim()), he = K(() => String(p.asset.runs_on || p.asset.runsOn || "").trim()), ge = K(() => Number(p.asset.node_count || p.asset.nodeCount || 0) || 0), _e = K(() => !!p.asset.favorite), ve = K(() => Number(p.asset.subgraph_count || p.asset.subgraphCount || 0) || 0), ye = K(() => Number(p.asset.missing_nodes_count || p.asset.missingNodesCount || 0) || 0), be = K(() => Number(p.asset.missing_models_count || p.asset.missingModelsCount || 0) || 0), xe = K(() => ye.value > 0 || be.value > 0), Se = K(() => { if (!xe.value) return ""; let e = []; return ye.value > 0 && e.push(`${ye.value} node`), be.value > 0 && e.push(`${be.value} model`), `Missing: ${e.join(" / ")}`; - }), Ce = K(() => p.asset.generation_time || p.asset.file_creation_time || p.asset.mtime || p.asset.created_at), we = K(() => Ce.value ? Bn(Ce.value) : ""), Te = K(() => Ce.value ? Nn(Ce.value) : ""), Ee = K(() => [ + }), Ce = K(() => p.asset.generation_time || p.asset.file_creation_time || p.asset.mtime || p.asset.created_at), we = K(() => Ce.value ? zn(Ce.value) : ""), Te = K(() => Ce.value ? Mn(Ce.value) : ""), Ee = K(() => [ de.value ? { key: "resolution", className: "mjr-meta-res", @@ -3952,7 +3952,7 @@ var ys = vs(), bs = ["title"], xs = /* @__PURE__ */ fr({ video: "var(--mjr-badge-video, #F44336)", audio: "var(--mjr-badge-audio, #4CAF50)", model3d: "var(--mjr-badge-model3d, #9C27B0)" - }[h.value] || "var(--mjr-badge-image, #888)"), ke = cr("mjrStackService", null), Ae = K(() => !ke || !String(p.asset.stack_id || "").trim() ? !1 : Number(p.asset.stack_asset_count || p.asset._mjrFeedGroupCount || 0) > 1), je = K(() => Number(p.asset.stack_asset_count || p.asset._mjrFeedGroupCount || 0) || 0), Me = K(() => !!p.asset._mjrDupStack && Number(p.asset._mjrDupCount || 0) >= 2), Ne = K(() => Number(p.asset._mjrDupCount || 0) || 0), Pe = K(() => Me.value && !Ae.value), Fe = Q(!1), Ie = Q(!1); + }[h.value] || "var(--mjr-badge-image, #888)"), ke = sr("mjrStackService", null), Ae = K(() => !ke || !String(p.asset.stack_id || "").trim() ? !1 : Number(p.asset.stack_asset_count || p.asset._mjrFeedGroupCount || 0) > 1), je = K(() => Number(p.asset.stack_asset_count || p.asset._mjrFeedGroupCount || 0) || 0), Me = K(() => !!p.asset._mjrDupStack && Number(p.asset._mjrDupCount || 0) >= 2), Ne = K(() => Number(p.asset._mjrDupCount || 0) || 0), Pe = K(() => Me.value && !Ae.value), Fe = Q(!1), Ie = Q(!1); async function Le(e) { if (e.preventDefault(), e.stopPropagation(), !Fe.value) { Fe.value = !0; @@ -3986,13 +3986,13 @@ var ys = vs(), bs = ["title"], xs = /* @__PURE__ */ fr({ } Je = ""; } - lr(() => g.value ? S.value : _.value ? E.value : "", (e) => { + cr(() => g.value ? S.value : _.value ? E.value : "", (e) => { let t = String(e || "").trim(); t && t !== Ye && (Ue.value = !1, Ye = ""); - }, { immediate: !0 }), lr(() => b.value ? k.value : "", (e) => { + }, { immediate: !0 }), cr(() => b.value ? k.value : "", (e) => { let t = String(e || "").trim(); t && t !== Xe && (We.value = !1, Xe = ""); - }, { immediate: !0 }), lr(() => [_.value ? Ve.value : null, _.value ? E.value : ""], async ([e, t], n, r) => { + }, { immediate: !0 }), cr(() => [_.value ? Ve.value : null, _.value ? E.value : ""], async ([e, t], n, r) => { if (!e || !t || Ue.value) return; let o = qe += 1, s = new AbortController(), c = !1; r(() => { @@ -4018,27 +4018,27 @@ var ys = vs(), bs = ["title"], xs = /* @__PURE__ */ fr({ } Mr(() => { window.addEventListener("mjr-settings-changed", $e); - }), lr(Be, (e, t) => { + }), cr(Be, (e, t) => { if (t) try { f(t); } catch {} if (e && ze.value) try { d(ze.value, e, Qe.value); } catch {} - }), lr(Qe, (e) => { + }), cr(Qe, (e) => { let t = Be.value, n = ze.value; t && n && d(n, t, e); - }), lr(D, (e, t) => { + }), cr(D, (e, t) => { if (e === t) return; let n = Be.value, r = ze.value; n && r && (f(n), d(r, n, Qe.value)); - }, { flush: "post" }), mr(() => { + }, { flush: "post" }), pr(() => { window.removeEventListener("mjr-settings-changed", $e), qe += 1, Ze(); let e = Be.value; if (e) try { f(e); } catch {} - }), ir(() => { + }), rr(() => { window.removeEventListener("mjr-settings-changed", $e); }), Tr(() => { let e = He.value; @@ -4088,7 +4088,7 @@ var ys = vs(), bs = ["title"], xs = /* @__PURE__ */ fr({ }); } return (t, n) => { - let r = or("MButton"); + let r = ar("MButton"); return q(), X(H, null, [ U("div", { class: Dr(["mjr-thumb", { "mjr-thumb-workflow": g.value }]), @@ -4099,8 +4099,8 @@ var ys = vs(), bs = ["title"], xs = /* @__PURE__ */ fr({ g.value ? (q(), X(H, { key: 1 }, [ U("div", { class: "mjr-workflow-card-actions", - onClick: n[1] ||= hr(() => {}, ["stop"]), - onDblclick: n[2] ||= hr(() => {}, ["stop"]) + onClick: n[1] ||= mr(() => {}, ["stop"]), + onDblclick: n[2] ||= mr(() => {}, ["stop"]) }, [U("button", { type: "button", class: Dr(["mjr-workflow-action-btn", { "is-active": _e.value }]), @@ -4162,9 +4162,9 @@ var ys = vs(), bs = ["title"], xs = /* @__PURE__ */ fr({ alt: "" }, null, 8, Rs)) : G("", !0), U("div", { class: Dr(["mjr-audio-thumb", { "has-poster": k.value }]) }, [ U("div", zs, [n[18] ||= U("span", { class: "mjr-audio-thumb-icon" }, [U("i", { class: "pi pi-volume-up" })], -1), U("span", Bs, J(M.value || "AUDIO"), 1)]), - U("div", Vs, [(q(!0), X(H, null, gr(ee.value, (e, t) => (q(), X("span", { + U("div", Vs, [(q(!0), X(H, null, hr(ee.value, (e, t) => (q(), X("span", { key: t, - style: Sr({ + style: xr({ height: `${e.height}%`, opacity: e.opacity }) @@ -4185,7 +4185,7 @@ var ys = vs(), bs = ["title"], xs = /* @__PURE__ */ fr({ class: "mjr-file-badge mjr-badge-ext", "data-mjr-ext": M.value, "data-mjr-badge-bg": Oe.value, - style: Sr({ + style: xr({ position: "absolute", top: "6px", left: "6px", @@ -4261,9 +4261,9 @@ var ys = vs(), bs = ["title"], xs = /* @__PURE__ */ fr({ class: "mjr-meta-workflow-missing", title: Se.value }, J(Se.value), 9, ic)) : G("", !0) - ], 64)) : G("", !0), (q(!0), X(H, null, gr(Ee.value, (e, t) => (q(), X(H, { key: e.key }, [t > 0 ? (q(), X("span", ac, "/")) : G("", !0), U("span", { + ], 64)) : G("", !0), (q(!0), X(H, null, hr(Ee.value, (e, t) => (q(), X(H, { key: e.key }, [t > 0 ? (q(), X("span", ac, "/")) : G("", !0), U("span", { class: Dr(e.className), - style: Sr(e.style || null), + style: xr(e.style || null), title: e.title }, J(e.text), 15, oc)], 64))), 128))]), U("div", { @@ -4278,7 +4278,7 @@ var ys = vs(), bs = ["title"], xs = /* @__PURE__ */ fr({ } }, null, 512) ], 8, $s), - Ae.value ? (q(), ar(r, { + Ae.value ? (q(), ir(r, { key: 0, type: "button", class: "mjr-stack-group-button", @@ -4290,12 +4290,12 @@ var ys = vs(), bs = ["title"], xs = /* @__PURE__ */ fr({ "aria-label": `Open generation group in grid (${je.value} assets)`, title: `Open generation group in grid (${je.value} assets)`, onClick: Le, - onPointerdown: n[3] ||= hr(() => {}, ["stop"]), - onMousedown: n[4] ||= hr(() => {}, ["stop", "prevent"]), - onTouchstartPassive: n[5] ||= hr(() => {}, ["stop"]), - onDblclick: n[6] ||= hr(() => {}, ["stop"]), - onKeydown: n[7] ||= hr(() => {}, ["stop"]), - onDragstart: n[8] ||= hr(() => {}, ["stop", "prevent"]) + onPointerdown: n[3] ||= mr(() => {}, ["stop"]), + onMousedown: n[4] ||= mr(() => {}, ["stop", "prevent"]), + onTouchstartPassive: n[5] ||= mr(() => {}, ["stop"]), + onDblclick: n[6] ||= mr(() => {}, ["stop"]), + onKeydown: n[7] ||= mr(() => {}, ["stop"]), + onDragstart: n[8] ||= mr(() => {}, ["stop", "prevent"]) }, { default: W(() => [n[21] ||= U("span", { class: "pi pi-clone" }, null, -1), U("span", sc, J(je.value), 1)]), _: 1 @@ -4305,7 +4305,7 @@ var ys = vs(), bs = ["title"], xs = /* @__PURE__ */ fr({ "aria-label", "title" ])) : G("", !0), - Pe.value ? (q(), ar(r, { + Pe.value ? (q(), ir(r, { key: 1, type: "button", class: "mjr-dup-stack-button", @@ -4317,12 +4317,12 @@ var ys = vs(), bs = ["title"], xs = /* @__PURE__ */ fr({ "aria-label": `${Ne.value} duplicate${Ne.value > 1 ? "s" : ""} - click to compare all copies`, title: `${Ne.value} duplicate${Ne.value > 1 ? "s" : ""} - click to compare all copies`, onClick: Re, - onPointerdown: n[9] ||= hr(() => {}, ["stop"]), - onMousedown: n[10] ||= hr(() => {}, ["stop", "prevent"]), - onTouchstartPassive: n[11] ||= hr(() => {}, ["stop"]), - onDblclick: n[12] ||= hr(() => {}, ["stop"]), - onKeydown: n[13] ||= hr(() => {}, ["stop"]), - onDragstart: n[14] ||= hr(() => {}, ["stop", "prevent"]) + onPointerdown: n[9] ||= mr(() => {}, ["stop"]), + onMousedown: n[10] ||= mr(() => {}, ["stop", "prevent"]), + onTouchstartPassive: n[11] ||= mr(() => {}, ["stop"]), + onDblclick: n[12] ||= mr(() => {}, ["stop"]), + onKeydown: n[13] ||= mr(() => {}, ["stop"]), + onDragstart: n[14] ||= mr(() => {}, ["stop", "prevent"]) }, { default: W(() => [n[22] ||= U("span", { class: "pi pi-copy" }, null, -1), U("span", cc, J(Ne.value), 1)]), _: 1 @@ -4351,7 +4351,7 @@ var ys = vs(), bs = ["title"], xs = /* @__PURE__ */ fr({ let n = e.__vccOpts || e; for (let [e, r] of t) n[e] = r; return n; -})(/* @__PURE__ */ fr({ +})(/* @__PURE__ */ dr({ __name: "FolderCard", props: { asset: {}, @@ -4388,9 +4388,9 @@ var ys = vs(), bs = ["title"], xs = /* @__PURE__ */ fr({ role: "button", tabindex: 0, draggable: "true", - onDragover: hr(a, ["prevent"]), + onDragover: mr(a, ["prevent"]), onDragleave: o, - onDrop: hr(s, ["stop", "prevent"]), + onDrop: mr(s, ["stop", "prevent"]), "data-mjr-asset-id": String(e.asset.id ?? ""), "data-mjr-filename-key": String(e.asset.filename || "").toLowerCase(), "data-mjr-ext": "FOLDER", @@ -4433,7 +4433,7 @@ function mc(e) { return Array.from(e || []).map((e) => String(e || "").trim()).filter(Boolean); } function hc() { - let e = Cr({ + let e = Sr({ query: "*", offset: 0, cursor: null, @@ -5043,7 +5043,7 @@ async function bl({ fetchPage: e, applyPage: t, getLimit: n, canContinue: r = nu }; } function xl({ query: e, collection: t, fetchPage: n, pageSize: r = 80, getPageSize: i = null } = {}) { - let a = wr({ + let a = Cr({ offset: 0, cursor: null, total: null, @@ -5387,22 +5387,12 @@ function Pl(e, t) { ].some((t) => Object.prototype.hasOwnProperty.call(e, t)); } function Fl(e, t) { - let n = /* @__PURE__ */ new Set(), r = /* @__PURE__ */ new Set(), i = /* @__PURE__ */ new Map(), a = []; + let n = /* @__PURE__ */ new Set(), r = /* @__PURE__ */ new Set(), i = [], a = !1; for (let o of Array.isArray(e?.assets) ? e.assets : []) { - let e = o?.id == null ? "" : String(o.id), s = t.assetKey(o), c = jt(o?.filename); - if (!(e && n.has(e)) && !(s && r.has(s))) { - if (c) { - let e = i.get(c); - if (e) { - let t = Array.isArray(e._mjrDupMembers) ? e._mjrDupMembers : [e], n = new Set(t.map((e) => String(e?.id || ""))), r = [...t, ...[o].filter((e) => !n.has(String(e?.id || "")))]; - e._mjrDupStack = !0, e._mjrDupMembers = r, e._mjrDupCount = r.length, e._mjrNameCollision = !1, delete e._mjrNameCollisionCount, delete e._mjrNameCollisionPaths, o._mjrNameCollision = !1, delete o._mjrNameCollisionCount, delete o._mjrNameCollisionPaths, o._mjrDupStack = !1, o._mjrDupMembers = null, o._mjrDupCount = 0; - continue; - } - } - e && n.add(e), s && r.add(s), c && i.set(c, o), o._mjrNameCollision = !1, delete o._mjrNameCollisionCount, delete o._mjrNameCollisionPaths, a.push(o); - } + let e = o?.id == null ? "" : String(o.id), s = t.assetKey(o); + e && n.has(e) || s && r.has(s) ? a = !0 : (e && n.add(e), s && r.add(s), i.push(o)); } - e.assets = a, _l(e, { assetKey: t.assetKey }); + a && (e.assets = i), _l(e, { assetKey: t.assetKey }); } function Il(e, t) { let n = t.upsertState.get(e); @@ -5416,12 +5406,12 @@ function Il(e, t) { for (let [a, o] of r.entries()) { let r = Al(o); i.assetKeyFn = t.assetKey; - let s = Ct(o, i, t.loadMajoorSettings); + let s = Ft(o, i, t.loadMajoorSettings); if (Array.isArray(s?.removed) && s.removed.length) { let e = new Set(s.removed); i.assets = i.assets.filter((t) => { let n = !e.has(t); - return n || Pt(i, t, i), n; + return n || St(i, t, i), n; }); try { i.hiddenPngSiblings = (Number(i.hiddenPngSiblings || 0) || 0) + s.removed.length; @@ -5452,7 +5442,7 @@ function Il(e, t) { continue; } let [e] = i.assets.splice(d, 1); - Pt(i, e, i), n = !0; + St(i, e, i), n = !0; } } else if (d > -1) { let e = t.assetKey(f); @@ -5576,7 +5566,7 @@ function Ql(e) { return e ? typeof e == "object" && "value" in e ? e.value || null : e : null; } async function $l() { - await ur(); + await lr(); } function eu(e, t) { let n = String(e || "Failed to load"); @@ -5853,7 +5843,7 @@ function au({ gridContainerRef: e, state: t, setLoadingMessage: n, clearLoadingM } function F() { try { - let e = Hn?.() || {}, t = e.grid || {}; + let e = Vn?.() || {}, t = e.grid || {}; return t.snapshotCacheEnabled === !0 || t.enableSnapshotCache === !0 || e.snapshotCacheEnabled === !0 || e.enableSnapshotCache === !0; } catch (e) { return console.debug?.(e), !1; @@ -5895,12 +5885,12 @@ function au({ gridContainerRef: e, state: t, setLoadingMessage: n, clearLoadingM } function ie(e, n) { let r = _(), i = Array.isArray(n) ? n.length : 0, o = Et(e, n, t, { - loadMajoorSettings: Hn, + loadMajoorSettings: Vn, clearGridMessage: () => { a(); }, ensureVirtualGrid: () => t.virtualGrid, - setFileBadgeCollision: wt, + setFileBadgeCollision: Ct, assetKey: (t) => te(t, e), ensureDupStackCard: (e, t, n) => $a(e, t, n) }); @@ -6507,7 +6497,7 @@ function au({ gridContainerRef: e, state: t, setLoadingMessage: n, clearLoadingM maxBatchSize: Wl, debounceMs: Ul, assetKey: (t) => Yl(t) || te(t, e), - loadMajoorSettings: Hn + loadMajoorSettings: Vn }; } function De(e) { @@ -7296,17 +7286,17 @@ function Ou(e, t, n, r, i) { } // node_modules/@tanstack/vue-virtual/dist/esm/index.js function ku(e) { - let t = new Tu(Z(e)), n = yr(t), r = t._didMount(); - return lr(() => Z(e).getScrollElement(), (e) => { + let t = new Tu(Z(e)), n = vr(t), r = t._didMount(); + return cr(() => Z(e).getScrollElement(), (e) => { e && t._willUpdate(); - }, { immediate: !0 }), lr(() => Z(e), (e) => { + }, { immediate: !0 }), cr(() => Z(e), (e) => { t.setOptions({ ...e, onChange: (t, r) => { var i; - xr(n), (i = e.onChange) == null || i.call(e, t, r); + br(n), (i = e.onChange) == null || i.call(e, t, r); } - }), t._willUpdate(), xr(n); + }), t._willUpdate(), br(n); }, { immediate: !0 }), Er(r), n; } function Au(e) { @@ -7416,7 +7406,7 @@ function Iu({ rootRef: e, enabled: t = !0, canLoad: n = !0, loadMore: r, rootMar threshold: a }), s.observe(t)); } - return pr() && (Mr(d), mr(l), lr(() => [Z(e), o.value], () => d(), { flush: "post" })), { + return fr() && (Mr(d), pr(l), cr(() => [Z(e), o.value], () => d(), { flush: "post" })), { sentinelRef: o, connect: d, disconnect: l, @@ -7424,36 +7414,77 @@ function Iu({ rootRef: e, enabled: t = !0, canLoad: n = !0, loadMore: r, rootMar }; } // ui/vue/grid/useGridDisplayAssets.ts -function Lu(e) { +var Lu = ["_mjrNameCollisionCount", "_mjrNameCollisionPaths"]; +function Ru(e) { let t = jt(e?.filename); return t ? `${String(e?.source || e?.type || "").trim().toLowerCase()}|${String(e?.root_id || e?.custom_root_id || "").trim().toLowerCase()}|${String(e?.subfolder || "").trim().toLowerCase()}|${t}` : ""; } -function Ru(e) { +function zu(e) { return !!e; } -function zu(e) { - let t = Array.isArray(e) ? e : [], n = /* @__PURE__ */ new Map(), r = []; - for (let e of t) { +function Bu(e, t, n) { + wr(e)?.[t] !== n && (e[t] = n); +} +function Vu(e, t) { + let n = wr(e); + n && Object.prototype.hasOwnProperty.call(n, t) && delete e[t]; +} +function Hu(e, t) { + if (!Array.isArray(e) || e.length !== t.length) return !1; + for (let n = 0; n < t.length; n++) if (wr(e[n]) !== wr(t[n])) return !1; + return !0; +} +function Uu(e) { + Bu(e, "_mjrNameCollision", !1); + for (let t of Lu) Vu(e, t); + Bu(e, "_mjrDupStack", !1), Bu(e, "_mjrDupMembers", null), Bu(e, "_mjrDupCount", 0); +} +function Wu(e, t) { + for (let t of Lu) Vu(e, t); + Bu(e, "_mjrNameCollision", !1), Bu(e, "_mjrDupStack", !0), Hu(wr(e)?._mjrDupMembers, t) || (e._mjrDupMembers = t.slice()), Bu(e, "_mjrDupCount", t.length), qt(e, t); +} +function Gu(e, { collapseDuplicates: t = !0 } = {}) { + let n = Array.isArray(e) ? e : []; + if (!t) { + let e = []; + for (let t of n) t && (Uu(t), e.push(t)); + return e; + } + let r = /* @__PURE__ */ new Map(), i = []; + for (let e of n) { if (!e) continue; - let t = Lu(e); + let t = Ru(e); if (!t) { - e._mjrNameCollision = !1, delete e._mjrNameCollisionCount, delete e._mjrNameCollisionPaths, e._mjrDupStack = !1, e._mjrDupMembers = null, e._mjrDupCount = 0, r.push(e); + Uu(e), i.push(e); continue; } - let i = n.get(t); - i || (i = [], n.set(t, i), r.push(e)), i.push(e); + let n = r.get(t); + n || (n = [], r.set(t, n), i.push(e)), n.push(e); } - for (let e of n.values()) { - for (let t of e) t._mjrNameCollision = !1, delete t._mjrNameCollisionCount, delete t._mjrNameCollisionPaths, t._mjrDupStack = !1, t._mjrDupMembers = null, t._mjrDupCount = 0; - if (e.length >= 2) { - let t = e[0]; - t._mjrDupStack = !0, t._mjrDupMembers = e.slice(), t._mjrDupCount = e.length; + for (let e of r.values()) { + let t = e[0]; + for (let n of e) (n !== t || e.length < 2) && Uu(n); + e.length >= 2 && Wu(t, e); + } + return i; +} +function Ku(e) { + let t = Array.isArray(e) ? e : [], n = [], r = /* @__PURE__ */ new Set(); + for (let e of t) { + if (!e || typeof e != "object") continue; + let t = { ...wr(e) }; + delete t._mjrDupMembers, delete t._mjrDupStack, delete t._mjrDupCount, delete t._mjrDupHidden, delete t._mjrNameCollision, delete t._mjrNameCollisionCount, delete t._mjrNameCollisionPaths; + let i = String(t.id ?? ""); + if (i) { + if (r.has(i)) continue; + r.add(i); } + n.push(t); } - return r; + return n; } // ui/vue/components/grid/VirtualAssetGridHost.vue?vue&type=script&setup=true&lang.ts -var Bu = { +var qu = { key: 0, class: "mjr-grid-loading-overlay", style: { @@ -7468,19 +7499,19 @@ var Bu = { background: "rgba(20,22,28,0.55)", "backdrop-filter": "blur(2px)" } -}, Vu = { style: { width: "100%" } }, Hu = { style: { +}, Ju = { style: { width: "100%" } }, Yu = { style: { "margin-top": "10px", "font-size": "12px", opacity: "0.68", "text-align": "center" -} }, Uu = ["data-index"], Wu = [ +} }, Xu = ["data-index"], Zu = [ "aria-expanded", "title", "onClick" -], Gu = { +], Qu = { class: "mjr-grid-group-separator-chevron", "aria-hidden": "true" -}, Ku = { class: "mjr-grid-group-separator-title" }, qu = [ +}, $u = { class: "mjr-grid-group-separator-title" }, ed = [ "data-mjr-asset-id", "data-mjr-filename-key", "data-mjr-ext", @@ -7496,21 +7527,21 @@ var Bu = { "onMousedown", "onClick", "onDblclick" -], Ju = { +], td = { key: 3, style: { display: "flex", "flex-direction": "column", width: "100%" } -}, Yu = [ +}, nd = [ "aria-expanded", "title", "onClick" -], Xu = { +], rd = { class: "mjr-grid-group-separator-chevron", "aria-hidden": "true" -}, Zu = { class: "mjr-grid-group-separator-title" }, Qu = [ +}, id = { class: "mjr-grid-group-separator-title" }, ad = [ "data-mjr-asset-id", "data-mjr-filename-key", "data-mjr-ext", @@ -7526,7 +7557,7 @@ var Bu = { "onMousedown", "onClick", "onDblclick" -], $u = 501, ed = /* @__PURE__ */ fr({ +], od = 501, sd = /* @__PURE__ */ dr({ __name: "VirtualAssetGridHost", props: { scrollElement: { default: null }, @@ -7556,10 +7587,10 @@ var Bu = { Q(!0); let s = Q(0), c = Q(0), l = /* @__PURE__ */ new WeakMap(), u = 0, d = 0, f = 0, p = 0, m = 0, h = /* @__PURE__ */ new Map(), g = null, _ = null; function v() { - return g ||= import("./chunks/viewerOpenRequest-B8IT-KHd.js").then((e) => e.n), g; + return g ||= import("./chunks/viewerOpenRequest-DaR0P9Y2.js").then((e) => e.n), g; } function b() { - return _ ||= import("./chunks/floatingViewerManager-DI520cRz.js").then((e) => e.n), _; + return _ ||= import("./chunks/floatingViewerManager-B_1xQj1m.js").then((e) => e.n), _; } function x(e) { return (Array.isArray(e) ? e : []).slice().sort((e, t) => { @@ -7567,7 +7598,7 @@ var Bu = { return (Number(t?.mtime || t?.created_at || 0) || 0) - n; }); } - sr("mjrStackService", { + or("mjrStackService", { openStackGroup: async (e) => { let t = i.value; if (!t || !e) return; @@ -7578,7 +7609,7 @@ var Bu = { let a = t._mjrStackMembersCache.get(r); if (!Array.isArray(a)) { let e = h.get(r); - e || (e = re(rt(n, { limit: $u }), { timeoutMs: 3e4 }).finally(() => { + e || (e = re(rt(n, { limit: od }), { timeoutMs: 3e4 }).finally(() => { h.delete(r); }), h.set(r, e)); let i = await e; @@ -7599,7 +7630,7 @@ var Bu = { openDupGroup: (e) => { let t = i.value; if (!t || !e) return; - let n = Array.isArray(e._mjrDupMembers) ? e._mjrDupMembers : [e]; + let n = Ku(Array.isArray(e._mjrDupMembers) ? e._mjrDupMembers : [e]); t.dispatchEvent(new CustomEvent(V.OPEN_STACK_GROUP, { bubbles: !0, detail: { @@ -7622,12 +7653,12 @@ var Bu = { function te(e, { align: t = "auto" } = {}) { let n = String(e || "").trim(); if (!n) return; - let i = (Array.isArray(be.value) ? be.value : []).findIndex((e) => String(e?.id || "") === n); + let i = (Array.isArray(xe.value) ? xe.value : []).findIndex((e) => String(e?.id || "") === n); if (!(i < 0)) { if (r.virtualize) { - let e = Math.floor(i / Math.max(1, ze.value)); + let e = Math.floor(i / Math.max(1, Be.value)); try { - Ye.value.scrollToIndex(e, { align: t }); + Xe.value.scrollToIndex(e, { align: t }); } catch (e) { console.debug?.(e); } @@ -7683,7 +7714,7 @@ var Bu = { return String(e?.kind || "").toLowerCase() === "workflow"; } function le() { - return String(Se.value || "").trim().toLowerCase() === "workflow"; + return String(Ce.value || "").trim().toLowerCase() === "workflow"; } function ue(e) { let t = String(e || "none").trim().toLowerCase(); @@ -7751,7 +7782,7 @@ var Bu = { let e = i.value; if (!e) return; let t = new Set((Array.isArray(S.selectedIds) ? S.selectedIds : []).map((e) => String(e || "").trim()).filter(Boolean)); - er(e, t, S.activeId || ""); + $n(e, t, S.activeId || ""); try { t.size ? e.dataset.mjrSelectedAssetId = String(S.activeId || Array.from(t)[0] || "") : delete e.dataset.mjrSelectedAssetId; } catch (e) { @@ -7781,57 +7812,57 @@ var Bu = { } } ve._lastSelectionKey = ""; - let ye = K(() => zu(S.assets)), be = K(() => (Array.isArray(ye.value) ? ye.value : []).filter((e) => Ru(e))), xe = Q(/* @__PURE__ */ new Set()), Se = Q(""), Ce = K(() => { + let ye = Q(""), be = K(() => Gu(S.assets, { collapseDuplicates: ye.value !== "similar" })), xe = K(() => (Array.isArray(be.value) ? be.value : []).filter((e) => zu(e))), Se = Q(/* @__PURE__ */ new Set()), Ce = Q(""), we = K(() => { s.value; let e = ue(B.WORKFLOW_GRID_GROUP_BY); - return e === "none" || Se.value !== "workflow" ? "none" : e; - }), we = K(() => { - let e = Array.isArray(be.value) ? be.value : []; + return e === "none" || Ce.value !== "workflow" ? "none" : e; + }), Te = K(() => { + let e = Array.isArray(xe.value) ? xe.value : []; if (!e.length) return []; - let t = Ce.value; - return t === "none" ? [] : me(e, ze.value, t); + let t = we.value; + return t === "none" ? [] : me(e, Be.value, t); }); - lr(() => `${Ce.value}::${we.value.map((e) => `${e.kind}:${e.groupKey}`).join("|")}`, () => { - if (Ce.value === "none") { - xe.value = /* @__PURE__ */ new Set(); + cr(() => `${we.value}::${Te.value.map((e) => `${e.kind}:${e.groupKey}`).join("|")}`, () => { + if (we.value === "none") { + Se.value = /* @__PURE__ */ new Set(); return; } - let e = /* @__PURE__ */ new Set(), t = xe.value; - for (let n of we.value) { + let e = /* @__PURE__ */ new Set(), t = Se.value; + for (let n of Te.value) { if (n?.kind !== "header") continue; let r = String(n.groupKey || ""); r && t.has(r) && e.add(r); } - xe.value = e; + Se.value = e; }, { immediate: !0 }); - function Te(e) { - let t = String(e || ""); - return t ? xe.value.has(t) : !1; - } function Ee(e) { let t = String(e || ""); - if (!t) return; - let n = new Set(xe.value); - n.has(t) ? n.delete(t) : n.add(t), xe.value = n; + return t ? Se.value.has(t) : !1; } function De(e) { + let t = String(e || ""); + if (!t) return; + let n = new Set(Se.value); + n.has(t) ? n.delete(t) : n.add(t), Se.value = n; + } + function Oe(e) { let t = String(e?.groupKey || e?.title || ""), n = 0; for (let e = 0; e < t.length; e += 1) n = (n << 5) - n + t.charCodeAt(e) | 0; return `mjr-grid-group-separator--accent-${Math.abs(n) % 8}`; } - let Oe = K(() => { - let e = Array.isArray(be.value) ? be.value : []; + let Ae = K(() => { + let e = Array.isArray(xe.value) ? xe.value : []; if (!e.length) return []; - if (Ce.value === "none") return Mu(e, ze.value); - let t = Array.isArray(we.value) ? we.value : [], n = []; - for (let e of t) e?.kind === "header" ? n.push(e) : Te(String(e?.groupKey || "")) || n.push(e); + if (we.value === "none") return Mu(e, Be.value); + let t = Array.isArray(Te.value) ? Te.value : [], n = []; + for (let e of t) e?.kind === "header" ? n.push(e) : Ee(String(e?.groupKey || "")) || n.push(e); return n; }); - function Ae() { + function je() { let e = i.value; if (!e) return; let t = { - count: Array.isArray(be.value) ? be.value.length : 0, + count: Array.isArray(xe.value) ? xe.value.length : 0, total: Number(S.total || 0) || 0 }; try { @@ -7845,7 +7876,7 @@ var Bu = { console.debug?.(e); } } - function je(e) { + function Me(e) { if (!e?.id) return; let t = (Array.isArray(S.assets) ? S.assets : []).find((t) => String(t?.id || "") === String(e.id)); if (t) try { @@ -7854,27 +7885,27 @@ var Bu = { console.debug?.(e); } } - function Me() { + function Ne() { try { window.dispatchEvent(new CustomEvent("mjr:open-sidebar", { detail: { tab: "details" } })); } catch (e) { console.debug?.(e); } } - function Ne(e, t = 6) { + function Fe(e, t = 6) { let n = S.cardElements.get(e); if (n) try { n.focus?.({ preventScroll: !0 }); } catch (e) { console.debug?.(e); } - else t <= 0 || requestAnimationFrame(() => Ne(e, t - 1)); - } - function Fe(e) { - let t = e?.detail || {}, n = String(t.assetId ?? t.id ?? "").trim(); - n && (Array.isArray(be.value) ? be.value : []).some((e) => String(e?.id || "") === n) && (k([n], n), _e(), ve(), te(n, { align: "center" }), setTimeout(() => Ne(n), 0)); + else t <= 0 || requestAnimationFrame(() => Fe(e, t - 1)); } function Ie(e) { + let t = e?.detail || {}, n = String(t.assetId ?? t.id ?? "").trim(); + n && (Array.isArray(xe.value) ? xe.value : []).some((e) => String(e?.id || "") === n) && (k([n], n), _e(), ve(), te(n, { align: "center" }), setTimeout(() => Fe(n), 0)); + } + function Re(e) { if (!e) return; e._mjrSelectionManagedByVue = !0; try { @@ -7883,27 +7914,27 @@ var Bu = { console.debug?.(e); } try { - pt?.(); + mt?.(); } catch (e) { console.debug?.(e); } hi(e, { applySettingsClasses: r.applyDefaultSettingsClasses }); try { - pt = ns(e); + mt = ns(e); } catch (e) { - console.debug?.(e), pt = null; + console.debug?.(e), mt = null; } - e._mjrPrimaryPointerSelectionUnbind = () => {}, e._mjrGetAssets = () => Array.isArray(be.value) ? be.value : [], e._mjrSetSelection = (e, t = "") => { + e._mjrPrimaryPointerSelectionUnbind = () => {}, e._mjrGetAssets = () => Array.isArray(xe.value) ? xe.value : [], e._mjrSetSelection = (e, t = "") => { let n = k(e, t); return _e(), ve(), n.selectedIds; }; let t = (e, t = {}) => { let n = I.removeAssets(e, t); - return Ae(), n; + return je(), n; }; e._mjrRemoveAssets = t, e._mjrGetRenderedCards = () => ee(), e._mjrScrollToAssetId = (e, t = {}) => { te(e, t); - }, e._mjrHasAssetId = (e) => (Array.isArray(S.assets) ? S.assets : []).some((t) => String(t?.id || "") === String(e || "")), e._mjrGetGridState = () => S, e._mjrGetSelectedAssets = () => j(), e._mjrGetActiveAsset = () => M(), e._mjrOnKeyboardAssetChanged = (e) => je(e), e._mjrOpenKeyboardDetails = () => Me(); + }, e._mjrHasAssetId = (e) => (Array.isArray(S.assets) ? S.assets : []).some((t) => String(t?.id || "") === String(e || "")), e._mjrGetGridState = () => S, e._mjrGetSelectedAssets = () => j(), e._mjrGetActiveAsset = () => M(), e._mjrOnKeyboardAssetChanged = (e) => Me(e), e._mjrOpenKeyboardDetails = () => Ne(); let n = () => (r.applyDefaultSettingsClasses && (mi(e), s.value += 1), I.refreshGrid()), i = () => { I.prepareGridForScopeSwitch(), I.dispose(), S.cardElements.clear(), e._mjrGridApi = null; }; @@ -7925,38 +7956,38 @@ var Bu = { getDebugSnapshot: () => I.getDebugSnapshot() }, e._mjrLoadAssets = (...e) => I.loadAssets(...e), e._mjrLoadAssetsFromList = (...e) => I.loadAssetsFromList(...e), e._mjrPrepareForScopeSwitch = () => I.prepareGridForScopeSwitch(), e._mjrRefreshGrid = n, e._mjrCaptureAnchor = () => I.captureAnchor(), e._mjrRestoreAnchor = (e) => I.restoreAnchor(e), e._mjrHydrateFromSnapshot = (...e) => I.hydrateFromSnapshot(...e), e._mjrUpsertAsset = (e) => I.upsertAsset(e), e._mjrUpsertAssetNow = (e) => I.upsertAssetNow(e), e._mjrGetCanonicalState = () => I.getCanonicalState(), e._mjrGetDebugSnapshot = () => I.getDebugSnapshot(), e._mjrDispose = i; } - lr(i, (e) => { - e && (Ie(e), _e(), Ae()); - }, { immediate: !0 }), lr(() => `${(S.selectedIds || []).join("|")}::${String(S.activeId || "")}`, () => { + cr(i, (e) => { + e && (Re(e), _e(), je()); + }, { immediate: !0 }), cr(() => `${(S.selectedIds || []).join("|")}::${String(S.activeId || "")}`, () => { i.value && (_e(), ve()); - }, { flush: "post" }), lr(() => `${Array.isArray(be.value) ? be.value.length : 0}::${Number(S.total || 0)}::${Number(S.hiddenPngSiblings || 0)}`, () => { - i.value && Ae(); + }, { flush: "post" }), cr(() => `${Array.isArray(xe.value) ? xe.value.length : 0}::${Number(S.total || 0)}::${Number(S.hiddenPngSiblings || 0)}`, () => { + i.value && je(); }, { flush: "post", immediate: !0 }); - function Re() { + function ze() { let e = i.value, t = String(e?.dataset?.mjrBottomFeed || "").toLowerCase() === "true", n = Number(B.GRID_MIN_SIZE || 120) || 120; return t ? Math.max(80, Number(B.FEED_GRID_MIN_SIZE || n) || n) : le() ? Math.max(180, n) : Math.max(80, n); } - let ze = K(() => { + let Be = K(() => { s.value; - let e = Math.max(0, Number(B.GRID_GAP || 10) || 10), t = Re(), n = Number(o.value || 0) || Number(P.value?.clientWidth || 0) || 0; + let e = Math.max(0, Number(B.GRID_GAP || 10) || 10), t = ze(), n = Number(o.value || 0) || Number(P.value?.clientWidth || 0) || 0; return n <= 0 ? 1 : Math.max(1, Math.floor((n + e) / (t + e))); - }), Be = K(() => (Number(o.value || 0) || Number(P.value?.clientWidth || 0) || 0) > 0), Ve = K(() => (s.value, Math.max(0, Number(B.GRID_GAP || 10) || 10))), He = K(() => { - let e = Math.max(1, ze.value), t = Number(o.value || 0) || Number(P.value?.clientWidth || 0) || 0; - return t <= 0 ? Re() : Math.max(80, Math.floor((t - Ve.value * Math.max(0, e - 1)) / e)); - }), Ue = K(() => { + }), Ve = K(() => (Number(o.value || 0) || Number(P.value?.clientWidth || 0) || 0) > 0), He = K(() => (s.value, Math.max(0, Number(B.GRID_GAP || 10) || 10))), Ue = K(() => { + let e = Math.max(1, Be.value), t = Number(o.value || 0) || Number(P.value?.clientWidth || 0) || 0; + return t <= 0 ? ze() : Math.max(80, Math.floor((t - He.value * Math.max(0, e - 1)) / e)); + }), We = K(() => { s.value; - let e = !!B.GRID_SHOW_DETAILS, t = He.value, n = e ? 82 : 0; - return Ce.value === "none" ? t + n + Ve.value : Math.max(48, t + n + Ve.value); - }), We = K(() => r.virtualize ? [] : Array.isArray(Oe.value) ? Oe.value : []); - function Ge(e) { + let e = !!B.GRID_SHOW_DETAILS, t = Ue.value, n = e ? 82 : 0; + return we.value === "none" ? t + n + He.value : Math.max(48, t + n + He.value); + }), Ge = K(() => r.virtualize ? [] : Array.isArray(Ae.value) ? Ae.value : []); + function Ke(e) { if (!d) try { d = requestAnimationFrame(() => { d = 0; try { - let t = typeof performance < "u" && typeof performance.now == "function" ? performance.now() : Date.now(), n = Number(e?.scrollTop || 0) || 0, r = Math.max(16, t - Number(m || t)), i = Math.abs(n - Number(p || n)) / Math.max(1, Ue.value) * (16 / r); + let t = typeof performance < "u" && typeof performance.now == "function" ? performance.now() : Date.now(), n = Number(e?.scrollTop || 0) || 0, r = Math.max(16, t - Number(m || t)), i = Math.abs(n - Number(p || n)) / Math.max(1, We.value) * (16 / r); c.value = Math.max(0, Math.min(20, i)), p = n, m = t, f && clearTimeout(f), f = setTimeout(() => { f = 0, c.value = 0; }, 140); @@ -7968,7 +7999,7 @@ var Bu = { console.debug?.(e), d = 0; } } - function Ke() { + function qe() { if (d) { try { cancelAnimationFrame(d); @@ -7987,52 +8018,52 @@ var Bu = { } c.value = 0; } - let qe = Pu({ + let Je = Pu({ scrollRef: P, - items: be, - rows: Oe, - columnCount: ze, - estimateRowHeight: Ue, + items: xe, + rows: Ae, + columnCount: Be, + estimateRowHeight: We, overscan: K(() => { - let e = Math.max(1, Ue.value), t = P.value?.clientHeight || 0; + let e = Math.max(1, We.value), t = P.value?.clientHeight || 0; if (t <= 0) return 6; let n = Math.ceil(t / e), r = Math.ceil(c.value * 3); return Math.max(3, Math.min(30, n + r)); }), enabled: K(() => r.virtualize) - }), Je = qe.rowCount, Ye = qe.virtualizer, Xe = qe.virtualRows, Ze = qe.totalSize, $e = K(() => { + }), Ye = Je.rowCount, Xe = Je.virtualizer, Ze = Je.virtualRows, $e = Je.totalSize, et = K(() => { let e = /* @__PURE__ */ new Map(); - for (let t of Xe.value) e.set(t.index, t.virtual || t); + for (let t of Ze.value) e.set(t.index, t.virtual || t); return e; - }), et = K(() => (s.value, !!B.GRID_SHOW_DETAILS)), z = K(() => { - let e = Math.max(1, Number(ze.value || 1)); + }), z = K(() => (s.value, !!B.GRID_SHOW_DETAILS)), tt = K(() => { + let e = Math.max(1, Number(Be.value || 1)); return Math.max(12, Math.min(36, e * 4)); - }), tt = K(() => Array.from({ length: Number(z.value || 12) }, (e, t) => t)), nt = K(() => { - let e = Math.max(80, Number(Ue.value || 0) - Number(Ve.value || 0)), t = Math.max(80, Number(He.value || 0)); + }), nt = K(() => Array.from({ length: Number(tt.value || 12) }, (e, t) => t)), it = K(() => { + let e = Math.max(80, Number(We.value || 0) - Number(He.value || 0)), t = Math.max(80, Number(Ue.value || 0)); return Math.max(0, e - t); - }), it = K(() => ({ + }), at = K(() => ({ display: "grid", - gridTemplateColumns: `repeat(${Math.max(1, Number(ze.value || 1))}, minmax(0, ${Math.max(80, Number(He.value || 0))}px))`, - gap: `${Ve.value}px`, + gridTemplateColumns: `repeat(${Math.max(1, Number(Be.value || 1))}, minmax(0, ${Math.max(80, Number(Ue.value || 0))}px))`, + gap: `${He.value}px`, justifyContent: "start", boxSizing: "border-box" - })), at = K(() => ({ + })), ot = K(() => ({ width: "100%", minWidth: "0", - height: `${Math.max(80, Number(Ue.value || 0) - Number(Ve.value || 0))}px`, + height: `${Math.max(80, Number(We.value || 0) - Number(He.value || 0))}px`, borderRadius: "12px", border: "1px solid rgba(255,255,255,0.22)", background: "rgba(192,198,206,0.20)", overflow: "hidden", boxShadow: "0 6px 18px rgba(0,0,0,0.24)", boxSizing: "border-box" - })), ot = K(() => ({ + })), st = K(() => ({ width: "100%", - height: `${Math.max(80, Number(He.value || 0))}px`, + height: `${Math.max(80, Number(Ue.value || 0))}px`, background: "linear-gradient(90deg, rgba(168,174,182,0.40) 0%, rgba(220,225,232,0.54) 50%, rgba(168,174,182,0.40) 100%)", backgroundSize: "220% 100%", animation: "mjr-skeleton-shimmer 2.2s ease-in-out infinite" - })), st = K(() => ({ + })), ct = K(() => ({ height: "10px", margin: "10px 10px 6px", borderRadius: "8px", @@ -8040,7 +8071,7 @@ var Bu = { background: "linear-gradient(90deg, rgba(162,168,176,0.38) 0%, rgba(214,219,226,0.52) 50%, rgba(162,168,176,0.38) 100%)", backgroundSize: "220% 100%", animation: "mjr-skeleton-shimmer 2.2s ease-in-out infinite" - })), ct = K(() => ({ + })), lt = K(() => ({ height: "10px", margin: "0 10px 10px", borderRadius: "8px", @@ -8048,23 +8079,25 @@ var Bu = { background: "linear-gradient(90deg, rgba(160,166,173,0.34) 0%, rgba(208,214,221,0.48) 50%, rgba(160,166,173,0.34) 100%)", backgroundSize: "220% 100%", animation: "mjr-skeleton-shimmer 2.2s ease-in-out infinite" - })), lt = K(() => ({ - display: et.value ? "block" : "none", - minHeight: `${Math.max(0, Number(nt.value || 0))}px` + })), ut = K(() => ({ + display: z.value ? "block" : "none", + minHeight: `${Math.max(0, Number(it.value || 0))}px` })); - function ut() { + function dt() { let e = Number(P.value?.clientWidth || 0) || Number(i.value?.clientWidth || 0) || 0; e > 0 && (o.value = e); } - let dt = null, ft = null, pt = null, mt = !1; - function ht() { - let e = String(i.value?.dataset?.mjrScope || "").trim().toLowerCase(); - Se.value !== e && (Se.value = e); - } + let ft = null, pt = null, mt = null, ht = !1; function gt() { - zt(); + let e = String(i.value?.dataset?.mjrScope || "").trim().toLowerCase(); + Ce.value !== e && (Ce.value = e); + let t = String(i.value?.dataset?.mjrViewScope || "").trim().toLowerCase(); + ye.value !== t && (ye.value = t); + } + function _t() { + Vt(); let e = () => { - zt(), Gt(); + Vt(), Kt(); }; try { requestAnimationFrame(() => { @@ -8080,52 +8113,52 @@ var Bu = { ]) setTimeout(e, t); } Mr(() => { - gt(), window.addEventListener(V.VIEWER_ACTIVE_ASSET_CHANGED, Fe); - }), lr(i, (e) => { + _t(), window.addEventListener(V.VIEWER_ACTIVE_ASSET_CHANGED, Ie); + }), cr(i, (e) => { + try { + pt?.disconnect?.(); + } catch (e) { + console.debug?.(e); + } + if (pt = null, e) { + gt(); + try { + pt = new MutationObserver(() => { + gt(); + }), pt.observe(e, { + attributes: !0, + attributeFilter: ["data-mjr-scope", "data-mjr-view-scope"] + }); + } catch (e) { + console.debug?.(e), pt = null; + } + } + }, { immediate: !0 }), cr(P, (e, t) => { try { ft?.disconnect?.(); } catch (e) { console.debug?.(e); } - if (ft = null, e) { - ht(); + if (e) { + dt(); try { - ft = new MutationObserver(() => { - ht(); - }), ft.observe(e, { - attributes: !0, - attributeFilter: ["data-mjr-scope"] - }); + ft = new ResizeObserver(() => { + dt(); + }), ft.observe(e); } catch (e) { console.debug?.(e), ft = null; } } - }, { immediate: !0 }), lr(P, (e, t) => { - try { - dt?.disconnect?.(); - } catch (e) { - console.debug?.(e); - } - if (e) { - ut(); - try { - dt = new ResizeObserver(() => { - ut(); - }), dt.observe(e); - } catch (e) { - console.debug?.(e), dt = null; - } - } - }, { immediate: !0 }), lr(() => Je.value, async () => { - Be.value && (await ur(), bt(), Bt()); - }), lr(() => S.assets, async (e) => { + }, { immediate: !0 }), cr(() => Ye.value, async () => { + Ve.value && (await lr(), xt(), Ht()); + }), cr(() => S.assets, async (e) => { if (!Array.isArray(e) || e.length === 0) { let e = i.value; e?._mjrStackMembersCache && e._mjrStackMembersCache.clear(); } - await ur(), bt(); + await lr(), xt(); }); - function _t(e, t) { + function vt(e, t) { let n = String(t?.filename || "").trim().toLowerCase(), r = l.get(e); if (r && r !== n) { let t = S.renderedFilenameMap.get(r); @@ -8138,45 +8171,33 @@ var Bu = { let i = S.renderedFilenameMap.get(n); i || (i = /* @__PURE__ */ new Set(), S.renderedFilenameMap.set(n, i)), i.add(e), l.set(e, n); } - function vt(e) { + function yt(e) { if (!e) return; let t = l.get(e); if (!t) return; let n = S.renderedFilenameMap.get(t); n && (n.delete(e), n.size || S.renderedFilenameMap.delete(t)), l.delete(e); } - function yt(e) { + function bt(e) { let t = String(e || "").trim().toLowerCase(); if (!t) return; - let n = S.renderedFilenameMap.get(t), r = Array.from(n || []); - if (!r.length) return; - let i = (Array.isArray(S.assets) ? S.assets : []).filter((e) => String(e?.filename || "").trim().toLowerCase() === t), a = Math.max(Number(S.filenameCounts?.get?.(t) || 0) || 0, i.length), o = Ft(i), s = r.find((e) => { - let t = String(e._mjrAsset?.id || ""), n = String(o?.id || ""); - return t && n && t === n; - }) || r[0] || r[0] || null, c = s?._mjrAsset || o || i[0] || null; - Jt(c, i); - for (let e of r) { - delete e.dataset.mjrDupHidden; - let t = e._mjrAsset; - t && (t._mjrNameCollision = !1, delete t._mjrNameCollisionCount, delete t._mjrNameCollisionPaths, t._mjrDupStack = !1, t._mjrDupMembers = null, t._mjrDupCount = 0, t._mjrDupHidden = !1); - } - if (!s || !c || a < 2) for (let e of r); - else c._mjrDupStack = !0, c._mjrDupMembers = i.length ? i : [c], c._mjrDupCount = c._mjrDupMembers.length, c._mjrNameCollision = !1; + let n = S.renderedFilenameMap.get(t); + for (let e of n || []) e?.dataset?.mjrDupHidden && delete e.dataset.mjrDupHidden; } - function bt() { - for (let e of S.renderedFilenameMap.keys()) yt(e); + function xt() { + for (let e of S.renderedFilenameMap.keys()) bt(e); } - function xt(e, t) { + function St(e, t) { let n = String(e?.id || "").trim(); if (!n) return; if (!t) { let e = S.cardElements.get(n), t = e ? l.get(e) : ""; - vt(e), S.cardElements.delete(n), yt(t); + yt(e), S.cardElements.delete(n), bt(t); return; } let a = t?.$el ?? t; if (a instanceof HTMLElement) { - S.cardElements.set(n, a), a._mjrIsVue = !0, a._mjrAsset = e, a._mjrReactiveAsset = e, a.dataset.mjrKind = String(e?.kind || ""), _t(a, e), yt(String(e?.filename || "").trim().toLowerCase()); + S.cardElements.set(n, a), a._mjrIsVue = !0, a._mjrAsset = e, a._mjrReactiveAsset = e, a.dataset.mjrKind = String(e?.kind || ""), vt(a, e), bt(String(e?.filename || "").trim().toLowerCase()); try { r.onCardRendered?.(a, e, i.value); } catch (e) { @@ -8184,10 +8205,19 @@ var Bu = { } } } - function St(e) { - return (t) => xt(e, t); + let Ct = /* @__PURE__ */ new Map(); + function wt(e) { + let t = String(e?.id ?? "").trim(); + if (!t) return (t) => St(e, t); + let n = Ct.get(t); + return n || (n = { + asset: e, + fn: null + }, n.fn = (e) => { + St(n.asset, e), e || Ct.delete(t); + }, Ct.set(t, n)), n.asset = e, n.fn; } - function Ct(e, t) { + function Et(e, t) { try { let n = e?.closest?.("a, button, input, textarea, select, label"); return !!(n && t?.contains?.(n)); @@ -8195,21 +8225,21 @@ var Bu = { return !1; } } - let wt = { + let Dt = { assetId: "", at: 0 }; - function Tt(e, t) { + function Ot(e, t) { let n = String(t?.id || "").trim(); if (!n) return; if (e?.type === "click" && Number(e?.detail || 0) > 0) { - let e = Date.now() - Number(wt.at || 0); - if (wt.assetId === n && e >= 0 && e < 500) { - wt.assetId = "", wt.at = 0; + let e = Date.now() - Number(Dt.at || 0); + if (Dt.assetId === n && e >= 0 && e < 500) { + Dt.assetId = "", Dt.at = 0; return; } } - if (Ct(e?.target, e?.currentTarget)) return; + if (Et(e?.target, e?.currentTarget)) return; let r = Array.isArray(S.assets) ? S.assets : [], i = r.findIndex((e) => String(e?.id || "") === n), a = Array.isArray(S.selectedIds) ? S.selectedIds.slice() : []; if (e?.shiftKey && i >= 0) { let e = String(S.selectionAnchorId || S.activeId || n).trim(), t = r.findIndex((t) => String(t?.id || "") === e), a = t >= 0 ? t : i, o = Math.min(a, i), s = Math.max(a, i), c = r.slice(o, s + 1).map((e) => String(e?.id || "")).filter(Boolean); @@ -8226,17 +8256,17 @@ var Bu = { } catch (e) { console.debug?.(e); } - le() && ce(t) && b().then((e) => e?.floatingViewerManager?.isGraphModeVisible?.() ? kt(t) : null).catch((e) => console.debug?.(e)); + le() && ce(t) && b().then((e) => e?.floatingViewerManager?.isGraphModeVisible?.() ? Mt(t) : null).catch((e) => console.debug?.(e)); } } - function Et(e, t) { + function kt(e, t) { if (Number(e?.button ?? 0) !== 0) return; let n = String(t?.id || "").trim(); if (!n) return; let r = Array.isArray(S.selectedIds) ? S.selectedIds.map(String).filter(Boolean) : []; - r.includes(n) && r.length > 1 && !e?.ctrlKey && !e?.metaKey && !e?.shiftKey ? (wt.assetId = n, wt.at = Date.now()) : (wt.assetId = n, wt.at = Date.now(), Tt(e, t)); + r.includes(n) && r.length > 1 && !e?.ctrlKey && !e?.metaKey && !e?.shiftKey ? (Dt.assetId = n, Dt.at = Date.now()) : (Dt.assetId = n, Dt.at = Date.now(), Ot(e, t)); } - async function Dt(e) { + async function At(e) { let t = (Array.isArray(S.assets) ? S.assets : []).filter((e) => !L(e)), n = t.findIndex((t) => String(t?.id || "") === String(e?.id || "")); if (!t.length || n < 0) return; let { requestViewerOpen: r } = await v(); @@ -8245,7 +8275,7 @@ var Bu = { index: n }); } - function Ot(e, t = null) { + function jt(e, t = null) { let n = String(e?.id || "").trim(); if (!n) return; let r = S.cardElements.get(n); @@ -8262,7 +8292,7 @@ var Bu = { console.debug?.(e); } } - async function kt(e, { select: t = !1 } = {}) { + async function Mt(e, { select: t = !1 } = {}) { try { let n = String(e?.id || "").trim(); t && n && k([n], n); @@ -8289,14 +8319,14 @@ var Bu = { mode: "graph" }); } catch (e) { - console.debug?.(e), Me(); + console.debug?.(e), Ne(); } } - async function At(t, n) { + async function Nt(t, n) { let r = String(t?.type || "").trim().toLowerCase(); if (r && String(n?.kind || "").toLowerCase() === "workflow") { - if (r === "load") await jt(n); - else if (r === "inspect") await kt(n, { select: !0 }); + if (r === "load") await Pt(n); + else if (r === "inspect") await Mt(n, { select: !0 }); else if (r === "favorite") { let t = !!n.favorite, r = !t; try { @@ -8318,17 +8348,17 @@ var Bu = { } catch (r) { console.debug?.(r), n.favorite = t, e(R("toast.workflowFavoriteFailed", "Failed to update workflow favorite."), "error"); } - } else r === "menu" && Ot(n, t?.event || null); + } else r === "menu" && jt(n, t?.event || null); } } - async function jt(t) { + async function Pt(t) { let n = String(t?.filepath || t?.path || t?.full_path || "").trim(); if (!n) { e(R("toast.workflowMissingPath", "Workflow file path is missing."), "error"); return; } let r = Qe(); - if (Le(r) === !0 && !await Wt(R("dialog.workflowLoadReplaceDirty", "Current canvas has unsaved changes. Replace it with this workflow?"), R("tab.workflow", "Workflow"))) return; + if (Le(r) === !0 && !await Tt(R("dialog.workflowLoadReplaceDirty", "Current canvas has unsaved changes. Replace it with this workflow?"), R("tab.workflow", "Workflow"))) return; let i = await y(n, { timeoutMs: 3e4 }), o = i?.data?.workflow || i?.workflow || null; if (!i?.ok || !o || typeof o != "object") e(i?.error || R("toast.workflowLoadFailed", "Failed to load workflow."), "error"); else if (!Pe(o, r).ok) e(R("toast.workflowImportUnavailable", "ComfyUI workflow import is unavailable in this frontend."), "error"); @@ -8341,7 +8371,7 @@ var Bu = { e(R("toast.workflowLoaded", "Workflow loaded"), "success", 1800); } } - function Mt(e) { + function Ft(e) { try { if (typeof r.onCardDblclick == "function") { r.onCardDblclick({ @@ -8362,9 +8392,9 @@ var Bu = { } catch (e) { console.debug?.(e); } - else String(e?.kind || "").toLowerCase() === "workflow" ? jt(e) : Dt(e); + else String(e?.kind || "").toLowerCase() === "workflow" ? Pt(e) : At(e); } - async function Nt({ asset: t, folderPath: n }) { + async function It({ asset: t, folderPath: n }) { let r = String(t?.filepath || "").trim(); if (r && n) try { let t = await ke({ @@ -8377,21 +8407,21 @@ var Bu = { e(t?.message || "Failed to move file", "error"); } } - let Pt = null, It = null, Lt = 0, Rt = ""; - function zt() { - ut(); + let Lt = null, Rt = null, zt = 0, Bt = ""; + function Vt() { + dt(); try { - Ye.value?.measure?.(); + Xe.value?.measure?.(); } catch (e) { console.debug?.(e); } } - function Bt() { + function Ht() { if (!u) try { u = requestAnimationFrame(() => { u = 0; try { - Ye.value?.measure?.(); + Xe.value?.measure?.(); } catch (e) { console.debug?.(e); } @@ -8399,34 +8429,34 @@ var Bu = { } catch (e) { console.debug?.(e), u = 0; try { - Ye.value?.measure?.(); + Xe.value?.measure?.(); } catch (e) { console.debug?.(e); } } } - function Vt() { - zt(), requestAnimationFrame(() => { + function Ut() { + Vt(), requestAnimationFrame(() => { requestAnimationFrame(() => { - zt(), Gt(); + Vt(), Kt(); }); }), setTimeout(() => { - zt(), Gt(); + Vt(), Kt(); }, 150); } - function Ht(e) { + function Wt(e) { if (!e || !r.virtualize) return () => {}; let t = () => { - Ge(e); + Ke(e); }; e.addEventListener("scroll", t, { passive: !0 }); try { requestAnimationFrame(() => { - t(), Gt(); + t(), Kt(); }); } catch { setTimeout(() => { - t(), Gt(); + t(), Kt(); }, 0); } return () => { @@ -8435,18 +8465,18 @@ var Bu = { } catch (e) { console.debug?.(e); } - Ke(); + qe(); }; } - lr(P, (e) => { + cr(P, (e) => { try { - Pt?.(); + Lt?.(); } catch (e) { console.debug?.(e); } - Pt = Ht(e); + Lt = Wt(e); }, { immediate: !0 }); - function Ut(e) { + function Gt(e) { let t = Number(e?.clientHeight || 0) || 0; if (t > 0) return t; let n = Number(i.value?.clientHeight || 0) || 0; @@ -8457,40 +8487,40 @@ var Bu = { return 0; } } - async function Gt() { - if (!r.virtualize || !Be.value || S.loading || S.done) return; + async function Kt() { + if (!r.virtualize || !Ve.value || S.loading || S.done) return; let e = P.value; if (!e) return; - let t = Array.isArray(S.assets) ? S.assets.length : 0, n = `${t}::${ze.value}`; - if (!It && !(n === Rt && Date.now() - Lt < 500) && (await ur(), (Number(e.scrollHeight || 0) || 0) <= Ut(e) + 40)) { + let t = Array.isArray(S.assets) ? S.assets.length : 0, n = `${t}::${Be.value}`; + if (!Rt && !(n === Bt && Date.now() - zt < 500) && (await lr(), (Number(e.scrollHeight || 0) || 0) <= Gt(e) + 40)) { let e = t; - It = Promise.resolve(I.loadNextPage()).catch((e) => console.debug?.(e)).finally(() => { + Rt = Promise.resolve(I.loadNextPage()).catch((e) => console.debug?.(e)).finally(() => { let t = Array.isArray(S.assets) ? S.assets.length : 0; - Lt = Date.now(), Rt = t === e ? n : "", It = null, setTimeout(() => { - Gt(); + zt = Date.now(), Bt = t === e ? n : "", Rt = null, setTimeout(() => { + Kt(); }, 0); }); } } - lr(() => `${Array.isArray(S.assets) ? S.assets.length : 0}::${ze.value}::${S.loading}::${S.done}`, () => { - Gt(); + cr(() => `${Array.isArray(S.assets) ? S.assets.length : 0}::${Be.value}::${S.loading}::${S.done}`, () => { + Kt(); }, { flush: "post" }); - function Kt(e) { + function qt(e) { if (e && r.virtualize) try { - Ye.value.measureElement(e); + Xe.value.measureElement(e); } catch (e) { console.debug?.(e); } } - function qt() { + function Jt() { return { - width: `${He.value}px`, - flex: `0 0 ${He.value}px`, - minWidth: `${He.value}px` + width: `${Ue.value}px`, + flex: `0 0 ${Ue.value}px`, + minWidth: `${Ue.value}px` }; } function Yt(e) { - return $e.value.get(e) || null; + return et.value.get(e) || null; } function Xt(e) { let t = Yt(e); @@ -8501,27 +8531,27 @@ var Bu = { transform: `translateY(${Number(t?.start || 0)}px)`, width: "100%", display: "flex", - gap: `${Ve.value}px`, - paddingBottom: `${Ve.value}px`, + gap: `${He.value}px`, + paddingBottom: `${He.value}px`, boxSizing: "border-box" }; } function Zt() { return { display: "flex", - gap: `${Ve.value}px`, - paddingBottom: `${Ve.value}px`, + gap: `${He.value}px`, + paddingBottom: `${He.value}px`, boxSizing: "border-box" }; } function Qt() { s.value += 1, r.applyDefaultSettingsClasses && i.value && mi(i.value); } - return lr(() => r.applyDefaultSettingsClasses, () => { + return cr(() => r.applyDefaultSettingsClasses, () => { i.value && r.applyDefaultSettingsClasses && mi(i.value); - }, { immediate: !0 }), mr(() => { + }, { immediate: !0 }), pr(() => { try { - window.removeEventListener(V.VIEWER_ACTIVE_ASSET_CHANGED, Fe); + window.removeEventListener(V.VIEWER_ACTIVE_ASSET_CHANGED, Ie); } catch (e) { console.debug?.(e); } @@ -8535,18 +8565,18 @@ var Bu = { } catch (e) { console.debug?.(e); } - try { - dt?.disconnect?.(); - } catch (e) { - console.debug?.(e); - } try { ft?.disconnect?.(); } catch (e) { console.debug?.(e); } try { - Pt?.(); + pt?.disconnect?.(); + } catch (e) { + console.debug?.(e); + } + try { + Lt?.(); } catch (e) { console.debug?.(e); } @@ -8555,30 +8585,30 @@ var Bu = { } catch (e) { console.debug?.(e); } - u = 0, Ke(); + u = 0, qe(); try { I.dispose(); } catch (e) { console.debug?.(e); } try { - pt?.(); + mt?.(); } catch (e) { console.debug?.(e); } - pt = null; + mt = null; try { - window.removeEventListener("mjr-settings-changed", Qt), mt = !1; + window.removeEventListener("mjr-settings-changed", Qt), ht = !1; } catch (e) { console.debug?.(e); } try { - window.removeEventListener("mjr:keepalive-attached", Vt); + window.removeEventListener("mjr:keepalive-attached", Ut); } catch (e) { console.debug?.(e); } - }), lr(i, (e) => { - e && (mt ||= (window.addEventListener("mjr-settings-changed", Qt), window.addEventListener("mjr:keepalive-attached", Vt), !0)); + }), cr(i, (e) => { + e && (ht ||= (window.addEventListener("mjr-settings-changed", Qt), window.addEventListener("mjr:keepalive-attached", Ut), !0)); }, { immediate: !0 }), n({ get gridContainer() { return i.value; @@ -8645,27 +8675,27 @@ var Bu = { "min-height": "100%" } }, [ - Z(S).loading && !Z(S).assets.length ? (q(), X("div", Bu, [U("div", Vu, [U("div", { + Z(S).loading && !Z(S).assets.length ? (q(), X("div", qu, [U("div", Ju, [U("div", { class: "mjr-grid-skeleton-layout", - style: Sr(it.value) - }, [(q(!0), X(H, null, gr(tt.value, (e) => (q(), X("div", { + style: xr(at.value) + }, [(q(!0), X(H, null, hr(nt.value, (e) => (q(), X("div", { key: `sk-${e}`, class: "mjr-grid-skeleton-card", - style: Sr(at.value) + style: xr(ot.value) }, [U("div", { class: "mjr-grid-skeleton-thumb mjr-grid-skeleton-shimmer", - style: Sr(ot.value) - }, null, 4), U("div", { style: Sr(lt.value) }, [U("div", { + style: xr(st.value) + }, null, 4), U("div", { style: xr(ut.value) }, [U("div", { class: "mjr-grid-skeleton-line mjr-grid-skeleton-line--title mjr-grid-skeleton-shimmer", - style: Sr(st.value) + style: xr(ct.value) }, null, 4), U("div", { class: "mjr-grid-skeleton-line mjr-grid-skeleton-line--meta mjr-grid-skeleton-shimmer", - style: Sr(ct.value) - }, null, 4)], 4)], 4))), 128))], 4), U("div", Hu, J(Z(S).loadingMessage || "Loading assets..."), 1)])])) : G("", !0), + style: xr(lt.value) + }, null, 4)], 4)], 4))), 128))], 4), U("div", Yu, J(Z(S).loadingMessage || "Loading assets..."), 1)])])) : G("", !0), Z(S).statusMessage && !Z(S).assets.length && !Z(S).loading ? (q(), X("div", { key: 1, class: "mjr-grid-message", - style: Sr({ + style: xr({ position: "absolute", inset: "0", zIndex: 3, @@ -8683,36 +8713,36 @@ var Bu = { }, J(Z(S).statusMessage), 5)) : G("", !0), t.virtualize ? (q(), X("div", { key: 2, - style: Sr({ - height: `${Z(Ze)}px`, + style: xr({ + height: `${Z($e)}px`, position: "relative", width: "100%", gridColumn: "1 / -1" }) - }, [(q(!0), X(H, null, gr(Z(Xe), (e) => (q(), X("div", { + }, [(q(!0), X(H, null, hr(Z(Ze), (e) => (q(), X("div", { key: e.key, ref_for: !0, - ref: Kt, + ref: qt, "data-index": e.index, - style: Sr(Xt(e.index)) + style: xr(Xt(e.index)) }, [e.kind === "header" ? (q(), X("button", { key: 0, type: "button", - class: Dr(["mjr-grid-group-separator", De(e)]), - "aria-expanded": Te(e.groupKey) ? "false" : "true", - title: `${Te(e.groupKey) ? "Open" : "Close"} group`, - onClick: (t) => Ee(e.groupKey) - }, [U("span", Gu, [U("i", { class: Dr(["pi", Te(e.groupKey) ? "pi-chevron-down" : "pi-chevron-up"]) }, null, 2)]), U("span", Ku, J(e.title), 1)], 10, Wu)) : e.items.length ? (q(!0), X(H, { key: 1 }, gr(e.items, (e) => (q(), X(H, { key: String(e.id) }, [L(e) ? (q(), ar(pc, { + class: Dr(["mjr-grid-group-separator", Oe(e)]), + "aria-expanded": Ee(e.groupKey) ? "false" : "true", + title: `${Ee(e.groupKey) ? "Open" : "Close"} group`, + onClick: (t) => De(e.groupKey) + }, [U("span", Qu, [U("i", { class: Dr(["pi", Ee(e.groupKey) ? "pi-chevron-down" : "pi-chevron-up"]) }, null, 2)]), U("span", $u, J(e.title), 1)], 10, Zu)) : e.items.length ? (q(!0), X(H, { key: 1 }, hr(e.items, (e) => (q(), X(H, { key: String(e.id) }, [L(e) ? (q(), ir(pc, { key: 0, ref_for: !0, - ref: St(e), + ref: wt(e), asset: e, selected: se(e), - style: Sr(qt()), - onMousedown: hr((t) => Et(t, e), ["left"]), - onClick: (t) => Tt(t, e), - onDblclick: hr((t) => Mt(e), ["stop"]), - onDropAsset: Nt + style: xr(Jt()), + onMousedown: mr((t) => kt(t, e), ["left"]), + onClick: (t) => Ot(t, e), + onDblclick: mr((t) => Ft(e), ["stop"]), + onDropAsset: It }, null, 8, [ "asset", "selected", @@ -8723,7 +8753,7 @@ var Bu = { ])) : (q(), X("div", { key: 1, ref_for: !0, - ref: St(e), + ref: wt(e), class: Dr(["mjr-asset-card mjr-card", { "is-selected": se(e), "mjr-live-placeholder": ge(e) @@ -8731,7 +8761,7 @@ var Bu = { role: "button", tabindex: "0", draggable: "true", - style: Sr(qt()), + style: xr(Jt()), "data-mjr-asset-id": String(e.id ?? ""), "data-mjr-filename-key": String(e.filename || "").toLowerCase(), "data-mjr-ext": ie(e), @@ -8744,33 +8774,33 @@ var Bu = { "data-mjr-dup-count": e._mjrDupStack ? String(e._mjrDupCount || 0) : void 0, "aria-label": `Asset ${e.filename || ""}`, "aria-selected": se(e) ? "true" : "false", - onMousedown: hr((t) => Et(t, e), ["left"]), - onClick: (t) => Tt(t, e), - onDblclick: hr((t) => Mt(e), ["stop"]) + onMousedown: mr((t) => kt(t, e), ["left"]), + onClick: (t) => Ot(t, e), + onDblclick: mr((t) => Ft(e), ["stop"]) }, [Y(lc, { asset: e, - onWorkflowAction: (t) => At(t, e) - }, null, 8, ["asset", "onWorkflowAction"])], 46, qu))], 64))), 128)) : G("", !0)], 12, Uu))), 128))], 4)) : (q(), X("div", Ju, [(q(!0), X(H, null, gr(We.value, (e) => (q(), X("div", { + onWorkflowAction: (t) => Nt(t, e) + }, null, 8, ["asset", "onWorkflowAction"])], 46, ed))], 64))), 128)) : G("", !0)], 12, Xu))), 128))], 4)) : (q(), X("div", td, [(q(!0), X(H, null, hr(Ge.value, (e) => (q(), X("div", { key: `${e.kind || "assets"}-${e.groupKey || ""}-${e.index ?? ""}`, - style: Sr(Zt()) + style: xr(Zt()) }, [e.kind === "header" ? (q(), X("button", { key: 0, type: "button", - class: Dr(["mjr-grid-group-separator", De(e)]), - "aria-expanded": Te(e.groupKey) ? "false" : "true", - title: `${Te(e.groupKey) ? "Open" : "Close"} group`, - onClick: (t) => Ee(e.groupKey) - }, [U("span", Xu, [U("i", { class: Dr(["pi", Te(e.groupKey) ? "pi-chevron-down" : "pi-chevron-up"]) }, null, 2)]), U("span", Zu, J(e.title), 1)], 10, Yu)) : (q(!0), X(H, { key: 1 }, gr(e.items, (e) => (q(), X(H, { key: String(e.id) }, [L(e) ? (q(), ar(pc, { + class: Dr(["mjr-grid-group-separator", Oe(e)]), + "aria-expanded": Ee(e.groupKey) ? "false" : "true", + title: `${Ee(e.groupKey) ? "Open" : "Close"} group`, + onClick: (t) => De(e.groupKey) + }, [U("span", rd, [U("i", { class: Dr(["pi", Ee(e.groupKey) ? "pi-chevron-down" : "pi-chevron-up"]) }, null, 2)]), U("span", id, J(e.title), 1)], 10, nd)) : (q(!0), X(H, { key: 1 }, hr(e.items, (e) => (q(), X(H, { key: String(e.id) }, [L(e) ? (q(), ir(pc, { key: 0, ref_for: !0, - ref: St(e), + ref: wt(e), asset: e, selected: se(e), - style: Sr(qt()), - onMousedown: hr((t) => Et(t, e), ["left"]), - onClick: (t) => Tt(t, e), - onDblclick: hr((t) => Mt(e), ["stop"]), - onDropAsset: Nt + style: xr(Jt()), + onMousedown: mr((t) => kt(t, e), ["left"]), + onClick: (t) => Ot(t, e), + onDblclick: mr((t) => Ft(e), ["stop"]), + onDropAsset: It }, null, 8, [ "asset", "selected", @@ -8781,7 +8811,7 @@ var Bu = { ])) : (q(), X("div", { key: 1, ref_for: !0, - ref: St(e), + ref: wt(e), class: Dr(["mjr-asset-card mjr-card", { "is-selected": se(e), "mjr-live-placeholder": ge(e) @@ -8789,7 +8819,7 @@ var Bu = { role: "button", tabindex: "0", draggable: "true", - style: Sr(qt()), + style: xr(Jt()), "data-mjr-asset-id": String(e.id ?? ""), "data-mjr-filename-key": String(e.filename || "").toLowerCase(), "data-mjr-ext": ie(e), @@ -8802,13 +8832,13 @@ var Bu = { "data-mjr-dup-count": e._mjrDupStack ? String(e._mjrDupCount || 0) : void 0, "aria-label": `Asset ${e.filename || ""}`, "aria-selected": se(e) ? "true" : "false", - onMousedown: hr((t) => Et(t, e), ["left"]), - onClick: (t) => Tt(t, e), - onDblclick: hr((t) => Mt(e), ["stop"]) + onMousedown: mr((t) => kt(t, e), ["left"]), + onClick: (t) => Ot(t, e), + onDblclick: mr((t) => Ft(e), ["stop"]) }, [Y(lc, { asset: e, - onWorkflowAction: (t) => At(t, e) - }, null, 8, ["asset", "onWorkflowAction"])], 46, Qu))], 64))), 128))], 4))), 128))])), + onWorkflowAction: (t) => Nt(t, e) + }, null, 8, ["asset", "onWorkflowAction"])], 46, ad))], 64))), 128))], 4))), 128))])), U("div", { ref_key: "infiniteSentinelRef", ref: ne, @@ -8822,14 +8852,14 @@ var Bu = { }, null, 512) ], 512)); } -}), td = 240, nd = 120, rd = 80, id = null, ad = null; -function od() { - return id ||= import("./chunks/viewerOpenRequest-B8IT-KHd.js").then((e) => e.n), id; +}), cd = 240, ld = 120, ud = 80, dd = null, fd = null; +function pd() { + return dd ||= import("./chunks/viewerOpenRequest-DaR0P9Y2.js").then((e) => e.n), dd; } -function sd() { - return ad ||= import("./chunks/floatingViewerManager-DI520cRz.js").then((e) => e.n), ad; +function md() { + return fd ||= import("./chunks/floatingViewerManager-B_1xQj1m.js").then((e) => e.n), fd; } -function cd(e) { +function hd(e) { let t = document.createElement("button"); t.type = "button", t.className = "mjr-asset-card mjr-card mjr-feed-group-member-card", t.style.cssText = "display:flex;flex-direction:column;align-items:flex-start;justify-content:flex-end;min-height:110px;padding:8px;border:1px solid var(--mjr-border,#444);border-radius:8px;background:var(--mjr-surface,#202020);color:inherit;text-align:left;overflow:hidden;"; try { @@ -8840,7 +8870,7 @@ function cd(e) { let n = document.createElement("div"); return n.className = "mjr-feed-group-member-name", n.style.cssText = "font-size:11px;font-weight:600;line-height:1.3;word-break:break-word;", n.textContent = String(e?.filename || "Asset"), t.appendChild(n), t; } -function ld(e) { +function gd(e) { try { if (typeof e?._mjrGetRenderedCards == "function") { let t = e._mjrGetRenderedCards(); @@ -8855,11 +8885,11 @@ function ld(e) { return console.debug?.(e), []; } } -function ud(e, t, n = "") { +function _d(e, t, n = "") { let r = Array.isArray(t) ? t.map(String).filter(Boolean) : []; - return tr(e, r, { activeId: n || r[0] || "" }, ld); + return er(e, r, { activeId: n || r[0] || "" }, gd); } -function dd(e) { +function vd(e) { let t = e?.grid; if (!t) return; let n = (e) => { @@ -8875,16 +8905,16 @@ function dd(e) { } catch (e) { console.debug?.(e); } - let a = ld(t), o = a.indexOf(n), s = Zn(t); + let a = gd(t), o = a.indexOf(n), s = Xn(t); if (e.shiftKey && o >= 0) { let n = Number.isFinite(Number(t._mjrLastSelectedIndex)) ? Number(t._mjrLastSelectedIndex) : o, r = Math.min(n, o), s = Math.max(n, o), c = a.slice(r, s + 1).map((e) => String(e?.dataset?.mjrAssetId || "").trim()).filter(Boolean); - ud(t, c, i), t._mjrLastSelectedIndex = o, e.preventDefault(), e.stopPropagation(); + _d(t, c, i), t._mjrLastSelectedIndex = o, e.preventDefault(), e.stopPropagation(); } else if (e.ctrlKey || e.metaKey) { s.has(i) ? s.delete(i) : s.add(i); let n = Array.from(s); - ud(t, n, s.has(i) ? i : n[0] || ""), o >= 0 && (t._mjrLastSelectedIndex = o), e.preventDefault(), e.stopPropagation(); + _d(t, n, s.has(i) ? i : n[0] || ""), o >= 0 && (t._mjrLastSelectedIndex = o), e.preventDefault(), e.stopPropagation(); } else { - ud(t, [i], i), o >= 0 && (t._mjrLastSelectedIndex = o); + _d(t, [i], i), o >= 0 && (t._mjrLastSelectedIndex = o); try { n.focus?.({ preventScroll: !0 }); } catch (e) { @@ -8901,23 +8931,23 @@ function dd(e) { } }; } -var fd = { +var yd = { hosts: /* @__PURE__ */ new Set(), pendingAssets: /* @__PURE__ */ new Map() }; -function pd(e) { - if (!B.EXECUTION_GROUPING_ENABLED) return Od(e); +function bd(e) { + if (!B.EXECUTION_GROUPING_ENABLED) return Fd(e); let t = String(e?.stack_id || "").trim(); if (t) return `stack:${t}`; let n = String(e?.job_id || "").trim(); - return n ? `job:${n}` : Od(e); + return n ? `job:${n}` : Fd(e); } -function md(e) { +function xd(e) { let t = /* @__PURE__ */ new Map(); for (let n of Array.isArray(e) ? e : []) { - let e = Ad(n); + let e = Ld(n); if (!e) continue; - let r = pd(e), i = t.get(r); + let r = bd(e), i = t.get(r); i || (i = { key: r, members: [] @@ -8942,16 +8972,16 @@ function md(e) { return (Number(t?.mtime || t?.created_at || 0) || 0) - n; }), n; } -function hd(e) { +function Sd(e) { return Array.from(e?.assetsByKey?.values?.() || []); } -function gd(e) { +function Cd(e) { return String(e ?? "").trim().toLowerCase(); } -function _d(e) { +function wd(e) { return e?._mjrLivePlaceholder === !0 || e?.is_live_placeholder === !0 || String(e?.id || "").trim().toLowerCase().startsWith("live:"); } -function vd(e) { +function Td(e) { if (!e || typeof e != "object") return e; try { delete e._mjrLivePlaceholder, delete e._mjrLiveStatus, delete e._mjrLiveLabel, delete e.is_live_placeholder; @@ -8960,19 +8990,19 @@ function vd(e) { } return e; } -function yd(e) { +function Ed(e) { if (!e || typeof e != "object") return ""; - let t = gd(e?.type || e?.source || "output"), n = gd(e?.root_id || e?.custom_root_id || ""), r = gd(e?.subfolder || ""), i = gd(e?.filename || ""); + let t = Cd(e?.type || e?.source || "output"), n = Cd(e?.root_id || e?.custom_root_id || ""), r = Cd(e?.subfolder || ""), i = Cd(e?.filename || ""); if (i) return `${t}|${n}|${r}|${i}`; - let a = gd(e?.filepath || e?.path || e?.fullpath || e?.full_path || ""); + let a = Cd(e?.filepath || e?.path || e?.fullpath || e?.full_path || ""); return a ? `${t}|${n}|path|${a}` : ""; } -function bd(e, t) { - let n = Ad(t); +function Dd(e, t) { + let n = Ld(t); if (!e || typeof e.set != "function" || !n) return null; - let r = Od(n), i = yd(n), a = ""; + let r = Fd(n), i = Ed(n), a = ""; if (i) { - for (let [t, n] of e.entries()) if (yd(n) === i) { + for (let [t, n] of e.entries()) if (Ed(n) === i) { a = t; break; } @@ -8981,17 +9011,17 @@ function bd(e, t) { ...o, ...n } : n; - return _d(n) || vd(s), a && a !== r && e.delete(a), e.set(r, s), s; + return wd(n) || Td(s), a && a !== r && e.delete(a), e.set(r, s), s; } -function xd(e, t) { - return e ? (e.assetsByKey ||= /* @__PURE__ */ new Map(), bd(e.assetsByKey, t)) : null; +function Od(e, t) { + return e ? (e.assetsByKey ||= /* @__PURE__ */ new Map(), Dd(e.assetsByKey, t)) : null; } -function Sd(e) { +function kd(e) { e?.grid && e.loaded && (e._renderTimer ||= setTimeout(() => { - e._renderTimer = null, Dd(e); - }, rd)); + e._renderTimer = null, Pd(e); + }, ud)); } -function Cd(e, t, n = 0) { +function Ad(e, t, n = 0) { let r = Array.isArray(t?._mjrFeedGroupAssets) ? t._mjrFeedGroupAssets.filter(Boolean) : [t].filter(Boolean); if (!r.length) return; let i = Math.max(0, Math.min(n, r.length - 1)), a = r[i] || null, o = String(a?.id || "").trim(); @@ -9001,14 +9031,14 @@ function Cd(e, t, n = 0) { } catch (e) { console.debug?.(e); } - ud(e.grid, [o], o); + _d(e.grid, [o], o); } - od().then((e) => e.requestViewerOpen({ + pd().then((e) => e.requestViewerOpen({ assets: r, index: i })).catch((e) => console.debug?.(e)); } -function wd(e, t) { +function jd(e, t) { let n = document.createElement("div"); n.className = "mjr-popover mjr-feed-group-popover", n.style.cssText = "display:none; width:min(440px, 92vw); padding:10px;"; let r = document.createElement("div"); @@ -9017,14 +9047,14 @@ function wd(e, t) { i.className = "mjr-feed-group-popover-grid", i.style.cssText = "display:grid; grid-template-columns:repeat(auto-fill, minmax(110px, 1fr)); gap:8px; max-height:360px; overflow-y:auto; overscroll-behavior:contain;"; let a = Array.isArray(t?._mjrFeedGroupAssets) ? t._mjrFeedGroupAssets : []; for (let r = 0; r < a.length; r += 1) { - let o = a[r], s = cd(o); + let o = a[r], s = hd(o); s.classList.add("mjr-feed-group-member-card"), r === 0 && s.classList.add("mjr-feed-group-member-card--cover"), s.addEventListener("click", (i) => { - i.preventDefault(), i.stopPropagation(), e.popoverManager?.close?.(n), Cd(e, t, r); + i.preventDefault(), i.stopPropagation(), e.popoverManager?.close?.(n), Ad(e, t, r); }), i.appendChild(s); } return n.appendChild(i), e.root.appendChild(n), n; } -function Td(e, t, n) { +function Md(e, t, n) { if (!t || !n) return; let r = Number(n?._mjrFeedGroupCount || 0) || 0; if (r <= 1 || (t.dataset.mjrFeedGrouped = "true", t.dataset.mjrFeedGroupCount = String(r), t.dataset.mjrStacked = "true", t.dataset.mjrStackCount = String(r), t.querySelector(".mjr-feed-group-button"))) return; @@ -9034,19 +9064,19 @@ function Td(e, t, n) { a.className = "mjr-feed-group-button-icon pi pi-clone", i.appendChild(a); let o = document.createElement("span"); o.className = "mjr-feed-group-button-count", o.textContent = String(r), i.appendChild(o), i.style.cssText = "position:absolute; top:34px; right:6px; z-index:11;", qa(i); - let s = wd(e, n); + let s = jd(e, n); i.addEventListener("click", (t) => { t.preventDefault(), t.stopPropagation(), e.popoverManager?.toggle?.(s, i); }), t.appendChild(i); } -function Ed(e, t) { +function Nd(e, t) { let n = new Map((Array.isArray(t) ? t : []).map((e) => [String(e?.id || "").trim(), e]).filter(([e]) => !!e)); - for (let t of ld(e?.grid)) { + for (let t of gd(e?.grid)) { let r = String(t?.dataset?.mjrAssetId || "").trim(), i = n.get(r); - i && Td(e, t, i); + i && Md(e, t, i); } } -async function Dd(e) { +async function Pd(e) { if (!e?.grid) return; try { e.popoverManager?.closeAll?.(); @@ -9059,19 +9089,19 @@ async function Dd(e) { } catch (e) { console.debug?.(e); } - let t = md(hd(e)), n = await yi(e.grid, t, { + let t = xd(Sd(e)), n = await yi(e.grid, t, { title: R("bottomFeed.title", "Generated Feed"), reset: !0 }); - Ed(e, t), Number(n?.count || 0) <= 0 ? (e.empty.textContent = R("bottomFeed.empty", "No generated assets yet."), e.empty.style.display = "") : e.empty.style.display = "none"; + Nd(e, t), Number(n?.count || 0) <= 0 ? (e.empty.textContent = R("bottomFeed.empty", "No generated assets yet."), e.empty.style.display = "") : e.empty.style.display = "none"; } -function Od(e) { +function Fd(e) { let t = String(e?.id || "").trim(); if (t) return `id:${t}`; let n = String(e?.filename || "").trim(), r = String(e?.subfolder || "").trim(); return `file:${String(e?.source || e?.type || "").trim()}:${r}:${n}`; } -function kd(e) { +function Id(e) { let t = String(e || "").split(".").pop()?.toUpperCase() ?? "", n = /* @__PURE__ */ new Set([ "MP4", "WEBM", @@ -9098,41 +9128,41 @@ function kd(e) { ]); return n.has(t) ? "video" : r.has(t) ? "audio" : i.has(t) ? "model3d" : "image"; } -function Ad(e) { +function Ld(e) { if (!e || typeof e != "object") return null; let t = { ...e }; - return !t.type && t.source && (t.type = t.source), !t.source && t.type && (t.source = t.type), t.kind ||= kd(t.ext || t.filename || ""), t; + return !t.type && t.source && (t.type = t.source), !t.source && t.type && (t.source = t.type), t.kind ||= Id(t.ext || t.filename || ""), t; } -function jd(e) { - let t = Ad(e); +function Rd(e) { + let t = Ld(e); if (!t) return null; - let n = Od(t); + let n = Fd(t); if (!n) return null; - let r = yd(t), i = null; - if (r) for (let [e, t] of fd.pendingAssets.entries()) e !== n && yd(t) === r && (i = t, fd.pendingAssets.delete(e)); - let a = fd.pendingAssets.get(n) || i || null, o = a ? { + let r = Ed(t), i = null; + if (r) for (let [e, t] of yd.pendingAssets.entries()) e !== n && Ed(t) === r && (i = t, yd.pendingAssets.delete(e)); + let a = yd.pendingAssets.get(n) || i || null, o = a ? { ...a, ...t } : t; - if (_d(t) || vd(o), fd.pendingAssets.set(n, o), fd.pendingAssets.size > 64) { - let e = fd.pendingAssets.keys().next().value; - e && fd.pendingAssets.delete(e); + if (wd(t) || Td(o), yd.pendingAssets.set(n, o), yd.pendingAssets.size > 64) { + let e = yd.pendingAssets.keys().next().value; + e && yd.pendingAssets.delete(e); } return o; } -function Md() { - return Array.from(fd.pendingAssets.values()); +function zd() { + return Array.from(yd.pendingAssets.values()); } -async function Nd(e) { +async function Bd(e) { if (e?.grid) { e.empty.style.display = "none", e.empty.textContent = R("bottomFeed.loading", "Loading recent assets..."); try { e.assetsByKey = /* @__PURE__ */ new Map(); let t = [], n = 0; - for (; n < td;) { + for (; n < cd;) { let r = qe({ q: "*", - limit: Math.min(nd, td - n), + limit: Math.min(ld, cd - n), offset: n, scope: "output", sort: "mtime_desc", @@ -9142,19 +9172,19 @@ async function Nd(e) { let a = Array.isArray(i?.data?.assets) ? i.data.assets : []; if (!a.length) break; for (let n of a) { - let r = xd(e, n); + let r = Od(e, n); r && t.push(r); } - if (a.length < nd) break; + if (a.length < ld) break; n += a.length; } - for (let t of Md()) xd(e, t); - fd.pendingAssets.clear(); - let r = md(hd(e)), i = await yi(e.grid, r, { + for (let t of zd()) Od(e, t); + yd.pendingAssets.clear(); + let r = xd(Sd(e)), i = await yi(e.grid, r, { title: R("bottomFeed.title", "Generated Feed"), reset: !0 }); - Ed(e, r), Number(i?.count || 0) <= 0 ? (e.empty.textContent = R("bottomFeed.empty", "No generated assets yet."), e.empty.style.display = "") : e.empty.style.display = "none"; + Nd(e, r), Number(i?.count || 0) <= 0 ? (e.empty.textContent = R("bottomFeed.empty", "No generated assets yet."), e.empty.style.display = "") : e.empty.style.display = "none"; } catch (t) { console.debug?.(t), e.empty.textContent = R("bottomFeed.loadFailed", "Failed to load generated assets."), e.empty.style.display = ""; } finally { @@ -9162,21 +9192,21 @@ async function Nd(e) { } } } -async function Pd() { - for (let e of Array.from(fd.hosts)) try { - await Nd(e); +async function Vd() { + for (let e of Array.from(yd.hosts)) try { + await Bd(e); } catch (e) { console.debug?.(e); } } -function Fd() { - Pd(); +function Hd() { + Vd(); } -function Id(e) { +function Ud(e) { let t = document.createElement("div"); t.textContent = R("bottomFeed.loading", "Loading recent assets..."), t.style.cssText = "font-size:11px; opacity:0.65; padding:4px 2px 8px 2px;", e.root.appendChild(t), e.empty = t; } -function Ld(e) { +function Wd(e) { if (!e) return; let t = [ e, @@ -9194,14 +9224,14 @@ function Ld(e) { console.debug?.(e); } } -function Rd(e) { +function Gd(e) { if (!e) return; let t = (t, n) => { n ? e.classList.add(t) : e.classList.remove(t); }; t("mjr-feed-show-info", B.FEED_SHOW_INFO), t("mjr-feed-show-filename", B.FEED_SHOW_FILENAME), t("mjr-feed-show-dimensions", B.FEED_SHOW_DIMENSIONS), t("mjr-feed-show-date", B.FEED_SHOW_DATE), t("mjr-feed-show-gentime", B.FEED_SHOW_GENTIME), t("mjr-show-hover-info", B.GRID_SHOW_HOVER_INFO), t("mjr-feed-show-dot", B.FEED_SHOW_WORKFLOW_DOT), t("mjr-feed-show-badges-ext", B.FEED_SHOW_BADGES_EXTENSION), t("mjr-feed-show-badges-rating", B.FEED_SHOW_BADGES_RATING), t("mjr-feed-show-badges-tags", B.FEED_SHOW_BADGES_TAGS); } -function zd(e, t = null) { +function Kd(e, t = null) { let n = t || document.createElement("div"); n.classList.add("mjr-am-grid-scroll"), n.style.position = "relative", n.style.flex = "1 1 auto", n.style.minHeight = "0", n.style.height = "100%", n.style.overflow = "auto", n.style.scrollbarGutter = "stable", n.style.overscrollBehavior = "contain", n.style.webkitOverflowScrolling = "touch"; let r = () => { @@ -9219,14 +9249,14 @@ function zd(e, t = null) { } }, a = document.createElement("div"); n.appendChild(a), e.root.appendChild(n); - let { app: o } = Un(ed, { + let { app: o } = Hn(sd, { scrollElement: n, virtualize: !1, applyDefaultSettingsClasses: !1, emitWindowSelectionEvents: !0, onCardRendered: (t, n) => { try { - Td(e, t, n); + Md(e, t, n); } catch (e) { console.debug?.(e); } @@ -9245,7 +9275,7 @@ function zd(e, t = null) { else if (t === "c") { e.preventDefault?.(), e.stopPropagation?.(), r(); try { - sd().then(async ({ floatingViewerManager: e }) => { + md().then(async ({ floatingViewerManager: e }) => { await e.open(), e.toggleCompareAB(); }).catch((e) => console.debug?.(e)); } catch (e) { @@ -9266,19 +9296,19 @@ function zd(e, t = null) { } }; } -function Bd(e) { +function qd(e) { let t = e?.grid; if (!t) return []; - let n = Zn(t); - return n.size ? hd(e).filter((e) => n.has(String(e?.id || ""))) : []; + let n = Xn(t); + return n.size ? Sd(e).filter((e) => n.has(String(e?.id || ""))) : []; } -function Vd(e) { +function Jd(e) { let t = e?.grid; if (!t) return null; let n = String(t.dataset?.mjrSelectedAssetId || "").trim(); - return n ? hd(e).find((e) => String(e?.id || "") === n) || null : Bd(e)[0] || null; + return n ? Sd(e).find((e) => String(e?.id || "") === n) || null : qd(e)[0] || null; } -function Hd(e) { +function Yd(e) { let t = String(e ?? ""); try { if (typeof CSS < "u" && typeof CSS.escape == "function") return CSS.escape(t); @@ -9287,23 +9317,23 @@ function Hd(e) { } return t.replace(/([!"#$%&'()*+,./:;<=>?@[\\\]^`{|}~])/g, "\\$1"); } -function Ud(e) { +function Xd(e) { let t = e?.grid; if (!t) return; let n = () => { try { - Sd(e); + kd(e); } catch (e) { console.debug?.(e); } }; e.keyboard = Ri({ gridContainer: t, - getState: () => ({ assets: md(hd(e)) }), - getSelectedAssets: () => Bd(e), - getActiveAsset: () => Vd(e), + getState: () => ({ assets: xd(Sd(e)) }), + getSelectedAssets: () => qd(e), + getActiveAsset: () => Jd(e), onOpenTagsEditor: (e) => { - let r = t.querySelector?.(`.mjr-asset-card[data-mjr-asset-id="${Hd(e?.id || "")}"]`) || null, i = null; + let r = t.querySelector?.(`.mjr-asset-card[data-mjr-asset-id="${Yd(e?.id || "")}"]`) || null, i = null; try { i = r?.getBoundingClientRect?.() || t.getBoundingClientRect(); } catch (e) { @@ -9317,9 +9347,9 @@ function Ud(e) { createRatingBadge: gt }), e.ratingHotkeys.bind(); } -var Wd = 60, Gd = 600, Kd = 10; -function qd(e, t) { - let n = Math.max(Wd, Math.min(Gd, Math.round(Number(t) / Kd) * Kd)); +var Zd = 60, Qd = 600, $d = 10; +function ef(e, t) { + let n = Math.max(Zd, Math.min(Qd, Math.round(Number(t) / $d) * $d)); if (e?.grid) try { e.grid.style.setProperty("--mjr-grid-min-size", `${n}px`); } catch (e) { @@ -9327,8 +9357,8 @@ function qd(e, t) { } B.FEED_GRID_MIN_SIZE = n; try { - let e = Hn(); - e.feed.minSize = n, In(e), En(e); + let e = Vn(); + e.feed.minSize = n, Fn(e), Tn(e); } catch (e) { console.debug?.(e); } @@ -9345,27 +9375,27 @@ function qd(e, t) { } return n; } -function Jd(e) { - let t = Math.max(Wd, Number(B.FEED_GRID_MIN_SIZE || 120) || 120), n = document.createElement("div"); +function tf(e) { + let t = Math.max(Zd, Number(B.FEED_GRID_MIN_SIZE || 120) || 120), n = document.createElement("div"); n.className = "mjr-feed-toolbar", n.style.cssText = "display:flex; align-items:center; gap:5px; padding:0 2px 5px 2px; flex-shrink:0; user-select:none;"; let r = document.createElement("span"); r.textContent = R("bottomFeed.cardSize", "Cards:"), r.style.cssText = "font-size:11px; opacity:0.65; white-space:nowrap; flex-shrink:0;", n.appendChild(r); let i = document.createElement("button"); i.type = "button", i.className = "mjr-feed-size-btn", i.textContent = "-", i.title = R("bottomFeed.cardSizeDecrease", "Decrease card size"), i.style.cssText = "width:20px; height:20px; padding:0; border:1px solid var(--mjr-border,#555); border-radius:4px; background:var(--mjr-surface,#2a2a2a); color:inherit; cursor:pointer; font-size:14px; line-height:1; flex-shrink:0; display:flex; align-items:center; justify-content:center;", n.appendChild(i); let a = document.createElement("input"); - a.type = "range", a.className = "mjr-feed-size-slider", a.min = String(Wd), a.max = String(Gd), a.step = String(Kd), a.value = String(t), a.title = R("bottomFeed.cardSizeSlider", "Card size"), a.style.cssText = "flex:1 1 auto; min-width:40px; max-width:180px; height:4px; cursor:pointer; accent-color:var(--mjr-accent,#64b5f6);", n.appendChild(a); + a.type = "range", a.className = "mjr-feed-size-slider", a.min = String(Zd), a.max = String(Qd), a.step = String($d), a.value = String(t), a.title = R("bottomFeed.cardSizeSlider", "Card size"), a.style.cssText = "flex:1 1 auto; min-width:40px; max-width:180px; height:4px; cursor:pointer; accent-color:var(--mjr-accent,#64b5f6);", n.appendChild(a); let o = document.createElement("button"); o.type = "button", o.className = "mjr-feed-size-btn", o.textContent = "+", o.title = R("bottomFeed.cardSizeIncrease", "Increase card size"), o.style.cssText = i.style.cssText, n.appendChild(o); let s = document.createElement("span"); s.className = "mjr-feed-size-display", s.textContent = `${t}px`, s.style.cssText = "font-size:11px; opacity:0.65; white-space:nowrap; min-width:36px; text-align:right; flex-shrink:0; font-variant-numeric:tabular-nums;", n.appendChild(s), i.addEventListener("click", () => { - qd(e, Number(a.value) - Kd); + ef(e, Number(a.value) - $d); }), o.addEventListener("click", () => { - qd(e, Number(a.value) + Kd); + ef(e, Number(a.value) + $d); }), a.addEventListener("input", () => { - qd(e, Number(a.value)); + ef(e, Number(a.value)); }), e.root.appendChild(n), e._sizeToolbar = n; } -function Yd(e, t = {}) { +function nf(e, t = {}) { let n = document.createElement("div"); n.className = "mjr-assets-manager mjr-bottom-feed", n.style.cssText = "padding:6px; height:100%; min-height:0; box-sizing:border-box; display:flex; flex-direction:column; overflow:hidden;", e.replaceChildren(n); let r = { @@ -9377,13 +9407,13 @@ function Yd(e, t = {}) { assetsByKey: /* @__PURE__ */ new Map(), popoverManager: null }; - Jd(r), Id(r), zd(r, t.gridWrapper ?? null), dd(r), r.popoverManager = Ai(n), r._disposeContextMenu = za({ + tf(r), Ud(r), Kd(r, t.gridWrapper ?? null), vd(r), r.popoverManager = Ai(n), r._disposeContextMenu = za({ gridContainer: r.grid, getState: () => ({ scope: "output" }) - }), Ud(r), Rd(r.grid); + }), Xd(r), Gd(r.grid); let i = () => { try { - Rd(r.grid); + Gd(r.grid); } catch (e) { console.debug?.(e); } @@ -9396,26 +9426,26 @@ function Yd(e, t = {}) { } }, r; } -function Xd(e) { - let t = jd(e); - if (t) for (let e of Array.from(fd.hosts)) try { - if (!e?.grid || (xd(e, t), !e.loaded)) continue; - e.empty.style.display = "none", Sd(e); +function rf(e) { + let t = Rd(e); + if (t) for (let e of Array.from(yd.hosts)) try { + if (!e?.grid || (Od(e, t), !e.loaded)) continue; + e.empty.style.display = "none", kd(e); } catch (e) { console.debug?.(e); } } -function Zd(e, t = {}) { - Ld(e); - let n = Yd(e, t); +function af(e, t = {}) { + Wd(e); + let n = nf(e, t); try { e._mjrGeneratedFeedHost = n; } catch (e) { console.debug?.(e); } - return fd.hosts.add(n), Nd(n), n; + return yd.hosts.add(n), Bd(n), n; } -function Qd(e) { +function of(e) { let t = e?._mjrGeneratedFeedHost || e || null; if (!t) return; let n = t.container || null; @@ -9429,7 +9459,7 @@ function Qd(e) { } console.debug?.(e); } - fd.hosts.delete(t); + yd.hosts.delete(t); try { t._disposeSelection?.(); } catch (e) { @@ -9487,24 +9517,24 @@ function Qd(e) { } } // ui/features/stacks/executionAssetBuffer.ts -function $d(e) { +function sf(e) { return String(e || "").trim(); } -function ef(e) { +function cf(e) { let t = String(e?.filename || "").trim(), n = String(e?.subfolder || "").trim(); return `${String(e?.type || "output").trim().toLowerCase()}|${String(e?.root_id || e?.custom_root_id || "").trim()}|${n}|${t}`; } -function tf() { +function lf() { let e = /* @__PURE__ */ new Map(); function t(t, n) { - let r = $d(t); + let r = sf(t); if (!r) return []; let i = Array.isArray(n) ? n : []; if (!i.length) return []; let a = e.get(r); a || (a = /* @__PURE__ */ new Map(), e.set(r, a)); for (let e of i) { - let t = ef(e); + let t = cf(e); t && a.set(t, { ...a.get(t) || {}, ...e || {} @@ -9513,13 +9543,13 @@ function tf() { return Array.from(a.values()); } function n(t) { - let n = $d(t); + let n = sf(t); if (!n) return []; let r = e.get(n); return e.delete(n), Array.from(r?.values?.() || []); } function r(t) { - let n = $d(t); + let n = sf(t); n && e.delete(n); } return { @@ -9530,7 +9560,7 @@ function tf() { }; } // ui/features/stacks/finalizeQueue.ts -function nf({ defaultDelayMs: e = 900, postJob: t } = {}) { +function uf({ defaultDelayMs: e = 900, postJob: t } = {}) { let n = /* @__PURE__ */ new Map(), r = /* @__PURE__ */ new Set(), i = !1; async function a() { if (!i) { @@ -9567,27 +9597,27 @@ function nf({ defaultDelayMs: e = 900, postJob: t } = {}) { }; } // ui/features/stacks/liveAssetGate.ts -function rf(e) { +function df(e) { return String(e || "").trim(); } -function af(e) { +function ff(e) { let t = String(e?.filename || "").trim(), n = String(e?.filepath || "").trim(), r = String(e?.subfolder || "").trim(); return `${String(e?.type || e?.source || "output").trim().toLowerCase()}|${String(e?.root_id || e?.custom_root_id || "").trim()}|${r}|${t || n}`; } -function of(e, t) { +function pf(e, t) { return !t || String(e?.job_id || "").trim() === t ? e : { ...e || {}, job_id: t }; } -function sf() { +function mf() { let e = /* @__PURE__ */ new Map(); function t(t, { files: n = [], expectedCount: r = null } = {}) { - let i = rf(t); + let i = df(t); if (!i) return; let a = /* @__PURE__ */ new Set(); for (let e of Array.isArray(n) ? n : []) { - let t = af(e); + let t = ff(e); t && a.add(t); } e.set(i, { @@ -9597,13 +9627,13 @@ function sf() { }); } function n(t) { - let n = rf(t); + let n = df(t); n && e.delete(n); } function r(t) { - let n = rf(t?.job_id); + let n = df(t?.job_id); if (n) return n; - let r = af(t); + let r = ff(t); if (!r) return ""; let i = "", a = Infinity; for (let [t, n] of e.entries()) n?.fileKeys?.has?.(r) && (n.markedAt ?? Infinity) < a && (a = n.markedAt ?? Infinity, i = t); @@ -9616,7 +9646,7 @@ function sf() { jobId: "", defer: !1 }; - let i = of(t, n), a = e.get(n); + let i = pf(t, n), a = e.get(n); if (!a) return { detail: i, jobId: n, @@ -9638,20 +9668,20 @@ function sf() { }; } // ui/features/stacks/executionRuntimeController.ts -var cf = 2e3, lf = 2e3, uf = /* @__PURE__ */ new Set([ +var hf = 2e3, gf = 2e3, _f = /* @__PURE__ */ new Set([ "DB_MAINTENANCE", "TIMEOUT", "NETWORK_ERROR", "SERVICE_UNAVAILABLE" -]), df = 8, ff = 1200, pf = 15e3, mf = 6e5, hf = 500, gf = 6, _f = 3e4, vf = 500; -function yf({ post: e, ENDPOINTS: t, reportError: n, extractOutputFiles: r, ensureExecutionRuntime: i, emitRuntimeStatus: a, refreshGeneratedFeedHosts: o, getActiveGridContainer: s }) { +]), vf = 8, yf = 1200, bf = 15e3, xf = 6e5, Sf = 500, Cf = 6, wf = 3e4, Tf = 500; +function Ef({ post: e, ENDPOINTS: t, reportError: n, extractOutputFiles: r, ensureExecutionRuntime: i, emitRuntimeStatus: a, refreshGeneratedFeedHosts: o, getActiveGridContainer: s }) { let c = ye({ - ttlMs: cf, - maxSize: lf + ttlMs: hf, + maxSize: gf }), l = ye({ - ttlMs: mf, - maxSize: hf - }), u = Math.max(0, Number(B.EXECUTION_IDLE_GRACE_MS) || 6e3), d = /* @__PURE__ */ new Map(), f = tf(), p = sf(), m = "", h = 0, g = null; + ttlMs: xf, + maxSize: Sf + }), u = Math.max(0, Number(B.EXECUTION_IDLE_GRACE_MS) || 6e3), d = /* @__PURE__ */ new Map(), f = lf(), p = mf(), m = "", h = 0, g = null; function _() { try { return typeof window > "u" ? !1 : window.__MJR_DEBUG_JOB_TRACKING__ === !0 || String(window.localStorage?.getItem("mjr.debug.jobTracking") || "").trim() === "1"; @@ -9723,7 +9753,7 @@ function yf({ post: e, ENDPOINTS: t, reportError: n, extractOutputFiles: r, ensu console.debug?.(e); } } - let S = nf({ + let S = uf({ defaultDelayMs: 900, async postJob(r) { v("auto-stack:start", { job_id: r }); @@ -9761,7 +9791,7 @@ function yf({ post: e, ENDPOINTS: t, reportError: n, extractOutputFiles: r, ensu } function T(e) { let t = Math.max(1, Number(e) || 1), n = Math.min(6, t - 1); - return Math.min(pf, ff * 2 ** n); + return Math.min(bf, yf * 2 ** n); } function E() { g &&= (clearTimeout(g), null); @@ -9779,7 +9809,7 @@ function yf({ post: e, ENDPOINTS: t, reportError: n, extractOutputFiles: r, ensu } function O(e) { let t = String(e?.code || "").trim().toUpperCase(); - return uf.has(t); + return _f.has(t); } function k(r, i = 1, a = {}) { let o = Array.isArray(r) ? r : []; @@ -9794,7 +9824,7 @@ function yf({ post: e, ENDPOINTS: t, reportError: n, extractOutputFiles: r, ensu files: o.map((e) => String(e?.filename || e?.filepath || "")) }), e(t.INDEX_FILES, s).then((e) => { if (!e?.ok) { - if (O(e) && i < df) { + if (O(e) && i < vf) { let e = T(i); setTimeout(() => k(o, i + 1, a), e); } else try { @@ -9829,7 +9859,7 @@ function yf({ post: e, ENDPOINTS: t, reportError: n, extractOutputFiles: r, ensu let a = d.get(i); a?.timer && clearTimeout(a.timer); let o = a?.firstAttemptAt ?? Date.now(); - if (Date.now() - o >= _f) { + if (Date.now() - o >= wf) { k(r, 1, t); return; } @@ -9874,7 +9904,7 @@ function yf({ post: e, ENDPOINTS: t, reportError: n, extractOutputFiles: r, ensu file_count: Array.isArray(e) ? e.length : 0, files: Array.isArray(e) ? e.map((e) => String(e?.filename || e?.filepath || "")) : [] }), !r) { - if (n < gf) { + if (n < Cf) { M(e, t, n); return; } @@ -10008,7 +10038,7 @@ function yf({ post: e, ENDPOINTS: t, reportError: n, extractOutputFiles: r, ensu reason: String(e?.type || "") }), E(), f.clear(r), n.allowLiveStackFinalize && p.clearPendingJob(r), P()), String(e?.type || "") === "execution_success" && D(() => { r && N(r), F(r); - }, I(r) ? Math.min(u, vf) : u); + }, I(r) ? Math.min(u, Tf) : u); } function se(e) { if (!y()) return; @@ -10033,7 +10063,7 @@ function yf({ post: e, ENDPOINTS: t, reportError: n, extractOutputFiles: r, ensu }; } // ui/utils/extractOutputFiles.ts -function bf(e) { +function Df(e) { let t = [], n = /* @__PURE__ */ new Set(), r = 2e3, i = /\.(png|jpe?g|webp|gif|bmp|tiff?|avif|heic|heif|apng|hdr|svg|mp4|webm|mov|mkv|avi|m4v|mp3|wav|flac|ogg|glb|gltf|obj|fbx|ply|stl)$/i, a = typeof WeakSet < "u" ? /* @__PURE__ */ new WeakSet() : null, o = ({ type: e, subfolder: t, filename: n, path: r }) => r ? `path|${String(r).trim().toLowerCase()}` : `${e || ""}|${t || ""}|${n || ""}`.toLowerCase(), s = (e) => { if (!e) return; let r = e.path || e.filepath || e.fullpath || e.fullPath || e.full_path, i = e.filename; @@ -10114,15 +10144,15 @@ function bf(e) { return u(e, 0), t; } // ui/features/runtime/sidebarAssetBadge.ts -var xf = "mjr-sidebar-asset-badge", Sf = "mjr-sidebar-tab-has-badge", Cf = "mjr-sidebar-asset-badge-style", wf = 99, Tf = 0, Ef = "majoor-assets", Df = !1, Of = /* @__PURE__ */ new Set(); -function kf() { - if (typeof document > "u" || document.getElementById(Cf)) return; +var Of = "mjr-sidebar-asset-badge", kf = "mjr-sidebar-tab-has-badge", Af = "mjr-sidebar-asset-badge-style", jf = 99, Mf = 0, Nf = "majoor-assets", Pf = !1, Ff = /* @__PURE__ */ new Set(); +function If() { + if (typeof document > "u" || document.getElementById(Af)) return; let e = document.createElement("style"); - e.id = Cf, e.textContent = ` - .${Sf} { + e.id = Af, e.textContent = ` + .${kf} { position: relative !important; } - .${xf} { + .${Of} { position: absolute; top: 3px; right: 3px; @@ -10146,7 +10176,7 @@ function kf() { } `, document.head?.appendChild(e); } -function Af(e) { +function Lf(e) { let t = String(e || "").trim(); if (!t) return []; let n = (() => { @@ -10165,91 +10195,91 @@ function Af(e) { `[href="#${n}"]` ]; } -function jf(e) { +function Rf(e) { let t = `${e?.textContent || ""} ${e?.title || ""} ${e?.getAttribute?.("aria-label") || ""}`; return /assets\s*manager|majoor/i.test(t); } -function Mf(e) { +function zf(e) { return !e || typeof e != "object" ? !1 : typeof HTMLElement < "u" ? e instanceof HTMLElement : typeof e.querySelector == "function" && typeof e.appendChild == "function"; } -function Nf() { +function Bf() { if (typeof document > "u") return null; - for (let e of Af(Ef)) { + for (let e of Lf(Nf)) { let t = document.querySelector(e); - if (Mf(t)) return t; + if (zf(t)) return t; } let e = Array.from(document.querySelectorAll(".pi-folder, .pi-folder-open")); for (let t of e) { let e = t.closest?.("button,[role='tab'],a,.p-button,.comfyui-button,.sidebar-tab"); - if (Mf(e) && jf(e)) return e; + if (zf(e) && Rf(e)) return e; } - return Array.from(document.querySelectorAll("button,[role='tab'],a,.p-button,.comfyui-button,.sidebar-tab")).find((e) => Mf(e) && jf(e)) || null; + return Array.from(document.querySelectorAll("button,[role='tab'],a,.p-button,.comfyui-button,.sidebar-tab")).find((e) => zf(e) && Rf(e)) || null; } -function Pf() { - kf(); - let e = Nf(); +function Vf() { + If(); + let e = Bf(); if (!e) return !1; - let t = e.querySelector(`:scope > .${xf}`); - return !If() || Tf <= 0 ? (t?.remove(), e.classList.remove(Sf), !0) : (t || (t = document.createElement("span"), t.className = xf, t.setAttribute("aria-hidden", "true"), e.appendChild(t)), e.classList.add(Sf), t.textContent = Tf > wf ? `${wf}+` : String(Tf), !0); + let t = e.querySelector(`:scope > .${Of}`); + return !Uf() || Mf <= 0 ? (t?.remove(), e.classList.remove(kf), !0) : (t || (t = document.createElement("span"), t.className = Of, t.setAttribute("aria-hidden", "true"), e.appendChild(t)), e.classList.add(kf), t.textContent = Mf > jf ? `${jf}+` : String(Mf), !0); } -function Ff() { - Pf(), typeof requestAnimationFrame == "function" && requestAnimationFrame(() => Pf()), setTimeout(() => Pf(), 250), setTimeout(() => Pf(), 1e3); +function Hf() { + Vf(), typeof requestAnimationFrame == "function" && requestAnimationFrame(() => Vf()), setTimeout(() => Vf(), 250), setTimeout(() => Vf(), 1e3); } -function If() { +function Uf() { return B.SIDEBAR_ASSET_BADGE_ENABLED !== !1; } -function Lf(e = null) { +function Wf(e = null) { let t = String(e?.id || e?.asset_id || "").trim(); if (t) return `id:${t}`; let n = String(e?.type || e?.source || "output").trim().toLowerCase(), r = String(e?.root_id || e?.custom_root_id || "").trim().toLowerCase(), i = String(e?.subfolder || e?.sub_folder || e?.subFolder || "").trim().toLowerCase(), a = String(e?.filename || "").trim().toLowerCase(), o = String(e?.filepath || e?.path || e?.fullpath || e?.full_path || "").trim().toLowerCase(), s = a || o; return s ? `file:${n}|${r}|${i}|${s}` : ""; } -function Rf(e) { +function Gf(e) { if (!e) return !0; - if (Of.has(e)) return !1; - if (Of.add(e), Of.size > 1e3) { - let e = Array.from(Of).slice(-500); - Of.clear(); - for (let t of e) Of.add(t); + if (Ff.has(e)) return !1; + if (Ff.add(e), Ff.size > 1e3) { + let e = Array.from(Ff).slice(-500); + Ff.clear(); + for (let t of e) Ff.add(t); } return !0; } -function zf({ sidebarTabId: e } = {}) { +function Kf({ sidebarTabId: e } = {}) { let t = String(e || "").trim(); - t && (Ef = t), !Df && typeof window < "u" && (Df = !0, window.addEventListener?.("mjr-settings-changed", (e) => { - e?.detail?.key === "sidebar.assetBadgeEnabled" && (If() || (Tf = 0, Of.clear()), Ff()); - })), Ff(); + t && (Nf = t), !Pf && typeof window < "u" && (Pf = !0, window.addEventListener?.("mjr-settings-changed", (e) => { + e?.detail?.key === "sidebar.assetBadgeEnabled" && (Uf() || (Mf = 0, Ff.clear()), Hf()); + })), Hf(); } -function Bf(e = null) { - If() && Rf(Lf(e)) && (Tf += 1, Ff()); +function qf(e = null) { + Uf() && Gf(Wf(e)) && (Mf += 1, Hf()); } -function Vf() { - Tf = 0, Of.clear(), Ff(); +function Jf() { + Mf = 0, Ff.clear(), Hf(); } // ui/features/runtime/pendingGeneratedAssets.ts -var Hf = 0; -function Uf(e = 1) { +var Yf = 0; +function Xf(e = 1) { let t = Math.max(1, Number(e) || 1); - Hf += t; + Yf += t; try { - window.__mjrPendingGeneratedAssetCount = Hf; + window.__mjrPendingGeneratedAssetCount = Yf; } catch {} - return Hf; + return Yf; } -function Wf() { - let e = Hf; - Hf = 0; +function Zf() { + let e = Yf; + Yf = 0; try { window.__mjrPendingGeneratedAssetCount = 0; } catch {} return e; } // ui/features/runtime/registerRealtimeListeners.ts -var Gf = 3e4, Kf = /* @__PURE__ */ new Map(), qf = "live"; -function Jf(e) { +var Qf = 3e4, $f = /* @__PURE__ */ new Map(), ep = "live"; +function tp(e) { return e === !0 || e === 1 || e === "1" ? !0 : e === !1 || e === 0 || e === "0" ? !1 : null; } -function Yf(e) { +function np(e) { let t = [ e?.has_ai_vector, e?.hasAiVector, @@ -10259,25 +10289,25 @@ function Yf(e) { e?.vectorIndexed ]; for (let e of t) { - let t = Jf(e); + let t = tp(e); if (t !== null) return t; } return !1; } -function Xf(e) { - let t = Date.now(), n = Number(Kf.get(e) || 0); - if (n > 0 && t - n < Gf) return !0; - if (Kf.set(e, t), Kf.size > 500) { - let e = t - 5 * Gf; - for (let [t, n] of Kf.entries()) Number(n) < e && Kf.delete(t); +function rp(e) { + let t = Date.now(), n = Number($f.get(e) || 0); + if (n > 0 && t - n < Qf) return !0; + if ($f.set(e, t), $f.size > 500) { + let e = t - 5 * Qf; + for (let [t, n] of $f.entries()) Number(n) < e && $f.delete(t); } return !1; } -function Zf(e) { +function ip(e) { let t = String(e?.id || "").trim(); - t && (Yf(e) || Xf(t) || ge(t).catch((e) => console.debug?.("[Majoor] auto vector index failed", e))); + t && (np(e) || rp(t) || ge(t).catch((e) => console.debug?.("[Majoor] auto vector index failed", e))); } -function Qf(e) { +function ap(e) { let t = String(e?.kind || "").trim().toLowerCase(); if (t) return t; let n = String(e?.filename || e?.filepath || e?.path || e?.fullpath || "").trim(), r = n.includes(".") && n.split(".").pop()?.toLowerCase?.() || ""; @@ -10325,8 +10355,8 @@ function Qf(e) { "spz" ].includes(r) ? "model3d" : "unknown" : ""; } -function $f(e, { jobId: t = "" } = {}) { - let n = String(e?.filename || "").trim(), r = String(e?.filepath || e?.path || e?.fullpath || e?.full_path || "").trim(), i = String(e?.subfolder || e?.sub_folder || e?.subFolder || "").trim(), a = String(e?.type || e?.source || "output").trim().toLowerCase(), o = String(e?.root_id || e?.custom_root_id || "").trim(), s = Qf(e); +function op(e, { jobId: t = "" } = {}) { + let n = String(e?.filename || "").trim(), r = String(e?.filepath || e?.path || e?.fullpath || e?.full_path || "").trim(), i = String(e?.subfolder || e?.sub_folder || e?.subFolder || "").trim(), a = String(e?.type || e?.source || "output").trim().toLowerCase(), o = String(e?.root_id || e?.custom_root_id || "").trim(), s = ap(e); if (!s || !n && !r) return null; let c = n || r.split(/[/\\]/).filter(Boolean).pop() || ""; if (!c) return null; @@ -10337,7 +10367,7 @@ function $f(e, { jobId: t = "" } = {}) { c ].map((e) => String(e || "").trim().toLowerCase()).join("|"), d = Date.now() / 1e3, f = String(e?.job_id || t || "").trim(); return { - id: `${qf}:${u || l.toLowerCase()}`, + id: `${ep}:${u || l.toLowerCase()}`, filename: c, filepath: l, path: l, @@ -10360,7 +10390,7 @@ function $f(e, { jobId: t = "" } = {}) { _mjrLiveLabel: "In progress" }; } -function ep(e) { +function sp(e) { let t = String(e || ""); try { if (typeof CSS < "u" && typeof CSS.escape == "function") return CSS.escape(t); @@ -10369,11 +10399,11 @@ function ep(e) { } return t.replace(/([!"#$%&'()*+,./:;<=>?@[\\\]^`{|}~])/g, "\\$1"); } -function tp(e, t) { +function cp(e, t) { let n = String(e || "").trim().toLowerCase(); return n === "delete_db" ? t("btn.deleteDb", "Delete DB") : n === "reset_index" ? t("btn.resetIndex", "Reset index") : n === "restore_db" ? t("btn.dbRestore", "Restore DB") : t("btn.maintenance", "Maintenance"); } -function np(e, t) { +function lp(e, t) { let n = String(e || "").trim().toLowerCase(), r = String(t || "").trim().toLowerCase(), i = { delete_db: [ "started", @@ -10407,7 +10437,7 @@ function np(e, t) { label: r.replace(/[_-]+/g, " ") }; } -async function rp({ api: e, runtime: t, executionRuntime: n, appRef: r, liveStreamModule: i, ensureExecutionRuntime: a, emitRuntimeStatus: o, getActiveGridContainer: s, pushGeneratedAsset: c, upsertAsset: l, upsertAssetNow: u, removeAssetsFromGrid: d, getEnrichmentState: f, setEnrichmentState: p, comfyToast: m, t: h, reportError: g, registerCleanableListener: _, syncExecutionBackendState: v }) { +async function up({ api: e, runtime: t, executionRuntime: n, appRef: r, liveStreamModule: i, ensureExecutionRuntime: a, emitRuntimeStatus: o, getActiveGridContainer: s, pushGeneratedAsset: c, upsertAsset: l, upsertAssetNow: u, removeAssetsFromGrid: d, getEnrichmentState: f, setEnrichmentState: p, comfyToast: m, t: h, reportError: g, registerCleanableListener: _, syncExecutionBackendState: v }) { e._mjrExecutedHandler = (e) => { try { n.handleExecutedEvent(e, { appRef: r }); @@ -10471,7 +10501,7 @@ async function rp({ api: e, runtime: t, executionRuntime: n, appRef: r, liveStre function b(e, t, { immediate: n = !1, force: r = !1 } = {}) { let i = String(t?.id || "").trim(), a = String(t?.kind || "").trim(), o = String(t?.filename || "").trim(), s = String(t?.filepath || "").trim(), c = !!a && (!!o || !!s), d = !1; if (i) try { - d = typeof e?._mjrHasAssetId == "function" ? !!e._mjrHasAssetId(i) : !!e.querySelector(`.mjr-asset-card[data-mjr-asset-id="${ep(i)}"]`); + d = typeof e?._mjrHasAssetId == "function" ? !!e._mjrHasAssetId(i) : !!e.querySelector(`.mjr-asset-card[data-mjr-asset-id="${sp(i)}"]`); } catch (e) { console.debug?.(e); } @@ -10500,7 +10530,7 @@ async function rp({ api: e, runtime: t, executionRuntime: n, appRef: r, liveStre if (n !== "output" && n !== "all") return; let r = Array.isArray(e?.detail?.files) ? e.detail.files : [], i = String(e?.detail?.prompt_id || e?.detail?.promptId || "").trim(); for (let e of r) { - let n = $f(e, { jobId: i }); + let n = op(e, { jobId: i }); n && b(t, n, { immediate: !0, force: !0 @@ -10515,19 +10545,19 @@ async function rp({ api: e, runtime: t, executionRuntime: n, appRef: r, liveStre let t = n.prepareLiveAssetEvent(e.detail), r = t?.detail || e.detail; if (t?.defer) return; let i = n.isRenderableLiveAsset(r); - i && c(r), Zf(r); + i && c(r), ip(r); let a = s(); if (!a) { - i && Uf(); + i && Xf(); return; } let o = a.dataset?.mjrScope || "output"; if (o !== "output" && o !== "all") { - i && Uf(); + i && Xf(); return; } let l = a.dataset?.mjrQuery || "*"; - String(l).trim() === "*" && i ? b(a, r, { immediate: !0 }) || Uf() : i && Uf(); + String(l).trim() === "*" && i ? b(a, r, { immediate: !0 }) || Xf() : i && Xf(); } catch (e) { g(e, "entry.asset_added"); } @@ -10621,7 +10651,7 @@ async function rp({ api: e, runtime: t, executionRuntime: n, appRef: r, liveStre if (window.dispatchEvent(new CustomEvent(V.ASSET_INDEXED, { detail: t })), !t) return; let r = n.prepareLiveAssetEvent(t), i = r?.detail || t; if (r?.defer) return; - n.isRenderableLiveAsset(i) && (c(i), Bf(i)), Zf(i); + n.isRenderableLiveAsset(i) && (c(i), qf(i)), ip(i); let a = s(); if (!a) return; b(a, i, { @@ -10656,11 +10686,11 @@ async function rp({ api: e, runtime: t, executionRuntime: n, appRef: r, liveStre if (!s) return; let c = r === "error" || n === "failed" ? "error" : n === "done" ? "success" : "info", l = { history: { trackId: `maintenance:${String(i || "db_restore").trim().toLowerCase() || "db_restore"}`, - title: tp(i, h), + title: cp(i, h), detail: s, status: n, operation: String(i || "db_restore").trim().toLowerCase(), - progress: np(i, n), + progress: lp(i, n), source: String(t?.name || "").trim() || "maintenance", forceStore: !0 } }; @@ -10690,7 +10720,7 @@ async function rp({ api: e, runtime: t, executionRuntime: n, appRef: r, liveStre _(t, window, V.ASSETS_DELETED, S), t && typeof t == "object" && (t.api = e, t.assetsDeletedHandler = S), console.debug("[Majoor] Real-time listener registered"); } // ui/features/runtime/entryDebugApi.ts -function ip({ resolveNodeStreamModule: e }) { +function dp({ resolveNodeStreamModule: e }) { typeof window < "u" && (window.MajoorDebug = { exportMetrics: () => window.MajoorMetrics?.exportMetrics?.(), getMetrics: () => window.MajoorMetrics?.getMetricsReport?.(), @@ -10705,16 +10735,16 @@ function ip({ resolveNodeStreamModule: e }) { }, console.debug?.("[Majoor] NodeStream API: window.MajoorNodeStream.mode, .listAdapters(), .getKnownNodeSets()")); } // ui/features/runtime/benignConsoleNoise.ts -var ap = ["ResizeObserver loop completed with undelivered notifications.", "ResizeObserver loop limit exceeded"]; -function op(e) { +var fp = ["ResizeObserver loop completed with undelivered notifications.", "ResizeObserver loop limit exceeded"]; +function pp(e) { try { let t = String(e?.message || e || ""); - return ap.some((e) => t.includes(e)); + return fp.some((e) => t.includes(e)); } catch { return !1; } } -function sp() { +function mp() { if (typeof window > "u") return null; try { window.__MJR_BENIGN_CONSOLE_NOISE_FILTER__?.abort?.(); @@ -10729,7 +10759,7 @@ function sp() { } let t = (e) => { try { - if (!op(e?.message || e?.error)) return; + if (!pp(e?.message || e?.error)) return; e.preventDefault?.(), e.stopImmediatePropagation?.(); } catch (e) { console.debug?.(e); @@ -10754,7 +10784,7 @@ function sp() { return window.__MJR_BENIGN_CONSOLE_NOISE_FILTER__ = r, r; } // ui/features/geninfo/genInfoOverridePicker.ts -var cp = "Majoor.GenInfoOverridePicker", lp = "MajoorGenInfoOverride", up = R("genInfoOverride.autoFillFromWorkflow", "Auto fill from workflow"), dp = R("genInfoOverride.pick", "Pick"), fp = { +var hp = "Majoor.GenInfoOverridePicker", gp = "MajoorGenInfoOverride", _p = R("genInfoOverride.autoFillFromWorkflow", "Auto fill from workflow"), vp = R("genInfoOverride.pick", "Pick"), yp = { positive_prompt: [ "positive_prompt", "prompt", @@ -10777,7 +10807,7 @@ var cp = "Majoor.GenInfoOverridePicker", lp = "MajoorGenInfoOverride", up = R("g ], vae: ["vae", "vae_name"], clip: ["clip", "clip_name"] -}, pp = [ +}, bp = [ { field: "positive_prompt", label: "prompt" @@ -10822,14 +10852,14 @@ var cp = "Majoor.GenInfoOverridePicker", lp = "MajoorGenInfoOverride", up = R("g field: "denoise", label: "denoise" } -], mp = 0x10000000000000000, hp = !1, gp = !1; -function _p(e, t) { +], xp = 0x10000000000000000, Sp = !1, Cp = !1; +function wp(e, t) { let n = (e.widgets ?? []).find((e) => e?.name === t); if (n && n.value !== void 0 && n.value !== null && String(n.value).trim() !== "") return n.value; let r = Array.isArray(e.widgets_values) ? e.widgets_values : [], i = (Array.isArray(e.widgets) ? e.widgets : []).findIndex((e) => e?.name === t); return i >= 0 ? r[i] : void 0; } -function vp(e, t, n, r, i) { +function Tp(e, t, n, r, i) { if (r == null || String(r).trim() === "") return; let a = `${n}:${String(r).trim()}`; t.has(a) || (t.add(a), e.push({ @@ -10839,42 +10869,42 @@ function vp(e, t, n, r, i) { source: i })); } -function yp(e, t, n) { +function Ep(e, t, n) { let r = t.toLowerCase(); - return !!((fp[e] ?? [e]).some((e) => r === e || r.includes(e)) || e === "positive_prompt" && r === "text" && n.toLowerCase().includes("positive") || e === "negative_prompt" && (r.includes("negative") || n.toLowerCase().includes("negative"))); + return !!((yp[e] ?? [e]).some((e) => r === e || r.includes(e)) || e === "positive_prompt" && r === "text" && n.toLowerCase().includes("positive") || e === "negative_prompt" && (r.includes("negative") || n.toLowerCase().includes("negative"))); } -function bp(e, t = null) { +function Dp(e, t = null) { let n = [], r = /* @__PURE__ */ new Set(); for (let { graph: i, label: a } of ht(e)) for (let e of pt(i)) { - if (String(e?.comfyClass || e?.type || "") === lp) continue; + if (String(e?.comfyClass || e?.type || "") === gp) continue; let i = String(e?.title || e?.comfyClass || e?.type || `Node ${e?.id ?? ""}`).trim(), o = a === "Workflow" ? i : `${a} / ${i}`; - for (let [t, i] of Object.entries(fp)) for (let a of i) vp(n, r, t, _p(e, a), o); + for (let [t, i] of Object.entries(yp)) for (let a of i) Tp(n, r, t, wp(e, a), o); let s = Array.isArray(e.widgets) ? e.widgets : [], c = Array.isArray(e.widgets_values) ? e.widgets_values : []; s.forEach((e, a) => { let s = String(e?.name || "").toLowerCase(), l = e?.value ?? c[a]; - s.includes("positive") || s === "text" && String(i).toLowerCase().includes("positive") ? vp(n, r, "positive_prompt", l, o) : s.includes("negative") && vp(n, r, "negative_prompt", l, o), t && yp(t, s, i) && vp(n, r, t, l, `${o} / ${e?.name || `widget ${a + 1}`}`); + s.includes("positive") || s === "text" && String(i).toLowerCase().includes("positive") ? Tp(n, r, "positive_prompt", l, o) : s.includes("negative") && Tp(n, r, "negative_prompt", l, o), t && Ep(t, s, i) && Tp(n, r, t, l, `${o} / ${e?.name || `widget ${a + 1}`}`); }); } return t ? n.filter((e) => e.field === t).slice(0, 120) : n.slice(0, 80); } -function xp(e, t) { +function Op(e, t) { return (e.widgets ?? []).find((e) => e?.name === t); } -function Sp(e) { - let t = xp(e, "seed"); +function kp(e) { + let t = Op(e, "seed"); t && (t.options = { ...t.options ?? {}, min: -1, - max: mp, + max: xp, control_after_generate: !1 }); } -function Cp(e, t) { +function Ap(e, t) { return t === "positive_prompt" ? e?.prompt ?? e?.positive_prompt : t === "negative_prompt" ? e?.negative_prompt ?? e?.negative : t === "loras_json" && Array.isArray(e?.loras) ? JSON.stringify(e.loras) : t === "custom_info_json" && Array.isArray(e?.custom_info) ? JSON.stringify(e.custom_info) : e?.[t]; } -function wp(e, t) { +function jp(e, t) { if (!e || !t || typeof t != "object") return 0; - Sp(e); + kp(e); let n = 0; for (let r of [ "positive_prompt", @@ -10892,16 +10922,16 @@ function wp(e, t) { "workflow_notes", "custom_info_json" ]) { - let i = Cp(t, r); + let i = Ap(t, r); if (i == null) continue; - let a = xp(e, r); - a && (Tp(a, i, e, r), Ep(a, i), n += 1); + let a = Op(e, r); + a && (Mp(a, i, e, r), Np(a, i), n += 1); } return n; } -function Tp(e, t, n, r) { +function Mp(e, t, n, r) { if (r !== "seed") { - qn(e, t, n); + Kn(e, t, n); return; } let i = Number(t); @@ -10909,7 +10939,7 @@ function Tp(e, t, n, r) { e.options = { ...e.options ?? {}, min: -1, - max: mp, + max: xp, control_after_generate: !1 }, e.value = Math.trunc(i); try { @@ -10917,7 +10947,7 @@ function Tp(e, t, n, r) { } catch {} } } -function Ep(e, t) { +function Np(e, t) { let n = String(t ?? ""), r = [ e?.inputEl, e?.element, @@ -10930,60 +10960,60 @@ function Ep(e, t) { e.value = n; } catch {} } -function Dp(e, t, n) { - let r = Mp({ detail: { output: t } }); - if (r && wp(e, r)) try { +function Pp(e, t, n) { + let r = zp({ detail: { output: t } }); + if (r && jp(e, r)) try { e.setSize?.(e.computeSize?.()), e.graph?.setDirtyCanvas?.(!0, !0), e.graph?.change?.(), n?.graph?.setDirtyCanvas?.(!0, !0), n?.graph?.change?.(), n?.canvas?.setDirty?.(!0, !0), n?.canvas?.draw?.(!0, !0); } catch {} } -function Op(e, t, n = null) { - let r = n || t.field, i = xp(e, r); - i && (Tp(i, t.value, e, r), Ep(i, t.value)); +function Fp(e, t, n = null) { + let r = n || t.field, i = Op(e, r); + i && (Mp(i, t.value, e, r), Np(i, t.value)); } -function kp(e) { +function Ip(e) { return !e || e.value === void 0 || e.value === null || String(e.value).trim() === ""; } -function Ap(t, n) { - let r = bp(n), i = 0; - for (let e of Object.keys(fp)) { - let n = xp(t, e); - if (!n || !kp(n)) continue; +function Lp(t, n) { + let r = Dp(n), i = 0; + for (let e of Object.keys(yp)) { + let n = Op(t, e); + if (!n || !Ip(n)) continue; let a = r.find((t) => t.field === e); - a && (Tp(n, a.value, t, e), Ep(n, a.value), i += 1); + a && (Mp(n, a.value, t, e), Np(n, a.value), i += 1); } return n?.graph?.setDirtyCanvas?.(!0, !0), n?.graph?.change?.(), e({ summary: "Majoor Gen Info", detail: i ? `Filled ${i} empty override fields.` : "No empty matching fields found." }, i ? "success" : "warning", 3e3), i; } -function jp(e, t) { - if (e && String(e?.comfyClass || e?.type || "") === lp && (Sp(e), !(e.widgets ?? []).some((e) => e?.name === up) && typeof e.addWidget == "function")) { - e.addWidget("button", up, null, () => Ap(e, t)); - for (let n of pp) { - let r = `${dp} ${n.label}`; - (e.widgets ?? []).some((e) => e?.name === r) || e.addWidget("button", r, null, () => Pp(e, t, n.field)); +function Rp(e, t) { + if (e && String(e?.comfyClass || e?.type || "") === gp && (kp(e), !(e.widgets ?? []).some((e) => e?.name === _p) && typeof e.addWidget == "function")) { + e.addWidget("button", _p, null, () => Lp(e, t)); + for (let n of bp) { + let r = `${vp} ${n.label}`; + (e.widgets ?? []).some((e) => e?.name === r) || e.addWidget("button", r, null, () => Vp(e, t, n.field)); } try { e.setSize?.(e.computeSize?.()), t?.graph?.setDirtyCanvas?.(!0, !0); } catch {} } } -function Mp(e) { +function zp(e) { let t = e?.detail?.output, n = t?.majoor_geninfo_override ?? t?.ui?.majoor_geninfo_override, r = Array.isArray(n) ? n[0] : n; return r && typeof r == "object" ? r : null; } -function Np(e) { - if (gp) return; +function Bp(e) { + if (Cp) return; let t = e?.api; - t && typeof t.addEventListener == "function" && (gp = !0, t.addEventListener("executed", (t) => { + t && typeof t.addEventListener == "function" && (Cp = !0, t.addEventListener("executed", (t) => { let n = t?.detail?.node ?? t?.detail?.display_node; if (!n) return; let r = mt(e, n); - r && String(r?.comfyClass || r?.type || "") === lp && Dp(r, t?.detail?.output, e); + r && String(r?.comfyClass || r?.type || "") === gp && Pp(r, t?.detail?.output, e); })); } -function Pp(t, n, r = null) { - let i = bp(n, r); +function Vp(t, n, r = null) { + let i = Dp(n, r); if (!i.length) { e({ summary: "Majoor Gen Info", @@ -11004,45 +11034,45 @@ function Pp(t, n, r = null) { for (let e of i) { let n = document.createElement("button"); n.type = "button", n.style.cssText = "width:100%;display:grid;grid-template-columns:130px 1fr 150px;gap:8px;text-align:left;background:#2b2b2b;color:#eee;border:1px solid #3d3d3d;border-radius:5px;padding:7px;margin:5px 0;cursor:pointer", n.innerHTML = `${e.label}`, n.children[1].textContent = String(e.value), n.children[2].textContent = e.source, n.onclick = () => { - Op(t, e, r), a.remove(); + Fp(t, e, r), a.remove(); }, o.appendChild(n); } a.appendChild(o), o.querySelector("[data-close]")?.addEventListener("click", () => a.remove()), a.addEventListener("click", (e) => { e.target === a && a.remove(); }), document.body.appendChild(a); } -function Fp(e, t) { - if (String(e?.comfyClass || e?.type || "") !== lp) return []; +function Hp(e, t) { + if (String(e?.comfyClass || e?.type || "") !== gp) return []; let n = [{ content: R("genInfoOverride.pickFromWorkflow", "Pick Gen Info from workflow"), - callback: () => Pp(e, t) + callback: () => Vp(e, t) }]; - for (let r of pp) n.push({ + for (let r of bp) n.push({ content: `Pick ${r.label}`, - callback: () => Pp(e, t, r.field) + callback: () => Vp(e, t, r.field) }); return n.push({ - content: up, - callback: () => Ap(e, t) + content: _p, + callback: () => Lp(e, t) }), n; } -function Ip(e = null) { - if (hp) return; +function Up(e = null) { + if (Sp) return; let t = e || Qe(); - !t || typeof t.registerExtension != "function" ? setTimeout(() => Ip(e), 100) : (hp = !0, Np(t), t.registerExtension({ - name: cp, + !t || typeof t.registerExtension != "function" ? setTimeout(() => Up(e), 100) : (Sp = !0, Bp(t), t.registerExtension({ + name: hp, async nodeCreated(e) { - jp(e, t); + Rp(e, t); }, getNodeMenuItems(e) { - return Fp(e, t); + return Hp(e, t); } }), setTimeout(() => { - for (let { graph: e } of ht(t)) for (let n of pt(e)) jp(n, t); + for (let { graph: e } of ht(t)) for (let n of pt(e)) Rp(n, t); }, 0)); } // ui/vue/composables/useDragDrop.ts -function Lp() { +function Wp() { let e = null; Mr(() => { try { @@ -11050,7 +11080,7 @@ function Lp() { } catch (e) { console.warn("[Majoor] useDragDrop: init failed", e); } - }), ir(() => { + }), rr(() => { try { e?.({ force: !0 }); } catch (e) { @@ -11065,10 +11095,10 @@ function Lp() { }); } // ui/vue/GlobalRuntime.vue -var Rp = /* @__PURE__ */ fr({ +var Gp = /* @__PURE__ */ dr({ __name: "GlobalRuntime", setup(e) { - let t = dr(() => import("./chunks/ViewerPortal-CeOkTVnX.js")), n = Q(!1), r = [ + let t = ur(() => import("./chunks/ViewerPortal-D964vdje.js")), n = Q(!1), r = [ V.OPEN_VIEWER, V.MFV_OPEN, V.MFV_TOGGLE, @@ -11081,7 +11111,7 @@ var Rp = /* @__PURE__ */ fr({ if (n.value) return; n.value = !0; let t = String(e?.type || ""), r = e?.detail ?? null; - t && t !== V.OPEN_VIEWER && ur(() => { + t && t !== V.OPEN_VIEWER && lr(() => { try { window.dispatchEvent(new CustomEvent(t, { detail: r })); } catch (e) { @@ -11089,21 +11119,21 @@ var Rp = /* @__PURE__ */ fr({ } }); } - return Lp(), Mr(() => { + return Wp(), Mr(() => { for (let e of r) try { window.addEventListener(e, i, { once: !1 }); } catch (e) { console.debug?.(e); } - }), ir(() => { + }), rr(() => { for (let e of r) try { window.removeEventListener(e, i); } catch (e) { console.debug?.(e); } - }), (e, r) => n.value ? (q(), ar(Z(t), { key: 0 })) : G("", !0); + }), (e, r) => n.value ? (q(), ir(Z(t), { key: 0 })) : G("", !0); } -}), zp = { +}), Kp = { gridRenderCount: 0, gridRenderTotalMs: 0, searchQueryCount: 0, @@ -11114,20 +11144,20 @@ var Rp = /* @__PURE__ */ fr({ thumbnailLoadCount: 0, thumbnailLoadFailures: 0, errorCounts: {} -}, Bp = /* @__PURE__ */ new Map(); -function Vp(e) { +}, qp = /* @__PURE__ */ new Map(); +function Jp(e) { let t = performance.now(); - Bp.set(e, t); + qp.set(e, t); try { performance.mark(`${e}-start`); } catch {} } -function Hp(e, t) { - let n = Bp.get(e); +function Yp(e, t) { + let n = qp.get(e); if (!n) return console.warn(`[Majoor Metrics] Timer not found: ${e}`), 0; let r = performance.now() - n; - if (Bp.delete(e), t) { - let e = `${t}Count`, n = `${t}TotalMs`, i = zp; + if (qp.delete(e), t) { + let e = `${t}Count`, n = `${t}TotalMs`, i = Kp; typeof i[e] == "number" && (i[e]++, i[n] += r); } r > 100 && console.log(`[Majoor Metrics] ${e}: ${r.toFixed(2)}ms`); @@ -11136,15 +11166,15 @@ function Hp(e, t) { } catch {} return r; } -function Up(e) { - return Bp.has(e); +function Xp(e) { + return qp.has(e); } -function Wp(e) { +function Zp(e) { try { performance.mark(`${e}-start`); } catch {} } -function Gp(e) { +function Qp(e) { try { performance.mark(`${e}-end`), performance.measure(e, `${e}-start`, `${e}-end`); let t = performance.getEntriesByName(e)[0]?.duration || 0; @@ -11153,47 +11183,47 @@ function Gp(e) { return null; } } -function Kp(e, t = !1) { - zp.apiCallCount++, zp.apiCallTotalMs += e, t && zp.apiErrorCount++; +function $p(e, t = !1) { + Kp.apiCallCount++, Kp.apiCallTotalMs += e, t && Kp.apiErrorCount++; } -function qp(e) { - zp.gridRenderCount++, zp.gridRenderTotalMs += e; +function em(e) { + Kp.gridRenderCount++, Kp.gridRenderTotalMs += e; } -function Jp(e) { - zp.searchQueryCount++, zp.searchQueryTotalMs += e; +function tm(e) { + Kp.searchQueryCount++, Kp.searchQueryTotalMs += e; } -function Yp(e) { - zp.thumbnailLoadCount++, e || zp.thumbnailLoadFailures++; +function nm(e) { + Kp.thumbnailLoadCount++, e || Kp.thumbnailLoadFailures++; } -function Xp(e, t) { - zp.errorCounts[e] = (zp.errorCounts[e] || 0) + 1; +function rm(e, t) { + Kp.errorCounts[e] = (Kp.errorCounts[e] || 0) + 1; } -function Zp() { +function im() { return { - ...zp, + ...Kp, averages: { - gridRenderMs: zp.gridRenderCount > 0 ? zp.gridRenderTotalMs / zp.gridRenderCount : 0, - searchQueryMs: zp.searchQueryCount > 0 ? zp.searchQueryTotalMs / zp.searchQueryCount : 0, - apiCallMs: zp.apiCallCount > 0 ? zp.apiCallTotalMs / zp.apiCallCount : 0 + gridRenderMs: Kp.gridRenderCount > 0 ? Kp.gridRenderTotalMs / Kp.gridRenderCount : 0, + searchQueryMs: Kp.searchQueryCount > 0 ? Kp.searchQueryTotalMs / Kp.searchQueryCount : 0, + apiCallMs: Kp.apiCallCount > 0 ? Kp.apiCallTotalMs / Kp.apiCallCount : 0 }, rates: { - apiErrorRate: zp.apiCallCount > 0 ? (zp.apiErrorCount / zp.apiCallCount * 100).toFixed(2) + "%" : "0%", - thumbnailFailureRate: zp.thumbnailLoadCount > 0 ? (zp.thumbnailLoadFailures / zp.thumbnailLoadCount * 100).toFixed(2) + "%" : "0%" + apiErrorRate: Kp.apiCallCount > 0 ? (Kp.apiErrorCount / Kp.apiCallCount * 100).toFixed(2) + "%" : "0%", + thumbnailFailureRate: Kp.thumbnailLoadCount > 0 ? (Kp.thumbnailLoadFailures / Kp.thumbnailLoadCount * 100).toFixed(2) + "%" : "0%" } }; } -function Qp(e) { - let t = `${e}Count`, n = `${e}TotalMs`, r = zp, i = r[t], a = r[n]; +function am(e) { + let t = `${e}Count`, n = `${e}TotalMs`, r = Kp, i = r[t], a = r[n]; return i > 0 ? a / i : 0; } -function $p() { - let e = zp; +function om() { + let e = Kp; Object.keys(e).forEach((t) => { typeof e[t] == "number" ? e[t] = 0 : typeof e[t] == "object" && (e[t] = {}); - }), Bp.clear(), console.log("[Majoor Metrics] Metrics reset"); + }), qp.clear(), console.log("[Majoor Metrics] Metrics reset"); } -function em() { - let e = Zp(); +function sm() { + let e = im(); console.group("[Majoor Assets Manager] Performance Metrics"), console.table({ "Grid Renders": e.gridRenderCount, "Avg Grid Render": `${e.averages.gridRenderMs.toFixed(2)}ms`, @@ -11206,26 +11236,26 @@ function em() { "Thumbnail Loads": e.thumbnailLoadCount, "Thumbnail Failures": e.thumbnailLoadFailures, "Failure Rate": e.rates.thumbnailFailureRate - }), Object.keys(zp.errorCounts).length > 0 && console.log("Error Counts:", zp.errorCounts), console.groupEnd(); + }), Object.keys(Kp.errorCounts).length > 0 && console.log("Error Counts:", Kp.errorCounts), console.groupEnd(); } typeof window < "u" && (window.MajoorMetrics = { - startTimer: Vp, - endTimer: Hp, - hasTimer: Up, - mark: Wp, - measure: Gp, - trackApiCall: Kp, - trackGridRender: qp, - trackSearchQuery: Jp, - trackThumbnailLoad: Yp, - trackError: Xp, - getMetricsReport: Zp, - getAverageDuration: Qp, - resetMetrics: $p, - exportMetrics: em + startTimer: Jp, + endTimer: Yp, + hasTimer: Xp, + mark: Zp, + measure: Qp, + trackApiCall: $p, + trackGridRender: em, + trackSearchQuery: tm, + trackThumbnailLoad: nm, + trackError: rm, + getMetricsReport: im, + getAverageDuration: am, + resetMetrics: om, + exportMetrics: sm }); // ui/features/status/StatusDot.ts -var tm = [{ +var cm = [{ key: "exiftool", labelKey: "tool.exiftool", hintKey: "tool.exiftool.hint" @@ -11233,24 +11263,24 @@ var tm = [{ key: "ffprobe", labelKey: "tool.ffprobe", hintKey: "tool.ffprobe.hint" -}], nm = !1, rm = null, im = null, am = "__MJR_STATUS_DOT_CACHE__", om = { +}], lm = !1, um = null, dm = null, fm = "__MJR_STATUS_DOT_CACHE__", pm = { ACTIVE: "active", COOLDOWN: "cooldown", IDLE: "idle" -}, sm = { - [om.ACTIVE]: 2e3, - [om.COOLDOWN]: 1e4, - [om.IDLE]: 6e4 +}, mm = { + [pm.ACTIVE]: 2e3, + [pm.COOLDOWN]: 1e4, + [pm.IDLE]: 6e4 }; -function cm(e) { - nm = !!e; +function hm(e) { + lm = !!e; try { - globalThis._mjrMaintenanceActive = nm; + globalThis._mjrMaintenanceActive = lm; } catch (e) { console.debug?.(e); } } -function lm(e) { +function gm(e) { let t = Number(e); if (!Number.isFinite(t) || t <= 0) return "0 B"; let n = [ @@ -11264,7 +11294,7 @@ function lm(e) { let a = r >= 100 ? 0 : r >= 10 ? 1 : 2; return `${r.toFixed(a)} ${n[i]}`; } -function um(e, t, n = null) { +function _m(e, t, n = null) { if (e && (e.replaceChildren(), (Array.isArray(t) ? t.filter((e) => e != null && String(e).trim() !== "") : []).forEach((t, n) => { n > 0 && e.appendChild(document.createElement("br")), e.appendChild(document.createTextNode(String(t))); }), n != null && String(n).trim() !== "")) { @@ -11273,7 +11303,7 @@ function um(e, t, n = null) { t.style.fontSize = "11px", t.style.opacity = "0.6", t.textContent = String(n), e.appendChild(t); } } -function dm(e, t = []) { +function vm(e, t = []) { if (!e) return; let n = Array.isArray(t) ? t.filter((e) => e && String(e.label || "").trim()) : []; if (!n.length) return; @@ -11293,7 +11323,7 @@ function dm(e, t = []) { } e.appendChild(r); } -function fm(e, { totalAssets: t = 0, withWorkflows: n = 0, withGenerationData: r = 0 } = {}) { +function ym(e, { totalAssets: t = 0, withWorkflows: n = 0, withGenerationData: r = 0 } = {}) { let i = Math.max(0, Number(t || e?.total_assets || 0) || 0); if (i <= 0) return []; let a = (e, t = i) => { @@ -11339,13 +11369,13 @@ function fm(e, { totalAssets: t = 0, withWorkflows: n = 0, withGenerationData: r } : null ].filter(Boolean); } -function pm(e, t, n) { +function bm(e, t, n) { if (!e) return; e.replaceChildren(), e.appendChild(document.createTextNode(String(t || ""))), e.appendChild(document.createElement("br")); let r = document.createElement("span"); r.style.fontSize = "11px", r.style.opacity = "0.7", r.textContent = String(n || ""), e.appendChild(r); } -function mm(t, n = "neutral", r = {}) { +function xm(t, n = "neutral", r = {}) { if (!t) return; let i = r?.toast !== !1, a = { neutral: { @@ -11411,23 +11441,23 @@ function mm(t, n = "neutral", r = {}) { } } } -function hm(e) { +function Sm(e) { let t = String(e || "").toLowerCase(); return t === "all" ? R("scope.allFull", "All (Inputs + Outputs)") : t === "input" || t === "inputs" ? R("scope.input", "Inputs") : t === "custom" ? R("scope.custom", "Browser") : t === "workflow" ? R("scope.workflow", "Workflow") : R("scope.output", "Outputs"); } -function gm(e, t = "") { - if (!e || typeof e != "object") return t ? R("status.watcher.disabledScoped", "Watcher: disabled ({scope})", { scope: hm(t) }) : R("status.watcher.disabled", "Watcher: disabled"); +function Cm(e, t = "") { + if (!e || typeof e != "object") return t ? R("status.watcher.disabledScoped", "Watcher: disabled ({scope})", { scope: Sm(t) }) : R("status.watcher.disabled", "Watcher: disabled"); let n = !!e.enabled, r = e.scope ? String(e.scope) : ""; - return n ? r ? R("status.watcher.enabledScoped", `Watcher: enabled (${r})`, { scope: hm(r) }) : R("status.watcher.enabled", "Watcher: enabled") : r || t ? R("status.watcher.disabledScoped", "Watcher: disabled ({scope})", { scope: hm(t && r && r !== t ? t : r || t) }) : R("status.watcher.disabled", "Watcher: disabled"); + return n ? r ? R("status.watcher.enabledScoped", `Watcher: enabled (${r})`, { scope: Sm(r) }) : R("status.watcher.enabled", "Watcher: enabled") : r || t ? R("status.watcher.disabledScoped", "Watcher: disabled ({scope})", { scope: Sm(t && r && r !== t ? t : r || t) }) : R("status.watcher.disabled", "Watcher: disabled"); } -function _m(e = "status-action") { +function wm(e = "status-action") { try { window?.dispatchEvent?.(new CustomEvent("mjr:reload-grid", { detail: { reason: String(e || "status-action") } })); } catch (e) { console.debug?.(e); } } -function vm(e = "status-action", t = {}) { +function Tm(e = "status-action", t = {}) { try { window?.dispatchEvent?.(new CustomEvent("mjr-grid-dirty", { detail: { reason: String(e || "status-action"), @@ -11437,14 +11467,14 @@ function vm(e = "status-action", t = {}) { console.debug?.(e); } } -async function ym(e = "") { - return await Wt(R("dialog.vectorsReset.keepQuestion", "Keep existing AI vectors?\n\nConfirm = keep vectors\nCancel = continue without vectors"), e || R("dialog.vectorsReset.title", "AI vectors")); +async function Em(e = "") { + return await Tt(R("dialog.vectorsReset.keepQuestion", "Keep existing AI vectors?\n\nConfirm = keep vectors\nCancel = continue without vectors"), e || R("dialog.vectorsReset.title", "AI vectors")); } -function bm(t = {}) { +function Dm(t = {}) { let n = typeof t?.getScanContext == "function" ? t.getScanContext : null; - cm(!1); + hm(!1); let r = document.createElement("div"); - r.style.cssText = "margin-bottom: 20px; padding: 12px; background: var(--bg-color, #1a1a1a); border-radius: 6px; border: 1px solid var(--border-color, #333); cursor: pointer; transition: all 0.2s;", mm(r, "info", { toast: !1 }); + r.style.cssText = "margin-bottom: 20px; padding: 12px; background: var(--bg-color, #1a1a1a); border-radius: 6px; border: 1px solid var(--border-color, #333); cursor: pointer; transition: all 0.2s;", xm(r, "info", { toast: !1 }); let i = document.createElement("div"); i.style.cssText = "display: flex; align-items: center; gap: 10px; margin-bottom: 8px;"; let a = document.createElement("span"); @@ -11490,7 +11520,7 @@ function bm(t = {}) { for (let t of n) { let n = String(t?.name || ""); if (!n) continue; - let i = Number(t?.mtime || 0), a = Number(t?.size_bytes || 0), o = i > 0 ? (/* @__PURE__ */ new Date(i * 1e3)).toLocaleString() : "", s = `${n}${o ? ` (${o}` : ""}${a > 0 ? `, ${lm(a)}` : ""}${o ? ")" : ""}`, c = document.createElement("option"); + let i = Number(t?.mtime || 0), a = Number(t?.size_bytes || 0), o = i > 0 ? (/* @__PURE__ */ new Date(i * 1e3)).toLocaleString() : "", s = `${n}${o ? ` (${o}` : ""}${a > 0 ? `, ${gm(a)}` : ""}${o ? ")" : ""}`, c = document.createElement("option"); c.value = n, c.textContent = s, e && e === n && (c.selected = !0, r = !0), h.appendChild(c); } g = h.childNodes.length > 0, h.disabled = !g, g && !r && h.childNodes[0] && (h.value = String(h.childNodes[0]?.value || "")), _ && (_.disabled = !g); @@ -11501,16 +11531,16 @@ function bm(t = {}) { y(), m.appendChild(h); let b = document.createElement("button"); b.type = "button", b.textContent = R("btn.dbSave", "Save DB"), b.title = R("status.dbSaveHint", "Save a DB snapshot into archive folder"), b.style.cssText = "\n padding: 5px 10px;\n font-size: 11px;\n border-radius: 6px;\n border: 1px solid rgba(120,200,255,0.35);\n background: transparent;\n color: inherit;\n cursor: pointer;\n ", b.onclick = async (t) => { - t.stopPropagation(), cm(!0); + t.stopPropagation(), hm(!0); let i = b.textContent, o = !!_?.disabled; - b.disabled = !0, _ && (_.disabled = !0), b.textContent = R("btn.saving", "Saving..."), a.style.background = "var(--mjr-status-info, #64B5F6)", mm(r, "info"); + b.disabled = !0, _ && (_.disabled = !0), b.textContent = R("btn.saving", "Saving..."), a.style.background = "var(--mjr-status-info, #64B5F6)", xm(r, "info"); try { let t = await Ee(); if (t?.ok) { let n = String(t?.data?.name || "").trim(), r = Number(t?.data?.size_bytes || 0); e(R("toast.dbSaveSuccess", "Database backup saved"), "success", 2200, { history: { title: R("btn.dbSave", "Save DB"), - detail: n ? `${n}${r > 0 ? ` | ${lm(r)}` : ""}` : R("toast.dbSaveSuccess", "Database backup saved"), + detail: n ? `${n}${r > 0 ? ` | ${gm(r)}` : ""}` : R("toast.dbSaveSuccess", "Database backup saved"), operation: "save_db", source: n || "archive", forceStore: !0 @@ -11519,10 +11549,10 @@ function bm(t = {}) { } catch (t) { e(t?.message || R("toast.dbSaveFailed", "Failed to save DB backup"), "error"); } finally { - cm(!1), b.disabled = !1, _ && (_.disabled = o || !g), b.textContent = i; + hm(!1), b.disabled = !1, _ && (_.disabled = o || !g), b.textContent = i; try { let e = n ? n() : null; - await km(a, d, f, e, null, { force: !0 }); + await Im(a, d, f, e, null, { force: !0 }); } catch (e) { console.debug?.(e); } @@ -11534,7 +11564,7 @@ function bm(t = {}) { e(R("toast.dbRestoreSelect", "Select a DB backup first"), "warning", 2e3); return; } - if (!await Wt(`${R("dialog.dbRestore.confirm", "Restore selected DB backup? Current DB will be replaced.")}\n\n${i}`, R("btn.dbRestore", "Restore DB"))) return; + if (!await Tt(`${R("dialog.dbRestore.confirm", "Restore selected DB backup? Current DB will be replaced.")}\n\n${i}`, R("btn.dbRestore", "Restore DB"))) return; e(R("toast.dbRestoreStarted", "DB restore started"), "info", 1800, { history: { trackId: "maintenance:restore_db", title: R("btn.dbRestore", "Restore DB"), @@ -11543,9 +11573,9 @@ function bm(t = {}) { source: i, status: "started", forceStore: !0 - } }), cm(!0); + } }), hm(!0); let o = _.textContent, s = !!b.disabled; - _.disabled = !0, b.disabled = !0, h.disabled = !0, _.textContent = R("btn.restoring", "Restoring..."), a.style.background = "var(--mjr-status-warning, #FFA726)", mm(r, "warning"); + _.disabled = !0, b.disabled = !0, h.disabled = !0, _.textContent = R("btn.restoring", "Restoring..."), a.style.background = "var(--mjr-status-warning, #FFA726)", xm(r, "warning"); try { let t = await M({ name: i, @@ -11555,10 +11585,10 @@ function bm(t = {}) { } catch (t) { e(t?.message || R("toast.dbRestoreFailed", "Failed to restore DB backup"), "error"); } finally { - cm(!1), _.disabled = !g, b.disabled = s, h.disabled = !g, _.textContent = o, _m("db-restore"); + hm(!1), _.disabled = !g, b.disabled = s, h.disabled = !g, _.textContent = o, wm("db-restore"); try { let e = n ? n() : null; - await km(a, d, f, e, null, { force: !0 }); + await Im(a, d, f, e, null, { force: !0 }); } catch (e) { console.debug?.(e); } @@ -11578,11 +11608,11 @@ function bm(t = {}) { D.style.borderColor = "rgba(255,255,255,0.25)", D.style.background = "transparent"; }, D.onclick = async (e) => { e.stopPropagation(); - let t = await ym(R("btn.resetIndex", "Reset index")); - if (!await Wt(t ? R("dialog.resetIndex.confirmKeepVectors", "This will reset index data and rescan files while keeping existing AI vectors.\n\nContinue?") : R("dialog.resetIndex.msg", "This will delete the database and rescan all files. Continue?"), R("dialog.resetIndex.title", "Reset index?"))) return; - cm(!0); + let t = await Em(R("btn.resetIndex", "Reset index")); + if (!await Tt(t ? R("dialog.resetIndex.confirmKeepVectors", "This will reset index data and rescan files while keeping existing AI vectors.\n\nContinue?") : R("dialog.resetIndex.msg", "This will delete the database and rescan all files. Continue?"), R("dialog.resetIndex.title", "Reset index?"))) return; + hm(!0); let i = D.textContent; - D.disabled = !0, E.disabled = !0, D.textContent = R("btn.resetting"), a.style.background = "var(--mjr-status-info, #64B5F6)", mm(r, "info"); + D.disabled = !0, E.disabled = !0, D.textContent = R("btn.resetting"), a.style.background = "var(--mjr-status-info, #64B5F6)", xm(r, "info"); try { let e = n ? n() : {}, i = String(e?.scope || "output").toLowerCase(), o = e?.customRootId || e?.custom_root_id || e?.root_id || null, s = i === "custom" && !o; (await Oe({ @@ -11597,14 +11627,14 @@ function bm(t = {}) { clear_assets: !t, preserve_vectors: t, rebuild_fts: !0 - }))?.ok ? (a.style.background = "var(--mjr-status-success, #4CAF50)", mm(r, "success")) : (a.style.background = "var(--mjr-status-error, #f44336)", mm(r, "error")); + }))?.ok ? (a.style.background = "var(--mjr-status-success, #4CAF50)", xm(r, "success")) : (a.style.background = "var(--mjr-status-error, #f44336)", xm(r, "error")); } catch { - a.style.background = "var(--mjr-status-error, #f44336)", mm(r, "error"); + a.style.background = "var(--mjr-status-error, #f44336)", xm(r, "error"); } finally { - cm(!1), D.disabled = !1, E.disabled = !1, D.textContent = i, _m("index-reset"); + hm(!1), D.disabled = !1, E.disabled = !1, D.textContent = i, wm("index-reset"); try { let e = n ? n() : null; - await km(a, d, f, e, null, { force: !0 }); + await Im(a, d, f, e, null, { force: !0 }); } catch (e) { console.debug?.(e); } @@ -11622,14 +11652,14 @@ function bm(t = {}) { e(R("status.customBrowserScanDisabledHint", "Use Outputs, Inputs, or All to run indexing scans"), "warning", 2600), T("Backfill skipped - Browser scope has no selected custom root.", "warning"); return; } - let c = o || "output", l = hm(c), u = { history: { + let c = o || "output", l = Sm(c), u = { history: { trackId: `vector-backfill:status:${c}:${s || "default"}`, title: "Vector Backfill", source: l, operation: "vector_backfill", forceStore: !0 } }; - cm(!0); + hm(!0); let p = O.textContent, m = D.textContent; O.disabled = !0, D.disabled = !0, E.disabled = !0, O.textContent = "Backfilling...", T(`Backfill started (${l})...`, "info"), xe({ summary: "Vector Backfill", @@ -11638,7 +11668,7 @@ function bm(t = {}) { ...u.history, status: "started", detail: `Started (${l})` - } }), a.style.background = "var(--mjr-status-info, #64B5F6)", mm(r, "info"); + } }), a.style.background = "var(--mjr-status-info, #64B5F6)", xm(r, "info"); try { let t = { scope: c, @@ -11705,7 +11735,7 @@ function bm(t = {}) { errors: d, label: "running" } - } }), T(`Backfill running in background - candidates ${s}, indexed ${c}, skipped ${l}, errors ${d}`, "info"), a.style.background = "var(--mjr-status-info, #64B5F6)", mm(r, "info"); + } }), T(`Backfill running in background - candidates ${s}, indexed ${c}, skipped ${l}, errors ${d}`, "info"), a.style.background = "var(--mjr-status-info, #64B5F6)", xm(r, "info"); } else e(R("toast.vectorBackfillComplete", "Vector backfill complete! Processed: {processed}, Indexed: {indexed}, Skipped: {skipped}", { processed: s, indexed: c, @@ -11723,7 +11753,7 @@ function bm(t = {}) { errors: d, label: "done" } - } }), T(`Backfill OK - processed ${s}, indexed ${c}, skipped ${l}`, "success"), a.style.background = "var(--mjr-status-success, #4CAF50)", mm(r, "success"); + } }), T(`Backfill OK - processed ${s}, indexed ${c}, skipped ${l}`, "success"), a.style.background = "var(--mjr-status-success, #4CAF50)", xm(r, "success"); } else { let t = String(n?.error || R("toast.vectorBackfillFailedGeneric", "Backfill failed")), i = String(n?.code || "").trim(), o = Number(n?.status || 0) || 0, s = [ i ? `code=${i}` : "", @@ -11738,7 +11768,7 @@ function bm(t = {}) { label: "failed", errors: 1 } - } }), T(`Backfill ? - ${s}\nSee console for full payload.`, "error"), console.error("[Majoor] Vector backfill failed response", n), a.style.background = "var(--mjr-status-error, #f44336)", mm(r, "error"); + } }), T(`Backfill ? - ${s}\nSee console for full payload.`, "error"), console.error("[Majoor] Vector backfill failed response", n), a.style.background = "var(--mjr-status-error, #f44336)", xm(r, "error"); } } catch (t) { let n = String(t?.message || t || "Backfill failed"); @@ -11750,12 +11780,12 @@ function bm(t = {}) { label: "failed", errors: 1 } - } }), T(`Backfill EXCEPTION - ${n}\nSee console for stack trace.`, "error"), console.error("[Majoor] Vector backfill exception", t), a.style.background = "var(--mjr-status-error, #f44336)", mm(r, "error"); + } }), T(`Backfill EXCEPTION - ${n}\nSee console for stack trace.`, "error"), console.error("[Majoor] Vector backfill exception", t), a.style.background = "var(--mjr-status-error, #f44336)", xm(r, "error"); } finally { - cm(!1), O.disabled = !1, D.disabled = !1, E.disabled = !1, O.textContent = p, D.textContent = m, _m("vector-backfill"); + hm(!1), O.disabled = !1, D.disabled = !1, E.disabled = !1, O.textContent = p, D.textContent = m, wm("vector-backfill"); try { let e = n ? n() : null; - await km(a, d, f, e, null, { force: !0 }); + await Im(a, d, f, e, null, { force: !0 }); } catch (e) { console.debug?.(e); } @@ -11767,24 +11797,24 @@ function bm(t = {}) { }, E.onclick = async (t) => { t.stopPropagation(); let i = E.textContent; - E.disabled = !0, O.disabled = !0, D.disabled = !0, E.textContent = R("btn.memoryPurging", "Purging..."), T(R("status.memoryPurgeStarted", "Memory purge started..."), "info"), a.style.background = "var(--mjr-status-info, #64B5F6)", mm(r, "info"); + E.disabled = !0, O.disabled = !0, D.disabled = !0, E.textContent = R("btn.memoryPurging", "Purging..."), T(R("status.memoryPurgeStarted", "Memory purge started..."), "info"), a.style.background = "var(--mjr-status-info, #64B5F6)", xm(r, "info"); try { let t = await C(); if (t?.ok) { let n = t?.data?.comfy_models ? R("toast.memoryPurgeComplete", "Memory purge complete. Majoor AI and ComfyUI model caches were released.") : R("toast.memoryPurgeCompleteMajoorOnly", "Memory purge complete. Majoor AI caches were released."); - e(n, "success", 3200), T(n, "success"), a.style.background = "var(--mjr-status-success, #4CAF50)", mm(r, "success"); + e(n, "success", 3200), T(n, "success"), a.style.background = "var(--mjr-status-success, #4CAF50)", xm(r, "success"); } else { let n = String(t?.error || "Memory purge failed"); - e(n, "error", 4500), T(n, "error"), a.style.background = "var(--mjr-status-error, #f44336)", mm(r, "error"); + e(n, "error", 4500), T(n, "error"), a.style.background = "var(--mjr-status-error, #f44336)", xm(r, "error"); } } catch (t) { let n = String(t?.message || t || "Memory purge failed"); - e(n, "error", 4500), T(n, "error"), a.style.background = "var(--mjr-status-error, #f44336)", mm(r, "error"); + e(n, "error", 4500), T(n, "error"), a.style.background = "var(--mjr-status-error, #f44336)", xm(r, "error"); } finally { E.disabled = !1, O.disabled = !1, D.disabled = !1, E.textContent = i; try { let e = n ? n() : null; - await km(a, d, f, e, null, { force: !0 }); + await Im(a, d, f, e, null, { force: !0 }); } catch (e) { console.debug?.(e); } @@ -11797,11 +11827,11 @@ function bm(t = {}) { k.style.borderColor = "rgba(255,80,80,0.4)", k.style.background = "transparent"; }, k.onclick = async (e) => { e.stopPropagation(); - let t = await ym(R("btn.deleteDb", "Delete DB")); - if (!await Wt(t ? R("dialog.dbDelete.keepVectorsConfirm", "This will reset index data and keep existing AI vectors. Database files will not be force-deleted.\n\nContinue?") : R("dialog.dbDelete.confirm", "This will permanently delete the index database and rebuild it from scratch. All ratings, tags, and cached metadata will be lost.\n\nContinue?"), R("btn.deleteDb", "Delete DB"))) return; - cm(!0); + let t = await Em(R("btn.deleteDb", "Delete DB")); + if (!await Tt(t ? R("dialog.dbDelete.keepVectorsConfirm", "This will reset index data and keep existing AI vectors. Database files will not be force-deleted.\n\nContinue?") : R("dialog.dbDelete.confirm", "This will permanently delete the index database and rebuild it from scratch. All ratings, tags, and cached metadata will be lost.\n\nContinue?"), R("btn.deleteDb", "Delete DB"))) return; + hm(!0); let i = k.textContent; - k.disabled = !0, k.textContent = t ? R("btn.resetting", "Resetting...") : R("btn.deletingDb"), D.disabled = !0, E.disabled = !0, a.style.background = "var(--mjr-status-info, #64B5F6)", mm(r, "info"); + k.disabled = !0, k.textContent = t ? R("btn.resetting", "Resetting...") : R("btn.deletingDb"), D.disabled = !0, E.disabled = !0, a.style.background = "var(--mjr-status-info, #64B5F6)", xm(r, "info"); try { (t ? await Oe({ scope: "all", @@ -11814,14 +11844,14 @@ function bm(t = {}) { clear_assets: !1, preserve_vectors: !0, rebuild_fts: !0 - }) : await c())?.ok ? (globalThis._mjrCorruptToastShown = !1, a.style.background = "var(--mjr-status-success, #4CAF50)", mm(r, "success")) : (a.style.background = "var(--mjr-status-error, #f44336)", mm(r, "error")); + }) : await c())?.ok ? (globalThis._mjrCorruptToastShown = !1, a.style.background = "var(--mjr-status-success, #4CAF50)", xm(r, "success")) : (a.style.background = "var(--mjr-status-error, #f44336)", xm(r, "error")); } catch { - a.style.background = "var(--mjr-status-error, #f44336)", mm(r, "error"); + a.style.background = "var(--mjr-status-error, #f44336)", xm(r, "error"); } finally { - cm(!1), k.disabled = !1, k.textContent = i, D.disabled = !1, E.disabled = !1, _m(t ? "index-reset-preserve-vectors" : "db-force-delete"); + hm(!1), k.disabled = !1, k.textContent = i, D.disabled = !1, E.disabled = !1, wm(t ? "index-reset-preserve-vectors" : "db-force-delete"); try { let e = n ? n() : null; - await km(a, d, f, e, null, { force: !0 }); + await Im(a, d, f, e, null, { force: !0 }); } catch (e) { console.debug?.(e); } @@ -11833,34 +11863,34 @@ function bm(t = {}) { let t = r.querySelector("#mjr-status-body"); if (!t) return; let n = t.style.display === "none"; - Em(r, !n); - }), Em(r, !0), r.onmouseenter = () => { + Nm(r, !n); + }), Nm(r, !0), r.onmouseenter = () => { r.style.transform = "translateY(-1px)"; }, r.onmouseleave = () => { - r.style.transform = "", mm(r, r.dataset?.mjrStatusTone || "neutral", { toast: !1 }); + r.style.transform = "", xm(r, r.dataset?.mjrStatusTone || "neutral", { toast: !1 }); }; let j = async (e) => { try { let t = e?.detail || {}, i = String(t?.step || ""); if (!i) return; let o = i === "started" || i === "stopping_workers" || i === "resetting_db" || i === "delete_db" || i === "recreate_db" || i === "replacing_files" || i === "restarting_scan"; - if (o ? cm(!0) : (i === "failed" || i === "done") && cm(!1), !r?.isConnected || !a?.isConnected || !d?.isConnected) return; + if (o ? hm(!0) : (i === "failed" || i === "done") && hm(!1), !r?.isConnected || !a?.isConnected || !d?.isConnected) return; if (o) { - a.style.background = "var(--mjr-status-info, #64B5F6)", mm(r, "info", { toast: !1 }), pm(d, R("status.pending", "Pending..."), R("status.dbRestoreInProgress", "Database restore in progress")); + a.style.background = "var(--mjr-status-info, #64B5F6)", xm(r, "info", { toast: !1 }), bm(d, R("status.pending", "Pending..."), R("status.dbRestoreInProgress", "Database restore in progress")); return; } if (i === "failed") { - a.style.background = "var(--mjr-status-error, #f44336)", mm(r, "error", { toast: !1 }), um(d, [R("status.error", "Error"), String(t?.message || R("toast.dbRestoreFailed", "Failed to restore DB backup"))]); + a.style.background = "var(--mjr-status-error, #f44336)", xm(r, "error", { toast: !1 }), _m(d, [R("status.error", "Error"), String(t?.message || R("toast.dbRestoreFailed", "Failed to restore DB backup"))]); return; } if (i === "done") { - a.style.background = "var(--mjr-status-success, #4CAF50)", mm(r, "success", { toast: !1 }); + a.style.background = "var(--mjr-status-success, #4CAF50)", xm(r, "success", { toast: !1 }); let e = String(t?.operation || ""), i = e === "delete_db" ? R("toast.dbDeleteSuccess", "Database deleted and rebuilt. Files are being reindexed.") : e === "reset_index" ? R("toast.resetStarted", "Index reset started. Files will be reindexed in the background.") : R("toast.dbRestoreSuccess", "Database backup restored"); - pm(d, R("status.ready", "Ready"), i); + bm(d, R("status.ready", "Ready"), i); try { let e = n ? n() : null; setTimeout(() => { - km(a, d, f, e, null, { force: !0 }); + Im(a, d, f, e, null, { force: !0 }); }, 600); } catch (e) { console.debug?.(e); @@ -11871,8 +11901,8 @@ function bm(t = {}) { } }; try { - let e = rm; - typeof e == "function" && window.removeEventListener("mjr-db-restore-status", e), rm = j, r._mjrDbRestoreStatusHandler = j, window.addEventListener("mjr-db-restore-status", j); + let e = um; + typeof e == "function" && window.removeEventListener("mjr-db-restore-status", e), um = j, r._mjrDbRestoreStatusHandler = j, window.addEventListener("mjr-db-restore-status", j); } catch (e) { console.debug?.(e); } @@ -11889,27 +11919,27 @@ function bm(t = {}) { ].filter(Boolean); if (!s.length) return; let c = d?.querySelector?.("span"); - c ? c.textContent = s.join(" | ") : pm(d, R("status.ready", "Ready"), s.join(" | ")); + c ? c.textContent = s.join(" | ") : bm(d, R("status.ready", "Ready"), s.join(" | ")); } catch (e) { console.debug?.(e); } }; try { - let e = im; - typeof e == "function" && window.removeEventListener(V.RUNTIME_STATUS, e), im = N, window.addEventListener(V.RUNTIME_STATUS, N); + let e = dm; + typeof e == "function" && window.removeEventListener(V.RUNTIME_STATUS, e), dm = N, window.addEventListener(V.RUNTIME_STATUS, N); } catch (e) { console.debug?.(e); } return r; } -async function xm(t, n, r = null, i = null) { - if (nm) { +async function Om(t, n, r = null, i = null) { + if (lm) { e(R("status.maintenanceBusy", "Database maintenance in progress. Please wait."), "warning", 2200); return; } let a = n?.closest?.("#mjr-status-body")?.parentElement || n?.closest?.("div"), o = String(i?.scope || "output").toLowerCase(), s = i?.customRootId || i?.custom_root_id || i?.root_id || null; if (o === "custom" && !s) { - t.style.background = "var(--mjr-status-info, #64B5F6)", mm(a, "info"), pm(n, R("status.customBrowserScanDisabled", "Custom browser mode: scan is disabled"), R("status.customBrowserScanDisabledHint", "Use Outputs, Inputs, or All to run indexing scans")); + t.style.background = "var(--mjr-status-info, #64B5F6)", xm(a, "info"), bm(n, R("status.customBrowserScanDisabled", "Custom browser mode: scan is disabled"), R("status.customBrowserScanDisabledHint", "Use Outputs, Inputs, or All to run indexing scans")); return; } try { @@ -11917,7 +11947,7 @@ async function xm(t, n, r = null, i = null) { if (t && typeof t == "object") { let r = e - Number(t.at || 0); if (r >= 0 && r < 6e5) { - pm(n, R("status.scanInProgress", "Scan already running..."), R("status.scanInProgressHint", "Please wait for the current scan to finish")); + bm(n, R("status.scanInProgress", "Scan already running..."), R("status.scanInProgressHint", "Please wait for the current scan to finish")); return; } } @@ -11945,7 +11975,7 @@ async function xm(t, n, r = null, i = null) { if (!l) { let e = await re(at.CONFIG); if (!e.ok) { - t.style.background = "var(--mjr-status-error, #f44336)", mm(a, "error"), n.textContent = R("status.errorGetConfig"), c(); + t.style.background = "var(--mjr-status-error, #f44336)", xm(a, "error"), n.textContent = R("status.errorGetConfig"), c(); return; } l = { output_directory: e.data.output_directory }; @@ -11956,7 +11986,7 @@ async function xm(t, n, r = null, i = null) { let e = Array.isArray(l?.custom_roots) ? l.custom_roots : [], t = s ? e.find((e) => e?.id === s) : null; d = t?.path ? ` (${t.path})` : ""; } else o === "output" && (d = l?.output_directory ? ` (${l.output_directory})` : ""); - t.style.background = "var(--mjr-status-info, #64B5F6)", mm(a, "info"), pm(n, R("status.scanningScope", `Scanning ${u}${d}...`, { + t.style.background = "var(--mjr-status-info, #64B5F6)", xm(a, "info"), bm(n, R("status.scanningScope", `Scanning ${u}${d}...`, { scope: u, detail: d }), R("status.scanningHint", "This may take a while")); @@ -11964,12 +11994,12 @@ async function xm(t, n, r = null, i = null) { scope: o, recursive: !0, incremental: !0, - fast: !!(Hn()?.scan?.fastMode ?? !0), + fast: !!(Vn()?.scan?.fastMode ?? !0), background_metadata: !0 }; if (o === "custom") { if (!s) { - t.style.background = "var(--mjr-status-error, #f44336)", mm(a, "error"), n.textContent = R("status.selectCustomFolder"), c(); + t.style.background = "var(--mjr-status-error, #f44336)", xm(a, "error"), n.textContent = R("status.selectCustomFolder"), c(); return; } f.custom_root_id = s; @@ -11982,73 +12012,73 @@ async function xm(t, n, r = null, i = null) { } if (p?.ok) { let e = p.data; - t.style.background = "var(--mjr-status-success, #4CAF50)", mm(a, "success"), pm(n, R("toast.scanComplete"), R("status.scanStats", `Added: ${e.added || 0} - Updated: ${e.updated || 0} - Skipped: ${e.skipped || 0}`, { + t.style.background = "var(--mjr-status-success, #4CAF50)", xm(a, "success"), bm(n, R("toast.scanComplete"), R("status.scanStats", `Added: ${e.added || 0} - Updated: ${e.updated || 0} - Skipped: ${e.skipped || 0}`, { added: e.added || 0, updated: e.updated || 0, skipped: e.skipped || 0 - })), vm("scan-complete", { stats: { + })), Tm("scan-complete", { stats: { added: e.added || 0, updated: e.updated || 0, skipped: e.skipped || 0 } }), setTimeout(() => { - km(t, n, r); + Im(t, n, r); }, 2e3); - } else t.style.background = "var(--mjr-status-error, #f44336)", mm(a, "error"), um(n, [R("toast.scanFailed") + `: ${p?.error || "Unknown error"}`]), setTimeout(() => { - km(t, n, r); + } else t.style.background = "var(--mjr-status-error, #f44336)", xm(a, "error"), _m(n, [R("toast.scanFailed") + `: ${p?.error || "Unknown error"}`]), setTimeout(() => { + Im(t, n, r); }, 3e3); } -function Sm(e, t, n) { +function km(e, t, n) { let r = document.createElement("span"); return r.style.cssText = "\n display: inline-flex;\n align-items: center;\n gap: 4px;\n padding: 2px 6px;\n border-radius: 999px;\n background: rgba(255, 255, 255, 0.05);\n border: 1px solid rgba(255, 255, 255, 0.1);\n ", r.textContent = `${t ? "OK" : "ERR"} ${e}`, r.title = t ? R("status.toolAvailable", `${e} available`, { tool: e }) : n || R("status.toolUnavailable", `${e} unavailable`, { tool: e }), r.style.opacity = t ? "1" : "0.75", r; } -function Cm(e, t = {}, n = {}) { +function Am(e, t = {}, n = {}) { if (!e) return; if (e.replaceChildren(), !t || Object.keys(t).length === 0) { e.textContent = R("status.discoveringTools"); return; } let r = document.createElement("div"); - r.style.display = "flex", r.style.flexWrap = "wrap", r.style.gap = "10px", r.style.alignItems = "flex-start", tm.forEach(({ key: e, labelKey: i, hintKey: a }) => { + r.style.display = "flex", r.style.flexWrap = "wrap", r.style.gap = "10px", r.style.alignItems = "flex-start", cm.forEach(({ key: e, labelKey: i, hintKey: a }) => { let o = !!t[e], s = n[e], c = R(i, e), l = R(a, ""); - r.appendChild(Tm({ + r.appendChild(Mm({ label: c, hint: l }, o, s)); }), e.appendChild(r); } -function wm(e, t = null, n = {}) { +function jm(e, t = null, n = {}) { if (!e) return; let r = e.parentElement; if (!r) return; let i = r.querySelector("#mjr-tools-status"); if (!i) return; let a = n && Object.keys(n).length > 0; - i.textContent = !t && !a ? R("status.toolStatusChecking", "Tool status: checking...") : tm.map(({ key: e, labelKey: r }) => { + i.textContent = !t && !a ? R("status.toolStatusChecking", "Tool status: checking...") : cm.map(({ key: e, labelKey: r }) => { let i = R(r, e), a = t && e in t ? t[e] : void 0, o = e in n ? n[e] : void 0, s = a === void 0 ? o : a, c = s == null ? R("status.unknown", "unknown") : s ? R("status.available", "available") : R("status.missing", "missing"), l = t?.versions?.[e]; return l ? `${i}: ${c} - ${l}` : `${i}: ${c}`; }).join(" | "); } -function Tm({ label: e, hint: t }, n, r) { +function Mm({ label: e, hint: t }, n, r) { let i = document.createElement("div"); i.style.cssText = "\n display: flex;\n flex-direction: column;\n gap: 3px;\n padding: 6px 8px;\n border-radius: 8px;\n background: rgba(255, 255, 255, 0.03);\n border: 1px solid rgba(255, 255, 255, 0.08);\n min-width: 170px;\n "; - let a = Sm(e, n, t); + let a = km(e, n, t); a.style.fontWeight = "500", i.appendChild(a); let o = document.createElement("span"); return o.style.fontSize = "10px", o.style.opacity = "0.7", o.style.wordBreak = "break-all", o.textContent = R("status.path", "Path") + `: ${r || R("status.pathAuto", "auto / not configured")}`, i.appendChild(o), i; } -function Em(e, t) { +function Nm(e, t) { let n = e.querySelector("#mjr-status-body"), r = e.querySelector("#mjr-status-title-indicator"); n && r && (t ? (n.style.display = "none", r.textContent = ">") : (n.style.display = "", r.textContent = "v")); } -function Dm(e, t) { +function Pm(e, t) { let n = !!e?.database?.available, r = t?.diagnostics || {}, i = !!r?.malformed, a = !!r?.locked; return !n || i ? R("status.dbHealthError", "DB health: error") : a ? R("status.dbHealthLocked", "DB health: locked") : R("status.dbHealthOk", "DB health: ok"); } -function Om(e, t) { +function Fm(e, t) { let n = Number(e?.total_assets || 0), r = e?.last_index_end, i = e?.last_scan_end, a = t === "all" ? R("scope.all", "Inputs + Outputs") : t === "input" ? R("scope.input", "Inputs") : t === "custom" ? R("scope.custom", "Custom") : t === "workflow" ? R("scope.workflow", "Workflow") : R("scope.output", "Outputs"); return !Number.isFinite(n) || n <= 0 ? `${R("status.indexHealthEmpty", "Index health: empty")} (${a})` : !r && !i ? `${R("status.indexHealthPartial", "Index health: partial")} (${a})` : `${R("status.indexHealthOk", "Index health: ok")} (${a})`; } -async function km(t, n, r = null, i = null, a = null, o = {}) { +async function Im(t, n, r = null, i = null, a = null, o = {}) { let s = n?.closest?.("#mjr-status-body")?.parentElement || n?.closest?.("div"), c = o?.signal || null, l = !!o?.force; try { if (!t?.isConnected || !n?.isConnected) return null; @@ -12056,7 +12086,7 @@ async function km(t, n, r = null, i = null, a = null, o = {}) { console.debug?.(e); } try { - if (!l && nm) return null; + if (!l && lm) return null; } catch (e) { console.debug?.(e); } @@ -12090,10 +12120,10 @@ async function km(t, n, r = null, i = null, a = null, o = {}) { if (a && typeof a == "object" && (a.lastCode = _?.code || null, a.lastStatus = typeof _?.status == "number" ? _.status : null), _.ok) { let e = _.data; a && typeof a == "object" && (a._scanAuxBackoffUntil = e?.scan_active ? Date.now() + 3e4 : 0); - let i = e.total_assets || 0, o = e.with_workflows - 0, l = e.with_generation_data - 0, d = Math.max(0, Number(o || 0) || 0), m = e.last_scan_end, h = m ? new Date(m).toLocaleString() : "N/A", g = e.tool_availability || {}, x = e.tool_paths || {}, S = R("status.dbSize", "Database size: {size}", { size: lm(e.db_size_bytes || 0) }), C = v?.ok && v?.data && v.data.vector || {}, w = C?.enabled !== !1, T = !!C?.loaded, E = !!C?.degraded, D = String(C?.last_error || "").trim(), O = w ? E ? `AI vector: degraded${D ? ` (${D})` : ""}` : T ? "AI vector: loaded" : "AI vector: initializing" : "AI vector: disabled", k = Dm(v?.data || null, y?.data || null), A = Om(e, p ? "all" : u), j = !!(v?.ok && v?.data?.database?.available), M = y?.ok && y?.data?.diagnostics || {}, N = !!M?.malformed, P = !!M?.locked, ee = !!M?.maintenance_active; - cm(ee); - let te = Math.max(0, Number(e?.enrichment_queue_length || 0) || 0), F = It().active || te > 0; - St(F, te); + let i = e.total_assets || 0, o = e.with_workflows - 0, l = e.with_generation_data - 0, d = Math.max(0, Number(o || 0) || 0), m = e.last_scan_end, h = m ? new Date(m).toLocaleString() : "N/A", g = e.tool_availability || {}, x = e.tool_paths || {}, S = R("status.dbSize", "Database size: {size}", { size: gm(e.db_size_bytes || 0) }), C = v?.ok && v?.data && v.data.vector || {}, w = C?.enabled !== !1, T = !!C?.loaded, E = !!C?.degraded, D = String(C?.last_error || "").trim(), O = w ? E ? `AI vector: degraded${D ? ` (${D})` : ""}` : T ? "AI vector: loaded" : "AI vector: initializing" : "AI vector: disabled", k = Pm(v?.data || null, y?.data || null), A = Fm(e, p ? "all" : u), j = !!(v?.ok && v?.data?.database?.available), M = y?.ok && y?.data?.diagnostics || {}, N = !!M?.malformed, P = !!M?.locked, ee = !!M?.maintenance_active; + hm(ee); + let te = Math.max(0, Number(e?.enrichment_queue_length || 0) || 0), F = Pt().active || te > 0; + It(F, te); let I = Number(i) > 0, ne = !!(e?.last_index_end || e?.last_scan_end), re = I && ne, ie = "success"; ee || F ? ie = "info" : !j || N ? ie = "error" : (P || !re || E) && (ie = "warning"); let ae = u === "workflow", oe = p && ie !== "error" ? "browser" : ae && ie !== "error" ? "workflow" : ie, se = e.watcher; @@ -12109,15 +12139,15 @@ async function km(t, n, r = null, i = null, a = null, o = {}) { } catch (e) { console.debug?.(e); } - let L = ae ? R("status.watcher.disabledScoped", "Watcher: disabled ({scope})", { scope: R("scope.workflow", "Workflow") }) : p ? R("status.watcher.disabledScoped", "Watcher: disabled ({scope})", { scope: R("scope.customBrowser", "Browser") }) : gm(se, u), ce = F ? R("status.enrichmentQueue", "Metadata enrichment queue: {count}", { count: te }) : R("status.enrichmentIdle", "Metadata enrichment: idle"); - Cm(r, g, x), wm(r, b, g); + let L = ae ? R("status.watcher.disabledScoped", "Watcher: disabled ({scope})", { scope: R("scope.workflow", "Workflow") }) : p ? R("status.watcher.disabledScoped", "Watcher: disabled ({scope})", { scope: R("scope.customBrowser", "Browser") }) : Cm(se, u), ce = F ? R("status.enrichmentQueue", "Metadata enrichment queue: {count}", { count: te }) : R("status.enrichmentIdle", "Metadata enrichment: idle"); + Am(r, g, x), jm(r, b, g); let le = u === "all" ? R("scope.allFull", "All (Inputs + Outputs)") : u === "input" ? R("scope.input", "Inputs") : u === "custom" ? R("scope.customBrowser", "Browser") : u === "workflow" ? R("scope.workflow", "Workflow") : R("scope.output", "Outputs"); - return ie === "error" ? (t.style.background = "var(--mjr-status-error, #f44336)", mm(s, "error"), pm(n, R("status.dbCorrupted", "Database appears corrupted or unavailable."), [ + return ie === "error" ? (t.style.background = "var(--mjr-status-error, #f44336)", xm(s, "error"), bm(n, R("status.dbCorrupted", "Database appears corrupted or unavailable."), [ k, A, S, L - ].filter(Boolean).join(" | ")), e) : p ? (t.style.background = "var(--mjr-status-browser, #26A69A)", mm(s, "browser"), pm(n, R("status.ready", "Ready"), [R("status.browserMetricsHidden", "Browser mode: global DB/index metrics hidden"), L].filter(Boolean).join(" | ")), e) : ae ? (t.style.background = "#d481c3", mm(s, oe), um(n, [ + ].filter(Boolean).join(" | ")), e) : p ? (t.style.background = "var(--mjr-status-browser, #26A69A)", xm(s, "browser"), bm(n, R("status.ready", "Ready"), [R("status.browserMetricsHidden", "Browser mode: global DB/index metrics hidden"), L].filter(Boolean).join(" | ")), e) : ae ? (t.style.background = "#d481c3", xm(s, oe), _m(n, [ R("status.workflowsIndexed", `${d.toLocaleString()} workflows indexed (${le})`, { count: d.toLocaleString(), scope: le @@ -12129,19 +12159,19 @@ async function km(t, n, r = null, i = null, a = null, o = {}) { A, S, L - ], R("status.lastScan", `Last scan: ${h}`, { date: h })), e) : (i === 0 ? (t.style.background = oe === "browser" ? "var(--mjr-status-browser, #26A69A)" : ie === "info" ? "var(--mjr-status-info, #64B5F6)" : ie === "warning" ? "var(--mjr-status-warning, #FFA726)" : "var(--mjr-status-success, #4CAF50)", mm(s, oe), pm(n, R("status.noAssets", `No assets indexed yet (${le})`, { scope: le }), [ + ], R("status.lastScan", `Last scan: ${h}`, { date: h })), e) : (i === 0 ? (t.style.background = oe === "browser" ? "var(--mjr-status-browser, #26A69A)" : ie === "info" ? "var(--mjr-status-info, #64B5F6)" : ie === "warning" ? "var(--mjr-status-warning, #FFA726)" : "var(--mjr-status-success, #4CAF50)", xm(s, oe), bm(n, R("status.noAssets", `No assets indexed yet (${le})`, { scope: le }), [ R("status.clickToScan", "Click the dot to start a scan"), O, k, A, S, L - ].filter(Boolean).join(" | "))) : (t.style.background = oe === "browser" ? "var(--mjr-status-browser, #26A69A)" : ie === "info" ? "var(--mjr-status-info, #64B5F6)" : ie === "warning" ? "var(--mjr-status-warning, #FFA726)" : "var(--mjr-status-success, #4CAF50)", mm(s, oe), um(n, [ + ].filter(Boolean).join(" | "))) : (t.style.background = oe === "browser" ? "var(--mjr-status-browser, #26A69A)" : ie === "info" ? "var(--mjr-status-info, #64B5F6)" : ie === "warning" ? "var(--mjr-status-warning, #FFA726)" : "var(--mjr-status-success, #4CAF50)", xm(s, oe), _m(n, [ R("status.assetsIndexed", `${i.toLocaleString()} assets indexed (${le})`, { count: i.toLocaleString(), scope: le }), - Fm(e), + Hm(e), R("status.withWorkflows", `With workflows: ${o} - Generation data: ${l}`, { workflows: o, gendata: l @@ -12152,34 +12182,34 @@ async function km(t, n, r = null, i = null, a = null, o = {}) { A, S, L - ], R("status.lastScan", `Last scan: ${h}`, { date: h })), dm(n, fm(e, { + ], R("status.lastScan", `Last scan: ${h}`, { date: h })), vm(n, ym(e, { totalAssets: i, withWorkflows: o, withGenerationData: l }))), e); } - if (Cm(r, {}, {}), wm(r, b), t.style.background = "var(--mjr-status-error, #f44336)", mm(s, "error"), _?.code === "INVALID_RESPONSE" && _?.status === 404) pm(n, R("status.apiNotFound", "Majoor API endpoints not found (404)"), R("status.apiNotFoundHint", "Backend routes are not loaded. Restart ComfyUI and check the terminal for Majoor import errors.")); + if (Am(r, {}, {}), jm(r, b), t.style.background = "var(--mjr-status-error, #f44336)", xm(s, "error"), _?.code === "INVALID_RESPONSE" && _?.status === 404) bm(n, R("status.apiNotFound", "Majoor API endpoints not found (404)"), R("status.apiNotFoundHint", "Backend routes are not loaded. Restart ComfyUI and check the terminal for Majoor import errors.")); else { let t = String(_?.error || "").toLowerCase(); - t.includes("malform") || t.includes("corrupt") || t.includes("disk image") ? (pm(n, R("status.dbCorrupted"), R("status.dbCorruptedHint")), globalThis._mjrCorruptToastShown || (globalThis._mjrCorruptToastShown = !0, e(R("toast.resetFailedCorrupt"), "error", 8e3))) : um(n, [_.error || R("status.errorChecking", "Error checking status")]); + t.includes("malform") || t.includes("corrupt") || t.includes("disk image") ? (bm(n, R("status.dbCorrupted"), R("status.dbCorruptedHint")), globalThis._mjrCorruptToastShown || (globalThis._mjrCorruptToastShown = !0, e(R("toast.resetFailedCorrupt"), "error", 8e3))) : _m(n, [_.error || R("status.errorChecking", "Error checking status")]); } if (_.code === "SERVICE_UNAVAILABLE") { - let e = Am(t, n, r, i); + let e = Lm(t, n, r, i); n.appendChild(document.createElement("br")), n.appendChild(e); } return null; } -function Am(e, t, n = null, r = null) { +function Lm(e, t, n = null, r = null) { let i = document.createElement("button"); return i.textContent = R("btn.retryServices"), i.style.cssText = "\n padding: 4px 10px;\n margin-top: 6px;\n font-size: 11px;\n border-radius: 4px;\n border: 1px solid rgba(255,255,255,0.3);\n background: transparent;\n color: white;\n cursor: pointer;\n ", i.onclick = async () => { i.disabled = !0, i.textContent = R("btn.retrying"); let a = await L(at.RETRY_SERVICES, {}); - i.disabled = !1, i.textContent = R("btn.retryServices"), a.ok ? km(e, t, n, r) : (um(t, [a.error || R("status.retryFailed", "Retry failed")]), t.appendChild(document.createElement("br")), t.appendChild(i)); + i.disabled = !1, i.textContent = R("btn.retryServices"), a.ok ? Im(e, t, n, r) : (_m(t, [a.error || R("status.retryFailed", "Retry failed")]), t.appendChild(document.createElement("br")), t.appendChild(i)); }, i; } -function jm() { +function Rm() { try { - let e = localStorage?.getItem?.(am); + let e = localStorage?.getItem?.(fm); if (!e) return null; let t = JSON.parse(e); return t && typeof t == "object" ? t : null; @@ -12187,15 +12217,15 @@ function jm() { return console.debug?.(e), null; } } -function Mm(e) { +function zm(e) { try { if (!e || typeof e != "object") return; - localStorage?.setItem?.(am, JSON.stringify(e)); + localStorage?.setItem?.(fm, JSON.stringify(e)); } catch (e) { console.debug?.(e); } } -function Nm(e) { +function Bm(e) { let t = [], n = (e, r = 0) => { if (!(!e || r > 2)) { if (typeof e == "number" && Number.isFinite(e)) t.push(e); @@ -12208,23 +12238,23 @@ function Nm(e) { }; return n(e, 0), t; } -function Pm(e) { +function Vm(e) { if (!e || typeof e != "object") return !1; - if (nm) return !0; + if (lm) return !0; try { - if (It()?.active) return !0; + if (Pt()?.active) return !0; } catch (e) { console.debug?.(e); } - return Nm(e).some((e) => Number(e) > 0); + return Bm(e).some((e) => Number(e) > 0); } -function Fm(e) { +function Hm(e) { let t = []; e.images && t.push(`Images: ${e.images}`), e.videos && t.push(`Videos: ${e.videos}`), e.audio && t.push(`Audio: ${e.audio}`); let n = e.model3d || e.by_kind?.model3d || 0; return n && t.push(`3D: ${n}`), t.length ? t.join(" - ") : "Images: 0 - Videos: 0"; } -function Im(e) { +function Um(e) { if (!e || typeof e != "object") return ""; let t = (e) => e == null ? null : typeof e == "number" ? Number.isFinite(e) ? e : null : typeof e == "boolean" || typeof e == "string" ? e : null; return JSON.stringify({ @@ -12242,23 +12272,23 @@ function Im(e) { } }); } -function Lm(e, t, n) { - let r = jm(); +function Wm(e, t, n) { + let r = Rm(); if (!r) return !1; try { - Cm(n, r.tool_availability || {}, r.tool_paths || {}); + Am(n, r.tool_availability || {}, r.tool_paths || {}); } catch (e) { console.debug?.(e); } try { - return e.style.background = "var(--mjr-status-info, #64B5F6)", pm(t, R("status.cached", "Last known status"), R("status.checking", "Checking status...")), !0; + return e.style.background = "var(--mjr-status-info, #64B5F6)", bm(t, R("status.cached", "Last known status"), R("status.checking", "Checking status...")), !0; } catch (e) { return console.debug?.(e), !1; } } -function Rm(e, t, n) { - let r = Im(t), i = r && r !== String(n?.lastSignature || ""), a = Pm(t), o = e || om.ACTIVE, s = Number(n?.cooldownStablePolls || 0) || 0; - return a || i ? (o = om.ACTIVE, s = 0) : o === om.ACTIVE ? (o = om.COOLDOWN, s = 0) : o === om.COOLDOWN ? (s += 1, s >= 3 && (o = om.IDLE, s = 0)) : (o = i ? om.ACTIVE : om.IDLE, s = 0), { +function Gm(e, t, n) { + let r = Um(t), i = r && r !== String(n?.lastSignature || ""), a = Vm(t), o = e || pm.ACTIVE, s = Number(n?.cooldownStablePolls || 0) || 0; + return a || i ? (o = pm.ACTIVE, s = 0) : o === pm.ACTIVE ? (o = pm.COOLDOWN, s = 0) : o === pm.COOLDOWN ? (s += 1, s >= 3 && (o = pm.IDLE, s = 0)) : (o = i ? pm.ACTIVE : pm.IDLE, s = 0), { nextState: o, signature: r, hasChange: i, @@ -12266,14 +12296,14 @@ function Rm(e, t, n) { cooldownStablePolls: s }; } -function zm(e, t, n, r = null, i = null, a = null) { +function Km(e, t, n, r = null, i = null, a = null) { let o = "__MJR_STATUS_POLL_DISPOSE__", s = { lastCode: null, lastStatus: null, _pollTick: 0, _auxCached: !1 }, c = { - mode: om.ACTIVE, + mode: pm.ACTIVE, cooldownStablePolls: 0, lastSignature: "" }, l = typeof AbortController < "u" ? new AbortController() : null, u = async () => { @@ -12283,14 +12313,14 @@ function zm(e, t, n, r = null, i = null, a = null) { console.debug?.(e); } s._pollTick = Number(s._pollTick || 0) + 1; - let n = s._pollTick > 1 && s._pollTick % 4 != 0, o = await km(e, t, r, typeof a == "function" ? a() : null, s, { + let n = s._pollTick > 1 && s._pollTick % 4 != 0, o = await Im(e, t, r, typeof a == "function" ? a() : null, s, { signal: l?.signal || null, lightweight: n, - force: !!nm || s._pollTick <= 1 + force: !!lm || s._pollTick <= 1 }); if (o && typeof o == "object") { - Mm(o); - let e = Rm(c.mode, o, c); + zm(o); + let e = Gm(c.mode, o, c); c.mode = e.nextState, c.lastSignature = e.signature, c.cooldownStablePolls = e.cooldownStablePolls; } if (o && typeof i == "function") try { @@ -12300,7 +12330,7 @@ function zm(e, t, n, r = null, i = null, a = null) { } return o; }; - Lm(e, t, r), u(); + Wm(e, t, r), u(); try { n._mjrStatusPollDispose?.(); } catch (e) { @@ -12321,7 +12351,7 @@ function zm(e, t, n, r = null, i = null, a = null) { } return 1; }, h = () => { - let e = sm[c.mode] || Math.max(250, Number(B.STATUS_POLL_INTERVAL) || 2e3), t = p ? Math.max(3e4, e) : f > 0 ? Math.min(6e4, Math.round(e * Math.min(8, 1 + f))) : e, r = Math.min(12e4, Math.round(t * m())); + let e = mm[c.mode] || Math.max(250, Number(B.STATUS_POLL_INTERVAL) || 2e3), t = p ? Math.max(3e4, e) : f > 0 ? Math.min(6e4, Math.round(e * Math.min(8, 1 + f))) : e, r = Math.min(12e4, Math.round(t * m())); d = setTimeout(async () => { try { if (l?.signal?.aborted) return; @@ -12329,7 +12359,7 @@ function zm(e, t, n, r = null, i = null, a = null) { console.debug?.(e); } let e = await u(); - if (p = s.lastCode === "INVALID_RESPONSE" && s.lastStatus === 404, e ? f = 0 : p ? f = Math.min(999, f + 1) : (f = Math.min(999, f + 1), c.mode = om.ACTIVE, c.cooldownStablePolls = 0), p && f >= 3) try { + if (p = s.lastCode === "INVALID_RESPONSE" && s.lastStatus === 404, e ? f = 0 : p ? f = Math.min(999, f + 1) : (f = Math.min(999, f + 1), c.mode = pm.ACTIVE, c.cooldownStablePolls = 0), p && f >= 3) try { n._mjrStatusPollDispose?.(); } catch (e) { console.debug?.(e); @@ -12352,54 +12382,54 @@ function zm(e, t, n, r = null, i = null, a = null) { } h(); for (let i of n.querySelectorAll("#mjr-status-dot, #mjr-status-scan")) i.onclick = (n) => { - n.stopPropagation(), xm(e, t, r, typeof a == "function" ? a() : null); + n.stopPropagation(), Om(e, t, r, typeof a == "function" ? a() : null); }, i.title = R("btn.scan", "Scan"); } // ui/vue/composables/useActiveAsset.ts -var Bm = yr(null), Vm = yr(null); -function Hm() { +var qm = vr(null), Jm = vr(null); +function Ym() { return { - activeAsset: Bm, - onUpdateCallback: Vm + activeAsset: qm, + onUpdateCallback: Jm }; } -function Um(e, t) { - Vm.value = typeof t == "function" ? t : null, Bm.value = e ?? null; +function Xm(e, t) { + Jm.value = typeof t == "function" ? t : null, qm.value = e ?? null; } -function Wm() { - Bm.value = null, Vm.value = null; +function Zm() { + qm.value = null, Jm.value = null; } -function Gm(e, t) { - if (Bm.value && e) { - Bm.value = { - ...Bm.value, +function Qm(e, t) { + if (qm.value && e) { + qm.value = { + ...qm.value, ...e }; try { - let e = t ?? Vm.value; - typeof e == "function" && e(Bm.value); + let e = t ?? Jm.value; + typeof e == "function" && e(qm.value); } catch {} } } // ui/components/sidebar/SidebarView.ts -var Km = 360, qm = 240, Jm = 640; -function Ym() { +var $m = 360, eh = 240, th = 640; +function nh() { try { - let e = Hn(), t = Number(e?.sidebar?.widthPx); - return Number.isFinite(t) ? Math.max(qm, Math.min(Jm, Math.round(t))) : Km; + let e = Vn(), t = Number(e?.sidebar?.widthPx); + return Number.isFinite(t) ? Math.max(eh, Math.min(th, Math.round(t))) : $m; } catch { - return Km; + return $m; } } -function Xm(e, t) { +function rh(e, t) { if (!e) return; let n = String(e?.dataset?.position || "right").toLowerCase() === "left", r = "var(--mjr-border, rgba(255,255,255,0.12))"; if (t) { - let t = `${Ym()}px`; + let t = `${nh()}px`; e.style.flex = `0 0 ${t}`, e.style.width = t, e.style.maxWidth = t, e.style.minWidth = "0", e.style.overflow = "hidden", e.style.borderLeft = n ? "none" : `1px solid ${r}`, e.style.borderRight = n ? `1px solid ${r}` : "none"; } else e.style.flex = "0 0 0px", e.style.width = "0", e.style.maxWidth = "0", e.style.minWidth = "0", e.style.overflow = "hidden", e.style.borderLeft = "none", e.style.borderRight = "none"; } -function Zm(e) { +function ih(e) { if (e == null) return !1; let t = e; if (typeof e == "string") { @@ -12418,10 +12448,10 @@ function Zm(e) { } return !1; } -function Qm(e) { - return e ? !!(e.geninfo || e.prompt || Zm(e.metadata_raw)) : !1; +function ah(e) { + return e ? !!(e.geninfo || e.prompt || ih(e.metadata_raw)) : !1; } -async function $m(e, t, n) { +async function oh(e, t, n) { if (!e || !t) return; let r = String(t?.kind || "").toLowerCase() === "folder"; try { @@ -12430,7 +12460,7 @@ async function $m(e, t, n) { console.debug?.(e); } let i = e._requestSeq = (e._requestSeq || 0) + 1; - e._currentFetchAbortController?.abort?.(), e._currentFetchAbortController = null, e.classList.add("is-open"), Xm(e, !0), e._currentAsset = t, e._currentFullAsset = t, e._ratingTagsSection = null, Um(t, n); + e._currentFetchAbortController?.abort?.(), e._currentFetchAbortController = null, e.classList.add("is-open"), rh(e, !0), e._currentAsset = t, e._currentFullAsset = t, e._ratingTagsSection = null, Xm(t, n); let a = () => { e._currentFetchAbortController?.abort?.(); let t = typeof AbortController < "u" ? new AbortController() : null; @@ -12439,7 +12469,7 @@ async function $m(e, t, n) { e._requestSeq === i && e._currentAsset === t && (e._currentFullAsset = { ...e._currentFullAsset ?? t, ...r - }, Gm(r, n)); + }, Qm(r, n)); }; (async () => { if (e._requestSeq !== i || e._currentAsset !== t) return; @@ -12461,7 +12491,7 @@ async function $m(e, t, n) { } let c = () => e._currentFullAsset ?? t; try { - if (t.id && !Qm(c())) { + if (t.id && !ah(c())) { let e = await I(t.id, n); if (s?.aborted) return; e?.ok && e.data && o(e.data); @@ -12470,7 +12500,7 @@ async function $m(e, t, n) { s?.aborted || console.warn("Failed to load full asset metadata:", e); } if (!s?.aborted) { - if (!Qm(c())) { + if (!ah(c())) { let e = String(c()?.filename || "").trim(), t = String(c()?.type || "output").trim().toLowerCase(), r = String(c()?.subfolder || "").trim(), i = String(c()?.root_id || c()?.rootId || "").trim(); if (e) try { let a = await De({ @@ -12499,9 +12529,9 @@ async function $m(e, t, n) { } })(); } -function eh(e) { +function sh(e) { if (e) { - e._requestSeq = (e._requestSeq || 0) + 1, e.classList.remove("is-open"), Xm(e, !1), e._currentAsset = null, e._currentFullAsset = null, e._currentFetchAbortController?.abort?.(), e._currentFetchAbortController = null, Wm(); + e._requestSeq = (e._requestSeq || 0) + 1, e.classList.remove("is-open"), rh(e, !1), e._currentAsset = null, e._currentFullAsset = null, e._currentFetchAbortController?.abort?.(), e._currentFetchAbortController = null, Zm(); try { e.dispatchEvent?.(new CustomEvent("mjr:sidebar-closed", { bubbles: !0 })); } catch (e) { @@ -12510,14 +12540,14 @@ function eh(e) { } } // ui/stores/usePanelStore.ts -var th = "mjr_panel_state", nh = /* @__PURE__ */ new Set([ +var ch = "mjr_panel_state", lh = /* @__PURE__ */ new Set([ "output", "input", "all", "custom", "workflow" ]); -function rh(e, t = !1) { +function uh(e, t = !1) { if (typeof e == "boolean") return e; if (typeof e == "string") { let t = e.trim().toLowerCase(); @@ -12536,71 +12566,71 @@ function rh(e, t = !1) { } return !!t; } -function ih(e, t = 0) { +function dh(e, t = 0) { let n = Number(e); return Number.isFinite(n) ? n : t; } -function ah(e, t = "") { +function fh(e, t = "") { return e == null ? t : String(e); } -function oh(e, t = 0, n = Infinity) { - return Math.max(t, Math.min(n, Math.floor(ih(e, t)))); +function ph(e, t = 0, n = Infinity) { + return Math.max(t, Math.min(n, Math.floor(dh(e, t)))); } -function sh(e) { - let t = ah(e || "output").toLowerCase(), n = t === "outputs" ? "output" : t === "inputs" ? "input" : t; - return nh.has(n) ? n : "output"; +function mh(e) { + let t = fh(e || "output").toLowerCase(), n = t === "outputs" ? "output" : t === "inputs" ? "input" : t; + return lh.has(n) ? n : "output"; } -function ch(e) { +function hh(e) { if (!e || typeof e != "object") return {}; let t = e; return { - scope: sh(t.scope), - customRootId: ah(t.customRootId), - customRootLabel: ah(t.customRootLabel), - currentFolderRelativePath: ah(t.currentFolderRelativePath || t.subfolder), - collectionId: ah(t.collectionId), - collectionName: ah(t.collectionName), - kindFilter: ah(t.kindFilter), - dateRangeFilter: ah(t.dateRangeFilter), - dateExactFilter: ah(t.dateExactFilter), - workflowOnly: rh(t.workflowOnly, !1), - minRating: oh(t.minRating, 0, 5), - minSizeMB: Math.max(0, ih(t.minSizeMB, 0)), - maxSizeMB: Math.max(0, ih(t.maxSizeMB, 0)), + scope: mh(t.scope), + customRootId: fh(t.customRootId), + customRootLabel: fh(t.customRootLabel), + currentFolderRelativePath: fh(t.currentFolderRelativePath || t.subfolder), + collectionId: fh(t.collectionId), + collectionName: fh(t.collectionName), + kindFilter: fh(t.kindFilter), + dateRangeFilter: fh(t.dateRangeFilter), + dateExactFilter: fh(t.dateExactFilter), + workflowOnly: uh(t.workflowOnly, !1), + minRating: ph(t.minRating, 0, 5), + minSizeMB: Math.max(0, dh(t.minSizeMB, 0)), + maxSizeMB: Math.max(0, dh(t.maxSizeMB, 0)), resolutionCompare: t.resolutionCompare === "lte" ? "lte" : "gte", - minWidth: oh(t.minWidth), - minHeight: oh(t.minHeight), - maxWidth: oh(t.maxWidth), - maxHeight: oh(t.maxHeight), - workflowType: ah(t.workflowType), - workflowId: ah(t.workflowId || t.workflow_id), - workflowModelFilter: ah(t.workflowModelFilter || t.workflowModel || t.workflow_model), - workflowRunsOnFilter: ah(t.workflowRunsOnFilter || t.workflowRunsOn || t.runs_on), - sort: ah(t.sort || "mtime_desc"), - searchQuery: ah(t.searchQuery), + minWidth: ph(t.minWidth), + minHeight: ph(t.minHeight), + maxWidth: ph(t.maxWidth), + maxHeight: ph(t.maxHeight), + workflowType: fh(t.workflowType), + workflowId: fh(t.workflowId || t.workflow_id), + workflowModelFilter: fh(t.workflowModelFilter || t.workflowModel || t.workflow_model), + workflowRunsOnFilter: fh(t.workflowRunsOnFilter || t.workflowRunsOn || t.runs_on), + sort: fh(t.sort || "mtime_desc"), + searchQuery: fh(t.searchQuery), metadataSearchMode: String(t.metadataSearchMode || "AND").toUpperCase() === "OR" ? "OR" : "AND", - scrollTop: oh(t.scrollTop), - activeAssetId: ah(t.activeAssetId), - selectedAssetIds: Array.isArray(t.selectedAssetIds) ? t.selectedAssetIds.map((e) => ah(e).trim()).filter(Boolean).slice(0, 5e3) : [], - sidebarOpen: rh(t.sidebarOpen, !1) + scrollTop: ph(t.scrollTop), + activeAssetId: fh(t.activeAssetId), + selectedAssetIds: Array.isArray(t.selectedAssetIds) ? t.selectedAssetIds.map((e) => fh(e).trim()).filter(Boolean).slice(0, 5e3) : [], + sidebarOpen: uh(t.sidebarOpen, !1) }; } -function lh() { +function gh() { try { - let e = localStorage.getItem(th); - if (e) return ch(JSON.parse(e)); + let e = localStorage.getItem(ch); + if (e) return hh(JSON.parse(e)); } catch {} return {}; } -function uh(e) { +function _h(e) { try { let t = { ...e }; - delete t.lastGridCount, delete t.lastGridTotal, delete t.viewScope, delete t.similarResults, delete t.similarTitle, delete t.similarSourceAssetId, localStorage.setItem(th, JSON.stringify(t)); + delete t.lastGridCount, delete t.lastGridTotal, delete t.viewScope, delete t.similarResults, delete t.similarTitle, delete t.similarSourceAssetId, localStorage.setItem(ch, JSON.stringify(t)); } catch {} } -var dh = Nr("mjr-panel", () => { - let e = lh(), t = Q(e.scope || "output"), n = Q(e.customRootId || ""), r = Q(e.customRootLabel || ""), i = Q(e.currentFolderRelativePath || ""), a = Q(e.collectionId || ""), o = Q(e.collectionName || ""), s = Q(e.kindFilter || ""), c = Q(e.dateRangeFilter || ""), l = Q(e.dateExactFilter || ""), u = Q(e.workflowOnly || !1), d = Q(e.minRating || 0), f = Q(e.minSizeMB || 0), p = Q(e.maxSizeMB || 0), m = Q(e.resolutionCompare || "gte"), h = Q(e.minWidth || 0), g = Q(e.minHeight || 0), _ = Q(e.maxWidth || 0), v = Q(e.maxHeight || 0), y = Q(e.workflowType || ""), b = Q(e.workflowId || ""), x = Q(e.workflowModelFilter || ""), S = Q(e.workflowRunsOnFilter || ""), C = Q(e.sort || "mtime_desc"), w = Q(e.searchQuery || ""), T = Q(e.metadataSearchMode || "AND"), E = Q(e.scrollTop || 0), D = Q(e.activeAssetId || ""), O = Q(e.selectedAssetIds || []), k = Q(e.sidebarOpen || !1), A = Q(0), j = Q(0), M = Q(""), N = Q([]), P = Q(""), ee = Q(""), te = null; - lr([ +var vh = Nr("mjr-panel", () => { + let e = gh(), t = Q(e.scope || "output"), n = Q(e.customRootId || ""), r = Q(e.customRootLabel || ""), i = Q(e.currentFolderRelativePath || ""), a = Q(e.collectionId || ""), o = Q(e.collectionName || ""), s = Q(e.kindFilter || ""), c = Q(e.dateRangeFilter || ""), l = Q(e.dateExactFilter || ""), u = Q(e.workflowOnly || !1), d = Q(e.minRating || 0), f = Q(e.minSizeMB || 0), p = Q(e.maxSizeMB || 0), m = Q(e.resolutionCompare || "gte"), h = Q(e.minWidth || 0), g = Q(e.minHeight || 0), _ = Q(e.maxWidth || 0), v = Q(e.maxHeight || 0), y = Q(e.workflowType || ""), b = Q(e.workflowId || ""), x = Q(e.workflowModelFilter || ""), S = Q(e.workflowRunsOnFilter || ""), C = Q(e.sort || "mtime_desc"), w = Q(e.searchQuery || ""), T = Q(e.metadataSearchMode || "AND"), E = Q(e.scrollTop || 0), D = Q(e.activeAssetId || ""), O = Q(e.selectedAssetIds || []), k = Q(e.sidebarOpen || !1), A = Q(0), j = Q(0), M = Q(""), N = Q([]), P = Q(""), ee = Q(""), te = null; + cr([ t, n, r, @@ -12632,7 +12662,7 @@ var dh = Nr("mjr-panel", () => { k ], () => { te && clearTimeout(te), te = setTimeout(() => { - te = null, uh({ + te = null, _h({ scope: t.value, customRootId: n.value, customRootLabel: r.value, @@ -12666,8 +12696,8 @@ var dh = Nr("mjr-panel", () => { }, 750); }, { deep: !0 }); let F = (e) => { - if (e.key === th && e.newValue) try { - let n = ch(JSON.parse(e.newValue)); + if (e.key === ch && e.newValue) try { + let n = hh(JSON.parse(e.newValue)); n.scope !== void 0 && (t.value = n.scope), n.customRootLabel !== void 0 && (r.value = n.customRootLabel), n.searchQuery !== void 0 && (w.value = n.searchQuery), n.metadataSearchMode !== void 0 && (T.value = n.metadataSearchMode), n.sort !== void 0 && (C.value = n.sort), n.sidebarOpen !== void 0 && (k.value = n.sidebarOpen); } catch {} }; @@ -12747,16 +12777,16 @@ var dh = Nr("mjr-panel", () => { }; }); // ui/stores/getOptionalPanelStore.ts -function fh() { +function yh() { try { - return Pr() ? dh() : null; + return Pr() ? vh() : null; } catch { return null; } } // ui/stores/panelStateBridge.ts -function ph(e, t = []) { - let n = fh(); +function bh(e, t = []) { + let n = yh(); return { panelStore: n, hydrateStoreFromLegacy: () => {}, @@ -12783,12 +12813,12 @@ function ph(e, t = []) { }; } // ui/features/panel/messages/messageCenter.ts -var mh = "mjr_panel_messages_v1", hh = "mjr_panel_messages_last_read_v1", gh = "mjr_panel_messages_dismissed_builtin_ids_v1", _h = 120, vh = "/mjr/am/user-guide", yh = /* @__PURE__ */ new Set([ +var xh = "mjr_panel_messages_v1", Sh = "mjr_panel_messages_last_read_v1", Ch = "mjr_panel_messages_dismissed_builtin_ids_v1", wh = 120, Th = "/mjr/am/user-guide", Eh = /* @__PURE__ */ new Set([ "info", "success", "warning", "error" -]), bh = "mjr:panel-messages-changed", xh = !1, Sh = [], Ch = Object.freeze([ +]), Dh = "mjr:panel-messages-changed", Oh = !1, kh = [], Ah = Object.freeze([ { id: "whats-new-2026-07-09-version-2-5-0", title: "New Version 2.5.0", @@ -12911,7 +12941,7 @@ var mh = "mjr_panel_messages_v1", hh = "mjr_panel_messages_last_read_v1", gh = " bodyKey: "msg.whatsNew.body.localUserGuide", actionLabel: "User Guide", actionLabelKey: "label.userGuide", - actionUrl: vh + actionUrl: Th }, { id: "tip-2026-04-07-output-folder-override", @@ -13093,27 +13123,27 @@ var mh = "mjr_panel_messages_v1", hh = "mjr_panel_messages_last_read_v1", gh = " actionLabelKey: "label.settingsGuide", actionUrl: "docs/SETTINGS_CONFIGURATION.md" } -]), wh = new Set(Ch.map((e) => String(e?.id || "").trim()).filter(Boolean)); -function Th(e, t = 0) { +]), jh = new Set(Ah.map((e) => String(e?.id || "").trim()).filter(Boolean)); +function Mh(e, t = 0) { let n = Number(e); return Number.isFinite(n) ? n : t; } -function Eh() { +function Nh() { return Date.now(); } -function Dh() { - return Ne(`msg-${Eh()}-`, 6); +function Ph() { + return Ne(`msg-${Nh()}-`, 6); } -function Oh(e) { +function Fh(e) { let t = String(e || "").trim().toLowerCase(); - return t === "warn" ? "warning" : t === "danger" ? "error" : yh.has(t) ? t : "info"; + return t === "warn" ? "warning" : t === "danger" ? "error" : Eh.has(t) ? t : "info"; } -function kh(e) { - return wh.has(String(e || "").trim()); +function Ih(e) { + return jh.has(String(e || "").trim()); } -function Ah(e = {}) { +function Lh(e = {}) { return { - id: String(e?.id || "").trim() || Dh(), + id: String(e?.id || "").trim() || Ph(), title: String(e?.title || "").trim() || "Info", titleKey: String(e?.titleKey || "").trim(), emoji: String(e?.emoji || "").trim(), @@ -13121,14 +13151,14 @@ function Ah(e = {}) { bodyKey: String(e?.bodyKey || "").trim(), category: String(e?.category || "").trim() || "Info", categoryKey: String(e?.categoryKey || "").trim(), - createdAt: Th(e?.createdAt, Eh()), - level: Oh(e?.level), + createdAt: Mh(e?.createdAt, Nh()), + level: Fh(e?.level), actionLabel: String(e?.actionLabel || "").trim(), actionLabelKey: String(e?.actionLabelKey || "").trim(), actionUrl: String(e?.actionUrl || "").trim() }; } -function jh(e, t) { +function Rh(e, t) { try { let n = localStorage.getItem(e); return n ? JSON.parse(n) : t; @@ -13136,87 +13166,87 @@ function jh(e, t) { return t; } } -function Mh(e, t) { +function zh(e, t) { try { localStorage.setItem(e, JSON.stringify(t)); } catch {} } -function Nh() { +function Bh() { try { - return Th(localStorage.getItem(hh), 0); + return Mh(localStorage.getItem(Sh), 0); } catch { return 0; } } -function Ph(e) { +function Vh(e) { try { - localStorage.setItem(hh, String(Th(e, Eh()))); + localStorage.setItem(Sh, String(Mh(e, Nh()))); } catch {} } -function Fh() { - let e = jh(gh, []); - return new Set((Array.isArray(e) ? e : []).map((e) => String(e || "").trim()).filter((e) => kh(e))); +function Hh() { + let e = Rh(Ch, []); + return new Set((Array.isArray(e) ? e : []).map((e) => String(e || "").trim()).filter((e) => Ih(e))); } -function Ih() { - Sh.sort((e, t) => Number(t.createdAt || 0) - Number(e.createdAt || 0)), Sh.length > _h && (Sh = Sh.slice(0, _h)); +function Uh() { + kh.sort((e, t) => Number(t.createdAt || 0) - Number(e.createdAt || 0)), kh.length > wh && (kh = kh.slice(0, wh)); } -function Lh() { - Mh(mh, Sh); +function Wh() { + zh(xh, kh); } -function Rh() { - let e = Fh(), t = !1; - for (let n of Ch) { - let r = Ah(n); +function Gh() { + let e = Hh(), t = !1; + for (let n of Ah) { + let r = Lh(n); if (e.has(r.id)) continue; - let i = Sh.findIndex((e) => e.id === r.id); + let i = kh.findIndex((e) => e.id === r.id); if (i < 0) { - Sh.push(r), t = !0; + kh.push(r), t = !0; continue; } - let a = Sh[i], o = { + let a = kh[i], o = { ...a, ...r, - createdAt: Th(a?.createdAt, r.createdAt) + createdAt: Mh(a?.createdAt, r.createdAt) }; - JSON.stringify(a) !== JSON.stringify(o) && (Sh[i] = o, t = !0); + JSON.stringify(a) !== JSON.stringify(o) && (kh[i] = o, t = !0); } - return t ? (Ih(), Lh(), !0) : !1; + return t ? (Uh(), Wh(), !0) : !1; } -function zh() { +function Kh() { try { - window.dispatchEvent(new CustomEvent(bh, { detail: { - total: Sh.length, - unread: Uh() + window.dispatchEvent(new CustomEvent(Dh, { detail: { + total: kh.length, + unread: Xh() } })); } catch (e) { console.debug?.(e); } } -function Bh() { - if (xh) return; - xh = !0; - let e = jh(mh, []); - Sh = (Array.isArray(e) ? e : []).map(Ah), Ih(); +function qh() { + if (Oh) return; + Oh = !0; + let e = Rh(xh, []); + kh = (Array.isArray(e) ? e : []).map(Lh), Uh(); } -function Vh() { - Bh(), Rh() && zh(); +function Jh() { + qh(), Gh() && Kh(); } -function Hh() { - return Bh(), Sh.map((e) => ({ ...e })); +function Yh() { + return qh(), kh.map((e) => ({ ...e })); } -function Uh() { - Bh(); - let e = Nh(); - return Sh.reduce((t, n) => t + +(Number(n.createdAt || 0) > e), 0); +function Xh() { + qh(); + let e = Bh(); + return kh.reduce((t, n) => t + +(Number(n.createdAt || 0) > e), 0); } -function Wh() { - return Bh(), Nh(); +function Zh() { + return qh(), Bh(); } -function Gh({ upTo: e = Eh() } = {}) { - Bh(), Ph(Th(e, Eh())), zh(); +function Qh({ upTo: e = Nh() } = {}) { + qh(), Vh(Mh(e, Nh())), Kh(); } // ui/features/panel/messages/shortcutGuide.ts -var Kh = Object.freeze([ +var $h = Object.freeze([ { id: "panel", titleKey: "msg.shortcuts.section.panel", @@ -13425,18 +13455,18 @@ var Kh = Object.freeze([ ]) } ]); -function qh() { - return Kh.map((e) => ({ +function eg() { + return $h.map((e) => ({ ...e, items: Array.isArray(e.items) ? e.items.map((e) => ({ ...e })) : [] })); } -function Jh() { +function tg() { let e = document.createElement("div"); e.className = "mjr-shortcut-guide"; let t = document.createElement("div"); t.className = "mjr-shortcut-guide-intro", t.textContent = R("msg.shortcuts.intro", "Current keyboard shortcuts grouped by section for quick reference."), e.appendChild(t); - for (let t of qh()) { + for (let t of eg()) { let n = document.createElement("section"); n.className = "mjr-shortcut-section"; let r = document.createElement("div"); @@ -13456,18 +13486,18 @@ function Jh() { return e; } // ui/features/panel/messages/messagePopoverController.ts -var Yh = /* @__PURE__ */ new Set([ +var ng = /* @__PURE__ */ new Set([ "info", "success", "warning", "error" -]), Xh = 2200, Zh = /* @__PURE__ */ new Set([ +]), rg = 2200, ig = /* @__PURE__ */ new Set([ "started", "queued", "running", "pending", "in_progress" -]), Qh = /* @__PURE__ */ new Set([ +]), ag = /* @__PURE__ */ new Set([ "succeeded", "success", "complete", @@ -13478,7 +13508,7 @@ var Yh = /* @__PURE__ */ new Set([ "cancelled", "canceled" ]); -function $h(e) { +function og(e) { let t = Number(e); if (!Number.isFinite(t) || t <= 0) return ""; try { @@ -13493,15 +13523,15 @@ function $h(e) { return ""; } } -function eg(e, t, n, r) { +function sg(e, t, n, r) { let i = String(e?.[t] || "").trim(), a = String(e?.[n] || r || "").trim() || String(r || ""); return i ? R(i, a) : a; } -function tg(e) { +function cg(e) { let t = String(e || "").trim().toLowerCase(); - return t === "warn" ? "warning" : t === "danger" ? "error" : Yh.has(t) ? t : "info"; + return t === "warn" ? "warning" : t === "danger" ? "error" : ng.has(t) ? t : "info"; } -function ng(e) { +function lg(e) { let t = String(e || "").trim(); if (!t) return ""; try { @@ -13511,13 +13541,13 @@ function ng(e) { return ""; } } -function rg(e) { +function ug(e) { let t = String(e?.emoji || "").trim(); if (t) return t; - let n = tg(e?.level); + let n = cg(e?.level); return n === "success" ? "OK" : n === "warning" ? "WARN" : n === "error" ? "ERR" : "INFO"; } -function ig(e) { +function dg(e) { switch (String(e || "").toLowerCase()) { case "success": return "OK"; case "warning": return "WARN"; @@ -13525,22 +13555,22 @@ function ig(e) { default: return "Tip"; } } -function ag(e) { +function fg(e) { if (e?.persistent) return "persistent"; let t = Number(e?.durationMs); return !Number.isFinite(t) || t <= 0 ? "" : t < 1e4 ? `${(t / 1e3).toFixed(1)}s` : `${Math.round(t / 1e3)}s`; } -function og(e) { +function pg(e) { let t = String(e || "").trim().toLowerCase(); return t ? t.replace(/[_-]+/g, " ") : ""; } -function sg(e) { +function mg(e) { let t = e?.progress; if (!t || typeof t != "object") return ""; let n = String(t.label || "").trim(), r = Number(t.current), i = Number(t.total), a = Number(t.indexed), o = Number(t.skipped), s = Number(t.errors), c = []; return n && c.push(n), Number.isFinite(r) && Number.isFinite(i) && i > 0 && c.push(`${r}/${i}`), Number.isFinite(a) && c.push(`indexed ${a}`), Number.isFinite(o) && c.push(`skipped ${o}`), Number.isFinite(s) && s > 0 && c.push(`errors ${s}`), c.join(" | "); } -function cg(e) { +function hg(e) { let t = e?.progress; if (!t || typeof t != "object") return null; let n = Number(t.percent); @@ -13548,14 +13578,14 @@ function cg(e) { let r = Number(t.current), i = Number(t.total); return Number.isFinite(r) && Number.isFinite(i) && i > 0 ? Math.max(0, Math.min(100, Math.round(r / i * 100))) : null; } -function lg(e) { +function gg(e) { return String(e?.trackId || "").trim() || [ String(e?.operation || "").trim(), String(e?.source || "").trim(), String(e?.title || "").trim() ].filter(Boolean).join(":"); } -function ug({ activeTab: e = "messages", title: t = null, messagePopover: n = null, messageTabBtn: r = null, historyTabBtn: i = null, shortcutsTabBtn: a = null, messageList: o = null, historyPanel: s = null, shortcutsPanel: c = null, markReadBtn: l = null } = {}) { +function _g({ activeTab: e = "messages", title: t = null, messagePopover: n = null, messageTabBtn: r = null, historyTabBtn: i = null, shortcutsTabBtn: a = null, messageList: o = null, historyPanel: s = null, shortcutsPanel: c = null, markReadBtn: l = null } = {}) { let u = e === "messages", d = e === "history", f = e === "shortcuts", p = u ? R("label.messages", "Messages") : d ? R("label.toastHistory", "History") : R("msg.shortcuts.title", "Shortcut Guide"); try { r?.classList.toggle("is-active", u), r?.setAttribute("aria-selected", u ? "true" : "false"), r?.setAttribute("tabindex", u ? "0" : "-1"), i?.classList.toggle("is-active", d), i?.setAttribute("aria-selected", d ? "true" : "false"), i?.setAttribute("tabindex", d ? "0" : "-1"), a?.classList.toggle("is-active", f), a?.setAttribute("aria-selected", f ? "true" : "false"), a?.setAttribute("tabindex", f ? "0" : "-1"); @@ -13568,8 +13598,8 @@ function ug({ activeTab: e = "messages", title: t = null, messagePopover: n = nu console.debug?.(e); } } -function dg({ messageBtn: e = null, messagePopover: t = null, title: n = null, messageList: r = null, historyTabBtn: i = null, historyTabBadge: a = null, historyTabCount: o = null, historyPanel: s = null, shortcutsPanel: c = null, messageTabBtn: l = null, messageTabBadge: u = null, shortcutsTabBtn: d = null, markReadBtn: f = null, popovers: p = null, onBeforeToggle: m = null, signal: h = null } = {}) { - Vh(); +function vg({ messageBtn: e = null, messagePopover: t = null, title: n = null, messageList: r = null, historyTabBtn: i = null, historyTabBadge: a = null, historyTabCount: o = null, historyPanel: s = null, shortcutsPanel: c = null, messageTabBtn: l = null, messageTabBadge: u = null, shortcutsTabBtn: d = null, markReadBtn: f = null, popovers: p = null, onBeforeToggle: m = null, signal: h = null } = {}) { + Jh(); let g = "messages", _ = !1, v = null, y = /* @__PURE__ */ new Set(), b = () => { if (v) { try { @@ -13583,13 +13613,13 @@ function dg({ messageBtn: e = null, messagePopover: t = null, title: n = null, m if (!_ || g !== "history" || t?.style?.display !== "block") return; let e = A(); for (let n of e) { - let e = lg(n); + let e = gg(n); if (!e || !y.has(e)) continue; let r = String(n?.status || "").trim().toLowerCase(); - if (Qh.has(r)) { + if (ag.has(r)) { b(), v = setTimeout(() => { v = null, _ && g === "history" && t?.style?.display === "block" && (p?.close?.(t), _ = !1, y.clear(), S(), k()); - }, Xh); + }, rg); return; } } @@ -13607,14 +13637,14 @@ function dg({ messageBtn: e = null, messagePopover: t = null, title: n = null, m } }, C = () => { if (!r) return; - let e = Hh(), t = Wh(); + let e = Yh(), t = Zh(); if (r.replaceChildren(), !e.length) { let e = document.createElement("div"); e.className = "mjr-messages-empty", e.textContent = R("msg.noMessages", "No messages for now."), r.appendChild(e); } else for (let n of e) { let e = document.createElement("article"); e.className = "mjr-message-item"; - let i = tg(n?.level); + let i = cg(n?.level); e.classList.add(`mjr-message-item--${i}`); let a = Number(n?.createdAt || 0); a > Number(t || 0) && e.classList.add("mjr-message-item--unread"); @@ -13623,16 +13653,16 @@ function dg({ messageBtn: e = null, messagePopover: t = null, title: n = null, m let s = document.createElement("div"); s.className = "mjr-message-item-title-wrap"; let c = document.createElement("span"); - c.className = "mjr-message-item-emoji", c.textContent = rg(n), c.setAttribute("aria-hidden", "true"); + c.className = "mjr-message-item-emoji", c.textContent = ug(n), c.setAttribute("aria-hidden", "true"); let l = document.createElement("div"); - l.className = "mjr-message-item-title", l.textContent = eg(n, "titleKey", "title", R("label.info", "Info")); + l.className = "mjr-message-item-title", l.textContent = sg(n, "titleKey", "title", R("label.info", "Info")); let u = document.createElement("span"); - u.className = "mjr-message-item-category", u.textContent = eg(n, "categoryKey", "category", R("label.info", "Info")), s.appendChild(c), s.appendChild(l), o.appendChild(s), o.appendChild(u); + u.className = "mjr-message-item-category", u.textContent = sg(n, "categoryKey", "category", R("label.info", "Info")), s.appendChild(c), s.appendChild(l), o.appendChild(s), o.appendChild(u); let d = document.createElement("div"); - d.className = "mjr-message-item-meta", d.textContent = $h(a); + d.className = "mjr-message-item-meta", d.textContent = og(a); let f = document.createElement("div"); - f.className = "mjr-message-item-body", f.textContent = eg(n, "bodyKey", "body", ""), e.appendChild(o), d.textContent && e.appendChild(d), f.textContent && e.appendChild(f); - let p = ng(n?.actionUrl), m = eg(n, "actionLabelKey", "actionLabel", R("label.readMe", "Read Me")); + f.className = "mjr-message-item-body", f.textContent = sg(n, "bodyKey", "body", ""), e.appendChild(o), d.textContent && e.appendChild(d), f.textContent && e.appendChild(f); + let p = lg(n?.actionUrl), m = sg(n, "actionLabelKey", "actionLabel", R("label.readMe", "Read Me")); if (p && m) { let t = document.createElement("a"); t.className = "mjr-message-item-action", t.href = p, t.target = "_blank", t.rel = "noopener noreferrer", t.textContent = m, e.appendChild(t); @@ -13659,7 +13689,7 @@ function dg({ messageBtn: e = null, messagePopover: t = null, title: n = null, m let e = document.createElement("div"); e.className = `mjr-history-item mjr-history-item--${String(n.type || "info")}`; let r = document.createElement("span"); - r.className = "mjr-history-item-icon", r.textContent = ig(n.type), r.setAttribute("aria-hidden", "true"); + r.className = "mjr-history-item-icon", r.textContent = dg(n.type), r.setAttribute("aria-hidden", "true"); let i = document.createElement("div"); i.className = "mjr-history-item-content"; let a = String(n.title || "").trim(), o = String(n.detail || "").trim(), s = String(n.message || "").trim(), c = a || s, l = a && o ? o : a ? "" : o, u = document.createElement("div"); @@ -13669,14 +13699,14 @@ function dg({ messageBtn: e = null, messagePopover: t = null, title: n = null, m let f = document.createElement("div"); f.className = "mjr-history-item-meta"; let p = document.createElement("span"); - p.className = "mjr-history-item-time", p.textContent = $h(n.createdAt); + p.className = "mjr-history-item-time", p.textContent = og(n.createdAt); let m = document.createElement("span"); - m.className = "mjr-history-item-chip", m.textContent = ag(n); + m.className = "mjr-history-item-chip", m.textContent = fg(n); let h = document.createElement("span"); h.className = "mjr-history-item-chip", h.textContent = String(n.source || "").trim(); let g = document.createElement("span"); - g.className = "mjr-history-item-chip", g.textContent = og(n.status), i.appendChild(u), d.textContent && i.appendChild(d), p.textContent && f.appendChild(p), m.textContent && f.appendChild(m), g.textContent && f.appendChild(g), h.textContent && f.appendChild(h), f.childNodes.length && i.appendChild(f); - let _ = sg(n), v = cg(n); + g.className = "mjr-history-item-chip", g.textContent = pg(n.status), i.appendChild(u), d.textContent && i.appendChild(d), p.textContent && f.appendChild(p), m.textContent && f.appendChild(m), g.textContent && f.appendChild(g), h.textContent && f.appendChild(h), f.childNodes.length && i.appendChild(f); + let _ = mg(n), v = hg(n); if (_ || v !== null) { let e = document.createElement("div"); if (e.className = "mjr-history-item-progress", _) { @@ -13691,7 +13721,7 @@ function dg({ messageBtn: e = null, messagePopover: t = null, title: n = null, m } i.appendChild(e); } - let y = ng(n?.actionUrl), b = String(n?.actionLabel || "").trim(); + let y = lg(n?.actionUrl), b = String(n?.actionLabel || "").trim(); if (y && b) { let e = document.createElement("a"); e.className = "mjr-history-item-action", e.href = y, e.target = "_blank", e.rel = "noopener noreferrer", e.textContent = b, i.appendChild(e); @@ -13706,13 +13736,13 @@ function dg({ messageBtn: e = null, messagePopover: t = null, title: n = null, m let e = ae(); a && (a.style.display = e > 0 ? "inline-block" : "none"), T(o, e); }, D = () => { - c && (c.childNodes.length > 0 || c.replaceChildren(Jh())); + c && (c.childNodes.length > 0 || c.replaceChildren(tg())); }, O = () => { if (!f) return; - let e = Math.max(0, Number(Uh() || 0) || 0); + let e = Math.max(0, Number(Xh() || 0) || 0); f.disabled = e <= 0, f.title = e > 0 ? R("tooltip.markMessagesRead", "Mark all messages as read") : R("tooltip.noUnreadMessages", "No unread messages"); }, k = () => { - let t = Math.max(0, Number(Uh() || 0) || 0); + let t = Math.max(0, Number(Xh() || 0) || 0); if (e) { let n = e.querySelector(".mjr-message-badge"), r = t > 0 ? R("tooltip.openMessagesUnread", "Messages ({count} unread)", { count: t }) : R("tooltip.openMessages", "Messages and updates"); e.classList.toggle("mjr-message-has-unread", t > 0), e.title = r, e.setAttribute("aria-label", r), n && (t <= 0 ? (n.style.display = "none", n.textContent = "") : (n.style.display = "inline-flex", n.textContent = t > 9 ? "9+" : String(t))); @@ -13722,7 +13752,7 @@ function dg({ messageBtn: e = null, messagePopover: t = null, title: n = null, m k(), E(), t?.style?.display === "block" && (g === "messages" && C(), g === "history" && w()); }, M = h ? { signal: h } : void 0; try { - window.addEventListener(bh, j, M); + window.addEventListener(Dh, j, M); } catch (e) { console.debug?.(e); } @@ -13730,8 +13760,8 @@ function dg({ messageBtn: e = null, messagePopover: t = null, title: n = null, m window.addEventListener(de, () => { if (E(), t?.style?.display === "block" && g === "history" && w(), _) { for (let e of A()) { - let t = String(e?.status || "").trim().toLowerCase(), n = lg(e); - n && Zh.has(t) && y.add(n); + let t = String(e?.status || "").trim().toLowerCase(), n = gg(e); + n && ig.has(t) && y.add(n); } x(); } @@ -13758,7 +13788,7 @@ function dg({ messageBtn: e = null, messagePopover: t = null, title: n = null, m } catch (e) { console.debug?.(e); } - k(), E(), S(), ug({ + k(), E(), S(), _g({ activeTab: g, title: n, messagePopover: t, @@ -13771,7 +13801,7 @@ function dg({ messageBtn: e = null, messagePopover: t = null, title: n = null, m markReadBtn: f }); let P = () => { - g = "messages", ug({ + g = "messages", _g({ activeTab: g, title: n, messagePopover: t, @@ -13782,9 +13812,9 @@ function dg({ messageBtn: e = null, messagePopover: t = null, title: n = null, m historyPanel: s, shortcutsPanel: c, markReadBtn: f - }), C(), Gh(), k(); + }), C(), Qh(), k(); }, ee = () => { - g = "history", ug({ + g = "history", _g({ activeTab: g, title: n, messagePopover: t, @@ -13797,7 +13827,7 @@ function dg({ messageBtn: e = null, messagePopover: t = null, title: n = null, m markReadBtn: f }), w(), pe(), E(); }, te = () => { - g = "shortcuts", ug({ + g = "shortcuts", _g({ activeTab: g, title: n, messagePopover: t, @@ -13823,8 +13853,8 @@ function dg({ messageBtn: e = null, messagePopover: t = null, title: n = null, m } ee(), _ = !0, b(), y.clear(); for (let e of A()) { - let t = String(e?.status || "").trim().toLowerCase(), n = lg(e); - n && Zh.has(t) && y.add(n); + let t = String(e?.status || "").trim().toLowerCase(), n = gg(e); + n && ig.has(t) && y.add(n); } x(), S(), k(); } @@ -13856,7 +13886,7 @@ function dg({ messageBtn: e = null, messagePopover: t = null, title: n = null, m }; return e?.addEventListener("click", (a) => { if (t && p && e) { - a.stopPropagation(), _ = !1, y.clear(), b(), g = "messages", C(), D(), ug({ + a.stopPropagation(), _ = !1, y.clear(), b(), g = "messages", C(), D(), _g({ activeTab: g, title: n, messagePopover: t, @@ -13873,7 +13903,7 @@ function dg({ messageBtn: e = null, messagePopover: t = null, title: n = null, m } catch (e) { console.debug?.(e); } - p.toggle(t, e), t?.style?.display === "block" && Gh(), S(), k(); + p.toggle(t, e), t?.style?.display === "block" && Qh(), S(), k(); } }, M), l?.addEventListener("click", (e) => { e.preventDefault(), e.stopPropagation(), P(); @@ -13882,7 +13912,7 @@ function dg({ messageBtn: e = null, messagePopover: t = null, title: n = null, m }, M), i?.addEventListener("keydown", (e) => re(e, "history"), M), d?.addEventListener("click", (e) => { e.preventDefault(), e.stopPropagation(), te(); }, M), d?.addEventListener("keydown", (e) => re(e, "shortcuts"), M), f?.addEventListener("click", (e) => { - e.preventDefault(), e.stopPropagation(), Gh(), C(), k(); + e.preventDefault(), e.stopPropagation(), Qh(), C(), k(); }, M), { refresh: j, render: C, @@ -13897,7 +13927,7 @@ function dg({ messageBtn: e = null, messagePopover: t = null, title: n = null, m }; } // ui/features/panel/controllers/query.ts -function fg(e) { +function yg(e) { let t = e; for (let e = 0; e < 3 && t && typeof t == "object" && "value" in t; e += 1) { let e = t.value; @@ -13906,8 +13936,8 @@ function fg(e) { } return t; } -function pg(e) { - let t = fg(e); +function bg(e) { + let t = yg(e); if (!t) return null; let n = String(t?.tagName || "").toUpperCase(); if (n === "INPUT" || n === "TEXTAREA") return t; @@ -13921,13 +13951,13 @@ function pg(e) { } return null; } -function mg(e) { - let t = pg(e), n = t ? t.value : typeof e?.value == "string" ? e.value : ""; +function xg(e) { + let t = bg(e), n = t ? t.value : typeof e?.value == "string" ? e.value : ""; return String(n || "").trim() || "*"; } // ui/features/panel/controllers/gridController.ts -function hg({ gridContainer: t, loadAssets: n, loadAssetsFromList: r, getCollectionAssets: i, disposeGrid: a, getQuery: o, searchInputEl: s, state: c }) { - let { read: l, write: u } = ph(c, /* @__PURE__ */ "scope.customRootId.currentFolderRelativePath.kindFilter.workflowOnly.minRating.minSizeMB.maxSizeMB.resolutionCompare.minWidth.minHeight.maxWidth.maxHeight.workflowType.workflowId.workflowModelFilter.workflowRunsOnFilter.dateRangeFilter.dateExactFilter.sort.activeAssetId.selectedAssetIds.collectionId.collectionName.viewScope.similarResults.similarTitle.similarSourceAssetId.lastGridCount.lastGridTotal".split(".")), f = !1, p = !1, m = {}, h = 0, g = 0, _ = 3e4, v = async (e, t = _) => { +function Sg({ gridContainer: t, loadAssets: n, loadAssetsFromList: r, getCollectionAssets: i, disposeGrid: a, getQuery: o, searchInputEl: s, state: c }) { + let { read: l, write: u } = bh(c, /* @__PURE__ */ "scope.customRootId.currentFolderRelativePath.kindFilter.workflowOnly.minRating.minSizeMB.maxSizeMB.resolutionCompare.minWidth.minHeight.maxWidth.maxHeight.workflowType.workflowId.workflowModelFilter.workflowRunsOnFilter.dateRangeFilter.dateExactFilter.sort.activeAssetId.selectedAssetIds.collectionId.collectionName.viewScope.similarResults.similarTitle.similarSourceAssetId.lastGridCount.lastGridTotal".split(".")), f = !1, p = !1, m = {}, h = 0, g = 0, _ = 3e4, v = async (e, t = _) => { let n = null; try { let r = new Promise((e, r) => { @@ -13948,7 +13978,7 @@ function hg({ gridContainer: t, loadAssets: n, loadAssetsFromList: r, getCollect } }, b = () => { try { - return !!(Hn()?.ai?.vectorSearchEnabled ?? !0); + return !!(Vn()?.ai?.vectorSearchEnabled ?? !0); } catch { return !0; } @@ -14152,8 +14182,8 @@ function hg({ gridContainer: t, loadAssets: n, loadAssetsFromList: r, getCollect }) }; } // ui/features/panel/controllers/browserNavigationController.ts -function gg({ state: e, gridContainer: t, folderBreadcrumb: n, folderBreadcrumbController: r = null, customSelect: i, reloadGrid: a, clearSelection: o = null, onContextChanged: s = null, lifecycleSignal: c = null } = {}) { - let { read: l, write: u } = ph(e, [ +function Cg({ state: e, gridContainer: t, folderBreadcrumb: n, folderBreadcrumbController: r = null, customSelect: i, reloadGrid: a, clearSelection: o = null, onContextChanged: s = null, lifecycleSignal: c = null } = {}) { + let { read: l, write: u } = bh(e, [ "scope", "customRootId", "currentFolderRelativePath" @@ -14386,8 +14416,8 @@ function gg({ state: e, gridContainer: t, folderBreadcrumb: n, folderBreadcrumbC }; } // ui/features/panel/controllers/scopeController.ts -function _g({ state: e, tabButtons: t, customMenuBtn: n, customPopover: r, popovers: i, reloadGrid: a, reconcileSelection: o = null, onChanged: s = null, onScopeChanged: c = null, onBeforeReload: l = null }) { - let u = 0, { panelStore: d, read: f, write: p, controllerState: m } = ph(e, [ +function wg({ state: e, tabButtons: t, customMenuBtn: n, customPopover: r, popovers: i, reloadGrid: a, reconcileSelection: o = null, onChanged: s = null, onScopeChanged: c = null, onBeforeReload: l = null }) { + let u = 0, { panelStore: d, read: f, write: p, controllerState: m } = bh(e, [ "scope", "customRootId", "currentFolderRelativePath", @@ -14502,21 +14532,21 @@ function _g({ state: e, tabButtons: t, customMenuBtn: n, customPopover: r, popov }; } // ui/features/panel/controllers/contextController.ts -var vg = (e, t) => { +var Tg = (e, t) => { if (e) try { e.value = t; } catch (e) { console.debug?.(e); } -}, yg = (e, t) => { +}, Eg = (e, t) => { if (e) try { e.checked = !!t; } catch (e) { console.debug?.(e); } }; -function bg({ state: e, gridContainer: t, filterBtn: n, sortBtn: r, collectionsBtn: i, searchInputEl: a, kindSelect: o, wfCheckbox: s, workflowTypeSelect: c, workflowIdInput: l, workflowModelInput: u, workflowRunsOnSelect: d, ratingSelect: f, minSizeInput: p, maxSizeInput: m, minWidthInput: h, minHeightInput: g, maxWidthInput: _, maxHeightInput: v, resolutionPresetSelect: y, dateRangeSelect: b, dateExactInput: x, scopeController: S, sortController: C, updateSummaryBar: w, reloadGrid: T, extraActions: E = null, getExtraContext: D = null } = {}) { - let O = e && typeof e == "object" ? e : {}, { read: k, write: A, controllerState: j } = ph(e, /* @__PURE__ */ "searchQuery.scope.collectionId.collectionName.customRootId.customRootLabel.currentFolderRelativePath.kindFilter.workflowOnly.minRating.minSizeMB.maxSizeMB.minWidth.minHeight.maxWidth.maxHeight.resolutionCompare.workflowType.workflowId.workflowModelFilter.workflowRunsOnFilter.dateRangeFilter.dateExactFilter.sort.viewScope.similarResults.similarTitle.similarSourceAssetId".split(".")), M = (e, t) => { +function Dg({ state: e, gridContainer: t, filterBtn: n, sortBtn: r, collectionsBtn: i, searchInputEl: a, kindSelect: o, wfCheckbox: s, workflowTypeSelect: c, workflowIdInput: l, workflowModelInput: u, workflowRunsOnSelect: d, ratingSelect: f, minSizeInput: p, maxSizeInput: m, minWidthInput: h, minHeightInput: g, maxWidthInput: _, maxHeightInput: v, resolutionPresetSelect: y, dateRangeSelect: b, dateExactInput: x, scopeController: S, sortController: C, updateSummaryBar: w, reloadGrid: T, extraActions: E = null, getExtraContext: D = null } = {}) { + let O = e && typeof e == "object" ? e : {}, { read: k, write: A, controllerState: j } = bh(e, /* @__PURE__ */ "searchQuery.scope.collectionId.collectionName.customRootId.customRootLabel.currentFolderRelativePath.kindFilter.workflowOnly.minRating.minSizeMB.maxSizeMB.minWidth.minHeight.maxWidth.maxHeight.resolutionCompare.workflowType.workflowId.workflowModelFilter.workflowRunsOnFilter.dateRangeFilter.dateExactFilter.sort.viewScope.similarResults.similarTitle.similarSourceAssetId".split(".")), M = (e, t) => { A(e, t); }, N = (e, t = "") => k(e, t), P = () => ({ ...O || {}, @@ -14539,7 +14569,7 @@ function bg({ state: e, gridContainer: t, filterBtn: n, sortBtn: r, collectionsB }, F = { clearQuery: async () => { try { - vg(a, ""), M("searchQuery", ""); + Tg(a, ""), M("searchQuery", ""); } catch (e) { console.debug?.(e); } @@ -14608,7 +14638,7 @@ function bg({ state: e, gridContainer: t, filterBtn: n, sortBtn: r, collectionsB }, clearKind: async () => { try { - M("kindFilter", ""), vg(o, ""); + M("kindFilter", ""), Tg(o, ""); } catch (e) { console.debug?.(e); } @@ -14620,7 +14650,7 @@ function bg({ state: e, gridContainer: t, filterBtn: n, sortBtn: r, collectionsB }, clearMinRating: async () => { try { - M("minRating", 0), vg(f, "0"); + M("minRating", 0), Tg(f, "0"); } catch (e) { console.debug?.(e); } @@ -14632,7 +14662,7 @@ function bg({ state: e, gridContainer: t, filterBtn: n, sortBtn: r, collectionsB }, clearWorkflowOnly: async () => { try { - M("workflowOnly", !1), yg(s, !1); + M("workflowOnly", !1), Eg(s, !1); } catch (e) { console.debug?.(e); } @@ -14644,7 +14674,7 @@ function bg({ state: e, gridContainer: t, filterBtn: n, sortBtn: r, collectionsB }, clearWorkflowType: async () => { try { - M("workflowType", ""), vg(c, ""); + M("workflowType", ""), Tg(c, ""); } catch (e) { console.debug?.(e); } @@ -14656,7 +14686,7 @@ function bg({ state: e, gridContainer: t, filterBtn: n, sortBtn: r, collectionsB }, clearWorkflowId: async () => { try { - M("workflowId", ""), vg(l, ""); + M("workflowId", ""), Tg(l, ""); } catch (e) { console.debug?.(e); } @@ -14668,7 +14698,7 @@ function bg({ state: e, gridContainer: t, filterBtn: n, sortBtn: r, collectionsB }, clearWorkflowModel: async () => { try { - M("workflowModelFilter", ""), vg(u, ""); + M("workflowModelFilter", ""), Tg(u, ""); } catch (e) { console.debug?.(e); } @@ -14680,7 +14710,7 @@ function bg({ state: e, gridContainer: t, filterBtn: n, sortBtn: r, collectionsB }, clearWorkflowRunsOn: async () => { try { - M("workflowRunsOnFilter", ""), vg(d, ""); + M("workflowRunsOnFilter", ""), Tg(d, ""); } catch (e) { console.debug?.(e); } @@ -14692,7 +14722,7 @@ function bg({ state: e, gridContainer: t, filterBtn: n, sortBtn: r, collectionsB }, clearSize: async () => { try { - M("minSizeMB", 0), M("maxSizeMB", 0), vg(p, ""), vg(m, ""); + M("minSizeMB", 0), M("maxSizeMB", 0), Tg(p, ""), Tg(m, ""); } catch (e) { console.debug?.(e); } @@ -14704,7 +14734,7 @@ function bg({ state: e, gridContainer: t, filterBtn: n, sortBtn: r, collectionsB }, clearResolution: async () => { try { - M("minWidth", 0), M("minHeight", 0), M("maxWidth", 0), M("maxHeight", 0), vg(h, ""), vg(g, ""), vg(_, ""), vg(v, ""), vg(y, ""); + M("minWidth", 0), M("minHeight", 0), M("maxWidth", 0), M("maxHeight", 0), Tg(h, ""), Tg(g, ""), Tg(_, ""), Tg(v, ""), Tg(y, ""); } catch (e) { console.debug?.(e); } @@ -14716,7 +14746,7 @@ function bg({ state: e, gridContainer: t, filterBtn: n, sortBtn: r, collectionsB }, clearDateRange: async () => { try { - M("dateRangeFilter", ""), vg(b, ""); + M("dateRangeFilter", ""), Tg(b, ""); } catch (e) { console.debug?.(e); } @@ -14728,7 +14758,7 @@ function bg({ state: e, gridContainer: t, filterBtn: n, sortBtn: r, collectionsB }, clearDateExact: async () => { try { - M("dateExactFilter", ""), vg(x, ""); + M("dateExactFilter", ""), Tg(x, ""); } catch (e) { console.debug?.(e); } @@ -14753,7 +14783,7 @@ function bg({ state: e, gridContainer: t, filterBtn: n, sortBtn: r, collectionsB clearAll: async () => { let e = !1; try { - vg(a, ""); + Tg(a, ""); } catch (e) { console.debug?.(e); } @@ -14769,7 +14799,7 @@ function bg({ state: e, gridContainer: t, filterBtn: n, sortBtn: r, collectionsB console.debug?.(e); } try { - vg(o, ""), yg(s, !1), vg(c, ""), vg(l, ""), vg(u, ""), vg(d, ""), vg(f, "0"), vg(p, ""), vg(m, ""), vg(h, ""), vg(g, ""), vg(_, ""), vg(v, ""), vg(y, ""), vg(b, ""), vg(x, ""); + Tg(o, ""), Eg(s, !1), Tg(c, ""), Tg(l, ""), Tg(u, ""), Tg(d, ""), Tg(f, "0"), Tg(p, ""), Tg(m, ""), Tg(h, ""), Tg(g, ""), Tg(_, ""), Tg(v, ""), Tg(y, ""), Tg(b, ""), Tg(x, ""); } catch (e) { console.debug?.(e); } @@ -14795,7 +14825,7 @@ function bg({ state: e, gridContainer: t, filterBtn: n, sortBtn: r, collectionsB } return { update: () => { - let e = String(a?.value || "").trim(), o = mg(a), s = P(), c = !!(N("kindFilter", "") || N("workflowOnly", !1) || (Number(N("minRating", 0) || 0) || 0) > 0 || (Number(N("minSizeMB", 0) || 0) || 0) > 0 || (Number(N("maxSizeMB", 0) || 0) || 0) > 0 || (Number(N("minWidth", 0) || 0) || 0) > 0 || (Number(N("minHeight", 0) || 0) || 0) > 0 || (Number(N("maxWidth", 0) || 0) || 0) > 0 || (Number(N("maxHeight", 0) || 0) || 0) > 0 || String(N("workflowType", "") || "").trim().length > 0 || String(N("workflowId", "") || "").trim().length > 0 || String(N("workflowModelFilter", "") || "").trim().length > 0 || String(N("workflowRunsOnFilter", "") || "").trim().length > 0 || N("dateRangeFilter", "") || N("dateExactFilter", "")), l = String(N("sort", "mtime_desc") || "mtime_desc") !== "mtime_desc", u = !!N("collectionId", ""); + let e = String(a?.value || "").trim(), o = xg(a), s = P(), c = !!(N("kindFilter", "") || N("workflowOnly", !1) || (Number(N("minRating", 0) || 0) || 0) > 0 || (Number(N("minSizeMB", 0) || 0) || 0) > 0 || (Number(N("maxSizeMB", 0) || 0) || 0) > 0 || (Number(N("minWidth", 0) || 0) || 0) > 0 || (Number(N("minHeight", 0) || 0) || 0) > 0 || (Number(N("maxWidth", 0) || 0) || 0) > 0 || (Number(N("maxHeight", 0) || 0) || 0) > 0 || String(N("workflowType", "") || "").trim().length > 0 || String(N("workflowId", "") || "").trim().length > 0 || String(N("workflowModelFilter", "") || "").trim().length > 0 || String(N("workflowRunsOnFilter", "") || "").trim().length > 0 || N("dateRangeFilter", "") || N("dateExactFilter", "")), l = String(N("sort", "mtime_desc") || "mtime_desc") !== "mtime_desc", u = !!N("collectionId", ""); try { n?.classList?.toggle?.("mjr-context-active", c), r?.classList?.toggle?.("mjr-context-active", l), i?.classList?.toggle?.("mjr-context-active", u); } catch (e) { @@ -14821,8 +14851,8 @@ function bg({ state: e, gridContainer: t, filterBtn: n, sortBtn: r, collectionsB }; } // ui/features/panel/controllers/customRootsController.ts -function xg({ state: e, customSelect: t, customRemoveBtn: n, comfyConfirm: r, comfyPrompt: i, comfyToast: a, get: o, post: s, ENDPOINTS: c, reloadGrid: l, onRootChanged: u = null }) { - let d = e && typeof e == "object" ? e : {}, { read: f, write: p } = ph(e, [ +function Og({ state: e, customSelect: t, customRemoveBtn: n, comfyConfirm: r, comfyPrompt: i, comfyToast: a, get: o, post: s, ENDPOINTS: c, reloadGrid: l, onRootChanged: u = null }) { + let d = e && typeof e == "object" ? e : {}, { read: f, write: p } = bh(e, [ "customRootId", "customRootLabel", "currentFolderRelativePath" @@ -14954,8 +14984,8 @@ function xg({ state: e, customSelect: t, customRemoveBtn: n, comfyConfirm: r, co }; } // ui/features/panel/controllers/sortController.ts -function Sg({ state: e, sortBtn: t, sortMenu: n, sortPopover: r, popovers: i, reloadGrid: a, onChanged: o = null }) { - let { read: s, write: c } = ph(e, ["sort"]), l = () => [ +function kg({ state: e, sortBtn: t, sortMenu: n, sortPopover: r, popovers: i, reloadGrid: a, onChanged: o = null }) { + let { read: s, write: c } = bh(e, ["sort"]), l = () => [ { key: "mtime_desc", label: R("sort.newest") @@ -15040,19 +15070,19 @@ function Sg({ state: e, sortBtn: t, sortMenu: n, sortPopover: r, popovers: i, re }; } // ui/features/panel/controllers/sidebarController.ts -var Cg = "_mjrRescanning", wg = 1500, Tg = (e) => /^\d+$/.test(String(e ?? "").trim()); -async function Eg({ card: t, asset: n, sidebar: r, onAssetUpdated: i }) { +var Ag = "_mjrRescanning", jg = 1500, Mg = (e) => /^\d+$/.test(String(e ?? "").trim()); +async function Ng({ card: t, asset: n, sidebar: r, onAssetUpdated: i }) { if (!t || !n || globalThis._mjrMaintenanceActive) return; try { let e = Date.now(); - if (e - (Number(t[Cg] || 0) || 0) < wg) return; - t[Cg] = e; + if (e - (Number(t[Ag] || 0) || 0) < jg) return; + t[Ag] = e; } catch (e) { console.debug?.(e); } let a = t.querySelector(".mjr-workflow-dot"); try { - a && (Ut(a, "pending", "Pending: metadata refresh in progress", { asset: n }), a.classList.add("mjr-pulse-animation"), a.style.cursor = "progress", a.title = R("tooltip.pendingRefresh", "Pending: metadata refresh in progress")); + a && (Ht(a, "pending", "Pending: metadata refresh in progress", { asset: n }), a.classList.add("mjr-pulse-animation"), a.style.cursor = "progress", a.title = R("tooltip.pendingRefresh", "Pending: metadata refresh in progress")); } catch (e) { console.debug?.(e); } @@ -15071,7 +15101,7 @@ async function Eg({ card: t, asset: n, sidebar: r, onAssetUpdated: i }) { if (c = !!(await L(at.INDEX_FILES, { files: [o], incremental: !1 - }))?.ok, !c && a && (Ut(a, "error", "Error: metadata refresh failed", { asset: n }), a.classList.remove("mjr-pulse-animation"), a.style.cursor = ""), Tg(n?.id)) { + }))?.ok, !c && a && (Ht(a, "error", "Error: metadata refresh failed", { asset: n }), a.classList.remove("mjr-pulse-animation"), a.style.cursor = ""), Mg(n?.id)) { l = !0; try { u = !!(await ge(n.id))?.ok; @@ -15088,7 +15118,7 @@ async function Eg({ card: t, asset: n, sidebar: r, onAssetUpdated: i }) { } } catch { try { - a && (Ut(a, "error", "Error: metadata refresh failed", { asset: n }), a.classList.remove("mjr-pulse-animation"), a.style.cursor = ""); + a && (Ht(a, "error", "Error: metadata refresh failed", { asset: n }), a.classList.remove("mjr-pulse-animation"), a.style.cursor = ""); } catch (e) { console.debug?.(e); } @@ -15126,7 +15156,7 @@ async function Eg({ card: t, asset: n, sidebar: r, onAssetUpdated: i }) { } return s; } -function Dg(e, t) { +function Pg(e, t) { if (e) { try { let n = e.querySelector(".mjr-asset-card.is-selected"); @@ -15162,7 +15192,7 @@ function Dg(e, t) { } } } -var Og = (e) => { +var Fg = (e) => { if (e == null) return ""; try { if (typeof CSS < "u" && typeof CSS.escape == "function") return CSS.escape(String(e)); @@ -15171,32 +15201,32 @@ var Og = (e) => { } return String(e).replace(/([!"#$%&'()*+,./:;<=>?@[\\\]^`{|}~])/g, "\\$1"); }; -function kg(e, t) { +function Ig(e, t) { if (!e || !t) return null; try { - return e.querySelector(`.mjr-asset-card[data-mjr-asset-id="${Og(t)}"]`); + return e.querySelector(`.mjr-asset-card[data-mjr-asset-id="${Fg(t)}"]`); } catch (e) { console.debug?.(e); } try { - return e.querySelector(`.mjr-asset-card[data-mjr-asset-id="${Og(t)}"]`); + return e.querySelector(`.mjr-asset-card[data-mjr-asset-id="${Fg(t)}"]`); } catch (e) { console.debug?.(e); } return null; } -function Ag(e) { +function Lg(e) { if (!e) return null; let t = e.dataset?.mjrSelectedAssetId; if (t) { - let n = kg(e, t); + let n = Ig(e, t); if (n) return n; } let n = e.dataset?.mjrSelectedAssetIds; if (n) try { let t = JSON.parse(n); if (Array.isArray(t) && t.length) { - let n = kg(e, t[0]); + let n = Ig(e, t[0]); if (n) return n; } } catch (e) { @@ -15204,7 +15234,7 @@ function Ag(e) { } return e.querySelector(".mjr-asset-card.is-selected"); } -function jg(e, { preventScroll: t = !0 } = {}) { +function Rg(e, { preventScroll: t = !0 } = {}) { if (e) try { e.focus?.({ preventScroll: t }); } catch { @@ -15215,14 +15245,14 @@ function jg(e, { preventScroll: t = !0 } = {}) { } } } -function Mg(e, { force: t = !1 } = {}) { +function zg(e, { force: t = !1 } = {}) { if (!e || !t && !e._mjrFocusWithin) return; - let n = Ag(e); - n && (jg(n), e._mjrFocusWithin = !0); + let n = Lg(e); + n && (Rg(n), e._mjrFocusWithin = !0); } -function Ng(e) { +function Bg(e) { if (e) try { - let t = Ag(e); + let t = Lg(e); if (!t) return; let n = e.parentElement; if (n && typeof n.getBoundingClientRect == "function" && typeof t.getBoundingClientRect == "function") { @@ -15237,7 +15267,7 @@ function Ng(e) { console.debug?.(e); } } -function Pg(e) { +function Vg(e) { if (e) try { e._mjrAutoRevealSelectionUntil = Date.now() + 900; } catch (e) { @@ -15245,12 +15275,12 @@ function Pg(e) { } let t = () => { try { - Ng(e); + Bg(e); } catch (e) { console.debug?.(e); } try { - Mg(e); + zg(e); } catch (e) { console.debug?.(e); } @@ -15265,10 +15295,10 @@ function Pg(e) { t(); } } -function Fg(e, t) { +function Hg(e, t) { e && (t ? (e.classList.add("is-selected"), e.setAttribute?.("aria-selected", "true")) : (e.classList.remove("is-selected"), e.setAttribute?.("aria-selected", "false"))); } -function Ig(e) { +function Ug(e) { try { if (typeof e?._mjrGetRenderedCards == "function") { let t = e._mjrGetRenderedCards(); @@ -15283,15 +15313,15 @@ function Ig(e) { return []; } } -function Lg(e) { +function Wg(e) { if (e) try { - let t = Ig(e).filter((e) => e?.classList?.contains?.("is-selected")).map((e) => e?.dataset?.mjrAssetId).filter(Boolean); + let t = Ug(e).filter((e) => e?.classList?.contains?.("is-selected")).map((e) => e?.dataset?.mjrAssetId).filter(Boolean); t.length ? (e.dataset.mjrSelectedAssetIds = JSON.stringify(t), !e.dataset.mjrSelectedAssetId && t[0] && (e.dataset.mjrSelectedAssetId = String(t[0]))) : (delete e.dataset.mjrSelectedAssetIds, delete e.dataset.mjrSelectedAssetId); } catch (e) { console.debug?.(e); } } -function Rg(e, t, n = "") { +function Gg(e, t, n = "") { if (!e) return []; let r = Array.from(t || []).map(String).filter(Boolean); try { @@ -15305,9 +15335,9 @@ function Rg(e, t, n = "") { console.debug?.(e); } try { - for (let t of Ig(e)) { + for (let t of Ug(e)) { let e = t?.dataset?.mjrAssetId; - Fg(t, !!(e && r.includes(String(e)))); + Hg(t, !!(e && r.includes(String(e)))); } } catch (e) { console.debug?.(e); @@ -15322,7 +15352,7 @@ function Rg(e, t, n = "") { } return r; } -function zg({ gridContainer: e, state: t, activeId: n, readState: r = null, writeState: i = null } = {}) { +function Kg({ gridContainer: e, state: t, activeId: n, readState: r = null, writeState: i = null } = {}) { if ((t || i) && e) try { let a = []; if (e.dataset?.mjrSelectedAssetIds) try { @@ -15331,7 +15361,7 @@ function zg({ gridContainer: e, state: t, activeId: n, readState: r = null, writ } catch (e) { console.debug?.(e); } - else a = e.dataset?.mjrSelectedAssetId ? [String(e.dataset.mjrSelectedAssetId)].filter(Boolean) : Ig(e).filter((e) => e?.classList?.contains?.("is-selected")).map((e) => e?.dataset?.mjrAssetId).filter(Boolean).map(String); + else a = e.dataset?.mjrSelectedAssetId ? [String(e.dataset.mjrSelectedAssetId)].filter(Boolean) : Ug(e).filter((e) => e?.classList?.contains?.("is-selected")).map((e) => e?.dataset?.mjrAssetId).filter(Boolean).map(String); typeof i == "function" ? i("selectedAssetIds", a) : t.selectedAssetIds = a; let o = String(typeof r == "function" ? r("activeAssetId", "") || "" : t?.activeAssetId || ""); n == null ? o && a.includes(o) || (typeof i == "function" ? i("activeAssetId", a[0] || "") : t.activeAssetId = a[0] || "") : typeof i == "function" ? i("activeAssetId", String(n)) : t.activeAssetId = String(n); @@ -15339,8 +15369,8 @@ function zg({ gridContainer: e, state: t, activeId: n, readState: r = null, writ console.debug?.(e); } } -function Bg({ gridContainer: e, sidebar: t, createRatingBadge: n, createTagsBadge: r, showAssetInSidebar: i, closeSidebar: a, state: o }) { - let { read: s, write: c } = ph(o, [ +function qg({ gridContainer: e, sidebar: t, createRatingBadge: n, createTagsBadge: r, showAssetInSidebar: i, closeSidebar: a, state: o }) { + let { read: s, write: c } = bh(o, [ "activeAssetId", "selectedAssetIds", "sidebarOpen" @@ -15375,9 +15405,9 @@ function Bg({ gridContainer: e, sidebar: t, createRatingBadge: n, createTagsBadg } }, a = () => { n && cancelAnimationFrame(n), r && clearTimeout(r), n = requestAnimationFrame(() => { - n = null, i() && Ng(e); + n = null, i() && Bg(e); }), r = setTimeout(() => { - r = null, i() && Ng(e); + r = null, i() && Bg(e); }, 160); }, o = new ResizeObserver(() => a()); t && o.observe(t), o.observe(e), e._mjrSelectionResizeObserver = o; @@ -15417,14 +15447,14 @@ function Bg({ gridContainer: e, sidebar: t, createRatingBadge: n, createTagsBadg if (!a) return; n.preventDefault(), n.stopPropagation(); let l = r?.dataset?.mjrAssetId || ""; - Rg(e, l ? [l] : [], l), zg({ + Gg(e, l ? [l] : [], l), Kg({ gridContainer: e, state: o, activeId: l, readState: s, writeState: c }); - let u = await Eg({ + let u = await Ng({ card: r, asset: a, sidebar: t, @@ -15443,7 +15473,7 @@ function Bg({ gridContainer: e, sidebar: t, createRatingBadge: n, createTagsBadg let u = r._mjrAsset; if (u) { if (e?._mjrSelectionManagedByVue) { - zg({ + Kg({ gridContainer: e, state: o, activeId: String(r?.dataset?.mjrAssetId || "").trim(), @@ -15463,7 +15493,7 @@ function Bg({ gridContainer: e, sidebar: t, createRatingBadge: n, createTagsBadg console.debug?.(e); } } else if (n.preventDefault(), n.stopPropagation(), n.ctrlKey || n.metaKey || n.shiftKey) { - let t = Ig(e), i = t.indexOf(r); + let t = Ug(e), i = t.indexOf(r); if (n.shiftKey) { let t = []; try { @@ -15475,7 +15505,7 @@ function Bg({ gridContainer: e, sidebar: t, createRatingBadge: n, createTagsBadg let n = r?.dataset?.mjrAssetId || "", i = t.findIndex((e) => String(e?.id || "") === String(n)), a = Number(e._mjrLastSelectedIndex), l = Number.isFinite(a) ? a : i; if (i >= 0 && l >= 0) { let r = Math.min(l, i), a = Math.max(l, i), u = t.slice(r, a + 1).map((e) => String(e?.id || "")).filter(Boolean); - Rg(e, u, n || u[0] || ""), e._mjrLastSelectedIndex = i, zg({ + Gg(e, u, n || u[0] || ""), e._mjrLastSelectedIndex = i, Kg({ gridContainer: e, state: o, activeId: n || "", @@ -15510,7 +15540,7 @@ function Bg({ gridContainer: e, sidebar: t, createRatingBadge: n, createTagsBadg } a && (l.has(a) ? l.delete(a) : l.add(a)); let u = Array.from(l), d = l.has(a) ? a : u[0] || ""; - Rg(e, u, d), zg({ + Gg(e, u, d), Kg({ gridContainer: e, state: o, activeId: d, @@ -15520,7 +15550,7 @@ function Bg({ gridContainer: e, sidebar: t, createRatingBadge: n, createTagsBadg } else { { if (r.classList.contains("is-selected")) { - Rg(e, [], ""), zg({ + Gg(e, [], ""), Kg({ gridContainer: e, state: o, activeId: "", @@ -15530,7 +15560,7 @@ function Bg({ gridContainer: e, sidebar: t, createRatingBadge: n, createTagsBadg return; } let n = r?.dataset?.mjrAssetId; - Rg(e, n ? [n] : [], n || ""), zg({ + Gg(e, n ? [n] : [], n || ""), Kg({ gridContainer: e, state: o, activeId: n || "", @@ -15544,7 +15574,7 @@ function Bg({ gridContainer: e, sidebar: t, createRatingBadge: n, createTagsBadg } } try { - Ng(e), r?.focus?.({ preventScroll: !0 }); + Bg(e), r?.focus?.({ preventScroll: !0 }); } catch (e) { console.debug?.(e); } @@ -15555,10 +15585,10 @@ function Bg({ gridContainer: e, sidebar: t, createRatingBadge: n, createTagsBadg let p = async () => { let n = String(s("activeAssetId", "") || ""), r = null; if (n) try { - r = e.querySelector(`.mjr-asset-card[data-mjr-asset-id="${Og(n)}"]`); + r = e.querySelector(`.mjr-asset-card[data-mjr-asset-id="${Fg(n)}"]`); } catch { try { - r = e.querySelector(`.mjr-asset-card[data-mjr-asset-id="${Og(n)}"]`); + r = e.querySelector(`.mjr-asset-card[data-mjr-asset-id="${Fg(n)}"]`); } catch (e) { console.debug?.(e); } @@ -15566,7 +15596,7 @@ function Bg({ gridContainer: e, sidebar: t, createRatingBadge: n, createTagsBadg r ||= e.querySelector(".mjr-asset-card.is-selected"); let l = r?._mjrAsset; if (l) { - Dg(e, r), Lg(e), zg({ + Pg(e, r), Wg(e), Kg({ gridContainer: e, state: o, activeId: r?.dataset?.mjrAssetId, @@ -15582,7 +15612,7 @@ function Bg({ gridContainer: e, sidebar: t, createRatingBadge: n, createTagsBadg } catch (e) { console.debug?.(e); } - Mg(e, { force: !0 }), Pg(e); + zg(e, { force: !0 }), Vg(e); return; } } catch (e) { @@ -15595,7 +15625,7 @@ function Bg({ gridContainer: e, sidebar: t, createRatingBadge: n, createTagsBadg } catch (e) { console.debug?.(e); } - Pg(e), r?.focus?.({ preventScroll: !0 }); + Vg(e), r?.focus?.({ preventScroll: !0 }); } catch (e) { console.debug?.(e); } @@ -15610,7 +15640,7 @@ function Bg({ gridContainer: e, sidebar: t, createRatingBadge: n, createTagsBadg if (!n) return !1; let r = null; try { - r = kg(e, n); + r = Ig(e, n); } catch (e) { console.debug?.(e); } @@ -15647,7 +15677,7 @@ function Bg({ gridContainer: e, sidebar: t, createRatingBadge: n, createTagsBadg let _ = (t) => { if (t.defaultPrevented || (t.key?.toLowerCase?.() || "") !== "d" || t.ctrlKey || t.metaKey || t.altKey || t.target?.isContentEditable || t.target?.closest?.("input, textarea, select, [contenteditable='true']")) return; let n = Nt(t.target, ".mjr-asset-card"); - n && n._mjrAsset && (t.preventDefault(), t.stopPropagation(), Dg(e, n), Lg(e), zg({ + n && n._mjrAsset && (t.preventDefault(), t.stopPropagation(), Pg(e, n), Wg(e), Kg({ gridContainer: e, state: o, activeId: n?.dataset?.mjrAssetId, @@ -15733,7 +15763,7 @@ function Bg({ gridContainer: e, sidebar: t, createRatingBadge: n, createTagsBadg }; } // ui/features/panel/controllers/panelHotkeysController.ts -function Vg({ onTriggerScan: e, getScanContext: t, onToggleDetails: n, onToggleFloatingViewer: r, onFocusSearch: i, onClearSearch: a, allowListKeys: o } = {}) { +function Jg({ onTriggerScan: e, getScanContext: t, onToggleDetails: n, onToggleFloatingViewer: r, onFocusSearch: i, onClearSearch: a, allowListKeys: o } = {}) { let s = !1, c = !1, l = null, u = o instanceof Set ? o : /* @__PURE__ */ new Set([ " ", "ArrowUp", @@ -15768,7 +15798,7 @@ function Vg({ onTriggerScan: e, getScanContext: t, onToggleDetails: n, onToggleF console.debug?.(e); } try { - let e = $n(); + let e = Qn(); return e && (document.activeElement === document.body || e.contains?.(document.activeElement)) || !1; } catch (e) { return console.debug?.(e), !1; @@ -15887,17 +15917,17 @@ function Vg({ onTriggerScan: e, getScanContext: t, onToggleDetails: n, onToggleF }; } // ui/vue/composables/useGridSelection.ts -function Hg(e) { +function Yg(e) { return Array.isArray(e) ? e.map((e) => String(e || "").trim()).filter(Boolean) : []; } -function Ug({ gridContainer: e, readSelectedAssetIds: t = () => [], readActiveAssetId: n = () => "", writeSelectedAssetIds: r = (e) => {}, writeActiveAssetId: i = (e) => {}, onSelectionChanged: a = () => {}, lifecycleSignal: o = null } = {}) { +function Xg({ gridContainer: e, readSelectedAssetIds: t = () => [], readActiveAssetId: n = () => "", writeSelectedAssetIds: r = (e) => {}, writeActiveAssetId: i = (e) => {}, onSelectionChanged: a = () => {}, lifecycleSignal: o = null } = {}) { if (!e) return { restoreSelectionState() {}, dispose() {} }; let s = (e) => { try { - let t = e?.detail || {}, n = Hg(t.selectedIds); + let t = e?.detail || {}, n = Yg(t.selectedIds); r(n), i(String(t.activeId || n[0] || "").trim()); } catch (e) { console.debug?.(e); @@ -15915,7 +15945,7 @@ function Ug({ gridContainer: e, readSelectedAssetIds: t = () => [], readActiveAs } return { restoreSelectionState: ({ scrollTop: r = 0 } = {}) => { - let i = Hg(t()), a = String(n() || i[0] || "").trim(); + let i = Yg(t()), a = String(n() || i[0] || "").trim(); if (i.length || a) { try { typeof e?._mjrSetSelection == "function" && e._mjrSetSelection(i, a); @@ -15952,7 +15982,7 @@ function Ug({ gridContainer: e, readSelectedAssetIds: t = () => [], readActiveAs }; } // ui/vue/composables/useAssetsQuery.ts -function Wg(e) { +function Zg(e) { try { if (typeof requestAnimationFrame == "function") { requestAnimationFrame(e); @@ -15963,10 +15993,10 @@ function Wg(e) { } setTimeout(e, 0); } -function Gg(e = {}, t = "*") { +function Qg(e = {}, t = "*") { return e.scope === "output" && !e.collectionId && t === "*" && !e.kindFilter && !e.workflowOnly && !(Number(e.minRating || 0) > 0) && !(Number(e.minSizeMB || 0) > 0) && !(Number(e.maxSizeMB || 0) > 0) && !(Number(e.minWidth || 0) > 0) && !(Number(e.minHeight || 0) > 0) && !(Number(e.maxWidth || 0) > 0) && !(Number(e.maxHeight || 0) > 0) && !String(e.workflowType || "").trim() && !String(e.workflowId || "").trim() && !e.dateRangeFilter && !e.dateExactFilter; } -function Kg({ gridContainer: e, gridWrapper: t, readScrollElement: n = () => null, gridController: r, captureAnchor: i, restoreAnchor: a, restoreGridUiState: o = null, readScrollTop: s = () => 0, restoreSelectionState: c = () => {}, readActiveAssetId: l = () => "", isSidebarOpen: u = () => !1, toggleSidebarDetails: d = () => {}, getQuery: f = () => "*", getScope: p = () => "output", loadAssets: m = null, lifecycleSignal: h = null } = {}) { +function $g({ gridContainer: e, gridWrapper: t, readScrollElement: n = () => null, gridController: r, captureAnchor: i, restoreAnchor: a, restoreGridUiState: o = null, readScrollTop: s = () => 0, restoreSelectionState: c = () => {}, readActiveAssetId: l = () => "", isSidebarOpen: u = () => !1, toggleSidebarDetails: d = () => {}, getQuery: f = () => "*", getScope: p = () => "output", loadAssets: m = null, lifecycleSignal: h = null } = {}) { let g = 0, _ = !1, v = null, y = null, b = null, x = 0, S = !0, C = "", w = Date.now(), T = () => { try { return yc(e, (typeof n == "function" ? n() : t) || t || null); @@ -16058,7 +16088,7 @@ function Kg({ gridContainer: e, gridWrapper: t, readScrollElement: n = () => nul } catch (e) { console.debug?.(e); } - Wg(() => { + Zg(() => { let e = Number(s() || 0) || 0; if (e > 0) try { t.scrollTop = e; @@ -16105,7 +16135,7 @@ function Kg({ gridContainer: e, gridWrapper: t, readScrollElement: n = () => nul c = !0, a = e.last_scan_end, o = e.last_index_end, s = Number(e.total_assets ?? null); return; } - let l = e.last_scan_end && e.last_scan_end !== a, u = e.last_index_end && e.last_index_end !== o, d = Number(e.total_assets ?? null), f = Gg(t, String(n() || "*").trim() || "*"), p = Date.now() - w < 8e3, m = Number.isFinite(d) && Number.isFinite(s) ? d - s : 0, h = Math.max(0, Number(i?.__mjrLastAssetUpsertCount || 0) || 0), g = m >= 20; + let l = e.last_scan_end && e.last_scan_end !== a, u = e.last_index_end && e.last_index_end !== o, d = Number(e.total_assets ?? null), f = Qg(t, String(n() || "*").trim() || "*"), p = Date.now() - w < 8e3, m = Number.isFinite(d) && Number.isFinite(s) ? d - s : 0, h = Math.max(0, Number(i?.__mjrLastAssetUpsertCount || 0) || 0), g = m >= 20; if (Number.isFinite(d) && (s = d), !f || p && D() && !u && !g) { a = e.last_scan_end, o = e.last_index_end; return; @@ -16215,7 +16245,7 @@ function Kg({ gridContainer: e, gridWrapper: t, readScrollElement: n = () => nul }; } // ui/features/panel/panelBootstrap.ts -function qg(e, { useComfyThemeUI: t }) { +function e_(e, { useComfyThemeUI: t }) { t ? e.classList.add("mjr-assets-manager") : e.classList.remove("mjr-assets-manager"); let n = e.parentElement || null, r = n ? { height: n.style.height, @@ -16227,7 +16257,7 @@ function qg(e, { useComfyThemeUI: t }) { } catch (e) { console.debug?.(e); } - Qn(); + Zn(); for (let t of [ () => e._eventCleanup?.(), () => e._mjrPopoverManager?.dispose?.(), @@ -16254,10 +16284,10 @@ function qg(e, { useComfyThemeUI: t }) { }; } // ui/features/panel/panelSettingsSync.ts -function Jg({ container: e, state: t, sidebar: n, browseSection: i, gridWrapper: a, similarBtn: o, setSemanticEnabled: s, similarEnabledTitle: c, similarDisabledTitle: l, refreshGridFn: u, isSidebarOpen: d, readActiveAssetId: f, getSidebarController: m, panelLifecycleAC: h }) { +function t_({ container: e, state: t, sidebar: n, browseSection: i, gridWrapper: a, similarBtn: o, setSemanticEnabled: s, similarEnabledTitle: c, similarDisabledTitle: l, refreshGridFn: u, isSidebarOpen: d, readActiveAssetId: f, getSidebarController: m, panelLifecycleAC: h }) { let g = "", _ = () => { try { - return !!(Hn()?.ai?.vectorSearchEnabled ?? !0); + return !!(Vn()?.ai?.vectorSearchEnabled ?? !0); } catch { return !0; } @@ -16316,7 +16346,7 @@ function Jg({ container: e, state: t, sidebar: n, browseSection: i, gridWrapper: } } }, b = async (e) => { - let n = String(e || t.scope || "output").toLowerCase(), i = !!Hn()?.watcher?.enabled; + let n = String(e || t.scope || "output").toLowerCase(), i = !!Vn()?.watcher?.enabled; if (n === "custom") try { await r(!1); } catch (e) { @@ -16340,9 +16370,9 @@ function Jg({ container: e, state: t, sidebar: n, browseSection: i, gridWrapper: }, x = (e) => { let n = String(e?.detail?.key || "").trim(), r = n === "__init__", i = r || n.startsWith("grid.") || n.startsWith("infiniteScroll.") || n.startsWith("siblings.") || n.startsWith("search.") || n.startsWith("rtHydrate.") || n.startsWith("workflowMinimap."), a = r || n.startsWith("sidebar.") || n.startsWith("ai."), o = r || n.startsWith("watcher."); try { - let e = Hn(), t = !!(e?.ai?.vectorSearchEnabled ?? !0), o = String(e?.ui?.cardHoverColor || "").trim(), s = String(e?.ui?.cardSelectionColor || "").trim(), c = String(e?.ui?.ratingColor || "").trim(), l = String(e?.ui?.tagColor || "").trim(); + let e = Vn(), t = !!(e?.ai?.vectorSearchEnabled ?? !0), o = String(e?.ui?.cardHoverColor || "").trim(), s = String(e?.ui?.cardSelectionColor || "").trim(), c = String(e?.ui?.ratingColor || "").trim(), l = String(e?.ui?.tagColor || "").trim(); if (/^#[0-9a-fA-F]{3,8}$/.test(o) && document.documentElement.style.setProperty("--mjr-card-hover-color", o), /^#[0-9a-fA-F]{3,8}$/.test(s) && document.documentElement.style.setProperty("--mjr-card-selection-color", s), /^#[0-9a-fA-F]{3,8}$/.test(c) && document.documentElement.style.setProperty("--mjr-rating-color", c), /^#[0-9a-fA-F]{3,8}$/.test(l) && document.documentElement.style.setProperty("--mjr-tag-color", l), y(e.sidebar?.position || "right"), v(t), i) { - let e = $n() || null; + let e = Qn() || null; if (!r && n.startsWith("siblings.")) try { e?.dispatchEvent(new CustomEvent("mjr:reload-grid")); } catch { @@ -16379,7 +16409,7 @@ function Jg({ container: e, state: t, sidebar: n, browseSection: i, gridWrapper: }; } // ui/features/panel/panelGridEventBindings.ts -function Yg({ gridContainer: t, panelLifecycleAC: n, requestQueuedReload: r, notifyContextChanged: i, markUserInteraction: a, writePanelValue: o, popovers: s, collectionsPopover: c, gridController: l, registerSummaryDispose: u }) { +function n_({ gridContainer: t, panelLifecycleAC: n, requestQueuedReload: r, notifyContextChanged: i, markUserInteraction: a, writePanelValue: o, popovers: s, collectionsPopover: c, gridController: l, registerSummaryDispose: u }) { let d = null; try { d = () => r(), t.addEventListener("mjr:reload-grid", d, { signal: n?.signal }), u(() => { @@ -16472,34 +16502,34 @@ function Yg({ gridContainer: t, panelLifecycleAC: n, requestQueuedReload: r, not } } // ui/features/panel/panelSimilarSearch.ts -var Xg = 500; -function Zg(e) { +var r_ = 500; +function i_(e) { return Number(e?.status || 0) === 404 && String(e?.error || "").toLowerCase().includes("non-json"); } -function Qg(e, t = "") { +function a_(e, t = "") { let n = Array.isArray(e) ? e : []; - return n.length <= Xg ? { + return n.length <= r_ ? { list: n, title: t, truncated: !1, total: n.length } : { - list: n.slice(0, Xg), - title: `${String(t || "").trim() || "Generation group"} - showing first ${Xg}/${n.length}`, + list: n.slice(0, r_), + title: `${String(t || "").trim() || "Generation group"} - showing first ${r_}/${n.length}`, truncated: !0, total: n.length }; } -function $g(e = {}) { +function o_(e = {}) { let t = String(e?.stackId || e?.stack_id || "").trim(); if (t) return `stack:${t}`; let n = String(e?.asset?.id || "").trim(); return e?.isDupGroup ? n ? `duplicates:${n}` : "duplicates" : n ? `group:${n}` : "group"; } -function e_(e, t) { +function s_(e, t) { return String(e?.[t] ?? e?.file_info?.[t] ?? "").trim(); } -function t_({ similarBtn: t, similarPopover: n, similarFindBtn: r, similarDuplicatesBtn: i, similarSameNodeBtn: a, similarSameWorkflowBtn: o, gridContainer: s, state: c, panelLifecycleAC: l, isAiEnabled: u, similarDisabledTitle: d, readActiveAssetId: f, readSelectedAssetIds: p, readPanelValue: m, writePanelValue: h, scopeController: g, closePopovers: _, closePeerPopovers: v, popovers: y, workflowIdInput: b, reloadGrid: x, getDuplicatesAlert: S }) { +function c_({ similarBtn: t, similarPopover: n, similarFindBtn: r, similarDuplicatesBtn: i, similarSameNodeBtn: a, similarSameWorkflowBtn: o, gridContainer: s, state: c, panelLifecycleAC: l, isAiEnabled: u, similarDisabledTitle: d, readActiveAssetId: f, readSelectedAssetIds: p, readPanelValue: m, writePanelValue: h, scopeController: g, closePopovers: _, closePeerPopovers: v, popovers: y, workflowIdInput: b, reloadGrid: x, getDuplicatesAlert: S }) { let C = () => String(f() || p()[0] || "").trim(), w = () => { let e = Number(C()); return Number.isFinite(e) && e > 0 ? e : 0; @@ -16525,7 +16555,7 @@ function t_({ similarBtn: t, similarPopover: n, similarFindBtn: r, similarDuplic } catch (e) { return console.debug?.(e), null; } - }, k = async (e, t) => e && t.some((t) => e_(e, t)) ? e : await O() || e, A = (e = {}) => (Array.isArray(e?.files) ? e.files : []).map((e) => ({ + }, k = async (e, t) => e && t.some((t) => s_(e, t)) ? e : await O() || e, A = (e = {}) => (Array.isArray(e?.files) ? e.files : []).map((e) => ({ filename: String(e?.filename || "").trim(), subfolder: String(e?.subfolder || "").trim().replace(/\\/g, "/"), type: String(e?.type || "").trim().toLowerCase() @@ -16579,7 +16609,7 @@ function t_({ similarBtn: t, similarPopover: n, similarFindBtn: r, similarDuplic limit: 500 }), { timeoutMs: 3e4 }); if (!i?.ok) { - if (Zg(i)) { + if (i_(i)) { if (r.length) { await j(t, r); return; @@ -16656,7 +16686,7 @@ function t_({ similarBtn: t, similarPopover: n, similarFindBtn: r, similarDuplic } catch (e) { console.debug?.(e); } - let t = await D(), n = String(t?.id || C() || "").trim(), r = Array.isArray(t?._mjrDupMembers) ? t._mjrDupMembers : []; + let t = await D(), n = String(t?.id || C() || "").trim(), r = Ku(Array.isArray(t?._mjrDupMembers) ? t._mjrDupMembers : []); if (r.length >= 2) { h("similarResults", r), h("similarSourceAssetId", n ? `duplicates:${n}` : "duplicates"), h("similarTitle", R("search.duplicateResults", "Duplicates ({n} assets)", { n: r.length })), await g?.setScope?.("similar"); return; @@ -16664,12 +16694,12 @@ function t_({ similarBtn: t, similarPopover: n, similarFindBtn: r, similarDuplic let i = (S?.() || {})?.firstGroup; i && Array.isArray(i.assets) && i.assets.length >= 2 ? (h("similarResults", i.assets), h("similarSourceAssetId", "duplicates"), h("similarTitle", R("search.duplicateResults", "Duplicates ({n} assets)", { n: i.assets.length })), await g?.setScope?.("similar")) : e(R("search.noKnownDuplicates", "No duplicate group is available yet. Run duplicate analysis from the duplicate alert first."), "info", 3200); }, ee = async () => { - let t = await k(await D(), ["source_node_id", "source_node_type"]), n = e_(t, "source_node_id"); + let t = await k(await D(), ["source_node_id", "source_node_type"]), n = s_(t, "source_node_id"); n ? await M({ sourceNodeId: n, - sourceNodeType: e_(t, "source_node_type"), - jobId: e_(t, "job_id"), - title: e_(t, "source_node_type") || n + sourceNodeType: s_(t, "source_node_type"), + jobId: s_(t, "job_id"), + title: s_(t, "source_node_type") || n }) : e(R("search.noSourceNode", "Selected asset has no persisted source node id."), "info", 2600); }, te = async () => { try { @@ -16677,7 +16707,7 @@ function t_({ similarBtn: t, similarPopover: n, similarFindBtn: r, similarDuplic } catch (e) { console.debug?.(e); } - let t = e_(await k(await D(), ["workflow_id"]), "workflow_id"); + let t = s_(await k(await D(), ["workflow_id"]), "workflow_id"); if (!t) e(R("search.noWorkflowId", "Selected asset has no persisted workflow id."), "info", 2600); else { h("workflowId", t); @@ -16710,8 +16740,8 @@ function t_({ similarBtn: t, similarPopover: n, similarFindBtn: r, similarDuplic }; F(r, N), F(i, P), F(a, ee), F(o, te), s?.addEventListener(V.OPEN_STACK_GROUP, async (t) => { try { - let n = t?.detail || {}, r = Array.isArray(n?.members) ? n.members : [], i = `Generation group (${r.length} assets)`, a = Qg(r, String(n?.title || "").trim() || i); - a.truncated && e(`Large stack truncated to ${Xg}/${a.total} assets to keep the grid responsive.`, "warn", 5e3), h("similarResults", a.list), h("similarSourceAssetId", $g(n)), h("similarTitle", a.title || i), await Promise.resolve(), await g?.setScope?.("similar"); + let n = t?.detail || {}, r = Array.isArray(n?.members) ? n.members : [], i = `Generation group (${r.length} assets)`, a = a_(r, String(n?.title || "").trim() || i); + a.truncated && e(`Large stack truncated to ${r_}/${a.total} assets to keep the grid responsive.`, "warn", 5e3), h("similarResults", a.list), h("similarSourceAssetId", o_(n)), h("similarTitle", a.title || i), await Promise.resolve(), await g?.setScope?.("similar"); } catch (e) { console.debug?.(e); } @@ -16734,7 +16764,7 @@ function t_({ similarBtn: t, similarPopover: n, similarFindBtn: r, similarDuplic } } // ui/features/panel/panelPinnedFolders.ts -function n_({ pinnedFoldersBtn: t, pinnedFoldersController: n = null, pinnedFoldersMenu: r = null, pinnedFoldersPopover: i, popovers: a, closeOtherPopovers: o, state: s, gridContainer: c, customSelect: l, scopeController: u, customRootsController: d, gridController: f, applyWatcherForScope: p, refreshDuplicateAlerts: m, notifyContextChanged: h, panelLifecycleAC: g }) { +function l_({ pinnedFoldersBtn: t, pinnedFoldersController: n = null, pinnedFoldersMenu: r = null, pinnedFoldersPopover: i, popovers: a, closeOtherPopovers: o, state: s, gridContainer: c, customSelect: l, scopeController: u, customRootsController: d, gridController: f, applyWatcherForScope: p, refreshDuplicateAlerts: m, notifyContextChanged: h, panelLifecycleAC: g }) { let _ = (e) => { let t = String(e?.id || "").trim(); if (!t) return null; @@ -16793,7 +16823,7 @@ function n_({ pinnedFoldersBtn: t, pinnedFoldersController: n = null, pinnedFold let r = String(t?.id || "").trim(); if (!r) return; let i = String(t?.label || t?.path || r).trim(); - if (!await Wt(R("dialog.unpinFolder", "Unpin folder \"{name}\"?", { name: i }))) return; + if (!await Tt(R("dialog.unpinFolder", "Unpin folder \"{name}\"?", { name: i }))) return; let a = await L(at.CUSTOM_ROOTS_REMOVE, { id: r }); if (!a?.ok) e(a?.error || R("toast.unpinFolderFailed", "Failed to unpin folder"), "error"); else { @@ -16854,8 +16884,8 @@ function n_({ pinnedFoldersBtn: t, pinnedFoldersController: n = null, pinnedFold }, { signal: g?.signal }); } // ui/features/filters/calendar/AgendaCalendar.ts -var r_ = (e) => String(e).padStart(2, "0"); -function i_(e) { +var u_ = (e) => String(e).padStart(2, "0"); +function d_(e) { try { let t = String(e || "").trim(); if (!/^\d{4}-\d{2}-\d{2}$/.test(t)) return null; @@ -16867,50 +16897,50 @@ function i_(e) { return null; } } -function a_(e) { +function f_(e) { try { let t = e.getFullYear(), n = e.getMonth() + 1, r = e.getDate(); - return `${t}-${r_(n)}-${r_(r)}`; + return `${t}-${u_(n)}-${u_(r)}`; } catch { return ""; } } -function o_(e) { +function p_(e) { try { - return `${e.getFullYear()}-${r_(e.getMonth() + 1)}`; + return `${e.getFullYear()}-${u_(e.getMonth() + 1)}`; } catch { return ""; } } -function s_(e) { +function m_(e) { try { return new Date(e.getFullYear(), e.getMonth(), 1); } catch { return /* @__PURE__ */ new Date(); } } -function c_(e, t) { +function h_(e, t) { try { return new Date(e.getFullYear(), e.getMonth() + t, 1); } catch { return /* @__PURE__ */ new Date(); } } -function l_(e) { +function g_(e) { try { return new Date(e.getFullYear(), e.getMonth() + 1, 0).getDate(); } catch { return 31; } } -function u_(e) { +function __(e) { try { return (e.getDay() + 6) % 7; } catch { return 0; } } -function d_(e, t) { +function v_(e, t) { if (e) try { let n = String(e.value || ""); e.value = t || "", n !== e.value && e.dispatchEvent?.(new Event("change", { bubbles: !0 })); @@ -16918,7 +16948,7 @@ function d_(e, t) { console.debug?.(e); } } -async function f_({ state: e, monthKey: t }) { +async function y_({ state: e, monthKey: t }) { try { let n = String(e?.scope || "output"); if (n === "collection") return { @@ -16957,7 +16987,7 @@ async function f_({ state: e, monthKey: t }) { }; } } -function p_({ container: e, hiddenInput: t, state: n, onRequestReloadGrid: r = null } = {}) { +function b_({ container: e, hiddenInput: t, state: n, onRequestReloadGrid: r = null } = {}) { if (!e || !(e instanceof HTMLElement) || !t) return { dispose() {}, refresh() {} @@ -16980,7 +17010,7 @@ function p_({ container: e, hiddenInput: t, state: n, onRequestReloadGrid: r = n d.type = "button", d.className = "mjr-btn mjr-agenda-clear", d.textContent = R("action.clear", "Clear"); let f = document.createElement("button"); f.type = "button", f.className = "mjr-btn mjr-agenda-refresh", f.textContent = R("action.refresh", "Refresh"), u.appendChild(d), u.appendChild(f), i.appendChild(a), i.appendChild(l), i.appendChild(u), e.appendChild(i); - let p = s_(i_(t.value) || /* @__PURE__ */ new Date()), m = {}, h = 0, g = !1, _ = () => { + let p = m_(d_(t.value) || /* @__PURE__ */ new Date()), m = {}, h = 0, g = !1, _ = () => { if (g) return; let e = p.getFullYear(), n = p.getMonth(); s.textContent = p.toLocaleString(void 0, { @@ -17000,13 +17030,13 @@ function p_({ container: e, hiddenInput: t, state: n, onRequestReloadGrid: r = n let t = document.createElement("div"); t.className = "mjr-agenda-weekday", t.textContent = e, l.appendChild(t); } - let i = u_(new Date(e, n, 1)), a = l_(p), o = i_(t.value), c = o ? a_(o) : ""; + let i = __(new Date(e, n, 1)), a = g_(p), o = d_(t.value), c = o ? f_(o) : ""; for (let e = 0; e < i; e++) { let e = document.createElement("div"); e.className = "mjr-agenda-day mjr-agenda-day--blank", l.appendChild(e); } for (let r = 1; r <= a; r++) { - let i = a_(new Date(e, n, r)), a = Number(m?.[i] || 0) || 0, o = document.createElement("button"); + let i = f_(new Date(e, n, r)), a = Number(m?.[i] || 0) || 0, o = document.createElement("button"); if (o.type = "button", o.className = "mjr-agenda-day", o.textContent = String(r), o.dataset.date = i, a > 0) { o.classList.add("mjr-agenda-day--has-assets"); let e = R(a === 1 ? "tooltip.assetsDaySingular" : "tooltip.assetsDayPlural", a === 1 ? "{count} asset" : "{count} assets", { count: a }); @@ -17015,26 +17045,26 @@ function p_({ container: e, hiddenInput: t, state: n, onRequestReloadGrid: r = n t.className = "mjr-agenda-day-badge", t.textContent = a > 99 ? "99+" : String(a), t.setAttribute("aria-label", e), o.appendChild(t); } else o.title = R("tooltip.noAssetsDay", "No assets on this day"); i === c && o.classList.add("mjr-agenda-day--selected"), o.addEventListener("click", () => { - d_(t, String(t.value || "").trim() === i ? "" : i); + v_(t, String(t.value || "").trim() === i ? "" : i); }), l.appendChild(o); } }, v = async () => { if (g) return; - let e = o_(p); + let e = p_(p); if (!e) return; h += 1; - let t = h, r = await f_({ + let t = h, r = await y_({ state: n, monthKey: e }); g || t === h && (m = r.ok && r.days || {}, _()); }; return o.addEventListener("click", async () => { - p = c_(p, -1), await v(); + p = h_(p, -1), await v(); }), c.addEventListener("click", async () => { - p = c_(p, 1), await v(); + p = h_(p, 1), await v(); }), d.addEventListener("click", () => { - d_(t, ""); + v_(t, ""); try { r?.(); } catch (e) { @@ -17043,9 +17073,9 @@ function p_({ container: e, hiddenInput: t, state: n, onRequestReloadGrid: r = n }), f.addEventListener("click", async () => { await v(); }), t.addEventListener("change", () => { - let e = i_(t.value); + let e = d_(t.value); if (e) { - let t = s_(e); + let t = m_(e); (t.getFullYear() !== p.getFullYear() || t.getMonth() !== p.getMonth()) && (p = t); } _(); @@ -17062,14 +17092,14 @@ function p_({ container: e, hiddenInput: t, state: n, onRequestReloadGrid: r = n }; } // ui/features/panel/controllers/filtersController.ts -var m_ = (e) => { +var x_ = (e) => { let t = String(e ?? "").trim(); if (!t) return 0; let n = t.replace(",", "."), r = Number(n); return Number.isFinite(r) ? r : 0; }; -function h_({ state: e, kindSelect: t, wfCheckbox: n, workflowTypeSelect: r, workflowIdInput: i, workflowModelInput: a, workflowRunsOnSelect: o, ratingSelect: s, minSizeInput: c, maxSizeInput: l, resolutionPresetSelect: u, minWidthInput: d, minHeightInput: f, maxWidthInput: p, maxHeightInput: m, dateRangeSelect: h, dateExactInput: g, reloadGrid: _, reconcileSelection: v = null, onFiltersChanged: y = null, lifecycleSignal: b = null }) { - let { write: x } = ph(e, [ +function S_({ state: e, kindSelect: t, wfCheckbox: n, workflowTypeSelect: r, workflowIdInput: i, workflowModelInput: a, workflowRunsOnSelect: o, ratingSelect: s, minSizeInput: c, maxSizeInput: l, resolutionPresetSelect: u, minWidthInput: d, minHeightInput: f, maxWidthInput: p, maxHeightInput: m, dateRangeSelect: h, dateExactInput: g, reloadGrid: _, reconcileSelection: v = null, onFiltersChanged: y = null, lifecycleSignal: b = null }) { + let { write: x } = bh(e, [ "kindFilter", "workflowOnly", "minRating", @@ -17181,7 +17211,7 @@ function h_({ state: e, kindSelect: t, wfCheckbox: n, workflowTypeSelect: r, wor C(); }, b ? { signal: b } : void 0); let E = () => { - let e = m_(c?.value || 0), t = m_(l?.value || 0), n = Number.isFinite(e) && e > 0 ? e : 0, r = Number.isFinite(t) && t > 0 ? t : 0; + let e = x_(c?.value || 0), t = x_(l?.value || 0), n = Number.isFinite(e) && e > 0 ? e : 0, r = Number.isFinite(t) && t > 0 ? t : 0; r > 0 && n > 0 && r < n && (r = n, l && (l.value = String(r))), x("minSizeMB", n), x("maxSizeMB", r); try { y?.(); @@ -17192,7 +17222,7 @@ function h_({ state: e, kindSelect: t, wfCheckbox: n, workflowTypeSelect: r, wor }; T(c, "change", E, b ? { signal: b } : void 0), T(l, "change", E, b ? { signal: b } : void 0); let D = () => { - let e = m_(d?.value || 0), t = m_(f?.value || 0), n = m_(p?.value || 0), r = m_(m?.value || 0), i = Number.isFinite(e) && e > 0 ? Math.round(e) : 0, a = Number.isFinite(t) && t > 0 ? Math.round(t) : 0, o = Number.isFinite(n) && n > 0 ? Math.round(n) : 0, s = Number.isFinite(r) && r > 0 ? Math.round(r) : 0; + let e = x_(d?.value || 0), t = x_(f?.value || 0), n = x_(p?.value || 0), r = x_(m?.value || 0), i = Number.isFinite(e) && e > 0 ? Math.round(e) : 0, a = Number.isFinite(t) && t > 0 ? Math.round(t) : 0, o = Number.isFinite(n) && n > 0 ? Math.round(n) : 0, s = Number.isFinite(r) && r > 0 ? Math.round(r) : 0; o > 0 && i > 0 && o < i && (o = i, p && (p.value = String(o))), s > 0 && a > 0 && s < a && (s = a, m && (m.value = String(s))), x("minWidth", i), x("minHeight", a), x("maxWidth", o), x("maxHeight", s); try { u && (u.value = { @@ -17276,7 +17306,7 @@ function h_({ state: e, kindSelect: t, wfCheckbox: n, workflowTypeSelect: r, wor }; } // ui/features/panel/panelFiltersInit.ts -function g_({ state: e, hasVueHeaderSection: t, kindSelect: n, wfCheckbox: r, workflowTypeSelect: i, workflowIdInput: a, workflowModelInput: o, workflowRunsOnSelect: s, ratingSelect: c, minSizeInput: l, maxSizeInput: u, resolutionPresetSelect: d, minWidthInput: f, minHeightInput: p, maxWidthInput: m, maxHeightInput: h, dateRangeSelect: g, dateExactInput: _, agendaContainer: v, gridController: y, reconcileVisibleSelection: b, exitSimilarViewIfActive: x, notifyContextChanged: S, panelLifecycleAC: C, popovers: w = null, filterPopover: T = null }) { +function C_({ state: e, hasVueHeaderSection: t, kindSelect: n, wfCheckbox: r, workflowTypeSelect: i, workflowIdInput: a, workflowModelInput: o, workflowRunsOnSelect: s, ratingSelect: c, minSizeInput: l, maxSizeInput: u, resolutionPresetSelect: d, minWidthInput: f, minHeightInput: p, maxWidthInput: m, maxHeightInput: h, dateRangeSelect: g, dateExactInput: _, agendaContainer: v, gridController: y, reconcileVisibleSelection: b, exitSimilarViewIfActive: x, notifyContextChanged: S, panelLifecycleAC: C, popovers: w = null, filterPopover: T = null }) { let E = null; try { try { @@ -17286,7 +17316,7 @@ function g_({ state: e, hasVueHeaderSection: t, kindSelect: n, wfCheckbox: r, wo } catch (e) { console.debug?.(e); } - E = p_({ + E = b_({ container: v, hiddenInput: _, state: e, @@ -17327,7 +17357,7 @@ function g_({ state: e, hasVueHeaderSection: t, kindSelect: n, wfCheckbox: r, wo D = () => { e &&= (clearTimeout(e), null); }; - } else D = h_({ + } else D = S_({ state: e, kindSelect: n, wfCheckbox: r, @@ -17364,7 +17394,7 @@ function g_({ state: e, hasVueHeaderSection: t, kindSelect: n, wfCheckbox: r, wo }; } // ui/features/panel/panelContextMenuExtraActions.ts -function __({ state: t, scopeController: n, browserNav: r, gridController: i, getDuplicatesAlert: a, refreshDuplicateAlerts: o }) { +function w_({ state: t, scopeController: n, browserNav: r, gridController: i, getDuplicatesAlert: a, refreshDuplicateAlerts: o }) { return { clearSimilarScope: async () => { try { @@ -17392,14 +17422,14 @@ function __({ state: t, scopeController: n, browserNav: r, gridController: i, ge if (n && Array.isArray(n.assets) && n.assets.length >= 2) { let t = n.assets[0] || {}, r = n.assets.slice(1).map((e) => Number(e?.id || 0)).filter((e) => e > 0); if (r.length) { - if (await Wt(R("dialog.mergeDuplicateTags", "Exact duplicates detected ({count}). Merge tags into \"{target}\"?", { + if (await Tt(R("dialog.mergeDuplicateTags", "Exact duplicates detected ({count}). Merge tags into \"{target}\"?", { count: n.assets.length, target: t?.filename || t?.id }))) { let n = await ie(Number(t?.id || 0), r); n?.ok ? e(R("toast.tagsMerged", "Tags merged"), "success", 2200) : e(R("toast.tagMergeFailed", "Tag merge failed: {error}", { error: n?.error || "error" }), "warning", 3500); } - if (await Wt(R("dialog.deleteExactDuplicates", "Delete {count} exact duplicate(s)?", { count: r.length }))) { + if (await Tt(R("dialog.deleteExactDuplicates", "Delete {count} exact duplicate(s)?", { count: r.length }))) { let t = await b(r); t?.ok ? (e(R("toast.duplicatesDeleted", "Duplicates deleted"), "success", 2200), await i.reloadGrid()) : e(R("toast.deleteFailed", "Delete failed: {error}", { error: t?.error || "error" }), "warning", 3500); } @@ -17407,22 +17437,22 @@ function __({ state: t, scopeController: n, browserNav: r, gridController: i, ge return; } } - if (!await Wt(R("dialog.startDuplicateAnalysis", "Start duplicate analysis in background?"))) return; + if (!await Tt(R("dialog.startDuplicateAnalysis", "Start duplicate analysis in background?"))) return; let r = await Ae(500); r?.ok ? e(R("toast.dupAnalysisStarted", "Duplicate analysis started"), "info", 2200) : e(R("toast.analysisNotStarted", "Analysis not started: {error}", { error: r?.error || "error" }), "warning", 3500), await o(); } }; } // ui/features/panel/panelRuntime.ts -async function v_(e, { useComfyThemeUI: t = !0, external: n = {} } = {}) { - return y_(e, { +async function T_(e, { useComfyThemeUI: t = !0, external: n = {} } = {}) { + return E_(e, { useComfyThemeUI: t, external: n }); } -async function y_(t, { useComfyThemeUI: n = !0, external: r = {} } = {}) { - Vp("panelRender"), Wp("panelRender"); - let i = typeof AbortController < "u" ? new AbortController() : null, { popovers: a, hostWrapper: o, hostWrapperPrevStyle: s } = qg(t, { useComfyThemeUI: n }), c = fh(); +async function E_(t, { useComfyThemeUI: n = !0, external: r = {} } = {}) { + Jp("panelRender"), Zp("panelRender"); + let i = typeof AbortController < "u" ? new AbortController() : null, { popovers: a, hostWrapper: o, hostWrapperPrevStyle: s } = e_(t, { useComfyThemeUI: n }), c = yh(); if (!c) throw Error("[Majoor] mountAssetsManagerPanelRuntime requires an active Pinia panel store"); for (let e of [ "statusSection", @@ -17438,7 +17468,7 @@ async function y_(t, { useComfyThemeUI: n = !0, external: r = {} } = {}) { "gridContainer", "sidebar" ]) if (!r?.[e]) throw Error(`[Majoor] mountAssetsManagerPanelRuntime now requires external.${e}`); - let l = ph(null, [ + let l = bh(null, [ "searchQuery", "scrollTop", "scope", @@ -17467,7 +17497,7 @@ async function y_(t, { useComfyThemeUI: n = !0, external: r = {} } = {}) { l.write("searchQuery", e.target.value); }, { signal: i?.signal }); let Ue = r.summaryBar, We = r.updateSummaryBar, Ge = r.folderBreadcrumb, Ke = r.folderBreadcrumbController || null, qe = r.statusSection, Je = r.statusDot, Ye = r.statusText, Xe = r.capabilitiesSection, Ze = r.browseSection, Qe = r.gridWrapper, $e = r.sidebar; - Hn(); + Vn(); let et = document.createElement("div"); et.classList.add("mjr-am-content"); let z = null, tt = null; @@ -17490,7 +17520,7 @@ async function y_(t, { useComfyThemeUI: n = !0, external: r = {} } = {}) { }, { passive: !0, signal: i?.signal - }), z = r.gridContainer, z.parentElement !== Qe && Qe.appendChild(z), nr(z); + }), z = r.gridContainer, z.parentElement !== Qe && Qe.appendChild(z), tr(z); try { z.dataset.mjrScope = String(d("scope", c.scope || "output") || "output"); } catch (e) { @@ -17537,7 +17567,7 @@ async function y_(t, { useComfyThemeUI: n = !0, external: r = {} } = {}) { gridContainer: z, getState: () => c }); - let vt = R("search.findSimilar", "Find Similar"), yt = R("search.similarDisabled", "AI features are disabled in settings"), { applyWatcherForScope: bt, isAiEnabled: xt } = Jg({ + let vt = R("search.findSimilar", "Find Similar"), yt = R("search.similarDisabled", "AI features are disabled in settings"), { applyWatcherForScope: bt, isAiEnabled: xt } = t_({ container: t, state: c, sidebar: $e, @@ -17560,7 +17590,7 @@ async function y_(t, { useComfyThemeUI: n = !0, external: r = {} } = {}) { console.debug?.(e); } t._mjrVersionUpdateCleanup = Ve || g._mjrVersionUpdateCleanup, t.appendChild(et); - let St = () => mg(Ne), Ct = hg({ + let St = () => xg(Ne), Ct = Sg({ gridContainer: z, loadAssets: lt, loadAssetsFromList: ut, @@ -17601,7 +17631,7 @@ async function y_(t, { useComfyThemeUI: n = !0, external: r = {} } = {}) { } It(); }; - it || (Mt = Ug({ + it || (Mt = Xg({ gridContainer: z, readSelectedAssetIds: p, readActiveAssetId: () => m(), @@ -17611,7 +17641,7 @@ async function y_(t, { useComfyThemeUI: n = !0, external: r = {} } = {}) { rt(), Lt(); }, lifecycleSignal: i?.signal || null - })), At = gg({ + })), At = Cg({ state: c, gridContainer: z, folderBreadcrumb: Ge, @@ -17661,7 +17691,7 @@ async function y_(t, { useComfyThemeUI: n = !0, external: r = {} } = {}) { console.debug?.(e); } }, zt = null; - Yg({ + n_({ gridContainer: z, panelLifecycleAC: i, requestQueuedReload: () => { @@ -17688,12 +17718,12 @@ async function y_(t, { useComfyThemeUI: n = !0, external: r = {} } = {}) { gridController: Ct, registerSummaryDispose: ct }); - let Bt = xg({ + let Bt = Og({ state: c, customSelect: E, customRemoveBtn: O, - comfyConfirm: Wt, - comfyPrompt: Tt, + comfyConfirm: Tt, + comfyPrompt: Ut, comfyToast: e, get: re, post: L, @@ -17716,7 +17746,7 @@ async function y_(t, { useComfyThemeUI: n = !0, external: r = {} } = {}) { console.debug?.(e); } } - }), Vt = Bt.bind({ + }), Ht = Bt.bind({ customAddBtn: D, customRemoveBtn: O }); @@ -17728,7 +17758,7 @@ async function y_(t, { useComfyThemeUI: n = !0, external: r = {} } = {}) { } catch (e) { console.debug?.(e); } - let Ut = () => { + let Wt = () => { try { let t = z?._mjrGetAssets, n = z?._mjrSetSelection; if (typeof t != "function" || typeof n != "function") return; @@ -17740,7 +17770,7 @@ async function y_(t, { useComfyThemeUI: n = !0, external: r = {} } = {}) { console.debug?.(e); } }; - wt = _g({ + wt = wg({ state: c, tabButtons: _, customMenuBtn: v, @@ -17748,7 +17778,7 @@ async function y_(t, { useComfyThemeUI: n = !0, external: r = {} } = {}) { popovers: a, refreshCustomRoots: Bt.refreshCustomRoots, reloadGrid: Ct.reloadGrid, - reconcileSelection: Ut, + reconcileSelection: Wt, onChanged: () => { try { z && (z.dataset.mjrScope = String(d("scope", c.scope || "output") || "output")); @@ -17781,7 +17811,7 @@ async function y_(t, { useComfyThemeUI: n = !0, external: r = {} } = {}) { console.debug?.(e); } try { - await km(Je, Ye, Xe, { + await Im(Je, Ye, Xe, { scope: d("scope", c.scope || "output"), customRootId: d("customRootId", c.customRootId || "") }, null, { signal: i?.signal || null }); @@ -17800,7 +17830,7 @@ async function y_(t, { useComfyThemeUI: n = !0, external: r = {} } = {}) { }; Object.values(_).forEach((e) => { e.addEventListener("click", () => wt.setScope(e.dataset.scope), { signal: i?.signal }); - }), dg({ + }), vg({ messageBtn: C, messagePopover: xe, title: be, @@ -17836,7 +17866,7 @@ async function y_(t, { useComfyThemeUI: n = !0, external: r = {} } = {}) { Pe ]), a.setOnVisibilityChanged?.(() => It()); try { - window.addEventListener(Jn, (e) => { + window.addEventListener(qn, (e) => { Pt = !!e?.detail?.open, It(); }, { signal: i?.signal }); } catch (e) { @@ -17849,7 +17879,7 @@ async function y_(t, { useComfyThemeUI: n = !0, external: r = {} } = {}) { }, { signal: i?.signal }), x.addEventListener("click", (e) => { e.stopPropagation(), a.close(T), a.close(k), a.close(pe), a.close(xe), a.close(Fe), a.toggle(ge, x); }, { signal: i?.signal }); - let Kt = He ? null : Sg({ + let Kt = He ? null : kg({ state: c, sortBtn: b, sortMenu: me, @@ -17862,7 +17892,7 @@ async function y_(t, { useComfyThemeUI: n = !0, external: r = {} } = {}) { a.close(T), a.close(k), a.close(ge), a.close(xe), a.close(Fe); } }) : b.addEventListener("click", (e) => { e.stopPropagation(), a.close(T), a.close(k), a.close(ge), a.close(xe), a.close(Fe), a.toggle(pe, b); - }, { signal: i?.signal }), t_({ + }, { signal: i?.signal }), c_({ similarBtn: Pe, similarPopover: Fe, similarFindBtn: Ie, @@ -17889,7 +17919,7 @@ async function y_(t, { useComfyThemeUI: n = !0, external: r = {} } = {}) { workflowIdInput: P, reloadGrid: () => Ct.reloadGrid(), getDuplicatesAlert: () => Dt - }), n_({ + }), l_({ pinnedFoldersBtn: S, pinnedFoldersController: ve, pinnedFoldersMenu: ye, @@ -17909,7 +17939,7 @@ async function y_(t, { useComfyThemeUI: n = !0, external: r = {} } = {}) { notifyContextChanged: Lt, panelLifecycleAC: i }); - let { agendaCalendar: qt, disposeFilters: Jt } = g_({ + let { agendaCalendar: qt, disposeFilters: Jt } = C_({ state: c, hasVueHeaderSection: He, kindSelect: A, @@ -17930,13 +17960,13 @@ async function y_(t, { useComfyThemeUI: n = !0, external: r = {} } = {}) { dateExactInput: ue, agendaContainer: de, gridController: Ct, - reconcileVisibleSelection: Ut, + reconcileVisibleSelection: Wt, exitSimilarViewIfActive: Gt, notifyContextChanged: Lt, panelLifecycleAC: i, popovers: a, filterPopover: k - }), Yt = __({ + }), Yt = w_({ state: c, scopeController: wt, browserNav: At, @@ -17945,7 +17975,7 @@ async function y_(t, { useComfyThemeUI: n = !0, external: r = {} } = {}) { refreshDuplicateAlerts: Rt }); try { - Et = bg({ + Et = Dg({ state: c, gridContainer: z, filterBtn: y, @@ -18019,13 +18049,13 @@ async function y_(t, { useComfyThemeUI: n = !0, external: r = {} } = {}) { } catch (e) { console.debug?.(e); } - tt = Bg({ + tt = qg({ gridContainer: z, sidebar: $e, createRatingBadge: gt, - createTagsBadge: Ht, - showAssetInSidebar: $m, - closeSidebar: eh, + createTagsBadge: Vt, + showAssetInSidebar: oh, + closeSidebar: sh, state: c }); let Xt = { @@ -18053,14 +18083,14 @@ async function y_(t, { useComfyThemeUI: n = !0, external: r = {} } = {}) { loadAssets: lt, lifecycleSignal: i?.signal || null }; - Nt = typeof r?.initAssetsQueryController == "function" ? r.initAssetsQueryController(Xt) : Kg({ + Nt = typeof r?.initAssetsQueryController == "function" ? r.initAssetsQueryController(Xt) : $g({ gridContainer: z, gridWrapper: Qe, ...Xt }); - let Zt = Vg({ + let Zt = Jg({ onTriggerScan: (e) => { - xm(Je, Ye, Xe, e || {}); + Om(Je, Ye, Xe, e || {}); }, onToggleDetails: () => { tt?.toggleDetails?.(); @@ -18205,7 +18235,7 @@ async function y_(t, { useComfyThemeUI: n = !0, external: r = {} } = {}) { console.debug?.(e); } try { - Vt?.(); + Ht?.(); } catch (e) { console.debug?.(e); } @@ -18219,7 +18249,7 @@ async function y_(t, { useComfyThemeUI: n = !0, external: r = {} } = {}) { } catch (e) { console.debug?.(e); } - Qn(z), z = null; + Zn(z), z = null; try { a.dispose(); } catch (e) { @@ -18239,7 +18269,7 @@ async function y_(t, { useComfyThemeUI: n = !0, external: r = {} } = {}) { let en = async () => { await Nt?.queuedReload?.(); }; - zm(Je, Ye, qe, Xe, Nt?.createCountersUpdateHandler?.({ + Km(Je, Ye, qe, Xe, Nt?.createCountersUpdateHandler?.({ state: c, getStableQuery: () => String(z?.dataset?.mjrQuery || "*").trim() || "*", getRecentUserInteractionAt: () => Number(nt || 0) @@ -18259,7 +18289,7 @@ async function y_(t, { useComfyThemeUI: n = !0, external: r = {} } = {}) { Gt({ reload: !1 }), Lt(); }, startSearchTimer: () => { - Vp("searchQuery"); + Jp("searchQuery"); }, reloadGrid: () => { Ct.reloadGrid(); @@ -18269,7 +18299,7 @@ async function y_(t, { useComfyThemeUI: n = !0, external: r = {} } = {}) { try { tn = await _t(z, { scope: d("scope", c.scope || "output") || "output", - query: String(mg(l.read("searchQuery", c.searchQuery || "*") || "*") || "*"), + query: String(xg(l.read("searchQuery", c.searchQuery || "*") || "*") || "*"), customRootId: d("customRootId", c.customRootId || "") || "", subfolder: d("currentFolderRelativePath", c.currentFolderRelativePath || "") || "", collectionId: d("collectionId", c.collectionId || "") || "", @@ -18301,7 +18331,7 @@ async function y_(t, { useComfyThemeUI: n = !0, external: r = {} } = {}) { } catch (e) { console.debug?.(e); } - let rn = Wf(), an = !rn && (tn || nn) ? Promise.resolve({ + let rn = Zf(), an = !rn && (tn || nn) ? Promise.resolve({ ok: !0, hydrated: !!tn, cached: !!nn @@ -18340,14 +18370,14 @@ async function y_(t, { useComfyThemeUI: n = !0, external: r = {} } = {}) { } catch (e) { console.debug?.(e); } - return qp(Hp("panelRender", "gridRender") ?? 0), { gridContainer: z }; + return em(Yp("panelRender", "gridRender") ?? 0), { gridContainer: z }; } // ui/vue/components/status/StatusSection.vue -var b_ = /* @__PURE__ */ fr({ +var D_ = /* @__PURE__ */ dr({ __name: "StatusSection", setup(e, { expose: t }) { - let n = bm({ getScanContext: null }), r = n.querySelector("#mjr-status-dot"), i = n.querySelector("#mjr-status-text"), a = n.querySelector("#mjr-status-capabilities"); - return ir(() => { + let n = Dm({ getScanContext: null }), r = n.querySelector("#mjr-status-dot"), i = n.querySelector("#mjr-status-text"), a = n.querySelector("#mjr-status-capabilities"); + return rr(() => { try { n?._mjrStatusPollDispose?.(); } catch {} @@ -18358,25 +18388,25 @@ var b_ = /* @__PURE__ */ fr({ capabilitiesSection: a }), (e, t) => null; } -}), x_ = wr({ +}), O_ = Cr({ open: !1, initial: null, resolve: null }); -function S_(e = {}) { - return x_.open = !0, x_.initial = e || {}, new Promise((e) => { - x_.resolve = e; +function k_(e = {}) { + return O_.open = !0, O_.initial = e || {}, new Promise((e) => { + O_.resolve = e; }); } -function C_(e = null) { - let t = x_.resolve; - x_.open = !1, x_.initial = null, x_.resolve = null, t && t(e); +function A_(e = null) { + let t = O_.resolve; + O_.open = !1, O_.initial = null, O_.resolve = null, t && t(e); } // ui/vue/components/panel/SimilarSearchPopover.vue?vue&type=script&setup=true&lang.ts -var w_ = { +var j_ = { class: "mjr-popover mjr-similar-popover", style: { display: "none" } -}, T_ = { class: "mjr-menu mjr-similar-menu" }, E_ = { class: "mjr-menu-item-label mjr-menu-item-label--icon" }, D_ = { class: "mjr-menu-item-label mjr-menu-item-label--icon" }, O_ = { class: "mjr-menu-item-label mjr-menu-item-label--icon" }, k_ = { class: "mjr-menu-item-label mjr-menu-item-label--icon" }, A_ = /* @__PURE__ */ fr({ +}, M_ = { class: "mjr-menu mjr-similar-menu" }, N_ = { class: "mjr-menu-item-label mjr-menu-item-label--icon" }, P_ = { class: "mjr-menu-item-label mjr-menu-item-label--icon" }, F_ = { class: "mjr-menu-item-label mjr-menu-item-label--icon" }, I_ = { class: "mjr-menu-item-label mjr-menu-item-label--icon" }, L_ = /* @__PURE__ */ dr({ __name: "SimilarSearchPopover", setup(e, { expose: t }) { let n = Q(null), r = Q(null), i = Q(null), a = Q(null), o = (e) => e?.$el || e || null; @@ -18394,8 +18424,8 @@ var w_ = { return o(a.value); } }), (e, t) => { - let o = or("MButton"); - return q(), X("div", w_, [U("div", T_, [ + let o = ar("MButton"); + return q(), X("div", j_, [U("div", M_, [ Y(o, { ref_key: "findSimilarBtnRef", ref: n, @@ -18405,7 +18435,7 @@ var w_ = { text: "", title: Z(R)("search.findSimilarWarning", "Find similar assets. This may be heavy on very large libraries.") }, { - default: W(() => [U("span", E_, [t[0] ||= U("i", { + default: W(() => [U("span", N_, [t[0] ||= U("i", { class: "pi pi-sparkles", "aria-hidden": "true" }, null, -1), U("span", null, J(Z(R)("search.findSimilar", "Find Similar")), 1)])]), @@ -18419,7 +18449,7 @@ var w_ = { severity: "secondary", text: "" }, { - default: W(() => [U("span", D_, [t[1] ||= U("i", { + default: W(() => [U("span", P_, [t[1] ||= U("i", { class: "pi pi-clone", "aria-hidden": "true" }, null, -1), U("span", null, J(Z(R)("search.findDuplicates", "Find Duplicate")), 1)])]), @@ -18434,7 +18464,7 @@ var w_ = { severity: "secondary", text: "" }, { - default: W(() => [U("span", O_, [t[2] ||= U("i", { + default: W(() => [U("span", F_, [t[2] ||= U("i", { class: "pi pi-share-alt", "aria-hidden": "true" }, null, -1), U("span", null, J(Z(R)("search.generatedWithSameSaveNode", "Generated with same save node")), 1)])]), @@ -18448,7 +18478,7 @@ var w_ = { severity: "secondary", text: "" }, { - default: W(() => [U("span", k_, [t[3] ||= U("i", { + default: W(() => [U("span", I_, [t[3] ||= U("i", { class: "pi pi-sitemap", "aria-hidden": "true" }, null, -1), U("span", null, J(Z(R)("search.generatedFromSameWorkflow", "Generated from same workflow")), 1)])]), @@ -18457,11 +18487,11 @@ var w_ = { ])]); }; } -}), j_ = { class: "mjr-am-search-pill" }, M_ = ["id"], N_ = { class: "mjr-am-search-tools" }, P_ = { class: "mjr-popover-anchor" }, F_ = { class: "mjr-popover-anchor" }, I_ = "Ctrl/Cmd+F, Ctrl/Cmd+K, Ctrl/Cmd+H", L_ = "AND", R_ = /* @__PURE__ */ fr({ +}), R_ = { class: "mjr-am-search-pill" }, z_ = ["id"], B_ = { class: "mjr-am-search-tools" }, V_ = { class: "mjr-popover-anchor" }, H_ = { class: "mjr-popover-anchor" }, U_ = "Ctrl/Cmd+F, Ctrl/Cmd+K, Ctrl/Cmd+H", W_ = "AND", G_ = /* @__PURE__ */ dr({ __name: "SearchBar", emits: ["search-change"], setup(e, { expose: t, emit: n }) { - let r = n, i = dh(), a = Q(null), o = Q(null), s = Q(null), c = Q(null), l = Q(null), u = Q(null), d = Ne("mjr-search-autocomplete-", 8), f = (e) => e?.$el || e || null, p = () => f(o.value), m = Q(!1), h = Q(!0), g = Q(L_), _ = null, v = null, y = K(() => m.value ? R("search.semanticPlaceholder", "Describe what you're looking for...") : R("search.placeholder", "Search assets...")), b = K(() => m.value ? Vt(R("search.semanticTitle", "AI semantic search — describe your image in natural language"), I_) : Vt(R("search.title", "Search by filename, tags, or attributes (e.g. rating:5, ext:png)"), I_)), x = K(() => m.value ? { + let r = n, i = vh(), a = Q(null), o = Q(null), s = Q(null), c = Q(null), l = Q(null), u = Q(null), d = Ne("mjr-search-autocomplete-", 8), f = (e) => e?.$el || e || null, p = () => f(o.value), m = Q(!1), h = Q(!0), g = Q(W_), _ = null, v = null, y = K(() => m.value ? R("search.semanticPlaceholder", "Describe what you're looking for...") : R("search.placeholder", "Search assets...")), b = K(() => m.value ? Bt(R("search.semanticTitle", "AI semantic search — describe your image in natural language"), U_) : Bt(R("search.title", "Search by filename, tags, or attributes (e.g. rating:5, ext:png)"), U_)), x = K(() => m.value ? { background: "rgba(0, 188, 212, 0.2)", borderColor: "rgba(0, 188, 212, 0.6)", color: "#00BCD4", @@ -18498,7 +18528,7 @@ var w_ = { } }, T = async (e) => { let t = e.target?.value || ""; - i.searchQuery = t, i.metadataSearchMode = L_, S(), C({ query: t }), await j(); + i.searchQuery = t, i.metadataSearchMode = W_, S(), C({ query: t }), await j(); }, E = (e) => { let t = String(e || "").split(/\s+/); return t[t.length - 1] || ""; @@ -18514,17 +18544,17 @@ var w_ = { return `${n ? n[1] : ""}${t}`.trimStart(); } function k(e, t) { - let n = E(e), r = n.replace(/^-/, ""), i = Cn(); + let n = E(e), r = n.replace(/^-/, ""), i = Sn(); if (!r.includes(":")) { let t = r.toLowerCase(); return Object.keys(i).filter((e) => e.startsWith(t)).slice(0, 12).map((t) => O(e, `${n.startsWith("-") ? "-" : ""}${t}:`)); } let [a, o = ""] = r.split(/:(.*)/s); - if (!Ln(a)) return []; + if (!In(a)) return []; let s = o.toLowerCase(), c = Array.isArray(t?.keys) ? t.keys : [], l = t?.workflow_nodes || {}; return [...c, ...Object.keys(l).flatMap((e) => (l[e] || []).map((t) => `workflow_nodes.${e}.${t}`))].filter((e) => String(e || "").toLowerCase().includes(s)).slice(0, 16).map((t) => O(e, `${n.startsWith("-") ? "-" : ""}${a}:${t}`)); } - let A = 0, j = Yt(async () => { + let A = 0, j = Jt(async () => { let e = (p()?.value || "").trim(); if (m.value || e.length < 1) return; let t = ++A; @@ -18544,19 +18574,19 @@ var w_ = { })); } catch {} }, 300); - return lr(() => i.searchQuery, (e) => { + return cr(() => i.searchQuery, (e) => { let t = p(); t && t.value !== e && (t.value = e); - }), lr(h, (e) => { + }), cr(h, (e) => { !e && m.value && (m.value = !1), S(); - }), lr(m, () => { + }), cr(m, () => { S(); - }), lr(() => i.metadataSearchMode, (e) => { - String(e || "").toUpperCase() !== L_ && (i.metadataSearchMode = L_), g.value !== L_ && (g.value = L_), S(); + }), cr(() => i.metadataSearchMode, (e) => { + String(e || "").toUpperCase() !== W_ && (i.metadataSearchMode = W_), g.value !== W_ && (g.value = W_), S(); }), Mr(() => { try { let e = p(); - e && (e.value = i.searchQuery || ""), i.metadataSearchMode = L_; + e && (e.value = i.searchQuery || ""), i.metadataSearchMode = W_; } catch (e) { console.debug?.(e); } @@ -18593,12 +18623,12 @@ var w_ = { h.value = !!e, S(); } }), (e, t) => { - let n = or("MInputText"), r = or("MButton"); + let n = ar("MInputText"), r = ar("MButton"); return q(), X("div", { ref_key: "searchSectionRef", ref: a, class: "mjr-am-search" - }, [U("div", j_, [ + }, [U("div", R_, [ t[0] ||= U("span", { class: "mjr-am-search-icon" }, [U("i", { class: "pi pi-search" })], -1), Y(n, { ref_key: "searchInputRef", @@ -18619,9 +18649,9 @@ var w_ = { ref_key: "dataListRef", ref: s, id: Z(d) - }, null, 8, M_) - ]), U("div", N_, [ - U("div", P_, [Y(r, { + }, null, 8, z_) + ]), U("div", B_, [ + U("div", V_, [Y(r, { ref_key: "semanticBtnRef", ref: u, type: "button", @@ -18632,7 +18662,7 @@ var w_ = { disabled: !h.value, "aria-disabled": !h.value, title: h.value ? Z(R)("search.semanticToggle", "Toggle AI semantic search (CLIP-based)") : Z(R)("search.semanticDisabled", "AI semantic search is disabled in settings"), - style: Sr(x.value), + style: xr(x.value), onClick: w }, { default: W(() => [...t[1] ||= [U("i", { class: "pi pi-sparkles" }, null, -1)]]), @@ -18643,7 +18673,7 @@ var w_ = { "title", "style" ])]), - U("div", F_, [Y(r, { + U("div", H_, [Y(r, { ref_key: "similarBtnRef", ref: c, type: "button", @@ -18655,24 +18685,24 @@ var w_ = { }, { default: W(() => [...t[2] ||= [U("i", { class: "pi pi-search" }, null, -1)]]), _: 1 - }, 8, ["title"]), Y(A_, { + }, 8, ["title"]), Y(L_, { ref_key: "similarPopoverRef", ref: l }, null, 512)]), - _r(e.$slots, "filter-anchor"), - _r(e.$slots, "sort-anchor"), - _r(e.$slots, "collections-anchor"), - _r(e.$slots, "pinned-folders-anchor") + gr(e.$slots, "filter-anchor"), + gr(e.$slots, "sort-anchor"), + gr(e.$slots, "collections-anchor"), + gr(e.$slots, "pinned-folders-anchor") ])], 512); }; } -}), z_ = { +}), K_ = { class: "mjr-popover mjr-sort-popover", style: { display: "none" } -}, B_ = { class: "mjr-menu-item-label" }, V_ = /* @__PURE__ */ fr({ +}, q_ = { class: "mjr-menu-item-label" }, J_ = /* @__PURE__ */ dr({ __name: "SortPopover", setup(e) { - let t = dh(), n = K(() => t.sort || "mtime_desc"), r = (e) => { + let t = vh(), n = K(() => t.sort || "mtime_desc"), r = (e) => { t.sort = e; try { window.dispatchEvent(new CustomEvent("mjr:sort-changed", { detail: { sort: e } })); @@ -18721,33 +18751,33 @@ var w_ = { command: () => r(e.key) }))); return (e, t) => { - let r = or("MMenu"); - return q(), X("div", z_, [Y(r, { + let r = ar("MMenu"); + return q(), X("div", K_, [Y(r, { model: i.value, class: "mjr-menu mjr-prime-menu mjr-sort-menu", pt: { list: { class: "mjr-menu mjr-prime-menu-list" } } }, { - item: W(({ item: e }) => [U("div", { class: Dr(["mjr-menu-item", { "is-active": n.value === e.key }]) }, [U("span", B_, J(e.label), 1), U("i", { + item: W(({ item: e }) => [U("div", { class: Dr(["mjr-menu-item", { "is-active": n.value === e.key }]) }, [U("span", q_, J(e.label), 1), U("i", { class: Dr([e.icon, "mjr-menu-item-check"]), - style: Sr({ opacity: +(n.value === e.key) }) + style: xr({ opacity: +(n.value === e.key) }) }, null, 6)], 2)]), _: 1 }, 8, ["model"])]); }; } -}), H_ = { class: "mjr-popover mjr-filter-popover mjr-popover--hidden" }, U_ = { class: "mjr-filter-head" }, W_ = { class: "mjr-filter-head-left" }, G_ = { class: "mjr-filter-kicker" }, K_ = { class: "mjr-filter-subtitle" }, q_ = { class: "mjr-filter-head-actions" }, J_ = { class: "mjr-filter-active-count" }, Y_ = { class: "mjr-filter-group-title" }, X_ = { +}), Y_ = { class: "mjr-popover mjr-filter-popover mjr-popover--hidden" }, X_ = { class: "mjr-filter-head" }, Z_ = { class: "mjr-filter-head-left" }, Q_ = { class: "mjr-filter-kicker" }, $_ = { class: "mjr-filter-subtitle" }, ev = { class: "mjr-filter-head-actions" }, tv = { class: "mjr-filter-active-count" }, nv = { class: "mjr-filter-group-title" }, rv = { class: "mjr-filter-group-chevron", "aria-hidden": "true" -}, Z_ = { class: "mjr-filter-group-body" }, Q_ = { class: "mjr-filter-card" }, $_ = { class: "mjr-popover-row" }, ev = { class: "mjr-popover-label" }, tv = { class: "mjr-popover-row" }, nv = { class: "mjr-popover-label" }, rv = ["title"], iv = { class: "mjr-filter-card" }, av = { class: "mjr-popover-row" }, ov = { class: "mjr-popover-label" }, sv = { class: "mjr-popover-row" }, cv = { class: "mjr-popover-label" }, lv = { class: "mjr-popover-row" }, uv = { class: "mjr-popover-label" }, dv = { class: "mjr-filter-stack" }, fv = { class: "mjr-popover-row" }, pv = { class: "mjr-popover-label" }, mv = { class: "mjr-popover-row" }, hv = { class: "mjr-popover-label" }, gv = { class: "mjr-filter-group-title" }, _v = { +}, iv = { class: "mjr-filter-group-body" }, av = { class: "mjr-filter-card" }, ov = { class: "mjr-popover-row" }, sv = { class: "mjr-popover-label" }, cv = { class: "mjr-popover-row" }, lv = { class: "mjr-popover-label" }, uv = ["title"], dv = { class: "mjr-filter-card" }, fv = { class: "mjr-popover-row" }, pv = { class: "mjr-popover-label" }, mv = { class: "mjr-popover-row" }, hv = { class: "mjr-popover-label" }, gv = { class: "mjr-popover-row" }, _v = { class: "mjr-popover-label" }, vv = { class: "mjr-filter-stack" }, yv = { class: "mjr-popover-row" }, bv = { class: "mjr-popover-label" }, xv = { class: "mjr-popover-row" }, Sv = { class: "mjr-popover-label" }, Cv = { class: "mjr-filter-group-title" }, wv = { class: "mjr-filter-group-chevron", "aria-hidden": "true" -}, vv = { class: "mjr-filter-group-body" }, yv = { class: "mjr-filter-card" }, bv = { class: "mjr-popover-row mjr-popover-row--3col" }, xv = { class: "mjr-popover-label" }, Sv = { class: "mjr-popover-row" }, Cv = { class: "mjr-popover-label" }, wv = { class: "mjr-popover-row mjr-popover-row--3col" }, Tv = { class: "mjr-popover-label" }, Ev = { class: "mjr-popover-row mjr-popover-row--3col" }, Dv = { class: "mjr-popover-label" }, Ov = { class: "mjr-filter-group-title" }, kv = { +}, Tv = { class: "mjr-filter-group-body" }, Ev = { class: "mjr-filter-card" }, Dv = { class: "mjr-popover-row mjr-popover-row--3col" }, Ov = { class: "mjr-popover-label" }, kv = { class: "mjr-popover-row" }, Av = { class: "mjr-popover-label" }, jv = { class: "mjr-popover-row mjr-popover-row--3col" }, Mv = { class: "mjr-popover-label" }, Nv = { class: "mjr-popover-row mjr-popover-row--3col" }, Pv = { class: "mjr-popover-label" }, Fv = { class: "mjr-filter-group-title" }, Iv = { class: "mjr-filter-group-chevron", "aria-hidden": "true" -}, Av = { class: "mjr-filter-group-body" }, jv = { class: "mjr-filter-card mjr-filter-card--agenda" }, Mv = { class: "mjr-popover-row" }, Nv = { class: "mjr-popover-label" }, Pv = { class: "mjr-popover-row" }, Fv = { class: "mjr-popover-label" }, Iv = /* @__PURE__ */ fr({ +}, Lv = { class: "mjr-filter-group-body" }, Rv = { class: "mjr-filter-card mjr-filter-card--agenda" }, zv = { class: "mjr-popover-row" }, Bv = { class: "mjr-popover-label" }, Vv = { class: "mjr-popover-row" }, Hv = { class: "mjr-popover-label" }, Uv = /* @__PURE__ */ dr({ __name: "FilterPopover", setup(e, { expose: t }) { - let n = dh(), r = Q(null), a = Q(null), o = Q(null), s = Q(null), c = Q(null), l = Q(null), u = Q(null), d = Q(null), f = Q(null), p = Q(null), m = Q([{ + let n = vh(), r = Q(null), a = Q(null), o = Q(null), s = Q(null), c = Q(null), l = Q(null), u = Q(null), d = Q(null), f = Q(null), p = Q(null), m = Q([{ label: R("filter.any", "Any"), value: "" }]), h = (e) => e?.$el || e || null, g = (e) => h(e.value)?.value || "", _ = (e, t) => { @@ -19111,9 +19141,9 @@ var w_ = { return u.value; } }), (e, t) => { - let i = or("MButton"), m = or("MSelect"), h = or("MCheckbox"), g = or("MInputText"); - return q(), X("div", H_, [ - U("div", U_, [U("div", W_, [U("div", G_, J(Z(R)("label.filters", "Filters")), 1), U("div", K_, J(Z(R)("label.refineResults", "Refine your results")), 1)]), U("div", q_, [U("span", J_, J(ve.value), 1), Y(i, { + let i = ar("MButton"), m = ar("MSelect"), h = ar("MCheckbox"), g = ar("MInputText"); + return q(), X("div", Y_, [ + U("div", X_, [U("div", Z_, [U("div", Q_, J(Z(R)("label.filters", "Filters")), 1), U("div", $_, J(Z(R)("label.refineResults", "Refine your results")), 1)]), U("div", ev, [U("span", tv, J(ve.value), 1), Y(i, { type: "button", class: "mjr-filter-clear-all", severity: "secondary", @@ -19121,7 +19151,7 @@ var w_ = { disabled: ve.value === 0, onClick: ye }, { - default: W(() => [rr(J(Z(R)("action.clearAll", "Clear all")), 1)]), + default: W(() => [nr(J(Z(R)("action.clearAll", "Clear all")), 1)]), _: 1 }, 8, ["disabled"])])]), U("div", { class: Dr(["mjr-filter-group mjr-filter-group--core", { "is-open": se("core") }]) }, [Y(i, { @@ -19132,9 +19162,9 @@ var w_ = { "aria-expanded": String(se("core")), onClick: t[0] ||= (e) => oe("core") }, { - default: W(() => [U("span", Y_, J(Z(R)("group.core", "Core")), 1), U("span", X_, J(se("core") ? "▾" : "▸"), 1)]), + default: W(() => [U("span", nv, J(Z(R)("group.core", "Core")), 1), U("span", rv, J(se("core") ? "▾" : "▸"), 1)]), _: 1 - }, 8, ["aria-expanded"]), vr(U("div", Z_, [U("div", Q_, [U("div", $_, [U("div", ev, J(Z(R)("label.type")), 1), Y(m, { + }, 8, ["aria-expanded"]), _r(U("div", iv, [U("div", av, [U("div", ov, [U("div", sv, J(Z(R)("label.type")), 1), Y(m, { class: "mjr-select mjr-filter-select", "panel-class": "mjr-filter-select-panel", title: Z(R)("tooltip.filterByFileType", "Filter by file type"), @@ -19147,7 +19177,7 @@ var w_ = { "title", "model-value", "options" - ])]), U("div", tv, [U("div", nv, J(Z(R)("label.workflow")), 1), U("label", { + ])]), U("div", cv, [U("div", lv, J(Z(R)("label.workflow")), 1), U("label", { class: "mjr-popover-toggle", title: Z(R)("tooltip.filterWorkflowOnly", "Show only assets with embedded workflow data") }, [Y(h, { @@ -19155,8 +19185,8 @@ var w_ = { "model-value": !!Z(n).workflowOnly, binary: "", "onUpdate:modelValue": M - }, null, 8, ["model-value"]), U("span", null, J(Z(R)("filter.onlyWithWorkflow")), 1)], 8, rv)])]), U("div", iv, [ - U("div", av, [U("div", ov, J(Z(R)("label.workflowType", "Workflow type")), 1), Y(m, { + }, null, 8, ["model-value"]), U("span", null, J(Z(R)("filter.onlyWithWorkflow")), 1)], 8, uv)])]), U("div", dv, [ + U("div", fv, [U("div", pv, J(Z(R)("label.workflowType", "Workflow type")), 1), Y(m, { class: "mjr-select mjr-filter-select", "panel-class": "mjr-filter-select-panel", "model-value": String(Z(n).workflowType || "").trim().toUpperCase(), @@ -19165,7 +19195,7 @@ var w_ = { "option-value": "value", "onUpdate:modelValue": N }, null, 8, ["model-value", "options"])]), - U("div", sv, [U("div", cv, J(Z(R)("label.sameWorkflow", "Generated with Same Workflow")), 1), Y(g, { + U("div", mv, [U("div", hv, J(Z(R)("label.sameWorkflow", "Generated with Same Workflow")), 1), Y(g, { ref_key: "workflowIdInputRef", ref: f, class: "mjr-input", @@ -19179,7 +19209,7 @@ var w_ = { "placeholder", "model-value" ])]), - U("div", lv, [U("div", uv, J(Z(R)("label.workflowModelFamily", "Model family")), 1), U("div", dv, [Y(m, { + U("div", gv, [U("div", _v, J(Z(R)("label.workflowModelFamily", "Model family")), 1), U("div", vv, [Y(m, { class: "mjr-select mjr-filter-select", "panel-class": "mjr-filter-select-panel", "model-value": String(Z(n).workflowModelFilter || ""), @@ -19196,7 +19226,7 @@ var w_ = { "onUpdate:modelValue": ee, onChange: t[2] ||= (e) => ee(e?.target?.value) }, null, 8, ["placeholder", "model-value"])])]), - U("div", fv, [U("div", pv, J(Z(R)("label.workflowRunsOn", "Runs on")), 1), Y(m, { + U("div", yv, [U("div", bv, J(Z(R)("label.workflowRunsOn", "Runs on")), 1), Y(m, { class: "mjr-select mjr-filter-select", "panel-class": "mjr-filter-select-panel", "model-value": String(Z(n).workflowRunsOnFilter || "").trim().toLowerCase(), @@ -19205,7 +19235,7 @@ var w_ = { "option-value": "value", "onUpdate:modelValue": te }, null, 8, ["model-value", "options"])]), - U("div", mv, [U("div", hv, J(Z(R)("label.rating")), 1), Y(m, { + U("div", xv, [U("div", Sv, J(Z(R)("label.rating")), 1), Y(m, { class: "mjr-select mjr-filter-select", "panel-class": "mjr-filter-select-panel", title: Z(R)("tooltip.filterMinRating", "Filter by minimum rating"), @@ -19219,7 +19249,7 @@ var w_ = { "model-value", "options" ])]) - ])], 512), [[br, se("core")]])], 2), + ])], 512), [[yr, se("core")]])], 2), U("div", { class: Dr(["mjr-filter-group mjr-filter-group--media", { "is-open": se("media") }]) }, [Y(i, { type: "button", class: "mjr-filter-group-toggle", @@ -19228,11 +19258,11 @@ var w_ = { "aria-expanded": String(se("media")), onClick: t[3] ||= (e) => oe("media") }, { - default: W(() => [U("span", gv, J(Z(R)("group.media", "Media")), 1), U("span", _v, J(se("media") ? "▾" : "▸"), 1)]), + default: W(() => [U("span", Cv, J(Z(R)("group.media", "Media")), 1), U("span", wv, J(se("media") ? "▾" : "▸"), 1)]), _: 1 - }, 8, ["aria-expanded"]), vr(U("div", vv, [U("div", yv, [ - U("div", bv, [ - U("div", xv, J(Z(R)("label.fileSizeMB", "File size (MB)")), 1), + }, 8, ["aria-expanded"]), _r(U("div", Tv, [U("div", Ev, [ + U("div", Dv, [ + U("div", Ov, J(Z(R)("label.fileSizeMB", "File size (MB)")), 1), Y(g, { ref_key: "minSizeInputRef", ref: r, @@ -19256,7 +19286,7 @@ var w_ = { onChange: I }, null, 8, ["placeholder", "value"]) ]), - U("div", Sv, [U("div", Cv, J(Z(R)("label.resolutionPx", "Resolution (px)")), 1), Y(m, { + U("div", kv, [U("div", Av, J(Z(R)("label.resolutionPx", "Resolution (px)")), 1), Y(m, { class: "mjr-select mjr-filter-select", "panel-class": "mjr-filter-select-panel", "model-value": E.value, @@ -19265,8 +19295,8 @@ var w_ = { "option-value": "value", "onUpdate:modelValue": re }, null, 8, ["model-value", "options"])]), - U("div", wv, [ - U("div", Tv, J(Z(R)("label.resolutionMinWxH", "Min WxH (px)")), 1), + U("div", jv, [ + U("div", Mv, J(Z(R)("label.resolutionMinWxH", "Min WxH (px)")), 1), Y(g, { ref_key: "minWidthInputRef", ref: o, @@ -19300,8 +19330,8 @@ var w_ = { "value" ]) ]), - U("div", Ev, [ - U("div", Dv, J(Z(R)("label.resolutionMaxWxH", "Max WxH (px)")), 1), + U("div", Nv, [ + U("div", Pv, J(Z(R)("label.resolutionMaxWxH", "Max WxH (px)")), 1), Y(g, { ref_key: "maxWidthInputRef", ref: c, @@ -19335,7 +19365,7 @@ var w_ = { "value" ]) ]) - ])], 512), [[br, se("media")]])], 2), + ])], 512), [[yr, se("media")]])], 2), U("div", { class: Dr(["mjr-filter-group mjr-filter-group--time", { "is-open": se("time") }]) }, [Y(i, { type: "button", class: "mjr-filter-group-toggle", @@ -19344,9 +19374,9 @@ var w_ = { "aria-expanded": String(se("time")), onClick: t[4] ||= (e) => oe("time") }, { - default: W(() => [U("span", Ov, J(Z(R)("group.time", "Time")), 1), U("span", kv, J(se("time") ? "▾" : "▸"), 1)]), + default: W(() => [U("span", Fv, J(Z(R)("group.time", "Time")), 1), U("span", Iv, J(se("time") ? "▾" : "▸"), 1)]), _: 1 - }, 8, ["aria-expanded"]), vr(U("div", Av, [U("div", jv, [U("div", Mv, [U("div", Nv, J(Z(R)("label.dateRange")), 1), Y(m, { + }, 8, ["aria-expanded"]), _r(U("div", Lv, [U("div", Rv, [U("div", zv, [U("div", Bv, J(Z(R)("label.dateRange")), 1), Y(m, { class: "mjr-select mjr-filter-select", "panel-class": "mjr-filter-select-panel", title: Z(R)("tooltip.filterByDateRange", "Filter by date range"), @@ -19359,7 +19389,7 @@ var w_ = { "title", "model-value", "options" - ])]), U("div", Pv, [U("div", Fv, J(Z(R)("label.agenda")), 1), U("div", { + ])]), U("div", Vv, [U("div", Hv, J(Z(R)("label.agenda")), 1), U("div", { ref_key: "agendaContainerRef", ref: u, class: "mjr-agenda-container" @@ -19370,11 +19400,11 @@ var w_ = { class: Dr(["mjr-input mjr-agenda-input", D.value]), value: Z(n).dateExactFilter, onChange: ae - }, null, 8, ["class", "value"])], 512)])])], 512), [[br, se("time")]])], 2) + }, null, 8, ["class", "value"])], 512)])])], 512), [[yr, se("time")]])], 2) ]); }; } -}), Lv = 128, Rv = Object.freeze([ +}), Wv = 128, Gv = Object.freeze([ { key: "portraits", label: "Portraits", @@ -19412,10 +19442,10 @@ var w_ = { iconClass: "pi pi-circle" } ]); -function zv(e) { +function Kv(e) { try { let t = String(e ?? "").trim(); - if (!t || t.length > Lv || t.includes("\0")) return ""; + if (!t || t.length > Wv || t.includes("\0")) return ""; for (let e = 0; e < t.length; e += 1) { let n = t.charCodeAt(e); if (n <= 31 || n === 127) return ""; @@ -19425,7 +19455,7 @@ function zv(e) { return ""; } } -function Bv(e) { +function qv(e) { if (!e || typeof e != "object") return null; let t = String(e.filepath || "").trim(); return t ? { @@ -19437,10 +19467,10 @@ function Bv(e) { root_id: String(e.root_id || e.rootId || e.custom_root_id || "").trim() || void 0 } : null; } -function Vv(e) { +function Jv(e) { let t = [], n = [], r = /* @__PURE__ */ new Set(); for (let i of Array.isArray(e) ? e : []) { - let e = Bv(i); + let e = qv(i); if (e?.filepath) { let n = e.filepath.toLowerCase(); if (r.has(n)) continue; @@ -19455,7 +19485,7 @@ function Vv(e) { missingIds: n }; } -async function Hv(e) { +async function Yv(e) { let t = Array.from(new Set((Array.isArray(e) ? e : []).map((e) => Number(e)).filter((e) => Number.isFinite(e) && e > 0))); if (!t.length) return { ok: !0, @@ -19466,13 +19496,13 @@ async function Hv(e) { ok: !1, error: String(n?.error || "Failed to fetch assets") }; - let { assets: r } = Vv(Array.isArray(n?.data) ? n.data : Array.isArray(n?.data?.assets) ? n.data.assets : []); + let { assets: r } = Jv(Array.isArray(n?.data) ? n.data : Array.isArray(n?.data?.assets) ? n.data.assets : []); return { ok: !0, data: r }; } -function Uv(e) { +function Xv(e) { let t = String(e?.label || "").trim(); if (t && !/^group\b/i.test(t)) return t; let n = (Array.isArray(e?.dominant_tags) ? e.dominant_tags : []).map((e) => String(e || "").trim()).filter(Boolean); @@ -19490,43 +19520,43 @@ function Uv(e) { let s = Object.entries(o).sort((e, t) => t[1] - e[1])[0]?.[0] || "other", c = s === "image" ? "Images" : s === "video" ? "Videos" : s === "audio" ? "Audio" : "Media", l = Number(e?.cluster_id), u = Number.isFinite(l) ? ` ${l + 1}` : ""; return a ? `${a} - ${c}` : `${c} Cluster${u}`; } -function Wv() { +function Zv() { try { - return !!(Hn()?.ai?.vectorSearchEnabled ?? !0); + return !!(Vn()?.ai?.vectorSearchEnabled ?? !0); } catch { return !0; } } // ui/vue/components/panel/CollectionsPopover.vue?vue&type=script&setup=true&lang.ts -var Gv = { class: "mjr-menu mjr-collections-menu" }, Kv = { class: "mjr-menu-item-label" }, qv = { class: "mjr-menu-item-label" }, Jv = { class: "mjr-menu-item-right" }, Yv = { +var Qv = { class: "mjr-menu mjr-collections-menu" }, $v = { class: "mjr-menu-item-label" }, ey = { class: "mjr-menu-item-label" }, ty = { class: "mjr-menu-item-right" }, ny = { key: 0, class: "mjr-menu-item-hint" -}, Xv = { +}, ry = { key: 1, class: "mjr-muted" -}, Zv = { +}, iy = { key: 2, class: "mjr-state-block is-error" -}, Qv = { +}, ay = { key: 3, class: "mjr-muted" -}, $v = { class: "mjr-collection-row" }, ey = { class: "mjr-menu-item-label" }, ty = { class: "mjr-menu-item-right" }, ny = { +}, oy = { class: "mjr-collection-row" }, sy = { class: "mjr-menu-item-label" }, cy = { class: "mjr-menu-item-right" }, ly = { key: 0, class: "mjr-menu-item-hint" -}, ry = { class: "mjr-state-block" }, iy = { class: "mjr-section-title mjr-section-title--cyan" }, ay = { class: "mjr-section-hint" }, oy = { class: "mjr-menu-item-label mjr-menu-item-label--icon" }, sy = { class: "mjr-section-title mjr-section-title--violet" }, cy = { class: "mjr-section-hint" }, ly = { class: "mjr-menu-item-label mjr-menu-item-label--icon" }, uy = { +}, uy = { class: "mjr-state-block" }, dy = { class: "mjr-section-title mjr-section-title--cyan" }, fy = { class: "mjr-section-hint" }, py = { class: "mjr-menu-item-label mjr-menu-item-label--icon" }, my = { class: "mjr-section-title mjr-section-title--violet" }, hy = { class: "mjr-section-hint" }, gy = { class: "mjr-menu-item-label mjr-menu-item-label--icon" }, _y = { key: 0, class: "mjr-state-block is-error" -}, dy = { class: "mjr-cluster-thumbs" }, fy = ["src", "alt"], py = { class: "mjr-cluster-info" }, my = ["title"], hy = { class: "mjr-cluster-count" }, gy = "mjr:collections-changed", _y = /* @__PURE__ */ fr({ +}, vy = { class: "mjr-cluster-thumbs" }, yy = ["src", "alt"], by = { class: "mjr-cluster-info" }, xy = ["title"], Sy = { class: "mjr-cluster-count" }, Cy = "mjr:collections-changed", wy = /* @__PURE__ */ dr({ __name: "CollectionsPopover", setup(t, { expose: n }) { - let r = dh(), i = Q(null), a = Q([]), o = Q(!1), s = Q(""), c = Q(!1), l = Q(!0), u = Q(!1), p = Q(!1), m = Q(!1), h = Q([]), g = Q(""), _ = Q(""), v = 0, y = null, b = !1, x = K(() => String(r.collectionId || "").trim()), C = K(() => String(r.collectionName || "").trim()), T = K(() => !!x.value), O = K(() => !l.value || p.value), k = K(() => l.value && u.value), A = K(() => `${Math.max(1, Math.min(a.value.length, 6)) * 48}px`); + let r = vh(), i = Q(null), a = Q([]), o = Q(!1), s = Q(""), c = Q(!1), l = Q(!0), u = Q(!1), p = Q(!1), m = Q(!1), h = Q([]), g = Q(""), _ = Q(""), v = 0, y = null, b = !1, x = K(() => String(r.collectionId || "").trim()), C = K(() => String(r.collectionName || "").trim()), T = K(() => !!x.value), O = K(() => !l.value || p.value), k = K(() => l.value && u.value), A = K(() => `${Math.max(1, Math.min(a.value.length, 6)) * 48}px`); function j() { let e = i.value; return !!e && String(e.style.display || "").toLowerCase() !== "none"; } function M({ collectionId: e = x.value, collectionName: t = C.value, close: n = !0, reload: r = !0 } = {}) { try { - window.dispatchEvent(new CustomEvent(gy, { detail: { + window.dispatchEvent(new CustomEvent(Cy, { detail: { collectionId: String(e || ""), collectionName: String(t || ""), close: n !== !1, @@ -19544,7 +19574,7 @@ var Gv = { class: "mjr-menu mjr-collections-menu" }, Kv = { class: "mjr-menu-ite } } async function P() { - if (!Wv()) return { + if (!Zv()) return { enabled: !1, vectorAvailable: !1, vectorDisabled: !1 @@ -19599,9 +19629,9 @@ var Gv = { class: "mjr-menu mjr-collections-menu" }, Kv = { class: "mjr-menu-ite }; } let I = F("create", async () => { - let t = await Tt(R("dialog.createCollection", "Create collection"), R("dialog.collectionPlaceholder", "Collection name")); + let t = await Ut(R("dialog.createCollection", "Create collection"), R("dialog.collectionPlaceholder", "Collection name")); if (!t) return; - let n = zv(t); + let n = Kv(t); if (!n) { e(R("toast.invalidCollectionName", "Invalid collection name"), "error"); return; @@ -19628,7 +19658,7 @@ var Gv = { class: "mjr-menu mjr-collections-menu" }, Kv = { class: "mjr-menu-ite })); }), ie = F("delete", async (t) => { let n = String(t?.id || ""), r = String(t?.name || n); - if (!n || !await Wt(R("dialog.deleteCollection", "Delete collection \"{name}\"?", { name: r }))) return; + if (!n || !await Tt(R("dialog.deleteCollection", "Delete collection \"{name}\"?", { name: r }))) return; let i = await w(n); i?.ok ? n === x.value ? M({ collectionId: "", @@ -19647,9 +19677,9 @@ var Gv = { class: "mjr-menu mjr-collections-menu" }, Kv = { class: "mjr-menu-ite if (!i) return; let a = await d(String(t?.query || ""), 50); if (a?.ok && Array.isArray(a?.data) && a.data.length > 0) { - let t = Vv(a.data), r = t.assets; + let t = Jv(a.data), r = t.assets; if (t.missingIds.length) { - let e = await Hv(t.missingIds); + let e = await Yv(t.missingIds); e.ok && Array.isArray(e.data) && (r = ee(r, e.data)); } if (r.length) { @@ -19695,7 +19725,7 @@ var Gv = { class: "mjr-menu mjr-collections-menu" }, Kv = { class: "mjr-menu-ite } h.value = t.data.map((e) => ({ ...e, - _label: Uv(e) + _label: Xv(e) })); } catch (t) { console.error("[Majoor] Discover groups failed:", t), g.value = R("toast.clusterAnalysisFailed", "Cluster analysis failed"), e(R("toast.clusterAnalysisFailed", "Cluster analysis failed"), "error"); @@ -19709,7 +19739,7 @@ var Gv = { class: "mjr-menu mjr-collections-menu" }, Kv = { class: "mjr-menu-ite if (!_.value) { _.value = n; try { - let n = String(t?._label || Uv(t) || "").trim(); + let n = String(t?._label || Xv(t) || "").trim(); if (!n) return; let r = await S(n); if (!r?.ok) { @@ -19718,7 +19748,7 @@ var Gv = { class: "mjr-menu mjr-collections-menu" }, Kv = { class: "mjr-menu-ite } let i = String(r?.data?.id || ""), a = Array.isArray(t?.all_asset_ids) ? t.all_asset_ids : []; if (i && a.length) { - let t = await Hv(a); + let t = await Yv(a); if (!t.ok) { e(t.error || R("toast.failedLoadClusterAssets", "Failed to load cluster assets"), "error"); return; @@ -19754,7 +19784,7 @@ var Gv = { class: "mjr-menu mjr-collections-menu" }, Kv = { class: "mjr-menu-ite attributes: !0, attributeFilter: ["style"] })); - }), ir(() => { + }), rr(() => { try { y?.disconnect?.(); } catch (e) { @@ -19762,13 +19792,13 @@ var Gv = { class: "mjr-menu mjr-collections-menu" }, Kv = { class: "mjr-menu-ite } y = null; }), n({ refresh: te }), (e, t) => { - let n = or("MButton"), r = or("MVirtualScroller"); + let n = ar("MButton"), r = ar("MVirtualScroller"); return q(), X("div", { ref_key: "rootRef", ref: i, class: "mjr-popover mjr-collections-popover", style: { display: "none" } - }, [U("div", Gv, [ + }, [U("div", Qv, [ Y(n, { type: "button", class: "mjr-menu-item", @@ -19777,10 +19807,10 @@ var Gv = { class: "mjr-menu mjr-collections-menu" }, Kv = { class: "mjr-menu-ite disabled: _.value !== "", onClick: Z(I) }, { - default: W(() => [U("span", Kv, J(Z(R)("ctx.createCollection", "Create collection")), 1), t[0] ||= U("i", { class: "pi pi-plus mjr-menu-item-check mjr-menu-item-check--visible" }, null, -1)]), + default: W(() => [U("span", $v, J(Z(R)("ctx.createCollection", "Create collection")), 1), t[0] ||= U("i", { class: "pi pi-plus mjr-menu-item-check mjr-menu-item-check--visible" }, null, -1)]), _: 1 }, 8, ["disabled", "onClick"]), - T.value ? (q(), ar(n, { + T.value ? (q(), ir(n, { key: 0, type: "button", class: "mjr-menu-item", @@ -19789,11 +19819,11 @@ var Gv = { class: "mjr-menu mjr-collections-menu" }, Kv = { class: "mjr-menu-ite disabled: _.value !== "", onClick: Z(ne) }, { - default: W(() => [U("span", qv, J(Z(R)("ctx.exitCollection", "Exit collection")), 1), U("span", Jv, [C.value ? (q(), X("span", Yv, J(C.value), 1)) : G("", !0), t[1] ||= U("i", { class: "pi pi-times mjr-menu-item-check mjr-menu-item-check--visible" }, null, -1)])]), + default: W(() => [U("span", ey, J(Z(R)("ctx.exitCollection", "Exit collection")), 1), U("span", ty, [C.value ? (q(), X("span", ny, J(C.value), 1)) : G("", !0), t[1] ||= U("i", { class: "pi pi-times mjr-menu-item-check mjr-menu-item-check--visible" }, null, -1)])]), _: 1 }, 8, ["disabled", "onClick"])) : G("", !0), t[9] ||= U("div", { class: "mjr-menu-divider" }, null, -1), - o.value ? (q(), X("div", Xv, J(Z(R)("label.loading", "Loading...")), 1)) : s.value ? (q(), X("div", Zv, J(s.value), 1)) : a.value.length ? (q(), ar(r, { + o.value ? (q(), X("div", ry, J(Z(R)("label.loading", "Loading...")), 1)) : s.value ? (q(), X("div", iy, J(s.value), 1)) : a.value.length ? (q(), ir(r, { key: 4, items: a.value, "item-size": 48, @@ -19801,7 +19831,7 @@ var Gv = { class: "mjr-menu mjr-collections-menu" }, Kv = { class: "mjr-menu-ite "num-tolerated-items": 4, class: "mjr-collections-virtual-list" }, { - item: W(({ item: e }) => [U("div", $v, [Y(n, { + item: W(({ item: e }) => [U("div", oy, [Y(n, { type: "button", class: Dr(["mjr-menu-item", { "is-active": x.value === String(e.id || "") }]), severity: "secondary", @@ -19809,7 +19839,7 @@ var Gv = { class: "mjr-menu mjr-collections-menu" }, Kv = { class: "mjr-menu-ite disabled: _.value !== "", onClick: (t) => Z(re)(e) }, { - default: W(() => [U("span", ey, J(e.name || e.id), 1), U("span", ty, [Number(e.count || 0) ? (q(), X("span", ny, J(Number(e.count || 0)), 1)) : G("", !0), t[2] ||= U("i", { class: "pi pi-check mjr-menu-item-check" }, null, -1)])]), + default: W(() => [U("span", sy, J(e.name || e.id), 1), U("span", cy, [Number(e.count || 0) ? (q(), X("span", ly, J(Number(e.count || 0)), 1)) : G("", !0), t[2] ||= U("i", { class: "pi pi-check mjr-menu-item-check" }, null, -1)])]), _: 2 }, 1032, [ "class", @@ -19822,7 +19852,7 @@ var Gv = { class: "mjr-menu mjr-collections-menu" }, Kv = { class: "mjr-menu-ite text: "", disabled: _.value !== "", title: Z(R)("tooltip.deleteCollection", "Delete collection"), - onClick: hr((t) => Z(ie)(e), ["stop", "prevent"]) + onClick: mr((t) => Z(ie)(e), ["stop", "prevent"]) }, { default: W(() => [...t[3] ||= [U("i", { class: "pi pi-trash" }, null, -1)]]), _: 1 @@ -19832,13 +19862,13 @@ var Gv = { class: "mjr-menu mjr-collections-menu" }, Kv = { class: "mjr-menu-ite "onClick" ])])]), _: 1 - }, 8, ["items", "scroll-height"])) : (q(), X("div", Qv, J(Z(R)("msg.noCollections", "No collections yet")), 1)), - !c.value && O.value ? (q(), X(H, { key: 5 }, [t[4] ||= U("div", { class: "mjr-menu-divider" }, null, -1), U("div", ry, J(l.value ? "AI Smart Collections are disabled (enable vector search env var)." : "AI Smart Collections are disabled in settings."), 1)], 64)) : G("", !0), + }, 8, ["items", "scroll-height"])) : (q(), X("div", ay, J(Z(R)("msg.noCollections", "No collections yet")), 1)), + !c.value && O.value ? (q(), X(H, { key: 5 }, [t[4] ||= U("div", { class: "mjr-menu-divider" }, null, -1), U("div", uy, J(l.value ? "AI Smart Collections are disabled (enable vector search env var)." : "AI Smart Collections are disabled in settings."), 1)], 64)) : G("", !0), !c.value && k.value ? (q(), X(H, { key: 6 }, [ t[7] ||= U("div", { class: "mjr-menu-divider" }, null, -1), - U("div", iy, J(Z(R)("label.smartSuggestions", "Smart Suggestions")), 1), - U("div", ay, J(Z(R)("label.smartCollectionsHint", "Create collections from AI-detected themes")), 1), - (q(!0), X(H, null, gr(Z(Rv), (e) => (q(), ar(n, { + U("div", dy, J(Z(R)("label.smartSuggestions", "Smart Suggestions")), 1), + U("div", fy, J(Z(R)("label.smartCollectionsHint", "Create collections from AI-detected themes")), 1), + (q(!0), X(H, null, hr(Z(Gv), (e) => (q(), ir(n, { key: e.key, type: "button", class: "mjr-menu-item mjr-menu-item--smart", @@ -19847,12 +19877,12 @@ var Gv = { class: "mjr-menu mjr-collections-menu" }, Kv = { class: "mjr-menu-ite disabled: _.value !== "", onClick: (t) => oe(e) }, { - default: W(() => [U("span", oy, [U("i", { class: Dr(e.iconClass) }, null, 2), U("span", null, J(e.label), 1)]), t[5] ||= U("i", { class: "pi pi-plus mjr-menu-item-check mjr-menu-item-check--visible" }, null, -1)]), + default: W(() => [U("span", py, [U("i", { class: Dr(e.iconClass) }, null, 2), U("span", null, J(e.label), 1)]), t[5] ||= U("i", { class: "pi pi-plus mjr-menu-item-check mjr-menu-item-check--visible" }, null, -1)]), _: 2 }, 1032, ["disabled", "onClick"]))), 128)), t[8] ||= U("div", { class: "mjr-menu-divider" }, null, -1), - U("div", sy, J(Z(R)("label.discoverGroups", "Discover Groups")), 1), - U("div", cy, J(Z(R)("label.discoverGroupsHint", "AI clusters assets by visual similarity")), 1), + U("div", my, J(Z(R)("label.discoverGroups", "Discover Groups")), 1), + U("div", hy, J(Z(R)("label.discoverGroupsHint", "AI clusters assets by visual similarity")), 1), Y(n, { type: "button", class: "mjr-menu-item mjr-menu-item--cluster", @@ -19861,25 +19891,25 @@ var Gv = { class: "mjr-menu mjr-collections-menu" }, Kv = { class: "mjr-menu-ite disabled: m.value || _.value !== "", onClick: se }, { - default: W(() => [U("span", ly, [t[6] ||= U("i", { class: "pi pi-search" }, null, -1), U("span", null, J(m.value ? Z(R)("label.analyzing", "Analyzing...") : Z(R)("label.analyzeLibrary", "Analyze library")), 1)])]), + default: W(() => [U("span", gy, [t[6] ||= U("i", { class: "pi pi-search" }, null, -1), U("span", null, J(m.value ? Z(R)("label.analyzing", "Analyzing...") : Z(R)("label.analyzeLibrary", "Analyze library")), 1)])]), _: 1 }, 8, ["disabled"]), - g.value ? (q(), X("div", uy, J(g.value), 1)) : G("", !0), - (q(!0), X(H, null, gr(h.value, (e) => (q(), X("div", { + g.value ? (q(), X("div", _y, J(g.value), 1)) : G("", !0), + (q(!0), X(H, null, hr(h.value, (e) => (q(), X("div", { key: e.cluster_id, class: "mjr-cluster-row" }, [ - U("div", dy, [(q(!0), X(H, null, gr(Array.isArray(e.sample_assets) ? e.sample_assets.slice(0, 3) : [], (t, n) => (q(), X("img", { + U("div", vy, [(q(!0), X(H, null, hr(Array.isArray(e.sample_assets) ? e.sample_assets.slice(0, 3) : [], (t, n) => (q(), X("img", { key: `${e.cluster_id}-${n}`, class: "mjr-cluster-thumb", src: N(t), alt: String(t?.filename || e._label || ""), loading: "lazy" - }, null, 8, fy))), 128))]), - U("div", py, [U("div", { + }, null, 8, yy))), 128))]), + U("div", by, [U("div", { class: "mjr-cluster-name", title: e._label - }, J(e._label), 9, my), U("div", hy, J(Number(e.size || 0)) + " " + J(Z(R)("label.assets", "assets")), 1)]), + }, J(e._label), 9, xy), U("div", Sy, J(Number(e.size || 0)) + " " + J(Z(R)("label.assets", "assets")), 1)]), Y(n, { type: "button", class: "mjr-cluster-create-btn", @@ -19888,7 +19918,7 @@ var Gv = { class: "mjr-menu mjr-collections-menu" }, Kv = { class: "mjr-menu-ite title: Z(R)("ctx.createCollection", "Create collection"), onClick: (t) => L(e) }, { - default: W(() => [rr(J(_.value === `cluster:${String(e.cluster_id ?? "")}` ? Z(R)("label.loading", "Loading...") : Z(R)("label.create", "Create")), 1)]), + default: W(() => [nr(J(_.value === `cluster:${String(e.cluster_id ?? "")}` ? Z(R)("label.loading", "Loading...") : Z(R)("label.create", "Create")), 1)]), _: 2 }, 1032, [ "disabled", @@ -19900,16 +19930,16 @@ var Gv = { class: "mjr-menu mjr-collections-menu" }, Kv = { class: "mjr-menu-ite ])], 512); }; } -}), vy = { class: "mjr-popover mjr-pinned-folders-popover mjr-popover--hidden" }, yy = { +}), Ty = { class: "mjr-popover mjr-pinned-folders-popover mjr-popover--hidden" }, Ey = { key: 0, class: "mjr-muted mjr-pinned-folders-empty" -}, by = { +}, Dy = { key: 1, class: "mjr-muted mjr-pinned-folders-empty" -}, xy = { class: "mjr-pinned-folder-label" }, Sy = { +}, Oy = { class: "mjr-pinned-folder-label" }, ky = { key: 0, class: "mjr-menu-item-hint mjr-pinned-folder-path" -}, Cy = /* @__PURE__ */ fr({ +}, Ay = /* @__PURE__ */ dr({ __name: "PinnedFoldersPopover", setup(e, { expose: t }) { let n = Q(null), r = Q([]), i = Q(!1), a = Q("No pinned folders"), o = Q("Loading..."), s = Q("Unpin folder"), c = Q(null), l = Q(null); @@ -19940,13 +19970,13 @@ var Gv = { class: "mjr-menu mjr-collections-menu" }, Kv = { class: "mjr-menu-ite setPinnedFolders: d, setPinnedFoldersLoading: f }), (e, t) => { - let c = or("MButton"); - return q(), X("div", vy, [U("div", { + let c = ar("MButton"); + return q(), X("div", Ty, [U("div", { ref_key: "menuRef", ref: n, class: "mjr-menu mjr-pinned-folders-menu", role: "menu" - }, [i.value ? (q(), X("div", yy, J(o.value), 1)) : r.value.length ? (q(!0), X(H, { key: 2 }, gr(r.value, (e) => (q(), X("div", { + }, [i.value ? (q(), X("div", Ey, J(o.value), 1)) : r.value.length ? (q(!0), X(H, { key: 2 }, hr(r.value, (e) => (q(), X("div", { key: e.id, class: "mjr-pinned-folder-row" }, [Y(c, { @@ -19956,7 +19986,7 @@ var Gv = { class: "mjr-menu mjr-collections-menu" }, Kv = { class: "mjr-menu-ite severity: "secondary", onClick: (t) => p(e) }, { - default: W(() => [U("span", xy, J(e.label), 1), e.path ? (q(), X("span", Sy, J(e.path), 1)) : G("", !0)]), + default: W(() => [U("span", Oy, J(e.label), 1), e.path ? (q(), X("span", ky, J(e.path), 1)) : G("", !0)]), _: 2 }, 1032, ["onClick"]), Y(c, { type: "button", @@ -19976,13 +20006,13 @@ var Gv = { class: "mjr-menu mjr-collections-menu" }, Kv = { class: "mjr-menu-ite "title", "aria-label", "onClick" - ])]))), 128)) : (q(), X("div", by, J(a.value), 1))], 512)]); + ])]))), 128)) : (q(), X("div", Dy, J(a.value), 1))], 512)]); }; } -}), wy = { +}), jy = { class: "mjr-popover mjr-custom-popover", style: { display: "none" } -}, Ty = { class: "mjr-popover-row" }, Ey = { class: "mjr-popover-label" }, Dy = { class: "mjr-popover-row mjr-popover-row--actions" }, Oy = /* @__PURE__ */ fr({ +}, My = { class: "mjr-popover-row" }, Ny = { class: "mjr-popover-label" }, Py = { class: "mjr-popover-row mjr-popover-row--actions" }, Fy = /* @__PURE__ */ dr({ __name: "CustomRootsPopover", setup(e, { expose: t }) { let n = Q([{ @@ -20065,8 +20095,8 @@ var Gv = { class: "mjr-menu mjr-collections-menu" }, Kv = { class: "mjr-menu-ite return s(o.value); } }), (e, t) => { - let s = or("MSelect"), c = or("MButton"); - return q(), X("div", wy, [U("div", Ty, [U("div", Ey, J(Z(R)("label.folder")), 1), Y(s, { + let s = ar("MSelect"), c = ar("MButton"); + return q(), X("div", jy, [U("div", My, [U("div", Ny, J(Z(R)("label.folder")), 1), Y(s, { class: "mjr-select", "model-value": r.value, options: n.value, @@ -20078,14 +20108,14 @@ var Gv = { class: "mjr-menu mjr-collections-menu" }, Kv = { class: "mjr-menu-ite "model-value", "options", "disabled" - ])]), U("div", Dy, [Y(c, { + ])]), U("div", Py, [Y(c, { ref_key: "customAddBtnRef", ref: a, type: "button", class: "mjr-btn", severity: "secondary" }, { - default: W(() => [rr(J(Z(R)("btn.add")), 1)]), + default: W(() => [nr(J(Z(R)("btn.add")), 1)]), _: 1 }, 512), Y(c, { ref_key: "customRemoveBtnRef", @@ -20095,15 +20125,15 @@ var Gv = { class: "mjr-menu mjr-collections-menu" }, Kv = { class: "mjr-menu-ite severity: "secondary", disabled: "" }, { - default: W(() => [rr(J(Z(R)("btn.remove")), 1)]), + default: W(() => [nr(J(Z(R)("btn.remove")), 1)]), _: 1 }, 512)])]); }; } -}), ky = ["aria-label"], Ay = { class: "mjr-messages-head" }, jy = { class: "mjr-messages-actions" }, My = ["title"], Ny = { class: "mjr-messages-star-label" }, Py = { +}), Iy = ["aria-label"], Ly = { class: "mjr-messages-head" }, Ry = { class: "mjr-messages-actions" }, zy = ["title"], By = { class: "mjr-messages-star-label" }, Vy = { class: "mjr-messages-tabs", role: "tablist" -}, Fy = { class: "mjr-messages-panels" }, Iy = { class: "mjr-messages-empty" }, Ly = "https://github.com/MajoorWaldi/ComfyUI-Majoor-AssetsManager", Ry = /* @__PURE__ */ fr({ +}, Hy = { class: "mjr-messages-panels" }, Uy = { class: "mjr-messages-empty" }, Wy = "https://github.com/MajoorWaldi/ComfyUI-Majoor-AssetsManager", Gy = /* @__PURE__ */ dr({ __name: "MessagePopover", setup(e, { expose: t }) { let n = Q(null), r = Q(null), i = Q(null), a = Q(null), o = Q(null), s = Q(null), c = Q(null), l = Q(null), u = Q(null), d = Q(null), f = Q(null), p = (e) => e?.$el || e || null; @@ -20142,7 +20172,7 @@ var Gv = { class: "mjr-menu mjr-collections-menu" }, Kv = { class: "mjr-menu-ite return f.value; } }), (e, t) => { - let p = or("MButton"), m = or("MDialog"); + let p = ar("MButton"), m = ar("MDialog"); return q(), X("div", { class: "mjr-popover mjr-messages-popover", id: "mjr-messages-popover", @@ -20168,12 +20198,12 @@ var Gv = { class: "mjr-menu mjr-collections-menu" }, Kv = { class: "mjr-menu-ite } }, { default: W(() => [ - U("div", Ay, [U("div", { + U("div", Ly, [U("div", { ref_key: "titleRef", ref: n, class: "mjr-messages-title" - }, J(Z(R)("label.messages", "Messages")), 513), U("div", jy, [U("a", { - href: Ly, + }, J(Z(R)("label.messages", "Messages")), 513), U("div", Ry, [U("a", { + href: Wy, target: "_blank", rel: "noopener noreferrer", class: "mjr-btn mjr-messages-star-link", @@ -20181,7 +20211,7 @@ var Gv = { class: "mjr-menu mjr-collections-menu" }, Kv = { class: "mjr-menu-ite }, [t[0] ||= U("span", { class: "mjr-messages-star-icon", "aria-hidden": "true" - }, "★", -1), U("span", Ny, J(Z(R)("btn.giveStar", "Give a star")), 1)], 8, My), Y(p, { + }, "★", -1), U("span", By, J(Z(R)("btn.giveStar", "Give a star")), 1)], 8, zy), Y(p, { ref_key: "markReadBtnRef", ref: r, type: "button", @@ -20189,10 +20219,10 @@ var Gv = { class: "mjr-menu mjr-collections-menu" }, Kv = { class: "mjr-menu-ite severity: "secondary", title: Z(R)("tooltip.markMessagesRead", "Mark all messages as read") }, { - default: W(() => [rr(J(Z(R)("btn.markAllRead", "Mark all read")), 1)]), + default: W(() => [nr(J(Z(R)("btn.markAllRead", "Mark all read")), 1)]), _: 1 }, 8, ["title"])])]), - U("div", Py, [ + U("div", Vy, [ Y(p, { ref_key: "messageTabBtnRef", ref: i, @@ -20257,11 +20287,11 @@ var Gv = { class: "mjr-menu mjr-collections-menu" }, Kv = { class: "mjr-menu-ite "aria-controls": "mjr-shortcuts-panel", id: "mjr-shortcuts-tab" }, { - default: W(() => [rr(J(Z(R)("msg.shortcuts.title", "Shortcut Guide")), 1)]), + default: W(() => [nr(J(Z(R)("msg.shortcuts.title", "Shortcut Guide")), 1)]), _: 1 }, 512) ]), - U("div", Fy, [ + U("div", Hy, [ U("div", { ref_key: "messageListRef", ref: u, @@ -20269,7 +20299,7 @@ var Gv = { class: "mjr-menu mjr-collections-menu" }, Kv = { class: "mjr-menu-ite id: "mjr-messages-panel", role: "tabpanel", "aria-labelledby": "mjr-messages-tab" - }, [U("div", Iy, J(Z(R)("msg.noMessages", "No messages for now.")), 1)], 512), + }, [U("div", Uy, J(Z(R)("msg.noMessages", "No messages for now.")), 1)], 512), U("div", { ref_key: "historyPanelRef", ref: d, @@ -20291,13 +20321,13 @@ var Gv = { class: "mjr-menu mjr-collections-menu" }, Kv = { class: "mjr-menu-ite ]) ]), _: 1 - })], 8, ky); + })], 8, Iy); }; } -}), zy = { class: "mjr-am-header-row" }, By = { class: "mjr-am-header-left" }, Vy = { class: "mjr-am-header-title" }, Hy = ["data-mjr-version-channel", "title"], Uy = { class: "mjr-tabs" }, Wy = { class: "mjr-am-header-tools" }, Gy = { +}), Ky = { class: "mjr-am-header-row" }, qy = { class: "mjr-am-header-left" }, Jy = { class: "mjr-am-header-title" }, Yy = ["data-mjr-version-channel", "title"], Xy = { class: "mjr-tabs" }, Zy = { class: "mjr-am-header-tools" }, Qy = { class: "mjr-popover-anchor", style: { display: "none" } -}, Ky = { class: "mjr-popover-anchor" }, qy = { class: "mjr-popover-anchor" }, Jy = { class: "mjr-popover-anchor" }, Yy = { class: "mjr-popover-anchor" }, Xy = { class: "mjr-popover-anchor" }, Zy = "mjr-am-version-badge-label", Qy = "V", $y = /* @__PURE__ */ fr({ +}, $y = { class: "mjr-popover-anchor" }, eb = { class: "mjr-popover-anchor" }, tb = { class: "mjr-popover-anchor" }, nb = { class: "mjr-popover-anchor" }, rb = { class: "mjr-popover-anchor" }, ib = "mjr-am-version-badge-label", ab = "V", ob = /* @__PURE__ */ dr({ __name: "HeaderSection", setup(n, { expose: r }) { let i = null; @@ -20335,7 +20365,7 @@ var Gv = { class: "mjr-menu mjr-collections-menu" }, Kv = { class: "mjr-menu-ite rating_desc: "pi pi-star-fill", size_desc: "pi pi-sort-numeric-down-alt", size_asc: "pi pi-sort-numeric-up-alt" - }, l = dh(), u = s() === "nightly", d = Q(null), f = Q(null), p = Q(null), m = Q(null), h = Q(null), g = Q(null), _ = Q(null), y = Q(null), b = Q(null), x = Q(null), S = Q(null), C = Q(null), w = Q(null), T = Q(null), E = Q(null), D = Q(null), O = Q(null), k = Q(null), A = Q(null), j = Q(null), M = Q(null), N = Q(null), P = Q(null), ee = Q(null), te = Q(null), F = Q(null), I = (e) => e?.$el || e || null, ne = Q(u ? "nightly" : "v?"), ie = Q(u ? "nightly" : "stable"), ae = Q(!1), oe = Q(!1), se = K(() => c[l.sort] ?? "pi pi-sort-amount-down"), ce = K(() => String(l.viewScope || l.scope || "output").toLowerCase()), le = K(() => ce.value === "similar" || Array.isArray(l.similarResults) && l.similarResults.length > 0 || !!l.similarTitle), ue = K(() => { + }, l = vh(), u = s() === "nightly", d = Q(null), f = Q(null), p = Q(null), m = Q(null), h = Q(null), g = Q(null), _ = Q(null), y = Q(null), b = Q(null), x = Q(null), S = Q(null), C = Q(null), w = Q(null), T = Q(null), E = Q(null), D = Q(null), O = Q(null), k = Q(null), A = Q(null), j = Q(null), M = Q(null), N = Q(null), P = Q(null), ee = Q(null), te = Q(null), F = Q(null), I = (e) => e?.$el || e || null, ne = Q(u ? "nightly" : "v?"), ie = Q(u ? "nightly" : "stable"), ae = Q(!1), oe = Q(!1), se = K(() => c[l.sort] ?? "pi pi-sort-amount-down"), ce = K(() => String(l.viewScope || l.scope || "output").toLowerCase()), le = K(() => ce.value === "similar" || Array.isArray(l.similarResults) && l.similarResults.length > 0 || !!l.similarTitle), ue = K(() => { let e = String(l.similarSourceAssetId || ""); return e.startsWith("stack:") || e.startsWith("duplicates:") || e.startsWith("group:") || e.startsWith("node:") ? "group" : "similar"; }), de = K(() => ue.value === "group" ? R("tab.group", "Group") : R("tab.similar", "Similar")), fe = K(() => ue.value === "group" ? R("tooltip.tab.group", "Browse current grouped assets") : R("tooltip.tab.similar", "Browse current similar findings")), pe = { @@ -20377,7 +20407,7 @@ var Gv = { class: "mjr-menu mjr-collections-menu" }, Kv = { class: "mjr-menu-ite e(R("toast.workflowSerializeFailed", "Could not read the current ComfyUI workflow."), "error"); return; } - let r = await S_({ + let r = await k_({ workflow: n, name: String(n?.name || n?.title || "workflow").trim() }), i = String(r?.name || "").trim(); @@ -20410,7 +20440,7 @@ var Gv = { class: "mjr-menu mjr-collections-menu" }, Kv = { class: "mjr-menu-ite console.debug?.(e); } if (!t) { - let e = await Tt(R("dialog.enterWorkflowRootPath", "Workflow root folder"), "", R("tab.workflow", "Workflow")); + let e = await Ut(R("dialog.enterWorkflowRootPath", "Workflow root folder"), "", R("tab.workflow", "Workflow")); t = String(e || "").trim(); } if (!t) return; @@ -20418,8 +20448,8 @@ var Gv = { class: "mjr-menu mjr-collections-menu" }, Kv = { class: "mjr-menu-ite if (!n?.ok) e(n?.error || R("toast.failedSetWorkflowRoots", "Failed to set workflow roots"), "error"); else { try { - let e = Hn(); - e.paths = e.paths || {}, e.paths.workflowRoots = String(n?.data?.workflow_roots_text || t).trim(), In(e), window.dispatchEvent(new CustomEvent("mjr-settings-changed", { detail: { + let e = Vn(); + e.paths = e.paths || {}, e.paths.workflowRoots = String(n?.data?.workflow_roots_text || t).trim(), Fn(e), window.dispatchEvent(new CustomEvent("mjr-settings-changed", { detail: { key: "paths.workflowRoots", value: t } })), window.dispatchEvent(new CustomEvent("mjr:reload-grid", { detail: { reason: "workflow-root-pick" } })); @@ -20508,7 +20538,7 @@ var Gv = { class: "mjr-menu mjr-collections-menu" }, Kv = { class: "mjr-menu-ite } function Ee() { try { - Rt(I(y.value), he.value, Qy); + Lt(I(y.value), he.value, ab); } catch (e) { console.debug?.(e); } @@ -20528,7 +20558,7 @@ var Gv = { class: "mjr-menu mjr-collections-menu" }, Kv = { class: "mjr-menu-ite window.dispatchEvent(new CustomEvent(V.MFV_TOGGLE)); } function Ae() { - Xn(); + Yn(); } function je() { try { @@ -20537,10 +20567,10 @@ var Gv = { class: "mjr-menu mjr-collections-menu" }, Kv = { class: "mjr-menu-ite console.debug?.(e); } } - return lr(oe, () => { + return cr(oe, () => { Ee(); }), Mr(async () => { - await ur(), De(), Ee(), we(u), Te(u); + await lr(), De(), Ee(), we(u), Te(u); try { typeof window < "u" && window.addEventListener(V.MFV_VISIBILITY_CHANGED, Oe); } catch (e) { @@ -20551,7 +20581,7 @@ var Gv = { class: "mjr-menu mjr-collections-menu" }, Kv = { class: "mjr-menu-ite } catch (e) { console.debug?.(e); } - }), ir(() => { + }), rr(() => { je(); }), r({ isVueHeader: !0, @@ -20735,17 +20765,17 @@ var Gv = { class: "mjr-menu mjr-collections-menu" }, Kv = { class: "mjr-menu-ite }, _headerDispose: je }), (e, t) => { - let n = or("MButton"); + let n = ar("MButton"); return q(), X(H, null, [U("div", { ref_key: "headerRef", ref: d, class: "mjr-am-header" - }, [U("div", zy, [U("div", By, [ + }, [U("div", Ky, [U("div", qy, [ t[2] ||= U("i", { class: "mjr-am-header-icon pi pi-folder", "aria-hidden": "true" }, null, -1), - U("div", Vy, J(Z(R)("manager.title")), 1), + U("div", Jy, J(Z(R)("manager.title")), 1), U("a", { href: "https://ko-fi.com/majoorwaldi", target: "_blank", @@ -20753,15 +20783,15 @@ var Gv = { class: "mjr-menu mjr-collections-menu" }, Kv = { class: "mjr-menu-ite class: "mjr-am-version-badge", "data-mjr-version-channel": ie.value, title: Z(R)("tooltip.supportKofi"), - style: Sr(me.value), + style: xr(me.value), onMouseenter: t[0] ||= (e) => ae.value = !0, onMouseleave: t[1] ||= (e) => ae.value = !1 - }, [U("span", { class: Dr(Zy) }, J(ne.value), 1)], 44, Hy) + }, [U("span", { class: Dr(ib) }, J(ne.value), 1)], 44, Yy) ]), U("div", { ref_key: "headerActionsRef", ref: f, class: "mjr-am-header-actions" - }, [U("div", Uy, [ + }, [U("div", Xy, [ Y(n, { ref_key: "tabAllRef", ref: M, @@ -20772,7 +20802,7 @@ var Gv = { class: "mjr-menu mjr-collections-menu" }, Kv = { class: "mjr-menu-ite "data-scope": "all", title: Z(R)("tooltip.tab.all") }, { - default: W(() => [rr(J(Z(R)("tab.all")), 1)]), + default: W(() => [nr(J(Z(R)("tab.all")), 1)]), _: 1 }, 8, ["class", "title"]), Y(n, { @@ -20785,7 +20815,7 @@ var Gv = { class: "mjr-menu mjr-collections-menu" }, Kv = { class: "mjr-menu-ite "data-scope": "input", title: Z(R)("tooltip.tab.input") }, { - default: W(() => [rr(J(Z(R)("tab.input")), 1)]), + default: W(() => [nr(J(Z(R)("tab.input")), 1)]), _: 1 }, 8, ["class", "title"]), Y(n, { @@ -20798,7 +20828,7 @@ var Gv = { class: "mjr-menu mjr-collections-menu" }, Kv = { class: "mjr-menu-ite "data-scope": "output", title: Z(R)("tooltip.tab.output") }, { - default: W(() => [rr(J(Z(R)("tab.output")), 1)]), + default: W(() => [nr(J(Z(R)("tab.output")), 1)]), _: 1 }, 8, ["class", "title"]), Y(n, { @@ -20811,7 +20841,7 @@ var Gv = { class: "mjr-menu mjr-collections-menu" }, Kv = { class: "mjr-menu-ite "data-scope": "custom", title: Z(R)("tooltip.tab.custom") }, { - default: W(() => [rr(J(Z(R)("tab.custom")), 1)]), + default: W(() => [nr(J(Z(R)("tab.custom")), 1)]), _: 1 }, 8, ["class", "title"]), Y(n, { @@ -20824,7 +20854,7 @@ var Gv = { class: "mjr-menu mjr-collections-menu" }, Kv = { class: "mjr-menu-ite "data-scope": "workflow", title: Z(R)("tooltip.tab.workflow", "Browse saved workflows") }, { - default: W(() => [rr(J(Z(R)("tab.workflow", "Workflow")), 1)]), + default: W(() => [nr(J(Z(R)("tab.workflow", "Workflow")), 1)]), _: 1 }, 8, ["class", "title"]), Y(n, { @@ -20835,18 +20865,18 @@ var Gv = { class: "mjr-menu mjr-collections-menu" }, Kv = { class: "mjr-menu-ite severity: "secondary", text: "", "data-scope": "similar", - style: Sr({ display: le.value ? "" : "none" }), + style: xr({ display: le.value ? "" : "none" }), title: fe.value }, { - default: W(() => [rr(J(de.value), 1)]), + default: W(() => [nr(J(de.value), 1)]), _: 1 }, 8, [ "class", "style", "title" ]) - ]), U("div", Wy, [ - ce.value === "workflow" ? (q(), ar(n, { + ]), U("div", Zy, [ + ce.value === "workflow" ? (q(), ir(n, { key: 0, ref_key: "saveWorkflowBtnRef", ref: S, @@ -20865,7 +20895,7 @@ var Gv = { class: "mjr-menu mjr-collections-menu" }, Kv = { class: "mjr-menu-ite }, null, -1)]]), _: 1 }, 8, ["title", "aria-label"])) : G("", !0), - ce.value === "workflow" ? (q(), ar(n, { + ce.value === "workflow" ? (q(), ir(n, { key: 1, ref_key: "pickWorkflowRootBtnRef", ref: C, @@ -20884,7 +20914,7 @@ var Gv = { class: "mjr-menu mjr-collections-menu" }, Kv = { class: "mjr-menu-ite }, null, -1)]]), _: 1 }, 8, ["title", "aria-label"])) : G("", !0), - ce.value === "workflow" ? (q(), ar(n, { + ce.value === "workflow" ? (q(), ir(n, { key: 2, type: "button", class: "mjr-icon-btn mjr-import-workflow-btn", @@ -20910,7 +20940,7 @@ var Gv = { class: "mjr-menu mjr-collections-menu" }, Kv = { class: "mjr-menu-ite style: { display: "none" }, onChange: Se }, null, 544), - U("div", Gy, [Y(n, { + U("div", Qy, [Y(n, { ref_key: "customMenuBtnRef", ref: p, type: "button", @@ -20926,7 +20956,7 @@ var Gv = { class: "mjr-menu mjr-collections-menu" }, Kv = { class: "mjr-menu-ite "aria-hidden": "true" }, null, -1)]]), _: 1 - }, 8, ["title", "aria-label"]), Y(Oy, { + }, 8, ["title", "aria-label"]), Y(Fy, { ref_key: "customPopoverRef", ref: A }, null, 512)]), @@ -20952,7 +20982,7 @@ var Gv = { class: "mjr-menu mjr-collections-menu" }, Kv = { class: "mjr-menu-ite "title", "aria-label" ]), - U("div", Ky, [Y(n, { + U("div", $y, [Y(n, { ref_key: "messageBtnRef", ref: b, type: "button", @@ -20972,7 +21002,7 @@ var Gv = { class: "mjr-menu mjr-collections-menu" }, Kv = { class: "mjr-menu-ite "aria-hidden": "true" }, null, -1)]]), _: 1 - }, 8, ["title", "aria-label"]), Y(Ry, { + }, 8, ["title", "aria-label"]), Y(Gy, { ref_key: "messagePopoverRef", ref: j }, null, 512)]), @@ -20994,11 +21024,11 @@ var Gv = { class: "mjr-menu mjr-collections-menu" }, Kv = { class: "mjr-menu-ite }, null, -1)]]), _: 1 }, 8, ["title", "aria-label"]) - ])], 512)])], 512), Y(R_, { + ])], 512)])], 512), Y(G_, { ref_key: "searchBarRef", ref: T }, { - "filter-anchor": W(() => [U("div", qy, [Y(n, { + "filter-anchor": W(() => [U("div", eb, [Y(n, { ref_key: "filterBtnRef", ref: m, type: "button", @@ -21014,11 +21044,11 @@ var Gv = { class: "mjr-menu mjr-collections-menu" }, Kv = { class: "mjr-menu-ite "aria-hidden": "true" }, null, -1)]]), _: 1 - }, 8, ["title", "aria-label"]), Y(Iv, { + }, 8, ["title", "aria-label"]), Y(Uv, { ref_key: "filterPopoverRef", ref: D }, null, 512)])]), - "sort-anchor": W(() => [U("div", Jy, [Y(n, { + "sort-anchor": W(() => [U("div", tb, [Y(n, { ref_key: "sortBtnRef", ref: h, type: "button", @@ -21034,11 +21064,11 @@ var Gv = { class: "mjr-menu mjr-collections-menu" }, Kv = { class: "mjr-menu-ite "aria-hidden": "true" }, null, 2)]), _: 1 - }, 8, ["title", "aria-label"]), Y(V_, { + }, 8, ["title", "aria-label"]), Y(J_, { ref_key: "sortPopoverRef", ref: E }, null, 512)])]), - "collections-anchor": W(() => [U("div", Yy, [Y(n, { + "collections-anchor": W(() => [U("div", nb, [Y(n, { ref_key: "collectionsBtnRef", ref: g, type: "button", @@ -21054,11 +21084,11 @@ var Gv = { class: "mjr-menu mjr-collections-menu" }, Kv = { class: "mjr-menu-ite "aria-hidden": "true" }, null, -1)]]), _: 1 - }, 8, ["title", "aria-label"]), Y(_y, { + }, 8, ["title", "aria-label"]), Y(wy, { ref_key: "collectionsPopoverRef", ref: O }, null, 512)])]), - "pinned-folders-anchor": W(() => [U("div", Xy, [Y(n, { + "pinned-folders-anchor": W(() => [U("div", rb, [Y(n, { ref_key: "pinnedFoldersBtnRef", ref: _, type: "button", @@ -21074,7 +21104,7 @@ var Gv = { class: "mjr-menu mjr-collections-menu" }, Kv = { class: "mjr-menu-ite "aria-hidden": "true" }, null, -1)]]), _: 1 - }, 8, ["title", "aria-label"]), Y(Cy, { + }, 8, ["title", "aria-label"]), Y(Ay, { ref_key: "pinnedFoldersPopoverRef", ref: k }, null, 512)])]), @@ -21082,20 +21112,20 @@ var Gv = { class: "mjr-menu mjr-collections-menu" }, Kv = { class: "mjr-menu-ite }, 512)], 64); }; } -}), eb = (e) => { +}), sb = (e) => { try { return String(e ?? ""); } catch { return ""; } -}, tb = (e) => { +}, cb = (e) => { let t = String(e || ""); return R(t === "name_asc" ? "sort.nameAZ" : t === "name_desc" ? "sort.nameZA" : t === "mtime_asc" ? "sort.oldest" : "sort.newest"); -}, nb = (e) => { +}, lb = (e) => { let t = String(e || "").toLowerCase(); return t === "similar" ? R("scope.similar", "Similar") : t === "custom" ? R("scope.customBrowser") : t === "workflow" ? R("scope.workflow", "Workflow") : R(t === "all" ? "tab.all" : t === "input" || t === "inputs" ? "scope.input" : "scope.output"); }; -function rb({ label: e, value: t, onClear: n } = {}) { +function ub({ label: e, value: t, onClear: n } = {}) { let r = document.createElement("div"); r.className = "mjr-context-pill"; let i = document.createElement("span"); @@ -21116,69 +21146,69 @@ function rb({ label: e, value: t, onClear: n } = {}) { } return r; } -function ib() { +function db() { let e = document.createElement("div"); return e.className = "mjr-am-context-pills", { wrap: e, update: ({ state: t, rawQuery: n = "", actions: r = null } = {}) => { - let i = r && typeof r == "object" ? r : {}, a = eb(n || "").trim(), o = a.length > 0 && a !== "*", s = !!(eb(t?.kindFilter || "").trim() || t?.workflowOnly || (Number(t?.minRating || 0) || 0) > 0 || (Number(t?.minSizeMB || 0) || 0) > 0 || (Number(t?.maxSizeMB || 0) || 0) > 0 || (Number(t?.minWidth || 0) || 0) > 0 || (Number(t?.minHeight || 0) || 0) > 0 || (Number(t?.maxWidth || 0) || 0) > 0 || (Number(t?.maxHeight || 0) || 0) > 0 || eb(t?.workflowType || "").trim() || eb(t?.workflowId || "").trim() || eb(t?.workflowModelFilter || "").trim() || eb(t?.workflowRunsOnFilter || "").trim() || eb(t?.dateRangeFilter || "").trim() || eb(t?.dateExactFilter || "").trim()), c = eb(t?.sort || "mtime_desc").trim() !== "mtime_desc", l = eb(t?.collectionId || "").trim().length > 0, u = String(t?.viewScope || t?.scope || "output").toLowerCase(), d = u === "similar", f = u === "custom", p = u !== "output", m = eb(t?.similarSourceAssetId || "").trim(); + let i = r && typeof r == "object" ? r : {}, a = sb(n || "").trim(), o = a.length > 0 && a !== "*", s = !!(sb(t?.kindFilter || "").trim() || t?.workflowOnly || (Number(t?.minRating || 0) || 0) > 0 || (Number(t?.minSizeMB || 0) || 0) > 0 || (Number(t?.maxSizeMB || 0) || 0) > 0 || (Number(t?.minWidth || 0) || 0) > 0 || (Number(t?.minHeight || 0) || 0) > 0 || (Number(t?.maxWidth || 0) || 0) > 0 || (Number(t?.maxHeight || 0) || 0) > 0 || sb(t?.workflowType || "").trim() || sb(t?.workflowId || "").trim() || sb(t?.workflowModelFilter || "").trim() || sb(t?.workflowRunsOnFilter || "").trim() || sb(t?.dateRangeFilter || "").trim() || sb(t?.dateExactFilter || "").trim()), c = sb(t?.sort || "mtime_desc").trim() !== "mtime_desc", l = sb(t?.collectionId || "").trim().length > 0, u = String(t?.viewScope || t?.scope || "output").toLowerCase(), d = u === "similar", f = u === "custom", p = u !== "output", m = sb(t?.similarSourceAssetId || "").trim(); if (o || s || c || l || p || d || e.childElementCount) { try { e.replaceChildren(); } catch (e) { console.debug?.(e); } - if (!f && l && e.appendChild(rb({ + if (!f && l && e.appendChild(ub({ label: R("label.collections"), - value: eb(t?.collectionName || t?.collectionId || "").trim(), + value: sb(t?.collectionName || t?.collectionId || "").trim(), onClear: () => i?.clearCollection?.() - })), d && e.appendChild(rb({ + })), d && e.appendChild(ub({ label: R("search.findSimilar", "Find Similar"), value: m ? R("search.similarReference", "Reference #{id}", { id: m }) : R("scope.similar", "Similar"), onClear: () => i?.clearSimilarScope?.() - })), p && e.appendChild(rb({ + })), p && e.appendChild(ub({ label: R("label.scope"), - value: nb(u || "output"), + value: lb(u || "output"), onClear: () => d ? i?.clearSimilarScope?.() : i?.clearScope?.() - })), o && e.appendChild(rb({ + })), o && e.appendChild(ub({ label: R("label.query"), value: a, onClear: () => i?.clearQuery?.() - })), eb(t?.kindFilter || "").trim() && e.appendChild(rb({ + })), sb(t?.kindFilter || "").trim() && e.appendChild(ub({ label: R("label.type"), - value: eb(t?.kindFilter || "").trim(), + value: sb(t?.kindFilter || "").trim(), onClear: () => i?.clearKind?.() - })), Number(t?.minRating || 0) > 0 && e.appendChild(rb({ + })), Number(t?.minRating || 0) > 0 && e.appendChild(ub({ label: R("label.rating"), value: `>= ${Number(t?.minRating || 0)}`, onClear: () => i?.clearMinRating?.() - })), t?.workflowOnly && e.appendChild(rb({ + })), t?.workflowOnly && e.appendChild(ub({ label: R("label.workflow"), value: R("label.only"), onClear: () => i?.clearWorkflowOnly?.() - })), eb(t?.workflowType || "").trim() && e.appendChild(rb({ + })), sb(t?.workflowType || "").trim() && e.appendChild(ub({ label: R("label.workflowType"), - value: eb(t?.workflowType || "").trim(), + value: sb(t?.workflowType || "").trim(), onClear: () => i?.clearWorkflowType?.() - })), eb(t?.workflowId || "").trim()) { - let n = eb(t?.workflowId || "").trim(); - e.appendChild(rb({ + })), sb(t?.workflowId || "").trim()) { + let n = sb(t?.workflowId || "").trim(); + e.appendChild(ub({ label: R("label.sameWorkflow", "Generated with Same Workflow"), value: n.length > 18 ? `${n.slice(0, 8)}...${n.slice(-6)}` : n, onClear: () => i?.clearWorkflowId?.() })); } - if (eb(t?.workflowModelFilter || "").trim() && e.appendChild(rb({ + if (sb(t?.workflowModelFilter || "").trim() && e.appendChild(ub({ label: R("label.workflowModelFamily", "Model family"), - value: eb(t?.workflowModelFilter || "").trim(), + value: sb(t?.workflowModelFilter || "").trim(), onClear: () => i?.clearWorkflowModel?.() - })), eb(t?.workflowRunsOnFilter || "").trim() && e.appendChild(rb({ + })), sb(t?.workflowRunsOnFilter || "").trim() && e.appendChild(ub({ label: R("label.workflowRunsOn", "Runs on"), - value: eb(t?.workflowRunsOnFilter || "").trim(), + value: sb(t?.workflowRunsOnFilter || "").trim(), onClear: () => i?.clearWorkflowRunsOn?.() })), (Number(t?.minSizeMB || 0) || 0) > 0 || (Number(t?.maxSizeMB || 0) || 0) > 0) { let n = Number(t?.minSizeMB || 0) || 0, r = Number(t?.maxSizeMB || 0) || 0, a = n > 0 && r > 0 ? `${n}-${r} MB` : n > 0 ? `>= ${n} MB` : `<= ${r} MB`; - e.appendChild(rb({ + e.appendChild(ub({ label: R("sidebar.size"), value: a, onClear: () => i?.clearSize?.() @@ -21186,23 +21216,23 @@ function ib() { } if ((Number(t?.minWidth || 0) || 0) > 0 || (Number(t?.minHeight || 0) || 0) > 0 || (Number(t?.maxWidth || 0) || 0) > 0 || (Number(t?.maxHeight || 0) || 0) > 0) { let n = String(t?.resolutionCompare || "gte") === "lte", r = Number(n ? t?.maxWidth : t?.minWidth || 0) || 0, a = Number(n ? t?.maxHeight : t?.minHeight || 0) || 0; - e.appendChild(rb({ + e.appendChild(ub({ label: R("label.resolution"), value: `${n ? "<=" : ">="} ${r || 0}x${a || 0} px`, onClear: () => i?.clearResolution?.() })); } - eb(t?.dateRangeFilter || "").trim() && e.appendChild(rb({ + sb(t?.dateRangeFilter || "").trim() && e.appendChild(ub({ label: R("sidebar.date"), - value: eb(t?.dateRangeFilter || "").trim(), + value: sb(t?.dateRangeFilter || "").trim(), onClear: () => i?.clearDateRange?.() - })), eb(t?.dateExactFilter || "").trim() && e.appendChild(rb({ + })), sb(t?.dateExactFilter || "").trim() && e.appendChild(ub({ label: R("label.day"), - value: eb(t?.dateExactFilter || "").trim(), + value: sb(t?.dateExactFilter || "").trim(), onClear: () => i?.clearDateExact?.() - })), c && e.appendChild(rb({ + })), c && e.appendChild(ub({ label: R("label.sort"), - value: tb(t?.sort), + value: cb(t?.sort), onClear: () => i?.clearSort?.() })); } @@ -21210,17 +21240,17 @@ function ib() { }; } // ui/vue/components/panel/summaryBarState.ts -var ab = (e, t = "") => R(e, t, void 0), ob = (e) => { +var fb = (e, t = "") => R(e, t, void 0), pb = (e) => { try { return String(e ?? ""); } catch { return ""; } -}, sb = (e) => { +}, mb = (e) => { let t = String(e || "").toLowerCase(); - return t === "similar" ? ab("scope.similar", "Similar") : t === "workflow" ? ab("scope.workflow", "Workflow") : ab(t === "input" || t === "inputs" ? "scope.input" : t === "custom" ? "scope.customBrowser" : t === "all" ? "tab.all" : "scope.output"); + return t === "similar" ? fb("scope.similar", "Similar") : t === "workflow" ? fb("scope.workflow", "Workflow") : fb(t === "input" || t === "inputs" ? "scope.input" : t === "custom" ? "scope.customBrowser" : t === "all" ? "tab.all" : "scope.output"); }; -function cb(e) { +function hb(e) { try { let t = e?._mjrGetRenderedCards; if (typeof t == "function") { @@ -21232,7 +21262,7 @@ function cb(e) { } return []; } -function lb(e) { +function gb(e) { try { let t = String(e?.dataset?.mjrSelectedAssetIds || "").trim(); if (t) { @@ -21249,8 +21279,8 @@ function lb(e) { } return 0; } -function ub({ state: e, gridContainer: t, context: n = null } = {}) { - let r = cb(t), i = (() => { +function _b({ state: e, gridContainer: t, context: n = null } = {}) { + let r = hb(t), i = (() => { try { let e = 0; for (let t of r) String(t?._mjrAsset?.kind || "").toLowerCase() === "folder" && (e += 1); @@ -21271,12 +21301,12 @@ function ub({ state: e, gridContainer: t, context: n = null } = {}) { } catch (e) { console.debug?.(e); } - return lb(t); - })(), s = Number(t?.dataset?.mjrTotal || 0) || Math.max(0, Number(e?.lastGridTotal ?? 0) || 0), c = Number(t?.dataset?.mjrShown || 0) || Math.max(0, Number(e?.lastGridCount ?? 0) || 0) || a, l = String(e?.viewScope || e?.scope || t?.dataset?.mjrScope || "output").toLowerCase(), u = s && s >= c ? `${c}/${s}` : `${c}`, d = [`${c > 0 && i.total > 0 && i.folders === i.total ? ab("summary.folders") : ab("summary.assets")}: ${u}`]; - o > 0 && d.push(`${ab("summary.selected")}: ${o}`), d.push(sb(l)); + return gb(t); + })(), s = Number(t?.dataset?.mjrTotal || 0) || Math.max(0, Number(e?.lastGridTotal ?? 0) || 0), c = Number(t?.dataset?.mjrShown || 0) || Math.max(0, Number(e?.lastGridCount ?? 0) || 0) || a, l = String(e?.viewScope || e?.scope || t?.dataset?.mjrScope || "output").toLowerCase(), u = s && s >= c ? `${c}/${s}` : `${c}`, d = [`${c > 0 && i.total > 0 && i.folders === i.total ? fb("summary.folders") : fb("summary.assets")}: ${u}`]; + o > 0 && d.push(`${fb("summary.selected")}: ${o}`), d.push(mb(l)); try { let e = Number(t?.dataset?.mjrHiddenPngSiblings || 0) || 0; - String(t?.dataset?.mjrHidePngSiblingsEnabled || "") === "1" && e > 0 && d.push(`${ab("summary.hidden")}: ${e}`); + String(t?.dataset?.mjrHidePngSiblingsEnabled || "") === "1" && e > 0 && d.push(`${fb("summary.hidden")}: ${e}`); } catch (e) { console.debug?.(e); } @@ -21286,22 +21316,22 @@ function ub({ state: e, gridContainer: t, context: n = null } = {}) { total: s, activeScope: l, summaryText: d.filter(Boolean).join(" | "), - duplicateText: h ? `${ab("summary.duplicates")}: ${p} | ${ab("summary.similar")}: ${m}` : "", + duplicateText: h ? `${fb("summary.duplicates")}: ${p} | ${fb("summary.similar")}: ${m}` : "", showDuplicates: h, - rawQuery: ob(n?.rawQuery || "").trim() + rawQuery: pb(n?.rawQuery || "").trim() }; } // ui/vue/components/panel/SummaryBarSection.vue?vue&type=script&setup=true&lang.ts -var db = { +var vb = { key: 2, class: "mjr-folder-breadcrumb-separator" -}, fb = { +}, yb = { key: 0, class: "mjr-folder-breadcrumb-separator" -}, pb = { class: "mjr-am-summary-left" }, mb = { class: "mjr-am-summary-text" }, hb = { class: "mjr-am-summary-right" }, gb = ["aria-label"], _b = /* @__PURE__ */ fr({ +}, bb = { class: "mjr-am-summary-left" }, xb = { class: "mjr-am-summary-text" }, Sb = { class: "mjr-am-summary-right" }, Cb = ["aria-label"], wb = /* @__PURE__ */ dr({ __name: "SummaryBarSection", setup(e, { expose: t }) { - let n = dh(), r = Q(null), i = Q(null), a = Q(null), o = Q(""), s = Q(""), c = Q(!1), l = Q(!1), u = Q(null), d = Q(null), f = Q([]), p = ib(), m = K(() => String(n.kindFilter || "").trim().toLowerCase()), h = K(() => { + let n = vh(), r = Q(null), i = Q(null), a = Q(null), o = Q(""), s = Q(""), c = Q(!1), l = Q(!1), u = Q(null), d = Q(null), f = Q([]), p = db(), m = K(() => String(n.kindFilter || "").trim().toLowerCase()), h = K(() => { let e = R("label.type", "Type"); return [ { @@ -21348,7 +21378,7 @@ var db = { t && (n.kindFilter = v(t) ? "" : t, y()); } function x({ state: e, gridContainer: t, context: r = null, actions: i = null } = {}) { - let a = ub({ + let a = _b({ state: e, gridContainer: t, context: r @@ -21398,14 +21428,14 @@ var db = { folderBreadcrumb: i, setFolderBreadcrumb: S }), (e, t) => { - let n = or("MButton"); + let n = ar("MButton"); return q(), X(H, null, [U("div", { ref_key: "folderBreadcrumb", ref: i, class: Dr(["mjr-folder-breadcrumb", { "is-visible": l.value }]), "aria-label": "Folder breadcrumb" }, [ - u.value ? (q(), ar(n, { + u.value ? (q(), ir(n, { key: 0, type: "button", class: "mjr-btn-link mjr-folder-breadcrumb-action", @@ -21414,10 +21444,10 @@ var db = { disabled: u.value.disabled, onClick: t[0] ||= (e) => C(u.value) }, { - default: W(() => [rr(J(u.value.label), 1)]), + default: W(() => [nr(J(u.value.label), 1)]), _: 1 }, 8, ["disabled"])) : G("", !0), - d.value ? (q(), ar(n, { + d.value ? (q(), ir(n, { key: 1, type: "button", class: "mjr-btn-link mjr-folder-breadcrumb-action", @@ -21426,11 +21456,11 @@ var db = { disabled: d.value.disabled, onClick: t[1] ||= (e) => C(d.value) }, { - default: W(() => [rr(J(d.value.label), 1)]), + default: W(() => [nr(J(d.value.label), 1)]), _: 1 }, 8, ["disabled"])) : G("", !0), - u.value || d.value ? (q(), X("span", db, " | ")) : G("", !0), - (q(!0), X(H, null, gr(f.value, (e, t) => (q(), X(H, { key: `${e.target}:${t}` }, [t > 0 ? (q(), X("span", fb, "/")) : G("", !0), Y(n, { + u.value || d.value ? (q(), X("span", vb, " | ")) : G("", !0), + (q(!0), X(H, null, hr(f.value, (e, t) => (q(), X(H, { key: `${e.target}:${t}` }, [t > 0 ? (q(), X("span", yb, "/")) : G("", !0), Y(n, { type: "button", class: Dr(["mjr-btn-link mjr-folder-breadcrumb-segment", { "is-current": e.current }]), severity: "secondary", @@ -21438,7 +21468,7 @@ var db = { disabled: e.current, onClick: (t) => C(e) }, { - default: W(() => [rr(J(e.label), 1)]), + default: W(() => [nr(J(e.label), 1)]), _: 2 }, 1032, [ "class", @@ -21450,12 +21480,12 @@ var db = { ref: r, class: "mjr-am-summary", "aria-live": "polite" - }, [U("div", pb, [U("div", mb, J(o.value), 1)]), U("div", hb, [ + }, [U("div", bb, [U("div", xb, J(o.value), 1)]), U("div", Sb, [ U("div", { class: "mjr-media-shortcuts", "aria-label": Z(R)("label.type", "Type"), role: "group" - }, [(q(!0), X(H, null, gr(h.value, (e) => (q(), ar(n, { + }, [(q(!0), X(H, null, hr(h.value, (e) => (q(), ir(n, { key: e.kind, type: "button", class: Dr(["mjr-icon-btn mjr-media-shortcut-btn", { "mjr-context-active": v(e.kind) }]), @@ -21478,8 +21508,8 @@ var db = { "aria-pressed", "class", "onClick" - ]))), 128))], 8, gb), - c.value ? (q(), ar(n, { + ]))), 128))], 8, Cb), + c.value ? (q(), ir(n, { key: 0, type: "button", class: "mjr-am-dup-alert", @@ -21488,7 +21518,7 @@ var db = { title: s.value, onClick: _ }, { - default: W(() => [rr(J(s.value), 1)]), + default: W(() => [nr(J(s.value), 1)]), _: 1 }, 8, ["title"])) : G("", !0), U("div", { @@ -21500,7 +21530,7 @@ var db = { } }); // ui/vue/composables/useGridContextMenu.ts -function vb(e, t) { +function Tb(e, t) { let n = null; function r(e) { if (e && !e._mjrGridContextMenuBound) try { @@ -21518,12 +21548,12 @@ function vb(e, t) { } catch {} n = null; } - lr(e, (e, t) => { + cr(e, (e, t) => { t && i(), e && r(e); - }, { immediate: !0 }), ir(i); + }, { immediate: !0 }), rr(i); } // ui/vue/composables/useGridKeyboard.ts -function yb(e) { +function Eb(e) { if (!e) return () => {}; let t = e; try { @@ -21562,7 +21592,7 @@ function yb(e) { return console.debug?.("[useGridKeyboard] bind failed", e), () => {}; } } -function bb(e) { +function Db(e) { let t = null, n = () => { try { t?.(); @@ -21571,13 +21601,13 @@ function bb(e) { } t = null; }; - lr(e, (e, r) => { - r && n(), e && (t = yb(e)); - }, { immediate: !0 }), ir(n); + cr(e, (e, r) => { + r && n(), e && (t = Eb(e)); + }, { immediate: !0 }), rr(n); } // ui/vue/components/grid/assetsGridHostState.ts -function xb() {} -function Sb() { +function Ob() {} +function kb() { return new Promise((e) => { try { if (typeof requestAnimationFrame == "function") { @@ -21590,7 +21620,7 @@ function Sb() { e(); }); } -function Cb(e, ...t) { +function Ab(e, ...t) { try { return typeof e == "function" ? e(...t) : void 0; } catch (e) { @@ -21598,21 +21628,21 @@ function Cb(e, ...t) { return; } } -function wb(e = {}) { +function jb(e = {}) { let t = Array.isArray(e.selectedIds) ? e.selectedIds.map(String).filter(Boolean) : []; return { ids: t, activeId: String(e.activeId || t[0] || "").trim() }; } -function Tb(e, t = {}, n = null) { +function Mb(e, t = {}, n = null) { return { count: Number(t.count ?? t.shown ?? e?.dataset?.mjrShown ?? n?.lastGridCount ?? 0) || 0, total: Number(t.total ?? e?.dataset?.mjrTotal ?? n?.lastGridTotal ?? 0) || 0 }; } -function Eb(e, t = fh()) { - if (!e || !t) return xb; +function Nb(e, t = yh()) { + if (!e || !t) return Ob; let n = 0, r = () => { if (!n) try { n = requestAnimationFrame(() => { @@ -21638,8 +21668,8 @@ function Eb(e, t = fh()) { } }; } -function Db(e, { panelStore: t = fh(), onContextChanged: n = null, markUserInteraction: r = null } = {}) { - if (!e) return xb; +function Pb(e, { panelStore: t = yh(), onContextChanged: n = null, markUserInteraction: r = null } = {}) { + if (!e) return Ob; let i = 0, a = () => { if (i) try { cancelAnimationFrame(i); @@ -21648,24 +21678,24 @@ function Db(e, { panelStore: t = fh(), onContextChanged: n = null, markUserInter } try { i = requestAnimationFrame(() => { - i = 0, Cb(n); + i = 0, Ab(n); }); } catch (e) { - console.debug?.(e), i = 0, Cb(n); + console.debug?.(e), i = 0, Ab(n); } }, o = (r) => { let i = r?.detail || {}; if (t) { - let { count: n, total: r } = Tb(e, i, t); + let { count: n, total: r } = Mb(e, i, t); t.lastGridCount = n, t.lastGridTotal = r; } - Cb(n); + Ab(n); }, s = (e) => { - if (Cb(r), t) { - let { ids: n, activeId: r } = wb(e?.detail || {}); + if (Ab(r), t) { + let { ids: n, activeId: r } = jb(e?.detail || {}); t.selectedAssetIds = n, t.activeAssetId = r; } - Cb(n); + Ab(n); }; e.addEventListener("mjr:grid-stats", o), e.addEventListener("mjr:selection-changed", s); try { @@ -21713,14 +21743,14 @@ function Db(e, { panelStore: t = fh(), onContextChanged: n = null, markUserInter } }; } -async function Ob({ initialLoadPromise: e, gridWrapper: t, gridContainer: n, panelStore: r = fh(), onRestoreSidebar: i = null } = {}) { +async function Fb({ initialLoadPromise: e, gridWrapper: t, gridContainer: n, panelStore: r = yh(), onRestoreSidebar: i = null } = {}) { if (!t || !n || !r) return; try { await e; } catch (e) { console.debug?.(e); } - await Sb(); + await kb(); let a = Number(r.scrollTop || 0) || 0; if (a > 0) try { t.scrollTop = a; @@ -21748,13 +21778,13 @@ async function Ob({ initialLoadPromise: e, gridWrapper: t, gridContainer: n, pan e(), setTimeout(e, 160); } } - r.sidebarOpen && s && Cb(i); + r.sidebarOpen && s && Ab(i); } // ui/vue/components/grid/AssetsGrid.vue -var kb = /* @__PURE__ */ fr({ +var Ib = /* @__PURE__ */ dr({ __name: "AssetsGrid", setup(e, { expose: t }) { - let n = Q(null), r = Q(null), i = Q(null), a = dh(), o = K(() => i.value?.gridContainer ?? null), s = null, c = null, l = null, u = null; + let n = Q(null), r = Q(null), i = Q(null), a = vh(), o = K(() => i.value?.gridContainer ?? null), s = null, c = null, l = null, u = null; function d() { try { l?.setVisibility?.(); @@ -21765,7 +21795,7 @@ var kb = /* @__PURE__ */ fr({ function f() { try { let e = o.value; - e && nr(e); + e && tr(e); } catch (e) { console.debug?.(e); } @@ -21848,7 +21878,7 @@ var kb = /* @__PURE__ */ fr({ } }; } - sr("mjr-grid-container-ref", o), vb(o, () => a), bb(o); + or("mjr-grid-container-ref", o), Tb(o, () => a), Db(o); function m() { return o.value || null; } @@ -21860,23 +21890,23 @@ var kb = /* @__PURE__ */ fr({ } catch (e) { console.debug?.(e); } - c = Db(t, { + c = Pb(t, { panelStore: a, ...e }); } } return Mr(() => { - s = Eb(r.value, a), r.value && Number(a.scrollTop || 0) > 0 && (r.value.scrollTop = Number(a.scrollTop || 0)), p(); + s = Nb(r.value, a), r.value && Number(a.scrollTop || 0) > 0 && (r.value.scrollTop = Number(a.scrollTop || 0)), p(); try { window.addEventListener("mjr:keepalive-attached", f), document.addEventListener("visibilitychange", d); } catch (e) { console.debug?.(e); } d(); - }), mr(() => { + }), pr(() => { try { - Qn(m()); + Zn(m()); } catch (e) { console.debug?.(e); } @@ -21909,14 +21939,14 @@ var kb = /* @__PURE__ */ fr({ } catch (e) { console.debug?.(e); } - }), lr(o, (e, t) => { + }), cr(o, (e, t) => { try { - t && t !== e && Qn(t); + t && t !== e && Zn(t); } catch (e) { console.debug?.(e); } try { - e && nr(e); + e && tr(e); } catch (e) { console.debug?.(e); } @@ -21944,7 +21974,7 @@ var kb = /* @__PURE__ */ fr({ }; }, restoreGridUiState(e, t = {}) { - return Ob({ + return Fb({ initialLoadPromise: e, gridWrapper: r.value, gridContainer: m(), @@ -21960,7 +21990,7 @@ var kb = /* @__PURE__ */ fr({ } catch (e) { console.debug?.(e); } - return l = Kg({ + return l = $g({ gridContainer: t, gridWrapper: r.value, ...e @@ -22015,13 +22045,13 @@ var kb = /* @__PURE__ */ fr({ overflow: "auto", position: "relative" } - }, [Y(ed, { + }, [Y(sd, { ref_key: "gridHostRef", ref: i, "scroll-element": r.value }, null, 8, ["scroll-element"])], 512)], 512)); } -}), Ab = { +}), Lb = { class: "mjr-sidebar-header", style: { display: "flex", @@ -22032,15 +22062,15 @@ var kb = /* @__PURE__ */ fr({ "flex-shrink": "0", background: "var(--mjr-surface-2,#2e2e2e)" } -}, jb = ["title"], Mb = /* @__PURE__ */ fr({ +}, Rb = ["title"], zb = /* @__PURE__ */ dr({ __name: "SidebarHeaderSection", props: { asset: {} }, emits: ["close"], setup(e, { emit: t }) { let n = t; return (t, r) => { - let i = or("MButton"); - return q(), X("div", Ab, [U("div", { + let i = ar("MButton"); + return q(), X("div", Lb, [U("div", { class: "mjr-sidebar-filename", title: e.asset.filename, style: { @@ -22053,7 +22083,7 @@ var kb = /* @__PURE__ */ fr({ "min-width": "0", "padding-right": "8px" } - }, J(e.asset.filename), 9, jb), Y(i, { + }, J(e.asset.filename), 9, Rb), Y(i, { type: "button", class: "mjr-sidebar-close", severity: "secondary", @@ -22077,21 +22107,21 @@ var kb = /* @__PURE__ */ fr({ onMouseenter: r[1] ||= (e) => (e.currentTarget.style.background = "rgba(255,255,255,0.1)") && (e.currentTarget.style.borderColor = "rgba(255,255,255,0.2)"), onMouseleave: r[2] ||= (e) => (e.currentTarget.style.background = "none") && (e.currentTarget.style.borderColor = "transparent") }, { - default: W(() => [...r[3] ||= [rr("x", -1)]]), + default: W(() => [...r[3] ||= [nr("x", -1)]]), _: 1 })]); }; } }); // ui/components/sidebar/utils/format.ts -function Nb(e) { +function Bb(e) { if (!e) return "Unknown"; let t = e / 1024; if (t < 1024) return `${t.toFixed(1)} KB`; let n = t / 1024; return n < 1024 ? `${n.toFixed(1)} MB` : `${(n / 1024).toFixed(2)} GB`; } -function Pb(e) { +function Vb(e) { if (!e) return ""; let t = /* @__PURE__ */ new Date(Number(e) * 1e3); if (Number.isNaN(t.getTime())) return ""; @@ -22099,13 +22129,13 @@ function Pb(e) { return `${t.getFullYear()}-${n(t.getMonth() + 1)}-${n(t.getDate())} ${n(t.getHours())}:${n(t.getMinutes())}`; } // ui/vue/components/panel/sidebar/SidebarPreviewSection.vue?vue&type=script&setup=true&lang.ts -var Fb = { class: "mjr-sidebar-preview" }, Ib = ["src"], Lb = ["src"], Rb = ["src"], zb = { +var Hb = { class: "mjr-sidebar-preview" }, Ub = ["src"], Wb = ["src"], Gb = ["src"], Kb = { key: 3, style: { color: "rgba(255, 255, 255, 0.4)", "font-size": "14px" } -}, Bb = { +}, qb = { class: "mjr-sidebar-preview-meta", style: { "margin-top": "10px", @@ -22119,7 +22149,7 @@ var Fb = { class: "mjr-sidebar-preview" }, Ib = ["src"], Lb = ["src"], Rb = ["sr "padding-bottom": "12px", "border-bottom": "1px solid var(--mjr-border, rgba(255, 255, 255, 0.12))" } -}, Vb = /* @__PURE__ */ fr({ +}, Jb = /* @__PURE__ */ dr({ __name: "SidebarPreviewSection", props: { asset: {}, @@ -22135,9 +22165,9 @@ var Fb = { class: "mjr-sidebar-preview" }, Ib = ["src"], Lb = ["src"], Rb = ["sr }), o = K(() => { let e = []; a.value && e.push(a.value), t.asset?.kind && e.push(String(t.asset.kind).toLowerCase()); - let n = Nb(t.asset?.size); + let n = Bb(t.asset?.size); n && e.push(n); - let r = Pb(t.asset?.mtime); + let r = Vb(t.asset?.mtime); return r && e.push(r), e.join(" | "); }); function s() { @@ -22162,7 +22192,7 @@ var Fb = { class: "mjr-sidebar-preview" }, Ib = ["src"], Lb = ["src"], Rb = ["sr if (e && i) { c(i); try { - r = Bt(i, { + r = zt(i, { variant: "preview", hostEl: e }); @@ -22171,17 +22201,17 @@ var Fb = { class: "mjr-sidebar-preview" }, Ib = ["src"], Lb = ["src"], Rb = ["sr } } } - return lr(() => [t.asset, t.showPreviewThumb], () => { + return cr(() => [t.asset, t.showPreviewThumb], () => { s(); - }, { flush: "post" }), lr(i, () => { + }, { flush: "post" }), cr(i, () => { setTimeout(() => { l(); }, 0); }), Mr(() => { l(); - }), mr(() => { + }), pr(() => { s(); - }), (t, r) => (q(), X("div", Fb, [e.showPreviewThumb ? (q(), X("div", { + }), (t, r) => (q(), X("div", Hb, [e.showPreviewThumb ? (q(), X("div", { key: 0, ref_key: "previewContainerRef", ref: n, @@ -22204,7 +22234,7 @@ var Fb = { class: "mjr-sidebar-preview" }, Ib = ["src"], Lb = ["src"], Rb = ["sr "max-height": "100%", "object-fit": "contain" } - }, null, 8, Ib)) : e.asset.kind === "video" ? (q(), X("video", { + }, null, 8, Ub)) : e.asset.kind === "video" ? (q(), X("video", { key: 1, src: i.value, muted: !0, @@ -22217,7 +22247,7 @@ var Fb = { class: "mjr-sidebar-preview" }, Ib = ["src"], Lb = ["src"], Rb = ["sr "max-height": "100%", "object-fit": "contain" } - }, null, 8, Lb)) : e.asset.kind === "audio" ? (q(), X("audio", { + }, null, 8, Wb)) : e.asset.kind === "audio" ? (q(), X("audio", { key: 2, src: i.value, controls: "", @@ -22226,9 +22256,9 @@ var Fb = { class: "mjr-sidebar-preview" }, Ib = ["src"], Lb = ["src"], Rb = ["sr width: "92%", "max-width": "560px" } - }, null, 8, Rb)) : (q(), X("div", zb, J(String(e.asset.kind || "PREVIEW").toUpperCase()), 1))], 512)) : G("", !0), U("div", Bb, J(o.value), 1)])); + }, null, 8, Gb)) : (q(), X("div", Kb, J(String(e.asset.kind || "PREVIEW").toUpperCase()), 1))], 512)) : G("", !0), U("div", qb, J(o.value), 1)])); } -}), Hb = { +}), Yb = { class: "mjr-sidebar-section", style: { background: "rgba(255, 255, 255, 0.03)", @@ -22236,22 +22266,22 @@ var Fb = { class: "mjr-sidebar-preview" }, Ib = ["src"], Lb = ["src"], Rb = ["sr "border-radius": "8px", padding: "10px" } -}, Ub = { style: { +}, Xb = { style: { "font-size": "12px", "font-weight": "700", color: "#26a69a", "margin-bottom": "8px", "text-transform": "uppercase", "letter-spacing": "0.4px" -} }, Wb = { style: { +} }, Zb = { style: { display: "flex", "flex-direction": "column", gap: "6px" -} }, Gb = { style: { +} }, Qb = { style: { "font-size": "12px", opacity: "0.68", "min-width": "92px" -} }, Kb = ["title"], qb = /* @__PURE__ */ fr({ +} }, $b = ["title"], ex = /* @__PURE__ */ dr({ __name: "SidebarFolderSection", props: { asset: {} }, setup(e) { @@ -22294,17 +22324,17 @@ var Fb = { class: "mjr-sidebar-preview" }, Ib = ["src"], Lb = ["src"], Rb = ["sr ]; return u > 0 && f.push({ label: R("sidebar.folder.created", "Created"), - value: `${Bn(u) || "-"} ${Nn(u) || ""}`.trim() + value: `${zn(u) || "-"} ${Mn(u) || ""}`.trim() }), l > 0 && f.push({ label: R("sidebar.folder.modified", "Modified"), - value: `${Bn(l) || "-"} ${Nn(l) || ""}`.trim() + value: `${zn(l) || "-"} ${Mn(l) || ""}`.trim() }), d && f.push({ label: R("sidebar.folder.note", "Note"), value: R("sidebar.folder.scanTruncated", "Scan was truncated for performance"), valueStyle: "color:#FFB74D;font-weight:600;" }), f; }); - return (e, t) => (q(), X("div", Hb, [U("div", Ub, J(Z(R)("sidebar.folder.details", "Folder Details")), 1), U("div", Wb, [(q(!0), X(H, null, gr(r.value, (e) => (q(), X("div", { + return (e, t) => (q(), X("div", Yb, [U("div", Xb, J(Z(R)("sidebar.folder.details", "Folder Details")), 1), U("div", Zb, [(q(!0), X(H, null, hr(r.value, (e) => (q(), X("div", { key: e.label, style: { display: "flex", @@ -22312,18 +22342,18 @@ var Fb = { class: "mjr-sidebar-preview" }, Ib = ["src"], Lb = ["src"], Rb = ["sr "align-items": "flex-start", "justify-content": "space-between" } - }, [U("div", Gb, J(e.label), 1), U("div", { - style: Sr(e.valueStyle || "font-size: 12px; text-align: right; word-break: break-word"), + }, [U("div", Qb, J(e.label), 1), U("div", { + style: xr(e.valueStyle || "font-size: 12px; text-align: right; word-break: break-word"), title: String(e.value || "") - }, J(e.value), 13, Kb)]))), 128))])])); + }, J(e.value), 13, $b)]))), 128))])])); } -}), Jb = [ +}), tx = [ "aria-busy", "aria-disabled", "aria-label", "aria-valuenow", "tabindex" -], Yb = /* @__PURE__ */ fr({ +], nx = /* @__PURE__ */ dr({ __name: "RatingEditor", props: { asset: {}, @@ -22388,7 +22418,7 @@ var Fb = { class: "mjr-sidebar-preview" }, Ib = ["src"], Lb = ["src"], Rb = ["sr if (a("update:modelValue", o), a("rating-change", { assetId: i.asset?.id, rating: o - }), Lt(st, { + }), wt(st, { assetId: i.asset?.id == null ? "" : String(i.asset.id), rating: o }), d === o) { @@ -22443,21 +22473,21 @@ var Fb = { class: "mjr-sidebar-preview" }, Ib = ["src"], Lb = ["src"], Rb = ["sr } t !== null && t !== s.value && C(t); } - return mr(() => { + return pr(() => { try { f?.abort?.(); } catch (e) { console.debug?.(e); } - }), lr(() => i.modelValue, (e) => { + }), cr(() => i.modelValue, (e) => { b(e); - }), lr(() => i.asset?.rating, (e) => { + }), cr(() => i.asset?.rating, (e) => { b(e); }), (e, n) => { - let r = or("MButton"); + let r = ar("MButton"); return q(), X("div", { class: "mjr-rating-editor", - style: Sr({ + style: xr({ display: "inline-flex", gap: "2px", pointerEvents: t.disabled ? "none" : "auto", @@ -22472,14 +22502,14 @@ var Fb = { class: "mjr-sidebar-preview" }, Ib = ["src"], Lb = ["src"], Rb = ["sr "aria-valuenow": s.value, tabindex: t.disabled ? -1 : 0, onKeydown: D - }, [(q(), X(H, null, gr(5, (e) => Y(r, { + }, [(q(), X(H, null, hr(5, (e) => Y(r, { key: e, type: "button", class: "mjr-rating-star", severity: "secondary", text: "", rounded: "", - style: Sr({ + style: xr({ color: m(e), transform: h(e), fontSize: g.value, @@ -22496,7 +22526,7 @@ var Fb = { class: "mjr-sidebar-preview" }, Ib = ["src"], Lb = ["src"], Rb = ["sr onMouseenter: (t) => T(e), onMouseleave: E }, { - default: W(() => [...n[0] ||= [rr(" ★ ", -1)]]), + default: W(() => [...n[0] ||= [nr(" ★ ", -1)]]), _: 1 }, 8, [ "style", @@ -22505,31 +22535,31 @@ var Fb = { class: "mjr-sidebar-preview" }, Ib = ["src"], Lb = ["src"], Rb = ["sr "disabled", "onClick", "onMouseenter" - ])), 64))], 44, Jb); + ])), 64))], 44, tx); }; } -}), Xb = ["aria-label"], Zb = { class: "mjr-context-menu-title" }, Qb = { class: "mjr-context-menu-item-left" }, $b = { +}), rx = ["aria-label"], ix = { class: "mjr-context-menu-title" }, ax = { class: "mjr-context-menu-item-left" }, ox = { key: 0, class: "mjr-context-menu-note" -}, ex = { +}, sx = { key: 1, class: "mjr-context-menu-note is-error" -}, tx = { +}, cx = { key: 2, class: "mjr-context-menu-note" -}, nx = { class: "mjr-context-menu-item-left" }, rx = { +}, lx = { class: "mjr-context-menu-item-left" }, ux = { key: 0, class: "mjr-context-menu-hint" -}, ix = /* @__PURE__ */ fr({ +}, dx = /* @__PURE__ */ dr({ __name: "AddToCollectionMenu", setup(t) { let n = Q(null), r = Q(!1), i = Q([]), a = Q(""), o = 0, s = null, c = K(() => ({ position: "fixed", - left: `${Math.round(Number(Kt.x) || 0)}px`, - top: `${Math.round(Number(Kt.y) || 0)}px`, + left: `${Math.round(Number(Gt.x) || 0)}px`, + top: `${Math.round(Number(Gt.y) || 0)}px`, display: "block", zIndex: "10004" - })), l = K(() => Kt.assets.length || 0), u = K(() => R("ctx.addToCollection", "Add to collection") + (l.value > 1 ? ` (${l.value})` : "")); + })), l = K(() => Gt.assets.length || 0), u = K(() => R("ctx.addToCollection", "Add to collection") + (l.value > 1 ? ` (${l.value})` : "")); function d({ collectionName: e, selectedCount: t, addRes: n }) { let r = Number(n?.data?.added ?? 0) || 0, i = Number(n?.data?.skipped_existing ?? 0) || 0, a = Number(n?.data?.skipped_duplicate ?? 0) || 0, o = String(e || "").trim() || R("label.collection", "collection"), s = R("msg.collectionAdd.added", "Added {added} item(s) to \"{name}\".", { added: r, @@ -22539,9 +22569,9 @@ var Fb = { class: "mjr-sidebar-preview" }, Ib = ["src"], Lb = ["src"], Rb = ["sr } function p() { let e = n.value; - if (!Kt.open || !e) return; - let t = e.getBoundingClientRect(), r = Number(window.innerWidth || 0), i = Number(window.innerHeight || 0), a = Number(Kt.x) || 0, o = Number(Kt.y) || 0; - a + t.width > r && (a = Math.max(8, r - t.width - 10)), o + t.height > i && (o = Math.max(8, i - t.height - 10)), a < 8 && (a = 8), o < 8 && (o = 8), Kt.x = a, Kt.y = o; + if (!Gt.open || !e) return; + let t = e.getBoundingClientRect(), r = Number(window.innerWidth || 0), i = Number(window.innerHeight || 0), a = Number(Gt.x) || 0, o = Number(Gt.y) || 0; + a + t.width > r && (a = Math.max(8, r - t.width - 10)), o + t.height > i && (o = Math.max(8, i - t.height - 10)), a < 8 && (a = 8), o < 8 && (o = 8), Gt.x = a, Gt.y = o; } async function m() { let e = ++o; @@ -22555,7 +22585,7 @@ var Fb = { class: "mjr-sidebar-preview" }, Ib = ["src"], Lb = ["src"], Rb = ["sr i.value = [], a.value = R("toast.failedLoadCollections", "Failed to load collections."); } finally { if (e === o) { - r.value = !1, await ur(), p(); + r.value = !1, await lr(), p(); try { n.value?.querySelector?.(".mjr-context-menu-item:not([aria-disabled=\"true\"])")?.focus?.(); } catch (e) { @@ -22565,7 +22595,7 @@ var Fb = { class: "mjr-sidebar-preview" }, Ib = ["src"], Lb = ["src"], Rb = ["sr } } async function h(t, n) { - let r = Array.isArray(Kt.assets) ? Kt.assets : []; + let r = Array.isArray(Gt.assets) ? Gt.assets : []; Mt(); let i = await f(t, r); i?.ok ? e(d({ @@ -22575,9 +22605,9 @@ var Fb = { class: "mjr-sidebar-preview" }, Ib = ["src"], Lb = ["src"], Rb = ["sr }), "success", 4e3) : e(i?.error || R("toast.failedAddAssetsToCollection", "Failed to add assets to collection."), "error"); } async function g() { - let t = Array.isArray(Kt.assets) ? Kt.assets : []; + let t = Array.isArray(Gt.assets) ? Gt.assets : []; Mt(); - let n = await Tt(R("dialog.createCollection", "Create collection"), R("dialog.collectionPlaceholder", "My collection")); + let n = await Ut(R("dialog.createCollection", "Create collection"), R("dialog.collectionPlaceholder", "My collection")); if (!n) return; let r = await S(n); if (!r?.ok) { @@ -22600,7 +22630,7 @@ var Fb = { class: "mjr-sidebar-preview" }, Ib = ["src"], Lb = ["src"], Rb = ["sr function y() { Mt(); } - return lr(() => Kt.open, async (e) => { + return cr(() => Gt.open, async (e) => { e && (i.value = [], await m()); }), Mr(() => { s = new AbortController(); @@ -22616,7 +22646,7 @@ var Fb = { class: "mjr-sidebar-preview" }, Ib = ["src"], Lb = ["src"], Rb = ["sr passive: !0, signal: s.signal }), window.addEventListener("mjr-close-all-menus", y, { signal: s.signal }); - }), ir(() => { + }), rr(() => { try { s?.abort(); } catch (e) { @@ -22624,17 +22654,17 @@ var Fb = { class: "mjr-sidebar-preview" }, Ib = ["src"], Lb = ["src"], Rb = ["sr } s = null, Mt(); }), (e, t) => { - let o = or("MButton"); - return q(), ar(kr, { to: "body" }, [Z(Kt).open ? (q(), X("div", { + let o = ar("MButton"); + return q(), ir(kr, { to: "body" }, [Z(Gt).open ? (q(), X("div", { key: 0, ref_key: "menuRef", ref: n, class: "mjr-add-to-collection-menu mjr-context-menu", - style: Sr(c.value), + style: xr(c.value), role: "menu", "aria-label": u.value }, [ - U("div", Zb, J(u.value), 1), + U("div", ix, J(u.value), 1), Y(o, { type: "button", class: "mjr-context-menu-item", @@ -22643,12 +22673,12 @@ var Fb = { class: "mjr-sidebar-preview" }, Ib = ["src"], Lb = ["src"], Rb = ["sr role: "menuitem", onClick: g }, { - default: W(() => [U("span", Qb, [t[0] ||= U("i", { class: "pi pi-plus" }, null, -1), U("span", null, J(Z(R)("dialog.createCollection", "Create collection")) + "...", 1)])]), + default: W(() => [U("span", ax, [t[0] ||= U("i", { class: "pi pi-plus" }, null, -1), U("span", null, J(Z(R)("dialog.createCollection", "Create collection")) + "...", 1)])]), _: 1 }), t[2] ||= U("div", { class: "mjr-context-menu-separator" }, null, -1), - r.value ? (q(), X("div", $b, J(Z(R)("msg.loadingCollections", "Loading collections...")), 1)) : a.value ? (q(), X("div", ex, J(a.value), 1)) : i.value.length ? G("", !0) : (q(), X("div", tx, J(Z(R)("msg.noCollections", "No collections yet.")), 1)), - (q(!0), X(H, null, gr(i.value, (e) => (q(), ar(o, { + r.value ? (q(), X("div", ox, J(Z(R)("msg.loadingCollections", "Loading collections...")), 1)) : a.value ? (q(), X("div", sx, J(a.value), 1)) : i.value.length ? G("", !0) : (q(), X("div", cx, J(Z(R)("msg.noCollections", "No collections yet.")), 1)), + (q(!0), X(H, null, hr(i.value, (e) => (q(), ir(o, { key: String(e?.id || ""), type: "button", class: "mjr-context-menu-item", @@ -22657,31 +22687,31 @@ var Fb = { class: "mjr-sidebar-preview" }, Ib = ["src"], Lb = ["src"], Rb = ["sr role: "menuitem", onClick: (t) => h(String(e?.id || ""), String(e?.name || e?.id || "")) }, { - default: W(() => [U("span", nx, [t[1] ||= U("i", { class: "pi pi-bookmark" }, null, -1), U("span", null, J(String(e?.name || e?.id || "")), 1)]), Number(e?.count || 0) > 0 ? (q(), X("span", rx, J(Number(e?.count || 0)), 1)) : G("", !0)]), + default: W(() => [U("span", lx, [t[1] ||= U("i", { class: "pi pi-bookmark" }, null, -1), U("span", null, J(String(e?.name || e?.id || "")), 1)]), Number(e?.count || 0) > 0 ? (q(), X("span", ux, J(Number(e?.count || 0)), 1)) : G("", !0)]), _: 2 }, 1032, ["onClick"]))), 128)) - ], 12, Xb)) : G("", !0)]); + ], 12, rx)) : G("", !0)]); }; } -}), ax = { +}), fx = { key: 0, class: "mjr-context-menu-separator" -}, ox = { class: "mjr-context-menu-item-left" }, sx = { class: "mjr-context-menu-item-right" }, cx = { +}, px = { class: "mjr-context-menu-item-left" }, mx = { class: "mjr-context-menu-item-right" }, hx = { key: 0, class: "mjr-context-menu-hint" -}, lx = { +}, gx = { key: 1, class: "mjr-context-menu-submenu-arrow" -}, ux = { +}, _x = { key: 0, class: "mjr-context-menu-separator" -}, dx = { class: "mjr-context-menu-item-left" }, fx = { +}, vx = { class: "mjr-context-menu-item-left" }, yx = { key: 0, class: "mjr-context-menu-hint" -}, px = /* @__PURE__ */ fr({ +}, bx = /* @__PURE__ */ dr({ __name: "GridContextMenu", setup(e) { - let t = Q(null), n = Q(null), r = Q(null), i = null, a = null, o = K(() => l(gn.main, 10031)), s = K(() => l(gn.submenu, 10032)), c = K(() => l(gn.tags, 10033)); + let t = Q(null), n = Q(null), r = Q(null), i = null, a = null, o = K(() => l(hn.main, 10031)), s = K(() => l(hn.submenu, 10032)), c = K(() => l(hn.tags, 10033)); function l(e, t) { return { position: "fixed", @@ -22696,7 +22726,7 @@ var Fb = { class: "mjr-sidebar-preview" }, Ib = ["src"], Lb = ["src"], Rb = ["sr } function d() { u(), i = setTimeout(() => { - rn(); + nn(); }, 180); } function f(e, t) { @@ -22705,7 +22735,7 @@ var Fb = { class: "mjr-sidebar-preview" }, Ib = ["src"], Lb = ["src"], Rb = ["sr a + n.width > r && (a = Math.max(8, r - n.width - 10)), o + n.height > i && (o = Math.max(8, i - n.height - 10)), a < 8 && (a = 8), o < 8 && (o = 8), e.x = a, e.y = o; } async function p(e, t) { - await ur(), f(e, t?.value || null); + await lr(), f(e, t?.value || null); } function m(e) { try { @@ -22716,14 +22746,14 @@ var Fb = { class: "mjr-sidebar-preview" }, Ib = ["src"], Lb = ["src"], Rb = ["sr } function h(e, t) { if (!Array.isArray(e?.submenu) || !e.submenu.length) { - rn(); + nn(); return; } u(); let n = (t?.currentTarget)?.getBoundingClientRect?.(); - sn({ - x: Math.round((n?.right || gn.main.x || 0) + 6), - y: Math.round((n?.top || gn.main.y || 0) - 4), + on({ + x: Math.round((n?.right || hn.main.x || 0) + 6), + y: Math.round((n?.top || hn.main.y || 0) - 4), items: e.submenu, title: e.label || "" }); @@ -22736,12 +22766,12 @@ var Fb = { class: "mjr-sidebar-preview" }, Ib = ["src"], Lb = ["src"], Rb = ["sr } catch (e) { console.error("[GridContextMenu.vue] Action failed:", e); } finally { - e.closeOnSelect === !1 ? n === "submenu" && rn() : _n(); + e.closeOnSelect === !1 ? n === "submenu" && nn() : gn(); } } } function _(e, t) { - Array.isArray(e?.submenu) && e.submenu.length ? h(e, t) : rn(); + Array.isArray(e?.submenu) && e.submenu.length ? h(e, t) : nn(); } function v(e) { Array.isArray(e?.submenu) && e.submenu.length && d(); @@ -22754,36 +22784,36 @@ var Fb = { class: "mjr-sidebar-preview" }, Ib = ["src"], Lb = ["src"], Rb = ["sr } function x(e) { let i = e?.target; - t.value?.contains?.(i) || n.value?.contains?.(i) || r.value?.contains?.(i) || _n(); + t.value?.contains?.(i) || n.value?.contains?.(i) || r.value?.contains?.(i) || gn(); } function S(e) { - e?.key === "Escape" && _n(); + e?.key === "Escape" && gn(); } function C() { - _n(); + gn(); } function w(e) { let t = e?.detail; - String(t?.source || "") !== "grid" && _n(); + String(t?.source || "") !== "grid" && gn(); } function T(e) { - let t = gn.tags.asset; + let t = hn.tags.asset; t && (t.tags = Array.isArray(e) ? [...e] : []); } function E(e) { let t = Array.isArray(e?.tags) ? e.tags : []; try { - gn.tags.onChanged?.(t); + hn.tags.onChanged?.(t); } catch (e) { console.debug?.(e); } } - return lr(() => gn.main.open, async (e) => { - e && (await p(gn.main, t), m(t)); - }), lr(() => gn.submenu.open, async (e) => { - e && (await p(gn.submenu, n), m(n)); - }), lr(() => gn.tags.open, async (e) => { - e && await p(gn.tags, r); + return cr(() => hn.main.open, async (e) => { + e && (await p(hn.main, t), m(t)); + }), cr(() => hn.submenu.open, async (e) => { + e && (await p(hn.submenu, n), m(n)); + }), cr(() => hn.tags.open, async (e) => { + e && await p(hn.tags, r); }), Mr(() => { a = new AbortController(); let e = { @@ -22798,26 +22828,26 @@ var Fb = { class: "mjr-sidebar-preview" }, Ib = ["src"], Lb = ["src"], Rb = ["sr passive: !0, signal: a.signal }), window.addEventListener("mjr-close-all-menus", w, { signal: a.signal }); - }), ir(() => { + }), rr(() => { u(); try { a?.abort(); } catch (e) { console.debug?.(e); } - a = null, _n(); + a = null, gn(); }), (e, i) => { - let a = or("MButton"); - return q(), ar(kr, { to: "body" }, [ - Z(gn).main.open ? (q(), X("div", { + let a = ar("MButton"); + return q(), ir(kr, { to: "body" }, [ + Z(hn).main.open ? (q(), X("div", { key: 0, ref_key: "mainMenuRef", ref: t, class: "mjr-grid-context-menu mjr-context-menu", - style: Sr(o.value), + style: xr(o.value), role: "menu", "aria-label": "Grid context menu" - }, [(q(!0), X(H, null, gr(Z(gn).main.items, (e) => (q(), X(H, { key: e.id }, [e.type === "separator" ? (q(), X("div", ax)) : (q(), ar(a, { + }, [(q(!0), X(H, null, hr(Z(hn).main.items, (e) => (q(), X(H, { key: e.id }, [e.type === "separator" ? (q(), X("div", fx)) : (q(), ir(a, { key: 1, type: "button", class: Dr(["mjr-context-menu-item", { @@ -22837,10 +22867,10 @@ var Fb = { class: "mjr-sidebar-preview" }, Ib = ["src"], Lb = ["src"], Rb = ["sr onMouseenter: (t) => _(e, t), onMouseleave: (t) => v(e) }, { - default: W(() => [U("span", ox, [e.iconClass ? (q(), X("i", { + default: W(() => [U("span", px, [e.iconClass ? (q(), X("i", { key: 0, class: Dr(e.iconClass) - }, null, 2)) : G("", !0), U("span", null, J(e.label), 1)]), U("span", sx, [e.rightHint ? (q(), X("span", cx, J(e.rightHint), 1)) : G("", !0), Array.isArray(e.submenu) && e.submenu.length ? (q(), X("span", lx, " > ")) : G("", !0)])]), + }, null, 2)) : G("", !0), U("span", null, J(e.label), 1)]), U("span", mx, [e.rightHint ? (q(), X("span", hx, J(e.rightHint), 1)) : G("", !0), Array.isArray(e.submenu) && e.submenu.length ? (q(), X("span", gx, " > ")) : G("", !0)])]), _: 2 }, 1032, [ "class", @@ -22850,17 +22880,17 @@ var Fb = { class: "mjr-sidebar-preview" }, Ib = ["src"], Lb = ["src"], Rb = ["sr "onMouseenter", "onMouseleave" ]))], 64))), 128))], 4)) : G("", !0), - Z(gn).submenu.open ? (q(), X("div", { + Z(hn).submenu.open ? (q(), X("div", { key: 1, ref_key: "submenuRef", ref: n, class: "mjr-grid-rating-submenu mjr-context-menu", - style: Sr(s.value), + style: xr(s.value), role: "menu", "aria-label": "Grid context submenu", onMouseenter: y, onMouseleave: b - }, [(q(!0), X(H, null, gr(Z(gn).submenu.items, (e) => (q(), X(H, { key: e.id }, [e.type === "separator" ? (q(), X("div", ux)) : (q(), ar(a, { + }, [(q(!0), X(H, null, hr(Z(hn).submenu.items, (e) => (q(), X(H, { key: e.id }, [e.type === "separator" ? (q(), X("div", _x)) : (q(), ir(a, { key: 1, type: "button", class: Dr(["mjr-context-menu-item", { @@ -22877,10 +22907,10 @@ var Fb = { class: "mjr-sidebar-preview" }, Ib = ["src"], Lb = ["src"], Rb = ["sr tabindex: e.disabled ? -1 : 0, onClick: (t) => g(e, t, "submenu") }, { - default: W(() => [U("span", dx, [e.iconClass ? (q(), X("i", { + default: W(() => [U("span", vx, [e.iconClass ? (q(), X("i", { key: 0, class: Dr(e.iconClass) - }, null, 2)) : G("", !0), U("span", null, J(e.label), 1)]), e.rightHint ? (q(), X("span", fx, J(e.rightHint), 1)) : G("", !0)]), + }, null, 2)) : G("", !0), U("span", null, J(e.label), 1)]), e.rightHint ? (q(), X("span", yx, J(e.rightHint), 1)) : G("", !0)]), _: 2 }, 1032, [ "class", @@ -22888,32 +22918,32 @@ var Fb = { class: "mjr-sidebar-preview" }, Ib = ["src"], Lb = ["src"], Rb = ["sr "tabindex", "onClick" ]))], 64))), 128))], 36)) : G("", !0), - Z(gn).tags.open && Z(gn).tags.asset ? (q(), X("div", { + Z(hn).tags.open && Z(hn).tags.asset ? (q(), X("div", { key: 2, ref_key: "tagsPopoverRef", ref: r, class: "mjr-grid-popover", - style: Sr(c.value) + style: xr(c.value) }, [Y(Fr, { - asset: Z(gn).tags.asset, - "model-value": Z(gn).tags.asset?.tags || [], + asset: Z(hn).tags.asset, + "model-value": Z(hn).tags.asset?.tags || [], "onUpdate:modelValue": T, onTagsChange: E }, null, 8, ["asset", "model-value"])], 4)) : G("", !0) ]); }; } -}), mx = { class: "mjr-workflow-picker-dialog mjr-workflow-info-dialog" }, hx = { class: "mjr-workflow-picker-header" }, gx = { class: "mjr-workflow-picker-title" }, _x = { class: "mjr-workflow-picker-subtitle" }, vx = { class: "mjr-workflow-info-form" }, yx = { class: "is-wide" }, bx = { class: "mjr-workflow-picker-footer" }, xx = /* @__PURE__ */ fr({ +}), xx = { class: "mjr-workflow-picker-dialog mjr-workflow-info-dialog" }, Sx = { class: "mjr-workflow-picker-header" }, Cx = { class: "mjr-workflow-picker-title" }, wx = { class: "mjr-workflow-picker-subtitle" }, Tx = { class: "mjr-workflow-info-form" }, Ex = { class: "is-wide" }, Dx = { class: "mjr-workflow-picker-footer" }, Ox = /* @__PURE__ */ dr({ __name: "WorkflowInfoDialog", setup(t) { - let n = wr({ + let n = Cr({ task: "", model_family: "", provider: "", runs_on: "", notes: "" }), r = K(() => Bi.workflow || null), i = K(() => String(r.value?.display_name || r.value?.filename || "Workflow")); - lr(() => Bi.open, (e) => { + cr(() => Bi.open, (e) => { if (!e) return; let t = r.value || {}; n.task = String(t.user_task || t.task || ""), n.model_family = String(t.user_model_family || t.model_family || ""), n.provider = String(t.user_provider || t.provider || ""), n.runs_on = String(t.user_runs_on || t.runs_on || ""), n.notes = String(t.notes || ""); @@ -22933,45 +22963,45 @@ var Fb = { class: "mjr-sidebar-preview" }, Ib = ["src"], Lb = ["src"], Rb = ["sr }, { timeoutMs: 2e4 }); i?.ok ? (e(R("toast.workflowUpdated", "Workflow updated"), "success", 1800), window?.dispatchEvent?.(new CustomEvent("mjr:reload-grid", { detail: { reason: "workflow-info" } })), a()) : e(i?.error || R("toast.workflowSaveFailed", "Failed to save workflow."), "error"); } - return (e, t) => (q(), ar(kr, { to: "body" }, [Z(Bi).open ? (q(), X("div", { + return (e, t) => (q(), ir(kr, { to: "body" }, [Z(Bi).open ? (q(), X("div", { key: 0, class: "mjr-workflow-picker-backdrop", - onClick: hr(a, ["self"]) - }, [U("section", mx, [ - U("header", hx, [U("div", null, [U("div", gx, J(Z(R)("ctx.editWorkflowInfo", "Edit infos")), 1), U("div", _x, J(i.value), 1)]), U("button", { + onClick: mr(a, ["self"]) + }, [U("section", xx, [ + U("header", Sx, [U("div", null, [U("div", Cx, J(Z(R)("ctx.editWorkflowInfo", "Edit infos")), 1), U("div", wx, J(i.value), 1)]), U("button", { type: "button", class: "mjr-workflow-picker-close", onClick: a }, [...t[5] ||= [U("i", { class: "pi pi-times" }, null, -1)]])]), - U("div", vx, [ - U("label", null, [t[6] ||= U("span", null, "Task", -1), vr(U("input", { + U("div", Tx, [ + U("label", null, [t[6] ||= U("span", null, "Task", -1), _r(U("input", { "onUpdate:modelValue": t[0] ||= (e) => n.task = e, type: "text", placeholder: "I2V, I2I, T2V, Image Edit..." }, null, 512), [[jr, n.task]])]), - U("label", null, [t[7] ||= U("span", null, "Model family", -1), vr(U("input", { + U("label", null, [t[7] ||= U("span", null, "Model family", -1), _r(U("input", { "onUpdate:modelValue": t[1] ||= (e) => n.model_family = e, type: "text", placeholder: "Flux, Qwen, Wan..." }, null, 512), [[jr, n.model_family]])]), - U("label", null, [t[8] ||= U("span", null, "Provider", -1), vr(U("input", { + U("label", null, [t[8] ||= U("span", null, "Provider", -1), _r(U("input", { "onUpdate:modelValue": t[2] ||= (e) => n.provider = e, type: "text", placeholder: "Google, ByteDance, local..." }, null, 512), [[jr, n.provider]])]), - U("label", null, [t[10] ||= U("span", null, "Runs on", -1), vr(U("select", { "onUpdate:modelValue": t[3] ||= (e) => n.runs_on = e }, [...t[9] ||= [ + U("label", null, [t[10] ||= U("span", null, "Runs on", -1), _r(U("select", { "onUpdate:modelValue": t[3] ||= (e) => n.runs_on = e }, [...t[9] ||= [ U("option", { value: "" }, "Auto", -1), U("option", { value: "local" }, "local", -1), U("option", { value: "api" }, "api", -1), U("option", { value: "cloud" }, "cloud", -1) ]], 512), [[Or, n.runs_on]])]), - U("label", yx, [t[11] ||= U("span", null, "Notes", -1), vr(U("textarea", { + U("label", Ex, [t[11] ||= U("span", null, "Notes", -1), _r(U("textarea", { "onUpdate:modelValue": t[4] ||= (e) => n.notes = e, rows: "5", placeholder: "Notes displayed on workflow hover" }, null, 512), [[jr, n.notes]])]) ]), - U("footer", bx, [U("button", { + U("footer", Dx, [U("button", { type: "button", class: "mjr-workflow-picker-secondary", onClick: a @@ -22982,25 +23012,25 @@ var Fb = { class: "mjr-sidebar-preview" }, Ib = ["src"], Lb = ["src"], Rb = ["sr }, J(Z(R)("btn.apply", "Apply")), 1)]) ])])) : G("", !0)])); } -}), Sx = { class: "mjr-workflow-picker-header" }, Cx = { class: "mjr-workflow-picker-title" }, wx = { +}), kx = { class: "mjr-workflow-picker-header" }, Ax = { class: "mjr-workflow-picker-title" }, jx = { key: 0, class: "mjr-workflow-picker-source" -}, Tx = { class: "mjr-workflow-picker-toolbar" }, Ex = { class: "mjr-workflow-picker-search" }, Dx = ["placeholder"], Ox = { value: "" }, kx = ["value"], Ax = { value: "" }, jx = ["value"], Mx = { value: "" }, Nx = ["value"], Px = { class: "mjr-workflow-picker-body" }, Fx = { +}, Mx = { class: "mjr-workflow-picker-toolbar" }, Nx = { class: "mjr-workflow-picker-search" }, Px = ["placeholder"], Fx = { value: "" }, Ix = ["value"], Lx = { value: "" }, Rx = ["value"], zx = { value: "" }, Bx = ["value"], Vx = { class: "mjr-workflow-picker-body" }, Hx = { key: 0, class: "mjr-workflow-picker-empty" -}, Ix = { +}, Ux = { key: 1, class: "mjr-workflow-picker-empty is-error" -}, Lx = { +}, Wx = { key: 2, class: "mjr-workflow-picker-empty" -}, Rx = ["onClick"], zx = { class: "mjr-workflow-picker-thumb" }, Bx = ["src", "alt"], Vx = { +}, Gx = ["onClick"], Kx = { class: "mjr-workflow-picker-thumb" }, qx = ["src", "alt"], Jx = { key: 1, class: "pi pi-sitemap" -}, Hx = { class: "mjr-workflow-picker-card-info" }, Ux = ["disabled"], Wx = { class: "mjr-workflow-picker-card-info" }, Gx = { class: "mjr-workflow-picker-footer" }, Kx = ["disabled"], qx = 120, Jx = /* @__PURE__ */ fr({ +}, Yx = { class: "mjr-workflow-picker-card-info" }, Xx = ["disabled"], Zx = { class: "mjr-workflow-picker-card-info" }, Qx = { class: "mjr-workflow-picker-footer" }, $x = ["disabled"], eS = 120, tS = /* @__PURE__ */ dr({ __name: "WorkflowPickerDialog", setup(e) { - let t = Q(""), n = Q(!1), r = Q(!1), i = Q(""), a = Q([]), s = Q(""), c = Q(0), l = Q(!1), u = 0, d = K(() => Sn.sourceAsset || null), f = K(() => Sn.workflow || null), p = K(() => String(Sn.mode || "") === "asset"), m = K(() => String(d.value?.filename || d.value?.display_name || f.value?.display_name || f.value?.filename || d.value?.filepath || f.value?.filepath || "")), h = K(() => x("task")), g = K(() => x("model_family")), _ = K(() => x("runs_on")), v = Q(""), y = Q(""), b = Q(""); + let t = Q(""), n = Q(!1), r = Q(!1), i = Q(""), a = Q([]), s = Q(""), c = Q(0), l = Q(!1), u = 0, d = K(() => xn.sourceAsset || null), f = K(() => xn.workflow || null), p = K(() => String(xn.mode || "") === "asset"), m = K(() => String(d.value?.filename || d.value?.display_name || f.value?.display_name || f.value?.filename || d.value?.filepath || f.value?.filepath || "")), h = K(() => x("task")), g = K(() => x("model_family")), _ = K(() => x("runs_on")), v = Q(""), y = Q(""), b = Q(""); function x(e) { let t = /* @__PURE__ */ new Set(); for (let n of a.value || []) { @@ -23044,12 +23074,12 @@ var Fb = { class: "mjr-sidebar-preview" }, Ib = ["src"], Lb = ["src"], Rb = ["sr e ? n.value = !0 : r.value = !0, i.value = ""; try { if (p.value) { - a.value = Array.isArray(Sn.items) ? Sn.items.filter((e) => String(e?.filepath || "").trim()) : [], !s.value && a.value[0]?.filepath && (s.value = String(a.value[0].filepath)); + a.value = Array.isArray(xn.items) ? xn.items.filter((e) => String(e?.filepath || "").trim()) : [], !s.value && a.value[0]?.filepath && (s.value = String(a.value[0].filepath)); return; } let n = await o({ q: "*", - limit: qx, + limit: eS, offset: d, sort: "mtime" }, { timeoutMs: 2e4 }); @@ -23059,7 +23089,7 @@ var Fb = { class: "mjr-sidebar-preview" }, Ib = ["src"], Lb = ["src"], Rb = ["sr return; } let r = (Array.isArray(n?.data?.assets) ? n.data.assets : Array.isArray(n?.data) ? n.data : []).filter((e) => String(e?.filepath || "").trim()); - a.value = e ? r : [...a.value, ...r], c.value = d + r.length, l.value = r.length >= qx, !s.value && a.value[0]?.filepath && (s.value = String(a.value[0].filepath)); + a.value = e ? r : [...a.value, ...r], c.value = d + r.length, l.value = r.length >= eS, !s.value && a.value[0]?.filepath && (s.value = String(a.value[0].filepath)); } catch (e) { t === u && (i.value = String(e?.message || e || "Failed to load workflows"), a.value = []); } finally { @@ -23073,15 +23103,15 @@ var Fb = { class: "mjr-sidebar-preview" }, Ib = ["src"], Lb = ["src"], Rb = ["sr if (!(n.value || r.value || !l.value)) return D({ reset: !1 }); } function A() { - C.value && Pn(C.value); + C.value && Nn(C.value); } function j() { - Pn(null); + Nn(null); } function M(e) { e.key === "Escape" && (e.preventDefault(), j()); } - return lr(() => Sn.open, (e) => { + return cr(() => xn.open, (e) => { if (e) { s.value = "", c.value = 0, l.value = !1, t.value = "", v.value = "", y.value = "", b.value = "", O(); try { @@ -23090,80 +23120,80 @@ var Fb = { class: "mjr-sidebar-preview" }, Ib = ["src"], Lb = ["src"], Rb = ["sr } else try { window.removeEventListener("keydown", M); } catch {} - }), mr(() => { + }), pr(() => { try { window.removeEventListener("keydown", M); } catch {} - }), (e, a) => (q(), ar(kr, { to: "body" }, [Z(Sn).open ? (q(), X("div", { + }), (e, a) => (q(), ir(kr, { to: "body" }, [Z(xn).open ? (q(), X("div", { key: 0, class: "mjr-workflow-picker-backdrop", - onMousedown: hr(j, ["self"]) + onMousedown: mr(j, ["self"]) }, [U("section", { class: Dr(["mjr-workflow-picker-dialog", { "is-asset-mode": p.value }]), role: "dialog", "aria-modal": "true" }, [ - U("header", Sx, [U("div", Cx, [a[4] ||= U("i", { class: "pi pi-sitemap" }, null, -1), U("span", null, J(Z(Sn).title), 1)]), U("button", { + U("header", kx, [U("div", Ax, [a[4] ||= U("i", { class: "pi pi-sitemap" }, null, -1), U("span", null, J(Z(xn).title), 1)]), U("button", { class: "mjr-workflow-picker-icon-btn", type: "button", onClick: j }, [...a[5] ||= [U("i", { class: "pi pi-times" }, null, -1)]])]), - m.value ? (q(), X("div", wx, [U("span", null, J(p.value ? Z(R)("tab.workflow", "Workflow") : Z(R)("dialog.workflowThumbnailSource", "Source")), 1), U("strong", null, J(m.value), 1)])) : G("", !0), - U("div", Tx, [ - U("label", Ex, [a[6] ||= U("i", { class: "pi pi-search" }, null, -1), vr(U("input", { + m.value ? (q(), X("div", jx, [U("span", null, J(p.value ? Z(R)("tab.workflow", "Workflow") : Z(R)("dialog.workflowThumbnailSource", "Source")), 1), U("strong", null, J(m.value), 1)])) : G("", !0), + U("div", Mx, [ + U("label", Nx, [a[6] ||= U("i", { class: "pi pi-search" }, null, -1), _r(U("input", { "onUpdate:modelValue": a[0] ||= (e) => t.value = e, type: "search", placeholder: Z(R)("search.workflows", "Search workflows...") - }, null, 8, Dx), [[jr, t.value]])]), - p.value ? G("", !0) : vr((q(), X("select", { + }, null, 8, Px), [[jr, t.value]])]), + p.value ? G("", !0) : _r((q(), X("select", { key: 0, "onUpdate:modelValue": a[1] ||= (e) => v.value = e - }, [U("option", Ox, J(Z(R)("filter.task", "Task")), 1), (q(!0), X(H, null, gr(h.value, (e) => (q(), X("option", { + }, [U("option", Fx, J(Z(R)("filter.task", "Task")), 1), (q(!0), X(H, null, hr(h.value, (e) => (q(), X("option", { key: e, value: e - }, J(e), 9, kx))), 128))], 512)), [[Or, v.value]]), - p.value ? G("", !0) : vr((q(), X("select", { + }, J(e), 9, Ix))), 128))], 512)), [[Or, v.value]]), + p.value ? G("", !0) : _r((q(), X("select", { key: 1, "onUpdate:modelValue": a[2] ||= (e) => y.value = e - }, [U("option", Ax, J(Z(R)("filter.model", "Model")), 1), (q(!0), X(H, null, gr(g.value, (e) => (q(), X("option", { + }, [U("option", Lx, J(Z(R)("filter.model", "Model")), 1), (q(!0), X(H, null, hr(g.value, (e) => (q(), X("option", { key: e, value: e - }, J(e), 9, jx))), 128))], 512)), [[Or, y.value]]), - p.value ? G("", !0) : vr((q(), X("select", { + }, J(e), 9, Rx))), 128))], 512)), [[Or, y.value]]), + p.value ? G("", !0) : _r((q(), X("select", { key: 2, "onUpdate:modelValue": a[3] ||= (e) => b.value = e - }, [U("option", Mx, J(Z(R)("filter.runsOn", "Runs on")), 1), (q(!0), X(H, null, gr(_.value, (e) => (q(), X("option", { + }, [U("option", zx, J(Z(R)("filter.runsOn", "Runs on")), 1), (q(!0), X(H, null, hr(_.value, (e) => (q(), X("option", { key: e, value: e - }, J(e), 9, Nx))), 128))], 512)), [[Or, b.value]]) + }, J(e), 9, Bx))), 128))], 512)), [[Or, b.value]]) ]), - U("div", Px, [n.value ? (q(), X("div", Fx, J(Z(R)("status.loading", "Loading...")), 1)) : i.value ? (q(), X("div", Ix, J(i.value), 1)) : S.value.length ? (q(), X(H, { key: 3 }, [(q(!0), X(H, null, gr(S.value, (e) => (q(), X("button", { + U("div", Vx, [n.value ? (q(), X("div", Hx, J(Z(R)("status.loading", "Loading...")), 1)) : i.value ? (q(), X("div", Ux, J(i.value), 1)) : S.value.length ? (q(), X(H, { key: 3 }, [(q(!0), X(H, null, hr(S.value, (e) => (q(), X("button", { key: e.filepath, type: "button", class: Dr(["mjr-workflow-picker-card", { "is-selected": s.value === String(e.filepath || "") }]), onClick: (t) => s.value = String(e.filepath || ""), onDblclick: A - }, [U("div", zx, [E(e) ? (q(), X("img", { + }, [U("div", Kx, [E(e) ? (q(), X("img", { key: 0, src: E(e), alt: w(e), loading: "lazy" - }, null, 8, Bx)) : (q(), X("i", Vx))]), U("div", Hx, [ + }, null, 8, qx)) : (q(), X("i", Jx))]), U("div", Yx, [ U("strong", null, J(w(e)), 1), U("span", null, J(T(e)), 1), U("small", null, J(e.filename), 1) - ])], 42, Rx))), 128)), !p.value && l.value ? (q(), X("button", { + ])], 42, Gx))), 128)), !p.value && l.value ? (q(), X("button", { key: 0, type: "button", class: "mjr-workflow-picker-card mjr-workflow-picker-load-more", disabled: r.value, onClick: k - }, [a[7] ||= U("div", { class: "mjr-workflow-picker-thumb" }, [U("i", { class: "pi pi-angle-down" })], -1), U("div", Wx, [ + }, [a[7] ||= U("div", { class: "mjr-workflow-picker-thumb" }, [U("i", { class: "pi pi-angle-down" })], -1), U("div", Zx, [ U("strong", null, J(r.value ? Z(R)("status.loading", "Loading...") : Z(R)("action.loadMore", "Load more")), 1), U("span", null, J(Z(R)("tab.workflow", "Workflow")), 1), U("small", null, J(c.value) + " loaded", 1) - ])], 8, Ux)) : G("", !0)], 64)) : (q(), X("div", Lx, J(Z(R)("toast.noWorkflowsFound", "No workflows found.")), 1))]), - U("footer", Gx, [U("button", { + ])], 8, Xx)) : G("", !0)], 64)) : (q(), X("div", Wx, J(Z(R)("toast.noWorkflowsFound", "No workflows found.")), 1))]), + U("footer", Qx, [U("button", { type: "button", class: "mjr-workflow-picker-btn", onClick: j @@ -23172,31 +23202,31 @@ var Fb = { class: "mjr-sidebar-preview" }, Ib = ["src"], Lb = ["src"], Rb = ["sr class: "mjr-workflow-picker-btn is-primary", disabled: !C.value, onClick: A - }, J(Z(R)("action.apply", "Apply")), 9, Kx)]) + }, J(Z(R)("action.apply", "Apply")), 9, $x)]) ], 2)], 32)) : G("", !0)])); } -}), Yx = { class: "mjr-workflow-picker-dialog mjr-workflow-info-dialog" }, Xx = { class: "mjr-workflow-picker-header" }, Zx = { class: "mjr-workflow-picker-title" }, Qx = { class: "mjr-workflow-picker-subtitle" }, $x = { class: "mjr-workflow-info-form" }, eS = { class: "is-wide" }, tS = { class: "is-wide" }, nS = { class: "mjr-workflow-picker-footer" }, rS = /* @__PURE__ */ fr({ +}), nS = { class: "mjr-workflow-picker-dialog mjr-workflow-info-dialog" }, rS = { class: "mjr-workflow-picker-header" }, iS = { class: "mjr-workflow-picker-title" }, aS = { class: "mjr-workflow-picker-subtitle" }, oS = { class: "mjr-workflow-info-form" }, sS = { class: "is-wide" }, cS = { class: "is-wide" }, lS = { class: "mjr-workflow-picker-footer" }, uS = /* @__PURE__ */ dr({ __name: "WorkflowSaveInfoDialog", setup(e) { - let t = wr({ + let t = Cr({ name: "", task: "", model_family: "", provider: "", runs_on: "", notes: "" - }), n = K(() => x_.initial || {}), r = K(() => R("dialog.saveWorkflowWithInfo", "Save workflow")), i = K(() => R("dialog.workflowInfoAutoFallback", "Leave fields empty to use automatic workflow detection.")); - lr(() => x_.open, (e) => { + }), n = K(() => O_.initial || {}), r = K(() => R("dialog.saveWorkflowWithInfo", "Save workflow")), i = K(() => R("dialog.workflowInfoAutoFallback", "Leave fields empty to use automatic workflow detection.")); + cr(() => O_.open, (e) => { if (!e) return; let r = n.value || {}; t.name = String(r.name || r.workflow?.name || r.workflow?.title || "workflow").trim(), t.task = String(r.task || ""), t.model_family = String(r.model_family || ""), t.provider = String(r.provider || ""), t.runs_on = String(r.runs_on || ""), t.notes = String(r.notes || ""); }); function a() { - C_(null); + A_(null); } function o() { let e = String(t.name || "").trim(); - e && C_({ + e && A_({ name: e, task: String(t.task || "").trim(), model_family: String(t.model_family || "").trim(), @@ -23206,13 +23236,13 @@ var Fb = { class: "mjr-sidebar-preview" }, Ib = ["src"], Lb = ["src"], Rb = ["sr }); } return (e, n) => { - let s = or("MButton"), c = or("MInputText"), l = or("MSelect"), u = or("MTextarea"); - return q(), ar(kr, { to: "body" }, [Z(x_).open ? (q(), X("div", { + let s = ar("MButton"), c = ar("MInputText"), l = ar("MSelect"), u = ar("MTextarea"); + return q(), ir(kr, { to: "body" }, [Z(O_).open ? (q(), X("div", { key: 0, class: "mjr-workflow-picker-backdrop", - onClick: hr(a, ["self"]) - }, [U("section", Yx, [ - U("header", Xx, [U("div", null, [U("div", Zx, J(r.value), 1), U("div", Qx, J(i.value), 1)]), Y(s, { + onClick: mr(a, ["self"]) + }, [U("section", nS, [ + U("header", rS, [U("div", null, [U("div", iS, J(r.value), 1), U("div", aS, J(i.value), 1)]), Y(s, { type: "button", class: "mjr-workflow-picker-close", onClick: a @@ -23220,13 +23250,13 @@ var Fb = { class: "mjr-sidebar-preview" }, Ib = ["src"], Lb = ["src"], Rb = ["sr default: W(() => [...n[6] ||= [U("i", { class: "pi pi-times" }, null, -1)]]), _: 1 })]), - U("div", $x, [ - U("label", eS, [U("span", null, J(Z(R)("dialog.workflowSaveName", "Workflow name")), 1), Y(c, { + U("div", oS, [ + U("label", sS, [U("span", null, J(Z(R)("dialog.workflowSaveName", "Workflow name")), 1), Y(c, { modelValue: t.name, "onUpdate:modelValue": n[0] ||= (e) => t.name = e, type: "text", placeholder: "workflow", - onKeydown: Ar(hr(o, ["prevent"]), ["enter"]) + onKeydown: Ar(mr(o, ["prevent"]), ["enter"]) }, null, 8, ["modelValue", "onKeydown"])]), U("label", null, [n[7] ||= U("span", null, "Task", -1), Y(c, { modelValue: t.task, @@ -23271,19 +23301,19 @@ var Fb = { class: "mjr-sidebar-preview" }, Ib = ["src"], Lb = ["src"], Rb = ["sr "option-value": "value", placeholder: "Auto" }, null, 8, ["modelValue"])]), - U("label", tS, [n[11] ||= U("span", null, "Notes", -1), Y(u, { + U("label", cS, [n[11] ||= U("span", null, "Notes", -1), Y(u, { modelValue: t.notes, "onUpdate:modelValue": n[5] ||= (e) => t.notes = e, rows: "5", placeholder: "Notes displayed on workflow hover" }, null, 8, ["modelValue"])]) ]), - U("footer", nS, [Y(s, { + U("footer", lS, [Y(s, { type: "button", class: "mjr-workflow-picker-secondary", onClick: a }, { - default: W(() => [rr(J(Z(R)("btn.cancel", "Cancel")), 1)]), + default: W(() => [nr(J(Z(R)("btn.cancel", "Cancel")), 1)]), _: 1 }), Y(s, { type: "button", @@ -23291,29 +23321,29 @@ var Fb = { class: "mjr-sidebar-preview" }, Ib = ["src"], Lb = ["src"], Rb = ["sr disabled: !String(t.name || "").trim(), onClick: o }, { - default: W(() => [rr(J(Z(R)("btn.save", "Save")), 1)]), + default: W(() => [nr(J(Z(R)("btn.save", "Save")), 1)]), _: 1 }, 8, ["disabled"])]) ])])) : G("", !0)]); }; } -}), iS = /* @__PURE__ */ fr({ +}), dS = /* @__PURE__ */ dr({ __name: "ContextMenuPortal", setup(e) { - let t = Q(""), n = K(() => vn(t.value)); + let t = Q(""), n = K(() => _n(t.value)); return Mr(() => { - t.value = Zt(); - }), ir(() => { - on(t.value), t.value = ""; + t.value = Xt(); + }), rr(() => { + an(t.value), t.value = ""; }), (e, t) => n.value ? (q(), X(H, { key: 0 }, [ - Y(px), - Y(ix), - Y(Jx), - Y(xx), - Y(rS) + Y(bx), + Y(dx), + Y(tS), + Y(Ox), + Y(uS) ], 64)) : G("", !0); } -}), aS = { +}), fS = { class: "mjr-sidebar-content", style: { flex: "1", @@ -23323,29 +23353,29 @@ var Fb = { class: "mjr-sidebar-preview" }, Ib = ["src"], Lb = ["src"], Rb = ["sr "flex-direction": "column", gap: "16px" } -}, oS = { +}, pS = { class: "mjr-sidebar-rating-tags", style: { display: "flex", "flex-direction": "column", gap: "10px" } -}, sS = { style: { +}, mS = { style: { display: "flex", "align-items": "center", gap: "8px" -} }, cS = { style: { +} }, hS = { style: { "font-size": "0.8em", opacity: "0.6", "min-width": "44px" -} }, lS = { style: { +} }, gS = { style: { display: "flex", "flex-direction": "column", gap: "4px" -} }, uS = { style: { +} }, _S = { style: { "font-size": "0.8em", opacity: "0.6" -} }, dS = /* @__PURE__ */ fr({ +} }, vS = /* @__PURE__ */ dr({ __name: "AssetSidebarContent", props: { asset: {}, @@ -23359,14 +23389,14 @@ var Fb = { class: "mjr-sidebar-preview" }, Ib = ["src"], Lb = ["src"], Rb = ["sr return e === "workflow" || t === "workflow" || n.endsWith(".json"); }), c = K(() => Number(i.asset?.rating) || 0), l = K(() => i.asset?.tags || []), u = K(() => { try { - return !!(Hn()?.sidebar?.showPreviewThumb ?? !0); + return !!(Vn()?.sidebar?.showPreviewThumb ?? !0); } catch { return !0; } }); function d() { if (i.sidebar) try { - eh(i.sidebar); + sh(i.sidebar); } catch (e) { console.debug?.(e); } @@ -23396,30 +23426,30 @@ var Fb = { class: "mjr-sidebar-preview" }, Ib = ["src"], Lb = ["src"], Rb = ["sr } } return (e, n) => { - let r = or("MButton"); + let r = ar("MButton"); return q(), X(H, null, [ - Y(Mb, { + Y(zb, { asset: t.asset, onClose: d }, null, 8, ["asset"]), - U("div", aS, [o.value ? (q(), ar(qb, { + U("div", fS, [o.value ? (q(), ir(ex, { key: 0, asset: t.asset }, null, 8, ["asset"])) : (q(), X(H, { key: 1 }, [s.value ? G("", !0) : (q(), X(H, { key: 0 }, [ - Y(Vb, { + Y(Jb, { asset: t.asset, "show-preview-thumb": u.value }, null, 8, ["asset", "show-preview-thumb"]), - U("div", oS, [U("div", sS, [U("span", cS, J(Z(R)("sidebar.rating", "Rating")), 1), Y(Yb, { + U("div", pS, [U("div", mS, [U("span", hS, J(Z(R)("sidebar.rating", "Rating")), 1), Y(nx, { asset: t.asset, "model-value": c.value, size: 60 - }, null, 8, ["asset", "model-value"])]), U("div", lS, [U("span", uS, J(Z(R)("sidebar.tags", "Tags")), 1), Y(Fr, { + }, null, 8, ["asset", "model-value"])]), U("div", gS, [U("span", _S, J(Z(R)("sidebar.tags", "Tags")), 1), Y(Fr, { asset: t.asset, "model-value": l.value }, null, 8, ["asset", "model-value"])])]), - Y(An, { asset: t.asset }, null, 8, ["asset"]), - p.value ? (q(), ar(r, { + Y(kn, { asset: t.asset }, null, 8, ["asset"]), + p.value ? (q(), ir(r, { key: 0, type: "button", class: "mjr-btn mjr-sidebar-collect-btn", @@ -23438,13 +23468,13 @@ var Fb = { class: "mjr-sidebar-preview" }, Ib = ["src"], Lb = ["src"], Rb = ["sr default: W(() => [U("i", { class: Dr(f.value ? "pi pi-spin pi-spinner" : "pi pi-box") }, null, 2), U("span", null, J(f.value ? Z(R)("sidebar.collectingFiles", "Collecting...") : Z(R)("sidebar.collectFiles", "Collect files")), 1)]), _: 1 }, 8, ["disabled", "title"])) : G("", !0), - Y(Fn, { asset: t.asset }, null, 8, ["asset"]) - ], 64)), Y(Vn, { asset: t.asset }, null, 8, ["asset"])], 64))]), - Y(iS) + Y(Pn, { asset: t.asset }, null, 8, ["asset"]) + ], 64)), Y(Bn, { asset: t.asset }, null, 8, ["asset"])], 64))]), + Y(dS) ], 64); }; } -}), fS = { +}), yS = { key: 1, class: "mjr-sidebar-placeholder", style: { @@ -23457,10 +23487,10 @@ var Fb = { class: "mjr-sidebar-preview" }, Ib = ["src"], Lb = ["src"], Rb = ["sr "font-size": "0.85em", "text-align": "center" } -}, pS = /* @__PURE__ */ fr({ +}, bS = /* @__PURE__ */ dr({ __name: "SidebarSection", setup(e, { expose: t }) { - let n = Q(null), { activeAsset: r, onUpdateCallback: i } = Hm(); + let n = Q(null), { activeAsset: r, onUpdateCallback: i } = Ym(); return Mr(() => { let e = n.value; if (!e) return; @@ -23471,7 +23501,7 @@ var Fb = { class: "mjr-sidebar-preview" }, Ib = ["src"], Lb = ["src"], Rb = ["sr }, a = (n) => { let r = n?.detail || {}, a = r.assetId ?? r.id ?? null, o = Number(r.rating); if (t(a) && Number.isFinite(o)) { - Gm({ rating: o }, i.value); + Qm({ rating: o }, i.value); try { e._currentAsset && (e._currentAsset.rating = o), e._currentFullAsset && (e._currentFullAsset.rating = o); } catch (e) { @@ -23481,7 +23511,7 @@ var Fb = { class: "mjr-sidebar-preview" }, Ib = ["src"], Lb = ["src"], Rb = ["sr }, o = (n) => { let r = n?.detail || {}, a = r.assetId ?? r.id ?? null, o = Array.isArray(r.tags) ? r.tags : null; if (t(a) && o) { - Gm({ tags: o }, i.value); + Qm({ tags: o }, i.value); try { e._currentAsset && (e._currentAsset.tags = o), e._currentFullAsset && (e._currentFullAsset.tags = o); } catch (e) { @@ -23512,7 +23542,7 @@ var Fb = { class: "mjr-sidebar-preview" }, Ib = ["src"], Lb = ["src"], Rb = ["sr console.debug?.(e); } } - }), ir(() => { + }), rr(() => { try { n.value?.dispose?.(); } catch {} @@ -23533,7 +23563,7 @@ var Fb = { class: "mjr-sidebar-preview" }, Ib = ["src"], Lb = ["src"], Rb = ["sr transition: "width 140ms ease,max-width 140ms ease,flex-basis 140ms ease,border-color 140ms ease", contain: "layout paint style" } - }, [Z(r) ? (q(), ar(dS, { + }, [Z(r) ? (q(), ir(vS, { key: 0, asset: Z(r), "on-update": Z(i), @@ -23542,9 +23572,9 @@ var Fb = { class: "mjr-sidebar-preview" }, Ib = ["src"], Lb = ["src"], Rb = ["sr "asset", "on-update", "sidebar" - ])) : (q(), X("div", fS, J(Z(R)("sidebar.placeholderSelectAsset", "Select an asset to view details")), 1))], 512)); + ])) : (q(), X("div", yS, J(Z(R)("sidebar.placeholderSelectAsset", "Select an asset to view details")), 1))], 512)); } -}), mS = /* @__PURE__ */ fr({ +}), xS = /* @__PURE__ */ dr({ __name: "App", setup(e) { let t = Q(null), n = Q(null), r = Q(null), i = Q(null), a = Q(null), o = Q(null), s = null; @@ -23553,7 +23583,7 @@ var Fb = { class: "mjr-sidebar-preview" }, Ib = ["src"], Lb = ["src"], Rb = ["sr let e = {}; n.value && (e.statusSection = n.value.statusSection, e.statusDot = n.value.statusDot, e.statusText = n.value.statusText, e.capabilitiesSection = n.value.capabilitiesSection), r.value && (e.headerSection = r.value), i.value && (e.summaryBar = i.value.summaryBar, e.updateSummaryBar = i.value.updateSummaryBar, e.folderBreadcrumb = i.value.folderBreadcrumb, e.folderBreadcrumbController = i.value), a.value && (e.browseSection = a.value.browseSection, e.gridWrapper = a.value.gridWrapper, e.gridContainer = a.value.gridContainer, e.onGridContainerReady = (...e) => a.value?.onGridContainerReady?.(...e), e.bindGridHostState = (...e) => a.value?.bindGridHostState?.(...e), e.restoreGridUiState = (...e) => a.value?.restoreGridUiState?.(...e), e.initAssetsQueryController = (...e) => a.value?.initAssetsQueryController?.(...e), e.loadAssets = (e, t = "*", n = {}) => a.value?.loadAssets?.(t, n), e.loadAssetsFromList = (e, t = [], n = {}) => a.value?.loadAssetsFromList?.(t, n), e.prepareGridForScopeSwitch = (e) => a.value?.prepareGridForScopeSwitch?.(), e.refreshGrid = (e) => a.value?.refreshGrid?.(), e.captureAnchor = (e) => a.value?.captureAnchor?.(), e.restoreAnchor = (e, t) => a.value?.restoreAnchor?.(t), e.hydrateGridFromSnapshot = (e, t = {}, n = {}) => a.value?.hydrateGridFromSnapshot?.(t, n), e.upsertAsset = (e, t) => a.value?.upsertAsset?.(t), e.removeAssets = (e, t = [], n = {}) => a.value?.removeAssets?.(t, n), e.disposeGrid = (e) => a.value?.disposeGrid?.()), o.value && (e.sidebar = o.value.sidebar); try { - s = await v_(t.value, { + s = await T_(t.value, { useComfyThemeUI: !0, external: e }); @@ -23561,35 +23591,35 @@ var Fb = { class: "mjr-sidebar-preview" }, Ib = ["src"], Lb = ["src"], Rb = ["sr console.warn("[Majoor] App.vue: mountAssetsManagerPanelRuntime failed", e); } try { - dh().validatePersistedCustomRoot?.(); + vh().validatePersistedCustomRoot?.(); } catch {} - }), ir(() => { + }), rr(() => { try { s?.dispose?.(); } catch {} s = null; }), (e, s) => (q(), X(H, null, [ - Y(b_, { + Y(D_, { ref_key: "statusSectionRef", ref: n }, null, 512), - Y($y, { + Y(ob, { ref_key: "headerSectionRef", ref: r }, null, 512), - Y(_b, { + Y(wb, { ref_key: "summaryBarSectionRef", ref: i }, null, 512), - Y(kb, { + Y(Ib, { ref_key: "assetsGridRef", ref: a }, null, 512), - Y(pS, { + Y(bS, { ref_key: "sidebarSectionRef", ref: o }, null, 512), - Y(iS), + Y(dS), U("div", { ref_key: "containerRef", ref: t, @@ -23603,7 +23633,7 @@ var Fb = { class: "mjr-sidebar-preview" }, Ib = ["src"], Lb = ["src"], Rb = ["sr }, null, 512) ], 64)); } -}), hS = /* @__PURE__ */ fr({ +}), SS = /* @__PURE__ */ dr({ __name: "GeneratedFeedApp", setup(e) { let t = Q(null), n = null; @@ -23625,16 +23655,16 @@ var Fb = { class: "mjr-sidebar-preview" }, Ib = ["src"], Lb = ["src"], Rb = ["sr } return Mr(() => { if (t.value) try { - r(t.value), n = Zd(t.value); + r(t.value), n = af(t.value); } catch (e) { console.warn("[Majoor] GeneratedFeedApp.vue: createGeneratedFeedHost failed", e); } - }), ir(() => { + }), rr(() => { try { - Qd(n); + of(n); } catch {} n = null; - }), (e, n) => (q(), X(H, null, [Y(iS), U("div", { + }), (e, n) => (q(), X(H, null, [Y(dS), U("div", { ref_key: "containerRef", ref: t, class: "mjr-vue-feed-root", @@ -23649,38 +23679,38 @@ var Fb = { class: "mjr-sidebar-preview" }, Ib = ["src"], Lb = ["src"], Rb = ["sr } }, null, 512)], 64)); } -}), gS = "data-mjr-topbar-mfv-host", _S = "data-mjr-topbar-mfv-button", vS = "data-mjr-topbar-mfv-slot", yS = "label.floatingViewer", bS = "Viewer", xS = "V", SS = "viewer.mfvTopbarButton", CS = null, wS = null, TS = null, ES = null, DS = null, OS = null, kS = null, AS = null, jS = !1, MS = null, NS = !1, PS = !1; -function FS(e) { +}), CS = "data-mjr-topbar-mfv-host", wS = "data-mjr-topbar-mfv-button", TS = "data-mjr-topbar-mfv-slot", ES = "label.floatingViewer", DS = "Viewer", OS = "V", kS = "viewer.mfvTopbarButton", AS = null, jS = null, MS = null, NS = null, PS = null, FS = null, IS = null, LS = null, RS = !1, zS = null, BS = !1, VS = !1; +function HS(e) { if (!e) { - !DS && typeof MutationObserver < "u" && (DS = new MutationObserver(() => { - IS() && (DS?.disconnect?.(), DS = null, XS()); - }), DS.observe(document.body, { + !PS && typeof MutationObserver < "u" && (PS = new MutationObserver(() => { + US() && (PS?.disconnect?.(), PS = null, rC()); + }), PS.observe(document.body, { childList: !0, subtree: !0 })); return; } try { - DS?.disconnect?.(); + PS?.disconnect?.(); } catch {} - if (DS = null, wS !== e) { + if (PS = null, jS !== e) { try { - CS?.disconnect?.(); + AS?.disconnect?.(); } catch {} - CS = new MutationObserver(() => XS()), CS.observe(e, { childList: !0 }), wS = e; + AS = new MutationObserver(() => rC()), AS.observe(e, { childList: !0 }), jS = e; } let t = e.parentElement; - if (t && ES !== t) { + if (t && NS !== t) { try { - TS?.disconnect?.(); + MS?.disconnect?.(); } catch {} - TS = new MutationObserver(() => XS()), TS.observe(t, { childList: !0 }), ES = t; + MS = new MutationObserver(() => rC()), MS.observe(t, { childList: !0 }), NS = t; } } -function IS() { +function US() { return typeof document > "u" ? null : document.querySelector(".actionbar-container"); } -function LS(e = IS()) { +function WS(e = US()) { if (typeof document > "u") return; let t = document.documentElement?.style; if (!t) return; @@ -23691,165 +23721,165 @@ function LS(e = IS()) { let n = e.getBoundingClientRect(), r = Math.max(60, Math.ceil(n.bottom + 12)); t.setProperty("--mjr-mfv-top-offset", `${r}px`); } -function RS(e) { +function GS(e) { return e && e.querySelector(".queue-button-group") || null; } -function zS(e) { +function KS(e) { if (!e) return null; - let t = e.querySelector(`[${vS}]`); - t || (t = document.createElement("div"), t.setAttribute(vS, "1"), t.className = "flex h-full items-center pointer-events-auto", t.style.position = "relative", t.style.zIndex = "10030", t.style.padding = "0 4px"); - let n = RS(e), r = n?.parentElement || e; + let t = e.querySelector(`[${TS}]`); + t || (t = document.createElement("div"), t.setAttribute(TS, "1"), t.className = "flex h-full items-center pointer-events-auto", t.style.position = "relative", t.style.zIndex = "10030", t.style.padding = "0 4px"); + let n = GS(e), r = n?.parentElement || e; return t.parentElement === r ? n && r && t.previousElementSibling !== n ? r.insertBefore(t, n.nextSibling) : !n && t !== r.lastElementChild && r.appendChild(t) : n && r ? r.insertBefore(t, n.nextSibling) : r.appendChild(t), t; } -function BS(e = "pi pi-eye") { +function qS(e = "pi pi-eye") { let t = document.createElement("i"); return t.className = e, t.setAttribute("aria-hidden", "true"), t; } -function VS(e = "Viewer") { +function JS(e = "Viewer") { let t = document.createElement("span"); return t.className = "mjr-topbar-mfv-label", t.textContent = e, t; } -function HS(e) { +function YS(e) { if (!e) return; - let t = NS ? R("tooltip.closeMFV", "Close Floating Viewer") : R("tooltip.openMFV", "Open Floating Viewer"); - Rt(e, t, xS, { ariaLabel: t }), e.setAttribute("aria-pressed", NS ? "true" : "false"), e.classList.toggle("primary", NS), e.classList.toggle("mjr-topbar-mfv-active", NS), e.replaceChildren(BS(NS ? "pi pi-eye-slash" : "pi pi-eye"), VS(R(yS, bS))); + let t = BS ? R("tooltip.closeMFV", "Close Floating Viewer") : R("tooltip.openMFV", "Open Floating Viewer"); + Lt(e, t, OS, { ariaLabel: t }), e.setAttribute("aria-pressed", BS ? "true" : "false"), e.classList.toggle("primary", BS), e.classList.toggle("mjr-topbar-mfv-active", BS), e.replaceChildren(qS(BS ? "pi pi-eye-slash" : "pi pi-eye"), JS(R(ES, DS))); } -function US() { +function XS() { try { window.dispatchEvent(new Event(V.MFV_TOGGLE)); } catch (e) { console.debug?.("[Majoor] top bar MFV launch failed", e); } - XS(); -} -function WS() { - let e = document.createElement("button"); - return e.type = "button", e.setAttribute(_S, "1"), e.className = "comfyui-button mjr-topbar-mfv-button", e.style.position = "relative", e.style.zIndex = "10030", e.style.width = "auto", e.style.height = "32px", e.style.minWidth = "32px", e.style.padding = "0 10px", e.style.gap = "6px", e.style.display = "inline-flex", e.style.alignItems = "center", e.style.justifyContent = "center", e.style.whiteSpace = "nowrap", e.addEventListener("click", US), HS(e), e; -} -function GS() { - let e = document.createElement("div"); - return e.setAttribute(gS, "1"), e.className = "mjr-topbar-mfv-button-host", e.style.position = "relative", e.appendChild(WS()), e; -} -function KS() { - if (typeof document > "u" || PS) return; - let e = !!document.querySelector(".mjr-mfv.is-visible"); - NS !== e && (NS = e); -} -function qS() { - return B.MFV_TOPBAR_BUTTON !== !1; -} -function JS() { - try { - document.querySelector(`[${gS}]`)?.remove?.(), document.querySelector(`[${vS}]`)?.remove?.(); - } catch (e) { - console.debug?.(e); - } -} -function YS() { - let e = IS(); - if (!e) return LS(null), null; - if (!qS()) return JS(), LS(e), null; - FS(e), KS(); - let t = zS(e); - if (!t) return LS(e), null; - let n = t.querySelector(`[${gS}]`); - return n ||= GS(), n.parentElement !== t && t.replaceChildren(n), LS(e), HS(n.querySelector(`[${_S}]`)), t; -} -function XS() { - jS || (jS = !0, MS = window.setTimeout(() => { - jS = !1, MS = null, YS(); - }, 32)); + rC(); } function ZS() { - return typeof window > "u" || typeof document > "u" || !document.body ? !1 : (XS(), OS || (OS = (e) => { - NS = !!e?.detail?.visible, PS = !0, XS(); - }, window.addEventListener(V.MFV_VISIBILITY_CHANGED, OS)), kS || (kS = () => XS(), window.addEventListener("resize", kS)), AS || (AS = (e) => { - let t = e?.detail?.key; - (t === SS || t === "storage") && XS(); - }, window.addEventListener("mjr-settings-changed", AS)), FS(IS()), !0); + let e = document.createElement("button"); + return e.type = "button", e.setAttribute(wS, "1"), e.className = "comfyui-button mjr-topbar-mfv-button", e.style.position = "relative", e.style.zIndex = "10030", e.style.width = "auto", e.style.height = "32px", e.style.minWidth = "32px", e.style.padding = "0 10px", e.style.gap = "6px", e.style.display = "inline-flex", e.style.alignItems = "center", e.style.justifyContent = "center", e.style.whiteSpace = "nowrap", e.addEventListener("click", XS), YS(e), e; } function QS() { + let e = document.createElement("div"); + return e.setAttribute(CS, "1"), e.className = "mjr-topbar-mfv-button-host", e.style.position = "relative", e.appendChild(ZS()), e; +} +function $S() { + if (typeof document > "u" || VS) return; + let e = !!document.querySelector(".mjr-mfv.is-visible"); + BS !== e && (BS = e); +} +function eC() { + return B.MFV_TOPBAR_BUTTON !== !1; +} +function tC() { try { - CS?.disconnect?.(); + document.querySelector(`[${CS}]`)?.remove?.(), document.querySelector(`[${TS}]`)?.remove?.(); } catch (e) { console.debug?.(e); } - CS = null, wS = null; +} +function nC() { + let e = US(); + if (!e) return WS(null), null; + if (!eC()) return tC(), WS(e), null; + HS(e), $S(); + let t = KS(e); + if (!t) return WS(e), null; + let n = t.querySelector(`[${CS}]`); + return n ||= QS(), n.parentElement !== t && t.replaceChildren(n), WS(e), YS(n.querySelector(`[${wS}]`)), t; +} +function rC() { + RS || (RS = !0, zS = window.setTimeout(() => { + RS = !1, zS = null, nC(); + }, 32)); +} +function iC() { + return typeof window > "u" || typeof document > "u" || !document.body ? !1 : (rC(), FS || (FS = (e) => { + BS = !!e?.detail?.visible, VS = !0, rC(); + }, window.addEventListener(V.MFV_VISIBILITY_CHANGED, FS)), IS || (IS = () => rC(), window.addEventListener("resize", IS)), LS || (LS = (e) => { + let t = e?.detail?.key; + (t === kS || t === "storage") && rC(); + }, window.addEventListener("mjr-settings-changed", LS)), HS(US()), !0); +} +function aC() { try { - TS?.disconnect?.(); + AS?.disconnect?.(); } catch (e) { console.debug?.(e); } - TS = null, ES = null; + AS = null, jS = null; try { - DS?.disconnect?.(); + MS?.disconnect?.(); } catch (e) { console.debug?.(e); } - DS = null; + MS = null, NS = null; try { - MS && window.clearTimeout(MS); + PS?.disconnect?.(); } catch (e) { console.debug?.(e); } - MS = null, OS && typeof window < "u" && window.removeEventListener(V.MFV_VISIBILITY_CHANGED, OS), OS = null, kS && typeof window < "u" && window.removeEventListener("resize", kS), kS = null, AS && typeof window < "u" && window.removeEventListener("mjr-settings-changed", AS), AS = null, jS = !1, NS = !1, PS = !1; + PS = null; try { - document.documentElement?.style?.setProperty("--mjr-mfv-top-offset", "60px"), document.querySelector(`[${gS}]`)?.remove?.(), document.querySelector(`[${vS}]`)?.remove?.(); + zS && window.clearTimeout(zS); + } catch (e) { + console.debug?.(e); + } + zS = null, FS && typeof window < "u" && window.removeEventListener(V.MFV_VISIBILITY_CHANGED, FS), FS = null, IS && typeof window < "u" && window.removeEventListener("resize", IS), IS = null, LS && typeof window < "u" && window.removeEventListener("mjr-settings-changed", LS), LS = null, RS = !1, BS = !1, VS = !1; + try { + document.documentElement?.style?.setProperty("--mjr-mfv-top-offset", "60px"), document.querySelector(`[${CS}]`)?.remove?.(), document.querySelector(`[${TS}]`)?.remove?.(); } catch (e) { console.debug?.(e); } } // ui/features/runtime/entryUiRegistration.ts -var $S = "mjr-global-runtime-root", eC = "_mjrGlobalRuntimeVueApp", tC = "_mjrSidebarVueApp", nC = "_mjrFeedVueApp", rC = "majoor-generated-feed", iC = null; -function aC() { +var oC = "mjr-global-runtime-root", sC = "_mjrGlobalRuntimeVueApp", cC = "_mjrSidebarVueApp", lC = "_mjrFeedVueApp", uC = "majoor-generated-feed", dC = null; +function fC() { if (typeof document > "u" || !document?.body) return null; - let e = document.getElementById($S); - return e || (e = document.createElement("div"), e.id = $S, e.setAttribute("role", "presentation"), e.style.cssText = "position:fixed;inset:0;overflow:visible;pointer-events:none;z-index:10020;", document.body.appendChild(e), e); + let e = document.getElementById(oC); + return e || (e = document.createElement("div"), e.id = oC, e.setAttribute("role", "presentation"), e.style.cssText = "position:fixed;inset:0;overflow:visible;pointer-events:none;z-index:10020;", document.body.appendChild(e), e); } -function oC() { +function pC() { try { - let e = aC(); + let e = fC(); if (!e) return !1; - let t = !!Dn(e, Rp, eC); - return ZS(), t; + let t = !!En(e, Gp, sC); + return iC(), t; } catch { return !1; } } -function sC() { +function mC() { try { - QS(); - let e = document.getElementById($S); + aC(); + let e = document.getElementById(oC); if (!e) return; - Rn(e, eC), e.remove?.(); + Ln(e, sC), e.remove?.(); } catch {} } -function cC(e, t) { +function hC(e, t) { let n = We(e, t); - if (Vf(), !n) try { + if (Jf(), !n) try { window.dispatchEvent(new Event(V.OPEN_ASSETS_MANAGER)); } catch (e) { console.debug?.(e); } return n; } -function lC() { +function gC() { try { window.dispatchEvent(new CustomEvent(V.RELOAD_GRID, { detail: { reason: "command" } })); } catch (e) { console.debug?.(e); } } -function uC(e) { - let t = Xe(e, rC); +function _C(e) { + let t = Xe(e, uC); if (!t) try { - Fd(); + Hd(); } catch (e) { console.debug?.(e); } return t; } -async function dC() { +async function vC() { try { let t = await L(at.BROWSE_FOLDER, {}); if (t?.ok) return String(t?.data?.path || "").trim(); @@ -23860,14 +23890,14 @@ async function dC() { } return ""; } -async function fC(t, { settingId: n, settingsPathKey: r, save: i, successMessage: a, restartRequired: o = !1 }) { - let s = await dC(); +async function yC(t, { settingId: n, settingsPathKey: r, save: i, successMessage: a, restartRequired: o = !1 }) { + let s = await vC(); if (!s) return !1; let c = await i(s); if (!c?.ok) return e(c?.error || R("toast.settingsPathSaveFailed", "Failed to save path"), "error"), !1; try { - let e = Hn(); - e.paths = e.paths || {}, e.paths[r] = s, In(e), Fe(t, n, s), window.dispatchEvent(new CustomEvent(V.SETTINGS_CHANGED, { detail: { + let e = Vn(); + e.paths = e.paths || {}, e.paths[r] = s, Fn(e), Fe(t, n, s), window.dispatchEvent(new CustomEvent(V.SETTINGS_CHANGED, { detail: { key: `paths.${r}`, value: s } })); @@ -23876,10 +23906,10 @@ async function fC(t, { settingId: n, settingsPathKey: r, save: i, successMessage } return e(o ? `${a} ${R("toast.restartComfyUiToApply", "Restart ComfyUI to apply.")}` : a, "success", 2800), !0; } -function pC(e) { - return IC(e).find(FC) || null; +function bC(e) { + return UC(e).find(HC) || null; } -function mC(e) { +function xC(e) { let t = String(e?.id ?? e?.nodeId ?? e?.node_id ?? "").trim(); if (!t) return null; let n = String(e?.comfyClass || e?.type || e?.constructor?.type || "").trim(); @@ -23891,7 +23921,7 @@ function mC(e) { title: String(e?.title || e?.properties?.title || e?.properties?.name || n || "").trim() }; } -async function hC(e) { +async function SC(e) { if (!e) return []; try { let t = (await import("./chunks/NodeStreamController-CIKDDXJT.js")).extractNodeFileData?.(e), n = String(t?.filename || "").trim(); @@ -23905,7 +23935,7 @@ async function hC(e) { return console.debug?.(e), []; } } -function gC(e) { +function CC(e) { try { if (typeof window > "u") return; window.MajoorAssetsManager = window.MajoorAssetsManager || {}, window.MajoorAssetsManager.pendingNodeContext = e, window.dispatchEvent(new CustomEvent(V.OPEN_NODE_CONTEXT, { detail: e })); @@ -23913,18 +23943,18 @@ function gC(e) { console.debug?.(e); } } -async function _C(t, n, r) { - cC(t, n); - let i = mC(r) || {}, a = await hC(r); +async function wC(t, n, r) { + hC(t, n); + let i = xC(r) || {}, a = await SC(r); a.length && (i.files = a); let o = String(r?.comfyClass || r?.type || "").toLowerCase(); - return a.length && /load|upload/.test(o) && (delete i.source_node_id, delete i.sourceNodeId), !i.source_node_id && !a.length ? (e(R("toast.nodeContextMissing", "Select an output node first."), "info", 2200), !1) : (gC(i), !0); + return a.length && /load|upload/.test(o) && (delete i.source_node_id, delete i.sourceNodeId), !i.source_node_id && !a.length ? (e(R("toast.nodeContextMissing", "Select an output node first."), "info", 2200), !1) : (CC(i), !0); } -async function vC(e) { +async function TC(e) { try { - let t = await hC(e); + let t = await SC(e); if (t.length) { - let { floatingViewerManager: e } = await import("./chunks/floatingViewerManager-DI520cRz.js").then((e) => e.n); + let { floatingViewerManager: e } = await import("./chunks/floatingViewerManager-B_1xQj1m.js").then((e) => e.n); if (await e.openAssets({ assets: t, index: 0 @@ -23940,11 +23970,11 @@ async function vC(e) { } return !1; } -function yC(t, n) { - let r = iC; - return r ? (_C(t, n, r), !0) : (e(R("toast.nodeContextMissing", "Select an output node first."), "info", 2200), !1); +function EC(t, n) { + let r = dC; + return r ? (wC(t, n, r), !0) : (e(R("toast.nodeContextMissing", "Select an output node first."), "info", 2200), !1); } -function bC(e, { sidebarTabId: t, triggerStartupScan: n }) { +function DC(e, { sidebarTabId: t, triggerStartupScan: n }) { return [ { id: "mjr.openAssetsManager", @@ -23953,7 +23983,7 @@ function bC(e, { sidebarTabId: t, triggerStartupScan: n }) { title: R("tooltip.openAssetsManager", "Open Majoor Assets Manager"), description: R("tooltip.openAssetsManager", "Open Majoor Assets Manager"), icon: "pi pi-folder-open", - function: () => cC(e, t) + function: () => hC(e, t) }, { id: "mjr.scanAssets", @@ -23977,7 +24007,7 @@ function bC(e, { sidebarTabId: t, triggerStartupScan: n }) { id: "mjr.refreshAssetsGrid", label: R("command.refreshAssetsGrid", "Refresh assets grid"), icon: "pi pi-sync", - function: () => lC() + function: () => gC() }, { id: "mjr.openFloatingViewer", @@ -24001,13 +24031,13 @@ function bC(e, { sidebarTabId: t, triggerStartupScan: n }) { title: R("tooltip.openGeneratedFeed", "Open the Majoor generated feed panel"), description: R("tooltip.openGeneratedFeed", "Open the Majoor generated feed panel"), icon: "pi pi-list", - function: () => uC(e) + function: () => _C(e) }, { id: "mjr.openSettings", label: R("command.openSettings", "Open Majoor settings"), icon: "pi pi-cog", - function: () => Xn(e) + function: () => Yn(e) }, { id: "mjr.pickOutputDirectory", @@ -24016,7 +24046,7 @@ function bC(e, { sidebarTabId: t, triggerStartupScan: n }) { title: R("tooltip.pickOutputDirectory", "Use the native folder browser to set Majoor's generation output directory"), description: R("tooltip.pickOutputDirectory", "Use the native folder browser to set Majoor's generation output directory"), icon: "pi pi-folder", - function: () => fC(e, { + function: () => yC(e, { settingId: "Majoor.Paths.OutputDirectory", settingsPathKey: "outputDirectory", save: se, @@ -24030,7 +24060,7 @@ function bC(e, { sidebarTabId: t, triggerStartupScan: n }) { title: R("tooltip.pickIndexDirectory", "Use the native folder browser to set Majoor's index database directory"), description: R("tooltip.pickIndexDirectory", "Use the native folder browser to set Majoor's index database directory"), icon: "pi pi-database", - function: () => fC(e, { + function: () => yC(e, { settingId: "Majoor.Paths.IndexDirectory", settingsPathKey: "indexDirectory", save: s, @@ -24045,7 +24075,7 @@ function bC(e, { sidebarTabId: t, triggerStartupScan: n }) { title: R("tooltip.openNodeContext", "Show the latest indexed assets produced by this node"), description: R("tooltip.openNodeContext", "Show the latest indexed assets produced by this node"), icon: "pi pi-sitemap", - function: () => yC(e, t) + function: () => EC(e, t) }, { id: "mjr.openNodeInFloatingViewer", @@ -24055,12 +24085,12 @@ function bC(e, { sidebarTabId: t, triggerStartupScan: n }) { description: R("tooltip.openNodeInFloatingViewer", "Open this node's media in the Majoor floating viewer"), icon: "pi pi-window-maximize", function: () => { - vC(iC); + TC(dC); } } ]; } -function xC() { +function OC() { return [{ combo: { alt: !0, @@ -24077,7 +24107,7 @@ function xC() { commandId: "mjr.toggleFloatingViewer" }]; } -function SC() { +function kC() { return [{ path: ["Extensions", "Majoor Assets Manager"], commands: [ @@ -24092,13 +24122,13 @@ function SC() { ] }]; } -function CC(e, { sidebarTabId: t, triggerStartupScan: n }) { +function AC(e, { sidebarTabId: t, triggerStartupScan: n }) { return [null, { content: "Majoor Assets Manager", submenu: { options: [ { content: R("tooltip.openAssetsManager", "Open Majoor Assets Manager"), - callback: () => cC(e, t) + callback: () => hC(e, t) }, { content: R("command.openFloatingViewer", "Open floating viewer"), @@ -24112,12 +24142,12 @@ function CC(e, { sidebarTabId: t, triggerStartupScan: n }) { }, { content: R("command.openGeneratedFeed", "Open generated feed"), - callback: () => uC(e) + callback: () => _C(e) }, null, { content: R("command.refreshAssetsGrid", "Refresh assets grid"), - callback: () => lC() + callback: () => gC() }, { content: R("command.scanAssets", "Scan assets"), @@ -24125,12 +24155,12 @@ function CC(e, { sidebarTabId: t, triggerStartupScan: n }) { }, { content: R("command.openSettings", "Open Majoor settings"), - callback: () => Xn(e) + callback: () => Yn(e) } ] } }]; } -function wC() { +function jC() { return [ { label: "Majoor Assets Manager", @@ -24147,16 +24177,16 @@ function wC() { } ]; } -function TC(e, t) { - for (let n of bC(e, t)) Ve(e, n); +function MC(e, t) { + for (let n of DC(e, t)) Ve(e, n); } -function EC(e) { - for (let t of xC()) He(e, t); +function NC(e) { + for (let t of OC()) He(e, t); } -function DC(e, { sidebarTabId: t }) { - zf({ sidebarTabId: t }); +function PC(e, { sidebarTabId: t }) { + Kf({ sidebarTabId: t }); try { - Hn()?.integration?.hideNativeAssetsTab && xn(!0); + Vn()?.integration?.hideNativeAssetsTab && bn(!0); } catch (e) { console.debug?.(e); } @@ -24168,8 +24198,8 @@ function DC(e, { sidebarTabId: t }) { tooltip: R("tooltip.sidebarTab"), type: "custom", render(e) { - Vf(), ci({ idleOnly: !0 }).catch(() => null), Dn(e, mS, tC), setTimeout(() => { - let e = Wf(); + Jf(), ci({ idleOnly: !0 }).catch(() => null), En(e, xS, cC), setTimeout(() => { + let e = Zf(); if (e) try { window.dispatchEvent(new CustomEvent(V.RELOAD_GRID, { detail: { reason: "pending-generated-assets", @@ -24183,80 +24213,80 @@ function DC(e, { sidebarTabId: t }) { destroy(e) {} }); } -function OC() { +function FC() { try { - pn(); + fn(); } catch {} try { - Rn(null, tC); + Ln(null, cC); } catch {} - kC = !1; + IC = !1; try { - document.getElementById(AC)?.remove?.(); + document.getElementById(LC)?.remove?.(); } catch {} } -var kC = !1, AC = "mjr-sidebar-prewarm-host"; -function jC() { - if (kC || typeof document > "u" || !document?.body || Tn(tC)) return !1; - kC = !0; +var IC = !1, LC = "mjr-sidebar-prewarm-host"; +function RC() { + if (IC || typeof document > "u" || !document?.body || wn(cC)) return !1; + IC = !0; try { - let e = document.getElementById(AC); - return e || (e = document.createElement("div"), e.id = AC, e.style.cssText = "position:fixed;left:-99999px;top:0;width:360px;height:600px;overflow:hidden;visibility:hidden;pointer-events:none;contain:strict;", e.setAttribute("aria-hidden", "true"), document.body.appendChild(e)), Dn(e, mS, tC, { attachIfExists: !1 }), !0; + let e = document.getElementById(LC); + return e || (e = document.createElement("div"), e.id = LC, e.style.cssText = "position:fixed;left:-99999px;top:0;width:360px;height:600px;overflow:hidden;visibility:hidden;pointer-events:none;contain:strict;", e.setAttribute("aria-hidden", "true"), document.body.appendChild(e)), En(e, xS, cC, { attachIfExists: !1 }), !0; } catch (e) { - return console.debug?.(e), kC = !1, !1; + return console.debug?.(e), IC = !1, !1; } } -function MC() { +function zC() { return { - id: rC, + id: uC, title: R("bottomFeed.title", "Generated Feed"), icon: "pi pi-images", type: "custom", render(e) { - Dn(e, hS, nC); + En(e, SS, lC); }, destroy(e) {} }; } -function NC() { - return [MC()]; +function BC() { + return [zC()]; } -function PC() { +function VC() { try { - Rn(null, nC); + Ln(null, lC); } catch {} } -function FC(e) { +function HC(e) { let t = String(e?.comfyClass || e?.type || e?.constructor?.type || "").trim(); return t ? /save|load|preview/i.test(t) : !1; } -function IC(e) { +function UC(e) { return e ? Array.isArray(e) ? e.filter(Boolean) : e instanceof Set ? Array.from(e).filter(Boolean) : e instanceof Map ? Array.from(e.values()).filter(Boolean) : Array.isArray(e?.items) ? e.items.filter(Boolean) : Array.isArray(e?.nodes) ? e.nodes.filter(Boolean) : [e] : []; } -function LC(e) { - return iC = pC(e), iC ? [ +function WC(e) { + return dC = bC(e), dC ? [ "mjr.openNodeContext", "mjr.openAssetsManager", "mjr.openNodeInFloatingViewer" ] : []; } -function RC(e, t) { +function GC(e, t) { return { content: e, callback: t }; } -function zC(t, n, { sidebarTabId: r }) { - return FC(t) ? [ - RC("View in Assets Manager", () => { - _C(n, r, t); +function KC(t, n, { sidebarTabId: r }) { + return HC(t) ? [ + GC("View in Assets Manager", () => { + wC(n, r, t); }), - RC("Open in Floating Viewer", () => { - vC(t); + GC("Open in Floating Viewer", () => { + TC(t); }), - RC("Index Output", () => { + GC("Index Output", () => { try { - lC(), e(R("toast.rescanningFile", "Rescanning file..."), "info", 1800); + gC(), e(R("toast.rescanningFile", "Rescanning file..."), "info", 1800); } catch (e) { console.debug?.(e); } @@ -24264,15 +24294,15 @@ function zC(t, n, { sidebarTabId: r }) { ] : []; } // ui/features/runtime/entryRuntimeLifecycle.ts -var BC = "__MJR_ENTRY_RUNTIME__"; -function VC(e, t) { +var qC = "__MJR_ENTRY_RUNTIME__"; +function JC(e, t) { if (e) try { e._mjrAssetUpdateReloadTimer &&= (clearTimeout(e._mjrAssetUpdateReloadTimer), null), e._mjrExecutedHandler && e.removeEventListener("executed", e._mjrExecutedHandler), e._mjrAssetAddedHandler && e.removeEventListener("mjr-asset-added", e._mjrAssetAddedHandler), e._mjrAssetUpdatedHandler && e.removeEventListener("mjr-asset-updated", e._mjrAssetUpdatedHandler), e._mjrStructuredEventHandler && e.removeEventListener(V.STRUCTURED_EVENT, e._mjrStructuredEventHandler), e._mjrScanCompleteHandler && e.removeEventListener(V.SCAN_COMPLETE, e._mjrScanCompleteHandler), e._mjrAssetsRemovedHandler && e.removeEventListener(V.ASSETS_REMOVED, e._mjrAssetsRemovedHandler), e._mjrScanProgressHandler && e.removeEventListener(V.SCAN_PROGRESS, e._mjrScanProgressHandler), e._mjrAssetIndexingHandler && e.removeEventListener(V.ASSET_INDEXING, e._mjrAssetIndexingHandler), e._mjrAssetIndexedHandler && e.removeEventListener(V.ASSET_INDEXED, e._mjrAssetIndexedHandler), e._mjrExecutionStartHandler && e.removeEventListener("execution_start", e._mjrExecutionStartHandler), e._mjrExecutionEndHandler && (e.removeEventListener("execution_success", e._mjrExecutionEndHandler), e.removeEventListener("execution_error", e._mjrExecutionEndHandler), e.removeEventListener("execution_interrupted", e._mjrExecutionEndHandler)), e._mjrStacksUpdatedHandler && e.removeEventListener("mjr.stacks.updated", e._mjrStacksUpdatedHandler), e._mjrEnrichmentStatusHandler && e.removeEventListener(V.ENRICHMENT_STATUS, e._mjrEnrichmentStatusHandler), e._mjrDbRestoreStatusHandler && e.removeEventListener(V.DB_RESTORE_STATUS, e._mjrDbRestoreStatusHandler), e._mjrRuntimeStatusHandler && (e.removeEventListener("progress", e._mjrRuntimeStatusHandler), e.removeEventListener("status", e._mjrRuntimeStatusHandler), e.removeEventListener(V.RUNTIME_STATUS, e._mjrRuntimeStatusHandler), e.removeEventListener("execution_cached", e._mjrExecutionCachedHandler)); } catch (e) { t?.(e, "entry.removeApiHandlers"); } } -function HC(e, t) { +function YC(e, t) { try { let t = e?.assetsDeletedHandler; t && typeof window < "u" && window.removeEventListener(V.ASSETS_DELETED, t); @@ -24280,7 +24310,7 @@ function HC(e, t) { t?.(e, "entry.removeRuntimeWindowHandlers"); } } -function UC(e, { reportError: t } = {}) { +function XC(e, { reportError: t } = {}) { if (e && typeof e == "object") { try { ee(); @@ -24310,13 +24340,13 @@ function UC(e, { reportError: t } = {}) { console.warn("[MJR teardown]", e); } try { - VC(e.api || null, t), HC(e, t); + JC(e.api || null, t), YC(e, t); } catch (e) { console.warn("[MJR teardown]", e); } } } -function WC(e, t, n, r, i = void 0) { +function ZC(e, t, n, r, i = void 0) { if (!e || !t?.addEventListener || typeof r != "function") return null; let a = i && typeof i == "object" ? { ...i } : i; if (typeof AbortController < "u") try { @@ -24336,11 +24366,11 @@ function WC(e, t, n, r, i = void 0) { } }), null; } -function GC({ cleanupEntryRuntimeFn: e = UC, teardownLiveStreamTracker: t, teardownNodeStream: n, teardownFloatingViewerManager: r, teardownGeneratedFeed: i, teardownAssetsSidebar: a, teardownGlobalRuntime: o, teardownTopBarMfvButton: s, reportError: c }) { +function QC({ cleanupEntryRuntimeFn: e = XC, teardownLiveStreamTracker: t, teardownNodeStream: n, teardownFloatingViewerManager: r, teardownGeneratedFeed: i, teardownAssetsSidebar: a, teardownGlobalRuntime: o, teardownTopBarMfvButton: s, reportError: c }) { try { if (typeof window < "u") { try { - let t = window[BC]; + let t = window[qC]; e(t, { reportError: c }); } catch (e) { console.warn("[MJR teardown]", e); @@ -24380,7 +24410,7 @@ function GC({ cleanupEntryRuntimeFn: e = UC, teardownLiveStreamTracker: t, teard } catch (e) { console.warn("[MJR teardown]", e); } - window[BC] = { + window[qC] = { api: null, assetsDeletedHandler: null, _cleanupControllers: [], @@ -24392,42 +24422,42 @@ function GC({ cleanupEntryRuntimeFn: e = UC, teardownLiveStreamTracker: t, teard } } // ui/entry.ts -var KC = null, qC = null, JC = null; -function YC() { - return JC ||= import("./chunks/floatingViewerManager-DI520cRz.js").then((e) => e.n), JC; +var $C = null, ew = null, tw = null; +function nw() { + return tw ||= import("./chunks/floatingViewerManager-B_1xQj1m.js").then((e) => e.n), tw; } -function XC() { - JC && JC.then((e) => e?.teardownFloatingViewerManager?.()).catch((e) => console.debug?.("[Majoor] MFV teardown skipped", e)); +function rw() { + tw && tw.then((e) => e?.teardownFloatingViewerManager?.()).catch((e) => console.debug?.("[Majoor] MFV teardown skipped", e)); } -var ZC = "majoor-assets", QC = "__MJR_EXECUTION_RUNTIME__", $C = "Majoor.AssetsManager", ew = { +var iw = "majoor-assets", aw = "__MJR_EXECUTION_RUNTIME__", ow = "Majoor.AssetsManager", sw = { active: null, promptId: "" -}, tw = null, nw = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i, rw = /^[0-9a-f]{20,}$/i; -function iw(...e) { +}, cw = null, lw = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i, uw = /^[0-9a-f]{20,}$/i; +function dw(...e) { for (let t of e) { let e = String(t || "").trim(); if (e) return e; } return ""; } -function aw(e) { +function fw(e) { let t = String(e || "").trim(); - return nw.test(t) || rw.test(t); + return lw.test(t) || uw.test(t); } -function ow(e) { - return iw(e?.title, e?.properties?.title, e?.properties?.name, e?.properties?.label, e?.name); +function pw(e) { + return dw(e?.title, e?.properties?.title, e?.properties?.name, e?.properties?.label, e?.name); } -function sw(e) { +function mw(e) { if (!e || typeof e != "object") return []; if (Array.isArray(e.nodes)) return e.nodes.filter(Boolean); if (Array.isArray(e._nodes)) return e._nodes.filter(Boolean); let t = e._nodes_by_id ?? e.nodes_by_id ?? null; return t instanceof Map ? Array.from(t.values()).filter(Boolean) : t && typeof t == "object" ? Object.values(t).filter(Boolean) : []; } -function cw(e) { - return sw(e).length > 0; +function hw(e) { + return mw(e).length > 0; } -function lw(e) { +function gw(e) { return !e || typeof e != "object" ? !1 : [ e.subgraph, e._subgraph, @@ -24438,13 +24468,13 @@ function lw(e) { e.subgraph_instance?.graph, e.inner_graph, e.subgraph_graph - ].some(cw) || Array.isArray(e.nodes) && e.nodes.length > 0 && e.nodes !== e.graph?.nodes ? !0 : aw(e.type) && !!ow(e); + ].some(hw) || Array.isArray(e.nodes) && e.nodes.length > 0 && e.nodes !== e.graph?.nodes ? !0 : fw(e.type) && !!pw(e); } -function uw(e, t) { - let n = String(e?.type || t || "").trim(), r = ow(e); - return aw(n) ? r || "Subgraph" : n || r || "Node"; +function _w(e, t) { + let n = String(e?.type || t || "").trim(), r = pw(e); + return fw(n) ? r || "Subgraph" : n || r || "Node"; } -function dw() { +function vw() { try { return typeof window > "u" ? { active_prompt_id: null, @@ -24453,30 +24483,30 @@ function dw() { progress_value: null, progress_max: null, cached_nodes: [] - } : (window[QC] && typeof window[QC] == "object" || (window[QC] = { + } : (window[aw] && typeof window[aw] == "object" || (window[aw] = { active_prompt_id: null, queue_remaining: null, progress_node: null, progress_value: null, progress_max: null, cached_nodes: [] - }), window[QC]); + }), window[aw]); } catch (e) { return console.debug?.(e), {}; } } -function fw(e = {}) { +function yw(e = {}) { try { - let t = dw(); + let t = vw(); Object.assign(t, e || {}), window.dispatchEvent(new CustomEvent(V.RUNTIME_STATUS, { detail: { ...t } })); } catch (e) { console.debug?.(e); } } -async function pw({ active: e, promptId: t = "" } = {}) { +async function bw({ active: e, promptId: t = "" } = {}) { let n = !!e, r = String(t || "").trim(); - if (ew.active !== n || ew.promptId !== r) { - ew = { + if (sw.active !== n || sw.promptId !== r) { + sw = { active: n, promptId: r }; @@ -24491,49 +24521,49 @@ async function pw({ active: e, promptId: t = "" } = {}) { } } } -function mw() { +function xw() { try { - return !!String(dw()?.active_prompt_id || "").trim(); + return !!String(vw()?.active_prompt_id || "").trim(); } catch (e) { return console.debug?.(e), !1; } } -function hw(e = 1200) { +function Sw(e = 1200) { try { - tw && clearTimeout(tw); + cw && clearTimeout(cw); } catch (e) { console.debug?.(e); } - tw = setTimeout(() => { - if (tw = null, mw()) { - hw(e); + cw = setTimeout(() => { + if (cw = null, xw()) { + Sw(e); return; } - let t = $n(); + let t = Qn(); t && vi(t); }, Math.max(250, Number(e) || 0)); } -function gw(e) { - import("./chunks/LiveStreamTracker-CUeCguVd.js").then((t) => { - KC = t; +function Cw(e) { + import("./chunks/LiveStreamTracker-B3HhmLvE.js").then((t) => { + $C = t; try { t.initLiveStreamTracker(e); } catch (e) { console.warn("[MJR setup] initLiveStreamTracker failed:", e); } }).catch((e) => console.warn("[MJR setup] LiveStreamTracker load failed:", e)), import("./chunks/NodeStreamController-CIKDDXJT.js").then((t) => { - qC = t; + ew = t; try { t.initNodeStream({ app: e, onOutput: (e) => { - YC().then((t) => t?.floatingViewerManager?.feedNodeStream?.(e)).catch((e) => console.debug?.("[NodeStream] MFV output failed", e)); + nw().then((t) => t?.floatingViewerManager?.feedNodeStream?.(e)).catch((e) => console.debug?.("[NodeStream] MFV output failed", e)); }, onStatus: (t, n) => { try { - let r = (e?.graph ?? e?.canvas?.graph ?? null)?.getNodeById?.(Number(t)), i = lw(r), a = ow(r), o = i ? "Subgraph" : uw(r, n); - YC().then((e) => { - e?.floatingViewerManager?.setNodeStreamSelection?.(t, o, i ? a || uw(r, n) : a); + let r = (e?.graph ?? e?.canvas?.graph ?? null)?.getNodeById?.(Number(t)), i = gw(r), a = pw(r), o = i ? "Subgraph" : _w(r, n); + nw().then((e) => { + e?.floatingViewerManager?.setNodeStreamSelection?.(t, o, i ? a || _w(r, n) : a); }).catch((e) => console.debug?.("[NodeStream] MFV status failed", e)); } catch (e) { console.debug?.("[NodeStream] onStatus failed", e); @@ -24545,7 +24575,7 @@ function gw(e) { } }).catch((e) => console.warn("[MJR setup] NodeStream load failed:", e)); } -async function _w(t, n) { +async function ww(t, n) { let r = await ct({ app: t, timeoutMs: 4e3 @@ -24554,7 +24584,7 @@ async function _w(t, n) { console.warn("Majoor API not available, real-time updates disabled"); return; } - Kn({ + Gn({ api: r, app: t }).catch((e) => console.debug?.("[Majoor] MFV progress tracking init failed", e)); @@ -24564,78 +24594,78 @@ async function _w(t, n) { } catch (e) { console.debug?.(e); } - VC(i?.api || null, P), r !== i?.api && VC(r, P), HC(i, P), await rp({ + JC(i?.api || null, P), r !== i?.api && JC(r, P), YC(i, P), await up({ api: r, runtime: i, executionRuntime: n, appRef: Ir, - liveStreamModule: KC, - ensureExecutionRuntime: dw, - emitRuntimeStatus: fw, - getActiveGridContainer: $n, - pushGeneratedAsset: Xd, + liveStreamModule: $C, + ensureExecutionRuntime: vw, + emitRuntimeStatus: yw, + getActiveGridContainer: Qn, + pushGeneratedAsset: rf, upsertAsset: Ei, upsertAssetNow: Di, removeAssetsFromGrid: Ti, - getEnrichmentState: It, - setEnrichmentState: St, + getEnrichmentState: Pt, + setEnrichmentState: It, comfyToast: e, t: R, reportError: P, - registerCleanableListener: WC, - syncExecutionBackendState: pw + registerCleanableListener: ZC, + syncExecutionBackendState: bw }); } -var vw = yf({ +var Tw = Ef({ post: L, ENDPOINTS: at, reportError: P, - extractOutputFiles: bf, - ensureExecutionRuntime: dw, - emitRuntimeStatus: fw, - refreshGeneratedFeedHosts: Fd, - getActiveGridContainer: $n -}), yw = { - name: $C, - settings: bn(Ir), - commands: bC(Ir, { - sidebarTabId: ZC, + extractOutputFiles: Df, + ensureExecutionRuntime: vw, + emitRuntimeStatus: yw, + refreshGeneratedFeedHosts: Hd, + getActiveGridContainer: Qn +}), Ew = { + name: ow, + settings: yn(Ir), + commands: DC(Ir, { + sidebarTabId: iw, triggerStartupScan: oi }), - keybindings: xC(), - menuCommands: SC(), - aboutPageBadges: wC(), - bottomPanelTabs: NC(), + keybindings: OC(), + menuCommands: kC(), + aboutPageBadges: jC(), + bottomPanelTabs: BC(), async setup() { - GC({ - cleanupEntryRuntimeFn: UC, - teardownLiveStreamTracker: (e) => KC?.teardownLiveStreamTracker(e), - teardownNodeStream: (e) => qC?.teardownNodeStream(e), - teardownFloatingViewerManager: XC, - teardownGeneratedFeed: PC, - teardownAssetsSidebar: OC, - teardownGlobalRuntime: sC, - teardownTopBarMfvButton: QS, + QC({ + cleanupEntryRuntimeFn: XC, + teardownLiveStreamTracker: (e) => $C?.teardownLiveStreamTracker(e), + teardownNodeStream: (e) => ew?.teardownNodeStream(e), + teardownFloatingViewerManager: rw, + teardownGeneratedFeed: VC, + teardownAssetsSidebar: FC, + teardownGlobalRuntime: mC, + teardownTopBarMfvButton: aC, reportError: P - }), sp(), Je(Ir); + }), mp(), Je(Ir); let e = await tt({ timeoutMs: 12e3 }) || Ir; - Je(e), Ip(e); + Je(e), Up(e); try { typeof window < "u" && (window.__MJR_RUNTIME_APP__ = e); } catch (e) { console.debug?.(e); } - ui(), fi({ enabled: !0 }), oC(), gw(e), yn(e, () => { - let e = $n(); - e && (B.DEFER_GRID_FETCH_DURING_EXECUTION && mw() ? hw() : vi(e)); - }), TC(e, { - sidebarTabId: ZC, + ui(), fi({ enabled: !0 }), pC(), Cw(e), vn(e, () => { + let e = Qn(); + e && (B.DEFER_GRID_FETCH_DURING_EXECUTION && xw() ? Sw() : vi(e)); + }), MC(e, { + sidebarTabId: iw, triggerStartupScan: oi - }), EC(e), _w(e, vw).catch((e) => P(e, "entry.api_setup")), DC(e, { sidebarTabId: ZC }) ? Se("[Majoor] Sidebar tab registered (Vue)") : console.warn("Majoor Assets Manager: extensionManager.registerSidebarTab is unavailable"); + }), NC(e), ww(e, Tw).catch((e) => P(e, "entry.api_setup")), PC(e, { sidebarTabId: iw }) ? Se("[Majoor] Sidebar tab registered (Vue)") : console.warn("Majoor Assets Manager: extensionManager.registerSidebarTab is unavailable"); try { let e = typeof window < "u" ? window.requestIdleCallback : null, t = () => { try { - jC(); + RC(); } catch (e) { console.debug?.(e); } @@ -24644,30 +24674,30 @@ var vw = yf({ } catch (e) { console.debug?.(e); } - ip({ resolveNodeStreamModule: async () => (qC ||= await import("./chunks/NodeStreamController-CIKDDXJT.js"), qC) }); + dp({ resolveNodeStreamModule: async () => (ew ||= await import("./chunks/NodeStreamController-CIKDDXJT.js"), ew) }); }, onNodeOutputsUpdated(e) { try { - vw.handleNodeOutputsUpdated(e); + Tw.handleNodeOutputsUpdated(e); } catch (e) { console.debug?.("[Majoor] onNodeOutputsUpdated error", e); } }, getNodeMenuItems(e) { - return zC(e, Ir, { sidebarTabId: ZC }); + return KC(e, Ir, { sidebarTabId: iw }); }, getCanvasMenuItems(e) { - return CC(Ir, { - sidebarTabId: ZC, + return AC(Ir, { + sidebarTabId: iw, triggerStartupScan: oi }); }, getSelectionToolboxCommands(e) { - return LC(e); + return WC(e); } }; try { - Ir.registerExtension(yw); + Ir.registerExtension(Ew); } catch (e) { - console.warn("[Majoor] registerExtension() threw (extension already registered) - re-running setup() directly", e), yw.setup().catch((e) => P(e, "entry.setup_after_duplicate_registration")); + console.warn("[Majoor] registerExtension() threw (extension already registered) - re-running setup() directly", e), Ew.setup().catch((e) => P(e, "entry.setup_after_duplicate_registration")); } diff --git a/docs/COMFYUI_INTEGRATION_AUDIT.md b/docs/COMFYUI_INTEGRATION_AUDIT.md index f94be79d..9b9e0835 100644 --- a/docs/COMFYUI_INTEGRATION_AUDIT.md +++ b/docs/COMFYUI_INTEGRATION_AUDIT.md @@ -127,6 +127,34 @@ Pistes restantes : - retirer aussi du flux de génération les éléments supprimés hors de l'interface ; - un seul événement par nouvel asset au lieu de `mjr-asset-added` plus `mjr.asset.indexed` (chacun doublé par l'enveloppe `mjr.event`). +## 3 quater. Piles de doublons : gel de ComfyUI et piles « corrompues » + +**Symptôme.** Un clic sur le badge de doublons (icône de copie suivie d'un nombre) gèle tout l'onglet ComfyUI ; certaines piles empilent des images qui n'ont rien à voir entre elles. + +**Cause du gel : une boucle de rendu Vue infinie.** +1. Le template de `VirtualAssetGridHost.vue` lit `asset._mjrDupStack` et `asset._mjrDupCount`, et passe `:ref="getCardRef(asset)"`, qui crée une nouvelle fonction à chaque rendu. Vue rappelle donc les refs à chaque rendu (`null`, puis l'élément). +2. `bindCardRef` appelait `syncRenderedDuplicateCards`, qui remettait `_mjrDupStack` à `false` sur tous les membres puis à `true` sur une carte principale, et assignait un nouveau tableau `_mjrDupMembers`. +3. En parallèle, le `computed` `displayAssets` faisait l'inverse, avec une autre carte principale (`bucket[0]` contre `selectStackRepresentative`). +4. Chaque écriture relançait le rendu du parent, donc les refs, donc de nouvelles écritures. En production, Vue n'a pas de limite de récursion : l'onglet tourne à l'infini. + +La vue « doublons » déclenchait la boucle à coup sûr : elle affiche N cartes de même nom, aussitôt re-regroupées. Un test le reproduit : **31 rendus en 5 passages** avec l'ancien code, contre zéro rendu supplémentaire après correctif. + +**Cause de la « corruption ».** Quatre définitions du doublon coexistaient : +- `AssetCardRenderer` et `displayAssets` : même nom dans le même source / racine / sous-dossier ; +- `useVirtualGrid.dedupeAssetsByKey` et `syncRenderedDuplicateCards` : **nom seul, tous dossiers confondus**. + +Ces deux derniers retiraient de `state.assets` des fichiers distincts d'autres dossiers et les rangeaient sous une mauvaise carte. Celle-ci recevait au passage le temps de génération d'une autre image (`preserveRepresentativeGenerationTime`). + +**Correctif** +- `buildDisplayAssets` est la seule source de vérité. Ses écritures sont gardées (assignation seulement si la valeur brute change, tableau des membres conservé tant que la composition ne change pas), avec une option `collapseDuplicates`. +- `syncRenderedDuplicateCards` ne touche plus l'état réactif. +- Une seule fonction de ref par carte (`getCardRef`). +- `dedupeAssetsByKey` ne retire plus que les vrais doublons (même id ou même clé). +- `AssetCardRenderer.appendAssets` ne retire plus de copies : il ne fait que compter. +- La vue « doublons » (scope `similar`) liste toutes les copies, avec des membres copiés sans cycle (`toDuplicateGroupMembers`). + +**À suivre.** Une pile « même dossier, même nom » correspond à plusieurs lignes en base pour un même fichier. C'est possible avec des index créés par d'anciennes versions, par exemple des variantes de casse sous Windows : les insertions actuelles normalisent le chemin. Une fusion de ces lignes, qui conserverait notes, tags et collections, reste à faire comme opération de maintenance explicite. + ## 4. Feuille de route d'évolution (meilleure intégration) 1. **Progression par nœud** — écouter l'événement websocket `progress_state` diff --git a/ui/features/grid/AssetCardRenderer.ts b/ui/features/grid/AssetCardRenderer.ts index 29776ce3..b9fc3c53 100644 --- a/ui/features/grid/AssetCardRenderer.ts +++ b/ui/features/grid/AssetCardRenderer.ts @@ -384,6 +384,11 @@ export function appendAssets(gridContainer: any, assets: any[], state: any, deps let needsUpdate = false; const validNewAssets = []; const assetsToRemoveFromState = new Set(); + // Only maintain per-key counts here. Collapsing duplicates into one card + // is a display concern owned by `buildDisplayAssets` (Vue grid). Removing + // the copies from `state.assets` and tagging a primary here fought with + // that pass (each reset the other's markers on reactive objects) and made + // the stack membership depend on paging order. const applyFilenameCollisions = () => { try { const visibleIds = new Set( @@ -392,101 +397,11 @@ export function appendAssets(gridContainer: any, assets: any[], state: any, deps .filter(Boolean), ); for (const [key, bucket] of filenameToAssets.entries()) { - const visibleBucket = (Array.isArray(bucket) ? bucket : []).filter((asset: any) => { + const count = (Array.isArray(bucket) ? bucket : []).filter((asset: any) => { const id = String(asset?.id || ""); return id ? visibleIds.has(id) : false; - }); - const count = visibleBucket.length; + }).length; filenameCounts.set(key, count); - - if (count < 2) { - // Clear any stale dup-stack markers (count dropped back to 1) - for (const asset of visibleBucket) { - asset._mjrNameCollision = false; - delete asset._mjrNameCollisionCount; - delete asset._mjrNameCollisionPaths; - if (asset._mjrDupStack) { - asset._mjrDupStack = false; - asset._mjrDupMembers = null; - asset._mjrDupCount = 0; - } - } - const renderedList = state.renderedFilenameMap?.get(key); - if (renderedList) { - for (const card of renderedList) { - const badge = card.querySelector?.(".mjr-file-badge"); - deps.setFileBadgeCollision(badge, false); - try { - deps.ensureDupStackCard?.(gridContainer, card, card._mjrAsset); - } catch (e: any) { - console.debug?.(e); - } - } - } - continue; - } - - // -- count >= 2: group into a duplicate stack ------------------------------ - // Select the best representative: prefer video_with_audio > video > image. - const primary = preserveRepresentativeGenerationTime( - selectStackRepresentative(visibleBucket), - visibleBucket, - ); - const secondaries = visibleBucket.filter((a: any) => a !== primary); - - // Ensure stale collision markers are cleared on all visible members. - for (const asset of visibleBucket) { - asset._mjrNameCollision = false; - delete asset._mjrNameCollisionCount; - delete asset._mjrNameCollisionPaths; - if (asset !== primary) { - asset._mjrDupStack = false; - asset._mjrDupMembers = null; - asset._mjrDupCount = 0; - } - } - - // Merge new duplicates with existing _mjrDupMembers to survive across pages. - const prevMembers = Array.isArray(primary._mjrDupMembers) - ? primary._mjrDupMembers - : []; - const prevIds = new Set(prevMembers.map((a: any) => String(a?.id || ""))); - const merged = [ - ...prevMembers, - ...visibleBucket.filter((a: any) => !prevIds.has(String(a?.id || ""))), - ]; - primary._mjrDupStack = true; - primary._mjrDupMembers = merged; - primary._mjrDupCount = merged.length; - primary._mjrNameCollision = false; // primary card shows stack button, not red badge - - // Remove secondary copies from state.assets so only the primary card shows. - const secondaryIds = new Set(secondaries.map((a: any) => String(a?.id || ""))); - if (secondaryIds.size > 0) { - state.assets = state.assets.filter( - (a: any) => !secondaryIds.has(String(a?.id || "")), - ); - } - - // Update rendered primary card: attach dup-stack button, clear red collision badge. - const renderedList = state.renderedFilenameMap?.get(key); - if (renderedList) { - for (const card of renderedList) { - const cardAsset = card._mjrAsset; - const badge = card.querySelector?.(".mjr-file-badge"); - if ( - cardAsset === primary || - String(cardAsset?.id || "") === String(primary?.id || "") - ) { - deps.setFileBadgeCollision(badge, false); - try { - deps.ensureDupStackCard?.(gridContainer, card, primary); - } catch (e: any) { - console.debug?.(e); - } - } - } - } } } catch (e: any) { console.debug?.(e); diff --git a/ui/features/panel/panelSimilarSearch.ts b/ui/features/panel/panelSimilarSearch.ts index fd7a549a..14cf9947 100644 --- a/ui/features/panel/panelSimilarSearch.ts +++ b/ui/features/panel/panelSimilarSearch.ts @@ -3,6 +3,7 @@ import { get, getAssetMetadata, vectorFindSimilar } from "../../api/client.js"; import { buildListURL, buildNodeContextMembersURL } from "../../api/endpoints.js"; import { comfyToast } from "../../app/toast.js"; import { t } from "../../app/i18n.js"; +import { toDuplicateGroupMembers } from "../../vue/grid/useGridDisplayAssets.js"; const STACK_GROUP_RENDER_LIMIT = 500; @@ -373,9 +374,9 @@ export function bindSimilarSearch({ } const activeAsset = await getActiveAsset(); const activeId = String(activeAsset?.id || selectedAssetId() || "").trim(); - const members = Array.isArray(activeAsset?._mjrDupMembers) - ? activeAsset._mjrDupMembers - : []; + const members = toDuplicateGroupMembers( + Array.isArray(activeAsset?._mjrDupMembers) ? activeAsset._mjrDupMembers : [], + ); if (members.length >= 2) { writePanelValue("similarResults", members); writePanelValue("similarSourceAssetId", activeId ? `duplicates:${activeId}` : "duplicates"); diff --git a/ui/tests/grid_display_duplicates.vitest.ts b/ui/tests/grid_display_duplicates.vitest.ts new file mode 100644 index 00000000..3a51a573 --- /dev/null +++ b/ui/tests/grid_display_duplicates.vitest.ts @@ -0,0 +1,92 @@ +import { describe, expect, it } from "vitest"; +import { computed, effect, reactive } from "vue"; + +import { buildDisplayAssets, toDuplicateGroupMembers } from "../vue/grid/useGridDisplayAssets.js"; + +function asset( + id: number, + subfolder: string, + filename = "at-7.958s.png", + extra: Record = {}, +) { + return { id, filename, subfolder, source: "output", type: "output", kind: "image", ...extra }; +} + +describe("duplicate stacks (display)", () => { + it("never stacks files that only share a name in different folders", () => { + const out = buildDisplayAssets([ + asset(1, "video_a"), + asset(2, "video_b"), + asset(3, "video_c"), + ]); + + expect(out).toHaveLength(3); + expect(out.every((a) => !a._mjrDupStack)).toBe(true); + }); + + it("stacks real duplicates of the same location and lists every copy", () => { + const out = buildDisplayAssets([ + asset(1, "shots"), + asset(2, "Shots"), + asset(3, "shots", "AT-7.958S.png"), + ]); + + expect(out).toHaveLength(1); + expect(out[0]._mjrDupStack).toBe(true); + expect(out[0]._mjrDupCount).toBe(3); + expect(out[0]._mjrDupMembers.map((a: any) => a.id)).toEqual([1, 2, 3]); + }); + + it("is write-idempotent on reactive assets, so a render cannot loop", () => { + // The grid template reads these fields; any write on a stable pass + // re-triggers the render that ran this computed (the ComfyUI freeze). + const state = reactive({ + assets: [asset(1, "s"), asset(2, "s"), asset(3, "s"), asset(4, "t")], + }); + const display = computed(() => buildDisplayAssets(state.assets)); + let renders = 0; + effect(() => { + renders += 1; + for (const a of display.value) { + void a._mjrDupStack; + void a._mjrDupCount; + void a._mjrDupMembers; + void a._mjrNameCollision; + } + }); + const settled = renders; + + for (let i = 0; i < 5; i++) { + buildDisplayAssets(state.assets); + } + + expect(renders).toBe(settled); + expect(renders).toBeLessThan(5); + const rep = display.value[0]; + const membersRef = rep._mjrDupMembers; + buildDisplayAssets(state.assets); + expect(rep._mjrDupMembers).toBe(membersRef); + }); + + it("shows every copy individually in the duplicates view", () => { + const assets = [asset(1, "s"), asset(2, "s"), asset(3, "s")]; + buildDisplayAssets(assets); + + const out = buildDisplayAssets(assets, { collapseDuplicates: false }); + + expect(out).toHaveLength(3); + expect(out.every((a) => !a._mjrDupStack && a._mjrDupMembers == null)).toBe(true); + }); + + it("hands the duplicates view cycle-free copies", () => { + const [rep] = buildDisplayAssets([asset(1, "s"), asset(2, "s")]); + expect(rep._mjrDupMembers).toContain(rep); // the live graph is cyclic + + const members = toDuplicateGroupMembers(rep._mjrDupMembers); + + expect(members.map((m) => m.id)).toEqual([1, 2]); + expect(() => JSON.stringify(members)).not.toThrow(); + expect(members[0]).not.toBe(rep); + expect(members.some((m) => "_mjrDupMembers" in m || "_mjrDupStack" in m)).toBe(false); + }); +}); diff --git a/ui/vue/components/grid/VirtualAssetGridHost.vue b/ui/vue/components/grid/VirtualAssetGridHost.vue index 71c7ccc5..738f853c 100644 --- a/ui/vue/components/grid/VirtualAssetGridHost.vue +++ b/ui/vue/components/grid/VirtualAssetGridHost.vue @@ -17,7 +17,6 @@ import { ensureStackGroupCard, ensureDupStackCard } from "../../../features/grid import { setSelectedIdsDataset } from "../../../features/grid/GridSelectionManager.js"; import { applyGridSettingsClasses, configureGridContainer } from "../../../features/grid/gridApi.js"; import { bindAssetDragStart } from "../../../features/dnd/DragDrop.js"; -import { preserveRepresentativeGenerationTime, selectStackRepresentative } from "../../../features/grid/AssetCardRenderer.js"; import AssetCardInner from "./AssetCardInner.vue"; import FolderCard from "./FolderCard.vue"; import { useGridState } from "../../composables/useGridState.js"; @@ -25,7 +24,11 @@ import { useGridLoader } from "../../composables/useGridLoader.js"; import { isGridHostVisible } from "../../composables/gridVisibility.js"; import { buildStaticGridRows, useGridVirtualRows } from "../../grid/useGridVirtualRows.js"; import { useInfiniteTrigger } from "../../grid/useInfiniteTrigger.js"; -import { buildDisplayAssets, isRenderableAsset } from "../../grid/useGridDisplayAssets.js"; +import { + buildDisplayAssets, + isRenderableAsset, + toDuplicateGroupMembers, +} from "../../grid/useGridDisplayAssets.js"; import { readRenderedAssetCards } from "./gridDomBridge.js"; import type { MjrAssetLike } from "../../../types/asset"; @@ -138,7 +141,9 @@ provide("mjrStackService", { openDupGroup: (asset) => { const gc = gridContainerRef.value; if (!gc || !asset) return; - const members = Array.isArray(asset._mjrDupMembers) ? asset._mjrDupMembers : [asset]; + const members = toDuplicateGroupMembers( + Array.isArray(asset._mjrDupMembers) ? asset._mjrDupMembers : [asset], + ); gc.dispatchEvent( new CustomEvent(EVENTS.OPEN_STACK_GROUP, { bubbles: true, @@ -426,7 +431,12 @@ function emitSelectionChanged() { emitSelectionChanged._lastSelectionKey = ""; -const displayAssets = computed(() => buildDisplayAssets(state.assets)); +// The "Duplicates - N copies" / similar view must list every copy; collapsing +// it again would show one card with the same badge and reopen the same view. +const gridViewScope = ref(""); +const displayAssets = computed(() => + buildDisplayAssets(state.assets, { collapseDuplicates: gridViewScope.value !== "similar" }), +); const renderableAssets = computed(() => { const assets = Array.isArray(displayAssets.value) ? displayAssets.value : []; @@ -971,6 +981,10 @@ function readGridScope() { .trim() .toLowerCase(); if (gridScope.value !== raw) gridScope.value = raw; + const view = String(gridContainerRef.value?.dataset?.mjrViewScope || "") + .trim() + .toLowerCase(); + if (gridViewScope.value !== view) gridViewScope.value = view; } function scheduleInitialHostMeasurements() { @@ -1013,7 +1027,7 @@ watch( }); scopeObserver.observe(element, { attributes: true, - attributeFilter: ["data-mjr-scope"], + attributeFilter: ["data-mjr-scope", "data-mjr-view-scope"], }); } catch (e) { console.debug?.(e); @@ -1104,65 +1118,20 @@ function unregisterFilenameCard(card) { } function syncRenderedDuplicateCards(filenameKey) { + // Duplicate stacks are owned by `displayAssets` (useGridDisplayAssets). + // This used to re-derive them here from the *file name alone* (across + // folders) on every card ref callback and write `_mjrDupStack` / + // `_mjrDupMembers` (a new array each time) onto reactive assets that the + // template reads. The ref callback runs on every render, so each write + // scheduled another render: an infinite update loop that froze ComfyUI, + // and stacks that mixed unrelated files sharing a name. Only the DOM-side + // cleanup remains; it never touches reactive state. const key = String(filenameKey || "").trim().toLowerCase(); if (!key) return; - const renderedSet = state.renderedFilenameMap.get(key); - const renderedCards = Array.from(renderedSet || []); - if (!renderedCards.length) return; - - const allMembers = (Array.isArray(state.assets) ? state.assets : []).filter( - (asset) => String(asset?.filename || "").trim().toLowerCase() === key, - ); - const count = Math.max( - Number(state.filenameCounts?.get?.(key) || 0) || 0, - allMembers.length, - ); - - // Select the best representative: prefer video_with_audio > video > image. - const selectedAsset = selectStackRepresentative(allMembers); - const selectedCard = renderedCards.find((card) => { - const cardAssetId = String(card._mjrAsset?.id || ""); - const selectedId = String(selectedAsset?.id || ""); - return cardAssetId && selectedId && cardAssetId === selectedId; - }) || renderedCards[0]; - const primaryCard = selectedCard || renderedCards[0] || null; - const primaryAsset = primaryCard?._mjrAsset || selectedAsset || allMembers[0] || null; - preserveRepresentativeGenerationTime(primaryAsset, allMembers); - - for (const card of renderedCards) { - delete card.dataset.mjrDupHidden; - const asset = card._mjrAsset; - if (asset) { - asset._mjrNameCollision = false; - delete asset._mjrNameCollisionCount; - delete asset._mjrNameCollisionPaths; - asset._mjrDupStack = false; - asset._mjrDupMembers = null; - asset._mjrDupCount = 0; - asset._mjrDupHidden = false; - } + for (const card of renderedSet || []) { + if (card?.dataset?.mjrDupHidden) delete card.dataset.mjrDupHidden; } - - if (!primaryCard || !primaryAsset || count < 2) { - for (const card of renderedCards) { - try { - // ... - } catch (e) { - console.debug?.(e); - } - } - return; - } - - primaryAsset._mjrDupStack = true; - primaryAsset._mjrDupMembers = allMembers.length ? allMembers : [primaryAsset]; - primaryAsset._mjrDupCount = primaryAsset._mjrDupMembers.length; - primaryAsset._mjrNameCollision = false; - - // Vue owns duplicate collapsing through `displayAssets`/`renderableAssets`. - // Hiding already-mounted flex children here leaves holes in virtual rows - // until the asset list recomputes, and can persist with recycled rows. } function syncAllRenderedDuplicateCards() { @@ -1200,8 +1169,25 @@ function bindCardRef(asset, node) { } } +// One ref callback per asset id. A fresh closure on every render makes Vue +// call the old ref with null and the new one with the element each time, +// which re-ran bindCardRef (and its side effects) on every render. +const cardRefCallbacks = new Map(); + function getCardRef(asset) { - return (node) => bindCardRef(asset, node); + const id = String(asset?.id ?? "").trim(); + if (!id) return (node) => bindCardRef(asset, node); + let entry = cardRefCallbacks.get(id); + if (!entry) { + entry = { asset, fn: null }; + entry.fn = (node) => { + bindCardRef(entry.asset, node); + if (!node) cardRefCallbacks.delete(id); + }; + cardRefCallbacks.set(id, entry); + } + entry.asset = asset; + return entry.fn; } function isInteractiveTarget(target, currentTarget) { diff --git a/ui/vue/composables/useVirtualGrid.ts b/ui/vue/composables/useVirtualGrid.ts index 67caa3f6..84db0fac 100644 --- a/ui/vue/composables/useVirtualGrid.ts +++ b/ui/vue/composables/useVirtualGrid.ts @@ -4,7 +4,7 @@ * This centralizes virtualization helpers that were previously split * across VirtualScroller.js and InfiniteScroll.js. */ -import { getFilenameKey, shouldHideSiblingAsset, unregisterHiddenSibling } from "../../features/grid/AssetCardRenderer.js"; +import { shouldHideSiblingAsset, unregisterHiddenSibling } from "../../features/grid/AssetCardRenderer.js"; import { gridQueryHasActiveFilters, readGridQueryFromDataset, @@ -683,53 +683,28 @@ function _shouldKeepExistingAssetOnFilterMismatch(incomingAsset: any, existingAs } function dedupeAssetsByKey(state: any, deps: any) { + // Drop only true duplicates (same id or same asset key). Grouping assets + // that merely share a file name is a *display* concern owned by + // `buildDisplayAssets` (same folder only); doing it here by file name + // alone removed unrelated files in other folders from `state.assets` and + // stacked them under the wrong card. const seenIds = new Set(); const seenKeys = new Set(); - const filenamePrimary = new Map(); const deduped: any[] = []; + let changed = false; for (const asset of Array.isArray(state?.assets) ? state.assets : []) { const assetId = asset?.id != null ? String(asset.id) : ""; const key = deps.assetKey(asset); - const filenameKey = getFilenameKey(asset?.filename); - if (assetId && seenIds.has(assetId)) continue; - if (key && seenKeys.has(key)) continue; - - if (filenameKey) { - const primary = filenamePrimary.get(filenameKey); - if (primary) { - const prevMembers = Array.isArray(primary._mjrDupMembers) ? primary._mjrDupMembers : [primary]; - const prevIds = new Set(prevMembers.map((a: any) => String(a?.id || ""))); - const merged = [ - ...prevMembers, - ...[asset].filter((a) => !prevIds.has(String(a?.id || ""))), - ]; - primary._mjrDupStack = true; - primary._mjrDupMembers = merged; - primary._mjrDupCount = merged.length; - primary._mjrNameCollision = false; - delete primary._mjrNameCollisionCount; - delete primary._mjrNameCollisionPaths; - - asset._mjrNameCollision = false; - delete asset._mjrNameCollisionCount; - delete asset._mjrNameCollisionPaths; - asset._mjrDupStack = false; - asset._mjrDupMembers = null; - asset._mjrDupCount = 0; - continue; - } + if ((assetId && seenIds.has(assetId)) || (key && seenKeys.has(key))) { + changed = true; + continue; } - if (assetId) seenIds.add(assetId); if (key) seenKeys.add(key); - if (filenameKey) filenamePrimary.set(filenameKey, asset); - - asset._mjrNameCollision = false; - delete asset._mjrNameCollisionCount; - delete asset._mjrNameCollisionPaths; deduped.push(asset); } - state.assets = deduped; + if (changed) state.assets = deduped; + // Always resync id/key sets: callers rely on it after placeholder merges. syncAssetCollectionState(state, { assetKey: deps.assetKey }); } diff --git a/ui/vue/grid/useGridDisplayAssets.ts b/ui/vue/grid/useGridDisplayAssets.ts index 0a7a7ee8..344ff477 100644 --- a/ui/vue/grid/useGridDisplayAssets.ts +++ b/ui/vue/grid/useGridDisplayAssets.ts @@ -1,4 +1,28 @@ -import { getFilenameKey } from "../../features/grid/AssetCardRenderer.js"; +import { toRaw } from "vue"; + +import { + getFilenameKey, + preserveRepresentativeGenerationTime, +} from "../../features/grid/AssetCardRenderer.js"; + +/** + * Single source of truth for the "duplicate stack" badge in the Vue grid. + * + * A duplicate is the same file name in the same source/root/subfolder (i.e. + * the same location on disk, typically duplicate index rows or case-only path + * variants). Files that merely share a name in *different* folders are + * distinct assets and are never stacked. + * + * This runs inside a `computed`, on reactive asset objects that the grid + * template reads (`_mjrDupStack`, `_mjrDupCount`). Every write is therefore + * guarded: a field is only assigned when its raw value actually differs, and + * the members array keeps its identity while membership is unchanged. + * Unconditional writes (a fresh array each pass, false->true flips) re-trigger + * the render that called us; in a production build Vue has no recursion + * limit, so that loop froze the whole ComfyUI tab. + */ + +const DUP_FIELDS_TO_DELETE = ["_mjrNameCollisionCount", "_mjrNameCollisionPaths"] as const; export function getDisplayGroupKey(asset: Record | null | undefined): string { const filenameKey = getFilenameKey(asset?.filename); @@ -13,54 +37,122 @@ export function isRenderableAsset(asset: any): boolean { return !!asset; } -export function buildDisplayAssets(assets: any[]): Record[] { +function setIfChanged(asset: any, key: string, value: unknown): void { + const raw = toRaw(asset); + if (raw?.[key] !== value) asset[key] = value; +} + +function deleteIfPresent(asset: any, key: string): void { + const raw = toRaw(asset); + if (raw && Object.prototype.hasOwnProperty.call(raw, key)) delete asset[key]; +} + +function sameMembers(previous: unknown, next: any[]): boolean { + if (!Array.isArray(previous) || previous.length !== next.length) return false; + for (let i = 0; i < next.length; i++) { + if (toRaw(previous[i]) !== toRaw(next[i])) return false; + } + return true; +} + +function clearDuplicateMarkers(asset: any): void { + setIfChanged(asset, "_mjrNameCollision", false); + for (const key of DUP_FIELDS_TO_DELETE) deleteIfPresent(asset, key); + setIfChanged(asset, "_mjrDupStack", false); + setIfChanged(asset, "_mjrDupMembers", null); + setIfChanged(asset, "_mjrDupCount", 0); +} + +function markRepresentative(rep: any, bucket: any[]): void { + for (const key of DUP_FIELDS_TO_DELETE) deleteIfPresent(rep, key); + setIfChanged(rep, "_mjrNameCollision", false); + setIfChanged(rep, "_mjrDupStack", true); + if (!sameMembers(toRaw(rep)?._mjrDupMembers, bucket)) { + rep._mjrDupMembers = bucket.slice(); + } + setIfChanged(rep, "_mjrDupCount", bucket.length); + // Only copies a value onto an empty field, so it is idempotent. + preserveRepresentativeGenerationTime(rep, bucket); +} + +export function buildDisplayAssets( + assets: any[], + { collapseDuplicates = true }: { collapseDuplicates?: boolean } = {}, +): Record[] { const list = Array.isArray(assets) ? assets : []; - const buckets = new Map(); + if (!collapseDuplicates) { + // e.g. the "Duplicates - N copies" view: show every copy individually. + const output: any[] = []; + for (const asset of list) { + if (!asset) continue; + clearDuplicateMarkers(asset); + output.push(asset); + } + return output; + } + + const buckets = new Map(); const output: any[] = []; for (const asset of list) { if (!asset) continue; - const filenameKey = getDisplayGroupKey(asset); - if (!filenameKey) { - asset._mjrNameCollision = false; - delete asset._mjrNameCollisionCount; - delete asset._mjrNameCollisionPaths; - asset._mjrDupStack = false; - asset._mjrDupMembers = null; - asset._mjrDupCount = 0; + const groupKey = getDisplayGroupKey(asset); + if (!groupKey) { + clearDuplicateMarkers(asset); output.push(asset); continue; } - let bucket = buckets.get(filenameKey); + let bucket = buckets.get(groupKey); if (!bucket) { bucket = []; - buckets.set(filenameKey, bucket); + buckets.set(groupKey, bucket); output.push(asset); } bucket.push(asset); } for (const bucket of buckets.values()) { + const rep = bucket[0]; for (const member of bucket) { - member._mjrNameCollision = false; - delete member._mjrNameCollisionCount; - delete member._mjrNameCollisionPaths; - member._mjrDupStack = false; - member._mjrDupMembers = null; - member._mjrDupCount = 0; - } - if (bucket.length >= 2) { - const rep = bucket[0]; - rep._mjrDupStack = true; - rep._mjrDupMembers = bucket.slice(); - rep._mjrDupCount = bucket.length; + if (member !== rep || bucket.length < 2) clearDuplicateMarkers(member); } + if (bucket.length >= 2) markRepresentative(rep, bucket); } return output; } export function getRenderableAssets(assets: unknown[]): Record[] { - return buildDisplayAssets(assets).filter(isRenderableAsset); + return buildDisplayAssets(assets as any[]).filter(isRenderableAsset); +} + +/** + * Plain, cycle-free copies of a duplicate stack's members for the + * "Duplicates" view. The representative lists itself in `_mjrDupMembers`, so + * handing the live objects to another view (Pinia state, a second grid) would + * share and re-mutate the same reactive graph. + */ +export function toDuplicateGroupMembers(members: unknown): Record[] { + const list = Array.isArray(members) ? members : []; + const out: Record[] = []; + const seen = new Set(); + for (const member of list) { + if (!member || typeof member !== "object") continue; + const copy: Record = { ...(toRaw(member) as Record) }; + delete copy._mjrDupMembers; + delete copy._mjrDupStack; + delete copy._mjrDupCount; + delete copy._mjrDupHidden; + delete copy._mjrNameCollision; + delete copy._mjrNameCollisionCount; + delete copy._mjrNameCollisionPaths; + const id = String(copy.id ?? ""); + if (id) { + if (seen.has(id)) continue; + seen.add(id); + } + out.push(copy); + } + return out; } From 6cafe5cc42ab5240664086c4bee09df2ac72c3d1 Mon Sep 17 00:00:00 2001 From: Ewald ALOEBOETOE <129623145+MajoorWaldi@users.noreply.github.com> Date: Wed, 4 Nov 2026 08:26:47 +0000 Subject: [PATCH 13/23] Fix search syntax errors, sidecar JSON, workflow JSON recognition, MFV media leak - Search: tokens were filtered down to nothing for inputs like "at-7", "(2)", "AND", a single letter or a lone quote, producing an empty FTS MATCH and "Invalid search query syntax". Fall back to the raw words, treat punctuation-only input as browse-all, keep non-Latin scripts and fold accents on Latin letters only (as FTS5 unicode61 does). - Sidecar JSON (..json, then .json) now supplies the workflow/prompt/generation data of images, videos and audio when none is embedded; shared with the 3D extractor; BOM tolerated. - Workflow tab: skip hidden folders (.history version snapshots were listed as workflows), only list UI exports, API prompts and wrappers, read with utf-8-sig, drop invalid JSON from the index (version 5), and load API-format workflows with app.loadApiJson. - Floating viewer: release (not just pause) videos before re-rendering and on dispose, so Live mode no longer accumulates media players. --- CHANGELOG.md | 7 + ...DjWZOB3Z.js => FloatingViewer-BnQlxpbB.js} | 648 +++++++++--------- ...hmLvE.js => LiveStreamTracker-H3ggC3_t.js} | 4 +- ....js => SidebarWorkflowSection-ChuiYnSl.js} | 12 +- ...tor-BydzUbtv.js => TagsEditor-Dnqx3KZU.js} | 6 +- ...{Viewer-DCWIIJQl.js => Viewer-DCtCnRSG.js} | 12 +- ...l-D964vdje.js => ViewerPortal--B3uXYnD.js} | 10 +- ...{events-B9CSrqJ_.js => events-cBMXVULQ.js} | 201 +++--- ...m.js => floatingViewerManager-Dx53diek.js} | 6 +- ...enInfo-B60U6rEQ.js => genInfo-BDmVkfQ1.js} | 6 +- ...sJ9YHaZ.js => model3dRenderer-B-J9oQzQ.js} | 2 +- ...uxBO.js => openMajoorSettings-LbIz63Ni.js} | 4 +- ...ide-DEEkMdvW.js => sideBySide-BLNTzu0A.js} | 2 +- ...0P9Y2.js => viewerOpenRequest-Qkm4zxCi.js} | 4 +- ...wo6l.js => viewerRuntimeHosts-CW2DfHq_.js} | 2 +- dist/entry.js | 36 +- docs/COMFYUI_INTEGRATION_AUDIT.md | 49 ++ mjr_am_backend/features/index/searcher.py | 66 +- .../features/metadata/extractors_3d.py | 81 +-- .../metadata/metadata_service_impl.py | 12 + mjr_am_backend/features/metadata/sidecar.py | 154 +++++ mjr_am_backend/features/workflows/service.py | 95 ++- tests/features/test_index_searcher.py | 2 +- tests/features/test_search_sanitizer.py | 32 +- .../test_workflow_json_recognition.py | 63 ++ tests/metadata/test_media_sidecar_json.py | 95 +++ ui/app/hostAdapter.ts | 64 +- ui/features/viewer/FloatingViewer.impl.ts | 5 +- ui/features/viewer/floatingViewerMedia.ts | 34 + .../floating_viewer_media_release.vitest.ts | 49 ++ ui/tests/host_adapter_contract.vitest.ts | 25 + 31 files changed, 1231 insertions(+), 557 deletions(-) rename dist/chunks/{FloatingViewer-DjWZOB3Z.js => FloatingViewer-BnQlxpbB.js} (94%) rename dist/chunks/{LiveStreamTracker-B3HhmLvE.js => LiveStreamTracker-H3ggC3_t.js} (97%) rename dist/chunks/{SidebarWorkflowSection-BMRq92Vq.js => SidebarWorkflowSection-ChuiYnSl.js} (99%) rename dist/chunks/{TagsEditor-BydzUbtv.js => TagsEditor-Dnqx3KZU.js} (97%) rename dist/chunks/{Viewer-DCWIIJQl.js => Viewer-DCtCnRSG.js} (99%) rename dist/chunks/{ViewerPortal-D964vdje.js => ViewerPortal--B3uXYnD.js} (97%) rename dist/chunks/{events-B9CSrqJ_.js => events-cBMXVULQ.js} (96%) rename dist/chunks/{floatingViewerManager-B_1xQj1m.js => floatingViewerManager-Dx53diek.js} (99%) rename dist/chunks/{genInfo-B60U6rEQ.js => genInfo-BDmVkfQ1.js} (99%) rename dist/chunks/{model3dRenderer-BsJ9YHaZ.js => model3dRenderer-B-J9oQzQ.js} (99%) rename dist/chunks/{openMajoorSettings-D92RuxBO.js => openMajoorSettings-LbIz63Ni.js} (99%) rename dist/chunks/{sideBySide-DEEkMdvW.js => sideBySide-BLNTzu0A.js} (99%) rename dist/chunks/{viewerOpenRequest-DaR0P9Y2.js => viewerOpenRequest-Qkm4zxCi.js} (90%) rename dist/chunks/{viewerRuntimeHosts-CkUqwo6l.js => viewerRuntimeHosts-CW2DfHq_.js} (99%) create mode 100644 mjr_am_backend/features/metadata/sidecar.py create mode 100644 tests/features/test_workflow_json_recognition.py create mode 100644 tests/metadata/test_media_sidecar_json.py create mode 100644 ui/tests/floating_viewer_media_release.vitest.ts diff --git a/CHANGELOG.md b/CHANGELOG.md index 6d76e98c..5388b6e5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -30,6 +30,13 @@ All notable changes to this project are documented in this file. ### Fixed - **`mjr_am_backend.adapters.tools` missing from Registry installs**: `.comfyignore`'s unanchored `tools/` pattern also matched `mjr_am_backend/adapters/tools/`, stripping the ExifTool/FFProbe adapters out of every Registry-published package and causing `ModuleNotFoundError: No module named 'mjr_am_backend.adapters.tools'` at startup. The pattern is now anchored to the repo-root `/tools/` dev-scripts folder only. +### Fixed (search, JSON, viewers) +- **Search errors while typing**: queries such as `at-7`, `(2)`, `AND`, `NOT x`, a single letter or a lone `"` returned "Invalid search query syntax" because every token was filtered out (stopword, 1-char, operator word) and an empty FTS `MATCH` was sent. Search now falls back to the raw words, treats punctuation-only input as browse-all, and keeps non-Latin scripts (Cyrillic, CJK...) that were stripped before; only Latin accents are folded, matching the FTS5 tokenizer. +- **Sidecar JSON for images, videos and audio**: `..json` or `.json` next to a media file now provides its workflow / prompt / generation data when nothing is embedded (previously 3D models only). Embedded metadata always wins; UTF-8 BOM is accepted. +- **Workflow tab listed non-workflows and version snapshots**: every `*.json` under a workflow root became a card, including `.history//.json` version snapshots and arbitrary JSON (settings, node configs). Hidden folders are skipped and only UI graph exports, API prompt graphs and `{workflow}`/`{prompt}` wrappers are listed (`workflow_format`: `ui`/`api`). BOM-prefixed workflows are no longer silently dropped; stale rows are purged (workflow index version 5). +- **API-format workflows opened as an empty canvas**: they are now loaded with ComfyUI's `app.loadApiJson`; `{workflow: ...}` exports are unwrapped. +- **Floating viewer leaked media players**: re-rendering (every generation in Live mode) and disposing only paused videos before detaching them; Chromium caps live media players, so videos could stop playing. Media is now released (src, ``, `load()`), as the main viewer already did. + ### Fixed (duplicate stacks) - **Clicking a duplicate-stack badge froze ComfyUI**: three passes (`displayAssets`, the per-card ref callback `syncRenderedDuplicateCards`, the live-upsert dedupe) each rewrote `_mjrDupStack` / `_mjrDupMembers` on reactive assets read by the grid template, with a fresh array on every pass and conflicting representatives. The ref callback ran on every render (a new closure each time), so every write scheduled another render: an endless update loop (production Vue has no recursion limit). Duplicate stacks are now computed in one place with change-guarded writes, card refs are stable, and the other passes no longer touch these fields. - **"Corrupted" duplicate stacks**: stacks were also built from the file name alone across folders, so unrelated files sharing a name (e.g. frame grabs `at-7.958s.png` from different videos) were stacked, hidden from the grid and given another file's generation time. A duplicate is now the same name in the same source/root/subfolder only. diff --git a/dist/chunks/FloatingViewer-DjWZOB3Z.js b/dist/chunks/FloatingViewer-BnQlxpbB.js similarity index 94% rename from dist/chunks/FloatingViewer-DjWZOB3Z.js rename to dist/chunks/FloatingViewer-BnQlxpbB.js index a84def20..4d006dec 100644 --- a/dist/chunks/FloatingViewer-DjWZOB3Z.js +++ b/dist/chunks/FloatingViewer-BnQlxpbB.js @@ -1,12 +1,12 @@ -import { $t as e, g as t, y as n } from "./viewerRuntimeHosts-CkUqwo6l.js"; -import { C as r, H as i, I as a, M as o, O as s, P as c, V as l, at as u, j as d, m as f, o as p, r as m, v as h, w as g, x as _, z as v } from "./events-B9CSrqJ_.js"; +import { $t as e, g as t, y as n } from "./viewerRuntimeHosts-CW2DfHq_.js"; +import { C as r, H as i, I as a, M as o, O as s, P as c, V as l, at as u, j as d, m as f, o as p, r as m, v as h, w as g, x as _, z as v } from "./events-cBMXVULQ.js"; import { a as y, i as b, o as x, s as S } from "./graphTraversal-DTdQWkn5.js"; -import { _ as C, g as w, m as T, n as E, p as ee, r as D, w as O } from "./Viewer-DCWIIJQl.js"; -import { r as k, v as A } from "./SidebarWorkflowSection-BMRq92Vq.js"; -import { _ as j, a as M, c as N, d as P, f as F, g as I, h as L, i as te, l as R, m as z, o as ne, p as B, r as re, s as V, t as ie, u as H, v as U } from "./openMajoorSettings-D92RuxBO.js"; -import { a as W, n as ae, r as oe } from "./model3dRenderer-BsJ9YHaZ.js"; +import { _ as C, g as w, m as T, n as E, p as ee, r as D, w as O } from "./Viewer-DCtCnRSG.js"; +import { r as k, v as A } from "./SidebarWorkflowSection-ChuiYnSl.js"; +import { _ as j, a as M, c as N, d as P, f as F, g as I, h as L, i as te, l as R, m as z, o as ne, p as B, r as re, s as V, t as ie, u as H, v as U } from "./openMajoorSettings-LbIz63Ni.js"; +import { a as W, n as ae, r as oe } from "./model3dRenderer-B-J9oQzQ.js"; import { i as se, o as ce, r as le, t as ue } from "./geninfoParser-CgHp-y-n.js"; -import { t as de } from "./genInfo-B60U6rEQ.js"; +import { t as de } from "./genInfo-BDmVkfQ1.js"; // ui/features/viewer/floatingViewerConstants.ts var G = Object.freeze({ SIMPLE: "simple", @@ -372,6 +372,28 @@ function Fe(e) { console.debug?.(e); } } +function Ie(e) { + if (e) try { + let t = e.querySelectorAll?.("video, audio"); + if (!t || !t.length) return; + for (let e of t) { + try { + e.pause?.(); + } catch (e) { + console.debug?.(e); + } + try { + e.removeAttribute?.("src"); + for (let t of Array.from(e.querySelectorAll?.("source") || [])) t.remove?.(); + e.load?.(); + } catch (e) { + console.debug?.(e); + } + } + } catch (e) { + console.debug?.(e); + } +} function Y(e, { fill: t = !1, controls: n = !0, initialMuted: r = !1, initialPlaybackRate: i = 1 } = {}) { let a = Ae(e); if (!a) return null; @@ -443,24 +465,24 @@ function Y(e, { fill: t = !1, controls: n = !0, initialMuted: r = !1, initialPla let u = document.createElement("img"); return u.className = s, u.src = a, u.alt = String(e?.filename || ""), u.draggable = !1, (o === "gif" || c) && Ee(u, e, { kind: o === "gif" ? "gif" : "animated-image" }) || u; } -function Ie(e, t, n, r, i, a) { +function Le(e, t, n, r, i, a) { e.beginPath(), typeof e.roundRect == "function" ? e.roundRect(t, n, r, i, a) : (e.moveTo(t + a, n), e.lineTo(t + r - a, n), e.quadraticCurveTo(t + r, n, t + r, n + a), e.lineTo(t + r, n + i - a), e.quadraticCurveTo(t + r, n + i, t + r - a, n + i), e.lineTo(t + a, n + i), e.quadraticCurveTo(t, n + i, t, n + i - a), e.lineTo(t, n + a), e.quadraticCurveTo(t, n, t + a, n), e.closePath()); } -function Le(e, t, n, r) { +function Re(e, t, n, r) { e.save(), e.font = "bold 10px system-ui, sans-serif"; let i = e.measureText(t).width; - e.fillStyle = "rgba(0,0,0,0.58)", Ie(e, n, r, i + 10, 18, 4), e.fill(), e.fillStyle = "#fff", e.fillText(t, n + 5, r + 13), e.restore(); + e.fillStyle = "rgba(0,0,0,0.58)", Le(e, n, r, i + 10, 18, 4), e.fill(), e.fillStyle = "#fff", e.fillText(t, n + 5, r + 13), e.restore(); } // ui/features/viewer/workflowSidebar/NodeWidgetRenderer.ts -var Re = /* @__PURE__ */ new Set([ +var ze = /* @__PURE__ */ new Set([ "imageupload", "button", "hidden" -]), ze = /\bnote\b|markdown/i; -function Be(e) { - return ze.test(String(e?.type || "")); -} +]), Be = /\bnote\b|markdown/i; function Ve(e) { + return Be.test(String(e?.type || "")); +} +function He(e) { let t = e?.properties ?? {}; if (typeof t.text == "string") return t.text; if (typeof t.value == "string") return t.value; @@ -468,35 +490,35 @@ function Ve(e) { let n = e?.widgets?.[0]; return n != null && n.value != null ? String(n.value) : ""; } -function He(e, t) { +function Ue(e, t) { let n = e?.properties; n && ("text" in n ? n.text = t : "value" in n ? n.value = t : "markdown" in n ? n.markdown = t : n.text = t); let r = e?.widgets?.[0]; r && (r.value = t); } -var Ue = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i, We = /^[0-9a-f]{20,}$/i; -function Ge(...e) { +var We = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i, Ge = /^[0-9a-f]{20,}$/i; +function Ke(...e) { for (let t of e) { let e = String(t || "").trim(); if (e) return e; } return ""; } -function Ke(e) { - return Ue.test(e) || We.test(e); -} function qe(e) { - return Ge(e?.title, e?.properties?.title, e?.properties?.name, e?.properties?.label, e?.name); + return We.test(e) || Ge.test(e); } -function Je(e, { isSubgraph: t = !1 } = {}) { - let n = String(e?.type || "").trim(), r = qe(e); - return (t || Ke(n)) && r ? r : Ke(n) ? "Subgraph" : n || r || `Node #${e?.id}`; +function Je(e) { + return Ke(e?.title, e?.properties?.title, e?.properties?.name, e?.properties?.label, e?.name); } -function Ye(e, t, { isSubgraph: n = !1 } = {}) { - let r = String(e?.type || "").trim(), i = qe(e); - return n && r && !Ke(r) && r !== t ? r : i && i !== r && i !== t ? i : ""; +function Ye(e, { isSubgraph: t = !1 } = {}) { + let n = String(e?.type || "").trim(), r = Je(e); + return (t || qe(n)) && r ? r : qe(n) ? "Subgraph" : n || r || `Node #${e?.id}`; } -var Xe = class { +function Xe(e, t, { isSubgraph: n = !1 } = {}) { + let r = String(e?.type || "").trim(), i = Je(e); + return n && r && !qe(r) && r !== t ? r : i && i !== r && i !== t ? i : ""; +} +var Ze = class { _node; _onLocate; _onToggle; @@ -523,7 +545,7 @@ var Xe = class { syncFromGraph() { if (this._noteTextarea) { if ((this._el?.ownerDocument || document)?.activeElement !== this._noteTextarea) { - let e = Ve(this._node); + let e = He(this._node); this._noteTextarea.value !== e && (this._noteTextarea.value = e, this._noteTextarea._mjrAutoFit?.()); } return; @@ -531,7 +553,7 @@ var Xe = class { if (!this._node?.widgets) return; let e = (this._el?.ownerDocument || document)?.activeElement || null; for (let t of this._node.widgets) { - let n = this._inputMap.get(t.name), r = Ze(n); + let n = this._inputMap.get(t.name), r = Qe(n); if (!r) continue; if (r.type === "checkbox") { let e = !!t.value; @@ -567,9 +589,9 @@ var Xe = class { r.className = "mjr-ws-node-title-wrap"; let i = document.createElement("span"); i.className = "mjr-ws-node-type"; - let a = Je(e, { isSubgraph: this._isSubgraph }); + let a = Ye(e, { isSubgraph: this._isSubgraph }); i.textContent = a, r.appendChild(i); - let o = Ye(e, a, { isSubgraph: this._isSubgraph }); + let o = Xe(e, a, { isSubgraph: this._isSubgraph }); if (o) { let e = document.createElement("span"); e.className = "mjr-ws-node-title", e.textContent = o, r.appendChild(e); @@ -589,14 +611,14 @@ var Xe = class { e.stopPropagation(), this._locateNode(); }), n.appendChild(s), t.appendChild(n); let c = document.createElement("div"); - if (c.className = "mjr-ws-node-body", Be(e)) { + if (c.className = "mjr-ws-node-body", Ve(e)) { let n = document.createElement("textarea"); - n.className = "mjr-ws-input mjr-ws-textarea mjr-ws-note-textarea", n.value = Ve(e), n.rows = 4; + n.className = "mjr-ws-input mjr-ws-textarea mjr-ws-note-textarea", n.value = He(e), n.rows = 4; let r = () => { n.style.height = "auto", n.style.height = n.scrollHeight + "px"; }; return n.addEventListener("input", () => { - He(e, n.value); + Ue(e, n.value); let t = e?.widgets?.[0], i = t?.inputEl ?? t?.element ?? t?.el ?? null; i != null && "value" in i && i.value !== n.value && (i.value = n.value), r(); try { @@ -607,7 +629,7 @@ var Xe = class { let l = e.widgets ?? [], u = !1; for (let t of l) { let n = String(t.type || "").toLowerCase(); - if (Re.has(n) || t.hidden || t.options?.hidden) continue; + if (ze.has(n) || t.hidden || t.options?.hidden) continue; u = !0; let r = n === "text" || n === "string" || n === "customtext", i = document.createElement("div"); i.className = r ? "mjr-ws-widget-row mjr-ws-widget-row--block" : "mjr-ws-widget-row"; @@ -656,11 +678,11 @@ var Xe = class { } } }; -function Ze(e) { +function Qe(e) { return e ? e.classList?.contains?.("mjr-ws-text-wrapper") ? e.querySelector?.("textarea") ?? e : e : null; } // ui/features/viewer/workflowSidebar/WorkflowNodesTab.ts -var Qe = class { +var $e = class { _searchQuery; _expandedNodeIds; _expandedChildrenIds; @@ -702,7 +724,7 @@ var Qe = class { }), t.appendChild(r), e.appendChild(t), this._list = document.createElement("div"), this._list.className = "mjr-ws-nodes-list", e.appendChild(this._list), e; } _syncCanvasSelection() { - let e = ot()[0] || "", t = null; + let e = st()[0] || "", t = null; for (let n of this._renderers) { let r = String(n._node?.id ?? "") === e; n.el?.classList?.toggle("is-selected-from-graph", r), r && (t = n); @@ -724,7 +746,7 @@ var Qe = class { } } _maybeRebuildList() { - let e = tt($e()), t = (this._searchQuery || "").toLowerCase().trim(), n = t ? nt(e, t) : e, r = rt(n); + let e = nt(et()), t = (this._searchQuery || "").toLowerCase().trim(), n = t ? rt(e, t) : e, r = it(n); if (r === this._lastNodeSig) this._syncCanvasSelection(); else { this._lastNodeSig = r; @@ -739,13 +761,13 @@ var Qe = class { for (let { node: i, children: a } of e) { let e = String(i?.id ?? ""), o = a.length, s = document.createElement("div"); s.className = "mjr-ws-tree-item", s.dataset.nodeId = e, s._mjrNodeId = e, s._mjrParentTreeItem = r || null, o > 0 && s.classList.add("mjr-ws-tree-item--subgraph"), n > 0 && s.classList.add("mjr-ws-tree-item--nested"); - let c = new Xe(i, { + let c = new Ze(i, { collapsible: !0, expanded: this._expandedNodeIds.has(e), depth: n, isSubgraph: o > 0, childCount: o, - onLocate: () => at(i), + onLocate: () => ot(i), onToggle: (t) => { if (t) { this._expandedNodeIds = /* @__PURE__ */ new Set([e]); @@ -755,7 +777,7 @@ var Qe = class { }); if (c._mjrTreeItemEl = s, this._renderers.push(c), s.appendChild(c.el), o > 0) { let t = this._expandedChildrenIds.has(e), r = document.createElement("button"); - r.type = "button", r.className = "mjr-ws-children-toggle", n > 0 && r.classList.add("mjr-ws-children-toggle--nested"), it(r, o, t); + r.type = "button", r.className = "mjr-ws-children-toggle", n > 0 && r.classList.add("mjr-ws-children-toggle--nested"), at(r, o, t); let i = document.createElement("div"); i.className = "mjr-ws-children", i.hidden = !t, s._mjrChildrenToggle = r, s._mjrChildrenEl = i, s._mjrChildCount = o, this._renderItems(a, i, n + 1, s), r.addEventListener("click", () => { this._setTreeItemChildrenOpen(s, i.hidden); @@ -767,7 +789,7 @@ var Qe = class { _setTreeItemChildrenOpen(e, t) { if (!e?._mjrChildrenEl || !e?._mjrChildrenToggle) return; let n = String(e._mjrNodeId || ""); - e._mjrChildrenEl.hidden = !t, n && (t ? this._expandedChildrenIds.add(n) : this._expandedChildrenIds.delete(n)), it(e._mjrChildrenToggle, Number(e._mjrChildCount) || 0, t); + e._mjrChildrenEl.hidden = !t, n && (t ? this._expandedChildrenIds.add(n) : this._expandedChildrenIds.delete(n)), at(e._mjrChildrenToggle, Number(e._mjrChildCount) || 0, t); } _openTreeBranch(e) { let t = e || null; @@ -778,23 +800,23 @@ var Qe = class { this._setTreeItemChildrenOpen(e, !0); } }; -function $e() { +function et() { try { return s(); } catch { return null; } } -function et(e) { +function tt(e) { return x(e); } -function tt(e, t = /* @__PURE__ */ new Set()) { +function nt(e, t = /* @__PURE__ */ new Set()) { if (!e || t.has(e)) return []; t.add(e); let n = b(e), r = []; for (let e of n) { if (!e) continue; - let n = et(e).flatMap((e) => tt(e, t)); + let n = tt(e).flatMap((e) => nt(e, t)); r.push({ node: e, children: n @@ -802,10 +824,10 @@ function tt(e, t = /* @__PURE__ */ new Set()) { } return r; } -function nt(e, t) { +function rt(e, t) { let n = []; for (let { node: r, children: i } of e) { - let e = (r.type || "").toLowerCase().includes(t) || (r.title || "").toLowerCase().includes(t), a = nt(i, t); + let e = (r.type || "").toLowerCase().includes(t) || (r.title || "").toLowerCase().includes(t), a = rt(i, t); (e || a.length > 0) && n.push({ node: r, children: a @@ -813,14 +835,14 @@ function nt(e, t) { } return n; } -function rt(e) { +function it(e) { let t = []; function n(e) { for (let { node: r, children: i } of e) t.push(r.id), t.push("["), n(i), t.push("]"); } return n(e), t.join(","); } -function it(e, t, n) { +function at(e, t, n) { let r = n ? "pi-chevron-down" : "pi-chevron-right"; e.textContent = ""; let i = document.createElement("i"); @@ -828,14 +850,14 @@ function it(e, t, n) { let a = document.createElement("span"); a.textContent = `${t} inner node${t === 1 ? "" : "s"}`, e.appendChild(a), e.setAttribute("aria-expanded", String(n)); } -function at(e) { +function ot(e) { try { r(e); } catch (e) { console.debug?.("[MFV] _focusNode", e); } } -function ot() { +function st() { try { return o(); } catch (e) { @@ -844,15 +866,15 @@ function ot() { return []; } // ui/features/viewer/workflowGraphMap/workflowGraphMapActions.ts -async function st(e) { +async function ct(e) { if (!e) return !1; - let t = JSON.stringify(ht(e), null, 2); + let t = JSON.stringify(gt(e), null, 2); return O(t); } -async function ct(e) { - return O(lt(e)); +async function lt(e) { + return O(ut(e)); } -function lt(e) { +function ut(e) { if (e == null) return ""; if (typeof e == "string") return e; if (typeof e == "number" || typeof e == "boolean") return String(e); @@ -862,10 +884,10 @@ function lt(e) { return String(e); } } -function ut(e) { +function dt(e) { return c(e); } -function dt(e) { +function ft(e) { let t = s(); if (!e || !t || typeof t.add != "function") return !1; let n = String(e?.type || e?.class_type || e?.comfyClass || "").trim(), r = null; @@ -877,19 +899,19 @@ function dt(e) { if (!r) return !1; try { let t = typeof structuredClone == "function" ? structuredClone(e) : JSON.parse(JSON.stringify(e)); - return gt(t, e), delete t.id, Array.isArray(t.pos) && (t.pos = [Number(t.pos[0] || 0) + 32, Number(t.pos[1] || 0) + 32]), typeof r.configure == "function" ? r.configure(t) : Object.assign(r, t), h(r); + return _t(t, e), delete t.id, Array.isArray(t.pos) && (t.pos = [Number(t.pos[0] || 0) + 32, Number(t.pos[1] || 0) + 32]), typeof r.configure == "function" ? r.configure(t) : Object.assign(r, t), h(r); } catch (e) { return console.debug?.("[MFV Graph Map] import node failed", e), !1; } } -function ft(e) { - let t = pt(); +function pt(e) { + let t = mt(); if (!e || !t) return { ok: !1, count: 0, reason: "no-target" }; - let n = mt(e), r = Array.isArray(t.widgets) ? t.widgets : []; + let n = ht(e), r = Array.isArray(t.widgets) ? t.widgets : []; if (!n.length || !r.length) return { ok: !1, count: 0, @@ -897,14 +919,14 @@ function ft(e) { }; let a = /* @__PURE__ */ new Map(); r.forEach((e, t) => { - for (let n of vt(e)) a.has(n) || a.set(n, { + for (let n of yt(e)) a.has(n) || a.set(n, { widget: e, index: t }); }); - let o = bt(R(e)), s = bt(t?.type || t?.comfyClass || t?.class_type), c = !!(o && s && o === s), l = /* @__PURE__ */ new Set(), u = 0; + let o = xt(R(e)), s = xt(t?.type || t?.comfyClass || t?.class_type), c = !!(o && s && o === s), l = /* @__PURE__ */ new Set(), u = 0; for (let e of n) { - let n = yt(e.label), i = n ? a.get(n) : null, o = e.index; + let n = bt(e.label), i = n ? a.get(n) : null, o = e.index; if ((!i || l.has(i.index)) && c && typeof o == "number" && Number.isInteger(o)) { let e = r[o]; e && (i = { @@ -921,30 +943,30 @@ function ft(e) { targetNode: t }; } -function pt() { +function mt() { return g() || null; } -function mt(e) { +function ht(e) { let t = N(e); return Array.isArray(t) && t.length ? t.map(([e, t]) => ({ label: e, value: t })) : P(e); } -function ht(e) { +function gt(e) { let t = typeof structuredClone == "function" ? structuredClone(e) : JSON.parse(JSON.stringify(e)); - return gt(t, e), t; + return _t(t, e), t; } -function gt(e, t) { +function _t(e, t) { let n = t?._mjrPromptInputs && typeof t._mjrPromptInputs == "object" ? t._mjrPromptInputs : null; if (n) { - let r = _t(t, n); + let r = vt(t, n); r && (e.widgets_values = r); } delete e._mjrPromptInputs, delete e._mjrSubgraphProxyParams; } -function _t(e, t) { - let n = bt(R(e)), r = P(e), i = new Map(r.map((e) => [yt(e.label), e.value])); +function vt(e, t) { + let n = xt(R(e)), r = P(e), i = new Map(r.map((e) => [bt(e.label), e.value])); if (n.includes("ksamplerselect")) return t.sampler_name == null ? null : [X(t.sampler_name)]; if (n.includes("ksampler")) { let e = t.control_after_generate ?? i.get("control_after_generate") ?? r[1]?.value; @@ -960,18 +982,18 @@ function _t(e, t) { } return null; } -function vt(e) { +function yt(e) { return [ e?.name, e?.label, e?.options?.name, e?.options?.label - ].map(yt).filter(Boolean); -} -function yt(e) { - return String(e ?? "").trim().toLowerCase().replace(/\s+/g, "_"); + ].map(bt).filter(Boolean); } function bt(e) { + return String(e ?? "").trim().toLowerCase().replace(/\s+/g, "_"); +} +function xt(e) { return String(e ?? "").trim().toLowerCase(); } function X(e) { @@ -983,7 +1005,7 @@ function X(e) { } } // ui/features/viewer/workflowGraphMap/WorkflowGraphMapPanel.ts -var xt = 64, St = class { +var St = 64, Ct = class { constructor({ large: e = !1 } = {}) { this._asset = null, this._workflow = null, this._selectedNodeId = "", this._renderInfo = null, this._resizeObserver = null, this._resizeObservedTarget = null, this._resizeObserverWindow = null, this._large = !!e, this._view = { zoom: 1, @@ -1055,14 +1077,14 @@ var xt = 64, St = class { _renderDetails() { let e = this._subgraphDisplayMode !== "host", t = F(this._workflow, { includeSubgraphs: e }).length; if (!this._workflow) { - this._status.textContent = this._large ? "No workflow graph in selected image" : "Selected asset - no workflow graph", Ct(this._details); + this._status.textContent = this._large ? "No workflow graph in selected image" : "Selected asset - no workflow graph", wt(this._details); return; } this._status.textContent = this._large ? this._selectedNodeId ? `${t} nodes (${this._subgraphDisplayMode}) - selected #${this._selectedNodeId}` : `${t} nodes (${this._subgraphDisplayMode}) - select a node` : `${t} nodes - graph opened in viewer`; let n = ne(this._workflow, this._selectedNodeId, { includeSubgraphs: e }); if (!n) { let e = document.createElement("div"); - e.className = "mjr-ws-sidebar-empty", e.textContent = this._large ? "Click a node in the graph map" : "Use the large Graph Map in the viewer to select nodes", Ct(this._details, e); + e.className = "mjr-ws-sidebar-empty", e.textContent = this._large ? "Click a node in the graph map" : "Use the large Graph Map in the viewer to select nodes", wt(this._details, e); return; } let r = document.createElement("div"); @@ -1070,9 +1092,9 @@ var xt = 64, St = class { let i = document.createElement("div"); i.className = "mjr-wgm-node-meta", i.textContent = `#${this._selectedNodeId} ${H(n) || R(n) || "Node"}`; let a = this._buildBreadcrumb(n), o = document.createElement("div"); - o.className = "mjr-wgm-actions", o.appendChild(this._makeAction("Copy node", "pi pi-copy", () => st(n))), o.appendChild(this._makeAction("Import node", "pi pi-plus-circle", () => dt(n))), o.appendChild(this._makeAction("Import workflow", "pi pi-download", () => ut(this._workflow))), o.appendChild(this._makeAction("Transfer params to selected canvas node", "pi pi-arrow-right-arrow-left", () => ft(n)?.ok)); + o.className = "mjr-wgm-actions", o.appendChild(this._makeAction("Copy node", "pi pi-copy", () => ct(n))), o.appendChild(this._makeAction("Import node", "pi pi-plus-circle", () => ft(n))), o.appendChild(this._makeAction("Import workflow", "pi pi-download", () => dt(this._workflow))), o.appendChild(this._makeAction("Transfer params to selected canvas node", "pi pi-arrow-right-arrow-left", () => pt(n)?.ok)); let s = this._buildNodeVisual(n); - Ct(this._details, r, i, a, s, o); + wt(this._details, r, i, a, s, o); } _makeModeButton(e, t) { let n = document.createElement("button"); @@ -1101,7 +1123,7 @@ var xt = 64, St = class { } _buildNodeVisual(e) { let t = document.createElement("section"); - t.className = "mjr-wgm-node-visual", t.classList.add(`is-${Nt(e)}`); + t.className = "mjr-wgm-node-visual", t.classList.add(`is-${Pt(e)}`); let n = document.createElement("div"); n.className = "mjr-wgm-node-visual-header"; let r = document.createElement("span"); @@ -1116,7 +1138,7 @@ var xt = 64, St = class { c.className = "mjr-wgm-node-widgets"; let l = document.createElement("div"); l.className = "mjr-wgm-node-widgets-title", l.textContent = "Widgets", c.appendChild(l); - let u = Mt(e); + let u = Nt(e); if (u.length) { for (let e of u.slice(0, 12)) { let t = document.createElement("div"); @@ -1127,8 +1149,8 @@ var xt = 64, St = class { r.className = "mjr-wgm-node-widget-key", r.textContent = n; let i = document.createElement("span"); i.className = "mjr-wgm-node-widget-value"; - let a = Tt(e?.value); - i.textContent = a, Et(e?.value, a) && t.classList.add("is-multiline"), Dt(n) && t.classList.add("is-text-field"), t.append(r, i), t.addEventListener("click", () => this._copyParam(t, e?.value)), t.addEventListener("keydown", (n) => { + let a = Et(e?.value); + i.textContent = a, Dt(e?.value, a) && t.classList.add("is-multiline"), Ot(n) && t.classList.add("is-text-field"), t.append(r, i), t.addEventListener("click", () => this._copyParam(t, e?.value)), t.addEventListener("keydown", (n) => { (n.key === "Enter" || n.key === " ") && (n.preventDefault?.(), this._copyParam(t, e?.value)); }), c.appendChild(t); } @@ -1149,7 +1171,7 @@ var xt = 64, St = class { i.className = "mjr-wgm-node-ports-title", i.textContent = String(e), r.appendChild(i); let a = document.createElement("div"); a.className = "mjr-wgm-node-ports-list"; - let o = Ot(t).slice(0, 8); + let o = kt(t).slice(0, 8); if (o.length) for (let e of o) { let t = document.createElement("div"); t.className = "mjr-wgm-node-port"; @@ -1157,7 +1179,7 @@ var xt = 64, St = class { r.className = `mjr-wgm-node-port-dot is-${n}`; let i = document.createElement("span"); i.className = "mjr-wgm-node-port-name"; - let o = At(e); + let o = jt(e); if (i.textContent = o.label, t.append(r, i), o.type) { let e = document.createElement("span"); e.className = "mjr-wgm-node-port-type", e.textContent = o.type, t.appendChild(e); @@ -1183,7 +1205,7 @@ var xt = 64, St = class { } async _copyParam(e, t) { try { - let n = await ct(t); + let n = await lt(t); e.classList.toggle("is-ok", !!n), e.classList.toggle("is-error", !n), Z(e).setTimeout(() => { e.classList.remove("is-ok"), e.classList.remove("is-error"); }, 750); @@ -1193,9 +1215,9 @@ var xt = 64, St = class { } _renderPreview() { if (!this._preview) return; - let e = Pt(this._asset), t = Ft(e); + let e = Ft(this._asset), t = It(e); if (this._previewMedia && t && t === this._previewKey) { - (this._preview.firstChild !== this._previewMedia || this._preview.childNodes.length !== 1) && Ct(this._preview, this._previewMedia); + (this._preview.firstChild !== this._previewMedia || this._preview.childNodes.length !== 1) && wt(this._preview, this._previewMedia); return; } this._disposePreviewMedia(); @@ -1205,7 +1227,7 @@ var xt = 64, St = class { return; } let r = document.createElement("div"); - r.className = "mjr-wgm-preview-empty", r.textContent = "No preview", Ct(this._preview, r); + r.className = "mjr-wgm-preview-empty", r.textContent = "No preview", wt(this._preview, r); } _disposePreviewMedia() { let e = this._previewMedia; @@ -1232,7 +1254,7 @@ var xt = 64, St = class { _handleWheel(e) { if (!this._workflow) return; e.preventDefault?.(); - let t = (Number(e.deltaY) > 0 ? -1 : 1) > 0 ? 1.18 : 1 / 1.18, n = Number(this._view.zoom || 1), r = Math.max(1, Math.min(xt, n * t)); + let t = (Number(e.deltaY) > 0 ? -1 : 1) > 0 ? 1.18 : 1 / 1.18, n = Number(this._view.zoom || 1), r = Math.max(1, Math.min(St, n * t)); if (r === n) return; let i = this._renderInfo?.resolvedView; if (i?.renderScale && i?.viewMinX != null && i?.viewMinY != null) { @@ -1254,7 +1276,7 @@ var xt = 64, St = class { let i = this._renderInfo; if (!i?.bounds) return; let { bounds: a } = i, o = Math.max(1, a.maxX - a.minX), s = Math.max(1, a.maxY - a.minY), c = o / Math.max(1, n * 2), l = s / Math.max(1, r * 2); - this._view.zoom = Math.max(1, Math.min(xt, Math.min(c, l))), this._view.centerX = e + n / 2, this._view.centerY = t + r / 2, this.refresh(); + this._view.zoom = Math.max(1, Math.min(St, Math.min(c, l))), this._view.centerX = e + n / 2, this._view.centerY = t + r / 2, this.refresh(); } _handlePointerDown(e) { if (!this._workflow || e.button !== 0) return; @@ -1287,13 +1309,13 @@ var xt = 64, St = class { function Z(e) { return e?.ownerDocument?.defaultView || window; } -function Ct(e, ...t) { +function wt(e, ...t) { if (e) { for (; e.firstChild;) e.removeChild(e.firstChild); for (let n of t) e.appendChild(n); } } -function wt(e) { +function Tt(e) { if (e == null) return ""; if (typeof e == "string") return e.replace(/\s+/g, " ").trim(); if (typeof e == "number" || typeof e == "boolean") return String(e); @@ -1303,38 +1325,38 @@ function wt(e) { return String(e); } } -function Tt(e) { - return e == null ? "" : typeof e == "string" ? e.replace(/\r\n?/g, "\n").trim() : wt(e); +function Et(e) { + return e == null ? "" : typeof e == "string" ? e.replace(/\r\n?/g, "\n").trim() : Tt(e); } -function Et(e, t) { +function Dt(e, t) { if (typeof e != "string") return !1; let n = String(t || ""); return n.includes("\n") || n.length > 120; } -function Dt(e) { +function Ot(e) { let t = String(e || "").toLowerCase().replace(/[^a-z0-9]/g, ""); return t ? t === "text" || t === "prompt" || t === "positive" || t === "negative" || t === "string" || t === "caption" : !1; } -function Ot(e) { - return Array.isArray(e) ? e.filter((e) => e && !kt(e)).map((e) => ({ +function kt(e) { + return Array.isArray(e) ? e.filter((e) => e && !At(e)).map((e) => ({ name: String(e?.name || e?.label || "").trim(), type: String(e?.type || e?.slot_type || e?.data_type || "").trim() })) : []; } -function kt(e) { +function At(e) { return !e || typeof e != "object" ? !1 : !!(e.widget === !0 || e.widget && typeof e.widget == "object" || typeof e.widget == "string" && e.widget.trim() || e.widget_index != null || e.widgetIndex != null); } -function At(e) { - let t = String(e?.name || e?.label || e?.type || "port").trim() || "port", n = String(e?.type || "").trim(), r = jt(t), i = jt(n); +function jt(e) { + let t = String(e?.name || e?.label || e?.type || "port").trim() || "port", n = String(e?.type || "").trim(), r = Mt(t), i = Mt(n); return { label: t, type: i && i !== r ? n : "" }; } -function jt(e) { +function Mt(e) { return String(e || "").toLowerCase().replace(/[^a-z0-9]/g, ""); } -function Mt(e) { +function Nt(e) { let t = N(e), n = Array.isArray(t) ? t.map(([e, t]) => ({ label: e, value: t @@ -1347,11 +1369,11 @@ function Mt(e) { value: e?.value })) : []; } -function Nt(e) { +function Pt(e) { let t = `${String(R(e) || "").toLowerCase()} ${String(H(e) || "").toLowerCase()}`; return t.trim() ? /ksampler|sampler|scheduler|cfg|steps|noise|seed/.test(t) ? "sampler" : /checkpoint|clip|vae|unet|lora|model|loader/.test(t) ? "model" : /text|prompt|token|encode|decoder|caption|florence/.test(t) ? "text" : /latent|image|mask|video|audio|preview|save|load|upscale/.test(t) ? "media" : /controlnet|conditioning|guidance|adapter|ipadapter/.test(t) ? "control" : /math|logic|switch|merge|concat|combine|route|branch|reroute/.test(t) ? "logic" : "generic" : "generic"; } -function Pt(e) { +function Ft(e) { if (!e || typeof e != "object") return e; let t = (Array.isArray(e.previewCandidates) ? e.previewCandidates : []).find((e) => String(e || "").trim()) || e.url || "", n = String(e.type || "").toLowerCase(), r = String(e.kind || "").toLowerCase(), i = String(e.filename || e.name || ""), a = r || (e.isVideo || n === "video" || /\.(mp4|mov|webm|mkv|avi)$/i.test(i) ? "video" : e.isAudio || n === "audio" || /\.(mp3|wav|flac|ogg|m4a|aac|opus|wma)$/i.test(i) ? "audio" : e.isModel3d || n === "model3d" ? "model3d" : ""); return { @@ -1363,7 +1385,7 @@ function Pt(e) { } : null }; } -function Ft(e) { +function It(e) { return !e || typeof e != "object" ? "" : JSON.stringify({ url: String(e.url || ""), filename: String(e.filename || e.name || ""), @@ -1373,7 +1395,7 @@ function Ft(e) { }); } // ui/features/viewer/workflowSidebar/WorkflowSidebar.ts -var It = 16, Lt = 250, Rt = class { +var Lt = 16, Rt = 250, zt = class { _hostEl; _onClose; _onOpenGraphMap; @@ -1392,7 +1414,7 @@ var It = 16, Lt = 250, Rt = class { _nodesModeBtn; _graphModeBtn; constructor({ hostEl: e, onClose: t, onOpenGraphMap: n, onCloseGraphMap: r } = {}) { - this._hostEl = e, this._onClose = t ?? null, this._onOpenGraphMap = n ?? null, this._onCloseGraphMap = r ?? null, this._visible = !1, this._liveSyncHandle = null, this._liveSyncMode = "", this._lastLiveSyncAt = 0, this._resizeCleanup = null, this._nodesTab = new Qe(), this._graphMapPanel = new St(), this._activeMode = "nodes", this._asset = null, this._body = null, this._nodesModeBtn = null, this._graphModeBtn = null, this._el = this._build(); + this._hostEl = e, this._onClose = t ?? null, this._onOpenGraphMap = n ?? null, this._onCloseGraphMap = r ?? null, this._visible = !1, this._liveSyncHandle = null, this._liveSyncMode = "", this._lastLiveSyncAt = 0, this._resizeCleanup = null, this._nodesTab = new $e(), this._graphMapPanel = new Ct(), this._activeMode = "nodes", this._asset = null, this._body = null, this._nodesModeBtn = null, this._graphModeBtn = null, this._el = this._build(); } get el() { return this._el; @@ -1401,7 +1423,7 @@ var It = 16, Lt = 250, Rt = class { return this._visible; } show() { - this._visible = !0, this._el.classList.add("open"), this.refresh(), this._lastLiveSyncAt = Bt(this._el), this._startLiveSync(); + this._visible = !0, this._el.classList.add("open"), this.refresh(), this._lastLiveSyncAt = Vt(this._el), this._startLiveSync(); } hide() { this._visible = !1, this._el.classList.remove("open"), this._stopLiveSync(); @@ -1460,16 +1482,16 @@ var It = 16, Lt = 250, Rt = class { } _startLiveSync() { if (this._liveSyncHandle != null) return; - let e = zt(this._el), t = (e) => { + let e = Bt(this._el), t = (e) => { if (this._liveSyncHandle = null, this._liveSyncMode = "", !this._visible) return; - let t = Number.isFinite(Number(e)) ? Number(e) : Bt(this._el); - t - this._lastLiveSyncAt >= Lt && (this._lastLiveSyncAt = t, this.syncFromGraph()), this._startLiveSync(); + let t = Number.isFinite(Number(e)) ? Number(e) : Vt(this._el); + t - this._lastLiveSyncAt >= Rt && (this._lastLiveSyncAt = t, this.syncFromGraph()), this._startLiveSync(); }; - typeof e.requestAnimationFrame == "function" ? (this._liveSyncMode = "raf", this._liveSyncHandle = e.requestAnimationFrame(t)) : (this._liveSyncMode = "timeout", this._liveSyncHandle = e.setTimeout(t, It)); + typeof e.requestAnimationFrame == "function" ? (this._liveSyncMode = "raf", this._liveSyncHandle = e.requestAnimationFrame(t)) : (this._liveSyncMode = "timeout", this._liveSyncHandle = e.setTimeout(t, Lt)); } _stopLiveSync() { if (this._liveSyncHandle == null) return; - let e = zt(this._el); + let e = Bt(this._el); try { this._liveSyncMode === "raf" && typeof e.cancelAnimationFrame == "function" ? e.cancelAnimationFrame(this._liveSyncHandle) : typeof e.clearTimeout == "function" && e.clearTimeout(this._liveSyncHandle); } catch (e) { @@ -1505,11 +1527,11 @@ var It = 16, Lt = 250, Rt = class { this._resizeCleanup = null; } }; -function zt(e) { +function Bt(e) { return e?.ownerDocument?.defaultView || (typeof window < "u" ? window : globalThis); } -function Bt(e) { - let t = zt(e), n = t?.performance?.now; +function Vt(e) { + let t = Bt(e), n = t?.performance?.now; if (typeof n == "function") try { return Number(n.call(t.performance)) || Date.now(); } catch { @@ -1523,19 +1545,19 @@ var Q = Object.freeze({ RUNNING: "running", STOPPING: "stopping", ERROR: "error" -}), Vt = /* @__PURE__ */ new Set([ +}), Ht = /* @__PURE__ */ new Set([ "default", "auto", "latent2rgb", "taesd", "none" -]), Ht = "progress-update", Ut = (e, t = "") => f(e, t, void 0); -function Wt() { +]), Ut = "progress-update", Wt = (e, t = "") => f(e, t, void 0); +function Gt() { let e = document.createElement("div"); e.className = "mjr-mfv-run-controls"; let t = document.createElement("button"); t.type = "button", t.className = "mjr-icon-btn mjr-mfv-run-btn"; - let n = Ut("tooltip.queuePrompt", "Queue Prompt (Run)"); + let n = Wt("tooltip.queuePrompt", "Queue Prompt (Run)"); t.title = n, t.setAttribute("aria-label", n); let r = document.createElement("i"); r.className = "pi pi-play", r.setAttribute("aria-hidden", "true"), t.appendChild(r); @@ -1551,7 +1573,7 @@ function Wt() { s = e, t.classList.toggle("running", s === Q.RUNNING), t.classList.toggle("stopping", s === Q.STOPPING), t.classList.toggle("error", s === Q.ERROR), t.disabled = s === Q.RUNNING || s === Q.STOPPING, i.disabled = !n || s === Q.STOPPING, i.classList.toggle("active", n && s !== Q.STOPPING), i.classList.toggle("stopping", s === Q.STOPPING), s === Q.RUNNING || s === Q.STOPPING ? r.className = "pi pi-spin pi-spinner" : r.className = "pi pi-play"; } function m() { - let e = Ut("tooltip.queueStop", "Stop Generation"); + let e = Wt("tooltip.queueStop", "Stop Generation"); i.title = e, i.setAttribute("aria-label", e); } function h(e = U.getSnapshot(), { authoritative: t = !1 } = {}) { @@ -1579,7 +1601,7 @@ function Wt() { if (s !== Q.RUNNING && s !== Q.STOPPING) { c = !0, l = !1, h(); try { - (await Xt())?.tracked || (c = !1), h(); + (await Zt())?.tracked || (c = !1), h(); } catch (e) { console.error?.("[MFV Run]", e), g(); } @@ -1599,21 +1621,21 @@ function Wt() { let b = (e) => { h(e?.detail || U.getSnapshot(), { authoritative: !0 }); }; - return U.addEventListener(Ht, b), j({ timeoutMs: 4e3 }).catch((e) => { + return U.addEventListener(Ut, b), j({ timeoutMs: 4e3 }).catch((e) => { console.debug?.(e); }), h(), { el: e, dispose() { - f(), t.removeEventListener("click", v), i.removeEventListener("click", y), U.removeEventListener(Ht, b); + f(), t.removeEventListener("click", v), i.removeEventListener("click", y), U.removeEventListener(Ut, b); } }; } -function Gt(e = p.MFV_PREVIEW_METHOD) { +function Kt(e = p.MFV_PREVIEW_METHOD) { let t = String(e || "").trim().toLowerCase(); - return Vt.has(t) ? t : p.MFV_PREVIEW_METHOD || "auto"; + return Ht.has(t) ? t : p.MFV_PREVIEW_METHOD || "auto"; } -function Kt(e, t = p.MFV_PREVIEW_METHOD) { - let n = Gt(t), r = { +function qt(e, t = p.MFV_PREVIEW_METHOD) { + let n = Kt(t), r = { ...e?.extra_data || {}, extra_pnginfo: { ...e?.extra_data?.extra_pnginfo || {} } }; @@ -1622,14 +1644,14 @@ function Kt(e, t = p.MFV_PREVIEW_METHOD) { extra_data: r }; } -function qt(e, { previewMethod: t = p.MFV_PREVIEW_METHOD, clientId: n = null } = {}) { - let r = Kt(e, t), i = { +function Jt(e, { previewMethod: t = p.MFV_PREVIEW_METHOD, clientId: n = null } = {}) { + let r = qt(e, t), i = { prompt: r?.output, extra_data: r?.extra_data || {} }, a = String(n || "").trim(); return a && (i.client_id = a), i; } -function Jt(e) { +function Yt(e) { let t = e?.constructor; return [ e?.type, @@ -1638,16 +1660,16 @@ function Jt(e) { t?.type ].some((e) => /Api$/i.test(String(e || "").trim())); } -function Yt(e) { +function Xt(e) { let t = !1; return S(e, ({ node: e }) => { - t ||= Jt(e); + t ||= Yt(e); }), t; } -async function Xt() { +async function Zt() { let e = d(); if (!e) throw Error("ComfyUI app not available"); - let t = Yt(y(e)); + let t = Xt(y(e)); return { tracked: await l({ app: e, forceNativeQueue: t, @@ -1655,15 +1677,15 @@ async function Xt() { return typeof e?.graphToPrompt == "function" ? e.graphToPrompt() : null; }, enrichPromptData(e) { - return Kt(e); + return qt(e); }, buildPromptRequestBody(e, t) { - return qt(e, { clientId: t.clientId }); + return Jt(e, { clientId: t.clientId }); } }) }; } // ui/features/viewer/floatingViewerUi.ts -function Zt(e) { +function Qt(e) { let t = e?.models; if (!t || typeof t != "object") return ""; let n = [ @@ -1681,11 +1703,11 @@ function Zt(e) { } return i.join(" | "); } -function Qt(e) { +function $t(e) { let t = ue(e); return t.workflowLabel ? [t.workflowLabel, t.workflowBadge].filter(Boolean).join(" | ") : ""; } -function $t(e, t, n, r) { +function en(e, t, n, r) { let i = document.createElement("div"); i.className = "mjr-mfv-idrop"; let a = document.createElement("button"); @@ -1733,21 +1755,21 @@ function $t(e, t, n, r) { } }; } -var en = { +var tn = { rgb: "#e0e0e0", r: "#ff5555", g: "#44dd66", b: "#5599ff", a: "#ffffff", l: "#bbbbbb" -}, tn = { +}, nn = { rgb: "RGB", r: "R", g: "G", b: "B", a: "A", l: "L" -}, nn = { +}, rn = { rgb: "500", r: "700", g: "700", @@ -1755,9 +1777,9 @@ var en = { a: "700", l: "400" }; -function rn(e) { +function an(e) { let t = document.createElement("div"); - return t.className = "mjr-mfv", t.setAttribute("role", "dialog"), t.setAttribute("aria-modal", "false"), t.setAttribute("aria-hidden", "true"), e.element = t, t.appendChild(e._buildHeader()), t.setAttribute("aria-labelledby", e._titleId), t.appendChild(e._buildToolbar()), t.appendChild(L(e)), e._contentWrapper = document.createElement("div"), e._contentWrapper.className = "mjr-mfv-content-wrapper", e._applySidebarPosition(), e._contentEl = document.createElement("div"), e._contentEl.className = "mjr-mfv-content", e._contentWrapper.appendChild(e._contentEl), e._overlayCanvas = document.createElement("canvas"), e._overlayCanvas.className = "mjr-mfv-overlay-canvas", e._contentEl.appendChild(e._overlayCanvas), e._contentEl.appendChild(z(e)), e._genSidebarEl = document.createElement("aside"), e._genSidebarEl.className = "mjr-mfv-gen-sidebar", e._genSidebarEl.setAttribute("aria-label", "Generation info"), e._genSidebarEl.setAttribute("hidden", ""), e._sidebar = new Rt({ + return t.className = "mjr-mfv", t.setAttribute("role", "dialog"), t.setAttribute("aria-modal", "false"), t.setAttribute("aria-hidden", "true"), e.element = t, t.appendChild(e._buildHeader()), t.setAttribute("aria-labelledby", e._titleId), t.appendChild(e._buildToolbar()), t.appendChild(L(e)), e._contentWrapper = document.createElement("div"), e._contentWrapper.className = "mjr-mfv-content-wrapper", e._applySidebarPosition(), e._contentEl = document.createElement("div"), e._contentEl.className = "mjr-mfv-content", e._contentWrapper.appendChild(e._contentEl), e._overlayCanvas = document.createElement("canvas"), e._overlayCanvas.className = "mjr-mfv-overlay-canvas", e._contentEl.appendChild(e._overlayCanvas), e._contentEl.appendChild(z(e)), e._genSidebarEl = document.createElement("aside"), e._genSidebarEl.className = "mjr-mfv-gen-sidebar", e._genSidebarEl.setAttribute("aria-label", "Generation info"), e._genSidebarEl.setAttribute("hidden", ""), e._sidebar = new zt({ hostEl: t, onClose: () => e._updateSettingsBtnState(!1), onOpenGraphMap: () => e.setMode?.(G.GRAPH), @@ -1768,7 +1790,7 @@ function rn(e) { t?.detail?.key === "viewer.mfvSidebarPosition" && e._applySidebarPosition(); }, window.addEventListener("mjr-settings-changed", e._onSidebarPosChanged), e._refresh(), t; } -function an(e) { +function on(e) { let t = document.createElement("div"); t.className = "mjr-mfv-header"; let n = document.createElement("span"); @@ -1782,7 +1804,7 @@ function an(e) { let o = document.createElement("i"); return o.className = "pi pi-times", o.setAttribute("aria-hidden", "true"), a.appendChild(o), t.appendChild(n), t.appendChild(a), t; } -function on(e) { +function sn(e) { let t = (e, { min: t, max: n, step: r, value: i } = {}) => { let a = document.createElement("div"); a.className = "mjr-mfv-toolbar-range"; @@ -1796,7 +1818,7 @@ function on(e) { }; }, n = document.createElement("div"); n.className = "mjr-mfv-toolbar"; - let r = $t("", f("viewer.mode", "Viewer mode"), [ + let r = en("", f("viewer.mode", "Viewer mode"), [ { value: G.SIMPLE, html: `${f("viewer.mode.simple", "Simple")}` @@ -1911,7 +1933,7 @@ function on(e) { let x = (e) => { if (!e || e === "rgb") y.replaceChildren(b); else { - let t = en[e] || "#e0e0e0", n = nn[e] || "500", r = tn[e] || e.toUpperCase(), i = document.createElement("span"); + let t = tn[e] || "#e0e0e0", n = rn[e] || "500", r = nn[e] || e.toUpperCase(), i = document.createElement("span"); i.className = "mjr-mfv-ch-label", i.style.color = t, i.style.fontWeight = n, i.textContent = r, y.replaceChildren(i); } }, S = document.createElement("div"); @@ -2087,7 +2109,7 @@ function on(e) { let ie = f("tooltip.nodeParams", "Node Parameters"); e._settingsBtn.title = ie, e._settingsBtn.setAttribute("aria-label", ie), e._settingsBtn.setAttribute("aria-pressed", "false"); let H = document.createElement("i"); - H.className = "pi pi-sliders-h", H.setAttribute("aria-hidden", "true"), e._settingsBtn.appendChild(H), n.appendChild(e._settingsBtn), e._runHandle = Wt(), n.appendChild(e._runHandle.el), e._majoorSettingsBtn = document.createElement("button"), e._majoorSettingsBtn.type = "button", e._majoorSettingsBtn.className = "mjr-icon-btn mjr-mfv-majoor-settings-btn"; + H.className = "pi pi-sliders-h", H.setAttribute("aria-hidden", "true"), e._settingsBtn.appendChild(H), n.appendChild(e._settingsBtn), e._runHandle = Gt(), n.appendChild(e._runHandle.el), e._majoorSettingsBtn = document.createElement("button"), e._majoorSettingsBtn.type = "button", e._majoorSettingsBtn.className = "mjr-icon-btn mjr-mfv-majoor-settings-btn"; let U = f("tooltip.openMajoorSettings", "Open Majoor Assets Manager settings"); e._majoorSettingsBtn.title = U, e._majoorSettingsBtn.setAttribute("aria-label", U); let W = document.createElement("i"); @@ -2096,7 +2118,7 @@ function on(e) { e._chPopover?.classList?.contains("is-open") && !e._chBtn?.contains?.(n) && !e._chPopover.contains(n) && e._closeChPopover?.(), e._guidePopover?.classList?.contains("is-open") && !e._guideBtn?.contains?.(n) && !e._guidePopover.contains(n) && e._closeGuidePopover?.(), e._pinPopover?.classList?.contains("is-open") && !e._pinBtn?.contains?.(n) && !e._pinPopover.contains(n) && e._closePinPopover?.(), e._formatPopover?.classList?.contains("is-open") && !e._formatToggle?.contains?.(n) && !e._formatPopover.contains(n) && e._closeFormatPopover?.(), n?.closest?.(".mjr-mfv-idrop") || e.element?.querySelectorAll?.(".mjr-mfv-idrop-menu.is-open").forEach((e) => e.classList.remove("is-open")); }, e._bindDocumentUiHandlers(), n; } -function sn(e) { +function cn(e) { try { e._btnAC?.abort(); } catch (e) { @@ -2145,15 +2167,15 @@ function sn(e) { e._overlayMaskOpacity = Math.round(Math.max(0, Math.min(.9, Number.isFinite(t) ? t : .65)) * 100) / 100, e._maskOpacityCtl.out.textContent = e._overlayMaskOpacity.toFixed(2), e._redrawOverlayGuides?.(); }, { signal: t }); } -function cn(e, t) { +function ln(e, t) { e._settingsBtn && (e._settingsBtn.classList.toggle("active", !!t), e._settingsBtn.setAttribute("aria-pressed", String(!!t))); } -function ln(e) { +function un(e) { if (!e._contentWrapper) return; let t = p.MFV_SIDEBAR_POSITION || "right"; e._contentWrapper.setAttribute("data-sidebar-pos", t), e._sidebar?.el && e._contentEl && (t === "left" ? e._contentWrapper.insertBefore(e._sidebar.el, e._contentEl) : e._contentWrapper.appendChild(e._sidebar.el)); } -function un(e) { +function dn(e) { if (!e._handleDocClick) return; let t = e.element?.ownerDocument || document; if (e._docClickHost !== t) { @@ -2166,7 +2188,7 @@ function un(e) { e._docAC = new AbortController(), t.addEventListener("click", e._handleDocClick, { signal: e._docAC.signal }), e._docClickHost = t; } } -function dn(e) { +function fn(e) { try { e._docAC?.abort(); } catch (e) { @@ -2174,18 +2196,18 @@ function dn(e) { } e._docAC = new AbortController(), e._docClickHost = null; } -function fn(e) { +function pn(e) { if (!e._genBtn) return; let t = !!e._genSidebarEnabled; e._genBtn.classList.toggle("is-on", t), e._genBtn.classList.toggle("is-open", t); let n = t ? "Gen Info sidebar: ON" : "Gen Info sidebar: OFF"; e._genBtn.title = n, e._genBtn.setAttribute("aria-label", n), e._genBtn.setAttribute("aria-pressed", String(t)), e._genBtn.removeAttribute("aria-expanded"), e._genBtn.removeAttribute("aria-haspopup"), e._genBtn.removeAttribute("aria-controls"); } -function pn(e) { +function mn(e) { let t = Number(e); return !Number.isFinite(t) || t <= 0 ? "" : t >= 60 ? `${(t / 60).toFixed(1)}m` : `${t.toFixed(1)}s`; } -function mn(e) { +function hn(e) { let t = String(e || "").trim().toLowerCase(); if (!t) return 0; if (t.endsWith("m")) { @@ -2199,7 +2221,7 @@ function mn(e) { let n = Number.parseFloat(t); return Number.isFinite(n) ? n : 0; } -function hn(e, t) { +function gn(e, t) { if (!t) return {}; try { let e = t.geninfo ? { geninfo: t.geninfo } : t.metadata || t.metadata_raw || t, n = se(e) || null, r = { @@ -2215,10 +2237,10 @@ function hn(e, t) { }; if (n && typeof n == "object") { n.prompt && (r.prompt = ce(String(n.prompt))), n.seed != null && (r.seed = String(n.seed)), n.model && (r.model = Array.isArray(n.model) ? n.model.join(", ") : String(n.model)); - let i = Qt(n), a = Zt(n); + let i = $t(n), a = Qt(n); a && (r.model = a), i && (r.model = [i, r.model].filter(Boolean).join(" | ")), Array.isArray(n.loras) && (r.lora = n.loras.map((e) => typeof e == "string" ? e : e?.name || e?.lora_name || e?.model_name || "").filter(Boolean).join(", ")), n.sampler && (r.sampler = String(n.sampler)), n.scheduler && (r.scheduler = String(n.scheduler)), n.cfg != null && (r.cfg = String(n.cfg)), n.steps != null && (r.step = String(n.steps)), !r.prompt && e?.prompt && (r.prompt = ce(String(e.prompt || ""))); let o = t.generation_time_ms ?? t.metadata_raw?.generation_time_ms ?? e?.generation_time_ms ?? e?.geninfo?.generation_time_ms ?? 0; - return o && Number.isFinite(Number(o)) && o > 0 && o < 864e5 && (r.genTime = pn(Number(o) / 1e3)), r; + return o && Number.isFinite(Number(o)) && o > 0 && o < 864e5 && (r.genTime = mn(Number(o) / 1e3)), r; } } catch (e) { console.debug?.("[MFV] geninfo normalize failed", e); @@ -2234,9 +2256,9 @@ function hn(e, t) { step: n?.steps == null ? "" : String(n.steps), genTime: "" }, i = t.generation_time_ms ?? t.metadata_raw?.generation_time_ms ?? n?.generation_time_ms ?? 0; - return i && Number.isFinite(Number(i)) && i > 0 && i < 864e5 && (r.genTime = pn(Number(i) / 1e3)), r; + return i && Number.isFinite(Number(i)) && i > 0 && i < 864e5 && (r.genTime = mn(Number(i) / 1e3)), r; } -function gn(e, t) { +function _n(e, t) { let n = e._getGenFields(t); if (!n) return null; let r = document.createDocumentFragment(); @@ -2261,7 +2283,7 @@ function gn(e, t) { let s = document.createElement("strong"); if (s.textContent = `${a}: `, o.appendChild(s), t === "prompt") o.appendChild(document.createTextNode(i)); else if (t === "genTime") { - let e = mn(i), t = "#4CAF50"; + let e = hn(i), t = "#4CAF50"; e >= 60 ? t = "#FF9800" : e >= 30 ? t = "#FFC107" : e >= 10 && (t = "#8BC34A"); let n = document.createElement("span"); n.style.color = t, n.style.fontWeight = "600", n.textContent = i, o.appendChild(n); @@ -2271,14 +2293,14 @@ function gn(e, t) { return r.childNodes.length > 0 ? r : null; } // ui/features/viewer/floatingViewerMode.ts -function _n(e) { +function vn(e) { try { e._controller?.onModeChanged?.(e._mode); } catch (e) { console.debug?.(e); } } -function vn(e) { +function yn(e) { let t = [ G.SIMPLE, G.AB, @@ -2288,13 +2310,13 @@ function vn(e) { ]; e._mode = t[(t.indexOf(e._mode) + 1) % t.length], e._updateModeBtnUI(), e._refresh(), e._notifyModeChanged(); } -function yn(e, t) { +function bn(e, t) { Object.values(G).includes(t) && (e._mode = t, e._updateModeBtnUI(), e._refresh(), e._notifyModeChanged()); } -function bn(e) { +function xn(e) { return e._pinnedSlots; } -function xn(e) { +function Sn(e) { if (e._pinBtns) { for (let t of [ "A", @@ -2310,7 +2332,7 @@ function xn(e) { e._pinBtn?.classList.toggle("is-on", (e._pinnedSlots?.size ?? 0) > 0); } } -function Sn(e) { +function Cn(e) { if (!e._modeBtn) return; let { icon: t = "pi-image", label: n = "" } = { [G.SIMPLE]: { @@ -2336,7 +2358,7 @@ function Sn(e) { }[e._mode] || {}, r = w(n, "C"), i = document.createElement("i"); i.className = `pi ${t}`, i.setAttribute("aria-hidden", "true"), e._modeBtn.replaceChildren(i), e._modeBtn.title = r, e._modeBtn.setAttribute("aria-label", r), e._modeBtn.removeAttribute("aria-pressed"), e._modeBtn.classList.toggle("is-on", e._mode !== G.SIMPLE), e._modeDrop?.selectItem?.(e._mode); } -function Cn(e, t) { +function wn(e, t) { if (!e._liveBtn) return; let n = !!t; e._liveBtn.classList.toggle("mjr-live-active", n); @@ -2345,7 +2367,7 @@ function Cn(e, t) { let a = document.createElement("i"); a.className = n ? "pi pi-circle-fill" : "pi pi-circle", a.setAttribute("aria-hidden", "true"), e._liveBtn.replaceChildren(a), e._liveBtn.title = i; } -function wn(e, t) { +function Tn(e, t) { if (e._previewActive = !!t, !e._previewBtn) return; e._previewBtn.classList.toggle("mjr-preview-active", e._previewActive); let n = e._previewActive ? f("tooltip.previewStreamOn", "KSampler Preview: ON - streams sampler denoising frames during execution") : f("tooltip.previewStreamOff", "KSampler Preview: OFF - click to stream sampler denoising frames"), r = w(n, "K"); @@ -2353,18 +2375,18 @@ function wn(e, t) { let i = document.createElement("i"); i.className = e._previewActive ? "pi pi-eye" : "pi pi-eye-slash", i.setAttribute("aria-hidden", "true"), e._previewBtn.replaceChildren(i), e._previewBtn.title = r; } -function Tn(e) { +function En(e) { return e?._isPreview ? String(e?._previewBlobUrl || e?.url || "").trim() : ""; } -function En(e, t) { +function Dn(e, t) { let n = new Set([ "A", "B", "C", "D" - ].map((t) => Tn(e[`_media${t}`])).filter(Boolean)); + ].map((t) => En(e[`_media${t}`])).filter(Boolean)); for (let r of t) { - let t = Tn(r); + let t = En(r); if (t && !n.has(t)) { try { URL.revokeObjectURL(t); @@ -2373,7 +2395,7 @@ function En(e, t) { } } } -function Dn(e, t, n = {}) { +function On(e, t, n = {}) { if (!t || !(t instanceof Blob)) return; let r = e._mode === G.AB || e._mode === G.SIDE || e._mode === G.GRID, i = "A"; if (r) { @@ -2403,9 +2425,9 @@ function Dn(e, t, n = {}) { _previewTotal: Number.isFinite(Number(n?.total)) ? Number(n.total) : null, _previewBlobUrl: o }; - r ? e[`_media${i}`] = l : (e._mediaA = l, e._resetMfvZoom(), e._mode !== G.SIMPLE && (e._mode = G.SIMPLE, e._updateModeBtnUI())), En(e, [a]), ++e._refreshGen, e._refresh(); + r ? e[`_media${i}`] = l : (e._mediaA = l, e._resetMfvZoom(), e._mode !== G.SIMPLE && (e._mode = G.SIMPLE, e._updateModeBtnUI())), Dn(e, [a]), ++e._refreshGen, e._refresh(); } -function On(e) { +function kn(e) { let t = /* @__PURE__ */ new Set(); e._previewBlobUrl && t.add(String(e._previewBlobUrl)); for (let n of [ @@ -2414,7 +2436,7 @@ function On(e) { "C", "D" ]) { - let r = Tn(e[`_media${n}`]); + let r = En(e[`_media${n}`]); r && t.add(r); } for (let e of t) try { @@ -2422,7 +2444,7 @@ function On(e) { } catch {} e._previewBlobUrl = null; } -function kn(e, t) { +function An(e, t) { if (e._nodeStreamActive = !!t, e._nodeStreamActive || e.setNodeStreamSelection?.(null), !e._nodeStreamBtn) return; e._nodeStreamBtn.classList.toggle("mjr-nodestream-active", e._nodeStreamActive); let n = e._nodeStreamActive ? f("tooltip.nodeStreamOn", "Node Stream: ON - follows the selected node preview when frontend media exists") : f("tooltip.nodeStreamOff", "Node Stream: OFF - click to follow selected node previews, including ImageOps live canvases"), r = w(n, "N"); @@ -2431,8 +2453,8 @@ function kn(e, t) { i.className = "pi pi-sitemap", i.setAttribute("aria-hidden", "true"), e._nodeStreamBtn.replaceChildren(i), e._nodeStreamBtn.title = r; } // ui/features/viewer/floatingViewerPopout.ts -var An = /* @__PURE__ */ "--border-color.--border-default.--button-hover-surface.--button-surface.--comfy-accent.--comfy-font.--comfy-input-bg.--comfy-menu-bg.--comfy-menu-secondary-bg.--comfy-status-error.--comfy-status-success.--comfy-status-warning.--content-bg.--content-fg.--descrip-text.--destructive-background.--font-inter.--input-text.--interface-menu-surface.--interface-panel-hover-surface.--interface-panel-selected-surface.--interface-panel-surface.--modal-card-background.--muted-foreground.--primary-background.--primary-background-hover.--radius-lg.--radius-md.--radius-sm.--success-background.--warning-background".split("."); -function jn() { +var jn = /* @__PURE__ */ "--border-color.--border-default.--button-hover-surface.--button-surface.--comfy-accent.--comfy-font.--comfy-input-bg.--comfy-menu-bg.--comfy-menu-secondary-bg.--comfy-status-error.--comfy-status-success.--comfy-status-warning.--content-bg.--content-fg.--descrip-text.--destructive-background.--font-inter.--input-text.--interface-menu-surface.--interface-panel-hover-surface.--interface-panel-selected-surface.--interface-panel-surface.--modal-card-background.--muted-foreground.--primary-background.--primary-background-hover.--radius-lg.--radius-md.--radius-sm.--success-background.--warning-background".split("."); +function Mn() { try { let e = typeof window < "u" ? window : globalThis, t = e?.process?.versions?.electron; if (typeof t == "string" && t.trim() || e?.electron || e?.ipcRenderer || e?.electronAPI) return !0; @@ -2461,10 +2483,10 @@ function $(e, t = null, n = "info") { console.debug?.(e); } } -function Mn(e, ...t) { +function Nn(e, ...t) { return Array.from(new Set([String(e || ""), ...t].join(" ").split(/\s+/).filter(Boolean))).join(" "); } -function Nn(e, t) { +function Pn(e, t) { if (e && t) for (let n of Array.from(e.attributes || [])) { let e = String(n?.name || ""); if (e && e !== "class" && e !== "style") try { @@ -2474,7 +2496,7 @@ function Nn(e, t) { } } } -function Pn(e, t) { +function Fn(e, t) { if (!e || !t?.style) return; let n = typeof window < "u" && window?.getComputedStyle || globalThis?.getComputedStyle; if (typeof n != "function") return; @@ -2485,7 +2507,7 @@ function Pn(e, t) { console.debug?.(e); } if (r) { - for (let e of An) try { + for (let e of jn) try { let n = String(r.getPropertyValue?.(e) || "").trim(); n && t.style.setProperty(e, n); } catch (e) { @@ -2499,12 +2521,12 @@ function Pn(e, t) { } } } -function Fn(e) { +function In(e) { if (!e?.documentElement || !e?.body || !document?.documentElement) return; let t = document.documentElement, n = document.body, r = e.documentElement, i = e.body; - r.className = Mn(t.className, "mjr-mfv-popout-document"), i.className = Mn(n?.className, "mjr-mfv-popout-body"), Nn(t, r), Nn(n, i), Pn(t, r), Pn(n, i), t?.lang && (r.lang = t.lang), t?.dir && (r.dir = t.dir); + r.className = Nn(t.className, "mjr-mfv-popout-document"), i.className = Nn(n?.className, "mjr-mfv-popout-body"), Pn(t, r), Pn(n, i), Fn(t, r), Fn(n, i), t?.lang && (r.lang = t.lang), t?.dir && (r.dir = t.dir); } -function In(e) { +function Ln(e) { if (!e?.body) return null; try { (e.getElementById?.("mjr-mfv-popout-root"))?.remove?.(); @@ -2514,10 +2536,10 @@ function In(e) { let t = e.createElement("div"); return t.id = "mjr-mfv-popout-root", t.className = "mjr-mfv-popout-root", e.body.appendChild(t), t; } -function Ln(e) { +function Rn(e) { e._resetGenDropdownForCurrentDocument(), e._rebindControlHandlers(), e._bindPanelInteractions(), e._bindDocumentUiHandlers(), e._unbindLayoutObserver?.(), e._bindLayoutObserver?.(), e._refresh?.(), e._updatePopoutBtnUI(); } -function Rn(e, t) { +function zn(e, t) { if (!e.element) return; let n = !!t; if (e._desktopExpanded === n) return; @@ -2527,13 +2549,13 @@ function Rn(e, t) { parent: r.parentNode || null, nextSibling: r.nextSibling || null, styleAttr: r.getAttribute("style") - }, r.parentNode !== document.body && document.body.appendChild(r), r.classList.add("mjr-mfv--desktop-expanded", "is-visible"), r.setAttribute("aria-hidden", "false"), r.style.position = "fixed", r.style.top = "12px", r.style.left = "12px", r.style.right = "12px", r.style.bottom = "12px", r.style.width = "auto", r.style.height = "auto", r.style.maxWidth = "none", r.style.maxHeight = "none", r.style.minWidth = "320px", r.style.minHeight = "240px", r.style.resize = "none", r.style.margin = "0", r.style.zIndex = "2147483000", e._desktopExpanded = !0, e.isVisible = !0, Ln(e), $("electron-in-app-expanded", { isVisible: e.isVisible }); + }, r.parentNode !== document.body && document.body.appendChild(r), r.classList.add("mjr-mfv--desktop-expanded", "is-visible"), r.setAttribute("aria-hidden", "false"), r.style.position = "fixed", r.style.top = "12px", r.style.left = "12px", r.style.right = "12px", r.style.bottom = "12px", r.style.width = "auto", r.style.height = "auto", r.style.maxWidth = "none", r.style.maxHeight = "none", r.style.minWidth = "320px", r.style.minHeight = "240px", r.style.resize = "none", r.style.margin = "0", r.style.zIndex = "2147483000", e._desktopExpanded = !0, e.isVisible = !0, Rn(e), $("electron-in-app-expanded", { isVisible: e.isVisible }); return; } let i = e._desktopExpandRestore; - e._desktopExpanded = !1, r.classList.remove("mjr-mfv--desktop-expanded"), i?.styleAttr == null || i.styleAttr === "" ? r.removeAttribute("style") : r.setAttribute("style", i.styleAttr), i?.parent && i.parent.isConnected && (i.nextSibling && i.nextSibling.parentNode === i.parent ? i.parent.insertBefore(r, i.nextSibling) : i.parent.appendChild(r)), e._desktopExpandRestore = null, Ln(e), $("electron-in-app-restored", null); + e._desktopExpanded = !1, r.classList.remove("mjr-mfv--desktop-expanded"), i?.styleAttr == null || i.styleAttr === "" ? r.removeAttribute("style") : r.setAttribute("style", i.styleAttr), i?.parent && i.parent.isConnected && (i.nextSibling && i.nextSibling.parentNode === i.parent ? i.parent.insertBefore(r, i.nextSibling) : i.parent.appendChild(r)), e._desktopExpandRestore = null, Rn(e), $("electron-in-app-restored", null); } -function zn(t, n) { +function Bn(t, n) { t._desktopPopoutUnsupported = !0, $("electron-in-app-fallback", { message: n?.message || String(n || "unknown error") }, "warn"), t._setDesktopExpanded(!0); try { e(f("toast.popoutElectronInAppFallback", "Desktop PiP is unavailable here. Viewer expanded inside the app instead."), "warning", 4500); @@ -2541,14 +2563,14 @@ function zn(t, n) { console.debug?.(e); } } -function Bn(e, t, n, r, i) { +function Vn(e, t, n, r, i) { return $("electron-popup-fallback-attempt", { reason: i?.message || String(i || "unknown") }, "warn"), e._fallbackPopout(t, n, r), e._popoutWindow ? (e._desktopPopoutUnsupported = !1, $("electron-popup-fallback-opened", null), !0) : !1; } -function Vn(e) { +function Hn(e) { if (e._isPopped || !e.element) return; let t = e.element; e._stopEdgeResize(); - let n = jn(), r = typeof window < "u" && "documentPictureInPicture" in window, i = String(window?.navigator?.userAgent || globalThis?.navigator?.userAgent || ""), a = Math.max(t.offsetWidth || 520, 400), o = Math.max(t.offsetHeight || 420, 300); + let n = Mn(), r = typeof window < "u" && "documentPictureInPicture" in window, i = String(window?.navigator?.userAgent || globalThis?.navigator?.userAgent || ""), a = Math.max(t.offsetWidth || 520, 400), o = Math.max(t.offsetHeight || 420, 300); $("start", { isElectronHost: n, hasDocumentPiP: r, @@ -2577,7 +2599,7 @@ function Vn(e) { e._popoutCloseHandler = i; let a = n.document; a.title = "Majoor Viewer", e._installPopoutStyles(a); - let o = In(a); + let o = Ln(a); if (!o) e._activateDesktopExpandedFallback(/* @__PURE__ */ Error("Popup root creation failed")); else { try { @@ -2593,7 +2615,7 @@ function Vn(e) { e._activateDesktopExpandedFallback(t); return; } - t.classList.add("is-visible"), e.isVisible = !0, Ln(e), $("electron-pip-ready", { isPopped: e._isPopped }), n.addEventListener("pagehide", i, { signal: r }), e._startPopoutCloseWatch(), e._popoutKeydownHandler = (t) => { + t.classList.add("is-visible"), e.isVisible = !0, Rn(e), $("electron-pip-ready", { isPopped: e._isPopped }), n.addEventListener("pagehide", i, { signal: r }), e._startPopoutCloseWatch(), e._popoutKeydownHandler = (t) => { let n = String(t?.target?.tagName || "").toLowerCase(); t?.defaultPrevented || t?.target?.isContentEditable || n === "input" || n === "textarea" || n === "select" || e._forwardKeydownToController(t); }, n.addEventListener("keydown", e._popoutKeydownHandler, { signal: r }); @@ -2605,7 +2627,7 @@ function Vn(e) { height: o }), e._fallbackPopout(t, a, o))); } -function Hn(e, t, n, r) { +function Un(e, t, n, r) { $("browser-popup-open", { width: n, height: r @@ -2633,7 +2655,7 @@ function Hn(e, t, n, r) { } if (!n) return; n.title = "Majoor Viewer", e._installPopoutStyles(n); - let r = In(n); + let r = Ln(n); if (r) { try { r.appendChild(n.adoptNode(t)); @@ -2641,7 +2663,7 @@ function Hn(e, t, n, r) { console.warn("[MFV] adoptNode failed", e); return; } - t.classList.add("is-visible"), e.isVisible = !0, Ln(e); + t.classList.add("is-visible"), e.isVisible = !0, Rn(e); } }; try { @@ -2659,7 +2681,7 @@ function Hn(e, t, n, r) { t?.defaultPrevented || t?.target?.isContentEditable || n === "input" || n === "textarea" || n === "select" || e._forwardKeydownToController(t); }, a.addEventListener("keydown", e._popoutKeydownHandler, { signal: o }); } -function Un(e) { +function Wn(e) { if (e._popoutCloseTimer != null) { try { window.clearInterval(e._popoutCloseTimer); @@ -2669,7 +2691,7 @@ function Un(e) { e._popoutCloseTimer = null; } } -function Wn(e) { +function Gn(e) { e._clearPopoutCloseWatch(), e._popoutCloseTimer = window.setInterval(() => { if (!e._isPopped) { e._clearPopoutCloseWatch(); @@ -2679,7 +2701,7 @@ function Wn(e) { (!t || t.closed) && (e._clearPopoutCloseWatch(), e._schedulePopInFromPopupClose()); }, 250); } -function Gn(e) { +function Kn(e) { e._isPopped && !e._popoutRestoreGuard && (e._popoutRestoreGuard = !0, window.setTimeout(() => { try { e.popIn({ closePopupWindow: !1 }); @@ -2688,14 +2710,14 @@ function Gn(e) { } }, 0)); } -function Kn(e, t) { +function qn(e, t) { if (!t?.head) return; try { for (let e of t.head.querySelectorAll("[data-mjr-popout-cloned-style='1']")) e.remove(); } catch (e) { console.debug?.(e); } - Fn(t); + In(t); try { let e = document.documentElement.style.cssText; if (e) { @@ -2719,7 +2741,7 @@ function Kn(e, t) { let n = t.createElement("style"); n.setAttribute("data-mjr-popout-cloned-style", "1"), n.textContent = "\n html.mjr-mfv-popout-document {\n min-height: 100%;\n background:\n radial-gradient(\n 1200px 420px at 50% 0%,\n color-mix(in srgb, var(--primary-background, var(--comfy-accent, #5fb3ff)) 10%, transparent),\n transparent 62%\n ),\n linear-gradient(\n 180deg,\n color-mix(in srgb, var(--interface-panel-surface, var(--content-bg, #16191f)) 82%, #000 18%),\n color-mix(in srgb, var(--interface-menu-surface, var(--comfy-menu-bg, #1f2227)) 84%, #000 16%)\n ) !important;\n }\n body.mjr-mfv-popout-body {\n margin: 0 !important;\n display: flex !important;\n min-height: 100vh !important;\n overflow: hidden !important;\n background: transparent !important;\n }\n #mjr-mfv-popout-root,\n .mjr-mfv-popout-root {\n flex: 1 !important;\n min-width: 0 !important;\n min-height: 0 !important;\n display: flex !important;\n isolation: isolate;\n }\n body.mjr-mfv-popout-body .mjr-mfv {\n position: static !important;\n width: 100% !important;\n height: 100% !important;\n min-width: 0 !important;\n min-height: 0 !important;\n resize: none !important;\n border-radius: 0 !important;\n display: flex !important;\n opacity: 1 !important;\n visibility: visible !important;\n pointer-events: auto !important;\n transform: none !important;\n max-width: none !important;\n max-height: none !important;\n overflow: hidden !important;\n }\n ", t.head.appendChild(n); } -function qn(e, { closePopupWindow: t = !0 } = {}) { +function Jn(e, { closePopupWindow: t = !0 } = {}) { if (e._desktopExpanded) { e._setDesktopExpanded(!1); return; @@ -2739,14 +2761,14 @@ function qn(e, { closePopupWindow: t = !0 } = {}) { } catch (e) { console.debug?.("[MFV] pop-in adopt failed", e); } - if (document.body.appendChild(r), r.classList.add("is-visible"), r.setAttribute("aria-hidden", "false"), e.isVisible = !0, Ln(e), t) try { + if (document.body.appendChild(r), r.classList.add("is-visible"), r.setAttribute("aria-hidden", "false"), e.isVisible = !0, Rn(e), t) try { n?.close(); } catch (e) { console.debug?.(e); } e._popoutWindow = null; } -function Jn(e) { +function Yn(e) { if (!e._popoutBtn) return; let t = e._isPopped || e._desktopExpanded; e.element && e.element.classList.toggle("mjr-mfv--popped", t), e._popoutBtn.classList.toggle("mjr-popin-active", t); @@ -2754,7 +2776,7 @@ function Jn(e) { n.className = t ? "pi pi-sign-in" : "pi pi-external-link", e._popoutBtn.title = r, e._popoutBtn.setAttribute("aria-label", r), e._popoutBtn.setAttribute("aria-pressed", String(t)), e._popoutBtn.contains(n) || e._popoutBtn.replaceChildren(n); } // ui/features/viewer/floatingViewerPanel.ts -function Yn(e) { +function Xn(e) { return { n: "ns-resize", s: "ns-resize", @@ -2766,12 +2788,12 @@ function Yn(e) { sw: "nesw-resize" }[e] || ""; } -function Xn(e, t, n) { +function Zn(e, t, n) { if (!n) return ""; let r = e <= n.left + 8, i = e >= n.right - 8, a = t <= n.top + 8, o = t >= n.bottom - 8; return a && r ? "nw" : a && i ? "ne" : o && r ? "sw" : o && i ? "se" : a ? "n" : o ? "s" : r ? "w" : i ? "e" : ""; } -function Zn(e) { +function Qn(e) { if (e.element) { try { e._resizeWindowCleanup?.(); @@ -2786,7 +2808,7 @@ function Zn(e) { e._resizeState = null, e.element.classList.remove("mjr-mfv--resizing"), e.element.style.cursor = ""; } } -function Qn(e) { +function $n(e) { if (e.element) { e._stopEdgeResize(); try { @@ -2797,7 +2819,7 @@ function Qn(e) { e._panelAC = new AbortController(), e._initEdgeResize(e.element), e._initDrag(e.element.querySelector(".mjr-mfv-header")); } } -function $n(e, t) { +function er(e, t) { if (!t) return; let n = (t) => { if (!e.element || e._isPopped) return ""; @@ -2868,7 +2890,7 @@ function $n(e, t) { !e._resizeState && e.element && (e.element.style.cursor = ""); }, { signal: r }); } -function er(e, t) { +function tr(e, t) { if (!t) return; let n = e._panelAC?.signal, r = null; t.addEventListener("pointerdown", (n) => { @@ -2895,7 +2917,7 @@ function er(e, t) { }, n ? { signal: n } : void 0); } // ui/features/viewer/floatingViewerCapture.ts -async function tr(e, t, n, r, i, a, o, s) { +async function nr(e, t, n, r, i, a, o, s) { if (!n) return; let c = K(n), l = null; if (c === "video" && (l = s instanceof HTMLVideoElement ? s : e._contentEl?.querySelector("video") || null), !l && c === "model3d") { @@ -2916,7 +2938,7 @@ async function tr(e, t, n, r, i, a, o, s) { let f = Math.min(a / u, o / d); t.drawImage(l, r + (a - u * f) / 2, i + (o - d * f) / 2, u * f, d * f); } -function nr(e, t, n, r) { +function rr(e, t, n, r) { if (!t || !n || !e._genInfoSelections.size) return 0; let i = e._getGenFields(n), a = [ "prompt", @@ -2948,7 +2970,7 @@ function nr(e, t, n, r) { } return s > 0 ? s * 16 + 16 : 0; } -function rr(e, t, n, r, i, a, o) { +function ir(e, t, n, r, i, a, o) { if (!n || !e._genInfoSelections.size) return; let s = e._getGenFields(n), c = { prompt: "#7ec8ff", @@ -3003,12 +3025,12 @@ function rr(e, t, n, r, i, a, o) { }); } let p = f.reduce((e, t) => e + t.lines.length, 0) * 16 + 16, m = r + 8, h = i + o - p - 8; - t.globalAlpha = .72, t.fillStyle = "#000", Ie(t, m, h, d, p, 6), t.fill(), t.globalAlpha = 1; + t.globalAlpha = .72, t.fillStyle = "#000", Le(t, m, h, d, p, 6), t.fill(), t.globalAlpha = 1; let g = h + 8 + 11; for (let { label: e, labelW: n, lines: r, color: i } of f) for (let a = 0; a < r.length; a++) a === 0 ? (t.font = "bold 11px system-ui, sans-serif", t.fillStyle = i, t.fillText(e, m + 8, g), t.font = "11px system-ui, sans-serif", t.fillStyle = "rgba(255,255,255,0.88)", t.fillText(r[a], m + 8 + n, g)) : (t.font = "11px system-ui, sans-serif", t.fillStyle = "rgba(255,255,255,0.88)", t.fillText(r[a], m + 8 + n, g)), g += 16; t.restore(); } -async function ir(e) { +async function ar(e) { if (!e._contentEl) return; e._captureBtn && (e._captureBtn.disabled = !0, e._captureBtn.setAttribute("aria-label", f("tooltip.capturingView", "Capturing..."))); let t = e._contentEl.clientWidth || 480, n = e._contentEl.clientHeight || 360, r = n; @@ -3029,10 +3051,10 @@ async function ir(e) { if (e._mode === G.SIMPLE) e._mediaA && (await e._drawMediaFit(a, e._mediaA, 0, 0, t, n), e._drawGenInfoOverlay(a, e._mediaA, 0, 0, t, r)); else if (e._mode === G.AB) { let n = Math.round(e._abDividerX * t), i = e._contentEl.querySelector(".mjr-mfv-ab-layer:not(.mjr-mfv-ab-layer--b) video"), o = e._contentEl.querySelector(".mjr-mfv-ab-layer--b video"); - e._mediaA && await e._drawMediaFit(a, e._mediaA, 0, 0, t, r, i), e._mediaB && (a.save(), a.beginPath(), a.rect(n, 0, t - n, r), a.clip(), await e._drawMediaFit(a, e._mediaB, 0, 0, t, r, o), a.restore()), a.save(), a.strokeStyle = "rgba(255,255,255,0.88)", a.lineWidth = 2, a.beginPath(), a.moveTo(n, 0), a.lineTo(n, r), a.stroke(), a.restore(), Le(a, "A", 8, 8), Le(a, "B", n + 8, 8), e._mediaA && e._drawGenInfoOverlay(a, e._mediaA, 0, 0, n, r), e._mediaB && e._drawGenInfoOverlay(a, e._mediaB, n, 0, t - n, r); + e._mediaA && await e._drawMediaFit(a, e._mediaA, 0, 0, t, r, i), e._mediaB && (a.save(), a.beginPath(), a.rect(n, 0, t - n, r), a.clip(), await e._drawMediaFit(a, e._mediaB, 0, 0, t, r, o), a.restore()), a.save(), a.strokeStyle = "rgba(255,255,255,0.88)", a.lineWidth = 2, a.beginPath(), a.moveTo(n, 0), a.lineTo(n, r), a.stroke(), a.restore(), Re(a, "A", 8, 8), Re(a, "B", n + 8, 8), e._mediaA && e._drawGenInfoOverlay(a, e._mediaA, 0, 0, n, r), e._mediaB && e._drawGenInfoOverlay(a, e._mediaB, n, 0, t - n, r); } else if (e._mode === G.SIDE) { let n = Math.floor(t / 2), i = e._contentEl.querySelector(".mjr-mfv-side-panel:first-child video"), o = e._contentEl.querySelector(".mjr-mfv-side-panel:last-child video"); - e._mediaA && (await e._drawMediaFit(a, e._mediaA, 0, 0, n, r, i), e._drawGenInfoOverlay(a, e._mediaA, 0, 0, n, r)), a.fillStyle = "#111", a.fillRect(n, 0, 2, r), e._mediaB && (await e._drawMediaFit(a, e._mediaB, n, 0, n, r, o), e._drawGenInfoOverlay(a, e._mediaB, n, 0, n, r)), Le(a, "A", 8, 8), Le(a, "B", n + 8, 8); + e._mediaA && (await e._drawMediaFit(a, e._mediaA, 0, 0, n, r, i), e._drawGenInfoOverlay(a, e._mediaA, 0, 0, n, r)), a.fillStyle = "#111", a.fillRect(n, 0, 2, r), e._mediaB && (await e._drawMediaFit(a, e._mediaB, n, 0, n, r, o), e._drawGenInfoOverlay(a, e._mediaB, n, 0, n, r)), Re(a, "A", 8, 8), Re(a, "B", n + 8, 8); } else if (e._mode === G.GRID) { let n = Math.floor(t / 2), i = Math.floor(r / 2), o = [ { @@ -3070,7 +3092,7 @@ async function ir(e) { ], s = e._contentEl.querySelectorAll(".mjr-mfv-grid-cell"); for (let t = 0; t < o.length; t++) { let n = o[t], r = s[t]?.querySelector("video") || null; - n.media && (await e._drawMediaFit(a, n.media, n.x, n.y, n.w, n.h, r), e._drawGenInfoOverlay(a, n.media, n.x, n.y, n.w, n.h)), Le(a, n.label, n.x + 8, n.y + 8); + n.media && (await e._drawMediaFit(a, n.media, n.x, n.y, n.w, n.h, r), e._drawGenInfoOverlay(a, n.media, n.x, n.y, n.w, n.h)), Re(a, n.label, n.x + 8, n.y + 8); } a.save(), a.fillStyle = "#111", a.fillRect(n - 1, 0, 2, r), a.fillRect(0, i - 1, t, 2), a.restore(); } @@ -3092,13 +3114,13 @@ async function ir(e) { } } // ui/features/viewer/floatingViewerLoader.ts -var ar = "imageops-live-preview"; -function or(e) { - return String(e?._source || "") === ar; +var or = "imageops-live-preview"; +function sr(e) { + return String(e?._source || "") === or; } -function sr(e, r, { autoMode: i = !1 } = {}) { - let a = e._mediaA || null, o = or(r), s = o && or(a) && String(a?._nodeId || "") === String(r?._nodeId || ""); - if (e._mediaA = r || null, En(e, [a]), s || e._resetMfvZoom(), i && e._mode !== G.SIMPLE && e._mode !== G.GRAPH && (e._mode = G.SIMPLE, e._updateModeBtnUI()), e._refresh(), e._mediaA && !o && typeof de == "function") { +function cr(e, r, { autoMode: i = !1 } = {}) { + let a = e._mediaA || null, o = sr(r), s = o && sr(a) && String(a?._nodeId || "") === String(r?._nodeId || ""); + if (e._mediaA = r || null, Dn(e, [a]), s || e._resetMfvZoom(), i && e._mode !== G.SIMPLE && e._mode !== G.GRAPH && (e._mode = G.SIMPLE, e._updateModeBtnUI()), e._refresh(), e._mediaA && !o && typeof de == "function") { let r = ++e._refreshGen; (async () => { try { @@ -3114,9 +3136,9 @@ function sr(e, r, { autoMode: i = !1 } = {}) { })(); } } -function cr(e, r, i) { +function lr(e, r, i) { let a = [e._mediaA, e._mediaB]; - e._mediaA = r || null, e._mediaB = i || null, En(e, a), e._resetMfvZoom(), e._mode === G.SIMPLE && (e._mode = G.AB, e._updateModeBtnUI()); + e._mediaA = r || null, e._mediaB = i || null, Dn(e, a), e._resetMfvZoom(), e._mode === G.SIMPLE && (e._mode = G.AB, e._updateModeBtnUI()); let o = ++e._refreshGen, s = async (e) => { if (!e) return e; try { @@ -3133,14 +3155,14 @@ function cr(e, r, i) { e._refreshGen === o && (e._mediaA = t || null, e._mediaB = n || null, e._refresh()); })(); } -function lr(e, r, i, a, o) { +function ur(e, r, i, a, o) { let s = [ e._mediaA, e._mediaB, e._mediaC, e._mediaD ]; - e._mediaA = r || null, e._mediaB = i || null, e._mediaC = a || null, e._mediaD = o || null, En(e, s), e._resetMfvZoom(), e._mode !== G.GRID && (e._mode = G.GRID, e._updateModeBtnUI()); + e._mediaA = r || null, e._mediaB = i || null, e._mediaC = a || null, e._mediaD = o || null, Dn(e, s), e._resetMfvZoom(), e._mode !== G.GRID && (e._mode = G.GRID, e._updateModeBtnUI()); let c = ++e._refreshGen, l = async (e) => { if (!e) return e; try { @@ -3163,16 +3185,16 @@ function lr(e, r, i, a, o) { })(); } // ui/features/viewer/FloatingViewer.impl.ts -function ur(e) { +function dr(e) { try { return !!e?.classList?.contains("mjr-mfv-simple-player") || !!e?.classList?.contains("mjr-mfv-player-host") || !!e?.querySelector?.(".mjr-video-controls, .mjr-mfv-simple-player-controls"); } catch (e) { return console.debug?.(e), !1; } } -var dr = 0, fr = class { +var fr = 0, pr = class { constructor({ controller: e = null } = {}) { - this._instanceId = ++dr, this._controller = e && typeof e == "object" ? { ...e } : null, this.element = null, this.isVisible = !1, this._contentEl = null, this._genSidebarEl = null, this._closeBtn = null, this._modeBtn = null, this._pinGroup = null, this._pinBtns = null, this._liveBtn = null, this._genBtn = null, this._genDropdown = null, this._genSidebarEnabled = !1, this._captureBtn = null, this._genInfoSelections = /* @__PURE__ */ new Set([ + this._instanceId = ++fr, this._controller = e && typeof e == "object" ? { ...e } : null, this.element = null, this.isVisible = !1, this._contentEl = null, this._genSidebarEl = null, this._closeBtn = null, this._modeBtn = null, this._pinGroup = null, this._pinBtns = null, this._liveBtn = null, this._genBtn = null, this._genDropdown = null, this._genSidebarEnabled = !1, this._captureBtn = null, this._genInfoSelections = /* @__PURE__ */ new Set([ "prompt", "seed", "model", @@ -3182,7 +3204,7 @@ var dr = 0, fr = class { "cfg", "step", "genTime" - ]), this._mode = G.SIMPLE, this._mediaA = null, this._mediaB = null, this._mediaC = null, this._mediaD = null, this._pinnedSlots = /* @__PURE__ */ new Set(), this._abDividerX = .5, this._mfvMuted = !1, this._mfvPlaybackRate = 1, this._zoom = 1, this._panX = 0, this._panY = 0, this._panzoomAC = null, this._dragging = !1, this._compareSyncAC = null, this._btnAC = null, this._refreshGen = 0, this._popoutWindow = null, this._popoutBtn = null, this._isPopped = !1, this._desktopExpanded = !1, this._desktopExpandRestore = null, this._desktopPopoutUnsupported = !1, this._popoutCloseHandler = null, this._popoutKeydownHandler = null, this._popoutCloseTimer = null, this._popoutRestoreGuard = !1, this._previewBtn = null, this._previewBlobUrl = null, this._previewActive = !1, this._nodeStreamBtn = null, this._nodeStreamActive = !1, this._nodeStreamSelection = null, this._nodeStreamOverlayEl = null, this._docAC = new AbortController(), this._popoutAC = null, this._panelAC = new AbortController(), this._resizeState = null, this._titleId = `mjr-mfv-title-${this._instanceId}`, this._genDropdownId = `mjr-mfv-gen-dropdown-${this._instanceId}`, this._progressEl = null, this._progressNodesEl = null, this._progressStepsEl = null, this._progressTextEl = null, this._mediaProgressEl = null, this._mediaProgressTextEl = null, this._progressUpdateHandler = null, this._progressCurrentNodeId = null, this._docClickHost = null, this._handleDocClick = null, this._mediaControlHandles = [], this._layoutObserver = null, this._channel = "rgb", this._exposureEV = 0, this._gridMode = 0, this._overlayMaskEnabled = !1, this._overlayMaskOpacity = .65, this._overlayFormat = "image", this._graphMapPanel = new St({ large: !0 }); + ]), this._mode = G.SIMPLE, this._mediaA = null, this._mediaB = null, this._mediaC = null, this._mediaD = null, this._pinnedSlots = /* @__PURE__ */ new Set(), this._abDividerX = .5, this._mfvMuted = !1, this._mfvPlaybackRate = 1, this._zoom = 1, this._panX = 0, this._panY = 0, this._panzoomAC = null, this._dragging = !1, this._compareSyncAC = null, this._btnAC = null, this._refreshGen = 0, this._popoutWindow = null, this._popoutBtn = null, this._isPopped = !1, this._desktopExpanded = !1, this._desktopExpandRestore = null, this._desktopPopoutUnsupported = !1, this._popoutCloseHandler = null, this._popoutKeydownHandler = null, this._popoutCloseTimer = null, this._popoutRestoreGuard = !1, this._previewBtn = null, this._previewBlobUrl = null, this._previewActive = !1, this._nodeStreamBtn = null, this._nodeStreamActive = !1, this._nodeStreamSelection = null, this._nodeStreamOverlayEl = null, this._docAC = new AbortController(), this._popoutAC = null, this._panelAC = new AbortController(), this._resizeState = null, this._titleId = `mjr-mfv-title-${this._instanceId}`, this._genDropdownId = `mjr-mfv-gen-dropdown-${this._instanceId}`, this._progressEl = null, this._progressNodesEl = null, this._progressStepsEl = null, this._progressTextEl = null, this._mediaProgressEl = null, this._mediaProgressTextEl = null, this._progressUpdateHandler = null, this._progressCurrentNodeId = null, this._docClickHost = null, this._handleDocClick = null, this._mediaControlHandles = [], this._layoutObserver = null, this._channel = "rgb", this._exposureEV = 0, this._gridMode = 0, this._overlayMaskEnabled = !1, this._overlayMaskOpacity = .65, this._overlayFormat = "image", this._graphMapPanel = new Ct({ large: !0 }); } _dispatchControllerAction(e, t) { try { @@ -3226,32 +3248,32 @@ var dr = 0, fr = class { } } render() { - return rn(this); - } - _buildHeader() { return an(this); } - _buildToolbar() { + _buildHeader() { return on(this); } - _rebindControlHandlers() { + _buildToolbar() { return sn(this); } + _rebindControlHandlers() { + return cn(this); + } _updateSettingsBtnState(e) { - return cn(this, e); + return ln(this, e); } _applySidebarPosition() { - return ln(this); + return un(this); } refreshSidebar() { this._sidebar?.refresh(); } _resetGenDropdownForCurrentDocument() {} _bindDocumentUiHandlers() { - return un(this); + return dn(this); } _unbindDocumentUiHandlers() { - return dn(this); + return fn(this); } _isGenDropdownOpen() { return !1; @@ -3259,49 +3281,49 @@ var dr = 0, fr = class { _openGenDropdown() {} _closeGenDropdown() {} _updateGenBtnUI() { - return fn(this); + return pn(this); } _buildGenDropdown() { return null; } _getGenFields(e) { - return hn(this, e); - } - _buildGenInfoDOM(e) { return gn(this, e); } - _notifyModeChanged() { - return _n(this); + _buildGenInfoDOM(e) { + return _n(this, e); } - _cycleMode() { + _notifyModeChanged() { return vn(this); } + _cycleMode() { + return yn(this); + } setMode(e) { - return yn(this, e); + return bn(this, e); } getPinnedSlots() { - return bn(this); - } - _updatePinUI() { return xn(this); } - _updateModeBtnUI() { + _updatePinUI() { return Sn(this); } - setLiveActive(e) { - return Cn(this, e); + _updateModeBtnUI() { + return Cn(this); } - setPreviewActive(e) { + setLiveActive(e) { return wn(this, e); } + setPreviewActive(e) { + return Tn(this, e); + } loadPreviewBlob(e, t = {}) { - return Dn(this, e, t); + return On(this, e, t); } _revokePreviewBlob() { - return On(this); + return kn(this); } setNodeStreamActive(e) { - return kn(this, e); + return An(this, e); } setNodeStreamSelection(e) { this._nodeStreamSelection = e && (e.nodeId != null || e.classType) ? { @@ -3327,13 +3349,13 @@ var dr = 0, fr = class { this._nodeStreamOverlayEl.textContent = `${n} - ${r}${i}`.trim(); } loadMediaA(e, { autoMode: t = !1 } = {}) { - return sr(this, e, { autoMode: t }); + return cr(this, e, { autoMode: t }); } loadMediaPair(e, t) { - return cr(this, e, t); + return lr(this, e, t); } loadMediaQuad(e, t, n, r) { - return lr(this, e, t, n, r); + return ur(this, e, t, n, r); } _applyTransform() { if (!this._contentEl) return; @@ -3613,7 +3635,7 @@ var dr = 0, fr = class { } _refresh() { if (!this._contentEl) return; - this._sidebar?.setAsset?.(this._mediaA || null), this._destroyPanZoom(), this._destroyCompareSync(), this._destroyMediaControls(), Fe(this._contentEl); + this._sidebar?.setAsset?.(this._mediaA || null), this._destroyPanZoom(), this._destroyCompareSync(), this._destroyMediaControls(), Ie(this._contentEl); let e = this._overlayCanvas || null; switch (this._contentEl.replaceChildren(), this._contentEl.style.overflow = "hidden", this._mode) { case G.SIMPLE: @@ -3958,9 +3980,9 @@ var dr = 0, fr = class { let u = document.createElement("div"); u.className = "mjr-mfv-ab-divider", u.style.left = `${l}%`; let d = this._buildGenInfoDOM(this._mediaA), f = null; - d && (f = document.createElement("div"), f.className = "mjr-mfv-geninfo-a", ur(n) && f.classList.add("mjr-mfv-geninfo--above-player"), f.appendChild(d), f.style.right = `calc(${100 - l}% + 8px)`); + d && (f = document.createElement("div"), f.className = "mjr-mfv-geninfo-a", dr(n) && f.classList.add("mjr-mfv-geninfo--above-player"), f.appendChild(d), f.style.right = `calc(${100 - l}% + 8px)`); let p = this._buildGenInfoDOM(this._mediaB), m = null; - p && (m = document.createElement("div"), m.className = "mjr-mfv-geninfo-b", ur(r) && m.classList.add("mjr-mfv-geninfo--above-player"), m.appendChild(p), m.style.left = `calc(${l}% + 8px)`); + p && (m = document.createElement("div"), m.className = "mjr-mfv-geninfo-b", dr(r) && m.classList.add("mjr-mfv-geninfo--above-player"), m.appendChild(p), m.style.left = `calc(${l}% + 8px)`); let h = null; u.addEventListener("pointerdown", (e) => { e.preventDefault(), u.setPointerCapture(e.pointerId); @@ -4002,14 +4024,14 @@ var dr = 0, fr = class { let c = i === "audio" ? null : this._buildGenInfoDOM(this._mediaA); if (c) { let e = document.createElement("div"); - e.className = "mjr-mfv-geninfo-a", ur(n) && e.classList.add("mjr-mfv-geninfo--above-player"), e.appendChild(c), s.appendChild(e); + e.className = "mjr-mfv-geninfo-a", dr(n) && e.classList.add("mjr-mfv-geninfo--above-player"), e.appendChild(c), s.appendChild(e); } let l = document.createElement("div"); l.className = "mjr-mfv-side-panel", r ? l.appendChild(r) : l.appendChild(q(" - ")), l.appendChild(J("B", "right")); let u = a === "audio" ? null : this._buildGenInfoDOM(this._mediaB); if (u) { let e = document.createElement("div"); - e.className = "mjr-mfv-geninfo-b", ur(r) && e.classList.add("mjr-mfv-geninfo--above-player"), e.appendChild(u), l.appendChild(e); + e.className = "mjr-mfv-geninfo-b", dr(r) && e.classList.add("mjr-mfv-geninfo--above-player"), e.appendChild(u), l.appendChild(e); } o.appendChild(s), o.appendChild(l), this._contentEl.appendChild(o); } @@ -4050,7 +4072,7 @@ var dr = 0, fr = class { let t = this._buildGenInfoDOM(n); if (t) { let n = document.createElement("div"); - n.className = `mjr-mfv-geninfo-${r.toLowerCase()}`, ur(o) && n.classList.add("mjr-mfv-geninfo--above-player"), n.appendChild(t), e.appendChild(n); + n.className = `mjr-mfv-geninfo-${r.toLowerCase()}`, dr(o) && n.classList.add("mjr-mfv-geninfo--above-player"), n.appendChild(t), e.appendChild(n); } } } else e.appendChild(q(" - ")), e.appendChild(J(r, r === "A" || r === "C" ? "left" : "right")); @@ -4065,70 +4087,70 @@ var dr = 0, fr = class { this.element && (this._destroyPanZoom(), this._destroyCompareSync(), this._stopEdgeResize(), this._closeGenDropdown(), Fe(this.element), this.element.classList.remove("is-visible"), this.element.setAttribute("aria-hidden", "true"), this.isVisible = !1); } _setDesktopExpanded(e) { - return Rn(this, e); - } - _activateDesktopExpandedFallback(e) { return zn(this, e); } + _activateDesktopExpandedFallback(e) { + return Bn(this, e); + } _tryElectronPopupFallback(e, t, n, r) { - return Bn(this, e, t, n, r); + return Vn(this, e, t, n, r); } popOut() { - return Vn(this); + return Hn(this); } _fallbackPopout(e, t, n) { - return Hn(this, e, t, n); + return Un(this, e, t, n); } _clearPopoutCloseWatch() { - return Un(this); - } - _startPopoutCloseWatch() { return Wn(this); } - _schedulePopInFromPopupClose() { + _startPopoutCloseWatch() { return Gn(this); } - _installPopoutStyles(e) { - return Kn(this, e); + _schedulePopInFromPopupClose() { + return Kn(this); } - popIn(e) { + _installPopoutStyles(e) { return qn(this, e); } + popIn(e) { + return Jn(this, e); + } _updatePopoutBtnUI() { - return Jn(this); + return Yn(this); } get isPopped() { return this._isPopped || this._desktopExpanded; } _resizeCursorForDirection(e) { - return Yn(e); + return Xn(e); } _getResizeDirectionFromPoint(e, t, n) { - return Xn(e, t, n); + return Zn(e, t, n); } _stopEdgeResize() { - return Zn(this); - } - _bindPanelInteractions() { return Qn(this); } - _initEdgeResize(e) { - return $n(this, e); + _bindPanelInteractions() { + return $n(this); } - _initDrag(e) { + _initEdgeResize(e) { return er(this, e); } + _initDrag(e) { + return tr(this, e); + } async _drawMediaFit(e, t, n, r, i, a, o) { - return tr(this, e, t, n, r, i, a, o); + return nr(this, e, t, n, r, i, a, o); } _estimateGenInfoOverlayHeight(e, t, n) { - return nr(this, e, t, n); + return rr(this, e, t, n); } _drawGenInfoOverlay(e, t, n, r, i, a) { - return rr(this, e, t, n, r, i, a); + return ir(this, e, t, n, r, i, a); } async _captureView() { - return ir(this); + return ar(this); } dispose() { I(this), this._destroyPanZoom(), this._destroyCompareSync(), this._destroyMediaControls(), this._unbindLayoutObserver(), this._stopEdgeResize(), this._clearPopoutCloseWatch(); @@ -4169,7 +4191,7 @@ var dr = 0, fr = class { } this._revokePreviewBlob(), this._onSidebarPosChanged &&= (window.removeEventListener("mjr-settings-changed", this._onSidebarPosChanged), null); try { - this.element?.remove(); + Ie(this.element), this.element?.remove(); } catch (e) { console.debug?.(e); } @@ -4187,4 +4209,4 @@ var dr = 0, fr = class { this._mediaA = null, this._mediaB = null, this._mediaC = null, this._mediaD = null, this.isVisible = !1; } }; -export { fr as FloatingViewer }; +export { pr as FloatingViewer }; diff --git a/dist/chunks/LiveStreamTracker-B3HhmLvE.js b/dist/chunks/LiveStreamTracker-H3ggC3_t.js similarity index 97% rename from dist/chunks/LiveStreamTracker-B3HhmLvE.js rename to dist/chunks/LiveStreamTracker-H3ggC3_t.js index c359d141..80ffebd4 100644 --- a/dist/chunks/LiveStreamTracker-B3HhmLvE.js +++ b/dist/chunks/LiveStreamTracker-H3ggC3_t.js @@ -1,5 +1,5 @@ -import { Z as e, o as t, r as n } from "./events-B9CSrqJ_.js"; -import { t as r } from "./floatingViewerManager-B_1xQj1m.js"; +import { Z as e, o as t, r as n } from "./events-cBMXVULQ.js"; +import { t as r } from "./floatingViewerManager-Dx53diek.js"; // ui/features/viewer/LiveStreamTracker.ts var i = !1, a = null, o = null, s = null, c = null, l = null, u = null, d = null, f = null, p = 0, m = 0, h = !1, g = 400, _ = "kj_preview_override", v = /* @__PURE__ */ new Set([ "image/jpeg", diff --git a/dist/chunks/SidebarWorkflowSection-BMRq92Vq.js b/dist/chunks/SidebarWorkflowSection-ChuiYnSl.js similarity index 99% rename from dist/chunks/SidebarWorkflowSection-BMRq92Vq.js rename to dist/chunks/SidebarWorkflowSection-ChuiYnSl.js index 8a7ed4d3..72c74695 100644 --- a/dist/chunks/SidebarWorkflowSection-BMRq92Vq.js +++ b/dist/chunks/SidebarWorkflowSection-ChuiYnSl.js @@ -1,10 +1,10 @@ -import { $ as e, $t as t, At as n, Bt as r, Ct as i, Dt as a, Et as o, Ft as s, Gt as c, Ht as l, I as u, It as d, K as f, Kt as p, Mt as m, N as h, Nt as g, O as _, Ot as v, Pt as y, Q as b, Qt as x, R as S, Rt as C, S as ee, St as te, T as ne, Tt as w, Ut as T, Vt as re, X as ie, Y as E, Yt as ae, Z as oe, Zt as se, at as ce, cn as le, ct as ue, dt as de, et as D, gt as fe, it as pe, jt as me, k as he, kt as ge, ln as _e, lt as ve, nt as ye, ot as be, p as xe, rt as Se, tn as Ce, tt as we, ut as Te, w as Ee, wt as De } from "./viewerRuntimeHosts-CkUqwo6l.js"; -import { G as Oe, J as ke, N as Ae, R as je, T as Me, Tt as Ne, X as Pe, c as Fe, d as Ie, f as Le, h as Re, ht as ze, j as Be, l as Ve, m as O, o as k, p as He, rt as Ue, s as A, u as We, x as Ge, y as Ke } from "./events-B9CSrqJ_.js"; -import { F as qe, G as Je, J as Ye, P as Xe, f as Ze, m as Qe, p as $e } from "./Viewer-DCWIIJQl.js"; -import { t as et } from "./floatingViewerManager-B_1xQj1m.js"; +import { $ as e, $t as t, At as n, Bt as r, Ct as i, Dt as a, Et as o, Ft as s, Gt as c, Ht as l, I as u, It as d, K as f, Kt as p, Mt as m, N as h, Nt as g, O as _, Ot as v, Pt as y, Q as b, Qt as x, R as S, Rt as C, S as ee, St as te, T as ne, Tt as w, Ut as T, Vt as re, X as ie, Y as E, Yt as ae, Z as oe, Zt as se, at as ce, cn as le, ct as ue, dt as de, et as D, gt as fe, it as pe, jt as me, k as he, kt as ge, ln as _e, lt as ve, nt as ye, ot as be, p as xe, rt as Se, tn as Ce, tt as we, ut as Te, w as Ee, wt as De } from "./viewerRuntimeHosts-CW2DfHq_.js"; +import { G as Oe, J as ke, N as Ae, R as je, T as Me, Tt as Ne, X as Pe, c as Fe, d as Ie, f as Le, h as Re, ht as ze, j as Be, l as Ve, m as O, o as k, p as He, rt as Ue, s as A, u as We, x as Ge, y as Ke } from "./events-cBMXVULQ.js"; +import { F as qe, G as Je, J as Ye, P as Xe, f as Ze, m as Qe, p as $e } from "./Viewer-DCtCnRSG.js"; +import { t as et } from "./floatingViewerManager-Dx53diek.js"; import { A as tt, C as j, D as nt, E as M, G as rt, J as it, K as at, N as ot, O as N, R as st, S as ct, T as P, U as F, V as I, Y as lt, _ as ut, a as dt, b as ft, c as pt, d as mt, dt as L, f as ht, ft as R, g as gt, h as _t, i as vt, j as yt, k as z, l as bt, lt as B, m as xt, n as St, nt as Ct, o as wt, p as Tt, r as Et, rt as V, s as Dt, t as Ot, u as kt, ut as At, y as jt, z as Mt } from "./mjr-primevue-BRqtdXzb.js"; import { t as Nt } from "./mjr-vue-vendor-mHY_eIVE.js"; -import { t as Pt } from "./viewerOpenRequest-DaR0P9Y2.js"; +import { t as Pt } from "./viewerOpenRequest-Qkm4zxCi.js"; import { a as Ft, i as It, n as Lt, o as Rt, r as zt, t as Bt } from "./geninfoParser-CgHp-y-n.js"; // ui/app/settings/settingsUtils.ts var H = (e, t) => { @@ -5171,7 +5171,7 @@ var Vo = ["title"], Ho = ["src"], Uo = { setup(e) { let n = e, r = V(0), i = V(!1), a = null; function o() { - return a ||= import("./floatingViewerManager-B_1xQj1m.js").then((e) => e.n), a; + return a ||= import("./floatingViewerManager-Dx53diek.js").then((e) => e.n), a; } function s() { return (Array.isArray(n.inputFile?.previewCandidates) ? n.inputFile.previewCandidates : [])[r.value] || ""; diff --git a/dist/chunks/TagsEditor-BydzUbtv.js b/dist/chunks/TagsEditor-Dnqx3KZU.js similarity index 97% rename from dist/chunks/TagsEditor-BydzUbtv.js rename to dist/chunks/TagsEditor-Dnqx3KZU.js index c9c9c37b..a70d1ecf 100644 --- a/dist/chunks/TagsEditor-BydzUbtv.js +++ b/dist/chunks/TagsEditor-Dnqx3KZU.js @@ -1,6 +1,6 @@ -import { $t as e, F as t, v as n } from "./viewerRuntimeHosts-CkUqwo6l.js"; -import { m as r, n as i, wt as a } from "./events-B9CSrqJ_.js"; -import { J as o } from "./Viewer-DCWIIJQl.js"; +import { $t as e, F as t, v as n } from "./viewerRuntimeHosts-CW2DfHq_.js"; +import { m as r, n as i, wt as a } from "./events-cBMXVULQ.js"; +import { J as o } from "./Viewer-DCtCnRSG.js"; import { A as s, C as c, E as l, G as u, J as d, K as f, L as p, N as m, R as ee, T as h, U as te, V as g, Y as _, b as ne, ft as v, j as y, k as b, lt as x, rt as S, ut as C, z as w } from "./mjr-primevue-BRqtdXzb.js"; // ui/vue/components/common/TagsEditor.vue?vue&type=script&setup=true&lang.ts var T = ["aria-busy"], re = ["aria-label"], ie = { diff --git a/dist/chunks/Viewer-DCWIIJQl.js b/dist/chunks/Viewer-DCtCnRSG.js similarity index 99% rename from dist/chunks/Viewer-DCWIIJQl.js rename to dist/chunks/Viewer-DCtCnRSG.js index 0c9e7254..e845a97f 100644 --- a/dist/chunks/Viewer-DCWIIJQl.js +++ b/dist/chunks/Viewer-DCtCnRSG.js @@ -1,9 +1,9 @@ -import { $t as e, H as t, P as n, _ as r, c as i, d as a, g as o, gt as s, n as c, o as l, r as u, s as d, vt as f, x as p, y as m } from "./viewerRuntimeHosts-CkUqwo6l.js"; -import { D as h, Tt as g, a as _, at as v, h as y, ht as b, i as x, j as S, k as C, m as w, n as T, o as E, r as D, t as O, ut as k } from "./events-B9CSrqJ_.js"; +import { $t as e, H as t, P as n, _ as r, c as i, d as a, g as o, gt as s, n as c, o as l, r as u, s as d, vt as f, x as p, y as m } from "./viewerRuntimeHosts-CW2DfHq_.js"; +import { D as h, Tt as g, a as _, at as v, h as y, ht as b, i as x, j as S, k as C, m as w, n as T, o as E, r as D, t as O, ut as k } from "./events-cBMXVULQ.js"; import { T as A, nt as j, rt as M } from "./mjr-primevue-BRqtdXzb.js"; import { n as N, r as ee } from "./mjr-vue-vendor-mHY_eIVE.js"; import { n as P, r as te, t as F } from "./state-D0Gu1AgG.js"; -import { a as ne, c as re, i as ie, o as ae, r as oe, s as se } from "./model3dRenderer-BsJ9YHaZ.js"; +import { a as ne, c as re, i as ie, o as ae, r as oe, s as se } from "./model3dRenderer-B-J9oQzQ.js"; // ui/utils/events.ts function ce(e, t, { target: n = null, warnPrefix: r = "[Majoor]" } = {}) { let i = n || (typeof window < "u" ? window : null); @@ -9546,13 +9546,13 @@ var Br = null, Vr = null, Hr = null, Ur = null, Wr = null, Gr = null; function Kr() { Br || import("./abCompare-BUrGm4-x.js").then((e) => { Br = e; - }), Vr || import("./sideBySide-DEEkMdvW.js").then((e) => { + }), Vr || import("./sideBySide-BLNTzu0A.js").then((e) => { Vr = e; - }), Hr || import("./model3dRenderer-BsJ9YHaZ.js").then((e) => e.t).then((e) => { + }), Hr || import("./model3dRenderer-B-J9oQzQ.js").then((e) => e.t).then((e) => { Hr = e; }), Ur || import("./scopes-bvTRS68K.js").then((e) => { Ur = e; - }), Wr || import("./genInfo-B60U6rEQ.js").then((e) => e.n).then((e) => { + }), Wr || import("./genInfo-BDmVkfQ1.js").then((e) => e.n).then((e) => { Wr = e; }), Gr || import("./frameExport-CnNO7oN6.js").then((e) => { Gr = e; diff --git a/dist/chunks/ViewerPortal-D964vdje.js b/dist/chunks/ViewerPortal--B3uXYnD.js similarity index 97% rename from dist/chunks/ViewerPortal-D964vdje.js rename to dist/chunks/ViewerPortal--B3uXYnD.js index 5e865bbe..d9a113e2 100644 --- a/dist/chunks/ViewerPortal-D964vdje.js +++ b/dist/chunks/ViewerPortal--B3uXYnD.js @@ -1,9 +1,9 @@ -import { a as e, i as t } from "./viewerRuntimeHosts-CkUqwo6l.js"; -import { r as n } from "./events-B9CSrqJ_.js"; -import { a as r, c as i, i as a, l as o, o as s, s as c, t as l, u } from "./Viewer-DCWIIJQl.js"; -import { i as d, r as f } from "./floatingViewerManager-B_1xQj1m.js"; +import { a as e, i as t } from "./viewerRuntimeHosts-CW2DfHq_.js"; +import { r as n } from "./events-cBMXVULQ.js"; +import { a as r, c as i, i as a, l as o, o as s, s as c, t as l, u } from "./Viewer-DCtCnRSG.js"; +import { i as d, r as f } from "./floatingViewerManager-Dx53diek.js"; import { B as p, C as m, D as h, E as g, G as _, J as v, K as y, L as b, N as x, O as S, T as C, U as w, V as T, dt as E, ft as D, j as O, k, lt as A, rt as j, ut as M, w as N, z as P } from "./mjr-primevue-BRqtdXzb.js"; -import { t as F } from "./TagsEditor-BydzUbtv.js"; +import { t as F } from "./TagsEditor-Dnqx3KZU.js"; // ui/vue/components/viewer/FloatingViewerHost.vue var I = /* @__PURE__ */ x({ __name: "FloatingViewerHost", diff --git a/dist/chunks/events-B9CSrqJ_.js b/dist/chunks/events-cBMXVULQ.js similarity index 96% rename from dist/chunks/events-B9CSrqJ_.js rename to dist/chunks/events-cBMXVULQ.js index 3cd5e445..f4344365 100644 --- a/dist/chunks/events-B9CSrqJ_.js +++ b/dist/chunks/events-cBMXVULQ.js @@ -912,28 +912,75 @@ function ut(e, t = null) { return console.debug?.(e), null; } } -function dt(e, t = null) { - let n = t || N || j(); - if (!e || typeof e != "object") return !1; +function dt(e) { + if (!e || typeof e != "object" || Array.isArray(e) || Array.isArray(e.nodes)) return !1; + let t = Object.values(e).slice(0, 8); + return t.length ? t.every((e) => e && typeof e == "object" && typeof e.class_type == "string" && e.inputs && typeof e.inputs == "object") : !1; +} +function ft(e) { + if (!e || typeof e != "object") return { + format: "", + data: null + }; + if (Array.isArray(e.nodes)) return { + format: "ui", + data: e + }; + if (e.workflow && typeof e.workflow == "object" && Array.isArray(e.workflow.nodes)) return { + format: "ui", + data: e.workflow + }; + let t = e.prompt; + if (typeof t == "string") try { + t = JSON.parse(t); + } catch { + t = null; + } + return dt(t) ? { + format: "api", + data: t + } : dt(e) ? { + format: "api", + data: e + } : { + format: "", + data: null + }; +} +function pt(e, t = null, n = {}) { + let r = t || N || j(), i = ft(e); + if (i.format === "api") { + if (typeof r?.loadApiJson != "function") return !1; + try { + let e = r.loadApiJson(i.data, String(n.filename || "workflow.json")); + return e && typeof e.then == "function" && e.then(void 0, (e) => console.debug?.(e)), !0; + } catch (e) { + return console.debug?.(e), !1; + } + } + if (i.format === "ui" && (e = i.data), !e || typeof e != "object") return !1; try { let t = [ - n?.importWorkflow, - n?.loadWorkflow, - n?.workflowManager?.importWorkflow, - n?.workflowManager?.loadWorkflow, - n?.extensionManager?.workflow?.importWorkflow + r?.importWorkflow, + r?.loadWorkflow, + r?.workflowManager?.importWorkflow, + r?.workflowManager?.loadWorkflow, + r?.extensionManager?.workflow?.importWorkflow ]; - for (let r of t) if (typeof r == "function") try { - return r.call(n?.workflowManager || n?.extensionManager?.workflow || n, e), R(n, { + for (let n of t) if (typeof n == "function") try { + return n.call(r?.workflowManager || r?.extensionManager?.workflow || r, e), R(r, { draw: !1, change: !1 }), !0; } catch (e) { console.debug?.(e); } - if (typeof n?.loadGraphData == "function") return n.loadGraphData(e), !0; - let r = I(n); - if (typeof r?.configure == "function") return r.configure(e), R(n, { + if (typeof r?.loadGraphData == "function") { + let t = r.loadGraphData(e); + return t && typeof t.then == "function" && t.then(void 0, (e) => console.debug?.(e)), !0; + } + let n = I(r); + if (typeof n?.configure == "function") return n.configure(e), R(r, { draw: !1, change: !1 }), !0; @@ -942,14 +989,14 @@ function dt(e, t = null) { } return !1; } -function ft(e, t = null) { +function mt(e, t = null) { let n = t || N || j(); if (!e || typeof e != "object") return { ok: !1, mode: "none" }; try { - if (dt(e, n)) return { + if (pt(e, n)) return { ok: !0, mode: "replace" }; @@ -961,7 +1008,7 @@ function ft(e, t = null) { mode: "none" }; } -function pt(t = null) { +function ht(t = null) { try { let n = t || N || j(), r = e(n); if (typeof r?.serialize == "function") { @@ -983,7 +1030,7 @@ function pt(t = null) { } return null; } -function mt(e = null) { +function gt(e = null) { try { let t = e || N || j(); if (!t) return null; @@ -1015,7 +1062,7 @@ function mt(e = null) { } return null; } -async function ht(t = {}) { +async function _t(t = {}) { let n = t.app || N || j(); if (!n) throw Error("ComfyUI app not available"); let r = P(n), i = !!(r && typeof r.queuePrompt == "function" || r && typeof r.fetchApi == "function"); @@ -1063,7 +1110,7 @@ async function ht(t = {}) { throw tt(n, o), e; } } -function gt(e, t = {}) { +function vt(e, t = {}) { if (!e) return !1; try { let n = F(t.app || N || j()); @@ -1078,12 +1125,12 @@ function gt(e, t = {}) { return console.debug?.(e), !1; } } -function _t(n, r = null) { +function yt(n, r = null) { let i = String(n || "").trim(); if (!i) return !1; try { let n = r || N || j(), a = t(e(n), i); - return a ? gt(a, { + return a ? vt(a, { app: n, select: !1, focusCanvas: !1 @@ -1092,7 +1139,7 @@ function _t(n, r = null) { return console.debug?.(e), !1; } } -function vt() { +function bt() { let e = N || j() || null, t = e?.canvas || null, n = t?.ds || null, r = t?.canvas || t?.el || null; if (!t || !n || !r) return null; let i = Number(n?.scale), a = Number(r?.width || r?.clientWidth || 0), o = Number(r?.height || r?.clientHeight || 0); @@ -1105,10 +1152,10 @@ function vt() { height: o }; } -function yt(e, t, n) { +function xt(e, t, n) { return Array.isArray(e?.offset) ? (e.offset[0] = t, e.offset[1] = n, !0) : e?.offset && typeof e.offset == "object" ? (e.offset.x = t, e.offset.y = n, !0) : !1; } -function bt(e, t) { +function St(e, t) { try { t?.setDirty?.(!0, !0); } catch (e) { @@ -1120,21 +1167,21 @@ function bt(e, t) { console.debug?.(e); } } -function xt(e) { +function Ct(e) { try { - let t = vt(); + let t = bt(); if (!t || !e) return !1; let n = Number(e.x), r = Number(e.y); if (!Number.isFinite(n) || !Number.isFinite(r)) return !1; let i = Math.max(1, Number(globalThis?.devicePixelRatio ?? globalThis?.window?.devicePixelRatio) || 1), a = -n + t.width * .5 / (t.scale * i), o = -r + t.height * .5 / (t.scale * i); - return !Number.isFinite(a) || !Number.isFinite(o) || !yt(t.ds, a, o) ? !1 : (bt(t.app, t.graphCanvas), !0); + return !Number.isFinite(a) || !Number.isFinite(o) || !xt(t.ds, a, o) ? !1 : (St(t.app, t.graphCanvas), !0); } catch (e) { return console.debug?.(e), !1; } } -function St() { +function wt() { try { - let e = vt(); + let e = bt(); if (!e) return null; let t = e.ds?.offset, n = Number(Array.isArray(t) ? t[0] : t?.x), r = Number(Array.isArray(t) ? t[1] : t?.y); return !Number.isFinite(n) || !Number.isFinite(r) ? null : { @@ -1164,7 +1211,7 @@ function U(e, t, n) { console.debug?.(e); } } -function Ct() { +function Tt() { if (!B) try { V = (e) => { let t = String(e?.key || ""); @@ -1201,7 +1248,7 @@ var W = { subscribe(e, t) { let n = String(e || ""); if (!n || typeof t != "function") return () => {}; - Ct(); + Tt(); let r = z.get(n); return r || (r = /* @__PURE__ */ new Set(), z.set(n, r)), r.add(t), () => { try { @@ -1234,11 +1281,11 @@ var W = { } B = !1, V = null, z.clear(); } -}, G = "en-US", K = G, wt = /* @__PURE__ */ new Set(), Tt = ["mjr_lang", "majoor.lang"], Et = "mjr_lang_follow_comfy", Dt = 500, q = /* @__PURE__ */ new Set(), J = null, Ot = /* @__PURE__ */ new Set([ +}, G = "en-US", K = G, Et = /* @__PURE__ */ new Set(), Dt = ["mjr_lang", "majoor.lang"], Ot = "mjr_lang_follow_comfy", kt = 500, q = /* @__PURE__ */ new Set(), J = null, At = /* @__PURE__ */ new Set([ "ar-SA", "fa-IR", "he-IL" -]), kt = { +]), jt = { fr: "fr-FR", "fr-fr": "fr-FR", fr_FR: "fr-FR", @@ -2847,7 +2894,7 @@ var W = { "msg.newVersionDetail": "La version {latest} est disponible. Version installée : {current}.", "tooltip.starGithub": "Ouvrir GitHub et mettre une etoile" } -}, At = Object.freeze({ +}, Mt = Object.freeze({ "en-US": "English", "fr-FR": "Français", "zh-CN": "Chinese (Simplified)", @@ -2899,8 +2946,8 @@ var W = { ].forEach((e) => { Y[e] || (Y[e] = {}); }); -var X = !1, jt = null; -function Mt(e) { +var X = !1, Nt = null; +function Pt(e) { X || (X = !0, Object.entries(e || {}).forEach(([e, t]) => { Y[e] = { ...Y[e] || {}, @@ -2917,22 +2964,22 @@ function Z() { }); }); } -function Nt() { - return X ? Promise.resolve() : (jt ||= import("./i18n.generated-DqByySOH.js").then(({ GENERATED_TRANSLATIONS: e }) => { - Mt(e); +function Ft() { + return X ? Promise.resolve() : (Nt ||= import("./i18n.generated-DqByySOH.js").then(({ GENERATED_TRANSLATIONS: e }) => { + Pt(e); }).catch((e) => { console.warn("[Majoor i18n] Failed to load generated translations:", e), Z(); - }), jt); + }), Nt); } Z(); function Q(e) { if (!e) return G; let t = String(e || "").trim(), n = t.toLowerCase(); - return kt[n] ? kt[n] : Y[t] ? t : G; + return jt[n] ? jt[n] : Y[t] ? t : G; } -function Pt() { +function It() { try { - for (let e of Tt) { + for (let e of Dt) { let t = String(W.get(e) || "").trim(); if (t) return t; } @@ -2941,16 +2988,16 @@ function Pt() { } return ""; } -function Ft(e) { +function Lt(e) { try { - W.set(Tt[0], e), W.set(Tt[1], e); + W.set(Dt[0], e), W.set(Dt[1], e); } catch (e) { console.debug?.(e); } } -function It() { +function Rt() { try { - let e = String(W.get(Et) || "").trim().toLowerCase(); + let e = String(W.get(Ot) || "").trim().toLowerCase(); return !e || ![ "0", "false", @@ -2962,14 +3009,14 @@ function It() { } return !0; } -function Lt(e) { +function zt(e) { try { - W.set(Et, e ? "1" : "0"); + W.set(Ot, e ? "1" : "0"); } catch (e) { console.debug?.(e); } } -function Rt(e) { +function Bt(e) { let t = [], n = (e) => { if (typeof e != "string") return; let n = e.trim(); @@ -2984,7 +3031,7 @@ function Rt(e) { ]) n(Fe(e, t)); return n(e?.ui?.locale), n(e?.locale), n(e?.ui?.i18n?.locale), t; } -function zt() { +function Vt() { let e = [], t = (t) => { if (typeof t != "string") return; let n = t.trim(); @@ -3006,20 +3053,20 @@ function zt() { } return e; } -function Bt() { +function Ht() { try { if (typeof document < "u" && document.documentElement) { - let e = Ot.has(K); + let e = At.has(K); document.documentElement.dir = e ? "rtl" : "ltr"; } } catch (e) { console.debug?.(e); } } -var Vt = (e) => { +var Ut = (e) => { try { - let t = It(), n = Pt(), r = Q(n), i = () => { - let t = Rt(e); + let t = Rt(), n = It(), r = Q(n), i = () => { + let t = Bt(e); for (let e of t) { let t = Q(e); if (Y[t]) return $(t), !0; @@ -3041,7 +3088,7 @@ var Vt = (e) => { return; } if (i()) return; - let a = zt(); + let a = Vt(); for (let e of a) { let t = Q(e); if (Y[t]) { @@ -3054,24 +3101,24 @@ var Vt = (e) => { console.warn("[Majoor i18n] Failed to detect language:", e), $(G); } }, $ = (e) => { - Y[e] || (console.warn(`[Majoor i18n] Unknown language: ${e}, falling back to ${G}`), e = G), K !== e && (K = e, Ft(e), Bt(), e !== G && !X && Nt().then(() => { - Array.from(wt).forEach((t) => { + Y[e] || (console.warn(`[Majoor i18n] Unknown language: ${e}, falling back to ${G}`), e = G), K !== e && (K = e, Lt(e), Ht(), e !== G && !X && Ft().then(() => { + Array.from(Et).forEach((t) => { try { t(e); } catch (e) { console.debug?.(e); } }); - }), Array.from(wt).forEach((t) => { + }), Array.from(Et).forEach((t) => { try { t(e); } catch (e) { console.debug?.(e); } })); -}, Ht = (e) => { - Lt(!!e); -}, Ut = (e) => { +}, Wt = (e) => { + zt(!!e); +}, Gt = (e) => { try { J &&= (clearInterval(J), null), typeof window < "u" && window.__MJR_COMFY_LANG_SYNC_TIMER__ && (clearInterval(window.__MJR_COMFY_LANG_SYNC_TIMER__), window.__MJR_COMFY_LANG_SYNC_TIMER__ = null); } catch (e) { @@ -3079,8 +3126,8 @@ var Vt = (e) => { } J = setInterval(() => { try { - if (!It()) return; - let t = Rt(e); + if (!Rt()) return; + let t = Bt(e); for (let e of t) { let t = Q(e); if (Y[t] && t !== K) { @@ -3097,16 +3144,16 @@ var Vt = (e) => { } catch (e) { console.debug?.(e); } -}, Wt = () => K, Gt = () => Object.keys(Y).map((e) => ({ +}, Kt = () => K, qt = () => Object.keys(Y).map((e) => ({ code: e, - name: At[e] || e -})), Kt = (e, t, n) => { + name: Mt[e] || e +})), Jt = (e, t, n) => { let r = Y[K] || Y[G], i = Y[G], a = r[e] || i[e]; if (!a) { let n = `${K}:${String(e || "")}`; if (!q.has(n)) { - if (q.size >= Dt) { - let e = Math.floor(Dt * .2), t = q.values(); + if (q.size >= kt) { + let e = Math.floor(kt * .2), t = q.values(); for (let n = 0; n < e; n++) { let e = t.next().value; e && q.delete(e); @@ -3133,7 +3180,7 @@ var Vt = (e) => { return o && typeof o == "object" && Object.entries(o).forEach(([e, t]) => { a = a.replaceAll(`{${e}}`, String(t)); }), a; -}, qt = Object.freeze({ +}, Yt = Object.freeze({ DEBUG_SAFE_CALL: !1, DEBUG_SAFE_LISTENERS: !1, DEBUG_VIEWER: !1, @@ -3223,11 +3270,11 @@ var Vt = (e) => { DELETE_CONFIRMATION: !0, DEBUG_VERBOSE_ERRORS: !1, SIDEBAR_ASSET_BADGE_ENABLED: !0 -}), Jt = { ...qt }, Yt = "mjr:asset-rating-changed", Xt = "mjr:asset-tags-changed", Zt = "mjr:viewer-info-refreshed", Qt = "mjr:viewer-active-asset-changed", $t = Object.freeze({ - ASSET_RATING_CHANGED: Yt, - ASSET_TAGS_CHANGED: Xt, - VIEWER_INFO_REFRESHED: Zt, - VIEWER_ACTIVE_ASSET_CHANGED: Qt, +}), Xt = { ...Yt }, Zt = "mjr:asset-rating-changed", Qt = "mjr:asset-tags-changed", $t = "mjr:viewer-info-refreshed", en = "mjr:viewer-active-asset-changed", tn = Object.freeze({ + ASSET_RATING_CHANGED: Zt, + ASSET_TAGS_CHANGED: Qt, + VIEWER_INFO_REFRESHED: $t, + VIEWER_ACTIVE_ASSET_CHANGED: en, SCAN_COMPLETE: "mjr-scan-complete", CORE_EXECUTION_ASSETS_READY: "mjr-core-execution-assets-ready", ENRICHMENT_STATUS: "mjr-enrichment-status", @@ -3263,4 +3310,4 @@ var Vt = (e) => { OPEN_NODE_CONTEXT: "mjr:open-node-context", OPEN_MESSAGE_HISTORY: "mjr:open-message-history" }); -export { pe as $, P as A, Ye as B, gt as C, s as Ct, Pe as D, Ze as E, ft as F, Le as G, R as H, Xe as I, Ie as J, Be as K, mt as L, at as M, Fe as N, Qe as O, dt as P, A as Q, Re as R, qe as S, o as St, St as T, u as Tt, Ue as U, ht as V, We as W, ze as X, Me as Y, Ke as Z, Ve as _, ce as _t, Zt as a, oe as at, _t as b, C as bt, Wt as c, x as ct, Ht as d, b as dt, fe as et, $ as f, re as ft, He as g, ie as gt, W as h, v as ht, Qt as i, _ as it, Ge as j, Ne as k, Gt as l, ae as lt, Kt as m, y as mt, Xt as n, ke as nt, Jt as o, ee as ot, Ut as p, ne as pt, pt as q, $t as r, g as rt, qt as s, ue as st, Yt as t, Ae as tt, Vt as u, se as ut, ct as v, le as vt, ot as w, l as wt, ut as x, d as xt, xt as y, S as yt, st as z }; +export { pe as $, P as A, Ye as B, vt as C, s as Ct, Pe as D, Ze as E, mt as F, Le as G, R as H, Xe as I, Ie as J, Be as K, gt as L, at as M, Fe as N, Qe as O, pt as P, A as Q, Re as R, qe as S, o as St, wt as T, u as Tt, Ue as U, _t as V, We as W, ze as X, Me as Y, Ke as Z, Ve as _, ce as _t, $t as a, oe as at, yt as b, C as bt, Kt as c, x as ct, Wt as d, b as dt, fe as et, $ as f, re as ft, He as g, ie as gt, W as h, v as ht, en as i, _ as it, Ge as j, Ne as k, qt as l, ae as lt, Jt as m, y as mt, Qt as n, ke as nt, Xt as o, ee as ot, Gt as p, ne as pt, ht as q, tn as r, g as rt, Yt as s, ue as st, Zt as t, Ae as tt, Ut as u, se as ut, ct as v, le as vt, ot as w, l as wt, ut as x, d as xt, Ct as y, S as yt, st as z }; diff --git a/dist/chunks/floatingViewerManager-B_1xQj1m.js b/dist/chunks/floatingViewerManager-Dx53diek.js similarity index 99% rename from dist/chunks/floatingViewerManager-B_1xQj1m.js rename to dist/chunks/floatingViewerManager-Dx53diek.js index f7ce721a..0f219d08 100644 --- a/dist/chunks/floatingViewerManager-B_1xQj1m.js +++ b/dist/chunks/floatingViewerManager-Dx53diek.js @@ -1,6 +1,6 @@ import { t as e } from "./rolldown-runtime-CGnMp29N.js"; -import { _ as t, d as n, o as r, s as i, t as a } from "./viewerRuntimeHosts-CkUqwo6l.js"; -import { B as o, o as s, r as c } from "./events-B9CSrqJ_.js"; +import { _ as t, d as n, o as r, s as i, t as a } from "./viewerRuntimeHosts-CW2DfHq_.js"; +import { B as o, o as s, r as c } from "./events-cBMXVULQ.js"; // ui/features/panel/panelRuntimeRefs.ts var l = null; function u(e) { @@ -96,7 +96,7 @@ var te = /* @__PURE__ */ e({ teardownFloatingViewerManager: () => we }), v = null, y = null; async function ne() { - return v || (y ||= import("./FloatingViewer-DjWZOB3Z.js").then((e) => (v = e.FloatingViewer, v)), y); + return v || (y ||= import("./FloatingViewer-BnQlxpbB.js").then((e) => (v = e.FloatingViewer, v)), y); } var b = null, re = null; async function ie() { diff --git a/dist/chunks/genInfo-B60U6rEQ.js b/dist/chunks/genInfo-BDmVkfQ1.js similarity index 99% rename from dist/chunks/genInfo-B60U6rEQ.js rename to dist/chunks/genInfo-BDmVkfQ1.js index c8b4c4f5..4ed3d24f 100644 --- a/dist/chunks/genInfo-B60U6rEQ.js +++ b/dist/chunks/genInfo-BDmVkfQ1.js @@ -1,7 +1,7 @@ import { t as e } from "./rolldown-runtime-CGnMp29N.js"; -import { m as t, o as n } from "./events-B9CSrqJ_.js"; -import { h as r } from "./Viewer-DCWIIJQl.js"; -import { i, n as a, r as o, t as s, u as c } from "./SidebarWorkflowSection-BMRq92Vq.js"; +import { m as t, o as n } from "./events-cBMXVULQ.js"; +import { h as r } from "./Viewer-DCtCnRSG.js"; +import { i, n as a, r as o, t as s, u as c } from "./SidebarWorkflowSection-ChuiYnSl.js"; import { D as l, E as u, N as d, O as f, T as p, V as m, dt as h, ft as g, k as _, lt as v } from "./mjr-primevue-BRqtdXzb.js"; // ui/vue/components/viewer/ViewerMetadataBlock.vue?vue&type=script&setup=true&lang.ts var y = { style: { diff --git a/dist/chunks/model3dRenderer-BsJ9YHaZ.js b/dist/chunks/model3dRenderer-B-J9oQzQ.js similarity index 99% rename from dist/chunks/model3dRenderer-BsJ9YHaZ.js rename to dist/chunks/model3dRenderer-B-J9oQzQ.js index d618496f..d57df638 100644 --- a/dist/chunks/model3dRenderer-BsJ9YHaZ.js +++ b/dist/chunks/model3dRenderer-B-J9oQzQ.js @@ -1,5 +1,5 @@ import { t as e } from "./rolldown-runtime-CGnMp29N.js"; -import { gt as t, m as n, o as r, r as i } from "./events-B9CSrqJ_.js"; +import { gt as t, m as n, o as r, r as i } from "./events-cBMXVULQ.js"; import { n as a } from "./state-D0Gu1AgG.js"; // ui/features/viewer/model3dCore.ts function o(e, t) { diff --git a/dist/chunks/openMajoorSettings-D92RuxBO.js b/dist/chunks/openMajoorSettings-LbIz63Ni.js similarity index 99% rename from dist/chunks/openMajoorSettings-D92RuxBO.js rename to dist/chunks/openMajoorSettings-LbIz63Ni.js index 0afceb27..3eca4860 100644 --- a/dist/chunks/openMajoorSettings-D92RuxBO.js +++ b/dist/chunks/openMajoorSettings-LbIz63Ni.js @@ -1,6 +1,6 @@ -import { A as e, E as t, S as n, Z as r, b as i, j as a, m as o, z as s } from "./events-B9CSrqJ_.js"; +import { A as e, E as t, S as n, Z as r, b as i, j as a, m as o, z as s } from "./events-cBMXVULQ.js"; import { a as c, n as l } from "./graphTraversal-DTdQWkn5.js"; -import { S as u, Y as d, b as f, x as p, y as m } from "./SidebarWorkflowSection-BMRq92Vq.js"; +import { S as u, Y as d, b as f, x as p, y as m } from "./SidebarWorkflowSection-ChuiYnSl.js"; // ui/features/viewer/floatingViewerProgress.ts var h = "progress-update", g = "__MJR_MFV_PROGRESS_SERVICE__"; function ee() { diff --git a/dist/chunks/sideBySide-DEEkMdvW.js b/dist/chunks/sideBySide-BLNTzu0A.js similarity index 99% rename from dist/chunks/sideBySide-DEEkMdvW.js rename to dist/chunks/sideBySide-BLNTzu0A.js index 8f3be2d9..19a2196e 100644 --- a/dist/chunks/sideBySide-DEEkMdvW.js +++ b/dist/chunks/sideBySide-BLNTzu0A.js @@ -1,4 +1,4 @@ -import { i as e } from "./model3dRenderer-BsJ9YHaZ.js"; +import { i as e } from "./model3dRenderer-B-J9oQzQ.js"; import { i as t, o as n } from "./geninfoParser-CgHp-y-n.js"; // ui/features/viewer/sideBySide.ts function r(e) { diff --git a/dist/chunks/viewerOpenRequest-DaR0P9Y2.js b/dist/chunks/viewerOpenRequest-Qkm4zxCi.js similarity index 90% rename from dist/chunks/viewerOpenRequest-DaR0P9Y2.js rename to dist/chunks/viewerOpenRequest-Qkm4zxCi.js index a4769ebb..682c5ca6 100644 --- a/dist/chunks/viewerOpenRequest-DaR0P9Y2.js +++ b/dist/chunks/viewerOpenRequest-Qkm4zxCi.js @@ -1,6 +1,6 @@ import { t as e } from "./rolldown-runtime-CGnMp29N.js"; -import { r as t } from "./events-B9CSrqJ_.js"; -import { t as n } from "./Viewer-DCWIIJQl.js"; +import { r as t } from "./events-cBMXVULQ.js"; +import { t as n } from "./Viewer-DCtCnRSG.js"; // ui/features/viewer/viewerOpenRequest.ts var r = /* @__PURE__ */ e({ requestViewerOpen: () => o }); function i(e) { diff --git a/dist/chunks/viewerRuntimeHosts-CkUqwo6l.js b/dist/chunks/viewerRuntimeHosts-CW2DfHq_.js similarity index 99% rename from dist/chunks/viewerRuntimeHosts-CkUqwo6l.js rename to dist/chunks/viewerRuntimeHosts-CW2DfHq_.js index c1d327bc..18072300 100644 --- a/dist/chunks/viewerRuntimeHosts-CkUqwo6l.js +++ b/dist/chunks/viewerRuntimeHosts-CW2DfHq_.js @@ -1,4 +1,4 @@ -import { Ct as e, Tt as t, _t as n, bt as r, it as i, k as a, m as o, o as s, rt as c, vt as l, wt as u, yt as d } from "./events-B9CSrqJ_.js"; +import { Ct as e, Tt as t, _t as n, bt as r, it as i, k as a, m as o, o as s, rt as c, vt as l, wt as u, yt as d } from "./events-cBMXVULQ.js"; // ui/app/settingsStore.ts var f = "mjrSettings", p = "mjrMinimapSettings", m = /* @__PURE__ */ new Set([ "POST", diff --git a/dist/entry.js b/dist/entry.js index 9e4628d3..73a34e51 100644 --- a/dist/entry.js +++ b/dist/entry.js @@ -1,13 +1,13 @@ -import { $t as e, A as t, B as n, Bt as r, C as i, D as a, E as o, Et as s, G as c, H as l, J as u, Jt as d, L as f, Lt as p, M as m, N as h, O as g, P as _, Rt as v, S as y, U as b, Ut as x, V as S, Vt as C, W as w, Wt as T, Xt as E, Yt as D, _ as O, _t as k, an as A, b as j, bt as M, c as N, d as P, en as ee, f as te, ft as F, g as I, gt as ne, h as re, ht as ie, in as ae, j as oe, jt as se, k as L, l as ce, m as le, mt as ue, nn as de, o as fe, on as pe, pt as me, q as he, qt as ge, rn as _e, s as ve, sn as ye, st as be, tn as xe, u as Se, ut as Ce, vt as we, w as Te, xt as Ee, y as De, yt as Oe, z as ke, zt as Ae } from "./chunks/viewerRuntimeHosts-CkUqwo6l.js"; -import { $ as je, A as Me, Ct as Ne, F as Pe, J as Fe, K as Ie, L as Le, Q as Re, St as ze, Tt as Be, U as Ve, W as He, Y as Ue, _ as We, at as Ge, ct as Ke, dt as qe, et as Je, ft as Ye, g as Xe, ht as Ze, j as Qe, lt as $e, m as R, mt as et, n as z, nt as tt, o as B, ot as nt, pt as rt, q as it, r as V, rt as at, st as ot, t as st, tt as ct, ut as lt, wt as ut, xt as dt } from "./chunks/events-B9CSrqJ_.js"; +import { $t as e, A as t, B as n, Bt as r, C as i, D as a, E as o, Et as s, G as c, H as l, J as u, Jt as d, L as f, Lt as p, M as m, N as h, O as g, P as _, Rt as v, S as y, U as b, Ut as x, V as S, Vt as C, W as w, Wt as T, Xt as E, Yt as D, _ as O, _t as k, an as A, b as j, bt as M, c as N, d as P, en as ee, f as te, ft as F, g as I, gt as ne, h as re, ht as ie, in as ae, j as oe, jt as se, k as L, l as ce, m as le, mt as ue, nn as de, o as fe, on as pe, pt as me, q as he, qt as ge, rn as _e, s as ve, sn as ye, st as be, tn as xe, u as Se, ut as Ce, vt as we, w as Te, xt as Ee, y as De, yt as Oe, z as ke, zt as Ae } from "./chunks/viewerRuntimeHosts-CW2DfHq_.js"; +import { $ as je, A as Me, Ct as Ne, F as Pe, J as Fe, K as Ie, L as Le, Q as Re, St as ze, Tt as Be, U as Ve, W as He, Y as Ue, _ as We, at as Ge, ct as Ke, dt as qe, et as Je, ft as Ye, g as Xe, ht as Ze, j as Qe, lt as $e, m as R, mt as et, n as z, nt as tt, o as B, ot as nt, pt as rt, q as it, r as V, rt as at, st as ot, t as st, tt as ct, ut as lt, wt as ut, xt as dt } from "./chunks/events-cBMXVULQ.js"; import { a as ft, i as pt, n as mt, t as ht } from "./chunks/graphTraversal-DTdQWkn5.js"; -import { A as gt, B as _t, C as vt, D as yt, E as bt, F as xt, H as St, I as Ct, J as wt, K as Tt, L as Et, M as Dt, N as Ot, O as kt, P as At, R as jt, S as Mt, T as Nt, U as Pt, V as Ft, W as It, _ as Lt, b as Rt, d as zt, g as Bt, j as Vt, k as Ht, q as Ut, v as Wt, x as Gt, y as Kt, z as qt } from "./chunks/Viewer-DCWIIJQl.js"; -import { $ as Jt, A as Yt, B as Xt, C as Zt, D as Qt, E as $t, F as en, G as tn, H as nn, I as rn, J as an, K as on, L as sn, M as cn, N as ln, O as un, P as dn, Q as fn, R as pn, T as mn, U as hn, V as gn, W as _n, X as vn, Y as yn, Z as bn, _ as xn, a as Sn, c as Cn, d as wn, et as Tn, f as En, g as Dn, h as On, i as kn, j as An, k as jn, l as Mn, m as Nn, n as Pn, nt as Fn, o as In, p as Ln, q as Rn, s as zn, t as Bn, tt as Vn, u as Hn, w as Un, z as Wn } from "./chunks/SidebarWorkflowSection-BMRq92Vq.js"; -import { _ as Gn, i as Kn, n as qn, p as Jn, t as Yn } from "./chunks/openMajoorSettings-D92RuxBO.js"; -import { a as Xn, c as Zn, l as Qn, o as $n, s as er, u as tr } from "./chunks/floatingViewerManager-B_1xQj1m.js"; +import { A as gt, B as _t, C as vt, D as yt, E as bt, F as xt, H as St, I as Ct, J as wt, K as Tt, L as Et, M as Dt, N as Ot, O as kt, P as At, R as jt, S as Mt, T as Nt, U as Pt, V as Ft, W as It, _ as Lt, b as Rt, d as zt, g as Bt, j as Vt, k as Ht, q as Ut, v as Wt, x as Gt, y as Kt, z as qt } from "./chunks/Viewer-DCtCnRSG.js"; +import { $ as Jt, A as Yt, B as Xt, C as Zt, D as Qt, E as $t, F as en, G as tn, H as nn, I as rn, J as an, K as on, L as sn, M as cn, N as ln, O as un, P as dn, Q as fn, R as pn, T as mn, U as hn, V as gn, W as _n, X as vn, Y as yn, Z as bn, _ as xn, a as Sn, c as Cn, d as wn, et as Tn, f as En, g as Dn, h as On, i as kn, j as An, k as jn, l as Mn, m as Nn, n as Pn, nt as Fn, o as In, p as Ln, q as Rn, s as zn, t as Bn, tt as Vn, u as Hn, w as Un, z as Wn } from "./chunks/SidebarWorkflowSection-ChuiYnSl.js"; +import { _ as Gn, i as Kn, n as qn, p as Jn, t as Yn } from "./chunks/openMajoorSettings-LbIz63Ni.js"; +import { a as Xn, c as Zn, l as Qn, o as $n, s as er, u as tr } from "./chunks/floatingViewerManager-Dx53diek.js"; import { A as nr, B as rr, C as H, D as ir, E as U, G as ar, H as or, I as sr, J as W, K as cr, L as lr, M as ur, N as dr, O as G, P as fr, R as pr, S as mr, T as K, U as hr, V as q, W as gr, Y as _r, at as vr, b as yr, ct as br, dt as xr, ft as J, it as Sr, j as Y, k as X, lt as Z, nt as Cr, ot as wr, q as Tr, rt as Q, tt as Er, ut as Dr, v as Or, w as kr, x as Ar, y as jr, z as Mr } from "./chunks/mjr-primevue-BRqtdXzb.js"; import { n as Nr, r as Pr } from "./chunks/mjr-vue-vendor-mHY_eIVE.js"; -import { t as Fr } from "./chunks/TagsEditor-BydzUbtv.js"; +import { t as Fr } from "./chunks/TagsEditor-Dnqx3KZU.js"; import { app as Ir } from "../../scripts/app.js"; function Lr(e = null) { return null; @@ -869,7 +869,7 @@ var ji = { } }, Mi = null; function Ni() { - return Mi ||= import("./chunks/viewerOpenRequest-DaR0P9Y2.js").then((e) => e.n), Mi; + return Mi ||= import("./chunks/viewerOpenRequest-Qkm4zxCi.js").then((e) => e.n), Mi; } function Pi(e) { if (!e) return ""; @@ -1361,10 +1361,10 @@ function Hi() { // ui/features/contextmenu/GridContextMenu.ts var Ui = 1, Wi = null, Gi = null; function Ki() { - return Wi ||= import("./chunks/viewerOpenRequest-DaR0P9Y2.js").then((e) => e.n), Wi; + return Wi ||= import("./chunks/viewerOpenRequest-Qkm4zxCi.js").then((e) => e.n), Wi; } function qi() { - return Gi ||= import("./chunks/floatingViewerManager-B_1xQj1m.js").then((e) => e.n), Gi; + return Gi ||= import("./chunks/floatingViewerManager-Dx53diek.js").then((e) => e.n), Gi; } function Ji(e) { let t = String(e || "").trim().toLowerCase(); @@ -7587,10 +7587,10 @@ var qu = { Q(!0); let s = Q(0), c = Q(0), l = /* @__PURE__ */ new WeakMap(), u = 0, d = 0, f = 0, p = 0, m = 0, h = /* @__PURE__ */ new Map(), g = null, _ = null; function v() { - return g ||= import("./chunks/viewerOpenRequest-DaR0P9Y2.js").then((e) => e.n), g; + return g ||= import("./chunks/viewerOpenRequest-Qkm4zxCi.js").then((e) => e.n), g; } function b() { - return _ ||= import("./chunks/floatingViewerManager-B_1xQj1m.js").then((e) => e.n), _; + return _ ||= import("./chunks/floatingViewerManager-Dx53diek.js").then((e) => e.n), _; } function x(e) { return (Array.isArray(e) ? e : []).slice().sort((e, t) => { @@ -8854,10 +8854,10 @@ var qu = { } }), cd = 240, ld = 120, ud = 80, dd = null, fd = null; function pd() { - return dd ||= import("./chunks/viewerOpenRequest-DaR0P9Y2.js").then((e) => e.n), dd; + return dd ||= import("./chunks/viewerOpenRequest-Qkm4zxCi.js").then((e) => e.n), dd; } function md() { - return fd ||= import("./chunks/floatingViewerManager-B_1xQj1m.js").then((e) => e.n), fd; + return fd ||= import("./chunks/floatingViewerManager-Dx53diek.js").then((e) => e.n), fd; } function hd(e) { let t = document.createElement("button"); @@ -11098,7 +11098,7 @@ function Wp() { var Gp = /* @__PURE__ */ dr({ __name: "GlobalRuntime", setup(e) { - let t = ur(() => import("./chunks/ViewerPortal-D964vdje.js")), n = Q(!1), r = [ + let t = ur(() => import("./chunks/ViewerPortal--B3uXYnD.js")), n = Q(!1), r = [ V.OPEN_VIEWER, V.MFV_OPEN, V.MFV_TOGGLE, @@ -23954,7 +23954,7 @@ async function TC(e) { try { let t = await SC(e); if (t.length) { - let { floatingViewerManager: e } = await import("./chunks/floatingViewerManager-B_1xQj1m.js").then((e) => e.n); + let { floatingViewerManager: e } = await import("./chunks/floatingViewerManager-Dx53diek.js").then((e) => e.n); if (await e.openAssets({ assets: t, index: 0 @@ -24424,7 +24424,7 @@ function QC({ cleanupEntryRuntimeFn: e = XC, teardownLiveStreamTracker: t, teard // ui/entry.ts var $C = null, ew = null, tw = null; function nw() { - return tw ||= import("./chunks/floatingViewerManager-B_1xQj1m.js").then((e) => e.n), tw; + return tw ||= import("./chunks/floatingViewerManager-Dx53diek.js").then((e) => e.n), tw; } function rw() { tw && tw.then((e) => e?.teardownFloatingViewerManager?.()).catch((e) => console.debug?.("[Majoor] MFV teardown skipped", e)); @@ -24544,7 +24544,7 @@ function Sw(e = 1200) { }, Math.max(250, Number(e) || 0)); } function Cw(e) { - import("./chunks/LiveStreamTracker-B3HhmLvE.js").then((t) => { + import("./chunks/LiveStreamTracker-H3ggC3_t.js").then((t) => { $C = t; try { t.initLiveStreamTracker(e); diff --git a/docs/COMFYUI_INTEGRATION_AUDIT.md b/docs/COMFYUI_INTEGRATION_AUDIT.md index 9b9e0835..1bc7fb6a 100644 --- a/docs/COMFYUI_INTEGRATION_AUDIT.md +++ b/docs/COMFYUI_INTEGRATION_AUDIT.md @@ -155,6 +155,55 @@ Ces deux derniers retiraient de `state.assets` des fichiers distincts d'autres d **À suivre.** Une pile « même dossier, même nom » correspond à plusieurs lignes en base pour un même fichier. C'est possible avec des index créés par d'anciennes versions, par exemple des variantes de casse sous Windows : les insertions actuelles normalisent le chemin. Une fusion de ces lignes, qui conserverait notes, tags et collections, reste à faire comme opération de maintenance explicite. +## 3 quinquies. Recherche, fichiers JSON, sidecars et viewers + +### Recherche (FTS5) +Testée sur un vrai index avec des noms piégeux. + +| Requête | Avant | Après | +| --- | --- | --- | +| `at-7` (frappe en cours), `(2)`, `AND`, `NEAR`, `NOT x`, `x` | erreur « Invalid search query syntax » | résultats | +| `"` seul (début d'une phrase) | erreur | tout afficher | +| `портрет`, `猫の写真` | caractères supprimés, donc erreur | recherche dans l'écriture d'origine | + +Cause : `_sanitize_fts_query` retirait les mots-outils, les jetons d'un caractère et les opérateurs, puis tous les caractères non ASCII. Quand il ne restait rien, SQLite recevait un `MATCH ''` invalide. + +Correctif : +- jetons `\w+` dans toutes les écritures ; +- repli sur les termes bruts quand le filtrage vide tout ; +- requête sans caractère de mot traitée comme « tout afficher » ; +- retrait des accents limité au latin, comme `unicode61`. + +Les mots réservés en minuscules sont des mots ordinaires pour FTS5, ses opérateurs n'existant qu'en majuscules. + +### Sidecars JSON +- Avant : uniquement pour la 3D (`.json`). +- Maintenant : pour toutes les images, vidéos et fichiers audio (module `features/metadata/sidecar.py`). On cherche `..json`, puis `.json`. Le fichier peut contenir un workflow UI, un prompt API ou un wrapper `{workflow, prompt}` (valeurs éventuellement sous forme de chaîne JSON), plus `parameters`, `geninfo` et `generation_time_ms`. Taille maximale 10 Mo, BOM accepté. +- Les métadonnées intégrées au fichier restent prioritaires. +- Un JSON sans rapport (des réglages, par exemple) n'est pas pris pour un sidecar. + +Limite connue : un sidecar ajouté **après** l'indexation n'est pris en compte qu'au prochain scan forcé, car la date de modification du média ne change pas. + +### Reconnaissance des JSON de workflows (onglet Workflow) +Vérifié sur un vrai dossier : +- les instantanés `.history//.json` apparaissaient comme workflows ; +- un `settings.json` quelconque apparaissait comme workflow ; +- un workflow avec BOM disparaissait ; +- un prompt API s'affichait avec 0 nœud puis s'ouvrait sur un canvas vide. + +Correctif : +- parcours qui ignore les dossiers et fichiers cachés ; +- `workflow_json_format()` (`ui`, `api` ou rien), qui accepte aussi un workflow vide et les wrappers ; +- lecture en `utf-8-sig` ; +- les JSON invalides sortent de l'index ; +- ouverture côté frontend par `app.loadApiJson` pour le format API ; +- `loadGraphData`, devenu asynchrone, n'a plus de rejet non géré. + +### Viewers +- **Viewer principal** : les médias sont correctement libérés (`destroyMediaProcessorsIn` : pause, retrait de `src`, `load()`), et les écouteurs globaux sont retirés. +- **Viewer flottant** : il ne faisait que mettre en pause avant `replaceChildren()` et `dispose()`. Une `