From 00284d92da988d6b1c36fc4693d6704ae6dc190b Mon Sep 17 00:00:00 2001 From: Vito Date: Fri, 3 Apr 2026 18:26:23 -0700 Subject: [PATCH] =?UTF-8?q?feat:=20LoraManager=20integration=20=E2=80=94?= =?UTF-8?q?=20trigger=20words=20&=20example=20import=20(#52)=20(#136)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat: add LoRA utility module for LoraManager integration (#52) Detection, metadata reading, trigger word cache, and prompt injection for ComfyUI-Lora-Manager. All functions return empty results when LoraManager is not installed. * feat: add IntegrationConfig for opt-in third-party integrations (#52) * feat(api): add LoraManager integration endpoints (#52) Detection, enable/disable, scan/import, trigger word lookup, and cache refresh endpoints under /prompt_manager/lora/*. * feat: inject LoRA trigger words into prompts at encoding time (#52) When enabled, scans for tags in prompt text and appends trigger words from LoraManager metadata. Behind config toggle. * feat(ui): add LoraManager integration settings and import UI (#52) Integrations section in settings with auto-detection badge, enable toggle, trigger word toggle, and Import LoRA Data button. * fix: detect LoraManager with case-insensitive directory scan (#52) * fix: simplify LoraManager heuristic to match real install structure (#52) * fix: find ComfyUI root via folder_paths and handle symlinked installs (#52) * fix(ui): add pointer-events-none to toggle switch overlays (#52) The styled div was intercepting clicks meant for the sr-only checkbox input, preventing toggle switches from being clickable. * fix: use lora-manager category and tag for imported LoRA data (#52) * fix: use rglob to find metadata in lora subdirectories (#52) * feat: discover LoRA dirs from extra_model_paths.yaml and folder_paths (#52) Only models/loras under the ComfyUI root was checked. Now also parses extra_model_paths.yaml and uses folder_paths.get_folder_paths('loras') at runtime to find all configured LoRA directories. * fix: use example prompts instead of trigger words, serve LoRA preview images (#52) - Prompt text now uses civitai example prompts (images[].meta.prompt) when available, falling back to model name instead of trigger words - Image serving now allows paths within LoRA directories when the integration is enabled, fixing 403 errors on preview images * fix: handle null civitai field, link all preview images (#52) - Guard against civitai: null in metadata (was crashing the scan) - Link all local preview images per LoRA, not just the first - Add get_civitai_image_urls() for future remote image support * feat: reimport clears previous lora-manager data first (#52) Clicking Import LoRA Data now deletes all existing lora-manager category prompts before scanning, ensuring a clean reimport. * feat: download civitai example images during LoRA import (#52) Images from civitai.images[] are downloaded to data/lora_images/ cache and linked to prompts alongside local preview files. Cached files are reused on reimport. Image serving allows the cache directory. * feat: add CivitAI API key setting for authenticated image downloads (#52) Most civitai example images (especially NSFW) require authentication. Adds API key field to the Integrations settings panel, passed as Bearer token when downloading example images. * feat(ui): add progress modal for LoRA import (#52) Closes settings modal and shows a dedicated progress modal with progress bar, status text, and processed/imported counts during LoRA import. Auto-closes after completion. * fix: reduce download timeout to 5s, update progress per LoRA (#52) 5K images at 15s timeout was painfully slow. Reduced to 5s fail-fast. Progress now updates for every LoRA with image count, not every 5th. * perf: use 512px thumbnails and parallel downloads for LoRA images (#52) Full-size civitai images averaged 5.6MB each (27GB total for 5K images). Now requests /width=512/ thumbnails (~50-100KB) and downloads 8 in parallel per LoRA. Expected speedup: ~100x smaller + 8x parallel. * fix: resize downloaded images to 512px thumbnails locally (#52) Civitai CDN returns 401 for /width=N/ thumbnail URLs with API key auth. Instead, download the original and resize to 512px via PIL before saving. Reduces disk usage from ~5MB to ~30-50KB per image. * docs: update README for v3.2.1 LoRA Manager integration (#52) - Add LoRA Manager integration section with setup guide and CivitAI key docs - Add folder filter section with rescan note for existing libraries - Add v3.2.1 changelog entry, split from v3.2.0 - Add WIP notice for LoRA Manager feature - Update AutoTag section to include WD14 models - Fix stale references (KikoTextEncode, outdated file structure) - Remove dated v2 development note - Add screenshots for settings, integration, and filtered results - Fix code review items: remove unused constant, add comments to empty excepts - Bump version to 3.2.1 * test: add unit tests for LoRA integration and folder filter (#52) - test_lora_utils.py: 32 tests covering trigger word extraction, example prompts, image URLs, metadata parsing, cache dir, TriggerWordCache - test_lora_database.py: 17 tests covering delete_prompts_by_category, folder filter search, get_prompt_subfolders, LoRA import workflow - test_config.py: 7 new IntegrationConfig tests for structure, enable, partial update, reset, and roundtrip * fix: remove unused MagicMock import in test_lora_utils (#52) --- .gitignore | 1 + README.md | 131 +++++-- database/operations.py | 32 ++ images/pm-lora-enabled.png | Bin 0 -> 50945 bytes images/pm-lora-filtered.png | Bin 0 -> 38620 bytes images/pm-lora-import.png | Bin 0 -> 38408 bytes images/pm-lora-results.png | Bin 0 -> 34717 bytes images/pm-settings-integrations.png | Bin 0 -> 45680 bytes prompt_manager.py | 3 + prompt_manager_base.py | 39 ++ prompt_manager_text.py | 3 + py/api/__init__.py | 3 + py/api/images.py | 28 +- py/api/lora_integration.py | 419 ++++++++++++++++++++++ py/config.py | 42 +++ py/lora_utils.py | 529 ++++++++++++++++++++++++++++ pyproject.toml | 2 +- tests/test_config.py | 86 ++++- tests/test_lora_database.py | 253 +++++++++++++ tests/test_lora_utils.py | 316 +++++++++++++++++ web/admin.html | 76 ++++ web/js/admin.js | 165 +++++++++ 22 files changed, 2090 insertions(+), 38 deletions(-) create mode 100644 images/pm-lora-enabled.png create mode 100644 images/pm-lora-filtered.png create mode 100644 images/pm-lora-import.png create mode 100644 images/pm-lora-results.png create mode 100644 images/pm-settings-integrations.png create mode 100644 py/api/lora_integration.py create mode 100644 py/lora_utils.py create mode 100644 tests/test_lora_database.py create mode 100644 tests/test_lora_utils.py diff --git a/.gitignore b/.gitignore index 9248013..59734d7 100644 --- a/.gitignore +++ b/.gitignore @@ -9,6 +9,7 @@ AGENTS.md CLAUDE.md # Local files +data/ docs/ logs/ standalone_tagger.py diff --git a/README.md b/README.md index d68effd..5f960f9 100644 --- a/README.md +++ b/README.md @@ -6,13 +6,7 @@ ![Tests](https://github.com/ComfyAssets/ComfyUI_PromptManager/workflows/Tests/badge.svg) ![Code Quality](https://github.com/ComfyAssets/ComfyUI_PromptManager/workflows/Code%20Quality/badge.svg) -A comprehensive ComfyUI custom node that extends the standard text encoder with persistent prompt storage, advanced search capabilities, automatic image gallery system, and powerful ComfyUI workflow metadata analysis using SQLite. - -## 📋 A Note on v2 Development - -V2 development will take longer as life has taken me in other directions for the moment. I will still work on it but not as actively as before. In the meantime, I will backport some of the features users have requested from v2 over to v1. Once v2 is ready, I will update here. Thank you for your continued support! - ---- +A comprehensive ComfyUI custom node that extends the standard text encoder with persistent prompt storage, advanced search capabilities, automatic image gallery system, folder-based organization, LoRA Manager integration, and powerful ComfyUI workflow metadata analysis using SQLite. ## Overview @@ -54,6 +48,7 @@ Both nodes include the complete PromptManager feature set: - **💾 Persistent Storage**: Automatically saves all prompts to a local SQLite database - **🔍 Advanced Search**: Query past prompts with text search, category filtering, and metadata +- **📁 Folder Filter**: Browse and filter prompts by output subdirectory - **🖼️ Automatic Image Gallery**: Automatically links generated images to their prompts - **🏷️ Rich Metadata**: Add categories, tags, ratings, notes, and workflow names to prompts - **🚫 Duplicate Prevention**: Uses SHA256 hashing to detect and prevent duplicate storage @@ -62,7 +57,8 @@ Both nodes include the complete PromptManager feature set: - **🔬 Workflow Analysis**: Extract and analyze ComfyUI workflow data from PNG images - **📋 Metadata Viewer**: Standalone tool for analyzing ComfyUI-generated images - **🛠️ System Management**: Built-in diagnostics, backup/restore, and maintenance tools -- **🏷️ AI AutoTag**: Automatically tag your image collection using JoyCaption vision models +- **🏷️ AI AutoTag**: Automatically tag your image collection using WD14 or JoyCaption vision models +- **🔗 LoRA Manager Integration**: Import LoRA metadata and preview images from [ComfyUI-Lora-Manager](https://github.com/willchil/ComfyUI-Lora-Manager) ![Image Gallery](images/pm-02.png) @@ -372,10 +368,11 @@ Import existing ComfyUI images into your database: ### 🏷️ AI AutoTag -Automatically tag your entire image collection using JoyCaption vision models: +Automatically tag your entire image collection using AI vision models: #### **Model Options** +- **WD14 SwinV2 / WD14 ViT**: Fast ONNX-based classifiers (~400MB) that output Danbooru tags with confidence scores — no prompt needed, adjustable confidence thresholds - **JoyCaption Beta One FP16**: Full precision model for highest quality tagging (requires more VRAM) - **JoyCaption Beta One GGUF (FP8)**: Quantized model for lower VRAM usage with minimal quality loss @@ -417,6 +414,61 @@ Adjust the system prompt to match your tagging style: - Models are downloaded automatically on first use - Feature requests and improvements are welcome! +### 📁 Folder Filter + +![Folder Filter](images/pm-lora-import.png) + +Organize and filter your prompt library by output subdirectory. The dashboard search panel includes a **Folder** dropdown that lists all subdirectories where your images are stored. + +- **Automatic Detection**: Folders are extracted from your image paths — no configuration needed +- **Multi-Directory Support**: Works across all configured gallery scan directories +- **Quick Filtering**: Select a folder from the dropdown to instantly filter prompts to that subdirectory + +> **Note:** If you have an existing prompt library from before the folder feature was added, you will need to **rescan your image library** (click **Scan Images** in the admin dashboard) to populate folder data for your existing prompts. + +### 🔗 LoRA Manager Integration + +![LoRA Settings](images/pm-settings-integrations.png) + +If you use [ComfyUI-Lora-Manager](https://github.com/willchil/ComfyUI-Lora-Manager), PromptManager can import your LoRA metadata, trigger words, and example images directly into your prompt database. This lets you search, tag, and browse your LoRA collection alongside your regular prompts. + +> **WIP:** LoRA Manager support is a work in progress — this was a highly requested feature. Please [open issues](https://github.com/ComfyAssets/ComfyUI_PromptManager/issues) for any bugs or feature requests. + +#### **Enabling the Integration** + +1. Open the admin dashboard and click **Settings** +2. Scroll to the **Integrations** section — PromptManager will auto-detect if LoRA Manager is installed + +![LoRA Enabled](images/pm-lora-enabled.png) + +3. Toggle the **LoraManager** switch to enable +4. Optionally enable **Auto-inject trigger words** to automatically append LoRA trigger words when `` is detected in your prompts +5. Click **Save Settings** (requires a ComfyUI restart to take effect) + +#### **Importing LoRA Data** + +Click **Import LoRA Data** in the settings panel to start the import. A progress popup shows real-time status as each LoRA is processed: + +- Scans all LoRA directories (including `extra_model_paths.yaml` paths) for metadata +- Downloads example images from CivitAI as 512px thumbnails +- Creates a prompt entry for each LoRA with trigger words, example prompts, and preview images +- All imported LoRAs are tagged with `lora-manager` category for easy filtering + +![LoRA Results](images/pm-lora-filtered.png) + +After import, filter by the `lora-manager` category to browse your LoRA collection. + +#### **CivitAI API Key (Optional)** + +A CivitAI API key is **required if your library contains NSFW LoRAs** — CivitAI blocks unauthenticated access to NSFW preview images. Without a key, only SFW preview images are downloaded. + +To add your key: +1. Get your API key from [civitai.com/user/account](https://civitai.com/user/account) +2. Paste it into the **CivitAI API Key** field in the Integrations settings +3. Save and re-import to download any previously skipped images + +> **Note:** Re-importing is safe — PromptManager skips LoRAs that were already imported. To do a fresh import, the previous `lora-manager` data is cleared automatically before re-scanning. + ### 🌐 Web Interface Features The comprehensive web interface provides: @@ -600,8 +652,9 @@ CREATE TABLE generated_images ( - **`prompt_search_list.py`** - Batch search node implementation (LIST output) - **`database/models.py`** - Database schema and connection management - **`database/operations.py`** - CRUD operations and search functionality -- **`py/api.py`** - Web API endpoints for the interface +- **`py/api/`** - Web API route modules (prompts, images, tags, lora integration, etc.) - **`py/config.py`** - Configuration management +- **`py/lora_utils.py`** - LoRA Manager integration utilities - **`utils/hashing.py`** - SHA256 hashing for deduplication - **`utils/validators.py`** - Input validation and sanitization - **`utils/image_monitor.py`** - Automatic image detection system @@ -611,7 +664,8 @@ CREATE TABLE generated_images ( - **`utils/diagnostics.py`** - System diagnostics and health checks - **`web/admin.html`** - Advanced admin dashboard with metadata panel - **`web/index.html`** - Simple web interface -- **`web/prompt_manager.js`** - JavaScript functionality +- **`web/js/prompt_manager.js`** - Dashboard JavaScript +- **`web/js/tags-page.js`** - Tag management JavaScript - **`web/metadata.html`** - Standalone PNG metadata viewer ### File Structure @@ -628,8 +682,9 @@ ComfyUI_PromptManager/ │ └── operations.py # Database operations ├── py/ │ ├── __init__.py -│ ├── api.py # Web API endpoints -│ └── config.py # Configuration +│ ├── api/ # Web API route modules +│ ├── config.py # Configuration +│ └── lora_utils.py # LoRA Manager integration ├── utils/ │ ├── __init__.py │ ├── hashing.py # Hashing utilities @@ -641,9 +696,12 @@ ComfyUI_PromptManager/ │ └── diagnostics.py # System diagnostics ├── web/ │ ├── admin.html # Advanced admin dashboard +│ ├── gallery.html # Image gallery │ ├── index.html # Simple web interface │ ├── metadata.html # Standalone metadata viewer -│ └── prompt_manager.js # JavaScript functionality +│ └── js/ +│ ├── prompt_manager.js # Dashboard JavaScript +│ └── tags-page.js # Tag management JavaScript ├── tests/ │ ├── __init__.py │ └── test_basic.py # Test suite @@ -752,7 +810,7 @@ db.model.backup_database("backup_prompts.db") ### Running Tests ```bash -cd KikoTextEncode +cd ComfyUI_PromptManager python -m pytest tests/ -v ``` @@ -797,7 +855,7 @@ The project follows PEP 8 guidelines with: For debugging, you can enable verbose logging in the node: ```python -# Add to kiko_text_encode.py +# Add to prompt_manager.py import logging logging.basicConfig(level=logging.DEBUG) ``` @@ -814,15 +872,15 @@ MIT License - see LICENSE file for details. ## Roadmap -### Completed in v3.0.0 +### Recently Completed -- **✅ PNG Metadata Analysis**: Complete ComfyUI workflow extraction from images -- **✅ Standalone Metadata Viewer**: Dedicated tool for analyzing any ComfyUI image -- **✅ Advanced Admin Dashboard**: Comprehensive management interface with modern UI -- **✅ Integrated Metadata Panel**: Real-time workflow analysis in image viewer -- **✅ Bulk Image Scanning**: Mass import of existing ComfyUI images -- **✅ System Management Tools**: Backup, restore, diagnostics, and maintenance -- **✅ Enhanced Error Handling**: Robust PNG parsing with NaN value cleaning +- **✅ LoRA Manager Integration**: Import LoRA metadata, trigger words, and preview images +- **✅ Folder Filter**: Browse and filter prompts by output subdirectory +- **✅ Multi-Directory Gallery**: Scan multiple output directories simultaneously +- **✅ WD14 Tagger**: Fast ONNX-based auto-tagging with Danbooru tags +- **✅ Tailwind v4 Migration**: ComfyUI theme token system for consistent styling +- **✅ Tag Management Page**: Dedicated page for tag search, rename, merge, and delete +- **✅ Junction Table Tags**: Normalized tag storage with proper foreign keys ### Planned Features @@ -830,19 +888,28 @@ MIT License - see LICENSE file for details. - **🤝 Collaboration**: Share prompt collections with other users - **🧠 AI Suggestions**: Recommend similar prompts based on metadata analysis - **📈 Advanced Analytics**: Detailed usage statistics and trends with workflow insights -- **🔌 Plugin System**: Support for third-party extensions and custom analyzers -- **🎨 Enhanced Batch Processing**: Advanced bulk operations with metadata editing - **🔄 Workflow Templates**: Save and reuse common workflow patterns - **📊 Visual Analytics**: Charts and graphs for prompt effectiveness analysis -### Integration Ideas - -- **Workflow linking**: Connect prompts to specific workflow templates -- **Image analysis**: Analyze generated images to improve suggestions -- **Version control**: Track prompt iterations and effectiveness - ## Changelog +### v3.2.1 (LoRA Manager Integration) + +- **🔗 LoRA Manager Integration**: Import LoRA metadata, trigger words, and CivitAI example images from [ComfyUI-Lora-Manager](https://github.com/willchil/ComfyUI-Lora-Manager) into your prompt database +- **💉 Auto-Inject Trigger Words**: Optionally append LoRA trigger words when `` is detected in prompts during encoding +- **🔑 CivitAI API Key Support**: Authenticate with CivitAI to download NSFW preview images +- **📥 Import Progress Modal**: Real-time SSE streaming progress during LoRA import with per-model status + +> **Note:** LoRA Manager support is a WIP — this was a highly requested feature. Please [open issues](https://github.com/ComfyAssets/ComfyUI_PromptManager/issues) for any bugs or feature requests. + +### v3.2.0 (Folder Filter & QoL Improvements) + +- **📁 Folder Filter**: New folder dropdown in the search panel to filter prompts by output subdirectory +- **📂 Multi-Directory Gallery Scan**: Configure multiple output directories and browse them all in one gallery +- **🖼️ Filmstrip Prompt Display**: Show prompt text and copy button in the filmstrip image viewer +- **🖱️ Click-to-Close Viewer**: Click outside the image viewer to close it +- **🐛 Bug Fixes**: Fixed database path config, UnboundLocalError in text inputs, node caching skip, diagnostics singleton lifecycle + ### v3.1.0 (WD14 Tagger, Tailwind v4 & Major Refactors) - **🏷️ WD14 Tagger Support**: Added WD14 SwinV2 and WD14 ViT as new auto-tag model options — fast ONNX-based classifiers (~400MB) that output Danbooru tags with confidence scores, no prompt needed diff --git a/database/operations.py b/database/operations.py index ad9b6ae..ce48a29 100644 --- a/database/operations.py +++ b/database/operations.py @@ -444,6 +444,38 @@ class PromptDatabase: conn.commit() return cursor.rowcount > 0 + def delete_prompts_by_category(self, category: str) -> int: + """Delete all prompts with the given category. + + Returns: + Number of prompts deleted. + """ + with self.model.get_connection() as conn: + # Get IDs first for cascade cleanup + ids = [ + r[0] + for r in conn.execute( + "SELECT id FROM prompts WHERE category = ?", (category,) + ).fetchall() + ] + if not ids: + return 0 + placeholders = ",".join("?" * len(ids)) + conn.execute( + f"DELETE FROM generated_images WHERE prompt_id IN ({placeholders})", + ids, + ) + conn.execute( + f"DELETE FROM prompt_tags WHERE prompt_id IN ({placeholders})", + ids, + ) + cursor = conn.execute( + f"DELETE FROM prompts WHERE id IN ({placeholders})", + ids, + ) + conn.commit() + return cursor.rowcount + def get_all_categories(self) -> List[str]: """ Get all unique categories from the database. diff --git a/images/pm-lora-enabled.png b/images/pm-lora-enabled.png new file mode 100644 index 0000000000000000000000000000000000000000..a4a2f65481c5fefd916143159e2f6cf64610c316 GIT binary patch literal 50945 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 literal 0 HcmV?d00001 diff --git a/images/pm-lora-filtered.png b/images/pm-lora-filtered.png new file mode 100644 index 0000000000000000000000000000000000000000..adc1391efaf16d857544371a0814049dbd68e900 GIT binary patch literal 38620 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 Ax&QzG literal 0 HcmV?d00001 diff --git a/images/pm-lora-import.png b/images/pm-lora-import.png new file mode 100644 index 0000000000000000000000000000000000000000..0e118fd28cffe620c79480768caea4aeaf430404 GIT binary patch literal 38408 zcmb@uWmFtnv^AO#B0vafBm@hgaS!egX`l)2jRn^r!5tEUG_JuVxQ5^^!7aE1cXxvO zxBJ|8?vwHE`|cg%F~<3Ex~r;ps@7g>&bj6)e>oX(Y)oRzJ9qA2OTb|YckbMKdFKw= z-A8EP6X9=C&+puMdPf5GM#(90d*)%R(#rYifpG<4#T`j2$vx!&v>|34eAl0YIfGPU z`d73+{i)3g{Nqi6&T9(pPa>d)V1kRch$qXoQHKTU%7`OXPE3 zonG_UUHdIH9!Bvl2nqhqWMd(yzeWWwYA6)CX#Bni2L7(3Frrakr_eXyf^QEvs1e{> zs7DsMB>1+qKT5|Rb#fdo6Y69U#sB-sOs$>%+u0)58=kk9a~f9l;86| zW+xeeE65P@MMjjceC+x)xSVq&z#scMPx}5=7j269pF*;GZEbCrCp#LA9@h`a-NNGH zOubk*Igd(uSTrikCw#FkDLUi1nU#Y`i3^{!{+v zLysZ_1;t2BmUKe9wo&6^03(fTvXrjTNRB)izun7VM4i(?jr~?^xSGS>?DcAb)nwVm zkILEi5)#grJC&%Xb#``E{_#)4elym@#6*i9PUFqRR@}T*D>~Yu4fB}gRv6+w9r-SdcfK_*Mw4}zQ&Hr8U}U;gr`$R~6*Cl~vBPU6O^ zseDF`M{T(n%C7#5OgARO=wg+=HM~RySKq&0>ipI0u-q2mo%xLK@Wl>sq^)&Nd#I)U z%e|m1ia1dp_eIS((QvFGy#^V5uZTygyUx9#C!sh(N>2~l!uNkvXZdcr;5@6hGMtiE zSR7I9blt65deW_q9}S1?*6s-pVLiaa!pd#Ex;bs6O|mhft)HimElw=$h+~{9IoRKy;(&T( z@e#R@OH^H$h5n_qD8rN?*j_pe+oW4do#``r?;KYrw!1OsH0HY*Y-oh}U$UHhy@%1i zP3Mo*Lq6Q9l$N7GSyI{RS1HBT$iLt+=5Zi|*Bkul|IT_t&og0>&IG zzWXly1`ul zhyG;zz^d-xLBi=`Agl1-PD*pWbL{f85HbM;at3DR>&Dy5M(yiO)e-N+m9XBTT&b>A z_rqSE!_{7n-3CcxG=(m4a`!0A;XY85UC&eXUVm zLqpwW)&`F=6!Fcs;aRl7a5%ikpV0hEHw`v^K&O_VYe%;(1`!dFUH%}JSiI=%cj;=< zWg$EoDV@X4uJHE=KP1VmXdIvZ?*XsOn-R;)f(AFr@wamR&XC1@~8}@WhCMzA8qI`}glV zU~T+4OpH0;{$s!rppaoXlIc|Cxc5OtTDM;*qgm@21d>~+>D)$Lyn^>LLQEIG*dzAk zsoznLeOarwvI}Dc?IpOhN$Dnl?fWAKySs>(o)22Pfq5xE^arT~dKkINsYPD5U| z%t8fTE3UHz(%eQ5*KZCJ{|Fz!{M%$?f8+!Rj5&|pP+O;t4_Dh7^Y77-ITuD9Ar-LI zh|jT|Nu0;m2h)WJ^*C^O4f(>j!z06ed12~uqu-$n2jf-o$O2*n-zi**FIw}>L7~yx~-E`($aj_aAG>JQ8I?ba2^ybqtTUJ z^6XWEy$+X^Z>rB&G)*MmjHYcxHqLq8ULS1?Z^YULApCG*+||EC;B+Ng&zbK2e(N0C zII;l$s#5bqt2TPMVA6i#=1s^fP2~@b%1L))=A$FF=^q+Au5ck&ZV==$b_*J|ZlpvN zl`r-59om_9FeB3?p_)E3dL@=7Bto=YRC67zc?yNNC6(KWhw(8rhk-+%2ydmZ@1G=0 z(_1Gw&N|!C2p_cKDSd>$fpejXjG`^bBB&y#hTn3y)?a!2Ji$WKX~73n(k#|(kYXIN zv@6Vsj*Fg<@h>kg4_FuvLjoD_Wy2{3ZN>K%V%hZFChjBN*(k(G1Q)5SW+d^q+n4*;PUY> zUzEOUKU)Zl)0-0s6A`B0neEGzrhI!!*eX&vtc)l%Q_*2W*a^;nXQ1tQ%_W)z0F>gH z^K!WOcKv%UF8j@q%1B~mqOIqOkdAsO9rs*js)_6A?hJ>~?@!4t7aQ4sern6|1!q`vN71*Z zi|n4SrFepD+4V~-gp|*2T@E+Pj1eJaI_;>&H}TDSF2ib?XFEGP`}X*!XJ*xCg@uO0 z0>A}a0OVpn+E5y)JBnou-4FfJUBc*%AKl*Az`9Y0E$vy~uwli+eR1YF#~y!nswFS! zd4_qEv&XTh&2*`rInEl=TCZ_(P=)NR4kn*j<) zv$Kk@MB-C|8sEo6dYhG%vo3)bc%t7Y4UOJ}#m25r2YD7x#dCdp;c=!*3D!ePeLY@E zE_gDoZ>ORl3x#Zt7pGgt^rGNwY3b?dX=%;PO3(4a^Y94>R@Te8(N_PA__?;2gT!TdszO`SR&vqN1W=Fe;r#?B2xMyG;uJ{01BJ+mfQ!O7+0{`g(KoTS_SI zD{qds!G}efny5wSgk|&Mf<>$GIXoz(n9@yZwzwzN4u7{uCDII z38$s(!o^4<;T3iN1e>gPk44 zNgnh8oXKr5S$909(P!-AaGbG8%wL5jA*0wpCUuiYh*J8cY z4sx0Q7f>C?YMl=B*2HxI$?0cL;QA;gvbE6Sr&_4#446kdkJ-rj-yT+D_OV^26ngQX z=f#FS(N+!T?Y6~ye0(6285Xm|Y;`mKWU5q_s=d1n%8R7hJ?WcNqK$OqXRzYbWbdwBhH4k<= zcJ>mjT8Cv8DmD@x%Om%D0EkMin**qQcCaLJzKlmQg7k$IS5;Nb*1LuR@;O;%+I}rS z0+8Hzz3ZvheXMb##l2R4Jd7-dufdnQ6`+^ArC;Fx#M;O1nFEW3t->9Bk6T+MYY2>$C z-v?D_aC32?FG;{(j*7qR*U${oq@Aonu#_m?u@$DL7>vtA9Ju_c3`-5oG!{z(KLf` z{PuZ{F>lI?eGDu^Nphd-<~8>^Ec$=lF?go%IvoyG2)%zyOJl-5^r>v(n`nqATcQ}k zuykNOL#e^}&?w%nk8t!dN$OHXmJExUh^B7n9N@ z^-k!*+z|+gPutVg9N3yeO#K@>dj3V`8H(el?M4Ikyn3yVYMw|;0wB76B!`5*p0Lt& zxL6gOkntq;;H;q&S5Ddr3z&HB1@PZQm4*taC+#yfwF|x^+lqkAiGl1#P~65p8hjUX z>f3#u=)HpQJ9>K>hTXO%?(oB8kU&O#Lq*6nATYz_b1C zFY_E;LAC7~F7=Ky?i1XXdWyF<*QTYDB!uu(vWm2Kbl(m#N>iD3Kbk zBdE3-jy6(dtzW{qq+zaBX-QUW_&b)3bAjPfE@DjxK~GQb@VPF4Xv2b()8uKmIC%^t z*UxKG6n-CR7qH7`{8-DX{rXKTW;X5qV9{msPX5mZ=p%&z_J&k8b(UK8j@=YQkn&TurnzasV+nsBi>mY|wV&W`ns{jtym;@$CW)_;`V zKe6c)F|jOEFYh+B9&*^8EYFX;D6^cI49Tub2@ltGi%w2%0NEVqfkWt2PVxi-dv%9S z@EhZ4HLY~9;Lb0C#=4_+mVoK}F?~OVcAxL0&4Ki3>%;>}=$kjSCOy&2LM}%yRmMrE z`LOA)o+=(dx52ckE@=pjKC zV+CqJAKd%%GsQYv+dzKS9UWaWzR~{t_mk_0rH)WqP25F{^#(`B0Qd}q--Ko`r!>Wq zCOJ$;zN=y`(pX-n;`EMEw9eqZEj0A{1=CPDN{#~j5i%Amx33cP(6W5~7h0bCGq^;Dd@p{b23OunYb6PC|!N%8dit%^} zyRQHmfgeo|>Wb$r*o{xz1y}*2p&P0|aHQe=KajTnd(c(w4qm~Kg6;PfWmD#M0$3$I zhJR46W{i`;hrpS=n)iXu6)$U!XZtEwTThvSq!{ddL|3=C|>YSxZ#H&4Z2%N>hLOPQC{^FV_Vx=78z zQCd{QT^0wi?Z4dEhaw3RBg?621@8(eWg4)HD-;9-@7ImE-di~L>z0ngoBQbb_qbi_^gWzDfqJ1+(=~tWZm zo_q=83vS^v0#DnenuIX92YMW1lhmz-1!ectf*%q=Agt%-=Q0jH0LKZ0MMr}^%M~*` z131{e^)mc6fCTrNOM2C&h_ z`$b+WboM@$8YkK;R_R z5Vqut%Yg63oJR8BzfBMQvEpaen7^C@NEgh`?uh(m-|s`c3!9)}cN8jxAd%>=b?^!n z!*Zm*Cij@Jk4NEGPF#hKO=%w|)6~6UX3`jR(5wVX$uhfPfm%w{bn$R@2nHYI;as zcYAXQ_|z-3Se_;3`rVSh$zuW^^7R(e!zCQPb8<#Bj^v+_Bvf-Rngm#% z-r=6P%(bRf@Clbrw{@I^G0--|Br!6kHj*KG)vaK#x-c#I+RdR%tclUNn-d;fCKMz4 zQqxsm;9%c<$Y-csY8i3j`9dKvWzY%f&QM233AMUCnLTYYu=4LhbSP3U6xY^XH4BrZ zl!P_PJG=fRvHvZx?wT>m=P%yS6S9{yxyht>!q)P8KRvf_Xp!cj@e4CY370@NSAp5* zYM(x7XOr|eteS|qbwg2mLB^qNf4bWC@bK{R^fpyFIw`5%eoF=HR#gCl*Pq$lBBkRf zE&7&H4wbIL?3GSP~aNCMjU4>0t<|R=|jZIy3L}X-sa#~s02oW7UJrSqLz|Hj~ z*ex&1%|^{8N(@0iu26q&Tkj!?xSufu!j*Z22~a)M@CX0B%JOf=HUGd0@{EAM#~b~G zHcfPyN<55Ws z)!jtkhu?vAF0Za${O7q{iotj&vDb$KMZq7Zw#U#DfW;2Dg~CPRdq$q_v@I^`p#ljs zf4oc0JU4sjp#Jdr^B3WQ%GynTHK8p&K0ZL{u(q}a0e$BYD}aG3mh?aNAFBLwoxBjZ za*j121(py{<$z)jg8|*+fDsMr%_@*Xg}I-hj{0Oq94)Z&XBOu_^5fQP6K zMcoKpG!TH`pGTljzPEUIcVl|iWt8P6cOq^dSHHsyE|PmLZjjdjco3=F&wa(RVnG{azKC|LZt+~eAX zr00=Aq5d{{@`BX=A&=y;3sWOj5irK%=FVtl4Q|sR@6llgCI*H@Rua%t1{%^MaL2K* zmRKQ_TwKS$zT5-Et(%RYjUC+igLHne49rocCiZVI&Ic%2PM%bXrf!qu&|7ro9f6#lB2nPjepF$48jeqCKGXa4F z(wJ`#`>WF9tL20Je(nzgbn#Q(?h2Zkbj-X2SiD*GE~G0DNJRW6U&sXJ<9a9j%vb~9 z($2HP^X`G~2vSiJ*;U~fq)Vfh0g(*(5nwC|bCYK=|Mrndg`@`rYisD{bD%O=1I6Vx z!yg0A02AmU$DWujvtAsCxicSaAW=>gbM0WTdDNWz6l`JY-B|IG64%qM(E zZs6p7JX9Qd*Puu8y9-HGf2V;ee6;TmK>djJCeZcvuU%KT-wsN{+#uiiBf-^2yg~-2zg6rxkPRtgNd=vXfXjiCG`OE9n-PTl%Mli+bDo;lO2KD-L7^xySnE#{ zR@@KUpUNSqCy0{paubQE5PfMte^SxZEQn4+o+bVGO-oHZ;inAa{5Jtq5<5bCeSF$F zI*bhsfkb(y6EGktsiT8h0#sr`DT;#U@j85J8s_E&JE8axjHfX@1bBG*evIbq3}7Jx zN+jV7N=vRq#9U@dN=hL3(R^RN%Q;wi!Sv5>kW(t~fxVK96&w=6!oW6(zs_%#37-Qn+Y7Z7x{N{xEGG4Mbh-`LXx z1_>baIp+cG7Bm9Q#|nrjama=1Y*xD8`8_$W!Zg+gdiyZY$tD+Av}%HgII^b48h}Zo zy1H6AfxCX*3k$KACK@Q1vNN2Glh9NO#91ak3tpRLWX}r!PT4R*-_FkN{d-K?oyqbZ zB;37?&vjH;)zHvzg03mf6|}Qtz^Z{(>EN|HQ;S2wz1_<*M>R=BMfLdktIwUoIr8a8 zM@OJnT7W2SwlzICH~>&L*V?n04oIBflIUz}YF_QYk#YeVO1rc534Sq}HW*k(iAlfO z^!(L9F#=j;3W$_S%Nem?;x_eYCN;fmU42B)?>LSfl+bv*K1d1jHx%miv<%c!(02uT zUrdMwAw^s_Ai~*FaSANhSDX1i;T0!)b5^B{X(aT75VIz)`#{H77Q>^JLD57B-#o4R z&arsek39R%fMDlw&_?(;=sBBLs|m>NkAYNA;<)=QE^eY&U%VeZaL3>ZWY^e;F7EhS}K!o)dyk%xg85R1&zlS{@RDgb5kV2)*dRQQE;XKcZYpqU}!2VJvQnU=6nv@h%86q;3NS@BZ8}Pj4@zDLBK&jyelV5Hl>f@ zkscL-%9&Zc>}73RU>|Vq@OC6!KFpEA^Md;Z)w+pFcRnC(-;dfm zb%J05qg3Kwf)xwgmr#sR%Xo`+V=9FVxt$ro4j|0LTE0OcP+H`YN>kc5v7KzN+o|MudScFnB2R}dj{FeO0XBS6yCKrHaVBAoO9Nze~&XHNKni}pP%1E%y1NjuV+o5eA7 zf-{-X&3Dk{WLdTFpw^pb)+t?+xA{Jyrp~l>A zv;dogJJDq`my;&xpzQjr=Y+)3fbuol>$#OEdc`2*h~yXPB2AWnb3;}aP zB&L;)o`J4z>LFI(GaRAASO%2^XB?ICN9n+L^*va!&$#2Mt?BlV^gMpf80cGWIjj$) z_GvC7$UV*|evDGQ^DR2I6VxJlmL=-Gp9ahA0^bSB4}qk)Jw*q2*B8!P%(S5_tx zeV-BT&|$)t4G37Gqo3RVWYcfwwe~OJ(KQQ7u~=3rM6_5J>BAir|rRZV9if0Xvd9G3ARAUK$MFSXM^ zb|3UOg+<9{neV{I(? z_91VKfJX>4DT*YLtska#@ z_aONksMQw*egb*9HD1{LLhf!FzN}r&{uAlJ+D7Lb_ZzY z4RU6vTTWBwgO&&HT(#UW10DU~t%;vd4`rp5BXh{tyoR}E`-$L zYG0+FO;oz2)XGeCnqg>}fam&}h7zj4h$ky?-o__#6|^x-UU_b2h_{w2DMni3;Woiq zm2&!NZ!v=W`t$hl(up?vU$~LwI+y2;yxn%LE9(qfop?0;<>30zR`O1GG?^|8=D}3d zD2l)(ia0N=a27F@aZtX=jU6yEW?i45JFFz@DPaU{^=gl+FUTTXavCPG8J@4VtA&A% zCHb925lvbp+n-EwK591Fp%gEGbkd9#)GEtZCGx5)REZDYl?BAPygZth7uaSv)9&nv zi;Ci*=ps<){iz&?98p>lYf}y4Kf2hCR+a_LZHGhew-1a8O}2wbM`?wc$#^TtklQ0A z^G6?u6jylwixheG3sYtHK66h=eq!1>Yp9cm#?ZRoG>eCMx2e>0Fa9;Q+`xy`tRD?44U&v=NxEXtl zsEVgG3X-0#3M(#4QftF9Tv%exPk%pq4D(G$=o3V=MX`mqy{k23f92@z#lg-}WAZwi z^ugG6P*NksYzXO`c0Ew`KLD+EASlh-*uk5O{;1(DR%Wq?Qqj=Ow9sK;NN%Wu?5#xy zFcl_Z=!poBa`b9lU@EhwB1hCrCsJ~d5quv>e$J8g?r+p{)Rgz-n*SYiA4;cuf6%)L zGhU7r-bmfess5xt{iO^Zps|XOmV~t`>R8$Q><%rZiRn?EreWBMKJj5bb|!^j+;RL( zA%uxV@2so-QDC=1!Z3xAsW9ig<(2};N&Bwk_1v0yXV;mA+`4*Qb%9&Cfh4Kt6b;$V zH2WVU(uvn{?kmCNL24&8QR*eu`<8c@wQbA6AJwPXeD#!@_FMOHZ~)H#g?z+1dyQeHl9aS;77ZZ#~?};oM;fq@AW)Q9{FbC z69YaX+4IEH>I28pO}DSD-_`#8P8QW%vgZ?}Ou82yif)!ow++SpCpaoO5}NXJPk_{#j7p{zqv86svR298DBzNzBTRFz( z@LQGf_Viel886hqRQco^+td@-^E8uO66=P3} zUiy1qJLS6{U>@`DWn>CnFmYcRf6vG;82J9?@^lYu z*Xw5qQpsn@0S9IKhri4GZ~6TH&9$RvfnvaW^!Dv$59{*)_*dBfPK-L-P%T9fO_ZpV zY?i3Avb^l=ldCTeLqoodOi0-3i2{rp*Q7z5N|sBesHC)%pby;Nf4nAHN`Ts->@3$N zEQ;^S2m=EHf!y#bDk|z}U*2^tYdYZ6U)EeTaoI3+AU9}sb#;x(7`%%mD?*TazI*o$xPO{n8yRH*!QjW) znG@RB#qpK}6J=O+NHLz1F9+(x9AeRo?z1SJIDN>E5iCm7TttQho{H>LaZV1h(L4;C zN(!L_G6-;fH^PEOMn>*EeDd6JoS{Pr|3Bp%2BlIUCE*T^XE{{@$4*WTojY?dQYm*{`R} zPn5m6!9fSL>f%&ZT=_cAVr2};1ds#K>LTUBVuZy%3YSQpK8zt7JS*^%nvsKaY5vIm zIuf69q#;UVBJ}VFkz|V#?FeI3O#xBPCC_3xLKlRR&^$+}p?sTmk+qI3@~{jRGeRj; z>^C;GM0vmhK5t5)v>z;wQ25QQmp;Lo zXvU2k2#KY)jV~zxHu?W&UgqC@^j{3yTt({m`1y6Twzjsni;0T^_mr;>y%iqH+4oLY z7o}qy{{3q+9S{&8m4p(YrDv#sl0`*TrOCpLlwP(1VTTe+_#oci-f|3>wv5coy`7yX z6(To*|6Ba{cQ8m1E@Nn9L=27!$9ozl^(DdmIXQVsY-|-^{5AMNZ>224w~n_bB3;z~ zv5r9?rcdGKa4WdYrcI9`Gbo?~1C}#2fZQO3|53t+K8MYQE!*wQCiU?vGL|O>CpR4( z0hj`X4!sWF4BL-Y&z1HX1@arvl1B@{I8Mf0%29e|X6g6u*|}7g&;xHetEzZs98oh# z*dL6HjDTs4*|I&)+KYgML}Lq>(@-nLGR5f%%}t%8LU^2`v7kP>2rZ+1j-din6+phg z2LMWh>4aa!5~I!}BFY6-3b-bzav1;l>_A!rWj3QGMI9&+b~3U^<9N+b3J&?74nDnk zU*rPF85ovn4<-T7A9$Ax!T$%<9Sun?EiLV!g9P-m;UbUBp;}W_%U)SUWvqkTbDL=a z7`}r1{ei@yiy;8yi3)QyQ`21cJd_aiue)o#!TquUw1C^6Xbst(B%673*aR~ZlmQxiwKo&}5lLT50kaehIG)sVvL%^u=%GaXdY%wq!C>^+n z^0jUADc~8if>Bk~eSPiW(QtrClQ>C`TngwG&1*hNk^j)O*u%oYUg`Y$3}!I6%tq*h zgpxY-zuo}?=3J?@?a3tEbN3H`KMIe&} z&{L=kxQ8ImWWj2Hbm9U0ysaujlxU2DMUy`!YaRE18Mx^e5<&@j-s8Bw7IH>AKnf{} zgv6_DH~V14nJ={mJ3BjPCpi$miF}!ykRVy|oS4{UOwAZFAhCKxb_#7$)qPqd`wfc* zmfGE?Hbkke=)lXx^{o+zw`<9+mNGI=Xg$=`iF>(ei^5c;V_)e4ffjhHbp)%)q+aP?o%|QvpRt>{tx{1(&m~;z?7EmbC^F)}4E(Zh#>VIxe zS!;EjMp}ZVa2ciFW1_c0K?qaw2yUXew2G6(u73X4WLv2@vBMMgJXfl3ODhuH_LfT^IUDxSB6EkSJLpHi zkKZcIGh^VlAy&4det`*`o9iFx2oa*oyr>mHr0T*?d5y2ZRxzKp{yfQjPpJ+i_gs#U zSk=iR5b(;Ey1ljzFMxrS52yYs0SF!B3*b;$V{HMUTJ~~gS*FSD;%LMBRr54ZIJ+vh zoz`A3z1MVj{Ot-zF|{e;e)hmUOIGgAbd1Ep3H45){O_8#+HQUHaCyx)K7@j#?}+*!(NIP0+8YzlDwaNGFp7 zQOO4Q`a2^9X+IR}-Jci&cp=Vr+wW`?41QdOr`VWO@Mo6T^!DaC&wUluZYk1jG4UTd zssq_zs=`7t^fM%U=|{;+Ir~=!tL``|W@cs`A!HKYp0CpPYrvhy3$+BYIl=JD@bHDr z3zvtC0<#rVNhcXdPMxNzhk0;P{g=UGyU z1?dn|LOV1J-~5WvS@eG*yjGC?rY#mIeB2+$%z?`Z_DYO~nwk$UQvD!|&LG=39!S^| zO1~qGi*Umur9rsid(+)MZA5YbbFEgLQ}Lk^4v+1&YY|XmfspC2rY5Gqmewa*JVPWQ zXo!I_Dd`QhY68bu?;G6jMMWjsyvIBB}2MdR3)p)*kJd~wKU ze`<>?-Ml^k&4Rj1@}B#QKoP}5^&_RTc+jJ+FHcbp`tZni`6@rmTuw7Q7{oz!{ND}S z{yzXj={z+eH8mAjw?R|or00$(tec*Jq1*QGN{d*Vt_}$wH6#0A#td)jT(P01p#hzN z+M=QX4}uaToG(LsVPOG012Eh9V_W=QJv}(Q+{9N@ObnPVE5sHuS-cLux@;>)(ntfJ zG;B3zpBDP9SXxR?6u4ylNg95q?L(mr-#>jzNYF^%R}gQ47wPHin`#1VF}FQY>c=9Y zou%Xi2`4@fsvD7ih07FR6SWKG6|68ZQSz}{oWg=A%&hekb!yc^MkXeyOjpPO8Kk9S zYLwsuEJMrp+}F$)lrKoA93?6*Xg)m(!g4*8STP`NR~E^z4?pdA9- z1~Gl@ahNbS5LOG!nr5ffxtf?>|2@jHgAm-*W@Q0}90e zQUvDIjEs#VqmvvaO#vhz0j~l6?S&!X*V@!mNXqhNgt&nG;Z}!H{ixTN^ehZ`kIOxQEsbU|`#U z-KgxN?g;=vxZwhhyT4CJ`E0x`1b{z%$`%ah0NF4hPr=EF_a384!6OU|K41X{V;lW^ zYotag+!pGVmW8FtvjWXQ1xe-0Yip=s;p>ZIfMgxI%%yB>*!>tmW%mB|bg$k(rB{Vb zC~g?^=D<+WuENZqWD(z%|zcjIo&jE zqOU~nHQox-()!&2AtXnWAmS-3@qj2uOGiOr2#g+gO2Xwj%jyKs;H#bE2-MS7L(5H& zZtgUK!<>2%#2CY%zyNMnqSJ(C!xVvo8xOJ!2a#^f3Z7@J{Z>293B!NBFQ7u6NAI3f zw3N?LV1bY6`nAC!=tOG#rCQyYspWB%7IV5eU-Jb2nJ28BC{o)JAyb-1Ps5vN8|5z94-j08pJn@bn)fC%$pA z^D4**POe}Z4R)Xhj$zS`fc~UZska}=%=3B8OE6l63VU^?#Cg`beYBl0Fs1GUrnL>M zM!LYcM12h$VBDhau#ZxNlJVkCuQ(jaZAb^h9OPyF#xEK08PB<`4%V;r7 zP_H1sC;BJN;6X0T@` zyKI6cFr0hm42;v_wjtS-nlX?DA`XIz5$53raCf~bj z+1)vC>sBHOw%>7sctiwoc#9w{D?ec|*8M(m3kujZ9}6LZy~l9VrMlD1<|$|#!{kzoQ77FWGr zq9XUZix%>m*Q77AB2UBk26^j1r+Uu)RBKUKcOlj9MaiM?{;zvd4m0+Du9wJfzk6>p zMPit!vGoAP@qSYbYS>}BsQ8?+16uoc+7~lMc8_*PqL8g@Rperw(ooeVV%}{TO`N|C zV|={VNOgqXoEjRt+4F}}E@pBYg=PRvRh(bYlZ~P%2m`+)sgS7fjU*fV z{KKmiN@Kym9~ZQ=^^V?bU?iz8U|agROayGqkk%+3)5_e~Vb;tJ!mmGm#}$z$#0$l~ zGis=}3;Mpi67;7EXU?F-o|hDu2D!h1nNlL3aDv-r)xAH9HxQe3*HqFFjOVO^R+~(V z?|mDZS%)c$#60xkT*d6!Pc7I|uhT=~pZUlCuoA7A^i`JK0F53>-hPB-(l|+3;Z}2g2*LIf*KlJ$d5^7cK4Deq#7hr|rVB zb072hD9fB$V3Ln=)D|97hpTvOvS#pd*KC>0vSDUal6i0LWGiyQzhb1YE+x-=>6^L4 zJ9g*42JZ#zlBWDxHMMb>7+%}eIESv))gH8yY~+FwcWPtmnd{kMIcMkr6#Fk}%aBO| zpNQfPjE})A$Wd5DZO6cK$s znS;4gR{EDq#TeM7j_U)upehouBz8w@@lL%C9G+d?tp#3-{TM<2tUT=R29jmj{+C%b zWT^(CMqNP;Qh=cC_}ydBP_3p`q{&G!mFAepS0RSp&Ms@fUbA1wrOO&51e-uarr3F3>S0 zEqqZBA|lA<7Nr*mE;V4eS8RDgfer7|Cc$A;T=+{Q>mJg3Ih=9>bEKF-6I;%B6C&Cb zfahoaWjn9rukH8IK+I>k4+u^5$ana>+CagvaJ2-lUKlwP4+lGmry z_fr8`9$R0sulQ>R5CRM4RNxbpifIqnclLrp&@SHIUTh1jehx+&;y2XLnC}r!)P1aeH6AXOF)MJn zUCO5`By!CIUa{hjN9zIJ8lv3KYrFazOmbZO^t@(tcYr;RaZ{&HM8hu>zP+-IN3_!6 za%DqB2?E;t0b_WcCGZ!FaIcn?lQWcY*ce%}f3WGIzCG{veB>S#za8Xo2>1WsacWvUvVo2*Q(u?F}5lC2Jv7w`ePv%<0SjBe_HlRxw0w34c_s@K7;{MDK&ihonfGYaG9x#fM2G6 z9yumgv&w4!-R4k1s%9fA0f2T(k>8T~L7XN)kpRVp`I}C_#BjE3wx9#*#U$HcNG&eb z=(nP*kf^9>L$?InfK7keE$Wu^(EeG<{s*WTZ_a$gV4d^f4ftm& z7#+?s^vgnASW|*_z^geHCW7DG`L^e0jX9=-n~M&4ULALq-hR z{zz+2%6nRoCw`96ELs;ATR%wv97Vm!hxFlI4H3lj`+xCPpQbZ>U3vNNHP!=vpbjG! z+)Rx}@&AS5_(AB5A|j2GDFzUT^;5RIn>ZQ2X3$?m?k!}7c!le%tfD{yuv4F90T?WN zQxo`q{T2)-WM^eLY>hDkvtFAUB=_;b7rH@U5sHe!zsye>Rd9kpw7q?O$2b952wRi~ z5YNTM1z5BIa3nw%&3FrPK2UhT$FRq9YvAZ`vr(415z&1w2!?(|0?JtGLkP*W8kq!g z>Hj%7`rmtv(Z4j}zmR4Bi@OD+K$iNWAt2lf0Fxlf8^!*Vn3x}+YJjnUbqm-Zb^){n z76X@gm|8um}a6X8m&ty2O7rbdn8G%?AoC0t303Zs8z(6ZOVenTa7E|2q0KnG( zTMovT>dStFMV}MgQ?=J~{x)rXkTdQE1VzVYtL5Or+y<#!KIX z0_m_m)Jm;}+X`0P#@}!qw>acltg1ANii(0V`P+oaKLdx7@W3{))O_j~qB5S<6n7K} z2?^1zUsR$9(V(*EWCVqTWO%*5S>%_9L2Cm8pF5}_M9^H{Uym{~U6SMM#xWr*GKNuU zBp;*;0w@I^?Q@84+HJgc0LX~EaX;}xJYTDG+ePKeyIPd*N~O$MJpl~^h2kHGmg&y3 zgCEpLTaaHON=Ft%HUI)Eicfa^8`Sc|OFN={T>aB20EXH7`69haOG}?BX0Wj6w_(sN zz+f&VFQ0jH@WSIJjM+T*Pu?PG>EMcLGKrpk@9TFW#h1_uc+_2`+*EbDn;kTJ>8s%* zvW}I3iIm`XmfYM7pwBPF?5vO|Omr>rBYvl)(T&aU`~gH*y$4K91AbN@z5|K4fwW4SJB1sJ)c9~Ej0aP(D8yiJp5SFm z+I27)$-?rFF;5tDl^|I`$l+jR`z)S`euoGuIJk#|Mu~z=A{|pOA;Ke>WCY<;tR_R0 zyfS*Fpa;H%WCQ?C2jDw0ad6=953M~W*Ww<(+WqIZ)%W4i0E3n!`Y0rAh@J&Jn181V zX!z8J>o+9|@33*KB2%k`yObyu;G(hYd>sUr`sCXnvXl5{=JC5Hbl{ZfFyLKr6JPH* z+jxqEjBXVu|4CA z8b^QyiX(w8MPGmIbn$}x+_R$QIwP+BKwZ#y30 zU5cc!mHSKP8c&u!wQi14hsUG^A2%N?Y$p-3JMA;DScs9qyvm9_>=_sM^D~@`yktnnY^At@6@TL`rjX$ zLw_W&_CFQF|8>sY!=T;9{TPTv*##}4-dCtRV65h_|2=ng>DUoQHoK_KfX)S_jst$& zWMqvaDl#%Xa2i;he*em$2@DD{o2f3#jsmzGtP2((EQVRx5b7`7=F<&J)J?92vwK+E zaL;~QpF_dozdT*+YyR`+k8MByxL=240Yu&aNZ;Sl!NNHXFaaoU@o;gKcntv90M7$- zX-1|Yk1XH_-@g9{aC#D8QU+~j5jp?T1%R@7YeH9KNkl~+CpRlA3vviD)6#zmS2|8xw*w87<%G3o!VP_H z<7R%11;BAK$nZbt*z(fSyubeWUqA!?`{O#E{OB~aI7|SVwR0dZ8My+LRCl7Fz*(n! zmI8DoM2`5gI+y#9u_Gs(Fm{Ti`|i)_-iR+UexV&wLU6PR*1*jK?rOHpvR2@IZWK>KfCrT*P{2O5Y@+1`0SE0zQ*% zn=0_CH&%Bs`Z7YKLvaEPIZdgH3+5OMi?WGH&&-MT{C>YP4Mg!Hnt*BC1*CrXczFEK ze{;Oyr>R_yeq-!73(#c4-)&2i_hKR<6MK~MxEm=>3;qI^d!dI)vrdb_4t%N~(V1(* z9&G}O!hbZPNFx*b8&H=cKwvIb1+Lb;EwQq1$Wq%74Lyy>X|s4%Gg)GU*%^k$r=i|z zaY#H_jk}!=7&}ZR@%cXiP6J%3b%b!4wV1x<`NQu0;2Pp^LjqB@WUVsOs1r>PaK2>% zt=_$t?zwMYtJ19W#j*RQ4nicL`1wB2o~LXSosqT&7yHZIyH%^n$gny9khs!} z;~do+z0N)csGpZpbC=~%Pd{f{zUC=ejN2ojc!c!{CFCZgwJ9SkyTh7Xek9~I2uzg_KZe_C4`upQ2jEfOg z(7M&alnqzc6-4kRu|!ze_eCF@w&CVWyaz9)1fdbjbJTi7SzzIZi7XI3KSG>Z&HZyQeW^L};Ut>E$y$AdG3$lGOH zlmG_@iM;CA_Hr6MvIWWof?MJ=Iy*Yxne#aas|_xWJP2!}pYM!ExKC&m^xd^_Pe%dv4J=? zEy#3g?AG5X?}K}^vqZjl64l8<6R@l7){A1gX- z$cC~<;=V5*3Pl?pu#gAMX!M7ZE2NCpploiH^k=ZW6ByTr%J3e@?hF;^JtQzG%oP`z zf(EVZECkDpJJ^!Lx(ZiSgM)q?k&U0DI}%J`XA6)hGYb)Q)O}e( zZ#GpPtU%bC2GtQD(c|`c#5{?8XCk( z1|00_mqp>-c0WJdqZ&D-uYE-dx`aDuuhi5Cju-<>A@C*NOfN?Vi7+zm_+(Qrse?c(6|xxEkT1}ai&Yim{s{W_ zrT{sguCBUXPG%JV-()NfZZO>NLVzlq z+{DC0C<92B1enc(b`d43@bD5q#MK(e3u2hGT$Vb*|K){>fSAH<82wh~qg1sCac~qh zG~$zzk|H9Sf?#4_O|+F06l?@^+8~oqz=Lnt4N4WfU0@m&lKBPRG_YE^!SkBN4Ra;9 zX^R#w4%gY=b%cSM4FWx2p#BCOFN`}jE97P8kbw!MTfDsG^!M-INRQFHSTuAd&v?yn z*pLJ@D9_IUh3;5|Jh;x-)gp zU~(5|W1&EL&G^7Hb{Vn3+JJc(QTeygpsQNI}FI^nY4J?KR(k~_)LK)^yAh-!qk|>y%`eyMBcrVQ2m;Lb zpm9LIcdu*_G7SG9lk>>EaMMt_q0Wy(BooZ6noRfxlr~SFZzUS7zbxg_K=>Y$htTNTULv#OP~=#u?;zy~>2yG!)#gClN7^eu zOoDW(Y^dTunRqLmI++Oal%B@aHO~mfL*CHfdw3~i*1I<(Ml>ocdarGgC+%A!WnoyJ zXfQQIaKMp)W_Wsf8qNokcI`xnPMwRrlhY~mx(^?!loJ9IdIqpq-EJAM{EBeq)o<_z z)#v8NBv{Y=I)a|W*~9KN@_^paOir?^UxT!hgF!y{`~Nw70m<@4APOmR`)|qu)qi6n z6?Cz&v7o`cC`%`V;gm0rX>{I;h`6oZec4UA!1H`K1-yY1tdLEt z1xJh2c?k>Wtx=+N+n=+8q@(9x0^B)kehg`ytDxe0f4Hm-5&;;^LP4G|!p?3Cd+WoVFzp+xEfFPRN=Mca#upEogUAwj~y>F0;*&<=3!=pmx*Q{nwprL6Hb&MjFLpBrMga*! zw&H-^Z_0E5`gA$0Gs8k%Vu681&Cvc^a*~=Lnm_p!U;kw z%+M5bYCF~fMt0Tu_u3j}0a7v_z7Syv{K(|0GBPv-T>J-&YqzP=Z5}%;u>$2$1vDf) zE><9YcxPl(02mR_4sA&iN83|e^z_h1Xv5Erq7ektc#Du@bPnAeGD{VnA4(&cV`z(B zlf9{TJJS#4cYqETBxlLwC(u8IBJotfUJ{7Tmzh1!c0I2Wf*8TbdcOrpLxWokXm1!D zVS@g(VBLI=tB??w8ZPMfkP+9#J23gh)a+CTvSR$U0@WP)LzH!KwPlgPY=4B+1mC{w z*`EIM__^R`6whNHo2(?S8%|~vhc{2gySB%FGnW;~QZJpFzVt^#8;VgS#0hZTyt24- z2_YQsY`N;RGchG0(0Mk^U2WFs8LR%x(#h{^p}H8Aq>pv@S-g&ip~yzo3l-#0+1%7b z`{FU5QV5r{=>LV~nLdOdlkIcP7z<6WauK&9( z0E7Ldx{?%s9z&uWQ*Q=W2~MRjj|4BIO|? z{^}1@>ZHuI4~yBDFHV0FmRQXa?MIC*k5GJXe1Xvh~BU|H7Q}Ov`$|(&M#1T9IcC^e@&z(r z`?hEDDK5ZtzAvN)M-kQsQ_#Mxj zPoW&;k4brzeb##XyB=x^1^lCP*FswHIv8*`9I}ZKtStsEhe)Zdjp7gbE=#@2-VzJ9goDsJpx1#AFGc%1pmr88*W>4^^-oJ}oE+=BOYAU?} zciCGpuPlk^6e@EX&JYiVOX5ssv$p2#LNQF1i|W0fp{+<*oNe88W%D4INHGYI?sCBp z-N>qM@Q2|-C}L^)TuRnYjw?X2FNT_u@=KDM9cl;>CmjWaKD=lnVZd+7HI*WRDSM$D zL47(7_*A3T06OGAAVw@u=KI(0MfT#}NK&;_uQ z+XVF%8RI^!iO4Y^$$^LrQN#1#c#-*N^LoUlXZraY{Mjrl!Z^v;hOGdyZmmv4Y$mMjZ9+* z?7s7GHP4X1hski;NHk-WE)1AZ2_NaxCPOy$G3;Y-*)AIo@_QugDv5|vn)fg1O?U4- zG-oFeK4X)ac?3l zPWU|se_YUC?HhAIxrLugzzz}=xd+$`kbjJ9p#LAsNYq&%nHCx-2AQ}-ztaFe!Rg;7 zT_16Qoxo}ICk7qj{=oq>XTZf+`Vq9;1OBFSh`G&Qq8Ek60)?WntG5?PyCZRBfU^CF z>tzr&?FkvBEkIpnm8Ok`T*dxG7yGCT!5{JQlW-1!t2@FAkTCGW6!8ba7XYjexZL8X z$jq%FtcU>Qj-|85Qf`w9I8K66j!?{phle4R4_tQjWC(|fRj`qhYd0NWQaw^1uo<5kzBu$>>AC+22MS*z1Uh?oD8t{p5eRzJglq7>@VsXpKsS{wFd|C(-|uh#6ybJmPyVU*;1cJZIFHi})IqnoTP7#jqH~lz@f~fnB2rdB@ve#MixNSg_gG zzNo^xE-ODZwY-WtXdckK*waZ?%0ka(X$hHPlo#)Uxq_?m{j~_)7eucl76( z2w;P9xV|TwSs4)Zgedi%%$N}%qleye2!pvBP_N()YrM+tjXj}C-OQZ(&+l2nKNYj6 zqL@zYJz{FqKZhsANq;YxgXW$?ISbp}QnSr%lQJt+}Q#r^)?SYn{F2e4d&0HTIm6g5pzN&KAO@vN6hpg;$|0$FZal8fqGn zjUF1k%{+}Q+!_@`$vyjm&HRl;74(b90!|tp)ef(vAM~zl5YAg~uMqjJL^+E84JKD5 z+dV_^9F-%BX9U%^rRDhUonG$HImkMesWvv;rs2v@;8|C;evpMfRzYk$k(~3Rfu`%R zz`y?yxQ4)BJ%{}{;5dUOM44L<+7Hmo!tfpw5dnO3$PZ}pSJE;+J^6=txFa8!Fi&VV zRako=!nkV=k|A40#zs|jX5bD2L(`AahAhSHB(7$y0eC=O{Dz%2vmO`bI1DqwLd89TIH{R4pRTmt7|9mfcmh-vIFm*Zc(HF`LdSc- zX)=^HEH41LW@FG;LK;LP?AUnsX9?Qq0yC4V6VI!0u&unYsPY+#->WcWQguCHq*!9E zN>8VhPa`VpGiVAXBa}K|RM#Dq)yg-Hp>HVVC@VeudZm!~kZHW}+|lIBF|nr4$&DK$f&%UJg_UkSoCzijbRnS_1;Fu9by4ab9O2nW!t(c9EHLt7OD~ z281yQJzfv7nC63zl@L?W<&xOq2*(7_ z`Zt@MFo@g2`-jZIfna}-vvdAc@TdEIiPRp^%M?Ng;ra14vfp6P7;Ir%u`63N@AMkdvc@7T^smTHL zi6{Ma6DX{UG}%I?EpvzT1nG-0&PJi**S5W`21kt1XM3C(2a42;b0~5mSfD*V90;#Jwrz;5V zao13g{QTEv@-gUn6s}}H%%u8bzE7iCgXCLmBe#BTsn6g;14J_1=e*g!2lFfS#r*ym z+!ojh=DNIs6u=qtS@UQD)(Vaq%hmKF7LPxtpu`xaI)pZH8dfc(y{|>*GMfM`D5g{2 z3!9}5s5}aci)NUwKDH|V*!rlW5wES$g&3paD8(`=yHHFr7ZM_>(bPO~z{ht@@$1#f zPYZjXUEWMZr9{(_uTdlLa+H$8F2z+Q%@u8r319u^aRhe%_lN8CSWaL~%yu1(Vl0^^ zQdg38ydU#gqq@1TyLEIqmEhr~&2shl5D&)}yX`Ln0}PHCYV*&+ys3OYiw!7XsyJXn zSdD_*SwQKhw8oXY-c>N%C@hjKxO!{~g1Q7=TEpoSQl^T;8(gl$Wq*nEc=^|Km$G3X zobr>I_Z<+^7Q!$PmFZE00hSDw2&~ys3h1Yy5dfAZ_AJ4U2^-`MskyD+-eU9;gxs`8 zo#jkK$0*Qgm_2w>h!SACT#wo0YJ}(&vq=1w`05dkN}~lEuWph_Q2Vz&Tm7HMZEULW zIB-k#v|cZY(PsM5BcaeC1}^pga7vT+m52yyPz5@^-C=P|D3}aa;1hs-M%3p4Kj3N+Ynnaysyh zTVamuNu4pEcd@EHTYqX$HMmOLYnd7Mg%1bM5DO?;y$zW`4_9WR1lY zazeJZmq<48?@T_7$4D`K1v#2HOvujkOgi<6v3!681M2aif>8HtF;pPqwL55R+4y$@ zpxD-d@!&eY<4@i>$xCkC6o6?!9e)Xjb6IK+h{&j=ML3h5n|T#kXx72M%>NvX>ofpa z=5UUrEu}GbJsplgV7_#(-(U@t;jVy{Aaovr3dU8=3l!S{D!t08S_U^hbGP|~n(HHd zi4K&kzX7_X>rWsmLvTQOpy+Md1ue@0f51MU7&IMNMbP^Ul>dVa}yuU1Yo+T&tsZvWCs3~s9f z5L8IrA_?p)gAAVE0WN()Ee(qyyhu=*nT?rmmqaYteoP%nJMUr`&hvdUIRY#;Z1NzP zK1Peskv`yHBf+wMeX@*xSq0~FG=6Ny0+pKQuE|i6|xoQqBIQ3z!}* zaeF9nYiw+$ByMSEfuTD+An+tA8vEe>moJ41<&9(WwH1v9;?dDN3{Q25Q)O8mFgqPg zgs?D8IZ*y}*PN96T2;-f)6%q@`1R+PAR5VigZVFh5)^mnmuQb=g>H#qED*iL!JTz& zOWOPWnUd!%<$H|7aqr@WB__?VL{`mwW0SDr!fefBv%prBK*Gg1_`)}uv1=R5yIqae z-QKY^9m3l^!F-?7nG#d-n_pF_TM%zX$wiN7pLkWbtt6^OWarvWLxnJz05X-S1IK)?|#+UNh9{nU0o3(XO7u<|bf4f_C z<23IuhWVROw(re7oHx63)HkR3*=Hhp+!uQmZF?5y;$cwX6_3?%H*BjlJ1=ASVZ+mr zpB$$X%{Rk3{l}uz*`(;q>{C^iBSK(v(#!DN@ZicYww|$fuAlQvbmbhgs}0kI=@l%Q zxgx)tq?m@K*^m^D9JC84l*v<>2(Rr*&ME<{N4kC|dlXU!R(s-v1$`#EQ8;qsdAB)) z_CUvf0m~Ep{T{Dvd&CvBwgT77!Ws>|T*8coCt-o+SF5JRD5v!U%CjAWlJOhOK0%&3IO2&@S^+vQYp1*v~zN?$)fK7v7&8Y>jM2nbgpz&WX_gP+^Zc*HO)e2eXGvZ0>wo# zvM0&=<+@T+;;$GpmU<QvGtTwxrl>;(0~p+1uc=Mb(wg-5%R^Jq-W8 zHj0%t%2Z;ZLF}rK3+iTOb}y^;h z?axT9Ho;PZj*Gg^#IfU=XRL00wip&cGuT8Xa$5h=)Mlv$sXFA<>;AL#gk~R5?Y0}v zUC})}@;rYfvw5o#mu#XeczaKn6pA(&G3+3;m@#f70UDVJz8&BI)X9_i!&3Pb_{(1=*r7?F`_>dbKc^&Wf z3#kQ0-kn&6kY*Yhy1{2pc*)Z5tc_0;I;aS0bgmRFQqr5@jedntYMx=Gy{Okc7NH6} zv%GKa+j3f$V6KzuV&L%J9_AT2#;4qtaIH*qC|@?XDa9KInGBxy41Zol6qD>-Y&VVFEAo0n1;PCP&aY?qcDu z!`q#rX3lQ1TM&@mC0Y|7(Fx6@cq{Fl6l2?+Mw^}8jC|q0K`ue7%5BcV5%`m?o!OH^ zA1WxeYx}mF8h5EFnq**(0AT*`TsE06j*&**fbT4f{oW|`99PeJQbk2-ynZhwjZg7y z?~+SQ&(oXq>F=ZLB1e--xs0F7#WEA6vkKN`unKao7_8VGxz#u=s7u8x=_XU~RPfy9 zYgckOVX`;Tpuuems-YINq-g!{!Q)+!HcvhaZa~2FRB2fn<@X5l?}5RY$4>m4nk?oE z#kG}{8}FSAP1biJuoF6!%Vms$IWoDNR!}rKXLzEGR#tgzeWnJoO20(;kaQObdGfhF zd2qw{HP5#J5A3iH9jp$fEPd%o()GcD$rL}dxh-kBL`5FhIPPQCJeW;Q!#d6&H{#)& z29ed`I`5PIJ3`ejd2Ijy)%-c}v^>DK@2|{gpTrWQYI}~AQMWFm=Bv(aK5?5Y#I*}^ zd^{4<`}m7VlsyMuD8(u14MvX&J%0yy82tSt?|#zUY~-PrPyCJ~(L7`+wp?IDvfCn{ z`2K3F?zRVk#p_P_PuwSOqZDnnoC=qowbO+rO-pWl*0)SGm8URDA1NI==pHjzz0)^7 zW`hUqO#2m}?E^o*K3F)zhP1|BJFMThvc~7vw)brWflDb;LSJhM^S zvwpbyj4YF~&f6{-+bF2!&Cd{;fjxx?jz|-%HQJT9$T#l06zo@ca=44#5MSMyV|1Ryvmr4{o3=-CZ-xDt1Z(lB_HbD2qciD`zf7h zi-9$8{01>cNYx%-TQVH^DC`;*`8J~>*t;^&kK3h^d?spQIt0}2V6|sh%XFdykp&md z_)x!9qo{ef*=9Jg`|53b_FF`$e^1+NvcY?a*A~grPiPNfDhXXNaFi-b+O&3x9i>>k zwjVC3@00PySd%K}v*wPFJmAHjYW`LZ{~40udFTZ)E-5d*TSB-T#r3Wg7U#cwz9`|p z)gV8XAbtLYUo?EZY1UAWi@h@V?5Jq!p`iuqOk`Jm;5SA6gAox$-r;9a_MF-S-G>rv zCm~NakED;PI9Re>5kY@7;!`l$Q(|V4{s@bjzj|+LT2ma-@$%QU_;Tm0u&fT=uJDvt z+28Twg9o*&PX3+wv;}N!eI3Nv!0PZJ7xXnb0V8j+Jei~LpgtzVuEnCHF5|&jr`(z` zfCEJ9Uxy`Pxvj~GJMG^AC5jtBAp9xOLWD`7Rv(n9dL%CRmS((O-Ll{&yLnEvVuudK zZNIv&k-oDp_l0uaCpyB$ADjYoeOmH~r~Eo0cbWa7$PflD+Uk1Lw;NZ!FnDir>KnIX zGktXH*ZiwAN3Yg`0BAoEKRG5cpy;oQ{PRyde~}dM-m~T0?~cimsY9760k4PY&8_EQXmn2z8?M_&V3YQ@l)7 zu9Ku+ggb9qyUBfdu@K4%L#&i(nHPtP+f`@nGpxR}XkVfo?%%VovWz_W-Lm*48%0#yTh1Y%>)UYjGw zdKW!0q)RS$=+RPE$BEl(jG`mHC(8+NLLV#Q{vM~&m z4WHP|a_}wNaaL1O*=?_Z9-=s(RvStldW6ncpYpKB8x(ytTw;A*`rsOgwvwJ!YSy0G zD5@kgvX~+p<)X!%eGdbku?v!v+isTjh*gw}3Wl2g^=Xooz)cyc{IiQ22cF-%lKZdTnX21WIvam9i7_@bdsgAD`N>&8O)+|+OqzwgJeGHwi|ug_ z)6|Nm98=AFU9Y|Y>9a%L^H5q|EeC|bF*_+zdcaSJZ0i>wGbamx$)LA#b90cBDIB6F zVCDx27B-C;mezo0;YQxsubp%99av*L@%icXRshRj`ov$+zY2(a05XMVSIsbLgcq8| z_8Ex(08(Zyb?!e}g>#5pIlx%Dd^L+DEJjW`o&M z;$b}NQSRHa5Jv&T(2w=MF15@6C-s@qETWcJ>V)Tn(?nfNhPe2ZGq3yQp`GOiXz`LA zSF^p-&;jh#B(MRf$IX-Lr2H%MfXNSN}LDDiMgd#FoR0 z{pnE`*5MyGMm)-#%98&0GI`0;M{t^ujb{vn6 zT|a;FuSQcgmoqngdq^WUCyJ? z-jC8hAIF7$jrgc8R{Z4?o)Vp5Q<1dGZ)hSZ6q$6&Sr9z5*ODWODhoNHKo3;^2`K6C zPpzL}v2#nWii_v{Wf+oD`0)!8$!_5~CCwP)z9Z%ll+gq^+!g@C=(vwc*l%29-Vv?k z{Dtj~SCbLqPj`CqtL2?J8%-VE{Tt4oPsUXq>zK*oRRoVW{~N`jT$ga~Gd2Uy9{h`y zn)iOsVqaj@b|sr<0Y{=tTA^WFwJ57d^pkmn`}&vY(#gG)uH>}ad|!1qUZDd6qU^@} zl1)BJ>t9#^|Magej@ZZ98lyFcx3rBBIPwNM+#ad=nK>4<&pPVzYjQ&0FjA&5T2w9G zv&DX2w;gp_njXcUkd(CThA`w02gtP5NNQvLmTE@hmc(ezZ0{|K(u@KXfW7Gc=)DYo zo2rLJLNfc-r8ldwkazS_O8(~5X7#~d20zRAG?W2?}76o2W3dYf&{Hw(>!b6TT zo3ebGe~~QiT*SA4J-Sgcr(_|=Mzg9d?cSWgGTfW^M6U9m-~L4`aMn_AVWp*OJBCJIAn9K4xb<|*Zwol~t*L7Jvw-Fkz_9b%7eUH4Xh5%!-ouNZ*Ta&JBOOPIg+giNpT>k z)B%68kXJUlP!~wJdPid(pS3c3K$?{?Q8Zxp0mV1-CoBf!!SO20)BHO?+1c9}$ z8a;CpR6wwf0=bVV_SbU&msE4rbeVa~K4p`3Z~`j=dGRI`9wH(ruw@9dR;gwWLYvkm ziu9Z13V)8C#~CFdmi@EicEm%jqx~eFDzjC zk*k0$tureeqj&G!t6PbGFY(}S)LX*PncdMJ_~WslZQ;gek!uF2&sT6Cnys2w%s?&* zTf;lPs45V=N$zXA?TOkvdDf=0sR8z2aJ^t^TR40ZoE7GW{(rKqHvNZep<5^q(m)Do zKZu~~l%0cAHQ*2S4K4sK7PBT#AeD;klz>t zV|CpEQ2|oj2h7UP7VySY!kSiYQi$O>0h3wrBQd#n4u9Kv0LeAk2|A++8i?~uqnjBL zg^)<0BDU4K-6C@@ZoVWGax;SW-=svIe8qrca==4FV+4^Z98v$+ZT5Ntu0Wi7ISBDI zk7*Tsy}hk4be!f<#n{>`_WHL3fsPYPQ@CeDzVtgLMMQJZv|{Rt>h&OzkY{9c4L;yH@yQ{qqDX|)bAwJ>#E zT{K*=@6>k#^O^Jne#Saj&t*SYOO~L%{zy^4Daq&C;flYd3vxVq=Rw%hjJ(Ornw10U zcPu-QU}vc3ABx*Z;cbN|e&IM${35+F(=-)2##%E1n)R%Y$*4Qfm zJc|UYnix5}mU6?lzm-NOCiY0Txop3QCnDw*ZTwJi`?mKm*|TR35UN1w_vrfl`z3`a zv&1qlKe>XAal{ZHc`o}6rRdJ76`&CoYZqy)HTEoW&+$&C-TS7YPm3(~HYW-DFqz5y zhSX(^EQAp)3=LzpSp<7_9tDR4)a@f7%#I7NCfb|pTD$iNkLwBenXIgrH5bV^=|V_w zUUh$KRYL^C#^ON(=;w&;jJ7(7r>Y6Qc1OJ@;l24Yu6T))71K88k{G)apbv`pWI5+O zT5k%!wE4<=9SNm1-I>;!PE!RJGtT9GJH!^zsRn~aZxfSuBPWq(+jn3A~)3nk%D$7NB~rCV3yL> zL-j%$O)l5vJvEMq==ntOv`?K{v+q9`hCLqr-+p80*l3OnyB0bb*@4z@T4M5xx8-aL z7($QTd#c14R{qN3_-gb4K%D4ra@#hX;tNhVPdZ`qHO3B*=KqdC7cjX!pX>Qykxv58d?n(GrQcvl~&mJu@S8b*WQlyG!ajt5Dcc+`X3-(EMe%B z8e{eHUW9cMhsP%&-EN(UX6*qqLfAeyeey%aNYisi-?t}f$mJqiPhCZDD}iaL6e~_h zERuV7m>eEnx>fbZYJj`L+r|{rL9ckUVEPW1x6opUdyD$Q4A4?? z{j*yW3VIcmc#uqLlhzacOF$)BE|x$#_)FQ)a~qaB1m1ccGeMK=)a0jyyyqf+jQqhTD>I52_I!~jd331gt?5xYi6{?jRnsslBK`Hqu)+%+ZO64EUJ(#NHE09rte8=>Pcp-FJvE!Q8BSN zh@z;kre|ZQ4uB|7waDlCa&EYld}A!i$C3|}3GY6#e~d+i6mu>h$sV z{@(G#CX&*$GN}lpl3kk7i&Q$FF+B{heW#ZFcx6EszvCe?CFH&x&0wVb3rTH>xB#v{ zNI`e@w);Z!!;PP)L)qlEk`w^M^ixF-w7fK+*IPiE!rI(XmxF$3weLH>MhZo{R2sh( z;=TCn%rhakSYPwwVL`lScn{ViCzC9cNcjiVJbLv#YPvG8v)%!(#7PI$m<$=!R}!oH z2AlnQTi^aUw(rv?d;3wY?5+*uxTW0Rt2Fi|2h|J|(L!tMIaJIEbMNAjkk9f#5vioa z%AH7iq8ZVG4|?{6VCiygrr06cG(717QdMTx-Dj3;8AXmo1Sj|Q`K<$@?4v+m52 z(#*cDd&|^B_&UJ>Gp`LSpr3!Wz9}!}eXWLXVA}sg`n4|?hi(WWn|N?n|3(md@U6R} zxcS=e7?Tsa5YjuMW@RaOg*BS@t75EmvR*!5IAP%J*y=Nwtt<$S>g{+cn-sLZooOg> zx%Fk%H|bcV$^}Ee&#naXQ<%)e8@G;e=Y!u&`cVvkTR&L6hja zqv5>l!WL>3k-I`)i5yyCMge!A{j9_>3Bz4V&BzYdthIqmlN+CZ3Ox;x30L)EBB)NU zm3M1NqAMyw+kXw$xR3G0 zVUbPJipxu{VOM-7-tZSL+HJWIg)zYN2d<3=v=U)4g&fo+oj9+Dcs{JCnW2u0rh4M- z-VPyq!v^}{u5y+Ev}i4gQLH{{y6Z}cl}iU6zsxoBgLQX<($?LeT^k?mMXC*PQ!hxK{J(YxWY}x7}E6t?I|Lde*IE0^gN7zl^TDgj*M_GVc@G ziaoscCG)9}BUv66MY}S8_3gkHMA&ZC2bZVq0{bC*TS_+=_2raiLlP_GuDHBDosedV z-#0_Mb`ABlq==vrVGRA`ZM@?^9&Q}k(M#yB<|)(cC4M2(Wb;U)+qO9BO-Lsa@G8x~ zAByWV7MH{xaH}0s^LoVC(BE|Ugmp-xd_xs>CFh>IlGaVc=CEI}Nl{&mZ$Y%~%|9~i zcGo1j?WNyTTY87*1%!e;BJIFBaTMBj$?Ajz6Ju6hG~@^~txw?|8=jL`002wY?=|)kd0`U>K()sHU!i zMHNf?+=i6G=(h7sTN6HrmrQ(<#*et!T{iD^o5bpzlWtlF2bZ!1xbheD21X|DY|$DZ z--#Os0;t=?*sfcm*$~~2sXO!UuqctA^`cDDlra7XE4AYsu`+Lp7dO@Wo9b8_otPjZ z`7S6W_}=^U=epsIuT9EU z1kQ{SY}}fOuN=}s3*ylTY`FXOqS^-<+jE>p>3C(kS|9DkYPMFx^(}m0xOzmMVw;oZ zC3Z@6YMWTcTSM!A|nOOi2v>(g|R6@`^a!J9)Wcn-SNtSq4O&6K0R&1 zX;?d|DEdhpcfH?c0;wPHfcYbtzht(9jC&OckS{QN^9pPMgiY|*>1ct60p<*7+i(I@^~_(?J|Ja?ZqE<*Ix>zh*y8OX)>`7h401A2y3j}y*+s$qx^4-UfKVt^7<9)4ns<3$Fn7)K6<{R{zL zMo0)Rk}=k{uWHxQ&_@oqt0eL!A}}g!XkN5?eHBCx``&mI6=+;0O`W%d`}P+y$6zS?lV;>p9Zi*IO19wx}rZud-&AG$I`I>)l2D5eoFIX zIlr4gfywQPPGs)U6cfJKD|%l$a$OcM2-C@a*-tOHwH6_yvk4Ff`irsN#r%N92c^Px z_R$OD%7@Mvm+> zWd_R0TDRoX8RaM9Tvpsc7DFQ2M7hIWMUgy#Ids@fDsK03SWwdMJ;cAvGsVs=zfKv% z5qBh3y?!?gobFFY*K#bEObP7fdC3xgqp2t<;kK%spGvf?yS$QOBEN^7)D3$D)7WD| z1WeN{>yDzaPK-9!Tqyeef`ij*!gi{DP2YEQTW@j{;-1H0aG491;D5U-jExp%Zz1Nv zz|a4evUW}azaB@3<%OskM0Cx^d`(p1zM=f*R^0v92LA`Jw)4cV0c9~s1g&CYcbb>b z+s8+F?>gb*)ULHk=V8|Dpb#0xM6=tnme`6jf)6~;uC86Xc6Igh3*8g=#VurUy?M=i X#)jA&heaCx&oxO=Igxy!w;%rp=B22b literal 0 HcmV?d00001 diff --git a/images/pm-lora-results.png b/images/pm-lora-results.png new file mode 100644 index 0000000000000000000000000000000000000000..a4e3b08945bf65a7cbb2b491f660615e6840b635 GIT binary patch literal 34717 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 literal 0 HcmV?d00001 diff --git a/images/pm-settings-integrations.png b/images/pm-settings-integrations.png new file mode 100644 index 0000000000000000000000000000000000000000..3168180615133c5acf5ec5763ecf9abcb517b3ab GIT binary patch literal 45680 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

ZXjOmtDc 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 str: + """Append LoRA trigger words if integration is enabled. + + Returns the text unchanged if the integration is disabled or + LoraManager is not installed. + """ + try: + from .py.config import IntegrationConfig + except ImportError: + try: + from py.config import IntegrationConfig + except ImportError: + return text + + if ( + not IntegrationConfig.LORA_MANAGER_ENABLED + or not IntegrationConfig.LORA_TRIGGER_WORDS_ENABLED + ): + return text + + try: + from .py.lora_utils import get_trigger_cache, inject_trigger_words + except ImportError: + try: + from py.lora_utils import get_trigger_cache, inject_trigger_words + except ImportError: + return text + + cache = get_trigger_cache() + + # Lazy-load cache on first use + if not cache.is_loaded and IntegrationConfig.LORA_MANAGER_PATH: + cache.load(IntegrationConfig.LORA_MANAGER_PATH) + + modified, injected = inject_trigger_words(text, cache) + if injected: + self.logger.info(f"Injected trigger words: {', '.join(injected)}") + return modified + def _generate_hash(self, text: str) -> str: """Generate SHA256 hash for the prompt text. diff --git a/prompt_manager_text.py b/prompt_manager_text.py index e10d146..6e0736c 100644 --- a/prompt_manager_text.py +++ b/prompt_manager_text.py @@ -142,6 +142,9 @@ class PromptManagerText(PromptManagerBase, ComfyNodeABC): parts.append(append_text.strip()) final_text = " ".join(parts) + # Inject LoRA trigger words if integration is enabled + final_text = self._inject_lora_trigger_words(final_text) + # For database storage, save the original main text with metadata about prepend/append storage_text = text diff --git a/py/api/__init__.py b/py/api/__init__.py index 8d7af45..90d4695 100644 --- a/py/api/__init__.py +++ b/py/api/__init__.py @@ -24,6 +24,7 @@ from .images import ImageRoutesMixin from .admin import AdminRoutesMixin from .logging_routes import LoggingRoutesMixin from .autotag_routes import AutotagRoutesMixin +from .lora_integration import LoraIntegrationMixin try: from ...database.operations import PromptDatabase @@ -99,6 +100,7 @@ class PromptManagerAPI( AdminRoutesMixin, LoggingRoutesMixin, AutotagRoutesMixin, + LoraIntegrationMixin, ): """REST API handler for PromptManager operations and web interface. @@ -372,6 +374,7 @@ class PromptManagerAPI( self._register_admin_routes(routes) self._register_logging_routes(routes) self._register_autotag_routes(routes) + self._register_lora_routes(routes) # Register gzip compression middleware (once) global _gzip_registered diff --git a/py/api/images.py b/py/api/images.py index 0acdb4e..e6b06e1 100644 --- a/py/api/images.py +++ b/py/api/images.py @@ -303,11 +303,31 @@ class ImageRoutesMixin: image_path = Path(image["image_path"]).resolve() - # Validate path is within any configured output directory - output_dirs = self._get_all_output_dirs() - if output_dirs: + # Validate path is within any allowed directory + allowed_dirs = list(self._get_all_output_dirs()) + + # Also allow LoRA directories when integration is enabled + try: + from ..config import IntegrationConfig + + if IntegrationConfig.LORA_MANAGER_ENABLED: + from ..lora_utils import ( + find_lora_directories, + get_lora_image_cache_dir, + ) + + lora_dirs = find_lora_directories( + IntegrationConfig.LORA_MANAGER_PATH + ) + allowed_dirs.extend(Path(d) for d in lora_dirs) + allowed_dirs.append(get_lora_image_cache_dir()) + except Exception: + # LoRA integration is optional — skip if unavailable + pass + + if allowed_dirs: allowed = any( - image_path.is_relative_to(d.resolve()) for d in output_dirs + image_path.is_relative_to(d.resolve()) for d in allowed_dirs ) if not allowed: return web.json_response( diff --git a/py/api/lora_integration.py b/py/api/lora_integration.py new file mode 100644 index 0000000..6275bfd --- /dev/null +++ b/py/api/lora_integration.py @@ -0,0 +1,419 @@ +"""LoraManager integration API routes for PromptManager.""" + +import json +import os +from pathlib import Path + +from aiohttp import web + + +class LoraIntegrationMixin: + """Mixin providing LoraManager detection, scanning, and trigger word endpoints.""" + + def _register_lora_routes(self, routes): + @routes.get("/prompt_manager/lora/detect") + async def lora_detect_route(request): + return await self.lora_detect(request) + + @routes.get("/prompt_manager/lora/status") + async def lora_status_route(request): + return await self.lora_status(request) + + @routes.post("/prompt_manager/lora/enable") + async def lora_enable_route(request): + return await self.lora_enable(request) + + @routes.post("/prompt_manager/lora/scan") + async def lora_scan_route(request): + return await self.lora_scan(request) + + @routes.get("/prompt_manager/lora/trigger-words") + async def lora_trigger_words_route(request): + return await self.lora_trigger_words(request) + + @routes.post("/prompt_manager/lora/refresh-cache") + async def lora_refresh_cache_route(request): + return await self.lora_refresh_cache(request) + + # ── Detection ──────────────────────────────────────────────────── + + async def lora_detect(self, request): + """Auto-detect LoraManager installation.""" + try: + from ..lora_utils import detect_lora_manager + + path = await self._run_in_executor(detect_lora_manager) + return web.json_response( + { + "success": True, + "detected": path is not None, + "path": path or "", + } + ) + except Exception as e: + self.logger.error(f"LoraManager detection failed: {e}") + return web.json_response({"success": False, "error": str(e)}, status=500) + + # ── Status ─────────────────────────────────────────────────────── + + async def lora_status(self, request): + """Get current LoraManager integration status.""" + try: + from ..config import IntegrationConfig + from ..lora_utils import detect_lora_manager, get_trigger_cache + + config = IntegrationConfig.get_config()["lora_manager"] + cache = get_trigger_cache() + + # Check if the configured path is still valid + detected_path = await self._run_in_executor( + detect_lora_manager, config.get("path", "") + ) + + return web.json_response( + { + "success": True, + "enabled": config["enabled"], + "path": config["path"], + "trigger_words_enabled": config["trigger_words_enabled"], + "civitai_api_key": config.get("civitai_api_key", ""), + "detected": detected_path is not None, + "detected_path": detected_path or "", + "trigger_cache_loaded": cache.is_loaded, + } + ) + except Exception as e: + self.logger.error(f"LoraManager status check failed: {e}") + return web.json_response({"success": False, "error": str(e)}, status=500) + + # ── Enable / Disable ───────────────────────────────────────────── + + async def lora_enable(self, request): + """Enable or disable LoraManager integration and save to config.json.""" + try: + data = await request.json() + enabled = data.get("enabled", False) + path = data.get("path", "") + trigger_words = data.get("trigger_words_enabled", False) + civitai_key = data.get("civitai_api_key", "") + + from ..config import IntegrationConfig, PromptManagerConfig + from ..lora_utils import detect_lora_manager, get_trigger_cache + + # If enabling, validate the path + if enabled: + resolved = await self._run_in_executor(detect_lora_manager, path) + if not resolved: + return web.json_response( + { + "success": False, + "error": "LoraManager not found at the specified path", + }, + status=400, + ) + path = resolved + + # Update in-memory config + IntegrationConfig.LORA_MANAGER_ENABLED = enabled + IntegrationConfig.LORA_MANAGER_PATH = path + IntegrationConfig.LORA_TRIGGER_WORDS_ENABLED = trigger_words + IntegrationConfig.CIVITAI_API_KEY = civitai_key + + # Persist to config.json + config_dir = os.path.dirname( + os.path.dirname(os.path.dirname(os.path.abspath(__file__))) + ) + config_file = os.path.join(config_dir, "config.json") + PromptManagerConfig.save_to_file(config_file) + + # Load trigger word cache if enabling + cache = get_trigger_cache() + if enabled and trigger_words and path: + count = await self._run_in_executor(cache.load, path) + self.logger.info(f"Trigger word cache loaded: {count} LoRAs") + elif not enabled: + cache.clear() + + return web.json_response( + { + "success": True, + "enabled": enabled, + "path": path, + "trigger_words_enabled": trigger_words, + } + ) + except Exception as e: + self.logger.error(f"LoraManager enable/disable failed: {e}") + return web.json_response({"success": False, "error": str(e)}, status=500) + + # ── Scan LoRA example images ───────────────────────────────────── + + async def lora_scan(self, request): + """Scan LoraManager metadata and import LoRA info + preview images. + + Streams progress as SSE, matching the existing scan pattern. + """ + try: + from ..config import IntegrationConfig + from ..lora_utils import ( + download_civitai_images, + find_lora_directories, + get_example_prompt_from_metadata, + get_lora_image_cache_dir, + get_preview_images_from_metadata, + get_trigger_words_from_metadata, + get_model_name_from_metadata, + read_lora_metadata, + ) + + if not IntegrationConfig.LORA_MANAGER_ENABLED: + return web.json_response( + { + "success": False, + "error": "LoraManager integration is not enabled", + }, + status=400, + ) + + lm_path = IntegrationConfig.LORA_MANAGER_PATH + if not lm_path: + return web.json_response( + {"success": False, "error": "LoraManager path not configured"}, + status=400, + ) + + response = web.StreamResponse( + status=200, + reason="OK", + headers={"Content-Type": "text/event-stream"}, + ) + await response.prepare(request) + + async def send_progress(data): + line = f"data: {json.dumps(data)}\n\n" + await response.write(line.encode("utf-8")) + + await send_progress( + { + "type": "progress", + "status": "Clearing previous lora-manager imports...", + "progress": 0, + } + ) + + # Clear previous imports so reimport is always clean + await self._run_in_executor( + self.db.delete_prompts_by_category, "lora-manager" + ) + + await send_progress( + { + "type": "progress", + "status": "Finding LoRA directories...", + "progress": 2, + } + ) + + lora_dirs = await self._run_in_executor(find_lora_directories, lm_path) + + # Collect all metadata files + meta_files = [] + for d in lora_dirs: + dir_path = Path(d) + meta_files.extend(dir_path.rglob("*.metadata.json")) + + total = len(meta_files) + imported = 0 + skipped = 0 + + await send_progress( + { + "type": "progress", + "status": f"Found {total} LoRA metadata files", + "progress": 5, + "total": total, + } + ) + + cache_dir = get_lora_image_cache_dir() + + for i, meta_file in enumerate(meta_files): + metadata = await self._run_in_executor(read_lora_metadata, meta_file) + if not metadata: + skipped += 1 + continue + + model_name = get_model_name_from_metadata(metadata) + trigger_words = get_trigger_words_from_metadata(metadata) + + # Collect all images: local previews + downloaded civitai examples + preview_paths = await self._run_in_executor( + get_preview_images_from_metadata, metadata, meta_file + ) + civitai_paths = await self._run_in_executor( + download_civitai_images, + metadata, + meta_file, + cache_dir, + IntegrationConfig.CIVITAI_API_KEY, + ) + + # Merge, local first, dedup + seen = set(preview_paths) + all_images = list(preview_paths) + for cp in civitai_paths: + if cp not in seen: + all_images.append(cp) + seen.add(cp) + + # Build prompt text: prefer example prompt, then model name + example_prompt = get_example_prompt_from_metadata(metadata) + prompt_text = example_prompt or model_name + + # Build tags + tags = ["lora-manager", f"lora:{model_name}"] + tags.extend(trigger_words) + + # Save to database via existing mechanism + try: + import hashlib + + prompt_hash = hashlib.sha256( + prompt_text.strip().lower().encode("utf-8") + ).hexdigest() + + existing = await self._run_in_executor( + self.db.get_prompt_by_hash, prompt_hash + ) + + if existing: + # Link all images + for pp in all_images: + await self._run_in_executor( + self.db.link_image_to_prompt, + existing["id"], + pp, + ) + skipped += 1 + else: + prompt_id = await self._run_in_executor( + self.db.save_prompt, + prompt_text, + "lora-manager", # category + tags, + None, # rating + None, # notes + prompt_hash, + ) + + if prompt_id: + for pp in all_images: + await self._run_in_executor( + self.db.link_image_to_prompt, + prompt_id, + pp, + ) + imported += 1 + else: + skipped += 1 + + except Exception as e: + self.logger.warning(f"Failed to import LoRA {model_name}: {e}") + skipped += 1 + + # Progress update for every LoRA + progress = int(5 + (90 * (i + 1) / max(total, 1))) + img_count = len(all_images) + status = f"{model_name}" + if img_count: + status += f" ({img_count} images)" + await send_progress( + { + "type": "progress", + "status": status, + "progress": progress, + "processed": i + 1, + "imported": imported, + "skipped": skipped, + } + ) + + await send_progress( + { + "type": "complete", + "progress": 100, + "total": total, + "imported": imported, + "skipped": skipped, + } + ) + + await response.write_eof() + return response + + except Exception as e: + self.logger.error(f"LoRA scan failed: {e}") + return web.json_response({"success": False, "error": str(e)}, status=500) + + # ── Trigger word endpoints ─────────────────────────────────────── + + async def lora_trigger_words(self, request): + """Look up trigger words for a specific LoRA name.""" + try: + from ..config import IntegrationConfig + from ..lora_utils import get_trigger_cache + + if not IntegrationConfig.LORA_MANAGER_ENABLED: + return web.json_response( + {"success": False, "error": "LoraManager integration not enabled"}, + status=400, + ) + + lora_name = request.query.get("name", "") + if not lora_name: + return web.json_response( + {"success": False, "error": "Missing 'name' query parameter"}, + status=400, + ) + + cache = get_trigger_cache() + if not cache.is_loaded: + lm_path = IntegrationConfig.LORA_MANAGER_PATH + if lm_path: + await self._run_in_executor(cache.load, lm_path) + + words = cache.get_trigger_words(lora_name) + return web.json_response( + {"success": True, "lora": lora_name, "trigger_words": words} + ) + except Exception as e: + self.logger.error(f"Trigger word lookup failed: {e}") + return web.json_response({"success": False, "error": str(e)}, status=500) + + async def lora_refresh_cache(self, request): + """Force-refresh the trigger word cache from disk.""" + try: + from ..config import IntegrationConfig + from ..lora_utils import get_trigger_cache + + if not IntegrationConfig.LORA_MANAGER_ENABLED: + return web.json_response( + {"success": False, "error": "LoraManager integration not enabled"}, + status=400, + ) + + lm_path = IntegrationConfig.LORA_MANAGER_PATH + if not lm_path: + return web.json_response( + {"success": False, "error": "LoraManager path not configured"}, + status=400, + ) + + cache = get_trigger_cache() + count = await self._run_in_executor(cache.load, lm_path) + return web.json_response( + {"success": True, "loras_with_trigger_words": count} + ) + except Exception as e: + self.logger.error(f"Trigger cache refresh failed: {e}") + return web.json_response({"success": False, "error": str(e)}, status=500) diff --git a/py/config.py b/py/config.py index bea4b0d..88ef6b9 100644 --- a/py/config.py +++ b/py/config.py @@ -201,6 +201,43 @@ class GalleryConfig: cls.METADATA_EXTRACTION_TIMEOUT = performance["metadata_extraction_timeout"] +class IntegrationConfig: + """Configuration for third-party extension integrations. + + Manages opt-in integration settings for extensions like LoraManager. + All integrations are disabled by default so PromptManager works standalone. + """ + + # LoraManager integration + LORA_MANAGER_ENABLED = False + LORA_MANAGER_PATH = "" # Auto-detected if empty + LORA_TRIGGER_WORDS_ENABLED = False # Auto-inject trigger words into prompts + CIVITAI_API_KEY = "" # Required to download NSFW example images + + @classmethod + def get_config(cls) -> Dict[str, Any]: + return { + "lora_manager": { + "enabled": cls.LORA_MANAGER_ENABLED, + "path": cls.LORA_MANAGER_PATH, + "trigger_words_enabled": cls.LORA_TRIGGER_WORDS_ENABLED, + "civitai_api_key": cls.CIVITAI_API_KEY, + }, + } + + @classmethod + def update_config(cls, new_config: Dict[str, Any]): + lora = new_config.get("lora_manager", {}) + if "enabled" in lora: + cls.LORA_MANAGER_ENABLED = lora["enabled"] + if "path" in lora: + cls.LORA_MANAGER_PATH = lora["path"] + if "trigger_words_enabled" in lora: + cls.LORA_TRIGGER_WORDS_ENABLED = lora["trigger_words_enabled"] + if "civitai_api_key" in lora: + cls.CIVITAI_API_KEY = lora["civitai_api_key"] + + class PromptManagerConfig: """Main configuration class for PromptManager core functionality. @@ -274,6 +311,7 @@ class PromptManagerConfig: "auto_backup_interval": cls.AUTO_BACKUP_INTERVAL, }, "gallery": GalleryConfig.get_config(), + "integrations": IntegrationConfig.get_config(), } @classmethod @@ -389,6 +427,10 @@ class PromptManagerConfig: if "gallery" in new_config: GalleryConfig.update_config(new_config["gallery"]) + # Update integration config + if "integrations" in new_config: + IntegrationConfig.update_config(new_config["integrations"]) + # Load configuration on import try: diff --git a/py/lora_utils.py b/py/lora_utils.py new file mode 100644 index 0000000..62c925f --- /dev/null +++ b/py/lora_utils.py @@ -0,0 +1,529 @@ +"""Utilities for LoraManager integration. + +Provides detection, metadata reading, and trigger word lookup for +ComfyUI-Lora-Manager (https://github.com/willmiao/ComfyUI-Lora-Manager). + +All functions are safe to call when LoraManager is not installed — they +return empty results rather than raising. +""" + +import hashlib +import json +import os +import re +import threading +import urllib.request +from pathlib import Path +from typing import Dict, List, Optional, Tuple + +try: + from ..utils.logging_config import get_logger +except ImportError: + import sys + + sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) + from utils.logging_config import get_logger + +logger = get_logger("prompt_manager.lora_utils") + +# ── LoraManager detection ──────────────────────────────────────────── + + +def find_comfyui_root() -> Optional[Path]: + """Walk upward from this file to find the ComfyUI root (contains main.py). + + Tries both the resolved (real) path and the unresolved path to handle + symlinked custom_nodes installations. + """ + start_paths = [Path(__file__).resolve().parent] + + # If installed via symlink, the unresolved path leads through custom_nodes/ + raw_path = Path(__file__).parent + if raw_path.resolve() != raw_path: + start_paths.append(raw_path) + + # Also try via folder_paths if available (ComfyUI runtime) + try: + import folder_paths + + base = Path(folder_paths.base_path) + if base.is_dir(): + return base + except (ImportError, AttributeError): + # folder_paths unavailable — not running inside ComfyUI runtime + pass + + for start in start_paths: + current = start + for _ in range(10): + if (current / "main.py").exists() and (current / "custom_nodes").exists(): + return current + parent = current.parent + if parent == current: + break + current = parent + + return None + + +def detect_lora_manager(custom_path: str = "") -> Optional[str]: + """Return the absolute path to ComfyUI-Lora-Manager if installed. + + Args: + custom_path: User-provided override path. Checked first. + + Returns: + Absolute path string, or None if not found. + """ + # 1. User override + if custom_path: + p = Path(custom_path) + if p.is_dir() and _looks_like_lora_manager(p): + return str(p.resolve()) + + # 2. Auto-detect via custom_nodes (case-insensitive scan) + root = find_comfyui_root() + if root: + custom_nodes = root / "custom_nodes" + if custom_nodes.is_dir(): + for entry in custom_nodes.iterdir(): + if ( + entry.is_dir() + and "lora" in entry.name.lower() + and "manager" in entry.name.lower() + and _looks_like_lora_manager(entry) + ): + return str(entry.resolve()) + + return None + + +def _looks_like_lora_manager(path: Path) -> bool: + """Heuristic: does this directory look like a LoraManager install?""" + # Must have __init__.py (ComfyUI extension) or README.md + has_init = (path / "__init__.py").exists() + if not has_init: + return False + # Check for characteristic structure: py/ dir, or any .metadata.json nearby + return (path / "py").is_dir() or (path / "lora_manager").is_dir() + + +# ── Metadata reading ───────────────────────────────────────────────── + + +def find_lora_directories(lora_manager_path: str) -> List[str]: + """Find directories that contain LoRA models (with .metadata.json files). + + Searches: ComfyUI models/loras, extra_model_paths.yaml lora dirs, + and the LoraManager extension dir itself. + """ + dirs = set() + lm_path = Path(lora_manager_path) + + root = find_comfyui_root() + if root: + # Default models/loras + models_loras = root / "models" / "loras" + if models_loras.is_dir(): + dirs.add(str(models_loras.resolve())) + + # Extra model paths from ComfyUI config + for extra_dir in _get_extra_lora_paths(root): + if extra_dir.is_dir(): + dirs.add(str(extra_dir.resolve())) + + # Also try folder_paths at runtime (catches all configured paths) + try: + import folder_paths + + for p in folder_paths.get_folder_paths("loras"): + pp = Path(p) + if pp.is_dir(): + dirs.add(str(pp.resolve())) + except (ImportError, AttributeError): + # folder_paths unavailable — not running inside ComfyUI runtime + pass + + # Check for any .metadata.json in the LoraManager dir tree + for meta in lm_path.rglob("*.metadata.json"): + dirs.add(str(meta.parent.resolve())) + + return sorted(dirs) + + +def _get_extra_lora_paths(comfyui_root: Path) -> List[Path]: + """Parse extra_model_paths.yaml for additional LoRA directories.""" + results = [] + for name in ("extra_model_paths.yaml", "extra_model_paths.yml"): + config_file = comfyui_root / name + if not config_file.exists(): + continue + try: + import yaml + + config = yaml.safe_load(config_file.read_text()) + if not isinstance(config, dict): + continue + for section in config.values(): + if not isinstance(section, dict): + continue + base = Path(section.get("base_path", "")) + loras_val = section.get("loras", "") + if not loras_val: + continue + for line in str(loras_val).strip().splitlines(): + line = line.strip() + if not line: + continue + p = Path(line) + if not p.is_absolute(): + p = base / line + if p.is_dir(): + results.append(p) + except Exception as e: + logger.debug(f"Failed to parse {config_file}: {e}") + return results + + +def read_lora_metadata(metadata_path: Path) -> Optional[Dict]: + """Read and parse a single .metadata.json file. + + Returns: + Parsed dict, or None on failure. + """ + try: + with open(metadata_path, "r", encoding="utf-8") as f: + return json.load(f) + except (json.JSONDecodeError, OSError) as e: + logger.debug(f"Failed to read {metadata_path}: {e}") + return None + + +def _get_civitai(metadata: Dict) -> Dict: + """Safely get the civitai dict, handling None values.""" + return metadata.get("civitai") or {} + + +def get_trigger_words_from_metadata(metadata: Dict) -> List[str]: + """Extract trigger words from a parsed LoraManager metadata dict.""" + civitai = _get_civitai(metadata) + words = civitai.get("trainedWords", []) + if isinstance(words, list): + return [w.strip() for w in words if isinstance(w, str) and w.strip()] + return [] + + +def get_example_prompt_from_metadata(metadata: Dict) -> Optional[str]: + """Extract an example prompt from civitai image metadata. + + Looks at civitai.images[].meta.prompt for the first available example. + """ + civitai = _get_civitai(metadata) + images = civitai.get("images", []) or [] + for img in images: + if not isinstance(img, dict): + continue + meta = img.get("meta") + if isinstance(meta, dict): + prompt = meta.get("prompt", "") + if isinstance(prompt, str) and prompt.strip(): + return prompt.strip() + return None + + +def get_civitai_image_urls(metadata: Dict) -> List[str]: + """Extract all civitai example image URLs from metadata.""" + civitai = _get_civitai(metadata) + urls = [] + for img in civitai.get("images", []) or []: + if not isinstance(img, dict): + continue + url = img.get("url", "") + if isinstance(url, str) and url.strip(): + urls.append(url.strip()) + return urls + + +def get_model_name_from_metadata(metadata: Dict) -> str: + """Extract the model display name from metadata.""" + name = metadata.get("model_name", "") + if not name: + civitai = _get_civitai(metadata) + model = civitai.get("model") or {} + name = model.get("name", "") + if not name: + name = metadata.get("file_name", "unknown") + return name + + +def get_preview_images_from_metadata(metadata: Dict, metadata_path: Path) -> List[str]: + """Find all local preview/example image paths for a LoRA. + + Returns: + List of absolute path strings to image files. + """ + results = [] + lora_dir = metadata_path.parent + file_name = metadata.get("file_name", "") + if not file_name: + stem = metadata_path.name.replace(".metadata.json", "") + file_name = stem + + base_name = Path(file_name).stem + + # Check standard preview naming conventions + for ext in ( + ".png", + ".jpg", + ".jpeg", + ".webp", + ".preview.png", + ".preview.jpg", + ".preview.jpeg", + ): + candidate = lora_dir / f"{base_name}{ext}" + if candidate.exists(): + results.append(str(candidate.resolve())) + + return results + + +def get_preview_image_from_metadata( + metadata: Dict, metadata_path: Path +) -> Optional[str]: + """Find the first preview image path for a LoRA (backward compat).""" + images = get_preview_images_from_metadata(metadata, metadata_path) + return images[0] if images else None + + +_THUMB_MAX_SIZE = 512 + + +def _download_one(url: str, local_path: Path, api_key: str) -> Optional[str]: + """Download a single image, resize to thumbnail, save as JPEG.""" + try: + headers = {"User-Agent": "ComfyUI-PromptManager/1.0"} + if api_key: + headers["Authorization"] = f"Bearer {api_key}" + req = urllib.request.Request(url, headers=headers) + with urllib.request.urlopen(req, timeout=10) as resp: + raw = resp.read() + + # Resize to thumbnail to save disk space + from io import BytesIO + + from PIL import Image + + img = Image.open(BytesIO(raw)) + img.thumbnail((_THUMB_MAX_SIZE, _THUMB_MAX_SIZE), Image.LANCZOS) + img = img.convert("RGB") + img.save(str(local_path), "JPEG", quality=85) + + return str(local_path.resolve()) + except Exception as e: + logger.debug(f"Failed to download {url}: {e}") + return None + + +def download_civitai_images( + metadata: Dict, metadata_path: Path, cache_dir: Path, api_key: str = "" +) -> List[str]: + """Download civitai example images to a local cache directory. + + Uses thumbnail URLs (512px) instead of full-size originals, and + downloads in parallel (up to 8 concurrent) for speed. + + Args: + api_key: CivitAI API key for authenticated downloads (NSFW content). + + Returns: + List of absolute paths to downloaded image files. + """ + from concurrent.futures import ThreadPoolExecutor + + civitai = _get_civitai(metadata) + images = civitai.get("images", []) or [] + if not images: + return [] + + file_name = metadata.get("file_name", "") + if not file_name: + file_name = metadata_path.name.replace(".metadata.json", "") + lora_stem = Path(file_name).stem + + lora_cache = cache_dir / lora_stem + lora_cache.mkdir(parents=True, exist_ok=True) + + # Build download tasks + cached = [] + tasks = [] # (url, local_path) + for img in images: + if not isinstance(img, dict): + continue + url = img.get("url", "") + if not isinstance(url, str) or not url.startswith("http"): + continue + + url_hash = hashlib.md5(url.encode()).hexdigest()[:12] + local_path = lora_cache / f"{url_hash}.jpg" + + if local_path.exists(): + cached.append(str(local_path.resolve())) + else: + tasks.append((url, local_path)) + + if not tasks: + return cached + + # Download in parallel + downloaded = [] + with ThreadPoolExecutor(max_workers=8) as pool: + futures = [ + pool.submit(_download_one, url, path, api_key) for url, path in tasks + ] + for fut in futures: + result = fut.result() + if result: + downloaded.append(result) + + return cached + downloaded + + +def get_lora_image_cache_dir() -> Path: + """Get the directory used to cache downloaded LoRA example images.""" + # Store in the extension's own directory + ext_root = Path(__file__).resolve().parent.parent + cache = ext_root / "data" / "lora_images" + cache.mkdir(parents=True, exist_ok=True) + return cache + + +def get_example_images_dir(lora_manager_path: str) -> Optional[str]: + """Find the LoraManager example_images directory.""" + lm_path = Path(lora_manager_path) + + # Direct subdirectory + candidate = lm_path / "example_images" + if candidate.is_dir(): + return str(candidate.resolve()) + + # Search one level in user data dirs + for child in lm_path.iterdir(): + if child.is_dir(): + sub = child / "example_images" + if sub.is_dir(): + return str(sub.resolve()) + + return None + + +# ── Trigger word cache & injection ─────────────────────────────────── + +_LORA_PATTERN = re.compile(r"]+):[^>]+>", re.IGNORECASE) + + +class TriggerWordCache: + """Thread-safe cache mapping LoRA names to their trigger words. + + Built lazily on first access, refreshable on demand. + """ + + def __init__(self): + self._cache: Dict[str, List[str]] = {} + self._lock = threading.Lock() + self._loaded = False + + def load(self, lora_manager_path: str) -> int: + """Scan LoRA metadata files and build the trigger word mapping. + + Returns: + Number of LoRAs with trigger words found. + """ + new_cache: Dict[str, List[str]] = {} + + lora_dirs = find_lora_directories(lora_manager_path) + for lora_dir in lora_dirs: + dir_path = Path(lora_dir) + for meta_file in dir_path.rglob("*.metadata.json"): + metadata = read_lora_metadata(meta_file) + if not metadata: + continue + + words = get_trigger_words_from_metadata(metadata) + if not words: + continue + + # Key by filename stem (what appears in ) + file_name = metadata.get("file_name", "") + if file_name: + stem = Path(file_name).stem + new_cache[stem.lower()] = words + + # Also key by the metadata file stem + meta_stem = meta_file.name.replace(".metadata.json", "") + if meta_stem.lower() not in new_cache: + new_cache[meta_stem.lower()] = words + + with self._lock: + self._cache = new_cache + self._loaded = True + + logger.info( + f"Trigger word cache loaded: {len(new_cache)} LoRAs with trigger words" + ) + return len(new_cache) + + def get_trigger_words(self, lora_name: str) -> List[str]: + """Look up trigger words for a LoRA by name (case-insensitive).""" + with self._lock: + return self._cache.get(lora_name.lower(), []) + + @property + def is_loaded(self) -> bool: + with self._lock: + return self._loaded + + def clear(self): + with self._lock: + self._cache.clear() + self._loaded = False + + +# Module-level singleton +_trigger_cache = TriggerWordCache() + + +def get_trigger_cache() -> TriggerWordCache: + return _trigger_cache + + +def inject_trigger_words(text: str, cache: TriggerWordCache) -> Tuple[str, List[str]]: + """Scan text for tags and append trigger words. + + Args: + text: The prompt text potentially containing lora tags. + cache: Populated TriggerWordCache instance. + + Returns: + Tuple of (modified_text, list_of_injected_words). + If no trigger words found, returns the original text unchanged. + """ + if not cache.is_loaded: + return text, [] + + matches = _LORA_PATTERN.findall(text) + if not matches: + return text, [] + + all_words = [] + for lora_name in matches: + words = cache.get_trigger_words(lora_name) + for w in words: + if w.lower() not in text.lower() and w not in all_words: + all_words.append(w) + + if not all_words: + return text, [] + + injected = ", ".join(all_words) + return f"{text}, {injected}", all_words diff --git a/pyproject.toml b/pyproject.toml index d782192..04cc3b7 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,7 +1,7 @@ [project] name = "promptmanager" description = "A powerful ComfyUI custom node that extends the standard text encoder with persistent prompt storage, advanced search capabilities, and an automatic image gallery system using SQLite." -version = "3.2.0" +version = "3.2.1" license = {file = "LICENSE"} dependencies = ["# Core dependencies for PromptManager", "# Note: Most dependencies are already included with ComfyUI", "# Already included with Python standard library:", "# - sqlite3", "# - hashlib", "# - json", "# - datetime", "# - os", "# - typing", "# - threading", "# - uuid", "# Required for gallery functionality:", "watchdog>=2.1.0 # For file system monitoring", "Pillow>=8.0.0 # For image metadata extraction (usually included with ComfyUI)", "# Optional dependencies for enhanced search functionality:", "# fuzzywuzzy[speedup]>=0.18.0 # For fuzzy string matching (optional)", "# sqlalchemy>=1.4.0 # For advanced ORM features (optional)", "# Development dependencies (optional):", "# pytest>=6.0.0 # For running tests", "# black>=22.0.0 # For code formatting", "# flake8>=4.0.0 # For linting", "# mypy>=0.910 # For type checking"] diff --git a/tests/test_config.py b/tests/test_config.py index 05037ce..8f90862 100644 --- a/tests/test_config.py +++ b/tests/test_config.py @@ -19,7 +19,7 @@ sys.modules["server"] = _mock_server sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) -from py.config import GalleryConfig, PromptManagerConfig +from py.config import GalleryConfig, IntegrationConfig, PromptManagerConfig class TestGalleryConfig(unittest.TestCase): @@ -207,5 +207,89 @@ class TestPromptManagerConfig(unittest.TestCase): os.unlink(tmp.name) +class TestIntegrationConfig(unittest.TestCase): + """Test IntegrationConfig for LoRA Manager settings.""" + + def setUp(self): + """Save original values to restore after each test.""" + self._orig = IntegrationConfig.get_config() + + def tearDown(self): + """Restore original config values.""" + IntegrationConfig.update_config(self._orig) + + def test_reset_to_disabled(self): + """Integrations can be fully disabled via update_config.""" + IntegrationConfig.update_config( + { + "lora_manager": { + "enabled": False, + "path": "", + "trigger_words_enabled": False, + "civitai_api_key": "", + } + } + ) + config = IntegrationConfig.get_config() + lora = config["lora_manager"] + self.assertFalse(lora["enabled"]) + self.assertEqual(lora["path"], "") + self.assertFalse(lora["trigger_words_enabled"]) + self.assertEqual(lora["civitai_api_key"], "") + + def test_get_config_structure(self): + config = IntegrationConfig.get_config() + self.assertIn("lora_manager", config) + lora = config["lora_manager"] + self.assertIn("enabled", lora) + self.assertIn("path", lora) + self.assertIn("trigger_words_enabled", lora) + self.assertIn("civitai_api_key", lora) + + def test_update_config_enables(self): + IntegrationConfig.update_config( + { + "lora_manager": { + "enabled": True, + "path": "/some/path", + "trigger_words_enabled": True, + "civitai_api_key": "test-key-123", + } + } + ) + self.assertTrue(IntegrationConfig.LORA_MANAGER_ENABLED) + self.assertEqual(IntegrationConfig.LORA_MANAGER_PATH, "/some/path") + self.assertTrue(IntegrationConfig.LORA_TRIGGER_WORDS_ENABLED) + self.assertEqual(IntegrationConfig.CIVITAI_API_KEY, "test-key-123") + + def test_update_partial(self): + """Updating one field shouldn't affect others.""" + # Reset to known state first + IntegrationConfig.update_config( + {"lora_manager": {"enabled": False, "path": "/known"}} + ) + # Now update only enabled + IntegrationConfig.update_config({"lora_manager": {"enabled": True}}) + self.assertTrue(IntegrationConfig.LORA_MANAGER_ENABLED) + self.assertEqual(IntegrationConfig.LORA_MANAGER_PATH, "/known") + + def test_update_empty_dict_noop(self): + """Updating with empty dict preserves current state.""" + before = IntegrationConfig.get_config() + IntegrationConfig.update_config({}) + after = IntegrationConfig.get_config() + self.assertEqual(before, after) + + def test_roundtrip(self): + """get_config → update_config → get_config should be stable.""" + IntegrationConfig.update_config( + {"lora_manager": {"enabled": True, "path": "/test"}} + ) + config1 = IntegrationConfig.get_config() + IntegrationConfig.update_config(config1) + config2 = IntegrationConfig.get_config() + self.assertEqual(config1, config2) + + if __name__ == "__main__": unittest.main() diff --git a/tests/test_lora_database.py b/tests/test_lora_database.py new file mode 100644 index 0000000..946d6d8 --- /dev/null +++ b/tests/test_lora_database.py @@ -0,0 +1,253 @@ +""" +Database tests for LoRA Manager integration and folder filter features. + +Tests delete_prompts_by_category, search_prompts folder filter, +get_prompt_subfolders, and LoRA-specific prompt workflows using +an in-memory SQLite database. +""" + +import os +import sys +import tempfile +import unittest + +sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) + +from database.operations import PromptDatabase +from utils.hashing import generate_prompt_hash + + +class LoraDBTestCase(unittest.TestCase): + """Base class with temp database setup/teardown.""" + + def setUp(self): + self.temp_db = tempfile.NamedTemporaryFile(delete=False, suffix=".db") + self.temp_db.close() + self.db = PromptDatabase(self.temp_db.name) + + def tearDown(self): + for suffix in ("", "-wal", "-shm"): + path = self.temp_db.name + suffix + if os.path.exists(path): + os.unlink(path) + + def _save(self, text, category=None, tags=None): + """Save a prompt and return its ID.""" + return self.db.save_prompt( + text=text, + category=category, + tags=tags or [], + prompt_hash=generate_prompt_hash(text), + ) + + def _link_image(self, prompt_id, image_path): + """Link a fake image to a prompt.""" + return self.db.link_image_to_prompt( + prompt_id=str(prompt_id), image_path=image_path + ) + + +# ── delete_prompts_by_category ──────────────────────────────────────── + + +class TestDeleteByCategory(LoraDBTestCase): + """Test delete_prompts_by_category for LoRA reimport cleanup.""" + + def test_deletes_matching_category(self): + self._save("lora prompt 1", category="lora-manager") + self._save("lora prompt 2", category="lora-manager") + self._save("keep this", category="general") + + deleted = self.db.delete_prompts_by_category("lora-manager") + + self.assertEqual(deleted, 2) + results = self.db.search_prompts(category="lora-manager") + self.assertEqual(len(results), 0) + + def test_preserves_other_categories(self): + self._save("keep this", category="general") + self._save("and this", category="portraits") + self.db.delete_prompts_by_category("lora-manager") + + results = self.db.search_prompts() + self.assertEqual(len(results), 2) + + def test_returns_zero_when_none_match(self): + self._save("no match", category="general") + deleted = self.db.delete_prompts_by_category("lora-manager") + self.assertEqual(deleted, 0) + + def test_cascades_to_images(self): + pid = self._save("lora with image", category="lora-manager") + self._link_image(pid, "/fake/path/image.jpg") + + # Verify image is linked + images = self.db.get_prompt_images(pid) + self.assertEqual(len(images), 1) + + self.db.delete_prompts_by_category("lora-manager") + + # Prompt gone + results = self.db.search_prompts(category="lora-manager") + self.assertEqual(len(results), 0) + + def test_empty_category_string(self): + self._save("test", category="general") + deleted = self.db.delete_prompts_by_category("") + self.assertEqual(deleted, 0) + + +# ── Folder filter (search_prompts with folder param) ────────────────── + + +class TestFolderFilter(LoraDBTestCase): + """Test search_prompts folder parameter for subfolder filtering.""" + + def _setup_prompts_with_images(self): + """Create prompts linked to images in different directories.""" + pid1 = self._save("landscape prompt", category="nature") + self._link_image(pid1, "/output/landscapes/sunset.png") + + pid2 = self._save("portrait prompt", category="portraits") + self._link_image(pid2, "/output/portraits/face.png") + + pid3 = self._save("another landscape", category="nature") + self._link_image(pid3, "/output/landscapes/mountain.png") + + return pid1, pid2, pid3 + + def test_filter_by_folder(self): + self._setup_prompts_with_images() + results = self.db.search_prompts(folder="landscapes") + self.assertEqual(len(results), 2) + texts = {r["text"] for r in results} + self.assertEqual(texts, {"landscape prompt", "another landscape"}) + + def test_filter_different_folder(self): + self._setup_prompts_with_images() + results = self.db.search_prompts(folder="portraits") + self.assertEqual(len(results), 1) + self.assertEqual(results[0]["text"], "portrait prompt") + + def test_no_match_returns_empty(self): + self._setup_prompts_with_images() + results = self.db.search_prompts(folder="nonexistent") + self.assertEqual(len(results), 0) + + def test_no_folder_returns_all(self): + self._setup_prompts_with_images() + results = self.db.search_prompts() + self.assertGreaterEqual(len(results), 3) + + def test_folder_with_category_filter(self): + self._setup_prompts_with_images() + results = self.db.search_prompts(folder="landscapes", category="nature") + self.assertEqual(len(results), 2) + + +# ── get_prompt_subfolders ───────────────────────────────────────────── + + +class TestGetPromptSubfolders(LoraDBTestCase): + """Test get_prompt_subfolders — extracts unique folder names from images.""" + + def test_extracts_subfolders(self): + pid1 = self._save("prompt 1") + self._link_image(pid1, "/output/folder_a/img1.png") + + pid2 = self._save("prompt 2") + self._link_image(pid2, "/output/folder_b/img2.png") + + folders = self.db.get_prompt_subfolders() + self.assertIsInstance(folders, list) + self.assertGreaterEqual(len(folders), 2) + + def test_deduplicates(self): + pid1 = self._save("prompt 1") + self._link_image(pid1, "/output/same_folder/img1.png") + + pid2 = self._save("prompt 2") + self._link_image(pid2, "/output/same_folder/img2.png") + + folders = self.db.get_prompt_subfolders() + # Count occurrences of the folder — should appear once + matches = [f for f in folders if "same_folder" in f] + self.assertEqual(len(matches), 1) + + def test_empty_database(self): + folders = self.db.get_prompt_subfolders() + self.assertEqual(folders, []) + + def test_returns_sorted(self): + for i, name in enumerate(["charlie", "alpha", "bravo"]): + pid = self._save(f"prompt {i}") + self._link_image(pid, f"/output/{name}/img.png") + + folders = self.db.get_prompt_subfolders() + self.assertEqual(folders, sorted(folders)) + + def test_with_root_dirs(self): + pid = self._save("prompt") + self._link_image(pid, "/output/sub/deep/img.png") + + folders = self.db.get_prompt_subfolders(root_dirs=["/output"]) + self.assertIsInstance(folders, list) + self.assertGreater(len(folders), 0) + + +# ── LoRA prompt workflow ────────────────────────────────────────────── + + +class TestLoraPromptWorkflow(LoraDBTestCase): + """Test the full LoRA import workflow at the database layer.""" + + def test_save_lora_prompt_with_tags(self): + """Simulate what lora_scan does: save prompt with lora-manager tags.""" + pid = self._save( + text="1girl, detailed face, anime style", + category="lora-manager", + tags=["lora-manager", "lora:my_lora", "trigger1"], + ) + prompt = self.db.get_prompt_by_id(pid) + self.assertEqual(prompt["category"], "lora-manager") + self.assertIn("lora-manager", prompt["tags"]) + + def test_reimport_clears_and_recreates(self): + """Simulate reimport: delete old, create new.""" + # First import + pid1 = self._save("old lora prompt", category="lora-manager") + self._link_image(pid1, "/cache/old.jpg") + + # Reimport + self.db.delete_prompts_by_category("lora-manager") + + # Second import + pid2 = self._save("new lora prompt", category="lora-manager") + self._link_image(pid2, "/cache/new.jpg") + + results = self.db.search_prompts(category="lora-manager") + self.assertEqual(len(results), 1) + self.assertEqual(results[0]["text"], "new lora prompt") + + def test_hash_dedup_prevents_duplicates(self): + """Verify hash-based dedup works for LoRA prompts.""" + text = "duplicate lora prompt" + h = generate_prompt_hash(text) + + self._save(text, category="lora-manager") + existing = self.db.get_prompt_by_hash(h) + self.assertIsNotNone(existing) + + def test_link_multiple_images_to_lora_prompt(self): + """LoRA prompts can have multiple preview images.""" + pid = self._save("multi-image lora", category="lora-manager") + self._link_image(pid, "/cache/lora/img1.jpg") + self._link_image(pid, "/cache/lora/img2.jpg") + self._link_image(pid, "/cache/lora/img3.jpg") + + images = self.db.get_prompt_images(pid) + self.assertEqual(len(images), 3) + + +if __name__ == "__main__": + unittest.main() diff --git a/tests/test_lora_utils.py b/tests/test_lora_utils.py new file mode 100644 index 0000000..3f355c3 --- /dev/null +++ b/tests/test_lora_utils.py @@ -0,0 +1,316 @@ +""" +Unit tests for LoRA Manager integration utilities. + +Tests metadata parsing, trigger word extraction, image URL extraction, +directory detection, TriggerWordCache, and image download logic. +""" + +import json +import os +import sys +import tempfile +import threading +import unittest +from pathlib import Path +from unittest.mock import patch + +sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) + +from py.lora_utils import ( + TriggerWordCache, + get_civitai_image_urls, + get_example_prompt_from_metadata, + get_lora_image_cache_dir, + get_trigger_words_from_metadata, + read_lora_metadata, +) + +# ── Sample metadata fixtures ─────────────────────────────────────────── + + +def _make_metadata( + trained_words=None, + images=None, + model_name="test_lora", + file_name="test.safetensors", +): + """Build a realistic LoRA metadata dict for testing.""" + meta = {"file_name": file_name} + civitai = {} + if trained_words is not None: + civitai["trainedWords"] = trained_words + if images is not None: + civitai["images"] = images + if model_name: + civitai["model"] = {"name": model_name} + if civitai: + meta["civitai"] = civitai + return meta + + +# ── Pure function tests (no mocking) ────────────────────────────────── + + +class TestGetTriggerWords(unittest.TestCase): + """Test get_trigger_words_from_metadata — pure dict extraction.""" + + def test_extracts_words(self): + meta = _make_metadata(trained_words=["word1", "word2", "word3"]) + self.assertEqual( + get_trigger_words_from_metadata(meta), ["word1", "word2", "word3"] + ) + + def test_strips_whitespace(self): + meta = _make_metadata(trained_words=[" padded ", "\ttabbed\t"]) + self.assertEqual(get_trigger_words_from_metadata(meta), ["padded", "tabbed"]) + + def test_filters_empty_strings(self): + meta = _make_metadata(trained_words=["valid", "", " ", "also_valid"]) + self.assertEqual(get_trigger_words_from_metadata(meta), ["valid", "also_valid"]) + + def test_no_civitai_key(self): + self.assertEqual(get_trigger_words_from_metadata({}), []) + + def test_no_trained_words(self): + meta = _make_metadata() + self.assertEqual(get_trigger_words_from_metadata(meta), []) + + def test_trained_words_not_list(self): + meta = {"civitai": {"trainedWords": "not a list"}} + self.assertEqual(get_trigger_words_from_metadata(meta), []) + + def test_non_string_items_filtered(self): + meta = _make_metadata(trained_words=["valid", 123, None, "also_valid"]) + self.assertEqual(get_trigger_words_from_metadata(meta), ["valid", "also_valid"]) + + +class TestGetExamplePrompt(unittest.TestCase): + """Test get_example_prompt_from_metadata — extracts first usable prompt.""" + + def test_extracts_first_prompt(self): + images = [ + {"meta": {"prompt": "a beautiful landscape"}}, + {"meta": {"prompt": "second prompt"}}, + ] + meta = _make_metadata(images=images) + self.assertEqual( + get_example_prompt_from_metadata(meta), "a beautiful landscape" + ) + + def test_skips_empty_prompts(self): + images = [ + {"meta": {"prompt": ""}}, + {"meta": {"prompt": " "}}, + {"meta": {"prompt": "valid prompt"}}, + ] + meta = _make_metadata(images=images) + self.assertEqual(get_example_prompt_from_metadata(meta), "valid prompt") + + def test_no_images(self): + meta = _make_metadata(images=[]) + self.assertIsNone(get_example_prompt_from_metadata(meta)) + + def test_no_civitai(self): + self.assertIsNone(get_example_prompt_from_metadata({})) + + def test_images_without_meta(self): + images = [{"url": "http://example.com/img.jpg"}] + meta = _make_metadata(images=images) + self.assertIsNone(get_example_prompt_from_metadata(meta)) + + def test_meta_without_prompt(self): + images = [{"meta": {"seed": 12345}}] + meta = _make_metadata(images=images) + self.assertIsNone(get_example_prompt_from_metadata(meta)) + + def test_non_dict_images_skipped(self): + images = ["not a dict", None, {"meta": {"prompt": "found it"}}] + meta = _make_metadata(images=images) + self.assertEqual(get_example_prompt_from_metadata(meta), "found it") + + def test_non_string_prompt_skipped(self): + images = [{"meta": {"prompt": 12345}}, {"meta": {"prompt": "real prompt"}}] + meta = _make_metadata(images=images) + self.assertEqual(get_example_prompt_from_metadata(meta), "real prompt") + + +class TestGetCivitaiImageUrls(unittest.TestCase): + """Test get_civitai_image_urls — extracts image URLs from metadata.""" + + def test_extracts_urls(self): + images = [ + {"url": "https://civitai.com/img1.jpg"}, + {"url": "https://civitai.com/img2.jpg"}, + ] + meta = _make_metadata(images=images) + urls = get_civitai_image_urls(meta) + self.assertEqual(len(urls), 2) + self.assertIn("https://civitai.com/img1.jpg", urls) + + def test_filters_empty_urls(self): + images = [{"url": ""}, {"url": "https://civitai.com/valid.jpg"}] + meta = _make_metadata(images=images) + urls = get_civitai_image_urls(meta) + self.assertEqual(urls, ["https://civitai.com/valid.jpg"]) + + def test_no_images(self): + meta = _make_metadata(images=[]) + self.assertEqual(get_civitai_image_urls(meta), []) + + def test_no_civitai(self): + self.assertEqual(get_civitai_image_urls({}), []) + + def test_images_without_url_key(self): + images = [{"id": 1}, {"url": "https://civitai.com/valid.jpg"}] + meta = _make_metadata(images=images) + urls = get_civitai_image_urls(meta) + self.assertEqual(urls, ["https://civitai.com/valid.jpg"]) + + def test_non_dict_images_skipped(self): + images = [None, "bad", {"url": "https://civitai.com/valid.jpg"}] + meta = _make_metadata(images=images) + urls = get_civitai_image_urls(meta) + self.assertEqual(urls, ["https://civitai.com/valid.jpg"]) + + +# ── Filesystem-dependent tests ──────────────────────────────────────── + + +class TestReadLoraMetadata(unittest.TestCase): + """Test read_lora_metadata — file I/O with JSON parsing.""" + + def test_reads_valid_json(self): + with tempfile.NamedTemporaryFile( + mode="w", suffix=".metadata.json", delete=False + ) as f: + json.dump({"civitai": {"trainedWords": ["test"]}}, f) + f.flush() + path = Path(f.name) + try: + result = read_lora_metadata(path) + self.assertIsNotNone(result) + self.assertEqual(result["civitai"]["trainedWords"], ["test"]) + finally: + os.unlink(path) + + def test_returns_none_for_invalid_json(self): + with tempfile.NamedTemporaryFile( + mode="w", suffix=".metadata.json", delete=False + ) as f: + f.write("not valid json {{{") + f.flush() + path = Path(f.name) + try: + result = read_lora_metadata(path) + self.assertIsNone(result) + finally: + os.unlink(path) + + def test_returns_none_for_missing_file(self): + result = read_lora_metadata(Path("/nonexistent/file.metadata.json")) + self.assertIsNone(result) + + +class TestGetLoraImageCacheDir(unittest.TestCase): + """Test get_lora_image_cache_dir — returns and creates cache path.""" + + def test_returns_path(self): + cache_dir = get_lora_image_cache_dir() + self.assertIsInstance(cache_dir, Path) + self.assertTrue(str(cache_dir).endswith("data/lora_images")) + + def test_directory_exists(self): + cache_dir = get_lora_image_cache_dir() + self.assertTrue(cache_dir.is_dir()) + + +# ── TriggerWordCache tests ──────────────────────────────────────────── + + +class TestTriggerWordCache(unittest.TestCase): + """Test TriggerWordCache — thread-safe trigger word lookup.""" + + def setUp(self): + self.cache = TriggerWordCache() + + def test_initial_state(self): + self.assertFalse(self.cache.is_loaded) + self.assertEqual(self.cache.get_trigger_words("anything"), []) + + def test_load_from_temp_directory(self): + """Create temp metadata files and verify cache loads them.""" + with tempfile.TemporaryDirectory() as tmpdir: + # Create a metadata file + meta = { + "file_name": "my_lora.safetensors", + "civitai": {"trainedWords": ["trigger1", "trigger2"]}, + } + meta_path = Path(tmpdir) / "my_lora.safetensors.metadata.json" + meta_path.write_text(json.dumps(meta)) + + # Patch find_lora_directories to return our temp dir + with patch("py.lora_utils.find_lora_directories", return_value=[tmpdir]): + count = self.cache.load(tmpdir) + + self.assertTrue(self.cache.is_loaded) + # Cache keys by both file_name stem and metadata filename stem + self.assertGreaterEqual(count, 1) + self.assertEqual( + self.cache.get_trigger_words("my_lora"), ["trigger1", "trigger2"] + ) + + def test_case_insensitive_lookup(self): + with tempfile.TemporaryDirectory() as tmpdir: + meta = { + "file_name": "MyLoRA.safetensors", + "civitai": {"trainedWords": ["word1"]}, + } + (Path(tmpdir) / "MyLoRA.safetensors.metadata.json").write_text( + json.dumps(meta) + ) + + with patch("py.lora_utils.find_lora_directories", return_value=[tmpdir]): + self.cache.load(tmpdir) + + self.assertEqual(self.cache.get_trigger_words("mylora"), ["word1"]) + self.assertEqual(self.cache.get_trigger_words("MYLORA"), ["word1"]) + + def test_clear(self): + # Manually set cache state + self.cache._cache = {"test": ["word"]} + self.cache._loaded = True + + self.cache.clear() + self.assertFalse(self.cache.is_loaded) + self.assertEqual(self.cache.get_trigger_words("test"), []) + + def test_unknown_lora_returns_empty(self): + self.cache._cache = {"known": ["word"]} + self.cache._loaded = True + self.assertEqual(self.cache.get_trigger_words("unknown"), []) + + def test_thread_safety(self): + """Verify concurrent access doesn't raise.""" + self.cache._cache = {"lora": ["word"]} + self.cache._loaded = True + + errors = [] + + def reader(): + try: + for _ in range(100): + self.cache.get_trigger_words("lora") + except Exception as e: + errors.append(e) + + threads = [threading.Thread(target=reader) for _ in range(10)] + for t in threads: + t.start() + for t in threads: + t.join() + + self.assertEqual(errors, []) + + +if __name__ == "__main__": + unittest.main() diff --git a/web/admin.html b/web/admin.html index 05282d4..ecccce0 100644 --- a/web/admin.html +++ b/web/admin.html @@ -406,6 +406,56 @@

Choose how the Web UI opens from ComfyUI nodes.

+ + +
@@ -421,6 +471,32 @@
+ + +