diff --git a/docs/i18n-translation-guidelines.md b/docs/i18n-translation-guidelines.md index 862b984c..00570ca8 100644 --- a/docs/i18n-translation-guidelines.md +++ b/docs/i18n-translation-guidelines.md @@ -239,6 +239,18 @@ Locales: `en`, `zh-CN`, `zh-TW`, `ja`, `ko`, `fr`, `de`, `es`, `ru`, `he` (RTL). > `toast.contextMenu.linkHfSuccess` (the toast now says "model source" instead of > "HuggingFace", commit `5ab0e88ab`). No `[TODO: Translate]` placeholder remains. +> **Status (2026-10, workflow management):** the Workflows page (`workflows.*`) manages the +> ComfyUI workflow JSON files in their own library folders and shipped with the settings toggle +> and folder list (`settings.folderSettings.enableWorkflows*` / `.workflowFolders*`), the folder +> key label, the two folder-list nav paths and the initialization progress text — 41 keys +> `[TODO: Translate]` in all 9 locales, now translated (terminology in §2, "Workflows feature"). +> `Workflow` reuses the term already fixed in §5 per locale: Latin in fr/de/es/ru/he (so +> `header.navigation.workflows` and `workflows.title` stay `Workflows` there), 工作流 in +> zh-CN/zh-TW, ワークフロー in ja, 워크플로 in ko. The three `workflows.noPaths.open*` buttons are +> byte-identical to `other.noPaths.open*` (same actions), and the nav-path hints reuse +> `other.disabled.hint`'s "Settings > Library" / `other.noPaths.descriptionStandalone`'s +> "Settings → Model Paths" renderings. No `[TODO: Translate]` placeholder remains. + --- ## 1. Hard rules (do not violate) @@ -928,6 +940,36 @@ Most of these strings are assembled from existing renderings rather than new ter - `firstRun.language.label` reuses `common.language.select` (zh-CN keeps its 选择语言 verb label rather than introducing a second rendering of "Language"). +### Workflows feature (page, folders, restore/update actions) + +The Workflows page (`workflows.*`) lists the ComfyUI workflow JSON files kept in their own +library folders. **Workflow** is the §5 term per locale and never becomes a different noun; +"workflow management" is the feature name, built from that noun plus the locale's management +word (`Verwaltung` / `gestion` / `gestión` / `управление` / `ניהול`). + +| Term | Rendering | +|---|---| +| Workflows (page title / nav) | zh-CN 工作流 · zh-TW 工作流 · ja ワークフロー · ko 워크플로 · fr/de/es/ru/he Workflows | +| workflow (noun in prose) | zh-CN 工作流 · zh-TW 工作流 · ja ワークフロー · ko 워크플로 · fr workflow · de Workflow · es workflow · ru workflow · he workflow | +| Workflow Management (settings toggle) | zh-CN 工作流管理 · zh-TW 工作流管理 · ja ワークフロー管理 · ko 워크플로 관리 · fr Gestion des workflows · de Workflow-Verwaltung · es Gestión de workflows · ru Управление workflow · he ניהול workflow | +| Workflow Folders / Workflow Paths | zh-CN 工作流文件夹 / 工作流路径 · zh-TW 工作流資料夾 / 工作流路徑 · ja ワークフローフォルダー / ワークフローパス · ko 워크플로 폴더 / 워크플로 경로 · fr Dossiers de workflows / Chemins de workflows · de Workflow-Ordner / Workflow-Pfade · es Carpetas de workflows / Rutas de workflows · ru Папки workflow / Пути workflow · he תיקיות workflow / נתיבי workflow | +| Open in ComfyUI (card action and context menu) | zh-CN 在 ComfyUI 中打开 · zh-TW 在 ComfyUI 中開啟 · ja ComfyUIで開く · ko ComfyUI에서 열기 · fr Ouvrir dans ComfyUI · de In ComfyUI öffnen · es Abrir en ComfyUI · ru Открыть в ComfyUI · he פתח ב-ComfyUI | +| Update from ComfyUI | zh-CN 从 ComfyUI 更新 · zh-TW 從 ComfyUI 更新 · ja ComfyUIから更新 · ko ComfyUI에서 업데이트 · fr Mettre à jour depuis ComfyUI · de Von ComfyUI aktualisieren · es Actualizar desde ComfyUI · ru Обновить из ComfyUI · he עדכן מ-ComfyUI | +| Restore Downloaded Version | zh-CN 恢复已下载版本 · zh-TW 還原已下載版本 · ja ダウンロード済みバージョンを復元 · ko 다운로드한 버전 복원 · fr Restaurer la version téléchargée · de Heruntergeladene Version wiederherstellen · es Restaurar versión descargada · ru Восстановить загруженную версию · he שחזר את הגרסה שהורדה | + +- "CivitAI Workflow resources" keeps `Workflow` in Latin even in the CJK locales: it names + CivitAI's resource type (the §2 "Other Models" rule for model-type names), not this page. +- `folder_paths.workflows` is a JSON key and stays byte-identical in every locale. +- `noPaths.descriptionStandalone` keeps the standalone split — **Settings → Model Paths** plus + a restart — while `.descriptionComfyUI` points at **Settings → Library** and a page reload; + both reuse the nav-path renderings of `other.noPaths.*` / `other.disabled.hint`. +- `disabled.*` mirrors `other.disabled.*` sentence by sentence ("management is off", "Enable it + to …", "Failed to enable …"), and `noPaths.*` mirrors `other.noPaths.*` — including the three + `open*` buttons, which are byte-identical to their `other.noPaths.open*` twins. +- Failure toasts carry `{message}` verbatim. CJK uses the full-width colon (`:`); ko and the + Latin/Cyrillic/Hebrew locales use ASCII (fr with its space, ` : `). The `restoring` loading + line follows each locale's existing "… in progress" shape (`recipesPathMigrating`). + --- ## 3. Cross-cutting confusion hot-spots (must-fix list) diff --git a/locales/de.json b/locales/de.json index 1269b71c..5c417048 100644 --- a/locales/de.json +++ b/locales/de.json @@ -156,7 +156,9 @@ "embeddingNameCopied": "Embedding-Syntax kopiert", "modelNameCopied": "Modellname kopiert", "sendCheckpointToWorkflow": "An ComfyUI senden", - "sendEmbeddingToWorkflow": "An ComfyUI senden" + "sendEmbeddingToWorkflow": "An ComfyUI senden", + "openInComfyUI": "In ComfyUI öffnen", + "copyWorkflowToClipboard": "Workflow in die Zwischenablage kopieren" }, "nsfw": { "matureContent": "Nicht jugendfreie Inhalte", @@ -244,6 +246,7 @@ "checkpoints": "Checkpoints", "embeddings": "Embeddings", "other": "Andere", + "workflows": "Workflows", "statistics": "Statistiken" }, "search": { @@ -633,6 +636,10 @@ "defaultControlnetRootHelp": "Legen Sie den Standard-ControlNet-Stammordner für Downloads, Importe und Verschiebungen fest", "enableOtherModels": "Verwaltung weiterer Modelle", "enableOtherModelsHelp": "Wenn deaktiviert, werden VAE-, Upscaler-, Text-Encoder-, CLIP-Vision- und ControlNet-Ordner nicht gescannt, die Seite für weitere Modelle bleibt deaktiviert und diese Modelltypen können nicht heruntergeladen werden.", + "enableWorkflows": "Workflow-Verwaltung", + "enableWorkflowsHelp": "Wenn deaktiviert, werden Workflow-Ordner (folder_paths.workflows) nicht gescannt, die Workflows-Seite bleibt deaktiviert und CivitAI-Workflow-Ressourcen können weder verknüpft noch heruntergeladen werden.", + "workflowFolders": "Workflow-Ordner", + "workflowFoldersHelp": "Ordner, die nach ComfyUI-Workflow-JSON-Dateien gescannt werden. Werden nur von LoRA Manager verwaltet (nicht mit ComfyUI geteilt); Änderungen gelten sofort.", "otherSubTypes": "Verwaltete Modelltypen", "otherSubTypesHelp": "Wählen Sie, welche Kategorien weiterer Modelle gescannt und auf der Seite für weitere Modelle angezeigt werden.", "subTypeVae": "VAE", @@ -686,7 +693,8 @@ "text_encoders": "Text-Encoder-Pfade", "clip": "CLIP-Pfade (Legacy)", "clip_vision": "CLIP-Vision-Pfade", - "controlnet": "ControlNet-Pfade" + "controlnet": "ControlNet-Pfade", + "workflows": "Workflow-Pfade" } }, "directoryPicker": { @@ -1447,6 +1455,53 @@ "openSettingsFolder": "Einstellungsordner öffnen" } }, + "workflows": { + "title": "Workflows", + "contextMenu": { + "sendToComfy": "In ComfyUI öffnen", + "updateFromComfy": "Von ComfyUI aktualisieren", + "copyWorkflow": "Workflow kopieren", + "restoreDownloaded": "Heruntergeladene Version wiederherstellen" + }, + "sendToComfy": { + "success": "Workflow an ComfyUI gesendet", + "failed": "Fehler beim Senden des Workflows: {message}" + }, + "restoreDownloaded": { + "title": "Heruntergeladene Version wiederherstellen?", + "message": "Dadurch werden lokale Änderungen verworfen und der Workflow auf die heruntergeladene Version zurückgesetzt.", + "confirmButton": "Wiederherstellen", + "restoring": "Workflow wird wiederhergestellt...", + "success": "Workflow auf die heruntergeladene Version zurückgesetzt", + "failed": "Fehler beim Wiederherstellen des Workflows: {message}" + }, + "updateFromComfy": { + "success": "Workflow von ComfyUI aktualisiert", + "noChanges": "Keine Änderungen in ComfyUI zum Zurückschreiben", + "cancelled": "Aktualisierung abgebrochen", + "failed": "Fehler beim Aktualisieren von ComfyUI: {message}" + }, + "copyWorkflow": { + "failed": "Fehler beim Kopieren des Workflows: {message}" + }, + "disabled": { + "title": "Die Workflow-Verwaltung ist deaktiviert", + "description": "Aktivieren Sie die Option, um ComfyUI-Workflow-Dateien zu scannen und zu verwalten, ihre CivitAI-Metadaten und Vorschaubilder zu behalten und sie in den laufenden ComfyUI-Graph zu senden.", + "enableButton": "Workflows aktivieren", + "hint": "Sie können die Funktion später unter Einstellungen > Bibliothek wieder deaktivieren.", + "enableFailed": "Aktivierung der Workflows fehlgeschlagen" + }, + "noPaths": { + "title": "Keine Workflow-Ordner gefunden", + "descriptionStandalone": "Die Workflow-Verwaltung ist aktiviert, aber es wurden keine Workflow-Ordner gefunden. Fügen Sie Ihre Workflow-Ordner unter Einstellungen → Modellpfade hinzu und starten Sie LoRA Manager anschließend neu.", + "hintStandalone": "Workflows werden aus den folder_paths.workflows-Einträgen gelesen.", + "descriptionComfyUI": "Die Workflow-Verwaltung ist aktiviert, aber es sind keine Workflow-Ordner konfiguriert. Fügen Sie Workflow-Ordner unter Einstellungen → Bibliothek hinzu und laden Sie diese Seite neu.", + "hintComfyUI": "Workflows liegen in eigenen Bibliotheksordnern (folder_paths.workflows); die integrierte Workflow-Liste von ComfyUI wird nicht verändert.", + "openSettings": "Einstellungen öffnen", + "openModelPaths": "Modellordner konfigurieren", + "openSettingsFolder": "Einstellungsordner öffnen" + } + }, "sidebar": { "modelRoot": "Stammverzeichnis", "collapseAll": "Alle Ordner einklappen", @@ -2272,6 +2327,10 @@ "title": "Manager für weitere Modelle wird initialisiert", "message": "Modell-Cache wird gescannt und aufgebaut. Dies kann einige Minuten dauern..." }, + "workflows": { + "title": "Workflow Manager wird initialisiert", + "message": "Workflow-Cache wird gescannt und aufgebaut. Dies kann einige Minuten dauern..." + }, "recipes": { "title": "Rezept Manager wird initialisiert", "message": "Rezepte werden geladen und verarbeitet. Dies kann einige Minuten dauern..." diff --git a/locales/en.json b/locales/en.json index 190f215c..c854f8cf 100644 --- a/locales/en.json +++ b/locales/en.json @@ -156,7 +156,9 @@ "embeddingNameCopied": "Embedding syntax copied", "modelNameCopied": "Model name copied", "sendCheckpointToWorkflow": "Send to ComfyUI", - "sendEmbeddingToWorkflow": "Send to ComfyUI" + "sendEmbeddingToWorkflow": "Send to ComfyUI", + "openInComfyUI": "Open in ComfyUI", + "copyWorkflowToClipboard": "Copy workflow to clipboard" }, "nsfw": { "matureContent": "Mature Content", @@ -244,6 +246,7 @@ "checkpoints": "Checkpoints", "embeddings": "Embeddings", "other": "Other", + "workflows": "Workflows", "statistics": "Stats" }, "search": { @@ -633,6 +636,10 @@ "defaultControlnetRootHelp": "Set default ControlNet root directory for downloads, imports and moves", "enableOtherModels": "Other Models Management", "enableOtherModelsHelp": "When off, VAE / upscaler / text encoder / CLIP vision / ControlNet folders are not scanned, the Other Models page stays disabled, and these model types cannot be downloaded.", + "enableWorkflows": "Workflow Management", + "enableWorkflowsHelp": "When off, workflow folders (folder_paths.workflows) are not scanned, the Workflows page stays disabled, and CivitAI Workflow resources cannot be linked or downloaded.", + "workflowFolders": "Workflow Folders", + "workflowFoldersHelp": "Folders scanned for ComfyUI workflow JSON files. Managed by LoRA Manager only (not shared with ComfyUI); changes apply immediately.", "otherSubTypes": "Managed Types", "otherSubTypesHelp": "Choose which other-model categories are scanned and shown on the Other Models page.", "subTypeVae": "VAE", @@ -686,7 +693,8 @@ "text_encoders": "Text Encoder Paths", "clip": "CLIP Paths (legacy)", "clip_vision": "CLIP Vision Paths", - "controlnet": "ControlNet Paths" + "controlnet": "ControlNet Paths", + "workflows": "Workflow Paths" } }, "directoryPicker": { @@ -1447,6 +1455,53 @@ "openSettingsFolder": "Open Settings Folder" } }, + "workflows": { + "title": "Workflows", + "contextMenu": { + "sendToComfy": "Open in ComfyUI", + "updateFromComfy": "Update from ComfyUI", + "copyWorkflow": "Copy Workflow", + "restoreDownloaded": "Restore Downloaded Version" + }, + "sendToComfy": { + "success": "Workflow sent to ComfyUI", + "failed": "Failed to send workflow: {message}" + }, + "restoreDownloaded": { + "title": "Restore Downloaded Version?", + "message": "This discards local edits and restores the workflow to its downloaded version.", + "confirmButton": "Restore", + "restoring": "Restoring workflow...", + "success": "Workflow restored to its downloaded version", + "failed": "Failed to restore workflow: {message}" + }, + "updateFromComfy": { + "success": "Workflow updated from ComfyUI", + "noChanges": "No changes in ComfyUI to write back", + "cancelled": "Update cancelled", + "failed": "Failed to update from ComfyUI: {message}" + }, + "copyWorkflow": { + "failed": "Failed to copy workflow: {message}" + }, + "disabled": { + "title": "Workflow management is off", + "description": "Enable it to scan and manage ComfyUI workflow files, keep their CivitAI metadata and previews, and send them into the running ComfyUI graph.", + "enableButton": "Enable Workflows", + "hint": "You can turn the feature off again later in Settings > Library.", + "enableFailed": "Failed to enable Workflows" + }, + "noPaths": { + "title": "No workflow folders found", + "descriptionStandalone": "Workflow management is on, but no workflow folders were found. Add your workflow folders under Settings → Model Paths, then restart LoRA Manager.", + "hintStandalone": "Workflows are read from the folder_paths.workflows entries.", + "descriptionComfyUI": "Workflow management is on, but no workflow folders are configured. Add workflow folders in Settings → Library, then reload this page.", + "hintComfyUI": "Workflows live in their own library folders (folder_paths.workflows); ComfyUI's built-in workflow list is not touched.", + "openSettings": "Open Settings", + "openModelPaths": "Configure Model Folders", + "openSettingsFolder": "Open Settings Folder" + } + }, "sidebar": { "modelRoot": "Root", "collapseAll": "Collapse All Folders", @@ -2272,6 +2327,10 @@ "title": "Initializing Other Models Manager", "message": "Scanning and building model cache. This may take a few minutes..." }, + "workflows": { + "title": "Initializing Workflow Manager", + "message": "Scanning and building workflow cache. This may take a few minutes..." + }, "recipes": { "title": "Initializing Recipe Manager", "message": "Loading and processing recipes. This may take a few minutes..." diff --git a/locales/es.json b/locales/es.json index 144b4b87..f3be65b7 100644 --- a/locales/es.json +++ b/locales/es.json @@ -156,7 +156,9 @@ "embeddingNameCopied": "Sintaxis de embedding copiada", "modelNameCopied": "Nombre del modelo copiado", "sendCheckpointToWorkflow": "Enviar a ComfyUI", - "sendEmbeddingToWorkflow": "Enviar a ComfyUI" + "sendEmbeddingToWorkflow": "Enviar a ComfyUI", + "openInComfyUI": "Abrir en ComfyUI", + "copyWorkflowToClipboard": "Copiar el workflow al portapapeles" }, "nsfw": { "matureContent": "Contenido para adultos", @@ -244,6 +246,7 @@ "checkpoints": "Checkpoints", "embeddings": "Embeddings", "other": "Otros", + "workflows": "Workflows", "statistics": "Estadísticas" }, "search": { @@ -633,6 +636,10 @@ "defaultControlnetRootHelp": "Establecer el directorio raíz predeterminado de ControlNet para descargas, importaciones y movimientos", "enableOtherModels": "Gestión de otros modelos", "enableOtherModelsHelp": "Cuando está desactivado, las carpetas VAE / Upscaler / Text Encoder / CLIP Vision / ControlNet no se escanean, la página Otros modelos permanece desactivada y estos tipos de modelos no se pueden descargar.", + "enableWorkflows": "Gestión de workflows", + "enableWorkflowsHelp": "Cuando está desactivado, las carpetas de workflows (folder_paths.workflows) no se escanean, la página Workflows permanece desactivada y los recursos Workflow de CivitAI no se pueden vincular ni descargar.", + "workflowFolders": "Carpetas de workflows", + "workflowFoldersHelp": "Carpetas que se escanean en busca de archivos JSON de workflow de ComfyUI. Gestionadas solo por LoRA Manager (no se comparten con ComfyUI); los cambios se aplican de inmediato.", "otherSubTypes": "Tipos de modelos gestionados", "otherSubTypesHelp": "Elige qué categorías de otros modelos se escanean y se muestran en la página Otros modelos.", "subTypeVae": "VAE", @@ -686,7 +693,8 @@ "text_encoders": "Rutas de Text Encoder", "clip": "Rutas de CLIP (heredadas)", "clip_vision": "Rutas de CLIP Vision", - "controlnet": "Rutas de ControlNet" + "controlnet": "Rutas de ControlNet", + "workflows": "Rutas de workflows" } }, "directoryPicker": { @@ -1447,6 +1455,53 @@ "openSettingsFolder": "Abrir carpeta de ajustes" } }, + "workflows": { + "title": "Workflows", + "contextMenu": { + "sendToComfy": "Abrir en ComfyUI", + "updateFromComfy": "Actualizar desde ComfyUI", + "copyWorkflow": "Copiar workflow", + "restoreDownloaded": "Restaurar versión descargada" + }, + "sendToComfy": { + "success": "Workflow enviado a ComfyUI", + "failed": "Error al enviar el workflow: {message}" + }, + "restoreDownloaded": { + "title": "¿Restaurar versión descargada?", + "message": "Esto descarta los cambios locales y restaura el workflow a su versión descargada.", + "confirmButton": "Restaurar", + "restoring": "Restaurando el workflow...", + "success": "Workflow restaurado a su versión descargada", + "failed": "Error al restaurar el workflow: {message}" + }, + "updateFromComfy": { + "success": "Workflow actualizado desde ComfyUI", + "noChanges": "No hay cambios en ComfyUI que escribir de vuelta", + "cancelled": "Actualización cancelada", + "failed": "Error al actualizar desde ComfyUI: {message}" + }, + "copyWorkflow": { + "failed": "Error al copiar el workflow: {message}" + }, + "disabled": { + "title": "La gestión de workflows está desactivada", + "description": "Actívala para escanear y gestionar archivos de workflow de ComfyUI, conservar sus metadatos y vistas previas de CivitAI y enviarlos al grafo de ComfyUI en ejecución.", + "enableButton": "Activar workflows", + "hint": "Puedes desactivar esta función más adelante en Configuración > Biblioteca.", + "enableFailed": "No se pudieron activar los workflows" + }, + "noPaths": { + "title": "No se encontraron carpetas de workflows", + "descriptionStandalone": "La gestión de workflows está activada, pero no se encontraron carpetas de workflows. Añade tus carpetas de workflows en Configuración → Rutas de modelos y reinicia LoRA Manager.", + "hintStandalone": "Los workflows se leen de las entradas folder_paths.workflows.", + "descriptionComfyUI": "La gestión de workflows está activada, pero no hay carpetas de workflows configuradas. Añade carpetas de workflows en Configuración → Biblioteca y recarga esta página.", + "hintComfyUI": "Los workflows se guardan en sus propias carpetas de biblioteca (folder_paths.workflows); la lista de workflows integrada de ComfyUI no se modifica.", + "openSettings": "Abrir configuración", + "openModelPaths": "Configurar carpetas de modelos", + "openSettingsFolder": "Abrir carpeta de ajustes" + } + }, "sidebar": { "modelRoot": "Raíz", "collapseAll": "Colapsar todas las carpetas", @@ -2272,6 +2327,10 @@ "title": "Inicializando el gestor de otros modelos", "message": "Escaneando y construyendo la caché de modelos. Esto puede tomar unos minutos..." }, + "workflows": { + "title": "Inicializando gestor de workflows", + "message": "Escaneando y construyendo caché de workflows. Esto puede tomar unos minutos..." + }, "recipes": { "title": "Inicializando gestor de recetas", "message": "Cargando y procesando recetas. Esto puede tomar unos minutos..." diff --git a/locales/fr.json b/locales/fr.json index cbfcf345..c4103bfa 100644 --- a/locales/fr.json +++ b/locales/fr.json @@ -156,7 +156,9 @@ "embeddingNameCopied": "Syntaxe dembedding copiée", "modelNameCopied": "Nom du modèle copié", "sendCheckpointToWorkflow": "Envoyer vers ComfyUI", - "sendEmbeddingToWorkflow": "Envoyer vers ComfyUI" + "sendEmbeddingToWorkflow": "Envoyer vers ComfyUI", + "openInComfyUI": "Ouvrir dans ComfyUI", + "copyWorkflowToClipboard": "Copier le workflow dans le presse-papiers" }, "nsfw": { "matureContent": "Contenu pour adultes", @@ -244,6 +246,7 @@ "checkpoints": "Checkpoints", "embeddings": "Embeddings", "other": "Autres", + "workflows": "Workflows", "statistics": "Statistiques" }, "search": { @@ -633,6 +636,10 @@ "defaultControlnetRootHelp": "Définir le répertoire racine ControlNet par défaut pour les téléchargements, imports et déplacements", "enableOtherModels": "Gestion des autres modèles", "enableOtherModelsHelp": "Lorsque cette option est désactivée, les dossiers VAE / Upscaler / Text Encoder / CLIP Vision / ControlNet ne sont pas analysés, la page Autres modèles reste désactivée et ces types de modèles ne peuvent pas être téléchargés.", + "enableWorkflows": "Gestion des workflows", + "enableWorkflowsHelp": "Lorsque cette option est désactivée, les dossiers de workflows (folder_paths.workflows) ne sont pas analysés, la page Workflows reste désactivée et les ressources Workflow de CivitAI ne peuvent pas être liées ni téléchargées.", + "workflowFolders": "Dossiers de workflows", + "workflowFoldersHelp": "Dossiers analysés pour les fichiers JSON de workflow ComfyUI. Gérés uniquement par LoRA Manager (non partagés avec ComfyUI) ; les modifications s'appliquent immédiatement.", "otherSubTypes": "Types de modèles gérés", "otherSubTypesHelp": "Choisissez les catégories d’autres modèles analysées et affichées sur la page Autres modèles.", "subTypeVae": "VAE", @@ -686,7 +693,8 @@ "text_encoders": "Chemins Text Encoder", "clip": "Chemins CLIP (hérité)", "clip_vision": "Chemins CLIP Vision", - "controlnet": "Chemins ControlNet" + "controlnet": "Chemins ControlNet", + "workflows": "Chemins de workflows" } }, "directoryPicker": { @@ -1447,6 +1455,53 @@ "openSettingsFolder": "Ouvrir le dossier des paramètres" } }, + "workflows": { + "title": "Workflows", + "contextMenu": { + "sendToComfy": "Ouvrir dans ComfyUI", + "updateFromComfy": "Mettre à jour depuis ComfyUI", + "copyWorkflow": "Copier le workflow", + "restoreDownloaded": "Restaurer la version téléchargée" + }, + "sendToComfy": { + "success": "Workflow envoyé vers ComfyUI", + "failed": "Échec de l'envoi du workflow : {message}" + }, + "restoreDownloaded": { + "title": "Restaurer la version téléchargée ?", + "message": "Cela supprime les modifications locales et restaure le workflow dans sa version téléchargée.", + "confirmButton": "Restaurer", + "restoring": "Restauration du workflow en cours...", + "success": "Workflow restauré dans sa version téléchargée", + "failed": "Échec de la restauration du workflow : {message}" + }, + "updateFromComfy": { + "success": "Workflow mis à jour depuis ComfyUI", + "noChanges": "Aucune modification à réécrire depuis ComfyUI", + "cancelled": "Mise à jour annulée", + "failed": "Échec de la mise à jour depuis ComfyUI : {message}" + }, + "copyWorkflow": { + "failed": "Échec de la copie du workflow : {message}" + }, + "disabled": { + "title": "La gestion des workflows est désactivée", + "description": "Activez-la pour analyser et gérer les fichiers de workflow ComfyUI, conserver leurs métadonnées et aperçus CivitAI et les envoyer dans le graphe ComfyUI en cours d'exécution.", + "enableButton": "Activer les workflows", + "hint": "Vous pourrez désactiver cette fonctionnalité plus tard dans Paramètres > Bibliothèque.", + "enableFailed": "Échec de l'activation des workflows" + }, + "noPaths": { + "title": "Aucun dossier de workflows trouvé", + "descriptionStandalone": "La gestion des workflows est activée, mais aucun dossier de workflows n'a été trouvé. Ajoutez vos dossiers de workflows dans Paramètres → Chemins de modèles, puis redémarrez LoRA Manager.", + "hintStandalone": "Les workflows sont lus depuis les entrées folder_paths.workflows.", + "descriptionComfyUI": "La gestion des workflows est activée, mais aucun dossier de workflows n'est configuré. Ajoutez des dossiers de workflows dans Paramètres → Bibliothèque, puis rechargez cette page.", + "hintComfyUI": "Les workflows résident dans leurs propres dossiers de bibliothèque (folder_paths.workflows) ; la liste de workflows intégrée à ComfyUI n'est pas modifiée.", + "openSettings": "Ouvrir les paramètres", + "openModelPaths": "Configurer les dossiers de modèles", + "openSettingsFolder": "Ouvrir le dossier des paramètres" + } + }, "sidebar": { "modelRoot": "Racine", "collapseAll": "Réduire tous les dossiers", @@ -2272,6 +2327,10 @@ "title": "Initialisation du gestionnaire Autres modèles", "message": "Analyse et construction du cache de modèles. Cela peut prendre quelques minutes..." }, + "workflows": { + "title": "Initialisation du gestionnaire de workflows", + "message": "Scan et construction du cache workflow. Cela peut prendre quelques minutes..." + }, "recipes": { "title": "Initialisation du gestionnaire de recipes", "message": "Chargement et traitement des recipes. Cela peut prendre quelques minutes..." diff --git a/locales/he.json b/locales/he.json index f0d362f6..c12acd41 100644 --- a/locales/he.json +++ b/locales/he.json @@ -156,7 +156,9 @@ "embeddingNameCopied": "תחביר Embedding הועתק", "modelNameCopied": "שם המודל הועתק", "sendCheckpointToWorkflow": "שלח ל-ComfyUI", - "sendEmbeddingToWorkflow": "שלח ל-ComfyUI" + "sendEmbeddingToWorkflow": "שלח ל-ComfyUI", + "openInComfyUI": "פתח ב-ComfyUI", + "copyWorkflowToClipboard": "העתק workflow ללוח" }, "nsfw": { "matureContent": "תוכן למבוגרים", @@ -244,6 +246,7 @@ "checkpoints": "Checkpoints", "embeddings": "Embeddings", "other": "אחרים", + "workflows": "Workflows", "statistics": "סטטיסטיקה" }, "search": { @@ -633,6 +636,10 @@ "defaultControlnetRootHelp": "הגדר את ספריית השורש המוגדרת כברירת מחדל של ControlNet להורדות, ייבוא והעברות", "enableOtherModels": "ניהול מודלים אחרים", "enableOtherModelsHelp": "כשהאפשרות כבויה, תיקיות VAE / Upscaler / Text Encoder / CLIP Vision / ControlNet אינן נסרקות, עמוד המודלים האחרים נשאר מושבת ולא ניתן להוריד סוגי מודלים אלה.", + "enableWorkflows": "ניהול workflow", + "enableWorkflowsHelp": "כשהאפשרות כבויה, תיקיות workflow (folder_paths.workflows) אינן נסרקות, עמוד Workflows נשאר מושבת ולא ניתן לקשר או להוריד משאבי Workflow מ-CivitAI.", + "workflowFolders": "תיקיות workflow", + "workflowFoldersHelp": "תיקיות שנסרקות עבור קובצי JSON של workflow של ComfyUI. מנוהלות על ידי LoRA Manager בלבד (אינן משותפות עם ComfyUI); השינויים חלים מיד.", "otherSubTypes": "סוגי מודלים מנוהלים", "otherSubTypesHelp": "בחר אילו קטגוריות של מודלים אחרים ייסרקו ויוצגו בעמוד המודלים האחרים.", "subTypeVae": "VAE", @@ -686,7 +693,8 @@ "text_encoders": "נתיבי Text Encoder", "clip": "נתיבי CLIP (ישן)", "clip_vision": "נתיבי CLIP Vision", - "controlnet": "נתיבי ControlNet" + "controlnet": "נתיבי ControlNet", + "workflows": "נתיבי workflow" } }, "directoryPicker": { @@ -1447,6 +1455,53 @@ "openSettingsFolder": "פתח תיקיית הגדרות" } }, + "workflows": { + "title": "Workflows", + "contextMenu": { + "sendToComfy": "פתח ב-ComfyUI", + "updateFromComfy": "עדכן מ-ComfyUI", + "copyWorkflow": "העתק workflow", + "restoreDownloaded": "שחזר את הגרסה שהורדה" + }, + "sendToComfy": { + "success": "ה-workflow נשלח ל-ComfyUI", + "failed": "שליחת ה-workflow נכשלה: {message}" + }, + "restoreDownloaded": { + "title": "לשחזר את הגרסה שהורדה?", + "message": "פעולה זו מבטלת עריכות מקומיות ומשחזרת את ה-workflow לגרסה שהורדה.", + "confirmButton": "שחזר", + "restoring": "משחזר workflow...", + "success": "ה-workflow שוחזר לגרסה שהורדה", + "failed": "שחזור ה-workflow נכשל: {message}" + }, + "updateFromComfy": { + "success": "ה-workflow עודכן מ-ComfyUI", + "noChanges": "אין שינויים ב-ComfyUI לכתיבה חזרה", + "cancelled": "העדכון בוטל", + "failed": "העדכון מ-ComfyUI נכשל: {message}" + }, + "copyWorkflow": { + "failed": "העתקת ה-workflow נכשלה: {message}" + }, + "disabled": { + "title": "ניהול ה-workflow כבוי", + "description": "הפעל כדי לסרוק ולנהל קבצי workflow של ComfyUI, לשמור את המטא-נתונים והתצוגות המקדימות שלהם מ-CivitAI, ולשלוח אותם ל-ComfyUI הפעיל.", + "enableButton": "הפעל Workflows", + "hint": "ניתן לכבות את התכונה שוב מאוחר יותר בהגדרות > ספרייה.", + "enableFailed": "הפעלת Workflows נכשלה" + }, + "noPaths": { + "title": "לא נמצאו תיקיות workflow", + "descriptionStandalone": "ניהול ה-workflow פועל, אך לא נמצאו תיקיות workflow. הוסף את תיקיות ה-workflow שלך תחת הגדרות > נתיבי מודלים, ולאחר מכן הפעל מחדש את LoRA Manager.", + "hintStandalone": "קבצי workflow נקראים מהערכים של folder_paths.workflows.", + "descriptionComfyUI": "ניהול ה-workflow פועל, אך לא הוגדרו תיקיות workflow. הוסף תיקיות workflow תחת הגדרות > ספרייה, ולאחר מכן טען מחדש עמוד זה.", + "hintComfyUI": "קבצי workflow נמצאים בתיקיות ספרייה נפרדות (folder_paths.workflows); רשימת ה-workflow המובנית של ComfyUI אינה מושפעת.", + "openSettings": "פתח הגדרות", + "openModelPaths": "הגדר תיקיות מודלים", + "openSettingsFolder": "פתח תיקיית הגדרות" + } + }, "sidebar": { "modelRoot": "שורש", "collapseAll": "כווץ את כל התיקיות", @@ -2272,6 +2327,10 @@ "title": "מאתחל את מנהל המודלים האחרים", "message": "סורק ובונה מטמון מודלים. זה עשוי לקחת מספר דקות..." }, + "workflows": { + "title": "מאתחל מנהל Workflow", + "message": "סורק ובונה מטמון workflow. זה עשוי לקחת מספר דקות..." + }, "recipes": { "title": "מאתחל מנהל מתכונים", "message": "טוען ומעבד מתכונים. זה עשוי לקחת מספר דקות..." diff --git a/locales/ja.json b/locales/ja.json index 2d2a9b9b..bc660545 100644 --- a/locales/ja.json +++ b/locales/ja.json @@ -156,7 +156,9 @@ "embeddingNameCopied": "Embedding構文をコピーしました", "modelNameCopied": "モデル名をコピーしました", "sendCheckpointToWorkflow": "ComfyUIに送信", - "sendEmbeddingToWorkflow": "ComfyUIに送信" + "sendEmbeddingToWorkflow": "ComfyUIに送信", + "openInComfyUI": "ComfyUIで開く", + "copyWorkflowToClipboard": "ワークフローをクリップボードにコピー" }, "nsfw": { "matureContent": "成人向けコンテンツ", @@ -244,6 +246,7 @@ "checkpoints": "Checkpoint", "embeddings": "Embedding", "other": "その他", + "workflows": "ワークフロー", "statistics": "統計" }, "search": { @@ -633,6 +636,10 @@ "defaultControlnetRootHelp": "ダウンロード、インポート、移動用のデフォルトControlNetルートディレクトリを設定", "enableOtherModels": "その他のモデル管理", "enableOtherModelsHelp": "オフにすると、VAE / Upscaler / Text Encoder / CLIP Vision / ControlNet フォルダーはスキャンされず、その他のモデルページは無効のままになり、これらのモデルタイプはダウンロードできません。", + "enableWorkflows": "ワークフロー管理", + "enableWorkflowsHelp": "オフにすると、ワークフローフォルダー(folder_paths.workflows)はスキャンされず、ワークフローページは無効のままになり、CivitAIのWorkflowリソースをリンクしたりダウンロードしたりできなくなります。", + "workflowFolders": "ワークフローフォルダー", + "workflowFoldersHelp": "ComfyUIのワークフローJSONファイルをスキャンするフォルダーです。LoRA Managerのみが管理し(ComfyUIとは共有されません)、変更はすぐに反映されます。", "otherSubTypes": "管理するモデルタイプ", "otherSubTypesHelp": "その他のモデルページでスキャンおよび表示するカテゴリを選択します。", "subTypeVae": "VAE", @@ -686,7 +693,8 @@ "text_encoders": "Text Encoderパス", "clip": "CLIPパス(レガシー)", "clip_vision": "CLIP Visionパス", - "controlnet": "ControlNetパス" + "controlnet": "ControlNetパス", + "workflows": "ワークフローパス" } }, "directoryPicker": { @@ -1447,6 +1455,53 @@ "openSettingsFolder": "設定フォルダーを開く" } }, + "workflows": { + "title": "ワークフロー", + "contextMenu": { + "sendToComfy": "ComfyUIで開く", + "updateFromComfy": "ComfyUIから更新", + "copyWorkflow": "ワークフローをコピー", + "restoreDownloaded": "ダウンロード済みバージョンを復元" + }, + "sendToComfy": { + "success": "ワークフローをComfyUIへ送信しました", + "failed": "ワークフローの送信に失敗しました:{message}" + }, + "restoreDownloaded": { + "title": "ダウンロード済みバージョンを復元しますか?", + "message": "ローカルの編集内容は破棄され、ワークフローはダウンロード時のバージョンに復元されます。", + "confirmButton": "復元", + "restoring": "ワークフローを復元中...", + "success": "ワークフローをダウンロード済みバージョンに復元しました", + "failed": "ワークフローの復元に失敗しました:{message}" + }, + "updateFromComfy": { + "success": "ComfyUIからワークフローを更新しました", + "noChanges": "ComfyUI側に書き戻す変更はありません", + "cancelled": "更新はキャンセルされました", + "failed": "ComfyUIからの更新に失敗しました:{message}" + }, + "copyWorkflow": { + "failed": "ワークフローのコピーに失敗しました:{message}" + }, + "disabled": { + "title": "ワークフロー管理はオフです", + "description": "有効にすると、ComfyUIのワークフローファイルをスキャン・管理し、CivitAIのメタデータとプレビューを保持したまま、実行中のComfyUIに送信できます。", + "enableButton": "ワークフローを有効にする", + "hint": "この機能は後で「設定 > ライブラリ」から再度オフにできます。", + "enableFailed": "ワークフローの有効化に失敗しました" + }, + "noPaths": { + "title": "ワークフローフォルダーが見つかりません", + "descriptionStandalone": "ワークフロー管理はオンですが、ワークフローフォルダーが見つかりませんでした。「設定 > モデルパス」でワークフローフォルダーを追加し、LoRA Managerを再起動してください。", + "hintStandalone": "ワークフローはfolder_paths.workflowsのエントリから読み込まれます。", + "descriptionComfyUI": "ワークフロー管理はオンですが、ワークフローフォルダーが設定されていません。「設定 > ライブラリ」でワークフローフォルダーを追加し、このページを再読み込みしてください。", + "hintComfyUI": "ワークフローは専用のライブラリフォルダー(folder_paths.workflows)に保存されます。ComfyUI標準のワークフローリストには影響しません。", + "openSettings": "設定を開く", + "openModelPaths": "モデルフォルダーを設定", + "openSettingsFolder": "設定フォルダーを開く" + } + }, "sidebar": { "modelRoot": "ルート", "collapseAll": "すべてのフォルダを折りたたむ", @@ -2272,6 +2327,10 @@ "title": "その他のモデルマネージャーを初期化中", "message": "モデルキャッシュをスキャンして構築中です。数分かかる場合があります..." }, + "workflows": { + "title": "ワークフローマネージャーを初期化中", + "message": "ワークフローキャッシュをスキャンして構築中。数分かかる場合があります..." + }, "recipes": { "title": "レシピマネージャーを初期化中", "message": "レシピを読み込んで処理中。数分かかる場合があります..." diff --git a/locales/ko.json b/locales/ko.json index ecf14a01..7845bbf1 100644 --- a/locales/ko.json +++ b/locales/ko.json @@ -156,7 +156,9 @@ "embeddingNameCopied": "Embedding 구문 복사됨", "modelNameCopied": "모델 이름 복사됨", "sendCheckpointToWorkflow": "ComfyUI로 전송", - "sendEmbeddingToWorkflow": "ComfyUI로 전송" + "sendEmbeddingToWorkflow": "ComfyUI로 전송", + "openInComfyUI": "ComfyUI에서 열기", + "copyWorkflowToClipboard": "워크플로를 클립보드에 복사" }, "nsfw": { "matureContent": "성인 콘텐츠", @@ -244,6 +246,7 @@ "checkpoints": "Checkpoint", "embeddings": "Embedding", "other": "기타", + "workflows": "워크플로", "statistics": "통계" }, "search": { @@ -633,6 +636,10 @@ "defaultControlnetRootHelp": "다운로드, 가져오기 및 이동을 위한 기본 ControlNet 루트 디렉토리를 설정합니다", "enableOtherModels": "기타 모델 관리", "enableOtherModelsHelp": "끄면 VAE / Upscaler / Text Encoder / CLIP Vision / ControlNet 폴더를 스캔하지 않으며, 기타 모델 페이지가 비활성화된 상태로 유지되고 이러한 모델 유형은 다운로드할 수 없습니다.", + "enableWorkflows": "워크플로 관리", + "enableWorkflowsHelp": "끄면 워크플로 폴더(folder_paths.workflows)를 스캔하지 않으며, 워크플로 페이지가 비활성화된 상태로 유지되고 CivitAI의 Workflow 리소스를 연결하거나 다운로드할 수 없습니다.", + "workflowFolders": "워크플로 폴더", + "workflowFoldersHelp": "ComfyUI 워크플로 JSON 파일을 스캔할 폴더입니다. LoRA Manager에서만 관리하며(ComfyUI와 공유되지 않음), 변경 사항은 즉시 적용됩니다.", "otherSubTypes": "관리할 모델 유형", "otherSubTypesHelp": "기타 모델 페이지에서 스캔하고 표시할 카테고리를 선택합니다.", "subTypeVae": "VAE", @@ -686,7 +693,8 @@ "text_encoders": "Text Encoder 경로", "clip": "CLIP 경로 (레거시)", "clip_vision": "CLIP Vision 경로", - "controlnet": "ControlNet 경로" + "controlnet": "ControlNet 경로", + "workflows": "워크플로 경로" } }, "directoryPicker": { @@ -1447,6 +1455,53 @@ "openSettingsFolder": "설정 폴더 열기" } }, + "workflows": { + "title": "워크플로", + "contextMenu": { + "sendToComfy": "ComfyUI에서 열기", + "updateFromComfy": "ComfyUI에서 업데이트", + "copyWorkflow": "워크플로 복사", + "restoreDownloaded": "다운로드한 버전 복원" + }, + "sendToComfy": { + "success": "워크플로를 ComfyUI로 보냈습니다", + "failed": "워크플로 전송 실패: {message}" + }, + "restoreDownloaded": { + "title": "다운로드한 버전을 복원할까요?", + "message": "로컬 편집 내용이 삭제되고 워크플로가 다운로드한 버전으로 복원됩니다.", + "confirmButton": "복원", + "restoring": "워크플로 복원 중...", + "success": "워크플로를 다운로드한 버전으로 복원했습니다", + "failed": "워크플로 복원 실패: {message}" + }, + "updateFromComfy": { + "success": "ComfyUI에서 워크플로를 업데이트했습니다", + "noChanges": "ComfyUI에 다시 기록할 변경 사항이 없습니다", + "cancelled": "업데이트가 취소되었습니다", + "failed": "ComfyUI에서 업데이트 실패: {message}" + }, + "copyWorkflow": { + "failed": "워크플로 복사 실패: {message}" + }, + "disabled": { + "title": "워크플로 관리가 꺼져 있습니다", + "description": "활성화하면 ComfyUI 워크플로 파일을 스캔하고 관리하며, CivitAI 메타데이터와 미리보기를 유지하고 실행 중인 ComfyUI로 전송할 수 있습니다.", + "enableButton": "워크플로 활성화", + "hint": "나중에 설정 > 라이브러리에서 이 기능을 다시 끌 수 있습니다.", + "enableFailed": "워크플로 활성화 실패" + }, + "noPaths": { + "title": "워크플로 폴더를 찾을 수 없습니다", + "descriptionStandalone": "워크플로 관리가 켜져 있지만, 워크플로 폴더를 찾을 수 없습니다. 설정 → 모델 경로에서 워크플로 폴더를 추가한 뒤 LoRA Manager를 재시작하세요.", + "hintStandalone": "워크플로는 folder_paths.workflows 항목에서 읽어옵니다.", + "descriptionComfyUI": "워크플로 관리가 켜져 있지만, 설정된 워크플로 폴더가 없습니다. 설정 → 라이브러리에서 워크플로 폴더를 추가한 뒤 이 페이지를 새로 고침하세요.", + "hintComfyUI": "워크플로는 자체 라이브러리 폴더(folder_paths.workflows)에 있으며, ComfyUI에 내장된 워크플로 목록은 변경되지 않습니다.", + "openSettings": "설정 열기", + "openModelPaths": "모델 폴더 구성", + "openSettingsFolder": "설정 폴더 열기" + } + }, "sidebar": { "modelRoot": "루트", "collapseAll": "모든 폴더 접기", @@ -2272,6 +2327,10 @@ "title": "기타 모델 관리자 초기화 중", "message": "모델 캐시를 스캔하고 구축하고 있습니다. 몇 분이 걸릴 수 있습니다..." }, + "workflows": { + "title": "워크플로 매니저 초기화 중", + "message": "워크플로 캐시를 스캔하고 구축하고 있습니다. 몇 분이 걸릴 수 있습니다..." + }, "recipes": { "title": "레시피 매니저 초기화 중", "message": "레시피를 로딩하고 처리하고 있습니다. 몇 분이 걸릴 수 있습니다..." diff --git a/locales/ru.json b/locales/ru.json index d940c734..6f5dc669 100644 --- a/locales/ru.json +++ b/locales/ru.json @@ -156,7 +156,9 @@ "embeddingNameCopied": "Синтаксис embedding скопирован", "modelNameCopied": "Имя модели скопировано", "sendCheckpointToWorkflow": "Отправить в ComfyUI", - "sendEmbeddingToWorkflow": "Отправить в ComfyUI" + "sendEmbeddingToWorkflow": "Отправить в ComfyUI", + "openInComfyUI": "Открыть в ComfyUI", + "copyWorkflowToClipboard": "Копировать workflow в буфер обмена" }, "nsfw": { "matureContent": "Контент для взрослых", @@ -244,6 +246,7 @@ "checkpoints": "Checkpoints", "embeddings": "Embeddings", "other": "Другое", + "workflows": "Workflows", "statistics": "Статистика" }, "search": { @@ -633,6 +636,10 @@ "defaultControlnetRootHelp": "Установить корневую папку ControlNet по умолчанию для загрузок, импорта и перемещений", "enableOtherModels": "Управление другими моделями", "enableOtherModelsHelp": "Если выключено, папки VAE / Upscaler / Text Encoder / CLIP Vision / ControlNet не сканируются, страница «Другие модели» остаётся отключённой, а эти типы моделей нельзя загрузить.", + "enableWorkflows": "Управление workflow", + "enableWorkflowsHelp": "Если выключено, папки workflow (folder_paths.workflows) не сканируются, страница Workflows остаётся отключённой, а ресурсы Workflow с CivitAI нельзя связать или скачать.", + "workflowFolders": "Папки workflow", + "workflowFoldersHelp": "Папки, в которых сканируются JSON-файлы workflow ComfyUI. Управляются только LoRA Manager (не используются совместно с ComfyUI); изменения применяются сразу.", "otherSubTypes": "Управляемые типы моделей", "otherSubTypesHelp": "Выберите, какие категории других моделей сканируются и отображаются на странице «Другие модели».", "subTypeVae": "VAE", @@ -686,7 +693,8 @@ "text_encoders": "Пути Text Encoder", "clip": "Пути CLIP (устаревшие)", "clip_vision": "Пути CLIP Vision", - "controlnet": "Пути ControlNet" + "controlnet": "Пути ControlNet", + "workflows": "Пути workflow" } }, "directoryPicker": { @@ -1447,6 +1455,53 @@ "openSettingsFolder": "Открыть папку настроек" } }, + "workflows": { + "title": "Workflows", + "contextMenu": { + "sendToComfy": "Открыть в ComfyUI", + "updateFromComfy": "Обновить из ComfyUI", + "copyWorkflow": "Копировать workflow", + "restoreDownloaded": "Восстановить загруженную версию" + }, + "sendToComfy": { + "success": "Workflow отправлен в ComfyUI", + "failed": "Не удалось отправить workflow: {message}" + }, + "restoreDownloaded": { + "title": "Восстановить загруженную версию?", + "message": "Локальные изменения будут отброшены, а workflow вернётся к загруженной версии.", + "confirmButton": "Восстановить", + "restoring": "Восстановление workflow...", + "success": "Workflow восстановлен до загруженной версии", + "failed": "Не удалось восстановить workflow: {message}" + }, + "updateFromComfy": { + "success": "Workflow обновлён из ComfyUI", + "noChanges": "В ComfyUI нет изменений для записи обратно", + "cancelled": "Обновление отменено", + "failed": "Не удалось обновить из ComfyUI: {message}" + }, + "copyWorkflow": { + "failed": "Не удалось скопировать workflow: {message}" + }, + "disabled": { + "title": "Управление workflow отключено", + "description": "Включите, чтобы сканировать и управлять файлами workflow ComfyUI, сохранять их метаданные и превью CivitAI и отправлять их в работающий граф ComfyUI.", + "enableButton": "Включить Workflows", + "hint": "Вы сможете снова отключить эту функцию позже в разделе «Настройки > Библиотека».", + "enableFailed": "Не удалось включить Workflows" + }, + "noPaths": { + "title": "Папки workflow не найдены", + "descriptionStandalone": "Управление workflow включено, но папки workflow не найдены. Добавьте свои папки workflow в разделе «Настройки → Пути к моделям», затем перезапустите LoRA Manager.", + "hintStandalone": "Workflow читаются из записей folder_paths.workflows.", + "descriptionComfyUI": "Управление workflow включено, но папки workflow не настроены. Добавьте папки workflow в разделе «Настройки → Библиотека» и перезагрузите эту страницу.", + "hintComfyUI": "Workflow хранятся в собственных папках библиотеки (folder_paths.workflows); встроенный список workflow в ComfyUI не затрагивается.", + "openSettings": "Открыть настройки", + "openModelPaths": "Настроить папки моделей", + "openSettingsFolder": "Открыть папку настроек" + } + }, "sidebar": { "modelRoot": "Корень", "collapseAll": "Свернуть все папки", @@ -2272,6 +2327,10 @@ "title": "Инициализация менеджера других моделей", "message": "Сканирование и построение кэша моделей. Это может занять несколько минут..." }, + "workflows": { + "title": "Инициализация менеджера workflow", + "message": "Сканирование и построение кэша workflow. Это может занять несколько минут..." + }, "recipes": { "title": "Инициализация менеджера рецептов", "message": "Загрузка и обработка рецептов. Это может занять несколько минут..." diff --git a/locales/zh-CN.json b/locales/zh-CN.json index c0f4cec3..331849f5 100644 --- a/locales/zh-CN.json +++ b/locales/zh-CN.json @@ -156,7 +156,9 @@ "embeddingNameCopied": "已复制 Embedding 语法", "modelNameCopied": "模型名称已复制", "sendCheckpointToWorkflow": "发送到 ComfyUI", - "sendEmbeddingToWorkflow": "发送到 ComfyUI" + "sendEmbeddingToWorkflow": "发送到 ComfyUI", + "openInComfyUI": "在 ComfyUI 中打开", + "copyWorkflowToClipboard": "复制工作流到剪贴板" }, "nsfw": { "matureContent": "成熟内容", @@ -244,6 +246,7 @@ "checkpoints": "Checkpoint", "embeddings": "Embedding", "other": "其他", + "workflows": "工作流", "statistics": "统计" }, "search": { @@ -633,6 +636,10 @@ "defaultControlnetRootHelp": "设置下载、导入和移动时的默认 ControlNet 根目录", "enableOtherModels": "其他模型管理", "enableOtherModelsHelp": "关闭后,不会扫描 VAE / Upscaler / Text Encoder / CLIP Vision / ControlNet 文件夹,其他模型页面保持禁用,且无法下载这些模型类型。", + "enableWorkflows": "工作流管理", + "enableWorkflowsHelp": "关闭后,不会扫描工作流文件夹(folder_paths.workflows),工作流页面保持禁用,且无法关联或下载 CivitAI 的 Workflow 资源。", + "workflowFolders": "工作流文件夹", + "workflowFoldersHelp": "扫描 ComfyUI 工作流 JSON 文件的文件夹。仅由 LoRA Manager 管理(不与 ComfyUI 共享);更改立即生效。", "otherSubTypes": "管理的模型类型", "otherSubTypesHelp": "选择要在其他模型页面中扫描和显示的其他模型类别。", "subTypeVae": "VAE", @@ -686,7 +693,8 @@ "text_encoders": "Text Encoder 路径", "clip": "CLIP 路径(旧版)", "clip_vision": "CLIP Vision 路径", - "controlnet": "ControlNet 路径" + "controlnet": "ControlNet 路径", + "workflows": "工作流路径" } }, "directoryPicker": { @@ -1447,6 +1455,53 @@ "openSettingsFolder": "打开设置文件夹" } }, + "workflows": { + "title": "工作流", + "contextMenu": { + "sendToComfy": "在 ComfyUI 中打开", + "updateFromComfy": "从 ComfyUI 更新", + "copyWorkflow": "复制工作流", + "restoreDownloaded": "恢复已下载版本" + }, + "sendToComfy": { + "success": "工作流已发送到 ComfyUI", + "failed": "发送工作流失败:{message}" + }, + "restoreDownloaded": { + "title": "恢复已下载版本?", + "message": "这会丢弃本地修改,并将工作流恢复到下载时的版本。", + "confirmButton": "恢复", + "restoring": "正在恢复工作流...", + "success": "工作流已恢复到已下载版本", + "failed": "恢复工作流失败:{message}" + }, + "updateFromComfy": { + "success": "已从 ComfyUI 更新工作流", + "noChanges": "ComfyUI 中没有需要写回的更改", + "cancelled": "更新已取消", + "failed": "从 ComfyUI 更新失败:{message}" + }, + "copyWorkflow": { + "failed": "复制工作流失败:{message}" + }, + "disabled": { + "title": "工作流管理已关闭", + "description": "启用后可扫描和管理 ComfyUI 工作流文件,保留其 CivitAI 元数据和预览,并将它们发送到正在运行的 ComfyUI 中。", + "enableButton": "启用工作流", + "hint": "你可以稍后在“设置 > 库”中再次关闭此功能。", + "enableFailed": "启用工作流失败" + }, + "noPaths": { + "title": "未找到工作流文件夹", + "descriptionStandalone": "工作流管理已开启,但未找到工作流文件夹。请在“设置 → 模型路径”中添加工作流文件夹,然后重启 LoRA Manager。", + "hintStandalone": "工作流从 folder_paths.workflows 条目中读取。", + "descriptionComfyUI": "工作流管理已开启,但未配置工作流文件夹。请在“设置 → 库”中添加工作流文件夹,然后重新加载此页面。", + "hintComfyUI": "工作流存放在独立的库文件夹中(folder_paths.workflows);不会影响 ComfyUI 内置的工作流列表。", + "openSettings": "打开设置", + "openModelPaths": "配置模型文件夹", + "openSettingsFolder": "打开设置文件夹" + } + }, "sidebar": { "modelRoot": "根目录", "collapseAll": "折叠所有文件夹", @@ -2272,6 +2327,10 @@ "title": "正在初始化其他模型管理器", "message": "正在扫描并构建模型缓存。这可能需要几分钟..." }, + "workflows": { + "title": "初始化工作流管理器", + "message": "正在扫描并构建工作流缓存。这可能需要几分钟..." + }, "recipes": { "title": "初始化配方管理器", "message": "正在加载和处理配方。这可能需要几分钟..." diff --git a/locales/zh-TW.json b/locales/zh-TW.json index b15b4579..1fd9c76e 100644 --- a/locales/zh-TW.json +++ b/locales/zh-TW.json @@ -156,7 +156,9 @@ "embeddingNameCopied": "已複製 Embedding 語法", "modelNameCopied": "模型名稱已複製", "sendCheckpointToWorkflow": "傳送到 ComfyUI", - "sendEmbeddingToWorkflow": "傳送到 ComfyUI" + "sendEmbeddingToWorkflow": "傳送到 ComfyUI", + "openInComfyUI": "在 ComfyUI 中開啟", + "copyWorkflowToClipboard": "複製工作流到剪貼簿" }, "nsfw": { "matureContent": "成熟內容", @@ -244,6 +246,7 @@ "checkpoints": "Checkpoint", "embeddings": "Embedding", "other": "其他", + "workflows": "工作流", "statistics": "統計" }, "search": { @@ -633,6 +636,10 @@ "defaultControlnetRootHelp": "設定下載、匯入和移動時的預設 ControlNet 根目錄", "enableOtherModels": "其他模型管理", "enableOtherModelsHelp": "關閉後,不會掃描 VAE / Upscaler / Text Encoder / CLIP Vision / ControlNet 資料夾,其他模型頁面會保持停用,且無法下載這些模型類型。", + "enableWorkflows": "工作流管理", + "enableWorkflowsHelp": "關閉後,不會掃描工作流資料夾(folder_paths.workflows),工作流頁面會保持停用,且無法連結或下載 CivitAI 的 Workflow 資源。", + "workflowFolders": "工作流資料夾", + "workflowFoldersHelp": "掃描 ComfyUI 工作流 JSON 檔案的資料夾。僅由 LoRA Manager 管理(不與 ComfyUI 共用);變更立即生效。", "otherSubTypes": "管理的模型類型", "otherSubTypesHelp": "選擇要在其他模型頁面中掃描和顯示的其他模型類別。", "subTypeVae": "VAE", @@ -686,7 +693,8 @@ "text_encoders": "Text Encoder 路徑", "clip": "CLIP 路徑(舊版)", "clip_vision": "CLIP Vision 路徑", - "controlnet": "ControlNet 路徑" + "controlnet": "ControlNet 路徑", + "workflows": "工作流路徑" } }, "directoryPicker": { @@ -1447,6 +1455,53 @@ "openSettingsFolder": "開啟設定資料夾" } }, + "workflows": { + "title": "工作流", + "contextMenu": { + "sendToComfy": "在 ComfyUI 中開啟", + "updateFromComfy": "從 ComfyUI 更新", + "copyWorkflow": "複製工作流", + "restoreDownloaded": "還原已下載版本" + }, + "sendToComfy": { + "success": "工作流已傳送到 ComfyUI", + "failed": "傳送工作流失敗:{message}" + }, + "restoreDownloaded": { + "title": "要還原已下載版本嗎?", + "message": "這會捨棄本機修改,並將工作流還原為下載時的版本。", + "confirmButton": "還原", + "restoring": "正在還原工作流...", + "success": "工作流已還原為已下載版本", + "failed": "還原工作流失敗:{message}" + }, + "updateFromComfy": { + "success": "已從 ComfyUI 更新工作流", + "noChanges": "ComfyUI 中沒有需要寫回的變更", + "cancelled": "更新已取消", + "failed": "從 ComfyUI 更新失敗:{message}" + }, + "copyWorkflow": { + "failed": "複製工作流失敗:{message}" + }, + "disabled": { + "title": "工作流管理已關閉", + "description": "啟用後可掃描和管理 ComfyUI 工作流檔案,保留其 CivitAI 中繼資料和預覽,並將它們傳送到執行中的 ComfyUI 中。", + "enableButton": "啟用工作流", + "hint": "您稍後可以在「設定 > 模型庫」中再次關閉此功能。", + "enableFailed": "啟用工作流失敗" + }, + "noPaths": { + "title": "找不到工作流資料夾", + "descriptionStandalone": "工作流管理已開啟,但找不到工作流資料夾。請在「設定 > 模型路徑」中加入工作流資料夾,然後重新啟動 LoRA Manager。", + "hintStandalone": "工作流會從 folder_paths.workflows 項目讀取。", + "descriptionComfyUI": "工作流管理已開啟,但未設定工作流資料夾。請在「設定 > 模型庫」中加入工作流資料夾,然後重新載入此頁面。", + "hintComfyUI": "工作流存放在獨立的模型庫資料夾中(folder_paths.workflows);不會影響 ComfyUI 內建的工作流清單。", + "openSettings": "開啟設定", + "openModelPaths": "設定模型資料夾", + "openSettingsFolder": "開啟設定資料夾" + } + }, "sidebar": { "modelRoot": "根目錄", "collapseAll": "全部摺疊資料夾", @@ -2272,6 +2327,10 @@ "title": "正在初始化其他模型管理器", "message": "正在掃描並建立模型快取。這可能需要幾分鐘..." }, + "workflows": { + "title": "初始化工作流管理器", + "message": "正在掃描並建立工作流快取。這可能需要幾分鐘..." + }, "recipes": { "title": "初始化配方管理器", "message": "正在載入並處理配方,可能需要幾分鐘..." diff --git a/py/config.py b/py/config.py index c8ca7c0e..571c38b0 100644 --- a/py/config.py +++ b/py/config.py @@ -209,6 +209,12 @@ class Config: self.other_root_subtypes: Dict[str, str] = {} self.other_folder_roots: Dict[str, List[str]] = {} self.other_roots = self._init_other_paths() + # Workflow roots (ComfyUI workflow JSON library). Opt-in feature: + # empty while ``enable_workflows`` is off. Not a ComfyUI folder_paths + # category — sourced from LoRA Manager's own settings in both modes. + self.workflows_roots: List[str] = [] + self.extra_workflows_roots: List[str] = [] + self.workflows_roots = self._init_workflow_paths() # Extra paths (only for LoRA Manager, not shared with ComfyUI) self.extra_loras_roots: List[str] = [] self.extra_checkpoints_roots: List[str] = [] @@ -265,8 +271,9 @@ class Config: extra_checkpoint = extra_folder_paths.get("checkpoints", []) or [] extra_unet = extra_folder_paths.get("unet", []) or [] extra_embedding = extra_folder_paths.get("embeddings", []) or [] + extra_workflows = extra_folder_paths.get("workflows", []) or [] - if not any([extra_lora, extra_checkpoint, extra_unet, extra_embedding]): + if not any([extra_lora, extra_checkpoint, extra_unet, extra_embedding, extra_workflows]): return filtered_extra_lora = self._filter_overlapping_extra_lora_paths( @@ -281,6 +288,8 @@ class Config: self.extra_embeddings_roots = self._prepare_embedding_paths( extra_embedding ) + if settings_manager.is_workflows_enabled(): + self.extra_workflows_roots = self._prepare_lora_paths(extra_workflows) if self.extra_loras_roots: logger.info( @@ -460,6 +469,15 @@ class Config: self.embeddings_roots or [], ), } + # Workflow roots live only in our settings (the host has no such + # category); persist them so the whitelist rebuild above does not + # erase the key. Empty lists are still written when the key was + # configured before, so a deliberate removal round-trips. + workflow_configured = self.configured_roots_for("workflow") + if workflow_configured or self.workflows_roots: + target_folder_paths["workflows"] = _append_new_paths( + workflow_configured, self.workflows_roots or [] + ) # Persist the other-model roots under their original folder_paths # keys so library switching round-trips them. for key, roots in (self.other_folder_roots or {}).items(): @@ -1124,6 +1142,8 @@ class Config: preview_roots.update(self._expand_preview_root(root)) for root in self.other_roots or []: preview_roots.update(self._expand_preview_root(root)) + for root in self.workflows_roots or []: + preview_roots.update(self._expand_preview_root(root)) # Include extra paths for preview access for root in self.extra_loras_roots or []: preview_roots.update(self._expand_preview_root(root)) @@ -1133,6 +1153,8 @@ class Config: preview_roots.update(self._expand_preview_root(root)) for root in self.extra_embeddings_roots or []: preview_roots.update(self._expand_preview_root(root)) + for root in self.extra_workflows_roots or []: + preview_roots.update(self._expand_preview_root(root)) if self.recipes_path: preview_roots.update(self._expand_preview_root(self.recipes_path)) @@ -1596,12 +1618,28 @@ class Config: self.other_folder_roots, ) = self._prepare_other_paths(other_path_map) + # Workflow roots ride the same library folder_paths structure but are + # not a ComfyUI category; the live list stays empty while the opt-in + # feature is off. + workflow_paths = folder_paths.get("workflows", []) or [] + self._remember_configured_paths("workflow", workflow_paths) + try: + from .services.settings_manager import get_settings_manager + + workflows_enabled = get_settings_manager().is_workflows_enabled() + except Exception: # pragma: no cover - defensive fallback + workflows_enabled = False + self.workflows_roots = ( + self._prepare_lora_paths(workflow_paths) if workflows_enabled else [] + ) + # Process extra paths (only for LoRA Manager, not shared with ComfyUI) extra_paths = extra_folder_paths or {} extra_lora_paths = extra_paths.get("loras", []) or [] extra_checkpoint_paths = extra_paths.get("checkpoints", []) or [] extra_unet_paths = extra_paths.get("unet", []) or [] extra_embedding_paths = extra_paths.get("embeddings", []) or [] + extra_workflow_paths = extra_paths.get("workflows", []) or [] filtered_extra_lora_paths = self._filter_overlapping_extra_lora_paths( self.loras_roots, @@ -1616,6 +1654,9 @@ class Config: self.extra_embeddings_roots = self._prepare_embedding_paths( extra_embedding_paths ) + self.extra_workflows_roots = ( + self._prepare_lora_paths(extra_workflow_paths) if workflows_enabled else [] + ) # Log extra folder paths if self.extra_loras_roots: @@ -1809,6 +1850,85 @@ class Config: logger.warning(f"Error initializing other model paths: {e}") return [] + def _get_configured_workflow_paths(self) -> List[str]: + """Read the workflows folder_paths entry from the active library. + + "workflows" is not a ComfyUI folder_paths category (the host raises + KeyError for unknown keys), so both modes source workflow roots from + LoRA Manager's own settings. + """ + try: + from .services.settings_manager import get_settings_manager + + library_config = get_settings_manager().get_active_library() + except Exception: + return [] + if not isinstance(library_config, Mapping): + return [] + folder_paths_config = library_config.get("folder_paths") + if not isinstance(folder_paths_config, Mapping): + return [] + raw_paths = folder_paths_config.get("workflows", []) + if not isinstance(raw_paths, list): + return [] + return [path for path in raw_paths if isinstance(path, str) and path.strip()] + + def _init_workflow_paths(self) -> List[str]: + """Initialize and validate workflow roots. + + Opt-in feature: the live root list stays empty while + ``enable_workflows`` is off, but the configured paths are still + remembered so ``save_folder_paths_to_settings()`` round-trips them. + """ + try: + raw_paths = self._get_configured_workflow_paths() + self._remember_configured_paths("workflow", raw_paths) + + from .services.settings_manager import get_settings_manager + + if not get_settings_manager().is_workflows_enabled(): + return [] + + unique_paths = self._prepare_lora_paths(raw_paths) + logger.info( + "Found workflow roots:" + + ("\n - " + "\n - ".join(unique_paths) if unique_paths else "[]") + ) + return unique_paths + except Exception as e: + logger.warning(f"Error initializing workflow paths: {e}") + return [] + + def refresh_workflow_roots(self) -> None: + """Rebuild workflow roots after the opt-in toggle or paths change. + + Called when ``enable_workflows`` or the workflows folder_paths are + updated so the scanner immediately reflects the new folder set + without a full application restart. + """ + self.workflows_roots = self._init_workflow_paths() + try: + from .services.settings_manager import get_settings_manager + + settings_manager = get_settings_manager() + extra_workflows: List[str] = [] + if settings_manager.is_workflows_enabled(): + library_config = settings_manager.get_active_library() + if isinstance(library_config, Mapping): + extra_config = library_config.get("extra_folder_paths") + if isinstance(extra_config, Mapping): + raw_extra = extra_config.get("workflows", []) + if isinstance(raw_extra, list): + extra_workflows = [ + path + for path in raw_extra + if isinstance(path, str) and path.strip() + ] + self.extra_workflows_roots = self._prepare_lora_paths(extra_workflows) + except Exception: # pragma: no cover - defensive fallback + self.extra_workflows_roots = [] + self._rebuild_preview_roots() + def _remember_configured_paths( self, model_type: str, paths: Iterable[str] ) -> None: diff --git a/py/lora_manager.py b/py/lora_manager.py index 39cd9a95..36d9eeec 100644 --- a/py/lora_manager.py +++ b/py/lora_manager.py @@ -275,6 +275,11 @@ class LoraManager: checkpoint_scanner = await ServiceRegistry.get_checkpoint_scanner() embedding_scanner = await ServiceRegistry.get_embedding_scanner() other_scanner = await ServiceRegistry.get_other_scanner() + # Opt-in but always initialized: an empty-roots scan is trivial, and + # without a cache the /workflows page would sit on the initialization + # screen forever (even the "feature disabled" empty state needs the + # scanner past the initializing check). + workflow_scanner = await ServiceRegistry.get_workflow_scanner() # Initialize recipe scanner if needed recipe_scanner = await ServiceRegistry.get_recipe_scanner() @@ -296,6 +301,10 @@ class LoraManager: other_scanner.initialize_in_background(), name="other_cache_init", ), + asyncio.create_task( + workflow_scanner.initialize_in_background(), + name="workflow_cache_init", + ), asyncio.create_task( recipe_scanner.initialize_in_background(), name="recipe_cache_init" ), diff --git a/py/routes/handlers/misc_handlers.py b/py/routes/handlers/misc_handlers.py index a968c6cd..48945e0f 100644 --- a/py/routes/handlers/misc_handlers.py +++ b/py/routes/handlers/misc_handlers.py @@ -716,6 +716,7 @@ class HealthCheckHandler: "checkpoint": ServiceRegistry.get_checkpoint_scanner, "embedding": ServiceRegistry.get_embedding_scanner, "other": ServiceRegistry.get_other_scanner, + "workflow": ServiceRegistry.get_workflow_scanner, "recipe": ServiceRegistry.get_recipe_scanner, } self._first_run_manager = first_run_manager @@ -723,13 +724,14 @@ class HealthCheckHandler: def _active_scanner_getters( self, ) -> Mapping[str, Callable[[], Awaitable[Any]]]: - """Drop the opt-in other scanner while Other Models is disabled.""" - getters = self._scanner_getters - if "other" not in getters: - return getters - if get_settings_manager().is_other_models_enabled(): - return getters - return {name: getter for name, getter in getters.items() if name != "other"} + """Drop the opt-in scanners while their features are disabled.""" + settings = get_settings_manager() + active = dict(self._scanner_getters) + if not settings.is_other_models_enabled(): + active.pop("other", None) + if not settings.is_workflows_enabled(): + active.pop("workflow", None) + return active async def health_check(self, request: web.Request) -> web.Response: return web.json_response({"status": "ok"}) @@ -743,6 +745,7 @@ class HealthCheckHandler: "checkpoints": ("checkpoint",), "embeddings": ("embedding",), "other": ("other",), + "workflows": ("workflow",), "recipes": ("recipe",), } @@ -965,6 +968,7 @@ class DoctorHandler: ("checkpoint", "Checkpoints", ServiceRegistry.get_checkpoint_scanner), ("embedding", "Embeddings", ServiceRegistry.get_embedding_scanner), ("other", "Other Models", ServiceRegistry.get_other_scanner), + ("workflow", "Workflows", ServiceRegistry.get_workflow_scanner), ) ) self._app_version_getter = app_version_getter @@ -972,10 +976,13 @@ class DoctorHandler: def _active_scanner_factories( self, ) -> Sequence[tuple[str, str, Callable[[], Awaitable[Any]]]]: - """Drop the opt-in other scanner while Other Models is disabled.""" - if self._settings.is_other_models_enabled(): - return self._scanner_factories - return tuple(entry for entry in self._scanner_factories if entry[0] != "other") + """Drop the opt-in scanners while their features are disabled.""" + factories = self._scanner_factories + if not self._settings.is_other_models_enabled(): + factories = tuple(entry for entry in factories if entry[0] != "other") + if not self._settings.is_workflows_enabled(): + factories = tuple(entry for entry in factories if entry[0] != "workflow") + return factories async def get_doctor_diagnostics(self, request: web.Request) -> web.Response: try: @@ -1852,6 +1859,15 @@ class SettingsHandler: response_data["other_models_paths_available"] = None standalone_mode = os.environ.get("LORA_MANAGER_STANDALONE", "0") == "1" response_data["standalone_mode"] = standalone_mode + # Workflow roots are LoRA-Manager-only in BOTH modes (the ComfyUI + # host has no such folder category), so expose them to the + # settings UI regardless of standalone_mode. + get_workflow_paths = getattr( + self._settings, "get_workflow_folder_paths", None + ) + response_data["workflow_folder_paths"] = ( + get_workflow_paths() if get_workflow_paths else [] + ) if standalone_mode: # Standalone reads its model roots exclusively from # settings.json, so the Model Paths settings UI needs the @@ -1958,6 +1974,14 @@ class SettingsHandler: proxy_changed = False for key, value in data.items(): + if key == "workflow_folder_paths": + # Pseudo-key: replaces only the workflows entry of the + # active library's folder_paths (core keys are host-owned + # in plugin mode and must not be clobbered), then applies + # the new roots live without a restart. + self._settings.set_workflow_folder_paths(value) + continue + if value == self._settings.get(key): continue @@ -2418,6 +2442,7 @@ class ServiceRegistryAdapter: get_downloaded_version_history_service: Callable[[], Awaitable[Any]] get_backup_service: Callable[[], Awaitable[Any]] = _noop_backup_service get_other_scanner: Callable[[], Awaitable[Any]] = ServiceRegistry.get_other_scanner + get_workflow_scanner: Callable[[], Awaitable[Any]] = ServiceRegistry.get_workflow_scanner class ModelLibraryHandler: @@ -2444,6 +2469,8 @@ class ModelLibraryHandler: return "embedding" if normalized in VALID_OTHER_CIVITAI_TYPES: return "other" + if normalized in {"workflow", "workflows", "comfyworkflows"}: + return "workflow" return None async def _get_scanner_for_type(self, model_type: str | None): @@ -2461,6 +2488,11 @@ class ModelLibraryHandler: if not get_settings_manager().is_other_models_enabled(): return None, None return normalized_type, await self._service_registry.get_other_scanner() + if normalized_type == "workflow": + # Same opt-in posture as other models. + if not get_settings_manager().is_workflows_enabled(): + return None, None + return normalized_type, await self._service_registry.get_workflow_scanner() return None, None async def _get_download_history_service(self): diff --git a/py/routes/workflow_routes.py b/py/routes/workflow_routes.py new file mode 100644 index 00000000..db0ae8aa --- /dev/null +++ b/py/routes/workflow_routes.py @@ -0,0 +1,838 @@ +import asyncio +import hashlib +import json +import logging +import os +import tempfile +from typing import Any, Dict, Optional + +import aiohttp +from aiohttp import web + +from .base_model_routes import BaseModelRoutes +from .model_route_registrar import ModelRouteRegistrar +from ..config import config +from ..services.model_lifecycle_service import _require_path_in_library_roots +from ..services.service_registry import ServiceRegistry +from ..services.workflow_link_registry import WorkflowLinkRegistry +from ..services.workflow_service import WorkflowService +from ..utils.constants import WORKFLOW_CIVITAI_TYPES +from ..utils.file_utils import calculate_sha256 +from ..utils.metadata_manager import MetadataManager +from ..utils.models import WorkflowMetadata +from ..utils.workflow_analysis import ( + MAX_WORKFLOW_JSON_BYTES, + analyze_workflow, + load_workflow_file, +) +from ..utils.workflow_extraction import ( + get_workflow_document_path, + load_artifact_workflow_document, +) + +logger = logging.getLogger(__name__) + + +class WorkflowRestoreDownloadError(RuntimeError): + """Raised when a restore re-download fails before the file is replaced.""" + + +class WorkflowRoutes(BaseModelRoutes): + """Workflow-specific route controller (ComfyUI workflow JSON resources). + + Workflow management is opt-in (``enable_workflows``): while disabled the + page renders an enable-now empty state and CivitAI linking is rejected. + """ + + def __init__(self): + """Initialize Workflow routes with Workflow service""" + super().__init__() + self.template_name = "workflows.html" + + async def initialize_services(self): + """Initialize services from ServiceRegistry""" + workflow_scanner = await ServiceRegistry.get_workflow_scanner() + update_service = await ServiceRegistry.get_model_update_service() + self.service = WorkflowService(workflow_scanner, update_service=update_service) + self.set_model_update_service(update_service) + + # Attach service dependencies + self.attach_service(self.service) + + def setup_routes(self, app: web.Application, prefix: str = "workflows"): + """Setup Workflow routes""" + # Schedule service initialization on app startup + app.on_startup.append(lambda _: self.initialize_services()) + + # Setup common routes with 'workflows' prefix (includes page route) + super().setup_routes(app, prefix) + + def setup_specific_routes(self, registrar: ModelRouteRegistrar, prefix: str): + """Setup Workflow-specific routes""" + # Workflow info by name + registrar.add_prefixed_route( + 'GET', '/api/lm/{prefix}/info/{name}', prefix, self.get_workflow_info + ) + # Push a workflow into the ComfyUI graph (plugin mode only). Accepts + # GET as well: the companion browser extension is GET-only by + # convention (see AGENTS.md). + registrar.add_prefixed_route( + 'POST', '/api/lm/{prefix}/send-to-comfy', prefix, self.send_to_comfy + ) + registrar.add_prefixed_route( + 'GET', '/api/lm/{prefix}/send-to-comfy', prefix, self.send_to_comfy + ) + # Read the workflow document itself (copy-to-clipboard flow); works in + # standalone mode too since no ComfyUI connection is involved. + registrar.add_prefixed_route( + 'GET', '/api/lm/{prefix}/content', prefix, self.get_workflow_content + ) + # Write the current ComfyUI graph back into the managed workflow + # document (ComfyUI-side "Update LM-managed workflow" entry point). + registrar.add_prefixed_route( + 'PUT', '/api/lm/{prefix}/content', prefix, self.update_workflow_content + ) + # ComfyUI-side link-state reporting (which managed workflow is open + # and dirty in which client tab) and the LM-page-triggered write-back + # request/response pair ("Update from ComfyUI" card menu entry). + registrar.add_prefixed_route( + 'POST', '/api/lm/{prefix}/comfyui-state', prefix, self.report_comfyui_state + ) + registrar.add_prefixed_route( + 'GET', '/api/lm/{prefix}/comfyui-state', prefix, self.get_comfyui_state + ) + registrar.add_prefixed_route( + 'POST', '/api/lm/{prefix}/update-from-comfy', prefix, self.update_from_comfy + ) + registrar.add_prefixed_route( + 'POST', '/api/lm/{prefix}/collect-result', prefix, self.collect_result + ) + # Restore a workflow to its downloaded state (discard local edits). + registrar.add_prefixed_route( + 'POST', '/api/lm/{prefix}/restore', prefix, self.restore_workflow + ) + + def _validate_civitai_model_type(self, model_type: str) -> bool: + """Validate CivitAI model type for workflows (opt-in gated).""" + if not self._settings.is_workflows_enabled(): + return False + return (model_type or "").strip().lower() in WORKFLOW_CIVITAI_TYPES + + def _get_expected_model_types(self) -> str: + """Get expected model types string for error messages""" + return "Workflows or ComfyWorkflows" + + def _find_model_file(self, files): + """Prefer a single-workflow Config .json, then an Archive .zip. + + Mirrors CivitAI's own default pick for Workflow resources + (resource-file.service.ts pickDefaultResourceFile); falls back to the + base-class weight-file behaviour for anything else. + """ + def rank(file_info): + file_type = file_info.get("type") + name = (file_info.get("name") or "").lower() + if file_type == "Config" and name.endswith(".json"): + return 0 + if file_type == "Archive" and name.endswith(".zip"): + return 1 + return 2 + + candidates = [f for f in files if rank(f) < 2] + if candidates: + candidates.sort(key=lambda f: (rank(f), f.get("id", 0))) + return candidates[0] + return super()._find_model_file(files) + + def _get_page_context_provider(self): + """Expose the opt-in feature state to the Workflows page template.""" + return self._page_context_for_workflows + + def _page_context_for_workflows(self, request: web.Request) -> Dict[str, Any]: + if not self._settings.is_workflows_enabled(): + return {"workflows_disabled": True, "workflows_no_paths": False} + + standalone_mode = os.environ.get("LORA_MANAGER_STANDALONE", "0") == "1" + context = { + "workflows_disabled": False, + "workflows_no_paths": not bool(config.workflows_roots), + "standalone_mode": standalone_mode, + } + if standalone_mode: + context["settings_file"] = getattr(self._settings, "settings_file", "") or "" + return context + + async def get_workflow_info(self, request: web.Request) -> web.Response: + """Get detailed information for a specific workflow by name""" + try: + name = request.match_info.get('name', '') + workflow_info = await self.service.get_model_info_by_name(name) # pyright: ignore[reportAttributeAccessIssue] + + if workflow_info: + return web.json_response(workflow_info) + else: + return web.json_response({"error": "Workflow not found"}, status=404) + + except Exception as e: + logger.error(f"Error in get_workflow_info: {e}", exc_info=True) + return web.json_response({"error": str(e)}, status=500) + + async def send_to_comfy(self, request: web.Request) -> web.Response: + """Load a library workflow into the running ComfyUI graph. + + Reads the workflow JSON and broadcasts it over the ``lm_load_workflow`` + websocket channel; the ComfyUI-side extension picks it up and calls + ``loadGraphData`` (same channel as recipe send-workflow). + """ + try: + if os.environ.get("LORA_MANAGER_STANDALONE", "0") == "1": + return web.json_response( + {"success": False, "error": "Standalone Mode Active"}, status=400 + ) + + if not self._settings.is_workflows_enabled(): + return web.json_response( + {"success": False, "error": "Workflow management is disabled"}, + status=400, + ) + + if request.method == "POST": + payload = await self._read_json_body(request) + else: + payload = dict(request.query) + file_path = (payload.get("file_path") or "").strip() + if not file_path: + return web.json_response( + {"success": False, "error": "file_path is required"}, status=400 + ) + + _require_path_in_library_roots( + file_path, self.service.scanner, label="File path" + ) + + workflow = await self._load_workflow_payload(file_path) + if workflow is None: + return web.json_response( + { + "success": False, + "error": "not_a_workflow", + "message": "File is missing or is not a ComfyUI workflow", + }, + status=404, + ) + + # Lazy import: standalone mode replaces the ``server`` module with + # a mock; the standalone check above already guards UX. + from server import PromptServer # pyright: ignore[reportMissingImports] + + PromptServer.instance.send_sync( + "lm_load_workflow", + { + "workflow": workflow, + "name": os.path.splitext(os.path.basename(file_path))[0], + # Provenance marker: the ComfyUI-side extension stamps this + # onto the loaded graph so its "Update LM-managed workflow" + # entry point can write edits back to the right document. + "lm_source": { + "file_path": file_path, + "sha256": await self._document_sha256(file_path), + }, + }, + ) + return web.json_response({"success": True, "sent": True}) + except ValueError as exc: + return web.json_response({"success": False, "error": str(exc)}, status=400) + except Exception as exc: + logger.error("Error sending workflow to ComfyUI: %s", exc, exc_info=True) + return web.json_response({"success": False, "error": str(exc)}, status=500) + + async def get_workflow_content(self, request: web.Request) -> web.Response: + """Return the extracted workflow document for a library entry. + + Used by the copy-to-clipboard flow; unlike send-to-comfy it does not + require a running ComfyUI, so it works in standalone mode as well. + """ + try: + if not self._settings.is_workflows_enabled(): + return web.json_response( + {"success": False, "error": "Workflow management is disabled"}, + status=400, + ) + + file_path = (request.query.get("file_path") or "").strip() + if not file_path: + return web.json_response( + {"success": False, "error": "file_path is required"}, status=400 + ) + + _require_path_in_library_roots( + file_path, self.service.scanner, label="File path" + ) + + workflow = await self._load_workflow_payload(file_path) + if workflow is None: + return web.json_response( + { + "success": False, + "error": "not_a_workflow", + "message": "File is missing or is not a ComfyUI workflow", + }, + status=404, + ) + return web.json_response({"success": True, "workflow": workflow}) + except ValueError as exc: + return web.json_response({"success": False, "error": str(exc)}, status=400) + except Exception as exc: + logger.error("Error reading workflow content: %s", exc, exc_info=True) + return web.json_response({"success": False, "error": str(exc)}, status=500) + + async def _read_json_body(self, request: web.Request) -> Dict[str, Any]: + try: + payload = await request.json() + except (json.JSONDecodeError, UnicodeDecodeError): + return {} + return payload if isinstance(payload, dict) else {} + + async def _load_workflow_payload(self, file_path: str): + """Read the extracted workflow document off the event loop. + + ``.json`` artifacts are read directly; containers (``.zip``/image + files) resolve to their derived ``.workflow.json`` sidecar, which is + materialized on demand when missing. + """ + + return await asyncio.to_thread(load_artifact_workflow_document, file_path) + + async def _document_sha256(self, file_path: str) -> Optional[str]: + """SHA256 of the extracted workflow document on disk. + + Callers must materialize the document first (``_load_workflow_payload`` + does). Returns ``None`` when the document is missing/unreadable. + """ + + document_path = get_workflow_document_path(file_path) + try: + if not os.path.exists(document_path): + return None + except OSError: + return None + try: + return await calculate_sha256(document_path) or None + except OSError: + return None + + async def update_workflow_content(self, request: web.Request) -> web.Response: + """Write the current ComfyUI graph back into a managed workflow. + + The ComfyUI-side extension calls this with the serialized graph when + the user picks "Update LM-managed workflow". The write targets the + workflow document: ``.json`` artifacts are rewritten in place, while + container artifacts (``.zip``/images) keep their original bytes (the + SHA256 is their CivitAI identity) and receive the edited graph in the + derived ``.workflow.json`` sidecar. + + Optimistic concurrency: when ``base_sha256`` (the document hash the + client saw when the workflow was opened) no longer matches the + document on disk, the write is rejected with 409 unless ``force`` is + set — someone else (re-download, update check) changed it meanwhile. + """ + try: + if not self._settings.is_workflows_enabled(): + return web.json_response( + {"success": False, "error": "Workflow management is disabled"}, + status=400, + ) + + payload = await self._read_json_body(request) + file_path = (payload.get("file_path") or "").strip() + workflow = payload.get("workflow") + if not file_path: + return web.json_response( + {"success": False, "error": "file_path is required"}, status=400 + ) + if not isinstance(workflow, dict): + return web.json_response( + {"success": False, "error": "workflow is required"}, status=400 + ) + + _require_path_in_library_roots( + file_path, self.service.scanner, label="File path" + ) + + # The provenance marker the client stamped for bookkeeping must + # never land in the library document. + extra = workflow.get("extra") + if isinstance(extra, dict): + extra.pop("lm_source", None) + + analysis = analyze_workflow(workflow) + if analysis is None: + return web.json_response( + {"success": False, "error": "workflow is not a ComfyUI graph document"}, + status=400, + ) + + text = json.dumps(workflow, ensure_ascii=False) + if len(text.encode("utf-8")) > MAX_WORKFLOW_JSON_BYTES: + return web.json_response( + {"success": False, "error": "workflow exceeds the size limit"}, + status=400, + ) + + document_path = get_workflow_document_path(file_path) + base_sha256 = str(payload.get("base_sha256") or "").strip().lower() + force = bool(payload.get("force")) + if base_sha256 and not force and os.path.exists(document_path): + current_sha256 = await calculate_sha256(document_path) + if current_sha256 and current_sha256.lower() != base_sha256: + return web.json_response( + { + "success": False, + "error": "conflict", + "current_sha256": current_sha256, + }, + status=409, + ) + + def _write_document() -> None: + os.makedirs(os.path.dirname(document_path), exist_ok=True) + fd, temp_path = tempfile.mkstemp( + dir=os.path.dirname(document_path), suffix=".tmp" + ) + try: + with os.fdopen(fd, "w", encoding="utf-8") as handle: + handle.write(text) + os.replace(temp_path, document_path) + except BaseException: + try: + os.unlink(temp_path) + except OSError: + pass + raise + + await asyncio.to_thread(_write_document) + + new_sha256 = hashlib.sha256(text.encode("utf-8")).hexdigest() + await self._refresh_metadata_after_write( + file_path, analysis, new_sha256 + ) + return web.json_response( + {"success": True, "file_path": file_path, "sha256": new_sha256} + ) + except ValueError as exc: + return web.json_response({"success": False, "error": str(exc)}, status=400) + except Exception as exc: + logger.error("Error updating workflow content: %s", exc, exc_info=True) + return web.json_response({"success": False, "error": str(exc)}, status=500) + + async def _refresh_metadata_after_write( + self, file_path: str, analysis, document_sha256: str + ) -> None: + """Re-sync sidecar metadata and caches after a write-back. + + Analysis fields (node classes, model refs, ...) always follow the new + document. The CivitAI-facing artifact hash/size/modified only move for + bare ``.json`` artifacts, whose bytes ARE the document; container + artifacts stay byte-identical. + """ + + try: + metadata, should_skip = await MetadataManager.load_metadata( + file_path, WorkflowMetadata + ) + if should_skip or metadata is None: + return + + metadata.workflow_format = analysis.workflow_format + metadata.node_count = analysis.node_count + metadata.node_classes = analysis.node_classes + metadata.model_refs = analysis.model_refs + metadata.civitai_refs = analysis.civitai_refs + + if os.path.splitext(file_path)[1].lower() == ".json": + metadata.sha256 = document_sha256 + real_path = os.path.realpath(file_path) + metadata.size = os.path.getsize(real_path) + metadata.modified = os.path.getmtime(real_path) + + await MetadataManager.save_metadata(file_path, metadata) + + scanner = getattr(self.service, "scanner", None) + if scanner is not None: + await scanner.sync_cache_from_metadata( + file_path, metadata.to_dict() + ) + except Exception: + logger.warning( + "Failed to refresh workflow metadata after write-back for %s", + file_path, + exc_info=True, + ) + + # ------------------------------------------------------------------ + # ComfyUI link-state reporting + LM-page-triggered write-back + # ------------------------------------------------------------------ + + @staticmethod + def _is_standalone() -> bool: + return os.environ.get("LORA_MANAGER_STANDALONE", "0") == "1" + + @staticmethod + def _active_client_ids() -> set: + """Live ComfyUI websocket client ids; empty when unavailable.""" + try: + from server import PromptServer # pyright: ignore[reportMissingImports] + + return set(PromptServer.instance.sockets.keys()) + except Exception: + return set() + + async def report_comfyui_state(self, request: web.Request) -> web.Response: + """ComfyUI client reports its active graph's LM link state. + + Body: ``{client_id, state}`` where ``state`` is + ``{file_path, sha256, dirty, name}`` or ``null`` (active graph is not + LM-linked). In standalone mode there are no ComfyUI clients; the + report is accepted and dropped. + """ + if self._is_standalone(): + return web.json_response({"success": True}) + + payload = await self._read_json_body(request) + client_id = payload.get("client_id") + if not isinstance(client_id, str) or not client_id: + return web.json_response( + {"success": False, "error": "client_id is required"}, status=400 + ) + state = payload.get("state") + registry = await WorkflowLinkRegistry.get_instance() + await registry.report_state( + client_id, state if isinstance(state, dict) else None + ) + return web.json_response({"success": True}) + + async def get_comfyui_state(self, request: web.Request) -> web.Response: + """List LM-linked workflows currently open in live ComfyUI tabs.""" + if self._is_standalone(): + return web.json_response({"success": True, "states": []}) + + registry = await WorkflowLinkRegistry.get_instance() + states = await registry.get_states(self._active_client_ids()) + return web.json_response({"success": True, "states": states}) + + async def update_from_comfy(self, request: web.Request) -> web.Response: + """Ask the ComfyUI tab holding *file_path* to write its graph back. + + The LM web UI's "Update from ComfyUI" card menu entry calls this; the + request blocks until the ComfyUI client performs the write-back (via + the regular ``PUT .../content`` endpoint) and reports the outcome, or + a timeout elapses. + """ + try: + if self._is_standalone(): + return web.json_response( + {"success": False, "error": "Standalone Mode Active"}, status=400 + ) + if not self._settings.is_workflows_enabled(): + return web.json_response( + {"success": False, "error": "Workflow management is disabled"}, + status=400, + ) + + payload = await self._read_json_body(request) + file_path = (payload.get("file_path") or "").strip() + if not file_path: + return web.json_response( + {"success": False, "error": "file_path is required"}, status=400 + ) + _require_path_in_library_roots( + file_path, self.service.scanner, label="File path" + ) + + registry = await WorkflowLinkRegistry.get_instance() + sid = await registry.find_client_for(file_path, self._active_client_ids()) + if sid is None: + return web.json_response( + { + "success": False, + "error": "not_open", + "message": "Workflow is not open in any connected ComfyUI tab", + }, + status=404, + ) + + request_id, future = registry.begin_collect() + from server import PromptServer # pyright: ignore[reportMissingImports] + + PromptServer.instance.send_sync( + "lm_collect_workflow", + {"request_id": request_id, "file_path": file_path}, + sid=sid, + ) + result = await registry.await_collect(request_id, future, timeout=20.0) + status = 200 if result.get("success") else 500 + if result.get("error") in ("no_changes", "cancelled"): + status = 200 + elif result.get("error") == "timeout": + status = 504 + return web.json_response(result, status=status) + except ValueError as exc: + return web.json_response({"success": False, "error": str(exc)}, status=400) + except Exception as exc: + logger.error("Error collecting workflow from ComfyUI: %s", exc, exc_info=True) + return web.json_response({"success": False, "error": str(exc)}, status=500) + + async def collect_result(self, request: web.Request) -> web.Response: + """ComfyUI client reports the outcome of a collect request.""" + if self._is_standalone(): + return web.json_response({"success": False, "error": "Standalone Mode Active"}, status=400) + + payload = await self._read_json_body(request) + request_id = payload.get("request_id") + if not isinstance(request_id, str) or not request_id: + return web.json_response( + {"success": False, "error": "request_id is required"}, status=400 + ) + result = { + key: payload[key] + for key in ("success", "error", "sha256", "file_path") + if key in payload + } + registry = await WorkflowLinkRegistry.get_instance() + resolved = await registry.resolve_collect(request_id, result) + return web.json_response({"success": True, "resolved": resolved}) + + # ------------------------------------------------------------------ + # Restore to downloaded state + # ------------------------------------------------------------------ + + async def restore_workflow(self, request: web.Request) -> web.Response: + """Restore a workflow to its downloaded state, discarding local edits. + + Container artifacts (``.zip``/images) were never modified — write-backs + only touch the derived ``.workflow.json`` sidecar — so restore discards + the sidecar and re-extracts from the pristine archive. Bare ``.json`` + artifacts are rewritten in place by write-backs, so restore + re-downloads the recorded CivitAI version file and replaces the local + copy (after validating the download and verifying its hash). + """ + try: + if not self._settings.is_workflows_enabled(): + return web.json_response( + {"success": False, "error": "Workflow management is disabled"}, + status=400, + ) + + payload = await self._read_json_body(request) + file_path = (payload.get("file_path") or "").strip() + if not file_path: + return web.json_response( + {"success": False, "error": "file_path is required"}, status=400 + ) + _require_path_in_library_roots( + file_path, self.service.scanner, label="File path" + ) + + if not os.path.exists(file_path): + return web.json_response( + {"success": False, "error": "Workflow file not found"}, status=404 + ) + + if os.path.splitext(file_path)[1].lower() == ".json": + return await self._restore_json_artifact(file_path) + return await self._restore_container_artifact(file_path) + except ValueError as exc: + return web.json_response({"success": False, "error": str(exc)}, status=400) + except Exception as exc: + logger.error("Error restoring workflow: %s", exc, exc_info=True) + return web.json_response({"success": False, "error": str(exc)}, status=500) + + async def _restore_container_artifact(self, file_path: str) -> web.Response: + """Discard the derived document and re-extract from the archive.""" + + document_path = get_workflow_document_path(file_path) + + def _discard_derived() -> None: + try: + os.unlink(document_path) + except FileNotFoundError: + pass + + await asyncio.to_thread(_discard_derived) + + document = await asyncio.to_thread(load_artifact_workflow_document, file_path) + if document is None: + return web.json_response( + { + "success": False, + "error": "not_a_workflow", + "message": "Archive does not contain a ComfyUI workflow", + }, + status=404, + ) + + analysis = analyze_workflow(document) + doc_sha = hashlib.sha256( + json.dumps(document, ensure_ascii=False).encode("utf-8") + ).hexdigest() + await self._refresh_metadata_after_write(file_path, analysis, doc_sha) + return web.json_response( + {"success": True, "file_path": file_path, "restored": "extracted"} + ) + + async def _restore_json_artifact(self, file_path: str) -> web.Response: + """Re-download the recorded CivitAI file over the local copy.""" + + metadata, should_skip = await MetadataManager.load_metadata( + file_path, WorkflowMetadata + ) + version_info = ( + metadata.civitai + if metadata is not None and not should_skip and metadata.from_civitai + else None + ) + if not isinstance(version_info, dict) or not version_info: + return web.json_response( + { + "success": False, + "error": "no_source", + "message": "Workflow has no recorded CivitAI source to restore from", + }, + status=400, + ) + + file_info = self._find_downloaded_file_info(version_info, file_path) + download_url = (file_info or {}).get("downloadUrl") or version_info.get( + "downloadUrl" + ) + if not download_url: + return web.json_response( + { + "success": False, + "error": "no_source", + "message": "Recorded CivitAI version has no download URL", + }, + status=400, + ) + expected_sha256 = ( + (((file_info or {}).get("hashes") or {}).get("SHA256") or "").lower() + or None + ) + + try: + new_sha256 = await self._download_and_replace( + download_url, file_path, expected_sha256=expected_sha256 + ) + except WorkflowRestoreDownloadError as exc: + return web.json_response( + { + "success": False, + "error": "download_failed", + "message": str(exc), + }, + status=502, + ) + + document = await asyncio.to_thread(load_workflow_file, file_path) + if document is None: + # Defensive: the temp file was validated before the replace, so + # this can only fail on a race with an external writer. + return web.json_response( + { + "success": False, + "error": "not_a_workflow", + "message": "Restored file is not a ComfyUI workflow", + }, + status=422, + ) + + analysis = analyze_workflow(document) + await self._refresh_metadata_after_write(file_path, analysis, new_sha256) + return web.json_response( + { + "success": True, + "file_path": file_path, + "restored": "downloaded", + "sha256": new_sha256, + } + ) + + @staticmethod + def _find_downloaded_file_info( + version_info: Dict[str, Any], file_path: str + ) -> Optional[Dict[str, Any]]: + """Match the stored version's file entry to the local artifact.""" + + files = [f for f in version_info.get("files") or [] if isinstance(f, dict)] + if not files: + return None + basename = os.path.basename(file_path) + for file_info in files: + if file_info.get("name") == basename: + return file_info + return files[0] if len(files) == 1 else None + + async def _download_and_replace( + self, + download_url: str, + file_path: str, + *, + expected_sha256: Optional[str] = None, + ) -> str: + """Download *download_url* and atomically replace *file_path*. + + The download lands in a temp file next to the target and is only + swapped in after it parses as a workflow and (when known) matches the + recorded SHA256. Returns the downloaded file's SHA256. + """ + + api_key = (self._settings.get("civitai_api_key", "") or "").strip() + headers = {"Authorization": f"Bearer {api_key}"} if api_key else {} + timeout = aiohttp.ClientTimeout(total=600) + + fd, temp_path = tempfile.mkstemp( + dir=os.path.dirname(file_path), suffix=".download" + ) + os.close(fd) + try: + async with aiohttp.ClientSession(headers=headers, timeout=timeout) as session: + async with session.get(download_url) as response: + if response.status != 200: + raise WorkflowRestoreDownloadError( + f"Download failed with HTTP {response.status}" + ) + written = 0 + with open(temp_path, "wb") as handle: + async for chunk in response.content.iter_chunked(1 << 20): + written += len(chunk) + if written > MAX_WORKFLOW_JSON_BYTES: + raise WorkflowRestoreDownloadError( + "Downloaded file exceeds the workflow size limit" + ) + handle.write(chunk) + + if load_workflow_file(temp_path) is None: + raise WorkflowRestoreDownloadError( + "Downloaded file is not a ComfyUI workflow" + ) + + new_sha256 = await calculate_sha256(temp_path) + if expected_sha256 and new_sha256.lower() != expected_sha256: + raise WorkflowRestoreDownloadError( + "Downloaded file does not match the recorded SHA256" + ) + + await asyncio.to_thread(os.replace, temp_path, file_path) + return new_sha256 + except WorkflowRestoreDownloadError: + try: + os.unlink(temp_path) + except OSError: + pass + raise + except Exception as exc: + try: + os.unlink(temp_path) + except OSError: + pass + raise WorkflowRestoreDownloadError(str(exc)) from exc diff --git a/py/services/download_manager.py b/py/services/download_manager.py index 26b3def0..5506fbfd 100644 --- a/py/services/download_manager.py +++ b/py/services/download_manager.py @@ -22,6 +22,7 @@ from ..utils.models import ( CheckpointMetadata, EmbeddingMetadata, OtherModelMetadata, + WorkflowMetadata, ) from ..utils.constants import ( CARD_PREVIEW_WIDTH, @@ -32,6 +33,7 @@ from ..utils.constants import ( SUPPORTED_MEDIA_EXTENSIONS, VALID_LORA_TYPES, VALID_OTHER_CIVITAI_TYPES, + WORKFLOW_CIVITAI_TYPES, ) from ..utils.civitai_utils import normalize_civitai_download_url, rewrite_preview_url from ..utils.paid_access import ( @@ -109,6 +111,18 @@ def _other_models_disabled_response() -> Dict[str, Any]: } +def _workflows_disabled_response() -> Dict[str, Any]: + """Structured rejection when Workflow management is turned off.""" + return { + "success": False, + "error": ( + "Workflow management is disabled. Enable it in " + "Settings > Library before downloading workflow files." + ), + "reason": "workflows_disabled", + } + + @dataclass class _PathSlot: lock: asyncio.Lock = field(default_factory=asyncio.Lock) @@ -400,6 +414,8 @@ class DownloadManager: return await ServiceRegistry.get_embedding_scanner() if model_type == "other": return await ServiceRegistry.get_other_scanner() + if model_type == "workflow": + return await ServiceRegistry.get_workflow_scanner() if model_type == "lora": return await self._get_lora_scanner() raise ValueError(f'Unknown model type "{model_type}"') @@ -486,6 +502,37 @@ class DownloadManager: return file_info + @staticmethod + def _select_workflow_download_file( + files: Any, + ) -> Optional[Dict[str, Any]]: + """Pick the workflow artifact within a workflow version's file list. + + Workflow versions ship no weight files, so the generic + primary/weights selection finds nothing. The ranking mirrors + CivitAI's own default pick for Workflow resources (a single-workflow + Config .json first, then an Archive .zip, then an image carrying an + embedded workflow), with CivitAI's primary flag breaking ties. + """ + + def rank(file_info: Dict[str, Any]) -> int: + name = str(file_info.get("name") or "").lower() + if name.endswith(".json"): + return 0 + if name.endswith(".zip"): + return 1 + if name.endswith((".png", ".webp")): + return 2 + return 3 + + candidates = [f for f in files or [] if isinstance(f, dict)] + if not candidates: + return None + candidates.sort( + key=lambda f: (not bool(f.get("primary")), rank(f), f.get("id") or 0) + ) + return candidates[0] + async def _find_local_file_entry( self, model_type: str, @@ -1196,6 +1243,8 @@ class DownloadManager: return EmbeddingMetadata.from_civitai_info(version_info, file_info, save_path) if model_type == "other": return OtherModelMetadata.from_civitai_info(version_info, file_info, save_path) + if model_type == "workflow": + return WorkflowMetadata.from_civitai_info(version_info, file_info, save_path) return LoraMetadata.from_civitai_info(version_info, file_info, save_path) def _resolve_save_path_from_persisted_record(self, record: Dict[str, Any]) -> Optional[str]: @@ -1708,6 +1757,17 @@ class DownloadManager: "error": "Model version already exists in other library", } + # Check workflow scanner (opt-in feature) + if get_settings_manager().is_workflows_enabled(): + workflow_scanner = await ServiceRegistry.get_workflow_scanner() + if await workflow_scanner.check_model_version_exists( + model_version_id + ): + return { + "success": False, + "error": "Model version already exists in workflow library", + } + # Use CivArchive provider directly when source is 'civarchive' # This prioritizes CivArchive metadata (with mirror availability info) over Civitai if source == "civarchive": @@ -1823,6 +1883,10 @@ class DownloadManager: if not get_settings_manager().is_other_models_enabled(): return _other_models_disabled_response() model_type = "other" + elif model_type_from_info in WORKFLOW_CIVITAI_TYPES: + if not get_settings_manager().is_workflows_enabled(): + return _workflows_disabled_response() + model_type = "workflow" else: return { "success": False, @@ -2002,6 +2066,13 @@ class DownloadManager: "success": False, "error": "Model version already exists in other library", } + elif model_type == "workflow": + workflow_scanner = await ServiceRegistry.get_workflow_scanner() + if await workflow_scanner.check_model_version_exists(version_id): + return { + "success": False, + "error": "Model version already exists in workflow library", + } # Handle use_default_paths if use_default_paths: @@ -2103,6 +2174,20 @@ class DownloadManager: "reason": reason, } save_dir = default_path + elif model_type == "workflow": + # Workflows have no default-root setting: the first + # configured workflow root is the download target. + workflow_scanner = await ServiceRegistry.get_workflow_scanner() + workflow_roots = workflow_scanner.get_model_roots() + if not workflow_roots: + return { + "success": False, + "error": ( + "No workflow folder configured. Add one in " + "Settings > Library before downloading workflows." + ), + } + save_dir = workflow_roots[0] # Calculate relative path using template relative_path = self._calculate_relative_path(version_info, model_type) @@ -2194,6 +2279,14 @@ class DownloadManager: ) # Fallback to primary file if no match found + if not file_info and model_type == "workflow": + file_info = self._select_workflow_download_file(files) + if file_info: + logger.debug( + "[download] Workflow file selected: id=%s, name=%s", + file_info.get("id"), file_info.get("name"), + ) + if not file_info: logger.debug("[download] Looking for primary file as fallback") # Prefer a weights-type file CivitAI marked primary; then any @@ -2335,6 +2428,11 @@ class DownloadManager: version_info, file_info, save_path ) logger.info(f"Creating OtherModelMetadata for {file_name}") + elif model_type == "workflow": + metadata = WorkflowMetadata.from_civitai_info( + version_info, file_info, save_path + ) + logger.info(f"Creating WorkflowMetadata for {file_name}") else: return { "success": False, @@ -2553,6 +2651,8 @@ class DownloadManager: scanner = await ServiceRegistry.get_embedding_scanner() elif model_type == "other": scanner = await ServiceRegistry.get_other_scanner() + elif model_type == "workflow": + scanner = await ServiceRegistry.get_workflow_scanner() except Exception as exc: logger.debug("Failed to acquire scanner for %s models: %s", model_type, exc) @@ -3023,7 +3123,11 @@ class DownloadManager: # 4. Handle archive extraction and prepare per-file metadata actual_file_paths = [save_path] - if zipfile.is_zipfile(save_path): + # Workflow downloads never extract archives: the zip IS the + # artifact, kept byte-identical so its SHA256 stays the CivitAI + # identity; the workflow document is materialized into a derived + # sidecar by the scanner instead. + if model_type != "workflow" and zipfile.is_zipfile(save_path): supported_extensions = self._get_supported_extensions_for_type( model_type ) @@ -3087,6 +3191,9 @@ class DownloadManager: elif model_type == "other": scanner = await ServiceRegistry.get_other_scanner() logger.info(f"Updating other-model cache for {actual_file_paths[0]}") + elif model_type == "workflow": + scanner = await ServiceRegistry.get_workflow_scanner() + logger.info(f"Updating workflow cache for {actual_file_paths[0]}") adjust_cached_entry = ( getattr(scanner, "adjust_cached_entry", None) diff --git a/py/services/first_run_manager.py b/py/services/first_run_manager.py index 6a189f6c..47d72f62 100644 --- a/py/services/first_run_manager.py +++ b/py/services/first_run_manager.py @@ -162,13 +162,16 @@ class FirstRunManager: "checkpoints": ServiceRegistry.get_checkpoint_scanner, "embeddings": ServiceRegistry.get_embedding_scanner, "other": ServiceRegistry.get_other_scanner, + "workflows": ServiceRegistry.get_workflow_scanner, } def _active_scanner_getters(self) -> Dict[str, Callable[[], Awaitable[Any]]]: - """Drop the opt-in other scanner while Other Models is disabled.""" + """Drop the opt-in scanners while their features are disabled.""" getters = self._scanner_getters() if "other" in getters and not self._settings.is_other_models_enabled(): getters.pop("other") + if "workflows" in getters and not self._settings.is_workflows_enabled(): + getters.pop("workflows") return getters # ------------------------------------------------------------------ diff --git a/py/services/model_lifecycle_service.py b/py/services/model_lifecycle_service.py index b6a3fb4c..e170fb24 100644 --- a/py/services/model_lifecycle_service.py +++ b/py/services/model_lifecycle_service.py @@ -14,6 +14,7 @@ from ..services.pending_delete_service import get_pending_delete_service from ..utils.constants import PREVIEW_EXTENSIONS from ..utils.metadata_manager import MetadataManager from ..utils.sidecar_paths import get_metadata_path, get_preview_dir, get_sidecar_dir +from ..utils.workflow_extraction import WORKFLOW_DOCUMENT_SUFFIX logger = logging.getLogger(__name__) @@ -55,20 +56,28 @@ async def delete_model_artifacts( model_path = os.path.join(target_dir, main_file) sidecar_dir = get_sidecar_dir(model_path) patterns = [os.path.basename(get_metadata_path(model_path))] + # Derived workflow document (workflow artifacts only; absent elsewhere). + patterns.append(f"{file_name}{WORKFLOW_DOCUMENT_SUFFIX}") for ext in PREVIEW_EXTENSIONS: patterns.append(f"{file_name}{ext}") deleted: List[str] = [] main_path = model_path.replace(os.sep, "/") + deleted_paths: set[str] = set() if os.path.exists(main_path): os.remove(main_path) deleted.append(main_path) + deleted_paths.add(os.path.normcase(os.path.abspath(main_path))) else: logger.warning("Model file not found: %s", main_file) for pattern in patterns: path = os.path.join(sidecar_dir, pattern) + # The model file can double as its own preview (workflow image + # artifacts); never delete the same path twice. + if os.path.normcase(os.path.abspath(path)) in deleted_paths: + continue if os.path.exists(path): try: os.remove(path) @@ -467,14 +476,24 @@ class ModelLifecycleService: (target_dir, f"{old_file_name}{old_extension}"), (sidecar_dir, metadata_filename), (sidecar_dir, f"{metadata_filename}.bak"), + # Derived workflow document (workflow artifacts only). + (sidecar_dir, f"{old_file_name}{WORKFLOW_DOCUMENT_SUFFIX}"), ] for ext in PREVIEW_EXTENSIONS: patterns.append((sidecar_dir, f"{old_file_name}{ext}")) existing_files: List[tuple[str, str]] = [] + seen_paths: set[str] = set() for pattern_dir, pattern in patterns: path = os.path.join(pattern_dir, pattern) + # An image workflow artifact doubles as its own preview: the same + # path then appears under both the main-file and preview patterns + # and must only be renamed once. + dedupe_key = os.path.normcase(os.path.abspath(path)) + if dedupe_key in seen_paths: + continue if os.path.exists(path): + seen_paths.add(dedupe_key) existing_files.append((path, pattern)) metadata_path = get_metadata_path(file_path) @@ -585,6 +604,7 @@ class ModelLifecycleService: known_suffixes = [ ".metadata.json.bak", ".metadata.json", + WORKFLOW_DOCUMENT_SUFFIX, ".safetensors", *PREVIEW_EXTENSIONS, ] diff --git a/py/services/model_scanner.py b/py/services/model_scanner.py index d4a09394..857535eb 100644 --- a/py/services/model_scanner.py +++ b/py/services/model_scanner.py @@ -101,6 +101,7 @@ PAGE_TYPE_MAP = { 'checkpoint': 'checkpoints', 'embedding': 'embeddings', 'other': 'other', + 'workflow': 'workflows', } # Case-insensitive cache matching is a Windows-only safety net (NTFS treats @@ -629,6 +630,7 @@ def _walk_root_for_reconcile( expected_folder_of: Callable[[str], str], walk_path: Optional[str] = None, unreachable: Optional[_UnreachablePaths] = None, + filename_filter: Optional[Callable[[str], bool]] = None, ) -> _RootWalkResult: """Walk one model root and classify every model file found. @@ -711,6 +713,8 @@ def _walk_root_for_reconcile( ext = os.path.splitext(file)[1].lower() if ext not in file_extensions: continue + if filename_filter is not None and not filename_filter(file): + continue result.files_seen += 1 files_since_report += 1 @@ -1211,6 +1215,20 @@ class ModelScanner: if hash_status: entry['hash_status'] = hash_status + # Workflow analysis fields (workflows only): copied through whenever + # the source carries them so the cache and API expose the parsed graph + # summary; other model types never define these keys. + for key in ( + 'workflow_format', + 'node_count', + 'node_classes', + 'model_refs', + 'civitai_refs', + ): + value = get_value(key, None) + if value is not None: + entry[key] = value + return entry def _ensure_license_flags(self, entry: Dict[str, Any]) -> None: @@ -1689,6 +1707,8 @@ class ModelScanner: ext = os.path.splitext(entry.name)[1].lower() if ext not in self.file_extensions: continue + if not self._is_indexable_filename(entry.name): + continue real_file_path = os.path.realpath(entry.path) if real_file_path in seen_real_files: continue @@ -1849,7 +1869,10 @@ class ModelScanner: # If force refresh is requested, initialize the cache directly if force_refresh: - if rebuild_cache: + # A reconcile diffs against the existing cache; when there is no + # cache yet (e.g. a scan fired while background initialization is + # still deferred), a full initialization is the only option. + if rebuild_cache or self._cache is None: self._last_reconcile_summary = None await self._initialize_cache() else: @@ -2700,6 +2723,7 @@ class ModelScanner: report_progress=report_progress, expected_folder_of=expected_folder_of, unreachable=unreachable, + filename_filter=self._is_indexable_filename, ) finally: tracker.finish_root(root_path) @@ -3417,6 +3441,15 @@ class ModelScanner: """Hook for subclasses: adjust metadata during scanning""" return metadata + def _is_indexable_filename(self, filename: str) -> bool: + """Hook for subclasses: whether a matching-extension file is indexable. + + Scanners whose extension set collides with sidecar formats (e.g. the + workflow scanner's ``.json`` vs ``.metadata.json``) override this to + keep sidecars out of the library walk. + """ + return True + def adjust_cached_entry(self, entry: Dict[str, Any]) -> Dict[str, Any]: """Hook for subclasses: adjust entries loaded from the persisted cache.""" return entry diff --git a/py/services/model_service_factory.py b/py/services/model_service_factory.py index 61cc2182..00cc2700 100644 --- a/py/services/model_service_factory.py +++ b/py/services/model_service_factory.py @@ -123,10 +123,12 @@ def register_default_model_types(): from ..services.checkpoint_service import CheckpointService from ..services.embedding_service import EmbeddingService from ..services.other_model_service import OtherModelService + from ..services.workflow_service import WorkflowService from ..routes.lora_routes import LoraRoutes from ..routes.checkpoint_routes import CheckpointRoutes from ..routes.embedding_routes import EmbeddingRoutes from ..routes.other_routes import OtherRoutes + from ..routes.workflow_routes import WorkflowRoutes # Register LoRA model type ModelServiceFactory.register_model_type('lora', LoraService, LoraRoutes) @@ -138,4 +140,7 @@ def register_default_model_types(): ModelServiceFactory.register_model_type('embedding', EmbeddingService, EmbeddingRoutes) # Register Other model type (VAE, upscaler, text encoder, ...) - ModelServiceFactory.register_model_type('other', OtherModelService, OtherRoutes) \ No newline at end of file + ModelServiceFactory.register_model_type('other', OtherModelService, OtherRoutes) + + # Register Workflow model type (ComfyUI workflow JSON; opt-in feature) + ModelServiceFactory.register_model_type('workflow', WorkflowService, WorkflowRoutes) \ No newline at end of file diff --git a/py/services/pending_delete_service.py b/py/services/pending_delete_service.py index 38b77376..b9c914b8 100644 --- a/py/services/pending_delete_service.py +++ b/py/services/pending_delete_service.py @@ -39,6 +39,7 @@ from typing import ( from ..utils.constants import PREVIEW_EXTENSIONS from ..utils.sidecar_paths import get_metadata_path, get_sidecar_dir +from ..utils.workflow_extraction import WORKFLOW_DOCUMENT_SUFFIX from ..utils import settings_paths logger = logging.getLogger(__name__) @@ -706,12 +707,20 @@ class PendingDeleteService: # alongside mode, the centralized mirror otherwise). sidecar_dir = get_sidecar_dir(model_path) patterns = [os.path.basename(get_metadata_path(model_path))] + # Derived workflow document (workflow artifacts only; absent elsewhere). + patterns.append(f"{file_name}{WORKFLOW_DOCUMENT_SUFFIX}") for ext in PREVIEW_EXTENSIONS: patterns.append(f"{file_name}{ext}") + seen = {os.path.normcase(main_path)} for pattern in patterns: path = os.path.abspath(os.path.join(sidecar_dir, pattern)) + # An image workflow artifact doubles as its own preview: it then + # matches both the main file and a preview pattern — stage it once. + if os.path.normcase(path) in seen: + continue if os.path.exists(path): + seen.add(os.path.normcase(path)) artifacts.append(path) return artifacts diff --git a/py/services/persistent_model_cache.py b/py/services/persistent_model_cache.py index c980d422..17a492b3 100644 --- a/py/services/persistent_model_cache.py +++ b/py/services/persistent_model_cache.py @@ -47,6 +47,30 @@ class PersistedCacheData: DEFAULT_LICENSE_FLAGS = 127 # 127 (0b1111111) encodes default CivitAI permissions with all commercial modes enabled. +def _json_list_or_none(value: Any) -> Optional[str]: + """Encode a list field as JSON for storage; keep None as NULL.""" + + if value is None: + return None + if isinstance(value, str): + return value + return json.dumps(value) + + +def _json_list_from_row(value: Any) -> List[Any]: + """Decode a JSON list column back into a list (empty on bad data).""" + + if not value: + return [] + if isinstance(value, list): + return value + try: + decoded = json.loads(value) + except (json.JSONDecodeError, TypeError): + return [] + return decoded if isinstance(decoded, list) else [] + + class PersistentModelCache: """Persist core model metadata and hash index data in SQLite.""" @@ -88,6 +112,11 @@ class PersistentModelCache: "hf_url", "source_model_id", "source_version_id", + "workflow_format", + "node_count", + "node_classes", + "model_refs", + "civitai_refs", ) _MODEL_UPDATE_COLUMNS: Tuple[str, ...] = _MODEL_COLUMNS[2:] _instances: Dict[str, "PersistentModelCache"] = {} @@ -237,6 +266,12 @@ class PersistentModelCache: "source_model_id": row["source_model_id"] or "", "source_version_id": row["source_version_id"] or "", } + if model_type == "workflow": + item["workflow_format"] = row["workflow_format"] or "" + item["node_count"] = row["node_count"] or 0 + item["node_classes"] = _json_list_from_row(row["node_classes"]) + item["model_refs"] = _json_list_from_row(row["model_refs"]) + item["civitai_refs"] = _json_list_from_row(row["civitai_refs"]) # Legacy rows only carry `hf_url`; derive the canonical pair so # every consumer sees the same shape. normalize_metadata_source(item) @@ -661,6 +696,11 @@ class PersistentModelCache: hf_url TEXT DEFAULT '', source_model_id TEXT DEFAULT '', source_version_id TEXT DEFAULT '', + workflow_format TEXT DEFAULT '', + node_count INTEGER DEFAULT 0, + node_classes TEXT, + model_refs TEXT, + civitai_refs TEXT, PRIMARY KEY (model_type, file_path) ); @@ -734,6 +774,12 @@ class PersistentModelCache: "source_version_id": "TEXT DEFAULT ''", "autov3": "TEXT", "quantization": "TEXT", + # Workflow-specific analysis fields (JSON lists for the *_refs classes). + "workflow_format": "TEXT DEFAULT ''", + "node_count": "INTEGER DEFAULT 0", + "node_classes": "TEXT", + "model_refs": "TEXT", + "civitai_refs": "TEXT", } for column, definition in required_columns.items(): @@ -831,6 +877,11 @@ class PersistentModelCache: item.get("hf_url") or "", item.get("source_model_id") or "", item.get("source_version_id") or "", + item.get("workflow_format") or "", + int(item.get("node_count") or 0), + _json_list_or_none(item.get("node_classes")), + _json_list_or_none(item.get("model_refs")), + _json_list_or_none(item.get("civitai_refs")), ) def _insert_model_sql(self) -> str: diff --git a/py/services/service_registry.py b/py/services/service_registry.py index 99b9e997..b86649c9 100644 --- a/py/services/service_registry.py +++ b/py/services/service_registry.py @@ -356,6 +356,27 @@ class ServiceRegistry: logger.debug(f"Created and registered {service_name}") return scanner + @classmethod + async def get_workflow_scanner(cls): + """Get or create Workflow scanner instance""" + service_name = "workflow_scanner" + + if service_name in cls._services: + return cls._services[service_name] + + async with cls._get_lock(service_name): + # Double-check after acquiring lock + if service_name in cls._services: + return cls._services[service_name] + + # Import here to avoid circular imports + from .workflow_scanner import WorkflowScanner + + scanner = await WorkflowScanner.get_instance() + cls._services[service_name] = scanner + logger.debug(f"Created and registered {service_name}") + return scanner + @classmethod def clear_services(cls): """Clear all registered services - mainly for testing""" diff --git a/py/services/settings_manager.py b/py/services/settings_manager.py index feaa5c6d..e305fc5a 100644 --- a/py/services/settings_manager.py +++ b/py/services/settings_manager.py @@ -130,6 +130,8 @@ DEFAULT_SETTINGS: Dict[str, Any] = { # for download until the user turns the feature on. "enable_other_models": False, "enabled_other_sub_types": list(DEFAULT_ENABLED_OTHER_SUB_TYPES), + # Workflow management is likewise opt-in (ComfyUI workflow JSON library). + "enable_workflows": False, "recipes_path": "", "sidecar_storage_mode": "alongside", "sidecar_storage_path": "", @@ -823,6 +825,40 @@ class SettingsManager: """Return True when the opt-in Other Models management is enabled.""" return bool(self.settings.get("enable_other_models", False)) + def is_workflows_enabled(self) -> bool: + """Return True when the opt-in Workflow management is enabled.""" + return bool(self.settings.get("enable_workflows", False)) + + def get_workflow_folder_paths(self) -> List[str]: + """Workflow roots configured for the active library (normalized).""" + folder_paths = self.settings.get("folder_paths", {}) + if not isinstance(folder_paths, Mapping): + return [] + normalized = self._normalize_folder_paths( + {"workflows": folder_paths.get("workflows", [])} + ) + return normalized.get("workflows", []) + + def set_workflow_folder_paths(self, paths: Any) -> List[str]: + """Replace the active library's workflow roots and apply them live. + + Unlike the core folder_paths keys (host-owned in plugin mode, applied + on restart in standalone), workflow roots are LoRA-Manager-only in + both modes, so they merge into the stored folder_paths map and take + effect immediately via ``_apply_workflow_settings_change``. + """ + normalized = self._normalize_folder_paths({"workflows": paths}).get( + "workflows", [] + ) + folder_paths = dict(self.settings.get("folder_paths") or {}) + if normalized: + folder_paths["workflows"] = normalized + else: + folder_paths.pop("workflows", None) + self.set("folder_paths", folder_paths) + self._apply_workflow_settings_change() + return normalized + def get_enabled_other_sub_types(self) -> List[str]: """Return the enabled other-model sub_types (empty when the feature is off).""" if not self.is_other_models_enabled(): @@ -855,6 +891,28 @@ class SettingsManager: except Exception as exc: # pragma: no cover - defensive logging logger.debug("Failed to refresh other scanner after settings change: %s", exc) + def _apply_workflow_settings_change(self) -> None: + """Rebuild workflow roots and refresh the workflow scanner after a toggle.""" + try: + from ..config import config # Local import to avoid circular dependency + + config.refresh_workflow_roots() + except Exception as exc: # pragma: no cover - defensive logging + logger.debug("Failed to refresh workflow roots: %s", exc) + + try: + from .service_registry import ServiceRegistry # pyright: ignore[reportImportCycles] + + scanner = ServiceRegistry.get_service_sync("workflow_scanner") + if scanner is not None and hasattr(scanner, "on_library_changed"): + # reconcile=True lets the scanner pick up newly enabled roots and + # purge rows for folders that are no longer managed. + scanner.on_library_changed(reconcile=True) + except Exception as exc: # pragma: no cover - defensive logging + logger.debug( + "Failed to refresh workflow scanner after settings change: %s", exc + ) + def _has_configured_paths(self, folder_paths: Any) -> bool: if not isinstance(folder_paths, Mapping): return False @@ -2040,6 +2098,8 @@ class SettingsManager: value = normalize_other_sub_types(value) elif key == "enable_other_models": value = bool(value) + elif key == "enable_workflows": + value = bool(value) elif key == "recipes_path": current_recipes_dir = self._get_effective_recipes_dir() value = self._normalize_recipes_path_value(value) @@ -2086,6 +2146,8 @@ class SettingsManager: self._refresh_sidecar_storage_config() if key in ("enable_other_models", "enabled_other_sub_types"): self._apply_other_model_settings_change() + if key == "enable_workflows": + self._apply_workflow_settings_change() if portable_switch_pending: self._finalize_portable_switch() diff --git a/py/services/workflow_link_registry.py b/py/services/workflow_link_registry.py new file mode 100644 index 00000000..3e22bb52 --- /dev/null +++ b/py/services/workflow_link_registry.py @@ -0,0 +1,124 @@ +"""In-memory registry of LM-linked workflows currently open in ComfyUI tabs. + +The ComfyUI-side extension reports the active graph's provenance marker +(``extra.lm_source``: file path, document hash, dirty flag) whenever it +changes — load, tab switch, first edit, successful write-back. The LM web UI +consumes this to enable/disable the card context menu's "Update from +ComfyUI" entry, and to route the write-back request to the ComfyUI tab that +actually holds the workflow. + +State is per ComfyUI client (browser tab, identified by its websocket sid) +and lives only in memory: a restarted server simply starts empty, and stale +entries are pruned against the live socket set on read. +""" + +from __future__ import annotations + +import asyncio +import logging +import time +import uuid +from typing import Any, Dict, List, Optional + +logger = logging.getLogger(__name__) + + +class WorkflowLinkRegistry: + """Per-client state of LM-managed workflows open in ComfyUI.""" + + _instance: Optional["WorkflowLinkRegistry"] = None + _instance_lock: Optional[asyncio.Lock] = None + + def __init__(self) -> None: + # sid -> {"file_path", "sha256", "dirty", "name", "reported_at"} + self._states: Dict[str, Dict[str, Any]] = {} + # request_id -> Future resolved by the collect-result endpoint + self._collect_futures: Dict[str, asyncio.Future] = {} + self._lock = asyncio.Lock() + + @classmethod + async def get_instance(cls) -> "WorkflowLinkRegistry": + if cls._instance is None: + if cls._instance_lock is None: + cls._instance_lock = asyncio.Lock() + async with cls._instance_lock: + if cls._instance is None: + cls._instance = WorkflowLinkRegistry() + return cls._instance + + @classmethod + def reset_instance(cls) -> None: + """Drop the singleton (test isolation).""" + cls._instance = None + + async def report_state( + self, sid: str, state: Optional[Dict[str, Any]] + ) -> None: + """Store (or clear, when ``state`` is None) a client's link state.""" + async with self._lock: + if state is None: + self._states.pop(sid, None) + return + self._states[sid] = { + "file_path": state.get("file_path"), + "sha256": state.get("sha256"), + "dirty": bool(state.get("dirty")), + "name": state.get("name") or "", + "reported_at": time.time(), + } + + async def get_states( + self, active_sids: Optional[set] = None + ) -> List[Dict[str, Any]]: + """Return all known link states, pruning disconnected clients.""" + async with self._lock: + if active_sids is not None: + for sid in list(self._states): + if sid not in active_sids: + del self._states[sid] + return [ + {"client_id": sid, **state} + for sid, state in self._states.items() + ] + + async def find_client_for( + self, file_path: str, active_sids: Optional[set] = None + ) -> Optional[str]: + """Sid of a client holding *file_path*; dirty holders win.""" + states = await self.get_states(active_sids) + fallback: Optional[str] = None + for state in states: + if state.get("file_path") != file_path: + continue + if state.get("dirty"): + return state["client_id"] + fallback = fallback or state["client_id"] + return fallback + + def begin_collect(self) -> tuple[str, "asyncio.Future"]: + """Create a pending collect request; the id rides the WS message.""" + request_id = uuid.uuid4().hex + loop = asyncio.get_running_loop() + future = loop.create_future() + self._collect_futures[request_id] = future + return request_id, future + + async def resolve_collect( + self, request_id: str, result: Dict[str, Any] + ) -> bool: + """Resolve a pending collect request. False when unknown/expired.""" + future = self._collect_futures.pop(request_id, None) + if future is None or future.done(): + return False + future.set_result(result) + return True + + async def await_collect( + self, request_id: str, future: "asyncio.Future", timeout: float + ) -> Dict[str, Any]: + """Await a collect result; on timeout return a synthetic error.""" + try: + return await asyncio.wait_for(future, timeout=timeout) + except asyncio.TimeoutError: + self._collect_futures.pop(request_id, None) + return {"success": False, "error": "timeout"} diff --git a/py/services/workflow_scanner.py b/py/services/workflow_scanner.py new file mode 100644 index 00000000..349a8f5b --- /dev/null +++ b/py/services/workflow_scanner.py @@ -0,0 +1,177 @@ +"""Scanner for ComfyUI workflow resources (.json documents and containers).""" + +from __future__ import annotations + +import logging +import os +from datetime import datetime +from typing import List, Optional + +from ..config import config +from ..utils.file_utils import ( + calculate_sha256, + find_preview_file, + normalize_path, +) +from ..utils.metadata_manager import MetadataManager +from ..utils.models import WorkflowMetadata +from ..utils.sidecar_paths import get_preview_dir +from ..utils.workflow_analysis import analyze_workflow_file +from ..utils.workflow_extraction import ( + IMAGE_CONTAINER_EXTENSIONS, + WORKFLOW_ARTIFACT_EXTENSIONS, + WORKFLOW_DOCUMENT_SUFFIX, + materialize_workflow_document, +) +from .model_hash_index import ModelHashIndex +from .model_scanner import ModelScanner + +logger = logging.getLogger(__name__) + +# Sidecar files share the .json extension; they must never enter the library. +_SIDECAR_SUFFIXES = (".metadata.json", WORKFLOW_DOCUMENT_SUFFIX) + + +class WorkflowScanner(ModelScanner): + """Scan and manage ComfyUI workflow artifacts. + + Library entries are the original uploaded files, kept byte-identical so + their SHA256 stays the CivitAI identity (by-hash lookup and version + tracking depend on it). ``.json`` artifacts carry the graph directly; + ``.zip``/``.png``/``.webp`` containers get the workflow document + extracted into a derived ``.workflow.json`` sidecar that every consumer + (graph analysis, send-to-ComfyUI) reads. Files from which no workflow + document can be extracted never enter the library — this keeps settings + JSON and plain preview images out. + """ + + def __init__(self): + super().__init__( + model_type="workflow", + model_class=WorkflowMetadata, + file_extensions=set(WORKFLOW_ARTIFACT_EXTENSIONS), + hash_index=ModelHashIndex(), + ) + + def _is_indexable_filename(self, filename: str) -> bool: + lowered = filename.lower() + return not lowered.endswith(_SIDECAR_SUFFIXES) + + def get_model_roots(self) -> List[str]: + """Workflow roots (primary + extra), empty while the feature is off.""" + try: + from .settings_manager import get_settings_manager + + if not get_settings_manager().is_workflows_enabled(): + return [] + except Exception: # pragma: no cover - defensive; settings unavailable + return [] + roots: List[str] = [] + roots.extend(config.workflows_roots or []) + roots.extend(config.extra_workflows_roots or []) + seen: set[str] = set() + unique_roots: List[str] = [] + for root in roots: + if root and root not in seen: + seen.add(root) + unique_roots.append(root) + return unique_roots + + @staticmethod + def _is_image_artifact(file_path: str) -> bool: + return os.path.splitext(file_path)[1].lower() in IMAGE_CONTAINER_EXTENSIONS + + def adjust_metadata(self, metadata, file_path, root_path): + """Fill workflow analysis fields when they are missing. + + Runs on every scan and on the post-download path. The extraction + result is cached in the derived ``.workflow.json`` sidecar, so the + steady-state cost is one small JSON parse per entry whose analysis + fields have not been populated yet. + """ + if not isinstance(metadata, WorkflowMetadata) or metadata.workflow_format: + return metadata + try: + document_path = materialize_workflow_document(file_path) + analysis = ( + analyze_workflow_file(document_path) if document_path else None + ) + except Exception as exc: + logger.debug( + "Workflow analysis refresh failed for %s: %s", file_path, exc + ) + return metadata + if analysis is None: + return metadata + metadata.workflow_format = analysis.workflow_format + metadata.node_count = analysis.node_count + metadata.node_classes = analysis.node_classes + metadata.model_refs = analysis.model_refs + metadata.civitai_refs = analysis.civitai_refs + return metadata + + async def _create_default_metadata( + self, file_path: str + ) -> Optional[WorkflowMetadata]: + """Create metadata by hashing the artifact and analyzing its workflow. + + Returns None for files that carry no ComfyUI workflow document, so + they stay out of the library. + """ + try: + real_path = os.path.realpath(file_path) + if not os.path.exists(real_path): + logger.error(f"File not found: {file_path}") + return None + + document_path = materialize_workflow_document( + file_path, read_path=real_path + ) + analysis = ( + analyze_workflow_file(document_path) if document_path else None + ) + if analysis is None: + logger.debug(f"Skipping artifact without a workflow: {file_path}") + return None + + base_name = os.path.splitext(os.path.basename(file_path))[0] + preview_url = find_preview_file(base_name, get_preview_dir(file_path)) + if not preview_url and self._is_image_artifact(file_path): + # An image artifact doubles as its own preview. + preview_url = file_path + sha256 = await calculate_sha256(real_path) + if not sha256: + logger.warning( + f"Skipping metadata creation for empty workflow file: {file_path}" + ) + return None + + metadata = WorkflowMetadata( + file_name=base_name, + model_name=base_name, + file_path=normalize_path(file_path), + size=os.path.getsize(real_path), + modified=datetime.now().timestamp(), + sha256=sha256, + base_model="Unknown", + preview_url=normalize_path(preview_url), + tags=[], + modelDescription="", + from_civitai=False, + workflow_format=analysis.workflow_format, + node_count=analysis.node_count, + node_classes=analysis.node_classes, + model_refs=analysis.model_refs, + civitai_refs=analysis.civitai_refs, + ) + + logger.info(f"Creating workflow metadata for {file_path}") + await MetadataManager.save_metadata(file_path, metadata) + + return metadata + + except Exception as e: + logger.error( + f"Error creating default workflow metadata for {file_path}: {e}" + ) + return None diff --git a/py/services/workflow_service.py b/py/services/workflow_service.py new file mode 100644 index 00000000..20ad2919 --- /dev/null +++ b/py/services/workflow_service.py @@ -0,0 +1,84 @@ +import os +import logging +from typing import Any, Dict, Optional + +from .base_model_service import BaseModelService +from .auto_tag_service import extract_auto_tags +from ..utils.models import WorkflowMetadata +from ..config import config + +logger = logging.getLogger(__name__) + + +class WorkflowService(BaseModelService): + """Workflow-specific service implementation (ComfyUI workflow JSON).""" + + def __init__(self, scanner, update_service=None): + """Initialize Workflow service + + Args: + scanner: Workflow scanner instance + update_service: Optional service for remote update tracking. + """ + super().__init__( + "workflow", scanner, WorkflowMetadata, update_service=update_service + ) + + async def format_response(self, model_data: Dict[str, Any]) -> Optional[Dict[str, Any]]: + """Format workflow data for API response. + + Returns None when the entry is missing critical fields (corrupted cache + row), so the handler layer can filter it out. See issue #730. + """ + file_path = model_data.get("file_path") + if not file_path or not isinstance(file_path, str): + logger.warning( + "Skipping corrupted workflow entry (missing file_path): %s", + model_data.get("file_name", ""), + ) + return None + + file_name = model_data.get("file_name") or "" + model_name = model_data.get("model_name") or file_name + folder = model_data.get("folder") or "" + + return { + "model_name": model_name, + "file_name": file_name, + "preview_url": config.get_preview_static_url(model_data.get("preview_url", "")), + "preview_nsfw_level": model_data.get("preview_nsfw_level", 0), + "base_model": model_data.get("base_model", ""), + "folder": folder, + "sha256": model_data.get("sha256", ""), + "file_path": file_path.replace(os.sep, "/"), + "file_size": model_data.get("size", 0), + "modified": model_data.get("modified", ""), + "tags": model_data.get("tags", []), + "from_civitai": model_data.get("from_civitai", True), + "notes": model_data.get("notes", ""), + "sub_type": "workflow", + "favorite": model_data.get("favorite", False), + "exclude": bool(model_data.get("exclude", False)), + "update_available": bool(model_data.get("update_available", False)), + "skip_metadata_refresh": bool(model_data.get("skip_metadata_refresh", False)), + "civitai": self.filter_civitai_data(model_data.get("civitai", {}), minimal=True), + "auto_tags": model_data.get("auto_tags") or extract_auto_tags(model_data), + "version_count": model_data.get("version_count"), + "source_platform": model_data.get("source_platform", ""), + "source_url": model_data.get("source_url", ""), + "source_model_id": model_data.get("source_model_id", ""), + "source_version_id": model_data.get("source_version_id", ""), + "workflow_format": model_data.get("workflow_format", ""), + "node_count": model_data.get("node_count", 0), + "node_classes": model_data.get("node_classes", []), + "model_refs": model_data.get("model_refs", []), + "civitai_refs": model_data.get("civitai_refs", []), + } + + def find_duplicate_hashes(self) -> Dict[str, Any]: + """Find workflows with duplicate SHA256 hashes""" + return self.scanner._hash_index.get_duplicate_hashes() + + def find_duplicate_filenames(self) -> Dict[str, Any]: + """Find workflows with conflicting filenames""" + return self.scanner._hash_index.get_duplicate_filenames() diff --git a/py/utils/constants.py b/py/utils/constants.py index dcaaa61d..d5046a7c 100644 --- a/py/utils/constants.py +++ b/py/utils/constants.py @@ -152,6 +152,9 @@ def folder_path_schema() -> List[Dict[str, Any]]: {"key": key, "category": "core", "sub_type": None} for key in CORE_FOLDER_PATH_KEYS ] + # Workflow roots are LoRA-Manager-only (no ComfyUI folder category); the + # standalone Model Paths UI gates this editor on ``enable_workflows``. + schema.append({"key": "workflows", "category": "workflow", "sub_type": None}) schema.extend( {"key": folder_key, "category": "other", "sub_type": sub_type} for folder_key, sub_type in OTHER_MODEL_FOLDER_SUBTYPES.items() @@ -187,6 +190,9 @@ VALID_OTHER_CIVITAI_TYPES = { "controlnet", "other", } +# CivitAI model.type values that map onto the workflow library (lowercased). +# ComfyWorkflows is retired on CivitAI but grandfathered models still carry it. +WORKFLOW_CIVITAI_TYPES = frozenset({"workflows", "comfyworkflows"}) # CivitAI model.type -> internal sub_type for the "other" model page. CIVITAI_TYPE_TO_OTHER_SUB_TYPE = { "vae": "vae", diff --git a/py/utils/directory_browser.py b/py/utils/directory_browser.py index 4f3b5008..9232fae3 100644 --- a/py/utils/directory_browser.py +++ b/py/utils/directory_browser.py @@ -43,7 +43,11 @@ def browse_directory(directory_path: str) -> Tuple[Dict[str, Any], int]: if not directory_path: path = Path.home() else: - path = Path(directory_path).expanduser().resolve() + # Business-path convention: normalize lexically with abspath but + # never resolve symlinks (no resolve()/realpath). The picker result + # is stored as a configured library path, and stored paths must + # match what the user sees on disk. + path = Path(os.path.abspath(os.path.expanduser(directory_path))) # Access check: browsing intentionally covers the whole server # filesystem (the server operator browses their own machine). On diff --git a/py/utils/exif_utils.py b/py/utils/exif_utils.py index c88de9b4..24b237a8 100644 --- a/py/utils/exif_utils.py +++ b/py/utils/exif_utils.py @@ -161,6 +161,16 @@ class ExifUtils: return value return str(value) + @staticmethod + def load_structured_metadata(image_path: str) -> dict[str, Optional[str]]: + """Public wrapper for the structured-metadata reader. + + Returns a dict with ``parameters``/``prompt``/``workflow``/``comment`` + keys (values may be None). May raise on unreadable images; callers + that treat metadata as optional should catch exceptions. + """ + return ExifUtils._load_structured_metadata(image_path) + @staticmethod def _load_structured_metadata(image_path: str) -> dict[str, Optional[str]]: metadata: dict[str, Optional[str]] = { diff --git a/py/utils/models.py b/py/utils/models.py index 84df530b..c911b4d7 100644 --- a/py/utils/models.py +++ b/py/utils/models.py @@ -488,3 +488,58 @@ class EmbeddingMetadata(BaseModelMetadata): # Direct read: the downloaded file IS file_info, no SHA256 matching. autov3=normalize_autov3((file_info.get("hashes") or {}).get("AutoV3")), ) + + +@dataclass +class WorkflowMetadata(BaseModelMetadata): + """Represents the metadata structure for a ComfyUI workflow resource. + + Workflows are JSON graph documents (CivitAI model type ``Workflows`` / + retired ``ComfyWorkflows``), managed like any other model: dedicated roots, + sidecar metadata, previews, and version tracking. The workflow-specific + fields are populated by ``py.utils.workflow_analysis`` during scanning. + """ + + sub_type: str = "workflow" + workflow_format: str = "" # "ui" | "api"; empty until analyzed + node_count: int = 0 + node_classes: List[str] = field(default_factory=list) + model_refs: List[str] = field(default_factory=list) + civitai_refs: List[str] = field(default_factory=list) + + @classmethod + def from_civitai_info( + cls, version_info: Dict[str, Any], file_info: Dict[str, Any], save_path: str + ) -> "WorkflowMetadata": + """Create WorkflowMetadata instance from Civitai version info""" + file_name = file_info.get("name", "") + # Workflow artifacts are .json/.zip/.png/... — none of them weight + # extensions — so strip one real extension instead of consulting the + # weight-extension allowlist. + base_name = os.path.splitext(file_name)[0] + base_model = determine_base_model(version_info.get("baseModel", "")) + sha256_value = (file_info.get("hashes") or {}).get("SHA256", "").lower() + + tags = [] + description = "" + model_data = version_info.get("model") or {} + if "tags" in model_data: + tags = model_data["tags"] + if "description" in model_data: + description = model_data["description"] + + return cls( + file_name=base_name, + model_name=model_data.get("name", base_name), + file_path=save_path.replace(os.sep, "/"), + size=file_info.get("sizeKB", 0) * 1024, + modified=datetime.now().timestamp(), + sha256=sha256_value, + base_model=base_model, + preview_url="", # Will be updated after preview download + preview_nsfw_level=0, + from_civitai=True, + civitai=version_info, + tags=tags, + modelDescription=description, + ) diff --git a/py/utils/sidecar_paths.py b/py/utils/sidecar_paths.py index c2310e1a..981bfb05 100644 --- a/py/utils/sidecar_paths.py +++ b/py/utils/sidecar_paths.py @@ -205,10 +205,12 @@ def _iter_model_roots() -> List[str]: "base_models_roots", "embeddings_roots", "other_roots", + "workflows_roots", "extra_loras_roots", "extra_checkpoints_roots", "extra_unet_roots", "extra_embeddings_roots", + "extra_workflows_roots", ): value = getattr(config, attr, None) if value: diff --git a/py/utils/workflow_analysis.py b/py/utils/workflow_analysis.py new file mode 100644 index 00000000..71505b19 --- /dev/null +++ b/py/utils/workflow_analysis.py @@ -0,0 +1,189 @@ +"""ComfyUI workflow JSON sniffing and analysis. + +Shared by the workflow scanner (library indexing) and, eventually, the recipe +parsers: both need to recognize ComfyUI workflow documents and extract the +models and node classes they reference. + +Two on-disk shapes exist: + +- UI format (``File > Save`` in ComfyUI): ``{"nodes": [...], "links": [...], ...}`` +- API format (queue prompt payload): ``{"": {"class_type": ..., "inputs": {...}}}`` +""" + +from __future__ import annotations + +import json +import logging +import re +from dataclasses import dataclass, field +from typing import Any, Dict, List, Optional, Set + +from .constants import MODEL_FILE_EXTENSIONS + +logger = logging.getLogger(__name__) + +WORKFLOW_FORMAT_UI = "ui" +WORKFLOW_FORMAT_API = "api" + +# Workflows are small JSON documents; anything larger is almost certainly not +# a graph (or is pathological) and is not worth parsing during a scan. +MAX_WORKFLOW_JSON_BYTES = 64 * 1024 * 1024 + +_CIVITAI_URN_PATTERN = re.compile(r"civitai:(\d+)@(\d+)") + +# Loader input keys whose string values name a model file. Used for the API +# format; the UI format is handled by the generic extension scan below. +_LOADER_INPUT_KEYS = frozenset( + { + "lora_name", + "ckpt_name", + "unet_name", + "vae_name", + "clip_name", + "control_net_name", + "embedding_name", + "model_name", + } +) + + +@dataclass +class WorkflowAnalysis: + """Structured facts extracted from a ComfyUI workflow document.""" + + workflow_format: str + node_count: int = 0 + node_classes: List[str] = field(default_factory=list) + model_refs: List[str] = field(default_factory=list) + civitai_refs: List[str] = field(default_factory=list) + + +def _sniff(data: Any) -> Optional[str]: + """Return the workflow format for a parsed JSON document, or None.""" + if not isinstance(data, dict): + return None + nodes = data.get("nodes") + links = data.get("links") + if isinstance(nodes, list) and nodes and isinstance(links, list): + return WORKFLOW_FORMAT_UI + # API format: a non-empty mapping of node id -> {class_type, inputs}. + if data and all( + isinstance(value, dict) and "class_type" in value for value in data.values() + ): + return WORKFLOW_FORMAT_API + return None + + +def sniff_workflow_text(text: str) -> Optional[str]: + """Sniff raw JSON text; returns the workflow format or None.""" + try: + data = json.loads(text) + except (TypeError, ValueError): + return None + return _sniff(data) + + +def parse_workflow_text(text: str) -> Optional[Dict[str, Any]]: + """Parse + sniff raw JSON text; return the document when it is a workflow.""" + try: + data = json.loads(text) + except (TypeError, ValueError): + return None + if _sniff(data) is None: + return None + return data + + +def load_workflow_file(file_path: str) -> Optional[Dict[str, Any]]: + """Load and sniff a workflow JSON file. + + Returns the parsed document when it is a recognized ComfyUI workflow, + None otherwise (unreadable, oversized, invalid JSON, or not a workflow). + """ + try: + with open(file_path, "r", encoding="utf-8") as handle: + text = handle.read(MAX_WORKFLOW_JSON_BYTES + 1) + except (OSError, UnicodeDecodeError) as exc: + logger.debug("Workflow file unreadable: %s (%s)", file_path, exc) + return None + if len(text) > MAX_WORKFLOW_JSON_BYTES: + return None + try: + data = json.loads(text) + except ValueError: + return None + if _sniff(data) is None: + return None + return data + + +def _walk_strings(value: Any, out: List[str], depth: int = 0) -> None: + """Collect every string scalar in a JSON structure (bounded depth).""" + if depth > 12 or len(out) > 10000: + return + if isinstance(value, str): + out.append(value) + elif isinstance(value, dict): + for item in value.values(): + _walk_strings(item, out, depth + 1) + elif isinstance(value, (list, tuple)): + for item in value: + _walk_strings(item, out, depth + 1) + + +def analyze_workflow(data: Dict[str, Any]) -> Optional[WorkflowAnalysis]: + """Analyze a parsed workflow document. None when not a workflow.""" + workflow_format = _sniff(data) + if workflow_format is None: + return None + + node_classes: Set[str] = set() + node_count = 0 + + if workflow_format == WORKFLOW_FORMAT_API: + node_count = len(data) + for node in data.values(): + class_type = node.get("class_type") + if isinstance(class_type, str) and class_type: + node_classes.add(class_type) + else: + nodes = data.get("nodes") or [] + node_count = len(nodes) + for node in nodes: + if not isinstance(node, dict): + continue + class_type = node.get("type") + if isinstance(class_type, str) and class_type: + node_classes.add(class_type) + + strings: List[str] = [] + _walk_strings(data, strings) + + model_refs: Set[str] = set() + civitai_refs: Set[str] = set() + for value in strings: + for match in _CIVITAI_URN_PATTERN.finditer(value): + civitai_refs.add(f"civitai:{match.group(1)}@{match.group(2)}") + lowered = value.lower() + if any(lowered.endswith(ext) for ext in MODEL_FILE_EXTENSIONS): + # Widget values are single model filenames; skip strings that + # clearly carry more (URLs, prompts with punctuation-heavy tails + # still end in an extension, so also bound the length). + if len(value) <= 260 and " " not in value.strip(): + model_refs.add(value.strip()) + + return WorkflowAnalysis( + workflow_format=workflow_format, + node_count=node_count, + node_classes=sorted(node_classes), + model_refs=sorted(model_refs), + civitai_refs=sorted(civitai_refs), + ) + + +def analyze_workflow_file(file_path: str) -> Optional[WorkflowAnalysis]: + """Load + analyze a workflow file; None when it is not a workflow.""" + data = load_workflow_file(file_path) + if data is None: + return None + return analyze_workflow(data) diff --git a/py/utils/workflow_extraction.py b/py/utils/workflow_extraction.py new file mode 100644 index 00000000..90ad9f36 --- /dev/null +++ b/py/utils/workflow_extraction.py @@ -0,0 +1,202 @@ +"""Extraction of the ComfyUI workflow document from a library artifact. + +The workflow library keeps the original uploaded file byte-identical — its +SHA256 is the identity CivitAI hashed (by-hash lookup and version tracking +depend on it). Consumers (send-to-ComfyUI, graph analysis) work on the +extracted workflow document instead: + +- ``.json`` artifacts ARE the document; they are validated and read in place. +- ``.zip`` / ``.png`` / ``.webp`` containers get the document materialized + once into an LM-owned derived sidecar ``.workflow.json`` inside the + artifact's sidecar directory. Scanners exclude the suffix from the library + walk; lifecycle operations (move/rename/delete) carry it like any other + sidecar. +""" + +from __future__ import annotations + +import json +import logging +import os +import zipfile +from typing import Any, Dict, List, Optional + +from .sidecar_paths import get_sidecar_dir +from .workflow_analysis import ( + MAX_WORKFLOW_JSON_BYTES, + load_workflow_file, + parse_workflow_text, +) + +logger = logging.getLogger(__name__) + +WORKFLOW_DOCUMENT_SUFFIX = ".workflow.json" + +# Image containers whose metadata chunks can embed a ComfyUI workflow. +IMAGE_CONTAINER_EXTENSIONS = frozenset({".png", ".webp"}) + +# Every file type the workflow library accepts. +WORKFLOW_ARTIFACT_EXTENSIONS = frozenset({".json", ".zip"} | IMAGE_CONTAINER_EXTENSIONS) + +# Bounds for zip exploration: workflow archives are user uploads with no +# structural contract, so candidate discovery is capped rather than exhaustive. +_MAX_ZIP_JSON_CANDIDATES = 64 + + +def get_workflow_document_path(artifact_path: str) -> str: + """Return the path of the extracted workflow document for an artifact. + + ``.json`` artifacts are their own document; containers map to the + derived ``.workflow.json`` in the artifact's sidecar directory + (alongside the artifact or in the centralized mirror). + """ + + if os.path.splitext(artifact_path)[1].lower() == ".json": + return artifact_path + base_name = os.path.splitext(os.path.basename(artifact_path))[0] + return os.path.join( + get_sidecar_dir(artifact_path), base_name + WORKFLOW_DOCUMENT_SUFFIX + ) + + +def _zip_json_candidates(archive: zipfile.ZipFile) -> List[zipfile.ZipInfo]: + """Return the archive's plausible workflow documents, best first.""" + + candidates: List[zipfile.ZipInfo] = [] + for info in archive.infolist(): + if info.is_dir(): + continue + parts = info.filename.replace("\\", "/").split("/") + # Skip macOS resource forks and hidden files/directories. + if any(part == "__MACOSX" or part.startswith(".") for part in parts): + continue + if not parts[-1].lower().endswith(".json"): + continue + if info.file_size > MAX_WORKFLOW_JSON_BYTES: + continue + candidates.append(info) + if len(candidates) >= _MAX_ZIP_JSON_CANDIDATES: + break + # Prefer shallow, small documents: the workflow is typically the + # archive's headline content, not a bundled config deep in a subfolder. + candidates.sort(key=lambda info: (len(info.filename.split("/")), info.file_size)) + return candidates + + +def _extract_from_zip(archive_path: str) -> Optional[Dict[str, Any]]: + try: + with zipfile.ZipFile(archive_path, "r") as archive: + for info in _zip_json_candidates(archive): + try: + with archive.open(info) as handle: + raw = handle.read(MAX_WORKFLOW_JSON_BYTES + 1) + text = raw.decode("utf-8") + except (OSError, UnicodeDecodeError, zipfile.BadZipFile): + continue + document = parse_workflow_text(text) + if document is not None: + return document + except (OSError, zipfile.BadZipFile) as exc: + logger.debug("Workflow archive unreadable: %s (%s)", archive_path, exc) + return None + + +def _extract_from_image(image_path: str) -> Optional[Dict[str, Any]]: + # Local import: PIL/piexif are heavy and only needed for image artifacts. + from .exif_utils import ExifUtils + + try: + metadata = ExifUtils.load_structured_metadata(image_path) + except Exception as exc: + logger.debug("Workflow image metadata unreadable: %s (%s)", image_path, exc) + return None + # The UI-format document ("workflow") is what ComfyUI's loadGraphData + # consumes; fall back to the API-format "prompt" payload. + for key in ("workflow", "prompt"): + text = metadata.get(key) + if not text: + continue + document = parse_workflow_text(text) + if document is not None: + return document + return None + + +def extract_workflow_document(artifact_path: str) -> Optional[Dict[str, Any]]: + """Extract the ComfyUI workflow document from an artifact. + + Returns the parsed document when the artifact carries a recognizable + workflow, ``None`` otherwise (unreadable file, unknown extension, no + workflow inside). Never raises. + """ + + extension = os.path.splitext(artifact_path)[1].lower() + try: + if extension == ".json": + return load_workflow_file(artifact_path) + if extension == ".zip": + return _extract_from_zip(artifact_path) + if extension in IMAGE_CONTAINER_EXTENSIONS: + return _extract_from_image(artifact_path) + except Exception as exc: # defensive: extraction must never break a scan + logger.debug("Workflow extraction failed for %s: %s", artifact_path, exc) + return None + + +def materialize_workflow_document( + artifact_path: str, *, read_path: Optional[str] = None +) -> Optional[str]: + """Ensure the extracted workflow document exists on disk. + + Returns the document path, or ``None`` when the artifact carries no + recognizable workflow. ``.json`` artifacts are their own document (the + path is returned after validation; nothing is written). Containers get + the document written to the derived sidecar path; an up-to-date derived + file is reused without re-extracting. + + ``read_path`` overrides the path the artifact bytes are read from (the + scanner hashes/extracts via the real path while sidecar locations derive + from the business path). + """ + + read_path = read_path or artifact_path + + if os.path.splitext(artifact_path)[1].lower() == ".json": + return artifact_path if load_workflow_file(read_path) is not None else None + + document_path = get_workflow_document_path(artifact_path) + try: + if os.path.exists(document_path) and os.path.getmtime( + document_path + ) >= os.path.getmtime(read_path): + return document_path + except OSError: + pass + + document = extract_workflow_document(read_path) + if document is None: + return None + + try: + os.makedirs(os.path.dirname(document_path), exist_ok=True) + with open(document_path, "w", encoding="utf-8") as handle: + json.dump(document, handle, ensure_ascii=False) + except OSError as exc: + logger.warning( + "Failed to write workflow document %s: %s", document_path, exc + ) + return None + return document_path + + +def load_artifact_workflow_document(artifact_path: str) -> Optional[Dict[str, Any]]: + """Load the workflow document for a library artifact. + + Reads the derived sidecar for containers (materializing it on demand + when missing or stale) and the artifact itself for bare JSON. + """ + + document_path = materialize_workflow_document(artifact_path) + if document_path is None: + return None + return load_workflow_file(document_path) diff --git a/static/js/api/apiConfig.js b/static/js/api/apiConfig.js index 5e57a808..d4f1c4f7 100644 --- a/static/js/api/apiConfig.js +++ b/static/js/api/apiConfig.js @@ -10,7 +10,8 @@ export const MODEL_TYPES = { LORA: 'loras', CHECKPOINT: 'checkpoints', EMBEDDING: 'embeddings', - OTHER: 'other' + OTHER: 'other', + WORKFLOW: 'workflows' }; // Base API configuration for each model type @@ -54,6 +55,16 @@ export const MODEL_CONFIG = { supportsMove: true, supportsFolderManagement: true, templateName: 'other.html' + }, + [MODEL_TYPES.WORKFLOW]: { + displayName: 'Workflow', + singularName: 'workflow', + defaultPageSize: 100, + supportsLetterFilter: false, + supportsBulkOperations: true, + supportsMove: true, + supportsFolderManagement: true, + templateName: 'workflows.html' } }; @@ -168,6 +179,14 @@ export const MODEL_SPECIFIC_ENDPOINTS = { [MODEL_TYPES.OTHER]: { metadata: `/api/lm/${MODEL_TYPES.OTHER}/metadata`, roots_by_subtype: `/api/lm/${MODEL_TYPES.OTHER}/roots_by_subtype`, + }, + [MODEL_TYPES.WORKFLOW]: { + metadata: `/api/lm/${MODEL_TYPES.WORKFLOW}/metadata`, + sendToComfy: `/api/lm/${MODEL_TYPES.WORKFLOW}/send-to-comfy`, + content: `/api/lm/${MODEL_TYPES.WORKFLOW}/content`, + comfyuiState: `/api/lm/${MODEL_TYPES.WORKFLOW}/comfyui-state`, + updateFromComfy: `/api/lm/${MODEL_TYPES.WORKFLOW}/update-from-comfy`, + restore: `/api/lm/${MODEL_TYPES.WORKFLOW}/restore`, } }; diff --git a/static/js/api/modelApiFactory.js b/static/js/api/modelApiFactory.js index c5ef1469..497aad42 100644 --- a/static/js/api/modelApiFactory.js +++ b/static/js/api/modelApiFactory.js @@ -2,6 +2,7 @@ import { LoraApiClient } from './loraApi.js'; import { CheckpointApiClient } from './checkpointApi.js'; import { EmbeddingApiClient } from './embeddingApi.js'; import { OtherApiClient } from './otherApi.js'; +import { WorkflowApiClient } from './workflowApi.js'; import { MODEL_TYPES, isValidModelType } from './apiConfig.js'; import { state } from '../state/index.js'; @@ -15,6 +16,8 @@ export function createModelApiClient(modelType) { return new EmbeddingApiClient(MODEL_TYPES.EMBEDDING); case MODEL_TYPES.OTHER: return new OtherApiClient(MODEL_TYPES.OTHER); + case MODEL_TYPES.WORKFLOW: + return new WorkflowApiClient(MODEL_TYPES.WORKFLOW); default: throw new Error(`Unsupported model type: ${modelType}`); } diff --git a/static/js/api/workflowApi.js b/static/js/api/workflowApi.js new file mode 100644 index 00000000..af6a3f54 --- /dev/null +++ b/static/js/api/workflowApi.js @@ -0,0 +1,93 @@ +import { BaseModelApiClient } from './baseModelApi.js'; + +/** + * Workflow-specific API client (ComfyUI workflow JSON resources) + */ +export class WorkflowApiClient extends BaseModelApiClient { + /** + * Push a library workflow into the running ComfyUI graph. + * POST /api/lm/workflows/send-to-comfy { file_path } + */ + async sendToComfy(filePath) { + const response = await fetch(this.apiConfig.endpoints.specific.sendToComfy, { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ file_path: filePath }), + }); + const data = await response.json().catch(() => ({})); + if (!response.ok || data.success === false) { + throw new Error(data.error || data.message || `HTTP ${response.status}`); + } + return data; + } + + /** + * Fetch the extracted workflow document for a library entry. + * GET /api/lm/workflows/content?file_path=... (works in standalone mode). + * @returns {Promise} The workflow JSON document. + */ + async fetchWorkflowContent(filePath) { + const url = `${this.apiConfig.endpoints.specific.content}?file_path=${encodeURIComponent(filePath)}`; + const response = await fetch(url); + const data = await response.json().catch(() => ({})); + if (!response.ok || data.success === false) { + throw new Error(data.error || data.message || `HTTP ${response.status}`); + } + return data.workflow; + } + + /** + * List LM-managed workflows currently open in live ComfyUI tabs. + * GET /api/lm/workflows/comfyui-state + * @returns {Promise} [{client_id, file_path, sha256, dirty}, ...] + */ + async fetchComfyuiState() { + const response = await fetch(this.apiConfig.endpoints.specific.comfyuiState); + const data = await response.json().catch(() => ({})); + if (!response.ok || data.success === false) { + throw new Error(data.error || data.message || `HTTP ${response.status}`); + } + return data.states || []; + } + + /** + * Ask the ComfyUI tab holding this workflow to write its graph back. + * POST /api/lm/workflows/update-from-comfy { file_path } + * The request resolves with the write-back outcome; `error` carries the + * failure kind ('not_open', 'no_changes', 'cancelled', 'timeout', ...). + */ + async updateFromComfy(filePath) { + const response = await fetch(this.apiConfig.endpoints.specific.updateFromComfy, { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ file_path: filePath }), + }); + const data = await response.json().catch(() => ({})); + if (!response.ok || data.success === false) { + const error = new Error(data.message || data.error || `HTTP ${response.status}`); + error.kind = data.error || 'unknown'; + throw error; + } + return data; + } + + /** + * Restore a workflow to its downloaded state, discarding local edits. + * POST /api/lm/workflows/restore { file_path } + * `error` carries the failure kind ('no_source', 'download_failed', ...). + */ + async restore(filePath) { + const response = await fetch(this.apiConfig.endpoints.specific.restore, { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ file_path: filePath }), + }); + const data = await response.json().catch(() => ({})); + if (!response.ok || data.success === false) { + const error = new Error(data.message || data.error || `HTTP ${response.status}`); + error.kind = data.error || 'unknown'; + throw error; + } + return data; + } +} diff --git a/static/js/components/ContextMenu/ModelContextMenuMixin.js b/static/js/components/ContextMenu/ModelContextMenuMixin.js index 5f3c5397..2a29f67c 100644 --- a/static/js/components/ContextMenu/ModelContextMenuMixin.js +++ b/static/js/components/ContextMenu/ModelContextMenuMixin.js @@ -115,7 +115,8 @@ export const ModelContextMenuMixin = { lora: 'loras', checkpoint: 'checkpoints', embedding: 'embeddings', - other: 'other' + other: 'other', + workflow: 'workflows' }; return prefixMap[this.modelType] || 'loras'; }, diff --git a/static/js/components/ContextMenu/WorkflowContextMenu.js b/static/js/components/ContextMenu/WorkflowContextMenu.js new file mode 100644 index 00000000..6bce4680 --- /dev/null +++ b/static/js/components/ContextMenu/WorkflowContextMenu.js @@ -0,0 +1,148 @@ +import { BaseContextMenu } from './BaseContextMenu.js'; +import { ModelContextMenuMixin } from './ModelContextMenuMixin.js'; +import { getModelApiClient, resetAndReload } from '../../api/modelApiFactory.js'; +import { moveManager } from '../../managers/MoveManager.js'; +import { showDeleteModal, showExcludeModal } from '../../utils/modalUtils.js'; +import { copyWorkflowToClipboard, restoreWorkflow, sendWorkflowToComfy, updateWorkflowFromComfy } from '../../utils/workflowActions.js'; +import { state } from '../../state/index.js'; + +export class WorkflowContextMenu extends BaseContextMenu { + constructor() { + super('workflowContextMenu', '.model-card'); + this.nsfwSelector = document.getElementById('nsfwLevelSelector'); + this.modelType = 'workflows'; + this.resetAndReload = resetAndReload; + + this.initNSFWSelector(); + } + + // Implementation needed by the mixin + async saveModelMetadata(filePath, data) { + return getModelApiClient().saveModelMetadata(filePath, data); + } + + showMenu(x, y, card) { + super.showMenu(x, y, card); + this.updateExcludeMenuItem(); + // Standalone has no running ComfyUI to push a workflow into; the + // copy-to-clipboard action covers that mode instead. + const sendItem = this.menu?.querySelector('[data-action="send-to-comfy"]'); + const updateItem = this.menu?.querySelector('[data-action="update-from-comfy"]'); + const standalone = state?.global?.settings?.standalone_mode; + if (sendItem) { + sendItem.style.display = standalone ? 'none' : ''; + } + if (updateItem) { + if (standalone) { + updateItem.style.display = 'none'; + } else { + updateItem.style.display = ''; + this._refreshUpdateFromComfyItem(card, updateItem); + } + } + const restoreItem = this.menu?.querySelector('[data-action="restore-download"]'); + if (restoreItem) { + restoreItem.classList.toggle('disabled', !this._isRestorable(card)); + } + } + + /** + * Restore is available for container artifacts (re-extracted locally from + * the pristine archive) and for CivitAI-sourced .json artifacts + * (re-downloaded from the recorded version). Local-only .json files have + * no restore source; when the item is not in the loaded window we stay + * enabled and let the backend report "no_source". + */ + _isRestorable(card) { + const filePath = card?.dataset?.filepath; + if (!filePath) return false; + if (!filePath.toLowerCase().endsWith('.json')) return true; + const item = state.virtualScroller?.items?.find((entry) => entry.file_path === filePath); + return item ? !!item.from_civitai : true; + } + + /** + * Enable "Update from ComfyUI" only when this workflow is the active + * graph in a connected ComfyUI tab and carries unsaved edits. The state + * is pushed by the ComfyUI-side extension; the item starts disabled and + * flips when the answer arrives while the menu is still open. + */ + async _refreshUpdateFromComfyItem(card, item) { + item.classList.add('disabled'); + const filePath = card?.dataset?.filepath; + if (!filePath) return; + try { + const states = await getModelApiClient().fetchComfyuiState(); + // Menu may have been closed/re-opened for another card meanwhile. + if (this.currentCard !== card) return; + const linked = states.some( + (entry) => entry.file_path === filePath && entry.dirty + ); + item.classList.toggle('disabled', !linked); + } catch (_error) { + // State endpoint unavailable (older backend): keep disabled. + } + } + + handleMenuAction(action) { + // First try to handle with common actions + if (ModelContextMenuMixin.handleCommonMenuActions.call(this, action)) { + return; + } + + const apiClient = getModelApiClient(); + + // Otherwise handle workflow-specific actions + switch(action) { + case 'details': + // Show workflow details + this.currentCard.click(); + break; + case 'send-to-comfy': + sendWorkflowToComfy(this.currentCard.dataset.filepath); + break; + case 'update-from-comfy': + updateWorkflowFromComfy(this.currentCard.dataset.filepath); + break; + case 'copy-workflow': + copyWorkflowToClipboard(this.currentCard.dataset.filepath); + break; + case 'restore-download': + restoreWorkflow(this.currentCard.dataset.filepath); + break; + case 'replace-preview': + // Add new action for replacing preview images + apiClient.replaceModelPreview(this.currentCard.dataset.filepath); + break; + case 'delete': + showDeleteModal(this.currentCard.dataset.filepath); + break; + case 'copyname': + // Copy workflow name + if (this.currentCard.querySelector('.fa-copy')) { + this.currentCard.querySelector('.fa-copy').click(); + } + break; + case 'refresh-metadata': + // Refresh metadata from CivitAI + apiClient.refreshSingleModelMetadata(this.currentCard.dataset.filepath); + break; + case 'move': + moveManager.showMoveModal(this.currentCard.dataset.filepath); + break; + case 'exclude': + showExcludeModal(this.currentCard.dataset.filepath); + break; + case 'restore': + this.restoreExcludedModel(this.currentCard.dataset.filepath); + break; + } + } + + async sendToComfy(filePath) { + await sendWorkflowToComfy(filePath); + } +} + +// Mix in shared methods +Object.assign(WorkflowContextMenu.prototype, ModelContextMenuMixin); diff --git a/static/js/components/ContextMenu/index.js b/static/js/components/ContextMenu/index.js index a629cd4e..474331b5 100644 --- a/static/js/components/ContextMenu/index.js +++ b/static/js/components/ContextMenu/index.js @@ -3,6 +3,7 @@ export { RecipeContextMenu } from './RecipeContextMenu.js'; export { CheckpointContextMenu } from './CheckpointContextMenu.js'; export { EmbeddingContextMenu } from './EmbeddingContextMenu.js'; export { OtherContextMenu } from './OtherContextMenu.js'; +export { WorkflowContextMenu } from './WorkflowContextMenu.js'; export { GlobalContextMenu } from './GlobalContextMenu.js'; export { ModelContextMenuMixin } from './ModelContextMenuMixin.js'; @@ -11,6 +12,7 @@ import { RecipeContextMenu } from './RecipeContextMenu.js'; import { CheckpointContextMenu } from './CheckpointContextMenu.js'; import { EmbeddingContextMenu } from './EmbeddingContextMenu.js'; import { OtherContextMenu } from './OtherContextMenu.js'; +import { WorkflowContextMenu } from './WorkflowContextMenu.js'; import { GlobalContextMenu } from './GlobalContextMenu.js'; // Factory method to create page-specific context menu instances @@ -26,6 +28,8 @@ export function createPageContextMenu(pageType) { return new EmbeddingContextMenu(); case 'other': return new OtherContextMenu(); + case 'workflows': + return new WorkflowContextMenu(); default: return null; } diff --git a/static/js/components/Header.js b/static/js/components/Header.js index af702313..ecd2b691 100644 --- a/static/js/components/Header.js +++ b/static/js/components/Header.js @@ -33,6 +33,7 @@ export class HeaderManager { if (path.includes('/checkpoints')) return 'checkpoints'; if (path.includes('/embeddings')) return 'embeddings'; if (path.includes('/other')) return 'other'; + if (path.includes('/workflows')) return 'workflows'; if (path.includes('/statistics')) return 'statistics'; if (path.includes('/loras')) return 'loras'; return 'unknown'; diff --git a/static/js/components/SidebarManager.js b/static/js/components/SidebarManager.js index 60d58904..c244762a 100644 --- a/static/js/components/SidebarManager.js +++ b/static/js/components/SidebarManager.js @@ -3563,7 +3563,7 @@ export class SidebarManager { _migrateOldSettings() { if (getStorageItem('_sidebar_migration_done')) return; - const PAGES = ['loras', 'recipes', 'checkpoints', 'embeddings', 'other']; + const PAGES = ['loras', 'recipes', 'checkpoints', 'embeddings', 'other', 'workflows']; // 1. Migrate global hide setting to per-page if (state?.global?.settings?.show_folder_sidebar === false) { diff --git a/static/js/components/controls/WorkflowControls.js b/static/js/components/controls/WorkflowControls.js new file mode 100644 index 00000000..6e4515bd --- /dev/null +++ b/static/js/components/controls/WorkflowControls.js @@ -0,0 +1,62 @@ +// WorkflowControls.js - Specific implementation for the Workflows page +import { PageControls } from './PageControls.js'; +import { getModelApiClient, resetAndReload } from '../../api/modelApiFactory.js'; +import { showToast } from '../../utils/uiHelpers.js'; +import { downloadManager } from '../../managers/DownloadManager.js'; + +/** + * WorkflowControls class - Extends PageControls for the Workflows page + * (ComfyUI workflow JSON resources) + */ +export class WorkflowControls extends PageControls { + constructor() { + // Initialize with 'workflows' page type + super('workflows'); + + // Register API methods specific to the Workflows page + this.registerWorkflowAPI(); + } + + /** + * Register workflow-specific API methods + */ + registerWorkflowAPI() { + const workflowAPI = { + // Core API functions + loadMoreModels: async (resetPage = false, updateFolders = false) => { + return await getModelApiClient().loadMoreWithVirtualScroll(resetPage, updateFolders); + }, + + resetAndReload: async (updateFolders = false) => { + return await resetAndReload(updateFolders); + }, + + // Add fetch from Civitai functionality for workflows + fetchFromCivitai: async () => { + return await getModelApiClient().fetchCivitaiMetadata(); + }, + + // Add show download modal functionality + showDownloadModal: () => { + downloadManager.showDownloadModal(); + }, + + toggleBulkMode: () => { + if (window.bulkManager) { + window.bulkManager.toggleBulkMode(); + } else { + console.error('Bulk manager not available'); + } + }, + + // No clearCustomFilter implementation is needed for workflows + // as custom filters are currently only used for LoRAs + clearCustomFilter: async () => { + showToast('toast.filters.noCustomFilterToClear', {}, 'info'); + } + }; + + // Register the API + this.registerAPI(workflowAPI); + } +} diff --git a/static/js/components/controls/index.js b/static/js/components/controls/index.js index 5d1dcaa6..4ff8585e 100644 --- a/static/js/components/controls/index.js +++ b/static/js/components/controls/index.js @@ -4,13 +4,14 @@ import { LorasControls } from './LorasControls.js'; import { CheckpointsControls } from './CheckpointsControls.js'; import { EmbeddingsControls } from './EmbeddingsControls.js'; import { OtherControls } from './OtherControls.js'; +import { WorkflowControls } from './WorkflowControls.js'; // Export the classes -export { PageControls, LorasControls, CheckpointsControls, EmbeddingsControls, OtherControls }; +export { PageControls, LorasControls, CheckpointsControls, EmbeddingsControls, OtherControls, WorkflowControls }; /** * Factory function to create the appropriate controls based on page type - * @param {string} pageType - The type of page ('loras', 'checkpoints', 'embeddings', or 'other') + * @param {string} pageType - The type of page ('loras', 'checkpoints', 'embeddings', 'other', or 'workflows') * @returns {PageControls} - The appropriate controls instance */ export function createPageControls(pageType) { @@ -22,6 +23,8 @@ export function createPageControls(pageType) { return new EmbeddingsControls(); } else if (pageType === 'other') { return new OtherControls(); + } else if (pageType === 'workflows') { + return new WorkflowControls(); } else { console.error(`Unknown page type: ${pageType}`); return null; diff --git a/static/js/components/first_run.js b/static/js/components/first_run.js index 10a296c3..949368cf 100644 --- a/static/js/components/first_run.js +++ b/static/js/components/first_run.js @@ -10,7 +10,7 @@ import { setStorageItem } from '../utils/storageHelpers.js'; import { state } from '../state/index.js'; import { escapeHtml } from './shared/utils.js'; -const LIBRARY_ORDER = ['loras', 'checkpoints', 'embeddings', 'other']; +const LIBRARY_ORDER = ['loras', 'checkpoints', 'embeddings', 'other', 'workflows']; class FirstRunManager { constructor() { diff --git a/static/js/components/initialization.js b/static/js/components/initialization.js index 0f696772..2c9c0803 100644 --- a/static/js/components/initialization.js +++ b/static/js/components/initialization.js @@ -79,6 +79,8 @@ class InitializationManager { this.pageType = 'checkpoints'; } else if (path.includes('/other')) { this.pageType = 'other'; + } else if (path.includes('/workflows')) { + this.pageType = 'workflows'; } else if (path.includes('/loras')) { this.pageType = 'loras'; } else if (path.includes('/embeddings')) { @@ -268,6 +270,7 @@ class InitializationManager { 'checkpoint': 'checkpoints', 'embedding': 'embeddings', 'other': 'other', + 'workflow': 'workflows', 'recipe': 'recipes' }; diff --git a/static/js/components/shared/ModelCard.js b/static/js/components/shared/ModelCard.js index 86f8c60a..7738de3d 100644 --- a/static/js/components/shared/ModelCard.js +++ b/static/js/components/shared/ModelCard.js @@ -9,6 +9,7 @@ import { NSFW_LEVELS, getBaseModelAbbreviation, getSubTypeAbbreviation, getMatur import { MODEL_TYPES } from '../../api/apiConfig.js'; import { getModelApiClient } from '../../api/modelApiFactory.js'; import { showDeleteModal } from '../../utils/modalUtils.js'; +import { copyWorkflowToClipboard, sendWorkflowToComfy } from '../../utils/workflowActions.js'; import { translate } from '../../utils/i18nHelpers.js'; import { eventManager } from '../../utils/EventManager.js'; @@ -239,6 +240,9 @@ function handleSendToWorkflow(card, replaceMode, modelType) { const name = card.dataset.file_name || ''; const embeddingCode = folder ? `embedding:${folder}/${name}` : `embedding:${name}`; sendEmbeddingToWorkflow(embeddingCode); + } else if (modelType === MODEL_TYPES.WORKFLOW) { + // Workflow send loads the whole graph document; no append/replace modes. + sendWorkflowToComfy(card.dataset.filepath); } else { showToast('modelCard.sendToWorkflow.checkpointNotImplemented', {}, 'info'); } @@ -258,6 +262,8 @@ function handleCopyAction(card, modelType) { const embeddingCode = folder ? `embedding:${folder}/${name}` : `embedding:${name}`; const message = translate('modelCard.actions.embeddingNameCopied', {}, 'Embedding syntax copied'); copyToClipboard(embeddingCode, message); + } else if (modelType === MODEL_TYPES.WORKFLOW) { + copyWorkflowToClipboard(card.dataset.filepath); } else { // Other model types (VAE, upscalers, ...) - copy the file name const fileName = card.dataset.file_name; @@ -640,6 +646,9 @@ export function createModelCard(model, modelType) { // Embedding send always appends to the prompt; no replace mode. sendTitle = translate('modelCard.actions.sendEmbeddingToWorkflow', {}, 'Send to ComfyUI'); copyTitle = translate('modelCard.actions.copyEmbeddingName', {}, 'Copy embedding name'); + } else if (modelType === MODEL_TYPES.WORKFLOW) { + sendTitle = translate('modelCard.actions.openInComfyUI', {}, 'Open in ComfyUI'); + copyTitle = translate('modelCard.actions.copyWorkflowToClipboard', {}, 'Copy workflow to clipboard'); } else { sendTitle = translate('modelCard.actions.sendToWorkflow', {}, 'Send to ComfyUI'); copyTitle = translate('modelCard.actions.copyLoRASyntax', {}, 'Copy value'); @@ -647,6 +656,12 @@ export function createModelCard(model, modelType) { const updateBadgeLabel = translate('modelCard.badges.update', {}, 'Update'); const updateBadgeTooltip = translate('modelCard.badges.updateAvailable', {}, 'Update available'); + // Standalone has no running ComfyUI graph to push a workflow into. + const hideSendIcon = modelType === MODEL_TYPES.WORKFLOW && state.global.settings.standalone_mode; + const sendIcon = hideSendIcon ? '' : ` + + `; const actionIcons = ` @@ -654,10 +669,7 @@ export function createModelCard(model, modelType) { - - - + ${sendIcon} `; diff --git a/static/js/components/shared/ModelModal.js b/static/js/components/shared/ModelModal.js index 2a306daa..7c3c5a57 100644 --- a/static/js/components/shared/ModelModal.js +++ b/static/js/components/shared/ModelModal.js @@ -22,6 +22,7 @@ import { initVersionsTab } from './ModelVersionsTab.js'; import { loadRecipesForModel } from './RecipeTab.js'; import { translate } from '../../utils/i18nHelpers.js'; import { showDeleteModal } from '../../utils/modalUtils.js'; +import { sendWorkflowToComfy } from '../../utils/workflowActions.js'; import { state } from '../../state/index.js'; function getModalFilePath(fallback = '') { @@ -499,16 +500,28 @@ export async function showModelModal(model, modelType) { ].join('\n') : ''; const headerActionItems = []; - - // Add send to ComfyUI button for all model types - const sendToWorkflowTitle = translate('modals.model.actions.sendToWorkflow', {}, 'Send to ComfyUI'); - const sendToWorkflowButton = ` + + // Add send to ComfyUI button for all model types. Workflows hide it in + // standalone mode: there is no running ComfyUI graph to push into. + const hideSendButton = modelType === MODEL_TYPES.WORKFLOW && state.global.settings.standalone_mode; + if (!hideSendButton) { + // Workflows load a whole graph document, so the action reads "Open"; + // model types that insert into the current graph keep "Send". + const isWorkflow = modelType === MODEL_TYPES.WORKFLOW; + const sendToWorkflowTitle = isWorkflow + ? translate('workflows.contextMenu.sendToComfy', {}, 'Open in ComfyUI') + : translate('modals.model.actions.sendToWorkflow', {}, 'Send to ComfyUI'); + const sendToWorkflowText = isWorkflow + ? translate('workflows.contextMenu.sendToComfy', {}, 'Open in ComfyUI') + : translate('modals.model.actions.sendToWorkflowText', {}, 'Send to ComfyUI'); + const sendToWorkflowButton = ` `.trim(); - headerActionItems.push(indentMarkup(sendToWorkflowButton, 20)); + headerActionItems.push(indentMarkup(sendToWorkflowButton, 20)); + } if (creatorActionsMarkup) { headerActionItems.push(creatorActionsMarkup); @@ -1524,6 +1537,9 @@ async function handleSendToWorkflow(target, modelType) { const name = currentFileName.replace(/\.[^.]+$/, ''); const embeddingCode = folder ? `embedding:${folder}/${name}` : `embedding:${name}`; await sendEmbeddingToWorkflow(embeddingCode); + } else if (modelType === MODEL_TYPES.WORKFLOW) { + // Workflow send loads the whole graph document into ComfyUI. + await sendWorkflowToComfy(filePath); } } diff --git a/static/js/core.js b/static/js/core.js index 9a649179..67afd820 100644 --- a/static/js/core.js +++ b/static/js/core.js @@ -118,7 +118,7 @@ export class AppCore { initializePageFeatures() { const pageType = this.getPageType(); - if (['loras', 'recipes', 'checkpoints', 'embeddings', 'other'].includes(pageType)) { + if (['loras', 'recipes', 'checkpoints', 'embeddings', 'other', 'workflows'].includes(pageType)) { this.initializeContextMenus(pageType); initializeInfiniteScroll(pageType); } diff --git a/static/js/managers/BannerService.js b/static/js/managers/BannerService.js index 13b66b55..38ba2cde 100644 --- a/static/js/managers/BannerService.js +++ b/static/js/managers/BannerService.js @@ -541,6 +541,7 @@ class BannerService { if (path.includes('/checkpoints')) return 'checkpoints'; if (path.includes('/embeddings')) return 'embeddings'; if (path.includes('/other')) return 'other'; + if (path.includes('/workflows')) return 'workflows'; if (path.includes('/recipes')) return 'recipes'; return 'loras'; } @@ -555,7 +556,8 @@ class BannerService { 'loras': '/api/lm/loras/reload?rebuild=true', 'checkpoints': '/api/lm/checkpoints/reload?rebuild=true', 'embeddings': '/api/lm/embeddings/reload?rebuild=true', - 'other': '/api/lm/other/reload?rebuild=true' + 'other': '/api/lm/other/reload?rebuild=true', + 'workflows': '/api/lm/workflows/reload?rebuild=true' }; return endpoints[pageType] || endpoints['loras']; } diff --git a/static/js/managers/DownloadManager.js b/static/js/managers/DownloadManager.js index f257749e..3e42bf48 100644 --- a/static/js/managers/DownloadManager.js +++ b/static/js/managers/DownloadManager.js @@ -1477,6 +1477,7 @@ export class DownloadManager { suppressSuccessToast = false, suppressFailureSummary = false, isLatestVersion = null, + wasLocallyOwned = null, }) { const config = this.apiClient?.apiConfig?.config; @@ -1485,7 +1486,7 @@ export class DownloadManager { } const displayName = versionName || `#${versionId}`; - const retryParams = { modelId, versionId, versionName, modelRoot, targetFolder, useDefaultPaths, useSaveDirAsRoot, source, fileParams, closeModal: false, deferReload, suppressSuccessToast, suppressFailureSummary, isLatestVersion }; + const retryParams = { modelId, versionId, versionName, modelRoot, targetFolder, useDefaultPaths, useSaveDirAsRoot, source, fileParams, closeModal: false, deferReload, suppressSuccessToast, suppressFailureSummary, isLatestVersion, wasLocallyOwned }; this._lastDownloadError = null; let ws = null; let updateProgress = () => { }; @@ -1640,6 +1641,7 @@ export class DownloadManager { await this._reconcileViewAfterDownload({ modelId, isLatestVersion: isLatestVersion ?? this._isDownloadingLatestVersion(versionId), + wasLocallyOwned, }); } @@ -1696,9 +1698,10 @@ export class DownloadManager { * (the update flag is model-level, so every visible card of the * model disappears at once). * - Normal listing: the card stays; only the update flag is cleared. - * - The model is not in the current view (different folder / filter / - * window): nothing changes, which also covers brand-new models whose - * card did not exist before. + * - An owned model outside the current view (different folder / filter / + * window): nothing changes. + * - A brand-new model has no card to reconcile in place, so the listing + * falls back to the legacy reload to make the new card visible. * * The sidebar folder tree is refreshed separately so folder counts * stay accurate without touching the model listing or scroll position. @@ -1712,9 +1715,14 @@ export class DownloadManager { * @param {boolean} [opts.refreshSidebar=true] Whether to refresh the * sidebar folder tree afterwards (batch callers batch this into a * single refresh). + * @param {boolean|null} [opts.wasLocallyOwned=null] Whether any version + * of the model was already in the library before this download. Only + * an explicit true keeps the no-op for a model outside the current + * view; false (brand-new) and null (unknown) reload the listing so a + * new card can appear. * @returns {Promise} True when an in-place update was applied. */ - async _reconcileViewAfterDownload({ modelId, isLatestVersion = true, refreshSidebar = true } = {}) { + async _reconcileViewAfterDownload({ modelId, isLatestVersion = true, refreshSidebar = true, wasLocallyOwned = null } = {}) { const scroller = state?.virtualScroller; const items = Array.isArray(scroller?.items) ? scroller.items : []; @@ -1738,8 +1746,15 @@ export class DownloadManager { }); if (matches.length === 0) { - // Downloaded model is not visible in the current view — keep the - // listing untouched, only refresh folder counts. + // No card of this model is visible. A brand-new model (or one + // whose ownership is unknown) has no card anywhere in the + // listing to reconcile in place — fall back to the legacy + // reload so the new card becomes visible. An owned model that + // merely sits outside the current view keeps the no-op (#1078). + if (wasLocallyOwned !== true) { + await resetAndReload(true); + return true; + } await this._refreshSidebarAfterReconcile(refreshSidebar); return false; } @@ -1792,6 +1807,7 @@ export class DownloadManager { modelId, isLatestVersion: this._isVersionLatest(item.selectedVersion?.id, item.versions), refreshSidebar: false, + wasLocallyOwned: this._computeWasLocallyOwned(item.versions), }); } await this._refreshSidebarAfterReconcile(true); @@ -1851,6 +1867,19 @@ export class DownloadManager { return this._isVersionLatest(versionId, this.versions); } + /** + * Whether any version of the model was already in the library before + * the download, derived from the `existsLocally` flags of the version + * list the modal fetched up front. Returns null when no version list is + * available (callers outside the modal flow). + */ + _computeWasLocallyOwned(versions) { + if (!Array.isArray(versions) || versions.length === 0) { + return null; + } + return versions.some(version => version && version.existsLocally === true); + } + /** * Download multiple selected files of the same version sequentially, * reusing the location-step choices for every file. Per-file toasts, @@ -1937,6 +1966,7 @@ export class DownloadManager { await this._reconcileViewAfterDownload({ modelId: this.modelId, isLatestVersion: this._isDownloadingLatestVersion(this.currentVersion?.id), + wasLocallyOwned: this._computeWasLocallyOwned(this.versions), }); } return failedItems.length === 0; @@ -2521,6 +2551,7 @@ export class DownloadManager { source: this.source, fileParams, closeModal: true, + wasLocallyOwned: this._computeWasLocallyOwned(this.versions), }); } diff --git a/static/js/managers/FilterManager.js b/static/js/managers/FilterManager.js index 19f9a8ae..2b98ccf5 100644 --- a/static/js/managers/FilterManager.js +++ b/static/js/managers/FilterManager.js @@ -877,7 +877,7 @@ export class FilterManager { // Call the appropriate manager's load method based on page type if (this.currentPage === 'recipes' && window.recipeManager) { await window.recipeManager.loadRecipes(true); - } else if (this.currentPage === 'loras' || this.currentPage === 'embeddings' || this.currentPage === 'checkpoints' || this.currentPage === 'other') { + } else if (this.currentPage === 'loras' || this.currentPage === 'embeddings' || this.currentPage === 'checkpoints' || this.currentPage === 'other' || this.currentPage === 'workflows') { // For models page, reset the page and reload await getModelApiClient().loadMoreWithVirtualScroll(true, false); } @@ -977,7 +977,7 @@ export class FilterManager { // Reload data using the appropriate method for the current page if (this.currentPage === 'recipes' && window.recipeManager) { await window.recipeManager.loadRecipes(true); - } else if (this.currentPage === 'loras' || this.currentPage === 'checkpoints' || this.currentPage === 'embeddings' || this.currentPage === 'other') { + } else if (this.currentPage === 'loras' || this.currentPage === 'checkpoints' || this.currentPage === 'embeddings' || this.currentPage === 'other' || this.currentPage === 'workflows') { await getModelApiClient().loadMoreWithVirtualScroll(true, true); } diff --git a/static/js/managers/ModalManager.js b/static/js/managers/ModalManager.js index 20d5eda3..cedc09c9 100644 --- a/static/js/managers/ModalManager.js +++ b/static/js/managers/ModalManager.js @@ -243,6 +243,18 @@ export class ModalManager { }); } + // Add confirmationModal registration (generic JS-driven confirmation) + const confirmationModal = document.getElementById('confirmationModal'); + if (confirmationModal) { + this.registerModal('confirmationModal', { + element: confirmationModal, + onClose: () => { + this.getModal('confirmationModal').element.classList.remove('show'); + document.body.classList.remove('modal-open'); + } + }); + } + // Add deleteFolderModal registration const deleteFolderModal = document.getElementById('deleteFolderModal'); if (deleteFolderModal) { @@ -453,6 +465,7 @@ export class ModalManager { id === "clearCacheModal" || id === "bulkDeleteModal" || id === "checkUpdatesConfirmModal" || + id === "confirmationModal" || id === "deleteFolderModal" || id === "resolveFilenameConflictsModal" ) { diff --git a/static/js/managers/SearchManager.js b/static/js/managers/SearchManager.js index 4929caf8..396f4113 100644 --- a/static/js/managers/SearchManager.js +++ b/static/js/managers/SearchManager.js @@ -298,7 +298,7 @@ export class SearchManager { pageState.searchOptions.loraName = options.loraName || false; pageState.searchOptions.loraModel = options.loraModel || false; pageState.searchOptions.prompt = options.prompt || false; - } else if (this.currentPage === 'loras' || this.currentPage === 'checkpoints' || this.currentPage === 'embeddings' || this.currentPage === 'other') { + } else if (this.currentPage === 'loras' || this.currentPage === 'checkpoints' || this.currentPage === 'embeddings' || this.currentPage === 'other' || this.currentPage === 'workflows') { // Update only the relevant fields in searchOptions instead of replacing the whole object pageState.searchOptions.filename = options.filename || false; pageState.searchOptions.modelname = options.modelname || false; @@ -310,7 +310,7 @@ export class SearchManager { // Call the appropriate manager's load method based on page type if (this.currentPage === 'recipes' && window.recipeManager) { window.recipeManager.loadRecipes(true); - } else if (this.currentPage === 'loras' || this.currentPage === 'embeddings' || this.currentPage === 'checkpoints' || this.currentPage === 'other') { + } else if (this.currentPage === 'loras' || this.currentPage === 'embeddings' || this.currentPage === 'checkpoints' || this.currentPage === 'other' || this.currentPage === 'workflows') { // For models page, reset the page and reload getModelApiClient().loadMoreWithVirtualScroll(true, false); } diff --git a/static/js/managers/SettingsManager.js b/static/js/managers/SettingsManager.js index 574c8e30..0743f080 100644 --- a/static/js/managers/SettingsManager.js +++ b/static/js/managers/SettingsManager.js @@ -1412,6 +1412,9 @@ export class SettingsManager { await this.loadOtherRoots(); this.updateOtherModelsControls(); + // Reflect the opt-in Workflow management toggle + this.updateWorkflowsControls(); + // Load extra folder paths this.loadExtraFolderPaths(); @@ -2439,6 +2442,12 @@ export class SettingsManager { schema.forEach((entry) => { if (entry.category === 'core') { this._buildModelPathTypeGroup(coreHost, entry); + } else if (entry.category === 'workflow') { + // Opt-in like Other Models, but gated on its own master toggle + // (no sub-types) and rendered with the core groups. + if (state.global.settings.enable_workflows === true) { + this._buildModelPathTypeGroup(coreHost, entry); + } } else if (otherModelsEnabled && entry.sub_type && enabledSubTypes.has(entry.sub_type)) { otherCount++; this._buildModelPathTypeGroup(otherHost, entry); @@ -2585,7 +2594,11 @@ export class SettingsManager { async updateModelFolderPaths(changedKey, { fromRemoval = false } = {}) { this._clearAllModelFolderPathErrors(); - const folderPaths = {}; + // Start from the stored map so keys whose editor is not rendered + // (disabled other-model sub-types, workflows while the feature is + // off) survive a save instead of being wiped from the library. + const currentPaths = state.global.settings.folder_paths || {}; + const folderPaths = { ...currentPaths }; const section = document.getElementById('section-modelPaths'); if (!section) return; @@ -2624,7 +2637,6 @@ export class SettingsManager { return; } - const currentPaths = state.global.settings.folder_paths || {}; const pathsChanged = JSON.stringify(currentPaths) !== JSON.stringify(folderPaths); if (!pathsChanged) { @@ -3283,6 +3295,11 @@ export class SettingsManager { this.removeOtherModelsAnnouncement(value); } + if (settingKey === 'enable_workflows') { + this.updateWorkflowsControls(); + this.updateWorkflowsNavVisibility(value); + } + showToast('toast.settings.settingsUpdated', { setting: settingKey.replace(/_/g, ' ') }, 'success'); // Apply frontend settings immediately @@ -3399,6 +3416,138 @@ export class SettingsManager { * its default-root select disabled. Never force-enables a select (the * no-roots placeholder owns that state). */ + /** + * Reflect the opt-in Workflow management state in the settings UI: the + * master toggle gates the workflow folder editor, which edits the active + * library's folder_paths.workflows entry (LoRA-Manager-owned in both + * plugin and standalone mode, applied live without a restart). + */ + updateWorkflowsControls() { + const enabled = !!state.global.settings.enable_workflows; + + const toggle = document.getElementById('enableWorkflows'); + if (toggle) { + toggle.checked = enabled; + } + + const group = document.getElementById('workflowFolderPathsSetting'); + if (group) { + group.style.display = enabled ? '' : 'none'; + } + if (enabled) { + this.loadWorkflowFolderPaths(); + } + } + + loadWorkflowFolderPaths() { + const container = document.getElementById('workflowFolderPaths'); + if (!container) return; + + container.innerHTML = ''; + const paths = state.global.settings.workflow_folder_paths || []; + paths.forEach((path) => { + this.addWorkflowFolderPathRow(path, false); + }); + // No trailing empty row on load: an unconfigured library shows just + // its Add button, and removing a row never resurrects an empty one. + } + + addWorkflowFolderPathRow(path = '', shouldFocus = true) { + const container = document.getElementById('workflowFolderPaths'); + if (!container) return; + + const row = document.createElement('div'); + row.className = 'extra-folder-path-row mapping-row'; + + row.innerHTML = ` +
+ + + +
+ `; + + container.appendChild(row); + + if (!path && shouldFocus) { + const input = row.querySelector('.extra-folder-path-input'); + if (input) { + setTimeout(() => input.focus(), 0); + } + } + } + + browseForWorkflowPathRow(btn) { + const row = btn.closest('.extra-folder-path-row'); + const input = row ? row.querySelector('.extra-folder-path-input') : null; + if (!input) return; + + directoryPickerModal.open({ + initialPath: input.value.trim(), + onSelect: (pickedPath) => { + input.value = pickedPath; + this.updateWorkflowFolderPaths(); + }, + }); + } + + removeWorkflowFolderPathRow(btn) { + const row = btn.closest('.extra-folder-path-row'); + if (row) { + row.remove(); + this.updateWorkflowFolderPaths({ fromRemoval: true }); + } + } + + async updateWorkflowFolderPaths({ fromRemoval = false } = {}) { + const container = document.getElementById('workflowFolderPaths'); + if (!container) return; + + const paths = []; + container.querySelectorAll('.extra-folder-path-input').forEach((input) => { + const value = input.value.trim(); + if (value) { + paths.push(value); + } + }); + + const currentPaths = state.global.settings.workflow_folder_paths || []; + if (JSON.stringify(currentPaths) === JSON.stringify(paths)) { + return; + } + + try { + await this.saveSetting('workflow_folder_paths', paths); + state.global.settings.workflow_folder_paths = paths; + showToast('toast.settings.settingsUpdated', { setting: 'workflow folders' }, 'success'); + + // Keep the continuous-add flow: after the user fills the trailing + // empty row, append a fresh one — but never after a removal. + if (!fromRemoval) { + const inputs = container.querySelectorAll('.extra-folder-path-input'); + const hasEmptyRow = Array.from(inputs).some((input) => !input.value.trim()); + if (!hasEmptyRow) { + this.addWorkflowFolderPathRow(''); + } + } + } catch (error) { + console.error('Failed to save workflow folder paths:', error); + showToast('toast.settings.settingSaveFailed', { message: error.message }, 'error'); + this.loadWorkflowFolderPaths(); + } + } + updateOtherModelsControls() { const enableOtherModels = !!state.global.settings.enable_other_models; const enabledSubTypes = new Set( @@ -3410,7 +3559,6 @@ export class SettingsManager { if (masterToggle) { masterToggle.checked = enableOtherModels; } - document.querySelectorAll('[data-other-subtype-toggle]').forEach((input) => { input.checked = enabledSubTypes.has(input.value); input.disabled = !enableOtherModels; @@ -3464,6 +3612,18 @@ export class SettingsManager { } } + /** + * Show or hide the Workflows nav entry. The nav is server-rendered, so + * toggling the class here keeps it in sync when the switch is flipped from + * the settings modal (no reload needed). + */ + updateWorkflowsNavVisibility(enabled) { + const navItem = document.getElementById('workflowsNavItem'); + if (navItem) { + navItem.classList.toggle('nav-item--hidden', !enabled); + } + } + /** * Drop the Other Models announcement banner once the feature is on. */ diff --git a/static/js/state/index.js b/static/js/state/index.js index a21798c4..8d25f12b 100644 --- a/static/js/state/index.js +++ b/static/js/state/index.js @@ -29,6 +29,8 @@ const DEFAULT_SETTINGS_BASE = Object.freeze({ default_embedding_root: '', default_other_roots: {}, enable_other_models: false, + enable_workflows: false, + workflow_folder_paths: [], enabled_other_sub_types: ['vae', 'upscaler', 'text_encoder'], recipes_path: '', base_model_path_mappings: {}, @@ -107,6 +109,7 @@ const loraPreviewVersions = getMapFromStorage('loras_preview_versions'); const checkpointPreviewVersions = getMapFromStorage('checkpoints_preview_versions'); const embeddingPreviewVersions = getMapFromStorage('embeddings_preview_versions'); const otherPreviewVersions = getMapFromStorage('other_preview_versions'); +const workflowPreviewVersions = getMapFromStorage('workflows_preview_versions'); export const state = { // Global state @@ -296,6 +299,43 @@ export const state = { search: '', }, activeViewSnapshot: null, + }, + + [MODEL_TYPES.WORKFLOW]: { + currentPage: 1, + isLoading: false, + hasMore: true, + sortBy: 'name', + activeFolder: getStorageItem(`${MODEL_TYPES.WORKFLOW}_activeFolder`), + previewVersions: workflowPreviewVersions, + searchManager: null, + searchOptions: { + filename: true, + modelname: true, + tags: false, + creator: false, + recursive: getStorageItem(`${MODEL_TYPES.WORKFLOW}_recursiveSearch`, true), + }, + filters: { + baseModel: [], + tags: {}, + license: {}, + modelTypes: [], + search: '', + tagLogic: 'any', + }, + bulkMode: false, + selectedModels: new Set(), + metadataCache: new Map(), + showFavoritesOnly: false, + showUpdateAvailableOnly: false, + duplicatesMode: false, + viewMode: 'active', + excludedViewState: { + sortBy: 'name:asc', + search: '', + }, + activeViewSnapshot: null, } }, diff --git a/static/js/utils/constants.js b/static/js/utils/constants.js index b3649858..b5e02713 100644 --- a/static/js/utils/constants.js +++ b/static/js/utils/constants.js @@ -112,6 +112,8 @@ export const MODEL_SUBTYPE_DISPLAY_NAMES = { text_encoder: "Text Encoder", clip_vision: "CLIP Vision", controlnet: "ControlNet", + // Workflow sub-types + workflow: "Workflow", }; // Backward compatibility alias @@ -130,6 +132,7 @@ export const MODEL_SUBTYPE_ABBREVIATIONS = { text_encoder: "TE", clip_vision: "CV", controlnet: "CN", + workflow: "WF", }; export function getSubTypeAbbreviation(subType) { diff --git a/static/js/utils/infiniteScroll.js b/static/js/utils/infiniteScroll.js index 138bceb4..32135f6b 100644 --- a/static/js/utils/infiniteScroll.js +++ b/static/js/utils/infiniteScroll.js @@ -66,7 +66,7 @@ async function getCardCreator(pageType) { // Function to get the appropriate data fetcher based on page type async function getDataFetcher(pageType) { - if (pageType === 'loras' || pageType === 'embeddings' || pageType === 'checkpoints' || pageType === 'other') { + if (pageType === 'loras' || pageType === 'embeddings' || pageType === 'checkpoints' || pageType === 'other' || pageType === 'workflows') { return (page = 1, pageSize = 100) => getModelApiClient().fetchModelsPage(page, pageSize); } else if (pageType === 'recipes') { // Import the recipeApi module and use the fetchRecipesPage function diff --git a/static/js/utils/modalUtils.js b/static/js/utils/modalUtils.js index 45ffb9ec..50e80407 100644 --- a/static/js/utils/modalUtils.js +++ b/static/js/utils/modalUtils.js @@ -97,10 +97,10 @@ export function closeExcludeModal() { export async function confirmExclude() { if (!pendingExcludePath) return; - + try { await getModelApiClient().excludeModel(pendingExcludePath); - + closeExcludeModal(); if (window.modelDuplicatesManager) { @@ -110,3 +110,68 @@ export async function confirmExclude() { console.error('Error excluding model:', error); } } + +/** + * Show the generic confirmation modal (#confirmationModal) and resolve with + * the user's choice. Text is provided by the caller (already translated). + * @param {Object} options + * @param {string} options.title - Modal heading + * @param {string} options.message - Body text + * @param {string} options.confirmText - Confirm button label + * @param {boolean} [options.danger=false] - Style the confirm button as destructive + * @returns {Promise} true when confirmed, false otherwise + */ +export function showConfirmationModal({ title, message, confirmText, danger = false }) { + const modalElement = document.getElementById('confirmationModal'); + if (!modalElement) { + // Template missing (unexpected): fall back to the browser dialog. + return Promise.resolve(window.confirm(`${title}\n${message}`)); + } + + const titleElement = modalElement.querySelector('[data-role="title"]'); + const messageElement = modalElement.querySelector('[data-role="message"]'); + const confirmButton = modalElement.querySelector('[data-action="confirm-confirmation"]'); + const cancelButton = modalElement.querySelector('[data-action="cancel-confirmation"]'); + if (!titleElement || !messageElement || !confirmButton || !cancelButton) { + return Promise.resolve(window.confirm(`${title}\n${message}`)); + } + + titleElement.textContent = title; + messageElement.textContent = message; + confirmButton.textContent = confirmText; + confirmButton.classList.toggle('delete-btn', danger); + confirmButton.classList.toggle('primary-btn', !danger); + + return new Promise((resolve) => { + let resolved = false; + + const cleanup = () => { + confirmButton.removeEventListener('click', handleConfirm); + cancelButton.removeEventListener('click', handleCancel); + }; + + const finalize = (proceed) => { + if (resolved) return; + resolved = true; + cleanup(); + resolve(proceed); + }; + + const handleConfirm = (event) => { + event.preventDefault(); + finalize(true); + modalManager.closeModal('confirmationModal'); + }; + + const handleCancel = (event) => { + event.preventDefault(); + finalize(false); + modalManager.closeModal('confirmationModal'); + }; + + confirmButton.addEventListener('click', handleConfirm); + cancelButton.addEventListener('click', handleCancel); + + modalManager.showModal('confirmationModal', null, () => finalize(false)); + }); +} diff --git a/static/js/utils/workflowActions.js b/static/js/utils/workflowActions.js new file mode 100644 index 00000000..aba43b82 --- /dev/null +++ b/static/js/utils/workflowActions.js @@ -0,0 +1,95 @@ +import { MODEL_TYPES } from '../api/apiConfig.js'; +import { getModelApiClient } from '../api/modelApiFactory.js'; +import { state } from '../state/index.js'; +import { copyToClipboard, showToast } from './uiHelpers.js'; +import { translate } from './i18nHelpers.js'; +import { showConfirmationModal } from './modalUtils.js'; + +/** + * Push a library workflow into the running ComfyUI graph (plugin mode only; + * the backend rejects standalone mode since there is no graph to push into). + * @param {string} filePath + */ +export async function sendWorkflowToComfy(filePath) { + try { + await getModelApiClient(MODEL_TYPES.WORKFLOW).sendToComfy(filePath); + showToast('workflows.sendToComfy.success', {}, 'success'); + } catch (error) { + console.error('Failed to send workflow to ComfyUI:', error); + showToast('workflows.sendToComfy.failed', { message: error.message }, 'error'); + } +} + +/** + * Copy the extracted workflow document to the clipboard so the user can + * paste it into ComfyUI (Ctrl+V) to load it. Works in standalone mode too. + * @param {string} filePath + */ +export async function copyWorkflowToClipboard(filePath) { + try { + const workflow = await getModelApiClient(MODEL_TYPES.WORKFLOW).fetchWorkflowContent(filePath); + await copyToClipboard(JSON.stringify(workflow)); + } catch (error) { + console.error('Failed to copy workflow:', error); + showToast('workflows.copyWorkflow.failed', { message: error.message }, 'error'); + } +} + +/** + * Ask the ComfyUI tab that has this workflow open (and edited) to write its + * current graph back into the managed library document. + * @param {string} filePath + */ +export async function updateWorkflowFromComfy(filePath) { + try { + const result = await getModelApiClient(MODEL_TYPES.WORKFLOW).updateFromComfy(filePath); + showToast('workflows.updateFromComfy.success', {}, 'success'); + // Re-render the card in place: the scroller shows its shared + // "Updated" cue and the item picks up the new document hash. + const updateData = result && result.sha256 ? { sha256: result.sha256 } : {}; + state.virtualScroller?.updateSingleItem(filePath, updateData); + } catch (error) { + const kind = error.kind || 'unknown'; + if (kind === 'no_changes' || kind === 'cancelled') { + const key = kind === 'no_changes' ? 'noChanges' : 'cancelled'; + showToast(`workflows.updateFromComfy.${key}`, {}, 'info'); + } else { + console.error('Failed to update workflow from ComfyUI:', error); + showToast('workflows.updateFromComfy.failed', { message: error.message }, 'error'); + } + } +} + +/** + * Restore a workflow to its downloaded state, discarding local edits. Bare + * .json artifacts are re-downloaded from the recorded CivitAI version; + * container artifacts (.zip/images) are re-extracted from the pristine file. + * @param {string} filePath + */ +export async function restoreWorkflow(filePath) { + const confirmed = await showConfirmationModal({ + title: translate('workflows.restoreDownloaded.title', {}), + message: translate('workflows.restoreDownloaded.message', {}), + confirmText: translate('workflows.restoreDownloaded.confirmButton', {}), + danger: true, + }); + if (!confirmed) { + return; + } + // .json restores re-download from CivitAI, which can take a moment; keep + // a blocking indicator up so the wait does not look like a dead click. + state.loadingManager?.showSimpleLoading(translate('workflows.restoreDownloaded.restoring', {})); + try { + const result = await getModelApiClient(MODEL_TYPES.WORKFLOW).restore(filePath); + showToast('workflows.restoreDownloaded.success', {}, 'success'); + // Re-render the card in place: the scroller shows its shared + // "Updated" cue and the item picks up the restored document hash. + const updateData = result && result.sha256 ? { sha256: result.sha256 } : {}; + state.virtualScroller?.updateSingleItem(filePath, updateData); + } catch (error) { + console.error('Failed to restore workflow:', error); + showToast('workflows.restoreDownloaded.failed', { message: error.message }, 'error'); + } finally { + state.loadingManager?.hide(); + } +} diff --git a/static/js/utils/workflowModels.js b/static/js/utils/workflowModels.js new file mode 100644 index 00000000..2fd79d8b --- /dev/null +++ b/static/js/utils/workflowModels.js @@ -0,0 +1,67 @@ +/** + * Shared helpers for the opt-in Workflow management feature. + * + * Used by the disabled page so that enabling the feature goes through the same + * settings API call as the Settings modal toggle. + */ + +/** + * Turn on Workflow management and reload so the server-rendered nav and the + * scanner state pick up the change. + */ +export async function enableWorkflows() { + const response = await fetch('/api/lm/settings', { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ enable_workflows: true }), + }); + const data = await response.json().catch(() => ({})); + if (!response.ok || data.success === false) { + throw new Error(data.error || `HTTP ${response.status}`); + } + window.location.reload(); +} + +/** + * Open the settings modal on the Library section and scroll the Workflows + * toggle into view. + */ +export function openWorkflowsSettings() { + const modalManager = window.modalManager; + if (modalManager && typeof modalManager.showModal === 'function') { + modalManager.showModal('settingsModal'); + } + + window.setTimeout(() => { + document.querySelectorAll('.settings-section').forEach((section) => { + section.classList.remove('active'); + }); + document.getElementById('section-library')?.classList.add('active'); + + document.querySelectorAll('.settings-nav-item').forEach((item) => { + item.classList.remove('active'); + }); + document.querySelector('.settings-nav-item[data-section="library"]')?.classList.add('active'); + + document.getElementById('enableWorkflows')?.scrollIntoView({ + behavior: 'smooth', + block: 'center', + }); + }, 100); +} + +/** + * Open the settings modal on the standalone-only Model Paths section, where + * primary folder_paths are edited. The section only exists in standalone mode, + * so the nav item lookup simply no-ops elsewhere. + */ +export function openModelPathsSettings() { + const modalManager = window.modalManager; + if (modalManager && typeof modalManager.showModal === 'function') { + modalManager.showModal('settingsModal'); + } + + window.setTimeout(() => { + document.querySelector('.settings-nav-item[data-section="modelPaths"]')?.click(); + }, 100); +} diff --git a/static/js/workflows.js b/static/js/workflows.js new file mode 100644 index 00000000..2bd0bd1a --- /dev/null +++ b/static/js/workflows.js @@ -0,0 +1,57 @@ +import { appCore } from './core.js'; +import { confirmDelete, closeDeleteModal, confirmExclude, closeExcludeModal } from './utils/modalUtils.js'; +import { createPageControls } from './components/controls/index.js'; +import { ModelDuplicatesManager } from './components/ModelDuplicatesManager.js'; +import { MODEL_TYPES } from './api/apiConfig.js'; +import { initActiveFiltersSync } from './utils/activeFiltersSync.js'; + +// Initialize the Workflows page +class WorkflowsPageManager { + constructor() { + // Initialize page controls + this.pageControls = createPageControls(MODEL_TYPES.WORKFLOW); + + // Initialize the ModelDuplicatesManager + this.duplicatesManager = new ModelDuplicatesManager(this, MODEL_TYPES.WORKFLOW); + + // Expose only necessary functions to global scope + this._exposeRequiredGlobalFunctions(); + } + + _exposeRequiredGlobalFunctions() { + // Minimal set of functions that need to remain global + window.confirmDelete = confirmDelete; + window.closeDeleteModal = closeDeleteModal; + window.confirmExclude = confirmExclude; + window.closeExcludeModal = closeExcludeModal; + + // Expose duplicates manager + window.modelDuplicatesManager = this.duplicatesManager; + } + + async initialize() { + // Initialize common page features (including context menus) + appCore.initializePageFeatures(); + + // Mirror active filters to the backend for the ComfyUI-side autocomplete + initActiveFiltersSync(MODEL_TYPES.WORKFLOW); + + console.log('Workflows Manager initialized'); + } +} + +async function initializeWorkflowsPage() { + // Initialize core application + await appCore.initialize(); + + // Initialize workflows page + const workflowsPage = new WorkflowsPageManager(); + await workflowsPage.initialize(); + + return workflowsPage; +} + +// Initialize everything when DOM is ready +document.addEventListener('DOMContentLoaded', initializeWorkflowsPage); + +export { WorkflowsPageManager, initializeWorkflowsPage }; diff --git a/static/js/workflows_disabled.js b/static/js/workflows_disabled.js new file mode 100644 index 00000000..2e4d35b4 --- /dev/null +++ b/static/js/workflows_disabled.js @@ -0,0 +1,109 @@ +import { appCore } from './core.js'; +import { showToast } from './utils/uiHelpers.js'; +import { enableWorkflows, openWorkflowsSettings, openModelPathsSettings } from './utils/workflowModels.js'; + +/** + * Workflow management is an opt-in feature. While it is disabled this page + * renders an empty state whose button turns the feature on; the backend then + * rebuilds the workflow roots and starts scanning, so a reload lands on the + * real page. + * + * The same module backs the "enabled but no folders found" state: ComfyUI + * mode points to the Settings page's Library section, while standalone mode + * points to the standalone-only Model Paths section (which edits the primary + * folder_paths) and still offers the settings.json location as a fallback. + */ +async function handleEnableClick() { + const button = document.getElementById('enableWorkflowsBtn'); + if (!button || button.disabled) return; + + button.disabled = true; + try { + await enableWorkflows(); + } catch (error) { + button.disabled = false; + showToast('workflows.disabled.enableFailed', { message: error.message }, 'error'); + } +} + +/** + * Open Settings on the Library section for the "no folders found" state, so a + * misconfigured install can be fixed without hand-editing unknown keys. + */ +function handleOpenSettingsClick(event) { + event.preventDefault(); + openWorkflowsSettings(); +} + +/** + * Open Settings on the Model Paths section for the standalone "no folders + * found" state, so the missing folders can be added directly. + */ +function handleOpenModelPathsSettingsClick(event) { + event.preventDefault(); + openModelPathsSettings(); +} + +/** + * Open the settings.json location from the standalone no-folders state, + * offered as a fallback next to the Model Paths settings button. + */ +async function handleOpenSettingsFolderClick() { + const button = document.getElementById('openSettingsFolderBtn'); + if (!button || button.disabled) return; + + button.disabled = true; + try { + const response = await fetch('/api/lm/settings/open-location', { method: 'POST' }); + const data = await response.json().catch(() => ({})); + if (!response.ok || data.success === false) { + throw new Error(data.error || `HTTP ${response.status}`); + } + if (data.mode === 'clipboard' && data.path) { + try { + await navigator.clipboard.writeText(data.path); + showToast('settings.openSettingsFileLocation.copied', { path: data.path }, 'success'); + } catch (clipboardError) { + console.warn('Clipboard API not available:', clipboardError); + showToast('settings.openSettingsFileLocation.clipboardFallback', { path: data.path }, 'info'); + } + } else { + showToast('settings.openSettingsFileLocation.success', {}, 'success'); + } + } catch (error) { + console.error('Failed to open settings location:', error); + showToast('settings.openSettingsFileLocation.failed', {}, 'error'); + } finally { + button.disabled = false; + } +} + +async function initializeWorkflowsDisabledPage() { + // appCore.initialize() wires the shared header (theme, settings modal, + // language) so this page is not a dead end. + await appCore.initialize(); + + const button = document.getElementById('enableWorkflowsBtn'); + if (button) { + button.addEventListener('click', handleEnableClick); + } + + const settingsButton = document.getElementById('openWorkflowsSettingsBtn'); + if (settingsButton) { + settingsButton.addEventListener('click', handleOpenSettingsClick); + } + + const modelPathsButton = document.getElementById('openModelPathsSettingsBtn'); + if (modelPathsButton) { + modelPathsButton.addEventListener('click', handleOpenModelPathsSettingsClick); + } + + const settingsFolderButton = document.getElementById('openSettingsFolderBtn'); + if (settingsFolderButton) { + settingsFolderButton.addEventListener('click', handleOpenSettingsFolderClick); + } +} + +document.addEventListener('DOMContentLoaded', initializeWorkflowsDisabledPage); + +export { handleEnableClick as enableWorkflows, handleOpenSettingsFolderClick, initializeWorkflowsDisabledPage }; diff --git a/templates/components/header.html b/templates/components/header.html index 3c52e543..bb71f7e8 100644 --- a/templates/components/header.html +++ b/templates/components/header.html @@ -17,6 +17,8 @@ {% set current_page = 'embeddings' %} {% elif current_path.startswith('/other') %} {% set current_page = 'other' %} + {% elif current_path.startswith('/workflows') %} + {% set current_page = 'workflows' %} {% elif current_path.startswith('/statistics') %} {% set current_page = 'statistics' %} {% else %} @@ -42,6 +44,10 @@ id="otherNavItem"> {{ t('header.navigation.other') }} + + {{ t('header.navigation.workflows') }} + {{ t('header.navigation.statistics') }} diff --git a/templates/components/modals/confirm_modals.html b/templates/components/modals/confirm_modals.html index ed28157c..e90bcc49 100644 --- a/templates/components/modals/confirm_modals.html +++ b/templates/components/modals/confirm_modals.html @@ -82,6 +82,19 @@ + + + diff --git a/templates/components/modals/settings/library.html b/templates/components/modals/settings/library.html index f3314c77..2d7ed55c 100644 --- a/templates/components/modals/settings/library.html +++ b/templates/components/modals/settings/library.html @@ -90,6 +90,27 @@ {% endfor %} + + {{ sm.setting_toggle('enableWorkflows', 'enable_workflows', 'settings.folderSettings.enableWorkflows', 'settings.folderSettings.enableWorkflowsHelp') }} + +
+
+
+ +
+
+ +
+
+
+
+
diff --git a/templates/workflows.html b/templates/workflows.html new file mode 100644 index 00000000..333df82c --- /dev/null +++ b/templates/workflows.html @@ -0,0 +1,161 @@ +{% extends "base.html" %} + +{% block title %}{{ t('workflows.title') }}{% endblock %} +{% block page_id %}workflows{% endblock %} + +{% block init_title %}{{ t('initialization.workflows.title') }}{% endblock %} +{% block init_message %}{{ t('initialization.workflows.message') }}{% endblock %} +{% block init_check_url %}/api/lm/workflows/list?page=1&page_size=1{% endblock %} + +{% block page_css %} + +{% endblock %} + +{% block additional_components %} + + +{% endblock %} + +{% block content %} + {% if workflows_disabled %} +
+ +

{{ t('workflows.disabled.title') }}

+

{{ t('workflows.disabled.description') }}

+ +

{{ t('workflows.disabled.hint') }}

+
+ {% elif workflows_no_paths %} +
+ +

{{ t('workflows.noPaths.title') }}

+ {% if standalone_mode %} +

{{ t('workflows.noPaths.descriptionStandalone') }}

+

{{ t('workflows.noPaths.hintStandalone') }}

+ + {% if settings_file %} +

{{ settings_file }}

+ {% endif %} + + {% else %} +

{{ t('workflows.noPaths.descriptionComfyUI') }}

+

{{ t('workflows.noPaths.hintComfyUI') }}

+ + {% endif %} +
+ {% else %} +
+ {% include 'components/controls.html' %} + {% include 'components/breadcrumb.html' %} +
+ {% include 'components/duplicates_banner.html' %} + {% include 'components/folder_sidebar.html' %} + + +
+ +
+ {% endif %} +{% endblock %} + +{% block overlay %} +
+{% endblock %} + +{% block main_script %} +{% if workflows_disabled or workflows_no_paths %} + +{% else %} + +{% endif %} +{% endblock %} diff --git a/tests/config/test_other_paths.py b/tests/config/test_other_paths.py index 67ad23c9..df325928 100644 --- a/tests/config/test_other_paths.py +++ b/tests/config/test_other_paths.py @@ -21,6 +21,8 @@ def _make_config(**overrides) -> config_module.Config: config._cached_fingerprint = None config.base_models_roots = [] config.embeddings_roots = [] + config.workflows_roots = [] + config.extra_workflows_roots = [] for key, value in overrides.items(): setattr(config, key, value) return config diff --git a/tests/frontend/components/ContextMenu/workflowContextMenu.test.js b/tests/frontend/components/ContextMenu/workflowContextMenu.test.js new file mode 100644 index 00000000..3293d3c3 --- /dev/null +++ b/tests/frontend/components/ContextMenu/workflowContextMenu.test.js @@ -0,0 +1,308 @@ +import { describe, it, beforeEach, expect, vi } from 'vitest'; + +const showToastMock = vi.fn(); +const copyToClipboardMock = vi.fn(); +const fetchWorkflowContentMock = vi.fn(); +const sendToComfyMock = vi.fn(); +const fetchComfyuiStateMock = vi.fn(); +const updateFromComfyMock = vi.fn(); +const restoreMock = vi.fn(); +const resetAndReloadMock = vi.fn(); +const updateSingleItemMock = vi.fn(); +const showConfirmationModalMock = vi.fn(); + +const showSimpleLoadingMock = vi.fn(); +const hideLoadingMock = vi.fn(); + +const stateStub = { + global: { settings: { standalone_mode: false } }, + currentPageType: 'workflows', + pages: {}, + virtualScroller: { updateSingleItem: updateSingleItemMock, items: [] }, + loadingManager: { showSimpleLoading: showSimpleLoadingMock, hide: hideLoadingMock }, +}; + +vi.mock('../../../../static/js/utils/uiHelpers.js', () => ({ + showToast: showToastMock, + copyToClipboard: copyToClipboardMock, +})); + +vi.mock('../../../../static/js/state/index.js', () => ({ + state: stateStub, +})); + +vi.mock('../../../../static/js/api/modelApiFactory.js', () => ({ + getModelApiClient: vi.fn(() => ({ + fetchWorkflowContent: fetchWorkflowContentMock, + sendToComfy: sendToComfyMock, + fetchComfyuiState: fetchComfyuiStateMock, + updateFromComfy: updateFromComfyMock, + restore: restoreMock, + })), + resetAndReload: resetAndReloadMock, +})); + +vi.mock('../../../../static/js/utils/i18nHelpers.js', () => ({ + translate: (key) => key, +})); + +vi.mock('../../../../static/js/managers/MoveManager.js', () => ({ + moveManager: { showMoveModal: vi.fn() }, +})); + +vi.mock('../../../../static/js/utils/modalUtils.js', () => ({ + showDeleteModal: vi.fn(), + showExcludeModal: vi.fn(), + showConfirmationModal: showConfirmationModalMock, +})); + +vi.mock('../../../../static/js/components/ContextMenu/ModelContextMenuMixin.js', () => ({ + ModelContextMenuMixin: { + handleCommonMenuActions: vi.fn(() => false), + updateExcludeMenuItem: vi.fn(), + initNSFWSelector: vi.fn(), + }, +})); + +const { WorkflowContextMenu } = await import( + '../../../../static/js/components/ContextMenu/WorkflowContextMenu.js' +); + +function setupDom() { + document.body.innerHTML = ` + +
+ + `; +} + +describe('WorkflowContextMenu', () => { + let menu; + let card; + + beforeEach(() => { + vi.clearAllMocks(); + stateStub.global.settings.standalone_mode = false; + stateStub.virtualScroller.items = []; + fetchComfyuiStateMock.mockResolvedValue([]); + setupDom(); + menu = new WorkflowContextMenu(); + card = document.querySelector('.model-card'); + menu.currentCard = card; + }); + + it('copies the workflow document to the clipboard', async () => { + const workflow = { 1: { class_type: 'CheckpointLoaderSimple', inputs: {} } }; + fetchWorkflowContentMock.mockResolvedValue(workflow); + + menu.handleMenuAction('copy-workflow'); + await vi.waitFor(() => expect(copyToClipboardMock).toHaveBeenCalled()); + + expect(fetchWorkflowContentMock).toHaveBeenCalledWith('/library/workflows/flow.json'); + expect(copyToClipboardMock).toHaveBeenCalledWith(JSON.stringify(workflow)); + expect(showToastMock).not.toHaveBeenCalledWith( + 'workflows.copyWorkflow.failed', + expect.anything(), + 'error' + ); + }); + + it('shows an error toast when the workflow content cannot be loaded', async () => { + fetchWorkflowContentMock.mockRejectedValue(new Error('not_a_workflow')); + + menu.handleMenuAction('copy-workflow'); + await vi.waitFor(() => + expect(showToastMock).toHaveBeenCalledWith( + 'workflows.copyWorkflow.failed', + { message: 'not_a_workflow' }, + 'error' + ) + ); + expect(copyToClipboardMock).not.toHaveBeenCalled(); + }); + + it('hides send-to-comfy in standalone mode', () => { + stateStub.global.settings.standalone_mode = true; + + menu.showMenu(10, 10, card); + + const sendItem = document.querySelector('[data-action="send-to-comfy"]'); + expect(sendItem.style.display).toBe('none'); + }); + + it('keeps send-to-comfy visible in plugin mode', () => { + menu.showMenu(10, 10, card); + + const sendItem = document.querySelector('[data-action="send-to-comfy"]'); + expect(sendItem.style.display).toBe(''); + }); + + it('hides update-from-comfy in standalone mode', () => { + stateStub.global.settings.standalone_mode = true; + + menu.showMenu(10, 10, card); + + const updateItem = document.querySelector('[data-action="update-from-comfy"]'); + expect(updateItem.style.display).toBe('none'); + }); + + it('keeps update-from-comfy disabled when the workflow is not open in ComfyUI', async () => { + fetchComfyuiStateMock.mockResolvedValue([]); + + menu.showMenu(10, 10, card); + await vi.waitFor(() => expect(fetchComfyuiStateMock).toHaveBeenCalled()); + + const updateItem = document.querySelector('[data-action="update-from-comfy"]'); + expect(updateItem.classList.contains('disabled')).toBe(true); + }); + + it('keeps update-from-comfy disabled when the open workflow has no edits', async () => { + fetchComfyuiStateMock.mockResolvedValue([ + { client_id: 'c1', file_path: '/library/workflows/flow.json', dirty: false }, + ]); + + menu.showMenu(10, 10, card); + await vi.waitFor(() => expect(fetchComfyuiStateMock).toHaveBeenCalled()); + + const updateItem = document.querySelector('[data-action="update-from-comfy"]'); + expect(updateItem.classList.contains('disabled')).toBe(true); + }); + + it('enables update-from-comfy when the workflow is open in ComfyUI with edits', async () => { + fetchComfyuiStateMock.mockResolvedValue([ + { client_id: 'c1', file_path: '/library/workflows/flow.json', dirty: true }, + ]); + + menu.showMenu(10, 10, card); + await vi.waitFor(() => { + const updateItem = document.querySelector('[data-action="update-from-comfy"]'); + expect(updateItem.classList.contains('disabled')).toBe(false); + }); + }); + + it('triggers the write-back flow on update-from-comfy', async () => { + updateFromComfyMock.mockResolvedValue({ success: true, sha256: 'newhash123' }); + + menu.handleMenuAction('update-from-comfy'); + await vi.waitFor(() => + expect(updateFromComfyMock).toHaveBeenCalledWith('/library/workflows/flow.json') + ); + await vi.waitFor(() => + expect(showToastMock).toHaveBeenCalledWith( + 'workflows.updateFromComfy.success', + {}, + 'success' + ) + ); + // The card is refreshed in place so it shows the "Updated" cue. + expect(updateSingleItemMock).toHaveBeenCalledWith('/library/workflows/flow.json', { + sha256: 'newhash123', + }); + }); + + it('surfaces no_changes as an info toast', async () => { + const error = new Error('no_changes'); + error.kind = 'no_changes'; + updateFromComfyMock.mockRejectedValue(error); + + menu.handleMenuAction('update-from-comfy'); + await vi.waitFor(() => + expect(showToastMock).toHaveBeenCalledWith( + 'workflows.updateFromComfy.noChanges', + {}, + 'info' + ) + ); + }); + + it('disables restore-download for local-only .json workflows', () => { + stateStub.virtualScroller.items = [ + { file_path: '/library/workflows/flow.json', from_civitai: false }, + ]; + + menu.showMenu(10, 10, card); + + const restoreItem = document.querySelector('[data-action="restore-download"]'); + expect(restoreItem.classList.contains('disabled')).toBe(true); + }); + + it('enables restore-download for CivitAI-sourced .json workflows', () => { + stateStub.virtualScroller.items = [ + { file_path: '/library/workflows/flow.json', from_civitai: true }, + ]; + + menu.showMenu(10, 10, card); + + const restoreItem = document.querySelector('[data-action="restore-download"]'); + expect(restoreItem.classList.contains('disabled')).toBe(false); + }); + + it('enables restore-download for container artifacts without CivitAI data', () => { + card.dataset.filepath = '/library/workflows/pack.zip'; + + menu.showMenu(10, 10, card); + + const restoreItem = document.querySelector('[data-action="restore-download"]'); + expect(restoreItem.classList.contains('disabled')).toBe(false); + }); + + it('restores the workflow on restore-download after confirmation', async () => { + showConfirmationModalMock.mockResolvedValue(true); + restoreMock.mockResolvedValue({ success: true, restored: 'downloaded', sha256: 'restoredsha' }); + + menu.handleMenuAction('restore-download'); + await vi.waitFor(() => + expect(restoreMock).toHaveBeenCalledWith('/library/workflows/flow.json') + ); + await vi.waitFor(() => + expect(showToastMock).toHaveBeenCalledWith( + 'workflows.restoreDownloaded.success', + {}, + 'success' + ) + ); + // The confirmation goes through the app's modal, not the browser dialog. + expect(showConfirmationModalMock).toHaveBeenCalledWith( + expect.objectContaining({ danger: true }) + ); + // A blocking indicator covers the (potentially slow) re-download. + expect(showSimpleLoadingMock).toHaveBeenCalled(); + expect(hideLoadingMock).toHaveBeenCalled(); + // The card is refreshed in place so it shows the "Updated" cue. + expect(updateSingleItemMock).toHaveBeenCalledWith('/library/workflows/flow.json', { + sha256: 'restoredsha', + }); + }); + + it('does not call restore when the confirmation is declined', async () => { + showConfirmationModalMock.mockResolvedValue(false); + + menu.handleMenuAction('restore-download'); + await vi.waitFor(() => expect(showConfirmationModalMock).toHaveBeenCalled()); + + expect(restoreMock).not.toHaveBeenCalled(); + expect(showSimpleLoadingMock).not.toHaveBeenCalled(); + }); + + it('shows an error toast when restore fails and still hides the loading', async () => { + showConfirmationModalMock.mockResolvedValue(true); + const error = new Error('Workflow has no recorded CivitAI source to restore from'); + error.kind = 'no_source'; + restoreMock.mockRejectedValue(error); + + menu.handleMenuAction('restore-download'); + await vi.waitFor(() => + expect(showToastMock).toHaveBeenCalledWith( + 'workflows.restoreDownloaded.failed', + { message: 'Workflow has no recorded CivitAI source to restore from' }, + 'error' + ) + ); + expect(hideLoadingMock).toHaveBeenCalled(); + }); +}); diff --git a/tests/frontend/core/workflowRegistry.test.js b/tests/frontend/core/workflowRegistry.test.js index c05a5798..a19671b4 100644 --- a/tests/frontend/core/workflowRegistry.test.js +++ b/tests/frontend/core/workflowRegistry.test.js @@ -289,6 +289,54 @@ describe("LoraManager.WorkflowRegistry", () => { expect(appMock.loadApiJson).not.toHaveBeenCalled(); }); + it("stamps the lm_source marker into extra for UI-format workflows", async () => { + const workflow = { nodes: [{ id: 1 }], links: [], extra: { ds: { scale: 1 } } }; + + await extension.loadWorkflowFromMessage({ + workflow, + name: "Managed", + lm_source: { file_path: "/lib/flow.json", sha256: "abc123" }, + }); + + const loaded = appMock.loadGraphData.mock.calls[0][0]; + expect(loaded.extra.lm_source).toEqual({ + file_path: "/lib/flow.json", + sha256: "abc123", + }); + // Pre-existing extra keys are preserved. + expect(loaded.extra.ds).toEqual({ scale: 1 }); + }); + + it("stamps the lm_source marker onto the live graph for API-format workflows", async () => { + const rootGraph = { extra: undefined }; + appMock.rootGraph = rootGraph; + try { + const workflow = { "1": { class_type: "KSampler", inputs: {} } }; + + await extension.loadWorkflowFromMessage({ + workflow, + name: "Managed API", + lm_source: { file_path: "/lib/flow.json", sha256: null }, + }); + + expect(rootGraph.extra.lm_source).toEqual({ + file_path: "/lib/flow.json", + sha256: null, + }); + } finally { + delete appMock.rootGraph; + } + }); + + it("does not add a marker when the payload has no lm_source", async () => { + const workflow = { nodes: [{ id: 1 }], links: [] }; + + await extension.loadWorkflowFromMessage({ workflow, name: "Plain" }); + + const loaded = appMock.loadGraphData.mock.calls[0][0]; + expect(loaded.extra).toBeUndefined(); + }); + it("defaults the workflow name to 'Recipe Workflow'", async () => { const workflow = { nodes: [], links: [] }; diff --git a/tests/frontend/core/workflowWriteback.test.js b/tests/frontend/core/workflowWriteback.test.js new file mode 100644 index 00000000..380d1d84 --- /dev/null +++ b/tests/frontend/core/workflowWriteback.test.js @@ -0,0 +1,310 @@ +import { beforeEach, describe, expect, it, vi } from "vitest"; + +const { + APP_MODULE, + API_MODULE, + UTILS_MODULE, + WRITEBACK_MODULE, + appMock, + apiMock, + toastMock, + registeredExtensions, +} = vi.hoisted(() => { + const registeredExtensions = []; + const appMock = { + rootGraph: null, + graph: null, + registerExtension: (ext) => registeredExtensions.push(ext), + }; + const apiMock = { + clientId: "client-1", + initialClientId: null, + listeners: {}, + addEventListener: (event, handler) => { + (apiMock.listeners[event] ??= []).push(handler); + }, + }; + const toastMock = vi.fn(); + return { + APP_MODULE: new URL("../../../scripts/app.js", import.meta.url).pathname, + API_MODULE: new URL("../../../scripts/api.js", import.meta.url).pathname, + UTILS_MODULE: new URL("../../../web/comfyui/utils.js", import.meta.url).pathname, + WRITEBACK_MODULE: new URL("../../../web/comfyui/workflow_writeback.js", import.meta.url).pathname, + appMock, + apiMock, + toastMock, + registeredExtensions, + }; +}); + +vi.mock(APP_MODULE, () => ({ app: appMock })); +vi.mock(API_MODULE, () => ({ api: apiMock })); +vi.mock(UTILS_MODULE, () => ({ showToast: toastMock })); + +function createRootGraph({ marker = null, serialized = null } = {}) { + const extra = marker ? { lm_source: marker, ds: { scale: 1 } } : { ds: { scale: 1 } }; + return { + extra, + serialize: vi.fn(() => serialized ?? { nodes: [], links: [], extra: JSON.parse(JSON.stringify(extra)) }), + }; +} + +function fetchCalls(fetchMock, url) { + return fetchMock.mock.calls.filter(([callUrl]) => callUrl === url); +} + +function okResponse(body = { success: true, sha256: "new-hash" }) { + return { status: 200, json: async () => body }; +} + +describe("LoraManager.WorkflowWriteback", () => { + let extension; + let moduleExports; + let fetchMock; + + beforeEach(async () => { + vi.resetModules(); + registeredExtensions.length = 0; + apiMock.listeners = {}; + appMock.rootGraph = null; + appMock.graph = null; + toastMock.mockClear(); + fetchMock = vi.fn().mockResolvedValue(okResponse()); + global.fetch = fetchMock; + moduleExports = await import(WRITEBACK_MODULE); + extension = registeredExtensions.find( + (ext) => ext.name === "LoraManager.WorkflowWriteback" + ); + expect(extension).toBeDefined(); + }); + + it("registers the write-back command in the File menu group", () => { + expect(extension.commands).toHaveLength(1); + expect(extension.commands[0].id).toBe("LoraManager.UpdateManagedWorkflow"); + expect(extension.menuCommands).toEqual([ + { path: ["File"], commands: ["LoraManager.UpdateManagedWorkflow"] }, + ]); + }); + + describe("getActiveLmSource", () => { + it("returns null when the graph carries no marker", () => { + appMock.rootGraph = createRootGraph(); + expect(moduleExports.getActiveLmSource()).toBeNull(); + }); + + it("returns the marker when present", () => { + const marker = { file_path: "/lib/flow.json", sha256: "abc" }; + appMock.rootGraph = createRootGraph({ marker }); + expect(moduleExports.getActiveLmSource()).toBe(marker); + }); + + it("returns null when the marker has no usable file_path", () => { + appMock.rootGraph = createRootGraph({ marker: { sha256: "abc" } }); + expect(moduleExports.getActiveLmSource()).toBeNull(); + }); + }); + + describe("link state reporting", () => { + it("reports the marker state after a graph load (afterConfigureGraph)", async () => { + const marker = { file_path: "/lib/flow.json", sha256: "abc" }; + appMock.rootGraph = createRootGraph({ marker }); + + await extension.afterConfigureGraph(); + + const reports = fetchCalls(fetchMock, "/api/lm/workflows/comfyui-state"); + expect(reports).toHaveLength(1); + const body = JSON.parse(reports[0][1].body); + expect(body).toEqual({ + client_id: "client-1", + state: { file_path: "/lib/flow.json", sha256: "abc", dirty: false }, + }); + }); + + it("reports a null state when the active graph is not LM-linked", async () => { + appMock.rootGraph = createRootGraph(); + + await extension.afterConfigureGraph(); + + const reports = fetchCalls(fetchMock, "/api/lm/workflows/comfyui-state"); + const body = JSON.parse(reports[0][1].body); + expect(body.state).toBeNull(); + }); + + it("marks the graph dirty and reports on the first graphChanged", async () => { + const marker = { file_path: "/lib/flow.json", sha256: "abc" }; + appMock.rootGraph = createRootGraph({ marker }); + extension.setup(); + + const handler = apiMock.listeners["graphChanged"][0]; + handler({}); + expect(marker.dirty).toBe(true); + await vi.waitFor(() => + expect(fetchCalls(fetchMock, "/api/lm/workflows/comfyui-state")).toHaveLength(1) + ); + const body = JSON.parse( + fetchCalls(fetchMock, "/api/lm/workflows/comfyui-state")[0][1].body + ); + expect(body.state.dirty).toBe(true); + + // A second change does not re-report (already dirty). + handler({}); + expect(fetchCalls(fetchMock, "/api/lm/workflows/comfyui-state")).toHaveLength(1); + }); + + it("ignores graphChanged when the active graph is not LM-linked", () => { + appMock.rootGraph = createRootGraph(); + extension.setup(); + + apiMock.listeners["graphChanged"][0]({}); + expect(fetchCalls(fetchMock, "/api/lm/workflows/comfyui-state")).toHaveLength(0); + }); + }); + + describe("updateManagedWorkflow", () => { + it("warns and does not call the backend without a marker", async () => { + appMock.rootGraph = createRootGraph(); + + await moduleExports.updateManagedWorkflow(); + + expect(fetchCalls(fetchMock, "/api/lm/workflows/content")).toHaveLength(0); + expect(toastMock).toHaveBeenCalledWith( + expect.objectContaining({ severity: "warn" }) + ); + }); + + it("PUTs the serialized graph without the marker and refreshes the hash", async () => { + const marker = { file_path: "/lib/flow.json", sha256: "old-hash", dirty: true }; + appMock.rootGraph = createRootGraph({ marker }); + + await moduleExports.updateManagedWorkflow(); + + const puts = fetchCalls(fetchMock, "/api/lm/workflows/content"); + expect(puts).toHaveLength(1); + const [url, options] = puts[0]; + expect(url).toBe("/api/lm/workflows/content"); + expect(options.method).toBe("PUT"); + const body = JSON.parse(options.body); + expect(body.file_path).toBe("/lib/flow.json"); + expect(body.base_sha256).toBe("old-hash"); + expect(body.force).toBe(false); + expect(body.workflow.extra.lm_source).toBeUndefined(); + // Other extra keys survive the strip. + expect(body.workflow.extra.ds).toEqual({ scale: 1 }); + + expect(marker.sha256).toBe("new-hash"); + // Write-back clears the dirty flag and re-reports the link state. + expect(marker.dirty).toBe(false); + await vi.waitFor(() => + expect(fetchCalls(fetchMock, "/api/lm/workflows/comfyui-state")).toHaveLength(1) + ); + expect(toastMock).toHaveBeenCalledWith( + expect.objectContaining({ severity: "success" }) + ); + }); + + it("retries with force after a conflict only when the user confirms", async () => { + const marker = { file_path: "/lib/flow.json", sha256: "old-hash", dirty: true }; + appMock.rootGraph = createRootGraph({ marker }); + + const confirmMock = vi.fn().mockReturnValue(false); + vi.stubGlobal("confirm", confirmMock); + fetchMock.mockImplementation(async (url) => + url === "/api/lm/workflows/content" + ? { status: 409, json: async () => ({ success: false, error: "conflict" }) } + : okResponse() + ); + + await moduleExports.updateManagedWorkflow(); + expect(fetchCalls(fetchMock, "/api/lm/workflows/content")).toHaveLength(1); + expect(toastMock).not.toHaveBeenCalledWith( + expect.objectContaining({ severity: "success" }) + ); + + confirmMock.mockReturnValue(true); + let conflictServed = false; + fetchMock.mockImplementation(async (url) => { + if (url !== "/api/lm/workflows/content") return okResponse(); + if (!conflictServed) { + conflictServed = true; + return { status: 409, json: async () => ({ success: false, error: "conflict" }) }; + } + return okResponse({ success: true, sha256: "forced-hash" }); + }); + + await moduleExports.updateManagedWorkflow(); + const puts = fetchCalls(fetchMock, "/api/lm/workflows/content"); + expect(puts).toHaveLength(3); + const forcedBody = JSON.parse(puts[2][1].body); + expect(forcedBody.force).toBe(true); + expect(marker.sha256).toBe("forced-hash"); + + vi.unstubAllGlobals(); + }); + + it("reports backend errors via toast", async () => { + const marker = { file_path: "/lib/flow.json", sha256: "abc", dirty: true }; + appMock.rootGraph = createRootGraph({ marker }); + fetchMock.mockResolvedValue({ + status: 400, + json: async () => ({ success: false, error: "workflow is not a ComfyUI graph document" }), + }); + + await moduleExports.updateManagedWorkflow(); + + expect(toastMock).toHaveBeenCalledWith( + expect.objectContaining({ severity: "error" }) + ); + }); + }); + + describe("lm_collect_workflow handling", () => { + function fireCollect(detail) { + extension.setup(); + const handler = apiMock.listeners["lm_collect_workflow"][0]; + return handler({ detail }); + } + + it("ignores requests for workflows this tab does not hold", async () => { + const marker = { file_path: "/lib/other.json", sha256: "abc", dirty: true }; + appMock.rootGraph = createRootGraph({ marker }); + + await fireCollect({ request_id: "r1", file_path: "/lib/flow.json" }); + + expect(fetchCalls(fetchMock, "/api/lm/workflows/content")).toHaveLength(0); + expect(fetchCalls(fetchMock, "/api/lm/workflows/collect-result")).toHaveLength(0); + }); + + it("answers no_changes without writing back when the graph is clean", async () => { + const marker = { file_path: "/lib/flow.json", sha256: "abc", dirty: false }; + appMock.rootGraph = createRootGraph({ marker }); + + await fireCollect({ request_id: "r2", file_path: "/lib/flow.json" }); + + expect(fetchCalls(fetchMock, "/api/lm/workflows/content")).toHaveLength(0); + const results = fetchCalls(fetchMock, "/api/lm/workflows/collect-result"); + expect(results).toHaveLength(1); + expect(JSON.parse(results[0][1].body)).toEqual({ + request_id: "r2", + success: false, + error: "no_changes", + }); + }); + + it("writes back and posts the outcome when the graph is dirty", async () => { + const marker = { file_path: "/lib/flow.json", sha256: "old-hash", dirty: true }; + appMock.rootGraph = createRootGraph({ marker }); + + await fireCollect({ request_id: "r3", file_path: "/lib/flow.json" }); + + expect(fetchCalls(fetchMock, "/api/lm/workflows/content")).toHaveLength(1); + const results = fetchCalls(fetchMock, "/api/lm/workflows/collect-result"); + expect(results).toHaveLength(1); + expect(JSON.parse(results[0][1].body)).toEqual({ + request_id: "r3", + success: true, + sha256: "new-hash", + }); + expect(marker.dirty).toBe(false); + }); + }); +}); diff --git a/tests/frontend/managers/downloadManager.reconcileView.test.js b/tests/frontend/managers/downloadManager.reconcileView.test.js index e2f00fec..38c4aff2 100644 --- a/tests/frontend/managers/downloadManager.reconcileView.test.js +++ b/tests/frontend/managers/downloadManager.reconcileView.test.js @@ -209,8 +209,25 @@ describe('DownloadManager post-download in-place reconciliation (#1078)', () => }); }); - describe('_reconcileViewAfterDownload', () => { - it('removes the model cards in the Updates view when the latest version was installed', async () => { + describe('_computeWasLocallyOwned', () => { + it('returns null when no version list is available', () => { + expect(manager._computeWasLocallyOwned(null)).toBe(null); + expect(manager._computeWasLocallyOwned(undefined)).toBe(null); + expect(manager._computeWasLocallyOwned([])).toBe(null); + }); + + it('returns true when any version was already local', () => { + const versions = [{ id: 1, existsLocally: false }, { id: 2, existsLocally: true }]; + expect(manager._computeWasLocallyOwned(versions)).toBe(true); + }); + + it('returns false when no version was local (brand-new model)', () => { + const versions = [{ id: 1, existsLocally: false }, { id: 2, existsLocally: false }]; + expect(manager._computeWasLocallyOwned(versions)).toBe(false); + }); + }); + + describe('_reconcileViewAfterDownload', () => { it('removes the model cards in the Updates view when the latest version was installed', async () => { stateMock.virtualScroller.items = [ makeItem('/models/loras/old.safetensors', 837884), makeItem('/models/loras/unrelated.safetensors', 999999), @@ -260,11 +277,15 @@ describe('DownloadManager post-download in-place reconciliation (#1078)', () => expect(sidebarRefreshMock).toHaveBeenCalledTimes(1); }); - it('keeps the listing untouched when the downloaded model is not in the current view', async () => { + it('keeps the listing untouched when an owned model is not in the current view', async () => { stateMock.virtualScroller.items = [makeItem('/models/loras/other.safetensors', 999999)]; mockApiClient.getPageState.mockReturnValue({ showUpdateAvailableOnly: true }); - const result = await manager._reconcileViewAfterDownload({ modelId: 837884, isLatestVersion: true }); + const result = await manager._reconcileViewAfterDownload({ + modelId: 837884, + isLatestVersion: true, + wasLocallyOwned: true, + }); expect(result).toBe(false); expect(mockScroller.removeMultipleItemsByFilePath).not.toHaveBeenCalled(); @@ -273,6 +294,34 @@ describe('DownloadManager post-download in-place reconciliation (#1078)', () => expect(sidebarRefreshMock).toHaveBeenCalledTimes(1); }); + it('reloads the listing when a brand-new model has no card to reconcile', async () => { + stateMock.virtualScroller.items = [makeItem('/models/loras/other.safetensors', 999999)]; + mockApiClient.getPageState.mockReturnValue({ showUpdateAvailableOnly: true }); + + const result = await manager._reconcileViewAfterDownload({ + modelId: 837884, + isLatestVersion: true, + wasLocallyOwned: false, + }); + + expect(result).toBe(true); + expect(resetAndReloadMock).toHaveBeenCalledWith(true); + expect(mockScroller.removeMultipleItemsByFilePath).not.toHaveBeenCalled(); + expect(mockScroller.updateSingleItem).not.toHaveBeenCalled(); + expect(sidebarRefreshMock).not.toHaveBeenCalled(); + }); + + it('reloads the listing when ownership is unknown and no card matches', async () => { + stateMock.virtualScroller.items = [makeItem('/models/loras/other.safetensors', 999999)]; + mockApiClient.getPageState.mockReturnValue({ showUpdateAvailableOnly: true }); + + const result = await manager._reconcileViewAfterDownload({ modelId: 837884, isLatestVersion: true }); + + expect(result).toBe(true); + expect(resetAndReloadMock).toHaveBeenCalledWith(true); + expect(sidebarRefreshMock).not.toHaveBeenCalled(); + }); + it('no-ops for models without a CivitAI identity (HF downloads)', async () => { stateMock.virtualScroller.items = [makeItem('/models/loras/a.safetensors', 123)]; mockApiClient.getPageState.mockReturnValue({ showUpdateAvailableOnly: true }); diff --git a/tests/routes/__snapshots__/test_api_snapshots.ambr b/tests/routes/__snapshots__/test_api_snapshots.ambr index 3a77ede1..566fe4d3 100644 --- a/tests/routes/__snapshots__/test_api_snapshots.ambr +++ b/tests/routes/__snapshots__/test_api_snapshots.ambr @@ -36,6 +36,8 @@ 'sidecar_storage_root_is_default': True, 'standalone_mode': False, 'theme': 'dark', + 'workflow_folder_paths': list([ + ]), }), 'success': True, }) diff --git a/tests/routes/test_filesystem_paths.py b/tests/routes/test_filesystem_paths.py index 586854e2..fe0e8179 100644 --- a/tests/routes/test_filesystem_paths.py +++ b/tests/routes/test_filesystem_paths.py @@ -60,6 +60,25 @@ async def test_browse_directory_lists_subdirs_sorted_and_filters(tmp_path): assert payload["directory_count"] == 2 +@pytest.mark.asyncio +async def test_browse_directory_preserves_symlinked_path(tmp_path): + # The picker result is stored as a configured library path (a business + # path): browsing through a symlink must keep the link path instead of + # resolving to the target. + real = tmp_path / "real-target" + real.mkdir() + (real / "child").mkdir() + link = tmp_path / "link" + link.symlink_to(real) + + response, payload = await _browse(_make_handler(), str(link)) + + assert response.status == 200 + assert payload["success"] is True + assert payload["current_path"] == str(link) + assert payload["directories"][0]["path"] == str(link / "child") + + @pytest.mark.asyncio async def test_browse_directory_missing_returns_404(tmp_path): response, payload = await _browse(_make_handler(), str(tmp_path / "nope")) @@ -81,9 +100,9 @@ async def test_browse_directory_file_path_returns_400(tmp_path): @pytest.mark.asyncio async def test_browse_directory_relative_path_returns_403(monkeypatch): - # resolve() normally absolutizes relative paths against the cwd; bypass it + # abspath() normally absolutizes relative paths against the cwd; bypass it # to exercise the access-denied branch directly. - monkeypatch.setattr(Path, "resolve", lambda self: self) + monkeypatch.setattr(os.path, "abspath", lambda p: p) response, payload = await _browse(_make_handler(), "relative/path") diff --git a/tests/routes/test_misc_routes.py b/tests/routes/test_misc_routes.py index b6524fe0..216c6690 100644 --- a/tests/routes/test_misc_routes.py +++ b/tests/routes/test_misc_routes.py @@ -80,6 +80,9 @@ class DummySettings: def is_other_models_enabled(self): return bool(self.data.get("enable_other_models", False)) + def is_workflows_enabled(self): + return bool(self.data.get("enable_workflows", False)) + def get_enabled_other_sub_types(self): return list(self.data.get("enabled_other_sub_types") or []) diff --git a/tests/routes/test_settings_handler.py b/tests/routes/test_settings_handler.py index a556464f..ef9d8d40 100644 --- a/tests/routes/test_settings_handler.py +++ b/tests/routes/test_settings_handler.py @@ -291,3 +291,61 @@ async def test_get_settings_standalone_filters_template_placeholders( "loras": ["/real/loras"], "vae": [], } + + +@pytest.mark.asyncio +async def test_get_settings_exposes_workflow_folder_paths_in_plugin_mode( + monkeypatch, patch_other_models_availability +): + """Workflow roots are LoRA-Manager-owned in both modes, so they sync to + the frontend even where the host-owned folder_paths stay hidden.""" + monkeypatch.delenv("LORA_MANAGER_STANDALONE", raising=False) + handler = make_get_handler({"language": "en"}) + handler._settings.get_workflow_folder_paths = lambda: ["/library/workflows"] + + response = await handler.get_settings(FakeRequest()) + payload = json_payload(response) + + assert response.status == 200 + settings = payload["settings"] + assert settings["standalone_mode"] is False + assert "folder_paths" not in settings + assert settings["workflow_folder_paths"] == ["/library/workflows"] + + +@pytest.mark.asyncio +async def test_get_settings_workflow_folder_paths_fallback_when_stub_lacks_method( + monkeypatch, patch_other_models_availability +): + monkeypatch.delenv("LORA_MANAGER_STANDALONE", raising=False) + handler = make_get_handler({"language": "en"}) + + response = await handler.get_settings(FakeRequest()) + payload = json_payload(response) + + assert response.status == 200 + assert payload["settings"]["workflow_folder_paths"] == [] + + +@pytest.mark.asyncio +async def test_update_settings_routes_workflow_folder_paths_to_dedicated_merge( + monkeypatch, patch_other_models_availability +): + """The pseudo-key must merge into folder_paths server-side instead of + replacing the whole (partially host-owned) map via a generic set().""" + monkeypatch.delenv("LORA_MANAGER_STANDALONE", raising=False) + handler = make_get_handler({"language": "en"}) + recorded = [] + handler._settings.set_workflow_folder_paths = lambda value: recorded.append(value) or value + + response = await handler.update_settings( + FakeRequest(json_data={"workflow_folder_paths": ["/library/workflows"]}) + ) + payload = json_payload(response) + + assert response.status == 200 + assert payload["success"] is True + assert recorded == [["/library/workflows"]] + # The pseudo-key never lands in the generic set() path. + assert handler._settings.set_calls == [] + assert "workflow_folder_paths" not in handler._settings._values diff --git a/tests/routes/test_workflow_routes.py b/tests/routes/test_workflow_routes.py new file mode 100644 index 00000000..2e34c51a --- /dev/null +++ b/tests/routes/test_workflow_routes.py @@ -0,0 +1,1071 @@ +import json +import os + +import pytest +from aiohttp import web + +from py.routes.workflow_routes import WorkflowRoutes +from py.services.workflow_service import WorkflowService + + +class DummyRequest: + def __init__(self, *, match_info=None, method="POST", query=None, body=None): + self.match_info = match_info or {} + self.method = method + self.query = query or {} + self._body = body + + async def json(self): + if isinstance(self._body, Exception): + raise self._body + return self._body + + +class StubScanner: + def __init__(self, roots=None): + self._roots = roots or [] + + def get_model_roots(self): + return list(self._roots) + + +class StubWorkflowService: + def __init__(self, roots=None): + self.info = {} + self.scanner = StubScanner(roots) + + async def get_model_info_by_name(self, name): + value = self.info.get(name) + if isinstance(value, Exception): + raise value + return value + + +@pytest.fixture +def routes(): + handler = WorkflowRoutes() + handler.service = StubWorkflowService() # pyright: ignore[reportAttributeAccessIssue] + return handler + + +@pytest.fixture(autouse=True) +def enable_workflows(): + """Workflow management is opt-in; these tests exercise the enabled state.""" + from py.services.settings_manager import get_settings_manager + + manager = get_settings_manager() + manager.set("enable_workflows", True) + yield + manager.set("enable_workflows", False) + + +@pytest.fixture +def plugin_mode(monkeypatch): + """send_to_comfy refuses to run in standalone mode; default to plugin mode.""" + monkeypatch.delenv("LORA_MANAGER_STANDALONE", raising=False) + + +def test_common_and_specific_routes_registered(): + """Registration smoke test: /api/lm/workflows/* surface plus the page.""" + app = web.Application() + WorkflowRoutes().setup_routes(app) + + registered = {(route.method, route.resource.canonical) for route in app.router.routes()} + + assert ("GET", "/workflows") in registered + assert ("GET", "/api/lm/workflows/list") in registered + assert ("GET", "/api/lm/workflows/model-types") in registered + assert ("GET", "/api/lm/workflows/roots") in registered + assert ("POST", "/api/lm/workflows/fetch-civitai") in registered + assert ("POST", "/api/lm/workflows/delete") in registered + assert ("POST", "/api/lm/workflows/move_model") in registered + assert ("GET", "/api/lm/workflows/info/{name}") in registered + # The companion browser extension is GET-only (see AGENTS.md). + assert ("POST", "/api/lm/workflows/send-to-comfy") in registered + assert ("GET", "/api/lm/workflows/send-to-comfy") in registered + assert ("GET", "/api/lm/workflows/content") in registered + # Write-back from the ComfyUI-side "Update LM-managed workflow" entry. + assert ("PUT", "/api/lm/workflows/content") in registered + # Link-state reporting + LM-page-triggered write-back ("Update from ComfyUI"). + assert ("POST", "/api/lm/workflows/comfyui-state") in registered + assert ("GET", "/api/lm/workflows/comfyui-state") in registered + assert ("POST", "/api/lm/workflows/update-from-comfy") in registered + assert ("POST", "/api/lm/workflows/collect-result") in registered + # Restore to downloaded state ("Restore Downloaded Version" card menu entry). + assert ("POST", "/api/lm/workflows/restore") in registered + + +def test_template_name_is_workflows_page(): + assert WorkflowRoutes().template_name == "workflows.html" + + +@pytest.mark.parametrize( + "model_type", + ["Workflows", "workflows", "ComfyWorkflows", "comfyworkflows"], +) +def test_validate_civitai_model_type_accepts_workflow_types(model_type): + assert WorkflowRoutes()._validate_civitai_model_type(model_type) is True + + +@pytest.mark.parametrize( + "model_type", ["Lora", "Checkpoint", "TextualInversion", "VAE", "Other"] +) +def test_validate_civitai_model_type_rejects_foreign_types(model_type): + assert WorkflowRoutes()._validate_civitai_model_type(model_type) is False + + +def test_validate_rejects_everything_when_feature_disabled(): + from py.services.settings_manager import get_settings_manager + + get_settings_manager().set("enable_workflows", False) + + handler = WorkflowRoutes() + for model_type in ("Workflows", "ComfyWorkflows"): + assert handler._validate_civitai_model_type(model_type) is False + + +def test_page_context_reports_feature_state(monkeypatch): + from py.config import config + from py.services.settings_manager import get_settings_manager + + manager = get_settings_manager() + handler = WorkflowRoutes() + provider = handler._get_page_context_provider() + + monkeypatch.setattr(config, "workflows_roots", ["/library/workflows"], raising=False) + context = provider(None) + assert context["workflows_disabled"] is False + assert context["workflows_no_paths"] is False + + # Enabled but nothing configured: the page must explain how to fix it. + monkeypatch.setattr(config, "workflows_roots", [], raising=False) + context = provider(None) + assert context["workflows_disabled"] is False + assert context["workflows_no_paths"] is True + + manager.set("enable_workflows", False) + assert provider(None) == {"workflows_disabled": True, "workflows_no_paths": False} + + +def test_page_context_exposes_settings_file_in_standalone(monkeypatch): + """Standalone users must edit settings.json by hand; the empty state + needs the real file path to point them at.""" + from py.config import config + from py.services.settings_manager import get_settings_manager + + manager = get_settings_manager() + handler = WorkflowRoutes() + provider = handler._get_page_context_provider() + + monkeypatch.setattr(config, "workflows_roots", [], raising=False) + monkeypatch.setenv("LORA_MANAGER_STANDALONE", "1") + + context = provider(None) + assert context["workflows_no_paths"] is True + assert context["standalone_mode"] is True + assert context["settings_file"] == manager.settings_file + + +def test_get_expected_model_types_mentions_workflows(): + expected = WorkflowRoutes()._get_expected_model_types() + assert "Workflows" in expected + assert "ComfyWorkflows" in expected + + +def test_find_model_file_prefers_config_json_then_archive_zip(): + handler = WorkflowRoutes() + files = [ + {"id": 3, "type": "Archive", "name": "bundle.zip"}, + {"id": 2, "type": "Config", "name": "workflow.json"}, + {"id": 1, "type": "Model", "name": "weights.safetensors"}, + ] + assert handler._find_model_file(files)["name"] == "workflow.json" + + # Without a Config .json, the Archive .zip is the CivitAI default pick. + assert handler._find_model_file(files[0:1] + files[2:])["name"] == "bundle.zip" + + +async def test_get_workflow_info_success(routes): + routes.service.info["demo"] = {"name": "demo"} + response = await routes.get_workflow_info(DummyRequest(match_info={"name": "demo"})) + payload = json.loads(response.text) + assert payload == {"name": "demo"} + + +async def test_get_workflow_info_missing(routes): + response = await routes.get_workflow_info(DummyRequest(match_info={"name": "missing"})) + payload = json.loads(response.text) + assert response.status == 404 + assert payload == {"error": "Workflow not found"} + + +async def test_get_workflow_info_error(routes): + routes.service.info["demo"] = RuntimeError("boom") + response = await routes.get_workflow_info(DummyRequest(match_info={"name": "demo"})) + payload = json.loads(response.text) + assert response.status == 500 + assert payload == {"error": "boom"} + + +@pytest.mark.asyncio +async def test_initialize_services_builds_workflow_service(monkeypatch): + from py.services.service_registry import ServiceRegistry + + sentinel_scanner = object() + sentinel_update_service = object() + + async def fake_scanner(): + return sentinel_scanner + + async def fake_update_service(): + return sentinel_update_service + + monkeypatch.setattr(ServiceRegistry, "get_workflow_scanner", staticmethod(fake_scanner)) + monkeypatch.setattr( + ServiceRegistry, "get_model_update_service", staticmethod(fake_update_service) + ) + + handler = WorkflowRoutes() + await handler.initialize_services() + + assert isinstance(handler.service, WorkflowService) + assert handler.service.model_type == "workflow" + assert handler.service.scanner is sentinel_scanner + + +async def test_send_to_comfy_rejected_in_standalone(routes, monkeypatch): + monkeypatch.setenv("LORA_MANAGER_STANDALONE", "1") + response = await routes.send_to_comfy( + DummyRequest(body={"file_path": "/library/workflows/flow.json"}) + ) + payload = json.loads(response.text) + assert response.status == 400 + assert payload["success"] is False + + +async def test_send_to_comfy_rejected_when_feature_disabled(routes, plugin_mode): + from py.services.settings_manager import get_settings_manager + + get_settings_manager().set("enable_workflows", False) + response = await routes.send_to_comfy( + DummyRequest(body={"file_path": "/library/workflows/flow.json"}) + ) + payload = json.loads(response.text) + assert response.status == 400 + assert payload["success"] is False + + +async def test_send_to_comfy_requires_file_path(routes, plugin_mode): + response = await routes.send_to_comfy(DummyRequest(body={})) + payload = json.loads(response.text) + assert response.status == 400 + assert payload == {"success": False, "error": "file_path is required"} + + +async def test_send_to_comfy_rejects_path_outside_library(routes, plugin_mode, tmp_path): + root = tmp_path / "workflows" + root.mkdir() + routes.service.scanner = StubScanner([str(root)]) + + response = await routes.send_to_comfy( + DummyRequest(body={"file_path": str(tmp_path / "elsewhere.json")}) + ) + payload = json.loads(response.text) + assert response.status == 400 + assert payload["success"] is False + + +async def test_send_to_comfy_404_for_non_workflow_json(routes, plugin_mode, tmp_path): + root = tmp_path / "workflows" + root.mkdir() + target = root / "config.json" + target.write_text(json.dumps({"some": "config"}), encoding="utf-8") + routes.service.scanner = StubScanner([str(root)]) + + response = await routes.send_to_comfy(DummyRequest(body={"file_path": str(target)})) + payload = json.loads(response.text) + assert response.status == 404 + assert payload["error"] == "not_a_workflow" + + +async def test_send_to_comfy_broadcasts_workflow(routes, plugin_mode, tmp_path, monkeypatch): + """Pin PromptServer.instance: other suites leak a bare SimpleNamespace onto + the mocked server module, so never rely on the global mock state.""" + import server + from types import SimpleNamespace + from unittest.mock import MagicMock + + send_sync = MagicMock() + monkeypatch.setattr( + server.PromptServer, "instance", SimpleNamespace(send_sync=send_sync) + ) + + root = tmp_path / "workflows" + root.mkdir() + workflow = {"1": {"class_type": "CheckpointLoaderSimple", "inputs": {}}} + target = root / "flow.json" + target.write_text(json.dumps(workflow), encoding="utf-8") + routes.service.scanner = StubScanner([str(root)]) + + response = await routes.send_to_comfy(DummyRequest(body={"file_path": str(target)})) + payload = json.loads(response.text) + + assert payload == {"success": True, "sent": True} + send_sync.assert_called_once() + channel, message = send_sync.call_args.args + assert channel == "lm_load_workflow" + assert message["workflow"] == workflow + assert message["name"] == "flow" + # Provenance marker for the ComfyUI-side write-back entry point. + assert message["lm_source"]["file_path"] == str(target) + import hashlib + + assert message["lm_source"]["sha256"] == hashlib.sha256( + target.read_bytes() + ).hexdigest() + + +async def test_send_to_comfy_accepts_get_with_query(routes, plugin_mode, tmp_path, monkeypatch): + import server + from types import SimpleNamespace + from unittest.mock import MagicMock + + send_sync = MagicMock() + monkeypatch.setattr( + server.PromptServer, "instance", SimpleNamespace(send_sync=send_sync) + ) + + root = tmp_path / "workflows" + root.mkdir() + target = root / "flow.json" + target.write_text( + json.dumps({"1": {"class_type": "CheckpointLoaderSimple", "inputs": {}}}), + encoding="utf-8", + ) + routes.service.scanner = StubScanner([str(root)]) + + response = await routes.send_to_comfy( + DummyRequest(method="GET", query={"file_path": str(target)}) + ) + payload = json.loads(response.text) + assert payload == {"success": True, "sent": True} + send_sync.assert_called_once() + + +async def test_send_to_comfy_reads_derived_document_for_zip(routes, plugin_mode, tmp_path, monkeypatch): + """Container artifacts send the extracted document, not the zip bytes.""" + import server + import zipfile + from types import SimpleNamespace + from unittest.mock import MagicMock + + send_sync = MagicMock() + monkeypatch.setattr( + server.PromptServer, "instance", SimpleNamespace(send_sync=send_sync) + ) + + root = tmp_path / "workflows" + root.mkdir() + workflow = {"1": {"class_type": "CheckpointLoaderSimple", "inputs": {}}} + target = root / "pack.zip" + with zipfile.ZipFile(target, "w") as archive: + archive.writestr("workflow.json", json.dumps(workflow)) + routes.service.scanner = StubScanner([str(root)]) + + response = await routes.send_to_comfy(DummyRequest(body={"file_path": str(target)})) + payload = json.loads(response.text) + + assert payload == {"success": True, "sent": True} + send_sync.assert_called_once() + channel, message = send_sync.call_args.args + assert channel == "lm_load_workflow" + assert message["workflow"] == workflow + assert message["name"] == "pack" + # The marker hashes the derived document (what the write-back edits), not + # the zip bytes. + derived = root / "pack.workflow.json" + assert derived.exists() + import hashlib + + assert message["lm_source"] == { + "file_path": str(target), + "sha256": hashlib.sha256(derived.read_bytes()).hexdigest(), + } + + +async def test_get_workflow_content_returns_document(routes, tmp_path): + root = tmp_path / "workflows" + root.mkdir() + workflow = {"1": {"class_type": "CheckpointLoaderSimple", "inputs": {}}} + target = root / "flow.json" + target.write_text(json.dumps(workflow), encoding="utf-8") + routes.service.scanner = StubScanner([str(root)]) + + response = await routes.get_workflow_content( + DummyRequest(method="GET", query={"file_path": str(target)}) + ) + payload = json.loads(response.text) + + assert payload == {"success": True, "workflow": workflow} + + +async def test_get_workflow_content_works_in_standalone(routes, tmp_path, monkeypatch): + """The copy-to-clipboard flow needs no ComfyUI, unlike send-to-comfy.""" + monkeypatch.setenv("LORA_MANAGER_STANDALONE", "1") + + root = tmp_path / "workflows" + root.mkdir() + workflow = {"nodes": [{"id": 1, "type": "CLIPTextEncode"}], "links": []} + target = root / "flow.json" + target.write_text(json.dumps(workflow), encoding="utf-8") + routes.service.scanner = StubScanner([str(root)]) + + response = await routes.get_workflow_content( + DummyRequest(method="GET", query={"file_path": str(target)}) + ) + payload = json.loads(response.text) + + assert response.status == 200 + assert payload == {"success": True, "workflow": workflow} + + +async def test_get_workflow_content_reads_derived_document_for_zip(routes, tmp_path): + import zipfile + + root = tmp_path / "workflows" + root.mkdir() + workflow = {"1": {"class_type": "CheckpointLoaderSimple", "inputs": {}}} + target = root / "pack.zip" + with zipfile.ZipFile(target, "w") as archive: + archive.writestr("workflow.json", json.dumps(workflow)) + routes.service.scanner = StubScanner([str(root)]) + + response = await routes.get_workflow_content( + DummyRequest(method="GET", query={"file_path": str(target)}) + ) + payload = json.loads(response.text) + + assert payload == {"success": True, "workflow": workflow} + + +async def test_get_workflow_content_404_for_non_workflow_json(routes, tmp_path): + root = tmp_path / "workflows" + root.mkdir() + target = root / "config.json" + target.write_text(json.dumps({"some": "config"}), encoding="utf-8") + routes.service.scanner = StubScanner([str(root)]) + + response = await routes.get_workflow_content( + DummyRequest(method="GET", query={"file_path": str(target)}) + ) + payload = json.loads(response.text) + + assert response.status == 404 + assert payload["error"] == "not_a_workflow" + + +async def test_get_workflow_content_rejects_path_outside_library(routes, tmp_path): + root = tmp_path / "workflows" + root.mkdir() + routes.service.scanner = StubScanner([str(root)]) + + response = await routes.get_workflow_content( + DummyRequest(method="GET", query={"file_path": str(tmp_path / "elsewhere.json")}) + ) + payload = json.loads(response.text) + + assert response.status == 400 + assert payload["success"] is False + + +async def test_get_workflow_content_rejected_when_feature_disabled(routes, tmp_path): + from py.services.settings_manager import get_settings_manager + + get_settings_manager().set("enable_workflows", False) + response = await routes.get_workflow_content( + DummyRequest(method="GET", query={"file_path": "/library/workflows/flow.json"}) + ) + payload = json.loads(response.text) + + assert response.status == 400 + assert payload["success"] is False + + +async def test_update_workflow_content_rewrites_json_artifact(routes, tmp_path): + root = tmp_path / "workflows" + root.mkdir() + original = {"nodes": [{"id": 1, "type": "CLIPTextEncode"}], "links": []} + target = root / "flow.json" + target.write_text(json.dumps(original), encoding="utf-8") + routes.service.scanner = StubScanner([str(root)]) + + updated = { + "nodes": [ + {"id": 1, "type": "CLIPTextEncode"}, + {"id": 2, "type": "KSampler"}, + ], + "links": [], + # The client-side provenance marker must be stripped before persisting. + "extra": {"lm_source": {"file_path": str(target), "sha256": "x"}}, + } + response = await routes.update_workflow_content( + DummyRequest(method="PUT", body={"file_path": str(target), "workflow": updated}) + ) + payload = json.loads(response.text) + + assert response.status == 200 + assert payload["success"] is True + written = json.loads(target.read_text(encoding="utf-8")) + assert written["nodes"] == updated["nodes"] + assert "lm_source" not in written.get("extra", {}) + + +async def test_update_workflow_content_conflict_then_force(routes, tmp_path): + import hashlib + + root = tmp_path / "workflows" + root.mkdir() + target = root / "flow.json" + workflow = {"nodes": [{"id": 1, "type": "CLIPTextEncode"}], "links": []} + target.write_text(json.dumps(workflow), encoding="utf-8") + routes.service.scanner = StubScanner([str(root)]) + + stale_hash = hashlib.sha256(b"old-bytes").hexdigest() + response = await routes.update_workflow_content( + DummyRequest( + method="PUT", + body={ + "file_path": str(target), + "workflow": workflow, + "base_sha256": stale_hash, + }, + ) + ) + payload = json.loads(response.text) + + assert response.status == 409 + assert payload["error"] == "conflict" + assert payload["current_sha256"] == hashlib.sha256( + target.read_bytes() + ).hexdigest() + + forced = await routes.update_workflow_content( + DummyRequest( + method="PUT", + body={ + "file_path": str(target), + "workflow": workflow, + "base_sha256": stale_hash, + "force": True, + }, + ) + ) + assert json.loads(forced.text)["success"] is True + + +async def test_update_workflow_content_writes_derived_sidecar_for_zip(routes, tmp_path): + """Container artifacts stay byte-identical; edits land in the sidecar.""" + import zipfile + + root = tmp_path / "workflows" + root.mkdir() + target = root / "pack.zip" + with zipfile.ZipFile(target, "w") as archive: + archive.writestr( + "workflow.json", + json.dumps({"1": {"class_type": "CheckpointLoaderSimple", "inputs": {}}}), + ) + original_bytes = target.read_bytes() + routes.service.scanner = StubScanner([str(root)]) + + updated = {"nodes": [{"id": 1, "type": "KSampler"}], "links": []} + response = await routes.update_workflow_content( + DummyRequest(method="PUT", body={"file_path": str(target), "workflow": updated}) + ) + payload = json.loads(response.text) + + assert response.status == 200 + assert payload["success"] is True + assert target.read_bytes() == original_bytes + derived = root / "pack.workflow.json" + assert json.loads(derived.read_text(encoding="utf-8"))["nodes"] == updated["nodes"] + + +async def test_update_workflow_content_rejects_non_workflow(routes, tmp_path): + root = tmp_path / "workflows" + root.mkdir() + target = root / "flow.json" + target.write_text("{}", encoding="utf-8") + routes.service.scanner = StubScanner([str(root)]) + + response = await routes.update_workflow_content( + DummyRequest( + method="PUT", + body={"file_path": str(target), "workflow": {"some": "config"}}, + ) + ) + payload = json.loads(response.text) + + assert response.status == 400 + assert payload["success"] is False + + +async def test_update_workflow_content_rejects_path_outside_library(routes, tmp_path): + root = tmp_path / "workflows" + root.mkdir() + routes.service.scanner = StubScanner([str(root)]) + + response = await routes.update_workflow_content( + DummyRequest( + method="PUT", + body={ + "file_path": str(tmp_path / "elsewhere.json"), + "workflow": {"nodes": [{"id": 1, "type": "KSampler"}], "links": []}, + }, + ) + ) + payload = json.loads(response.text) + + assert response.status == 400 + assert payload["success"] is False + + +async def test_update_workflow_content_rejected_when_feature_disabled(routes): + from py.services.settings_manager import get_settings_manager + + get_settings_manager().set("enable_workflows", False) + response = await routes.update_workflow_content( + DummyRequest( + method="PUT", + body={"file_path": "/library/workflows/flow.json", "workflow": {}}, + ) + ) + payload = json.loads(response.text) + + assert response.status == 400 + assert payload["success"] is False + + +# --------------------------------------------------------------------------- +# ComfyUI link-state reporting + LM-page-triggered write-back +# --------------------------------------------------------------------------- + + +@pytest.fixture +def link_registry(): + from py.services.workflow_link_registry import WorkflowLinkRegistry + + WorkflowLinkRegistry.reset_instance() + yield + WorkflowLinkRegistry.reset_instance() + + +def _mock_prompt_server(monkeypatch, sids=("c1",)): + import server + from types import SimpleNamespace + from unittest.mock import MagicMock + + send_sync = MagicMock() + monkeypatch.setattr( + server.PromptServer, + "instance", + SimpleNamespace(sockets={sid: object() for sid in sids}, send_sync=send_sync), + ) + return send_sync + + +async def test_comfyui_state_report_and_query_roundtrip( + routes, plugin_mode, link_registry, monkeypatch +): + _mock_prompt_server(monkeypatch, sids=("c1",)) + + response = await routes.report_comfyui_state( + DummyRequest( + body={ + "client_id": "c1", + "state": { + "file_path": "/lib/flow.json", + "sha256": "abc", + "dirty": True, + }, + } + ) + ) + assert json.loads(response.text)["success"] is True + + response = await routes.get_comfyui_state(DummyRequest(method="GET")) + payload = json.loads(response.text) + + assert payload["success"] is True + assert len(payload["states"]) == 1 + state = payload["states"][0] + assert state["client_id"] == "c1" + assert state["file_path"] == "/lib/flow.json" + assert state["dirty"] is True + + +async def test_comfyui_state_prunes_disconnected_clients( + routes, plugin_mode, link_registry, monkeypatch +): + _mock_prompt_server(monkeypatch, sids=("c1",)) + + await routes.report_comfyui_state( + DummyRequest( + body={"client_id": "gone", "state": {"file_path": "/lib/a.json", "dirty": True}} + ) + ) + response = await routes.get_comfyui_state(DummyRequest(method="GET")) + + assert json.loads(response.text)["states"] == [] + + +async def test_comfyui_state_null_clears_entry( + routes, plugin_mode, link_registry, monkeypatch +): + _mock_prompt_server(monkeypatch, sids=("c1",)) + + await routes.report_comfyui_state( + DummyRequest( + body={"client_id": "c1", "state": {"file_path": "/lib/a.json", "dirty": True}} + ) + ) + await routes.report_comfyui_state(DummyRequest(body={"client_id": "c1", "state": None})) + + response = await routes.get_comfyui_state(DummyRequest(method="GET")) + assert json.loads(response.text)["states"] == [] + + +async def test_report_comfyui_state_requires_client_id(routes, plugin_mode, link_registry): + response = await routes.report_comfyui_state(DummyRequest(body={"state": None})) + assert response.status == 400 + + +async def test_get_comfyui_state_empty_in_standalone(routes, monkeypatch, link_registry): + monkeypatch.setenv("LORA_MANAGER_STANDALONE", "1") + + response = await routes.get_comfyui_state(DummyRequest(method="GET")) + payload = json.loads(response.text) + + assert payload == {"success": True, "states": []} + + +async def test_collect_result_unknown_request(routes, plugin_mode, link_registry): + response = await routes.collect_result( + DummyRequest(body={"request_id": "nope", "success": True}) + ) + payload = json.loads(response.text) + + assert payload == {"success": True, "resolved": False} + + +async def test_update_from_comfy_not_open(routes, plugin_mode, link_registry, tmp_path, monkeypatch): + _mock_prompt_server(monkeypatch) + + root = tmp_path / "workflows" + root.mkdir() + target = root / "flow.json" + target.write_text("{}", encoding="utf-8") + routes.service.scanner = StubScanner([str(root)]) + + response = await routes.update_from_comfy( + DummyRequest(body={"file_path": str(target)}) + ) + payload = json.loads(response.text) + + assert response.status == 404 + assert payload["error"] == "not_open" + + +async def test_update_from_comfy_roundtrip( + routes, plugin_mode, link_registry, tmp_path, monkeypatch +): + import asyncio + + send_sync = _mock_prompt_server(monkeypatch, sids=("c1",)) + + root = tmp_path / "workflows" + root.mkdir() + target = root / "flow.json" + target.write_text("{}", encoding="utf-8") + routes.service.scanner = StubScanner([str(root)]) + + await routes.report_comfyui_state( + DummyRequest( + body={ + "client_id": "c1", + "state": {"file_path": str(target), "sha256": "abc", "dirty": True}, + } + ) + ) + + task = asyncio.create_task( + routes.update_from_comfy(DummyRequest(body={"file_path": str(target)})) + ) + for _ in range(100): + if send_sync.call_count: + break + await asyncio.sleep(0.01) + assert send_sync.call_count == 1 + + channel, message = send_sync.call_args.args[:2] + assert channel == "lm_collect_workflow" + assert message["file_path"] == str(target) + assert send_sync.call_args.kwargs.get("sid") == "c1" + + await routes.collect_result( + DummyRequest( + body={ + "request_id": message["request_id"], + "success": True, + "sha256": "new-hash", + } + ) + ) + response = await asyncio.wait_for(task, timeout=5) + payload = json.loads(response.text) + + assert response.status == 200 + assert payload["success"] is True + assert payload["sha256"] == "new-hash" + + +async def test_update_from_comfy_no_changes_is_200( + routes, plugin_mode, link_registry, tmp_path, monkeypatch +): + import asyncio + + send_sync = _mock_prompt_server(monkeypatch, sids=("c1",)) + + root = tmp_path / "workflows" + root.mkdir() + target = root / "flow.json" + target.write_text("{}", encoding="utf-8") + routes.service.scanner = StubScanner([str(root)]) + + await routes.report_comfyui_state( + DummyRequest( + body={"client_id": "c1", "state": {"file_path": str(target), "dirty": True}} + ) + ) + + task = asyncio.create_task( + routes.update_from_comfy(DummyRequest(body={"file_path": str(target)})) + ) + for _ in range(100): + if send_sync.call_count: + break + await asyncio.sleep(0.01) + + request_id = send_sync.call_args.args[1]["request_id"] + await routes.collect_result( + DummyRequest( + body={"request_id": request_id, "success": False, "error": "no_changes"} + ) + ) + response = await asyncio.wait_for(task, timeout=5) + + assert response.status == 200 + assert json.loads(response.text)["error"] == "no_changes" + + +async def test_update_from_comfy_rejected_in_standalone(routes, monkeypatch, link_registry): + monkeypatch.setenv("LORA_MANAGER_STANDALONE", "1") + + response = await routes.update_from_comfy( + DummyRequest(body={"file_path": "/lib/flow.json"}) + ) + payload = json.loads(response.text) + + assert response.status == 400 + assert payload["success"] is False + + +async def test_restore_container_reextracts_pristine_document(routes, tmp_path): + """Zip artifacts stay byte-identical; restore discards the edited sidecar.""" + import zipfile + + root = tmp_path / "workflows" + root.mkdir() + target = root / "pack.zip" + original_doc = {"1": {"class_type": "CheckpointLoaderSimple", "inputs": {}}} + with zipfile.ZipFile(target, "w") as archive: + archive.writestr("workflow.json", json.dumps(original_doc)) + original_bytes = target.read_bytes() + routes.service.scanner = StubScanner([str(root)]) + + # Simulate a write-back: the derived sidecar now carries local edits. + edited = {"nodes": [{"id": 1, "type": "KSampler"}], "links": []} + response = await routes.update_workflow_content( + DummyRequest(method="PUT", body={"file_path": str(target), "workflow": edited}) + ) + assert json.loads(response.text)["success"] is True + + response = await routes.restore_workflow( + DummyRequest(method="POST", body={"file_path": str(target)}) + ) + payload = json.loads(response.text) + + assert response.status == 200 + assert payload["success"] is True + assert payload["restored"] == "extracted" + assert target.read_bytes() == original_bytes + derived = root / "pack.workflow.json" + assert json.loads(derived.read_text(encoding="utf-8")) == original_doc + + +def _civitai_metadata(target, original_bytes, sha): + from py.utils.models import WorkflowMetadata + + return WorkflowMetadata( + file_name="flow", + model_name="Flow", + file_path=str(target), + size=len(original_bytes), + modified=0, + sha256=sha, + base_model="SDXL", + preview_url="", + civitai={ + "id": 3431529, + "files": [ + { + "name": "flow.json", + "downloadUrl": "https://civitai.test/dl/flow.json", + "hashes": {"SHA256": sha}, + } + ], + }, + ) + + +async def test_restore_json_requires_civitai_source(routes, tmp_path): + root = tmp_path / "workflows" + root.mkdir() + target = root / "flow.json" + target.write_text( + json.dumps({"nodes": [{"id": 1, "type": "KSampler"}], "links": []}), + encoding="utf-8", + ) + routes.service.scanner = StubScanner([str(root)]) + + response = await routes.restore_workflow( + DummyRequest(method="POST", body={"file_path": str(target)}) + ) + payload = json.loads(response.text) + + assert response.status == 400 + assert payload["success"] is False + assert payload["error"] == "no_source" + + +async def test_restore_json_redownloads_recorded_version(routes, tmp_path, monkeypatch): + import hashlib + + from py.utils.metadata_manager import MetadataManager + + root = tmp_path / "workflows" + root.mkdir() + target = root / "flow.json" + edited = {"nodes": [{"id": 1, "type": "KSampler"}], "links": []} + target.write_text(json.dumps(edited), encoding="utf-8") + routes.service.scanner = StubScanner([str(root)]) + + original = {"nodes": [{"id": 1, "type": "CLIPTextEncode"}], "links": []} + original_bytes = json.dumps(original).encode("utf-8") + original_sha = hashlib.sha256(original_bytes).hexdigest() + await MetadataManager.save_metadata( + str(target), _civitai_metadata(target, original_bytes, original_sha) + ) + + async def fake_download(self, url, file_path, *, expected_sha256=None): + assert url == "https://civitai.test/dl/flow.json" + assert expected_sha256 == original_sha + with open(file_path, "wb") as handle: + handle.write(original_bytes) + return original_sha + + monkeypatch.setattr(WorkflowRoutes, "_download_and_replace", fake_download) + + response = await routes.restore_workflow( + DummyRequest(method="POST", body={"file_path": str(target)}) + ) + payload = json.loads(response.text) + + assert response.status == 200 + assert payload["success"] is True + assert payload["restored"] == "downloaded" + assert payload["sha256"] == original_sha + assert json.loads(target.read_text(encoding="utf-8")) == original + + # Metadata analysis and identity follow the restored document. + from py.utils.models import WorkflowMetadata + + reloaded, should_skip = await MetadataManager.load_metadata( + str(target), WorkflowMetadata + ) + assert not should_skip + assert reloaded.sha256 == original_sha + assert reloaded.node_classes == ["CLIPTextEncode"] + + +async def test_restore_json_download_failure_surfaces_502(routes, tmp_path, monkeypatch): + import hashlib + + from py.routes.workflow_routes import WorkflowRestoreDownloadError + from py.utils.metadata_manager import MetadataManager + + root = tmp_path / "workflows" + root.mkdir() + target = root / "flow.json" + edited = {"nodes": [{"id": 1, "type": "KSampler"}], "links": []} + edited_bytes = json.dumps(edited).encode("utf-8") + target.write_bytes(edited_bytes) + routes.service.scanner = StubScanner([str(root)]) + + original_sha = hashlib.sha256(b"original").hexdigest() + await MetadataManager.save_metadata( + str(target), _civitai_metadata(target, b"original", original_sha) + ) + + async def failing_download(self, url, file_path, *, expected_sha256=None): + raise WorkflowRestoreDownloadError("Download failed with HTTP 404") + + monkeypatch.setattr(WorkflowRoutes, "_download_and_replace", failing_download) + + response = await routes.restore_workflow( + DummyRequest(method="POST", body={"file_path": str(target)}) + ) + payload = json.loads(response.text) + + assert response.status == 502 + assert payload["success"] is False + assert payload["error"] == "download_failed" + # A failed restore never touches the local file. + assert target.read_bytes() == edited_bytes + + +async def test_restore_rejected_when_feature_disabled(routes): + from py.services.settings_manager import get_settings_manager + + get_settings_manager().set("enable_workflows", False) + response = await routes.restore_workflow( + DummyRequest(method="POST", body={"file_path": "/library/workflows/flow.json"}) + ) + payload = json.loads(response.text) + + assert response.status == 400 + assert payload["success"] is False + + +async def test_restore_rejects_path_outside_library(routes, tmp_path): + root = tmp_path / "workflows" + root.mkdir() + routes.service.scanner = StubScanner([str(root)]) + + response = await routes.restore_workflow( + DummyRequest(method="POST", body={"file_path": str(tmp_path / "elsewhere.json")}) + ) + payload = json.loads(response.text) + + assert response.status == 400 + assert payload["success"] is False diff --git a/tests/services/test_download_manager_workflows.py b/tests/services/test_download_manager_workflows.py new file mode 100644 index 00000000..7f99bbb1 --- /dev/null +++ b/tests/services/test_download_manager_workflows.py @@ -0,0 +1,394 @@ +"""DownloadManager support for the "workflow" model type. + +Covers type routing (Workflows/ComfyWorkflows), the opt-in gate, existence +checks against the workflow scanner, the default save root, file selection +for weight-less workflow versions, and the rule that workflow archives are +kept byte-identical (never extracted). +""" + +import json +import zipfile +from pathlib import Path +from types import SimpleNamespace +from unittest.mock import AsyncMock + +import pytest + +from py.services import aria2_transfer_state +from py.services import download_manager +from py.services.download_manager import DownloadManager +from py.services.service_registry import ServiceRegistry +from py.services.settings_manager import SettingsManager, get_settings_manager +from py.utils.models import WorkflowMetadata + + +@pytest.fixture(autouse=True) +def reset_download_manager(): + """Ensure each test operates on a fresh singleton.""" + DownloadManager._instance = None + yield + DownloadManager._instance = None + + +@pytest.fixture(autouse=True) +def isolate_settings(monkeypatch, tmp_path): + """Point settings writes at a temporary directory to avoid touching real files.""" + manager = get_settings_manager() + default_settings = manager._get_default_settings() + default_settings.update( + { + "enable_workflows": True, + "skip_previously_downloaded_model_versions": False, + "download_skip_base_models": [], + "download_path_templates": {}, + "download_filename_templates": {}, + } + ) + monkeypatch.setattr(manager, "settings", default_settings) + monkeypatch.setattr(SettingsManager, "_save_settings", lambda self: None) + + +@pytest.fixture(autouse=True) +def isolate_aria2_state(monkeypatch, tmp_path): + state_path = tmp_path / "cache" / "aria2" / "downloads.json" + monkeypatch.setattr( + aria2_transfer_state, + "get_aria2_state_path", + lambda: str(state_path), + ) + + +class DummyScanner: + def __init__(self, exists: bool = False, roots=None): + self.exists = exists + self.calls = [] + self._roots = list(roots or []) + self._cache = SimpleNamespace(raw_data=[]) + + async def check_model_version_exists(self, version_id): + self.calls.append(version_id) + return self.exists + + async def get_cached_data(self): + return self._cache + + def get_model_roots(self): + return list(self._roots) + + +@pytest.fixture +def scanners(monkeypatch): + lora_scanner = DummyScanner() + checkpoint_scanner = DummyScanner() + embedding_scanner = DummyScanner() + other_scanner = DummyScanner() + workflow_scanner = DummyScanner() + + monkeypatch.setattr( + ServiceRegistry, "get_lora_scanner", AsyncMock(return_value=lora_scanner) + ) + monkeypatch.setattr( + ServiceRegistry, + "get_checkpoint_scanner", + AsyncMock(return_value=checkpoint_scanner), + ) + monkeypatch.setattr( + ServiceRegistry, + "get_embedding_scanner", + AsyncMock(return_value=embedding_scanner), + ) + monkeypatch.setattr( + ServiceRegistry, + "get_other_scanner", + AsyncMock(return_value=other_scanner), + ) + monkeypatch.setattr( + ServiceRegistry, + "get_workflow_scanner", + AsyncMock(return_value=workflow_scanner), + ) + + return SimpleNamespace( + lora=lora_scanner, + checkpoint=checkpoint_scanner, + embedding=embedding_scanner, + other=other_scanner, + workflow=workflow_scanner, + ) + + +def _workflow_payload(civitai_type: str, *, files=None) -> dict: + return { + "id": 42, + "model": {"type": civitai_type, "tags": ["utility"], "name": "Flow"}, + "baseModel": "SDXL 1.0", + "creator": {"username": "Author"}, + "files": files + or [ + { + "id": 7, + "type": "Config", + "primary": True, + "downloadUrl": "https://example.invalid/flow.json", + "name": "flow.json", + "hashes": {"SHA256": "ab" * 32}, + } + ], + } + + +@pytest.fixture +def metadata_provider(monkeypatch): + class DummyProvider: + def __init__(self): + self.calls = [] + self.payload = _workflow_payload("Workflows") + + async def get_model_version(self, model_id, model_version_id): + self.calls.append((model_id, model_version_id)) + return self.payload + + provider = DummyProvider() + monkeypatch.setattr( + download_manager, + "get_default_metadata_provider", + AsyncMock(return_value=provider), + ) + return provider + + +def _capture_execute(monkeypatch, captured): + async def fake_execute_download(self, **kwargs): + captured.update(kwargs) + return {"success": True} + + monkeypatch.setattr( + DownloadManager, "_execute_download", fake_execute_download, raising=False + ) + + +@pytest.mark.asyncio +@pytest.mark.parametrize("civitai_type", ["Workflows", "ComfyWorkflows"]) +async def test_download_accepts_workflow_model_types( + monkeypatch, scanners, metadata_provider, tmp_path, civitai_type +): + metadata_provider.payload = _workflow_payload(civitai_type) + + captured = {} + _capture_execute(monkeypatch, captured) + + manager = DownloadManager() + result = await manager.download_from_civitai( + model_version_id=99, save_dir=str(tmp_path) + ) + + assert result["success"] is True + assert captured["model_type"] == "workflow" + assert isinstance(captured["metadata"], WorkflowMetadata) + assert captured["metadata"].file_name == "flow" + + +@pytest.mark.asyncio +async def test_download_rejects_workflows_when_feature_disabled( + monkeypatch, scanners, metadata_provider, tmp_path +): + manager_settings = get_settings_manager() + manager_settings.settings["enable_workflows"] = False + + manager = DownloadManager() + result = await manager.download_from_civitai( + model_version_id=99, save_dir=str(tmp_path) + ) + + assert result["success"] is False + assert result["reason"] == "workflows_disabled" + + +@pytest.mark.asyncio +async def test_early_gate_checks_workflow_scanner( + monkeypatch, scanners, metadata_provider, tmp_path +): + scanners.workflow.exists = True + + manager = DownloadManager() + result = await manager.download_from_civitai( + model_version_id=99, save_dir=str(tmp_path) + ) + + assert result["success"] is False + assert "workflow library" in result["error"] + assert 99 in scanners.workflow.calls + + +@pytest.mark.asyncio +async def test_early_gate_skips_workflow_scanner_when_disabled( + monkeypatch, scanners, metadata_provider, tmp_path +): + get_settings_manager().settings["enable_workflows"] = False + # Route the download to a non-workflow type so the run proceeds. + metadata_provider.payload = { + "id": 42, + "model": {"type": "LORA", "tags": []}, + "baseModel": "SDXL 1.0", + "files": [ + { + "type": "Model", + "primary": True, + "downloadUrl": "https://example.invalid/file.safetensors", + "name": "file.safetensors", + } + ], + } + + captured = {} + _capture_execute(monkeypatch, captured) + + manager = DownloadManager() + result = await manager.download_from_civitai( + model_version_id=99, save_dir=str(tmp_path) + ) + + assert result["success"] is True + assert scanners.workflow.calls == [] + + +@pytest.mark.asyncio +async def test_default_paths_use_first_workflow_root( + monkeypatch, scanners, metadata_provider, tmp_path +): + workflow_root = tmp_path / "workflows" + workflow_root.mkdir() + scanners.workflow._roots = [str(workflow_root)] + + captured = {} + _capture_execute(monkeypatch, captured) + + manager = DownloadManager() + result = await manager.download_from_civitai( + model_version_id=99, use_default_paths=True + ) + + assert result["success"] is True + assert captured["save_dir"] == str(workflow_root) + + +@pytest.mark.asyncio +async def test_default_paths_error_without_workflow_root( + monkeypatch, scanners, metadata_provider +): + scanners.workflow._roots = [] + + manager = DownloadManager() + result = await manager.download_from_civitai( + model_version_id=99, use_default_paths=True + ) + + assert result["success"] is False + assert "workflow folder" in result["error"] + + +@pytest.mark.asyncio +async def test_scanner_dispatch_resolves_workflow(monkeypatch, scanners): + manager = DownloadManager() + scanner = await manager._get_scanner_for_model_type("workflow") + assert scanner is scanners.workflow + + +def test_select_workflow_download_file_ranking(): + files = [ + {"id": 1, "type": "Other", "name": "notes.txt"}, + {"id": 2, "type": "Archive", "name": "pack.zip"}, + {"id": 3, "type": "Config", "name": "flow.json"}, + ] + selected = DownloadManager._select_workflow_download_file(files) + assert selected["name"] == "flow.json" + + # Without a JSON the archive wins; a primary flag breaks ties. + files = files[:2] + assert DownloadManager._select_workflow_download_file(files)["name"] == "pack.zip" + files[0]["primary"] = True + assert DownloadManager._select_workflow_download_file(files)["name"] == "notes.txt" + + assert DownloadManager._select_workflow_download_file([]) is None + + +def test_build_metadata_for_resume_uses_workflow_metadata(): + manager = DownloadManager() + metadata = manager._build_metadata_for_resume( + model_type="workflow", + version_info=_workflow_payload("Workflows"), + file_info={"name": "flow.zip", "hashes": {}}, + save_path="/tmp/flow.zip", + ) + assert isinstance(metadata, WorkflowMetadata) + assert metadata.file_name == "flow" + + +@pytest.mark.asyncio +async def test_workflow_download_keeps_zip_archive_intact( + monkeypatch, scanners, tmp_path +): + """A downloaded workflow zip is the library artifact: never extracted.""" + workflow = { + "1": {"class_type": "CheckpointLoaderSimple", "inputs": {}}, + } + zip_path = tmp_path / "pack.zip" + with zipfile.ZipFile(zip_path, "w") as archive: + archive.writestr("workflow.json", json.dumps(workflow)) + zip_bytes = zip_path.read_bytes() + + async def fake_download_file(self, url, save_path, **kwargs): + with open(save_path, "wb") as handle: + handle.write(zip_bytes) + return True, "" + + monkeypatch.setattr( + DownloadManager, "_download_model_file", fake_download_file, raising=False + ) + + added = [] + + class PipelineScanner: + def _find_root_for_file(self, file_path): + return None + + def adjust_metadata(self, metadata, file_path, root_path): + return metadata + + async def add_model_to_cache(self, metadata_dict, relative_path): + added.append(metadata_dict) + + monkeypatch.setattr( + ServiceRegistry, + "get_workflow_scanner", + AsyncMock(return_value=PipelineScanner()), + ) + + save_path = tmp_path / "pack_downloaded.zip" + metadata = WorkflowMetadata( + file_name="pack_downloaded", + model_name="pack_downloaded", + file_path=str(save_path), + size=0, + modified=0, + sha256="", + base_model="Unknown", + preview_url="", + ) + + manager = DownloadManager() + result = await manager._execute_download( + download_urls=["https://example.invalid/pack.zip"], + save_dir=str(tmp_path), + metadata=metadata, + version_info={"id": 42, "model": {"type": "Workflows"}, "images": []}, + relative_path="", + model_type="workflow", + ) + + assert result["success"] is True + # The archive is still there, unextracted, and no member files appeared. + assert save_path.exists() + assert save_path.read_bytes() == zip_bytes + assert not (tmp_path / "workflow.json").exists() + assert added and added[0]["file_path"].endswith("pack_downloaded.zip") diff --git a/tests/services/test_model_lifecycle_service.py b/tests/services/test_model_lifecycle_service.py index 7c9a35fd..bf89de0d 100644 --- a/tests/services/test_model_lifecycle_service.py +++ b/tests/services/test_model_lifecycle_service.py @@ -1080,3 +1080,122 @@ async def test_delete_model_falls_back_when_staging_fails( # staging parent, if left behind by the rollback, holds no data). staging_parent = root / PENDING_DELETE_DIR_NAME assert not staging_parent.exists() or not any(staging_parent.iterdir()) + + +@pytest.mark.asyncio +async def test_delete_model_artifacts_removes_derived_workflow_document(tmp_path: Path): + from py.services.model_lifecycle_service import delete_model_artifacts + + artifact = tmp_path / "pack.zip" + artifact.write_bytes(b"zip") + derived = tmp_path / "pack.workflow.json" + derived.write_text("{}", encoding="utf-8") + metadata = tmp_path / "pack.metadata.json" + metadata.write_text("{}", encoding="utf-8") + + deleted = await delete_model_artifacts( + str(tmp_path), "pack", main_extension=".zip" + ) + + assert not artifact.exists() + assert not derived.exists() + assert not metadata.exists() + assert any(str(name).endswith("pack.workflow.json") for name in deleted) + + +@pytest.mark.asyncio +async def test_delete_model_artifacts_image_artifact_deleted_once(tmp_path: Path): + """An image workflow artifact doubles as its own preview: same path.""" + from py.services.model_lifecycle_service import delete_model_artifacts + + artifact = tmp_path / "flow.png" + artifact.write_bytes(b"png") + + deleted = await delete_model_artifacts( + str(tmp_path), "flow", main_extension=".png" + ) + + assert not artifact.exists() + assert len(deleted) == len(set(deleted)) + + +@pytest.mark.asyncio +async def test_rename_model_carries_derived_workflow_document(tmp_path: Path): + old_name = "pack" + new_name = "pack-renamed" + + model_path = tmp_path / f"{old_name}.zip" + model_path.write_bytes(b"zip") + + derived = tmp_path / f"{old_name}.workflow.json" + derived.write_text("{}", encoding="utf-8") + + metadata_path = tmp_path / f"{old_name}.metadata.json" + metadata_payload = { + "file_name": old_name, + "file_path": model_path.as_posix(), + } + metadata_path.write_text(json.dumps(metadata_payload)) + + async def metadata_loader(path: str): + with open(path, "r", encoding="utf-8") as handle: + return json.load(handle) + + scanner = DummyScanner() + metadata_manager = PassthroughMetadataManager() + service = ModelLifecycleService( + scanner=scanner, + metadata_manager=metadata_manager, + metadata_loader=metadata_loader, + ) + + result = await service.rename_model( + file_path=model_path.as_posix(), + new_file_name=new_name, + ) + + assert (tmp_path / f"{new_name}.zip").exists() + assert (tmp_path / f"{new_name}.workflow.json").exists() + assert not derived.exists() + assert isinstance(result["new_file_path"], str) + assert result["new_file_path"].endswith(f"{new_name}.zip") + + +@pytest.mark.asyncio +async def test_rename_image_workflow_artifact_renames_main_file_once(tmp_path: Path): + """The image artifact matches both the main-file and a preview pattern.""" + old_name = "flow" + new_name = "flow-renamed" + + model_path = tmp_path / f"{old_name}.png" + model_path.write_bytes(b"png") + + metadata_path = tmp_path / f"{old_name}.metadata.json" + metadata_payload = { + "file_name": old_name, + "file_path": model_path.as_posix(), + "preview_url": model_path.as_posix(), + } + metadata_path.write_text(json.dumps(metadata_payload)) + + async def metadata_loader(path: str): + with open(path, "r", encoding="utf-8") as handle: + return json.load(handle) + + scanner = DummyScanner() + metadata_manager = PassthroughMetadataManager() + service = ModelLifecycleService( + scanner=scanner, + metadata_manager=metadata_manager, + metadata_loader=metadata_loader, + ) + + result = await service.rename_model( + file_path=model_path.as_posix(), + new_file_name=new_name, + ) + + assert (tmp_path / f"{new_name}.png").exists() + assert not model_path.exists() + renamed = result["renamed_files"] + assert len(renamed) == len(set(renamed)) diff --git a/tests/services/test_model_scanner.py b/tests/services/test_model_scanner.py index 2048b230..92b3b65f 100644 --- a/tests/services/test_model_scanner.py +++ b/tests/services/test_model_scanner.py @@ -268,6 +268,23 @@ async def test_initialize_cache_populates_cache(tmp_path: Path): assert sorted(cache.folders) == ["", "nested"] +@pytest.mark.asyncio +async def test_force_refresh_without_cache_falls_back_to_full_initialization(tmp_path: Path): + """A scan fired before background init has run has no cache to reconcile + against; it must initialize from scratch instead of crashing.""" + _create_files(tmp_path) + scanner = DummyScanner(tmp_path) + assert scanner._cache is None + + cache = await scanner.get_cached_data(force_refresh=True) + + assert scanner._cache is not None + assert {item["file_path"] for item in cache.raw_data} == { + _normalize_path(tmp_path / "one.txt"), + _normalize_path(tmp_path / "nested" / "two.txt"), + } + + @pytest.mark.asyncio async def test_initialize_cache_sync_returns_result_without_mutating_state(tmp_path: Path, monkeypatch): _create_files(tmp_path) diff --git a/tests/services/test_settings_manager.py b/tests/services/test_settings_manager.py index ea0ef783..603746eb 100644 --- a/tests/services/test_settings_manager.py +++ b/tests/services/test_settings_manager.py @@ -1888,3 +1888,44 @@ def test_download_root_rules_accept_remote_only_base_models(manager, monkeypatch "root": "/loras-archive", } ] + + +def test_get_workflow_folder_paths_defaults_to_empty(manager): + assert manager.get_workflow_folder_paths() == [] + + +def test_set_workflow_folder_paths_merges_into_active_library(manager): + _configure_lora_roots(manager, "/loras-main") + + result = manager.set_workflow_folder_paths(["/workflows", " /workflows ", ""]) + + assert result == ["/workflows"] + # Core keys are preserved; workflows rides the same folder_paths map. + assert manager.settings["folder_paths"] == { + "loras": ["/loras-main"], + "workflows": ["/workflows"], + } + assert manager.get_workflow_folder_paths() == ["/workflows"] + active = manager.get_active_library() + assert active.get("folder_paths", {}).get("workflows") == ["/workflows"] + + +def test_set_workflow_folder_paths_empty_removes_key(manager): + manager.set_workflow_folder_paths(["/workflows"]) + + result = manager.set_workflow_folder_paths([]) + + assert result == [] + assert "workflows" not in manager.settings["folder_paths"] + assert manager.get_workflow_folder_paths() == [] + + +def test_set_workflow_folder_paths_rejects_overlap_with_other_library(manager): + manager.settings["libraries"] = { + "default": manager.get_active_library(), + "other": {"folder_paths": {"workflows": ["/shared-workflows"]}}, + } + manager.settings["active_library"] = "default" + + with pytest.raises(ValueError): + manager.set_workflow_folder_paths(["/shared-workflows"]) diff --git a/tests/services/test_workflow_scanner.py b/tests/services/test_workflow_scanner.py new file mode 100644 index 00000000..2d0ba308 --- /dev/null +++ b/tests/services/test_workflow_scanner.py @@ -0,0 +1,238 @@ +"""Tests for WorkflowScanner: opt-in roots, sidecar exclusion, metadata creation.""" + +import json +import os + +import pytest + +from py import config as config_module +from py.services.model_scanner import ModelScanner +from py.services.workflow_scanner import WorkflowScanner +from py.utils.models import WorkflowMetadata + + +def _normalize(path) -> str: + return str(path).replace(os.sep, "/") + + +@pytest.fixture(autouse=True) +def reset_model_scanner_singletons(): + ModelScanner._instances.clear() + ModelScanner._locks.clear() + yield + ModelScanner._instances.clear() + ModelScanner._locks.clear() + + +@pytest.fixture +def workflow_root(tmp_path, monkeypatch): + root = tmp_path / "workflows" + root.mkdir() + monkeypatch.setattr(config_module.config, "workflows_roots", [_normalize(root)]) + monkeypatch.setattr(config_module.config, "extra_workflows_roots", []) + return root + + +@pytest.fixture +def enable_workflows(monkeypatch): + """Enable the feature without set() side effects (root refresh, rescan).""" + from py.services.settings_manager import get_settings_manager + + monkeypatch.setattr( + get_settings_manager(), "is_workflows_enabled", lambda: True + ) + + +def _make_scanner() -> WorkflowScanner: + """Create a scanner without __init__ to avoid async initialization.""" + scanner = object.__new__(WorkflowScanner) + scanner.model_type = "workflow" + scanner.model_class = WorkflowMetadata + scanner.file_extensions = {".json", ".zip", ".png", ".webp"} + return scanner + + +def test_roots_empty_while_feature_disabled(workflow_root, monkeypatch): + from py.services.settings_manager import get_settings_manager + + monkeypatch.setattr( + get_settings_manager(), "is_workflows_enabled", lambda: False + ) + scanner = _make_scanner() + assert scanner.get_model_roots() == [] + + +def test_roots_listed_while_feature_enabled(workflow_root, enable_workflows): + scanner = _make_scanner() + assert scanner.get_model_roots() == [_normalize(workflow_root)] + + +def test_filename_filter_rejects_sidecars(enable_workflows): + scanner = _make_scanner() + assert scanner._is_indexable_filename("flow.json") is True + assert scanner._is_indexable_filename("flow.metadata.json") is False + assert scanner._is_indexable_filename("FLOW.METADATA.JSON") is False + # The derived workflow document of a container artifact is also a sidecar. + assert scanner._is_indexable_filename("flow.workflow.json") is False + assert scanner._is_indexable_filename("FLOW.WORKFLOW.JSON") is False + + +async def test_create_default_metadata_parses_workflow(workflow_root, enable_workflows, tmp_path): + workflow = { + "1": {"class_type": "CheckpointLoaderSimple", "inputs": {"ckpt_name": "base.safetensors"}}, + "2": {"class_type": "LoraLoader", "inputs": {"lora_name": "civitai:1@2"}}, + } + file_path = workflow_root / "my_flow.json" + file_path.write_text(json.dumps(workflow), encoding="utf-8") + + scanner = _make_scanner() + metadata = await scanner._create_default_metadata(str(file_path)) + + assert metadata is not None + assert metadata.file_name == "my_flow" + assert metadata.sub_type == "workflow" + assert metadata.workflow_format == "api" + assert metadata.node_count == 2 + assert metadata.sha256 + assert metadata.model_refs == ["base.safetensors"] + assert metadata.civitai_refs == ["civitai:1@2"] + assert metadata.from_civitai is False + + +async def test_create_default_metadata_skips_non_workflow_json(workflow_root, enable_workflows): + file_path = workflow_root / "settings.json" + file_path.write_text(json.dumps({"some": "config"}), encoding="utf-8") + + scanner = _make_scanner() + assert await scanner._create_default_metadata(str(file_path)) is None + + +async def test_create_default_metadata_skips_sidecar(workflow_root, enable_workflows): + file_path = workflow_root / "my_flow.metadata.json" + file_path.write_text(json.dumps({"file_name": "my_flow"}), encoding="utf-8") + + scanner = _make_scanner() + assert await scanner._create_default_metadata(str(file_path)) is None + + +async def test_create_default_metadata_from_zip_artifact(workflow_root, enable_workflows): + import zipfile + + workflow = { + "1": {"class_type": "CheckpointLoaderSimple", "inputs": {"ckpt_name": "base.safetensors"}}, + } + file_path = workflow_root / "pack.zip" + with zipfile.ZipFile(file_path, "w") as archive: + archive.writestr("workflow.json", json.dumps(workflow)) + archive.writestr("readme.txt", "hello") + + scanner = _make_scanner() + metadata = await scanner._create_default_metadata(str(file_path)) + + assert metadata is not None + assert metadata.file_name == "pack" + assert metadata.workflow_format == "api" + assert metadata.node_count == 1 + assert metadata.model_refs == ["base.safetensors"] + # The artifact is hashed, not the extracted document. + assert metadata.sha256 + + # The derived workflow document is materialized as a sidecar. + derived = workflow_root / "pack.workflow.json" + assert derived.exists() + assert json.loads(derived.read_text(encoding="utf-8")) == workflow + + +async def test_create_default_metadata_skips_zip_without_workflow(workflow_root, enable_workflows): + import zipfile + + file_path = workflow_root / "images.zip" + with zipfile.ZipFile(file_path, "w") as archive: + archive.writestr("note.txt", "no graphs here") + + scanner = _make_scanner() + assert await scanner._create_default_metadata(str(file_path)) is None + assert not (workflow_root / "images.workflow.json").exists() + + +async def test_create_default_metadata_image_artifact_self_preview(workflow_root, enable_workflows): + PIL = pytest.importorskip("PIL.Image") + from py.utils.exif_utils import ExifUtils + + workflow = { + "nodes": [{"id": 1, "type": "CheckpointLoaderSimple"}], + "links": [], + } + file_path = workflow_root / "flow.png" + PIL.new("RGB", (8, 8)).save(file_path, format="PNG") + ExifUtils.embed_workflow(str(file_path), json.dumps(workflow)) + + scanner = _make_scanner() + metadata = await scanner._create_default_metadata(str(file_path)) + + assert metadata is not None + assert metadata.workflow_format == "ui" + # The image artifact doubles as its own preview. + assert metadata.preview_url.replace(os.sep, "/").endswith("flow.png") + + +async def test_create_default_metadata_plain_image_skipped(workflow_root, enable_workflows): + PIL = pytest.importorskip("PIL.Image") + + file_path = workflow_root / "preview.png" + PIL.new("RGB", (8, 8)).save(file_path, format="PNG") + + scanner = _make_scanner() + assert await scanner._create_default_metadata(str(file_path)) is None + + +def test_adjust_metadata_fills_missing_analysis(workflow_root, enable_workflows): + """Downloaded entries carry CivitAI metadata but no analysis fields yet.""" + import zipfile + + workflow = { + "1": {"class_type": "CheckpointLoaderSimple", "inputs": {"ckpt_name": "base.safetensors"}}, + } + file_path = workflow_root / "downloaded.zip" + with zipfile.ZipFile(file_path, "w") as archive: + archive.writestr("workflow.json", json.dumps(workflow)) + + metadata = WorkflowMetadata( + file_name="downloaded", + model_name="downloaded", + file_path=_normalize(file_path), + size=file_path.stat().st_size, + modified=0, + sha256="abc", + base_model="Unknown", + preview_url="", + from_civitai=True, + ) + + scanner = _make_scanner() + adjusted = scanner.adjust_metadata(metadata, str(file_path), None) + + assert adjusted.workflow_format == "api" + assert adjusted.node_count == 1 + assert adjusted.model_refs == ["base.safetensors"] + assert (workflow_root / "downloaded.workflow.json").exists() + + +def test_adjust_metadata_keeps_populated_analysis(workflow_root, enable_workflows): + metadata = WorkflowMetadata( + file_name="flow", + model_name="flow", + file_path=_normalize(workflow_root / "flow.json"), + size=1, + modified=0, + sha256="abc", + base_model="Unknown", + preview_url="", + workflow_format="ui", + node_count=7, + ) + + scanner = _make_scanner() + adjusted = scanner.adjust_metadata(metadata, str(workflow_root / "flow.json"), None) + + assert adjusted.node_count == 7 # untouched: no re-extraction diff --git a/tests/utils/test_workflow_analysis.py b/tests/utils/test_workflow_analysis.py new file mode 100644 index 00000000..09c937f5 --- /dev/null +++ b/tests/utils/test_workflow_analysis.py @@ -0,0 +1,101 @@ +"""Tests for py.utils.workflow_analysis: sniffing and graph extraction.""" + +import json + +from py.utils.workflow_analysis import ( + WORKFLOW_FORMAT_API, + WORKFLOW_FORMAT_UI, + analyze_workflow, + analyze_workflow_file, + load_workflow_file, + sniff_workflow_text, +) + + +UI_WORKFLOW = { + "nodes": [ + {"id": 1, "type": "CheckpointLoaderSimple", "widgets_values": ["sd_xl_base_1.0.safetensors"]}, + {"id": 2, "type": "LoraLoader", "widgets_values": ["civitai:12345@67890", 1.0, 1.0]}, + {"id": 3, "type": "KSampler", "widgets_values": [42]}, + ], + "links": [], + "groups": [], + "version": 0.4, +} + +API_WORKFLOW = { + "1": {"class_type": "CheckpointLoaderSimple", "inputs": {"ckpt_name": "v1-5-pruned.safetensors"}}, + "2": {"class_type": "LoraLoader", "inputs": {"lora_name": "civitai:111@222", "strength_model": 1.0}}, + "3": {"class_type": "SaveImage", "inputs": {"filename_prefix": "ComfyUI"}}, +} + + +def test_sniff_ui_format(): + assert sniff_workflow_text(json.dumps(UI_WORKFLOW)) == WORKFLOW_FORMAT_UI + + +def test_sniff_api_format(): + assert sniff_workflow_text(json.dumps(API_WORKFLOW)) == WORKFLOW_FORMAT_API + + +def test_sniff_rejects_non_workflow_json(): + assert sniff_workflow_text(json.dumps({"setting": True, "other": 1})) is None + assert sniff_workflow_text(json.dumps(["a", "b"])) is None + assert sniff_workflow_text("not json at all") is None + # A sidecar-shaped document (flat metadata fields) is not a workflow. + assert sniff_workflow_text(json.dumps({"file_name": "x", "sha256": "abc"})) is None + + +def test_analyze_ui_format_extracts_classes_and_refs(): + analysis = analyze_workflow(UI_WORKFLOW) + assert analysis is not None + assert analysis.workflow_format == WORKFLOW_FORMAT_UI + assert analysis.node_count == 3 + assert analysis.node_classes == ["CheckpointLoaderSimple", "KSampler", "LoraLoader"] + assert analysis.model_refs == ["sd_xl_base_1.0.safetensors"] + assert analysis.civitai_refs == ["civitai:12345@67890"] + + +def test_analyze_api_format_extracts_classes_and_refs(): + analysis = analyze_workflow(API_WORKFLOW) + assert analysis is not None + assert analysis.workflow_format == WORKFLOW_FORMAT_API + assert analysis.node_count == 3 + assert "SaveImage" in analysis.node_classes + assert analysis.model_refs == ["v1-5-pruned.safetensors"] + assert analysis.civitai_refs == ["civitai:111@222"] + + +def test_analyze_rejects_non_workflow(): + assert analyze_workflow({"foo": "bar"}) is None + + +def test_analyze_skips_prompt_text_with_extension_like_suffix(tmp_path): + # Prompt strings contain spaces and must not become model refs. + workflow = { + "1": { + "class_type": "CLIPTextEncode", + "inputs": {"text": "a beautiful landscape, best quality.safetensors style"}, + } + } + analysis = analyze_workflow(workflow) + assert analysis is not None + assert analysis.model_refs == [] + + +def test_analyze_workflow_file_roundtrip(tmp_path): + path = tmp_path / "flow.json" + path.write_text(json.dumps(API_WORKFLOW), encoding="utf-8") + analysis = analyze_workflow_file(str(path)) + assert analysis is not None + assert analysis.workflow_format == WORKFLOW_FORMAT_API + + +def test_load_workflow_file_rejects_sidecar(tmp_path): + sidecar = tmp_path / "flow.metadata.json" + sidecar.write_text(json.dumps({"file_name": "flow", "sha256": "x"}), encoding="utf-8") + assert load_workflow_file(str(sidecar)) is None + + +def test_load_workflow_file_handles_missing(tmp_path): + assert load_workflow_file(str(tmp_path / "nope.json")) is None diff --git a/tests/utils/test_workflow_extraction.py b/tests/utils/test_workflow_extraction.py new file mode 100644 index 00000000..626538aa --- /dev/null +++ b/tests/utils/test_workflow_extraction.py @@ -0,0 +1,200 @@ +"""Tests for workflow document extraction from library artifacts.""" + +import json +import os +import zipfile + +import pytest + +from py.utils.workflow_extraction import ( + WORKFLOW_DOCUMENT_SUFFIX, + extract_workflow_document, + get_workflow_document_path, + load_artifact_workflow_document, + materialize_workflow_document, +) + +API_WORKFLOW = { + "1": {"class_type": "CheckpointLoaderSimple", "inputs": {"ckpt_name": "base.safetensors"}}, + "2": {"class_type": "LoraLoader", "inputs": {"lora_name": "lora.safetensors"}}, +} + +UI_WORKFLOW = { + "nodes": [{"id": 1, "type": "CheckpointLoaderSimple", "widgets_values": ["base.safetensors"]}], + "links": [], +} + + +def _write_json(path, payload): + path.write_text(json.dumps(payload), encoding="utf-8") + + +def _write_zip(path, members): + with zipfile.ZipFile(path, "w") as archive: + for name, payload in members.items(): + archive.writestr(name, payload) + + +def _write_png_with_workflow(path, workflow): + PIL = pytest.importorskip("PIL.Image") + from py.utils.exif_utils import ExifUtils + + img = PIL.new("RGB", (8, 8), color=(0, 0, 0)) + img.save(path, format="PNG") + ExifUtils.embed_workflow(str(path), json.dumps(workflow)) + + +def _write_webp_with_workflow(path, workflow): + PIL = pytest.importorskip("PIL.Image") + from py.utils.exif_utils import ExifUtils + + img = PIL.new("RGB", (8, 8), color=(0, 0, 0)) + img.save(path, format="WEBP") + ExifUtils.embed_workflow(str(path), json.dumps(workflow)) + + +def test_document_path_identity_for_json(tmp_path): + artifact = tmp_path / "flow.json" + assert get_workflow_document_path(str(artifact)) == str(artifact) + + +def test_document_path_derived_for_containers(tmp_path): + artifact = tmp_path / "flow.zip" + derived = get_workflow_document_path(str(artifact)) + assert derived == str(tmp_path / f"flow{WORKFLOW_DOCUMENT_SUFFIX}") + + image = tmp_path / "flow.png" + assert get_workflow_document_path(str(image)) == str( + tmp_path / f"flow{WORKFLOW_DOCUMENT_SUFFIX}" + ) + + +def test_extract_json_artifact(tmp_path): + artifact = tmp_path / "flow.json" + _write_json(artifact, API_WORKFLOW) + document = extract_workflow_document(str(artifact)) + assert document == API_WORKFLOW + + +def test_extract_rejects_non_workflow_json(tmp_path): + artifact = tmp_path / "settings.json" + _write_json(artifact, {"some": "config"}) + assert extract_workflow_document(str(artifact)) is None + assert materialize_workflow_document(str(artifact)) is None + + +def test_extract_from_zip_top_level(tmp_path): + artifact = tmp_path / "pack.zip" + _write_zip( + artifact, + { + "workflow.json": json.dumps(UI_WORKFLOW), + "readme.txt": "hello", + }, + ) + document = extract_workflow_document(str(artifact)) + assert document == UI_WORKFLOW + + +def test_extract_from_zip_prefers_shallow_candidates(tmp_path): + artifact = tmp_path / "pack.zip" + _write_zip( + artifact, + { + "nested/deep/config.json": json.dumps(API_WORKFLOW), + "top.json": json.dumps(UI_WORKFLOW), + }, + ) + document = extract_workflow_document(str(artifact)) + assert document == UI_WORKFLOW + + +def test_extract_from_zip_skips_macosx_and_hidden(tmp_path): + artifact = tmp_path / "pack.zip" + _write_zip( + artifact, + { + "__MACOSX/workflow.json": json.dumps(UI_WORKFLOW), + ".hidden/workflow.json": json.dumps(UI_WORKFLOW), + "real.json": json.dumps(API_WORKFLOW), + }, + ) + document = extract_workflow_document(str(artifact)) + assert document == API_WORKFLOW + + +def test_extract_from_zip_without_workflow_returns_none(tmp_path): + artifact = tmp_path / "images.zip" + _write_zip(artifact, {"note.txt": "no graphs here", "config.json": "{}"}) + assert extract_workflow_document(str(artifact)) is None + + +def test_extract_from_corrupt_zip_returns_none(tmp_path): + artifact = tmp_path / "broken.zip" + artifact.write_bytes(b"not a zip at all") + assert extract_workflow_document(str(artifact)) is None + + +def test_extract_from_png_with_embedded_workflow(tmp_path): + artifact = tmp_path / "flow.png" + _write_png_with_workflow(artifact, UI_WORKFLOW) + document = extract_workflow_document(str(artifact)) + assert document == UI_WORKFLOW + + +def test_extract_from_webp_with_embedded_workflow(tmp_path): + artifact = tmp_path / "flow.webp" + _write_webp_with_workflow(artifact, UI_WORKFLOW) + document = extract_workflow_document(str(artifact)) + assert document == UI_WORKFLOW + + +def test_extract_from_plain_image_returns_none(tmp_path): + PIL = pytest.importorskip("PIL.Image") + artifact = tmp_path / "plain.png" + PIL.new("RGB", (8, 8)).save(artifact, format="PNG") + assert extract_workflow_document(str(artifact)) is None + assert materialize_workflow_document(str(artifact)) is None + + +def test_materialize_writes_derived_document_once(tmp_path): + artifact = tmp_path / "pack.zip" + _write_zip(artifact, {"workflow.json": json.dumps(API_WORKFLOW)}) + + derived = materialize_workflow_document(str(artifact)) + assert derived == str(tmp_path / f"pack{WORKFLOW_DOCUMENT_SUFFIX}") + with open(derived, "r", encoding="utf-8") as handle: + assert json.load(handle) == API_WORKFLOW + + # A fresh derived file is reused without re-extracting: corrupt the zip + # and confirm the cached document is still returned. + artifact_mtime = os.path.getmtime(artifact) + os.utime(derived, (artifact_mtime + 1, artifact_mtime + 1)) + artifact.write_bytes(b"corrupted") + assert materialize_workflow_document(str(artifact)) == derived + + +def test_materialize_reextracts_when_artifact_is_newer(tmp_path): + artifact = tmp_path / "pack.zip" + _write_zip(artifact, {"workflow.json": json.dumps(API_WORKFLOW)}) + + derived = materialize_workflow_document(str(artifact)) + + # Replace the artifact with a newer mtime than the derived document. + _write_zip(artifact, {"workflow.json": json.dumps(UI_WORKFLOW)}) + artifact_mtime = os.path.getmtime(artifact) + os.utime(artifact, (artifact_mtime + 10, artifact_mtime + 10)) + + assert materialize_workflow_document(str(artifact)) == derived + with open(derived, "r", encoding="utf-8") as handle: + assert json.load(handle) == UI_WORKFLOW + + +def test_load_artifact_workflow_document_round_trip(tmp_path): + artifact = tmp_path / "pack.zip" + _write_zip(artifact, {"workflow.json": json.dumps(API_WORKFLOW)}) + assert load_artifact_workflow_document(str(artifact)) == API_WORKFLOW + + bare = tmp_path / "bare.json" + _write_json(bare, UI_WORKFLOW) + assert load_artifact_workflow_document(str(bare)) == UI_WORKFLOW diff --git a/web/comfyui/vue-widgets/lora-manager-widgets.js b/web/comfyui/vue-widgets/lora-manager-widgets.js index 1d950a37..facd846a 100644 --- a/web/comfyui/vue-widgets/lora-manager-widgets.js +++ b/web/comfyui/vue-widgets/lora-manager-widgets.js @@ -15904,6 +15904,34 @@ function findModeAccessor(node) { return null; } function interceptModeChange(node, onModeChange) { + if (!node || typeof onModeChange !== "function") { + return; + } + if (!Array.isArray(node._lmModeChangeListeners)) { + Object.defineProperty(node, "_lmModeChangeListeners", { + configurable: true, + writable: true, + value: [] + }); + } + node._lmModeChangeListeners.push(onModeChange); + if (node._lmModeChangeIntercepted) { + return; + } + Object.defineProperty(node, "_lmModeChangeIntercepted", { + configurable: true, + writable: true, + value: true + }); + const notify = (newMode, oldMode) => { + for (const listener of node._lmModeChangeListeners ?? []) { + try { + listener(newMode, oldMode); + } catch (listenerError) { + console.error("LoRA Manager: mode change listener failed", listenerError); + } + } + }; const delegate = findModeAccessor(node); if (delegate && typeof delegate.get === "function" && typeof delegate.set === "function") { Object.defineProperty(node, "mode", { @@ -15915,7 +15943,7 @@ function interceptModeChange(node, onModeChange) { const oldValue = delegate.get.call(this); delegate.set.call(this, value); if (oldValue !== value) { - onModeChange(value, oldValue); + notify(value, oldValue); } } }); @@ -15931,7 +15959,7 @@ function interceptModeChange(node, onModeChange) { const oldValue = currentMode; currentMode = value; if (oldValue !== value) { - onModeChange(value, oldValue); + notify(value, oldValue); } } }); diff --git a/web/comfyui/vue-widgets/lora-manager-widgets.js.map b/web/comfyui/vue-widgets/lora-manager-widgets.js.map index 6e549758..7f44545e 100644 --- a/web/comfyui/vue-widgets/lora-manager-widgets.js.map +++ b/web/comfyui/vue-widgets/lora-manager-widgets.js.map @@ -1 +1 @@ -{"version":3,"file":"lora-manager-widgets.js","sources":["../../../vue-widgets/node_modules/@vue/shared/dist/shared.esm-bundler.js","../../../vue-widgets/node_modules/@vue/reactivity/dist/reactivity.esm-bundler.js","../../../vue-widgets/node_modules/@vue/runtime-core/dist/runtime-core.esm-bundler.js","../../../vue-widgets/node_modules/@vue/runtime-dom/dist/runtime-dom.esm-bundler.js","../../../vue-widgets/node_modules/@primeuix/utils/dist/object/index.mjs","../../../vue-widgets/node_modules/@primeuix/utils/dist/eventbus/index.mjs","../../../vue-widgets/node_modules/@primeuix/utils/dist/dom/index.mjs","../../../vue-widgets/node_modules/@primeuix/styled/dist/index.mjs","../../../vue-widgets/node_modules/@primevue/core/api/index.mjs","../../../vue-widgets/node_modules/@primeuix/styles/dist/base/index.mjs","../../../vue-widgets/node_modules/@primevue/core/usestyle/index.mjs","../../../vue-widgets/node_modules/@primevue/core/base/style/index.mjs","../../../vue-widgets/node_modules/@primevue/core/service/index.mjs","../../../vue-widgets/node_modules/@primevue/core/config/index.mjs","../../../vue-widgets/src/components/lora-pool/shared/FilterChip.vue","../../../vue-widgets/src/components/lora-pool/shared/EditButton.vue","../../../vue-widgets/src/components/lora-pool/sections/BaseModelSection.vue","../../../vue-widgets/src/components/lora-pool/sections/TagsSection.vue","../../../vue-widgets/src/components/lora-pool/sections/FoldersSection.vue","../../../vue-widgets/src/components/lora-pool/sections/NamePatternsSection.vue","../../../vue-widgets/src/components/lora-pool/sections/LicenseSection.vue","../../../vue-widgets/src/components/lora-pool/LoraPoolPreview.vue","../../../vue-widgets/src/components/lora-pool/LoraPoolSummaryView.vue","../../../vue-widgets/src/components/lora-pool/modals/ModalWrapper.vue","../../../vue-widgets/src/components/lora-pool/modals/BaseModelModal.vue","../../../vue-widgets/src/components/lora-pool/modals/TagsModal.vue","../../../vue-widgets/src/components/lora-pool/modals/FolderTreeNode.vue","../../../vue-widgets/src/components/lora-pool/modals/FoldersModal.vue","../../../vue-widgets/src/utils/basePath.ts","../../../vue-widgets/src/composables/useLoraPoolApi.ts","../../../vue-widgets/src/composables/useLoraPoolState.ts","../../../vue-widgets/src/composables/useModalState.ts","../../../vue-widgets/src/components/LoraPoolWidget.vue","../../../vue-widgets/src/components/lora-randomizer/LastUsedPreview.vue","../../../vue-widgets/src/components/shared/SingleSlider.vue","../../../vue-widgets/src/components/shared/DualRangeSlider.vue","../../../vue-widgets/src/components/lora-randomizer/LoraRandomizerSettingsView.vue","../../../vue-widgets/src/composables/useLoraRandomizerState.ts","../../../vue-widgets/src/components/LoraRandomizerWidget.vue","../../../vue-widgets/src/components/lora-cycler/LoraCyclerSettingsView.vue","../../../vue-widgets/src/components/lora-cycler/LoraListModal.vue","../../../vue-widgets/src/composables/useLoraCyclerState.ts","../../../vue-widgets/src/components/LoraCyclerWidget.vue","../../../vue-widgets/src/components/JsonDisplayWidget.vue","../../../vue-widgets/src/composables/useAutocomplete.ts","../../../vue-widgets/src/components/AutocompleteTextWidget.vue","../../../vue-widgets/src/components/LoraInfoWidget.vue","../../../vue-widgets/src/vue-widget-cleanup.ts","../autocomplete.js","../base_path.js","../utils.js","../../../vue-widgets/src/mode-change-handler.ts","../../../vue-widgets/src/main.ts"],"sourcesContent":["/**\n* @vue/shared v3.5.26\n* (c) 2018-present Yuxi (Evan) You and Vue contributors\n* @license MIT\n**/\n// @__NO_SIDE_EFFECTS__\nfunction makeMap(str) {\n const map = /* @__PURE__ */ Object.create(null);\n for (const key of str.split(\",\")) map[key] = 1;\n return (val) => val in map;\n}\n\nconst EMPTY_OBJ = !!(process.env.NODE_ENV !== \"production\") ? Object.freeze({}) : {};\nconst EMPTY_ARR = !!(process.env.NODE_ENV !== \"production\") ? Object.freeze([]) : [];\nconst NOOP = () => {\n};\nconst NO = () => false;\nconst isOn = (key) => key.charCodeAt(0) === 111 && key.charCodeAt(1) === 110 && // uppercase letter\n(key.charCodeAt(2) > 122 || key.charCodeAt(2) < 97);\nconst isModelListener = (key) => key.startsWith(\"onUpdate:\");\nconst extend = Object.assign;\nconst remove = (arr, el) => {\n const i = arr.indexOf(el);\n if (i > -1) {\n arr.splice(i, 1);\n }\n};\nconst hasOwnProperty = Object.prototype.hasOwnProperty;\nconst hasOwn = (val, key) => hasOwnProperty.call(val, key);\nconst isArray = Array.isArray;\nconst isMap = (val) => toTypeString(val) === \"[object Map]\";\nconst isSet = (val) => toTypeString(val) === \"[object Set]\";\nconst isDate = (val) => toTypeString(val) === \"[object Date]\";\nconst isRegExp = (val) => toTypeString(val) === \"[object RegExp]\";\nconst isFunction = (val) => typeof val === \"function\";\nconst isString = (val) => typeof val === \"string\";\nconst isSymbol = (val) => typeof val === \"symbol\";\nconst isObject = (val) => val !== null && typeof val === \"object\";\nconst isPromise = (val) => {\n return (isObject(val) || isFunction(val)) && isFunction(val.then) && isFunction(val.catch);\n};\nconst objectToString = Object.prototype.toString;\nconst toTypeString = (value) => objectToString.call(value);\nconst toRawType = (value) => {\n return toTypeString(value).slice(8, -1);\n};\nconst isPlainObject = (val) => toTypeString(val) === \"[object Object]\";\nconst isIntegerKey = (key) => isString(key) && key !== \"NaN\" && key[0] !== \"-\" && \"\" + parseInt(key, 10) === key;\nconst isReservedProp = /* @__PURE__ */ makeMap(\n // the leading comma is intentional so empty string \"\" is also included\n \",key,ref,ref_for,ref_key,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted\"\n);\nconst isBuiltInDirective = /* @__PURE__ */ makeMap(\n \"bind,cloak,else-if,else,for,html,if,model,on,once,pre,show,slot,text,memo\"\n);\nconst cacheStringFunction = (fn) => {\n const cache = /* @__PURE__ */ Object.create(null);\n return ((str) => {\n const hit = cache[str];\n return hit || (cache[str] = fn(str));\n });\n};\nconst camelizeRE = /-\\w/g;\nconst camelize = cacheStringFunction(\n (str) => {\n return str.replace(camelizeRE, (c) => c.slice(1).toUpperCase());\n }\n);\nconst hyphenateRE = /\\B([A-Z])/g;\nconst hyphenate = cacheStringFunction(\n (str) => str.replace(hyphenateRE, \"-$1\").toLowerCase()\n);\nconst capitalize = cacheStringFunction((str) => {\n return str.charAt(0).toUpperCase() + str.slice(1);\n});\nconst toHandlerKey = cacheStringFunction(\n (str) => {\n const s = str ? `on${capitalize(str)}` : ``;\n return s;\n }\n);\nconst hasChanged = (value, oldValue) => !Object.is(value, oldValue);\nconst invokeArrayFns = (fns, ...arg) => {\n for (let i = 0; i < fns.length; i++) {\n fns[i](...arg);\n }\n};\nconst def = (obj, key, value, writable = false) => {\n Object.defineProperty(obj, key, {\n configurable: true,\n enumerable: false,\n writable,\n value\n });\n};\nconst looseToNumber = (val) => {\n const n = parseFloat(val);\n return isNaN(n) ? val : n;\n};\nconst toNumber = (val) => {\n const n = isString(val) ? Number(val) : NaN;\n return isNaN(n) ? val : n;\n};\nlet _globalThis;\nconst getGlobalThis = () => {\n return _globalThis || (_globalThis = typeof globalThis !== \"undefined\" ? globalThis : typeof self !== \"undefined\" ? self : typeof window !== \"undefined\" ? window : typeof global !== \"undefined\" ? global : {});\n};\nconst identRE = /^[_$a-zA-Z\\xA0-\\uFFFF][_$a-zA-Z0-9\\xA0-\\uFFFF]*$/;\nfunction genPropsAccessExp(name) {\n return identRE.test(name) ? `__props.${name}` : `__props[${JSON.stringify(name)}]`;\n}\nfunction genCacheKey(source, options) {\n return source + JSON.stringify(\n options,\n (_, val) => typeof val === \"function\" ? val.toString() : val\n );\n}\n\nconst PatchFlags = {\n \"TEXT\": 1,\n \"1\": \"TEXT\",\n \"CLASS\": 2,\n \"2\": \"CLASS\",\n \"STYLE\": 4,\n \"4\": \"STYLE\",\n \"PROPS\": 8,\n \"8\": \"PROPS\",\n \"FULL_PROPS\": 16,\n \"16\": \"FULL_PROPS\",\n \"NEED_HYDRATION\": 32,\n \"32\": \"NEED_HYDRATION\",\n \"STABLE_FRAGMENT\": 64,\n \"64\": \"STABLE_FRAGMENT\",\n \"KEYED_FRAGMENT\": 128,\n \"128\": \"KEYED_FRAGMENT\",\n \"UNKEYED_FRAGMENT\": 256,\n \"256\": \"UNKEYED_FRAGMENT\",\n \"NEED_PATCH\": 512,\n \"512\": \"NEED_PATCH\",\n \"DYNAMIC_SLOTS\": 1024,\n \"1024\": \"DYNAMIC_SLOTS\",\n \"DEV_ROOT_FRAGMENT\": 2048,\n \"2048\": \"DEV_ROOT_FRAGMENT\",\n \"CACHED\": -1,\n \"-1\": \"CACHED\",\n \"BAIL\": -2,\n \"-2\": \"BAIL\"\n};\nconst PatchFlagNames = {\n [1]: `TEXT`,\n [2]: `CLASS`,\n [4]: `STYLE`,\n [8]: `PROPS`,\n [16]: `FULL_PROPS`,\n [32]: `NEED_HYDRATION`,\n [64]: `STABLE_FRAGMENT`,\n [128]: `KEYED_FRAGMENT`,\n [256]: `UNKEYED_FRAGMENT`,\n [512]: `NEED_PATCH`,\n [1024]: `DYNAMIC_SLOTS`,\n [2048]: `DEV_ROOT_FRAGMENT`,\n [-1]: `CACHED`,\n [-2]: `BAIL`\n};\n\nconst ShapeFlags = {\n \"ELEMENT\": 1,\n \"1\": \"ELEMENT\",\n \"FUNCTIONAL_COMPONENT\": 2,\n \"2\": \"FUNCTIONAL_COMPONENT\",\n \"STATEFUL_COMPONENT\": 4,\n \"4\": \"STATEFUL_COMPONENT\",\n \"TEXT_CHILDREN\": 8,\n \"8\": \"TEXT_CHILDREN\",\n \"ARRAY_CHILDREN\": 16,\n \"16\": \"ARRAY_CHILDREN\",\n \"SLOTS_CHILDREN\": 32,\n \"32\": \"SLOTS_CHILDREN\",\n \"TELEPORT\": 64,\n \"64\": \"TELEPORT\",\n \"SUSPENSE\": 128,\n \"128\": \"SUSPENSE\",\n \"COMPONENT_SHOULD_KEEP_ALIVE\": 256,\n \"256\": \"COMPONENT_SHOULD_KEEP_ALIVE\",\n \"COMPONENT_KEPT_ALIVE\": 512,\n \"512\": \"COMPONENT_KEPT_ALIVE\",\n \"COMPONENT\": 6,\n \"6\": \"COMPONENT\"\n};\n\nconst SlotFlags = {\n \"STABLE\": 1,\n \"1\": \"STABLE\",\n \"DYNAMIC\": 2,\n \"2\": \"DYNAMIC\",\n \"FORWARDED\": 3,\n \"3\": \"FORWARDED\"\n};\nconst slotFlagsText = {\n [1]: \"STABLE\",\n [2]: \"DYNAMIC\",\n [3]: \"FORWARDED\"\n};\n\nconst GLOBALS_ALLOWED = \"Infinity,undefined,NaN,isFinite,isNaN,parseFloat,parseInt,decodeURI,decodeURIComponent,encodeURI,encodeURIComponent,Math,Number,Date,Array,Object,Boolean,String,RegExp,Map,Set,JSON,Intl,BigInt,console,Error,Symbol\";\nconst isGloballyAllowed = /* @__PURE__ */ makeMap(GLOBALS_ALLOWED);\nconst isGloballyWhitelisted = isGloballyAllowed;\n\nconst range = 2;\nfunction generateCodeFrame(source, start = 0, end = source.length) {\n start = Math.max(0, Math.min(start, source.length));\n end = Math.max(0, Math.min(end, source.length));\n if (start > end) return \"\";\n let lines = source.split(/(\\r?\\n)/);\n const newlineSequences = lines.filter((_, idx) => idx % 2 === 1);\n lines = lines.filter((_, idx) => idx % 2 === 0);\n let count = 0;\n const res = [];\n for (let i = 0; i < lines.length; i++) {\n count += lines[i].length + (newlineSequences[i] && newlineSequences[i].length || 0);\n if (count >= start) {\n for (let j = i - range; j <= i + range || end > count; j++) {\n if (j < 0 || j >= lines.length) continue;\n const line = j + 1;\n res.push(\n `${line}${\" \".repeat(Math.max(3 - String(line).length, 0))}| ${lines[j]}`\n );\n const lineLength = lines[j].length;\n const newLineSeqLength = newlineSequences[j] && newlineSequences[j].length || 0;\n if (j === i) {\n const pad = start - (count - (lineLength + newLineSeqLength));\n const length = Math.max(\n 1,\n end > count ? lineLength - pad : end - start\n );\n res.push(` | ` + \" \".repeat(pad) + \"^\".repeat(length));\n } else if (j > i) {\n if (end > count) {\n const length = Math.max(Math.min(end - count, lineLength), 1);\n res.push(` | ` + \"^\".repeat(length));\n }\n count += lineLength + newLineSeqLength;\n }\n }\n break;\n }\n }\n return res.join(\"\\n\");\n}\n\nfunction normalizeStyle(value) {\n if (isArray(value)) {\n const res = {};\n for (let i = 0; i < value.length; i++) {\n const item = value[i];\n const normalized = isString(item) ? parseStringStyle(item) : normalizeStyle(item);\n if (normalized) {\n for (const key in normalized) {\n res[key] = normalized[key];\n }\n }\n }\n return res;\n } else if (isString(value) || isObject(value)) {\n return value;\n }\n}\nconst listDelimiterRE = /;(?![^(]*\\))/g;\nconst propertyDelimiterRE = /:([^]+)/;\nconst styleCommentRE = /\\/\\*[^]*?\\*\\//g;\nfunction parseStringStyle(cssText) {\n const ret = {};\n cssText.replace(styleCommentRE, \"\").split(listDelimiterRE).forEach((item) => {\n if (item) {\n const tmp = item.split(propertyDelimiterRE);\n tmp.length > 1 && (ret[tmp[0].trim()] = tmp[1].trim());\n }\n });\n return ret;\n}\nfunction stringifyStyle(styles) {\n if (!styles) return \"\";\n if (isString(styles)) return styles;\n let ret = \"\";\n for (const key in styles) {\n const value = styles[key];\n if (isString(value) || typeof value === \"number\") {\n const normalizedKey = key.startsWith(`--`) ? key : hyphenate(key);\n ret += `${normalizedKey}:${value};`;\n }\n }\n return ret;\n}\nfunction normalizeClass(value) {\n let res = \"\";\n if (isString(value)) {\n res = value;\n } else if (isArray(value)) {\n for (let i = 0; i < value.length; i++) {\n const normalized = normalizeClass(value[i]);\n if (normalized) {\n res += normalized + \" \";\n }\n }\n } else if (isObject(value)) {\n for (const name in value) {\n if (value[name]) {\n res += name + \" \";\n }\n }\n }\n return res.trim();\n}\nfunction normalizeProps(props) {\n if (!props) return null;\n let { class: klass, style } = props;\n if (klass && !isString(klass)) {\n props.class = normalizeClass(klass);\n }\n if (style) {\n props.style = normalizeStyle(style);\n }\n return props;\n}\n\nconst HTML_TAGS = \"html,body,base,head,link,meta,style,title,address,article,aside,footer,header,hgroup,h1,h2,h3,h4,h5,h6,nav,section,div,dd,dl,dt,figcaption,figure,picture,hr,img,li,main,ol,p,pre,ul,a,b,abbr,bdi,bdo,br,cite,code,data,dfn,em,i,kbd,mark,q,rp,rt,ruby,s,samp,small,span,strong,sub,sup,time,u,var,wbr,area,audio,map,track,video,embed,object,param,source,canvas,script,noscript,del,ins,caption,col,colgroup,table,thead,tbody,td,th,tr,button,datalist,fieldset,form,input,label,legend,meter,optgroup,option,output,progress,select,textarea,details,dialog,menu,summary,template,blockquote,iframe,tfoot\";\nconst SVG_TAGS = \"svg,animate,animateMotion,animateTransform,circle,clipPath,color-profile,defs,desc,discard,ellipse,feBlend,feColorMatrix,feComponentTransfer,feComposite,feConvolveMatrix,feDiffuseLighting,feDisplacementMap,feDistantLight,feDropShadow,feFlood,feFuncA,feFuncB,feFuncG,feFuncR,feGaussianBlur,feImage,feMerge,feMergeNode,feMorphology,feOffset,fePointLight,feSpecularLighting,feSpotLight,feTile,feTurbulence,filter,foreignObject,g,hatch,hatchpath,image,line,linearGradient,marker,mask,mesh,meshgradient,meshpatch,meshrow,metadata,mpath,path,pattern,polygon,polyline,radialGradient,rect,set,solidcolor,stop,switch,symbol,text,textPath,title,tspan,unknown,use,view\";\nconst MATH_TAGS = \"annotation,annotation-xml,maction,maligngroup,malignmark,math,menclose,merror,mfenced,mfrac,mfraction,mglyph,mi,mlabeledtr,mlongdiv,mmultiscripts,mn,mo,mover,mpadded,mphantom,mprescripts,mroot,mrow,ms,mscarries,mscarry,msgroup,msline,mspace,msqrt,msrow,mstack,mstyle,msub,msubsup,msup,mtable,mtd,mtext,mtr,munder,munderover,none,semantics\";\nconst VOID_TAGS = \"area,base,br,col,embed,hr,img,input,link,meta,param,source,track,wbr\";\nconst isHTMLTag = /* @__PURE__ */ makeMap(HTML_TAGS);\nconst isSVGTag = /* @__PURE__ */ makeMap(SVG_TAGS);\nconst isMathMLTag = /* @__PURE__ */ makeMap(MATH_TAGS);\nconst isVoidTag = /* @__PURE__ */ makeMap(VOID_TAGS);\n\nconst specialBooleanAttrs = `itemscope,allowfullscreen,formnovalidate,ismap,nomodule,novalidate,readonly`;\nconst isSpecialBooleanAttr = /* @__PURE__ */ makeMap(specialBooleanAttrs);\nconst isBooleanAttr = /* @__PURE__ */ makeMap(\n specialBooleanAttrs + `,async,autofocus,autoplay,controls,default,defer,disabled,hidden,inert,loop,open,required,reversed,scoped,seamless,checked,muted,multiple,selected`\n);\nfunction includeBooleanAttr(value) {\n return !!value || value === \"\";\n}\nconst unsafeAttrCharRE = /[>/=\"'\\u0009\\u000a\\u000c\\u0020]/;\nconst attrValidationCache = {};\nfunction isSSRSafeAttrName(name) {\n if (attrValidationCache.hasOwnProperty(name)) {\n return attrValidationCache[name];\n }\n const isUnsafe = unsafeAttrCharRE.test(name);\n if (isUnsafe) {\n console.error(`unsafe attribute name: ${name}`);\n }\n return attrValidationCache[name] = !isUnsafe;\n}\nconst propsToAttrMap = {\n acceptCharset: \"accept-charset\",\n className: \"class\",\n htmlFor: \"for\",\n httpEquiv: \"http-equiv\"\n};\nconst isKnownHtmlAttr = /* @__PURE__ */ makeMap(\n `accept,accept-charset,accesskey,action,align,allow,alt,async,autocapitalize,autocomplete,autofocus,autoplay,background,bgcolor,border,buffered,capture,challenge,charset,checked,cite,class,code,codebase,color,cols,colspan,content,contenteditable,contextmenu,controls,coords,crossorigin,csp,data,datetime,decoding,default,defer,dir,dirname,disabled,download,draggable,dropzone,enctype,enterkeyhint,for,form,formaction,formenctype,formmethod,formnovalidate,formtarget,headers,height,hidden,high,href,hreflang,http-equiv,icon,id,importance,inert,integrity,ismap,itemprop,keytype,kind,label,lang,language,loading,list,loop,low,manifest,max,maxlength,minlength,media,min,multiple,muted,name,novalidate,open,optimum,pattern,ping,placeholder,poster,preload,radiogroup,readonly,referrerpolicy,rel,required,reversed,rows,rowspan,sandbox,scope,scoped,selected,shape,size,sizes,slot,span,spellcheck,src,srcdoc,srclang,srcset,start,step,style,summary,tabindex,target,title,translate,type,usemap,value,width,wrap`\n);\nconst isKnownSvgAttr = /* @__PURE__ */ makeMap(\n `xmlns,accent-height,accumulate,additive,alignment-baseline,alphabetic,amplitude,arabic-form,ascent,attributeName,attributeType,azimuth,baseFrequency,baseline-shift,baseProfile,bbox,begin,bias,by,calcMode,cap-height,class,clip,clipPathUnits,clip-path,clip-rule,color,color-interpolation,color-interpolation-filters,color-profile,color-rendering,contentScriptType,contentStyleType,crossorigin,cursor,cx,cy,d,decelerate,descent,diffuseConstant,direction,display,divisor,dominant-baseline,dur,dx,dy,edgeMode,elevation,enable-background,end,exponent,fill,fill-opacity,fill-rule,filter,filterRes,filterUnits,flood-color,flood-opacity,font-family,font-size,font-size-adjust,font-stretch,font-style,font-variant,font-weight,format,from,fr,fx,fy,g1,g2,glyph-name,glyph-orientation-horizontal,glyph-orientation-vertical,glyphRef,gradientTransform,gradientUnits,hanging,height,href,hreflang,horiz-adv-x,horiz-origin-x,id,ideographic,image-rendering,in,in2,intercept,k,k1,k2,k3,k4,kernelMatrix,kernelUnitLength,kerning,keyPoints,keySplines,keyTimes,lang,lengthAdjust,letter-spacing,lighting-color,limitingConeAngle,local,marker-end,marker-mid,marker-start,markerHeight,markerUnits,markerWidth,mask,maskContentUnits,maskUnits,mathematical,max,media,method,min,mode,name,numOctaves,offset,opacity,operator,order,orient,orientation,origin,overflow,overline-position,overline-thickness,panose-1,paint-order,path,pathLength,patternContentUnits,patternTransform,patternUnits,ping,pointer-events,points,pointsAtX,pointsAtY,pointsAtZ,preserveAlpha,preserveAspectRatio,primitiveUnits,r,radius,referrerPolicy,refX,refY,rel,rendering-intent,repeatCount,repeatDur,requiredExtensions,requiredFeatures,restart,result,rotate,rx,ry,scale,seed,shape-rendering,slope,spacing,specularConstant,specularExponent,speed,spreadMethod,startOffset,stdDeviation,stemh,stemv,stitchTiles,stop-color,stop-opacity,strikethrough-position,strikethrough-thickness,string,stroke,stroke-dasharray,stroke-dashoffset,stroke-linecap,stroke-linejoin,stroke-miterlimit,stroke-opacity,stroke-width,style,surfaceScale,systemLanguage,tabindex,tableValues,target,targetX,targetY,text-anchor,text-decoration,text-rendering,textLength,to,transform,transform-origin,type,u1,u2,underline-position,underline-thickness,unicode,unicode-bidi,unicode-range,units-per-em,v-alphabetic,v-hanging,v-ideographic,v-mathematical,values,vector-effect,version,vert-adv-y,vert-origin-x,vert-origin-y,viewBox,viewTarget,visibility,width,widths,word-spacing,writing-mode,x,x-height,x1,x2,xChannelSelector,xlink:actuate,xlink:arcrole,xlink:href,xlink:role,xlink:show,xlink:title,xlink:type,xmlns:xlink,xml:base,xml:lang,xml:space,y,y1,y2,yChannelSelector,z,zoomAndPan`\n);\nconst isKnownMathMLAttr = /* @__PURE__ */ makeMap(\n `accent,accentunder,actiontype,align,alignmentscope,altimg,altimg-height,altimg-valign,altimg-width,alttext,bevelled,close,columnsalign,columnlines,columnspan,denomalign,depth,dir,display,displaystyle,encoding,equalcolumns,equalrows,fence,fontstyle,fontweight,form,frame,framespacing,groupalign,height,href,id,indentalign,indentalignfirst,indentalignlast,indentshift,indentshiftfirst,indentshiftlast,indextype,justify,largetop,largeop,lquote,lspace,mathbackground,mathcolor,mathsize,mathvariant,maxsize,minlabelspacing,mode,other,overflow,position,rowalign,rowlines,rowspan,rquote,rspace,scriptlevel,scriptminsize,scriptsizemultiplier,selection,separator,separators,shift,side,src,stackalign,stretchy,subscriptshift,superscriptshift,symmetric,voffset,width,widths,xlink:href,xlink:show,xlink:type,xmlns`\n);\nfunction isRenderableAttrValue(value) {\n if (value == null) {\n return false;\n }\n const type = typeof value;\n return type === \"string\" || type === \"number\" || type === \"boolean\";\n}\n\nconst escapeRE = /[\"'&<>]/;\nfunction escapeHtml(string) {\n const str = \"\" + string;\n const match = escapeRE.exec(str);\n if (!match) {\n return str;\n }\n let html = \"\";\n let escaped;\n let index;\n let lastIndex = 0;\n for (index = match.index; index < str.length; index++) {\n switch (str.charCodeAt(index)) {\n case 34:\n escaped = \""\";\n break;\n case 38:\n escaped = \"&\";\n break;\n case 39:\n escaped = \"'\";\n break;\n case 60:\n escaped = \"<\";\n break;\n case 62:\n escaped = \">\";\n break;\n default:\n continue;\n }\n if (lastIndex !== index) {\n html += str.slice(lastIndex, index);\n }\n lastIndex = index + 1;\n html += escaped;\n }\n return lastIndex !== index ? html + str.slice(lastIndex, index) : html;\n}\nconst commentStripRE = /^-?>||--!>|?@[\\\\\\]^`{|}~]/g;\nfunction getEscapedCssVarName(key, doubleEscape) {\n return key.replace(\n cssVarNameEscapeSymbolsRE,\n (s) => doubleEscape ? s === '\"' ? '\\\\\\\\\\\\\"' : `\\\\\\\\${s}` : `\\\\${s}`\n );\n}\n\nfunction looseCompareArrays(a, b) {\n if (a.length !== b.length) return false;\n let equal = true;\n for (let i = 0; equal && i < a.length; i++) {\n equal = looseEqual(a[i], b[i]);\n }\n return equal;\n}\nfunction looseEqual(a, b) {\n if (a === b) return true;\n let aValidType = isDate(a);\n let bValidType = isDate(b);\n if (aValidType || bValidType) {\n return aValidType && bValidType ? a.getTime() === b.getTime() : false;\n }\n aValidType = isSymbol(a);\n bValidType = isSymbol(b);\n if (aValidType || bValidType) {\n return a === b;\n }\n aValidType = isArray(a);\n bValidType = isArray(b);\n if (aValidType || bValidType) {\n return aValidType && bValidType ? looseCompareArrays(a, b) : false;\n }\n aValidType = isObject(a);\n bValidType = isObject(b);\n if (aValidType || bValidType) {\n if (!aValidType || !bValidType) {\n return false;\n }\n const aKeysCount = Object.keys(a).length;\n const bKeysCount = Object.keys(b).length;\n if (aKeysCount !== bKeysCount) {\n return false;\n }\n for (const key in a) {\n const aHasKey = a.hasOwnProperty(key);\n const bHasKey = b.hasOwnProperty(key);\n if (aHasKey && !bHasKey || !aHasKey && bHasKey || !looseEqual(a[key], b[key])) {\n return false;\n }\n }\n }\n return String(a) === String(b);\n}\nfunction looseIndexOf(arr, val) {\n return arr.findIndex((item) => looseEqual(item, val));\n}\n\nconst isRef = (val) => {\n return !!(val && val[\"__v_isRef\"] === true);\n};\nconst toDisplayString = (val) => {\n return isString(val) ? val : val == null ? \"\" : isArray(val) || isObject(val) && (val.toString === objectToString || !isFunction(val.toString)) ? isRef(val) ? toDisplayString(val.value) : JSON.stringify(val, replacer, 2) : String(val);\n};\nconst replacer = (_key, val) => {\n if (isRef(val)) {\n return replacer(_key, val.value);\n } else if (isMap(val)) {\n return {\n [`Map(${val.size})`]: [...val.entries()].reduce(\n (entries, [key, val2], i) => {\n entries[stringifySymbol(key, i) + \" =>\"] = val2;\n return entries;\n },\n {}\n )\n };\n } else if (isSet(val)) {\n return {\n [`Set(${val.size})`]: [...val.values()].map((v) => stringifySymbol(v))\n };\n } else if (isSymbol(val)) {\n return stringifySymbol(val);\n } else if (isObject(val) && !isArray(val) && !isPlainObject(val)) {\n return String(val);\n }\n return val;\n};\nconst stringifySymbol = (v, i = \"\") => {\n var _a;\n return (\n // Symbol.description in es2019+ so we need to cast here to pass\n // the lib: es2016 check\n isSymbol(v) ? `Symbol(${(_a = v.description) != null ? _a : i})` : v\n );\n};\n\nfunction normalizeCssVarValue(value) {\n if (value == null) {\n return \"initial\";\n }\n if (typeof value === \"string\") {\n return value === \"\" ? \" \" : value;\n }\n if (typeof value !== \"number\" || !Number.isFinite(value)) {\n if (!!(process.env.NODE_ENV !== \"production\")) {\n console.warn(\n \"[Vue warn] Invalid value used for CSS binding. Expected a string or a finite number but received:\",\n value\n );\n }\n }\n return String(value);\n}\n\nexport { EMPTY_ARR, EMPTY_OBJ, NO, NOOP, PatchFlagNames, PatchFlags, ShapeFlags, SlotFlags, camelize, capitalize, cssVarNameEscapeSymbolsRE, def, escapeHtml, escapeHtmlComment, extend, genCacheKey, genPropsAccessExp, generateCodeFrame, getEscapedCssVarName, getGlobalThis, hasChanged, hasOwn, hyphenate, includeBooleanAttr, invokeArrayFns, isArray, isBooleanAttr, isBuiltInDirective, isDate, isFunction, isGloballyAllowed, isGloballyWhitelisted, isHTMLTag, isIntegerKey, isKnownHtmlAttr, isKnownMathMLAttr, isKnownSvgAttr, isMap, isMathMLTag, isModelListener, isObject, isOn, isPlainObject, isPromise, isRegExp, isRenderableAttrValue, isReservedProp, isSSRSafeAttrName, isSVGTag, isSet, isSpecialBooleanAttr, isString, isSymbol, isVoidTag, looseEqual, looseIndexOf, looseToNumber, makeMap, normalizeClass, normalizeCssVarValue, normalizeProps, normalizeStyle, objectToString, parseStringStyle, propsToAttrMap, remove, slotFlagsText, stringifyStyle, toDisplayString, toHandlerKey, toNumber, toRawType, toTypeString };\n","/**\n* @vue/reactivity v3.5.26\n* (c) 2018-present Yuxi (Evan) You and Vue contributors\n* @license MIT\n**/\nimport { extend, hasChanged, isArray, isIntegerKey, isSymbol, isMap, hasOwn, makeMap, isObject, capitalize, toRawType, def, isFunction, EMPTY_OBJ, isSet, isPlainObject, remove, NOOP } from '@vue/shared';\n\nfunction warn(msg, ...args) {\n console.warn(`[Vue warn] ${msg}`, ...args);\n}\n\nlet activeEffectScope;\nclass EffectScope {\n constructor(detached = false) {\n this.detached = detached;\n /**\n * @internal\n */\n this._active = true;\n /**\n * @internal track `on` calls, allow `on` call multiple times\n */\n this._on = 0;\n /**\n * @internal\n */\n this.effects = [];\n /**\n * @internal\n */\n this.cleanups = [];\n this._isPaused = false;\n this.parent = activeEffectScope;\n if (!detached && activeEffectScope) {\n this.index = (activeEffectScope.scopes || (activeEffectScope.scopes = [])).push(\n this\n ) - 1;\n }\n }\n get active() {\n return this._active;\n }\n pause() {\n if (this._active) {\n this._isPaused = true;\n let i, l;\n if (this.scopes) {\n for (i = 0, l = this.scopes.length; i < l; i++) {\n this.scopes[i].pause();\n }\n }\n for (i = 0, l = this.effects.length; i < l; i++) {\n this.effects[i].pause();\n }\n }\n }\n /**\n * Resumes the effect scope, including all child scopes and effects.\n */\n resume() {\n if (this._active) {\n if (this._isPaused) {\n this._isPaused = false;\n let i, l;\n if (this.scopes) {\n for (i = 0, l = this.scopes.length; i < l; i++) {\n this.scopes[i].resume();\n }\n }\n for (i = 0, l = this.effects.length; i < l; i++) {\n this.effects[i].resume();\n }\n }\n }\n }\n run(fn) {\n if (this._active) {\n const currentEffectScope = activeEffectScope;\n try {\n activeEffectScope = this;\n return fn();\n } finally {\n activeEffectScope = currentEffectScope;\n }\n } else if (!!(process.env.NODE_ENV !== \"production\")) {\n warn(`cannot run an inactive effect scope.`);\n }\n }\n /**\n * This should only be called on non-detached scopes\n * @internal\n */\n on() {\n if (++this._on === 1) {\n this.prevScope = activeEffectScope;\n activeEffectScope = this;\n }\n }\n /**\n * This should only be called on non-detached scopes\n * @internal\n */\n off() {\n if (this._on > 0 && --this._on === 0) {\n activeEffectScope = this.prevScope;\n this.prevScope = void 0;\n }\n }\n stop(fromParent) {\n if (this._active) {\n this._active = false;\n let i, l;\n for (i = 0, l = this.effects.length; i < l; i++) {\n this.effects[i].stop();\n }\n this.effects.length = 0;\n for (i = 0, l = this.cleanups.length; i < l; i++) {\n this.cleanups[i]();\n }\n this.cleanups.length = 0;\n if (this.scopes) {\n for (i = 0, l = this.scopes.length; i < l; i++) {\n this.scopes[i].stop(true);\n }\n this.scopes.length = 0;\n }\n if (!this.detached && this.parent && !fromParent) {\n const last = this.parent.scopes.pop();\n if (last && last !== this) {\n this.parent.scopes[this.index] = last;\n last.index = this.index;\n }\n }\n this.parent = void 0;\n }\n }\n}\nfunction effectScope(detached) {\n return new EffectScope(detached);\n}\nfunction getCurrentScope() {\n return activeEffectScope;\n}\nfunction onScopeDispose(fn, failSilently = false) {\n if (activeEffectScope) {\n activeEffectScope.cleanups.push(fn);\n } else if (!!(process.env.NODE_ENV !== \"production\") && !failSilently) {\n warn(\n `onScopeDispose() is called when there is no active effect scope to be associated with.`\n );\n }\n}\n\nlet activeSub;\nconst EffectFlags = {\n \"ACTIVE\": 1,\n \"1\": \"ACTIVE\",\n \"RUNNING\": 2,\n \"2\": \"RUNNING\",\n \"TRACKING\": 4,\n \"4\": \"TRACKING\",\n \"NOTIFIED\": 8,\n \"8\": \"NOTIFIED\",\n \"DIRTY\": 16,\n \"16\": \"DIRTY\",\n \"ALLOW_RECURSE\": 32,\n \"32\": \"ALLOW_RECURSE\",\n \"PAUSED\": 64,\n \"64\": \"PAUSED\",\n \"EVALUATED\": 128,\n \"128\": \"EVALUATED\"\n};\nconst pausedQueueEffects = /* @__PURE__ */ new WeakSet();\nclass ReactiveEffect {\n constructor(fn) {\n this.fn = fn;\n /**\n * @internal\n */\n this.deps = void 0;\n /**\n * @internal\n */\n this.depsTail = void 0;\n /**\n * @internal\n */\n this.flags = 1 | 4;\n /**\n * @internal\n */\n this.next = void 0;\n /**\n * @internal\n */\n this.cleanup = void 0;\n this.scheduler = void 0;\n if (activeEffectScope && activeEffectScope.active) {\n activeEffectScope.effects.push(this);\n }\n }\n pause() {\n this.flags |= 64;\n }\n resume() {\n if (this.flags & 64) {\n this.flags &= -65;\n if (pausedQueueEffects.has(this)) {\n pausedQueueEffects.delete(this);\n this.trigger();\n }\n }\n }\n /**\n * @internal\n */\n notify() {\n if (this.flags & 2 && !(this.flags & 32)) {\n return;\n }\n if (!(this.flags & 8)) {\n batch(this);\n }\n }\n run() {\n if (!(this.flags & 1)) {\n return this.fn();\n }\n this.flags |= 2;\n cleanupEffect(this);\n prepareDeps(this);\n const prevEffect = activeSub;\n const prevShouldTrack = shouldTrack;\n activeSub = this;\n shouldTrack = true;\n try {\n return this.fn();\n } finally {\n if (!!(process.env.NODE_ENV !== \"production\") && activeSub !== this) {\n warn(\n \"Active effect was not restored correctly - this is likely a Vue internal bug.\"\n );\n }\n cleanupDeps(this);\n activeSub = prevEffect;\n shouldTrack = prevShouldTrack;\n this.flags &= -3;\n }\n }\n stop() {\n if (this.flags & 1) {\n for (let link = this.deps; link; link = link.nextDep) {\n removeSub(link);\n }\n this.deps = this.depsTail = void 0;\n cleanupEffect(this);\n this.onStop && this.onStop();\n this.flags &= -2;\n }\n }\n trigger() {\n if (this.flags & 64) {\n pausedQueueEffects.add(this);\n } else if (this.scheduler) {\n this.scheduler();\n } else {\n this.runIfDirty();\n }\n }\n /**\n * @internal\n */\n runIfDirty() {\n if (isDirty(this)) {\n this.run();\n }\n }\n get dirty() {\n return isDirty(this);\n }\n}\nlet batchDepth = 0;\nlet batchedSub;\nlet batchedComputed;\nfunction batch(sub, isComputed = false) {\n sub.flags |= 8;\n if (isComputed) {\n sub.next = batchedComputed;\n batchedComputed = sub;\n return;\n }\n sub.next = batchedSub;\n batchedSub = sub;\n}\nfunction startBatch() {\n batchDepth++;\n}\nfunction endBatch() {\n if (--batchDepth > 0) {\n return;\n }\n if (batchedComputed) {\n let e = batchedComputed;\n batchedComputed = void 0;\n while (e) {\n const next = e.next;\n e.next = void 0;\n e.flags &= -9;\n e = next;\n }\n }\n let error;\n while (batchedSub) {\n let e = batchedSub;\n batchedSub = void 0;\n while (e) {\n const next = e.next;\n e.next = void 0;\n e.flags &= -9;\n if (e.flags & 1) {\n try {\n ;\n e.trigger();\n } catch (err) {\n if (!error) error = err;\n }\n }\n e = next;\n }\n }\n if (error) throw error;\n}\nfunction prepareDeps(sub) {\n for (let link = sub.deps; link; link = link.nextDep) {\n link.version = -1;\n link.prevActiveLink = link.dep.activeLink;\n link.dep.activeLink = link;\n }\n}\nfunction cleanupDeps(sub) {\n let head;\n let tail = sub.depsTail;\n let link = tail;\n while (link) {\n const prev = link.prevDep;\n if (link.version === -1) {\n if (link === tail) tail = prev;\n removeSub(link);\n removeDep(link);\n } else {\n head = link;\n }\n link.dep.activeLink = link.prevActiveLink;\n link.prevActiveLink = void 0;\n link = prev;\n }\n sub.deps = head;\n sub.depsTail = tail;\n}\nfunction isDirty(sub) {\n for (let link = sub.deps; link; link = link.nextDep) {\n if (link.dep.version !== link.version || link.dep.computed && (refreshComputed(link.dep.computed) || link.dep.version !== link.version)) {\n return true;\n }\n }\n if (sub._dirty) {\n return true;\n }\n return false;\n}\nfunction refreshComputed(computed) {\n if (computed.flags & 4 && !(computed.flags & 16)) {\n return;\n }\n computed.flags &= -17;\n if (computed.globalVersion === globalVersion) {\n return;\n }\n computed.globalVersion = globalVersion;\n if (!computed.isSSR && computed.flags & 128 && (!computed.deps && !computed._dirty || !isDirty(computed))) {\n return;\n }\n computed.flags |= 2;\n const dep = computed.dep;\n const prevSub = activeSub;\n const prevShouldTrack = shouldTrack;\n activeSub = computed;\n shouldTrack = true;\n try {\n prepareDeps(computed);\n const value = computed.fn(computed._value);\n if (dep.version === 0 || hasChanged(value, computed._value)) {\n computed.flags |= 128;\n computed._value = value;\n dep.version++;\n }\n } catch (err) {\n dep.version++;\n throw err;\n } finally {\n activeSub = prevSub;\n shouldTrack = prevShouldTrack;\n cleanupDeps(computed);\n computed.flags &= -3;\n }\n}\nfunction removeSub(link, soft = false) {\n const { dep, prevSub, nextSub } = link;\n if (prevSub) {\n prevSub.nextSub = nextSub;\n link.prevSub = void 0;\n }\n if (nextSub) {\n nextSub.prevSub = prevSub;\n link.nextSub = void 0;\n }\n if (!!(process.env.NODE_ENV !== \"production\") && dep.subsHead === link) {\n dep.subsHead = nextSub;\n }\n if (dep.subs === link) {\n dep.subs = prevSub;\n if (!prevSub && dep.computed) {\n dep.computed.flags &= -5;\n for (let l = dep.computed.deps; l; l = l.nextDep) {\n removeSub(l, true);\n }\n }\n }\n if (!soft && !--dep.sc && dep.map) {\n dep.map.delete(dep.key);\n }\n}\nfunction removeDep(link) {\n const { prevDep, nextDep } = link;\n if (prevDep) {\n prevDep.nextDep = nextDep;\n link.prevDep = void 0;\n }\n if (nextDep) {\n nextDep.prevDep = prevDep;\n link.nextDep = void 0;\n }\n}\nfunction effect(fn, options) {\n if (fn.effect instanceof ReactiveEffect) {\n fn = fn.effect.fn;\n }\n const e = new ReactiveEffect(fn);\n if (options) {\n extend(e, options);\n }\n try {\n e.run();\n } catch (err) {\n e.stop();\n throw err;\n }\n const runner = e.run.bind(e);\n runner.effect = e;\n return runner;\n}\nfunction stop(runner) {\n runner.effect.stop();\n}\nlet shouldTrack = true;\nconst trackStack = [];\nfunction pauseTracking() {\n trackStack.push(shouldTrack);\n shouldTrack = false;\n}\nfunction enableTracking() {\n trackStack.push(shouldTrack);\n shouldTrack = true;\n}\nfunction resetTracking() {\n const last = trackStack.pop();\n shouldTrack = last === void 0 ? true : last;\n}\nfunction onEffectCleanup(fn, failSilently = false) {\n if (activeSub instanceof ReactiveEffect) {\n activeSub.cleanup = fn;\n } else if (!!(process.env.NODE_ENV !== \"production\") && !failSilently) {\n warn(\n `onEffectCleanup() was called when there was no active effect to associate with.`\n );\n }\n}\nfunction cleanupEffect(e) {\n const { cleanup } = e;\n e.cleanup = void 0;\n if (cleanup) {\n const prevSub = activeSub;\n activeSub = void 0;\n try {\n cleanup();\n } finally {\n activeSub = prevSub;\n }\n }\n}\n\nlet globalVersion = 0;\nclass Link {\n constructor(sub, dep) {\n this.sub = sub;\n this.dep = dep;\n this.version = dep.version;\n this.nextDep = this.prevDep = this.nextSub = this.prevSub = this.prevActiveLink = void 0;\n }\n}\nclass Dep {\n // TODO isolatedDeclarations \"__v_skip\"\n constructor(computed) {\n this.computed = computed;\n this.version = 0;\n /**\n * Link between this dep and the current active effect\n */\n this.activeLink = void 0;\n /**\n * Doubly linked list representing the subscribing effects (tail)\n */\n this.subs = void 0;\n /**\n * For object property deps cleanup\n */\n this.map = void 0;\n this.key = void 0;\n /**\n * Subscriber counter\n */\n this.sc = 0;\n /**\n * @internal\n */\n this.__v_skip = true;\n if (!!(process.env.NODE_ENV !== \"production\")) {\n this.subsHead = void 0;\n }\n }\n track(debugInfo) {\n if (!activeSub || !shouldTrack || activeSub === this.computed) {\n return;\n }\n let link = this.activeLink;\n if (link === void 0 || link.sub !== activeSub) {\n link = this.activeLink = new Link(activeSub, this);\n if (!activeSub.deps) {\n activeSub.deps = activeSub.depsTail = link;\n } else {\n link.prevDep = activeSub.depsTail;\n activeSub.depsTail.nextDep = link;\n activeSub.depsTail = link;\n }\n addSub(link);\n } else if (link.version === -1) {\n link.version = this.version;\n if (link.nextDep) {\n const next = link.nextDep;\n next.prevDep = link.prevDep;\n if (link.prevDep) {\n link.prevDep.nextDep = next;\n }\n link.prevDep = activeSub.depsTail;\n link.nextDep = void 0;\n activeSub.depsTail.nextDep = link;\n activeSub.depsTail = link;\n if (activeSub.deps === link) {\n activeSub.deps = next;\n }\n }\n }\n if (!!(process.env.NODE_ENV !== \"production\") && activeSub.onTrack) {\n activeSub.onTrack(\n extend(\n {\n effect: activeSub\n },\n debugInfo\n )\n );\n }\n return link;\n }\n trigger(debugInfo) {\n this.version++;\n globalVersion++;\n this.notify(debugInfo);\n }\n notify(debugInfo) {\n startBatch();\n try {\n if (!!(process.env.NODE_ENV !== \"production\")) {\n for (let head = this.subsHead; head; head = head.nextSub) {\n if (head.sub.onTrigger && !(head.sub.flags & 8)) {\n head.sub.onTrigger(\n extend(\n {\n effect: head.sub\n },\n debugInfo\n )\n );\n }\n }\n }\n for (let link = this.subs; link; link = link.prevSub) {\n if (link.sub.notify()) {\n ;\n link.sub.dep.notify();\n }\n }\n } finally {\n endBatch();\n }\n }\n}\nfunction addSub(link) {\n link.dep.sc++;\n if (link.sub.flags & 4) {\n const computed = link.dep.computed;\n if (computed && !link.dep.subs) {\n computed.flags |= 4 | 16;\n for (let l = computed.deps; l; l = l.nextDep) {\n addSub(l);\n }\n }\n const currentTail = link.dep.subs;\n if (currentTail !== link) {\n link.prevSub = currentTail;\n if (currentTail) currentTail.nextSub = link;\n }\n if (!!(process.env.NODE_ENV !== \"production\") && link.dep.subsHead === void 0) {\n link.dep.subsHead = link;\n }\n link.dep.subs = link;\n }\n}\nconst targetMap = /* @__PURE__ */ new WeakMap();\nconst ITERATE_KEY = /* @__PURE__ */ Symbol(\n !!(process.env.NODE_ENV !== \"production\") ? \"Object iterate\" : \"\"\n);\nconst MAP_KEY_ITERATE_KEY = /* @__PURE__ */ Symbol(\n !!(process.env.NODE_ENV !== \"production\") ? \"Map keys iterate\" : \"\"\n);\nconst ARRAY_ITERATE_KEY = /* @__PURE__ */ Symbol(\n !!(process.env.NODE_ENV !== \"production\") ? \"Array iterate\" : \"\"\n);\nfunction track(target, type, key) {\n if (shouldTrack && activeSub) {\n let depsMap = targetMap.get(target);\n if (!depsMap) {\n targetMap.set(target, depsMap = /* @__PURE__ */ new Map());\n }\n let dep = depsMap.get(key);\n if (!dep) {\n depsMap.set(key, dep = new Dep());\n dep.map = depsMap;\n dep.key = key;\n }\n if (!!(process.env.NODE_ENV !== \"production\")) {\n dep.track({\n target,\n type,\n key\n });\n } else {\n dep.track();\n }\n }\n}\nfunction trigger(target, type, key, newValue, oldValue, oldTarget) {\n const depsMap = targetMap.get(target);\n if (!depsMap) {\n globalVersion++;\n return;\n }\n const run = (dep) => {\n if (dep) {\n if (!!(process.env.NODE_ENV !== \"production\")) {\n dep.trigger({\n target,\n type,\n key,\n newValue,\n oldValue,\n oldTarget\n });\n } else {\n dep.trigger();\n }\n }\n };\n startBatch();\n if (type === \"clear\") {\n depsMap.forEach(run);\n } else {\n const targetIsArray = isArray(target);\n const isArrayIndex = targetIsArray && isIntegerKey(key);\n if (targetIsArray && key === \"length\") {\n const newLength = Number(newValue);\n depsMap.forEach((dep, key2) => {\n if (key2 === \"length\" || key2 === ARRAY_ITERATE_KEY || !isSymbol(key2) && key2 >= newLength) {\n run(dep);\n }\n });\n } else {\n if (key !== void 0 || depsMap.has(void 0)) {\n run(depsMap.get(key));\n }\n if (isArrayIndex) {\n run(depsMap.get(ARRAY_ITERATE_KEY));\n }\n switch (type) {\n case \"add\":\n if (!targetIsArray) {\n run(depsMap.get(ITERATE_KEY));\n if (isMap(target)) {\n run(depsMap.get(MAP_KEY_ITERATE_KEY));\n }\n } else if (isArrayIndex) {\n run(depsMap.get(\"length\"));\n }\n break;\n case \"delete\":\n if (!targetIsArray) {\n run(depsMap.get(ITERATE_KEY));\n if (isMap(target)) {\n run(depsMap.get(MAP_KEY_ITERATE_KEY));\n }\n }\n break;\n case \"set\":\n if (isMap(target)) {\n run(depsMap.get(ITERATE_KEY));\n }\n break;\n }\n }\n }\n endBatch();\n}\nfunction getDepFromReactive(object, key) {\n const depMap = targetMap.get(object);\n return depMap && depMap.get(key);\n}\n\nfunction reactiveReadArray(array) {\n const raw = toRaw(array);\n if (raw === array) return raw;\n track(raw, \"iterate\", ARRAY_ITERATE_KEY);\n return isShallow(array) ? raw : raw.map(toReactive);\n}\nfunction shallowReadArray(arr) {\n track(arr = toRaw(arr), \"iterate\", ARRAY_ITERATE_KEY);\n return arr;\n}\nfunction toWrapped(target, item) {\n if (isReadonly(target)) {\n return isReactive(target) ? toReadonly(toReactive(item)) : toReadonly(item);\n }\n return toReactive(item);\n}\nconst arrayInstrumentations = {\n __proto__: null,\n [Symbol.iterator]() {\n return iterator(this, Symbol.iterator, (item) => toWrapped(this, item));\n },\n concat(...args) {\n return reactiveReadArray(this).concat(\n ...args.map((x) => isArray(x) ? reactiveReadArray(x) : x)\n );\n },\n entries() {\n return iterator(this, \"entries\", (value) => {\n value[1] = toWrapped(this, value[1]);\n return value;\n });\n },\n every(fn, thisArg) {\n return apply(this, \"every\", fn, thisArg, void 0, arguments);\n },\n filter(fn, thisArg) {\n return apply(\n this,\n \"filter\",\n fn,\n thisArg,\n (v) => v.map((item) => toWrapped(this, item)),\n arguments\n );\n },\n find(fn, thisArg) {\n return apply(\n this,\n \"find\",\n fn,\n thisArg,\n (item) => toWrapped(this, item),\n arguments\n );\n },\n findIndex(fn, thisArg) {\n return apply(this, \"findIndex\", fn, thisArg, void 0, arguments);\n },\n findLast(fn, thisArg) {\n return apply(\n this,\n \"findLast\",\n fn,\n thisArg,\n (item) => toWrapped(this, item),\n arguments\n );\n },\n findLastIndex(fn, thisArg) {\n return apply(this, \"findLastIndex\", fn, thisArg, void 0, arguments);\n },\n // flat, flatMap could benefit from ARRAY_ITERATE but are not straight-forward to implement\n forEach(fn, thisArg) {\n return apply(this, \"forEach\", fn, thisArg, void 0, arguments);\n },\n includes(...args) {\n return searchProxy(this, \"includes\", args);\n },\n indexOf(...args) {\n return searchProxy(this, \"indexOf\", args);\n },\n join(separator) {\n return reactiveReadArray(this).join(separator);\n },\n // keys() iterator only reads `length`, no optimization required\n lastIndexOf(...args) {\n return searchProxy(this, \"lastIndexOf\", args);\n },\n map(fn, thisArg) {\n return apply(this, \"map\", fn, thisArg, void 0, arguments);\n },\n pop() {\n return noTracking(this, \"pop\");\n },\n push(...args) {\n return noTracking(this, \"push\", args);\n },\n reduce(fn, ...args) {\n return reduce(this, \"reduce\", fn, args);\n },\n reduceRight(fn, ...args) {\n return reduce(this, \"reduceRight\", fn, args);\n },\n shift() {\n return noTracking(this, \"shift\");\n },\n // slice could use ARRAY_ITERATE but also seems to beg for range tracking\n some(fn, thisArg) {\n return apply(this, \"some\", fn, thisArg, void 0, arguments);\n },\n splice(...args) {\n return noTracking(this, \"splice\", args);\n },\n toReversed() {\n return reactiveReadArray(this).toReversed();\n },\n toSorted(comparer) {\n return reactiveReadArray(this).toSorted(comparer);\n },\n toSpliced(...args) {\n return reactiveReadArray(this).toSpliced(...args);\n },\n unshift(...args) {\n return noTracking(this, \"unshift\", args);\n },\n values() {\n return iterator(this, \"values\", (item) => toWrapped(this, item));\n }\n};\nfunction iterator(self, method, wrapValue) {\n const arr = shallowReadArray(self);\n const iter = arr[method]();\n if (arr !== self && !isShallow(self)) {\n iter._next = iter.next;\n iter.next = () => {\n const result = iter._next();\n if (!result.done) {\n result.value = wrapValue(result.value);\n }\n return result;\n };\n }\n return iter;\n}\nconst arrayProto = Array.prototype;\nfunction apply(self, method, fn, thisArg, wrappedRetFn, args) {\n const arr = shallowReadArray(self);\n const needsWrap = arr !== self && !isShallow(self);\n const methodFn = arr[method];\n if (methodFn !== arrayProto[method]) {\n const result2 = methodFn.apply(self, args);\n return needsWrap ? toReactive(result2) : result2;\n }\n let wrappedFn = fn;\n if (arr !== self) {\n if (needsWrap) {\n wrappedFn = function(item, index) {\n return fn.call(this, toWrapped(self, item), index, self);\n };\n } else if (fn.length > 2) {\n wrappedFn = function(item, index) {\n return fn.call(this, item, index, self);\n };\n }\n }\n const result = methodFn.call(arr, wrappedFn, thisArg);\n return needsWrap && wrappedRetFn ? wrappedRetFn(result) : result;\n}\nfunction reduce(self, method, fn, args) {\n const arr = shallowReadArray(self);\n let wrappedFn = fn;\n if (arr !== self) {\n if (!isShallow(self)) {\n wrappedFn = function(acc, item, index) {\n return fn.call(this, acc, toWrapped(self, item), index, self);\n };\n } else if (fn.length > 3) {\n wrappedFn = function(acc, item, index) {\n return fn.call(this, acc, item, index, self);\n };\n }\n }\n return arr[method](wrappedFn, ...args);\n}\nfunction searchProxy(self, method, args) {\n const arr = toRaw(self);\n track(arr, \"iterate\", ARRAY_ITERATE_KEY);\n const res = arr[method](...args);\n if ((res === -1 || res === false) && isProxy(args[0])) {\n args[0] = toRaw(args[0]);\n return arr[method](...args);\n }\n return res;\n}\nfunction noTracking(self, method, args = []) {\n pauseTracking();\n startBatch();\n const res = toRaw(self)[method].apply(self, args);\n endBatch();\n resetTracking();\n return res;\n}\n\nconst isNonTrackableKeys = /* @__PURE__ */ makeMap(`__proto__,__v_isRef,__isVue`);\nconst builtInSymbols = new Set(\n /* @__PURE__ */ Object.getOwnPropertyNames(Symbol).filter((key) => key !== \"arguments\" && key !== \"caller\").map((key) => Symbol[key]).filter(isSymbol)\n);\nfunction hasOwnProperty(key) {\n if (!isSymbol(key)) key = String(key);\n const obj = toRaw(this);\n track(obj, \"has\", key);\n return obj.hasOwnProperty(key);\n}\nclass BaseReactiveHandler {\n constructor(_isReadonly = false, _isShallow = false) {\n this._isReadonly = _isReadonly;\n this._isShallow = _isShallow;\n }\n get(target, key, receiver) {\n if (key === \"__v_skip\") return target[\"__v_skip\"];\n const isReadonly2 = this._isReadonly, isShallow2 = this._isShallow;\n if (key === \"__v_isReactive\") {\n return !isReadonly2;\n } else if (key === \"__v_isReadonly\") {\n return isReadonly2;\n } else if (key === \"__v_isShallow\") {\n return isShallow2;\n } else if (key === \"__v_raw\") {\n if (receiver === (isReadonly2 ? isShallow2 ? shallowReadonlyMap : readonlyMap : isShallow2 ? shallowReactiveMap : reactiveMap).get(target) || // receiver is not the reactive proxy, but has the same prototype\n // this means the receiver is a user proxy of the reactive proxy\n Object.getPrototypeOf(target) === Object.getPrototypeOf(receiver)) {\n return target;\n }\n return;\n }\n const targetIsArray = isArray(target);\n if (!isReadonly2) {\n let fn;\n if (targetIsArray && (fn = arrayInstrumentations[key])) {\n return fn;\n }\n if (key === \"hasOwnProperty\") {\n return hasOwnProperty;\n }\n }\n const res = Reflect.get(\n target,\n key,\n // if this is a proxy wrapping a ref, return methods using the raw ref\n // as receiver so that we don't have to call `toRaw` on the ref in all\n // its class methods\n isRef(target) ? target : receiver\n );\n if (isSymbol(key) ? builtInSymbols.has(key) : isNonTrackableKeys(key)) {\n return res;\n }\n if (!isReadonly2) {\n track(target, \"get\", key);\n }\n if (isShallow2) {\n return res;\n }\n if (isRef(res)) {\n const value = targetIsArray && isIntegerKey(key) ? res : res.value;\n return isReadonly2 && isObject(value) ? readonly(value) : value;\n }\n if (isObject(res)) {\n return isReadonly2 ? readonly(res) : reactive(res);\n }\n return res;\n }\n}\nclass MutableReactiveHandler extends BaseReactiveHandler {\n constructor(isShallow2 = false) {\n super(false, isShallow2);\n }\n set(target, key, value, receiver) {\n let oldValue = target[key];\n const isArrayWithIntegerKey = isArray(target) && isIntegerKey(key);\n if (!this._isShallow) {\n const isOldValueReadonly = isReadonly(oldValue);\n if (!isShallow(value) && !isReadonly(value)) {\n oldValue = toRaw(oldValue);\n value = toRaw(value);\n }\n if (!isArrayWithIntegerKey && isRef(oldValue) && !isRef(value)) {\n if (isOldValueReadonly) {\n if (!!(process.env.NODE_ENV !== \"production\")) {\n warn(\n `Set operation on key \"${String(key)}\" failed: target is readonly.`,\n target[key]\n );\n }\n return true;\n } else {\n oldValue.value = value;\n return true;\n }\n }\n }\n const hadKey = isArrayWithIntegerKey ? Number(key) < target.length : hasOwn(target, key);\n const result = Reflect.set(\n target,\n key,\n value,\n isRef(target) ? target : receiver\n );\n if (target === toRaw(receiver)) {\n if (!hadKey) {\n trigger(target, \"add\", key, value);\n } else if (hasChanged(value, oldValue)) {\n trigger(target, \"set\", key, value, oldValue);\n }\n }\n return result;\n }\n deleteProperty(target, key) {\n const hadKey = hasOwn(target, key);\n const oldValue = target[key];\n const result = Reflect.deleteProperty(target, key);\n if (result && hadKey) {\n trigger(target, \"delete\", key, void 0, oldValue);\n }\n return result;\n }\n has(target, key) {\n const result = Reflect.has(target, key);\n if (!isSymbol(key) || !builtInSymbols.has(key)) {\n track(target, \"has\", key);\n }\n return result;\n }\n ownKeys(target) {\n track(\n target,\n \"iterate\",\n isArray(target) ? \"length\" : ITERATE_KEY\n );\n return Reflect.ownKeys(target);\n }\n}\nclass ReadonlyReactiveHandler extends BaseReactiveHandler {\n constructor(isShallow2 = false) {\n super(true, isShallow2);\n }\n set(target, key) {\n if (!!(process.env.NODE_ENV !== \"production\")) {\n warn(\n `Set operation on key \"${String(key)}\" failed: target is readonly.`,\n target\n );\n }\n return true;\n }\n deleteProperty(target, key) {\n if (!!(process.env.NODE_ENV !== \"production\")) {\n warn(\n `Delete operation on key \"${String(key)}\" failed: target is readonly.`,\n target\n );\n }\n return true;\n }\n}\nconst mutableHandlers = /* @__PURE__ */ new MutableReactiveHandler();\nconst readonlyHandlers = /* @__PURE__ */ new ReadonlyReactiveHandler();\nconst shallowReactiveHandlers = /* @__PURE__ */ new MutableReactiveHandler(true);\nconst shallowReadonlyHandlers = /* @__PURE__ */ new ReadonlyReactiveHandler(true);\n\nconst toShallow = (value) => value;\nconst getProto = (v) => Reflect.getPrototypeOf(v);\nfunction createIterableMethod(method, isReadonly2, isShallow2) {\n return function(...args) {\n const target = this[\"__v_raw\"];\n const rawTarget = toRaw(target);\n const targetIsMap = isMap(rawTarget);\n const isPair = method === \"entries\" || method === Symbol.iterator && targetIsMap;\n const isKeyOnly = method === \"keys\" && targetIsMap;\n const innerIterator = target[method](...args);\n const wrap = isShallow2 ? toShallow : isReadonly2 ? toReadonly : toReactive;\n !isReadonly2 && track(\n rawTarget,\n \"iterate\",\n isKeyOnly ? MAP_KEY_ITERATE_KEY : ITERATE_KEY\n );\n return {\n // iterator protocol\n next() {\n const { value, done } = innerIterator.next();\n return done ? { value, done } : {\n value: isPair ? [wrap(value[0]), wrap(value[1])] : wrap(value),\n done\n };\n },\n // iterable protocol\n [Symbol.iterator]() {\n return this;\n }\n };\n };\n}\nfunction createReadonlyMethod(type) {\n return function(...args) {\n if (!!(process.env.NODE_ENV !== \"production\")) {\n const key = args[0] ? `on key \"${args[0]}\" ` : ``;\n warn(\n `${capitalize(type)} operation ${key}failed: target is readonly.`,\n toRaw(this)\n );\n }\n return type === \"delete\" ? false : type === \"clear\" ? void 0 : this;\n };\n}\nfunction createInstrumentations(readonly, shallow) {\n const instrumentations = {\n get(key) {\n const target = this[\"__v_raw\"];\n const rawTarget = toRaw(target);\n const rawKey = toRaw(key);\n if (!readonly) {\n if (hasChanged(key, rawKey)) {\n track(rawTarget, \"get\", key);\n }\n track(rawTarget, \"get\", rawKey);\n }\n const { has } = getProto(rawTarget);\n const wrap = shallow ? toShallow : readonly ? toReadonly : toReactive;\n if (has.call(rawTarget, key)) {\n return wrap(target.get(key));\n } else if (has.call(rawTarget, rawKey)) {\n return wrap(target.get(rawKey));\n } else if (target !== rawTarget) {\n target.get(key);\n }\n },\n get size() {\n const target = this[\"__v_raw\"];\n !readonly && track(toRaw(target), \"iterate\", ITERATE_KEY);\n return target.size;\n },\n has(key) {\n const target = this[\"__v_raw\"];\n const rawTarget = toRaw(target);\n const rawKey = toRaw(key);\n if (!readonly) {\n if (hasChanged(key, rawKey)) {\n track(rawTarget, \"has\", key);\n }\n track(rawTarget, \"has\", rawKey);\n }\n return key === rawKey ? target.has(key) : target.has(key) || target.has(rawKey);\n },\n forEach(callback, thisArg) {\n const observed = this;\n const target = observed[\"__v_raw\"];\n const rawTarget = toRaw(target);\n const wrap = shallow ? toShallow : readonly ? toReadonly : toReactive;\n !readonly && track(rawTarget, \"iterate\", ITERATE_KEY);\n return target.forEach((value, key) => {\n return callback.call(thisArg, wrap(value), wrap(key), observed);\n });\n }\n };\n extend(\n instrumentations,\n readonly ? {\n add: createReadonlyMethod(\"add\"),\n set: createReadonlyMethod(\"set\"),\n delete: createReadonlyMethod(\"delete\"),\n clear: createReadonlyMethod(\"clear\")\n } : {\n add(value) {\n if (!shallow && !isShallow(value) && !isReadonly(value)) {\n value = toRaw(value);\n }\n const target = toRaw(this);\n const proto = getProto(target);\n const hadKey = proto.has.call(target, value);\n if (!hadKey) {\n target.add(value);\n trigger(target, \"add\", value, value);\n }\n return this;\n },\n set(key, value) {\n if (!shallow && !isShallow(value) && !isReadonly(value)) {\n value = toRaw(value);\n }\n const target = toRaw(this);\n const { has, get } = getProto(target);\n let hadKey = has.call(target, key);\n if (!hadKey) {\n key = toRaw(key);\n hadKey = has.call(target, key);\n } else if (!!(process.env.NODE_ENV !== \"production\")) {\n checkIdentityKeys(target, has, key);\n }\n const oldValue = get.call(target, key);\n target.set(key, value);\n if (!hadKey) {\n trigger(target, \"add\", key, value);\n } else if (hasChanged(value, oldValue)) {\n trigger(target, \"set\", key, value, oldValue);\n }\n return this;\n },\n delete(key) {\n const target = toRaw(this);\n const { has, get } = getProto(target);\n let hadKey = has.call(target, key);\n if (!hadKey) {\n key = toRaw(key);\n hadKey = has.call(target, key);\n } else if (!!(process.env.NODE_ENV !== \"production\")) {\n checkIdentityKeys(target, has, key);\n }\n const oldValue = get ? get.call(target, key) : void 0;\n const result = target.delete(key);\n if (hadKey) {\n trigger(target, \"delete\", key, void 0, oldValue);\n }\n return result;\n },\n clear() {\n const target = toRaw(this);\n const hadItems = target.size !== 0;\n const oldTarget = !!(process.env.NODE_ENV !== \"production\") ? isMap(target) ? new Map(target) : new Set(target) : void 0;\n const result = target.clear();\n if (hadItems) {\n trigger(\n target,\n \"clear\",\n void 0,\n void 0,\n oldTarget\n );\n }\n return result;\n }\n }\n );\n const iteratorMethods = [\n \"keys\",\n \"values\",\n \"entries\",\n Symbol.iterator\n ];\n iteratorMethods.forEach((method) => {\n instrumentations[method] = createIterableMethod(method, readonly, shallow);\n });\n return instrumentations;\n}\nfunction createInstrumentationGetter(isReadonly2, shallow) {\n const instrumentations = createInstrumentations(isReadonly2, shallow);\n return (target, key, receiver) => {\n if (key === \"__v_isReactive\") {\n return !isReadonly2;\n } else if (key === \"__v_isReadonly\") {\n return isReadonly2;\n } else if (key === \"__v_raw\") {\n return target;\n }\n return Reflect.get(\n hasOwn(instrumentations, key) && key in target ? instrumentations : target,\n key,\n receiver\n );\n };\n}\nconst mutableCollectionHandlers = {\n get: /* @__PURE__ */ createInstrumentationGetter(false, false)\n};\nconst shallowCollectionHandlers = {\n get: /* @__PURE__ */ createInstrumentationGetter(false, true)\n};\nconst readonlyCollectionHandlers = {\n get: /* @__PURE__ */ createInstrumentationGetter(true, false)\n};\nconst shallowReadonlyCollectionHandlers = {\n get: /* @__PURE__ */ createInstrumentationGetter(true, true)\n};\nfunction checkIdentityKeys(target, has, key) {\n const rawKey = toRaw(key);\n if (rawKey !== key && has.call(target, rawKey)) {\n const type = toRawType(target);\n warn(\n `Reactive ${type} contains both the raw and reactive versions of the same object${type === `Map` ? ` as keys` : ``}, which can lead to inconsistencies. Avoid differentiating between the raw and reactive versions of an object and only use the reactive version if possible.`\n );\n }\n}\n\nconst reactiveMap = /* @__PURE__ */ new WeakMap();\nconst shallowReactiveMap = /* @__PURE__ */ new WeakMap();\nconst readonlyMap = /* @__PURE__ */ new WeakMap();\nconst shallowReadonlyMap = /* @__PURE__ */ new WeakMap();\nfunction targetTypeMap(rawType) {\n switch (rawType) {\n case \"Object\":\n case \"Array\":\n return 1 /* COMMON */;\n case \"Map\":\n case \"Set\":\n case \"WeakMap\":\n case \"WeakSet\":\n return 2 /* COLLECTION */;\n default:\n return 0 /* INVALID */;\n }\n}\nfunction getTargetType(value) {\n return value[\"__v_skip\"] || !Object.isExtensible(value) ? 0 /* INVALID */ : targetTypeMap(toRawType(value));\n}\nfunction reactive(target) {\n if (isReadonly(target)) {\n return target;\n }\n return createReactiveObject(\n target,\n false,\n mutableHandlers,\n mutableCollectionHandlers,\n reactiveMap\n );\n}\nfunction shallowReactive(target) {\n return createReactiveObject(\n target,\n false,\n shallowReactiveHandlers,\n shallowCollectionHandlers,\n shallowReactiveMap\n );\n}\nfunction readonly(target) {\n return createReactiveObject(\n target,\n true,\n readonlyHandlers,\n readonlyCollectionHandlers,\n readonlyMap\n );\n}\nfunction shallowReadonly(target) {\n return createReactiveObject(\n target,\n true,\n shallowReadonlyHandlers,\n shallowReadonlyCollectionHandlers,\n shallowReadonlyMap\n );\n}\nfunction createReactiveObject(target, isReadonly2, baseHandlers, collectionHandlers, proxyMap) {\n if (!isObject(target)) {\n if (!!(process.env.NODE_ENV !== \"production\")) {\n warn(\n `value cannot be made ${isReadonly2 ? \"readonly\" : \"reactive\"}: ${String(\n target\n )}`\n );\n }\n return target;\n }\n if (target[\"__v_raw\"] && !(isReadonly2 && target[\"__v_isReactive\"])) {\n return target;\n }\n const targetType = getTargetType(target);\n if (targetType === 0 /* INVALID */) {\n return target;\n }\n const existingProxy = proxyMap.get(target);\n if (existingProxy) {\n return existingProxy;\n }\n const proxy = new Proxy(\n target,\n targetType === 2 /* COLLECTION */ ? collectionHandlers : baseHandlers\n );\n proxyMap.set(target, proxy);\n return proxy;\n}\nfunction isReactive(value) {\n if (isReadonly(value)) {\n return isReactive(value[\"__v_raw\"]);\n }\n return !!(value && value[\"__v_isReactive\"]);\n}\nfunction isReadonly(value) {\n return !!(value && value[\"__v_isReadonly\"]);\n}\nfunction isShallow(value) {\n return !!(value && value[\"__v_isShallow\"]);\n}\nfunction isProxy(value) {\n return value ? !!value[\"__v_raw\"] : false;\n}\nfunction toRaw(observed) {\n const raw = observed && observed[\"__v_raw\"];\n return raw ? toRaw(raw) : observed;\n}\nfunction markRaw(value) {\n if (!hasOwn(value, \"__v_skip\") && Object.isExtensible(value)) {\n def(value, \"__v_skip\", true);\n }\n return value;\n}\nconst toReactive = (value) => isObject(value) ? reactive(value) : value;\nconst toReadonly = (value) => isObject(value) ? readonly(value) : value;\n\nfunction isRef(r) {\n return r ? r[\"__v_isRef\"] === true : false;\n}\nfunction ref(value) {\n return createRef(value, false);\n}\nfunction shallowRef(value) {\n return createRef(value, true);\n}\nfunction createRef(rawValue, shallow) {\n if (isRef(rawValue)) {\n return rawValue;\n }\n return new RefImpl(rawValue, shallow);\n}\nclass RefImpl {\n constructor(value, isShallow2) {\n this.dep = new Dep();\n this[\"__v_isRef\"] = true;\n this[\"__v_isShallow\"] = false;\n this._rawValue = isShallow2 ? value : toRaw(value);\n this._value = isShallow2 ? value : toReactive(value);\n this[\"__v_isShallow\"] = isShallow2;\n }\n get value() {\n if (!!(process.env.NODE_ENV !== \"production\")) {\n this.dep.track({\n target: this,\n type: \"get\",\n key: \"value\"\n });\n } else {\n this.dep.track();\n }\n return this._value;\n }\n set value(newValue) {\n const oldValue = this._rawValue;\n const useDirectValue = this[\"__v_isShallow\"] || isShallow(newValue) || isReadonly(newValue);\n newValue = useDirectValue ? newValue : toRaw(newValue);\n if (hasChanged(newValue, oldValue)) {\n this._rawValue = newValue;\n this._value = useDirectValue ? newValue : toReactive(newValue);\n if (!!(process.env.NODE_ENV !== \"production\")) {\n this.dep.trigger({\n target: this,\n type: \"set\",\n key: \"value\",\n newValue,\n oldValue\n });\n } else {\n this.dep.trigger();\n }\n }\n }\n}\nfunction triggerRef(ref2) {\n if (ref2.dep) {\n if (!!(process.env.NODE_ENV !== \"production\")) {\n ref2.dep.trigger({\n target: ref2,\n type: \"set\",\n key: \"value\",\n newValue: ref2._value\n });\n } else {\n ref2.dep.trigger();\n }\n }\n}\nfunction unref(ref2) {\n return isRef(ref2) ? ref2.value : ref2;\n}\nfunction toValue(source) {\n return isFunction(source) ? source() : unref(source);\n}\nconst shallowUnwrapHandlers = {\n get: (target, key, receiver) => key === \"__v_raw\" ? target : unref(Reflect.get(target, key, receiver)),\n set: (target, key, value, receiver) => {\n const oldValue = target[key];\n if (isRef(oldValue) && !isRef(value)) {\n oldValue.value = value;\n return true;\n } else {\n return Reflect.set(target, key, value, receiver);\n }\n }\n};\nfunction proxyRefs(objectWithRefs) {\n return isReactive(objectWithRefs) ? objectWithRefs : new Proxy(objectWithRefs, shallowUnwrapHandlers);\n}\nclass CustomRefImpl {\n constructor(factory) {\n this[\"__v_isRef\"] = true;\n this._value = void 0;\n const dep = this.dep = new Dep();\n const { get, set } = factory(dep.track.bind(dep), dep.trigger.bind(dep));\n this._get = get;\n this._set = set;\n }\n get value() {\n return this._value = this._get();\n }\n set value(newVal) {\n this._set(newVal);\n }\n}\nfunction customRef(factory) {\n return new CustomRefImpl(factory);\n}\nfunction toRefs(object) {\n if (!!(process.env.NODE_ENV !== \"production\") && !isProxy(object)) {\n warn(`toRefs() expects a reactive object but received a plain one.`);\n }\n const ret = isArray(object) ? new Array(object.length) : {};\n for (const key in object) {\n ret[key] = propertyToRef(object, key);\n }\n return ret;\n}\nclass ObjectRefImpl {\n constructor(_object, _key, _defaultValue) {\n this._object = _object;\n this._key = _key;\n this._defaultValue = _defaultValue;\n this[\"__v_isRef\"] = true;\n this._value = void 0;\n this._raw = toRaw(_object);\n let shallow = true;\n let obj = _object;\n if (!isArray(_object) || !isIntegerKey(String(_key))) {\n do {\n shallow = !isProxy(obj) || isShallow(obj);\n } while (shallow && (obj = obj[\"__v_raw\"]));\n }\n this._shallow = shallow;\n }\n get value() {\n let val = this._object[this._key];\n if (this._shallow) {\n val = unref(val);\n }\n return this._value = val === void 0 ? this._defaultValue : val;\n }\n set value(newVal) {\n if (this._shallow && isRef(this._raw[this._key])) {\n const nestedRef = this._object[this._key];\n if (isRef(nestedRef)) {\n nestedRef.value = newVal;\n return;\n }\n }\n this._object[this._key] = newVal;\n }\n get dep() {\n return getDepFromReactive(this._raw, this._key);\n }\n}\nclass GetterRefImpl {\n constructor(_getter) {\n this._getter = _getter;\n this[\"__v_isRef\"] = true;\n this[\"__v_isReadonly\"] = true;\n this._value = void 0;\n }\n get value() {\n return this._value = this._getter();\n }\n}\nfunction toRef(source, key, defaultValue) {\n if (isRef(source)) {\n return source;\n } else if (isFunction(source)) {\n return new GetterRefImpl(source);\n } else if (isObject(source) && arguments.length > 1) {\n return propertyToRef(source, key, defaultValue);\n } else {\n return ref(source);\n }\n}\nfunction propertyToRef(source, key, defaultValue) {\n return new ObjectRefImpl(source, key, defaultValue);\n}\n\nclass ComputedRefImpl {\n constructor(fn, setter, isSSR) {\n this.fn = fn;\n this.setter = setter;\n /**\n * @internal\n */\n this._value = void 0;\n /**\n * @internal\n */\n this.dep = new Dep(this);\n /**\n * @internal\n */\n this.__v_isRef = true;\n // TODO isolatedDeclarations \"__v_isReadonly\"\n // A computed is also a subscriber that tracks other deps\n /**\n * @internal\n */\n this.deps = void 0;\n /**\n * @internal\n */\n this.depsTail = void 0;\n /**\n * @internal\n */\n this.flags = 16;\n /**\n * @internal\n */\n this.globalVersion = globalVersion - 1;\n /**\n * @internal\n */\n this.next = void 0;\n // for backwards compat\n this.effect = this;\n this[\"__v_isReadonly\"] = !setter;\n this.isSSR = isSSR;\n }\n /**\n * @internal\n */\n notify() {\n this.flags |= 16;\n if (!(this.flags & 8) && // avoid infinite self recursion\n activeSub !== this) {\n batch(this, true);\n return true;\n } else if (!!(process.env.NODE_ENV !== \"production\")) ;\n }\n get value() {\n const link = !!(process.env.NODE_ENV !== \"production\") ? this.dep.track({\n target: this,\n type: \"get\",\n key: \"value\"\n }) : this.dep.track();\n refreshComputed(this);\n if (link) {\n link.version = this.dep.version;\n }\n return this._value;\n }\n set value(newValue) {\n if (this.setter) {\n this.setter(newValue);\n } else if (!!(process.env.NODE_ENV !== \"production\")) {\n warn(\"Write operation failed: computed value is readonly\");\n }\n }\n}\nfunction computed(getterOrOptions, debugOptions, isSSR = false) {\n let getter;\n let setter;\n if (isFunction(getterOrOptions)) {\n getter = getterOrOptions;\n } else {\n getter = getterOrOptions.get;\n setter = getterOrOptions.set;\n }\n const cRef = new ComputedRefImpl(getter, setter, isSSR);\n if (!!(process.env.NODE_ENV !== \"production\") && debugOptions && !isSSR) {\n cRef.onTrack = debugOptions.onTrack;\n cRef.onTrigger = debugOptions.onTrigger;\n }\n return cRef;\n}\n\nconst TrackOpTypes = {\n \"GET\": \"get\",\n \"HAS\": \"has\",\n \"ITERATE\": \"iterate\"\n};\nconst TriggerOpTypes = {\n \"SET\": \"set\",\n \"ADD\": \"add\",\n \"DELETE\": \"delete\",\n \"CLEAR\": \"clear\"\n};\nconst ReactiveFlags = {\n \"SKIP\": \"__v_skip\",\n \"IS_REACTIVE\": \"__v_isReactive\",\n \"IS_READONLY\": \"__v_isReadonly\",\n \"IS_SHALLOW\": \"__v_isShallow\",\n \"RAW\": \"__v_raw\",\n \"IS_REF\": \"__v_isRef\"\n};\n\nconst WatchErrorCodes = {\n \"WATCH_GETTER\": 2,\n \"2\": \"WATCH_GETTER\",\n \"WATCH_CALLBACK\": 3,\n \"3\": \"WATCH_CALLBACK\",\n \"WATCH_CLEANUP\": 4,\n \"4\": \"WATCH_CLEANUP\"\n};\nconst INITIAL_WATCHER_VALUE = {};\nconst cleanupMap = /* @__PURE__ */ new WeakMap();\nlet activeWatcher = void 0;\nfunction getCurrentWatcher() {\n return activeWatcher;\n}\nfunction onWatcherCleanup(cleanupFn, failSilently = false, owner = activeWatcher) {\n if (owner) {\n let cleanups = cleanupMap.get(owner);\n if (!cleanups) cleanupMap.set(owner, cleanups = []);\n cleanups.push(cleanupFn);\n } else if (!!(process.env.NODE_ENV !== \"production\") && !failSilently) {\n warn(\n `onWatcherCleanup() was called when there was no active watcher to associate with.`\n );\n }\n}\nfunction watch(source, cb, options = EMPTY_OBJ) {\n const { immediate, deep, once, scheduler, augmentJob, call } = options;\n const warnInvalidSource = (s) => {\n (options.onWarn || warn)(\n `Invalid watch source: `,\n s,\n `A watch source can only be a getter/effect function, a ref, a reactive object, or an array of these types.`\n );\n };\n const reactiveGetter = (source2) => {\n if (deep) return source2;\n if (isShallow(source2) || deep === false || deep === 0)\n return traverse(source2, 1);\n return traverse(source2);\n };\n let effect;\n let getter;\n let cleanup;\n let boundCleanup;\n let forceTrigger = false;\n let isMultiSource = false;\n if (isRef(source)) {\n getter = () => source.value;\n forceTrigger = isShallow(source);\n } else if (isReactive(source)) {\n getter = () => reactiveGetter(source);\n forceTrigger = true;\n } else if (isArray(source)) {\n isMultiSource = true;\n forceTrigger = source.some((s) => isReactive(s) || isShallow(s));\n getter = () => source.map((s) => {\n if (isRef(s)) {\n return s.value;\n } else if (isReactive(s)) {\n return reactiveGetter(s);\n } else if (isFunction(s)) {\n return call ? call(s, 2) : s();\n } else {\n !!(process.env.NODE_ENV !== \"production\") && warnInvalidSource(s);\n }\n });\n } else if (isFunction(source)) {\n if (cb) {\n getter = call ? () => call(source, 2) : source;\n } else {\n getter = () => {\n if (cleanup) {\n pauseTracking();\n try {\n cleanup();\n } finally {\n resetTracking();\n }\n }\n const currentEffect = activeWatcher;\n activeWatcher = effect;\n try {\n return call ? call(source, 3, [boundCleanup]) : source(boundCleanup);\n } finally {\n activeWatcher = currentEffect;\n }\n };\n }\n } else {\n getter = NOOP;\n !!(process.env.NODE_ENV !== \"production\") && warnInvalidSource(source);\n }\n if (cb && deep) {\n const baseGetter = getter;\n const depth = deep === true ? Infinity : deep;\n getter = () => traverse(baseGetter(), depth);\n }\n const scope = getCurrentScope();\n const watchHandle = () => {\n effect.stop();\n if (scope && scope.active) {\n remove(scope.effects, effect);\n }\n };\n if (once && cb) {\n const _cb = cb;\n cb = (...args) => {\n _cb(...args);\n watchHandle();\n };\n }\n let oldValue = isMultiSource ? new Array(source.length).fill(INITIAL_WATCHER_VALUE) : INITIAL_WATCHER_VALUE;\n const job = (immediateFirstRun) => {\n if (!(effect.flags & 1) || !effect.dirty && !immediateFirstRun) {\n return;\n }\n if (cb) {\n const newValue = effect.run();\n if (deep || forceTrigger || (isMultiSource ? newValue.some((v, i) => hasChanged(v, oldValue[i])) : hasChanged(newValue, oldValue))) {\n if (cleanup) {\n cleanup();\n }\n const currentWatcher = activeWatcher;\n activeWatcher = effect;\n try {\n const args = [\n newValue,\n // pass undefined as the old value when it's changed for the first time\n oldValue === INITIAL_WATCHER_VALUE ? void 0 : isMultiSource && oldValue[0] === INITIAL_WATCHER_VALUE ? [] : oldValue,\n boundCleanup\n ];\n oldValue = newValue;\n call ? call(cb, 3, args) : (\n // @ts-expect-error\n cb(...args)\n );\n } finally {\n activeWatcher = currentWatcher;\n }\n }\n } else {\n effect.run();\n }\n };\n if (augmentJob) {\n augmentJob(job);\n }\n effect = new ReactiveEffect(getter);\n effect.scheduler = scheduler ? () => scheduler(job, false) : job;\n boundCleanup = (fn) => onWatcherCleanup(fn, false, effect);\n cleanup = effect.onStop = () => {\n const cleanups = cleanupMap.get(effect);\n if (cleanups) {\n if (call) {\n call(cleanups, 4);\n } else {\n for (const cleanup2 of cleanups) cleanup2();\n }\n cleanupMap.delete(effect);\n }\n };\n if (!!(process.env.NODE_ENV !== \"production\")) {\n effect.onTrack = options.onTrack;\n effect.onTrigger = options.onTrigger;\n }\n if (cb) {\n if (immediate) {\n job(true);\n } else {\n oldValue = effect.run();\n }\n } else if (scheduler) {\n scheduler(job.bind(null, true), true);\n } else {\n effect.run();\n }\n watchHandle.pause = effect.pause.bind(effect);\n watchHandle.resume = effect.resume.bind(effect);\n watchHandle.stop = watchHandle;\n return watchHandle;\n}\nfunction traverse(value, depth = Infinity, seen) {\n if (depth <= 0 || !isObject(value) || value[\"__v_skip\"]) {\n return value;\n }\n seen = seen || /* @__PURE__ */ new Map();\n if ((seen.get(value) || 0) >= depth) {\n return value;\n }\n seen.set(value, depth);\n depth--;\n if (isRef(value)) {\n traverse(value.value, depth, seen);\n } else if (isArray(value)) {\n for (let i = 0; i < value.length; i++) {\n traverse(value[i], depth, seen);\n }\n } else if (isSet(value) || isMap(value)) {\n value.forEach((v) => {\n traverse(v, depth, seen);\n });\n } else if (isPlainObject(value)) {\n for (const key in value) {\n traverse(value[key], depth, seen);\n }\n for (const key of Object.getOwnPropertySymbols(value)) {\n if (Object.prototype.propertyIsEnumerable.call(value, key)) {\n traverse(value[key], depth, seen);\n }\n }\n }\n return value;\n}\n\nexport { ARRAY_ITERATE_KEY, EffectFlags, EffectScope, ITERATE_KEY, MAP_KEY_ITERATE_KEY, ReactiveEffect, ReactiveFlags, TrackOpTypes, TriggerOpTypes, WatchErrorCodes, computed, customRef, effect, effectScope, enableTracking, getCurrentScope, getCurrentWatcher, isProxy, isReactive, isReadonly, isRef, isShallow, markRaw, onEffectCleanup, onScopeDispose, onWatcherCleanup, pauseTracking, proxyRefs, reactive, reactiveReadArray, readonly, ref, resetTracking, shallowReactive, shallowReadArray, shallowReadonly, shallowRef, stop, toRaw, toReactive, toReadonly, toRef, toRefs, toValue, track, traverse, trigger, triggerRef, unref, watch };\n","/**\n* @vue/runtime-core v3.5.26\n* (c) 2018-present Yuxi (Evan) You and Vue contributors\n* @license MIT\n**/\nimport { pauseTracking, resetTracking, isRef, toRaw, traverse, watch as watch$1, shallowRef, readonly, isReactive, ref, isShallow, isReadonly, shallowReadArray, toReadonly, toReactive, shallowReadonly, track, reactive, customRef, shallowReactive, trigger, ReactiveEffect, isProxy, proxyRefs, markRaw, EffectScope, computed as computed$1 } from '@vue/reactivity';\nexport { EffectScope, ReactiveEffect, TrackOpTypes, TriggerOpTypes, customRef, effect, effectScope, getCurrentScope, getCurrentWatcher, isProxy, isReactive, isReadonly, isRef, isShallow, markRaw, onScopeDispose, onWatcherCleanup, proxyRefs, reactive, readonly, ref, shallowReactive, shallowReadonly, shallowRef, stop, toRaw, toRef, toRefs, toValue, triggerRef, unref } from '@vue/reactivity';\nimport { isString, isFunction, EMPTY_OBJ, isPromise, isArray, NOOP, getGlobalThis, extend, isBuiltInDirective, NO, hasOwn, remove, def, isOn, isReservedProp, normalizeClass, stringifyStyle, normalizeStyle, isKnownSvgAttr, isBooleanAttr, isKnownHtmlAttr, includeBooleanAttr, isRenderableAttrValue, normalizeCssVarValue, getEscapedCssVarName, isObject, isRegExp, invokeArrayFns, toHandlerKey, camelize, capitalize, isSymbol, isGloballyAllowed, hyphenate, hasChanged, looseToNumber, isModelListener, EMPTY_ARR, makeMap, toRawType, toNumber } from '@vue/shared';\nexport { camelize, capitalize, normalizeClass, normalizeProps, normalizeStyle, toDisplayString, toHandlerKey } from '@vue/shared';\n\nconst stack = [];\nfunction pushWarningContext(vnode) {\n stack.push(vnode);\n}\nfunction popWarningContext() {\n stack.pop();\n}\nlet isWarning = false;\nfunction warn$1(msg, ...args) {\n if (isWarning) return;\n isWarning = true;\n pauseTracking();\n const instance = stack.length ? stack[stack.length - 1].component : null;\n const appWarnHandler = instance && instance.appContext.config.warnHandler;\n const trace = getComponentTrace();\n if (appWarnHandler) {\n callWithErrorHandling(\n appWarnHandler,\n instance,\n 11,\n [\n // eslint-disable-next-line no-restricted-syntax\n msg + args.map((a) => {\n var _a, _b;\n return (_b = (_a = a.toString) == null ? void 0 : _a.call(a)) != null ? _b : JSON.stringify(a);\n }).join(\"\"),\n instance && instance.proxy,\n trace.map(\n ({ vnode }) => `at <${formatComponentName(instance, vnode.type)}>`\n ).join(\"\\n\"),\n trace\n ]\n );\n } else {\n const warnArgs = [`[Vue warn]: ${msg}`, ...args];\n if (trace.length && // avoid spamming console during tests\n true) {\n warnArgs.push(`\n`, ...formatTrace(trace));\n }\n console.warn(...warnArgs);\n }\n resetTracking();\n isWarning = false;\n}\nfunction getComponentTrace() {\n let currentVNode = stack[stack.length - 1];\n if (!currentVNode) {\n return [];\n }\n const normalizedStack = [];\n while (currentVNode) {\n const last = normalizedStack[0];\n if (last && last.vnode === currentVNode) {\n last.recurseCount++;\n } else {\n normalizedStack.push({\n vnode: currentVNode,\n recurseCount: 0\n });\n }\n const parentInstance = currentVNode.component && currentVNode.component.parent;\n currentVNode = parentInstance && parentInstance.vnode;\n }\n return normalizedStack;\n}\nfunction formatTrace(trace) {\n const logs = [];\n trace.forEach((entry, i) => {\n logs.push(...i === 0 ? [] : [`\n`], ...formatTraceEntry(entry));\n });\n return logs;\n}\nfunction formatTraceEntry({ vnode, recurseCount }) {\n const postfix = recurseCount > 0 ? `... (${recurseCount} recursive calls)` : ``;\n const isRoot = vnode.component ? vnode.component.parent == null : false;\n const open = ` at <${formatComponentName(\n vnode.component,\n vnode.type,\n isRoot\n )}`;\n const close = `>` + postfix;\n return vnode.props ? [open, ...formatProps(vnode.props), close] : [open + close];\n}\nfunction formatProps(props) {\n const res = [];\n const keys = Object.keys(props);\n keys.slice(0, 3).forEach((key) => {\n res.push(...formatProp(key, props[key]));\n });\n if (keys.length > 3) {\n res.push(` ...`);\n }\n return res;\n}\nfunction formatProp(key, value, raw) {\n if (isString(value)) {\n value = JSON.stringify(value);\n return raw ? value : [`${key}=${value}`];\n } else if (typeof value === \"number\" || typeof value === \"boolean\" || value == null) {\n return raw ? value : [`${key}=${value}`];\n } else if (isRef(value)) {\n value = formatProp(key, toRaw(value.value), true);\n return raw ? value : [`${key}=Ref<`, value, `>`];\n } else if (isFunction(value)) {\n return [`${key}=fn${value.name ? `<${value.name}>` : ``}`];\n } else {\n value = toRaw(value);\n return raw ? value : [`${key}=`, value];\n }\n}\nfunction assertNumber(val, type) {\n if (!!!(process.env.NODE_ENV !== \"production\")) return;\n if (val === void 0) {\n return;\n } else if (typeof val !== \"number\") {\n warn$1(`${type} is not a valid number - got ${JSON.stringify(val)}.`);\n } else if (isNaN(val)) {\n warn$1(`${type} is NaN - the duration expression might be incorrect.`);\n }\n}\n\nconst ErrorCodes = {\n \"SETUP_FUNCTION\": 0,\n \"0\": \"SETUP_FUNCTION\",\n \"RENDER_FUNCTION\": 1,\n \"1\": \"RENDER_FUNCTION\",\n \"NATIVE_EVENT_HANDLER\": 5,\n \"5\": \"NATIVE_EVENT_HANDLER\",\n \"COMPONENT_EVENT_HANDLER\": 6,\n \"6\": \"COMPONENT_EVENT_HANDLER\",\n \"VNODE_HOOK\": 7,\n \"7\": \"VNODE_HOOK\",\n \"DIRECTIVE_HOOK\": 8,\n \"8\": \"DIRECTIVE_HOOK\",\n \"TRANSITION_HOOK\": 9,\n \"9\": \"TRANSITION_HOOK\",\n \"APP_ERROR_HANDLER\": 10,\n \"10\": \"APP_ERROR_HANDLER\",\n \"APP_WARN_HANDLER\": 11,\n \"11\": \"APP_WARN_HANDLER\",\n \"FUNCTION_REF\": 12,\n \"12\": \"FUNCTION_REF\",\n \"ASYNC_COMPONENT_LOADER\": 13,\n \"13\": \"ASYNC_COMPONENT_LOADER\",\n \"SCHEDULER\": 14,\n \"14\": \"SCHEDULER\",\n \"COMPONENT_UPDATE\": 15,\n \"15\": \"COMPONENT_UPDATE\",\n \"APP_UNMOUNT_CLEANUP\": 16,\n \"16\": \"APP_UNMOUNT_CLEANUP\"\n};\nconst ErrorTypeStrings$1 = {\n [\"sp\"]: \"serverPrefetch hook\",\n [\"bc\"]: \"beforeCreate hook\",\n [\"c\"]: \"created hook\",\n [\"bm\"]: \"beforeMount hook\",\n [\"m\"]: \"mounted hook\",\n [\"bu\"]: \"beforeUpdate hook\",\n [\"u\"]: \"updated\",\n [\"bum\"]: \"beforeUnmount hook\",\n [\"um\"]: \"unmounted hook\",\n [\"a\"]: \"activated hook\",\n [\"da\"]: \"deactivated hook\",\n [\"ec\"]: \"errorCaptured hook\",\n [\"rtc\"]: \"renderTracked hook\",\n [\"rtg\"]: \"renderTriggered hook\",\n [0]: \"setup function\",\n [1]: \"render function\",\n [2]: \"watcher getter\",\n [3]: \"watcher callback\",\n [4]: \"watcher cleanup function\",\n [5]: \"native event handler\",\n [6]: \"component event handler\",\n [7]: \"vnode hook\",\n [8]: \"directive hook\",\n [9]: \"transition hook\",\n [10]: \"app errorHandler\",\n [11]: \"app warnHandler\",\n [12]: \"ref function\",\n [13]: \"async component loader\",\n [14]: \"scheduler flush\",\n [15]: \"component update\",\n [16]: \"app unmount cleanup function\"\n};\nfunction callWithErrorHandling(fn, instance, type, args) {\n try {\n return args ? fn(...args) : fn();\n } catch (err) {\n handleError(err, instance, type);\n }\n}\nfunction callWithAsyncErrorHandling(fn, instance, type, args) {\n if (isFunction(fn)) {\n const res = callWithErrorHandling(fn, instance, type, args);\n if (res && isPromise(res)) {\n res.catch((err) => {\n handleError(err, instance, type);\n });\n }\n return res;\n }\n if (isArray(fn)) {\n const values = [];\n for (let i = 0; i < fn.length; i++) {\n values.push(callWithAsyncErrorHandling(fn[i], instance, type, args));\n }\n return values;\n } else if (!!(process.env.NODE_ENV !== \"production\")) {\n warn$1(\n `Invalid value type passed to callWithAsyncErrorHandling(): ${typeof fn}`\n );\n }\n}\nfunction handleError(err, instance, type, throwInDev = true) {\n const contextVNode = instance ? instance.vnode : null;\n const { errorHandler, throwUnhandledErrorInProduction } = instance && instance.appContext.config || EMPTY_OBJ;\n if (instance) {\n let cur = instance.parent;\n const exposedInstance = instance.proxy;\n const errorInfo = !!(process.env.NODE_ENV !== \"production\") ? ErrorTypeStrings$1[type] : `https://vuejs.org/error-reference/#runtime-${type}`;\n while (cur) {\n const errorCapturedHooks = cur.ec;\n if (errorCapturedHooks) {\n for (let i = 0; i < errorCapturedHooks.length; i++) {\n if (errorCapturedHooks[i](err, exposedInstance, errorInfo) === false) {\n return;\n }\n }\n }\n cur = cur.parent;\n }\n if (errorHandler) {\n pauseTracking();\n callWithErrorHandling(errorHandler, null, 10, [\n err,\n exposedInstance,\n errorInfo\n ]);\n resetTracking();\n return;\n }\n }\n logError(err, type, contextVNode, throwInDev, throwUnhandledErrorInProduction);\n}\nfunction logError(err, type, contextVNode, throwInDev = true, throwInProd = false) {\n if (!!(process.env.NODE_ENV !== \"production\")) {\n const info = ErrorTypeStrings$1[type];\n if (contextVNode) {\n pushWarningContext(contextVNode);\n }\n warn$1(`Unhandled error${info ? ` during execution of ${info}` : ``}`);\n if (contextVNode) {\n popWarningContext();\n }\n if (throwInDev) {\n throw err;\n } else {\n console.error(err);\n }\n } else if (throwInProd) {\n throw err;\n } else {\n console.error(err);\n }\n}\n\nconst queue = [];\nlet flushIndex = -1;\nconst pendingPostFlushCbs = [];\nlet activePostFlushCbs = null;\nlet postFlushIndex = 0;\nconst resolvedPromise = /* @__PURE__ */ Promise.resolve();\nlet currentFlushPromise = null;\nconst RECURSION_LIMIT = 100;\nfunction nextTick(fn) {\n const p = currentFlushPromise || resolvedPromise;\n return fn ? p.then(this ? fn.bind(this) : fn) : p;\n}\nfunction findInsertionIndex(id) {\n let start = flushIndex + 1;\n let end = queue.length;\n while (start < end) {\n const middle = start + end >>> 1;\n const middleJob = queue[middle];\n const middleJobId = getId(middleJob);\n if (middleJobId < id || middleJobId === id && middleJob.flags & 2) {\n start = middle + 1;\n } else {\n end = middle;\n }\n }\n return start;\n}\nfunction queueJob(job) {\n if (!(job.flags & 1)) {\n const jobId = getId(job);\n const lastJob = queue[queue.length - 1];\n if (!lastJob || // fast path when the job id is larger than the tail\n !(job.flags & 2) && jobId >= getId(lastJob)) {\n queue.push(job);\n } else {\n queue.splice(findInsertionIndex(jobId), 0, job);\n }\n job.flags |= 1;\n queueFlush();\n }\n}\nfunction queueFlush() {\n if (!currentFlushPromise) {\n currentFlushPromise = resolvedPromise.then(flushJobs);\n }\n}\nfunction queuePostFlushCb(cb) {\n if (!isArray(cb)) {\n if (activePostFlushCbs && cb.id === -1) {\n activePostFlushCbs.splice(postFlushIndex + 1, 0, cb);\n } else if (!(cb.flags & 1)) {\n pendingPostFlushCbs.push(cb);\n cb.flags |= 1;\n }\n } else {\n pendingPostFlushCbs.push(...cb);\n }\n queueFlush();\n}\nfunction flushPreFlushCbs(instance, seen, i = flushIndex + 1) {\n if (!!(process.env.NODE_ENV !== \"production\")) {\n seen = seen || /* @__PURE__ */ new Map();\n }\n for (; i < queue.length; i++) {\n const cb = queue[i];\n if (cb && cb.flags & 2) {\n if (instance && cb.id !== instance.uid) {\n continue;\n }\n if (!!(process.env.NODE_ENV !== \"production\") && checkRecursiveUpdates(seen, cb)) {\n continue;\n }\n queue.splice(i, 1);\n i--;\n if (cb.flags & 4) {\n cb.flags &= -2;\n }\n cb();\n if (!(cb.flags & 4)) {\n cb.flags &= -2;\n }\n }\n }\n}\nfunction flushPostFlushCbs(seen) {\n if (pendingPostFlushCbs.length) {\n const deduped = [...new Set(pendingPostFlushCbs)].sort(\n (a, b) => getId(a) - getId(b)\n );\n pendingPostFlushCbs.length = 0;\n if (activePostFlushCbs) {\n activePostFlushCbs.push(...deduped);\n return;\n }\n activePostFlushCbs = deduped;\n if (!!(process.env.NODE_ENV !== \"production\")) {\n seen = seen || /* @__PURE__ */ new Map();\n }\n for (postFlushIndex = 0; postFlushIndex < activePostFlushCbs.length; postFlushIndex++) {\n const cb = activePostFlushCbs[postFlushIndex];\n if (!!(process.env.NODE_ENV !== \"production\") && checkRecursiveUpdates(seen, cb)) {\n continue;\n }\n if (cb.flags & 4) {\n cb.flags &= -2;\n }\n if (!(cb.flags & 8)) cb();\n cb.flags &= -2;\n }\n activePostFlushCbs = null;\n postFlushIndex = 0;\n }\n}\nconst getId = (job) => job.id == null ? job.flags & 2 ? -1 : Infinity : job.id;\nfunction flushJobs(seen) {\n if (!!(process.env.NODE_ENV !== \"production\")) {\n seen = seen || /* @__PURE__ */ new Map();\n }\n const check = !!(process.env.NODE_ENV !== \"production\") ? (job) => checkRecursiveUpdates(seen, job) : NOOP;\n try {\n for (flushIndex = 0; flushIndex < queue.length; flushIndex++) {\n const job = queue[flushIndex];\n if (job && !(job.flags & 8)) {\n if (!!(process.env.NODE_ENV !== \"production\") && check(job)) {\n continue;\n }\n if (job.flags & 4) {\n job.flags &= ~1;\n }\n callWithErrorHandling(\n job,\n job.i,\n job.i ? 15 : 14\n );\n if (!(job.flags & 4)) {\n job.flags &= ~1;\n }\n }\n }\n } finally {\n for (; flushIndex < queue.length; flushIndex++) {\n const job = queue[flushIndex];\n if (job) {\n job.flags &= -2;\n }\n }\n flushIndex = -1;\n queue.length = 0;\n flushPostFlushCbs(seen);\n currentFlushPromise = null;\n if (queue.length || pendingPostFlushCbs.length) {\n flushJobs(seen);\n }\n }\n}\nfunction checkRecursiveUpdates(seen, fn) {\n const count = seen.get(fn) || 0;\n if (count > RECURSION_LIMIT) {\n const instance = fn.i;\n const componentName = instance && getComponentName(instance.type);\n handleError(\n `Maximum recursive updates exceeded${componentName ? ` in component <${componentName}>` : ``}. This means you have a reactive effect that is mutating its own dependencies and thus recursively triggering itself. Possible sources include component template, render function, updated hook or watcher source function.`,\n null,\n 10\n );\n return true;\n }\n seen.set(fn, count + 1);\n return false;\n}\n\nlet isHmrUpdating = false;\nconst hmrDirtyComponents = /* @__PURE__ */ new Map();\nif (!!(process.env.NODE_ENV !== \"production\")) {\n getGlobalThis().__VUE_HMR_RUNTIME__ = {\n createRecord: tryWrap(createRecord),\n rerender: tryWrap(rerender),\n reload: tryWrap(reload)\n };\n}\nconst map = /* @__PURE__ */ new Map();\nfunction registerHMR(instance) {\n const id = instance.type.__hmrId;\n let record = map.get(id);\n if (!record) {\n createRecord(id, instance.type);\n record = map.get(id);\n }\n record.instances.add(instance);\n}\nfunction unregisterHMR(instance) {\n map.get(instance.type.__hmrId).instances.delete(instance);\n}\nfunction createRecord(id, initialDef) {\n if (map.has(id)) {\n return false;\n }\n map.set(id, {\n initialDef: normalizeClassComponent(initialDef),\n instances: /* @__PURE__ */ new Set()\n });\n return true;\n}\nfunction normalizeClassComponent(component) {\n return isClassComponent(component) ? component.__vccOpts : component;\n}\nfunction rerender(id, newRender) {\n const record = map.get(id);\n if (!record) {\n return;\n }\n record.initialDef.render = newRender;\n [...record.instances].forEach((instance) => {\n if (newRender) {\n instance.render = newRender;\n normalizeClassComponent(instance.type).render = newRender;\n }\n instance.renderCache = [];\n isHmrUpdating = true;\n if (!(instance.job.flags & 8)) {\n instance.update();\n }\n isHmrUpdating = false;\n });\n}\nfunction reload(id, newComp) {\n const record = map.get(id);\n if (!record) return;\n newComp = normalizeClassComponent(newComp);\n updateComponentDef(record.initialDef, newComp);\n const instances = [...record.instances];\n for (let i = 0; i < instances.length; i++) {\n const instance = instances[i];\n const oldComp = normalizeClassComponent(instance.type);\n let dirtyInstances = hmrDirtyComponents.get(oldComp);\n if (!dirtyInstances) {\n if (oldComp !== record.initialDef) {\n updateComponentDef(oldComp, newComp);\n }\n hmrDirtyComponents.set(oldComp, dirtyInstances = /* @__PURE__ */ new Set());\n }\n dirtyInstances.add(instance);\n instance.appContext.propsCache.delete(instance.type);\n instance.appContext.emitsCache.delete(instance.type);\n instance.appContext.optionsCache.delete(instance.type);\n if (instance.ceReload) {\n dirtyInstances.add(instance);\n instance.ceReload(newComp.styles);\n dirtyInstances.delete(instance);\n } else if (instance.parent) {\n queueJob(() => {\n if (!(instance.job.flags & 8)) {\n isHmrUpdating = true;\n instance.parent.update();\n isHmrUpdating = false;\n dirtyInstances.delete(instance);\n }\n });\n } else if (instance.appContext.reload) {\n instance.appContext.reload();\n } else if (typeof window !== \"undefined\") {\n window.location.reload();\n } else {\n console.warn(\n \"[HMR] Root or manually mounted instance modified. Full reload required.\"\n );\n }\n if (instance.root.ce && instance !== instance.root) {\n instance.root.ce._removeChildStyle(oldComp);\n }\n }\n queuePostFlushCb(() => {\n hmrDirtyComponents.clear();\n });\n}\nfunction updateComponentDef(oldComp, newComp) {\n extend(oldComp, newComp);\n for (const key in oldComp) {\n if (key !== \"__file\" && !(key in newComp)) {\n delete oldComp[key];\n }\n }\n}\nfunction tryWrap(fn) {\n return (id, arg) => {\n try {\n return fn(id, arg);\n } catch (e) {\n console.error(e);\n console.warn(\n `[HMR] Something went wrong during Vue component hot-reload. Full reload required.`\n );\n }\n };\n}\n\nlet devtools$1;\nlet buffer = [];\nlet devtoolsNotInstalled = false;\nfunction emit$1(event, ...args) {\n if (devtools$1) {\n devtools$1.emit(event, ...args);\n } else if (!devtoolsNotInstalled) {\n buffer.push({ event, args });\n }\n}\nfunction setDevtoolsHook$1(hook, target) {\n var _a, _b;\n devtools$1 = hook;\n if (devtools$1) {\n devtools$1.enabled = true;\n buffer.forEach(({ event, args }) => devtools$1.emit(event, ...args));\n buffer = [];\n } else if (\n // handle late devtools injection - only do this if we are in an actual\n // browser environment to avoid the timer handle stalling test runner exit\n // (#4815)\n typeof window !== \"undefined\" && // some envs mock window but not fully\n window.HTMLElement && // also exclude jsdom\n // eslint-disable-next-line no-restricted-syntax\n !((_b = (_a = window.navigator) == null ? void 0 : _a.userAgent) == null ? void 0 : _b.includes(\"jsdom\"))\n ) {\n const replay = target.__VUE_DEVTOOLS_HOOK_REPLAY__ = target.__VUE_DEVTOOLS_HOOK_REPLAY__ || [];\n replay.push((newHook) => {\n setDevtoolsHook$1(newHook, target);\n });\n setTimeout(() => {\n if (!devtools$1) {\n target.__VUE_DEVTOOLS_HOOK_REPLAY__ = null;\n devtoolsNotInstalled = true;\n buffer = [];\n }\n }, 3e3);\n } else {\n devtoolsNotInstalled = true;\n buffer = [];\n }\n}\nfunction devtoolsInitApp(app, version) {\n emit$1(\"app:init\" /* APP_INIT */, app, version, {\n Fragment,\n Text,\n Comment,\n Static\n });\n}\nfunction devtoolsUnmountApp(app) {\n emit$1(\"app:unmount\" /* APP_UNMOUNT */, app);\n}\nconst devtoolsComponentAdded = /* @__PURE__ */ createDevtoolsComponentHook(\"component:added\" /* COMPONENT_ADDED */);\nconst devtoolsComponentUpdated = /* @__PURE__ */ createDevtoolsComponentHook(\"component:updated\" /* COMPONENT_UPDATED */);\nconst _devtoolsComponentRemoved = /* @__PURE__ */ createDevtoolsComponentHook(\n \"component:removed\" /* COMPONENT_REMOVED */\n);\nconst devtoolsComponentRemoved = (component) => {\n if (devtools$1 && typeof devtools$1.cleanupBuffer === \"function\" && // remove the component if it wasn't buffered\n !devtools$1.cleanupBuffer(component)) {\n _devtoolsComponentRemoved(component);\n }\n};\n// @__NO_SIDE_EFFECTS__\nfunction createDevtoolsComponentHook(hook) {\n return (component) => {\n emit$1(\n hook,\n component.appContext.app,\n component.uid,\n component.parent ? component.parent.uid : void 0,\n component\n );\n };\n}\nconst devtoolsPerfStart = /* @__PURE__ */ createDevtoolsPerformanceHook(\"perf:start\" /* PERFORMANCE_START */);\nconst devtoolsPerfEnd = /* @__PURE__ */ createDevtoolsPerformanceHook(\"perf:end\" /* PERFORMANCE_END */);\nfunction createDevtoolsPerformanceHook(hook) {\n return (component, type, time) => {\n emit$1(hook, component.appContext.app, component.uid, component, type, time);\n };\n}\nfunction devtoolsComponentEmit(component, event, params) {\n emit$1(\n \"component:emit\" /* COMPONENT_EMIT */,\n component.appContext.app,\n component,\n event,\n params\n );\n}\n\nlet currentRenderingInstance = null;\nlet currentScopeId = null;\nfunction setCurrentRenderingInstance(instance) {\n const prev = currentRenderingInstance;\n currentRenderingInstance = instance;\n currentScopeId = instance && instance.type.__scopeId || null;\n return prev;\n}\nfunction pushScopeId(id) {\n currentScopeId = id;\n}\nfunction popScopeId() {\n currentScopeId = null;\n}\nconst withScopeId = (_id) => withCtx;\nfunction withCtx(fn, ctx = currentRenderingInstance, isNonScopedSlot) {\n if (!ctx) return fn;\n if (fn._n) {\n return fn;\n }\n const renderFnWithContext = (...args) => {\n if (renderFnWithContext._d) {\n setBlockTracking(-1);\n }\n const prevInstance = setCurrentRenderingInstance(ctx);\n let res;\n try {\n res = fn(...args);\n } finally {\n setCurrentRenderingInstance(prevInstance);\n if (renderFnWithContext._d) {\n setBlockTracking(1);\n }\n }\n if (!!(process.env.NODE_ENV !== \"production\") || __VUE_PROD_DEVTOOLS__) {\n devtoolsComponentUpdated(ctx);\n }\n return res;\n };\n renderFnWithContext._n = true;\n renderFnWithContext._c = true;\n renderFnWithContext._d = true;\n return renderFnWithContext;\n}\n\nfunction validateDirectiveName(name) {\n if (isBuiltInDirective(name)) {\n warn$1(\"Do not use built-in directive ids as custom directive id: \" + name);\n }\n}\nfunction withDirectives(vnode, directives) {\n if (currentRenderingInstance === null) {\n !!(process.env.NODE_ENV !== \"production\") && warn$1(`withDirectives can only be used inside render functions.`);\n return vnode;\n }\n const instance = getComponentPublicInstance(currentRenderingInstance);\n const bindings = vnode.dirs || (vnode.dirs = []);\n for (let i = 0; i < directives.length; i++) {\n let [dir, value, arg, modifiers = EMPTY_OBJ] = directives[i];\n if (dir) {\n if (isFunction(dir)) {\n dir = {\n mounted: dir,\n updated: dir\n };\n }\n if (dir.deep) {\n traverse(value);\n }\n bindings.push({\n dir,\n instance,\n value,\n oldValue: void 0,\n arg,\n modifiers\n });\n }\n }\n return vnode;\n}\nfunction invokeDirectiveHook(vnode, prevVNode, instance, name) {\n const bindings = vnode.dirs;\n const oldBindings = prevVNode && prevVNode.dirs;\n for (let i = 0; i < bindings.length; i++) {\n const binding = bindings[i];\n if (oldBindings) {\n binding.oldValue = oldBindings[i].value;\n }\n let hook = binding.dir[name];\n if (hook) {\n pauseTracking();\n callWithAsyncErrorHandling(hook, instance, 8, [\n vnode.el,\n binding,\n vnode,\n prevVNode\n ]);\n resetTracking();\n }\n }\n}\n\nfunction provide(key, value) {\n if (!!(process.env.NODE_ENV !== \"production\")) {\n if (!currentInstance || currentInstance.isMounted) {\n warn$1(`provide() can only be used inside setup().`);\n }\n }\n if (currentInstance) {\n let provides = currentInstance.provides;\n const parentProvides = currentInstance.parent && currentInstance.parent.provides;\n if (parentProvides === provides) {\n provides = currentInstance.provides = Object.create(parentProvides);\n }\n provides[key] = value;\n }\n}\nfunction inject(key, defaultValue, treatDefaultAsFactory = false) {\n const instance = getCurrentInstance();\n if (instance || currentApp) {\n let provides = currentApp ? currentApp._context.provides : instance ? instance.parent == null || instance.ce ? instance.vnode.appContext && instance.vnode.appContext.provides : instance.parent.provides : void 0;\n if (provides && key in provides) {\n return provides[key];\n } else if (arguments.length > 1) {\n return treatDefaultAsFactory && isFunction(defaultValue) ? defaultValue.call(instance && instance.proxy) : defaultValue;\n } else if (!!(process.env.NODE_ENV !== \"production\")) {\n warn$1(`injection \"${String(key)}\" not found.`);\n }\n } else if (!!(process.env.NODE_ENV !== \"production\")) {\n warn$1(`inject() can only be used inside setup() or functional components.`);\n }\n}\nfunction hasInjectionContext() {\n return !!(getCurrentInstance() || currentApp);\n}\n\nconst ssrContextKey = /* @__PURE__ */ Symbol.for(\"v-scx\");\nconst useSSRContext = () => {\n {\n const ctx = inject(ssrContextKey);\n if (!ctx) {\n !!(process.env.NODE_ENV !== \"production\") && warn$1(\n `Server rendering context not provided. Make sure to only call useSSRContext() conditionally in the server build.`\n );\n }\n return ctx;\n }\n};\n\nfunction watchEffect(effect, options) {\n return doWatch(effect, null, options);\n}\nfunction watchPostEffect(effect, options) {\n return doWatch(\n effect,\n null,\n !!(process.env.NODE_ENV !== \"production\") ? extend({}, options, { flush: \"post\" }) : { flush: \"post\" }\n );\n}\nfunction watchSyncEffect(effect, options) {\n return doWatch(\n effect,\n null,\n !!(process.env.NODE_ENV !== \"production\") ? extend({}, options, { flush: \"sync\" }) : { flush: \"sync\" }\n );\n}\nfunction watch(source, cb, options) {\n if (!!(process.env.NODE_ENV !== \"production\") && !isFunction(cb)) {\n warn$1(\n `\\`watch(fn, options?)\\` signature has been moved to a separate API. Use \\`watchEffect(fn, options?)\\` instead. \\`watch\\` now only supports \\`watch(source, cb, options?) signature.`\n );\n }\n return doWatch(source, cb, options);\n}\nfunction doWatch(source, cb, options = EMPTY_OBJ) {\n const { immediate, deep, flush, once } = options;\n if (!!(process.env.NODE_ENV !== \"production\") && !cb) {\n if (immediate !== void 0) {\n warn$1(\n `watch() \"immediate\" option is only respected when using the watch(source, callback, options?) signature.`\n );\n }\n if (deep !== void 0) {\n warn$1(\n `watch() \"deep\" option is only respected when using the watch(source, callback, options?) signature.`\n );\n }\n if (once !== void 0) {\n warn$1(\n `watch() \"once\" option is only respected when using the watch(source, callback, options?) signature.`\n );\n }\n }\n const baseWatchOptions = extend({}, options);\n if (!!(process.env.NODE_ENV !== \"production\")) baseWatchOptions.onWarn = warn$1;\n const runsImmediately = cb && immediate || !cb && flush !== \"post\";\n let ssrCleanup;\n if (isInSSRComponentSetup) {\n if (flush === \"sync\") {\n const ctx = useSSRContext();\n ssrCleanup = ctx.__watcherHandles || (ctx.__watcherHandles = []);\n } else if (!runsImmediately) {\n const watchStopHandle = () => {\n };\n watchStopHandle.stop = NOOP;\n watchStopHandle.resume = NOOP;\n watchStopHandle.pause = NOOP;\n return watchStopHandle;\n }\n }\n const instance = currentInstance;\n baseWatchOptions.call = (fn, type, args) => callWithAsyncErrorHandling(fn, instance, type, args);\n let isPre = false;\n if (flush === \"post\") {\n baseWatchOptions.scheduler = (job) => {\n queuePostRenderEffect(job, instance && instance.suspense);\n };\n } else if (flush !== \"sync\") {\n isPre = true;\n baseWatchOptions.scheduler = (job, isFirstRun) => {\n if (isFirstRun) {\n job();\n } else {\n queueJob(job);\n }\n };\n }\n baseWatchOptions.augmentJob = (job) => {\n if (cb) {\n job.flags |= 4;\n }\n if (isPre) {\n job.flags |= 2;\n if (instance) {\n job.id = instance.uid;\n job.i = instance;\n }\n }\n };\n const watchHandle = watch$1(source, cb, baseWatchOptions);\n if (isInSSRComponentSetup) {\n if (ssrCleanup) {\n ssrCleanup.push(watchHandle);\n } else if (runsImmediately) {\n watchHandle();\n }\n }\n return watchHandle;\n}\nfunction instanceWatch(source, value, options) {\n const publicThis = this.proxy;\n const getter = isString(source) ? source.includes(\".\") ? createPathGetter(publicThis, source) : () => publicThis[source] : source.bind(publicThis, publicThis);\n let cb;\n if (isFunction(value)) {\n cb = value;\n } else {\n cb = value.handler;\n options = value;\n }\n const reset = setCurrentInstance(this);\n const res = doWatch(getter, cb.bind(publicThis), options);\n reset();\n return res;\n}\nfunction createPathGetter(ctx, path) {\n const segments = path.split(\".\");\n return () => {\n let cur = ctx;\n for (let i = 0; i < segments.length && cur; i++) {\n cur = cur[segments[i]];\n }\n return cur;\n };\n}\n\nconst TeleportEndKey = /* @__PURE__ */ Symbol(\"_vte\");\nconst isTeleport = (type) => type.__isTeleport;\nconst isTeleportDisabled = (props) => props && (props.disabled || props.disabled === \"\");\nconst isTeleportDeferred = (props) => props && (props.defer || props.defer === \"\");\nconst isTargetSVG = (target) => typeof SVGElement !== \"undefined\" && target instanceof SVGElement;\nconst isTargetMathML = (target) => typeof MathMLElement === \"function\" && target instanceof MathMLElement;\nconst resolveTarget = (props, select) => {\n const targetSelector = props && props.to;\n if (isString(targetSelector)) {\n if (!select) {\n !!(process.env.NODE_ENV !== \"production\") && warn$1(\n `Current renderer does not support string target for Teleports. (missing querySelector renderer option)`\n );\n return null;\n } else {\n const target = select(targetSelector);\n if (!!(process.env.NODE_ENV !== \"production\") && !target && !isTeleportDisabled(props)) {\n warn$1(\n `Failed to locate Teleport target with selector \"${targetSelector}\". Note the target element must exist before the component is mounted - i.e. the target cannot be rendered by the component itself, and ideally should be outside of the entire Vue component tree.`\n );\n }\n return target;\n }\n } else {\n if (!!(process.env.NODE_ENV !== \"production\") && !targetSelector && !isTeleportDisabled(props)) {\n warn$1(`Invalid Teleport target: ${targetSelector}`);\n }\n return targetSelector;\n }\n};\nconst TeleportImpl = {\n name: \"Teleport\",\n __isTeleport: true,\n process(n1, n2, container, anchor, parentComponent, parentSuspense, namespace, slotScopeIds, optimized, internals) {\n const {\n mc: mountChildren,\n pc: patchChildren,\n pbc: patchBlockChildren,\n o: { insert, querySelector, createText, createComment }\n } = internals;\n const disabled = isTeleportDisabled(n2.props);\n let { shapeFlag, children, dynamicChildren } = n2;\n if (!!(process.env.NODE_ENV !== \"production\") && isHmrUpdating) {\n optimized = false;\n dynamicChildren = null;\n }\n if (n1 == null) {\n const placeholder = n2.el = !!(process.env.NODE_ENV !== \"production\") ? createComment(\"teleport start\") : createText(\"\");\n const mainAnchor = n2.anchor = !!(process.env.NODE_ENV !== \"production\") ? createComment(\"teleport end\") : createText(\"\");\n insert(placeholder, container, anchor);\n insert(mainAnchor, container, anchor);\n const mount = (container2, anchor2) => {\n if (shapeFlag & 16) {\n mountChildren(\n children,\n container2,\n anchor2,\n parentComponent,\n parentSuspense,\n namespace,\n slotScopeIds,\n optimized\n );\n }\n };\n const mountToTarget = () => {\n const target = n2.target = resolveTarget(n2.props, querySelector);\n const targetAnchor = prepareAnchor(target, n2, createText, insert);\n if (target) {\n if (namespace !== \"svg\" && isTargetSVG(target)) {\n namespace = \"svg\";\n } else if (namespace !== \"mathml\" && isTargetMathML(target)) {\n namespace = \"mathml\";\n }\n if (parentComponent && parentComponent.isCE) {\n (parentComponent.ce._teleportTargets || (parentComponent.ce._teleportTargets = /* @__PURE__ */ new Set())).add(target);\n }\n if (!disabled) {\n mount(target, targetAnchor);\n updateCssVars(n2, false);\n }\n } else if (!!(process.env.NODE_ENV !== \"production\") && !disabled) {\n warn$1(\n \"Invalid Teleport target on mount:\",\n target,\n `(${typeof target})`\n );\n }\n };\n if (disabled) {\n mount(container, mainAnchor);\n updateCssVars(n2, true);\n }\n if (isTeleportDeferred(n2.props)) {\n n2.el.__isMounted = false;\n queuePostRenderEffect(() => {\n mountToTarget();\n delete n2.el.__isMounted;\n }, parentSuspense);\n } else {\n mountToTarget();\n }\n } else {\n if (isTeleportDeferred(n2.props) && n1.el.__isMounted === false) {\n queuePostRenderEffect(() => {\n TeleportImpl.process(\n n1,\n n2,\n container,\n anchor,\n parentComponent,\n parentSuspense,\n namespace,\n slotScopeIds,\n optimized,\n internals\n );\n }, parentSuspense);\n return;\n }\n n2.el = n1.el;\n n2.targetStart = n1.targetStart;\n const mainAnchor = n2.anchor = n1.anchor;\n const target = n2.target = n1.target;\n const targetAnchor = n2.targetAnchor = n1.targetAnchor;\n const wasDisabled = isTeleportDisabled(n1.props);\n const currentContainer = wasDisabled ? container : target;\n const currentAnchor = wasDisabled ? mainAnchor : targetAnchor;\n if (namespace === \"svg\" || isTargetSVG(target)) {\n namespace = \"svg\";\n } else if (namespace === \"mathml\" || isTargetMathML(target)) {\n namespace = \"mathml\";\n }\n if (dynamicChildren) {\n patchBlockChildren(\n n1.dynamicChildren,\n dynamicChildren,\n currentContainer,\n parentComponent,\n parentSuspense,\n namespace,\n slotScopeIds\n );\n traverseStaticChildren(n1, n2, !!!(process.env.NODE_ENV !== \"production\"));\n } else if (!optimized) {\n patchChildren(\n n1,\n n2,\n currentContainer,\n currentAnchor,\n parentComponent,\n parentSuspense,\n namespace,\n slotScopeIds,\n false\n );\n }\n if (disabled) {\n if (!wasDisabled) {\n moveTeleport(\n n2,\n container,\n mainAnchor,\n internals,\n 1\n );\n } else {\n if (n2.props && n1.props && n2.props.to !== n1.props.to) {\n n2.props.to = n1.props.to;\n }\n }\n } else {\n if ((n2.props && n2.props.to) !== (n1.props && n1.props.to)) {\n const nextTarget = n2.target = resolveTarget(\n n2.props,\n querySelector\n );\n if (nextTarget) {\n moveTeleport(\n n2,\n nextTarget,\n null,\n internals,\n 0\n );\n } else if (!!(process.env.NODE_ENV !== \"production\")) {\n warn$1(\n \"Invalid Teleport target on update:\",\n target,\n `(${typeof target})`\n );\n }\n } else if (wasDisabled) {\n moveTeleport(\n n2,\n target,\n targetAnchor,\n internals,\n 1\n );\n }\n }\n updateCssVars(n2, disabled);\n }\n },\n remove(vnode, parentComponent, parentSuspense, { um: unmount, o: { remove: hostRemove } }, doRemove) {\n const {\n shapeFlag,\n children,\n anchor,\n targetStart,\n targetAnchor,\n target,\n props\n } = vnode;\n if (target) {\n hostRemove(targetStart);\n hostRemove(targetAnchor);\n }\n doRemove && hostRemove(anchor);\n if (shapeFlag & 16) {\n const shouldRemove = doRemove || !isTeleportDisabled(props);\n for (let i = 0; i < children.length; i++) {\n const child = children[i];\n unmount(\n child,\n parentComponent,\n parentSuspense,\n shouldRemove,\n !!child.dynamicChildren\n );\n }\n }\n },\n move: moveTeleport,\n hydrate: hydrateTeleport\n};\nfunction moveTeleport(vnode, container, parentAnchor, { o: { insert }, m: move }, moveType = 2) {\n if (moveType === 0) {\n insert(vnode.targetAnchor, container, parentAnchor);\n }\n const { el, anchor, shapeFlag, children, props } = vnode;\n const isReorder = moveType === 2;\n if (isReorder) {\n insert(el, container, parentAnchor);\n }\n if (!isReorder || isTeleportDisabled(props)) {\n if (shapeFlag & 16) {\n for (let i = 0; i < children.length; i++) {\n move(\n children[i],\n container,\n parentAnchor,\n 2\n );\n }\n }\n }\n if (isReorder) {\n insert(anchor, container, parentAnchor);\n }\n}\nfunction hydrateTeleport(node, vnode, parentComponent, parentSuspense, slotScopeIds, optimized, {\n o: { nextSibling, parentNode, querySelector, insert, createText }\n}, hydrateChildren) {\n function hydrateDisabledTeleport(node2, vnode2, targetStart, targetAnchor) {\n vnode2.anchor = hydrateChildren(\n nextSibling(node2),\n vnode2,\n parentNode(node2),\n parentComponent,\n parentSuspense,\n slotScopeIds,\n optimized\n );\n vnode2.targetStart = targetStart;\n vnode2.targetAnchor = targetAnchor;\n }\n const target = vnode.target = resolveTarget(\n vnode.props,\n querySelector\n );\n const disabled = isTeleportDisabled(vnode.props);\n if (target) {\n const targetNode = target._lpa || target.firstChild;\n if (vnode.shapeFlag & 16) {\n if (disabled) {\n hydrateDisabledTeleport(\n node,\n vnode,\n targetNode,\n targetNode && nextSibling(targetNode)\n );\n } else {\n vnode.anchor = nextSibling(node);\n let targetAnchor = targetNode;\n while (targetAnchor) {\n if (targetAnchor && targetAnchor.nodeType === 8) {\n if (targetAnchor.data === \"teleport start anchor\") {\n vnode.targetStart = targetAnchor;\n } else if (targetAnchor.data === \"teleport anchor\") {\n vnode.targetAnchor = targetAnchor;\n target._lpa = vnode.targetAnchor && nextSibling(vnode.targetAnchor);\n break;\n }\n }\n targetAnchor = nextSibling(targetAnchor);\n }\n if (!vnode.targetAnchor) {\n prepareAnchor(target, vnode, createText, insert);\n }\n hydrateChildren(\n targetNode && nextSibling(targetNode),\n vnode,\n target,\n parentComponent,\n parentSuspense,\n slotScopeIds,\n optimized\n );\n }\n }\n updateCssVars(vnode, disabled);\n } else if (disabled) {\n if (vnode.shapeFlag & 16) {\n hydrateDisabledTeleport(node, vnode, node, nextSibling(node));\n }\n }\n return vnode.anchor && nextSibling(vnode.anchor);\n}\nconst Teleport = TeleportImpl;\nfunction updateCssVars(vnode, isDisabled) {\n const ctx = vnode.ctx;\n if (ctx && ctx.ut) {\n let node, anchor;\n if (isDisabled) {\n node = vnode.el;\n anchor = vnode.anchor;\n } else {\n node = vnode.targetStart;\n anchor = vnode.targetAnchor;\n }\n while (node && node !== anchor) {\n if (node.nodeType === 1) node.setAttribute(\"data-v-owner\", ctx.uid);\n node = node.nextSibling;\n }\n ctx.ut();\n }\n}\nfunction prepareAnchor(target, vnode, createText, insert) {\n const targetStart = vnode.targetStart = createText(\"\");\n const targetAnchor = vnode.targetAnchor = createText(\"\");\n targetStart[TeleportEndKey] = targetAnchor;\n if (target) {\n insert(targetStart, target);\n insert(targetAnchor, target);\n }\n return targetAnchor;\n}\n\nconst leaveCbKey = /* @__PURE__ */ Symbol(\"_leaveCb\");\nconst enterCbKey = /* @__PURE__ */ Symbol(\"_enterCb\");\nfunction useTransitionState() {\n const state = {\n isMounted: false,\n isLeaving: false,\n isUnmounting: false,\n leavingVNodes: /* @__PURE__ */ new Map()\n };\n onMounted(() => {\n state.isMounted = true;\n });\n onBeforeUnmount(() => {\n state.isUnmounting = true;\n });\n return state;\n}\nconst TransitionHookValidator = [Function, Array];\nconst BaseTransitionPropsValidators = {\n mode: String,\n appear: Boolean,\n persisted: Boolean,\n // enter\n onBeforeEnter: TransitionHookValidator,\n onEnter: TransitionHookValidator,\n onAfterEnter: TransitionHookValidator,\n onEnterCancelled: TransitionHookValidator,\n // leave\n onBeforeLeave: TransitionHookValidator,\n onLeave: TransitionHookValidator,\n onAfterLeave: TransitionHookValidator,\n onLeaveCancelled: TransitionHookValidator,\n // appear\n onBeforeAppear: TransitionHookValidator,\n onAppear: TransitionHookValidator,\n onAfterAppear: TransitionHookValidator,\n onAppearCancelled: TransitionHookValidator\n};\nconst recursiveGetSubtree = (instance) => {\n const subTree = instance.subTree;\n return subTree.component ? recursiveGetSubtree(subTree.component) : subTree;\n};\nconst BaseTransitionImpl = {\n name: `BaseTransition`,\n props: BaseTransitionPropsValidators,\n setup(props, { slots }) {\n const instance = getCurrentInstance();\n const state = useTransitionState();\n return () => {\n const children = slots.default && getTransitionRawChildren(slots.default(), true);\n if (!children || !children.length) {\n return;\n }\n const child = findNonCommentChild(children);\n const rawProps = toRaw(props);\n const { mode } = rawProps;\n if (!!(process.env.NODE_ENV !== \"production\") && mode && mode !== \"in-out\" && mode !== \"out-in\" && mode !== \"default\") {\n warn$1(`invalid mode: ${mode}`);\n }\n if (state.isLeaving) {\n return emptyPlaceholder(child);\n }\n const innerChild = getInnerChild$1(child);\n if (!innerChild) {\n return emptyPlaceholder(child);\n }\n let enterHooks = resolveTransitionHooks(\n innerChild,\n rawProps,\n state,\n instance,\n // #11061, ensure enterHooks is fresh after clone\n (hooks) => enterHooks = hooks\n );\n if (innerChild.type !== Comment) {\n setTransitionHooks(innerChild, enterHooks);\n }\n let oldInnerChild = instance.subTree && getInnerChild$1(instance.subTree);\n if (oldInnerChild && oldInnerChild.type !== Comment && !isSameVNodeType(oldInnerChild, innerChild) && recursiveGetSubtree(instance).type !== Comment) {\n let leavingHooks = resolveTransitionHooks(\n oldInnerChild,\n rawProps,\n state,\n instance\n );\n setTransitionHooks(oldInnerChild, leavingHooks);\n if (mode === \"out-in\" && innerChild.type !== Comment) {\n state.isLeaving = true;\n leavingHooks.afterLeave = () => {\n state.isLeaving = false;\n if (!(instance.job.flags & 8)) {\n instance.update();\n }\n delete leavingHooks.afterLeave;\n oldInnerChild = void 0;\n };\n return emptyPlaceholder(child);\n } else if (mode === \"in-out\" && innerChild.type !== Comment) {\n leavingHooks.delayLeave = (el, earlyRemove, delayedLeave) => {\n const leavingVNodesCache = getLeavingNodesForType(\n state,\n oldInnerChild\n );\n leavingVNodesCache[String(oldInnerChild.key)] = oldInnerChild;\n el[leaveCbKey] = () => {\n earlyRemove();\n el[leaveCbKey] = void 0;\n delete enterHooks.delayedLeave;\n oldInnerChild = void 0;\n };\n enterHooks.delayedLeave = () => {\n delayedLeave();\n delete enterHooks.delayedLeave;\n oldInnerChild = void 0;\n };\n };\n } else {\n oldInnerChild = void 0;\n }\n } else if (oldInnerChild) {\n oldInnerChild = void 0;\n }\n return child;\n };\n }\n};\nfunction findNonCommentChild(children) {\n let child = children[0];\n if (children.length > 1) {\n let hasFound = false;\n for (const c of children) {\n if (c.type !== Comment) {\n if (!!(process.env.NODE_ENV !== \"production\") && hasFound) {\n warn$1(\n \" can only be used on a single element or component. Use for lists.\"\n );\n break;\n }\n child = c;\n hasFound = true;\n if (!!!(process.env.NODE_ENV !== \"production\")) break;\n }\n }\n }\n return child;\n}\nconst BaseTransition = BaseTransitionImpl;\nfunction getLeavingNodesForType(state, vnode) {\n const { leavingVNodes } = state;\n let leavingVNodesCache = leavingVNodes.get(vnode.type);\n if (!leavingVNodesCache) {\n leavingVNodesCache = /* @__PURE__ */ Object.create(null);\n leavingVNodes.set(vnode.type, leavingVNodesCache);\n }\n return leavingVNodesCache;\n}\nfunction resolveTransitionHooks(vnode, props, state, instance, postClone) {\n const {\n appear,\n mode,\n persisted = false,\n onBeforeEnter,\n onEnter,\n onAfterEnter,\n onEnterCancelled,\n onBeforeLeave,\n onLeave,\n onAfterLeave,\n onLeaveCancelled,\n onBeforeAppear,\n onAppear,\n onAfterAppear,\n onAppearCancelled\n } = props;\n const key = String(vnode.key);\n const leavingVNodesCache = getLeavingNodesForType(state, vnode);\n const callHook = (hook, args) => {\n hook && callWithAsyncErrorHandling(\n hook,\n instance,\n 9,\n args\n );\n };\n const callAsyncHook = (hook, args) => {\n const done = args[1];\n callHook(hook, args);\n if (isArray(hook)) {\n if (hook.every((hook2) => hook2.length <= 1)) done();\n } else if (hook.length <= 1) {\n done();\n }\n };\n const hooks = {\n mode,\n persisted,\n beforeEnter(el) {\n let hook = onBeforeEnter;\n if (!state.isMounted) {\n if (appear) {\n hook = onBeforeAppear || onBeforeEnter;\n } else {\n return;\n }\n }\n if (el[leaveCbKey]) {\n el[leaveCbKey](\n true\n /* cancelled */\n );\n }\n const leavingVNode = leavingVNodesCache[key];\n if (leavingVNode && isSameVNodeType(vnode, leavingVNode) && leavingVNode.el[leaveCbKey]) {\n leavingVNode.el[leaveCbKey]();\n }\n callHook(hook, [el]);\n },\n enter(el) {\n let hook = onEnter;\n let afterHook = onAfterEnter;\n let cancelHook = onEnterCancelled;\n if (!state.isMounted) {\n if (appear) {\n hook = onAppear || onEnter;\n afterHook = onAfterAppear || onAfterEnter;\n cancelHook = onAppearCancelled || onEnterCancelled;\n } else {\n return;\n }\n }\n let called = false;\n const done = el[enterCbKey] = (cancelled) => {\n if (called) return;\n called = true;\n if (cancelled) {\n callHook(cancelHook, [el]);\n } else {\n callHook(afterHook, [el]);\n }\n if (hooks.delayedLeave) {\n hooks.delayedLeave();\n }\n el[enterCbKey] = void 0;\n };\n if (hook) {\n callAsyncHook(hook, [el, done]);\n } else {\n done();\n }\n },\n leave(el, remove) {\n const key2 = String(vnode.key);\n if (el[enterCbKey]) {\n el[enterCbKey](\n true\n /* cancelled */\n );\n }\n if (state.isUnmounting) {\n return remove();\n }\n callHook(onBeforeLeave, [el]);\n let called = false;\n const done = el[leaveCbKey] = (cancelled) => {\n if (called) return;\n called = true;\n remove();\n if (cancelled) {\n callHook(onLeaveCancelled, [el]);\n } else {\n callHook(onAfterLeave, [el]);\n }\n el[leaveCbKey] = void 0;\n if (leavingVNodesCache[key2] === vnode) {\n delete leavingVNodesCache[key2];\n }\n };\n leavingVNodesCache[key2] = vnode;\n if (onLeave) {\n callAsyncHook(onLeave, [el, done]);\n } else {\n done();\n }\n },\n clone(vnode2) {\n const hooks2 = resolveTransitionHooks(\n vnode2,\n props,\n state,\n instance,\n postClone\n );\n if (postClone) postClone(hooks2);\n return hooks2;\n }\n };\n return hooks;\n}\nfunction emptyPlaceholder(vnode) {\n if (isKeepAlive(vnode)) {\n vnode = cloneVNode(vnode);\n vnode.children = null;\n return vnode;\n }\n}\nfunction getInnerChild$1(vnode) {\n if (!isKeepAlive(vnode)) {\n if (isTeleport(vnode.type) && vnode.children) {\n return findNonCommentChild(vnode.children);\n }\n return vnode;\n }\n if (vnode.component) {\n return vnode.component.subTree;\n }\n const { shapeFlag, children } = vnode;\n if (children) {\n if (shapeFlag & 16) {\n return children[0];\n }\n if (shapeFlag & 32 && isFunction(children.default)) {\n return children.default();\n }\n }\n}\nfunction setTransitionHooks(vnode, hooks) {\n if (vnode.shapeFlag & 6 && vnode.component) {\n vnode.transition = hooks;\n setTransitionHooks(vnode.component.subTree, hooks);\n } else if (vnode.shapeFlag & 128) {\n vnode.ssContent.transition = hooks.clone(vnode.ssContent);\n vnode.ssFallback.transition = hooks.clone(vnode.ssFallback);\n } else {\n vnode.transition = hooks;\n }\n}\nfunction getTransitionRawChildren(children, keepComment = false, parentKey) {\n let ret = [];\n let keyedFragmentCount = 0;\n for (let i = 0; i < children.length; i++) {\n let child = children[i];\n const key = parentKey == null ? child.key : String(parentKey) + String(child.key != null ? child.key : i);\n if (child.type === Fragment) {\n if (child.patchFlag & 128) keyedFragmentCount++;\n ret = ret.concat(\n getTransitionRawChildren(child.children, keepComment, key)\n );\n } else if (keepComment || child.type !== Comment) {\n ret.push(key != null ? cloneVNode(child, { key }) : child);\n }\n }\n if (keyedFragmentCount > 1) {\n for (let i = 0; i < ret.length; i++) {\n ret[i].patchFlag = -2;\n }\n }\n return ret;\n}\n\n// @__NO_SIDE_EFFECTS__\nfunction defineComponent(options, extraOptions) {\n return isFunction(options) ? (\n // #8236: extend call and options.name access are considered side-effects\n // by Rollup, so we have to wrap it in a pure-annotated IIFE.\n /* @__PURE__ */ (() => extend({ name: options.name }, extraOptions, { setup: options }))()\n ) : options;\n}\n\nfunction useId() {\n const i = getCurrentInstance();\n if (i) {\n return (i.appContext.config.idPrefix || \"v\") + \"-\" + i.ids[0] + i.ids[1]++;\n } else if (!!(process.env.NODE_ENV !== \"production\")) {\n warn$1(\n `useId() is called when there is no active component instance to be associated with.`\n );\n }\n return \"\";\n}\nfunction markAsyncBoundary(instance) {\n instance.ids = [instance.ids[0] + instance.ids[2]++ + \"-\", 0, 0];\n}\n\nconst knownTemplateRefs = /* @__PURE__ */ new WeakSet();\nfunction useTemplateRef(key) {\n const i = getCurrentInstance();\n const r = shallowRef(null);\n if (i) {\n const refs = i.refs === EMPTY_OBJ ? i.refs = {} : i.refs;\n let desc;\n if (!!(process.env.NODE_ENV !== \"production\") && (desc = Object.getOwnPropertyDescriptor(refs, key)) && !desc.configurable) {\n warn$1(`useTemplateRef('${key}') already exists.`);\n } else {\n Object.defineProperty(refs, key, {\n enumerable: true,\n get: () => r.value,\n set: (val) => r.value = val\n });\n }\n } else if (!!(process.env.NODE_ENV !== \"production\")) {\n warn$1(\n `useTemplateRef() is called when there is no active component instance to be associated with.`\n );\n }\n const ret = !!(process.env.NODE_ENV !== \"production\") ? readonly(r) : r;\n if (!!(process.env.NODE_ENV !== \"production\")) {\n knownTemplateRefs.add(ret);\n }\n return ret;\n}\n\nconst pendingSetRefMap = /* @__PURE__ */ new WeakMap();\nfunction setRef(rawRef, oldRawRef, parentSuspense, vnode, isUnmount = false) {\n if (isArray(rawRef)) {\n rawRef.forEach(\n (r, i) => setRef(\n r,\n oldRawRef && (isArray(oldRawRef) ? oldRawRef[i] : oldRawRef),\n parentSuspense,\n vnode,\n isUnmount\n )\n );\n return;\n }\n if (isAsyncWrapper(vnode) && !isUnmount) {\n if (vnode.shapeFlag & 512 && vnode.type.__asyncResolved && vnode.component.subTree.component) {\n setRef(rawRef, oldRawRef, parentSuspense, vnode.component.subTree);\n }\n return;\n }\n const refValue = vnode.shapeFlag & 4 ? getComponentPublicInstance(vnode.component) : vnode.el;\n const value = isUnmount ? null : refValue;\n const { i: owner, r: ref } = rawRef;\n if (!!(process.env.NODE_ENV !== \"production\") && !owner) {\n warn$1(\n `Missing ref owner context. ref cannot be used on hoisted vnodes. A vnode with ref must be created inside the render function.`\n );\n return;\n }\n const oldRef = oldRawRef && oldRawRef.r;\n const refs = owner.refs === EMPTY_OBJ ? owner.refs = {} : owner.refs;\n const setupState = owner.setupState;\n const rawSetupState = toRaw(setupState);\n const canSetSetupRef = setupState === EMPTY_OBJ ? NO : (key) => {\n if (!!(process.env.NODE_ENV !== \"production\")) {\n if (hasOwn(rawSetupState, key) && !isRef(rawSetupState[key])) {\n warn$1(\n `Template ref \"${key}\" used on a non-ref value. It will not work in the production build.`\n );\n }\n if (knownTemplateRefs.has(rawSetupState[key])) {\n return false;\n }\n }\n return hasOwn(rawSetupState, key);\n };\n const canSetRef = (ref2) => {\n return !!!(process.env.NODE_ENV !== \"production\") || !knownTemplateRefs.has(ref2);\n };\n if (oldRef != null && oldRef !== ref) {\n invalidatePendingSetRef(oldRawRef);\n if (isString(oldRef)) {\n refs[oldRef] = null;\n if (canSetSetupRef(oldRef)) {\n setupState[oldRef] = null;\n }\n } else if (isRef(oldRef)) {\n if (canSetRef(oldRef)) {\n oldRef.value = null;\n }\n const oldRawRefAtom = oldRawRef;\n if (oldRawRefAtom.k) refs[oldRawRefAtom.k] = null;\n }\n }\n if (isFunction(ref)) {\n callWithErrorHandling(ref, owner, 12, [value, refs]);\n } else {\n const _isString = isString(ref);\n const _isRef = isRef(ref);\n if (_isString || _isRef) {\n const doSet = () => {\n if (rawRef.f) {\n const existing = _isString ? canSetSetupRef(ref) ? setupState[ref] : refs[ref] : canSetRef(ref) || !rawRef.k ? ref.value : refs[rawRef.k];\n if (isUnmount) {\n isArray(existing) && remove(existing, refValue);\n } else {\n if (!isArray(existing)) {\n if (_isString) {\n refs[ref] = [refValue];\n if (canSetSetupRef(ref)) {\n setupState[ref] = refs[ref];\n }\n } else {\n const newVal = [refValue];\n if (canSetRef(ref)) {\n ref.value = newVal;\n }\n if (rawRef.k) refs[rawRef.k] = newVal;\n }\n } else if (!existing.includes(refValue)) {\n existing.push(refValue);\n }\n }\n } else if (_isString) {\n refs[ref] = value;\n if (canSetSetupRef(ref)) {\n setupState[ref] = value;\n }\n } else if (_isRef) {\n if (canSetRef(ref)) {\n ref.value = value;\n }\n if (rawRef.k) refs[rawRef.k] = value;\n } else if (!!(process.env.NODE_ENV !== \"production\")) {\n warn$1(\"Invalid template ref type:\", ref, `(${typeof ref})`);\n }\n };\n if (value) {\n const job = () => {\n doSet();\n pendingSetRefMap.delete(rawRef);\n };\n job.id = -1;\n pendingSetRefMap.set(rawRef, job);\n queuePostRenderEffect(job, parentSuspense);\n } else {\n invalidatePendingSetRef(rawRef);\n doSet();\n }\n } else if (!!(process.env.NODE_ENV !== \"production\")) {\n warn$1(\"Invalid template ref type:\", ref, `(${typeof ref})`);\n }\n }\n}\nfunction invalidatePendingSetRef(rawRef) {\n const pendingSetRef = pendingSetRefMap.get(rawRef);\n if (pendingSetRef) {\n pendingSetRef.flags |= 8;\n pendingSetRefMap.delete(rawRef);\n }\n}\n\nlet hasLoggedMismatchError = false;\nconst logMismatchError = () => {\n if (hasLoggedMismatchError) {\n return;\n }\n console.error(\"Hydration completed but contains mismatches.\");\n hasLoggedMismatchError = true;\n};\nconst isSVGContainer = (container) => container.namespaceURI.includes(\"svg\") && container.tagName !== \"foreignObject\";\nconst isMathMLContainer = (container) => container.namespaceURI.includes(\"MathML\");\nconst getContainerType = (container) => {\n if (container.nodeType !== 1) return void 0;\n if (isSVGContainer(container)) return \"svg\";\n if (isMathMLContainer(container)) return \"mathml\";\n return void 0;\n};\nconst isComment = (node) => node.nodeType === 8;\nfunction createHydrationFunctions(rendererInternals) {\n const {\n mt: mountComponent,\n p: patch,\n o: {\n patchProp,\n createText,\n nextSibling,\n parentNode,\n remove,\n insert,\n createComment\n }\n } = rendererInternals;\n const hydrate = (vnode, container) => {\n if (!container.hasChildNodes()) {\n (!!(process.env.NODE_ENV !== \"production\") || __VUE_PROD_HYDRATION_MISMATCH_DETAILS__) && warn$1(\n `Attempting to hydrate existing markup but container is empty. Performing full mount instead.`\n );\n patch(null, vnode, container);\n flushPostFlushCbs();\n container._vnode = vnode;\n return;\n }\n hydrateNode(container.firstChild, vnode, null, null, null);\n flushPostFlushCbs();\n container._vnode = vnode;\n };\n const hydrateNode = (node, vnode, parentComponent, parentSuspense, slotScopeIds, optimized = false) => {\n optimized = optimized || !!vnode.dynamicChildren;\n const isFragmentStart = isComment(node) && node.data === \"[\";\n const onMismatch = () => handleMismatch(\n node,\n vnode,\n parentComponent,\n parentSuspense,\n slotScopeIds,\n isFragmentStart\n );\n const { type, ref, shapeFlag, patchFlag } = vnode;\n let domType = node.nodeType;\n vnode.el = node;\n if (!!(process.env.NODE_ENV !== \"production\") || __VUE_PROD_DEVTOOLS__) {\n def(node, \"__vnode\", vnode, true);\n def(node, \"__vueParentComponent\", parentComponent, true);\n }\n if (patchFlag === -2) {\n optimized = false;\n vnode.dynamicChildren = null;\n }\n let nextNode = null;\n switch (type) {\n case Text:\n if (domType !== 3) {\n if (vnode.children === \"\") {\n insert(vnode.el = createText(\"\"), parentNode(node), node);\n nextNode = node;\n } else {\n nextNode = onMismatch();\n }\n } else {\n if (node.data !== vnode.children) {\n (!!(process.env.NODE_ENV !== \"production\") || __VUE_PROD_HYDRATION_MISMATCH_DETAILS__) && warn$1(\n `Hydration text mismatch in`,\n node.parentNode,\n `\n - rendered on server: ${JSON.stringify(\n node.data\n )}\n - expected on client: ${JSON.stringify(vnode.children)}`\n );\n logMismatchError();\n node.data = vnode.children;\n }\n nextNode = nextSibling(node);\n }\n break;\n case Comment:\n if (isTemplateNode(node)) {\n nextNode = nextSibling(node);\n replaceNode(\n vnode.el = node.content.firstChild,\n node,\n parentComponent\n );\n } else if (domType !== 8 || isFragmentStart) {\n nextNode = onMismatch();\n } else {\n nextNode = nextSibling(node);\n }\n break;\n case Static:\n if (isFragmentStart) {\n node = nextSibling(node);\n domType = node.nodeType;\n }\n if (domType === 1 || domType === 3) {\n nextNode = node;\n const needToAdoptContent = !vnode.children.length;\n for (let i = 0; i < vnode.staticCount; i++) {\n if (needToAdoptContent)\n vnode.children += nextNode.nodeType === 1 ? nextNode.outerHTML : nextNode.data;\n if (i === vnode.staticCount - 1) {\n vnode.anchor = nextNode;\n }\n nextNode = nextSibling(nextNode);\n }\n return isFragmentStart ? nextSibling(nextNode) : nextNode;\n } else {\n onMismatch();\n }\n break;\n case Fragment:\n if (!isFragmentStart) {\n nextNode = onMismatch();\n } else {\n nextNode = hydrateFragment(\n node,\n vnode,\n parentComponent,\n parentSuspense,\n slotScopeIds,\n optimized\n );\n }\n break;\n default:\n if (shapeFlag & 1) {\n if ((domType !== 1 || vnode.type.toLowerCase() !== node.tagName.toLowerCase()) && !isTemplateNode(node)) {\n nextNode = onMismatch();\n } else {\n nextNode = hydrateElement(\n node,\n vnode,\n parentComponent,\n parentSuspense,\n slotScopeIds,\n optimized\n );\n }\n } else if (shapeFlag & 6) {\n vnode.slotScopeIds = slotScopeIds;\n const container = parentNode(node);\n if (isFragmentStart) {\n nextNode = locateClosingAnchor(node);\n } else if (isComment(node) && node.data === \"teleport start\") {\n nextNode = locateClosingAnchor(node, node.data, \"teleport end\");\n } else {\n nextNode = nextSibling(node);\n }\n mountComponent(\n vnode,\n container,\n null,\n parentComponent,\n parentSuspense,\n getContainerType(container),\n optimized\n );\n if (isAsyncWrapper(vnode) && !vnode.type.__asyncResolved) {\n let subTree;\n if (isFragmentStart) {\n subTree = createVNode(Fragment);\n subTree.anchor = nextNode ? nextNode.previousSibling : container.lastChild;\n } else {\n subTree = node.nodeType === 3 ? createTextVNode(\"\") : createVNode(\"div\");\n }\n subTree.el = node;\n vnode.component.subTree = subTree;\n }\n } else if (shapeFlag & 64) {\n if (domType !== 8) {\n nextNode = onMismatch();\n } else {\n nextNode = vnode.type.hydrate(\n node,\n vnode,\n parentComponent,\n parentSuspense,\n slotScopeIds,\n optimized,\n rendererInternals,\n hydrateChildren\n );\n }\n } else if (shapeFlag & 128) {\n nextNode = vnode.type.hydrate(\n node,\n vnode,\n parentComponent,\n parentSuspense,\n getContainerType(parentNode(node)),\n slotScopeIds,\n optimized,\n rendererInternals,\n hydrateNode\n );\n } else if (!!(process.env.NODE_ENV !== \"production\") || __VUE_PROD_HYDRATION_MISMATCH_DETAILS__) {\n warn$1(\"Invalid HostVNode type:\", type, `(${typeof type})`);\n }\n }\n if (ref != null) {\n setRef(ref, null, parentSuspense, vnode);\n }\n return nextNode;\n };\n const hydrateElement = (el, vnode, parentComponent, parentSuspense, slotScopeIds, optimized) => {\n optimized = optimized || !!vnode.dynamicChildren;\n const { type, props, patchFlag, shapeFlag, dirs, transition } = vnode;\n const forcePatch = type === \"input\" || type === \"option\";\n if (!!(process.env.NODE_ENV !== \"production\") || forcePatch || patchFlag !== -1) {\n if (dirs) {\n invokeDirectiveHook(vnode, null, parentComponent, \"created\");\n }\n let needCallTransitionHooks = false;\n if (isTemplateNode(el)) {\n needCallTransitionHooks = needTransition(\n null,\n // no need check parentSuspense in hydration\n transition\n ) && parentComponent && parentComponent.vnode.props && parentComponent.vnode.props.appear;\n const content = el.content.firstChild;\n if (needCallTransitionHooks) {\n const cls = content.getAttribute(\"class\");\n if (cls) content.$cls = cls;\n transition.beforeEnter(content);\n }\n replaceNode(content, el, parentComponent);\n vnode.el = el = content;\n }\n if (shapeFlag & 16 && // skip if element has innerHTML / textContent\n !(props && (props.innerHTML || props.textContent))) {\n let next = hydrateChildren(\n el.firstChild,\n vnode,\n el,\n parentComponent,\n parentSuspense,\n slotScopeIds,\n optimized\n );\n let hasWarned = false;\n while (next) {\n if (!isMismatchAllowed(el, 1 /* CHILDREN */)) {\n if ((!!(process.env.NODE_ENV !== \"production\") || __VUE_PROD_HYDRATION_MISMATCH_DETAILS__) && !hasWarned) {\n warn$1(\n `Hydration children mismatch on`,\n el,\n `\nServer rendered element contains more child nodes than client vdom.`\n );\n hasWarned = true;\n }\n logMismatchError();\n }\n const cur = next;\n next = next.nextSibling;\n remove(cur);\n }\n } else if (shapeFlag & 8) {\n let clientText = vnode.children;\n if (clientText[0] === \"\\n\" && (el.tagName === \"PRE\" || el.tagName === \"TEXTAREA\")) {\n clientText = clientText.slice(1);\n }\n const { textContent } = el;\n if (textContent !== clientText && // innerHTML normalize \\r\\n or \\r into a single \\n in the DOM\n textContent !== clientText.replace(/\\r\\n|\\r/g, \"\\n\")) {\n if (!isMismatchAllowed(el, 0 /* TEXT */)) {\n (!!(process.env.NODE_ENV !== \"production\") || __VUE_PROD_HYDRATION_MISMATCH_DETAILS__) && warn$1(\n `Hydration text content mismatch on`,\n el,\n `\n - rendered on server: ${textContent}\n - expected on client: ${clientText}`\n );\n logMismatchError();\n }\n el.textContent = vnode.children;\n }\n }\n if (props) {\n if (!!(process.env.NODE_ENV !== \"production\") || __VUE_PROD_HYDRATION_MISMATCH_DETAILS__ || forcePatch || !optimized || patchFlag & (16 | 32)) {\n const isCustomElement = el.tagName.includes(\"-\");\n for (const key in props) {\n if ((!!(process.env.NODE_ENV !== \"production\") || __VUE_PROD_HYDRATION_MISMATCH_DETAILS__) && // #11189 skip if this node has directives that have created hooks\n // as it could have mutated the DOM in any possible way\n !(dirs && dirs.some((d) => d.dir.created)) && propHasMismatch(el, key, props[key], vnode, parentComponent)) {\n logMismatchError();\n }\n if (forcePatch && (key.endsWith(\"value\") || key === \"indeterminate\") || isOn(key) && !isReservedProp(key) || // force hydrate v-bind with .prop modifiers\n key[0] === \".\" || isCustomElement) {\n patchProp(el, key, null, props[key], void 0, parentComponent);\n }\n }\n } else if (props.onClick) {\n patchProp(\n el,\n \"onClick\",\n null,\n props.onClick,\n void 0,\n parentComponent\n );\n } else if (patchFlag & 4 && isReactive(props.style)) {\n for (const key in props.style) props.style[key];\n }\n }\n let vnodeHooks;\n if (vnodeHooks = props && props.onVnodeBeforeMount) {\n invokeVNodeHook(vnodeHooks, parentComponent, vnode);\n }\n if (dirs) {\n invokeDirectiveHook(vnode, null, parentComponent, \"beforeMount\");\n }\n if ((vnodeHooks = props && props.onVnodeMounted) || dirs || needCallTransitionHooks) {\n queueEffectWithSuspense(() => {\n vnodeHooks && invokeVNodeHook(vnodeHooks, parentComponent, vnode);\n needCallTransitionHooks && transition.enter(el);\n dirs && invokeDirectiveHook(vnode, null, parentComponent, \"mounted\");\n }, parentSuspense);\n }\n }\n return el.nextSibling;\n };\n const hydrateChildren = (node, parentVNode, container, parentComponent, parentSuspense, slotScopeIds, optimized) => {\n optimized = optimized || !!parentVNode.dynamicChildren;\n const children = parentVNode.children;\n const l = children.length;\n let hasWarned = false;\n for (let i = 0; i < l; i++) {\n const vnode = optimized ? children[i] : children[i] = normalizeVNode(children[i]);\n const isText = vnode.type === Text;\n if (node) {\n if (isText && !optimized) {\n if (i + 1 < l && normalizeVNode(children[i + 1]).type === Text) {\n insert(\n createText(\n node.data.slice(vnode.children.length)\n ),\n container,\n nextSibling(node)\n );\n node.data = vnode.children;\n }\n }\n node = hydrateNode(\n node,\n vnode,\n parentComponent,\n parentSuspense,\n slotScopeIds,\n optimized\n );\n } else if (isText && !vnode.children) {\n insert(vnode.el = createText(\"\"), container);\n } else {\n if (!isMismatchAllowed(container, 1 /* CHILDREN */)) {\n if ((!!(process.env.NODE_ENV !== \"production\") || __VUE_PROD_HYDRATION_MISMATCH_DETAILS__) && !hasWarned) {\n warn$1(\n `Hydration children mismatch on`,\n container,\n `\nServer rendered element contains fewer child nodes than client vdom.`\n );\n hasWarned = true;\n }\n logMismatchError();\n }\n patch(\n null,\n vnode,\n container,\n null,\n parentComponent,\n parentSuspense,\n getContainerType(container),\n slotScopeIds\n );\n }\n }\n return node;\n };\n const hydrateFragment = (node, vnode, parentComponent, parentSuspense, slotScopeIds, optimized) => {\n const { slotScopeIds: fragmentSlotScopeIds } = vnode;\n if (fragmentSlotScopeIds) {\n slotScopeIds = slotScopeIds ? slotScopeIds.concat(fragmentSlotScopeIds) : fragmentSlotScopeIds;\n }\n const container = parentNode(node);\n const next = hydrateChildren(\n nextSibling(node),\n vnode,\n container,\n parentComponent,\n parentSuspense,\n slotScopeIds,\n optimized\n );\n if (next && isComment(next) && next.data === \"]\") {\n return nextSibling(vnode.anchor = next);\n } else {\n logMismatchError();\n insert(vnode.anchor = createComment(`]`), container, next);\n return next;\n }\n };\n const handleMismatch = (node, vnode, parentComponent, parentSuspense, slotScopeIds, isFragment) => {\n if (!isMismatchAllowed(node.parentElement, 1 /* CHILDREN */)) {\n (!!(process.env.NODE_ENV !== \"production\") || __VUE_PROD_HYDRATION_MISMATCH_DETAILS__) && warn$1(\n `Hydration node mismatch:\n- rendered on server:`,\n node,\n node.nodeType === 3 ? `(text)` : isComment(node) && node.data === \"[\" ? `(start of fragment)` : ``,\n `\n- expected on client:`,\n vnode.type\n );\n logMismatchError();\n }\n vnode.el = null;\n if (isFragment) {\n const end = locateClosingAnchor(node);\n while (true) {\n const next2 = nextSibling(node);\n if (next2 && next2 !== end) {\n remove(next2);\n } else {\n break;\n }\n }\n }\n const next = nextSibling(node);\n const container = parentNode(node);\n remove(node);\n patch(\n null,\n vnode,\n container,\n next,\n parentComponent,\n parentSuspense,\n getContainerType(container),\n slotScopeIds\n );\n if (parentComponent) {\n parentComponent.vnode.el = vnode.el;\n updateHOCHostEl(parentComponent, vnode.el);\n }\n return next;\n };\n const locateClosingAnchor = (node, open = \"[\", close = \"]\") => {\n let match = 0;\n while (node) {\n node = nextSibling(node);\n if (node && isComment(node)) {\n if (node.data === open) match++;\n if (node.data === close) {\n if (match === 0) {\n return nextSibling(node);\n } else {\n match--;\n }\n }\n }\n }\n return node;\n };\n const replaceNode = (newNode, oldNode, parentComponent) => {\n const parentNode2 = oldNode.parentNode;\n if (parentNode2) {\n parentNode2.replaceChild(newNode, oldNode);\n }\n let parent = parentComponent;\n while (parent) {\n if (parent.vnode.el === oldNode) {\n parent.vnode.el = parent.subTree.el = newNode;\n }\n parent = parent.parent;\n }\n };\n const isTemplateNode = (node) => {\n return node.nodeType === 1 && node.tagName === \"TEMPLATE\";\n };\n return [hydrate, hydrateNode];\n}\nfunction propHasMismatch(el, key, clientValue, vnode, instance) {\n let mismatchType;\n let mismatchKey;\n let actual;\n let expected;\n if (key === \"class\") {\n if (el.$cls) {\n actual = el.$cls;\n delete el.$cls;\n } else {\n actual = el.getAttribute(\"class\");\n }\n expected = normalizeClass(clientValue);\n if (!isSetEqual(toClassSet(actual || \"\"), toClassSet(expected))) {\n mismatchType = 2 /* CLASS */;\n mismatchKey = `class`;\n }\n } else if (key === \"style\") {\n actual = el.getAttribute(\"style\") || \"\";\n expected = isString(clientValue) ? clientValue : stringifyStyle(normalizeStyle(clientValue));\n const actualMap = toStyleMap(actual);\n const expectedMap = toStyleMap(expected);\n if (vnode.dirs) {\n for (const { dir, value } of vnode.dirs) {\n if (dir.name === \"show\" && !value) {\n expectedMap.set(\"display\", \"none\");\n }\n }\n }\n if (instance) {\n resolveCssVars(instance, vnode, expectedMap);\n }\n if (!isMapEqual(actualMap, expectedMap)) {\n mismatchType = 3 /* STYLE */;\n mismatchKey = \"style\";\n }\n } else if (el instanceof SVGElement && isKnownSvgAttr(key) || el instanceof HTMLElement && (isBooleanAttr(key) || isKnownHtmlAttr(key))) {\n if (isBooleanAttr(key)) {\n actual = el.hasAttribute(key);\n expected = includeBooleanAttr(clientValue);\n } else if (clientValue == null) {\n actual = el.hasAttribute(key);\n expected = false;\n } else {\n if (el.hasAttribute(key)) {\n actual = el.getAttribute(key);\n } else if (key === \"value\" && el.tagName === \"TEXTAREA\") {\n actual = el.value;\n } else {\n actual = false;\n }\n expected = isRenderableAttrValue(clientValue) ? String(clientValue) : false;\n }\n if (actual !== expected) {\n mismatchType = 4 /* ATTRIBUTE */;\n mismatchKey = key;\n }\n }\n if (mismatchType != null && !isMismatchAllowed(el, mismatchType)) {\n const format = (v) => v === false ? `(not rendered)` : `${mismatchKey}=\"${v}\"`;\n const preSegment = `Hydration ${MismatchTypeString[mismatchType]} mismatch on`;\n const postSegment = `\n - rendered on server: ${format(actual)}\n - expected on client: ${format(expected)}\n Note: this mismatch is check-only. The DOM will not be rectified in production due to performance overhead.\n You should fix the source of the mismatch.`;\n {\n warn$1(preSegment, el, postSegment);\n }\n return true;\n }\n return false;\n}\nfunction toClassSet(str) {\n return new Set(str.trim().split(/\\s+/));\n}\nfunction isSetEqual(a, b) {\n if (a.size !== b.size) {\n return false;\n }\n for (const s of a) {\n if (!b.has(s)) {\n return false;\n }\n }\n return true;\n}\nfunction toStyleMap(str) {\n const styleMap = /* @__PURE__ */ new Map();\n for (const item of str.split(\";\")) {\n let [key, value] = item.split(\":\");\n key = key.trim();\n value = value && value.trim();\n if (key && value) {\n styleMap.set(key, value);\n }\n }\n return styleMap;\n}\nfunction isMapEqual(a, b) {\n if (a.size !== b.size) {\n return false;\n }\n for (const [key, value] of a) {\n if (value !== b.get(key)) {\n return false;\n }\n }\n return true;\n}\nfunction resolveCssVars(instance, vnode, expectedMap) {\n const root = instance.subTree;\n if (instance.getCssVars && (vnode === root || root && root.type === Fragment && root.children.includes(vnode))) {\n const cssVars = instance.getCssVars();\n for (const key in cssVars) {\n const value = normalizeCssVarValue(cssVars[key]);\n expectedMap.set(`--${getEscapedCssVarName(key, false)}`, value);\n }\n }\n if (vnode === root && instance.parent) {\n resolveCssVars(instance.parent, instance.vnode, expectedMap);\n }\n}\nconst allowMismatchAttr = \"data-allow-mismatch\";\nconst MismatchTypeString = {\n [0 /* TEXT */]: \"text\",\n [1 /* CHILDREN */]: \"children\",\n [2 /* CLASS */]: \"class\",\n [3 /* STYLE */]: \"style\",\n [4 /* ATTRIBUTE */]: \"attribute\"\n};\nfunction isMismatchAllowed(el, allowedType) {\n if (allowedType === 0 /* TEXT */ || allowedType === 1 /* CHILDREN */) {\n while (el && !el.hasAttribute(allowMismatchAttr)) {\n el = el.parentElement;\n }\n }\n const allowedAttr = el && el.getAttribute(allowMismatchAttr);\n if (allowedAttr == null) {\n return false;\n } else if (allowedAttr === \"\") {\n return true;\n } else {\n const list = allowedAttr.split(\",\");\n if (allowedType === 0 /* TEXT */ && list.includes(\"children\")) {\n return true;\n }\n return list.includes(MismatchTypeString[allowedType]);\n }\n}\n\nconst requestIdleCallback = getGlobalThis().requestIdleCallback || ((cb) => setTimeout(cb, 1));\nconst cancelIdleCallback = getGlobalThis().cancelIdleCallback || ((id) => clearTimeout(id));\nconst hydrateOnIdle = (timeout = 1e4) => (hydrate) => {\n const id = requestIdleCallback(hydrate, { timeout });\n return () => cancelIdleCallback(id);\n};\nfunction elementIsVisibleInViewport(el) {\n const { top, left, bottom, right } = el.getBoundingClientRect();\n const { innerHeight, innerWidth } = window;\n return (top > 0 && top < innerHeight || bottom > 0 && bottom < innerHeight) && (left > 0 && left < innerWidth || right > 0 && right < innerWidth);\n}\nconst hydrateOnVisible = (opts) => (hydrate, forEach) => {\n const ob = new IntersectionObserver((entries) => {\n for (const e of entries) {\n if (!e.isIntersecting) continue;\n ob.disconnect();\n hydrate();\n break;\n }\n }, opts);\n forEach((el) => {\n if (!(el instanceof Element)) return;\n if (elementIsVisibleInViewport(el)) {\n hydrate();\n ob.disconnect();\n return false;\n }\n ob.observe(el);\n });\n return () => ob.disconnect();\n};\nconst hydrateOnMediaQuery = (query) => (hydrate) => {\n if (query) {\n const mql = matchMedia(query);\n if (mql.matches) {\n hydrate();\n } else {\n mql.addEventListener(\"change\", hydrate, { once: true });\n return () => mql.removeEventListener(\"change\", hydrate);\n }\n }\n};\nconst hydrateOnInteraction = (interactions = []) => (hydrate, forEach) => {\n if (isString(interactions)) interactions = [interactions];\n let hasHydrated = false;\n const doHydrate = (e) => {\n if (!hasHydrated) {\n hasHydrated = true;\n teardown();\n hydrate();\n e.target.dispatchEvent(new e.constructor(e.type, e));\n }\n };\n const teardown = () => {\n forEach((el) => {\n for (const i of interactions) {\n el.removeEventListener(i, doHydrate);\n }\n });\n };\n forEach((el) => {\n for (const i of interactions) {\n el.addEventListener(i, doHydrate, { once: true });\n }\n });\n return teardown;\n};\nfunction forEachElement(node, cb) {\n if (isComment(node) && node.data === \"[\") {\n let depth = 1;\n let next = node.nextSibling;\n while (next) {\n if (next.nodeType === 1) {\n const result = cb(next);\n if (result === false) {\n break;\n }\n } else if (isComment(next)) {\n if (next.data === \"]\") {\n if (--depth === 0) break;\n } else if (next.data === \"[\") {\n depth++;\n }\n }\n next = next.nextSibling;\n }\n } else {\n cb(node);\n }\n}\n\nconst isAsyncWrapper = (i) => !!i.type.__asyncLoader;\n// @__NO_SIDE_EFFECTS__\nfunction defineAsyncComponent(source) {\n if (isFunction(source)) {\n source = { loader: source };\n }\n const {\n loader,\n loadingComponent,\n errorComponent,\n delay = 200,\n hydrate: hydrateStrategy,\n timeout,\n // undefined = never times out\n suspensible = true,\n onError: userOnError\n } = source;\n let pendingRequest = null;\n let resolvedComp;\n let retries = 0;\n const retry = () => {\n retries++;\n pendingRequest = null;\n return load();\n };\n const load = () => {\n let thisRequest;\n return pendingRequest || (thisRequest = pendingRequest = loader().catch((err) => {\n err = err instanceof Error ? err : new Error(String(err));\n if (userOnError) {\n return new Promise((resolve, reject) => {\n const userRetry = () => resolve(retry());\n const userFail = () => reject(err);\n userOnError(err, userRetry, userFail, retries + 1);\n });\n } else {\n throw err;\n }\n }).then((comp) => {\n if (thisRequest !== pendingRequest && pendingRequest) {\n return pendingRequest;\n }\n if (!!(process.env.NODE_ENV !== \"production\") && !comp) {\n warn$1(\n `Async component loader resolved to undefined. If you are using retry(), make sure to return its return value.`\n );\n }\n if (comp && (comp.__esModule || comp[Symbol.toStringTag] === \"Module\")) {\n comp = comp.default;\n }\n if (!!(process.env.NODE_ENV !== \"production\") && comp && !isObject(comp) && !isFunction(comp)) {\n throw new Error(`Invalid async component load result: ${comp}`);\n }\n resolvedComp = comp;\n return comp;\n }));\n };\n return defineComponent({\n name: \"AsyncComponentWrapper\",\n __asyncLoader: load,\n __asyncHydrate(el, instance, hydrate) {\n let patched = false;\n (instance.bu || (instance.bu = [])).push(() => patched = true);\n const performHydrate = () => {\n if (patched) {\n if (!!(process.env.NODE_ENV !== \"production\")) {\n warn$1(\n `Skipping lazy hydration for component '${getComponentName(resolvedComp) || resolvedComp.__file}': it was updated before lazy hydration performed.`\n );\n }\n return;\n }\n hydrate();\n };\n const doHydrate = hydrateStrategy ? () => {\n const teardown = hydrateStrategy(\n performHydrate,\n (cb) => forEachElement(el, cb)\n );\n if (teardown) {\n (instance.bum || (instance.bum = [])).push(teardown);\n }\n } : performHydrate;\n if (resolvedComp) {\n doHydrate();\n } else {\n load().then(() => !instance.isUnmounted && doHydrate());\n }\n },\n get __asyncResolved() {\n return resolvedComp;\n },\n setup() {\n const instance = currentInstance;\n markAsyncBoundary(instance);\n if (resolvedComp) {\n return () => createInnerComp(resolvedComp, instance);\n }\n const onError = (err) => {\n pendingRequest = null;\n handleError(\n err,\n instance,\n 13,\n !errorComponent\n );\n };\n if (suspensible && instance.suspense || isInSSRComponentSetup) {\n return load().then((comp) => {\n return () => createInnerComp(comp, instance);\n }).catch((err) => {\n onError(err);\n return () => errorComponent ? createVNode(errorComponent, {\n error: err\n }) : null;\n });\n }\n const loaded = ref(false);\n const error = ref();\n const delayed = ref(!!delay);\n if (delay) {\n setTimeout(() => {\n delayed.value = false;\n }, delay);\n }\n if (timeout != null) {\n setTimeout(() => {\n if (!loaded.value && !error.value) {\n const err = new Error(\n `Async component timed out after ${timeout}ms.`\n );\n onError(err);\n error.value = err;\n }\n }, timeout);\n }\n load().then(() => {\n loaded.value = true;\n if (instance.parent && isKeepAlive(instance.parent.vnode)) {\n instance.parent.update();\n }\n }).catch((err) => {\n onError(err);\n error.value = err;\n });\n return () => {\n if (loaded.value && resolvedComp) {\n return createInnerComp(resolvedComp, instance);\n } else if (error.value && errorComponent) {\n return createVNode(errorComponent, {\n error: error.value\n });\n } else if (loadingComponent && !delayed.value) {\n return createInnerComp(\n loadingComponent,\n instance\n );\n }\n };\n }\n });\n}\nfunction createInnerComp(comp, parent) {\n const { ref: ref2, props, children, ce } = parent.vnode;\n const vnode = createVNode(comp, props, children);\n vnode.ref = ref2;\n vnode.ce = ce;\n delete parent.vnode.ce;\n return vnode;\n}\n\nconst isKeepAlive = (vnode) => vnode.type.__isKeepAlive;\nconst KeepAliveImpl = {\n name: `KeepAlive`,\n // Marker for special handling inside the renderer. We are not using a ===\n // check directly on KeepAlive in the renderer, because importing it directly\n // would prevent it from being tree-shaken.\n __isKeepAlive: true,\n props: {\n include: [String, RegExp, Array],\n exclude: [String, RegExp, Array],\n max: [String, Number]\n },\n setup(props, { slots }) {\n const instance = getCurrentInstance();\n const sharedContext = instance.ctx;\n if (!sharedContext.renderer) {\n return () => {\n const children = slots.default && slots.default();\n return children && children.length === 1 ? children[0] : children;\n };\n }\n const cache = /* @__PURE__ */ new Map();\n const keys = /* @__PURE__ */ new Set();\n let current = null;\n if (!!(process.env.NODE_ENV !== \"production\") || __VUE_PROD_DEVTOOLS__) {\n instance.__v_cache = cache;\n }\n const parentSuspense = instance.suspense;\n const {\n renderer: {\n p: patch,\n m: move,\n um: _unmount,\n o: { createElement }\n }\n } = sharedContext;\n const storageContainer = createElement(\"div\");\n sharedContext.activate = (vnode, container, anchor, namespace, optimized) => {\n const instance2 = vnode.component;\n move(vnode, container, anchor, 0, parentSuspense);\n patch(\n instance2.vnode,\n vnode,\n container,\n anchor,\n instance2,\n parentSuspense,\n namespace,\n vnode.slotScopeIds,\n optimized\n );\n queuePostRenderEffect(() => {\n instance2.isDeactivated = false;\n if (instance2.a) {\n invokeArrayFns(instance2.a);\n }\n const vnodeHook = vnode.props && vnode.props.onVnodeMounted;\n if (vnodeHook) {\n invokeVNodeHook(vnodeHook, instance2.parent, vnode);\n }\n }, parentSuspense);\n if (!!(process.env.NODE_ENV !== \"production\") || __VUE_PROD_DEVTOOLS__) {\n devtoolsComponentAdded(instance2);\n }\n };\n sharedContext.deactivate = (vnode) => {\n const instance2 = vnode.component;\n invalidateMount(instance2.m);\n invalidateMount(instance2.a);\n move(vnode, storageContainer, null, 1, parentSuspense);\n queuePostRenderEffect(() => {\n if (instance2.da) {\n invokeArrayFns(instance2.da);\n }\n const vnodeHook = vnode.props && vnode.props.onVnodeUnmounted;\n if (vnodeHook) {\n invokeVNodeHook(vnodeHook, instance2.parent, vnode);\n }\n instance2.isDeactivated = true;\n }, parentSuspense);\n if (!!(process.env.NODE_ENV !== \"production\") || __VUE_PROD_DEVTOOLS__) {\n devtoolsComponentAdded(instance2);\n }\n if (!!(process.env.NODE_ENV !== \"production\") && true) {\n instance2.__keepAliveStorageContainer = storageContainer;\n }\n };\n function unmount(vnode) {\n resetShapeFlag(vnode);\n _unmount(vnode, instance, parentSuspense, true);\n }\n function pruneCache(filter) {\n cache.forEach((vnode, key) => {\n const name = getComponentName(\n isAsyncWrapper(vnode) ? vnode.type.__asyncResolved || {} : vnode.type\n );\n if (name && !filter(name)) {\n pruneCacheEntry(key);\n }\n });\n }\n function pruneCacheEntry(key) {\n const cached = cache.get(key);\n if (cached && (!current || !isSameVNodeType(cached, current))) {\n unmount(cached);\n } else if (current) {\n resetShapeFlag(current);\n }\n cache.delete(key);\n keys.delete(key);\n }\n watch(\n () => [props.include, props.exclude],\n ([include, exclude]) => {\n include && pruneCache((name) => matches(include, name));\n exclude && pruneCache((name) => !matches(exclude, name));\n },\n // prune post-render after `current` has been updated\n { flush: \"post\", deep: true }\n );\n let pendingCacheKey = null;\n const cacheSubtree = () => {\n if (pendingCacheKey != null) {\n if (isSuspense(instance.subTree.type)) {\n queuePostRenderEffect(() => {\n cache.set(pendingCacheKey, getInnerChild(instance.subTree));\n }, instance.subTree.suspense);\n } else {\n cache.set(pendingCacheKey, getInnerChild(instance.subTree));\n }\n }\n };\n onMounted(cacheSubtree);\n onUpdated(cacheSubtree);\n onBeforeUnmount(() => {\n cache.forEach((cached) => {\n const { subTree, suspense } = instance;\n const vnode = getInnerChild(subTree);\n if (cached.type === vnode.type && cached.key === vnode.key) {\n resetShapeFlag(vnode);\n const da = vnode.component.da;\n da && queuePostRenderEffect(da, suspense);\n return;\n }\n unmount(cached);\n });\n });\n return () => {\n pendingCacheKey = null;\n if (!slots.default) {\n return current = null;\n }\n const children = slots.default();\n const rawVNode = children[0];\n if (children.length > 1) {\n if (!!(process.env.NODE_ENV !== \"production\")) {\n warn$1(`KeepAlive should contain exactly one component child.`);\n }\n current = null;\n return children;\n } else if (!isVNode(rawVNode) || !(rawVNode.shapeFlag & 4) && !(rawVNode.shapeFlag & 128)) {\n current = null;\n return rawVNode;\n }\n let vnode = getInnerChild(rawVNode);\n if (vnode.type === Comment) {\n current = null;\n return vnode;\n }\n const comp = vnode.type;\n const name = getComponentName(\n isAsyncWrapper(vnode) ? vnode.type.__asyncResolved || {} : comp\n );\n const { include, exclude, max } = props;\n if (include && (!name || !matches(include, name)) || exclude && name && matches(exclude, name)) {\n vnode.shapeFlag &= -257;\n current = vnode;\n return rawVNode;\n }\n const key = vnode.key == null ? comp : vnode.key;\n const cachedVNode = cache.get(key);\n if (vnode.el) {\n vnode = cloneVNode(vnode);\n if (rawVNode.shapeFlag & 128) {\n rawVNode.ssContent = vnode;\n }\n }\n pendingCacheKey = key;\n if (cachedVNode) {\n vnode.el = cachedVNode.el;\n vnode.component = cachedVNode.component;\n if (vnode.transition) {\n setTransitionHooks(vnode, vnode.transition);\n }\n vnode.shapeFlag |= 512;\n keys.delete(key);\n keys.add(key);\n } else {\n keys.add(key);\n if (max && keys.size > parseInt(max, 10)) {\n pruneCacheEntry(keys.values().next().value);\n }\n }\n vnode.shapeFlag |= 256;\n current = vnode;\n return isSuspense(rawVNode.type) ? rawVNode : vnode;\n };\n }\n};\nconst KeepAlive = KeepAliveImpl;\nfunction matches(pattern, name) {\n if (isArray(pattern)) {\n return pattern.some((p) => matches(p, name));\n } else if (isString(pattern)) {\n return pattern.split(\",\").includes(name);\n } else if (isRegExp(pattern)) {\n pattern.lastIndex = 0;\n return pattern.test(name);\n }\n return false;\n}\nfunction onActivated(hook, target) {\n registerKeepAliveHook(hook, \"a\", target);\n}\nfunction onDeactivated(hook, target) {\n registerKeepAliveHook(hook, \"da\", target);\n}\nfunction registerKeepAliveHook(hook, type, target = currentInstance) {\n const wrappedHook = hook.__wdc || (hook.__wdc = () => {\n let current = target;\n while (current) {\n if (current.isDeactivated) {\n return;\n }\n current = current.parent;\n }\n return hook();\n });\n injectHook(type, wrappedHook, target);\n if (target) {\n let current = target.parent;\n while (current && current.parent) {\n if (isKeepAlive(current.parent.vnode)) {\n injectToKeepAliveRoot(wrappedHook, type, target, current);\n }\n current = current.parent;\n }\n }\n}\nfunction injectToKeepAliveRoot(hook, type, target, keepAliveRoot) {\n const injected = injectHook(\n type,\n hook,\n keepAliveRoot,\n true\n /* prepend */\n );\n onUnmounted(() => {\n remove(keepAliveRoot[type], injected);\n }, target);\n}\nfunction resetShapeFlag(vnode) {\n vnode.shapeFlag &= -257;\n vnode.shapeFlag &= -513;\n}\nfunction getInnerChild(vnode) {\n return vnode.shapeFlag & 128 ? vnode.ssContent : vnode;\n}\n\nfunction injectHook(type, hook, target = currentInstance, prepend = false) {\n if (target) {\n const hooks = target[type] || (target[type] = []);\n const wrappedHook = hook.__weh || (hook.__weh = (...args) => {\n pauseTracking();\n const reset = setCurrentInstance(target);\n const res = callWithAsyncErrorHandling(hook, target, type, args);\n reset();\n resetTracking();\n return res;\n });\n if (prepend) {\n hooks.unshift(wrappedHook);\n } else {\n hooks.push(wrappedHook);\n }\n return wrappedHook;\n } else if (!!(process.env.NODE_ENV !== \"production\")) {\n const apiName = toHandlerKey(ErrorTypeStrings$1[type].replace(/ hook$/, \"\"));\n warn$1(\n `${apiName} is called when there is no active component instance to be associated with. Lifecycle injection APIs can only be used during execution of setup().` + (` If you are using async setup(), make sure to register lifecycle hooks before the first await statement.` )\n );\n }\n}\nconst createHook = (lifecycle) => (hook, target = currentInstance) => {\n if (!isInSSRComponentSetup || lifecycle === \"sp\") {\n injectHook(lifecycle, (...args) => hook(...args), target);\n }\n};\nconst onBeforeMount = createHook(\"bm\");\nconst onMounted = createHook(\"m\");\nconst onBeforeUpdate = createHook(\n \"bu\"\n);\nconst onUpdated = createHook(\"u\");\nconst onBeforeUnmount = createHook(\n \"bum\"\n);\nconst onUnmounted = createHook(\"um\");\nconst onServerPrefetch = createHook(\n \"sp\"\n);\nconst onRenderTriggered = createHook(\"rtg\");\nconst onRenderTracked = createHook(\"rtc\");\nfunction onErrorCaptured(hook, target = currentInstance) {\n injectHook(\"ec\", hook, target);\n}\n\nconst COMPONENTS = \"components\";\nconst DIRECTIVES = \"directives\";\nfunction resolveComponent(name, maybeSelfReference) {\n return resolveAsset(COMPONENTS, name, true, maybeSelfReference) || name;\n}\nconst NULL_DYNAMIC_COMPONENT = /* @__PURE__ */ Symbol.for(\"v-ndc\");\nfunction resolveDynamicComponent(component) {\n if (isString(component)) {\n return resolveAsset(COMPONENTS, component, false) || component;\n } else {\n return component || NULL_DYNAMIC_COMPONENT;\n }\n}\nfunction resolveDirective(name) {\n return resolveAsset(DIRECTIVES, name);\n}\nfunction resolveAsset(type, name, warnMissing = true, maybeSelfReference = false) {\n const instance = currentRenderingInstance || currentInstance;\n if (instance) {\n const Component = instance.type;\n if (type === COMPONENTS) {\n const selfName = getComponentName(\n Component,\n false\n );\n if (selfName && (selfName === name || selfName === camelize(name) || selfName === capitalize(camelize(name)))) {\n return Component;\n }\n }\n const res = (\n // local registration\n // check instance[type] first which is resolved for options API\n resolve(instance[type] || Component[type], name) || // global registration\n resolve(instance.appContext[type], name)\n );\n if (!res && maybeSelfReference) {\n return Component;\n }\n if (!!(process.env.NODE_ENV !== \"production\") && warnMissing && !res) {\n const extra = type === COMPONENTS ? `\nIf this is a native custom element, make sure to exclude it from component resolution via compilerOptions.isCustomElement.` : ``;\n warn$1(`Failed to resolve ${type.slice(0, -1)}: ${name}${extra}`);\n }\n return res;\n } else if (!!(process.env.NODE_ENV !== \"production\")) {\n warn$1(\n `resolve${capitalize(type.slice(0, -1))} can only be used in render() or setup().`\n );\n }\n}\nfunction resolve(registry, name) {\n return registry && (registry[name] || registry[camelize(name)] || registry[capitalize(camelize(name))]);\n}\n\nfunction renderList(source, renderItem, cache, index) {\n let ret;\n const cached = cache && cache[index];\n const sourceIsArray = isArray(source);\n if (sourceIsArray || isString(source)) {\n const sourceIsReactiveArray = sourceIsArray && isReactive(source);\n let needsWrap = false;\n let isReadonlySource = false;\n if (sourceIsReactiveArray) {\n needsWrap = !isShallow(source);\n isReadonlySource = isReadonly(source);\n source = shallowReadArray(source);\n }\n ret = new Array(source.length);\n for (let i = 0, l = source.length; i < l; i++) {\n ret[i] = renderItem(\n needsWrap ? isReadonlySource ? toReadonly(toReactive(source[i])) : toReactive(source[i]) : source[i],\n i,\n void 0,\n cached && cached[i]\n );\n }\n } else if (typeof source === \"number\") {\n if (!!(process.env.NODE_ENV !== \"production\") && !Number.isInteger(source)) {\n warn$1(`The v-for range expect an integer value but got ${source}.`);\n }\n ret = new Array(source);\n for (let i = 0; i < source; i++) {\n ret[i] = renderItem(i + 1, i, void 0, cached && cached[i]);\n }\n } else if (isObject(source)) {\n if (source[Symbol.iterator]) {\n ret = Array.from(\n source,\n (item, i) => renderItem(item, i, void 0, cached && cached[i])\n );\n } else {\n const keys = Object.keys(source);\n ret = new Array(keys.length);\n for (let i = 0, l = keys.length; i < l; i++) {\n const key = keys[i];\n ret[i] = renderItem(source[key], key, i, cached && cached[i]);\n }\n }\n } else {\n ret = [];\n }\n if (cache) {\n cache[index] = ret;\n }\n return ret;\n}\n\nfunction createSlots(slots, dynamicSlots) {\n for (let i = 0; i < dynamicSlots.length; i++) {\n const slot = dynamicSlots[i];\n if (isArray(slot)) {\n for (let j = 0; j < slot.length; j++) {\n slots[slot[j].name] = slot[j].fn;\n }\n } else if (slot) {\n slots[slot.name] = slot.key ? (...args) => {\n const res = slot.fn(...args);\n if (res) res.key = slot.key;\n return res;\n } : slot.fn;\n }\n }\n return slots;\n}\n\nfunction renderSlot(slots, name, props = {}, fallback, noSlotted) {\n if (currentRenderingInstance.ce || currentRenderingInstance.parent && isAsyncWrapper(currentRenderingInstance.parent) && currentRenderingInstance.parent.ce) {\n const hasProps = Object.keys(props).length > 0;\n if (name !== \"default\") props.name = name;\n return openBlock(), createBlock(\n Fragment,\n null,\n [createVNode(\"slot\", props, fallback && fallback())],\n hasProps ? -2 : 64\n );\n }\n let slot = slots[name];\n if (!!(process.env.NODE_ENV !== \"production\") && slot && slot.length > 1) {\n warn$1(\n `SSR-optimized slot function detected in a non-SSR-optimized render function. You need to mark this component with $dynamic-slots in the parent template.`\n );\n slot = () => [];\n }\n if (slot && slot._c) {\n slot._d = false;\n }\n openBlock();\n const validSlotContent = slot && ensureValidVNode(slot(props));\n const slotKey = props.key || // slot content array of a dynamic conditional slot may have a branch\n // key attached in the `createSlots` helper, respect that\n validSlotContent && validSlotContent.key;\n const rendered = createBlock(\n Fragment,\n {\n key: (slotKey && !isSymbol(slotKey) ? slotKey : `_${name}`) + // #7256 force differentiate fallback content from actual content\n (!validSlotContent && fallback ? \"_fb\" : \"\")\n },\n validSlotContent || (fallback ? fallback() : []),\n validSlotContent && slots._ === 1 ? 64 : -2\n );\n if (!noSlotted && rendered.scopeId) {\n rendered.slotScopeIds = [rendered.scopeId + \"-s\"];\n }\n if (slot && slot._c) {\n slot._d = true;\n }\n return rendered;\n}\nfunction ensureValidVNode(vnodes) {\n return vnodes.some((child) => {\n if (!isVNode(child)) return true;\n if (child.type === Comment) return false;\n if (child.type === Fragment && !ensureValidVNode(child.children))\n return false;\n return true;\n }) ? vnodes : null;\n}\n\nfunction toHandlers(obj, preserveCaseIfNecessary) {\n const ret = {};\n if (!!(process.env.NODE_ENV !== \"production\") && !isObject(obj)) {\n warn$1(`v-on with no argument expects an object value.`);\n return ret;\n }\n for (const key in obj) {\n ret[preserveCaseIfNecessary && /[A-Z]/.test(key) ? `on:${key}` : toHandlerKey(key)] = obj[key];\n }\n return ret;\n}\n\nconst getPublicInstance = (i) => {\n if (!i) return null;\n if (isStatefulComponent(i)) return getComponentPublicInstance(i);\n return getPublicInstance(i.parent);\n};\nconst publicPropertiesMap = (\n // Move PURE marker to new line to workaround compiler discarding it\n // due to type annotation\n /* @__PURE__ */ extend(/* @__PURE__ */ Object.create(null), {\n $: (i) => i,\n $el: (i) => i.vnode.el,\n $data: (i) => i.data,\n $props: (i) => !!(process.env.NODE_ENV !== \"production\") ? shallowReadonly(i.props) : i.props,\n $attrs: (i) => !!(process.env.NODE_ENV !== \"production\") ? shallowReadonly(i.attrs) : i.attrs,\n $slots: (i) => !!(process.env.NODE_ENV !== \"production\") ? shallowReadonly(i.slots) : i.slots,\n $refs: (i) => !!(process.env.NODE_ENV !== \"production\") ? shallowReadonly(i.refs) : i.refs,\n $parent: (i) => getPublicInstance(i.parent),\n $root: (i) => getPublicInstance(i.root),\n $host: (i) => i.ce,\n $emit: (i) => i.emit,\n $options: (i) => __VUE_OPTIONS_API__ ? resolveMergedOptions(i) : i.type,\n $forceUpdate: (i) => i.f || (i.f = () => {\n queueJob(i.update);\n }),\n $nextTick: (i) => i.n || (i.n = nextTick.bind(i.proxy)),\n $watch: (i) => __VUE_OPTIONS_API__ ? instanceWatch.bind(i) : NOOP\n })\n);\nconst isReservedPrefix = (key) => key === \"_\" || key === \"$\";\nconst hasSetupBinding = (state, key) => state !== EMPTY_OBJ && !state.__isScriptSetup && hasOwn(state, key);\nconst PublicInstanceProxyHandlers = {\n get({ _: instance }, key) {\n if (key === \"__v_skip\") {\n return true;\n }\n const { ctx, setupState, data, props, accessCache, type, appContext } = instance;\n if (!!(process.env.NODE_ENV !== \"production\") && key === \"__isVue\") {\n return true;\n }\n if (key[0] !== \"$\") {\n const n = accessCache[key];\n if (n !== void 0) {\n switch (n) {\n case 1 /* SETUP */:\n return setupState[key];\n case 2 /* DATA */:\n return data[key];\n case 4 /* CONTEXT */:\n return ctx[key];\n case 3 /* PROPS */:\n return props[key];\n }\n } else if (hasSetupBinding(setupState, key)) {\n accessCache[key] = 1 /* SETUP */;\n return setupState[key];\n } else if (__VUE_OPTIONS_API__ && data !== EMPTY_OBJ && hasOwn(data, key)) {\n accessCache[key] = 2 /* DATA */;\n return data[key];\n } else if (hasOwn(props, key)) {\n accessCache[key] = 3 /* PROPS */;\n return props[key];\n } else if (ctx !== EMPTY_OBJ && hasOwn(ctx, key)) {\n accessCache[key] = 4 /* CONTEXT */;\n return ctx[key];\n } else if (!__VUE_OPTIONS_API__ || shouldCacheAccess) {\n accessCache[key] = 0 /* OTHER */;\n }\n }\n const publicGetter = publicPropertiesMap[key];\n let cssModule, globalProperties;\n if (publicGetter) {\n if (key === \"$attrs\") {\n track(instance.attrs, \"get\", \"\");\n !!(process.env.NODE_ENV !== \"production\") && markAttrsAccessed();\n } else if (!!(process.env.NODE_ENV !== \"production\") && key === \"$slots\") {\n track(instance, \"get\", key);\n }\n return publicGetter(instance);\n } else if (\n // css module (injected by vue-loader)\n (cssModule = type.__cssModules) && (cssModule = cssModule[key])\n ) {\n return cssModule;\n } else if (ctx !== EMPTY_OBJ && hasOwn(ctx, key)) {\n accessCache[key] = 4 /* CONTEXT */;\n return ctx[key];\n } else if (\n // global properties\n globalProperties = appContext.config.globalProperties, hasOwn(globalProperties, key)\n ) {\n {\n return globalProperties[key];\n }\n } else if (!!(process.env.NODE_ENV !== \"production\") && currentRenderingInstance && (!isString(key) || // #1091 avoid internal isRef/isVNode checks on component instance leading\n // to infinite warning loop\n key.indexOf(\"__v\") !== 0)) {\n if (data !== EMPTY_OBJ && isReservedPrefix(key[0]) && hasOwn(data, key)) {\n warn$1(\n `Property ${JSON.stringify(\n key\n )} must be accessed via $data because it starts with a reserved character (\"$\" or \"_\") and is not proxied on the render context.`\n );\n } else if (instance === currentRenderingInstance) {\n warn$1(\n `Property ${JSON.stringify(key)} was accessed during render but is not defined on instance.`\n );\n }\n }\n },\n set({ _: instance }, key, value) {\n const { data, setupState, ctx } = instance;\n if (hasSetupBinding(setupState, key)) {\n setupState[key] = value;\n return true;\n } else if (!!(process.env.NODE_ENV !== \"production\") && setupState.__isScriptSetup && hasOwn(setupState, key)) {\n warn$1(`Cannot mutate \n\n\n","\n\n\n\n\n","\n\n\n\n\n","\n\n\n\n\n","\n\n\n\n\n","\n\n\n\n\n","\n\n\n\n\n","\n\n\n\n\n","\n\n\n\n\n","\n\n\n\n\n","\n\n\n\n\n","\n\n\n\n\n","\n\n\n\n\n","\n\n\n\n\n","export function getLmBasePath(): string {\n const { pathname } = window.location;\n return pathname.endsWith('/') ? pathname.slice(0, -1) : pathname;\n}\n\nexport function lmApiUrl(path: string): string {\n return `${getLmBasePath()}${path}`;\n}\n","import { ref } from 'vue'\nimport type { BaseModelOption, TagOption, FolderTreeNode, LoraItem } from './types'\nimport { lmApiUrl } from '@/utils/basePath'\n\nexport function useLoraPoolApi() {\n const isLoading = ref(false)\n\n const fetchBaseModels = async (limit = 50): Promise => {\n try {\n const response = await fetch(lmApiUrl(`/api/lm/loras/base-models?limit=${limit}`))\n const data = await response.json()\n return data.base_models || []\n } catch (error) {\n console.error('[LoraPoolApi] Failed to fetch base models:', error)\n return []\n }\n }\n\n const fetchTags = async (limit = 0): Promise => {\n try {\n const response = await fetch(lmApiUrl(`/api/lm/loras/top-tags?limit=${limit}`))\n const data = await response.json()\n return data.tags || []\n } catch (error) {\n console.error('[LoraPoolApi] Failed to fetch tags:', error)\n return []\n }\n }\n\n const fetchFolderTree = async (): Promise => {\n try {\n const response = await fetch(lmApiUrl('/api/lm/loras/unified-folder-tree'))\n const data = await response.json()\n return transformFolderTree(data.tree || {})\n } catch (error) {\n console.error('[LoraPoolApi] Failed to fetch folder tree:', error)\n return []\n }\n }\n\n const transformFolderTree = (tree: Record, parentPath = ''): FolderTreeNode[] => {\n if (!tree || typeof tree !== 'object') {\n return []\n }\n\n return Object.entries(tree).map(([name, children]) => {\n const path = parentPath ? `${parentPath}/${name}` : name\n const childNodes = transformFolderTree(children as Record, path)\n\n return {\n key: path,\n label: name,\n children: childNodes.length > 0 ? childNodes : undefined\n }\n })\n }\n\n interface FetchLorasParams {\n baseModels?: string[]\n tagsInclude?: string[]\n tagsExclude?: string[]\n foldersInclude?: string[]\n foldersExclude?: string[]\n noCreditRequired?: boolean\n allowSelling?: boolean\n namePatternsInclude?: string[]\n namePatternsExclude?: string[]\n namePatternsUseRegex?: boolean\n page?: number\n pageSize?: number\n }\n\n const fetchLoras = async (params: FetchLorasParams): Promise<{ items: LoraItem[]; total: number }> => {\n isLoading.value = true\n try {\n const urlParams = new URLSearchParams()\n urlParams.set('page', String(params.page || 1))\n urlParams.set('page_size', String(params.pageSize || 6))\n\n params.baseModels?.forEach(bm => urlParams.append('base_model', bm))\n params.tagsInclude?.forEach(tag => urlParams.append('tag_include', tag))\n params.tagsExclude?.forEach(tag => urlParams.append('tag_exclude', tag))\n\n // Folder filters\n if (params.foldersInclude && params.foldersInclude.length > 0) {\n params.foldersInclude.forEach(folder => urlParams.append('folder_include', folder))\n urlParams.set('recursive', 'true')\n }\n params.foldersExclude?.forEach(folder => urlParams.append('folder_exclude', folder))\n\n if (params.noCreditRequired !== undefined) {\n urlParams.set('credit_required', String(!params.noCreditRequired))\n }\n\n if (params.allowSelling !== undefined) {\n urlParams.set('allow_selling_generated_content', String(params.allowSelling))\n }\n\n // Name pattern filters\n params.namePatternsInclude?.forEach(pattern => urlParams.append('name_pattern_include', pattern))\n params.namePatternsExclude?.forEach(pattern => urlParams.append('name_pattern_exclude', pattern))\n if (params.namePatternsUseRegex !== undefined) {\n urlParams.set('name_pattern_use_regex', String(params.namePatternsUseRegex))\n }\n\n const response = await fetch(lmApiUrl(`/api/lm/loras/list?${urlParams}`))\n const data = await response.json()\n\n return {\n items: data.items || [],\n total: data.total || 0\n }\n } catch (error) {\n console.error('[LoraPoolApi] Failed to fetch loras:', error)\n return { items: [], total: 0 }\n } finally {\n isLoading.value = false\n }\n }\n\n return {\n isLoading,\n fetchBaseModels,\n fetchTags,\n fetchFolderTree,\n fetchLoras\n }\n}\n","import { ref, computed, watch } from 'vue'\nimport type {\n LoraPoolConfig,\n BaseModelOption,\n TagOption,\n FolderTreeNode,\n LoraItem,\n ComponentWidget\n} from './types'\nimport { useLoraPoolApi } from './useLoraPoolApi'\n\nexport function useLoraPoolState(widget: ComponentWidget) {\n const api = useLoraPoolApi()\n\n // Flag to prevent infinite loops during config restoration\n // callback → restoreFromConfig → watch → refreshPreview → buildConfig → widget.value = config → callback → ...\n let isRestoring = false\n\n // Filter state\n const selectedBaseModels = ref([])\n const includeTags = ref([])\n const excludeTags = ref([])\n const includeFolders = ref([])\n const excludeFolders = ref([])\n const noCreditRequired = ref(false)\n const allowSelling = ref(false)\n const includePatterns = ref([])\n const excludePatterns = ref([])\n const useRegex = ref(false)\n\n // Available options from API\n const availableBaseModels = ref([])\n const availableTags = ref([])\n const folderTree = ref([])\n\n // Preview state\n const previewItems = ref([])\n const matchCount = ref(0)\n const isLoading = computed(() => api.isLoading.value)\n\n // Build config from current state\n const buildConfig = (): LoraPoolConfig => {\n const config: LoraPoolConfig = {\n version: 2,\n filters: {\n baseModels: selectedBaseModels.value,\n tags: {\n include: includeTags.value,\n exclude: excludeTags.value\n },\n folders: {\n include: includeFolders.value,\n exclude: excludeFolders.value\n },\n license: {\n noCreditRequired: noCreditRequired.value,\n allowSelling: allowSelling.value\n },\n namePatterns: {\n include: includePatterns.value,\n exclude: excludePatterns.value,\n useRegex: useRegex.value\n }\n },\n preview: {\n matchCount: matchCount.value,\n lastUpdated: Date.now()\n }\n }\n\n // Update widget value (this triggers callback for UI sync)\n // Skip during restoration to prevent infinite loops:\n // callback → restoreFromConfig → watch → refreshPreview → buildConfig → widget.value = config → callback → ...\n if (!isRestoring) {\n widget.value = config\n }\n return config\n }\n\n // Restore state from config\n const restoreFromConfig = (config: LoraPoolConfig) => {\n // Set flag to prevent buildConfig from triggering widget.value updates during restoration\n // This breaks the infinite loop: callback → restoreFromConfig → watch → refreshPreview → buildConfig → widget.value = config → callback\n isRestoring = true\n\n try {\n if (!config?.filters) return\n\n const { filters, preview } = config\n\n // Helper to update ref only if value changed\n const updateIfChanged = (refValue: { value: T }, newValue: T) => {\n if (JSON.stringify(refValue.value) !== JSON.stringify(newValue)) {\n refValue.value = newValue\n }\n }\n\n updateIfChanged(selectedBaseModels, filters.baseModels || [])\n updateIfChanged(includeTags, filters.tags?.include || [])\n updateIfChanged(excludeTags, filters.tags?.exclude || [])\n updateIfChanged(includeFolders, filters.folders?.include || [])\n updateIfChanged(excludeFolders, filters.folders?.exclude || [])\n updateIfChanged(noCreditRequired, filters.license?.noCreditRequired ?? false)\n updateIfChanged(allowSelling, filters.license?.allowSelling ?? false)\n updateIfChanged(includePatterns, filters.namePatterns?.include || [])\n updateIfChanged(excludePatterns, filters.namePatterns?.exclude || [])\n updateIfChanged(useRegex, filters.namePatterns?.useRegex ?? false)\n\n // matchCount doesn't trigger watchers, so direct assignment is fine\n matchCount.value = preview?.matchCount || 0\n } finally {\n isRestoring = false\n }\n }\n\n // Fetch filter options from API\n const fetchFilterOptions = async () => {\n const [baseModels, tags, folders] = await Promise.all([\n api.fetchBaseModels(),\n api.fetchTags(),\n api.fetchFolderTree()\n ])\n\n availableBaseModels.value = baseModels\n availableTags.value = tags\n folderTree.value = folders\n }\n\n // Refresh preview with current filters\n const refreshPreview = async () => {\n const result = await api.fetchLoras({\n baseModels: selectedBaseModels.value,\n tagsInclude: includeTags.value,\n tagsExclude: excludeTags.value,\n foldersInclude: includeFolders.value,\n foldersExclude: excludeFolders.value,\n noCreditRequired: noCreditRequired.value || undefined,\n allowSelling: allowSelling.value || undefined,\n namePatternsInclude: includePatterns.value,\n namePatternsExclude: excludePatterns.value,\n namePatternsUseRegex: useRegex.value,\n pageSize: 6\n })\n\n previewItems.value = result.items\n matchCount.value = result.total\n buildConfig()\n }\n\n // Debounced filter change handler\n let filterTimeout: ReturnType | null = null\n const onFilterChange = () => {\n if (filterTimeout) clearTimeout(filterTimeout)\n filterTimeout = setTimeout(() => {\n refreshPreview()\n }, 300)\n }\n\n // Watch all filter changes\n watch([\n selectedBaseModels,\n includeTags,\n excludeTags,\n includeFolders,\n excludeFolders,\n noCreditRequired,\n allowSelling,\n includePatterns,\n excludePatterns,\n useRegex\n ], onFilterChange, { deep: true })\n\n return {\n // Filter state\n selectedBaseModels,\n includeTags,\n excludeTags,\n includeFolders,\n excludeFolders,\n noCreditRequired,\n allowSelling,\n includePatterns,\n excludePatterns,\n useRegex,\n\n // Available options\n availableBaseModels,\n availableTags,\n folderTree,\n\n // Preview state\n previewItems,\n matchCount,\n isLoading,\n\n // Actions\n buildConfig,\n restoreFromConfig,\n fetchFilterOptions,\n refreshPreview\n }\n}\n\nexport type LoraPoolStateReturn = ReturnType\n","import { ref, computed } from 'vue'\n\nexport type ModalType = 'baseModels' | 'includeTags' | 'excludeTags' | 'includeFolders' | 'excludeFolders' | null\n\nexport function useModalState() {\n const activeModal = ref(null)\n\n const isOpen = computed(() => activeModal.value !== null)\n\n const openModal = (modal: ModalType) => {\n activeModal.value = modal\n }\n\n const closeModal = () => {\n activeModal.value = null\n }\n\n const isModalOpen = (modal: ModalType) => {\n return activeModal.value === modal\n }\n\n return {\n activeModal,\n isOpen,\n openModal,\n closeModal,\n isModalOpen\n }\n}\n\nexport type ModalStateReturn = ReturnType\n","\n\n\n\n\n","\n\n\n\n\n","\n\n\n\n\n","\n\n\n\n\n","\n\n\n\n\n","import { ref, computed, watch } from 'vue'\nimport type { ComponentWidget, RandomizerConfig, LoraEntry } from './types'\nimport { lmApiUrl } from '@/utils/basePath'\n\nexport function useLoraRandomizerState(widget: ComponentWidget) {\n // Flag to prevent infinite loops during config restoration\n // callback → restoreFromConfig → watch → widget.value = config → callback → ...\n let isRestoring = false\n\n // State refs\n const countMode = ref<'fixed' | 'range'>('range')\n const countFixed = ref(3)\n const countMin = ref(2)\n const countMax = ref(5)\n const modelStrengthMin = ref(0.0)\n const modelStrengthMax = ref(1.0)\n const useCustomClipRange = ref(false)\n const clipStrengthMin = ref(0.0)\n const clipStrengthMax = ref(1.0)\n const rollMode = ref<'fixed' | 'always'>('fixed')\n const isRolling = ref(false)\n const useRecommendedStrength = ref(false)\n const recommendedStrengthScaleMin = ref(0.5)\n const recommendedStrengthScaleMax = ref(1.0)\n\n // Track last used combination (for backend roll mode)\n const lastUsed = ref(null)\n\n // Dual seed mechanism for batch queue synchronization\n // execution_seed: seed for generating execution_stack (= previous next_seed)\n // next_seed: seed for generating ui_loras (= what will be displayed after execution)\n const executionSeed = ref(null)\n const nextSeed = ref(null)\n\n // Build config object from current state\n const buildConfig = (): RandomizerConfig => {\n // Skip updating widget.value during restoration to prevent infinite loops\n if (isRestoring) {\n return {\n count_mode: countMode.value,\n count_fixed: countFixed.value,\n count_min: countMin.value,\n count_max: countMax.value,\n model_strength_min: modelStrengthMin.value,\n model_strength_max: modelStrengthMax.value,\n use_same_clip_strength: !useCustomClipRange.value,\n clip_strength_min: clipStrengthMin.value,\n clip_strength_max: clipStrengthMax.value,\n roll_mode: rollMode.value,\n last_used: lastUsed.value,\n use_recommended_strength: useRecommendedStrength.value,\n recommended_strength_scale_min: recommendedStrengthScaleMin.value,\n recommended_strength_scale_max: recommendedStrengthScaleMax.value,\n execution_seed: executionSeed.value,\n next_seed: nextSeed.value,\n }\n }\n return {\n count_mode: countMode.value,\n count_fixed: countFixed.value,\n count_min: countMin.value,\n count_max: countMax.value,\n model_strength_min: modelStrengthMin.value,\n model_strength_max: modelStrengthMax.value,\n use_same_clip_strength: !useCustomClipRange.value,\n clip_strength_min: clipStrengthMin.value,\n clip_strength_max: clipStrengthMax.value,\n roll_mode: rollMode.value,\n last_used: lastUsed.value,\n use_recommended_strength: useRecommendedStrength.value,\n recommended_strength_scale_min: recommendedStrengthScaleMin.value,\n recommended_strength_scale_max: recommendedStrengthScaleMax.value,\n execution_seed: executionSeed.value,\n next_seed: nextSeed.value,\n }\n }\n\n // Shift seeds for batch queue synchronization\n // Previous next_seed becomes current execution_seed, and generate a new next_seed\n const generateNewSeed = () => {\n executionSeed.value = nextSeed.value // Previous next becomes current execution\n nextSeed.value = Math.floor(Math.random() * 2147483647)\n }\n\n // Initialize next_seed for first execution (execution_seed stays null)\n const initializeNextSeed = () => {\n if (nextSeed.value === null) {\n nextSeed.value = Math.floor(Math.random() * 2147483647)\n }\n }\n\n // Restore state from config object\n const restoreFromConfig = (config: RandomizerConfig) => {\n // Set flag to prevent buildConfig from triggering widget.value updates during restoration\n isRestoring = true\n\n try {\n countMode.value = config.count_mode || 'range'\n countFixed.value = config.count_fixed || 3\n countMin.value = config.count_min || 2\n countMax.value = config.count_max || 5\n modelStrengthMin.value = config.model_strength_min ?? 0.0\n modelStrengthMax.value = config.model_strength_max ?? 1.0\n useCustomClipRange.value = !(config.use_same_clip_strength ?? true)\n clipStrengthMin.value = config.clip_strength_min ?? 0.0\n clipStrengthMax.value = config.clip_strength_max ?? 1.0\n // Migrate old roll_mode values to new ones\n const rawRollMode = (config as any).roll_mode as string\n if (rawRollMode === 'frontend') {\n rollMode.value = 'fixed'\n } else if (rawRollMode === 'backend') {\n rollMode.value = 'always'\n } else if (rawRollMode === 'fixed' || rawRollMode === 'always') {\n rollMode.value = rawRollMode as 'fixed' | 'always'\n } else {\n rollMode.value = 'fixed'\n }\n lastUsed.value = config.last_used || null\n useRecommendedStrength.value = config.use_recommended_strength ?? false\n recommendedStrengthScaleMin.value = config.recommended_strength_scale_min ?? 0.5\n recommendedStrengthScaleMax.value = config.recommended_strength_scale_max ?? 1.0\n } finally {\n isRestoring = false\n }\n }\n\n // Roll loras - call API to get random selection\n const rollLoras = async (\n poolConfig: any | null,\n lockedLoras: LoraEntry[]\n ): Promise => {\n try {\n isRolling.value = true\n\n const config = buildConfig()\n\n // Build request body\n const requestBody: any = {\n model_strength_min: config.model_strength_min,\n model_strength_max: config.model_strength_max,\n use_same_clip_strength: !useCustomClipRange.value,\n clip_strength_min: config.clip_strength_min,\n clip_strength_max: config.clip_strength_max,\n locked_loras: lockedLoras,\n use_recommended_strength: config.use_recommended_strength,\n recommended_strength_scale_min: config.recommended_strength_scale_min,\n recommended_strength_scale_max: config.recommended_strength_scale_max,\n }\n\n // Add count parameters\n if (config.count_mode === 'fixed') {\n requestBody.count = config.count_fixed\n } else {\n requestBody.count_min = config.count_min\n requestBody.count_max = config.count_max\n }\n\n // Add pool config if provided\n if (poolConfig) {\n requestBody.pool_config = poolConfig.filters || {}\n }\n\n // Call API endpoint\n const response = await fetch(lmApiUrl('/api/lm/loras/random-sample'), {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(requestBody),\n })\n\n if (!response.ok) {\n const errorData = await response.json()\n throw new Error(errorData.error || 'Failed to fetch random LoRAs')\n }\n\n const data = await response.json()\n\n if (!data.success) {\n throw new Error(data.error || 'Failed to get random LoRAs')\n }\n\n return data.loras || []\n } catch (error) {\n console.error('[LoraRandomizerState] Error rolling LoRAs:', error)\n throw error\n } finally {\n isRolling.value = false\n }\n }\n\n // Restore last used and return it\n const useLastUsed = () => {\n if (lastUsed.value && lastUsed.value.length > 0) {\n return lastUsed.value\n }\n return null\n }\n\n // Computed properties\n const isClipStrengthDisabled = computed(() => !useCustomClipRange.value)\n const isRecommendedStrengthEnabled = computed(() => useRecommendedStrength.value)\n\n // Watch all state changes and update widget value\n watch([\n countMode,\n countFixed,\n countMin,\n countMax,\n modelStrengthMin,\n modelStrengthMax,\n useCustomClipRange,\n clipStrengthMin,\n clipStrengthMax,\n rollMode,\n useRecommendedStrength,\n recommendedStrengthScaleMin,\n recommendedStrengthScaleMax,\n ], () => {\n widget.value = buildConfig()\n }, { deep: true })\n\n return {\n // State refs\n countMode,\n countFixed,\n countMin,\n countMax,\n modelStrengthMin,\n modelStrengthMax,\n useCustomClipRange,\n clipStrengthMin,\n clipStrengthMax,\n rollMode,\n isRolling,\n lastUsed,\n useRecommendedStrength,\n recommendedStrengthScaleMin,\n recommendedStrengthScaleMax,\n executionSeed,\n nextSeed,\n\n // Computed\n isClipStrengthDisabled,\n isRecommendedStrengthEnabled,\n\n // Methods\n buildConfig,\n restoreFromConfig,\n rollLoras,\n useLastUsed,\n generateNewSeed,\n initializeNextSeed,\n }\n}\n","\n\n\n\n\n","\n\n\n\n\n","\n\n\n\n\n","import { ref, watch, computed } from 'vue'\nimport type { ComponentWidget, CyclerConfig, LoraPoolConfig } from './types'\nimport { lmApiUrl } from '@/utils/basePath'\n\nexport interface CyclerLoraItem {\n file_name: string\n model_name: string\n file_path: string\n}\n\nexport function useLoraCyclerState(widget: ComponentWidget) {\n // Flag to prevent infinite loops during config restoration\n // callback → restoreFromConfig → watch → widget.value = config → callback → ...\n let isRestoring = false\n\n // State refs\n const currentIndex = ref(1) // 1-based\n const totalCount = ref(0)\n const poolConfigHash = ref('')\n const modelStrength = ref(1.0)\n const clipStrength = ref(1.0)\n const useCustomClipRange = ref(false)\n const usePresetStrength = ref(false)\n const presetStrengthScale = ref(1.0)\n const sortBy = ref<'filename' | 'model_name'>('filename')\n const currentLoraName = ref('')\n const currentLoraFilename = ref('')\n const isLoading = ref(false)\n\n // Dual-index mechanism for batch queue synchronization\n // execution_index: index for generating execution_stack (= previous next_index)\n // next_index: index for UI display (= what will be shown after execution)\n const executionIndex = ref(null)\n const nextIndex = ref(null)\n\n // Advanced index control features\n const repeatCount = ref(1) // How many times each LoRA should repeat\n const repeatUsed = ref(0) // How many times current index has been used (internal tracking)\n const displayRepeatUsed = ref(0) // For UI display, deferred updates like currentIndex\n const isPaused = ref(false) // Whether iteration is paused\n const includeNoLora = ref(false) // Whether to include empty LoRA option in cycle\n\n // Execution progress tracking (visual feedback)\n const isWorkflowExecuting = ref(false) // Workflow is currently running\n const executingRepeatStep = ref(0) // Which repeat step (1-based, 0 = not executing)\n\n // Build config object from current state\n const buildConfig = (): CyclerConfig => {\n // Skip updating widget.value during restoration to prevent infinite loops\n if (isRestoring) {\n return {\n current_index: currentIndex.value,\n total_count: totalCount.value,\n pool_config_hash: poolConfigHash.value,\n model_strength: modelStrength.value,\n clip_strength: clipStrength.value,\n use_same_clip_strength: !useCustomClipRange.value,\n use_preset_strength: usePresetStrength.value,\n preset_strength_scale: presetStrengthScale.value,\n sort_by: sortBy.value,\n current_lora_name: currentLoraName.value,\n current_lora_filename: currentLoraFilename.value,\n execution_index: executionIndex.value,\n next_index: nextIndex.value,\n repeat_count: repeatCount.value,\n repeat_used: repeatUsed.value,\n is_paused: isPaused.value,\n include_no_lora: includeNoLora.value,\n }\n }\n return {\n current_index: currentIndex.value,\n total_count: totalCount.value,\n pool_config_hash: poolConfigHash.value,\n model_strength: modelStrength.value,\n clip_strength: clipStrength.value,\n use_same_clip_strength: !useCustomClipRange.value,\n use_preset_strength: usePresetStrength.value,\n preset_strength_scale: presetStrengthScale.value,\n sort_by: sortBy.value,\n current_lora_name: currentLoraName.value,\n current_lora_filename: currentLoraFilename.value,\n execution_index: executionIndex.value,\n next_index: nextIndex.value,\n repeat_count: repeatCount.value,\n repeat_used: repeatUsed.value,\n is_paused: isPaused.value,\n include_no_lora: includeNoLora.value,\n }\n }\n\n // Restore state from config object\n const restoreFromConfig = (config: CyclerConfig) => {\n // Set flag to prevent buildConfig from triggering widget.value updates during restoration\n isRestoring = true\n\n try {\n currentIndex.value = config.current_index || 1\n totalCount.value = config.total_count || 0\n poolConfigHash.value = config.pool_config_hash || ''\n modelStrength.value = config.model_strength ?? 1.0\n clipStrength.value = config.clip_strength ?? 1.0\n useCustomClipRange.value = !(config.use_same_clip_strength ?? true)\n usePresetStrength.value = config.use_preset_strength ?? false\n presetStrengthScale.value = config.preset_strength_scale ?? 1.0\n sortBy.value = config.sort_by || 'filename'\n currentLoraName.value = config.current_lora_name || ''\n currentLoraFilename.value = config.current_lora_filename || ''\n // Advanced index control features\n repeatCount.value = config.repeat_count ?? 1\n repeatUsed.value = config.repeat_used ?? 0\n isPaused.value = config.is_paused ?? false\n includeNoLora.value = config.include_no_lora ?? false\n // Note: execution_index and next_index are not restored from config\n // as they are transient values used only during batch execution\n } finally {\n isRestoring = false\n }\n }\n\n // Shift indices for batch queue synchronization\n // Previous next_index becomes current execution_index, and generate a new next_index\n const generateNextIndex = () => {\n executionIndex.value = nextIndex.value // Previous next becomes current execution\n // Calculate the next index (wrap to 1 if at end)\n const current = executionIndex.value ?? currentIndex.value\n let next = current + 1\n // Total count includes no lora option if enabled\n const effectiveTotalCount = includeNoLora.value ? totalCount.value + 1 : totalCount.value\n if (effectiveTotalCount > 0 && next > effectiveTotalCount) {\n next = 1\n }\n nextIndex.value = next\n }\n\n // Initialize next_index for first execution (execution_index stays null)\n const initializeNextIndex = () => {\n if (nextIndex.value === null) {\n // First execution uses current_index, so next is current + 1\n let next = currentIndex.value + 1\n // Total count includes no lora option if enabled\n const effectiveTotalCount = includeNoLora.value ? totalCount.value + 1 : totalCount.value\n if (effectiveTotalCount > 0 && next > effectiveTotalCount) {\n next = 1\n }\n nextIndex.value = next\n }\n }\n\n // Generate hash from pool config for change detection\n const hashPoolConfig = (poolConfig: LoraPoolConfig | null): string => {\n if (!poolConfig || !poolConfig.filters) {\n return ''\n }\n try {\n return btoa(JSON.stringify(poolConfig.filters))\n } catch {\n return ''\n }\n }\n\n // Fetch cycler list from API\n const fetchCyclerList = async (\n poolConfig: LoraPoolConfig | null\n ): Promise => {\n try {\n isLoading.value = true\n\n const requestBody: Record = {\n sort_by: sortBy.value,\n }\n\n if (poolConfig?.filters) {\n requestBody.pool_config = poolConfig.filters\n }\n\n const response = await fetch(lmApiUrl('/api/lm/loras/cycler-list'), {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(requestBody),\n })\n\n if (!response.ok) {\n const errorData = await response.json()\n throw new Error(errorData.error || 'Failed to fetch cycler list')\n }\n\n const data = await response.json()\n\n if (!data.success) {\n throw new Error(data.error || 'Failed to get cycler list')\n }\n\n return data.loras || []\n } catch (error) {\n console.error('[LoraCyclerState] Error fetching cycler list:', error)\n throw error\n } finally {\n isLoading.value = false\n }\n }\n\n // Refresh list and update state\n const refreshList = async (poolConfig: LoraPoolConfig | null) => {\n try {\n const newHash = hashPoolConfig(poolConfig)\n const hashChanged = newHash !== poolConfigHash.value\n\n // Fetch the list\n const loraList = await fetchCyclerList(poolConfig)\n\n // Update total count\n totalCount.value = loraList.length\n\n // If pool config changed, reset index to 1\n if (hashChanged) {\n currentIndex.value = 1\n poolConfigHash.value = newHash\n }\n\n // Clamp index to valid range\n if (currentIndex.value > totalCount.value) {\n currentIndex.value = Math.max(1, totalCount.value)\n }\n\n // Update current LoRA info\n if (loraList.length > 0 && currentIndex.value > 0) {\n const currentLora = loraList[currentIndex.value - 1]\n if (currentLora) {\n currentLoraName.value = sortBy.value === 'filename' \n ? currentLora.file_name \n : (currentLora.model_name || currentLora.file_name)\n currentLoraFilename.value = currentLora.file_name\n }\n } else {\n currentLoraName.value = ''\n currentLoraFilename.value = ''\n }\n\n return loraList\n } catch (error) {\n console.error('[LoraCyclerState] Error refreshing list:', error)\n throw error\n }\n }\n\n // Set index manually\n const setIndex = (index: number) => {\n // Total count includes no lora option if enabled\n const effectiveTotalCount = includeNoLora.value ? totalCount.value + 1 : totalCount.value\n if (index >= 1 && index <= effectiveTotalCount) {\n currentIndex.value = index\n }\n }\n\n // Reset index to 1 and clear repeat state\n const resetIndex = () => {\n currentIndex.value = 1\n repeatUsed.value = 0\n displayRepeatUsed.value = 0\n // Note: isPaused is intentionally not reset - user may want to stay paused after reset\n }\n\n // Toggle pause state\n const togglePause = () => {\n isPaused.value = !isPaused.value\n }\n\n // Computed property to check if clip strength is disabled\n const isClipStrengthDisabled = computed(() => !useCustomClipRange.value)\n\n // Watch model strength changes to sync with clip strength when not using custom range\n watch(modelStrength, (newValue) => {\n if (!useCustomClipRange.value) {\n clipStrength.value = newValue\n }\n })\n\n // Watch all state changes and update widget value\n watch([\n currentIndex,\n totalCount,\n poolConfigHash,\n modelStrength,\n clipStrength,\n useCustomClipRange,\n usePresetStrength,\n presetStrengthScale,\n sortBy,\n currentLoraName,\n currentLoraFilename,\n repeatCount,\n repeatUsed,\n isPaused,\n includeNoLora,\n ], () => {\n widget.value = buildConfig()\n }, { deep: true })\n\n return {\n // State refs\n currentIndex,\n totalCount,\n poolConfigHash,\n modelStrength,\n clipStrength,\n useCustomClipRange,\n usePresetStrength,\n presetStrengthScale,\n sortBy,\n currentLoraName,\n currentLoraFilename,\n isLoading,\n executionIndex,\n nextIndex,\n repeatCount,\n repeatUsed,\n displayRepeatUsed,\n isPaused,\n includeNoLora,\n isWorkflowExecuting,\n executingRepeatStep,\n\n // Computed\n isClipStrengthDisabled,\n\n // Methods\n buildConfig,\n restoreFromConfig,\n hashPoolConfig,\n fetchCyclerList,\n refreshList,\n setIndex,\n generateNextIndex,\n initializeNextIndex,\n resetIndex,\n togglePause,\n }\n}\n","\n\n\n\n\n","\n\n\n\n\n","import { ref, onMounted, onUnmounted, type Ref } from 'vue'\n\n// Dynamic import type for AutoComplete class\ntype AutoCompleteClass = new (\n inputElement: HTMLTextAreaElement,\n modelType: 'loras' | 'prompt',\n options?: AutocompleteOptions\n) => AutoCompleteInstance\n\ninterface AutocompleteOptions {\n maxItems?: number\n minChars?: number\n debounceDelay?: number\n showPreview?: boolean\n}\n\ninterface AutoCompleteInstance {\n destroy: () => void\n isValid: () => boolean\n refreshCaretHelper: () => void\n}\n\nexport interface UseAutocompleteOptions {\n showPreview?: boolean\n maxItems?: number\n minChars?: number\n debounceDelay?: number\n}\n\nexport function useAutocomplete(\n textareaRef: Ref,\n modelType: 'loras' | 'prompt' = 'loras',\n options: UseAutocompleteOptions = {}\n) {\n const autocompleteInstance = ref(null)\n const isInitialized = ref(false)\n\n const defaultOptions: AutocompleteOptions = {\n maxItems: 20,\n minChars: 1,\n debounceDelay: 200,\n showPreview: true,\n ...options\n }\n\n const initAutocomplete = async () => {\n if (!textareaRef.value) {\n console.warn('[useAutocomplete] Textarea ref is null, cannot initialize')\n return\n }\n\n if (autocompleteInstance.value) {\n console.log('[useAutocomplete] Already initialized, skipping')\n return\n }\n\n try {\n // Dynamically import the AutoComplete class\n const module = await import(/* @vite-ignore */ `${'../autocomplete.js'}`)\n const AutoComplete: AutoCompleteClass = module.AutoComplete\n\n autocompleteInstance.value = new AutoComplete(\n textareaRef.value,\n modelType,\n defaultOptions\n )\n isInitialized.value = true\n console.log(`[useAutocomplete] Initialized for ${modelType}`)\n } catch (error) {\n console.error('[useAutocomplete] Failed to initialize:', error)\n }\n }\n\n const destroyAutocomplete = () => {\n if (autocompleteInstance.value) {\n autocompleteInstance.value.destroy()\n autocompleteInstance.value = null\n isInitialized.value = false\n console.log('[useAutocomplete] Destroyed')\n }\n }\n\n const refreshCaretHelper = () => {\n if (autocompleteInstance.value) {\n autocompleteInstance.value.refreshCaretHelper()\n }\n }\n\n onMounted(() => {\n // Initialize autocomplete after component is mounted\n // Use nextTick-like delay to ensure DOM is fully ready\n setTimeout(() => {\n initAutocomplete()\n }, 0)\n })\n\n onUnmounted(() => {\n destroyAutocomplete()\n })\n\n return {\n autocompleteInstance,\n isInitialized,\n initAutocomplete,\n destroyAutocomplete,\n refreshCaretHelper\n }\n}\n\nexport type UseAutocompleteReturn = ReturnType\n","\n\n\n\n\n\n\n\n","\n\n\n\n","import type { App as VueApp } from 'vue'\n\nexport function createVueWidgetCleanup(vueApp: VueApp, onCleanup?: () => void) {\n let didUnmount = false\n\n return () => {\n if (didUnmount) {\n return\n }\n\n vueApp.unmount()\n didUnmount = true\n onCleanup?.()\n }\n}\n","import { api } from \"../../scripts/api.js\";\nimport { app } from \"../../scripts/app.js\";\nimport { TextAreaCaretHelper } from \"./textarea_caret_helper.js\";\nimport {\n WILDCARD_COMMANDS,\n createWildcardEmptyStateItem,\n createWildcardNoMatchesItem,\n getWildcardInsertText,\n getWildcardSearchEndpoint,\n isWildcardCommand,\n isWildcardInfoItem,\n} from \"./autocomplete_wildcards.js\";\nimport {\n getAutocompleteAppendCommaPreference,\n getAutocompleteAutoFormatPreference,\n getAutocompleteAcceptKeyPreference,\n getLoraActiveFiltersAutocompletePreference,\n getPromptTagAutocompletePreference,\n getTagSpaceReplacementPreference,\n setLoraManagerSettingValue,\n} from \"./settings.js\";\nimport { showToast } from \"./utils.js\";\n\n// localStorage key for the one-time \"how to disable\" hint in the dropdown\nconst FIRST_RUN_HINT_DISMISSED_KEY = 'lm:autocomplete-disable-tip-dismissed';\n// localStorage key for the one-time \"try active filters search\" hint (loras nodes)\nconst ACTIVE_FILTERS_HINT_DISMISSED_KEY = 'lm:activefilters-tip-dismissed';\n\n// Command definitions for category filtering\nconst TAG_COMMANDS = {\n '/character': { categories: [4, 11], label: 'Character' },\n '/artist': { categories: [1, 8], label: 'Artist' },\n '/general': { categories: [0, 7], label: 'General' },\n '/copyright': { categories: [3, 10], label: 'Copyright' },\n '/meta': { categories: [5, 14], label: 'Meta' },\n '/species': { categories: [12], label: 'Species' },\n '/lore': { categories: [15], label: 'Lore' },\n '/emb': { type: 'embedding', label: 'Embeddings' },\n '/embedding': { type: 'embedding', label: 'Embeddings' },\n ...WILDCARD_COMMANDS,\n // Autocomplete toggle commands - only show one based on current state\n '/autocomplete': {\n type: 'toggle_setting',\n settingId: 'loramanager.prompt_tag_autocomplete',\n value: true,\n label: 'Turn autocomplete ON',\n condition: () => !getPromptTagAutocompletePreference()\n },\n '/noautocomplete': {\n type: 'toggle_setting',\n settingId: 'loramanager.prompt_tag_autocomplete',\n value: false,\n label: 'Turn autocomplete OFF',\n condition: () => getPromptTagAutocompletePreference()\n },\n};\n\n// Command definitions for LoRA active-filters search\nconst LORAS_COMMANDS = {\n '/activefilters': {\n type: 'toggle_setting',\n settingId: 'loramanager.lora_active_filters_autocomplete',\n value: true,\n label: 'Turn active filters search ON',\n feedbackSummary: 'Active Filters Search: ON',\n feedbackDetail: 'LoRA autocomplete now searches within the active filters of the LoRA Manager page.',\n condition: () => !getLoraActiveFiltersAutocompletePreference()\n },\n '/noactivefilters': {\n type: 'toggle_setting',\n settingId: 'loramanager.lora_active_filters_autocomplete',\n value: false,\n label: 'Turn active filters search OFF',\n feedbackSummary: 'Active Filters Search: OFF',\n feedbackDetail: 'LoRA autocomplete searches the full library again.',\n condition: () => getLoraActiveFiltersAutocompletePreference()\n },\n};\n\n// Category display information\nconst CATEGORY_INFO = { 0: { bg: 'rgba(0, 155, 230, 0.2)', text: '#4bb4ff', label: 'General' },\n 1: { bg: 'rgba(255, 138, 139, 0.2)', text: '#ffc3c3', label: 'Artist' },\n 3: { bg: 'rgba(199, 151, 255, 0.2)', text: '#ddc9fb', label: 'Copyright' },\n 4: { bg: 'rgba(53, 198, 74, 0.2)', text: '#93e49a', label: 'Character' },\n 5: { bg: 'rgba(234, 208, 132, 0.2)', text: '#f7e7c3', label: 'Meta' },\n 7: { bg: 'rgba(0, 155, 230, 0.2)', text: '#4bb4ff', label: 'General' },\n 8: { bg: 'rgba(255, 138, 139, 0.2)', text: '#ffc3c3', label: 'Artist' },\n 10: { bg: 'rgba(199, 151, 255, 0.2)', text: '#ddc9fb', label: 'Copyright' },\n 11: { bg: 'rgba(53, 198, 74, 0.2)', text: '#93e49a', label: 'Character' },\n 12: { bg: 'rgba(237, 137, 54, 0.2)', text: '#f6ad55', label: 'Species' },\n 14: { bg: 'rgba(234, 208, 132, 0.2)', text: '#f7e7c3', label: 'Meta' },\n 15: { bg: 'rgba(72, 187, 120, 0.2)', text: '#68d391', label: 'Lore' },\n};\n\n// Format post count with K/M suffix\nfunction formatPostCount(count) {\n if (count >= 1000000) {\n return (count / 1000000).toFixed(1).replace(/\\.0$/, '') + 'M';\n } else if (count >= 1000) {\n return (count / 1000).toFixed(1).replace(/\\.0$/, '') + 'K';\n }\n return count.toString();\n}\n\nfunction parseUsageTipNumber(value) {\n if (typeof value === 'number' && Number.isFinite(value)) {\n return value;\n }\n if (typeof value === 'string') {\n const parsed = parseFloat(value);\n if (Number.isFinite(parsed)) {\n return parsed;\n }\n }\n return null;\n}\n\nfunction splitRelativePath(relativePath = '') {\n const parts = relativePath.split(/[/\\\\]+/).filter(Boolean);\n const fileName = parts.pop() ?? '';\n return {\n directories: parts,\n fileName,\n };\n}\n\nfunction removeGeneralExtension(fileName = '') {\n return fileName.replace(/\\.[^.]+$/, '');\n}\n\nfunction removeLoraExtension(fileName = '') {\n return fileName.replace(/\\.(safetensors|ckpt|pt|bin)$/i, '');\n}\n\nlet _loraSyntaxFormatCache = null;\nlet _loraSyntaxFormatRefreshPromise = null;\n\nfunction _getLoraSyntaxFormat() {\n if (_loraSyntaxFormatCache !== null) {\n return _loraSyntaxFormatCache;\n }\n return 'legacy';\n}\n\nasync function _fetchLoraSyntaxFormat() {\n try {\n const response = await api.fetchApi('/lm/settings');\n if (response.ok) {\n const data = await response.json();\n if (data.success && data.settings) {\n _loraSyntaxFormatCache = data.settings.lora_syntax_format || 'legacy';\n return;\n }\n }\n } catch (e) {\n }\n if (_loraSyntaxFormatCache === null) {\n _loraSyntaxFormatCache = 'legacy';\n }\n}\n\nfunction _triggerBackgroundRefresh() {\n if (_loraSyntaxFormatRefreshPromise) {\n return;\n }\n _loraSyntaxFormatRefreshPromise = _fetchLoraSyntaxFormat().finally(() => {\n _loraSyntaxFormatRefreshPromise = null;\n });\n}\n\nasync function refreshLoraSyntaxFormat() {\n await _fetchLoraSyntaxFormat();\n}\n\nfunction _initLoraSyntaxFormat() {\n _triggerBackgroundRefresh();\n}\n_initLoraSyntaxFormat();\n\nfunction _initLoraSyntaxFormatReactive() {\n window.addEventListener('storage', (e) => {\n if (e.key === 'lm:lora-syntax-format-changed') {\n _triggerBackgroundRefresh();\n }\n });\n\n document.addEventListener('visibilitychange', () => {\n if (document.visibilityState === 'visible') {\n _triggerBackgroundRefresh();\n }\n });\n}\n_initLoraSyntaxFormatReactive();\n\nfunction parseSearchTokens(term = '') {\n const include = [];\n const exclude = [];\n\n term.split(/\\s+/).forEach((rawTerm) => {\n const token = rawTerm.trim();\n if (!token) {\n return;\n }\n if (token.startsWith('-') && token.length > 1) {\n exclude.push(token.slice(1).toLowerCase());\n } else {\n include.push(token.toLowerCase());\n }\n });\n\n return { include, exclude };\n}\n\nfunction escapePromptParentheses(text) {\n // In ComfyUI's CLIP text encoder, bare parentheses are weight adjustment syntax.\n // Tags containing literal parentheses must be escaped with backslash to prevent\n // them from being interpreted as weight modifiers. e.g. \"foo (bar)\" → \"foo \\(bar\\)\"\n return text.replace(/\\(/g, '\\\\(').replace(/\\)/g, '\\\\)');\n}\n\nfunction formatAutocompleteInsertion(text = '') {\n const trimmed = typeof text === 'string' ? text.trim() : '';\n if (!trimmed) {\n return '';\n }\n\n return getAutocompleteAppendCommaPreference() ? `${trimmed},` : `${trimmed} `;\n}\n\n// Matches a complete tag. Kept\n// permissive on the strength fields (mirrors the backend parser) so tags\n// are still protected while the user is mid-edit.\nconst LORA_TAG_PATTERN = /(]+:[^:>]+(?::[^:>]+)?>)/gi;\n\nfunction normalizeAutocompleteSegment(segment = '') {\n // Collapse whitespace only outside tags: names inside the tags\n // may legitimately contain repeated spaces (e.g. \"test - 0021\"), and\n // collapsing them breaks file resolution at runtime.\n return segment\n .split(LORA_TAG_PATTERN)\n .map((part, index) => (index % 2 === 1 ? part : part.replace(/\\s+/g, ' ')))\n .join('')\n .trim();\n}\n\nexport function formatAutocompleteTextOnBlur(text = '') {\n if (typeof text !== 'string') {\n return '';\n }\n\n return text\n .split('\\n')\n .map((line) => {\n if (!line.trim()) {\n return '';\n }\n\n const cleanedSegments = line\n .split(',')\n .map(normalizeAutocompleteSegment)\n .filter(Boolean);\n\n return cleanedSegments.join(', ');\n })\n .join('\\n');\n}\n\nfunction shouldAcceptAutocompleteKey(key) {\n const mode = getAutocompleteAcceptKeyPreference();\n\n if (mode === 'tab_only') {\n return key === 'Tab';\n }\n\n if (mode === 'enter_only') {\n return key === 'Enter';\n }\n\n return key === 'Tab' || key === 'Enter';\n}\n\nfunction normalizeAutocompleteMatchText(text = '') {\n return text.toLowerCase().replace(/[-_\\s']/g, '');\n}\n\nconst AUTOCOMPLETE_METADATA_VERSION = 1;\n\nfunction createAutocompleteMetadataBase(textWidgetName = 'text') {\n return {\n version: AUTOCOMPLETE_METADATA_VERSION,\n textWidgetName,\n };\n}\n\nconst AUTOCOMPLETE_METADATA_WIDGET_PREFIX = '__lm_autocomplete_meta_';\nconst LORA_MANAGER_WIDGET_IDS_PROPERTY = '__lm_widget_ids'; // Must match vue-widgets/src/main.ts\n\n/**\n * Return a copy of an autocomplete metadata value without the lastAccepted\n * boundary. lastAccepted carries insertedText/textSnapshot (old prompt text)\n * and is session-only state; it must not leak into exported workflow JSON.\n * Values without lastAccepted are returned as-is.\n *\n * @param {*} value - Widget metadata value (or any other widget value)\n * @returns {*} The stripped copy, or the original value when untouched\n */\nexport function stripAutocompleteLastAccepted(value) {\n if (!value || typeof value !== 'object' || Array.isArray(value)) {\n return value;\n }\n if (!('lastAccepted' in value)) {\n return value;\n }\n const stripped = { ...value };\n delete stripped.lastAccepted;\n return stripped;\n}\n\n/**\n * Strip lastAccepted from autocomplete metadata widgets on a serialized\n * node's widgets_values / widgets_values_named. Array entries are aligned\n * via properties.__lm_widget_ids (written by the extension's onSerialize).\n * Operates on graph.serialize() output, which is already a deep copy.\n *\n * @param {Array} nodes - Serialized node array\n */\nfunction stripAutocompleteMetadataFromNodes(nodes) {\n if (!Array.isArray(nodes)) {\n return;\n }\n\n for (const node of nodes) {\n if (!node || typeof node !== 'object') {\n continue;\n }\n\n const widgetIds = node.properties?.[LORA_MANAGER_WIDGET_IDS_PROPERTY];\n if (Array.isArray(node.widgets_values) && Array.isArray(widgetIds)) {\n for (let i = 0; i < node.widgets_values.length && i < widgetIds.length; i++) {\n if (typeof widgetIds[i] === 'string'\n && widgetIds[i].startsWith(AUTOCOMPLETE_METADATA_WIDGET_PREFIX)) {\n node.widgets_values[i] = stripAutocompleteLastAccepted(node.widgets_values[i]);\n }\n }\n }\n\n const named = node.widgets_values_named;\n if (named && typeof named === 'object') {\n for (const [key, value] of Object.entries(named)) {\n if (key.startsWith(AUTOCOMPLETE_METADATA_WIDGET_PREFIX)) {\n named[key] = stripAutocompleteLastAccepted(value);\n }\n }\n }\n }\n}\n\n/**\n * Strip lastAccepted from autocomplete metadata widgets in a graphToPrompt()\n * result (both the workflow document and the API prompt). Used by the widget\n * bundle to keep exported workflows free of old prompt text while leaving\n * live node state untouched.\n *\n * @param {*} result - graphToPrompt() result: { workflow, output }\n * @returns {*} The same result object, with metadata entries replaced in place\n */\nexport function stripAutocompleteMetadataFromPromptResult(result) {\n if (!result || typeof result !== 'object') {\n return result;\n }\n\n const workflow = result.workflow;\n if (workflow && typeof workflow === 'object') {\n stripAutocompleteMetadataFromNodes(workflow.nodes);\n const subgraphs = workflow.definitions?.subgraphs;\n if (Array.isArray(subgraphs)) {\n for (const subgraph of subgraphs) {\n stripAutocompleteMetadataFromNodes(subgraph?.nodes);\n }\n }\n }\n\n const output = result.output;\n if (output && typeof output === 'object') {\n for (const nodeOutput of Object.values(output)) {\n const inputs = nodeOutput?.inputs;\n if (!inputs || typeof inputs !== 'object') {\n continue;\n }\n for (const [key, value] of Object.entries(inputs)) {\n if (key.startsWith(AUTOCOMPLETE_METADATA_WIDGET_PREFIX)) {\n inputs[key] = stripAutocompleteLastAccepted(value);\n }\n }\n }\n }\n\n return result;\n}\n\nfunction createDefaultBehavior(modelType) {\n return {\n enablePreview: false,\n async getInsertText(_instance, relativePath) {\n const trimmed = relativePath?.trim() ?? '';\n if (!trimmed) {\n return '';\n }\n return formatAutocompleteInsertion(escapePromptParentheses(trimmed));\n },\n };\n}\n\nconst MODEL_BEHAVIORS = {\n loras: {\n enablePreview: true,\n init(instance) {\n if (!instance.options.showPreview) {\n return;\n }\n instance.initPreviewTooltip({ modelType: instance.modelType });\n },\n showPreview(instance, relativePath, itemElement) {\n if (!instance.previewTooltip) {\n return;\n }\n instance.showPreviewForItem(relativePath, itemElement);\n },\n hidePreview(instance) {\n if (!instance.previewTooltip) {\n return;\n }\n instance.previewTooltip.hide();\n },\n destroy(instance) {\n if (instance.previewTooltip) {\n instance.previewTooltip.cleanup();\n instance.previewTooltip = null;\n }\n },\n async getInsertText(_instance, relativePath) {\n const { directories, fileName } = splitRelativePath(relativePath);\n const baseName = removeLoraExtension(fileName);\n const folder = directories.length ? directories.join('/') + '/' : '';\n const loraName = folder + baseName;\n\n const resultName = _getLoraSyntaxFormat() === 'legacy'\n ? baseName\n : loraName;\n\n let strength = 1.0;\n let hasStrength = false;\n let clipStrength = null;\n\n try {\n const response = await api.fetchApi(`/lm/loras/usage-tips-by-path?relative_path=${encodeURIComponent(relativePath)}`);\n if (response.ok) {\n const data = await response.json();\n if (data.success && data.usage_tips) {\n try {\n const usageTips = JSON.parse(data.usage_tips);\n const parsedStrength = parseUsageTipNumber(usageTips.strength);\n if (parsedStrength !== null) {\n strength = parsedStrength;\n hasStrength = true;\n }\n const clipSource = usageTips.clip_strength ?? usageTips.clipStrength;\n const parsedClipStrength = parseUsageTipNumber(clipSource);\n if (parsedClipStrength !== null) {\n clipStrength = parsedClipStrength;\n if (!hasStrength) {\n strength = 1.0;\n }\n }\n } catch (parseError) {\n console.warn('Failed to parse usage tips JSON:', parseError);\n }\n }\n }\n } catch (error) {\n console.warn('Failed to fetch usage tips:', error);\n }\n\n if (clipStrength !== null) {\n return formatAutocompleteInsertion(``);\n }\n return formatAutocompleteInsertion(``);\n }\n },\n embeddings: {\n enablePreview: true,\n init(instance) {\n if (!instance.options.showPreview) {\n return;\n }\n instance.initPreviewTooltip({ modelType: instance.modelType });\n },\n async getInsertText(_instance, relativePath) {\n const { directories, fileName } = splitRelativePath(relativePath);\n const trimmedName = removeGeneralExtension(fileName);\n const folder = directories.length ? `${directories.join('/')}/` : '';\n return formatAutocompleteInsertion(`embedding:${folder}${trimmedName}`);\n },\n },\n custom_words: {\n enablePreview: false,\n async getInsertText(_instance, relativePath) {\n return formatAutocompleteInsertion(escapePromptParentheses(relativePath));\n },\n },\n prompt: {\n enablePreview: true,\n init(instance) {\n if (!instance.options.showPreview) {\n return;\n }\n instance.initPreviewTooltip({ modelType: 'embeddings' });\n },\n showPreview(instance, relativePath, itemElement) {\n if (!instance.previewTooltip || instance.searchType !== 'embeddings') {\n return;\n }\n instance.showPreviewForItem(relativePath, itemElement);\n },\n hidePreview(instance) {\n if (!instance.previewTooltip) {\n return;\n }\n instance.previewTooltip.hide();\n },\n destroy(instance) {\n if (instance.previewTooltip) {\n instance.previewTooltip.cleanup();\n instance.previewTooltip = null;\n }\n },\n async getInsertText(instance, relativePath) {\n const rawSearchTerm = instance.getSearchTerm(instance.inputElement.value);\n const match = rawSearchTerm.match(/^emb:(.*)$/i);\n\n if (match || instance.searchType === 'embeddings') {\n const { directories, fileName } = splitRelativePath(relativePath);\n const trimmedName = removeGeneralExtension(fileName);\n const folder = directories.length ? `${directories.join('/')}/` : '';\n return formatAutocompleteInsertion(`embedding:${folder}${trimmedName}`);\n } else if (instance.searchType === 'wildcards' || isWildcardCommand(instance.activeCommand)) {\n return formatAutocompleteInsertion(getWildcardInsertText(relativePath));\n } else {\n let tagText = relativePath;\n\n if (getTagSpaceReplacementPreference()) {\n tagText = tagText.replace(/_/g, ' ');\n }\n\n tagText = escapePromptParentheses(tagText);\n\n return formatAutocompleteInsertion(tagText);\n }\n },\n },\n};\n\nfunction getModelBehavior(modelType) {\n return MODEL_BEHAVIORS[modelType] ?? createDefaultBehavior(modelType);\n}\n\nclass AutoComplete {\n constructor(inputElement, modelType = 'loras', options = {}) {\n this.inputElement = inputElement;\n this.modelType = modelType;\n this.behavior = getModelBehavior(modelType);\n this.options = {\n maxItems: 100,\n pageSize: 20,\n visibleItems: 15, // Fixed at 15 items for balanced UX\n itemHeight: 40,\n minChars: 1,\n debounceDelay: 200,\n showPreview: this.behavior.enablePreview ?? false,\n enableVirtualScroll: true,\n ...options\n };\n\n this.dropdown = null;\n this.selectedIndex = -1;\n this.hasManualSelection = false;\n this.items = [];\n this.debounceTimer = null;\n this.isVisible = false;\n this.currentSearchTerm = '';\n this.wildcardMeta = null;\n this.previewTooltip = null;\n this.previewTooltipPromise = null;\n this.searchType = null;\n this.suppressAutocompleteOnce = false;\n\n // Discoverability hints state\n this.commandListFooter = null; // State hint shown below the slash command list\n this.firstRunHint = null; // One-time \"how to disable\" bar inside the dropdown\n\n // Virtual scrolling state\n this.virtualScrollOffset = 0;\n this.hasMoreItems = true;\n this.isLoadingMore = false;\n this.currentPage = 0;\n this.scrollContainer = null;\n this.contentContainer = null;\n this.totalHeight = 0;\n\n // Command mode state\n this.activeCommand = null; // Current active command (e.g., { categories: [4, 11], label: 'Character' })\n this.showingCommands = false; // Whether showing command list dropdown\n\n // Initialize TextAreaCaretHelper\n this.helper = new TextAreaCaretHelper(inputElement, () => app.canvas.ds.scale);\n\n this.onInput = null;\n this.onKeyDown = null;\n this.onBlur = null;\n this.onDocumentClick = null;\n this.onScroll = null;\n\n this.init();\n }\n \n init() {\n this.createDropdown();\n this.bindEvents();\n }\n \n createDropdown() {\n this.dropdown = document.createElement('div');\n this.dropdown.className = 'comfy-autocomplete-dropdown';\n\n // Apply new color scheme\n this.dropdown.style.cssText = `\n position: absolute;\n z-index: 10000;\n overflow: hidden;\n background-color: rgba(40, 44, 52, 0.95);\n border: 1px solid rgba(226, 232, 240, 0.2);\n border-radius: 8px;\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3);\n display: none;\n min-width: 200px;\n width: auto;\n backdrop-filter: blur(8px);\n -webkit-backdrop-filter: blur(8px);\n `;\n\n if (this.options.enableVirtualScroll) {\n // Create scroll container for virtual scrolling\n this.scrollContainer = document.createElement('div');\n this.scrollContainer.className = 'comfy-autocomplete-scroll-container';\n this.scrollContainer.style.cssText = `\n overflow-y: auto;\n max-height: ${this.options.visibleItems * this.options.itemHeight}px;\n position: relative;\n `;\n\n // Create content container for virtual items\n this.contentContainer = document.createElement('div');\n this.contentContainer.className = 'comfy-autocomplete-content';\n this.contentContainer.style.cssText = `\n position: relative;\n width: 100%;\n `;\n\n this.scrollContainer.appendChild(this.contentContainer);\n this.dropdown.appendChild(this.scrollContainer);\n }\n\n // Custom scrollbar styles with new color scheme\n const style = document.createElement('style');\n style.textContent = `\n .comfy-autocomplete-dropdown::-webkit-scrollbar {\n width: 8px;\n }\n .comfy-autocomplete-dropdown::-webkit-scrollbar-track {\n background: rgba(40, 44, 52, 0.3);\n border-radius: 4px;\n }\n .comfy-autocomplete-dropdown::-webkit-scrollbar-thumb {\n background: rgba(226, 232, 240, 0.2);\n border-radius: 4px;\n }\n .comfy-autocomplete-dropdown::-webkit-scrollbar-thumb:hover {\n background: rgba(226, 232, 240, 0.4);\n }\n .comfy-autocomplete-scroll-container::-webkit-scrollbar {\n width: 8px;\n }\n .comfy-autocomplete-scroll-container::-webkit-scrollbar-track {\n background: rgba(40, 44, 52, 0.3);\n border-radius: 4px;\n }\n .comfy-autocomplete-scroll-container::-webkit-scrollbar-thumb {\n background: rgba(226, 232, 240, 0.2);\n border-radius: 4px;\n }\n .comfy-autocomplete-scroll-container::-webkit-scrollbar-thumb:hover {\n background: rgba(226, 232, 240, 0.4);\n }\n .comfy-autocomplete-loading {\n padding: 12px;\n text-align: center;\n color: rgba(226, 232, 240, 0.5);\n font-size: 12px;\n }\n `;\n document.head.appendChild(style);\n\n // Append to body to avoid overflow issues\n document.body.appendChild(this.dropdown);\n\n if (typeof this.behavior.init === 'function') {\n this.behavior.init(this);\n }\n }\n \n initPreviewTooltip(options = {}) {\n if (this.previewTooltip || this.previewTooltipPromise) {\n return;\n }\n // Dynamically import and create preview tooltip\n this.previewTooltipPromise = import('./preview_tooltip.js').then(module => {\n const config = { modelType: this.modelType, ...options };\n this.previewTooltip = new module.PreviewTooltip(config);\n }).catch(err => {\n console.warn('Failed to load preview tooltip:', err);\n }).finally(() => {\n this.previewTooltipPromise = null;\n });\n }\n \n bindEvents() {\n // Handle input changes\n this.onInput = (e) => {\n if (this.suppressAutocompleteOnce) {\n this.suppressAutocompleteOnce = false;\n this.hide();\n return;\n }\n this.handleInput(e.target.value);\n };\n this.inputElement.addEventListener('input', this.onInput);\n\n // Handle keyboard navigation\n this.onKeyDown = (e) => {\n this.handleKeyDown(e);\n };\n this.inputElement.addEventListener('keydown', this.onKeyDown);\n\n // Handle focus out to hide dropdown\n this.onBlur = () => {\n if (getAutocompleteAutoFormatPreference()) {\n const formattedValue = formatAutocompleteTextOnBlur(this.inputElement.value);\n if (formattedValue !== this.inputElement.value) {\n this.inputElement.value = formattedValue;\n this.suppressAutocompleteOnce = true;\n this.inputElement.dispatchEvent(new Event('input', { bubbles: true }));\n }\n }\n\n // Delay hiding to allow for clicks on dropdown items\n setTimeout(() => {\n this.hide();\n }, 150);\n };\n this.inputElement.addEventListener('blur', this.onBlur);\n\n // Handle clicks outside to hide dropdown\n this.onDocumentClick = (e) => {\n if (!this.dropdown) {\n return;\n }\n\n const target = e.target;\n if (!(target instanceof Node)) {\n return;\n }\n\n if (!this.dropdown.contains(target) && target !== this.inputElement) {\n this.hide();\n }\n };\n document.addEventListener('click', this.onDocumentClick);\n\n // Mark this element as having autocomplete events bound\n this.inputElement._autocompleteEventsBound = true;\n\n // Bind scroll event for virtual scrolling\n if (this.options.enableVirtualScroll && this.scrollContainer) {\n this.onScroll = () => {\n this.handleScroll();\n };\n this.scrollContainer.addEventListener('scroll', this.onScroll);\n }\n }\n\n /**\n * Check if the autocomplete is valid (input element is in DOM and events are bound)\n */\n isValid() {\n return this.inputElement &&\n document.body.contains(this.inputElement) &&\n this.inputElement._autocompleteEventsBound === true;\n }\n\n /**\n * Check if events need to be rebound (element exists but events not bound)\n */\n needsRebind() {\n return this.inputElement &&\n document.body.contains(this.inputElement) &&\n this.inputElement._autocompleteEventsBound !== true;\n }\n\n /**\n * Rebind events to the input element (useful after Vue moves the element)\n */\n rebindEvents() {\n // Remove old listeners if they exist\n if (this.onInput) {\n this.inputElement.removeEventListener('input', this.onInput);\n }\n if (this.onKeyDown) {\n this.inputElement.removeEventListener('keydown', this.onKeyDown);\n }\n if (this.onBlur) {\n this.inputElement.removeEventListener('blur', this.onBlur);\n }\n\n // Rebind all events\n this.bindEvents();\n\n console.log('[Lora Manager] Autocomplete events rebound');\n }\n\n /**\n * Refresh the TextAreaCaretHelper (useful after element properties change)\n */\n refreshHelper() {\n if (this.inputElement && document.body.contains(this.inputElement)) {\n this.helper = new TextAreaCaretHelper(this.inputElement, () => app.canvas.ds.scale);\n }\n }\n \n handleInput(value = '') {\n // Clear previous debounce timer\n if (this.debounceTimer) {\n clearTimeout(this.debounceTimer);\n }\n\n // Get the search term (text after last comma / '>')\n const rawSearchTerm = this.getSearchTerm(value);\n let searchTerm = rawSearchTerm;\n let endpoint = `/lm/${this.modelType}/relative-paths`;\n\n // For embeddings, only trigger autocomplete when the current token\n // starts with the explicit \"emb:\" prefix. This avoids interrupting\n // normal prompt typing while still allowing quick manual triggering.\n if (this.modelType === 'embeddings') {\n const match = rawSearchTerm.match(/^emb:(.*)$/i);\n if (!match) {\n this.hide();\n return;\n }\n searchTerm = (match[1] || '').trim();\n }\n\n // For loras model type, check if we're in command mode (/activefilters, /noactivefilters)\n if (this.modelType === 'loras') {\n const commandResult = this._parseCommandInput(rawSearchTerm);\n\n if (commandResult.showCommands) {\n // Show command list dropdown\n this.showingCommands = true;\n this.activeCommand = null;\n this.searchType = 'commands';\n this._showCommandList(commandResult.commandFilter);\n return;\n } else if (commandResult.command?.type === 'toggle_setting') {\n // Handle toggle setting command (/activefilters, /noactivefilters)\n this._handleToggleSettingCommand(commandResult.command);\n return;\n } else if (commandResult.command) {\n // Command is active, use filtered search\n this.showingCommands = false;\n this.activeCommand = null;\n this.searchType = null;\n searchTerm = commandResult.searchTerm || rawSearchTerm;\n } else {\n // No command - regular lora search\n this.showingCommands = false;\n this.activeCommand = null;\n this.searchType = null;\n searchTerm = rawSearchTerm;\n }\n }\n\n // For prompt model type, check if we're searching embeddings, commands, or tags\n if (this.modelType === 'prompt') {\n const match = rawSearchTerm.match(/^emb:(.*)$/i);\n if (match) {\n // User typed \"emb:\" prefix - always allow embeddings search\n endpoint = '/lm/embeddings/relative-paths';\n searchTerm = (match[1] || '').trim();\n this.searchType = 'embeddings';\n this.activeCommand = null;\n this.showingCommands = false;\n } else {\n // Check for command mode FIRST (always runs, regardless of setting)\n const commandResult = this._parseCommandInput(rawSearchTerm);\n\n if (commandResult.showCommands) {\n // Show command list dropdown\n this.showingCommands = true;\n this.activeCommand = null;\n this.searchType = 'commands';\n this._showCommandList(commandResult.commandFilter);\n return;\n } else if (commandResult.command?.type === 'toggle_setting') {\n // Handle toggle setting command (/autocomplete, /noautocomplete)\n this._handleToggleSettingCommand(commandResult.command);\n return;\n } else if (commandResult.command) {\n // Command is active, use filtered search\n this.showingCommands = false;\n this.activeCommand = commandResult.command;\n searchTerm = commandResult.searchTerm;\n\n if (commandResult.command.type === 'embedding') {\n // /emb or /embedding command\n endpoint = '/lm/embeddings/relative-paths';\n this.searchType = 'embeddings';\n } else if (isWildcardCommand(commandResult.command)) {\n endpoint = getWildcardSearchEndpoint();\n this.searchType = 'wildcards';\n } else {\n // Category filter command\n const categories = commandResult.command.categories.join(',');\n endpoint = `/lm/custom-words/search?category=${categories}`;\n this.searchType = 'custom_words';\n }\n } else if (getPromptTagAutocompletePreference()) {\n // No command and setting enabled - regular tag search with enriched results\n this.showingCommands = false;\n this.activeCommand = null;\n endpoint = '/lm/custom-words/search?enriched=true';\n // Use full search term for query variation generation\n // The search() method will generate multiple query variations including:\n // - Original query (for natural language matching)\n // - Underscore version (e.g., \"looking_to_the_side\" for \"looking to the side\")\n // - Last token (for backward compatibility with continuous typing)\n searchTerm = rawSearchTerm;\n this.searchType = 'custom_words';\n } else {\n // No command and setting disabled - no autocomplete for direct typing.\n // Re-enable discovery is covered by the command-list footer,\n // the node context menu and the settings tooltip.\n this.hide();\n return;\n }\n }\n }\n\n const allowEmptyWildcardSearch =\n this.modelType === 'prompt' &&\n this.searchType === 'wildcards' &&\n searchTerm.length === 0;\n\n if (!allowEmptyWildcardSearch && searchTerm.length < this.options.minChars) {\n this.hide();\n return;\n }\n\n // Debounce the search\n this.debounceTimer = setTimeout(() => {\n this.search(searchTerm, endpoint);\n }, this.options.debounceDelay);\n }\n \n getSearchTerm(value) {\n return this.getActiveSearchRange(value).text;\n }\n\n getActiveSearchRange(value = null) {\n const currentValue = typeof value === 'string' ? value : this.inputElement.value;\n const caretPos = this.getCaretPosition();\n const beforeCursor = this.helper.getBeforeCursor() ?? currentValue.substring(0, caretPos);\n let start = this._getHardBoundaryStart(beforeCursor);\n\n if (!getAutocompleteAppendCommaPreference()) {\n const persistedBoundaryEnd = this._getPersistedBoundaryEnd(currentValue, caretPos);\n if (persistedBoundaryEnd !== null && persistedBoundaryEnd > start) {\n start = persistedBoundaryEnd;\n }\n }\n\n const rawText = beforeCursor.substring(start);\n const leadingWhitespaceLength = rawText.length - rawText.trimStart().length;\n const trimmedStart = start + leadingWhitespaceLength;\n const text = rawText.trim();\n\n if (this.modelType === 'prompt') {\n const tokenRange = this._getPromptTokenRange(rawText, trimmedStart, caretPos);\n if (tokenRange) {\n return {\n start: tokenRange.start,\n trimmedStart: tokenRange.trimmedStart,\n end: caretPos,\n beforeCursor,\n rawText: tokenRange.rawText,\n text: tokenRange.text,\n tokenType: tokenRange.tokenType,\n };\n }\n }\n\n return {\n start,\n trimmedStart,\n end: caretPos,\n beforeCursor,\n rawText,\n text,\n };\n }\n\n _getPromptTokenRange(rawText = '', trimmedStart = 0, caretPos = 0) {\n const trimmedText = rawText.trim();\n if (!trimmedText) {\n return {\n start: trimmedStart,\n trimmedStart,\n rawText: '',\n text: '',\n tokenType: 'empty',\n };\n }\n\n const commandOffset = trimmedText.startsWith('/')\n ? 0\n : trimmedText.lastIndexOf(' /');\n if (commandOffset !== -1) {\n const normalizedCommandOffset = commandOffset === 0 ? 0 : commandOffset + 1;\n const commandText = trimmedText.slice(normalizedCommandOffset);\n const commandStart = trimmedStart + normalizedCommandOffset;\n return {\n start: commandStart,\n trimmedStart: commandStart,\n rawText: commandText,\n text: commandText,\n tokenType: commandText === '/' ? 'empty_command_trigger' : 'command',\n };\n }\n\n const wildcardMatch = trimmedText.match(/(?:^|\\s)(__[\\w\\s.\\-+/*\\\\]+?__)$/);\n if (wildcardMatch) {\n const wildcardText = wildcardMatch[1];\n const wildcardOffset = trimmedText.lastIndexOf(wildcardText);\n const wildcardStart = trimmedStart + wildcardOffset;\n return {\n start: wildcardStart,\n trimmedStart: wildcardStart,\n rawText: wildcardText,\n text: '',\n tokenType: 'wildcard_literal',\n };\n }\n\n const embeddingOffset = trimmedText.search(/(?:^|\\s)emb:[^\\s]*$/i);\n if (embeddingOffset !== -1) {\n const normalizedEmbeddingOffset = trimmedText.slice(embeddingOffset).startsWith(' ')\n ? embeddingOffset + 1\n : embeddingOffset;\n const embeddingText = trimmedText.slice(normalizedEmbeddingOffset);\n const embeddingStart = trimmedStart + normalizedEmbeddingOffset;\n return {\n start: embeddingStart,\n trimmedStart: embeddingStart,\n rawText: embeddingText,\n text: embeddingText,\n tokenType: 'embedding_literal',\n };\n }\n\n return {\n start: trimmedStart,\n trimmedStart,\n rawText,\n text: trimmedText,\n tokenType: 'tag_text',\n };\n }\n\n _getHardBoundaryStart(beforeCursor = '') {\n const lastComma = beforeCursor.lastIndexOf(',');\n const lastAngle = beforeCursor.lastIndexOf('>');\n const lastNewline = Math.max(beforeCursor.lastIndexOf('\\n'), beforeCursor.lastIndexOf('\\r'));\n return Math.max(lastComma, lastAngle, lastNewline) + 1;\n }\n\n _getMetadataWidget() {\n return this.inputElement?._autocompleteMetadataWidget\n ?? this.inputElement?._autocompleteHostWidget?.metadataWidget\n ?? null;\n }\n\n _getMetadataBase() {\n return createAutocompleteMetadataBase(this.inputElement?._autocompleteTextWidgetName ?? 'text');\n }\n\n _getAutocompleteMetadata() {\n const metadataWidget = this._getMetadataWidget();\n const value = metadataWidget?.value;\n\n if (!value || typeof value !== 'object' || Array.isArray(value)) {\n return this._getMetadataBase();\n }\n\n return {\n ...this._getMetadataBase(),\n ...value,\n };\n }\n\n _setAutocompleteMetadata(metadata = {}) {\n const metadataWidget = this._getMetadataWidget();\n if (!metadataWidget) {\n return;\n }\n\n metadataWidget.value = {\n ...this._getMetadataBase(),\n ...metadata,\n };\n }\n\n _clearLastAcceptedBoundary() {\n const metadataWidget = this._getMetadataWidget();\n if (!metadataWidget) {\n return;\n }\n\n const metadata = this._getAutocompleteMetadata();\n delete metadata.lastAccepted;\n metadataWidget.value = metadata;\n }\n\n _storeLastAcceptedBoundary(boundary) {\n this._setAutocompleteMetadata({ lastAccepted: boundary });\n }\n\n _getPersistedBoundaryEnd(currentValue, caretPos) {\n const metadata = this._getAutocompleteMetadata();\n const boundary = metadata?.lastAccepted;\n\n if (!boundary || typeof boundary !== 'object') {\n return null;\n }\n\n const { start, end, insertedText, textSnapshot } = boundary;\n\n if (!Number.isInteger(start) || !Number.isInteger(end) || start < 0 || end < start) {\n this._clearLastAcceptedBoundary();\n return null;\n }\n\n if (end > currentValue.length || end > caretPos) {\n this._clearLastAcceptedBoundary();\n return null;\n }\n\n if (typeof insertedText !== 'string' || insertedText.length === 0) {\n this._clearLastAcceptedBoundary();\n return null;\n }\n\n if (currentValue.slice(start, end) !== insertedText) {\n this._clearLastAcceptedBoundary();\n return null;\n }\n\n if (typeof textSnapshot !== 'string' || currentValue.slice(0, end) !== textSnapshot) {\n this._clearLastAcceptedBoundary();\n return null;\n }\n\n return end;\n }\n\n /**\n * Extract the last space-separated token from a search term\n * Tag names don't contain spaces, so for tag autocomplete we only need the last token\n * @param {string} term - The full search term (e.g., \"hello 1gi\")\n * @returns {string} - The last token (e.g., \"1gi\"), or the original term if no spaces\n */\n _getLastSpaceToken(term) {\n const tokens = term.trim().split(/\\s+/);\n return tokens[tokens.length - 1] || term;\n }\n\n /**\n * Generate query variations for better autocomplete matching\n * Includes original query and normalized versions (spaces to underscores, etc.)\n * @param {string} term - Original search term\n * @returns {string[]} - Array of query variations\n */\n _generateQueryVariations(term) {\n if (!term || term.length < this.options.minChars) {\n return [];\n }\n\n const variations = new Set();\n const trimmed = term.trim();\n\n // Always include original query\n variations.add(trimmed);\n variations.add(trimmed.toLowerCase());\n\n // Add underscore version (Danbooru convention: spaces become underscores)\n // e.g., \"looking to the side\" -> \"looking_to_the_side\"\n if (trimmed.includes(' ')) {\n const underscoreVersion = trimmed.replace(/ /g, '_');\n variations.add(underscoreVersion);\n variations.add(underscoreVersion.toLowerCase());\n }\n\n // Add no-space version for flexible matching\n // e.g., \"blue hair\" -> \"bluehair\"\n if (trimmed.includes(' ') || trimmed.includes('_')) {\n const noSpaceVersion = trimmed.replace(/[ _]/g, '');\n variations.add(noSpaceVersion);\n variations.add(noSpaceVersion.toLowerCase());\n }\n\n // Add last token only (legacy behavior for continuous typing)\n const lastToken = this._getLastSpaceToken(trimmed);\n if (lastToken !== trimmed) {\n variations.add(lastToken);\n variations.add(lastToken.toLowerCase());\n }\n\n return Array.from(variations).filter(v => v.length >= this.options.minChars);\n }\n\n _normalizeQueryForRequest(term = '') {\n return term.trim().toLowerCase();\n }\n\n _getQueriesToExecute(term = '') {\n const queryVariations = this._generateQueryVariations(term);\n const uniqueQueries = [];\n const seen = new Set();\n\n for (const query of queryVariations) {\n const normalized = this._normalizeQueryForRequest(query);\n if (!normalized || seen.has(normalized)) {\n continue;\n }\n\n seen.add(normalized);\n uniqueQueries.push(query);\n\n if (uniqueQueries.length >= 4) {\n break;\n }\n }\n\n return uniqueQueries;\n }\n\n _containsInformationalItems() {\n return this.items.some((item) => isWildcardInfoItem(item));\n }\n\n _isSelectableInfoItem(item) {\n if (isWildcardInfoItem(item)) {\n return true;\n }\n // Command items are not model paths — never show preview for them\n return item && typeof item === 'object' && 'command' in item;\n }\n\n /**\n * Get display text for an item (without extension for models)\n * @param {string|Object} item - Item to get display text from\n * @returns {string} - Display text without extension\n */\n _getDisplayText(item) {\n if (isWildcardInfoItem(item)) {\n return item.title || item.description || 'Wildcards';\n }\n\n const itemText = typeof item === 'object' && item.tag_name ? item.tag_name : String(item);\n // Remove extension for models to avoid matching/displaying .safetensors etc.\n if (this.modelType === 'loras' || this.searchType === 'embeddings') {\n return removeLoraExtension(itemText);\n } else if (this.modelType === 'embeddings') {\n return removeGeneralExtension(itemText);\n }\n return itemText;\n }\n\n /**\n * Check if an item matches a search term\n * Supports both string items and enriched items with tag_name property\n * @param {string|Object} item - Item to check\n * @param {string} searchTerm - Search term to match against\n * @returns {Object} - { matched: boolean, isExactMatch: boolean }\n */\n _matchItem(item, searchTerm) {\n const itemText = this._getDisplayText(item);\n const itemTextLower = itemText.toLowerCase();\n const searchTermLower = searchTerm.toLowerCase();\n\n // Exact match (case-insensitive)\n if (itemTextLower === searchTermLower) {\n return { matched: true, isExactMatch: true };\n }\n\n // Partial match (contains)\n if (itemTextLower.includes(searchTermLower)) {\n return { matched: true, isExactMatch: false };\n }\n\n // Symbol-insensitive match: remove common separators and retry\n // e.g., \"blue hair\" can match \"blue_hair\" or \"bluehair\"\n const normalizedItem = itemTextLower.replace(/[-_\\s']/g, '');\n const normalizedSearch = searchTermLower.replace(/[-_\\s']/g, '');\n if (normalizedItem.includes(normalizedSearch)) {\n return { matched: true, isExactMatch: false };\n }\n\n return { matched: false, isExactMatch: false };\n }\n\n _getLiveSearchTermForAcceptance() {\n const rawSearchTerm = this.getSearchTerm(this.inputElement.value);\n\n if (this.modelType === 'embeddings') {\n const match = rawSearchTerm.match(/^emb:(.*)$/i);\n return (match?.[1] || '').trim();\n }\n\n if (this.modelType === 'loras') {\n const commandResult = this._parseCommandInput(rawSearchTerm);\n return commandResult.searchTerm ?? rawSearchTerm;\n }\n\n if (this.modelType === 'prompt') {\n const embeddingMatch = rawSearchTerm.match(/^emb:(.*)$/i);\n if (embeddingMatch) {\n return (embeddingMatch[1] || '').trim();\n }\n\n const commandResult = this._parseCommandInput(rawSearchTerm);\n return commandResult.searchTerm ?? rawSearchTerm;\n }\n\n return rawSearchTerm;\n }\n\n _getPreferredSelectedIndex(searchTerm = '') {\n if (!this.items?.length) {\n return -1;\n }\n\n if (this.showingCommands) {\n if (this.selectedIndex >= 0 && this.selectedIndex < this.items.length) {\n return this.selectedIndex;\n }\n return 0;\n }\n\n const trimmedSearchTerm = searchTerm.trim();\n if (!trimmedSearchTerm) {\n if (this.selectedIndex >= 0 && this.selectedIndex < this.items.length) {\n return this.selectedIndex;\n }\n return 0;\n }\n\n const searchLower = trimmedSearchTerm.toLowerCase();\n const normalizedSearch = normalizeAutocompleteMatchText(trimmedSearchTerm);\n let bestIndex = -1;\n let bestScore = -Infinity;\n\n this.items.forEach((item, index) => {\n const displayText = this._getDisplayText(item);\n const textLower = displayText.toLowerCase();\n const normalizedText = normalizeAutocompleteMatchText(displayText);\n let score = -1;\n\n if (textLower === searchLower) {\n score = 5000;\n } else if (normalizedText === normalizedSearch) {\n score = 4500;\n } else if (textLower.startsWith(searchLower)) {\n score = 4000;\n } else if (normalizedText.startsWith(normalizedSearch)) {\n score = 3500;\n } else if (textLower.includes(searchLower)) {\n score = 3000;\n } else if (normalizedText.includes(normalizedSearch)) {\n score = 2500;\n }\n\n if (score > -1) {\n score -= index;\n if (score > bestScore) {\n bestScore = score;\n bestIndex = index;\n }\n }\n });\n\n if (bestIndex !== -1) {\n return bestIndex;\n }\n\n if (this.selectedIndex >= 0 && this.selectedIndex < this.items.length) {\n return this.selectedIndex;\n }\n\n return 0;\n }\n\n _getAcceptSelectionIndex(searchTerm = '') {\n if (this.hasManualSelection && this.selectedIndex >= 0 && this.selectedIndex < this.items.length) {\n return this.selectedIndex;\n }\n\n return this._getPreferredSelectedIndex(searchTerm);\n }\n\n /**\n * Return the query flag that tells the backend to inject the LoRA Manager\n * page's active filters (stored server-side) into the search, or null when\n * not applicable. The filters themselves are synced to the backend by the\n * manager page, so this works across browsers/origins where localStorage\n * is not shared.\n */\n _getActiveLoraFilters() {\n if (this.modelType !== 'loras' || !getLoraActiveFiltersAutocompletePreference()) {\n return null;\n }\n return 'use_active_filters=true';\n }\n\n async search(term = '', endpoint = null) {\n try {\n this.currentSearchTerm = term;\n\n // Save current search type to detect mode changes during async search\n const searchTypeAtStart = this.searchType;\n\n // Clear items before starting new search to avoid stale data\n // This is critical for preventing command suggestions from persisting\n // when switching from command mode to regular tag search\n this.items = [];\n this.wildcardMeta = null;\n\n if (!endpoint) {\n endpoint = `/lm/${this.modelType}/relative-paths`;\n }\n\n // Active-filter query params for loras (null when setting off or\n // model type is not loras, so appending is safe for all types)\n const activeFiltersQuery = this._getActiveLoraFilters();\n\n // Generate multiple query variations for better matching, but avoid\n // sending duplicate-equivalent requests that normalize to the same\n // backend search term.\n const queriesToExecute =\n this.searchType === 'wildcards' && term.length === 0\n ? ['']\n : this._getQueriesToExecute(term);\n\n if (queriesToExecute.length === 0) {\n this.items = [];\n this.hide();\n return;\n }\n\n // Execute all queries in parallel\n const searchPromises = queriesToExecute.map(async (query) => {\n const url = endpoint.includes('?')\n ? `${endpoint}&search=${encodeURIComponent(query)}&limit=${this.options.maxItems}`\n : `${endpoint}?search=${encodeURIComponent(query)}&limit=${this.options.maxItems}`;\n const finalUrl = activeFiltersQuery ? `${url}&${activeFiltersQuery}` : url;\n\n try {\n const response = await api.fetchApi(finalUrl);\n const data = await response.json();\n return {\n items: data.success ? (data.relative_paths || data.words || []) : [],\n meta: data?.meta || null,\n };\n } catch (error) {\n console.warn(`Search query failed for \"${query}\":`, error);\n return {\n items: [],\n meta: null,\n };\n }\n });\n\n const resultsArrays = await Promise.all(searchPromises);\n\n // Check if search type changed during async operation\n // If so, skip updating items to prevent stale data from showing\n if (this.searchType !== searchTypeAtStart) {\n console.log('[Lora Manager] Search type changed during search, skipping update');\n return;\n }\n\n // Merge and deduplicate results while preserving order from backend\n // Backend returns results grouped by folder and sorted by relevance\n // within each group, so we maintain that order\n const seen = new Set();\n const mergedItems = [];\n\n for (const result of resultsArrays) {\n if (!this.wildcardMeta && result?.meta) {\n this.wildcardMeta = result.meta;\n }\n\n const resultArray = result?.items || [];\n for (const item of resultArray) {\n const itemKey = typeof item === 'object' && item.tag_name\n ? item.tag_name.toLowerCase()\n : String(item).toLowerCase();\n\n if (!seen.has(itemKey)) {\n seen.add(itemKey);\n mergedItems.push(item);\n }\n }\n }\n\n if (this.searchType === 'wildcards' && mergedItems.length === 0) {\n const meta = this.wildcardMeta || {};\n this.items = meta.has_wildcards\n ? [createWildcardNoMatchesItem(term, meta)]\n : [createWildcardEmptyStateItem(meta)];\n this.hasMoreItems = false;\n this.render();\n this.show();\n return;\n }\n\n // Use backend-sorted results directly without re-scoring\n // Backend already ranks by: FTS5 bm25 score + post count + exact prefix boost\n if (mergedItems.length > 0) {\n this.items = mergedItems;\n this.render();\n this.show();\n } else {\n this.items = [];\n this.hide();\n }\n } catch (error) {\n console.error('Autocomplete search error:', error);\n this.items = [];\n this.hide();\n }\n }\n\n /**\n * Return the command map for the current model type.\n * Lora model types get the active-filters toggle commands, all others\n * keep the prompt tag commands.\n */\n _getCommands() {\n return this.modelType === 'loras' ? LORAS_COMMANDS : TAG_COMMANDS;\n }\n\n /**\n * Parse command input to detect command mode\n * @param {string} rawInput - Raw input text\n * @returns {Object} - { showCommands, commandFilter, command, searchTerm }\n */\n _parseCommandInput(rawInput) {\n const trimmed = rawInput.trim();\n\n // Check if input starts with \"/\"\n if (!trimmed.startsWith('/')) {\n return { showCommands: false, command: null, searchTerm: trimmed };\n }\n\n // Split into potential command and search term\n const spaceIndex = trimmed.indexOf(' ');\n\n if (spaceIndex === -1) {\n // Still typing command (e.g., \"/cha\")\n const partialCommand = trimmed.toLowerCase();\n\n // Check for exact command match\n if (this._getCommands()[partialCommand]) {\n const cmd = this._getCommands()[partialCommand];\n // Filter out toggle commands that don't meet their condition\n if (cmd.type === 'toggle_setting' && cmd.condition && !cmd.condition()) {\n return { showCommands: false, command: null, searchTerm: '' };\n }\n return {\n showCommands: false,\n command: cmd,\n searchTerm: '',\n };\n }\n\n // Show command suggestions\n return {\n showCommands: true,\n commandFilter: partialCommand.slice(1), // Remove leading \"/\"\n command: null,\n searchTerm: '',\n };\n }\n\n // Command with search term (e.g., \"/character miku\")\n const commandPart = trimmed.slice(0, spaceIndex).toLowerCase();\n const searchPart = trimmed.slice(spaceIndex + 1).trim();\n\n if (this._getCommands()[commandPart]) {\n const cmd = this._getCommands()[commandPart];\n // Filter out toggle commands that don't meet their condition\n if (cmd.type === 'toggle_setting' && cmd.condition && !cmd.condition()) {\n return { showCommands: false, command: null, searchTerm: trimmed };\n }\n return {\n showCommands: false,\n command: cmd,\n searchTerm: searchPart,\n };\n }\n\n // Unknown command, treat as regular search\n return { showCommands: false, command: null, searchTerm: trimmed };\n }\n\n /**\n * Show the command list dropdown\n * @param {string} filter - Optional filter for commands\n */\n _showCommandList(filter = '') {\n // Only show command list if we're in command mode\n // This prevents stale command suggestions from appearing after switching to tag search\n if (this.searchType !== 'commands' && this.showingCommands !== true) {\n return;\n }\n \n const filterLower = filter.toLowerCase();\n\n const commands = [];\n\n for (const [cmd, info] of Object.entries(this._getCommands())) {\n // Filter out toggle commands that don't meet their condition\n if (info.type === 'toggle_setting' && info.condition) {\n if (!info.condition()) continue;\n }\n\n if (!filter || cmd.slice(1).startsWith(filterLower)) {\n commands.push({ command: cmd, ...info });\n }\n }\n\n if (commands.length === 0) {\n this.hide();\n return;\n }\n\n this.items = commands;\n this._renderCommandList();\n this.show();\n }\n\n /**\n * Render the command list dropdown\n */\n _renderCommandList() {\n // Clear command list items properly based on rendering mode\n if (this.contentContainer) {\n // Virtual scrolling mode - clear content container\n this.contentContainer.innerHTML = '';\n } else {\n // Non-virtual scrolling mode - clear dropdown direct children\n this.dropdown.innerHTML = '';\n }\n this.selectedIndex = -1;\n this.hasManualSelection = false;\n\n this.items.forEach((item, index) => {\n const itemEl = document.createElement('div');\n itemEl.className = 'comfy-autocomplete-item comfy-autocomplete-command';\n itemEl.dataset.index = index.toString();\n\n const cmdSpan = document.createElement('span');\n cmdSpan.className = 'lm-autocomplete-command-name';\n cmdSpan.textContent = item.command;\n\n const labelSpan = document.createElement('span');\n labelSpan.className = 'lm-autocomplete-command-label';\n labelSpan.textContent = item.label;\n\n itemEl.appendChild(cmdSpan);\n itemEl.appendChild(labelSpan);\n\n itemEl.style.cssText = `\n padding: 8px 12px;\n cursor: pointer;\n color: rgba(226, 232, 240, 0.8);\n border-bottom: 1px solid rgba(226, 232, 240, 0.1);\n transition: all 0.2s ease;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n display: flex;\n justify-content: space-between;\n align-items: center;\n gap: 12px;\n height: ${this.options.itemHeight}px;\n box-sizing: border-box;\n `;\n\n // Prevent textarea from losing focus - same fix as createItemElement\n itemEl.addEventListener('mousedown', (e) => {\n e.preventDefault();\n });\n\n itemEl.addEventListener('mouseenter', () => {\n this.selectItem(index, { manual: true });\n });\n\n itemEl.addEventListener('click', () => {\n this._insertCommand(item.command);\n });\n\n // Append to correct container based on rendering mode\n if (this.contentContainer) {\n this.contentContainer.appendChild(itemEl);\n } else {\n this.dropdown.appendChild(itemEl);\n }\n });\n\n // Remove border from last item\n const lastChild = this.contentContainer ? this.contentContainer.lastChild : this.dropdown.lastChild;\n if (lastChild) {\n lastChild.style.borderBottom = 'none';\n }\n\n // Auto-select immediately so accept keys remain stable.\n // In virtual-scroll mode, calling selectItem() before the dropdown is\n // visible can see a zero-height container and incorrectly replace the\n // full command list with a partially virtualized slice.\n if (this.items.length > 0) {\n this.selectedIndex = 0;\n this.hasManualSelection = false;\n if (this.contentContainer) {\n this._applyItemSelection(0);\n } else {\n this.selectItem(0);\n }\n }\n\n // State hint below the command list (e.g. how to toggle autocomplete)\n this._renderCommandListFooter();\n\n // Update virtual scroll height for virtual scrolling mode\n if (this.contentContainer) {\n this.updateVirtualScrollHeight();\n }\n }\n\n /**\n * Render a state hint below the slash command list so the toggle commands\n * explain themselves. Prompt nodes advertise /autocomplete, loras nodes\n * advertise /activefilters.\n */\n _renderCommandListFooter() {\n this._removeCommandListFooter();\n\n let text = null;\n if (this.modelType === 'prompt') {\n const enabled = getPromptTagAutocompletePreference();\n text = enabled\n ? 'Tag autocomplete is ON — /noautocomplete to disable'\n : 'Tag autocomplete is OFF — /autocomplete to enable';\n } else if (this.modelType === 'loras') {\n const enabled = getLoraActiveFiltersAutocompletePreference();\n text = enabled\n ? 'Active Filters Search: ON — /noactivefilters to disable'\n : 'Active Filters Search: OFF — /activefilters to enable';\n } else {\n return;\n }\n\n const footer = document.createElement('div');\n footer.className = 'lm-autocomplete-command-footer';\n footer.textContent = text;\n footer.style.cssText = `\n padding: 6px 12px;\n font-size: 11px;\n color: rgba(226, 232, 240, 0.5);\n border-top: 1px solid rgba(226, 232, 240, 0.1);\n white-space: nowrap;\n `;\n // Keep focus in the textarea when the hint is clicked\n footer.addEventListener('mousedown', (e) => e.preventDefault());\n\n this.dropdown.appendChild(footer);\n this.commandListFooter = footer;\n }\n\n _removeCommandListFooter() {\n if (this.commandListFooter) {\n this.commandListFooter.remove();\n this.commandListFooter = null;\n }\n }\n\n /**\n * Show a one-time, dismissible hint inside the dropdown surfacing the\n * toggle commands: prompt nodes advertise /noautocomplete, loras nodes\n * advertise /activefilters. Dismissal is persisted in localStorage.\n */\n _maybeShowFirstRunHint() {\n if (this.firstRunHint) {\n return;\n }\n\n let hintText = null;\n let storageKey = null;\n\n if (this.modelType === 'prompt') {\n // Only hint during plain tag searches, not command/embedding modes\n if (this.showingCommands\n || this.searchType !== 'custom_words'\n || this.activeCommand) {\n return;\n }\n hintText = 'Tip: type /noautocomplete to turn off these suggestions';\n storageKey = FIRST_RUN_HINT_DISMISSED_KEY;\n } else if (this.modelType === 'loras') {\n // Only advertise active-filters search while it is disabled\n if (this.showingCommands || this.activeCommand) {\n return;\n }\n if (getLoraActiveFiltersAutocompletePreference()) {\n return;\n }\n hintText = 'Tip: type /activefilters to search within the LoRA Manager page filters';\n storageKey = ACTIVE_FILTERS_HINT_DISMISSED_KEY;\n } else {\n return;\n }\n\n let dismissed = false;\n try {\n dismissed = localStorage.getItem(storageKey) === '1';\n } catch (e) {\n // localStorage unavailable - fall through and show the hint\n }\n if (dismissed) {\n return;\n }\n\n const hint = document.createElement('div');\n hint.className = 'lm-autocomplete-first-run-hint';\n hint.style.cssText = `\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 8px;\n padding: 6px 12px;\n font-size: 11px;\n color: rgba(226, 232, 240, 0.6);\n border-bottom: 1px solid rgba(226, 232, 240, 0.1);\n `;\n\n const text = document.createElement('span');\n text.textContent = hintText;\n\n const closeBtn = document.createElement('button');\n closeBtn.type = 'button';\n closeBtn.textContent = '×';\n closeBtn.title = 'Dismiss';\n closeBtn.style.cssText = `\n background: none;\n border: none;\n color: rgba(226, 232, 240, 0.5);\n cursor: pointer;\n font-size: 14px;\n line-height: 1;\n padding: 0 2px;\n `;\n closeBtn.addEventListener('click', () => {\n try {\n localStorage.setItem(storageKey, '1');\n } catch (e) {\n }\n this._removeFirstRunHint();\n });\n\n hint.appendChild(text);\n hint.appendChild(closeBtn);\n // Keep focus in the textarea when interacting with the hint\n hint.addEventListener('mousedown', (e) => e.preventDefault());\n\n this.dropdown.insertBefore(hint, this.dropdown.firstChild);\n this.firstRunHint = hint;\n }\n\n _removeFirstRunHint() {\n if (this.firstRunHint) {\n this.firstRunHint.remove();\n this.firstRunHint = null;\n }\n }\n\n /**\n * Insert a command into the input\n * @param {string} command - The command to insert (e.g., \"/character\")\n */\n _insertCommand(command) {\n const currentValue = this.inputElement.value;\n const activeRange = this.getActiveSearchRange(currentValue);\n const commandStartPos = activeRange.trimmedStart;\n\n // Insert command with trailing space\n const insertText = command + ' ';\n const newValue = currentValue.substring(0, commandStartPos) + insertText + currentValue.substring(activeRange.end);\n const newCaretPos = commandStartPos + insertText.length;\n\n this.inputElement.value = newValue;\n\n // Trigger input event\n const event = new Event('input', { bubbles: true });\n this.inputElement.dispatchEvent(event);\n\n this.hide();\n\n // Focus and position cursor\n this.inputElement.focus();\n this.inputElement.setSelectionRange(newCaretPos, newCaretPos);\n }\n\n render() {\n this.selectedIndex = -1;\n this.hasManualSelection = false;\n\n // Command-list state hints do not belong to regular search results\n this._removeCommandListFooter();\n\n // Reset virtual scroll state\n this.virtualScrollOffset = 0;\n this.currentPage = 0;\n this.hasMoreItems = true;\n this.isLoadingMore = false;\n\n // Early return if no items to prevent empty dropdown\n if (!this.items || this.items.length === 0) {\n if (this.contentContainer) {\n this.contentContainer.innerHTML = '';\n } else {\n this.dropdown.innerHTML = '';\n }\n return;\n }\n\n if (this.options.enableVirtualScroll && this.contentContainer) {\n // Use virtual scrolling - always update visible items to ensure content is fresh\n // The dropdown visibility is controlled by show()/hide()\n this.updateVirtualScrollHeight();\n this.updateVisibleItems();\n } else {\n // Traditional rendering (fallback)\n this.dropdown.innerHTML = '';\n\n // Check if items are enriched (have tag_name, category, post_count) or command objects\n const isEnriched = this.items[0] && typeof this.items[0] === 'object' && 'tag_name' in this.items[0];\n const isCommand = this.items[0] && typeof this.items[0] === 'object' && 'command' in this.items[0];\n\n this.items.forEach((itemData, index) => {\n const item = this.createItemElement(itemData, index, isEnriched, isCommand);\n this.dropdown.appendChild(item);\n });\n\n // Remove border from last item\n if (this.dropdown.lastChild) {\n this.dropdown.lastChild.style.borderBottom = 'none';\n }\n }\n\n // Auto-select immediately so accept keys do not fall through\n // to native focus traversal while the dropdown is visible.\n if (this.items.length > 0) {\n this.selectItem(0);\n }\n }\n\n /**\n * Render an enriched autocomplete item with category badge and post count\n * @param {HTMLElement} itemEl - The item element to populate\n * @param {Object} itemData - The enriched item data { tag_name, category, post_count, matched_alias? }\n * @param {string} searchTerm - The current search term for highlighting\n */\n _renderEnrichedItem(itemEl, itemData, searchTerm) {\n // Create name span with highlighted match\n const nameSpan = document.createElement('span');\n nameSpan.className = 'lm-autocomplete-name';\n\n // If matched via alias, show: \"tag_name ← alias\" with alias highlighted\n if (itemData.matched_alias) {\n const tagText = document.createTextNode(itemData.tag_name + ' ');\n nameSpan.appendChild(tagText);\n\n const aliasSpan = document.createElement('span');\n aliasSpan.className = 'lm-matched-alias';\n aliasSpan.innerHTML = '← ' + this.highlightMatch(itemData.matched_alias, searchTerm);\n aliasSpan.style.cssText = `\n font-size: 11px;\n color: rgba(226, 232, 240, 0.5);\n `;\n nameSpan.appendChild(aliasSpan);\n } else {\n nameSpan.innerHTML = this.highlightMatch(itemData.tag_name, searchTerm);\n }\n\n nameSpan.style.cssText = `\n flex: 1;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n `;\n\n // Create meta container for count and badge\n const metaSpan = document.createElement('span');\n metaSpan.className = 'lm-autocomplete-meta';\n metaSpan.style.cssText = `\n display: flex;\n align-items: center;\n gap: 8px;\n flex-shrink: 0;\n `;\n\n // Add post count\n if (itemData.post_count > 0) {\n const countSpan = document.createElement('span');\n countSpan.className = 'lm-autocomplete-count';\n countSpan.textContent = formatPostCount(itemData.post_count);\n countSpan.style.cssText = `\n font-size: 11px;\n color: rgba(226, 232, 240, 0.5);\n `;\n metaSpan.appendChild(countSpan);\n }\n\n // Add category badge\n const categoryInfo = CATEGORY_INFO[itemData.category];\n if (categoryInfo) {\n const badgeSpan = document.createElement('span');\n badgeSpan.className = 'lm-autocomplete-category';\n badgeSpan.textContent = categoryInfo.label;\n badgeSpan.style.cssText = `\n font-size: 10px;\n padding: 2px 6px;\n border-radius: 10px;\n background: ${categoryInfo.bg};\n color: ${categoryInfo.text};\n white-space: nowrap;\n `;\n metaSpan.appendChild(badgeSpan);\n }\n\n itemEl.appendChild(nameSpan);\n itemEl.appendChild(metaSpan);\n }\n\n _renderInformationalItem(itemEl, itemData) {\n itemEl.classList.add('comfy-autocomplete-info-item');\n itemEl.style.cssText = `\n padding: 12px;\n color: rgba(226, 232, 240, 0.88);\n border-bottom: none;\n cursor: default;\n display: block;\n white-space: normal;\n height: auto;\n `;\n\n const title = document.createElement('div');\n title.className = 'lm-autocomplete-info-title';\n title.textContent = itemData.title || 'Wildcards';\n title.style.cssText = `\n font-size: 13px;\n font-weight: 600;\n margin-bottom: 6px;\n `;\n itemEl.appendChild(title);\n\n const description = document.createElement('div');\n description.className = 'lm-autocomplete-info-description';\n description.textContent = itemData.description || '';\n description.style.cssText = `\n font-size: 12px;\n line-height: 1.45;\n color: rgba(226, 232, 240, 0.72);\n `;\n itemEl.appendChild(description);\n\n if (itemData.type === 'wildcard_no_matches') {\n return;\n }\n\n const pathBlock = document.createElement('div');\n pathBlock.style.cssText = `\n margin-top: 10px;\n padding: 8px 10px;\n border-radius: 6px;\n background: rgba(15, 23, 42, 0.6);\n font-size: 11px;\n line-height: 1.5;\n `;\n pathBlock.innerHTML = [\n '
Wildcards folder
',\n `${itemData.wildcardsDir || '(unavailable)'}`,\n `
Supported formats: ${(itemData.supportedFormats || []).join(', ')}
`,\n ].join('');\n itemEl.appendChild(pathBlock);\n\n const examples = document.createElement('div');\n examples.style.cssText = `\n margin-top: 10px;\n font-size: 11px;\n line-height: 1.55;\n color: rgba(226, 232, 240, 0.72);\n `;\n examples.innerHTML = [\n '
Examples
',\n '
animals/cat.txt -> use __animals/cat__
',\n '
colors.yaml with palette: { warm: [red, orange] } -> use __palette/warm__
',\n '
Text files use one option per line. YAML/JSON use nested keys ending in string arrays.
',\n ].join('');\n itemEl.appendChild(examples);\n\n const actions = document.createElement('div');\n actions.style.cssText = `\n display: flex;\n gap: 8px;\n margin-top: 12px;\n flex-wrap: wrap;\n `;\n\n const openButton = document.createElement('button');\n openButton.type = 'button';\n openButton.dataset.action = 'open-wildcards-folder';\n openButton.textContent = 'Open wildcards folder';\n openButton.style.cssText = `\n border: 1px solid rgba(96, 165, 250, 0.45);\n background: rgba(37, 99, 235, 0.18);\n color: #dbeafe;\n border-radius: 6px;\n padding: 6px 10px;\n font-size: 11px;\n cursor: pointer;\n `;\n openButton.addEventListener('click', async (event) => {\n event.preventDefault();\n event.stopPropagation();\n await this._openWildcardsFolder();\n });\n actions.appendChild(openButton);\n\n const copyButton = document.createElement('button');\n copyButton.type = 'button';\n copyButton.dataset.action = 'copy-wildcards-path';\n copyButton.textContent = 'Copy path';\n copyButton.style.cssText = `\n border: 1px solid rgba(226, 232, 240, 0.2);\n background: rgba(148, 163, 184, 0.12);\n color: rgba(226, 232, 240, 0.88);\n border-radius: 6px;\n padding: 6px 10px;\n font-size: 11px;\n cursor: pointer;\n `;\n copyButton.addEventListener('click', async (event) => {\n event.preventDefault();\n event.stopPropagation();\n await this._copyWildcardPath(itemData.wildcardsDir || '');\n });\n actions.appendChild(copyButton);\n\n itemEl.appendChild(actions);\n }\n \n highlightMatch(text, searchTerm) {\n const { include } = parseSearchTokens(searchTerm);\n const sanitizedTokens = include\n .filter(Boolean)\n .map((token) => token.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&'));\n\n if (!sanitizedTokens.length) {\n return text;\n }\n\n const regex = new RegExp(`(${sanitizedTokens.join('|')})`, 'gi');\n return text.replace(\n regex,\n '$1',\n );\n }\n\n async _openWildcardsFolder() {\n try {\n const response = await api.fetchApi('/lm/wildcards/open-location', { method: 'POST' });\n const data = await response.json();\n if (!response.ok || data?.success === false) {\n throw new Error(data?.error || 'Failed to open wildcards folder');\n }\n\n if (data?.mode === 'clipboard' && data?.path) {\n await this._copyWildcardPath(data.path);\n return;\n }\n\n showToast({\n severity: 'success',\n summary: 'Wildcards folder',\n detail: 'Opened wildcards folder.',\n life: 2500,\n });\n } catch (error) {\n console.error('[Lora Manager] Failed to open wildcards folder:', error);\n showToast({\n severity: 'error',\n summary: 'Error',\n detail: error?.message || 'Failed to open wildcards folder',\n life: 3000,\n });\n }\n }\n\n async _copyWildcardPath(path) {\n if (!path) {\n return;\n }\n\n try {\n if (navigator?.clipboard?.writeText) {\n await navigator.clipboard.writeText(path);\n }\n showToast({\n severity: 'info',\n summary: 'Wildcards path',\n detail: path,\n life: 3000,\n });\n } catch (error) {\n console.error('[Lora Manager] Failed to copy wildcards path:', error);\n showToast({\n severity: 'warn',\n summary: 'Wildcards path',\n detail: path,\n life: 4000,\n });\n }\n }\n \n showPreviewForItem(relativePath, itemElement) {\n if (!this.options.showPreview || !this.previewTooltip) return;\n if (typeof relativePath !== 'string' || !relativePath) return;\n\n // Extract filename without extension for preview\n const fileName = relativePath.split(/[/\\\\]/).pop();\n const loraName = fileName.replace(/\\.(safetensors|ckpt|pt|bin)$/i, '');\n \n // Get item position for tooltip positioning\n const rect = itemElement.getBoundingClientRect();\n const x = rect.right + 10;\n const y = rect.top;\n \n this.previewTooltip.show(loraName, x, y, true); // Pass true for fromAutocomplete flag\n }\n \n hidePreview() {\n if (!this.options.showPreview) {\n return;\n }\n if (typeof this.behavior.hidePreview === 'function') {\n this.behavior.hidePreview(this);\n } else if (this.previewTooltip) {\n this.previewTooltip.hide();\n }\n }\n \n /**\n * Handle scroll event for virtual scrolling and loading more items\n */\n handleScroll() {\n if (!this.scrollContainer || this.isLoadingMore) {\n return;\n }\n\n const { scrollTop, scrollHeight, clientHeight } = this.scrollContainer;\n const scrollBottom = scrollTop + clientHeight;\n const threshold = this.options.itemHeight * 2; // Load more when within 2 items of bottom\n\n // Check if we need to load more items\n if (scrollBottom >= scrollHeight - threshold && this.hasMoreItems) {\n this.loadMoreItems();\n }\n\n // Update visible items for virtual scrolling\n if (this.options.enableVirtualScroll) {\n this.updateVisibleItems();\n }\n }\n\n /**\n * Load more items (pagination)\n */\n async loadMoreItems() {\n if (this.isLoadingMore || !this.hasMoreItems || this.showingCommands) {\n return;\n }\n\n this.isLoadingMore = true;\n this.currentPage++;\n\n try {\n // Show loading indicator\n this.showLoadingIndicator();\n\n // Get the current endpoint\n let endpoint = `/lm/${this.modelType}/relative-paths`;\n if (this.modelType === 'prompt') {\n if (this.searchType === 'embeddings') {\n endpoint = '/lm/embeddings/relative-paths';\n } else if (this.searchType === 'wildcards') {\n endpoint = getWildcardSearchEndpoint();\n } else if (this.searchType === 'custom_words') {\n if (this.activeCommand?.categories) {\n const categories = this.activeCommand.categories.join(',');\n endpoint = `/lm/custom-words/search?category=${categories}`;\n } else {\n endpoint = '/lm/custom-words/search?enriched=true';\n }\n }\n }\n\n const queriesToExecute = this._getQueriesToExecute(this.currentSearchTerm);\n const offset = this.items.length;\n\n // Active-filter query params for loras (null when setting off)\n const activeFiltersQuery = this._getActiveLoraFilters();\n\n // Execute all queries in parallel with offset\n const searchPromises = queriesToExecute.map(async (query) => {\n const url = endpoint.includes('?')\n ? `${endpoint}&search=${encodeURIComponent(query)}&limit=${this.options.pageSize}&offset=${offset}`\n : `${endpoint}?search=${encodeURIComponent(query)}&limit=${this.options.pageSize}&offset=${offset}`;\n const finalUrl = activeFiltersQuery ? `${url}&${activeFiltersQuery}` : url;\n\n try {\n const response = await api.fetchApi(finalUrl);\n const data = await response.json();\n return data.success ? (data.relative_paths || data.words || []) : [];\n } catch (error) {\n console.warn(`Search query failed for \"${query}\":`, error);\n return [];\n }\n });\n\n const resultsArrays = await Promise.all(searchPromises);\n\n // Merge and deduplicate results with existing items\n const seen = new Set(this.items.map(item => {\n const itemKey = typeof item === 'object' && item.tag_name\n ? item.tag_name.toLowerCase()\n : String(item).toLowerCase();\n return itemKey;\n }));\n const newItems = [];\n\n for (const resultArray of resultsArrays) {\n for (const item of resultArray) {\n const itemKey = typeof item === 'object' && item.tag_name\n ? item.tag_name.toLowerCase()\n : String(item).toLowerCase();\n\n if (!seen.has(itemKey)) {\n seen.add(itemKey);\n newItems.push(item);\n }\n }\n }\n\n // If we got fewer items than requested, we've reached the end\n if (newItems.length < this.options.pageSize) {\n this.hasMoreItems = false;\n }\n\n // If we got new items, append them and re-render\n // IMPORTANT: Do NOT re-sort! Backend already returns results sorted by relevance\n if (newItems.length > 0) {\n this.items.push(...newItems);\n\n // Update render\n if (this.options.enableVirtualScroll) {\n this.updateVirtualScrollHeight();\n this.updateVisibleItems();\n } else {\n this.render();\n }\n } else {\n this.hasMoreItems = false;\n }\n } catch (error) {\n console.error('Error loading more items:', error);\n this.hasMoreItems = false;\n } finally {\n this.isLoadingMore = false;\n this.hideLoadingIndicator();\n }\n }\n\n /**\n * Show loading indicator at the bottom of the list\n */\n showLoadingIndicator() {\n if (!this.contentContainer) return;\n\n let loadingEl = this.contentContainer.querySelector('.comfy-autocomplete-loading');\n if (!loadingEl) {\n loadingEl = document.createElement('div');\n loadingEl.className = 'comfy-autocomplete-loading';\n loadingEl.textContent = 'Loading more...';\n loadingEl.style.cssText = `\n padding: 12px;\n text-align: center;\n color: rgba(226, 232, 240, 0.5);\n font-size: 12px;\n `;\n this.contentContainer.appendChild(loadingEl);\n }\n }\n\n /**\n * Hide loading indicator\n */\n hideLoadingIndicator() {\n if (!this.contentContainer) return;\n\n const loadingEl = this.contentContainer.querySelector('.comfy-autocomplete-loading');\n if (loadingEl) {\n loadingEl.remove();\n }\n }\n\n /**\n * Update the total height of the virtual scroll container\n */\n updateVirtualScrollHeight() {\n if (!this.contentContainer || !this.scrollContainer) return;\n\n if (this._containsInformationalItems()) {\n this.totalHeight = 0;\n this.contentContainer.style.height = 'auto';\n this.scrollContainer.style.maxHeight = `${this.options.visibleItems * this.options.itemHeight}px`;\n this.scrollContainer.style.overflowY = 'hidden';\n return;\n }\n\n this.totalHeight = this.items.length * this.options.itemHeight;\n this.contentContainer.style.height = `${this.totalHeight}px`;\n \n // Adjust scroll container max-height based on actual content\n // Only show scrollbar when content exceeds visibleItems limit\n const maxHeight = this.options.visibleItems * this.options.itemHeight;\n const shouldShowScrollbar = this.totalHeight > maxHeight;\n \n this.scrollContainer.style.maxHeight = shouldShowScrollbar ? `${maxHeight}px` : `${this.totalHeight}px`;\n this.scrollContainer.style.overflowY = shouldShowScrollbar ? 'auto' : 'hidden';\n }\n\n /**\n * Update which items are visible based on scroll position\n */\n updateVisibleItems() {\n if (!this.scrollContainer || !this.contentContainer) return;\n\n if (this._containsInformationalItems()) {\n this.contentContainer.innerHTML = '';\n if (this.items[0]) {\n this.contentContainer.appendChild(\n this.createItemElement(this.items[0], 0, false, false)\n );\n }\n return;\n }\n\n const scrollTop = this.scrollContainer.scrollTop;\n const containerHeight = this.scrollContainer.clientHeight;\n\n // Calculate which items should be visible with a larger buffer for smoother rendering\n // Use a fixed buffer of 5 items to ensure selected item is always rendered\n const startIndex = Math.max(0, Math.floor(scrollTop / this.options.itemHeight) - 5);\n const endIndex = Math.min(\n this.items.length - 1,\n Math.ceil((scrollTop + containerHeight) / this.options.itemHeight) + 5\n );\n\n // Clear current content\n this.contentContainer.innerHTML = '';\n\n // Create spacer for items before visible range\n if (startIndex > 0) {\n const topSpacer = document.createElement('div');\n topSpacer.style.height = `${startIndex * this.options.itemHeight}px`;\n this.contentContainer.appendChild(topSpacer);\n }\n\n // Render visible items\n const isEnriched = this.items[0] && typeof this.items[0] === 'object' && 'tag_name' in this.items[0];\n const isCommand = this.items[0] && typeof this.items[0] === 'object' && 'command' in this.items[0];\n\n for (let i = startIndex; i <= endIndex; i++) {\n const itemData = this.items[i];\n const itemEl = this.createItemElement(itemData, i, isEnriched, isCommand);\n this.contentContainer.appendChild(itemEl);\n }\n\n // Create spacer for items after visible range\n if (endIndex < this.items.length - 1) {\n const bottomSpacer = document.createElement('div');\n bottomSpacer.style.height = `${(this.items.length - 1 - endIndex) * this.options.itemHeight}px`;\n this.contentContainer.appendChild(bottomSpacer);\n }\n \n // Re-apply selection styling after re-rendering\n // This ensures the selected item remains highlighted even after DOM updates\n if (this.selectedIndex >= startIndex && this.selectedIndex <= endIndex) {\n const selectedEl = this.contentContainer.querySelector(`.comfy-autocomplete-item[data-index=\"${this.selectedIndex}\"]`);\n if (selectedEl) {\n selectedEl.classList.add('comfy-autocomplete-item-selected');\n selectedEl.style.backgroundColor = 'rgba(66, 153, 225, 0.2)';\n }\n }\n }\n\n /**\n * Create a single item element\n */\n createItemElement(itemData, index, isEnriched, isCommand = false) {\n const item = document.createElement('div');\n item.className = 'comfy-autocomplete-item';\n item.dataset.index = index.toString();\n item.style.cssText = `\n height: ${this.options.itemHeight}px;\n padding: 8px 12px;\n cursor: pointer;\n color: rgba(226, 232, 240, 0.8);\n border-bottom: 1px solid rgba(226, 232, 240, 0.1);\n transition: all 0.2s ease;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n position: relative;\n display: flex;\n justify-content: space-between;\n align-items: center;\n gap: 8px;\n box-sizing: border-box;\n `;\n\n // Check if this is a command object (override parameter if needed)\n if (!isCommand && itemData && typeof itemData === 'object' && 'command' in itemData) {\n isCommand = true;\n }\n\n if (isWildcardInfoItem(itemData)) {\n this._renderInformationalItem(item, itemData);\n } else if (isCommand) {\n // Render command item\n const cmdSpan = document.createElement('span');\n cmdSpan.className = 'lm-autocomplete-command-name';\n cmdSpan.textContent = itemData.command;\n\n const labelSpan = document.createElement('span');\n labelSpan.className = 'lm-autocomplete-command-label';\n labelSpan.textContent = itemData.label;\n\n item.appendChild(cmdSpan);\n item.appendChild(labelSpan);\n item.style.gap = '12px';\n } else if (isEnriched) {\n this._renderEnrichedItem(item, itemData, this.currentSearchTerm);\n } else {\n const nameSpan = document.createElement('span');\n nameSpan.className = 'lm-autocomplete-name';\n // Use display text without extension for cleaner UI\n const displayTextWithoutExt = this._getDisplayText(itemData);\n nameSpan.innerHTML = this.highlightMatch(displayTextWithoutExt, this.currentSearchTerm);\n nameSpan.style.cssText = `\n flex: 1;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n `;\n item.appendChild(nameSpan);\n }\n\n // Prevent textarea from losing focus when clicking dropdown items.\n // Without this, the blur event fires before click, and the blur handler's\n // formatAutocompleteTextOnBlur() modifies the text and triggers hide()\n // via suppressAutocompleteOnce, removing this item from the DOM before\n // the click handler can execute. This specifically breaks the case where\n // the text has a comma not followed by a space (e.g. \",search\").\n item.addEventListener('mousedown', (e) => {\n e.preventDefault();\n });\n\n // Hover and selection handlers\n item.addEventListener('mouseenter', () => {\n this.selectItem(index, { manual: true });\n });\n\n item.addEventListener('mouseleave', () => {\n this.hidePreview();\n });\n\n // Click handler\n item.addEventListener('click', () => {\n if (isWildcardInfoItem(itemData)) {\n return;\n }\n\n if (isCommand) {\n this._insertCommand(itemData.command);\n } else {\n const insertPath = isEnriched ? itemData.tag_name : itemData;\n this.insertSelection(insertPath);\n }\n });\n\n return item;\n }\n\n show() {\n if (!this.items || this.items.length === 0) {\n this.hide();\n return;\n }\n\n this._maybeShowFirstRunHint();\n // For virtual scrolling, render items first so positionAtCursor can measure width correctly\n if (this.options.enableVirtualScroll && this.contentContainer) {\n this.dropdown.style.display = 'block';\n this.isVisible = true;\n // Skip updateVisibleItems if showing commands (already rendered by _renderCommandList)\n if (!this.showingCommands) {\n this.updateVisibleItems();\n }\n this.positionAtCursor();\n } else {\n // Position dropdown at cursor position using TextAreaCaretHelper\n this.positionAtCursor();\n this.dropdown.style.display = 'block';\n this.isVisible = true;\n }\n }\n \n positionAtCursor() {\n const position = this.helper.getCursorOffset();\n this.dropdown.style.left = (position.left ?? 0) + \"px\";\n this.dropdown.style.top = (position.top ?? 0) + \"px\";\n this.dropdown.style.maxHeight = (window.innerHeight - position.top) + \"px\";\n\n // Adjust width to fit content\n // Temporarily show the dropdown to measure content width\n const originalDisplay = this.dropdown.style.display;\n this.dropdown.style.display = 'block';\n this.dropdown.style.visibility = 'hidden';\n\n // Temporarily remove width constraints to allow content to expand naturally\n // This prevents items.scrollWidth from being limited by a narrow container\n const originalWidth = this.dropdown.style.width;\n this.dropdown.style.width = 'auto';\n this.dropdown.style.minWidth = '200px';\n\n // Measure the content width\n let maxWidth = 200; // minimum width\n // For virtual scrolling, query items from contentContainer; otherwise from dropdown\n const container = this.options.enableVirtualScroll && this.contentContainer\n ? this.contentContainer\n : this.dropdown;\n const items = container.querySelectorAll('.comfy-autocomplete-item');\n items.forEach(item => {\n const itemWidth = item.scrollWidth + 24; // Add padding\n maxWidth = Math.max(maxWidth, itemWidth);\n });\n\n // Set the width and restore visibility\n this.dropdown.style.width = Math.min(maxWidth, 400) + 'px'; // Cap at 400px\n this.dropdown.style.minWidth = '';\n this.dropdown.style.visibility = 'visible';\n this.dropdown.style.display = originalDisplay;\n }\n \n getCaretPosition() {\n return this.inputElement.selectionStart || 0;\n }\n \n hide() {\n if (!this.dropdown) {\n return;\n }\n\n this.dropdown.style.display = 'none';\n this.isVisible = false;\n this.selectedIndex = -1;\n this.hasManualSelection = false;\n this.showingCommands = false;\n\n // Remove discoverability hints attached to the dropdown\n this._removeCommandListFooter();\n this._removeFirstRunHint();\n \n // Clear items to prevent stale data from being displayed\n // when autocomplete is shown again\n this.items = [];\n this.wildcardMeta = null;\n \n // Clear content container to prevent stale items from showing\n if (this.contentContainer) {\n // Virtual scrolling mode - clear content container\n this.contentContainer.innerHTML = '';\n } else {\n // Non-virtual scrolling mode - clear dropdown direct children\n this.dropdown.innerHTML = '';\n }\n\n // Reset virtual scrolling state\n this.virtualScrollOffset = 0;\n this.currentPage = 0;\n this.hasMoreItems = true;\n this.isLoadingMore = false;\n this.totalHeight = 0;\n\n // Reset scroll position\n if (this.scrollContainer) {\n this.scrollContainer.scrollTop = 0;\n }\n\n // Hide preview tooltip\n this.hidePreview();\n\n // Clear selection styles from all items\n const items = this.dropdown.querySelectorAll('.comfy-autocomplete-item');\n items.forEach(item => {\n item.classList.remove('comfy-autocomplete-item-selected');\n item.style.backgroundColor = '';\n });\n }\n \n selectItem(index, { manual = false } = {}) {\n // Remove previous selection\n const container = this.options.enableVirtualScroll && this.contentContainer\n ? this.contentContainer\n : this.dropdown;\n const prevSelected = container.querySelector('.comfy-autocomplete-item-selected');\n if (prevSelected) {\n prevSelected.classList.remove('comfy-autocomplete-item-selected');\n prevSelected.style.backgroundColor = '';\n }\n\n // Add new selection\n if (index >= 0 && index < this.items.length) {\n this.selectedIndex = index;\n this.hasManualSelection = manual;\n\n // For virtual scrolling, we need to ensure the item is rendered\n if (this.options.enableVirtualScroll && this.scrollContainer) {\n // Calculate if the item is currently visible\n const itemTop = index * this.options.itemHeight;\n const itemBottom = itemTop + this.options.itemHeight;\n const scrollTop = this.scrollContainer.scrollTop;\n const containerHeight = this.scrollContainer.clientHeight;\n const scrollBottom = scrollTop + containerHeight;\n\n // If item is not visible, scroll to make it visible\n if (itemTop < scrollTop || itemBottom > scrollBottom) {\n // Scroll to position the item in the visible area\n // Position item at 1/3 from top for better visibility\n const targetScrollTop = Math.max(0, itemTop - containerHeight / 3);\n this.scrollContainer.scrollTop = targetScrollTop;\n \n // Re-render visible items after scroll\n this.updateVisibleItems();\n \n // Apply selection after DOM is updated\n // Use setTimeout to ensure DOM has been re-rendered\n setTimeout(() => {\n this._applyItemSelection(index);\n }, 0);\n } else {\n // Item is already visible, apply selection immediately\n this._applyItemSelection(index);\n }\n } else {\n // Traditional rendering\n const item = container.children[index];\n if (item) {\n item.classList.add('comfy-autocomplete-item-selected');\n item.style.backgroundColor = 'rgba(66, 153, 225, 0.2)';\n\n // Scroll into view if needed\n item.scrollIntoView({ block: 'nearest' });\n\n // Show preview for selected item\n if (this.options.showPreview && !this._isSelectableInfoItem(this.items[index])) {\n if (typeof this.behavior.showPreview === 'function') {\n this.behavior.showPreview(this, this.items[index], item);\n } else if (this.previewTooltip) {\n this.showPreviewForItem(this.items[index], item);\n }\n }\n }\n }\n }\n }\n\n /**\n * Apply selection styling to an item (used after virtual scroll re-render)\n * @param {number} index - Index of item to select\n */\n _applyItemSelection(index) {\n if (!this.contentContainer) return;\n\n // Find the item element using data-index attribute\n const selectedEl = this.contentContainer.querySelector(`.comfy-autocomplete-item[data-index=\"${index}\"]`);\n\n if (selectedEl) {\n selectedEl.classList.add('comfy-autocomplete-item-selected');\n selectedEl.style.backgroundColor = 'rgba(66, 153, 225, 0.2)';\n\n // Show preview for selected item\n if (this.options.showPreview && !this._isSelectableInfoItem(this.items[index])) {\n if (typeof this.behavior.showPreview === 'function') {\n this.behavior.showPreview(this, this.items[index], selectedEl);\n } else if (this.previewTooltip) {\n this.showPreviewForItem(this.items[index], selectedEl);\n }\n }\n }\n }\n \n handleKeyDown(e) {\n if (!this.isVisible) {\n return;\n }\n \n switch (e.key) {\n case 'ArrowDown':\n e.preventDefault();\n if (this.options.enableVirtualScroll && this.scrollContainer) {\n // For virtual scrolling, handle boundary cases\n if (this.selectedIndex >= this.items.length - 1) {\n // Already at last item, try to load more\n if (this.hasMoreItems && !this.isLoadingMore) {\n this.loadMoreItems().then(() => {\n // After loading more, select the next item\n if (this.selectedIndex < this.items.length - 1) {\n this.selectItem(this.selectedIndex + 1, { manual: true });\n }\n });\n }\n } else {\n this.selectItem(this.selectedIndex + 1, { manual: true });\n }\n } else {\n this.selectItem(Math.min(this.selectedIndex + 1, this.items.length - 1), { manual: true });\n }\n break;\n \n case 'ArrowUp':\n e.preventDefault();\n if (this.options.enableVirtualScroll && this.scrollContainer) {\n // For virtual scrolling, handle top boundary\n if (this.selectedIndex <= 0) {\n // Already at first item, ensure it's selected\n this.selectItem(0, { manual: true });\n } else {\n this.selectItem(this.selectedIndex - 1, { manual: true });\n }\n } else {\n this.selectItem(Math.max(this.selectedIndex - 1, 0), { manual: true });\n }\n break;\n \n case 'Enter':\n case 'Tab':\n if (!shouldAcceptAutocompleteKey(e.key)) {\n break;\n }\n\n {\n const liveSearchTerm = this._getLiveSearchTermForAcceptance();\n const acceptIndex = this._getAcceptSelectionIndex(liveSearchTerm);\n if (acceptIndex !== -1 && acceptIndex !== this.selectedIndex) {\n this.selectItem(acceptIndex);\n }\n }\n\n if (this.selectedIndex >= 0 && this.selectedIndex < this.items.length) {\n e.preventDefault();\n if (this.showingCommands) {\n // Insert command\n this._insertCommand(this.items[this.selectedIndex].command);\n } else {\n const selectedItem = this.items[this.selectedIndex];\n if (isWildcardInfoItem(selectedItem)) {\n if (selectedItem.type === 'wildcard_empty_state') {\n this._openWildcardsFolder();\n }\n break;\n }\n\n // Insert selection (handle enriched items)\n const insertPath = typeof selectedItem === 'object' && 'tag_name' in selectedItem\n ? selectedItem.tag_name\n : selectedItem;\n this.insertSelection(insertPath);\n }\n }\n break;\n \n case 'Escape':\n e.preventDefault();\n this.hide();\n break;\n }\n }\n \n async insertSelection(relativePath) {\n const insertText = await this.getInsertText(relativePath);\n if (!insertText) {\n this.hide();\n return;\n }\n\n const currentValue = this.inputElement.value;\n const activeRange = this.getActiveSearchRange(currentValue);\n const caretPos = activeRange.end;\n const fullSearchTerm = activeRange.text;\n let replaceStartPos = activeRange.trimmedStart;\n\n // For regular tag autocomplete (no command), only replace the last space-separated token\n // This allows \"hello 1gi\" + selecting \"1girl\" to become \"hello 1girl, \"\n // However, if the user typed a multi-word phrase that matches a tag (e.g., \"looking to the side\"\n // matching \"looking_to_the_side\"), replace the entire phrase instead of just the last word.\n // Command mode (e.g., \"/character miku\") should replace the entire command+search\n let searchTerm = fullSearchTerm;\n if (this.modelType === 'prompt' && this.searchType === 'custom_words' && !this.activeCommand) {\n // Check if the selectedItem exists and its tag_name matches the full search term\n // when converted to underscore format (Danbooru convention)\n const selectedItem = this.selectedIndex >= 0 ? this.items[this.selectedIndex] : null;\n const selectedTagName = selectedItem && typeof selectedItem === 'object' && 'tag_name' \n ? selectedItem.tag_name \n : null;\n \n // Convert full search term to underscore format and check if it matches selected tag\n // Normalize multiple spaces to single underscore for matching (e.g., \"looking to the side\" -> \"looking_to_the_side\")\n const underscoreVersion = fullSearchTerm.replace(/ +/g, '_').toLowerCase();\n const selectedTagLower = selectedTagName?.toLowerCase() ?? '';\n \n // If multi-word search term is a prefix or suffix of the selected tag,\n // replace the entire phrase. This handles cases where user types partial tag name.\n // Examples:\n // - \"looking to the\" -> \"looking_to_the_side\" (prefix match)\n // - \"to the side\" -> \"looking_to_the_side\" (suffix match)\n // - \"looking to the side\" -> \"looking_to_the_side\" (exact match)\n if (fullSearchTerm.includes(' ') && (\n selectedTagLower.startsWith(underscoreVersion) ||\n selectedTagLower.endsWith(underscoreVersion) ||\n underscoreVersion === selectedTagLower\n )) {\n searchTerm = fullSearchTerm;\n replaceStartPos = activeRange.trimmedStart;\n } else {\n searchTerm = this._getLastSpaceToken(fullSearchTerm);\n replaceStartPos = searchTerm === fullSearchTerm\n ? activeRange.trimmedStart\n : caretPos - searchTerm.length;\n }\n }\n\n // Only replace the search term, not everything after the last comma\n const newValue = currentValue.substring(0, replaceStartPos) + insertText + currentValue.substring(caretPos);\n const newCaretPos = replaceStartPos + insertText.length;\n\n this.inputElement.value = newValue;\n this._storeLastAcceptedBoundary({\n start: replaceStartPos,\n end: newCaretPos,\n insertedText: insertText,\n textSnapshot: newValue.substring(0, newCaretPos),\n });\n\n // Trigger input event to notify about the change\n const event = new Event('input', { bubbles: true });\n this.inputElement.dispatchEvent(event);\n\n this.hide();\n\n // Focus back to input and position cursor\n this.inputElement.focus();\n this.inputElement.setSelectionRange(newCaretPos, newCaretPos);\n }\n\n async getInsertText(relativePath) {\n if (typeof this.behavior.getInsertText === 'function') {\n try {\n const result = await this.behavior.getInsertText(this, relativePath);\n if (typeof result === 'string' && result.length > 0) {\n return result;\n }\n } catch (error) {\n console.warn('Failed to format autocomplete insertion:', error);\n }\n }\n\n const trimmed = typeof relativePath === 'string' ? relativePath.trim() : '';\n if (!trimmed) {\n return '';\n }\n return formatAutocompleteInsertion(trimmed);\n }\n\n /**\n * Check if the autocomplete instance is still valid\n * (input element exists and is in the DOM)\n * @returns {boolean}\n */\n isValid() {\n return this.inputElement && document.body.contains(this.inputElement);\n }\n\n /**\n * Refresh the TextAreaCaretHelper to update cached measurements\n * Useful after element is moved in DOM (e.g., Vue mode switch)\n */\n refreshCaretHelper() {\n if (this.inputElement && document.body.contains(this.inputElement)) {\n this.helper = new TextAreaCaretHelper(this.inputElement, () => app.canvas.ds.scale);\n }\n }\n\n /**\n * Handle toggle setting command (e.g., /autocomplete, /activefilters)\n * @param {Object} command - The toggle command with settingId and value\n */\n async _handleToggleSettingCommand(command) {\n const { settingId, value } = command;\n\n try {\n const success = await setLoraManagerSettingValue(settingId, value);\n if (success) {\n this._showToggleFeedback(command, value);\n this._clearCurrentToken();\n } else {\n throw new Error('settings API unavailable');\n }\n } catch (error) {\n console.error('[Lora Manager] Failed to toggle setting:', error);\n showToast({\n severity: 'error',\n summary: 'Error',\n detail: 'Failed to toggle autocomplete setting',\n life: 3000\n });\n }\n\n this.hide();\n }\n\n /**\n * Show visual feedback for toggle action using toast\n * @param {Object} command - The toggle command that was executed\n * @param {boolean} enabled - New autocomplete state\n */\n _showToggleFeedback(command, enabled) {\n showToast({\n severity: enabled ? 'success' : 'secondary',\n summary: command.feedbackSummary || (enabled ? 'Autocomplete Enabled' : 'Autocomplete Disabled'),\n detail: command.feedbackDetail || (enabled\n ? 'Tag autocomplete is now ON. Type to see suggestions.'\n : 'Tag autocomplete is now OFF. Use /autocomplete or the node right-click menu to re-enable.'),\n life: 3000\n });\n }\n\n /**\n * Clear the current command token from input\n * Preserves leading spaces after delimiters (e.g., \"1girl, /emb\" -> \"1girl, \")\n */\n _clearCurrentToken() {\n const currentValue = this.inputElement.value;\n const activeRange = this.getActiveSearchRange(currentValue);\n const caretPos = activeRange.end;\n const lastSegment = activeRange.rawText;\n \n // Find the command start position, preserving leading spaces\n // lastSegment includes leading spaces (e.g., \" /emb\"), find where command actually starts\n const commandMatch = lastSegment.match(/^(\\s*)(\\/\\w+)/);\n if (commandMatch) {\n // commandMatch[1] is leading spaces, commandMatch[2] is the command\n const leadingSpaces = commandMatch[1].length;\n // Keep the spaces by starting after them\n const commandStartPos = activeRange.start + leadingSpaces;\n \n // Skip trailing spaces when deleting\n let endPos = caretPos;\n while (endPos < currentValue.length && currentValue[endPos] === ' ') {\n endPos++;\n }\n\n const newValue = currentValue.substring(0, commandStartPos) + currentValue.substring(endPos);\n const newCaretPos = commandStartPos;\n\n this.inputElement.value = newValue;\n\n // Trigger input event to notify about the change\n const event = new Event('input', { bubbles: true });\n this.inputElement.dispatchEvent(event);\n\n // Focus back to input and position cursor\n this.inputElement.focus();\n this.inputElement.setSelectionRange(newCaretPos, newCaretPos);\n } else {\n // Fallback: delete the whole last segment (original behavior)\n const commandStartPos = activeRange.start;\n \n let endPos = caretPos;\n while (endPos < currentValue.length && currentValue[endPos] === ' ') {\n endPos++;\n }\n\n const newValue = currentValue.substring(0, commandStartPos) + currentValue.substring(endPos);\n const newCaretPos = commandStartPos;\n\n this.inputElement.value = newValue;\n\n const event = new Event('input', { bubbles: true });\n this.inputElement.dispatchEvent(event);\n\n this.inputElement.focus();\n this.inputElement.setSelectionRange(newCaretPos, newCaretPos);\n }\n }\n\n destroy() {\n if (this.debounceTimer) {\n clearTimeout(this.debounceTimer);\n }\n\n if (this.onInput) {\n this.inputElement.removeEventListener('input', this.onInput);\n this.onInput = null;\n }\n\n if (this.onKeyDown) {\n this.inputElement.removeEventListener('keydown', this.onKeyDown);\n this.onKeyDown = null;\n }\n\n if (this.onBlur) {\n this.inputElement.removeEventListener('blur', this.onBlur);\n this.onBlur = null;\n }\n\n if (this.onDocumentClick) {\n document.removeEventListener('click', this.onDocumentClick);\n this.onDocumentClick = null;\n }\n\n if (this.onScroll && this.scrollContainer) {\n this.scrollContainer.removeEventListener('scroll', this.onScroll);\n this.onScroll = null;\n }\n\n if (typeof this.behavior.destroy === 'function') {\n this.behavior.destroy(this);\n } else if (this.previewTooltip) {\n this.previewTooltip.cleanup();\n this.previewTooltip = null;\n }\n this.previewTooltipPromise = null;\n \n if (this.dropdown && this.dropdown.parentNode) {\n this.dropdown.parentNode.removeChild(this.dropdown);\n this.dropdown = null;\n }\n \n }\n}\n\nexport { AutoComplete, refreshLoraSyntaxFormat };\n","/**\n * Base-path helpers for code running inside the ComfyUI page.\n *\n * When ComfyUI is served under a URL subpath by a reverse proxy (e.g.\n * llama-swap serves it at \"/comfyui/\", SwarmUI at \"/ComfyBackendDirect/\"),\n * the ComfyUI SPA always sits at the root of that prefix, so the prefix is\n * the current pathname without the trailing slash — the same convention the\n * ComfyUI frontend uses for its own api_base. Proxies strip the prefix and\n * forward no headers, so the page URL is the only place to learn it.\n */\n\nexport function getComfyUIBasePath() {\n const { pathname } = window.location;\n return pathname.endsWith(\"/\") ? pathname.slice(0, -1) : pathname;\n}\n\nexport function lmUrl(path) {\n return `${getComfyUIBasePath()}${path}`;\n}\n","export const CONVERTED_TYPE = 'converted-widget';\nimport { app } from \"../../scripts/app.js\";\nimport { AutoComplete } from \"./autocomplete.js\";\nimport { lmUrl } from \"./base_path.js\";\n\nconst ROOT_GRAPH_ID = \"root\";\n\nexport const LORA_PROVIDER_NODE_TYPES = [\n \"Lora Stacker (LoraManager)\",\n \"Lora Randomizer (LoraManager)\",\n \"Lora Cycler (LoraManager)\",\n \"Create Hook LoRA (LoraManager)\",\n];\n\nexport const LORA_STACK_AGGREGATOR_NODE_TYPES = [\n \"Lora Stack Combiner (LoraManager)\",\n];\n\nexport const LORA_CHAIN_NODE_TYPES = [\n ...LORA_PROVIDER_NODE_TYPES,\n ...LORA_STACK_AGGREGATOR_NODE_TYPES,\n];\n\nexport function isLoraProviderNode(comfyClass) {\n return LORA_PROVIDER_NODE_TYPES.includes(comfyClass);\n}\n\nexport function isLoraStackAggregatorNode(comfyClass) {\n return LORA_STACK_AGGREGATOR_NODE_TYPES.includes(comfyClass);\n}\n\nexport function isLoraChainNode(comfyClass) {\n return LORA_CHAIN_NODE_TYPES.includes(comfyClass);\n}\n\nfunction isMapLike(collection) {\n return collection && typeof collection.entries === \"function\" && typeof collection.values === \"function\";\n}\n\n/**\n * Return the subgraph LGraph instances nested under `graph`, across both\n * Map-like and plain-object `_subgraphs` containers.\n */\nexport function getChildGraphs(graph) {\n if (!graph || !graph._subgraphs) {\n return [];\n }\n\n const rawSubgraphs = isMapLike(graph._subgraphs)\n ? Array.from(graph._subgraphs.values())\n : Object.values(graph._subgraphs);\n\n return rawSubgraphs\n .map((subgraph) => subgraph?.graph || subgraph?._graph || subgraph)\n .filter((subgraph) => subgraph && subgraph !== graph);\n}\n\nfunction traverseGraphs(rootGraph, visitor, visited = new Set()) {\n const graph = rootGraph || app.graph;\n if (!graph) {\n return;\n }\n\n const graphId = getGraphId(graph);\n if (visited.has(graphId)) {\n return;\n }\n visited.add(graphId);\n visitor(graph);\n\n for (const subgraph of getChildGraphs(graph)) {\n traverseGraphs(subgraph, visitor, visited);\n }\n}\n\nexport function getGraphId(graph) {\n return graph?.id ?? ROOT_GRAPH_ID;\n}\n\nexport function getNodeGraphId(node) {\n if (!node) {\n return ROOT_GRAPH_ID;\n }\n return getGraphId(node.graph || app.graph);\n}\n\nexport function getGraphById(graphId, rootGraph = app.graph) {\n if (!graphId) {\n return rootGraph;\n }\n\n let foundGraph = null;\n traverseGraphs(rootGraph, (graph) => {\n if (!foundGraph && getGraphId(graph) === graphId) {\n foundGraph = graph;\n }\n });\n return foundGraph;\n}\n\nexport function getNodeFromGraph(graphId, nodeId) {\n const graph = getGraphById(graphId) || app.graph;\n if (!graph || typeof graph.getNodeById !== \"function\") {\n return null;\n }\n\n const numericId = typeof nodeId === \"string\" ? Number(nodeId) : nodeId;\n return graph.getNodeById(Number.isNaN(numericId) ? nodeId : numericId) || null;\n}\n\nexport function getAllGraphNodes(rootGraph = app.graph) {\n const nodes = [];\n traverseGraphs(rootGraph, (graph) => {\n if (Array.isArray(graph._nodes)) {\n for (const node of graph._nodes) {\n nodes.push({ graph, node });\n }\n }\n });\n return nodes;\n}\n\nexport function getNodeReference(node) {\n if (!node) {\n return null;\n }\n return {\n node_id: node.id,\n graph_id: getNodeGraphId(node),\n };\n}\n\nexport function getNodeKey(node) {\n if (!node) {\n return null;\n }\n return `${getNodeGraphId(node)}:${node.id}`;\n}\n\nexport function getWidgetByName(node, widgetName) {\n if (!node || !Array.isArray(node.widgets)) {\n return null;\n }\n\n return node.widgets.find((widget) => widget?.name === widgetName) || null;\n}\n\nexport function getWidgetSerializedValue(node, widgetName) {\n if (!node || !Array.isArray(node.widgets) || !Array.isArray(node.widgets_values)) {\n return undefined;\n }\n\n const widgetIndex = node.widgets.findIndex((widget) => widget?.name === widgetName);\n if (widgetIndex === -1) {\n return undefined;\n }\n\n return node.widgets_values[widgetIndex];\n}\n\nexport function getLinkFromGraph(graph, linkId) {\n if (!graph || graph.links == null) {\n return null;\n }\n\n if (isMapLike(graph.links)) {\n return graph.links.get(linkId) || null;\n }\n\n return graph.links[linkId] || null;\n}\n\nexport function chainCallback(object, property, callback) {\n if (object == undefined) {\n //This should not happen.\n console.error(\"Tried to add callback to non-existant object\")\n return;\n }\n if (property in object) {\n const callback_orig = object[property]\n object[property] = function () {\n const r = callback_orig.apply(this, arguments);\n callback.apply(this, arguments);\n return r\n };\n } else {\n object[property] = callback;\n }\n}\n\n/**\n * Find a `mode` accessor (getter/setter) on the node's prototype chain.\n * Since ComfyUI frontend 1.53, `LGraphNode.mode` is a prototype accessor\n * backed by the node's shell state (`node._state.mode`); on legacy frontends\n * `mode` is a plain data property on the instance and no accessor exists.\n */\nfunction findModeAccessor(node) {\n let proto = Object.getPrototypeOf(node);\n while (proto && proto !== Object.prototype) {\n const descriptor = Object.getOwnPropertyDescriptor(proto, \"mode\");\n if (descriptor && (descriptor.get || descriptor.set)) {\n return descriptor;\n }\n proto = Object.getPrototypeOf(proto);\n }\n return null;\n}\n\n/**\n * Observe node mode changes (Always/Never/On Trigger/Bypass) without\n * breaking the frontend's own `mode` property.\n *\n * Since ComfyUI frontend 1.53, `mode` is a prototype accessor backed by\n * shell state and serialization reads that state directly. Redefining `mode`\n * on the instance would shadow the prototype setter, so bypass/mute never\n * reaches the serialized workflow and silently reverts to Always on reload.\n * When a prototype accessor exists we delegate to it and only observe the\n * change; on legacy frontends we keep the value in a closure as before.\n *\n * @param {Object} node - The litegraph node instance\n * @param {(newMode: number, oldMode: number) => void} onModeChange - Called when the mode actually changes\n */\nexport function interceptModeChange(node, onModeChange) {\n const delegate = findModeAccessor(node);\n\n if (delegate && typeof delegate.get === \"function\" && typeof delegate.set === \"function\") {\n Object.defineProperty(node, \"mode\", {\n configurable: true,\n get() {\n return delegate.get.call(this);\n },\n set(value) {\n const oldValue = delegate.get.call(this);\n delegate.set.call(this, value);\n if (oldValue !== value) {\n onModeChange(value, oldValue);\n }\n },\n });\n return;\n }\n\n let currentMode = node.mode;\n Object.defineProperty(node, \"mode\", {\n configurable: true,\n get() {\n return currentMode;\n },\n set(value) {\n const oldValue = currentMode;\n currentMode = value;\n if (oldValue !== value) {\n onModeChange(value, oldValue);\n }\n },\n });\n}\n\n/**\n * Show a toast notification\n * @param {Object|string} options - Toast options object or message string for backward compatibility\n * @param {string} [options.severity] - Message severity level (success, info, warn, error, secondary, contrast)\n * @param {string} [options.summary] - Short title for the toast\n * @param {any} [options.detail] - Detailed message content\n * @param {boolean} [options.closable] - Whether user can close the toast (default: true)\n * @param {number} [options.life] - Duration in milliseconds before auto-closing\n * @param {string} [options.group] - Group identifier for managing related toasts\n * @param {any} [options.styleClass] - Style class of the message\n * @param {any} [options.contentStyleClass] - Style class of the content\n * @param {string} [type] - Deprecated: severity type for backward compatibility\n */\nexport function showToast(options, type = 'info') {\n // Handle backward compatibility: showToast(message, type)\n if (typeof options === 'string') {\n options = {\n detail: options,\n severity: type\n };\n }\n \n // Set defaults\n const toastOptions = {\n severity: options.severity || 'info',\n summary: options.summary,\n detail: options.detail,\n closable: options.closable !== false, // default to true\n life: options.life,\n group: options.group,\n styleClass: options.styleClass,\n contentStyleClass: options.contentStyleClass\n };\n \n // Remove undefined properties\n Object.keys(toastOptions).forEach(key => {\n if (toastOptions[key] === undefined) {\n delete toastOptions[key];\n }\n });\n \n if (app && app.extensionManager && app.extensionManager.toast) {\n app.extensionManager.toast.add(toastOptions);\n } else {\n const message = toastOptions.detail || toastOptions.summary || 'No message';\n const severity = toastOptions.severity.toUpperCase();\n console.log(`${severity}: ${message}`);\n // Fallback alert for critical errors only\n if (toastOptions.severity === 'error') {\n alert(message);\n }\n }\n}\n\nexport function hideWidgetForGood(node, widget, suffix = \"\") {\n widget.origType = widget.type;\n widget.origComputeSize = widget.computeSize;\n widget.origSerializeValue = widget.serializeValue;\n widget.computeSize = () => [0, -4]; // -4 is due to the gap litegraph adds between widgets automatically\n widget.type = CONVERTED_TYPE + suffix;\n // widget.serializeValue = () => {\n // // Prevent serializing the widget if we have no input linked\n // const w = node.inputs?.find((i) => i.widget?.name === widget.name);\n // if (w?.link == null) {\n // return undefined;\n // }\n // return widget.origSerializeValue ? widget.origSerializeValue() : widget.value;\n // };\n\n // Hide any linked widgets, e.g. seed+seedControl\n if (widget.linkedWidgets) {\n for (const w of widget.linkedWidgets) {\n hideWidgetForGood(node, w, `:${widget.name}`);\n }\n }\n}\n\n// Update pattern to match both formats: or \nexport const LORA_PATTERN = //g;\n\nfunction isLoraStackInput(input) {\n return input?.type === \"LORA_STACK\";\n}\n\n// Get connected LORA_STACK chain nodes that feed into the current node\nexport function getConnectedInputLoraChainNodes(node) {\n const connectedNodes = [];\n\n if (!node?.inputs) {\n return connectedNodes;\n }\n\n for (const input of node.inputs) {\n if (!isLoraStackInput(input) || !input.link) {\n continue;\n }\n\n const link = getLinkFromGraph(node.graph, input.link);\n if (!link) {\n continue;\n }\n\n const sourceNode = node.graph?.getNodeById?.(link.origin_id);\n if (sourceNode && isLoraChainNode(sourceNode.comfyClass)) {\n connectedNodes.push(sourceNode);\n }\n }\n\n return connectedNodes;\n}\n\n// Get connected TriggerWord Toggle nodes that receive output from the current node\nexport function getConnectedTriggerToggleNodes(node) {\n const connectedNodes = [];\n\n if (!node?.outputs) {\n return connectedNodes;\n }\n\n for (const output of node.outputs) {\n if (!output?.links?.length) {\n continue;\n }\n\n for (const linkId of output.links) {\n const link = getLinkFromGraph(node.graph, linkId);\n if (!link) {\n continue;\n }\n\n const targetNode = node.graph?.getNodeById?.(link.target_id);\n if (targetNode && targetNode.comfyClass === \"TriggerWord Toggle (LoraManager)\") {\n connectedNodes.push(targetNode);\n }\n }\n }\n\n return connectedNodes;\n}\n\n// Extract active lora names from a node's widgets\nexport function getActiveLorasFromNode(node) {\n const activeLoraNames = new Set();\n\n // Handle Lora Cycler (single LoRA from cycler_config widget)\n if (node.comfyClass === \"Lora Cycler (LoraManager)\") {\n const cyclerWidget = node.widgets?.find(w => w.name === 'cycler_config');\n if (cyclerWidget?.value?.current_lora_filename) {\n activeLoraNames.add(cyclerWidget.value.current_lora_filename);\n }\n return activeLoraNames;\n }\n\n // Aggregator nodes do not own LoRA state directly; they only forward upstream stacks.\n if (isLoraStackAggregatorNode(node.comfyClass)) {\n return activeLoraNames;\n }\n\n // Handle Lora Stacker and Lora Randomizer (lorasWidget)\n let lorasWidget = node.lorasWidget;\n if (!lorasWidget && node.widgets) {\n lorasWidget = node.widgets.find(w => w.name === 'loras');\n }\n\n if (lorasWidget && lorasWidget.value) {\n lorasWidget.value.forEach(lora => {\n if (lora.active) {\n activeLoraNames.add(lora.name);\n }\n });\n }\n\n return activeLoraNames;\n}\n\n// Recursively collect all active loras from a node and its input chain\n// A node is considered active only if its mode is 0 (Always) or 3 (On Trigger)\nexport function collectActiveLorasFromChain(node, visited = new Set()) {\n // Prevent infinite loops from circular references\n const nodeKey = getNodeKey(node);\n if (!nodeKey) {\n return new Set();\n }\n if (visited.has(nodeKey)) {\n return new Set();\n }\n visited.add(nodeKey);\n\n // Check if node is active (mode 0 for Always, mode 3 for On Trigger)\n // Mode 2 is Never, Mode 4 is Bypass\n const isNodeActive = node.mode === undefined || node.mode === 0 || node.mode === 3;\n \n if (!isNodeActive) {\n return new Set();\n }\n\n // Get active loras from current node only if node is active\n const allActiveLoraNames = getActiveLorasFromNode(node);\n \n // Get connected input LORA_STACK chain nodes and collect their active loras\n const inputChainNodes = getConnectedInputLoraChainNodes(node);\n for (const chainNode of inputChainNodes) {\n const upstreamLoras = collectActiveLorasFromChain(chainNode, visited);\n upstreamLoras.forEach(name => allActiveLoraNames.add(name));\n }\n \n return allActiveLoraNames;\n}\n\n// Update trigger words for connected toggle nodes\nexport function updateConnectedTriggerWords(node, loraNames) {\n const connectedNodes = getConnectedTriggerToggleNodes(node);\n if (connectedNodes.length > 0) {\n const nodeIds = connectedNodes\n .map((connectedNode) => getNodeReference(connectedNode))\n .filter((reference) => reference !== null);\n\n if (nodeIds.length === 0) {\n return;\n }\n\n fetch(lmUrl(\"/api/lm/loras/get_trigger_words\"), {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n lora_names: Array.from(loraNames),\n node_ids: nodeIds\n })\n }).catch(err => console.error(\"Error fetching trigger words:\", err));\n }\n}\n\nexport function mergeLoras(lorasText, lorasArr) {\n // Parse lorasText into a map: name -> {strength, clipStrength}\n const parsedLoras = {};\n let match;\n LORA_PATTERN.lastIndex = 0;\n while ((match = LORA_PATTERN.exec(lorasText)) !== null) {\n const name = match[1];\n const modelStrength = Number(match[2]);\n const clipStrength = match[3] ? Number(match[3]) : modelStrength;\n parsedLoras[name] = { strength: modelStrength, clipStrength };\n }\n\n // Build result array in the order of lorasArr\n const result = [];\n const usedNames = new Set();\n\n for (const lora of lorasArr) {\n if (parsedLoras[lora.name]) {\n result.push({\n name: lora.name,\n strength: lora.strength !== undefined ? lora.strength : parsedLoras[lora.name].strength,\n active: lora.active !== undefined ? lora.active : true,\n expanded: lora.expanded !== undefined ? lora.expanded : false,\n clipStrength: lora.clipStrength !== undefined ? lora.clipStrength : parsedLoras[lora.name].clipStrength,\n selected: !!lora.selected,\n });\n usedNames.add(lora.name);\n }\n }\n\n // Add any new loras from lorasText that are not in lorasArr, in their text order\n for (const name in parsedLoras) {\n if (!usedNames.has(name)) {\n result.push({\n name,\n strength: parsedLoras[name].strength,\n active: true,\n clipStrength: parsedLoras[name].clipStrength,\n selected: false,\n });\n }\n }\n\n return result;\n}\n\n/**\n * Find the actual input element for a widget\n * @param {Object} node - The node instance\n * @param {Object} widget - The widget to find input element for\n * @returns {Promise} The input element or null\n */\nasync function findWidgetInputElement(node, widget) {\n if (widget.inputEl && document.body.contains(widget.inputEl)) {\n return widget.inputEl;\n }\n\n const nodeId = node.id;\n const widgetName = widget.name;\n const maxAttempts = 20;\n const searchInterval = 50;\n\n const searchForInput = (attempt = 0) => {\n return new Promise((resolve) => {\n const doSearch = () => {\n let inputElement = null;\n\n // PRIORITY 1: Use data-node-id attribute (most reliable)\n // Always try this first, regardless of mode - Vue elements may still exist after mode switch\n const nodeContainer = document.querySelector(`[data-node-id=\"${nodeId}\"]`);\n if (nodeContainer) {\n // For text widgets, specifically look for textarea (not checkbox/toggle inputs)\n if (widgetName === 'text') {\n const textarea = nodeContainer.querySelector('textarea');\n if (textarea) {\n inputElement = textarea;\n console.log(`[Lora Manager] Found textarea for widget \"${widgetName}\" on node ${nodeId} via data-node-id`);\n }\n } else {\n // For other widgets, find input within widget containers\n const widgetContainers = nodeContainer.querySelectorAll('.lg-node-widget');\n for (const container of widgetContainers) {\n const input = container.querySelector('input:not([type=\"checkbox\"]), textarea');\n if (input) {\n inputElement = input;\n console.log(`[Lora Manager] Found input element for widget \"${widgetName}\" on node ${nodeId} via data-node-id`);\n break;\n }\n }\n }\n }\n\n // PRIORITY 2: Fallback - heuristic search using widget containers\n if (!inputElement) {\n const allWidgetContainers = document.querySelectorAll('.lg-node-widget, .dom-widget');\n\n for (const container of allWidgetContainers) {\n const hasInput = !!container.querySelector('input, textarea');\n if (!hasInput) continue;\n\n const textContent = container.textContent.toLowerCase();\n const containsWidgetName = textContent.includes(widgetName.toLowerCase());\n const containsNodeTitle = textContent.includes(node.title?.toLowerCase() || '');\n\n // For text widgets, check if it's a textarea\n const isTextareaWidget = widgetName === 'text' && container.querySelector('textarea');\n\n if (containsWidgetName || containsNodeTitle || isTextareaWidget) {\n inputElement = container.querySelector('input, textarea');\n console.log(`[Lora Manager] Found input element for widget \"${widgetName}\" on node ${nodeId} via heuristic`);\n break;\n }\n }\n }\n\n if (inputElement) {\n resolve(inputElement);\n } else if (attempt < maxAttempts) {\n setTimeout(() => searchForInput(attempt + 1).then(resolve), searchInterval);\n } else {\n console.warn(`[Lora Manager] Could not find input element for widget \"${widgetName}\" on node ${nodeId} after ${maxAttempts} attempts`);\n resolve(null);\n }\n };\n doSearch();\n });\n };\n\n return searchForInput();\n}\n\n/**\n * Initialize autocomplete for an input widget and setup cleanup\n * @param {Object} node - The node instance\n * @param {Object} inputWidget - The input widget to add autocomplete to\n * @param {Function} originalCallback - The original callback function\n * @param {string} [modelType='loras'] - The model type used by the autocomplete API\n * @param {Object} [autocompleteOptions] - Additional options for the autocomplete instance\n * @returns {Function} Enhanced callback function with autocomplete\n */\nexport function setupInputWidgetWithAutocomplete(node, inputWidget, originalCallback, modelType = 'loras', autocompleteOptions = {}) {\n const defaultOptions = {\n maxItems: 20,\n minChars: 1,\n debounceDelay: 200,\n };\n const mergedOptions = { ...defaultOptions, ...autocompleteOptions };\n\n setupAutocompleteCleanup(node);\n\n // Track rendering mode changes per node\n let lastVueNodesMode = typeof LiteGraph !== 'undefined' ? LiteGraph.vueNodesMode : false;\n\n const initializeAutocomplete = async () => {\n if (node.autocomplete) {\n console.log(`[Lora Manager] Autocomplete already initialized for widget \"${inputWidget.name}\" on node ${node.id}`);\n return;\n }\n\n try {\n let inputElement = null;\n\n // PRIORITY 1: Always prefer widget.inputEl if it exists (even if not yet in DOM)\n // This is the authoritative element created by ComfyUI\n if (inputWidget.inputEl) {\n inputElement = inputWidget.inputEl;\n // If not yet in DOM, wait for it to be added\n if (!document.body.contains(inputElement)) {\n console.log(`[Lora Manager] widget.inputEl exists but not in DOM yet, waiting for node ${node.id}`);\n const maxWait = 1000; // 1 second max\n const checkInterval = 50;\n let waited = 0;\n while (!document.body.contains(inputElement) && waited < maxWait) {\n await new Promise(r => setTimeout(r, checkInterval));\n waited += checkInterval;\n }\n if (!document.body.contains(inputElement)) {\n console.warn(`[Lora Manager] widget.inputEl still not in DOM after ${maxWait}ms for node ${node.id}`);\n inputElement = null; // Fall through to DOM search\n }\n }\n if (inputElement) {\n console.log(`[Lora Manager] Using widget.inputEl for widget \"${inputWidget.name}\" on node ${node.id}`);\n }\n }\n\n // PRIORITY 2: DOM search only if widget.inputEl doesn't exist\n if (!inputElement) {\n console.log(`[Lora Manager] Searching DOM for input element for widget \"${inputWidget.name}\" on node ${node.id}`);\n inputElement = await findWidgetInputElement(node, inputWidget);\n }\n\n if (inputElement) {\n const autocomplete = new AutoComplete(inputElement, modelType, mergedOptions);\n node.autocomplete = autocomplete;\n console.log(`[Lora Manager] Autocomplete initialized for widget \"${inputWidget.name}\" on node ${node.id}`);\n } else {\n console.warn(`[Lora Manager] Could not find input element for widget \"${inputWidget.name}\" on node ${node.id}`);\n }\n } catch (error) {\n console.error('[Lora Manager] Error initializing autocomplete:', error);\n }\n };\n\n const checkAndInvalidateAutocomplete = () => {\n // Check for rendering mode change\n const currentMode = typeof LiteGraph !== 'undefined' ? LiteGraph.vueNodesMode : false;\n if (currentMode !== lastVueNodesMode) {\n lastVueNodesMode = currentMode;\n if (node.autocomplete) {\n console.log(`[Lora Manager] Rendering mode changed, reinitializing autocomplete for node ${node.id}`);\n node.autocomplete.destroy();\n node.autocomplete = null;\n }\n return true;\n }\n\n // Check if existing autocomplete's input element is still valid\n if (node.autocomplete) {\n const currentInputEl = node.autocomplete.inputElement;\n if (!currentInputEl || !document.body.contains(currentInputEl)) {\n console.log(`[Lora Manager] Autocomplete element detached, reinitializing for node ${node.id}`);\n node.autocomplete.destroy();\n node.autocomplete = null;\n return true;\n }\n\n // Check if autocomplete is bound to wrong element (different from widget.inputEl)\n // Only do this check if widget.inputEl is actually in the DOM - it may be stale\n if (inputWidget.inputEl && document.body.contains(inputWidget.inputEl) && currentInputEl !== inputWidget.inputEl) {\n console.log(`[Lora Manager] Autocomplete bound to wrong element, rebinding for node ${node.id}`);\n node.autocomplete.destroy();\n node.autocomplete = null;\n return true;\n }\n\n // Check if events need rebinding (element exists but events not bound)\n // This can happen when Vue moves the element in the DOM\n if (node.autocomplete.needsRebind()) {\n console.log(`[Lora Manager] Autocomplete events need rebinding for node ${node.id}`);\n node.autocomplete.rebindEvents();\n }\n }\n\n return false;\n };\n\n const enhancedCallback = (value) => {\n // Check validity and invalidate if needed\n checkAndInvalidateAutocomplete();\n\n if (!node.autocomplete) {\n initializeAutocomplete();\n }\n\n if (typeof originalCallback === \"function\") {\n originalCallback.call(node, value);\n }\n };\n\n return enhancedCallback;\n}\n\n/**\n * Setup autocomplete cleanup when node is removed\n * @param {Object} node - The node instance\n */\nexport function setupAutocompleteCleanup(node) {\n // Override onRemoved to cleanup autocomplete\n const originalOnRemoved = node.onRemoved;\n node.onRemoved = function() {\n if (this.autocomplete) {\n this.autocomplete.destroy();\n this.autocomplete = null;\n }\n \n if (originalOnRemoved) {\n originalOnRemoved.call(this);\n }\n };\n}\n\n/**\n * Forward middle mouse (button 1) pointer events from a container to the ComfyUI canvas,\n * so that workflow panning works even when the pointer is over a DOM widget.\n * @param {HTMLElement} container - The root DOM element of the widget\n */\nexport function forwardMiddleMouseToCanvas(container) {\n if (!container) return;\n // Forward pointerdown\n container.addEventListener('pointerdown', (event) => {\n if (event.button === 1) {\n app.canvas.processMouseDown(event);\n }\n });\n // Forward pointermove\n container.addEventListener('pointermove', (event) => {\n if ((event.buttons & 4) === 4) {\n app.canvas.processMouseMove(event);\n }\n });\n // Forward pointerup\n container.addEventListener('pointerup', (event) => {\n if (event.button === 1) {\n app.canvas.processMouseUp(event);\n }\n });\n}\n\n/**\n * Forward wheel events from a container to the ComfyUI canvas for zooming,\n * unless the container has scrollable content.\n * This allows canvas zoom to work when hovering over DOM widgets.\n * @param {HTMLElement} container - The root DOM element of the widget\n * @param {Object} options - Configuration options\n * @param {boolean} options.captureWheel - If true, always capture wheel events (default: false)\n */\nexport function forwardWheelToCanvas(container, options = {}) {\n if (!container) return;\n\n const { captureWheel = false } = options;\n\n container.addEventListener('wheel', (event) => {\n // If explicitly capturing wheel (for internal scrolling), stop here\n if (captureWheel) {\n event.stopPropagation();\n return;\n }\n\n // Access ComfyUI app from global window\n const comfyApp = window.app;\n if (!comfyApp || !comfyApp.canvas || typeof comfyApp.canvas.processMouseWheel !== 'function') {\n return;\n }\n\n const deltaX = event.deltaX;\n const deltaY = event.deltaY;\n const isHorizontal = Math.abs(deltaX) > Math.abs(deltaY);\n\n // 1. Handle pinch-to-zoom (ctrlKey is true for pinch-to-zoom on most browsers)\n if (event.ctrlKey) {\n event.preventDefault();\n event.stopPropagation();\n comfyApp.canvas.processMouseWheel(event);\n return;\n }\n\n // 2. Horizontal scroll: pass to canvas (widgets usually don't scroll horizontally)\n if (isHorizontal) {\n event.preventDefault();\n event.stopPropagation();\n comfyApp.canvas.processMouseWheel(event);\n return;\n }\n\n // 3. Vertical scrolling: check if container is scrollable\n const canScrollY = container.scrollHeight > container.clientHeight;\n\n if (canScrollY) {\n // Container is scrollable, let it handle the wheel event but stop propagation\n // to prevent the canvas from zooming while the user is trying to scroll\n event.stopPropagation();\n } else {\n // Container is NOT scrollable, forward the wheel event to the canvas\n // so it can trigger zoom in/out\n event.preventDefault();\n event.stopPropagation();\n comfyApp.canvas.processMouseWheel(event);\n }\n }, { passive: false });\n}\n\n// Marks scrollable containers whose wheel scrolling must win over canvas zoom.\nconst LM_WHEEL_CLASS = 'lm-wheel-scrollable';\nlet lmWheelHookInstalled = false;\n\n/**\n * Keep vertical wheel scrolling inside a scrollable widget container, even in\n * Nodes 2.0 / Vue mode where ComfyUI's wheel→zoom handler runs on the document\n * in the capture phase (outer than any container-level listener).\n * Installs a single capture-phase hook on `window` (the outermost dispatch\n * point). When the wheel is over a marked, scrollable element, we manually\n * scroll it and fully consume the event so canvas zoom never sees it.\n */\nexport function enableListWheelScroll(container) {\n if (!container) return;\n container.classList.add(LM_WHEEL_CLASS);\n\n if (lmWheelHookInstalled) return;\n lmWheelHookInstalled = true;\n\n window.addEventListener('wheel', (event) => {\n // Let pinch/zoom and horizontal gestures pass through.\n if (event.ctrlKey) return;\n if (Math.abs(event.deltaX) > Math.abs(event.deltaY)) return;\n\n const target = event.target;\n if (!target || typeof target.closest !== 'function') return;\n const el = target.closest(`.${LM_WHEEL_CLASS}`);\n if (!el) return;\n\n const canScrollY = el.scrollHeight > el.clientHeight + 1;\n if (!canScrollY) return;\n\n // Translate deltaMode to approximate pixels.\n const unit = event.deltaMode === 1 ? 16\n : event.deltaMode === 2 ? el.clientHeight\n : 1;\n\n el.scrollTop += event.deltaY * unit;\n\n event.preventDefault();\n event.stopPropagation();\n event.stopImmediatePropagation();\n }, { capture: true, passive: false });\n}\n\n// Get connected Lora Pool node from pool_config input\nexport function getConnectedPoolConfigNode(node) {\n if (!node?.inputs) {\n return null;\n }\n\n for (const input of node.inputs) {\n if (input.name !== \"pool_config\" || !input.link) {\n continue;\n }\n\n const link = getLinkFromGraph(node.graph, input.link);\n if (!link) {\n continue;\n }\n\n const sourceNode = node.graph?.getNodeById?.(link.origin_id);\n if (sourceNode && sourceNode.comfyClass === \"Lora Pool (LoraManager)\") {\n return sourceNode;\n }\n }\n\n return null;\n}\n\n// Get pool config widget value from connected Lora Pool node\nexport function getPoolConfigFromConnectedNode(node) {\n const poolNode = getConnectedPoolConfigNode(node);\n if (!poolNode) {\n return null;\n }\n\n const isNodeActive = poolNode.mode === undefined || poolNode.mode === 0 || poolNode.mode === 3;\n if (!isNodeActive) {\n return null;\n }\n\n const poolWidget = poolNode.widgets?.find(w => w.name === \"pool_config\");\n return poolWidget?.value || null;\n}\n\n// Helper function to find and update downstream Lora Loader nodes\nexport function updateDownstreamLoaders(startNode, visited = new Set()) {\n const nodeKey = getNodeKey(startNode);\n if (!nodeKey || visited.has(nodeKey)) return;\n visited.add(nodeKey);\n\n // Check each output link\n if (startNode.outputs) {\n for (const output of startNode.outputs) {\n if (output.links) {\n for (const linkId of output.links) {\n const link = getLinkFromGraph(startNode.graph, linkId);\n if (link) {\n const targetNode = startNode.graph?.getNodeById?.(link.target_id);\n\n // If target is a Lora Loader, collect all active loras in the chain and update\n if (\n targetNode &&\n targetNode.comfyClass === \"Lora Loader (LoraManager)\"\n ) {\n const allActiveLoraNames =\n collectActiveLorasFromChain(targetNode);\n updateConnectedTriggerWords(targetNode, allActiveLoraNames);\n }\n // If target is another LORA_STACK chain node, recursively check its outputs\n else if (targetNode && isLoraChainNode(targetNode.comfyClass)) {\n updateDownstreamLoaders(targetNode, visited);\n }\n }\n }\n }\n }\n }\n}\n","/**\n * Mode change handler for LoRA provider nodes.\n *\n * Provides common mode change logic for nodes that provide LoRA configurations:\n * - Lora Stacker (LoraManager)\n * - Lora Randomizer (LoraManager)\n * - Lora Cycler (LoraManager)\n */\n\n// @ts-ignore\nimport { interceptModeChange } from '../../web/comfyui/utils.js'\n\n/**\n * List of node types that act as LoRA providers in the workflow chain.\n * These nodes can be traversed when collecting active LoRAs and can trigger\n * downstream loader updates when their mode or active LoRAs change.\n */\nexport const LORA_PROVIDER_NODE_TYPES = [\n \"Lora Stacker (LoraManager)\",\n \"Lora Randomizer (LoraManager)\",\n \"Lora Cycler (LoraManager)\",\n \"Create Hook LoRA (LoraManager)\",\n] as const;\n\n/**\n * Nodes that do not own LoRA state themselves, but merge or forward LORA_STACK\n * inputs so downstream trigger-word updates must traverse through them.\n */\nexport const LORA_STACK_AGGREGATOR_NODE_TYPES = [\n \"Lora Stack Combiner (LoraManager)\",\n] as const;\n\nexport const LORA_CHAIN_NODE_TYPES = [\n ...LORA_PROVIDER_NODE_TYPES,\n ...LORA_STACK_AGGREGATOR_NODE_TYPES,\n] as const;\n\nexport type LoraProviderNodeType = typeof LORA_PROVIDER_NODE_TYPES[number];\nexport type LoraStackAggregatorNodeType = typeof LORA_STACK_AGGREGATOR_NODE_TYPES[number];\nexport type LoraChainNodeType = typeof LORA_CHAIN_NODE_TYPES[number];\n\n/**\n * Check if a node class is a LoRA provider node.\n */\nexport function isLoraProviderNode(comfyClass: string): comfyClass is LoraProviderNodeType {\n return LORA_PROVIDER_NODE_TYPES.includes(comfyClass as LoraProviderNodeType);\n}\n\nexport function isLoraStackAggregatorNode(\n comfyClass: string\n): comfyClass is LoraStackAggregatorNodeType {\n return LORA_STACK_AGGREGATOR_NODE_TYPES.includes(comfyClass as LoraStackAggregatorNodeType);\n}\n\nexport function isLoraChainNode(comfyClass: string): comfyClass is LoraChainNodeType {\n return LORA_CHAIN_NODE_TYPES.includes(comfyClass as LoraChainNodeType);\n}\n\n/**\n * Extract active LoRA filenames from a node based on its type.\n *\n * For Lora Stacker and Lora Randomizer: extracts from lorasWidget (array of loras, filtered by active)\n * For Lora Cycler: extracts from cycler_config widget (single current_lora_filename)\n */\nexport function getActiveLorasFromNodeByType(node: any): Set {\n const comfyClass = node?.comfyClass;\n\n if (comfyClass === \"Lora Cycler (LoraManager)\") {\n return extractFromCyclerConfig(node);\n }\n\n if (isLoraStackAggregatorNode(comfyClass)) {\n return new Set();\n }\n\n // Default: use lorasWidget (works for Stacker and Randomizer)\n return extractFromLorasWidget(node);\n}\n\n/**\n * Extract active LoRAs from a node's lorasWidget.\n * Used by Lora Stacker and Lora Randomizer.\n */\nfunction extractFromLorasWidget(node: any): Set {\n const activeLoraNames = new Set();\n const lorasWidget = node.lorasWidget || node.widgets?.find((w: any) => w.name === 'loras');\n\n if (lorasWidget?.value) {\n lorasWidget.value.forEach((lora: any) => {\n if (lora.active) {\n activeLoraNames.add(lora.name);\n }\n });\n }\n\n return activeLoraNames;\n}\n\n/**\n * Extract the active LoRA from a Lora Cycler node.\n * The Cycler has only one active LoRA at a time, stored in cycler_config.current_lora_filename.\n */\nfunction extractFromCyclerConfig(node: any): Set {\n const activeLoraNames = new Set();\n const cyclerWidget = node.widgets?.find((w: any) => w.name === 'cycler_config');\n\n if (cyclerWidget?.value?.current_lora_filename) {\n activeLoraNames.add(cyclerWidget.value.current_lora_filename);\n }\n\n return activeLoraNames;\n}\n\n/**\n * Check if a mode value represents an active node.\n * Active modes: 0 (Always), 3 (On Trigger)\n * Inactive modes: 2 (Never), 4 (Bypass)\n */\nexport function isNodeActive(mode: number | undefined): boolean {\n return mode === undefined || mode === 0 || mode === 3;\n}\n\n/**\n * Setup a mode change handler for a node.\n *\n * Delegates to `interceptModeChange`, which observes the mode property\n * without shadowing the frontend's own `mode` accessor. Since ComfyUI\n * frontend 1.53, `mode` is backed by shell state (`node._state.mode`) that\n * serialization reads directly — redefining the property on the instance\n * would silently revert bypass/mute on save/reload.\n *\n * @param node - The node to set up the handler for\n * @param onModeChange - Callback function called when mode changes (receives newMode and oldMode)\n */\nexport function setupModeChangeHandler(\n node: any,\n onModeChange: (newMode: number, oldMode: number) => void\n): void {\n interceptModeChange(node, onModeChange);\n}\n\n/**\n * Create a mode change callback that updates downstream loaders.\n *\n * This is the standard callback used by all LoRA provider nodes.\n * When mode changes:\n * 1. Determine if the node is active (mode 0 or 3)\n * 2. Get active LoRAs (empty set if inactive)\n * 3. Call the optional node-specific callback (e.g., updateConnectedTriggerWords for Stacker)\n * 4. Update downstream loaders\n *\n * @param node - The node instance\n * @param updateDownstreamLoaders - Function to update downstream loaders (from utils.js)\n * @param nodeSpecificCallback - Optional callback for node-specific behavior\n */\nexport function createModeChangeCallback(\n node: any,\n updateDownstreamLoaders: (node: any) => void,\n nodeSpecificCallback?: (activeLoraNames: Set) => void\n): (newMode: number, oldMode: number) => void {\n return (newMode: number, _oldMode: number) => {\n const isNodeCurrentlyActive = isNodeActive(newMode);\n const activeLoraNames = isNodeCurrentlyActive\n ? getActiveLorasFromNodeByType(node)\n : new Set();\n\n // Node-specific handling (e.g., Lora Stacker's direct trigger toggle updates)\n if (nodeSpecificCallback) {\n nodeSpecificCallback(activeLoraNames);\n }\n\n // Always update downstream loaders\n updateDownstreamLoaders(node);\n };\n}\n","import { createApp, type App as VueApp } from 'vue'\nimport PrimeVue from 'primevue/config'\nimport LoraPoolWidget from '@/components/LoraPoolWidget.vue'\nimport LoraRandomizerWidget from '@/components/LoraRandomizerWidget.vue'\nimport LoraCyclerWidget from '@/components/LoraCyclerWidget.vue'\nimport JsonDisplayWidget from '@/components/JsonDisplayWidget.vue'\nimport AutocompleteTextWidget from '@/components/AutocompleteTextWidget.vue'\nimport LoraInfoWidget from '@/components/LoraInfoWidget.vue'\nimport { createVueWidgetCleanup } from './vue-widget-cleanup'\nimport type { LoraPoolConfig, RandomizerConfig, CyclerConfig } from './composables/types'\nimport {\n setupModeChangeHandler,\n createModeChangeCallback,\n LORA_CHAIN_NODE_TYPES\n} from './mode-change-handler'\n\nconst LORA_POOL_WIDGET_MIN_WIDTH = 500\nconst LORA_POOL_WIDGET_MIN_HEIGHT = 520\nconst LORA_RANDOMIZER_WIDGET_MIN_WIDTH = 500\nconst LORA_RANDOMIZER_WIDGET_MIN_HEIGHT = 448\nconst LORA_RANDOMIZER_WIDGET_MAX_HEIGHT = LORA_RANDOMIZER_WIDGET_MIN_HEIGHT\nconst LORA_CYCLER_WIDGET_MIN_WIDTH = 380\nconst LORA_CYCLER_WIDGET_MIN_HEIGHT = 408\nconst LORA_CYCLER_WIDGET_MAX_HEIGHT = LORA_CYCLER_WIDGET_MIN_HEIGHT\nconst JSON_DISPLAY_WIDGET_MIN_WIDTH = 300\nconst JSON_DISPLAY_WIDGET_MIN_HEIGHT = 200\nconst LORA_INFO_WIDGET_MIN_WIDTH = 300\nconst LORA_INFO_WIDGET_MIN_HEIGHT = 200\nconst AUTOCOMPLETE_TEXT_WIDGET_MIN_HEIGHT = 60\nconst AUTOCOMPLETE_TEXT_WIDGET_MAX_HEIGHT = 100\n// Per-modelType min size hints for node initial sizing.\n// These are returned from the factory so ComfyUI's _initialMinSize mechanism\n// gives the node a sensible default width (and height for prompt/embeddings).\nconst AUTOCOMPLETE_TEXT_MIN_WIDTH_DEFAULT = 400\nconst AUTOCOMPLETE_TEXT_MIN_HEIGHT_DEFAULT = 300\nconst AUTOCOMPLETE_METADATA_VERSION = 1\nconst LORA_MANAGER_WIDGET_IDS_PROPERTY = '__lm_widget_ids'\n\n// Access LiteGraph global for Vue DOM mode detection (matches AutocompleteTextWidget.vue)\ndeclare const LiteGraph: { vueNodesMode?: boolean } | undefined\n\n// @ts-ignore - ComfyUI external module\nimport { app } from '../../../scripts/app.js'\n// @ts-ignore - ComfyUI external module\nimport { api } from '../../../scripts/api.js'\n// @ts-ignore\nimport { getPoolConfigFromConnectedNode, getActiveLorasFromNode, updateConnectedTriggerWords, updateDownstreamLoaders } from '../../web/comfyui/utils.js'\n// @ts-ignore\nimport { stripAutocompleteMetadataFromPromptResult } from '../../web/comfyui/autocomplete.js'\n\n// Strip the autocomplete lastAccepted boundary from exported workflows.\n// lastAccepted carries old prompt text (insertedText/textSnapshot) and is\n// session-only state; it must not leak into exported JSON (#1093).\n// graphToPrompt is shared by workflow export, Export API and queueing.\n// Local saves go through the change-tracker snapshot (no graphToPrompt) and\n// are intentionally left untouched so cross-session caret continuity is kept.\n// Post-processing the resolved result avoids any window/race with\n// change-tracker or copy/paste serialization of live state.\nconst originalGraphToPrompt = app.graphToPrompt.bind(app)\napp.graphToPrompt = async (...args: unknown[]) => {\n const result = await originalGraphToPrompt(...args)\n stripAutocompleteMetadataFromPromptResult(result)\n return result\n}\n\nfunction forwardMiddleMouseToCanvas(container: HTMLElement) {\n if (!container) return\n\n container.addEventListener('pointerdown', (event) => {\n if (event.button === 1) {\n const canvas = app.canvas\n if (canvas && typeof canvas.processMouseDown === 'function') {\n canvas.processMouseDown(event)\n }\n }\n })\n\n container.addEventListener('pointermove', (event) => {\n if ((event.buttons & 4) === 4) {\n const canvas = app.canvas\n if (canvas && typeof canvas.processMouseMove === 'function') {\n canvas.processMouseMove(event)\n }\n }\n })\n\n container.addEventListener('pointerup', (event) => {\n if (event.button === 1) {\n const canvas = app.canvas\n if (canvas && typeof canvas.processMouseUp === 'function') {\n canvas.processMouseUp(event)\n }\n }\n })\n}\n\nconst vueApps = new Map()\nlet autocompleteTextWidgetInstanceId = 0\n\nexport function createAutocompleteTextWidgetInstanceId() {\n autocompleteTextWidgetInstanceId += 1\n return autocompleteTextWidgetInstanceId\n}\n\n// @ts-ignore\nfunction createLoraPoolWidget(node) {\n const container = document.createElement('div')\n container.id = `lora-pool-widget-${node.id}`\n container.style.width = '100%'\n container.style.height = '100%'\n container.style.display = 'flex'\n container.style.flexDirection = 'column'\n container.style.overflow = 'hidden'\n\n forwardMiddleMouseToCanvas(container)\n\n let internalValue: LoraPoolConfig | undefined\n\n const widget = node.addDOMWidget(\n 'pool_config',\n 'LORA_POOL_CONFIG',\n container,\n {\n getValue() {\n return internalValue\n },\n setValue(v: LoraPoolConfig) {\n internalValue = v\n // ComfyUI automatically calls widget.callback after setValue\n // No need for custom onSetValue mechanism\n },\n serialize: true,\n // Keep LM DOM widgets out of the right-side Properties Panel: the panel\n // falls back to WidgetLegacy for unknown widget types and writes\n // widget.width onto the real widget, squashing the canvas overlay\n // (ComfyUI_frontend #11574).\n hideInPanel: true,\n // Per dev guide: providing getMinHeight via options allows the system to\n // skip expensive DOM measurements during rendering loop, improving performance\n getMinHeight() {\n return LORA_POOL_WIDGET_MIN_HEIGHT\n }\n }\n )\n\n const vueApp = createApp(LoraPoolWidget, {\n widget,\n node\n })\n\n vueApp.use(PrimeVue, {\n unstyled: true,\n ripple: false\n })\n\n vueApp.mount(container)\n vueApps.set(node.id, vueApp)\n\n widget.computeLayoutSize = () => {\n const minWidth = LORA_POOL_WIDGET_MIN_WIDTH\n const minHeight = LORA_POOL_WIDGET_MIN_HEIGHT\n\n return { minHeight, minWidth }\n }\n\n widget.onRemove = () => {\n const vueApp = vueApps.get(node.id)\n if (vueApp) {\n vueApp.unmount()\n vueApps.delete(node.id)\n }\n }\n\n return { widget }\n}\n\n// @ts-ignore\nfunction createLoraRandomizerWidget(node) {\n const container = document.createElement('div')\n container.id = `lora-randomizer-widget-${node.id}`\n container.style.width = '100%'\n container.style.height = '100%'\n container.style.display = 'flex'\n container.style.flexDirection = 'column'\n container.style.overflow = 'hidden'\n\n forwardMiddleMouseToCanvas(container)\n\n // Initialize with default config to avoid sending undefined/empty string to backend\n const defaultConfig: RandomizerConfig = {\n count_mode: 'range',\n count_fixed: 3,\n count_min: 2,\n count_max: 5,\n model_strength_min: 0.0,\n model_strength_max: 1.0,\n use_same_clip_strength: true,\n clip_strength_min: 0.0,\n clip_strength_max: 1.0,\n roll_mode: 'fixed',\n use_recommended_strength: false,\n recommended_strength_scale_min: 0.5,\n recommended_strength_scale_max: 1.0,\n }\n let internalValue: RandomizerConfig = defaultConfig\n\n const widget = node.addDOMWidget(\n 'randomizer_config',\n 'RANDOMIZER_CONFIG',\n container,\n {\n getValue() {\n return internalValue\n },\n setValue(v: RandomizerConfig) {\n internalValue = v\n // ComfyUI automatically calls widget.callback after setValue\n // No need for custom onSetValue mechanism\n },\n serialize: true,\n hideInPanel: true,\n getMinHeight() {\n return LORA_RANDOMIZER_WIDGET_MIN_HEIGHT\n }\n }\n )\n\n // Add method to get pool config from connected node\n node.getPoolConfig = () => getPoolConfigFromConnectedNode(node)\n\n // Handle roll event from Vue component\n widget.onRoll = (randomLoras: any[]) => {\n // Find the loras widget on this node and update it\n const lorasWidget = node.widgets.find((w: any) => w.name === 'loras')\n if (lorasWidget) {\n lorasWidget.value = randomLoras\n }\n }\n\n const vueApp = createApp(LoraRandomizerWidget, {\n widget,\n node,\n api\n })\n\n vueApp.use(PrimeVue, {\n unstyled: true,\n ripple: false\n })\n\n vueApp.mount(container)\n vueApps.set(node.id + 10000, vueApp) // Offset to avoid collision with pool widget\n\n widget.computeLayoutSize = () => {\n const minWidth = LORA_RANDOMIZER_WIDGET_MIN_WIDTH\n const minHeight = LORA_RANDOMIZER_WIDGET_MIN_HEIGHT\n const maxHeight = LORA_RANDOMIZER_WIDGET_MAX_HEIGHT\n\n return { minHeight, minWidth, maxHeight }\n }\n\n widget.onRemove = () => {\n const vueApp = vueApps.get(node.id + 10000)\n if (vueApp) {\n vueApp.unmount()\n vueApps.delete(node.id + 10000)\n }\n }\n\n return { widget }\n}\n\n// @ts-ignore\nfunction createLoraCyclerWidget(node) {\n const container = document.createElement('div')\n container.id = `lora-cycler-widget-${node.id}`\n container.style.width = '100%'\n container.style.height = '100%'\n container.style.display = 'flex'\n container.style.flexDirection = 'column'\n container.style.overflow = 'hidden'\n\n forwardMiddleMouseToCanvas(container)\n\n const defaultConfig: CyclerConfig = {\n current_index: 1,\n total_count: 0,\n pool_config_hash: '',\n model_strength: 1.0,\n clip_strength: 1.0,\n use_same_clip_strength: true,\n use_preset_strength: false,\n preset_strength_scale: 1.0,\n sort_by: 'filename',\n current_lora_name: '',\n current_lora_filename: '',\n repeat_count: 1,\n repeat_used: 0,\n is_paused: false,\n include_no_lora: false,\n }\n let internalValue: CyclerConfig | undefined = defaultConfig\n\n const widget = node.addDOMWidget(\n 'cycler_config',\n 'CYCLER_CONFIG',\n container,\n {\n getValue() {\n return internalValue\n },\n setValue(v: CyclerConfig) {\n const oldFilename = internalValue?.current_lora_filename\n internalValue = v\n // ComfyUI automatically calls widget.callback after setValue\n // No need for custom onSetValue mechanism\n // Update downstream loaders when the active LoRA filename changes\n if (oldFilename !== v?.current_lora_filename) {\n updateDownstreamLoaders(node)\n }\n },\n serialize: true,\n hideInPanel: true,\n getMinHeight() {\n return LORA_CYCLER_WIDGET_MIN_HEIGHT\n }\n }\n )\n\n // Add method to get pool config from connected node\n node.getPoolConfig = () => getPoolConfigFromConnectedNode(node)\n\n const vueApp = createApp(LoraCyclerWidget, {\n widget,\n node,\n api\n })\n\n vueApp.use(PrimeVue, {\n unstyled: true,\n ripple: false\n })\n\n vueApp.mount(container)\n vueApps.set(node.id + 30000, vueApp) // Offset to avoid collision with other widgets\n\n widget.computeLayoutSize = () => {\n const minWidth = LORA_CYCLER_WIDGET_MIN_WIDTH\n const minHeight = LORA_CYCLER_WIDGET_MIN_HEIGHT\n const maxHeight = LORA_CYCLER_WIDGET_MAX_HEIGHT\n\n return { minHeight, minWidth, maxHeight }\n }\n\n widget.onRemove = () => {\n const vueApp = vueApps.get(node.id + 30000)\n if (vueApp) {\n vueApp.unmount()\n vueApps.delete(node.id + 30000)\n }\n }\n\n return { widget }\n}\n\n// @ts-ignore\nfunction createJsonDisplayWidget(node) {\n const container = document.createElement('div')\n container.id = `json-display-widget-${node.id}`\n container.style.width = '100%'\n container.style.height = '100%'\n container.style.display = 'flex'\n container.style.flexDirection = 'column'\n container.style.overflow = 'hidden'\n\n forwardMiddleMouseToCanvas(container)\n\n let internalValue: Record | undefined\n\n const widget = node.addDOMWidget(\n 'metadata',\n 'JSON_DISPLAY',\n container,\n {\n getValue() {\n return internalValue\n },\n setValue(v: Record) {\n internalValue = v\n if (typeof widget.onSetValue === 'function') {\n widget.onSetValue(v)\n }\n },\n serialize: false, // Display-only widget - don't save metadata in workflows\n hideInPanel: true,\n getMinHeight() {\n return JSON_DISPLAY_WIDGET_MIN_HEIGHT\n }\n }\n )\n\n const vueApp = createApp(JsonDisplayWidget, {\n widget,\n node\n })\n\n vueApp.use(PrimeVue, {\n unstyled: true,\n ripple: false\n })\n\n vueApp.mount(container)\n vueApps.set(node.id + 20000, vueApp) // Offset to avoid collision with other widgets\n\n widget.computeLayoutSize = () => {\n const minWidth = JSON_DISPLAY_WIDGET_MIN_WIDTH\n const minHeight = JSON_DISPLAY_WIDGET_MIN_HEIGHT\n\n return { minHeight, minWidth }\n }\n\n widget.onRemove = () => {\n const vueApp = vueApps.get(node.id + 20000)\n if (vueApp) {\n vueApp.unmount()\n vueApps.delete(node.id + 20000)\n }\n }\n\n return { widget }\n}\n\nconst widgetInputOptions: Map = new Map()\n\nfunction getSerializableWidgetNames(node: any): string[] {\n return (node.widgets || [])\n .filter((widget: any) => widget && widget.serialize !== false)\n .map((widget: any) => widget.name)\n}\n\nfunction createAutocompleteMetadataValue(textWidgetName = 'text') {\n return {\n version: AUTOCOMPLETE_METADATA_VERSION,\n textWidgetName\n }\n}\n\nfunction shouldBypassAutocompleteWidgetMigration(\n node: any,\n widgetValues: unknown[]\n): boolean {\n const inputDefs = node?.constructor?.nodeData?.inputs\n if (!inputDefs || !Array.isArray(widgetValues)) {\n return false\n }\n\n const widgetNames = new Set((node.widgets || []).map((widget: any) => widget?.name))\n const hasAutocompleteMetadataWidget = Array.from(widgetNames).some((name) =>\n typeof name === 'string' && name.startsWith('__lm_autocomplete_meta_')\n )\n\n if (!hasAutocompleteMetadataWidget) {\n return false\n }\n\n const originalWidgetsInputs = Object.values(inputDefs).filter((input: any) =>\n widgetNames.has(input.name) || input.forceInput\n )\n\n const widgetIndexHasForceInput = originalWidgetsInputs.flatMap((input: any) =>\n input.control_after_generate\n ? [!!input.forceInput, false]\n : [!!input.forceInput]\n )\n\n const result = (\n widgetIndexHasForceInput.some(Boolean) &&\n widgetIndexHasForceInput.length === widgetValues.length\n )\n\n return result\n}\n\nfunction remapWidgetValuesByName(\n widgetValues: unknown[],\n savedWidgetNames: string[],\n currentWidgetNames: string[]\n): unknown[] {\n const valueByName = new Map()\n savedWidgetNames.forEach((name, index) => {\n if (index < widgetValues.length) {\n valueByName.set(name, widgetValues[index])\n }\n })\n\n const currentWidgetNameSet = new Set(currentWidgetNames)\n const remappedValues: unknown[] = []\n for (const name of currentWidgetNames) {\n if (valueByName.has(name)) {\n remappedValues.push(valueByName.get(name))\n }\n }\n\n // Append values for saved widget names that are NOT in the current widget\n // list (e.g. forceInput widgets like \"seed\" that haven't been converted\n // back to DOM widgets yet at configure time). Without these, the\n // resulting array may accidentally match the length of ComfyUI's\n // widgetIndexHasForceInput array, causing migrateWidgetsValues to\n // incorrectly filter out the wrong values and drop real widget content.\n for (const name of savedWidgetNames) {\n if (!currentWidgetNameSet.has(name) && valueByName.has(name)) {\n remappedValues.push(valueByName.get(name))\n }\n }\n\n return remappedValues\n}\n\nfunction injectDefaultAutocompleteMetadataValues(\n widgetValues: unknown[],\n currentWidgetNames: string[]\n): unknown[] {\n const repairedValues: unknown[] = []\n let legacyValueIndex = 0\n\n for (const widgetName of currentWidgetNames) {\n if (widgetName.startsWith('__lm_autocomplete_meta_')) {\n const textWidgetName = widgetName.replace('__lm_autocomplete_meta_', '') || 'text'\n repairedValues.push(createAutocompleteMetadataValue(textWidgetName))\n continue\n }\n\n if (legacyValueIndex < widgetValues.length) {\n repairedValues.push(widgetValues[legacyValueIndex])\n legacyValueIndex++\n }\n }\n\n return repairedValues\n}\n\nfunction normalizeAutocompleteWidgetValues(node: any, info: any) {\n if (!info || !Array.isArray(info.widgets_values)) {\n return\n }\n\n const currentWidgetNames = getSerializableWidgetNames(node)\n\n if (currentWidgetNames.length === 0) {\n return\n }\n\n const savedWidgetNames = info.properties?.[LORA_MANAGER_WIDGET_IDS_PROPERTY]\n\n if (Array.isArray(savedWidgetNames) && savedWidgetNames.length > 0) {\n const remappedValues = remapWidgetValuesByName(\n info.widgets_values,\n savedWidgetNames,\n currentWidgetNames\n )\n info.widgets_values = remappedValues\n return\n }\n\n const metadataWidgetCount = currentWidgetNames.filter((name) =>\n name.startsWith('__lm_autocomplete_meta_')\n ).length\n\n if (\n metadataWidgetCount > 0 &&\n info.widgets_values.length === currentWidgetNames.length - metadataWidgetCount\n ) {\n const repairedValues = injectDefaultAutocompleteMetadataValues(\n info.widgets_values,\n currentWidgetNames\n )\n info.widgets_values = repairedValues\n }\n}\n\nfunction applyAutocompleteTextLayoutFix(\n widget: any,\n _container: HTMLElement | undefined,\n isVueMode: boolean\n): void {\n // In Vue rendering mode the WidgetDOM wrapper handles sizing, so we\n // only provide a computeSize hint and leave the container unconstrained.\n // In canvas mode we clear all custom sizing so LiteGraph's default\n // widget-area layout takes over. Neither path sets a hard max-height;\n // the textarea can grow freely (e.g. in app mode where\n // [&_textarea]:resize-y applies).\n if (isVueMode) {\n ;(widget as any).computeLayoutSize = undefined\n widget.computeSize = (width?: number) =>\n [width ?? 200, AUTOCOMPLETE_TEXT_WIDGET_MAX_HEIGHT - 4]\n } else {\n delete (widget as any).computeLayoutSize\n delete (widget as any).computeSize\n }\n}\n\n// Listen for Vue DOM mode setting changes and dispatch custom event\nconst initVueDomModeListener = () => {\n if (app.ui?.settings?.addEventListener) {\n app.ui.settings.addEventListener('Comfy.VueNodes.Enabled.change', () => {\n // Use requestAnimationFrame to ensure the setting value has been updated\n // before we read it (the event may fire before internal state updates)\n requestAnimationFrame(() => {\n const isVueDomMode = app.ui?.settings?.getSettingValue?.('Comfy.VueNodes.Enabled') ?? false\n\n if (app.graph?.nodes) {\n for (const node of app.graph.nodes) {\n const textWidget = node.widgets?.find(\n (w: any) => w.type === 'AUTOCOMPLETE_TEXT_LORAS'\n )\n if (!textWidget) continue\n const container = (textWidget as any).element as HTMLElement | undefined\n applyAutocompleteTextLayoutFix(textWidget, container, isVueDomMode)\n }\n }\n\n requestAnimationFrame(() => {\n for (const nodeEl of document.querySelectorAll('[data-node-id]')) {\n const grid = nodeEl.querySelector('[data-testid=\"node-widgets\"]') as HTMLElement | null\n if (!grid) continue\n const nodeId = nodeEl.getAttribute('data-node-id')\n const node = app.graph?.getNodeById(nodeId as any)\n if (!node) continue\n const rows: string[] = []\n let needsFix = false\n for (const w of node.widgets ?? []) {\n if (w.type === 'LORA_MANAGER_AUTOCOMPLETE_METADATA') {\n rows.push('min-content')\n } else if (w.name === 'loras') {\n rows.push('auto')\n } else if (w.name === 'text' && w.type === 'AUTOCOMPLETE_TEXT_LORAS') {\n rows.push(isVueDomMode ? 'min-content' : 'auto')\n needsFix = true\n } else {\n rows.push('auto')\n }\n }\n if (needsFix) {\n grid.style.gridTemplateRows = rows.join(' ')\n }\n }\n })\n\n app.canvas?.setDirty(true, true)\n\n document.dispatchEvent(new CustomEvent('lora-manager:vue-mode-change', {\n detail: { isVueDomMode }\n }))\n })\n })\n }\n}\n\n// Initialize listener when app is ready\nif (app.ui?.settings) {\n initVueDomModeListener()\n} else {\n // Defer until app is ready\n const checkAppReady = setInterval(() => {\n if (app.ui?.settings) {\n initVueDomModeListener()\n clearInterval(checkAppReady)\n }\n }, 100)\n}\n\n// @ts-ignore\nfunction createLoraInfoWidget(node: any) {\n const container = document.createElement('div')\n container.id = `lora-info-widget-${node.id}`\n container.style.width = '100%'\n container.style.height = '100%'\n container.style.display = 'flex'\n container.style.flexDirection = 'column'\n container.style.overflow = 'hidden'\n\n forwardMiddleMouseToCanvas(container)\n\n let internalValue: { name?: string; notes?: string; filePath?: string; activeTab?: string } | undefined\n\n const widget = node.addDOMWidget(\n 'lora_info_display',\n 'LORA_INFO_DISPLAY',\n container,\n {\n getValue() {\n return internalValue\n },\n setValue(v: { name?: string; notes?: string; filePath?: string; activeTab?: string }) {\n internalValue = v\n if (typeof widget.onSetValue === 'function') {\n widget.onSetValue(v)\n }\n },\n serialize: true,\n hideInPanel: true,\n getMinHeight() {\n return LORA_INFO_WIDGET_MIN_HEIGHT\n }\n }\n )\n\n const vueApp = createApp(LoraInfoWidget, {\n widget,\n node,\n api,\n app,\n isVueMode: typeof LiteGraph !== 'undefined' && LiteGraph.vueNodesMode,\n })\n\n vueApp.use(PrimeVue, {\n unstyled: true,\n ripple: false\n })\n\n vueApp.mount(container)\n vueApps.set(node.id + 40000, vueApp) // Offset to avoid collision\n\n widget.computeLayoutSize = () => {\n const minWidth = LORA_INFO_WIDGET_MIN_WIDTH\n const minHeight = LORA_INFO_WIDGET_MIN_HEIGHT\n\n return { minHeight, minWidth }\n }\n\n widget.onRemove = () => {\n const vueApp = vueApps.get(node.id + 40000)\n if (vueApp) {\n vueApp.unmount()\n vueApps.delete(node.id + 40000)\n }\n }\n\n return { widget }\n}\n\n// Factory function for creating autocomplete text widgets\n// @ts-ignore\nfunction createAutocompleteTextWidgetFactory(\n node: any,\n widgetName: string,\n modelType: 'loras' | 'prompt',\n inputOptions: { placeholder?: string } = {}\n) {\n const metadataWidgetName = `__lm_autocomplete_meta_${widgetName}`\n\n let container: HTMLElement | null = null\n\n const existingContainers = document.querySelectorAll(\n '[id^=\"autocomplete-text-widget-\"]'\n )\n for (const el of existingContainers) {\n if (el.children.length === 0) {\n container = el\n break\n }\n }\n\n if (!container) {\n const instanceId = String(createAutocompleteTextWidgetInstanceId())\n container = document.createElement('div')\n container.id = `autocomplete-text-widget-${instanceId}`\n container.style.width = '100%'\n container.style.height = '100%'\n container.style.display = 'flex'\n container.style.flexDirection = 'column'\n container.style.overflow = 'hidden'\n forwardMiddleMouseToCanvas(container)\n }\n\n // Store textarea reference on the container element so cloned widgets can access it\n // This is necessary because when widgets are promoted to subgraph nodes,\n // the cloned widget shares the same element but needs access to inputEl\n const widgetElementRef = { inputEl: undefined as HTMLTextAreaElement | undefined }\n ;(container as any).__widgetInputEl = widgetElementRef\n\n const metadataWidget = node.addWidget('text', metadataWidgetName, {\n version: AUTOCOMPLETE_METADATA_VERSION,\n textWidgetName: widgetName\n })\n metadataWidget.value = createAutocompleteMetadataValue(widgetName)\n metadataWidget.type = 'LORA_MANAGER_AUTOCOMPLETE_METADATA'\n metadataWidget.hidden = true\n metadataWidget.computeSize = () => [0, -4]\n metadataWidget.serializeValue = () => metadataWidget.value\n\n const widget = node.addDOMWidget(\n widgetName,\n `AUTOCOMPLETE_TEXT_${modelType.toUpperCase()}`,\n container,\n {\n getValue() {\n // Access inputEl from widget or from the shared element reference\n const inputEl = widget.inputEl ?? (container as any).__widgetInputEl?.inputEl\n return inputEl?.value ?? ''\n },\n setValue(v: string) {\n // Access inputEl from widget or from the shared element reference\n const inputEl = widget.inputEl ?? (container as any).__widgetInputEl?.inputEl\n if (inputEl) {\n inputEl.value = v ?? ''\n // Notify Vue component of value change via custom event\n inputEl.dispatchEvent(new CustomEvent('lora-manager:autocomplete-value-changed', {\n detail: { value: v ?? '' }\n }))\n } else {\n ;(widget as any)._pendingValue = v ?? ''\n }\n // Also call onSetValue if defined (for Vue component integration)\n if (typeof widget.onSetValue === 'function') {\n widget.onSetValue(v ?? '')\n }\n },\n serialize: true,\n hideInPanel: true,\n getMinHeight() {\n return AUTOCOMPLETE_TEXT_WIDGET_MIN_HEIGHT\n },\n ...(modelType === 'loras' && {\n getMaxHeight() {\n return AUTOCOMPLETE_TEXT_WIDGET_MAX_HEIGHT\n }\n })\n }\n )\n widget.metadataWidget = metadataWidget\n\n // Get spellcheck setting from ComfyUI settings (default: false)\n const spellcheck = app.ui?.settings?.getSettingValue?.('Comfy.TextareaWidget.Spellcheck') ?? false\n\n const maxHeight = modelType === 'loras' ? AUTOCOMPLETE_TEXT_WIDGET_MAX_HEIGHT : undefined\n\n const vueApp = createApp(AutocompleteTextWidget, {\n widget,\n node,\n modelType,\n placeholder: inputOptions.placeholder || widgetName,\n showPreview: true,\n spellcheck,\n maxHeight\n })\n\n vueApp.use(PrimeVue, {\n unstyled: true,\n ripple: false\n })\n\n vueApp.mount(container)\n const appKey = container.id\n vueApps.set(appKey, vueApp)\n\n if (maxHeight) {\n container.style.minHeight = `${AUTOCOMPLETE_TEXT_WIDGET_MIN_HEIGHT}px`\n }\n\n if (modelType === 'loras') {\n applyAutocompleteTextLayoutFix(\n widget,\n container,\n typeof LiteGraph !== 'undefined' && LiteGraph.vueNodesMode === true\n )\n }\n\n const vueCleanup = createVueWidgetCleanup(vueApp, () => {\n vueApps.delete(appKey)\n })\n\n widget.onRemove = () => {\n vueCleanup()\n }\n\n // Return minWidth/minHeight hints so ComfyUI's _initialMinSize mechanism\n // sets a sensible initial node width (and height for prompt/embeddings).\n // loras modelType retains its existing height constraints (getMaxHeight: 100).\n const minWidth = AUTOCOMPLETE_TEXT_MIN_WIDTH_DEFAULT\n const minHeight = modelType === 'loras' ? undefined : AUTOCOMPLETE_TEXT_MIN_HEIGHT_DEFAULT\n\n return { widget, minWidth, minHeight }\n}\n\napp.registerExtension({\n name: 'LoraManager.VueWidgets',\n\n getCustomWidgets() {\n return {\n // @ts-ignore\n LORA_POOL_CONFIG(node) {\n return createLoraPoolWidget(node)\n },\n // @ts-ignore\n RANDOMIZER_CONFIG(node) {\n return createLoraRandomizerWidget(node)\n },\n // @ts-ignore\n CYCLER_CONFIG(node) {\n return createLoraCyclerWidget(node)\n },\n // Autocomplete text widget for LoRAs (used by Lora Loader, Lora Stacker, WanVideo Lora Select)\n // @ts-ignore\n AUTOCOMPLETE_TEXT_LORAS(node) {\n const options = widgetInputOptions.get(`${node.comfyClass}:text`) || {}\n return createAutocompleteTextWidgetFactory(node, 'text', 'loras', options)\n },\n // Autocomplete text widget for prompt (used by Prompt and Text nodes)\n // @ts-ignore\n AUTOCOMPLETE_TEXT_PROMPT(node) {\n const options = widgetInputOptions.get(`${node.comfyClass}:text`) || {}\n return createAutocompleteTextWidgetFactory(node, 'text', 'prompt', options)\n },\n }\n },\n\n // Add display-only widget to Debug Metadata node\n // Register mode change handlers for LoRA provider nodes\n // Extract and store input options for autocomplete widgets\n // @ts-ignore\n async beforeRegisterNodeDef(nodeType, nodeData) {\n const comfyClass = nodeType.comfyClass\n const inputs = { ...nodeData.input?.required, ...nodeData.input?.optional }\n let hasAutocompleteWidget = false\n\n // Extract and store input options for autocomplete widgets\n for (const [inputName, inputDef] of Object.entries(inputs)) {\n // @ts-ignore\n if (Array.isArray(inputDef) && typeof inputDef[0] === 'string' && inputDef[0].startsWith('AUTOCOMPLETE_TEXT_')) {\n // @ts-ignore\n const options = inputDef[1] || {}\n widgetInputOptions.set(`${nodeData.name}:${inputName}`, options)\n hasAutocompleteWidget = true\n }\n }\n\n if (hasAutocompleteWidget) {\n const originalOnSerialize = nodeType.prototype.onSerialize\n const originalConfigure = nodeType.prototype.configure\n\n nodeType.prototype.onSerialize = function (serialized: any) {\n originalOnSerialize?.apply(this, arguments)\n\n serialized.properties = serialized.properties || {}\n const widgetIds = getSerializableWidgetNames(this)\n serialized.properties[LORA_MANAGER_WIDGET_IDS_PROPERTY] = widgetIds\n }\n\n nodeType.prototype.configure = function (info: any) {\n normalizeAutocompleteWidgetValues(this, info)\n\n const bypassResult = shouldBypassAutocompleteWidgetMigration(this, info?.widgets_values ?? [])\n\n if (bypassResult) {\n info.widgets_values = [...(info.widgets_values ?? []), null]\n }\n\n return originalConfigure?.apply(this, arguments)\n }\n }\n\n // Register mode change handlers for LORA_STACK chain nodes\n if (LORA_CHAIN_NODE_TYPES.includes(comfyClass)) {\n const originalOnNodeCreated = nodeType.prototype.onNodeCreated\n\n nodeType.prototype.onNodeCreated = function () {\n originalOnNodeCreated?.apply(this, arguments)\n\n // Create node-specific callback for Lora Stacker (updates direct trigger toggles)\n const nodeSpecificCallback = comfyClass === \"Lora Stacker (LoraManager)\"\n ? (activeLoraNames: Set) => updateConnectedTriggerWords(this, activeLoraNames)\n : undefined\n\n // Create and set up the mode change handler\n const onModeChange = createModeChangeCallback(this, updateDownstreamLoaders, nodeSpecificCallback)\n setupModeChangeHandler(this, onModeChange)\n }\n }\n\n // Add the JSON display widget to Debug Metadata node\n if (nodeData.name === 'Debug Metadata (LoraManager)') {\n const onNodeCreated = nodeType.prototype.onNodeCreated\n\n nodeType.prototype.onNodeCreated = function () {\n onNodeCreated?.apply(this, [])\n\n // Add the JSON display widget\n createJsonDisplayWidget(this)\n }\n }\n\n // Add the Lora Info display widget\n if (nodeData.name === 'Lora Info (LoraManager)') {\n const onNodeCreated = nodeType.prototype.onNodeCreated\n\n nodeType.prototype.onNodeCreated = function () {\n onNodeCreated?.apply(this, [])\n\n // Create the lora info display widget\n createLoraInfoWidget(this)\n }\n }\n }\n})\n"],"names":["i","hasOwnProperty","c","s","a","b","isRef","v","_a","l","computed","self","readonly","watch","effect","p","callHook","remove","ref","h","m","createApp","app","isModelListener","emit","remove2","style","setup","tt","resolve","d","camelize$1","k","ie","ae","N","$","Y","ot","P","$e","J","ut","mt","se","St","yt","Ee","xt","bt","_t","y","T","z","_","re","K","A","G","H","ee","he","Oe","kt","we","_typeof","o","ownKeys","r","_objectSpread","_defineProperty","_toPropertyKey","_toPrimitive","css","isClient","document","stop","load","_id","setAttributes","setAttribute","unload","isExist","dt","css$1","isNotEmpty","minifyCSS","Theme","extend","EventBus","PrimeVue","ThemeService","loadCommonTheme","global","mergeKeys","_createElementBlock","_normalizeClass","_createElementVNode","_hoisted_1","_toDisplayString","_openBlock","_hoisted_2","$emit","_createVNode","_hoisted_3","_hoisted_4","_hoisted_5","_Fragment","_renderList","_createBlock","_hoisted_6","_hoisted_7","_hoisted_8","_hoisted_9","_hoisted_10","_hoisted_11","_hoisted_12","_hoisted_14","_hoisted_15","_Transition","_Teleport","$slots","_renderSlot","_withModifiers","_e","api","_unref","percent","_normalizeStyle","_hoisted_13","_hoisted_16","_hoisted_17","_hoisted_18","w","lorasWidget","_createTextVNode","defaultOptions","_withDirectives","LORA_MANAGER_WIDGET_IDS_PROPERTY","LORA_PROVIDER_NODE_TYPES","LORA_STACK_AGGREGATOR_NODE_TYPES","LORA_CHAIN_NODE_TYPES","isLoraStackAggregatorNode","isNodeActive","updateDownstreamLoaders","vueApp","_b"],"mappings":"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","x_google_ignoreList":[0,1,2,3,4,5,6,7,8,9,10,11,12,13]} \ No newline at end of file +{"version":3,"file":"lora-manager-widgets.js","sources":["../../../vue-widgets/node_modules/@vue/shared/dist/shared.esm-bundler.js","../../../vue-widgets/node_modules/@vue/reactivity/dist/reactivity.esm-bundler.js","../../../vue-widgets/node_modules/@vue/runtime-core/dist/runtime-core.esm-bundler.js","../../../vue-widgets/node_modules/@vue/runtime-dom/dist/runtime-dom.esm-bundler.js","../../../vue-widgets/node_modules/@primeuix/utils/dist/object/index.mjs","../../../vue-widgets/node_modules/@primeuix/utils/dist/eventbus/index.mjs","../../../vue-widgets/node_modules/@primeuix/utils/dist/dom/index.mjs","../../../vue-widgets/node_modules/@primeuix/styled/dist/index.mjs","../../../vue-widgets/node_modules/@primevue/core/api/index.mjs","../../../vue-widgets/node_modules/@primeuix/styles/dist/base/index.mjs","../../../vue-widgets/node_modules/@primevue/core/usestyle/index.mjs","../../../vue-widgets/node_modules/@primevue/core/base/style/index.mjs","../../../vue-widgets/node_modules/@primevue/core/service/index.mjs","../../../vue-widgets/node_modules/@primevue/core/config/index.mjs","../../../vue-widgets/src/components/lora-pool/shared/FilterChip.vue","../../../vue-widgets/src/components/lora-pool/shared/EditButton.vue","../../../vue-widgets/src/components/lora-pool/sections/BaseModelSection.vue","../../../vue-widgets/src/components/lora-pool/sections/TagsSection.vue","../../../vue-widgets/src/components/lora-pool/sections/FoldersSection.vue","../../../vue-widgets/src/components/lora-pool/sections/NamePatternsSection.vue","../../../vue-widgets/src/components/lora-pool/sections/LicenseSection.vue","../../../vue-widgets/src/components/lora-pool/LoraPoolPreview.vue","../../../vue-widgets/src/components/lora-pool/LoraPoolSummaryView.vue","../../../vue-widgets/src/components/lora-pool/modals/ModalWrapper.vue","../../../vue-widgets/src/components/lora-pool/modals/BaseModelModal.vue","../../../vue-widgets/src/components/lora-pool/modals/TagsModal.vue","../../../vue-widgets/src/components/lora-pool/modals/FolderTreeNode.vue","../../../vue-widgets/src/components/lora-pool/modals/FoldersModal.vue","../../../vue-widgets/src/utils/basePath.ts","../../../vue-widgets/src/composables/useLoraPoolApi.ts","../../../vue-widgets/src/composables/useLoraPoolState.ts","../../../vue-widgets/src/composables/useModalState.ts","../../../vue-widgets/src/components/LoraPoolWidget.vue","../../../vue-widgets/src/components/lora-randomizer/LastUsedPreview.vue","../../../vue-widgets/src/components/shared/SingleSlider.vue","../../../vue-widgets/src/components/shared/DualRangeSlider.vue","../../../vue-widgets/src/components/lora-randomizer/LoraRandomizerSettingsView.vue","../../../vue-widgets/src/composables/useLoraRandomizerState.ts","../../../vue-widgets/src/components/LoraRandomizerWidget.vue","../../../vue-widgets/src/components/lora-cycler/LoraCyclerSettingsView.vue","../../../vue-widgets/src/components/lora-cycler/LoraListModal.vue","../../../vue-widgets/src/composables/useLoraCyclerState.ts","../../../vue-widgets/src/components/LoraCyclerWidget.vue","../../../vue-widgets/src/components/JsonDisplayWidget.vue","../../../vue-widgets/src/composables/useAutocomplete.ts","../../../vue-widgets/src/components/AutocompleteTextWidget.vue","../../../vue-widgets/src/components/LoraInfoWidget.vue","../../../vue-widgets/src/vue-widget-cleanup.ts","../autocomplete.js","../base_path.js","../utils.js","../../../vue-widgets/src/mode-change-handler.ts","../../../vue-widgets/src/main.ts"],"sourcesContent":["/**\n* @vue/shared v3.5.26\n* (c) 2018-present Yuxi (Evan) You and Vue contributors\n* @license MIT\n**/\n// @__NO_SIDE_EFFECTS__\nfunction makeMap(str) {\n const map = /* @__PURE__ */ Object.create(null);\n for (const key of str.split(\",\")) map[key] = 1;\n return (val) => val in map;\n}\n\nconst EMPTY_OBJ = !!(process.env.NODE_ENV !== \"production\") ? Object.freeze({}) : {};\nconst EMPTY_ARR = !!(process.env.NODE_ENV !== \"production\") ? Object.freeze([]) : [];\nconst NOOP = () => {\n};\nconst NO = () => false;\nconst isOn = (key) => key.charCodeAt(0) === 111 && key.charCodeAt(1) === 110 && // uppercase letter\n(key.charCodeAt(2) > 122 || key.charCodeAt(2) < 97);\nconst isModelListener = (key) => key.startsWith(\"onUpdate:\");\nconst extend = Object.assign;\nconst remove = (arr, el) => {\n const i = arr.indexOf(el);\n if (i > -1) {\n arr.splice(i, 1);\n }\n};\nconst hasOwnProperty = Object.prototype.hasOwnProperty;\nconst hasOwn = (val, key) => hasOwnProperty.call(val, key);\nconst isArray = Array.isArray;\nconst isMap = (val) => toTypeString(val) === \"[object Map]\";\nconst isSet = (val) => toTypeString(val) === \"[object Set]\";\nconst isDate = (val) => toTypeString(val) === \"[object Date]\";\nconst isRegExp = (val) => toTypeString(val) === \"[object RegExp]\";\nconst isFunction = (val) => typeof val === \"function\";\nconst isString = (val) => typeof val === \"string\";\nconst isSymbol = (val) => typeof val === \"symbol\";\nconst isObject = (val) => val !== null && typeof val === \"object\";\nconst isPromise = (val) => {\n return (isObject(val) || isFunction(val)) && isFunction(val.then) && isFunction(val.catch);\n};\nconst objectToString = Object.prototype.toString;\nconst toTypeString = (value) => objectToString.call(value);\nconst toRawType = (value) => {\n return toTypeString(value).slice(8, -1);\n};\nconst isPlainObject = (val) => toTypeString(val) === \"[object Object]\";\nconst isIntegerKey = (key) => isString(key) && key !== \"NaN\" && key[0] !== \"-\" && \"\" + parseInt(key, 10) === key;\nconst isReservedProp = /* @__PURE__ */ makeMap(\n // the leading comma is intentional so empty string \"\" is also included\n \",key,ref,ref_for,ref_key,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted\"\n);\nconst isBuiltInDirective = /* @__PURE__ */ makeMap(\n \"bind,cloak,else-if,else,for,html,if,model,on,once,pre,show,slot,text,memo\"\n);\nconst cacheStringFunction = (fn) => {\n const cache = /* @__PURE__ */ Object.create(null);\n return ((str) => {\n const hit = cache[str];\n return hit || (cache[str] = fn(str));\n });\n};\nconst camelizeRE = /-\\w/g;\nconst camelize = cacheStringFunction(\n (str) => {\n return str.replace(camelizeRE, (c) => c.slice(1).toUpperCase());\n }\n);\nconst hyphenateRE = /\\B([A-Z])/g;\nconst hyphenate = cacheStringFunction(\n (str) => str.replace(hyphenateRE, \"-$1\").toLowerCase()\n);\nconst capitalize = cacheStringFunction((str) => {\n return str.charAt(0).toUpperCase() + str.slice(1);\n});\nconst toHandlerKey = cacheStringFunction(\n (str) => {\n const s = str ? `on${capitalize(str)}` : ``;\n return s;\n }\n);\nconst hasChanged = (value, oldValue) => !Object.is(value, oldValue);\nconst invokeArrayFns = (fns, ...arg) => {\n for (let i = 0; i < fns.length; i++) {\n fns[i](...arg);\n }\n};\nconst def = (obj, key, value, writable = false) => {\n Object.defineProperty(obj, key, {\n configurable: true,\n enumerable: false,\n writable,\n value\n });\n};\nconst looseToNumber = (val) => {\n const n = parseFloat(val);\n return isNaN(n) ? val : n;\n};\nconst toNumber = (val) => {\n const n = isString(val) ? Number(val) : NaN;\n return isNaN(n) ? val : n;\n};\nlet _globalThis;\nconst getGlobalThis = () => {\n return _globalThis || (_globalThis = typeof globalThis !== \"undefined\" ? globalThis : typeof self !== \"undefined\" ? self : typeof window !== \"undefined\" ? window : typeof global !== \"undefined\" ? global : {});\n};\nconst identRE = /^[_$a-zA-Z\\xA0-\\uFFFF][_$a-zA-Z0-9\\xA0-\\uFFFF]*$/;\nfunction genPropsAccessExp(name) {\n return identRE.test(name) ? `__props.${name}` : `__props[${JSON.stringify(name)}]`;\n}\nfunction genCacheKey(source, options) {\n return source + JSON.stringify(\n options,\n (_, val) => typeof val === \"function\" ? val.toString() : val\n );\n}\n\nconst PatchFlags = {\n \"TEXT\": 1,\n \"1\": \"TEXT\",\n \"CLASS\": 2,\n \"2\": \"CLASS\",\n \"STYLE\": 4,\n \"4\": \"STYLE\",\n \"PROPS\": 8,\n \"8\": \"PROPS\",\n \"FULL_PROPS\": 16,\n \"16\": \"FULL_PROPS\",\n \"NEED_HYDRATION\": 32,\n \"32\": \"NEED_HYDRATION\",\n \"STABLE_FRAGMENT\": 64,\n \"64\": \"STABLE_FRAGMENT\",\n \"KEYED_FRAGMENT\": 128,\n \"128\": \"KEYED_FRAGMENT\",\n \"UNKEYED_FRAGMENT\": 256,\n \"256\": \"UNKEYED_FRAGMENT\",\n \"NEED_PATCH\": 512,\n \"512\": \"NEED_PATCH\",\n \"DYNAMIC_SLOTS\": 1024,\n \"1024\": \"DYNAMIC_SLOTS\",\n \"DEV_ROOT_FRAGMENT\": 2048,\n \"2048\": \"DEV_ROOT_FRAGMENT\",\n \"CACHED\": -1,\n \"-1\": \"CACHED\",\n \"BAIL\": -2,\n \"-2\": \"BAIL\"\n};\nconst PatchFlagNames = {\n [1]: `TEXT`,\n [2]: `CLASS`,\n [4]: `STYLE`,\n [8]: `PROPS`,\n [16]: `FULL_PROPS`,\n [32]: `NEED_HYDRATION`,\n [64]: `STABLE_FRAGMENT`,\n [128]: `KEYED_FRAGMENT`,\n [256]: `UNKEYED_FRAGMENT`,\n [512]: `NEED_PATCH`,\n [1024]: `DYNAMIC_SLOTS`,\n [2048]: `DEV_ROOT_FRAGMENT`,\n [-1]: `CACHED`,\n [-2]: `BAIL`\n};\n\nconst ShapeFlags = {\n \"ELEMENT\": 1,\n \"1\": \"ELEMENT\",\n \"FUNCTIONAL_COMPONENT\": 2,\n \"2\": \"FUNCTIONAL_COMPONENT\",\n \"STATEFUL_COMPONENT\": 4,\n \"4\": \"STATEFUL_COMPONENT\",\n \"TEXT_CHILDREN\": 8,\n \"8\": \"TEXT_CHILDREN\",\n \"ARRAY_CHILDREN\": 16,\n \"16\": \"ARRAY_CHILDREN\",\n \"SLOTS_CHILDREN\": 32,\n \"32\": \"SLOTS_CHILDREN\",\n \"TELEPORT\": 64,\n \"64\": \"TELEPORT\",\n \"SUSPENSE\": 128,\n \"128\": \"SUSPENSE\",\n \"COMPONENT_SHOULD_KEEP_ALIVE\": 256,\n \"256\": \"COMPONENT_SHOULD_KEEP_ALIVE\",\n \"COMPONENT_KEPT_ALIVE\": 512,\n \"512\": \"COMPONENT_KEPT_ALIVE\",\n \"COMPONENT\": 6,\n \"6\": \"COMPONENT\"\n};\n\nconst SlotFlags = {\n \"STABLE\": 1,\n \"1\": \"STABLE\",\n \"DYNAMIC\": 2,\n \"2\": \"DYNAMIC\",\n \"FORWARDED\": 3,\n \"3\": \"FORWARDED\"\n};\nconst slotFlagsText = {\n [1]: \"STABLE\",\n [2]: \"DYNAMIC\",\n [3]: \"FORWARDED\"\n};\n\nconst GLOBALS_ALLOWED = \"Infinity,undefined,NaN,isFinite,isNaN,parseFloat,parseInt,decodeURI,decodeURIComponent,encodeURI,encodeURIComponent,Math,Number,Date,Array,Object,Boolean,String,RegExp,Map,Set,JSON,Intl,BigInt,console,Error,Symbol\";\nconst isGloballyAllowed = /* @__PURE__ */ makeMap(GLOBALS_ALLOWED);\nconst isGloballyWhitelisted = isGloballyAllowed;\n\nconst range = 2;\nfunction generateCodeFrame(source, start = 0, end = source.length) {\n start = Math.max(0, Math.min(start, source.length));\n end = Math.max(0, Math.min(end, source.length));\n if (start > end) return \"\";\n let lines = source.split(/(\\r?\\n)/);\n const newlineSequences = lines.filter((_, idx) => idx % 2 === 1);\n lines = lines.filter((_, idx) => idx % 2 === 0);\n let count = 0;\n const res = [];\n for (let i = 0; i < lines.length; i++) {\n count += lines[i].length + (newlineSequences[i] && newlineSequences[i].length || 0);\n if (count >= start) {\n for (let j = i - range; j <= i + range || end > count; j++) {\n if (j < 0 || j >= lines.length) continue;\n const line = j + 1;\n res.push(\n `${line}${\" \".repeat(Math.max(3 - String(line).length, 0))}| ${lines[j]}`\n );\n const lineLength = lines[j].length;\n const newLineSeqLength = newlineSequences[j] && newlineSequences[j].length || 0;\n if (j === i) {\n const pad = start - (count - (lineLength + newLineSeqLength));\n const length = Math.max(\n 1,\n end > count ? lineLength - pad : end - start\n );\n res.push(` | ` + \" \".repeat(pad) + \"^\".repeat(length));\n } else if (j > i) {\n if (end > count) {\n const length = Math.max(Math.min(end - count, lineLength), 1);\n res.push(` | ` + \"^\".repeat(length));\n }\n count += lineLength + newLineSeqLength;\n }\n }\n break;\n }\n }\n return res.join(\"\\n\");\n}\n\nfunction normalizeStyle(value) {\n if (isArray(value)) {\n const res = {};\n for (let i = 0; i < value.length; i++) {\n const item = value[i];\n const normalized = isString(item) ? parseStringStyle(item) : normalizeStyle(item);\n if (normalized) {\n for (const key in normalized) {\n res[key] = normalized[key];\n }\n }\n }\n return res;\n } else if (isString(value) || isObject(value)) {\n return value;\n }\n}\nconst listDelimiterRE = /;(?![^(]*\\))/g;\nconst propertyDelimiterRE = /:([^]+)/;\nconst styleCommentRE = /\\/\\*[^]*?\\*\\//g;\nfunction parseStringStyle(cssText) {\n const ret = {};\n cssText.replace(styleCommentRE, \"\").split(listDelimiterRE).forEach((item) => {\n if (item) {\n const tmp = item.split(propertyDelimiterRE);\n tmp.length > 1 && (ret[tmp[0].trim()] = tmp[1].trim());\n }\n });\n return ret;\n}\nfunction stringifyStyle(styles) {\n if (!styles) return \"\";\n if (isString(styles)) return styles;\n let ret = \"\";\n for (const key in styles) {\n const value = styles[key];\n if (isString(value) || typeof value === \"number\") {\n const normalizedKey = key.startsWith(`--`) ? key : hyphenate(key);\n ret += `${normalizedKey}:${value};`;\n }\n }\n return ret;\n}\nfunction normalizeClass(value) {\n let res = \"\";\n if (isString(value)) {\n res = value;\n } else if (isArray(value)) {\n for (let i = 0; i < value.length; i++) {\n const normalized = normalizeClass(value[i]);\n if (normalized) {\n res += normalized + \" \";\n }\n }\n } else if (isObject(value)) {\n for (const name in value) {\n if (value[name]) {\n res += name + \" \";\n }\n }\n }\n return res.trim();\n}\nfunction normalizeProps(props) {\n if (!props) return null;\n let { class: klass, style } = props;\n if (klass && !isString(klass)) {\n props.class = normalizeClass(klass);\n }\n if (style) {\n props.style = normalizeStyle(style);\n }\n return props;\n}\n\nconst HTML_TAGS = \"html,body,base,head,link,meta,style,title,address,article,aside,footer,header,hgroup,h1,h2,h3,h4,h5,h6,nav,section,div,dd,dl,dt,figcaption,figure,picture,hr,img,li,main,ol,p,pre,ul,a,b,abbr,bdi,bdo,br,cite,code,data,dfn,em,i,kbd,mark,q,rp,rt,ruby,s,samp,small,span,strong,sub,sup,time,u,var,wbr,area,audio,map,track,video,embed,object,param,source,canvas,script,noscript,del,ins,caption,col,colgroup,table,thead,tbody,td,th,tr,button,datalist,fieldset,form,input,label,legend,meter,optgroup,option,output,progress,select,textarea,details,dialog,menu,summary,template,blockquote,iframe,tfoot\";\nconst SVG_TAGS = \"svg,animate,animateMotion,animateTransform,circle,clipPath,color-profile,defs,desc,discard,ellipse,feBlend,feColorMatrix,feComponentTransfer,feComposite,feConvolveMatrix,feDiffuseLighting,feDisplacementMap,feDistantLight,feDropShadow,feFlood,feFuncA,feFuncB,feFuncG,feFuncR,feGaussianBlur,feImage,feMerge,feMergeNode,feMorphology,feOffset,fePointLight,feSpecularLighting,feSpotLight,feTile,feTurbulence,filter,foreignObject,g,hatch,hatchpath,image,line,linearGradient,marker,mask,mesh,meshgradient,meshpatch,meshrow,metadata,mpath,path,pattern,polygon,polyline,radialGradient,rect,set,solidcolor,stop,switch,symbol,text,textPath,title,tspan,unknown,use,view\";\nconst MATH_TAGS = \"annotation,annotation-xml,maction,maligngroup,malignmark,math,menclose,merror,mfenced,mfrac,mfraction,mglyph,mi,mlabeledtr,mlongdiv,mmultiscripts,mn,mo,mover,mpadded,mphantom,mprescripts,mroot,mrow,ms,mscarries,mscarry,msgroup,msline,mspace,msqrt,msrow,mstack,mstyle,msub,msubsup,msup,mtable,mtd,mtext,mtr,munder,munderover,none,semantics\";\nconst VOID_TAGS = \"area,base,br,col,embed,hr,img,input,link,meta,param,source,track,wbr\";\nconst isHTMLTag = /* @__PURE__ */ makeMap(HTML_TAGS);\nconst isSVGTag = /* @__PURE__ */ makeMap(SVG_TAGS);\nconst isMathMLTag = /* @__PURE__ */ makeMap(MATH_TAGS);\nconst isVoidTag = /* @__PURE__ */ makeMap(VOID_TAGS);\n\nconst specialBooleanAttrs = `itemscope,allowfullscreen,formnovalidate,ismap,nomodule,novalidate,readonly`;\nconst isSpecialBooleanAttr = /* @__PURE__ */ makeMap(specialBooleanAttrs);\nconst isBooleanAttr = /* @__PURE__ */ makeMap(\n specialBooleanAttrs + `,async,autofocus,autoplay,controls,default,defer,disabled,hidden,inert,loop,open,required,reversed,scoped,seamless,checked,muted,multiple,selected`\n);\nfunction includeBooleanAttr(value) {\n return !!value || value === \"\";\n}\nconst unsafeAttrCharRE = /[>/=\"'\\u0009\\u000a\\u000c\\u0020]/;\nconst attrValidationCache = {};\nfunction isSSRSafeAttrName(name) {\n if (attrValidationCache.hasOwnProperty(name)) {\n return attrValidationCache[name];\n }\n const isUnsafe = unsafeAttrCharRE.test(name);\n if (isUnsafe) {\n console.error(`unsafe attribute name: ${name}`);\n }\n return attrValidationCache[name] = !isUnsafe;\n}\nconst propsToAttrMap = {\n acceptCharset: \"accept-charset\",\n className: \"class\",\n htmlFor: \"for\",\n httpEquiv: \"http-equiv\"\n};\nconst isKnownHtmlAttr = /* @__PURE__ */ makeMap(\n `accept,accept-charset,accesskey,action,align,allow,alt,async,autocapitalize,autocomplete,autofocus,autoplay,background,bgcolor,border,buffered,capture,challenge,charset,checked,cite,class,code,codebase,color,cols,colspan,content,contenteditable,contextmenu,controls,coords,crossorigin,csp,data,datetime,decoding,default,defer,dir,dirname,disabled,download,draggable,dropzone,enctype,enterkeyhint,for,form,formaction,formenctype,formmethod,formnovalidate,formtarget,headers,height,hidden,high,href,hreflang,http-equiv,icon,id,importance,inert,integrity,ismap,itemprop,keytype,kind,label,lang,language,loading,list,loop,low,manifest,max,maxlength,minlength,media,min,multiple,muted,name,novalidate,open,optimum,pattern,ping,placeholder,poster,preload,radiogroup,readonly,referrerpolicy,rel,required,reversed,rows,rowspan,sandbox,scope,scoped,selected,shape,size,sizes,slot,span,spellcheck,src,srcdoc,srclang,srcset,start,step,style,summary,tabindex,target,title,translate,type,usemap,value,width,wrap`\n);\nconst isKnownSvgAttr = /* @__PURE__ */ makeMap(\n `xmlns,accent-height,accumulate,additive,alignment-baseline,alphabetic,amplitude,arabic-form,ascent,attributeName,attributeType,azimuth,baseFrequency,baseline-shift,baseProfile,bbox,begin,bias,by,calcMode,cap-height,class,clip,clipPathUnits,clip-path,clip-rule,color,color-interpolation,color-interpolation-filters,color-profile,color-rendering,contentScriptType,contentStyleType,crossorigin,cursor,cx,cy,d,decelerate,descent,diffuseConstant,direction,display,divisor,dominant-baseline,dur,dx,dy,edgeMode,elevation,enable-background,end,exponent,fill,fill-opacity,fill-rule,filter,filterRes,filterUnits,flood-color,flood-opacity,font-family,font-size,font-size-adjust,font-stretch,font-style,font-variant,font-weight,format,from,fr,fx,fy,g1,g2,glyph-name,glyph-orientation-horizontal,glyph-orientation-vertical,glyphRef,gradientTransform,gradientUnits,hanging,height,href,hreflang,horiz-adv-x,horiz-origin-x,id,ideographic,image-rendering,in,in2,intercept,k,k1,k2,k3,k4,kernelMatrix,kernelUnitLength,kerning,keyPoints,keySplines,keyTimes,lang,lengthAdjust,letter-spacing,lighting-color,limitingConeAngle,local,marker-end,marker-mid,marker-start,markerHeight,markerUnits,markerWidth,mask,maskContentUnits,maskUnits,mathematical,max,media,method,min,mode,name,numOctaves,offset,opacity,operator,order,orient,orientation,origin,overflow,overline-position,overline-thickness,panose-1,paint-order,path,pathLength,patternContentUnits,patternTransform,patternUnits,ping,pointer-events,points,pointsAtX,pointsAtY,pointsAtZ,preserveAlpha,preserveAspectRatio,primitiveUnits,r,radius,referrerPolicy,refX,refY,rel,rendering-intent,repeatCount,repeatDur,requiredExtensions,requiredFeatures,restart,result,rotate,rx,ry,scale,seed,shape-rendering,slope,spacing,specularConstant,specularExponent,speed,spreadMethod,startOffset,stdDeviation,stemh,stemv,stitchTiles,stop-color,stop-opacity,strikethrough-position,strikethrough-thickness,string,stroke,stroke-dasharray,stroke-dashoffset,stroke-linecap,stroke-linejoin,stroke-miterlimit,stroke-opacity,stroke-width,style,surfaceScale,systemLanguage,tabindex,tableValues,target,targetX,targetY,text-anchor,text-decoration,text-rendering,textLength,to,transform,transform-origin,type,u1,u2,underline-position,underline-thickness,unicode,unicode-bidi,unicode-range,units-per-em,v-alphabetic,v-hanging,v-ideographic,v-mathematical,values,vector-effect,version,vert-adv-y,vert-origin-x,vert-origin-y,viewBox,viewTarget,visibility,width,widths,word-spacing,writing-mode,x,x-height,x1,x2,xChannelSelector,xlink:actuate,xlink:arcrole,xlink:href,xlink:role,xlink:show,xlink:title,xlink:type,xmlns:xlink,xml:base,xml:lang,xml:space,y,y1,y2,yChannelSelector,z,zoomAndPan`\n);\nconst isKnownMathMLAttr = /* @__PURE__ */ makeMap(\n `accent,accentunder,actiontype,align,alignmentscope,altimg,altimg-height,altimg-valign,altimg-width,alttext,bevelled,close,columnsalign,columnlines,columnspan,denomalign,depth,dir,display,displaystyle,encoding,equalcolumns,equalrows,fence,fontstyle,fontweight,form,frame,framespacing,groupalign,height,href,id,indentalign,indentalignfirst,indentalignlast,indentshift,indentshiftfirst,indentshiftlast,indextype,justify,largetop,largeop,lquote,lspace,mathbackground,mathcolor,mathsize,mathvariant,maxsize,minlabelspacing,mode,other,overflow,position,rowalign,rowlines,rowspan,rquote,rspace,scriptlevel,scriptminsize,scriptsizemultiplier,selection,separator,separators,shift,side,src,stackalign,stretchy,subscriptshift,superscriptshift,symmetric,voffset,width,widths,xlink:href,xlink:show,xlink:type,xmlns`\n);\nfunction isRenderableAttrValue(value) {\n if (value == null) {\n return false;\n }\n const type = typeof value;\n return type === \"string\" || type === \"number\" || type === \"boolean\";\n}\n\nconst escapeRE = /[\"'&<>]/;\nfunction escapeHtml(string) {\n const str = \"\" + string;\n const match = escapeRE.exec(str);\n if (!match) {\n return str;\n }\n let html = \"\";\n let escaped;\n let index;\n let lastIndex = 0;\n for (index = match.index; index < str.length; index++) {\n switch (str.charCodeAt(index)) {\n case 34:\n escaped = \""\";\n break;\n case 38:\n escaped = \"&\";\n break;\n case 39:\n escaped = \"'\";\n break;\n case 60:\n escaped = \"<\";\n break;\n case 62:\n escaped = \">\";\n break;\n default:\n continue;\n }\n if (lastIndex !== index) {\n html += str.slice(lastIndex, index);\n }\n lastIndex = index + 1;\n html += escaped;\n }\n return lastIndex !== index ? html + str.slice(lastIndex, index) : html;\n}\nconst commentStripRE = /^-?>||--!>|?@[\\\\\\]^`{|}~]/g;\nfunction getEscapedCssVarName(key, doubleEscape) {\n return key.replace(\n cssVarNameEscapeSymbolsRE,\n (s) => doubleEscape ? s === '\"' ? '\\\\\\\\\\\\\"' : `\\\\\\\\${s}` : `\\\\${s}`\n );\n}\n\nfunction looseCompareArrays(a, b) {\n if (a.length !== b.length) return false;\n let equal = true;\n for (let i = 0; equal && i < a.length; i++) {\n equal = looseEqual(a[i], b[i]);\n }\n return equal;\n}\nfunction looseEqual(a, b) {\n if (a === b) return true;\n let aValidType = isDate(a);\n let bValidType = isDate(b);\n if (aValidType || bValidType) {\n return aValidType && bValidType ? a.getTime() === b.getTime() : false;\n }\n aValidType = isSymbol(a);\n bValidType = isSymbol(b);\n if (aValidType || bValidType) {\n return a === b;\n }\n aValidType = isArray(a);\n bValidType = isArray(b);\n if (aValidType || bValidType) {\n return aValidType && bValidType ? looseCompareArrays(a, b) : false;\n }\n aValidType = isObject(a);\n bValidType = isObject(b);\n if (aValidType || bValidType) {\n if (!aValidType || !bValidType) {\n return false;\n }\n const aKeysCount = Object.keys(a).length;\n const bKeysCount = Object.keys(b).length;\n if (aKeysCount !== bKeysCount) {\n return false;\n }\n for (const key in a) {\n const aHasKey = a.hasOwnProperty(key);\n const bHasKey = b.hasOwnProperty(key);\n if (aHasKey && !bHasKey || !aHasKey && bHasKey || !looseEqual(a[key], b[key])) {\n return false;\n }\n }\n }\n return String(a) === String(b);\n}\nfunction looseIndexOf(arr, val) {\n return arr.findIndex((item) => looseEqual(item, val));\n}\n\nconst isRef = (val) => {\n return !!(val && val[\"__v_isRef\"] === true);\n};\nconst toDisplayString = (val) => {\n return isString(val) ? val : val == null ? \"\" : isArray(val) || isObject(val) && (val.toString === objectToString || !isFunction(val.toString)) ? isRef(val) ? toDisplayString(val.value) : JSON.stringify(val, replacer, 2) : String(val);\n};\nconst replacer = (_key, val) => {\n if (isRef(val)) {\n return replacer(_key, val.value);\n } else if (isMap(val)) {\n return {\n [`Map(${val.size})`]: [...val.entries()].reduce(\n (entries, [key, val2], i) => {\n entries[stringifySymbol(key, i) + \" =>\"] = val2;\n return entries;\n },\n {}\n )\n };\n } else if (isSet(val)) {\n return {\n [`Set(${val.size})`]: [...val.values()].map((v) => stringifySymbol(v))\n };\n } else if (isSymbol(val)) {\n return stringifySymbol(val);\n } else if (isObject(val) && !isArray(val) && !isPlainObject(val)) {\n return String(val);\n }\n return val;\n};\nconst stringifySymbol = (v, i = \"\") => {\n var _a;\n return (\n // Symbol.description in es2019+ so we need to cast here to pass\n // the lib: es2016 check\n isSymbol(v) ? `Symbol(${(_a = v.description) != null ? _a : i})` : v\n );\n};\n\nfunction normalizeCssVarValue(value) {\n if (value == null) {\n return \"initial\";\n }\n if (typeof value === \"string\") {\n return value === \"\" ? \" \" : value;\n }\n if (typeof value !== \"number\" || !Number.isFinite(value)) {\n if (!!(process.env.NODE_ENV !== \"production\")) {\n console.warn(\n \"[Vue warn] Invalid value used for CSS binding. Expected a string or a finite number but received:\",\n value\n );\n }\n }\n return String(value);\n}\n\nexport { EMPTY_ARR, EMPTY_OBJ, NO, NOOP, PatchFlagNames, PatchFlags, ShapeFlags, SlotFlags, camelize, capitalize, cssVarNameEscapeSymbolsRE, def, escapeHtml, escapeHtmlComment, extend, genCacheKey, genPropsAccessExp, generateCodeFrame, getEscapedCssVarName, getGlobalThis, hasChanged, hasOwn, hyphenate, includeBooleanAttr, invokeArrayFns, isArray, isBooleanAttr, isBuiltInDirective, isDate, isFunction, isGloballyAllowed, isGloballyWhitelisted, isHTMLTag, isIntegerKey, isKnownHtmlAttr, isKnownMathMLAttr, isKnownSvgAttr, isMap, isMathMLTag, isModelListener, isObject, isOn, isPlainObject, isPromise, isRegExp, isRenderableAttrValue, isReservedProp, isSSRSafeAttrName, isSVGTag, isSet, isSpecialBooleanAttr, isString, isSymbol, isVoidTag, looseEqual, looseIndexOf, looseToNumber, makeMap, normalizeClass, normalizeCssVarValue, normalizeProps, normalizeStyle, objectToString, parseStringStyle, propsToAttrMap, remove, slotFlagsText, stringifyStyle, toDisplayString, toHandlerKey, toNumber, toRawType, toTypeString };\n","/**\n* @vue/reactivity v3.5.26\n* (c) 2018-present Yuxi (Evan) You and Vue contributors\n* @license MIT\n**/\nimport { extend, hasChanged, isArray, isIntegerKey, isSymbol, isMap, hasOwn, makeMap, isObject, capitalize, toRawType, def, isFunction, EMPTY_OBJ, isSet, isPlainObject, remove, NOOP } from '@vue/shared';\n\nfunction warn(msg, ...args) {\n console.warn(`[Vue warn] ${msg}`, ...args);\n}\n\nlet activeEffectScope;\nclass EffectScope {\n constructor(detached = false) {\n this.detached = detached;\n /**\n * @internal\n */\n this._active = true;\n /**\n * @internal track `on` calls, allow `on` call multiple times\n */\n this._on = 0;\n /**\n * @internal\n */\n this.effects = [];\n /**\n * @internal\n */\n this.cleanups = [];\n this._isPaused = false;\n this.parent = activeEffectScope;\n if (!detached && activeEffectScope) {\n this.index = (activeEffectScope.scopes || (activeEffectScope.scopes = [])).push(\n this\n ) - 1;\n }\n }\n get active() {\n return this._active;\n }\n pause() {\n if (this._active) {\n this._isPaused = true;\n let i, l;\n if (this.scopes) {\n for (i = 0, l = this.scopes.length; i < l; i++) {\n this.scopes[i].pause();\n }\n }\n for (i = 0, l = this.effects.length; i < l; i++) {\n this.effects[i].pause();\n }\n }\n }\n /**\n * Resumes the effect scope, including all child scopes and effects.\n */\n resume() {\n if (this._active) {\n if (this._isPaused) {\n this._isPaused = false;\n let i, l;\n if (this.scopes) {\n for (i = 0, l = this.scopes.length; i < l; i++) {\n this.scopes[i].resume();\n }\n }\n for (i = 0, l = this.effects.length; i < l; i++) {\n this.effects[i].resume();\n }\n }\n }\n }\n run(fn) {\n if (this._active) {\n const currentEffectScope = activeEffectScope;\n try {\n activeEffectScope = this;\n return fn();\n } finally {\n activeEffectScope = currentEffectScope;\n }\n } else if (!!(process.env.NODE_ENV !== \"production\")) {\n warn(`cannot run an inactive effect scope.`);\n }\n }\n /**\n * This should only be called on non-detached scopes\n * @internal\n */\n on() {\n if (++this._on === 1) {\n this.prevScope = activeEffectScope;\n activeEffectScope = this;\n }\n }\n /**\n * This should only be called on non-detached scopes\n * @internal\n */\n off() {\n if (this._on > 0 && --this._on === 0) {\n activeEffectScope = this.prevScope;\n this.prevScope = void 0;\n }\n }\n stop(fromParent) {\n if (this._active) {\n this._active = false;\n let i, l;\n for (i = 0, l = this.effects.length; i < l; i++) {\n this.effects[i].stop();\n }\n this.effects.length = 0;\n for (i = 0, l = this.cleanups.length; i < l; i++) {\n this.cleanups[i]();\n }\n this.cleanups.length = 0;\n if (this.scopes) {\n for (i = 0, l = this.scopes.length; i < l; i++) {\n this.scopes[i].stop(true);\n }\n this.scopes.length = 0;\n }\n if (!this.detached && this.parent && !fromParent) {\n const last = this.parent.scopes.pop();\n if (last && last !== this) {\n this.parent.scopes[this.index] = last;\n last.index = this.index;\n }\n }\n this.parent = void 0;\n }\n }\n}\nfunction effectScope(detached) {\n return new EffectScope(detached);\n}\nfunction getCurrentScope() {\n return activeEffectScope;\n}\nfunction onScopeDispose(fn, failSilently = false) {\n if (activeEffectScope) {\n activeEffectScope.cleanups.push(fn);\n } else if (!!(process.env.NODE_ENV !== \"production\") && !failSilently) {\n warn(\n `onScopeDispose() is called when there is no active effect scope to be associated with.`\n );\n }\n}\n\nlet activeSub;\nconst EffectFlags = {\n \"ACTIVE\": 1,\n \"1\": \"ACTIVE\",\n \"RUNNING\": 2,\n \"2\": \"RUNNING\",\n \"TRACKING\": 4,\n \"4\": \"TRACKING\",\n \"NOTIFIED\": 8,\n \"8\": \"NOTIFIED\",\n \"DIRTY\": 16,\n \"16\": \"DIRTY\",\n \"ALLOW_RECURSE\": 32,\n \"32\": \"ALLOW_RECURSE\",\n \"PAUSED\": 64,\n \"64\": \"PAUSED\",\n \"EVALUATED\": 128,\n \"128\": \"EVALUATED\"\n};\nconst pausedQueueEffects = /* @__PURE__ */ new WeakSet();\nclass ReactiveEffect {\n constructor(fn) {\n this.fn = fn;\n /**\n * @internal\n */\n this.deps = void 0;\n /**\n * @internal\n */\n this.depsTail = void 0;\n /**\n * @internal\n */\n this.flags = 1 | 4;\n /**\n * @internal\n */\n this.next = void 0;\n /**\n * @internal\n */\n this.cleanup = void 0;\n this.scheduler = void 0;\n if (activeEffectScope && activeEffectScope.active) {\n activeEffectScope.effects.push(this);\n }\n }\n pause() {\n this.flags |= 64;\n }\n resume() {\n if (this.flags & 64) {\n this.flags &= -65;\n if (pausedQueueEffects.has(this)) {\n pausedQueueEffects.delete(this);\n this.trigger();\n }\n }\n }\n /**\n * @internal\n */\n notify() {\n if (this.flags & 2 && !(this.flags & 32)) {\n return;\n }\n if (!(this.flags & 8)) {\n batch(this);\n }\n }\n run() {\n if (!(this.flags & 1)) {\n return this.fn();\n }\n this.flags |= 2;\n cleanupEffect(this);\n prepareDeps(this);\n const prevEffect = activeSub;\n const prevShouldTrack = shouldTrack;\n activeSub = this;\n shouldTrack = true;\n try {\n return this.fn();\n } finally {\n if (!!(process.env.NODE_ENV !== \"production\") && activeSub !== this) {\n warn(\n \"Active effect was not restored correctly - this is likely a Vue internal bug.\"\n );\n }\n cleanupDeps(this);\n activeSub = prevEffect;\n shouldTrack = prevShouldTrack;\n this.flags &= -3;\n }\n }\n stop() {\n if (this.flags & 1) {\n for (let link = this.deps; link; link = link.nextDep) {\n removeSub(link);\n }\n this.deps = this.depsTail = void 0;\n cleanupEffect(this);\n this.onStop && this.onStop();\n this.flags &= -2;\n }\n }\n trigger() {\n if (this.flags & 64) {\n pausedQueueEffects.add(this);\n } else if (this.scheduler) {\n this.scheduler();\n } else {\n this.runIfDirty();\n }\n }\n /**\n * @internal\n */\n runIfDirty() {\n if (isDirty(this)) {\n this.run();\n }\n }\n get dirty() {\n return isDirty(this);\n }\n}\nlet batchDepth = 0;\nlet batchedSub;\nlet batchedComputed;\nfunction batch(sub, isComputed = false) {\n sub.flags |= 8;\n if (isComputed) {\n sub.next = batchedComputed;\n batchedComputed = sub;\n return;\n }\n sub.next = batchedSub;\n batchedSub = sub;\n}\nfunction startBatch() {\n batchDepth++;\n}\nfunction endBatch() {\n if (--batchDepth > 0) {\n return;\n }\n if (batchedComputed) {\n let e = batchedComputed;\n batchedComputed = void 0;\n while (e) {\n const next = e.next;\n e.next = void 0;\n e.flags &= -9;\n e = next;\n }\n }\n let error;\n while (batchedSub) {\n let e = batchedSub;\n batchedSub = void 0;\n while (e) {\n const next = e.next;\n e.next = void 0;\n e.flags &= -9;\n if (e.flags & 1) {\n try {\n ;\n e.trigger();\n } catch (err) {\n if (!error) error = err;\n }\n }\n e = next;\n }\n }\n if (error) throw error;\n}\nfunction prepareDeps(sub) {\n for (let link = sub.deps; link; link = link.nextDep) {\n link.version = -1;\n link.prevActiveLink = link.dep.activeLink;\n link.dep.activeLink = link;\n }\n}\nfunction cleanupDeps(sub) {\n let head;\n let tail = sub.depsTail;\n let link = tail;\n while (link) {\n const prev = link.prevDep;\n if (link.version === -1) {\n if (link === tail) tail = prev;\n removeSub(link);\n removeDep(link);\n } else {\n head = link;\n }\n link.dep.activeLink = link.prevActiveLink;\n link.prevActiveLink = void 0;\n link = prev;\n }\n sub.deps = head;\n sub.depsTail = tail;\n}\nfunction isDirty(sub) {\n for (let link = sub.deps; link; link = link.nextDep) {\n if (link.dep.version !== link.version || link.dep.computed && (refreshComputed(link.dep.computed) || link.dep.version !== link.version)) {\n return true;\n }\n }\n if (sub._dirty) {\n return true;\n }\n return false;\n}\nfunction refreshComputed(computed) {\n if (computed.flags & 4 && !(computed.flags & 16)) {\n return;\n }\n computed.flags &= -17;\n if (computed.globalVersion === globalVersion) {\n return;\n }\n computed.globalVersion = globalVersion;\n if (!computed.isSSR && computed.flags & 128 && (!computed.deps && !computed._dirty || !isDirty(computed))) {\n return;\n }\n computed.flags |= 2;\n const dep = computed.dep;\n const prevSub = activeSub;\n const prevShouldTrack = shouldTrack;\n activeSub = computed;\n shouldTrack = true;\n try {\n prepareDeps(computed);\n const value = computed.fn(computed._value);\n if (dep.version === 0 || hasChanged(value, computed._value)) {\n computed.flags |= 128;\n computed._value = value;\n dep.version++;\n }\n } catch (err) {\n dep.version++;\n throw err;\n } finally {\n activeSub = prevSub;\n shouldTrack = prevShouldTrack;\n cleanupDeps(computed);\n computed.flags &= -3;\n }\n}\nfunction removeSub(link, soft = false) {\n const { dep, prevSub, nextSub } = link;\n if (prevSub) {\n prevSub.nextSub = nextSub;\n link.prevSub = void 0;\n }\n if (nextSub) {\n nextSub.prevSub = prevSub;\n link.nextSub = void 0;\n }\n if (!!(process.env.NODE_ENV !== \"production\") && dep.subsHead === link) {\n dep.subsHead = nextSub;\n }\n if (dep.subs === link) {\n dep.subs = prevSub;\n if (!prevSub && dep.computed) {\n dep.computed.flags &= -5;\n for (let l = dep.computed.deps; l; l = l.nextDep) {\n removeSub(l, true);\n }\n }\n }\n if (!soft && !--dep.sc && dep.map) {\n dep.map.delete(dep.key);\n }\n}\nfunction removeDep(link) {\n const { prevDep, nextDep } = link;\n if (prevDep) {\n prevDep.nextDep = nextDep;\n link.prevDep = void 0;\n }\n if (nextDep) {\n nextDep.prevDep = prevDep;\n link.nextDep = void 0;\n }\n}\nfunction effect(fn, options) {\n if (fn.effect instanceof ReactiveEffect) {\n fn = fn.effect.fn;\n }\n const e = new ReactiveEffect(fn);\n if (options) {\n extend(e, options);\n }\n try {\n e.run();\n } catch (err) {\n e.stop();\n throw err;\n }\n const runner = e.run.bind(e);\n runner.effect = e;\n return runner;\n}\nfunction stop(runner) {\n runner.effect.stop();\n}\nlet shouldTrack = true;\nconst trackStack = [];\nfunction pauseTracking() {\n trackStack.push(shouldTrack);\n shouldTrack = false;\n}\nfunction enableTracking() {\n trackStack.push(shouldTrack);\n shouldTrack = true;\n}\nfunction resetTracking() {\n const last = trackStack.pop();\n shouldTrack = last === void 0 ? true : last;\n}\nfunction onEffectCleanup(fn, failSilently = false) {\n if (activeSub instanceof ReactiveEffect) {\n activeSub.cleanup = fn;\n } else if (!!(process.env.NODE_ENV !== \"production\") && !failSilently) {\n warn(\n `onEffectCleanup() was called when there was no active effect to associate with.`\n );\n }\n}\nfunction cleanupEffect(e) {\n const { cleanup } = e;\n e.cleanup = void 0;\n if (cleanup) {\n const prevSub = activeSub;\n activeSub = void 0;\n try {\n cleanup();\n } finally {\n activeSub = prevSub;\n }\n }\n}\n\nlet globalVersion = 0;\nclass Link {\n constructor(sub, dep) {\n this.sub = sub;\n this.dep = dep;\n this.version = dep.version;\n this.nextDep = this.prevDep = this.nextSub = this.prevSub = this.prevActiveLink = void 0;\n }\n}\nclass Dep {\n // TODO isolatedDeclarations \"__v_skip\"\n constructor(computed) {\n this.computed = computed;\n this.version = 0;\n /**\n * Link between this dep and the current active effect\n */\n this.activeLink = void 0;\n /**\n * Doubly linked list representing the subscribing effects (tail)\n */\n this.subs = void 0;\n /**\n * For object property deps cleanup\n */\n this.map = void 0;\n this.key = void 0;\n /**\n * Subscriber counter\n */\n this.sc = 0;\n /**\n * @internal\n */\n this.__v_skip = true;\n if (!!(process.env.NODE_ENV !== \"production\")) {\n this.subsHead = void 0;\n }\n }\n track(debugInfo) {\n if (!activeSub || !shouldTrack || activeSub === this.computed) {\n return;\n }\n let link = this.activeLink;\n if (link === void 0 || link.sub !== activeSub) {\n link = this.activeLink = new Link(activeSub, this);\n if (!activeSub.deps) {\n activeSub.deps = activeSub.depsTail = link;\n } else {\n link.prevDep = activeSub.depsTail;\n activeSub.depsTail.nextDep = link;\n activeSub.depsTail = link;\n }\n addSub(link);\n } else if (link.version === -1) {\n link.version = this.version;\n if (link.nextDep) {\n const next = link.nextDep;\n next.prevDep = link.prevDep;\n if (link.prevDep) {\n link.prevDep.nextDep = next;\n }\n link.prevDep = activeSub.depsTail;\n link.nextDep = void 0;\n activeSub.depsTail.nextDep = link;\n activeSub.depsTail = link;\n if (activeSub.deps === link) {\n activeSub.deps = next;\n }\n }\n }\n if (!!(process.env.NODE_ENV !== \"production\") && activeSub.onTrack) {\n activeSub.onTrack(\n extend(\n {\n effect: activeSub\n },\n debugInfo\n )\n );\n }\n return link;\n }\n trigger(debugInfo) {\n this.version++;\n globalVersion++;\n this.notify(debugInfo);\n }\n notify(debugInfo) {\n startBatch();\n try {\n if (!!(process.env.NODE_ENV !== \"production\")) {\n for (let head = this.subsHead; head; head = head.nextSub) {\n if (head.sub.onTrigger && !(head.sub.flags & 8)) {\n head.sub.onTrigger(\n extend(\n {\n effect: head.sub\n },\n debugInfo\n )\n );\n }\n }\n }\n for (let link = this.subs; link; link = link.prevSub) {\n if (link.sub.notify()) {\n ;\n link.sub.dep.notify();\n }\n }\n } finally {\n endBatch();\n }\n }\n}\nfunction addSub(link) {\n link.dep.sc++;\n if (link.sub.flags & 4) {\n const computed = link.dep.computed;\n if (computed && !link.dep.subs) {\n computed.flags |= 4 | 16;\n for (let l = computed.deps; l; l = l.nextDep) {\n addSub(l);\n }\n }\n const currentTail = link.dep.subs;\n if (currentTail !== link) {\n link.prevSub = currentTail;\n if (currentTail) currentTail.nextSub = link;\n }\n if (!!(process.env.NODE_ENV !== \"production\") && link.dep.subsHead === void 0) {\n link.dep.subsHead = link;\n }\n link.dep.subs = link;\n }\n}\nconst targetMap = /* @__PURE__ */ new WeakMap();\nconst ITERATE_KEY = /* @__PURE__ */ Symbol(\n !!(process.env.NODE_ENV !== \"production\") ? \"Object iterate\" : \"\"\n);\nconst MAP_KEY_ITERATE_KEY = /* @__PURE__ */ Symbol(\n !!(process.env.NODE_ENV !== \"production\") ? \"Map keys iterate\" : \"\"\n);\nconst ARRAY_ITERATE_KEY = /* @__PURE__ */ Symbol(\n !!(process.env.NODE_ENV !== \"production\") ? \"Array iterate\" : \"\"\n);\nfunction track(target, type, key) {\n if (shouldTrack && activeSub) {\n let depsMap = targetMap.get(target);\n if (!depsMap) {\n targetMap.set(target, depsMap = /* @__PURE__ */ new Map());\n }\n let dep = depsMap.get(key);\n if (!dep) {\n depsMap.set(key, dep = new Dep());\n dep.map = depsMap;\n dep.key = key;\n }\n if (!!(process.env.NODE_ENV !== \"production\")) {\n dep.track({\n target,\n type,\n key\n });\n } else {\n dep.track();\n }\n }\n}\nfunction trigger(target, type, key, newValue, oldValue, oldTarget) {\n const depsMap = targetMap.get(target);\n if (!depsMap) {\n globalVersion++;\n return;\n }\n const run = (dep) => {\n if (dep) {\n if (!!(process.env.NODE_ENV !== \"production\")) {\n dep.trigger({\n target,\n type,\n key,\n newValue,\n oldValue,\n oldTarget\n });\n } else {\n dep.trigger();\n }\n }\n };\n startBatch();\n if (type === \"clear\") {\n depsMap.forEach(run);\n } else {\n const targetIsArray = isArray(target);\n const isArrayIndex = targetIsArray && isIntegerKey(key);\n if (targetIsArray && key === \"length\") {\n const newLength = Number(newValue);\n depsMap.forEach((dep, key2) => {\n if (key2 === \"length\" || key2 === ARRAY_ITERATE_KEY || !isSymbol(key2) && key2 >= newLength) {\n run(dep);\n }\n });\n } else {\n if (key !== void 0 || depsMap.has(void 0)) {\n run(depsMap.get(key));\n }\n if (isArrayIndex) {\n run(depsMap.get(ARRAY_ITERATE_KEY));\n }\n switch (type) {\n case \"add\":\n if (!targetIsArray) {\n run(depsMap.get(ITERATE_KEY));\n if (isMap(target)) {\n run(depsMap.get(MAP_KEY_ITERATE_KEY));\n }\n } else if (isArrayIndex) {\n run(depsMap.get(\"length\"));\n }\n break;\n case \"delete\":\n if (!targetIsArray) {\n run(depsMap.get(ITERATE_KEY));\n if (isMap(target)) {\n run(depsMap.get(MAP_KEY_ITERATE_KEY));\n }\n }\n break;\n case \"set\":\n if (isMap(target)) {\n run(depsMap.get(ITERATE_KEY));\n }\n break;\n }\n }\n }\n endBatch();\n}\nfunction getDepFromReactive(object, key) {\n const depMap = targetMap.get(object);\n return depMap && depMap.get(key);\n}\n\nfunction reactiveReadArray(array) {\n const raw = toRaw(array);\n if (raw === array) return raw;\n track(raw, \"iterate\", ARRAY_ITERATE_KEY);\n return isShallow(array) ? raw : raw.map(toReactive);\n}\nfunction shallowReadArray(arr) {\n track(arr = toRaw(arr), \"iterate\", ARRAY_ITERATE_KEY);\n return arr;\n}\nfunction toWrapped(target, item) {\n if (isReadonly(target)) {\n return isReactive(target) ? toReadonly(toReactive(item)) : toReadonly(item);\n }\n return toReactive(item);\n}\nconst arrayInstrumentations = {\n __proto__: null,\n [Symbol.iterator]() {\n return iterator(this, Symbol.iterator, (item) => toWrapped(this, item));\n },\n concat(...args) {\n return reactiveReadArray(this).concat(\n ...args.map((x) => isArray(x) ? reactiveReadArray(x) : x)\n );\n },\n entries() {\n return iterator(this, \"entries\", (value) => {\n value[1] = toWrapped(this, value[1]);\n return value;\n });\n },\n every(fn, thisArg) {\n return apply(this, \"every\", fn, thisArg, void 0, arguments);\n },\n filter(fn, thisArg) {\n return apply(\n this,\n \"filter\",\n fn,\n thisArg,\n (v) => v.map((item) => toWrapped(this, item)),\n arguments\n );\n },\n find(fn, thisArg) {\n return apply(\n this,\n \"find\",\n fn,\n thisArg,\n (item) => toWrapped(this, item),\n arguments\n );\n },\n findIndex(fn, thisArg) {\n return apply(this, \"findIndex\", fn, thisArg, void 0, arguments);\n },\n findLast(fn, thisArg) {\n return apply(\n this,\n \"findLast\",\n fn,\n thisArg,\n (item) => toWrapped(this, item),\n arguments\n );\n },\n findLastIndex(fn, thisArg) {\n return apply(this, \"findLastIndex\", fn, thisArg, void 0, arguments);\n },\n // flat, flatMap could benefit from ARRAY_ITERATE but are not straight-forward to implement\n forEach(fn, thisArg) {\n return apply(this, \"forEach\", fn, thisArg, void 0, arguments);\n },\n includes(...args) {\n return searchProxy(this, \"includes\", args);\n },\n indexOf(...args) {\n return searchProxy(this, \"indexOf\", args);\n },\n join(separator) {\n return reactiveReadArray(this).join(separator);\n },\n // keys() iterator only reads `length`, no optimization required\n lastIndexOf(...args) {\n return searchProxy(this, \"lastIndexOf\", args);\n },\n map(fn, thisArg) {\n return apply(this, \"map\", fn, thisArg, void 0, arguments);\n },\n pop() {\n return noTracking(this, \"pop\");\n },\n push(...args) {\n return noTracking(this, \"push\", args);\n },\n reduce(fn, ...args) {\n return reduce(this, \"reduce\", fn, args);\n },\n reduceRight(fn, ...args) {\n return reduce(this, \"reduceRight\", fn, args);\n },\n shift() {\n return noTracking(this, \"shift\");\n },\n // slice could use ARRAY_ITERATE but also seems to beg for range tracking\n some(fn, thisArg) {\n return apply(this, \"some\", fn, thisArg, void 0, arguments);\n },\n splice(...args) {\n return noTracking(this, \"splice\", args);\n },\n toReversed() {\n return reactiveReadArray(this).toReversed();\n },\n toSorted(comparer) {\n return reactiveReadArray(this).toSorted(comparer);\n },\n toSpliced(...args) {\n return reactiveReadArray(this).toSpliced(...args);\n },\n unshift(...args) {\n return noTracking(this, \"unshift\", args);\n },\n values() {\n return iterator(this, \"values\", (item) => toWrapped(this, item));\n }\n};\nfunction iterator(self, method, wrapValue) {\n const arr = shallowReadArray(self);\n const iter = arr[method]();\n if (arr !== self && !isShallow(self)) {\n iter._next = iter.next;\n iter.next = () => {\n const result = iter._next();\n if (!result.done) {\n result.value = wrapValue(result.value);\n }\n return result;\n };\n }\n return iter;\n}\nconst arrayProto = Array.prototype;\nfunction apply(self, method, fn, thisArg, wrappedRetFn, args) {\n const arr = shallowReadArray(self);\n const needsWrap = arr !== self && !isShallow(self);\n const methodFn = arr[method];\n if (methodFn !== arrayProto[method]) {\n const result2 = methodFn.apply(self, args);\n return needsWrap ? toReactive(result2) : result2;\n }\n let wrappedFn = fn;\n if (arr !== self) {\n if (needsWrap) {\n wrappedFn = function(item, index) {\n return fn.call(this, toWrapped(self, item), index, self);\n };\n } else if (fn.length > 2) {\n wrappedFn = function(item, index) {\n return fn.call(this, item, index, self);\n };\n }\n }\n const result = methodFn.call(arr, wrappedFn, thisArg);\n return needsWrap && wrappedRetFn ? wrappedRetFn(result) : result;\n}\nfunction reduce(self, method, fn, args) {\n const arr = shallowReadArray(self);\n let wrappedFn = fn;\n if (arr !== self) {\n if (!isShallow(self)) {\n wrappedFn = function(acc, item, index) {\n return fn.call(this, acc, toWrapped(self, item), index, self);\n };\n } else if (fn.length > 3) {\n wrappedFn = function(acc, item, index) {\n return fn.call(this, acc, item, index, self);\n };\n }\n }\n return arr[method](wrappedFn, ...args);\n}\nfunction searchProxy(self, method, args) {\n const arr = toRaw(self);\n track(arr, \"iterate\", ARRAY_ITERATE_KEY);\n const res = arr[method](...args);\n if ((res === -1 || res === false) && isProxy(args[0])) {\n args[0] = toRaw(args[0]);\n return arr[method](...args);\n }\n return res;\n}\nfunction noTracking(self, method, args = []) {\n pauseTracking();\n startBatch();\n const res = toRaw(self)[method].apply(self, args);\n endBatch();\n resetTracking();\n return res;\n}\n\nconst isNonTrackableKeys = /* @__PURE__ */ makeMap(`__proto__,__v_isRef,__isVue`);\nconst builtInSymbols = new Set(\n /* @__PURE__ */ Object.getOwnPropertyNames(Symbol).filter((key) => key !== \"arguments\" && key !== \"caller\").map((key) => Symbol[key]).filter(isSymbol)\n);\nfunction hasOwnProperty(key) {\n if (!isSymbol(key)) key = String(key);\n const obj = toRaw(this);\n track(obj, \"has\", key);\n return obj.hasOwnProperty(key);\n}\nclass BaseReactiveHandler {\n constructor(_isReadonly = false, _isShallow = false) {\n this._isReadonly = _isReadonly;\n this._isShallow = _isShallow;\n }\n get(target, key, receiver) {\n if (key === \"__v_skip\") return target[\"__v_skip\"];\n const isReadonly2 = this._isReadonly, isShallow2 = this._isShallow;\n if (key === \"__v_isReactive\") {\n return !isReadonly2;\n } else if (key === \"__v_isReadonly\") {\n return isReadonly2;\n } else if (key === \"__v_isShallow\") {\n return isShallow2;\n } else if (key === \"__v_raw\") {\n if (receiver === (isReadonly2 ? isShallow2 ? shallowReadonlyMap : readonlyMap : isShallow2 ? shallowReactiveMap : reactiveMap).get(target) || // receiver is not the reactive proxy, but has the same prototype\n // this means the receiver is a user proxy of the reactive proxy\n Object.getPrototypeOf(target) === Object.getPrototypeOf(receiver)) {\n return target;\n }\n return;\n }\n const targetIsArray = isArray(target);\n if (!isReadonly2) {\n let fn;\n if (targetIsArray && (fn = arrayInstrumentations[key])) {\n return fn;\n }\n if (key === \"hasOwnProperty\") {\n return hasOwnProperty;\n }\n }\n const res = Reflect.get(\n target,\n key,\n // if this is a proxy wrapping a ref, return methods using the raw ref\n // as receiver so that we don't have to call `toRaw` on the ref in all\n // its class methods\n isRef(target) ? target : receiver\n );\n if (isSymbol(key) ? builtInSymbols.has(key) : isNonTrackableKeys(key)) {\n return res;\n }\n if (!isReadonly2) {\n track(target, \"get\", key);\n }\n if (isShallow2) {\n return res;\n }\n if (isRef(res)) {\n const value = targetIsArray && isIntegerKey(key) ? res : res.value;\n return isReadonly2 && isObject(value) ? readonly(value) : value;\n }\n if (isObject(res)) {\n return isReadonly2 ? readonly(res) : reactive(res);\n }\n return res;\n }\n}\nclass MutableReactiveHandler extends BaseReactiveHandler {\n constructor(isShallow2 = false) {\n super(false, isShallow2);\n }\n set(target, key, value, receiver) {\n let oldValue = target[key];\n const isArrayWithIntegerKey = isArray(target) && isIntegerKey(key);\n if (!this._isShallow) {\n const isOldValueReadonly = isReadonly(oldValue);\n if (!isShallow(value) && !isReadonly(value)) {\n oldValue = toRaw(oldValue);\n value = toRaw(value);\n }\n if (!isArrayWithIntegerKey && isRef(oldValue) && !isRef(value)) {\n if (isOldValueReadonly) {\n if (!!(process.env.NODE_ENV !== \"production\")) {\n warn(\n `Set operation on key \"${String(key)}\" failed: target is readonly.`,\n target[key]\n );\n }\n return true;\n } else {\n oldValue.value = value;\n return true;\n }\n }\n }\n const hadKey = isArrayWithIntegerKey ? Number(key) < target.length : hasOwn(target, key);\n const result = Reflect.set(\n target,\n key,\n value,\n isRef(target) ? target : receiver\n );\n if (target === toRaw(receiver)) {\n if (!hadKey) {\n trigger(target, \"add\", key, value);\n } else if (hasChanged(value, oldValue)) {\n trigger(target, \"set\", key, value, oldValue);\n }\n }\n return result;\n }\n deleteProperty(target, key) {\n const hadKey = hasOwn(target, key);\n const oldValue = target[key];\n const result = Reflect.deleteProperty(target, key);\n if (result && hadKey) {\n trigger(target, \"delete\", key, void 0, oldValue);\n }\n return result;\n }\n has(target, key) {\n const result = Reflect.has(target, key);\n if (!isSymbol(key) || !builtInSymbols.has(key)) {\n track(target, \"has\", key);\n }\n return result;\n }\n ownKeys(target) {\n track(\n target,\n \"iterate\",\n isArray(target) ? \"length\" : ITERATE_KEY\n );\n return Reflect.ownKeys(target);\n }\n}\nclass ReadonlyReactiveHandler extends BaseReactiveHandler {\n constructor(isShallow2 = false) {\n super(true, isShallow2);\n }\n set(target, key) {\n if (!!(process.env.NODE_ENV !== \"production\")) {\n warn(\n `Set operation on key \"${String(key)}\" failed: target is readonly.`,\n target\n );\n }\n return true;\n }\n deleteProperty(target, key) {\n if (!!(process.env.NODE_ENV !== \"production\")) {\n warn(\n `Delete operation on key \"${String(key)}\" failed: target is readonly.`,\n target\n );\n }\n return true;\n }\n}\nconst mutableHandlers = /* @__PURE__ */ new MutableReactiveHandler();\nconst readonlyHandlers = /* @__PURE__ */ new ReadonlyReactiveHandler();\nconst shallowReactiveHandlers = /* @__PURE__ */ new MutableReactiveHandler(true);\nconst shallowReadonlyHandlers = /* @__PURE__ */ new ReadonlyReactiveHandler(true);\n\nconst toShallow = (value) => value;\nconst getProto = (v) => Reflect.getPrototypeOf(v);\nfunction createIterableMethod(method, isReadonly2, isShallow2) {\n return function(...args) {\n const target = this[\"__v_raw\"];\n const rawTarget = toRaw(target);\n const targetIsMap = isMap(rawTarget);\n const isPair = method === \"entries\" || method === Symbol.iterator && targetIsMap;\n const isKeyOnly = method === \"keys\" && targetIsMap;\n const innerIterator = target[method](...args);\n const wrap = isShallow2 ? toShallow : isReadonly2 ? toReadonly : toReactive;\n !isReadonly2 && track(\n rawTarget,\n \"iterate\",\n isKeyOnly ? MAP_KEY_ITERATE_KEY : ITERATE_KEY\n );\n return {\n // iterator protocol\n next() {\n const { value, done } = innerIterator.next();\n return done ? { value, done } : {\n value: isPair ? [wrap(value[0]), wrap(value[1])] : wrap(value),\n done\n };\n },\n // iterable protocol\n [Symbol.iterator]() {\n return this;\n }\n };\n };\n}\nfunction createReadonlyMethod(type) {\n return function(...args) {\n if (!!(process.env.NODE_ENV !== \"production\")) {\n const key = args[0] ? `on key \"${args[0]}\" ` : ``;\n warn(\n `${capitalize(type)} operation ${key}failed: target is readonly.`,\n toRaw(this)\n );\n }\n return type === \"delete\" ? false : type === \"clear\" ? void 0 : this;\n };\n}\nfunction createInstrumentations(readonly, shallow) {\n const instrumentations = {\n get(key) {\n const target = this[\"__v_raw\"];\n const rawTarget = toRaw(target);\n const rawKey = toRaw(key);\n if (!readonly) {\n if (hasChanged(key, rawKey)) {\n track(rawTarget, \"get\", key);\n }\n track(rawTarget, \"get\", rawKey);\n }\n const { has } = getProto(rawTarget);\n const wrap = shallow ? toShallow : readonly ? toReadonly : toReactive;\n if (has.call(rawTarget, key)) {\n return wrap(target.get(key));\n } else if (has.call(rawTarget, rawKey)) {\n return wrap(target.get(rawKey));\n } else if (target !== rawTarget) {\n target.get(key);\n }\n },\n get size() {\n const target = this[\"__v_raw\"];\n !readonly && track(toRaw(target), \"iterate\", ITERATE_KEY);\n return target.size;\n },\n has(key) {\n const target = this[\"__v_raw\"];\n const rawTarget = toRaw(target);\n const rawKey = toRaw(key);\n if (!readonly) {\n if (hasChanged(key, rawKey)) {\n track(rawTarget, \"has\", key);\n }\n track(rawTarget, \"has\", rawKey);\n }\n return key === rawKey ? target.has(key) : target.has(key) || target.has(rawKey);\n },\n forEach(callback, thisArg) {\n const observed = this;\n const target = observed[\"__v_raw\"];\n const rawTarget = toRaw(target);\n const wrap = shallow ? toShallow : readonly ? toReadonly : toReactive;\n !readonly && track(rawTarget, \"iterate\", ITERATE_KEY);\n return target.forEach((value, key) => {\n return callback.call(thisArg, wrap(value), wrap(key), observed);\n });\n }\n };\n extend(\n instrumentations,\n readonly ? {\n add: createReadonlyMethod(\"add\"),\n set: createReadonlyMethod(\"set\"),\n delete: createReadonlyMethod(\"delete\"),\n clear: createReadonlyMethod(\"clear\")\n } : {\n add(value) {\n if (!shallow && !isShallow(value) && !isReadonly(value)) {\n value = toRaw(value);\n }\n const target = toRaw(this);\n const proto = getProto(target);\n const hadKey = proto.has.call(target, value);\n if (!hadKey) {\n target.add(value);\n trigger(target, \"add\", value, value);\n }\n return this;\n },\n set(key, value) {\n if (!shallow && !isShallow(value) && !isReadonly(value)) {\n value = toRaw(value);\n }\n const target = toRaw(this);\n const { has, get } = getProto(target);\n let hadKey = has.call(target, key);\n if (!hadKey) {\n key = toRaw(key);\n hadKey = has.call(target, key);\n } else if (!!(process.env.NODE_ENV !== \"production\")) {\n checkIdentityKeys(target, has, key);\n }\n const oldValue = get.call(target, key);\n target.set(key, value);\n if (!hadKey) {\n trigger(target, \"add\", key, value);\n } else if (hasChanged(value, oldValue)) {\n trigger(target, \"set\", key, value, oldValue);\n }\n return this;\n },\n delete(key) {\n const target = toRaw(this);\n const { has, get } = getProto(target);\n let hadKey = has.call(target, key);\n if (!hadKey) {\n key = toRaw(key);\n hadKey = has.call(target, key);\n } else if (!!(process.env.NODE_ENV !== \"production\")) {\n checkIdentityKeys(target, has, key);\n }\n const oldValue = get ? get.call(target, key) : void 0;\n const result = target.delete(key);\n if (hadKey) {\n trigger(target, \"delete\", key, void 0, oldValue);\n }\n return result;\n },\n clear() {\n const target = toRaw(this);\n const hadItems = target.size !== 0;\n const oldTarget = !!(process.env.NODE_ENV !== \"production\") ? isMap(target) ? new Map(target) : new Set(target) : void 0;\n const result = target.clear();\n if (hadItems) {\n trigger(\n target,\n \"clear\",\n void 0,\n void 0,\n oldTarget\n );\n }\n return result;\n }\n }\n );\n const iteratorMethods = [\n \"keys\",\n \"values\",\n \"entries\",\n Symbol.iterator\n ];\n iteratorMethods.forEach((method) => {\n instrumentations[method] = createIterableMethod(method, readonly, shallow);\n });\n return instrumentations;\n}\nfunction createInstrumentationGetter(isReadonly2, shallow) {\n const instrumentations = createInstrumentations(isReadonly2, shallow);\n return (target, key, receiver) => {\n if (key === \"__v_isReactive\") {\n return !isReadonly2;\n } else if (key === \"__v_isReadonly\") {\n return isReadonly2;\n } else if (key === \"__v_raw\") {\n return target;\n }\n return Reflect.get(\n hasOwn(instrumentations, key) && key in target ? instrumentations : target,\n key,\n receiver\n );\n };\n}\nconst mutableCollectionHandlers = {\n get: /* @__PURE__ */ createInstrumentationGetter(false, false)\n};\nconst shallowCollectionHandlers = {\n get: /* @__PURE__ */ createInstrumentationGetter(false, true)\n};\nconst readonlyCollectionHandlers = {\n get: /* @__PURE__ */ createInstrumentationGetter(true, false)\n};\nconst shallowReadonlyCollectionHandlers = {\n get: /* @__PURE__ */ createInstrumentationGetter(true, true)\n};\nfunction checkIdentityKeys(target, has, key) {\n const rawKey = toRaw(key);\n if (rawKey !== key && has.call(target, rawKey)) {\n const type = toRawType(target);\n warn(\n `Reactive ${type} contains both the raw and reactive versions of the same object${type === `Map` ? ` as keys` : ``}, which can lead to inconsistencies. Avoid differentiating between the raw and reactive versions of an object and only use the reactive version if possible.`\n );\n }\n}\n\nconst reactiveMap = /* @__PURE__ */ new WeakMap();\nconst shallowReactiveMap = /* @__PURE__ */ new WeakMap();\nconst readonlyMap = /* @__PURE__ */ new WeakMap();\nconst shallowReadonlyMap = /* @__PURE__ */ new WeakMap();\nfunction targetTypeMap(rawType) {\n switch (rawType) {\n case \"Object\":\n case \"Array\":\n return 1 /* COMMON */;\n case \"Map\":\n case \"Set\":\n case \"WeakMap\":\n case \"WeakSet\":\n return 2 /* COLLECTION */;\n default:\n return 0 /* INVALID */;\n }\n}\nfunction getTargetType(value) {\n return value[\"__v_skip\"] || !Object.isExtensible(value) ? 0 /* INVALID */ : targetTypeMap(toRawType(value));\n}\nfunction reactive(target) {\n if (isReadonly(target)) {\n return target;\n }\n return createReactiveObject(\n target,\n false,\n mutableHandlers,\n mutableCollectionHandlers,\n reactiveMap\n );\n}\nfunction shallowReactive(target) {\n return createReactiveObject(\n target,\n false,\n shallowReactiveHandlers,\n shallowCollectionHandlers,\n shallowReactiveMap\n );\n}\nfunction readonly(target) {\n return createReactiveObject(\n target,\n true,\n readonlyHandlers,\n readonlyCollectionHandlers,\n readonlyMap\n );\n}\nfunction shallowReadonly(target) {\n return createReactiveObject(\n target,\n true,\n shallowReadonlyHandlers,\n shallowReadonlyCollectionHandlers,\n shallowReadonlyMap\n );\n}\nfunction createReactiveObject(target, isReadonly2, baseHandlers, collectionHandlers, proxyMap) {\n if (!isObject(target)) {\n if (!!(process.env.NODE_ENV !== \"production\")) {\n warn(\n `value cannot be made ${isReadonly2 ? \"readonly\" : \"reactive\"}: ${String(\n target\n )}`\n );\n }\n return target;\n }\n if (target[\"__v_raw\"] && !(isReadonly2 && target[\"__v_isReactive\"])) {\n return target;\n }\n const targetType = getTargetType(target);\n if (targetType === 0 /* INVALID */) {\n return target;\n }\n const existingProxy = proxyMap.get(target);\n if (existingProxy) {\n return existingProxy;\n }\n const proxy = new Proxy(\n target,\n targetType === 2 /* COLLECTION */ ? collectionHandlers : baseHandlers\n );\n proxyMap.set(target, proxy);\n return proxy;\n}\nfunction isReactive(value) {\n if (isReadonly(value)) {\n return isReactive(value[\"__v_raw\"]);\n }\n return !!(value && value[\"__v_isReactive\"]);\n}\nfunction isReadonly(value) {\n return !!(value && value[\"__v_isReadonly\"]);\n}\nfunction isShallow(value) {\n return !!(value && value[\"__v_isShallow\"]);\n}\nfunction isProxy(value) {\n return value ? !!value[\"__v_raw\"] : false;\n}\nfunction toRaw(observed) {\n const raw = observed && observed[\"__v_raw\"];\n return raw ? toRaw(raw) : observed;\n}\nfunction markRaw(value) {\n if (!hasOwn(value, \"__v_skip\") && Object.isExtensible(value)) {\n def(value, \"__v_skip\", true);\n }\n return value;\n}\nconst toReactive = (value) => isObject(value) ? reactive(value) : value;\nconst toReadonly = (value) => isObject(value) ? readonly(value) : value;\n\nfunction isRef(r) {\n return r ? r[\"__v_isRef\"] === true : false;\n}\nfunction ref(value) {\n return createRef(value, false);\n}\nfunction shallowRef(value) {\n return createRef(value, true);\n}\nfunction createRef(rawValue, shallow) {\n if (isRef(rawValue)) {\n return rawValue;\n }\n return new RefImpl(rawValue, shallow);\n}\nclass RefImpl {\n constructor(value, isShallow2) {\n this.dep = new Dep();\n this[\"__v_isRef\"] = true;\n this[\"__v_isShallow\"] = false;\n this._rawValue = isShallow2 ? value : toRaw(value);\n this._value = isShallow2 ? value : toReactive(value);\n this[\"__v_isShallow\"] = isShallow2;\n }\n get value() {\n if (!!(process.env.NODE_ENV !== \"production\")) {\n this.dep.track({\n target: this,\n type: \"get\",\n key: \"value\"\n });\n } else {\n this.dep.track();\n }\n return this._value;\n }\n set value(newValue) {\n const oldValue = this._rawValue;\n const useDirectValue = this[\"__v_isShallow\"] || isShallow(newValue) || isReadonly(newValue);\n newValue = useDirectValue ? newValue : toRaw(newValue);\n if (hasChanged(newValue, oldValue)) {\n this._rawValue = newValue;\n this._value = useDirectValue ? newValue : toReactive(newValue);\n if (!!(process.env.NODE_ENV !== \"production\")) {\n this.dep.trigger({\n target: this,\n type: \"set\",\n key: \"value\",\n newValue,\n oldValue\n });\n } else {\n this.dep.trigger();\n }\n }\n }\n}\nfunction triggerRef(ref2) {\n if (ref2.dep) {\n if (!!(process.env.NODE_ENV !== \"production\")) {\n ref2.dep.trigger({\n target: ref2,\n type: \"set\",\n key: \"value\",\n newValue: ref2._value\n });\n } else {\n ref2.dep.trigger();\n }\n }\n}\nfunction unref(ref2) {\n return isRef(ref2) ? ref2.value : ref2;\n}\nfunction toValue(source) {\n return isFunction(source) ? source() : unref(source);\n}\nconst shallowUnwrapHandlers = {\n get: (target, key, receiver) => key === \"__v_raw\" ? target : unref(Reflect.get(target, key, receiver)),\n set: (target, key, value, receiver) => {\n const oldValue = target[key];\n if (isRef(oldValue) && !isRef(value)) {\n oldValue.value = value;\n return true;\n } else {\n return Reflect.set(target, key, value, receiver);\n }\n }\n};\nfunction proxyRefs(objectWithRefs) {\n return isReactive(objectWithRefs) ? objectWithRefs : new Proxy(objectWithRefs, shallowUnwrapHandlers);\n}\nclass CustomRefImpl {\n constructor(factory) {\n this[\"__v_isRef\"] = true;\n this._value = void 0;\n const dep = this.dep = new Dep();\n const { get, set } = factory(dep.track.bind(dep), dep.trigger.bind(dep));\n this._get = get;\n this._set = set;\n }\n get value() {\n return this._value = this._get();\n }\n set value(newVal) {\n this._set(newVal);\n }\n}\nfunction customRef(factory) {\n return new CustomRefImpl(factory);\n}\nfunction toRefs(object) {\n if (!!(process.env.NODE_ENV !== \"production\") && !isProxy(object)) {\n warn(`toRefs() expects a reactive object but received a plain one.`);\n }\n const ret = isArray(object) ? new Array(object.length) : {};\n for (const key in object) {\n ret[key] = propertyToRef(object, key);\n }\n return ret;\n}\nclass ObjectRefImpl {\n constructor(_object, _key, _defaultValue) {\n this._object = _object;\n this._key = _key;\n this._defaultValue = _defaultValue;\n this[\"__v_isRef\"] = true;\n this._value = void 0;\n this._raw = toRaw(_object);\n let shallow = true;\n let obj = _object;\n if (!isArray(_object) || !isIntegerKey(String(_key))) {\n do {\n shallow = !isProxy(obj) || isShallow(obj);\n } while (shallow && (obj = obj[\"__v_raw\"]));\n }\n this._shallow = shallow;\n }\n get value() {\n let val = this._object[this._key];\n if (this._shallow) {\n val = unref(val);\n }\n return this._value = val === void 0 ? this._defaultValue : val;\n }\n set value(newVal) {\n if (this._shallow && isRef(this._raw[this._key])) {\n const nestedRef = this._object[this._key];\n if (isRef(nestedRef)) {\n nestedRef.value = newVal;\n return;\n }\n }\n this._object[this._key] = newVal;\n }\n get dep() {\n return getDepFromReactive(this._raw, this._key);\n }\n}\nclass GetterRefImpl {\n constructor(_getter) {\n this._getter = _getter;\n this[\"__v_isRef\"] = true;\n this[\"__v_isReadonly\"] = true;\n this._value = void 0;\n }\n get value() {\n return this._value = this._getter();\n }\n}\nfunction toRef(source, key, defaultValue) {\n if (isRef(source)) {\n return source;\n } else if (isFunction(source)) {\n return new GetterRefImpl(source);\n } else if (isObject(source) && arguments.length > 1) {\n return propertyToRef(source, key, defaultValue);\n } else {\n return ref(source);\n }\n}\nfunction propertyToRef(source, key, defaultValue) {\n return new ObjectRefImpl(source, key, defaultValue);\n}\n\nclass ComputedRefImpl {\n constructor(fn, setter, isSSR) {\n this.fn = fn;\n this.setter = setter;\n /**\n * @internal\n */\n this._value = void 0;\n /**\n * @internal\n */\n this.dep = new Dep(this);\n /**\n * @internal\n */\n this.__v_isRef = true;\n // TODO isolatedDeclarations \"__v_isReadonly\"\n // A computed is also a subscriber that tracks other deps\n /**\n * @internal\n */\n this.deps = void 0;\n /**\n * @internal\n */\n this.depsTail = void 0;\n /**\n * @internal\n */\n this.flags = 16;\n /**\n * @internal\n */\n this.globalVersion = globalVersion - 1;\n /**\n * @internal\n */\n this.next = void 0;\n // for backwards compat\n this.effect = this;\n this[\"__v_isReadonly\"] = !setter;\n this.isSSR = isSSR;\n }\n /**\n * @internal\n */\n notify() {\n this.flags |= 16;\n if (!(this.flags & 8) && // avoid infinite self recursion\n activeSub !== this) {\n batch(this, true);\n return true;\n } else if (!!(process.env.NODE_ENV !== \"production\")) ;\n }\n get value() {\n const link = !!(process.env.NODE_ENV !== \"production\") ? this.dep.track({\n target: this,\n type: \"get\",\n key: \"value\"\n }) : this.dep.track();\n refreshComputed(this);\n if (link) {\n link.version = this.dep.version;\n }\n return this._value;\n }\n set value(newValue) {\n if (this.setter) {\n this.setter(newValue);\n } else if (!!(process.env.NODE_ENV !== \"production\")) {\n warn(\"Write operation failed: computed value is readonly\");\n }\n }\n}\nfunction computed(getterOrOptions, debugOptions, isSSR = false) {\n let getter;\n let setter;\n if (isFunction(getterOrOptions)) {\n getter = getterOrOptions;\n } else {\n getter = getterOrOptions.get;\n setter = getterOrOptions.set;\n }\n const cRef = new ComputedRefImpl(getter, setter, isSSR);\n if (!!(process.env.NODE_ENV !== \"production\") && debugOptions && !isSSR) {\n cRef.onTrack = debugOptions.onTrack;\n cRef.onTrigger = debugOptions.onTrigger;\n }\n return cRef;\n}\n\nconst TrackOpTypes = {\n \"GET\": \"get\",\n \"HAS\": \"has\",\n \"ITERATE\": \"iterate\"\n};\nconst TriggerOpTypes = {\n \"SET\": \"set\",\n \"ADD\": \"add\",\n \"DELETE\": \"delete\",\n \"CLEAR\": \"clear\"\n};\nconst ReactiveFlags = {\n \"SKIP\": \"__v_skip\",\n \"IS_REACTIVE\": \"__v_isReactive\",\n \"IS_READONLY\": \"__v_isReadonly\",\n \"IS_SHALLOW\": \"__v_isShallow\",\n \"RAW\": \"__v_raw\",\n \"IS_REF\": \"__v_isRef\"\n};\n\nconst WatchErrorCodes = {\n \"WATCH_GETTER\": 2,\n \"2\": \"WATCH_GETTER\",\n \"WATCH_CALLBACK\": 3,\n \"3\": \"WATCH_CALLBACK\",\n \"WATCH_CLEANUP\": 4,\n \"4\": \"WATCH_CLEANUP\"\n};\nconst INITIAL_WATCHER_VALUE = {};\nconst cleanupMap = /* @__PURE__ */ new WeakMap();\nlet activeWatcher = void 0;\nfunction getCurrentWatcher() {\n return activeWatcher;\n}\nfunction onWatcherCleanup(cleanupFn, failSilently = false, owner = activeWatcher) {\n if (owner) {\n let cleanups = cleanupMap.get(owner);\n if (!cleanups) cleanupMap.set(owner, cleanups = []);\n cleanups.push(cleanupFn);\n } else if (!!(process.env.NODE_ENV !== \"production\") && !failSilently) {\n warn(\n `onWatcherCleanup() was called when there was no active watcher to associate with.`\n );\n }\n}\nfunction watch(source, cb, options = EMPTY_OBJ) {\n const { immediate, deep, once, scheduler, augmentJob, call } = options;\n const warnInvalidSource = (s) => {\n (options.onWarn || warn)(\n `Invalid watch source: `,\n s,\n `A watch source can only be a getter/effect function, a ref, a reactive object, or an array of these types.`\n );\n };\n const reactiveGetter = (source2) => {\n if (deep) return source2;\n if (isShallow(source2) || deep === false || deep === 0)\n return traverse(source2, 1);\n return traverse(source2);\n };\n let effect;\n let getter;\n let cleanup;\n let boundCleanup;\n let forceTrigger = false;\n let isMultiSource = false;\n if (isRef(source)) {\n getter = () => source.value;\n forceTrigger = isShallow(source);\n } else if (isReactive(source)) {\n getter = () => reactiveGetter(source);\n forceTrigger = true;\n } else if (isArray(source)) {\n isMultiSource = true;\n forceTrigger = source.some((s) => isReactive(s) || isShallow(s));\n getter = () => source.map((s) => {\n if (isRef(s)) {\n return s.value;\n } else if (isReactive(s)) {\n return reactiveGetter(s);\n } else if (isFunction(s)) {\n return call ? call(s, 2) : s();\n } else {\n !!(process.env.NODE_ENV !== \"production\") && warnInvalidSource(s);\n }\n });\n } else if (isFunction(source)) {\n if (cb) {\n getter = call ? () => call(source, 2) : source;\n } else {\n getter = () => {\n if (cleanup) {\n pauseTracking();\n try {\n cleanup();\n } finally {\n resetTracking();\n }\n }\n const currentEffect = activeWatcher;\n activeWatcher = effect;\n try {\n return call ? call(source, 3, [boundCleanup]) : source(boundCleanup);\n } finally {\n activeWatcher = currentEffect;\n }\n };\n }\n } else {\n getter = NOOP;\n !!(process.env.NODE_ENV !== \"production\") && warnInvalidSource(source);\n }\n if (cb && deep) {\n const baseGetter = getter;\n const depth = deep === true ? Infinity : deep;\n getter = () => traverse(baseGetter(), depth);\n }\n const scope = getCurrentScope();\n const watchHandle = () => {\n effect.stop();\n if (scope && scope.active) {\n remove(scope.effects, effect);\n }\n };\n if (once && cb) {\n const _cb = cb;\n cb = (...args) => {\n _cb(...args);\n watchHandle();\n };\n }\n let oldValue = isMultiSource ? new Array(source.length).fill(INITIAL_WATCHER_VALUE) : INITIAL_WATCHER_VALUE;\n const job = (immediateFirstRun) => {\n if (!(effect.flags & 1) || !effect.dirty && !immediateFirstRun) {\n return;\n }\n if (cb) {\n const newValue = effect.run();\n if (deep || forceTrigger || (isMultiSource ? newValue.some((v, i) => hasChanged(v, oldValue[i])) : hasChanged(newValue, oldValue))) {\n if (cleanup) {\n cleanup();\n }\n const currentWatcher = activeWatcher;\n activeWatcher = effect;\n try {\n const args = [\n newValue,\n // pass undefined as the old value when it's changed for the first time\n oldValue === INITIAL_WATCHER_VALUE ? void 0 : isMultiSource && oldValue[0] === INITIAL_WATCHER_VALUE ? [] : oldValue,\n boundCleanup\n ];\n oldValue = newValue;\n call ? call(cb, 3, args) : (\n // @ts-expect-error\n cb(...args)\n );\n } finally {\n activeWatcher = currentWatcher;\n }\n }\n } else {\n effect.run();\n }\n };\n if (augmentJob) {\n augmentJob(job);\n }\n effect = new ReactiveEffect(getter);\n effect.scheduler = scheduler ? () => scheduler(job, false) : job;\n boundCleanup = (fn) => onWatcherCleanup(fn, false, effect);\n cleanup = effect.onStop = () => {\n const cleanups = cleanupMap.get(effect);\n if (cleanups) {\n if (call) {\n call(cleanups, 4);\n } else {\n for (const cleanup2 of cleanups) cleanup2();\n }\n cleanupMap.delete(effect);\n }\n };\n if (!!(process.env.NODE_ENV !== \"production\")) {\n effect.onTrack = options.onTrack;\n effect.onTrigger = options.onTrigger;\n }\n if (cb) {\n if (immediate) {\n job(true);\n } else {\n oldValue = effect.run();\n }\n } else if (scheduler) {\n scheduler(job.bind(null, true), true);\n } else {\n effect.run();\n }\n watchHandle.pause = effect.pause.bind(effect);\n watchHandle.resume = effect.resume.bind(effect);\n watchHandle.stop = watchHandle;\n return watchHandle;\n}\nfunction traverse(value, depth = Infinity, seen) {\n if (depth <= 0 || !isObject(value) || value[\"__v_skip\"]) {\n return value;\n }\n seen = seen || /* @__PURE__ */ new Map();\n if ((seen.get(value) || 0) >= depth) {\n return value;\n }\n seen.set(value, depth);\n depth--;\n if (isRef(value)) {\n traverse(value.value, depth, seen);\n } else if (isArray(value)) {\n for (let i = 0; i < value.length; i++) {\n traverse(value[i], depth, seen);\n }\n } else if (isSet(value) || isMap(value)) {\n value.forEach((v) => {\n traverse(v, depth, seen);\n });\n } else if (isPlainObject(value)) {\n for (const key in value) {\n traverse(value[key], depth, seen);\n }\n for (const key of Object.getOwnPropertySymbols(value)) {\n if (Object.prototype.propertyIsEnumerable.call(value, key)) {\n traverse(value[key], depth, seen);\n }\n }\n }\n return value;\n}\n\nexport { ARRAY_ITERATE_KEY, EffectFlags, EffectScope, ITERATE_KEY, MAP_KEY_ITERATE_KEY, ReactiveEffect, ReactiveFlags, TrackOpTypes, TriggerOpTypes, WatchErrorCodes, computed, customRef, effect, effectScope, enableTracking, getCurrentScope, getCurrentWatcher, isProxy, isReactive, isReadonly, isRef, isShallow, markRaw, onEffectCleanup, onScopeDispose, onWatcherCleanup, pauseTracking, proxyRefs, reactive, reactiveReadArray, readonly, ref, resetTracking, shallowReactive, shallowReadArray, shallowReadonly, shallowRef, stop, toRaw, toReactive, toReadonly, toRef, toRefs, toValue, track, traverse, trigger, triggerRef, unref, watch };\n","/**\n* @vue/runtime-core v3.5.26\n* (c) 2018-present Yuxi (Evan) You and Vue contributors\n* @license MIT\n**/\nimport { pauseTracking, resetTracking, isRef, toRaw, traverse, watch as watch$1, shallowRef, readonly, isReactive, ref, isShallow, isReadonly, shallowReadArray, toReadonly, toReactive, shallowReadonly, track, reactive, customRef, shallowReactive, trigger, ReactiveEffect, isProxy, proxyRefs, markRaw, EffectScope, computed as computed$1 } from '@vue/reactivity';\nexport { EffectScope, ReactiveEffect, TrackOpTypes, TriggerOpTypes, customRef, effect, effectScope, getCurrentScope, getCurrentWatcher, isProxy, isReactive, isReadonly, isRef, isShallow, markRaw, onScopeDispose, onWatcherCleanup, proxyRefs, reactive, readonly, ref, shallowReactive, shallowReadonly, shallowRef, stop, toRaw, toRef, toRefs, toValue, triggerRef, unref } from '@vue/reactivity';\nimport { isString, isFunction, EMPTY_OBJ, isPromise, isArray, NOOP, getGlobalThis, extend, isBuiltInDirective, NO, hasOwn, remove, def, isOn, isReservedProp, normalizeClass, stringifyStyle, normalizeStyle, isKnownSvgAttr, isBooleanAttr, isKnownHtmlAttr, includeBooleanAttr, isRenderableAttrValue, normalizeCssVarValue, getEscapedCssVarName, isObject, isRegExp, invokeArrayFns, toHandlerKey, camelize, capitalize, isSymbol, isGloballyAllowed, hyphenate, hasChanged, looseToNumber, isModelListener, EMPTY_ARR, makeMap, toRawType, toNumber } from '@vue/shared';\nexport { camelize, capitalize, normalizeClass, normalizeProps, normalizeStyle, toDisplayString, toHandlerKey } from '@vue/shared';\n\nconst stack = [];\nfunction pushWarningContext(vnode) {\n stack.push(vnode);\n}\nfunction popWarningContext() {\n stack.pop();\n}\nlet isWarning = false;\nfunction warn$1(msg, ...args) {\n if (isWarning) return;\n isWarning = true;\n pauseTracking();\n const instance = stack.length ? stack[stack.length - 1].component : null;\n const appWarnHandler = instance && instance.appContext.config.warnHandler;\n const trace = getComponentTrace();\n if (appWarnHandler) {\n callWithErrorHandling(\n appWarnHandler,\n instance,\n 11,\n [\n // eslint-disable-next-line no-restricted-syntax\n msg + args.map((a) => {\n var _a, _b;\n return (_b = (_a = a.toString) == null ? void 0 : _a.call(a)) != null ? _b : JSON.stringify(a);\n }).join(\"\"),\n instance && instance.proxy,\n trace.map(\n ({ vnode }) => `at <${formatComponentName(instance, vnode.type)}>`\n ).join(\"\\n\"),\n trace\n ]\n );\n } else {\n const warnArgs = [`[Vue warn]: ${msg}`, ...args];\n if (trace.length && // avoid spamming console during tests\n true) {\n warnArgs.push(`\n`, ...formatTrace(trace));\n }\n console.warn(...warnArgs);\n }\n resetTracking();\n isWarning = false;\n}\nfunction getComponentTrace() {\n let currentVNode = stack[stack.length - 1];\n if (!currentVNode) {\n return [];\n }\n const normalizedStack = [];\n while (currentVNode) {\n const last = normalizedStack[0];\n if (last && last.vnode === currentVNode) {\n last.recurseCount++;\n } else {\n normalizedStack.push({\n vnode: currentVNode,\n recurseCount: 0\n });\n }\n const parentInstance = currentVNode.component && currentVNode.component.parent;\n currentVNode = parentInstance && parentInstance.vnode;\n }\n return normalizedStack;\n}\nfunction formatTrace(trace) {\n const logs = [];\n trace.forEach((entry, i) => {\n logs.push(...i === 0 ? [] : [`\n`], ...formatTraceEntry(entry));\n });\n return logs;\n}\nfunction formatTraceEntry({ vnode, recurseCount }) {\n const postfix = recurseCount > 0 ? `... (${recurseCount} recursive calls)` : ``;\n const isRoot = vnode.component ? vnode.component.parent == null : false;\n const open = ` at <${formatComponentName(\n vnode.component,\n vnode.type,\n isRoot\n )}`;\n const close = `>` + postfix;\n return vnode.props ? [open, ...formatProps(vnode.props), close] : [open + close];\n}\nfunction formatProps(props) {\n const res = [];\n const keys = Object.keys(props);\n keys.slice(0, 3).forEach((key) => {\n res.push(...formatProp(key, props[key]));\n });\n if (keys.length > 3) {\n res.push(` ...`);\n }\n return res;\n}\nfunction formatProp(key, value, raw) {\n if (isString(value)) {\n value = JSON.stringify(value);\n return raw ? value : [`${key}=${value}`];\n } else if (typeof value === \"number\" || typeof value === \"boolean\" || value == null) {\n return raw ? value : [`${key}=${value}`];\n } else if (isRef(value)) {\n value = formatProp(key, toRaw(value.value), true);\n return raw ? value : [`${key}=Ref<`, value, `>`];\n } else if (isFunction(value)) {\n return [`${key}=fn${value.name ? `<${value.name}>` : ``}`];\n } else {\n value = toRaw(value);\n return raw ? value : [`${key}=`, value];\n }\n}\nfunction assertNumber(val, type) {\n if (!!!(process.env.NODE_ENV !== \"production\")) return;\n if (val === void 0) {\n return;\n } else if (typeof val !== \"number\") {\n warn$1(`${type} is not a valid number - got ${JSON.stringify(val)}.`);\n } else if (isNaN(val)) {\n warn$1(`${type} is NaN - the duration expression might be incorrect.`);\n }\n}\n\nconst ErrorCodes = {\n \"SETUP_FUNCTION\": 0,\n \"0\": \"SETUP_FUNCTION\",\n \"RENDER_FUNCTION\": 1,\n \"1\": \"RENDER_FUNCTION\",\n \"NATIVE_EVENT_HANDLER\": 5,\n \"5\": \"NATIVE_EVENT_HANDLER\",\n \"COMPONENT_EVENT_HANDLER\": 6,\n \"6\": \"COMPONENT_EVENT_HANDLER\",\n \"VNODE_HOOK\": 7,\n \"7\": \"VNODE_HOOK\",\n \"DIRECTIVE_HOOK\": 8,\n \"8\": \"DIRECTIVE_HOOK\",\n \"TRANSITION_HOOK\": 9,\n \"9\": \"TRANSITION_HOOK\",\n \"APP_ERROR_HANDLER\": 10,\n \"10\": \"APP_ERROR_HANDLER\",\n \"APP_WARN_HANDLER\": 11,\n \"11\": \"APP_WARN_HANDLER\",\n \"FUNCTION_REF\": 12,\n \"12\": \"FUNCTION_REF\",\n \"ASYNC_COMPONENT_LOADER\": 13,\n \"13\": \"ASYNC_COMPONENT_LOADER\",\n \"SCHEDULER\": 14,\n \"14\": \"SCHEDULER\",\n \"COMPONENT_UPDATE\": 15,\n \"15\": \"COMPONENT_UPDATE\",\n \"APP_UNMOUNT_CLEANUP\": 16,\n \"16\": \"APP_UNMOUNT_CLEANUP\"\n};\nconst ErrorTypeStrings$1 = {\n [\"sp\"]: \"serverPrefetch hook\",\n [\"bc\"]: \"beforeCreate hook\",\n [\"c\"]: \"created hook\",\n [\"bm\"]: \"beforeMount hook\",\n [\"m\"]: \"mounted hook\",\n [\"bu\"]: \"beforeUpdate hook\",\n [\"u\"]: \"updated\",\n [\"bum\"]: \"beforeUnmount hook\",\n [\"um\"]: \"unmounted hook\",\n [\"a\"]: \"activated hook\",\n [\"da\"]: \"deactivated hook\",\n [\"ec\"]: \"errorCaptured hook\",\n [\"rtc\"]: \"renderTracked hook\",\n [\"rtg\"]: \"renderTriggered hook\",\n [0]: \"setup function\",\n [1]: \"render function\",\n [2]: \"watcher getter\",\n [3]: \"watcher callback\",\n [4]: \"watcher cleanup function\",\n [5]: \"native event handler\",\n [6]: \"component event handler\",\n [7]: \"vnode hook\",\n [8]: \"directive hook\",\n [9]: \"transition hook\",\n [10]: \"app errorHandler\",\n [11]: \"app warnHandler\",\n [12]: \"ref function\",\n [13]: \"async component loader\",\n [14]: \"scheduler flush\",\n [15]: \"component update\",\n [16]: \"app unmount cleanup function\"\n};\nfunction callWithErrorHandling(fn, instance, type, args) {\n try {\n return args ? fn(...args) : fn();\n } catch (err) {\n handleError(err, instance, type);\n }\n}\nfunction callWithAsyncErrorHandling(fn, instance, type, args) {\n if (isFunction(fn)) {\n const res = callWithErrorHandling(fn, instance, type, args);\n if (res && isPromise(res)) {\n res.catch((err) => {\n handleError(err, instance, type);\n });\n }\n return res;\n }\n if (isArray(fn)) {\n const values = [];\n for (let i = 0; i < fn.length; i++) {\n values.push(callWithAsyncErrorHandling(fn[i], instance, type, args));\n }\n return values;\n } else if (!!(process.env.NODE_ENV !== \"production\")) {\n warn$1(\n `Invalid value type passed to callWithAsyncErrorHandling(): ${typeof fn}`\n );\n }\n}\nfunction handleError(err, instance, type, throwInDev = true) {\n const contextVNode = instance ? instance.vnode : null;\n const { errorHandler, throwUnhandledErrorInProduction } = instance && instance.appContext.config || EMPTY_OBJ;\n if (instance) {\n let cur = instance.parent;\n const exposedInstance = instance.proxy;\n const errorInfo = !!(process.env.NODE_ENV !== \"production\") ? ErrorTypeStrings$1[type] : `https://vuejs.org/error-reference/#runtime-${type}`;\n while (cur) {\n const errorCapturedHooks = cur.ec;\n if (errorCapturedHooks) {\n for (let i = 0; i < errorCapturedHooks.length; i++) {\n if (errorCapturedHooks[i](err, exposedInstance, errorInfo) === false) {\n return;\n }\n }\n }\n cur = cur.parent;\n }\n if (errorHandler) {\n pauseTracking();\n callWithErrorHandling(errorHandler, null, 10, [\n err,\n exposedInstance,\n errorInfo\n ]);\n resetTracking();\n return;\n }\n }\n logError(err, type, contextVNode, throwInDev, throwUnhandledErrorInProduction);\n}\nfunction logError(err, type, contextVNode, throwInDev = true, throwInProd = false) {\n if (!!(process.env.NODE_ENV !== \"production\")) {\n const info = ErrorTypeStrings$1[type];\n if (contextVNode) {\n pushWarningContext(contextVNode);\n }\n warn$1(`Unhandled error${info ? ` during execution of ${info}` : ``}`);\n if (contextVNode) {\n popWarningContext();\n }\n if (throwInDev) {\n throw err;\n } else {\n console.error(err);\n }\n } else if (throwInProd) {\n throw err;\n } else {\n console.error(err);\n }\n}\n\nconst queue = [];\nlet flushIndex = -1;\nconst pendingPostFlushCbs = [];\nlet activePostFlushCbs = null;\nlet postFlushIndex = 0;\nconst resolvedPromise = /* @__PURE__ */ Promise.resolve();\nlet currentFlushPromise = null;\nconst RECURSION_LIMIT = 100;\nfunction nextTick(fn) {\n const p = currentFlushPromise || resolvedPromise;\n return fn ? p.then(this ? fn.bind(this) : fn) : p;\n}\nfunction findInsertionIndex(id) {\n let start = flushIndex + 1;\n let end = queue.length;\n while (start < end) {\n const middle = start + end >>> 1;\n const middleJob = queue[middle];\n const middleJobId = getId(middleJob);\n if (middleJobId < id || middleJobId === id && middleJob.flags & 2) {\n start = middle + 1;\n } else {\n end = middle;\n }\n }\n return start;\n}\nfunction queueJob(job) {\n if (!(job.flags & 1)) {\n const jobId = getId(job);\n const lastJob = queue[queue.length - 1];\n if (!lastJob || // fast path when the job id is larger than the tail\n !(job.flags & 2) && jobId >= getId(lastJob)) {\n queue.push(job);\n } else {\n queue.splice(findInsertionIndex(jobId), 0, job);\n }\n job.flags |= 1;\n queueFlush();\n }\n}\nfunction queueFlush() {\n if (!currentFlushPromise) {\n currentFlushPromise = resolvedPromise.then(flushJobs);\n }\n}\nfunction queuePostFlushCb(cb) {\n if (!isArray(cb)) {\n if (activePostFlushCbs && cb.id === -1) {\n activePostFlushCbs.splice(postFlushIndex + 1, 0, cb);\n } else if (!(cb.flags & 1)) {\n pendingPostFlushCbs.push(cb);\n cb.flags |= 1;\n }\n } else {\n pendingPostFlushCbs.push(...cb);\n }\n queueFlush();\n}\nfunction flushPreFlushCbs(instance, seen, i = flushIndex + 1) {\n if (!!(process.env.NODE_ENV !== \"production\")) {\n seen = seen || /* @__PURE__ */ new Map();\n }\n for (; i < queue.length; i++) {\n const cb = queue[i];\n if (cb && cb.flags & 2) {\n if (instance && cb.id !== instance.uid) {\n continue;\n }\n if (!!(process.env.NODE_ENV !== \"production\") && checkRecursiveUpdates(seen, cb)) {\n continue;\n }\n queue.splice(i, 1);\n i--;\n if (cb.flags & 4) {\n cb.flags &= -2;\n }\n cb();\n if (!(cb.flags & 4)) {\n cb.flags &= -2;\n }\n }\n }\n}\nfunction flushPostFlushCbs(seen) {\n if (pendingPostFlushCbs.length) {\n const deduped = [...new Set(pendingPostFlushCbs)].sort(\n (a, b) => getId(a) - getId(b)\n );\n pendingPostFlushCbs.length = 0;\n if (activePostFlushCbs) {\n activePostFlushCbs.push(...deduped);\n return;\n }\n activePostFlushCbs = deduped;\n if (!!(process.env.NODE_ENV !== \"production\")) {\n seen = seen || /* @__PURE__ */ new Map();\n }\n for (postFlushIndex = 0; postFlushIndex < activePostFlushCbs.length; postFlushIndex++) {\n const cb = activePostFlushCbs[postFlushIndex];\n if (!!(process.env.NODE_ENV !== \"production\") && checkRecursiveUpdates(seen, cb)) {\n continue;\n }\n if (cb.flags & 4) {\n cb.flags &= -2;\n }\n if (!(cb.flags & 8)) cb();\n cb.flags &= -2;\n }\n activePostFlushCbs = null;\n postFlushIndex = 0;\n }\n}\nconst getId = (job) => job.id == null ? job.flags & 2 ? -1 : Infinity : job.id;\nfunction flushJobs(seen) {\n if (!!(process.env.NODE_ENV !== \"production\")) {\n seen = seen || /* @__PURE__ */ new Map();\n }\n const check = !!(process.env.NODE_ENV !== \"production\") ? (job) => checkRecursiveUpdates(seen, job) : NOOP;\n try {\n for (flushIndex = 0; flushIndex < queue.length; flushIndex++) {\n const job = queue[flushIndex];\n if (job && !(job.flags & 8)) {\n if (!!(process.env.NODE_ENV !== \"production\") && check(job)) {\n continue;\n }\n if (job.flags & 4) {\n job.flags &= ~1;\n }\n callWithErrorHandling(\n job,\n job.i,\n job.i ? 15 : 14\n );\n if (!(job.flags & 4)) {\n job.flags &= ~1;\n }\n }\n }\n } finally {\n for (; flushIndex < queue.length; flushIndex++) {\n const job = queue[flushIndex];\n if (job) {\n job.flags &= -2;\n }\n }\n flushIndex = -1;\n queue.length = 0;\n flushPostFlushCbs(seen);\n currentFlushPromise = null;\n if (queue.length || pendingPostFlushCbs.length) {\n flushJobs(seen);\n }\n }\n}\nfunction checkRecursiveUpdates(seen, fn) {\n const count = seen.get(fn) || 0;\n if (count > RECURSION_LIMIT) {\n const instance = fn.i;\n const componentName = instance && getComponentName(instance.type);\n handleError(\n `Maximum recursive updates exceeded${componentName ? ` in component <${componentName}>` : ``}. This means you have a reactive effect that is mutating its own dependencies and thus recursively triggering itself. Possible sources include component template, render function, updated hook or watcher source function.`,\n null,\n 10\n );\n return true;\n }\n seen.set(fn, count + 1);\n return false;\n}\n\nlet isHmrUpdating = false;\nconst hmrDirtyComponents = /* @__PURE__ */ new Map();\nif (!!(process.env.NODE_ENV !== \"production\")) {\n getGlobalThis().__VUE_HMR_RUNTIME__ = {\n createRecord: tryWrap(createRecord),\n rerender: tryWrap(rerender),\n reload: tryWrap(reload)\n };\n}\nconst map = /* @__PURE__ */ new Map();\nfunction registerHMR(instance) {\n const id = instance.type.__hmrId;\n let record = map.get(id);\n if (!record) {\n createRecord(id, instance.type);\n record = map.get(id);\n }\n record.instances.add(instance);\n}\nfunction unregisterHMR(instance) {\n map.get(instance.type.__hmrId).instances.delete(instance);\n}\nfunction createRecord(id, initialDef) {\n if (map.has(id)) {\n return false;\n }\n map.set(id, {\n initialDef: normalizeClassComponent(initialDef),\n instances: /* @__PURE__ */ new Set()\n });\n return true;\n}\nfunction normalizeClassComponent(component) {\n return isClassComponent(component) ? component.__vccOpts : component;\n}\nfunction rerender(id, newRender) {\n const record = map.get(id);\n if (!record) {\n return;\n }\n record.initialDef.render = newRender;\n [...record.instances].forEach((instance) => {\n if (newRender) {\n instance.render = newRender;\n normalizeClassComponent(instance.type).render = newRender;\n }\n instance.renderCache = [];\n isHmrUpdating = true;\n if (!(instance.job.flags & 8)) {\n instance.update();\n }\n isHmrUpdating = false;\n });\n}\nfunction reload(id, newComp) {\n const record = map.get(id);\n if (!record) return;\n newComp = normalizeClassComponent(newComp);\n updateComponentDef(record.initialDef, newComp);\n const instances = [...record.instances];\n for (let i = 0; i < instances.length; i++) {\n const instance = instances[i];\n const oldComp = normalizeClassComponent(instance.type);\n let dirtyInstances = hmrDirtyComponents.get(oldComp);\n if (!dirtyInstances) {\n if (oldComp !== record.initialDef) {\n updateComponentDef(oldComp, newComp);\n }\n hmrDirtyComponents.set(oldComp, dirtyInstances = /* @__PURE__ */ new Set());\n }\n dirtyInstances.add(instance);\n instance.appContext.propsCache.delete(instance.type);\n instance.appContext.emitsCache.delete(instance.type);\n instance.appContext.optionsCache.delete(instance.type);\n if (instance.ceReload) {\n dirtyInstances.add(instance);\n instance.ceReload(newComp.styles);\n dirtyInstances.delete(instance);\n } else if (instance.parent) {\n queueJob(() => {\n if (!(instance.job.flags & 8)) {\n isHmrUpdating = true;\n instance.parent.update();\n isHmrUpdating = false;\n dirtyInstances.delete(instance);\n }\n });\n } else if (instance.appContext.reload) {\n instance.appContext.reload();\n } else if (typeof window !== \"undefined\") {\n window.location.reload();\n } else {\n console.warn(\n \"[HMR] Root or manually mounted instance modified. Full reload required.\"\n );\n }\n if (instance.root.ce && instance !== instance.root) {\n instance.root.ce._removeChildStyle(oldComp);\n }\n }\n queuePostFlushCb(() => {\n hmrDirtyComponents.clear();\n });\n}\nfunction updateComponentDef(oldComp, newComp) {\n extend(oldComp, newComp);\n for (const key in oldComp) {\n if (key !== \"__file\" && !(key in newComp)) {\n delete oldComp[key];\n }\n }\n}\nfunction tryWrap(fn) {\n return (id, arg) => {\n try {\n return fn(id, arg);\n } catch (e) {\n console.error(e);\n console.warn(\n `[HMR] Something went wrong during Vue component hot-reload. Full reload required.`\n );\n }\n };\n}\n\nlet devtools$1;\nlet buffer = [];\nlet devtoolsNotInstalled = false;\nfunction emit$1(event, ...args) {\n if (devtools$1) {\n devtools$1.emit(event, ...args);\n } else if (!devtoolsNotInstalled) {\n buffer.push({ event, args });\n }\n}\nfunction setDevtoolsHook$1(hook, target) {\n var _a, _b;\n devtools$1 = hook;\n if (devtools$1) {\n devtools$1.enabled = true;\n buffer.forEach(({ event, args }) => devtools$1.emit(event, ...args));\n buffer = [];\n } else if (\n // handle late devtools injection - only do this if we are in an actual\n // browser environment to avoid the timer handle stalling test runner exit\n // (#4815)\n typeof window !== \"undefined\" && // some envs mock window but not fully\n window.HTMLElement && // also exclude jsdom\n // eslint-disable-next-line no-restricted-syntax\n !((_b = (_a = window.navigator) == null ? void 0 : _a.userAgent) == null ? void 0 : _b.includes(\"jsdom\"))\n ) {\n const replay = target.__VUE_DEVTOOLS_HOOK_REPLAY__ = target.__VUE_DEVTOOLS_HOOK_REPLAY__ || [];\n replay.push((newHook) => {\n setDevtoolsHook$1(newHook, target);\n });\n setTimeout(() => {\n if (!devtools$1) {\n target.__VUE_DEVTOOLS_HOOK_REPLAY__ = null;\n devtoolsNotInstalled = true;\n buffer = [];\n }\n }, 3e3);\n } else {\n devtoolsNotInstalled = true;\n buffer = [];\n }\n}\nfunction devtoolsInitApp(app, version) {\n emit$1(\"app:init\" /* APP_INIT */, app, version, {\n Fragment,\n Text,\n Comment,\n Static\n });\n}\nfunction devtoolsUnmountApp(app) {\n emit$1(\"app:unmount\" /* APP_UNMOUNT */, app);\n}\nconst devtoolsComponentAdded = /* @__PURE__ */ createDevtoolsComponentHook(\"component:added\" /* COMPONENT_ADDED */);\nconst devtoolsComponentUpdated = /* @__PURE__ */ createDevtoolsComponentHook(\"component:updated\" /* COMPONENT_UPDATED */);\nconst _devtoolsComponentRemoved = /* @__PURE__ */ createDevtoolsComponentHook(\n \"component:removed\" /* COMPONENT_REMOVED */\n);\nconst devtoolsComponentRemoved = (component) => {\n if (devtools$1 && typeof devtools$1.cleanupBuffer === \"function\" && // remove the component if it wasn't buffered\n !devtools$1.cleanupBuffer(component)) {\n _devtoolsComponentRemoved(component);\n }\n};\n// @__NO_SIDE_EFFECTS__\nfunction createDevtoolsComponentHook(hook) {\n return (component) => {\n emit$1(\n hook,\n component.appContext.app,\n component.uid,\n component.parent ? component.parent.uid : void 0,\n component\n );\n };\n}\nconst devtoolsPerfStart = /* @__PURE__ */ createDevtoolsPerformanceHook(\"perf:start\" /* PERFORMANCE_START */);\nconst devtoolsPerfEnd = /* @__PURE__ */ createDevtoolsPerformanceHook(\"perf:end\" /* PERFORMANCE_END */);\nfunction createDevtoolsPerformanceHook(hook) {\n return (component, type, time) => {\n emit$1(hook, component.appContext.app, component.uid, component, type, time);\n };\n}\nfunction devtoolsComponentEmit(component, event, params) {\n emit$1(\n \"component:emit\" /* COMPONENT_EMIT */,\n component.appContext.app,\n component,\n event,\n params\n );\n}\n\nlet currentRenderingInstance = null;\nlet currentScopeId = null;\nfunction setCurrentRenderingInstance(instance) {\n const prev = currentRenderingInstance;\n currentRenderingInstance = instance;\n currentScopeId = instance && instance.type.__scopeId || null;\n return prev;\n}\nfunction pushScopeId(id) {\n currentScopeId = id;\n}\nfunction popScopeId() {\n currentScopeId = null;\n}\nconst withScopeId = (_id) => withCtx;\nfunction withCtx(fn, ctx = currentRenderingInstance, isNonScopedSlot) {\n if (!ctx) return fn;\n if (fn._n) {\n return fn;\n }\n const renderFnWithContext = (...args) => {\n if (renderFnWithContext._d) {\n setBlockTracking(-1);\n }\n const prevInstance = setCurrentRenderingInstance(ctx);\n let res;\n try {\n res = fn(...args);\n } finally {\n setCurrentRenderingInstance(prevInstance);\n if (renderFnWithContext._d) {\n setBlockTracking(1);\n }\n }\n if (!!(process.env.NODE_ENV !== \"production\") || __VUE_PROD_DEVTOOLS__) {\n devtoolsComponentUpdated(ctx);\n }\n return res;\n };\n renderFnWithContext._n = true;\n renderFnWithContext._c = true;\n renderFnWithContext._d = true;\n return renderFnWithContext;\n}\n\nfunction validateDirectiveName(name) {\n if (isBuiltInDirective(name)) {\n warn$1(\"Do not use built-in directive ids as custom directive id: \" + name);\n }\n}\nfunction withDirectives(vnode, directives) {\n if (currentRenderingInstance === null) {\n !!(process.env.NODE_ENV !== \"production\") && warn$1(`withDirectives can only be used inside render functions.`);\n return vnode;\n }\n const instance = getComponentPublicInstance(currentRenderingInstance);\n const bindings = vnode.dirs || (vnode.dirs = []);\n for (let i = 0; i < directives.length; i++) {\n let [dir, value, arg, modifiers = EMPTY_OBJ] = directives[i];\n if (dir) {\n if (isFunction(dir)) {\n dir = {\n mounted: dir,\n updated: dir\n };\n }\n if (dir.deep) {\n traverse(value);\n }\n bindings.push({\n dir,\n instance,\n value,\n oldValue: void 0,\n arg,\n modifiers\n });\n }\n }\n return vnode;\n}\nfunction invokeDirectiveHook(vnode, prevVNode, instance, name) {\n const bindings = vnode.dirs;\n const oldBindings = prevVNode && prevVNode.dirs;\n for (let i = 0; i < bindings.length; i++) {\n const binding = bindings[i];\n if (oldBindings) {\n binding.oldValue = oldBindings[i].value;\n }\n let hook = binding.dir[name];\n if (hook) {\n pauseTracking();\n callWithAsyncErrorHandling(hook, instance, 8, [\n vnode.el,\n binding,\n vnode,\n prevVNode\n ]);\n resetTracking();\n }\n }\n}\n\nfunction provide(key, value) {\n if (!!(process.env.NODE_ENV !== \"production\")) {\n if (!currentInstance || currentInstance.isMounted) {\n warn$1(`provide() can only be used inside setup().`);\n }\n }\n if (currentInstance) {\n let provides = currentInstance.provides;\n const parentProvides = currentInstance.parent && currentInstance.parent.provides;\n if (parentProvides === provides) {\n provides = currentInstance.provides = Object.create(parentProvides);\n }\n provides[key] = value;\n }\n}\nfunction inject(key, defaultValue, treatDefaultAsFactory = false) {\n const instance = getCurrentInstance();\n if (instance || currentApp) {\n let provides = currentApp ? currentApp._context.provides : instance ? instance.parent == null || instance.ce ? instance.vnode.appContext && instance.vnode.appContext.provides : instance.parent.provides : void 0;\n if (provides && key in provides) {\n return provides[key];\n } else if (arguments.length > 1) {\n return treatDefaultAsFactory && isFunction(defaultValue) ? defaultValue.call(instance && instance.proxy) : defaultValue;\n } else if (!!(process.env.NODE_ENV !== \"production\")) {\n warn$1(`injection \"${String(key)}\" not found.`);\n }\n } else if (!!(process.env.NODE_ENV !== \"production\")) {\n warn$1(`inject() can only be used inside setup() or functional components.`);\n }\n}\nfunction hasInjectionContext() {\n return !!(getCurrentInstance() || currentApp);\n}\n\nconst ssrContextKey = /* @__PURE__ */ Symbol.for(\"v-scx\");\nconst useSSRContext = () => {\n {\n const ctx = inject(ssrContextKey);\n if (!ctx) {\n !!(process.env.NODE_ENV !== \"production\") && warn$1(\n `Server rendering context not provided. Make sure to only call useSSRContext() conditionally in the server build.`\n );\n }\n return ctx;\n }\n};\n\nfunction watchEffect(effect, options) {\n return doWatch(effect, null, options);\n}\nfunction watchPostEffect(effect, options) {\n return doWatch(\n effect,\n null,\n !!(process.env.NODE_ENV !== \"production\") ? extend({}, options, { flush: \"post\" }) : { flush: \"post\" }\n );\n}\nfunction watchSyncEffect(effect, options) {\n return doWatch(\n effect,\n null,\n !!(process.env.NODE_ENV !== \"production\") ? extend({}, options, { flush: \"sync\" }) : { flush: \"sync\" }\n );\n}\nfunction watch(source, cb, options) {\n if (!!(process.env.NODE_ENV !== \"production\") && !isFunction(cb)) {\n warn$1(\n `\\`watch(fn, options?)\\` signature has been moved to a separate API. Use \\`watchEffect(fn, options?)\\` instead. \\`watch\\` now only supports \\`watch(source, cb, options?) signature.`\n );\n }\n return doWatch(source, cb, options);\n}\nfunction doWatch(source, cb, options = EMPTY_OBJ) {\n const { immediate, deep, flush, once } = options;\n if (!!(process.env.NODE_ENV !== \"production\") && !cb) {\n if (immediate !== void 0) {\n warn$1(\n `watch() \"immediate\" option is only respected when using the watch(source, callback, options?) signature.`\n );\n }\n if (deep !== void 0) {\n warn$1(\n `watch() \"deep\" option is only respected when using the watch(source, callback, options?) signature.`\n );\n }\n if (once !== void 0) {\n warn$1(\n `watch() \"once\" option is only respected when using the watch(source, callback, options?) signature.`\n );\n }\n }\n const baseWatchOptions = extend({}, options);\n if (!!(process.env.NODE_ENV !== \"production\")) baseWatchOptions.onWarn = warn$1;\n const runsImmediately = cb && immediate || !cb && flush !== \"post\";\n let ssrCleanup;\n if (isInSSRComponentSetup) {\n if (flush === \"sync\") {\n const ctx = useSSRContext();\n ssrCleanup = ctx.__watcherHandles || (ctx.__watcherHandles = []);\n } else if (!runsImmediately) {\n const watchStopHandle = () => {\n };\n watchStopHandle.stop = NOOP;\n watchStopHandle.resume = NOOP;\n watchStopHandle.pause = NOOP;\n return watchStopHandle;\n }\n }\n const instance = currentInstance;\n baseWatchOptions.call = (fn, type, args) => callWithAsyncErrorHandling(fn, instance, type, args);\n let isPre = false;\n if (flush === \"post\") {\n baseWatchOptions.scheduler = (job) => {\n queuePostRenderEffect(job, instance && instance.suspense);\n };\n } else if (flush !== \"sync\") {\n isPre = true;\n baseWatchOptions.scheduler = (job, isFirstRun) => {\n if (isFirstRun) {\n job();\n } else {\n queueJob(job);\n }\n };\n }\n baseWatchOptions.augmentJob = (job) => {\n if (cb) {\n job.flags |= 4;\n }\n if (isPre) {\n job.flags |= 2;\n if (instance) {\n job.id = instance.uid;\n job.i = instance;\n }\n }\n };\n const watchHandle = watch$1(source, cb, baseWatchOptions);\n if (isInSSRComponentSetup) {\n if (ssrCleanup) {\n ssrCleanup.push(watchHandle);\n } else if (runsImmediately) {\n watchHandle();\n }\n }\n return watchHandle;\n}\nfunction instanceWatch(source, value, options) {\n const publicThis = this.proxy;\n const getter = isString(source) ? source.includes(\".\") ? createPathGetter(publicThis, source) : () => publicThis[source] : source.bind(publicThis, publicThis);\n let cb;\n if (isFunction(value)) {\n cb = value;\n } else {\n cb = value.handler;\n options = value;\n }\n const reset = setCurrentInstance(this);\n const res = doWatch(getter, cb.bind(publicThis), options);\n reset();\n return res;\n}\nfunction createPathGetter(ctx, path) {\n const segments = path.split(\".\");\n return () => {\n let cur = ctx;\n for (let i = 0; i < segments.length && cur; i++) {\n cur = cur[segments[i]];\n }\n return cur;\n };\n}\n\nconst TeleportEndKey = /* @__PURE__ */ Symbol(\"_vte\");\nconst isTeleport = (type) => type.__isTeleport;\nconst isTeleportDisabled = (props) => props && (props.disabled || props.disabled === \"\");\nconst isTeleportDeferred = (props) => props && (props.defer || props.defer === \"\");\nconst isTargetSVG = (target) => typeof SVGElement !== \"undefined\" && target instanceof SVGElement;\nconst isTargetMathML = (target) => typeof MathMLElement === \"function\" && target instanceof MathMLElement;\nconst resolveTarget = (props, select) => {\n const targetSelector = props && props.to;\n if (isString(targetSelector)) {\n if (!select) {\n !!(process.env.NODE_ENV !== \"production\") && warn$1(\n `Current renderer does not support string target for Teleports. (missing querySelector renderer option)`\n );\n return null;\n } else {\n const target = select(targetSelector);\n if (!!(process.env.NODE_ENV !== \"production\") && !target && !isTeleportDisabled(props)) {\n warn$1(\n `Failed to locate Teleport target with selector \"${targetSelector}\". Note the target element must exist before the component is mounted - i.e. the target cannot be rendered by the component itself, and ideally should be outside of the entire Vue component tree.`\n );\n }\n return target;\n }\n } else {\n if (!!(process.env.NODE_ENV !== \"production\") && !targetSelector && !isTeleportDisabled(props)) {\n warn$1(`Invalid Teleport target: ${targetSelector}`);\n }\n return targetSelector;\n }\n};\nconst TeleportImpl = {\n name: \"Teleport\",\n __isTeleport: true,\n process(n1, n2, container, anchor, parentComponent, parentSuspense, namespace, slotScopeIds, optimized, internals) {\n const {\n mc: mountChildren,\n pc: patchChildren,\n pbc: patchBlockChildren,\n o: { insert, querySelector, createText, createComment }\n } = internals;\n const disabled = isTeleportDisabled(n2.props);\n let { shapeFlag, children, dynamicChildren } = n2;\n if (!!(process.env.NODE_ENV !== \"production\") && isHmrUpdating) {\n optimized = false;\n dynamicChildren = null;\n }\n if (n1 == null) {\n const placeholder = n2.el = !!(process.env.NODE_ENV !== \"production\") ? createComment(\"teleport start\") : createText(\"\");\n const mainAnchor = n2.anchor = !!(process.env.NODE_ENV !== \"production\") ? createComment(\"teleport end\") : createText(\"\");\n insert(placeholder, container, anchor);\n insert(mainAnchor, container, anchor);\n const mount = (container2, anchor2) => {\n if (shapeFlag & 16) {\n mountChildren(\n children,\n container2,\n anchor2,\n parentComponent,\n parentSuspense,\n namespace,\n slotScopeIds,\n optimized\n );\n }\n };\n const mountToTarget = () => {\n const target = n2.target = resolveTarget(n2.props, querySelector);\n const targetAnchor = prepareAnchor(target, n2, createText, insert);\n if (target) {\n if (namespace !== \"svg\" && isTargetSVG(target)) {\n namespace = \"svg\";\n } else if (namespace !== \"mathml\" && isTargetMathML(target)) {\n namespace = \"mathml\";\n }\n if (parentComponent && parentComponent.isCE) {\n (parentComponent.ce._teleportTargets || (parentComponent.ce._teleportTargets = /* @__PURE__ */ new Set())).add(target);\n }\n if (!disabled) {\n mount(target, targetAnchor);\n updateCssVars(n2, false);\n }\n } else if (!!(process.env.NODE_ENV !== \"production\") && !disabled) {\n warn$1(\n \"Invalid Teleport target on mount:\",\n target,\n `(${typeof target})`\n );\n }\n };\n if (disabled) {\n mount(container, mainAnchor);\n updateCssVars(n2, true);\n }\n if (isTeleportDeferred(n2.props)) {\n n2.el.__isMounted = false;\n queuePostRenderEffect(() => {\n mountToTarget();\n delete n2.el.__isMounted;\n }, parentSuspense);\n } else {\n mountToTarget();\n }\n } else {\n if (isTeleportDeferred(n2.props) && n1.el.__isMounted === false) {\n queuePostRenderEffect(() => {\n TeleportImpl.process(\n n1,\n n2,\n container,\n anchor,\n parentComponent,\n parentSuspense,\n namespace,\n slotScopeIds,\n optimized,\n internals\n );\n }, parentSuspense);\n return;\n }\n n2.el = n1.el;\n n2.targetStart = n1.targetStart;\n const mainAnchor = n2.anchor = n1.anchor;\n const target = n2.target = n1.target;\n const targetAnchor = n2.targetAnchor = n1.targetAnchor;\n const wasDisabled = isTeleportDisabled(n1.props);\n const currentContainer = wasDisabled ? container : target;\n const currentAnchor = wasDisabled ? mainAnchor : targetAnchor;\n if (namespace === \"svg\" || isTargetSVG(target)) {\n namespace = \"svg\";\n } else if (namespace === \"mathml\" || isTargetMathML(target)) {\n namespace = \"mathml\";\n }\n if (dynamicChildren) {\n patchBlockChildren(\n n1.dynamicChildren,\n dynamicChildren,\n currentContainer,\n parentComponent,\n parentSuspense,\n namespace,\n slotScopeIds\n );\n traverseStaticChildren(n1, n2, !!!(process.env.NODE_ENV !== \"production\"));\n } else if (!optimized) {\n patchChildren(\n n1,\n n2,\n currentContainer,\n currentAnchor,\n parentComponent,\n parentSuspense,\n namespace,\n slotScopeIds,\n false\n );\n }\n if (disabled) {\n if (!wasDisabled) {\n moveTeleport(\n n2,\n container,\n mainAnchor,\n internals,\n 1\n );\n } else {\n if (n2.props && n1.props && n2.props.to !== n1.props.to) {\n n2.props.to = n1.props.to;\n }\n }\n } else {\n if ((n2.props && n2.props.to) !== (n1.props && n1.props.to)) {\n const nextTarget = n2.target = resolveTarget(\n n2.props,\n querySelector\n );\n if (nextTarget) {\n moveTeleport(\n n2,\n nextTarget,\n null,\n internals,\n 0\n );\n } else if (!!(process.env.NODE_ENV !== \"production\")) {\n warn$1(\n \"Invalid Teleport target on update:\",\n target,\n `(${typeof target})`\n );\n }\n } else if (wasDisabled) {\n moveTeleport(\n n2,\n target,\n targetAnchor,\n internals,\n 1\n );\n }\n }\n updateCssVars(n2, disabled);\n }\n },\n remove(vnode, parentComponent, parentSuspense, { um: unmount, o: { remove: hostRemove } }, doRemove) {\n const {\n shapeFlag,\n children,\n anchor,\n targetStart,\n targetAnchor,\n target,\n props\n } = vnode;\n if (target) {\n hostRemove(targetStart);\n hostRemove(targetAnchor);\n }\n doRemove && hostRemove(anchor);\n if (shapeFlag & 16) {\n const shouldRemove = doRemove || !isTeleportDisabled(props);\n for (let i = 0; i < children.length; i++) {\n const child = children[i];\n unmount(\n child,\n parentComponent,\n parentSuspense,\n shouldRemove,\n !!child.dynamicChildren\n );\n }\n }\n },\n move: moveTeleport,\n hydrate: hydrateTeleport\n};\nfunction moveTeleport(vnode, container, parentAnchor, { o: { insert }, m: move }, moveType = 2) {\n if (moveType === 0) {\n insert(vnode.targetAnchor, container, parentAnchor);\n }\n const { el, anchor, shapeFlag, children, props } = vnode;\n const isReorder = moveType === 2;\n if (isReorder) {\n insert(el, container, parentAnchor);\n }\n if (!isReorder || isTeleportDisabled(props)) {\n if (shapeFlag & 16) {\n for (let i = 0; i < children.length; i++) {\n move(\n children[i],\n container,\n parentAnchor,\n 2\n );\n }\n }\n }\n if (isReorder) {\n insert(anchor, container, parentAnchor);\n }\n}\nfunction hydrateTeleport(node, vnode, parentComponent, parentSuspense, slotScopeIds, optimized, {\n o: { nextSibling, parentNode, querySelector, insert, createText }\n}, hydrateChildren) {\n function hydrateDisabledTeleport(node2, vnode2, targetStart, targetAnchor) {\n vnode2.anchor = hydrateChildren(\n nextSibling(node2),\n vnode2,\n parentNode(node2),\n parentComponent,\n parentSuspense,\n slotScopeIds,\n optimized\n );\n vnode2.targetStart = targetStart;\n vnode2.targetAnchor = targetAnchor;\n }\n const target = vnode.target = resolveTarget(\n vnode.props,\n querySelector\n );\n const disabled = isTeleportDisabled(vnode.props);\n if (target) {\n const targetNode = target._lpa || target.firstChild;\n if (vnode.shapeFlag & 16) {\n if (disabled) {\n hydrateDisabledTeleport(\n node,\n vnode,\n targetNode,\n targetNode && nextSibling(targetNode)\n );\n } else {\n vnode.anchor = nextSibling(node);\n let targetAnchor = targetNode;\n while (targetAnchor) {\n if (targetAnchor && targetAnchor.nodeType === 8) {\n if (targetAnchor.data === \"teleport start anchor\") {\n vnode.targetStart = targetAnchor;\n } else if (targetAnchor.data === \"teleport anchor\") {\n vnode.targetAnchor = targetAnchor;\n target._lpa = vnode.targetAnchor && nextSibling(vnode.targetAnchor);\n break;\n }\n }\n targetAnchor = nextSibling(targetAnchor);\n }\n if (!vnode.targetAnchor) {\n prepareAnchor(target, vnode, createText, insert);\n }\n hydrateChildren(\n targetNode && nextSibling(targetNode),\n vnode,\n target,\n parentComponent,\n parentSuspense,\n slotScopeIds,\n optimized\n );\n }\n }\n updateCssVars(vnode, disabled);\n } else if (disabled) {\n if (vnode.shapeFlag & 16) {\n hydrateDisabledTeleport(node, vnode, node, nextSibling(node));\n }\n }\n return vnode.anchor && nextSibling(vnode.anchor);\n}\nconst Teleport = TeleportImpl;\nfunction updateCssVars(vnode, isDisabled) {\n const ctx = vnode.ctx;\n if (ctx && ctx.ut) {\n let node, anchor;\n if (isDisabled) {\n node = vnode.el;\n anchor = vnode.anchor;\n } else {\n node = vnode.targetStart;\n anchor = vnode.targetAnchor;\n }\n while (node && node !== anchor) {\n if (node.nodeType === 1) node.setAttribute(\"data-v-owner\", ctx.uid);\n node = node.nextSibling;\n }\n ctx.ut();\n }\n}\nfunction prepareAnchor(target, vnode, createText, insert) {\n const targetStart = vnode.targetStart = createText(\"\");\n const targetAnchor = vnode.targetAnchor = createText(\"\");\n targetStart[TeleportEndKey] = targetAnchor;\n if (target) {\n insert(targetStart, target);\n insert(targetAnchor, target);\n }\n return targetAnchor;\n}\n\nconst leaveCbKey = /* @__PURE__ */ Symbol(\"_leaveCb\");\nconst enterCbKey = /* @__PURE__ */ Symbol(\"_enterCb\");\nfunction useTransitionState() {\n const state = {\n isMounted: false,\n isLeaving: false,\n isUnmounting: false,\n leavingVNodes: /* @__PURE__ */ new Map()\n };\n onMounted(() => {\n state.isMounted = true;\n });\n onBeforeUnmount(() => {\n state.isUnmounting = true;\n });\n return state;\n}\nconst TransitionHookValidator = [Function, Array];\nconst BaseTransitionPropsValidators = {\n mode: String,\n appear: Boolean,\n persisted: Boolean,\n // enter\n onBeforeEnter: TransitionHookValidator,\n onEnter: TransitionHookValidator,\n onAfterEnter: TransitionHookValidator,\n onEnterCancelled: TransitionHookValidator,\n // leave\n onBeforeLeave: TransitionHookValidator,\n onLeave: TransitionHookValidator,\n onAfterLeave: TransitionHookValidator,\n onLeaveCancelled: TransitionHookValidator,\n // appear\n onBeforeAppear: TransitionHookValidator,\n onAppear: TransitionHookValidator,\n onAfterAppear: TransitionHookValidator,\n onAppearCancelled: TransitionHookValidator\n};\nconst recursiveGetSubtree = (instance) => {\n const subTree = instance.subTree;\n return subTree.component ? recursiveGetSubtree(subTree.component) : subTree;\n};\nconst BaseTransitionImpl = {\n name: `BaseTransition`,\n props: BaseTransitionPropsValidators,\n setup(props, { slots }) {\n const instance = getCurrentInstance();\n const state = useTransitionState();\n return () => {\n const children = slots.default && getTransitionRawChildren(slots.default(), true);\n if (!children || !children.length) {\n return;\n }\n const child = findNonCommentChild(children);\n const rawProps = toRaw(props);\n const { mode } = rawProps;\n if (!!(process.env.NODE_ENV !== \"production\") && mode && mode !== \"in-out\" && mode !== \"out-in\" && mode !== \"default\") {\n warn$1(`invalid mode: ${mode}`);\n }\n if (state.isLeaving) {\n return emptyPlaceholder(child);\n }\n const innerChild = getInnerChild$1(child);\n if (!innerChild) {\n return emptyPlaceholder(child);\n }\n let enterHooks = resolveTransitionHooks(\n innerChild,\n rawProps,\n state,\n instance,\n // #11061, ensure enterHooks is fresh after clone\n (hooks) => enterHooks = hooks\n );\n if (innerChild.type !== Comment) {\n setTransitionHooks(innerChild, enterHooks);\n }\n let oldInnerChild = instance.subTree && getInnerChild$1(instance.subTree);\n if (oldInnerChild && oldInnerChild.type !== Comment && !isSameVNodeType(oldInnerChild, innerChild) && recursiveGetSubtree(instance).type !== Comment) {\n let leavingHooks = resolveTransitionHooks(\n oldInnerChild,\n rawProps,\n state,\n instance\n );\n setTransitionHooks(oldInnerChild, leavingHooks);\n if (mode === \"out-in\" && innerChild.type !== Comment) {\n state.isLeaving = true;\n leavingHooks.afterLeave = () => {\n state.isLeaving = false;\n if (!(instance.job.flags & 8)) {\n instance.update();\n }\n delete leavingHooks.afterLeave;\n oldInnerChild = void 0;\n };\n return emptyPlaceholder(child);\n } else if (mode === \"in-out\" && innerChild.type !== Comment) {\n leavingHooks.delayLeave = (el, earlyRemove, delayedLeave) => {\n const leavingVNodesCache = getLeavingNodesForType(\n state,\n oldInnerChild\n );\n leavingVNodesCache[String(oldInnerChild.key)] = oldInnerChild;\n el[leaveCbKey] = () => {\n earlyRemove();\n el[leaveCbKey] = void 0;\n delete enterHooks.delayedLeave;\n oldInnerChild = void 0;\n };\n enterHooks.delayedLeave = () => {\n delayedLeave();\n delete enterHooks.delayedLeave;\n oldInnerChild = void 0;\n };\n };\n } else {\n oldInnerChild = void 0;\n }\n } else if (oldInnerChild) {\n oldInnerChild = void 0;\n }\n return child;\n };\n }\n};\nfunction findNonCommentChild(children) {\n let child = children[0];\n if (children.length > 1) {\n let hasFound = false;\n for (const c of children) {\n if (c.type !== Comment) {\n if (!!(process.env.NODE_ENV !== \"production\") && hasFound) {\n warn$1(\n \" can only be used on a single element or component. Use for lists.\"\n );\n break;\n }\n child = c;\n hasFound = true;\n if (!!!(process.env.NODE_ENV !== \"production\")) break;\n }\n }\n }\n return child;\n}\nconst BaseTransition = BaseTransitionImpl;\nfunction getLeavingNodesForType(state, vnode) {\n const { leavingVNodes } = state;\n let leavingVNodesCache = leavingVNodes.get(vnode.type);\n if (!leavingVNodesCache) {\n leavingVNodesCache = /* @__PURE__ */ Object.create(null);\n leavingVNodes.set(vnode.type, leavingVNodesCache);\n }\n return leavingVNodesCache;\n}\nfunction resolveTransitionHooks(vnode, props, state, instance, postClone) {\n const {\n appear,\n mode,\n persisted = false,\n onBeforeEnter,\n onEnter,\n onAfterEnter,\n onEnterCancelled,\n onBeforeLeave,\n onLeave,\n onAfterLeave,\n onLeaveCancelled,\n onBeforeAppear,\n onAppear,\n onAfterAppear,\n onAppearCancelled\n } = props;\n const key = String(vnode.key);\n const leavingVNodesCache = getLeavingNodesForType(state, vnode);\n const callHook = (hook, args) => {\n hook && callWithAsyncErrorHandling(\n hook,\n instance,\n 9,\n args\n );\n };\n const callAsyncHook = (hook, args) => {\n const done = args[1];\n callHook(hook, args);\n if (isArray(hook)) {\n if (hook.every((hook2) => hook2.length <= 1)) done();\n } else if (hook.length <= 1) {\n done();\n }\n };\n const hooks = {\n mode,\n persisted,\n beforeEnter(el) {\n let hook = onBeforeEnter;\n if (!state.isMounted) {\n if (appear) {\n hook = onBeforeAppear || onBeforeEnter;\n } else {\n return;\n }\n }\n if (el[leaveCbKey]) {\n el[leaveCbKey](\n true\n /* cancelled */\n );\n }\n const leavingVNode = leavingVNodesCache[key];\n if (leavingVNode && isSameVNodeType(vnode, leavingVNode) && leavingVNode.el[leaveCbKey]) {\n leavingVNode.el[leaveCbKey]();\n }\n callHook(hook, [el]);\n },\n enter(el) {\n let hook = onEnter;\n let afterHook = onAfterEnter;\n let cancelHook = onEnterCancelled;\n if (!state.isMounted) {\n if (appear) {\n hook = onAppear || onEnter;\n afterHook = onAfterAppear || onAfterEnter;\n cancelHook = onAppearCancelled || onEnterCancelled;\n } else {\n return;\n }\n }\n let called = false;\n const done = el[enterCbKey] = (cancelled) => {\n if (called) return;\n called = true;\n if (cancelled) {\n callHook(cancelHook, [el]);\n } else {\n callHook(afterHook, [el]);\n }\n if (hooks.delayedLeave) {\n hooks.delayedLeave();\n }\n el[enterCbKey] = void 0;\n };\n if (hook) {\n callAsyncHook(hook, [el, done]);\n } else {\n done();\n }\n },\n leave(el, remove) {\n const key2 = String(vnode.key);\n if (el[enterCbKey]) {\n el[enterCbKey](\n true\n /* cancelled */\n );\n }\n if (state.isUnmounting) {\n return remove();\n }\n callHook(onBeforeLeave, [el]);\n let called = false;\n const done = el[leaveCbKey] = (cancelled) => {\n if (called) return;\n called = true;\n remove();\n if (cancelled) {\n callHook(onLeaveCancelled, [el]);\n } else {\n callHook(onAfterLeave, [el]);\n }\n el[leaveCbKey] = void 0;\n if (leavingVNodesCache[key2] === vnode) {\n delete leavingVNodesCache[key2];\n }\n };\n leavingVNodesCache[key2] = vnode;\n if (onLeave) {\n callAsyncHook(onLeave, [el, done]);\n } else {\n done();\n }\n },\n clone(vnode2) {\n const hooks2 = resolveTransitionHooks(\n vnode2,\n props,\n state,\n instance,\n postClone\n );\n if (postClone) postClone(hooks2);\n return hooks2;\n }\n };\n return hooks;\n}\nfunction emptyPlaceholder(vnode) {\n if (isKeepAlive(vnode)) {\n vnode = cloneVNode(vnode);\n vnode.children = null;\n return vnode;\n }\n}\nfunction getInnerChild$1(vnode) {\n if (!isKeepAlive(vnode)) {\n if (isTeleport(vnode.type) && vnode.children) {\n return findNonCommentChild(vnode.children);\n }\n return vnode;\n }\n if (vnode.component) {\n return vnode.component.subTree;\n }\n const { shapeFlag, children } = vnode;\n if (children) {\n if (shapeFlag & 16) {\n return children[0];\n }\n if (shapeFlag & 32 && isFunction(children.default)) {\n return children.default();\n }\n }\n}\nfunction setTransitionHooks(vnode, hooks) {\n if (vnode.shapeFlag & 6 && vnode.component) {\n vnode.transition = hooks;\n setTransitionHooks(vnode.component.subTree, hooks);\n } else if (vnode.shapeFlag & 128) {\n vnode.ssContent.transition = hooks.clone(vnode.ssContent);\n vnode.ssFallback.transition = hooks.clone(vnode.ssFallback);\n } else {\n vnode.transition = hooks;\n }\n}\nfunction getTransitionRawChildren(children, keepComment = false, parentKey) {\n let ret = [];\n let keyedFragmentCount = 0;\n for (let i = 0; i < children.length; i++) {\n let child = children[i];\n const key = parentKey == null ? child.key : String(parentKey) + String(child.key != null ? child.key : i);\n if (child.type === Fragment) {\n if (child.patchFlag & 128) keyedFragmentCount++;\n ret = ret.concat(\n getTransitionRawChildren(child.children, keepComment, key)\n );\n } else if (keepComment || child.type !== Comment) {\n ret.push(key != null ? cloneVNode(child, { key }) : child);\n }\n }\n if (keyedFragmentCount > 1) {\n for (let i = 0; i < ret.length; i++) {\n ret[i].patchFlag = -2;\n }\n }\n return ret;\n}\n\n// @__NO_SIDE_EFFECTS__\nfunction defineComponent(options, extraOptions) {\n return isFunction(options) ? (\n // #8236: extend call and options.name access are considered side-effects\n // by Rollup, so we have to wrap it in a pure-annotated IIFE.\n /* @__PURE__ */ (() => extend({ name: options.name }, extraOptions, { setup: options }))()\n ) : options;\n}\n\nfunction useId() {\n const i = getCurrentInstance();\n if (i) {\n return (i.appContext.config.idPrefix || \"v\") + \"-\" + i.ids[0] + i.ids[1]++;\n } else if (!!(process.env.NODE_ENV !== \"production\")) {\n warn$1(\n `useId() is called when there is no active component instance to be associated with.`\n );\n }\n return \"\";\n}\nfunction markAsyncBoundary(instance) {\n instance.ids = [instance.ids[0] + instance.ids[2]++ + \"-\", 0, 0];\n}\n\nconst knownTemplateRefs = /* @__PURE__ */ new WeakSet();\nfunction useTemplateRef(key) {\n const i = getCurrentInstance();\n const r = shallowRef(null);\n if (i) {\n const refs = i.refs === EMPTY_OBJ ? i.refs = {} : i.refs;\n let desc;\n if (!!(process.env.NODE_ENV !== \"production\") && (desc = Object.getOwnPropertyDescriptor(refs, key)) && !desc.configurable) {\n warn$1(`useTemplateRef('${key}') already exists.`);\n } else {\n Object.defineProperty(refs, key, {\n enumerable: true,\n get: () => r.value,\n set: (val) => r.value = val\n });\n }\n } else if (!!(process.env.NODE_ENV !== \"production\")) {\n warn$1(\n `useTemplateRef() is called when there is no active component instance to be associated with.`\n );\n }\n const ret = !!(process.env.NODE_ENV !== \"production\") ? readonly(r) : r;\n if (!!(process.env.NODE_ENV !== \"production\")) {\n knownTemplateRefs.add(ret);\n }\n return ret;\n}\n\nconst pendingSetRefMap = /* @__PURE__ */ new WeakMap();\nfunction setRef(rawRef, oldRawRef, parentSuspense, vnode, isUnmount = false) {\n if (isArray(rawRef)) {\n rawRef.forEach(\n (r, i) => setRef(\n r,\n oldRawRef && (isArray(oldRawRef) ? oldRawRef[i] : oldRawRef),\n parentSuspense,\n vnode,\n isUnmount\n )\n );\n return;\n }\n if (isAsyncWrapper(vnode) && !isUnmount) {\n if (vnode.shapeFlag & 512 && vnode.type.__asyncResolved && vnode.component.subTree.component) {\n setRef(rawRef, oldRawRef, parentSuspense, vnode.component.subTree);\n }\n return;\n }\n const refValue = vnode.shapeFlag & 4 ? getComponentPublicInstance(vnode.component) : vnode.el;\n const value = isUnmount ? null : refValue;\n const { i: owner, r: ref } = rawRef;\n if (!!(process.env.NODE_ENV !== \"production\") && !owner) {\n warn$1(\n `Missing ref owner context. ref cannot be used on hoisted vnodes. A vnode with ref must be created inside the render function.`\n );\n return;\n }\n const oldRef = oldRawRef && oldRawRef.r;\n const refs = owner.refs === EMPTY_OBJ ? owner.refs = {} : owner.refs;\n const setupState = owner.setupState;\n const rawSetupState = toRaw(setupState);\n const canSetSetupRef = setupState === EMPTY_OBJ ? NO : (key) => {\n if (!!(process.env.NODE_ENV !== \"production\")) {\n if (hasOwn(rawSetupState, key) && !isRef(rawSetupState[key])) {\n warn$1(\n `Template ref \"${key}\" used on a non-ref value. It will not work in the production build.`\n );\n }\n if (knownTemplateRefs.has(rawSetupState[key])) {\n return false;\n }\n }\n return hasOwn(rawSetupState, key);\n };\n const canSetRef = (ref2) => {\n return !!!(process.env.NODE_ENV !== \"production\") || !knownTemplateRefs.has(ref2);\n };\n if (oldRef != null && oldRef !== ref) {\n invalidatePendingSetRef(oldRawRef);\n if (isString(oldRef)) {\n refs[oldRef] = null;\n if (canSetSetupRef(oldRef)) {\n setupState[oldRef] = null;\n }\n } else if (isRef(oldRef)) {\n if (canSetRef(oldRef)) {\n oldRef.value = null;\n }\n const oldRawRefAtom = oldRawRef;\n if (oldRawRefAtom.k) refs[oldRawRefAtom.k] = null;\n }\n }\n if (isFunction(ref)) {\n callWithErrorHandling(ref, owner, 12, [value, refs]);\n } else {\n const _isString = isString(ref);\n const _isRef = isRef(ref);\n if (_isString || _isRef) {\n const doSet = () => {\n if (rawRef.f) {\n const existing = _isString ? canSetSetupRef(ref) ? setupState[ref] : refs[ref] : canSetRef(ref) || !rawRef.k ? ref.value : refs[rawRef.k];\n if (isUnmount) {\n isArray(existing) && remove(existing, refValue);\n } else {\n if (!isArray(existing)) {\n if (_isString) {\n refs[ref] = [refValue];\n if (canSetSetupRef(ref)) {\n setupState[ref] = refs[ref];\n }\n } else {\n const newVal = [refValue];\n if (canSetRef(ref)) {\n ref.value = newVal;\n }\n if (rawRef.k) refs[rawRef.k] = newVal;\n }\n } else if (!existing.includes(refValue)) {\n existing.push(refValue);\n }\n }\n } else if (_isString) {\n refs[ref] = value;\n if (canSetSetupRef(ref)) {\n setupState[ref] = value;\n }\n } else if (_isRef) {\n if (canSetRef(ref)) {\n ref.value = value;\n }\n if (rawRef.k) refs[rawRef.k] = value;\n } else if (!!(process.env.NODE_ENV !== \"production\")) {\n warn$1(\"Invalid template ref type:\", ref, `(${typeof ref})`);\n }\n };\n if (value) {\n const job = () => {\n doSet();\n pendingSetRefMap.delete(rawRef);\n };\n job.id = -1;\n pendingSetRefMap.set(rawRef, job);\n queuePostRenderEffect(job, parentSuspense);\n } else {\n invalidatePendingSetRef(rawRef);\n doSet();\n }\n } else if (!!(process.env.NODE_ENV !== \"production\")) {\n warn$1(\"Invalid template ref type:\", ref, `(${typeof ref})`);\n }\n }\n}\nfunction invalidatePendingSetRef(rawRef) {\n const pendingSetRef = pendingSetRefMap.get(rawRef);\n if (pendingSetRef) {\n pendingSetRef.flags |= 8;\n pendingSetRefMap.delete(rawRef);\n }\n}\n\nlet hasLoggedMismatchError = false;\nconst logMismatchError = () => {\n if (hasLoggedMismatchError) {\n return;\n }\n console.error(\"Hydration completed but contains mismatches.\");\n hasLoggedMismatchError = true;\n};\nconst isSVGContainer = (container) => container.namespaceURI.includes(\"svg\") && container.tagName !== \"foreignObject\";\nconst isMathMLContainer = (container) => container.namespaceURI.includes(\"MathML\");\nconst getContainerType = (container) => {\n if (container.nodeType !== 1) return void 0;\n if (isSVGContainer(container)) return \"svg\";\n if (isMathMLContainer(container)) return \"mathml\";\n return void 0;\n};\nconst isComment = (node) => node.nodeType === 8;\nfunction createHydrationFunctions(rendererInternals) {\n const {\n mt: mountComponent,\n p: patch,\n o: {\n patchProp,\n createText,\n nextSibling,\n parentNode,\n remove,\n insert,\n createComment\n }\n } = rendererInternals;\n const hydrate = (vnode, container) => {\n if (!container.hasChildNodes()) {\n (!!(process.env.NODE_ENV !== \"production\") || __VUE_PROD_HYDRATION_MISMATCH_DETAILS__) && warn$1(\n `Attempting to hydrate existing markup but container is empty. Performing full mount instead.`\n );\n patch(null, vnode, container);\n flushPostFlushCbs();\n container._vnode = vnode;\n return;\n }\n hydrateNode(container.firstChild, vnode, null, null, null);\n flushPostFlushCbs();\n container._vnode = vnode;\n };\n const hydrateNode = (node, vnode, parentComponent, parentSuspense, slotScopeIds, optimized = false) => {\n optimized = optimized || !!vnode.dynamicChildren;\n const isFragmentStart = isComment(node) && node.data === \"[\";\n const onMismatch = () => handleMismatch(\n node,\n vnode,\n parentComponent,\n parentSuspense,\n slotScopeIds,\n isFragmentStart\n );\n const { type, ref, shapeFlag, patchFlag } = vnode;\n let domType = node.nodeType;\n vnode.el = node;\n if (!!(process.env.NODE_ENV !== \"production\") || __VUE_PROD_DEVTOOLS__) {\n def(node, \"__vnode\", vnode, true);\n def(node, \"__vueParentComponent\", parentComponent, true);\n }\n if (patchFlag === -2) {\n optimized = false;\n vnode.dynamicChildren = null;\n }\n let nextNode = null;\n switch (type) {\n case Text:\n if (domType !== 3) {\n if (vnode.children === \"\") {\n insert(vnode.el = createText(\"\"), parentNode(node), node);\n nextNode = node;\n } else {\n nextNode = onMismatch();\n }\n } else {\n if (node.data !== vnode.children) {\n (!!(process.env.NODE_ENV !== \"production\") || __VUE_PROD_HYDRATION_MISMATCH_DETAILS__) && warn$1(\n `Hydration text mismatch in`,\n node.parentNode,\n `\n - rendered on server: ${JSON.stringify(\n node.data\n )}\n - expected on client: ${JSON.stringify(vnode.children)}`\n );\n logMismatchError();\n node.data = vnode.children;\n }\n nextNode = nextSibling(node);\n }\n break;\n case Comment:\n if (isTemplateNode(node)) {\n nextNode = nextSibling(node);\n replaceNode(\n vnode.el = node.content.firstChild,\n node,\n parentComponent\n );\n } else if (domType !== 8 || isFragmentStart) {\n nextNode = onMismatch();\n } else {\n nextNode = nextSibling(node);\n }\n break;\n case Static:\n if (isFragmentStart) {\n node = nextSibling(node);\n domType = node.nodeType;\n }\n if (domType === 1 || domType === 3) {\n nextNode = node;\n const needToAdoptContent = !vnode.children.length;\n for (let i = 0; i < vnode.staticCount; i++) {\n if (needToAdoptContent)\n vnode.children += nextNode.nodeType === 1 ? nextNode.outerHTML : nextNode.data;\n if (i === vnode.staticCount - 1) {\n vnode.anchor = nextNode;\n }\n nextNode = nextSibling(nextNode);\n }\n return isFragmentStart ? nextSibling(nextNode) : nextNode;\n } else {\n onMismatch();\n }\n break;\n case Fragment:\n if (!isFragmentStart) {\n nextNode = onMismatch();\n } else {\n nextNode = hydrateFragment(\n node,\n vnode,\n parentComponent,\n parentSuspense,\n slotScopeIds,\n optimized\n );\n }\n break;\n default:\n if (shapeFlag & 1) {\n if ((domType !== 1 || vnode.type.toLowerCase() !== node.tagName.toLowerCase()) && !isTemplateNode(node)) {\n nextNode = onMismatch();\n } else {\n nextNode = hydrateElement(\n node,\n vnode,\n parentComponent,\n parentSuspense,\n slotScopeIds,\n optimized\n );\n }\n } else if (shapeFlag & 6) {\n vnode.slotScopeIds = slotScopeIds;\n const container = parentNode(node);\n if (isFragmentStart) {\n nextNode = locateClosingAnchor(node);\n } else if (isComment(node) && node.data === \"teleport start\") {\n nextNode = locateClosingAnchor(node, node.data, \"teleport end\");\n } else {\n nextNode = nextSibling(node);\n }\n mountComponent(\n vnode,\n container,\n null,\n parentComponent,\n parentSuspense,\n getContainerType(container),\n optimized\n );\n if (isAsyncWrapper(vnode) && !vnode.type.__asyncResolved) {\n let subTree;\n if (isFragmentStart) {\n subTree = createVNode(Fragment);\n subTree.anchor = nextNode ? nextNode.previousSibling : container.lastChild;\n } else {\n subTree = node.nodeType === 3 ? createTextVNode(\"\") : createVNode(\"div\");\n }\n subTree.el = node;\n vnode.component.subTree = subTree;\n }\n } else if (shapeFlag & 64) {\n if (domType !== 8) {\n nextNode = onMismatch();\n } else {\n nextNode = vnode.type.hydrate(\n node,\n vnode,\n parentComponent,\n parentSuspense,\n slotScopeIds,\n optimized,\n rendererInternals,\n hydrateChildren\n );\n }\n } else if (shapeFlag & 128) {\n nextNode = vnode.type.hydrate(\n node,\n vnode,\n parentComponent,\n parentSuspense,\n getContainerType(parentNode(node)),\n slotScopeIds,\n optimized,\n rendererInternals,\n hydrateNode\n );\n } else if (!!(process.env.NODE_ENV !== \"production\") || __VUE_PROD_HYDRATION_MISMATCH_DETAILS__) {\n warn$1(\"Invalid HostVNode type:\", type, `(${typeof type})`);\n }\n }\n if (ref != null) {\n setRef(ref, null, parentSuspense, vnode);\n }\n return nextNode;\n };\n const hydrateElement = (el, vnode, parentComponent, parentSuspense, slotScopeIds, optimized) => {\n optimized = optimized || !!vnode.dynamicChildren;\n const { type, props, patchFlag, shapeFlag, dirs, transition } = vnode;\n const forcePatch = type === \"input\" || type === \"option\";\n if (!!(process.env.NODE_ENV !== \"production\") || forcePatch || patchFlag !== -1) {\n if (dirs) {\n invokeDirectiveHook(vnode, null, parentComponent, \"created\");\n }\n let needCallTransitionHooks = false;\n if (isTemplateNode(el)) {\n needCallTransitionHooks = needTransition(\n null,\n // no need check parentSuspense in hydration\n transition\n ) && parentComponent && parentComponent.vnode.props && parentComponent.vnode.props.appear;\n const content = el.content.firstChild;\n if (needCallTransitionHooks) {\n const cls = content.getAttribute(\"class\");\n if (cls) content.$cls = cls;\n transition.beforeEnter(content);\n }\n replaceNode(content, el, parentComponent);\n vnode.el = el = content;\n }\n if (shapeFlag & 16 && // skip if element has innerHTML / textContent\n !(props && (props.innerHTML || props.textContent))) {\n let next = hydrateChildren(\n el.firstChild,\n vnode,\n el,\n parentComponent,\n parentSuspense,\n slotScopeIds,\n optimized\n );\n let hasWarned = false;\n while (next) {\n if (!isMismatchAllowed(el, 1 /* CHILDREN */)) {\n if ((!!(process.env.NODE_ENV !== \"production\") || __VUE_PROD_HYDRATION_MISMATCH_DETAILS__) && !hasWarned) {\n warn$1(\n `Hydration children mismatch on`,\n el,\n `\nServer rendered element contains more child nodes than client vdom.`\n );\n hasWarned = true;\n }\n logMismatchError();\n }\n const cur = next;\n next = next.nextSibling;\n remove(cur);\n }\n } else if (shapeFlag & 8) {\n let clientText = vnode.children;\n if (clientText[0] === \"\\n\" && (el.tagName === \"PRE\" || el.tagName === \"TEXTAREA\")) {\n clientText = clientText.slice(1);\n }\n const { textContent } = el;\n if (textContent !== clientText && // innerHTML normalize \\r\\n or \\r into a single \\n in the DOM\n textContent !== clientText.replace(/\\r\\n|\\r/g, \"\\n\")) {\n if (!isMismatchAllowed(el, 0 /* TEXT */)) {\n (!!(process.env.NODE_ENV !== \"production\") || __VUE_PROD_HYDRATION_MISMATCH_DETAILS__) && warn$1(\n `Hydration text content mismatch on`,\n el,\n `\n - rendered on server: ${textContent}\n - expected on client: ${clientText}`\n );\n logMismatchError();\n }\n el.textContent = vnode.children;\n }\n }\n if (props) {\n if (!!(process.env.NODE_ENV !== \"production\") || __VUE_PROD_HYDRATION_MISMATCH_DETAILS__ || forcePatch || !optimized || patchFlag & (16 | 32)) {\n const isCustomElement = el.tagName.includes(\"-\");\n for (const key in props) {\n if ((!!(process.env.NODE_ENV !== \"production\") || __VUE_PROD_HYDRATION_MISMATCH_DETAILS__) && // #11189 skip if this node has directives that have created hooks\n // as it could have mutated the DOM in any possible way\n !(dirs && dirs.some((d) => d.dir.created)) && propHasMismatch(el, key, props[key], vnode, parentComponent)) {\n logMismatchError();\n }\n if (forcePatch && (key.endsWith(\"value\") || key === \"indeterminate\") || isOn(key) && !isReservedProp(key) || // force hydrate v-bind with .prop modifiers\n key[0] === \".\" || isCustomElement) {\n patchProp(el, key, null, props[key], void 0, parentComponent);\n }\n }\n } else if (props.onClick) {\n patchProp(\n el,\n \"onClick\",\n null,\n props.onClick,\n void 0,\n parentComponent\n );\n } else if (patchFlag & 4 && isReactive(props.style)) {\n for (const key in props.style) props.style[key];\n }\n }\n let vnodeHooks;\n if (vnodeHooks = props && props.onVnodeBeforeMount) {\n invokeVNodeHook(vnodeHooks, parentComponent, vnode);\n }\n if (dirs) {\n invokeDirectiveHook(vnode, null, parentComponent, \"beforeMount\");\n }\n if ((vnodeHooks = props && props.onVnodeMounted) || dirs || needCallTransitionHooks) {\n queueEffectWithSuspense(() => {\n vnodeHooks && invokeVNodeHook(vnodeHooks, parentComponent, vnode);\n needCallTransitionHooks && transition.enter(el);\n dirs && invokeDirectiveHook(vnode, null, parentComponent, \"mounted\");\n }, parentSuspense);\n }\n }\n return el.nextSibling;\n };\n const hydrateChildren = (node, parentVNode, container, parentComponent, parentSuspense, slotScopeIds, optimized) => {\n optimized = optimized || !!parentVNode.dynamicChildren;\n const children = parentVNode.children;\n const l = children.length;\n let hasWarned = false;\n for (let i = 0; i < l; i++) {\n const vnode = optimized ? children[i] : children[i] = normalizeVNode(children[i]);\n const isText = vnode.type === Text;\n if (node) {\n if (isText && !optimized) {\n if (i + 1 < l && normalizeVNode(children[i + 1]).type === Text) {\n insert(\n createText(\n node.data.slice(vnode.children.length)\n ),\n container,\n nextSibling(node)\n );\n node.data = vnode.children;\n }\n }\n node = hydrateNode(\n node,\n vnode,\n parentComponent,\n parentSuspense,\n slotScopeIds,\n optimized\n );\n } else if (isText && !vnode.children) {\n insert(vnode.el = createText(\"\"), container);\n } else {\n if (!isMismatchAllowed(container, 1 /* CHILDREN */)) {\n if ((!!(process.env.NODE_ENV !== \"production\") || __VUE_PROD_HYDRATION_MISMATCH_DETAILS__) && !hasWarned) {\n warn$1(\n `Hydration children mismatch on`,\n container,\n `\nServer rendered element contains fewer child nodes than client vdom.`\n );\n hasWarned = true;\n }\n logMismatchError();\n }\n patch(\n null,\n vnode,\n container,\n null,\n parentComponent,\n parentSuspense,\n getContainerType(container),\n slotScopeIds\n );\n }\n }\n return node;\n };\n const hydrateFragment = (node, vnode, parentComponent, parentSuspense, slotScopeIds, optimized) => {\n const { slotScopeIds: fragmentSlotScopeIds } = vnode;\n if (fragmentSlotScopeIds) {\n slotScopeIds = slotScopeIds ? slotScopeIds.concat(fragmentSlotScopeIds) : fragmentSlotScopeIds;\n }\n const container = parentNode(node);\n const next = hydrateChildren(\n nextSibling(node),\n vnode,\n container,\n parentComponent,\n parentSuspense,\n slotScopeIds,\n optimized\n );\n if (next && isComment(next) && next.data === \"]\") {\n return nextSibling(vnode.anchor = next);\n } else {\n logMismatchError();\n insert(vnode.anchor = createComment(`]`), container, next);\n return next;\n }\n };\n const handleMismatch = (node, vnode, parentComponent, parentSuspense, slotScopeIds, isFragment) => {\n if (!isMismatchAllowed(node.parentElement, 1 /* CHILDREN */)) {\n (!!(process.env.NODE_ENV !== \"production\") || __VUE_PROD_HYDRATION_MISMATCH_DETAILS__) && warn$1(\n `Hydration node mismatch:\n- rendered on server:`,\n node,\n node.nodeType === 3 ? `(text)` : isComment(node) && node.data === \"[\" ? `(start of fragment)` : ``,\n `\n- expected on client:`,\n vnode.type\n );\n logMismatchError();\n }\n vnode.el = null;\n if (isFragment) {\n const end = locateClosingAnchor(node);\n while (true) {\n const next2 = nextSibling(node);\n if (next2 && next2 !== end) {\n remove(next2);\n } else {\n break;\n }\n }\n }\n const next = nextSibling(node);\n const container = parentNode(node);\n remove(node);\n patch(\n null,\n vnode,\n container,\n next,\n parentComponent,\n parentSuspense,\n getContainerType(container),\n slotScopeIds\n );\n if (parentComponent) {\n parentComponent.vnode.el = vnode.el;\n updateHOCHostEl(parentComponent, vnode.el);\n }\n return next;\n };\n const locateClosingAnchor = (node, open = \"[\", close = \"]\") => {\n let match = 0;\n while (node) {\n node = nextSibling(node);\n if (node && isComment(node)) {\n if (node.data === open) match++;\n if (node.data === close) {\n if (match === 0) {\n return nextSibling(node);\n } else {\n match--;\n }\n }\n }\n }\n return node;\n };\n const replaceNode = (newNode, oldNode, parentComponent) => {\n const parentNode2 = oldNode.parentNode;\n if (parentNode2) {\n parentNode2.replaceChild(newNode, oldNode);\n }\n let parent = parentComponent;\n while (parent) {\n if (parent.vnode.el === oldNode) {\n parent.vnode.el = parent.subTree.el = newNode;\n }\n parent = parent.parent;\n }\n };\n const isTemplateNode = (node) => {\n return node.nodeType === 1 && node.tagName === \"TEMPLATE\";\n };\n return [hydrate, hydrateNode];\n}\nfunction propHasMismatch(el, key, clientValue, vnode, instance) {\n let mismatchType;\n let mismatchKey;\n let actual;\n let expected;\n if (key === \"class\") {\n if (el.$cls) {\n actual = el.$cls;\n delete el.$cls;\n } else {\n actual = el.getAttribute(\"class\");\n }\n expected = normalizeClass(clientValue);\n if (!isSetEqual(toClassSet(actual || \"\"), toClassSet(expected))) {\n mismatchType = 2 /* CLASS */;\n mismatchKey = `class`;\n }\n } else if (key === \"style\") {\n actual = el.getAttribute(\"style\") || \"\";\n expected = isString(clientValue) ? clientValue : stringifyStyle(normalizeStyle(clientValue));\n const actualMap = toStyleMap(actual);\n const expectedMap = toStyleMap(expected);\n if (vnode.dirs) {\n for (const { dir, value } of vnode.dirs) {\n if (dir.name === \"show\" && !value) {\n expectedMap.set(\"display\", \"none\");\n }\n }\n }\n if (instance) {\n resolveCssVars(instance, vnode, expectedMap);\n }\n if (!isMapEqual(actualMap, expectedMap)) {\n mismatchType = 3 /* STYLE */;\n mismatchKey = \"style\";\n }\n } else if (el instanceof SVGElement && isKnownSvgAttr(key) || el instanceof HTMLElement && (isBooleanAttr(key) || isKnownHtmlAttr(key))) {\n if (isBooleanAttr(key)) {\n actual = el.hasAttribute(key);\n expected = includeBooleanAttr(clientValue);\n } else if (clientValue == null) {\n actual = el.hasAttribute(key);\n expected = false;\n } else {\n if (el.hasAttribute(key)) {\n actual = el.getAttribute(key);\n } else if (key === \"value\" && el.tagName === \"TEXTAREA\") {\n actual = el.value;\n } else {\n actual = false;\n }\n expected = isRenderableAttrValue(clientValue) ? String(clientValue) : false;\n }\n if (actual !== expected) {\n mismatchType = 4 /* ATTRIBUTE */;\n mismatchKey = key;\n }\n }\n if (mismatchType != null && !isMismatchAllowed(el, mismatchType)) {\n const format = (v) => v === false ? `(not rendered)` : `${mismatchKey}=\"${v}\"`;\n const preSegment = `Hydration ${MismatchTypeString[mismatchType]} mismatch on`;\n const postSegment = `\n - rendered on server: ${format(actual)}\n - expected on client: ${format(expected)}\n Note: this mismatch is check-only. The DOM will not be rectified in production due to performance overhead.\n You should fix the source of the mismatch.`;\n {\n warn$1(preSegment, el, postSegment);\n }\n return true;\n }\n return false;\n}\nfunction toClassSet(str) {\n return new Set(str.trim().split(/\\s+/));\n}\nfunction isSetEqual(a, b) {\n if (a.size !== b.size) {\n return false;\n }\n for (const s of a) {\n if (!b.has(s)) {\n return false;\n }\n }\n return true;\n}\nfunction toStyleMap(str) {\n const styleMap = /* @__PURE__ */ new Map();\n for (const item of str.split(\";\")) {\n let [key, value] = item.split(\":\");\n key = key.trim();\n value = value && value.trim();\n if (key && value) {\n styleMap.set(key, value);\n }\n }\n return styleMap;\n}\nfunction isMapEqual(a, b) {\n if (a.size !== b.size) {\n return false;\n }\n for (const [key, value] of a) {\n if (value !== b.get(key)) {\n return false;\n }\n }\n return true;\n}\nfunction resolveCssVars(instance, vnode, expectedMap) {\n const root = instance.subTree;\n if (instance.getCssVars && (vnode === root || root && root.type === Fragment && root.children.includes(vnode))) {\n const cssVars = instance.getCssVars();\n for (const key in cssVars) {\n const value = normalizeCssVarValue(cssVars[key]);\n expectedMap.set(`--${getEscapedCssVarName(key, false)}`, value);\n }\n }\n if (vnode === root && instance.parent) {\n resolveCssVars(instance.parent, instance.vnode, expectedMap);\n }\n}\nconst allowMismatchAttr = \"data-allow-mismatch\";\nconst MismatchTypeString = {\n [0 /* TEXT */]: \"text\",\n [1 /* CHILDREN */]: \"children\",\n [2 /* CLASS */]: \"class\",\n [3 /* STYLE */]: \"style\",\n [4 /* ATTRIBUTE */]: \"attribute\"\n};\nfunction isMismatchAllowed(el, allowedType) {\n if (allowedType === 0 /* TEXT */ || allowedType === 1 /* CHILDREN */) {\n while (el && !el.hasAttribute(allowMismatchAttr)) {\n el = el.parentElement;\n }\n }\n const allowedAttr = el && el.getAttribute(allowMismatchAttr);\n if (allowedAttr == null) {\n return false;\n } else if (allowedAttr === \"\") {\n return true;\n } else {\n const list = allowedAttr.split(\",\");\n if (allowedType === 0 /* TEXT */ && list.includes(\"children\")) {\n return true;\n }\n return list.includes(MismatchTypeString[allowedType]);\n }\n}\n\nconst requestIdleCallback = getGlobalThis().requestIdleCallback || ((cb) => setTimeout(cb, 1));\nconst cancelIdleCallback = getGlobalThis().cancelIdleCallback || ((id) => clearTimeout(id));\nconst hydrateOnIdle = (timeout = 1e4) => (hydrate) => {\n const id = requestIdleCallback(hydrate, { timeout });\n return () => cancelIdleCallback(id);\n};\nfunction elementIsVisibleInViewport(el) {\n const { top, left, bottom, right } = el.getBoundingClientRect();\n const { innerHeight, innerWidth } = window;\n return (top > 0 && top < innerHeight || bottom > 0 && bottom < innerHeight) && (left > 0 && left < innerWidth || right > 0 && right < innerWidth);\n}\nconst hydrateOnVisible = (opts) => (hydrate, forEach) => {\n const ob = new IntersectionObserver((entries) => {\n for (const e of entries) {\n if (!e.isIntersecting) continue;\n ob.disconnect();\n hydrate();\n break;\n }\n }, opts);\n forEach((el) => {\n if (!(el instanceof Element)) return;\n if (elementIsVisibleInViewport(el)) {\n hydrate();\n ob.disconnect();\n return false;\n }\n ob.observe(el);\n });\n return () => ob.disconnect();\n};\nconst hydrateOnMediaQuery = (query) => (hydrate) => {\n if (query) {\n const mql = matchMedia(query);\n if (mql.matches) {\n hydrate();\n } else {\n mql.addEventListener(\"change\", hydrate, { once: true });\n return () => mql.removeEventListener(\"change\", hydrate);\n }\n }\n};\nconst hydrateOnInteraction = (interactions = []) => (hydrate, forEach) => {\n if (isString(interactions)) interactions = [interactions];\n let hasHydrated = false;\n const doHydrate = (e) => {\n if (!hasHydrated) {\n hasHydrated = true;\n teardown();\n hydrate();\n e.target.dispatchEvent(new e.constructor(e.type, e));\n }\n };\n const teardown = () => {\n forEach((el) => {\n for (const i of interactions) {\n el.removeEventListener(i, doHydrate);\n }\n });\n };\n forEach((el) => {\n for (const i of interactions) {\n el.addEventListener(i, doHydrate, { once: true });\n }\n });\n return teardown;\n};\nfunction forEachElement(node, cb) {\n if (isComment(node) && node.data === \"[\") {\n let depth = 1;\n let next = node.nextSibling;\n while (next) {\n if (next.nodeType === 1) {\n const result = cb(next);\n if (result === false) {\n break;\n }\n } else if (isComment(next)) {\n if (next.data === \"]\") {\n if (--depth === 0) break;\n } else if (next.data === \"[\") {\n depth++;\n }\n }\n next = next.nextSibling;\n }\n } else {\n cb(node);\n }\n}\n\nconst isAsyncWrapper = (i) => !!i.type.__asyncLoader;\n// @__NO_SIDE_EFFECTS__\nfunction defineAsyncComponent(source) {\n if (isFunction(source)) {\n source = { loader: source };\n }\n const {\n loader,\n loadingComponent,\n errorComponent,\n delay = 200,\n hydrate: hydrateStrategy,\n timeout,\n // undefined = never times out\n suspensible = true,\n onError: userOnError\n } = source;\n let pendingRequest = null;\n let resolvedComp;\n let retries = 0;\n const retry = () => {\n retries++;\n pendingRequest = null;\n return load();\n };\n const load = () => {\n let thisRequest;\n return pendingRequest || (thisRequest = pendingRequest = loader().catch((err) => {\n err = err instanceof Error ? err : new Error(String(err));\n if (userOnError) {\n return new Promise((resolve, reject) => {\n const userRetry = () => resolve(retry());\n const userFail = () => reject(err);\n userOnError(err, userRetry, userFail, retries + 1);\n });\n } else {\n throw err;\n }\n }).then((comp) => {\n if (thisRequest !== pendingRequest && pendingRequest) {\n return pendingRequest;\n }\n if (!!(process.env.NODE_ENV !== \"production\") && !comp) {\n warn$1(\n `Async component loader resolved to undefined. If you are using retry(), make sure to return its return value.`\n );\n }\n if (comp && (comp.__esModule || comp[Symbol.toStringTag] === \"Module\")) {\n comp = comp.default;\n }\n if (!!(process.env.NODE_ENV !== \"production\") && comp && !isObject(comp) && !isFunction(comp)) {\n throw new Error(`Invalid async component load result: ${comp}`);\n }\n resolvedComp = comp;\n return comp;\n }));\n };\n return defineComponent({\n name: \"AsyncComponentWrapper\",\n __asyncLoader: load,\n __asyncHydrate(el, instance, hydrate) {\n let patched = false;\n (instance.bu || (instance.bu = [])).push(() => patched = true);\n const performHydrate = () => {\n if (patched) {\n if (!!(process.env.NODE_ENV !== \"production\")) {\n warn$1(\n `Skipping lazy hydration for component '${getComponentName(resolvedComp) || resolvedComp.__file}': it was updated before lazy hydration performed.`\n );\n }\n return;\n }\n hydrate();\n };\n const doHydrate = hydrateStrategy ? () => {\n const teardown = hydrateStrategy(\n performHydrate,\n (cb) => forEachElement(el, cb)\n );\n if (teardown) {\n (instance.bum || (instance.bum = [])).push(teardown);\n }\n } : performHydrate;\n if (resolvedComp) {\n doHydrate();\n } else {\n load().then(() => !instance.isUnmounted && doHydrate());\n }\n },\n get __asyncResolved() {\n return resolvedComp;\n },\n setup() {\n const instance = currentInstance;\n markAsyncBoundary(instance);\n if (resolvedComp) {\n return () => createInnerComp(resolvedComp, instance);\n }\n const onError = (err) => {\n pendingRequest = null;\n handleError(\n err,\n instance,\n 13,\n !errorComponent\n );\n };\n if (suspensible && instance.suspense || isInSSRComponentSetup) {\n return load().then((comp) => {\n return () => createInnerComp(comp, instance);\n }).catch((err) => {\n onError(err);\n return () => errorComponent ? createVNode(errorComponent, {\n error: err\n }) : null;\n });\n }\n const loaded = ref(false);\n const error = ref();\n const delayed = ref(!!delay);\n if (delay) {\n setTimeout(() => {\n delayed.value = false;\n }, delay);\n }\n if (timeout != null) {\n setTimeout(() => {\n if (!loaded.value && !error.value) {\n const err = new Error(\n `Async component timed out after ${timeout}ms.`\n );\n onError(err);\n error.value = err;\n }\n }, timeout);\n }\n load().then(() => {\n loaded.value = true;\n if (instance.parent && isKeepAlive(instance.parent.vnode)) {\n instance.parent.update();\n }\n }).catch((err) => {\n onError(err);\n error.value = err;\n });\n return () => {\n if (loaded.value && resolvedComp) {\n return createInnerComp(resolvedComp, instance);\n } else if (error.value && errorComponent) {\n return createVNode(errorComponent, {\n error: error.value\n });\n } else if (loadingComponent && !delayed.value) {\n return createInnerComp(\n loadingComponent,\n instance\n );\n }\n };\n }\n });\n}\nfunction createInnerComp(comp, parent) {\n const { ref: ref2, props, children, ce } = parent.vnode;\n const vnode = createVNode(comp, props, children);\n vnode.ref = ref2;\n vnode.ce = ce;\n delete parent.vnode.ce;\n return vnode;\n}\n\nconst isKeepAlive = (vnode) => vnode.type.__isKeepAlive;\nconst KeepAliveImpl = {\n name: `KeepAlive`,\n // Marker for special handling inside the renderer. We are not using a ===\n // check directly on KeepAlive in the renderer, because importing it directly\n // would prevent it from being tree-shaken.\n __isKeepAlive: true,\n props: {\n include: [String, RegExp, Array],\n exclude: [String, RegExp, Array],\n max: [String, Number]\n },\n setup(props, { slots }) {\n const instance = getCurrentInstance();\n const sharedContext = instance.ctx;\n if (!sharedContext.renderer) {\n return () => {\n const children = slots.default && slots.default();\n return children && children.length === 1 ? children[0] : children;\n };\n }\n const cache = /* @__PURE__ */ new Map();\n const keys = /* @__PURE__ */ new Set();\n let current = null;\n if (!!(process.env.NODE_ENV !== \"production\") || __VUE_PROD_DEVTOOLS__) {\n instance.__v_cache = cache;\n }\n const parentSuspense = instance.suspense;\n const {\n renderer: {\n p: patch,\n m: move,\n um: _unmount,\n o: { createElement }\n }\n } = sharedContext;\n const storageContainer = createElement(\"div\");\n sharedContext.activate = (vnode, container, anchor, namespace, optimized) => {\n const instance2 = vnode.component;\n move(vnode, container, anchor, 0, parentSuspense);\n patch(\n instance2.vnode,\n vnode,\n container,\n anchor,\n instance2,\n parentSuspense,\n namespace,\n vnode.slotScopeIds,\n optimized\n );\n queuePostRenderEffect(() => {\n instance2.isDeactivated = false;\n if (instance2.a) {\n invokeArrayFns(instance2.a);\n }\n const vnodeHook = vnode.props && vnode.props.onVnodeMounted;\n if (vnodeHook) {\n invokeVNodeHook(vnodeHook, instance2.parent, vnode);\n }\n }, parentSuspense);\n if (!!(process.env.NODE_ENV !== \"production\") || __VUE_PROD_DEVTOOLS__) {\n devtoolsComponentAdded(instance2);\n }\n };\n sharedContext.deactivate = (vnode) => {\n const instance2 = vnode.component;\n invalidateMount(instance2.m);\n invalidateMount(instance2.a);\n move(vnode, storageContainer, null, 1, parentSuspense);\n queuePostRenderEffect(() => {\n if (instance2.da) {\n invokeArrayFns(instance2.da);\n }\n const vnodeHook = vnode.props && vnode.props.onVnodeUnmounted;\n if (vnodeHook) {\n invokeVNodeHook(vnodeHook, instance2.parent, vnode);\n }\n instance2.isDeactivated = true;\n }, parentSuspense);\n if (!!(process.env.NODE_ENV !== \"production\") || __VUE_PROD_DEVTOOLS__) {\n devtoolsComponentAdded(instance2);\n }\n if (!!(process.env.NODE_ENV !== \"production\") && true) {\n instance2.__keepAliveStorageContainer = storageContainer;\n }\n };\n function unmount(vnode) {\n resetShapeFlag(vnode);\n _unmount(vnode, instance, parentSuspense, true);\n }\n function pruneCache(filter) {\n cache.forEach((vnode, key) => {\n const name = getComponentName(\n isAsyncWrapper(vnode) ? vnode.type.__asyncResolved || {} : vnode.type\n );\n if (name && !filter(name)) {\n pruneCacheEntry(key);\n }\n });\n }\n function pruneCacheEntry(key) {\n const cached = cache.get(key);\n if (cached && (!current || !isSameVNodeType(cached, current))) {\n unmount(cached);\n } else if (current) {\n resetShapeFlag(current);\n }\n cache.delete(key);\n keys.delete(key);\n }\n watch(\n () => [props.include, props.exclude],\n ([include, exclude]) => {\n include && pruneCache((name) => matches(include, name));\n exclude && pruneCache((name) => !matches(exclude, name));\n },\n // prune post-render after `current` has been updated\n { flush: \"post\", deep: true }\n );\n let pendingCacheKey = null;\n const cacheSubtree = () => {\n if (pendingCacheKey != null) {\n if (isSuspense(instance.subTree.type)) {\n queuePostRenderEffect(() => {\n cache.set(pendingCacheKey, getInnerChild(instance.subTree));\n }, instance.subTree.suspense);\n } else {\n cache.set(pendingCacheKey, getInnerChild(instance.subTree));\n }\n }\n };\n onMounted(cacheSubtree);\n onUpdated(cacheSubtree);\n onBeforeUnmount(() => {\n cache.forEach((cached) => {\n const { subTree, suspense } = instance;\n const vnode = getInnerChild(subTree);\n if (cached.type === vnode.type && cached.key === vnode.key) {\n resetShapeFlag(vnode);\n const da = vnode.component.da;\n da && queuePostRenderEffect(da, suspense);\n return;\n }\n unmount(cached);\n });\n });\n return () => {\n pendingCacheKey = null;\n if (!slots.default) {\n return current = null;\n }\n const children = slots.default();\n const rawVNode = children[0];\n if (children.length > 1) {\n if (!!(process.env.NODE_ENV !== \"production\")) {\n warn$1(`KeepAlive should contain exactly one component child.`);\n }\n current = null;\n return children;\n } else if (!isVNode(rawVNode) || !(rawVNode.shapeFlag & 4) && !(rawVNode.shapeFlag & 128)) {\n current = null;\n return rawVNode;\n }\n let vnode = getInnerChild(rawVNode);\n if (vnode.type === Comment) {\n current = null;\n return vnode;\n }\n const comp = vnode.type;\n const name = getComponentName(\n isAsyncWrapper(vnode) ? vnode.type.__asyncResolved || {} : comp\n );\n const { include, exclude, max } = props;\n if (include && (!name || !matches(include, name)) || exclude && name && matches(exclude, name)) {\n vnode.shapeFlag &= -257;\n current = vnode;\n return rawVNode;\n }\n const key = vnode.key == null ? comp : vnode.key;\n const cachedVNode = cache.get(key);\n if (vnode.el) {\n vnode = cloneVNode(vnode);\n if (rawVNode.shapeFlag & 128) {\n rawVNode.ssContent = vnode;\n }\n }\n pendingCacheKey = key;\n if (cachedVNode) {\n vnode.el = cachedVNode.el;\n vnode.component = cachedVNode.component;\n if (vnode.transition) {\n setTransitionHooks(vnode, vnode.transition);\n }\n vnode.shapeFlag |= 512;\n keys.delete(key);\n keys.add(key);\n } else {\n keys.add(key);\n if (max && keys.size > parseInt(max, 10)) {\n pruneCacheEntry(keys.values().next().value);\n }\n }\n vnode.shapeFlag |= 256;\n current = vnode;\n return isSuspense(rawVNode.type) ? rawVNode : vnode;\n };\n }\n};\nconst KeepAlive = KeepAliveImpl;\nfunction matches(pattern, name) {\n if (isArray(pattern)) {\n return pattern.some((p) => matches(p, name));\n } else if (isString(pattern)) {\n return pattern.split(\",\").includes(name);\n } else if (isRegExp(pattern)) {\n pattern.lastIndex = 0;\n return pattern.test(name);\n }\n return false;\n}\nfunction onActivated(hook, target) {\n registerKeepAliveHook(hook, \"a\", target);\n}\nfunction onDeactivated(hook, target) {\n registerKeepAliveHook(hook, \"da\", target);\n}\nfunction registerKeepAliveHook(hook, type, target = currentInstance) {\n const wrappedHook = hook.__wdc || (hook.__wdc = () => {\n let current = target;\n while (current) {\n if (current.isDeactivated) {\n return;\n }\n current = current.parent;\n }\n return hook();\n });\n injectHook(type, wrappedHook, target);\n if (target) {\n let current = target.parent;\n while (current && current.parent) {\n if (isKeepAlive(current.parent.vnode)) {\n injectToKeepAliveRoot(wrappedHook, type, target, current);\n }\n current = current.parent;\n }\n }\n}\nfunction injectToKeepAliveRoot(hook, type, target, keepAliveRoot) {\n const injected = injectHook(\n type,\n hook,\n keepAliveRoot,\n true\n /* prepend */\n );\n onUnmounted(() => {\n remove(keepAliveRoot[type], injected);\n }, target);\n}\nfunction resetShapeFlag(vnode) {\n vnode.shapeFlag &= -257;\n vnode.shapeFlag &= -513;\n}\nfunction getInnerChild(vnode) {\n return vnode.shapeFlag & 128 ? vnode.ssContent : vnode;\n}\n\nfunction injectHook(type, hook, target = currentInstance, prepend = false) {\n if (target) {\n const hooks = target[type] || (target[type] = []);\n const wrappedHook = hook.__weh || (hook.__weh = (...args) => {\n pauseTracking();\n const reset = setCurrentInstance(target);\n const res = callWithAsyncErrorHandling(hook, target, type, args);\n reset();\n resetTracking();\n return res;\n });\n if (prepend) {\n hooks.unshift(wrappedHook);\n } else {\n hooks.push(wrappedHook);\n }\n return wrappedHook;\n } else if (!!(process.env.NODE_ENV !== \"production\")) {\n const apiName = toHandlerKey(ErrorTypeStrings$1[type].replace(/ hook$/, \"\"));\n warn$1(\n `${apiName} is called when there is no active component instance to be associated with. Lifecycle injection APIs can only be used during execution of setup().` + (` If you are using async setup(), make sure to register lifecycle hooks before the first await statement.` )\n );\n }\n}\nconst createHook = (lifecycle) => (hook, target = currentInstance) => {\n if (!isInSSRComponentSetup || lifecycle === \"sp\") {\n injectHook(lifecycle, (...args) => hook(...args), target);\n }\n};\nconst onBeforeMount = createHook(\"bm\");\nconst onMounted = createHook(\"m\");\nconst onBeforeUpdate = createHook(\n \"bu\"\n);\nconst onUpdated = createHook(\"u\");\nconst onBeforeUnmount = createHook(\n \"bum\"\n);\nconst onUnmounted = createHook(\"um\");\nconst onServerPrefetch = createHook(\n \"sp\"\n);\nconst onRenderTriggered = createHook(\"rtg\");\nconst onRenderTracked = createHook(\"rtc\");\nfunction onErrorCaptured(hook, target = currentInstance) {\n injectHook(\"ec\", hook, target);\n}\n\nconst COMPONENTS = \"components\";\nconst DIRECTIVES = \"directives\";\nfunction resolveComponent(name, maybeSelfReference) {\n return resolveAsset(COMPONENTS, name, true, maybeSelfReference) || name;\n}\nconst NULL_DYNAMIC_COMPONENT = /* @__PURE__ */ Symbol.for(\"v-ndc\");\nfunction resolveDynamicComponent(component) {\n if (isString(component)) {\n return resolveAsset(COMPONENTS, component, false) || component;\n } else {\n return component || NULL_DYNAMIC_COMPONENT;\n }\n}\nfunction resolveDirective(name) {\n return resolveAsset(DIRECTIVES, name);\n}\nfunction resolveAsset(type, name, warnMissing = true, maybeSelfReference = false) {\n const instance = currentRenderingInstance || currentInstance;\n if (instance) {\n const Component = instance.type;\n if (type === COMPONENTS) {\n const selfName = getComponentName(\n Component,\n false\n );\n if (selfName && (selfName === name || selfName === camelize(name) || selfName === capitalize(camelize(name)))) {\n return Component;\n }\n }\n const res = (\n // local registration\n // check instance[type] first which is resolved for options API\n resolve(instance[type] || Component[type], name) || // global registration\n resolve(instance.appContext[type], name)\n );\n if (!res && maybeSelfReference) {\n return Component;\n }\n if (!!(process.env.NODE_ENV !== \"production\") && warnMissing && !res) {\n const extra = type === COMPONENTS ? `\nIf this is a native custom element, make sure to exclude it from component resolution via compilerOptions.isCustomElement.` : ``;\n warn$1(`Failed to resolve ${type.slice(0, -1)}: ${name}${extra}`);\n }\n return res;\n } else if (!!(process.env.NODE_ENV !== \"production\")) {\n warn$1(\n `resolve${capitalize(type.slice(0, -1))} can only be used in render() or setup().`\n );\n }\n}\nfunction resolve(registry, name) {\n return registry && (registry[name] || registry[camelize(name)] || registry[capitalize(camelize(name))]);\n}\n\nfunction renderList(source, renderItem, cache, index) {\n let ret;\n const cached = cache && cache[index];\n const sourceIsArray = isArray(source);\n if (sourceIsArray || isString(source)) {\n const sourceIsReactiveArray = sourceIsArray && isReactive(source);\n let needsWrap = false;\n let isReadonlySource = false;\n if (sourceIsReactiveArray) {\n needsWrap = !isShallow(source);\n isReadonlySource = isReadonly(source);\n source = shallowReadArray(source);\n }\n ret = new Array(source.length);\n for (let i = 0, l = source.length; i < l; i++) {\n ret[i] = renderItem(\n needsWrap ? isReadonlySource ? toReadonly(toReactive(source[i])) : toReactive(source[i]) : source[i],\n i,\n void 0,\n cached && cached[i]\n );\n }\n } else if (typeof source === \"number\") {\n if (!!(process.env.NODE_ENV !== \"production\") && !Number.isInteger(source)) {\n warn$1(`The v-for range expect an integer value but got ${source}.`);\n }\n ret = new Array(source);\n for (let i = 0; i < source; i++) {\n ret[i] = renderItem(i + 1, i, void 0, cached && cached[i]);\n }\n } else if (isObject(source)) {\n if (source[Symbol.iterator]) {\n ret = Array.from(\n source,\n (item, i) => renderItem(item, i, void 0, cached && cached[i])\n );\n } else {\n const keys = Object.keys(source);\n ret = new Array(keys.length);\n for (let i = 0, l = keys.length; i < l; i++) {\n const key = keys[i];\n ret[i] = renderItem(source[key], key, i, cached && cached[i]);\n }\n }\n } else {\n ret = [];\n }\n if (cache) {\n cache[index] = ret;\n }\n return ret;\n}\n\nfunction createSlots(slots, dynamicSlots) {\n for (let i = 0; i < dynamicSlots.length; i++) {\n const slot = dynamicSlots[i];\n if (isArray(slot)) {\n for (let j = 0; j < slot.length; j++) {\n slots[slot[j].name] = slot[j].fn;\n }\n } else if (slot) {\n slots[slot.name] = slot.key ? (...args) => {\n const res = slot.fn(...args);\n if (res) res.key = slot.key;\n return res;\n } : slot.fn;\n }\n }\n return slots;\n}\n\nfunction renderSlot(slots, name, props = {}, fallback, noSlotted) {\n if (currentRenderingInstance.ce || currentRenderingInstance.parent && isAsyncWrapper(currentRenderingInstance.parent) && currentRenderingInstance.parent.ce) {\n const hasProps = Object.keys(props).length > 0;\n if (name !== \"default\") props.name = name;\n return openBlock(), createBlock(\n Fragment,\n null,\n [createVNode(\"slot\", props, fallback && fallback())],\n hasProps ? -2 : 64\n );\n }\n let slot = slots[name];\n if (!!(process.env.NODE_ENV !== \"production\") && slot && slot.length > 1) {\n warn$1(\n `SSR-optimized slot function detected in a non-SSR-optimized render function. You need to mark this component with $dynamic-slots in the parent template.`\n );\n slot = () => [];\n }\n if (slot && slot._c) {\n slot._d = false;\n }\n openBlock();\n const validSlotContent = slot && ensureValidVNode(slot(props));\n const slotKey = props.key || // slot content array of a dynamic conditional slot may have a branch\n // key attached in the `createSlots` helper, respect that\n validSlotContent && validSlotContent.key;\n const rendered = createBlock(\n Fragment,\n {\n key: (slotKey && !isSymbol(slotKey) ? slotKey : `_${name}`) + // #7256 force differentiate fallback content from actual content\n (!validSlotContent && fallback ? \"_fb\" : \"\")\n },\n validSlotContent || (fallback ? fallback() : []),\n validSlotContent && slots._ === 1 ? 64 : -2\n );\n if (!noSlotted && rendered.scopeId) {\n rendered.slotScopeIds = [rendered.scopeId + \"-s\"];\n }\n if (slot && slot._c) {\n slot._d = true;\n }\n return rendered;\n}\nfunction ensureValidVNode(vnodes) {\n return vnodes.some((child) => {\n if (!isVNode(child)) return true;\n if (child.type === Comment) return false;\n if (child.type === Fragment && !ensureValidVNode(child.children))\n return false;\n return true;\n }) ? vnodes : null;\n}\n\nfunction toHandlers(obj, preserveCaseIfNecessary) {\n const ret = {};\n if (!!(process.env.NODE_ENV !== \"production\") && !isObject(obj)) {\n warn$1(`v-on with no argument expects an object value.`);\n return ret;\n }\n for (const key in obj) {\n ret[preserveCaseIfNecessary && /[A-Z]/.test(key) ? `on:${key}` : toHandlerKey(key)] = obj[key];\n }\n return ret;\n}\n\nconst getPublicInstance = (i) => {\n if (!i) return null;\n if (isStatefulComponent(i)) return getComponentPublicInstance(i);\n return getPublicInstance(i.parent);\n};\nconst publicPropertiesMap = (\n // Move PURE marker to new line to workaround compiler discarding it\n // due to type annotation\n /* @__PURE__ */ extend(/* @__PURE__ */ Object.create(null), {\n $: (i) => i,\n $el: (i) => i.vnode.el,\n $data: (i) => i.data,\n $props: (i) => !!(process.env.NODE_ENV !== \"production\") ? shallowReadonly(i.props) : i.props,\n $attrs: (i) => !!(process.env.NODE_ENV !== \"production\") ? shallowReadonly(i.attrs) : i.attrs,\n $slots: (i) => !!(process.env.NODE_ENV !== \"production\") ? shallowReadonly(i.slots) : i.slots,\n $refs: (i) => !!(process.env.NODE_ENV !== \"production\") ? shallowReadonly(i.refs) : i.refs,\n $parent: (i) => getPublicInstance(i.parent),\n $root: (i) => getPublicInstance(i.root),\n $host: (i) => i.ce,\n $emit: (i) => i.emit,\n $options: (i) => __VUE_OPTIONS_API__ ? resolveMergedOptions(i) : i.type,\n $forceUpdate: (i) => i.f || (i.f = () => {\n queueJob(i.update);\n }),\n $nextTick: (i) => i.n || (i.n = nextTick.bind(i.proxy)),\n $watch: (i) => __VUE_OPTIONS_API__ ? instanceWatch.bind(i) : NOOP\n })\n);\nconst isReservedPrefix = (key) => key === \"_\" || key === \"$\";\nconst hasSetupBinding = (state, key) => state !== EMPTY_OBJ && !state.__isScriptSetup && hasOwn(state, key);\nconst PublicInstanceProxyHandlers = {\n get({ _: instance }, key) {\n if (key === \"__v_skip\") {\n return true;\n }\n const { ctx, setupState, data, props, accessCache, type, appContext } = instance;\n if (!!(process.env.NODE_ENV !== \"production\") && key === \"__isVue\") {\n return true;\n }\n if (key[0] !== \"$\") {\n const n = accessCache[key];\n if (n !== void 0) {\n switch (n) {\n case 1 /* SETUP */:\n return setupState[key];\n case 2 /* DATA */:\n return data[key];\n case 4 /* CONTEXT */:\n return ctx[key];\n case 3 /* PROPS */:\n return props[key];\n }\n } else if (hasSetupBinding(setupState, key)) {\n accessCache[key] = 1 /* SETUP */;\n return setupState[key];\n } else if (__VUE_OPTIONS_API__ && data !== EMPTY_OBJ && hasOwn(data, key)) {\n accessCache[key] = 2 /* DATA */;\n return data[key];\n } else if (hasOwn(props, key)) {\n accessCache[key] = 3 /* PROPS */;\n return props[key];\n } else if (ctx !== EMPTY_OBJ && hasOwn(ctx, key)) {\n accessCache[key] = 4 /* CONTEXT */;\n return ctx[key];\n } else if (!__VUE_OPTIONS_API__ || shouldCacheAccess) {\n accessCache[key] = 0 /* OTHER */;\n }\n }\n const publicGetter = publicPropertiesMap[key];\n let cssModule, globalProperties;\n if (publicGetter) {\n if (key === \"$attrs\") {\n track(instance.attrs, \"get\", \"\");\n !!(process.env.NODE_ENV !== \"production\") && markAttrsAccessed();\n } else if (!!(process.env.NODE_ENV !== \"production\") && key === \"$slots\") {\n track(instance, \"get\", key);\n }\n return publicGetter(instance);\n } else if (\n // css module (injected by vue-loader)\n (cssModule = type.__cssModules) && (cssModule = cssModule[key])\n ) {\n return cssModule;\n } else if (ctx !== EMPTY_OBJ && hasOwn(ctx, key)) {\n accessCache[key] = 4 /* CONTEXT */;\n return ctx[key];\n } else if (\n // global properties\n globalProperties = appContext.config.globalProperties, hasOwn(globalProperties, key)\n ) {\n {\n return globalProperties[key];\n }\n } else if (!!(process.env.NODE_ENV !== \"production\") && currentRenderingInstance && (!isString(key) || // #1091 avoid internal isRef/isVNode checks on component instance leading\n // to infinite warning loop\n key.indexOf(\"__v\") !== 0)) {\n if (data !== EMPTY_OBJ && isReservedPrefix(key[0]) && hasOwn(data, key)) {\n warn$1(\n `Property ${JSON.stringify(\n key\n )} must be accessed via $data because it starts with a reserved character (\"$\" or \"_\") and is not proxied on the render context.`\n );\n } else if (instance === currentRenderingInstance) {\n warn$1(\n `Property ${JSON.stringify(key)} was accessed during render but is not defined on instance.`\n );\n }\n }\n },\n set({ _: instance }, key, value) {\n const { data, setupState, ctx } = instance;\n if (hasSetupBinding(setupState, key)) {\n setupState[key] = value;\n return true;\n } else if (!!(process.env.NODE_ENV !== \"production\") && setupState.__isScriptSetup && hasOwn(setupState, key)) {\n warn$1(`Cannot mutate \n\n\n","\n\n\n\n\n","\n\n\n\n\n","\n\n\n\n\n","\n\n\n\n\n","\n\n\n\n\n","\n\n\n\n\n","\n\n\n\n\n","\n\n\n\n\n","\n\n\n\n\n","\n\n\n\n\n","\n\n\n\n\n","\n\n\n\n\n","\n\n\n\n\n","export function getLmBasePath(): string {\n const { pathname } = window.location;\n return pathname.endsWith('/') ? pathname.slice(0, -1) : pathname;\n}\n\nexport function lmApiUrl(path: string): string {\n return `${getLmBasePath()}${path}`;\n}\n","import { ref } from 'vue'\nimport type { BaseModelOption, TagOption, FolderTreeNode, LoraItem } from './types'\nimport { lmApiUrl } from '@/utils/basePath'\n\nexport function useLoraPoolApi() {\n const isLoading = ref(false)\n\n const fetchBaseModels = async (limit = 50): Promise => {\n try {\n const response = await fetch(lmApiUrl(`/api/lm/loras/base-models?limit=${limit}`))\n const data = await response.json()\n return data.base_models || []\n } catch (error) {\n console.error('[LoraPoolApi] Failed to fetch base models:', error)\n return []\n }\n }\n\n const fetchTags = async (limit = 0): Promise => {\n try {\n const response = await fetch(lmApiUrl(`/api/lm/loras/top-tags?limit=${limit}`))\n const data = await response.json()\n return data.tags || []\n } catch (error) {\n console.error('[LoraPoolApi] Failed to fetch tags:', error)\n return []\n }\n }\n\n const fetchFolderTree = async (): Promise => {\n try {\n const response = await fetch(lmApiUrl('/api/lm/loras/unified-folder-tree'))\n const data = await response.json()\n return transformFolderTree(data.tree || {})\n } catch (error) {\n console.error('[LoraPoolApi] Failed to fetch folder tree:', error)\n return []\n }\n }\n\n const transformFolderTree = (tree: Record, parentPath = ''): FolderTreeNode[] => {\n if (!tree || typeof tree !== 'object') {\n return []\n }\n\n return Object.entries(tree).map(([name, children]) => {\n const path = parentPath ? `${parentPath}/${name}` : name\n const childNodes = transformFolderTree(children as Record, path)\n\n return {\n key: path,\n label: name,\n children: childNodes.length > 0 ? childNodes : undefined\n }\n })\n }\n\n interface FetchLorasParams {\n baseModels?: string[]\n tagsInclude?: string[]\n tagsExclude?: string[]\n foldersInclude?: string[]\n foldersExclude?: string[]\n noCreditRequired?: boolean\n allowSelling?: boolean\n namePatternsInclude?: string[]\n namePatternsExclude?: string[]\n namePatternsUseRegex?: boolean\n page?: number\n pageSize?: number\n }\n\n const fetchLoras = async (params: FetchLorasParams): Promise<{ items: LoraItem[]; total: number }> => {\n isLoading.value = true\n try {\n const urlParams = new URLSearchParams()\n urlParams.set('page', String(params.page || 1))\n urlParams.set('page_size', String(params.pageSize || 6))\n\n params.baseModels?.forEach(bm => urlParams.append('base_model', bm))\n params.tagsInclude?.forEach(tag => urlParams.append('tag_include', tag))\n params.tagsExclude?.forEach(tag => urlParams.append('tag_exclude', tag))\n\n // Folder filters\n if (params.foldersInclude && params.foldersInclude.length > 0) {\n params.foldersInclude.forEach(folder => urlParams.append('folder_include', folder))\n urlParams.set('recursive', 'true')\n }\n params.foldersExclude?.forEach(folder => urlParams.append('folder_exclude', folder))\n\n if (params.noCreditRequired !== undefined) {\n urlParams.set('credit_required', String(!params.noCreditRequired))\n }\n\n if (params.allowSelling !== undefined) {\n urlParams.set('allow_selling_generated_content', String(params.allowSelling))\n }\n\n // Name pattern filters\n params.namePatternsInclude?.forEach(pattern => urlParams.append('name_pattern_include', pattern))\n params.namePatternsExclude?.forEach(pattern => urlParams.append('name_pattern_exclude', pattern))\n if (params.namePatternsUseRegex !== undefined) {\n urlParams.set('name_pattern_use_regex', String(params.namePatternsUseRegex))\n }\n\n const response = await fetch(lmApiUrl(`/api/lm/loras/list?${urlParams}`))\n const data = await response.json()\n\n return {\n items: data.items || [],\n total: data.total || 0\n }\n } catch (error) {\n console.error('[LoraPoolApi] Failed to fetch loras:', error)\n return { items: [], total: 0 }\n } finally {\n isLoading.value = false\n }\n }\n\n return {\n isLoading,\n fetchBaseModels,\n fetchTags,\n fetchFolderTree,\n fetchLoras\n }\n}\n","import { ref, computed, watch } from 'vue'\nimport type {\n LoraPoolConfig,\n BaseModelOption,\n TagOption,\n FolderTreeNode,\n LoraItem,\n ComponentWidget\n} from './types'\nimport { useLoraPoolApi } from './useLoraPoolApi'\n\nexport function useLoraPoolState(widget: ComponentWidget) {\n const api = useLoraPoolApi()\n\n // Flag to prevent infinite loops during config restoration\n // callback → restoreFromConfig → watch → refreshPreview → buildConfig → widget.value = config → callback → ...\n let isRestoring = false\n\n // Filter state\n const selectedBaseModels = ref([])\n const includeTags = ref([])\n const excludeTags = ref([])\n const includeFolders = ref([])\n const excludeFolders = ref([])\n const noCreditRequired = ref(false)\n const allowSelling = ref(false)\n const includePatterns = ref([])\n const excludePatterns = ref([])\n const useRegex = ref(false)\n\n // Available options from API\n const availableBaseModels = ref([])\n const availableTags = ref([])\n const folderTree = ref([])\n\n // Preview state\n const previewItems = ref([])\n const matchCount = ref(0)\n const isLoading = computed(() => api.isLoading.value)\n\n // Build config from current state\n const buildConfig = (): LoraPoolConfig => {\n const config: LoraPoolConfig = {\n version: 2,\n filters: {\n baseModels: selectedBaseModels.value,\n tags: {\n include: includeTags.value,\n exclude: excludeTags.value\n },\n folders: {\n include: includeFolders.value,\n exclude: excludeFolders.value\n },\n license: {\n noCreditRequired: noCreditRequired.value,\n allowSelling: allowSelling.value\n },\n namePatterns: {\n include: includePatterns.value,\n exclude: excludePatterns.value,\n useRegex: useRegex.value\n }\n },\n preview: {\n matchCount: matchCount.value,\n lastUpdated: Date.now()\n }\n }\n\n // Update widget value (this triggers callback for UI sync)\n // Skip during restoration to prevent infinite loops:\n // callback → restoreFromConfig → watch → refreshPreview → buildConfig → widget.value = config → callback → ...\n if (!isRestoring) {\n widget.value = config\n }\n return config\n }\n\n // Restore state from config\n const restoreFromConfig = (config: LoraPoolConfig) => {\n // Set flag to prevent buildConfig from triggering widget.value updates during restoration\n // This breaks the infinite loop: callback → restoreFromConfig → watch → refreshPreview → buildConfig → widget.value = config → callback\n isRestoring = true\n\n try {\n if (!config?.filters) return\n\n const { filters, preview } = config\n\n // Helper to update ref only if value changed\n const updateIfChanged = (refValue: { value: T }, newValue: T) => {\n if (JSON.stringify(refValue.value) !== JSON.stringify(newValue)) {\n refValue.value = newValue\n }\n }\n\n updateIfChanged(selectedBaseModels, filters.baseModels || [])\n updateIfChanged(includeTags, filters.tags?.include || [])\n updateIfChanged(excludeTags, filters.tags?.exclude || [])\n updateIfChanged(includeFolders, filters.folders?.include || [])\n updateIfChanged(excludeFolders, filters.folders?.exclude || [])\n updateIfChanged(noCreditRequired, filters.license?.noCreditRequired ?? false)\n updateIfChanged(allowSelling, filters.license?.allowSelling ?? false)\n updateIfChanged(includePatterns, filters.namePatterns?.include || [])\n updateIfChanged(excludePatterns, filters.namePatterns?.exclude || [])\n updateIfChanged(useRegex, filters.namePatterns?.useRegex ?? false)\n\n // matchCount doesn't trigger watchers, so direct assignment is fine\n matchCount.value = preview?.matchCount || 0\n } finally {\n isRestoring = false\n }\n }\n\n // Fetch filter options from API\n const fetchFilterOptions = async () => {\n const [baseModels, tags, folders] = await Promise.all([\n api.fetchBaseModels(),\n api.fetchTags(),\n api.fetchFolderTree()\n ])\n\n availableBaseModels.value = baseModels\n availableTags.value = tags\n folderTree.value = folders\n }\n\n // Refresh preview with current filters\n const refreshPreview = async () => {\n const result = await api.fetchLoras({\n baseModels: selectedBaseModels.value,\n tagsInclude: includeTags.value,\n tagsExclude: excludeTags.value,\n foldersInclude: includeFolders.value,\n foldersExclude: excludeFolders.value,\n noCreditRequired: noCreditRequired.value || undefined,\n allowSelling: allowSelling.value || undefined,\n namePatternsInclude: includePatterns.value,\n namePatternsExclude: excludePatterns.value,\n namePatternsUseRegex: useRegex.value,\n pageSize: 6\n })\n\n previewItems.value = result.items\n matchCount.value = result.total\n buildConfig()\n }\n\n // Debounced filter change handler\n let filterTimeout: ReturnType | null = null\n const onFilterChange = () => {\n if (filterTimeout) clearTimeout(filterTimeout)\n filterTimeout = setTimeout(() => {\n refreshPreview()\n }, 300)\n }\n\n // Watch all filter changes\n watch([\n selectedBaseModels,\n includeTags,\n excludeTags,\n includeFolders,\n excludeFolders,\n noCreditRequired,\n allowSelling,\n includePatterns,\n excludePatterns,\n useRegex\n ], onFilterChange, { deep: true })\n\n return {\n // Filter state\n selectedBaseModels,\n includeTags,\n excludeTags,\n includeFolders,\n excludeFolders,\n noCreditRequired,\n allowSelling,\n includePatterns,\n excludePatterns,\n useRegex,\n\n // Available options\n availableBaseModels,\n availableTags,\n folderTree,\n\n // Preview state\n previewItems,\n matchCount,\n isLoading,\n\n // Actions\n buildConfig,\n restoreFromConfig,\n fetchFilterOptions,\n refreshPreview\n }\n}\n\nexport type LoraPoolStateReturn = ReturnType\n","import { ref, computed } from 'vue'\n\nexport type ModalType = 'baseModels' | 'includeTags' | 'excludeTags' | 'includeFolders' | 'excludeFolders' | null\n\nexport function useModalState() {\n const activeModal = ref(null)\n\n const isOpen = computed(() => activeModal.value !== null)\n\n const openModal = (modal: ModalType) => {\n activeModal.value = modal\n }\n\n const closeModal = () => {\n activeModal.value = null\n }\n\n const isModalOpen = (modal: ModalType) => {\n return activeModal.value === modal\n }\n\n return {\n activeModal,\n isOpen,\n openModal,\n closeModal,\n isModalOpen\n }\n}\n\nexport type ModalStateReturn = ReturnType\n","\n\n\n\n\n","\n\n\n\n\n","\n\n\n\n\n","\n\n\n\n\n","\n\n\n\n\n","import { ref, computed, watch } from 'vue'\nimport type { ComponentWidget, RandomizerConfig, LoraEntry } from './types'\nimport { lmApiUrl } from '@/utils/basePath'\n\nexport function useLoraRandomizerState(widget: ComponentWidget) {\n // Flag to prevent infinite loops during config restoration\n // callback → restoreFromConfig → watch → widget.value = config → callback → ...\n let isRestoring = false\n\n // State refs\n const countMode = ref<'fixed' | 'range'>('range')\n const countFixed = ref(3)\n const countMin = ref(2)\n const countMax = ref(5)\n const modelStrengthMin = ref(0.0)\n const modelStrengthMax = ref(1.0)\n const useCustomClipRange = ref(false)\n const clipStrengthMin = ref(0.0)\n const clipStrengthMax = ref(1.0)\n const rollMode = ref<'fixed' | 'always'>('fixed')\n const isRolling = ref(false)\n const useRecommendedStrength = ref(false)\n const recommendedStrengthScaleMin = ref(0.5)\n const recommendedStrengthScaleMax = ref(1.0)\n\n // Track last used combination (for backend roll mode)\n const lastUsed = ref(null)\n\n // Dual seed mechanism for batch queue synchronization\n // execution_seed: seed for generating execution_stack (= previous next_seed)\n // next_seed: seed for generating ui_loras (= what will be displayed after execution)\n const executionSeed = ref(null)\n const nextSeed = ref(null)\n\n // Build config object from current state\n const buildConfig = (): RandomizerConfig => {\n // Skip updating widget.value during restoration to prevent infinite loops\n if (isRestoring) {\n return {\n count_mode: countMode.value,\n count_fixed: countFixed.value,\n count_min: countMin.value,\n count_max: countMax.value,\n model_strength_min: modelStrengthMin.value,\n model_strength_max: modelStrengthMax.value,\n use_same_clip_strength: !useCustomClipRange.value,\n clip_strength_min: clipStrengthMin.value,\n clip_strength_max: clipStrengthMax.value,\n roll_mode: rollMode.value,\n last_used: lastUsed.value,\n use_recommended_strength: useRecommendedStrength.value,\n recommended_strength_scale_min: recommendedStrengthScaleMin.value,\n recommended_strength_scale_max: recommendedStrengthScaleMax.value,\n execution_seed: executionSeed.value,\n next_seed: nextSeed.value,\n }\n }\n return {\n count_mode: countMode.value,\n count_fixed: countFixed.value,\n count_min: countMin.value,\n count_max: countMax.value,\n model_strength_min: modelStrengthMin.value,\n model_strength_max: modelStrengthMax.value,\n use_same_clip_strength: !useCustomClipRange.value,\n clip_strength_min: clipStrengthMin.value,\n clip_strength_max: clipStrengthMax.value,\n roll_mode: rollMode.value,\n last_used: lastUsed.value,\n use_recommended_strength: useRecommendedStrength.value,\n recommended_strength_scale_min: recommendedStrengthScaleMin.value,\n recommended_strength_scale_max: recommendedStrengthScaleMax.value,\n execution_seed: executionSeed.value,\n next_seed: nextSeed.value,\n }\n }\n\n // Shift seeds for batch queue synchronization\n // Previous next_seed becomes current execution_seed, and generate a new next_seed\n const generateNewSeed = () => {\n executionSeed.value = nextSeed.value // Previous next becomes current execution\n nextSeed.value = Math.floor(Math.random() * 2147483647)\n }\n\n // Initialize next_seed for first execution (execution_seed stays null)\n const initializeNextSeed = () => {\n if (nextSeed.value === null) {\n nextSeed.value = Math.floor(Math.random() * 2147483647)\n }\n }\n\n // Restore state from config object\n const restoreFromConfig = (config: RandomizerConfig) => {\n // Set flag to prevent buildConfig from triggering widget.value updates during restoration\n isRestoring = true\n\n try {\n countMode.value = config.count_mode || 'range'\n countFixed.value = config.count_fixed || 3\n countMin.value = config.count_min || 2\n countMax.value = config.count_max || 5\n modelStrengthMin.value = config.model_strength_min ?? 0.0\n modelStrengthMax.value = config.model_strength_max ?? 1.0\n useCustomClipRange.value = !(config.use_same_clip_strength ?? true)\n clipStrengthMin.value = config.clip_strength_min ?? 0.0\n clipStrengthMax.value = config.clip_strength_max ?? 1.0\n // Migrate old roll_mode values to new ones\n const rawRollMode = (config as any).roll_mode as string\n if (rawRollMode === 'frontend') {\n rollMode.value = 'fixed'\n } else if (rawRollMode === 'backend') {\n rollMode.value = 'always'\n } else if (rawRollMode === 'fixed' || rawRollMode === 'always') {\n rollMode.value = rawRollMode as 'fixed' | 'always'\n } else {\n rollMode.value = 'fixed'\n }\n lastUsed.value = config.last_used || null\n useRecommendedStrength.value = config.use_recommended_strength ?? false\n recommendedStrengthScaleMin.value = config.recommended_strength_scale_min ?? 0.5\n recommendedStrengthScaleMax.value = config.recommended_strength_scale_max ?? 1.0\n } finally {\n isRestoring = false\n }\n }\n\n // Roll loras - call API to get random selection\n const rollLoras = async (\n poolConfig: any | null,\n lockedLoras: LoraEntry[]\n ): Promise => {\n try {\n isRolling.value = true\n\n const config = buildConfig()\n\n // Build request body\n const requestBody: any = {\n model_strength_min: config.model_strength_min,\n model_strength_max: config.model_strength_max,\n use_same_clip_strength: !useCustomClipRange.value,\n clip_strength_min: config.clip_strength_min,\n clip_strength_max: config.clip_strength_max,\n locked_loras: lockedLoras,\n use_recommended_strength: config.use_recommended_strength,\n recommended_strength_scale_min: config.recommended_strength_scale_min,\n recommended_strength_scale_max: config.recommended_strength_scale_max,\n }\n\n // Add count parameters\n if (config.count_mode === 'fixed') {\n requestBody.count = config.count_fixed\n } else {\n requestBody.count_min = config.count_min\n requestBody.count_max = config.count_max\n }\n\n // Add pool config if provided\n if (poolConfig) {\n requestBody.pool_config = poolConfig.filters || {}\n }\n\n // Call API endpoint\n const response = await fetch(lmApiUrl('/api/lm/loras/random-sample'), {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(requestBody),\n })\n\n if (!response.ok) {\n const errorData = await response.json()\n throw new Error(errorData.error || 'Failed to fetch random LoRAs')\n }\n\n const data = await response.json()\n\n if (!data.success) {\n throw new Error(data.error || 'Failed to get random LoRAs')\n }\n\n return data.loras || []\n } catch (error) {\n console.error('[LoraRandomizerState] Error rolling LoRAs:', error)\n throw error\n } finally {\n isRolling.value = false\n }\n }\n\n // Restore last used and return it\n const useLastUsed = () => {\n if (lastUsed.value && lastUsed.value.length > 0) {\n return lastUsed.value\n }\n return null\n }\n\n // Computed properties\n const isClipStrengthDisabled = computed(() => !useCustomClipRange.value)\n const isRecommendedStrengthEnabled = computed(() => useRecommendedStrength.value)\n\n // Watch all state changes and update widget value\n watch([\n countMode,\n countFixed,\n countMin,\n countMax,\n modelStrengthMin,\n modelStrengthMax,\n useCustomClipRange,\n clipStrengthMin,\n clipStrengthMax,\n rollMode,\n useRecommendedStrength,\n recommendedStrengthScaleMin,\n recommendedStrengthScaleMax,\n ], () => {\n widget.value = buildConfig()\n }, { deep: true })\n\n return {\n // State refs\n countMode,\n countFixed,\n countMin,\n countMax,\n modelStrengthMin,\n modelStrengthMax,\n useCustomClipRange,\n clipStrengthMin,\n clipStrengthMax,\n rollMode,\n isRolling,\n lastUsed,\n useRecommendedStrength,\n recommendedStrengthScaleMin,\n recommendedStrengthScaleMax,\n executionSeed,\n nextSeed,\n\n // Computed\n isClipStrengthDisabled,\n isRecommendedStrengthEnabled,\n\n // Methods\n buildConfig,\n restoreFromConfig,\n rollLoras,\n useLastUsed,\n generateNewSeed,\n initializeNextSeed,\n }\n}\n","\n\n\n\n\n","\n\n\n\n\n","\n\n\n\n\n","import { ref, watch, computed } from 'vue'\nimport type { ComponentWidget, CyclerConfig, LoraPoolConfig } from './types'\nimport { lmApiUrl } from '@/utils/basePath'\n\nexport interface CyclerLoraItem {\n file_name: string\n model_name: string\n file_path: string\n}\n\nexport function useLoraCyclerState(widget: ComponentWidget) {\n // Flag to prevent infinite loops during config restoration\n // callback → restoreFromConfig → watch → widget.value = config → callback → ...\n let isRestoring = false\n\n // State refs\n const currentIndex = ref(1) // 1-based\n const totalCount = ref(0)\n const poolConfigHash = ref('')\n const modelStrength = ref(1.0)\n const clipStrength = ref(1.0)\n const useCustomClipRange = ref(false)\n const usePresetStrength = ref(false)\n const presetStrengthScale = ref(1.0)\n const sortBy = ref<'filename' | 'model_name'>('filename')\n const currentLoraName = ref('')\n const currentLoraFilename = ref('')\n const isLoading = ref(false)\n\n // Dual-index mechanism for batch queue synchronization\n // execution_index: index for generating execution_stack (= previous next_index)\n // next_index: index for UI display (= what will be shown after execution)\n const executionIndex = ref(null)\n const nextIndex = ref(null)\n\n // Advanced index control features\n const repeatCount = ref(1) // How many times each LoRA should repeat\n const repeatUsed = ref(0) // How many times current index has been used (internal tracking)\n const displayRepeatUsed = ref(0) // For UI display, deferred updates like currentIndex\n const isPaused = ref(false) // Whether iteration is paused\n const includeNoLora = ref(false) // Whether to include empty LoRA option in cycle\n\n // Execution progress tracking (visual feedback)\n const isWorkflowExecuting = ref(false) // Workflow is currently running\n const executingRepeatStep = ref(0) // Which repeat step (1-based, 0 = not executing)\n\n // Build config object from current state\n const buildConfig = (): CyclerConfig => {\n // Skip updating widget.value during restoration to prevent infinite loops\n if (isRestoring) {\n return {\n current_index: currentIndex.value,\n total_count: totalCount.value,\n pool_config_hash: poolConfigHash.value,\n model_strength: modelStrength.value,\n clip_strength: clipStrength.value,\n use_same_clip_strength: !useCustomClipRange.value,\n use_preset_strength: usePresetStrength.value,\n preset_strength_scale: presetStrengthScale.value,\n sort_by: sortBy.value,\n current_lora_name: currentLoraName.value,\n current_lora_filename: currentLoraFilename.value,\n execution_index: executionIndex.value,\n next_index: nextIndex.value,\n repeat_count: repeatCount.value,\n repeat_used: repeatUsed.value,\n is_paused: isPaused.value,\n include_no_lora: includeNoLora.value,\n }\n }\n return {\n current_index: currentIndex.value,\n total_count: totalCount.value,\n pool_config_hash: poolConfigHash.value,\n model_strength: modelStrength.value,\n clip_strength: clipStrength.value,\n use_same_clip_strength: !useCustomClipRange.value,\n use_preset_strength: usePresetStrength.value,\n preset_strength_scale: presetStrengthScale.value,\n sort_by: sortBy.value,\n current_lora_name: currentLoraName.value,\n current_lora_filename: currentLoraFilename.value,\n execution_index: executionIndex.value,\n next_index: nextIndex.value,\n repeat_count: repeatCount.value,\n repeat_used: repeatUsed.value,\n is_paused: isPaused.value,\n include_no_lora: includeNoLora.value,\n }\n }\n\n // Restore state from config object\n const restoreFromConfig = (config: CyclerConfig) => {\n // Set flag to prevent buildConfig from triggering widget.value updates during restoration\n isRestoring = true\n\n try {\n currentIndex.value = config.current_index || 1\n totalCount.value = config.total_count || 0\n poolConfigHash.value = config.pool_config_hash || ''\n modelStrength.value = config.model_strength ?? 1.0\n clipStrength.value = config.clip_strength ?? 1.0\n useCustomClipRange.value = !(config.use_same_clip_strength ?? true)\n usePresetStrength.value = config.use_preset_strength ?? false\n presetStrengthScale.value = config.preset_strength_scale ?? 1.0\n sortBy.value = config.sort_by || 'filename'\n currentLoraName.value = config.current_lora_name || ''\n currentLoraFilename.value = config.current_lora_filename || ''\n // Advanced index control features\n repeatCount.value = config.repeat_count ?? 1\n repeatUsed.value = config.repeat_used ?? 0\n isPaused.value = config.is_paused ?? false\n includeNoLora.value = config.include_no_lora ?? false\n // Note: execution_index and next_index are not restored from config\n // as they are transient values used only during batch execution\n } finally {\n isRestoring = false\n }\n }\n\n // Shift indices for batch queue synchronization\n // Previous next_index becomes current execution_index, and generate a new next_index\n const generateNextIndex = () => {\n executionIndex.value = nextIndex.value // Previous next becomes current execution\n // Calculate the next index (wrap to 1 if at end)\n const current = executionIndex.value ?? currentIndex.value\n let next = current + 1\n // Total count includes no lora option if enabled\n const effectiveTotalCount = includeNoLora.value ? totalCount.value + 1 : totalCount.value\n if (effectiveTotalCount > 0 && next > effectiveTotalCount) {\n next = 1\n }\n nextIndex.value = next\n }\n\n // Initialize next_index for first execution (execution_index stays null)\n const initializeNextIndex = () => {\n if (nextIndex.value === null) {\n // First execution uses current_index, so next is current + 1\n let next = currentIndex.value + 1\n // Total count includes no lora option if enabled\n const effectiveTotalCount = includeNoLora.value ? totalCount.value + 1 : totalCount.value\n if (effectiveTotalCount > 0 && next > effectiveTotalCount) {\n next = 1\n }\n nextIndex.value = next\n }\n }\n\n // Generate hash from pool config for change detection\n const hashPoolConfig = (poolConfig: LoraPoolConfig | null): string => {\n if (!poolConfig || !poolConfig.filters) {\n return ''\n }\n try {\n return btoa(JSON.stringify(poolConfig.filters))\n } catch {\n return ''\n }\n }\n\n // Fetch cycler list from API\n const fetchCyclerList = async (\n poolConfig: LoraPoolConfig | null\n ): Promise => {\n try {\n isLoading.value = true\n\n const requestBody: Record = {\n sort_by: sortBy.value,\n }\n\n if (poolConfig?.filters) {\n requestBody.pool_config = poolConfig.filters\n }\n\n const response = await fetch(lmApiUrl('/api/lm/loras/cycler-list'), {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(requestBody),\n })\n\n if (!response.ok) {\n const errorData = await response.json()\n throw new Error(errorData.error || 'Failed to fetch cycler list')\n }\n\n const data = await response.json()\n\n if (!data.success) {\n throw new Error(data.error || 'Failed to get cycler list')\n }\n\n return data.loras || []\n } catch (error) {\n console.error('[LoraCyclerState] Error fetching cycler list:', error)\n throw error\n } finally {\n isLoading.value = false\n }\n }\n\n // Refresh list and update state\n const refreshList = async (poolConfig: LoraPoolConfig | null) => {\n try {\n const newHash = hashPoolConfig(poolConfig)\n const hashChanged = newHash !== poolConfigHash.value\n\n // Fetch the list\n const loraList = await fetchCyclerList(poolConfig)\n\n // Update total count\n totalCount.value = loraList.length\n\n // If pool config changed, reset index to 1\n if (hashChanged) {\n currentIndex.value = 1\n poolConfigHash.value = newHash\n }\n\n // Clamp index to valid range\n if (currentIndex.value > totalCount.value) {\n currentIndex.value = Math.max(1, totalCount.value)\n }\n\n // Update current LoRA info\n if (loraList.length > 0 && currentIndex.value > 0) {\n const currentLora = loraList[currentIndex.value - 1]\n if (currentLora) {\n currentLoraName.value = sortBy.value === 'filename' \n ? currentLora.file_name \n : (currentLora.model_name || currentLora.file_name)\n currentLoraFilename.value = currentLora.file_name\n }\n } else {\n currentLoraName.value = ''\n currentLoraFilename.value = ''\n }\n\n return loraList\n } catch (error) {\n console.error('[LoraCyclerState] Error refreshing list:', error)\n throw error\n }\n }\n\n // Set index manually\n const setIndex = (index: number) => {\n // Total count includes no lora option if enabled\n const effectiveTotalCount = includeNoLora.value ? totalCount.value + 1 : totalCount.value\n if (index >= 1 && index <= effectiveTotalCount) {\n currentIndex.value = index\n }\n }\n\n // Reset index to 1 and clear repeat state\n const resetIndex = () => {\n currentIndex.value = 1\n repeatUsed.value = 0\n displayRepeatUsed.value = 0\n // Note: isPaused is intentionally not reset - user may want to stay paused after reset\n }\n\n // Toggle pause state\n const togglePause = () => {\n isPaused.value = !isPaused.value\n }\n\n // Computed property to check if clip strength is disabled\n const isClipStrengthDisabled = computed(() => !useCustomClipRange.value)\n\n // Watch model strength changes to sync with clip strength when not using custom range\n watch(modelStrength, (newValue) => {\n if (!useCustomClipRange.value) {\n clipStrength.value = newValue\n }\n })\n\n // Watch all state changes and update widget value\n watch([\n currentIndex,\n totalCount,\n poolConfigHash,\n modelStrength,\n clipStrength,\n useCustomClipRange,\n usePresetStrength,\n presetStrengthScale,\n sortBy,\n currentLoraName,\n currentLoraFilename,\n repeatCount,\n repeatUsed,\n isPaused,\n includeNoLora,\n ], () => {\n widget.value = buildConfig()\n }, { deep: true })\n\n return {\n // State refs\n currentIndex,\n totalCount,\n poolConfigHash,\n modelStrength,\n clipStrength,\n useCustomClipRange,\n usePresetStrength,\n presetStrengthScale,\n sortBy,\n currentLoraName,\n currentLoraFilename,\n isLoading,\n executionIndex,\n nextIndex,\n repeatCount,\n repeatUsed,\n displayRepeatUsed,\n isPaused,\n includeNoLora,\n isWorkflowExecuting,\n executingRepeatStep,\n\n // Computed\n isClipStrengthDisabled,\n\n // Methods\n buildConfig,\n restoreFromConfig,\n hashPoolConfig,\n fetchCyclerList,\n refreshList,\n setIndex,\n generateNextIndex,\n initializeNextIndex,\n resetIndex,\n togglePause,\n }\n}\n","\n\n\n\n\n","\n\n\n\n\n","import { ref, onMounted, onUnmounted, type Ref } from 'vue'\n\n// Dynamic import type for AutoComplete class\ntype AutoCompleteClass = new (\n inputElement: HTMLTextAreaElement,\n modelType: 'loras' | 'prompt',\n options?: AutocompleteOptions\n) => AutoCompleteInstance\n\ninterface AutocompleteOptions {\n maxItems?: number\n minChars?: number\n debounceDelay?: number\n showPreview?: boolean\n}\n\ninterface AutoCompleteInstance {\n destroy: () => void\n isValid: () => boolean\n refreshCaretHelper: () => void\n}\n\nexport interface UseAutocompleteOptions {\n showPreview?: boolean\n maxItems?: number\n minChars?: number\n debounceDelay?: number\n}\n\nexport function useAutocomplete(\n textareaRef: Ref,\n modelType: 'loras' | 'prompt' = 'loras',\n options: UseAutocompleteOptions = {}\n) {\n const autocompleteInstance = ref(null)\n const isInitialized = ref(false)\n\n const defaultOptions: AutocompleteOptions = {\n maxItems: 20,\n minChars: 1,\n debounceDelay: 200,\n showPreview: true,\n ...options\n }\n\n const initAutocomplete = async () => {\n if (!textareaRef.value) {\n console.warn('[useAutocomplete] Textarea ref is null, cannot initialize')\n return\n }\n\n if (autocompleteInstance.value) {\n console.log('[useAutocomplete] Already initialized, skipping')\n return\n }\n\n try {\n // Dynamically import the AutoComplete class\n const module = await import(/* @vite-ignore */ `${'../autocomplete.js'}`)\n const AutoComplete: AutoCompleteClass = module.AutoComplete\n\n autocompleteInstance.value = new AutoComplete(\n textareaRef.value,\n modelType,\n defaultOptions\n )\n isInitialized.value = true\n console.log(`[useAutocomplete] Initialized for ${modelType}`)\n } catch (error) {\n console.error('[useAutocomplete] Failed to initialize:', error)\n }\n }\n\n const destroyAutocomplete = () => {\n if (autocompleteInstance.value) {\n autocompleteInstance.value.destroy()\n autocompleteInstance.value = null\n isInitialized.value = false\n console.log('[useAutocomplete] Destroyed')\n }\n }\n\n const refreshCaretHelper = () => {\n if (autocompleteInstance.value) {\n autocompleteInstance.value.refreshCaretHelper()\n }\n }\n\n onMounted(() => {\n // Initialize autocomplete after component is mounted\n // Use nextTick-like delay to ensure DOM is fully ready\n setTimeout(() => {\n initAutocomplete()\n }, 0)\n })\n\n onUnmounted(() => {\n destroyAutocomplete()\n })\n\n return {\n autocompleteInstance,\n isInitialized,\n initAutocomplete,\n destroyAutocomplete,\n refreshCaretHelper\n }\n}\n\nexport type UseAutocompleteReturn = ReturnType\n","\n\n\n\n\n\n\n\n","\n\n\n\n","import type { App as VueApp } from 'vue'\n\nexport function createVueWidgetCleanup(vueApp: VueApp, onCleanup?: () => void) {\n let didUnmount = false\n\n return () => {\n if (didUnmount) {\n return\n }\n\n vueApp.unmount()\n didUnmount = true\n onCleanup?.()\n }\n}\n","import { api } from \"../../scripts/api.js\";\nimport { app } from \"../../scripts/app.js\";\nimport { TextAreaCaretHelper } from \"./textarea_caret_helper.js\";\nimport {\n WILDCARD_COMMANDS,\n createWildcardEmptyStateItem,\n createWildcardNoMatchesItem,\n getWildcardInsertText,\n getWildcardSearchEndpoint,\n isWildcardCommand,\n isWildcardInfoItem,\n} from \"./autocomplete_wildcards.js\";\nimport {\n getAutocompleteAppendCommaPreference,\n getAutocompleteAutoFormatPreference,\n getAutocompleteAcceptKeyPreference,\n getLoraActiveFiltersAutocompletePreference,\n getPromptTagAutocompletePreference,\n getTagSpaceReplacementPreference,\n setLoraManagerSettingValue,\n} from \"./settings.js\";\nimport { showToast } from \"./utils.js\";\n\n// localStorage key for the one-time \"how to disable\" hint in the dropdown\nconst FIRST_RUN_HINT_DISMISSED_KEY = 'lm:autocomplete-disable-tip-dismissed';\n// localStorage key for the one-time \"try active filters search\" hint (loras nodes)\nconst ACTIVE_FILTERS_HINT_DISMISSED_KEY = 'lm:activefilters-tip-dismissed';\n\n// Command definitions for category filtering\nconst TAG_COMMANDS = {\n '/character': { categories: [4, 11], label: 'Character' },\n '/artist': { categories: [1, 8], label: 'Artist' },\n '/general': { categories: [0, 7], label: 'General' },\n '/copyright': { categories: [3, 10], label: 'Copyright' },\n '/meta': { categories: [5, 14], label: 'Meta' },\n '/species': { categories: [12], label: 'Species' },\n '/lore': { categories: [15], label: 'Lore' },\n '/emb': { type: 'embedding', label: 'Embeddings' },\n '/embedding': { type: 'embedding', label: 'Embeddings' },\n ...WILDCARD_COMMANDS,\n // Autocomplete toggle commands - only show one based on current state\n '/autocomplete': {\n type: 'toggle_setting',\n settingId: 'loramanager.prompt_tag_autocomplete',\n value: true,\n label: 'Turn autocomplete ON',\n condition: () => !getPromptTagAutocompletePreference()\n },\n '/noautocomplete': {\n type: 'toggle_setting',\n settingId: 'loramanager.prompt_tag_autocomplete',\n value: false,\n label: 'Turn autocomplete OFF',\n condition: () => getPromptTagAutocompletePreference()\n },\n};\n\n// Command definitions for LoRA active-filters search\nconst LORAS_COMMANDS = {\n '/activefilters': {\n type: 'toggle_setting',\n settingId: 'loramanager.lora_active_filters_autocomplete',\n value: true,\n label: 'Turn active filters search ON',\n feedbackSummary: 'Active Filters Search: ON',\n feedbackDetail: 'LoRA autocomplete now searches within the active filters of the LoRA Manager page.',\n condition: () => !getLoraActiveFiltersAutocompletePreference()\n },\n '/noactivefilters': {\n type: 'toggle_setting',\n settingId: 'loramanager.lora_active_filters_autocomplete',\n value: false,\n label: 'Turn active filters search OFF',\n feedbackSummary: 'Active Filters Search: OFF',\n feedbackDetail: 'LoRA autocomplete searches the full library again.',\n condition: () => getLoraActiveFiltersAutocompletePreference()\n },\n};\n\n// Category display information\nconst CATEGORY_INFO = { 0: { bg: 'rgba(0, 155, 230, 0.2)', text: '#4bb4ff', label: 'General' },\n 1: { bg: 'rgba(255, 138, 139, 0.2)', text: '#ffc3c3', label: 'Artist' },\n 3: { bg: 'rgba(199, 151, 255, 0.2)', text: '#ddc9fb', label: 'Copyright' },\n 4: { bg: 'rgba(53, 198, 74, 0.2)', text: '#93e49a', label: 'Character' },\n 5: { bg: 'rgba(234, 208, 132, 0.2)', text: '#f7e7c3', label: 'Meta' },\n 7: { bg: 'rgba(0, 155, 230, 0.2)', text: '#4bb4ff', label: 'General' },\n 8: { bg: 'rgba(255, 138, 139, 0.2)', text: '#ffc3c3', label: 'Artist' },\n 10: { bg: 'rgba(199, 151, 255, 0.2)', text: '#ddc9fb', label: 'Copyright' },\n 11: { bg: 'rgba(53, 198, 74, 0.2)', text: '#93e49a', label: 'Character' },\n 12: { bg: 'rgba(237, 137, 54, 0.2)', text: '#f6ad55', label: 'Species' },\n 14: { bg: 'rgba(234, 208, 132, 0.2)', text: '#f7e7c3', label: 'Meta' },\n 15: { bg: 'rgba(72, 187, 120, 0.2)', text: '#68d391', label: 'Lore' },\n};\n\n// Format post count with K/M suffix\nfunction formatPostCount(count) {\n if (count >= 1000000) {\n return (count / 1000000).toFixed(1).replace(/\\.0$/, '') + 'M';\n } else if (count >= 1000) {\n return (count / 1000).toFixed(1).replace(/\\.0$/, '') + 'K';\n }\n return count.toString();\n}\n\nfunction parseUsageTipNumber(value) {\n if (typeof value === 'number' && Number.isFinite(value)) {\n return value;\n }\n if (typeof value === 'string') {\n const parsed = parseFloat(value);\n if (Number.isFinite(parsed)) {\n return parsed;\n }\n }\n return null;\n}\n\nfunction splitRelativePath(relativePath = '') {\n const parts = relativePath.split(/[/\\\\]+/).filter(Boolean);\n const fileName = parts.pop() ?? '';\n return {\n directories: parts,\n fileName,\n };\n}\n\nfunction removeGeneralExtension(fileName = '') {\n return fileName.replace(/\\.[^.]+$/, '');\n}\n\nfunction removeLoraExtension(fileName = '') {\n return fileName.replace(/\\.(safetensors|ckpt|pt|bin)$/i, '');\n}\n\nlet _loraSyntaxFormatCache = null;\nlet _loraSyntaxFormatRefreshPromise = null;\n\nfunction _getLoraSyntaxFormat() {\n if (_loraSyntaxFormatCache !== null) {\n return _loraSyntaxFormatCache;\n }\n return 'legacy';\n}\n\nasync function _fetchLoraSyntaxFormat() {\n try {\n const response = await api.fetchApi('/lm/settings');\n if (response.ok) {\n const data = await response.json();\n if (data.success && data.settings) {\n _loraSyntaxFormatCache = data.settings.lora_syntax_format || 'legacy';\n return;\n }\n }\n } catch (e) {\n }\n if (_loraSyntaxFormatCache === null) {\n _loraSyntaxFormatCache = 'legacy';\n }\n}\n\nfunction _triggerBackgroundRefresh() {\n if (_loraSyntaxFormatRefreshPromise) {\n return;\n }\n _loraSyntaxFormatRefreshPromise = _fetchLoraSyntaxFormat().finally(() => {\n _loraSyntaxFormatRefreshPromise = null;\n });\n}\n\nasync function refreshLoraSyntaxFormat() {\n await _fetchLoraSyntaxFormat();\n}\n\nfunction _initLoraSyntaxFormat() {\n _triggerBackgroundRefresh();\n}\n_initLoraSyntaxFormat();\n\nfunction _initLoraSyntaxFormatReactive() {\n window.addEventListener('storage', (e) => {\n if (e.key === 'lm:lora-syntax-format-changed') {\n _triggerBackgroundRefresh();\n }\n });\n\n document.addEventListener('visibilitychange', () => {\n if (document.visibilityState === 'visible') {\n _triggerBackgroundRefresh();\n }\n });\n}\n_initLoraSyntaxFormatReactive();\n\nfunction parseSearchTokens(term = '') {\n const include = [];\n const exclude = [];\n\n term.split(/\\s+/).forEach((rawTerm) => {\n const token = rawTerm.trim();\n if (!token) {\n return;\n }\n if (token.startsWith('-') && token.length > 1) {\n exclude.push(token.slice(1).toLowerCase());\n } else {\n include.push(token.toLowerCase());\n }\n });\n\n return { include, exclude };\n}\n\nfunction escapePromptParentheses(text) {\n // In ComfyUI's CLIP text encoder, bare parentheses are weight adjustment syntax.\n // Tags containing literal parentheses must be escaped with backslash to prevent\n // them from being interpreted as weight modifiers. e.g. \"foo (bar)\" → \"foo \\(bar\\)\"\n return text.replace(/\\(/g, '\\\\(').replace(/\\)/g, '\\\\)');\n}\n\nfunction formatAutocompleteInsertion(text = '') {\n const trimmed = typeof text === 'string' ? text.trim() : '';\n if (!trimmed) {\n return '';\n }\n\n return getAutocompleteAppendCommaPreference() ? `${trimmed},` : `${trimmed} `;\n}\n\n// Matches a complete tag. Kept\n// permissive on the strength fields (mirrors the backend parser) so tags\n// are still protected while the user is mid-edit.\nconst LORA_TAG_PATTERN = /(]+:[^:>]+(?::[^:>]+)?>)/gi;\n\nfunction normalizeAutocompleteSegment(segment = '') {\n // Collapse whitespace only outside tags: names inside the tags\n // may legitimately contain repeated spaces (e.g. \"test - 0021\"), and\n // collapsing them breaks file resolution at runtime.\n return segment\n .split(LORA_TAG_PATTERN)\n .map((part, index) => (index % 2 === 1 ? part : part.replace(/\\s+/g, ' ')))\n .join('')\n .trim();\n}\n\nexport function formatAutocompleteTextOnBlur(text = '') {\n if (typeof text !== 'string') {\n return '';\n }\n\n return text\n .split('\\n')\n .map((line) => {\n if (!line.trim()) {\n return '';\n }\n\n const cleanedSegments = line\n .split(',')\n .map(normalizeAutocompleteSegment)\n .filter(Boolean);\n\n return cleanedSegments.join(', ');\n })\n .join('\\n');\n}\n\nfunction shouldAcceptAutocompleteKey(key) {\n const mode = getAutocompleteAcceptKeyPreference();\n\n if (mode === 'tab_only') {\n return key === 'Tab';\n }\n\n if (mode === 'enter_only') {\n return key === 'Enter';\n }\n\n return key === 'Tab' || key === 'Enter';\n}\n\nfunction normalizeAutocompleteMatchText(text = '') {\n return text.toLowerCase().replace(/[-_\\s']/g, '');\n}\n\nconst AUTOCOMPLETE_METADATA_VERSION = 1;\n\nfunction createAutocompleteMetadataBase(textWidgetName = 'text') {\n return {\n version: AUTOCOMPLETE_METADATA_VERSION,\n textWidgetName,\n };\n}\n\nconst AUTOCOMPLETE_METADATA_WIDGET_PREFIX = '__lm_autocomplete_meta_';\nconst LORA_MANAGER_WIDGET_IDS_PROPERTY = '__lm_widget_ids'; // Must match vue-widgets/src/main.ts\n\n/**\n * Return a copy of an autocomplete metadata value without the lastAccepted\n * boundary. lastAccepted carries insertedText/textSnapshot (old prompt text)\n * and is session-only state; it must not leak into exported workflow JSON.\n * Values without lastAccepted are returned as-is.\n *\n * @param {*} value - Widget metadata value (or any other widget value)\n * @returns {*} The stripped copy, or the original value when untouched\n */\nexport function stripAutocompleteLastAccepted(value) {\n if (!value || typeof value !== 'object' || Array.isArray(value)) {\n return value;\n }\n if (!('lastAccepted' in value)) {\n return value;\n }\n const stripped = { ...value };\n delete stripped.lastAccepted;\n return stripped;\n}\n\n/**\n * Strip lastAccepted from autocomplete metadata widgets on a serialized\n * node's widgets_values / widgets_values_named. Array entries are aligned\n * via properties.__lm_widget_ids (written by the extension's onSerialize).\n * Operates on graph.serialize() output, which is already a deep copy.\n *\n * @param {Array} nodes - Serialized node array\n */\nfunction stripAutocompleteMetadataFromNodes(nodes) {\n if (!Array.isArray(nodes)) {\n return;\n }\n\n for (const node of nodes) {\n if (!node || typeof node !== 'object') {\n continue;\n }\n\n const widgetIds = node.properties?.[LORA_MANAGER_WIDGET_IDS_PROPERTY];\n if (Array.isArray(node.widgets_values) && Array.isArray(widgetIds)) {\n for (let i = 0; i < node.widgets_values.length && i < widgetIds.length; i++) {\n if (typeof widgetIds[i] === 'string'\n && widgetIds[i].startsWith(AUTOCOMPLETE_METADATA_WIDGET_PREFIX)) {\n node.widgets_values[i] = stripAutocompleteLastAccepted(node.widgets_values[i]);\n }\n }\n }\n\n const named = node.widgets_values_named;\n if (named && typeof named === 'object') {\n for (const [key, value] of Object.entries(named)) {\n if (key.startsWith(AUTOCOMPLETE_METADATA_WIDGET_PREFIX)) {\n named[key] = stripAutocompleteLastAccepted(value);\n }\n }\n }\n }\n}\n\n/**\n * Strip lastAccepted from autocomplete metadata widgets in a graphToPrompt()\n * result (both the workflow document and the API prompt). Used by the widget\n * bundle to keep exported workflows free of old prompt text while leaving\n * live node state untouched.\n *\n * @param {*} result - graphToPrompt() result: { workflow, output }\n * @returns {*} The same result object, with metadata entries replaced in place\n */\nexport function stripAutocompleteMetadataFromPromptResult(result) {\n if (!result || typeof result !== 'object') {\n return result;\n }\n\n const workflow = result.workflow;\n if (workflow && typeof workflow === 'object') {\n stripAutocompleteMetadataFromNodes(workflow.nodes);\n const subgraphs = workflow.definitions?.subgraphs;\n if (Array.isArray(subgraphs)) {\n for (const subgraph of subgraphs) {\n stripAutocompleteMetadataFromNodes(subgraph?.nodes);\n }\n }\n }\n\n const output = result.output;\n if (output && typeof output === 'object') {\n for (const nodeOutput of Object.values(output)) {\n const inputs = nodeOutput?.inputs;\n if (!inputs || typeof inputs !== 'object') {\n continue;\n }\n for (const [key, value] of Object.entries(inputs)) {\n if (key.startsWith(AUTOCOMPLETE_METADATA_WIDGET_PREFIX)) {\n inputs[key] = stripAutocompleteLastAccepted(value);\n }\n }\n }\n }\n\n return result;\n}\n\nfunction createDefaultBehavior(modelType) {\n return {\n enablePreview: false,\n async getInsertText(_instance, relativePath) {\n const trimmed = relativePath?.trim() ?? '';\n if (!trimmed) {\n return '';\n }\n return formatAutocompleteInsertion(escapePromptParentheses(trimmed));\n },\n };\n}\n\nconst MODEL_BEHAVIORS = {\n loras: {\n enablePreview: true,\n init(instance) {\n if (!instance.options.showPreview) {\n return;\n }\n instance.initPreviewTooltip({ modelType: instance.modelType });\n },\n showPreview(instance, relativePath, itemElement) {\n if (!instance.previewTooltip) {\n return;\n }\n instance.showPreviewForItem(relativePath, itemElement);\n },\n hidePreview(instance) {\n if (!instance.previewTooltip) {\n return;\n }\n instance.previewTooltip.hide();\n },\n destroy(instance) {\n if (instance.previewTooltip) {\n instance.previewTooltip.cleanup();\n instance.previewTooltip = null;\n }\n },\n async getInsertText(_instance, relativePath) {\n const { directories, fileName } = splitRelativePath(relativePath);\n const baseName = removeLoraExtension(fileName);\n const folder = directories.length ? directories.join('/') + '/' : '';\n const loraName = folder + baseName;\n\n const resultName = _getLoraSyntaxFormat() === 'legacy'\n ? baseName\n : loraName;\n\n let strength = 1.0;\n let hasStrength = false;\n let clipStrength = null;\n\n try {\n const response = await api.fetchApi(`/lm/loras/usage-tips-by-path?relative_path=${encodeURIComponent(relativePath)}`);\n if (response.ok) {\n const data = await response.json();\n if (data.success && data.usage_tips) {\n try {\n const usageTips = JSON.parse(data.usage_tips);\n const parsedStrength = parseUsageTipNumber(usageTips.strength);\n if (parsedStrength !== null) {\n strength = parsedStrength;\n hasStrength = true;\n }\n const clipSource = usageTips.clip_strength ?? usageTips.clipStrength;\n const parsedClipStrength = parseUsageTipNumber(clipSource);\n if (parsedClipStrength !== null) {\n clipStrength = parsedClipStrength;\n if (!hasStrength) {\n strength = 1.0;\n }\n }\n } catch (parseError) {\n console.warn('Failed to parse usage tips JSON:', parseError);\n }\n }\n }\n } catch (error) {\n console.warn('Failed to fetch usage tips:', error);\n }\n\n if (clipStrength !== null) {\n return formatAutocompleteInsertion(``);\n }\n return formatAutocompleteInsertion(``);\n }\n },\n embeddings: {\n enablePreview: true,\n init(instance) {\n if (!instance.options.showPreview) {\n return;\n }\n instance.initPreviewTooltip({ modelType: instance.modelType });\n },\n async getInsertText(_instance, relativePath) {\n const { directories, fileName } = splitRelativePath(relativePath);\n const trimmedName = removeGeneralExtension(fileName);\n const folder = directories.length ? `${directories.join('/')}/` : '';\n return formatAutocompleteInsertion(`embedding:${folder}${trimmedName}`);\n },\n },\n custom_words: {\n enablePreview: false,\n async getInsertText(_instance, relativePath) {\n return formatAutocompleteInsertion(escapePromptParentheses(relativePath));\n },\n },\n prompt: {\n enablePreview: true,\n init(instance) {\n if (!instance.options.showPreview) {\n return;\n }\n instance.initPreviewTooltip({ modelType: 'embeddings' });\n },\n showPreview(instance, relativePath, itemElement) {\n if (!instance.previewTooltip || instance.searchType !== 'embeddings') {\n return;\n }\n instance.showPreviewForItem(relativePath, itemElement);\n },\n hidePreview(instance) {\n if (!instance.previewTooltip) {\n return;\n }\n instance.previewTooltip.hide();\n },\n destroy(instance) {\n if (instance.previewTooltip) {\n instance.previewTooltip.cleanup();\n instance.previewTooltip = null;\n }\n },\n async getInsertText(instance, relativePath) {\n const rawSearchTerm = instance.getSearchTerm(instance.inputElement.value);\n const match = rawSearchTerm.match(/^emb:(.*)$/i);\n\n if (match || instance.searchType === 'embeddings') {\n const { directories, fileName } = splitRelativePath(relativePath);\n const trimmedName = removeGeneralExtension(fileName);\n const folder = directories.length ? `${directories.join('/')}/` : '';\n return formatAutocompleteInsertion(`embedding:${folder}${trimmedName}`);\n } else if (instance.searchType === 'wildcards' || isWildcardCommand(instance.activeCommand)) {\n return formatAutocompleteInsertion(getWildcardInsertText(relativePath));\n } else {\n let tagText = relativePath;\n\n if (getTagSpaceReplacementPreference()) {\n tagText = tagText.replace(/_/g, ' ');\n }\n\n tagText = escapePromptParentheses(tagText);\n\n return formatAutocompleteInsertion(tagText);\n }\n },\n },\n};\n\nfunction getModelBehavior(modelType) {\n return MODEL_BEHAVIORS[modelType] ?? createDefaultBehavior(modelType);\n}\n\nclass AutoComplete {\n constructor(inputElement, modelType = 'loras', options = {}) {\n this.inputElement = inputElement;\n this.modelType = modelType;\n this.behavior = getModelBehavior(modelType);\n this.options = {\n maxItems: 100,\n pageSize: 20,\n visibleItems: 15, // Fixed at 15 items for balanced UX\n itemHeight: 40,\n minChars: 1,\n debounceDelay: 200,\n showPreview: this.behavior.enablePreview ?? false,\n enableVirtualScroll: true,\n ...options\n };\n\n this.dropdown = null;\n this.selectedIndex = -1;\n this.hasManualSelection = false;\n this.items = [];\n this.debounceTimer = null;\n this.isVisible = false;\n this.currentSearchTerm = '';\n this.wildcardMeta = null;\n this.previewTooltip = null;\n this.previewTooltipPromise = null;\n this.searchType = null;\n this.suppressAutocompleteOnce = false;\n\n // Discoverability hints state\n this.commandListFooter = null; // State hint shown below the slash command list\n this.firstRunHint = null; // One-time \"how to disable\" bar inside the dropdown\n\n // Virtual scrolling state\n this.virtualScrollOffset = 0;\n this.hasMoreItems = true;\n this.isLoadingMore = false;\n this.currentPage = 0;\n this.scrollContainer = null;\n this.contentContainer = null;\n this.totalHeight = 0;\n\n // Command mode state\n this.activeCommand = null; // Current active command (e.g., { categories: [4, 11], label: 'Character' })\n this.showingCommands = false; // Whether showing command list dropdown\n\n // Initialize TextAreaCaretHelper\n this.helper = new TextAreaCaretHelper(inputElement, () => app.canvas.ds.scale);\n\n this.onInput = null;\n this.onKeyDown = null;\n this.onBlur = null;\n this.onDocumentClick = null;\n this.onScroll = null;\n\n this.init();\n }\n \n init() {\n this.createDropdown();\n this.bindEvents();\n }\n \n createDropdown() {\n this.dropdown = document.createElement('div');\n this.dropdown.className = 'comfy-autocomplete-dropdown';\n\n // Apply new color scheme\n this.dropdown.style.cssText = `\n position: absolute;\n z-index: 10000;\n overflow: hidden;\n background-color: rgba(40, 44, 52, 0.95);\n border: 1px solid rgba(226, 232, 240, 0.2);\n border-radius: 8px;\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3);\n display: none;\n min-width: 200px;\n width: auto;\n backdrop-filter: blur(8px);\n -webkit-backdrop-filter: blur(8px);\n `;\n\n if (this.options.enableVirtualScroll) {\n // Create scroll container for virtual scrolling\n this.scrollContainer = document.createElement('div');\n this.scrollContainer.className = 'comfy-autocomplete-scroll-container';\n this.scrollContainer.style.cssText = `\n overflow-y: auto;\n max-height: ${this.options.visibleItems * this.options.itemHeight}px;\n position: relative;\n `;\n\n // Create content container for virtual items\n this.contentContainer = document.createElement('div');\n this.contentContainer.className = 'comfy-autocomplete-content';\n this.contentContainer.style.cssText = `\n position: relative;\n width: 100%;\n `;\n\n this.scrollContainer.appendChild(this.contentContainer);\n this.dropdown.appendChild(this.scrollContainer);\n }\n\n // Custom scrollbar styles with new color scheme\n const style = document.createElement('style');\n style.textContent = `\n .comfy-autocomplete-dropdown::-webkit-scrollbar {\n width: 8px;\n }\n .comfy-autocomplete-dropdown::-webkit-scrollbar-track {\n background: rgba(40, 44, 52, 0.3);\n border-radius: 4px;\n }\n .comfy-autocomplete-dropdown::-webkit-scrollbar-thumb {\n background: rgba(226, 232, 240, 0.2);\n border-radius: 4px;\n }\n .comfy-autocomplete-dropdown::-webkit-scrollbar-thumb:hover {\n background: rgba(226, 232, 240, 0.4);\n }\n .comfy-autocomplete-scroll-container::-webkit-scrollbar {\n width: 8px;\n }\n .comfy-autocomplete-scroll-container::-webkit-scrollbar-track {\n background: rgba(40, 44, 52, 0.3);\n border-radius: 4px;\n }\n .comfy-autocomplete-scroll-container::-webkit-scrollbar-thumb {\n background: rgba(226, 232, 240, 0.2);\n border-radius: 4px;\n }\n .comfy-autocomplete-scroll-container::-webkit-scrollbar-thumb:hover {\n background: rgba(226, 232, 240, 0.4);\n }\n .comfy-autocomplete-loading {\n padding: 12px;\n text-align: center;\n color: rgba(226, 232, 240, 0.5);\n font-size: 12px;\n }\n `;\n document.head.appendChild(style);\n\n // Append to body to avoid overflow issues\n document.body.appendChild(this.dropdown);\n\n if (typeof this.behavior.init === 'function') {\n this.behavior.init(this);\n }\n }\n \n initPreviewTooltip(options = {}) {\n if (this.previewTooltip || this.previewTooltipPromise) {\n return;\n }\n // Dynamically import and create preview tooltip\n this.previewTooltipPromise = import('./preview_tooltip.js').then(module => {\n const config = { modelType: this.modelType, ...options };\n this.previewTooltip = new module.PreviewTooltip(config);\n }).catch(err => {\n console.warn('Failed to load preview tooltip:', err);\n }).finally(() => {\n this.previewTooltipPromise = null;\n });\n }\n \n bindEvents() {\n // Handle input changes\n this.onInput = (e) => {\n if (this.suppressAutocompleteOnce) {\n this.suppressAutocompleteOnce = false;\n this.hide();\n return;\n }\n this.handleInput(e.target.value);\n };\n this.inputElement.addEventListener('input', this.onInput);\n\n // Handle keyboard navigation\n this.onKeyDown = (e) => {\n this.handleKeyDown(e);\n };\n this.inputElement.addEventListener('keydown', this.onKeyDown);\n\n // Handle focus out to hide dropdown\n this.onBlur = () => {\n if (getAutocompleteAutoFormatPreference()) {\n const formattedValue = formatAutocompleteTextOnBlur(this.inputElement.value);\n if (formattedValue !== this.inputElement.value) {\n this.inputElement.value = formattedValue;\n this.suppressAutocompleteOnce = true;\n this.inputElement.dispatchEvent(new Event('input', { bubbles: true }));\n }\n }\n\n // Delay hiding to allow for clicks on dropdown items\n setTimeout(() => {\n this.hide();\n }, 150);\n };\n this.inputElement.addEventListener('blur', this.onBlur);\n\n // Handle clicks outside to hide dropdown\n this.onDocumentClick = (e) => {\n if (!this.dropdown) {\n return;\n }\n\n const target = e.target;\n if (!(target instanceof Node)) {\n return;\n }\n\n if (!this.dropdown.contains(target) && target !== this.inputElement) {\n this.hide();\n }\n };\n document.addEventListener('click', this.onDocumentClick);\n\n // Mark this element as having autocomplete events bound\n this.inputElement._autocompleteEventsBound = true;\n\n // Bind scroll event for virtual scrolling\n if (this.options.enableVirtualScroll && this.scrollContainer) {\n this.onScroll = () => {\n this.handleScroll();\n };\n this.scrollContainer.addEventListener('scroll', this.onScroll);\n }\n }\n\n /**\n * Check if the autocomplete is valid (input element is in DOM and events are bound)\n */\n isValid() {\n return this.inputElement &&\n document.body.contains(this.inputElement) &&\n this.inputElement._autocompleteEventsBound === true;\n }\n\n /**\n * Check if events need to be rebound (element exists but events not bound)\n */\n needsRebind() {\n return this.inputElement &&\n document.body.contains(this.inputElement) &&\n this.inputElement._autocompleteEventsBound !== true;\n }\n\n /**\n * Rebind events to the input element (useful after Vue moves the element)\n */\n rebindEvents() {\n // Remove old listeners if they exist\n if (this.onInput) {\n this.inputElement.removeEventListener('input', this.onInput);\n }\n if (this.onKeyDown) {\n this.inputElement.removeEventListener('keydown', this.onKeyDown);\n }\n if (this.onBlur) {\n this.inputElement.removeEventListener('blur', this.onBlur);\n }\n\n // Rebind all events\n this.bindEvents();\n\n console.log('[Lora Manager] Autocomplete events rebound');\n }\n\n /**\n * Refresh the TextAreaCaretHelper (useful after element properties change)\n */\n refreshHelper() {\n if (this.inputElement && document.body.contains(this.inputElement)) {\n this.helper = new TextAreaCaretHelper(this.inputElement, () => app.canvas.ds.scale);\n }\n }\n \n handleInput(value = '') {\n // Clear previous debounce timer\n if (this.debounceTimer) {\n clearTimeout(this.debounceTimer);\n }\n\n // Get the search term (text after last comma / '>')\n const rawSearchTerm = this.getSearchTerm(value);\n let searchTerm = rawSearchTerm;\n let endpoint = `/lm/${this.modelType}/relative-paths`;\n\n // For embeddings, only trigger autocomplete when the current token\n // starts with the explicit \"emb:\" prefix. This avoids interrupting\n // normal prompt typing while still allowing quick manual triggering.\n if (this.modelType === 'embeddings') {\n const match = rawSearchTerm.match(/^emb:(.*)$/i);\n if (!match) {\n this.hide();\n return;\n }\n searchTerm = (match[1] || '').trim();\n }\n\n // For loras model type, check if we're in command mode (/activefilters, /noactivefilters)\n if (this.modelType === 'loras') {\n const commandResult = this._parseCommandInput(rawSearchTerm);\n\n if (commandResult.showCommands) {\n // Show command list dropdown\n this.showingCommands = true;\n this.activeCommand = null;\n this.searchType = 'commands';\n this._showCommandList(commandResult.commandFilter);\n return;\n } else if (commandResult.command?.type === 'toggle_setting') {\n // Handle toggle setting command (/activefilters, /noactivefilters)\n this._handleToggleSettingCommand(commandResult.command);\n return;\n } else if (commandResult.command) {\n // Command is active, use filtered search\n this.showingCommands = false;\n this.activeCommand = null;\n this.searchType = null;\n searchTerm = commandResult.searchTerm || rawSearchTerm;\n } else {\n // No command - regular lora search\n this.showingCommands = false;\n this.activeCommand = null;\n this.searchType = null;\n searchTerm = rawSearchTerm;\n }\n }\n\n // For prompt model type, check if we're searching embeddings, commands, or tags\n if (this.modelType === 'prompt') {\n const match = rawSearchTerm.match(/^emb:(.*)$/i);\n if (match) {\n // User typed \"emb:\" prefix - always allow embeddings search\n endpoint = '/lm/embeddings/relative-paths';\n searchTerm = (match[1] || '').trim();\n this.searchType = 'embeddings';\n this.activeCommand = null;\n this.showingCommands = false;\n } else {\n // Check for command mode FIRST (always runs, regardless of setting)\n const commandResult = this._parseCommandInput(rawSearchTerm);\n\n if (commandResult.showCommands) {\n // Show command list dropdown\n this.showingCommands = true;\n this.activeCommand = null;\n this.searchType = 'commands';\n this._showCommandList(commandResult.commandFilter);\n return;\n } else if (commandResult.command?.type === 'toggle_setting') {\n // Handle toggle setting command (/autocomplete, /noautocomplete)\n this._handleToggleSettingCommand(commandResult.command);\n return;\n } else if (commandResult.command) {\n // Command is active, use filtered search\n this.showingCommands = false;\n this.activeCommand = commandResult.command;\n searchTerm = commandResult.searchTerm;\n\n if (commandResult.command.type === 'embedding') {\n // /emb or /embedding command\n endpoint = '/lm/embeddings/relative-paths';\n this.searchType = 'embeddings';\n } else if (isWildcardCommand(commandResult.command)) {\n endpoint = getWildcardSearchEndpoint();\n this.searchType = 'wildcards';\n } else {\n // Category filter command\n const categories = commandResult.command.categories.join(',');\n endpoint = `/lm/custom-words/search?category=${categories}`;\n this.searchType = 'custom_words';\n }\n } else if (getPromptTagAutocompletePreference()) {\n // No command and setting enabled - regular tag search with enriched results\n this.showingCommands = false;\n this.activeCommand = null;\n endpoint = '/lm/custom-words/search?enriched=true';\n // Use full search term for query variation generation\n // The search() method will generate multiple query variations including:\n // - Original query (for natural language matching)\n // - Underscore version (e.g., \"looking_to_the_side\" for \"looking to the side\")\n // - Last token (for backward compatibility with continuous typing)\n searchTerm = rawSearchTerm;\n this.searchType = 'custom_words';\n } else {\n // No command and setting disabled - no autocomplete for direct typing.\n // Re-enable discovery is covered by the command-list footer,\n // the node context menu and the settings tooltip.\n this.hide();\n return;\n }\n }\n }\n\n const allowEmptyWildcardSearch =\n this.modelType === 'prompt' &&\n this.searchType === 'wildcards' &&\n searchTerm.length === 0;\n\n if (!allowEmptyWildcardSearch && searchTerm.length < this.options.minChars) {\n this.hide();\n return;\n }\n\n // Debounce the search\n this.debounceTimer = setTimeout(() => {\n this.search(searchTerm, endpoint);\n }, this.options.debounceDelay);\n }\n \n getSearchTerm(value) {\n return this.getActiveSearchRange(value).text;\n }\n\n getActiveSearchRange(value = null) {\n const currentValue = typeof value === 'string' ? value : this.inputElement.value;\n const caretPos = this.getCaretPosition();\n const beforeCursor = this.helper.getBeforeCursor() ?? currentValue.substring(0, caretPos);\n let start = this._getHardBoundaryStart(beforeCursor);\n\n if (!getAutocompleteAppendCommaPreference()) {\n const persistedBoundaryEnd = this._getPersistedBoundaryEnd(currentValue, caretPos);\n if (persistedBoundaryEnd !== null && persistedBoundaryEnd > start) {\n start = persistedBoundaryEnd;\n }\n }\n\n const rawText = beforeCursor.substring(start);\n const leadingWhitespaceLength = rawText.length - rawText.trimStart().length;\n const trimmedStart = start + leadingWhitespaceLength;\n const text = rawText.trim();\n\n if (this.modelType === 'prompt') {\n const tokenRange = this._getPromptTokenRange(rawText, trimmedStart, caretPos);\n if (tokenRange) {\n return {\n start: tokenRange.start,\n trimmedStart: tokenRange.trimmedStart,\n end: caretPos,\n beforeCursor,\n rawText: tokenRange.rawText,\n text: tokenRange.text,\n tokenType: tokenRange.tokenType,\n };\n }\n }\n\n return {\n start,\n trimmedStart,\n end: caretPos,\n beforeCursor,\n rawText,\n text,\n };\n }\n\n _getPromptTokenRange(rawText = '', trimmedStart = 0, caretPos = 0) {\n const trimmedText = rawText.trim();\n if (!trimmedText) {\n return {\n start: trimmedStart,\n trimmedStart,\n rawText: '',\n text: '',\n tokenType: 'empty',\n };\n }\n\n const commandOffset = trimmedText.startsWith('/')\n ? 0\n : trimmedText.lastIndexOf(' /');\n if (commandOffset !== -1) {\n const normalizedCommandOffset = commandOffset === 0 ? 0 : commandOffset + 1;\n const commandText = trimmedText.slice(normalizedCommandOffset);\n const commandStart = trimmedStart + normalizedCommandOffset;\n return {\n start: commandStart,\n trimmedStart: commandStart,\n rawText: commandText,\n text: commandText,\n tokenType: commandText === '/' ? 'empty_command_trigger' : 'command',\n };\n }\n\n const wildcardMatch = trimmedText.match(/(?:^|\\s)(__[\\w\\s.\\-+/*\\\\]+?__)$/);\n if (wildcardMatch) {\n const wildcardText = wildcardMatch[1];\n const wildcardOffset = trimmedText.lastIndexOf(wildcardText);\n const wildcardStart = trimmedStart + wildcardOffset;\n return {\n start: wildcardStart,\n trimmedStart: wildcardStart,\n rawText: wildcardText,\n text: '',\n tokenType: 'wildcard_literal',\n };\n }\n\n const embeddingOffset = trimmedText.search(/(?:^|\\s)emb:[^\\s]*$/i);\n if (embeddingOffset !== -1) {\n const normalizedEmbeddingOffset = trimmedText.slice(embeddingOffset).startsWith(' ')\n ? embeddingOffset + 1\n : embeddingOffset;\n const embeddingText = trimmedText.slice(normalizedEmbeddingOffset);\n const embeddingStart = trimmedStart + normalizedEmbeddingOffset;\n return {\n start: embeddingStart,\n trimmedStart: embeddingStart,\n rawText: embeddingText,\n text: embeddingText,\n tokenType: 'embedding_literal',\n };\n }\n\n return {\n start: trimmedStart,\n trimmedStart,\n rawText,\n text: trimmedText,\n tokenType: 'tag_text',\n };\n }\n\n _getHardBoundaryStart(beforeCursor = '') {\n const lastComma = beforeCursor.lastIndexOf(',');\n const lastAngle = beforeCursor.lastIndexOf('>');\n const lastNewline = Math.max(beforeCursor.lastIndexOf('\\n'), beforeCursor.lastIndexOf('\\r'));\n return Math.max(lastComma, lastAngle, lastNewline) + 1;\n }\n\n _getMetadataWidget() {\n return this.inputElement?._autocompleteMetadataWidget\n ?? this.inputElement?._autocompleteHostWidget?.metadataWidget\n ?? null;\n }\n\n _getMetadataBase() {\n return createAutocompleteMetadataBase(this.inputElement?._autocompleteTextWidgetName ?? 'text');\n }\n\n _getAutocompleteMetadata() {\n const metadataWidget = this._getMetadataWidget();\n const value = metadataWidget?.value;\n\n if (!value || typeof value !== 'object' || Array.isArray(value)) {\n return this._getMetadataBase();\n }\n\n return {\n ...this._getMetadataBase(),\n ...value,\n };\n }\n\n _setAutocompleteMetadata(metadata = {}) {\n const metadataWidget = this._getMetadataWidget();\n if (!metadataWidget) {\n return;\n }\n\n metadataWidget.value = {\n ...this._getMetadataBase(),\n ...metadata,\n };\n }\n\n _clearLastAcceptedBoundary() {\n const metadataWidget = this._getMetadataWidget();\n if (!metadataWidget) {\n return;\n }\n\n const metadata = this._getAutocompleteMetadata();\n delete metadata.lastAccepted;\n metadataWidget.value = metadata;\n }\n\n _storeLastAcceptedBoundary(boundary) {\n this._setAutocompleteMetadata({ lastAccepted: boundary });\n }\n\n _getPersistedBoundaryEnd(currentValue, caretPos) {\n const metadata = this._getAutocompleteMetadata();\n const boundary = metadata?.lastAccepted;\n\n if (!boundary || typeof boundary !== 'object') {\n return null;\n }\n\n const { start, end, insertedText, textSnapshot } = boundary;\n\n if (!Number.isInteger(start) || !Number.isInteger(end) || start < 0 || end < start) {\n this._clearLastAcceptedBoundary();\n return null;\n }\n\n if (end > currentValue.length || end > caretPos) {\n this._clearLastAcceptedBoundary();\n return null;\n }\n\n if (typeof insertedText !== 'string' || insertedText.length === 0) {\n this._clearLastAcceptedBoundary();\n return null;\n }\n\n if (currentValue.slice(start, end) !== insertedText) {\n this._clearLastAcceptedBoundary();\n return null;\n }\n\n if (typeof textSnapshot !== 'string' || currentValue.slice(0, end) !== textSnapshot) {\n this._clearLastAcceptedBoundary();\n return null;\n }\n\n return end;\n }\n\n /**\n * Extract the last space-separated token from a search term\n * Tag names don't contain spaces, so for tag autocomplete we only need the last token\n * @param {string} term - The full search term (e.g., \"hello 1gi\")\n * @returns {string} - The last token (e.g., \"1gi\"), or the original term if no spaces\n */\n _getLastSpaceToken(term) {\n const tokens = term.trim().split(/\\s+/);\n return tokens[tokens.length - 1] || term;\n }\n\n /**\n * Generate query variations for better autocomplete matching\n * Includes original query and normalized versions (spaces to underscores, etc.)\n * @param {string} term - Original search term\n * @returns {string[]} - Array of query variations\n */\n _generateQueryVariations(term) {\n if (!term || term.length < this.options.minChars) {\n return [];\n }\n\n const variations = new Set();\n const trimmed = term.trim();\n\n // Always include original query\n variations.add(trimmed);\n variations.add(trimmed.toLowerCase());\n\n // Add underscore version (Danbooru convention: spaces become underscores)\n // e.g., \"looking to the side\" -> \"looking_to_the_side\"\n if (trimmed.includes(' ')) {\n const underscoreVersion = trimmed.replace(/ /g, '_');\n variations.add(underscoreVersion);\n variations.add(underscoreVersion.toLowerCase());\n }\n\n // Add no-space version for flexible matching\n // e.g., \"blue hair\" -> \"bluehair\"\n if (trimmed.includes(' ') || trimmed.includes('_')) {\n const noSpaceVersion = trimmed.replace(/[ _]/g, '');\n variations.add(noSpaceVersion);\n variations.add(noSpaceVersion.toLowerCase());\n }\n\n // Add last token only (legacy behavior for continuous typing)\n const lastToken = this._getLastSpaceToken(trimmed);\n if (lastToken !== trimmed) {\n variations.add(lastToken);\n variations.add(lastToken.toLowerCase());\n }\n\n return Array.from(variations).filter(v => v.length >= this.options.minChars);\n }\n\n _normalizeQueryForRequest(term = '') {\n return term.trim().toLowerCase();\n }\n\n _getQueriesToExecute(term = '') {\n const queryVariations = this._generateQueryVariations(term);\n const uniqueQueries = [];\n const seen = new Set();\n\n for (const query of queryVariations) {\n const normalized = this._normalizeQueryForRequest(query);\n if (!normalized || seen.has(normalized)) {\n continue;\n }\n\n seen.add(normalized);\n uniqueQueries.push(query);\n\n if (uniqueQueries.length >= 4) {\n break;\n }\n }\n\n return uniqueQueries;\n }\n\n _containsInformationalItems() {\n return this.items.some((item) => isWildcardInfoItem(item));\n }\n\n _isSelectableInfoItem(item) {\n if (isWildcardInfoItem(item)) {\n return true;\n }\n // Command items are not model paths — never show preview for them\n return item && typeof item === 'object' && 'command' in item;\n }\n\n /**\n * Get display text for an item (without extension for models)\n * @param {string|Object} item - Item to get display text from\n * @returns {string} - Display text without extension\n */\n _getDisplayText(item) {\n if (isWildcardInfoItem(item)) {\n return item.title || item.description || 'Wildcards';\n }\n\n const itemText = typeof item === 'object' && item.tag_name ? item.tag_name : String(item);\n // Remove extension for models to avoid matching/displaying .safetensors etc.\n if (this.modelType === 'loras' || this.searchType === 'embeddings') {\n return removeLoraExtension(itemText);\n } else if (this.modelType === 'embeddings') {\n return removeGeneralExtension(itemText);\n }\n return itemText;\n }\n\n /**\n * Check if an item matches a search term\n * Supports both string items and enriched items with tag_name property\n * @param {string|Object} item - Item to check\n * @param {string} searchTerm - Search term to match against\n * @returns {Object} - { matched: boolean, isExactMatch: boolean }\n */\n _matchItem(item, searchTerm) {\n const itemText = this._getDisplayText(item);\n const itemTextLower = itemText.toLowerCase();\n const searchTermLower = searchTerm.toLowerCase();\n\n // Exact match (case-insensitive)\n if (itemTextLower === searchTermLower) {\n return { matched: true, isExactMatch: true };\n }\n\n // Partial match (contains)\n if (itemTextLower.includes(searchTermLower)) {\n return { matched: true, isExactMatch: false };\n }\n\n // Symbol-insensitive match: remove common separators and retry\n // e.g., \"blue hair\" can match \"blue_hair\" or \"bluehair\"\n const normalizedItem = itemTextLower.replace(/[-_\\s']/g, '');\n const normalizedSearch = searchTermLower.replace(/[-_\\s']/g, '');\n if (normalizedItem.includes(normalizedSearch)) {\n return { matched: true, isExactMatch: false };\n }\n\n return { matched: false, isExactMatch: false };\n }\n\n _getLiveSearchTermForAcceptance() {\n const rawSearchTerm = this.getSearchTerm(this.inputElement.value);\n\n if (this.modelType === 'embeddings') {\n const match = rawSearchTerm.match(/^emb:(.*)$/i);\n return (match?.[1] || '').trim();\n }\n\n if (this.modelType === 'loras') {\n const commandResult = this._parseCommandInput(rawSearchTerm);\n return commandResult.searchTerm ?? rawSearchTerm;\n }\n\n if (this.modelType === 'prompt') {\n const embeddingMatch = rawSearchTerm.match(/^emb:(.*)$/i);\n if (embeddingMatch) {\n return (embeddingMatch[1] || '').trim();\n }\n\n const commandResult = this._parseCommandInput(rawSearchTerm);\n return commandResult.searchTerm ?? rawSearchTerm;\n }\n\n return rawSearchTerm;\n }\n\n _getPreferredSelectedIndex(searchTerm = '') {\n if (!this.items?.length) {\n return -1;\n }\n\n if (this.showingCommands) {\n if (this.selectedIndex >= 0 && this.selectedIndex < this.items.length) {\n return this.selectedIndex;\n }\n return 0;\n }\n\n const trimmedSearchTerm = searchTerm.trim();\n if (!trimmedSearchTerm) {\n if (this.selectedIndex >= 0 && this.selectedIndex < this.items.length) {\n return this.selectedIndex;\n }\n return 0;\n }\n\n const searchLower = trimmedSearchTerm.toLowerCase();\n const normalizedSearch = normalizeAutocompleteMatchText(trimmedSearchTerm);\n let bestIndex = -1;\n let bestScore = -Infinity;\n\n this.items.forEach((item, index) => {\n const displayText = this._getDisplayText(item);\n const textLower = displayText.toLowerCase();\n const normalizedText = normalizeAutocompleteMatchText(displayText);\n let score = -1;\n\n if (textLower === searchLower) {\n score = 5000;\n } else if (normalizedText === normalizedSearch) {\n score = 4500;\n } else if (textLower.startsWith(searchLower)) {\n score = 4000;\n } else if (normalizedText.startsWith(normalizedSearch)) {\n score = 3500;\n } else if (textLower.includes(searchLower)) {\n score = 3000;\n } else if (normalizedText.includes(normalizedSearch)) {\n score = 2500;\n }\n\n if (score > -1) {\n score -= index;\n if (score > bestScore) {\n bestScore = score;\n bestIndex = index;\n }\n }\n });\n\n if (bestIndex !== -1) {\n return bestIndex;\n }\n\n if (this.selectedIndex >= 0 && this.selectedIndex < this.items.length) {\n return this.selectedIndex;\n }\n\n return 0;\n }\n\n _getAcceptSelectionIndex(searchTerm = '') {\n if (this.hasManualSelection && this.selectedIndex >= 0 && this.selectedIndex < this.items.length) {\n return this.selectedIndex;\n }\n\n return this._getPreferredSelectedIndex(searchTerm);\n }\n\n /**\n * Return the query flag that tells the backend to inject the LoRA Manager\n * page's active filters (stored server-side) into the search, or null when\n * not applicable. The filters themselves are synced to the backend by the\n * manager page, so this works across browsers/origins where localStorage\n * is not shared.\n */\n _getActiveLoraFilters() {\n if (this.modelType !== 'loras' || !getLoraActiveFiltersAutocompletePreference()) {\n return null;\n }\n return 'use_active_filters=true';\n }\n\n async search(term = '', endpoint = null) {\n try {\n this.currentSearchTerm = term;\n\n // Save current search type to detect mode changes during async search\n const searchTypeAtStart = this.searchType;\n\n // Clear items before starting new search to avoid stale data\n // This is critical for preventing command suggestions from persisting\n // when switching from command mode to regular tag search\n this.items = [];\n this.wildcardMeta = null;\n\n if (!endpoint) {\n endpoint = `/lm/${this.modelType}/relative-paths`;\n }\n\n // Active-filter query params for loras (null when setting off or\n // model type is not loras, so appending is safe for all types)\n const activeFiltersQuery = this._getActiveLoraFilters();\n\n // Generate multiple query variations for better matching, but avoid\n // sending duplicate-equivalent requests that normalize to the same\n // backend search term.\n const queriesToExecute =\n this.searchType === 'wildcards' && term.length === 0\n ? ['']\n : this._getQueriesToExecute(term);\n\n if (queriesToExecute.length === 0) {\n this.items = [];\n this.hide();\n return;\n }\n\n // Execute all queries in parallel\n const searchPromises = queriesToExecute.map(async (query) => {\n const url = endpoint.includes('?')\n ? `${endpoint}&search=${encodeURIComponent(query)}&limit=${this.options.maxItems}`\n : `${endpoint}?search=${encodeURIComponent(query)}&limit=${this.options.maxItems}`;\n const finalUrl = activeFiltersQuery ? `${url}&${activeFiltersQuery}` : url;\n\n try {\n const response = await api.fetchApi(finalUrl);\n const data = await response.json();\n return {\n items: data.success ? (data.relative_paths || data.words || []) : [],\n meta: data?.meta || null,\n };\n } catch (error) {\n console.warn(`Search query failed for \"${query}\":`, error);\n return {\n items: [],\n meta: null,\n };\n }\n });\n\n const resultsArrays = await Promise.all(searchPromises);\n\n // Check if search type changed during async operation\n // If so, skip updating items to prevent stale data from showing\n if (this.searchType !== searchTypeAtStart) {\n console.log('[Lora Manager] Search type changed during search, skipping update');\n return;\n }\n\n // Merge and deduplicate results while preserving order from backend\n // Backend returns results grouped by folder and sorted by relevance\n // within each group, so we maintain that order\n const seen = new Set();\n const mergedItems = [];\n\n for (const result of resultsArrays) {\n if (!this.wildcardMeta && result?.meta) {\n this.wildcardMeta = result.meta;\n }\n\n const resultArray = result?.items || [];\n for (const item of resultArray) {\n const itemKey = typeof item === 'object' && item.tag_name\n ? item.tag_name.toLowerCase()\n : String(item).toLowerCase();\n\n if (!seen.has(itemKey)) {\n seen.add(itemKey);\n mergedItems.push(item);\n }\n }\n }\n\n if (this.searchType === 'wildcards' && mergedItems.length === 0) {\n const meta = this.wildcardMeta || {};\n this.items = meta.has_wildcards\n ? [createWildcardNoMatchesItem(term, meta)]\n : [createWildcardEmptyStateItem(meta)];\n this.hasMoreItems = false;\n this.render();\n this.show();\n return;\n }\n\n // Use backend-sorted results directly without re-scoring\n // Backend already ranks by: FTS5 bm25 score + post count + exact prefix boost\n if (mergedItems.length > 0) {\n this.items = mergedItems;\n this.render();\n this.show();\n } else {\n this.items = [];\n this.hide();\n }\n } catch (error) {\n console.error('Autocomplete search error:', error);\n this.items = [];\n this.hide();\n }\n }\n\n /**\n * Return the command map for the current model type.\n * Lora model types get the active-filters toggle commands, all others\n * keep the prompt tag commands.\n */\n _getCommands() {\n return this.modelType === 'loras' ? LORAS_COMMANDS : TAG_COMMANDS;\n }\n\n /**\n * Parse command input to detect command mode\n * @param {string} rawInput - Raw input text\n * @returns {Object} - { showCommands, commandFilter, command, searchTerm }\n */\n _parseCommandInput(rawInput) {\n const trimmed = rawInput.trim();\n\n // Check if input starts with \"/\"\n if (!trimmed.startsWith('/')) {\n return { showCommands: false, command: null, searchTerm: trimmed };\n }\n\n // Split into potential command and search term\n const spaceIndex = trimmed.indexOf(' ');\n\n if (spaceIndex === -1) {\n // Still typing command (e.g., \"/cha\")\n const partialCommand = trimmed.toLowerCase();\n\n // Check for exact command match\n if (this._getCommands()[partialCommand]) {\n const cmd = this._getCommands()[partialCommand];\n // Filter out toggle commands that don't meet their condition\n if (cmd.type === 'toggle_setting' && cmd.condition && !cmd.condition()) {\n return { showCommands: false, command: null, searchTerm: '' };\n }\n return {\n showCommands: false,\n command: cmd,\n searchTerm: '',\n };\n }\n\n // Show command suggestions\n return {\n showCommands: true,\n commandFilter: partialCommand.slice(1), // Remove leading \"/\"\n command: null,\n searchTerm: '',\n };\n }\n\n // Command with search term (e.g., \"/character miku\")\n const commandPart = trimmed.slice(0, spaceIndex).toLowerCase();\n const searchPart = trimmed.slice(spaceIndex + 1).trim();\n\n if (this._getCommands()[commandPart]) {\n const cmd = this._getCommands()[commandPart];\n // Filter out toggle commands that don't meet their condition\n if (cmd.type === 'toggle_setting' && cmd.condition && !cmd.condition()) {\n return { showCommands: false, command: null, searchTerm: trimmed };\n }\n return {\n showCommands: false,\n command: cmd,\n searchTerm: searchPart,\n };\n }\n\n // Unknown command, treat as regular search\n return { showCommands: false, command: null, searchTerm: trimmed };\n }\n\n /**\n * Show the command list dropdown\n * @param {string} filter - Optional filter for commands\n */\n _showCommandList(filter = '') {\n // Only show command list if we're in command mode\n // This prevents stale command suggestions from appearing after switching to tag search\n if (this.searchType !== 'commands' && this.showingCommands !== true) {\n return;\n }\n \n const filterLower = filter.toLowerCase();\n\n const commands = [];\n\n for (const [cmd, info] of Object.entries(this._getCommands())) {\n // Filter out toggle commands that don't meet their condition\n if (info.type === 'toggle_setting' && info.condition) {\n if (!info.condition()) continue;\n }\n\n if (!filter || cmd.slice(1).startsWith(filterLower)) {\n commands.push({ command: cmd, ...info });\n }\n }\n\n if (commands.length === 0) {\n this.hide();\n return;\n }\n\n this.items = commands;\n this._renderCommandList();\n this.show();\n }\n\n /**\n * Render the command list dropdown\n */\n _renderCommandList() {\n // Clear command list items properly based on rendering mode\n if (this.contentContainer) {\n // Virtual scrolling mode - clear content container\n this.contentContainer.innerHTML = '';\n } else {\n // Non-virtual scrolling mode - clear dropdown direct children\n this.dropdown.innerHTML = '';\n }\n this.selectedIndex = -1;\n this.hasManualSelection = false;\n\n this.items.forEach((item, index) => {\n const itemEl = document.createElement('div');\n itemEl.className = 'comfy-autocomplete-item comfy-autocomplete-command';\n itemEl.dataset.index = index.toString();\n\n const cmdSpan = document.createElement('span');\n cmdSpan.className = 'lm-autocomplete-command-name';\n cmdSpan.textContent = item.command;\n\n const labelSpan = document.createElement('span');\n labelSpan.className = 'lm-autocomplete-command-label';\n labelSpan.textContent = item.label;\n\n itemEl.appendChild(cmdSpan);\n itemEl.appendChild(labelSpan);\n\n itemEl.style.cssText = `\n padding: 8px 12px;\n cursor: pointer;\n color: rgba(226, 232, 240, 0.8);\n border-bottom: 1px solid rgba(226, 232, 240, 0.1);\n transition: all 0.2s ease;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n display: flex;\n justify-content: space-between;\n align-items: center;\n gap: 12px;\n height: ${this.options.itemHeight}px;\n box-sizing: border-box;\n `;\n\n // Prevent textarea from losing focus - same fix as createItemElement\n itemEl.addEventListener('mousedown', (e) => {\n e.preventDefault();\n });\n\n itemEl.addEventListener('mouseenter', () => {\n this.selectItem(index, { manual: true });\n });\n\n itemEl.addEventListener('click', () => {\n this._insertCommand(item.command);\n });\n\n // Append to correct container based on rendering mode\n if (this.contentContainer) {\n this.contentContainer.appendChild(itemEl);\n } else {\n this.dropdown.appendChild(itemEl);\n }\n });\n\n // Remove border from last item\n const lastChild = this.contentContainer ? this.contentContainer.lastChild : this.dropdown.lastChild;\n if (lastChild) {\n lastChild.style.borderBottom = 'none';\n }\n\n // Auto-select immediately so accept keys remain stable.\n // In virtual-scroll mode, calling selectItem() before the dropdown is\n // visible can see a zero-height container and incorrectly replace the\n // full command list with a partially virtualized slice.\n if (this.items.length > 0) {\n this.selectedIndex = 0;\n this.hasManualSelection = false;\n if (this.contentContainer) {\n this._applyItemSelection(0);\n } else {\n this.selectItem(0);\n }\n }\n\n // State hint below the command list (e.g. how to toggle autocomplete)\n this._renderCommandListFooter();\n\n // Update virtual scroll height for virtual scrolling mode\n if (this.contentContainer) {\n this.updateVirtualScrollHeight();\n }\n }\n\n /**\n * Render a state hint below the slash command list so the toggle commands\n * explain themselves. Prompt nodes advertise /autocomplete, loras nodes\n * advertise /activefilters.\n */\n _renderCommandListFooter() {\n this._removeCommandListFooter();\n\n let text = null;\n if (this.modelType === 'prompt') {\n const enabled = getPromptTagAutocompletePreference();\n text = enabled\n ? 'Tag autocomplete is ON — /noautocomplete to disable'\n : 'Tag autocomplete is OFF — /autocomplete to enable';\n } else if (this.modelType === 'loras') {\n const enabled = getLoraActiveFiltersAutocompletePreference();\n text = enabled\n ? 'Active Filters Search: ON — /noactivefilters to disable'\n : 'Active Filters Search: OFF — /activefilters to enable';\n } else {\n return;\n }\n\n const footer = document.createElement('div');\n footer.className = 'lm-autocomplete-command-footer';\n footer.textContent = text;\n footer.style.cssText = `\n padding: 6px 12px;\n font-size: 11px;\n color: rgba(226, 232, 240, 0.5);\n border-top: 1px solid rgba(226, 232, 240, 0.1);\n white-space: nowrap;\n `;\n // Keep focus in the textarea when the hint is clicked\n footer.addEventListener('mousedown', (e) => e.preventDefault());\n\n this.dropdown.appendChild(footer);\n this.commandListFooter = footer;\n }\n\n _removeCommandListFooter() {\n if (this.commandListFooter) {\n this.commandListFooter.remove();\n this.commandListFooter = null;\n }\n }\n\n /**\n * Show a one-time, dismissible hint inside the dropdown surfacing the\n * toggle commands: prompt nodes advertise /noautocomplete, loras nodes\n * advertise /activefilters. Dismissal is persisted in localStorage.\n */\n _maybeShowFirstRunHint() {\n if (this.firstRunHint) {\n return;\n }\n\n let hintText = null;\n let storageKey = null;\n\n if (this.modelType === 'prompt') {\n // Only hint during plain tag searches, not command/embedding modes\n if (this.showingCommands\n || this.searchType !== 'custom_words'\n || this.activeCommand) {\n return;\n }\n hintText = 'Tip: type /noautocomplete to turn off these suggestions';\n storageKey = FIRST_RUN_HINT_DISMISSED_KEY;\n } else if (this.modelType === 'loras') {\n // Only advertise active-filters search while it is disabled\n if (this.showingCommands || this.activeCommand) {\n return;\n }\n if (getLoraActiveFiltersAutocompletePreference()) {\n return;\n }\n hintText = 'Tip: type /activefilters to search within the LoRA Manager page filters';\n storageKey = ACTIVE_FILTERS_HINT_DISMISSED_KEY;\n } else {\n return;\n }\n\n let dismissed = false;\n try {\n dismissed = localStorage.getItem(storageKey) === '1';\n } catch (e) {\n // localStorage unavailable - fall through and show the hint\n }\n if (dismissed) {\n return;\n }\n\n const hint = document.createElement('div');\n hint.className = 'lm-autocomplete-first-run-hint';\n hint.style.cssText = `\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 8px;\n padding: 6px 12px;\n font-size: 11px;\n color: rgba(226, 232, 240, 0.6);\n border-bottom: 1px solid rgba(226, 232, 240, 0.1);\n `;\n\n const text = document.createElement('span');\n text.textContent = hintText;\n\n const closeBtn = document.createElement('button');\n closeBtn.type = 'button';\n closeBtn.textContent = '×';\n closeBtn.title = 'Dismiss';\n closeBtn.style.cssText = `\n background: none;\n border: none;\n color: rgba(226, 232, 240, 0.5);\n cursor: pointer;\n font-size: 14px;\n line-height: 1;\n padding: 0 2px;\n `;\n closeBtn.addEventListener('click', () => {\n try {\n localStorage.setItem(storageKey, '1');\n } catch (e) {\n }\n this._removeFirstRunHint();\n });\n\n hint.appendChild(text);\n hint.appendChild(closeBtn);\n // Keep focus in the textarea when interacting with the hint\n hint.addEventListener('mousedown', (e) => e.preventDefault());\n\n this.dropdown.insertBefore(hint, this.dropdown.firstChild);\n this.firstRunHint = hint;\n }\n\n _removeFirstRunHint() {\n if (this.firstRunHint) {\n this.firstRunHint.remove();\n this.firstRunHint = null;\n }\n }\n\n /**\n * Insert a command into the input\n * @param {string} command - The command to insert (e.g., \"/character\")\n */\n _insertCommand(command) {\n const currentValue = this.inputElement.value;\n const activeRange = this.getActiveSearchRange(currentValue);\n const commandStartPos = activeRange.trimmedStart;\n\n // Insert command with trailing space\n const insertText = command + ' ';\n const newValue = currentValue.substring(0, commandStartPos) + insertText + currentValue.substring(activeRange.end);\n const newCaretPos = commandStartPos + insertText.length;\n\n this.inputElement.value = newValue;\n\n // Trigger input event\n const event = new Event('input', { bubbles: true });\n this.inputElement.dispatchEvent(event);\n\n this.hide();\n\n // Focus and position cursor\n this.inputElement.focus();\n this.inputElement.setSelectionRange(newCaretPos, newCaretPos);\n }\n\n render() {\n this.selectedIndex = -1;\n this.hasManualSelection = false;\n\n // Command-list state hints do not belong to regular search results\n this._removeCommandListFooter();\n\n // Reset virtual scroll state\n this.virtualScrollOffset = 0;\n this.currentPage = 0;\n this.hasMoreItems = true;\n this.isLoadingMore = false;\n\n // Early return if no items to prevent empty dropdown\n if (!this.items || this.items.length === 0) {\n if (this.contentContainer) {\n this.contentContainer.innerHTML = '';\n } else {\n this.dropdown.innerHTML = '';\n }\n return;\n }\n\n if (this.options.enableVirtualScroll && this.contentContainer) {\n // Use virtual scrolling - always update visible items to ensure content is fresh\n // The dropdown visibility is controlled by show()/hide()\n this.updateVirtualScrollHeight();\n this.updateVisibleItems();\n } else {\n // Traditional rendering (fallback)\n this.dropdown.innerHTML = '';\n\n // Check if items are enriched (have tag_name, category, post_count) or command objects\n const isEnriched = this.items[0] && typeof this.items[0] === 'object' && 'tag_name' in this.items[0];\n const isCommand = this.items[0] && typeof this.items[0] === 'object' && 'command' in this.items[0];\n\n this.items.forEach((itemData, index) => {\n const item = this.createItemElement(itemData, index, isEnriched, isCommand);\n this.dropdown.appendChild(item);\n });\n\n // Remove border from last item\n if (this.dropdown.lastChild) {\n this.dropdown.lastChild.style.borderBottom = 'none';\n }\n }\n\n // Auto-select immediately so accept keys do not fall through\n // to native focus traversal while the dropdown is visible.\n if (this.items.length > 0) {\n this.selectItem(0);\n }\n }\n\n /**\n * Render an enriched autocomplete item with category badge and post count\n * @param {HTMLElement} itemEl - The item element to populate\n * @param {Object} itemData - The enriched item data { tag_name, category, post_count, matched_alias? }\n * @param {string} searchTerm - The current search term for highlighting\n */\n _renderEnrichedItem(itemEl, itemData, searchTerm) {\n // Create name span with highlighted match\n const nameSpan = document.createElement('span');\n nameSpan.className = 'lm-autocomplete-name';\n\n // If matched via alias, show: \"tag_name ← alias\" with alias highlighted\n if (itemData.matched_alias) {\n const tagText = document.createTextNode(itemData.tag_name + ' ');\n nameSpan.appendChild(tagText);\n\n const aliasSpan = document.createElement('span');\n aliasSpan.className = 'lm-matched-alias';\n aliasSpan.innerHTML = '← ' + this.highlightMatch(itemData.matched_alias, searchTerm);\n aliasSpan.style.cssText = `\n font-size: 11px;\n color: rgba(226, 232, 240, 0.5);\n `;\n nameSpan.appendChild(aliasSpan);\n } else {\n nameSpan.innerHTML = this.highlightMatch(itemData.tag_name, searchTerm);\n }\n\n nameSpan.style.cssText = `\n flex: 1;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n `;\n\n // Create meta container for count and badge\n const metaSpan = document.createElement('span');\n metaSpan.className = 'lm-autocomplete-meta';\n metaSpan.style.cssText = `\n display: flex;\n align-items: center;\n gap: 8px;\n flex-shrink: 0;\n `;\n\n // Add post count\n if (itemData.post_count > 0) {\n const countSpan = document.createElement('span');\n countSpan.className = 'lm-autocomplete-count';\n countSpan.textContent = formatPostCount(itemData.post_count);\n countSpan.style.cssText = `\n font-size: 11px;\n color: rgba(226, 232, 240, 0.5);\n `;\n metaSpan.appendChild(countSpan);\n }\n\n // Add category badge\n const categoryInfo = CATEGORY_INFO[itemData.category];\n if (categoryInfo) {\n const badgeSpan = document.createElement('span');\n badgeSpan.className = 'lm-autocomplete-category';\n badgeSpan.textContent = categoryInfo.label;\n badgeSpan.style.cssText = `\n font-size: 10px;\n padding: 2px 6px;\n border-radius: 10px;\n background: ${categoryInfo.bg};\n color: ${categoryInfo.text};\n white-space: nowrap;\n `;\n metaSpan.appendChild(badgeSpan);\n }\n\n itemEl.appendChild(nameSpan);\n itemEl.appendChild(metaSpan);\n }\n\n _renderInformationalItem(itemEl, itemData) {\n itemEl.classList.add('comfy-autocomplete-info-item');\n itemEl.style.cssText = `\n padding: 12px;\n color: rgba(226, 232, 240, 0.88);\n border-bottom: none;\n cursor: default;\n display: block;\n white-space: normal;\n height: auto;\n `;\n\n const title = document.createElement('div');\n title.className = 'lm-autocomplete-info-title';\n title.textContent = itemData.title || 'Wildcards';\n title.style.cssText = `\n font-size: 13px;\n font-weight: 600;\n margin-bottom: 6px;\n `;\n itemEl.appendChild(title);\n\n const description = document.createElement('div');\n description.className = 'lm-autocomplete-info-description';\n description.textContent = itemData.description || '';\n description.style.cssText = `\n font-size: 12px;\n line-height: 1.45;\n color: rgba(226, 232, 240, 0.72);\n `;\n itemEl.appendChild(description);\n\n if (itemData.type === 'wildcard_no_matches') {\n return;\n }\n\n const pathBlock = document.createElement('div');\n pathBlock.style.cssText = `\n margin-top: 10px;\n padding: 8px 10px;\n border-radius: 6px;\n background: rgba(15, 23, 42, 0.6);\n font-size: 11px;\n line-height: 1.5;\n `;\n pathBlock.innerHTML = [\n '
Wildcards folder
',\n `${itemData.wildcardsDir || '(unavailable)'}`,\n `
Supported formats: ${(itemData.supportedFormats || []).join(', ')}
`,\n ].join('');\n itemEl.appendChild(pathBlock);\n\n const examples = document.createElement('div');\n examples.style.cssText = `\n margin-top: 10px;\n font-size: 11px;\n line-height: 1.55;\n color: rgba(226, 232, 240, 0.72);\n `;\n examples.innerHTML = [\n '
Examples
',\n '
animals/cat.txt -> use __animals/cat__
',\n '
colors.yaml with palette: { warm: [red, orange] } -> use __palette/warm__
',\n '
Text files use one option per line. YAML/JSON use nested keys ending in string arrays.
',\n ].join('');\n itemEl.appendChild(examples);\n\n const actions = document.createElement('div');\n actions.style.cssText = `\n display: flex;\n gap: 8px;\n margin-top: 12px;\n flex-wrap: wrap;\n `;\n\n const openButton = document.createElement('button');\n openButton.type = 'button';\n openButton.dataset.action = 'open-wildcards-folder';\n openButton.textContent = 'Open wildcards folder';\n openButton.style.cssText = `\n border: 1px solid rgba(96, 165, 250, 0.45);\n background: rgba(37, 99, 235, 0.18);\n color: #dbeafe;\n border-radius: 6px;\n padding: 6px 10px;\n font-size: 11px;\n cursor: pointer;\n `;\n openButton.addEventListener('click', async (event) => {\n event.preventDefault();\n event.stopPropagation();\n await this._openWildcardsFolder();\n });\n actions.appendChild(openButton);\n\n const copyButton = document.createElement('button');\n copyButton.type = 'button';\n copyButton.dataset.action = 'copy-wildcards-path';\n copyButton.textContent = 'Copy path';\n copyButton.style.cssText = `\n border: 1px solid rgba(226, 232, 240, 0.2);\n background: rgba(148, 163, 184, 0.12);\n color: rgba(226, 232, 240, 0.88);\n border-radius: 6px;\n padding: 6px 10px;\n font-size: 11px;\n cursor: pointer;\n `;\n copyButton.addEventListener('click', async (event) => {\n event.preventDefault();\n event.stopPropagation();\n await this._copyWildcardPath(itemData.wildcardsDir || '');\n });\n actions.appendChild(copyButton);\n\n itemEl.appendChild(actions);\n }\n \n highlightMatch(text, searchTerm) {\n const { include } = parseSearchTokens(searchTerm);\n const sanitizedTokens = include\n .filter(Boolean)\n .map((token) => token.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&'));\n\n if (!sanitizedTokens.length) {\n return text;\n }\n\n const regex = new RegExp(`(${sanitizedTokens.join('|')})`, 'gi');\n return text.replace(\n regex,\n '$1',\n );\n }\n\n async _openWildcardsFolder() {\n try {\n const response = await api.fetchApi('/lm/wildcards/open-location', { method: 'POST' });\n const data = await response.json();\n if (!response.ok || data?.success === false) {\n throw new Error(data?.error || 'Failed to open wildcards folder');\n }\n\n if (data?.mode === 'clipboard' && data?.path) {\n await this._copyWildcardPath(data.path);\n return;\n }\n\n showToast({\n severity: 'success',\n summary: 'Wildcards folder',\n detail: 'Opened wildcards folder.',\n life: 2500,\n });\n } catch (error) {\n console.error('[Lora Manager] Failed to open wildcards folder:', error);\n showToast({\n severity: 'error',\n summary: 'Error',\n detail: error?.message || 'Failed to open wildcards folder',\n life: 3000,\n });\n }\n }\n\n async _copyWildcardPath(path) {\n if (!path) {\n return;\n }\n\n try {\n if (navigator?.clipboard?.writeText) {\n await navigator.clipboard.writeText(path);\n }\n showToast({\n severity: 'info',\n summary: 'Wildcards path',\n detail: path,\n life: 3000,\n });\n } catch (error) {\n console.error('[Lora Manager] Failed to copy wildcards path:', error);\n showToast({\n severity: 'warn',\n summary: 'Wildcards path',\n detail: path,\n life: 4000,\n });\n }\n }\n \n showPreviewForItem(relativePath, itemElement) {\n if (!this.options.showPreview || !this.previewTooltip) return;\n if (typeof relativePath !== 'string' || !relativePath) return;\n\n // Extract filename without extension for preview\n const fileName = relativePath.split(/[/\\\\]/).pop();\n const loraName = fileName.replace(/\\.(safetensors|ckpt|pt|bin)$/i, '');\n \n // Get item position for tooltip positioning\n const rect = itemElement.getBoundingClientRect();\n const x = rect.right + 10;\n const y = rect.top;\n \n this.previewTooltip.show(loraName, x, y, true); // Pass true for fromAutocomplete flag\n }\n \n hidePreview() {\n if (!this.options.showPreview) {\n return;\n }\n if (typeof this.behavior.hidePreview === 'function') {\n this.behavior.hidePreview(this);\n } else if (this.previewTooltip) {\n this.previewTooltip.hide();\n }\n }\n \n /**\n * Handle scroll event for virtual scrolling and loading more items\n */\n handleScroll() {\n if (!this.scrollContainer || this.isLoadingMore) {\n return;\n }\n\n const { scrollTop, scrollHeight, clientHeight } = this.scrollContainer;\n const scrollBottom = scrollTop + clientHeight;\n const threshold = this.options.itemHeight * 2; // Load more when within 2 items of bottom\n\n // Check if we need to load more items\n if (scrollBottom >= scrollHeight - threshold && this.hasMoreItems) {\n this.loadMoreItems();\n }\n\n // Update visible items for virtual scrolling\n if (this.options.enableVirtualScroll) {\n this.updateVisibleItems();\n }\n }\n\n /**\n * Load more items (pagination)\n */\n async loadMoreItems() {\n if (this.isLoadingMore || !this.hasMoreItems || this.showingCommands) {\n return;\n }\n\n this.isLoadingMore = true;\n this.currentPage++;\n\n try {\n // Show loading indicator\n this.showLoadingIndicator();\n\n // Get the current endpoint\n let endpoint = `/lm/${this.modelType}/relative-paths`;\n if (this.modelType === 'prompt') {\n if (this.searchType === 'embeddings') {\n endpoint = '/lm/embeddings/relative-paths';\n } else if (this.searchType === 'wildcards') {\n endpoint = getWildcardSearchEndpoint();\n } else if (this.searchType === 'custom_words') {\n if (this.activeCommand?.categories) {\n const categories = this.activeCommand.categories.join(',');\n endpoint = `/lm/custom-words/search?category=${categories}`;\n } else {\n endpoint = '/lm/custom-words/search?enriched=true';\n }\n }\n }\n\n const queriesToExecute = this._getQueriesToExecute(this.currentSearchTerm);\n const offset = this.items.length;\n\n // Active-filter query params for loras (null when setting off)\n const activeFiltersQuery = this._getActiveLoraFilters();\n\n // Execute all queries in parallel with offset\n const searchPromises = queriesToExecute.map(async (query) => {\n const url = endpoint.includes('?')\n ? `${endpoint}&search=${encodeURIComponent(query)}&limit=${this.options.pageSize}&offset=${offset}`\n : `${endpoint}?search=${encodeURIComponent(query)}&limit=${this.options.pageSize}&offset=${offset}`;\n const finalUrl = activeFiltersQuery ? `${url}&${activeFiltersQuery}` : url;\n\n try {\n const response = await api.fetchApi(finalUrl);\n const data = await response.json();\n return data.success ? (data.relative_paths || data.words || []) : [];\n } catch (error) {\n console.warn(`Search query failed for \"${query}\":`, error);\n return [];\n }\n });\n\n const resultsArrays = await Promise.all(searchPromises);\n\n // Merge and deduplicate results with existing items\n const seen = new Set(this.items.map(item => {\n const itemKey = typeof item === 'object' && item.tag_name\n ? item.tag_name.toLowerCase()\n : String(item).toLowerCase();\n return itemKey;\n }));\n const newItems = [];\n\n for (const resultArray of resultsArrays) {\n for (const item of resultArray) {\n const itemKey = typeof item === 'object' && item.tag_name\n ? item.tag_name.toLowerCase()\n : String(item).toLowerCase();\n\n if (!seen.has(itemKey)) {\n seen.add(itemKey);\n newItems.push(item);\n }\n }\n }\n\n // If we got fewer items than requested, we've reached the end\n if (newItems.length < this.options.pageSize) {\n this.hasMoreItems = false;\n }\n\n // If we got new items, append them and re-render\n // IMPORTANT: Do NOT re-sort! Backend already returns results sorted by relevance\n if (newItems.length > 0) {\n this.items.push(...newItems);\n\n // Update render\n if (this.options.enableVirtualScroll) {\n this.updateVirtualScrollHeight();\n this.updateVisibleItems();\n } else {\n this.render();\n }\n } else {\n this.hasMoreItems = false;\n }\n } catch (error) {\n console.error('Error loading more items:', error);\n this.hasMoreItems = false;\n } finally {\n this.isLoadingMore = false;\n this.hideLoadingIndicator();\n }\n }\n\n /**\n * Show loading indicator at the bottom of the list\n */\n showLoadingIndicator() {\n if (!this.contentContainer) return;\n\n let loadingEl = this.contentContainer.querySelector('.comfy-autocomplete-loading');\n if (!loadingEl) {\n loadingEl = document.createElement('div');\n loadingEl.className = 'comfy-autocomplete-loading';\n loadingEl.textContent = 'Loading more...';\n loadingEl.style.cssText = `\n padding: 12px;\n text-align: center;\n color: rgba(226, 232, 240, 0.5);\n font-size: 12px;\n `;\n this.contentContainer.appendChild(loadingEl);\n }\n }\n\n /**\n * Hide loading indicator\n */\n hideLoadingIndicator() {\n if (!this.contentContainer) return;\n\n const loadingEl = this.contentContainer.querySelector('.comfy-autocomplete-loading');\n if (loadingEl) {\n loadingEl.remove();\n }\n }\n\n /**\n * Update the total height of the virtual scroll container\n */\n updateVirtualScrollHeight() {\n if (!this.contentContainer || !this.scrollContainer) return;\n\n if (this._containsInformationalItems()) {\n this.totalHeight = 0;\n this.contentContainer.style.height = 'auto';\n this.scrollContainer.style.maxHeight = `${this.options.visibleItems * this.options.itemHeight}px`;\n this.scrollContainer.style.overflowY = 'hidden';\n return;\n }\n\n this.totalHeight = this.items.length * this.options.itemHeight;\n this.contentContainer.style.height = `${this.totalHeight}px`;\n \n // Adjust scroll container max-height based on actual content\n // Only show scrollbar when content exceeds visibleItems limit\n const maxHeight = this.options.visibleItems * this.options.itemHeight;\n const shouldShowScrollbar = this.totalHeight > maxHeight;\n \n this.scrollContainer.style.maxHeight = shouldShowScrollbar ? `${maxHeight}px` : `${this.totalHeight}px`;\n this.scrollContainer.style.overflowY = shouldShowScrollbar ? 'auto' : 'hidden';\n }\n\n /**\n * Update which items are visible based on scroll position\n */\n updateVisibleItems() {\n if (!this.scrollContainer || !this.contentContainer) return;\n\n if (this._containsInformationalItems()) {\n this.contentContainer.innerHTML = '';\n if (this.items[0]) {\n this.contentContainer.appendChild(\n this.createItemElement(this.items[0], 0, false, false)\n );\n }\n return;\n }\n\n const scrollTop = this.scrollContainer.scrollTop;\n const containerHeight = this.scrollContainer.clientHeight;\n\n // Calculate which items should be visible with a larger buffer for smoother rendering\n // Use a fixed buffer of 5 items to ensure selected item is always rendered\n const startIndex = Math.max(0, Math.floor(scrollTop / this.options.itemHeight) - 5);\n const endIndex = Math.min(\n this.items.length - 1,\n Math.ceil((scrollTop + containerHeight) / this.options.itemHeight) + 5\n );\n\n // Clear current content\n this.contentContainer.innerHTML = '';\n\n // Create spacer for items before visible range\n if (startIndex > 0) {\n const topSpacer = document.createElement('div');\n topSpacer.style.height = `${startIndex * this.options.itemHeight}px`;\n this.contentContainer.appendChild(topSpacer);\n }\n\n // Render visible items\n const isEnriched = this.items[0] && typeof this.items[0] === 'object' && 'tag_name' in this.items[0];\n const isCommand = this.items[0] && typeof this.items[0] === 'object' && 'command' in this.items[0];\n\n for (let i = startIndex; i <= endIndex; i++) {\n const itemData = this.items[i];\n const itemEl = this.createItemElement(itemData, i, isEnriched, isCommand);\n this.contentContainer.appendChild(itemEl);\n }\n\n // Create spacer for items after visible range\n if (endIndex < this.items.length - 1) {\n const bottomSpacer = document.createElement('div');\n bottomSpacer.style.height = `${(this.items.length - 1 - endIndex) * this.options.itemHeight}px`;\n this.contentContainer.appendChild(bottomSpacer);\n }\n \n // Re-apply selection styling after re-rendering\n // This ensures the selected item remains highlighted even after DOM updates\n if (this.selectedIndex >= startIndex && this.selectedIndex <= endIndex) {\n const selectedEl = this.contentContainer.querySelector(`.comfy-autocomplete-item[data-index=\"${this.selectedIndex}\"]`);\n if (selectedEl) {\n selectedEl.classList.add('comfy-autocomplete-item-selected');\n selectedEl.style.backgroundColor = 'rgba(66, 153, 225, 0.2)';\n }\n }\n }\n\n /**\n * Create a single item element\n */\n createItemElement(itemData, index, isEnriched, isCommand = false) {\n const item = document.createElement('div');\n item.className = 'comfy-autocomplete-item';\n item.dataset.index = index.toString();\n item.style.cssText = `\n height: ${this.options.itemHeight}px;\n padding: 8px 12px;\n cursor: pointer;\n color: rgba(226, 232, 240, 0.8);\n border-bottom: 1px solid rgba(226, 232, 240, 0.1);\n transition: all 0.2s ease;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n position: relative;\n display: flex;\n justify-content: space-between;\n align-items: center;\n gap: 8px;\n box-sizing: border-box;\n `;\n\n // Check if this is a command object (override parameter if needed)\n if (!isCommand && itemData && typeof itemData === 'object' && 'command' in itemData) {\n isCommand = true;\n }\n\n if (isWildcardInfoItem(itemData)) {\n this._renderInformationalItem(item, itemData);\n } else if (isCommand) {\n // Render command item\n const cmdSpan = document.createElement('span');\n cmdSpan.className = 'lm-autocomplete-command-name';\n cmdSpan.textContent = itemData.command;\n\n const labelSpan = document.createElement('span');\n labelSpan.className = 'lm-autocomplete-command-label';\n labelSpan.textContent = itemData.label;\n\n item.appendChild(cmdSpan);\n item.appendChild(labelSpan);\n item.style.gap = '12px';\n } else if (isEnriched) {\n this._renderEnrichedItem(item, itemData, this.currentSearchTerm);\n } else {\n const nameSpan = document.createElement('span');\n nameSpan.className = 'lm-autocomplete-name';\n // Use display text without extension for cleaner UI\n const displayTextWithoutExt = this._getDisplayText(itemData);\n nameSpan.innerHTML = this.highlightMatch(displayTextWithoutExt, this.currentSearchTerm);\n nameSpan.style.cssText = `\n flex: 1;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n `;\n item.appendChild(nameSpan);\n }\n\n // Prevent textarea from losing focus when clicking dropdown items.\n // Without this, the blur event fires before click, and the blur handler's\n // formatAutocompleteTextOnBlur() modifies the text and triggers hide()\n // via suppressAutocompleteOnce, removing this item from the DOM before\n // the click handler can execute. This specifically breaks the case where\n // the text has a comma not followed by a space (e.g. \",search\").\n item.addEventListener('mousedown', (e) => {\n e.preventDefault();\n });\n\n // Hover and selection handlers\n item.addEventListener('mouseenter', () => {\n this.selectItem(index, { manual: true });\n });\n\n item.addEventListener('mouseleave', () => {\n this.hidePreview();\n });\n\n // Click handler\n item.addEventListener('click', () => {\n if (isWildcardInfoItem(itemData)) {\n return;\n }\n\n if (isCommand) {\n this._insertCommand(itemData.command);\n } else {\n const insertPath = isEnriched ? itemData.tag_name : itemData;\n this.insertSelection(insertPath);\n }\n });\n\n return item;\n }\n\n show() {\n if (!this.items || this.items.length === 0) {\n this.hide();\n return;\n }\n\n this._maybeShowFirstRunHint();\n // For virtual scrolling, render items first so positionAtCursor can measure width correctly\n if (this.options.enableVirtualScroll && this.contentContainer) {\n this.dropdown.style.display = 'block';\n this.isVisible = true;\n // Skip updateVisibleItems if showing commands (already rendered by _renderCommandList)\n if (!this.showingCommands) {\n this.updateVisibleItems();\n }\n this.positionAtCursor();\n } else {\n // Position dropdown at cursor position using TextAreaCaretHelper\n this.positionAtCursor();\n this.dropdown.style.display = 'block';\n this.isVisible = true;\n }\n }\n \n positionAtCursor() {\n const position = this.helper.getCursorOffset();\n this.dropdown.style.left = (position.left ?? 0) + \"px\";\n this.dropdown.style.top = (position.top ?? 0) + \"px\";\n this.dropdown.style.maxHeight = (window.innerHeight - position.top) + \"px\";\n\n // Adjust width to fit content\n // Temporarily show the dropdown to measure content width\n const originalDisplay = this.dropdown.style.display;\n this.dropdown.style.display = 'block';\n this.dropdown.style.visibility = 'hidden';\n\n // Temporarily remove width constraints to allow content to expand naturally\n // This prevents items.scrollWidth from being limited by a narrow container\n const originalWidth = this.dropdown.style.width;\n this.dropdown.style.width = 'auto';\n this.dropdown.style.minWidth = '200px';\n\n // Measure the content width\n let maxWidth = 200; // minimum width\n // For virtual scrolling, query items from contentContainer; otherwise from dropdown\n const container = this.options.enableVirtualScroll && this.contentContainer\n ? this.contentContainer\n : this.dropdown;\n const items = container.querySelectorAll('.comfy-autocomplete-item');\n items.forEach(item => {\n const itemWidth = item.scrollWidth + 24; // Add padding\n maxWidth = Math.max(maxWidth, itemWidth);\n });\n\n // Set the width and restore visibility\n this.dropdown.style.width = Math.min(maxWidth, 400) + 'px'; // Cap at 400px\n this.dropdown.style.minWidth = '';\n this.dropdown.style.visibility = 'visible';\n this.dropdown.style.display = originalDisplay;\n }\n \n getCaretPosition() {\n return this.inputElement.selectionStart || 0;\n }\n \n hide() {\n if (!this.dropdown) {\n return;\n }\n\n this.dropdown.style.display = 'none';\n this.isVisible = false;\n this.selectedIndex = -1;\n this.hasManualSelection = false;\n this.showingCommands = false;\n\n // Remove discoverability hints attached to the dropdown\n this._removeCommandListFooter();\n this._removeFirstRunHint();\n \n // Clear items to prevent stale data from being displayed\n // when autocomplete is shown again\n this.items = [];\n this.wildcardMeta = null;\n \n // Clear content container to prevent stale items from showing\n if (this.contentContainer) {\n // Virtual scrolling mode - clear content container\n this.contentContainer.innerHTML = '';\n } else {\n // Non-virtual scrolling mode - clear dropdown direct children\n this.dropdown.innerHTML = '';\n }\n\n // Reset virtual scrolling state\n this.virtualScrollOffset = 0;\n this.currentPage = 0;\n this.hasMoreItems = true;\n this.isLoadingMore = false;\n this.totalHeight = 0;\n\n // Reset scroll position\n if (this.scrollContainer) {\n this.scrollContainer.scrollTop = 0;\n }\n\n // Hide preview tooltip\n this.hidePreview();\n\n // Clear selection styles from all items\n const items = this.dropdown.querySelectorAll('.comfy-autocomplete-item');\n items.forEach(item => {\n item.classList.remove('comfy-autocomplete-item-selected');\n item.style.backgroundColor = '';\n });\n }\n \n selectItem(index, { manual = false } = {}) {\n // Remove previous selection\n const container = this.options.enableVirtualScroll && this.contentContainer\n ? this.contentContainer\n : this.dropdown;\n const prevSelected = container.querySelector('.comfy-autocomplete-item-selected');\n if (prevSelected) {\n prevSelected.classList.remove('comfy-autocomplete-item-selected');\n prevSelected.style.backgroundColor = '';\n }\n\n // Add new selection\n if (index >= 0 && index < this.items.length) {\n this.selectedIndex = index;\n this.hasManualSelection = manual;\n\n // For virtual scrolling, we need to ensure the item is rendered\n if (this.options.enableVirtualScroll && this.scrollContainer) {\n // Calculate if the item is currently visible\n const itemTop = index * this.options.itemHeight;\n const itemBottom = itemTop + this.options.itemHeight;\n const scrollTop = this.scrollContainer.scrollTop;\n const containerHeight = this.scrollContainer.clientHeight;\n const scrollBottom = scrollTop + containerHeight;\n\n // If item is not visible, scroll to make it visible\n if (itemTop < scrollTop || itemBottom > scrollBottom) {\n // Scroll to position the item in the visible area\n // Position item at 1/3 from top for better visibility\n const targetScrollTop = Math.max(0, itemTop - containerHeight / 3);\n this.scrollContainer.scrollTop = targetScrollTop;\n \n // Re-render visible items after scroll\n this.updateVisibleItems();\n \n // Apply selection after DOM is updated\n // Use setTimeout to ensure DOM has been re-rendered\n setTimeout(() => {\n this._applyItemSelection(index);\n }, 0);\n } else {\n // Item is already visible, apply selection immediately\n this._applyItemSelection(index);\n }\n } else {\n // Traditional rendering\n const item = container.children[index];\n if (item) {\n item.classList.add('comfy-autocomplete-item-selected');\n item.style.backgroundColor = 'rgba(66, 153, 225, 0.2)';\n\n // Scroll into view if needed\n item.scrollIntoView({ block: 'nearest' });\n\n // Show preview for selected item\n if (this.options.showPreview && !this._isSelectableInfoItem(this.items[index])) {\n if (typeof this.behavior.showPreview === 'function') {\n this.behavior.showPreview(this, this.items[index], item);\n } else if (this.previewTooltip) {\n this.showPreviewForItem(this.items[index], item);\n }\n }\n }\n }\n }\n }\n\n /**\n * Apply selection styling to an item (used after virtual scroll re-render)\n * @param {number} index - Index of item to select\n */\n _applyItemSelection(index) {\n if (!this.contentContainer) return;\n\n // Find the item element using data-index attribute\n const selectedEl = this.contentContainer.querySelector(`.comfy-autocomplete-item[data-index=\"${index}\"]`);\n\n if (selectedEl) {\n selectedEl.classList.add('comfy-autocomplete-item-selected');\n selectedEl.style.backgroundColor = 'rgba(66, 153, 225, 0.2)';\n\n // Show preview for selected item\n if (this.options.showPreview && !this._isSelectableInfoItem(this.items[index])) {\n if (typeof this.behavior.showPreview === 'function') {\n this.behavior.showPreview(this, this.items[index], selectedEl);\n } else if (this.previewTooltip) {\n this.showPreviewForItem(this.items[index], selectedEl);\n }\n }\n }\n }\n \n handleKeyDown(e) {\n if (!this.isVisible) {\n return;\n }\n \n switch (e.key) {\n case 'ArrowDown':\n e.preventDefault();\n if (this.options.enableVirtualScroll && this.scrollContainer) {\n // For virtual scrolling, handle boundary cases\n if (this.selectedIndex >= this.items.length - 1) {\n // Already at last item, try to load more\n if (this.hasMoreItems && !this.isLoadingMore) {\n this.loadMoreItems().then(() => {\n // After loading more, select the next item\n if (this.selectedIndex < this.items.length - 1) {\n this.selectItem(this.selectedIndex + 1, { manual: true });\n }\n });\n }\n } else {\n this.selectItem(this.selectedIndex + 1, { manual: true });\n }\n } else {\n this.selectItem(Math.min(this.selectedIndex + 1, this.items.length - 1), { manual: true });\n }\n break;\n \n case 'ArrowUp':\n e.preventDefault();\n if (this.options.enableVirtualScroll && this.scrollContainer) {\n // For virtual scrolling, handle top boundary\n if (this.selectedIndex <= 0) {\n // Already at first item, ensure it's selected\n this.selectItem(0, { manual: true });\n } else {\n this.selectItem(this.selectedIndex - 1, { manual: true });\n }\n } else {\n this.selectItem(Math.max(this.selectedIndex - 1, 0), { manual: true });\n }\n break;\n \n case 'Enter':\n case 'Tab':\n if (!shouldAcceptAutocompleteKey(e.key)) {\n break;\n }\n\n {\n const liveSearchTerm = this._getLiveSearchTermForAcceptance();\n const acceptIndex = this._getAcceptSelectionIndex(liveSearchTerm);\n if (acceptIndex !== -1 && acceptIndex !== this.selectedIndex) {\n this.selectItem(acceptIndex);\n }\n }\n\n if (this.selectedIndex >= 0 && this.selectedIndex < this.items.length) {\n e.preventDefault();\n if (this.showingCommands) {\n // Insert command\n this._insertCommand(this.items[this.selectedIndex].command);\n } else {\n const selectedItem = this.items[this.selectedIndex];\n if (isWildcardInfoItem(selectedItem)) {\n if (selectedItem.type === 'wildcard_empty_state') {\n this._openWildcardsFolder();\n }\n break;\n }\n\n // Insert selection (handle enriched items)\n const insertPath = typeof selectedItem === 'object' && 'tag_name' in selectedItem\n ? selectedItem.tag_name\n : selectedItem;\n this.insertSelection(insertPath);\n }\n }\n break;\n \n case 'Escape':\n e.preventDefault();\n this.hide();\n break;\n }\n }\n \n async insertSelection(relativePath) {\n const insertText = await this.getInsertText(relativePath);\n if (!insertText) {\n this.hide();\n return;\n }\n\n const currentValue = this.inputElement.value;\n const activeRange = this.getActiveSearchRange(currentValue);\n const caretPos = activeRange.end;\n const fullSearchTerm = activeRange.text;\n let replaceStartPos = activeRange.trimmedStart;\n\n // For regular tag autocomplete (no command), only replace the last space-separated token\n // This allows \"hello 1gi\" + selecting \"1girl\" to become \"hello 1girl, \"\n // However, if the user typed a multi-word phrase that matches a tag (e.g., \"looking to the side\"\n // matching \"looking_to_the_side\"), replace the entire phrase instead of just the last word.\n // Command mode (e.g., \"/character miku\") should replace the entire command+search\n let searchTerm = fullSearchTerm;\n if (this.modelType === 'prompt' && this.searchType === 'custom_words' && !this.activeCommand) {\n // Check if the selectedItem exists and its tag_name matches the full search term\n // when converted to underscore format (Danbooru convention)\n const selectedItem = this.selectedIndex >= 0 ? this.items[this.selectedIndex] : null;\n const selectedTagName = selectedItem && typeof selectedItem === 'object' && 'tag_name' \n ? selectedItem.tag_name \n : null;\n \n // Convert full search term to underscore format and check if it matches selected tag\n // Normalize multiple spaces to single underscore for matching (e.g., \"looking to the side\" -> \"looking_to_the_side\")\n const underscoreVersion = fullSearchTerm.replace(/ +/g, '_').toLowerCase();\n const selectedTagLower = selectedTagName?.toLowerCase() ?? '';\n \n // If multi-word search term is a prefix or suffix of the selected tag,\n // replace the entire phrase. This handles cases where user types partial tag name.\n // Examples:\n // - \"looking to the\" -> \"looking_to_the_side\" (prefix match)\n // - \"to the side\" -> \"looking_to_the_side\" (suffix match)\n // - \"looking to the side\" -> \"looking_to_the_side\" (exact match)\n if (fullSearchTerm.includes(' ') && (\n selectedTagLower.startsWith(underscoreVersion) ||\n selectedTagLower.endsWith(underscoreVersion) ||\n underscoreVersion === selectedTagLower\n )) {\n searchTerm = fullSearchTerm;\n replaceStartPos = activeRange.trimmedStart;\n } else {\n searchTerm = this._getLastSpaceToken(fullSearchTerm);\n replaceStartPos = searchTerm === fullSearchTerm\n ? activeRange.trimmedStart\n : caretPos - searchTerm.length;\n }\n }\n\n // Only replace the search term, not everything after the last comma\n const newValue = currentValue.substring(0, replaceStartPos) + insertText + currentValue.substring(caretPos);\n const newCaretPos = replaceStartPos + insertText.length;\n\n this.inputElement.value = newValue;\n this._storeLastAcceptedBoundary({\n start: replaceStartPos,\n end: newCaretPos,\n insertedText: insertText,\n textSnapshot: newValue.substring(0, newCaretPos),\n });\n\n // Trigger input event to notify about the change\n const event = new Event('input', { bubbles: true });\n this.inputElement.dispatchEvent(event);\n\n this.hide();\n\n // Focus back to input and position cursor\n this.inputElement.focus();\n this.inputElement.setSelectionRange(newCaretPos, newCaretPos);\n }\n\n async getInsertText(relativePath) {\n if (typeof this.behavior.getInsertText === 'function') {\n try {\n const result = await this.behavior.getInsertText(this, relativePath);\n if (typeof result === 'string' && result.length > 0) {\n return result;\n }\n } catch (error) {\n console.warn('Failed to format autocomplete insertion:', error);\n }\n }\n\n const trimmed = typeof relativePath === 'string' ? relativePath.trim() : '';\n if (!trimmed) {\n return '';\n }\n return formatAutocompleteInsertion(trimmed);\n }\n\n /**\n * Check if the autocomplete instance is still valid\n * (input element exists and is in the DOM)\n * @returns {boolean}\n */\n isValid() {\n return this.inputElement && document.body.contains(this.inputElement);\n }\n\n /**\n * Refresh the TextAreaCaretHelper to update cached measurements\n * Useful after element is moved in DOM (e.g., Vue mode switch)\n */\n refreshCaretHelper() {\n if (this.inputElement && document.body.contains(this.inputElement)) {\n this.helper = new TextAreaCaretHelper(this.inputElement, () => app.canvas.ds.scale);\n }\n }\n\n /**\n * Handle toggle setting command (e.g., /autocomplete, /activefilters)\n * @param {Object} command - The toggle command with settingId and value\n */\n async _handleToggleSettingCommand(command) {\n const { settingId, value } = command;\n\n try {\n const success = await setLoraManagerSettingValue(settingId, value);\n if (success) {\n this._showToggleFeedback(command, value);\n this._clearCurrentToken();\n } else {\n throw new Error('settings API unavailable');\n }\n } catch (error) {\n console.error('[Lora Manager] Failed to toggle setting:', error);\n showToast({\n severity: 'error',\n summary: 'Error',\n detail: 'Failed to toggle autocomplete setting',\n life: 3000\n });\n }\n\n this.hide();\n }\n\n /**\n * Show visual feedback for toggle action using toast\n * @param {Object} command - The toggle command that was executed\n * @param {boolean} enabled - New autocomplete state\n */\n _showToggleFeedback(command, enabled) {\n showToast({\n severity: enabled ? 'success' : 'secondary',\n summary: command.feedbackSummary || (enabled ? 'Autocomplete Enabled' : 'Autocomplete Disabled'),\n detail: command.feedbackDetail || (enabled\n ? 'Tag autocomplete is now ON. Type to see suggestions.'\n : 'Tag autocomplete is now OFF. Use /autocomplete or the node right-click menu to re-enable.'),\n life: 3000\n });\n }\n\n /**\n * Clear the current command token from input\n * Preserves leading spaces after delimiters (e.g., \"1girl, /emb\" -> \"1girl, \")\n */\n _clearCurrentToken() {\n const currentValue = this.inputElement.value;\n const activeRange = this.getActiveSearchRange(currentValue);\n const caretPos = activeRange.end;\n const lastSegment = activeRange.rawText;\n \n // Find the command start position, preserving leading spaces\n // lastSegment includes leading spaces (e.g., \" /emb\"), find where command actually starts\n const commandMatch = lastSegment.match(/^(\\s*)(\\/\\w+)/);\n if (commandMatch) {\n // commandMatch[1] is leading spaces, commandMatch[2] is the command\n const leadingSpaces = commandMatch[1].length;\n // Keep the spaces by starting after them\n const commandStartPos = activeRange.start + leadingSpaces;\n \n // Skip trailing spaces when deleting\n let endPos = caretPos;\n while (endPos < currentValue.length && currentValue[endPos] === ' ') {\n endPos++;\n }\n\n const newValue = currentValue.substring(0, commandStartPos) + currentValue.substring(endPos);\n const newCaretPos = commandStartPos;\n\n this.inputElement.value = newValue;\n\n // Trigger input event to notify about the change\n const event = new Event('input', { bubbles: true });\n this.inputElement.dispatchEvent(event);\n\n // Focus back to input and position cursor\n this.inputElement.focus();\n this.inputElement.setSelectionRange(newCaretPos, newCaretPos);\n } else {\n // Fallback: delete the whole last segment (original behavior)\n const commandStartPos = activeRange.start;\n \n let endPos = caretPos;\n while (endPos < currentValue.length && currentValue[endPos] === ' ') {\n endPos++;\n }\n\n const newValue = currentValue.substring(0, commandStartPos) + currentValue.substring(endPos);\n const newCaretPos = commandStartPos;\n\n this.inputElement.value = newValue;\n\n const event = new Event('input', { bubbles: true });\n this.inputElement.dispatchEvent(event);\n\n this.inputElement.focus();\n this.inputElement.setSelectionRange(newCaretPos, newCaretPos);\n }\n }\n\n destroy() {\n if (this.debounceTimer) {\n clearTimeout(this.debounceTimer);\n }\n\n if (this.onInput) {\n this.inputElement.removeEventListener('input', this.onInput);\n this.onInput = null;\n }\n\n if (this.onKeyDown) {\n this.inputElement.removeEventListener('keydown', this.onKeyDown);\n this.onKeyDown = null;\n }\n\n if (this.onBlur) {\n this.inputElement.removeEventListener('blur', this.onBlur);\n this.onBlur = null;\n }\n\n if (this.onDocumentClick) {\n document.removeEventListener('click', this.onDocumentClick);\n this.onDocumentClick = null;\n }\n\n if (this.onScroll && this.scrollContainer) {\n this.scrollContainer.removeEventListener('scroll', this.onScroll);\n this.onScroll = null;\n }\n\n if (typeof this.behavior.destroy === 'function') {\n this.behavior.destroy(this);\n } else if (this.previewTooltip) {\n this.previewTooltip.cleanup();\n this.previewTooltip = null;\n }\n this.previewTooltipPromise = null;\n \n if (this.dropdown && this.dropdown.parentNode) {\n this.dropdown.parentNode.removeChild(this.dropdown);\n this.dropdown = null;\n }\n \n }\n}\n\nexport { AutoComplete, refreshLoraSyntaxFormat };\n","/**\n * Base-path helpers for code running inside the ComfyUI page.\n *\n * When ComfyUI is served under a URL subpath by a reverse proxy (e.g.\n * llama-swap serves it at \"/comfyui/\", SwarmUI at \"/ComfyBackendDirect/\"),\n * the ComfyUI SPA always sits at the root of that prefix, so the prefix is\n * the current pathname without the trailing slash — the same convention the\n * ComfyUI frontend uses for its own api_base. Proxies strip the prefix and\n * forward no headers, so the page URL is the only place to learn it.\n */\n\nexport function getComfyUIBasePath() {\n const { pathname } = window.location;\n return pathname.endsWith(\"/\") ? pathname.slice(0, -1) : pathname;\n}\n\nexport function lmUrl(path) {\n return `${getComfyUIBasePath()}${path}`;\n}\n","export const CONVERTED_TYPE = 'converted-widget';\nimport { app } from \"../../scripts/app.js\";\nimport { AutoComplete } from \"./autocomplete.js\";\nimport { lmUrl } from \"./base_path.js\";\n\nconst ROOT_GRAPH_ID = \"root\";\n\nexport const LORA_PROVIDER_NODE_TYPES = [\n \"Lora Stacker (LoraManager)\",\n \"Lora Randomizer (LoraManager)\",\n \"Lora Cycler (LoraManager)\",\n \"Create Hook LoRA (LoraManager)\",\n];\n\nexport const LORA_STACK_AGGREGATOR_NODE_TYPES = [\n \"Lora Stack Combiner (LoraManager)\",\n];\n\nexport const LORA_CHAIN_NODE_TYPES = [\n ...LORA_PROVIDER_NODE_TYPES,\n ...LORA_STACK_AGGREGATOR_NODE_TYPES,\n];\n\nexport function isLoraProviderNode(comfyClass) {\n return LORA_PROVIDER_NODE_TYPES.includes(comfyClass);\n}\n\nexport function isLoraStackAggregatorNode(comfyClass) {\n return LORA_STACK_AGGREGATOR_NODE_TYPES.includes(comfyClass);\n}\n\nexport function isLoraChainNode(comfyClass) {\n return LORA_CHAIN_NODE_TYPES.includes(comfyClass);\n}\n\nfunction isMapLike(collection) {\n return collection && typeof collection.entries === \"function\" && typeof collection.values === \"function\";\n}\n\n/**\n * Return the subgraph LGraph instances nested under `graph`, across both\n * Map-like and plain-object `_subgraphs` containers.\n */\nexport function getChildGraphs(graph) {\n if (!graph || !graph._subgraphs) {\n return [];\n }\n\n const rawSubgraphs = isMapLike(graph._subgraphs)\n ? Array.from(graph._subgraphs.values())\n : Object.values(graph._subgraphs);\n\n return rawSubgraphs\n .map((subgraph) => subgraph?.graph || subgraph?._graph || subgraph)\n .filter((subgraph) => subgraph && subgraph !== graph);\n}\n\nfunction traverseGraphs(rootGraph, visitor, visited = new Set()) {\n const graph = rootGraph || app.graph;\n if (!graph) {\n return;\n }\n\n const graphId = getGraphId(graph);\n if (visited.has(graphId)) {\n return;\n }\n visited.add(graphId);\n visitor(graph);\n\n for (const subgraph of getChildGraphs(graph)) {\n traverseGraphs(subgraph, visitor, visited);\n }\n}\n\nexport function getGraphId(graph) {\n return graph?.id ?? ROOT_GRAPH_ID;\n}\n\nexport function getNodeGraphId(node) {\n if (!node) {\n return ROOT_GRAPH_ID;\n }\n return getGraphId(node.graph || app.graph);\n}\n\nexport function getGraphById(graphId, rootGraph = app.graph) {\n if (!graphId) {\n return rootGraph;\n }\n\n let foundGraph = null;\n traverseGraphs(rootGraph, (graph) => {\n if (!foundGraph && getGraphId(graph) === graphId) {\n foundGraph = graph;\n }\n });\n return foundGraph;\n}\n\nexport function getNodeFromGraph(graphId, nodeId) {\n const graph = getGraphById(graphId) || app.graph;\n if (!graph || typeof graph.getNodeById !== \"function\") {\n return null;\n }\n\n const numericId = typeof nodeId === \"string\" ? Number(nodeId) : nodeId;\n return graph.getNodeById(Number.isNaN(numericId) ? nodeId : numericId) || null;\n}\n\nexport function getAllGraphNodes(rootGraph = app.graph) {\n const nodes = [];\n traverseGraphs(rootGraph, (graph) => {\n if (Array.isArray(graph._nodes)) {\n for (const node of graph._nodes) {\n nodes.push({ graph, node });\n }\n }\n });\n return nodes;\n}\n\nexport function getNodeReference(node) {\n if (!node) {\n return null;\n }\n return {\n node_id: node.id,\n graph_id: getNodeGraphId(node),\n };\n}\n\nexport function getNodeKey(node) {\n if (!node) {\n return null;\n }\n return `${getNodeGraphId(node)}:${node.id}`;\n}\n\nexport function getWidgetByName(node, widgetName) {\n if (!node || !Array.isArray(node.widgets)) {\n return null;\n }\n\n return node.widgets.find((widget) => widget?.name === widgetName) || null;\n}\n\nexport function getWidgetSerializedValue(node, widgetName) {\n if (!node || !Array.isArray(node.widgets) || !Array.isArray(node.widgets_values)) {\n return undefined;\n }\n\n const widgetIndex = node.widgets.findIndex((widget) => widget?.name === widgetName);\n if (widgetIndex === -1) {\n return undefined;\n }\n\n return node.widgets_values[widgetIndex];\n}\n\nexport function getLinkFromGraph(graph, linkId) {\n if (!graph || graph.links == null) {\n return null;\n }\n\n if (isMapLike(graph.links)) {\n return graph.links.get(linkId) || null;\n }\n\n return graph.links[linkId] || null;\n}\n\nexport function chainCallback(object, property, callback) {\n if (object == undefined) {\n //This should not happen.\n console.error(\"Tried to add callback to non-existant object\")\n return;\n }\n if (property in object) {\n const callback_orig = object[property]\n object[property] = function () {\n const r = callback_orig.apply(this, arguments);\n callback.apply(this, arguments);\n return r\n };\n } else {\n object[property] = callback;\n }\n}\n\n/**\n * Find a `mode` accessor (getter/setter) on the node's prototype chain.\n * Since ComfyUI frontend 1.53, `LGraphNode.mode` is a prototype accessor\n * backed by the node's shell state (`node._state.mode`); on legacy frontends\n * `mode` is a plain data property on the instance and no accessor exists.\n */\nfunction findModeAccessor(node) {\n let proto = Object.getPrototypeOf(node);\n while (proto && proto !== Object.prototype) {\n const descriptor = Object.getOwnPropertyDescriptor(proto, \"mode\");\n if (descriptor && (descriptor.get || descriptor.set)) {\n return descriptor;\n }\n proto = Object.getPrototypeOf(proto);\n }\n return null;\n}\n\n/**\n * Observe node mode changes (Always/Never/On Trigger/Bypass) without\n * breaking the frontend's own `mode` property.\n *\n * Since ComfyUI frontend 1.53, `mode` is a prototype accessor backed by\n * shell state and serialization reads that state directly. Redefining `mode`\n * on the instance would shadow the prototype setter, so bypass/mute never\n * reaches the serialized workflow and silently reverts to Always on reload.\n * When a prototype accessor exists we delegate to it and only observe the\n * change; on legacy frontends we keep the value in a closure as before.\n *\n * Multiple listeners can be registered on the same node; the accessor is\n * intercepted only once and every change is broadcast to all listeners.\n *\n * @param {Object} node - The litegraph node instance\n * @param {(newMode: number, oldMode: number) => void} onModeChange - Called when the mode actually changes\n */\nexport function interceptModeChange(node, onModeChange) {\n if (!node || typeof onModeChange !== \"function\") {\n return;\n }\n\n if (!Array.isArray(node._lmModeChangeListeners)) {\n Object.defineProperty(node, \"_lmModeChangeListeners\", {\n configurable: true,\n writable: true,\n value: [],\n });\n }\n node._lmModeChangeListeners.push(onModeChange);\n\n if (node._lmModeChangeIntercepted) {\n return;\n }\n Object.defineProperty(node, \"_lmModeChangeIntercepted\", {\n configurable: true,\n writable: true,\n value: true,\n });\n\n const notify = (newMode, oldMode) => {\n for (const listener of node._lmModeChangeListeners ?? []) {\n try {\n listener(newMode, oldMode);\n } catch (listenerError) {\n console.error(\"LoRA Manager: mode change listener failed\", listenerError);\n }\n }\n };\n\n const delegate = findModeAccessor(node);\n\n if (delegate && typeof delegate.get === \"function\" && typeof delegate.set === \"function\") {\n Object.defineProperty(node, \"mode\", {\n configurable: true,\n get() {\n return delegate.get.call(this);\n },\n set(value) {\n const oldValue = delegate.get.call(this);\n delegate.set.call(this, value);\n if (oldValue !== value) {\n notify(value, oldValue);\n }\n },\n });\n return;\n }\n\n let currentMode = node.mode;\n Object.defineProperty(node, \"mode\", {\n configurable: true,\n get() {\n return currentMode;\n },\n set(value) {\n const oldValue = currentMode;\n currentMode = value;\n if (oldValue !== value) {\n notify(value, oldValue);\n }\n },\n });\n}\n\n/**\n * Show a toast notification\n * @param {Object|string} options - Toast options object or message string for backward compatibility\n * @param {string} [options.severity] - Message severity level (success, info, warn, error, secondary, contrast)\n * @param {string} [options.summary] - Short title for the toast\n * @param {any} [options.detail] - Detailed message content\n * @param {boolean} [options.closable] - Whether user can close the toast (default: true)\n * @param {number} [options.life] - Duration in milliseconds before auto-closing\n * @param {string} [options.group] - Group identifier for managing related toasts\n * @param {any} [options.styleClass] - Style class of the message\n * @param {any} [options.contentStyleClass] - Style class of the content\n * @param {string} [type] - Deprecated: severity type for backward compatibility\n */\nexport function showToast(options, type = 'info') {\n // Handle backward compatibility: showToast(message, type)\n if (typeof options === 'string') {\n options = {\n detail: options,\n severity: type\n };\n }\n \n // Set defaults\n const toastOptions = {\n severity: options.severity || 'info',\n summary: options.summary,\n detail: options.detail,\n closable: options.closable !== false, // default to true\n life: options.life,\n group: options.group,\n styleClass: options.styleClass,\n contentStyleClass: options.contentStyleClass\n };\n \n // Remove undefined properties\n Object.keys(toastOptions).forEach(key => {\n if (toastOptions[key] === undefined) {\n delete toastOptions[key];\n }\n });\n \n if (app && app.extensionManager && app.extensionManager.toast) {\n app.extensionManager.toast.add(toastOptions);\n } else {\n const message = toastOptions.detail || toastOptions.summary || 'No message';\n const severity = toastOptions.severity.toUpperCase();\n console.log(`${severity}: ${message}`);\n // Fallback alert for critical errors only\n if (toastOptions.severity === 'error') {\n alert(message);\n }\n }\n}\n\nexport function hideWidgetForGood(node, widget, suffix = \"\") {\n widget.origType = widget.type;\n widget.origComputeSize = widget.computeSize;\n widget.origSerializeValue = widget.serializeValue;\n widget.computeSize = () => [0, -4]; // -4 is due to the gap litegraph adds between widgets automatically\n widget.type = CONVERTED_TYPE + suffix;\n // widget.serializeValue = () => {\n // // Prevent serializing the widget if we have no input linked\n // const w = node.inputs?.find((i) => i.widget?.name === widget.name);\n // if (w?.link == null) {\n // return undefined;\n // }\n // return widget.origSerializeValue ? widget.origSerializeValue() : widget.value;\n // };\n\n // Hide any linked widgets, e.g. seed+seedControl\n if (widget.linkedWidgets) {\n for (const w of widget.linkedWidgets) {\n hideWidgetForGood(node, w, `:${widget.name}`);\n }\n }\n}\n\n// Update pattern to match both formats: or \nexport const LORA_PATTERN = //g;\n\nfunction isLoraStackInput(input) {\n return input?.type === \"LORA_STACK\";\n}\n\n// Get connected LORA_STACK chain nodes that feed into the current node\nexport function getConnectedInputLoraChainNodes(node) {\n const connectedNodes = [];\n\n if (!node?.inputs) {\n return connectedNodes;\n }\n\n for (const input of node.inputs) {\n if (!isLoraStackInput(input) || !input.link) {\n continue;\n }\n\n const link = getLinkFromGraph(node.graph, input.link);\n if (!link) {\n continue;\n }\n\n const sourceNode = node.graph?.getNodeById?.(link.origin_id);\n if (sourceNode && isLoraChainNode(sourceNode.comfyClass)) {\n connectedNodes.push(sourceNode);\n }\n }\n\n return connectedNodes;\n}\n\n// Get connected TriggerWord Toggle nodes that receive output from the current node\nexport function getConnectedTriggerToggleNodes(node) {\n const connectedNodes = [];\n\n if (!node?.outputs) {\n return connectedNodes;\n }\n\n for (const output of node.outputs) {\n if (!output?.links?.length) {\n continue;\n }\n\n for (const linkId of output.links) {\n const link = getLinkFromGraph(node.graph, linkId);\n if (!link) {\n continue;\n }\n\n const targetNode = node.graph?.getNodeById?.(link.target_id);\n if (targetNode && targetNode.comfyClass === \"TriggerWord Toggle (LoraManager)\") {\n connectedNodes.push(targetNode);\n }\n }\n }\n\n return connectedNodes;\n}\n\n// Extract active lora names from a node's widgets\nexport function getActiveLorasFromNode(node) {\n const activeLoraNames = new Set();\n\n // Handle Lora Cycler (single LoRA from cycler_config widget)\n if (node.comfyClass === \"Lora Cycler (LoraManager)\") {\n const cyclerWidget = node.widgets?.find(w => w.name === 'cycler_config');\n if (cyclerWidget?.value?.current_lora_filename) {\n activeLoraNames.add(cyclerWidget.value.current_lora_filename);\n }\n return activeLoraNames;\n }\n\n // Aggregator nodes do not own LoRA state directly; they only forward upstream stacks.\n if (isLoraStackAggregatorNode(node.comfyClass)) {\n return activeLoraNames;\n }\n\n // Handle Lora Stacker and Lora Randomizer (lorasWidget)\n let lorasWidget = node.lorasWidget;\n if (!lorasWidget && node.widgets) {\n lorasWidget = node.widgets.find(w => w.name === 'loras');\n }\n\n if (lorasWidget && lorasWidget.value) {\n lorasWidget.value.forEach(lora => {\n if (lora.active) {\n activeLoraNames.add(lora.name);\n }\n });\n }\n\n return activeLoraNames;\n}\n\n// Recursively collect all active loras from a node and its input chain\n// A node is considered active only if its mode is 0 (Always) or 3 (On Trigger)\nexport function collectActiveLorasFromChain(node, visited = new Set()) {\n // Prevent infinite loops from circular references\n const nodeKey = getNodeKey(node);\n if (!nodeKey) {\n return new Set();\n }\n if (visited.has(nodeKey)) {\n return new Set();\n }\n visited.add(nodeKey);\n\n // Check if node is active (mode 0 for Always, mode 3 for On Trigger)\n // Mode 2 is Never, Mode 4 is Bypass\n const isNodeActive = node.mode === undefined || node.mode === 0 || node.mode === 3;\n \n if (!isNodeActive) {\n return new Set();\n }\n\n // Get active loras from current node only if node is active\n const allActiveLoraNames = getActiveLorasFromNode(node);\n \n // Get connected input LORA_STACK chain nodes and collect their active loras\n const inputChainNodes = getConnectedInputLoraChainNodes(node);\n for (const chainNode of inputChainNodes) {\n const upstreamLoras = collectActiveLorasFromChain(chainNode, visited);\n upstreamLoras.forEach(name => allActiveLoraNames.add(name));\n }\n \n return allActiveLoraNames;\n}\n\n// Update trigger words for connected toggle nodes\nexport function updateConnectedTriggerWords(node, loraNames) {\n const connectedNodes = getConnectedTriggerToggleNodes(node);\n if (connectedNodes.length > 0) {\n const nodeIds = connectedNodes\n .map((connectedNode) => getNodeReference(connectedNode))\n .filter((reference) => reference !== null);\n\n if (nodeIds.length === 0) {\n return;\n }\n\n fetch(lmUrl(\"/api/lm/loras/get_trigger_words\"), {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n lora_names: Array.from(loraNames),\n node_ids: nodeIds\n })\n }).catch(err => console.error(\"Error fetching trigger words:\", err));\n }\n}\n\nexport function mergeLoras(lorasText, lorasArr) {\n // Parse lorasText into a map: name -> {strength, clipStrength}\n const parsedLoras = {};\n let match;\n LORA_PATTERN.lastIndex = 0;\n while ((match = LORA_PATTERN.exec(lorasText)) !== null) {\n const name = match[1];\n const modelStrength = Number(match[2]);\n const clipStrength = match[3] ? Number(match[3]) : modelStrength;\n parsedLoras[name] = { strength: modelStrength, clipStrength };\n }\n\n // Build result array in the order of lorasArr\n const result = [];\n const usedNames = new Set();\n\n for (const lora of lorasArr) {\n if (parsedLoras[lora.name]) {\n result.push({\n name: lora.name,\n strength: lora.strength !== undefined ? lora.strength : parsedLoras[lora.name].strength,\n active: lora.active !== undefined ? lora.active : true,\n expanded: lora.expanded !== undefined ? lora.expanded : false,\n clipStrength: lora.clipStrength !== undefined ? lora.clipStrength : parsedLoras[lora.name].clipStrength,\n selected: !!lora.selected,\n });\n usedNames.add(lora.name);\n }\n }\n\n // Add any new loras from lorasText that are not in lorasArr, in their text order\n for (const name in parsedLoras) {\n if (!usedNames.has(name)) {\n result.push({\n name,\n strength: parsedLoras[name].strength,\n active: true,\n clipStrength: parsedLoras[name].clipStrength,\n selected: false,\n });\n }\n }\n\n return result;\n}\n\n/**\n * Find the actual input element for a widget\n * @param {Object} node - The node instance\n * @param {Object} widget - The widget to find input element for\n * @returns {Promise} The input element or null\n */\nasync function findWidgetInputElement(node, widget) {\n if (widget.inputEl && document.body.contains(widget.inputEl)) {\n return widget.inputEl;\n }\n\n const nodeId = node.id;\n const widgetName = widget.name;\n const maxAttempts = 20;\n const searchInterval = 50;\n\n const searchForInput = (attempt = 0) => {\n return new Promise((resolve) => {\n const doSearch = () => {\n let inputElement = null;\n\n // PRIORITY 1: Use data-node-id attribute (most reliable)\n // Always try this first, regardless of mode - Vue elements may still exist after mode switch\n const nodeContainer = document.querySelector(`[data-node-id=\"${nodeId}\"]`);\n if (nodeContainer) {\n // For text widgets, specifically look for textarea (not checkbox/toggle inputs)\n if (widgetName === 'text') {\n const textarea = nodeContainer.querySelector('textarea');\n if (textarea) {\n inputElement = textarea;\n console.log(`[Lora Manager] Found textarea for widget \"${widgetName}\" on node ${nodeId} via data-node-id`);\n }\n } else {\n // For other widgets, find input within widget containers\n const widgetContainers = nodeContainer.querySelectorAll('.lg-node-widget');\n for (const container of widgetContainers) {\n const input = container.querySelector('input:not([type=\"checkbox\"]), textarea');\n if (input) {\n inputElement = input;\n console.log(`[Lora Manager] Found input element for widget \"${widgetName}\" on node ${nodeId} via data-node-id`);\n break;\n }\n }\n }\n }\n\n // PRIORITY 2: Fallback - heuristic search using widget containers\n if (!inputElement) {\n const allWidgetContainers = document.querySelectorAll('.lg-node-widget, .dom-widget');\n\n for (const container of allWidgetContainers) {\n const hasInput = !!container.querySelector('input, textarea');\n if (!hasInput) continue;\n\n const textContent = container.textContent.toLowerCase();\n const containsWidgetName = textContent.includes(widgetName.toLowerCase());\n const containsNodeTitle = textContent.includes(node.title?.toLowerCase() || '');\n\n // For text widgets, check if it's a textarea\n const isTextareaWidget = widgetName === 'text' && container.querySelector('textarea');\n\n if (containsWidgetName || containsNodeTitle || isTextareaWidget) {\n inputElement = container.querySelector('input, textarea');\n console.log(`[Lora Manager] Found input element for widget \"${widgetName}\" on node ${nodeId} via heuristic`);\n break;\n }\n }\n }\n\n if (inputElement) {\n resolve(inputElement);\n } else if (attempt < maxAttempts) {\n setTimeout(() => searchForInput(attempt + 1).then(resolve), searchInterval);\n } else {\n console.warn(`[Lora Manager] Could not find input element for widget \"${widgetName}\" on node ${nodeId} after ${maxAttempts} attempts`);\n resolve(null);\n }\n };\n doSearch();\n });\n };\n\n return searchForInput();\n}\n\n/**\n * Initialize autocomplete for an input widget and setup cleanup\n * @param {Object} node - The node instance\n * @param {Object} inputWidget - The input widget to add autocomplete to\n * @param {Function} originalCallback - The original callback function\n * @param {string} [modelType='loras'] - The model type used by the autocomplete API\n * @param {Object} [autocompleteOptions] - Additional options for the autocomplete instance\n * @returns {Function} Enhanced callback function with autocomplete\n */\nexport function setupInputWidgetWithAutocomplete(node, inputWidget, originalCallback, modelType = 'loras', autocompleteOptions = {}) {\n const defaultOptions = {\n maxItems: 20,\n minChars: 1,\n debounceDelay: 200,\n };\n const mergedOptions = { ...defaultOptions, ...autocompleteOptions };\n\n setupAutocompleteCleanup(node);\n\n // Track rendering mode changes per node\n let lastVueNodesMode = typeof LiteGraph !== 'undefined' ? LiteGraph.vueNodesMode : false;\n\n const initializeAutocomplete = async () => {\n if (node.autocomplete) {\n console.log(`[Lora Manager] Autocomplete already initialized for widget \"${inputWidget.name}\" on node ${node.id}`);\n return;\n }\n\n try {\n let inputElement = null;\n\n // PRIORITY 1: Always prefer widget.inputEl if it exists (even if not yet in DOM)\n // This is the authoritative element created by ComfyUI\n if (inputWidget.inputEl) {\n inputElement = inputWidget.inputEl;\n // If not yet in DOM, wait for it to be added\n if (!document.body.contains(inputElement)) {\n console.log(`[Lora Manager] widget.inputEl exists but not in DOM yet, waiting for node ${node.id}`);\n const maxWait = 1000; // 1 second max\n const checkInterval = 50;\n let waited = 0;\n while (!document.body.contains(inputElement) && waited < maxWait) {\n await new Promise(r => setTimeout(r, checkInterval));\n waited += checkInterval;\n }\n if (!document.body.contains(inputElement)) {\n console.warn(`[Lora Manager] widget.inputEl still not in DOM after ${maxWait}ms for node ${node.id}`);\n inputElement = null; // Fall through to DOM search\n }\n }\n if (inputElement) {\n console.log(`[Lora Manager] Using widget.inputEl for widget \"${inputWidget.name}\" on node ${node.id}`);\n }\n }\n\n // PRIORITY 2: DOM search only if widget.inputEl doesn't exist\n if (!inputElement) {\n console.log(`[Lora Manager] Searching DOM for input element for widget \"${inputWidget.name}\" on node ${node.id}`);\n inputElement = await findWidgetInputElement(node, inputWidget);\n }\n\n if (inputElement) {\n const autocomplete = new AutoComplete(inputElement, modelType, mergedOptions);\n node.autocomplete = autocomplete;\n console.log(`[Lora Manager] Autocomplete initialized for widget \"${inputWidget.name}\" on node ${node.id}`);\n } else {\n console.warn(`[Lora Manager] Could not find input element for widget \"${inputWidget.name}\" on node ${node.id}`);\n }\n } catch (error) {\n console.error('[Lora Manager] Error initializing autocomplete:', error);\n }\n };\n\n const checkAndInvalidateAutocomplete = () => {\n // Check for rendering mode change\n const currentMode = typeof LiteGraph !== 'undefined' ? LiteGraph.vueNodesMode : false;\n if (currentMode !== lastVueNodesMode) {\n lastVueNodesMode = currentMode;\n if (node.autocomplete) {\n console.log(`[Lora Manager] Rendering mode changed, reinitializing autocomplete for node ${node.id}`);\n node.autocomplete.destroy();\n node.autocomplete = null;\n }\n return true;\n }\n\n // Check if existing autocomplete's input element is still valid\n if (node.autocomplete) {\n const currentInputEl = node.autocomplete.inputElement;\n if (!currentInputEl || !document.body.contains(currentInputEl)) {\n console.log(`[Lora Manager] Autocomplete element detached, reinitializing for node ${node.id}`);\n node.autocomplete.destroy();\n node.autocomplete = null;\n return true;\n }\n\n // Check if autocomplete is bound to wrong element (different from widget.inputEl)\n // Only do this check if widget.inputEl is actually in the DOM - it may be stale\n if (inputWidget.inputEl && document.body.contains(inputWidget.inputEl) && currentInputEl !== inputWidget.inputEl) {\n console.log(`[Lora Manager] Autocomplete bound to wrong element, rebinding for node ${node.id}`);\n node.autocomplete.destroy();\n node.autocomplete = null;\n return true;\n }\n\n // Check if events need rebinding (element exists but events not bound)\n // This can happen when Vue moves the element in the DOM\n if (node.autocomplete.needsRebind()) {\n console.log(`[Lora Manager] Autocomplete events need rebinding for node ${node.id}`);\n node.autocomplete.rebindEvents();\n }\n }\n\n return false;\n };\n\n const enhancedCallback = (value) => {\n // Check validity and invalidate if needed\n checkAndInvalidateAutocomplete();\n\n if (!node.autocomplete) {\n initializeAutocomplete();\n }\n\n if (typeof originalCallback === \"function\") {\n originalCallback.call(node, value);\n }\n };\n\n return enhancedCallback;\n}\n\n/**\n * Setup autocomplete cleanup when node is removed\n * @param {Object} node - The node instance\n */\nexport function setupAutocompleteCleanup(node) {\n // Override onRemoved to cleanup autocomplete\n const originalOnRemoved = node.onRemoved;\n node.onRemoved = function() {\n if (this.autocomplete) {\n this.autocomplete.destroy();\n this.autocomplete = null;\n }\n \n if (originalOnRemoved) {\n originalOnRemoved.call(this);\n }\n };\n}\n\n/**\n * Forward middle mouse (button 1) pointer events from a container to the ComfyUI canvas,\n * so that workflow panning works even when the pointer is over a DOM widget.\n * @param {HTMLElement} container - The root DOM element of the widget\n */\nexport function forwardMiddleMouseToCanvas(container) {\n if (!container) return;\n // Forward pointerdown\n container.addEventListener('pointerdown', (event) => {\n if (event.button === 1) {\n app.canvas.processMouseDown(event);\n }\n });\n // Forward pointermove\n container.addEventListener('pointermove', (event) => {\n if ((event.buttons & 4) === 4) {\n app.canvas.processMouseMove(event);\n }\n });\n // Forward pointerup\n container.addEventListener('pointerup', (event) => {\n if (event.button === 1) {\n app.canvas.processMouseUp(event);\n }\n });\n}\n\n/**\n * Forward wheel events from a container to the ComfyUI canvas for zooming,\n * unless the container has scrollable content.\n * This allows canvas zoom to work when hovering over DOM widgets.\n * @param {HTMLElement} container - The root DOM element of the widget\n * @param {Object} options - Configuration options\n * @param {boolean} options.captureWheel - If true, always capture wheel events (default: false)\n */\nexport function forwardWheelToCanvas(container, options = {}) {\n if (!container) return;\n\n const { captureWheel = false } = options;\n\n container.addEventListener('wheel', (event) => {\n // If explicitly capturing wheel (for internal scrolling), stop here\n if (captureWheel) {\n event.stopPropagation();\n return;\n }\n\n // Access ComfyUI app from global window\n const comfyApp = window.app;\n if (!comfyApp || !comfyApp.canvas || typeof comfyApp.canvas.processMouseWheel !== 'function') {\n return;\n }\n\n const deltaX = event.deltaX;\n const deltaY = event.deltaY;\n const isHorizontal = Math.abs(deltaX) > Math.abs(deltaY);\n\n // 1. Handle pinch-to-zoom (ctrlKey is true for pinch-to-zoom on most browsers)\n if (event.ctrlKey) {\n event.preventDefault();\n event.stopPropagation();\n comfyApp.canvas.processMouseWheel(event);\n return;\n }\n\n // 2. Horizontal scroll: pass to canvas (widgets usually don't scroll horizontally)\n if (isHorizontal) {\n event.preventDefault();\n event.stopPropagation();\n comfyApp.canvas.processMouseWheel(event);\n return;\n }\n\n // 3. Vertical scrolling: check if container is scrollable\n const canScrollY = container.scrollHeight > container.clientHeight;\n\n if (canScrollY) {\n // Container is scrollable, let it handle the wheel event but stop propagation\n // to prevent the canvas from zooming while the user is trying to scroll\n event.stopPropagation();\n } else {\n // Container is NOT scrollable, forward the wheel event to the canvas\n // so it can trigger zoom in/out\n event.preventDefault();\n event.stopPropagation();\n comfyApp.canvas.processMouseWheel(event);\n }\n }, { passive: false });\n}\n\n// Marks scrollable containers whose wheel scrolling must win over canvas zoom.\nconst LM_WHEEL_CLASS = 'lm-wheel-scrollable';\nlet lmWheelHookInstalled = false;\n\n/**\n * Keep vertical wheel scrolling inside a scrollable widget container, even in\n * Nodes 2.0 / Vue mode where ComfyUI's wheel→zoom handler runs on the document\n * in the capture phase (outer than any container-level listener).\n * Installs a single capture-phase hook on `window` (the outermost dispatch\n * point). When the wheel is over a marked, scrollable element, we manually\n * scroll it and fully consume the event so canvas zoom never sees it.\n */\nexport function enableListWheelScroll(container) {\n if (!container) return;\n container.classList.add(LM_WHEEL_CLASS);\n\n if (lmWheelHookInstalled) return;\n lmWheelHookInstalled = true;\n\n window.addEventListener('wheel', (event) => {\n // Let pinch/zoom and horizontal gestures pass through.\n if (event.ctrlKey) return;\n if (Math.abs(event.deltaX) > Math.abs(event.deltaY)) return;\n\n const target = event.target;\n if (!target || typeof target.closest !== 'function') return;\n const el = target.closest(`.${LM_WHEEL_CLASS}`);\n if (!el) return;\n\n const canScrollY = el.scrollHeight > el.clientHeight + 1;\n if (!canScrollY) return;\n\n // Translate deltaMode to approximate pixels.\n const unit = event.deltaMode === 1 ? 16\n : event.deltaMode === 2 ? el.clientHeight\n : 1;\n\n el.scrollTop += event.deltaY * unit;\n\n event.preventDefault();\n event.stopPropagation();\n event.stopImmediatePropagation();\n }, { capture: true, passive: false });\n}\n\n// Get connected Lora Pool node from pool_config input\nexport function getConnectedPoolConfigNode(node) {\n if (!node?.inputs) {\n return null;\n }\n\n for (const input of node.inputs) {\n if (input.name !== \"pool_config\" || !input.link) {\n continue;\n }\n\n const link = getLinkFromGraph(node.graph, input.link);\n if (!link) {\n continue;\n }\n\n const sourceNode = node.graph?.getNodeById?.(link.origin_id);\n if (sourceNode && sourceNode.comfyClass === \"Lora Pool (LoraManager)\") {\n return sourceNode;\n }\n }\n\n return null;\n}\n\n// Get pool config widget value from connected Lora Pool node\nexport function getPoolConfigFromConnectedNode(node) {\n const poolNode = getConnectedPoolConfigNode(node);\n if (!poolNode) {\n return null;\n }\n\n const isNodeActive = poolNode.mode === undefined || poolNode.mode === 0 || poolNode.mode === 3;\n if (!isNodeActive) {\n return null;\n }\n\n const poolWidget = poolNode.widgets?.find(w => w.name === \"pool_config\");\n return poolWidget?.value || null;\n}\n\n// Helper function to find and update downstream Lora Loader nodes\nexport function updateDownstreamLoaders(startNode, visited = new Set()) {\n const nodeKey = getNodeKey(startNode);\n if (!nodeKey || visited.has(nodeKey)) return;\n visited.add(nodeKey);\n\n // Check each output link\n if (startNode.outputs) {\n for (const output of startNode.outputs) {\n if (output.links) {\n for (const linkId of output.links) {\n const link = getLinkFromGraph(startNode.graph, linkId);\n if (link) {\n const targetNode = startNode.graph?.getNodeById?.(link.target_id);\n\n // If target is a Lora Loader, collect all active loras in the chain and update\n if (\n targetNode &&\n targetNode.comfyClass === \"Lora Loader (LoraManager)\"\n ) {\n const allActiveLoraNames =\n collectActiveLorasFromChain(targetNode);\n updateConnectedTriggerWords(targetNode, allActiveLoraNames);\n }\n // If target is another LORA_STACK chain node, recursively check its outputs\n else if (targetNode && isLoraChainNode(targetNode.comfyClass)) {\n updateDownstreamLoaders(targetNode, visited);\n }\n }\n }\n }\n }\n }\n}\n","/**\n * Mode change handler for LoRA provider nodes.\n *\n * Provides common mode change logic for nodes that provide LoRA configurations:\n * - Lora Stacker (LoraManager)\n * - Lora Randomizer (LoraManager)\n * - Lora Cycler (LoraManager)\n */\n\n// @ts-ignore\nimport { interceptModeChange } from '../../web/comfyui/utils.js'\n\n/**\n * List of node types that act as LoRA providers in the workflow chain.\n * These nodes can be traversed when collecting active LoRAs and can trigger\n * downstream loader updates when their mode or active LoRAs change.\n */\nexport const LORA_PROVIDER_NODE_TYPES = [\n \"Lora Stacker (LoraManager)\",\n \"Lora Randomizer (LoraManager)\",\n \"Lora Cycler (LoraManager)\",\n \"Create Hook LoRA (LoraManager)\",\n] as const;\n\n/**\n * Nodes that do not own LoRA state themselves, but merge or forward LORA_STACK\n * inputs so downstream trigger-word updates must traverse through them.\n */\nexport const LORA_STACK_AGGREGATOR_NODE_TYPES = [\n \"Lora Stack Combiner (LoraManager)\",\n] as const;\n\nexport const LORA_CHAIN_NODE_TYPES = [\n ...LORA_PROVIDER_NODE_TYPES,\n ...LORA_STACK_AGGREGATOR_NODE_TYPES,\n] as const;\n\nexport type LoraProviderNodeType = typeof LORA_PROVIDER_NODE_TYPES[number];\nexport type LoraStackAggregatorNodeType = typeof LORA_STACK_AGGREGATOR_NODE_TYPES[number];\nexport type LoraChainNodeType = typeof LORA_CHAIN_NODE_TYPES[number];\n\n/**\n * Check if a node class is a LoRA provider node.\n */\nexport function isLoraProviderNode(comfyClass: string): comfyClass is LoraProviderNodeType {\n return LORA_PROVIDER_NODE_TYPES.includes(comfyClass as LoraProviderNodeType);\n}\n\nexport function isLoraStackAggregatorNode(\n comfyClass: string\n): comfyClass is LoraStackAggregatorNodeType {\n return LORA_STACK_AGGREGATOR_NODE_TYPES.includes(comfyClass as LoraStackAggregatorNodeType);\n}\n\nexport function isLoraChainNode(comfyClass: string): comfyClass is LoraChainNodeType {\n return LORA_CHAIN_NODE_TYPES.includes(comfyClass as LoraChainNodeType);\n}\n\n/**\n * Extract active LoRA filenames from a node based on its type.\n *\n * For Lora Stacker and Lora Randomizer: extracts from lorasWidget (array of loras, filtered by active)\n * For Lora Cycler: extracts from cycler_config widget (single current_lora_filename)\n */\nexport function getActiveLorasFromNodeByType(node: any): Set {\n const comfyClass = node?.comfyClass;\n\n if (comfyClass === \"Lora Cycler (LoraManager)\") {\n return extractFromCyclerConfig(node);\n }\n\n if (isLoraStackAggregatorNode(comfyClass)) {\n return new Set();\n }\n\n // Default: use lorasWidget (works for Stacker and Randomizer)\n return extractFromLorasWidget(node);\n}\n\n/**\n * Extract active LoRAs from a node's lorasWidget.\n * Used by Lora Stacker and Lora Randomizer.\n */\nfunction extractFromLorasWidget(node: any): Set {\n const activeLoraNames = new Set();\n const lorasWidget = node.lorasWidget || node.widgets?.find((w: any) => w.name === 'loras');\n\n if (lorasWidget?.value) {\n lorasWidget.value.forEach((lora: any) => {\n if (lora.active) {\n activeLoraNames.add(lora.name);\n }\n });\n }\n\n return activeLoraNames;\n}\n\n/**\n * Extract the active LoRA from a Lora Cycler node.\n * The Cycler has only one active LoRA at a time, stored in cycler_config.current_lora_filename.\n */\nfunction extractFromCyclerConfig(node: any): Set {\n const activeLoraNames = new Set();\n const cyclerWidget = node.widgets?.find((w: any) => w.name === 'cycler_config');\n\n if (cyclerWidget?.value?.current_lora_filename) {\n activeLoraNames.add(cyclerWidget.value.current_lora_filename);\n }\n\n return activeLoraNames;\n}\n\n/**\n * Check if a mode value represents an active node.\n * Active modes: 0 (Always), 3 (On Trigger)\n * Inactive modes: 2 (Never), 4 (Bypass)\n */\nexport function isNodeActive(mode: number | undefined): boolean {\n return mode === undefined || mode === 0 || mode === 3;\n}\n\n/**\n * Setup a mode change handler for a node.\n *\n * Delegates to `interceptModeChange`, which observes the mode property\n * without shadowing the frontend's own `mode` accessor. Since ComfyUI\n * frontend 1.53, `mode` is backed by shell state (`node._state.mode`) that\n * serialization reads directly — redefining the property on the instance\n * would silently revert bypass/mute on save/reload.\n *\n * @param node - The node to set up the handler for\n * @param onModeChange - Callback function called when mode changes (receives newMode and oldMode)\n */\nexport function setupModeChangeHandler(\n node: any,\n onModeChange: (newMode: number, oldMode: number) => void\n): void {\n interceptModeChange(node, onModeChange);\n}\n\n/**\n * Create a mode change callback that updates downstream loaders.\n *\n * This is the standard callback used by all LoRA provider nodes.\n * When mode changes:\n * 1. Determine if the node is active (mode 0 or 3)\n * 2. Get active LoRAs (empty set if inactive)\n * 3. Call the optional node-specific callback (e.g., updateConnectedTriggerWords for Stacker)\n * 4. Update downstream loaders\n *\n * @param node - The node instance\n * @param updateDownstreamLoaders - Function to update downstream loaders (from utils.js)\n * @param nodeSpecificCallback - Optional callback for node-specific behavior\n */\nexport function createModeChangeCallback(\n node: any,\n updateDownstreamLoaders: (node: any) => void,\n nodeSpecificCallback?: (activeLoraNames: Set) => void\n): (newMode: number, oldMode: number) => void {\n return (newMode: number, _oldMode: number) => {\n const isNodeCurrentlyActive = isNodeActive(newMode);\n const activeLoraNames = isNodeCurrentlyActive\n ? getActiveLorasFromNodeByType(node)\n : new Set();\n\n // Node-specific handling (e.g., Lora Stacker's direct trigger toggle updates)\n if (nodeSpecificCallback) {\n nodeSpecificCallback(activeLoraNames);\n }\n\n // Always update downstream loaders\n updateDownstreamLoaders(node);\n };\n}\n","import { createApp, type App as VueApp } from 'vue'\nimport PrimeVue from 'primevue/config'\nimport LoraPoolWidget from '@/components/LoraPoolWidget.vue'\nimport LoraRandomizerWidget from '@/components/LoraRandomizerWidget.vue'\nimport LoraCyclerWidget from '@/components/LoraCyclerWidget.vue'\nimport JsonDisplayWidget from '@/components/JsonDisplayWidget.vue'\nimport AutocompleteTextWidget from '@/components/AutocompleteTextWidget.vue'\nimport LoraInfoWidget from '@/components/LoraInfoWidget.vue'\nimport { createVueWidgetCleanup } from './vue-widget-cleanup'\nimport type { LoraPoolConfig, RandomizerConfig, CyclerConfig } from './composables/types'\nimport {\n setupModeChangeHandler,\n createModeChangeCallback,\n LORA_CHAIN_NODE_TYPES\n} from './mode-change-handler'\n\nconst LORA_POOL_WIDGET_MIN_WIDTH = 500\nconst LORA_POOL_WIDGET_MIN_HEIGHT = 520\nconst LORA_RANDOMIZER_WIDGET_MIN_WIDTH = 500\nconst LORA_RANDOMIZER_WIDGET_MIN_HEIGHT = 448\nconst LORA_RANDOMIZER_WIDGET_MAX_HEIGHT = LORA_RANDOMIZER_WIDGET_MIN_HEIGHT\nconst LORA_CYCLER_WIDGET_MIN_WIDTH = 380\nconst LORA_CYCLER_WIDGET_MIN_HEIGHT = 408\nconst LORA_CYCLER_WIDGET_MAX_HEIGHT = LORA_CYCLER_WIDGET_MIN_HEIGHT\nconst JSON_DISPLAY_WIDGET_MIN_WIDTH = 300\nconst JSON_DISPLAY_WIDGET_MIN_HEIGHT = 200\nconst LORA_INFO_WIDGET_MIN_WIDTH = 300\nconst LORA_INFO_WIDGET_MIN_HEIGHT = 200\nconst AUTOCOMPLETE_TEXT_WIDGET_MIN_HEIGHT = 60\nconst AUTOCOMPLETE_TEXT_WIDGET_MAX_HEIGHT = 100\n// Per-modelType min size hints for node initial sizing.\n// These are returned from the factory so ComfyUI's _initialMinSize mechanism\n// gives the node a sensible default width (and height for prompt/embeddings).\nconst AUTOCOMPLETE_TEXT_MIN_WIDTH_DEFAULT = 400\nconst AUTOCOMPLETE_TEXT_MIN_HEIGHT_DEFAULT = 300\nconst AUTOCOMPLETE_METADATA_VERSION = 1\nconst LORA_MANAGER_WIDGET_IDS_PROPERTY = '__lm_widget_ids'\n\n// Access LiteGraph global for Vue DOM mode detection (matches AutocompleteTextWidget.vue)\ndeclare const LiteGraph: { vueNodesMode?: boolean } | undefined\n\n// @ts-ignore - ComfyUI external module\nimport { app } from '../../../scripts/app.js'\n// @ts-ignore - ComfyUI external module\nimport { api } from '../../../scripts/api.js'\n// @ts-ignore\nimport { getPoolConfigFromConnectedNode, getActiveLorasFromNode, updateConnectedTriggerWords, updateDownstreamLoaders } from '../../web/comfyui/utils.js'\n// @ts-ignore\nimport { stripAutocompleteMetadataFromPromptResult } from '../../web/comfyui/autocomplete.js'\n\n// Strip the autocomplete lastAccepted boundary from exported workflows.\n// lastAccepted carries old prompt text (insertedText/textSnapshot) and is\n// session-only state; it must not leak into exported JSON (#1093).\n// graphToPrompt is shared by workflow export, Export API and queueing.\n// Local saves go through the change-tracker snapshot (no graphToPrompt) and\n// are intentionally left untouched so cross-session caret continuity is kept.\n// Post-processing the resolved result avoids any window/race with\n// change-tracker or copy/paste serialization of live state.\nconst originalGraphToPrompt = app.graphToPrompt.bind(app)\napp.graphToPrompt = async (...args: unknown[]) => {\n const result = await originalGraphToPrompt(...args)\n stripAutocompleteMetadataFromPromptResult(result)\n return result\n}\n\nfunction forwardMiddleMouseToCanvas(container: HTMLElement) {\n if (!container) return\n\n container.addEventListener('pointerdown', (event) => {\n if (event.button === 1) {\n const canvas = app.canvas\n if (canvas && typeof canvas.processMouseDown === 'function') {\n canvas.processMouseDown(event)\n }\n }\n })\n\n container.addEventListener('pointermove', (event) => {\n if ((event.buttons & 4) === 4) {\n const canvas = app.canvas\n if (canvas && typeof canvas.processMouseMove === 'function') {\n canvas.processMouseMove(event)\n }\n }\n })\n\n container.addEventListener('pointerup', (event) => {\n if (event.button === 1) {\n const canvas = app.canvas\n if (canvas && typeof canvas.processMouseUp === 'function') {\n canvas.processMouseUp(event)\n }\n }\n })\n}\n\nconst vueApps = new Map()\nlet autocompleteTextWidgetInstanceId = 0\n\nexport function createAutocompleteTextWidgetInstanceId() {\n autocompleteTextWidgetInstanceId += 1\n return autocompleteTextWidgetInstanceId\n}\n\n// @ts-ignore\nfunction createLoraPoolWidget(node) {\n const container = document.createElement('div')\n container.id = `lora-pool-widget-${node.id}`\n container.style.width = '100%'\n container.style.height = '100%'\n container.style.display = 'flex'\n container.style.flexDirection = 'column'\n container.style.overflow = 'hidden'\n\n forwardMiddleMouseToCanvas(container)\n\n let internalValue: LoraPoolConfig | undefined\n\n const widget = node.addDOMWidget(\n 'pool_config',\n 'LORA_POOL_CONFIG',\n container,\n {\n getValue() {\n return internalValue\n },\n setValue(v: LoraPoolConfig) {\n internalValue = v\n // ComfyUI automatically calls widget.callback after setValue\n // No need for custom onSetValue mechanism\n },\n serialize: true,\n // Keep LM DOM widgets out of the right-side Properties Panel: the panel\n // falls back to WidgetLegacy for unknown widget types and writes\n // widget.width onto the real widget, squashing the canvas overlay\n // (ComfyUI_frontend #11574).\n hideInPanel: true,\n // Per dev guide: providing getMinHeight via options allows the system to\n // skip expensive DOM measurements during rendering loop, improving performance\n getMinHeight() {\n return LORA_POOL_WIDGET_MIN_HEIGHT\n }\n }\n )\n\n const vueApp = createApp(LoraPoolWidget, {\n widget,\n node\n })\n\n vueApp.use(PrimeVue, {\n unstyled: true,\n ripple: false\n })\n\n vueApp.mount(container)\n vueApps.set(node.id, vueApp)\n\n widget.computeLayoutSize = () => {\n const minWidth = LORA_POOL_WIDGET_MIN_WIDTH\n const minHeight = LORA_POOL_WIDGET_MIN_HEIGHT\n\n return { minHeight, minWidth }\n }\n\n widget.onRemove = () => {\n const vueApp = vueApps.get(node.id)\n if (vueApp) {\n vueApp.unmount()\n vueApps.delete(node.id)\n }\n }\n\n return { widget }\n}\n\n// @ts-ignore\nfunction createLoraRandomizerWidget(node) {\n const container = document.createElement('div')\n container.id = `lora-randomizer-widget-${node.id}`\n container.style.width = '100%'\n container.style.height = '100%'\n container.style.display = 'flex'\n container.style.flexDirection = 'column'\n container.style.overflow = 'hidden'\n\n forwardMiddleMouseToCanvas(container)\n\n // Initialize with default config to avoid sending undefined/empty string to backend\n const defaultConfig: RandomizerConfig = {\n count_mode: 'range',\n count_fixed: 3,\n count_min: 2,\n count_max: 5,\n model_strength_min: 0.0,\n model_strength_max: 1.0,\n use_same_clip_strength: true,\n clip_strength_min: 0.0,\n clip_strength_max: 1.0,\n roll_mode: 'fixed',\n use_recommended_strength: false,\n recommended_strength_scale_min: 0.5,\n recommended_strength_scale_max: 1.0,\n }\n let internalValue: RandomizerConfig = defaultConfig\n\n const widget = node.addDOMWidget(\n 'randomizer_config',\n 'RANDOMIZER_CONFIG',\n container,\n {\n getValue() {\n return internalValue\n },\n setValue(v: RandomizerConfig) {\n internalValue = v\n // ComfyUI automatically calls widget.callback after setValue\n // No need for custom onSetValue mechanism\n },\n serialize: true,\n hideInPanel: true,\n getMinHeight() {\n return LORA_RANDOMIZER_WIDGET_MIN_HEIGHT\n }\n }\n )\n\n // Add method to get pool config from connected node\n node.getPoolConfig = () => getPoolConfigFromConnectedNode(node)\n\n // Handle roll event from Vue component\n widget.onRoll = (randomLoras: any[]) => {\n // Find the loras widget on this node and update it\n const lorasWidget = node.widgets.find((w: any) => w.name === 'loras')\n if (lorasWidget) {\n lorasWidget.value = randomLoras\n }\n }\n\n const vueApp = createApp(LoraRandomizerWidget, {\n widget,\n node,\n api\n })\n\n vueApp.use(PrimeVue, {\n unstyled: true,\n ripple: false\n })\n\n vueApp.mount(container)\n vueApps.set(node.id + 10000, vueApp) // Offset to avoid collision with pool widget\n\n widget.computeLayoutSize = () => {\n const minWidth = LORA_RANDOMIZER_WIDGET_MIN_WIDTH\n const minHeight = LORA_RANDOMIZER_WIDGET_MIN_HEIGHT\n const maxHeight = LORA_RANDOMIZER_WIDGET_MAX_HEIGHT\n\n return { minHeight, minWidth, maxHeight }\n }\n\n widget.onRemove = () => {\n const vueApp = vueApps.get(node.id + 10000)\n if (vueApp) {\n vueApp.unmount()\n vueApps.delete(node.id + 10000)\n }\n }\n\n return { widget }\n}\n\n// @ts-ignore\nfunction createLoraCyclerWidget(node) {\n const container = document.createElement('div')\n container.id = `lora-cycler-widget-${node.id}`\n container.style.width = '100%'\n container.style.height = '100%'\n container.style.display = 'flex'\n container.style.flexDirection = 'column'\n container.style.overflow = 'hidden'\n\n forwardMiddleMouseToCanvas(container)\n\n const defaultConfig: CyclerConfig = {\n current_index: 1,\n total_count: 0,\n pool_config_hash: '',\n model_strength: 1.0,\n clip_strength: 1.0,\n use_same_clip_strength: true,\n use_preset_strength: false,\n preset_strength_scale: 1.0,\n sort_by: 'filename',\n current_lora_name: '',\n current_lora_filename: '',\n repeat_count: 1,\n repeat_used: 0,\n is_paused: false,\n include_no_lora: false,\n }\n let internalValue: CyclerConfig | undefined = defaultConfig\n\n const widget = node.addDOMWidget(\n 'cycler_config',\n 'CYCLER_CONFIG',\n container,\n {\n getValue() {\n return internalValue\n },\n setValue(v: CyclerConfig) {\n const oldFilename = internalValue?.current_lora_filename\n internalValue = v\n // ComfyUI automatically calls widget.callback after setValue\n // No need for custom onSetValue mechanism\n // Update downstream loaders when the active LoRA filename changes\n if (oldFilename !== v?.current_lora_filename) {\n updateDownstreamLoaders(node)\n }\n },\n serialize: true,\n hideInPanel: true,\n getMinHeight() {\n return LORA_CYCLER_WIDGET_MIN_HEIGHT\n }\n }\n )\n\n // Add method to get pool config from connected node\n node.getPoolConfig = () => getPoolConfigFromConnectedNode(node)\n\n const vueApp = createApp(LoraCyclerWidget, {\n widget,\n node,\n api\n })\n\n vueApp.use(PrimeVue, {\n unstyled: true,\n ripple: false\n })\n\n vueApp.mount(container)\n vueApps.set(node.id + 30000, vueApp) // Offset to avoid collision with other widgets\n\n widget.computeLayoutSize = () => {\n const minWidth = LORA_CYCLER_WIDGET_MIN_WIDTH\n const minHeight = LORA_CYCLER_WIDGET_MIN_HEIGHT\n const maxHeight = LORA_CYCLER_WIDGET_MAX_HEIGHT\n\n return { minHeight, minWidth, maxHeight }\n }\n\n widget.onRemove = () => {\n const vueApp = vueApps.get(node.id + 30000)\n if (vueApp) {\n vueApp.unmount()\n vueApps.delete(node.id + 30000)\n }\n }\n\n return { widget }\n}\n\n// @ts-ignore\nfunction createJsonDisplayWidget(node) {\n const container = document.createElement('div')\n container.id = `json-display-widget-${node.id}`\n container.style.width = '100%'\n container.style.height = '100%'\n container.style.display = 'flex'\n container.style.flexDirection = 'column'\n container.style.overflow = 'hidden'\n\n forwardMiddleMouseToCanvas(container)\n\n let internalValue: Record | undefined\n\n const widget = node.addDOMWidget(\n 'metadata',\n 'JSON_DISPLAY',\n container,\n {\n getValue() {\n return internalValue\n },\n setValue(v: Record) {\n internalValue = v\n if (typeof widget.onSetValue === 'function') {\n widget.onSetValue(v)\n }\n },\n serialize: false, // Display-only widget - don't save metadata in workflows\n hideInPanel: true,\n getMinHeight() {\n return JSON_DISPLAY_WIDGET_MIN_HEIGHT\n }\n }\n )\n\n const vueApp = createApp(JsonDisplayWidget, {\n widget,\n node\n })\n\n vueApp.use(PrimeVue, {\n unstyled: true,\n ripple: false\n })\n\n vueApp.mount(container)\n vueApps.set(node.id + 20000, vueApp) // Offset to avoid collision with other widgets\n\n widget.computeLayoutSize = () => {\n const minWidth = JSON_DISPLAY_WIDGET_MIN_WIDTH\n const minHeight = JSON_DISPLAY_WIDGET_MIN_HEIGHT\n\n return { minHeight, minWidth }\n }\n\n widget.onRemove = () => {\n const vueApp = vueApps.get(node.id + 20000)\n if (vueApp) {\n vueApp.unmount()\n vueApps.delete(node.id + 20000)\n }\n }\n\n return { widget }\n}\n\nconst widgetInputOptions: Map = new Map()\n\nfunction getSerializableWidgetNames(node: any): string[] {\n return (node.widgets || [])\n .filter((widget: any) => widget && widget.serialize !== false)\n .map((widget: any) => widget.name)\n}\n\nfunction createAutocompleteMetadataValue(textWidgetName = 'text') {\n return {\n version: AUTOCOMPLETE_METADATA_VERSION,\n textWidgetName\n }\n}\n\nfunction shouldBypassAutocompleteWidgetMigration(\n node: any,\n widgetValues: unknown[]\n): boolean {\n const inputDefs = node?.constructor?.nodeData?.inputs\n if (!inputDefs || !Array.isArray(widgetValues)) {\n return false\n }\n\n const widgetNames = new Set((node.widgets || []).map((widget: any) => widget?.name))\n const hasAutocompleteMetadataWidget = Array.from(widgetNames).some((name) =>\n typeof name === 'string' && name.startsWith('__lm_autocomplete_meta_')\n )\n\n if (!hasAutocompleteMetadataWidget) {\n return false\n }\n\n const originalWidgetsInputs = Object.values(inputDefs).filter((input: any) =>\n widgetNames.has(input.name) || input.forceInput\n )\n\n const widgetIndexHasForceInput = originalWidgetsInputs.flatMap((input: any) =>\n input.control_after_generate\n ? [!!input.forceInput, false]\n : [!!input.forceInput]\n )\n\n const result = (\n widgetIndexHasForceInput.some(Boolean) &&\n widgetIndexHasForceInput.length === widgetValues.length\n )\n\n return result\n}\n\nfunction remapWidgetValuesByName(\n widgetValues: unknown[],\n savedWidgetNames: string[],\n currentWidgetNames: string[]\n): unknown[] {\n const valueByName = new Map()\n savedWidgetNames.forEach((name, index) => {\n if (index < widgetValues.length) {\n valueByName.set(name, widgetValues[index])\n }\n })\n\n const currentWidgetNameSet = new Set(currentWidgetNames)\n const remappedValues: unknown[] = []\n for (const name of currentWidgetNames) {\n if (valueByName.has(name)) {\n remappedValues.push(valueByName.get(name))\n }\n }\n\n // Append values for saved widget names that are NOT in the current widget\n // list (e.g. forceInput widgets like \"seed\" that haven't been converted\n // back to DOM widgets yet at configure time). Without these, the\n // resulting array may accidentally match the length of ComfyUI's\n // widgetIndexHasForceInput array, causing migrateWidgetsValues to\n // incorrectly filter out the wrong values and drop real widget content.\n for (const name of savedWidgetNames) {\n if (!currentWidgetNameSet.has(name) && valueByName.has(name)) {\n remappedValues.push(valueByName.get(name))\n }\n }\n\n return remappedValues\n}\n\nfunction injectDefaultAutocompleteMetadataValues(\n widgetValues: unknown[],\n currentWidgetNames: string[]\n): unknown[] {\n const repairedValues: unknown[] = []\n let legacyValueIndex = 0\n\n for (const widgetName of currentWidgetNames) {\n if (widgetName.startsWith('__lm_autocomplete_meta_')) {\n const textWidgetName = widgetName.replace('__lm_autocomplete_meta_', '') || 'text'\n repairedValues.push(createAutocompleteMetadataValue(textWidgetName))\n continue\n }\n\n if (legacyValueIndex < widgetValues.length) {\n repairedValues.push(widgetValues[legacyValueIndex])\n legacyValueIndex++\n }\n }\n\n return repairedValues\n}\n\nfunction normalizeAutocompleteWidgetValues(node: any, info: any) {\n if (!info || !Array.isArray(info.widgets_values)) {\n return\n }\n\n const currentWidgetNames = getSerializableWidgetNames(node)\n\n if (currentWidgetNames.length === 0) {\n return\n }\n\n const savedWidgetNames = info.properties?.[LORA_MANAGER_WIDGET_IDS_PROPERTY]\n\n if (Array.isArray(savedWidgetNames) && savedWidgetNames.length > 0) {\n const remappedValues = remapWidgetValuesByName(\n info.widgets_values,\n savedWidgetNames,\n currentWidgetNames\n )\n info.widgets_values = remappedValues\n return\n }\n\n const metadataWidgetCount = currentWidgetNames.filter((name) =>\n name.startsWith('__lm_autocomplete_meta_')\n ).length\n\n if (\n metadataWidgetCount > 0 &&\n info.widgets_values.length === currentWidgetNames.length - metadataWidgetCount\n ) {\n const repairedValues = injectDefaultAutocompleteMetadataValues(\n info.widgets_values,\n currentWidgetNames\n )\n info.widgets_values = repairedValues\n }\n}\n\nfunction applyAutocompleteTextLayoutFix(\n widget: any,\n _container: HTMLElement | undefined,\n isVueMode: boolean\n): void {\n // In Vue rendering mode the WidgetDOM wrapper handles sizing, so we\n // only provide a computeSize hint and leave the container unconstrained.\n // In canvas mode we clear all custom sizing so LiteGraph's default\n // widget-area layout takes over. Neither path sets a hard max-height;\n // the textarea can grow freely (e.g. in app mode where\n // [&_textarea]:resize-y applies).\n if (isVueMode) {\n ;(widget as any).computeLayoutSize = undefined\n widget.computeSize = (width?: number) =>\n [width ?? 200, AUTOCOMPLETE_TEXT_WIDGET_MAX_HEIGHT - 4]\n } else {\n delete (widget as any).computeLayoutSize\n delete (widget as any).computeSize\n }\n}\n\n// Listen for Vue DOM mode setting changes and dispatch custom event\nconst initVueDomModeListener = () => {\n if (app.ui?.settings?.addEventListener) {\n app.ui.settings.addEventListener('Comfy.VueNodes.Enabled.change', () => {\n // Use requestAnimationFrame to ensure the setting value has been updated\n // before we read it (the event may fire before internal state updates)\n requestAnimationFrame(() => {\n const isVueDomMode = app.ui?.settings?.getSettingValue?.('Comfy.VueNodes.Enabled') ?? false\n\n if (app.graph?.nodes) {\n for (const node of app.graph.nodes) {\n const textWidget = node.widgets?.find(\n (w: any) => w.type === 'AUTOCOMPLETE_TEXT_LORAS'\n )\n if (!textWidget) continue\n const container = (textWidget as any).element as HTMLElement | undefined\n applyAutocompleteTextLayoutFix(textWidget, container, isVueDomMode)\n }\n }\n\n requestAnimationFrame(() => {\n for (const nodeEl of document.querySelectorAll('[data-node-id]')) {\n const grid = nodeEl.querySelector('[data-testid=\"node-widgets\"]') as HTMLElement | null\n if (!grid) continue\n const nodeId = nodeEl.getAttribute('data-node-id')\n const node = app.graph?.getNodeById(nodeId as any)\n if (!node) continue\n const rows: string[] = []\n let needsFix = false\n for (const w of node.widgets ?? []) {\n if (w.type === 'LORA_MANAGER_AUTOCOMPLETE_METADATA') {\n rows.push('min-content')\n } else if (w.name === 'loras') {\n rows.push('auto')\n } else if (w.name === 'text' && w.type === 'AUTOCOMPLETE_TEXT_LORAS') {\n rows.push(isVueDomMode ? 'min-content' : 'auto')\n needsFix = true\n } else {\n rows.push('auto')\n }\n }\n if (needsFix) {\n grid.style.gridTemplateRows = rows.join(' ')\n }\n }\n })\n\n app.canvas?.setDirty(true, true)\n\n document.dispatchEvent(new CustomEvent('lora-manager:vue-mode-change', {\n detail: { isVueDomMode }\n }))\n })\n })\n }\n}\n\n// Initialize listener when app is ready\nif (app.ui?.settings) {\n initVueDomModeListener()\n} else {\n // Defer until app is ready\n const checkAppReady = setInterval(() => {\n if (app.ui?.settings) {\n initVueDomModeListener()\n clearInterval(checkAppReady)\n }\n }, 100)\n}\n\n// @ts-ignore\nfunction createLoraInfoWidget(node: any) {\n const container = document.createElement('div')\n container.id = `lora-info-widget-${node.id}`\n container.style.width = '100%'\n container.style.height = '100%'\n container.style.display = 'flex'\n container.style.flexDirection = 'column'\n container.style.overflow = 'hidden'\n\n forwardMiddleMouseToCanvas(container)\n\n let internalValue: { name?: string; notes?: string; filePath?: string; activeTab?: string } | undefined\n\n const widget = node.addDOMWidget(\n 'lora_info_display',\n 'LORA_INFO_DISPLAY',\n container,\n {\n getValue() {\n return internalValue\n },\n setValue(v: { name?: string; notes?: string; filePath?: string; activeTab?: string }) {\n internalValue = v\n if (typeof widget.onSetValue === 'function') {\n widget.onSetValue(v)\n }\n },\n serialize: true,\n hideInPanel: true,\n getMinHeight() {\n return LORA_INFO_WIDGET_MIN_HEIGHT\n }\n }\n )\n\n const vueApp = createApp(LoraInfoWidget, {\n widget,\n node,\n api,\n app,\n isVueMode: typeof LiteGraph !== 'undefined' && LiteGraph.vueNodesMode,\n })\n\n vueApp.use(PrimeVue, {\n unstyled: true,\n ripple: false\n })\n\n vueApp.mount(container)\n vueApps.set(node.id + 40000, vueApp) // Offset to avoid collision\n\n widget.computeLayoutSize = () => {\n const minWidth = LORA_INFO_WIDGET_MIN_WIDTH\n const minHeight = LORA_INFO_WIDGET_MIN_HEIGHT\n\n return { minHeight, minWidth }\n }\n\n widget.onRemove = () => {\n const vueApp = vueApps.get(node.id + 40000)\n if (vueApp) {\n vueApp.unmount()\n vueApps.delete(node.id + 40000)\n }\n }\n\n return { widget }\n}\n\n// Factory function for creating autocomplete text widgets\n// @ts-ignore\nfunction createAutocompleteTextWidgetFactory(\n node: any,\n widgetName: string,\n modelType: 'loras' | 'prompt',\n inputOptions: { placeholder?: string } = {}\n) {\n const metadataWidgetName = `__lm_autocomplete_meta_${widgetName}`\n\n let container: HTMLElement | null = null\n\n const existingContainers = document.querySelectorAll(\n '[id^=\"autocomplete-text-widget-\"]'\n )\n for (const el of existingContainers) {\n if (el.children.length === 0) {\n container = el\n break\n }\n }\n\n if (!container) {\n const instanceId = String(createAutocompleteTextWidgetInstanceId())\n container = document.createElement('div')\n container.id = `autocomplete-text-widget-${instanceId}`\n container.style.width = '100%'\n container.style.height = '100%'\n container.style.display = 'flex'\n container.style.flexDirection = 'column'\n container.style.overflow = 'hidden'\n forwardMiddleMouseToCanvas(container)\n }\n\n // Store textarea reference on the container element so cloned widgets can access it\n // This is necessary because when widgets are promoted to subgraph nodes,\n // the cloned widget shares the same element but needs access to inputEl\n const widgetElementRef = { inputEl: undefined as HTMLTextAreaElement | undefined }\n ;(container as any).__widgetInputEl = widgetElementRef\n\n const metadataWidget = node.addWidget('text', metadataWidgetName, {\n version: AUTOCOMPLETE_METADATA_VERSION,\n textWidgetName: widgetName\n })\n metadataWidget.value = createAutocompleteMetadataValue(widgetName)\n metadataWidget.type = 'LORA_MANAGER_AUTOCOMPLETE_METADATA'\n metadataWidget.hidden = true\n metadataWidget.computeSize = () => [0, -4]\n metadataWidget.serializeValue = () => metadataWidget.value\n\n const widget = node.addDOMWidget(\n widgetName,\n `AUTOCOMPLETE_TEXT_${modelType.toUpperCase()}`,\n container,\n {\n getValue() {\n // Access inputEl from widget or from the shared element reference\n const inputEl = widget.inputEl ?? (container as any).__widgetInputEl?.inputEl\n return inputEl?.value ?? ''\n },\n setValue(v: string) {\n // Access inputEl from widget or from the shared element reference\n const inputEl = widget.inputEl ?? (container as any).__widgetInputEl?.inputEl\n if (inputEl) {\n inputEl.value = v ?? ''\n // Notify Vue component of value change via custom event\n inputEl.dispatchEvent(new CustomEvent('lora-manager:autocomplete-value-changed', {\n detail: { value: v ?? '' }\n }))\n } else {\n ;(widget as any)._pendingValue = v ?? ''\n }\n // Also call onSetValue if defined (for Vue component integration)\n if (typeof widget.onSetValue === 'function') {\n widget.onSetValue(v ?? '')\n }\n },\n serialize: true,\n hideInPanel: true,\n getMinHeight() {\n return AUTOCOMPLETE_TEXT_WIDGET_MIN_HEIGHT\n },\n ...(modelType === 'loras' && {\n getMaxHeight() {\n return AUTOCOMPLETE_TEXT_WIDGET_MAX_HEIGHT\n }\n })\n }\n )\n widget.metadataWidget = metadataWidget\n\n // Get spellcheck setting from ComfyUI settings (default: false)\n const spellcheck = app.ui?.settings?.getSettingValue?.('Comfy.TextareaWidget.Spellcheck') ?? false\n\n const maxHeight = modelType === 'loras' ? AUTOCOMPLETE_TEXT_WIDGET_MAX_HEIGHT : undefined\n\n const vueApp = createApp(AutocompleteTextWidget, {\n widget,\n node,\n modelType,\n placeholder: inputOptions.placeholder || widgetName,\n showPreview: true,\n spellcheck,\n maxHeight\n })\n\n vueApp.use(PrimeVue, {\n unstyled: true,\n ripple: false\n })\n\n vueApp.mount(container)\n const appKey = container.id\n vueApps.set(appKey, vueApp)\n\n if (maxHeight) {\n container.style.minHeight = `${AUTOCOMPLETE_TEXT_WIDGET_MIN_HEIGHT}px`\n }\n\n if (modelType === 'loras') {\n applyAutocompleteTextLayoutFix(\n widget,\n container,\n typeof LiteGraph !== 'undefined' && LiteGraph.vueNodesMode === true\n )\n }\n\n const vueCleanup = createVueWidgetCleanup(vueApp, () => {\n vueApps.delete(appKey)\n })\n\n widget.onRemove = () => {\n vueCleanup()\n }\n\n // Return minWidth/minHeight hints so ComfyUI's _initialMinSize mechanism\n // sets a sensible initial node width (and height for prompt/embeddings).\n // loras modelType retains its existing height constraints (getMaxHeight: 100).\n const minWidth = AUTOCOMPLETE_TEXT_MIN_WIDTH_DEFAULT\n const minHeight = modelType === 'loras' ? undefined : AUTOCOMPLETE_TEXT_MIN_HEIGHT_DEFAULT\n\n return { widget, minWidth, minHeight }\n}\n\napp.registerExtension({\n name: 'LoraManager.VueWidgets',\n\n getCustomWidgets() {\n return {\n // @ts-ignore\n LORA_POOL_CONFIG(node) {\n return createLoraPoolWidget(node)\n },\n // @ts-ignore\n RANDOMIZER_CONFIG(node) {\n return createLoraRandomizerWidget(node)\n },\n // @ts-ignore\n CYCLER_CONFIG(node) {\n return createLoraCyclerWidget(node)\n },\n // Autocomplete text widget for LoRAs (used by Lora Loader, Lora Stacker, WanVideo Lora Select)\n // @ts-ignore\n AUTOCOMPLETE_TEXT_LORAS(node) {\n const options = widgetInputOptions.get(`${node.comfyClass}:text`) || {}\n return createAutocompleteTextWidgetFactory(node, 'text', 'loras', options)\n },\n // Autocomplete text widget for prompt (used by Prompt and Text nodes)\n // @ts-ignore\n AUTOCOMPLETE_TEXT_PROMPT(node) {\n const options = widgetInputOptions.get(`${node.comfyClass}:text`) || {}\n return createAutocompleteTextWidgetFactory(node, 'text', 'prompt', options)\n },\n }\n },\n\n // Add display-only widget to Debug Metadata node\n // Register mode change handlers for LoRA provider nodes\n // Extract and store input options for autocomplete widgets\n // @ts-ignore\n async beforeRegisterNodeDef(nodeType, nodeData) {\n const comfyClass = nodeType.comfyClass\n const inputs = { ...nodeData.input?.required, ...nodeData.input?.optional }\n let hasAutocompleteWidget = false\n\n // Extract and store input options for autocomplete widgets\n for (const [inputName, inputDef] of Object.entries(inputs)) {\n // @ts-ignore\n if (Array.isArray(inputDef) && typeof inputDef[0] === 'string' && inputDef[0].startsWith('AUTOCOMPLETE_TEXT_')) {\n // @ts-ignore\n const options = inputDef[1] || {}\n widgetInputOptions.set(`${nodeData.name}:${inputName}`, options)\n hasAutocompleteWidget = true\n }\n }\n\n if (hasAutocompleteWidget) {\n const originalOnSerialize = nodeType.prototype.onSerialize\n const originalConfigure = nodeType.prototype.configure\n\n nodeType.prototype.onSerialize = function (serialized: any) {\n originalOnSerialize?.apply(this, arguments)\n\n serialized.properties = serialized.properties || {}\n const widgetIds = getSerializableWidgetNames(this)\n serialized.properties[LORA_MANAGER_WIDGET_IDS_PROPERTY] = widgetIds\n }\n\n nodeType.prototype.configure = function (info: any) {\n normalizeAutocompleteWidgetValues(this, info)\n\n const bypassResult = shouldBypassAutocompleteWidgetMigration(this, info?.widgets_values ?? [])\n\n if (bypassResult) {\n info.widgets_values = [...(info.widgets_values ?? []), null]\n }\n\n return originalConfigure?.apply(this, arguments)\n }\n }\n\n // Register mode change handlers for LORA_STACK chain nodes\n if (LORA_CHAIN_NODE_TYPES.includes(comfyClass)) {\n const originalOnNodeCreated = nodeType.prototype.onNodeCreated\n\n nodeType.prototype.onNodeCreated = function () {\n originalOnNodeCreated?.apply(this, arguments)\n\n // Create node-specific callback for Lora Stacker (updates direct trigger toggles)\n const nodeSpecificCallback = comfyClass === \"Lora Stacker (LoraManager)\"\n ? (activeLoraNames: Set) => updateConnectedTriggerWords(this, activeLoraNames)\n : undefined\n\n // Create and set up the mode change handler\n const onModeChange = createModeChangeCallback(this, updateDownstreamLoaders, nodeSpecificCallback)\n setupModeChangeHandler(this, onModeChange)\n }\n }\n\n // Add the JSON display widget to Debug Metadata node\n if (nodeData.name === 'Debug Metadata (LoraManager)') {\n const onNodeCreated = nodeType.prototype.onNodeCreated\n\n nodeType.prototype.onNodeCreated = function () {\n onNodeCreated?.apply(this, [])\n\n // Add the JSON display widget\n createJsonDisplayWidget(this)\n }\n }\n\n // Add the Lora Info display widget\n if (nodeData.name === 'Lora Info (LoraManager)') {\n const onNodeCreated = nodeType.prototype.onNodeCreated\n\n nodeType.prototype.onNodeCreated = function () {\n onNodeCreated?.apply(this, [])\n\n // Create the lora info display widget\n createLoraInfoWidget(this)\n }\n }\n }\n})\n"],"names":["i","hasOwnProperty","c","s","a","b","isRef","v","_a","l","computed","self","readonly","watch","effect","p","callHook","remove","ref","h","m","createApp","app","isModelListener","emit","remove2","style","setup","tt","resolve","d","camelize$1","k","ie","ae","N","$","Y","ot","P","$e","J","ut","mt","se","St","yt","Ee","xt","bt","_t","y","T","z","_","re","K","A","G","H","ee","he","Oe","kt","we","_typeof","o","ownKeys","r","_objectSpread","_defineProperty","_toPropertyKey","_toPrimitive","css","isClient","document","stop","load","_id","setAttributes","setAttribute","unload","isExist","dt","css$1","isNotEmpty","minifyCSS","Theme","extend","EventBus","PrimeVue","ThemeService","loadCommonTheme","global","mergeKeys","_createElementBlock","_normalizeClass","_createElementVNode","_hoisted_1","_toDisplayString","_openBlock","_hoisted_2","$emit","_createVNode","_hoisted_3","_hoisted_4","_hoisted_5","_Fragment","_renderList","_createBlock","_hoisted_6","_hoisted_7","_hoisted_8","_hoisted_9","_hoisted_10","_hoisted_11","_hoisted_12","_hoisted_14","_hoisted_15","_Transition","_Teleport","$slots","_renderSlot","_withModifiers","_e","api","_unref","percent","_normalizeStyle","_hoisted_13","_hoisted_16","_hoisted_17","_hoisted_18","w","lorasWidget","_createTextVNode","defaultOptions","_withDirectives","LORA_MANAGER_WIDGET_IDS_PROPERTY","LORA_PROVIDER_NODE_TYPES","LORA_STACK_AGGREGATOR_NODE_TYPES","LORA_CHAIN_NODE_TYPES","isLoraStackAggregatorNode","isNodeActive","updateDownstreamLoaders","vueApp","_b"],"mappings":";;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAMA,SAAS,QAAQ,KAAK;AACpB,QAAM,MAAsB,uBAAO,OAAO,IAAI;AAC9C,aAAW,OAAO,IAAI,MAAM,GAAG,EAAG,KAAI,GAAG,IAAI;AAC7C,SAAO,CAAC,QAAQ,OAAO;AACzB;AAEA,MAAM,YAA4E,CAAA;AAClF,MAAM,YAA4E,CAAA;AAClF,MAAM,OAAO,MAAM;AACnB;AACA,MAAM,KAAK,MAAM;AACjB,MAAM,OAAO,CAAC,QAAQ,IAAI,WAAW,CAAC,MAAM,OAAO,IAAI,WAAW,CAAC,MAAM;AAAA,CACxE,IAAI,WAAW,CAAC,IAAI,OAAO,IAAI,WAAW,CAAC,IAAI;AAChD,MAAM,kBAAkB,CAAC,QAAQ,IAAI,WAAW,WAAW;AAC3D,MAAM,SAAS,OAAO;AACtB,MAAM,SAAS,CAAC,KAAK,OAAO;AAC1B,QAAMA,KAAI,IAAI,QAAQ,EAAE;AACxB,MAAIA,KAAI,IAAI;AACV,QAAI,OAAOA,IAAG,CAAC;AAAA,EACjB;AACF;AACA,MAAMC,mBAAiB,OAAO,UAAU;AACxC,MAAM,SAAS,CAAC,KAAK,QAAQA,iBAAe,KAAK,KAAK,GAAG;AACzD,MAAM,UAAU,MAAM;AACtB,MAAM,QAAQ,CAAC,QAAQ,aAAa,GAAG,MAAM;AAC7C,MAAM,QAAQ,CAAC,QAAQ,aAAa,GAAG,MAAM;AAC7C,MAAM,SAAS,CAAC,QAAQ,aAAa,GAAG,MAAM;AAE9C,MAAM,aAAa,CAAC,QAAQ,OAAO,QAAQ;AAC3C,MAAM,WAAW,CAAC,QAAQ,OAAO,QAAQ;AACzC,MAAM,WAAW,CAAC,QAAQ,OAAO,QAAQ;AACzC,MAAM,WAAW,CAAC,QAAQ,QAAQ,QAAQ,OAAO,QAAQ;AACzD,MAAM,YAAY,CAAC,QAAQ;AACzB,UAAQ,SAAS,GAAG,KAAK,WAAW,GAAG,MAAM,WAAW,IAAI,IAAI,KAAK,WAAW,IAAI,KAAK;AAC3F;AACA,MAAM,iBAAiB,OAAO,UAAU;AACxC,MAAM,eAAe,CAAC,UAAU,eAAe,KAAK,KAAK;AACzD,MAAM,YAAY,CAAC,UAAU;AAC3B,SAAO,aAAa,KAAK,EAAE,MAAM,GAAG,EAAE;AACxC;AACA,MAAM,gBAAgB,CAAC,QAAQ,aAAa,GAAG,MAAM;AACrD,MAAM,eAAe,CAAC,QAAQ,SAAS,GAAG,KAAK,QAAQ,SAAS,IAAI,CAAC,MAAM,OAAO,KAAK,SAAS,KAAK,EAAE,MAAM;AAC7G,MAAM,iBAAiC;AAAA;AAAA,EAErC;AACF;AAIA,MAAM,sBAAsB,CAAC,OAAO;AAClC,QAAM,QAAwB,uBAAO,OAAO,IAAI;AAChD,UAAQ,CAAC,QAAQ;AACf,UAAM,MAAM,MAAM,GAAG;AACrB,WAAO,QAAQ,MAAM,GAAG,IAAI,GAAG,GAAG;AAAA,EACpC;AACF;AACA,MAAM,aAAa;AACnB,MAAM,WAAW;AAAA,EACf,CAAC,QAAQ;AACP,WAAO,IAAI,QAAQ,YAAY,CAACC,OAAMA,GAAE,MAAM,CAAC,EAAE,aAAa;AAAA,EAChE;AACF;AACA,MAAM,cAAc;AACpB,MAAM,YAAY;AAAA,EAChB,CAAC,QAAQ,IAAI,QAAQ,aAAa,KAAK,EAAE,YAAA;AAC3C;AACA,MAAM,aAAa,oBAAoB,CAAC,QAAQ;AAC9C,SAAO,IAAI,OAAO,CAAC,EAAE,gBAAgB,IAAI,MAAM,CAAC;AAClD,CAAC;AACD,MAAM,eAAe;AAAA,EACnB,CAAC,QAAQ;AACP,UAAMC,KAAI,MAAM,KAAK,WAAW,GAAG,CAAC,KAAK;AACzC,WAAOA;AAAA,EACT;AACF;AACA,MAAM,aAAa,CAAC,OAAO,aAAa,CAAC,OAAO,GAAG,OAAO,QAAQ;AAClE,MAAM,iBAAiB,CAAC,QAAQ,QAAQ;AACtC,WAASH,KAAI,GAAGA,KAAI,IAAI,QAAQA,MAAK;AACnC,QAAIA,EAAC,EAAE,GAAG,GAAG;AAAA,EACf;AACF;AACA,MAAM,MAAM,CAAC,KAAK,KAAK,OAAO,WAAW,UAAU;AACjD,SAAO,eAAe,KAAK,KAAK;AAAA,IAC9B,cAAc;AAAA,IACd,YAAY;AAAA,IACZ;AAAA,IACA;AAAA,EAAA,CACD;AACH;AACA,MAAM,gBAAgB,CAAC,QAAQ;AAC7B,QAAM,IAAI,WAAW,GAAG;AACxB,SAAO,MAAM,CAAC,IAAI,MAAM;AAC1B;AACA,MAAM,WAAW,CAAC,QAAQ;AACxB,QAAM,IAAI,SAAS,GAAG,IAAI,OAAO,GAAG,IAAI;AACxC,SAAO,MAAM,CAAC,IAAI,MAAM;AAC1B;AACA,IAAI;AACJ,MAAM,gBAAgB,MAAM;AAC1B,SAAO,gBAAgB,cAAc,OAAO,eAAe,cAAc,aAAa,OAAO,SAAS,cAAc,OAAO,OAAO,WAAW,cAAc,SAAS,OAAO,WAAW,cAAc,SAAS;AAC/M;AAgJA,SAAS,eAAe,OAAO;AAC7B,MAAI,QAAQ,KAAK,GAAG;AAClB,UAAM,MAAM,CAAA;AACZ,aAASA,KAAI,GAAGA,KAAI,MAAM,QAAQA,MAAK;AACrC,YAAM,OAAO,MAAMA,EAAC;AACpB,YAAM,aAAa,SAAS,IAAI,IAAI,iBAAiB,IAAI,IAAI,eAAe,IAAI;AAChF,UAAI,YAAY;AACd,mBAAW,OAAO,YAAY;AAC5B,cAAI,GAAG,IAAI,WAAW,GAAG;AAAA,QAC3B;AAAA,MACF;AAAA,IACF;AACA,WAAO;AAAA,EACT,WAAW,SAAS,KAAK,KAAK,SAAS,KAAK,GAAG;AAC7C,WAAO;AAAA,EACT;AACF;AACA,MAAM,kBAAkB;AACxB,MAAM,sBAAsB;AAC5B,MAAM,iBAAiB;AACvB,SAAS,iBAAiB,SAAS;AACjC,QAAM,MAAM,CAAA;AACZ,UAAQ,QAAQ,gBAAgB,EAAE,EAAE,MAAM,eAAe,EAAE,QAAQ,CAAC,SAAS;AAC3E,QAAI,MAAM;AACR,YAAM,MAAM,KAAK,MAAM,mBAAmB;AAC1C,UAAI,SAAS,MAAM,IAAI,IAAI,CAAC,EAAE,KAAA,CAAM,IAAI,IAAI,CAAC,EAAE,KAAA;AAAA,IACjD;AAAA,EACF,CAAC;AACD,SAAO;AACT;AAcA,SAAS,eAAe,OAAO;AAC7B,MAAI,MAAM;AACV,MAAI,SAAS,KAAK,GAAG;AACnB,UAAM;AAAA,EACR,WAAW,QAAQ,KAAK,GAAG;AACzB,aAASA,KAAI,GAAGA,KAAI,MAAM,QAAQA,MAAK;AACrC,YAAM,aAAa,eAAe,MAAMA,EAAC,CAAC;AAC1C,UAAI,YAAY;AACd,eAAO,aAAa;AAAA,MACtB;AAAA,IACF;AAAA,EACF,WAAW,SAAS,KAAK,GAAG;AAC1B,eAAW,QAAQ,OAAO;AACxB,UAAI,MAAM,IAAI,GAAG;AACf,eAAO,OAAO;AAAA,MAChB;AAAA,IACF;AAAA,EACF;AACA,SAAO,IAAI,KAAA;AACb;AAsBA,MAAM,sBAAsB;AAC5B,MAAM,+CAA+C,mBAAmB;AAIxE,SAAS,mBAAmB,OAAO;AACjC,SAAO,CAAC,CAAC,SAAS,UAAU;AAC9B;AAuFA,SAAS,mBAAmBI,IAAGC,IAAG;AAChC,MAAID,GAAE,WAAWC,GAAE,OAAQ,QAAO;AAClC,MAAI,QAAQ;AACZ,WAASL,KAAI,GAAG,SAASA,KAAII,GAAE,QAAQJ,MAAK;AAC1C,YAAQ,WAAWI,GAAEJ,EAAC,GAAGK,GAAEL,EAAC,CAAC;AAAA,EAC/B;AACA,SAAO;AACT;AACA,SAAS,WAAWI,IAAGC,IAAG;AACxB,MAAID,OAAMC,GAAG,QAAO;AACpB,MAAI,aAAa,OAAOD,EAAC;AACzB,MAAI,aAAa,OAAOC,EAAC;AACzB,MAAI,cAAc,YAAY;AAC5B,WAAO,cAAc,aAAaD,GAAE,cAAcC,GAAE,YAAY;AAAA,EAClE;AACA,eAAa,SAASD,EAAC;AACvB,eAAa,SAASC,EAAC;AACvB,MAAI,cAAc,YAAY;AAC5B,WAAOD,OAAMC;AAAA,EACf;AACA,eAAa,QAAQD,EAAC;AACtB,eAAa,QAAQC,EAAC;AACtB,MAAI,cAAc,YAAY;AAC5B,WAAO,cAAc,aAAa,mBAAmBD,IAAGC,EAAC,IAAI;AAAA,EAC/D;AACA,eAAa,SAASD,EAAC;AACvB,eAAa,SAASC,EAAC;AACvB,MAAI,cAAc,YAAY;AAC5B,QAAI,CAAC,cAAc,CAAC,YAAY;AAC9B,aAAO;AAAA,IACT;AACA,UAAM,aAAa,OAAO,KAAKD,EAAC,EAAE;AAClC,UAAM,aAAa,OAAO,KAAKC,EAAC,EAAE;AAClC,QAAI,eAAe,YAAY;AAC7B,aAAO;AAAA,IACT;AACA,eAAW,OAAOD,IAAG;AACnB,YAAM,UAAUA,GAAE,eAAe,GAAG;AACpC,YAAM,UAAUC,GAAE,eAAe,GAAG;AACpC,UAAI,WAAW,CAAC,WAAW,CAAC,WAAW,WAAW,CAAC,WAAWD,GAAE,GAAG,GAAGC,GAAE,GAAG,CAAC,GAAG;AAC7E,eAAO;AAAA,MACT;AAAA,IACF;AAAA,EACF;AACA,SAAO,OAAOD,EAAC,MAAM,OAAOC,EAAC;AAC/B;AAKA,MAAMC,UAAQ,CAAC,QAAQ;AACrB,SAAO,CAAC,EAAE,OAAO,IAAI,WAAW,MAAM;AACxC;AACA,MAAM,kBAAkB,CAAC,QAAQ;AAC/B,SAAO,SAAS,GAAG,IAAI,MAAM,OAAO,OAAO,KAAK,QAAQ,GAAG,KAAK,SAAS,GAAG,MAAM,IAAI,aAAa,kBAAkB,CAAC,WAAW,IAAI,QAAQ,KAAKA,QAAM,GAAG,IAAI,gBAAgB,IAAI,KAAK,IAAI,KAAK,UAAU,KAAK,UAAU,CAAC,IAAI,OAAO,GAAG;AAC3O;AACA,MAAM,WAAW,CAAC,MAAM,QAAQ;AAC9B,MAAIA,QAAM,GAAG,GAAG;AACd,WAAO,SAAS,MAAM,IAAI,KAAK;AAAA,EACjC,WAAW,MAAM,GAAG,GAAG;AACrB,WAAO;AAAA,MACL,CAAC,OAAO,IAAI,IAAI,GAAG,GAAG,CAAC,GAAG,IAAI,QAAA,CAAS,EAAE;AAAA,QACvC,CAAC,SAAS,CAAC,KAAK,IAAI,GAAGN,OAAM;AAC3B,kBAAQ,gBAAgB,KAAKA,EAAC,IAAI,KAAK,IAAI;AAC3C,iBAAO;AAAA,QACT;AAAA,QACA,CAAA;AAAA,MAAC;AAAA,IACH;AAAA,EAEJ,WAAW,MAAM,GAAG,GAAG;AACrB,WAAO;AAAA,MACL,CAAC,OAAO,IAAI,IAAI,GAAG,GAAG,CAAC,GAAG,IAAI,OAAA,CAAQ,EAAE,IAAI,CAACO,OAAM,gBAAgBA,EAAC,CAAC;AAAA,IAAA;AAAA,EAEzE,WAAW,SAAS,GAAG,GAAG;AACxB,WAAO,gBAAgB,GAAG;AAAA,EAC5B,WAAW,SAAS,GAAG,KAAK,CAAC,QAAQ,GAAG,KAAK,CAAC,cAAc,GAAG,GAAG;AAChE,WAAO,OAAO,GAAG;AAAA,EACnB;AACA,SAAO;AACT;AACA,MAAM,kBAAkB,CAACA,IAAGP,KAAI,OAAO;AACrC,MAAIQ;AACJ;AAAA;AAAA;AAAA,IAGE,SAASD,EAAC,IAAI,WAAWC,MAAKD,GAAE,gBAAgB,OAAOC,MAAKR,EAAC,MAAMO;AAAA;AAEvE;ACngBA;AAAA;AAAA;AAAA;AAAA;AAWA,IAAI;AACJ,MAAM,YAAY;AAAA,EAChB,YAAY,WAAW,OAAO;AAC5B,SAAK,WAAW;AAIhB,SAAK,UAAU;AAIf,SAAK,MAAM;AAIX,SAAK,UAAU,CAAA;AAIf,SAAK,WAAW,CAAA;AAChB,SAAK,YAAY;AACjB,SAAK,SAAS;AACd,QAAI,CAAC,YAAY,mBAAmB;AAClC,WAAK,SAAS,kBAAkB,WAAW,kBAAkB,SAAS,CAAA,IAAK;AAAA,QACzE;AAAA,MAAA,IACE;AAAA,IACN;AAAA,EACF;AAAA,EACA,IAAI,SAAS;AACX,WAAO,KAAK;AAAA,EACd;AAAA,EACA,QAAQ;AACN,QAAI,KAAK,SAAS;AAChB,WAAK,YAAY;AACjB,UAAIP,IAAGS;AACP,UAAI,KAAK,QAAQ;AACf,aAAKT,KAAI,GAAGS,KAAI,KAAK,OAAO,QAAQT,KAAIS,IAAGT,MAAK;AAC9C,eAAK,OAAOA,EAAC,EAAE,MAAA;AAAA,QACjB;AAAA,MACF;AACA,WAAKA,KAAI,GAAGS,KAAI,KAAK,QAAQ,QAAQT,KAAIS,IAAGT,MAAK;AAC/C,aAAK,QAAQA,EAAC,EAAE,MAAA;AAAA,MAClB;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAIA,SAAS;AACP,QAAI,KAAK,SAAS;AAChB,UAAI,KAAK,WAAW;AAClB,aAAK,YAAY;AACjB,YAAIA,IAAGS;AACP,YAAI,KAAK,QAAQ;AACf,eAAKT,KAAI,GAAGS,KAAI,KAAK,OAAO,QAAQT,KAAIS,IAAGT,MAAK;AAC9C,iBAAK,OAAOA,EAAC,EAAE,OAAA;AAAA,UACjB;AAAA,QACF;AACA,aAAKA,KAAI,GAAGS,KAAI,KAAK,QAAQ,QAAQT,KAAIS,IAAGT,MAAK;AAC/C,eAAK,QAAQA,EAAC,EAAE,OAAA;AAAA,QAClB;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EACA,IAAI,IAAI;AACN,QAAI,KAAK,SAAS;AAChB,YAAM,qBAAqB;AAC3B,UAAI;AACF,4BAAoB;AACpB,eAAO,GAAA;AAAA,MACT,UAAA;AACE,4BAAoB;AAAA,MACtB;AAAA,IACF;AAAA,EAGF;AAAA;AAAA;AAAA;AAAA;AAAA,EAKA,KAAK;AACH,QAAI,EAAE,KAAK,QAAQ,GAAG;AACpB,WAAK,YAAY;AACjB,0BAAoB;AAAA,IACtB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM;AACJ,QAAI,KAAK,MAAM,KAAK,EAAE,KAAK,QAAQ,GAAG;AACpC,0BAAoB,KAAK;AACzB,WAAK,YAAY;AAAA,IACnB;AAAA,EACF;AAAA,EACA,KAAK,YAAY;AACf,QAAI,KAAK,SAAS;AAChB,WAAK,UAAU;AACf,UAAIA,IAAGS;AACP,WAAKT,KAAI,GAAGS,KAAI,KAAK,QAAQ,QAAQT,KAAIS,IAAGT,MAAK;AAC/C,aAAK,QAAQA,EAAC,EAAE,KAAA;AAAA,MAClB;AACA,WAAK,QAAQ,SAAS;AACtB,WAAKA,KAAI,GAAGS,KAAI,KAAK,SAAS,QAAQT,KAAIS,IAAGT,MAAK;AAChD,aAAK,SAASA,EAAC,EAAA;AAAA,MACjB;AACA,WAAK,SAAS,SAAS;AACvB,UAAI,KAAK,QAAQ;AACf,aAAKA,KAAI,GAAGS,KAAI,KAAK,OAAO,QAAQT,KAAIS,IAAGT,MAAK;AAC9C,eAAK,OAAOA,EAAC,EAAE,KAAK,IAAI;AAAA,QAC1B;AACA,aAAK,OAAO,SAAS;AAAA,MACvB;AACA,UAAI,CAAC,KAAK,YAAY,KAAK,UAAU,CAAC,YAAY;AAChD,cAAM,OAAO,KAAK,OAAO,OAAO,IAAA;AAChC,YAAI,QAAQ,SAAS,MAAM;AACzB,eAAK,OAAO,OAAO,KAAK,KAAK,IAAI;AACjC,eAAK,QAAQ,KAAK;AAAA,QACpB;AAAA,MACF;AACA,WAAK,SAAS;AAAA,IAChB;AAAA,EACF;AACF;AAIA,SAAS,kBAAkB;AACzB,SAAO;AACT;AAWA,IAAI;AAmBJ,MAAM,yCAAyC,QAAA;AAC/C,MAAM,eAAe;AAAA,EACnB,YAAY,IAAI;AACd,SAAK,KAAK;AAIV,SAAK,OAAO;AAIZ,SAAK,WAAW;AAIhB,SAAK,QAAQ,IAAI;AAIjB,SAAK,OAAO;AAIZ,SAAK,UAAU;AACf,SAAK,YAAY;AACjB,QAAI,qBAAqB,kBAAkB,QAAQ;AACjD,wBAAkB,QAAQ,KAAK,IAAI;AAAA,IACrC;AAAA,EACF;AAAA,EACA,QAAQ;AACN,SAAK,SAAS;AAAA,EAChB;AAAA,EACA,SAAS;AACP,QAAI,KAAK,QAAQ,IAAI;AACnB,WAAK,SAAS;AACd,UAAI,mBAAmB,IAAI,IAAI,GAAG;AAChC,2BAAmB,OAAO,IAAI;AAC9B,aAAK,QAAA;AAAA,MACP;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAIA,SAAS;AACP,QAAI,KAAK,QAAQ,KAAK,EAAE,KAAK,QAAQ,KAAK;AACxC;AAAA,IACF;AACA,QAAI,EAAE,KAAK,QAAQ,IAAI;AACrB,YAAM,IAAI;AAAA,IACZ;AAAA,EACF;AAAA,EACA,MAAM;AACJ,QAAI,EAAE,KAAK,QAAQ,IAAI;AACrB,aAAO,KAAK,GAAA;AAAA,IACd;AACA,SAAK,SAAS;AACd,kBAAc,IAAI;AAClB,gBAAY,IAAI;AAChB,UAAM,aAAa;AACnB,UAAM,kBAAkB;AACxB,gBAAY;AACZ,kBAAc;AACd,QAAI;AACF,aAAO,KAAK,GAAA;AAAA,IACd,UAAA;AAME,kBAAY,IAAI;AAChB,kBAAY;AACZ,oBAAc;AACd,WAAK,SAAS;AAAA,IAChB;AAAA,EACF;AAAA,EACA,OAAO;AACL,QAAI,KAAK,QAAQ,GAAG;AAClB,eAAS,OAAO,KAAK,MAAM,MAAM,OAAO,KAAK,SAAS;AACpD,kBAAU,IAAI;AAAA,MAChB;AACA,WAAK,OAAO,KAAK,WAAW;AAC5B,oBAAc,IAAI;AAClB,WAAK,UAAU,KAAK,OAAA;AACpB,WAAK,SAAS;AAAA,IAChB;AAAA,EACF;AAAA,EACA,UAAU;AACR,QAAI,KAAK,QAAQ,IAAI;AACnB,yBAAmB,IAAI,IAAI;AAAA,IAC7B,WAAW,KAAK,WAAW;AACzB,WAAK,UAAA;AAAA,IACP,OAAO;AACL,WAAK,WAAA;AAAA,IACP;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAIA,aAAa;AACX,QAAI,QAAQ,IAAI,GAAG;AACjB,WAAK,IAAA;AAAA,IACP;AAAA,EACF;AAAA,EACA,IAAI,QAAQ;AACV,WAAO,QAAQ,IAAI;AAAA,EACrB;AACF;AACA,IAAI,aAAa;AACjB,IAAI;AACJ,IAAI;AACJ,SAAS,MAAM,KAAK,aAAa,OAAO;AACtC,MAAI,SAAS;AACb,MAAI,YAAY;AACd,QAAI,OAAO;AACX,sBAAkB;AAClB;AAAA,EACF;AACA,MAAI,OAAO;AACX,eAAa;AACf;AACA,SAAS,aAAa;AACpB;AACF;AACA,SAAS,WAAW;AAClB,MAAI,EAAE,aAAa,GAAG;AACpB;AAAA,EACF;AACA,MAAI,iBAAiB;AACnB,QAAI,IAAI;AACR,sBAAkB;AAClB,WAAO,GAAG;AACR,YAAM,OAAO,EAAE;AACf,QAAE,OAAO;AACT,QAAE,SAAS;AACX,UAAI;AAAA,IACN;AAAA,EACF;AACA,MAAI;AACJ,SAAO,YAAY;AACjB,QAAI,IAAI;AACR,iBAAa;AACb,WAAO,GAAG;AACR,YAAM,OAAO,EAAE;AACf,QAAE,OAAO;AACT,QAAE,SAAS;AACX,UAAI,EAAE,QAAQ,GAAG;AACf,YAAI;AACF;AACA,YAAE,QAAA;AAAA,QACJ,SAAS,KAAK;AACZ,cAAI,CAAC,MAAO,SAAQ;AAAA,QACtB;AAAA,MACF;AACA,UAAI;AAAA,IACN;AAAA,EACF;AACA,MAAI,MAAO,OAAM;AACnB;AACA,SAAS,YAAY,KAAK;AACxB,WAAS,OAAO,IAAI,MAAM,MAAM,OAAO,KAAK,SAAS;AACnD,SAAK,UAAU;AACf,SAAK,iBAAiB,KAAK,IAAI;AAC/B,SAAK,IAAI,aAAa;AAAA,EACxB;AACF;AACA,SAAS,YAAY,KAAK;AACxB,MAAI;AACJ,MAAI,OAAO,IAAI;AACf,MAAI,OAAO;AACX,SAAO,MAAM;AACX,UAAM,OAAO,KAAK;AAClB,QAAI,KAAK,YAAY,IAAI;AACvB,UAAI,SAAS,KAAM,QAAO;AAC1B,gBAAU,IAAI;AACd,gBAAU,IAAI;AAAA,IAChB,OAAO;AACL,aAAO;AAAA,IACT;AACA,SAAK,IAAI,aAAa,KAAK;AAC3B,SAAK,iBAAiB;AACtB,WAAO;AAAA,EACT;AACA,MAAI,OAAO;AACX,MAAI,WAAW;AACjB;AACA,SAAS,QAAQ,KAAK;AACpB,WAAS,OAAO,IAAI,MAAM,MAAM,OAAO,KAAK,SAAS;AACnD,QAAI,KAAK,IAAI,YAAY,KAAK,WAAW,KAAK,IAAI,aAAa,gBAAgB,KAAK,IAAI,QAAQ,KAAK,KAAK,IAAI,YAAY,KAAK,UAAU;AACvI,aAAO;AAAA,IACT;AAAA,EACF;AACA,MAAI,IAAI,QAAQ;AACd,WAAO;AAAA,EACT;AACA,SAAO;AACT;AACA,SAAS,gBAAgBU,WAAU;AACjC,MAAIA,UAAS,QAAQ,KAAK,EAAEA,UAAS,QAAQ,KAAK;AAChD;AAAA,EACF;AACAA,YAAS,SAAS;AAClB,MAAIA,UAAS,kBAAkB,eAAe;AAC5C;AAAA,EACF;AACAA,YAAS,gBAAgB;AACzB,MAAI,CAACA,UAAS,SAASA,UAAS,QAAQ,QAAQ,CAACA,UAAS,QAAQ,CAACA,UAAS,UAAU,CAAC,QAAQA,SAAQ,IAAI;AACzG;AAAA,EACF;AACAA,YAAS,SAAS;AAClB,QAAM,MAAMA,UAAS;AACrB,QAAM,UAAU;AAChB,QAAM,kBAAkB;AACxB,cAAYA;AACZ,gBAAc;AACd,MAAI;AACF,gBAAYA,SAAQ;AACpB,UAAM,QAAQA,UAAS,GAAGA,UAAS,MAAM;AACzC,QAAI,IAAI,YAAY,KAAK,WAAW,OAAOA,UAAS,MAAM,GAAG;AAC3DA,gBAAS,SAAS;AAClBA,gBAAS,SAAS;AAClB,UAAI;AAAA,IACN;AAAA,EACF,SAAS,KAAK;AACZ,QAAI;AACJ,UAAM;AAAA,EACR,UAAA;AACE,gBAAY;AACZ,kBAAc;AACd,gBAAYA,SAAQ;AACpBA,cAAS,SAAS;AAAA,EACpB;AACF;AACA,SAAS,UAAU,MAAM,OAAO,OAAO;AACrC,QAAM,EAAE,KAAK,SAAS,QAAA,IAAY;AAClC,MAAI,SAAS;AACX,YAAQ,UAAU;AAClB,SAAK,UAAU;AAAA,EACjB;AACA,MAAI,SAAS;AACX,YAAQ,UAAU;AAClB,SAAK,UAAU;AAAA,EACjB;AAIA,MAAI,IAAI,SAAS,MAAM;AACrB,QAAI,OAAO;AACX,QAAI,CAAC,WAAW,IAAI,UAAU;AAC5B,UAAI,SAAS,SAAS;AACtB,eAASD,KAAI,IAAI,SAAS,MAAMA,IAAGA,KAAIA,GAAE,SAAS;AAChD,kBAAUA,IAAG,IAAI;AAAA,MACnB;AAAA,IACF;AAAA,EACF;AACA,MAAI,CAAC,QAAQ,CAAC,EAAE,IAAI,MAAM,IAAI,KAAK;AACjC,QAAI,IAAI,OAAO,IAAI,GAAG;AAAA,EACxB;AACF;AACA,SAAS,UAAU,MAAM;AACvB,QAAM,EAAE,SAAS,QAAA,IAAY;AAC7B,MAAI,SAAS;AACX,YAAQ,UAAU;AAClB,SAAK,UAAU;AAAA,EACjB;AACA,MAAI,SAAS;AACX,YAAQ,UAAU;AAClB,SAAK,UAAU;AAAA,EACjB;AACF;AAsBA,IAAI,cAAc;AAClB,MAAM,aAAa,CAAA;AACnB,SAAS,gBAAgB;AACvB,aAAW,KAAK,WAAW;AAC3B,gBAAc;AAChB;AAKA,SAAS,gBAAgB;AACvB,QAAM,OAAO,WAAW,IAAA;AACxB,gBAAc,SAAS,SAAS,OAAO;AACzC;AAUA,SAAS,cAAc,GAAG;AACxB,QAAM,EAAE,YAAY;AACpB,IAAE,UAAU;AACZ,MAAI,SAAS;AACX,UAAM,UAAU;AAChB,gBAAY;AACZ,QAAI;AACF,cAAA;AAAA,IACF,UAAA;AACE,kBAAY;AAAA,IACd;AAAA,EACF;AACF;AAEA,IAAI,gBAAgB;AACpB,MAAM,KAAK;AAAA,EACT,YAAY,KAAK,KAAK;AACpB,SAAK,MAAM;AACX,SAAK,MAAM;AACX,SAAK,UAAU,IAAI;AACnB,SAAK,UAAU,KAAK,UAAU,KAAK,UAAU,KAAK,UAAU,KAAK,iBAAiB;AAAA,EACpF;AACF;AACA,MAAM,IAAI;AAAA;AAAA,EAER,YAAYC,WAAU;AACpB,SAAK,WAAWA;AAChB,SAAK,UAAU;AAIf,SAAK,aAAa;AAIlB,SAAK,OAAO;AAIZ,SAAK,MAAM;AACX,SAAK,MAAM;AAIX,SAAK,KAAK;AAIV,SAAK,WAAW;AAAA,EAIlB;AAAA,EACA,MAAM,WAAW;AACf,QAAI,CAAC,aAAa,CAAC,eAAe,cAAc,KAAK,UAAU;AAC7D;AAAA,IACF;AACA,QAAI,OAAO,KAAK;AAChB,QAAI,SAAS,UAAU,KAAK,QAAQ,WAAW;AAC7C,aAAO,KAAK,aAAa,IAAI,KAAK,WAAW,IAAI;AACjD,UAAI,CAAC,UAAU,MAAM;AACnB,kBAAU,OAAO,UAAU,WAAW;AAAA,MACxC,OAAO;AACL,aAAK,UAAU,UAAU;AACzB,kBAAU,SAAS,UAAU;AAC7B,kBAAU,WAAW;AAAA,MACvB;AACA,aAAO,IAAI;AAAA,IACb,WAAW,KAAK,YAAY,IAAI;AAC9B,WAAK,UAAU,KAAK;AACpB,UAAI,KAAK,SAAS;AAChB,cAAM,OAAO,KAAK;AAClB,aAAK,UAAU,KAAK;AACpB,YAAI,KAAK,SAAS;AAChB,eAAK,QAAQ,UAAU;AAAA,QACzB;AACA,aAAK,UAAU,UAAU;AACzB,aAAK,UAAU;AACf,kBAAU,SAAS,UAAU;AAC7B,kBAAU,WAAW;AACrB,YAAI,UAAU,SAAS,MAAM;AAC3B,oBAAU,OAAO;AAAA,QACnB;AAAA,MACF;AAAA,IACF;AAWA,WAAO;AAAA,EACT;AAAA,EACA,QAAQ,WAAW;AACjB,SAAK;AACL;AACA,SAAK,OAAO,SAAS;AAAA,EACvB;AAAA,EACA,OAAO,WAAW;AAChB,eAAA;AACA,QAAI;AACF,UAAI,MAA2C;AAc/C,eAAS,OAAO,KAAK,MAAM,MAAM,OAAO,KAAK,SAAS;AACpD,YAAI,KAAK,IAAI,UAAU;AACrB;AACA,eAAK,IAAI,IAAI,OAAA;AAAA,QACf;AAAA,MACF;AAAA,IACF,UAAA;AACE,eAAA;AAAA,IACF;AAAA,EACF;AACF;AACA,SAAS,OAAO,MAAM;AACpB,OAAK,IAAI;AACT,MAAI,KAAK,IAAI,QAAQ,GAAG;AACtB,UAAMA,YAAW,KAAK,IAAI;AAC1B,QAAIA,aAAY,CAAC,KAAK,IAAI,MAAM;AAC9BA,gBAAS,SAAS,IAAI;AACtB,eAASD,KAAIC,UAAS,MAAMD,IAAGA,KAAIA,GAAE,SAAS;AAC5C,eAAOA,EAAC;AAAA,MACV;AAAA,IACF;AACA,UAAM,cAAc,KAAK,IAAI;AAC7B,QAAI,gBAAgB,MAAM;AACxB,WAAK,UAAU;AACf,UAAI,yBAAyB,UAAU;AAAA,IACzC;AAIA,SAAK,IAAI,OAAO;AAAA,EAClB;AACF;AACA,MAAM,gCAAgC,QAAA;AACtC,MAAM,cAA8B;AAAA,EAC6B;AACjE;AACA,MAAM,sBAAsC;AAAA,EACuB;AACnE;AACA,MAAM,oBAAoC;AAAA,EACsB;AAChE;AACA,SAAS,MAAM,QAAQ,MAAM,KAAK;AAChC,MAAI,eAAe,WAAW;AAC5B,QAAI,UAAU,UAAU,IAAI,MAAM;AAClC,QAAI,CAAC,SAAS;AACZ,gBAAU,IAAI,QAAQ,UAA0B,oBAAI,KAAK;AAAA,IAC3D;AACA,QAAI,MAAM,QAAQ,IAAI,GAAG;AACzB,QAAI,CAAC,KAAK;AACR,cAAQ,IAAI,KAAK,MAAM,IAAI,KAAK;AAChC,UAAI,MAAM;AACV,UAAI,MAAM;AAAA,IACZ;AAOO;AACL,UAAI,MAAA;AAAA,IACN;AAAA,EACF;AACF;AACA,SAAS,QAAQ,QAAQ,MAAM,KAAK,UAAU,UAAU,WAAW;AACjE,QAAM,UAAU,UAAU,IAAI,MAAM;AACpC,MAAI,CAAC,SAAS;AACZ;AACA;AAAA,EACF;AACA,QAAM,MAAM,CAAC,QAAQ;AACnB,QAAI,KAAK;AAUA;AACL,YAAI,QAAA;AAAA,MACN;AAAA,IACF;AAAA,EACF;AACA,aAAA;AACA,MAAI,SAAS,SAAS;AACpB,YAAQ,QAAQ,GAAG;AAAA,EACrB,OAAO;AACL,UAAM,gBAAgB,QAAQ,MAAM;AACpC,UAAM,eAAe,iBAAiB,aAAa,GAAG;AACtD,QAAI,iBAAiB,QAAQ,UAAU;AACrC,YAAM,YAAY,OAAO,QAAQ;AACjC,cAAQ,QAAQ,CAAC,KAAK,SAAS;AAC7B,YAAI,SAAS,YAAY,SAAS,qBAAqB,CAAC,SAAS,IAAI,KAAK,QAAQ,WAAW;AAC3F,cAAI,GAAG;AAAA,QACT;AAAA,MACF,CAAC;AAAA,IACH,OAAO;AACL,UAAI,QAAQ,UAAU,QAAQ,IAAI,MAAM,GAAG;AACzC,YAAI,QAAQ,IAAI,GAAG,CAAC;AAAA,MACtB;AACA,UAAI,cAAc;AAChB,YAAI,QAAQ,IAAI,iBAAiB,CAAC;AAAA,MACpC;AACA,cAAQ,MAAA;AAAA,QACN,KAAK;AACH,cAAI,CAAC,eAAe;AAClB,gBAAI,QAAQ,IAAI,WAAW,CAAC;AAC5B,gBAAI,MAAM,MAAM,GAAG;AACjB,kBAAI,QAAQ,IAAI,mBAAmB,CAAC;AAAA,YACtC;AAAA,UACF,WAAW,cAAc;AACvB,gBAAI,QAAQ,IAAI,QAAQ,CAAC;AAAA,UAC3B;AACA;AAAA,QACF,KAAK;AACH,cAAI,CAAC,eAAe;AAClB,gBAAI,QAAQ,IAAI,WAAW,CAAC;AAC5B,gBAAI,MAAM,MAAM,GAAG;AACjB,kBAAI,QAAQ,IAAI,mBAAmB,CAAC;AAAA,YACtC;AAAA,UACF;AACA;AAAA,QACF,KAAK;AACH,cAAI,MAAM,MAAM,GAAG;AACjB,gBAAI,QAAQ,IAAI,WAAW,CAAC;AAAA,UAC9B;AACA;AAAA,MAAA;AAAA,IAEN;AAAA,EACF;AACA,WAAA;AACF;AAMA,SAAS,kBAAkB,OAAO;AAChC,QAAM,MAAM,MAAM,KAAK;AACvB,MAAI,QAAQ,MAAO,QAAO;AAC1B,QAAM,KAAK,WAAW,iBAAiB;AACvC,SAAO,UAAU,KAAK,IAAI,MAAM,IAAI,IAAI,UAAU;AACpD;AACA,SAAS,iBAAiB,KAAK;AAC7B,QAAM,MAAM,MAAM,GAAG,GAAG,WAAW,iBAAiB;AACpD,SAAO;AACT;AACA,SAAS,UAAU,QAAQ,MAAM;AAC/B,MAAI,WAAW,MAAM,GAAG;AACtB,WAAO,WAAW,MAAM,IAAI,WAAW,WAAW,IAAI,CAAC,IAAI,WAAW,IAAI;AAAA,EAC5E;AACA,SAAO,WAAW,IAAI;AACxB;AACA,MAAM,wBAAwB;AAAA,EAC5B,WAAW;AAAA,EACX,CAAC,OAAO,QAAQ,IAAI;AAClB,WAAO,SAAS,MAAM,OAAO,UAAU,CAAC,SAAS,UAAU,MAAM,IAAI,CAAC;AAAA,EACxE;AAAA,EACA,UAAU,MAAM;AACd,WAAO,kBAAkB,IAAI,EAAE;AAAA,MAC7B,GAAG,KAAK,IAAI,CAAC,MAAM,QAAQ,CAAC,IAAI,kBAAkB,CAAC,IAAI,CAAC;AAAA,IAAA;AAAA,EAE5D;AAAA,EACA,UAAU;AACR,WAAO,SAAS,MAAM,WAAW,CAAC,UAAU;AAC1C,YAAM,CAAC,IAAI,UAAU,MAAM,MAAM,CAAC,CAAC;AACnC,aAAO;AAAA,IACT,CAAC;AAAA,EACH;AAAA,EACA,MAAM,IAAI,SAAS;AACjB,WAAO,MAAM,MAAM,SAAS,IAAI,SAAS,QAAQ,SAAS;AAAA,EAC5D;AAAA,EACA,OAAO,IAAI,SAAS;AAClB,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,CAACF,OAAMA,GAAE,IAAI,CAAC,SAAS,UAAU,MAAM,IAAI,CAAC;AAAA,MAC5C;AAAA,IAAA;AAAA,EAEJ;AAAA,EACA,KAAK,IAAI,SAAS;AAChB,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,CAAC,SAAS,UAAU,MAAM,IAAI;AAAA,MAC9B;AAAA,IAAA;AAAA,EAEJ;AAAA,EACA,UAAU,IAAI,SAAS;AACrB,WAAO,MAAM,MAAM,aAAa,IAAI,SAAS,QAAQ,SAAS;AAAA,EAChE;AAAA,EACA,SAAS,IAAI,SAAS;AACpB,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,CAAC,SAAS,UAAU,MAAM,IAAI;AAAA,MAC9B;AAAA,IAAA;AAAA,EAEJ;AAAA,EACA,cAAc,IAAI,SAAS;AACzB,WAAO,MAAM,MAAM,iBAAiB,IAAI,SAAS,QAAQ,SAAS;AAAA,EACpE;AAAA;AAAA,EAEA,QAAQ,IAAI,SAAS;AACnB,WAAO,MAAM,MAAM,WAAW,IAAI,SAAS,QAAQ,SAAS;AAAA,EAC9D;AAAA,EACA,YAAY,MAAM;AAChB,WAAO,YAAY,MAAM,YAAY,IAAI;AAAA,EAC3C;AAAA,EACA,WAAW,MAAM;AACf,WAAO,YAAY,MAAM,WAAW,IAAI;AAAA,EAC1C;AAAA,EACA,KAAK,WAAW;AACd,WAAO,kBAAkB,IAAI,EAAE,KAAK,SAAS;AAAA,EAC/C;AAAA;AAAA,EAEA,eAAe,MAAM;AACnB,WAAO,YAAY,MAAM,eAAe,IAAI;AAAA,EAC9C;AAAA,EACA,IAAI,IAAI,SAAS;AACf,WAAO,MAAM,MAAM,OAAO,IAAI,SAAS,QAAQ,SAAS;AAAA,EAC1D;AAAA,EACA,MAAM;AACJ,WAAO,WAAW,MAAM,KAAK;AAAA,EAC/B;AAAA,EACA,QAAQ,MAAM;AACZ,WAAO,WAAW,MAAM,QAAQ,IAAI;AAAA,EACtC;AAAA,EACA,OAAO,OAAO,MAAM;AAClB,WAAO,OAAO,MAAM,UAAU,IAAI,IAAI;AAAA,EACxC;AAAA,EACA,YAAY,OAAO,MAAM;AACvB,WAAO,OAAO,MAAM,eAAe,IAAI,IAAI;AAAA,EAC7C;AAAA,EACA,QAAQ;AACN,WAAO,WAAW,MAAM,OAAO;AAAA,EACjC;AAAA;AAAA,EAEA,KAAK,IAAI,SAAS;AAChB,WAAO,MAAM,MAAM,QAAQ,IAAI,SAAS,QAAQ,SAAS;AAAA,EAC3D;AAAA,EACA,UAAU,MAAM;AACd,WAAO,WAAW,MAAM,UAAU,IAAI;AAAA,EACxC;AAAA,EACA,aAAa;AACX,WAAO,kBAAkB,IAAI,EAAE,WAAA;AAAA,EACjC;AAAA,EACA,SAAS,UAAU;AACjB,WAAO,kBAAkB,IAAI,EAAE,SAAS,QAAQ;AAAA,EAClD;AAAA,EACA,aAAa,MAAM;AACjB,WAAO,kBAAkB,IAAI,EAAE,UAAU,GAAG,IAAI;AAAA,EAClD;AAAA,EACA,WAAW,MAAM;AACf,WAAO,WAAW,MAAM,WAAW,IAAI;AAAA,EACzC;AAAA,EACA,SAAS;AACP,WAAO,SAAS,MAAM,UAAU,CAAC,SAAS,UAAU,MAAM,IAAI,CAAC;AAAA,EACjE;AACF;AACA,SAAS,SAASI,OAAM,QAAQ,WAAW;AACzC,QAAM,MAAM,iBAAiBA,KAAI;AACjC,QAAM,OAAO,IAAI,MAAM,EAAA;AACvB,MAAI,QAAQA,SAAQ,CAAC,UAAUA,KAAI,GAAG;AACpC,SAAK,QAAQ,KAAK;AAClB,SAAK,OAAO,MAAM;AAChB,YAAM,SAAS,KAAK,MAAA;AACpB,UAAI,CAAC,OAAO,MAAM;AAChB,eAAO,QAAQ,UAAU,OAAO,KAAK;AAAA,MACvC;AACA,aAAO;AAAA,IACT;AAAA,EACF;AACA,SAAO;AACT;AACA,MAAM,aAAa,MAAM;AACzB,SAAS,MAAMA,OAAM,QAAQ,IAAI,SAAS,cAAc,MAAM;AAC5D,QAAM,MAAM,iBAAiBA,KAAI;AACjC,QAAM,YAAY,QAAQA,SAAQ,CAAC,UAAUA,KAAI;AACjD,QAAM,WAAW,IAAI,MAAM;AAC3B,MAAI,aAAa,WAAW,MAAM,GAAG;AACnC,UAAM,UAAU,SAAS,MAAMA,OAAM,IAAI;AACzC,WAAO,YAAY,WAAW,OAAO,IAAI;AAAA,EAC3C;AACA,MAAI,YAAY;AAChB,MAAI,QAAQA,OAAM;AAChB,QAAI,WAAW;AACb,kBAAY,SAAS,MAAM,OAAO;AAChC,eAAO,GAAG,KAAK,MAAM,UAAUA,OAAM,IAAI,GAAG,OAAOA,KAAI;AAAA,MACzD;AAAA,IACF,WAAW,GAAG,SAAS,GAAG;AACxB,kBAAY,SAAS,MAAM,OAAO;AAChC,eAAO,GAAG,KAAK,MAAM,MAAM,OAAOA,KAAI;AAAA,MACxC;AAAA,IACF;AAAA,EACF;AACA,QAAM,SAAS,SAAS,KAAK,KAAK,WAAW,OAAO;AACpD,SAAO,aAAa,eAAe,aAAa,MAAM,IAAI;AAC5D;AACA,SAAS,OAAOA,OAAM,QAAQ,IAAI,MAAM;AACtC,QAAM,MAAM,iBAAiBA,KAAI;AACjC,MAAI,YAAY;AAChB,MAAI,QAAQA,OAAM;AAChB,QAAI,CAAC,UAAUA,KAAI,GAAG;AACpB,kBAAY,SAAS,KAAK,MAAM,OAAO;AACrC,eAAO,GAAG,KAAK,MAAM,KAAK,UAAUA,OAAM,IAAI,GAAG,OAAOA,KAAI;AAAA,MAC9D;AAAA,IACF,WAAW,GAAG,SAAS,GAAG;AACxB,kBAAY,SAAS,KAAK,MAAM,OAAO;AACrC,eAAO,GAAG,KAAK,MAAM,KAAK,MAAM,OAAOA,KAAI;AAAA,MAC7C;AAAA,IACF;AAAA,EACF;AACA,SAAO,IAAI,MAAM,EAAE,WAAW,GAAG,IAAI;AACvC;AACA,SAAS,YAAYA,OAAM,QAAQ,MAAM;AACvC,QAAM,MAAM,MAAMA,KAAI;AACtB,QAAM,KAAK,WAAW,iBAAiB;AACvC,QAAM,MAAM,IAAI,MAAM,EAAE,GAAG,IAAI;AAC/B,OAAK,QAAQ,MAAM,QAAQ,UAAU,QAAQ,KAAK,CAAC,CAAC,GAAG;AACrD,SAAK,CAAC,IAAI,MAAM,KAAK,CAAC,CAAC;AACvB,WAAO,IAAI,MAAM,EAAE,GAAG,IAAI;AAAA,EAC5B;AACA,SAAO;AACT;AACA,SAAS,WAAWA,OAAM,QAAQ,OAAO,CAAA,GAAI;AAC3C,gBAAA;AACA,aAAA;AACA,QAAM,MAAM,MAAMA,KAAI,EAAE,MAAM,EAAE,MAAMA,OAAM,IAAI;AAChD,WAAA;AACA,gBAAA;AACA,SAAO;AACT;AAEA,MAAM,6CAA6C,6BAA6B;AAChF,MAAM,iBAAiB,IAAI;AAAA,EACT,uBAAO,oBAAoB,MAAM,EAAE,OAAO,CAAC,QAAQ,QAAQ,eAAe,QAAQ,QAAQ,EAAE,IAAI,CAAC,QAAQ,OAAO,GAAG,CAAC,EAAE,OAAO,QAAQ;AACvJ;AACA,SAAS,eAAe,KAAK;AAC3B,MAAI,CAAC,SAAS,GAAG,EAAG,OAAM,OAAO,GAAG;AACpC,QAAM,MAAM,MAAM,IAAI;AACtB,QAAM,KAAK,OAAO,GAAG;AACrB,SAAO,IAAI,eAAe,GAAG;AAC/B;AACA,MAAM,oBAAoB;AAAA,EACxB,YAAY,cAAc,OAAO,aAAa,OAAO;AACnD,SAAK,cAAc;AACnB,SAAK,aAAa;AAAA,EACpB;AAAA,EACA,IAAI,QAAQ,KAAK,UAAU;AACzB,QAAI,QAAQ,WAAY,QAAO,OAAO,UAAU;AAChD,UAAM,cAAc,KAAK,aAAa,aAAa,KAAK;AACxD,QAAI,QAAQ,kBAAkB;AAC5B,aAAO,CAAC;AAAA,IACV,WAAW,QAAQ,kBAAkB;AACnC,aAAO;AAAA,IACT,WAAW,QAAQ,iBAAiB;AAClC,aAAO;AAAA,IACT,WAAW,QAAQ,WAAW;AAC5B,UAAI,cAAc,cAAc,aAAa,qBAAqB,cAAc,aAAa,qBAAqB,aAAa,IAAI,MAAM;AAAA;AAAA,MAEzI,OAAO,eAAe,MAAM,MAAM,OAAO,eAAe,QAAQ,GAAG;AACjE,eAAO;AAAA,MACT;AACA;AAAA,IACF;AACA,UAAM,gBAAgB,QAAQ,MAAM;AACpC,QAAI,CAAC,aAAa;AAChB,UAAI;AACJ,UAAI,kBAAkB,KAAK,sBAAsB,GAAG,IAAI;AACtD,eAAO;AAAA,MACT;AACA,UAAI,QAAQ,kBAAkB;AAC5B,eAAO;AAAA,MACT;AAAA,IACF;AACA,UAAM,MAAM,QAAQ;AAAA,MAClB;AAAA,MACA;AAAA;AAAA;AAAA;AAAA,MAIA,MAAM,MAAM,IAAI,SAAS;AAAA,IAAA;AAE3B,QAAI,SAAS,GAAG,IAAI,eAAe,IAAI,GAAG,IAAI,mBAAmB,GAAG,GAAG;AACrE,aAAO;AAAA,IACT;AACA,QAAI,CAAC,aAAa;AAChB,YAAM,QAAQ,OAAO,GAAG;AAAA,IAC1B;AACA,QAAI,YAAY;AACd,aAAO;AAAA,IACT;AACA,QAAI,MAAM,GAAG,GAAG;AACd,YAAM,QAAQ,iBAAiB,aAAa,GAAG,IAAI,MAAM,IAAI;AAC7D,aAAO,eAAe,SAAS,KAAK,IAAI,SAAS,KAAK,IAAI;AAAA,IAC5D;AACA,QAAI,SAAS,GAAG,GAAG;AACjB,aAAO,cAAc,SAAS,GAAG,IAAI,SAAS,GAAG;AAAA,IACnD;AACA,WAAO;AAAA,EACT;AACF;AACA,MAAM,+BAA+B,oBAAoB;AAAA,EACvD,YAAY,aAAa,OAAO;AAC9B,UAAM,OAAO,UAAU;AAAA,EACzB;AAAA,EACA,IAAI,QAAQ,KAAK,OAAO,UAAU;AAChC,QAAI,WAAW,OAAO,GAAG;AACzB,UAAM,wBAAwB,QAAQ,MAAM,KAAK,aAAa,GAAG;AACjE,QAAI,CAAC,KAAK,YAAY;AACpB,YAAM,qBAAqB,WAAW,QAAQ;AAC9C,UAAI,CAAC,UAAU,KAAK,KAAK,CAAC,WAAW,KAAK,GAAG;AAC3C,mBAAW,MAAM,QAAQ;AACzB,gBAAQ,MAAM,KAAK;AAAA,MACrB;AACA,UAAI,CAAC,yBAAyB,MAAM,QAAQ,KAAK,CAAC,MAAM,KAAK,GAAG;AAC9D,YAAI,oBAAoB;AAOtB,iBAAO;AAAA,QACT,OAAO;AACL,mBAAS,QAAQ;AACjB,iBAAO;AAAA,QACT;AAAA,MACF;AAAA,IACF;AACA,UAAM,SAAS,wBAAwB,OAAO,GAAG,IAAI,OAAO,SAAS,OAAO,QAAQ,GAAG;AACvF,UAAM,SAAS,QAAQ;AAAA,MACrB;AAAA,MACA;AAAA,MACA;AAAA,MACA,MAAM,MAAM,IAAI,SAAS;AAAA,IAAA;AAE3B,QAAI,WAAW,MAAM,QAAQ,GAAG;AAC9B,UAAI,CAAC,QAAQ;AACX,gBAAQ,QAAQ,OAAO,KAAK,KAAK;AAAA,MACnC,WAAW,WAAW,OAAO,QAAQ,GAAG;AACtC,gBAAQ,QAAQ,OAAO,KAAK,KAAe;AAAA,MAC7C;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAAA,EACA,eAAe,QAAQ,KAAK;AAC1B,UAAM,SAAS,OAAO,QAAQ,GAAG;AAChB,WAAO,GAAG;AAC3B,UAAM,SAAS,QAAQ,eAAe,QAAQ,GAAG;AACjD,QAAI,UAAU,QAAQ;AACpB,cAAQ,QAAQ,UAAU,KAAK,MAAgB;AAAA,IACjD;AACA,WAAO;AAAA,EACT;AAAA,EACA,IAAI,QAAQ,KAAK;AACf,UAAM,SAAS,QAAQ,IAAI,QAAQ,GAAG;AACtC,QAAI,CAAC,SAAS,GAAG,KAAK,CAAC,eAAe,IAAI,GAAG,GAAG;AAC9C,YAAM,QAAQ,OAAO,GAAG;AAAA,IAC1B;AACA,WAAO;AAAA,EACT;AAAA,EACA,QAAQ,QAAQ;AACd;AAAA,MACE;AAAA,MACA;AAAA,MACA,QAAQ,MAAM,IAAI,WAAW;AAAA,IAAA;AAE/B,WAAO,QAAQ,QAAQ,MAAM;AAAA,EAC/B;AACF;AACA,MAAM,gCAAgC,oBAAoB;AAAA,EACxD,YAAY,aAAa,OAAO;AAC9B,UAAM,MAAM,UAAU;AAAA,EACxB;AAAA,EACA,IAAI,QAAQ,KAAK;AAOf,WAAO;AAAA,EACT;AAAA,EACA,eAAe,QAAQ,KAAK;AAO1B,WAAO;AAAA,EACT;AACF;AACA,MAAM,sCAAsC,uBAAA;AAC5C,MAAM,uCAAuC,wBAAA;AAC7C,MAAM,0BAA0C,oBAAI,uBAAuB,IAAI;AAC/E,MAAM,0BAA0C,oBAAI,wBAAwB,IAAI;AAEhF,MAAM,YAAY,CAAC,UAAU;AAC7B,MAAM,WAAW,CAACJ,OAAM,QAAQ,eAAeA,EAAC;AAChD,SAAS,qBAAqB,QAAQ,aAAa,YAAY;AAC7D,SAAO,YAAY,MAAM;AACvB,UAAM,SAAS,KAAK,SAAS;AAC7B,UAAM,YAAY,MAAM,MAAM;AAC9B,UAAM,cAAc,MAAM,SAAS;AACnC,UAAM,SAAS,WAAW,aAAa,WAAW,OAAO,YAAY;AACrE,UAAM,YAAY,WAAW,UAAU;AACvC,UAAM,gBAAgB,OAAO,MAAM,EAAE,GAAG,IAAI;AAC5C,UAAM,OAAO,aAAa,YAAY,cAAc,aAAa;AACjE,KAAC,eAAe;AAAA,MACd;AAAA,MACA;AAAA,MACA,YAAY,sBAAsB;AAAA,IAAA;AAEpC,WAAO;AAAA;AAAA,MAEL,OAAO;AACL,cAAM,EAAE,OAAO,SAAS,cAAc,KAAA;AACtC,eAAO,OAAO,EAAE,OAAO,SAAS;AAAA,UAC9B,OAAO,SAAS,CAAC,KAAK,MAAM,CAAC,CAAC,GAAG,KAAK,MAAM,CAAC,CAAC,CAAC,IAAI,KAAK,KAAK;AAAA,UAC7D;AAAA,QAAA;AAAA,MAEJ;AAAA;AAAA,MAEA,CAAC,OAAO,QAAQ,IAAI;AAClB,eAAO;AAAA,MACT;AAAA,IAAA;AAAA,EAEJ;AACF;AACA,SAAS,qBAAqB,MAAM;AAClC,SAAO,YAAY,MAAM;AAQvB,WAAO,SAAS,WAAW,QAAQ,SAAS,UAAU,SAAS;AAAA,EACjE;AACF;AACA,SAAS,uBAAuBK,WAAU,SAAS;AACjD,QAAM,mBAAmB;AAAA,IACvB,IAAI,KAAK;AACP,YAAM,SAAS,KAAK,SAAS;AAC7B,YAAM,YAAY,MAAM,MAAM;AAC9B,YAAM,SAAS,MAAM,GAAG;AACxB,UAAI,CAACA,WAAU;AACb,YAAI,WAAW,KAAK,MAAM,GAAG;AAC3B,gBAAM,WAAW,OAAO,GAAG;AAAA,QAC7B;AACA,cAAM,WAAW,OAAO,MAAM;AAAA,MAChC;AACA,YAAM,EAAE,IAAA,IAAQ,SAAS,SAAS;AAClC,YAAM,OAAO,UAAU,YAAYA,YAAW,aAAa;AAC3D,UAAI,IAAI,KAAK,WAAW,GAAG,GAAG;AAC5B,eAAO,KAAK,OAAO,IAAI,GAAG,CAAC;AAAA,MAC7B,WAAW,IAAI,KAAK,WAAW,MAAM,GAAG;AACtC,eAAO,KAAK,OAAO,IAAI,MAAM,CAAC;AAAA,MAChC,WAAW,WAAW,WAAW;AAC/B,eAAO,IAAI,GAAG;AAAA,MAChB;AAAA,IACF;AAAA,IACA,IAAI,OAAO;AACT,YAAM,SAAS,KAAK,SAAS;AAC7B,OAACA,aAAY,MAAM,MAAM,MAAM,GAAG,WAAW,WAAW;AACxD,aAAO,OAAO;AAAA,IAChB;AAAA,IACA,IAAI,KAAK;AACP,YAAM,SAAS,KAAK,SAAS;AAC7B,YAAM,YAAY,MAAM,MAAM;AAC9B,YAAM,SAAS,MAAM,GAAG;AACxB,UAAI,CAACA,WAAU;AACb,YAAI,WAAW,KAAK,MAAM,GAAG;AAC3B,gBAAM,WAAW,OAAO,GAAG;AAAA,QAC7B;AACA,cAAM,WAAW,OAAO,MAAM;AAAA,MAChC;AACA,aAAO,QAAQ,SAAS,OAAO,IAAI,GAAG,IAAI,OAAO,IAAI,GAAG,KAAK,OAAO,IAAI,MAAM;AAAA,IAChF;AAAA,IACA,QAAQ,UAAU,SAAS;AACzB,YAAM,WAAW;AACjB,YAAM,SAAS,SAAS,SAAS;AACjC,YAAM,YAAY,MAAM,MAAM;AAC9B,YAAM,OAAO,UAAU,YAAYA,YAAW,aAAa;AAC3D,OAACA,aAAY,MAAM,WAAW,WAAW,WAAW;AACpD,aAAO,OAAO,QAAQ,CAAC,OAAO,QAAQ;AACpC,eAAO,SAAS,KAAK,SAAS,KAAK,KAAK,GAAG,KAAK,GAAG,GAAG,QAAQ;AAAA,MAChE,CAAC;AAAA,IACH;AAAA,EAAA;AAEF;AAAA,IACE;AAAA,IACAA,YAAW;AAAA,MACT,KAAK,qBAAqB,KAAK;AAAA,MAC/B,KAAK,qBAAqB,KAAK;AAAA,MAC/B,QAAQ,qBAAqB,QAAQ;AAAA,MACrC,OAAO,qBAAqB,OAAO;AAAA,IAAA,IACjC;AAAA,MACF,IAAI,OAAO;AACT,YAAI,CAAC,WAAW,CAAC,UAAU,KAAK,KAAK,CAAC,WAAW,KAAK,GAAG;AACvD,kBAAQ,MAAM,KAAK;AAAA,QACrB;AACA,cAAM,SAAS,MAAM,IAAI;AACzB,cAAM,QAAQ,SAAS,MAAM;AAC7B,cAAM,SAAS,MAAM,IAAI,KAAK,QAAQ,KAAK;AAC3C,YAAI,CAAC,QAAQ;AACX,iBAAO,IAAI,KAAK;AAChB,kBAAQ,QAAQ,OAAO,OAAO,KAAK;AAAA,QACrC;AACA,eAAO;AAAA,MACT;AAAA,MACA,IAAI,KAAK,OAAO;AACd,YAAI,CAAC,WAAW,CAAC,UAAU,KAAK,KAAK,CAAC,WAAW,KAAK,GAAG;AACvD,kBAAQ,MAAM,KAAK;AAAA,QACrB;AACA,cAAM,SAAS,MAAM,IAAI;AACzB,cAAM,EAAE,KAAK,QAAQ,SAAS,MAAM;AACpC,YAAI,SAAS,IAAI,KAAK,QAAQ,GAAG;AACjC,YAAI,CAAC,QAAQ;AACX,gBAAM,MAAM,GAAG;AACf,mBAAS,IAAI,KAAK,QAAQ,GAAG;AAAA,QAC/B;AAGA,cAAM,WAAW,IAAI,KAAK,QAAQ,GAAG;AACrC,eAAO,IAAI,KAAK,KAAK;AACrB,YAAI,CAAC,QAAQ;AACX,kBAAQ,QAAQ,OAAO,KAAK,KAAK;AAAA,QACnC,WAAW,WAAW,OAAO,QAAQ,GAAG;AACtC,kBAAQ,QAAQ,OAAO,KAAK,KAAe;AAAA,QAC7C;AACA,eAAO;AAAA,MACT;AAAA,MACA,OAAO,KAAK;AACV,cAAM,SAAS,MAAM,IAAI;AACzB,cAAM,EAAE,KAAK,QAAQ,SAAS,MAAM;AACpC,YAAI,SAAS,IAAI,KAAK,QAAQ,GAAG;AACjC,YAAI,CAAC,QAAQ;AACX,gBAAM,MAAM,GAAG;AACf,mBAAS,IAAI,KAAK,QAAQ,GAAG;AAAA,QAC/B;AAGiB,cAAM,IAAI,KAAK,QAAQ,GAAG,IAAI;AAC/C,cAAM,SAAS,OAAO,OAAO,GAAG;AAChC,YAAI,QAAQ;AACV,kBAAQ,QAAQ,UAAU,KAAK,MAAgB;AAAA,QACjD;AACA,eAAO;AAAA,MACT;AAAA,MACA,QAAQ;AACN,cAAM,SAAS,MAAM,IAAI;AACzB,cAAM,WAAW,OAAO,SAAS;AAEjC,cAAM,SAAS,OAAO,MAAA;AACtB,YAAI,UAAU;AACZ;AAAA,YACE;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UAEF;AAAA,QACF;AACA,eAAO;AAAA,MACT;AAAA,IAAA;AAAA,EACF;AAEF,QAAM,kBAAkB;AAAA,IACtB;AAAA,IACA;AAAA,IACA;AAAA,IACA,OAAO;AAAA,EAAA;AAET,kBAAgB,QAAQ,CAAC,WAAW;AAClC,qBAAiB,MAAM,IAAI,qBAAqB,QAAQA,WAAU,OAAO;AAAA,EAC3E,CAAC;AACD,SAAO;AACT;AACA,SAAS,4BAA4B,aAAa,SAAS;AACzD,QAAM,mBAAmB,uBAAuB,aAAa,OAAO;AACpE,SAAO,CAAC,QAAQ,KAAK,aAAa;AAChC,QAAI,QAAQ,kBAAkB;AAC5B,aAAO,CAAC;AAAA,IACV,WAAW,QAAQ,kBAAkB;AACnC,aAAO;AAAA,IACT,WAAW,QAAQ,WAAW;AAC5B,aAAO;AAAA,IACT;AACA,WAAO,QAAQ;AAAA,MACb,OAAO,kBAAkB,GAAG,KAAK,OAAO,SAAS,mBAAmB;AAAA,MACpE;AAAA,MACA;AAAA,IAAA;AAAA,EAEJ;AACF;AACA,MAAM,4BAA4B;AAAA,EAChC,KAAqB,4CAA4B,OAAO,KAAK;AAC/D;AACA,MAAM,4BAA4B;AAAA,EAChC,KAAqB,4CAA4B,OAAO,IAAI;AAC9D;AACA,MAAM,6BAA6B;AAAA,EACjC,KAAqB,4CAA4B,MAAM,KAAK;AAC9D;AACA,MAAM,oCAAoC;AAAA,EACxC,KAAqB,4CAA4B,MAAM,IAAI;AAC7D;AAWA,MAAM,kCAAkC,QAAA;AACxC,MAAM,yCAAyC,QAAA;AAC/C,MAAM,kCAAkC,QAAA;AACxC,MAAM,yCAAyC,QAAA;AAC/C,SAAS,cAAc,SAAS;AAC9B,UAAQ,SAAA;AAAA,IACN,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,IACT;AACE,aAAO;AAAA,EAAA;AAEb;AACA,SAAS,cAAc,OAAO;AAC5B,SAAO,MAAM,UAAU,KAAK,CAAC,OAAO,aAAa,KAAK,IAAI,IAAkB,cAAc,UAAU,KAAK,CAAC;AAC5G;AACA,SAAS,SAAS,QAAQ;AACxB,MAAI,WAAW,MAAM,GAAG;AACtB,WAAO;AAAA,EACT;AACA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA;AAEJ;AACA,SAAS,gBAAgB,QAAQ;AAC/B,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA;AAEJ;AACA,SAAS,SAAS,QAAQ;AACxB,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA;AAEJ;AACA,SAAS,gBAAgB,QAAQ;AAC/B,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA;AAEJ;AACA,SAAS,qBAAqB,QAAQ,aAAa,cAAc,oBAAoB,UAAU;AAC7F,MAAI,CAAC,SAAS,MAAM,GAAG;AAQrB,WAAO;AAAA,EACT;AACA,MAAI,OAAO,SAAS,KAAK,EAAE,eAAe,OAAO,gBAAgB,IAAI;AACnE,WAAO;AAAA,EACT;AACA,QAAM,aAAa,cAAc,MAAM;AACvC,MAAI,eAAe,GAAiB;AAClC,WAAO;AAAA,EACT;AACA,QAAM,gBAAgB,SAAS,IAAI,MAAM;AACzC,MAAI,eAAe;AACjB,WAAO;AAAA,EACT;AACA,QAAM,QAAQ,IAAI;AAAA,IAChB;AAAA,IACA,eAAe,IAAqB,qBAAqB;AAAA,EAAA;AAE3D,WAAS,IAAI,QAAQ,KAAK;AAC1B,SAAO;AACT;AACA,SAAS,WAAW,OAAO;AACzB,MAAI,WAAW,KAAK,GAAG;AACrB,WAAO,WAAW,MAAM,SAAS,CAAC;AAAA,EACpC;AACA,SAAO,CAAC,EAAE,SAAS,MAAM,gBAAgB;AAC3C;AACA,SAAS,WAAW,OAAO;AACzB,SAAO,CAAC,EAAE,SAAS,MAAM,gBAAgB;AAC3C;AACA,SAAS,UAAU,OAAO;AACxB,SAAO,CAAC,EAAE,SAAS,MAAM,eAAe;AAC1C;AACA,SAAS,QAAQ,OAAO;AACtB,SAAO,QAAQ,CAAC,CAAC,MAAM,SAAS,IAAI;AACtC;AACA,SAAS,MAAM,UAAU;AACvB,QAAM,MAAM,YAAY,SAAS,SAAS;AAC1C,SAAO,MAAM,MAAM,GAAG,IAAI;AAC5B;AACA,SAAS,QAAQ,OAAO;AACtB,MAAI,CAAC,OAAO,OAAO,UAAU,KAAK,OAAO,aAAa,KAAK,GAAG;AAC5D,QAAI,OAAO,YAAY,IAAI;AAAA,EAC7B;AACA,SAAO;AACT;AACA,MAAM,aAAa,CAAC,UAAU,SAAS,KAAK,IAAI,SAAS,KAAK,IAAI;AAClE,MAAM,aAAa,CAAC,UAAU,SAAS,KAAK,IAAI,SAAS,KAAK,IAAI;AAElE,SAAS,MAAM,GAAG;AAChB,SAAO,IAAI,EAAE,WAAW,MAAM,OAAO;AACvC;AACA,SAAS,IAAI,OAAO;AAClB,SAAO,UAAU,OAAO,KAAK;AAC/B;AAIA,SAAS,UAAU,UAAU,SAAS;AACpC,MAAI,MAAM,QAAQ,GAAG;AACnB,WAAO;AAAA,EACT;AACA,SAAO,IAAI,QAAQ,UAAU,OAAO;AACtC;AACA,MAAM,QAAQ;AAAA,EACZ,YAAY,OAAO,YAAY;AAC7B,SAAK,MAAM,IAAI,IAAA;AACf,SAAK,WAAW,IAAI;AACpB,SAAK,eAAe,IAAI;AACxB,SAAK,YAAY,aAAa,QAAQ,MAAM,KAAK;AACjD,SAAK,SAAS,aAAa,QAAQ,WAAW,KAAK;AACnD,SAAK,eAAe,IAAI;AAAA,EAC1B;AAAA,EACA,IAAI,QAAQ;AAOH;AACL,WAAK,IAAI,MAAA;AAAA,IACX;AACA,WAAO,KAAK;AAAA,EACd;AAAA,EACA,IAAI,MAAM,UAAU;AAClB,UAAM,WAAW,KAAK;AACtB,UAAM,iBAAiB,KAAK,eAAe,KAAK,UAAU,QAAQ,KAAK,WAAW,QAAQ;AAC1F,eAAW,iBAAiB,WAAW,MAAM,QAAQ;AACrD,QAAI,WAAW,UAAU,QAAQ,GAAG;AAClC,WAAK,YAAY;AACjB,WAAK,SAAS,iBAAiB,WAAW,WAAW,QAAQ;AAStD;AACL,aAAK,IAAI,QAAA;AAAA,MACX;AAAA,IACF;AAAA,EACF;AACF;AAeA,SAAS,MAAM,MAAM;AACnB,SAAO,MAAM,IAAI,IAAI,KAAK,QAAQ;AACpC;AAIA,MAAM,wBAAwB;AAAA,EAC5B,KAAK,CAAC,QAAQ,KAAK,aAAa,QAAQ,YAAY,SAAS,MAAM,QAAQ,IAAI,QAAQ,KAAK,QAAQ,CAAC;AAAA,EACrG,KAAK,CAAC,QAAQ,KAAK,OAAO,aAAa;AACrC,UAAM,WAAW,OAAO,GAAG;AAC3B,QAAI,MAAM,QAAQ,KAAK,CAAC,MAAM,KAAK,GAAG;AACpC,eAAS,QAAQ;AACjB,aAAO;AAAA,IACT,OAAO;AACL,aAAO,QAAQ,IAAI,QAAQ,KAAK,OAAO,QAAQ;AAAA,IACjD;AAAA,EACF;AACF;AACA,SAAS,UAAU,gBAAgB;AACjC,SAAO,WAAW,cAAc,IAAI,iBAAiB,IAAI,MAAM,gBAAgB,qBAAqB;AACtG;AA8FA,MAAM,gBAAgB;AAAA,EACpB,YAAY,IAAI,QAAQ,OAAO;AAC7B,SAAK,KAAK;AACV,SAAK,SAAS;AAId,SAAK,SAAS;AAId,SAAK,MAAM,IAAI,IAAI,IAAI;AAIvB,SAAK,YAAY;AAMjB,SAAK,OAAO;AAIZ,SAAK,WAAW;AAIhB,SAAK,QAAQ;AAIb,SAAK,gBAAgB,gBAAgB;AAIrC,SAAK,OAAO;AAEZ,SAAK,SAAS;AACd,SAAK,gBAAgB,IAAI,CAAC;AAC1B,SAAK,QAAQ;AAAA,EACf;AAAA;AAAA;AAAA;AAAA,EAIA,SAAS;AACP,SAAK,SAAS;AACd,QAAI,EAAE,KAAK,QAAQ;AAAA,IACnB,cAAc,MAAM;AAClB,YAAM,MAAM,IAAI;AAChB,aAAO;AAAA,IACT;AAAA,EACF;AAAA,EACA,IAAI,QAAQ;AACV,UAAM,OAID,KAAK,IAAI,MAAA;AACd,oBAAgB,IAAI;AACpB,QAAI,MAAM;AACR,WAAK,UAAU,KAAK,IAAI;AAAA,IAC1B;AACA,WAAO,KAAK;AAAA,EACd;AAAA,EACA,IAAI,MAAM,UAAU;AAClB,QAAI,KAAK,QAAQ;AACf,WAAK,OAAO,QAAQ;AAAA,IACtB;AAAA,EAGF;AACF;AACA,SAASF,WAAS,iBAAiB,cAAc,QAAQ,OAAO;AAC9D,MAAI;AACJ,MAAI;AACJ,MAAI,WAAW,eAAe,GAAG;AAC/B,aAAS;AAAA,EACX,OAAO;AACL,aAAS,gBAAgB;AACzB,aAAS,gBAAgB;AAAA,EAC3B;AACA,QAAM,OAAO,IAAI,gBAAgB,QAAQ,QAAQ,KAAK;AAKtD,SAAO;AACT;AA8BA,MAAM,wBAAwB,CAAA;AAC9B,MAAM,iCAAiC,QAAA;AACvC,IAAI,gBAAgB;AAIpB,SAAS,iBAAiB,WAAW,eAAe,OAAO,QAAQ,eAAe;AAChF,MAAI,OAAO;AACT,QAAI,WAAW,WAAW,IAAI,KAAK;AACnC,QAAI,CAAC,SAAU,YAAW,IAAI,OAAO,WAAW,EAAE;AAClD,aAAS,KAAK,SAAS;AAAA,EACzB;AAKF;AACA,SAASG,QAAM,QAAQ,IAAI,UAAU,WAAW;AAC9C,QAAM,EAAE,WAAW,MAAM,MAAM,WAAW,YAAY,SAAS;AAQ/D,QAAM,iBAAiB,CAAC,YAAY;AAClC,QAAI,KAAM,QAAO;AACjB,QAAI,UAAU,OAAO,KAAK,SAAS,SAAS,SAAS;AACnD,aAAO,SAAS,SAAS,CAAC;AAC5B,WAAO,SAAS,OAAO;AAAA,EACzB;AACA,MAAIC;AACJ,MAAI;AACJ,MAAI;AACJ,MAAI;AACJ,MAAI,eAAe;AACnB,MAAI,gBAAgB;AACpB,MAAI,MAAM,MAAM,GAAG;AACjB,aAAS,MAAM,OAAO;AACtB,mBAAe,UAAU,MAAM;AAAA,EACjC,WAAW,WAAW,MAAM,GAAG;AAC7B,aAAS,MAAM,eAAe,MAAM;AACpC,mBAAe;AAAA,EACjB,WAAW,QAAQ,MAAM,GAAG;AAC1B,oBAAgB;AAChB,mBAAe,OAAO,KAAK,CAACX,OAAM,WAAWA,EAAC,KAAK,UAAUA,EAAC,CAAC;AAC/D,aAAS,MAAM,OAAO,IAAI,CAACA,OAAM;AAC/B,UAAI,MAAMA,EAAC,GAAG;AACZ,eAAOA,GAAE;AAAA,MACX,WAAW,WAAWA,EAAC,GAAG;AACxB,eAAO,eAAeA,EAAC;AAAA,MACzB,WAAW,WAAWA,EAAC,GAAG;AACxB,eAAO,OAAO,KAAKA,IAAG,CAAC,IAAIA,GAAA;AAAA,MAC7B,MAAO;AAAA,IAGT,CAAC;AAAA,EACH,WAAW,WAAW,MAAM,GAAG;AAC7B,QAAI,IAAI;AACN,eAAS,OAAO,MAAM,KAAK,QAAQ,CAAC,IAAI;AAAA,IAC1C,OAAO;AACL,eAAS,MAAM;AACb,YAAI,SAAS;AACX,wBAAA;AACA,cAAI;AACF,oBAAA;AAAA,UACF,UAAA;AACE,0BAAA;AAAA,UACF;AAAA,QACF;AACA,cAAM,gBAAgB;AACtB,wBAAgBW;AAChB,YAAI;AACF,iBAAO,OAAO,KAAK,QAAQ,GAAG,CAAC,YAAY,CAAC,IAAI,OAAO,YAAY;AAAA,QACrE,UAAA;AACE,0BAAgB;AAAA,QAClB;AAAA,MACF;AAAA,IACF;AAAA,EACF,OAAO;AACL,aAAS;AAAA,EAEX;AACA,MAAI,MAAM,MAAM;AACd,UAAM,aAAa;AACnB,UAAM,QAAQ,SAAS,OAAO,WAAW;AACzC,aAAS,MAAM,SAAS,WAAA,GAAc,KAAK;AAAA,EAC7C;AACA,QAAM,QAAQ,gBAAA;AACd,QAAM,cAAc,MAAM;AACxBA,YAAO,KAAA;AACP,QAAI,SAAS,MAAM,QAAQ;AACzB,aAAO,MAAM,SAASA,OAAM;AAAA,IAC9B;AAAA,EACF;AACA,MAAI,QAAQ,IAAI;AACd,UAAM,MAAM;AACZ,SAAK,IAAI,SAAS;AAChB,UAAI,GAAG,IAAI;AACX,kBAAA;AAAA,IACF;AAAA,EACF;AACA,MAAI,WAAW,gBAAgB,IAAI,MAAM,OAAO,MAAM,EAAE,KAAK,qBAAqB,IAAI;AACtF,QAAM,MAAM,CAAC,sBAAsB;AACjC,QAAI,EAAEA,QAAO,QAAQ,MAAM,CAACA,QAAO,SAAS,CAAC,mBAAmB;AAC9D;AAAA,IACF;AACA,QAAI,IAAI;AACN,YAAM,WAAWA,QAAO,IAAA;AACxB,UAAI,QAAQ,iBAAiB,gBAAgB,SAAS,KAAK,CAACP,IAAGP,OAAM,WAAWO,IAAG,SAASP,EAAC,CAAC,CAAC,IAAI,WAAW,UAAU,QAAQ,IAAI;AAClI,YAAI,SAAS;AACX,kBAAA;AAAA,QACF;AACA,cAAM,iBAAiB;AACvB,wBAAgBc;AAChB,YAAI;AACF,gBAAM,OAAO;AAAA,YACX;AAAA;AAAA,YAEA,aAAa,wBAAwB,SAAS,iBAAiB,SAAS,CAAC,MAAM,wBAAwB,CAAA,IAAK;AAAA,YAC5G;AAAA,UAAA;AAEF,qBAAW;AACX,iBAAO,KAAK,IAAI,GAAG,IAAI;AAAA;AAAA,YAErB,GAAG,GAAG,IAAI;AAAA;AAAA,QAEd,UAAA;AACE,0BAAgB;AAAA,QAClB;AAAA,MACF;AAAA,IACF,OAAO;AACLA,cAAO,IAAA;AAAA,IACT;AAAA,EACF;AACA,MAAI,YAAY;AACd,eAAW,GAAG;AAAA,EAChB;AACAA,YAAS,IAAI,eAAe,MAAM;AAClCA,UAAO,YAAY,YAAY,MAAM,UAAU,KAAK,KAAK,IAAI;AAC7D,iBAAe,CAAC,OAAO,iBAAiB,IAAI,OAAOA,OAAM;AACzD,YAAUA,QAAO,SAAS,MAAM;AAC9B,UAAM,WAAW,WAAW,IAAIA,OAAM;AACtC,QAAI,UAAU;AACZ,UAAI,MAAM;AACR,aAAK,UAAU,CAAC;AAAA,MAClB,OAAO;AACL,mBAAW,YAAY,SAAU,UAAA;AAAA,MACnC;AACA,iBAAW,OAAOA,OAAM;AAAA,IAC1B;AAAA,EACF;AAKA,MAAI,IAAI;AACN,QAAI,WAAW;AACb,UAAI,IAAI;AAAA,IACV,OAAO;AACL,iBAAWA,QAAO,IAAA;AAAA,IACpB;AAAA,EACF,WAAW,WAAW;AACpB,cAAU,IAAI,KAAK,MAAM,IAAI,GAAG,IAAI;AAAA,EACtC,OAAO;AACLA,YAAO,IAAA;AAAA,EACT;AACA,cAAY,QAAQA,QAAO,MAAM,KAAKA,OAAM;AAC5C,cAAY,SAASA,QAAO,OAAO,KAAKA,OAAM;AAC9C,cAAY,OAAO;AACnB,SAAO;AACT;AACA,SAAS,SAAS,OAAO,QAAQ,UAAU,MAAM;AAC/C,MAAI,SAAS,KAAK,CAAC,SAAS,KAAK,KAAK,MAAM,UAAU,GAAG;AACvD,WAAO;AAAA,EACT;AACA,SAAO,4BAA4B,IAAA;AACnC,OAAK,KAAK,IAAI,KAAK,KAAK,MAAM,OAAO;AACnC,WAAO;AAAA,EACT;AACA,OAAK,IAAI,OAAO,KAAK;AACrB;AACA,MAAI,MAAM,KAAK,GAAG;AAChB,aAAS,MAAM,OAAO,OAAO,IAAI;AAAA,EACnC,WAAW,QAAQ,KAAK,GAAG;AACzB,aAASd,KAAI,GAAGA,KAAI,MAAM,QAAQA,MAAK;AACrC,eAAS,MAAMA,EAAC,GAAG,OAAO,IAAI;AAAA,IAChC;AAAA,EACF,WAAW,MAAM,KAAK,KAAK,MAAM,KAAK,GAAG;AACvC,UAAM,QAAQ,CAACO,OAAM;AACnB,eAASA,IAAG,OAAO,IAAI;AAAA,IACzB,CAAC;AAAA,EACH,WAAW,cAAc,KAAK,GAAG;AAC/B,eAAW,OAAO,OAAO;AACvB,eAAS,MAAM,GAAG,GAAG,OAAO,IAAI;AAAA,IAClC;AACA,eAAW,OAAO,OAAO,sBAAsB,KAAK,GAAG;AACrD,UAAI,OAAO,UAAU,qBAAqB,KAAK,OAAO,GAAG,GAAG;AAC1D,iBAAS,MAAM,GAAG,GAAG,OAAO,IAAI;AAAA,MAClC;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;AC36DA;AAAA;AAAA;AAAA;AAAA;AAUA,MAAM,QAAQ,CAAA;AAOd,IAAI,YAAY;AAChB,SAAS,OAAO,QAAQ,MAAM;AAC5B,MAAI,UAAW;AACf,cAAY;AACZ,gBAAA;AACA,QAAM,WAAW,MAAM,SAAS,MAAM,MAAM,SAAS,CAAC,EAAE,YAAY;AACpE,QAAM,iBAAiB,YAAY,SAAS,WAAW,OAAO;AAC9D,QAAM,QAAQ,kBAAA;AACd,MAAI,gBAAgB;AAClB;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA;AAAA,QAEE,MAAM,KAAK,IAAI,CAACH,OAAM;AACpB,cAAII,KAAI;AACR,kBAAQ,MAAMA,MAAKJ,GAAE,aAAa,OAAO,SAASI,IAAG,KAAKJ,EAAC,MAAM,OAAO,KAAK,KAAK,UAAUA,EAAC;AAAA,QAC/F,CAAC,EAAE,KAAK,EAAE;AAAA,QACV,YAAY,SAAS;AAAA,QACrB,MAAM;AAAA,UACJ,CAAC,EAAE,MAAA,MAAY,OAAO,oBAAoB,UAAU,MAAM,IAAI,CAAC;AAAA,QAAA,EAC/D,KAAK,IAAI;AAAA,QACX;AAAA,MAAA;AAAA,IACF;AAAA,EAEJ,OAAO;AACL,UAAM,WAAW,CAAC,eAAe,GAAG,IAAI,GAAG,IAAI;AAC/C,QAAI,MAAM;AAAA,IACV,MAAM;AACJ,eAAS,KAAK;AAAA,GACjB,GAAG,YAAY,KAAK,CAAC;AAAA,IACpB;AACA,YAAQ,KAAK,GAAG,QAAQ;AAAA,EAC1B;AACA,gBAAA;AACA,cAAY;AACd;AACA,SAAS,oBAAoB;AAC3B,MAAI,eAAe,MAAM,MAAM,SAAS,CAAC;AACzC,MAAI,CAAC,cAAc;AACjB,WAAO,CAAA;AAAA,EACT;AACA,QAAM,kBAAkB,CAAA;AACxB,SAAO,cAAc;AACnB,UAAM,OAAO,gBAAgB,CAAC;AAC9B,QAAI,QAAQ,KAAK,UAAU,cAAc;AACvC,WAAK;AAAA,IACP,OAAO;AACL,sBAAgB,KAAK;AAAA,QACnB,OAAO;AAAA,QACP,cAAc;AAAA,MAAA,CACf;AAAA,IACH;AACA,UAAM,iBAAiB,aAAa,aAAa,aAAa,UAAU;AACxE,mBAAe,kBAAkB,eAAe;AAAA,EAClD;AACA,SAAO;AACT;AACA,SAAS,YAAY,OAAO;AAC1B,QAAM,OAAO,CAAA;AACb,QAAM,QAAQ,CAAC,OAAOJ,OAAM;AAC1B,SAAK,KAAK,GAAGA,OAAM,IAAI,CAAA,IAAK,CAAC;AAAA,CAChC,GAAG,GAAG,iBAAiB,KAAK,CAAC;AAAA,EAC5B,CAAC;AACD,SAAO;AACT;AACA,SAAS,iBAAiB,EAAE,OAAO,gBAAgB;AACjD,QAAM,UAAU,eAAe,IAAI,QAAQ,YAAY,sBAAsB;AAC7E,QAAM,SAAS,MAAM,YAAY,MAAM,UAAU,UAAU,OAAO;AAClE,QAAM,OAAO,QAAQ;AAAA,IACnB,MAAM;AAAA,IACN,MAAM;AAAA,IACN;AAAA,EAAA,CACD;AACD,QAAM,QAAQ,MAAM;AACpB,SAAO,MAAM,QAAQ,CAAC,MAAM,GAAG,YAAY,MAAM,KAAK,GAAG,KAAK,IAAI,CAAC,OAAO,KAAK;AACjF;AACA,SAAS,YAAY,OAAO;AAC1B,QAAM,MAAM,CAAA;AACZ,QAAM,OAAO,OAAO,KAAK,KAAK;AAC9B,OAAK,MAAM,GAAG,CAAC,EAAE,QAAQ,CAAC,QAAQ;AAChC,QAAI,KAAK,GAAG,WAAW,KAAK,MAAM,GAAG,CAAC,CAAC;AAAA,EACzC,CAAC;AACD,MAAI,KAAK,SAAS,GAAG;AACnB,QAAI,KAAK,MAAM;AAAA,EACjB;AACA,SAAO;AACT;AACA,SAAS,WAAW,KAAK,OAAO,KAAK;AACnC,MAAI,SAAS,KAAK,GAAG;AACnB,YAAQ,KAAK,UAAU,KAAK;AAC5B,WAAO,MAAM,QAAQ,CAAC,GAAG,GAAG,IAAI,KAAK,EAAE;AAAA,EACzC,WAAW,OAAO,UAAU,YAAY,OAAO,UAAU,aAAa,SAAS,MAAM;AACnF,WAAO,MAAM,QAAQ,CAAC,GAAG,GAAG,IAAI,KAAK,EAAE;AAAA,EACzC,WAAW,MAAM,KAAK,GAAG;AACvB,YAAQ,WAAW,KAAK,MAAM,MAAM,KAAK,GAAG,IAAI;AAChD,WAAO,MAAM,QAAQ,CAAC,GAAG,GAAG,SAAS,OAAO,GAAG;AAAA,EACjD,WAAW,WAAW,KAAK,GAAG;AAC5B,WAAO,CAAC,GAAG,GAAG,MAAM,MAAM,OAAO,IAAI,MAAM,IAAI,MAAM,EAAE,EAAE;AAAA,EAC3D,OAAO;AACL,YAAQ,MAAM,KAAK;AACnB,WAAO,MAAM,QAAQ,CAAC,GAAG,GAAG,KAAK,KAAK;AAAA,EACxC;AACF;AA2EA,SAAS,sBAAsB,IAAI,UAAU,MAAM,MAAM;AACvD,MAAI;AACF,WAAO,OAAO,GAAG,GAAG,IAAI,IAAI,GAAA;AAAA,EAC9B,SAAS,KAAK;AACZ,gBAAY,KAAK,UAAU,IAAI;AAAA,EACjC;AACF;AACA,SAAS,2BAA2B,IAAI,UAAU,MAAM,MAAM;AAC5D,MAAI,WAAW,EAAE,GAAG;AAClB,UAAM,MAAM,sBAAsB,IAAI,UAAU,MAAM,IAAI;AAC1D,QAAI,OAAO,UAAU,GAAG,GAAG;AACzB,UAAI,MAAM,CAAC,QAAQ;AACjB,oBAAY,KAAK,UAAU,IAAI;AAAA,MACjC,CAAC;AAAA,IACH;AACA,WAAO;AAAA,EACT;AACA,MAAI,QAAQ,EAAE,GAAG;AACf,UAAM,SAAS,CAAA;AACf,aAASA,KAAI,GAAGA,KAAI,GAAG,QAAQA,MAAK;AAClC,aAAO,KAAK,2BAA2B,GAAGA,EAAC,GAAG,UAAU,MAAM,IAAI,CAAC;AAAA,IACrE;AACA,WAAO;AAAA,EACT;AAKF;AACA,SAAS,YAAY,KAAK,UAAU,MAAM,aAAa,MAAM;AAC3D,QAAM,eAAe,WAAW,SAAS,QAAQ;AACjD,QAAM,EAAE,cAAc,gCAAA,IAAoC,YAAY,SAAS,WAAW,UAAU;AACpG,MAAI,UAAU;AACZ,QAAI,MAAM,SAAS;AACnB,UAAM,kBAAkB,SAAS;AACjC,UAAM,YAAmF,8CAA8C,IAAI;AAC3I,WAAO,KAAK;AACV,YAAM,qBAAqB,IAAI;AAC/B,UAAI,oBAAoB;AACtB,iBAASA,KAAI,GAAGA,KAAI,mBAAmB,QAAQA,MAAK;AAClD,cAAI,mBAAmBA,EAAC,EAAE,KAAK,iBAAiB,SAAS,MAAM,OAAO;AACpE;AAAA,UACF;AAAA,QACF;AAAA,MACF;AACA,YAAM,IAAI;AAAA,IACZ;AACA,QAAI,cAAc;AAChB,oBAAA;AACA,4BAAsB,cAAc,MAAM,IAAI;AAAA,QAC5C;AAAA,QACA;AAAA,QACA;AAAA,MAAA,CACD;AACD,oBAAA;AACA;AAAA,IACF;AAAA,EACF;AACA,WAAS,KAAK,MAAM,cAAc,YAAY,+BAA+B;AAC/E;AACA,SAAS,SAAS,KAAK,MAAM,cAAc,aAAa,MAAM,cAAc,OAAO;MAetE,aAAa;AACtB,UAAM;AAAA,EACR,OAAO;AACL,YAAQ,MAAM,GAAG;AAAA,EACnB;AACF;AAEA,MAAM,QAAQ,CAAA;AACd,IAAI,aAAa;AACjB,MAAM,sBAAsB,CAAA;AAC5B,IAAI,qBAAqB;AACzB,IAAI,iBAAiB;AACrB,MAAM,0CAA0C,QAAA;AAChD,IAAI,sBAAsB;AAE1B,SAAS,SAAS,IAAI;AACpB,QAAMe,KAAI,uBAAuB;AACjC,SAAO,KAAKA,GAAE,KAAK,OAAO,GAAG,KAAK,IAAI,IAAI,EAAE,IAAIA;AAClD;AACA,SAAS,mBAAmB,IAAI;AAC9B,MAAI,QAAQ,aAAa;AACzB,MAAI,MAAM,MAAM;AAChB,SAAO,QAAQ,KAAK;AAClB,UAAM,SAAS,QAAQ,QAAQ;AAC/B,UAAM,YAAY,MAAM,MAAM;AAC9B,UAAM,cAAc,MAAM,SAAS;AACnC,QAAI,cAAc,MAAM,gBAAgB,MAAM,UAAU,QAAQ,GAAG;AACjE,cAAQ,SAAS;AAAA,IACnB,OAAO;AACL,YAAM;AAAA,IACR;AAAA,EACF;AACA,SAAO;AACT;AACA,SAAS,SAAS,KAAK;AACrB,MAAI,EAAE,IAAI,QAAQ,IAAI;AACpB,UAAM,QAAQ,MAAM,GAAG;AACvB,UAAM,UAAU,MAAM,MAAM,SAAS,CAAC;AACtC,QAAI,CAAC;AAAA,IACL,EAAE,IAAI,QAAQ,MAAM,SAAS,MAAM,OAAO,GAAG;AAC3C,YAAM,KAAK,GAAG;AAAA,IAChB,OAAO;AACL,YAAM,OAAO,mBAAmB,KAAK,GAAG,GAAG,GAAG;AAAA,IAChD;AACA,QAAI,SAAS;AACb,eAAA;AAAA,EACF;AACF;AACA,SAAS,aAAa;AACpB,MAAI,CAAC,qBAAqB;AACxB,0BAAsB,gBAAgB,KAAK,SAAS;AAAA,EACtD;AACF;AACA,SAAS,iBAAiB,IAAI;AAC5B,MAAI,CAAC,QAAQ,EAAE,GAAG;AAChB,QAAI,sBAAsB,GAAG,OAAO,IAAI;AACtC,yBAAmB,OAAO,iBAAiB,GAAG,GAAG,EAAE;AAAA,IACrD,WAAW,EAAE,GAAG,QAAQ,IAAI;AAC1B,0BAAoB,KAAK,EAAE;AAC3B,SAAG,SAAS;AAAA,IACd;AAAA,EACF,OAAO;AACL,wBAAoB,KAAK,GAAG,EAAE;AAAA,EAChC;AACA,aAAA;AACF;AACA,SAAS,iBAAiB,UAAU,MAAMf,KAAI,aAAa,GAAG;AAI5D,SAAOA,KAAI,MAAM,QAAQA,MAAK;AAC5B,UAAM,KAAK,MAAMA,EAAC;AAClB,QAAI,MAAM,GAAG,QAAQ,GAAG;AACtB,UAAI,YAAY,GAAG,OAAO,SAAS,KAAK;AACtC;AAAA,MACF;AAIA,YAAM,OAAOA,IAAG,CAAC;AACjB,MAAAA;AACA,UAAI,GAAG,QAAQ,GAAG;AAChB,WAAG,SAAS;AAAA,MACd;AACA,SAAA;AACA,UAAI,EAAE,GAAG,QAAQ,IAAI;AACnB,WAAG,SAAS;AAAA,MACd;AAAA,IACF;AAAA,EACF;AACF;AACA,SAAS,kBAAkB,MAAM;AAC/B,MAAI,oBAAoB,QAAQ;AAC9B,UAAM,UAAU,CAAC,GAAG,IAAI,IAAI,mBAAmB,CAAC,EAAE;AAAA,MAChD,CAACI,IAAGC,OAAM,MAAMD,EAAC,IAAI,MAAMC,EAAC;AAAA,IAAA;AAE9B,wBAAoB,SAAS;AAC7B,QAAI,oBAAoB;AACtB,yBAAmB,KAAK,GAAG,OAAO;AAClC;AAAA,IACF;AACA,yBAAqB;AAIrB,SAAK,iBAAiB,GAAG,iBAAiB,mBAAmB,QAAQ,kBAAkB;AACrF,YAAM,KAAK,mBAAmB,cAAc;AAI5C,UAAI,GAAG,QAAQ,GAAG;AAChB,WAAG,SAAS;AAAA,MACd;AACA,UAAI,EAAE,GAAG,QAAQ,GAAI,IAAA;AACrB,SAAG,SAAS;AAAA,IACd;AACA,yBAAqB;AACrB,qBAAiB;AAAA,EACnB;AACF;AACA,MAAM,QAAQ,CAAC,QAAQ,IAAI,MAAM,OAAO,IAAI,QAAQ,IAAI,KAAK,WAAW,IAAI;AAC5E,SAAS,UAAU,MAAM;AAKvB,MAAI;AACF,SAAK,aAAa,GAAG,aAAa,MAAM,QAAQ,cAAc;AAC5D,YAAM,MAAM,MAAM,UAAU;AAC5B,UAAI,OAAO,EAAE,IAAI,QAAQ,IAAI;AAC3B,YAAI,MAAyD;AAG7D,YAAI,IAAI,QAAQ,GAAG;AACjB,cAAI,SAAS,CAAC;AAAA,QAChB;AACA;AAAA,UACE;AAAA,UACA,IAAI;AAAA,UACJ,IAAI,IAAI,KAAK;AAAA,QAAA;AAEf,YAAI,EAAE,IAAI,QAAQ,IAAI;AACpB,cAAI,SAAS,CAAC;AAAA,QAChB;AAAA,MACF;AAAA,IACF;AAAA,EACF,UAAA;AACE,WAAO,aAAa,MAAM,QAAQ,cAAc;AAC9C,YAAM,MAAM,MAAM,UAAU;AAC5B,UAAI,KAAK;AACP,YAAI,SAAS;AAAA,MACf;AAAA,IACF;AACA,iBAAa;AACb,UAAM,SAAS;AACf,sBAAsB;AACtB,0BAAsB;AACtB,QAAI,MAAM,UAAU,oBAAoB,QAAQ;AAC9C,gBAAc;AAAA,IAChB;AAAA,EACF;AACF;AA2OA,IAAI,2BAA2B;AAC/B,IAAI,iBAAiB;AACrB,SAAS,4BAA4B,UAAU;AAC7C,QAAM,OAAO;AACb,6BAA2B;AAC3B,mBAAiB,YAAY,SAAS,KAAK,aAAa;AACxD,SAAO;AACT;AAQA,SAAS,QAAQ,IAAI,MAAM,0BAA0B,iBAAiB;AACpE,MAAI,CAAC,IAAK,QAAO;AACjB,MAAI,GAAG,IAAI;AACT,WAAO;AAAA,EACT;AACA,QAAM,sBAAsB,IAAI,SAAS;AACvC,QAAI,oBAAoB,IAAI;AAC1B,uBAAiB,EAAE;AAAA,IACrB;AACA,UAAM,eAAe,4BAA4B,GAAG;AACpD,QAAI;AACJ,QAAI;AACF,YAAM,GAAG,GAAG,IAAI;AAAA,IAClB,UAAA;AACE,kCAA4B,YAAY;AACxC,UAAI,oBAAoB,IAAI;AAC1B,yBAAiB,CAAC;AAAA,MACpB;AAAA,IACF;AAIA,WAAO;AAAA,EACT;AACA,sBAAoB,KAAK;AACzB,sBAAoB,KAAK;AACzB,sBAAoB,KAAK;AACzB,SAAO;AACT;AAOA,SAAS,eAAe,OAAO,YAAY;AACzC,MAAI,6BAA6B,MAAM;AAErC,WAAO;AAAA,EACT;AACA,QAAM,WAAW,2BAA2B,wBAAwB;AACpE,QAAM,WAAW,MAAM,SAAS,MAAM,OAAO,CAAA;AAC7C,WAASL,KAAI,GAAGA,KAAI,WAAW,QAAQA,MAAK;AAC1C,QAAI,CAAC,KAAK,OAAO,KAAK,YAAY,SAAS,IAAI,WAAWA,EAAC;AAC3D,QAAI,KAAK;AACP,UAAI,WAAW,GAAG,GAAG;AACnB,cAAM;AAAA,UACJ,SAAS;AAAA,UACT,SAAS;AAAA,QAAA;AAAA,MAEb;AACA,UAAI,IAAI,MAAM;AACZ,iBAAS,KAAK;AAAA,MAChB;AACA,eAAS,KAAK;AAAA,QACZ;AAAA,QACA;AAAA,QACA;AAAA,QACA,UAAU;AAAA,QACV;AAAA,QACA;AAAA,MAAA,CACD;AAAA,IACH;AAAA,EACF;AACA,SAAO;AACT;AACA,SAAS,oBAAoB,OAAO,WAAW,UAAU,MAAM;AAC7D,QAAM,WAAW,MAAM;AACvB,QAAM,cAAc,aAAa,UAAU;AAC3C,WAASA,KAAI,GAAGA,KAAI,SAAS,QAAQA,MAAK;AACxC,UAAM,UAAU,SAASA,EAAC;AAC1B,QAAI,aAAa;AACf,cAAQ,WAAW,YAAYA,EAAC,EAAE;AAAA,IACpC;AACA,QAAI,OAAO,QAAQ,IAAI,IAAI;AAC3B,QAAI,MAAM;AACR,oBAAA;AACA,iCAA2B,MAAM,UAAU,GAAG;AAAA,QAC5C,MAAM;AAAA,QACN;AAAA,QACA;AAAA,QACA;AAAA,MAAA,CACD;AACD,oBAAA;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,QAAQ,KAAK,OAAO;AAM3B,MAAI,iBAAiB;AACnB,QAAI,WAAW,gBAAgB;AAC/B,UAAM,iBAAiB,gBAAgB,UAAU,gBAAgB,OAAO;AACxE,QAAI,mBAAmB,UAAU;AAC/B,iBAAW,gBAAgB,WAAW,OAAO,OAAO,cAAc;AAAA,IACpE;AACA,aAAS,GAAG,IAAI;AAAA,EAClB;AACF;AACA,SAAS,OAAO,KAAK,cAAc,wBAAwB,OAAO;AAChE,QAAM,WAAW,mBAAA;AACjB,MAAI,YAAY,YAAY;AAC1B,QAAI,WAAW,aAAa,WAAW,SAAS,WAAW,WAAW,SAAS,UAAU,QAAQ,SAAS,KAAK,SAAS,MAAM,cAAc,SAAS,MAAM,WAAW,WAAW,SAAS,OAAO,WAAW;AAC5M,QAAI,YAAY,OAAO,UAAU;AAC/B,aAAO,SAAS,GAAG;AAAA,IACrB,WAAW,UAAU,SAAS,GAAG;AAC/B,aAAO,yBAAyB,WAAW,YAAY,IAAI,aAAa,KAAK,YAAY,SAAS,KAAK,IAAI;AAAA,IAC7G;EAGF;AAGF;AAKA,MAAM,gBAAgC,uBAAO,IAAI,OAAO;AACxD,MAAM,gBAAgB,MAAM;AAC1B;AACE,UAAM,MAAM,OAAO,aAAa;AAMhC,WAAO;AAAA,EACT;AACF;AAmBA,SAAS,MAAM,QAAQ,IAAI,SAAS;AAMlC,SAAO,QAAQ,QAAQ,IAAI,OAAO;AACpC;AACA,SAAS,QAAQ,QAAQ,IAAI,UAAU,WAAW;AAChD,QAAM,EAAE,WAAW,MAAM,OAAO,SAAS;AAkBzC,QAAM,mBAAmB,OAAO,CAAA,GAAI,OAAO;AAE3C,QAAM,kBAAkB,MAAM,aAAa,CAAC,MAAM,UAAU;AAC5D,MAAI;AACJ,MAAI,uBAAuB;AACzB,QAAI,UAAU,QAAQ;AACpB,YAAM,MAAM,cAAA;AACZ,mBAAa,IAAI,qBAAqB,IAAI,mBAAmB,CAAA;AAAA,IAC/D,WAAW,CAAC,iBAAiB;AAC3B,YAAM,kBAAkB,MAAM;AAAA,MAC9B;AACA,sBAAgB,OAAO;AACvB,sBAAgB,SAAS;AACzB,sBAAgB,QAAQ;AACxB,aAAO;AAAA,IACT;AAAA,EACF;AACA,QAAM,WAAW;AACjB,mBAAiB,OAAO,CAAC,IAAI,MAAM,SAAS,2BAA2B,IAAI,UAAU,MAAM,IAAI;AAC/F,MAAI,QAAQ;AACZ,MAAI,UAAU,QAAQ;AACpB,qBAAiB,YAAY,CAAC,QAAQ;AACpC,4BAAsB,KAAK,YAAY,SAAS,QAAQ;AAAA,IAC1D;AAAA,EACF,WAAW,UAAU,QAAQ;AAC3B,YAAQ;AACR,qBAAiB,YAAY,CAAC,KAAK,eAAe;AAChD,UAAI,YAAY;AACd,YAAA;AAAA,MACF,OAAO;AACL,iBAAS,GAAG;AAAA,MACd;AAAA,IACF;AAAA,EACF;AACA,mBAAiB,aAAa,CAAC,QAAQ;AACrC,QAAI,IAAI;AACN,UAAI,SAAS;AAAA,IACf;AACA,QAAI,OAAO;AACT,UAAI,SAAS;AACb,UAAI,UAAU;AACZ,YAAI,KAAK,SAAS;AAClB,YAAI,IAAI;AAAA,MACV;AAAA,IACF;AAAA,EACF;AACA,QAAM,cAAc,QAAQ,QAAQ,IAAI,gBAAgB;AACxD,MAAI,uBAAuB;AACzB,QAAI,YAAY;AACd,iBAAW,KAAK,WAAW;AAAA,IAC7B,WAAW,iBAAiB;AAC1B,kBAAA;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;AACA,SAAS,cAAc,QAAQ,OAAO,SAAS;AAC7C,QAAM,aAAa,KAAK;AACxB,QAAM,SAAS,SAAS,MAAM,IAAI,OAAO,SAAS,GAAG,IAAI,iBAAiB,YAAY,MAAM,IAAI,MAAM,WAAW,MAAM,IAAI,OAAO,KAAK,YAAY,UAAU;AAC7J,MAAI;AACJ,MAAI,WAAW,KAAK,GAAG;AACrB,SAAK;AAAA,EACP,OAAO;AACL,SAAK,MAAM;AACX,cAAU;AAAA,EACZ;AACA,QAAM,QAAQ,mBAAmB,IAAI;AACrC,QAAM,MAAM,QAAQ,QAAQ,GAAG,KAAK,UAAU,GAAG,OAAO;AACxD,QAAA;AACA,SAAO;AACT;AACA,SAAS,iBAAiB,KAAK,MAAM;AACnC,QAAM,WAAW,KAAK,MAAM,GAAG;AAC/B,SAAO,MAAM;AACX,QAAI,MAAM;AACV,aAASA,KAAI,GAAGA,KAAI,SAAS,UAAU,KAAKA,MAAK;AAC/C,YAAM,IAAI,SAASA,EAAC,CAAC;AAAA,IACvB;AACA,WAAO;AAAA,EACT;AACF;AAEA,MAAM,wCAAwC,MAAM;AACpD,MAAM,aAAa,CAAC,SAAS,KAAK;AAClC,MAAM,qBAAqB,CAAC,UAAU,UAAU,MAAM,YAAY,MAAM,aAAa;AACrF,MAAM,qBAAqB,CAAC,UAAU,UAAU,MAAM,SAAS,MAAM,UAAU;AAC/E,MAAM,cAAc,CAAC,WAAW,OAAO,eAAe,eAAe,kBAAkB;AACvF,MAAM,iBAAiB,CAAC,WAAW,OAAO,kBAAkB,cAAc,kBAAkB;AAC5F,MAAM,gBAAgB,CAAC,OAAO,WAAW;AACvC,QAAM,iBAAiB,SAAS,MAAM;AACtC,MAAI,SAAS,cAAc,GAAG;AAC5B,QAAI,CAAC,QAAQ;AAIX,aAAO;AAAA,IACT,OAAO;AACL,YAAM,SAAS,OAAO,cAAc;AAMpC,aAAO;AAAA,IACT;AAAA,EACF,OAAO;AAIL,WAAO;AAAA,EACT;AACF;AACA,MAAM,eAAe;AAAA,EACnB,MAAM;AAAA,EACN,cAAc;AAAA,EACd,QAAQ,IAAI,IAAI,WAAW,QAAQ,iBAAiB,gBAAgB,WAAW,cAAc,WAAW,WAAW;AACjH,UAAM;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,KAAK;AAAA,MACL,GAAG,EAAE,QAAQ,eAAe,YAAY,cAAA;AAAA,IAAc,IACpD;AACJ,UAAM,WAAW,mBAAmB,GAAG,KAAK;AAC5C,QAAI,EAAE,WAAW,UAAU,gBAAA,IAAoB;AAK/C,QAAI,MAAM,MAAM;AACd,YAAM,cAAc,GAAG,KAAmF,WAAW,EAAE;AACvH,YAAM,aAAa,GAAG,SAAqF,WAAW,EAAE;AACxH,aAAO,aAAa,WAAW,MAAM;AACrC,aAAO,YAAY,WAAW,MAAM;AACpC,YAAM,QAAQ,CAAC,YAAY,YAAY;AACrC,YAAI,YAAY,IAAI;AAClB;AAAA,YACE;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UAAA;AAAA,QAEJ;AAAA,MACF;AACA,YAAM,gBAAgB,MAAM;AAC1B,cAAM,SAAS,GAAG,SAAS,cAAc,GAAG,OAAO,aAAa;AAChE,cAAM,eAAe,cAAc,QAAQ,IAAI,YAAY,MAAM;AACjE,YAAI,QAAQ;AACV,cAAI,cAAc,SAAS,YAAY,MAAM,GAAG;AAC9C,wBAAY;AAAA,UACd,WAAW,cAAc,YAAY,eAAe,MAAM,GAAG;AAC3D,wBAAY;AAAA,UACd;AACA,cAAI,mBAAmB,gBAAgB,MAAM;AAC3C,aAAC,gBAAgB,GAAG,qBAAqB,gBAAgB,GAAG,mBAAmC,oBAAI,IAAA,IAAQ,IAAI,MAAM;AAAA,UACvH;AACA,cAAI,CAAC,UAAU;AACb,kBAAM,QAAQ,YAAY;AAC1B,0BAAc,IAAI,KAAK;AAAA,UACzB;AAAA,QACF;AAAA,MAOF;AACA,UAAI,UAAU;AACZ,cAAM,WAAW,UAAU;AAC3B,sBAAc,IAAI,IAAI;AAAA,MACxB;AACA,UAAI,mBAAmB,GAAG,KAAK,GAAG;AAChC,WAAG,GAAG,cAAc;AACpB,8BAAsB,MAAM;AAC1B,wBAAA;AACA,iBAAO,GAAG,GAAG;AAAA,QACf,GAAG,cAAc;AAAA,MACnB,OAAO;AACL,sBAAA;AAAA,MACF;AAAA,IACF,OAAO;AACL,UAAI,mBAAmB,GAAG,KAAK,KAAK,GAAG,GAAG,gBAAgB,OAAO;AAC/D,8BAAsB,MAAM;AAC1B,uBAAa;AAAA,YACX;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UAAA;AAAA,QAEJ,GAAG,cAAc;AACjB;AAAA,MACF;AACA,SAAG,KAAK,GAAG;AACX,SAAG,cAAc,GAAG;AACpB,YAAM,aAAa,GAAG,SAAS,GAAG;AAClC,YAAM,SAAS,GAAG,SAAS,GAAG;AAC9B,YAAM,eAAe,GAAG,eAAe,GAAG;AAC1C,YAAM,cAAc,mBAAmB,GAAG,KAAK;AAC/C,YAAM,mBAAmB,cAAc,YAAY;AACnD,YAAM,gBAAgB,cAAc,aAAa;AACjD,UAAI,cAAc,SAAS,YAAY,MAAM,GAAG;AAC9C,oBAAY;AAAA,MACd,WAAW,cAAc,YAAY,eAAe,MAAM,GAAG;AAC3D,oBAAY;AAAA,MACd;AACA,UAAI,iBAAiB;AACnB;AAAA,UACE,GAAG;AAAA,UACH;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QAAA;AAEF,+BAAuB,IAAI,IAAI,IAA0C;AAAA,MAC3E,WAAW,CAAC,WAAW;AACrB;AAAA,UACE;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QAAA;AAAA,MAEJ;AACA,UAAI,UAAU;AACZ,YAAI,CAAC,aAAa;AAChB;AAAA,YACE;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UAAA;AAAA,QAEJ,OAAO;AACL,cAAI,GAAG,SAAS,GAAG,SAAS,GAAG,MAAM,OAAO,GAAG,MAAM,IAAI;AACvD,eAAG,MAAM,KAAK,GAAG,MAAM;AAAA,UACzB;AAAA,QACF;AAAA,MACF,OAAO;AACL,aAAK,GAAG,SAAS,GAAG,MAAM,SAAS,GAAG,SAAS,GAAG,MAAM,KAAK;AAC3D,gBAAM,aAAa,GAAG,SAAS;AAAA,YAC7B,GAAG;AAAA,YACH;AAAA,UAAA;AAEF,cAAI,YAAY;AACd;AAAA,cACE;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,YAAA;AAAA,UAEJ;AAAA,QAOF,WAAW,aAAa;AACtB;AAAA,YACE;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UAAA;AAAA,QAEJ;AAAA,MACF;AACA,oBAAc,IAAI,QAAQ;AAAA,IAC5B;AAAA,EACF;AAAA,EACA,OAAO,OAAO,iBAAiB,gBAAgB,EAAE,IAAI,SAAS,GAAG,EAAE,QAAQ,WAAA,EAAW,GAAK,UAAU;AACnG,UAAM;AAAA,MACJ;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IAAA,IACE;AACJ,QAAI,QAAQ;AACV,iBAAW,WAAW;AACtB,iBAAW,YAAY;AAAA,IACzB;AACA,gBAAY,WAAW,MAAM;AAC7B,QAAI,YAAY,IAAI;AAClB,YAAM,eAAe,YAAY,CAAC,mBAAmB,KAAK;AAC1D,eAASA,KAAI,GAAGA,KAAI,SAAS,QAAQA,MAAK;AACxC,cAAM,QAAQ,SAASA,EAAC;AACxB;AAAA,UACE;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA,CAAC,CAAC,MAAM;AAAA,QAAA;AAAA,MAEZ;AAAA,IACF;AAAA,EACF;AAAA,EACA,MAAM;AAAA,EACN,SAAS;AACX;AACA,SAAS,aAAa,OAAO,WAAW,cAAc,EAAE,GAAG,EAAE,OAAA,GAAU,GAAG,QAAQ,WAAW,GAAG;AAC9F,MAAI,aAAa,GAAG;AAClB,WAAO,MAAM,cAAc,WAAW,YAAY;AAAA,EACpD;AACA,QAAM,EAAE,IAAI,QAAQ,WAAW,UAAU,UAAU;AACnD,QAAM,YAAY,aAAa;AAC/B,MAAI,WAAW;AACb,WAAO,IAAI,WAAW,YAAY;AAAA,EACpC;AACA,MAAI,CAAC,aAAa,mBAAmB,KAAK,GAAG;AAC3C,QAAI,YAAY,IAAI;AAClB,eAASA,KAAI,GAAGA,KAAI,SAAS,QAAQA,MAAK;AACxC;AAAA,UACE,SAASA,EAAC;AAAA,UACV;AAAA,UACA;AAAA,UACA;AAAA,QAAA;AAAA,MAEJ;AAAA,IACF;AAAA,EACF;AACA,MAAI,WAAW;AACb,WAAO,QAAQ,WAAW,YAAY;AAAA,EACxC;AACF;AACA,SAAS,gBAAgB,MAAM,OAAO,iBAAiB,gBAAgB,cAAc,WAAW;AAAA,EAC9F,GAAG,EAAE,aAAa,YAAY,eAAe,QAAQ,WAAA;AACvD,GAAG,iBAAiB;AAClB,WAAS,wBAAwB,OAAO,QAAQ,aAAa,cAAc;AACzE,WAAO,SAAS;AAAA,MACd,YAAY,KAAK;AAAA,MACjB;AAAA,MACA,WAAW,KAAK;AAAA,MAChB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IAAA;AAEF,WAAO,cAAc;AACrB,WAAO,eAAe;AAAA,EACxB;AACA,QAAM,SAAS,MAAM,SAAS;AAAA,IAC5B,MAAM;AAAA,IACN;AAAA,EAAA;AAEF,QAAM,WAAW,mBAAmB,MAAM,KAAK;AAC/C,MAAI,QAAQ;AACV,UAAM,aAAa,OAAO,QAAQ,OAAO;AACzC,QAAI,MAAM,YAAY,IAAI;AACxB,UAAI,UAAU;AACZ;AAAA,UACE;AAAA,UACA;AAAA,UACA;AAAA,UACA,cAAc,YAAY,UAAU;AAAA,QAAA;AAAA,MAExC,OAAO;AACL,cAAM,SAAS,YAAY,IAAI;AAC/B,YAAI,eAAe;AACnB,eAAO,cAAc;AACnB,cAAI,gBAAgB,aAAa,aAAa,GAAG;AAC/C,gBAAI,aAAa,SAAS,yBAAyB;AACjD,oBAAM,cAAc;AAAA,YACtB,WAAW,aAAa,SAAS,mBAAmB;AAClD,oBAAM,eAAe;AACrB,qBAAO,OAAO,MAAM,gBAAgB,YAAY,MAAM,YAAY;AAClE;AAAA,YACF;AAAA,UACF;AACA,yBAAe,YAAY,YAAY;AAAA,QACzC;AACA,YAAI,CAAC,MAAM,cAAc;AACvB,wBAAc,QAAQ,OAAO,YAAY,MAAM;AAAA,QACjD;AACA;AAAA,UACE,cAAc,YAAY,UAAU;AAAA,UACpC;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QAAA;AAAA,MAEJ;AAAA,IACF;AACA,kBAAc,OAAO,QAAQ;AAAA,EAC/B,WAAW,UAAU;AACnB,QAAI,MAAM,YAAY,IAAI;AACxB,8BAAwB,MAAM,OAAO,MAAM,YAAY,IAAI,CAAC;AAAA,IAC9D;AAAA,EACF;AACA,SAAO,MAAM,UAAU,YAAY,MAAM,MAAM;AACjD;AACA,MAAM,WAAW;AACjB,SAAS,cAAc,OAAO,YAAY;AACxC,QAAM,MAAM,MAAM;AAClB,MAAI,OAAO,IAAI,IAAI;AACjB,QAAI,MAAM;AACV,QAAI,YAAY;AACd,aAAO,MAAM;AACb,eAAS,MAAM;AAAA,IACjB,OAAO;AACL,aAAO,MAAM;AACb,eAAS,MAAM;AAAA,IACjB;AACA,WAAO,QAAQ,SAAS,QAAQ;AAC9B,UAAI,KAAK,aAAa,QAAQ,aAAa,gBAAgB,IAAI,GAAG;AAClE,aAAO,KAAK;AAAA,IACd;AACA,QAAI,GAAA;AAAA,EACN;AACF;AACA,SAAS,cAAc,QAAQ,OAAO,YAAY,QAAQ;AACxD,QAAM,cAAc,MAAM,cAAc,WAAW,EAAE;AACrD,QAAM,eAAe,MAAM,eAAe,WAAW,EAAE;AACvD,cAAY,cAAc,IAAI;AAC9B,MAAI,QAAQ;AACV,WAAO,aAAa,MAAM;AAC1B,WAAO,cAAc,MAAM;AAAA,EAC7B;AACA,SAAO;AACT;AAEA,MAAM,oCAAoC,UAAU;AACpD,MAAM,oCAAoC,UAAU;AACpD,SAAS,qBAAqB;AAC5B,QAAM,QAAQ;AAAA,IACZ,WAAW;AAAA,IACX,WAAW;AAAA,IACX,cAAc;AAAA,IACd,mCAAmC,IAAA;AAAA,EAAI;AAEzC,YAAU,MAAM;AACd,UAAM,YAAY;AAAA,EACpB,CAAC;AACD,kBAAgB,MAAM;AACpB,UAAM,eAAe;AAAA,EACvB,CAAC;AACD,SAAO;AACT;AACA,MAAM,0BAA0B,CAAC,UAAU,KAAK;AAChD,MAAM,gCAAgC;AAAA,EACpC,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,WAAW;AAAA;AAAA,EAEX,eAAe;AAAA,EACf,SAAS;AAAA,EACT,cAAc;AAAA,EACd,kBAAkB;AAAA;AAAA,EAElB,eAAe;AAAA,EACf,SAAS;AAAA,EACT,cAAc;AAAA,EACd,kBAAkB;AAAA;AAAA,EAElB,gBAAgB;AAAA,EAChB,UAAU;AAAA,EACV,eAAe;AAAA,EACf,mBAAmB;AACrB;AACA,MAAM,sBAAsB,CAAC,aAAa;AACxC,QAAM,UAAU,SAAS;AACzB,SAAO,QAAQ,YAAY,oBAAoB,QAAQ,SAAS,IAAI;AACtE;AACA,MAAM,qBAAqB;AAAA,EACzB,MAAM;AAAA,EACN,OAAO;AAAA,EACP,MAAM,OAAO,EAAE,SAAS;AACtB,UAAM,WAAW,mBAAA;AACjB,UAAM,QAAQ,mBAAA;AACd,WAAO,MAAM;AACX,YAAM,WAAW,MAAM,WAAW,yBAAyB,MAAM,QAAA,GAAW,IAAI;AAChF,UAAI,CAAC,YAAY,CAAC,SAAS,QAAQ;AACjC;AAAA,MACF;AACA,YAAM,QAAQ,oBAAoB,QAAQ;AAC1C,YAAM,WAAW,MAAM,KAAK;AAC5B,YAAM,EAAE,SAAS;AAIjB,UAAI,MAAM,WAAW;AACnB,eAAO,iBAAiB,KAAK;AAAA,MAC/B;AACA,YAAM,aAAa,gBAAgB,KAAK;AACxC,UAAI,CAAC,YAAY;AACf,eAAO,iBAAiB,KAAK;AAAA,MAC/B;AACA,UAAI,aAAa;AAAA,QACf;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA;AAAA,QAEA,CAAC,UAAU,aAAa;AAAA,MAAA;AAE1B,UAAI,WAAW,SAAS,SAAS;AAC/B,2BAAmB,YAAY,UAAU;AAAA,MAC3C;AACA,UAAI,gBAAgB,SAAS,WAAW,gBAAgB,SAAS,OAAO;AACxE,UAAI,iBAAiB,cAAc,SAAS,WAAW,CAAC,gBAAgB,eAAe,UAAU,KAAK,oBAAoB,QAAQ,EAAE,SAAS,SAAS;AACpJ,YAAI,eAAe;AAAA,UACjB;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QAAA;AAEF,2BAAmB,eAAe,YAAY;AAC9C,YAAI,SAAS,YAAY,WAAW,SAAS,SAAS;AACpD,gBAAM,YAAY;AAClB,uBAAa,aAAa,MAAM;AAC9B,kBAAM,YAAY;AAClB,gBAAI,EAAE,SAAS,IAAI,QAAQ,IAAI;AAC7B,uBAAS,OAAA;AAAA,YACX;AACA,mBAAO,aAAa;AACpB,4BAAgB;AAAA,UAClB;AACA,iBAAO,iBAAiB,KAAK;AAAA,QAC/B,WAAW,SAAS,YAAY,WAAW,SAAS,SAAS;AAC3D,uBAAa,aAAa,CAAC,IAAI,aAAa,iBAAiB;AAC3D,kBAAM,qBAAqB;AAAA,cACzB;AAAA,cACA;AAAA,YAAA;AAEF,+BAAmB,OAAO,cAAc,GAAG,CAAC,IAAI;AAChD,eAAG,UAAU,IAAI,MAAM;AACrB,0BAAA;AACA,iBAAG,UAAU,IAAI;AACjB,qBAAO,WAAW;AAClB,8BAAgB;AAAA,YAClB;AACA,uBAAW,eAAe,MAAM;AAC9B,2BAAA;AACA,qBAAO,WAAW;AAClB,8BAAgB;AAAA,YAClB;AAAA,UACF;AAAA,QACF,OAAO;AACL,0BAAgB;AAAA,QAClB;AAAA,MACF,WAAW,eAAe;AACxB,wBAAgB;AAAA,MAClB;AACA,aAAO;AAAA,IACT;AAAA,EACF;AACF;AACA,SAAS,oBAAoB,UAAU;AACrC,MAAI,QAAQ,SAAS,CAAC;AACtB,MAAI,SAAS,SAAS,GAAG;AAEvB,eAAWE,MAAK,UAAU;AACxB,UAAIA,GAAE,SAAS,SAAS;AAOtB,gBAAQA;AAEwC;AAAA,MAClD;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;AACA,MAAM,iBAAiB;AACvB,SAAS,uBAAuB,OAAO,OAAO;AAC5C,QAAM,EAAE,kBAAkB;AAC1B,MAAI,qBAAqB,cAAc,IAAI,MAAM,IAAI;AACrD,MAAI,CAAC,oBAAoB;AACvB,yBAAqC,uBAAO,OAAO,IAAI;AACvD,kBAAc,IAAI,MAAM,MAAM,kBAAkB;AAAA,EAClD;AACA,SAAO;AACT;AACA,SAAS,uBAAuB,OAAO,OAAO,OAAO,UAAU,WAAW;AACxE,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA,YAAY;AAAA,IACZ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA,IACE;AACJ,QAAM,MAAM,OAAO,MAAM,GAAG;AAC5B,QAAM,qBAAqB,uBAAuB,OAAO,KAAK;AAC9D,QAAMc,YAAW,CAAC,MAAM,SAAS;AAC/B,YAAQ;AAAA,MACN;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IAAA;AAAA,EAEJ;AACA,QAAM,gBAAgB,CAAC,MAAM,SAAS;AACpC,UAAM,OAAO,KAAK,CAAC;AACnBA,cAAS,MAAM,IAAI;AACnB,QAAI,QAAQ,IAAI,GAAG;AACjB,UAAI,KAAK,MAAM,CAAC,UAAU,MAAM,UAAU,CAAC,EAAG,MAAA;AAAA,IAChD,WAAW,KAAK,UAAU,GAAG;AAC3B,WAAA;AAAA,IACF;AAAA,EACF;AACA,QAAM,QAAQ;AAAA,IACZ;AAAA,IACA;AAAA,IACA,YAAY,IAAI;AACd,UAAI,OAAO;AACX,UAAI,CAAC,MAAM,WAAW;AACpB,YAAI,QAAQ;AACV,iBAAO,kBAAkB;AAAA,QAC3B,OAAO;AACL;AAAA,QACF;AAAA,MACF;AACA,UAAI,GAAG,UAAU,GAAG;AAClB,WAAG,UAAU;AAAA,UACX;AAAA;AAAA,QAAA;AAAA,MAGJ;AACA,YAAM,eAAe,mBAAmB,GAAG;AAC3C,UAAI,gBAAgB,gBAAgB,OAAO,YAAY,KAAK,aAAa,GAAG,UAAU,GAAG;AACvF,qBAAa,GAAG,UAAU,EAAA;AAAA,MAC5B;AACAA,gBAAS,MAAM,CAAC,EAAE,CAAC;AAAA,IACrB;AAAA,IACA,MAAM,IAAI;AACR,UAAI,OAAO;AACX,UAAI,YAAY;AAChB,UAAI,aAAa;AACjB,UAAI,CAAC,MAAM,WAAW;AACpB,YAAI,QAAQ;AACV,iBAAO,YAAY;AACnB,sBAAY,iBAAiB;AAC7B,uBAAa,qBAAqB;AAAA,QACpC,OAAO;AACL;AAAA,QACF;AAAA,MACF;AACA,UAAI,SAAS;AACb,YAAM,OAAO,GAAG,UAAU,IAAI,CAAC,cAAc;AAC3C,YAAI,OAAQ;AACZ,iBAAS;AACT,YAAI,WAAW;AACbA,oBAAS,YAAY,CAAC,EAAE,CAAC;AAAA,QAC3B,OAAO;AACLA,oBAAS,WAAW,CAAC,EAAE,CAAC;AAAA,QAC1B;AACA,YAAI,MAAM,cAAc;AACtB,gBAAM,aAAA;AAAA,QACR;AACA,WAAG,UAAU,IAAI;AAAA,MACnB;AACA,UAAI,MAAM;AACR,sBAAc,MAAM,CAAC,IAAI,IAAI,CAAC;AAAA,MAChC,OAAO;AACL,aAAA;AAAA,MACF;AAAA,IACF;AAAA,IACA,MAAM,IAAIC,SAAQ;AAChB,YAAM,OAAO,OAAO,MAAM,GAAG;AAC7B,UAAI,GAAG,UAAU,GAAG;AAClB,WAAG,UAAU;AAAA,UACX;AAAA;AAAA,QAAA;AAAA,MAGJ;AACA,UAAI,MAAM,cAAc;AACtB,eAAOA,QAAAA;AAAAA,MACT;AACAD,gBAAS,eAAe,CAAC,EAAE,CAAC;AAC5B,UAAI,SAAS;AACb,YAAM,OAAO,GAAG,UAAU,IAAI,CAAC,cAAc;AAC3C,YAAI,OAAQ;AACZ,iBAAS;AACTC,gBAAAA;AACA,YAAI,WAAW;AACbD,oBAAS,kBAAkB,CAAC,EAAE,CAAC;AAAA,QACjC,OAAO;AACLA,oBAAS,cAAc,CAAC,EAAE,CAAC;AAAA,QAC7B;AACA,WAAG,UAAU,IAAI;AACjB,YAAI,mBAAmB,IAAI,MAAM,OAAO;AACtC,iBAAO,mBAAmB,IAAI;AAAA,QAChC;AAAA,MACF;AACA,yBAAmB,IAAI,IAAI;AAC3B,UAAI,SAAS;AACX,sBAAc,SAAS,CAAC,IAAI,IAAI,CAAC;AAAA,MACnC,OAAO;AACL,aAAA;AAAA,MACF;AAAA,IACF;AAAA,IACA,MAAM,QAAQ;AACZ,YAAM,SAAS;AAAA,QACb;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MAAA;AAEF,UAAI,qBAAqB,MAAM;AAC/B,aAAO;AAAA,IACT;AAAA,EAAA;AAEF,SAAO;AACT;AACA,SAAS,iBAAiB,OAAO;AAC/B,MAAI,YAAY,KAAK,GAAG;AACtB,YAAQ,WAAW,KAAK;AACxB,UAAM,WAAW;AACjB,WAAO;AAAA,EACT;AACF;AACA,SAAS,gBAAgB,OAAO;AAC9B,MAAI,CAAC,YAAY,KAAK,GAAG;AACvB,QAAI,WAAW,MAAM,IAAI,KAAK,MAAM,UAAU;AAC5C,aAAO,oBAAoB,MAAM,QAAQ;AAAA,IAC3C;AACA,WAAO;AAAA,EACT;AACA,MAAI,MAAM,WAAW;AACnB,WAAO,MAAM,UAAU;AAAA,EACzB;AACA,QAAM,EAAE,WAAW,SAAA,IAAa;AAChC,MAAI,UAAU;AACZ,QAAI,YAAY,IAAI;AAClB,aAAO,SAAS,CAAC;AAAA,IACnB;AACA,QAAI,YAAY,MAAM,WAAW,SAAS,OAAO,GAAG;AAClD,aAAO,SAAS,QAAA;AAAA,IAClB;AAAA,EACF;AACF;AACA,SAAS,mBAAmB,OAAO,OAAO;AACxC,MAAI,MAAM,YAAY,KAAK,MAAM,WAAW;AAC1C,UAAM,aAAa;AACnB,uBAAmB,MAAM,UAAU,SAAS,KAAK;AAAA,EACnD,WAAW,MAAM,YAAY,KAAK;AAChC,UAAM,UAAU,aAAa,MAAM,MAAM,MAAM,SAAS;AACxD,UAAM,WAAW,aAAa,MAAM,MAAM,MAAM,UAAU;AAAA,EAC5D,OAAO;AACL,UAAM,aAAa;AAAA,EACrB;AACF;AACA,SAAS,yBAAyB,UAAU,cAAc,OAAO,WAAW;AAC1E,MAAI,MAAM,CAAA;AACV,MAAI,qBAAqB;AACzB,WAAShB,KAAI,GAAGA,KAAI,SAAS,QAAQA,MAAK;AACxC,QAAI,QAAQ,SAASA,EAAC;AACtB,UAAM,MAAM,aAAa,OAAO,MAAM,MAAM,OAAO,SAAS,IAAI,OAAO,MAAM,OAAO,OAAO,MAAM,MAAMA,EAAC;AACxG,QAAI,MAAM,SAAS,UAAU;AAC3B,UAAI,MAAM,YAAY,IAAK;AAC3B,YAAM,IAAI;AAAA,QACR,yBAAyB,MAAM,UAAU,aAAa,GAAG;AAAA,MAAA;AAAA,IAE7D,WAAW,eAAe,MAAM,SAAS,SAAS;AAChD,UAAI,KAAK,OAAO,OAAO,WAAW,OAAO,EAAE,KAAK,IAAI,KAAK;AAAA,IAC3D;AAAA,EACF;AACA,MAAI,qBAAqB,GAAG;AAC1B,aAASA,KAAI,GAAGA,KAAI,IAAI,QAAQA,MAAK;AACnC,UAAIA,EAAC,EAAE,YAAY;AAAA,IACrB;AAAA,EACF;AACA,SAAO;AACT;AAAA;AAGA,SAAS,gBAAgB,SAAS,cAAc;AAC9C,SAAO,WAAW,OAAO;AAAA;AAAA;AAAA,IAGN,uBAAM,OAAO,EAAE,MAAM,QAAQ,KAAA,GAAQ,cAAc,EAAE,OAAO,SAAS,GAAA;AAAA,MACpF;AACN;AAaA,SAAS,kBAAkB,UAAU;AACnC,WAAS,MAAM,CAAC,SAAS,IAAI,CAAC,IAAI,SAAS,IAAI,CAAC,MAAM,KAAK,GAAG,CAAC;AACjE;AA8BA,MAAM,uCAAuC,QAAA;AAC7C,SAAS,OAAO,QAAQ,WAAW,gBAAgB,OAAO,YAAY,OAAO;AAC3E,MAAI,QAAQ,MAAM,GAAG;AACnB,WAAO;AAAA,MACL,CAAC,GAAGA,OAAM;AAAA,QACR;AAAA,QACA,cAAc,QAAQ,SAAS,IAAI,UAAUA,EAAC,IAAI;AAAA,QAClD;AAAA,QACA;AAAA,QACA;AAAA,MAAA;AAAA,IACF;AAEF;AAAA,EACF;AACA,MAAI,eAAe,KAAK,KAAK,CAAC,WAAW;AACvC,QAAI,MAAM,YAAY,OAAO,MAAM,KAAK,mBAAmB,MAAM,UAAU,QAAQ,WAAW;AAC5F,aAAO,QAAQ,WAAW,gBAAgB,MAAM,UAAU,OAAO;AAAA,IACnE;AACA;AAAA,EACF;AACA,QAAM,WAAW,MAAM,YAAY,IAAI,2BAA2B,MAAM,SAAS,IAAI,MAAM;AAC3F,QAAM,QAAQ,YAAY,OAAO;AACjC,QAAM,EAAE,GAAG,OAAO,GAAGkB,SAAQ;AAO7B,QAAM,SAAS,aAAa,UAAU;AACtC,QAAM,OAAO,MAAM,SAAS,YAAY,MAAM,OAAO,KAAK,MAAM;AAChE,QAAM,aAAa,MAAM;AACzB,QAAM,gBAAgB,MAAM,UAAU;AACtC,QAAM,iBAAiB,eAAe,YAAY,KAAK,CAAC,QAAQ;AAW9D,WAAO,OAAO,eAAe,GAAG;AAAA,EAClC;AAIA,MAAI,UAAU,QAAQ,WAAWA,MAAK;AACpC,4BAAwB,SAAS;AACjC,QAAI,SAAS,MAAM,GAAG;AACpB,WAAK,MAAM,IAAI;AACf,UAAI,eAAe,MAAM,GAAG;AAC1B,mBAAW,MAAM,IAAI;AAAA,MACvB;AAAA,IACF,WAAW,MAAM,MAAM,GAAG;AACD;AACrB,eAAO,QAAQ;AAAA,MACjB;AACA,YAAM,gBAAgB;AACtB,UAAI,cAAc,EAAG,MAAK,cAAc,CAAC,IAAI;AAAA,IAC/C;AAAA,EACF;AACA,MAAI,WAAWA,IAAG,GAAG;AACnB,0BAAsBA,MAAK,OAAO,IAAI,CAAC,OAAO,IAAI,CAAC;AAAA,EACrD,OAAO;AACL,UAAM,YAAY,SAASA,IAAG;AAC9B,UAAM,SAAS,MAAMA,IAAG;AACxB,QAAI,aAAa,QAAQ;AACvB,YAAM,QAAQ,MAAM;AAClB,YAAI,OAAO,GAAG;AACZ,gBAAM,WAAW,YAAY,eAAeA,IAAG,IAAI,WAAWA,IAAG,IAAI,KAAKA,IAAG,IAAkCA,KAAI;AACnH,cAAI,WAAW;AACb,oBAAQ,QAAQ,KAAK,OAAO,UAAU,QAAQ;AAAA,UAChD,OAAO;AACL,gBAAI,CAAC,QAAQ,QAAQ,GAAG;AACtB,kBAAI,WAAW;AACb,qBAAKA,IAAG,IAAI,CAAC,QAAQ;AACrB,oBAAI,eAAeA,IAAG,GAAG;AACvB,6BAAWA,IAAG,IAAI,KAAKA,IAAG;AAAA,gBAC5B;AAAA,cACF,OAAO;AACL,sBAAM,SAAS,CAAC,QAAQ;AACJ;AAClBA,uBAAI,QAAQ;AAAA,gBACd;AACA,oBAAI,OAAO,EAAG,MAAK,OAAO,CAAC,IAAI;AAAA,cACjC;AAAA,YACF,WAAW,CAAC,SAAS,SAAS,QAAQ,GAAG;AACvC,uBAAS,KAAK,QAAQ;AAAA,YACxB;AAAA,UACF;AAAA,QACF,WAAW,WAAW;AACpB,eAAKA,IAAG,IAAI;AACZ,cAAI,eAAeA,IAAG,GAAG;AACvB,uBAAWA,IAAG,IAAI;AAAA,UACpB;AAAA,QACF,WAAW,QAAQ;AACG;AAClBA,iBAAI,QAAQ;AAAA,UACd;AACA,cAAI,OAAO,EAAG,MAAK,OAAO,CAAC,IAAI;AAAA,QACjC;MAGF;AACA,UAAI,OAAO;AACT,cAAM,MAAM,MAAM;AAChB,gBAAA;AACA,2BAAiB,OAAO,MAAM;AAAA,QAChC;AACA,YAAI,KAAK;AACT,yBAAiB,IAAI,QAAQ,GAAG;AAChC,8BAAsB,KAAK,cAAc;AAAA,MAC3C,OAAO;AACL,gCAAwB,MAAM;AAC9B,cAAA;AAAA,MACF;AAAA,IACF;AAAA,EAGF;AACF;AACA,SAAS,wBAAwB,QAAQ;AACvC,QAAM,gBAAgB,iBAAiB,IAAI,MAAM;AACjD,MAAI,eAAe;AACjB,kBAAc,SAAS;AACvB,qBAAiB,OAAO,MAAM;AAAA,EAChC;AACF;AA8oB4B,gBAAgB,wBAAwB,CAAC,OAAO,WAAW,IAAI,CAAC;AACjE,cAAA,EAAgB,uBAAuB,CAAC,OAAO,aAAa,EAAE;AA0FzF,MAAM,iBAAiB,CAAClB,OAAM,CAAC,CAACA,GAAE,KAAK;AA2KvC,MAAM,cAAc,CAAC,UAAU,MAAM,KAAK;AA6N1C,SAAS,YAAY,MAAM,QAAQ;AACjC,wBAAsB,MAAM,KAAK,MAAM;AACzC;AACA,SAAS,cAAc,MAAM,QAAQ;AACnC,wBAAsB,MAAM,MAAM,MAAM;AAC1C;AACA,SAAS,sBAAsB,MAAM,MAAM,SAAS,iBAAiB;AACnE,QAAM,cAAc,KAAK,UAAU,KAAK,QAAQ,MAAM;AACpD,QAAI,UAAU;AACd,WAAO,SAAS;AACd,UAAI,QAAQ,eAAe;AACzB;AAAA,MACF;AACA,gBAAU,QAAQ;AAAA,IACpB;AACA,WAAO,KAAA;AAAA,EACT;AACA,aAAW,MAAM,aAAa,MAAM;AACpC,MAAI,QAAQ;AACV,QAAI,UAAU,OAAO;AACrB,WAAO,WAAW,QAAQ,QAAQ;AAChC,UAAI,YAAY,QAAQ,OAAO,KAAK,GAAG;AACrC,8BAAsB,aAAa,MAAM,QAAQ,OAAO;AAAA,MAC1D;AACA,gBAAU,QAAQ;AAAA,IACpB;AAAA,EACF;AACF;AACA,SAAS,sBAAsB,MAAM,MAAM,QAAQ,eAAe;AAChE,QAAM,WAAW;AAAA,IACf;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA;AAAA,EAAA;AAGF,cAAY,MAAM;AAChB,WAAO,cAAc,IAAI,GAAG,QAAQ;AAAA,EACtC,GAAG,MAAM;AACX;AASA,SAAS,WAAW,MAAM,MAAM,SAAS,iBAAiB,UAAU,OAAO;AACzE,MAAI,QAAQ;AACV,UAAM,QAAQ,OAAO,IAAI,MAAM,OAAO,IAAI,IAAI;AAC9C,UAAM,cAAc,KAAK,UAAU,KAAK,QAAQ,IAAI,SAAS;AAC3D,oBAAA;AACA,YAAM,QAAQ,mBAAmB,MAAM;AACvC,YAAM,MAAM,2BAA2B,MAAM,QAAQ,MAAM,IAAI;AAC/D,YAAA;AACA,oBAAA;AACA,aAAO;AAAA,IACT;AACA,QAAI,SAAS;AACX,YAAM,QAAQ,WAAW;AAAA,IAC3B,OAAO;AACL,YAAM,KAAK,WAAW;AAAA,IACxB;AACA,WAAO;AAAA,EACT;AAMF;AACA,MAAM,aAAa,CAAC,cAAc,CAAC,MAAM,SAAS,oBAAoB;AACpE,MAAI,CAAC,yBAAyB,cAAc,MAAM;AAChD,eAAW,WAAW,IAAI,SAAS,KAAK,GAAG,IAAI,GAAG,MAAM;AAAA,EAC1D;AACF;AACA,MAAM,gBAAgB,WAAW,IAAI;AACrC,MAAM,YAAY,WAAW,GAAG;AAChC,MAAM,iBAAiB;AAAA,EACrB;AACF;AACA,MAAM,YAAY,WAAW,GAAG;AAChC,MAAM,kBAAkB;AAAA,EACtB;AACF;AACA,MAAM,cAAc,WAAW,IAAI;AACnC,MAAM,mBAAmB;AAAA,EACvB;AACF;AACA,MAAM,oBAAoB,WAAW,KAAK;AAC1C,MAAM,kBAAkB,WAAW,KAAK;AACxC,SAAS,gBAAgB,MAAM,SAAS,iBAAiB;AACvD,aAAW,MAAM,MAAM,MAAM;AAC/B;AAEA,MAAM,aAAa;AAEnB,SAAS,iBAAiB,MAAM,oBAAoB;AAClD,SAAO,aAAa,YAAY,MAAM,MAAM,kBAAkB,KAAK;AACrE;AACA,MAAM,yBAAyC,uBAAO,IAAI,OAAO;AAWjE,SAAS,aAAa,MAAM,MAAM,cAAc,MAAM,qBAAqB,OAAO;AAChF,QAAM,WAAW,4BAA4B;AAC7C,MAAI,UAAU;AACZ,UAAM,YAAY,SAAS;AACF;AACvB,YAAM,WAAW;AAAA,QACf;AAAA,QACA;AAAA,MAAA;AAEF,UAAI,aAAa,aAAa,QAAQ,aAAa,SAAS,IAAI,KAAK,aAAa,WAAW,SAAS,IAAI,CAAC,IAAI;AAC7G,eAAO;AAAA,MACT;AAAA,IACF;AACA,UAAM;AAAA;AAAA;AAAA,MAGJ,QAAQ,SAAS,IAAI,KAAK,UAAU,IAAI,GAAG,IAAI;AAAA,MAC/C,QAAQ,SAAS,WAAW,IAAI,GAAG,IAAI;AAAA;AAEzC,QAAI,CAAC,OAAO,oBAAoB;AAC9B,aAAO;AAAA,IACT;AAMA,WAAO;AAAA,EACT;AAKF;AACA,SAAS,QAAQ,UAAU,MAAM;AAC/B,SAAO,aAAa,SAAS,IAAI,KAAK,SAAS,SAAS,IAAI,CAAC,KAAK,SAAS,WAAW,SAAS,IAAI,CAAC,CAAC;AACvG;AAEA,SAAS,WAAW,QAAQ,YAAY,OAAO,OAAO;AACpD,MAAI;AACJ,QAAM,SAAS;AACf,QAAM,gBAAgB,QAAQ,MAAM;AACpC,MAAI,iBAAiB,SAAS,MAAM,GAAG;AACrC,UAAM,wBAAwB,iBAAiB,WAAW,MAAM;AAChE,QAAI,YAAY;AAChB,QAAI,mBAAmB;AACvB,QAAI,uBAAuB;AACzB,kBAAY,CAAC,UAAU,MAAM;AAC7B,yBAAmB,WAAW,MAAM;AACpC,eAAS,iBAAiB,MAAM;AAAA,IAClC;AACA,UAAM,IAAI,MAAM,OAAO,MAAM;AAC7B,aAASA,KAAI,GAAGS,KAAI,OAAO,QAAQT,KAAIS,IAAGT,MAAK;AAC7C,UAAIA,EAAC,IAAI;AAAA,QACP,YAAY,mBAAmB,WAAW,WAAW,OAAOA,EAAC,CAAC,CAAC,IAAI,WAAW,OAAOA,EAAC,CAAC,IAAI,OAAOA,EAAC;AAAA,QACnGA;AAAA,QACA;AAAA,QACA;AAAA,MAAkB;AAAA,IAEtB;AAAA,EACF,WAAW,OAAO,WAAW,UAAU;AAIrC,UAAM,IAAI,MAAM,MAAM;AACtB,aAASA,KAAI,GAAGA,KAAI,QAAQA,MAAK;AAC/B,UAAIA,EAAC,IAAI,WAAWA,KAAI,GAAGA,IAAG,QAAQ,MAAmB;AAAA,IAC3D;AAAA,EACF,WAAW,SAAS,MAAM,GAAG;AAC3B,QAAI,OAAO,OAAO,QAAQ,GAAG;AAC3B,YAAM,MAAM;AAAA,QACV;AAAA,QACA,CAAC,MAAMA,OAAM,WAAW,MAAMA,IAAG,QAAQ,MAAmB;AAAA,MAAA;AAAA,IAEhE,OAAO;AACL,YAAM,OAAO,OAAO,KAAK,MAAM;AAC/B,YAAM,IAAI,MAAM,KAAK,MAAM;AAC3B,eAASA,KAAI,GAAGS,KAAI,KAAK,QAAQT,KAAIS,IAAGT,MAAK;AAC3C,cAAM,MAAM,KAAKA,EAAC;AAClB,YAAIA,EAAC,IAAI,WAAW,OAAO,GAAG,GAAG,KAAKA,IAAG,MAAmB;AAAA,MAC9D;AAAA,IACF;AAAA,EACF,OAAO;AACL,UAAM,CAAA;AAAA,EACR;AAIA,SAAO;AACT;AAoBA,SAAS,WAAW,OAAO,MAAM,QAAQ,CAAA,GAAI,UAAU,WAAW;AAChE,MAAI,yBAAyB,MAAM,yBAAyB,UAAU,eAAe,yBAAyB,MAAM,KAAK,yBAAyB,OAAO,IAAI;AAC3J,UAAM,WAAW,OAAO,KAAK,KAAK,EAAE,SAAS;AAC7C,QAAI,SAAS,UAAW,OAAM,OAAO;AACrC,WAAO,aAAa;AAAA,MAClB;AAAA,MACA;AAAA,MACA,CAAC,YAAY,QAAQ,OAAO,QAAsB,CAAC;AAAA,MACnD,WAAW,KAAK;AAAA,IAAA;AAAA,EAEpB;AACA,MAAI,OAAO,MAAM,IAAI;AAOrB,MAAI,QAAQ,KAAK,IAAI;AACnB,SAAK,KAAK;AAAA,EACZ;AACA,YAAA;AACA,QAAM,mBAAmB,QAAQ,iBAAiB,KAAK,KAAK,CAAC;AAC7D,QAAM,UAAU,MAAM;AAAA;AAAA,EAEtB,oBAAoB,iBAAiB;AACrC,QAAM,WAAW;AAAA,IACf;AAAA,IACA;AAAA,MACE,MAAM,WAAW,CAAC,SAAS,OAAO,IAAI,UAAU,IAAI,IAAI;AAAA,OACvD,CAAC,oBAAoB,WAAW,QAAQ;AAAA,IAAA;AAAA,IAE3C,oBAA6C,CAAA;AAAA,IAC7C,oBAAoB,MAAM,MAAM,IAAI,KAAK;AAAA,EAAA;AAK3C,MAAI,QAAQ,KAAK,IAAI;AACnB,SAAK,KAAK;AAAA,EACZ;AACA,SAAO;AACT;AACA,SAAS,iBAAiB,QAAQ;AAChC,SAAO,OAAO,KAAK,CAAC,UAAU;AAC5B,QAAI,CAAC,QAAQ,KAAK,EAAG,QAAO;AAC5B,QAAI,MAAM,SAAS,QAAS,QAAO;AACnC,QAAI,MAAM,SAAS,YAAY,CAAC,iBAAiB,MAAM,QAAQ;AAC7D,aAAO;AACT,WAAO;AAAA,EACT,CAAC,IAAI,SAAS;AAChB;AAcA,MAAM,oBAAoB,CAACA,OAAM;AAC/B,MAAI,CAACA,GAAG,QAAO;AACf,MAAI,oBAAoBA,EAAC,EAAG,QAAO,2BAA2BA,EAAC;AAC/D,SAAO,kBAAkBA,GAAE,MAAM;AACnC;AACA,MAAM;AAAA;AAAA;AAAA,EAGY,uBAAuB,uBAAO,OAAO,IAAI,GAAG;AAAA,IAC1D,GAAG,CAACA,OAAMA;AAAA,IACV,KAAK,CAACA,OAAMA,GAAE,MAAM;AAAA,IACpB,OAAO,CAACA,OAAMA,GAAE;AAAA,IAChB,QAAQ,CAACA,OAA6EA,GAAE;AAAA,IACxF,QAAQ,CAACA,OAA6EA,GAAE;AAAA,IACxF,QAAQ,CAACA,OAA6EA,GAAE;AAAA,IACxF,OAAO,CAACA,OAA4EA,GAAE;AAAA,IACtF,SAAS,CAACA,OAAM,kBAAkBA,GAAE,MAAM;AAAA,IAC1C,OAAO,CAACA,OAAM,kBAAkBA,GAAE,IAAI;AAAA,IACtC,OAAO,CAACA,OAAMA,GAAE;AAAA,IAChB,OAAO,CAACA,OAAMA,GAAE;AAAA,IAChB,UAAU,CAACA,OAA4B,qBAAqBA,EAAC;AAAA,IAC7D,cAAc,CAACA,OAAMA,GAAE,MAAMA,GAAE,IAAI,MAAM;AACvC,eAASA,GAAE,MAAM;AAAA,IACnB;AAAA,IACA,WAAW,CAACA,OAAMA,GAAE,MAAMA,GAAE,IAAI,SAAS,KAAKA,GAAE,KAAK;AAAA,IACrD,QAAQ,CAACA,OAA4B,cAAc,KAAKA,EAAC;AAAA,EAAI,CAC9D;AAAA;AAGH,MAAM,kBAAkB,CAAC,OAAO,QAAQ,UAAU,aAAa,CAAC,MAAM,mBAAmB,OAAO,OAAO,GAAG;AAC1G,MAAM,8BAA8B;AAAA,EAClC,IAAI,EAAE,GAAG,SAAA,GAAY,KAAK;AACxB,QAAI,QAAQ,YAAY;AACtB,aAAO;AAAA,IACT;AACA,UAAM,EAAE,KAAK,YAAY,MAAM,OAAO,aAAa,MAAM,eAAe;AAIxE,QAAI,IAAI,CAAC,MAAM,KAAK;AAClB,YAAM,IAAI,YAAY,GAAG;AACzB,UAAI,MAAM,QAAQ;AAChB,gBAAQ,GAAA;AAAA,UACN,KAAK;AACH,mBAAO,WAAW,GAAG;AAAA,UACvB,KAAK;AACH,mBAAO,KAAK,GAAG;AAAA,UACjB,KAAK;AACH,mBAAO,IAAI,GAAG;AAAA,UAChB,KAAK;AACH,mBAAO,MAAM,GAAG;AAAA,QAAA;AAAA,MAEtB,WAAW,gBAAgB,YAAY,GAAG,GAAG;AAC3C,oBAAY,GAAG,IAAI;AACnB,eAAO,WAAW,GAAG;AAAA,MACvB,WAAkC,SAAS,aAAa,OAAO,MAAM,GAAG,GAAG;AACzE,oBAAY,GAAG,IAAI;AACnB,eAAO,KAAK,GAAG;AAAA,MACjB,WAAW,OAAO,OAAO,GAAG,GAAG;AAC7B,oBAAY,GAAG,IAAI;AACnB,eAAO,MAAM,GAAG;AAAA,MAClB,WAAW,QAAQ,aAAa,OAAO,KAAK,GAAG,GAAG;AAChD,oBAAY,GAAG,IAAI;AACnB,eAAO,IAAI,GAAG;AAAA,MAChB,WAAmC,mBAAmB;AACpD,oBAAY,GAAG,IAAI;AAAA,MACrB;AAAA,IACF;AACA,UAAM,eAAe,oBAAoB,GAAG;AAC5C,QAAI,WAAW;AACf,QAAI,cAAc;AAChB,UAAI,QAAQ,UAAU;AACpB,cAAM,SAAS,OAAO,OAAO,EAAE;AAAA,MAEjC;AAGA,aAAO,aAAa,QAAQ;AAAA,IAC9B;AAAA;AAAA,OAEG,YAAY,KAAK,kBAAkB,YAAY,UAAU,GAAG;AAAA,MAC7D;AACA,aAAO;AAAA,IACT,WAAW,QAAQ,aAAa,OAAO,KAAK,GAAG,GAAG;AAChD,kBAAY,GAAG,IAAI;AACnB,aAAO,IAAI,GAAG;AAAA,IAChB;AAAA;AAAA,MAEE,mBAAmB,WAAW,OAAO,kBAAkB,OAAO,kBAAkB,GAAG;AAAA,MACnF;AACA;AACE,eAAO,iBAAiB,GAAG;AAAA,MAC7B;AAAA,IACF;EAeF;AAAA,EACA,IAAI,EAAE,GAAG,SAAA,GAAY,KAAK,OAAO;AAC/B,UAAM,EAAE,MAAM,YAAY,IAAA,IAAQ;AAClC,QAAI,gBAAgB,YAAY,GAAG,GAAG;AACpC,iBAAW,GAAG,IAAI;AAClB,aAAO;AAAA,IACT,WAGkC,SAAS,aAAa,OAAO,MAAM,GAAG,GAAG;AACzE,WAAK,GAAG,IAAI;AACZ,aAAO;AAAA,IACT,WAAW,OAAO,SAAS,OAAO,GAAG,GAAG;AAEtC,aAAO;AAAA,IACT;AACA,QAAI,IAAI,CAAC,MAAM,OAAO,IAAI,MAAM,CAAC,KAAK,UAAU;AAI9C,aAAO;AAAA,IACT,OAAO;AAOE;AACL,YAAI,GAAG,IAAI;AAAA,MACb;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAAA,EACA,IAAI;AAAA,IACF,GAAG,EAAE,MAAM,YAAY,aAAa,KAAK,YAAY,OAAO,KAAA;AAAA,EAAK,GAChE,KAAK;AACN,QAAI;AACJ,WAAO,CAAC,EAAE,YAAY,GAAG,KAA4B,SAAS,aAAa,IAAI,CAAC,MAAM,OAAO,OAAO,MAAM,GAAG,KAAK,gBAAgB,YAAY,GAAG,KAAK,OAAO,OAAO,GAAG,KAAK,OAAO,KAAK,GAAG,KAAK,OAAO,qBAAqB,GAAG,KAAK,OAAO,WAAW,OAAO,kBAAkB,GAAG,MAAM,aAAa,KAAK,iBAAiB,WAAW,GAAG;AAAA,EAC3U;AAAA,EACA,eAAe,QAAQ,KAAK,YAAY;AACtC,QAAI,WAAW,OAAO,MAAM;AAC1B,aAAO,EAAE,YAAY,GAAG,IAAI;AAAA,IAC9B,WAAW,OAAO,YAAY,OAAO,GAAG;AACtC,WAAK,IAAI,QAAQ,KAAK,WAAW,OAAO,IAAI;AAAA,IAC9C;AACA,WAAO,QAAQ,eAAe,QAAQ,KAAK,UAAU;AAAA,EACvD;AACF;AA4IA,SAAS,sBAAsB,OAAO;AACpC,SAAO,QAAQ,KAAK,IAAI,MAAM;AAAA,IAC5B,CAAC,YAAYe,QAAO,WAAWA,EAAC,IAAI,MAAM;AAAA,IAC1C,CAAA;AAAA,EAAC,IACC;AACN;AAoEA,IAAI,oBAAoB;AACxB,SAAS,aAAa,UAAU;AAC9B,QAAM,UAAU,qBAAqB,QAAQ;AAC7C,QAAM,aAAa,SAAS;AAC5B,QAAM,MAAM,SAAS;AACrB,sBAAoB;AACpB,MAAI,QAAQ,cAAc;AACxBC,eAAS,QAAQ,cAAc,UAAU,IAAI;AAAA,EAC/C;AACA,QAAM;AAAA;AAAA,IAEJ,MAAM;AAAA,IACN,UAAU;AAAA,IACV;AAAA,IACA,OAAO;AAAA,IACP,SAAS;AAAA,IACT,QAAQ;AAAA;AAAA,IAER;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA;AAAA,IAEA;AAAA,IACA;AAAA;AAAA,IAEA;AAAA,IACA;AAAA,IACA;AAAA,EAAA,IACE;AACJ,QAAM,2BAAkG;AASxG,MAAI,eAAe;AACjB,sBAAkB,eAAe,KAAK,wBAAwB;AAAA,EAChE;AACA,MAAI,SAAS;AACX,eAAW,OAAO,SAAS;AACzB,YAAM,gBAAgB,QAAQ,GAAG;AACjC,UAAI,WAAW,aAAa,GAAG;AAQtB;AACL,cAAI,GAAG,IAAI,cAAc,KAAK,UAAU;AAAA,QAC1C;AAAA,MAIF;AAAA,IAKF;AAAA,EACF;AACA,MAAI,aAAa;AAMf,UAAM,OAAO,YAAY,KAAK,YAAY,UAAU;AAMpD,QAAI,CAAC,SAAS,IAAI,EAAG;AAAA,SAEd;AACL,eAAS,OAAO,SAAS,IAAI;AAAA,IAc/B;AAAA,EACF;AACA,sBAAoB;AACpB,MAAI,iBAAiB;AACnB,eAAW,OAAO,iBAAiB;AACjC,YAAM,MAAM,gBAAgB,GAAG;AAC/B,YAAM,MAAM,WAAW,GAAG,IAAI,IAAI,KAAK,YAAY,UAAU,IAAI,WAAW,IAAI,GAAG,IAAI,IAAI,IAAI,KAAK,YAAY,UAAU,IAAI;AAI9H,YAAM,MAAM,CAAC,WAAW,GAAG,KAAK,WAAW,IAAI,GAAG,IAAI,IAAI,IAAI,KAAK,UAAU,IAIzE;AACJ,YAAMd,KAAI,SAAS;AAAA,QACjB;AAAA,QACA;AAAA,MAAA,CACD;AACD,aAAO,eAAe,KAAK,KAAK;AAAA,QAC9B,YAAY;AAAA,QACZ,cAAc;AAAA,QACd,KAAK,MAAMA,GAAE;AAAA,QACb,KAAK,CAACK,OAAML,GAAE,QAAQK;AAAA,MAAA,CACvB;AAAA,IAIH;AAAA,EACF;AACA,MAAI,cAAc;AAChB,eAAW,OAAO,cAAc;AAC9B,oBAAc,aAAa,GAAG,GAAG,KAAK,YAAY,GAAG;AAAA,IACvD;AAAA,EACF;AACA,MAAI,gBAAgB;AAClB,UAAM,WAAW,WAAW,cAAc,IAAI,eAAe,KAAK,UAAU,IAAI;AAChF,YAAQ,QAAQ,QAAQ,EAAE,QAAQ,CAAC,QAAQ;AACzC,cAAQ,KAAK,SAAS,GAAG,CAAC;AAAA,IAC5B,CAAC;AAAA,EACH;AACA,MAAI,SAAS;AACXS,eAAS,SAAS,UAAU,GAAG;AAAA,EACjC;AACA,WAAS,sBAAsB,UAAU,MAAM;AAC7C,QAAI,QAAQ,IAAI,GAAG;AACjB,WAAK,QAAQ,CAAC,UAAU,SAAS,MAAM,KAAK,UAAU,CAAC,CAAC;AAAA,IAC1D,WAAW,MAAM;AACf,eAAS,KAAK,KAAK,UAAU,CAAC;AAAA,IAChC;AAAA,EACF;AACA,wBAAsB,eAAe,WAAW;AAChD,wBAAsB,WAAW,OAAO;AACxC,wBAAsB,gBAAgB,YAAY;AAClD,wBAAsB,WAAW,OAAO;AACxC,wBAAsB,aAAa,SAAS;AAC5C,wBAAsB,eAAe,WAAW;AAChD,wBAAsB,iBAAiB,aAAa;AACpD,wBAAsB,iBAAiB,aAAa;AACpD,wBAAsB,mBAAmB,eAAe;AACxD,wBAAsB,iBAAiB,aAAa;AACpD,wBAAsB,aAAa,SAAS;AAC5C,wBAAsB,kBAAkB,cAAc;AACtD,MAAI,QAAQ,MAAM,GAAG;AACnB,QAAI,OAAO,QAAQ;AACjB,YAAM,UAAU,SAAS,YAAY,SAAS,UAAU,CAAA;AACxD,aAAO,QAAQ,CAAC,QAAQ;AACtB,eAAO,eAAe,SAAS,KAAK;AAAA,UAClC,KAAK,MAAM,WAAW,GAAG;AAAA,UACzB,KAAK,CAAC,QAAQ,WAAW,GAAG,IAAI;AAAA,UAChC,YAAY;AAAA,QAAA,CACb;AAAA,MACH,CAAC;AAAA,IACH,WAAW,CAAC,SAAS,SAAS;AAC5B,eAAS,UAAU,CAAA;AAAA,IACrB;AAAA,EACF;AACA,MAAI,UAAU,SAAS,WAAW,MAAM;AACtC,aAAS,SAAS;AAAA,EACpB;AACA,MAAI,gBAAgB,MAAM;AACxB,aAAS,eAAe;AAAA,EAC1B;AACA,MAAI,qBAAqB,aAAa;AACtC,MAAI,qBAAqB,aAAa;AACtC,MAAI,gBAAgB;AAClB,sBAAkB,QAAQ;AAAA,EAC5B;AACF;AACA,SAAS,kBAAkB,eAAe,KAAK,2BAA2B,MAAM;AAC9E,MAAI,QAAQ,aAAa,GAAG;AAC1B,oBAAgB,gBAAgB,aAAa;AAAA,EAC/C;AACA,aAAW,OAAO,eAAe;AAC/B,UAAM,MAAM,cAAc,GAAG;AAC7B,QAAI;AACJ,QAAI,SAAS,GAAG,GAAG;AACjB,UAAI,aAAa,KAAK;AACpB,mBAAW;AAAA,UACT,IAAI,QAAQ;AAAA,UACZ,IAAI;AAAA,UACJ;AAAA,QAAA;AAAA,MAEJ,OAAO;AACL,mBAAW,OAAO,IAAI,QAAQ,GAAG;AAAA,MACnC;AAAA,IACF,OAAO;AACL,iBAAW,OAAO,GAAG;AAAA,IACvB;AACA,QAAI,MAAM,QAAQ,GAAG;AACnB,aAAO,eAAe,KAAK,KAAK;AAAA,QAC9B,YAAY;AAAA,QACZ,cAAc;AAAA,QACd,KAAK,MAAM,SAAS;AAAA,QACpB,KAAK,CAACT,OAAM,SAAS,QAAQA;AAAA,MAAA,CAC9B;AAAA,IACH,OAAO;AACL,UAAI,GAAG,IAAI;AAAA,IACb;AAAA,EAIF;AACF;AACA,SAASS,WAAS,MAAM,UAAU,MAAM;AACtC;AAAA,IACE,QAAQ,IAAI,IAAI,KAAK,IAAI,CAACG,OAAMA,GAAE,KAAK,SAAS,KAAK,CAAC,IAAI,KAAK,KAAK,SAAS,KAAK;AAAA,IAClF;AAAA,IACA;AAAA,EAAA;AAEJ;AACA,SAAS,cAAc,KAAK,KAAK,YAAY,KAAK;AAChD,MAAI,SAAS,IAAI,SAAS,GAAG,IAAI,iBAAiB,YAAY,GAAG,IAAI,MAAM,WAAW,GAAG;AACzF,MAAI,SAAS,GAAG,GAAG;AACjB,UAAM,UAAU,IAAI,GAAG;AACvB,QAAI,WAAW,OAAO,GAAG;AACvB;AACE,cAAM,QAAQ,OAAO;AAAA,MACvB;AAAA,IACF;AAAA,EAGF,WAAW,WAAW,GAAG,GAAG;AAC1B;AACE,YAAM,QAAQ,IAAI,KAAK,UAAU,CAAC;AAAA,IACpC;AAAA,EACF,WAAW,SAAS,GAAG,GAAG;AACxB,QAAI,QAAQ,GAAG,GAAG;AAChB,UAAI,QAAQ,CAAC,MAAM,cAAc,GAAG,KAAK,YAAY,GAAG,CAAC;AAAA,IAC3D,OAAO;AACL,YAAM,UAAU,WAAW,IAAI,OAAO,IAAI,IAAI,QAAQ,KAAK,UAAU,IAAI,IAAI,IAAI,OAAO;AACxF,UAAI,WAAW,OAAO,GAAG;AACvB,cAAM,QAAQ,SAAS,GAAG;AAAA,MAC5B;AAAA,IAGF;AAAA,EACF;AAGF;AACA,SAAS,qBAAqB,UAAU;AACtC,QAAM,OAAO,SAAS;AACtB,QAAM,EAAE,QAAQ,SAAS,eAAA,IAAmB;AAC5C,QAAM;AAAA,IACJ,QAAQ;AAAA,IACR,cAAc;AAAA,IACd,QAAQ,EAAE,sBAAA;AAAA,EAAsB,IAC9B,SAAS;AACb,QAAM,SAAS,MAAM,IAAI,IAAI;AAC7B,MAAI;AACJ,MAAI,QAAQ;AACV,eAAW;AAAA,EACb,WAAW,CAAC,aAAa,UAAU,CAAC,UAAU,CAAC,gBAAgB;AAC7D;AACE,iBAAW;AAAA,IACb;AAAA,EACF,OAAO;AACL,eAAW,CAAA;AACX,QAAI,aAAa,QAAQ;AACvB,mBAAa;AAAA,QACX,CAACC,OAAM,aAAa,UAAUA,IAAG,uBAAuB,IAAI;AAAA,MAAA;AAAA,IAEhE;AACA,iBAAa,UAAU,MAAM,qBAAqB;AAAA,EACpD;AACA,MAAI,SAAS,IAAI,GAAG;AAClB,UAAM,IAAI,MAAM,QAAQ;AAAA,EAC1B;AACA,SAAO;AACT;AACA,SAAS,aAAa,IAAI,MAAM,QAAQ,UAAU,OAAO;AACvD,QAAM,EAAE,QAAQ,SAAS,eAAA,IAAmB;AAC5C,MAAI,gBAAgB;AAClB,iBAAa,IAAI,gBAAgB,QAAQ,IAAI;AAAA,EAC/C;AACA,MAAI,QAAQ;AACV,WAAO;AAAA,MACL,CAACA,OAAM,aAAa,IAAIA,IAAG,QAAQ,IAAI;AAAA,IAAA;AAAA,EAE3C;AACA,aAAW,OAAO,MAAM;AACtB,QAAI,WAAW,QAAQ,SAAU;AAAA,SAI1B;AACL,YAAM,QAAQ,0BAA0B,GAAG,KAAK,UAAU,OAAO,GAAG;AACpE,SAAG,GAAG,IAAI,QAAQ,MAAM,GAAG,GAAG,GAAG,KAAK,GAAG,CAAC,IAAI,KAAK,GAAG;AAAA,IACxD;AAAA,EACF;AACA,SAAO;AACT;AACA,MAAM,4BAA4B;AAAA,EAChC,MAAM;AAAA,EACN,OAAO;AAAA,EACP,OAAO;AAAA;AAAA,EAEP,SAAS;AAAA,EACT,UAAU;AAAA;AAAA,EAEV,cAAc;AAAA,EACd,SAAS;AAAA,EACT,aAAa;AAAA,EACb,SAAS;AAAA,EACT,cAAc;AAAA,EACd,SAAS;AAAA,EACT,eAAe;AAAA,EACf,eAAe;AAAA,EACf,WAAW;AAAA,EACX,WAAW;AAAA,EACX,WAAW;AAAA,EACX,aAAa;AAAA,EACb,eAAe;AAAA,EACf,gBAAgB;AAAA;AAAA,EAEhB,YAAY;AAAA,EACZ,YAAY;AAAA;AAAA,EAEZ,OAAO;AAAA;AAAA,EAEP,SAAS;AAAA,EACT,QAAQ;AACV;AACA,SAAS,YAAY,IAAI,MAAM;AAC7B,MAAI,CAAC,MAAM;AACT,WAAO;AAAA,EACT;AACA,MAAI,CAAC,IAAI;AACP,WAAO;AAAA,EACT;AACA,SAAO,SAAS,eAAe;AAC7B,WAAQ;AAAA,MACN,WAAW,EAAE,IAAI,GAAG,KAAK,MAAM,IAAI,IAAI;AAAA,MACvC,WAAW,IAAI,IAAI,KAAK,KAAK,MAAM,IAAI,IAAI;AAAA,IAAA;AAAA,EAE/C;AACF;AACA,SAAS,YAAY,IAAI,MAAM;AAC7B,SAAO,mBAAmB,gBAAgB,EAAE,GAAG,gBAAgB,IAAI,CAAC;AACtE;AACA,SAAS,gBAAgB,KAAK;AAC5B,MAAI,QAAQ,GAAG,GAAG;AAChB,UAAM,MAAM,CAAA;AACZ,aAASpB,KAAI,GAAGA,KAAI,IAAI,QAAQA,MAAK;AACnC,UAAI,IAAIA,EAAC,CAAC,IAAI,IAAIA,EAAC;AAAA,IACrB;AACA,WAAO;AAAA,EACT;AACA,SAAO;AACT;AACA,SAAS,aAAa,IAAI,MAAM;AAC9B,SAAO,KAAK,CAAC,GAAG,IAAI,IAAI,CAAA,EAAG,OAAO,IAAI,IAAI,CAAC,CAAC,IAAI;AAClD;AACA,SAAS,mBAAmB,IAAI,MAAM;AACpC,SAAO,KAAK,OAAuB,uBAAO,OAAO,IAAI,GAAG,IAAI,IAAI,IAAI;AACtE;AACA,SAAS,yBAAyB,IAAI,MAAM;AAC1C,MAAI,IAAI;AACN,QAAI,QAAQ,EAAE,KAAK,QAAQ,IAAI,GAAG;AAChC,aAAO,CAAC,GAAmB,oBAAI,IAAI,CAAC,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC;AAAA,IACtD;AACA,WAAO;AAAA,MACW,uBAAO,OAAO,IAAI;AAAA,MAClC,sBAAsB,EAAE;AAAA,MACxB,sBAAsB,QAAQ,OAAO,OAAO,CAAA,CAAE;AAAA,IAAA;AAAA,EAElD,OAAO;AACL,WAAO;AAAA,EACT;AACF;AACA,SAAS,kBAAkB,IAAI,MAAM;AACnC,MAAI,CAAC,GAAI,QAAO;AAChB,MAAI,CAAC,KAAM,QAAO;AAClB,QAAM,SAAS,OAAuB,uBAAO,OAAO,IAAI,GAAG,EAAE;AAC7D,aAAW,OAAO,MAAM;AACtB,WAAO,GAAG,IAAI,aAAa,GAAG,GAAG,GAAG,KAAK,GAAG,CAAC;AAAA,EAC/C;AACA,SAAO;AACT;AAEA,SAAS,mBAAmB;AAC1B,SAAO;AAAA,IACL,KAAK;AAAA,IACL,QAAQ;AAAA,MACN,aAAa;AAAA,MACb,aAAa;AAAA,MACb,kBAAkB,CAAA;AAAA,MAClB,uBAAuB,CAAA;AAAA,MACvB,cAAc;AAAA,MACd,aAAa;AAAA,MACb,iBAAiB,CAAA;AAAA,IAAC;AAAA,IAEpB,QAAQ,CAAA;AAAA,IACR,YAAY,CAAA;AAAA,IACZ,YAAY,CAAA;AAAA,IACZ,UAA0B,uBAAO,OAAO,IAAI;AAAA,IAC5C,kCAAkC,QAAA;AAAA,IAClC,gCAAgC,QAAA;AAAA,IAChC,gCAAgC,QAAA;AAAA,EAAQ;AAE5C;AACA,IAAI,QAAQ;AACZ,SAAS,aAAa,QAAQ,SAAS;AACrC,SAAO,SAASqB,WAAU,eAAe,YAAY,MAAM;AACzD,QAAI,CAAC,WAAW,aAAa,GAAG;AAC9B,sBAAgB,OAAO,CAAA,GAAI,aAAa;AAAA,IAC1C;AACA,QAAI,aAAa,QAAQ,CAAC,SAAS,SAAS,GAAG;AAE7C,kBAAY;AAAA,IACd;AACA,UAAM,UAAU,iBAAA;AAChB,UAAM,uCAAuC,QAAA;AAC7C,UAAM,mBAAmB,CAAA;AACzB,QAAI,YAAY;AAChB,UAAMC,OAAM,QAAQ,MAAM;AAAA,MACxB,MAAM;AAAA,MACN,YAAY;AAAA,MACZ,QAAQ;AAAA,MACR,YAAY;AAAA,MACZ,UAAU;AAAA,MACV,WAAW;AAAA,MACX;AAAA,MACA,IAAI,SAAS;AACX,eAAO,QAAQ;AAAA,MACjB;AAAA,MACA,IAAI,OAAOf,IAAG;AAAA,MAMd;AAAA,MACA,IAAI,WAAW,SAAS;AACtB,YAAI,iBAAiB,IAAI,MAAM,EAAG;AAAA,iBAEvB,UAAU,WAAW,OAAO,OAAO,GAAG;AAC/C,2BAAiB,IAAI,MAAM;AAC3B,iBAAO,QAAQe,MAAK,GAAG,OAAO;AAAA,QAChC,WAAW,WAAW,MAAM,GAAG;AAC7B,2BAAiB,IAAI,MAAM;AAC3B,iBAAOA,MAAK,GAAG,OAAO;AAAA,QACxB;AAKA,eAAOA;AAAA,MACT;AAAA,MACA,MAAM,OAAO;AACc;AACvB,cAAI,CAAC,QAAQ,OAAO,SAAS,KAAK,GAAG;AACnC,oBAAQ,OAAO,KAAK,KAAK;AAAA,UAC3B;AAAA,QAKF;AAGA,eAAOA;AAAA,MACT;AAAA,MACA,UAAU,MAAM,WAAW;AAIzB,YAAI,CAAC,WAAW;AACd,iBAAO,QAAQ,WAAW,IAAI;AAAA,QAChC;AAIA,gBAAQ,WAAW,IAAI,IAAI;AAC3B,eAAOA;AAAA,MACT;AAAA,MACA,UAAU,MAAM,WAAW;AAIzB,YAAI,CAAC,WAAW;AACd,iBAAO,QAAQ,WAAW,IAAI;AAAA,QAChC;AAIA,gBAAQ,WAAW,IAAI,IAAI;AAC3B,eAAOA;AAAA,MACT;AAAA,MACA,MAAM,eAAe,WAAW,WAAW;AACzC,YAAI,CAAC,WAAW;AAOd,gBAAM,QAAQA,KAAI,YAAY,YAAY,eAAe,SAAS;AAClE,gBAAM,aAAa;AACnB,cAAI,cAAc,MAAM;AACtB,wBAAY;AAAA,UACd,WAAW,cAAc,OAAO;AAC9B,wBAAY;AAAA,UACd;AAUO;AACL,mBAAO,OAAO,eAAe,SAAS;AAAA,UACxC;AACA,sBAAY;AACZ,UAAAA,KAAI,aAAa;AACjB,wBAAc,cAAcA;AAK5B,iBAAO,2BAA2B,MAAM,SAAS;AAAA,QACnD;AAAA,MAMF;AAAA,MACA,UAAU,WAAW;AAMnB,yBAAiB,KAAK,SAAS;AAAA,MACjC;AAAA,MACA,UAAU;AACR,YAAI,WAAW;AACb;AAAA,YACE;AAAA,YACAA,KAAI;AAAA,YACJ;AAAA,UAAA;AAEF,iBAAO,MAAMA,KAAI,UAAU;AAK3B,iBAAOA,KAAI,WAAW;AAAA,QACxB;AAAA,MAGF;AAAA,MACA,QAAQ,KAAK,OAAO;AAYlB,gBAAQ,SAAS,GAAG,IAAI;AACxB,eAAOA;AAAA,MACT;AAAA,MACA,eAAe,IAAI;AACjB,cAAM,UAAU;AAChB,qBAAaA;AACb,YAAI;AACF,iBAAO,GAAA;AAAA,QACT,UAAA;AACE,uBAAa;AAAA,QACf;AAAA,MACF;AAAA,IAAA;AAEF,WAAOA;AAAA,EACT;AACF;AACA,IAAI,aAAa;AAiEjB,MAAM,oBAAoB,CAAC,OAAO,cAAc;AAC9C,SAAO,cAAc,gBAAgB,cAAc,gBAAgB,MAAM,iBAAiB,MAAM,GAAG,SAAS,WAAW,KAAK,MAAM,GAAG,SAAS,SAAS,CAAC,WAAW,KAAK,MAAM,GAAG,UAAU,SAAS,CAAC,WAAW;AAClN;AAEA,SAAS,KAAK,UAAU,UAAU,SAAS;AACzC,MAAI,SAAS,YAAa;AAC1B,QAAM,QAAQ,SAAS,MAAM,SAAS;AA0BtC,MAAI,OAAO;AACX,QAAMC,mBAAkB,MAAM,WAAW,SAAS;AAClD,QAAM,YAAYA,oBAAmB,kBAAkB,OAAO,MAAM,MAAM,CAAC,CAAC;AAC5E,MAAI,WAAW;AACb,QAAI,UAAU,MAAM;AAClB,aAAO,QAAQ,IAAI,CAACnB,OAAM,SAASA,EAAC,IAAIA,GAAE,KAAA,IAASA,EAAC;AAAA,IACtD;AACA,QAAI,UAAU,QAAQ;AACpB,aAAO,QAAQ,IAAI,aAAa;AAAA,IAClC;AAAA,EACF;AAiBA,MAAI;AACJ,MAAI,UAAU,MAAM,cAAc,aAAa,KAAK,CAAC;AAAA,EACrD,MAAM,cAAc,aAAa,SAAS,KAAK,CAAC,CAAC;AACjD,MAAI,CAAC,WAAWmB,kBAAiB;AAC/B,cAAU,MAAM,cAAc,aAAa,UAAU,KAAK,CAAC,CAAC;AAAA,EAC9D;AACA,MAAI,SAAS;AACX;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IAAA;AAAA,EAEJ;AACA,QAAM,cAAc,MAAM,cAAc,MAAM;AAC9C,MAAI,aAAa;AACf,QAAI,CAAC,SAAS,SAAS;AACrB,eAAS,UAAU,CAAA;AAAA,IACrB,WAAW,SAAS,QAAQ,WAAW,GAAG;AACxC;AAAA,IACF;AACA,aAAS,QAAQ,WAAW,IAAI;AAChC;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IAAA;AAAA,EAEJ;AACF;AACA,MAAM,sCAAsC,QAAA;AAC5C,SAAS,sBAAsB,MAAM,YAAY,UAAU,OAAO;AAChE,QAAM,QAA+B,UAAU,kBAAkB,WAAW;AAC5E,QAAM,SAAS,MAAM,IAAI,IAAI;AAC7B,MAAI,WAAW,QAAQ;AACrB,WAAO;AAAA,EACT;AACA,QAAM,MAAM,KAAK;AACjB,MAAI,aAAa,CAAA;AACjB,MAAI,aAAa;AACjB,MAA2B,CAAC,WAAW,IAAI,GAAG;AAC5C,UAAM,cAAc,CAAC,SAAS;AAC5B,YAAM,uBAAuB,sBAAsB,MAAM,YAAY,IAAI;AACzE,UAAI,sBAAsB;AACxB,qBAAa;AACb,eAAO,YAAY,oBAAoB;AAAA,MACzC;AAAA,IACF;AACA,QAAI,CAAC,WAAW,WAAW,OAAO,QAAQ;AACxC,iBAAW,OAAO,QAAQ,WAAW;AAAA,IACvC;AACA,QAAI,KAAK,SAAS;AAChB,kBAAY,KAAK,OAAO;AAAA,IAC1B;AACA,QAAI,KAAK,QAAQ;AACf,WAAK,OAAO,QAAQ,WAAW;AAAA,IACjC;AAAA,EACF;AACA,MAAI,CAAC,OAAO,CAAC,YAAY;AACvB,QAAI,SAAS,IAAI,GAAG;AAClB,YAAM,IAAI,MAAM,IAAI;AAAA,IACtB;AACA,WAAO;AAAA,EACT;AACA,MAAI,QAAQ,GAAG,GAAG;AAChB,QAAI,QAAQ,CAAC,QAAQ,WAAW,GAAG,IAAI,IAAI;AAAA,EAC7C,OAAO;AACL,WAAO,YAAY,GAAG;AAAA,EACxB;AACA,MAAI,SAAS,IAAI,GAAG;AAClB,UAAM,IAAI,MAAM,UAAU;AAAA,EAC5B;AACA,SAAO;AACT;AACA,SAAS,eAAe,SAAS,KAAK;AACpC,MAAI,CAAC,WAAW,CAAC,KAAK,GAAG,GAAG;AAC1B,WAAO;AAAA,EACT;AACA,QAAM,IAAI,MAAM,CAAC,EAAE,QAAQ,SAAS,EAAE;AACtC,SAAO,OAAO,SAAS,IAAI,CAAC,EAAE,YAAA,IAAgB,IAAI,MAAM,CAAC,CAAC,KAAK,OAAO,SAAS,UAAU,GAAG,CAAC,KAAK,OAAO,SAAS,GAAG;AACvH;AAGA,SAAS,oBAAoB;AAE7B;AACA,SAAS,oBAAoB,UAAU;AACrC,QAAM;AAAA,IACJ,MAAM;AAAA,IACN;AAAA,IACA;AAAA,IACA;AAAA,IACA,cAAc,CAAC,YAAY;AAAA,IAC3B;AAAA,IACA;AAAA,IACA,MAAAC;AAAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA,IACE;AACJ,QAAM,OAAO,4BAA4B,QAAQ;AACjD,MAAI;AACJ,MAAI;AAIJ,MAAI;AACF,QAAI,MAAM,YAAY,GAAG;AACvB,YAAM,aAAa,aAAa;AAChC,YAAM,YAAY,QAA0E,IAAI,MAAM,YAAY;AAAA,QAChH,IAAI,QAAQ,KAAK,UAAU;AACzB;AAAA,YACE,aAAa;AAAA,cACX;AAAA,YAAA,CACD;AAAA,UAAA;AAEH,iBAAO,QAAQ,IAAI,QAAQ,KAAK,QAAQ;AAAA,QAC1C;AAAA,MAAA,CACD,IAAI;AACL,eAAS;AAAA,QACP,OAAO;AAAA,UACL;AAAA,UACA;AAAA,UACA;AAAA,UACA,QAA4C,gBAAgB,KAAK,IAAI;AAAA,UACrE;AAAA,UACA;AAAA,UACA;AAAA,QAAA;AAAA,MACF;AAEF,yBAAmB;AAAA,IACrB,OAAO;AACL,YAAM,UAAU;AAChB,UAAI,MAA8D;AAGlE,eAAS;AAAA,QACP,QAAQ,SAAS,IAAI;AAAA,UACnB,QAA4C,gBAAgB,KAAK,IAAI;AAAA,UACrE,QAA4C;AAAA,YAC1C,IAAI,QAAQ;AACV,gCAAA;AACA,qBAAO,gBAAgB,KAAK;AAAA,YAC9B;AAAA,YACA;AAAA,YACA,MAAAA;AAAAA,UAAA,IACE,EAAE,OAAO,OAAO,MAAAA,MAAAA;AAAAA,QAAK,IACvB;AAAA,UACF,QAA4C,gBAAgB,KAAK,IAAI;AAAA,UACrE;AAAA,QAAA;AAAA,MACF;AAEF,yBAAmB,UAAU,QAAQ,QAAQ,yBAAyB,KAAK;AAAA,IAC7E;AAAA,EACF,SAAS,KAAK;AACZ,eAAW,SAAS;AACpB,gBAAY,KAAK,UAAU,CAAC;AAC5B,aAAS,YAAY,OAAO;AAAA,EAC9B;AACA,MAAI,OAAO;AAKX,MAAI,oBAAoB,iBAAiB,OAAO;AAC9C,UAAM,OAAO,OAAO,KAAK,gBAAgB;AACzC,UAAM,EAAE,cAAc;AACtB,QAAI,KAAK,QAAQ;AACf,UAAI,aAAa,IAAI,IAAI;AACvB,YAAI,gBAAgB,KAAK,KAAK,eAAe,GAAG;AAC9C,6BAAmB;AAAA,YACjB;AAAA,YACA;AAAA,UAAA;AAAA,QAEJ;AACA,eAAO,WAAW,MAAM,kBAAkB,OAAO,IAAI;AAAA,MACvD;AAAA,IAyBF;AAAA,EACF;AACA,MAAI,MAAM,MAAM;AAMd,WAAO,WAAW,MAAM,MAAM,OAAO,IAAI;AACzC,SAAK,OAAO,KAAK,OAAO,KAAK,KAAK,OAAO,MAAM,IAAI,IAAI,MAAM;AAAA,EAC/D;AACA,MAAI,MAAM,YAAY;AAMpB,uBAAmB,MAAM,MAAM,UAAU;AAAA,EAC3C;AAGO;AACL,aAAS;AAAA,EACX;AACA,8BAA4B,IAAI;AAChC,SAAO;AACT;AA6CA,MAAM,2BAA2B,CAAC,UAAU;AAC1C,MAAI;AACJ,aAAW,OAAO,OAAO;AACvB,QAAI,QAAQ,WAAW,QAAQ,WAAW,KAAK,GAAG,GAAG;AACnD,OAAC,QAAQ,MAAM,CAAA,IAAK,GAAG,IAAI,MAAM,GAAG;AAAA,IACtC;AAAA,EACF;AACA,SAAO;AACT;AACA,MAAM,uBAAuB,CAAC,OAAO,UAAU;AAC7C,QAAM,MAAM,CAAA;AACZ,aAAW,OAAO,OAAO;AACvB,QAAI,CAAC,gBAAgB,GAAG,KAAK,EAAE,IAAI,MAAM,CAAC,KAAK,QAAQ;AACrD,UAAI,GAAG,IAAI,MAAM,GAAG;AAAA,IACtB;AAAA,EACF;AACA,SAAO;AACT;AAIA,SAAS,sBAAsB,WAAW,WAAW,WAAW;AAC9D,QAAM,EAAE,OAAO,WAAW,UAAU,cAAc,cAAc;AAChE,QAAM,EAAE,OAAO,WAAW,UAAU,cAAc,cAAc;AAChE,QAAM,QAAQ,UAAU;AAIxB,MAAI,UAAU,QAAQ,UAAU,YAAY;AAC1C,WAAO;AAAA,EACT;AACA,MAAI,aAAa,aAAa,GAAG;AAC/B,QAAI,YAAY,MAAM;AACpB,aAAO;AAAA,IACT;AACA,QAAI,YAAY,IAAI;AAClB,UAAI,CAAC,WAAW;AACd,eAAO,CAAC,CAAC;AAAA,MACX;AACA,aAAO,gBAAgB,WAAW,WAAW,KAAK;AAAA,IACpD,WAAW,YAAY,GAAG;AACxB,YAAM,eAAe,UAAU;AAC/B,eAASxB,KAAI,GAAGA,KAAI,aAAa,QAAQA,MAAK;AAC5C,cAAM,MAAM,aAAaA,EAAC;AAC1B,YAAI,UAAU,GAAG,MAAM,UAAU,GAAG,KAAK,CAAC,eAAe,OAAO,GAAG,GAAG;AACpE,iBAAO;AAAA,QACT;AAAA,MACF;AAAA,IACF;AAAA,EACF,OAAO;AACL,QAAI,gBAAgB,cAAc;AAChC,UAAI,CAAC,gBAAgB,CAAC,aAAa,SAAS;AAC1C,eAAO;AAAA,MACT;AAAA,IACF;AACA,QAAI,cAAc,WAAW;AAC3B,aAAO;AAAA,IACT;AACA,QAAI,CAAC,WAAW;AACd,aAAO,CAAC,CAAC;AAAA,IACX;AACA,QAAI,CAAC,WAAW;AACd,aAAO;AAAA,IACT;AACA,WAAO,gBAAgB,WAAW,WAAW,KAAK;AAAA,EACpD;AACA,SAAO;AACT;AACA,SAAS,gBAAgB,WAAW,WAAW,cAAc;AAC3D,QAAM,WAAW,OAAO,KAAK,SAAS;AACtC,MAAI,SAAS,WAAW,OAAO,KAAK,SAAS,EAAE,QAAQ;AACrD,WAAO;AAAA,EACT;AACA,WAASA,KAAI,GAAGA,KAAI,SAAS,QAAQA,MAAK;AACxC,UAAM,MAAM,SAASA,EAAC;AACtB,QAAI,UAAU,GAAG,MAAM,UAAU,GAAG,KAAK,CAAC,eAAe,cAAc,GAAG,GAAG;AAC3E,aAAO;AAAA,IACT;AAAA,EACF;AACA,SAAO;AACT;AACA,SAAS,gBAAgB,EAAE,OAAO,OAAA,GAAU,IAAI;AAC9C,SAAO,QAAQ;AACb,UAAM,OAAO,OAAO;AACpB,QAAI,KAAK,YAAY,KAAK,SAAS,iBAAiB,OAAO;AACzD,WAAK,KAAK,MAAM;AAAA,IAClB;AACA,QAAI,SAAS,OAAO;AAClB,OAAC,QAAQ,OAAO,OAAO,KAAK;AAC5B,eAAS,OAAO;AAAA,IAClB,OAAO;AACL;AAAA,IACF;AAAA,EACF;AACF;AAEA,MAAM,sBAAsB,CAAA;AAC5B,MAAM,uBAAuB,MAAM,OAAO,OAAO,mBAAmB;AACpE,MAAM,mBAAmB,CAAC,QAAQ,OAAO,eAAe,GAAG,MAAM;AAEjE,SAAS,UAAU,UAAU,UAAU,YAAY,QAAQ,OAAO;AAChE,QAAM,QAAQ,CAAA;AACd,QAAM,QAAQ,qBAAA;AACd,WAAS,gBAAgC,uBAAO,OAAO,IAAI;AAC3D,eAAa,UAAU,UAAU,OAAO,KAAK;AAC7C,aAAW,OAAO,SAAS,aAAa,CAAC,GAAG;AAC1C,QAAI,EAAE,OAAO,QAAQ;AACnB,YAAM,GAAG,IAAI;AAAA,IACf;AAAA,EACF;AAIA,MAAI,YAAY;AACd,aAAS,QAAQ,QAAQ,QAAQ,gBAAgB,KAAK;AAAA,EACxD,OAAO;AACL,QAAI,CAAC,SAAS,KAAK,OAAO;AACxB,eAAS,QAAQ;AAAA,IACnB,OAAO;AACL,eAAS,QAAQ;AAAA,IACnB;AAAA,EACF;AACA,WAAS,QAAQ;AACnB;AAOA,SAAS,YAAY,UAAU,UAAU,cAAc,WAAW;AAChE,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA,OAAO,EAAE,UAAA;AAAA,EAAU,IACjB;AACJ,QAAM,kBAAkB,MAAM,KAAK;AACnC,QAAM,CAAC,OAAO,IAAI,SAAS;AAC3B,MAAI,kBAAkB;AACtB;AAAA;AAAA;AAAA;AAAA,KAI+E,aAAa,YAAY,MAAM,EAAE,YAAY;AAAA,IAC1H;AACA,QAAI,YAAY,GAAG;AACjB,YAAM,gBAAgB,SAAS,MAAM;AACrC,eAASA,KAAI,GAAGA,KAAI,cAAc,QAAQA,MAAK;AAC7C,YAAI,MAAM,cAAcA,EAAC;AACzB,YAAI,eAAe,SAAS,cAAc,GAAG,GAAG;AAC9C;AAAA,QACF;AACA,cAAM,QAAQ,SAAS,GAAG;AAC1B,YAAI,SAAS;AACX,cAAI,OAAO,OAAO,GAAG,GAAG;AACtB,gBAAI,UAAU,MAAM,GAAG,GAAG;AACxB,oBAAM,GAAG,IAAI;AACb,gCAAkB;AAAA,YACpB;AAAA,UACF,OAAO;AACL,kBAAM,eAAe,SAAS,GAAG;AACjC,kBAAM,YAAY,IAAI;AAAA,cACpB;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,YAAA;AAAA,UAEJ;AAAA,QACF,OAAO;AACL,cAAI,UAAU,MAAM,GAAG,GAAG;AACxB,kBAAM,GAAG,IAAI;AACb,8BAAkB;AAAA,UACpB;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF,OAAO;AACL,QAAI,aAAa,UAAU,UAAU,OAAO,KAAK,GAAG;AAClD,wBAAkB;AAAA,IACpB;AACA,QAAI;AACJ,eAAW,OAAO,iBAAiB;AACjC,UAAI,CAAC;AAAA,MACL,CAAC,OAAO,UAAU,GAAG;AAAA;AAAA,QAEnB,WAAW,UAAU,GAAG,OAAO,OAAO,CAAC,OAAO,UAAU,QAAQ,IAAI;AACpE,YAAI,SAAS;AACX,cAAI;AAAA,WACH,aAAa,GAAG,MAAM;AAAA,UACvB,aAAa,QAAQ,MAAM,SAAS;AAClC,kBAAM,GAAG,IAAI;AAAA,cACX;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,YAAA;AAAA,UAEJ;AAAA,QACF,OAAO;AACL,iBAAO,MAAM,GAAG;AAAA,QAClB;AAAA,MACF;AAAA,IACF;AACA,QAAI,UAAU,iBAAiB;AAC7B,iBAAW,OAAO,OAAO;AACvB,YAAI,CAAC,YAAY,CAAC,OAAO,UAAU,GAAG,KAAK,MAAM;AAC/C,iBAAO,MAAM,GAAG;AAChB,4BAAkB;AAAA,QACpB;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACA,MAAI,iBAAiB;AACnB,YAAQ,SAAS,OAAO,OAAO,EAAE;AAAA,EACnC;AAIF;AACA,SAAS,aAAa,UAAU,UAAU,OAAO,OAAO;AACtD,QAAM,CAAC,SAAS,YAAY,IAAI,SAAS;AACzC,MAAI,kBAAkB;AACtB,MAAI;AACJ,MAAI,UAAU;AACZ,aAAS,OAAO,UAAU;AACxB,UAAI,eAAe,GAAG,GAAG;AACvB;AAAA,MACF;AACA,YAAM,QAAQ,SAAS,GAAG;AAC1B,UAAI;AACJ,UAAI,WAAW,OAAO,SAAS,WAAW,SAAS,GAAG,CAAC,GAAG;AACxD,YAAI,CAAC,gBAAgB,CAAC,aAAa,SAAS,QAAQ,GAAG;AACrD,gBAAM,QAAQ,IAAI;AAAA,QACpB,OAAO;AACL,WAAC,kBAAkB,gBAAgB,CAAA,IAAK,QAAQ,IAAI;AAAA,QACtD;AAAA,MACF,WAAW,CAAC,eAAe,SAAS,cAAc,GAAG,GAAG;AACtD,YAAI,EAAE,OAAO,UAAU,UAAU,MAAM,GAAG,GAAG;AAC3C,gBAAM,GAAG,IAAI;AACb,4BAAkB;AAAA,QACpB;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACA,MAAI,cAAc;AAChB,UAAM,kBAAkB,MAAM,KAAK;AACnC,UAAM,aAAa,iBAAiB;AACpC,aAASA,KAAI,GAAGA,KAAI,aAAa,QAAQA,MAAK;AAC5C,YAAM,MAAM,aAAaA,EAAC;AAC1B,YAAM,GAAG,IAAI;AAAA,QACX;AAAA,QACA;AAAA,QACA;AAAA,QACA,WAAW,GAAG;AAAA,QACd;AAAA,QACA,CAAC,OAAO,YAAY,GAAG;AAAA,MAAA;AAAA,IAE3B;AAAA,EACF;AACA,SAAO;AACT;AACA,SAAS,iBAAiB,SAAS,OAAO,KAAK,OAAO,UAAU,UAAU;AACxE,QAAM,MAAM,QAAQ,GAAG;AACvB,MAAI,OAAO,MAAM;AACf,UAAM,aAAa,OAAO,KAAK,SAAS;AACxC,QAAI,cAAc,UAAU,QAAQ;AAClC,YAAM,eAAe,IAAI;AACzB,UAAI,IAAI,SAAS,YAAY,CAAC,IAAI,eAAe,WAAW,YAAY,GAAG;AACzE,cAAM,EAAE,kBAAkB;AAC1B,YAAI,OAAO,eAAe;AACxB,kBAAQ,cAAc,GAAG;AAAA,QAC3B,OAAO;AACL,gBAAM,QAAQ,mBAAmB,QAAQ;AACzC,kBAAQ,cAAc,GAAG,IAAI,aAAa;AAAA,YACxC;AAAA,YACA;AAAA,UAAA;AAEF,gBAAA;AAAA,QACF;AAAA,MACF,OAAO;AACL,gBAAQ;AAAA,MACV;AACA,UAAI,SAAS,IAAI;AACf,iBAAS,GAAG,SAAS,KAAK,KAAK;AAAA,MACjC;AAAA,IACF;AACA,QAAI;AAAA,MAAI;AAAA;AAAA,IAAA,GAAqB;AAC3B,UAAI,YAAY,CAAC,YAAY;AAC3B,gBAAQ;AAAA,MACV,WAAW;AAAA,QAAI;AAAA;AAAA,MAAA,MAA4B,UAAU,MAAM,UAAU,UAAU,GAAG,IAAI;AACpF,gBAAQ;AAAA,MACV;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;AACA,MAAM,sCAAsC,QAAA;AAC5C,SAAS,sBAAsB,MAAM,YAAY,UAAU,OAAO;AAChE,QAAM,QAA+B,UAAU,kBAAkB,WAAW;AAC5E,QAAM,SAAS,MAAM,IAAI,IAAI;AAC7B,MAAI,QAAQ;AACV,WAAO;AAAA,EACT;AACA,QAAM,MAAM,KAAK;AACjB,QAAM,aAAa,CAAA;AACnB,QAAM,eAAe,CAAA;AACrB,MAAI,aAAa;AACjB,MAA2B,CAAC,WAAW,IAAI,GAAG;AAC5C,UAAM,cAAc,CAAC,SAAS;AAC5B,mBAAa;AACb,YAAM,CAAC,OAAO,IAAI,IAAI,sBAAsB,MAAM,YAAY,IAAI;AAClE,aAAO,YAAY,KAAK;AACxB,UAAI,KAAM,cAAa,KAAK,GAAG,IAAI;AAAA,IACrC;AACA,QAAI,CAAC,WAAW,WAAW,OAAO,QAAQ;AACxC,iBAAW,OAAO,QAAQ,WAAW;AAAA,IACvC;AACA,QAAI,KAAK,SAAS;AAChB,kBAAY,KAAK,OAAO;AAAA,IAC1B;AACA,QAAI,KAAK,QAAQ;AACf,WAAK,OAAO,QAAQ,WAAW;AAAA,IACjC;AAAA,EACF;AACA,MAAI,CAAC,OAAO,CAAC,YAAY;AACvB,QAAI,SAAS,IAAI,GAAG;AAClB,YAAM,IAAI,MAAM,SAAS;AAAA,IAC3B;AACA,WAAO;AAAA,EACT;AACA,MAAI,QAAQ,GAAG,GAAG;AAChB,aAASA,KAAI,GAAGA,KAAI,IAAI,QAAQA,MAAK;AAInC,YAAM,gBAAgB,SAAS,IAAIA,EAAC,CAAC;AACrC,UAAI,iBAAiB,aAAa,GAAG;AACnC,mBAAW,aAAa,IAAI;AAAA,MAC9B;AAAA,IACF;AAAA,EACF,WAAW,KAAK;AAId,eAAW,OAAO,KAAK;AACrB,YAAM,gBAAgB,SAAS,GAAG;AAClC,UAAI,iBAAiB,aAAa,GAAG;AACnC,cAAM,MAAM,IAAI,GAAG;AACnB,cAAM,OAAO,WAAW,aAAa,IAAI,QAAQ,GAAG,KAAK,WAAW,GAAG,IAAI,EAAE,MAAM,IAAA,IAAQ,OAAO,CAAA,GAAI,GAAG;AACzG,cAAM,WAAW,KAAK;AACtB,YAAI,aAAa;AACjB,YAAI,iBAAiB;AACrB,YAAI,QAAQ,QAAQ,GAAG;AACrB,mBAAS,QAAQ,GAAG,QAAQ,SAAS,QAAQ,EAAE,OAAO;AACpD,kBAAM,OAAO,SAAS,KAAK;AAC3B,kBAAM,WAAW,WAAW,IAAI,KAAK,KAAK;AAC1C,gBAAI,aAAa,WAAW;AAC1B,2BAAa;AACb;AAAA,YACF,WAAW,aAAa,UAAU;AAChC,+BAAiB;AAAA,YACnB;AAAA,UACF;AAAA,QACF,OAAO;AACL,uBAAa,WAAW,QAAQ,KAAK,SAAS,SAAS;AAAA,QACzD;AACA;AAAA,UAAK;AAAA;AAAA,QAAA,IAAsB;AAC3B;AAAA,UAAK;AAAA;AAAA,QAAA,IAA0B;AAC/B,YAAI,cAAc,OAAO,MAAM,SAAS,GAAG;AACzC,uBAAa,KAAK,aAAa;AAAA,QACjC;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACA,QAAM,MAAM,CAAC,YAAY,YAAY;AACrC,MAAI,SAAS,IAAI,GAAG;AAClB,UAAM,IAAI,MAAM,GAAG;AAAA,EACrB;AACA,SAAO;AACT;AACA,SAAS,iBAAiB,KAAK;AAC7B,MAAI,IAAI,CAAC,MAAM,OAAO,CAAC,eAAe,GAAG,GAAG;AAC1C,WAAO;AAAA,EACT;AAGA,SAAO;AACT;AAqHA,MAAM,gBAAgB,CAAC,QAAQ,QAAQ,OAAO,QAAQ,UAAU,QAAQ;AACxE,MAAM,qBAAqB,CAAC,UAAU,QAAQ,KAAK,IAAI,MAAM,IAAI,cAAc,IAAI,CAAC,eAAe,KAAK,CAAC;AACzG,MAAM,gBAAgB,CAAC,KAAK,SAAS,QAAQ;AAC3C,MAAI,QAAQ,IAAI;AACd,WAAO;AAAA,EACT;AACA,QAAM,aAAa,QAAQ,IAAI,SAAS;AACtC,QAAI,MAA4J;AAKhK,WAAO,mBAAmB,QAAQ,GAAG,IAAI,CAAC;AAAA,EAC5C,GAAG,GAAG;AACN,aAAW,KAAK;AAChB,SAAO;AACT;AACA,MAAM,uBAAuB,CAAC,UAAU,OAAO,aAAa;AAC1D,QAAM,MAAM,SAAS;AACrB,aAAW,OAAO,UAAU;AAC1B,QAAI,cAAc,GAAG,EAAG;AACxB,UAAM,QAAQ,SAAS,GAAG;AAC1B,QAAI,WAAW,KAAK,GAAG;AACrB,YAAM,GAAG,IAAI,cAAc,KAAK,OAAO,GAAG;AAAA,IAC5C,WAAW,SAAS,MAAM;AAMxB,YAAM,aAAa,mBAAmB,KAAK;AAC3C,YAAM,GAAG,IAAI,MAAM;AAAA,IACrB;AAAA,EACF;AACF;AACA,MAAM,sBAAsB,CAAC,UAAU,aAAa;AAMlD,QAAM,aAAa,mBAAmB,QAAQ;AAC9C,WAAS,MAAM,UAAU,MAAM;AACjC;AACA,MAAM,cAAc,CAAC,OAAO,UAAU,cAAc;AAClD,aAAW,OAAO,UAAU;AAC1B,QAAI,aAAa,CAAC,cAAc,GAAG,GAAG;AACpC,YAAM,GAAG,IAAI,SAAS,GAAG;AAAA,IAC3B;AAAA,EACF;AACF;AACA,MAAM,YAAY,CAAC,UAAU,UAAU,cAAc;AACnD,QAAM,QAAQ,SAAS,QAAQ,qBAAA;AAC/B,MAAI,SAAS,MAAM,YAAY,IAAI;AACjC,UAAM,OAAO,SAAS;AACtB,QAAI,MAAM;AACR,kBAAY,OAAO,UAAU,SAAS;AACtC,UAAI,WAAW;AACb,YAAI,OAAO,KAAK,MAAM,IAAI;AAAA,MAC5B;AAAA,IACF,OAAO;AACL,2BAAqB,UAAU,KAAK;AAAA,IACtC;AAAA,EACF,WAAW,UAAU;AACnB,wBAAoB,UAAU,QAAQ;AAAA,EACxC;AACF;AACA,MAAM,cAAc,CAAC,UAAU,UAAU,cAAc;AACrD,QAAM,EAAE,OAAO,MAAA,IAAU;AACzB,MAAI,oBAAoB;AACxB,MAAI,2BAA2B;AAC/B,MAAI,MAAM,YAAY,IAAI;AACxB,UAAM,OAAO,SAAS;AACtB,QAAI,MAAM;AAIR,UAAW,aAAa,SAAS,GAAG;AAClC,4BAAoB;AAAA,MACtB,OAAO;AACL,oBAAY,OAAO,UAAU,SAAS;AAAA,MACxC;AAAA,IACF,OAAO;AACL,0BAAoB,CAAC,SAAS;AAC9B,2BAAqB,UAAU,KAAK;AAAA,IACtC;AACA,+BAA2B;AAAA,EAC7B,WAAW,UAAU;AACnB,wBAAoB,UAAU,QAAQ;AACtC,+BAA2B,EAAE,SAAS,EAAA;AAAA,EACxC;AACA,MAAI,mBAAmB;AACrB,eAAW,OAAO,OAAO;AACvB,UAAI,CAAC,cAAc,GAAG,KAAK,yBAAyB,GAAG,KAAK,MAAM;AAChE,eAAO,MAAM,GAAG;AAAA,MAClB;AAAA,IACF;AAAA,EACF;AACF;AAgEA,MAAM,wBAAwB;AAC9B,SAAS,eAAe,SAAS;AAC/B,SAAO,mBAAmB,OAAO;AACnC;AAIA,SAAS,mBAAmB,SAAS,oBAAoB;AAIvD,QAAM,SAAS,cAAA;AACf,SAAO,UAAU;AAIjB,QAAM;AAAA,IACJ,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,WAAW;AAAA,IACX,eAAe;AAAA,IACf,YAAY;AAAA,IACZ,eAAe;AAAA,IACf,SAAS;AAAA,IACT,gBAAgB;AAAA,IAChB,YAAY;AAAA,IACZ,aAAa;AAAA,IACb,YAAY,iBAAiB;AAAA,IAC7B,qBAAqB;AAAA,EAAA,IACnB;AACJ,QAAM,QAAQ,CAAC,IAAI,IAAI,WAAW,SAAS,MAAM,kBAAkB,MAAM,iBAAiB,MAAM,YAAY,QAAQ,eAAe,MAAM,YAAiF,CAAC,CAAC,GAAG,oBAAoB;AACjP,QAAI,OAAO,IAAI;AACb;AAAA,IACF;AACA,QAAI,MAAM,CAAC,gBAAgB,IAAI,EAAE,GAAG;AAClC,eAAS,gBAAgB,EAAE;AAC3B,cAAQ,IAAI,iBAAiB,gBAAgB,IAAI;AACjD,WAAK;AAAA,IACP;AACA,QAAI,GAAG,cAAc,IAAI;AACvB,kBAAY;AACZ,SAAG,kBAAkB;AAAA,IACvB;AACA,UAAM,EAAE,MAAM,KAAAkB,MAAK,cAAc;AACjC,YAAQ,MAAA;AAAA,MACN,KAAK;AACH,oBAAY,IAAI,IAAI,WAAW,MAAM;AACrC;AAAA,MACF,KAAK;AACH,2BAAmB,IAAI,IAAI,WAAW,MAAM;AAC5C;AAAA,MACF,KAAK;AACH,YAAI,MAAM,MAAM;AACd,0BAAgB,IAAI,WAAW,QAAQ,SAAS;AAAA,QAClD;AAGA;AAAA,MACF,KAAK;AACH;AAAA,UACE;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QAAA;AAEF;AAAA,MACF;AACE,YAAI,YAAY,GAAG;AACjB;AAAA,YACE;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UAAA;AAAA,QAEJ,WAAW,YAAY,GAAG;AACxB;AAAA,YACE;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UAAA;AAAA,QAEJ,WAAW,YAAY,IAAI;AACzB,eAAK;AAAA,YACH;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UAAA;AAAA,QAEJ,WAAW,YAAY,KAAK;AAC1B,eAAK;AAAA,YACH;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UAAA;AAAA,QAEJ;IAEA;AAEJ,QAAIA,QAAO,QAAQ,iBAAiB;AAClC,aAAOA,MAAK,MAAM,GAAG,KAAK,gBAAgB,MAAM,IAAI,CAAC,EAAE;AAAA,IACzD,WAAWA,QAAO,QAAQ,MAAM,GAAG,OAAO,MAAM;AAC9C,aAAO,GAAG,KAAK,MAAM,gBAAgB,IAAI,IAAI;AAAA,IAC/C;AAAA,EACF;AACA,QAAM,cAAc,CAAC,IAAI,IAAI,WAAW,WAAW;AACjD,QAAI,MAAM,MAAM;AACd;AAAA,QACE,GAAG,KAAK,eAAe,GAAG,QAAQ;AAAA,QAClC;AAAA,QACA;AAAA,MAAA;AAAA,IAEJ,OAAO;AACL,YAAM,KAAK,GAAG,KAAK,GAAG;AACtB,UAAI,GAAG,aAAa,GAAG,UAAU;AAOxB;AACL,sBAAY,IAAI,GAAG,QAAQ;AAAA,QAC7B;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACA,QAAM,qBAAqB,CAAC,IAAI,IAAI,WAAW,WAAW;AACxD,QAAI,MAAM,MAAM;AACd;AAAA,QACE,GAAG,KAAK,kBAAkB,GAAG,YAAY,EAAE;AAAA,QAC3C;AAAA,QACA;AAAA,MAAA;AAAA,IAEJ,OAAO;AACL,SAAG,KAAK,GAAG;AAAA,IACb;AAAA,EACF;AACA,QAAM,kBAAkB,CAAC,IAAI,WAAW,QAAQ,cAAc;AAC5D,KAAC,GAAG,IAAI,GAAG,MAAM,IAAI;AAAA,MACnB,GAAG;AAAA,MACH;AAAA,MACA;AAAA,MACA;AAAA,MACA,GAAG;AAAA,MACH,GAAG;AAAA,IAAA;AAAA,EAEP;AAgBA,QAAM,iBAAiB,CAAC,EAAE,IAAI,OAAA,GAAU,WAAW,gBAAgB;AACjE,QAAI;AACJ,WAAO,MAAM,OAAO,QAAQ;AAC1B,aAAO,gBAAgB,EAAE;AACzB,iBAAW,IAAI,WAAW,WAAW;AACrC,WAAK;AAAA,IACP;AACA,eAAW,QAAQ,WAAW,WAAW;AAAA,EAC3C;AACA,QAAM,mBAAmB,CAAC,EAAE,IAAI,aAAa;AAC3C,QAAI;AACJ,WAAO,MAAM,OAAO,QAAQ;AAC1B,aAAO,gBAAgB,EAAE;AACzB,iBAAW,EAAE;AACb,WAAK;AAAA,IACP;AACA,eAAW,MAAM;AAAA,EACnB;AACA,QAAM,iBAAiB,CAAC,IAAI,IAAI,WAAW,QAAQ,iBAAiB,gBAAgB,WAAW,cAAc,cAAc;AACzH,QAAI,GAAG,SAAS,OAAO;AACrB,kBAAY;AAAA,IACd,WAAW,GAAG,SAAS,QAAQ;AAC7B,kBAAY;AAAA,IACd;AACA,QAAI,MAAM,MAAM;AACd;AAAA,QACE;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MAAA;AAAA,IAEJ,OAAO;AACL,YAAM,gBAAgB,CAAC,EAAE,GAAG,MAAM,GAAG,GAAG,YAAY,GAAG,KAAK;AAC5D,UAAI;AACF,YAAI,eAAe;AACjB,wBAAc,YAAA;AAAA,QAChB;AACA;AAAA,UACE;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QAAA;AAAA,MAEJ,UAAA;AACE,YAAI,eAAe;AACjB,wBAAc,UAAA;AAAA,QAChB;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACA,QAAM,eAAe,CAAC,OAAO,WAAW,QAAQ,iBAAiB,gBAAgB,WAAW,cAAc,cAAc;AACtH,QAAI;AACJ,QAAI;AACJ,UAAM,EAAE,OAAO,WAAW,YAAY,SAAS;AAC/C,SAAK,MAAM,KAAK;AAAA,MACd,MAAM;AAAA,MACN;AAAA,MACA,SAAS,MAAM;AAAA,MACf;AAAA,IAAA;AAEF,QAAI,YAAY,GAAG;AACjB,yBAAmB,IAAI,MAAM,QAAQ;AAAA,IACvC,WAAW,YAAY,IAAI;AACzB;AAAA,QACE,MAAM;AAAA,QACN;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,yBAAyB,OAAO,SAAS;AAAA,QACzC;AAAA,QACA;AAAA,MAAA;AAAA,IAEJ;AACA,QAAI,MAAM;AACR,0BAAoB,OAAO,MAAM,iBAAiB,SAAS;AAAA,IAC7D;AACA,eAAW,IAAI,OAAO,MAAM,SAAS,cAAc,eAAe;AAClE,QAAI,OAAO;AACT,iBAAW,OAAO,OAAO;AACvB,YAAI,QAAQ,WAAW,CAAC,eAAe,GAAG,GAAG;AAC3C,wBAAc,IAAI,KAAK,MAAM,MAAM,GAAG,GAAG,WAAW,eAAe;AAAA,QACrE;AAAA,MACF;AACA,UAAI,WAAW,OAAO;AACpB,sBAAc,IAAI,SAAS,MAAM,MAAM,OAAO,SAAS;AAAA,MACzD;AACA,UAAI,YAAY,MAAM,oBAAoB;AACxC,wBAAgB,WAAW,iBAAiB,KAAK;AAAA,MACnD;AAAA,IACF;AAKA,QAAI,MAAM;AACR,0BAAoB,OAAO,MAAM,iBAAiB,aAAa;AAAA,IACjE;AACA,UAAM,0BAA0B,eAAe,gBAAgB,UAAU;AACzE,QAAI,yBAAyB;AAC3B,iBAAW,YAAY,EAAE;AAAA,IAC3B;AACA,eAAW,IAAI,WAAW,MAAM;AAChC,SAAK,YAAY,SAAS,MAAM,mBAAmB,2BAA2B,MAAM;AAClF,4BAAsB,MAAM;AAC1B,qBAAa,gBAAgB,WAAW,iBAAiB,KAAK;AAC9D,mCAA2B,WAAW,MAAM,EAAE;AAC9C,gBAAQ,oBAAoB,OAAO,MAAM,iBAAiB,SAAS;AAAA,MACrE,GAAG,cAAc;AAAA,IACnB;AAAA,EACF;AACA,QAAM,aAAa,CAAC,IAAI,OAAO,SAAS,cAAc,oBAAoB;AACxE,QAAI,SAAS;AACX,qBAAe,IAAI,OAAO;AAAA,IAC5B;AACA,QAAI,cAAc;AAChB,eAASlB,KAAI,GAAGA,KAAI,aAAa,QAAQA,MAAK;AAC5C,uBAAe,IAAI,aAAaA,EAAC,CAAC;AAAA,MACpC;AAAA,IACF;AACA,QAAI,iBAAiB;AACnB,UAAI,UAAU,gBAAgB;AAI9B,UAAI,UAAU,WAAW,WAAW,QAAQ,IAAI,MAAM,QAAQ,cAAc,SAAS,QAAQ,eAAe,QAAQ;AAClH,cAAM,cAAc,gBAAgB;AACpC;AAAA,UACE;AAAA,UACA;AAAA,UACA,YAAY;AAAA,UACZ,YAAY;AAAA,UACZ,gBAAgB;AAAA,QAAA;AAAA,MAEpB;AAAA,IACF;AAAA,EACF;AACA,QAAM,gBAAgB,CAAC,UAAU,WAAW,QAAQ,iBAAiB,gBAAgB,WAAW,cAAc,WAAW,QAAQ,MAAM;AACrI,aAASA,KAAI,OAAOA,KAAI,SAAS,QAAQA,MAAK;AAC5C,YAAM,QAAQ,SAASA,EAAC,IAAI,YAAY,eAAe,SAASA,EAAC,CAAC,IAAI,eAAe,SAASA,EAAC,CAAC;AAChG;AAAA,QACE;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MAAA;AAAA,IAEJ;AAAA,EACF;AACA,QAAM,eAAe,CAAC,IAAI,IAAI,iBAAiB,gBAAgB,WAAW,cAAc,cAAc;AACpG,UAAM,KAAK,GAAG,KAAK,GAAG;AAItB,QAAI,EAAE,WAAW,iBAAiB,KAAA,IAAS;AAC3C,iBAAa,GAAG,YAAY;AAC5B,UAAM,WAAW,GAAG,SAAS;AAC7B,UAAM,WAAW,GAAG,SAAS;AAC7B,QAAI;AACJ,uBAAmB,cAAc,iBAAiB,KAAK;AACvD,QAAI,YAAY,SAAS,qBAAqB;AAC5C,sBAAgB,WAAW,iBAAiB,IAAI,EAAE;AAAA,IACpD;AACA,QAAI,MAAM;AACR,0BAAoB,IAAI,IAAI,iBAAiB,cAAc;AAAA,IAC7D;AACA,uBAAmB,cAAc,iBAAiB,IAAI;AAMtD,QAAI,SAAS,aAAa,SAAS,aAAa,QAAQ,SAAS,eAAe,SAAS,eAAe,MAAM;AAC5G,yBAAmB,IAAI,EAAE;AAAA,IAC3B;AACA,QAAI,iBAAiB;AACnB;AAAA,QACE,GAAG;AAAA,QACH;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,yBAAyB,IAAI,SAAS;AAAA,QACtC;AAAA,MAAA;AAAA,IAKJ,WAAW,CAAC,WAAW;AACrB;AAAA,QACE;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,yBAAyB,IAAI,SAAS;AAAA,QACtC;AAAA,QACA;AAAA,MAAA;AAAA,IAEJ;AACA,QAAI,YAAY,GAAG;AACjB,UAAI,YAAY,IAAI;AAClB,mBAAW,IAAI,UAAU,UAAU,iBAAiB,SAAS;AAAA,MAC/D,OAAO;AACL,YAAI,YAAY,GAAG;AACjB,cAAI,SAAS,UAAU,SAAS,OAAO;AACrC,0BAAc,IAAI,SAAS,MAAM,SAAS,OAAO,SAAS;AAAA,UAC5D;AAAA,QACF;AACA,YAAI,YAAY,GAAG;AACjB,wBAAc,IAAI,SAAS,SAAS,OAAO,SAAS,OAAO,SAAS;AAAA,QACtE;AACA,YAAI,YAAY,GAAG;AACjB,gBAAM,gBAAgB,GAAG;AACzB,mBAASA,KAAI,GAAGA,KAAI,cAAc,QAAQA,MAAK;AAC7C,kBAAM,MAAM,cAAcA,EAAC;AAC3B,kBAAM,OAAO,SAAS,GAAG;AACzB,kBAAM,OAAO,SAAS,GAAG;AACzB,gBAAI,SAAS,QAAQ,QAAQ,SAAS;AACpC,4BAAc,IAAI,KAAK,MAAM,MAAM,WAAW,eAAe;AAAA,YAC/D;AAAA,UACF;AAAA,QACF;AAAA,MACF;AACA,UAAI,YAAY,GAAG;AACjB,YAAI,GAAG,aAAa,GAAG,UAAU;AAC/B,6BAAmB,IAAI,GAAG,QAAQ;AAAA,QACpC;AAAA,MACF;AAAA,IACF,WAAW,CAAC,aAAa,mBAAmB,MAAM;AAChD,iBAAW,IAAI,UAAU,UAAU,iBAAiB,SAAS;AAAA,IAC/D;AACA,SAAK,YAAY,SAAS,mBAAmB,MAAM;AACjD,4BAAsB,MAAM;AAC1B,qBAAa,gBAAgB,WAAW,iBAAiB,IAAI,EAAE;AAC/D,gBAAQ,oBAAoB,IAAI,IAAI,iBAAiB,SAAS;AAAA,MAChE,GAAG,cAAc;AAAA,IACnB;AAAA,EACF;AACA,QAAM,qBAAqB,CAAC,aAAa,aAAa,mBAAmB,iBAAiB,gBAAgB,WAAW,iBAAiB;AACpI,aAASA,KAAI,GAAGA,KAAI,YAAY,QAAQA,MAAK;AAC3C,YAAM,WAAW,YAAYA,EAAC;AAC9B,YAAM,WAAW,YAAYA,EAAC;AAC9B,YAAM;AAAA;AAAA;AAAA,QAGJ,SAAS;AAAA;AAAA,SAER,SAAS,SAAS;AAAA;AAAA,QAEnB,CAAC,gBAAgB,UAAU,QAAQ;AAAA,QACnC,SAAS,aAAa,IAAI,KAAK,QAAQ,eAAe,SAAS,EAAE;AAAA;AAAA;AAAA,UAG/D;AAAA;AAAA;AAGJ;AAAA,QACE;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MAAA;AAAA,IAEJ;AAAA,EACF;AACA,QAAM,aAAa,CAAC,IAAI,UAAU,UAAU,iBAAiB,cAAc;AACzE,QAAI,aAAa,UAAU;AACzB,UAAI,aAAa,WAAW;AAC1B,mBAAW,OAAO,UAAU;AAC1B,cAAI,CAAC,eAAe,GAAG,KAAK,EAAE,OAAO,WAAW;AAC9C;AAAA,cACE;AAAA,cACA;AAAA,cACA,SAAS,GAAG;AAAA,cACZ;AAAA,cACA;AAAA,cACA;AAAA,YAAA;AAAA,UAEJ;AAAA,QACF;AAAA,MACF;AACA,iBAAW,OAAO,UAAU;AAC1B,YAAI,eAAe,GAAG,EAAG;AACzB,cAAM,OAAO,SAAS,GAAG;AACzB,cAAM,OAAO,SAAS,GAAG;AACzB,YAAI,SAAS,QAAQ,QAAQ,SAAS;AACpC,wBAAc,IAAI,KAAK,MAAM,MAAM,WAAW,eAAe;AAAA,QAC/D;AAAA,MACF;AACA,UAAI,WAAW,UAAU;AACvB,sBAAc,IAAI,SAAS,SAAS,OAAO,SAAS,OAAO,SAAS;AAAA,MACtE;AAAA,IACF;AAAA,EACF;AACA,QAAM,kBAAkB,CAAC,IAAI,IAAI,WAAW,QAAQ,iBAAiB,gBAAgB,WAAW,cAAc,cAAc;AAC1H,UAAM,sBAAsB,GAAG,KAAK,KAAK,GAAG,KAAK,eAAe,EAAE;AAClE,UAAM,oBAAoB,GAAG,SAAS,KAAK,GAAG,SAAS,eAAe,EAAE;AACxE,QAAI,EAAE,WAAW,iBAAiB,cAAc,yBAAyB;AAOzE,QAAI,sBAAsB;AACxB,qBAAe,eAAe,aAAa,OAAO,oBAAoB,IAAI;AAAA,IAC5E;AACA,QAAI,MAAM,MAAM;AACd,iBAAW,qBAAqB,WAAW,MAAM;AACjD,iBAAW,mBAAmB,WAAW,MAAM;AAC/C;AAAA;AAAA;AAAA;AAAA;AAAA,QAKE,GAAG,YAAY,CAAA;AAAA,QACf;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MAAA;AAAA,IAEJ,OAAO;AACL,UAAI,YAAY,KAAK,YAAY,MAAM;AAAA;AAAA,MAEvC,GAAG,mBAAmB,GAAG,gBAAgB,WAAW,gBAAgB,QAAQ;AAC1E;AAAA,UACE,GAAG;AAAA,UACH;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QAAA;AAIF;AAAA;AAAA;AAAA;AAAA;AAAA,UAKE,GAAG,OAAO,QAAQ,mBAAmB,OAAO,gBAAgB;AAAA,UAC5D;AACA;AAAA,YACE;AAAA,YACA;AAAA,YACA;AAAA;AAAA,UAAA;AAAA,QAGJ;AAAA,MACF,OAAO;AACL;AAAA,UACE;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QAAA;AAAA,MAEJ;AAAA,IACF;AAAA,EACF;AACA,QAAM,mBAAmB,CAAC,IAAI,IAAI,WAAW,QAAQ,iBAAiB,gBAAgB,WAAW,cAAc,cAAc;AAC3H,OAAG,eAAe;AAClB,QAAI,MAAM,MAAM;AACd,UAAI,GAAG,YAAY,KAAK;AACtB,wBAAgB,IAAI;AAAA,UAClB;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QAAA;AAAA,MAEJ,OAAO;AACL;AAAA,UACE;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QAAA;AAAA,MAEJ;AAAA,IACF,OAAO;AACL,sBAAgB,IAAI,IAAI,SAAS;AAAA,IACnC;AAAA,EACF;AACA,QAAM,iBAAiB,CAAC,cAAc,WAAW,QAAQ,iBAAiB,gBAAgB,WAAW,cAAc;AACjH,UAAM,WAAY,aAAa,YAAY;AAAA,MACzC;AAAA,MACA;AAAA,MACA;AAAA,IAAA;AASF,QAAI,YAAY,YAAY,GAAG;AAC7B,eAAS,IAAI,WAAW;AAAA,IAC1B;AACA;AAIE,qBAAe,UAAU,OAAO,SAAS;AAAA,IAI3C;AAEA,QAAI,SAAS,UAAU;AACrB,wBAAkB,eAAe,YAAY,UAAU,mBAAmB,SAAS;AACnF,UAAI,CAAC,aAAa,IAAI;AACpB,cAAM,cAAc,SAAS,UAAU,YAAY,OAAO;AAC1D,2BAAmB,MAAM,aAAa,WAAW,MAAM;AACvD,qBAAa,cAAc,YAAY;AAAA,MACzC;AAAA,IACF,OAAO;AACL;AAAA,QACE;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MAAA;AAAA,IAEJ;AAAA,EAKF;AACA,QAAM,kBAAkB,CAAC,IAAI,IAAI,cAAc;AAC7C,UAAM,WAAW,GAAG,YAAY,GAAG;AACnC,QAAI,sBAAsB,IAAI,IAAI,SAAS,GAAG;AAC5C,UAAI,SAAS,YAAY,CAAC,SAAS,eAAe;AAIhD,iCAAyB,UAAU,IAAI,SAAS;AAIhD;AAAA,MACF,OAAO;AACL,iBAAS,OAAO;AAChB,iBAAS,OAAA;AAAA,MACX;AAAA,IACF,OAAO;AACL,SAAG,KAAK,GAAG;AACX,eAAS,QAAQ;AAAA,IACnB;AAAA,EACF;AACA,QAAM,oBAAoB,CAAC,UAAU,cAAc,WAAW,QAAQ,gBAAgB,WAAW,cAAc;AAC7G,UAAM,oBAAoB,MAAM;AAC9B,UAAI,CAAC,SAAS,WAAW;AACvB,YAAI;AACJ,cAAM,EAAE,IAAI,MAAA,IAAU;AACtB,cAAM,EAAE,IAAI,GAAAoB,IAAG,QAAQ,MAAM,SAAS;AACtC,cAAM,sBAAsB,eAAe,YAAY;AACvD,sBAAc,UAAU,KAAK;AAC7B,YAAI,IAAI;AACN,yBAAe,EAAE;AAAA,QACnB;AACA,YAAI,CAAC,wBAAwB,YAAY,SAAS,MAAM,qBAAqB;AAC3E,0BAAgB,WAAW,QAAQ,YAAY;AAAA,QACjD;AACA,sBAAc,UAAU,IAAI;AAiCrB;AACL,cAAI,KAAK;AAAA,UACT,KAAK,GAAG,KAAK,eAAe,OAAO;AACjC,iBAAK,GAAG,kBAAkB,IAAI;AAAA,UAChC;AAIA,gBAAM,UAAU,SAAS,UAAU,oBAAoB,QAAQ;AAO/D;AAAA,YACE;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UAAA;AAKF,uBAAa,KAAK,QAAQ;AAAA,QAC5B;AACA,YAAIA,IAAG;AACL,gCAAsBA,IAAG,cAAc;AAAA,QACzC;AACA,YAAI,CAAC,wBAAwB,YAAY,SAAS,MAAM,iBAAiB;AACvE,gBAAM,qBAAqB;AAC3B;AAAA,YACE,MAAM,gBAAgB,WAAW,QAAQ,kBAAkB;AAAA,YAC3D;AAAA,UAAA;AAAA,QAEJ;AACA,YAAI,aAAa,YAAY,OAAO,UAAU,eAAe,OAAO,KAAK,KAAK,OAAO,MAAM,YAAY,KAAK;AAC1G,mBAAS,KAAK,sBAAsB,SAAS,GAAG,cAAc;AAAA,QAChE;AACA,iBAAS,YAAY;AAIrB,uBAAe,YAAY,SAAS;AAAA,MACtC,OAAO;AACL,YAAI,EAAE,MAAM,IAAI,GAAG,QAAQ,UAAU;AACrC;AACE,gBAAM,uBAAuB,2BAA2B,QAAQ;AAChE,cAAI,sBAAsB;AACxB,gBAAI,MAAM;AACR,mBAAK,KAAK,MAAM;AAChB,uCAAyB,UAAU,MAAM,SAAS;AAAA,YACpD;AACA,iCAAqB,SAAS,KAAK,MAAM;AACvC,kBAAI,CAAC,SAAS,aAAa;AACzB,kCAAA;AAAA,cACF;AAAA,YACF,CAAC;AACD;AAAA,UACF;AAAA,QACF;AACA,YAAI,aAAa;AACjB,YAAI;AAIJ,sBAAc,UAAU,KAAK;AAC7B,YAAI,MAAM;AACR,eAAK,KAAK,MAAM;AAChB,mCAAyB,UAAU,MAAM,SAAS;AAAA,QACpD,OAAO;AACL,iBAAO;AAAA,QACT;AACA,YAAI,IAAI;AACN,yBAAe,EAAE;AAAA,QACnB;AACA,YAAI,YAAY,KAAK,SAAS,KAAK,MAAM,qBAAqB;AAC5D,0BAAgB,WAAW,QAAQ,MAAM,KAAK;AAAA,QAChD;AACA,sBAAc,UAAU,IAAI;AAI5B,cAAM,WAAW,oBAAoB,QAAQ;AAI7C,cAAM,WAAW,SAAS;AAC1B,iBAAS,UAAU;AAInB;AAAA,UACE;AAAA,UACA;AAAA;AAAA,UAEA,eAAe,SAAS,EAAE;AAAA;AAAA,UAE1B,gBAAgB,QAAQ;AAAA,UACxB;AAAA,UACA;AAAA,UACA;AAAA,QAAA;AAKF,aAAK,KAAK,SAAS;AACnB,YAAI,eAAe,MAAM;AACvB,0BAAgB,UAAU,SAAS,EAAE;AAAA,QACvC;AACA,YAAI,GAAG;AACL,gCAAsB,GAAG,cAAc;AAAA,QACzC;AACA,YAAI,YAAY,KAAK,SAAS,KAAK,MAAM,gBAAgB;AACvD;AAAA,YACE,MAAM,gBAAgB,WAAW,QAAQ,MAAM,KAAK;AAAA,YACpD;AAAA,UAAA;AAAA,QAEJ;AAAA,MAOF;AAAA,IACF;AACA,aAAS,MAAM,GAAA;AACf,UAAMN,UAAS,SAAS,SAAS,IAAI,eAAe,iBAAiB;AACrE,aAAS,MAAM,IAAA;AACf,UAAM,SAAS,SAAS,SAASA,QAAO,IAAI,KAAKA,OAAM;AACvD,UAAM,MAAM,SAAS,MAAMA,QAAO,WAAW,KAAKA,OAAM;AACxD,QAAI,IAAI;AACR,QAAI,KAAK,SAAS;AAClBA,YAAO,YAAY,MAAM,SAAS,GAAG;AACrC,kBAAc,UAAU,IAAI;AAK5B,WAAA;AAAA,EACF;AACA,QAAM,2BAA2B,CAAC,UAAU,WAAW,cAAc;AACnE,cAAU,YAAY;AACtB,UAAM,YAAY,SAAS,MAAM;AACjC,aAAS,QAAQ;AACjB,aAAS,OAAO;AAChB,gBAAY,UAAU,UAAU,OAAO,WAAW,SAAS;AAC3D,gBAAY,UAAU,UAAU,UAAU,SAAS;AACnD,kBAAA;AACA,qBAAiB,QAAQ;AACzB,kBAAA;AAAA,EACF;AACA,QAAM,gBAAgB,CAAC,IAAI,IAAI,WAAW,QAAQ,iBAAiB,gBAAgB,WAAW,cAAc,YAAY,UAAU;AAChI,UAAM,KAAK,MAAM,GAAG;AACpB,UAAM,gBAAgB,KAAK,GAAG,YAAY;AAC1C,UAAM,KAAK,GAAG;AACd,UAAM,EAAE,WAAW,UAAA,IAAc;AACjC,QAAI,YAAY,GAAG;AACjB,UAAI,YAAY,KAAK;AACnB;AAAA,UACE;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QAAA;AAEF;AAAA,MACF,WAAW,YAAY,KAAK;AAC1B;AAAA,UACE;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QAAA;AAEF;AAAA,MACF;AAAA,IACF;AACA,QAAI,YAAY,GAAG;AACjB,UAAI,gBAAgB,IAAI;AACtB,wBAAgB,IAAI,iBAAiB,cAAc;AAAA,MACrD;AACA,UAAI,OAAO,IAAI;AACb,2BAAmB,WAAW,EAAE;AAAA,MAClC;AAAA,IACF,OAAO;AACL,UAAI,gBAAgB,IAAI;AACtB,YAAI,YAAY,IAAI;AAClB;AAAA,YACE;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UAAA;AAAA,QAEJ,OAAO;AACL,0BAAgB,IAAI,iBAAiB,gBAAgB,IAAI;AAAA,QAC3D;AAAA,MACF,OAAO;AACL,YAAI,gBAAgB,GAAG;AACrB,6BAAmB,WAAW,EAAE;AAAA,QAClC;AACA,YAAI,YAAY,IAAI;AAClB;AAAA,YACE;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UAAA;AAAA,QAEJ;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACA,QAAM,uBAAuB,CAAC,IAAI,IAAI,WAAW,QAAQ,iBAAiB,gBAAgB,WAAW,cAAc,cAAc;AAC/H,SAAK,MAAM;AACX,SAAK,MAAM;AACX,UAAM,YAAY,GAAG;AACrB,UAAM,YAAY,GAAG;AACrB,UAAM,eAAe,KAAK,IAAI,WAAW,SAAS;AAClD,QAAId;AACJ,SAAKA,KAAI,GAAGA,KAAI,cAAcA,MAAK;AACjC,YAAM,YAAY,GAAGA,EAAC,IAAI,YAAY,eAAe,GAAGA,EAAC,CAAC,IAAI,eAAe,GAAGA,EAAC,CAAC;AAClF;AAAA,QACE,GAAGA,EAAC;AAAA,QACJ;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MAAA;AAAA,IAEJ;AACA,QAAI,YAAY,WAAW;AACzB;AAAA,QACE;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MAAA;AAAA,IAEJ,OAAO;AACL;AAAA,QACE;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MAAA;AAAA,IAEJ;AAAA,EACF;AACA,QAAM,qBAAqB,CAAC,IAAI,IAAI,WAAW,cAAc,iBAAiB,gBAAgB,WAAW,cAAc,cAAc;AACnI,QAAIA,KAAI;AACR,UAAM,KAAK,GAAG;AACd,QAAI,KAAK,GAAG,SAAS;AACrB,QAAI,KAAK,KAAK;AACd,WAAOA,MAAK,MAAMA,MAAK,IAAI;AACzB,YAAM,KAAK,GAAGA,EAAC;AACf,YAAM,KAAK,GAAGA,EAAC,IAAI,YAAY,eAAe,GAAGA,EAAC,CAAC,IAAI,eAAe,GAAGA,EAAC,CAAC;AAC3E,UAAI,gBAAgB,IAAI,EAAE,GAAG;AAC3B;AAAA,UACE;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QAAA;AAAA,MAEJ,OAAO;AACL;AAAA,MACF;AACA,MAAAA;AAAA,IACF;AACA,WAAOA,MAAK,MAAMA,MAAK,IAAI;AACzB,YAAM,KAAK,GAAG,EAAE;AAChB,YAAM,KAAK,GAAG,EAAE,IAAI,YAAY,eAAe,GAAG,EAAE,CAAC,IAAI,eAAe,GAAG,EAAE,CAAC;AAC9E,UAAI,gBAAgB,IAAI,EAAE,GAAG;AAC3B;AAAA,UACE;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QAAA;AAAA,MAEJ,OAAO;AACL;AAAA,MACF;AACA;AACA;AAAA,IACF;AACA,QAAIA,KAAI,IAAI;AACV,UAAIA,MAAK,IAAI;AACX,cAAM,UAAU,KAAK;AACrB,cAAM,SAAS,UAAU,KAAK,GAAG,OAAO,EAAE,KAAK;AAC/C,eAAOA,MAAK,IAAI;AACd;AAAA,YACE;AAAA,YACA,GAAGA,EAAC,IAAI,YAAY,eAAe,GAAGA,EAAC,CAAC,IAAI,eAAe,GAAGA,EAAC,CAAC;AAAA,YAChE;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UAAA;AAEF,UAAAA;AAAA,QACF;AAAA,MACF;AAAA,IACF,WAAWA,KAAI,IAAI;AACjB,aAAOA,MAAK,IAAI;AACd,gBAAQ,GAAGA,EAAC,GAAG,iBAAiB,gBAAgB,IAAI;AACpD,QAAAA;AAAA,MACF;AAAA,IACF,OAAO;AACL,YAAM,KAAKA;AACX,YAAM,KAAKA;AACX,YAAM,uCAAuC,IAAA;AAC7C,WAAKA,KAAI,IAAIA,MAAK,IAAIA,MAAK;AACzB,cAAM,YAAY,GAAGA,EAAC,IAAI,YAAY,eAAe,GAAGA,EAAC,CAAC,IAAI,eAAe,GAAGA,EAAC,CAAC;AAClF,YAAI,UAAU,OAAO,MAAM;AAQzB,2BAAiB,IAAI,UAAU,KAAKA,EAAC;AAAA,QACvC;AAAA,MACF;AACA,UAAI;AACJ,UAAI,UAAU;AACd,YAAM,cAAc,KAAK,KAAK;AAC9B,UAAI,QAAQ;AACZ,UAAI,mBAAmB;AACvB,YAAM,wBAAwB,IAAI,MAAM,WAAW;AACnD,WAAKA,KAAI,GAAGA,KAAI,aAAaA,KAAK,uBAAsBA,EAAC,IAAI;AAC7D,WAAKA,KAAI,IAAIA,MAAK,IAAIA,MAAK;AACzB,cAAM,YAAY,GAAGA,EAAC;AACtB,YAAI,WAAW,aAAa;AAC1B,kBAAQ,WAAW,iBAAiB,gBAAgB,IAAI;AACxD;AAAA,QACF;AACA,YAAI;AACJ,YAAI,UAAU,OAAO,MAAM;AACzB,qBAAW,iBAAiB,IAAI,UAAU,GAAG;AAAA,QAC/C,OAAO;AACL,eAAK,IAAI,IAAI,KAAK,IAAI,KAAK;AACzB,gBAAI,sBAAsB,IAAI,EAAE,MAAM,KAAK,gBAAgB,WAAW,GAAG,CAAC,CAAC,GAAG;AAC5E,yBAAW;AACX;AAAA,YACF;AAAA,UACF;AAAA,QACF;AACA,YAAI,aAAa,QAAQ;AACvB,kBAAQ,WAAW,iBAAiB,gBAAgB,IAAI;AAAA,QAC1D,OAAO;AACL,gCAAsB,WAAW,EAAE,IAAIA,KAAI;AAC3C,cAAI,YAAY,kBAAkB;AAChC,+BAAmB;AAAA,UACrB,OAAO;AACL,oBAAQ;AAAA,UACV;AACA;AAAA,YACE;AAAA,YACA,GAAG,QAAQ;AAAA,YACX;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UAAA;AAEF;AAAA,QACF;AAAA,MACF;AACA,YAAM,6BAA6B,QAAQ,YAAY,qBAAqB,IAAI;AAChF,UAAI,2BAA2B,SAAS;AACxC,WAAKA,KAAI,cAAc,GAAGA,MAAK,GAAGA,MAAK;AACrC,cAAM,YAAY,KAAKA;AACvB,cAAM,YAAY,GAAG,SAAS;AAC9B,cAAM,cAAc,GAAG,YAAY,CAAC;AACpC,cAAM,SAAS,YAAY,IAAI;AAAA;AAAA,UAE7B,YAAY,MAAM,iCAAiC,WAAW;AAAA,YAC5D;AACJ,YAAI,sBAAsBA,EAAC,MAAM,GAAG;AAClC;AAAA,YACE;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UAAA;AAAA,QAEJ,WAAW,OAAO;AAChB,cAAI,IAAI,KAAKA,OAAM,2BAA2B,CAAC,GAAG;AAChD,iBAAK,WAAW,WAAW,QAAQ,CAAC;AAAA,UACtC,OAAO;AACL;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACA,QAAM,OAAO,CAAC,OAAO,WAAW,QAAQ,UAAU,iBAAiB,SAAS;AAC1E,UAAM,EAAE,IAAI,MAAM,YAAY,UAAU,cAAc;AACtD,QAAI,YAAY,GAAG;AACjB,WAAK,MAAM,UAAU,SAAS,WAAW,QAAQ,QAAQ;AACzD;AAAA,IACF;AACA,QAAI,YAAY,KAAK;AACnB,YAAM,SAAS,KAAK,WAAW,QAAQ,QAAQ;AAC/C;AAAA,IACF;AACA,QAAI,YAAY,IAAI;AAClB,WAAK,KAAK,OAAO,WAAW,QAAQ,SAAS;AAC7C;AAAA,IACF;AACA,QAAI,SAAS,UAAU;AACrB,iBAAW,IAAI,WAAW,MAAM;AAChC,eAASA,KAAI,GAAGA,KAAI,SAAS,QAAQA,MAAK;AACxC,aAAK,SAASA,EAAC,GAAG,WAAW,QAAQ,QAAQ;AAAA,MAC/C;AACA,iBAAW,MAAM,QAAQ,WAAW,MAAM;AAC1C;AAAA,IACF;AACA,QAAI,SAAS,QAAQ;AACnB,qBAAe,OAAO,WAAW,MAAM;AACvC;AAAA,IACF;AACA,UAAM,kBAAkB,aAAa,KAAK,YAAY,KAAK;AAC3D,QAAI,iBAAiB;AACnB,UAAI,aAAa,GAAG;AAClB,mBAAW,YAAY,EAAE;AACzB,mBAAW,IAAI,WAAW,MAAM;AAChC,8BAAsB,MAAM,WAAW,MAAM,EAAE,GAAG,cAAc;AAAA,MAClE,OAAO;AACL,cAAM,EAAE,OAAO,YAAY,WAAA,IAAe;AAC1C,cAAMyB,WAAU,MAAM;AACpB,cAAI,MAAM,IAAI,aAAa;AACzB,uBAAW,EAAE;AAAA,UACf,OAAO;AACL,uBAAW,IAAI,WAAW,MAAM;AAAA,UAClC;AAAA,QACF;AACA,cAAM,eAAe,MAAM;AACzB,cAAI,GAAG,YAAY;AACjB,eAAG,UAAU;AAAA,cACX;AAAA;AAAA,YAAA;AAAA,UAGJ;AACA,gBAAM,IAAI,MAAM;AACdA,qBAAAA;AACA,0BAAc,WAAA;AAAA,UAChB,CAAC;AAAA,QACH;AACA,YAAI,YAAY;AACd,qBAAW,IAAIA,UAAS,YAAY;AAAA,QACtC,OAAO;AACL,uBAAA;AAAA,QACF;AAAA,MACF;AAAA,IACF,OAAO;AACL,iBAAW,IAAI,WAAW,MAAM;AAAA,IAClC;AAAA,EACF;AACA,QAAM,UAAU,CAAC,OAAO,iBAAiB,gBAAgB,WAAW,OAAO,YAAY,UAAU;AAC/F,UAAM;AAAA,MACJ;AAAA,MACA;AAAA,MACA,KAAAP;AAAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IAAA,IACE;AACJ,QAAI,cAAc,IAAI;AACpB,kBAAY;AAAA,IACd;AACA,QAAIA,QAAO,MAAM;AACf,oBAAA;AACA,aAAOA,MAAK,MAAM,gBAAgB,OAAO,IAAI;AAC7C,oBAAA;AAAA,IACF;AACA,QAAI,cAAc,MAAM;AACtB,sBAAgB,YAAY,UAAU,IAAI;AAAA,IAC5C;AACA,QAAI,YAAY,KAAK;AACnB,sBAAgB,IAAI,WAAW,KAAK;AACpC;AAAA,IACF;AACA,UAAM,mBAAmB,YAAY,KAAK;AAC1C,UAAM,wBAAwB,CAAC,eAAe,KAAK;AACnD,QAAI;AACJ,QAAI,0BAA0B,YAAY,SAAS,MAAM,uBAAuB;AAC9E,sBAAgB,WAAW,iBAAiB,KAAK;AAAA,IACnD;AACA,QAAI,YAAY,GAAG;AACjB,uBAAiB,MAAM,WAAW,gBAAgB,QAAQ;AAAA,IAC5D,OAAO;AACL,UAAI,YAAY,KAAK;AACnB,cAAM,SAAS,QAAQ,gBAAgB,QAAQ;AAC/C;AAAA,MACF;AACA,UAAI,kBAAkB;AACpB,4BAAoB,OAAO,MAAM,iBAAiB,eAAe;AAAA,MACnE;AACA,UAAI,YAAY,IAAI;AAClB,cAAM,KAAK;AAAA,UACT;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QAAA;AAAA,MAEJ,WAAW;AAAA;AAAA;AAAA;AAAA;AAAA,MAKX,CAAC,gBAAgB;AAAA,OAChB,SAAS,YAAY,YAAY,KAAK,YAAY,KAAK;AACtD;AAAA,UACE;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QAAA;AAAA,MAEJ,WAAW,SAAS,YAAY,aAAa,MAAM,QAAQ,CAAC,aAAa,YAAY,IAAI;AACvF,wBAAgB,UAAU,iBAAiB,cAAc;AAAA,MAC3D;AACA,UAAI,UAAU;AACZD,gBAAO,KAAK;AAAA,MACd;AAAA,IACF;AACA,QAAI,0BAA0B,YAAY,SAAS,MAAM,qBAAqB,kBAAkB;AAC9F,4BAAsB,MAAM;AAC1B,qBAAa,gBAAgB,WAAW,iBAAiB,KAAK;AAC9D,4BAAoB,oBAAoB,OAAO,MAAM,iBAAiB,WAAW;AAAA,MACnF,GAAG,cAAc;AAAA,IACnB;AAAA,EACF;AACA,QAAMA,UAAS,CAAC,UAAU;AACxB,UAAM,EAAE,MAAM,IAAI,QAAQ,eAAe;AACzC,QAAI,SAAS,UAAU;AASd;AACL,uBAAe,IAAI,MAAM;AAAA,MAC3B;AACA;AAAA,IACF;AACA,QAAI,SAAS,QAAQ;AACnB,uBAAiB,KAAK;AACtB;AAAA,IACF;AACA,UAAM,gBAAgB,MAAM;AAC1B,iBAAW,EAAE;AACb,UAAI,cAAc,CAAC,WAAW,aAAa,WAAW,YAAY;AAChE,mBAAW,WAAA;AAAA,MACb;AAAA,IACF;AACA,QAAI,MAAM,YAAY,KAAK,cAAc,CAAC,WAAW,WAAW;AAC9D,YAAM,EAAE,OAAO,WAAA,IAAe;AAC9B,YAAM,eAAe,MAAM,MAAM,IAAI,aAAa;AAClD,UAAI,YAAY;AACd,mBAAW,MAAM,IAAI,eAAe,YAAY;AAAA,MAClD,OAAO;AACL,qBAAA;AAAA,MACF;AAAA,IACF,OAAO;AACL,oBAAA;AAAA,IACF;AAAA,EACF;AACA,QAAM,iBAAiB,CAAC,KAAK,QAAQ;AACnC,QAAI;AACJ,WAAO,QAAQ,KAAK;AAClB,aAAO,gBAAgB,GAAG;AAC1B,iBAAW,GAAG;AACd,YAAM;AAAA,IACR;AACA,eAAW,GAAG;AAAA,EAChB;AACA,QAAM,mBAAmB,CAAC,UAAU,gBAAgB,aAAa;AAI/D,UAAM,EAAE,KAAK,OAAO,KAAK,SAAS,IAAI,GAAAG,IAAG,GAAAhB,OAAM;AAC/C,oBAAgBgB,EAAC;AACjB,oBAAgBhB,EAAC;AACjB,QAAI,KAAK;AACP,qBAAe,GAAG;AAAA,IACpB;AACA,UAAM,KAAA;AACN,QAAI,KAAK;AACP,UAAI,SAAS;AACb,cAAQ,SAAS,UAAU,gBAAgB,QAAQ;AAAA,IACrD;AACA,QAAI,IAAI;AACN,4BAAsB,IAAI,cAAc;AAAA,IAC1C;AACA,0BAAsB,MAAM;AAC1B,eAAS,cAAc;AAAA,IACzB,GAAG,cAAc;AAAA,EAInB;AACA,QAAM,kBAAkB,CAAC,UAAU,iBAAiB,gBAAgB,WAAW,OAAO,YAAY,OAAO,QAAQ,MAAM;AACrH,aAASJ,KAAI,OAAOA,KAAI,SAAS,QAAQA,MAAK;AAC5C,cAAQ,SAASA,EAAC,GAAG,iBAAiB,gBAAgB,UAAU,SAAS;AAAA,IAC3E;AAAA,EACF;AACA,QAAM,kBAAkB,CAAC,UAAU;AACjC,QAAI,MAAM,YAAY,GAAG;AACvB,aAAO,gBAAgB,MAAM,UAAU,OAAO;AAAA,IAChD;AACA,QAAI,MAAM,YAAY,KAAK;AACzB,aAAO,MAAM,SAAS,KAAA;AAAA,IACxB;AACA,UAAM,KAAK,gBAAgB,MAAM,UAAU,MAAM,EAAE;AACnD,UAAM,cAAc,MAAM,GAAG,cAAc;AAC3C,WAAO,cAAc,gBAAgB,WAAW,IAAI;AAAA,EACtD;AACA,MAAI,aAAa;AACjB,QAAM,SAAS,CAAC,OAAO,WAAW,cAAc;AAC9C,QAAI;AACJ,QAAI,SAAS,MAAM;AACjB,UAAI,UAAU,QAAQ;AACpB,gBAAQ,UAAU,QAAQ,MAAM,MAAM,IAAI;AAC1C,mBAAW,UAAU,OAAO;AAAA,MAC9B;AAAA,IACF,OAAO;AACL;AAAA,QACE,UAAU,UAAU;AAAA,QACpB;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MAAA;AAAA,IAEJ;AACA,cAAU,SAAS;AACnB,QAAI,CAAC,YAAY;AACf,mBAAa;AACb,uBAAiB,QAAQ;AACzB,wBAAA;AACA,mBAAa;AAAA,IACf;AAAA,EACF;AACA,QAAM,YAAY;AAAA,IAChB,GAAG;AAAA,IACH,IAAI;AAAA,IACJ,GAAG;AAAA,IACH,GAAGiB;AAAAA,IACH,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,KAAK;AAAA,IACL,GAAG;AAAA,IACH,GAAG;AAAA,EAAA;AAEL,MAAI;AAOJ,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,WAAW,aAAa,MAAe;AAAA,EAAA;AAE3C;AACA,SAAS,yBAAyB,EAAE,MAAM,MAAA,GAAS,kBAAkB;AACnE,SAAO,qBAAqB,SAAS,SAAS,mBAAmB,qBAAqB,YAAY,SAAS,oBAAoB,SAAS,MAAM,YAAY,MAAM,SAAS,SAAS,MAAM,IAAI,SAAS;AACvM;AACA,SAAS,cAAc,EAAE,QAAAH,SAAQ,IAAA,GAAO,SAAS;AAC/C,MAAI,SAAS;AACXA,YAAO,SAAS;AAChB,QAAI,SAAS;AAAA,EACf,OAAO;AACLA,YAAO,SAAS;AAChB,QAAI,SAAS;AAAA,EACf;AACF;AACA,SAAS,eAAe,gBAAgB,YAAY;AAClD,UAAQ,CAAC,kBAAkB,kBAAkB,CAAC,eAAe,kBAAkB,cAAc,CAAC,WAAW;AAC3G;AACA,SAAS,uBAAuB,IAAI,IAAI,UAAU,OAAO;AACvD,QAAM,MAAM,GAAG;AACf,QAAM,MAAM,GAAG;AACf,MAAI,QAAQ,GAAG,KAAK,QAAQ,GAAG,GAAG;AAChC,aAASd,KAAI,GAAGA,KAAI,IAAI,QAAQA,MAAK;AACnC,YAAM,KAAK,IAAIA,EAAC;AAChB,UAAI,KAAK,IAAIA,EAAC;AACd,UAAI,GAAG,YAAY,KAAK,CAAC,GAAG,iBAAiB;AAC3C,YAAI,GAAG,aAAa,KAAK,GAAG,cAAc,IAAI;AAC5C,eAAK,IAAIA,EAAC,IAAI,eAAe,IAAIA,EAAC,CAAC;AACnC,aAAG,KAAK,GAAG;AAAA,QACb;AACA,YAAI,CAAC,WAAW,GAAG,cAAc;AAC/B,iCAAuB,IAAI,EAAE;AAAA,MACjC;AACA,UAAI,GAAG,SAAS,MAAM;AACpB,YAAI,GAAG,cAAc,IAAI;AACvB,aAAG,KAAK,GAAG;AAAA,QACb,OAAO;AACL,aAAG,YAAYA;AAAA,WACd,GAAG,SAAS,WAAW,IAAI;AAAA,QAC9B;AAAA,MACF;AACA,UAAI,GAAG,SAAS,WAAW,CAAC,GAAG,IAAI;AACjC,WAAG,KAAK,GAAG;AAAA,MACb;AAAA,IAIF;AAAA,EACF;AACF;AACA,SAAS,YAAY,KAAK;AACxB,QAAMe,KAAI,IAAI,MAAA;AACd,QAAM,SAAS,CAAC,CAAC;AACjB,MAAIf,IAAG,GAAG,GAAGO,IAAGL;AAChB,QAAM,MAAM,IAAI;AAChB,OAAKF,KAAI,GAAGA,KAAI,KAAKA,MAAK;AACxB,UAAM,OAAO,IAAIA,EAAC;AAClB,QAAI,SAAS,GAAG;AACd,UAAI,OAAO,OAAO,SAAS,CAAC;AAC5B,UAAI,IAAI,CAAC,IAAI,MAAM;AACjB,QAAAe,GAAEf,EAAC,IAAI;AACP,eAAO,KAAKA,EAAC;AACb;AAAA,MACF;AACA,UAAI;AACJ,MAAAO,KAAI,OAAO,SAAS;AACpB,aAAO,IAAIA,IAAG;AACZ,QAAAL,KAAI,IAAIK,MAAK;AACb,YAAI,IAAI,OAAOL,EAAC,CAAC,IAAI,MAAM;AACzB,cAAIA,KAAI;AAAA,QACV,OAAO;AACL,UAAAK,KAAIL;AAAA,QACN;AAAA,MACF;AACA,UAAI,OAAO,IAAI,OAAO,CAAC,CAAC,GAAG;AACzB,YAAI,IAAI,GAAG;AACT,UAAAa,GAAEf,EAAC,IAAI,OAAO,IAAI,CAAC;AAAA,QACrB;AACA,eAAO,CAAC,IAAIA;AAAA,MACd;AAAA,IACF;AAAA,EACF;AACA,MAAI,OAAO;AACX,EAAAO,KAAI,OAAO,IAAI,CAAC;AAChB,SAAO,MAAM,GAAG;AACd,WAAO,CAAC,IAAIA;AACZ,IAAAA,KAAIQ,GAAER,EAAC;AAAA,EACT;AACA,SAAO;AACT;AACA,SAAS,2BAA2B,UAAU;AAC5C,QAAM,eAAe,SAAS,QAAQ;AACtC,MAAI,cAAc;AAChB,QAAI,aAAa,YAAY,CAAC,aAAa,eAAe;AACxD,aAAO;AAAA,IACT,OAAO;AACL,aAAO,2BAA2B,YAAY;AAAA,IAChD;AAAA,EACF;AACF;AACA,SAAS,gBAAgB,OAAO;AAC9B,MAAI,OAAO;AACT,aAASP,KAAI,GAAGA,KAAI,MAAM,QAAQA;AAChC,YAAMA,EAAC,EAAE,SAAS;AAAA,EACtB;AACF;AACA,SAAS,iCAAiC,aAAa;AACrD,MAAI,YAAY,aAAa;AAC3B,WAAO,YAAY;AAAA,EACrB;AACA,QAAM,WAAW,YAAY;AAC7B,MAAI,UAAU;AACZ,WAAO,iCAAiC,SAAS,OAAO;AAAA,EAC1D;AACA,SAAO;AACT;AAEA,MAAM,aAAa,CAAC,SAAS,KAAK;AA2jBlC,SAAS,wBAAwB,IAAI,UAAU;AAC7C,MAAI,YAAY,SAAS,eAAe;AACtC,QAAI,QAAQ,EAAE,GAAG;AACf,eAAS,QAAQ,KAAK,GAAG,EAAE;AAAA,IAC7B,OAAO;AACL,eAAS,QAAQ,KAAK,EAAE;AAAA,IAC1B;AAAA,EACF,OAAO;AACL,qBAAiB,EAAE;AAAA,EACrB;AACF;AAoBA,MAAM,WAA2B,uBAAO,IAAI,OAAO;AACnD,MAAM,OAAuB,uBAAO,IAAI,OAAO;AAC/C,MAAM,UAA0B,uBAAO,IAAI,OAAO;AAClD,MAAM,SAAyB,uBAAO,IAAI,OAAO;AACjD,MAAM,aAAa,CAAA;AACnB,IAAI,eAAe;AACnB,SAAS,UAAU,kBAAkB,OAAO;AAC1C,aAAW,KAAK,eAAe,kBAAkB,OAAO,CAAA,CAAE;AAC5D;AACA,SAAS,aAAa;AACpB,aAAW,IAAA;AACX,iBAAe,WAAW,WAAW,SAAS,CAAC,KAAK;AACtD;AACA,IAAI,qBAAqB;AACzB,SAAS,iBAAiB,OAAO,UAAU,OAAO;AAChD,wBAAsB;AACtB,MAAI,QAAQ,KAAK,gBAAgB,SAAS;AACxC,iBAAa,UAAU;AAAA,EACzB;AACF;AACA,SAAS,WAAW,OAAO;AACzB,QAAM,kBAAkB,qBAAqB,IAAI,gBAAgB,YAAY;AAC7E,aAAA;AACA,MAAI,qBAAqB,KAAK,cAAc;AAC1C,iBAAa,KAAK,KAAK;AAAA,EACzB;AACA,SAAO;AACT;AACA,SAAS,mBAAmB,MAAM,OAAO,UAAU,WAAW,cAAc,WAAW;AACrF,SAAO;AAAA,IACL;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IAAA;AAAA,EACF;AAEJ;AACA,SAAS,YAAY,MAAM,OAAO,UAAU,WAAW,cAAc;AACnE,SAAO;AAAA,IACL;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IAAA;AAAA,EACF;AAEJ;AACA,SAAS,QAAQ,OAAO;AACtB,SAAO,QAAQ,MAAM,gBAAgB,OAAO;AAC9C;AACA,SAAS,gBAAgB,IAAI,IAAI;AAS/B,SAAO,GAAG,SAAS,GAAG,QAAQ,GAAG,QAAQ,GAAG;AAC9C;AAUA,MAAM,eAAe,CAAC,EAAE,UAAU,OAAO,OAAO,MAAM;AACtD,MAAM,eAAe,CAAC;AAAA,EACpB,KAAAkB;AAAAA,EACA;AAAA,EACA;AACF,MAAM;AACJ,MAAI,OAAOA,SAAQ,UAAU;AAC3BA,WAAM,KAAKA;AAAAA,EACb;AACA,SAAOA,QAAO,OAAO,SAASA,IAAG,KAAK,MAAMA,IAAG,KAAK,WAAWA,IAAG,IAAI,EAAE,GAAG,0BAA0B,GAAGA,MAAK,GAAG,SAAS,GAAG,CAAC,CAAC,YAAYA,OAAM;AAClJ;AACA,SAAS,gBAAgB,MAAM,QAAQ,MAAM,WAAW,MAAM,YAAY,GAAG,eAAe,MAAM,YAAY,SAAS,WAAW,IAAI,GAAG,cAAc,OAAO,gCAAgC,OAAO;AACnM,QAAM,QAAQ;AAAA,IACZ,aAAa;AAAA,IACb,UAAU;AAAA,IACV;AAAA,IACA;AAAA,IACA,KAAK,SAAS,aAAa,KAAK;AAAA,IAChC,KAAK,SAAS,aAAa,KAAK;AAAA,IAChC,SAAS;AAAA,IACT,cAAc;AAAA,IACd;AAAA,IACA,WAAW;AAAA,IACX,UAAU;AAAA,IACV,WAAW;AAAA,IACX,YAAY;AAAA,IACZ,MAAM;AAAA,IACN,YAAY;AAAA,IACZ,IAAI;AAAA,IACJ,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,aAAa;AAAA,IACb,cAAc;AAAA,IACd,aAAa;AAAA,IACb;AAAA,IACA;AAAA,IACA;AAAA,IACA,iBAAiB;AAAA,IACjB,YAAY;AAAA,IACZ,KAAK;AAAA,EAAA;AAEP,MAAI,+BAA+B;AACjC,sBAAkB,OAAO,QAAQ;AACjC,QAAI,YAAY,KAAK;AACnB,WAAK,UAAU,KAAK;AAAA,IACtB;AAAA,EACF,WAAW,UAAU;AACnB,UAAM,aAAa,SAAS,QAAQ,IAAI,IAAI;AAAA,EAC9C;AAIA,MAAI,qBAAqB;AAAA,EACzB,CAAC;AAAA,EACD;AAAA;AAAA;AAAA;AAAA,GAIC,MAAM,YAAY,KAAK,YAAY;AAAA;AAAA,EAEpC,MAAM,cAAc,IAAI;AACtB,iBAAa,KAAK,KAAK;AAAA,EACzB;AACA,SAAO;AACT;AACA,MAAM,cAAyF;AAC/F,SAAS,aAAa,MAAM,QAAQ,MAAM,WAAW,MAAM,YAAY,GAAG,eAAe,MAAM,cAAc,OAAO;AAClH,MAAI,CAAC,QAAQ,SAAS,wBAAwB;AAI5C,WAAO;AAAA,EACT;AACA,MAAI,QAAQ,IAAI,GAAG;AACjB,UAAM,SAAS;AAAA,MACb;AAAA,MACA;AAAA,MACA;AAAA;AAAA,IAAA;AAGF,QAAI,UAAU;AACZ,wBAAkB,QAAQ,QAAQ;AAAA,IACpC;AACA,QAAI,qBAAqB,KAAK,CAAC,eAAe,cAAc;AAC1D,UAAI,OAAO,YAAY,GAAG;AACxB,qBAAa,aAAa,QAAQ,IAAI,CAAC,IAAI;AAAA,MAC7C,OAAO;AACL,qBAAa,KAAK,MAAM;AAAA,MAC1B;AAAA,IACF;AACA,WAAO,YAAY;AACnB,WAAO;AAAA,EACT;AACA,MAAI,iBAAiB,IAAI,GAAG;AAC1B,WAAO,KAAK;AAAA,EACd;AACA,MAAI,OAAO;AACT,YAAQ,mBAAmB,KAAK;AAChC,QAAI,EAAE,OAAO,OAAO,OAAAQ,OAAA,IAAU;AAC9B,QAAI,SAAS,CAAC,SAAS,KAAK,GAAG;AAC7B,YAAM,QAAQ,eAAe,KAAK;AAAA,IACpC;AACA,QAAI,SAASA,MAAK,GAAG;AACnB,UAAI,QAAQA,MAAK,KAAK,CAAC,QAAQA,MAAK,GAAG;AACrC,QAAAA,SAAQ,OAAO,CAAA,GAAIA,MAAK;AAAA,MAC1B;AACA,YAAM,QAAQ,eAAeA,MAAK;AAAA,IACpC;AAAA,EACF;AACA,QAAM,YAAY,SAAS,IAAI,IAAI,IAAI,WAAW,IAAI,IAAI,MAAM,WAAW,IAAI,IAAI,KAAK,SAAS,IAAI,IAAI,IAAI,WAAW,IAAI,IAAI,IAAI;AAUpI,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA;AAEJ;AACA,SAAS,mBAAmB,OAAO;AACjC,MAAI,CAAC,MAAO,QAAO;AACnB,SAAO,QAAQ,KAAK,KAAK,iBAAiB,KAAK,IAAI,OAAO,CAAA,GAAI,KAAK,IAAI;AACzE;AACA,SAAS,WAAW,OAAO,YAAY,WAAW,OAAO,kBAAkB,OAAO;AAChF,QAAM,EAAE,OAAO,KAAAR,MAAK,WAAW,UAAU,eAAe;AACxD,QAAM,cAAc,aAAa,WAAW,SAAS,CAAA,GAAI,UAAU,IAAI;AACvE,QAAM,SAAS;AAAA,IACb,aAAa;AAAA,IACb,UAAU;AAAA,IACV,MAAM,MAAM;AAAA,IACZ,OAAO;AAAA,IACP,KAAK,eAAe,aAAa,WAAW;AAAA,IAC5C,KAAK,cAAc,WAAW;AAAA;AAAA;AAAA;AAAA,MAI5B,YAAYA,OAAM,QAAQA,IAAG,IAAIA,KAAI,OAAO,aAAa,UAAU,CAAC,IAAI,CAACA,MAAK,aAAa,UAAU,CAAC,IAAI,aAAa,UAAU;AAAA,QAC/HA;AAAAA,IACJ,SAAS,MAAM;AAAA,IACf,cAAc,MAAM;AAAA,IACpB;AAAA,IACA,QAAQ,MAAM;AAAA,IACd,aAAa,MAAM;AAAA,IACnB,cAAc,MAAM;AAAA,IACpB,aAAa,MAAM;AAAA,IACnB,WAAW,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA,IAKjB,WAAW,cAAc,MAAM,SAAS,WAAW,cAAc,KAAK,KAAK,YAAY,KAAK;AAAA,IAC5F,cAAc,MAAM;AAAA,IACpB,iBAAiB,MAAM;AAAA,IACvB,YAAY,MAAM;AAAA,IAClB,MAAM,MAAM;AAAA,IACZ;AAAA;AAAA;AAAA;AAAA;AAAA,IAKA,WAAW,MAAM;AAAA,IACjB,UAAU,MAAM;AAAA,IAChB,WAAW,MAAM,aAAa,WAAW,MAAM,SAAS;AAAA,IACxD,YAAY,MAAM,cAAc,WAAW,MAAM,UAAU;AAAA,IAC3D,aAAa,MAAM;AAAA,IACnB,IAAI,MAAM;AAAA,IACV,QAAQ,MAAM;AAAA,IACd,KAAK,MAAM;AAAA,IACX,IAAI,MAAM;AAAA,EAAA;AAEZ,MAAI,cAAc,iBAAiB;AACjC;AAAA,MACE;AAAA,MACA,WAAW,MAAM,MAAM;AAAA,IAAA;AAAA,EAE3B;AACA,SAAO;AACT;AAQA,SAAS,gBAAgB,OAAO,KAAK,OAAO,GAAG;AAC7C,SAAO,YAAY,MAAM,MAAM,MAAM,IAAI;AAC3C;AACA,SAAS,kBAAkB,SAAS,eAAe;AACjD,QAAM,QAAQ,YAAY,QAAQ,MAAM,OAAO;AAC/C,QAAM,cAAc;AACpB,SAAO;AACT;AACA,SAAS,mBAAmB,OAAO,IAAI,UAAU,OAAO;AACtD,SAAO,WAAW,aAAa,YAAY,SAAS,MAAM,IAAI,KAAK,YAAY,SAAS,MAAM,IAAI;AACpG;AACA,SAAS,eAAe,OAAO;AAC7B,MAAI,SAAS,QAAQ,OAAO,UAAU,WAAW;AAC/C,WAAO,YAAY,OAAO;AAAA,EAC5B,WAAW,QAAQ,KAAK,GAAG;AACzB,WAAO;AAAA,MACL;AAAA,MACA;AAAA;AAAA,MAEA,MAAM,MAAA;AAAA,IAAM;AAAA,EAEhB,WAAW,QAAQ,KAAK,GAAG;AACzB,WAAO,eAAe,KAAK;AAAA,EAC7B,OAAO;AACL,WAAO,YAAY,MAAM,MAAM,OAAO,KAAK,CAAC;AAAA,EAC9C;AACF;AACA,SAAS,eAAe,OAAO;AAC7B,SAAO,MAAM,OAAO,QAAQ,MAAM,cAAc,MAAM,MAAM,OAAO,QAAQ,WAAW,KAAK;AAC7F;AACA,SAAS,kBAAkB,OAAO,UAAU;AAC1C,MAAI,OAAO;AACX,QAAM,EAAE,cAAc;AACtB,MAAI,YAAY,MAAM;AACpB,eAAW;AAAA,EACb,WAAW,QAAQ,QAAQ,GAAG;AAC5B,WAAO;AAAA,EACT,WAAW,OAAO,aAAa,UAAU;AACvC,QAAI,aAAa,IAAI,KAAK;AACxB,YAAM,OAAO,SAAS;AACtB,UAAI,MAAM;AACR,aAAK,OAAO,KAAK,KAAK;AACtB,0BAAkB,OAAO,MAAM;AAC/B,aAAK,OAAO,KAAK,KAAK;AAAA,MACxB;AACA;AAAA,IACF,OAAO;AACL,aAAO;AACP,YAAM,WAAW,SAAS;AAC1B,UAAI,CAAC,YAAY,CAAC,iBAAiB,QAAQ,GAAG;AAC5C,iBAAS,OAAO;AAAA,MAClB,WAAW,aAAa,KAAK,0BAA0B;AACrD,YAAI,yBAAyB,MAAM,MAAM,GAAG;AAC1C,mBAAS,IAAI;AAAA,QACf,OAAO;AACL,mBAAS,IAAI;AACb,gBAAM,aAAa;AAAA,QACrB;AAAA,MACF;AAAA,IACF;AAAA,EACF,WAAW,WAAW,QAAQ,GAAG;AAC/B,eAAW,EAAE,SAAS,UAAU,MAAM,yBAAA;AACtC,WAAO;AAAA,EACT,OAAO;AACL,eAAW,OAAO,QAAQ;AAC1B,QAAI,YAAY,IAAI;AAClB,aAAO;AACP,iBAAW,CAAC,gBAAgB,QAAQ,CAAC;AAAA,IACvC,OAAO;AACL,aAAO;AAAA,IACT;AAAA,EACF;AACA,QAAM,WAAW;AACjB,QAAM,aAAa;AACrB;AACA,SAAS,cAAc,MAAM;AAC3B,QAAM,MAAM,CAAA;AACZ,WAASlB,KAAI,GAAGA,KAAI,KAAK,QAAQA,MAAK;AACpC,UAAM,UAAU,KAAKA,EAAC;AACtB,eAAW,OAAO,SAAS;AACzB,UAAI,QAAQ,SAAS;AACnB,YAAI,IAAI,UAAU,QAAQ,OAAO;AAC/B,cAAI,QAAQ,eAAe,CAAC,IAAI,OAAO,QAAQ,KAAK,CAAC;AAAA,QACvD;AAAA,MACF,WAAW,QAAQ,SAAS;AAC1B,YAAI,QAAQ,eAAe,CAAC,IAAI,OAAO,QAAQ,KAAK,CAAC;AAAA,MACvD,WAAW,KAAK,GAAG,GAAG;AACpB,cAAM,WAAW,IAAI,GAAG;AACxB,cAAM,WAAW,QAAQ,GAAG;AAC5B,YAAI,YAAY,aAAa,YAAY,EAAE,QAAQ,QAAQ,KAAK,SAAS,SAAS,QAAQ,IAAI;AAC5F,cAAI,GAAG,IAAI,WAAW,CAAA,EAAG,OAAO,UAAU,QAAQ,IAAI;AAAA,QACxD;AAAA,MACF,WAAW,QAAQ,IAAI;AACrB,YAAI,GAAG,IAAI,QAAQ,GAAG;AAAA,MACxB;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;AACA,SAAS,gBAAgB,MAAM,UAAU,OAAO,YAAY,MAAM;AAChE,6BAA2B,MAAM,UAAU,GAAG;AAAA,IAC5C;AAAA,IACA;AAAA,EAAA,CACD;AACH;AAEA,MAAM,kBAAkB,iBAAA;AACxB,IAAI,MAAM;AACV,SAAS,wBAAwB,OAAO,QAAQ,UAAU;AACxD,QAAM,OAAO,MAAM;AACnB,QAAM,cAAc,SAAS,OAAO,aAAa,MAAM,eAAe;AACtE,QAAM,WAAW;AAAA,IACf,KAAK;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,MAAM;AAAA;AAAA,IAEN,MAAM;AAAA,IACN,SAAS;AAAA;AAAA,IAET,QAAQ;AAAA,IACR,QAAQ;AAAA;AAAA,IAER,KAAK;AAAA,IACL,OAAO,IAAI;AAAA,MACT;AAAA;AAAA,IAAA;AAAA,IAGF,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,SAAS;AAAA,IACT,aAAa;AAAA,IACb,WAAW;AAAA,IACX,UAAU,SAAS,OAAO,WAAW,OAAO,OAAO,WAAW,QAAQ;AAAA,IACtE,KAAK,SAAS,OAAO,MAAM,CAAC,IAAI,GAAG,CAAC;AAAA,IACpC,aAAa;AAAA,IACb,aAAa,CAAA;AAAA;AAAA,IAEb,YAAY;AAAA,IACZ,YAAY;AAAA;AAAA,IAEZ,cAAc,sBAAsB,MAAM,UAAU;AAAA,IACpD,cAAc,sBAAsB,MAAM,UAAU;AAAA;AAAA,IAEpD,MAAM;AAAA;AAAA,IAEN,SAAS;AAAA;AAAA,IAET,eAAe;AAAA;AAAA,IAEf,cAAc,KAAK;AAAA;AAAA,IAEnB,KAAK;AAAA,IACL,MAAM;AAAA,IACN,OAAO;AAAA,IACP,OAAO;AAAA,IACP,OAAO;AAAA,IACP,MAAM;AAAA,IACN,YAAY;AAAA,IACZ,cAAc;AAAA;AAAA,IAEd;AAAA,IACA,YAAY,WAAW,SAAS,YAAY;AAAA,IAC5C,UAAU;AAAA,IACV,eAAe;AAAA;AAAA;AAAA,IAGf,WAAW;AAAA,IACX,aAAa;AAAA,IACb,eAAe;AAAA,IACf,IAAI;AAAA,IACJ,GAAG;AAAA,IACH,IAAI;AAAA,IACJ,GAAG;AAAA,IACH,IAAI;AAAA,IACJ,GAAG;AAAA,IACH,IAAI;AAAA,IACJ,KAAK;AAAA,IACL,IAAI;AAAA,IACJ,GAAG;AAAA,IACH,KAAK;AAAA,IACL,KAAK;AAAA,IACL,IAAI;AAAA,IACJ,IAAI;AAAA,EAAA;AAIC;AACL,aAAS,MAAM,EAAE,GAAG,SAAA;AAAA,EACtB;AACA,WAAS,OAAO,SAAS,OAAO,OAAO;AACvC,WAAS,OAAO,KAAK,KAAK,MAAM,QAAQ;AACxC,MAAI,MAAM,IAAI;AACZ,UAAM,GAAG,QAAQ;AAAA,EACnB;AACA,SAAO;AACT;AACA,IAAI,kBAAkB;AACtB,MAAM,qBAAqB,MAAM,mBAAmB;AACpD,IAAI;AACJ,IAAI;AACJ;AACE,QAAM,IAAI,cAAA;AACV,QAAM,uBAAuB,CAAC,KAAK,WAAW;AAC5C,QAAI;AACJ,QAAI,EAAE,UAAU,EAAE,GAAG,GAAI,WAAU,EAAE,GAAG,IAAI,CAAA;AAC5C,YAAQ,KAAK,MAAM;AACnB,WAAO,CAACO,OAAM;AACZ,UAAI,QAAQ,SAAS,EAAG,SAAQ,QAAQ,CAAC,QAAQ,IAAIA,EAAC,CAAC;AAAA,UAClD,SAAQ,CAAC,EAAEA,EAAC;AAAA,IACnB;AAAA,EACF;AACA,+BAA6B;AAAA,IAC3B;AAAA,IACA,CAACA,OAAM,kBAAkBA;AAAA,EAAA;AAE3B,uBAAqB;AAAA,IACnB;AAAA,IACA,CAACA,OAAM,wBAAwBA;AAAA,EAAA;AAEnC;AACA,MAAM,qBAAqB,CAAC,aAAa;AACvC,QAAM,OAAO;AACb,6BAA2B,QAAQ;AACnC,WAAS,MAAM,GAAA;AACf,SAAO,MAAM;AACX,aAAS,MAAM,IAAA;AACf,+BAA2B,IAAI;AAAA,EACjC;AACF;AACA,MAAM,uBAAuB,MAAM;AACjC,qBAAmB,gBAAgB,MAAM,IAAA;AACzC,6BAA2B,IAAI;AACjC;AASA,SAAS,oBAAoB,UAAU;AACrC,SAAO,SAAS,MAAM,YAAY;AACpC;AACA,IAAI,wBAAwB;AAC5B,SAAS,eAAe,UAAU,QAAQ,OAAO,YAAY,OAAO;AAClE,WAAS,mBAAmB,KAAK;AACjC,QAAM,EAAE,OAAO,SAAA,IAAa,SAAS;AACrC,QAAM,aAAa,oBAAoB,QAAQ;AAC/C,YAAU,UAAU,OAAO,YAAY,KAAK;AAC5C,YAAU,UAAU,UAAU,aAAa,KAAK;AAChD,QAAM,cAAc,aAAa,uBAAuB,UAAU,KAAK,IAAI;AAC3E,WAAS,mBAAmB,KAAK;AACjC,SAAO;AACT;AACA,SAAS,uBAAuB,UAAU,OAAO;AAC/C,QAAM,YAAY,SAAS;AAuB3B,WAAS,cAA8B,uBAAO,OAAO,IAAI;AACzD,WAAS,QAAQ,IAAI,MAAM,SAAS,KAAK,2BAA2B;AAIpE,QAAM,EAAE,OAAAoB,WAAU;AAClB,MAAIA,QAAO;AACT,kBAAA;AACA,UAAM,eAAe,SAAS,eAAeA,OAAM,SAAS,IAAI,mBAAmB,QAAQ,IAAI;AAC/F,UAAM,QAAQ,mBAAmB,QAAQ;AACzC,UAAM,cAAc;AAAA,MAClBA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,QACgF,SAAS;AAAA,QACvF;AAAA,MAAA;AAAA,IACF;AAEF,UAAM,eAAe,UAAU,WAAW;AAC1C,kBAAA;AACA,UAAA;AACA,SAAK,gBAAgB,SAAS,OAAO,CAAC,eAAe,QAAQ,GAAG;AAC9D,wBAAkB,QAAQ;AAAA,IAC5B;AACA,QAAI,cAAc;AAChB,kBAAY,KAAK,sBAAsB,oBAAoB;AAC3D,UAAI,OAAO;AACT,eAAO,YAAY,KAAK,CAAC,mBAAmB;AAC1C,4BAAkB,UAAU,cAAqB;AAAA,QACnD,CAAC,EAAE,MAAM,CAAC,MAAM;AACd,sBAAY,GAAG,UAAU,CAAC;AAAA,QAC5B,CAAC;AAAA,MACH,OAAO;AACL,iBAAS,WAAW;AAAA,MAOtB;AAAA,IACF,OAAO;AACL,wBAAkB,UAAU,WAAkB;AAAA,IAChD;AAAA,EACF,OAAO;AACL,yBAAqB,QAAe;AAAA,EACtC;AACF;AACA,SAAS,kBAAkB,UAAU,aAAa,OAAO;AACvD,MAAI,WAAW,WAAW,GAAG;AAC3B,QAAI,SAAS,KAAK,mBAAmB;AACnC,eAAS,YAAY;AAAA,IACvB,OAAO;AACL,eAAS,SAAS;AAAA,IACpB;AAAA,EACF,WAAW,SAAS,WAAW,GAAG;AAShC,aAAS,aAAa,UAAU,WAAW;AAAA,EAI7C;AAKA,uBAAqB,QAAe;AACtC;AAYA,SAAS,qBAAqB,UAAU,OAAO,aAAa;AAC1D,QAAM,YAAY,SAAS;AAC3B,MAAI,CAAC,SAAS,QAAQ;AAyBpB,aAAS,SAAS,UAAU,UAAU;AAAA,EAIxC;AACiC;AAC/B,UAAM,QAAQ,mBAAmB,QAAQ;AACzC,kBAAA;AACA,QAAI;AACF,mBAAa,QAAQ;AAAA,IACvB,UAAA;AACE,oBAAA;AACA,YAAA;AAAA,IACF;AAAA,EACF;AAUF;AACA,MAAM,qBAcF;AAAA,EACF,IAAI,QAAQ,KAAK;AACf,UAAM,QAAQ,OAAO,EAAE;AACvB,WAAO,OAAO,GAAG;AAAA,EACnB;AACF;AASA,SAAS,mBAAmB,UAAU;AACpC,QAAM,SAAS,CAAC,YAAY;AAqB1B,aAAS,UAAU,WAAW,CAAA;AAAA,EAChC;AAgBO;AACL,WAAO;AAAA,MACL,OAAO,IAAI,MAAM,SAAS,OAAO,kBAAkB;AAAA,MACnD,OAAO,SAAS;AAAA,MAChB,MAAM,SAAS;AAAA,MACf;AAAA,IAAA;AAAA,EAEJ;AACF;AACA,SAAS,2BAA2B,UAAU;AAC5C,MAAI,SAAS,SAAS;AACpB,WAAO,SAAS,gBAAgB,SAAS,cAAc,IAAI,MAAM,UAAU,QAAQ,SAAS,OAAO,CAAC,GAAG;AAAA,MACrG,IAAI,QAAQ,KAAK;AACf,YAAI,OAAO,QAAQ;AACjB,iBAAO,OAAO,GAAG;AAAA,QACnB,WAAW,OAAO,qBAAqB;AACrC,iBAAO,oBAAoB,GAAG,EAAE,QAAQ;AAAA,QAC1C;AAAA,MACF;AAAA,MACA,IAAI,QAAQ,KAAK;AACf,eAAO,OAAO,UAAU,OAAO;AAAA,MACjC;AAAA,IAAA,CACD;AAAA,EACH,OAAO;AACL,WAAO,SAAS;AAAA,EAClB;AACF;AACA,MAAM,aAAa;AACnB,MAAM,WAAW,CAAC,QAAQ,IAAI,QAAQ,YAAY,CAACzB,OAAMA,GAAE,YAAA,CAAa,EAAE,QAAQ,SAAS,EAAE;AAC7F,SAAS,iBAAiB,WAAW,kBAAkB,MAAM;AAC3D,SAAO,WAAW,SAAS,IAAI,UAAU,eAAe,UAAU,OAAO,UAAU,QAAQ,mBAAmB,UAAU;AAC1H;AACA,SAAS,oBAAoB,UAAU,WAAW,SAAS,OAAO;AAChE,MAAI,OAAO,iBAAiB,SAAS;AACrC,MAAI,CAAC,QAAQ,UAAU,QAAQ;AAC7B,UAAM,QAAQ,UAAU,OAAO,MAAM,iBAAiB;AACtD,QAAI,OAAO;AACT,aAAO,MAAM,CAAC;AAAA,IAChB;AAAA,EACF;AACA,MAAI,CAAC,QAAQ,UAAU;AACrB,UAAM,oBAAoB,CAAC,aAAa;AACtC,iBAAW,OAAO,UAAU;AAC1B,YAAI,SAAS,GAAG,MAAM,WAAW;AAC/B,iBAAO;AAAA,QACT;AAAA,MACF;AAAA,IACF;AACA,WAAO,kBAAkB,SAAS,UAAU,KAAK,SAAS,UAAU;AAAA,MAClE,SAAS,OAAO,KAAK;AAAA,IAAA,KAClB,kBAAkB,SAAS,WAAW,UAAU;AAAA,EACvD;AACA,SAAO,OAAO,SAAS,IAAI,IAAI,SAAS,QAAQ;AAClD;AACA,SAAS,iBAAiB,OAAO;AAC/B,SAAO,WAAW,KAAK,KAAK,eAAe;AAC7C;AAEA,MAAM,WAAW,CAAC,iBAAiB,iBAAiB;AAClD,QAAMA,KAAI,WAAW,iBAAiB,cAAc,qBAAqB;AAOzE,SAAOA;AACT;AAEA,SAASiB,IAAE,MAAM,iBAAiB,UAAU;AAC1C,MAAI;AACF,qBAAiB,EAAE;AACnB,UAAMV,KAAI,UAAU;AACpB,QAAIA,OAAM,GAAG;AACX,UAAI,SAAS,eAAe,KAAK,CAAC,QAAQ,eAAe,GAAG;AAC1D,YAAI,QAAQ,eAAe,GAAG;AAC5B,iBAAO,YAAY,MAAM,MAAM,CAAC,eAAe,CAAC;AAAA,QAClD;AACA,eAAO,YAAY,MAAM,eAAe;AAAA,MAC1C,OAAO;AACL,eAAO,YAAY,MAAM,MAAM,eAAe;AAAA,MAChD;AAAA,IACF,OAAO;AACL,UAAIA,KAAI,GAAG;AACT,mBAAW,MAAM,UAAU,MAAM,KAAK,WAAW,CAAC;AAAA,MACpD,WAAWA,OAAM,KAAK,QAAQ,QAAQ,GAAG;AACvC,mBAAW,CAAC,QAAQ;AAAA,MACtB;AACA,aAAO,YAAY,MAAM,iBAAiB,QAAQ;AAAA,IACpD;AAAA,EACF,UAAA;AACE,qBAAiB,CAAC;AAAA,EACpB;AACF;AAgNA,MAAM,UAAU;ACx1QhB;AAAA;AAAA;AAAA;AAAA;AASA,IAAI,SAAS;AACb,MAAMmB,OAAK,OAAO,WAAW,eAAe,OAAO;AACnD,IAAIA,MAAI;AACN,MAAI;AACF,aAAyBA,qBAAG,aAAa,OAAO;AAAA,MAC9C,YAAY,CAAC,QAAQ;AAAA,IAAA,CACtB;AAAA,EACH,SAAS,GAAG;AAAA,EAEZ;AACF;AACA,MAAM,sBAAsB,SAAS,CAAC,QAAQ,OAAO,WAAW,GAAG,IAAI,CAAC,QAAQ;AAChF,MAAM,QAAQ;AACd,MAAM,WAAW;AACjB,MAAM,MAAM,OAAO,aAAa,cAAc,WAAW;AACzD,MAAM,oBAAoB,OAAuB,oBAAI,cAAc,UAAU;AAC7E,MAAM,UAAU;AAAA,EACd,QAAQ,CAAC,OAAO,QAAQ,WAAW;AACjC,WAAO,aAAa,OAAO,UAAU,IAAI;AAAA,EAC3C;AAAA,EACA,QAAQ,CAAC,UAAU;AACjB,UAAM,SAAS,MAAM;AACrB,QAAI,QAAQ;AACV,aAAO,YAAY,KAAK;AAAA,IAC1B;AAAA,EACF;AAAA,EACA,eAAe,CAAC,KAAK,WAAW,IAAI,UAAU;AAC5C,UAAM,KAAK,cAAc,QAAQ,IAAI,gBAAgB,OAAO,GAAG,IAAI,cAAc,WAAW,IAAI,gBAAgB,UAAU,GAAG,IAAI,KAAK,IAAI,cAAc,KAAK,EAAE,IAAI,IAAI,IAAI,cAAc,GAAG;AAC5L,QAAI,QAAQ,YAAY,SAAS,MAAM,YAAY,MAAM;AACvD,SAAG,aAAa,YAAY,MAAM,QAAQ;AAAA,IAC5C;AACA,WAAO;AAAA,EACT;AAAA,EACA,YAAY,CAAC,SAAS,IAAI,eAAe,IAAI;AAAA,EAC7C,eAAe,CAAC,SAAS,IAAI,cAAc,IAAI;AAAA,EAC/C,SAAS,CAAC,MAAM,SAAS;AACvB,SAAK,YAAY;AAAA,EACnB;AAAA,EACA,gBAAgB,CAAC,IAAI,SAAS;AAC5B,OAAG,cAAc;AAAA,EACnB;AAAA,EACA,YAAY,CAAC,SAAS,KAAK;AAAA,EAC3B,aAAa,CAAC,SAAS,KAAK;AAAA,EAC5B,eAAe,CAAC,aAAa,IAAI,cAAc,QAAQ;AAAA,EACvD,WAAW,IAAI,IAAI;AACjB,OAAG,aAAa,IAAI,EAAE;AAAA,EACxB;AAAA;AAAA;AAAA;AAAA;AAAA,EAKA,oBAAoB,SAAS,QAAQ,QAAQ,WAAW,OAAO,KAAK;AAClE,UAAM,SAAS,SAAS,OAAO,kBAAkB,OAAO;AACxD,QAAI,UAAU,UAAU,OAAO,MAAM,cAAc;AACjD,aAAO,MAAM;AACX,eAAO,aAAa,MAAM,UAAU,IAAI,GAAG,MAAM;AACjD,YAAI,UAAU,OAAO,EAAE,QAAQ,MAAM,aAAc;AAAA,MACrD;AAAA,IACF,OAAO;AACL,wBAAkB,YAAY;AAAA,QAC5B,cAAc,QAAQ,QAAQ,OAAO,WAAW,cAAc,WAAW,SAAS,OAAO,YAAY;AAAA,MAAA;AAEvG,YAAM,WAAW,kBAAkB;AACnC,UAAI,cAAc,SAAS,cAAc,UAAU;AACjD,cAAM,UAAU,SAAS;AACzB,eAAO,QAAQ,YAAY;AACzB,mBAAS,YAAY,QAAQ,UAAU;AAAA,QACzC;AACA,iBAAS,YAAY,OAAO;AAAA,MAC9B;AACA,aAAO,aAAa,UAAU,MAAM;AAAA,IACtC;AACA,WAAO;AAAA;AAAA,MAEL,SAAS,OAAO,cAAc,OAAO;AAAA;AAAA,MAErC,SAAS,OAAO,kBAAkB,OAAO;AAAA,IAAA;AAAA,EAE7C;AACF;AAEA,MAAM,aAAa;AACnB,MAAM,YAAY;AAClB,MAAM,gCAAgC,MAAM;AAC5C,MAAM,+BAA+B;AAAA,EACnC,MAAM;AAAA,EACN,MAAM;AAAA,EACN,KAAK;AAAA,IACH,MAAM;AAAA,IACN,SAAS;AAAA,EAAA;AAAA,EAEX,UAAU,CAAC,QAAQ,QAAQ,MAAM;AAAA,EACjC,gBAAgB;AAAA,EAChB,kBAAkB;AAAA,EAClB,cAAc;AAAA,EACd,iBAAiB;AAAA,EACjB,mBAAmB;AAAA,EACnB,eAAe;AAAA,EACf,gBAAgB;AAAA,EAChB,kBAAkB;AAAA,EAClB,cAAc;AAChB;AACA,MAAM,4BAA4C;AAAA,EAChD,CAAA;AAAA,EACA;AAAA,EACA;AACF;AACA,MAAM,aAAa,CAAC,MAAM;AACxB,IAAE,cAAc;AAChB,IAAE,QAAQ;AACV,SAAO;AACT;AACA,MAAM,aAA6B;AAAA,EACjC,CAAC,OAAO,EAAE,YAAYT,IAAE,gBAAgB,uBAAuB,KAAK,GAAG,KAAK;AAC9E;AACA,MAAM,WAAW,CAAC,MAAM,OAAO,OAAO;AACpC,MAAI,QAAQ,IAAI,GAAG;AACjB,SAAK,QAAQ,CAAC,OAAO,GAAG,GAAG,IAAI,CAAC;AAAA,EAClC,WAAW,MAAM;AACf,SAAK,GAAG,IAAI;AAAA,EACd;AACF;AACA,MAAM,sBAAsB,CAAC,SAAS;AACpC,SAAO,OAAO,QAAQ,IAAI,IAAI,KAAK,KAAK,CAAC,OAAO,GAAG,SAAS,CAAC,IAAI,KAAK,SAAS,IAAI;AACrF;AACA,SAAS,uBAAuB,UAAU;AACxC,QAAM,YAAY,CAAA;AAClB,aAAW,OAAO,UAAU;AAC1B,QAAI,EAAE,OAAO,+BAA+B;AAC1C,gBAAU,GAAG,IAAI,SAAS,GAAG;AAAA,IAC/B;AAAA,EACF;AACA,MAAI,SAAS,QAAQ,OAAO;AAC1B,WAAO;AAAA,EACT;AACA,QAAM;AAAA,IACJ,OAAO;AAAA,IACP;AAAA,IACA;AAAA,IACA,iBAAiB,GAAG,IAAI;AAAA,IACxB,mBAAmB,GAAG,IAAI;AAAA,IAC1B,eAAe,GAAG,IAAI;AAAA,IACtB,kBAAkB;AAAA,IAClB,oBAAoB;AAAA,IACpB,gBAAgB;AAAA,IAChB,iBAAiB,GAAG,IAAI;AAAA,IACxB,mBAAmB,GAAG,IAAI;AAAA,IAC1B,eAAe,GAAG,IAAI;AAAA,EAAA,IACpB;AACJ,QAAM,YAAY,kBAAkB,QAAQ;AAC5C,QAAM,gBAAgB,aAAa,UAAU,CAAC;AAC9C,QAAM,gBAAgB,aAAa,UAAU,CAAC;AAC9C,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,iBAAiB;AAAA,IACjB,WAAW;AAAA,IACX,oBAAoB;AAAA,EAAA,IAClB;AACJ,QAAM,cAAc,CAAC,IAAI,UAAU,MAAM,gBAAgB;AACvD,OAAG,kBAAkB;AACrB,0BAAsB,IAAI,WAAW,gBAAgB,YAAY;AACjE,0BAAsB,IAAI,WAAW,oBAAoB,gBAAgB;AACzE,YAAQ,KAAA;AAAA,EACV;AACA,QAAM,cAAc,CAAC,IAAI,SAAS;AAChC,OAAG,aAAa;AAChB,0BAAsB,IAAI,cAAc;AACxC,0BAAsB,IAAI,YAAY;AACtC,0BAAsB,IAAI,gBAAgB;AAC1C,YAAQ,KAAA;AAAA,EACV;AACA,QAAM,gBAAgB,CAAC,aAAa;AAClC,WAAO,CAAC,IAAI,SAAS;AACnB,YAAM,OAAO,WAAW,WAAW;AACnC,YAAMU,WAAU,MAAM,YAAY,IAAI,UAAU,IAAI;AACpD,eAAS,MAAM,CAAC,IAAIA,QAAO,CAAC;AAC5B,gBAAU,MAAM;AACd,8BAAsB,IAAI,WAAW,kBAAkB,cAAc;AACrE,2BAAmB,IAAI,WAAW,gBAAgB,YAAY;AAC9D,YAAI,CAAC,oBAAoB,IAAI,GAAG;AAC9B,6BAAmB,IAAI,MAAM,eAAeA,QAAO;AAAA,QACrD;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AACA,SAAO,OAAO,WAAW;AAAA,IACvB,cAAc,IAAI;AAChB,eAAS,eAAe,CAAC,EAAE,CAAC;AAC5B,yBAAmB,IAAI,cAAc;AACrC,yBAAmB,IAAI,gBAAgB;AAAA,IACzC;AAAA,IACA,eAAe,IAAI;AACjB,eAAS,gBAAgB,CAAC,EAAE,CAAC;AAC7B,yBAAmB,IAAI,eAAe;AACtC,yBAAmB,IAAI,iBAAiB;AAAA,IAC1C;AAAA,IACA,SAAS,cAAc,KAAK;AAAA,IAC5B,UAAU,cAAc,IAAI;AAAA,IAC5B,QAAQ,IAAI,MAAM;AAChB,SAAG,aAAa;AAChB,YAAMA,WAAU,MAAM,YAAY,IAAI,IAAI;AAC1C,yBAAmB,IAAI,cAAc;AACrC,UAAI,CAAC,GAAG,iBAAiB;AACvB,oBAAY,EAAE;AACd,2BAAmB,IAAI,gBAAgB;AAAA,MACzC,OAAO;AACL,2BAAmB,IAAI,gBAAgB;AACvC,oBAAY,EAAE;AAAA,MAChB;AACA,gBAAU,MAAM;AACd,YAAI,CAAC,GAAG,YAAY;AAClB;AAAA,QACF;AACA,8BAAsB,IAAI,cAAc;AACxC,2BAAmB,IAAI,YAAY;AACnC,YAAI,CAAC,oBAAoB,OAAO,GAAG;AACjC,6BAAmB,IAAI,MAAM,eAAeA,QAAO;AAAA,QACrD;AAAA,MACF,CAAC;AACD,eAAS,SAAS,CAAC,IAAIA,QAAO,CAAC;AAAA,IACjC;AAAA,IACA,iBAAiB,IAAI;AACnB,kBAAY,IAAI,OAAO,QAAQ,IAAI;AACnC,eAAS,kBAAkB,CAAC,EAAE,CAAC;AAAA,IACjC;AAAA,IACA,kBAAkB,IAAI;AACpB,kBAAY,IAAI,MAAM,QAAQ,IAAI;AAClC,eAAS,mBAAmB,CAAC,EAAE,CAAC;AAAA,IAClC;AAAA,IACA,iBAAiB,IAAI;AACnB,kBAAY,EAAE;AACd,eAAS,kBAAkB,CAAC,EAAE,CAAC;AAAA,IACjC;AAAA,EAAA,CACD;AACH;AACA,SAAS,kBAAkB,UAAU;AACnC,MAAI,YAAY,MAAM;AACpB,WAAO;AAAA,EACT,WAAW,SAAS,QAAQ,GAAG;AAC7B,WAAO,CAAC,SAAS,SAAS,KAAK,GAAG,SAAS,SAAS,KAAK,CAAC;AAAA,EAC5D,OAAO;AACL,UAAM,IAAI,SAAS,QAAQ;AAC3B,WAAO,CAAC,GAAG,CAAC;AAAA,EACd;AACF;AACA,SAAS,SAAS,KAAK;AACrB,QAAM,MAAM,SAAS,GAAG;AAIxB,SAAO;AACT;AACA,SAAS,mBAAmB,IAAI,KAAK;AACnC,MAAI,MAAM,KAAK,EAAE,QAAQ,CAAC3B,OAAMA,MAAK,GAAG,UAAU,IAAIA,EAAC,CAAC;AACxD,GAAC,GAAG,MAAM,MAAM,GAAG,MAAM,IAAoB,oBAAI,IAAA,IAAQ,IAAI,GAAG;AAClE;AACA,SAAS,sBAAsB,IAAI,KAAK;AACtC,MAAI,MAAM,KAAK,EAAE,QAAQ,CAACA,OAAMA,MAAK,GAAG,UAAU,OAAOA,EAAC,CAAC;AAC3D,QAAM,OAAO,GAAG,MAAM;AACtB,MAAI,MAAM;AACR,SAAK,OAAO,GAAG;AACf,QAAI,CAAC,KAAK,MAAM;AACd,SAAG,MAAM,IAAI;AAAA,IACf;AAAA,EACF;AACF;AACA,SAAS,UAAU,IAAI;AACrB,wBAAsB,MAAM;AAC1B,0BAAsB,EAAE;AAAA,EAC1B,CAAC;AACH;AACA,IAAI,QAAQ;AACZ,SAAS,mBAAmB,IAAI,cAAc,iBAAiB2B,UAAS;AACtE,QAAM,KAAK,GAAG,SAAS,EAAE;AACzB,QAAM,oBAAoB,MAAM;AAC9B,QAAI,OAAO,GAAG,QAAQ;AACpB,MAAAA,SAAA;AAAA,IACF;AAAA,EACF;AACA,MAAI,mBAAmB,MAAM;AAC3B,WAAO,WAAW,mBAAmB,eAAe;AAAA,EACtD;AACA,QAAM,EAAE,MAAM,SAAS,cAAc,kBAAkB,IAAI,YAAY;AACvE,MAAI,CAAC,MAAM;AACT,WAAOA,SAAA;AAAA,EACT;AACA,QAAM,WAAW,OAAO;AACxB,MAAI,QAAQ;AACZ,QAAM,MAAM,MAAM;AAChB,OAAG,oBAAoB,UAAU,KAAK;AACtC,sBAAA;AAAA,EACF;AACA,QAAM,QAAQ,CAAC,MAAM;AACnB,QAAI,EAAE,WAAW,MAAM,EAAE,SAAS,WAAW;AAC3C,UAAA;AAAA,IACF;AAAA,EACF;AACA,aAAW,MAAM;AACf,QAAI,QAAQ,WAAW;AACrB,UAAA;AAAA,IACF;AAAA,EACF,GAAG,UAAU,CAAC;AACd,KAAG,iBAAiB,UAAU,KAAK;AACrC;AACA,SAAS,kBAAkB,IAAI,cAAc;AAC3C,QAAM,SAAS,OAAO,iBAAiB,EAAE;AACzC,QAAM,qBAAqB,CAAC,SAAS,OAAO,GAAG,KAAK,IAAI,MAAM,IAAI;AAClE,QAAM,mBAAmB,mBAAmB,GAAG,UAAU,OAAO;AAChE,QAAM,sBAAsB,mBAAmB,GAAG,UAAU,UAAU;AACtE,QAAM,oBAAoB,WAAW,kBAAkB,mBAAmB;AAC1E,QAAM,kBAAkB,mBAAmB,GAAG,SAAS,OAAO;AAC9D,QAAM,qBAAqB,mBAAmB,GAAG,SAAS,UAAU;AACpE,QAAM,mBAAmB,WAAW,iBAAiB,kBAAkB;AACvE,MAAI,OAAO;AACX,MAAI,UAAU;AACd,MAAI,YAAY;AAChB,MAAI,iBAAiB,YAAY;AAC/B,QAAI,oBAAoB,GAAG;AACzB,aAAO;AACP,gBAAU;AACV,kBAAY,oBAAoB;AAAA,IAClC;AAAA,EACF,WAAW,iBAAiB,WAAW;AACrC,QAAI,mBAAmB,GAAG;AACxB,aAAO;AACP,gBAAU;AACV,kBAAY,mBAAmB;AAAA,IACjC;AAAA,EACF,OAAO;AACL,cAAU,KAAK,IAAI,mBAAmB,gBAAgB;AACtD,WAAO,UAAU,IAAI,oBAAoB,mBAAmB,aAAa,YAAY;AACrF,gBAAY,OAAO,SAAS,aAAa,oBAAoB,SAAS,mBAAmB,SAAS;AAAA,EACpG;AACA,QAAM,eAAe,SAAS,cAAc,6BAA6B;AAAA,IACvE,mBAAmB,GAAG,UAAU,UAAU,EAAE,SAAA;AAAA,EAAS;AAEvD,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA;AAEJ;AACA,SAAS,WAAW,QAAQ,WAAW;AACrC,SAAO,OAAO,SAAS,UAAU,QAAQ;AACvC,aAAS,OAAO,OAAO,MAAM;AAAA,EAC/B;AACA,SAAO,KAAK,IAAI,GAAG,UAAU,IAAI,CAACC,IAAG9B,OAAM,KAAK8B,EAAC,IAAI,KAAK,OAAO9B,EAAC,CAAC,CAAC,CAAC;AACvE;AACA,SAAS,KAAKG,IAAG;AACf,MAAIA,OAAM,OAAQ,QAAO;AACzB,SAAO,OAAOA,GAAE,MAAM,GAAG,EAAE,EAAE,QAAQ,KAAK,GAAG,CAAC,IAAI;AACpD;AACA,SAAS,YAAY,IAAI;AACvB,QAAM,iBAAiB,KAAK,GAAG,gBAAgB;AAC/C,SAAO,eAAe,KAAK;AAC7B;AAEA,SAAS,WAAW,IAAI,OAAO,OAAO;AACpC,QAAM,oBAAoB,GAAG,MAAM;AACnC,MAAI,mBAAmB;AACrB,aAAS,QAAQ,CAAC,OAAO,GAAG,iBAAiB,IAAI,CAAC,GAAG,iBAAiB,GAAG,KAAK,GAAG;AAAA,EACnF;AACA,MAAI,SAAS,MAAM;AACjB,OAAG,gBAAgB,OAAO;AAAA,EAC5B,WAAW,OAAO;AAChB,OAAG,aAAa,SAAS,KAAK;AAAA,EAChC,OAAO;AACL,OAAG,YAAY;AAAA,EACjB;AACF;AAEA,MAAM,8CAA8C,MAAM;AAC1D,MAAM,qCAAqC,MAAM;AACjD,MAAM,QAAQ;AAAA;AAAA,EAEZ,MAAM;AAAA,EACN,YAAY,IAAI,EAAE,SAAS,EAAE,cAAc;AACzC,OAAG,oBAAoB,IAAI,GAAG,MAAM,YAAY,SAAS,KAAK,GAAG,MAAM;AACvE,QAAI,cAAc,OAAO;AACvB,iBAAW,YAAY,EAAE;AAAA,IAC3B,OAAO;AACL,iBAAW,IAAI,KAAK;AAAA,IACtB;AAAA,EACF;AAAA,EACA,QAAQ,IAAI,EAAE,SAAS,EAAE,cAAc;AACrC,QAAI,cAAc,OAAO;AACvB,iBAAW,MAAM,EAAE;AAAA,IACrB;AAAA,EACF;AAAA,EACA,QAAQ,IAAI,EAAE,OAAO,YAAY,EAAE,cAAc;AAC/C,QAAI,CAAC,UAAU,CAAC,SAAU;AAC1B,QAAI,YAAY;AACd,UAAI,OAAO;AACT,mBAAW,YAAY,EAAE;AACzB,mBAAW,IAAI,IAAI;AACnB,mBAAW,MAAM,EAAE;AAAA,MACrB,OAAO;AACL,mBAAW,MAAM,IAAI,MAAM;AACzB,qBAAW,IAAI,KAAK;AAAA,QACtB,CAAC;AAAA,MACH;AAAA,IACF,OAAO;AACL,iBAAW,IAAI,KAAK;AAAA,IACtB;AAAA,EACF;AAAA,EACA,cAAc,IAAI,EAAE,SAAS;AAC3B,eAAW,IAAI,KAAK;AAAA,EACtB;AACF;AACA,SAAS,WAAW,IAAI,OAAO;AAC7B,KAAG,MAAM,UAAU,QAAQ,GAAG,oBAAoB,IAAI;AACtD,KAAG,WAAW,IAAI,CAAC;AACrB;AASA,MAAM,eAA+B,uBAAoE,EAAE;AAyE3G,MAAM,YAAY;AAClB,SAAS,WAAW,IAAI,MAAM,MAAM;AAClC,QAAMuB,SAAQ,GAAG;AACjB,QAAM,cAAc,SAAS,IAAI;AACjC,MAAI,uBAAuB;AAC3B,MAAI,QAAQ,CAAC,aAAa;AACxB,QAAI,MAAM;AACR,UAAI,CAAC,SAAS,IAAI,GAAG;AACnB,mBAAW,OAAO,MAAM;AACtB,cAAI,KAAK,GAAG,KAAK,MAAM;AACrB,qBAASA,QAAO,KAAK,EAAE;AAAA,UACzB;AAAA,QACF;AAAA,MACF,OAAO;AACL,mBAAW,aAAa,KAAK,MAAM,GAAG,GAAG;AACvC,gBAAM,MAAM,UAAU,MAAM,GAAG,UAAU,QAAQ,GAAG,CAAC,EAAE,KAAA;AACvD,cAAI,KAAK,GAAG,KAAK,MAAM;AACrB,qBAASA,QAAO,KAAK,EAAE;AAAA,UACzB;AAAA,QACF;AAAA,MACF;AAAA,IACF;AACA,eAAW,OAAO,MAAM;AACtB,UAAI,QAAQ,WAAW;AACrB,+BAAuB;AAAA,MACzB;AACA,eAASA,QAAO,KAAK,KAAK,GAAG,CAAC;AAAA,IAChC;AAAA,EACF,OAAO;AACL,QAAI,aAAa;AACf,UAAI,SAAS,MAAM;AACjB,cAAM,aAAaA,OAAM,YAAY;AACrC,YAAI,YAAY;AACd,kBAAQ,MAAM;AAAA,QAChB;AACA,QAAAA,OAAM,UAAU;AAChB,+BAAuB,UAAU,KAAK,IAAI;AAAA,MAC5C;AAAA,IACF,WAAW,MAAM;AACf,SAAG,gBAAgB,OAAO;AAAA,IAC5B;AAAA,EACF;AACA,MAAI,wBAAwB,IAAI;AAC9B,OAAG,oBAAoB,IAAI,uBAAuBA,OAAM,UAAU;AAClE,QAAI,GAAG,WAAW,GAAG;AACnB,MAAAA,OAAM,UAAU;AAAA,IAClB;AAAA,EACF;AACF;AAEA,MAAM,cAAc;AACpB,SAAS,SAASA,QAAO,MAAM,KAAK;AAClC,MAAI,QAAQ,GAAG,GAAG;AAChB,QAAI,QAAQ,CAACnB,OAAM,SAASmB,QAAO,MAAMnB,EAAC,CAAC;AAAA,EAC7C,OAAO;AACL,QAAI,OAAO,KAAM,OAAM;AAQvB,QAAI,KAAK,WAAW,IAAI,GAAG;AACzB,MAAAmB,OAAM,YAAY,MAAM,GAAG;AAAA,IAC7B,OAAO;AACL,YAAM,WAAW,WAAWA,QAAO,IAAI;AACvC,UAAI,YAAY,KAAK,GAAG,GAAG;AACzB,QAAAA,OAAM;AAAA,UACJ,UAAU,QAAQ;AAAA,UAClB,IAAI,QAAQ,aAAa,EAAE;AAAA,UAC3B;AAAA,QAAA;AAAA,MAEJ,OAAO;AACL,QAAAA,OAAM,QAAQ,IAAI;AAAA,MACpB;AAAA,IACF;AAAA,EACF;AACF;AACA,MAAM,WAAW,CAAC,UAAU,OAAO,IAAI;AACvC,MAAM,cAAc,CAAA;AACpB,SAAS,WAAWA,QAAO,SAAS;AAClC,QAAM,SAAS,YAAY,OAAO;AAClC,MAAI,QAAQ;AACV,WAAO;AAAA,EACT;AACA,MAAI,OAAO,SAAS,OAAO;AAC3B,MAAI,SAAS,YAAY,QAAQA,QAAO;AACtC,WAAO,YAAY,OAAO,IAAI;AAAA,EAChC;AACA,SAAO,WAAW,IAAI;AACtB,WAAS1B,KAAI,GAAGA,KAAI,SAAS,QAAQA,MAAK;AACxC,UAAM,WAAW,SAASA,EAAC,IAAI;AAC/B,QAAI,YAAY0B,QAAO;AACrB,aAAO,YAAY,OAAO,IAAI;AAAA,IAChC;AAAA,EACF;AACA,SAAO;AACT;AAEA,MAAM,UAAU;AAChB,SAAS,UAAU,IAAI,KAAK,OAAO,OAAO,UAAU,YAAY,qBAAqB,GAAG,GAAG;AACzF,MAAI,SAAS,IAAI,WAAW,QAAQ,GAAG;AACrC,QAAI,SAAS,MAAM;AACjB,SAAG,kBAAkB,SAAS,IAAI,MAAM,GAAG,IAAI,MAAM,CAAC;AAAA,IACxD,OAAO;AACL,SAAG,eAAe,SAAS,KAAK,KAAK;AAAA,IACvC;AAAA,EACF,OAAO;AACL,QAAI,SAAS,QAAQ,aAAa,CAAC,mBAAmB,KAAK,GAAG;AAC5D,SAAG,gBAAgB,GAAG;AAAA,IACxB,OAAO;AACL,SAAG;AAAA,QACD;AAAA,QACA,YAAY,KAAK,SAAS,KAAK,IAAI,OAAO,KAAK,IAAI;AAAA,MAAA;AAAA,IAEvD;AAAA,EACF;AACF;AAEA,SAAS,aAAa,IAAI,KAAK,OAAO,iBAAiB,UAAU;AAC/D,MAAI,QAAQ,eAAe,QAAQ,eAAe;AAChD,QAAI,SAAS,MAAM;AACjB,SAAG,GAAG,IAAI,QAAQ,cAAc,oBAAoB,KAAK,IAAI;AAAA,IAC/D;AACA;AAAA,EACF;AACA,QAAM,MAAM,GAAG;AACf,MAAI,QAAQ,WAAW,QAAQ;AAAA,EAC/B,CAAC,IAAI,SAAS,GAAG,GAAG;AAClB,UAAM,WAAW,QAAQ,WAAW,GAAG,aAAa,OAAO,KAAK,KAAK,GAAG;AACxE,UAAM,WAAW,SAAS;AAAA;AAAA;AAAA,MAGxB,GAAG,SAAS,aAAa,OAAO;AAAA,QAC9B,OAAO,KAAK;AAChB,QAAI,aAAa,YAAY,EAAE,YAAY,KAAK;AAC9C,SAAG,QAAQ;AAAA,IACb;AACA,QAAI,SAAS,MAAM;AACjB,SAAG,gBAAgB,GAAG;AAAA,IACxB;AACA,OAAG,SAAS;AACZ;AAAA,EACF;AACA,MAAI,aAAa;AACjB,MAAI,UAAU,MAAM,SAAS,MAAM;AACjC,UAAM,OAAO,OAAO,GAAG,GAAG;AAC1B,QAAI,SAAS,WAAW;AACtB,cAAQ,mBAAmB,KAAK;AAAA,IAClC,WAAW,SAAS,QAAQ,SAAS,UAAU;AAC7C,cAAQ;AACR,mBAAa;AAAA,IACf,WAAW,SAAS,UAAU;AAC5B,cAAQ;AACR,mBAAa;AAAA,IACf;AAAA,EACF;AACA,MAAI;AACF,OAAG,GAAG,IAAI;AAAA,EACZ,SAAS,GAAG;AAAA,EAOZ;AACA,gBAAc,GAAG,gBAAgB,YAAY,GAAG;AAClD;AAEA,SAAS,iBAAiB,IAAI,OAAO,SAAS,SAAS;AACrD,KAAG,iBAAiB,OAAO,SAAS,OAAO;AAC7C;AACA,SAAS,oBAAoB,IAAI,OAAO,SAAS,SAAS;AACxD,KAAG,oBAAoB,OAAO,SAAS,OAAO;AAChD;AACA,MAAM,gCAAgC,MAAM;AAC5C,SAAS,WAAW,IAAI,SAAS,WAAW,WAAW,WAAW,MAAM;AACtE,QAAM,WAAW,GAAG,MAAM,MAAM,GAAG,MAAM,IAAI;AAC7C,QAAM,kBAAkB,SAAS,OAAO;AACxC,MAAI,aAAa,iBAAiB;AAChC,oBAAgB,QAA6F;AAAA,EAC/G,OAAO;AACL,UAAM,CAAC,MAAM,OAAO,IAAI,UAAU,OAAO;AACzC,QAAI,WAAW;AACb,YAAM,UAAU,SAAS,OAAO,IAAI;AAAA,QACmD;AAAA,QACrF;AAAA,MAAA;AAEF,uBAAiB,IAAI,MAAM,SAAS,OAAO;AAAA,IAC7C,WAAW,iBAAiB;AAC1B,0BAAoB,IAAI,MAAM,iBAAiB,OAAO;AACtD,eAAS,OAAO,IAAI;AAAA,IACtB;AAAA,EACF;AACF;AACA,MAAM,oBAAoB;AAC1B,SAAS,UAAU,MAAM;AACvB,MAAI;AACJ,MAAI,kBAAkB,KAAK,IAAI,GAAG;AAChC,cAAU,CAAA;AACV,QAAIN;AACJ,WAAOA,KAAI,KAAK,MAAM,iBAAiB,GAAG;AACxC,aAAO,KAAK,MAAM,GAAG,KAAK,SAASA,GAAE,CAAC,EAAE,MAAM;AAC9C,cAAQA,GAAE,CAAC,EAAE,YAAA,CAAa,IAAI;AAAA,IAChC;AAAA,EACF;AACA,QAAM,QAAQ,KAAK,CAAC,MAAM,MAAM,KAAK,MAAM,CAAC,IAAI,UAAU,KAAK,MAAM,CAAC,CAAC;AACvE,SAAO,CAAC,OAAO,OAAO;AACxB;AACA,IAAI,YAAY;AAChB,MAAM,4BAA4B,QAAA;AAClC,MAAM,SAAS,MAAM,cAAc,EAAE,KAAK,MAAM,YAAY,CAAC,GAAG,YAAY,KAAK,IAAA;AACjF,SAAS,cAAc,cAAc,UAAU;AAC7C,QAAM,UAAU,CAAC,MAAM;AACrB,QAAI,CAAC,EAAE,MAAM;AACX,QAAE,OAAO,KAAK,IAAA;AAAA,IAChB,WAAW,EAAE,QAAQ,QAAQ,UAAU;AACrC;AAAA,IACF;AACA;AAAA,MACE,8BAA8B,GAAG,QAAQ,KAAK;AAAA,MAC9C;AAAA,MACA;AAAA,MACA,CAAC,CAAC;AAAA,IAAA;AAAA,EAEN;AACA,UAAQ,QAAQ;AAChB,UAAQ,WAAW,OAAA;AACnB,SAAO;AACT;AAWA,SAAS,8BAA8B,GAAG,OAAO;AAC/C,MAAI,QAAQ,KAAK,GAAG;AAClB,UAAM,eAAe,EAAE;AACvB,MAAE,2BAA2B,MAAM;AACjC,mBAAa,KAAK,CAAC;AACnB,QAAE,WAAW;AAAA,IACf;AACA,WAAO,MAAM;AAAA,MACX,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,YAAY,MAAM,GAAG,EAAE;AAAA,IAAA;AAAA,EAE/C,OAAO;AACL,WAAO;AAAA,EACT;AACF;AAEA,MAAM,aAAa,CAAC,QAAQ,IAAI,WAAW,CAAC,MAAM,OAAO,IAAI,WAAW,CAAC,MAAM;AAC/E,IAAI,WAAW,CAAC,IAAI,MAAM,IAAI,WAAW,CAAC,IAAI;AAC9C,MAAM,YAAY,CAAC,IAAI,KAAK,WAAW,WAAW,WAAW,oBAAoB;AAC/E,QAAM,QAAQ,cAAc;AAC5B,MAAI,QAAQ,SAAS;AACnB,eAAW,IAAI,WAAW,KAAK;AAAA,EACjC,WAAW,QAAQ,SAAS;AAC1B,eAAW,IAAI,WAAW,SAAS;AAAA,EACrC,WAAW,KAAK,GAAG,GAAG;AACpB,QAAI,CAAC,gBAAgB,GAAG,GAAG;AACzB,iBAAW,IAAI,KAAK,WAAW,WAAW,eAAe;AAAA,IAC3D;AAAA,EACF,WAAW,IAAI,CAAC,MAAM,OAAO,MAAM,IAAI,MAAM,CAAC,GAAG,QAAQ,IAAI,CAAC,MAAM,OAAO,MAAM,IAAI,MAAM,CAAC,GAAG,SAAS,gBAAgB,IAAI,KAAK,WAAW,KAAK,GAAG;AAClJ,iBAAa,IAAI,KAAK,SAAS;AAC/B,QAAI,CAAC,GAAG,QAAQ,SAAS,GAAG,MAAM,QAAQ,WAAW,QAAQ,aAAa,QAAQ,aAAa;AAC7F,gBAAU,IAAI,KAAK,WAAW,OAAO,iBAAiB,QAAQ,OAAO;AAAA,IACvE;AAAA,EACF;AAAA;AAAA,IAEE,GAAG,aAAa,QAAQ,KAAK,GAAG,KAAK,CAAC,SAAS,SAAS;AAAA,IACxD;AACA,iBAAa,IAAIW,SAAW,GAAG,GAAG,WAAW,iBAAiB,GAAG;AAAA,EACnE,OAAO;AACL,QAAI,QAAQ,cAAc;AACxB,SAAG,aAAa;AAAA,IAClB,WAAW,QAAQ,eAAe;AAChC,SAAG,cAAc;AAAA,IACnB;AACA,cAAU,IAAI,KAAK,WAAW,KAAK;AAAA,EACrC;AACF;AACA,SAAS,gBAAgB,IAAI,KAAK,OAAO,OAAO;AAC9C,MAAI,OAAO;AACT,QAAI,QAAQ,eAAe,QAAQ,eAAe;AAChD,aAAO;AAAA,IACT;AACA,QAAI,OAAO,MAAM,WAAW,GAAG,KAAK,WAAW,KAAK,GAAG;AACrD,aAAO;AAAA,IACT;AACA,WAAO;AAAA,EACT;AACA,MAAI,QAAQ,gBAAgB,QAAQ,eAAe,QAAQ,eAAe,QAAQ,eAAe;AAC/F,WAAO;AAAA,EACT;AACA,MAAI,QAAQ,aAAa,GAAG,YAAY,UAAU;AAChD,WAAO;AAAA,EACT;AACA,MAAI,QAAQ,QAAQ;AAClB,WAAO;AAAA,EACT;AACA,MAAI,QAAQ,UAAU,GAAG,YAAY,SAAS;AAC5C,WAAO;AAAA,EACT;AACA,MAAI,QAAQ,UAAU,GAAG,YAAY,YAAY;AAC/C,WAAO;AAAA,EACT;AACA,MAAI,QAAQ,WAAW,QAAQ,UAAU;AACvC,UAAM,MAAM,GAAG;AACf,QAAI,QAAQ,SAAS,QAAQ,WAAW,QAAQ,YAAY,QAAQ,UAAU;AAC5E,aAAO;AAAA,IACT;AAAA,EACF;AACA,MAAI,WAAW,GAAG,KAAK,SAAS,KAAK,GAAG;AACtC,WAAO;AAAA,EACT;AACA,SAAO,OAAO;AAChB;AAwnBA,MAAM,mBAAmB,CAAC,UAAU;AAClC,QAAM,KAAK,MAAM,MAAM,qBAAqB,KAAK;AACjD,SAAO,QAAQ,EAAE,IAAI,CAAC,UAAU,eAAe,IAAI,KAAK,IAAI;AAC9D;AACA,SAAS,mBAAmB,GAAG;AAC7B,IAAE,OAAO,YAAY;AACvB;AACA,SAAS,iBAAiB,GAAG;AAC3B,QAAM,SAAS,EAAE;AACjB,MAAI,OAAO,WAAW;AACpB,WAAO,YAAY;AACnB,WAAO,cAAc,IAAI,MAAM,OAAO,CAAC;AAAA,EACzC;AACF;AACA,MAAM,mCAAmC,SAAS;AAClD,SAAS,UAAU,OAAO,MAAM,QAAQ;AACtC,MAAI,KAAM,SAAQ,MAAM,KAAA;AACxB,MAAI,OAAQ,SAAQ,cAAc,KAAK;AACvC,SAAO;AACT;AACA,MAAM,aAAa;AAAA,EACjB,QAAQ,IAAI,EAAE,WAAW,EAAE,MAAM,MAAM,SAAO,GAAK,OAAO;AACxD,OAAG,SAAS,IAAI,iBAAiB,KAAK;AACtC,UAAM,eAAe,UAAU,MAAM,SAAS,MAAM,MAAM,SAAS;AACnE,qBAAiB,IAAI,OAAO,WAAW,SAAS,CAAC,MAAM;AACrD,UAAI,EAAE,OAAO,UAAW;AACxB,SAAG,SAAS,EAAE,UAAU,GAAG,OAAO,MAAM,YAAY,CAAC;AAAA,IACvD,CAAC;AACD,QAAI,QAAQ,cAAc;AACxB,uBAAiB,IAAI,UAAU,MAAM;AACnC,WAAG,QAAQ,UAAU,GAAG,OAAO,MAAM,YAAY;AAAA,MACnD,CAAC;AAAA,IACH;AACA,QAAI,CAAC,MAAM;AACT,uBAAiB,IAAI,oBAAoB,kBAAkB;AAC3D,uBAAiB,IAAI,kBAAkB,gBAAgB;AACvD,uBAAiB,IAAI,UAAU,gBAAgB;AAAA,IACjD;AAAA,EACF;AAAA;AAAA,EAEA,QAAQ,IAAI,EAAE,SAAS;AACrB,OAAG,QAAQ,SAAS,OAAO,KAAK;AAAA,EAClC;AAAA,EACA,aAAa,IAAI,EAAE,OAAO,UAAU,WAAW,EAAE,MAAM,MAAM,OAAA,EAAO,GAAK,OAAO;AAC9E,OAAG,SAAS,IAAI,iBAAiB,KAAK;AACtC,QAAI,GAAG,UAAW;AAClB,UAAM,WAAW,UAAU,GAAG,SAAS,aAAa,CAAC,OAAO,KAAK,GAAG,KAAK,IAAI,cAAc,GAAG,KAAK,IAAI,GAAG;AAC1G,UAAM,WAAW,SAAS,OAAO,KAAK;AACtC,QAAI,YAAY,UAAU;AACxB;AAAA,IACF;AACA,QAAI,SAAS,kBAAkB,MAAM,GAAG,SAAS,SAAS;AACxD,UAAI,QAAQ,UAAU,UAAU;AAC9B;AAAA,MACF;AACA,UAAI,QAAQ,GAAG,MAAM,KAAA,MAAW,UAAU;AACxC;AAAA,MACF;AAAA,IACF;AACA,OAAG,QAAQ;AAAA,EACb;AACF;AAwDA,MAAM,cAAc;AAAA,EAClB,QAAQ,IAAI,EAAE,MAAA,GAAS,OAAO;AAC5B,OAAG,UAAU,WAAW,OAAO,MAAM,MAAM,KAAK;AAChD,OAAG,SAAS,IAAI,iBAAiB,KAAK;AACtC,qBAAiB,IAAI,UAAU,MAAM;AACnC,SAAG,SAAS,EAAE,SAAS,EAAE,CAAC;AAAA,IAC5B,CAAC;AAAA,EACH;AAAA,EACA,aAAa,IAAI,EAAE,OAAO,SAAA,GAAY,OAAO;AAC3C,OAAG,SAAS,IAAI,iBAAiB,KAAK;AACtC,QAAI,UAAU,UAAU;AACtB,SAAG,UAAU,WAAW,OAAO,MAAM,MAAM,KAAK;AAAA,IAClD;AAAA,EACF;AACF;AAkEA,SAAS,SAAS,IAAI;AACpB,SAAO,YAAY,KAAK,GAAG,SAAS,GAAG;AACzC;AA+EA,MAAM,kBAAkB,CAAC,QAAQ,SAAS,OAAO,MAAM;AACvD,MAAM,iBAAiB;AAAA,EACrB,MAAM,CAAC,MAAM,EAAE,gBAAA;AAAA,EACf,SAAS,CAAC,MAAM,EAAE,eAAA;AAAA,EAClB,MAAM,CAAC,MAAM,EAAE,WAAW,EAAE;AAAA,EAC5B,MAAM,CAAC,MAAM,CAAC,EAAE;AAAA,EAChB,OAAO,CAAC,MAAM,CAAC,EAAE;AAAA,EACjB,KAAK,CAAC,MAAM,CAAC,EAAE;AAAA,EACf,MAAM,CAAC,MAAM,CAAC,EAAE;AAAA,EAChB,MAAM,CAAC,MAAM,YAAY,KAAK,EAAE,WAAW;AAAA,EAC3C,QAAQ,CAAC,MAAM,YAAY,KAAK,EAAE,WAAW;AAAA,EAC7C,OAAO,CAAC,MAAM,YAAY,KAAK,EAAE,WAAW;AAAA,EAC5C,OAAO,CAAC,GAAG,cAAc,gBAAgB,KAAK,CAACX,OAAM,EAAE,GAAGA,EAAC,KAAK,KAAK,CAAC,UAAU,SAASA,EAAC,CAAC;AAC7F;AACA,MAAM,gBAAgB,CAAC,IAAI,cAAc;AACvC,QAAM,QAAQ,GAAG,cAAc,GAAG,YAAY,CAAA;AAC9C,QAAM,WAAW,UAAU,KAAK,GAAG;AACnC,SAAO,MAAM,QAAQ,MAAM,MAAM,QAAQ,KAAK,CAAC,UAAU,SAAS;AAChE,aAASpB,KAAI,GAAGA,KAAI,UAAU,QAAQA,MAAK;AACzC,YAAM,QAAQ,eAAe,UAAUA,EAAC,CAAC;AACzC,UAAI,SAAS,MAAM,OAAO,SAAS,EAAG;AAAA,IACxC;AACA,WAAO,GAAG,OAAO,GAAG,IAAI;AAAA,EAC1B;AACF;AACA,MAAM,WAAW;AAAA,EACf,KAAK;AAAA,EACL,OAAO;AAAA,EACP,IAAI;AAAA,EACJ,MAAM;AAAA,EACN,OAAO;AAAA,EACP,MAAM;AAAA,EACN,QAAQ;AACV;AACA,MAAM,WAAW,CAAC,IAAI,cAAc;AAClC,QAAM,QAAQ,GAAG,cAAc,GAAG,YAAY,CAAA;AAC9C,QAAM,WAAW,UAAU,KAAK,GAAG;AACnC,SAAO,MAAM,QAAQ,MAAM,MAAM,QAAQ,KAAK,CAAC,UAAU;AACvD,QAAI,EAAE,SAAS,QAAQ;AACrB;AAAA,IACF;AACA,UAAM,WAAW,UAAU,MAAM,GAAG;AACpC,QAAI,UAAU;AAAA,MACZ,CAACgC,OAAMA,OAAM,YAAY,SAASA,EAAC,MAAM;AAAA,IAAA,GACxC;AACD,aAAO,GAAG,KAAK;AAAA,IACjB;AAAA,EACF;AACF;AAEA,MAAM,kBAAkC,uBAAO,EAAE,UAAA,GAAa,OAAO;AACrE,IAAI;AAEJ,SAAS,iBAAiB;AACxB,SAAO,aAAa,WAAW,eAAe,eAAe;AAC/D;AAYA,MAAM,aAAa,IAAI,SAAS;AAC9B,QAAMV,OAAM,eAAA,EAAiB,UAAU,GAAG,IAAI;AAK9C,QAAM,EAAE,UAAUA;AAClB,EAAAA,KAAI,QAAQ,CAAC,wBAAwB;AACnC,UAAM,YAAY,mBAAmB,mBAAmB;AACxD,QAAI,CAAC,UAAW;AAChB,UAAM,YAAYA,KAAI;AACtB,QAAI,CAAC,WAAW,SAAS,KAAK,CAAC,UAAU,UAAU,CAAC,UAAU,UAAU;AACtE,gBAAU,WAAW,UAAU;AAAA,IACjC;AACA,QAAI,UAAU,aAAa,GAAG;AAC5B,gBAAU,cAAc;AAAA,IAC1B;AACA,UAAM,QAAQ,MAAM,WAAW,OAAO,qBAAqB,SAAS,CAAC;AACrE,QAAI,qBAAqB,SAAS;AAChC,gBAAU,gBAAgB,SAAS;AACnC,gBAAU,aAAa,cAAc,EAAE;AAAA,IACzC;AACA,WAAO;AAAA,EACT;AACA,SAAOA;AACT;AAgBA,SAAS,qBAAqB,WAAW;AACvC,MAAI,qBAAqB,YAAY;AACnC,WAAO;AAAA,EACT;AACA,MAAI,OAAO,kBAAkB,cAAc,qBAAqB,eAAe;AAC7E,WAAO;AAAA,EACT;AACF;AAoCA,SAAS,mBAAmB,WAAW;AACrC,MAAI,SAAS,SAAS,GAAG;AACvB,UAAM,MAAM,SAAS,cAAc,SAAS;AAM5C,WAAO;AAAA,EACT;AAMA,SAAO;AACT;ACp3DA,IAAIW,OAAG,OAAO;AAAe,IAAI,IAAE,OAAO;AAAsB,IAAI,KAAG,OAAO,UAAU,gBAAeC,OAAG,OAAO,UAAU;AAAqB,IAAIC,MAAE,CAAC,GAAE,GAAE,MAAI,KAAK,IAAEF,KAAG,GAAE,GAAE,EAAC,YAAW,MAAG,cAAa,MAAG,UAAS,MAAG,OAAM,EAAC,CAAC,IAAE,EAAE,CAAC,IAAE,GAAE,IAAE,CAAC,GAAE,MAAI;AAAC,WAAQ,KAAK,MAAI,IAAE,CAAA,GAAI,IAAG,KAAK,GAAE,CAAC,KAAGE,IAAE,GAAE,GAAE,EAAE,CAAC,CAAC;AAAE,MAAG,EAAE,UAAQ,KAAK,EAAE,CAAC,EAAED,MAAG,KAAK,GAAE,CAAC,KAAGC,IAAE,GAAE,GAAE,EAAE,CAAC,CAAC;AAAE,SAAO;AAAC;AAAE,SAAS,EAAE,GAAE;AAAC,SAAO,KAAG,QAAM,MAAI,MAAI,MAAM,QAAQ,CAAC,KAAG,EAAE,WAAS,KAAG,EAAE,aAAa,SAAO,OAAO,KAAG,YAAU,OAAO,KAAK,CAAC,EAAE,WAAS;AAAC;AAA43B,SAASjC,IAAE,GAAE;AAAC,SAAO,OAAO,KAAG,cAAY,UAAS,KAAG,WAAU;AAAC;AAAC,SAASC,IAAE,GAAE;AAAC,SAAM,CAAC,EAAE,CAAC;AAAC;AAAuZ,SAAS,EAAE,GAAE,IAAE,MAAG;AAAC,SAAO,aAAa,UAAQ,EAAE,gBAAc,WAAS,KAAG,OAAO,KAAK,CAAC,EAAE,WAAS;AAAE;AAAC,SAASiC,IAAE,IAAE,IAAG,IAAE,CAAA,GAAG;AAAC,MAAI,IAAE,EAAE,CAAA,GAAG,CAAC;AAAE,SAAO,OAAO,KAAK,CAAC,EAAE,QAAQ,OAAG;AAAC,QAAI,IAAE;AAAE,MAAE,EAAE,CAAC,CAAC,KAAG,KAAK,KAAG,EAAE,EAAE,CAAC,CAAC,IAAE,EAAE,CAAC,IAAEA,IAAE,EAAE,CAAC,GAAE,EAAE,CAAC,CAAC,IAAE,EAAE,CAAC,IAAE,EAAE,CAAC;AAAA,EAAC,CAAC,GAAE;AAAC;AAAC,SAAS,KAAK,GAAE;AAAC,SAAO,EAAE,OAAO,CAAC,GAAE,GAAE,MAAI,MAAI,IAAE,IAAEA,IAAE,GAAE,CAAC,GAAE,CAAA,CAAE;AAAC;AAAuc,SAAS,EAAE,MAAK,GAAE;AAAC,SAAOlC,IAAE,CAAC,IAAE,EAAE,GAAG,CAAC,IAAE;AAAC;AAAC,SAAS,EAAE,GAAE,IAAE,MAAG;AAAC,SAAO,OAAO,KAAG,aAAW,KAAG,MAAI;AAAG;AAAshB,SAAS,EAAE,GAAE;AAAC,SAAOC,IAAE,CAAC,KAAG,CAAC,MAAM,CAAC;AAAC;AAAkP,SAAS,EAAE,GAAE,GAAE;AAAC,MAAG,GAAE;AAAC,QAAI,IAAE,EAAE,KAAK,CAAC;AAAE,WAAO,EAAE,YAAU,GAAE;AAAA,EAAC;AAAC,SAAM;AAAE;AAAC,SAAS,KAAK,GAAE;AAAC,SAAO,EAAE,GAAG,CAAC;AAAC;AAAC,SAASkC,IAAE,GAAE;AAAC,SAAO,KAAG,EAAE,QAAQ,0CAAyC,EAAE,EAAE,QAAQ,UAAS,GAAG,EAAE,QAAQ,cAAa,IAAI,EAAE,QAAQ,YAAW,IAAI,EAAE,QAAQ,OAAM,GAAG,EAAE,QAAQ,OAAM,GAAG,EAAE,KAAI;AAAE;AAGzlH,SAAS,GAAG,GAAE;AAAC,SAAO,EAAE,CAAC,IAAE,EAAE,QAAQ,QAAO,GAAG,EAAE,QAAQ,mBAAkB,OAAO,EAAE,YAAW,IAAG;AAAC;ACH1Q,SAAS,IAAG;AAAC,MAAI,IAAE,oBAAI;AAAI,SAAM,EAAC,GAAG,GAAE,GAAE;AAAC,QAAI,IAAE,EAAE,IAAI,CAAC;AAAE,WAAO,IAAE,EAAE,KAAK,CAAC,IAAE,IAAE,CAAC,CAAC,GAAE,EAAE,IAAI,GAAE,CAAC,GAAE;AAAA,EAAI,GAAE,IAAI,GAAE,GAAE;AAAC,QAAI,IAAE,EAAE,IAAI,CAAC;AAAE,WAAO,KAAG,EAAE,OAAO,EAAE,QAAQ,CAAC,MAAI,GAAE,CAAC,GAAE;AAAA,EAAI,GAAE,KAAK,GAAE,GAAE;AAAC,QAAI,IAAE,EAAE,IAAI,CAAC;AAAE,SAAG,EAAE,QAAQ,CAAArC,OAAG;AAAC,MAAAA,GAAE,CAAC;AAAA,IAAC,CAAC;AAAA,EAAC,GAAE,QAAO;AAAC,MAAE,MAAK;AAAA,EAAE,EAAC;AAAC;ACAk2H,SAAS,EAAE,GAAE;AAAC,MAAG,GAAE;AAAC,QAAI,IAAE,EAAE;AAAW,WAAO,KAAG,aAAa,cAAY,EAAE,SAAO,IAAE,EAAE,OAAM;AAAA,EAAC;AAAC,SAAO;AAAI;AAAC,SAAS,EAAE,GAAE;AAAC,SAAM,CAAC,EAAE,MAAI,QAAM,OAAO,KAAG,eAAa,EAAE,YAAU,EAAE,CAAC;AAAE;AAAC,SAAS,EAAE,GAAE;AAAC,SAAO,OAAO,WAAS,cAAY,aAAa,UAAQ,MAAI,QAAM,OAAO,KAAG,YAAU,EAAE,aAAW,KAAG,OAAO,EAAE,YAAU;AAAQ;AAA8nE,SAAS,EAAE,GAAE,IAAE,CAAA,GAAG;AAAC,MAAG,EAAE,CAAC,GAAE;AAAC,QAAI,IAAE,CAAC,GAAE,MAAI;AAAC,UAAIS,IAAEqB;AAAE,UAAI9B,MAAGS,KAAE,KAAG,OAAK,SAAO,EAAE,WAAS,QAAMA,GAAE,CAAC,IAAE,EAAEqB,KAAE,KAAG,OAAK,SAAO,EAAE,WAAS,OAAK,SAAOA,GAAE,CAAC,CAAC,IAAE;AAAG,aAAM,CAAC,CAAC,EAAE,KAAI,EAAG,OAAO,CAAC3B,IAAEC,OAAI;AAAC,YAAGA,MAAG,MAAK;AAAC,cAAI,IAAE,OAAOA;AAAE,cAAG,MAAI,YAAU,MAAI,SAAS,CAAAD,GAAE,KAAKC,EAAC;AAAA,mBAAU,MAAI,UAAS;AAAC,gBAAIW,KAAE,MAAM,QAAQX,EAAC,IAAE,EAAE,GAAEA,EAAC,IAAE,OAAO,QAAQA,EAAC,EAAE,IAAI,CAAC,CAAC,GAAE,CAAC,MAAI,MAAI,YAAU,KAAG,MAAI,KAAG,GAAG,EAAE,QAAQ,mBAAkB,OAAO,EAAE,YAAW,CAAE,IAAI,CAAC,KAAG,IAAE,IAAE,MAAM;AAAE,YAAAD,KAAEY,GAAE,SAAOZ,GAAE,OAAOY,GAAE,OAAO,OAAG,CAAC,CAAC,CAAC,CAAC,IAAEZ;AAAA,UAAC;AAAA,QAAC;AAAC,eAAOA;AAAA,MAAC,GAAEH,EAAC;AAAA,IAAC;AAAE,WAAO,QAAQ,CAAC,EAAE,QAAQ,CAAC,CAAC,GAAE,CAAC,MAAI;AAAC,UAAG,KAAG,MAAK;AAAC,YAAIA,KAAE,EAAE,MAAM,SAAS;AAAE,QAAAA,KAAE,EAAE,iBAAiBA,GAAE,CAAC,EAAE,YAAW,GAAG,CAAC,IAAE,MAAI,YAAU,MAAI,UAAQ,EAAE,GAAE,CAAC,KAAG,IAAE,MAAI,UAAQ,CAAC,GAAG,IAAI,IAAI,EAAE,SAAQ,CAAC,CAAC,CAAC,EAAE,KAAK,GAAG,EAAE,KAAI,IAAG,MAAI,UAAQ,EAAE,SAAQ,CAAC,EAAE,KAAK,GAAG,EAAE,KAAI,IAAG,IAAG,EAAE,SAAO,EAAE,UAAQ,CAAA,OAAM,EAAE,OAAO,CAAC,IAAE,IAAG,EAAE,aAAa,GAAE,CAAC;AAAA,MAAE;AAAA,IAAC,CAAC;AAAA,EAAC;AAAC;AAM7wH,SAAS,KAAI;AAAC,SAAM,CAAC,EAAE,OAAO,UAAQ,eAAa,OAAO,YAAU,OAAO,SAAS;AAAc;AAMz2D,SAAS,GAAG,GAAE,IAAE,IAAG,GAAE;AAAC,IAAE,CAAC,KAAG,MAAI,QAAM,MAAI,UAAQ,EAAE,aAAa,GAAE,CAAC;AAAC;ACZh2D,IAAI,KAAG,OAAO,gBAAe,KAAG,OAAO;AAAiB,IAAI,KAAG,OAAO;AAA0B,IAAI,IAAE,OAAO;AAAsB,IAAI,KAAG,OAAO,UAAU,gBAAe,KAAG,OAAO,UAAU;AAAqB,IAAI,KAAG,CAAC,GAAE,GAAE,MAAI,KAAK,IAAE,GAAG,GAAE,GAAE,EAAC,YAAW,MAAG,cAAa,MAAG,UAAS,MAAG,OAAM,EAAC,CAAC,IAAE,EAAE,CAAC,IAAE,GAAE,IAAE,CAAC,GAAE,MAAI;AAAC,WAAQ,KAAK,MAAI,IAAE,CAAA,GAAI,IAAG,KAAK,GAAE,CAAC,KAAG,GAAG,GAAE,GAAE,EAAE,CAAC,CAAC;AAAE,MAAG,EAAE,UAAQ,KAAK,EAAE,CAAC,EAAE,IAAG,KAAK,GAAE,CAAC,KAAG,GAAG,GAAE,GAAE,EAAE,CAAC,CAAC;AAAE,SAAO;AAAC,GAAE,IAAE,CAAC,GAAE,MAAI,GAAG,GAAE,GAAG,CAAC,CAAC;AAAE,IAAI,IAAE,CAAC,GAAE,MAAI;AAAC,MAAI,IAAE;AAAG,WAAQG,MAAK,EAAE,IAAG,KAAK,GAAEA,EAAC,KAAG,EAAE,QAAQA,EAAC,IAAE,MAAI,EAAEA,EAAC,IAAE,EAAEA,EAAC;AAAG,MAAG,KAAG,QAAM,EAAE,UAAQA,MAAK,EAAE,CAAC,EAAE,GAAE,QAAQA,EAAC,IAAE,KAAG,GAAG,KAAK,GAAEA,EAAC,MAAI,EAAEA,EAAC,IAAE,EAAEA,EAAC;AAAG,SAAO;AAAC;AAAiM,IAAI,KAAGmC,EAAE,GAAG,IAAE;AAAsK,IAAI,IAAE,cAAa,KAAG,6BAA4B,KAAG;AAAgB,SAAS,GAAG,GAAE;AAAC,SAAOC,EAAE,CAAC,IAAE,EAAE,QAAQ,UAAS,CAAC,GAAE,MAAI,MAAI,IAAE,IAAE,MAAI,EAAE,YAAW,CAAE,EAAE,YAAW,IAAG;AAAC;AAAmE,SAAS,GAAG,GAAE;AAAC,SAAOC,EAAG,CAAC,KAAG,EAAE,eAAe,QAAQ,KAAG,EAAE,eAAe,OAAO,IAAE,EAAE,SAAO;AAAC;AAA2M,SAAS,GAAG,GAAE;AAAC,SAAO,EAAE,WAAW,MAAK,EAAE,EAAE,QAAQ,UAAS,GAAG;AAAC;AAAC,SAAS,EAAE,IAAE,IAAG,IAAE,IAAG;AAAC,SAAO,GAAG,GAAGD,EAAE,GAAE,KAAE,KAAGA,EAAE,GAAE,KAAE,IAAE,GAAG,CAAC,MAAI,CAAC,GAAG,CAAC,EAAE;AAAC;AAAC,SAAS,GAAG,IAAE,IAAG,IAAE,IAAG;AAAC,SAAM,KAAK,EAAE,GAAE,CAAC,CAAC;AAAE;AAAC,SAAS,GAAG,IAAE,IAAG;AAAC,MAAI,KAAG,EAAE,MAAM,IAAI,KAAG,CAAA,GAAI,QAAO,KAAG,EAAE,MAAM,IAAI,KAAG,CAAA,GAAI;AAAO,UAAO,IAAE,KAAG,MAAI;AAAC;AAAC,SAAS,EAAE,GAAE,IAAE,IAAG,IAAE,IAAGpC,KAAE,IAAGH,IAAE;AAAC,MAAGuC,EAAE,CAAC,GAAE;AAAC,QAAInC,KAAE,EAAE;AAAO,QAAG,GAAGA,EAAC,EAAE;AAAO,QAAGqC,EAAErC,IAAE,CAAC,GAAE;AAAC,UAAI,IAAEA,GAAE,WAAW,GAAE,CAAAK,OAAG;AAAC,YAAIP,KAAEO,GAAE,QAAQ,QAAO,EAAE,EAAE,MAAM,GAAG,EAAE,OAAO,CAAAW,OAAG,CAACjB,GAAE,KAAK,CAAA2B,OAAGW,EAAErB,IAAEU,EAAC,CAAC,CAAC;AAAE,eAAM,OAAO,GAAG,GAAEY,GAAGxC,GAAE,KAAK,GAAG,CAAC,CAAC,CAAC,GAAGyC,IAAG3C,EAAC,IAAE,KAAKA,EAAC,KAAG,EAAE;AAAA,MAAG,CAAC;AAAE,aAAOyC,EAAE,EAAE,QAAQ,IAAG,GAAG,GAAE,EAAE,IAAE,QAAQ,CAAC,MAAI;AAAA,IAAC;AAAC,WAAOrC;AAAA,EAAC,WAASwC,EAAG,CAAC,EAAE,QAAO;AAAC;AAAkI,SAAS,GAAG,GAAE,GAAE,GAAE;AAACL,IAAE,GAAE,KAAE,KAAG,EAAE,KAAK,GAAG,CAAC,IAAI,CAAC,GAAG;AAAC;AAAC,SAAS,EAAE,GAAE,GAAE;AAAC,SAAO,IAAE,GAAG,CAAC,IAAI,CAAC,MAAI;AAAE;AAAC,SAAS,GAAG,GAAE,GAAE;AAAC,MAAG,EAAE,QAAQ,KAAK,MAAI,GAAG,QAAO;AAAE,WAAS,EAAE,GAAE9B,IAAE;AAAC,QAAI,IAAE,CAAA,GAAGP,KAAE,GAAEkB,KAAE,IAAGU,KAAE,MAAK,IAAE;AAAE,WAAK5B,MAAG,EAAE,UAAQ;AAAC,UAAI,IAAE,EAAEA,EAAC;AAAE,WAAI,MAAI,OAAK,MAAI,OAAK,MAAI,QAAM,EAAEA,KAAE,CAAC,MAAI,SAAO4B,KAAEA,OAAI,IAAE,OAAK,IAAG,CAACA,OAAI,MAAI,OAAK,KAAI,MAAI,OAAK,MAAK,MAAI,OAAK5B,OAAI,EAAE,WAAS,MAAI,IAAG;AAAC,YAAI,IAAEkB,GAAE,KAAI;AAAG,UAAE,WAAW,KAAK,IAAE,EAAE,KAAK,GAAG,GAAEX,EAAC,CAAC,IAAE,EAAE,KAAKN,GAAE,CAAC,CAAC,GAAEiB,KAAE,IAAGlB;AAAI;AAAA,MAAQ;AAAC,YAAI,WAASkB,MAAG,IAAGlB;AAAA,IAAG;AAAC,WAAO;AAAA,EAAC;AAAC,WAASC,GAAE,GAAE;AAAC,QAAIM,KAAE,EAAE,CAAC;AAAE,SAAIA,OAAI,OAAKA,OAAI,OAAKA,OAAI,QAAM,EAAE,EAAE,SAAO,CAAC,MAAIA,GAAE,QAAO,EAAE,MAAM,GAAE,EAAE;AAAE,QAAI,IAAE,OAAO,CAAC;AAAE,WAAO,MAAM,CAAC,IAAE,IAAE;AAAA,EAAC;AAAC,MAAIT,KAAE,CAAA,GAAGI,KAAE;AAAG,WAAQ,IAAE,GAAE,IAAE,EAAE,QAAO,IAAI,KAAG,EAAE,CAAC,MAAI,OAAK,EAAE,MAAM,GAAE,IAAE,CAAC,MAAI,MAAM,CAAAA,GAAE,KAAK,CAAC,GAAE,KAAG;AAAA,WAAU,EAAE,CAAC,MAAI,OAAKA,GAAE,SAAO,GAAE;AAAC,QAAIK,KAAEL,GAAE,IAAG;AAAG,IAAAA,GAAE,WAAS,KAAGJ,GAAE,KAAK,CAACS,IAAE,CAAC,CAAC;AAAA,EAAC;AAAC,MAAG,CAACT,GAAE,OAAO,QAAO;AAAE,WAAQ,IAAEA,GAAE,SAAO,GAAE,KAAG,GAAE,KAAI;AAAC,QAAG,CAACS,IAAE,CAAC,IAAET,GAAE,CAAC,GAAEE,KAAE,EAAE,MAAMO,KAAE,GAAE,CAAC,GAAEW,KAAE,EAAElB,IAAE,CAAC,GAAE4B,KAAE,EAAE,GAAGV,EAAC;AAAE,QAAE,EAAE,MAAM,GAAEX,EAAC,IAAEqB,KAAE,EAAE,MAAM,IAAE,CAAC;AAAA,EAAC;AAAC,SAAO;AAAC;AAAojC,IAAqL,IAAE,IAAI,MAAI,GAAG,EAAE,SAAQ,GAAG,GAAG,CAAC,GAAE,KAAG,CAAC,IAAE,CAAA,GAAG,GAAE,GAAE3B,OAAI;AAAC,MAAG,GAAE;AAAC,QAAG,EAAC,UAASH,IAAE,SAAQI,GAAC,IAAE,EAAE,YAAU,CAAA,GAAG,EAAC,QAAO,GAAE,WAAUK,IAAC,KAAG,KAAG,OAAK,SAAO,EAAE,YAAUL,MAAG,CAAA,GAAG,IAAEyC,EAAG,GAAE,CAAC,IAAE,IAAE,IAAI,CAAC;AAAI,WAAO1C,OAAI,WAAS2C,EAAG3C,EAAC,KAAGM,QAAI,WAAS,EAAE,cAAc,CAAC,IAAE,EAAE,GAAE,QAAO,GAAE,CAACT,GAAE,gBAAgB,GAAE,CAAC;AAAA,EAAC;AAAC,SAAM;AAAE;AAAE,SAAS,GAAG,MAAK,GAAE;AAAC,MAAG,aAAa,OAAM;AAAC,QAAI,IAAE,EAAE,OAAO,CAACG,IAAEH,IAAEI,OAAI;AAAC,UAAI;AAAE,aAAOD,KAAEH,OAAI,IAAE+C,EAAG,EAAE3C,EAAC,GAAE,EAAC,IAAG,EAAC,CAAC,MAAI,OAAK,IAAE;AAAA,IAAG,GAAE,EAAE;AAAE,WAAO,GAAG,GAAE,CAAC;AAAA,EAAC;AAAC,SAAO2C,EAAG,GAAE,EAAC,IAAG,EAAC,CAAC;AAAC;AAA8hC,SAAS,GAAG,GAAE,IAAE,IAAG;AAAC,MAAI,IAAE,EAAE,SAAS,UAAS,EAAC,QAAO5C,KAAE,EAAE,QAAO,UAASH,MAAE,EAAE,UAAS,kBAAiBI,KAAE,EAAE,iBAAgB,IAAE,GAAE,IAAE,CAAA,GAAGK,KAAE,IAAG,IAAE,CAAC,EAAC,MAAK,GAAE,MAAKN,GAAC,CAAC;AAAE,SAAK,EAAE,UAAQ;AAAC,QAAG,EAAC,MAAKiB,IAAE,MAAKU,GAAC,IAAE,EAAE;AAAM,aAAQ,KAAKV,IAAE;AAAC,UAAI,IAAEA,GAAE,CAAC,GAAE,IAAE,GAAG,CAAC,GAAEL,KAAEiC,EAAG,GAAE5C,EAAC,IAAE,EAAE0B,EAAC,IAAE,EAAEA,IAAEmB,GAAG,CAAC,CAAC;AAAE,UAAGC,EAAG,CAAC,EAAE,GAAE,KAAK,EAAC,MAAK,GAAE,MAAKnC,GAAC,CAAC;AAAA,WAAM;AAAC,YAAIoC,KAAE,GAAGpC,EAAC,GAAE,IAAE,EAAE,GAAEA,IAAEZ,IAAE,CAACC,EAAC,CAAC;AAAE,WAAGK,IAAE0C,IAAE,CAAC;AAAE,YAAIC,KAAErC;AAAE,QAAAZ,MAAGiD,GAAE,WAAWjD,KAAE,GAAG,MAAIiD,KAAEA,GAAE,MAAMjD,GAAE,SAAO,CAAC,IAAG,EAAE,KAAKiD,GAAE,QAAQ,MAAK,GAAG,CAAC;AAAA,MAAC;AAAA,IAAC;AAAA,EAAC;AAAC,MAAIlD,KAAEO,GAAE,KAAK,EAAE;AAAE,SAAM,EAAC,OAAMA,IAAE,QAAO,GAAE,cAAaP,IAAE,KAAI,EAAEF,KAAEE,EAAC,EAAC;AAAC;AAAC,IAAI,IAAE,EAAC,OAAM,EAAC,OAAM,EAAC,OAAM,EAAC,SAAQ,wBAAuB,QAAQ,GAAE;AAAC,SAAM,EAAC,MAAK,SAAQ,UAAS,GAAE,SAAQ,KAAK,QAAQ,KAAK,EAAE,KAAI,CAAE,EAAC;AAAC,EAAC,GAAE,MAAK,EAAC,SAAQ,cAAa,QAAQ,GAAE;AAAC,SAAM,EAAC,MAAK,QAAO,UAAS,QAAQ,CAAC,SAAS,CAAC,IAAG,SAAQ,KAAK,QAAQ,KAAK,EAAE,KAAI,CAAE,EAAC;AAAC,EAAC,GAAE,OAAM,EAAC,SAAQ,iBAAgB,QAAQ,GAAE;AAAC,SAAM,EAAC,MAAK,SAAQ,UAAS,GAAE,SAAQ,KAAK,QAAQ,KAAK,EAAE,KAAI,CAAE,EAAC;AAAC,EAAC,GAAE,QAAO,EAAC,SAAQ,YAAW,QAAQ,GAAE;AAAC,SAAM,EAAC,MAAK,UAAS,UAAS,uCAAsC,SAAQ,KAAK,QAAQ,KAAK,EAAE,MAAM,EAAC;AAAC,EAAC,GAAE,QAAO,EAAC,QAAQ,GAAE;AAAC,SAAM,EAAC,MAAK,UAAS,UAAS,GAAE,SAAQ,KAAE;AAAC,EAAC,EAAC,GAAE,QAAQ,GAAE;AAAC,MAAI,IAAE,OAAO,KAAK,KAAK,KAAK,EAAE,OAAO,OAAG,MAAI,QAAQ,EAAE,IAAI,OAAG,KAAK,MAAM,CAAC,CAAC;AAAE,SAAM,CAAC,CAAC,EAAE,OAAO,IAAI,OAAG;AAAC,QAAIC;AAAE,YAAOA,KAAE,EAAE,IAAI,CAAAH,OAAGA,GAAE,QAAQ,CAAC,CAAC,EAAE,KAAK,CAAAA,OAAGA,GAAE,OAAO,MAAI,OAAKG,KAAE,KAAK,MAAM,OAAO,QAAQ,CAAC;AAAA,EAAC,CAAC;AAAC,EAAC,GAAE,aAAa,GAAE,GAAE;AAAC,SAAO,GAAG,GAAE,EAAC,QAAO,KAAG,OAAK,SAAO,EAAE,OAAM,CAAC;AAAC,GAAE,UAAU,EAAC,MAAK,IAAE,IAAG,OAAM,IAAE,IAAG,QAAO,GAAE,KAAIA,IAAE,UAASH,GAAC,GAAE;AAAC,MAAI,GAAEoD,IAAE,GAAE,GAAE,GAAEC,IAAE;AAAE,MAAG,EAAC,QAAOjD,IAAE,SAAQ,EAAC,IAAE,GAAEK,IAAE,GAAEP,IAAEkB,KAAEU,IAAE,GAAE;AAAE,MAAGwB,IAAElD,EAAC,KAAG,EAAE,cAAY,UAAS;AAAC,QAAG,EAAC,WAAU,GAAE,UAAS,IAAG,QAAOmD,IAAE,IAAEnD,IAAE,IAAE,MAAI,CAAA,GAAG,EAAC,aAAYoD,GAAC,IAAE,GAAEC,KAAE,EAAE,GAAE,CAAC,aAAa,CAAC,GAAE,IAAEF,OAAI,CAAA,GAAG,EAAC,aAAY,EAAC,IAAE,GAAEG,KAAE,EAAE,GAAE,CAAC,aAAa,CAAC,GAAE3C,KAAEyC,MAAG,IAAG,EAAC,MAAK,EAAC,IAAEzC,IAAE,IAAE,EAAEA,IAAE,CAAC,MAAM,CAAC,GAAEoC,KAAE,KAAG,CAAA,GAAG,EAAC,MAAK,EAAC,IAAEA,IAAEQ,KAAE,EAAER,IAAE,CAAC,MAAM,CAAC,GAAE,IAAEG,IAAE,CAAC,IAAE,KAAK,aAAa,EAAC,WAAU,EAAC,GAAE,CAAC,IAAE,CAAA,GAAG,IAAEA,IAAEG,EAAC,IAAE,KAAK,aAAa,EAAC,UAASA,GAAC,GAAE,CAAC,IAAE,IAAG,IAAEH,IAAE,CAAC,IAAE,KAAK,aAAa,EAAC,OAAM,EAAC,GAAE,CAAC,IAAE,CAAA,GAAG,KAAGA,IAAE,CAAC,IAAE,KAAK,aAAa,EAAC,MAAK,EAAC,GAAE,CAAC,IAAE,CAAA,GAAG,KAAGA,IAAEI,EAAC,IAAE,KAAK,aAAa,EAAC,UAASA,GAAC,GAAE,CAAC,IAAE,CAAA,GAAG,KAAGJ,IAAEK,EAAC,IAAE,KAAK,aAAa,EAAC,OAAMA,GAAC,GAAE,CAAC,IAAE,IAAG,KAAGL,IAAE,CAAC,IAAE,KAAK,aAAa,EAAC,MAAK,EAAC,GAAE,CAAC,IAAE,CAAA,GAAG,CAAC,IAAG,EAAE,IAAE,EAAE,IAAE,EAAE,iBAAe,OAAK,IAAE,IAAG,EAAE,MAAM,GAAE,CAAC,IAAG,EAAE,IAAE,EAAEF,KAAE,EAAE,iBAAe,OAAKA,KAAE,IAAG,EAAE,UAAQ,EAAE,GAAE,CAAC,IAAG,EAAE,IAAE,EAAE,IAAE,EAAE,iBAAe,OAAK,IAAE,IAAG,EAAE,UAAQ,EAAE,GAAE,CAAC,IAAG,EAAE,IAAE,EAAE,IAAE,GAAG,iBAAe,OAAK,IAAE,IAAG,GAAG,UAAQ,EAAE,GAAE,CAAC,IAAG,EAAE,IAAE,EAAE,IAAE,GAAG,iBAAe,OAAK,IAAE,IAAG,GAAG,UAAQ,CAAA,CAAE,GAAE,CAAC,IAAG,EAAE,IAAE,EAAEC,KAAE,GAAG,iBAAe,OAAKA,KAAE,IAAG,GAAG,UAAQ,CAAA,CAAE,GAAE,CAAC,IAAG,EAAE,IAAE,EAAE,IAAE,GAAG,iBAAe,OAAK,IAAE,IAAG,GAAG,UAAQ,CAAA,CAAE;AAAE,IAAA5C,KAAE,KAAK,aAAa,GAAE,IAAG,SAAQ,YAAW,GAAEN,IAAEH,EAAC,GAAE,IAAE;AAAG,QAAI,KAAG,KAAK,aAAa,GAAE,GAAG,EAAE,GAAG,EAAE,IAAG,SAAQ,YAAW,GAAEG,IAAEH,EAAC,GAAE,KAAG,KAAK,aAAa,GAAE,GAAG,EAAE,IAAG,QAAO,YAAW,GAAEG,IAAEH,EAAC;AAAE,IAAAE,KAAE,GAAG,EAAE,GAAG,EAAE,IAAGkB,MAAE,CAAC,GAAG,oBAAI,IAAI,CAAC,GAAG,IAAG,GAAG,IAAG,GAAG,EAAE,CAAC,CAAC;AAAE,QAAI,KAAG,KAAK,aAAa,GAAE,GAAG,EAAE,GAAG,EAAE,sBAAqB,SAAQ,YAAW,GAAEjB,IAAEH,EAAC,GAAE4B,MAAG,KAAK,aAAa,GAAE,GAAG,EAAE,qBAAoB,QAAO,YAAW,GAAEzB,IAAEH,EAAC;AAAE,IAAA8B,KAAE,GAAG,EAAE,GAAGF,GAAE,IAAG,IAAE,CAAC,GAAG,oBAAI,IAAI,CAAC,GAAG,IAAG,GAAG,IAAG,GAAG,EAAE,CAAC,CAAC,GAAE,IAAEgC,EAAGxD,GAAE,KAAI,EAAC,IAAG,EAAC,CAAC;AAAA,EAAC;AAAC,SAAM,EAAC,WAAU,EAAC,KAAIK,IAAE,QAAO,EAAC,GAAE,UAAS,EAAC,KAAIP,IAAE,QAAOkB,IAAC,GAAE,QAAO,EAAC,KAAIU,IAAE,QAAO,EAAC,GAAE,OAAM,EAAC;AAAC,GAAE,UAAU,EAAC,MAAK,IAAE,IAAG,QAAO,IAAE,CAAA,GAAG,SAAQ,GAAE,QAAO3B,IAAE,KAAIH,IAAE,UAASI,IAAE,UAAS,EAAC,GAAE;AAAC,MAAI,GAAE,GAAEW;AAAE,MAAIN,IAAE,GAAEP;AAAE,MAAGoD,IAAE,CAAC,KAAG,EAAE,cAAY,UAAS;AAAC,QAAIH,KAAE,EAAE,QAAQ,cAAa,EAAE,GAAE/B,MAAE,GAAE,EAAC,aAAY,GAAE,QAAOgC,IAAE,KAAI,EAAC,IAAEhC,KAAE,IAAE,EAAEA,KAAE,CAAC,eAAc,UAAS,KAAK,CAAC,GAAEU,KAAEsB,MAAG,IAAG,EAAC,aAAY,EAAC,IAAEtB,IAAEuB,KAAE,EAAEvB,IAAE,CAAC,aAAa,CAAC,GAAE,IAAE,KAAG,CAAA,GAAG,EAAC,MAAK,EAAC,IAAE,GAAE,IAAE,EAAE,GAAE,CAAC,MAAM,CAAC,GAAE,IAAE,KAAG,CAAA,GAAG,EAAC,MAAK,GAAE,IAAE,GAAEyB,MAAG,EAAE,GAAE,CAAC,MAAM,CAAC,GAAEC,KAAEF,IAAE,CAAC,IAAE,KAAK,aAAa,EAAC,CAACH,EAAC,GAAE,EAAE,EAAE,CAAA,GAAG,CAAC,GAAEE,EAAC,EAAC,GAAE,CAAC,IAAE,CAAA,GAAGI,KAAEH,IAAE,CAAC,IAAE,KAAK,aAAa,EAAC,CAACH,EAAC,GAAE,EAAE,EAAE,CAAA,GAAG,CAAC,GAAEI,GAAE,EAAC,GAAE,CAAC,IAAE,CAAA,GAAG,IAAED,IAAE,CAAC,IAAE,KAAK,aAAa,EAAC,CAACH,EAAC,GAAE,EAAE,EAAE,CAAA,GAAG,CAAC,GAAE,EAAE,EAAC,GAAE,CAAC,IAAE,IAAG,CAACO,IAAE,CAAC,IAAE,EAAE,IAAEF,GAAE,iBAAe,OAAK,IAAE,IAAGA,GAAE,UAAQ,CAAA,CAAE,GAAE,CAAC,GAAE,CAAC,IAAE,EAAE,IAAEC,GAAE,iBAAe,OAAK,IAAE,IAAGA,GAAE,UAAQ,CAAA,CAAE,GAAE,CAACE,IAAE,CAAC,IAAE,EAAE5C,KAAE,EAAE,iBAAe,OAAKA,KAAE,IAAG,EAAE,UAAQ,CAAA,CAAE,GAAE,IAAE,KAAK,aAAaoC,IAAE,GAAGO,EAAC,GAAG,CAAC,IAAG,SAAQ,YAAW,GAAE1D,IAAEI,IAAE,CAAC,GAAE,IAAE,KAAK,aAAa+C,IAAEQ,IAAE,QAAO,YAAW,GAAE3D,IAAEI,IAAE,CAAC;AAAE,IAAAK,KAAE,GAAG,CAAC,GAAG,CAAC,IAAG,IAAE,CAAC,GAAG,oBAAI,IAAI,CAAC,GAAG,GAAE,GAAG,GAAE,GAAG,CAAC,CAAC,CAAC,GAAEP,KAAE0D,EAAG,GAAE,EAAC,IAAG,EAAC,CAAC;AAAA,EAAC;AAAC,SAAM,EAAC,KAAInD,IAAE,QAAO,GAAE,OAAMP,GAAC;AAAC,GAAE,WAAW,EAAC,MAAK,IAAE,IAAG,OAAM,IAAE,IAAG,QAAO,GAAE,KAAIC,IAAE,UAASH,GAAC,GAAE;AAAC,MAAI;AAAE,MAAG,EAAC,QAAOI,IAAE,SAAQ,EAAC,IAAE,GAAEK,MAAG,IAAEL,MAAG,OAAK,SAAOA,GAAE,eAAa,OAAK,SAAO,EAAE,CAAC;AAAE,SAAO,KAAK,UAAU,EAAC,MAAK,GAAE,QAAOK,IAAE,SAAQ,GAAE,QAAO,GAAE,KAAIN,IAAE,UAASH,GAAC,CAAC;AAAC,GAAE,WAAW,EAAC,MAAK,IAAE,IAAG,OAAM,IAAE,CAAA,GAAG,QAAO,GAAE,KAAIG,IAAE,UAASH,GAAC,GAAE;AAAC,MAAIE,IAAEkB;AAAE,MAAIhB,KAAE,EAAE,QAAQ,cAAa,EAAE,GAAE,EAAC,QAAO,GAAE,SAAQK,GAAC,IAAE,GAAE,MAAIP,KAAE,KAAG,OAAK,SAAO,EAAE,eAAa,OAAK,SAAOA,GAAEE,EAAC,QAAMgB,KAAE,KAAG,OAAK,SAAO,EAAE,eAAa,OAAK,SAAOA,GAAEhB,EAAC;AAAG,SAAO,KAAK,UAAU,EAAC,MAAKA,IAAE,QAAO,GAAE,SAAQK,IAAE,QAAO,GAAE,KAAIN,IAAE,UAASH,GAAC,CAAC;AAAC,GAAE,qBAAqB,GAAE;AAAC,SAAM,EAAE,EAAE,qBAAmB,UAAQ,EAAE,qBAAmB;AAAG,GAAE,qBAAqB,GAAE,GAAE;AAAC,MAAI;AAAE,SAAO,KAAK,qBAAqB,CAAC,IAAE,KAAK,MAAM,QAAQ,EAAE,qBAAmB,OAAG,EAAE,QAAQ,oBAAkB,IAAE,EAAE,qBAAmB,OAAK,IAAE,EAAE,QAAQ,gBAAgB,IAAE;AAAE,GAAE,cAAc,GAAE,IAAE,IAAG,GAAEG,IAAE;AAAC,MAAG,EAAC,UAASH,GAAC,IAAE;AAAE,SAAOA,KAAE,UAAU4D,EAAG5D,GAAE,SAAOA,GAAE,QAAM,WAAU,CAAC,CAAC,KAAG;AAAE,GAAE,oBAAoB,EAAC,MAAK,IAAE,IAAG,OAAM,IAAE,IAAG,QAAO,GAAE,OAAMG,KAAE,CAAA,GAAG,KAAIH,KAAE,UAASI,GAAC,GAAE;AAAC,MAAI,IAAE,KAAK,UAAU,EAAC,MAAK,GAAE,OAAM,GAAE,QAAO,GAAE,KAAIJ,KAAE,UAASI,GAAC,CAAC,GAAEK,KAAE,OAAO,QAAQN,EAAC,EAAE,OAAO,CAAC,GAAE,CAACD,IAAEkB,EAAC,MAAI,EAAE,KAAK,GAAGlB,EAAC,KAAKkB,EAAC,GAAG,KAAG,GAAE,CAAA,CAAE,EAAE,KAAK,GAAG;AAAE,SAAO,OAAO,QAAQ,KAAG,CAAA,CAAE,EAAE,OAAO,CAAC,GAAE,CAAClB,IAAEkB,EAAC,MAAI;AAAC,QAAGyC,EAAGzC,EAAC,KAAG,OAAO,OAAOA,IAAE,KAAK,GAAE;AAAC,UAAIU,KAAEgC,IAAG1C,GAAE,GAAG,GAAE,IAAE,GAAGlB,EAAC;AAAa,QAAE,KAAK,kDAAkD,CAAC,KAAKO,EAAC,IAAIqB,EAAC,UAAU;AAAA,IAAC;AAAC,WAAO;AAAA,EAAC,GAAE,CAAA,CAAE,EAAE,KAAK,EAAE;AAAC,GAAE,cAAc,EAAC,MAAK,IAAE,IAAG,OAAM,IAAE,CAAA,GAAG,QAAO,GAAE,OAAM3B,KAAE,IAAG,KAAIH,IAAE,UAASI,GAAC,GAAE;AAAC,MAAIF;AAAE,MAAI,IAAE,EAAC,MAAK,GAAE,OAAM,GAAE,QAAO,GAAE,KAAIF,IAAE,UAASI,GAAC,GAAEK,MAAGP,KAAE,EAAE,SAAS,YAAY,IAAE,KAAK,WAAW,CAAC,IAAE,KAAK,WAAW,CAAC,MAAI,OAAK,SAAOA,GAAE,KAAI,IAAE,OAAO,QAAQC,EAAC,EAAE,OAAO,CAACiB,IAAE,CAACU,IAAE,CAAC,MAAIV,GAAE,KAAK,GAAGU,EAAC,KAAK,CAAC,GAAG,KAAGV,IAAE,EAAE,EAAE,KAAK,GAAG;AAAE,SAAOX,KAAE,kDAAkD,CAAC,eAAe,CAAC,IAAIqD,IAAGrD,EAAC,CAAC,aAAW;AAAE,GAAE,aAAa,IAAE,CAAA,GAAG,GAAE,IAAE,IAAGN,KAAE,IAAGH,MAAE,IAAG;AAAC,MAAII,KAAE,SAASK,KAAE,IAAE,CAAA,GAAGP,KAAE,CAAA,GAAG;AAAC,QAAGA,GAAE,SAAS,KAAK,IAAI,EAAE,QAAO,QAAQ,KAAK,kCAAkC,KAAK,IAAI,EAAE,GAAE,EAAC,aAAYO,KAAE,MAAK,KAAK,MAAK,OAAM,GAAE,OAAM,OAAM;AAAE,IAAAP,GAAE,KAAK,KAAK,IAAI,GAAE,EAAE,OAAK,KAAK,MAAK,EAAE,YAAU,EAAE,UAAQ;AAAI,QAAIkB,KAAE,KAAK;AAAM,QAAG,OAAO,KAAK,SAAO,YAAU,EAAE,KAAK,KAAK,KAAK,GAAE;AAAC,UAAI,IAAE,KAAK,MAAM,KAAI,EAAG,QAAQ,GAAE,OAAG;AAAC,YAAI+B;AAAE,YAAI,IAAE,EAAE,MAAM,GAAE,EAAE,GAAE,IAAE,KAAK,OAAO,CAAC;AAAE,YAAG,CAAC,EAAE,QAAO,QAAQ,KAAK,6BAA6B,CAAC,EAAE,GAAE;AAAiB,YAAIpC,KAAE,EAAE,SAASN,KAAE,GAAEP,EAAC;AAAE,eAAO,MAAM,QAAQa,EAAC,KAAGA,GAAE,WAAS,IAAE,cAAcA,GAAE,CAAC,EAAE,KAAK,IAAIA,GAAE,CAAC,EAAE,KAAK,OAAKoC,KAAEpC,MAAG,OAAK,SAAOA,GAAE,UAAQ,OAAKoC,KAAE;AAAA,MAAgB,CAAC;AAAE,MAAA/B,KAAE,GAAG,KAAK,EAAE,QAAQ,IAAG,GAAG,CAAC,IAAE,QAAQ,CAAC,MAAI;AAAA,IAAC;AAAC,WAAO2C,EAAG,EAAE,OAAO,KAAG,OAAO,EAAE,SAAQ7D,GAAE,IAAG,GAAG,EAAC,aAAYO,KAAE,MAAK,KAAK,MAAK,OAAM,GAAE,OAAMW,GAAE,SAAS,gBAAgB,IAAE,SAAOA,GAAC;AAAA,EAAC,GAAE,IAAE,CAACX,IAAE,GAAEP,OAAI;AAAC,WAAO,QAAQO,EAAC,EAAE,QAAQ,CAAC,CAACW,IAAEU,EAAC,MAAI;AAAC,UAAI,IAAEkC,EAAG5C,IAAE,EAAE,SAAS,gBAAgB,IAAE,IAAE,IAAE,GAAG,CAAC,IAAI,GAAGA,EAAC,CAAC,KAAG,GAAGA,EAAC,GAAE,IAAElB,KAAE,GAAGA,EAAC,IAAIkB,EAAC,KAAGA;AAAEyC,QAAG/B,EAAC,IAAE,EAAEA,IAAE,GAAE,CAAC,KAAG9B,IAAE,CAAC,MAAIA,IAAE,CAAC,IAAE,EAAC,OAAM,CAAA,GAAG,UAAS,CAAC,GAAE,IAAE,CAAA,GAAGe,KAAE,OAAK;AAAC,YAAGf,IAAE,CAAC,EAAE,MAAM,WAAS,EAAE,QAAOA,IAAE,CAAC,EAAE,MAAM,CAAC,EAAE,SAASA,IAAE,CAAC,EAAE,MAAM,CAAC,EAAE,QAAO,EAAE,SAAQe,EAAC;AAAE,YAAG,KAAG,MAAI,OAAO,UAAQoC,KAAE,GAAEA,KAAEnD,IAAE,CAAC,EAAE,MAAM,QAAOmD,MAAI;AAAC,cAAI,IAAEnD,IAAE,CAAC,EAAE,MAAMmD,EAAC;AAAE,cAAG,EAAE,WAAS,EAAE,QAAO,EAAE,SAAS,GAAE,EAAE,SAAQpC,EAAC;AAAA,QAAC;AAAC,eAAOf,IAAE,CAAC,EAAE,MAAM,IAAI,CAAAmD,OAAGA,GAAE,SAASA,GAAE,QAAO,EAAEA,GAAE,MAAM,GAAEpC,EAAC,CAAC;AAAA,MAAC,EAAC,IAAGf,IAAE,CAAC,EAAE,MAAM,KAAK,EAAC,MAAK,GAAE,OAAM8B,IAAE,QAAO,EAAE,SAAS,mBAAmB,IAAE,UAAQ,EAAE,SAAS,kBAAkB,IAAE,SAAO,QAAO,UAAS1B,IAAE,QAAOJ,IAAC,CAAC;AAAA,IAAE,CAAC;AAAA,EAAC;AAAE,SAAO,EAAE,GAAE,GAAEG,EAAC,GAAEH;AAAC,GAAE,cAAc,GAAE,GAAE,GAAE;AAAC,MAAIS;AAAE,MAAIT,MAAG,OAAG,EAAE,MAAM,GAAG,EAAE,OAAO,CAAAoB,OAAG,CAAC4C,EAAG5C,GAAE,YAAW,GAAG,EAAE,SAAS,gBAAgB,CAAC,EAAE,KAAK,GAAG,GAAG,CAAC,GAAEhB,KAAE,EAAE,SAAS,mBAAmB,IAAE,UAAQ,EAAE,SAAS,kBAAkB,IAAE,SAAO,QAAO,IAAE,EAAEK,KAAE,EAAET,EAAC,MAAI,OAAK,SAAOS,GAAE,SAASL,EAAC,CAAC,EAAE,OAAO,OAAO,OAAG,CAAC;AAAE,SAAO,EAAE,WAAS,IAAE,EAAE,CAAC,EAAE,QAAM,EAAE,OAAO,CAAC,IAAE,IAAGF,OAAI;AAAC,QAAI,IAAEA,IAAE,EAAC,aAAYkB,GAAC,IAAE,GAAEU,KAAE,EAAE,GAAE,CAAC,aAAa,CAAC;AAAE,WAAO,EAAEV,EAAC,IAAEU,IAAE;AAAA,EAAC,GAAE,MAAM;AAAC,GAAE,gBAAgB,GAAE,GAAE,GAAE3B,IAAE;AAAC,SAAO,MAAI,WAAS,MAAI,SAAO,EAAEmD,IAAE,CAAC,IAAE,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,KAAG,GAAEnD,EAAC,IAAE,EAAE,GAAE,EAAE,KAAG,OAAK,IAAE,eAAcA,EAAC,CAAC;AAAC,GAAE,aAAa,GAAE,GAAE,GAAEA,IAAEH,MAAE,CAAA,GAAGI,IAAE,GAAEK,IAAE;AAAC,MAAG6C,IAAE,CAAC,GAAE;AAAC,QAAG,EAAC,UAAS,EAAC,IAAEtD;AAAE,QAAGG,OAAI,SAAQ;AAAC,UAAID,KAAE,KAAK,qBAAqBF,KAAE,CAAC;AAAE,UAAE,MAAI,SAAOE,GAAE,OAAO,CAACkB,IAAE,EAAC,MAAKU,IAAE,UAAS,EAAC,OAAKwB,IAAE,CAAC,MAAIlC,MAAG,EAAE,SAAS,OAAO,IAAE,EAAE,QAAQ,SAAQ,CAAC,IAAE,KAAK,gBAAgB,GAAEX,IAAEqB,IAAE,CAAC,IAAGV,KAAG,EAAE,IAAE,EAAEX,MAAG,OAAKA,KAAE,eAAc,CAAC;AAAA,IAAC;AAAC,QAAG,GAAE;AAAC,UAAIP,KAAE,EAAC,MAAK,UAAyB;AAAE2D,QAAG,CAAC,MAAI3D,GAAE,OAAK0D,EAAG,EAAE,MAAK,EAAC,MAAK,GAAE,MAAKzD,GAAC,CAAC,IAAGmD,IAAEpD,GAAE,IAAI,MAAI,IAAE,EAAE,UAAUA,GAAE,IAAI,IAAG,CAAC,GAAEE,MAAG,QAAMA,GAAE,WAAWF,GAAE,IAAI;AAAA,IAAE;AAAC,WAAO;AAAA,EAAC;AAAC,SAAM;AAAE,EAAC;AAAE,IAAI,IAAE,EAAC,UAAS,EAAC,UAAS,EAAC,QAAO,KAAI,UAAS,eAAc,kBAAiB,gHAA+G,GAAE,SAAQ,EAAC,QAAO,KAAI,kBAAiB,UAAS,UAAS,MAAE,EAAC,GAAE,QAAO,QAAO,aAAY,oBAAI,OAAI,mBAAkB,oBAAI,OAAI,gBAAe,oBAAI,OAAI,SAAQ,CAAA,GAAG,OAAO,IAAE,IAAG;AAAC,MAAG,EAAC,OAAM,EAAC,IAAE;AAAE,QAAI,KAAK,SAAO,EAAE,EAAE,CAAA,GAAG,CAAC,GAAE,EAAC,SAAQ,EAAE,EAAE,CAAA,GAAG,KAAK,SAAS,OAAO,GAAE,EAAE,OAAO,EAAC,CAAC,GAAE,KAAK,UAAQ,EAAE,aAAa,KAAK,QAAO,KAAK,QAAQ,GAAE,KAAK,sBAAqB;AAAG,GAAE,IAAI,QAAO;AAAC,SAAO,KAAK;AAAM,GAAE,IAAI,SAAQ;AAAC,MAAI;AAAE,WAAQ,IAAE,KAAK,UAAQ,OAAK,SAAO,EAAE,WAAS,CAAA;AAAE,GAAE,IAAI,UAAS;AAAC,MAAI;AAAE,WAAQ,IAAE,KAAK,UAAQ,OAAK,SAAO,EAAE,YAAU,CAAA;AAAE,GAAE,IAAI,SAAQ;AAAC,SAAO,KAAK;AAAO,GAAE,WAAU;AAAC,SAAO,KAAK;AAAK,GAAE,SAAS,GAAE;AAAC,OAAK,OAAO,EAAC,OAAM,EAAC,CAAC,GAAE,EAAE,KAAK,gBAAe,CAAC;AAAC,GAAE,YAAW;AAAC,SAAO,KAAK;AAAM,GAAE,UAAU,GAAE;AAAC,OAAK,SAAO,EAAE,EAAE,CAAA,GAAG,KAAK,KAAK,GAAE,EAAC,QAAO,EAAC,CAAC,GAAE,KAAK,UAAQ,EAAE,aAAa,GAAE,KAAK,QAAQ,GAAE,KAAK,sBAAqB,GAAG,EAAE,KAAK,iBAAgB,CAAC,GAAE,EAAE,KAAK,gBAAe,KAAK,KAAK;AAAC,GAAE,aAAY;AAAC,SAAO,KAAK;AAAO,GAAE,WAAW,GAAE;AAAC,OAAK,SAAO,EAAE,EAAE,CAAA,GAAG,KAAK,KAAK,GAAE,EAAC,SAAQ,EAAC,CAAC,GAAE,KAAK,sBAAqB,GAAG,EAAE,KAAK,kBAAiB,CAAC,GAAE,EAAE,KAAK,gBAAe,KAAK,KAAK;AAAC,GAAE,gBAAe;AAAC,SAAM,CAAC,GAAG,KAAK,WAAW;AAAC,GAAE,cAAc,GAAE;AAAC,OAAK,YAAY,IAAI,CAAC;AAAC,GAAE,sBAAqB;AAAC,SAAO,KAAK;AAAiB,GAAE,kBAAkB,GAAE;AAAC,SAAO,KAAK,kBAAkB,IAAI,CAAC;AAAC,GAAE,mBAAmB,GAAE;AAAC,OAAK,kBAAkB,IAAI,CAAC;AAAC,GAAE,sBAAsB,GAAE;AAAC,OAAK,kBAAkB,OAAO,CAAC;AAAC,GAAE,wBAAuB;AAAC,OAAK,kBAAkB;AAAO,GAAE,cAAc,GAAE;AAAC,SAAO,EAAE,cAAc,KAAK,QAAO,GAAE,KAAK,QAAQ;AAAC,GAAE,UAAU,IAAE,IAAG,GAAE;AAAC,SAAO,EAAE,UAAU,EAAC,MAAK,GAAE,OAAM,KAAK,OAAM,QAAO,GAAE,UAAS,KAAK,UAAS,KAAI,EAAC,YAAW,KAAK,cAAc,KAAK,IAAI,EAAC,EAAC,CAAC;AAAC,GAAE,aAAa,IAAE,IAAG,GAAE;AAAC,MAAI,IAAE,EAAC,MAAK,GAAE,OAAM,KAAK,OAAM,QAAO,GAAE,UAAS,KAAK,UAAS,KAAI,EAAC,YAAW,KAAK,cAAc,KAAK,IAAI,EAAC,EAAC;AAAE,SAAO,EAAE,WAAW,CAAC;AAAC,GAAE,aAAa,IAAE,IAAG,GAAE;AAAC,MAAI,IAAE,EAAC,MAAK,GAAE,OAAM,KAAK,OAAM,QAAO,GAAE,UAAS,KAAK,UAAS,KAAI,EAAC,YAAW,KAAK,cAAc,KAAK,IAAI,EAAC,EAAC;AAAE,SAAO,EAAE,WAAW,CAAC;AAAC,GAAE,gBAAgB,IAAE,IAAG,GAAE,GAAEC,IAAE;AAAC,MAAIH,KAAE,EAAC,MAAK,GAAE,QAAO,GAAE,SAAQ,KAAK,SAAQ,UAAS,GAAE,QAAOG,IAAE,UAAS,KAAK,UAAS,KAAI,EAAC,YAAW,KAAK,cAAc,KAAK,IAAI,EAAC,EAAC;AAAE,SAAO,EAAE,UAAUH,EAAC;AAAC,GAAE,iBAAiB,IAAE,IAAG;AAAC,SAAO,EAAE,cAAc,GAAE,KAAK,SAAQ,EAAC,OAAM,KAAK,gBAAe,GAAE,KAAK,QAAQ;AAAC,GAAE,aAAa,IAAE,IAAG,GAAE,IAAE,SAAQG,IAAE;AAAC,SAAO,EAAE,aAAa,GAAE,GAAEA,IAAE,GAAE,KAAK,SAAQ,EAAC,YAAW,KAAK,cAAc,KAAK,IAAI,EAAC,GAAE,KAAK,QAAQ;AAAC,GAAE,oBAAoB,IAAE,IAAG,GAAE,IAAE,CAAA,GAAG;AAAC,SAAO,EAAE,oBAAoB,EAAC,MAAK,GAAE,OAAM,KAAK,OAAM,QAAO,GAAE,OAAM,GAAE,UAAS,KAAK,UAAS,KAAI,EAAC,YAAW,KAAK,cAAc,KAAK,IAAI,EAAC,EAAC,CAAC;AAAC,GAAE,cAAc,GAAE,GAAE,IAAE,CAAA,GAAG;AAAC,SAAO,EAAE,cAAc,EAAC,MAAK,GAAE,OAAM,KAAK,OAAM,QAAO,GAAE,OAAM,GAAE,UAAS,KAAK,UAAS,KAAI,EAAC,YAAW,KAAK,cAAc,KAAK,IAAI,EAAC,EAAC,CAAC;AAAC,GAAE,eAAe,GAAE;AAAC,OAAK,eAAe,IAAI,CAAC;AAAC,GAAE,eAAe,GAAE;AAAC,OAAK,eAAe,IAAI,CAAC;AAAC,GAAE,cAAc,GAAE,EAAC,MAAK,EAAC,GAAE;AAAC,OAAK,eAAe,SAAO,KAAK,eAAe,OAAO,CAAC,GAAE,EAAE,KAAK,SAAS,CAAC,SAAQ,CAAC,GAAE,CAAC,KAAK,eAAe,QAAM,EAAE,KAAK,YAAY;AAAE,EAAC;ACEzphB,IAAI,kBAAkB;AAAA,EACpB,aAAa;AAAA,EACb,UAAU;AAAA,EACV,cAAc;AAAA,EACd,WAAW;AAAA,EACX,QAAQ;AAAA,EACR,YAAY;AAAA,EAEZ,WAAW;AAAA,EACX,uBAAuB;AAAA,EACvB,cAAc;AAAA,EACd,0BAA0B;AAAA,EAE1B,SAAS;AAAA,EACT,aAAa;AAAA,EACb,aAAa;AAAA,EACb,YAAY;AACd;ACnBA,IAAI,QAAM;ACGV,SAAS8D,UAAQ,GAAG;AAAE;AAA2B,SAAOA,YAAU,cAAc,OAAO,UAAU,YAAY,OAAO,OAAO,WAAW,SAAUC,IAAG;AAAE,WAAO,OAAOA;AAAA,EAAG,IAAI,SAAUA,IAAG;AAAE,WAAOA,MAAK,cAAc,OAAO,UAAUA,GAAE,gBAAgB,UAAUA,OAAM,OAAO,YAAY,WAAW,OAAOA;AAAA,EAAG,GAAGD,UAAQ,CAAC;AAAG;AAC7T,SAASE,UAAQ,GAAG,GAAG;AAAE,MAAI,IAAI,OAAO,KAAK,CAAC;AAAG,MAAI,OAAO,uBAAuB;AAAE,QAAI,IAAI,OAAO,sBAAsB,CAAC;AAAG,UAAM,IAAI,EAAE,OAAO,SAAUC,IAAG;AAAE,aAAO,OAAO,yBAAyB,GAAGA,EAAC,EAAE;AAAA,IAAY,CAAC,IAAI,EAAE,KAAK,MAAM,GAAG,CAAC;AAAA,EAAG;AAAE,SAAO;AAAG;AAC9P,SAASC,gBAAc,GAAG;AAAE,WAAS,IAAI,GAAG,IAAI,UAAU,QAAQ,KAAK;AAAE,QAAI,IAAI,QAAQ,UAAU,CAAC,IAAI,UAAU,CAAC,IAAI,CAAA;AAAI,QAAI,IAAIF,UAAQ,OAAO,CAAC,GAAG,IAAI,EAAE,QAAQ,SAAUC,IAAG;AAAEE,wBAAgB,GAAGF,IAAG,EAAEA,EAAC,CAAC;AAAA,IAAG,CAAC,IAAI,OAAO,4BAA4B,OAAO,iBAAiB,GAAG,OAAO,0BAA0B,CAAC,CAAC,IAAID,UAAQ,OAAO,CAAC,CAAC,EAAE,QAAQ,SAAUC,IAAG;AAAE,aAAO,eAAe,GAAGA,IAAG,OAAO,yBAAyB,GAAGA,EAAC,CAAC;AAAA,IAAG,CAAC;AAAA,EAAG;AAAE,SAAO;AAAG;AACxb,SAASE,kBAAgB,GAAG,GAAG,GAAG;AAAE,UAAQ,IAAIC,iBAAe,CAAC,MAAM,IAAI,OAAO,eAAe,GAAG,GAAG,EAAE,OAAO,GAAG,YAAY,MAAM,cAAc,MAAM,UAAU,KAAI,CAAE,IAAI,EAAE,CAAC,IAAI,GAAG;AAAG;AACzL,SAASA,iBAAe,GAAG;AAAE,MAAIvE,KAAIwE,eAAa,GAAG,QAAQ;AAAG,SAAO,YAAYP,UAAQjE,EAAC,IAAIA,KAAIA,KAAI;AAAI;AAC5G,SAASwE,eAAa,GAAG,GAAG;AAAE,MAAI,YAAYP,UAAQ,CAAC,KAAK,CAAC,EAAG,QAAO;AAAG,MAAI,IAAI,EAAE,OAAO,WAAW;AAAG,MAAI,WAAW,GAAG;AAAE,QAAIjE,KAAI,EAAE,KAAK,GAAG,CAAC;AAAG,QAAI,YAAYiE,UAAQjE,EAAC,EAAG,QAAOA;AAAG,UAAM,IAAI,UAAU,8CAA8C;AAAA,EAAG;AAAE,UAAQ,aAAa,IAAI,SAAS,QAAQ,CAAC;AAAG;AAC9S,SAAS,aAAa,IAAI;AACxB,MAAI,OAAO,UAAU,SAAS,KAAK,UAAU,CAAC,MAAM,SAAY,UAAU,CAAC,IAAI;AAC/E,MAAI,mBAAkB,KAAM,qBAAqB,WAAY,WAAU,EAAE;AAAA,WAAW,KAAM,IAAE;AAAA,MAAQ,UAAS,EAAE;AACjH;AACA,IAAI,MAAM;AACV,SAAS,SAASyE,MAAK;AACrB,MAAI,UAAU,UAAU,SAAS,KAAK,UAAU,CAAC,MAAM,SAAY,UAAU,CAAC,IAAI,CAAA;AAClF,MAAI,WAAW,IAAI,KAAK;AACxB,MAAI,SAAS,IAAIA,IAAG;AACpB,MAAI,WAAW,IAAI,IAAI;AACvB,MAAI,kBAAkBC,GAAQ,IAAK,OAAO,WAAW;AACrD,MAAI,oBAAoB,QAAQ,UAC9BC,YAAW,sBAAsB,SAAS,kBAAkB,mBAC5D,qBAAqB,QAAQ,WAC7B,YAAY,uBAAuB,SAAS,OAAO,oBACnD,kBAAkB,QAAQ,QAC1B,SAAS,oBAAoB,SAAS,QAAQ,iBAC9C,gBAAgB,QAAQ,MACxB,OAAO,kBAAkB,SAAS,SAAS,OAAO,EAAE,GAAG,IAAI,eAC3D,cAAc,QAAQ,IACtB,KAAK,gBAAgB,SAAS,SAAY,aAC1C,iBAAiB,QAAQ,OACzB,QAAQ,mBAAmB,SAAS,SAAY,gBAChD,iBAAiB,QAAQ,OACzB,QAAQ,mBAAmB,SAAS,SAAY,gBAChD,iBAAiB,QAAQ,OACzB,QAAQ,mBAAmB,SAAS,QAAQ,gBAC5C,qBAAqB,QAAQ,WAC7B,iBAAiB,uBAAuB,SAAS,SAAY,oBAC7D,qBAAqB,QAAQ,WAC7B,iBAAiB,uBAAuB,SAAS,SAAY,oBAC7D,kBAAkB,QAAQ,QAC1B,gBAAgB,oBAAoB,SAAS,SAAY,iBACzD,iBAAiB,QAAQ,OACzB,QAAQ,mBAAmB,SAAS,CAAA,IAAK;AAC3C,MAAI,OAAO,SAASC,QAAO;AAAA,EAAC;AAG5B,MAAIC,QAAO,SAASA,MAAK,MAAM;AAC7B,QAAI,SAAS,UAAU,SAAS,KAAK,UAAU,CAAC,MAAM,SAAY,UAAU,CAAC,IAAI,CAAA;AACjF,QAAI,CAACF,UAAU;AACf,QAAI,cAAcN,gBAAcA,gBAAc,CAAA,GAAI,KAAK,GAAG,MAAM;AAChE,QAAI,QAAQ,YAAY,QAAQ,MAC9BS,OAAM,YAAY,MAAM,IACxB,SAAS,YAAY,SAAS;AAChC,aAAS,QAAQH,UAAS,cAAc,iCAAkC,OAAO,OAAO,IAAK,CAAC,KAAKA,UAAS,eAAeG,IAAG,KAAKH,UAAS,cAAc,OAAO;AACjK,QAAI,CAAC,SAAS,MAAM,aAAa;AAC/B,aAAO,QAAQ,QAAQF;AACvBM,QAAc,SAAS,OAAO;AAAA,QAC5B,MAAM;AAAA,QACN,IAAID;AAAA,QACJ;AAAA,QACA,OAAO;AAAA,MACf,CAAO;AACD,cAAQH,UAAS,KAAK,QAAQ,SAAS,KAAK,IAAIA,UAAS,KAAK,YAAY,SAAS,KAAK;AACxFK,SAAa,SAAS,OAAO,0BAA0B,KAAK;AAC5DD,QAAc,SAAS,OAAO,WAAW;AACzC,eAAS,MAAM,SAAS,SAAU,OAAO;AACvC,eAAO,kBAAkB,QAAQ,kBAAkB,SAAS,SAAS,cAAc,OAAO;AAAA,UACxF,MAAM;AAAA,QAChB,CAAS;AAAA,MACH;AACA,yBAAmB,QAAQ,mBAAmB,UAAU,eAAe,KAAK;AAAA,IAC9E;AACA,QAAI,SAAS,MAAO;AACpB,WAAO,MAAM,QAAQ,SAAU,OAAO;AACpC,eAAS,MAAM,cAAc;AAC7B,yBAAmB,QAAQ,mBAAmB,UAAU,eAAe,KAAK;AAAA,IAC9E,GAAG;AAAA,MACD,WAAW;AAAA,IACjB,CAAK;AACD,aAAS,QAAQ;AAAA,EACnB;AACA,MAAI,SAAS,SAASE,UAAS;AAC7B,QAAI,CAACN,aAAY,CAAC,SAAS,MAAO;AAClC,SAAI;AACJO,MAAQ,SAAS,KAAK,KAAKP,UAAS,KAAK,YAAY,SAAS,KAAK;AACnE,aAAS,QAAQ;AACjB,aAAS,QAAQ;AAAA,EACnB;AACA,MAAI,aAAa,CAAC,OAAQ,cAAaE,KAAI;AAK3C,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,IAAI;AAAA,IACJ,KAAK;AAAA,IACL;AAAA,IACA,MAAMA;AAAA,IACN,UAAU,SAAS,QAAQ;AAAA,EAC/B;AACA;AClGA,SAASZ,UAAQ,GAAG;AAAE;AAA2B,SAAOA,YAAU,cAAc,OAAO,UAAU,YAAY,OAAO,OAAO,WAAW,SAAUC,IAAG;AAAE,WAAO,OAAOA;AAAA,EAAG,IAAI,SAAUA,IAAG;AAAE,WAAOA,MAAK,cAAc,OAAO,UAAUA,GAAE,gBAAgB,UAAUA,OAAM,OAAO,YAAY,WAAW,OAAOA;AAAA,EAAG,GAAGD,UAAQ,CAAC;AAAG;AAC7T,IAAI,iBAAiB,kBAAkB,kBAAkB;AACzD,SAAS,eAAe,GAAG,GAAG;AAAE,SAAO,gBAAgB,CAAC,KAAK,sBAAsB,GAAG,CAAC,KAAK,4BAA4B,GAAG,CAAC,KAAK,iBAAgB;AAAI;AACrJ,SAAS,mBAAmB;AAAE,QAAM,IAAI,UAAU,2IAA2I;AAAG;AAChM,SAAS,4BAA4B,GAAG7D,IAAG;AAAE,MAAI,GAAG;AAAE,QAAI,YAAY,OAAO,EAAG,QAAO,kBAAkB,GAAGA,EAAC;AAAG,QAAI,IAAI,CAAA,EAAG,SAAS,KAAK,CAAC,EAAE,MAAM,GAAG,EAAE;AAAG,WAAO,aAAa,KAAK,EAAE,gBAAgB,IAAI,EAAE,YAAY,OAAO,UAAU,KAAK,UAAU,IAAI,MAAM,KAAK,CAAC,IAAI,gBAAgB,KAAK,2CAA2C,KAAK,CAAC,IAAI,kBAAkB,GAAGA,EAAC,IAAI;AAAA,EAAQ;AAAE;AACzX,SAAS,kBAAkB,GAAGA,IAAG;AAAE,GAAC,QAAQA,MAAKA,KAAI,EAAE,YAAYA,KAAI,EAAE;AAAS,WAAS,IAAI,GAAG,IAAI,MAAMA,EAAC,GAAG,IAAIA,IAAG,IAAK,GAAE,CAAC,IAAI,EAAE,CAAC;AAAG,SAAO;AAAG;AACnJ,SAAS,sBAAsB,GAAGK,IAAG;AAAE,MAAI,IAAI,QAAQ,IAAI,OAAO,eAAe,OAAO,UAAU,EAAE,OAAO,QAAQ,KAAK,EAAE,YAAY;AAAG,MAAI,QAAQ,GAAG;AAAE,QAAI,GAAG,GAAGT,IAAG,GAAGI,KAAI,CAAA,GAAI,IAAI,MAAM,IAAI;AAAO,QAAI;AAAE,UAAIJ,MAAK,IAAI,EAAE,KAAK,CAAC,GAAG,MAAM,MAAMS,GAAG;AAAA,UAAO,QAAO,EAAE,KAAK,IAAIT,GAAE,KAAK,CAAC,GAAG,UAAUI,GAAE,KAAK,EAAE,KAAK,GAAGA,GAAE,WAAWK,KAAI,IAAI,KAAG;AAAA,IAAE,SAAS2D,IAAG;AAAE,UAAI,MAAM,IAAIA;AAAA,IAAG,UAAC;AAAW,UAAI;AAAE,YAAI,CAAC,KAAK,QAAQ,EAAE,QAAQ,MAAM,IAAI,EAAE,QAAQ,EAAC,GAAI,OAAO,CAAC,MAAM,GAAI;AAAA,MAAQ,UAAC;AAAW,YAAI,EAAG,OAAM;AAAA,MAAG;AAAA,IAAE;AAAE,WAAOhE;AAAA,EAAG;AAAE;AACzf,SAAS,gBAAgB,GAAG;AAAE,MAAI,MAAM,QAAQ,CAAC,EAAG,QAAO;AAAG;AAC9D,SAAS+D,UAAQ,GAAG,GAAG;AAAE,MAAI,IAAI,OAAO,KAAK,CAAC;AAAG,MAAI,OAAO,uBAAuB;AAAE,QAAI,IAAI,OAAO,sBAAsB,CAAC;AAAG,UAAM,IAAI,EAAE,OAAO,SAAUC,IAAG;AAAE,aAAO,OAAO,yBAAyB,GAAGA,EAAC,EAAE;AAAA,IAAY,CAAC,IAAI,EAAE,KAAK,MAAM,GAAG,CAAC;AAAA,EAAG;AAAE,SAAO;AAAG;AAC9P,SAASC,gBAAc,GAAG;AAAE,WAAS,IAAI,GAAG,IAAI,UAAU,QAAQ,KAAK;AAAE,QAAI,IAAI,QAAQ,UAAU,CAAC,IAAI,UAAU,CAAC,IAAI,CAAA;AAAI,QAAI,IAAIF,UAAQ,OAAO,CAAC,GAAG,IAAI,EAAE,QAAQ,SAAUC,IAAG;AAAEE,wBAAgB,GAAGF,IAAG,EAAEA,EAAC,CAAC;AAAA,IAAG,CAAC,IAAI,OAAO,4BAA4B,OAAO,iBAAiB,GAAG,OAAO,0BAA0B,CAAC,CAAC,IAAID,UAAQ,OAAO,CAAC,CAAC,EAAE,QAAQ,SAAUC,IAAG;AAAE,aAAO,eAAe,GAAGA,IAAG,OAAO,yBAAyB,GAAGA,EAAC,CAAC;AAAA,IAAG,CAAC;AAAA,EAAG;AAAE,SAAO;AAAG;AACxb,SAASE,kBAAgB,GAAG,GAAG,GAAG;AAAE,UAAQ,IAAIC,iBAAe,CAAC,MAAM,IAAI,OAAO,eAAe,GAAG,GAAG,EAAE,OAAO,GAAG,YAAY,MAAM,cAAc,MAAM,UAAU,KAAI,CAAE,IAAI,EAAE,CAAC,IAAI,GAAG;AAAG;AACzL,SAASA,iBAAe,GAAG;AAAE,MAAIvE,KAAIwE,eAAa,GAAG,QAAQ;AAAG,SAAO,YAAYP,UAAQjE,EAAC,IAAIA,KAAIA,KAAI;AAAI;AAC5G,SAASwE,eAAa,GAAG,GAAG;AAAE,MAAI,YAAYP,UAAQ,CAAC,KAAK,CAAC,EAAG,QAAO;AAAG,MAAI,IAAI,EAAE,OAAO,WAAW;AAAG,MAAI,WAAW,GAAG;AAAE,QAAIjE,KAAI,EAAE,KAAK,GAAG,CAAC;AAAG,QAAI,YAAYiE,UAAQjE,EAAC,EAAG,QAAOA;AAAG,UAAM,IAAI,UAAU,8CAA8C;AAAA,EAAG;AAAE,UAAQ,aAAa,IAAI,SAAS,QAAQ,CAAC;AAAG;AAC9S,SAAS,uBAAuB,GAAG,GAAG;AAAE,SAAO,MAAM,IAAI,EAAE,MAAM,CAAC,IAAI,OAAO,OAAO,OAAO,iBAAiB,GAAG,EAAE,KAAK,EAAE,OAAO,OAAO,OAAO,CAAC,IAAG,CAAE,CAAC;AAAG;AACvJ,IAAI,MAAM,SAASyE,KAAI,MAAM;AAC3B,MAAIU,MAAK,KAAK;AACd,SAAO,yUAAyU,OAAOA,IAAG,iBAAiB,GAAG,QAAQ;AACxX;AACA,IAAI,UAAU,CAAA;AACd,IAAI,eAAe,CAAA;AACnB,IAAI,YAAY;AAAA,EACd,MAAM;AAAA,EACN;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,MAAM,SAAS,KAAKzD,QAAO;AACzB,QAAI,UAAU,UAAU,SAAS,KAAK,UAAU,CAAC,MAAM,SAAY,UAAU,CAAC,IAAI,CAAA;AAClF,QAAI,YAAY,UAAU,SAAS,KAAK,UAAU,CAAC,MAAM,SAAY,UAAU,CAAC,IAAI,SAAU,IAAI;AAChG,aAAO;AAAA,IACT;AACA,QAAI,gBAAgB,UAAU0D,GAAM,oBAAoB,kBAAkB,uBAAuB,CAAC,IAAI,EAAE,CAAC,IAAI1D,MAAK,CAAC;AACnH,WAAO2D,IAAW,aAAa,IAAI,SAASC,IAAU,aAAa,GAAGjB,gBAAc;AAAA,MAClF,MAAM,KAAK;AAAA,IACjB,GAAO,OAAO,CAAC,IAAI,CAAA;AAAA,EACjB;AAAA,EACA,SAAS,SAAS,UAAU;AAC1B,QAAI,UAAU,UAAU,SAAS,KAAK,UAAU,CAAC,MAAM,SAAY,UAAU,CAAC,IAAI,CAAA;AAClF,WAAO,KAAK,KAAK,KAAK,KAAK,OAAO;AAAA,EACpC;AAAA,EACA,WAAW,SAAS,YAAY;AAC9B,QAAI,QAAQ;AACZ,QAAI,UAAU,UAAU,SAAS,KAAK,UAAU,CAAC,MAAM,SAAY,UAAU,CAAC,IAAI,CAAA;AAClF,QAAI3C,SAAQ,UAAU,SAAS,KAAK,UAAU,CAAC,MAAM,SAAY,UAAU,CAAC,IAAI;AAChF,WAAO,KAAK,KAAK,KAAK,OAAO,SAAS,WAAY;AAChD,UAAI,gBAAgB,UAAU,SAAS,KAAK,UAAU,CAAC,MAAM,SAAY,UAAU,CAAC,IAAI;AACxF,aAAO6D,EAAM,aAAa,QAAQ,QAAQ,MAAM,MAAM,GAAG,OAAO,aAAa,EAAE,OAAOH,GAAM,qBAAqB,mBAAmB,uBAAuB,CAAC,IAAI,EAAE,CAAC,IAAI1D,MAAK,CAAC,CAAC;AAAA,IAChL,CAAC;AAAA,EACH;AAAA,EACA,gBAAgB,SAAS,eAAe,QAAQ;AAC9C,WAAO6D,EAAM,UAAU,KAAK,MAAM,MAAM;AAAA,EAC1C;AAAA,EACA,mBAAmB,SAAS,kBAAkB,QAAQ;AACpD,WAAOA,EAAM,aAAa,KAAK,MAAM,MAAM;AAAA,EAC7C;AAAA,EACA,mBAAmB,SAAS,kBAAkB,QAAQ;AACpD,WAAOA,EAAM,aAAa,KAAK,MAAM,MAAM;AAAA,EAC7C;AAAA,EACA,gBAAgB,SAAS,eAAe,QAAQ,UAAU,QAAQ;AAChE,WAAOA,EAAM,gBAAgB,KAAK,MAAM,QAAQ,UAAU,MAAM;AAAA,EAClE;AAAA,EACA,uBAAuB,SAAS,wBAAwB;AACtD,WAAOA,EAAM,iBAAiB,KAAK,IAAI;AAAA,EACzC;AAAA,EACA,eAAe,SAAS,gBAAgB;AACtC,QAAI,cAAc,UAAU,SAAS,KAAK,UAAU,CAAC,MAAM,SAAY,UAAU,CAAC,IAAI;AACtF,QAAI,QAAQ,UAAU,SAAS,KAAK,UAAU,CAAC,MAAM,SAAY,UAAU,CAAC,IAAI,CAAA;AAChF,QAAI,KAAK,KAAK;AACZ,UAAI,OAAO1D,EAAQ,KAAK,KAAK;AAAA,QAC3B,IAAIsD;AAAAA,MACZ,CAAO,KAAK;AACN,UAAI,SAASG,IAAUF,GAAM,qBAAqB,mBAAmB,uBAAuB,CAAC,IAAI,IAAI,EAAE,CAAC,IAAI,MAAM,WAAW,CAAC;AAC9H,UAAI,SAAS,OAAO,QAAQ,KAAK,EAAE,OAAO,SAAU,KAAK,OAAO;AAC9D,YAAI,QAAQ,eAAe,OAAO,CAAC,GACjCpD,KAAI,MAAM,CAAC,GACXzB,KAAI,MAAM,CAAC;AACb,eAAO,IAAI,KAAK,GAAG,OAAOyB,IAAG,IAAK,EAAE,OAAOzB,IAAG,GAAI,CAAC,KAAK;AAAA,MAC1D,GAAG,CAAA,CAAE,EAAE,KAAK,GAAG;AACf,aAAO8E,IAAW,MAAM,IAAI,kDAAqD,OAAO,KAAK,MAAM,IAAK,EAAE,OAAO,QAAQ,GAAG,EAAE,OAAO,QAAQ,UAAU,IAAI;AAAA,IAC7J;AACA,WAAO;AAAA,EACT;AAAA,EACA,0BAA0B,SAAS,yBAAyB,QAAQ;AAClE,QAAI,QAAQ,UAAU,SAAS,KAAK,UAAU,CAAC,MAAM,SAAY,UAAU,CAAC,IAAI,CAAA;AAChF,WAAOE,EAAM,oBAAoB,KAAK,MAAM,QAAQ,KAAK;AAAA,EAC3D;AAAA,EACA,oBAAoB,SAAS,mBAAmB,QAAQ;AACtD,QAAI,QAAQ,UAAU,SAAS,KAAK,UAAU,CAAC,MAAM,SAAY,UAAU,CAAC,IAAI,CAAA;AAChF,QAAId,OAAM,CAACc,EAAM,cAAc,KAAK,MAAM,QAAQ,KAAK,CAAC;AACxD,QAAI,KAAK,OAAO;AACd,UAAI,OAAO,KAAK,SAAS,SAAS,iBAAiB,GAAG,OAAO,KAAK,MAAM,QAAQ;AAChF,UAAI,OAAOH,GAAM,qBAAqB,mBAAmB,uBAAuB,CAAC,IAAI,EAAE,CAAC,IAAIvD,EAAQ,KAAK,OAAO;AAAA,QAC9G,IAAIsD;AAAAA,MACZ,CAAO,CAAC;AACF,UAAI,SAASG,IAAUC,EAAM,aAAa,MAAM,IAAI,CAAC;AACrD,UAAI,SAAS,OAAO,QAAQ,KAAK,EAAE,OAAO,SAAU,KAAK,OAAO;AAC9D,YAAI,QAAQ,eAAe,OAAO,CAAC,GACjCvD,KAAI,MAAM,CAAC,GACXzB,KAAI,MAAM,CAAC;AACb,eAAO,IAAI,KAAK,GAAG,OAAOyB,IAAG,IAAK,EAAE,OAAOzB,IAAG,GAAI,CAAC,KAAK;AAAA,MAC1D,GAAG,CAAA,CAAE,EAAE,KAAK,GAAG;AACf8E,UAAW,MAAM,KAAKZ,KAAI,KAAK,kDAAqD,OAAO,MAAM,IAAK,EAAE,OAAO,QAAQ,GAAG,EAAE,OAAO,QAAQ,UAAU,CAAC;AAAA,IACxJ;AACA,WAAOA,KAAI,KAAK,EAAE;AAAA,EACpB;AAAA,EACA,QAAQ,SAASe,QAAO,SAAS;AAC/B,WAAOnB,gBAAcA,gBAAc,CAAA,GAAI,IAAI,GAAG,CAAA,GAAI;AAAA,MAChD,KAAK;AAAA,MACL,OAAO;AAAA,IACb,GAAO,OAAO;AAAA,EACZ;AACF;AClHA,IAAI,kBAAkBoB,EAAQ;ACK9B,SAAS,QAAQ,GAAG;AAAE;AAA2B,SAAO,UAAU,cAAc,OAAO,UAAU,YAAY,OAAO,OAAO,WAAW,SAAUvB,IAAG;AAAE,WAAO,OAAOA;AAAA,EAAG,IAAI,SAAUA,IAAG;AAAE,WAAOA,MAAK,cAAc,OAAO,UAAUA,GAAE,gBAAgB,UAAUA,OAAM,OAAO,YAAY,WAAW,OAAOA;AAAA,EAAG,GAAG,QAAQ,CAAC;AAAG;AAC7T,SAAS,QAAQ,GAAG,GAAG;AAAE,MAAI,IAAI,OAAO,KAAK,CAAC;AAAG,MAAI,OAAO,uBAAuB;AAAE,QAAI,IAAI,OAAO,sBAAsB,CAAC;AAAG,UAAM,IAAI,EAAE,OAAO,SAAUE,IAAG;AAAE,aAAO,OAAO,yBAAyB,GAAGA,EAAC,EAAE;AAAA,IAAY,CAAC,IAAI,EAAE,KAAK,MAAM,GAAG,CAAC;AAAA,EAAG;AAAE,SAAO;AAAG;AAC9P,SAAS,cAAc,GAAG;AAAE,WAAS,IAAI,GAAG,IAAI,UAAU,QAAQ,KAAK;AAAE,QAAI,IAAI,QAAQ,UAAU,CAAC,IAAI,UAAU,CAAC,IAAI,CAAA;AAAI,QAAI,IAAI,QAAQ,OAAO,CAAC,GAAG,IAAI,EAAE,QAAQ,SAAUA,IAAG;AAAE,sBAAgB,GAAGA,IAAG,EAAEA,EAAC,CAAC;AAAA,IAAG,CAAC,IAAI,OAAO,4BAA4B,OAAO,iBAAiB,GAAG,OAAO,0BAA0B,CAAC,CAAC,IAAI,QAAQ,OAAO,CAAC,CAAC,EAAE,QAAQ,SAAUA,IAAG;AAAE,aAAO,eAAe,GAAGA,IAAG,OAAO,yBAAyB,GAAGA,EAAC,CAAC;AAAA,IAAG,CAAC;AAAA,EAAG;AAAE,SAAO;AAAG;AACxb,SAAS,gBAAgB,GAAG,GAAG,GAAG;AAAE,UAAQ,IAAI,eAAe,CAAC,MAAM,IAAI,OAAO,eAAe,GAAG,GAAG,EAAE,OAAO,GAAG,YAAY,MAAM,cAAc,MAAM,UAAU,KAAI,CAAE,IAAI,EAAE,CAAC,IAAI,GAAG;AAAG;AACzL,SAAS,eAAe,GAAG;AAAE,MAAIpE,KAAI,aAAa,GAAG,QAAQ;AAAG,SAAO,YAAY,QAAQA,EAAC,IAAIA,KAAIA,KAAI;AAAI;AAC5G,SAAS,aAAa,GAAG,GAAG;AAAE,MAAI,YAAY,QAAQ,CAAC,KAAK,CAAC,EAAG,QAAO;AAAG,MAAI,IAAI,EAAE,OAAO,WAAW;AAAG,MAAI,WAAW,GAAG;AAAE,QAAIA,KAAI,EAAE,KAAK,GAAG,CAAC;AAAG,QAAI,YAAY,QAAQA,EAAC,EAAG,QAAOA;AAAG,UAAM,IAAI,UAAU,8CAA8C;AAAA,EAAG;AAAE,UAAQ,aAAa,IAAI,SAAS,QAAQ,CAAC;AAAG;AAC9S,IAAI,iBAAiB;AAAA,EACnB,QAAQ;AAAA,EACR,YAAY;AAAA,EACZ,cAAc;AAAA,EACd,QAAQ;AAAA,IACN,YAAY;AAAA,IACZ,UAAU;AAAA,IACV,aAAa;AAAA,IACb,UAAU;AAAA,IACV,QAAQ;AAAA,IACR,WAAW;AAAA,IACX,UAAU;AAAA,IACV,IAAI;AAAA,IACJ,KAAK;AAAA,IACL,IAAI;AAAA,IACJ,KAAK;AAAA,IACL,QAAQ;AAAA,IACR,WAAW;AAAA,IACX,YAAY;AAAA,IACZ,WAAW;AAAA,IACX,OAAO;AAAA,IACP,OAAO;AAAA,IACP,UAAU;AAAA,IACV,UAAU;AAAA,IACV,SAAS;AAAA,IACT,YAAY;AAAA,IACZ,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,WAAW;AAAA,IACX,SAAS;AAAA,IACT,eAAe,CAAC,KAAK,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,IAAI;AAAA,IACnE,UAAU,CAAC,UAAU,UAAU,WAAW,aAAa,YAAY,UAAU,UAAU;AAAA,IACvF,eAAe,CAAC,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,KAAK;AAAA,IAC/D,aAAa,CAAC,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,IAAI;AAAA,IACtD,YAAY,CAAC,WAAW,YAAY,SAAS,SAAS,OAAO,QAAQ,QAAQ,UAAU,aAAa,WAAW,YAAY,UAAU;AAAA,IACrI,iBAAiB,CAAC,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,KAAK;AAAA,IACpG,YAAY;AAAA,IACZ,aAAa;AAAA,IACb,YAAY;AAAA,IACZ,YAAY;AAAA,IACZ,YAAY;AAAA,IACZ,UAAU;AAAA,IACV,UAAU;AAAA,IACV,WAAW;AAAA,IACX,WAAW;AAAA,IACX,UAAU;AAAA,IACV,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,YAAY;AAAA,IACZ,YAAY;AAAA,IACZ,YAAY;AAAA,IACZ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,YAAY;AAAA,IACZ,gBAAgB;AAAA,IAChB,oBAAoB;AAAA,IACpB,YAAY;AAAA,IACZ,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,gBAAgB;AAAA,IAChB,oBAAoB;AAAA,IACpB,eAAe;AAAA,IACf,kBAAkB;AAAA,IAClB,uBAAuB;AAAA,IACvB,oBAAoB;AAAA,IACpB,mBAAmB;AAAA,IACnB,qBAAqB;AAAA,IACrB,cAAc;AAAA,IACd,MAAM;AAAA,MACJ,WAAW;AAAA,MACX,YAAY;AAAA,MACZ,WAAW;AAAA,MACX,MAAM;AAAA,MACN,OAAO;AAAA,MACP,WAAW;AAAA,MACX,aAAa;AAAA,MACb,OAAO;AAAA,MACP,UAAU;AAAA,MACV,MAAM;AAAA,MACN,YAAY;AAAA,MACZ,WAAW;AAAA,MACX,SAAS;AAAA,MACT,QAAQ;AAAA,MACR,UAAU;AAAA,MACV,YAAY;AAAA,MACZ,cAAc;AAAA,MACd,cAAc;AAAA,MACd,iBAAiB;AAAA,MACjB,iBAAiB;AAAA,MACjB,WAAW;AAAA,MACX,gBAAgB;AAAA,MAChB,eAAe;AAAA,MACf,eAAe;AAAA,MACf,eAAe;AAAA,MACf,kBAAkB;AAAA,MAClB,yBAAyB;AAAA,MACzB,sBAAsB;AAAA,MACtB,WAAW;AAAA,MACX,aAAa;AAAA,MACb,WAAW;AAAA,MACX,aAAa;AAAA,MACb,gBAAgB;AAAA,MAChB,gBAAgB;AAAA,MAChB,gBAAgB;AAAA,MAChB,kBAAkB;AAAA,MAClB,SAAS;AAAA,MACT,UAAU;AAAA,MACV,YAAY;AAAA,MACZ,UAAU;AAAA,MACV,UAAU;AAAA,MACV,OAAO;AAAA,MACP,aAAa;AAAA,MACb,WAAW;AAAA,MACX,QAAQ;AAAA,MACR,SAAS;AAAA,MACT,aAAa;AAAA,MACb,YAAY;AAAA,MACZ,WAAW;AAAA,IACjB;AAAA,EACA;AAAA,EACE,wBAAwB;AAAA,IACtB,MAAM,CAAC,gBAAgB,aAAa,gBAAgB,UAAU,gBAAgB,cAAc,gBAAgB,WAAW,gBAAgB,QAAQ,gBAAgB,UAAU;AAAA,IACzK,SAAS,CAAC,gBAAgB,QAAQ,gBAAgB,YAAY,gBAAgB,WAAW,gBAAgB,uBAAuB,gBAAgB,cAAc,gBAAgB,wBAAwB;AAAA,IACtM,MAAM,CAAC,gBAAgB,SAAS,gBAAgB,aAAa,gBAAgB,aAAa,gBAAgB,UAAU;AAAA,EACxH;AAAA,EACE,QAAQ;AAAA,IACN,OAAO;AAAA,IACP,SAAS;AAAA,IACT,MAAM;AAAA,IACN,SAAS;AAAA,EACb;AAAA,EACE,OAAO;AAAA,EACP,UAAU;AAAA,EACV,IAAI;AAAA,EACJ,WAAW;AAAA,IACT,eAAe;AAAA,IACf,YAAY;AAAA,EAChB;AAAA,EACE,KAAK;AAAA,IACH,OAAO;AAAA,EACX;AACA;AACA,IAAI,iBAAiB,OAAM;AAQ3B,SAAS,MAAMsB,MAAK,SAAS;AAC3B,MAAIoE,YAAW;AAAA,IACb,QAAQ,SAAS,OAAO;AAAA,EAC5B;AACE,EAAApE,KAAI,OAAO,iBAAiB,YAAYoE;AACxC,EAAApE,KAAI,QAAQ,gBAAgBoE,SAAQ;AACpC,cAAW;AACX,cAAYpE,MAAKoE,SAAQ;AACzB,SAAOA;AACT;AACA,IAAI,eAAe,CAAA;AACnB,SAAS,cAAc;AACrBC,IAAa,MAAK;AAClB,eAAa,QAAQ,SAAU,IAAI;AACjC,WAAO,OAAO,QAAQ,OAAO,SAAS,SAAS,GAAE;AAAA,EACnD,CAAC;AACD,iBAAe,CAAA;AACjB;AACA,SAAS,YAAYrE,MAAKoE,WAAU;AAClC,MAAI,iBAAiB,IAAI,KAAK;AAG9B,MAAI,kBAAkB,SAASE,mBAAkB;AAC/C,QAAI;AACJ,UAAM,mBAAmBF,UAAS,YAAY,QAAQ,qBAAqB,SAAS,SAAS,iBAAiB,WAAW,OAAQ;AAGjI,QAAI,CAACH,EAAM,kBAAkB,QAAQ,GAAG;AACtC,UAAI,uBAAuB;AAC3B,UAAI,SAAS,wBAAwB,UAAU,oBAAoB,QAAQ,0BAA0B,SAAS,SAAS,sBAAsB,KAAK,SAAS,MAAM,CAAA,GAC/J,YAAY,KAAK,WACjB,WAAW,KAAK,UAChBM,UAAS,KAAK,QACdnE,SAAQ,KAAK;AACf,UAAI,eAAe;AAAA,QACjB,QAAQ,oBAAoBgE,UAAS,YAAY,QAAQ,sBAAsB,WAAW,oBAAoB,kBAAkB,SAAS,QAAQ,sBAAsB,SAAS,SAAS,kBAAkB;AAAA,MACnN;AACM,gBAAU,KAAK,cAAc,QAAQ,cAAc,SAAS,SAAS,UAAU,KAAK,cAAc;AAAA,QAChG,MAAM;AAAA,MACd,GAAS,YAAY,CAAC;AAChB,gBAAU,KAAK,aAAa,QAAQ,aAAa,SAAS,SAAS,SAAS,KAAK,cAAc;AAAA,QAC7F,MAAM;AAAA,MACd,GAAS,YAAY,CAAC;AAChB,gBAAU,KAAKG,YAAW,QAAQA,YAAW,SAAS,SAASA,QAAO,KAAK,cAAc;AAAA,QACvF,MAAM;AAAA,MACd,GAAS,YAAY,CAAC;AAChB,gBAAU,UAAU,cAAc;AAAA,QAChC,MAAM;AAAA,MACd,GAAS,YAAY,GAAGnE,MAAK;AACvB6D,QAAM,mBAAmB,QAAQ;AAAA,IACnC;AAAA,EACF;AACAI,IAAa,GAAG,gBAAgB,SAAU,UAAU;AAClD,QAAI,CAAC,eAAe,OAAO;AACzB,MAAArE,KAAI,OAAO,iBAAiB,UAAU,OAAO,QAAQ;AACrD,qBAAe,QAAQ;AAAA,IACzB;AAAA,EACF,CAAC;AAGD,MAAI,oBAAoB,MAAMoE,UAAS,QAAQ,SAAU,UAAU,UAAU;AAC3E,oBAAgB,KAAK,iBAAiB;AAAA,MACpC;AAAA,MACA;AAAA,IACN,CAAK;AAAA,EACH,GAAG;AAAA,IACD,WAAW;AAAA,IACX,MAAM;AAAA,EACV,CAAG;AACD,MAAI,oBAAoB,MAAM,WAAY;AACxC,WAAOA,UAAS,OAAO;AAAA,EACzB,GAAG,SAAU,UAAU,UAAU;AAC/B,oBAAgB,KAAK,wBAAwB;AAAA,MAC3C;AAAA,MACA;AAAA,IACN,CAAK;AAAA,EACH,GAAG;AAAA,IACD,WAAW;AAAA,IACX,MAAM;AAAA,EACV,CAAG;AACD,MAAI,mBAAmB,MAAM,WAAY;AACvC,WAAOA,UAAS,OAAO;AAAA,EACzB,GAAG,SAAU,UAAU,UAAU;AAC/B,QAAI,CAAC,eAAe,OAAO;AACzBH,QAAM,SAAS,QAAQ;AAAA,IACzB;AACA,QAAI,CAACG,UAAS,OAAO,UAAU;AAC7B,sBAAe;AAAA,IACjB;AACA,mBAAe,QAAQ;AACvB,oBAAgB,KAAK,uBAAuB;AAAA,MAC1C;AAAA,MACA;AAAA,IACN,CAAK;AAAA,EACH,GAAG;AAAA,IACD,WAAW;AAAA,IACX,MAAM;AAAA,EACV,CAAG;AACD,MAAI,sBAAsB,MAAM,WAAY;AAC1C,WAAOA,UAAS,OAAO;AAAA,EACzB,GAAG,SAAU,UAAU,UAAU;AAC/B,QAAI,CAAC,YAAYA,UAAS,OAAO,OAAO;AACtC,sBAAe;AAAA,IACjB;AACA,oBAAgB,KAAK,0BAA0B;AAAA,MAC7C;AAAA,MACA;AAAA,IACN,CAAK;AAAA,EACH,GAAG;AAAA,IACD,WAAW;AAAA,IACX,MAAM;AAAA,EACV,CAAG;AACD,eAAa,KAAK,iBAAiB;AACnC,eAAa,KAAK,iBAAiB;AACnC,eAAa,KAAK,gBAAgB;AAClC,eAAa,KAAK,mBAAmB;AACvC;AACA,IAAI,WAAW;AAAA,EACb,SAAS,SAAS,QAAQpE,MAAK,SAAS;AACtC,QAAI,gBAAgBwE,EAAU,gBAAgB,OAAO;AACrD,UAAMxE,MAAK,aAAa;AAAA,EAC1B;AACF;;;;;;;;;;;;;;;;AChRA,UAAM,QAAQ;AAWd,UAAM,eAAe,SAAS,MAAM;AAClC,aAAO,MAAM,UAAU,gBAAgB,MAAM,OAAO,KAAK;AAAA,IAC3D,CAAC;;0BA9BCyE,mBAWO,QAAA;AAAA,QAXD,OAAKC,eAAA,CAAC,eAAsB,aAAA,KAAY,CAAA;AAAA,MAAA;QAC5CC,gBAAkD,QAAlDC,cAAkDC,gBAAf,QAAA,KAAK,GAAA,CAAA;AAAA,QAC5B,QAAA,UAAU,UAAtBC,aAAAL,mBAAgF,QAAhFM,cAA4D,MAACF,gBAAG,QAAA,KAAK,IAAG,KAAC,CAAA;QAEjE,QAAA,0BADRJ,mBAOS,UAAA;AAAA;UALP,OAAM;AAAA,UACL,6DAAYO,KAAAA,MAAK,QAAA,GAAA,CAAA,MAAA,CAAA;AAAA,UAClB,MAAK;AAAA,QAAA,GACN,KAED;;;;;;;;;;;;;;;;;;0BCVFP,mBAKS,UAAA;AAAA,QALD,OAAM;AAAA,QAAc,MAAK;AAAA,QAAU,+CAAOO,KAAAA,MAAK,OAAA;AAAA,MAAA;QACrDL,gBAEM,OAAA;AAAA,UAFD,OAAM;AAAA,UAAoB,SAAQ;AAAA,UAAY,MAAK;AAAA,QAAA;UACtDA,gBAA+Z,QAAA,EAAzZ,GAAE,uZAAqZ;AAAA,QAAA;QAE/ZA,gBAA2C,QAAA,EAArC,OAAM,oBAAA,GAAoB,QAAI,EAAA;AAAA,MAAA;;;;;;;;;;;;;;;;;;;;;;;;ACuBxC,UAAM,QAAQ;AASd,UAAM,WAAW,CAAC,SAAiB;AACjC,YAAM,QAAQ,MAAM,OAAO,KAAK,CAAA7E,OAAKA,GAAE,SAAS,IAAI;AACpD,aAAO,+BAAO;AAAA,IAChB;;AAvCE,aAAAgF,UAAA,GAAAL,mBAmBM,OAnBNG,cAmBM;AAAA,QAlBJD,gBAGM,OAHNI,cAGM;AAAA,UAFJ,OAAA,CAAA,MAAA,OAAA,CAAA,IAAAJ,gBAA8C,QAAA,EAAxC,OAAM,iBAAA,GAAiB,cAAU,EAAA;AAAA,UACvCM,YAAqC,YAAA;AAAA,YAAxB,+CAAOD,KAAAA,MAAK,MAAA;AAAA,UAAA;;QAE3BL,gBAaM,OAbNO,cAaM;AAAA,UAZO,QAAA,SAAS,WAAM,kBAA1BT,mBAEM,OAFNU,cAA+D,cAE/D,MACAL,UAAA,GAAAL,mBAQM,OARNW,cAQM;AAAA,8BAPJX,mBAMEY,UAAA,MAAAC,WALe,QAAA,UAAQ,CAAhB,SAAI;kCADbC,YAME,YAAA;AAAA,gBAJC,KAAK;AAAA,gBACL,OAAO;AAAA,gBACP,OAAO,SAAS,IAAI;AAAA,gBACrB,SAAQ;AAAA,cAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACfhB,aAAAT,UAAA,GAAAL,mBA+CM,OA/CNG,cA+CM;AAAA,kCA9CJD,gBAEM,OAAA,EAFD,OAAM,qBAAiB;AAAA,UAC1BA,gBAAwC,QAAA,EAAlC,OAAM,iBAAA,GAAiB,MAAI;AAAA,QAAA;QAEnCA,gBA0CM,OA1CNI,cA0CM;AAAA,UAxCJJ,gBAkBM,OAlBNO,cAkBM;AAAA,YAjBJP,gBAGM,OAHNQ,cAGM;AAAA,cAFJ,OAAA,CAAA,MAAA,OAAA,CAAA,IAAAR,gBAAiF,QAAA,EAA3E,OAAM,uDAAA,GAAuD,WAAO,EAAA;AAAA,cAC1EM,YAA6C,YAAA;AAAA,gBAAhC,+CAAOD,KAAAA,MAAK,cAAA;AAAA,cAAA;;YAE3BL,gBAYM,OAZNS,cAYM;AAAA,cAXO,QAAA,YAAY,WAAM,kBAA7BX,mBAEM,OAFNe,cAA4D,QAE5D,MACAV,UAAA,GAAAL,mBAOM,OAPNgB,cAOM;AAAA,kCANJhB,mBAKEY,UAAA,MAAAC,WAJc,QAAA,aAAW,CAAlB,QAAG;sCADZC,YAKE,YAAA;AAAA,oBAHC,KAAK;AAAA,oBACL,OAAO;AAAA,oBACR,SAAQ;AAAA,kBAAA;;;;;UAOhBZ,gBAkBM,OAlBNe,cAkBM;AAAA,YAjBJf,gBAGM,OAHNgB,cAGM;AAAA,cAFJ,OAAA,CAAA,MAAA,OAAA,CAAA,IAAAhB,gBAAiF,QAAA,EAA3E,OAAM,uDAAA,GAAuD,WAAO,EAAA;AAAA,cAC1EM,YAA6C,YAAA;AAAA,gBAAhC,+CAAOD,KAAAA,MAAK,cAAA;AAAA,cAAA;;YAE3BL,gBAYM,OAZNiB,eAYM;AAAA,cAXO,QAAA,YAAY,WAAM,kBAA7BnB,mBAEM,OAFNoB,eAA4D,QAE5D,MACAf,UAAA,GAAAL,mBAOM,OAPNqB,eAOM;AAAA,kCANJrB,mBAKEY,UAAA,MAAAC,WAJc,QAAA,aAAW,CAAlB,QAAG;sCADZC,YAKE,YAAA;AAAA,oBAHC,KAAK;AAAA,oBACL,OAAO;AAAA,oBACR,SAAQ;AAAA,kBAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACgCtB,UAAM,QAAQ;AAKd,UAAMrF,QAAO;AAOb,UAAM,eAAe,CAAC,SAAiB;AACrC,UAAI,KAAK,UAAU,GAAI,QAAO;AAC9B,aAAO,QAAQ,KAAK,MAAM,GAAG;AAAA,IAC/B;AAEA,UAAM,gBAAgB,CAAC,SAAiB;AACtC,MAAAA,MAAK,yBAAyB,MAAM,eAAe,OAAO,CAAAT,OAAKA,OAAM,IAAI,CAAC;AAAA,IAC5E;AAEA,UAAM,gBAAgB,CAAC,SAAiB;AACtC,MAAAS,MAAK,yBAAyB,MAAM,eAAe,OAAO,CAAAT,OAAKA,OAAM,IAAI,CAAC;AAAA,IAC5E;;AAhGE,aAAAqF,UAAA,GAAAL,mBAmEM,OAnENG,cAmEM;AAAA,kCAlEJD,gBAEM,OAAA,EAFD,OAAM,qBAAiB;AAAA,UAC1BA,gBAA2C,QAAA,EAArC,OAAM,iBAAA,GAAiB,SAAO;AAAA,QAAA;QAEtCA,gBA8DM,OA9DNI,cA8DM;AAAA,UA5DJJ,gBA4BM,OA5BNO,cA4BM;AAAA,YA3BJP,gBAWM,OAXNQ,cAWM;AAAA,cAVJ,OAAA,CAAA,MAAA,OAAA,CAAA,IAAAR,gBAAiF,QAAA,EAA3E,OAAM,uDAAA,GAAuD,WAAO,EAAA;AAAA,cAC1EA,gBAQS,UAAA;AAAA,gBAPP,MAAK;AAAA,gBACL,OAAM;AAAA,gBACL,+CAAOK,KAAAA,MAAK,cAAA;AAAA,cAAA;gBAEbL,gBAEM,OAAA;AAAA,kBAFD,SAAQ;AAAA,kBAAY,MAAK;AAAA,gBAAA;kBAC5BA,gBAAkc,QAAA,EAA5b,GAAE,0bAAwb;AAAA,gBAAA;;;YAItcA,gBAcM,OAdNS,cAcM;AAAA,cAbO,QAAA,eAAe,SAAM,KAAhCN,aAAAL,mBASM,OATNe,cASM;AAAA,kCARJf,mBAOEY,UAAA,MAAAC,WANe,QAAA,gBAAc,CAAtB,SAAI;sCADbC,YAOE,YAAA;AAAA,oBALC,KAAK;AAAA,oBACL,OAAO,aAAa,IAAI;AAAA,oBACzB,SAAQ;AAAA,oBACR,WAAA;AAAA,oBACC,UAAM,CAAA,WAAE,cAAc,IAAI;AAAA,kBAAA;;kCAG/Bd,mBAEM,OAFNgB,cAAmC,uBAEnC;AAAA,YAAA;;UAKJd,gBA4BM,OA5BNe,cA4BM;AAAA,YA3BJf,gBAWM,OAXNgB,cAWM;AAAA,cAVJ,OAAA,CAAA,MAAA,OAAA,CAAA,IAAAhB,gBAAiF,QAAA,EAA3E,OAAM,uDAAA,GAAuD,WAAO,EAAA;AAAA,cAC1EA,gBAQS,UAAA;AAAA,gBAPP,MAAK;AAAA,gBACL,OAAM;AAAA,gBACL,+CAAOK,KAAAA,MAAK,cAAA;AAAA,cAAA;gBAEbL,gBAEM,OAAA;AAAA,kBAFD,SAAQ;AAAA,kBAAY,MAAK;AAAA,gBAAA;kBAC5BA,gBAAkc,QAAA,EAA5b,GAAE,0bAAwb;AAAA,gBAAA;;;YAItcA,gBAcM,OAdNiB,eAcM;AAAA,cAbO,QAAA,eAAe,SAAM,KAAhCd,aAAAL,mBASM,OATNoB,eASM;AAAA,kCARJpB,mBAOEY,UAAA,MAAAC,WANe,QAAA,gBAAc,CAAtB,SAAI;sCADbC,YAOE,YAAA;AAAA,oBALC,KAAK;AAAA,oBACL,OAAO,aAAa,IAAI;AAAA,oBACzB,SAAQ;AAAA,oBACR,WAAA;AAAA,oBACC,UAAM,CAAA,WAAE,cAAc,IAAI;AAAA,kBAAA;;kCAG/Bd,mBAEM,OAFNqB,eAAmC,uBAEnC;AAAA,YAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACiBV,UAAM,QAAQ;AAMd,UAAM5F,QAAO;AAMb,UAAM,eAAe,IAAI,EAAE;AAC3B,UAAM,eAAe,IAAI,EAAE;AAE3B,UAAM,aAAa,MAAM;AACvB,YAAM,UAAU,aAAa,MAAM,KAAA;AACnC,UAAI,WAAW,CAAC,MAAM,gBAAgB,SAAS,OAAO,GAAG;AACvD,QAAAA,MAAK,0BAA0B,CAAC,GAAG,MAAM,iBAAiB,OAAO,CAAC;AAClE,qBAAa,QAAQ;AAAA,MACvB;AAAA,IACF;AAEA,UAAM,aAAa,MAAM;AACvB,YAAM,UAAU,aAAa,MAAM,KAAA;AACnC,UAAI,WAAW,CAAC,MAAM,gBAAgB,SAAS,OAAO,GAAG;AACvD,QAAAA,MAAK,0BAA0B,CAAC,GAAG,MAAM,iBAAiB,OAAO,CAAC;AAClE,qBAAa,QAAQ;AAAA,MACvB;AAAA,IACF;AAEA,UAAM,gBAAgB,CAAC,YAAoB;AACzC,MAAAA,MAAK,0BAA0B,MAAM,gBAAgB,OAAO,CAAAT,OAAKA,OAAM,OAAO,CAAC;AAAA,IACjF;AAEA,UAAM,gBAAgB,CAAC,YAAoB;AACzC,MAAAS,MAAK,0BAA0B,MAAM,gBAAgB,OAAO,CAAAT,OAAKA,OAAM,OAAO,CAAC;AAAA,IACjF;;AArHE,aAAAqF,UAAA,GAAAL,mBAyEM,OAzENG,cAyEM;AAAA,QAxEJD,gBAUM,OAVNI,cAUM;AAAA,UATJ,OAAA,CAAA,MAAA,OAAA,CAAA,IAAAJ,gBAAiD,QAAA,EAA3C,OAAM,iBAAA,GAAiB,iBAAa,EAAA;AAAA,UAC1CA,gBAOQ,SAPRO,cAOQ;AAAA,YANNP,gBAIE,SAAA;AAAA,cAHA,MAAK;AAAA,cACJ,SAAS,QAAA;AAAA,cACT,gDAAQK,KAAAA,MAAK,mBAAqB,OAAO,OAA4B,OAAO;AAAA,YAAA;YAE/E,OAAA,CAAA,MAAA,OAAA,CAAA,IAAAL,gBAAoD,QAAA,EAA9C,OAAM,2BAAwB,aAAS,EAAA;AAAA,UAAA;;QAGjDA,gBA4DM,OA5DNS,cA4DM;AAAA,UA1DJT,gBA2BM,OA3BNa,cA2BM;AAAA,sCA1BJb,gBAEM,OAAA,EAFD,OAAM,4BAAwB;AAAA,cACjCA,gBAAiF,QAAA,EAA3E,OAAM,uDAAA,GAAuD,SAAO;AAAA,YAAA;YAE5EA,gBASM,OATNc,cASM;AAAA,6BARJd,gBAME,SAAA;AAAA,gBALA,MAAK;AAAA,6EACI,aAAY,QAAA;AAAA,gBACpB,aAAa,QAAA,WAAQ,yBAAA;AAAA,gBACtB,OAAM;AAAA,gBACL,oBAAe,YAAU,CAAA,OAAA,CAAA;AAAA,cAAA;6BAHjB,aAAA,KAAY;AAAA,cAAA;cAKvBA,gBAA6E,UAAA;AAAA,gBAArE,MAAK;AAAA,gBAAS,OAAM;AAAA,gBAAoB,SAAO;AAAA,cAAA,GAAY,GAAC;AAAA,YAAA;YAEtEA,gBAYM,OAZNgB,cAYM;AAAA,gCAXJlB,mBAOEY,UAAA,MAAAC,WANkB,QAAA,iBAAe,CAA1B,YAAO;oCADhBC,YAOE,YAAA;AAAA,kBALC,KAAK;AAAA,kBACL,OAAO;AAAA,kBACR,SAAQ;AAAA,kBACR,WAAA;AAAA,kBACC,UAAM,CAAA,WAAE,cAAc,OAAO;AAAA,gBAAA;;cAErB,QAAA,gBAAgB,WAAM,kBAAjCd,mBAEM,OAFNmB,eAEMf,gBADD,QAAA,WAAQ,sBAAA,kBAAA,GAAA,CAAA;;;UAMjBF,gBA2BM,OA3BNkB,eA2BM;AAAA,sCA1BJlB,gBAEM,OAAA,EAFD,OAAM,4BAAwB;AAAA,cACjCA,gBAAiF,QAAA,EAA3E,OAAM,uDAAA,GAAuD,SAAO;AAAA,YAAA;YAE5EA,gBASM,OATNmB,eASM;AAAA,6BARJnB,gBAME,SAAA;AAAA,gBALA,MAAK;AAAA,6EACI,aAAY,QAAA;AAAA,gBACpB,aAAa,QAAA,WAAQ,yBAAA;AAAA,gBACtB,OAAM;AAAA,gBACL,oBAAe,YAAU,CAAA,OAAA,CAAA;AAAA,cAAA;6BAHjB,aAAA,KAAY;AAAA,cAAA;cAKvBA,gBAA6E,UAAA;AAAA,gBAArE,MAAK;AAAA,gBAAS,OAAM;AAAA,gBAAoB,SAAO;AAAA,cAAA,GAAY,GAAC;AAAA,YAAA;YAEtEA,gBAYM,OAZNoB,eAYM;AAAA,gCAXJtB,mBAOEY,UAAA,MAAAC,WANkB,QAAA,iBAAe,CAA1B,YAAO;oCADhBC,YAOE,YAAA;AAAA,kBALC,KAAK;AAAA,kBACL,OAAO;AAAA,kBACR,SAAQ;AAAA,kBACR,WAAA;AAAA,kBACC,UAAM,CAAA,WAAE,cAAc,OAAO;AAAA,gBAAA;;cAErB,QAAA,gBAAgB,WAAM,kBAAjCd,mBAEM,OAFNuB,eAEMnB,gBADD,QAAA,WAAQ,sBAAA,kBAAA,GAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;;ACpErB,aAAAC,UAAA,GAAAL,mBAmCM,OAnCNG,cAmCM;AAAA,kCAlCJD,gBAEM,OAAA,EAFD,OAAM,qBAAiB;AAAA,UAC1BA,gBAA2C,QAAA,EAArC,OAAM,iBAAA,GAAiB,SAAO;AAAA,QAAA;QAEtCA,gBA8BM,OA9BNI,cA8BM;AAAA,UA7BJJ,gBAaQ,SAbRO,cAaQ;AAAA,sCAZNP,gBAA8G,QAAA;AAAA,cAAxG,OAAM;AAAA,cAAqB,OAAM;AAAA,YAAA,GAA8C,sBAAkB,EAAA;AAAA,YACvGA,gBAUS,UAAA;AAAA,cATP,MAAK;AAAA,cACL,OAAKD,eAAA,CAAC,iBAAe,EAAA,yBACc,QAAA,iBAAA,CAAgB,CAAA;AAAA,cAClD,SAAK,OAAA,CAAA,MAAA,OAAA,CAAA,IAAA,CAAA,WAAEM,KAAAA,MAAK,2BAAA,CAA6B,QAAA,gBAAgB;AAAA,cAC1D,MAAK;AAAA,cACJ,gBAAc,QAAA;AAAA,YAAA;cAEfL,gBAA0C,QAAA,EAApC,OAAM,uBAAA,GAAsB,MAAA,EAAA;AAAA,cAClCA,gBAA0C,QAAA,EAApC,OAAM,uBAAA,GAAsB,MAAA,EAAA;AAAA,YAAA;;UAItCA,gBAaQ,SAbRS,cAaQ;AAAA,sCAZNT,gBAA4F,QAAA;AAAA,cAAtF,OAAM;AAAA,cAAqB,OAAM;AAAA,YAAA,GAAiC,iBAAa,EAAA;AAAA,YACrFA,gBAUS,UAAA;AAAA,cATP,MAAK;AAAA,cACL,OAAKD,eAAA,CAAC,iBAAe,EAAA,yBACc,QAAA,aAAA,CAAY,CAAA;AAAA,cAC9C,SAAK,OAAA,CAAA,MAAA,OAAA,CAAA,IAAA,CAAA,WAAEM,KAAAA,MAAK,uBAAA,CAAyB,QAAA,YAAY;AAAA,cAClD,MAAK;AAAA,cACJ,gBAAc,QAAA;AAAA,YAAA;cAEfL,gBAA0C,QAAA,EAApC,OAAM,uBAAA,GAAsB,MAAA,EAAA;AAAA,cAClCA,gBAA0C,QAAA,EAApC,OAAM,uBAAA,GAAsB,MAAA,EAAA;AAAA,YAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACwC5C,UAAM,cAAc,IAAI,KAAK;AAE7B,UAAM,eAAe,CAAC,UAAiB;AACrC,YAAM,MAAM,MAAM;AAClB,UAAI,MAAM,UAAU;AAAA,IACtB;;AA5EE,aAAAG,UAAA,GAAAL,mBAsDM,OAtDNG,cAsDM;AAAA,QArDJD,gBAkBM,OAAA;AAAA,UAjBJ,OAAM;AAAA,UACL,oDAAY,YAAA,QAAW;AAAA,UACvB,oDAAY,YAAA,QAAW;AAAA,QAAA;UAExBA,gBAAqF,QAArFI,cAA6B,qBAAgBF,gBAAG,QAAA,WAAW,gBAAc,GAAA,CAAA;AAAA,UACzEF,gBAWS,UAAA;AAAA,YAVP,MAAK;AAAA,YACL,OAAKD,eAAA,CAAC,oBAAkB,EAAA,6BACe,QAAA,UAAA,CAAS,CAAA;AAAA,YAC/C,6DAAYM,KAAAA,MAAK,SAAA,GAAA,CAAA,MAAA,CAAA;AAAA,YACjB,UAAU,QAAA;AAAA,UAAA;YAEXL,gBAGM,OAAA;AAAA,cAHD,OAAM;AAAA,cAAwB,SAAQ;AAAA,cAAY,MAAK;AAAA,YAAA;cAC1DA,gBAAmN,QAAA,EAA7M,GAAE,2MAAyM;AAAA,cACjNA,gBAAoO,QAAA;AAAA,gBAA9N,aAAU;AAAA,gBAAU,GAAE;AAAA,cAAA;;;;QAMlCM,YA2BagB,YAAA,EA3BD,MAAK,aAAS;AAAA,2BACxB,MAyBM;AAAA,YAzBK,YAAA,SAAe,QAAA,MAAM,SAAM,KAAtCnB,aAAAL,mBAyBM,OAzBNU,cAyBM;AAAA,cAxBJR,gBAuBM,OAvBNS,cAuBM;AAAA,iBAtBJN,UAAA,IAAA,GAAAL,mBAkBMY,UAAA,MAAAC,WAjBW,QAAA,MAAM,cAAd,SAAI;sCADbb,mBAkBM,OAAA;AAAA,oBAhBH,KAAK,KAAK;AAAA,oBACX,OAAM;AAAA,kBAAA;oBAGE,KAAK,4BADbA,mBAKE,OAAA;AAAA;sBAHC,KAAK,KAAK;AAAA,sBACX,OAAM;AAAA,sBACL,SAAO;AAAA,oBAAA,+BAEVK,aAAAL,mBAKM,OALNgB,cAKM,CAAA,GAAA,OAAA,CAAA,MAAA,OAAA,CAAA,IAAA;AAAA,sBAJJd,gBAGM,OAAA;AAAA,wBAHD,SAAQ;AAAA,wBAAY,MAAK;AAAA,sBAAA;wBAC5BA,gBAA2D,QAAA,EAArD,GAAE,mDAAiD;AAAA,wBACzDA,gBAAuN,QAAA,EAAjN,GAAE,+MAA6M;AAAA,sBAAA;;oBAGzNA,gBAA0E,QAA1Ee,cAA0Eb,gBAA3C,KAAK,cAAc,KAAK,SAAS,GAAA,CAAA;AAAA,kBAAA;;gBAEvD,QAAA,aAAU,kBAArBJ,mBAEM,OAFNkB,cAAiD,wBAC1C,QAAA,aAAU,GAAM,gBAAc,IAAK,UAC1C,CAAA;;;;;;QAKK,QAAA,MAAM,WAAM,KAAA,CAAW,QAAA,0BAAlClB,mBAEM,OAFNmB,eAAoE,qBAEpE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACrDF,aAAAd,UAAA,GAAAL,mBAiDM,OAjDNG,cAiDM;AAAA,QA/CJD,gBAsCM,OAtCNI,cAsCM;AAAA,UArCJE,YAIE,kBAAA;AAAA,YAHC,UAAU,QAAA;AAAA,YACV,QAAQ,QAAA;AAAA,YACR,8CAAMD,KAAAA,MAAK,cAAA,YAAA;AAAA,UAAA;UAGdC,YAKE,aAAA;AAAA,YAJC,gBAAc,QAAA;AAAA,YACd,gBAAc,QAAA;AAAA,YACd,qDAAcD,KAAAA,MAAK,cAAA,aAAA;AAAA,YACnB,qDAAcA,KAAAA,MAAK,cAAA,aAAA;AAAA,UAAA;UAGtBC,YAOE,gBAAA;AAAA,YANC,mBAAiB,QAAA;AAAA,YACjB,mBAAiB,QAAA;AAAA,YACjB,2BAAsB,OAAA,CAAA,MAAA,OAAA,CAAA,IAAA,CAAA,WAAED,KAAAA,MAAK,yBAA0B,MAAM;AAAA,YAC7D,2BAAsB,OAAA,CAAA,MAAA,OAAA,CAAA,IAAA,CAAA,WAAEA,KAAAA,MAAK,yBAA0B,MAAM;AAAA,YAC7D,qDAAcA,KAAAA,MAAK,cAAA,gBAAA;AAAA,YACnB,qDAAcA,KAAAA,MAAK,cAAA,gBAAA;AAAA,UAAA;UAGtBC,YAOE,qBAAA;AAAA,YANC,oBAAkB,QAAA;AAAA,YAClB,oBAAkB,QAAA;AAAA,YAClB,aAAW,QAAA;AAAA,YACX,4BAAuB,OAAA,CAAA,MAAA,OAAA,CAAA,IAAA,CAAA,WAAED,KAAAA,MAAK,0BAA2B,MAAM;AAAA,YAC/D,4BAAuB,OAAA,CAAA,MAAA,OAAA,CAAA,IAAA,CAAA,WAAEA,KAAAA,MAAK,0BAA2B,MAAM;AAAA,YAC/D,qBAAgB,OAAA,CAAA,MAAA,OAAA,CAAA,IAAA,CAAA,WAAEA,KAAAA,MAAK,mBAAoB,MAAM;AAAA,UAAA;UAGpDC,YAKE,gBAAA;AAAA,YAJC,sBAAoB,QAAA;AAAA,YACpB,iBAAe,QAAA;AAAA,YACf,6BAAyB,OAAA,EAAA,MAAA,OAAA,EAAA,IAAA,CAAA,WAAED,KAAAA,MAAK,2BAA4B,MAAM;AAAA,YAClE,yBAAoB,OAAA,EAAA,MAAA,OAAA,EAAA,IAAA,CAAA,WAAEA,KAAAA,MAAK,uBAAwB,MAAM;AAAA,UAAA;;QAK9DC,YAKE,iBAAA;AAAA,UAJC,OAAO,QAAA;AAAA,UACP,eAAa,QAAA;AAAA,UACb,cAAY,QAAA;AAAA,UACZ,mDAASD,KAAAA,MAAK,SAAA;AAAA,QAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACTrB,UAAM,QAAQ;AAOd,UAAM9E,QAAO;AAIb,UAAM,QAAQ,MAAM;AAClB,MAAAA,MAAK,OAAO;AAAA,IACd;AAGA,UAAM,gBAAgB,CAAC,MAAqB;AAC1C,UAAI,EAAE,QAAQ,YAAY,MAAM,SAAS;AACvC,cAAA;AAAA,MACF;AAAA,IACF;AAEA,cAAU,MAAM;AACd,eAAS,iBAAiB,WAAW,aAAa;AAAA,IACpD,CAAC;AAED,gBAAY,MAAM;AAChB,eAAS,oBAAoB,WAAW,aAAa;AAAA,IACvD,CAAC;AAGD,UAAM,MAAM,MAAM,SAAS,CAAC,cAAc;AACxC,UAAI,WAAW;AACb,iBAAS,KAAK,MAAM,WAAW;AAAA,MACjC,OAAO;AACL,iBAAS,KAAK,MAAM,WAAW;AAAA,MACjC;AAAA,IACF,CAAC;;0BA3ECqF,YAgCWW,UAAA,EAhCD,IAAG,UAAM;AAAA,QACjBjB,YA8BagB,YAAA,EA9BD,MAAK,WAAO;AAAA,2BACtB,MA4BM;AAAA,YA3BE,QAAA,wBADRxB,mBA4BM,OAAA;AAAA;cA1BJ,OAAM;AAAA,cACL,uBAAY,OAAK,CAAA,MAAA,CAAA;AAAA,cACjB,oBAAa,OAAK,CAAA,KAAA,CAAA;AAAA,YAAA;cAEnBE,gBAqBM,OAAA;AAAA,gBArBD,OAAKD,eAAA,CAAC,mBAA0B,QAAA,UAAU,CAAA;AAAA,gBAAE,MAAK;AAAA,gBAAS,cAAW;AAAA,cAAA;gBACxEC,gBAaM,OAbNC,cAaM;AAAA,kBAZJD,gBAGM,OAHNI,cAGM;AAAA,oBAFJJ,gBAAmD,MAAnDO,cAAmDL,gBAAb,QAAA,KAAK,GAAA,CAAA;AAAA,oBAClC,QAAA,yBAATJ,mBAAuE,KAAvEU,cAAuEN,gBAAf,QAAA,QAAQ,GAAA,CAAA;;kBAElEF,gBAOS,UAAA;AAAA,oBANP,OAAM;AAAA,oBACL,SAAO;AAAA,oBACR,MAAK;AAAA,oBACL,cAAW;AAAA,kBAAA,GACZ,KAED;AAAA,gBAAA;gBAESwB,KAAAA,OAAO,UAAlBrB,aAAAL,mBAEM,OAFNW,cAEM;AAAA,kBADJgB,WAA2B,KAAA,QAAA,UAAA,CAAA,GAAA,QAAA,IAAA;AAAA,gBAAA;gBAE7BzB,gBAEM,OAFNa,cAEM;AAAA,kBADJY,WAAa,KAAA,QAAA,WAAA,CAAA,GAAA,QAAA,IAAA;AAAA,gBAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACqCzB,UAAM,QAAQ;AAMd,UAAMlG,QAAO;AAKb,UAAM,cAAc,IAAI,EAAE;AAC1B,UAAM,iBAAiB,IAA6B,IAAI;AAExD,UAAM,iBAAiB,SAAS,MAAM;AACpC,UAAI,CAAC,YAAY,OAAO;AACtB,eAAO,MAAM;AAAA,MACf;AACA,YAAM,QAAQ,YAAY,MAAM,YAAA;AAChC,aAAO,MAAM,OAAO,OAAO,CAAAJ,OAAKA,GAAE,KAAK,YAAA,EAAc,SAAS,KAAK,CAAC;AAAA,IACtE,CAAC;AAED,UAAM,aAAa,CAAC,SAAiB;AACnC,aAAO,MAAM,SAAS,SAAS,IAAI;AAAA,IACrC;AAEA,UAAM,cAAc,CAAC,SAAiB;AACpC,YAAM,cAAc,WAAW,IAAI,IAC/B,MAAM,SAAS,OAAO,CAAA,MAAK,MAAM,IAAI,IACrC,CAAC,GAAG,MAAM,UAAU,IAAI;AAC5B,MAAAI,MAAK,mBAAmB,WAAW;AAAA,IACrC;AAEA,UAAM,WAAW,MAAM;AAAA,IAEvB;AAEA,UAAM,cAAc,MAAM;;AACxB,kBAAY,QAAQ;AACpB,OAAAhB,MAAA,eAAe,UAAf,gBAAAA,IAAsB;AAAA,IACxB;AAEA,UAAM,MAAM,MAAM,SAAS,CAAC,cAAc;AACxC,UAAI,WAAW;AACb,iBAAS,MAAM;;AACb,WAAAA,MAAA,eAAe,UAAf,gBAAAA,IAAsB;AAAA,QACxB,CAAC;AAAA,MACH;AAAA,IACF,CAAC;;0BAhHCqG,YAwDe,cAAA;AAAA,QAvDZ,SAAS,QAAA;AAAA,QACV,OAAM;AAAA,QACN,UAAS;AAAA,QACR,+CAAOP,KAAAA,MAAK,OAAA;AAAA,MAAA;QAEF,gBACT,MAsBM;AAAA,UAtBNL,gBAsBM,OAtBNC,cAsBM;AAAA,sCArBJD,gBAEM,OAAA;AAAA,cAFD,OAAM;AAAA,cAAc,SAAQ;AAAA,cAAY,MAAK;AAAA,YAAA;cAChDA,gBAAqM,QAAA,EAA/L,GAAE,6LAA2L;AAAA,YAAA;2BAErMA,gBAOE,SAAA;AAAA,uBANI;AAAA,cAAJ,KAAI;AAAA,2EACK,YAAW,QAAA;AAAA,cACpB,MAAK;AAAA,cACL,OAAM;AAAA,cACN,aAAY;AAAA,cACX,SAAO;AAAA,YAAA;2BAJC,YAAA,KAAW;AAAA,YAAA;YAOd,YAAA,sBADRF,mBASS,UAAA;AAAA;cAPP,MAAK;AAAA,cACL,OAAM;AAAA,cACL,SAAO;AAAA,YAAA;cAERE,gBAEM,OAAA;AAAA,gBAFD,SAAQ;AAAA,gBAAY,MAAK;AAAA,cAAA;gBAC5BA,gBAA2M,QAAA,EAArM,GAAE,mMAAiM;AAAA,cAAA;;;;yBAMjN,MAuBM;AAAA,UAvBNA,gBAuBM,OAvBNI,cAuBM;AAAA,8BAtBJN,mBAkBQY,UAAA,MAAAC,WAjBU,eAAA,OAAc,CAAvB,UAAK;kCADdb,mBAkBQ,SAAA;AAAA,gBAhBL,KAAK,MAAM;AAAA,gBACZ,OAAM;AAAA,cAAA;gBAENE,gBAKE,SAAA;AAAA,kBAJA,MAAK;AAAA,kBACJ,SAAS,WAAW,MAAM,IAAI;AAAA,kBAC9B,UAAM,CAAA,WAAE,YAAY,MAAM,IAAI;AAAA,kBAC/B,OAAM;AAAA,gBAAA;gBAERA,gBAIO,QAJPQ,cAIO;AAAA,kBAHM,WAAW,MAAM,IAAI,KAAhCL,UAAA,GAAAL,mBAEM,OAFNW,cAEM,CAAA,GAAA,OAAA,CAAA,MAAA,OAAA,CAAA,IAAA;AAAA,oBADJT,gBAA0I,QAAA,EAApI,GAAE,iIAAA,GAAgI,MAAA,EAAA;AAAA,kBAAA;;gBAG5IA,gBAAgD,QAAhDa,cAAgDX,gBAApB,MAAM,IAAI,GAAA,CAAA;AAAA,gBACtCF,gBAAoD,QAApDc,cAA0B,sBAAI,MAAM,KAAK,IAAG,KAAC,CAAA;AAAA,cAAA;;YAEpC,eAAA,MAAe,WAAM,kBAAhChB,mBAEM,OAFNiB,cAA2D,mBAE3D;;;;;;;;;;;;;;;;;;;AC+BN,MAAM,aAAa;AACnB,MAAM,mBAAmB;;;;;;;;;;;AA5BzB,UAAM,QAAQ;AAOd,UAAMxF,QAAO;AAKb,UAAM,QAAQ;AAAA,MAAS,MACrB,MAAM,YAAY,YAAY,iBAAiB;AAAA,IAAA;AAGjD,UAAM,WAAW;AAAA,MAAS,MACxB,MAAM,YAAY,YACd,qCACA;AAAA,IAAA;AAGN,UAAM,cAAc,IAAI,EAAE;AAC1B,UAAM,iBAAiB,IAA6B,IAAI;AACxD,UAAM,mBAAmB,IAAwB,IAAI;AACrD,UAAM,iBAAiB,IAAI,GAAG;AAK9B,UAAM,eAAe,SAAS,MAAM;AAClC,UAAI,CAAC,YAAY,OAAO;AACtB,eAAO,MAAM;AAAA,MACf;AACA,YAAM,QAAQ,YAAY,MAAM,YAAA;AAChC,aAAO,MAAM,KAAK,OAAO,CAAA,MAAK,EAAE,IAAI,YAAA,EAAc,SAAS,KAAK,CAAC;AAAA,IACnE,CAAC;AAED,UAAM,cAAc,SAAS,MAAM;AAEjC,UAAI,YAAY,OAAO;AACrB,eAAO,aAAa;AAAA,MACtB;AAEA,aAAO,aAAa,MAAM,MAAM,GAAG,eAAe,KAAK;AAAA,IACzD,CAAC;AAED,UAAM,cAAc,SAAS,MAAM;AACjC,UAAI,YAAY,MAAO,QAAO;AAC9B,aAAO,eAAe,QAAQ,aAAa,MAAM;AAAA,IACnD,CAAC;AAED,UAAM,aAAa,CAAC,QAAgB;AAClC,aAAO,MAAM,SAAS,SAAS,GAAG;AAAA,IACpC;AAEA,UAAM,YAAY,CAAC,QAAgB;AACjC,YAAM,cAAc,WAAW,GAAG,IAC9B,MAAM,SAAS,OAAO,CAAA,MAAK,MAAM,GAAG,IACpC,CAAC,GAAG,MAAM,UAAU,GAAG;AAC3B,MAAAA,MAAK,mBAAmB,WAAW;AAAA,IACrC;AAEA,UAAM,cAAc,MAAM;;AACxB,kBAAY,QAAQ;AACpB,qBAAe,QAAQ;AACvB,OAAAhB,MAAA,eAAe,UAAf,gBAAAA,IAAsB;AAAA,IACxB;AAEA,UAAM,eAAe,MAAM;AACzB,UAAI,YAAY,MAAO;AAEvB,YAAM,YAAY,iBAAiB;AACnC,UAAI,CAAC,UAAW;AAEhB,YAAM,EAAE,WAAW,cAAc,aAAA,IAAiB;AAClD,YAAM,eAAe,eAAe,YAAY;AAGhD,UAAI,eAAe,oBAAoB,YAAY,OAAO;AACxD,uBAAe,QAAQ,KAAK;AAAA,UAC1B,eAAe,QAAQ;AAAA,UACvB,aAAa,MAAM;AAAA,QAAA;AAAA,MAEvB;AAAA,IACF;AAEA,UAAM,MAAM,MAAM,SAAS,CAAC,cAAc;AACxC,UAAI,WAAW;AACb,uBAAe,QAAQ;AACvB,iBAAS,MAAM;;AACb,WAAAA,MAAA,eAAe,UAAf,gBAAAA,IAAsB;AAAA,QACxB,CAAC;AAAA,MACH;AAAA,IACF,CAAC;AAED,UAAM,MAAM,MAAM,MAAM,MAAM;AAC5B,qBAAe,QAAQ;AAAA,IACzB,CAAC;;0BA5JCqG,YAkDe,cAAA;AAAA,QAjDZ,SAAS,QAAA;AAAA,QACT,OAAO,MAAA;AAAA,QACP,UAAU,SAAA;AAAA,QACV,eAAa,QAAA,YAAO,YAAA,wBAAA;AAAA,QACpB,+CAAOP,KAAAA,MAAK,OAAA;AAAA,MAAA;QAEF,gBACT,MAqBM;AAAA,UArBNL,gBAqBM,OArBNC,cAqBM;AAAA,sCApBJD,gBAEM,OAAA;AAAA,cAFD,OAAM;AAAA,cAAc,SAAQ;AAAA,cAAY,MAAK;AAAA,YAAA;cAChDA,gBAAqM,QAAA,EAA/L,GAAE,6LAA2L;AAAA,YAAA;2BAErMA,gBAME,SAAA;AAAA,uBALI;AAAA,cAAJ,KAAI;AAAA,2EACK,YAAW,QAAA;AAAA,cACpB,MAAK;AAAA,cACL,OAAM;AAAA,cACN,aAAY;AAAA,YAAA;2BAHH,YAAA,KAAW;AAAA,YAAA;YAMd,YAAA,sBADRF,mBASS,UAAA;AAAA;cAPP,MAAK;AAAA,cACL,OAAM;AAAA,cACL,SAAO;AAAA,YAAA;cAERE,gBAEM,OAAA;AAAA,gBAFD,SAAQ;AAAA,gBAAY,MAAK;AAAA,cAAA;gBAC5BA,gBAA2M,QAAA,EAArM,GAAE,mMAAiM;AAAA,cAAA;;;;yBAMjN,MAiBM;AAAA,UAjBNA,gBAiBM,OAAA;AAAA,qBAjBG;AAAA,YAAJ,KAAI;AAAA,YAAmB,OAAM;AAAA,YAAkB,UAAQ;AAAA,UAAA;8BAC1DF,mBASSY,UAAA,MAAAC,WARO,YAAA,OAAW,CAAlB,QAAG;kCADZb,mBASS,UAAA;AAAA,gBAPN,KAAK,IAAI;AAAA,gBACV,MAAK;AAAA,gBACL,uBAAM,YAAU,EAAA,sBACgB,WAAW,IAAI,GAAG,EAAA,CAAA,CAAA;AAAA,gBACjD,SAAK,CAAA,WAAE,UAAU,IAAI,GAAG;AAAA,cAAA,GAEtBI,gBAAA,IAAI,GAAG,GAAA,IAAAE,YAAA;AAAA;YAED,YAAA,MAAY,WAAM,kBAA7BN,mBAEM,OAFNS,cAAwD,iBAExD;YACW,YAAA,sBAAXT,mBAEM,OAFNU,cAA+C,0BAE/C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AC0BN,UAAM,QAAQ;AAQd,UAAMjF,QAAO;AAKb,UAAM,cAAc,SAAS,MAAM,MAAM,KAAK,YAAY,MAAM,KAAK,SAAS,SAAS,CAAC;AACxF,UAAM,aAAa,SAAS,MAAM,MAAM,SAAS,IAAI,MAAM,KAAK,GAAG,CAAC;AACpE,UAAM,aAAa,SAAS,MAAM,MAAM,SAAS,SAAS,MAAM,KAAK,GAAG,CAAC;AAGzE,UAAM,iBAAiB,CAAC,MAAkB;AACxC,YAAM,SAAS,EAAE;AACjB,UAAI,OAAO,QAAQ,4BAA4B,GAAG;AAChD;AAAA,MACF;AACA,MAAAA,MAAK,iBAAiB,MAAM,KAAK,GAAG;AAAA,IACtC;;;AAlGE,aAAA4E,UAAA,GAAAL,mBAmEM,OAnENG,cAmEM;AAAA,QAlEJD,gBAkDM,OAAA;AAAA,UAjDJ,uBAAM,mBAAiB;AAAA,gCACe,QAAA,OAAO;AAAA,2CAA2C,WAAA,MAAA;AAAA,UAAU;UAIjG,wCAAyB,QAAA,QAAK,KAAA,CAAA,MAAA;AAAA,UAC9B,SAAO;AAAA,QAAA;UAIA,YAAA,sBADRF,mBAcS,UAAA;AAAA;YAZP,MAAK;AAAA,YACL,OAAM;AAAA,YACL,SAAK,OAAA,CAAA,MAAA,OAAA,CAAA,IAAA4B,cAAA,CAAA,WAAOrB,KAAAA,MAAK,iBAAkB,QAAA,KAAK,GAAG,GAAA,CAAA,MAAA,CAAA;AAAA,UAAA;0BAE5CP,mBAOM,OAAA;AAAA,cANJ,OAAKC,eAAA,CAAC,0BAAwB,EAAA,oCACgB,WAAA,MAAA,CAAU,CAAA;AAAA,cACxD,SAAQ;AAAA,cACR,MAAK;AAAA,YAAA;cAELC,gBAAkI,QAAA,EAA5H,GAAE,yHAAA,GAAwH,MAAA,EAAA;AAAA,YAAA;iBAGpIG,UAAA,GAAAL,mBAAqD,QAArDM,YAAqD;AAAA,UAGrDJ,gBAYQ,SAZRO,cAYQ;AAAA,YAXNP,gBAKE,SAAA;AAAA,cAJA,MAAK;AAAA,cACL,OAAM;AAAA,cACL,SAAS,WAAA;AAAA,cACT,UAAM,OAAA,CAAA,MAAA,OAAA,CAAA,IAAA,CAAA,WAAEK,KAAAA,MAAK,iBAAkB,QAAA,KAAK,GAAG;AAAA,YAAA;YAE1CL,gBAIO,QAAA;AAAA,cAJD,OAAKD,eAAA,CAAC,8BAA4B,+BAAwC,QAAA,OAAO,EAAA,CAAA;AAAA,YAAA;cAC1E,WAAA,SAAXI,aAAAL,mBAEM,OAFNW,cAEM,CAAA,GAAA,OAAA,CAAA,MAAA,OAAA,CAAA,IAAA;AAAA,gBADJT,gBAA0I,QAAA,EAApI,GAAE,iIAAA,GAAgI,MAAA,EAAA;AAAA,cAAA;;;oCAM9IA,gBAGM,OAAA;AAAA,YAHD,OAAM;AAAA,YAAyB,SAAQ;AAAA,YAAY,MAAK;AAAA,UAAA;YAC3DA,gBAAuZ,QAAA,EAAjZ,GAAE,+YAA6Y;AAAA,YACrZA,gBAA2F,QAAA,EAArF,GAAE,mFAAiF;AAAA,UAAA;UAI3FA,gBAAsD,QAAtDa,cAAsDX,gBAApB,QAAA,KAAK,KAAK,GAAA,CAAA;AAAA,QAAA;QAInC,YAAA,SAAe,WAAA,SAA1BC,aAAAL,mBAYM,OAZNgB,cAYM;AAAA,WAXJX,UAAA,IAAA,GAAAL,mBAUEY,UAAA,MAAAC,WATgB,QAAA,KAAK,WAAd,UAAK;gCADdC,YAUE,2BAAA;AAAA,cARC,KAAK,MAAM;AAAA,cACX,MAAM;AAAA,cACN,UAAU,QAAA;AAAA,cACV,UAAU,QAAA;AAAA,cACV,SAAS,QAAA;AAAA,cACT,OAAO,QAAA,QAAK;AAAA,cACZ,gBAAa,OAAA,CAAA,MAAA,OAAA,CAAA,IAAA,CAAA,WAAEP,KAAAA,MAAK,iBAAkB,MAAM;AAAA,cAC5C,gBAAa,OAAA,CAAA,MAAA,OAAA,CAAA,IAAA,CAAA,WAAEA,KAAAA,MAAK,iBAAkB,MAAM;AAAA,YAAA;;;;;;;;;;;;;;;;;;;;;;;;ACjBrD,UAAM,QAAQ;AAOd,UAAM9E,QAAO;AAKb,UAAM,cAAc,IAAI,EAAE;AAC1B,UAAM,eAAe,IAAiB,oBAAI,KAAK;AAG/C,UAAM,kBAAkB,SAAS,MAAM;AACrC,UAAI,CAAC,YAAY,OAAO;AACtB,eAAO,MAAM;AAAA,MACf;AACA,YAAM,QAAQ,YAAY,MAAM,YAAA;AAChC,aAAO,WAAW,MAAM,SAAS,KAAK;AAAA,IACxC,CAAC;AAGD,UAAM,aAAa,CAAC,OAA6B,UAAwC;AACvF,YAAM,SAA+B,CAAA;AAErC,iBAAW,QAAQ,OAAO;AACxB,cAAM,UAAU,KAAK,IAAI,YAAA,EAAc,SAAS,KAAK,KAAK,KAAK,MAAM,YAAA,EAAc,SAAS,KAAK;AACjG,cAAM,mBAAmB,KAAK,WAAW,WAAW,KAAK,UAAU,KAAK,IAAI,CAAA;AAE5E,YAAI,WAAW,iBAAiB,SAAS,GAAG;AAC1C,iBAAO,KAAK;AAAA,YACV,GAAG;AAAA,YACH,UAAU,iBAAiB,SAAS,IAAI,mBAAmB,KAAK;AAAA,UAAA,CACjE;AAED,cAAI,YAAY,SAAS,iBAAiB,SAAS,GAAG;AACpD,yBAAa,MAAM,IAAI,KAAK,GAAG;AAAA,UACjC;AAAA,QACF;AAAA,MACF;AAEA,aAAO;AAAA,IACT;AAGA,UAAM,eAAe,CAAC,QAAgB;AACpC,UAAI,aAAa,MAAM,IAAI,GAAG,GAAG;AAC/B,qBAAa,MAAM,OAAO,GAAG;AAAA,MAC/B,OAAO;AACL,qBAAa,MAAM,IAAI,GAAG;AAAA,MAC5B;AAEA,mBAAa,QAAQ,IAAI,IAAI,aAAa,KAAK;AAAA,IACjD;AAGA,UAAM,eAAe,CAAC,QAAgB;AACpC,YAAM,cAAc,MAAM,SAAS,SAAS,GAAG,IAC3C,MAAM,SAAS,OAAO,CAAAQ,OAAKA,OAAM,GAAG,IACpC,CAAC,GAAG,MAAM,UAAU,GAAG;AAC3B,MAAAR,MAAK,mBAAmB,WAAW;AAAA,IACrC;AAGA,UAAM,MAAM,MAAM,SAAS,CAAC,cAAc;AACxC,UAAI,WAAW;AACb,oBAAY,QAAQ;AAEpB,qBAAa,4BAAY,IAAA;AAAA,MAC3B;AAAA,IACF,CAAC;;0BAxHCqF,YAsCe,cAAA;AAAA,QArCZ,SAAS,QAAA;AAAA,QACT,OAAO,QAAA,YAAO,YAAA,oBAAA;AAAA,QACd,UAAU,QAAA,YAAO,YAAA,4CAAA;AAAA,QACjB,+CAAOP,KAAAA,MAAK,OAAA;AAAA,MAAA;QAEF,gBACT,MAUM;AAAA,UAVNL,gBAUM,OAVNC,cAUM;AAAA,sCATJD,gBAEM,OAAA;AAAA,cAFD,OAAM;AAAA,cAAc,SAAQ;AAAA,cAAY,MAAK;AAAA,YAAA;cAChDA,gBAAqM,QAAA,EAA/L,GAAE,6LAA2L;AAAA,YAAA;2BAErMA,gBAKE,SAAA;AAAA,2EAJS,YAAW,QAAA;AAAA,cACpB,MAAK;AAAA,cACL,OAAM;AAAA,cACN,aAAY;AAAA,YAAA;2BAHH,YAAA,KAAW;AAAA,YAAA;;;yBAQ1B,MAiBM;AAAA,UAjBNA,gBAiBM,OAjBNI,cAiBM;AAAA,YAhBY,gBAAA,MAAgB,SAAM,sBACpCN,mBAUEY,UAAA,EAAA,KAAA,KAAAC,WATe,gBAAA,OAAe,CAAvB,SAAI;kCADbC,YAUE,gBAAA;AAAA,gBARC,KAAK,KAAK;AAAA,gBACV;AAAA,gBACA,UAAU,QAAA;AAAA,gBACV,UAAU,aAAA;AAAA,gBACV,SAAS,QAAA;AAAA,gBACT,OAAO;AAAA,gBACP,gBAAe;AAAA,gBACf,gBAAe;AAAA,cAAA;sCAGpBd,mBAEM,OAFNS,cAA+B,oBAE/B;AAAA,UAAA;;;;;;;;ACrCC,SAAS,gBAAwB;AACtC,QAAM,EAAE,aAAa,OAAO;AAC5B,SAAO,SAAS,SAAS,GAAG,IAAI,SAAS,MAAM,GAAG,EAAE,IAAI;AAC1D;AAEO,SAAS,SAAS,MAAsB;AAC7C,SAAO,GAAG,eAAe,GAAG,IAAI;AAClC;ACHO,SAAS,iBAAiB;AAC/B,QAAM,YAAY,IAAI,KAAK;AAE3B,QAAM,kBAAkB,OAAO,QAAQ,OAAmC;AACxE,QAAI;AACF,YAAM,WAAW,MAAM,MAAM,SAAS,mCAAmC,KAAK,EAAE,CAAC;AACjF,YAAM,OAAO,MAAM,SAAS,KAAA;AAC5B,aAAO,KAAK,eAAe,CAAA;AAAA,IAC7B,SAAS,OAAO;AACd,cAAQ,MAAM,8CAA8C,KAAK;AACjE,aAAO,CAAA;AAAA,IACT;AAAA,EACF;AAEA,QAAM,YAAY,OAAO,QAAQ,MAA4B;AAC3D,QAAI;AACF,YAAM,WAAW,MAAM,MAAM,SAAS,gCAAgC,KAAK,EAAE,CAAC;AAC9E,YAAM,OAAO,MAAM,SAAS,KAAA;AAC5B,aAAO,KAAK,QAAQ,CAAA;AAAA,IACtB,SAAS,OAAO;AACd,cAAQ,MAAM,uCAAuC,KAAK;AAC1D,aAAO,CAAA;AAAA,IACT;AAAA,EACF;AAEA,QAAM,kBAAkB,YAAuC;AAC7D,QAAI;AACF,YAAM,WAAW,MAAM,MAAM,SAAS,mCAAmC,CAAC;AAC1E,YAAM,OAAO,MAAM,SAAS,KAAA;AAC5B,aAAO,oBAAoB,KAAK,QAAQ,EAAE;AAAA,IAC5C,SAAS,OAAO;AACd,cAAQ,MAAM,8CAA8C,KAAK;AACjE,aAAO,CAAA;AAAA,IACT;AAAA,EACF;AAEA,QAAM,sBAAsB,CAAC,MAA2B,aAAa,OAAyB;AAC5F,QAAI,CAAC,QAAQ,OAAO,SAAS,UAAU;AACrC,aAAO,CAAA;AAAA,IACT;AAEA,WAAO,OAAO,QAAQ,IAAI,EAAE,IAAI,CAAC,CAAC,MAAM,QAAQ,MAAM;AACpD,YAAM,OAAO,aAAa,GAAG,UAAU,IAAI,IAAI,KAAK;AACpD,YAAM,aAAa,oBAAoB,UAAiC,IAAI;AAE5E,aAAO;AAAA,QACL,KAAK;AAAA,QACL,OAAO;AAAA,QACP,UAAU,WAAW,SAAS,IAAI,aAAa;AAAA,MAAA;AAAA,IAEnD,CAAC;AAAA,EACH;AAiBA,QAAM,aAAa,OAAO,WAA4E;;AACpG,cAAU,QAAQ;AAClB,QAAI;AACF,YAAM,YAAY,IAAI,gBAAA;AACtB,gBAAU,IAAI,QAAQ,OAAO,OAAO,QAAQ,CAAC,CAAC;AAC9C,gBAAU,IAAI,aAAa,OAAO,OAAO,YAAY,CAAC,CAAC;AAEvD,OAAAhG,MAAA,OAAO,eAAP,gBAAAA,IAAmB,QAAQ,CAAA,OAAM,UAAU,OAAO,cAAc,EAAE;AAClE,mBAAO,gBAAP,mBAAoB,QAAQ,CAAA,QAAO,UAAU,OAAO,eAAe,GAAG;AACtE,mBAAO,gBAAP,mBAAoB,QAAQ,CAAA,QAAO,UAAU,OAAO,eAAe,GAAG;AAGtE,UAAI,OAAO,kBAAkB,OAAO,eAAe,SAAS,GAAG;AAC7D,eAAO,eAAe,QAAQ,CAAA,WAAU,UAAU,OAAO,kBAAkB,MAAM,CAAC;AAClF,kBAAU,IAAI,aAAa,MAAM;AAAA,MACnC;AACA,mBAAO,mBAAP,mBAAuB,QAAQ,CAAA,WAAU,UAAU,OAAO,kBAAkB,MAAM;AAElF,UAAI,OAAO,qBAAqB,QAAW;AACzC,kBAAU,IAAI,mBAAmB,OAAO,CAAC,OAAO,gBAAgB,CAAC;AAAA,MACnE;AAEA,UAAI,OAAO,iBAAiB,QAAW;AACrC,kBAAU,IAAI,mCAAmC,OAAO,OAAO,YAAY,CAAC;AAAA,MAC9E;AAGA,OAAAoH,MAAA,OAAO,wBAAP,gBAAAA,IAA4B,QAAQ,CAAA,YAAW,UAAU,OAAO,wBAAwB,OAAO;AAC/F,mBAAO,wBAAP,mBAA4B,QAAQ,CAAA,YAAW,UAAU,OAAO,wBAAwB,OAAO;AAC/F,UAAI,OAAO,yBAAyB,QAAW;AAC7C,kBAAU,IAAI,0BAA0B,OAAO,OAAO,oBAAoB,CAAC;AAAA,MAC7E;AAEA,YAAM,WAAW,MAAM,MAAM,SAAS,sBAAsB,SAAS,EAAE,CAAC;AACxE,YAAM,OAAO,MAAM,SAAS,KAAA;AAE5B,aAAO;AAAA,QACL,OAAO,KAAK,SAAS,CAAA;AAAA,QACrB,OAAO,KAAK,SAAS;AAAA,MAAA;AAAA,IAEzB,SAAS,OAAO;AACd,cAAQ,MAAM,wCAAwC,KAAK;AAC3D,aAAO,EAAE,OAAO,IAAI,OAAO,EAAA;AAAA,IAC7B,UAAA;AACE,gBAAU,QAAQ;AAAA,IACpB;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA;AAEJ;ACpHO,SAAS,iBAAiB,QAAyC;AACxE,QAAMC,OAAM,eAAA;AAIZ,MAAI,cAAc;AAGlB,QAAM,qBAAqB,IAAc,EAAE;AAC3C,QAAM,cAAc,IAAc,EAAE;AACpC,QAAM,cAAc,IAAc,EAAE;AACpC,QAAM,iBAAiB,IAAc,EAAE;AACvC,QAAM,iBAAiB,IAAc,EAAE;AACvC,QAAM,mBAAmB,IAAI,KAAK;AAClC,QAAM,eAAe,IAAI,KAAK;AAC9B,QAAM,kBAAkB,IAAc,EAAE;AACxC,QAAM,kBAAkB,IAAc,EAAE;AACxC,QAAM,WAAW,IAAI,KAAK;AAG1B,QAAM,sBAAsB,IAAuB,EAAE;AACrD,QAAM,gBAAgB,IAAiB,EAAE;AACzC,QAAM,aAAa,IAAsB,EAAE;AAG3C,QAAM,eAAe,IAAgB,EAAE;AACvC,QAAM,aAAa,IAAI,CAAC;AACxB,QAAM,YAAY,SAAS,MAAMA,KAAI,UAAU,KAAK;AAGpD,QAAM,cAAc,MAAsB;AACxC,UAAM,SAAyB;AAAA,MAC7B,SAAS;AAAA,MACT,SAAS;AAAA,QACP,YAAY,mBAAmB;AAAA,QAC/B,MAAM;AAAA,UACJ,SAAS,YAAY;AAAA,UACrB,SAAS,YAAY;AAAA,QAAA;AAAA,QAEvB,SAAS;AAAA,UACP,SAAS,eAAe;AAAA,UACxB,SAAS,eAAe;AAAA,QAAA;AAAA,QAE1B,SAAS;AAAA,UACP,kBAAkB,iBAAiB;AAAA,UACnC,cAAc,aAAa;AAAA,QAAA;AAAA,QAE7B,cAAc;AAAA,UACZ,SAAS,gBAAgB;AAAA,UACzB,SAAS,gBAAgB;AAAA,UACzB,UAAU,SAAS;AAAA,QAAA;AAAA,MACrB;AAAA,MAEF,SAAS;AAAA,QACP,YAAY,WAAW;AAAA,QACvB,aAAa,KAAK,IAAA;AAAA,MAAI;AAAA,IACxB;AAMF,QAAI,CAAC,aAAa;AAChB,aAAO,QAAQ;AAAA,IACjB;AACA,WAAO;AAAA,EACT;AAGA,QAAM,oBAAoB,CAAC,WAA2B;;AAGpD,kBAAc;AAEd,QAAI;AACF,UAAI,EAAC,iCAAQ,SAAS;AAEtB,YAAM,EAAE,SAAS,QAAA,IAAY;AAG7B,YAAM,kBAAkB,CAAI,UAAwB,aAAgB;AAClE,YAAI,KAAK,UAAU,SAAS,KAAK,MAAM,KAAK,UAAU,QAAQ,GAAG;AAC/D,mBAAS,QAAQ;AAAA,QACnB;AAAA,MACF;AAEA,sBAAgB,oBAAoB,QAAQ,cAAc,CAAA,CAAE;AAC5D,sBAAgB,eAAarH,MAAA,QAAQ,SAAR,gBAAAA,IAAc,YAAW,CAAA,CAAE;AACxD,sBAAgB,eAAa,aAAQ,SAAR,mBAAc,YAAW,CAAA,CAAE;AACxD,sBAAgB,kBAAgB,aAAQ,YAAR,mBAAiB,YAAW,CAAA,CAAE;AAC9D,sBAAgB,kBAAgB,aAAQ,YAAR,mBAAiB,YAAW,CAAA,CAAE;AAC9D,sBAAgB,oBAAkBoH,MAAA,QAAQ,YAAR,gBAAAA,IAAiB,qBAAoB,KAAK;AAC5E,sBAAgB,gBAAc,aAAQ,YAAR,mBAAiB,iBAAgB,KAAK;AACpE,sBAAgB,mBAAiB,aAAQ,iBAAR,mBAAsB,YAAW,CAAA,CAAE;AACpE,sBAAgB,mBAAiB,aAAQ,iBAAR,mBAAsB,YAAW,CAAA,CAAE;AACpE,sBAAgB,YAAU,aAAQ,iBAAR,mBAAsB,aAAY,KAAK;AAGjE,iBAAW,SAAQ,mCAAS,eAAc;AAAA,IAC5C,UAAA;AACE,oBAAc;AAAA,IAChB;AAAA,EACF;AAGA,QAAM,qBAAqB,YAAY;AACrC,UAAM,CAAC,YAAY,MAAM,OAAO,IAAI,MAAM,QAAQ,IAAI;AAAA,MACpDC,KAAI,gBAAA;AAAA,MACJA,KAAI,UAAA;AAAA,MACJA,KAAI,gBAAA;AAAA,IAAgB,CACrB;AAED,wBAAoB,QAAQ;AAC5B,kBAAc,QAAQ;AACtB,eAAW,QAAQ;AAAA,EACrB;AAGA,QAAM,iBAAiB,YAAY;AACjC,UAAM,SAAS,MAAMA,KAAI,WAAW;AAAA,MAClC,YAAY,mBAAmB;AAAA,MAC/B,aAAa,YAAY;AAAA,MACzB,aAAa,YAAY;AAAA,MACzB,gBAAgB,eAAe;AAAA,MAC/B,gBAAgB,eAAe;AAAA,MAC/B,kBAAkB,iBAAiB,SAAS;AAAA,MAC5C,cAAc,aAAa,SAAS;AAAA,MACpC,qBAAqB,gBAAgB;AAAA,MACrC,qBAAqB,gBAAgB;AAAA,MACrC,sBAAsB,SAAS;AAAA,MAC/B,UAAU;AAAA,IAAA,CACX;AAED,iBAAa,QAAQ,OAAO;AAC5B,eAAW,QAAQ,OAAO;AAC1B,gBAAA;AAAA,EACF;AAGA,MAAI,gBAAsD;AAC1D,QAAM,iBAAiB,MAAM;AAC3B,QAAI,4BAA4B,aAAa;AAC7C,oBAAgB,WAAW,MAAM;AAC/B,qBAAA;AAAA,IACF,GAAG,GAAG;AAAA,EACR;AAGA,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA,GACC,gBAAgB,EAAE,MAAM,MAAM;AAEjC,SAAO;AAAA;AAAA,IAEL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA;AAAA,IAGA;AAAA,IACA;AAAA,IACA;AAAA;AAAA,IAGA;AAAA,IACA;AAAA,IACA;AAAA;AAAA,IAGA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA;AAEJ;ACrMO,SAAS,gBAAgB;AAC9B,QAAM,cAAc,IAAe,IAAI;AAEvC,QAAM,SAAS,SAAS,MAAM,YAAY,UAAU,IAAI;AAExD,QAAM,YAAY,CAAC,UAAqB;AACtC,gBAAY,QAAQ;AAAA,EACtB;AAEA,QAAM,aAAa,MAAM;AACvB,gBAAY,QAAQ;AAAA,EACtB;AAEA,QAAM,cAAc,CAAC,UAAqB;AACxC,WAAO,YAAY,UAAU;AAAA,EAC/B;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA;AAEJ;;;;;;;;AC2DA,UAAM,QAAQ;AAMd,UAAM,QAAQ,iBAAiB,MAAM,MAAM;AAC3C,UAAM,aAAa,cAAA;AAGnB,UAAM,YAAY,CAAC,UAAqB;AACtC,iBAAW,UAAU,KAAK;AAAA,IAC5B;AAMA,UAAM,UAAU,CAAC,UAAsB;AAGrC,YAAM,SAAS,MAAM;AACrB,UAAI,iCAAQ,QAAQ,gCAAgC;AAGlD,cAAM,gBAAA;AACN;AAAA,MACF;AAGA,YAAMvG,OAAO,OAAe;AAC5B,UAAI,CAACA,QAAO,CAACA,KAAI,UAAU,OAAOA,KAAI,OAAO,sBAAsB,YAAY;AAC7E;AAAA,MACF;AAEA,YAAM,SAAS,MAAM;AACrB,YAAM,SAAS,MAAM;AACrB,YAAM,eAAe,KAAK,IAAI,MAAM,IAAI,KAAK,IAAI,MAAM;AAGvD,UAAI,MAAM,SAAS;AACjB,cAAM,eAAA;AACN,cAAM,gBAAA;AACN,QAAAA,KAAI,OAAO,kBAAkB,KAAK;AAClC;AAAA,MACF;AAGA,UAAI,cAAc;AAChB,cAAM,eAAA;AACN,cAAM,gBAAA;AACN,QAAAA,KAAI,OAAO,kBAAkB,KAAK;AAClC;AAAA,MACF;AAGA,YAAM,eAAA;AACN,YAAM,gBAAA;AACN,MAAAA,KAAI,OAAO,kBAAkB,KAAK;AAAA,IACpC;AAGA,cAAU,YAAY;AAKpB,YAAM,OAAO,WAAW,CAACf,OAAsB;AAC7C,YAAIA,IAAG;AACL,kBAAQ,IAAI,iDAAiD;AAC7D,gBAAM,kBAAkBA,EAAC;AAAA,QAE3B;AAAA,MACF;AAGA,UAAI,MAAM,OAAO,OAAO;AACtB,gBAAQ,IAAI,+CAA+C;AAC3D,cAAM,kBAAkB,MAAM,OAAO,KAAuB;AAAA,MAC9D;AAGA,YAAM,MAAM,mBAAA;AAIZ,YAAM,MAAM,eAAA;AAAA,IACd,CAAC;;0BA7KCwF,mBAwEM,OAAA;AAAA,QAxED,OAAM;AAAA,QAAoB;AAAA,MAAA;QAE7BQ,YAwBE,qBAAA;AAAA,UAvBC,wBAAsBuB,MAAA,KAAA,EAAM,mBAAmB;AAAA,UAC/C,yBAAuBA,MAAA,KAAA,EAAM,oBAAoB;AAAA,UACjD,gBAAcA,MAAA,KAAA,EAAM,YAAY;AAAA,UAChC,gBAAcA,MAAA,KAAA,EAAM,YAAY;AAAA,UAChC,mBAAiBA,MAAA,KAAA,EAAM,eAAe;AAAA,UACtC,mBAAiBA,MAAA,KAAA,EAAM,eAAe;AAAA,UACtC,oBAAkBA,MAAA,KAAA,EAAM,gBAAgB;AAAA,UACxC,oBAAkBA,MAAA,KAAA,EAAM,gBAAgB;AAAA,UACxC,aAAWA,MAAA,KAAA,EAAM,SAAS;AAAA,UAC1B,sBAAoBA,MAAA,KAAA,EAAM,iBAAiB;AAAA,UAC3C,iBAAeA,MAAA,KAAA,EAAM,aAAa;AAAA,UAClC,iBAAeA,MAAA,KAAA,EAAM,aAAa;AAAA,UAClC,eAAaA,MAAA,KAAA,EAAM,WAAW;AAAA,UAC9B,cAAYA,MAAA,KAAA,EAAM,UAAU;AAAA,UAC5B,aAAY;AAAA,UACZ,iEAAwBA,MAAA,KAAA,EAAM,eAAe,QAAQ;AAAA,UACrD,iEAAwBA,MAAA,KAAA,EAAM,eAAe,QAAQ;AAAA,UACrD,kEAAyBA,MAAA,KAAA,EAAM,gBAAgB,QAAQ;AAAA,UACvD,kEAAyBA,MAAA,KAAA,EAAM,gBAAgB,QAAQ;AAAA,UACvD,2DAAkBA,MAAA,KAAA,EAAM,SAAS,QAAQ;AAAA,UACzC,mEAA2BA,MAAA,KAAA,EAAM,iBAAiB,QAAQ;AAAA,UAC1D,+DAAsBA,MAAA,KAAA,EAAM,aAAa,QAAQ;AAAA,UACjD,WAASA,MAAA,KAAA,EAAM;AAAA,QAAA;QAIlBvB,YAME,gBAAA;AAAA,UALC,SAASuB,MAAA,UAAA,EAAW,YAAW,YAAA;AAAA,UAC/B,QAAQA,MAAA,KAAA,EAAM,oBAAoB;AAAA,UAClC,UAAUA,MAAA,KAAA,EAAM,mBAAmB;AAAA,UACnC,SAAOA,MAAA,UAAA,EAAW;AAAA,UAClB,2DAAiBA,MAAA,KAAA,EAAM,mBAAmB,QAAQ;AAAA,QAAA;QAGrDvB,YAOE,WAAA;AAAA,UANC,SAASuB,MAAA,UAAA,EAAW,YAAW,aAAA;AAAA,UAC/B,MAAMA,MAAA,KAAA,EAAM,cAAc;AAAA,UAC1B,UAAUA,MAAA,KAAA,EAAM,YAAY;AAAA,UAC7B,SAAQ;AAAA,UACP,SAAOA,MAAA,UAAA,EAAW;AAAA,UAClB,2DAAiBA,MAAA,KAAA,EAAM,YAAY,QAAQ;AAAA,QAAA;QAG9CvB,YAOE,WAAA;AAAA,UANC,SAASuB,MAAA,UAAA,EAAW,YAAW,aAAA;AAAA,UAC/B,MAAMA,MAAA,KAAA,EAAM,cAAc;AAAA,UAC1B,UAAUA,MAAA,KAAA,EAAM,YAAY;AAAA,UAC7B,SAAQ;AAAA,UACP,SAAOA,MAAA,UAAA,EAAW;AAAA,UAClB,2DAAiBA,MAAA,KAAA,EAAM,YAAY,QAAQ;AAAA,QAAA;QAG9CvB,YAOE,cAAA;AAAA,UANC,SAASuB,MAAA,UAAA,EAAW,YAAW,gBAAA;AAAA,UAC/B,SAASA,MAAA,KAAA,EAAM,WAAW;AAAA,UAC1B,UAAUA,MAAA,KAAA,EAAM,eAAe;AAAA,UAChC,SAAQ;AAAA,UACP,SAAOA,MAAA,UAAA,EAAW;AAAA,UAClB,6DAAiBA,MAAA,KAAA,EAAM,eAAe,QAAQ;AAAA,QAAA;QAGjDvB,YAOE,cAAA;AAAA,UANC,SAASuB,MAAA,UAAA,EAAW,YAAW,gBAAA;AAAA,UAC/B,SAASA,MAAA,KAAA,EAAM,WAAW;AAAA,UAC1B,UAAUA,MAAA,KAAA,EAAM,eAAe;AAAA,UAChC,SAAQ;AAAA,UACP,SAAOA,MAAA,UAAA,EAAW;AAAA,UAClB,6DAAiBA,MAAA,KAAA,EAAM,eAAe,QAAQ;AAAA,QAAA;;;;;;;;;;;;;;;;;;;;;;;;;;AChCrD,UAAM,QAAQ;AAId,UAAM,eAAe,SAAS,MAAM,MAAM,MAAM,MAAM,GAAG,CAAC,CAAC;AAG3D,UAAM,cAAc,IAA4B,EAAE;AAGlD,UAAM,kBAAkB,OAAO,aAAqB;AAClD,UAAI;AACF,cAAM,WAAW,MAAM,MAAM,SAAS,kCAAkC,mBAAmB,QAAQ,CAAC,EAAE,CAAC;AAEvG,YAAI,SAAS,IAAI;AACf,gBAAM,OAAO,MAAM,SAAS,KAAA;AAC5B,cAAI,KAAK,aAAa;AACpB,wBAAY,MAAM,QAAQ,IAAI,KAAK;AAAA,UACrC;AAAA,QACF;AAAA,MACF,SAAS,OAAO;AAAA,MAEhB;AAAA,IACF;AAGA,UAAM,MAAM,QAAQ,CAAA,SAAQ;AAC1B,sBAAgB,KAAK,IAAI;AAAA,IAC3B,CAAC;AAED,UAAM,eAAe,CAAC,aAAqB;AACzC,kBAAY,MAAM,QAAQ,IAAI;AAAA,IAChC;;AAtEE,aAAA1B,UAAA,GAAAL,mBA8BM,OA9BNG,cA8BM;AAAA,QA7BJD,gBA4BM,OA5BNI,cA4BM;AAAA,4BA3BJN,mBAuBMY,UAAA,MAAAC,WAtBW,aAAA,OAAY,CAApB,SAAI;gCADbb,mBAuBM,OAAA;AAAA,cArBH,KAAK,KAAK;AAAA,cACX,OAAM;AAAA,YAAA;cAGE,YAAA,MAAY,KAAK,IAAI,kBAD7BA,mBAKE,OAAA;AAAA;gBAHC,KAAK,YAAA,MAAY,KAAK,IAAI;AAAA,gBAC3B,OAAM;AAAA,gBACL,SAAK,CAAA,WAAE,aAAa,KAAK,IAAI;AAAA,cAAA,+BAEhCK,aAAAL,mBAKM,OALNU,cAKM,CAAA,GAAA,OAAA,CAAA,MAAA,OAAA,CAAA,IAAA;AAAA,gBAJJR,gBAGM,OAAA;AAAA,kBAHD,SAAQ;AAAA,kBAAY,MAAK;AAAA,gBAAA;kBAC5BA,gBAA2D,QAAA,EAArD,GAAE,mDAAiD;AAAA,kBACzDA,gBAAuN,QAAA,EAAjN,GAAE,+MAA6M;AAAA,gBAAA;;cAGzNA,gBAKM,OALNS,cAKM;AAAA,gBAJJT,gBAA4D,QAA5Da,cAA4DX,gBAAnB,KAAK,IAAI,GAAA,CAAA;AAAA,gBAClDF,gBAEO,QAFPc,cAA0C,SACrCZ,gBAAG,KAAK,QAAQ,IAAAA,gBAAM,KAAK,iBAAiB,SAAS,SAAY,KAAK,YAAY,KAAA,EAAA,GAAA,CAAA;AAAA,cAAA;;;UAIhF,QAAA,MAAM,SAAM,kBAAvBJ,mBAEM,OAFNiB,cAA6D,OAC1Db,iBAAI,QAAA,MAAM,SAAM,GAAM,eAAA,CAAc,IAAK,gBAC5C,CAAA;;;;;;;;;;;;;;;;;;;;ACMN,UAAM,QAAQ;AAWd,UAAM3E,QAAO;AAIb,UAAM,UAAU,IAAwB,IAAI;AAC5C,UAAM,WAAW,IAAI,KAAK;AAC1B,UAAM,kBAAkB,IAAmB,IAAI;AAE/C,UAAM,UAAU,SAAS,MAAM;AAC7B,YAAM,QAAQ,MAAM,MAAM,MAAM;AAChC,cAAS,MAAM,QAAQ,MAAM,OAAO,QAAS;AAAA,IAC/C,CAAC;AAED,UAAM,oBAAoB,SAAS,MAAM;AACvC,UAAI,CAAC,MAAM,aAAc,QAAO;AAChC,YAAM,QAAQ,MAAM,MAAM,MAAM;AAChC,cAAS,MAAM,aAAa,MAAM,MAAM,OAAO,QAAS;AAAA,IAC1D,CAAC;AAED,UAAM,oBAAoB,SAAS,MAAM;AACvC,UAAI,CAAC,MAAM,aAAc,QAAO;AAChC,YAAM,QAAQ,MAAM,MAAM,MAAM;AAChC,cAAS,MAAM,aAAa,MAAM,MAAM,OAAO,QAAS;AAAA,IAC1D,CAAC;AAED,UAAM,cAAc,CAAC,QAAwB;AAC3C,UAAI,OAAO,UAAU,GAAG,EAAG,QAAO,IAAI,SAAA;AACtC,aAAO,IAAI,QAAQ,eAAe,MAAM,IAAI,CAAC;AAAA,IAC/C;AAEA,UAAM,iBAAiB,CAAC,SAAyB;AAC/C,YAAM,MAAM,KAAK,SAAA;AACjB,YAAM,eAAe,IAAI,QAAQ,GAAG;AACpC,aAAO,iBAAiB,KAAK,IAAI,IAAI,SAAS,eAAe;AAAA,IAC/D;AAEA,UAAM,aAAa,CAAC,UAA0B;AAC5C,YAAM,QAAQ,KAAK,OAAO,QAAQ,MAAM,OAAO,MAAM,IAAI;AACzD,YAAM,WAAW,KAAK,IAAI,MAAM,KAAK,KAAK,IAAI,MAAM,KAAK,MAAM,MAAM,QAAQ,MAAM,IAAI,CAAC;AAExF,aAAO,KAAK,MAAM,WAAW,GAAG,IAAI;AAAA,IACtC;AAEA,UAAM,YAAY,CAAC,UAAwB;AACzC,UAAI,MAAM,SAAU;AAEpB,YAAM,eAAA;AACN,YAAM,gBAAA;AAEN,eAAS,QAAQ;AACjB,sBAAgB,QAAQ,MAAM;AAG9B,YAAM,SAAS,MAAM;AACrB,aAAO,kBAAkB,MAAM,SAAS;AAGxC,kBAAY,KAAK;AAAA,IACnB;AAEA,UAAM,SAAS,CAAC,UAAwB;AACtC,UAAI,CAAC,SAAS,MAAO;AACrB,YAAM,gBAAA;AACN,kBAAY,KAAK;AAAA,IACnB;AAEA,UAAM,cAAc,CAAC,UAAwB;AAC3C,UAAI,CAAC,QAAQ,SAAS,CAAC,SAAS,MAAO;AAEvC,YAAM,OAAO,QAAQ,MAAM,sBAAA;AAC3B,YAAMuG,WAAU,KAAK,IAAI,GAAG,KAAK,IAAI,IAAI,MAAM,UAAU,KAAK,QAAQ,KAAK,KAAK,CAAC;AACjF,YAAM,WAAW,MAAM,MAAMA,YAAW,MAAM,MAAM,MAAM;AAC1D,YAAM,QAAQ,WAAW,QAAQ;AAEjC,MAAAvG,MAAK,gBAAgB,KAAK;AAAA,IAC5B;AAEA,UAAM,UAAU,CAAC,UAAsB;;AACrC,UAAI,MAAM,SAAU;AAEpB,YAAM,QAAOhB,MAAA,QAAQ,UAAR,gBAAAA,IAAe;AAC5B,UAAI,CAAC,KAAM;AAEX,YAAM,WAAY,MAAM,cAA8B,sBAAA;AACtD,UAAI,MAAM,UAAU,SAAS,QAAQ,MAAM,UAAU,SAAS,SAC1D,MAAM,UAAU,SAAS,OAAO,MAAM,UAAU,SAAS,OAAQ;AAGrE,YAAM,QAAQ,MAAM,SAAS,IAAI,KAAK;AACtC,YAAM,WAAW,WAAW,MAAM,QAAQ,QAAQ,MAAM,IAAI;AAC5D,MAAAgB,MAAK,gBAAgB,QAAQ;AAG7B,YAAM,gBAAA;AAAA,IACR;AAEA,UAAM,WAAW,CAAC,UAAyB;AACzC,UAAI,CAAC,SAAS,MAAO;AAErB,UAAI,OAAO;AACT,cAAM,gBAAA;AAEN,cAAM,SAAS,MAAM;AACrB,YAAI,gBAAgB,UAAU,MAAM;AAClC,iBAAO,sBAAsB,gBAAgB,KAAK;AAAA,QACpD;AAAA,MACF;AAEA,eAAS,QAAQ;AACjB,sBAAgB,QAAQ;AAAA,IAC1B;;0BA3JEuE,mBA4BM,OAAA;AAAA,QA5BD,OAAKC,eAAA,CAAC,iBAAe,EAAA,UAAW,QAAA,yBAAyB,SAAA,MAAA,CAAQ,CAAA;AAAA,QAAI,sBAAmB;AAAA,QAAQ;AAAA,MAAA;QACnGC,gBAcM,OAAA;AAAA,UAdD,OAAM;AAAA,mBAAmB;AAAA,UAAJ,KAAI;AAAA,QAAA;oCAC5BA,gBAAoC,OAAA,EAA/B,OAAM,mBAAA,GAAkB,MAAA,EAAA;AAAA,UAC7BA,gBAGO,OAAA;AAAA,YAFL,OAAM;AAAA,YACL,+BAAgB,QAAA,QAAO,KAAA;AAAA,UAAA;UAGlB,QAAA,6BADRF,mBAOO,OAAA;AAAA;YALL,OAAM;AAAA,YACL,OAAKiC,eAAA;AAAA,oBAAoB,kBAAA,QAAiB;AAAA,cAA0B,OAAA,kBAAA,QAAoB,kBAAA,QAAiB;AAAA,YAAA;;;QAO9G/B,gBAUM,OAAA;AAAA,UATJ,OAAM;AAAA,UACL,8BAAe,QAAA,QAAO,KAAA;AAAA,UACtB,6BAAkB,WAAS,CAAA,MAAA,CAAA;AAAA,UAC3B,6BAAkB,QAAM,CAAA,MAAA,CAAA;AAAA,UACxB,2BAAgB,UAAQ,CAAA,MAAA,CAAA;AAAA,UACxB,+BAAoB,UAAQ,CAAA,MAAA,CAAA;AAAA,QAAA;oCAE7BA,gBAAwC,OAAA,EAAnC,OAAM,uBAAA,GAAsB,MAAA,EAAA;AAAA,UACjCA,gBAAgE,OAAhEC,cAAgEC,gBAA3B,YAAY,QAAA,KAAK,CAAA,GAAA,CAAA;AAAA,QAAA;;;;;;;;;;;;;;;;;;;;;;;;ACgD5D,UAAM,QAAQ;AAkBd,UAAM3E,QAAO;AAKb,UAAM,UAAU,IAAwB,IAAI;AAC5C,UAAM,WAAW,IAA0B,IAAI;AAC/C,UAAM,kBAAkB,IAAmB,IAAI;AAE/C,UAAM,oBAAoB,SAAoB,MAAM;AAClD,UAAI,MAAM,cAAc,eAAe,MAAM,SAAS,SAAS,GAAG;AAChE,eAAO,MAAM;AAAA,MACf;AACA,aAAO,CAAA;AAAA,IACT,CAAC;AAED,UAAM,aAAa,SAAS,MAAM;AAChC,UAAI,MAAM,cAAc,eAAe,kBAAkB,MAAM,SAAS,GAAG;AACzE,eAAO,eAAe,MAAM,QAAQ;AAAA,MACtC;AACA,YAAM,QAAQ,MAAM,MAAM,MAAM;AAChC,cAAS,MAAM,WAAW,MAAM,OAAO,QAAS;AAAA,IAClD,CAAC;AAED,UAAM,aAAa,SAAS,MAAM;AAChC,UAAI,MAAM,cAAc,eAAe,kBAAkB,MAAM,SAAS,GAAG;AACzE,eAAO,eAAe,MAAM,QAAQ;AAAA,MACtC;AACA,YAAM,QAAQ,MAAM,MAAM,MAAM;AAChC,cAAS,MAAM,WAAW,MAAM,OAAO,QAAS;AAAA,IAClD,CAAC;AAED,UAAM,oBAAoB,SAAS,MAAM;AACvC,UAAI,CAAC,MAAM,aAAc,QAAO;AAChC,YAAM,QAAQ,MAAM,MAAM,MAAM;AAChC,cAAS,MAAM,aAAa,MAAM,MAAM,OAAO,QAAS;AAAA,IAC1D,CAAC;AAED,UAAM,oBAAoB,SAAS,MAAM;AACvC,UAAI,CAAC,MAAM,aAAc,QAAO;AAChC,UAAI,MAAM,cAAc,eAAe,kBAAkB,MAAM,SAAS,GAAG;AACzE,eAAO,eAAe,MAAM,aAAa,GAAG;AAAA,MAC9C;AACA,YAAM,QAAQ,MAAM,MAAM,MAAM;AAChC,cAAS,MAAM,aAAa,MAAM,MAAM,OAAO,QAAS;AAAA,IAC1D,CAAC;AAED,UAAM,iBAAiB,CAAC,UAA0B;AAChD,YAAM,WAAW,kBAAkB;AACnC,UAAI,SAAS,WAAW,GAAG;AACzB,cAAM,QAAQ,MAAM,MAAM,MAAM;AAChC,gBAAS,QAAQ,MAAM,OAAO,QAAS;AAAA,MACzC;AAEA,UAAI,qBAAqB;AACzB,iBAAW,OAAO,UAAU;AAC1B,YAAI,SAAS,IAAI,KAAK;AACpB,gCAAsB,IAAI;AAAA,QAC5B,WAAW,SAAS,IAAI,KAAK;AAC3B,gBAAM,WAAW,IAAI,MAAM,IAAI;AAC/B,gBAAM,aAAa,QAAQ,IAAI;AAC/B,gCAAuB,aAAa,WAAY,IAAI;AACpD,iBAAO;AAAA,QACT,OAAO;AACL;AAAA,QACF;AAAA,MACF;AACA,aAAO;AAAA,IACT;AAEA,UAAM,iBAAiB,CAAC,YAA4B;AAClD,YAAM,WAAW,kBAAkB;AACnC,UAAI,SAAS,WAAW,GAAG;AACzB,cAAM,QAAQ,MAAM,MAAM,MAAM;AAChC,eAAO,MAAM,MAAO,UAAU,MAAO;AAAA,MACvC;AAEA,UAAI,qBAAqB;AACzB,iBAAW,OAAO,UAAU;AAC1B,cAAM,gBAAgB,qBAAqB,IAAI;AAC/C,YAAI,WAAW,eAAe;AAC5B,gBAAM,WAAW,IAAI,MAAM,IAAI;AAC/B,gBAAM,gBAAgB,UAAU,sBAAsB,IAAI;AAC1D,iBAAO,IAAI,MAAM,eAAe;AAAA,QAClC;AACA,6BAAqB;AAAA,MACvB;AACA,aAAO,MAAM;AAAA,IACf;AAEA,UAAM,kBAAkB,CAAC,KAAc,UAAkB;AACvD,UAAI,cAAc;AAClB,eAASxB,KAAI,GAAGA,KAAI,OAAOA,MAAK;AAC9B,uBAAe,kBAAkB,MAAMA,EAAC,EAAE;AAAA,MAC5C;AACA,aAAO;AAAA,QACL,MAAM,cAAc;AAAA,QACpB,OAAO,IAAI,eAAe;AAAA,MAAA;AAAA,IAE9B;AAEA,UAAM,cAAc,CAAC,QAAwB;AAC3C,UAAI,OAAO,UAAU,GAAG,EAAG,QAAO,IAAI,SAAA;AACtC,aAAO,IAAI,QAAQ,eAAe,MAAM,IAAI,CAAC;AAAA,IAC/C;AAEA,UAAM,iBAAiB,CAAC,SAAyB;AAC/C,YAAM,MAAM,KAAK,SAAA;AACjB,YAAM,eAAe,IAAI,QAAQ,GAAG;AACpC,aAAO,iBAAiB,KAAK,IAAI,IAAI,SAAS,eAAe;AAAA,IAC/D;AAEA,UAAM,aAAa,CAAC,OAAe,sBAAuC;AACxE,YAAM,gBAAgB,oBAAoB,MAAM,OAAO,oBAAoB,MAAM;AACjF,YAAM,QAAQ,KAAK,OAAO,QAAQ,MAAM,OAAO,aAAa;AAC5D,YAAM,WAAW,KAAK,IAAI,MAAM,KAAK,KAAK,IAAI,MAAM,KAAK,MAAM,MAAM,QAAQ,aAAa,CAAC;AAE3F,aAAO,KAAK,MAAM,WAAW,GAAG,IAAI;AAAA,IACtC;AAEA,UAAM,YAAY,CAAC,QAAuB,UAAwB;AAChE,UAAI,MAAM,SAAU;AAEpB,YAAM,eAAA;AACN,YAAM,gBAAA;AAEN,eAAS,QAAQ;AACjB,sBAAgB,QAAQ,MAAM;AAG9B,YAAM,SAAS,MAAM;AACrB,aAAO,kBAAkB,MAAM,SAAS;AAGxC,kBAAY,KAAK;AAAA,IACnB;AAEA,UAAM,SAAS,CAAC,UAAwB;AACtC,UAAI,CAAC,SAAS,MAAO;AACrB,YAAM,gBAAA;AACN,kBAAY,KAAK;AAAA,IACnB;AAEA,UAAM,cAAc,CAAC,UAAwB;AAC3C,UAAI,CAAC,QAAQ,SAAS,CAAC,SAAS,MAAO;AAEvC,YAAM,OAAO,QAAQ,MAAM,sBAAA;AAC3B,YAAM,UAAU,KAAK,IAAI,GAAG,KAAK,IAAI,MAAM,MAAM,UAAU,KAAK,QAAQ,KAAK,QAAQ,GAAG,CAAC;AAEzF,YAAM,WAAW,eAAe,OAAO;AACvC,YAAM,aAAa,yBAAyB,QAAQ;AACpD,YAAM,QAAQ,WAAW,UAAU,UAAU;AAE7C,UAAI,SAAS,UAAU,OAAO;AAC5B,cAAM,gBAAgB,yBAAyB,MAAM,QAAQ;AAC7D,cAAM,aAAa,MAAM,mBAAmB,MAAM,WAAW,MAAM,WAAY,MAAM,OAAO;AAC5F,cAAM,WAAW,KAAK,IAAI,OAAO,UAAU;AAC3C,QAAAwB,MAAK,mBAAmB,QAAQ;AAAA,MAClC,OAAO;AACL,cAAM,gBAAgB,yBAAyB,MAAM,QAAQ;AAC7D,cAAM,aAAa,MAAM,mBAAmB,MAAM,WAAW,MAAM,WAAY,MAAM,OAAO;AAC5F,cAAM,WAAW,KAAK,IAAI,OAAO,UAAU;AAC3C,QAAAA,MAAK,mBAAmB,QAAQ;AAAA,MAClC;AAAA,IACF;AAEA,UAAM,2BAA2B,CAAC,UAA0B;AAC1D,UAAI,MAAM,cAAc,eAAe,kBAAkB,MAAM,WAAW,GAAG;AAC3E,eAAO;AAAA,MACT;AAEA,iBAAW,OAAO,kBAAkB,OAAO;AACzC,YAAI,SAAS,IAAI,OAAO,QAAQ,IAAI,KAAK;AACvC,iBAAO,IAAI,uBAAuB;AAAA,QACpC;AAAA,MACF;AACA,aAAO;AAAA,IACT;AAEA,UAAM,UAAU,CAAC,UAAsB;;AACrC,UAAI,MAAM,SAAU;AAEpB,YAAM,QAAOhB,MAAA,QAAQ,UAAR,gBAAAA,IAAe;AAC5B,UAAI,CAAC,KAAM;AAEX,YAAM,WAAY,MAAM,cAA8B,sBAAA;AACtD,UAAI,MAAM,UAAU,SAAS,QAAQ,MAAM,UAAU,SAAS,SAC1D,MAAM,UAAU,SAAS,OAAO,MAAM,UAAU,SAAS,OAAQ;AAGrE,YAAM,QAAQ,MAAM,SAAS,IAAI,KAAK;AACtC,YAAM,YAAY,MAAM,UAAU,KAAK;AACvC,YAAM,aAAa,KAAK;AAExB,YAAM,WAAY,WAAW,QAAQ,MAAO;AAC5C,YAAM,WAAY,WAAW,QAAQ,MAAO;AAE5C,UAAI,YAAY,UAAU;AACxB,cAAM,aAAa,yBAAyB,MAAM,QAAQ;AAC1D,cAAM,gBAAgB,MAAM,OAAO;AACnC,cAAM,WAAW,WAAW,MAAM,WAAW,QAAQ,eAAe,UAAU;AAC9E,cAAM,gBAAgB,yBAAyB,MAAM,QAAQ;AAC7D,cAAM,aAAa,MAAM,mBAAmB,MAAM,WAAW,MAAM,WAAY,MAAM,OAAO;AAC5F,QAAAgB,MAAK,mBAAmB,KAAK,IAAI,UAAU,UAAU,CAAC;AAAA,MACxD,WAAW,YAAY,UAAU;AAC/B,cAAM,aAAa,yBAAyB,MAAM,QAAQ;AAC1D,cAAM,gBAAgB,MAAM,OAAO;AACnC,cAAM,WAAW,WAAW,MAAM,WAAW,QAAQ,eAAe,UAAU;AAC9E,cAAM,gBAAgB,yBAAyB,MAAM,QAAQ;AAC7D,cAAM,aAAa,MAAM,mBAAmB,MAAM,WAAW,MAAM,WAAY,MAAM,OAAO;AAC5F,QAAAA,MAAK,mBAAmB,KAAK,IAAI,UAAU,UAAU,CAAC;AAAA,MACxD,OAAO;AACL,cAAM,gBAAgB,yBAAyB,MAAM,QAAQ;AAC7D,cAAM,gBAAgB,yBAAyB,MAAM,QAAQ;AAC7D,cAAM,SAAS,WAAW,MAAM,WAAW,QAAQ,MAAM,OAAO,eAAe,aAAa;AAC5F,cAAM,SAAS,WAAW,MAAM,WAAW,QAAQ,MAAM,OAAO,eAAe,aAAa;AAE5F,YAAI,SAAS,MAAM,UAAU;AAC3B,UAAAA,MAAK,mBAAmB,KAAK,IAAI,QAAQ,MAAM,GAAG,CAAC;AACnD,UAAAA,MAAK,mBAAmB,KAAK,IAAI,QAAQ,MAAM,GAAG,CAAC;AAAA,QACrD,OAAO;AACL,gBAAM,aAAa,MAAM,mBAAmB,SAAS,SAAU,MAAM,OAAO;AAC5E,cAAI,UAAU,YAAY;AACxB,YAAAA,MAAK,mBAAmB,MAAM;AAC9B,YAAAA,MAAK,mBAAmB,MAAM;AAAA,UAChC;AAAA,QACF;AAAA,MACF;AAGA,YAAM,gBAAA;AAAA,IACR;AAEA,UAAM,WAAW,CAAC,UAAyB;AACzC,UAAI,CAAC,SAAS,MAAO;AAErB,UAAI,OAAO;AACT,cAAM,gBAAA;AAEN,cAAM,SAAS,MAAM;AACrB,YAAI,gBAAgB,UAAU,MAAM;AAClC,iBAAO,sBAAsB,gBAAgB,KAAK;AAAA,QACpD;AAAA,MACF;AAEA,eAAS,QAAQ;AACjB,sBAAgB,QAAQ;AAAA,IAC1B;;0BAnVEuE,mBA2DM,OAAA;AAAA,QA3DD,OAAKC,eAAA,CAAC,qBAAmB,EAAA,UAAW,QAAA,UAAQ,eAAiB,SAAA,UAAQ,MAAA,gBAA2B,QAAA,cAAS,eAAoB,kBAAA,MAAkB,SAAM,EAAA,CAAA,CAAA;AAAA,QAAQ,sBAAmB;AAAA,QAAQ;AAAA,MAAA;QAC3LC,gBAgCM,OAAA;AAAA,UAhCD,OAAM;AAAA,mBAAmB;AAAA,UAAJ,KAAI;AAAA,QAAA;oCAE5BA,gBAAoC,OAAA,EAA/B,OAAM,mBAAA,GAAkB,MAAA,EAAA;AAAA,UAGb,QAAA,cAAS,eAAoB,kBAAA,MAAkB,SAAM,KACnEG,UAAA,IAAA,GAAAL,mBASOY,UAAA,EAAA,KAAA,KAAAC,WARkB,kBAAA,OAAiB,CAAhC,KAAK,UAAK;gCADpBb,mBASO,OAAA;AAAA,cAPJ,kBAAkB;AAAA,cACnB,uBAAM,yBAAuB;AAAA,gBAC0B,iCAAA,IAAI,uBAAuB,IAAI,sBAAmB;AAAA,gBAAqD,mCAAA,IAAI,uBAAuB,IAAI,sBAAmB;AAAA,cAAA;cAI/M,OAAKiC,eAAE,gBAAgB,KAAK,KAAK,CAAA;AAAA,YAAA;;UAKtC/B,gBAGO,OAAA;AAAA,YAFL,OAAM;AAAA,YACL,OAAK+B,eAAA,EAAA,MAAU,WAAA,QAAU,KAAA,OAAgB,WAAA,QAAa,WAAA,QAAU,KAAA;AAAA,UAAA;UAI3D,QAAA,6BADRjC,mBAOO,OAAA;AAAA;YALL,OAAM;AAAA,YACL,OAAKiC,eAAA;AAAA,oBAAoB,kBAAA,QAAiB;AAAA,cAA0B,OAAA,kBAAA,QAAoB,kBAAA,QAAiB;AAAA,YAAA;;;QAQ9G/B,gBAUM,OAAA;AAAA,UATJ,OAAM;AAAA,UACL,8BAAe,WAAA,QAAU,KAAA;AAAA,UACzB,eAAW,OAAA,CAAA,MAAA,OAAA,CAAA,IAAA0B,cAAA,CAAA,WAAO,UAAS,OAAQ,MAAM,GAAA,CAAA,MAAA,CAAA;AAAA,UACzC,6BAAkB,QAAM,CAAA,MAAA,CAAA;AAAA,UACxB,2BAAgB,UAAQ,CAAA,MAAA,CAAA;AAAA,UACxB,+BAAoB,UAAQ,CAAA,MAAA,CAAA;AAAA,QAAA;oCAE7B1B,gBAAwC,OAAA,EAAnC,OAAM,uBAAA,GAAsB,MAAA,EAAA;AAAA,UACjCA,gBAAmE,OAAnEC,cAAmEC,gBAA9B,YAAY,QAAA,QAAQ,CAAA,GAAA,CAAA;AAAA,QAAA;QAG3DF,gBAUM,OAAA;AAAA,UATJ,OAAM;AAAA,UACL,8BAAe,WAAA,QAAU,KAAA;AAAA,UACzB,eAAW,OAAA,CAAA,MAAA,OAAA,CAAA,IAAA0B,cAAA,CAAA,WAAO,UAAS,OAAQ,MAAM,GAAA,CAAA,MAAA,CAAA;AAAA,UACzC,6BAAkB,QAAM,CAAA,MAAA,CAAA;AAAA,UACxB,2BAAgB,UAAQ,CAAA,MAAA,CAAA;AAAA,UACxB,+BAAoB,UAAQ,CAAA,MAAA,CAAA;AAAA,QAAA;oCAE7B1B,gBAAwC,OAAA,EAAnC,OAAM,uBAAA,GAAsB,MAAA,EAAA;AAAA,UACjCA,gBAAmE,OAAnEI,cAAmEF,gBAA9B,YAAY,QAAA,QAAQ,CAAA,GAAA,CAAA;AAAA,QAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACgK/D,UAAM,mBAAmB;AAAA,MACvB,EAAE,KAAK,KAAK,KAAK,IAAI,cAAc,GAAA;AAAA,MACnC,EAAE,KAAK,IAAI,KAAK,GAAG,cAAc,IAAI,qBAAqB,IAAA;AAAA,MAC1D,EAAE,KAAK,GAAG,KAAK,IAAI,cAAc,GAAA;AAAA,IAAG;AA2CtC,UAAM,cAAc,IAAI,KAAK;AAE7B,UAAM,gBAAgB,CAAC/F,IAAuBC,OAAmC;AAC/E,UAAI,CAACD,MAAK,CAACC,GAAG,QAAO;AACrB,UAAID,GAAE,WAAWC,GAAE,OAAQ,QAAO;AAClC,YAAM,UAAU,CAAC,GAAGD,EAAC,EAAE,KAAK,CAAC,GAAG+C,OAAM,EAAE,KAAK,cAAcA,GAAE,IAAI,CAAC;AAClE,YAAM,UAAU,CAAC,GAAG9C,EAAC,EAAE,KAAK,CAAC,GAAG8C,OAAM,EAAE,KAAK,cAAcA,GAAE,IAAI,CAAC;AAClE,aAAO,QAAQ;AAAA,QAAM,CAAC,MAAMnD,OAC1B,KAAK,SAAS,QAAQA,EAAC,EAAE,QACzB,KAAK,aAAa,QAAQA,EAAC,EAAE,YAC7B,KAAK,iBAAiB,QAAQA,EAAC,EAAE;AAAA,MAAA;AAAA,IAErC;;AAnRE,aAAAoG,UAAA,GAAAL,mBA+MM,OA/MNG,cA+MM;AAAA,oCA9MJD,gBAEM,OAAA,EAFD,OAAM,qBAAiB;AAAA,UAC1BA,gBAAmD,MAAA,EAA/C,OAAM,iBAAA,GAAiB,qBAAmB;AAAA,QAAA;QAIhDA,gBAgDM,OAhDNI,cAgDM;AAAA,UA/CJ,OAAA,EAAA,MAAA,OAAA,EAAA,IAAAJ,gBAA+C,SAAA,EAAxC,OAAM,gBAAA,GAAgB,cAAU,EAAA;AAAA,UACvCA,gBAqBM,OArBNO,cAqBM;AAAA,YApBJP,gBASQ,SAAA;AAAA,cATD,OAAKD,eAAA,CAAC,kBAAgB,EAAA,QAAmB,QAAA,cAAS,SAAA,CAAA;AAAA,YAAA;cACvDC,gBAME,SAAA;AAAA,gBALA,MAAK;AAAA,gBACL,MAAK;AAAA,gBACL,OAAM;AAAA,gBACL,SAAS,QAAA,cAAS;AAAA,gBAClB,gDAAQK,KAAAA,MAAK,oBAAA,OAAA;AAAA,cAAA;cAEhB,OAAA,EAAA,MAAA,OAAA,EAAA,IAAAL,gBAA+C,QAAA,EAAzC,OAAM,0BAAuB,SAAK,EAAA;AAAA,YAAA;YAE1CA,gBASQ,SAAA;AAAA,cATD,OAAKD,eAAA,CAAC,kBAAgB,EAAA,QAAmB,QAAA,cAAS,SAAA,CAAA;AAAA,YAAA;cACvDC,gBAME,SAAA;AAAA,gBALA,MAAK;AAAA,gBACL,MAAK;AAAA,gBACL,OAAM;AAAA,gBACL,SAAS,QAAA,cAAS;AAAA,gBAClB,gDAAQK,KAAAA,MAAK,oBAAA,OAAA;AAAA,cAAA;cAEhB,OAAA,EAAA,MAAA,OAAA,EAAA,IAAAL,gBAA+C,QAAA,EAAzC,OAAM,0BAAuB,SAAK,EAAA;AAAA,YAAA;;UAI5CA,gBAsBM,OAtBNa,cAsBM;AAAA,YApBI,QAAA,cAAS,wBADjBD,YAQE,cAAA;AAAA;cANC,KAAK;AAAA,cACL,KAAK;AAAA,cACL,OAAO,QAAA;AAAA,cACP,MAAM;AAAA,cACN,iBAAe,EAAA,KAAA,GAAA,KAAA,EAAA;AAAA,cACf,kBAAY,OAAA,CAAA,MAAA,OAAA,CAAA,IAAA,CAAA,WAAEP,KAAAA,MAAK,qBAAsB,MAAM;AAAA,YAAA,wCAElDO,YAWE,iBAAA;AAAA;cATC,KAAK;AAAA,cACL,KAAK;AAAA,cACL,aAAW,QAAA;AAAA,cACX,aAAW,QAAA;AAAA,cACX,MAAM;AAAA,cACN,iBAAe,EAAA,KAAA,GAAA,KAAA,EAAA;AAAA,cACf,sBAAoB;AAAA,cACpB,qBAAgB,OAAA,CAAA,MAAA,OAAA,CAAA,IAAA,CAAA,WAAEP,KAAAA,MAAK,mBAAoB,MAAM;AAAA,cACjD,qBAAgB,OAAA,CAAA,MAAA,OAAA,CAAA,IAAA,CAAA,WAAEA,KAAAA,MAAK,mBAAoB,MAAM;AAAA,YAAA;;;QAMxDL,gBAiBM,OAjBNc,cAiBM;AAAA,UAhBJ,OAAA,EAAA,MAAA,OAAA,EAAA,IAAAd,gBAAyD,SAAA,EAAlD,OAAM,gBAAA,GAAgB,wBAAoB,EAAA;AAAA,UACjDA,gBAcM,OAdNe,cAcM;AAAA,YAbJT,YAYE,iBAAA;AAAA,cAXC,KAAK;AAAA,cACL,KAAK;AAAA,cACL,aAAW,QAAA;AAAA,cACX,aAAW,QAAA;AAAA,cACX,MAAM;AAAA,cACN,iBAAe,EAAA,KAAA,IAAA,KAAA,EAAA;AAAA,cACf,cAAY;AAAA,cACZ,UAAU;AAAA,cACV,sBAAoB;AAAA,cACpB,qBAAgB,OAAA,CAAA,MAAA,OAAA,CAAA,IAAA,CAAA,WAAED,KAAAA,MAAK,2BAA4B,MAAM;AAAA,cACzD,qBAAgB,OAAA,CAAA,MAAA,OAAA,CAAA,IAAA,CAAA,WAAEA,KAAAA,MAAK,2BAA4B,MAAM;AAAA,YAAA;;;QAMhEL,gBAgCM,OAhCNgB,cAgCM;AAAA,UA/BJhB,gBAgBM,OAhBNiB,eAgBM;AAAA,YAfJ,OAAA,EAAA,MAAA,OAAA,EAAA,IAAAjB,gBAEQ,SAAA,EAFD,OAAM,gBAAA,GAAgB,2BAE7B,EAAA;AAAA,YACAA,gBAWS,UAAA;AAAA,cAVP,MAAK;AAAA,cACL,OAAKD,eAAA,CAAC,iBAAe,EAAA,yBACc,QAAA,uBAAA,CAAsB,CAAA;AAAA,cACxD,SAAK,OAAA,CAAA,MAAA,OAAA,CAAA,IAAA,CAAA,WAAEM,KAAAA,MAAK,iCAAA,CAAmC,QAAA,sBAAsB;AAAA,cACtE,MAAK;AAAA,cACJ,gBAAc,QAAA;AAAA,cACf,OAAM;AAAA,YAAA;cAENL,gBAA0C,QAAA,EAApC,OAAM,uBAAA,GAAsB,MAAA,EAAA;AAAA,cAClCA,gBAA0C,QAAA,EAApC,OAAM,uBAAA,GAAsB,MAAA,EAAA;AAAA,YAAA;;UAGtCA,gBAaM,OAAA;AAAA,YAbD,OAAKD,eAAA,CAAC,oBAAkB,EAAA,8BAAA,CAA0C,QAAA,wBAAsB,CAAA;AAAA,UAAA;YAC3FO,YAWE,iBAAA;AAAA,cAVC,KAAK;AAAA,cACL,KAAK;AAAA,cACL,aAAW,QAAA;AAAA,cACX,aAAW,QAAA;AAAA,cACX,MAAM;AAAA,cACN,iBAAe,EAAA,KAAA,KAAA,KAAA,EAAA;AAAA,cACf,WAAW,QAAA;AAAA,cACX,sBAAoB;AAAA,cACpB,qBAAgB,OAAA,CAAA,MAAA,OAAA,CAAA,IAAA,CAAA,WAAED,KAAAA,MAAK,sCAAuC,MAAM;AAAA,cACpE,qBAAgB,OAAA,CAAA,MAAA,OAAA,CAAA,IAAA,CAAA,WAAEA,KAAAA,MAAK,sCAAuC,MAAM;AAAA,YAAA;;;QAM3EL,gBAkCM,OAlCNmB,eAkCM;AAAA,UAjCJnB,gBAgBM,OAhBNgC,eAgBM;AAAA,YAfJhC,gBAEQ,SAFRoB,eAA6B,4CACF,QAAA,qBAAkB,iBAAA,oBAAA,GAAA,CAAA;AAAA,YAE7CpB,gBAWS,UAAA;AAAA,cAVP,MAAK;AAAA,cACL,OAAKD,eAAA,CAAC,iBAAe,EAAA,yBACc,QAAA,mBAAA,CAAkB,CAAA;AAAA,cACpD,SAAK,OAAA,EAAA,MAAA,OAAA,EAAA,IAAA,CAAA,WAAEM,KAAAA,MAAK,6BAAA,CAA+B,QAAA,kBAAkB;AAAA,cAC9D,MAAK;AAAA,cACJ,gBAAc,QAAA;AAAA,cACf,OAAM;AAAA,YAAA;cAENL,gBAA0C,QAAA,EAApC,OAAM,uBAAA,GAAsB,MAAA,EAAA;AAAA,cAClCA,gBAA0C,QAAA,EAApC,OAAM,uBAAA,GAAsB,MAAA,EAAA;AAAA,YAAA;;UAGtCA,gBAeM,OAAA;AAAA,YAfD,OAAKD,eAAA,CAAC,oBAAkB,EAAA,8BAAyC,QAAA,wBAAsB,CAAA;AAAA,UAAA;YAC1FO,YAaE,iBAAA;AAAA,cAZC,KAAK;AAAA,cACL,KAAK;AAAA,cACL,aAAW,QAAA;AAAA,cACX,aAAW,QAAA;AAAA,cACX,MAAM;AAAA,cACN,iBAAe,EAAA,KAAA,IAAA,KAAA,EAAA;AAAA,cACf,cAAY;AAAA,cACZ,UAAU;AAAA,cACV,UAAU,QAAA;AAAA,cACV,sBAAoB;AAAA,cACpB,qBAAgB,OAAA,EAAA,MAAA,OAAA,EAAA,IAAA,CAAA,WAAED,KAAAA,MAAK,0BAA2B,MAAM;AAAA,cACxD,qBAAgB,OAAA,EAAA,MAAA,OAAA,EAAA,IAAA,CAAA,WAAEA,KAAAA,MAAK,0BAA2B,MAAM;AAAA,YAAA;;;QAM/DL,gBAyDM,OAzDNiC,eAyDM;AAAA,UAxDJ,OAAA,EAAA,MAAA,OAAA,EAAA,IAAAjC,gBAA8C,SAAA,EAAvC,OAAM,gBAAA,GAAgB,aAAS,EAAA;AAAA,UACtCA,gBAsDM,OAtDNkC,eAsDM;AAAA,YArDJlC,gBA4CM,OA5CNmC,eA4CM;AAAA,cA3CJnC,gBAaS,UAAA;AAAA,gBAZP,OAAKD,eAAA,CAAC,eAAa,EAAA,UACC,QAAA,aAAQ,QAAA,CAAA,CAAA;AAAA,gBAC3B,UAAU,QAAA;AAAA,gBACV,iDAAOM,KAAAA,MAAK,gBAAA;AAAA,cAAA;;;cAUfL,gBAcS,UAAA;AAAA,gBAbP,OAAKD,eAAA,CAAC,eAAa,EAAA,UACC,QAAA,aAAQ,SAAA,CAAA,CAAA;AAAA,gBAC3B,UAAU,QAAA;AAAA,gBACV,iDAAOM,KAAAA,MAAK,kBAAA;AAAA,cAAA;;;cAWfL,gBAaS,UAAA;AAAA,gBAZP,OAAKD,eAAA,CAAC,eAAa,EAAA,UACC,QAAA,aAAQ,WAAgB,QAAA,gBAAgB,cAAc,QAAA,cAAc,QAAA,QAAQ,EAAA,CAAA,CAAA;AAAA,gBAC/F,WAAW,QAAA;AAAA,gBACX,sDAAY,YAAA,QAAW;AAAA,gBACvB,sDAAY,YAAA,QAAW;AAAA,gBACvB,iDAAOM,KAAAA,MAAK,YAAA;AAAA,cAAA;gBAEbL,gBAGM,OAAA;AAAA,kBAHD,OAAM;AAAA,kBAAoB,SAAQ;AAAA,kBAAY,MAAK;AAAA,kBAAO,QAAO;AAAA,kBAAe,gBAAa;AAAA,kBAAI,kBAAe;AAAA,kBAAQ,mBAAgB;AAAA,gBAAA;kBAC3IA,gBAAyB,QAAA,EAAnB,GAAE,iBAAe;AAAA,kBACvBA,gBAAsE,QAAA,EAAhE,GAAE,8DAA4D;AAAA,gBAAA;gBAEtEA,gBAAiD,QAAA,EAA3C,OAAM,oBAAA,GAAoB,cAAU,EAAA;AAAA,cAAA;;YAK9CM,YAKagB,YAAA,EALD,MAAK,aAAS;AAAA,+BACxB,MAGE;AAAA,gBAFM,YAAA,SAAe,QAAA,YAAY,QAAA,SAAS,SAAM,kBADlDV,YAGE,iBAAA;AAAA;kBADC,OAAO,QAAA;AAAA,gBAAA;;;;;;;;;;;ACvMb,SAAS,uBAAuB,QAA2C;AAGhF,MAAI,cAAc;AAGlB,QAAM,YAAY,IAAuB,OAAO;AAChD,QAAM,aAAa,IAAI,CAAC;AACxB,QAAM,WAAW,IAAI,CAAC;AACtB,QAAM,WAAW,IAAI,CAAC;AACtB,QAAM,mBAAmB,IAAI,CAAG;AAChC,QAAM,mBAAmB,IAAI,CAAG;AAChC,QAAM,qBAAqB,IAAI,KAAK;AACpC,QAAM,kBAAkB,IAAI,CAAG;AAC/B,QAAM,kBAAkB,IAAI,CAAG;AAC/B,QAAM,WAAW,IAAwB,OAAO;AAChD,QAAM,YAAY,IAAI,KAAK;AAC3B,QAAM,yBAAyB,IAAI,KAAK;AACxC,QAAM,8BAA8B,IAAI,GAAG;AAC3C,QAAM,8BAA8B,IAAI,CAAG;AAG3C,QAAM,WAAW,IAAwB,IAAI;AAK7C,QAAM,gBAAgB,IAAmB,IAAI;AAC7C,QAAM,WAAW,IAAmB,IAAI;AAGxC,QAAM,cAAc,MAAwB;AAE1C,QAAI,aAAa;AACf,aAAO;AAAA,QACL,YAAY,UAAU;AAAA,QACtB,aAAa,WAAW;AAAA,QACxB,WAAW,SAAS;AAAA,QACpB,WAAW,SAAS;AAAA,QACpB,oBAAoB,iBAAiB;AAAA,QACrC,oBAAoB,iBAAiB;AAAA,QACrC,wBAAwB,CAAC,mBAAmB;AAAA,QAC5C,mBAAmB,gBAAgB;AAAA,QACnC,mBAAmB,gBAAgB;AAAA,QACnC,WAAW,SAAS;AAAA,QACpB,WAAW,SAAS;AAAA,QACpB,0BAA0B,uBAAuB;AAAA,QACjD,gCAAgC,4BAA4B;AAAA,QAC5D,gCAAgC,4BAA4B;AAAA,QAC5D,gBAAgB,cAAc;AAAA,QAC9B,WAAW,SAAS;AAAA,MAAA;AAAA,IAExB;AACA,WAAO;AAAA,MACP,YAAY,UAAU;AAAA,MACtB,aAAa,WAAW;AAAA,MACxB,WAAW,SAAS;AAAA,MACpB,WAAW,SAAS;AAAA,MACpB,oBAAoB,iBAAiB;AAAA,MACrC,oBAAoB,iBAAiB;AAAA,MACrC,wBAAwB,CAAC,mBAAmB;AAAA,MAC5C,mBAAmB,gBAAgB;AAAA,MACnC,mBAAmB,gBAAgB;AAAA,MACnC,WAAW,SAAS;AAAA,MACpB,WAAW,SAAS;AAAA,MACpB,0BAA0B,uBAAuB;AAAA,MACjD,gCAAgC,4BAA4B;AAAA,MAC5D,gCAAgC,4BAA4B;AAAA,MAC5D,gBAAgB,cAAc;AAAA,MAC9B,WAAW,SAAS;AAAA,IAAA;AAAA,EAEtB;AAIA,QAAM,kBAAkB,MAAM;AAC5B,kBAAc,QAAQ,SAAS;AAC/B,aAAS,QAAQ,KAAK,MAAM,KAAK,OAAA,IAAW,UAAU;AAAA,EACxD;AAGA,QAAM,qBAAqB,MAAM;AAC/B,QAAI,SAAS,UAAU,MAAM;AAC3B,eAAS,QAAQ,KAAK,MAAM,KAAK,OAAA,IAAW,UAAU;AAAA,IACxD;AAAA,EACF;AAGA,QAAM,oBAAoB,CAAC,WAA6B;AAEtD,kBAAc;AAEd,QAAI;AACF,gBAAU,QAAQ,OAAO,cAAc;AACvC,iBAAW,QAAQ,OAAO,eAAe;AACzC,eAAS,QAAQ,OAAO,aAAa;AACrC,eAAS,QAAQ,OAAO,aAAa;AACrC,uBAAiB,QAAQ,OAAO,sBAAsB;AACtD,uBAAiB,QAAQ,OAAO,sBAAsB;AACtD,yBAAmB,QAAQ,EAAE,OAAO,0BAA0B;AAC9D,sBAAgB,QAAQ,OAAO,qBAAqB;AACpD,sBAAgB,QAAQ,OAAO,qBAAqB;AAEpD,YAAM,cAAe,OAAe;AACpC,UAAI,gBAAgB,YAAY;AAC9B,iBAAS,QAAQ;AAAA,MACnB,WAAW,gBAAgB,WAAW;AACpC,iBAAS,QAAQ;AAAA,MACnB,WAAW,gBAAgB,WAAW,gBAAgB,UAAU;AAC9D,iBAAS,QAAQ;AAAA,MACnB,OAAO;AACL,iBAAS,QAAQ;AAAA,MACnB;AACA,eAAS,QAAQ,OAAO,aAAa;AACrC,6BAAuB,QAAQ,OAAO,4BAA4B;AAClE,kCAA4B,QAAQ,OAAO,kCAAkC;AAC7E,kCAA4B,QAAQ,OAAO,kCAAkC;AAAA,IAC/E,UAAA;AACE,oBAAc;AAAA,IAChB;AAAA,EACF;AAGA,QAAM,YAAY,OAChB,YACA,gBACyB;AACzB,QAAI;AACF,gBAAU,QAAQ;AAElB,YAAM,SAAS,YAAA;AAGf,YAAM,cAAmB;AAAA,QACvB,oBAAoB,OAAO;AAAA,QAC3B,oBAAoB,OAAO;AAAA,QAC3B,wBAAwB,CAAC,mBAAmB;AAAA,QAC5C,mBAAmB,OAAO;AAAA,QAC1B,mBAAmB,OAAO;AAAA,QAC1B,cAAc;AAAA,QACd,0BAA0B,OAAO;AAAA,QACjC,gCAAgC,OAAO;AAAA,QACvC,gCAAgC,OAAO;AAAA,MAAA;AAIzC,UAAI,OAAO,eAAe,SAAS;AACjC,oBAAY,QAAQ,OAAO;AAAA,MAC7B,OAAO;AACL,oBAAY,YAAY,OAAO;AAC/B,oBAAY,YAAY,OAAO;AAAA,MACjC;AAGA,UAAI,YAAY;AACd,oBAAY,cAAc,WAAW,WAAW,CAAA;AAAA,MAClD;AAGA,YAAM,WAAW,MAAM,MAAM,SAAS,6BAA6B,GAAG;AAAA,QACpE,QAAQ;AAAA,QACR,SAAS;AAAA,UACP,gBAAgB;AAAA,QAAA;AAAA,QAElB,MAAM,KAAK,UAAU,WAAW;AAAA,MAAA,CACjC;AAED,UAAI,CAAC,SAAS,IAAI;AAChB,cAAM,YAAY,MAAM,SAAS,KAAA;AACjC,cAAM,IAAI,MAAM,UAAU,SAAS,8BAA8B;AAAA,MACnE;AAEA,YAAM,OAAO,MAAM,SAAS,KAAA;AAE5B,UAAI,CAAC,KAAK,SAAS;AACjB,cAAM,IAAI,MAAM,KAAK,SAAS,4BAA4B;AAAA,MAC5D;AAEA,aAAO,KAAK,SAAS,CAAA;AAAA,IACvB,SAAS,OAAO;AACd,cAAQ,MAAM,8CAA8C,KAAK;AACjE,YAAM;AAAA,IACR,UAAA;AACE,gBAAU,QAAQ;AAAA,IACpB;AAAA,EACF;AAGA,QAAM,cAAc,MAAM;AACxB,QAAI,SAAS,SAAS,SAAS,MAAM,SAAS,GAAG;AAC/C,aAAO,SAAS;AAAA,IAClB;AACA,WAAO;AAAA,EACT;AAGA,QAAM,yBAAyB,SAAS,MAAM,CAAC,mBAAmB,KAAK;AACvE,QAAM,+BAA+B,SAAS,MAAM,uBAAuB,KAAK;AAGhF,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA,GACC,MAAM;AACP,WAAO,QAAQ,YAAA;AAAA,EACjB,GAAG,EAAE,MAAM,MAAM;AAEjB,SAAO;AAAA;AAAA,IAEL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA;AAAA,IAGA;AAAA,IACA;AAAA;AAAA,IAGA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA;AAEJ;;;;;;;;;AC5MA,UAAM,QAAQ;AAOd,UAAM,QAAQ,uBAAuB,MAAM,MAAM;AAGjD,UAAM,eAAe,OAAO,cAAc;AAG1C,UAAM,eAAe,IAAiB,EAAE;AAGxC,UAAM,YAAY,IAAI,KAAK;AAO3B,UAAM,oBAAwC,CAAA;AAG9C,UAAM,eAAe,SAAS,MAAM;AAClC,YAAM,WAAW,MAAM,SAAS;AAChC,UAAI,CAAC,YAAY,SAAS,WAAW,EAAG,QAAO;AAC/C,aAAO,CAAC,cAAc,aAAa,OAAO,QAAQ;AAAA,IACpD,CAAC;AAGD,UAAM,gBAAgB,CAACzG,IAAgBC,OAA4B;AACjE,UAAID,GAAE,WAAWC,GAAE,OAAQ,QAAO;AAClC,YAAM,UAAU,CAAC,GAAGD,EAAC,EAAE,KAAK,CAAC,GAAG+C,OAAM,EAAE,KAAK,cAAcA,GAAE,IAAI,CAAC;AAClE,YAAM,UAAU,CAAC,GAAG9C,EAAC,EAAE,KAAK,CAAC,GAAG8C,OAAM,EAAE,KAAK,cAAcA,GAAE,IAAI,CAAC;AAClE,aAAO,QAAQ;AAAA,QAAM,CAAC,MAAMnD,OAC1B,KAAK,SAAS,QAAQA,EAAC,EAAE,QACzB,KAAK,aAAa,QAAQA,EAAC,EAAE,YAC7B,KAAK,iBAAiB,QAAQA,EAAC,EAAE;AAAA,MAAA;AAAA,IAErC;AAGA,UAAM,sBAAsB,YAAY;;AACtC,UAAI;AAEF,cAAM,eAAc,MAAAQ,MAAA,MAAM,MAAa,kBAAnB,wBAAAA,SAAwC;AAG5D,cAAM,eAAc,WAAM,KAAK,YAAX,mBAAoB,KAAK,CAAC6H,OAAWA,GAAE,SAAS;AACpE,cAAM,gBAA4B,2CAAa,UAAS,CAAA,GAAI,OAAO,CAAC,SAAoB,KAAK,WAAW,IAAI;AAG5G,cAAM,cAAc,MAAM,MAAM,UAAU,YAAY,WAAW;AAGjE,YAAI,aAAa;AACf,sBAAY,QAAQ;AACpB,uBAAa,QAAQ;AAAA,QACvB;AAGA,cAAM,SAAS,QAAQ;AAAA,MACzB,SAAS,OAAO;AACd,gBAAQ,MAAM,wDAAwD,KAAK;AAC3E,cAAM,+BAAgC,MAAgB,OAAO;AAAA,MAC/D;AAAA,IACF;AAGA,UAAM,wBAAwB,YAAY;;AACxC,UAAI;AAEF,cAAM,eAAc,MAAA7H,MAAA,MAAM,MAAa,kBAAnB,wBAAAA,SAAwC;AAG5D,cAAM,eAAc,WAAM,KAAK,YAAX,mBAAoB,KAAK,CAAC6H,OAAWA,GAAE,SAAS;AACpE,cAAM,gBAA4B,2CAAa,UAAS,CAAA,GAAI,OAAO,CAAC,SAAoB,KAAK,WAAW,IAAI;AAG5G,cAAM,cAAc,MAAM,MAAM,UAAU,YAAY,WAAW;AAGjE,YAAI,aAAa;AACf,sBAAY,QAAQ;AACpB,uBAAa,QAAQ;AAAA,QACvB;AAGA,cAAM,SAAS,QAAQ;AAAA,MACzB,SAAS,OAAO;AACd,gBAAQ,MAAM,yDAAyD,KAAK;AAC5E,cAAM,+BAAgC,MAAgB,OAAO;AAAA,MAC/D;AAAA,IACF;AAGA,UAAM,kBAAkB,MAAM;;AAC5B,YAAM,gBAAgB,MAAM,YAAA;AAC5B,UAAI,eAAe;AAEjB,cAAM,eAAc7H,MAAA,MAAM,KAAK,YAAX,gBAAAA,IAAoB,KAAK,CAAC6H,OAAWA,GAAE,SAAS;AACpE,YAAI,aAAa;AACf,sBAAY,QAAQ;AACpB,uBAAa,QAAQ;AAAA,QACvB;AAGA,cAAM,SAAS,QAAQ;AAAA,MACzB;AAAA,IACF;AAMA,UAAM,UAAU,CAAC,UAAsB;AAGrC,YAAM,SAAS,MAAM;AACrB,UAAI,iCAAQ,QAAQ,gCAAgC;AAGlD,cAAM,gBAAA;AACN;AAAA,MACF;AAGA,YAAM/G,OAAO,OAAe;AAC5B,UAAI,CAACA,QAAO,CAACA,KAAI,UAAU,OAAOA,KAAI,OAAO,sBAAsB,YAAY;AAC7E;AAAA,MACF;AAEA,YAAM,SAAS,MAAM;AACrB,YAAM,SAAS,MAAM;AACrB,YAAM,eAAe,KAAK,IAAI,MAAM,IAAI,KAAK,IAAI,MAAM;AAGvD,UAAI,MAAM,SAAS;AACjB,cAAM,eAAA;AACN,cAAM,gBAAA;AACN,QAAAA,KAAI,OAAO,kBAAkB,KAAK;AAClC;AAAA,MACF;AAGA,UAAI,cAAc;AAChB,cAAM,eAAA;AACN,cAAM,gBAAA;AACN,QAAAA,KAAI,OAAO,kBAAkB,KAAK;AAClC;AAAA,MACF;AAGA,YAAM,eAAA;AACN,YAAM,gBAAA;AACN,MAAAA,KAAI,OAAO,kBAAkB,KAAK;AAAA,IACpC;AAGA,UAAM,MAAA;;AAAM,oBAAAd,MAAA,MAAM,KAAK,YAAX,gBAAAA,IAAoB,KAAK,CAAC6H,OAAWA,GAAE,SAAS,aAAhD,mBAA0D;AAAA,OAAO,CAAC,WAAW;AAEvF,UAAI,UAAU,OAAO;AACnB,YAAI,UAAU,MAAM,QAAQ,MAAM,GAAG;AACnC,uBAAa,QAAQ;AAAA,QACvB;AAAA,MACF;AAAA,IACF,GAAG,EAAE,WAAW,MAAM,MAAM,MAAM;AAGlC,cAAU,YAAY;;AAGpB,YAAM,eAAc7H,MAAA,MAAM,KAAK,YAAX,gBAAAA,IAAoB,KAAK,CAAC6H,OAAWA,GAAE,SAAS;AACpE,UAAI,aAAa;AACf,cAAM,qBAAqB,YAAY;AACvC,YAAI,sBAAsB,MAAM,QAAQ,kBAAkB,KAAK,mBAAmB,SAAS,GAAG;AAC5F,uBAAa,QAAQ;AAAA,QACvB;AAAA,MACF;AAGA,gBAAU,QAAQ;AAIlB,YAAM,OAAO,WAAW,CAAC9H,OAAwB;AAC/C,YAAIA,IAAG;AACL,gBAAM,kBAAkBA,EAAC;AAAA,QAC3B;AAAA,MACF;AAGA,UAAI,MAAM,OAAO,OAAO;AACtB,cAAM,kBAAkB,MAAM,OAAO,KAAK;AAAA,MAC5C;AAIE,YAAM,OAAe,eAAe,MAAM;AAE1C,YAAI,MAAM,SAAS,UAAU,UAAU;AACrC,cAAK,MAAM,OAAe,YAAY,GAAG;AAEvC,kBAAM,gBAAA;AAAA,UACR,OAAO;AAGL,kBAAM,mBAAA;AACJ,kBAAM,OAAe,YAAY,IAAI;AAAA,UACzC;AAGA,gBAAM,OAAO,QAAQ,MAAM,YAAA;AAAA,QAC7B;AAAA,MACF;AAGA,YAAM,sBAAsB,WAAM,KAAa,eAAnB,mBAA+B,KAAK,MAAM;AAEpE,YAAM,KAAa,aAAa,SAAS,QAAa;AACtD,gBAAQ,IAAI,qDAAqD,MAAM;AAEvE,cAAM,gBAAkC,CAAA;AAExC,aAAI,iCAAQ,eAAc,QAAW;AACnC,wBAAc,WAAW,OAAO;AAChC,kBAAQ,IAAI,mDAAmD,OAAO,YAAY,OAAO,UAAU,SAAS,CAAC,QAAQ;AAAA,QACvH;AAEA,aAAI,iCAAQ,UAAS,MAAM,QAAQ,OAAO,KAAK,GAAG;AAChD,wBAAc,QAAQ,OAAO;AAC7B,kBAAQ,IAAI,0DAA0D,OAAO,KAAK;AAAA,QACpF;AAEA,YAAI,cAAc,aAAa,UAAa,cAAc,UAAU,QAAW;AAC7E,4BAAkB,KAAK,aAAa;AAAA,QACtC;AAGA,YAAI,oBAAoB;AACtB,iBAAO,mBAAmB,MAAM;AAAA,QAClC;AAAA,MACF;AAEA,UAAI,MAAM,KAAK;AACb,cAAM,0BAA0B,MAAM;;AACpC,cAAI,kBAAkB,WAAW,GAAG;AAClC;AAAA,UACF;AAEA,gBAAM,UAAU,kBAAkB,MAAA;AAElC,cAAI,QAAQ,aAAa,QAAW;AAClC,kBAAM,SAAS,QAAQ,QAAQ;AAAA,UACjC;AAEA,cAAI,QAAQ,UAAU,QAAW;AAC/B,kBAAM+H,gBAAc9H,MAAA,MAAM,KAAK,YAAX,gBAAAA,IAAoB,KAAK,CAAC6H,OAAWA,GAAE,SAAS;AACpE,gBAAIC,cAAa;AACfA,2BAAY,QAAQ,QAAQ;AAAA,YAC9B;AACA,yBAAa,QAAQ,QAAQ;AAAA,UAC/B;AAAA,QACF;AAEA,cAAM,IAAI,iBAAiB,qBAAqB,uBAAuB;AACvE,cAAM,IAAI,iBAAiB,mBAAmB,uBAAuB;AACrE,cAAM,IAAI,iBAAiB,yBAAyB,uBAAuB;AAE3E,cAAM,aAAa,MAAM;AACvB,gBAAM,IAAI,oBAAoB,qBAAqB,uBAAuB;AAC1E,gBAAM,IAAI,oBAAoB,mBAAmB,uBAAuB;AACxE,gBAAM,IAAI,oBAAoB,yBAAyB,uBAAuB;AAAA,QAChF;AAEA,cAAM,kBAAmB,MAAM,OAAe;AAC5C,cAAM,OAAe,kBAAkB,MAAM;AAC7C;AACA,qBAAA;AAAA,QACF;AAAA,MACF;AAAA,IACF,CAAC;;0BA7UCvC,mBAqCM,OAAA;AAAA,QArCD,OAAM;AAAA,QAA0B;AAAA,MAAA;QACnCQ,YAmCE,4BAAA;AAAA,UAlCC,cAAYuB,MAAA,KAAA,EAAM,UAAU;AAAA,UAC5B,eAAaA,MAAA,KAAA,EAAM,WAAW;AAAA,UAC9B,aAAWA,MAAA,KAAA,EAAM,SAAS;AAAA,UAC1B,aAAWA,MAAA,KAAA,EAAM,SAAS;AAAA,UAC1B,sBAAoBA,MAAA,KAAA,EAAM,iBAAiB;AAAA,UAC3C,sBAAoBA,MAAA,KAAA,EAAM,iBAAiB;AAAA,UAC3C,yBAAuBA,MAAA,KAAA,EAAM,mBAAmB;AAAA,UAChD,qBAAmBA,MAAA,KAAA,EAAM,gBAAgB;AAAA,UACzC,qBAAmBA,MAAA,KAAA,EAAM,gBAAgB;AAAA,UACzC,aAAWA,MAAA,KAAA,EAAM,SAAS;AAAA,UAC1B,cAAYA,MAAA,KAAA,EAAM,UAAU;AAAA,UAC5B,6BAA2BA,MAAA,KAAA,EAAM,uBAAuB;AAAA,UACxD,aAAWA,MAAA,KAAA,EAAM,SAAS;AAAA,UAC1B,iBAAe,aAAA;AAAA,UACf,kBAAgB,aAAA;AAAA,UAChB,4BAA0BA,MAAA,KAAA,EAAM,uBAAuB;AAAA,UACvD,kCAAgCA,MAAA,KAAA,EAAM,4BAA4B;AAAA,UAClE,kCAAgCA,MAAA,KAAA,EAAM,4BAA4B;AAAA,UAClE,4DAAmBA,MAAA,KAAA,EAAM,UAAU,QAAQ;AAAA,UAC3C,6DAAoBA,MAAA,KAAA,EAAM,WAAW,QAAQ;AAAA,UAC7C,2DAAkBA,MAAA,KAAA,EAAM,SAAS,QAAQ;AAAA,UACzC,2DAAkBA,MAAA,KAAA,EAAM,SAAS,QAAQ;AAAA,UACzC,mEAA2BA,MAAA,KAAA,EAAM,iBAAiB,QAAQ;AAAA,UAC1D,mEAA2BA,MAAA,KAAA,EAAM,iBAAiB,QAAQ;AAAA,UAC1D,qEAA8BA,MAAA,KAAA,EAAM,mBAAmB,QAAQ;AAAA,UAC/D,kEAA0BA,MAAA,KAAA,EAAM,gBAAgB,QAAQ;AAAA,UACxD,kEAA0BA,MAAA,KAAA,EAAM,gBAAgB,QAAQ;AAAA,UACxD,2DAAkBA,MAAA,KAAA,EAAM,SAAS,QAAQ;AAAA,UACzC,2EAAiCA,MAAA,KAAA,EAAM,uBAAuB,QAAQ;AAAA,UACtE,gFAAuCA,MAAA,KAAA,EAAM,4BAA4B,QAAQ;AAAA,UACjF,gFAAuCA,MAAA,KAAA,EAAM,4BAA4B,QAAQ;AAAA,UACjF,iBAAgB;AAAA,UAChB,mBAAkB;AAAA,UAClB,aAAY;AAAA,QAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AC4LnB,UAAM,QAAQ;AAqBd,UAAMtG,QAAO;AAeb,UAAM,YAAY,IAAY,EAAE;AAChC,UAAM,aAAa,IAAY,EAAE;AAEjC,UAAM,qBAAqB,MAAM;AAC/B,UAAI,MAAM,iBAAiB;AACzB;AAAA,MACF;AACA,MAAAA,MAAK,oBAAoB;AAAA,IAC3B;AAEA,UAAM,eAAe,CAAC,UAAiB;AACrC,YAAM,QAAQ,MAAM;AACpB,gBAAU,QAAQ,MAAM;AAAA,IAC1B;AAEA,UAAM,cAAc,CAAC,UAAiB;AACpC,YAAM,QAAQ,MAAM;AACpB,YAAM,QAAQ,SAAS,MAAM,OAAO,EAAE;AAEtC,UAAI,CAAC,MAAM,KAAK,GAAG;AACjB,cAAM,eAAe,KAAK,IAAI,GAAG,KAAK,IAAI,OAAO,MAAM,cAAc,CAAC,CAAC;AACvE,QAAAA,MAAK,uBAAuB,YAAY;AACxC,cAAM,QAAQ,aAAa,SAAA;AAAA,MAC7B,OAAO;AACL,cAAM,QAAQ,MAAM,aAAa,SAAA;AAAA,MACnC;AACA,gBAAU,QAAQ;AAAA,IACpB;AAEA,UAAM,gBAAgB,CAAC,UAAiB;AACtC,YAAM,QAAQ,MAAM;AACpB,iBAAW,QAAQ,MAAM;AAAA,IAC3B;AAEA,UAAM,eAAe,CAAC,UAAiB;AACrC,YAAM,QAAQ,MAAM;AACpB,YAAM,QAAQ,SAAS,MAAM,OAAO,EAAE;AAEtC,UAAI,CAAC,MAAM,KAAK,GAAG;AACjB,cAAM,eAAe,KAAK,IAAI,GAAG,KAAK,IAAI,OAAO,EAAE,CAAC;AACpD,QAAAA,MAAK,sBAAsB,YAAY;AACvC,cAAM,QAAQ,aAAa,SAAA;AAAA,MAC7B,OAAO;AACL,cAAM,QAAQ,MAAM,YAAY,SAAA;AAAA,MAClC;AACA,iBAAW,QAAQ;AAAA,IACrB;;AAjTE,aAAA4E,UAAA,GAAAL,mBAwNM,OAxNNG,cAwNM;AAAA,oCAvNJD,gBAEM,OAAA,EAFD,OAAM,qBAAiB;AAAA,UAC1BA,gBAA+C,MAAA,EAA3C,OAAM,iBAAA,GAAiB,iBAAe;AAAA,QAAA;QAI5CA,gBAmCM,OAnCNI,cAmCM;AAAA,UAlCJJ,gBAiCM,OAAA;AAAA,YAjCD,OAAKD,eAAA,CAAC,oBAAkB,EAAA,WAAsB,QAAA,qBAAmB,CAAA;AAAA,UAAA;YACpEC,gBAcM,OAAA;AAAA,cAbJ,OAAKD,eAAA,CAAC,iBAAe,EAAA,UACD,QAAA,gBAAA,CAAe,CAAA;AAAA,cAClC,SAAO;AAAA,YAAA;cAERC,gBAA4F,QAA5FO,cAA4FL,gBAA5D,QAAA,sBAAmB,gBAAA,YAAA,GAAA,CAAA;AAAA,cACnDF,gBAOO,QAAA;AAAA,gBAPD,OAAKD,eAAA,CAAC,2BAAyB,EAAA,UACX,QAAA,4BAA4B,QAAA,SAAA,CAAQ,CAAA;AAAA,gBACvD,OAAO,QAAA;AAAA,cAAA;gBACTuC,gBAAApC,gBAAA,QAAA,6BAA4B,KAC/B,CAAA;AAAA,4CAAAF,gBAEM,OAAA;AAAA,kBAFD,OAAM;AAAA,kBAAgB,SAAQ;AAAA,kBAAY,MAAK;AAAA,gBAAA;kBAClDA,gBAA0B,QAAA,EAApB,GAAE,kBAAgB;AAAA,gBAAA;;;YAI9BA,gBAgBM,OAhBNS,cAgBM;AAAA,cAfJT,gBAAsD,QAAtDa,cAAsDX,gBAAtB,QAAA,YAAY,GAAA,CAAA;AAAA,cAC5C,OAAA,EAAA,MAAA,OAAA,EAAA,IAAAF,gBAAyC,QAAA,EAAnC,OAAM,qBAAA,GAAqB,KAAC,EAAA;AAAA,cAClCA,gBAAoD,QAApDc,cAAoDZ,gBAApB,QAAA,UAAU,GAAA,CAAA;AAAA,cAG/B,QAAA,cAAW,KAAtBC,aAAAL,mBASM,OATNiB,cASM;AAAA,gBARJf,gBAMM,OANNgB,cAMM;AAAA,kBALJhB,gBAIO,OAAA;AAAA,oBAHL,OAAKD,eAAA,CAAC,wBAAsB,EAAA,eAEH,QAAA,cAAc,QAAA,YAAA,CAAW,CAAA;AAAA,oBADjD,OAAKgC,eAAA,EAAA,OAAA,GAAe,QAAA,aAAa,QAAA,cAAW,GAAA,IAAA,CAAA;AAAA,kBAAA;;gBAIjD/B,gBAA4E,QAA5EiB,eAA4Ef,gBAAtC,kBAAU,IAAG,sBAAI,QAAA,WAAW,GAAA,CAAA;AAAA,cAAA;;;;QAO1EF,gBAuEM,OAvENkB,eAuEM;AAAA,UAtEJlB,gBAqEM,OArENmB,eAqEM;AAAA,YAnEJnB,gBAkBM,OAlBNgC,eAkBM;AAAA,cAjBJ,OAAA,EAAA,MAAA,OAAA,EAAA,IAAAhC,gBAAyD,SAAA,EAAlD,OAAM,sBAAA,GAAsB,kBAAc,EAAA;AAAA,cACjDA,gBAeM,OAfNoB,eAeM;AAAA,gBAdJpB,gBAYE,SAAA;AAAA,kBAXA,MAAK;AAAA,kBACL,OAAM;AAAA,kBACL,KAAK;AAAA,kBACL,KAAK,QAAA,cAAU;AAAA,kBACf,OAAO,QAAA;AAAA,kBACP,UAAU,QAAA,eAAU;AAAA,kBACpB,SAAO;AAAA,kBACP,QAAM;AAAA,kBACN,uDAAD,MAAA;AAAA,kBAAA,GAAiB,CAAA,MAAA,CAAA;AAAA,kBAChB,uDAAD,MAAA;AAAA,kBAAA,GAAiB,CAAA,MAAA,CAAA;AAAA,kBAChB,qDAAD,MAAA;AAAA,kBAAA,GAAe,CAAA,MAAA,CAAA;AAAA,gBAAA;gBAEjBA,gBAAuD,QAAvDiC,eAAyB,uBAAK,QAAA,cAAU,CAAA,GAAA,CAAA;AAAA,cAAA;;YAK5CjC,gBAkBM,OAlBNkC,eAkBM;AAAA,cAjBJ,OAAA,EAAA,MAAA,OAAA,EAAA,IAAAlC,gBAAiD,SAAA,EAA1C,OAAM,sBAAA,GAAsB,UAAM,EAAA;AAAA,cACzCA,gBAeM,OAfN,aAeM;AAAA,gBAdJA,gBAYE,SAAA;AAAA,kBAXA,MAAK;AAAA,kBACL,OAAM;AAAA,kBACN,KAAI;AAAA,kBACJ,KAAI;AAAA,kBACH,OAAO,QAAA;AAAA,kBACP,SAAO;AAAA,kBACP,QAAM;AAAA,kBACN,uDAAD,MAAA;AAAA,kBAAA,GAAiB,CAAA,MAAA,CAAA;AAAA,kBAChB,uDAAD,MAAA;AAAA,kBAAA,GAAiB,CAAA,MAAA,CAAA;AAAA,kBAChB,qDAAD,MAAA;AAAA,kBAAA,GAAe,CAAA,MAAA,CAAA;AAAA,kBACf,OAAM;AAAA,gBAAA;gBAER,OAAA,EAAA,MAAA,OAAA,EAAA,IAAAA,gBAAoC,QAAA,EAA9B,OAAM,mBAAgB,KAAC,EAAA;AAAA,cAAA;;YAKjCA,gBAwBM,OAxBN,aAwBM;AAAA,cAvBJA,gBAaS,UAAA;AAAA,gBAZP,OAAKD,eAAA,CAAC,eAAa,EAAA,QACD,QAAA,SAAA,CAAQ,CAAA;AAAA,gBACzB,UAAU,QAAA;AAAA,gBACV,+CAAOM,KAAAA,MAAK,cAAA;AAAA,gBACZ,OAAO,QAAA,kBAAe,0CAA8C,QAAA,WAAQ,uBAAA;AAAA,cAAA;gBAElE,QAAA,YAAXF,aAAAL,mBAEM,OAFN,aAEM,CAAA,GAAA,OAAA,EAAA,MAAA,OAAA,EAAA,IAAA;AAAA,kBADJE,gBAAyB,QAAA,EAAnB,GAAE,gBAAA,GAAe,MAAA,EAAA;AAAA,gBAAA,SAEzBG,aAAAL,mBAEM,OAFN,aAEM,CAAA,GAAA,OAAA,EAAA,MAAA,OAAA,EAAA,IAAA;AAAA,kBADJE,gBAAqC,QAAA,EAA/B,GAAE,4BAAA,GAA2B,MAAA,EAAA;AAAA,gBAAA;;cAGvCA,gBAQS,UAAA;AAAA,gBAPP,OAAM;AAAA,gBACL,+CAAOK,KAAAA,MAAK,aAAA;AAAA,gBACb,OAAM;AAAA,cAAA;gBAENL,gBAEM,OAAA;AAAA,kBAFD,SAAQ;AAAA,kBAAY,MAAK;AAAA,kBAAe,OAAM;AAAA,gBAAA;kBACjDA,gBAAiH,QAAA,EAA3G,GAAE,yGAAuG;AAAA,gBAAA;;;;;QAQzHA,gBAYM,OAZN,aAYM;AAAA,UAXJ,OAAA,EAAA,MAAA,OAAA,EAAA,IAAAA,gBAAmD,SAAA,EAA5C,OAAM,gBAAA,GAAgB,kBAAc,EAAA;AAAA,UAC3CA,gBASM,OATN,aASM;AAAA,YARJM,YAOE,cAAA;AAAA,cANC,KAAK;AAAA,cACL,KAAK;AAAA,cACL,OAAO,QAAA;AAAA,cACP,MAAM;AAAA,cACN,iBAAe,EAAA,KAAA,KAAA,KAAA,IAAA;AAAA,cACf,kBAAY,OAAA,CAAA,MAAA,OAAA,CAAA,IAAA,CAAA,WAAED,KAAAA,MAAK,wBAAyB,MAAM;AAAA,YAAA;;;QAMzDL,gBA6BM,OA7BN,aA6BM;AAAA,UA5BJA,gBAgBM,OAhBN,aAgBM;AAAA,YAfJ,OAAA,EAAA,MAAA,OAAA,EAAA,IAAAA,gBAEQ,SAAA,EAFD,OAAM,gBAAA,GAAgB,2BAE7B,EAAA;AAAA,YACAA,gBAWS,UAAA;AAAA,cAVP,MAAK;AAAA,cACL,OAAKD,eAAA,CAAC,iBAAe,EAAA,yBACc,QAAA,kBAAA,CAAiB,CAAA;AAAA,cACnD,SAAK,OAAA,CAAA,MAAA,OAAA,CAAA,IAAA,CAAA,WAAEM,KAAAA,MAAK,4BAAA,CAA8B,QAAA,iBAAiB;AAAA,cAC5D,MAAK;AAAA,cACJ,gBAAc,QAAA;AAAA,cACf,OAAM;AAAA,YAAA;cAENL,gBAA0C,QAAA,EAApC,OAAM,uBAAA,GAAsB,MAAA,EAAA;AAAA,cAClCA,gBAA0C,QAAA,EAApC,OAAM,uBAAA,GAAsB,MAAA,EAAA;AAAA,YAAA;;UAGtCA,gBAUM,OAAA;AAAA,YAVD,OAAKD,eAAA,CAAC,oBAAkB,EAAA,8BAAA,CAA0C,QAAA,mBAAiB,CAAA;AAAA,UAAA;YACtFO,YAQE,cAAA;AAAA,cAPC,KAAK;AAAA,cACL,KAAK;AAAA,cACL,OAAO,QAAA;AAAA,cACP,MAAM;AAAA,cACN,iBAAe,EAAA,KAAA,KAAA,KAAA,EAAA;AAAA,cACf,WAAW,QAAA;AAAA,cACX,kBAAY,OAAA,EAAA,MAAA,OAAA,EAAA,IAAA,CAAA,WAAED,KAAAA,MAAK,8BAA+B,MAAM;AAAA,YAAA;;;QAM/DL,gBA6BM,OA7BN,aA6BM;AAAA,UA5BJA,gBAgBM,OAhBN,aAgBM;AAAA,YAfJA,gBAEQ,SAFR,aAA6B,sCACR,QAAA,qBAAkB,iBAAA,oBAAA,GAAA,CAAA;AAAA,YAEvCA,gBAWS,UAAA;AAAA,cAVP,MAAK;AAAA,cACL,OAAKD,eAAA,CAAC,iBAAe,EAAA,yBACc,QAAA,mBAAA,CAAkB,CAAA;AAAA,cACpD,SAAK,OAAA,EAAA,MAAA,OAAA,EAAA,IAAA,CAAA,WAAEM,KAAAA,MAAK,6BAAA,CAA+B,QAAA,kBAAkB;AAAA,cAC9D,MAAK;AAAA,cACJ,gBAAc,QAAA;AAAA,cACf,OAAM;AAAA,YAAA;cAENL,gBAA0C,QAAA,EAApC,OAAM,uBAAA,GAAsB,MAAA,EAAA;AAAA,cAClCA,gBAA0C,QAAA,EAApC,OAAM,uBAAA,GAAsB,MAAA,EAAA;AAAA,YAAA;;UAGtCA,gBAUM,OAAA;AAAA,YAVD,OAAKD,eAAA,CAAC,oBAAkB,EAAA,8BAAyC,QAAA,wBAAsB,CAAA;AAAA,UAAA;YAC1FO,YAQE,cAAA;AAAA,cAPC,KAAK;AAAA,cACL,KAAK;AAAA,cACL,OAAO,QAAA;AAAA,cACP,MAAM;AAAA,cACN,iBAAe,EAAA,KAAA,KAAA,KAAA,IAAA;AAAA,cACf,UAAU,QAAA;AAAA,cACV,kBAAY,OAAA,EAAA,MAAA,OAAA,EAAA,IAAA,CAAA,WAAED,KAAAA,MAAK,uBAAwB,MAAM;AAAA,YAAA;;;QAMxDL,gBAkBM,OAlBN,aAkBM;AAAA,UAjBJA,gBAgBM,OAhBN,aAgBM;AAAA,YAfJ,OAAA,EAAA,MAAA,OAAA,EAAA,IAAAA,gBAEQ,SAAA,EAFD,OAAM,gBAAA,GAAgB,wBAE7B,EAAA;AAAA,YACAA,gBAWS,UAAA;AAAA,cAVP,MAAK;AAAA,cACL,OAAKD,eAAA,CAAC,iBAAe,EAAA,yBACc,QAAA,cAAA,CAAa,CAAA;AAAA,cAC/C,SAAK,OAAA,EAAA,MAAA,OAAA,EAAA,IAAA,CAAA,WAAEM,KAAAA,MAAK,wBAAA,CAA0B,QAAA,aAAa;AAAA,cACpD,MAAK;AAAA,cACJ,gBAAc,QAAA;AAAA,cACf,OAAM;AAAA,YAAA;cAENL,gBAA0C,QAAA,EAApC,OAAM,uBAAA,GAAsB,MAAA,EAAA;AAAA,cAClCA,gBAA0C,QAAA,EAApC,OAAM,uBAAA,GAAsB,MAAA,EAAA;AAAA,YAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AClJ5C,UAAM,QAAQ;AAOd,UAAMzE,QAAO;AAKb,UAAM,cAAc,IAAI,EAAE;AAC1B,UAAM,iBAAiB,IAA6B,IAAI;AAGxD,QAAI,iBAAsB;AAE1B,UAAM,eAAe,SAAS,MAAM;AAClC,YAAM,YAAY,MAAM,SAAS;AACjC,YAAM,QAAQ,MAAM,gBAAgB,YAAY,IAAI;AACpD,YAAM,WAAW,aAAa,MAAM;AACpC,UAAI,aAAa,OAAO;AACtB,eAAO,UAAU,KAAK,QAAQ,UAAU,IAAI,MAAM,EAAE;AAAA,MACtD;AACA,aAAO,WAAW,QAAQ,OAAO,KAAK,QAAQ,UAAU,IAAI,MAAM,EAAE;AAAA,IACtE,CAAC;AAED,UAAM,eAAe,SAAyB,MAAM;AAClD,YAAM,OAAuB,MAAM,SAAS,IAAI,CAAC,MAAM,SAAS;AAAA,QAC9D,OAAO,MAAM;AAAA,QACb;AAAA,MAAA,EACA;AAGF,UAAI,MAAM,eAAe;AACvB,aAAK,KAAK;AAAA,UACR,OAAO,KAAK,SAAS;AAAA,UACrB,MAAM,EAAE,WAAW,UAAA;AAAA,QAAU,CAC9B;AAAA,MACH;AAEA,UAAI,CAAC,YAAY,MAAM,QAAQ;AAC7B,eAAO;AAAA,MACT;AAEA,YAAM,QAAQ,YAAY,MAAM,YAAA;AAChC,aAAO,KAAK;AAAA,QAAO,UACjB,KAAK,KAAK,UAAU,YAAA,EAAc,SAAS,KAAK;AAAA,MAAA;AAAA,IAEpD,CAAC;AAED,UAAM,cAAc,MAAM;;AACxB,kBAAY,QAAQ;AACpB,OAAAhB,MAAA,eAAe,UAAf,gBAAAA,IAAsB;AAAA,IACxB;AAEA,UAAM,aAAa,CAAC,UAAkB;AACpC,MAAAgB,MAAK,UAAU,KAAK;AACpB,MAAAA,MAAK,OAAO;AAAA,IACd;AAKA,UAAM,2BAA2B,OAAO,cAAsB;AAC5D,YAAM,WAAW,MAAM;AAAA,QACrB,SAAS,kCAAkC,mBAAmB,SAAS,CAAC,qBAAqB;AAAA,MAAA;AAE/F,UAAI,CAAC,SAAS,IAAI;AAChB,cAAM,IAAI,MAAM,6BAA6B;AAAA,MAC/C;AACA,YAAM,OAAO,MAAM,SAAS,KAAA;AAC5B,UAAI,CAAC,KAAK,WAAW,CAAC,KAAK,aAAa;AACtC,cAAM,IAAI,MAAM,sBAAsB;AAAA,MACxC;AACA,aAAO;AAAA,QACL,YAAY,KAAK;AAAA,QACjB,aAAa,KAAK,gBAAgB;AAAA,QAClC,cAAc,KAAK;AAAA,MAAA;AAAA,IAEvB;AAGA,UAAM,oBAAoB,YAAY;AACpC,UAAI,CAAC,gBAAgB;AACnB,cAAM,EAAE,eAAA,IAAmB,MAAM;AAAA;AAAA,UAA0B,GAAG,uBAAuB;AAAA;AACrF,yBAAiB,IAAI,eAAe;AAAA,UAClC,WAAW;AAAA,UACX,sBAAsB,CAAC,SAAiB;AAAA,UACxC,oBAAoB;AAAA,QAAA,CACrB;AAAA,MACH;AACA,aAAO;AAAA,IACT;AAEA,UAAM,cAAc,OAAO,UAAkB,UAAsB;AACjE,YAAM,UAAU,MAAM,kBAAA;AACtB,YAAM,OAAQ,MAAM,OAAuB,sBAAA;AAE3C,cAAQ,KAAK,UAAU,KAAK,QAAQ,IAAI,KAAK,MAAM,KAAK,SAAS,CAAC;AAAA,IACpE;AAEA,UAAM,cAAc,YAAY;AAC9B,UAAI,gBAAgB;AAClB,uBAAe,KAAA;AAAA,MACjB;AAAA,IACF;AAGA,UAAM,MAAM,MAAM,SAAS,CAAC,cAAc;AACxC,UAAI,WAAW;AACb,oBAAY,QAAQ;AACpB,iBAAS,MAAM;;AACb,WAAAhB,MAAA,eAAe,UAAf,gBAAAA,IAAsB;AAAA,QACxB,CAAC;AAAA,MACH,OAAO;AAEL,oBAAA;AAAA,MACF;AAAA,IACF,CAAC;AAGD,gBAAY,MAAM;AAChB,UAAI,gBAAgB;AAClB,uBAAe,QAAA;AACf,yBAAiB;AAAA,MACnB;AAAA,IACF,CAAC;;0BAlMCqG,YAoDe,cAAA;AAAA,QAnDZ,SAAS,QAAA;AAAA,QACV,OAAM;AAAA,QACL,UAAU,aAAA;AAAA,QACV,+CAAOP,KAAAA,MAAK,OAAA;AAAA,MAAA;QAEF,gBACT,MAqBM;AAAA,UArBNL,gBAqBM,OArBNC,cAqBM;AAAA,sCApBJD,gBAEM,OAAA;AAAA,cAFD,OAAM;AAAA,cAAc,SAAQ;AAAA,cAAY,MAAK;AAAA,YAAA;cAChDA,gBAAqM,QAAA,EAA/L,GAAE,6LAA2L;AAAA,YAAA;2BAErMA,gBAME,SAAA;AAAA,uBALI;AAAA,cAAJ,KAAI;AAAA,2EACK,YAAW,QAAA;AAAA,cACpB,MAAK;AAAA,cACL,OAAM;AAAA,cACN,aAAY;AAAA,YAAA;2BAHH,YAAA,KAAW;AAAA,YAAA;YAMd,YAAA,sBADRF,mBASS,UAAA;AAAA;cAPP,MAAK;AAAA,cACL,OAAM;AAAA,cACL,SAAO;AAAA,YAAA;cAERE,gBAEM,OAAA;AAAA,gBAFD,SAAQ;AAAA,gBAAY,MAAK;AAAA,cAAA;gBAC5BA,gBAA2M,QAAA,EAArM,GAAE,mMAAiM;AAAA,cAAA;;;;yBAMjN,MAoBM;AAAA,UApBNA,gBAoBM,OApBNI,cAoBM;AAAA,8BAnBJN,mBAeMY,UAAA,MAAAC,WAdW,aAAA,OAAY,CAApB,SAAI;kCADbb,mBAeM,OAAA;AAAA,gBAbH,KAAK,KAAK;AAAA,gBACX,uBAAM,aAAW;AAAA,0BACY,QAAA,iBAAiB,KAAK;AAAA,kCAAiC,KAAK,KAAK,cAAS;AAAA,gBAAA;gBAItG,cAAU,CAAA,WAAE,YAAY,KAAK,KAAK,WAAW,MAAM;AAAA,gBACnD,cAAY;AAAA,gBACZ,SAAK,CAAA,WAAE,WAAW,KAAK,KAAK;AAAA,cAAA;gBAE7BE,gBAAgD,QAAhDQ,cAAgDN,gBAApB,KAAK,KAAK,GAAA,CAAA;AAAA,gBACtCF,gBAAqF,QAAA;AAAA,kBAA/E,OAAM;AAAA,kBAAa,OAAO,KAAK,KAAK;AAAA,gBAAA,mBAAc,KAAK,KAAK,SAAS,GAAA,GAAAS,YAAA;AAAA,gBAC/D,QAAA,iBAAiB,KAAK,sBAAlCX,mBAA6E,QAA7Ee,cAA+D,SAAO;;;YAE7D,aAAA,MAAa,WAAM,kBAA9Bf,mBAEM,OAFNgB,cAAyD,kBAEzD;;;;;;;;;ACzCC,SAAS,mBAAmB,QAAuC;AAGxE,MAAI,cAAc;AAGlB,QAAM,eAAe,IAAI,CAAC;AAC1B,QAAM,aAAa,IAAI,CAAC;AACxB,QAAM,iBAAiB,IAAI,EAAE;AAC7B,QAAM,gBAAgB,IAAI,CAAG;AAC7B,QAAM,eAAe,IAAI,CAAG;AAC5B,QAAM,qBAAqB,IAAI,KAAK;AACpC,QAAM,oBAAoB,IAAI,KAAK;AACnC,QAAM,sBAAsB,IAAI,CAAG;AACnC,QAAM,SAAS,IAA+B,UAAU;AACxD,QAAM,kBAAkB,IAAI,EAAE;AAC9B,QAAM,sBAAsB,IAAI,EAAE;AAClC,QAAM,YAAY,IAAI,KAAK;AAK3B,QAAM,iBAAiB,IAAmB,IAAI;AAC9C,QAAM,YAAY,IAAmB,IAAI;AAGzC,QAAM,cAAc,IAAI,CAAC;AACzB,QAAM,aAAa,IAAI,CAAC;AACxB,QAAM,oBAAoB,IAAI,CAAC;AAC/B,QAAM,WAAW,IAAI,KAAK;AAC1B,QAAM,gBAAgB,IAAI,KAAK;AAG/B,QAAM,sBAAsB,IAAI,KAAK;AACrC,QAAM,sBAAsB,IAAI,CAAC;AAGjC,QAAM,cAAc,MAAoB;AAEtC,QAAI,aAAa;AACf,aAAO;AAAA,QACL,eAAe,aAAa;AAAA,QAC5B,aAAa,WAAW;AAAA,QACxB,kBAAkB,eAAe;AAAA,QACjC,gBAAgB,cAAc;AAAA,QAC9B,eAAe,aAAa;AAAA,QAC5B,wBAAwB,CAAC,mBAAmB;AAAA,QAC5C,qBAAqB,kBAAkB;AAAA,QACvC,uBAAuB,oBAAoB;AAAA,QAC3C,SAAS,OAAO;AAAA,QAChB,mBAAmB,gBAAgB;AAAA,QACnC,uBAAuB,oBAAoB;AAAA,QAC3C,iBAAiB,eAAe;AAAA,QAChC,YAAY,UAAU;AAAA,QACtB,cAAc,YAAY;AAAA,QAC1B,aAAa,WAAW;AAAA,QACxB,WAAW,SAAS;AAAA,QACpB,iBAAiB,cAAc;AAAA,MAAA;AAAA,IAEnC;AACA,WAAO;AAAA,MACL,eAAe,aAAa;AAAA,MAC5B,aAAa,WAAW;AAAA,MACxB,kBAAkB,eAAe;AAAA,MACjC,gBAAgB,cAAc;AAAA,MAC9B,eAAe,aAAa;AAAA,MAC5B,wBAAwB,CAAC,mBAAmB;AAAA,MAC5C,qBAAqB,kBAAkB;AAAA,MACvC,uBAAuB,oBAAoB;AAAA,MAC3C,SAAS,OAAO;AAAA,MAChB,mBAAmB,gBAAgB;AAAA,MACnC,uBAAuB,oBAAoB;AAAA,MAC3C,iBAAiB,eAAe;AAAA,MAChC,YAAY,UAAU;AAAA,MACtB,cAAc,YAAY;AAAA,MAC1B,aAAa,WAAW;AAAA,MACxB,WAAW,SAAS;AAAA,MACpB,iBAAiB,cAAc;AAAA,IAAA;AAAA,EAEnC;AAGA,QAAM,oBAAoB,CAAC,WAAyB;AAElD,kBAAc;AAEd,QAAI;AACF,mBAAa,QAAQ,OAAO,iBAAiB;AAC7C,iBAAW,QAAQ,OAAO,eAAe;AACzC,qBAAe,QAAQ,OAAO,oBAAoB;AAClD,oBAAc,QAAQ,OAAO,kBAAkB;AAC/C,mBAAa,QAAQ,OAAO,iBAAiB;AAC7C,yBAAmB,QAAQ,EAAE,OAAO,0BAA0B;AAC9D,wBAAkB,QAAQ,OAAO,uBAAuB;AACxD,0BAAoB,QAAQ,OAAO,yBAAyB;AAC5D,aAAO,QAAQ,OAAO,WAAW;AACjC,sBAAgB,QAAQ,OAAO,qBAAqB;AACpD,0BAAoB,QAAQ,OAAO,yBAAyB;AAE9D,kBAAY,QAAQ,OAAO,gBAAgB;AAC3C,iBAAW,QAAQ,OAAO,eAAe;AACzC,eAAS,QAAQ,OAAO,aAAa;AACrC,oBAAc,QAAQ,OAAO,mBAAmB;AAAA,IAGhD,UAAA;AACE,oBAAc;AAAA,IAChB;AAAA,EACF;AAIA,QAAM,oBAAoB,MAAM;AAC9B,mBAAe,QAAQ,UAAU;AAEjC,UAAM,UAAU,eAAe,SAAS,aAAa;AACrD,QAAI,OAAO,UAAU;AAErB,UAAM,sBAAsB,cAAc,QAAQ,WAAW,QAAQ,IAAI,WAAW;AACpF,QAAI,sBAAsB,KAAK,OAAO,qBAAqB;AACzD,aAAO;AAAA,IACT;AACA,cAAU,QAAQ;AAAA,EACpB;AAGA,QAAM,sBAAsB,MAAM;AAChC,QAAI,UAAU,UAAU,MAAM;AAE5B,UAAI,OAAO,aAAa,QAAQ;AAEhC,YAAM,sBAAsB,cAAc,QAAQ,WAAW,QAAQ,IAAI,WAAW;AACpF,UAAI,sBAAsB,KAAK,OAAO,qBAAqB;AACzD,eAAO;AAAA,MACT;AACA,gBAAU,QAAQ;AAAA,IACpB;AAAA,EACF;AAGA,QAAM,iBAAiB,CAAC,eAA8C;AACpE,QAAI,CAAC,cAAc,CAAC,WAAW,SAAS;AACtC,aAAO;AAAA,IACT;AACA,QAAI;AACF,aAAO,KAAK,KAAK,UAAU,WAAW,OAAO,CAAC;AAAA,IAChD,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AAGA,QAAM,kBAAkB,OACtB,eAC8B;AAC9B,QAAI;AACF,gBAAU,QAAQ;AAElB,YAAM,cAAuC;AAAA,QAC3C,SAAS,OAAO;AAAA,MAAA;AAGlB,UAAI,yCAAY,SAAS;AACvB,oBAAY,cAAc,WAAW;AAAA,MACvC;AAEA,YAAM,WAAW,MAAM,MAAM,SAAS,2BAA2B,GAAG;AAAA,QAClE,QAAQ;AAAA,QACR,SAAS;AAAA,UACP,gBAAgB;AAAA,QAAA;AAAA,QAElB,MAAM,KAAK,UAAU,WAAW;AAAA,MAAA,CACjC;AAED,UAAI,CAAC,SAAS,IAAI;AAChB,cAAM,YAAY,MAAM,SAAS,KAAA;AACjC,cAAM,IAAI,MAAM,UAAU,SAAS,6BAA6B;AAAA,MAClE;AAEA,YAAM,OAAO,MAAM,SAAS,KAAA;AAE5B,UAAI,CAAC,KAAK,SAAS;AACjB,cAAM,IAAI,MAAM,KAAK,SAAS,2BAA2B;AAAA,MAC3D;AAEA,aAAO,KAAK,SAAS,CAAA;AAAA,IACvB,SAAS,OAAO;AACd,cAAQ,MAAM,iDAAiD,KAAK;AACpE,YAAM;AAAA,IACR,UAAA;AACE,gBAAU,QAAQ;AAAA,IACpB;AAAA,EACF;AAGA,QAAM,cAAc,OAAO,eAAsC;AAC/D,QAAI;AACF,YAAM,UAAU,eAAe,UAAU;AACzC,YAAM,cAAc,YAAY,eAAe;AAG/C,YAAM,WAAW,MAAM,gBAAgB,UAAU;AAGjD,iBAAW,QAAQ,SAAS;AAG5B,UAAI,aAAa;AACf,qBAAa,QAAQ;AACrB,uBAAe,QAAQ;AAAA,MACzB;AAGA,UAAI,aAAa,QAAQ,WAAW,OAAO;AACzC,qBAAa,QAAQ,KAAK,IAAI,GAAG,WAAW,KAAK;AAAA,MACnD;AAGA,UAAI,SAAS,SAAS,KAAK,aAAa,QAAQ,GAAG;AACjD,cAAM,cAAc,SAAS,aAAa,QAAQ,CAAC;AACnD,YAAI,aAAa;AACf,0BAAgB,QAAQ,OAAO,UAAU,aACrC,YAAY,YACX,YAAY,cAAc,YAAY;AAC3C,8BAAoB,QAAQ,YAAY;AAAA,QAC1C;AAAA,MACF,OAAO;AACL,wBAAgB,QAAQ;AACxB,4BAAoB,QAAQ;AAAA,MAC9B;AAEA,aAAO;AAAA,IACT,SAAS,OAAO;AACd,cAAQ,MAAM,4CAA4C,KAAK;AAC/D,YAAM;AAAA,IACR;AAAA,EACF;AAGA,QAAM,WAAW,CAAC,UAAkB;AAElC,UAAM,sBAAsB,cAAc,QAAQ,WAAW,QAAQ,IAAI,WAAW;AACpF,QAAI,SAAS,KAAK,SAAS,qBAAqB;AAC9C,mBAAa,QAAQ;AAAA,IACvB;AAAA,EACF;AAGA,QAAM,aAAa,MAAM;AACvB,iBAAa,QAAQ;AACrB,eAAW,QAAQ;AACnB,sBAAkB,QAAQ;AAAA,EAE5B;AAGA,QAAM,cAAc,MAAM;AACxB,aAAS,QAAQ,CAAC,SAAS;AAAA,EAC7B;AAGA,QAAM,yBAAyB,SAAS,MAAM,CAAC,mBAAmB,KAAK;AAGvE,QAAM,eAAe,CAAC,aAAa;AACjC,QAAI,CAAC,mBAAmB,OAAO;AAC7B,mBAAa,QAAQ;AAAA,IACvB;AAAA,EACF,CAAC;AAGD,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA,GACC,MAAM;AACP,WAAO,QAAQ,YAAA;AAAA,EACjB,GAAG,EAAE,MAAM,MAAM;AAEjB,SAAO;AAAA;AAAA,IAEL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA;AAAA,IAGA;AAAA;AAAA,IAGA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA;AAEJ;;;;;;;;;AC5RA,UAAM,QAAQ;AAOd,UAAM,QAAQ,mBAAmB,MAAM,MAAM;AAG7C,UAAM,eAAe,OAAO,cAAc;AAY1C,UAAM,iBAAqC,CAAA;AAG3C,UAAM,mBAAmB,IAAI,KAAK;AAiBlC,UAAM,oBAAwC,CAAA;AAG9C,UAAM,qBAAqB,IAAI,EAAE;AAGjC,UAAM,YAAY,IAAI,KAAK;AAG3B,UAAM,cAAc,IAAI,KAAK;AAG7B,UAAM,iBAAiB,IAAgB,EAAE;AAGzC,UAAM,oBAAoB,SAAS,MAAM;AACvC,YAAM,YAAY,MAAM,WAAW;AACnC,aAAO,MAAM,cAAc,QAAQ,YAAY,IAAI;AAAA,IACrD,CAAC;AAGD,UAAM,kBAAkB,SAAS,MAAM;AACrC,YAAM,eAAe,MAAM,aAAa;AACxC,YAAM,aAAa,MAAM,WAAW;AAGpC,UAAI,MAAM,cAAc,SAAS,iBAAiB,aAAa,GAAG;AAChE,eAAO;AAAA,MACT;AAGA,aAAO,MAAM,gBAAgB;AAAA,IAC/B,CAAC;AAGD,UAAM,WAAW,SAAS,MAAM;AAC9B,aAAO,MAAM,cAAc,SAAS,MAAM,aAAa,UAAU,MAAM,WAAW,QAAQ;AAAA,IAC5F,CAAC;AAGD,UAAM,gBAAgB,MAA6B;AAEjD,UAAK,MAAM,KAAa,eAAe;AACrC,eAAQ,MAAM,KAAa,cAAA;AAAA,MAC7B;AACA,aAAO;AAAA,IACT;AAGA,UAAM,4BAA4B,CAAC,UAAsB,UAAkB;AACzE,YAAM,kBAAkB,SAAS;AAGjC,UAAI,MAAM,cAAc,SAAS,UAAU,kBAAkB,GAAG;AAC9D,cAAM,gBAAgB,QAAQ;AAC9B,cAAM,oBAAoB,QAAQ;AAClC;AAAA,MACF;AAGA,UAAI,kBAAkB,KAAK,QAAQ,KAAK,SAAS,iBAAiB;AAChE,cAAM,cAAc,SAAS,QAAQ,CAAC;AACtC,YAAI,aAAa;AACf,gBAAM,gBAAgB,QAAQ,YAAY;AAC1C,gBAAM,oBAAoB,QAAQ,YAAY;AAAA,QAChD;AAAA,MACF;AAAA,IACF;AAGA,UAAM,oBAAoB,OAAO,aAAqB;AAEpD,YAAM,WAAW,MAAM,cAAc,QACjC,MAAM,WAAW,QAAQ,IACzB,MAAM,WAAW;AAGrB,YAAM,eAAe,KAAK,IAAI,GAAG,KAAK,IAAI,UAAU,YAAY,CAAC,CAAC;AAIhE,YAAM,OAAe,YAAY,IAAI;AACvC,YAAM,eAAe,QAAQ;AAC7B,YAAM,UAAU,QAAQ;AAGxB,qBAAe,SAAS;AACxB,uBAAiB,QAAQ;AAEzB,YAAM,SAAS,YAAY;AAG3B,UAAI;AACF,cAAM,aAAa,cAAA;AACnB,cAAM,WAAW,MAAM,MAAM,gBAAgB,UAAU;AACvD,uBAAe,QAAQ;AACvB,kCAA0B,UAAU,YAAY;AAAA,MAClD,SAAS,OAAO;AACd,gBAAQ,MAAM,4CAA4C,KAAK;AAAA,MACjE;AAAA,IACF;AAGA,UAAM,oBAAoB,CAAC,UAAkB;AAC3C,wBAAkB,KAAK;AAAA,IACzB;AAGA,UAAM,iCAAiC,CAAC,aAAsB;AAC5D,YAAM,mBAAmB,QAAQ;AAEjC,UAAI,CAAC,UAAU;AACb,cAAM,aAAa,QAAQ,MAAM,cAAc;AAAA,MACjD;AAAA,IACF;AAGA,UAAM,0BAA0B,CAAC,aAAqB;AACpD,YAAM,YAAY,QAAQ;AAE1B,YAAM,WAAW,QAAQ;AACzB,YAAM,kBAAkB,QAAQ;AAAA,IAClC;AAGA,UAAM,4BAA4B,CAAC,aAAsB;AACvD,YAAM,cAAc,QAAQ;AAI5B,UAAI,CAAC,YAAY,MAAM,aAAa,QAAQ,MAAM,WAAW,OAAO;AAClE,cAAM,aAAa,QAAQ,KAAK,IAAI,GAAG,MAAM,WAAW,KAAK;AAAA,MAC/D;AAAA,IACF;AAGA,UAAM,oBAAoB,MAAM;AAC9B,YAAM,YAAA;AAAA,IACR;AAGA,UAAM,mBAAmB,YAAY;AAEjC,YAAM,OAAe,YAAY,IAAI;AACvC,YAAM,eAAe,QAAQ;AAC7B,YAAM,UAAU,QAAQ;AAGxB,qBAAe,SAAS;AACxB,uBAAiB,QAAQ;AAGzB,YAAM,WAAA;AAGN,UAAI;AACF,cAAM,aAAa,cAAA;AACnB,cAAM,WAAW,MAAM,MAAM,gBAAgB,UAAU;AACvD,uBAAe,QAAQ;AACvB,kCAA0B,UAAU,CAAC;AAAA,MACvC,SAAS,OAAO;AACd,gBAAQ,MAAM,6CAA6C,KAAK;AAAA,MAClE;AAAA,IACF;AAMA,UAAM,UAAU,CAAC,UAAsB;AAGrC,YAAM,SAAS,MAAM;AACrB,UAAI,iCAAQ,QAAQ,gCAAgC;AAGlD,cAAM,gBAAA;AACN;AAAA,MACF;AAGA,YAAMzF,OAAO,OAAe;AAC5B,UAAI,CAACA,QAAO,CAACA,KAAI,UAAU,OAAOA,KAAI,OAAO,sBAAsB,YAAY;AAC7E;AAAA,MACF;AAEA,YAAM,SAAS,MAAM;AACrB,YAAM,SAAS,MAAM;AACrB,YAAM,eAAe,KAAK,IAAI,MAAM,IAAI,KAAK,IAAI,MAAM;AAGvD,UAAI,MAAM,SAAS;AACjB,cAAM,eAAA;AACN,cAAM,gBAAA;AACN,QAAAA,KAAI,OAAO,kBAAkB,KAAK;AAClC;AAAA,MACF;AAGA,UAAI,cAAc;AAChB,cAAM,eAAA;AACN,cAAM,gBAAA;AACN,QAAAA,KAAI,OAAO,kBAAkB,KAAK;AAClC;AAAA,MACF;AAGA,YAAM,eAAA;AACN,YAAM,gBAAA;AACN,MAAAA,KAAI,OAAO,kBAAkB,KAAK;AAAA,IACpC;AAGA,UAAM,yBAAyB,YAAY;AACzC,UAAI,CAAC,UAAU,MAAO;AAEtB,YAAM,aAAa,cAAA;AACnB,YAAM,UAAU,MAAM,eAAe,UAAU;AAE/C,UAAI,YAAY,mBAAmB,OAAO;AACxC,gBAAQ,IAAI,yDAAyD;AACrE,2BAAmB,QAAQ;AAC3B,YAAI;AACF,gBAAM,MAAM,YAAY,UAAU;AAElC,gBAAM,WAAW,MAAM,MAAM,gBAAgB,UAAU;AACvD,yBAAe,QAAQ;AAAA,QACzB,SAAS,OAAO;AACd,kBAAQ,MAAM,mDAAmD,KAAK;AAAA,QACxE;AAAA,MACF;AAAA,IACF;AAGA,cAAU,YAAY;;AAGpB,YAAM,OAAO,WAAW,CAACf,OAAoB;AAC3C,YAAIA,IAAG;AACL,gBAAM,kBAAkBA,EAAC;AAAA,QAC3B;AAAA,MACF;AAGA,UAAI,MAAM,OAAO,OAAO;AACtB,cAAM,kBAAkB,MAAM,OAAO,KAAK;AAAA,MAC5C;AASE,YAAM,OAAe,eAAe,MAAM;AAC1C,YAAI,MAAM,SAAS,OAAO;AAGxB,yBAAe,KAAK;AAAA,YAClB,UAAU;AAAA,YACV,YAAY,MAAM,WAAW;AAAA,YAC7B,aAAa,MAAM,YAAY;AAAA,YAC/B,sBAAsB;AAAA,YACtB,mBAAmB,MAAM,kBAAkB;AAAA;AAAA,UAAA,CAC5C;AACD,2BAAiB,QAAQ;AAIzB,gBAAM,eAAe,MAAM,YAAA;AAC3B,uBAAa,kBAAkB;AAC/B,gBAAM,OAAO,QAAQ;AACrB;AAAA,QACF;AAEA,YAAK,MAAM,OAAe,YAAY,GAAG;AAEvC,cAAI,MAAM,WAAW,QAAQ,MAAM,YAAY,OAAO;AAEpD,kBAAM,WAAW;AAAA,UACnB,OAAO;AAEL,kBAAM,WAAW,QAAQ;AACzB,kBAAM,kBAAA;AAAA,UACR;AAAA,QACF,OAAO;AAEL,gBAAM,WAAW,QAAQ;AACzB,gBAAM,oBAAA;AACJ,gBAAM,OAAe,YAAY,IAAI;AAAA,QACzC;AAIA,cAAM,uBAAuB,MAAM,WAAW,SAAS,MAAM,YAAY;AAKzE,cAAM,oBAAoB,uBAAuB,IAAI,MAAM,WAAW;AAGtE,uBAAe,KAAK;AAAA,UAClB,UAAU;AAAA,UACV,YAAY,MAAM,WAAW;AAAA,UAC7B,aAAa,MAAM,YAAY;AAAA,UAC/B;AAAA,UACA;AAAA,QAAA,CACD;AACD,yBAAiB,QAAQ;AAGzB,cAAM,OAAO,QAAQ,MAAM,YAAA;AAAA,MAC7B;AAGA,gBAAU,QAAQ;AAGlB,UAAI;AACF,cAAM,aAAa,cAAA;AACnB,2BAAmB,QAAQ,MAAM,eAAe,UAAU;AAC1D,cAAM,MAAM,YAAY,UAAU;AAElC,cAAM,WAAW,MAAM,MAAM,gBAAgB,UAAU;AACvD,uBAAe,QAAQ;AAAA,MACzB,SAAS,OAAO;AACd,gBAAQ,MAAM,6CAA6C,KAAK;AAAA,MAClE;AAIA,YAAM,sBAAsBC,MAAA,MAAM,KAAa,eAAnB,gBAAAA,IAA+B,KAAK,MAAM;AAEpE,YAAM,KAAa,aAAa,SAAS,QAAa;AACtD,gBAAQ,IAAI,iDAAiD,MAAM;AAGnE,cAAM,UAAU,eAAe,MAAA;AAC/B,yBAAiB,QAAQ,eAAe,SAAS;AAGjD,cAAM,uBAAuB,UACzB,QAAQ,uBACP,CAAC,MAAM,SAAS,SAAS,MAAM,WAAW,SAAS,MAAM,YAAY;AAG1E,cAAM,aAAY,iCAAQ,gBAAe,SACpC,MAAM,QAAQ,OAAO,UAAU,IAAI,OAAO,WAAW,CAAC,IAAI,OAAO,aAClE,MAAM,aAAa;AACvB,cAAM,gBAAe,iCAAQ,oBAAmB,SAC3C,MAAM,QAAQ,OAAO,cAAc,IAAI,OAAO,eAAe,CAAC,IAAI,OAAO,iBAC1E;AACJ,cAAM,oBAAmB,iCAAQ,wBAAuB,SACnD,MAAM,QAAQ,OAAO,kBAAkB,IAAI,OAAO,mBAAmB,CAAC,IAAI,OAAO,qBAClF;AACJ,cAAM,mBAAkB,iCAAQ,uBAAsB,SACjD,MAAM,QAAQ,OAAO,iBAAiB,IAAI,OAAO,kBAAkB,CAAC,IAAI,OAAO,oBAChF;AACJ,cAAM,uBAAsB,iCAAQ,2BAA0B,SACzD,MAAM,QAAQ,OAAO,qBAAqB,IAAI,OAAO,sBAAsB,CAAC,IAAI,OAAO,wBACxF;AAGJ,aAAI,iCAAQ,iBAAgB,QAAW;AACrC,gBAAM,MAAM,MAAM,QAAQ,OAAO,WAAW,IAAI,OAAO,YAAY,CAAC,IAAI,OAAO;AAC/E,gBAAM,WAAW,QAAQ;AAAA,QAC3B;AAGA,YAAI,SAAS;AACX,4BAAkB,KAAK;AAAA,YACrB,YAAY,QAAQ;AAAA,YACpB,aAAa,QAAQ;AAAA,YACrB;AAAA,YACA,mBAAmB,QAAQ;AAAA,YAC3B,QAAQ;AAAA,cACN;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,YAAA;AAAA,UACF,CACD;AAGD,gBAAM,oBAAoB,QAAQ,QAAQ;AAC1C,gBAAM,oBAAoB,QAAQ;AAAA,QACpC;AAGA,YAAI,oBAAoB;AACtB,iBAAO,mBAAmB,MAAM;AAAA,QAClC;AAAA,MACF;AAGA,UAAI,MAAM,KAAK;AAKb,cAAM,0BAA0B,MAAM;AAEpC,cAAI,kBAAkB,WAAW,GAAG;AAClC;AAAA,UACF;AAEA,gBAAM,UAAU,kBAAkB,MAAA;AAIlC,gBAAM,kBAAkB,QAAQ,QAAQ;AAExC,cAAI,QAAQ,QAAQ;AAClB,gBAAI,QAAQ,sBAAsB;AAChC,oBAAM,aAAa,QAAQ,QAAQ,OAAO;AAC1C,oBAAM,gBAAgB,QAAQ,QAAQ,OAAO;AAC7C,oBAAM,oBAAoB,QAAQ,QAAQ,OAAO;AAAA,YACnD,OAAO;AAEL,oBAAM,gBAAgB,QAAQ,QAAQ,OAAO;AAC7C,oBAAM,oBAAoB,QAAQ,QAAQ,OAAO;AAAA,YACnD;AAAA,UACF;AAGA,cAAI,kBAAkB,WAAW,GAAG;AAClC,kBAAM,oBAAoB,QAAQ;AAClC,kBAAM,oBAAoB,QAAQ;AAAA,UACpC;AAAA,QACF;AAEA,cAAM,IAAI,iBAAiB,qBAAqB,uBAAuB;AACvE,cAAM,IAAI,iBAAiB,mBAAmB,uBAAuB;AACrE,cAAM,IAAI,iBAAiB,yBAAyB,uBAAuB;AAG3E,cAAM,aAAa,MAAM;AACvB,gBAAM,IAAI,oBAAoB,qBAAqB,uBAAuB;AAC1E,gBAAM,IAAI,oBAAoB,mBAAmB,uBAAuB;AACxE,gBAAM,IAAI,oBAAoB,yBAAyB,uBAAuB;AAAA,QAChF;AAGA,cAAM,kBAAmB,MAAM,OAAe;AAC5C,cAAM,OAAe,kBAAkB,MAAM;AAC7C;AACA,qBAAA;AAAA,QACF;AAAA,MACF;AAGA,YAAM,gBAAgB,YAAY,wBAAwB,GAAI;AAG9D,YAAM,6BAA8B,MAAM,OAAe;AACvD,YAAM,OAAe,kBAAkB,MAAM;AAC7C;AACA,sBAAc,aAAa;AAAA,MAC7B;AAAA,IACF,CAAC;;0BA/iBCuF,mBA0CM,OAAA;AAAA,QA1CD,OAAM;AAAA,QAAsB;AAAA,MAAA;QAC/BQ,YA+BE,wBAAA;AAAA,UA9BC,iBAAeuB,MAAA,KAAA,EAAM,aAAa;AAAA,UAClC,eAAa,kBAAA;AAAA,UACb,qBAAmB,gBAAA;AAAA,UACnB,yBAAuBA,MAAA,KAAA,EAAM,oBAAoB;AAAA,UACjD,kBAAgBA,MAAA,KAAA,EAAM,cAAc;AAAA,UACpC,iBAAeA,MAAA,KAAA,EAAM,aAAa;AAAA,UAClC,yBAAuBA,MAAA,KAAA,EAAM,mBAAmB;AAAA,UAChD,uBAAqBA,MAAA,KAAA,EAAM,kBAAkB;AAAA,UAC7C,yBAAuBA,MAAA,KAAA,EAAM,oBAAoB;AAAA,UACjD,6BAA2BA,MAAA,KAAA,EAAM,uBAAuB;AAAA,UACxD,cAAYA,MAAA,KAAA,EAAM,UAAU;AAAA,UAC5B,gBAAcA,MAAA,KAAA,EAAM,YAAY;AAAA,UAChC,eAAaA,MAAA,KAAA,EAAM,kBAAkB;AAAA,UACrC,aAAWA,MAAA,KAAA,EAAM,SAAS;AAAA,UAC1B,qBAAmB,iBAAA;AAAA,UACnB,yBAAuBA,MAAA,KAAA,EAAM,oBAAoB;AAAA,UACjD,yBAAuBA,MAAA,KAAA,EAAM,oBAAoB;AAAA,UACjD,mBAAiBA,MAAA,KAAA,EAAM,cAAc;AAAA,UACrC,cAAY,SAAA;AAAA,UACZ,yBAAsB;AAAA,UACtB,gEAAuBA,MAAA,KAAA,EAAM,cAAc,QAAQ;AAAA,UACnD,+DAAsBA,MAAA,KAAA,EAAM,aAAa,QAAQ;AAAA,UACjD,+BAA8B;AAAA,UAC9B,oEAA4BA,MAAA,KAAA,EAAM,kBAAkB,QAAQ;AAAA,UAC5D,sEAA8BA,MAAA,KAAA,EAAM,oBAAoB,QAAQ;AAAA,UAChE,wBAAqB;AAAA,UACrB,0BAAwB;AAAA,UACxB,eAAc;AAAA,UACd,cAAa;AAAA,UACb,0DAAoB,YAAA,QAAW;AAAA,QAAA;QAGlCvB,YAOE,eAAA;AAAA,UANC,SAAS,YAAA;AAAA,UACT,aAAW,eAAA;AAAA,UACX,iBAAeuB,MAAA,KAAA,EAAM,aAAa;AAAA,UAClC,mBAAiBA,MAAA,KAAA,EAAM,cAAc;AAAA,UACrC,+CAAO,YAAA,QAAW;AAAA,UAClB,UAAQ;AAAA,QAAA;;;;;;;;;;;;;;;;;;;;;;;ACvBf,UAAM,QAAQ;AAKd,UAAM,WAAW,IAAoC,IAAI;AAEzD,UAAM,cAAc;AAAA,MAAS,MAC3B,SAAS,UAAU,QAAQ,OAAO,KAAK,SAAS,KAAK,EAAE,SAAS;AAAA,IAAA;AAGlE,UAAM,kBAAkB,SAAS,MAAM;AACrC,UAAI,CAAC,SAAS,MAAO,QAAO;AAC5B,YAAM,UAAU,KAAK,UAAU,SAAS,OAAO,MAAM,CAAC;AACtD,aAAO,gBAAgB,OAAO;AAAA,IAChC,CAAC;AAGD,UAAM,SAAS;AAAA,MACb,KAAK;AAAA;AAAA,MACL,QAAQ;AAAA;AAAA,MACR,QAAQ;AAAA;AAAA,MACR,SAAS;AAAA;AAAA,MACT,MAAM;AAAA;AAAA,IAAA;AAGR,aAAS,gBAAgB,MAAsB;AAE7C,aAAO,KAAK,QAAQ,MAAM,OAAO,EAAE,QAAQ,MAAM,MAAM,EAAE,QAAQ,MAAM,MAAM;AAG7E,aAAO,KAAK;AAAA,QACV;AAAA,QACA,CAAC,UAAU;AACT,cAAI,QAAQ,OAAO;AAEnB,cAAI,KAAK,KAAK,KAAK,GAAG;AACpB,gBAAI,KAAK,KAAK,KAAK,GAAG;AAEpB,sBAAQ,OAAO;AACf,sBAAQ,MAAM,QAAQ,MAAM,EAAE;AAC9B,qBAAO,sBAAsB,KAAK,MAAM,KAAK;AAAA,YAC/C,OAAO;AAEL,sBAAQ,OAAO;AAAA,YACjB;AAAA,UACF,WAAW,aAAa,KAAK,KAAK,GAAG;AACnC,oBAAQ,OAAO;AAAA,UACjB,WAAW,OAAO,KAAK,KAAK,GAAG;AAC7B,oBAAQ,OAAO;AAAA,UACjB;AAEA,iBAAO,sBAAsB,KAAK,MAAM,KAAK;AAAA,QAC/C;AAAA,MAAA;AAAA,IAEJ;AAEA,cAAU,MAAM;;AAEd,YAAM,OAAO,iBAAiB,YAAY;AAG1C,YAAM,OAAO,aAAa,CAACvH,OAAM;AAC/B,YAAIA,MAAK,OAAOA,OAAM,UAAU;AAC9B,mBAAS,QAAQA;AAAA,QACnB;AAAA,MACF;AAGA,UAAI,MAAM,OAAO,SAAS,OAAO,MAAM,OAAO,UAAU,UAAU;AAChE,iBAAS,QAAQ,MAAM,OAAO;AAAA,MAChC;AAIA,YAAM,sBAAsBC,MAAA,MAAM,KAAa,eAAnB,gBAAAA,IAA+B,KAAK,MAAM;AAEpE,YAAM,KAAa,aAAa,SAAS,QAAa;AAEtD,aAAI,iCAAQ,cAAa,QAAW;AAClC,cAAI,gBAAgB,OAAO;AAG3B,cAAI,MAAM,QAAQ,aAAa,GAAG;AAChC,4BAAgB,cAAc,CAAC;AAAA,UACjC;AAGA,cAAI,OAAO,kBAAkB,UAAU;AACrC,gBAAI;AACF,8BAAgB,KAAK,MAAM,aAAa;AAAA,YAC1C,SAAS,GAAG;AACV,sBAAQ,MAAM,6CAA6C,CAAC;AAAA,YAC9D;AAAA,UACF;AAEA,mBAAS,QAAQ;AAAA,QACnB;AAGA,YAAI,oBAAoB;AACtB,iBAAO,mBAAmB,MAAM;AAAA,QAClC;AAAA,MACF;AAAA,IACF,CAAC;;AAzHC,aAAA4F,UAAA,GAAAL,mBAKM,OALNG,cAKM;AAAA,QAJJD,gBAGM,OAHNI,cAGM;AAAA,UAFO,YAAA,sBAAXN,mBAAuD,OAAA;AAAA;YAA/B,WAAQ,gBAAA;AAAA,UAAA,2CAChCA,mBAA2D,OAA3DU,cAAgC,uBAAqB;AAAA,QAAA;;;;;;ACyBpD,SAAS,gBACd,aACA,YAAgC,SAChC,UAAkC,CAAA,GAClC;AACA,QAAM,uBAAuB,IAAiC,IAAI;AAClE,QAAM,gBAAgB,IAAI,KAAK;AAE/B,QAAM+B,kBAAsC;AAAA,IAC1C,UAAU;AAAA,IACV,UAAU;AAAA,IACV,eAAe;AAAA,IACf,aAAa;AAAA,IACb,GAAG;AAAA,EAAA;AAGL,QAAM,mBAAmB,YAAY;AACnC,QAAI,CAAC,YAAY,OAAO;AACtB,cAAQ,KAAK,2DAA2D;AACxE;AAAA,IACF;AAEA,QAAI,qBAAqB,OAAO;AAC9B,cAAQ,IAAI,iDAAiD;AAC7D;AAAA,IACF;AAEA,QAAI;AAEF,YAAM,SAAS,MAAM;AAAA;AAAA,QAA0B,GAAG,oBAAoB;AAAA;AACtE,YAAM,eAAkC,OAAO;AAE/C,2BAAqB,QAAQ,IAAI;AAAA,QAC/B,YAAY;AAAA,QACZ;AAAA,QACAA;AAAA,MAAA;AAEF,oBAAc,QAAQ;AACtB,cAAQ,IAAI,qCAAqC,SAAS,EAAE;AAAA,IAC9D,SAAS,OAAO;AACd,cAAQ,MAAM,2CAA2C,KAAK;AAAA,IAChE;AAAA,EACF;AAEA,QAAM,sBAAsB,MAAM;AAChC,QAAI,qBAAqB,OAAO;AAC9B,2BAAqB,MAAM,QAAA;AAC3B,2BAAqB,QAAQ;AAC7B,oBAAc,QAAQ;AACtB,cAAQ,IAAI,6BAA6B;AAAA,IAC3C;AAAA,EACF;AAEA,QAAM,qBAAqB,MAAM;AAC/B,QAAI,qBAAqB,OAAO;AAC9B,2BAAqB,MAAM,mBAAA;AAAA,IAC7B;AAAA,EACF;AAEA,YAAU,MAAM;AAGd,eAAW,MAAM;AACf,uBAAA;AAAA,IACF,GAAG,CAAC;AAAA,EACN,CAAC;AAED,cAAY,MAAM;AAChB,wBAAA;AAAA,EACF,CAAC;AAED,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA;AAEJ;;;;;;;;;;;;;;;AC3DA,UAAM,QAAQ;AAWd,UAAM,eAAe,IAAI,OAAO,cAAc,eAAe,UAAU,iBAAiB,IAAI;AAG5F,UAAM,eAAe,CAAC,UAAiB;AACrC,YAAM,cAAc;AACpB,mBAAa,QAAQ,YAAY,OAAO;AAExC,4BAAA;AAAA,IACF;AAEA,UAAM,cAAc,IAAgC,IAAI;AACxD,UAAM,kBAAkB,IAAwB,IAAI;AASpD,UAAM,kBAAkB,IAAI,CAAC;AAC7B,QAAI,0BAAiD;AAErD,UAAM,wBAAwB,MAAM;AAClC,YAAM,KAAK,YAAY;AACvB,UAAI,CAAC,GAAI;AACT,YAAM,aAAa,GAAG,eAAe,GAAG;AACxC,sBAAgB,QAAQ,aAAa,GAAG,cAAc,GAAG,cAAc;AAAA,IACzE;AAEA,UAAM,wBAAwB,MAAM;AAClC,8BAAA;AACA,YAAM,KAAK,YAAY;AACvB,UAAI,CAAC,MAAM,OAAO,mBAAmB,aAAa;AAChD;AAAA,MACF;AACA,gCAA0B,IAAI,eAAe,MAAM;AACjD,8BAAA;AAAA,MACF,CAAC;AACD,8BAAwB,QAAQ,EAAE;AAAA,IACpC;AAEA,UAAM,0BAA0B,MAAM;AACpC,UAAI,yBAAyB;AAC3B,gCAAwB,WAAA;AACxB,kCAA0B;AAAA,MAC5B;AAAA,IACF;AAEA,UAAM,UAAU,IAAI,KAAK;AAGzB,UAAM,kBAAkB,SAAS,MAAM,QAAQ,KAAK;AAGpD;AAAA,MACE;AAAA,MACA,MAAM,aAAa;AAAA,MACnB,EAAE,aAAa,MAAM,eAAe,KAAA;AAAA,IAAK;AAG3C,UAAM,qBAAqB,MAAM;AAC/B,cAAQ,QAAQ,YAAY,QAAQ,YAAY,MAAM,MAAM,SAAS,IAAI;AAAA,IAC3E;AAEA,UAAM,UAAU,CAAC,UAAiB;AAEhC,4BAAA;AAKA,UAAK,MAAqB,cAAc,eAAe;AACrD,cAAM,KAAK,YAAY;AACvB,YAAI,MAAM,GAAG,mBAAmB,KAAK,GAAG,iBAAiB,GAAG,MAAM,QAAQ;AACxE,aAAG,kBAAkB,GAAG,MAAM,QAAQ,GAAG,MAAM,MAAM;AAAA,QACvD;AAAA,MACF;AAGA,yBAAA;AAGA,UAAI,YAAY,SAAS,OAAO,MAAM,OAAO,aAAa,YAAY;AACpE,cAAM,OAAO,SAAS,YAAY,MAAM,KAAK;AAAA,MAC/C;AAAA,IACF;AAUA,UAAM,UAAU,CAAC,UAAsB;AACrC,YAAM,WAAW,YAAY;AAC7B,UAAI,CAAC,SAAU;AAGf,YAAM,aAAa,SAAS,eAAe,SAAS;AACpD,YAAM,SAAS,MAAM;AACrB,YAAM,SAAS,MAAM;AACrB,YAAM,eAAe,KAAK,IAAI,MAAM,IAAI,KAAK,IAAI,MAAM;AAGvD,YAAMlH,OAAO,OAAe;AAC5B,UAAI,CAACA,QAAO,CAACA,KAAI,UAAU,OAAOA,KAAI,OAAO,sBAAsB,YAAY;AAC7E;AAAA,MACF;AAGA,UAAI,MAAM,SAAS;AACjB,cAAM,eAAA;AACN,cAAM,gBAAA;AACN,QAAAA,KAAI,OAAO,kBAAkB,KAAK;AAClC;AAAA,MACF;AAGA,UAAI,cAAc;AAChB,cAAM,eAAA;AACN,cAAM,gBAAA;AACN,QAAAA,KAAI,OAAO,kBAAkB,KAAK;AAClC;AAAA,MACF;AAGA,UAAI,YAAY;AAGd,cAAM,gBAAA;AAAA,MACR,OAAO;AAGL,cAAM,eAAA;AACN,QAAAA,KAAI,OAAO,kBAAkB,KAAK;AAAA,MACpC;AAAA,IACF;AAGA,UAAM,wBAAwB,MAAM;AAGlC,4BAAA;AACA,yBAAA;AAAA,IACF;AAGA,UAAM,wBAAwB,MAAM;AAClC,UAAI,MAAM,QAAQ;AAChB,cAAM,OAAO,aAAa,CAAC,UAAkB;AAE3C,kBAAQ,QAAQ,MAAM,SAAS;AAG/B,gCAAA;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAWA,UAAM,YAAY,MAAM;AACtB,YAAM,KAAK,YAAY;AACvB,UAAI,CAAC,MAAM,GAAG,MAAM,WAAW,EAAG;AAIlC,SAAG,MAAA;AACH,SAAG,kBAAkB,GAAG,GAAG,MAAM,MAAM;AACvC,UAAI,KAAK;AACT,UAAI;AAGF,aAAK,OAAO,SAAS,gBAAgB,cAAc,SAAS,YAAY,cAAc,OAAO,EAAE;AAAA,MACjG,QAAQ;AACN,aAAK;AAAA,MACP;AAEA,UAAI,IAAI;AAGN,gBAAQ,QAAQ;AAChB;AAAA,MACF;AAKA,SAAG,QAAQ;AACX,SAAG,cAAc,IAAI,MAAM,OAAO,CAAC;AAAA,IACrC;AAEA,cAAU,MAAM;AAEd,UAAI,YAAY,OAAO;AACrB,cAAM,OAAO,UAAU,YAAY;AACjC,oBAAY,MAAc,0BAA0B,MAAM;AAC1D,oBAAY,MAAc,8BAA8B,MAAM,OAAO;AACrE,oBAAY,MAAc,8BAA8B,MAAM,OAAO,QAAQ;AAM/E,cAAM,YAAY,YAAY,MAAM,QAAQ,mCAAmC;AAC/E,YAAI,aAAc,UAAkB,iBAAiB;AAClD,oBAAkB,gBAAgB,UAAU,YAAY;AAAA,QAC3D;AAGA,cAAM,eAAgB,MAAM,OAAe;AAC3C,YAAI,iBAAiB,QAAW;AAC9B,sBAAY,MAAM,QAAQ;AAC1B,kBAAQ,QAAQ,aAAa,SAAS;AACtC,iBAAQ,MAAM,OAAe;AAE7B,sBAAY,MAAM,cAAc,IAAI,YAAY,2CAA2C;AAAA,YACzF,QAAQ,EAAE,OAAO,aAAA;AAAA,UAAa,CAC/B,CAAC;AAAA,QACJ;AAGA,YAAI,iBAAiB,QAAW;AAC9B,kBAAQ,QAAQ,YAAY,MAAM,MAAM,SAAS;AAAA,QACnD;AAGA,oBAAY,MAAM,iBAAiB,2CAA2C,qBAAsC;AAAA,MACtH;AAGA,UAAI,YAAY,SAAS,OAAO,MAAM,OAAO,aAAa,YAAY;AACpE,cAAM,OAAO,SAAS,YAAY,MAAM,KAAK;AAAA,MAC/C;AAGA,4BAAA;AAGA,4BAAA;AACA,4BAAA;AAGA,eAAS,iBAAiB,gCAAgC,YAAY;AAAA,IACxE,CAAC;AAED,gBAAY,MAAM;AAChB,8BAAA;AAGA,UAAI,MAAM,OAAO,YAAY,YAAY,OAAO;AAC9C,cAAM,OAAO,UAAU;AAAA,MACzB;AAGA,UAAI,YAAY,OAAO;AACrB,eAAQ,YAAY,MAAc;AAClC,eAAQ,YAAY,MAAc;AAClC,eAAQ,YAAY,MAAc;AAClC,oBAAY,MAAM,oBAAoB,2CAA2C,qBAAsC;AAAA,MACzH;AAGA,UAAI,MAAM,QAAQ;AAChB,cAAM,OAAO,aAAa;AAAA,MAC5B;AAGA,eAAS,oBAAoB,gCAAgC,YAAY;AAAA,IAC3E,CAAC;;AAjVC,aAAA8E,UAAA,GAAAL,mBA6BM,OA7BNG,cA6BM;AAAA,QA5BJD,gBA2BM,OAAA;AAAA,mBA1BA;AAAA,UAAJ,KAAI;AAAA,UACJ,OAAM;AAAA,UACL,iDAAkC,gBAAA,QAAe,MAAA;AAAA,QAAA;UAElDA,gBASE,YAAA;AAAA,qBARI;AAAA,YAAJ,KAAI;AAAA,YACH,aAAa,QAAA;AAAA,YACb,YAAY,QAAA,cAAU;AAAA,YACtB,OAAKD,eAAA,CAAA,cAAA,EAAA,gBAAmC,aAAA,OAAY,uBAAyB,aAAA,MAAA,CAAY,CAAA;AAAA,YACzF,sBAAO,QAAA,aAAa,qBAAY,EAAA,WAAgB,QAAA,qBAAqB,MAAS;AAAA,YAC/E,sBAAmB;AAAA,YAClB;AAAA,YACA;AAAA,UAAA;UAGK,gBAAA,sBADRD,mBAWS,UAAA;AAAA;YATP,MAAK;AAAA,YACL,OAAM;AAAA,YACN,OAAM;AAAA,YACL,SAAO;AAAA,UAAA;YAERE,gBAGM,OAAA;AAAA,cAHD,SAAQ;AAAA,cAAY,MAAK;AAAA,cAAO,QAAO;AAAA,cAAe,gBAAa;AAAA,YAAA;cACtEA,gBAAsC,QAAA;AAAA,gBAAhC,IAAG;AAAA,gBAAK,IAAG;AAAA,gBAAI,IAAG;AAAA,gBAAI,IAAG;AAAA,cAAA;cAC/BA,gBAAsC,QAAA;AAAA,gBAAhC,IAAG;AAAA,gBAAI,IAAG;AAAA,gBAAI,IAAG;AAAA,gBAAK,IAAG;AAAA,cAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AC0FzC,UAAM,QAAQ;AAQd,UAAM,WAAW,IAAY,EAAE;AAC/B,UAAM,QAAQ,IAAY,EAAE;AAC5B,UAAM,gBAAgB,IAAY,EAAE;AACpC,UAAM,WAAW,IAAY,EAAE;AAC/B,UAAM,SAAS,IAAa,KAAK;AACjC,UAAM,YAAY,IAAY,OAAO;AAGrC,UAAM,qBAAqB,IAAY,EAAE;AACzC,UAAM,mBAAmB,IAAY,EAAE;AACvC,UAAM,qBAAqB,IAAa,KAAK;AAC7C,UAAM,mBAAmB,IAAa,KAAK;AAC3C,UAAM,oBAAoB,IAAa,KAAK;AAE5C,UAAM,iBAAiB;AAAA,MAAS,MAC9B,CAAC,EAAE,mBAAmB,SAAS,iBAAiB;AAAA,IAAA;AAIlD,UAAM,UAAU,CAAC,YAAY;AAC3B,wBAAkB,QAAQ;AAC1B,uBAAiB,QAAQ;AACzB,yBAAmB,QAAQ;AAC3B,uBAAiB,QAAQ;AACzB,UAAI,WAAW,UAAU,UAAU,eAAe;AAChD,yBAAA;AAAA,MACF;AAAA,IACF,CAAC;AAED,aAAS,4BAA4B;AACnC,UAAI,CAAC,kBAAkB,SAAS,SAAS,OAAO;AAC9C,yBAAA;AAAA,MACF;AAAA,IACF;AAEA,mBAAe,mBAAmB;;AAChC,UAAI,mBAAmB,SAAS,CAAC,SAAS,MAAO;AAEjD,yBAAmB,QAAQ;AAC3B,uBAAiB,QAAQ;AAEzB,UAAI;AACF,cAAM,WAAW,MAAM,MAAM,IAAI;AAAA,UAC/B,gCAAgC,mBAAmB,SAAS,KAAK,CAAC;AAAA,UAClE,EAAE,QAAQ,MAAA;AAAA,QAAM;AAGlB,YAAI,CAAC,SAAS,IAAI;AAChB,gBAAM,IAAI,MAAM,6BAA6B,SAAS,UAAU,EAAE;AAAA,QACpE;AAEA,cAAM,OAAO,MAAM,SAAS,KAAA;AAC5B,YAAI,KAAK,WAAW,KAAK,UAAU;AACjC,6BAAmB,QAAQ,KAAK,SAAS,eAAe;AACxD,2BAAiB,UAAQzF,MAAA,KAAK,SAAS,UAAd,gBAAAA,IAAqB,gBAAe;AAC7D,4BAAkB,QAAQ;AAAA,QAC5B,OAAO;AAEL,4BAAkB,QAAQ;AAAA,QAC5B;AAAA,MACF,SAAS,GAAG;AACV,gBAAQ,MAAM,iDAAiD,CAAC;AAChE,yBAAiB,QAAQ;AAAA,MAE3B,UAAA;AACE,2BAAmB,QAAQ;AAAA,MAC7B;AAAA,IACF;AAEA,mBAAe,YAAY;AACzB,UAAI,MAAM,UAAU,cAAc,SAAS,OAAO,MAAO;AACzD,UAAI,CAAC,SAAS,MAAO;AAErB,aAAO,QAAQ;AACf,UAAI;AACF,cAAM,WAAW,MAAM,MAAM,IAAI,SAAS,2BAA2B;AAAA,UACnE,QAAQ;AAAA,UACR,SAAS,EAAE,gBAAgB,mBAAA;AAAA,UAC3B,MAAM,KAAK,UAAU,EAAE,WAAW,SAAS,OAAO,OAAO,MAAM,MAAA,CAAO;AAAA,QAAA,CACvE;AACD,cAAM,SAAS,MAAM,SAAS,KAAA;AAC9B,YAAI,OAAO,SAAS;AAClB,gBAAM,IAAI,iBAAiB,MAAM,IAAI;AAAA,YACnC,UAAU;AAAA,YACV,SAAS;AAAA,YACT,QAAQ;AAAA,YACR,MAAM;AAAA,UAAA,CACP;AACD,wBAAc,QAAQ,MAAM;AAAA,QAC9B,OAAO;AACL,gBAAM,IAAI,iBAAiB,MAAM,IAAI;AAAA,YACnC,UAAU;AAAA,YACV,SAAS;AAAA,YACT,QAAQ,OAAO,WAAW,OAAO,SAAS;AAAA,YAC1C,MAAM;AAAA,UAAA,CACP;AAAA,QACH;AAAA,MACF,SAAS,GAAG;AACV,gBAAQ,MAAM,0CAA0C,CAAC;AACzD,cAAM,IAAI,iBAAiB,MAAM,IAAI;AAAA,UACnC,UAAU;AAAA,UACV,SAAS;AAAA,UACT,QAAS,EAAY,WAAW;AAAA,UAChC,MAAM;AAAA,QAAA,CACP;AAAA,MACH,UAAA;AACE,eAAO,QAAQ;AAAA,MACjB;AAAA,IACF;AAEA,aAAS,QAAQ,OAAmB;;AAClC,YAAM,SAAS,MAAM;AACrB,UAAI,CAAC,OAAQ;AAEb,YAAM,WAAY,OAA6F;AAC/G,UAAI,GAACA,MAAA,qCAAU,WAAV,gBAAAA,IAAkB,mBAAmB;AAG1C,UAAI,MAAM,SAAS;AACjB,cAAM,eAAA;AACN,cAAM,gBAAA;AACN,iBAAS,OAAO,kBAAkB,KAAK;AACvC;AAAA,MACF;AAGA,UAAI,KAAK,IAAI,MAAM,MAAM,IAAI,KAAK,IAAI,MAAM,MAAM,GAAG;AACnD,cAAM,eAAA;AACN,cAAM,gBAAA;AACN,iBAAS,OAAO,kBAAkB,KAAK;AACvC;AAAA,MACF;AAGA,YAAM,eAAe,OAAO,QAAQ,+BAA+B;AACnE,UAAI,cAAc;AAChB,cAAM,aAAa,aAAa,eAAe,aAAa;AAC5D,YAAI,YAAY;AAEd,gBAAM,gBAAA;AACN;AAAA,QACF;AAAA,MACF;AAGA,YAAM,eAAA;AACN,YAAM,gBAAA;AACN,eAAS,OAAO,kBAAkB,KAAK;AAAA,IACzC;AAEA,cAAU,MAAM;;AAEd,YAAM,aAAa,OAA4B;AAAA,QAC7C,MAAM,SAAS;AAAA,QACf,OAAO,MAAM;AAAA,QACb,UAAU,SAAS;AAAA,QACnB,WAAW,UAAU;AAAA,MAAA;AAIvB,YAAM,aAAa,CAACD,OAAe;AACjC,YAAIA,MAAK,OAAOA,OAAM,UAAU;AAC9B,gBAAM,OAAOA;AAGb,cAAI,KAAK,cAAc,OAAW,WAAU,QAAQ,KAAK;AACzD,cAAI,KAAK,SAAS,OAAW,UAAS,QAAQ,KAAK;AACnD,cAAI,KAAK,UAAU,QAAW;AAC5B,kBAAM,QAAQ,KAAK;AACnB,0BAAc,QAAQ,KAAK;AAAA,UAC7B;AACA,cAAI,KAAK,aAAa,OAAW,UAAS,QAAQ,KAAK;AAAA,QACzD;AAAA,MACF;AAIA,UAAI,MAAM,OAAO,SAAS;AACxB,cAAM,OAAO,QAAQ,WAAW;AAChC,cAAM,OAAO,QAAQ,WAAW;AAAA,MAClC,OAAO;AACL,gBAAQ,KAAK,qEAAqE;AAAA,MACpF;AAGA,YAAM,OAAO,iBAAiB,YAAY,WAAA;AAG1C,YAAM,OAAO,aAAa;AAK1B,YAAM,eAAc,MAAAC,MAAA,MAAM,OAAO,SAAb,gBAAAA,IAAmB,YAAnB,mBAA4B;AAAA,QAC9C,CAAC6H,OAAuBA,GAAE,OAAO,MAAM,OAAO;AAAA;AAEhD,UAAI,WAAW;AACf,UAAI,gBAAgB,UAAa,eAAe,GAAG;AACjD,cAAM,cAAa,iBAAM,OAAO,SAAb,mBAAmB,mBAAnB,mBAAoC;AACvD,YAAI,cAAc,OAAO,eAAe,UAAU;AAChD,qBAAW,UAAU;AACrB,qBAAW;AAAA,QACb;AAAA,MACF;AAGA,UAAI,CAAC,YAAY,MAAM,OAAO,SAAS,OAAO,MAAM,OAAO,UAAU,UAAU;AAC7E,mBAAW,MAAM,OAAO,KAAK;AAAA,MAC/B;AAIA,YAAM,OAAO,eAAe,CAAC,SAAuF;AAClH,YAAI,MAAM;AACR,mBAAS,QAAQ,KAAK;AACtB,gBAAM,QAAQ,KAAK;AACnB,wBAAc,QAAQ,KAAK;AAC3B,mBAAS,QAAQ,KAAK;AAEtB,cAAI,KAAK,cAAc,QAAW;AAChC,sBAAU,QAAQ,KAAK;AAAA,UACzB;AAAA,QACF,OAAO;AACL,mBAAS,QAAQ;AACjB,gBAAM,QAAQ;AACd,wBAAc,QAAQ;AACtB,mBAAS,QAAQ;AAAA,QAEnB;AAAA,MACF;AAGA,UAAI,MAAM,OAAO,mBAAmB;AAClC,cAAM,OAAO,aAAa,MAAM,OAAO,iBAAiB;AACxD,eAAO,MAAM,OAAO;AAAA,MACtB;AAAA,IACF,CAAC;;0BAvWCtC,mBAuFM,OAAA;AAAA,QAvFD,OAAKC,eAAA,CAAC,oBAAkB,EAAA,eAA0B,QAAA,UAAA,CAAS,CAAA;AAAA,QAAK;AAAA,MAAA;QACnD,SAAA,sBAAhBD,mBAoFWY,UAAA,EAAA,KAAA,KAAA;AAAA,UAlFTV,gBA0BM,OA1BN,YA0BM;AAAA,YAzBJA,gBAWQ,SAAA;AAAA,cAVN,OAAKD,eAAA,CAAC,iBAAe,EAAA,QACH,UAAA,UAAS,SAAA,CAAA;AAAA,YAAA;6BAE3BC,gBAKE,SAAA;AAAA,gBAJA,MAAK;AAAA,6EACI,UAAS,QAAA;AAAA,gBAClB,OAAM;AAAA,gBACN,OAAM;AAAA,cAAA;8BAFG,UAAA,KAAS;AAAA,cAAA;cAIpB,OAAA,CAAA,MAAA,OAAA,CAAA,IAAAA,gBAA8C,QAAA,EAAxC,OAAM,yBAAsB,SAAK,EAAA;AAAA,YAAA;YAEzCA,gBAYQ,SAAA;AAAA,cAXN,OAAKD,eAAA,CAAC,iBAAe,EAAA,QACH,UAAA,UAAS,eAAA,CAAA;AAAA,YAAA;6BAE3BC,gBAME,SAAA;AAAA,gBALA,MAAK;AAAA,6EACI,UAAS,QAAA;AAAA,gBAClB,OAAM;AAAA,gBACN,OAAM;AAAA,gBACL,UAAQ;AAAA,cAAA;8BAHA,UAAA,KAAS;AAAA,cAAA;cAKpB,OAAA,CAAA,MAAA,OAAA,CAAA,IAAAA,gBAAoD,QAAA,EAA9C,OAAM,yBAAsB,eAAW,EAAA;AAAA,YAAA;;UAKjDwC,eAAAxC,gBAqBM,OArBN,YAqBM;AAAA,YApBJA,gBAGM,OAHN,YAGM;AAAA,cAFJ,OAAA,CAAA,MAAA,OAAA,CAAA,IAAAA,gBAA0C,SAAA,EAAnC,OAAM,aAAA,GAAa,YAAQ,EAAA;AAAA,cAClCA,gBAA+C,OAA/C,YAA+CE,gBAAjB,SAAA,KAAQ,GAAA,CAAA;AAAA,YAAA;YAExCF,gBAQM,OARN,YAQM;AAAA,cAPJ,OAAA,CAAA,MAAA,OAAA,CAAA,IAAAA,gBAAuC,SAAA,EAAhC,OAAM,aAAA,GAAa,SAAK,EAAA;AAAA,6BAC/BA,gBAKY,YAAA;AAAA,6EAJD,MAAK,QAAA;AAAA,gBACd,OAAM;AAAA,gBACN,aAAY;AAAA,gBACX,UAAU,OAAA;AAAA,cAAA;6BAHF,MAAA,KAAK;AAAA,cAAA;;YAMlBA,gBAMS,UAAA;AAAA,cALP,OAAM;AAAA,cACL,UAAU,MAAA,UAAU,cAAA,SAAiB,OAAA;AAAA,cACrC,SAAO;AAAA,YAAA,mBAEL,OAAA,QAAM,cAAA,MAAA,GAAA,GAAA,UAAA;AAAA,UAAA;oBAnBA,UAAA,UAAS,OAAA;AAAA,UAAA;UAwBtBwC,eAAAxC,gBA4BM,OA5BN,YA4BM;AAAA,YA1BO,mBAAA,SAAXG,aAAAL,mBAGM,OAHN,YAGM,CAAA,GAAA,OAAA,CAAA,MAAA,OAAA,CAAA,IAAA;AAAA,cAFJE,gBAAsC,KAAA,EAAnC,OAAM,yBAAA,GAAwB,MAAA,EAAA;AAAA,cACjCA,gBAAmC,cAA7B,0BAAsB,EAAA;AAAA,YAAA,QAId,iBAAA,SAAhBG,aAAAL,mBAEM,OAFN,aAEM,CAAA,GAAA,OAAA,CAAA,MAAA,OAAA,CAAA,IAAA;AAAA,cADJE,gBAAuC,cAAjC,8BAA0B,EAAA;AAAA,YAAA,SAIjB,eAAA,SAAjBG,aAAAL,mBAEM,OAFN,aAEM,CAAA,GAAA,OAAA,CAAA,MAAA,OAAA,CAAA,IAAA;AAAA,cADJE,gBAAqC,cAA/B,4BAAwB,EAAA;AAAA,YAAA,SAIhCG,aAAAL,mBASM,OATN,aASM;AAAA,cARO,mBAAA,SAAXK,UAAA,GAAAL,mBAGM,OAHN,aAGM;AAAA,gBAFJ,OAAA,EAAA,MAAA,OAAA,EAAA,IAAAE,gBAAoD,SAAA,EAA7C,OAAM,aAAA,GAAa,sBAAkB,EAAA;AAAA,gBAC5CA,gBAAgE,OAAA;AAAA,kBAA3D,OAAM;AAAA,kBAAmB,WAAQ,mBAAA;AAAA,gBAAA;;cAE7B,iBAAA,SAAXG,UAAA,GAAAL,mBAGM,OAHN,aAGM;AAAA,gBAFJ,OAAA,EAAA,MAAA,OAAA,EAAA,IAAAE,gBAAmD,SAAA,EAA5C,OAAM,aAAA,GAAa,qBAAiB,EAAA;AAAA,gBAC3CA,gBAA8D,OAAA;AAAA,kBAAzD,OAAM;AAAA,kBAAmB,WAAQ,iBAAA;AAAA,gBAAA;;;;oBAzB/B,UAAA,UAAS,aAAA;AAAA,UAAA;gCA8BxBF,mBAAsD,OAAtD,aAAgC,kBAAgB;AAAA,MAAA;;;;;ACrF7C,SAAS,uBAAuB,QAAgB,WAAwB;AAC7E,MAAI,aAAa;AAEjB,SAAO,MAAM;AACX,QAAI,YAAY;AACd;AAAA,IACF;AAEA,WAAO,QAAA;AACP,iBAAa;AACb;AAAA,EACF;AACF;ACwHA,IAAI,yBAAyB;AAC7B,IAAI,kCAAkC;AAStC,eAAe,yBAAyB;AACpC,MAAI;AACA,UAAM,WAAW,MAAM,IAAI,SAAS,cAAc;AAClD,QAAI,SAAS,IAAI;AACb,YAAM,OAAO,MAAM,SAAS,KAAI;AAChC,UAAI,KAAK,WAAW,KAAK,UAAU;AAC/B,iCAAyB,KAAK,SAAS,sBAAsB;AAC7D;AAAA,MACJ;AAAA,IACJ;AAAA,EACJ,SAAS,GAAG;AAAA,EACZ;AACA,MAAI,2BAA2B,MAAM;AACjC,6BAAyB;AAAA,EAC7B;AACJ;AAEA,SAAS,4BAA4B;AACjC,MAAI,iCAAiC;AACjC;AAAA,EACJ;AACA,oCAAkC,yBAAyB,QAAQ,MAAM;AACrE,sCAAkC;AAAA,EACtC,CAAC;AACL;AAMA,SAAS,wBAAwB;AAC7B,4BAAyB;AAC7B;AACA,sBAAqB;AAErB,SAAS,gCAAgC;AACrC,SAAO,iBAAiB,WAAW,CAAC,MAAM;AACtC,QAAI,EAAE,QAAQ,iCAAiC;AAC3C,gCAAyB;AAAA,IAC7B;AAAA,EACJ,CAAC;AAED,WAAS,iBAAiB,oBAAoB,MAAM;AAChD,QAAI,SAAS,oBAAoB,WAAW;AACxC,gCAAyB;AAAA,IAC7B;AAAA,EACJ,CAAC;AACL;AACA,8BAA6B;AAsG7B,MAAM,sCAAsC;AAC5C,MAAM2C,qCAAmC;AAWlC,SAAS,8BAA8B,OAAO;AACjD,MAAI,CAAC,SAAS,OAAO,UAAU,YAAY,MAAM,QAAQ,KAAK,GAAG;AAC7D,WAAO;AAAA,EACX;AACA,MAAI,EAAE,kBAAkB,QAAQ;AAC5B,WAAO;AAAA,EACX;AACA,QAAM,WAAW,EAAE,GAAG,MAAK;AAC3B,SAAO,SAAS;AAChB,SAAO;AACX;AAUA,SAAS,mCAAmC,OAAO;;AAC/C,MAAI,CAAC,MAAM,QAAQ,KAAK,GAAG;AACvB;AAAA,EACJ;AAEA,aAAW,QAAQ,OAAO;AACtB,QAAI,CAAC,QAAQ,OAAO,SAAS,UAAU;AACnC;AAAA,IACJ;AAEA,UAAM,aAAYlI,MAAA,KAAK,eAAL,gBAAAA,IAAkBkI;AACpC,QAAI,MAAM,QAAQ,KAAK,cAAc,KAAK,MAAM,QAAQ,SAAS,GAAG;AAChE,eAAS1I,KAAI,GAAGA,KAAI,KAAK,eAAe,UAAUA,KAAI,UAAU,QAAQA,MAAK;AACzE,YAAI,OAAO,UAAUA,EAAC,MAAM,YACrB,UAAUA,EAAC,EAAE,WAAW,mCAAmC,GAAG;AACjE,eAAK,eAAeA,EAAC,IAAI,8BAA8B,KAAK,eAAeA,EAAC,CAAC;AAAA,QACjF;AAAA,MACJ;AAAA,IACJ;AAEA,UAAM,QAAQ,KAAK;AACnB,QAAI,SAAS,OAAO,UAAU,UAAU;AACpC,iBAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,KAAK,GAAG;AAC9C,YAAI,IAAI,WAAW,mCAAmC,GAAG;AACrD,gBAAM,GAAG,IAAI,8BAA8B,KAAK;AAAA,QACpD;AAAA,MACJ;AAAA,IACJ;AAAA,EACJ;AACJ;AAWO,SAAS,0CAA0C,QAAQ;;AAC9D,MAAI,CAAC,UAAU,OAAO,WAAW,UAAU;AACvC,WAAO;AAAA,EACX;AAEA,QAAM,WAAW,OAAO;AACxB,MAAI,YAAY,OAAO,aAAa,UAAU;AAC1C,uCAAmC,SAAS,KAAK;AACjD,UAAM,aAAYQ,MAAA,SAAS,gBAAT,gBAAAA,IAAsB;AACxC,QAAI,MAAM,QAAQ,SAAS,GAAG;AAC1B,iBAAW,YAAY,WAAW;AAC9B,2CAAmC,qCAAU,KAAK;AAAA,MACtD;AAAA,IACJ;AAAA,EACJ;AAEA,QAAM,SAAS,OAAO;AACtB,MAAI,UAAU,OAAO,WAAW,UAAU;AACtC,eAAW,cAAc,OAAO,OAAO,MAAM,GAAG;AAC5C,YAAM,SAAS,yCAAY;AAC3B,UAAI,CAAC,UAAU,OAAO,WAAW,UAAU;AACvC;AAAA,MACJ;AACA,iBAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,MAAM,GAAG;AAC/C,YAAI,IAAI,WAAW,mCAAmC,GAAG;AACrD,iBAAO,GAAG,IAAI,8BAA8B,KAAK;AAAA,QACrD;AAAA,MACJ;AAAA,IACJ;AAAA,EACJ;AAEA,SAAO;AACX;ACnYO,SAAS,qBAAqB;AACjC,QAAM,EAAE,aAAa,OAAO;AAC5B,SAAO,SAAS,SAAS,GAAG,IAAI,SAAS,MAAM,GAAG,EAAE,IAAI;AAC5D;AAEO,SAAS,MAAM,MAAM;AACxB,SAAO,GAAG,oBAAoB,GAAG,IAAI;AACzC;ACbA,MAAM,gBAAgB;AAEf,MAAMmI,6BAA2B;AAAA,EACtC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEO,MAAMC,qCAAmC;AAAA,EAC9C;AACF;AAEO,MAAMC,0BAAwB;AAAA,EACnC,GAAGF;AAAAA,EACH,GAAGC;AACL;AAMO,SAASE,4BAA0B,YAAY;AAClD,SAAOF,mCAAiC,SAAS,UAAU;AAC/D;AAEO,SAAS,gBAAgB,YAAY;AACxC,SAAOC,wBAAsB,SAAS,UAAU;AACpD;AAEA,SAAS,UAAU,YAAY;AAC3B,SAAO,cAAc,OAAO,WAAW,YAAY,cAAc,OAAO,WAAW,WAAW;AAClG;AAsCO,SAAS,WAAW,OAAO;AAC9B,UAAO,+BAAO,OAAM;AACxB;AAEO,SAAS,eAAe,MAAM;AACjC,MAAI,CAAC,MAAM;AACP,WAAO;AAAA,EACX;AACA,SAAO,WAAW,KAAK,SAAS,IAAI,KAAK;AAC7C;AAsCO,SAAS,iBAAiB,MAAM;AACnC,MAAI,CAAC,MAAM;AACP,WAAO;AAAA,EACX;AACA,SAAO;AAAA,IACH,SAAS,KAAK;AAAA,IACd,UAAU,eAAe,IAAI;AAAA,EACrC;AACA;AAEO,SAAS,WAAW,MAAM;AAC7B,MAAI,CAAC,MAAM;AACP,WAAO;AAAA,EACX;AACA,SAAO,GAAG,eAAe,IAAI,CAAC,IAAI,KAAK,EAAE;AAC7C;AAuBO,SAAS,iBAAiB,OAAO,QAAQ;AAC5C,MAAI,CAAC,SAAS,MAAM,SAAS,MAAM;AAC/B,WAAO;AAAA,EACX;AAEA,MAAI,UAAU,MAAM,KAAK,GAAG;AACxB,WAAO,MAAM,MAAM,IAAI,MAAM,KAAK;AAAA,EACtC;AAEA,SAAO,MAAM,MAAM,MAAM,KAAK;AAClC;AA0BA,SAAS,iBAAiB,MAAM;AAC9B,MAAI,QAAQ,OAAO,eAAe,IAAI;AACtC,SAAO,SAAS,UAAU,OAAO,WAAW;AAC1C,UAAM,aAAa,OAAO,yBAAyB,OAAO,MAAM;AAChE,QAAI,eAAe,WAAW,OAAO,WAAW,MAAM;AACpD,aAAO;AAAA,IACT;AACA,YAAQ,OAAO,eAAe,KAAK;AAAA,EACrC;AACA,SAAO;AACT;AAmBO,SAAS,oBAAoB,MAAM,cAAc;AACtD,MAAI,CAAC,QAAQ,OAAO,iBAAiB,YAAY;AAC/C;AAAA,EACF;AAEA,MAAI,CAAC,MAAM,QAAQ,KAAK,sBAAsB,GAAG;AAC/C,WAAO,eAAe,MAAM,0BAA0B;AAAA,MACpD,cAAc;AAAA,MACd,UAAU;AAAA,MACV,OAAO,CAAA;AAAA,IACb,CAAK;AAAA,EACH;AACA,OAAK,uBAAuB,KAAK,YAAY;AAE7C,MAAI,KAAK,0BAA0B;AACjC;AAAA,EACF;AACA,SAAO,eAAe,MAAM,4BAA4B;AAAA,IACtD,cAAc;AAAA,IACd,UAAU;AAAA,IACV,OAAO;AAAA,EACX,CAAG;AAED,QAAM,SAAS,CAAC,SAAS,YAAY;AACnC,eAAW,YAAY,KAAK,0BAA0B,CAAA,GAAI;AACxD,UAAI;AACF,iBAAS,SAAS,OAAO;AAAA,MAC3B,SAAS,eAAe;AACtB,gBAAQ,MAAM,6CAA6C,aAAa;AAAA,MAC1E;AAAA,IACF;AAAA,EACF;AAEA,QAAM,WAAW,iBAAiB,IAAI;AAEtC,MAAI,YAAY,OAAO,SAAS,QAAQ,cAAc,OAAO,SAAS,QAAQ,YAAY;AACxF,WAAO,eAAe,MAAM,QAAQ;AAAA,MAClC,cAAc;AAAA,MACd,MAAM;AACJ,eAAO,SAAS,IAAI,KAAK,IAAI;AAAA,MAC/B;AAAA,MACA,IAAI,OAAO;AACT,cAAM,WAAW,SAAS,IAAI,KAAK,IAAI;AACvC,iBAAS,IAAI,KAAK,MAAM,KAAK;AAC7B,YAAI,aAAa,OAAO;AACtB,iBAAO,OAAO,QAAQ;AAAA,QACxB;AAAA,MACF;AAAA,IACN,CAAK;AACD;AAAA,EACF;AAEA,MAAI,cAAc,KAAK;AACvB,SAAO,eAAe,MAAM,QAAQ;AAAA,IAClC,cAAc;AAAA,IACd,MAAM;AACJ,aAAO;AAAA,IACT;AAAA,IACA,IAAI,OAAO;AACT,YAAM,WAAW;AACjB,oBAAc;AACd,UAAI,aAAa,OAAO;AACtB,eAAO,OAAO,QAAQ;AAAA,MACxB;AAAA,IACF;AAAA,EACJ,CAAG;AACH;AAkFA,SAAS,iBAAiB,OAAO;AAC7B,UAAO,+BAAO,UAAS;AAC3B;AAGO,SAAS,gCAAgC,MAAM;;AAClD,QAAM,iBAAiB,CAAA;AAEvB,MAAI,EAAC,6BAAM,SAAQ;AACf,WAAO;AAAA,EACX;AAEA,aAAW,SAAS,KAAK,QAAQ;AAC7B,QAAI,CAAC,iBAAiB,KAAK,KAAK,CAAC,MAAM,MAAM;AACzC;AAAA,IACJ;AAEA,UAAM,OAAO,iBAAiB,KAAK,OAAO,MAAM,IAAI;AACpD,QAAI,CAAC,MAAM;AACP;AAAA,IACJ;AAEA,UAAM,cAAa,MAAArI,MAAA,KAAK,UAAL,gBAAAA,IAAY,gBAAZ,wBAAAA,KAA0B,KAAK;AAClD,QAAI,cAAc,gBAAgB,WAAW,UAAU,GAAG;AACtD,qBAAe,KAAK,UAAU;AAAA,IAClC;AAAA,EACJ;AAEA,SAAO;AACX;AAGO,SAAS,+BAA+B,MAAM;;AACjD,QAAM,iBAAiB,CAAA;AAEvB,MAAI,EAAC,6BAAM,UAAS;AAChB,WAAO;AAAA,EACX;AAEA,aAAW,UAAU,KAAK,SAAS;AAC/B,QAAI,GAACA,MAAA,iCAAQ,UAAR,gBAAAA,IAAe,SAAQ;AACxB;AAAA,IACJ;AAEA,eAAW,UAAU,OAAO,OAAO;AAC/B,YAAM,OAAO,iBAAiB,KAAK,OAAO,MAAM;AAChD,UAAI,CAAC,MAAM;AACP;AAAA,MACJ;AAEA,YAAM,cAAa,gBAAK,UAAL,mBAAY,gBAAZ,4BAA0B,KAAK;AAClD,UAAI,cAAc,WAAW,eAAe,oCAAoC;AAC5E,uBAAe,KAAK,UAAU;AAAA,MAClC;AAAA,IACJ;AAAA,EACJ;AAEA,SAAO;AACX;AAGO,SAAS,uBAAuB,MAAM;;AACzC,QAAM,kBAAkB,oBAAI,IAAG;AAG/B,MAAI,KAAK,eAAe,6BAA6B;AACjD,UAAM,gBAAeA,MAAA,KAAK,YAAL,gBAAAA,IAAc,KAAK,CAAA6H,OAAKA,GAAE,SAAS;AACxD,SAAI,kDAAc,UAAd,mBAAqB,uBAAuB;AAC5C,sBAAgB,IAAI,aAAa,MAAM,qBAAqB;AAAA,IAChE;AACA,WAAO;AAAA,EACX;AAGA,MAAIS,4BAA0B,KAAK,UAAU,GAAG;AAC5C,WAAO;AAAA,EACX;AAGA,MAAI,cAAc,KAAK;AACvB,MAAI,CAAC,eAAe,KAAK,SAAS;AAC9B,kBAAc,KAAK,QAAQ,KAAK,CAAAT,OAAKA,GAAE,SAAS,OAAO;AAAA,EAC3D;AAEA,MAAI,eAAe,YAAY,OAAO;AAClC,gBAAY,MAAM,QAAQ,UAAQ;AAC9B,UAAI,KAAK,QAAQ;AACb,wBAAgB,IAAI,KAAK,IAAI;AAAA,MACjC;AAAA,IACJ,CAAC;AAAA,EACL;AAEA,SAAO;AACX;AAIO,SAAS,4BAA4B,MAAM,UAAU,oBAAI,IAAG,GAAI;AAEnE,QAAM,UAAU,WAAW,IAAI;AAC/B,MAAI,CAAC,SAAS;AACV,WAAO,oBAAI,IAAG;AAAA,EAClB;AACA,MAAI,QAAQ,IAAI,OAAO,GAAG;AACtB,WAAO,oBAAI,IAAG;AAAA,EAClB;AACA,UAAQ,IAAI,OAAO;AAInB,QAAMU,gBAAe,KAAK,SAAS,UAAa,KAAK,SAAS,KAAK,KAAK,SAAS;AAEjF,MAAI,CAACA,eAAc;AACf,WAAO,oBAAI,IAAG;AAAA,EAClB;AAGA,QAAM,qBAAqB,uBAAuB,IAAI;AAGtD,QAAM,kBAAkB,gCAAgC,IAAI;AAC5D,aAAW,aAAa,iBAAiB;AACrC,UAAM,gBAAgB,4BAA4B,WAAW,OAAO;AACpE,kBAAc,QAAQ,UAAQ,mBAAmB,IAAI,IAAI,CAAC;AAAA,EAC9D;AAEA,SAAO;AACX;AAGO,SAAS,4BAA4B,MAAM,WAAW;AACzD,QAAM,iBAAiB,+BAA+B,IAAI;AAC1D,MAAI,eAAe,SAAS,GAAG;AAC3B,UAAM,UAAU,eACX,IAAI,CAAC,kBAAkB,iBAAiB,aAAa,CAAC,EACtD,OAAO,CAAC,cAAc,cAAc,IAAI;AAE7C,QAAI,QAAQ,WAAW,GAAG;AACtB;AAAA,IACJ;AAEA,UAAM,MAAM,iCAAiC,GAAG;AAAA,MAC5C,QAAQ;AAAA,MACR,SAAS,EAAE,gBAAgB,mBAAkB;AAAA,MAC7C,MAAM,KAAK,UAAU;AAAA,QACjB,YAAY,MAAM,KAAK,SAAS;AAAA,QAChC,UAAU;AAAA,MAC1B,CAAa;AAAA,IACb,CAAS,EAAE,MAAM,SAAO,QAAQ,MAAM,iCAAiC,GAAG,CAAC;AAAA,EACvE;AACJ;AAoaO,SAAS,2BAA2B,MAAM;;AAC7C,MAAI,EAAC,6BAAM,SAAQ;AACf,WAAO;AAAA,EACX;AAEA,aAAW,SAAS,KAAK,QAAQ;AAC7B,QAAI,MAAM,SAAS,iBAAiB,CAAC,MAAM,MAAM;AAC7C;AAAA,IACJ;AAEA,UAAM,OAAO,iBAAiB,KAAK,OAAO,MAAM,IAAI;AACpD,QAAI,CAAC,MAAM;AACP;AAAA,IACJ;AAEA,UAAM,cAAa,MAAAvI,MAAA,KAAK,UAAL,gBAAAA,IAAY,gBAAZ,wBAAAA,KAA0B,KAAK;AAClD,QAAI,cAAc,WAAW,eAAe,2BAA2B;AACnE,aAAO;AAAA,IACX;AAAA,EACJ;AAEA,SAAO;AACX;AAGO,SAAS,+BAA+B,MAAM;;AACjD,QAAM,WAAW,2BAA2B,IAAI;AAChD,MAAI,CAAC,UAAU;AACX,WAAO;AAAA,EACX;AAEA,QAAMuI,gBAAe,SAAS,SAAS,UAAa,SAAS,SAAS,KAAK,SAAS,SAAS;AAC7F,MAAI,CAACA,eAAc;AACf,WAAO;AAAA,EACX;AAEA,QAAM,cAAavI,MAAA,SAAS,YAAT,gBAAAA,IAAkB,KAAK,CAAA6H,OAAKA,GAAE,SAAS;AAC1D,UAAO,yCAAY,UAAS;AAChC;AAGO,SAAS,wBAAwB,WAAW,UAAU,oBAAI,IAAG,GAAI;;AACtE,QAAM,UAAU,WAAW,SAAS;AACpC,MAAI,CAAC,WAAW,QAAQ,IAAI,OAAO,EAAG;AACtC,UAAQ,IAAI,OAAO;AAGnB,MAAI,UAAU,SAAS;AACrB,eAAW,UAAU,UAAU,SAAS;AACtC,UAAI,OAAO,OAAO;AAChB,mBAAW,UAAU,OAAO,OAAO;AACjC,gBAAM,OAAO,iBAAiB,UAAU,OAAO,MAAM;AACrD,cAAI,MAAM;AACR,kBAAM,cAAa,MAAA7H,MAAA,UAAU,UAAV,gBAAAA,IAAiB,gBAAjB,wBAAAA,KAA+B,KAAK;AAGvD,gBACE,cACA,WAAW,eAAe,6BAC1B;AACA,oBAAM,qBACJ,4BAA4B,UAAU;AACxC,0CAA4B,YAAY,kBAAkB;AAAA,YAC5D,WAES,cAAc,gBAAgB,WAAW,UAAU,GAAG;AAC7D,sCAAwB,YAAY,OAAO;AAAA,YAC7C;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;ACv+BO,MAAM,2BAA2B;AAAA,EACtC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAMO,MAAM,mCAAmC;AAAA,EAC9C;AACF;AAEO,MAAM,wBAAwB;AAAA,EACnC,GAAG;AAAA,EACH,GAAG;AACL;AAaO,SAAS,0BACd,YAC2C;AAC3C,SAAO,iCAAiC,SAAS,UAAyC;AAC5F;AAYO,SAAS,6BAA6B,MAAwB;AACnE,QAAM,aAAa,6BAAM;AAEzB,MAAI,eAAe,6BAA6B;AAC9C,WAAO,wBAAwB,IAAI;AAAA,EACrC;AAEA,MAAI,0BAA0B,UAAU,GAAG;AACzC,+BAAW,IAAA;AAAA,EACb;AAGA,SAAO,uBAAuB,IAAI;AACpC;AAMA,SAAS,uBAAuB,MAAwB;;AACtD,QAAM,sCAAsB,IAAA;AAC5B,QAAM,cAAc,KAAK,iBAAeA,MAAA,KAAK,YAAL,gBAAAA,IAAc,KAAK,CAAC6H,OAAWA,GAAE,SAAS;AAElF,MAAI,2CAAa,OAAO;AACtB,gBAAY,MAAM,QAAQ,CAAC,SAAc;AACvC,UAAI,KAAK,QAAQ;AACf,wBAAgB,IAAI,KAAK,IAAI;AAAA,MAC/B;AAAA,IACF,CAAC;AAAA,EACH;AAEA,SAAO;AACT;AAMA,SAAS,wBAAwB,MAAwB;;AACvD,QAAM,sCAAsB,IAAA;AAC5B,QAAM,gBAAe7H,MAAA,KAAK,YAAL,gBAAAA,IAAc,KAAK,CAAC6H,OAAWA,GAAE,SAAS;AAE/D,OAAI,kDAAc,UAAd,mBAAqB,uBAAuB;AAC9C,oBAAgB,IAAI,aAAa,MAAM,qBAAqB;AAAA,EAC9D;AAEA,SAAO;AACT;AAOO,SAAS,aAAa,MAAmC;AAC9D,SAAO,SAAS,UAAa,SAAS,KAAK,SAAS;AACtD;AAcO,SAAS,uBACd,MACA,cACM;AACN,sBAAoB,MAAM,YAAY;AACxC;AAgBO,SAAS,yBACd,MACAW,0BACA,sBAC4C;AAC5C,SAAO,CAAC,SAAiB,aAAqB;AAC5C,UAAM,wBAAwB,aAAa,OAAO;AAClD,UAAM,kBAAkB,wBACpB,6BAA6B,IAAI,wBAC7B,IAAA;AAGR,QAAI,sBAAsB;AACxB,2BAAqB,eAAe;AAAA,IACtC;AAGA,IAAAA,yBAAwB,IAAI;AAAA,EAC9B;AACF;AC9JA,MAAM,6BAA6B;AACnC,MAAM,8BAA8B;AACpC,MAAM,mCAAmC;AACzC,MAAM,oCAAoC;AAC1C,MAAM,oCAAoC;AAC1C,MAAM,+BAA+B;AACrC,MAAM,gCAAgC;AACtC,MAAM,gCAAgC;AACtC,MAAM,gCAAgC;AACtC,MAAM,iCAAiC;AACvC,MAAM,6BAA6B;AACnC,MAAM,8BAA8B;AACpC,MAAM,sCAAsC;AAC5C,MAAM,sCAAsC;AAI5C,MAAM,sCAAsC;AAC5C,MAAM,uCAAuC;AAC7C,MAAM,gCAAgC;AACtC,MAAM,mCAAmC;AAsBzC,MAAM,wBAAwB,IAAI,cAAc,KAAK,GAAG;AACxD,IAAI,gBAAgB,UAAU,SAAoB;AAChD,QAAM,SAAS,MAAM,sBAAsB,GAAG,IAAI;AAClD,4CAA0C,MAAM;AAChD,SAAO;AACT;AAEA,SAAS,2BAA2B,WAAwB;AAC1D,MAAI,CAAC,UAAW;AAEhB,YAAU,iBAAiB,eAAe,CAAC,UAAU;AACnD,QAAI,MAAM,WAAW,GAAG;AACtB,YAAM,SAAS,IAAI;AACnB,UAAI,UAAU,OAAO,OAAO,qBAAqB,YAAY;AAC3D,eAAO,iBAAiB,KAAK;AAAA,MAC/B;AAAA,IACF;AAAA,EACF,CAAC;AAED,YAAU,iBAAiB,eAAe,CAAC,UAAU;AACnD,SAAK,MAAM,UAAU,OAAO,GAAG;AAC7B,YAAM,SAAS,IAAI;AACnB,UAAI,UAAU,OAAO,OAAO,qBAAqB,YAAY;AAC3D,eAAO,iBAAiB,KAAK;AAAA,MAC/B;AAAA,IACF;AAAA,EACF,CAAC;AAED,YAAU,iBAAiB,aAAa,CAAC,UAAU;AACjD,QAAI,MAAM,WAAW,GAAG;AACtB,YAAM,SAAS,IAAI;AACnB,UAAI,UAAU,OAAO,OAAO,mBAAmB,YAAY;AACzD,eAAO,eAAe,KAAK;AAAA,MAC7B;AAAA,IACF;AAAA,EACF,CAAC;AACH;AAEA,MAAM,8BAAc,IAAA;AACpB,IAAI,mCAAmC;AAEhC,SAAS,yCAAyC;AACvD,sCAAoC;AACpC,SAAO;AACT;AAGA,SAAS,qBAAqB,MAAM;AAClC,QAAM,YAAY,SAAS,cAAc,KAAK;AAC9C,YAAU,KAAK,oBAAoB,KAAK,EAAE;AAC1C,YAAU,MAAM,QAAQ;AACxB,YAAU,MAAM,SAAS;AACzB,YAAU,MAAM,UAAU;AAC1B,YAAU,MAAM,gBAAgB;AAChC,YAAU,MAAM,WAAW;AAE3B,6BAA2B,SAAS;AAEpC,MAAI;AAEJ,QAAM,SAAS,KAAK;AAAA,IAClB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,MACE,WAAW;AACT,eAAO;AAAA,MACT;AAAA,MACA,SAASzI,IAAmB;AAC1B,wBAAgBA;AAAA,MAGlB;AAAA,MACA,WAAW;AAAA;AAAA;AAAA;AAAA;AAAA,MAKX,aAAa;AAAA;AAAA;AAAA,MAGb,eAAe;AACb,eAAO;AAAA,MACT;AAAA,IAAA;AAAA,EACF;AAGF,QAAM,SAAS,UAAU,gBAAgB;AAAA,IACvC;AAAA,IACA;AAAA,EAAA,CACD;AAED,SAAO,IAAI,UAAU;AAAA,IACnB,UAAU;AAAA,IACV,QAAQ;AAAA,EAAA,CACT;AAED,SAAO,MAAM,SAAS;AACtB,UAAQ,IAAI,KAAK,IAAI,MAAM;AAE3B,SAAO,oBAAoB,MAAM;AAC/B,UAAM,WAAW;AACjB,UAAM,YAAY;AAElB,WAAO,EAAE,WAAW,SAAA;AAAA,EACtB;AAEA,SAAO,WAAW,MAAM;AACtB,UAAM0I,UAAS,QAAQ,IAAI,KAAK,EAAE;AAClC,QAAIA,SAAQ;AACVA,cAAO,QAAA;AACP,cAAQ,OAAO,KAAK,EAAE;AAAA,IACxB;AAAA,EACF;AAEA,SAAO,EAAE,OAAA;AACX;AAGA,SAAS,2BAA2B,MAAM;AACxC,QAAM,YAAY,SAAS,cAAc,KAAK;AAC9C,YAAU,KAAK,0BAA0B,KAAK,EAAE;AAChD,YAAU,MAAM,QAAQ;AACxB,YAAU,MAAM,SAAS;AACzB,YAAU,MAAM,UAAU;AAC1B,YAAU,MAAM,gBAAgB;AAChC,YAAU,MAAM,WAAW;AAE3B,6BAA2B,SAAS;AAGpC,QAAM,gBAAkC;AAAA,IACtC,YAAY;AAAA,IACZ,aAAa;AAAA,IACb,WAAW;AAAA,IACX,WAAW;AAAA,IACX,oBAAoB;AAAA,IACpB,oBAAoB;AAAA,IACpB,wBAAwB;AAAA,IACxB,mBAAmB;AAAA,IACnB,mBAAmB;AAAA,IACnB,WAAW;AAAA,IACX,0BAA0B;AAAA,IAC1B,gCAAgC;AAAA,IAChC,gCAAgC;AAAA,EAAA;AAElC,MAAI,gBAAkC;AAEtC,QAAM,SAAS,KAAK;AAAA,IAClB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,MACE,WAAW;AACT,eAAO;AAAA,MACT;AAAA,MACA,SAAS1I,IAAqB;AAC5B,wBAAgBA;AAAA,MAGlB;AAAA,MACA,WAAW;AAAA,MACX,aAAa;AAAA,MACb,eAAe;AACb,eAAO;AAAA,MACT;AAAA,IAAA;AAAA,EACF;AAIF,OAAK,gBAAgB,MAAM,+BAA+B,IAAI;AAG9D,SAAO,SAAS,CAAC,gBAAuB;AAEtC,UAAM,cAAc,KAAK,QAAQ,KAAK,CAAC8H,OAAWA,GAAE,SAAS,OAAO;AACpE,QAAI,aAAa;AACf,kBAAY,QAAQ;AAAA,IACtB;AAAA,EACF;AAEA,QAAM,SAAS,UAAU,sBAAsB;AAAA,IAC7C;AAAA,IACA;AAAA,IACA;AAAA,EAAA,CACD;AAED,SAAO,IAAI,UAAU;AAAA,IACnB,UAAU;AAAA,IACV,QAAQ;AAAA,EAAA,CACT;AAED,SAAO,MAAM,SAAS;AACtB,UAAQ,IAAI,KAAK,KAAK,KAAO,MAAM;AAEnC,SAAO,oBAAoB,MAAM;AAC/B,UAAM,WAAW;AACjB,UAAM,YAAY;AAClB,UAAM,YAAY;AAElB,WAAO,EAAE,WAAW,UAAU,UAAA;AAAA,EAChC;AAEA,SAAO,WAAW,MAAM;AACtB,UAAMY,UAAS,QAAQ,IAAI,KAAK,KAAK,GAAK;AAC1C,QAAIA,SAAQ;AACVA,cAAO,QAAA;AACP,cAAQ,OAAO,KAAK,KAAK,GAAK;AAAA,IAChC;AAAA,EACF;AAEA,SAAO,EAAE,OAAA;AACX;AAGA,SAAS,uBAAuB,MAAM;AACpC,QAAM,YAAY,SAAS,cAAc,KAAK;AAC9C,YAAU,KAAK,sBAAsB,KAAK,EAAE;AAC5C,YAAU,MAAM,QAAQ;AACxB,YAAU,MAAM,SAAS;AACzB,YAAU,MAAM,UAAU;AAC1B,YAAU,MAAM,gBAAgB;AAChC,YAAU,MAAM,WAAW;AAE3B,6BAA2B,SAAS;AAEpC,QAAM,gBAA8B;AAAA,IAClC,eAAe;AAAA,IACf,aAAa;AAAA,IACb,kBAAkB;AAAA,IAClB,gBAAgB;AAAA,IAChB,eAAe;AAAA,IACf,wBAAwB;AAAA,IACxB,qBAAqB;AAAA,IACrB,uBAAuB;AAAA,IACvB,SAAS;AAAA,IACT,mBAAmB;AAAA,IACnB,uBAAuB;AAAA,IACvB,cAAc;AAAA,IACd,aAAa;AAAA,IACb,WAAW;AAAA,IACX,iBAAiB;AAAA,EAAA;AAEnB,MAAI,gBAA0C;AAE9C,QAAM,SAAS,KAAK;AAAA,IAClB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,MACE,WAAW;AACT,eAAO;AAAA,MACT;AAAA,MACA,SAAS1I,IAAiB;AACxB,cAAM,cAAc,+CAAe;AACnC,wBAAgBA;AAIhB,YAAI,iBAAgBA,MAAA,gBAAAA,GAAG,wBAAuB;AAC5C,kCAAwB,IAAI;AAAA,QAC9B;AAAA,MACF;AAAA,MACA,WAAW;AAAA,MACX,aAAa;AAAA,MACb,eAAe;AACb,eAAO;AAAA,MACT;AAAA,IAAA;AAAA,EACF;AAIF,OAAK,gBAAgB,MAAM,+BAA+B,IAAI;AAE9D,QAAM,SAAS,UAAU,kBAAkB;AAAA,IACzC;AAAA,IACA;AAAA,IACA;AAAA,EAAA,CACD;AAED,SAAO,IAAI,UAAU;AAAA,IACnB,UAAU;AAAA,IACV,QAAQ;AAAA,EAAA,CACT;AAED,SAAO,MAAM,SAAS;AACtB,UAAQ,IAAI,KAAK,KAAK,KAAO,MAAM;AAEnC,SAAO,oBAAoB,MAAM;AAC/B,UAAM,WAAW;AACjB,UAAM,YAAY;AAClB,UAAM,YAAY;AAElB,WAAO,EAAE,WAAW,UAAU,UAAA;AAAA,EAChC;AAEA,SAAO,WAAW,MAAM;AACtB,UAAM0I,UAAS,QAAQ,IAAI,KAAK,KAAK,GAAK;AAC1C,QAAIA,SAAQ;AACVA,cAAO,QAAA;AACP,cAAQ,OAAO,KAAK,KAAK,GAAK;AAAA,IAChC;AAAA,EACF;AAEA,SAAO,EAAE,OAAA;AACX;AAGA,SAAS,wBAAwB,MAAM;AACrC,QAAM,YAAY,SAAS,cAAc,KAAK;AAC9C,YAAU,KAAK,uBAAuB,KAAK,EAAE;AAC7C,YAAU,MAAM,QAAQ;AACxB,YAAU,MAAM,SAAS;AACzB,YAAU,MAAM,UAAU;AAC1B,YAAU,MAAM,gBAAgB;AAChC,YAAU,MAAM,WAAW;AAE3B,6BAA2B,SAAS;AAEpC,MAAI;AAEJ,QAAM,SAAS,KAAK;AAAA,IAClB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,MACE,WAAW;AACT,eAAO;AAAA,MACT;AAAA,MACA,SAAS1I,IAA4B;AACnC,wBAAgBA;AAChB,YAAI,OAAO,OAAO,eAAe,YAAY;AAC3C,iBAAO,WAAWA,EAAC;AAAA,QACrB;AAAA,MACF;AAAA,MACA,WAAW;AAAA;AAAA,MACX,aAAa;AAAA,MACb,eAAe;AACb,eAAO;AAAA,MACT;AAAA,IAAA;AAAA,EACF;AAGF,QAAM,SAAS,UAAU,mBAAmB;AAAA,IAC1C;AAAA,IACA;AAAA,EAAA,CACD;AAED,SAAO,IAAI,UAAU;AAAA,IACnB,UAAU;AAAA,IACV,QAAQ;AAAA,EAAA,CACT;AAED,SAAO,MAAM,SAAS;AACtB,UAAQ,IAAI,KAAK,KAAK,KAAO,MAAM;AAEnC,SAAO,oBAAoB,MAAM;AAC/B,UAAM,WAAW;AACjB,UAAM,YAAY;AAElB,WAAO,EAAE,WAAW,SAAA;AAAA,EACtB;AAEA,SAAO,WAAW,MAAM;AACtB,UAAM0I,UAAS,QAAQ,IAAI,KAAK,KAAK,GAAK;AAC1C,QAAIA,SAAQ;AACVA,cAAO,QAAA;AACP,cAAQ,OAAO,KAAK,KAAK,GAAK;AAAA,IAChC;AAAA,EACF;AAEA,SAAO,EAAE,OAAA;AACX;AAEA,MAAM,yCAAgE,IAAA;AAEtE,SAAS,2BAA2B,MAAqB;AACvD,UAAQ,KAAK,WAAW,CAAA,GACrB,OAAO,CAAC,WAAgB,UAAU,OAAO,cAAc,KAAK,EAC5D,IAAI,CAAC,WAAgB,OAAO,IAAI;AACrC;AAEA,SAAS,gCAAgC,iBAAiB,QAAQ;AAChE,SAAO;AAAA,IACL,SAAS;AAAA,IACT;AAAA,EAAA;AAEJ;AAEA,SAAS,wCACP,MACA,cACS;;AACT,QAAM,aAAY,MAAAzI,MAAA,6BAAM,gBAAN,gBAAAA,IAAmB,aAAnB,mBAA6B;AAC/C,MAAI,CAAC,aAAa,CAAC,MAAM,QAAQ,YAAY,GAAG;AAC9C,WAAO;AAAA,EACT;AAEA,QAAM,cAAc,IAAI,KAAK,KAAK,WAAW,IAAI,IAAI,CAAC,WAAgB,iCAAQ,IAAI,CAAC;AACnF,QAAM,gCAAgC,MAAM,KAAK,WAAW,EAAE;AAAA,IAAK,CAAC,SAClE,OAAO,SAAS,YAAY,KAAK,WAAW,yBAAyB;AAAA,EAAA;AAGvE,MAAI,CAAC,+BAA+B;AAClC,WAAO;AAAA,EACT;AAEA,QAAM,wBAAwB,OAAO,OAAO,SAAS,EAAE;AAAA,IAAO,CAAC,UAC7D,YAAY,IAAI,MAAM,IAAI,KAAK,MAAM;AAAA,EAAA;AAGvC,QAAM,2BAA2B,sBAAsB;AAAA,IAAQ,CAAC,UAC9D,MAAM,yBACF,CAAC,CAAC,CAAC,MAAM,YAAY,KAAK,IAC1B,CAAC,CAAC,CAAC,MAAM,UAAU;AAAA,EAAA;AAGzB,QAAM,SACJ,yBAAyB,KAAK,OAAO,KACrC,yBAAyB,WAAW,aAAa;AAGnD,SAAO;AACT;AAEA,SAAS,wBACP,cACA,kBACA,oBACW;AACX,QAAM,kCAAkB,IAAA;AACxB,mBAAiB,QAAQ,CAAC,MAAM,UAAU;AACxC,QAAI,QAAQ,aAAa,QAAQ;AAC/B,kBAAY,IAAI,MAAM,aAAa,KAAK,CAAC;AAAA,IAC3C;AAAA,EACF,CAAC;AAED,QAAM,uBAAuB,IAAI,IAAI,kBAAkB;AACvD,QAAM,iBAA4B,CAAA;AAClC,aAAW,QAAQ,oBAAoB;AACrC,QAAI,YAAY,IAAI,IAAI,GAAG;AACzB,qBAAe,KAAK,YAAY,IAAI,IAAI,CAAC;AAAA,IAC3C;AAAA,EACF;AAQA,aAAW,QAAQ,kBAAkB;AACnC,QAAI,CAAC,qBAAqB,IAAI,IAAI,KAAK,YAAY,IAAI,IAAI,GAAG;AAC5D,qBAAe,KAAK,YAAY,IAAI,IAAI,CAAC;AAAA,IAC3C;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,wCACP,cACA,oBACW;AACX,QAAM,iBAA4B,CAAA;AAClC,MAAI,mBAAmB;AAEvB,aAAW,cAAc,oBAAoB;AAC3C,QAAI,WAAW,WAAW,yBAAyB,GAAG;AACpD,YAAM,iBAAiB,WAAW,QAAQ,2BAA2B,EAAE,KAAK;AAC5E,qBAAe,KAAK,gCAAgC,cAAc,CAAC;AACnE;AAAA,IACF;AAEA,QAAI,mBAAmB,aAAa,QAAQ;AAC1C,qBAAe,KAAK,aAAa,gBAAgB,CAAC;AAClD;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,kCAAkC,MAAW,MAAW;;AAC/D,MAAI,CAAC,QAAQ,CAAC,MAAM,QAAQ,KAAK,cAAc,GAAG;AAChD;AAAA,EACF;AAEA,QAAM,qBAAqB,2BAA2B,IAAI;AAE1D,MAAI,mBAAmB,WAAW,GAAG;AACnC;AAAA,EACF;AAEA,QAAM,oBAAmBA,MAAA,KAAK,eAAL,gBAAAA,IAAkB;AAE3C,MAAI,MAAM,QAAQ,gBAAgB,KAAK,iBAAiB,SAAS,GAAG;AAClE,UAAM,iBAAiB;AAAA,MACrB,KAAK;AAAA,MACL;AAAA,MACA;AAAA,IAAA;AAEF,SAAK,iBAAiB;AACtB;AAAA,EACF;AAEA,QAAM,sBAAsB,mBAAmB;AAAA,IAAO,CAAC,SACrD,KAAK,WAAW,yBAAyB;AAAA,EAAA,EACzC;AAEF,MACE,sBAAsB,KACtB,KAAK,eAAe,WAAW,mBAAmB,SAAS,qBAC3D;AACA,UAAM,iBAAiB;AAAA,MACrB,KAAK;AAAA,MACL;AAAA,IAAA;AAEF,SAAK,iBAAiB;AAAA,EACxB;AACF;AAEA,SAAS,+BACP,QACA,YACA,WACM;AAON,MAAI,WAAW;AACX,WAAe,oBAAoB;AACrC,WAAO,cAAc,CAAC,UACpB,CAAC,SAAS,KAAK,sCAAsC,CAAC;AAAA,EAC1D,OAAO;AACL,WAAQ,OAAe;AACvB,WAAQ,OAAe;AAAA,EACzB;AACF;AAGA,MAAM,yBAAyB,MAAM;;AACnC,OAAI,MAAAA,MAAA,IAAI,OAAJ,gBAAAA,IAAQ,aAAR,mBAAkB,kBAAkB;AACtC,QAAI,GAAG,SAAS,iBAAiB,iCAAiC,MAAM;AAGtE,4BAAsB,MAAM;;AAC1B,cAAM,iBAAe,MAAA0I,OAAA1I,MAAA,IAAI,OAAJ,gBAAAA,IAAQ,aAAR,gBAAA0I,IAAkB,oBAAlB,wBAAAA,KAAoC,8BAA6B;AAEtF,aAAI,SAAI,UAAJ,mBAAW,OAAO;AACpB,qBAAW,QAAQ,IAAI,MAAM,OAAO;AAClC,kBAAM,cAAatB,MAAA,KAAK,YAAL,gBAAAA,IAAc;AAAA,cAC/B,CAACS,OAAWA,GAAE,SAAS;AAAA;AAEzB,gBAAI,CAAC,WAAY;AACjB,kBAAM,YAAa,WAAmB;AACtC,2CAA+B,YAAY,WAAW,YAAY;AAAA,UACpE;AAAA,QACF;AAEA,8BAAsB,MAAM;;AAC1B,qBAAW,UAAU,SAAS,iBAAiB,gBAAgB,GAAG;AAChE,kBAAM,OAAO,OAAO,cAAc,8BAA8B;AAChE,gBAAI,CAAC,KAAM;AACX,kBAAM,SAAS,OAAO,aAAa,cAAc;AACjD,kBAAM,QAAO7H,MAAA,IAAI,UAAJ,gBAAAA,IAAW,YAAY;AACpC,gBAAI,CAAC,KAAM;AACX,kBAAM,OAAiB,CAAA;AACvB,gBAAI,WAAW;AACf,uBAAW6H,MAAK,KAAK,WAAW,CAAA,GAAI;AAClC,kBAAIA,GAAE,SAAS,sCAAsC;AACnD,qBAAK,KAAK,aAAa;AAAA,cACzB,WAAWA,GAAE,SAAS,SAAS;AAC7B,qBAAK,KAAK,MAAM;AAAA,cAClB,WAAWA,GAAE,SAAS,UAAUA,GAAE,SAAS,2BAA2B;AACpE,qBAAK,KAAK,eAAe,gBAAgB,MAAM;AAC/C,2BAAW;AAAA,cACb,OAAO;AACL,qBAAK,KAAK,MAAM;AAAA,cAClB;AAAA,YACF;AACA,gBAAI,UAAU;AACZ,mBAAK,MAAM,mBAAmB,KAAK,KAAK,GAAG;AAAA,YAC7C;AAAA,UACF;AAAA,QACF,CAAC;AAED,kBAAI,WAAJ,mBAAY,SAAS,MAAM;AAE3B,iBAAS,cAAc,IAAI,YAAY,gCAAgC;AAAA,UACrE,QAAQ,EAAE,aAAA;AAAA,QAAa,CACxB,CAAC;AAAA,MACJ,CAAC;AAAA,IACH,CAAC;AAAA,EACH;AACF;AAGA,KAAI,SAAI,OAAJ,mBAAQ,UAAU;AACpB,yBAAA;AACF,OAAO;AAEL,QAAM,gBAAgB,YAAY,MAAM;;AACtC,SAAI7H,MAAA,IAAI,OAAJ,gBAAAA,IAAQ,UAAU;AACpB,6BAAA;AACA,oBAAc,aAAa;AAAA,IAC7B;AAAA,EACF,GAAG,GAAG;AACR;AAGA,SAAS,qBAAqB,MAAW;AACvC,QAAM,YAAY,SAAS,cAAc,KAAK;AAC9C,YAAU,KAAK,oBAAoB,KAAK,EAAE;AAC1C,YAAU,MAAM,QAAQ;AACxB,YAAU,MAAM,SAAS;AACzB,YAAU,MAAM,UAAU;AAC1B,YAAU,MAAM,gBAAgB;AAChC,YAAU,MAAM,WAAW;AAE3B,6BAA2B,SAAS;AAEpC,MAAI;AAEJ,QAAM,SAAS,KAAK;AAAA,IAClB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,MACE,WAAW;AACT,eAAO;AAAA,MACT;AAAA,MACA,SAASD,IAA6E;AACpF,wBAAgBA;AAChB,YAAI,OAAO,OAAO,eAAe,YAAY;AAC3C,iBAAO,WAAWA,EAAC;AAAA,QACrB;AAAA,MACF;AAAA,MACA,WAAW;AAAA,MACX,aAAa;AAAA,MACb,eAAe;AACb,eAAO;AAAA,MACT;AAAA,IAAA;AAAA,EACF;AAGF,QAAM,SAAS,UAAU,gBAAgB;AAAA,IACvC;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,WAAW,OAAO,cAAc,eAAe,UAAU;AAAA,EAAA,CAC1D;AAED,SAAO,IAAI,UAAU;AAAA,IACnB,UAAU;AAAA,IACV,QAAQ;AAAA,EAAA,CACT;AAED,SAAO,MAAM,SAAS;AACtB,UAAQ,IAAI,KAAK,KAAK,KAAO,MAAM;AAEnC,SAAO,oBAAoB,MAAM;AAC/B,UAAM,WAAW;AACjB,UAAM,YAAY;AAElB,WAAO,EAAE,WAAW,SAAA;AAAA,EACtB;AAEA,SAAO,WAAW,MAAM;AACtB,UAAM0I,UAAS,QAAQ,IAAI,KAAK,KAAK,GAAK;AAC1C,QAAIA,SAAQ;AACVA,cAAO,QAAA;AACP,cAAQ,OAAO,KAAK,KAAK,GAAK;AAAA,IAChC;AAAA,EACF;AAEA,SAAO,EAAE,OAAA;AACX;AAIA,SAAS,oCACP,MACA,YACA,WACA,eAAyC,CAAA,GACzC;;AACA,QAAM,qBAAqB,0BAA0B,UAAU;AAE/D,MAAI,YAAgC;AAEpC,QAAM,qBAAqB,SAAS;AAAA,IAClC;AAAA,EAAA;AAEF,aAAW,MAAM,oBAAoB;AACnC,QAAI,GAAG,SAAS,WAAW,GAAG;AAC5B,kBAAY;AACZ;AAAA,IACF;AAAA,EACF;AAEA,MAAI,CAAC,WAAW;AACd,UAAM,aAAa,OAAO,wCAAwC;AAClE,gBAAY,SAAS,cAAc,KAAK;AACxC,cAAU,KAAK,4BAA4B,UAAU;AACrD,cAAU,MAAM,QAAQ;AACxB,cAAU,MAAM,SAAS;AACzB,cAAU,MAAM,UAAU;AAC1B,cAAU,MAAM,gBAAgB;AAChC,cAAU,MAAM,WAAW;AAC3B,+BAA2B,SAAS;AAAA,EACtC;AAKA,QAAM,mBAAmB,EAAE,SAAS,OAAA;AAClC,YAAkB,kBAAkB;AAEtC,QAAM,iBAAiB,KAAK,UAAU,QAAQ,oBAAoB;AAAA,IAChE,SAAS;AAAA,IACT,gBAAgB;AAAA,EAAA,CACjB;AACD,iBAAe,QAAQ,gCAAgC,UAAU;AACjE,iBAAe,OAAO;AACtB,iBAAe,SAAS;AACxB,iBAAe,cAAc,MAAM,CAAC,GAAG,EAAE;AACzC,iBAAe,iBAAiB,MAAM,eAAe;AAErD,QAAM,SAAS,KAAK;AAAA,IAClB;AAAA,IACA,qBAAqB,UAAU,YAAA,CAAa;AAAA,IAC5C;AAAA,IACA;AAAA,MACE,WAAW;;AAET,cAAM,UAAU,OAAO,aAAYzI,MAAA,UAAkB,oBAAlB,gBAAAA,IAAmC;AACtE,gBAAO,mCAAS,UAAS;AAAA,MAC3B;AAAA,MACA,SAASD,IAAW;;AAElB,cAAM,UAAU,OAAO,aAAYC,MAAA,UAAkB,oBAAlB,gBAAAA,IAAmC;AACtE,YAAI,SAAS;AACX,kBAAQ,QAAQD,MAAK;AAErB,kBAAQ,cAAc,IAAI,YAAY,2CAA2C;AAAA,YAC/E,QAAQ,EAAE,OAAOA,MAAK,GAAA;AAAA,UAAG,CAC1B,CAAC;AAAA,QACJ,OAAO;AACH,iBAAe,gBAAgBA,MAAK;AAAA,QACxC;AAEA,YAAI,OAAO,OAAO,eAAe,YAAY;AAC3C,iBAAO,WAAWA,MAAK,EAAE;AAAA,QAC3B;AAAA,MACF;AAAA,MACA,WAAW;AAAA,MACX,aAAa;AAAA,MACb,eAAe;AACb,eAAO;AAAA,MACT;AAAA,MACA,GAAI,cAAc,WAAW;AAAA,QAC3B,eAAe;AACb,iBAAO;AAAA,QACT;AAAA,MAAA;AAAA,IACF;AAAA,EACF;AAEF,SAAO,iBAAiB;AAGxB,QAAM,eAAa,YAAAC,MAAA,IAAI,OAAJ,gBAAAA,IAAQ,aAAR,mBAAkB,oBAAlB,4BAAoC,uCAAsC;AAE7F,QAAM,YAAY,cAAc,UAAU,sCAAsC;AAEhF,QAAM,SAAS,UAAU,wBAAwB;AAAA,IAC/C;AAAA,IACA;AAAA,IACA;AAAA,IACA,aAAa,aAAa,eAAe;AAAA,IACzC,aAAa;AAAA,IACb;AAAA,IACA;AAAA,EAAA,CACD;AAED,SAAO,IAAI,UAAU;AAAA,IACnB,UAAU;AAAA,IACV,QAAQ;AAAA,EAAA,CACT;AAED,SAAO,MAAM,SAAS;AACtB,QAAM,SAAS,UAAU;AACzB,UAAQ,IAAI,QAAQ,MAAM;AAE1B,MAAI,WAAW;AACb,cAAU,MAAM,YAAY,GAAG,mCAAmC;AAAA,EACpE;AAEA,MAAI,cAAc,SAAS;AACzB;AAAA,MACE;AAAA,MACA;AAAA,MACA,OAAO,cAAc,eAAe,UAAU,iBAAiB;AAAA,IAAA;AAAA,EAEnE;AAEA,QAAM,aAAa,uBAAuB,QAAQ,MAAM;AACtD,YAAQ,OAAO,MAAM;AAAA,EACvB,CAAC;AAED,SAAO,WAAW,MAAM;AACtB,eAAA;AAAA,EACF;AAKA,QAAM,WAAW;AACjB,QAAM,YAAY,cAAc,UAAU,SAAY;AAEtD,SAAO,EAAE,QAAQ,UAAU,UAAA;AAC7B;AAEA,IAAI,kBAAkB;AAAA,EACpB,MAAM;AAAA,EAEJ,mBAAmB;AACnB,WAAO;AAAA;AAAA,MAEL,iBAAiB,MAAM;AACrB,eAAO,qBAAqB,IAAI;AAAA,MAClC;AAAA;AAAA,MAEA,kBAAkB,MAAM;AACtB,eAAO,2BAA2B,IAAI;AAAA,MACxC;AAAA;AAAA,MAEA,cAAc,MAAM;AAClB,eAAO,uBAAuB,IAAI;AAAA,MACpC;AAAA;AAAA;AAAA,MAGA,wBAAwB,MAAM;AAC5B,cAAM,UAAU,mBAAmB,IAAI,GAAG,KAAK,UAAU,OAAO,KAAK,CAAA;AACrE,eAAO,oCAAoC,MAAM,QAAQ,SAAS,OAAO;AAAA,MAC3E;AAAA;AAAA;AAAA,MAGA,yBAAyB,MAAM;AAC7B,cAAM,UAAU,mBAAmB,IAAI,GAAG,KAAK,UAAU,OAAO,KAAK,CAAA;AACrE,eAAO,oCAAoC,MAAM,QAAQ,UAAU,OAAO;AAAA,MAC5E;AAAA,IAAA;AAAA,EAEJ;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,sBAAsB,UAAU,UAAU;;AAC9C,UAAM,aAAa,SAAS;AAC5B,UAAM,SAAS,EAAE,IAAGA,MAAA,SAAS,UAAT,gBAAAA,IAAgB,UAAU,IAAG,cAAS,UAAT,mBAAgB,SAAA;AACjE,QAAI,wBAAwB;AAG5B,eAAW,CAAC,WAAW,QAAQ,KAAK,OAAO,QAAQ,MAAM,GAAG;AAE1D,UAAI,MAAM,QAAQ,QAAQ,KAAK,OAAO,SAAS,CAAC,MAAM,YAAY,SAAS,CAAC,EAAE,WAAW,oBAAoB,GAAG;AAE9G,cAAM,UAAU,SAAS,CAAC,KAAK,CAAA;AAC/B,2BAAmB,IAAI,GAAG,SAAS,IAAI,IAAI,SAAS,IAAI,OAAO;AAC/D,gCAAwB;AAAA,MAC1B;AAAA,IACF;AAEA,QAAI,uBAAuB;AACzB,YAAM,sBAAsB,SAAS,UAAU;AAC/C,YAAM,oBAAoB,SAAS,UAAU;AAE7C,eAAS,UAAU,cAAc,SAAU,YAAiB;AAC1D,mEAAqB,MAAM,MAAM;AAEjC,mBAAW,aAAa,WAAW,cAAc,CAAA;AACjD,cAAM,YAAY,2BAA2B,IAAI;AACjD,mBAAW,WAAW,gCAAgC,IAAI;AAAA,MAC5D;AAEA,eAAS,UAAU,YAAY,SAAU,MAAW;AAClD,0CAAkC,MAAM,IAAI;AAE5C,cAAM,eAAe,wCAAwC,OAAM,6BAAM,mBAAkB,CAAA,CAAE;AAE7F,YAAI,cAAc;AAChB,eAAK,iBAAiB,CAAC,GAAI,KAAK,kBAAkB,CAAA,GAAK,IAAI;AAAA,QAC7D;AAEA,eAAO,uDAAmB,MAAM,MAAM;AAAA,MACxC;AAAA,IACF;AAGA,QAAI,sBAAsB,SAAS,UAAU,GAAG;AAC9C,YAAM,wBAAwB,SAAS,UAAU;AAEjD,eAAS,UAAU,gBAAgB,WAAY;AAC7C,uEAAuB,MAAM,MAAM;AAGnC,cAAM,uBAAuB,eAAe,+BACxC,CAAC,oBAAiC,4BAA4B,MAAM,eAAe,IACnF;AAGJ,cAAM,eAAe,yBAAyB,MAAM,yBAAyB,oBAAoB;AACjG,+BAAuB,MAAM,YAAY;AAAA,MAC3C;AAAA,IACF;AAGA,QAAI,SAAS,SAAS,gCAAgC;AACpD,YAAM,gBAAgB,SAAS,UAAU;AAEzC,eAAS,UAAU,gBAAgB,WAAY;AAC7C,uDAAe,MAAM,MAAM;AAG3B,gCAAwB,IAAI;AAAA,MAC9B;AAAA,IACF;AAGA,QAAI,SAAS,SAAS,2BAA2B;AAC/C,YAAM,gBAAgB,SAAS,UAAU;AAEzC,eAAS,UAAU,gBAAgB,WAAY;AAC7C,uDAAe,MAAM,MAAM;AAG3B,6BAAqB,IAAI;AAAA,MAC3B;AAAA,IACF;AAAA,EACF;AACF,CAAC;","x_google_ignoreList":[0,1,2,3,4,5,6,7,8,9,10,11,12,13]} \ No newline at end of file diff --git a/web/comfyui/workflow_registry.js b/web/comfyui/workflow_registry.js index d1e40a87..83ac2d88 100644 --- a/web/comfyui/workflow_registry.js +++ b/web/comfyui/workflow_registry.js @@ -444,12 +444,18 @@ app.registerExtension({ * Load a workflow received from the backend onto the ComfyUI canvas. * * The payload (`detail`) is expected to be: - * { workflow: , name: , recipe_id: } + * { workflow: , name: , recipe_id: , + * lm_source?: { file_path: , sha256: } } * * Two formats are supported, detected by the presence of `class_type` * entries (API/prompt format: { node_id: { class_type, inputs } }) versus * the UI format ({ nodes: [...], links: [...] }). * + * When `lm_source` is present (workflow library "Open in ComfyUI"), the + * provenance marker is stamped onto the loaded graph's `extra` so the + * write-back entry point (LoraManager.WorkflowWriteback) can match the + * open graph against the managed document. + * * @param {Object} detail - message payload from the backend */ async loadWorkflowFromMessage(detail) { @@ -476,12 +482,33 @@ app.registerExtension({ const workflowName = detail.name || "Recipe Workflow"; + const lmSource = detail?.lm_source?.file_path + ? { + file_path: detail.lm_source.file_path, + sha256: detail.lm_source.sha256 || null, + } + : null; + try { if (isApiFormat) { await app.loadApiJson(workflow, workflowName); } else { + // UI format: the marker rides the document's `extra`, which + // loadGraphData restores onto the graph and serializes back — + // it survives tab switches and browser reloads with the draft. + if (lmSource) { + workflow.extra = { ...(workflow.extra || {}), lm_source: lmSource }; + } await app.loadGraphData(workflow, true, true, workflowName, { openSource: "file_button" }); } + // API format has no `extra` carrier, so stamp the live graph + // directly after the load. + if (lmSource && isApiFormat) { + const rootGraph = app.rootGraph ?? app.graph; + if (rootGraph) { + rootGraph.extra = { ...(rootGraph.extra || {}), lm_source: lmSource }; + } + } this._log("workflow loaded from backend message (%s): %s", isApiFormat ? "api" : "graph", workflowName); } catch (error) { console.error("LoRA Manager: failed to load workflow from backend message", error); diff --git a/web/comfyui/workflow_writeback.js b/web/comfyui/workflow_writeback.js new file mode 100644 index 00000000..7813072d --- /dev/null +++ b/web/comfyui/workflow_writeback.js @@ -0,0 +1,394 @@ +/** + * Write-back of the current ComfyUI graph into a LoRA Manager managed + * workflow ("Update LM-managed workflow"). + * + * Correspondence: when LoRA Manager pushes a library workflow into ComfyUI + * ("Open in ComfyUI"), workflow_registry.js stamps the provenance marker + * `extra.lm_source = { file_path, sha256 }` onto the loaded graph. The marker + * rides the graph serialization, so it survives tab switches and browser + * reloads together with the workflow draft. Entry points below are only + * usable while the active graph carries that marker. + * + * Dirty tracking: the first `graphChanged` event after a load/write-back + * flips `marker.dirty` (persisted inside the marker, so reloads keep it). + * `graphChanged` is dispatched by ComfyUI's ChangeTracker only when the + * serialized state actually changed, so selection/panning never dirties. + * + * Entry points: + * - A command (`LoraManager.UpdateManagedWorkflow`), reachable from the + * command palette and the top menu bar (File group). + * - An item injected into the workflow actions dropdown (the "Graph ▾" + * toggle menu). The frontend offers no extension API for that menu, so + * the item is appended via DOM observation of the menu's trigger; if the + * markup changes upstream the injection silently stops and the command + * remains as the fallback. + * - The LM web UI card context menu ("Update from ComfyUI"): the backend + * routes its request here over the `lm_collect_workflow` WS channel and + * awaits the outcome via `/api/lm/workflows/collect-result`. + * + * The active graph's link state is reported to the backend + * (`/api/lm/workflows/comfyui-state`) on load/tab-switch/dirty-flip/ + * write-back so the LM web UI can enable the menu entry only when the + * workflow is open in ComfyUI and has edits. + */ +import { app } from "../../scripts/app.js"; +import { api } from "../../scripts/api.js"; +import { lmUrl } from "./base_path.js"; +import { showToast } from "./utils.js"; + +const MARKER_KEY = "lm_source"; +const COMMAND_ID = "LoraManager.UpdateManagedWorkflow"; +const MENU_LABEL = "Update LM-managed workflow"; +const MENU_ICON = "pi pi-upload"; +// data-testid of the workflow actions dropdown trigger in ComfyUI_frontend +// (WorkflowActionsDropdown.vue). +const DROPDOWN_TRIGGER_TESTID = "view-mode-toggle"; + +function getRootGraph() { + return app.rootGraph ?? app.graph ?? null; +} + +/** + * The provenance marker of the active graph, or null when the open workflow + * was not loaded from the LoRA Manager library. + */ +export function getActiveLmSource() { + const marker = getRootGraph()?.extra?.[MARKER_KEY]; + if (!marker || typeof marker.file_path !== "string" || !marker.file_path) { + return null; + } + return marker; +} + +/** + * Serialize the current graph without the LM provenance marker: the marker + * is client-side bookkeeping and must not be persisted into the library + * document (the backend strips it too, defense in depth). + */ +function serializeWorkflowForWriteback() { + const graph = getRootGraph(); + const data = JSON.parse(JSON.stringify(graph.serialize())); + if (data.extra && typeof data.extra === "object") { + delete data.extra[MARKER_KEY]; + } + return data; +} + +async function requestWriteback(marker, { force = false } = {}) { + const response = await fetch(lmUrl("/api/lm/workflows/content"), { + method: "PUT", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify({ + file_path: marker.file_path, + workflow: serializeWorkflowForWriteback(), + base_sha256: marker.sha256 || "", + force, + }), + }); + let payload = null; + try { + payload = await response.json(); + } catch (_error) { + payload = null; + } + return { status: response.status, payload }; +} + +/** + * Report the active graph's link state to the LM backend (null state when + * the active graph is not LM-linked). Best-effort: failures are silent so a + * missing/older backend never spams the console. + */ +export async function reportLinkState() { + const marker = getActiveLmSource(); + try { + await fetch(lmUrl("/api/lm/workflows/comfyui-state"), { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify({ + client_id: api.clientId ?? api.initialClientId ?? "", + state: marker + ? { + file_path: marker.file_path, + sha256: marker.sha256 || null, + dirty: marker.dirty === true, + } + : null, + }), + }); + } catch (_error) { + // Backend unreachable or older version without the endpoint. + } +} + +/** + * Core write-back: PUT the current graph into the managed document. + * Returns { success, sha256? , error? }. On success the marker is refreshed + * (new hash, dirty cleared) and the new state is reported. On 409 the user + * is asked to confirm the overwrite when `askOnConflict` is set. + */ +async function performWriteback(marker, { askOnConflict = true } = {}) { + let result; + try { + result = await requestWriteback(marker); + } catch (error) { + return { success: false, error: error.message }; + } + + if (result.status === 409) { + if (!askOnConflict) { + return { success: false, error: "conflict" }; + } + const overwrite = window.confirm( + "The library copy of this workflow has changed since it was opened.\n" + + "Overwrite the LoRA Manager copy with the current graph?" + ); + if (!overwrite) { + return { success: false, error: "cancelled" }; + } + try { + result = await requestWriteback(marker, { force: true }); + } catch (error) { + return { success: false, error: error.message }; + } + } + + if (result.payload?.success) { + if (result.payload.sha256) { + marker.sha256 = result.payload.sha256; + } + marker.dirty = false; + reportLinkState(); + return { success: true, sha256: result.payload.sha256 ?? null }; + } + return { + success: false, + error: result.payload?.error || `HTTP ${result.status}`, + }; +} + +/** + * Write the active graph back into its LoRA Manager managed workflow + * document. No-op (with a warning toast) when the graph carries no marker. + */ +export async function updateManagedWorkflow() { + const marker = getActiveLmSource(); + if (!marker) { + showToast({ + severity: "warn", + summary: "LoRA Manager", + detail: "This workflow is not linked to the LoRA Manager library. Open it via LoRA Manager first.", + life: 5000, + }); + return; + } + + const result = await performWriteback(marker); + if (result.success) { + showToast({ + severity: "success", + summary: "LoRA Manager", + detail: "Workflow updated in the LoRA Manager library.", + life: 3000, + }); + } else if (result.error !== "cancelled") { + showToast({ + severity: "error", + summary: "LoRA Manager", + detail: `Failed to update the managed workflow: ${result.error}`, + life: 5000, + }); + } +} + +/** + * Answer an LM-web-UI "Update from ComfyUI" request. Only the tab whose + * active graph marker matches the requested file_path responds; the outcome + * is posted back to the backend, which resolves the pending LM-page request. + */ +async function handleCollectRequest(detail) { + const requestId = detail?.request_id; + const filePath = detail?.file_path; + if (!requestId || !filePath) { + return; + } + const marker = getActiveLmSource(); + if (!marker || marker.file_path !== filePath) { + return; + } + + const result = marker.dirty + ? await performWriteback(marker) + : { success: false, error: "no_changes" }; + + try { + await fetch(lmUrl("/api/lm/workflows/collect-result"), { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify({ request_id: requestId, ...result }), + }); + } catch (error) { + console.error("LoRA Manager: failed to post collect result", error); + } +} + +// --------------------------------------------------------------------------- +// Workflow actions dropdown injection +// --------------------------------------------------------------------------- + +const ITEM_CLASSES = + "flex min-h-6 items-center gap-2 self-stretch rounded-sm p-2 outline-none"; +const ITEM_ACTIVE_CLASSES = "cursor-pointer hover:bg-secondary-background-hover"; +const ITEM_DISABLED_CLASSES = "cursor-default opacity-50"; +const SEPARATOR_CLASSES = "my-1 w-full border-b border-border-subtle"; + +function buildMenuItem() { + const linked = getActiveLmSource() !== null; + + const separator = document.createElement("div"); + separator.className = SEPARATOR_CLASSES; + separator.setAttribute("role", "separator"); + + const item = document.createElement("div"); + item.setAttribute("role", "menuitem"); + item.className = `${ITEM_CLASSES} ${linked ? ITEM_ACTIVE_CLASSES : ITEM_DISABLED_CLASSES}`; + if (!linked) { + item.setAttribute("aria-disabled", "true"); + item.title = "Only available for workflows opened from LoRA Manager"; + } + + const icon = document.createElement("i"); + icon.className = MENU_ICON; + const label = document.createElement("span"); + label.className = "flex-1"; + label.textContent = MENU_LABEL; + item.append(icon, label); + + if (linked) { + item.addEventListener("click", () => { + // Our node is not a reka-ui DropdownMenuItem, so the menu does not + // close on its own — close it the way Escape would. + const menu = item.closest('[role="menu"]'); + (menu ?? document).dispatchEvent( + new KeyboardEvent("keydown", { key: "Escape", bubbles: true }) + ); + updateManagedWorkflow(); + }); + } + + return [separator, item]; +} + +/** + * Append the write-back item to an open workflow actions menu, once per + * menu instance (the portal remounts on every open). + */ +function injectIntoMenu(menuElement) { + if (menuElement.dataset.lmWritebackInjected) { + return; + } + menuElement.dataset.lmWritebackInjected = "1"; + for (const node of buildMenuItem()) { + menuElement.appendChild(node); + } +} + +function findOpenWorkflowMenu() { + // The workflow actions menu is the reka-ui dropdown containing the + // core items (pencil = Rename, save = Save, download = Export); icon + // classes are locale-independent. + for (const menu of document.querySelectorAll('[role="menu"]')) { + if ( + menu.querySelector(".pi-pencil") && + menu.querySelector(".pi-save") && + menu.querySelector(".pi-download") + ) { + return menu; + } + } + return null; +} + +function installDropdownInjection() { + let pollTimer = null; + const scheduleInjection = () => { + if (pollTimer != null) { + clearTimeout(pollTimer); + } + // The portal mounts asynchronously after the trigger click; poll + // briefly instead of assuming a fixed delay. + let attempts = 0; + const poll = () => { + pollTimer = null; + const menu = findOpenWorkflowMenu(); + if (menu) { + injectIntoMenu(menu); + return; + } + attempts += 1; + if (attempts < 10) { + pollTimer = setTimeout(poll, 50); + } + }; + pollTimer = setTimeout(poll, 0); + }; + + // The trigger itself mounts late (frontend boot) and can remount on mode + // switches, so observe its appearance and hook clicks on it. + const hookTrigger = () => { + const trigger = document.querySelector(`[data-testid="${DROPDOWN_TRIGGER_TESTID}"]`); + if (trigger && !trigger.dataset.lmWritebackHooked) { + trigger.dataset.lmWritebackHooked = "1"; + trigger.addEventListener("click", scheduleInjection); + } + }; + + const observer = new MutationObserver(() => hookTrigger()); + observer.observe(document.body, { childList: true, subtree: true }); + hookTrigger(); +} + +app.registerExtension({ + name: "LoraManager.WorkflowWriteback", + + commands: [ + { + id: COMMAND_ID, + label: MENU_LABEL, + menubarLabel: MENU_LABEL, + icon: MENU_ICON, + function: () => updateManagedWorkflow(), + }, + ], + + menuCommands: [{ path: ["File"], commands: [COMMAND_ID] }], + + setup() { + try { + installDropdownInjection(); + } catch (error) { + console.warn("LoRA Manager: workflow dropdown injection unavailable", error); + } + + // graphChanged is dispatched by ComfyUI's ChangeTracker only when the + // serialized state actually changed: the first one after a load or + // write-back is a genuine user edit. + api.addEventListener("graphChanged", () => { + const marker = getActiveLmSource(); + if (marker && marker.dirty !== true) { + marker.dirty = true; + reportLinkState(); + } + }); + + api.addEventListener("lm_collect_workflow", (event) => + handleCollectRequest(event?.detail ?? {}) + ); + }, + + // Fires on initial load, workflow open, and tab switch: report which + // LM-managed workflow (if any) is active now. + afterConfigureGraph() { + reportLinkState(); + }, +});